From 2a032122ae8e90438a5d25f354fffb8c6e9bf06b Mon Sep 17 00:00:00 2001 From: Alejandro Date: Tue, 18 Jul 2023 03:11:22 +0200 Subject: [PATCH 001/230] fix: multiple typos --- deployment/README.md | 12 ++++++------ docs/testnet/PolygonZkEVMTestnet.md | 4 ++-- docs/testnet/PolygonZkEVMTestnetClearStorage.md | 2 +- docs/testnet/PolygonZkEVMTestnetV2.md | 2 +- src/permit-helper.js | 6 +++--- test/contracts/bridge.test.js | 2 +- test/contracts/bridgeMock.test.js | 2 +- test/contracts/polygonZkEVM.test.js | 12 ++++++------ test/contracts/snark_stark_input.test.js | 2 +- test/contracts/timelockUpgradeTest.js | 6 +++--- upgrade/README.md | 4 ++-- verifyMainnetDeployment/verifyDeployment.md | 8 ++++---- .../verifyMainnetProofVerifier.md | 2 +- 13 files changed, 32 insertions(+), 32 deletions(-) diff --git a/deployment/README.md b/deployment/README.md index 19bf1191a..b96ac825c 100644 --- a/deployment/README.md +++ b/deployment/README.md @@ -20,7 +20,7 @@ cd deployment cp deploy_parameters.json.example deploy_parameters.json ``` -Fill created `deploy_parameters.json` with appropiate parameters. +Fill created `deploy_parameters.json` with appropriate parameters. See below for more information about the `deploy_parameters.json` The first step is deploying and verifying the `PolygonZkEVMDeployer`, this will be the factory for deterministic contracts, the address of the contracts will depend on the `salt` and the `initialZkEVMDeployerOwner` @@ -51,14 +51,14 @@ To verify contracts use `npm run verify:ZkEVM:${network}` npm run verify:ZkEVM:goerli ``` -A new folder will be created witth the following name `deployments/${network}_$(date +%s)` with all the output information and the OZ proxy information. +A new folder will be created with the following name `deployments/${network}_$(date +%s)` with all the output information and the OZ proxy information. ## deploy-parameters.json - `realVerifier`: bool, Indicates whether deploy a real verifier or not - `trustedSequencerURL`: string, trustedSequencer URL - `networkName`: string, networkName -- `version`:string, will just be emitted at initialization of the contract, usefull just for synchronizer +- `version`:string, will just be emitted at initialization of the contract, useful just for synchronizer - `trustedSequencer`: address, trusted sequencer addresss - `chainID`: uint64, chainID of the zkEVM - `trustedAggregator`:address, Trusted aggregator address @@ -77,12 +77,12 @@ A new folder will be created witth the following name `deployments/${network}_$( ### Optional Parameters - `deployerPvtKey`: string, pvtKey of the deployer, overrides the address in `MNEMONIC` of `.env` if exist -- `maxFeePerGas`:string, Set `maxFeePerGas`, must define aswell `maxPriorityFeePerGas` to use it -- `maxPriorityFeePerGas`:string, Set `maxPriorityFeePerGas`, must define aswell `maxFeePerGas` to use it +- `maxFeePerGas`:string, Set `maxFeePerGas`, must define as well `maxPriorityFeePerGas` to use it +- `maxPriorityFeePerGas`:string, Set `maxPriorityFeePerGas`, must define as well `maxFeePerGas` to use it - `multiplierGas`: number, Gas multiplier with 3 decimals. If `maxFeePerGas` and `maxPriorityFeePerGas` are set, this will not take effect ## Notes - Since there are deterministic address you cannot deploy twice on the same network using the same `salt` and `initialZkEVMDeployerOwner`. Changing one of them is enough to make a new deployment. - It's mandatory to delete the `.openzeppelin` upgradebility information in order to make a new deployment -- `genesis.json` has been generated using the tool: `1_createGenesis`, this script depends on the `deploy_parameters` aswell. +- `genesis.json` has been generated using the tool: `1_createGenesis`, this script depends on the `deploy_parameters` as well. diff --git a/docs/testnet/PolygonZkEVMTestnet.md b/docs/testnet/PolygonZkEVMTestnet.md index 73029150c..18b2857e1 100644 --- a/docs/testnet/PolygonZkEVMTestnet.md +++ b/docs/testnet/PolygonZkEVMTestnet.md @@ -1,5 +1,5 @@ Contract responsible for managing the state and the updates of the L2 network -This contract will NOT BE USED IN PRODUCTION, will be used only in testnet enviroment +This contract will NOT BE USED IN PRODUCTION, will be used only in testnet environment ## Functions @@ -72,7 +72,7 @@ Set new forcedBatchTimeout ) public ``` Set new forced batches allowed -Defined as a uint256 because it will be easy to updgrade afterwards +Defined as a uint256 because it will be easy to upgrade afterwards #### Parameters: diff --git a/docs/testnet/PolygonZkEVMTestnetClearStorage.md b/docs/testnet/PolygonZkEVMTestnetClearStorage.md index 4a004aff6..cf2ab9191 100644 --- a/docs/testnet/PolygonZkEVMTestnetClearStorage.md +++ b/docs/testnet/PolygonZkEVMTestnetClearStorage.md @@ -1,5 +1,5 @@ Contract responsible for managing the state and the updates of the L2 network -This contract will NOT BE USED IN PRODUCTION, will be used only in testnet enviroment +This contract will NOT BE USED IN PRODUCTION, will be used only in testnet environment ## Functions diff --git a/docs/testnet/PolygonZkEVMTestnetV2.md b/docs/testnet/PolygonZkEVMTestnetV2.md index a742f138d..c8dc41e76 100644 --- a/docs/testnet/PolygonZkEVMTestnetV2.md +++ b/docs/testnet/PolygonZkEVMTestnetV2.md @@ -1,5 +1,5 @@ Contract responsible for managing the state and the updates of the L2 network -This contract will NOT BE USED IN PRODUCTION, will be used only in testnet enviroment +This contract will NOT BE USED IN PRODUCTION, will be used only in testnet environment ## Functions diff --git a/src/permit-helper.js b/src/permit-helper.js index 752010f7d..f1e1644e2 100644 --- a/src/permit-helper.js +++ b/src/permit-helper.js @@ -9,7 +9,7 @@ const { expect } = require('chai'); * @param {String} value - Value of the permit * @param {String} nonce - Nonce of the permit * @param {String} deadline - Deadline of the permit - * @returns {Object} - Signature obejct, { v, r, s} + * @returns {Object} - Signature object, { v, r, s} */ async function createPermitSignature(tokenContractInstance, wallet, spenderAddress, value, nonce, deadline, chainId) { const name = await tokenContractInstance.name(); @@ -59,7 +59,7 @@ async function createPermitSignature(tokenContractInstance, wallet, spenderAddre * @param {String} nonce - Nonce of the permit * @param {String} expiry - expiry of the permit * @param {Number} chainId - expiry of the permit - * @returns {Object} - Signature obejct, { v, r, s} + * @returns {Object} - Signature object, { v, r, s} */ async function createPermitSignatureDaiType(tokenContractInstance, wallet, spenderAddress, nonce, expiry, chainId) { const name = await tokenContractInstance.name(); @@ -111,7 +111,7 @@ async function createPermitSignatureDaiType(tokenContractInstance, wallet, spend * @param {String} nonce - Nonce of the permit * @param {String} deadline - Deadline of the permit * @param {Number} chainId - expiry of the permit - * @returns {Object} - Signature obejct, { v, r, s} + * @returns {Object} - Signature object, { v, r, s} */ async function createPermitSignatureUniType(tokenContractInstance, wallet, spenderAddress, value, nonce, deadline, chainId) { const name = await tokenContractInstance.name(); diff --git a/test/contracts/bridge.test.js b/test/contracts/bridge.test.js index a2bbc84a4..b43a6ebc0 100644 --- a/test/contracts/bridge.test.js +++ b/test/contracts/bridge.test.js @@ -613,7 +613,7 @@ describe('PolygonZkEVMBridge Contract', () => { * const height = 32; */ const merkleTreeMainnet = new MerkleTreeBridge(height); - // Imporant calcualte leaf with origin token address no wrapped token address + // Important calculate leaf with origin token address no wrapped token address const originTokenAddress = tokenAddress; const metadataMainnet = '0x'; // since the token does not belong to this network const metadataHashMainnet = ethers.utils.solidityKeccak256(['bytes'], [metadataMainnet]); diff --git a/test/contracts/bridgeMock.test.js b/test/contracts/bridgeMock.test.js index aa1cbb1dd..d55856bd6 100644 --- a/test/contracts/bridgeMock.test.js +++ b/test/contracts/bridgeMock.test.js @@ -130,7 +130,7 @@ describe('PolygonZkEVMBridge Mock Contract', () => { expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); }); - it('shouldnt be able to PolygonZkEVMBridge more thna 0.25e ehters', async () => { + it('shouldnt be able to PolygonZkEVMBridge more than 0.25e ehters', async () => { // Add a claim leaf to rollup exit tree const tokenAddress = ethers.constants.AddressZero; // ether const amount = ethers.utils.parseEther('10'); diff --git a/test/contracts/polygonZkEVM.test.js b/test/contracts/polygonZkEVM.test.js index 034d04723..320a61d84 100644 --- a/test/contracts/polygonZkEVM.test.js +++ b/test/contracts/polygonZkEVM.test.js @@ -510,7 +510,7 @@ describe('Polygon ZK-EVM', () => { const sequencedBatchData2 = await polygonZkEVMContract.sequencedBatches(2); const batchAccInputHash2 = sequencedBatchData2.accInputHash; - // Calcultate input Hahs for batch 1 + // Calculate input Hahs for batch 1 let batchAccInputHashJs = calculateAccInputHash( ethers.constants.HashZero, calculateBatchHashData(sequence.transactions), @@ -519,7 +519,7 @@ describe('Polygon ZK-EVM', () => { trustedSequencer.address, ); - // Calcultate input Hahs for batch 2 + // Calculate input Hahs for batch 2 batchAccInputHashJs = calculateAccInputHash( batchAccInputHashJs, calculateBatchHashData(sequence2.transactions), @@ -656,7 +656,7 @@ describe('Polygon ZK-EVM', () => { /* * Check batch mapping - * Calcultate input Hahs for batch 1 + * Calculate input Hahs for batch 1 */ let batchAccInputHashJs = calculateAccInputHash( ethers.constants.HashZero, @@ -666,7 +666,7 @@ describe('Polygon ZK-EVM', () => { trustedSequencer.address, ); - // Calcultate input Hahs for batch 2 + // Calculate input Hahs for batch 2 batchAccInputHashJs = calculateAccInputHash( batchAccInputHashJs, calculateBatchHashData(sequence2.transactions), @@ -712,7 +712,7 @@ describe('Polygon ZK-EVM', () => { let currentTimestamp = (await ethers.provider.getBlock()).timestamp; await ethers.provider.send('evm_increaseTime', [1]); // evm_setNextBlockTimestamp - sequence.timestamp = currentTimestamp + 2; // bigger than current block tiemstamp + sequence.timestamp = currentTimestamp + 2; // bigger than current block timestamp // revert because timestamp is more than the current one await expect(polygonZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address)) @@ -1796,7 +1796,7 @@ describe('Polygon ZK-EVM', () => { await ethers.provider.send('evm_setNextBlockTimestamp', [sequencedTimestmap + haltTimeout]); - // Succesfully acitvate emergency state + // Successfully activate emergency state await expect(polygonZkEVMContract.connect(aggregator1).activateEmergencyState(1)) .to.emit(polygonZkEVMContract, 'EmergencyStateActivated'); }); diff --git a/test/contracts/snark_stark_input.test.js b/test/contracts/snark_stark_input.test.js index 47c404673..b61f957da 100644 --- a/test/contracts/snark_stark_input.test.js +++ b/test/contracts/snark_stark_input.test.js @@ -51,7 +51,7 @@ describe('Polygon ZK-EVM snark stark input test', () => { await polygonZkEVMContract.deployed(); }); - it('Check Accumualte input Hash', async () => { + it('Check Accumulate input Hash', async () => { const oldAccInputHash = '0x0000000000000000000000000000000000000000000000000000000000000000'; const globalExitRoot = '0x090bcaf734c4f06c93954a827b45a6e8c67b8e0fd1e0a35a1c5982d6961828f9'; const timestamp = 1944498031; diff --git a/test/contracts/timelockUpgradeTest.js b/test/contracts/timelockUpgradeTest.js index 752391685..fa1319437 100644 --- a/test/contracts/timelockUpgradeTest.js +++ b/test/contracts/timelockUpgradeTest.js @@ -276,7 +276,7 @@ describe('Polygon ZK-EVM', () => { // Check that is the v0 contract await expect(polygonZkEVMBridgeContractV2.maxEtherBridge()).to.be.reverted; - // Transaction cna be executed, delay is reduced to 0, but fails bc this timelock is not owner + // Transaction can be executed, delay is reduced to 0, but fails bc this timelock is not owner await expect(timelockContract.execute( operation.target, operation.value, @@ -338,7 +338,7 @@ describe('Polygon ZK-EVM', () => { /* * Put zkevmcontract on emergency mode - * Does not affect thsi deployment + * Does not affect this deployment */ await polygonZkEVMContract.activateEmergencyState(0); @@ -367,7 +367,7 @@ describe('Polygon ZK-EVM', () => { // Check that is the v0 contract await expect(polygonZkEVMBridgeContractV2.maxEtherBridge()).to.be.reverted; - // Transaction cna be executed, delay is reduced to 0, but fails bc this timelock is not owner + // Transaction can be executed, delay is reduced to 0, but fails bc this timelock is not owner await expect(timelockContractL2.execute( operation.target, operation.value, diff --git a/upgrade/README.md b/upgrade/README.md index 9e9cd7fa5..573afcccb 100644 --- a/upgrade/README.md +++ b/upgrade/README.md @@ -24,8 +24,8 @@ cd deployment cp upgrade_parameters.json.example upgrade_parameters.json ``` -Fill created `upgrade_parameters.json` with appropiate parameters. -You should fullfill the upgrades array, with all the updates that you intend to do ( more information in `upgrade-parameters.json` section) +Fill created `upgrade_parameters.json` with appropriate parameters. +You should fulfill the upgrades array, with all the updates that you intend to do ( more information in `upgrade-parameters.json` section) if the deployment was deployed without a timelock you can use the `simpleUpgradeScript.js`: diff --git a/verifyMainnetDeployment/verifyDeployment.md b/verifyMainnetDeployment/verifyDeployment.md index 54d55e532..8484fa4f7 100644 --- a/verifyMainnetDeployment/verifyDeployment.md +++ b/verifyMainnetDeployment/verifyDeployment.md @@ -25,8 +25,8 @@ npm i ## Verify deployment -In order to verify the deployment, we will compare the deployed bytecode with the compiled locally. Some of the contracts use [`immutables`](https://docs.soliditylang.org/en/v0.8.19/contracts.html#immutable), in that case it's not enough to just compile the code and compare withthe deployed bytecode. -The easiest way is to verify this contracts is to deploy them on a local enviroment and then compare the bytecodes of this contracts and the mainnet ones. +In order to verify the deployment, we will compare the deployed bytecode with the compiled locally. Some of the contracts use [`immutables`](https://docs.soliditylang.org/en/v0.8.19/contracts.html#immutable), in that case it's not enough to just compile the code and compare with the deployed bytecode. +The easiest way is to verify this contracts is to deploy them on a local environment and then compare the bytecodes of this contracts and the mainnet ones. In order to launch the script, you need a mainnet provider. In root of the project create a `.env` file you Infura api key information: @@ -52,9 +52,9 @@ This script verifies the deployed bytecode of the address provided in `deploymen ## Verify genesis root -At the end of the previous script we also verify that the genesis provided in the`deploymentMainnet.json` matches hte one in the `polygonZkEVM` +At the end of the previous script we also verify that the genesis provided in the`deploymentMainnet.json` matches the one in the `polygonZkEVM` -In order to verify the genesis, you can the script to generate it. The script in a very similar behaviour of the last script, deploy localy the contracts and then copy the deployed btyecode into the corresponding address. +In order to verify the genesis, you can the script to generate it. The script in a very similar behaviour of the last script, deploy locally the contracts and then copy the deployed btyecode into the corresponding address. ```bash= node deployment/1_createGenesis.js --input ../verifyMainnetDeployment/mainnetDeployParameters.json --out ../verifyMainnetDeployment/genesis.json diff --git a/verifyMainnetDeployment/verifyMainnetProofVerifier.md b/verifyMainnetDeployment/verifyMainnetProofVerifier.md index d24baeedf..fd8ceeb26 100644 --- a/verifyMainnetDeployment/verifyMainnetProofVerifier.md +++ b/verifyMainnetDeployment/verifyMainnetProofVerifier.md @@ -13,7 +13,7 @@ sudo apt update sudo apt install -y tmux git curl ```` -## Tweeking the OS to accept high amount of memory. +## Tweaking the OS to accept high amount of memory. ````bash echo "vm.max_map_count=655300" | sudo tee -a /etc/sysctl.conf From 50effb052830884307c7c437fe22b0b8bfd12b50 Mon Sep 17 00:00:00 2001 From: bap2pecs <111917526+bap2pecs@users.noreply.github.com> Date: Sun, 21 Jan 2024 17:03:02 -0500 Subject: [PATCH 002/230] fix OZ upgradeability filename --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 4bb98e696..d7041084e 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "test": "npx hardhat test test/contracts/**.test.js", "docgen": "npx solidity-docgen --solc-module solc-0.8 -t ./docs/templates -e ./contracts/verifiers,./contracts/mocks", "prepare:testnet:ZkEVM:localhost": "npx hardhat run deployment/testnet/prepareTestnet.js --network localhost", - "deploy:ZkEVM:localhost": "rm -f .openzeppelin/unknown-31337.json && node deployment/1_createGenesis.js && npx hardhat run deployment/2_deployPolygonZKEVMDeployer.js --network localhost && npx hardhat run deployment/3_deployContracts.js --network localhost", + "deploy:ZkEVM:localhost": "rm -f .openzeppelin/unknown-*.json && node deployment/1_createGenesis.js && npx hardhat run deployment/2_deployPolygonZKEVMDeployer.js --network localhost && npx hardhat run deployment/3_deployContracts.js --network localhost", "deploy:testnet:ZkEVM:localhost": "npm run prepare:testnet:ZkEVM:localhost && npm run deploy:ZkEVM:localhost", "prepare:testnet:ZkEVM:goerli": "npx hardhat run deployment/testnet/prepareTestnet.js --network goerli", "deploy:ZkEVM:goerli": "node deployment/1_createGenesis.js && npx hardhat run deployment/3_deployContracts.js --network goerli && npm run saveDeployment:goerli", @@ -87,7 +87,7 @@ "update:genesis": "node deployment/1_createGenesis.js && node deployment/1_createGenesis.js --test --input ../docker/scripts/deploy_parameters_docker.json --out ../docker/scripts/genesis_docker.json", "coverage": "npx hardhat coverage", "gas:report": "REPORT_GAS=true npx hardhat test", - "gas:report:file": "rm -f .openzeppelin/unknown-31337.json && REPORT_GAS=true REPORT_GAS_FILE=true npx hardhat test", + "gas:report:file": "rm -f .openzeppelin/unknown-*.json && REPORT_GAS=true REPORT_GAS_FILE=true npx hardhat test", "deploy:testnet:ZkEVM:test:goerli": "npm run prepare:testnet:ZkEVM:goerli && npm run deploy:ZkEVM:test:goerli", "deploy:ZkEVM:test:goerli": "node deployment/1_createGenesis.js --test && npx hardhat run deployment/3_deployContracts.js --network goerli && npm run saveDeployment:goerli" } From 810eb23591ad9f33a3086b1016f433ced49a5d83 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 23 Aug 2023 12:20:38 +0200 Subject: [PATCH 003/230] first approach --- contracts/L2/PolygonZkEVMBridgeL2.sol | 913 ++++++++++++++++++ .../interfaces/IPolygonZkEVMBridgeL2.sol | 119 +++ deployment/1_2_createGenesisCustomToken.js | 343 +++++++ deployment/1_createGenesis.js | 16 +- docker/Dockerfile.geth | 2 +- 5 files changed, 1390 insertions(+), 3 deletions(-) create mode 100644 contracts/L2/PolygonZkEVMBridgeL2.sol create mode 100644 contracts/interfaces/IPolygonZkEVMBridgeL2.sol create mode 100644 deployment/1_2_createGenesisCustomToken.js diff --git a/contracts/L2/PolygonZkEVMBridgeL2.sol b/contracts/L2/PolygonZkEVMBridgeL2.sol new file mode 100644 index 000000000..61b801b99 --- /dev/null +++ b/contracts/L2/PolygonZkEVMBridgeL2.sol @@ -0,0 +1,913 @@ +// SPDX-License-Identifier: AGPL-3.0 + +pragma solidity 0.8.17; + +import "../lib/DepositContract.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; +import "../lib/TokenWrapped.sol"; +import "../interfaces/IBasePolygonZkEVMGlobalExitRoot.sol"; +import "../interfaces/IBridgeMessageReceiver.sol"; +import "../interfaces/IPolygonZkEVMBridgeL2.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol"; +import "../lib/EmergencyManager.sol"; +import "../lib/GlobalExitRootLib.sol"; + +/** + * PolygonZkEVMBridge that will be deployed on both networks Ethereum and Polygon zkEVM + * Contract responsible to manage the token interactions with other networks + */ +contract PolygonZkEVMBridgeL2 is + DepositContract, + EmergencyManager, + IPolygonZkEVMBridgeL2 +{ + using SafeERC20Upgradeable for IERC20Upgradeable; + + // Wrapped Token information struct + struct TokenInformation { + uint32 originNetwork; + address originTokenAddress; + } + + // bytes4(keccak256(bytes("permit(address,address,uint256,uint256,uint8,bytes32,bytes32)"))); + bytes4 private constant _PERMIT_SIGNATURE = 0xd505accf; + + // bytes4(keccak256(bytes("permit(address,address,uint256,uint256,bool,uint8,bytes32,bytes32)"))); + bytes4 private constant _PERMIT_SIGNATURE_DAI = 0x8fcbaf0c; + + // Mainnet identifier + uint32 private constant _MAINNET_NETWORK_ID = 0; + + // Number of networks supported by the bridge + uint32 private constant _CURRENT_SUPPORTED_NETWORKS = 2; + + // Leaf type asset + uint8 private constant _LEAF_TYPE_ASSET = 0; + + // Leaf type message + uint8 private constant _LEAF_TYPE_MESSAGE = 1; + + // Network identifier + uint32 public networkID; + + // Global Exit Root address + IBasePolygonZkEVMGlobalExitRoot public globalExitRootManager; + + // Last updated deposit count to the global exit root manager + uint32 public lastUpdatedDepositCount; + + // Leaf index --> claimed bit map + mapping(uint256 => uint256) public claimedBitMap; + + // keccak256(OriginNetwork || tokenAddress) --> Wrapped token address + mapping(bytes32 => address) public tokenInfoToWrappedToken; + + // Wrapped token Address --> Origin token information + mapping(address => TokenInformation) public wrappedTokenToTokenInfo; + + // PolygonZkEVM address + address public polygonZkEVMaddress; + + // Native address + address public gasTokenAddress; + + // Native address + uint32 public gasTokenNetwork; + + // WETH address + TokenWrapped public WETHToken; + + /** + * @param _networkID networkID + * @param _globalExitRootManager global exit root manager address + * @param _polygonZkEVMaddress polygonZkEVM address + * @notice The value of `_polygonZkEVMaddress` on the L2 deployment of the contract will be address(0), so + * emergency state is not possible for the L2 deployment of the bridge, intentionally + */ + function initialize( + uint32 _networkID, + IBasePolygonZkEVMGlobalExitRoot _globalExitRootManager, + address _polygonZkEVMaddress, + address _gasTokenAddress, + uint32 _gasTokenNetwork, + TokenWrapped _WETHToken + ) external virtual initializer { + networkID = _networkID; + globalExitRootManager = _globalExitRootManager; + polygonZkEVMaddress = _polygonZkEVMaddress; + + // Set gas token + gasTokenAddress = _gasTokenAddress; + gasTokenNetwork = _gasTokenNetwork; + + // set WETH + WETHToken = _WETHToken; + + // Initialize OZ contracts + __ReentrancyGuard_init(); + } + + modifier onlyPolygonZkEVM() { + if (polygonZkEVMaddress != msg.sender) { + revert OnlyPolygonZkEVM(); + } + _; + } + + /** + * @dev Emitted when bridge assets or messages to another network + */ + event BridgeEvent( + uint8 leafType, + uint32 originNetwork, + address originAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes metadata, + uint32 depositCount + ); + + /** + * @dev Emitted when a claim is done from another network + */ + event ClaimEvent( + uint32 index, + uint32 originNetwork, + address originAddress, + address destinationAddress, + uint256 amount + ); + + /** + * @dev Emitted when a new wrapped token is created + */ + event NewWrappedToken( + uint32 originNetwork, + address originTokenAddress, + address wrappedTokenAddress, + bytes metadata + ); + + /** + * @notice Deposit add a new leaf to the merkle tree + * @param destinationNetwork Network destination + * @param destinationAddress Address destination + * @param amount Amount of tokens + * @param token Token address, 0 address is reserved for ether + * @param forceUpdateGlobalExitRoot Indicates if the new global exit root is updated or not + * @param permitData Raw data of the call `permit` of the token + */ + function bridgeAsset( + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + address token, + bool forceUpdateGlobalExitRoot, + bytes calldata permitData + ) public payable virtual ifNotEmergencyState nonReentrant { + if ( + destinationNetwork == networkID || + destinationNetwork >= _CURRENT_SUPPORTED_NETWORKS + ) { + revert DestinationNetworkInvalid(); + } + + address originTokenAddress; + uint32 originNetwork; + bytes memory metadata; + uint256 leafAmount = amount; + + // Check if it's gas token + if (token == address(0)) { + // Check gas token transfer + if (msg.value != amount) { + revert AmountDoesNotMatchMsgValue(); + } + + // Set gas token parameters + originNetwork = gasTokenNetwork; + originTokenAddress = gasTokenAddress; + } else { + // Check msg.value is 0 if tokens are bridged + if (msg.value != 0) { + revert MsgValueNotZero(); + } + + // Check if it's official WETh + if (token == address(WETHToken)) { + // Burn tokens + TokenWrapped(token).burn(msg.sender, amount); + + originNetwork = _MAINNET_NETWORK_ID; + originTokenAddress = address(0); + } else { + TokenInformation memory tokenInfo = wrappedTokenToTokenInfo[ + token + ]; + + if (tokenInfo.originTokenAddress != address(0)) { + // The token is a wrapped token from another network + + // Burn tokens + TokenWrapped(token).burn(msg.sender, amount); + + originTokenAddress = tokenInfo.originTokenAddress; + originNetwork = tokenInfo.originNetwork; + } else { + // Use permit if any + if (permitData.length != 0) { + _permit(token, amount, permitData); + } + + // In order to support fee tokens check the amount received, not the transferred + uint256 balanceBefore = IERC20Upgradeable(token).balanceOf( + address(this) + ); + IERC20Upgradeable(token).safeTransferFrom( + msg.sender, + address(this), + amount + ); + uint256 balanceAfter = IERC20Upgradeable(token).balanceOf( + address(this) + ); + + // Override leafAmount with the received amount + leafAmount = balanceAfter - balanceBefore; + + originTokenAddress = token; + originNetwork = networkID; + + // Encode metadata + metadata = abi.encode( + _safeName(token), + _safeSymbol(token), + _safeDecimals(token) + ); + } + } + } + + emit BridgeEvent( + _LEAF_TYPE_ASSET, + originNetwork, + originTokenAddress, + destinationNetwork, + destinationAddress, + leafAmount, + metadata, + uint32(depositCount) + ); + + _deposit( + getLeafValue( + _LEAF_TYPE_ASSET, + originNetwork, + originTokenAddress, + destinationNetwork, + destinationAddress, + leafAmount, + keccak256(metadata) + ) + ); + + // Update the new root to the global exit root manager if set by the user + if (forceUpdateGlobalExitRoot) { + _updateGlobalExitRoot(); + } + } + + /** + * @notice Bridge message and send ETH value + * @param destinationNetwork Network destination + * @param destinationAddress Address destination + * @param amountWETH Amount of WETH tokens + * @param forceUpdateGlobalExitRoot Indicates if the new global exit root is updated or not + * @param metadata Message metadata + */ + function bridgeMessage( + uint32 destinationNetwork, + address destinationAddress, + uint256 amountWETH, + bool forceUpdateGlobalExitRoot, + bytes calldata metadata + ) external payable ifNotEmergencyState { + if ( + destinationNetwork == networkID || + destinationNetwork >= _CURRENT_SUPPORTED_NETWORKS + ) { + revert DestinationNetworkInvalid(); + } + + // Check msg.value is 0 for messages + if (msg.value != 0) { + revert MsgValueNotZero(); + } + + // Burn wETH tokens + WETHToken.burn(msg.sender, amountWETH); + + emit BridgeEvent( + _LEAF_TYPE_MESSAGE, + networkID, + msg.sender, + destinationNetwork, + destinationAddress, + amountWETH, + metadata, + uint32(depositCount) + ); + + _deposit( + getLeafValue( + _LEAF_TYPE_MESSAGE, + networkID, + msg.sender, + destinationNetwork, + destinationAddress, + msg.value, + keccak256(metadata) + ) + ); + + // Update the new root to the global exit root manager if set by the user + if (forceUpdateGlobalExitRoot) { + _updateGlobalExitRoot(); + } + } + + /** + * @notice Verify merkle proof and withdraw tokens/ether + * @param smtProof Smt proof + * @param index Index of the leaf + * @param mainnetExitRoot Mainnet exit root + * @param rollupExitRoot Rollup exit root + * @param originNetwork Origin network + * @param originTokenAddress Origin token address, 0 address is reserved for ether + * @param destinationNetwork Network destination + * @param destinationAddress Address destination + * @param amount Amount of tokens + * @param metadata Abi encoded metadata if any, empty otherwise + */ + function claimAsset( + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, + uint32 index, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + uint32 originNetwork, + address originTokenAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes calldata metadata + ) external ifNotEmergencyState { + // Verify leaf exist and it does not have been claimed + _verifyLeaf( + smtProof, + index, + mainnetExitRoot, + rollupExitRoot, + originNetwork, + originTokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata, + _LEAF_TYPE_ASSET + ); + + // Transfer funds + if (originTokenAddress == address(0)) { + // Claim wETH + WETHToken.mint(destinationAddress, amount); + } else { + // Check if it's gas token + if ( + originTokenAddress == gasTokenAddress && + gasTokenNetwork == originNetwork + ) { + // Transfer gas token + /* solhint-disable avoid-low-level-calls */ + (bool success, ) = destinationAddress.call{value: amount}( + new bytes(0) + ); + if (!success) { + revert EtherTransferFailed(); + } + } else { + if (originNetwork == networkID) // Transfer tokens + { + // The token is an ERC20 from this network + IERC20Upgradeable(originTokenAddress).safeTransfer( + destinationAddress, + amount + ); + } else { + // The tokens is not from this network + // Create a wrapper for the token if not exist yet + bytes32 tokenInfoHash = keccak256( + abi.encodePacked(originNetwork, originTokenAddress) + ); + address wrappedToken = tokenInfoToWrappedToken[ + tokenInfoHash + ]; + + if (wrappedToken == address(0)) { + // Get ERC20 metadata + ( + string memory name, + string memory symbol, + uint8 decimals + ) = abi.decode(metadata, (string, string, uint8)); + + // Create a new wrapped erc20 using create2 + TokenWrapped newWrappedToken = (new TokenWrapped){ + salt: tokenInfoHash + }(name, symbol, decimals); + + // Mint tokens for the destination address + newWrappedToken.mint(destinationAddress, amount); + + // Create mappings + tokenInfoToWrappedToken[tokenInfoHash] = address( + newWrappedToken + ); + + wrappedTokenToTokenInfo[ + address(newWrappedToken) + ] = TokenInformation(originNetwork, originTokenAddress); + + emit NewWrappedToken( + originNetwork, + originTokenAddress, + address(newWrappedToken), + metadata + ); + } else { + // Use the existing wrapped erc20 + TokenWrapped(wrappedToken).mint( + destinationAddress, + amount + ); + } + } + } + } + + emit ClaimEvent( + index, + originNetwork, + originTokenAddress, + destinationAddress, + amount + ); + } + + /** + * @notice Verify merkle proof and execute message + * If the receiving address is an EOA, the call will result as a success + * Which means that the amount of ether will be transferred correctly, but the message + * will not trigger any execution + * @param smtProof Smt proof + * @param index Index of the leaf + * @param mainnetExitRoot Mainnet exit root + * @param rollupExitRoot Rollup exit root + * @param originNetwork Origin network + * @param originAddress Origin address + * @param destinationNetwork Network destination + * @param destinationAddress Address destination + * @param amount message value + * @param metadata Abi encoded metadata if any, empty otherwise + */ + function claimMessage( + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, + uint32 index, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + uint32 originNetwork, + address originAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes calldata metadata + ) external ifNotEmergencyState { + // Verify leaf exist and it does not have been claimed + _verifyLeaf( + smtProof, + index, + mainnetExitRoot, + rollupExitRoot, + originNetwork, + originAddress, + destinationNetwork, + destinationAddress, + amount, + metadata, + _LEAF_TYPE_MESSAGE + ); + + // Execute message + // Transfer ether + /* solhint-disable avoid-low-level-calls */ + (bool success, ) = destinationAddress.call{value: amount}( + abi.encodeCall( + IBridgeMessageReceiver.onMessageReceived, + (originAddress, originNetwork, metadata) + ) + ); + if (!success) { + revert MessageFailed(); + } + + emit ClaimEvent( + index, + originNetwork, + originAddress, + destinationAddress, + amount + ); + } + + /** + * @notice Returns the precalculated address of a wrapper using the token information + * Note Updating the metadata of a token is not supported. + * Since the metadata has relevance in the address deployed, this function will not return a valid + * wrapped address if the metadata provided is not the original one. + * @param originNetwork Origin network + * @param originTokenAddress Origin token address, 0 address is reserved for ether + * @param name Name of the token + * @param symbol Symbol of the token + * @param decimals Decimals of the token + */ + function precalculatedWrapperAddress( + uint32 originNetwork, + address originTokenAddress, + string calldata name, + string calldata symbol, + uint8 decimals + ) external view returns (address) { + bytes32 salt = keccak256( + abi.encodePacked(originNetwork, originTokenAddress) + ); + + bytes32 hashCreate2 = keccak256( + abi.encodePacked( + bytes1(0xff), + address(this), + salt, + keccak256( + abi.encodePacked( + type(TokenWrapped).creationCode, + abi.encode(name, symbol, decimals) + ) + ) + ) + ); + + // last 20 bytes of hash to address + return address(uint160(uint256(hashCreate2))); + } + + /** + * @notice Returns the address of a wrapper using the token information if already exist + * @param originNetwork Origin network + * @param originTokenAddress Origin token address, 0 address is reserved for ether + */ + function getTokenWrappedAddress( + uint32 originNetwork, + address originTokenAddress + ) external view returns (address) { + return + tokenInfoToWrappedToken[ + keccak256(abi.encodePacked(originNetwork, originTokenAddress)) + ]; + } + + /** + * @notice Function to activate the emergency state + " Only can be called by the Polygon ZK-EVM in extreme situations + */ + function activateEmergencyState() external onlyPolygonZkEVM { + _activateEmergencyState(); + } + + /** + * @notice Function to deactivate the emergency state + " Only can be called by the Polygon ZK-EVM + */ + function deactivateEmergencyState() external onlyPolygonZkEVM { + _deactivateEmergencyState(); + } + + /** + * @notice Verify leaf and checks that it has not been claimed + * @param smtProof Smt proof + * @param index Index of the leaf + * @param mainnetExitRoot Mainnet exit root + * @param rollupExitRoot Rollup exit root + * @param originNetwork Origin network + * @param originAddress Origin address + * @param destinationNetwork Network destination + * @param destinationAddress Address destination + * @param amount Amount of tokens + * @param metadata Abi encoded metadata if any, empty otherwise + * @param leafType Leaf type --> [0] transfer Ether / ERC20 tokens, [1] message + */ + function _verifyLeaf( + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, + uint32 index, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + uint32 originNetwork, + address originAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes calldata metadata, + uint8 leafType + ) internal { + // Set and check nullifier + _setAndCheckClaimed(index); + + // Check timestamp where the global exit root was set + uint256 timestampGlobalExitRoot = globalExitRootManager + .globalExitRootMap( + GlobalExitRootLib.calculateGlobalExitRoot( + mainnetExitRoot, + rollupExitRoot + ) + ); + + if (timestampGlobalExitRoot == 0) { + revert GlobalExitRootInvalid(); + } + + // Destination network must be networkID + if (destinationNetwork != networkID) { + revert DestinationNetworkInvalid(); + } + + bytes32 claimRoot; + if (networkID == _MAINNET_NETWORK_ID) { + // Verify merkle proof using rollup exit root + claimRoot = rollupExitRoot; + } else { + // Verify merkle proof using mainnet exit root + claimRoot = mainnetExitRoot; + } + if ( + !verifyMerkleProof( + getLeafValue( + leafType, + originNetwork, + originAddress, + destinationNetwork, + destinationAddress, + amount, + keccak256(metadata) + ), + smtProof, + index, + claimRoot + ) + ) { + revert InvalidSmtProof(); + } + } + + /** + * @notice Function to check if an index is claimed or not + * @param index Index + */ + function isClaimed(uint256 index) external view returns (bool) { + (uint256 wordPos, uint256 bitPos) = _bitmapPositions(index); + uint256 mask = (1 << bitPos); + return (claimedBitMap[wordPos] & mask) == mask; + } + + /** + * @notice Function to check that an index is not claimed and set it as claimed + * @param index Index + */ + function _setAndCheckClaimed(uint256 index) private { + (uint256 wordPos, uint256 bitPos) = _bitmapPositions(index); + uint256 mask = 1 << bitPos; + uint256 flipped = claimedBitMap[wordPos] ^= mask; + if (flipped & mask == 0) { + revert AlreadyClaimed(); + } + } + + /** + * @notice Function to update the globalExitRoot if the last deposit is not submitted + */ + function updateGlobalExitRoot() external { + if (lastUpdatedDepositCount < depositCount) { + _updateGlobalExitRoot(); + } + } + + /** + * @notice Function to update the globalExitRoot + */ + function _updateGlobalExitRoot() internal { + lastUpdatedDepositCount = uint32(depositCount); + globalExitRootManager.updateExitRoot(getDepositRoot()); + } + + /** + * @notice Function decode an index into a wordPos and bitPos + * @param index Index + */ + function _bitmapPositions( + uint256 index + ) private pure returns (uint256 wordPos, uint256 bitPos) { + wordPos = uint248(index >> 8); + bitPos = uint8(index); + } + + /** + * @notice Function to call token permit method of extended ERC20 + + @param token ERC20 token address + * @param amount Quantity that is expected to be allowed + * @param permitData Raw data of the call `permit` of the token + */ + function _permit( + address token, + uint256 amount, + bytes calldata permitData + ) internal { + bytes4 sig = bytes4(permitData[:4]); + if (sig == _PERMIT_SIGNATURE) { + ( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) = abi.decode( + permitData[4:], + ( + address, + address, + uint256, + uint256, + uint8, + bytes32, + bytes32 + ) + ); + if (owner != msg.sender) { + revert NotValidOwner(); + } + if (spender != address(this)) { + revert NotValidSpender(); + } + + if (value != amount) { + revert NotValidAmount(); + } + + // we call without checking the result, in case it fails and he doesn't have enough balance + // the following transferFrom should be fail. This prevents DoS attacks from using a signature + // before the smartcontract call + /* solhint-disable avoid-low-level-calls */ + address(token).call( + abi.encodeWithSelector( + _PERMIT_SIGNATURE, + owner, + spender, + value, + deadline, + v, + r, + s + ) + ); + } else { + if (sig != _PERMIT_SIGNATURE_DAI) { + revert NotValidSignature(); + } + + ( + address holder, + address spender, + uint256 nonce, + uint256 expiry, + bool allowed, + uint8 v, + bytes32 r, + bytes32 s + ) = abi.decode( + permitData[4:], + ( + address, + address, + uint256, + uint256, + bool, + uint8, + bytes32, + bytes32 + ) + ); + + if (holder != msg.sender) { + revert NotValidOwner(); + } + + if (spender != address(this)) { + revert NotValidSpender(); + } + + // we call without checking the result, in case it fails and he doesn't have enough balance + // the following transferFrom should be fail. This prevents DoS attacks from using a signature + // before the smartcontract call + /* solhint-disable avoid-low-level-calls */ + address(token).call( + abi.encodeWithSelector( + _PERMIT_SIGNATURE_DAI, + holder, + spender, + nonce, + expiry, + allowed, + v, + r, + s + ) + ); + } + } + + // Helpers to safely get the metadata from a token, inspired by https://github.com/traderjoe-xyz/joe-core/blob/main/contracts/MasterChefJoeV3.sol#L55-L95 + + /** + * @notice Provides a safe ERC20.symbol version which returns 'NO_SYMBOL' as fallback string + * @param token The address of the ERC-20 token contract + */ + function _safeSymbol(address token) internal view returns (string memory) { + (bool success, bytes memory data) = address(token).staticcall( + abi.encodeCall(IERC20MetadataUpgradeable.symbol, ()) + ); + return success ? _returnDataToString(data) : "NO_SYMBOL"; + } + + /** + * @notice Provides a safe ERC20.name version which returns 'NO_NAME' as fallback string. + * @param token The address of the ERC-20 token contract. + */ + function _safeName(address token) internal view returns (string memory) { + (bool success, bytes memory data) = address(token).staticcall( + abi.encodeCall(IERC20MetadataUpgradeable.name, ()) + ); + return success ? _returnDataToString(data) : "NO_NAME"; + } + + /** + * @notice Provides a safe ERC20.decimals version which returns '18' as fallback value. + * Note Tokens with (decimals > 255) are not supported + * @param token The address of the ERC-20 token contract + */ + function _safeDecimals(address token) internal view returns (uint8) { + (bool success, bytes memory data) = address(token).staticcall( + abi.encodeCall(IERC20MetadataUpgradeable.decimals, ()) + ); + return success && data.length == 32 ? abi.decode(data, (uint8)) : 18; + } + + /** + * @notice Function to convert returned data to string + * returns 'NOT_VALID_ENCODING' as fallback value. + * @param data returned data + */ + function _returnDataToString( + bytes memory data + ) internal pure returns (string memory) { + if (data.length >= 64) { + return abi.decode(data, (string)); + } else if (data.length == 32) { + // Since the strings on bytes32 are encoded left-right, check the first zero in the data + uint256 nonZeroBytes; + while (nonZeroBytes < 32 && data[nonZeroBytes] != 0) { + nonZeroBytes++; + } + + // If the first one is 0, we do not handle the encoding + if (nonZeroBytes == 0) { + return "NOT_VALID_ENCODING"; + } + // Create a byte array with nonZeroBytes length + bytes memory bytesArray = new bytes(nonZeroBytes); + for (uint256 i = 0; i < nonZeroBytes; i++) { + bytesArray[i] = data[i]; + } + return string(bytesArray); + } else { + return "NOT_VALID_ENCODING"; + } + } +} diff --git a/contracts/interfaces/IPolygonZkEVMBridgeL2.sol b/contracts/interfaces/IPolygonZkEVMBridgeL2.sol new file mode 100644 index 000000000..7b9492793 --- /dev/null +++ b/contracts/interfaces/IPolygonZkEVMBridgeL2.sol @@ -0,0 +1,119 @@ +// SPDX-License-Identifier: AGPL-3.0 + +pragma solidity 0.8.17; + +interface IPolygonZkEVMBridgeL2 { + /** + * @dev Thrown when sender is not the PolygonZkEVM address + */ + error OnlyPolygonZkEVM(); + + /** + * @dev Thrown when the destination network is invalid + */ + error DestinationNetworkInvalid(); + + /** + * @dev Thrown when the amount does not match msg.value + */ + error AmountDoesNotMatchMsgValue(); + + /** + * @dev Thrown when user is bridging tokens and is also sending a value + */ + error MsgValueNotZero(); + + /** + * @dev Thrown when the Ether transfer on claimAsset fails + */ + error EtherTransferFailed(); + + /** + * @dev Thrown when the message transaction on claimMessage fails + */ + error MessageFailed(); + + /** + * @dev Thrown when the global exit root does not exist + */ + error GlobalExitRootInvalid(); + + /** + * @dev Thrown when the smt proof does not match + */ + error InvalidSmtProof(); + + /** + * @dev Thrown when an index is already claimed + */ + error AlreadyClaimed(); + + /** + * @dev Thrown when the owner of permit does not match the sender + */ + error NotValidOwner(); + + /** + * @dev Thrown when the spender of the permit does not match this contract address + */ + error NotValidSpender(); + + /** + * @dev Thrown when the amount of the permit does not match + */ + error NotValidAmount(); + + /** + * @dev Thrown when the permit data contains an invalid signature + */ + error NotValidSignature(); + + function bridgeAsset( + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + address token, + bool forceUpdateGlobalExitRoot, + bytes calldata permitData + ) external payable; + + function bridgeMessage( + uint32 destinationNetwork, + address destinationAddress, + uint256 amountWETH, + bool forceUpdateGlobalExitRoot, + bytes calldata metadata + ) external payable; + + function claimAsset( + bytes32[32] calldata smtProof, + uint32 index, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + uint32 originNetwork, + address originTokenAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes calldata metadata + ) external; + + function claimMessage( + bytes32[32] calldata smtProof, + uint32 index, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + uint32 originNetwork, + address originAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes calldata metadata + ) external; + + function updateGlobalExitRoot() external; + + function activateEmergencyState() external; + + function deactivateEmergencyState() external; +} diff --git a/deployment/1_2_createGenesisCustomToken.js b/deployment/1_2_createGenesisCustomToken.js new file mode 100644 index 000000000..2a4386d1e --- /dev/null +++ b/deployment/1_2_createGenesisCustomToken.js @@ -0,0 +1,343 @@ +/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if, import/no-dynamic-require */ +/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved, no-restricted-syntax */ +const { expect } = require('chai'); +const path = require('path'); +const fs = require('fs'); +require('dotenv').config({ path: path.resolve(__dirname, '../.env') }); +const { argv } = require('yargs'); + +const DEFAULT_MNEMONIC = 'test test test test test test test test test test test junk'; +process.env.HARDHAT_NETWORK = 'hardhat'; +process.env.MNEMONIC = argv.test ? DEFAULT_MNEMONIC : process.env.MNEMONIC; +const { ethers, upgrades } = require('hardhat'); +const { + MemDB, ZkEVMDB, getPoseidon, smtUtils, +} = require('@0xpolygonhermez/zkevm-commonjs'); + +const { deployPolygonZkEVMDeployer, create2Deployment } = require('./helpers/deployment-helpers'); + +const outPath = argv.out ? argv.out : './genesis.json'; +const pathOutputJson = path.join(__dirname, outPath); + +/* + * bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; + * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; + */ +const _ADMIN_SLOT = '0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103'; +const _IMPLEMENTATION_SLOT = '0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc'; + +// Genesis mainnet address: +const mainnetZkEVMDeployerAddress = '0xCB19eDdE626906eB1EE52357a27F62dd519608C2'; +const mainnetProxyAdminAddress = '0x0F99738B2Fc14D77308337f3e2596b63aE7BCC4A'; +const mainnetZkEVMBridgeImplementationAddress = '0x5ac4182A1dd41AeEf465E40B82fd326BF66AB82C'; +const mainnetZkEVMBridgeProxyAddress = '0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe'; +const mainnetGlobalExitRootL2ImplementationAddress = '0x0200143Fa295EE4dffEF22eE2616c2E008D81688'; +const mainnetGlobalExitRootL2ProxyAddress = '0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa'; +const mainnetZkEVMTimelockAddress = '0xBBa0935Fa93Eb23de7990b47F0D96a8f75766d13'; + +const mainnetMultisig = '0x4c1665d6651ecEfa59B9B3041951608468b18891'; +const mainnetInitialZkEVMDeployerOwner = '0x4c1665d6651ecEfa59B9B3041951608468b18891'; +const mainnetMinDelayTimelock = 864000; + +async function main() { + // Constant variables + const attemptsDeployProxy = 20; + const networkIDL2 = 1; + const zkevmAddressL2 = ethers.constants.AddressZero; + + const timelockAddress = mainnetMultisig; + const initialZkEVMDeployerOwner = mainnetInitialZkEVMDeployerOwner; + const salt = '0x0000000000000000000000000000000000000000000000000000000000000000'; // salt mock + const minDelayTimelock = mainnetMinDelayTimelock; + + // Load deployer + await ethers.provider.send('hardhat_impersonateAccount', [initialZkEVMDeployerOwner]); + await ethers.provider.send('hardhat_setBalance', [initialZkEVMDeployerOwner, '0xffffffffffffffff']); // 18 ethers aprox + const deployer = await ethers.getSigner(initialZkEVMDeployerOwner); + + // Deploy PolygonZkEVMDeployer if is not deployed already + const [zkEVMDeployerContract] = await deployPolygonZkEVMDeployer(initialZkEVMDeployerOwner, deployer); + + /* + * Deploy Bridge + * Deploy admin --> implementation --> proxy + */ + + // Deploy proxy admin: + const proxyAdminFactory = await ethers.getContractFactory('ProxyAdmin', deployer); + const deployTransactionAdmin = (proxyAdminFactory.getDeployTransaction()).data; + const dataCallAdmin = proxyAdminFactory.interface.encodeFunctionData('transferOwnership', [deployer.address]); + const [proxyAdminAddress] = await create2Deployment(zkEVMDeployerContract, salt, deployTransactionAdmin, dataCallAdmin, deployer); + + // Deploy implementation PolygonZkEVMBridg + const polygonZkEVMBridgeFactory = await ethers.getContractFactory('PolygonZkEVMBridge', deployer); + const deployTransactionBridge = (polygonZkEVMBridgeFactory.getDeployTransaction()).data; + // Mandatory to override the gasLimit since the estimation with create are mess up D: + const overrideGasLimit = ethers.BigNumber.from(5500000); + const [bridgeImplementationAddress] = await create2Deployment( + zkEVMDeployerContract, + salt, + deployTransactionBridge, + null, + deployer, + overrideGasLimit, + ); + + /* + * deploy proxy + * Do not initialize directlythe proxy since we want to deploy the same code on L2 and this will alter the bytecode deployed of the proxy + */ + const transparentProxyFactory = await ethers.getContractFactory('TransparentUpgradeableProxy', deployer); + const initializeEmptyDataProxy = '0x'; + const deployTransactionProxy = (transparentProxyFactory.getDeployTransaction( + bridgeImplementationAddress, + proxyAdminAddress, + initializeEmptyDataProxy, + )).data; + + const dataCallProxy = polygonZkEVMBridgeFactory.interface.encodeFunctionData( + 'initialize', + [ + networkIDL2, + mainnetGlobalExitRootL2ProxyAddress, + zkevmAddressL2, + ], + ); + const [proxyBridgeAddress] = await create2Deployment(zkEVMDeployerContract, salt, deployTransactionProxy, dataCallProxy, deployer); + + // Import OZ manifest the deployed contracts, its enough to import just the proyx, the rest are imported automatically ( admin/impl) + await upgrades.forceImport(proxyBridgeAddress, polygonZkEVMBridgeFactory, 'transparent'); + + /* + *Deployment Global exit root manager + */ + const PolygonZkEVMGlobalExitRootL2Factory = await ethers.getContractFactory('PolygonZkEVMGlobalExitRootL2', deployer); + let polygonZkEVMGlobalExitRootL2; + for (let i = 0; i < attemptsDeployProxy; i++) { + try { + polygonZkEVMGlobalExitRootL2 = await upgrades.deployProxy(PolygonZkEVMGlobalExitRootL2Factory, [], { + initializer: false, + constructorArgs: [mainnetZkEVMBridgeProxyAddress], + unsafeAllow: ['constructor', 'state-variable-immutable'], + }); + break; + } catch (error) { + console.log(`attempt ${i}`); + console.log('upgrades.deployProxy of polygonZkEVMGlobalExitRootL2 ', error.message); + } + + // reach limits of attempts + if (i + 1 === attemptsDeployProxy) { + throw new Error('polygonZkEVMGlobalExitRootL2 contract has not been deployed'); + } + } + + // Assert admin address + expect(await upgrades.erc1967.getAdminAddress(polygonZkEVMGlobalExitRootL2.address)).to.be.equal(proxyAdminAddress); + expect(await upgrades.erc1967.getAdminAddress(proxyBridgeAddress)).to.be.equal(proxyAdminAddress); + + const timelockContractFactory = await ethers.getContractFactory('PolygonZkEVMTimelock', deployer); + const timelockContract = await timelockContractFactory.deploy( + minDelayTimelock, + [timelockAddress], + [timelockAddress], + timelockAddress, + zkevmAddressL2, + ); + await timelockContract.deployed(); + + // Transfer ownership of the proxyAdmin to timelock + const proxyAdminInstance = proxyAdminFactory.attach(proxyAdminAddress); + await (await proxyAdminInstance.connect(deployer).transferOwnership(mainnetZkEVMTimelockAddress)).wait(); + + // Recreate genesis with the current information: + const genesis = []; + + // ZKEVMDeployer + const zkEVMDeployerInfo = await getAddressInfo(zkEVMDeployerContract.address); + genesis.push({ + contractName: 'PolygonZkEVMDeployer', + balance: '0', + nonce: zkEVMDeployerInfo.nonce.toString(), + address: mainnetZkEVMDeployerAddress, // override adddress + bytecode: zkEVMDeployerInfo.bytecode, + storage: zkEVMDeployerInfo.storage, + }); + + // Proxy Admin + const proxyAdminInfo = await getAddressInfo(proxyAdminAddress); + genesis.push({ + contractName: 'ProxyAdmin', + balance: '0', + nonce: proxyAdminInfo.nonce.toString(), + address: mainnetProxyAdminAddress, // override adddress + bytecode: proxyAdminInfo.bytecode, + storage: proxyAdminInfo.storage, + }); + + // Bridge implementation + const bridgeImplementationInfo = await getAddressInfo(bridgeImplementationAddress); + genesis.push({ + contractName: 'PolygonZkEVMBridge implementation', + balance: '0', + nonce: bridgeImplementationInfo.nonce.toString(), + address: mainnetZkEVMBridgeImplementationAddress, // override adddress + bytecode: bridgeImplementationInfo.bytecode, + // storage: bridgeImplementationInfo.storage, implementation do not have storage + }); + + // Bridge proxy + const bridgeProxyInfo = await getAddressInfo(proxyBridgeAddress); + + // Override admin and implementation slots: + bridgeProxyInfo.storage[_ADMIN_SLOT] = ethers.utils.hexZeroPad(mainnetProxyAdminAddress, 32); + bridgeProxyInfo.storage[_IMPLEMENTATION_SLOT] = ethers.utils.hexZeroPad(mainnetZkEVMBridgeImplementationAddress, 32); + + // update proxy storage + genesis.push({ + contractName: 'PolygonZkEVMBridge proxy', + balance: '200000000000000000000000000', + nonce: bridgeProxyInfo.nonce.toString(), + address: mainnetZkEVMBridgeProxyAddress, // override adddress + bytecode: bridgeProxyInfo.bytecode, + storage: bridgeProxyInfo.storage, + }); + + // polygonZkEVMGlobalExitRootL2 implementation + const implGlobalExitRootL2 = await upgrades.erc1967.getImplementationAddress(polygonZkEVMGlobalExitRootL2.address); + const implGlobalExitRootL2Info = await getAddressInfo(implGlobalExitRootL2); + genesis.push({ + contractName: 'PolygonZkEVMGlobalExitRootL2 implementation', + balance: '0', + nonce: implGlobalExitRootL2Info.nonce.toString(), + address: mainnetGlobalExitRootL2ImplementationAddress, // override address + bytecode: implGlobalExitRootL2Info.bytecode, + // storage: implGlobalExitRootL2Info.storage, , implementation do not have storage + }); + + // polygonZkEVMGlobalExitRootL2 proxy + const proxyGlobalExitRootL2Info = await getAddressInfo(polygonZkEVMGlobalExitRootL2.address); + + // Override admin and implementation slots: + proxyGlobalExitRootL2Info.storage[_ADMIN_SLOT] = ethers.utils.hexZeroPad(mainnetProxyAdminAddress, 32); + proxyGlobalExitRootL2Info.storage[_IMPLEMENTATION_SLOT] = ethers.utils.hexZeroPad(mainnetGlobalExitRootL2ImplementationAddress, 32); + + genesis.push({ + contractName: 'PolygonZkEVMGlobalExitRootL2 proxy', + balance: '0', + nonce: proxyGlobalExitRootL2Info.nonce.toString(), + address: mainnetGlobalExitRootL2ProxyAddress, // Override address! + bytecode: proxyGlobalExitRootL2Info.bytecode, + storage: proxyGlobalExitRootL2Info.storage, + }); + + // Timelock + const timelockInfo = await getAddressInfo(timelockContract.address); + + /* + * Since roles are used, most storage are writted in peusdoRandom storage slots + * bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256("TIMELOCK_ADMIN_ROLE"); + * bytes32 public constant PROPOSER_ROLE = keccak256("PROPOSER_ROLE"); + * bytes32 public constant EXECUTOR_ROLE = keccak256("EXECUTOR_ROLE"); + * bytes32 public constant CANCELLER_ROLE = keccak256("CANCELLER_ROLE"); + */ + const timelockRolesHash = [ + ethers.utils.id('TIMELOCK_ADMIN_ROLE'), + ethers.utils.id('PROPOSER_ROLE'), + ethers.utils.id('EXECUTOR_ROLE'), + ethers.utils.id('CANCELLER_ROLE'), + ]; + + for (let i = 0; i < timelockRolesHash.length; i++) { + const rolesMappingStoragePositionStruct = 0; + const storagePosition = ethers.utils.solidityKeccak256(['uint256', 'uint256'], [timelockRolesHash[i], rolesMappingStoragePositionStruct]); + + // check timelock address manager, and timelock address itself + const addressArray = [timelockAddress, timelockContract.address]; + for (let j = 0; j < addressArray.length; j++) { + const storagePositionRole = ethers.utils.solidityKeccak256(['uint256', 'uint256'], [addressArray[j], storagePosition]); + const valueRole = await ethers.provider.getStorageAt(timelockContract.address, storagePositionRole); + if (valueRole !== '0x0000000000000000000000000000000000000000000000000000000000000000') { + timelockInfo.storage[storagePositionRole] = valueRole; + } + } + const roleAdminSlot = ethers.utils.hexZeroPad((ethers.BigNumber.from(storagePosition).add(1)).toHexString(), 32); + const valueRoleAdminSlot = await ethers.provider.getStorageAt(timelockContract.address, roleAdminSlot); + if (valueRoleAdminSlot !== '0x0000000000000000000000000000000000000000000000000000000000000000') { + timelockInfo.storage[roleAdminSlot] = valueRoleAdminSlot; + } + } + + genesis.push({ + contractName: 'PolygonZkEVMTimelock', + balance: '0', + nonce: timelockInfo.nonce.toString(), + address: timelockContract.address, + bytecode: timelockInfo.bytecode, + storage: timelockInfo.storage, + }); + + // Put nonces on deployers + + // deployer + const deployerInfo = await getAddressInfo(deployer.address); + genesis.push({ + accountName: 'deployer', + balance: '0', + nonce: deployerInfo.nonce.toString(), + address: deployer.address, + }); + + // calculate root + const poseidon = await getPoseidon(); + const { F } = poseidon; + const db = new MemDB(F); + const genesisRoot = [F.zero, F.zero, F.zero, F.zero]; + const accHashInput = [F.zero, F.zero, F.zero, F.zero]; + const defaultChainId = 1000; + + const zkEVMDB = await ZkEVMDB.newZkEVM( + db, + poseidon, + genesisRoot, + accHashInput, + genesis, + null, + null, + defaultChainId, + ); + + fs.writeFileSync(pathOutputJson, JSON.stringify({ + root: smtUtils.h4toString(zkEVMDB.stateRoot), + genesis, + }, null, 1)); +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); + +async function getAddressInfo(address) { + const nonce = await ethers.provider.getTransactionCount(address); + const bytecode = await ethers.provider.getCode(address); + + const storage = {}; + for (let i = 0; i < 120; i++) { + const storageValue = await ethers.provider.getStorageAt(address, i); + if (storageValue !== '0x0000000000000000000000000000000000000000000000000000000000000000') { + storage[ethers.utils.hexZeroPad(ethers.utils.hexlify(i), 32)] = storageValue; + } + } + + const valueAdminSlot = await ethers.provider.getStorageAt(address, _ADMIN_SLOT); + if (valueAdminSlot !== '0x0000000000000000000000000000000000000000000000000000000000000000') { + storage[_ADMIN_SLOT] = valueAdminSlot; + } + const valuImplementationSlot = await ethers.provider.getStorageAt(address, _IMPLEMENTATION_SLOT); + if (valuImplementationSlot !== '0x0000000000000000000000000000000000000000000000000000000000000000') { + storage[_IMPLEMENTATION_SLOT] = valuImplementationSlot; + } + + return { nonce, bytecode, storage }; +} diff --git a/deployment/1_createGenesis.js b/deployment/1_createGenesis.js index 3104293b2..98f057c06 100644 --- a/deployment/1_createGenesis.js +++ b/deployment/1_createGenesis.js @@ -35,6 +35,7 @@ async function main() { const networkIDL2 = 1; const globalExitRootL2Address = '0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa'; const zkevmAddressL2 = ethers.constants.AddressZero; + const maxUint256 = ethers.BigNumber.from('0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff').toString(); // deploy parameters const mandatoryDeploymentParameters = [ @@ -42,6 +43,7 @@ async function main() { 'minDelayTimelock', 'salt', 'initialZkEVMDeployerOwner', + 'gasTokenAddress', ]; for (const parameterName of mandatoryDeploymentParameters) { @@ -55,8 +57,11 @@ async function main() { minDelayTimelock, salt, initialZkEVMDeployerOwner, + gasTokenAddress, } = deployParameters; + const balanceBriged = (gasTokenAddress === '' || gasTokenAddress === '0x0000000000000000000000000000000000000000') ? '200000000000000000000000000' : maxUint256; + // Load deployer await ethers.provider.send('hardhat_impersonateAccount', [initialZkEVMDeployerOwner]); await ethers.provider.send('hardhat_setBalance', [initialZkEVMDeployerOwner, '0xffffffffffffffff']); // 18 ethers aprox @@ -76,9 +81,16 @@ async function main() { const dataCallAdmin = proxyAdminFactory.interface.encodeFunctionData('transferOwnership', [deployer.address]); const [proxyAdminAddress] = await create2Deployment(zkEVMDeployerContract, salt, deployTransactionAdmin, dataCallAdmin, deployer); - // Deploy implementation PolygonZkEVMBridg + // Deploy implementation PolygonZkEVMBridge const polygonZkEVMBridgeFactory = await ethers.getContractFactory('PolygonZkEVMBridge', deployer); const deployTransactionBridge = (polygonZkEVMBridgeFactory.getDeployTransaction()).data; + + /* + * precalculate bridge address + * const hashInitCodeBridge = ethers.utils.solidityKeccak256(['bytes'], [deployTransactionBridge]); + * const precalculatedAddressDeployed = ethers.utils.getCreate2Address(zkEVMDeployerContract.address, salt, hashInitCodeBridge); + */ + // Mandatory to override the gasLimit since the estimation with create are mess up D: const overrideGasLimit = ethers.BigNumber.from(5500000); const [bridgeImplementationAddress] = await create2Deployment( @@ -198,7 +210,7 @@ async function main() { genesis.push({ contractName: 'PolygonZkEVMBridge proxy', - balance: '200000000000000000000000000', + balance: balanceBriged, nonce: bridgeProxyInfo.nonce.toString(), address: proxyBridgeAddress, bytecode: bridgeProxyInfo.bytecode, diff --git a/docker/Dockerfile.geth b/docker/Dockerfile.geth index bdf560662..b56e960ec 100644 --- a/docker/Dockerfile.geth +++ b/docker/Dockerfile.geth @@ -5,4 +5,4 @@ EXPOSE 8545 COPY docker/gethData / ENTRYPOINT ["geth"] -CMD ["--rpc.allow-unprotected-txs", "--http", "--http.addr", "0.0.0.0","--http.corsdomain", "*", "--http.vhosts" ,"*", "--ws", "--ws.origins", "*", "--ws.addr", "0.0.0.0", "--dev", "--datadir", "/geth_data"] \ No newline at end of file +CMD ["--rpc.allow-unprotected-txs", "--http", "--http.addr", "0.0.0.0","--http.corsdomain", "*", "--http.vhosts" ,"*", "--ws", "--ws.origins", "*", "--ws.addr", "0.0.0.0", "--dev", "--dev.period", "1", "--datadir", "/geth_data"] \ No newline at end of file From ca5828a31366af33e29fff2d09be1456db257f69 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Thu, 24 Aug 2023 15:16:26 +0200 Subject: [PATCH 004/230] almost done --- contracts/L2/PolygonZkEVMBridgeL2.sol | 10 +- contracts/L2/WETHzkEVM.sol | 122 ++++++++ deployment/1_2_createGenesisCustomToken.js | 343 --------------------- deployment/1_createGenesis.js | 46 ++- deployment/helpers/deployment-helpers.js | 9 + 5 files changed, 170 insertions(+), 360 deletions(-) create mode 100644 contracts/L2/WETHzkEVM.sol delete mode 100644 deployment/1_2_createGenesisCustomToken.js diff --git a/contracts/L2/PolygonZkEVMBridgeL2.sol b/contracts/L2/PolygonZkEVMBridgeL2.sol index 61b801b99..9420dc3ca 100644 --- a/contracts/L2/PolygonZkEVMBridgeL2.sol +++ b/contracts/L2/PolygonZkEVMBridgeL2.sol @@ -194,7 +194,7 @@ contract PolygonZkEVMBridgeL2 is revert MsgValueNotZero(); } - // Check if it's official WETh + // Check if it's WETH if (token == address(WETHToken)) { // Burn tokens TokenWrapped(token).burn(msg.sender, amount); @@ -326,7 +326,7 @@ contract PolygonZkEVMBridgeL2 is msg.sender, destinationNetwork, destinationAddress, - msg.value, + amountWETH, keccak256(metadata) ) ); @@ -507,10 +507,12 @@ contract PolygonZkEVMBridgeL2 is _LEAF_TYPE_MESSAGE ); + // mint wETH tokens + WETHToken.mint(destinationAddress, amount); + // Execute message - // Transfer ether /* solhint-disable avoid-low-level-calls */ - (bool success, ) = destinationAddress.call{value: amount}( + (bool success, ) = destinationAddress.call( abi.encodeCall( IBridgeMessageReceiver.onMessageReceived, (originAddress, originNetwork, metadata) diff --git a/contracts/L2/WETHzkEVM.sol b/contracts/L2/WETHzkEVM.sol new file mode 100644 index 000000000..c46e73b40 --- /dev/null +++ b/contracts/L2/WETHzkEVM.sol @@ -0,0 +1,122 @@ +// SPDX-License-Identifier: GPL-3.0 +// Implementation of permit based on https://github.com/WETH10/WETH10/blob/main/contracts/WETH10.sol +pragma solidity 0.8.17; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +contract WETHzkEVM is ERC20 { + // Domain typehash + bytes32 public constant DOMAIN_TYPEHASH = + keccak256( + "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" + ); + // Permit typehash + bytes32 public constant PERMIT_TYPEHASH = + keccak256( + "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" + ); + + // Version + string public constant VERSION = "1"; + + // Chain id on deployment + uint256 public immutable deploymentChainId; + + // Domain separator calculated on deployment + bytes32 private immutable _DEPLOYMENT_DOMAIN_SEPARATOR; + + // PolygonZkEVM Bridge address + address public immutable bridgeAddress; + + // Permit nonces + mapping(address => uint256) public nonces; + + modifier onlyBridge() { + require( + msg.sender == bridgeAddress, + "TokenWrapped::onlyBridge: Not PolygonZkEVMBridge" + ); + _; + } + + constructor(address _bridgeAddress) ERC20("Wrapped Ether", "WETH") { + bridgeAddress = _bridgeAddress; + deploymentChainId = block.chainid; + _DEPLOYMENT_DOMAIN_SEPARATOR = _calculateDomainSeparator(block.chainid); + } + + function mint(address to, uint256 value) external onlyBridge { + _mint(to, value); + } + + // Notice that is not require to approve wrapped tokens to use the bridge + function burn(address account, uint256 value) external onlyBridge { + _burn(account, value); + } + + // Permit relative functions + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external { + require( + block.timestamp <= deadline, + "TokenWrapped::permit: Expired permit" + ); + + bytes32 hashStruct = keccak256( + abi.encode( + PERMIT_TYPEHASH, + owner, + spender, + value, + nonces[owner]++, + deadline + ) + ); + + bytes32 digest = keccak256( + abi.encodePacked("\x19\x01", DOMAIN_SEPARATOR(), hashStruct) + ); + + address signer = ecrecover(digest, v, r, s); + require( + signer != address(0) && signer == owner, + "TokenWrapped::permit: Invalid signature" + ); + + _approve(owner, spender, value); + } + + /** + * @notice Calculate domain separator, given a chainID. + * @param chainId Current chainID + */ + function _calculateDomainSeparator( + uint256 chainId + ) private view returns (bytes32) { + return + keccak256( + abi.encode( + DOMAIN_TYPEHASH, + keccak256(bytes(name())), + keccak256(bytes(VERSION)), + chainId, + address(this) + ) + ); + } + + /// @dev Return the DOMAIN_SEPARATOR. + function DOMAIN_SEPARATOR() public view returns (bytes32) { + return + block.chainid == deploymentChainId + ? _DEPLOYMENT_DOMAIN_SEPARATOR + : _calculateDomainSeparator(block.chainid); + } +} diff --git a/deployment/1_2_createGenesisCustomToken.js b/deployment/1_2_createGenesisCustomToken.js deleted file mode 100644 index 2a4386d1e..000000000 --- a/deployment/1_2_createGenesisCustomToken.js +++ /dev/null @@ -1,343 +0,0 @@ -/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if, import/no-dynamic-require */ -/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved, no-restricted-syntax */ -const { expect } = require('chai'); -const path = require('path'); -const fs = require('fs'); -require('dotenv').config({ path: path.resolve(__dirname, '../.env') }); -const { argv } = require('yargs'); - -const DEFAULT_MNEMONIC = 'test test test test test test test test test test test junk'; -process.env.HARDHAT_NETWORK = 'hardhat'; -process.env.MNEMONIC = argv.test ? DEFAULT_MNEMONIC : process.env.MNEMONIC; -const { ethers, upgrades } = require('hardhat'); -const { - MemDB, ZkEVMDB, getPoseidon, smtUtils, -} = require('@0xpolygonhermez/zkevm-commonjs'); - -const { deployPolygonZkEVMDeployer, create2Deployment } = require('./helpers/deployment-helpers'); - -const outPath = argv.out ? argv.out : './genesis.json'; -const pathOutputJson = path.join(__dirname, outPath); - -/* - * bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; - * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; - */ -const _ADMIN_SLOT = '0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103'; -const _IMPLEMENTATION_SLOT = '0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc'; - -// Genesis mainnet address: -const mainnetZkEVMDeployerAddress = '0xCB19eDdE626906eB1EE52357a27F62dd519608C2'; -const mainnetProxyAdminAddress = '0x0F99738B2Fc14D77308337f3e2596b63aE7BCC4A'; -const mainnetZkEVMBridgeImplementationAddress = '0x5ac4182A1dd41AeEf465E40B82fd326BF66AB82C'; -const mainnetZkEVMBridgeProxyAddress = '0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe'; -const mainnetGlobalExitRootL2ImplementationAddress = '0x0200143Fa295EE4dffEF22eE2616c2E008D81688'; -const mainnetGlobalExitRootL2ProxyAddress = '0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa'; -const mainnetZkEVMTimelockAddress = '0xBBa0935Fa93Eb23de7990b47F0D96a8f75766d13'; - -const mainnetMultisig = '0x4c1665d6651ecEfa59B9B3041951608468b18891'; -const mainnetInitialZkEVMDeployerOwner = '0x4c1665d6651ecEfa59B9B3041951608468b18891'; -const mainnetMinDelayTimelock = 864000; - -async function main() { - // Constant variables - const attemptsDeployProxy = 20; - const networkIDL2 = 1; - const zkevmAddressL2 = ethers.constants.AddressZero; - - const timelockAddress = mainnetMultisig; - const initialZkEVMDeployerOwner = mainnetInitialZkEVMDeployerOwner; - const salt = '0x0000000000000000000000000000000000000000000000000000000000000000'; // salt mock - const minDelayTimelock = mainnetMinDelayTimelock; - - // Load deployer - await ethers.provider.send('hardhat_impersonateAccount', [initialZkEVMDeployerOwner]); - await ethers.provider.send('hardhat_setBalance', [initialZkEVMDeployerOwner, '0xffffffffffffffff']); // 18 ethers aprox - const deployer = await ethers.getSigner(initialZkEVMDeployerOwner); - - // Deploy PolygonZkEVMDeployer if is not deployed already - const [zkEVMDeployerContract] = await deployPolygonZkEVMDeployer(initialZkEVMDeployerOwner, deployer); - - /* - * Deploy Bridge - * Deploy admin --> implementation --> proxy - */ - - // Deploy proxy admin: - const proxyAdminFactory = await ethers.getContractFactory('ProxyAdmin', deployer); - const deployTransactionAdmin = (proxyAdminFactory.getDeployTransaction()).data; - const dataCallAdmin = proxyAdminFactory.interface.encodeFunctionData('transferOwnership', [deployer.address]); - const [proxyAdminAddress] = await create2Deployment(zkEVMDeployerContract, salt, deployTransactionAdmin, dataCallAdmin, deployer); - - // Deploy implementation PolygonZkEVMBridg - const polygonZkEVMBridgeFactory = await ethers.getContractFactory('PolygonZkEVMBridge', deployer); - const deployTransactionBridge = (polygonZkEVMBridgeFactory.getDeployTransaction()).data; - // Mandatory to override the gasLimit since the estimation with create are mess up D: - const overrideGasLimit = ethers.BigNumber.from(5500000); - const [bridgeImplementationAddress] = await create2Deployment( - zkEVMDeployerContract, - salt, - deployTransactionBridge, - null, - deployer, - overrideGasLimit, - ); - - /* - * deploy proxy - * Do not initialize directlythe proxy since we want to deploy the same code on L2 and this will alter the bytecode deployed of the proxy - */ - const transparentProxyFactory = await ethers.getContractFactory('TransparentUpgradeableProxy', deployer); - const initializeEmptyDataProxy = '0x'; - const deployTransactionProxy = (transparentProxyFactory.getDeployTransaction( - bridgeImplementationAddress, - proxyAdminAddress, - initializeEmptyDataProxy, - )).data; - - const dataCallProxy = polygonZkEVMBridgeFactory.interface.encodeFunctionData( - 'initialize', - [ - networkIDL2, - mainnetGlobalExitRootL2ProxyAddress, - zkevmAddressL2, - ], - ); - const [proxyBridgeAddress] = await create2Deployment(zkEVMDeployerContract, salt, deployTransactionProxy, dataCallProxy, deployer); - - // Import OZ manifest the deployed contracts, its enough to import just the proyx, the rest are imported automatically ( admin/impl) - await upgrades.forceImport(proxyBridgeAddress, polygonZkEVMBridgeFactory, 'transparent'); - - /* - *Deployment Global exit root manager - */ - const PolygonZkEVMGlobalExitRootL2Factory = await ethers.getContractFactory('PolygonZkEVMGlobalExitRootL2', deployer); - let polygonZkEVMGlobalExitRootL2; - for (let i = 0; i < attemptsDeployProxy; i++) { - try { - polygonZkEVMGlobalExitRootL2 = await upgrades.deployProxy(PolygonZkEVMGlobalExitRootL2Factory, [], { - initializer: false, - constructorArgs: [mainnetZkEVMBridgeProxyAddress], - unsafeAllow: ['constructor', 'state-variable-immutable'], - }); - break; - } catch (error) { - console.log(`attempt ${i}`); - console.log('upgrades.deployProxy of polygonZkEVMGlobalExitRootL2 ', error.message); - } - - // reach limits of attempts - if (i + 1 === attemptsDeployProxy) { - throw new Error('polygonZkEVMGlobalExitRootL2 contract has not been deployed'); - } - } - - // Assert admin address - expect(await upgrades.erc1967.getAdminAddress(polygonZkEVMGlobalExitRootL2.address)).to.be.equal(proxyAdminAddress); - expect(await upgrades.erc1967.getAdminAddress(proxyBridgeAddress)).to.be.equal(proxyAdminAddress); - - const timelockContractFactory = await ethers.getContractFactory('PolygonZkEVMTimelock', deployer); - const timelockContract = await timelockContractFactory.deploy( - minDelayTimelock, - [timelockAddress], - [timelockAddress], - timelockAddress, - zkevmAddressL2, - ); - await timelockContract.deployed(); - - // Transfer ownership of the proxyAdmin to timelock - const proxyAdminInstance = proxyAdminFactory.attach(proxyAdminAddress); - await (await proxyAdminInstance.connect(deployer).transferOwnership(mainnetZkEVMTimelockAddress)).wait(); - - // Recreate genesis with the current information: - const genesis = []; - - // ZKEVMDeployer - const zkEVMDeployerInfo = await getAddressInfo(zkEVMDeployerContract.address); - genesis.push({ - contractName: 'PolygonZkEVMDeployer', - balance: '0', - nonce: zkEVMDeployerInfo.nonce.toString(), - address: mainnetZkEVMDeployerAddress, // override adddress - bytecode: zkEVMDeployerInfo.bytecode, - storage: zkEVMDeployerInfo.storage, - }); - - // Proxy Admin - const proxyAdminInfo = await getAddressInfo(proxyAdminAddress); - genesis.push({ - contractName: 'ProxyAdmin', - balance: '0', - nonce: proxyAdminInfo.nonce.toString(), - address: mainnetProxyAdminAddress, // override adddress - bytecode: proxyAdminInfo.bytecode, - storage: proxyAdminInfo.storage, - }); - - // Bridge implementation - const bridgeImplementationInfo = await getAddressInfo(bridgeImplementationAddress); - genesis.push({ - contractName: 'PolygonZkEVMBridge implementation', - balance: '0', - nonce: bridgeImplementationInfo.nonce.toString(), - address: mainnetZkEVMBridgeImplementationAddress, // override adddress - bytecode: bridgeImplementationInfo.bytecode, - // storage: bridgeImplementationInfo.storage, implementation do not have storage - }); - - // Bridge proxy - const bridgeProxyInfo = await getAddressInfo(proxyBridgeAddress); - - // Override admin and implementation slots: - bridgeProxyInfo.storage[_ADMIN_SLOT] = ethers.utils.hexZeroPad(mainnetProxyAdminAddress, 32); - bridgeProxyInfo.storage[_IMPLEMENTATION_SLOT] = ethers.utils.hexZeroPad(mainnetZkEVMBridgeImplementationAddress, 32); - - // update proxy storage - genesis.push({ - contractName: 'PolygonZkEVMBridge proxy', - balance: '200000000000000000000000000', - nonce: bridgeProxyInfo.nonce.toString(), - address: mainnetZkEVMBridgeProxyAddress, // override adddress - bytecode: bridgeProxyInfo.bytecode, - storage: bridgeProxyInfo.storage, - }); - - // polygonZkEVMGlobalExitRootL2 implementation - const implGlobalExitRootL2 = await upgrades.erc1967.getImplementationAddress(polygonZkEVMGlobalExitRootL2.address); - const implGlobalExitRootL2Info = await getAddressInfo(implGlobalExitRootL2); - genesis.push({ - contractName: 'PolygonZkEVMGlobalExitRootL2 implementation', - balance: '0', - nonce: implGlobalExitRootL2Info.nonce.toString(), - address: mainnetGlobalExitRootL2ImplementationAddress, // override address - bytecode: implGlobalExitRootL2Info.bytecode, - // storage: implGlobalExitRootL2Info.storage, , implementation do not have storage - }); - - // polygonZkEVMGlobalExitRootL2 proxy - const proxyGlobalExitRootL2Info = await getAddressInfo(polygonZkEVMGlobalExitRootL2.address); - - // Override admin and implementation slots: - proxyGlobalExitRootL2Info.storage[_ADMIN_SLOT] = ethers.utils.hexZeroPad(mainnetProxyAdminAddress, 32); - proxyGlobalExitRootL2Info.storage[_IMPLEMENTATION_SLOT] = ethers.utils.hexZeroPad(mainnetGlobalExitRootL2ImplementationAddress, 32); - - genesis.push({ - contractName: 'PolygonZkEVMGlobalExitRootL2 proxy', - balance: '0', - nonce: proxyGlobalExitRootL2Info.nonce.toString(), - address: mainnetGlobalExitRootL2ProxyAddress, // Override address! - bytecode: proxyGlobalExitRootL2Info.bytecode, - storage: proxyGlobalExitRootL2Info.storage, - }); - - // Timelock - const timelockInfo = await getAddressInfo(timelockContract.address); - - /* - * Since roles are used, most storage are writted in peusdoRandom storage slots - * bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256("TIMELOCK_ADMIN_ROLE"); - * bytes32 public constant PROPOSER_ROLE = keccak256("PROPOSER_ROLE"); - * bytes32 public constant EXECUTOR_ROLE = keccak256("EXECUTOR_ROLE"); - * bytes32 public constant CANCELLER_ROLE = keccak256("CANCELLER_ROLE"); - */ - const timelockRolesHash = [ - ethers.utils.id('TIMELOCK_ADMIN_ROLE'), - ethers.utils.id('PROPOSER_ROLE'), - ethers.utils.id('EXECUTOR_ROLE'), - ethers.utils.id('CANCELLER_ROLE'), - ]; - - for (let i = 0; i < timelockRolesHash.length; i++) { - const rolesMappingStoragePositionStruct = 0; - const storagePosition = ethers.utils.solidityKeccak256(['uint256', 'uint256'], [timelockRolesHash[i], rolesMappingStoragePositionStruct]); - - // check timelock address manager, and timelock address itself - const addressArray = [timelockAddress, timelockContract.address]; - for (let j = 0; j < addressArray.length; j++) { - const storagePositionRole = ethers.utils.solidityKeccak256(['uint256', 'uint256'], [addressArray[j], storagePosition]); - const valueRole = await ethers.provider.getStorageAt(timelockContract.address, storagePositionRole); - if (valueRole !== '0x0000000000000000000000000000000000000000000000000000000000000000') { - timelockInfo.storage[storagePositionRole] = valueRole; - } - } - const roleAdminSlot = ethers.utils.hexZeroPad((ethers.BigNumber.from(storagePosition).add(1)).toHexString(), 32); - const valueRoleAdminSlot = await ethers.provider.getStorageAt(timelockContract.address, roleAdminSlot); - if (valueRoleAdminSlot !== '0x0000000000000000000000000000000000000000000000000000000000000000') { - timelockInfo.storage[roleAdminSlot] = valueRoleAdminSlot; - } - } - - genesis.push({ - contractName: 'PolygonZkEVMTimelock', - balance: '0', - nonce: timelockInfo.nonce.toString(), - address: timelockContract.address, - bytecode: timelockInfo.bytecode, - storage: timelockInfo.storage, - }); - - // Put nonces on deployers - - // deployer - const deployerInfo = await getAddressInfo(deployer.address); - genesis.push({ - accountName: 'deployer', - balance: '0', - nonce: deployerInfo.nonce.toString(), - address: deployer.address, - }); - - // calculate root - const poseidon = await getPoseidon(); - const { F } = poseidon; - const db = new MemDB(F); - const genesisRoot = [F.zero, F.zero, F.zero, F.zero]; - const accHashInput = [F.zero, F.zero, F.zero, F.zero]; - const defaultChainId = 1000; - - const zkEVMDB = await ZkEVMDB.newZkEVM( - db, - poseidon, - genesisRoot, - accHashInput, - genesis, - null, - null, - defaultChainId, - ); - - fs.writeFileSync(pathOutputJson, JSON.stringify({ - root: smtUtils.h4toString(zkEVMDB.stateRoot), - genesis, - }, null, 1)); -} - -main().catch((e) => { - console.error(e); - process.exit(1); -}); - -async function getAddressInfo(address) { - const nonce = await ethers.provider.getTransactionCount(address); - const bytecode = await ethers.provider.getCode(address); - - const storage = {}; - for (let i = 0; i < 120; i++) { - const storageValue = await ethers.provider.getStorageAt(address, i); - if (storageValue !== '0x0000000000000000000000000000000000000000000000000000000000000000') { - storage[ethers.utils.hexZeroPad(ethers.utils.hexlify(i), 32)] = storageValue; - } - } - - const valueAdminSlot = await ethers.provider.getStorageAt(address, _ADMIN_SLOT); - if (valueAdminSlot !== '0x0000000000000000000000000000000000000000000000000000000000000000') { - storage[_ADMIN_SLOT] = valueAdminSlot; - } - const valuImplementationSlot = await ethers.provider.getStorageAt(address, _IMPLEMENTATION_SLOT); - if (valuImplementationSlot !== '0x0000000000000000000000000000000000000000000000000000000000000000') { - storage[_IMPLEMENTATION_SLOT] = valuImplementationSlot; - } - - return { nonce, bytecode, storage }; -} diff --git a/deployment/1_createGenesis.js b/deployment/1_createGenesis.js index 98f057c06..a836f29fd 100644 --- a/deployment/1_createGenesis.js +++ b/deployment/1_createGenesis.js @@ -14,7 +14,7 @@ const { MemDB, ZkEVMDB, getPoseidon, smtUtils, } = require('@0xpolygonhermez/zkevm-commonjs'); -const { deployPolygonZkEVMDeployer, create2Deployment } = require('./helpers/deployment-helpers'); +const { deployPolygonZkEVMDeployer, create2Deployment, getCreate2Address } = require('./helpers/deployment-helpers'); const deployParametersPath = argv.input ? argv.input : './deploy_parameters.json'; const deployParameters = require(deployParametersPath); @@ -44,6 +44,7 @@ async function main() { 'salt', 'initialZkEVMDeployerOwner', 'gasTokenAddress', + 'gasTokenNetwork', ]; for (const parameterName of mandatoryDeploymentParameters) { @@ -58,9 +59,11 @@ async function main() { salt, initialZkEVMDeployerOwner, gasTokenAddress, + gasTokenNetwork, } = deployParameters; - const balanceBriged = (gasTokenAddress === '' || gasTokenAddress === '0x0000000000000000000000000000000000000000') ? '200000000000000000000000000' : maxUint256; + // TODO + const balanceBrige = (gasTokenAddress === '' || gasTokenAddress === '0x0000000000000000000000000000000000000000') ? '200000000000000000000000000' : maxUint256; // Load deployer await ethers.provider.send('hardhat_impersonateAccount', [initialZkEVMDeployerOwner]); @@ -81,16 +84,30 @@ async function main() { const dataCallAdmin = proxyAdminFactory.interface.encodeFunctionData('transferOwnership', [deployer.address]); const [proxyAdminAddress] = await create2Deployment(zkEVMDeployerContract, salt, deployTransactionAdmin, dataCallAdmin, deployer); + // Get L1 address + + // get bridge impl + const polygonZkEVML1BridgeFactory = await ethers.getContractFactory('PolygonZkEVMBridge', deployer); + const deployTransactionBridgeL1 = (polygonZkEVML1BridgeFactory.getDeployTransaction()).data; + const L1ZkEVMBridgeImplementationAddress = getCreate2Address( + zkEVMDeployerContract, + salt, + deployTransactionBridgeL1, + ); + + // get bridge proxy + const transparentProxyFactoryL1 = await ethers.getContractFactory('TransparentUpgradeableProxy', deployer); + const initializeEmptyDataProxyL1 = '0x'; + const deployTransactionProxyL1 = (transparentProxyFactoryL1.getDeployTransaction( + L1ZkEVMBridgeImplementationAddress, + proxyAdminAddress, + initializeEmptyDataProxyL1, + )).data; + const L1ZkEVMBridgeProxyAddress = getCreate2Address(zkEVMDeployerContract, salt, deployTransactionProxyL1); + // Deploy implementation PolygonZkEVMBridge const polygonZkEVMBridgeFactory = await ethers.getContractFactory('PolygonZkEVMBridge', deployer); const deployTransactionBridge = (polygonZkEVMBridgeFactory.getDeployTransaction()).data; - - /* - * precalculate bridge address - * const hashInitCodeBridge = ethers.utils.solidityKeccak256(['bytes'], [deployTransactionBridge]); - * const precalculatedAddressDeployed = ethers.utils.getCreate2Address(zkEVMDeployerContract.address, salt, hashInitCodeBridge); - */ - // Mandatory to override the gasLimit since the estimation with create are mess up D: const overrideGasLimit = ethers.BigNumber.from(5500000); const [bridgeImplementationAddress] = await create2Deployment( @@ -136,7 +153,7 @@ async function main() { try { polygonZkEVMGlobalExitRootL2 = await upgrades.deployProxy(PolygonZkEVMGlobalExitRootL2Factory, [], { initializer: false, - constructorArgs: [proxyBridgeAddress], + constructorArgs: [L1ZkEVMBridgeProxyAddress], unsafeAllow: ['constructor', 'state-variable-immutable'], }); break; @@ -200,19 +217,22 @@ async function main() { contractName: 'PolygonZkEVMBridge implementation', balance: '0', nonce: bridgeImplementationInfo.nonce.toString(), - address: bridgeImplementationAddress, + address: L1ZkEVMBridgeImplementationAddress, // override address bytecode: bridgeImplementationInfo.bytecode, // storage: bridgeImplementationInfo.storage, implementation do not have storage }); // Bridge proxy const bridgeProxyInfo = await getAddressInfo(proxyBridgeAddress); + // Override admin and implementation slots: + bridgeProxyInfo.storage[_ADMIN_SLOT] = ethers.utils.hexZeroPad(proxyAdminAddress, 32); + bridgeProxyInfo.storage[_IMPLEMENTATION_SLOT] = ethers.utils.hexZeroPad(L1ZkEVMBridgeImplementationAddress, 32); genesis.push({ contractName: 'PolygonZkEVMBridge proxy', - balance: balanceBriged, + balance: balanceBrige, nonce: bridgeProxyInfo.nonce.toString(), - address: proxyBridgeAddress, + address: L1ZkEVMBridgeProxyAddress, // override adddress bytecode: bridgeProxyInfo.bytecode, storage: bridgeProxyInfo.storage, }); diff --git a/deployment/helpers/deployment-helpers.js b/deployment/helpers/deployment-helpers.js index bbd7119f0..499daea89 100644 --- a/deployment/helpers/deployment-helpers.js +++ b/deployment/helpers/deployment-helpers.js @@ -99,7 +99,16 @@ async function create2Deployment(polgonZKEVMDeployerContract, salt, deployTransa return [precalculatedAddressDeployed, true]; } +async function getCreate2Address(polgonZKEVMDeployerContract, salt, deployTransaction) { + // Encode deploy transaction + const hashInitCode = ethers.utils.solidityKeccak256(['bytes'], [deployTransaction]); + + // Precalculate create2 address + return ethers.utils.getCreate2Address(polgonZKEVMDeployerContract.address, salt, hashInitCode); +} + module.exports = { deployPolygonZkEVMDeployer, create2Deployment, + getCreate2Address, }; From a09de9fa3c11174a889920ff67a01a616a08d7ce Mon Sep 17 00:00:00 2001 From: invocamanman Date: Thu, 24 Aug 2023 16:15:42 +0200 Subject: [PATCH 005/230] almost done2 --- deployment/1_createGenesis.js | 207 +++++++++++++++------- deployment/deploy_parameters.json.example | 2 + 2 files changed, 142 insertions(+), 67 deletions(-) diff --git a/deployment/1_createGenesis.js b/deployment/1_createGenesis.js index a836f29fd..240b9d5bf 100644 --- a/deployment/1_createGenesis.js +++ b/deployment/1_createGenesis.js @@ -37,6 +37,15 @@ async function main() { const zkevmAddressL2 = ethers.constants.AddressZero; const maxUint256 = ethers.BigNumber.from('0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff').toString(); + let balanceBrige; + + let bridgeImplementationAddress; + let proxyBridgeAddress; + let finalBridgeImplAddress; + let finalBridgeProxyAddress; + + const genesis = []; + // deploy parameters const mandatoryDeploymentParameters = [ 'timelockAddress', @@ -62,9 +71,6 @@ async function main() { gasTokenNetwork, } = deployParameters; - // TODO - const balanceBrige = (gasTokenAddress === '' || gasTokenAddress === '0x0000000000000000000000000000000000000000') ? '200000000000000000000000000' : maxUint256; - // Load deployer await ethers.provider.send('hardhat_impersonateAccount', [initialZkEVMDeployerOwner]); await ethers.provider.send('hardhat_setBalance', [initialZkEVMDeployerOwner, '0xffffffffffffffff']); // 18 ethers aprox @@ -84,65 +90,133 @@ async function main() { const dataCallAdmin = proxyAdminFactory.interface.encodeFunctionData('transferOwnership', [deployer.address]); const [proxyAdminAddress] = await create2Deployment(zkEVMDeployerContract, salt, deployTransactionAdmin, dataCallAdmin, deployer); - // Get L1 address - - // get bridge impl - const polygonZkEVML1BridgeFactory = await ethers.getContractFactory('PolygonZkEVMBridge', deployer); - const deployTransactionBridgeL1 = (polygonZkEVML1BridgeFactory.getDeployTransaction()).data; - const L1ZkEVMBridgeImplementationAddress = getCreate2Address( - zkEVMDeployerContract, - salt, - deployTransactionBridgeL1, - ); - - // get bridge proxy - const transparentProxyFactoryL1 = await ethers.getContractFactory('TransparentUpgradeableProxy', deployer); - const initializeEmptyDataProxyL1 = '0x'; - const deployTransactionProxyL1 = (transparentProxyFactoryL1.getDeployTransaction( - L1ZkEVMBridgeImplementationAddress, - proxyAdminAddress, - initializeEmptyDataProxyL1, - )).data; - const L1ZkEVMBridgeProxyAddress = getCreate2Address(zkEVMDeployerContract, salt, deployTransactionProxyL1); - - // Deploy implementation PolygonZkEVMBridge - const polygonZkEVMBridgeFactory = await ethers.getContractFactory('PolygonZkEVMBridge', deployer); - const deployTransactionBridge = (polygonZkEVMBridgeFactory.getDeployTransaction()).data; - // Mandatory to override the gasLimit since the estimation with create are mess up D: - const overrideGasLimit = ethers.BigNumber.from(5500000); - const [bridgeImplementationAddress] = await create2Deployment( - zkEVMDeployerContract, - salt, - deployTransactionBridge, - null, - deployer, - overrideGasLimit, - ); - - /* - * deploy proxy - * Do not initialize directlythe proxy since we want to deploy the same code on L2 and this will alter the bytecode deployed of the proxy - */ - const transparentProxyFactory = await ethers.getContractFactory('TransparentUpgradeableProxy', deployer); - const initializeEmptyDataProxy = '0x'; - const deployTransactionProxy = (transparentProxyFactory.getDeployTransaction( - bridgeImplementationAddress, - proxyAdminAddress, - initializeEmptyDataProxy, - )).data; - - const dataCallProxy = polygonZkEVMBridgeFactory.interface.encodeFunctionData( - 'initialize', - [ - networkIDL2, - globalExitRootL2Address, - zkevmAddressL2, - ], - ); - const [proxyBridgeAddress] = await create2Deployment(zkEVMDeployerContract, salt, deployTransactionProxy, dataCallProxy, deployer); - - // Import OZ manifest the deployed contracts, its enough to import just the proyx, the rest are imported automatically ( admin/impl) - await upgrades.forceImport(proxyBridgeAddress, polygonZkEVMBridgeFactory, 'transparent'); + if ((gasTokenAddress === '' || gasTokenAddress === '0x0000000000000000000000000000000000000000')) { + // deploy with ether as gasToken + balanceBrige = '200000000000000000000000000'; + + // Deploy implementation PolygonZkEVMBridge + const polygonZkEVMBridgeFactory = await ethers.getContractFactory('PolygonZkEVMBridge', deployer); + const deployTransactionBridge = (polygonZkEVMBridgeFactory.getDeployTransaction()).data; + // Mandatory to override the gasLimit since the estimation with create are mess up D: + const overrideGasLimit = ethers.BigNumber.from(5500000); + [bridgeImplementationAddress] = await create2Deployment( + zkEVMDeployerContract, + salt, + deployTransactionBridge, + null, + deployer, + overrideGasLimit, + ); + finalBridgeProxyAddress = bridgeImplementationAddress; + + /* + * deploy proxy + * Do not initialize directlythe proxy since we want to deploy the same code on L2 and this will alter the bytecode deployed of the proxy + */ + const transparentProxyFactory = await ethers.getContractFactory('TransparentUpgradeableProxy', deployer); + const initializeEmptyDataProxy = '0x'; + const deployTransactionProxy = (transparentProxyFactory.getDeployTransaction( + bridgeImplementationAddress, + proxyAdminAddress, + initializeEmptyDataProxy, + )).data; + + const dataCallProxy = polygonZkEVMBridgeFactory.interface.encodeFunctionData( + 'initialize', + [ + networkIDL2, + globalExitRootL2Address, + zkevmAddressL2, + ], + ); + [proxyBridgeAddress] = await create2Deployment(zkEVMDeployerContract, salt, deployTransactionProxy, dataCallProxy, deployer); + finalBridgeProxyAddress = proxyBridgeAddress; + + // Import OZ manifest the deployed contracts, its enough to import just the proyx, the rest are imported automatically ( admin/impl) + await upgrades.forceImport(proxyBridgeAddress, polygonZkEVMBridgeFactory, 'transparent'); + } else { + // deploy token as gasToken + balanceBrige = maxUint256; + + // Get L1 address + + // get bridge impl + const polygonZkEVML1BridgeFactory = await ethers.getContractFactory('PolygonZkEVMBridge', deployer); + const deployTransactionBridgeL1 = (polygonZkEVML1BridgeFactory.getDeployTransaction()).data; + finalBridgeImplAddress = getCreate2Address( + zkEVMDeployerContract, + salt, + deployTransactionBridgeL1, + ); + + // get bridge proxy + const transparentProxyFactoryL1 = await ethers.getContractFactory('TransparentUpgradeableProxy', deployer); + const initializeEmptyDataProxyL1 = '0x'; + const deployTransactionProxyL1 = (transparentProxyFactoryL1.getDeployTransaction( + finalBridgeImplAddress, + proxyAdminAddress, + initializeEmptyDataProxyL1, + )).data; + finalBridgeProxyAddress = getCreate2Address(zkEVMDeployerContract, salt, deployTransactionProxyL1); + + // Deploy WETH token + const WETHzkEVMFactory = await ethers.getContractFactory('WETHzkEVM', deployer); + const WETHToken = await WETHzkEVMFactory.deploy(finalBridgeProxyAddress); + await WETHToken.deployed(); + + // Deploy implementation PolygonZkEVMBridge + const polygonZkEVMBridgeFactory = await ethers.getContractFactory('PolygonZkEVMBridgeL2', deployer); + const deployTransactionBridge = (polygonZkEVMBridgeFactory.getDeployTransaction()).data; + // Mandatory to override the gasLimit since the estimation with create are mess up D: + const overrideGasLimit = ethers.BigNumber.from(5500000); + [bridgeImplementationAddress] = await create2Deployment( + zkEVMDeployerContract, + salt, + deployTransactionBridge, + null, + deployer, + overrideGasLimit, + ); + + /* + * deploy proxy + * Do not initialize directlythe proxy since we want to deploy the same code on L2 and this will alter the bytecode deployed of the proxy + */ + const transparentProxyFactory = await ethers.getContractFactory('TransparentUpgradeableProxy', deployer); + const initializeEmptyDataProxy = '0x'; + const deployTransactionProxy = (transparentProxyFactory.getDeployTransaction( + bridgeImplementationAddress, + proxyAdminAddress, + initializeEmptyDataProxy, + )).data; + + const dataCallProxy = polygonZkEVMBridgeFactory.interface.encodeFunctionData( + 'initialize', + [ + networkIDL2, + globalExitRootL2Address, + zkevmAddressL2, + gasTokenAddress, + gasTokenNetwork, + WETHToken.address, + ], + ); + [proxyBridgeAddress] = await create2Deployment(zkEVMDeployerContract, salt, deployTransactionProxy, dataCallProxy, deployer); + + // Import OZ manifest the deployed contracts, its enough to import just the proyx, the rest are imported automatically ( admin/impl) + await upgrades.forceImport(proxyBridgeAddress, polygonZkEVMBridgeFactory, 'transparent'); + + // Update genesis with the WETH token + const WETHInfo = await getAddressInfo(WETHToken.address); + genesis.push({ + contractName: 'WETHzkEVM', + balance: '0', + nonce: WETHInfo.nonce.toString(), + address: WETHToken.address, + bytecode: WETHInfo.bytecode, + storage: WETHInfo.storage, + }); + } /* *Deployment Global exit root manager @@ -153,7 +227,7 @@ async function main() { try { polygonZkEVMGlobalExitRootL2 = await upgrades.deployProxy(PolygonZkEVMGlobalExitRootL2Factory, [], { initializer: false, - constructorArgs: [L1ZkEVMBridgeProxyAddress], + constructorArgs: [finalBridgeProxyAddress], unsafeAllow: ['constructor', 'state-variable-immutable'], }); break; @@ -187,7 +261,6 @@ async function main() { await (await proxyAdminInstance.connect(deployer).transferOwnership(timelockContract.address)).wait(); // Recreate genesis with the current information: - const genesis = []; // ZKEVMDeployer const zkEVMDeployerInfo = await getAddressInfo(zkEVMDeployerContract.address); @@ -217,7 +290,7 @@ async function main() { contractName: 'PolygonZkEVMBridge implementation', balance: '0', nonce: bridgeImplementationInfo.nonce.toString(), - address: L1ZkEVMBridgeImplementationAddress, // override address + address: finalBridgeImplAddress, // override address bytecode: bridgeImplementationInfo.bytecode, // storage: bridgeImplementationInfo.storage, implementation do not have storage }); @@ -226,13 +299,13 @@ async function main() { const bridgeProxyInfo = await getAddressInfo(proxyBridgeAddress); // Override admin and implementation slots: bridgeProxyInfo.storage[_ADMIN_SLOT] = ethers.utils.hexZeroPad(proxyAdminAddress, 32); - bridgeProxyInfo.storage[_IMPLEMENTATION_SLOT] = ethers.utils.hexZeroPad(L1ZkEVMBridgeImplementationAddress, 32); + bridgeProxyInfo.storage[_IMPLEMENTATION_SLOT] = ethers.utils.hexZeroPad(finalBridgeImplAddress, 32); genesis.push({ contractName: 'PolygonZkEVMBridge proxy', balance: balanceBrige, nonce: bridgeProxyInfo.nonce.toString(), - address: L1ZkEVMBridgeProxyAddress, // override adddress + address: finalBridgeProxyAddress, // override adddress bytecode: bridgeProxyInfo.bytecode, storage: bridgeProxyInfo.storage, }); diff --git a/deployment/deploy_parameters.json.example b/deployment/deploy_parameters.json.example index a798213dc..d482d43d2 100644 --- a/deployment/deploy_parameters.json.example +++ b/deployment/deploy_parameters.json.example @@ -17,6 +17,8 @@ "initialZkEVMDeployerOwner" :"0xaddress", "maticTokenAddress":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", "zkEVMDeployerAddress":"", + "gasTokenAddress":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", + "gasTokenNetwork":0, "deployerPvtKey": "", "maxFeePerGas":"", "maxPriorityFeePerGas":"", From 42e0f34548d8e6c210c09257306b73ae8c66bbf7 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Thu, 24 Aug 2023 16:54:40 +0200 Subject: [PATCH 006/230] done --- deployment/testnet/prepareGasToken.js | 78 +++++++++++++++++++++++++++ package.json | 6 ++- 2 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 deployment/testnet/prepareGasToken.js diff --git a/deployment/testnet/prepareGasToken.js b/deployment/testnet/prepareGasToken.js new file mode 100644 index 000000000..7068616b8 --- /dev/null +++ b/deployment/testnet/prepareGasToken.js @@ -0,0 +1,78 @@ +/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if, no-restricted-syntax */ +/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */ +const { ethers } = require('hardhat'); +const path = require('path'); +const fs = require('fs'); +require('dotenv').config({ path: path.resolve(__dirname, '../../.env') }); + +const pathDeployParameters = path.join(__dirname, '../deploy_parameters.json'); +const deployParameters = require('../deploy_parameters.json'); + +async function main() { + // Load provider + let currentProvider = ethers.provider; + if (deployParameters.multiplierGas || deployParameters.maxFeePerGas) { + if (process.env.HARDHAT_NETWORK !== 'hardhat') { + currentProvider = new ethers.providers.JsonRpcProvider(`https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}`); + if (deployParameters.maxPriorityFeePerGas && deployParameters.maxFeePerGas) { + console.log(`Hardcoded gas used: MaxPriority${deployParameters.maxPriorityFeePerGas} gwei, MaxFee${deployParameters.maxFeePerGas} gwei`); + const FEE_DATA = { + maxFeePerGas: ethers.utils.parseUnits(deployParameters.maxFeePerGas, 'gwei'), + maxPriorityFeePerGas: ethers.utils.parseUnits(deployParameters.maxPriorityFeePerGas, 'gwei'), + }; + currentProvider.getFeeData = async () => FEE_DATA; + } else { + console.log('Multiplier gas used: ', deployParameters.multiplierGas); + async function overrideFeeData() { + const feedata = await ethers.provider.getFeeData(); + return { + maxFeePerGas: feedata.maxFeePerGas.mul(deployParameters.multiplierGas), + maxPriorityFeePerGas: feedata.maxPriorityFeePerGas.mul(deployParameters.multiplierGas), + }; + } + currentProvider.getFeeData = overrideFeeData; + } + } + } + + // Load deployer + let deployer; + if (deployParameters.deployerPvtKey) { + deployer = new ethers.Wallet(deployParameters.deployerPvtKey, currentProvider); + console.log('Using pvtKey deployer with address: ', deployer.address); + } else if (process.env.MNEMONIC) { + deployer = ethers.Wallet.fromMnemonic(process.env.MNEMONIC, 'm/44\'/60\'/0\'/0/0').connect(currentProvider); + console.log('Using MNEMONIC deployer with address: ', deployer.address); + } else { + [deployer] = (await ethers.getSigners()); + } + + /* + *Deployment MATIC + */ + const gasTokenName = 'Gas Token'; + const gasTokenSymbol = 'GT'; + const gasTokenInitialBalance = ethers.utils.parseEther('20000000'); + + const gasTokenFactory = await ethers.getContractFactory('ERC20PermitMock', deployer); + const gasTokenContract = await gasTokenFactory.deploy( + gasTokenName, + gasTokenSymbol, + deployer.address, + gasTokenInitialBalance, + ); + awaitgasTokenContract.deployed(); + + console.log('#######################\n'); + console.log('Gas Token deployed to:', gasTokenContract.address); + + deployParameters.gasTokenAddress = maticTokenContract.address; + deployParameters.gasTokenNetwork = 0; + + fs.writeFileSync(pathDeployParameters, JSON.stringify(deployParameters, null, 1)); +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/package.json b/package.json index 4bb98e696..9ebf7b85f 100644 --- a/package.json +++ b/package.json @@ -89,6 +89,10 @@ "gas:report": "REPORT_GAS=true npx hardhat test", "gas:report:file": "rm -f .openzeppelin/unknown-31337.json && REPORT_GAS=true REPORT_GAS_FILE=true npx hardhat test", "deploy:testnet:ZkEVM:test:goerli": "npm run prepare:testnet:ZkEVM:goerli && npm run deploy:ZkEVM:test:goerli", - "deploy:ZkEVM:test:goerli": "node deployment/1_createGenesis.js --test && npx hardhat run deployment/3_deployContracts.js --network goerli && npm run saveDeployment:goerli" + "deploy:ZkEVM:test:goerli": "node deployment/1_createGenesis.js --test && npx hardhat run deployment/3_deployContracts.js --network goerli && npm run saveDeployment:goerli", + "prepare:testnet:gasToken:ZkEVM:localhost": "npx hardhat run deployment/testnet/prepareTestnet.js --network localhost && npx hardhat run deployment/testnet/prepareGasToken.js --network localhost", + "deploy:testnet:gasToken:ZkEVM:localhost": "npm run prepare:testnet:gasToken:ZkEVM:localhost && npm run deploy:ZkEVM:localhost", + "prepare:testnet:gasToken:ZkEVM:goerli": "npx hardhat run deployment/testnet/prepareTestnet.js --network goerli && npx hardhat run deployment/testnet/prepareGasToken.js --network goerli", + "deploy:testnet:gasToken:ZkEVM:goerli": "npm run prepare:testnet:gasToken:ZkEVM:goerli && npm run deploy:ZkEVM:goerli" } } From 60fc0ac046f88f36cb5b416b40468db5e7d6acf6 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Fri, 25 Aug 2023 03:18:16 +0200 Subject: [PATCH 007/230] fixes --- deployment/1_createGenesis.js | 4 +--- deployment/helpers/deployment-helpers.js | 2 +- deployment/testnet/prepareGasToken.js | 4 ++-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/deployment/1_createGenesis.js b/deployment/1_createGenesis.js index 240b9d5bf..0db3cc42b 100644 --- a/deployment/1_createGenesis.js +++ b/deployment/1_createGenesis.js @@ -52,8 +52,6 @@ async function main() { 'minDelayTimelock', 'salt', 'initialZkEVMDeployerOwner', - 'gasTokenAddress', - 'gasTokenNetwork', ]; for (const parameterName of mandatoryDeploymentParameters) { @@ -90,7 +88,7 @@ async function main() { const dataCallAdmin = proxyAdminFactory.interface.encodeFunctionData('transferOwnership', [deployer.address]); const [proxyAdminAddress] = await create2Deployment(zkEVMDeployerContract, salt, deployTransactionAdmin, dataCallAdmin, deployer); - if ((gasTokenAddress === '' || gasTokenAddress === '0x0000000000000000000000000000000000000000')) { + if ((gasTokenAddress === undefined || gasTokenAddress === '' || gasTokenAddress === '0x0000000000000000000000000000000000000000')) { // deploy with ether as gasToken balanceBrige = '200000000000000000000000000'; diff --git a/deployment/helpers/deployment-helpers.js b/deployment/helpers/deployment-helpers.js index 499daea89..569f2529d 100644 --- a/deployment/helpers/deployment-helpers.js +++ b/deployment/helpers/deployment-helpers.js @@ -99,7 +99,7 @@ async function create2Deployment(polgonZKEVMDeployerContract, salt, deployTransa return [precalculatedAddressDeployed, true]; } -async function getCreate2Address(polgonZKEVMDeployerContract, salt, deployTransaction) { +function getCreate2Address(polgonZKEVMDeployerContract, salt, deployTransaction) { // Encode deploy transaction const hashInitCode = ethers.utils.solidityKeccak256(['bytes'], [deployTransaction]); diff --git a/deployment/testnet/prepareGasToken.js b/deployment/testnet/prepareGasToken.js index 7068616b8..36d961ee0 100644 --- a/deployment/testnet/prepareGasToken.js +++ b/deployment/testnet/prepareGasToken.js @@ -61,12 +61,12 @@ async function main() { deployer.address, gasTokenInitialBalance, ); - awaitgasTokenContract.deployed(); + await gasTokenContract.deployed(); console.log('#######################\n'); console.log('Gas Token deployed to:', gasTokenContract.address); - deployParameters.gasTokenAddress = maticTokenContract.address; + deployParameters.gasTokenAddress = gasTokenContract.address; deployParameters.gasTokenNetwork = 0; fs.writeFileSync(pathDeployParameters, JSON.stringify(deployParameters, null, 1)); From 67082d53ad206c340a58293b17e2bd3c0de374ab Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 12 Sep 2023 16:38:53 +0200 Subject: [PATCH 008/230] update version --- contracts/L2/PolygonZkEVMBridgeL2.sol | 2 +- contracts/L2/WETHzkEVM.sol | 2 +- .../interfaces/IPolygonZkEVMBridgeL2.sol | 2 +- docs/L2/PolygonZkEVMBridgeL2.md | 364 ++++++++++++++++++ docs/L2/WETHzkEVM.md | 49 +++ 5 files changed, 416 insertions(+), 3 deletions(-) create mode 100644 docs/L2/PolygonZkEVMBridgeL2.md create mode 100644 docs/L2/WETHzkEVM.md diff --git a/contracts/L2/PolygonZkEVMBridgeL2.sol b/contracts/L2/PolygonZkEVMBridgeL2.sol index 9420dc3ca..4d13c8d85 100644 --- a/contracts/L2/PolygonZkEVMBridgeL2.sol +++ b/contracts/L2/PolygonZkEVMBridgeL2.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.17; +pragma solidity 0.8.20; import "../lib/DepositContract.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; diff --git a/contracts/L2/WETHzkEVM.sol b/contracts/L2/WETHzkEVM.sol index c46e73b40..b1b42e857 100644 --- a/contracts/L2/WETHzkEVM.sol +++ b/contracts/L2/WETHzkEVM.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-3.0 // Implementation of permit based on https://github.com/WETH10/WETH10/blob/main/contracts/WETH10.sol -pragma solidity 0.8.17; +pragma solidity 0.8.20; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; diff --git a/contracts/interfaces/IPolygonZkEVMBridgeL2.sol b/contracts/interfaces/IPolygonZkEVMBridgeL2.sol index 7b9492793..521c2776d 100644 --- a/contracts/interfaces/IPolygonZkEVMBridgeL2.sol +++ b/contracts/interfaces/IPolygonZkEVMBridgeL2.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.17; +pragma solidity 0.8.20; interface IPolygonZkEVMBridgeL2 { /** diff --git a/docs/L2/PolygonZkEVMBridgeL2.md b/docs/L2/PolygonZkEVMBridgeL2.md new file mode 100644 index 000000000..435aca286 --- /dev/null +++ b/docs/L2/PolygonZkEVMBridgeL2.md @@ -0,0 +1,364 @@ +PolygonZkEVMBridge that will be deployed on both networks Ethereum and Polygon zkEVM +Contract responsible to manage the token interactions with other networks + + +## Functions +### initialize +```solidity + function initialize( + uint32 _networkID, + contract IBasePolygonZkEVMGlobalExitRoot _globalExitRootManager, + address _polygonZkEVMaddress + ) external +``` +The value of `_polygonZkEVMaddress` on the L2 deployment of the contract will be address(0), so +emergency state is not possible for the L2 deployment of the bridge, intentionally + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`_networkID` | uint32 | networkID +|`_globalExitRootManager` | contract IBasePolygonZkEVMGlobalExitRoot | global exit root manager address +|`_polygonZkEVMaddress` | address | polygonZkEVM address + + +### bridgeAsset +```solidity + function bridgeAsset( + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + address token, + bool forceUpdateGlobalExitRoot, + bytes permitData + ) public +``` +Deposit add a new leaf to the merkle tree + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`destinationNetwork` | uint32 | Network destination +|`destinationAddress` | address | Address destination +|`amount` | uint256 | Amount of tokens +|`token` | address | Token address, 0 address is reserved for ether +|`forceUpdateGlobalExitRoot` | bool | Indicates if the new global exit root is updated or not +|`permitData` | bytes | Raw data of the call `permit` of the token + +### bridgeMessage +```solidity + function bridgeMessage( + 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 + +### claimAsset +```solidity + function claimAsset( + bytes32[32] smtProof, + uint32 index, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + uint32 originNetwork, + address originTokenAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes metadata + ) external +``` +Verify merkle proof and withdraw tokens/ether + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`smtProof` | bytes32[32] | Smt proof +|`index` | uint32 | Index of the leaf +|`mainnetExitRoot` | bytes32 | Mainnet exit root +|`rollupExitRoot` | bytes32 | Rollup exit root +|`originNetwork` | uint32 | Origin network +|`originTokenAddress` | address | Origin token address, 0 address is reserved for ether +|`destinationNetwork` | uint32 | Network destination +|`destinationAddress` | address | Address destination +|`amount` | uint256 | Amount of tokens +|`metadata` | bytes | Abi encoded metadata if any, empty otherwise + +### claimMessage +```solidity + function claimMessage( + bytes32[32] smtProof, + uint32 index, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + uint32 originNetwork, + address originAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes metadata + ) external +``` +Verify merkle proof and execute message +If the receiving address is an EOA, the call will result as a success +Which means that the amount of ether will be transferred correctly, but the message +will not trigger any execution + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`smtProof` | bytes32[32] | Smt proof +|`index` | uint32 | Index of the leaf +|`mainnetExitRoot` | bytes32 | Mainnet exit root +|`rollupExitRoot` | bytes32 | Rollup exit root +|`originNetwork` | uint32 | Origin network +|`originAddress` | address | Origin address +|`destinationNetwork` | uint32 | Network destination +|`destinationAddress` | address | Address destination +|`amount` | uint256 | message value +|`metadata` | bytes | Abi encoded metadata if any, empty otherwise + +### precalculatedWrapperAddress +```solidity + function precalculatedWrapperAddress( + uint32 originNetwork, + address originTokenAddress, + string name, + string symbol, + uint8 decimals + ) external returns (address) +``` +Returns the precalculated address of a wrapper using the token information +Note Updating the metadata of a token is not supported. +Since the metadata has relevance in the address deployed, this function will not return a valid +wrapped address if the metadata provided is not the original one. + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`originNetwork` | uint32 | Origin network +|`originTokenAddress` | address | Origin token address, 0 address is reserved for ether +|`name` | string | Name of the token +|`symbol` | string | Symbol of the token +|`decimals` | uint8 | Decimals of the token + +### getTokenWrappedAddress +```solidity + function getTokenWrappedAddress( + uint32 originNetwork, + address originTokenAddress + ) external returns (address) +``` +Returns the address of a wrapper using the token information if already exist + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`originNetwork` | uint32 | Origin network +|`originTokenAddress` | address | Origin token address, 0 address is reserved for ether + +### activateEmergencyState +```solidity + function activateEmergencyState( + ) external +``` +Function to activate the emergency state + " Only can be called by the Polygon ZK-EVM in extreme situations + + + +### deactivateEmergencyState +```solidity + function deactivateEmergencyState( + ) external +``` +Function to deactivate the emergency state + " Only can be called by the Polygon ZK-EVM + + + +### _verifyLeaf +```solidity + function _verifyLeaf( + bytes32[32] smtProof, + uint32 index, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + uint32 originNetwork, + address originAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes metadata, + uint8 leafType + ) internal +``` +Verify leaf and checks that it has not been claimed + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`smtProof` | bytes32[32] | Smt proof +|`index` | uint32 | Index of the leaf +|`mainnetExitRoot` | bytes32 | Mainnet exit root +|`rollupExitRoot` | bytes32 | Rollup exit root +|`originNetwork` | uint32 | Origin network +|`originAddress` | address | Origin address +|`destinationNetwork` | uint32 | Network destination +|`destinationAddress` | address | Address destination +|`amount` | uint256 | Amount of tokens +|`metadata` | bytes | Abi encoded metadata if any, empty otherwise +|`leafType` | uint8 | Leaf type --> [0] transfer Ether / ERC20 tokens, [1] message + +### isClaimed +```solidity + function isClaimed( + uint256 index + ) external returns (bool) +``` +Function to check if an index is claimed or not + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`index` | uint256 | Index + +### updateGlobalExitRoot +```solidity + function updateGlobalExitRoot( + ) external +``` +Function to update the globalExitRoot if the last deposit is not submitted + + + +### _updateGlobalExitRoot +```solidity + function _updateGlobalExitRoot( + ) internal +``` +Function to update the globalExitRoot + + + +### _permit +```solidity + function _permit( + address amount, + uint256 permitData + ) internal +``` +Function to call token permit method of extended ERC20 + + @param token ERC20 token address + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`amount` | address | Quantity that is expected to be allowed +|`permitData` | uint256 | Raw data of the call `permit` of the token + +### _safeSymbol +```solidity + function _safeSymbol( + address token + ) internal returns (string) +``` +Provides a safe ERC20.symbol version which returns 'NO_SYMBOL' as fallback string + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`token` | address | The address of the ERC-20 token contract + +### _safeName +```solidity + function _safeName( + address token + ) internal returns (string) +``` + Provides a safe ERC20.name version which returns 'NO_NAME' as fallback string. + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`token` | address | The address of the ERC-20 token contract. + +### _safeDecimals +```solidity + function _safeDecimals( + address token + ) internal returns (uint8) +``` +Provides a safe ERC20.decimals version which returns '18' as fallback value. +Note Tokens with (decimals > 255) are not supported + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`token` | address | The address of the ERC-20 token contract + +### _returnDataToString +```solidity + function _returnDataToString( + bytes data + ) internal returns (string) +``` +Function to convert returned data to string +returns 'NOT_VALID_ENCODING' as fallback value. + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`data` | bytes | returned data + +## Events +### BridgeEvent +```solidity + event BridgeEvent( + ) +``` + +Emitted when bridge assets or messages to another network + +### ClaimEvent +```solidity + event ClaimEvent( + ) +``` + +Emitted when a claim is done from another network + +### NewWrappedToken +```solidity + event NewWrappedToken( + ) +``` + +Emitted when a new wrapped token is created + diff --git a/docs/L2/WETHzkEVM.md b/docs/L2/WETHzkEVM.md new file mode 100644 index 000000000..b75e00ada --- /dev/null +++ b/docs/L2/WETHzkEVM.md @@ -0,0 +1,49 @@ + + + +## Functions +### constructor +```solidity + function constructor( + ) public +``` + + + + +### mint +```solidity + function mint( + ) external +``` + + + + +### burn +```solidity + function burn( + ) external +``` + + + + +### permit +```solidity + function permit( + ) external +``` + + + + +### DOMAIN_SEPARATOR +```solidity + function DOMAIN_SEPARATOR( + ) public returns (bytes32) +``` + +Return the DOMAIN_SEPARATOR. + + From 46760ab0cfbf6ab2753f34a42a2ae6fd0bda3a83 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 24 May 2023 16:25:38 +0200 Subject: [PATCH 009/230] historic global exit root --- contracts/v2/PolygonZkEVMGlobalExitRoot.sol | 95 ++++++++++++++ contracts/v2/lib/DepositContractLib.sol | 117 ++++++++++++++++++ docs/v2/PolygonZkEVMGlobalExitRootV2.md | 51 ++++++++ docs/v2/lib/DepositContractLib.md | 48 +++++++ .../contracts/globalExitRootManagerV2.test.js | 110 ++++++++++++++++ 5 files changed, 421 insertions(+) create mode 100644 contracts/v2/PolygonZkEVMGlobalExitRoot.sol create mode 100644 contracts/v2/lib/DepositContractLib.sol create mode 100644 docs/v2/PolygonZkEVMGlobalExitRootV2.md create mode 100644 docs/v2/lib/DepositContractLib.md create mode 100644 test/contracts/globalExitRootManagerV2.test.js diff --git a/contracts/v2/PolygonZkEVMGlobalExitRoot.sol b/contracts/v2/PolygonZkEVMGlobalExitRoot.sol new file mode 100644 index 000000000..08f2de152 --- /dev/null +++ b/contracts/v2/PolygonZkEVMGlobalExitRoot.sol @@ -0,0 +1,95 @@ +// SPDX-License-Identifier: AGPL-3.0 + +pragma solidity 0.8.17; + +import "../interfaces/IPolygonZkEVMGlobalExitRoot.sol"; +import "../lib/GlobalExitRootLib.sol"; +import "./lib/DepositContractLib.sol"; + +/** + * Contract responsible for managing the exit roots across multiple networks + */ +contract PolygonZkEVMGlobalExitRootV2 is + IPolygonZkEVMGlobalExitRoot, + DepositContractLib +{ + // PolygonZkEVMBridge address + address public immutable bridgeAddress; + + // Rollup contract address + address public immutable rollupAddress; + + // Rollup exit root, this will be updated every time a batch is verified + bytes32 public lastRollupExitRoot; + + // Mainnet exit root, this will be updated every time a deposit is made in mainnet + bytes32 public lastMainnetExitRoot; + + // Store every global exit root: Root --> timestamp + mapping(bytes32 => uint256) public globalExitRootMap; + + /** + * @dev Emitted when the global exit root is updated + */ + event UpdateGlobalExitRoot( + bytes32 indexed mainnetExitRoot, + bytes32 indexed rollupExitRoot + ); + + /** + * @param _rollupAddress Rollup contract address + * @param _bridgeAddress PolygonZkEVMBridge contract address + */ + constructor(address _rollupAddress, address _bridgeAddress) { + rollupAddress = _rollupAddress; + bridgeAddress = _bridgeAddress; + } + + /** + * @notice Update the exit root of one of the networks and the global exit root + * @param newRoot new exit tree root + */ + function updateExitRoot(bytes32 newRoot) external { + // Store storage variables into temporal variables since will be used multiple times + bytes32 cacheLastRollupExitRoot = lastRollupExitRoot; + bytes32 cacheLastMainnetExitRoot = lastMainnetExitRoot; + + if (msg.sender == bridgeAddress) { + lastMainnetExitRoot = newRoot; + cacheLastMainnetExitRoot = newRoot; + } else if (msg.sender == rollupAddress) { + lastRollupExitRoot = newRoot; + cacheLastRollupExitRoot = newRoot; + } else { + revert OnlyAllowedContracts(); + } + + bytes32 newGlobalExitRoot = GlobalExitRootLib.calculateGlobalExitRoot( + cacheLastMainnetExitRoot, + cacheLastRollupExitRoot + ); + + // If it already exists, do not modify the timestamp + if (globalExitRootMap[newGlobalExitRoot] == 0) { + globalExitRootMap[newGlobalExitRoot] = block.timestamp; + emit UpdateGlobalExitRoot( + cacheLastMainnetExitRoot, + cacheLastRollupExitRoot + ); + + // Update the historical roots + _addLeaf(newGlobalExitRoot); + } + } + + /** + * @notice Return last global exit root + */ + function getLastGlobalExitRoot() public view returns (bytes32) { + return + GlobalExitRootLib.calculateGlobalExitRoot( + lastMainnetExitRoot, + lastRollupExitRoot + ); + } +} diff --git a/contracts/v2/lib/DepositContractLib.sol b/contracts/v2/lib/DepositContractLib.sol new file mode 100644 index 000000000..466c2d0c2 --- /dev/null +++ b/contracts/v2/lib/DepositContractLib.sol @@ -0,0 +1,117 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.17; + +/** + * 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 + */ +contract DepositContractLib { + /** + * @dev Thrown when the merkle tree is full + */ + error MerkleTreeFull(); + + // Merkle tree levels + uint256 internal constant _DEPOSIT_CONTRACT_TREE_DEPTH = 32; // TODO + + // This ensures `depositCount` will fit into 32-bits + uint256 internal constant _MAX_DEPOSIT_COUNT = + 2 ** _DEPOSIT_CONTRACT_TREE_DEPTH - 1; + + // Branch array which contains the necessary sibilings to compute the next root when a new + // leaf is inserted + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] internal _branch; + + // Counter of current deposits + uint256 public depositCount; + + /** + * @dev This empty reserved space is put in place to allow future versions to add new + * variables without shifting down storage in the inheritance chain. + */ + uint256[10] private _gap; + + /** + * @notice Computes and returns the merkle root + */ + function getRoot() public view returns (bytes32) { + bytes32 node; + uint256 size = depositCount; + bytes32 currentZeroHashHeight = 0; + + for ( + uint256 height = 0; + height < _DEPOSIT_CONTRACT_TREE_DEPTH; + height++ + ) { + if (((size >> height) & 1) == 1) + node = keccak256(abi.encodePacked(_branch[height], node)); + else + node = keccak256(abi.encodePacked(node, currentZeroHashHeight)); + + currentZeroHashHeight = keccak256( + abi.encodePacked(currentZeroHashHeight, currentZeroHashHeight) + ); + } + return node; + } + + /** + * @notice Add a new leaf to the merkle tree + * @param leaf Leaf + */ + function _addLeaf(bytes32 leaf) internal { + bytes32 node = leaf; + + // Avoid overflowing the Merkle tree (and prevent edge case in computing `_branch`) + if (depositCount >= _MAX_DEPOSIT_COUNT) { + revert MerkleTreeFull(); + } + + // Add deposit data root to Merkle tree (update a single `_branch` node) + uint256 size = ++depositCount; + for ( + uint256 height = 0; + height < _DEPOSIT_CONTRACT_TREE_DEPTH; + height++ + ) { + if (((size >> height) & 1) == 1) { + _branch[height] = node; + return; + } + node = keccak256(abi.encodePacked(_branch[height], node)); + } + // As the loop should always end prematurely with the `return` statement, + // this code should be unreachable. We assert `false` just to be safe. + assert(false); + } + + /** + * @notice Verify merkle proof + * @param leaf Leaf + * @param smtProof Smt proof + * @param index Index of the leaf + * @param root Merkle root + */ + function verifyMerkleProof( + bytes32 leaf, + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, + uint32 index, + bytes32 root + ) public pure returns (bool) { + bytes32 node = leaf; + + // Check merkle proof + for ( + uint256 height = 0; + height < _DEPOSIT_CONTRACT_TREE_DEPTH; + height++ + ) { + if (((index >> height) & 1) == 1) + node = keccak256(abi.encodePacked(smtProof[height], node)); + else node = keccak256(abi.encodePacked(node, smtProof[height])); + } + + return node == root; + } +} diff --git a/docs/v2/PolygonZkEVMGlobalExitRootV2.md b/docs/v2/PolygonZkEVMGlobalExitRootV2.md new file mode 100644 index 000000000..dd9e76c09 --- /dev/null +++ b/docs/v2/PolygonZkEVMGlobalExitRootV2.md @@ -0,0 +1,51 @@ +Contract responsible for managing the exit roots across multiple networks + + +## Functions +### constructor +```solidity + function constructor( + address _rollupAddress, + address _bridgeAddress + ) public +``` + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`_rollupAddress` | address | Rollup contract address +|`_bridgeAddress` | address | PolygonZkEVMBridge contract address + +### updateExitRoot +```solidity + function updateExitRoot( + bytes32 newRoot + ) external +``` +Update the exit root of one of the networks and the global exit root + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`newRoot` | bytes32 | new exit tree root + +### getLastGlobalExitRoot +```solidity + function getLastGlobalExitRoot( + ) public returns (bytes32) +``` +Return last global exit root + + + +## Events +### UpdateGlobalExitRoot +```solidity + event UpdateGlobalExitRoot( + ) +``` + +Emitted when the global exit root is updated + diff --git a/docs/v2/lib/DepositContractLib.md b/docs/v2/lib/DepositContractLib.md new file mode 100644 index 000000000..36b40f1e9 --- /dev/null +++ b/docs/v2/lib/DepositContractLib.md @@ -0,0 +1,48 @@ +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 leaf, + bytes32[32] smtProof, + uint32 index, + bytes32 root + ) public returns (bool) +``` +Verify merkle proof + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`leaf` | bytes32 | Leaf +|`smtProof` | bytes32[32] | Smt proof +|`index` | uint32 | Index of the leaf +|`root` | bytes32 | Merkle root + diff --git a/test/contracts/globalExitRootManagerV2.test.js b/test/contracts/globalExitRootManagerV2.test.js new file mode 100644 index 000000000..ef8f00337 --- /dev/null +++ b/test/contracts/globalExitRootManagerV2.test.js @@ -0,0 +1,110 @@ +const { expect } = require('chai'); +const { ethers } = require('hardhat'); + +function calculateGlobalExitRoot(mainnetExitRoot, rollupExitRoot) { + return ethers.utils.solidityKeccak256(['bytes32', 'bytes32'], [mainnetExitRoot, rollupExitRoot]); +} +const zero32bytes = '0x0000000000000000000000000000000000000000000000000000000000000000'; +const MerkleTreeBridge = require('@0xpolygonhermez/zkevm-commonjs').MTBridge; +const { + verifyMerkleProof, +} = require('@0xpolygonhermez/zkevm-commonjs').mtBridgeUtils; + +describe('Global Exit Root', () => { + let rollup; + let PolygonZkEVMBridge; + + let polygonZkEVMGlobalExitRoot; + beforeEach('Deploy contracts', async () => { + // load signers + [, rollup, PolygonZkEVMBridge] = await ethers.getSigners(); + + // deploy global exit root manager + const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory('PolygonZkEVMGlobalExitRootV2'); + + polygonZkEVMGlobalExitRoot = await PolygonZkEVMGlobalExitRootFactory.deploy( + rollup.address, + PolygonZkEVMBridge.address, + ); + await polygonZkEVMGlobalExitRoot.deployed(); + }); + + it('should check the constructor parameters', async () => { + expect(await polygonZkEVMGlobalExitRoot.rollupAddress()).to.be.equal(rollup.address); + expect(await polygonZkEVMGlobalExitRoot.bridgeAddress()).to.be.equal(PolygonZkEVMBridge.address); + expect(await polygonZkEVMGlobalExitRoot.lastRollupExitRoot()).to.be.equal(zero32bytes); + expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(zero32bytes); + expect(await polygonZkEVMGlobalExitRoot.depositCount()).to.be.equal(0); + }); + + it('should update root and check global exit root', async () => { + const newRootRollup = ethers.utils.hexlify(ethers.utils.randomBytes(32)); + const newRootGlobalExitRoot = calculateGlobalExitRoot(zero32bytes, newRootRollup); + + await expect(polygonZkEVMGlobalExitRoot.updateExitRoot(newRootRollup)) + .to.be.revertedWith('OnlyAllowedContracts'); + + // Update root from the rollup + await expect(polygonZkEVMGlobalExitRoot.connect(rollup).updateExitRoot(newRootRollup)) + .to.emit(polygonZkEVMGlobalExitRoot, 'UpdateGlobalExitRoot') + .withArgs(zero32bytes, newRootRollup); + + expect(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()) + .to.be.equal(newRootGlobalExitRoot); + + // compute root merkle tree in Js + const height = 32; + const merkleTree = new MerkleTreeBridge(height); + merkleTree.add(newRootGlobalExitRoot); + + const rootSC = await polygonZkEVMGlobalExitRoot.getRoot(); + const rootJS = merkleTree.getRoot(); + + expect(rootSC).to.be.equal(rootJS); + + // check merkle proof + const index = 0; + const proof = merkleTree.getProofTreeByIndex(index); + + // verify merkle proof + expect(verifyMerkleProof(newRootGlobalExitRoot, proof, index, rootSC)).to.be.equal(true); + + expect(await polygonZkEVMGlobalExitRoot.verifyMerkleProof( + newRootGlobalExitRoot, + proof, + index, + rootSC, + )).to.be.equal(true); + + // Update root from the PolygonZkEVMBridge + const newRootBridge = ethers.utils.hexlify(ethers.utils.randomBytes(32)); + await expect(polygonZkEVMGlobalExitRoot.connect(PolygonZkEVMBridge).updateExitRoot(newRootBridge)) + .to.emit(polygonZkEVMGlobalExitRoot, 'UpdateGlobalExitRoot') + .withArgs(newRootBridge, newRootRollup); + + expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(newRootBridge); + const newRootGlobalExitRoot2 = calculateGlobalExitRoot(newRootBridge, newRootRollup); + expect(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()) + .to.be.equal(newRootGlobalExitRoot2); + + // compute root merkle tree in Js + merkleTree.add(newRootGlobalExitRoot2); + const rootSC2 = await polygonZkEVMGlobalExitRoot.getRoot(); + const rootJS2 = merkleTree.getRoot(); + expect(rootSC2).to.be.equal(rootJS2); + + // check merkle proof + const index2 = 1; + const proof2 = merkleTree.getProofTreeByIndex(index2); + + // verify merkle proof + expect(verifyMerkleProof(newRootGlobalExitRoot2, proof2, index2, rootSC2)).to.be.equal(true); + + expect(await polygonZkEVMGlobalExitRoot.verifyMerkleProof( + newRootGlobalExitRoot2, + proof2, + index2, + rootSC2, + )).to.be.equal(true); + }); +}); From 174f39daed34f9e31879e7f675113ca5f1418d8a Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 5 Jul 2023 14:47:28 +0200 Subject: [PATCH 010/230] first approach --- compiled-contracts/PolygonZkEVM.json | 35 ++--- compiled-contracts/PolygonZkEVMBridge.json | 26 ++-- .../PolygonZkEVMBridgeMock.json | 26 ++-- .../PolygonZkEVMGlobalExitRoot.json | 65 +++++++++ .../PolygonZkEVMGlobalExitRootMock.json | 65 +++++++++ compiled-contracts/PolygonZkEVMMock.json | 35 ++--- contracts/PolygonZkEVM.sol | 135 +++++++++--------- contracts/PolygonZkEVMBridge.sol | 6 +- contracts/PolygonZkEVMGlobalExitRoot.sol | 21 ++- .../IPolygonZkEVMGlobalExitRoot.sol | 2 + contracts/lib/DepositContract.sol | 112 +-------------- contracts/{v2 => }/lib/DepositContractLib.sol | 10 +- contracts/mocks/DepositContractMock.sol | 2 +- contracts/v2/PolygonZkEVMGlobalExitRoot.sol | 95 ------------ 14 files changed, 289 insertions(+), 346 deletions(-) rename contracts/{v2 => }/lib/DepositContractLib.sol (95%) delete mode 100644 contracts/v2/PolygonZkEVMGlobalExitRoot.sol diff --git a/compiled-contracts/PolygonZkEVM.json b/compiled-contracts/PolygonZkEVM.json index 981bf9bf9..5066df667 100644 --- a/compiled-contracts/PolygonZkEVM.json +++ b/compiled-contracts/PolygonZkEVM.json @@ -848,6 +848,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "gapLastTimestamp", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "getForcedBatchFee", @@ -1096,19 +1109,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "lastTimestamp", - "outputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "lastVerifiedBatch", @@ -1351,14 +1351,9 @@ }, { "internalType": "bytes32", - "name": "globalExitRoot", + "name": "historicGlobalExitRoot", "type": "bytes32" }, - { - "internalType": "uint64", - "name": "timestamp", - "type": "uint64" - }, { "internalType": "uint64", "name": "minForcedTimestamp", @@ -1391,7 +1386,7 @@ }, { "internalType": "bytes32", - "name": "globalExitRoot", + "name": "historicGlobalExitRoot", "type": "bytes32" }, { diff --git a/compiled-contracts/PolygonZkEVMBridge.json b/compiled-contracts/PolygonZkEVMBridge.json index da2451474..65c0f7c51 100644 --- a/compiled-contracts/PolygonZkEVMBridge.json +++ b/compiled-contracts/PolygonZkEVMBridge.json @@ -459,19 +459,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "getDepositRoot", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -521,6 +508,19 @@ "stateMutability": "pure", "type": "function" }, + { + "inputs": [], + "name": "getRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { diff --git a/compiled-contracts/PolygonZkEVMBridgeMock.json b/compiled-contracts/PolygonZkEVMBridgeMock.json index 80c9d0f50..62001ffbc 100644 --- a/compiled-contracts/PolygonZkEVMBridgeMock.json +++ b/compiled-contracts/PolygonZkEVMBridgeMock.json @@ -478,19 +478,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "getDepositRoot", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -540,6 +527,19 @@ "stateMutability": "pure", "type": "function" }, + { + "inputs": [], + "name": "getRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { diff --git a/compiled-contracts/PolygonZkEVMGlobalExitRoot.json b/compiled-contracts/PolygonZkEVMGlobalExitRoot.json index a2d289423..e37ac6ba4 100644 --- a/compiled-contracts/PolygonZkEVMGlobalExitRoot.json +++ b/compiled-contracts/PolygonZkEVMGlobalExitRoot.json @@ -19,6 +19,11 @@ "stateMutability": "nonpayable", "type": "constructor" }, + { + "inputs": [], + "name": "MerkleTreeFull", + "type": "error" + }, { "inputs": [], "name": "OnlyAllowedContracts", @@ -56,6 +61,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "depositCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "getLastGlobalExitRoot", @@ -69,6 +87,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "getRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -139,6 +170,40 @@ "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": "0x60c060405234801561000f575f80fd5b506040516103e13803806103e183398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a0516103226100bf5f395f818160e301526101b601525f818161012f015261016d01526103225ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c806333d6247d1161005857806333d6247d146100c15780633ed691ef146100d65780635ec6a8df146100de578063a3c573eb1461012a575f80fd5b806301fd90441461007e578063257b363214610099578063319cf735146100b8575b5f80fd5b6100865f5481565b6040519081526020015b60405180910390f35b6100866100a73660046102d5565b60026020525f908152604090205481565b61008660015481565b6100d46100cf3660046102d5565b610151565b005b61008661029b565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610090565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361019f575060018290558161021a565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101e8575f83905582915061021a565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f8181526002602052604081205491925003610295575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6102d06001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f602082840312156102e5575f80fd5b503591905056fea26469706673582212205b8fae68ff3c2dfc257497be9184a2e772688dbece1343c3dc2e8c1923291be864736f6c63430008140033", diff --git a/compiled-contracts/PolygonZkEVMGlobalExitRootMock.json b/compiled-contracts/PolygonZkEVMGlobalExitRootMock.json index 6bde95a70..5c52bf65b 100644 --- a/compiled-contracts/PolygonZkEVMGlobalExitRootMock.json +++ b/compiled-contracts/PolygonZkEVMGlobalExitRootMock.json @@ -19,6 +19,11 @@ "stateMutability": "nonpayable", "type": "constructor" }, + { + "inputs": [], + "name": "MerkleTreeFull", + "type": "error" + }, { "inputs": [], "name": "OnlyAllowedContracts", @@ -56,6 +61,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "depositCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "getLastGlobalExitRoot", @@ -69,6 +87,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "getRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -170,6 +201,40 @@ "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": "0x60c060405234801561000f575f80fd5b5060405161047838038061047883398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a0516103b86100c05f395f818161013a015261022c01525f818161018601526101e301526103b85ff3fe608060405234801561000f575f80fd5b506004361061009f575f3560e01c806333d6247d116100725780635bcef673116100585780635bcef673146101165780635ec6a8df14610135578063a3c573eb14610181575f80fd5b806333d6247d146100fb5780633ed691ef1461010e575f80fd5b806301fd9044146100a3578063051a9e28146100be578063257b3632146100d3578063319cf735146100f2575b5f80fd5b6100ab5f5481565b6040519081526020015b60405180910390f35b6100d16100cc36600461034b565b6101a8565b005b6100ab6100e136600461034b565b60026020525f908152604090205481565b6100ab60015481565b6100d161010936600461034b565b6101c7565b6100ab610311565b6100d1610124366004610362565b5f9182526002602052604090912055565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b8060025f6101b4610311565b815260208101919091526040015f205550565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102155750600182905581610290565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361025e575f839055829150610290565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f818152600260205260408120549192500361030b575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6103466001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f6020828403121561035b575f80fd5b5035919050565b5f8060408385031215610373575f80fd5b5050803592602090910135915056fea26469706673582212200799b5f60aa8eaf6d49205025cc41bfba78ce4f6ad614164e5da3c0bdc94810464736f6c63430008140033", diff --git a/compiled-contracts/PolygonZkEVMMock.json b/compiled-contracts/PolygonZkEVMMock.json index e122b9b6b..2e1a64ff4 100644 --- a/compiled-contracts/PolygonZkEVMMock.json +++ b/compiled-contracts/PolygonZkEVMMock.json @@ -887,6 +887,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "gapLastTimestamp", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "getForcedBatchFee", @@ -1174,19 +1187,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "lastTimestamp", - "outputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "lastVerifiedBatch", @@ -1429,14 +1429,9 @@ }, { "internalType": "bytes32", - "name": "globalExitRoot", + "name": "historicGlobalExitRoot", "type": "bytes32" }, - { - "internalType": "uint64", - "name": "timestamp", - "type": "uint64" - }, { "internalType": "uint64", "name": "minForcedTimestamp", @@ -1469,7 +1464,7 @@ }, { "internalType": "bytes32", - "name": "globalExitRoot", + "name": "historicGlobalExitRoot", "type": "bytes32" }, { diff --git a/contracts/PolygonZkEVM.sol b/contracts/PolygonZkEVM.sol index 4bc4a1826..920f89300 100644 --- a/contracts/PolygonZkEVM.sol +++ b/contracts/PolygonZkEVM.sol @@ -35,8 +35,7 @@ contract PolygonZkEVM is */ struct BatchData { bytes transactions; - bytes32 globalExitRoot; - uint64 timestamp; + bytes32 historicGlobalExitRoot; uint64 minForcedTimestamp; } @@ -45,12 +44,12 @@ contract PolygonZkEVM is * @param transactions L2 ethereum transactions EIP-155 or pre-EIP-155 with signature: * EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data, chainid, 0, 0,) || v || r || s * pre-EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data) || v || r || s - * @param globalExitRoot Global exit root of the batch + * @param historicGlobalExitRoot Historic global exit root of the batch * @param minForcedTimestamp Indicates the minimum sequenced timestamp of the batch */ struct ForcedBatchData { bytes transactions; - bytes32 globalExitRoot; + bytes32 historicGlobalExitRoot; uint64 minForcedTimestamp; } @@ -144,6 +143,12 @@ contract PolygonZkEVM is // Max uint64 uint256 internal constant _MAX_UINT_64 = type(uint64).max; // 0xFFFFFFFFFFFFFFFF + // Boolena indicating that is a forced batch + bool internal constant _IS_FORCED_BATCH = true; + + // Boolena indicating that is not a forced batch + bool internal constant _IS_NOT_FORCED_BATCH = false; + // MATIC token address IERC20Upgradeable public immutable matic; @@ -186,7 +191,7 @@ contract PolygonZkEVM is mapping(uint64 => SequencedBatchData) public sequencedBatches; // Last sequenced timestamp - uint64 public lastTimestamp; + uint64 public gapLastTimestamp; // Last batch sent by the sequencers uint64 public lastBatchSequenced; @@ -491,11 +496,18 @@ contract PolygonZkEVM is } if (batchesNum > _MAX_VERIFY_BATCHES) { + // TODO remove? revert ExceedMaxVerifyBatches(); } + // Update global exit root if there are new deposits + bridgeAddress.updateGlobalExitRoot(); + + // Get global batch variables + bytes32 historicGlobalExitRoot = globalExitRootManager.getRoot(); + uint64 currentTimestamp = uint64(block.timestamp); + // Store storage variables in memory, to save gas, because will be overrided multiple times - uint64 currentTimestamp = lastTimestamp; uint64 currentBatchSequenced = lastBatchSequenced; uint64 currentLastForceBatchSequenced = lastForceBatchSequenced; bytes32 currentAccInputHash = sequencedBatches[currentBatchSequenced] @@ -521,7 +533,7 @@ contract PolygonZkEVM is bytes32 hashedForcedBatchData = keccak256( abi.encodePacked( currentTransactionsHash, - currentBatch.globalExitRoot, + currentBatch.historicGlobalExitRoot, currentBatch.minForcedTimestamp ) ); @@ -533,55 +545,41 @@ contract PolygonZkEVM is revert ForcedDataDoesNotMatch(); } + // Calculate next accumulated input hash + currentAccInputHash = keccak256( + abi.encodePacked( + currentAccInputHash, + currentTransactionsHash, + currentBatch.historicGlobalExitRoot, + currentBatch.minForcedTimestamp, + l2Coinbase, + _IS_FORCED_BATCH + ) + ); + // Delete forceBatch data since won't be used anymore delete forcedBatches[currentLastForceBatchSequenced]; - - // Check timestamp is bigger than min timestamp - if (currentBatch.timestamp < currentBatch.minForcedTimestamp) { - revert SequencedTimestampBelowForcedTimestamp(); - } } else { - // Check global exit root exists with proper batch length. These checks are already done in the forceBatches call - // Note that the sequencer can skip setting a global exit root putting zeros - if ( - currentBatch.globalExitRoot != bytes32(0) && - globalExitRootManager.globalExitRootMap( - currentBatch.globalExitRoot - ) == - 0 - ) { - revert GlobalExitRootNotExist(); - } - + // These checks are already done in the forceBatches call if ( currentBatch.transactions.length > _MAX_TRANSACTIONS_BYTE_LENGTH ) { revert TransactionsLengthAboveMax(); } - } - // Check Batch timestamps are correct - if ( - currentBatch.timestamp < currentTimestamp || - currentBatch.timestamp > block.timestamp - ) { - revert SequencedTimestampInvalid(); + // Calculate next accumulated input hash + currentAccInputHash = keccak256( + abi.encodePacked( + currentAccInputHash, + currentTransactionsHash, + historicGlobalExitRoot, + currentTimestamp, + l2Coinbase, + _IS_NOT_FORCED_BATCH + ) + ); } - - // Calculate next accumulated input hash - currentAccInputHash = keccak256( - abi.encodePacked( - currentAccInputHash, - currentTransactionsHash, - currentBatch.globalExitRoot, - currentBatch.timestamp, - l2Coinbase - ) - ); - - // Update timestamp - currentTimestamp = currentBatch.timestamp; } // Update currentBatchSequenced currentBatchSequenced += uint64(batchesNum); @@ -591,9 +589,6 @@ contract PolygonZkEVM is revert ForceBatchesOverflow(); } - uint256 nonForcedBatchesSequenced = batchesNum - - (currentLastForceBatchSequenced - initLastForceBatchSequenced); - // Update sequencedBatches mapping sequencedBatches[currentBatchSequenced] = SequencedBatchData({ accInputHash: currentAccInputHash, @@ -602,11 +597,20 @@ contract PolygonZkEVM is }); // Store back the storage variables - lastTimestamp = currentTimestamp; lastBatchSequenced = currentBatchSequenced; - if (currentLastForceBatchSequenced != initLastForceBatchSequenced) + uint256 nonForcedBatchesSequenced = batchesNum; + + // Check if there has been forced batches + if (currentLastForceBatchSequenced != initLastForceBatchSequenced) { + // substract forced batches + nonForcedBatchesSequenced -= + currentLastForceBatchSequenced - + initLastForceBatchSequenced; + + // Store new last force batch sequenced lastForceBatchSequenced = currentLastForceBatchSequenced; + } // Pay collateral for every non-forced batch submitted matic.safeTransferFrom( @@ -618,9 +622,6 @@ contract PolygonZkEVM is // Consolidate pending state if possible _tryConsolidatePendingState(); - // Update global exit root if there are new deposits - bridgeAddress.updateGlobalExitRoot(); - emit SequenceBatches(currentBatchSequenced); } @@ -1032,9 +1033,8 @@ contract PolygonZkEVM is matic.safeTransferFrom(msg.sender, address(this), maticFee); - // Get globalExitRoot global exit root - bytes32 lastGlobalExitRoot = globalExitRootManager - .getLastGlobalExitRoot(); + // Get historic global exit root + bytes32 historicGlobalExitRoot = globalExitRootManager.getRoot(); // Update forcedBatches mapping lastForceBatch++; @@ -1042,20 +1042,25 @@ contract PolygonZkEVM is forcedBatches[lastForceBatch] = keccak256( abi.encodePacked( keccak256(transactions), - lastGlobalExitRoot, + historicGlobalExitRoot, uint64(block.timestamp) ) ); if (msg.sender == tx.origin) { // Getting the calldata from an EOA is easy so no need to put the `transactions` in the event - emit ForceBatch(lastForceBatch, lastGlobalExitRoot, msg.sender, ""); + emit ForceBatch( + lastForceBatch, + historicGlobalExitRoot, + msg.sender, + "" + ); } else { // Getting internal transaction calldata is complicated (because it requires an archive node) // Therefore it's worth it to put the `transactions` in the event, which is easy to query emit ForceBatch( lastForceBatch, - lastGlobalExitRoot, + historicGlobalExitRoot, msg.sender, transactions ); @@ -1107,7 +1112,7 @@ contract PolygonZkEVM is bytes32 hashedForcedBatchData = keccak256( abi.encodePacked( currentTransactionsHash, - currentBatch.globalExitRoot, + currentBatch.historicGlobalExitRoot, currentBatch.minForcedTimestamp ) ); @@ -1131,22 +1136,22 @@ contract PolygonZkEVM is revert ForceBatchTimeoutNotExpired(); } } + // Calculate next acc input hash currentAccInputHash = keccak256( abi.encodePacked( currentAccInputHash, currentTransactionsHash, - currentBatch.globalExitRoot, - uint64(block.timestamp), - msg.sender + currentBatch.historicGlobalExitRoot, + currentBatch.minForcedTimestamp, // could be current timestamp + msg.sender, + _IS_FORCED_BATCH ) ); } // Update currentBatchSequenced currentBatchSequenced += uint64(batchesNum); - lastTimestamp = uint64(block.timestamp); - // Store back the storage variables sequencedBatches[currentBatchSequenced] = SequencedBatchData({ accInputHash: currentAccInputHash, diff --git a/contracts/PolygonZkEVMBridge.sol b/contracts/PolygonZkEVMBridge.sol index 08488d488..f34639e09 100644 --- a/contracts/PolygonZkEVMBridge.sol +++ b/contracts/PolygonZkEVMBridge.sol @@ -228,7 +228,7 @@ contract PolygonZkEVMBridge is uint32(depositCount) ); - _deposit( + _addLeaf( getLeafValue( _LEAF_TYPE_ASSET, originNetwork, @@ -277,7 +277,7 @@ contract PolygonZkEVMBridge is uint32(depositCount) ); - _deposit( + _addLeaf( getLeafValue( _LEAF_TYPE_MESSAGE, networkID, @@ -657,7 +657,7 @@ contract PolygonZkEVMBridge is */ function _updateGlobalExitRoot() internal { lastUpdatedDepositCount = uint32(depositCount); - globalExitRootManager.updateExitRoot(getDepositRoot()); + globalExitRootManager.updateExitRoot(getRoot()); } /** diff --git a/contracts/PolygonZkEVMGlobalExitRoot.sol b/contracts/PolygonZkEVMGlobalExitRoot.sol index af9e89498..db2d0c633 100644 --- a/contracts/PolygonZkEVMGlobalExitRoot.sol +++ b/contracts/PolygonZkEVMGlobalExitRoot.sol @@ -4,11 +4,15 @@ pragma solidity 0.8.20; import "./interfaces/IPolygonZkEVMGlobalExitRoot.sol"; import "./lib/GlobalExitRootLib.sol"; +import "./lib/DepositContractLib.sol"; /** * Contract responsible for managing the exit roots across multiple networks */ -contract PolygonZkEVMGlobalExitRoot is IPolygonZkEVMGlobalExitRoot { +contract PolygonZkEVMGlobalExitRoot is + IPolygonZkEVMGlobalExitRoot, + DepositContractLib +{ // PolygonZkEVMBridge address address public immutable bridgeAddress; @@ -72,6 +76,9 @@ contract PolygonZkEVMGlobalExitRoot is IPolygonZkEVMGlobalExitRoot { cacheLastMainnetExitRoot, cacheLastRollupExitRoot ); + + // Update the historical roots + _addLeaf(newGlobalExitRoot); } } @@ -85,4 +92,16 @@ contract PolygonZkEVMGlobalExitRoot is IPolygonZkEVMGlobalExitRoot { lastRollupExitRoot ); } + + /** + * @notice Computes and returns the merkle root + */ + function getRoot() + public + view + override(DepositContractLib, IPolygonZkEVMGlobalExitRoot) + returns (bytes32) + { + return super.getRoot(); + } } diff --git a/contracts/interfaces/IPolygonZkEVMGlobalExitRoot.sol b/contracts/interfaces/IPolygonZkEVMGlobalExitRoot.sol index 68c3d2495..1f2eddecd 100644 --- a/contracts/interfaces/IPolygonZkEVMGlobalExitRoot.sol +++ b/contracts/interfaces/IPolygonZkEVMGlobalExitRoot.sol @@ -5,4 +5,6 @@ import "./IBasePolygonZkEVMGlobalExitRoot.sol"; interface IPolygonZkEVMGlobalExitRoot is IBasePolygonZkEVMGlobalExitRoot { function getLastGlobalExitRoot() external view returns (bytes32); + + function getRoot() external view returns (bytes32); } diff --git a/contracts/lib/DepositContract.sol b/contracts/lib/DepositContract.sol index 24bc34ab2..a269f79a2 100644 --- a/contracts/lib/DepositContract.sol +++ b/contracts/lib/DepositContract.sol @@ -2,121 +2,13 @@ pragma solidity 0.8.20; import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; +import "./DepositContractLib.sol"; /** * 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 */ -contract DepositContract is ReentrancyGuardUpgradeable { - /** - * @dev Thrown when the merkle tree is full - */ - error MerkleTreeFull(); - - // Merkle tree levels - uint256 internal constant _DEPOSIT_CONTRACT_TREE_DEPTH = 32; - - // This ensures `depositCount` will fit into 32-bits - uint256 internal constant _MAX_DEPOSIT_COUNT = - 2 ** _DEPOSIT_CONTRACT_TREE_DEPTH - 1; - - // Branch array which contains the necessary sibilings to compute the next root when a new - // leaf is inserted - bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] internal _branch; - - // Counter of current deposits - uint256 public depositCount; - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - */ - uint256[10] private _gap; - - /** - * @notice Computes and returns the merkle root - */ - function getDepositRoot() public view returns (bytes32) { - bytes32 node; - uint256 size = depositCount; - bytes32 currentZeroHashHeight = 0; - - for ( - uint256 height = 0; - height < _DEPOSIT_CONTRACT_TREE_DEPTH; - height++ - ) { - if (((size >> height) & 1) == 1) - node = keccak256(abi.encodePacked(_branch[height], node)); - else - node = keccak256(abi.encodePacked(node, currentZeroHashHeight)); - - currentZeroHashHeight = keccak256( - abi.encodePacked(currentZeroHashHeight, currentZeroHashHeight) - ); - } - return node; - } - - /** - * @notice Add a new leaf to the merkle tree - * @param leafHash Leaf hash - */ - function _deposit(bytes32 leafHash) internal { - bytes32 node = leafHash; - - // Avoid overflowing the Merkle tree (and prevent edge case in computing `_branch`) - if (depositCount >= _MAX_DEPOSIT_COUNT) { - revert MerkleTreeFull(); - } - - // Add deposit data root to Merkle tree (update a single `_branch` node) - uint256 size = ++depositCount; - for ( - uint256 height = 0; - height < _DEPOSIT_CONTRACT_TREE_DEPTH; - height++ - ) { - if (((size >> height) & 1) == 1) { - _branch[height] = node; - return; - } - node = keccak256(abi.encodePacked(_branch[height], node)); - } - // As the loop should always end prematurely with the `return` statement, - // this code should be unreachable. We assert `false` just to be safe. - assert(false); - } - - /** - * @notice Verify merkle proof - * @param leafHash Leaf hash - * @param smtProof Smt proof - * @param index Index of the leaf - * @param root Merkle root - */ - function verifyMerkleProof( - bytes32 leafHash, - bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, - uint32 index, - bytes32 root - ) public pure returns (bool) { - bytes32 node = leafHash; - - // Check merkle proof - for ( - uint256 height = 0; - height < _DEPOSIT_CONTRACT_TREE_DEPTH; - height++ - ) { - if (((index >> height) & 1) == 1) - node = keccak256(abi.encodePacked(smtProof[height], node)); - else node = keccak256(abi.encodePacked(node, smtProof[height])); - } - - return node == root; - } - +contract DepositContract is ReentrancyGuardUpgradeable, DepositContractLib { /** * @notice Given the leaf data returns the leaf value * @param leafType Leaf type --> [0] transfer Ether / ERC20 tokens, [1] message diff --git a/contracts/v2/lib/DepositContractLib.sol b/contracts/lib/DepositContractLib.sol similarity index 95% rename from contracts/v2/lib/DepositContractLib.sol rename to contracts/lib/DepositContractLib.sol index 466c2d0c2..27fdf45f8 100644 --- a/contracts/v2/lib/DepositContractLib.sol +++ b/contracts/lib/DepositContractLib.sol @@ -12,7 +12,7 @@ contract DepositContractLib { error MerkleTreeFull(); // Merkle tree levels - uint256 internal constant _DEPOSIT_CONTRACT_TREE_DEPTH = 32; // TODO + uint256 internal constant _DEPOSIT_CONTRACT_TREE_DEPTH = 32; // This ensures `depositCount` will fit into 32-bits uint256 internal constant _MAX_DEPOSIT_COUNT = @@ -34,7 +34,7 @@ contract DepositContractLib { /** * @notice Computes and returns the merkle root */ - function getRoot() public view returns (bytes32) { + function getRoot() public view virtual returns (bytes32) { bytes32 node; uint256 size = depositCount; bytes32 currentZeroHashHeight = 0; @@ -88,18 +88,18 @@ contract DepositContractLib { /** * @notice Verify merkle proof - * @param leaf Leaf + * @param leafHash Leaf hash * @param smtProof Smt proof * @param index Index of the leaf * @param root Merkle root */ function verifyMerkleProof( - bytes32 leaf, + bytes32 leafHash, bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, uint32 index, bytes32 root ) public pure returns (bool) { - bytes32 node = leaf; + bytes32 node = leafHash; // Check merkle proof for ( diff --git a/contracts/mocks/DepositContractMock.sol b/contracts/mocks/DepositContractMock.sol index ff2ebfad2..f96f4a18c 100644 --- a/contracts/mocks/DepositContractMock.sol +++ b/contracts/mocks/DepositContractMock.sol @@ -33,7 +33,7 @@ contract DepositContractMock is DepositContract { uint256 amount, bytes32 metadataHash ) public { - _deposit( + _addLeaf( getLeafValue( leafType, originNetwork, diff --git a/contracts/v2/PolygonZkEVMGlobalExitRoot.sol b/contracts/v2/PolygonZkEVMGlobalExitRoot.sol deleted file mode 100644 index 08f2de152..000000000 --- a/contracts/v2/PolygonZkEVMGlobalExitRoot.sol +++ /dev/null @@ -1,95 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 - -pragma solidity 0.8.17; - -import "../interfaces/IPolygonZkEVMGlobalExitRoot.sol"; -import "../lib/GlobalExitRootLib.sol"; -import "./lib/DepositContractLib.sol"; - -/** - * Contract responsible for managing the exit roots across multiple networks - */ -contract PolygonZkEVMGlobalExitRootV2 is - IPolygonZkEVMGlobalExitRoot, - DepositContractLib -{ - // PolygonZkEVMBridge address - address public immutable bridgeAddress; - - // Rollup contract address - address public immutable rollupAddress; - - // Rollup exit root, this will be updated every time a batch is verified - bytes32 public lastRollupExitRoot; - - // Mainnet exit root, this will be updated every time a deposit is made in mainnet - bytes32 public lastMainnetExitRoot; - - // Store every global exit root: Root --> timestamp - mapping(bytes32 => uint256) public globalExitRootMap; - - /** - * @dev Emitted when the global exit root is updated - */ - event UpdateGlobalExitRoot( - bytes32 indexed mainnetExitRoot, - bytes32 indexed rollupExitRoot - ); - - /** - * @param _rollupAddress Rollup contract address - * @param _bridgeAddress PolygonZkEVMBridge contract address - */ - constructor(address _rollupAddress, address _bridgeAddress) { - rollupAddress = _rollupAddress; - bridgeAddress = _bridgeAddress; - } - - /** - * @notice Update the exit root of one of the networks and the global exit root - * @param newRoot new exit tree root - */ - function updateExitRoot(bytes32 newRoot) external { - // Store storage variables into temporal variables since will be used multiple times - bytes32 cacheLastRollupExitRoot = lastRollupExitRoot; - bytes32 cacheLastMainnetExitRoot = lastMainnetExitRoot; - - if (msg.sender == bridgeAddress) { - lastMainnetExitRoot = newRoot; - cacheLastMainnetExitRoot = newRoot; - } else if (msg.sender == rollupAddress) { - lastRollupExitRoot = newRoot; - cacheLastRollupExitRoot = newRoot; - } else { - revert OnlyAllowedContracts(); - } - - bytes32 newGlobalExitRoot = GlobalExitRootLib.calculateGlobalExitRoot( - cacheLastMainnetExitRoot, - cacheLastRollupExitRoot - ); - - // If it already exists, do not modify the timestamp - if (globalExitRootMap[newGlobalExitRoot] == 0) { - globalExitRootMap[newGlobalExitRoot] = block.timestamp; - emit UpdateGlobalExitRoot( - cacheLastMainnetExitRoot, - cacheLastRollupExitRoot - ); - - // Update the historical roots - _addLeaf(newGlobalExitRoot); - } - } - - /** - * @notice Return last global exit root - */ - function getLastGlobalExitRoot() public view returns (bytes32) { - return - GlobalExitRootLib.calculateGlobalExitRoot( - lastMainnetExitRoot, - lastRollupExitRoot - ); - } -} From 22014dd3048aea40134d137d8cd7e942db7bf400 Mon Sep 17 00:00:00 2001 From: laisolizq Date: Thu, 6 Jul 2023 23:02:52 +0200 Subject: [PATCH 011/230] update tests and fixes --- compiled-contracts/PolygonZkEVM.json | 6 +- compiled-contracts/PolygonZkEVMMock.json | 11 +- contracts/PolygonZkEVM.sol | 31 +-- contracts/mocks/PolygonZkEVMMock.sol | 6 +- docs/PolygonZkEVM.md | 4 +- docs/PolygonZkEVMGlobalExitRoot.md | 9 + docs/lib/DepositContract.md | 43 ---- docs/lib/DepositContractLib.md | 48 ++++ test/contracts/bridge.test.js | 10 +- test/contracts/bridgeMock.test.js | 2 +- test/contracts/bridge_metadata.test.js | 6 +- test/contracts/bridge_permit.test.js | 6 +- test/contracts/depositContractMock.test.js | 12 +- test/contracts/emergencyManager.test.js | 4 +- test/contracts/globalExitRootManager.test.js | 55 ++++- .../contracts/globalExitRootManagerV2.test.js | 110 --------- test/contracts/polygonZkEVM.test.js | 218 +++++------------- ...-flow.test.js => real-flow.test.js-ignore} | 0 test/contracts/snark_stark_input.test.js | 4 +- 19 files changed, 215 insertions(+), 370 deletions(-) create mode 100644 docs/lib/DepositContractLib.md delete mode 100644 test/contracts/globalExitRootManagerV2.test.js rename test/contracts/real-prover/{real-flow.test.js => real-flow.test.js-ignore} (100%) diff --git a/compiled-contracts/PolygonZkEVM.json b/compiled-contracts/PolygonZkEVM.json index 5066df667..3d7b77fa1 100644 --- a/compiled-contracts/PolygonZkEVM.json +++ b/compiled-contracts/PolygonZkEVM.json @@ -1351,7 +1351,7 @@ }, { "internalType": "bytes32", - "name": "historicGlobalExitRoot", + "name": "forcedHistoricGlobalExitRoot", "type": "bytes32" }, { @@ -1386,7 +1386,7 @@ }, { "internalType": "bytes32", - "name": "historicGlobalExitRoot", + "name": "forcedHistoricGlobalExitRoot", "type": "bytes32" }, { @@ -1395,7 +1395,7 @@ "type": "uint64" } ], - "internalType": "struct PolygonZkEVM.ForcedBatchData[]", + "internalType": "struct PolygonZkEVM.BatchData[]", "name": "batches", "type": "tuple[]" } diff --git a/compiled-contracts/PolygonZkEVMMock.json b/compiled-contracts/PolygonZkEVMMock.json index 2e1a64ff4..a688a363f 100644 --- a/compiled-contracts/PolygonZkEVMMock.json +++ b/compiled-contracts/PolygonZkEVMMock.json @@ -746,6 +746,11 @@ "internalType": "address", "name": "sequencerAddress", "type": "address" + }, + { + "internalType": "bool", + "name": "isForced", + "type": "bool" } ], "name": "calculateAccInputHash", @@ -1429,7 +1434,7 @@ }, { "internalType": "bytes32", - "name": "historicGlobalExitRoot", + "name": "forcedHistoricGlobalExitRoot", "type": "bytes32" }, { @@ -1464,7 +1469,7 @@ }, { "internalType": "bytes32", - "name": "historicGlobalExitRoot", + "name": "forcedHistoricGlobalExitRoot", "type": "bytes32" }, { @@ -1473,7 +1478,7 @@ "type": "uint64" } ], - "internalType": "struct PolygonZkEVM.ForcedBatchData[]", + "internalType": "struct PolygonZkEVM.BatchData[]", "name": "batches", "type": "tuple[]" } diff --git a/contracts/PolygonZkEVM.sol b/contracts/PolygonZkEVM.sol index 920f89300..8a1ebff18 100644 --- a/contracts/PolygonZkEVM.sol +++ b/contracts/PolygonZkEVM.sol @@ -29,27 +29,12 @@ contract PolygonZkEVM is * @param transactions L2 ethereum transactions EIP-155 or pre-EIP-155 with signature: * EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data, chainid, 0, 0,) || v || r || s * pre-EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data) || v || r || s - * @param globalExitRoot Global exit root of the batch - * @param timestamp Sequenced timestamp of the batch + * @param forcedHistoricGlobalExitRoot Global exit root of the batch * @param minForcedTimestamp Minimum timestamp of the force batch data, empty when non forced batch */ struct BatchData { bytes transactions; - bytes32 historicGlobalExitRoot; - uint64 minForcedTimestamp; - } - - /** - * @notice Struct which will be used to call sequenceForceBatches - * @param transactions L2 ethereum transactions EIP-155 or pre-EIP-155 with signature: - * EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data, chainid, 0, 0,) || v || r || s - * pre-EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data) || v || r || s - * @param historicGlobalExitRoot Historic global exit root of the batch - * @param minForcedTimestamp Indicates the minimum sequenced timestamp of the batch - */ - struct ForcedBatchData { - bytes transactions; - bytes32 historicGlobalExitRoot; + bytes32 forcedHistoricGlobalExitRoot; uint64 minForcedTimestamp; } @@ -533,7 +518,7 @@ contract PolygonZkEVM is bytes32 hashedForcedBatchData = keccak256( abi.encodePacked( currentTransactionsHash, - currentBatch.historicGlobalExitRoot, + currentBatch.forcedHistoricGlobalExitRoot, currentBatch.minForcedTimestamp ) ); @@ -550,7 +535,7 @@ contract PolygonZkEVM is abi.encodePacked( currentAccInputHash, currentTransactionsHash, - currentBatch.historicGlobalExitRoot, + currentBatch.forcedHistoricGlobalExitRoot, currentBatch.minForcedTimestamp, l2Coinbase, _IS_FORCED_BATCH @@ -1072,7 +1057,7 @@ contract PolygonZkEVM is * @param batches Struct array which holds the necessary data to append force batches */ function sequenceForceBatches( - ForcedBatchData[] calldata batches + BatchData[] calldata batches ) external isForceBatchAllowed ifNotEmergencyState { uint256 batchesNum = batches.length; @@ -1100,7 +1085,7 @@ contract PolygonZkEVM is // Sequence force batches for (uint256 i = 0; i < batchesNum; i++) { // Load current sequence - ForcedBatchData memory currentBatch = batches[i]; + BatchData memory currentBatch = batches[i]; currentLastForceBatchSequenced++; // Store the current transactions hash since it's used more than once for gas saving @@ -1112,7 +1097,7 @@ contract PolygonZkEVM is bytes32 hashedForcedBatchData = keccak256( abi.encodePacked( currentTransactionsHash, - currentBatch.historicGlobalExitRoot, + currentBatch.forcedHistoricGlobalExitRoot, currentBatch.minForcedTimestamp ) ); @@ -1142,7 +1127,7 @@ contract PolygonZkEVM is abi.encodePacked( currentAccInputHash, currentTransactionsHash, - currentBatch.historicGlobalExitRoot, + currentBatch.forcedHistoricGlobalExitRoot, currentBatch.minForcedTimestamp, // could be current timestamp msg.sender, _IS_FORCED_BATCH diff --git a/contracts/mocks/PolygonZkEVMMock.sol b/contracts/mocks/PolygonZkEVMMock.sol index 23282e96c..23721b8b9 100644 --- a/contracts/mocks/PolygonZkEVMMock.sol +++ b/contracts/mocks/PolygonZkEVMMock.sol @@ -48,7 +48,8 @@ contract PolygonZkEVMMock is PolygonZkEVM { bytes memory transactions, bytes32 globalExitRoot, uint64 timestamp, - address sequencerAddress + address sequencerAddress, + bool isForced ) public pure returns (bytes32) { return keccak256( @@ -57,7 +58,8 @@ contract PolygonZkEVMMock is PolygonZkEVM { keccak256(transactions), globalExitRoot, timestamp, - sequencerAddress + sequencerAddress, + isForced ) ); } diff --git a/docs/PolygonZkEVM.md b/docs/PolygonZkEVM.md index 748e23b83..6a41864a1 100644 --- a/docs/PolygonZkEVM.md +++ b/docs/PolygonZkEVM.md @@ -214,7 +214,7 @@ with the same nonce ### sequenceForceBatches ```solidity function sequenceForceBatches( - struct PolygonZkEVM.ForcedBatchData[] batches + struct PolygonZkEVM.BatchData[] 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.ForcedBatchData[] | Struct array which holds the necessary data to append force batches +|`batches` | struct PolygonZkEVM.BatchData[] | Struct array which holds the necessary data to append force batches ### setTrustedSequencer ```solidity diff --git a/docs/PolygonZkEVMGlobalExitRoot.md b/docs/PolygonZkEVMGlobalExitRoot.md index dd9e76c09..4156d1be2 100644 --- a/docs/PolygonZkEVMGlobalExitRoot.md +++ b/docs/PolygonZkEVMGlobalExitRoot.md @@ -40,6 +40,15 @@ 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 09007366e..9b73756b0 100644 --- a/docs/lib/DepositContract.md +++ b/docs/lib/DepositContract.md @@ -3,49 +3,6 @@ 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/lib/DepositContractLib.md b/docs/lib/DepositContractLib.md new file mode 100644 index 000000000..b25396ffb --- /dev/null +++ b/docs/lib/DepositContractLib.md @@ -0,0 +1,48 @@ +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 + diff --git a/test/contracts/bridge.test.js b/test/contracts/bridge.test.js index a2bbc84a4..3b227e99a 100644 --- a/test/contracts/bridge.test.js +++ b/test/contracts/bridge.test.js @@ -134,7 +134,7 @@ describe('PolygonZkEVMBridge Contract', () => { expect(await polygonZkEVMBridgeContract.lastUpdatedDepositCount()).to.be.equal(1); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); + const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); expect(rootSCMainnet).to.be.equal(rootJSMainnet); // check merkle proof @@ -195,7 +195,7 @@ describe('PolygonZkEVMBridge Contract', () => { ); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); + const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); expect(rootSCMainnet).to.be.equal(rootJSMainnet); // check merkle proof @@ -261,7 +261,7 @@ describe('PolygonZkEVMBridge Contract', () => { expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(ethers.constants.HashZero); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); + const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); expect(rootSCMainnet).to.be.equal(rootJSMainnet); // Update global exit root @@ -667,7 +667,7 @@ describe('PolygonZkEVMBridge Contract', () => { expect(await newWrappedToken.balanceOf(polygonZkEVMBridgeContract.address)).to.be.equal(0); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); + const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); expect(rootSCMainnet).to.be.equal(rootJSMainnet); // check merkle proof @@ -798,7 +798,7 @@ describe('PolygonZkEVMBridge Contract', () => { }); // Check merkle root with SC - const rootSC = await polygonZkEVMBridgeContract.getDepositRoot(); + const rootSC = await polygonZkEVMBridgeContract.getRoot(); const rootJS = merkleTree.getRoot(); expect(rootSC).to.be.equal(rootJS); diff --git a/test/contracts/bridgeMock.test.js b/test/contracts/bridgeMock.test.js index aa1cbb1dd..0b4a53981 100644 --- a/test/contracts/bridgeMock.test.js +++ b/test/contracts/bridgeMock.test.js @@ -110,7 +110,7 @@ describe('PolygonZkEVMBridge Mock Contract', () => { expect(await tokenContract.balanceOf(polygonZkEVMBridgeContract.address)).to.be.equal(balanceBridge.add(amount)); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); + const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); expect(rootSCMainnet).to.be.equal(rootJSMainnet); // check merkle proof diff --git a/test/contracts/bridge_metadata.test.js b/test/contracts/bridge_metadata.test.js index f6c8b34df..c637c75ec 100644 --- a/test/contracts/bridge_metadata.test.js +++ b/test/contracts/bridge_metadata.test.js @@ -104,7 +104,7 @@ describe('PolygonZkEVMBridge Contract werid metadata', () => { .to.emit(polygonZkEVMBridgeContract, 'BridgeEvent') .withArgs(LEAF_TYPE_ASSET, originNetwork, tokenAddress, destinationNetwork, destinationAddress, amount, metadata, depositCount); - expect(await polygonZkEVMBridgeContract.getDepositRoot()).to.be.equal(rootJSMainnet); + expect(await polygonZkEVMBridgeContract.getRoot()).to.be.equal(rootJSMainnet); }); it('should PolygonZkEVMBridge with weird token metadata with reverts', async () => { @@ -170,7 +170,7 @@ describe('PolygonZkEVMBridge Contract werid metadata', () => { .to.emit(polygonZkEVMBridgeContract, 'BridgeEvent') .withArgs(LEAF_TYPE_ASSET, originNetwork, tokenAddress, destinationNetwork, destinationAddress, amount, metadata, depositCount); - expect(await polygonZkEVMBridgeContract.getDepositRoot()).to.be.equal(rootJSMainnet); + expect(await polygonZkEVMBridgeContract.getRoot()).to.be.equal(rootJSMainnet); }); it('should PolygonZkEVMBridge with weird token metadata with empty data', async () => { @@ -231,6 +231,6 @@ describe('PolygonZkEVMBridge Contract werid metadata', () => { .to.emit(polygonZkEVMBridgeContract, 'BridgeEvent') .withArgs(LEAF_TYPE_ASSET, originNetwork, tokenAddress, destinationNetwork, destinationAddress, amount, metadata, depositCount); - expect(await polygonZkEVMBridgeContract.getDepositRoot()).to.be.equal(rootJSMainnet); + expect(await polygonZkEVMBridgeContract.getRoot()).to.be.equal(rootJSMainnet); }); }); diff --git a/test/contracts/bridge_permit.test.js b/test/contracts/bridge_permit.test.js index e5d4f3f39..0783969d7 100644 --- a/test/contracts/bridge_permit.test.js +++ b/test/contracts/bridge_permit.test.js @@ -136,7 +136,7 @@ describe('PolygonZkEVMBridge Contract Permit tests', () => { expect(await tokenContract.balanceOf(polygonZkEVMBridgeContract.address)).to.be.equal(balanceBridge.add(amount)); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); + const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); expect(rootSCMainnet).to.be.equal(rootJSMainnet); // check merkle proof @@ -234,7 +234,7 @@ describe('PolygonZkEVMBridge Contract Permit tests', () => { expect(await daiContract.balanceOf(polygonZkEVMBridgeContract.address)).to.be.equal(balanceBridge.add(amount)); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); + const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); expect(rootSCMainnet).to.be.equal(rootJSMainnet); // check merkle proof @@ -334,7 +334,7 @@ describe('PolygonZkEVMBridge Contract Permit tests', () => { expect(await uniContract.balanceOf(polygonZkEVMBridgeContract.address)).to.be.equal(balanceBridge.add(amount)); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); + const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); expect(rootSCMainnet).to.be.equal(rootJSMainnet); // check merkle proof diff --git a/test/contracts/depositContractMock.test.js b/test/contracts/depositContractMock.test.js index 35fae5fe6..b7147f808 100644 --- a/test/contracts/depositContractMock.test.js +++ b/test/contracts/depositContractMock.test.js @@ -67,7 +67,7 @@ describe('Deposit Contract', () => { merkleTree.add(leafValueJs); - const rootSC = await depositContractMock.getDepositRoot(); + const rootSC = await depositContractMock.getRoot(); const rootJS = merkleTree.getRoot(); expect(rootSC).to.be.equal(rootJS); @@ -160,7 +160,7 @@ describe('Deposit Contract', () => { merkleTree.add(leafValueJs); merkleTree.add(leafValueJs2); - const rootSC = await depositContractMock.getDepositRoot(); + const rootSC = await depositContractMock.getRoot(); const rootJS = merkleTree.getRoot(); expect(rootSC).to.be.equal(rootJS); @@ -227,7 +227,7 @@ describe('Deposit Contract', () => { merkleTree.add(leafValue); - let rootSC = await depositContractMock.getDepositRoot(); + let rootSC = await depositContractMock.getRoot(); let rootJS = merkleTree.getRoot(); expect(rootSC).to.be.equal(rootJS); @@ -280,7 +280,7 @@ describe('Deposit Contract', () => { ); merkleTree.add(leafValue); - rootSC = await depositContractMock.getDepositRoot(); + rootSC = await depositContractMock.getRoot(); rootJS = merkleTree.getRoot(); expect(rootSC).to.be.equal(rootJS); @@ -328,7 +328,7 @@ describe('Deposit Contract', () => { ); merkleTree.add(leafValue); - rootSC = await depositContractMock.getDepositRoot(); + rootSC = await depositContractMock.getRoot(); rootJS = merkleTree.getRoot(); expect(rootSC).to.be.equal(rootJS); @@ -376,7 +376,7 @@ describe('Deposit Contract', () => { } await Promise.all(results); // Check roots - rootSC = await depositContractMock.getDepositRoot(); + rootSC = await depositContractMock.getRoot(); rootJS = merkleTree.getRoot(); expect(rootSC).to.be.equal(rootJS); diff --git a/test/contracts/emergencyManager.test.js b/test/contracts/emergencyManager.test.js index 196e60519..6186af1c7 100644 --- a/test/contracts/emergencyManager.test.js +++ b/test/contracts/emergencyManager.test.js @@ -144,12 +144,10 @@ describe('Emergency mode test', () => { // Once in emergency state no sequenceBatches/forceBatches can be done const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.batchFee(); - const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const sequence = { transactions: l2txData, - globalExitRoot: ethers.constants.HashZero, - timestamp: ethers.BigNumber.from(currentTimestamp), + forcedHistoricGlobalExitRoot: ethers.constants.HashZero, minForcedTimestamp: 0, }; diff --git a/test/contracts/globalExitRootManager.test.js b/test/contracts/globalExitRootManager.test.js index 78ff7a6aa..886eaa984 100644 --- a/test/contracts/globalExitRootManager.test.js +++ b/test/contracts/globalExitRootManager.test.js @@ -5,6 +5,10 @@ function calculateGlobalExitRoot(mainnetExitRoot, rollupExitRoot) { return ethers.utils.solidityKeccak256(['bytes32', 'bytes32'], [mainnetExitRoot, rollupExitRoot]); } const zero32bytes = '0x0000000000000000000000000000000000000000000000000000000000000000'; +const MerkleTreeBridge = require('@0xpolygonhermez/zkevm-commonjs').MTBridge; +const { + verifyMerkleProof, +} = require('@0xpolygonhermez/zkevm-commonjs').mtBridgeUtils; describe('Global Exit Root', () => { let rollup; @@ -30,10 +34,12 @@ describe('Global Exit Root', () => { expect(await polygonZkEVMGlobalExitRoot.bridgeAddress()).to.be.equal(PolygonZkEVMBridge.address); expect(await polygonZkEVMGlobalExitRoot.lastRollupExitRoot()).to.be.equal(zero32bytes); expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(zero32bytes); + expect(await polygonZkEVMGlobalExitRoot.depositCount()).to.be.equal(0); }); it('should update root and check global exit root', async () => { const newRootRollup = ethers.utils.hexlify(ethers.utils.randomBytes(32)); + const newRootGlobalExitRoot = calculateGlobalExitRoot(zero32bytes, newRootRollup); await expect(polygonZkEVMGlobalExitRoot.updateExitRoot(newRootRollup)) .to.be.revertedWith('OnlyAllowedContracts'); @@ -44,7 +50,31 @@ describe('Global Exit Root', () => { .withArgs(zero32bytes, newRootRollup); expect(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()) - .to.be.equal(calculateGlobalExitRoot(zero32bytes, newRootRollup)); + .to.be.equal(newRootGlobalExitRoot); + + // compute root merkle tree in Js + const height = 32; + const merkleTree = new MerkleTreeBridge(height); + merkleTree.add(newRootGlobalExitRoot); + + const rootSC = await polygonZkEVMGlobalExitRoot.getRoot(); + const rootJS = merkleTree.getRoot(); + + expect(rootSC).to.be.equal(rootJS); + + // check merkle proof + const index = 0; + const proof = merkleTree.getProofTreeByIndex(index); + + // verify merkle proof + expect(verifyMerkleProof(newRootGlobalExitRoot, proof, index, rootSC)).to.be.equal(true); + + expect(await polygonZkEVMGlobalExitRoot.verifyMerkleProof( + newRootGlobalExitRoot, + proof, + index, + rootSC, + )).to.be.equal(true); // Update root from the PolygonZkEVMBridge const newRootBridge = ethers.utils.hexlify(ethers.utils.randomBytes(32)); @@ -53,7 +83,28 @@ describe('Global Exit Root', () => { .withArgs(newRootBridge, newRootRollup); expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(newRootBridge); + const newRootGlobalExitRoot2 = calculateGlobalExitRoot(newRootBridge, newRootRollup); expect(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()) - .to.be.equal(calculateGlobalExitRoot(newRootBridge, newRootRollup)); + .to.be.equal(newRootGlobalExitRoot2); + + // compute root merkle tree in Js + merkleTree.add(newRootGlobalExitRoot2); + const rootSC2 = await polygonZkEVMGlobalExitRoot.getRoot(); + const rootJS2 = merkleTree.getRoot(); + expect(rootSC2).to.be.equal(rootJS2); + + // check merkle proof + const index2 = 1; + const proof2 = merkleTree.getProofTreeByIndex(index2); + + // verify merkle proof + expect(verifyMerkleProof(newRootGlobalExitRoot2, proof2, index2, rootSC2)).to.be.equal(true); + + expect(await polygonZkEVMGlobalExitRoot.verifyMerkleProof( + newRootGlobalExitRoot2, + proof2, + index2, + rootSC2, + )).to.be.equal(true); }); }); diff --git a/test/contracts/globalExitRootManagerV2.test.js b/test/contracts/globalExitRootManagerV2.test.js deleted file mode 100644 index ef8f00337..000000000 --- a/test/contracts/globalExitRootManagerV2.test.js +++ /dev/null @@ -1,110 +0,0 @@ -const { expect } = require('chai'); -const { ethers } = require('hardhat'); - -function calculateGlobalExitRoot(mainnetExitRoot, rollupExitRoot) { - return ethers.utils.solidityKeccak256(['bytes32', 'bytes32'], [mainnetExitRoot, rollupExitRoot]); -} -const zero32bytes = '0x0000000000000000000000000000000000000000000000000000000000000000'; -const MerkleTreeBridge = require('@0xpolygonhermez/zkevm-commonjs').MTBridge; -const { - verifyMerkleProof, -} = require('@0xpolygonhermez/zkevm-commonjs').mtBridgeUtils; - -describe('Global Exit Root', () => { - let rollup; - let PolygonZkEVMBridge; - - let polygonZkEVMGlobalExitRoot; - beforeEach('Deploy contracts', async () => { - // load signers - [, rollup, PolygonZkEVMBridge] = await ethers.getSigners(); - - // deploy global exit root manager - const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory('PolygonZkEVMGlobalExitRootV2'); - - polygonZkEVMGlobalExitRoot = await PolygonZkEVMGlobalExitRootFactory.deploy( - rollup.address, - PolygonZkEVMBridge.address, - ); - await polygonZkEVMGlobalExitRoot.deployed(); - }); - - it('should check the constructor parameters', async () => { - expect(await polygonZkEVMGlobalExitRoot.rollupAddress()).to.be.equal(rollup.address); - expect(await polygonZkEVMGlobalExitRoot.bridgeAddress()).to.be.equal(PolygonZkEVMBridge.address); - expect(await polygonZkEVMGlobalExitRoot.lastRollupExitRoot()).to.be.equal(zero32bytes); - expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(zero32bytes); - expect(await polygonZkEVMGlobalExitRoot.depositCount()).to.be.equal(0); - }); - - it('should update root and check global exit root', async () => { - const newRootRollup = ethers.utils.hexlify(ethers.utils.randomBytes(32)); - const newRootGlobalExitRoot = calculateGlobalExitRoot(zero32bytes, newRootRollup); - - await expect(polygonZkEVMGlobalExitRoot.updateExitRoot(newRootRollup)) - .to.be.revertedWith('OnlyAllowedContracts'); - - // Update root from the rollup - await expect(polygonZkEVMGlobalExitRoot.connect(rollup).updateExitRoot(newRootRollup)) - .to.emit(polygonZkEVMGlobalExitRoot, 'UpdateGlobalExitRoot') - .withArgs(zero32bytes, newRootRollup); - - expect(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()) - .to.be.equal(newRootGlobalExitRoot); - - // compute root merkle tree in Js - const height = 32; - const merkleTree = new MerkleTreeBridge(height); - merkleTree.add(newRootGlobalExitRoot); - - const rootSC = await polygonZkEVMGlobalExitRoot.getRoot(); - const rootJS = merkleTree.getRoot(); - - expect(rootSC).to.be.equal(rootJS); - - // check merkle proof - const index = 0; - const proof = merkleTree.getProofTreeByIndex(index); - - // verify merkle proof - expect(verifyMerkleProof(newRootGlobalExitRoot, proof, index, rootSC)).to.be.equal(true); - - expect(await polygonZkEVMGlobalExitRoot.verifyMerkleProof( - newRootGlobalExitRoot, - proof, - index, - rootSC, - )).to.be.equal(true); - - // Update root from the PolygonZkEVMBridge - const newRootBridge = ethers.utils.hexlify(ethers.utils.randomBytes(32)); - await expect(polygonZkEVMGlobalExitRoot.connect(PolygonZkEVMBridge).updateExitRoot(newRootBridge)) - .to.emit(polygonZkEVMGlobalExitRoot, 'UpdateGlobalExitRoot') - .withArgs(newRootBridge, newRootRollup); - - expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(newRootBridge); - const newRootGlobalExitRoot2 = calculateGlobalExitRoot(newRootBridge, newRootRollup); - expect(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()) - .to.be.equal(newRootGlobalExitRoot2); - - // compute root merkle tree in Js - merkleTree.add(newRootGlobalExitRoot2); - const rootSC2 = await polygonZkEVMGlobalExitRoot.getRoot(); - const rootJS2 = merkleTree.getRoot(); - expect(rootSC2).to.be.equal(rootJS2); - - // check merkle proof - const index2 = 1; - const proof2 = merkleTree.getProofTreeByIndex(index2); - - // verify merkle proof - expect(verifyMerkleProof(newRootGlobalExitRoot2, proof2, index2, rootSC2)).to.be.equal(true); - - expect(await polygonZkEVMGlobalExitRoot.verifyMerkleProof( - newRootGlobalExitRoot2, - proof2, - index2, - rootSC2, - )).to.be.equal(true); - }); -}); diff --git a/test/contracts/polygonZkEVM.test.js b/test/contracts/polygonZkEVM.test.js index 764701fb8..b769183e2 100644 --- a/test/contracts/polygonZkEVM.test.js +++ b/test/contracts/polygonZkEVM.test.js @@ -389,12 +389,10 @@ describe('Polygon ZK-EVM', () => { it('should sequence a batch as trusted sequencer', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.batchFee(); - const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const sequence = { transactions: l2txData, - globalExitRoot: ethers.constants.HashZero, - timestamp: ethers.BigNumber.from(currentTimestamp), + forcedHistoricGlobalExitRoot: ethers.constants.HashZero, minForcedTimestamp: 0, }; @@ -421,18 +419,12 @@ describe('Polygon ZK-EVM', () => { await expect(polygonZkEVMContract.connect(trustedSequencer).sequenceBatches([], trustedSequencer.address)) .to.be.revertedWith('SequenceZeroBatches'); - sequence.globalExitRoot = ethers.constants.MaxUint256; - await expect(polygonZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address)) - .to.be.revertedWith('GlobalExitRootNotExist'); - sequence.globalExitRoot = ethers.constants.HashZero; - // Sequence batch await expect(polygonZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence], deployer.address)) .to.emit(polygonZkEVMContract, 'SequenceBatches') .withArgs(lastBatchSequenced + 1); - const sequencedTimestamp = (await ethers.provider.getBlock()).timestamp; - + const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const finalOwnerBalance = await maticTokenContract.balanceOf( await trustedSequencer.address, ); @@ -447,12 +439,12 @@ describe('Polygon ZK-EVM', () => { const batchAccInputHashJs = calculateAccInputHash( (await polygonZkEVMContract.sequencedBatches(0)).accInputHash, calculateBatchHashData(sequence.transactions), - sequence.globalExitRoot, - sequence.timestamp, + await polygonZkEVMGlobalExitRoot.getRoot(), + currentTimestamp, deployer.address, + '0x00', ); expect(batchAccInputHash).to.be.equal(batchAccInputHashJs); - expect(sequencedBatchData.sequencedTimestamp).to.be.equal(sequencedTimestamp); expect(sequencedBatchData.previousLastBatchSequenced).to.be.equal(0); }); @@ -460,19 +452,15 @@ describe('Polygon ZK-EVM', () => { const l2txData = '0x1234'; const maticAmount = (await polygonZkEVMContract.batchFee()).mul(2); - const currentTimestamp = (await ethers.provider.getBlock()).timestamp; - const sequence = { transactions: l2txData, - globalExitRoot: ethers.constants.HashZero, - timestamp: currentTimestamp, + forcedHistoricGlobalExitRoot: ethers.constants.HashZero, minForcedTimestamp: 0, }; const sequence2 = { transactions: l2txData, - globalExitRoot: ethers.constants.HashZero, - timestamp: currentTimestamp, + forcedHistoricGlobalExitRoot: ethers.constants.HashZero, minForcedTimestamp: 0, }; @@ -492,6 +480,8 @@ describe('Polygon ZK-EVM', () => { .to.emit(polygonZkEVMContract, 'SequenceBatches') .withArgs(lastBatchSequenced + 2); + const currentTimestamp = (await ethers.provider.getBlock()).timestamp; + const finalOwnerBalance = await maticTokenContract.balanceOf( await trustedSequencer.address, ); @@ -510,21 +500,21 @@ describe('Polygon ZK-EVM', () => { const sequencedBatchData2 = await polygonZkEVMContract.sequencedBatches(2); const batchAccInputHash2 = sequencedBatchData2.accInputHash; - // Calcultate input Hahs for batch 1 + // Calcultate input Hash for batch 1 let batchAccInputHashJs = calculateAccInputHash( ethers.constants.HashZero, calculateBatchHashData(sequence.transactions), - sequence.globalExitRoot, - sequence.timestamp, + await polygonZkEVMGlobalExitRoot.getRoot(), + currentTimestamp, trustedSequencer.address, ); - // Calcultate input Hahs for batch 2 + // Calcultate input Hash for batch 2 batchAccInputHashJs = calculateAccInputHash( batchAccInputHashJs, calculateBatchHashData(sequence2.transactions), - sequence2.globalExitRoot, - sequence2.timestamp, + await polygonZkEVMGlobalExitRoot.getRoot(), + currentTimestamp, trustedSequencer.address, ); expect(batchAccInputHash2).to.be.equal(batchAccInputHashJs); @@ -533,7 +523,7 @@ describe('Polygon ZK-EVM', () => { it('force batches through smart contract', async () => { const l2txDataForceBatch = '0x123456'; const maticAmount = await polygonZkEVMContract.getForcedBatchFee(); - const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); + const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getRoot(); // deploy sender SC const sendDataFactory = await ethers.getContractFactory('SendData'); @@ -564,7 +554,7 @@ describe('Polygon ZK-EVM', () => { it('sequenceBatches should sequence multiple batches and force batches', async () => { const l2txDataForceBatch = '0x123456'; const maticAmount = await polygonZkEVMContract.getForcedBatchFee(); - const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); + const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getRoot(); await expect( maticTokenContract.approve(polygonZkEVMContract.address, maticAmount), @@ -586,19 +576,17 @@ describe('Polygon ZK-EVM', () => { const l2txData = '0x1234'; const maticAmountSequence = (await polygonZkEVMContract.batchFee()).mul(1); - const currentTimestamp = (await ethers.provider.getBlock()).timestamp; + let currentTimestamp = (await ethers.provider.getBlock()).timestamp; const sequence = { transactions: l2txDataForceBatch, - globalExitRoot: lastGlobalExitRoot, - timestamp: currentTimestamp, + forcedHistoricGlobalExitRoot: lastGlobalExitRoot, minForcedTimestamp: currentTimestamp, }; const sequence2 = { transactions: l2txData, - globalExitRoot: ethers.constants.HashZero, - timestamp: currentTimestamp, + forcedHistoricGlobalExitRoot: lastGlobalExitRoot, minForcedTimestamp: 0, }; @@ -619,28 +607,11 @@ describe('Polygon ZK-EVM', () => { .to.be.revertedWith('ForcedDataDoesNotMatch'); sequence.minForcedTimestamp -= 1; - sequence.timestamp -= 1; - await expect(polygonZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence, sequence2], trustedSequencer.address)) - .to.be.revertedWith('SequencedTimestampBelowForcedTimestamp'); - sequence.timestamp += 1; - - sequence.timestamp = currentTimestamp + 10; - await expect(polygonZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence, sequence2], trustedSequencer.address)) - .to.be.revertedWith('SequencedTimestampInvalid'); - sequence.timestamp = currentTimestamp; - - sequence2.timestamp -= 1; - await expect(polygonZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence, sequence2], trustedSequencer.address)) - .to.be.revertedWith('SequencedTimestampInvalid'); - sequence2.timestamp += 1; - // Sequence Bathces await expect(polygonZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence, sequence2], trustedSequencer.address)) .to.emit(polygonZkEVMContract, 'SequenceBatches') .withArgs(Number(lastBatchSequenced) + 2); - const sequencedTimestamp = (await ethers.provider.getBlock()).timestamp; - const finalOwnerBalance = await maticTokenContract.balanceOf( await trustedSequencer.address, ); @@ -656,101 +627,39 @@ describe('Polygon ZK-EVM', () => { /* * Check batch mapping - * Calcultate input Hahs for batch 1 + * Calcultate input Hash for batch 1 */ + currentTimestamp = (await ethers.provider.getBlock()).timestamp; + let batchAccInputHashJs = calculateAccInputHash( ethers.constants.HashZero, calculateBatchHashData(sequence.transactions), - sequence.globalExitRoot, - sequence.timestamp, + await polygonZkEVMGlobalExitRoot.getRoot(), + sequence.minForcedTimestamp, trustedSequencer.address, + '0x01', ); - // Calcultate input Hahs for batch 2 + // Calcultate input Hash for batch 2 batchAccInputHashJs = calculateAccInputHash( batchAccInputHashJs, calculateBatchHashData(sequence2.transactions), - sequence2.globalExitRoot, - sequence2.timestamp, + await polygonZkEVMGlobalExitRoot.getRoot(), + currentTimestamp, trustedSequencer.address, + '0x00', ); + const batchData2 = await polygonZkEVMContract.sequencedBatches(2); expect(batchData2.accInputHash).to.be.equal(batchAccInputHashJs); - expect(batchData2.sequencedTimestamp).to.be.equal(sequencedTimestamp); + expect(batchData2.sequencedTimestamp).to.be.equal(currentTimestamp); expect(batchData2.previousLastBatchSequenced).to.be.equal(0); }); - it('sequenceBatches should check the timestamp correctly', async () => { - const l2txData = '0x'; - const maticAmount = (await polygonZkEVMContract.batchFee()).mul(2); - - const sequence = { - transactions: l2txData, - globalExitRoot: ethers.constants.HashZero, - timestamp: 0, - minForcedTimestamp: 0, - }; - - const sequence2 = { - transactions: l2txData, - globalExitRoot: ethers.constants.HashZero, - timestamp: 0, - minForcedTimestamp: 0, - }; - - const initialOwnerBalance = await maticTokenContract.balanceOf( - await trustedSequencer.address, - ); - - // Approve tokens - await expect( - maticTokenContract.connect(trustedSequencer).approve(polygonZkEVMContract.address, maticAmount), - ).to.emit(maticTokenContract, 'Approval'); - - const lastBatchSequenced = await polygonZkEVMContract.lastBatchSequenced(); - - let currentTimestamp = (await ethers.provider.getBlock()).timestamp; - await ethers.provider.send('evm_increaseTime', [1]); // evm_setNextBlockTimestamp - - sequence.timestamp = currentTimestamp + 2; // bigger than current block tiemstamp - - // revert because timestamp is more than the current one - await expect(polygonZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address)) - .to.be.revertedWith('SequencedTimestampInvalid'); - - currentTimestamp = (await ethers.provider.getBlock()).timestamp; - await ethers.provider.send('evm_increaseTime', [1]); - - sequence.timestamp = currentTimestamp; - sequence2.timestamp = currentTimestamp - 1; - - // revert because the second sequence has less timestamp than the previous batch - await expect(polygonZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence, sequence2], trustedSequencer.address)) - .to.be.revertedWith('SequencedTimestampInvalid'); - - currentTimestamp = (await ethers.provider.getBlock()).timestamp; - await ethers.provider.send('evm_increaseTime', [1]); - - sequence.timestamp = currentTimestamp + 1; // edge case, same timestamp as the block - sequence2.timestamp = currentTimestamp + 1; - - // Sequence Batches - await expect(polygonZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence, sequence2], trustedSequencer.address)) - .to.emit(polygonZkEVMContract, 'SequenceBatches') - .withArgs(lastBatchSequenced + 2); - - const finalOwnerBalance = await maticTokenContract.balanceOf( - await trustedSequencer.address, - ); - expect(finalOwnerBalance).to.equal( - ethers.BigNumber.from(initialOwnerBalance).sub(ethers.BigNumber.from(maticAmount)), - ); - }); - it('should force a batch of transactions', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.getForcedBatchFee(); - const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); + const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getRoot(); expect(maticAmount.toString()).to.be.equal((await polygonZkEVMContract.getForcedBatchFee()).toString()); @@ -806,7 +715,7 @@ describe('Polygon ZK-EVM', () => { it('should sequence force batches using sequenceForceBatches', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.getForcedBatchFee(); - const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); + const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getRoot(); await expect( maticTokenContract.approve(polygonZkEVMContract.address, maticAmount), @@ -844,7 +753,7 @@ describe('Polygon ZK-EVM', () => { const forceBatchStruct = { transactions: l2txData, - globalExitRoot: lastGlobalExitRoot, + forcedHistoricGlobalExitRoot: lastGlobalExitRoot, minForcedTimestamp: timestampForceBatch, }; @@ -862,7 +771,7 @@ describe('Polygon ZK-EVM', () => { const forceBatchStructBad = { transactions: l2txData, - globalExitRoot: lastGlobalExitRoot, + forcedHistoricGlobalExitRoot: lastGlobalExitRoot, minForcedTimestamp: timestampForceBatch, }; @@ -871,10 +780,10 @@ describe('Polygon ZK-EVM', () => { .to.be.revertedWith('ForcedDataDoesNotMatch'); forceBatchStructBad.minForcedTimestamp -= 1; - forceBatchStructBad.globalExitRoot = ethers.constants.HashZero; + forceBatchStructBad.forcedHistoricGlobalExitRoot = ethers.constants.HashZero; await expect(polygonZkEVMContract.sequenceForceBatches([forceBatchStructBad])) .to.be.revertedWith('ForcedDataDoesNotMatch'); - forceBatchStructBad.globalExitRoot = lastGlobalExitRoot; + forceBatchStructBad.forcedHistoricGlobalExitRoot = lastGlobalExitRoot; forceBatchStructBad.transactions = '0x1111'; await expect(polygonZkEVMContract.sequenceForceBatches([forceBatchStructBad])) @@ -889,8 +798,6 @@ describe('Polygon ZK-EVM', () => { .to.emit(polygonZkEVMContract, 'SequenceForceBatches') .withArgs(1); - const timestampSequenceBatch = (await ethers.provider.getBlock()).timestamp; - expect(await polygonZkEVMContract.lastForceBatchSequenced()).to.be.equal(1); expect(await polygonZkEVMContract.lastForceBatch()).to.be.equal(1); expect(await polygonZkEVMContract.lastBatchSequenced()).to.be.equal(1); @@ -901,9 +808,10 @@ describe('Polygon ZK-EVM', () => { const batchAccInputHashJs = calculateAccInputHash( ethers.constants.HashZero, calculateBatchHashData(l2txData), - lastGlobalExitRoot, - timestampSequenceBatch, + await polygonZkEVMGlobalExitRoot.getRoot(), + forceBatchStruct.minForcedTimestamp, deployer.address, + '0x01', ); expect(batchAccInputHash).to.be.equal(batchAccInputHashJs); }); @@ -911,12 +819,10 @@ describe('Polygon ZK-EVM', () => { it('should verify a sequenced batch using verifyBatchesTrustedAggregator', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.batchFee(); - const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const sequence = { transactions: l2txData, - globalExitRoot: ethers.constants.HashZero, - timestamp: currentTimestamp, + forcedHistoricGlobalExitRoot: ethers.constants.HashZero, minForcedTimestamp: 0, }; @@ -999,7 +905,7 @@ describe('Polygon ZK-EVM', () => { it('should verify forced sequenced batch using verifyBatchesTrustedAggregator', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.getForcedBatchFee(); - const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); + const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getRoot(); await expect( maticTokenContract.approve(polygonZkEVMContract.address, maticAmount), @@ -1021,7 +927,7 @@ describe('Polygon ZK-EVM', () => { const forceBatchStruct = { transactions: l2txData, - globalExitRoot: lastGlobalExitRoot, + forcedHistoricGlobalExitRoot: lastGlobalExitRoot, minForcedTimestamp: timestampForceBatch, }; @@ -1068,12 +974,10 @@ describe('Polygon ZK-EVM', () => { it('should match the computed SC input with the Js input', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.batchFee(); - const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const sequence = { transactions: l2txData, - globalExitRoot: ethers.constants.HashZero, - timestamp: currentTimestamp, + forcedHistoricGlobalExitRoot: ethers.constants.HashZero, minForcedTimestamp: 0, }; @@ -1091,13 +995,15 @@ describe('Polygon ZK-EVM', () => { const sentBatchHash = (await polygonZkEVMContract.sequencedBatches(lastBatchSequenced + 1)).accInputHash; const oldAccInputHash = (await polygonZkEVMContract.sequencedBatches(0)).accInputHash; + const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const batchAccInputHashJs = calculateAccInputHash( oldAccInputHash, calculateBatchHashData(sequence.transactions), - sequence.globalExitRoot, - sequence.timestamp, + await polygonZkEVMGlobalExitRoot.getRoot(), + currentTimestamp, trustedSequencer.address, + '0x00', ); expect(sentBatchHash).to.be.equal(batchAccInputHashJs); @@ -1137,7 +1043,7 @@ describe('Polygon ZK-EVM', () => { it('should match the computed SC input with the Js input in force batches', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.getForcedBatchFee(); - const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); + const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getRoot(); await expect( maticTokenContract.approve(polygonZkEVMContract.address, maticAmount), @@ -1160,7 +1066,7 @@ describe('Polygon ZK-EVM', () => { const forceBatchStruct = { transactions: l2txData, - globalExitRoot: lastGlobalExitRoot, + forcedHistoricGlobalExitRoot: lastGlobalExitRoot, minForcedTimestamp: timestampForceBatch, }; @@ -1169,16 +1075,16 @@ describe('Polygon ZK-EVM', () => { .to.emit(polygonZkEVMContract, 'SequenceForceBatches') .withArgs(lastForcedBatch); - const sequencedTimestmap = (await ethers.provider.getBlock()).timestamp; const oldAccInputHash = (await polygonZkEVMContract.sequencedBatches(0)).accInputHash; const batchAccInputHash = (await polygonZkEVMContract.sequencedBatches(1)).accInputHash; const batchAccInputHashJs = calculateAccInputHash( oldAccInputHash, calculateBatchHashData(l2txData), - lastGlobalExitRoot, - sequencedTimestmap, + await polygonZkEVMGlobalExitRoot.getRoot(), + forceBatchStruct.minForcedTimestamp, deployer.address, + '0x01', ); expect(batchAccInputHash).to.be.equal(batchAccInputHashJs); @@ -1218,12 +1124,10 @@ describe('Polygon ZK-EVM', () => { it('should verify a sequenced batch using verifyBatches', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.batchFee(); - const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const sequence = { transactions: l2txData, - globalExitRoot: ethers.constants.HashZero, - timestamp: currentTimestamp, + forcedHistoricGlobalExitRoot: ethers.constants.HashZero, minForcedTimestamp: 0, }; @@ -1376,13 +1280,11 @@ describe('Polygon ZK-EVM', () => { it('should test the pending state properly', async () => { const l2txData = '0x123456'; - const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const batchesForSequence = 5; const sequence = { transactions: l2txData, - globalExitRoot: ethers.constants.HashZero, - timestamp: currentTimestamp, + forcedHistoricGlobalExitRoot: ethers.constants.HashZero, minForcedTimestamp: 0, }; const sequencesArray = Array(batchesForSequence).fill(sequence); @@ -1755,12 +1657,10 @@ describe('Polygon ZK-EVM', () => { it('Activate emergency state due halt timeout', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.batchFee(); - const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const sequence = { transactions: l2txData, - globalExitRoot: ethers.constants.HashZero, - timestamp: ethers.BigNumber.from(currentTimestamp), + forcedHistoricGlobalExitRoot: ethers.constants.HashZero, minForcedTimestamp: 0, }; @@ -1803,13 +1703,11 @@ describe('Polygon ZK-EVM', () => { it('Test overridePendingState properly', async () => { const l2txData = '0x123456'; - const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const batchesForSequence = 5; const sequence = { transactions: l2txData, - globalExitRoot: ethers.constants.HashZero, - timestamp: currentTimestamp, + forcedHistoricGlobalExitRoot: ethers.constants.HashZero, minForcedTimestamp: 0, }; const sequencesArray = Array(batchesForSequence).fill(sequence); diff --git a/test/contracts/real-prover/real-flow.test.js b/test/contracts/real-prover/real-flow.test.js-ignore similarity index 100% rename from test/contracts/real-prover/real-flow.test.js rename to test/contracts/real-prover/real-flow.test.js-ignore diff --git a/test/contracts/snark_stark_input.test.js b/test/contracts/snark_stark_input.test.js index 47c404673..36a8ab60e 100644 --- a/test/contracts/snark_stark_input.test.js +++ b/test/contracts/snark_stark_input.test.js @@ -56,7 +56,7 @@ describe('Polygon ZK-EVM snark stark input test', () => { const globalExitRoot = '0x090bcaf734c4f06c93954a827b45a6e8c67b8e0fd1e0a35a1c5982d6961828f9'; const timestamp = 1944498031; const sequencerAddr = '0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D'; - const expectedStarkHashExecutor = '0x704d5cfd3e44b82028f7f8cae31168267a7422c5a447b90a65134116da5a8432'; + const expectedStarkHashExecutor = '0xef046bcaca930591f7c941cad928406dd1402a4e33b4dc704c519d130a05dd9f'; const batchL2DataHash = contractUtils.calculateBatchHashData(batchL2Data); const accumulateInputHashJs = await contractUtils.calculateAccInputHash( @@ -65,6 +65,7 @@ describe('Polygon ZK-EVM snark stark input test', () => { globalExitRoot, timestamp, sequencerAddr, + '0x00', ); const accumulateInputHashSC = await polygonZkEVMContract.calculateAccInputHash( oldAccInputHash, @@ -72,6 +73,7 @@ describe('Polygon ZK-EVM snark stark input test', () => { globalExitRoot, timestamp, sequencerAddr, + false, ); expect(accumulateInputHashJs).to.be.equal(accumulateInputHashSC); expect(accumulateInputHashSC).to.be.equal(expectedStarkHashExecutor); From 269a95db0e5607f097cf3497bf4b5628264bf38e Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 21 Aug 2023 12:12:33 +0200 Subject: [PATCH 012/230] first commit v2 --- compiled-contracts/PolygonZkEVM.json | 37 +- compiled-contracts/PolygonZkEVMBridge.json | 26 +- .../PolygonZkEVMBridgeMock.json | 26 +- .../PolygonZkEVMGlobalExitRoot.json | 65 -- .../PolygonZkEVMGlobalExitRootMock.json | 65 -- compiled-contracts/PolygonZkEVMMock.json | 42 +- .../interfaces/IPolygonRollupManager.sol | 118 +++ contracts/v2/PolygonStateManager.sol | 166 ++++ contracts/v2/PolygonZkEVMBridgeV2.sol | 922 ++++++++++++++++++ contracts/v2/PolygonZkEVMGlobalExitRootV2.sol | 107 ++ 10 files changed, 1381 insertions(+), 193 deletions(-) create mode 100644 contracts/interfaces/IPolygonRollupManager.sol create mode 100644 contracts/v2/PolygonStateManager.sol create mode 100644 contracts/v2/PolygonZkEVMBridgeV2.sol create mode 100644 contracts/v2/PolygonZkEVMGlobalExitRootV2.sol diff --git a/compiled-contracts/PolygonZkEVM.json b/compiled-contracts/PolygonZkEVM.json index 3d7b77fa1..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[]" } diff --git a/compiled-contracts/PolygonZkEVMBridge.json b/compiled-contracts/PolygonZkEVMBridge.json index 65c0f7c51..da2451474 100644 --- a/compiled-contracts/PolygonZkEVMBridge.json +++ b/compiled-contracts/PolygonZkEVMBridge.json @@ -459,6 +459,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "getDepositRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -508,19 +521,6 @@ "stateMutability": "pure", "type": "function" }, - { - "inputs": [], - "name": "getRoot", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { diff --git a/compiled-contracts/PolygonZkEVMBridgeMock.json b/compiled-contracts/PolygonZkEVMBridgeMock.json index 62001ffbc..80c9d0f50 100644 --- a/compiled-contracts/PolygonZkEVMBridgeMock.json +++ b/compiled-contracts/PolygonZkEVMBridgeMock.json @@ -478,6 +478,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "getDepositRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -527,19 +540,6 @@ "stateMutability": "pure", "type": "function" }, - { - "inputs": [], - "name": "getRoot", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { diff --git a/compiled-contracts/PolygonZkEVMGlobalExitRoot.json b/compiled-contracts/PolygonZkEVMGlobalExitRoot.json index e37ac6ba4..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,19 +56,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "depositCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "getLastGlobalExitRoot", @@ -87,19 +69,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "getRoot", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -170,40 +139,6 @@ "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": "0x60c060405234801561000f575f80fd5b506040516103e13803806103e183398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a0516103226100bf5f395f818160e301526101b601525f818161012f015261016d01526103225ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c806333d6247d1161005857806333d6247d146100c15780633ed691ef146100d65780635ec6a8df146100de578063a3c573eb1461012a575f80fd5b806301fd90441461007e578063257b363214610099578063319cf735146100b8575b5f80fd5b6100865f5481565b6040519081526020015b60405180910390f35b6100866100a73660046102d5565b60026020525f908152604090205481565b61008660015481565b6100d46100cf3660046102d5565b610151565b005b61008661029b565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610090565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361019f575060018290558161021a565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101e8575f83905582915061021a565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f8181526002602052604081205491925003610295575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6102d06001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f602082840312156102e5575f80fd5b503591905056fea26469706673582212205b8fae68ff3c2dfc257497be9184a2e772688dbece1343c3dc2e8c1923291be864736f6c63430008140033", diff --git a/compiled-contracts/PolygonZkEVMGlobalExitRootMock.json b/compiled-contracts/PolygonZkEVMGlobalExitRootMock.json index 5c52bf65b..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,19 +56,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "depositCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "getLastGlobalExitRoot", @@ -87,19 +69,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "getRoot", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -201,40 +170,6 @@ "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": "0x60c060405234801561000f575f80fd5b5060405161047838038061047883398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a0516103b86100c05f395f818161013a015261022c01525f818161018601526101e301526103b85ff3fe608060405234801561000f575f80fd5b506004361061009f575f3560e01c806333d6247d116100725780635bcef673116100585780635bcef673146101165780635ec6a8df14610135578063a3c573eb14610181575f80fd5b806333d6247d146100fb5780633ed691ef1461010e575f80fd5b806301fd9044146100a3578063051a9e28146100be578063257b3632146100d3578063319cf735146100f2575b5f80fd5b6100ab5f5481565b6040519081526020015b60405180910390f35b6100d16100cc36600461034b565b6101a8565b005b6100ab6100e136600461034b565b60026020525f908152604090205481565b6100ab60015481565b6100d161010936600461034b565b6101c7565b6100ab610311565b6100d1610124366004610362565b5f9182526002602052604090912055565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b8060025f6101b4610311565b815260208101919091526040015f205550565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102155750600182905581610290565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361025e575f839055829150610290565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f818152600260205260408120549192500361030b575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6103466001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f6020828403121561035b575f80fd5b5035919050565b5f8060408385031215610373575f80fd5b5050803592602090910135915056fea26469706673582212200799b5f60aa8eaf6d49205025cc41bfba78ce4f6ad614164e5da3c0bdc94810464736f6c63430008140033", diff --git a/compiled-contracts/PolygonZkEVMMock.json b/compiled-contracts/PolygonZkEVMMock.json index a688a363f..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[]" } diff --git a/contracts/interfaces/IPolygonRollupManager.sol b/contracts/interfaces/IPolygonRollupManager.sol new file mode 100644 index 000000000..1fe55c374 --- /dev/null +++ b/contracts/interfaces/IPolygonRollupManager.sol @@ -0,0 +1,118 @@ +// SPDX-License-Identifier: AGPL-3.0 + +pragma solidity 0.8.17; + +interface IPolygonRollupManager { + /** + * @dev Thrown when sender is not the PolygonZkEVM address + */ + error OnlyGovernance(); + + /** + * @dev Thrown when the destination network is invalid + */ + error DestinationNetworkInvalid(); + + /** + * @dev Thrown when the amount does not match msg.value + */ + error AmountDoesNotMatchMsgValue(); + + /** + * @dev Thrown when user is bridging tokens and is also sending a value + */ + error MsgValueNotZero(); + + /** + * @dev Thrown when the Ether transfer on claimAsset fails + */ + error EtherTransferFailed(); + + /** + * @dev Thrown when the message transaction on claimMessage fails + */ + error MessageFailed(); + + /** + * @dev Thrown when the global exit root does not exist + */ + error GlobalExitRootInvalid(); + + /** + * @dev Thrown when the smt proof does not match + */ + error InvalidSmtProof(); + + /** + * @dev Thrown when an index is already claimed + */ + error AlreadyClaimed(); + + /** + * @dev Thrown when the owner of permit does not match the sender + */ + error NotValidOwner(); + + /** + * @dev Thrown when the spender of the permit does not match this contract address + */ + error NotValidSpender(); + + /** + * @dev Thrown when the amount of the permit does not match + */ + error NotValidAmount(); + + /** + * @dev Thrown when the permit data contains an invalid signature + */ + error NotValidSignature(); + + function bridgeAsset( + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + address token, + bool forceUpdateGlobalExitRoot, + bytes calldata permitData + ) external payable; + + function bridgeMessage( + uint32 destinationNetwork, + address destinationAddress, + bool forceUpdateGlobalExitRoot, + bytes calldata metadata + ) external payable; + + function claimAsset( + bytes32[32] calldata smtProof, + uint32 index, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + uint32 originNetwork, + address originTokenAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes calldata metadata + ) external; + + function claimMessage( + bytes32[32] calldata smtProof, + uint32 index, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + uint32 originNetwork, + address originAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes calldata metadata + ) external; + + function updateGlobalExitRoot() external; + + function activateEmergencyState() external; + + function deactivateEmergencyState() external; +} diff --git a/contracts/v2/PolygonStateManager.sol b/contracts/v2/PolygonStateManager.sol new file mode 100644 index 000000000..312e99665 --- /dev/null +++ b/contracts/v2/PolygonStateManager.sol @@ -0,0 +1,166 @@ +// SPDX-License-Identifier: AGPL-3.0 + +pragma solidity 0.8.17; + +import "../interfaces/IPolygonRollupManager.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; + +/** + * Contract responsible for managing the exit roots across multiple networks + */ +abstract contract PolygonRollupManager is IPolygonRollupManager, Initializable { + // struct to store consensus metadata?¿ + + // Number of consensus added, every new consensus will be assigned sequencially a new ID + uint256 public consensusCount; + + // Consensus mapping + // consensusID => consensusImpl + mapping(uint256 => address) public consensusMap; + + // Number of verifiers added, every new verifiers will be assigned sequencially a new ID + uint256 public verifierCount; + + // Verifiers mapping + // verifierID => verifierAddress + mapping(uint256 => address) public verifierMap; + + // Governance address + address public governance; + + // Governance address + address public networkCount; + + // Time target of the verification of a batch + // Adaptatly the batchFee will be updated to achieve this target + uint64 public verifyBatchTimeTarget; + + // Batch fee multiplier with 3 decimals that goes from 1000 - 1023 + uint16 public multiplierBatchFee; + + // Trusted sequencer address + address public trustedSequencer; + + // Current matic fee per batch sequenced + uint256 public batchFee; + + /** + * @notice Struct which will be stored for every batch sequence + * @param accInputHash Hash chain that contains all the information to process a batch: + * keccak256(bytes32 oldAccInputHash, keccak256(bytes transactions), bytes32 globalExitRoot, uint64 timestamp, address seqAddress) + * @param sequencedTimestamp Sequenced timestamp + * @param previousLastBatchSequenced Previous last batch sequenced before the current one, this is used to properly calculate the fees + */ + struct SequencedBatchData { + bytes32 accInputHash; + uint64 sequencedTimestamp; + uint64 previousLastBatchSequenced; + } + + /** + * @notice Struct to store the pending states + * Pending state will be an intermediary state, that after a timeout can be consolidated, which means that will be added + * to the state root mapping, and the global exit root will be updated + * This is a protection mechanism against soundness attacks, that will be turned off in the future + * @param timestamp Timestamp where the pending state is added to the queue + * @param lastVerifiedBatch Last batch verified batch of this pending state + * @param exitRoot Pending exit root + * @param stateRoot Pending state root + */ + struct PendingState { + uint64 timestamp; + uint64 lastVerifiedBatch; + bytes32 exitRoot; + bytes32 stateRoot; + } + + struct ChainData { + mapping(uint64 => SequencedBatchData) sequencedBatches; + mapping(uint64 => bytes32) batchNumToStateRoot; + mapping(uint256 => PendingState) pendingStateTransitions; + uint64 lastBatchSequenced; + uint64 lastVerifiedBatch; + uint64 lastPendingState; + uint64 lastPendingStateConsolidated; + } + + // Once a pending state exceeds this timeout it can be consolidated + uint64 public pendingStateTimeout; + + // Trusted aggregator timeout, if a sequence is not verified in this time frame, + // everyone can verify that sequence + uint64 public trustedAggregatorTimeout; + + /** + * @dev Emitted when a new consensus is added + */ + event AddNewConsensus(uint256 consensusID, address consensusAddress); + + /** + * @dev Emitted when a new verifier is added + */ + event AddNewVerifier(uint256 verifierID, address verifierAddress); + + function initialize(address _governance) external initializer { + governance = _governance; + } + + modifier onlyGovernance() { + if (governance != msg.sender) { + revert OnlyGovernance(); + } + _; + } + + /** + * @notice Add a new consensus contract + * @param newConsensusAddress new exit tree root + */ + function addNewConsensus( + address newConsensusAddress + ) external onlyGovernance { + uint256 consensusID = consensusCount++; + consensusMap[consensusID] = newConsensusAddress; + + emit AddNewConsensus(consensusID, newConsensusAddress); + } + + /** + * @notice Add a new vefifier contract + * @param newVerifierAddress new verifier address + */ + function addNewVerifier( + address newVerifierAddress + ) external onlyGovernance { + uint256 verifierID = verifierCount++; + verifierMap[verifierID] = newVerifierAddress; + + emit AddNewVerifier(verifierID, newVerifierAddress); + } + + /** + * @notice Add a new vefifier contract + * @param newVerifierAddress new verifier address + */ + function createNewNetwork( + address newVerifierAddress + ) external onlyGovernance { + uint256 verifierID = verifierCount++; + verifierMap[verifierID] = newVerifierAddress; + + emit AddNewVerifier(verifierID, newVerifierAddress); + } + + /** + * @notice Add a new vefifier contract + * @param newVerifierAddress new verifier address + */ + function calculateCurrentRollupRoot( + address newVerifierAddress + ) external onlyGovernance { + uint256 verifierID = verifierCount++; + verifierMap[verifierID] = newVerifierAddress; + + emit AddNewVerifier(verifierID, newVerifierAddress); + } +} diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol new file mode 100644 index 000000000..2eba146fe --- /dev/null +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -0,0 +1,922 @@ +// SPDX-License-Identifier: AGPL-3.0 + +pragma solidity 0.8.17; + +import "../lib/DepositContract.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; +import "../lib/TokenWrapped.sol"; +import "../interfaces/IBasePolygonZkEVMGlobalExitRoot.sol"; +import "../interfaces/IBridgeMessageReceiver.sol"; +import "../interfaces/IPolygonZkEVMBridge.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol"; +import "../lib/EmergencyManager.sol"; +import "../lib/GlobalExitRootLib.sol"; + +/** + * PolygonZkEVMBridge that will be deployed on both networks Ethereum and Polygon zkEVM + * Contract responsible to manage the token interactions with other networks + */ +contract PolygonZkEVMBridgeV2 is + DepositContract, + EmergencyManager, + IPolygonZkEVMBridge +{ + using SafeERC20Upgradeable for IERC20Upgradeable; + + // Wrapped Token information struct + struct TokenInformation { + uint32 originNetwork; + address originTokenAddress; + } + + // bytes4(keccak256(bytes("permit(address,address,uint256,uint256,uint8,bytes32,bytes32)"))); + bytes4 private constant _PERMIT_SIGNATURE = 0xd505accf; + + // bytes4(keccak256(bytes("permit(address,address,uint256,uint256,bool,uint8,bytes32,bytes32)"))); + bytes4 private constant _PERMIT_SIGNATURE_DAI = 0x8fcbaf0c; + + // Mainnet identifier + uint32 private constant _MAINNET_NETWORK_ID = 0; + + // ZkEVM identifier + uint32 private constant _ZKEVM_NETWORK_ID = 1; + + // Number of networks supported by the bridge + uint32 private constant _CURRENT_SUPPORTED_NETWORKS = 2; + + // Leaf type asset + uint8 private constant _LEAF_TYPE_ASSET = 0; + + // Leaf type message + uint8 private constant _LEAF_TYPE_MESSAGE = 1; + + // Nullifier offset + uint256 private constant _MAX_LEAFS_PER_NETWORK = 2 ** 32; + + // // Indicate where's the mainnet flag bit in the global index + // uint256 private constant _GLOBAL_INDEX_MAINNET_FLAG = 2 ** 64; + + // Network identifier + uint32 public networkID; + + // Global Exit Root address + IBasePolygonZkEVMGlobalExitRoot public globalExitRootManager; + + // Last updated deposit count to the global exit root manager + uint32 public lastUpdatedDepositCount; + + // Leaf index --> claimed bit map + mapping(uint256 => uint256) public claimedBitMap; + + // keccak256(OriginNetwork || tokenAddress) --> Wrapped token address + mapping(bytes32 => address) public tokenInfoToWrappedToken; + + // Wrapped token Address --> Origin token information + mapping(address => TokenInformation) public wrappedTokenToTokenInfo; + + // PolygonZkEVM address + address public polygonRollupManager; + + /** + * @param _networkID networkID + * @param _globalExitRootManager global exit root manager address + * @param _polygonRollupManager polygonZkEVM address + * @notice The value of `_polygonRollupManager` on the L2 deployment of the contract will be address(0), so + * emergency state is not possible for the L2 deployment of the bridge, intentionally + */ + function initialize( + uint32 _networkID, + IBasePolygonZkEVMGlobalExitRoot _globalExitRootManager, + address _polygonRollupManager + ) external virtual initializer { + networkID = _networkID; + globalExitRootManager = _globalExitRootManager; + polygonRollupManager = _polygonRollupManager; + + // Initialize OZ contracts + __ReentrancyGuard_init(); + } + + modifier onlyPolygonZkEVM() { + if (polygonRollupManager != msg.sender) { + revert OnlyPolygonZkEVM(); + } + _; + } + + /** + * @dev Emitted when bridge assets or messages to another network + */ + event BridgeEvent( + uint8 leafType, + uint32 originNetwork, + address originAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes metadata, + uint32 depositCount + ); + + /** + * @dev Emitted when a claim is done from another network + */ + event ClaimEvent( + uint256 index, + uint32 originNetwork, + address originAddress, + address destinationAddress, + uint256 amount + ); + + /** + * @dev Emitted when a new wrapped token is created + */ + event NewWrappedToken( + uint32 originNetwork, + address originTokenAddress, + address wrappedTokenAddress, + bytes metadata + ); + + /** + * @notice Deposit add a new leaf to the merkle tree + * @param destinationNetwork Network destination + * @param destinationAddress Address destination + * @param amount Amount of tokens + * @param token Token address, 0 address is reserved for ether + * @param forceUpdateGlobalExitRoot Indicates if the new global exit root is updated or not + * @param permitData Raw data of the call `permit` of the token + */ + function bridgeAsset( + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + address token, + bool forceUpdateGlobalExitRoot, + bytes calldata permitData + ) public payable virtual ifNotEmergencyState nonReentrant { + if ( + destinationNetwork == networkID || + destinationNetwork >= _CURRENT_SUPPORTED_NETWORKS + ) { + revert DestinationNetworkInvalid(); + } + + address originTokenAddress; + uint32 originNetwork; + bytes memory metadata; + uint256 leafAmount = amount; + + if (token == address(0)) { + // Ether transfer + if (msg.value != amount) { + revert AmountDoesNotMatchMsgValue(); + } + + // Ether is treated as ether from mainnet + originNetwork = _MAINNET_NETWORK_ID; + } else { + // Check msg.value is 0 if tokens are bridged + if (msg.value != 0) { + revert MsgValueNotZero(); + } + + TokenInformation memory tokenInfo = wrappedTokenToTokenInfo[token]; + + if (tokenInfo.originTokenAddress != address(0)) { + // The token is a wrapped token from another network + + // Burn tokens + TokenWrapped(token).burn(msg.sender, amount); + + originTokenAddress = tokenInfo.originTokenAddress; + originNetwork = tokenInfo.originNetwork; + } else { + // Use permit if any + if (permitData.length != 0) { + _permit(token, amount, permitData); + } + + // In order to support fee tokens check the amount received, not the transferred + uint256 balanceBefore = IERC20Upgradeable(token).balanceOf( + address(this) + ); + IERC20Upgradeable(token).safeTransferFrom( + msg.sender, + address(this), + amount + ); + uint256 balanceAfter = IERC20Upgradeable(token).balanceOf( + address(this) + ); + + // Override leafAmount with the received amount + leafAmount = balanceAfter - balanceBefore; + + originTokenAddress = token; + originNetwork = networkID; + + // Encode metadata + metadata = abi.encode( + _safeName(token), + _safeSymbol(token), + _safeDecimals(token) + ); + } + } + + emit BridgeEvent( + _LEAF_TYPE_ASSET, + originNetwork, + originTokenAddress, + destinationNetwork, + destinationAddress, + leafAmount, + metadata, + uint32(depositCount) + ); + + _addLeaf( + getLeafValue( + _LEAF_TYPE_ASSET, + originNetwork, + originTokenAddress, + destinationNetwork, + destinationAddress, + leafAmount, + keccak256(metadata) + ) + ); + + // Update the new root to the global exit root manager if set by the user + if (forceUpdateGlobalExitRoot) { + _updateGlobalExitRoot(); + } + } + + /** + * @notice Bridge message and send ETH value + * @param destinationNetwork Network destination + * @param destinationAddress Address destination + * @param forceUpdateGlobalExitRoot Indicates if the new global exit root is updated or not + * @param metadata Message metadata + */ + function bridgeMessage( + uint32 destinationNetwork, + address destinationAddress, + bool forceUpdateGlobalExitRoot, + bytes calldata metadata + ) external payable ifNotEmergencyState { + if ( + destinationNetwork == networkID || + destinationNetwork >= _CURRENT_SUPPORTED_NETWORKS + ) { + revert DestinationNetworkInvalid(); + } + + emit BridgeEvent( + _LEAF_TYPE_MESSAGE, + networkID, + msg.sender, + destinationNetwork, + destinationAddress, + msg.value, + metadata, + uint32(depositCount) + ); + + _addLeaf( + getLeafValue( + _LEAF_TYPE_MESSAGE, + networkID, + msg.sender, + destinationNetwork, + destinationAddress, + msg.value, + keccak256(metadata) + ) + ); + + // Update the new root to the global exit root manager if set by the user + if (forceUpdateGlobalExitRoot) { + _updateGlobalExitRoot(); + } + } + + /** + * @notice Verify merkle proof and withdraw tokens/ether + * @param smtProof Smt proof + * @param globalIndex Global index: bool(isMainnet)||uint32(indexRollupRoot)||uint32(indexDepositLeaf) + * @param mainnetExitRoot Mainnet exit root + * @param rollupExitRoot Rollup exit root + * @param originNetwork Origin network + * @param originTokenAddress Origin token address, 0 address is reserved for ether + * @param destinationNetwork Network destination + * @param destinationAddress Address destination + * @param amount Amount of tokens + * @param metadata Abi encoded metadata if any, empty otherwise + */ + function claimAsset( + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, + uint256 globalIndex, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + uint32 originNetwork, + address originTokenAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes calldata metadata + ) external ifNotEmergencyState { + // Verify leaf exist and it does not have been claimed + _verifyLeaf( + smtProof, + globalIndex, + mainnetExitRoot, + rollupExitRoot, + originNetwork, + originTokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata, + _LEAF_TYPE_ASSET + ); + + // Transfer funds + if (originTokenAddress == address(0)) { + // Transfer ether + /* solhint-disable avoid-low-level-calls */ + (bool success, ) = destinationAddress.call{value: amount}( + new bytes(0) + ); + if (!success) { + revert EtherTransferFailed(); + } + } else { + // Transfer tokens + if (originNetwork == networkID) { + // The token is an ERC20 from this network + IERC20Upgradeable(originTokenAddress).safeTransfer( + destinationAddress, + amount + ); + } else { + // The tokens is not from this network + // Create a wrapper for the token if not exist yet + bytes32 tokenInfoHash = keccak256( + abi.encodePacked(originNetwork, originTokenAddress) + ); + address wrappedToken = tokenInfoToWrappedToken[tokenInfoHash]; + + if (wrappedToken == address(0)) { + // Get ERC20 metadata + ( + string memory name, + string memory symbol, + uint8 decimals + ) = abi.decode(metadata, (string, string, uint8)); + + // Create a new wrapped erc20 using create2 + TokenWrapped newWrappedToken = (new TokenWrapped){ + salt: tokenInfoHash + }(name, symbol, decimals); + + // Mint tokens for the destination address + newWrappedToken.mint(destinationAddress, amount); + + // Create mappings + tokenInfoToWrappedToken[tokenInfoHash] = address( + newWrappedToken + ); + + wrappedTokenToTokenInfo[ + address(newWrappedToken) + ] = TokenInformation(originNetwork, originTokenAddress); + + emit NewWrappedToken( + originNetwork, + originTokenAddress, + address(newWrappedToken), + metadata + ); + } else { + // Use the existing wrapped erc20 + TokenWrapped(wrappedToken).mint(destinationAddress, amount); + } + } + } + + emit ClaimEvent( + globalIndex, + originNetwork, + originTokenAddress, + destinationAddress, + amount + ); + } + + /** + * @notice Verify merkle proof and execute message + * If the receiving address is an EOA, the call will result as a success + * Which means that the amount of ether will be transferred correctly, but the message + * will not trigger any execution + * @param smtProof Smt proof + * @param globalIndex Index of the leaf + * @param mainnetExitRoot Mainnet exit root + * @param rollupExitRoot Rollup exit root + * @param originNetwork Origin network + * @param originAddress Origin address + * @param destinationNetwork Network destination + * @param destinationAddress Address destination + * @param amount message value + * @param metadata Abi encoded metadata if any, empty otherwise + */ + function claimMessage( + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, + uint256 globalIndex, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + uint32 originNetwork, + address originAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes calldata metadata + ) external ifNotEmergencyState { + // Verify leaf exist and it does not have been claimed + _verifyLeaf( + smtProof, + globalIndex, + mainnetExitRoot, + rollupExitRoot, + originNetwork, + originAddress, + destinationNetwork, + destinationAddress, + amount, + metadata, + _LEAF_TYPE_MESSAGE + ); + + // Execute message + // Transfer ether + /* solhint-disable avoid-low-level-calls */ + (bool success, ) = destinationAddress.call{value: amount}( + abi.encodeCall( + IBridgeMessageReceiver.onMessageReceived, + (originAddress, originNetwork, metadata) + ) + ); + if (!success) { + revert MessageFailed(); + } + + emit ClaimEvent( + globalIndex, + originNetwork, + originAddress, + destinationAddress, + amount + ); + } + + /** + * @notice Returns the precalculated address of a wrapper using the token information + * Note Updating the metadata of a token is not supported. + * Since the metadata has relevance in the address deployed, this function will not return a valid + * wrapped address if the metadata provided is not the original one. + * @param originNetwork Origin network + * @param originTokenAddress Origin token address, 0 address is reserved for ether + * @param name Name of the token + * @param symbol Symbol of the token + * @param decimals Decimals of the token + */ + function precalculatedWrapperAddress( + uint32 originNetwork, + address originTokenAddress, + string calldata name, + string calldata symbol, + uint8 decimals + ) external view returns (address) { + bytes32 salt = keccak256( + abi.encodePacked(originNetwork, originTokenAddress) + ); + + bytes32 hashCreate2 = keccak256( + abi.encodePacked( + bytes1(0xff), + address(this), + salt, + keccak256( + abi.encodePacked( + type(TokenWrapped).creationCode, + abi.encode(name, symbol, decimals) + ) + ) + ) + ); + + // last 20 bytes of hash to address + return address(uint160(uint256(hashCreate2))); + } + + /** + * @notice Returns the address of a wrapper using the token information if already exist + * @param originNetwork Origin network + * @param originTokenAddress Origin token address, 0 address is reserved for ether + */ + function getTokenWrappedAddress( + uint32 originNetwork, + address originTokenAddress + ) external view returns (address) { + return + tokenInfoToWrappedToken[ + keccak256(abi.encodePacked(originNetwork, originTokenAddress)) + ]; + } + + /** + * @notice Function to activate the emergency state + " Only can be called by the Polygon ZK-EVM in extreme situations + */ + function activateEmergencyState() external onlyPolygonZkEVM { + _activateEmergencyState(); + } + + /** + * @notice Function to deactivate the emergency state + " Only can be called by the Polygon ZK-EVM + */ + function deactivateEmergencyState() external onlyPolygonZkEVM { + _deactivateEmergencyState(); + } + + /** + * @notice Verify leaf and checks that it has not been claimed + * @param smtProof Smt proof + * @param globalIndex Index of the leaf + * @param mainnetExitRoot Mainnet exit root + * @param rollupExitRoot Rollup exit root + * @param originNetwork Origin network + * @param originAddress Origin address + * @param destinationNetwork Network destination + * @param destinationAddress Address destination + * @param amount Amount of tokens + * @param metadata Abi encoded metadata if any, empty otherwise + * @param leafType Leaf type --> [0] transfer Ether / ERC20 tokens, [1] message + */ + function _verifyLeaf( + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, + uint256 globalIndex, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + uint32 originNetwork, + address originAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes calldata metadata, + uint8 leafType + ) internal { + uint256 leafIndex; + + if (globalIndex & _GLOBAL_INDEX_MAINNET_FLAG == 0) { + // Rollup claim + + // Verify merkle proof using rollup exit root + claimRoot = rollupExitRoot; + if ( + !verifyMerkleProof( + getLeafValue( + leafType, + originNetwork, + originAddress, + destinationNetwork, + destinationAddress, + amount, + keccak256(metadata) + ), + smtProof, + index, + rollupExitRoot + ) + ) { + revert InvalidSmtProof(); + } + } else { + // mainnet claim + + // verify merkle proof using mainnet exit root + if ( + !verifyMerkleProof( + getLeafValue( + leafType, + originNetwork, + originAddress, + destinationNetwork, + destinationAddress, + amount, + keccak256(metadata) + ), + smtProof, + index, + mainnetExitRoot + ) + ) { + revert InvalidSmtProof(); + } + } + + // Set and check nullifier + _setAndCheckClaimed(leafIndex, originNetwork); + + // Check timestamp where the global exit root was set + uint256 timestampGlobalExitRoot = globalExitRootManager + .globalExitRootMap( + GlobalExitRootLib.calculateGlobalExitRoot( + mainnetExitRoot, + rollupExitRoot + ) + ); + + if (timestampGlobalExitRoot == 0) { + revert GlobalExitRootInvalid(); + } + + // Destination network must be networkID + if (destinationNetwork != networkID) { + revert DestinationNetworkInvalid(); + } + + bytes32 claimRoot; + if (networkID == _MAINNET_NETWORK_ID) { + // Verify merkle proof using rollup exit root + claimRoot = rollupExitRoot; + } else { + // Verify merkle proof using mainnet exit root + claimRoot = mainnetExitRoot; + } + } + + /** + * @notice Function to check if an index is claimed or not + * @param index Index + * @param originNetwork origin network + */ + function isClaimed( + uint32 index, + uint32 originNetwork + ) external view returns (bool) { + uint256 globalIndex; + + // For consistency with the previous setted nullifiers + if ( + networkID == _MAINNET_NETWORK_ID && + originNetwork == _ZKEVM_NETWORK_ID + ) { + globalIndex = uint256(index); + } else { + globalIndex = + uint256(index) + + uint256(originNetwork) * + _MAX_LEAFS_PER_NETWORK; + } + (uint256 wordPos, uint256 bitPos) = _bitmapPositions(globalIndex); + uint256 mask = (1 << bitPos); + return (claimedBitMap[wordPos] & mask) == mask; + } + + /** + * @notice Function to check that an index is not claimed and set it as claimed + * @param leafIndex Index + * @param originNetwork origin network + */ + function _setAndCheckClaimed( + uint256 leafIndex, + uint256 originNetwork + ) private { + uint256 globalIndex = leafIndex + + originNetwork * + _MAX_LEAFS_PER_NETWORK; + (uint256 wordPos, uint256 bitPos) = _bitmapPositions(globalIndex); + uint256 mask = 1 << bitPos; + uint256 flipped = claimedBitMap[wordPos] ^= mask; + if (flipped & mask == 0) { + revert AlreadyClaimed(); + } + } + + /** + * @notice Function to update the globalExitRoot if the last deposit is not submitted + */ + function updateGlobalExitRoot() external { + if (lastUpdatedDepositCount < depositCount) { + _updateGlobalExitRoot(); + } + } + + /** + * @notice Function to update the globalExitRoot + */ + function _updateGlobalExitRoot() internal { + lastUpdatedDepositCount = uint32(depositCount); + globalExitRootManager.updateExitRoot(getRoot()); + } + + /** + * @notice Function decode an index into a wordPos and bitPos + * @param index Index + */ + function _bitmapPositions( + uint256 index + ) private pure returns (uint256 wordPos, uint256 bitPos) { + wordPos = uint248(index >> 8); + bitPos = uint8(index); + } + + /** + * @notice Function to call token permit method of extended ERC20 + + @param token ERC20 token address + * @param amount Quantity that is expected to be allowed + * @param permitData Raw data of the call `permit` of the token + */ + function _permit( + address token, + uint256 amount, + bytes calldata permitData + ) internal { + bytes4 sig = bytes4(permitData[:4]); + if (sig == _PERMIT_SIGNATURE) { + ( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) = abi.decode( + permitData[4:], + ( + address, + address, + uint256, + uint256, + uint8, + bytes32, + bytes32 + ) + ); + if (owner != msg.sender) { + revert NotValidOwner(); + } + if (spender != address(this)) { + revert NotValidSpender(); + } + + if (value != amount) { + revert NotValidAmount(); + } + + // we call without checking the result, in case it fails and he doesn't have enough balance + // the following transferFrom should be fail. This prevents DoS attacks from using a signature + // before the smartcontract call + /* solhint-disable avoid-low-level-calls */ + address(token).call( + abi.encodeWithSelector( + _PERMIT_SIGNATURE, + owner, + spender, + value, + deadline, + v, + r, + s + ) + ); + } else { + if (sig != _PERMIT_SIGNATURE_DAI) { + revert NotValidSignature(); + } + + ( + address holder, + address spender, + uint256 nonce, + uint256 expiry, + bool allowed, + uint8 v, + bytes32 r, + bytes32 s + ) = abi.decode( + permitData[4:], + ( + address, + address, + uint256, + uint256, + bool, + uint8, + bytes32, + bytes32 + ) + ); + + if (holder != msg.sender) { + revert NotValidOwner(); + } + + if (spender != address(this)) { + revert NotValidSpender(); + } + + // we call without checking the result, in case it fails and he doesn't have enough balance + // the following transferFrom should be fail. This prevents DoS attacks from using a signature + // before the smartcontract call + /* solhint-disable avoid-low-level-calls */ + address(token).call( + abi.encodeWithSelector( + _PERMIT_SIGNATURE_DAI, + holder, + spender, + nonce, + expiry, + allowed, + v, + r, + s + ) + ); + } + } + + // Helpers to safely get the metadata from a token, inspired by https://github.com/traderjoe-xyz/joe-core/blob/main/contracts/MasterChefJoeV3.sol#L55-L95 + + /** + * @notice Provides a safe ERC20.symbol version which returns 'NO_SYMBOL' as fallback string + * @param token The address of the ERC-20 token contract + */ + function _safeSymbol(address token) internal view returns (string memory) { + (bool success, bytes memory data) = address(token).staticcall( + abi.encodeCall(IERC20MetadataUpgradeable.symbol, ()) + ); + return success ? _returnDataToString(data) : "NO_SYMBOL"; + } + + /** + * @notice Provides a safe ERC20.name version which returns 'NO_NAME' as fallback string. + * @param token The address of the ERC-20 token contract. + */ + function _safeName(address token) internal view returns (string memory) { + (bool success, bytes memory data) = address(token).staticcall( + abi.encodeCall(IERC20MetadataUpgradeable.name, ()) + ); + return success ? _returnDataToString(data) : "NO_NAME"; + } + + /** + * @notice Provides a safe ERC20.decimals version which returns '18' as fallback value. + * Note Tokens with (decimals > 255) are not supported + * @param token The address of the ERC-20 token contract + */ + function _safeDecimals(address token) internal view returns (uint8) { + (bool success, bytes memory data) = address(token).staticcall( + abi.encodeCall(IERC20MetadataUpgradeable.decimals, ()) + ); + return success && data.length == 32 ? abi.decode(data, (uint8)) : 18; + } + + /** + * @notice Function to convert returned data to string + * returns 'NOT_VALID_ENCODING' as fallback value. + * @param data returned data + */ + function _returnDataToString( + bytes memory data + ) internal pure returns (string memory) { + if (data.length >= 64) { + return abi.decode(data, (string)); + } else if (data.length == 32) { + // Since the strings on bytes32 are encoded left-right, check the first zero in the data + uint256 nonZeroBytes; + while (nonZeroBytes < 32 && data[nonZeroBytes] != 0) { + nonZeroBytes++; + } + + // If the first one is 0, we do not handle the encoding + if (nonZeroBytes == 0) { + return "NOT_VALID_ENCODING"; + } + // Create a byte array with nonZeroBytes length + bytes memory bytesArray = new bytes(nonZeroBytes); + for (uint256 i = 0; i < nonZeroBytes; i++) { + bytesArray[i] = data[i]; + } + return string(bytesArray); + } else { + return "NOT_VALID_ENCODING"; + } + } +} diff --git a/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol b/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol new file mode 100644 index 000000000..27453d83c --- /dev/null +++ b/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol @@ -0,0 +1,107 @@ +// SPDX-License-Identifier: AGPL-3.0 + +pragma solidity 0.8.17; + +import "../interfaces/IPolygonZkEVMGlobalExitRoot.sol"; +import "../lib/GlobalExitRootLib.sol"; +import "../lib/DepositContractLib.sol"; + +/** + * Contract responsible for managing the exit roots across multiple networks + */ +contract PolygonZkEVMGlobalExitRootV2 is + IPolygonZkEVMGlobalExitRoot, + DepositContractLib +{ + // PolygonZkEVMBridge address + address public immutable bridgeAddress; + + // Rollup manager contract address + address public immutable rollupManager; + + // Rollup root, contains all exit roots of all rollups + bytes32 public lastRollupExitRoot; + + // Mainnet exit root, this will be updated every time a deposit is made in mainnet + bytes32 public lastMainnetExitRoot; + + // Store every global exit root: Root --> timestamp + mapping(bytes32 => uint256) public globalExitRootMap; + + /** + * @dev Emitted when the global exit root is updated + */ + event UpdateGlobalExitRoot( + bytes32 indexed mainnetExitRoot, + bytes32 indexed rollupExitRoot + ); + + /** + * @param _rollupManager Rollup contract address + * @param _bridgeAddress PolygonZkEVMBridge contract address + */ + constructor(address _rollupManager, address _bridgeAddress) { + rollupManager = _rollupManager; + bridgeAddress = _bridgeAddress; + } + + /** + * @notice Update the exit root of one of the networks and the global exit root + * @param newRoot new exit tree root + */ + function updateExitRoot(bytes32 newRoot) external { + // Store storage variables into temporal variables since will be used multiple times + bytes32 cacheLastRollupExitRoot = lastRollupExitRoot; + bytes32 cacheLastMainnetExitRoot = lastMainnetExitRoot; + + if (msg.sender == bridgeAddress) { + lastMainnetExitRoot = newRoot; + cacheLastMainnetExitRoot = newRoot; + } else if (msg.sender == rollupManager) { + lastRollupExitRoot = newRoot; + cacheLastRollupExitRoot = newRoot; + } else { + revert OnlyAllowedContracts(); + } + + bytes32 newGlobalExitRoot = GlobalExitRootLib.calculateGlobalExitRoot( + cacheLastMainnetExitRoot, + cacheLastRollupExitRoot + ); + + // If it already exists, do not modify the timestamp + if (globalExitRootMap[newGlobalExitRoot] == 0) { + globalExitRootMap[newGlobalExitRoot] = block.timestamp; + emit UpdateGlobalExitRoot( + cacheLastMainnetExitRoot, + cacheLastRollupExitRoot + ); + + // Update the historical roots + _addLeaf(newGlobalExitRoot); + } + } + + /** + * @notice Return last global exit root + */ + function getLastGlobalExitRoot() public view returns (bytes32) { + return + GlobalExitRootLib.calculateGlobalExitRoot( + lastMainnetExitRoot, + lastRollupExitRoot + ); + } + + /** + * @notice Computes and returns the merkle root + */ + function getRoot() + public + view + override(DepositContractLib, IPolygonZkEVMGlobalExitRoot) + returns (bytes32) + { + return super.getRoot(); + } +} \ No newline at end of file From a66c38e3befa928a877b937a3de948a5801be83e Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 22 Aug 2023 14:50:32 +0200 Subject: [PATCH 013/230] update version 0.8.20 --- compiled-contracts/PolygonZkEVM.json | 41 +- compiled-contracts/PolygonZkEVMBridge.json | 30 +- .../PolygonZkEVMBridgeMock.json | 30 +- .../PolygonZkEVMGlobalExitRoot.json | 69 +- .../PolygonZkEVMGlobalExitRootMock.json | 69 +- compiled-contracts/PolygonZkEVMMock.json | 46 +- compiled-contracts/PolygonZkEVMTimelock.json | 4 +- .../interfaces/IPolygonRollupManager.sol | 2 +- contracts/lib/DepositContractLib.sol | 2 +- contracts/v2/PolygonStateManager.sol | 2 +- contracts/v2/PolygonZkEVMBridgeV2.sol | 1843 ++++++++--------- contracts/v2/PolygonZkEVMGlobalExitRootV2.sol | 2 +- docs/v2/PolygonRollupManager.md | 86 + docs/v2/PolygonZkEVMGlobalExitRootV2.md | 13 +- 14 files changed, 1229 insertions(+), 1010 deletions(-) create mode 100644 docs/v2/PolygonRollupManager.md diff --git a/compiled-contracts/PolygonZkEVM.json b/compiled-contracts/PolygonZkEVM.json index 981bf9bf9..6d522c51b 100644 --- a/compiled-contracts/PolygonZkEVM.json +++ b/compiled-contracts/PolygonZkEVM.json @@ -848,6 +848,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "gapLastTimestamp", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "getForcedBatchFee", @@ -1096,19 +1109,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "lastTimestamp", - "outputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "lastVerifiedBatch", @@ -1351,14 +1351,9 @@ }, { "internalType": "bytes32", - "name": "globalExitRoot", + "name": "forcedHistoricGlobalExitRoot", "type": "bytes32" }, - { - "internalType": "uint64", - "name": "timestamp", - "type": "uint64" - }, { "internalType": "uint64", "name": "minForcedTimestamp", @@ -1391,7 +1386,7 @@ }, { "internalType": "bytes32", - "name": "globalExitRoot", + "name": "forcedHistoricGlobalExitRoot", "type": "bytes32" }, { @@ -1400,7 +1395,7 @@ "type": "uint64" } ], - "internalType": "struct PolygonZkEVM.ForcedBatchData[]", + "internalType": "struct PolygonZkEVM.BatchData[]", "name": "batches", "type": "tuple[]" } @@ -1711,8 +1706,8 @@ "type": "function" } ], - "bytecode": "0x61014060405234801562000011575f80fd5b5060405162005f6438038062005f648339810160408190526200003491620000a2565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b039182166101005216610120526200012a565b6001600160a01b038116811462000083575f80fd5b50565b80516001600160401b03811681146200009d575f80fd5b919050565b5f805f805f8060c08789031215620000b8575f80fd5b8651620000c5816200006e565b6020880151909650620000d8816200006e565b6040880151909550620000eb816200006e565b6060880151909450620000fe816200006e565b92506200010e6080880162000086565b91506200011e60a0880162000086565b90509295509295509295565b60805160a05160c05160e0516101005161012051615d74620001f05f395f818161068201528181610dd3015261311d01525f81816107ee0152610da901525f81816107b401528181611d60015281816137ae0152614c0001525f818161095901528181610f45015281816111100152818161196d0152818161212e0152818161398f01526146d801525f8181610a0601528181614041015261448f01525f81816108a901528181611d2e0152818161261301528181613964015261412d0152615d745ff3fe608060405234801561000f575f80fd5b50600436106103a9575f3560e01c8063841b24d7116101ea578063c754c7ed11610114578063e7a7ed02116100a9578063f14916d611610079578063f14916d614610a68578063f2fde38b14610a7b578063f851a44014610a8e578063f8b823e414610aae575f80fd5b8063e7a7ed02146109d1578063e8bf92ed14610a01578063eaeb077b14610a28578063ed6b010414610a3b575f80fd5b8063d2e129f9116100e4578063d2e129f91461097b578063d8d1091b1461098e578063d939b315146109a1578063dbc16976146109c9575f80fd5b8063c754c7ed146108e6578063c89e42df14610912578063cfa8ed4714610925578063d02103ca14610954575f80fd5b8063a3c573eb1161018a578063b4d63f581161015a578063b4d63f581461083e578063b6b0b097146108a4578063ba58ae39146108cb578063c0ed84e0146108de575f80fd5b8063a3c573eb146107af578063ada8f919146107d6578063adc879e9146107e9578063afd23cbe14610810575f80fd5b806399f5634e116101c557806399f5634e1461076e5780639aa972a3146107765780639c9f3dfe14610789578063a066215c1461079c575f80fd5b8063841b24d7146107185780638c3d7301146107485780638da5cb5b14610750575f80fd5b80634a1a89a7116102d6578063621dd4111161026b5780637215541a1161023b5780637215541a146106565780637fcb365314610669578063831c7ead1461067d578063837a4738146106a4575f80fd5b8063621dd411146106095780636b8616ce1461061c5780636ff512cc1461063b578063715018a61461064e575f80fd5b8063542028d5116102a6578063542028d5146105de5780635e9145c9146105e65780635ec91958146105f95780636046916914610601575f80fd5b80634a1a89a71461056b5780634a910e6a1461058b5780634e4877061461059e5780635392c5e0146105b1575f80fd5b8063298789831161034c578063394218e91161031c578063394218e9146104fc578063423fa8561461050f578063456052671461052f578063458c047714610557575f80fd5b806329878983146104975780632b0006fa146104c35780632c1f816a146104d6578063383b3be8146104e9575f80fd5b80631816b7e5116103875780631816b7e51461041657806319d8ac611461042b578063220d78991461043f5780632678224714610452575f80fd5b80630a0d9fbe146103ad578063107bf28c146103e457806315064c96146103f9575b5f80fd5b606f546103c690610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6103ec610ab7565b6040516103db919061521a565b606f546104069060ff1681565b60405190151581526020016103db565b610429610424366004615233565b610b43565b005b6073546103c69067ffffffffffffffff1681565b6103ec61044d36600461526b565b610c5b565b607b546104729073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103db565b6074546104729068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104296104d13660046152cb565b610e31565b6104296104e436600461532f565b610ffb565b6104066104f73660046153a4565b611203565b61042961050a3660046153a4565b611258565b6073546103c69068010000000000000000900467ffffffffffffffff1681565b6073546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546103c69067ffffffffffffffff1681565b6079546103c69068010000000000000000900467ffffffffffffffff1681565b6104296105993660046153a4565b6113dc565b6104296105ac3660046153a4565b61148f565b6105d06105bf3660046153a4565b60756020525f908152604090205481565b6040519081526020016103db565b6103ec611613565b6104296105f4366004615428565b611620565b610429611e19565b6105d0611f18565b6104296106173660046152cb565b611f2d565b6105d061062a3660046153a4565b60716020525f908152604090205481565b610429610649366004615478565b6122ab565b610429612380565b6104296106643660046153a4565b612393565b6074546103c69067ffffffffffffffff1681565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b6106ec6106b2366004615491565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016103db565b6079546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b610429612500565b60335473ffffffffffffffffffffffffffffffffffffffff16610472565b6105d06125cc565b61042961078436600461532f565b61271f565b6104296107973660046153a4565b6127cf565b6104296107aa3660046153a4565b61294b565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104296107e4366004615478565b612a51565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b606f5461082b906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103db565b61087e61084c3660046153a4565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016103db565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104066108d9366004615491565b612b15565b6103c6612b9d565b607b546103c69074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b61042961092036600461557c565b612bf0565b606f54610472906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104296109893660046155ec565b612c7d565b61042961099c366004615697565b6131c0565b6079546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b61042961375b565b6073546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b610429610a363660046156d6565b61382f565b607b54610406907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b610429610a76366004615478565b613c1f565b610429610a89366004615478565b613cf1565b607a546104729073ffffffffffffffffffffffffffffffffffffffff1681565b6105d060705481565b60778054610ac49061571e565b80601f0160208091040260200160405190810160405280929190818152602001828054610af09061571e565b8015610b3b5780601f10610b1257610100808354040283529160200191610b3b565b820191905f5260205f20905b815481529060010190602001808311610b1e57829003601f168201915b505050505081565b607a5473ffffffffffffffffffffffffffffffffffffffff163314610b94576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff161080610bad57506103ff8161ffff16115b15610be4576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590610c8e575081155b15610cc5576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610cfc576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d0584612b15565b610d3b576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610e8e576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e9c868686868686613da5565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615610f1657607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015610f9b575f80fd5b505af1158015610fad573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611058576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61106787878787878787614160565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156110e157607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611166575f80fd5b505af1158015611178573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611246927001000000000000000000000000000000009092048116911661579c565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146112a9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156112f0576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661135f5760795467ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169082161061135f576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610c50565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461148357606f5460ff1615611444576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61144d81611203565b611483576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61148c8161458f565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146114e0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611527576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661159257607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610611592576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001610c50565b60768054610ac49061571e565b606f5460ff161561165d576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146116bd576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f8190036116f8576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611734576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f81815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b86811015611b7c575f8a8a8381811061179a5761179a6157c4565b90506020028101906117ac91906157f1565b6117b59061582d565b8051805160209091012060608201519192509067ffffffffffffffff161561192a57856117e1816158b7565b9650505f818360200151846060015160405160200161183893929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f908152607190935291205490915081146118c0576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088165f908152607160205260408082209190915560608501519085015190821691161015611924576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611a64565b6020820151158015906119ee575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af11580156119c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ec91906158dd565b155b15611a25576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611a64576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080611a97575042826040015167ffffffffffffffff16115b15611ace576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151975050508080611b74906158f4565b91505061177f565b50611b87868561579c565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115611bf0576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611bfb828561592b565b611c0f9067ffffffffffffffff168861594c565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611d0457607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611d56333083607054611d17919061595f565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692919061479c565b611d5e61487e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611dc3575f80fd5b505af1158015611dd5573d5f803e3d5ffd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611e6a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16611ec6576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f6070546064611f28919061595f565b905090565b606f5460ff1615611f6a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f908152607260205260409020600101544292611fb69278010000000000000000000000000000000000000000000000009091048116911661579c565b67ffffffffffffffff161115611ff8576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612005868661592b565b67ffffffffffffffff161115612047576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612055868686868686613da5565b61205e8461492d565b607954700100000000000000000000000000000000900467ffffffffffffffff165f0361219f57607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156120ff57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612184575f80fd5b505af1158015612196573d5f803e3d5ffd5b5050505061226d565b6121a761487e565b6079805467ffffffffffffffff16905f6121c0836158b7565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001610feb565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146122fc576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c50565b612388614b07565b6123915f614b88565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146124f8575f6123bb612b9d565b90508067ffffffffffffffff168267ffffffffffffffff161161240a576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000009091048116908316118061244f575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15612486576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916124b49162093a80911661579c565b67ffffffffffffffff1611156124f6576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61148c614bfe565b607b5473ffffffffffffffffffffffffffffffffffffffff163314612551576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015612658573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061267c91906158dd565b90505f612687612b9d565b60735467ffffffffffffffff6801000000000000000082048116916126df917001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041661592b565b6126e9919061579c565b6126f3919061592b565b67ffffffffffffffff169050805f0361270e575f9250505090565b61271881836159a3565b9250505090565b606f5460ff161561275c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61276b87878787878787614160565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16127c6614bfe565b50505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612820576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115612867576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166128ce5760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106128ce576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461299c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156129e3576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612aa2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c50565b5f67ffffffff0000000167ffffffffffffffff8316108015612b4c575067ffffffff00000001604083901c67ffffffffffffffff16105b8015612b6d575067ffffffff00000001608083901c67ffffffffffffffff16105b8015612b84575067ffffffff0000000160c083901c105b15612b9157506001919050565b505f919050565b919050565b6079545f9067ffffffffffffffff1615612bdf575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612c41576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6076612c4d8282615a03565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c50919061521a565b5f54610100900460ff1615808015612c9b57505f54600160ff909116105b80612cb45750303b158015612cb457505f5460ff166001145b612d45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612da1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b612dae6020880188615478565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612e036040880160208901615478565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055612e686080880160608901615478565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076612ef28682615a03565b506077612eff8582615a03565b5062093a80612f146060890160408a016153a4565b67ffffffffffffffff161115612f56576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f6660608801604089016153a4565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80612fc860a0890160808a016153a4565b67ffffffffffffffff16111561300a576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61301a60a08801608089016153a4565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c01000000000006978000000000000000000000000000000000000000001790556130f9614c81565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f0000000000000000000000000000000000000000000000000000000000000000858560405161314e9493929190615b62565b60405180910390a180156127c6575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561321d576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff161561325a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613295576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156132d1576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff7801000000000000000000000000000000000000000000000000820481169161331c918491700100000000000000000000000000000000900416615b99565b1115613354576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b848110156135f9575f8787838181106133b2576133b26157c4565b90506020028101906133c49190615bac565b6133cd90615bde565b9050836133d9816158b7565b825180516020918201208185015160408087015190519499509194505f9361343a9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146134c2576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f908152607160205260408120556134e660018961594c565b84036135555742607b60149054906101000a900467ffffffffffffffff168460400151613513919061579c565b67ffffffffffffffff161115613555576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806135f1906158f4565b915050613397565b50613604848461579c565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146137ac576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613811575f80fd5b505af1158015613823573d5f803e3d5ffd5b50505050612391614d20565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561388c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16156138c9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6138d2611f18565b90508181111561390e576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138883111561394a576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61398c73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308461479c565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139f6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a1a91906158dd565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16906018613a54836158b7565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051613a8b929190615c57565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303613bb9576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613c18565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613c0f9493929190615c66565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613c70576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610c50565b613cf9614b07565b73ffffffffffffffffffffffffffffffffffffffff8116613d9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401612d3c565b61148c81614b88565b5f80613daf612b9d565b905067ffffffffffffffff881615613e7e5760795467ffffffffffffffff9081169089161115613e0b576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614613e78576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50613f1e565b67ffffffffffffffff87165f90815260756020526040902054915081613ed0576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115613f1e576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611613f6b576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613f798888888689610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051613fad9190615c9b565b602060405180830381855afa158015613fc8573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613feb91906158dd565b613ff59190615cac565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161407791899190600401615cbf565b602060405180830381865afa158015614092573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140b69190615cf9565b6140ec576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614154336140fa858b61592b565b67ffffffffffffffff1661410c6125cc565b614116919061595f565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190614dae565b50505050505050505050565b5f67ffffffffffffffff88161561422c5760795467ffffffffffffffff90811690891611156141bb576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614614226576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506142c7565b5067ffffffffffffffff85165f908152607560205260409020548061427d576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff90811690871611156142c7576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff90811690881611806142f957508767ffffffffffffffff168767ffffffffffffffff1611155b80614320575060795467ffffffffffffffff68010000000000000000909104811690881611155b15614357576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f908152607860205260409020546801000000000000000090048116908616146143b9576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6143c78787878588610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516143fb9190615c9b565b602060405180830381855afa158015614416573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061443991906158dd565b6144439190615cac565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916144c591889190600401615cbf565b602060405180830381865afa1580156144e0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145049190615cf9565b61453a576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614154576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff6801000000000000000090910481169082161115806145c9575060795467ffffffffffffffff908116908216115b15614600576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b15801561472e575f80fd5b505af1158015614740573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161478f91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526148789085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614e09565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115612391576079545f906148c69068010000000000000000900467ffffffffffffffff16600161579c565b90506148d181611203565b1561148c576079545f906002906148f390849067ffffffffffffffff1661592b565b6148fd9190615d18565b614907908361579c565b905061491281611203565b15614924576149208161458f565b5050565b6149208261458f565b5f614936612b9d565b9050815f80614945848461592b565b606f5467ffffffffffffffff91821692505f91614968916101009004164261594c565b90505b8467ffffffffffffffff168467ffffffffffffffff16146149f25767ffffffffffffffff8085165f90815260726020526040902060018101549091168210156149d057600181015468010000000000000000900467ffffffffffffffff1694506149ec565b6149da868661592b565b67ffffffffffffffff169350506149f2565b5061496b565b5f6149fd848461594c565b905083811015614a5457808403600c8111614a185780614a1b565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281614a4a57614a4a615976565b0460705550614ac3565b838103600c8111614a655780614a68565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a76400000281614a9e57614a9e615976565b04905080607054670de0b6b3a76400000281614abc57614abc615976565b0460705550505b683635c9adc5dea000006070541115614ae857683635c9adc5dea000006070556127c6565b633b9aca0060705410156127c657633b9aca0060705550505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314612391576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612d3c565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015614c63575f80fd5b505af1158015614c75573d5f803e3d5ffd5b50505050612391614f14565b5f54610100900460ff16614d17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401612d3c565b61239133614b88565b606f5460ff16614d5c576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052614e049084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016147f6565b505050565b5f614e6a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16614fa69092919063ffffffff16565b805190915015614e045780806020019051810190614e889190615cf9565b614e04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401612d3c565b606f5460ff1615614f51576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b6060614fb484845f85614fbc565b949350505050565b60608247101561504e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401612d3c565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516150769190615c9b565b5f6040518083038185875af1925050503d805f81146150b0576040519150601f19603f3d011682016040523d82523d5f602084013e6150b5565b606091505b50915091506150c6878383876150d1565b979650505050505050565b606083156151665782515f0361515f5773ffffffffffffffffffffffffffffffffffffffff85163b61515f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612d3c565b5081614fb4565b614fb4838381511561517b5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3c919061521a565b5f5b838110156151c95781810151838201526020016151b1565b50505f910152565b5f81518084526151e88160208601602086016151af565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61522c60208301846151d1565b9392505050565b5f60208284031215615243575f80fd5b813561ffff8116811461522c575f80fd5b803567ffffffffffffffff81168114612b98575f80fd5b5f805f805f60a0868803121561527f575f80fd5b61528886615254565b945061529660208701615254565b94979496505050506040830135926060810135926080909101359150565b8061030081018310156152c5575f80fd5b92915050565b5f805f805f806103a087890312156152e1575f80fd5b6152ea87615254565b95506152f860208801615254565b945061530660408801615254565b935060608701359250608087013591506153238860a089016152b4565b90509295509295509295565b5f805f805f805f6103c0888a031215615346575f80fd5b61534f88615254565b965061535d60208901615254565b955061536b60408901615254565b945061537960608901615254565b93506080880135925060a088013591506153968960c08a016152b4565b905092959891949750929550565b5f602082840312156153b4575f80fd5b61522c82615254565b5f8083601f8401126153cd575f80fd5b50813567ffffffffffffffff8111156153e4575f80fd5b6020830191508360208260051b85010111156153fe575f80fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612b98575f80fd5b5f805f6040848603121561543a575f80fd5b833567ffffffffffffffff811115615450575f80fd5b61545c868287016153bd565b909450925061546f905060208501615405565b90509250925092565b5f60208284031215615488575f80fd5b61522c82615405565b5f602082840312156154a1575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126154e4575f80fd5b813567ffffffffffffffff808211156154ff576154ff6154a8565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715615545576155456154a8565b8160405283815286602085880101111561555d575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6020828403121561558c575f80fd5b813567ffffffffffffffff8111156155a2575f80fd5b614fb4848285016154d5565b5f8083601f8401126155be575f80fd5b50813567ffffffffffffffff8111156155d5575f80fd5b6020830191508360208285010111156153fe575f80fd5b5f805f805f80868803610120811215615603575f80fd5b60a0811215615610575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff80821115615635575f80fd5b6156418a838b016154d5565b955060e0890135915080821115615656575f80fd5b6156628a838b016154d5565b9450610100890135915080821115615678575f80fd5b5061568589828a016155ae565b979a9699509497509295939492505050565b5f80602083850312156156a8575f80fd5b823567ffffffffffffffff8111156156be575f80fd5b6156ca858286016153bd565b90969095509350505050565b5f805f604084860312156156e8575f80fd5b833567ffffffffffffffff8111156156fe575f80fd5b61570a868287016155ae565b909790965060209590950135949350505050565b600181811c9082168061573257607f821691505b602082108103615769577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156157bd576157bd61576f565b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112615823575f80fd5b9190910192915050565b5f6080823603121561583d575f80fd5b6040516080810167ffffffffffffffff8282108183111715615861576158616154a8565b816040528435915080821115615875575f80fd5b50615882368286016154d5565b8252506020830135602082015261589b60408401615254565b60408201526158ac60608401615254565b606082015292915050565b5f67ffffffffffffffff8083168181036158d3576158d361576f565b6001019392505050565b5f602082840312156158ed575f80fd5b5051919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036159245761592461576f565b5060010190565b67ffffffffffffffff8281168282160390808211156157bd576157bd61576f565b818103818111156152c5576152c561576f565b80820281158282048414176152c5576152c561576f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f826159b1576159b1615976565b500490565b601f821115614e04575f81815260208120601f850160051c810160208610156159dc5750805b601f850160051c820191505b818110156159fb578281556001016159e8565b505050505050565b815167ffffffffffffffff811115615a1d57615a1d6154a8565b615a3181615a2b845461571e565b846159b6565b602080601f831160018114615a83575f8415615a4d5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556159fb565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615acf57888601518255948401946001909101908401615ab0565b5085821015615b0b57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152615b8f606083018486615b1b565b9695505050505050565b808201808211156152c5576152c561576f565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112615823575f80fd5b5f60608236031215615bee575f80fd5b6040516060810167ffffffffffffffff8282108183111715615c1257615c126154a8565b816040528435915080821115615c26575f80fd5b50615c33368286016154d5565b82525060208301356020820152615c4c60408401615254565b604082015292915050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f615b8f606083018486615b1b565b5f82516158238184602087016151af565b5f82615cba57615cba615976565b500690565b6103208101610300808584378201835f5b6001811015615cef578151835260209283019290910190600101615cd0565b5050509392505050565b5f60208284031215615d09575f80fd5b8151801515811461522c575f80fd5b5f67ffffffffffffffff80841680615d3257615d32615976565b9216919091049291505056fea2646970667358221220a50e6fa85418d984e88c8f7daf5faf4ee5e483c8bc96c6d92f33fe24b3cf94f764736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106103a9575f3560e01c8063841b24d7116101ea578063c754c7ed11610114578063e7a7ed02116100a9578063f14916d611610079578063f14916d614610a68578063f2fde38b14610a7b578063f851a44014610a8e578063f8b823e414610aae575f80fd5b8063e7a7ed02146109d1578063e8bf92ed14610a01578063eaeb077b14610a28578063ed6b010414610a3b575f80fd5b8063d2e129f9116100e4578063d2e129f91461097b578063d8d1091b1461098e578063d939b315146109a1578063dbc16976146109c9575f80fd5b8063c754c7ed146108e6578063c89e42df14610912578063cfa8ed4714610925578063d02103ca14610954575f80fd5b8063a3c573eb1161018a578063b4d63f581161015a578063b4d63f581461083e578063b6b0b097146108a4578063ba58ae39146108cb578063c0ed84e0146108de575f80fd5b8063a3c573eb146107af578063ada8f919146107d6578063adc879e9146107e9578063afd23cbe14610810575f80fd5b806399f5634e116101c557806399f5634e1461076e5780639aa972a3146107765780639c9f3dfe14610789578063a066215c1461079c575f80fd5b8063841b24d7146107185780638c3d7301146107485780638da5cb5b14610750575f80fd5b80634a1a89a7116102d6578063621dd4111161026b5780637215541a1161023b5780637215541a146106565780637fcb365314610669578063831c7ead1461067d578063837a4738146106a4575f80fd5b8063621dd411146106095780636b8616ce1461061c5780636ff512cc1461063b578063715018a61461064e575f80fd5b8063542028d5116102a6578063542028d5146105de5780635e9145c9146105e65780635ec91958146105f95780636046916914610601575f80fd5b80634a1a89a71461056b5780634a910e6a1461058b5780634e4877061461059e5780635392c5e0146105b1575f80fd5b8063298789831161034c578063394218e91161031c578063394218e9146104fc578063423fa8561461050f578063456052671461052f578063458c047714610557575f80fd5b806329878983146104975780632b0006fa146104c35780632c1f816a146104d6578063383b3be8146104e9575f80fd5b80631816b7e5116103875780631816b7e51461041657806319d8ac611461042b578063220d78991461043f5780632678224714610452575f80fd5b80630a0d9fbe146103ad578063107bf28c146103e457806315064c96146103f9575b5f80fd5b606f546103c690610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6103ec610ab7565b6040516103db919061521a565b606f546104069060ff1681565b60405190151581526020016103db565b610429610424366004615233565b610b43565b005b6073546103c69067ffffffffffffffff1681565b6103ec61044d36600461526b565b610c5b565b607b546104729073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103db565b6074546104729068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104296104d13660046152cb565b610e31565b6104296104e436600461532f565b610ffb565b6104066104f73660046153a4565b611203565b61042961050a3660046153a4565b611258565b6073546103c69068010000000000000000900467ffffffffffffffff1681565b6073546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546103c69067ffffffffffffffff1681565b6079546103c69068010000000000000000900467ffffffffffffffff1681565b6104296105993660046153a4565b6113dc565b6104296105ac3660046153a4565b61148f565b6105d06105bf3660046153a4565b60756020525f908152604090205481565b6040519081526020016103db565b6103ec611613565b6104296105f4366004615428565b611620565b610429611e19565b6105d0611f18565b6104296106173660046152cb565b611f2d565b6105d061062a3660046153a4565b60716020525f908152604090205481565b610429610649366004615478565b6122ab565b610429612380565b6104296106643660046153a4565b612393565b6074546103c69067ffffffffffffffff1681565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b6106ec6106b2366004615491565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016103db565b6079546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b610429612500565b60335473ffffffffffffffffffffffffffffffffffffffff16610472565b6105d06125cc565b61042961078436600461532f565b61271f565b6104296107973660046153a4565b6127cf565b6104296107aa3660046153a4565b61294b565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104296107e4366004615478565b612a51565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b606f5461082b906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103db565b61087e61084c3660046153a4565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016103db565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104066108d9366004615491565b612b15565b6103c6612b9d565b607b546103c69074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b61042961092036600461557c565b612bf0565b606f54610472906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104296109893660046155ec565b612c7d565b61042961099c366004615697565b6131c0565b6079546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b61042961375b565b6073546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b610429610a363660046156d6565b61382f565b607b54610406907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b610429610a76366004615478565b613c1f565b610429610a89366004615478565b613cf1565b607a546104729073ffffffffffffffffffffffffffffffffffffffff1681565b6105d060705481565b60778054610ac49061571e565b80601f0160208091040260200160405190810160405280929190818152602001828054610af09061571e565b8015610b3b5780601f10610b1257610100808354040283529160200191610b3b565b820191905f5260205f20905b815481529060010190602001808311610b1e57829003601f168201915b505050505081565b607a5473ffffffffffffffffffffffffffffffffffffffff163314610b94576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff161080610bad57506103ff8161ffff16115b15610be4576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590610c8e575081155b15610cc5576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610cfc576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d0584612b15565b610d3b576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610e8e576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e9c868686868686613da5565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615610f1657607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015610f9b575f80fd5b505af1158015610fad573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611058576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61106787878787878787614160565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156110e157607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611166575f80fd5b505af1158015611178573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611246927001000000000000000000000000000000009092048116911661579c565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146112a9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156112f0576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661135f5760795467ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169082161061135f576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610c50565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461148357606f5460ff1615611444576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61144d81611203565b611483576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61148c8161458f565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146114e0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611527576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661159257607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610611592576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001610c50565b60768054610ac49061571e565b606f5460ff161561165d576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146116bd576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f8190036116f8576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611734576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f81815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b86811015611b7c575f8a8a8381811061179a5761179a6157c4565b90506020028101906117ac91906157f1565b6117b59061582d565b8051805160209091012060608201519192509067ffffffffffffffff161561192a57856117e1816158b7565b9650505f818360200151846060015160405160200161183893929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f908152607190935291205490915081146118c0576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088165f908152607160205260408082209190915560608501519085015190821691161015611924576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611a64565b6020820151158015906119ee575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af11580156119c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ec91906158dd565b155b15611a25576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611a64576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080611a97575042826040015167ffffffffffffffff16115b15611ace576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151975050508080611b74906158f4565b91505061177f565b50611b87868561579c565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115611bf0576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611bfb828561592b565b611c0f9067ffffffffffffffff168861594c565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611d0457607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611d56333083607054611d17919061595f565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692919061479c565b611d5e61487e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611dc3575f80fd5b505af1158015611dd5573d5f803e3d5ffd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611e6a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16611ec6576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f6070546064611f28919061595f565b905090565b606f5460ff1615611f6a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f908152607260205260409020600101544292611fb69278010000000000000000000000000000000000000000000000009091048116911661579c565b67ffffffffffffffff161115611ff8576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612005868661592b565b67ffffffffffffffff161115612047576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612055868686868686613da5565b61205e8461492d565b607954700100000000000000000000000000000000900467ffffffffffffffff165f0361219f57607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156120ff57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612184575f80fd5b505af1158015612196573d5f803e3d5ffd5b5050505061226d565b6121a761487e565b6079805467ffffffffffffffff16905f6121c0836158b7565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001610feb565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146122fc576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c50565b612388614b07565b6123915f614b88565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146124f8575f6123bb612b9d565b90508067ffffffffffffffff168267ffffffffffffffff161161240a576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000009091048116908316118061244f575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15612486576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916124b49162093a80911661579c565b67ffffffffffffffff1611156124f6576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61148c614bfe565b607b5473ffffffffffffffffffffffffffffffffffffffff163314612551576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015612658573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061267c91906158dd565b90505f612687612b9d565b60735467ffffffffffffffff6801000000000000000082048116916126df917001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041661592b565b6126e9919061579c565b6126f3919061592b565b67ffffffffffffffff169050805f0361270e575f9250505090565b61271881836159a3565b9250505090565b606f5460ff161561275c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61276b87878787878787614160565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16127c6614bfe565b50505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612820576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115612867576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166128ce5760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106128ce576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461299c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156129e3576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612aa2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c50565b5f67ffffffff0000000167ffffffffffffffff8316108015612b4c575067ffffffff00000001604083901c67ffffffffffffffff16105b8015612b6d575067ffffffff00000001608083901c67ffffffffffffffff16105b8015612b84575067ffffffff0000000160c083901c105b15612b9157506001919050565b505f919050565b919050565b6079545f9067ffffffffffffffff1615612bdf575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612c41576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6076612c4d8282615a03565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c50919061521a565b5f54610100900460ff1615808015612c9b57505f54600160ff909116105b80612cb45750303b158015612cb457505f5460ff166001145b612d45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612da1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b612dae6020880188615478565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612e036040880160208901615478565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055612e686080880160608901615478565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076612ef28682615a03565b506077612eff8582615a03565b5062093a80612f146060890160408a016153a4565b67ffffffffffffffff161115612f56576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f6660608801604089016153a4565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80612fc860a0890160808a016153a4565b67ffffffffffffffff16111561300a576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61301a60a08801608089016153a4565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c01000000000006978000000000000000000000000000000000000000001790556130f9614c81565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f0000000000000000000000000000000000000000000000000000000000000000858560405161314e9493929190615b62565b60405180910390a180156127c6575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561321d576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff161561325a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613295576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156132d1576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff7801000000000000000000000000000000000000000000000000820481169161331c918491700100000000000000000000000000000000900416615b99565b1115613354576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b848110156135f9575f8787838181106133b2576133b26157c4565b90506020028101906133c49190615bac565b6133cd90615bde565b9050836133d9816158b7565b825180516020918201208185015160408087015190519499509194505f9361343a9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146134c2576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f908152607160205260408120556134e660018961594c565b84036135555742607b60149054906101000a900467ffffffffffffffff168460400151613513919061579c565b67ffffffffffffffff161115613555576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806135f1906158f4565b915050613397565b50613604848461579c565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146137ac576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613811575f80fd5b505af1158015613823573d5f803e3d5ffd5b50505050612391614d20565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561388c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16156138c9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6138d2611f18565b90508181111561390e576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138883111561394a576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61398c73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308461479c565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139f6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a1a91906158dd565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16906018613a54836158b7565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051613a8b929190615c57565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303613bb9576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613c18565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613c0f9493929190615c66565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613c70576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610c50565b613cf9614b07565b73ffffffffffffffffffffffffffffffffffffffff8116613d9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401612d3c565b61148c81614b88565b5f80613daf612b9d565b905067ffffffffffffffff881615613e7e5760795467ffffffffffffffff9081169089161115613e0b576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614613e78576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50613f1e565b67ffffffffffffffff87165f90815260756020526040902054915081613ed0576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115613f1e576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611613f6b576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613f798888888689610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051613fad9190615c9b565b602060405180830381855afa158015613fc8573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613feb91906158dd565b613ff59190615cac565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161407791899190600401615cbf565b602060405180830381865afa158015614092573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140b69190615cf9565b6140ec576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614154336140fa858b61592b565b67ffffffffffffffff1661410c6125cc565b614116919061595f565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190614dae565b50505050505050505050565b5f67ffffffffffffffff88161561422c5760795467ffffffffffffffff90811690891611156141bb576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614614226576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506142c7565b5067ffffffffffffffff85165f908152607560205260409020548061427d576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff90811690871611156142c7576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff90811690881611806142f957508767ffffffffffffffff168767ffffffffffffffff1611155b80614320575060795467ffffffffffffffff68010000000000000000909104811690881611155b15614357576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f908152607860205260409020546801000000000000000090048116908616146143b9576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6143c78787878588610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516143fb9190615c9b565b602060405180830381855afa158015614416573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061443991906158dd565b6144439190615cac565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916144c591889190600401615cbf565b602060405180830381865afa1580156144e0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145049190615cf9565b61453a576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614154576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff6801000000000000000090910481169082161115806145c9575060795467ffffffffffffffff908116908216115b15614600576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b15801561472e575f80fd5b505af1158015614740573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161478f91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526148789085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614e09565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115612391576079545f906148c69068010000000000000000900467ffffffffffffffff16600161579c565b90506148d181611203565b1561148c576079545f906002906148f390849067ffffffffffffffff1661592b565b6148fd9190615d18565b614907908361579c565b905061491281611203565b15614924576149208161458f565b5050565b6149208261458f565b5f614936612b9d565b9050815f80614945848461592b565b606f5467ffffffffffffffff91821692505f91614968916101009004164261594c565b90505b8467ffffffffffffffff168467ffffffffffffffff16146149f25767ffffffffffffffff8085165f90815260726020526040902060018101549091168210156149d057600181015468010000000000000000900467ffffffffffffffff1694506149ec565b6149da868661592b565b67ffffffffffffffff169350506149f2565b5061496b565b5f6149fd848461594c565b905083811015614a5457808403600c8111614a185780614a1b565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281614a4a57614a4a615976565b0460705550614ac3565b838103600c8111614a655780614a68565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a76400000281614a9e57614a9e615976565b04905080607054670de0b6b3a76400000281614abc57614abc615976565b0460705550505b683635c9adc5dea000006070541115614ae857683635c9adc5dea000006070556127c6565b633b9aca0060705410156127c657633b9aca0060705550505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314612391576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612d3c565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015614c63575f80fd5b505af1158015614c75573d5f803e3d5ffd5b50505050612391614f14565b5f54610100900460ff16614d17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401612d3c565b61239133614b88565b606f5460ff16614d5c576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052614e049084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016147f6565b505050565b5f614e6a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16614fa69092919063ffffffff16565b805190915015614e045780806020019051810190614e889190615cf9565b614e04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401612d3c565b606f5460ff1615614f51576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b6060614fb484845f85614fbc565b949350505050565b60608247101561504e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401612d3c565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516150769190615c9b565b5f6040518083038185875af1925050503d805f81146150b0576040519150601f19603f3d011682016040523d82523d5f602084013e6150b5565b606091505b50915091506150c6878383876150d1565b979650505050505050565b606083156151665782515f0361515f5773ffffffffffffffffffffffffffffffffffffffff85163b61515f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612d3c565b5081614fb4565b614fb4838381511561517b5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3c919061521a565b5f5b838110156151c95781810151838201526020016151b1565b50505f910152565b5f81518084526151e88160208601602086016151af565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61522c60208301846151d1565b9392505050565b5f60208284031215615243575f80fd5b813561ffff8116811461522c575f80fd5b803567ffffffffffffffff81168114612b98575f80fd5b5f805f805f60a0868803121561527f575f80fd5b61528886615254565b945061529660208701615254565b94979496505050506040830135926060810135926080909101359150565b8061030081018310156152c5575f80fd5b92915050565b5f805f805f806103a087890312156152e1575f80fd5b6152ea87615254565b95506152f860208801615254565b945061530660408801615254565b935060608701359250608087013591506153238860a089016152b4565b90509295509295509295565b5f805f805f805f6103c0888a031215615346575f80fd5b61534f88615254565b965061535d60208901615254565b955061536b60408901615254565b945061537960608901615254565b93506080880135925060a088013591506153968960c08a016152b4565b905092959891949750929550565b5f602082840312156153b4575f80fd5b61522c82615254565b5f8083601f8401126153cd575f80fd5b50813567ffffffffffffffff8111156153e4575f80fd5b6020830191508360208260051b85010111156153fe575f80fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612b98575f80fd5b5f805f6040848603121561543a575f80fd5b833567ffffffffffffffff811115615450575f80fd5b61545c868287016153bd565b909450925061546f905060208501615405565b90509250925092565b5f60208284031215615488575f80fd5b61522c82615405565b5f602082840312156154a1575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126154e4575f80fd5b813567ffffffffffffffff808211156154ff576154ff6154a8565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715615545576155456154a8565b8160405283815286602085880101111561555d575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6020828403121561558c575f80fd5b813567ffffffffffffffff8111156155a2575f80fd5b614fb4848285016154d5565b5f8083601f8401126155be575f80fd5b50813567ffffffffffffffff8111156155d5575f80fd5b6020830191508360208285010111156153fe575f80fd5b5f805f805f80868803610120811215615603575f80fd5b60a0811215615610575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff80821115615635575f80fd5b6156418a838b016154d5565b955060e0890135915080821115615656575f80fd5b6156628a838b016154d5565b9450610100890135915080821115615678575f80fd5b5061568589828a016155ae565b979a9699509497509295939492505050565b5f80602083850312156156a8575f80fd5b823567ffffffffffffffff8111156156be575f80fd5b6156ca858286016153bd565b90969095509350505050565b5f805f604084860312156156e8575f80fd5b833567ffffffffffffffff8111156156fe575f80fd5b61570a868287016155ae565b909790965060209590950135949350505050565b600181811c9082168061573257607f821691505b602082108103615769577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156157bd576157bd61576f565b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112615823575f80fd5b9190910192915050565b5f6080823603121561583d575f80fd5b6040516080810167ffffffffffffffff8282108183111715615861576158616154a8565b816040528435915080821115615875575f80fd5b50615882368286016154d5565b8252506020830135602082015261589b60408401615254565b60408201526158ac60608401615254565b606082015292915050565b5f67ffffffffffffffff8083168181036158d3576158d361576f565b6001019392505050565b5f602082840312156158ed575f80fd5b5051919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036159245761592461576f565b5060010190565b67ffffffffffffffff8281168282160390808211156157bd576157bd61576f565b818103818111156152c5576152c561576f565b80820281158282048414176152c5576152c561576f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f826159b1576159b1615976565b500490565b601f821115614e04575f81815260208120601f850160051c810160208610156159dc5750805b601f850160051c820191505b818110156159fb578281556001016159e8565b505050505050565b815167ffffffffffffffff811115615a1d57615a1d6154a8565b615a3181615a2b845461571e565b846159b6565b602080601f831160018114615a83575f8415615a4d5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556159fb565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615acf57888601518255948401946001909101908401615ab0565b5085821015615b0b57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152615b8f606083018486615b1b565b9695505050505050565b808201808211156152c5576152c561576f565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112615823575f80fd5b5f60608236031215615bee575f80fd5b6040516060810167ffffffffffffffff8282108183111715615c1257615c126154a8565b816040528435915080821115615c26575f80fd5b50615c33368286016154d5565b82525060208301356020820152615c4c60408401615254565b604082015292915050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f615b8f606083018486615b1b565b5f82516158238184602087016151af565b5f82615cba57615cba615976565b500690565b6103208101610300808584378201835f5b6001811015615cef578151835260209283019290910190600101615cd0565b5050509392505050565b5f60208284031215615d09575f80fd5b8151801515811461522c575f80fd5b5f67ffffffffffffffff80841680615d3257615d32615976565b9216919091049291505056fea2646970667358221220a50e6fa85418d984e88c8f7daf5faf4ee5e483c8bc96c6d92f33fe24b3cf94f764736f6c63430008140033", + "bytecode": "0x61014060405234801562000011575f80fd5b5060405162005e7f38038062005e7f8339810160408190526200003491620000a2565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b039182166101005216610120526200012a565b6001600160a01b038116811462000083575f80fd5b50565b80516001600160401b03811681146200009d575f80fd5b919050565b5f805f805f8060c08789031215620000b8575f80fd5b8651620000c5816200006e565b6020880151909650620000d8816200006e565b6040880151909550620000eb816200006e565b6060880151909450620000fe816200006e565b92506200010e6080880162000086565b91506200011e60a0880162000086565b90509295509295509295565b60805160a05160c05160e0516101005161012051615c8f620001f05f395f818161066f01528181610dd301526130d801525f81816107db0152610da901525f81816107a1015281816124ba0152818161376a0152614ada01525f818161095901528181610f450152818161111001528181611935015281816125360152818161394b015261469401525f8181610a0601528181613ffd015261444b01525f818161089601528181611e1a01528181612ae70152818161392001526140e90152615c8f5ff3fe608060405234801561000f575f80fd5b50600436106103a9575f3560e01c80638c3d7301116101ea578063c754c7ed11610114578063e7a7ed02116100a9578063f14916d611610079578063f14916d614610a68578063f2fde38b14610a7b578063f851a44014610a8e578063f8b823e414610aae575f80fd5b8063e7a7ed02146109d1578063e8bf92ed14610a01578063eaeb077b14610a28578063ed6b010414610a3b575f80fd5b8063d2e129f9116100e4578063d2e129f91461097b578063d8d1091b1461098e578063d939b315146109a1578063dbc16976146109c9575f80fd5b8063c754c7ed146108e6578063c89e42df14610912578063cfa8ed4714610925578063d02103ca14610954575f80fd5b8063ada8f9191161018a578063b6b0b0971161015a578063b6b0b09714610891578063ba58ae39146108b8578063c00e0dc9146108cb578063c0ed84e0146108de575f80fd5b8063ada8f919146107c3578063adc879e9146107d6578063afd23cbe146107fd578063b4d63f581461082b575f80fd5b80639aa972a3116101c55780639aa972a3146107635780639c9f3dfe14610776578063a066215c14610789578063a3c573eb1461079c575f80fd5b80638c3d7301146107355780638da5cb5b1461073d57806399f5634e1461075b575f80fd5b80634a1a89a7116102d65780636b8616ce1161026b5780637fcb36531161023b5780637fcb365314610656578063831c7ead1461066a578063837a473814610691578063841b24d714610705575f80fd5b80636b8616ce146106095780636ff512cc14610628578063715018a61461063b5780637215541a14610643575f80fd5b8063542028d5116102a6578063542028d5146105de5780635ec91958146105e657806360469169146105ee578063621dd411146105f6575f80fd5b80634a1a89a71461056b5780634a910e6a1461058b5780634e4877061461059e5780635392c5e0146105b1575f80fd5b80632a9f208f1161034c578063394218e91161031c578063394218e9146104fc578063423fa8561461050f578063456052671461052f578063458c047714610557575f80fd5b80632a9f208f146104af5780632b0006fa146104c35780632c1f816a146104d6578063383b3be8146104e9575f80fd5b80631816b7e5116103875780631816b7e514610416578063220d78991461042b578063267822471461043e5780632987898314610483575f80fd5b80630a0d9fbe146103ad578063107bf28c146103e457806315064c96146103f9575b5f80fd5b606f546103c690610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6103ec610ab7565b6040516103db91906151d6565b606f546104069060ff1681565b60405190151581526020016103db565b6104296104243660046151ef565b610b43565b005b6103ec610439366004615227565b610c5b565b607b5461045e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103db565b60745461045e9068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6073546103c69067ffffffffffffffff1681565b6104296104d1366004615287565b610e31565b6104296104e43660046152eb565b610ffb565b6104066104f7366004615360565b611203565b61042961050a366004615360565b611258565b6073546103c69068010000000000000000900467ffffffffffffffff1681565b6073546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546103c69067ffffffffffffffff1681565b6079546103c69068010000000000000000900467ffffffffffffffff1681565b610429610599366004615360565b6113dc565b6104296105ac366004615360565b61148f565b6105d06105bf366004615360565b60756020525f908152604090205481565b6040519081526020016103db565b6103ec611613565b610429611620565b6105d061171f565b610429610604366004615287565b611734565b6105d0610617366004615360565b60716020525f908152604090205481565b61042961063636600461539c565b611ab2565b610429611b87565b610429610651366004615360565b611b9a565b6074546103c69067ffffffffffffffff1681565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b6106d961069f3660046153b5565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016103db565b6079546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b610429611d07565b60335473ffffffffffffffffffffffffffffffffffffffff1661045e565b6105d0611dd3565b6104296107713660046152eb565b611f26565b610429610784366004615360565b611fd6565b610429610797366004615360565b612152565b61045e7f000000000000000000000000000000000000000000000000000000000000000081565b6104296107d136600461539c565b612258565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b606f54610818906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103db565b61086b610839366004615360565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016103db565b61045e7f000000000000000000000000000000000000000000000000000000000000000081565b6104066108c63660046153b5565b61231c565b6104296108d9366004615414565b6123a4565b6103c6612b58565b607b546103c69074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b610429610920366004615540565b612bab565b606f5461045e906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61045e7f000000000000000000000000000000000000000000000000000000000000000081565b6104296109893660046155b0565b612c38565b61042961099c36600461565b565b61317b565b6079546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b610429613717565b6073546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61045e7f000000000000000000000000000000000000000000000000000000000000000081565b610429610a3636600461569a565b6137eb565b607b54610406907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b610429610a7636600461539c565b613bdb565b610429610a8936600461539c565b613cad565b607a5461045e9073ffffffffffffffffffffffffffffffffffffffff1681565b6105d060705481565b60778054610ac4906156e2565b80601f0160208091040260200160405190810160405280929190818152602001828054610af0906156e2565b8015610b3b5780601f10610b1257610100808354040283529160200191610b3b565b820191905f5260205f20905b815481529060010190602001808311610b1e57829003601f168201915b505050505081565b607a5473ffffffffffffffffffffffffffffffffffffffff163314610b94576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff161080610bad57506103ff8161ffff16115b15610be4576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590610c8e575081155b15610cc5576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610cfc576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d058461231c565b610d3b576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610e8e576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e9c868686868686613d61565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615610f1657607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015610f9b575f80fd5b505af1158015610fad573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611058576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110678787878787878761411c565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156110e157607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611166575f80fd5b505af1158015611178573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f90815260786020526040812054909242926112469270010000000000000000000000000000000090920481169116615760565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146112a9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156112f0576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661135f5760795467ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169082161061135f576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610c50565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461148357606f5460ff1615611444576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61144d81611203565b611483576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61148c8161454b565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146114e0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611527576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661159257607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610611592576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001610c50565b60768054610ac4906156e2565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611671576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff166116cd576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f607054606461172f9190615788565b905090565b606f5460ff1615611771576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f9081526072602052604090206001015442926117bd92780100000000000000000000000000000000000000000000000090910481169116615760565b67ffffffffffffffff1611156117ff576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e861180c868661579f565b67ffffffffffffffff16111561184e576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61185c868686868686613d61565b61186584614758565b607954700100000000000000000000000000000000900467ffffffffffffffff165f036119a657607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f908152607560205260409020839055607954161561190657607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b15801561198b575f80fd5b505af115801561199d573d5f803e3d5ffd5b50505050611a74565b6119ae614932565b6079805467ffffffffffffffff16905f6119c7836157c0565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001610feb565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611b03576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c50565b611b8f6149e1565b611b985f614a62565b565b60335473ffffffffffffffffffffffffffffffffffffffff163314611cff575f611bc2612b58565b90508067ffffffffffffffff168267ffffffffffffffff1611611c11576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000090910481169083161180611c56575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15611c8d576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f908152607260205260409020600101544291611cbb9162093a809116615760565b67ffffffffffffffff161115611cfd576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61148c614ad8565b607b5473ffffffffffffffffffffffffffffffffffffffff163314611d58576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611e5f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e8391906157e6565b90505f611e8e612b58565b60735467ffffffffffffffff680100000000000000008204811691611ee6917001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041661579f565b611ef09190615760565b611efa919061579f565b67ffffffffffffffff169050805f03611f15575f9250505090565b611f1f818361582a565b9250505090565b606f5460ff1615611f63576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f728787878787878761411c565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1611fcd614ad8565b50505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612027576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561206e576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166120d55760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106120d5576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146121a3576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156121ea576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146122a9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c50565b5f67ffffffff0000000167ffffffffffffffff8316108015612353575067ffffffff00000001604083901c67ffffffffffffffff16105b8015612374575067ffffffff00000001608083901c67ffffffffffffffff16105b801561238b575067ffffffff0000000160c083901c105b1561239857506001919050565b505f919050565b919050565b606f5460ff16156123e1576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314612441576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361247c576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156124b8576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561251d575f80fd5b505af115801561252f573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561259d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125c191906157e6565b60735467ffffffffffffffff68010000000000000000820481165f818152607260205260408120549495504294919370010000000000000000000000000000000090049092169182905b87811015612917575f8b8b838181106126265761262661583d565b9050602002810190612638919061586a565b612641906158a6565b8051805160209091012060408201519192509067ffffffffffffffff1615612832578561266d816157c0565b9650505f81836020015184604001516040516020016126c493929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f9081526071909352912054909150811461274c576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015181519384018a905290830185905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528d901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201527f0100000000000000000000000000000000000000000000000000000000000000609c820152609d0160405160208183030381529060405280519060200120955060715f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550612902565b8151516201d4c01015612871576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018b905260c08a901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528c901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c820152609d016040516020818303038152906040528051906020012094505b5050808061290f90615932565b91505061260b565b506129228785615760565b60735490945067ffffffffffffffff78010000000000000000000000000000000000000000000000009091048116908416111561298b576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516060810182528381524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528b86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090931692909217948416830294909417905582547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169302929092179055879082811690851614612abd57612a5f828561579f565b612a739067ffffffffffffffff1682615969565b607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff88160217905590505b612b0f333083607054612ad09190615788565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190614b5b565b612b17614932565b60405167ffffffffffffffff8616907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce905f90a25050505050505050505050565b6079545f9067ffffffffffffffff1615612b9a575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612bfc576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6076612c0882826159c9565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c5091906151d6565b5f54610100900460ff1615808015612c5657505f54600160ff909116105b80612c6f5750303b158015612c6f57505f5460ff166001145b612d00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612d5c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b612d69602088018861539c565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612dbe604088016020890161539c565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055612e23608088016060890161539c565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076612ead86826159c9565b506077612eba85826159c9565b5062093a80612ecf6060890160408a01615360565b67ffffffffffffffff161115612f11576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f216060880160408901615360565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80612f8360a0890160808a01615360565b67ffffffffffffffff161115612fc5576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fd560a0880160808901615360565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c01000000000006978000000000000000000000000000000000000000001790556130b4614c3d565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f000000000000000000000000000000000000000000000000000000000000000085856040516131099493929190615b28565b60405180910390a18015611fcd575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16156131d8576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615613215576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613250576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561328c576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff780100000000000000000000000000000000000000000000000082048116916132d7918491700100000000000000000000000000000000900416615b5f565b111561330f576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b848110156135de575f87878381811061336d5761336d61583d565b905060200281019061337f919061586a565b613388906158a6565b905083613394816157c0565b825180516020918201208185015160408087015190519499509194505f936133f59386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f9081526071909352912054909150811461347d576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f908152607160205260408120556134a1600189615969565b84036135105742607b60149054906101000a900467ffffffffffffffff1684604001516134ce9190615760565b67ffffffffffffffff161115613510576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602083810151604080860151815193840189905290830185905260608084019290925260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201527f0100000000000000000000000000000000000000000000000000000000000000609c820152609d0160405160208183030381529060405280519060200120945050505080806135d690615932565b915050613352565b506135e98484615760565b6040805160608101825283815267ffffffffffffffff428116602080840191825260738054680100000000000000009081900485168688019081528589165f8181526072909552888520975188559451600190970180549151871683027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921697871697909717179095558054938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff958402959095167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff9094169390931793909317909155915192955090917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613768576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156137cd575f80fd5b505af11580156137df573d5f803e3d5ffd5b50505050611b98614cdc565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613848576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615613885576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61388e61171f565b9050818111156138ca576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115613906576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61394873ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084614b5b565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139d691906157e6565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16906018613a10836157c0565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051613a47929190615b72565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303613b75576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613bd4565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613bcb9493929190615b81565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613c2c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610c50565b613cb56149e1565b73ffffffffffffffffffffffffffffffffffffffff8116613d58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401612cf7565b61148c81614a62565b5f80613d6b612b58565b905067ffffffffffffffff881615613e3a5760795467ffffffffffffffff9081169089161115613dc7576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614613e34576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50613eda565b67ffffffffffffffff87165f90815260756020526040902054915081613e8c576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115613eda576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611613f27576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613f358888888689610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051613f699190615bb6565b602060405180830381855afa158015613f84573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613fa791906157e6565b613fb19190615bc7565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161403391899190600401615bda565b602060405180830381865afa15801561404e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140729190615c14565b6140a8576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614110336140b6858b61579f565b67ffffffffffffffff166140c8611dd3565b6140d29190615788565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190614d6a565b50505050505050505050565b5f67ffffffffffffffff8816156141e85760795467ffffffffffffffff9081169089161115614177576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f9081526078602052604090206002810154815490928881166801000000000000000090920416146141e2576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614283565b5067ffffffffffffffff85165f9081526075602052604090205480614239576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff9081169087161115614283576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff90811690881611806142b557508767ffffffffffffffff168767ffffffffffffffff1611155b806142dc575060795467ffffffffffffffff68010000000000000000909104811690881611155b15614313576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f90815260786020526040902054680100000000000000009004811690861614614375576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6143838787878588610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516143b79190615bb6565b602060405180830381855afa1580156143d2573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906143f591906157e6565b6143ff9190615bc7565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161448191889190600401615bda565b602060405180830381865afa15801561449c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144c09190615c14565b6144f6576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614110576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff680100000000000000009091048116908216111580614585575060795467ffffffffffffffff908116908216115b156145bc576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b1580156146ea575f80fd5b505af11580156146fc573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161474b91815260200190565b60405180910390a3505050565b5f614761612b58565b9050815f80614770848461579f565b606f5467ffffffffffffffff91821692505f916147939161010090041642615969565b90505b8467ffffffffffffffff168467ffffffffffffffff161461481d5767ffffffffffffffff8085165f90815260726020526040902060018101549091168210156147fb57600181015468010000000000000000900467ffffffffffffffff169450614817565b614805868661579f565b67ffffffffffffffff1693505061481d565b50614796565b5f6148288484615969565b90508381101561487f57808403600c81116148435780614846565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281614875576148756157fd565b04607055506148ee565b838103600c81116148905780614893565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a764000002816148c9576148c96157fd565b04905080607054670de0b6b3a764000002816148e7576148e76157fd565b0460705550505b683635c9adc5dea00000607054111561491357683635c9adc5dea00000607055611fcd565b633b9aca006070541015611fcd57633b9aca0060705550505050505050565b60795467ffffffffffffffff680100000000000000008204811691161115611b98576079545f9061497a9068010000000000000000900467ffffffffffffffff166001615760565b905061498581611203565b1561148c576079545f906002906149a790849067ffffffffffffffff1661579f565b6149b19190615c33565b6149bb9083615760565b90506149c681611203565b156149d8576149d48161454b565b5050565b6149d48261454b565b60335473ffffffffffffffffffffffffffffffffffffffff163314611b98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612cf7565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015614b3d575f80fd5b505af1158015614b4f573d5f803e3d5ffd5b50505050611b98614dc5565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052614c379085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614e57565b50505050565b5f54610100900460ff16614cd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401612cf7565b611b9833614a62565b606f5460ff16614d18576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052614dc09084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401614bb5565b505050565b606f5460ff1615614e02576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f614eb8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16614f629092919063ffffffff16565b805190915015614dc05780806020019051810190614ed69190615c14565b614dc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401612cf7565b6060614f7084845f85614f78565b949350505050565b60608247101561500a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401612cf7565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516150329190615bb6565b5f6040518083038185875af1925050503d805f811461506c576040519150601f19603f3d011682016040523d82523d5f602084013e615071565b606091505b50915091506150828783838761508d565b979650505050505050565b606083156151225782515f0361511b5773ffffffffffffffffffffffffffffffffffffffff85163b61511b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612cf7565b5081614f70565b614f7083838151156151375781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf791906151d6565b5f5b8381101561518557818101518382015260200161516d565b50505f910152565b5f81518084526151a481602086016020860161516b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6151e8602083018461518d565b9392505050565b5f602082840312156151ff575f80fd5b813561ffff811681146151e8575f80fd5b803567ffffffffffffffff8116811461239f575f80fd5b5f805f805f60a0868803121561523b575f80fd5b61524486615210565b945061525260208701615210565b94979496505050506040830135926060810135926080909101359150565b806103008101831015615281575f80fd5b92915050565b5f805f805f806103a0878903121561529d575f80fd5b6152a687615210565b95506152b460208801615210565b94506152c260408801615210565b935060608701359250608087013591506152df8860a08901615270565b90509295509295509295565b5f805f805f805f6103c0888a031215615302575f80fd5b61530b88615210565b965061531960208901615210565b955061532760408901615210565b945061533560608901615210565b93506080880135925060a088013591506153528960c08a01615270565b905092959891949750929550565b5f60208284031215615370575f80fd5b6151e882615210565b803573ffffffffffffffffffffffffffffffffffffffff8116811461239f575f80fd5b5f602082840312156153ac575f80fd5b6151e882615379565b5f602082840312156153c5575f80fd5b5035919050565b5f8083601f8401126153dc575f80fd5b50813567ffffffffffffffff8111156153f3575f80fd5b6020830191508360208260051b850101111561540d575f80fd5b9250929050565b5f805f60408486031215615426575f80fd5b833567ffffffffffffffff81111561543c575f80fd5b615448868287016153cc565b909450925061545b905060208501615379565b90509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f67ffffffffffffffff808411156154ab576154ab615464565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156154f1576154f1615464565b81604052809350858152868686011115615509575f80fd5b858560208301375f602087830101525050509392505050565b5f82601f830112615531575f80fd5b6151e883833560208501615491565b5f60208284031215615550575f80fd5b813567ffffffffffffffff811115615566575f80fd5b614f7084828501615522565b5f8083601f840112615582575f80fd5b50813567ffffffffffffffff811115615599575f80fd5b60208301915083602082850101111561540d575f80fd5b5f805f805f808688036101208112156155c7575f80fd5b60a08112156155d4575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff808211156155f9575f80fd5b6156058a838b01615522565b955060e089013591508082111561561a575f80fd5b6156268a838b01615522565b945061010089013591508082111561563c575f80fd5b5061564989828a01615572565b979a9699509497509295939492505050565b5f806020838503121561566c575f80fd5b823567ffffffffffffffff811115615682575f80fd5b61568e858286016153cc565b90969095509350505050565b5f805f604084860312156156ac575f80fd5b833567ffffffffffffffff8111156156c2575f80fd5b6156ce86828701615572565b909790965060209590950135949350505050565b600181811c908216806156f657607f821691505b60208210810361572d577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff81811683821601908082111561578157615781615733565b5092915050565b808202811582820484141761528157615281615733565b67ffffffffffffffff82811682821603908082111561578157615781615733565b5f67ffffffffffffffff8083168181036157dc576157dc615733565b6001019392505050565b5f602082840312156157f6575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82615838576158386157fd565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261589c575f80fd5b9190910192915050565b5f606082360312156158b6575f80fd5b6040516060810167ffffffffffffffff82821081831117156158da576158da615464565b8160405284359150808211156158ee575f80fd5b50830136601f8201126158ff575f80fd5b61590e36823560208401615491565b8252506020830135602082015261592760408401615210565b604082015292915050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361596257615962615733565b5060010190565b8181038181111561528157615281615733565b601f821115614dc0575f81815260208120601f850160051c810160208610156159a25750805b601f850160051c820191505b818110156159c1578281556001016159ae565b505050505050565b815167ffffffffffffffff8111156159e3576159e3615464565b6159f7816159f184546156e2565b8461597c565b602080601f831160018114615a49575f8415615a135750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556159c1565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615a9557888601518255948401946001909101908401615a76565b5085821015615ad157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152615b55606083018486615ae1565b9695505050505050565b8082018082111561528157615281615733565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f615b55606083018486615ae1565b5f825161589c81846020870161516b565b5f82615bd557615bd56157fd565b500690565b6103208101610300808584378201835f5b6001811015615c0a578151835260209283019290910190600101615beb565b5050509392505050565b5f60208284031215615c24575f80fd5b815180151581146151e8575f80fd5b5f67ffffffffffffffff80841680615c4d57615c4d6157fd565b9216919091049291505056fea2646970667358221220c1bba2a12efe116e21597e182ae83c49767a70ff696b4c924eaa8a3e168619fc64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106103a9575f3560e01c80638c3d7301116101ea578063c754c7ed11610114578063e7a7ed02116100a9578063f14916d611610079578063f14916d614610a68578063f2fde38b14610a7b578063f851a44014610a8e578063f8b823e414610aae575f80fd5b8063e7a7ed02146109d1578063e8bf92ed14610a01578063eaeb077b14610a28578063ed6b010414610a3b575f80fd5b8063d2e129f9116100e4578063d2e129f91461097b578063d8d1091b1461098e578063d939b315146109a1578063dbc16976146109c9575f80fd5b8063c754c7ed146108e6578063c89e42df14610912578063cfa8ed4714610925578063d02103ca14610954575f80fd5b8063ada8f9191161018a578063b6b0b0971161015a578063b6b0b09714610891578063ba58ae39146108b8578063c00e0dc9146108cb578063c0ed84e0146108de575f80fd5b8063ada8f919146107c3578063adc879e9146107d6578063afd23cbe146107fd578063b4d63f581461082b575f80fd5b80639aa972a3116101c55780639aa972a3146107635780639c9f3dfe14610776578063a066215c14610789578063a3c573eb1461079c575f80fd5b80638c3d7301146107355780638da5cb5b1461073d57806399f5634e1461075b575f80fd5b80634a1a89a7116102d65780636b8616ce1161026b5780637fcb36531161023b5780637fcb365314610656578063831c7ead1461066a578063837a473814610691578063841b24d714610705575f80fd5b80636b8616ce146106095780636ff512cc14610628578063715018a61461063b5780637215541a14610643575f80fd5b8063542028d5116102a6578063542028d5146105de5780635ec91958146105e657806360469169146105ee578063621dd411146105f6575f80fd5b80634a1a89a71461056b5780634a910e6a1461058b5780634e4877061461059e5780635392c5e0146105b1575f80fd5b80632a9f208f1161034c578063394218e91161031c578063394218e9146104fc578063423fa8561461050f578063456052671461052f578063458c047714610557575f80fd5b80632a9f208f146104af5780632b0006fa146104c35780632c1f816a146104d6578063383b3be8146104e9575f80fd5b80631816b7e5116103875780631816b7e514610416578063220d78991461042b578063267822471461043e5780632987898314610483575f80fd5b80630a0d9fbe146103ad578063107bf28c146103e457806315064c96146103f9575b5f80fd5b606f546103c690610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6103ec610ab7565b6040516103db91906151d6565b606f546104069060ff1681565b60405190151581526020016103db565b6104296104243660046151ef565b610b43565b005b6103ec610439366004615227565b610c5b565b607b5461045e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103db565b60745461045e9068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6073546103c69067ffffffffffffffff1681565b6104296104d1366004615287565b610e31565b6104296104e43660046152eb565b610ffb565b6104066104f7366004615360565b611203565b61042961050a366004615360565b611258565b6073546103c69068010000000000000000900467ffffffffffffffff1681565b6073546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546103c69067ffffffffffffffff1681565b6079546103c69068010000000000000000900467ffffffffffffffff1681565b610429610599366004615360565b6113dc565b6104296105ac366004615360565b61148f565b6105d06105bf366004615360565b60756020525f908152604090205481565b6040519081526020016103db565b6103ec611613565b610429611620565b6105d061171f565b610429610604366004615287565b611734565b6105d0610617366004615360565b60716020525f908152604090205481565b61042961063636600461539c565b611ab2565b610429611b87565b610429610651366004615360565b611b9a565b6074546103c69067ffffffffffffffff1681565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b6106d961069f3660046153b5565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016103db565b6079546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b610429611d07565b60335473ffffffffffffffffffffffffffffffffffffffff1661045e565b6105d0611dd3565b6104296107713660046152eb565b611f26565b610429610784366004615360565b611fd6565b610429610797366004615360565b612152565b61045e7f000000000000000000000000000000000000000000000000000000000000000081565b6104296107d136600461539c565b612258565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b606f54610818906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103db565b61086b610839366004615360565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016103db565b61045e7f000000000000000000000000000000000000000000000000000000000000000081565b6104066108c63660046153b5565b61231c565b6104296108d9366004615414565b6123a4565b6103c6612b58565b607b546103c69074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b610429610920366004615540565b612bab565b606f5461045e906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61045e7f000000000000000000000000000000000000000000000000000000000000000081565b6104296109893660046155b0565b612c38565b61042961099c36600461565b565b61317b565b6079546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b610429613717565b6073546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61045e7f000000000000000000000000000000000000000000000000000000000000000081565b610429610a3636600461569a565b6137eb565b607b54610406907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b610429610a7636600461539c565b613bdb565b610429610a8936600461539c565b613cad565b607a5461045e9073ffffffffffffffffffffffffffffffffffffffff1681565b6105d060705481565b60778054610ac4906156e2565b80601f0160208091040260200160405190810160405280929190818152602001828054610af0906156e2565b8015610b3b5780601f10610b1257610100808354040283529160200191610b3b565b820191905f5260205f20905b815481529060010190602001808311610b1e57829003601f168201915b505050505081565b607a5473ffffffffffffffffffffffffffffffffffffffff163314610b94576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff161080610bad57506103ff8161ffff16115b15610be4576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590610c8e575081155b15610cc5576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610cfc576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d058461231c565b610d3b576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610e8e576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e9c868686868686613d61565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615610f1657607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015610f9b575f80fd5b505af1158015610fad573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611058576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110678787878787878761411c565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156110e157607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611166575f80fd5b505af1158015611178573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f90815260786020526040812054909242926112469270010000000000000000000000000000000090920481169116615760565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146112a9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156112f0576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661135f5760795467ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169082161061135f576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610c50565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461148357606f5460ff1615611444576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61144d81611203565b611483576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61148c8161454b565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146114e0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611527576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661159257607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610611592576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001610c50565b60768054610ac4906156e2565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611671576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff166116cd576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f607054606461172f9190615788565b905090565b606f5460ff1615611771576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f9081526072602052604090206001015442926117bd92780100000000000000000000000000000000000000000000000090910481169116615760565b67ffffffffffffffff1611156117ff576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e861180c868661579f565b67ffffffffffffffff16111561184e576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61185c868686868686613d61565b61186584614758565b607954700100000000000000000000000000000000900467ffffffffffffffff165f036119a657607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f908152607560205260409020839055607954161561190657607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b15801561198b575f80fd5b505af115801561199d573d5f803e3d5ffd5b50505050611a74565b6119ae614932565b6079805467ffffffffffffffff16905f6119c7836157c0565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001610feb565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611b03576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c50565b611b8f6149e1565b611b985f614a62565b565b60335473ffffffffffffffffffffffffffffffffffffffff163314611cff575f611bc2612b58565b90508067ffffffffffffffff168267ffffffffffffffff1611611c11576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000090910481169083161180611c56575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15611c8d576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f908152607260205260409020600101544291611cbb9162093a809116615760565b67ffffffffffffffff161115611cfd576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61148c614ad8565b607b5473ffffffffffffffffffffffffffffffffffffffff163314611d58576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611e5f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e8391906157e6565b90505f611e8e612b58565b60735467ffffffffffffffff680100000000000000008204811691611ee6917001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041661579f565b611ef09190615760565b611efa919061579f565b67ffffffffffffffff169050805f03611f15575f9250505090565b611f1f818361582a565b9250505090565b606f5460ff1615611f63576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f728787878787878761411c565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1611fcd614ad8565b50505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612027576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561206e576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166120d55760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106120d5576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146121a3576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156121ea576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146122a9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c50565b5f67ffffffff0000000167ffffffffffffffff8316108015612353575067ffffffff00000001604083901c67ffffffffffffffff16105b8015612374575067ffffffff00000001608083901c67ffffffffffffffff16105b801561238b575067ffffffff0000000160c083901c105b1561239857506001919050565b505f919050565b919050565b606f5460ff16156123e1576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314612441576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361247c576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156124b8576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561251d575f80fd5b505af115801561252f573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561259d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125c191906157e6565b60735467ffffffffffffffff68010000000000000000820481165f818152607260205260408120549495504294919370010000000000000000000000000000000090049092169182905b87811015612917575f8b8b838181106126265761262661583d565b9050602002810190612638919061586a565b612641906158a6565b8051805160209091012060408201519192509067ffffffffffffffff1615612832578561266d816157c0565b9650505f81836020015184604001516040516020016126c493929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f9081526071909352912054909150811461274c576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015181519384018a905290830185905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528d901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201527f0100000000000000000000000000000000000000000000000000000000000000609c820152609d0160405160208183030381529060405280519060200120955060715f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550612902565b8151516201d4c01015612871576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018b905260c08a901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528c901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c820152609d016040516020818303038152906040528051906020012094505b5050808061290f90615932565b91505061260b565b506129228785615760565b60735490945067ffffffffffffffff78010000000000000000000000000000000000000000000000009091048116908416111561298b576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516060810182528381524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528b86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090931692909217948416830294909417905582547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169302929092179055879082811690851614612abd57612a5f828561579f565b612a739067ffffffffffffffff1682615969565b607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff88160217905590505b612b0f333083607054612ad09190615788565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190614b5b565b612b17614932565b60405167ffffffffffffffff8616907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce905f90a25050505050505050505050565b6079545f9067ffffffffffffffff1615612b9a575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612bfc576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6076612c0882826159c9565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c5091906151d6565b5f54610100900460ff1615808015612c5657505f54600160ff909116105b80612c6f5750303b158015612c6f57505f5460ff166001145b612d00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612d5c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b612d69602088018861539c565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612dbe604088016020890161539c565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055612e23608088016060890161539c565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076612ead86826159c9565b506077612eba85826159c9565b5062093a80612ecf6060890160408a01615360565b67ffffffffffffffff161115612f11576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f216060880160408901615360565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80612f8360a0890160808a01615360565b67ffffffffffffffff161115612fc5576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fd560a0880160808901615360565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c01000000000006978000000000000000000000000000000000000000001790556130b4614c3d565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f000000000000000000000000000000000000000000000000000000000000000085856040516131099493929190615b28565b60405180910390a18015611fcd575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16156131d8576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615613215576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613250576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561328c576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff780100000000000000000000000000000000000000000000000082048116916132d7918491700100000000000000000000000000000000900416615b5f565b111561330f576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b848110156135de575f87878381811061336d5761336d61583d565b905060200281019061337f919061586a565b613388906158a6565b905083613394816157c0565b825180516020918201208185015160408087015190519499509194505f936133f59386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f9081526071909352912054909150811461347d576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f908152607160205260408120556134a1600189615969565b84036135105742607b60149054906101000a900467ffffffffffffffff1684604001516134ce9190615760565b67ffffffffffffffff161115613510576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602083810151604080860151815193840189905290830185905260608084019290925260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201527f0100000000000000000000000000000000000000000000000000000000000000609c820152609d0160405160208183030381529060405280519060200120945050505080806135d690615932565b915050613352565b506135e98484615760565b6040805160608101825283815267ffffffffffffffff428116602080840191825260738054680100000000000000009081900485168688019081528589165f8181526072909552888520975188559451600190970180549151871683027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921697871697909717179095558054938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff958402959095167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff9094169390931793909317909155915192955090917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613768576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156137cd575f80fd5b505af11580156137df573d5f803e3d5ffd5b50505050611b98614cdc565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613848576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615613885576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61388e61171f565b9050818111156138ca576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115613906576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61394873ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084614b5b565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139d691906157e6565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16906018613a10836157c0565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051613a47929190615b72565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303613b75576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613bd4565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613bcb9493929190615b81565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613c2c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610c50565b613cb56149e1565b73ffffffffffffffffffffffffffffffffffffffff8116613d58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401612cf7565b61148c81614a62565b5f80613d6b612b58565b905067ffffffffffffffff881615613e3a5760795467ffffffffffffffff9081169089161115613dc7576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614613e34576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50613eda565b67ffffffffffffffff87165f90815260756020526040902054915081613e8c576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115613eda576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611613f27576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613f358888888689610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051613f699190615bb6565b602060405180830381855afa158015613f84573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613fa791906157e6565b613fb19190615bc7565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161403391899190600401615bda565b602060405180830381865afa15801561404e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140729190615c14565b6140a8576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614110336140b6858b61579f565b67ffffffffffffffff166140c8611dd3565b6140d29190615788565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190614d6a565b50505050505050505050565b5f67ffffffffffffffff8816156141e85760795467ffffffffffffffff9081169089161115614177576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f9081526078602052604090206002810154815490928881166801000000000000000090920416146141e2576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614283565b5067ffffffffffffffff85165f9081526075602052604090205480614239576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff9081169087161115614283576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff90811690881611806142b557508767ffffffffffffffff168767ffffffffffffffff1611155b806142dc575060795467ffffffffffffffff68010000000000000000909104811690881611155b15614313576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f90815260786020526040902054680100000000000000009004811690861614614375576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6143838787878588610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516143b79190615bb6565b602060405180830381855afa1580156143d2573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906143f591906157e6565b6143ff9190615bc7565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161448191889190600401615bda565b602060405180830381865afa15801561449c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144c09190615c14565b6144f6576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614110576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff680100000000000000009091048116908216111580614585575060795467ffffffffffffffff908116908216115b156145bc576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b1580156146ea575f80fd5b505af11580156146fc573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161474b91815260200190565b60405180910390a3505050565b5f614761612b58565b9050815f80614770848461579f565b606f5467ffffffffffffffff91821692505f916147939161010090041642615969565b90505b8467ffffffffffffffff168467ffffffffffffffff161461481d5767ffffffffffffffff8085165f90815260726020526040902060018101549091168210156147fb57600181015468010000000000000000900467ffffffffffffffff169450614817565b614805868661579f565b67ffffffffffffffff1693505061481d565b50614796565b5f6148288484615969565b90508381101561487f57808403600c81116148435780614846565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281614875576148756157fd565b04607055506148ee565b838103600c81116148905780614893565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a764000002816148c9576148c96157fd565b04905080607054670de0b6b3a764000002816148e7576148e76157fd565b0460705550505b683635c9adc5dea00000607054111561491357683635c9adc5dea00000607055611fcd565b633b9aca006070541015611fcd57633b9aca0060705550505050505050565b60795467ffffffffffffffff680100000000000000008204811691161115611b98576079545f9061497a9068010000000000000000900467ffffffffffffffff166001615760565b905061498581611203565b1561148c576079545f906002906149a790849067ffffffffffffffff1661579f565b6149b19190615c33565b6149bb9083615760565b90506149c681611203565b156149d8576149d48161454b565b5050565b6149d48261454b565b60335473ffffffffffffffffffffffffffffffffffffffff163314611b98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612cf7565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015614b3d575f80fd5b505af1158015614b4f573d5f803e3d5ffd5b50505050611b98614dc5565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052614c379085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614e57565b50505050565b5f54610100900460ff16614cd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401612cf7565b611b9833614a62565b606f5460ff16614d18576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052614dc09084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401614bb5565b505050565b606f5460ff1615614e02576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f614eb8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16614f629092919063ffffffff16565b805190915015614dc05780806020019051810190614ed69190615c14565b614dc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401612cf7565b6060614f7084845f85614f78565b949350505050565b60608247101561500a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401612cf7565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516150329190615bb6565b5f6040518083038185875af1925050503d805f811461506c576040519150601f19603f3d011682016040523d82523d5f602084013e615071565b606091505b50915091506150828783838761508d565b979650505050505050565b606083156151225782515f0361511b5773ffffffffffffffffffffffffffffffffffffffff85163b61511b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612cf7565b5081614f70565b614f7083838151156151375781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf791906151d6565b5f5b8381101561518557818101518382015260200161516d565b50505f910152565b5f81518084526151a481602086016020860161516b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6151e8602083018461518d565b9392505050565b5f602082840312156151ff575f80fd5b813561ffff811681146151e8575f80fd5b803567ffffffffffffffff8116811461239f575f80fd5b5f805f805f60a0868803121561523b575f80fd5b61524486615210565b945061525260208701615210565b94979496505050506040830135926060810135926080909101359150565b806103008101831015615281575f80fd5b92915050565b5f805f805f806103a0878903121561529d575f80fd5b6152a687615210565b95506152b460208801615210565b94506152c260408801615210565b935060608701359250608087013591506152df8860a08901615270565b90509295509295509295565b5f805f805f805f6103c0888a031215615302575f80fd5b61530b88615210565b965061531960208901615210565b955061532760408901615210565b945061533560608901615210565b93506080880135925060a088013591506153528960c08a01615270565b905092959891949750929550565b5f60208284031215615370575f80fd5b6151e882615210565b803573ffffffffffffffffffffffffffffffffffffffff8116811461239f575f80fd5b5f602082840312156153ac575f80fd5b6151e882615379565b5f602082840312156153c5575f80fd5b5035919050565b5f8083601f8401126153dc575f80fd5b50813567ffffffffffffffff8111156153f3575f80fd5b6020830191508360208260051b850101111561540d575f80fd5b9250929050565b5f805f60408486031215615426575f80fd5b833567ffffffffffffffff81111561543c575f80fd5b615448868287016153cc565b909450925061545b905060208501615379565b90509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f67ffffffffffffffff808411156154ab576154ab615464565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156154f1576154f1615464565b81604052809350858152868686011115615509575f80fd5b858560208301375f602087830101525050509392505050565b5f82601f830112615531575f80fd5b6151e883833560208501615491565b5f60208284031215615550575f80fd5b813567ffffffffffffffff811115615566575f80fd5b614f7084828501615522565b5f8083601f840112615582575f80fd5b50813567ffffffffffffffff811115615599575f80fd5b60208301915083602082850101111561540d575f80fd5b5f805f805f808688036101208112156155c7575f80fd5b60a08112156155d4575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff808211156155f9575f80fd5b6156058a838b01615522565b955060e089013591508082111561561a575f80fd5b6156268a838b01615522565b945061010089013591508082111561563c575f80fd5b5061564989828a01615572565b979a9699509497509295939492505050565b5f806020838503121561566c575f80fd5b823567ffffffffffffffff811115615682575f80fd5b61568e858286016153cc565b90969095509350505050565b5f805f604084860312156156ac575f80fd5b833567ffffffffffffffff8111156156c2575f80fd5b6156ce86828701615572565b909790965060209590950135949350505050565b600181811c908216806156f657607f821691505b60208210810361572d577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff81811683821601908082111561578157615781615733565b5092915050565b808202811582820484141761528157615281615733565b67ffffffffffffffff82811682821603908082111561578157615781615733565b5f67ffffffffffffffff8083168181036157dc576157dc615733565b6001019392505050565b5f602082840312156157f6575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82615838576158386157fd565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261589c575f80fd5b9190910192915050565b5f606082360312156158b6575f80fd5b6040516060810167ffffffffffffffff82821081831117156158da576158da615464565b8160405284359150808211156158ee575f80fd5b50830136601f8201126158ff575f80fd5b61590e36823560208401615491565b8252506020830135602082015261592760408401615210565b604082015292915050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361596257615962615733565b5060010190565b8181038181111561528157615281615733565b601f821115614dc0575f81815260208120601f850160051c810160208610156159a25750805b601f850160051c820191505b818110156159c1578281556001016159ae565b505050505050565b815167ffffffffffffffff8111156159e3576159e3615464565b6159f7816159f184546156e2565b8461597c565b602080601f831160018114615a49575f8415615a135750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556159c1565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615a9557888601518255948401946001909101908401615a76565b5085821015615ad157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152615b55606083018486615ae1565b9695505050505050565b8082018082111561528157615281615733565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f615b55606083018486615ae1565b5f825161589c81846020870161516b565b5f82615bd557615bd56157fd565b500690565b6103208101610300808584378201835f5b6001811015615c0a578151835260209283019290910190600101615beb565b5050509392505050565b5f60208284031215615c24575f80fd5b815180151581146151e8575f80fd5b5f67ffffffffffffffff80841680615c4d57615c4d6157fd565b9216919091049291505056fea2646970667358221220c1bba2a12efe116e21597e182ae83c49767a70ff696b4c924eaa8a3e168619fc64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMBridge.json b/compiled-contracts/PolygonZkEVMBridge.json index da2451474..d1e9e6cdd 100644 --- a/compiled-contracts/PolygonZkEVMBridge.json +++ b/compiled-contracts/PolygonZkEVMBridge.json @@ -459,19 +459,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "getDepositRoot", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -521,6 +508,19 @@ "stateMutability": "pure", "type": "function" }, + { + "inputs": [], + "name": "getRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -776,8 +776,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561000f575f80fd5b50615b1f8061001d5f395ff3fe60806040526004361062000197575f3560e01c8063647c576c11620000e2578063be5831c71162000086578063dbc16976116200005e578063dbc16976146200061a578063ee25560b1462000631578063fb5708341462000660575f80fd5b8063be5831c71462000591578063cd58657914620005cc578063d02103ca14620005e3575f80fd5b80639e34070f11620000ba5780639e34070f14620004f1578063aaa13cc21462000534578063bab161bf1462000558575f80fd5b8063647c576c146200047157806379e2cf97146200049557806381b1c17414620004ac575f80fd5b80632d2c9d94116200014a57806334ac9cf2116200012257806334ac9cf2146200033a5780633ae0504714620003685780633e197043146200037f575f80fd5b80632d2c9d9414620002695780632dfdf0b5146200028d578063318aee3d14620002b3575f80fd5b806322e95f2c116200017e57806322e95f2c14620001e4578063240ff378146200022e5780632cffd02e1462000245575f80fd5b806315064c96146200019b5780632072f6c514620001cb575b5f80fd5b348015620001a7575f80fd5b50606854620001b69060ff1681565b60405190151581526020015b60405180910390f35b348015620001d7575f80fd5b50620001e262000684565b005b348015620001f0575f80fd5b5062000208620002023660046200323f565b620006e2565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001c2565b620001e26200023f366004620032cf565b62000784565b34801562000251575f80fd5b50620001e26200026336600462003360565b620009ab565b34801562000275575f80fd5b50620001e26200028736600462003360565b62000f30565b34801562000299575f80fd5b50620002a460535481565b604051908152602001620001c2565b348015620002bf575f80fd5b5062000308620002d13660046200343e565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001c2565b34801562000346575f80fd5b50606c54620002089073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000374575f80fd5b50620002a462001130565b3480156200038b575f80fd5b50620002a46200039d36600462003472565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200047d575f80fd5b50620001e26200048f366004620034f7565b62001215565b348015620004a1575f80fd5b50620001e26200145e565b348015620004b8575f80fd5b5062000208620004ca36600462003544565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620004fd575f80fd5b50620001b66200050f36600462003544565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b34801562000540575f80fd5b5062000208620005523660046200355c565b62001498565b34801562000564575f80fd5b506068546200057b90610100900463ffffffff1681565b60405163ffffffff9091168152602001620001c2565b3480156200059d575f80fd5b506068546200057b90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001e2620005dd36600462003609565b62001682565b348015620005ef575f80fd5b50606854620002089065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000626575f80fd5b50620001e262001bd4565b3480156200063d575f80fd5b50620002a46200064f36600462003544565b60696020525f908152604090205481565b3480156200066c575f80fd5b50620001b66200067e366004620036a5565b62001c30565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006d6576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062001d18565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007c2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620007e85750600263ffffffff861610155b1562000820576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620008769998979695949392919062003736565b60405180910390a1620009936200098d6001606860019054906101000a900463ffffffff16338989348989604051620008b1929190620037b0565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001dab565b8215620009a457620009a462001ebf565b5050505050565b60685460ff1615620009e9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620009ff8b8b8b8b8b8b8b8b8b8b8b5f62001f8f565b73ffffffffffffffffffffffffffffffffffffffff861662000ad757604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a53919062003810565b5f6040518083038185875af1925050503d805f811462000a8f576040519150601f19603f3d011682016040523d82523d5f602084013e62000a94565b606091505b505090508062000ad0576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000eb8565b60685463ffffffff61010090910481169088160362000b195762000b1373ffffffffffffffffffffffffffffffffffffffff871685856200217a565b62000eb8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e2f575f808062000beb868801886200391f565b9250925092505f8584848460405162000c0490620031f8565b62000c1293929190620039db565b8190604051809103905ff590508015801562000c30573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000ca3575f80fd5b505af115801562000cb6573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e1d95949392919062003a17565b60405180910390a15050505062000eb5565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562000e9d575f80fd5b505af115801562000eb0573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000f6e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000f858b8b8b8b8b8b8b8b8b8b8b600162001f8f565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000fb7949392919062003a5e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200103a919062003810565b5f6040518083038185875af1925050503d805f811462001076576040519150601f19603f3d011682016040523d82523d5f602084013e6200107b565b606091505b5050905080620010b7576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200120c578083901c6001166001036200119d576033816020811062001169576200116962003aa5565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620011ca565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620012039062003aff565b9150506200113a565b50919392505050565b5f54610100900460ff16158080156200123457505f54600160ff909116105b806200124f5750303b1580156200124f57505f5460ff166001145b620012e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200133e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016918416919091179055620013f562002250565b801562001458575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620006e057620006e062001ebf565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b3083604051806020016200152c90620031f8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905262001577908d908d908d908d908d9060200162003b39565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052620015b5929160200162003b79565b604051602081830303815290604052805190602001206040516020016200163e94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff1615620016c0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620016ca620022f2565b60685463ffffffff888116610100909204161480620016f05750600263ffffffff881610155b1562001728576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff88166200178c5788341462001783576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f925062001a79565b3415620017c5576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620018ae576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b15801562001884575f80fd5b505af115801562001897573d5f803e3d5ffd5b5050505080602001519450805f0151935062001a77565b8515620018c357620018c3898b898962002367565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200192e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001954919062003bab565b90506200197a73ffffffffffffffffffffffffffffffffffffffff8b1633308e6200287a565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015620019e5573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001a0b919062003bab565b905062001a19828262003bc3565b6068548c9850610100900463ffffffff169650935062001a3987620028da565b62001a448c620029ee565b62001a4f8d62002af7565b60405160200162001a6393929190620039db565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e868860535460405162001aba98979695949392919062003bd9565b60405180910390a162001bac6200098d5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b861562001bbd5762001bbd62001ebf565b5050505062001bcb60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c26576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062002bf5565b5f84815b602081101562001d0a57600163ffffffff8616821c8116900362001ca65785816020811062001c675762001c6762003aa5565b60200201358260405160200162001c88929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001cf5565b8186826020811062001cbc5762001cbc62003aa5565b602002013560405160200162001cdc929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d018162003aff565b91505062001c34565b50821490505b949350505050565b60685460ff161562001d56576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001dbc6020600262003d88565b62001dc8919062003bc3565b6053541062001e03576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001e149062003aff565b918290555090505f5b602081101562001eaf578082901c60011660010362001e5557826033826020811062001e4d5762001e4d62003aa5565b015550505050565b6033816020811062001e6b5762001e6b62003aa5565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001ea69062003aff565b91505062001e1d565b5062001eba62003d95565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001f4562001130565b6040518263ffffffff1660e01b815260040162001f6491815260200190565b5f604051808303815f87803b15801562001f7c575f80fd5b505af115801562001458573d5f803e3d5ffd5b62001fa08b63ffffffff1662002c84565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af11580156200203f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002065919062003bab565b9050805f03620020a0576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8881166101009092041614620020ea576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff16620021075750896200210a565b508a5b620021336200212a848c8c8c8c8c8c8c604051620008b1929190620037b0565b8f8f8462001c30565b6200216a576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001eba9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002ce8565b5f54610100900460ff16620022e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b620006e062002dfa565b60026001540362002360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401620012d8565b6002600155565b5f62002377600482848662003dc2565b620023829162003deb565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620025fc575f808080808080620023e4896004818d62003dc2565b810190620023f3919062003e34565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002467576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff86163014620024b7576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a8514620024f1576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620025ac919062003810565b5f604051808303815f865af19150503d805f8114620025e7576040519150601f19603f3d011682016040523d82523d5f602084013e620025ec565b606091505b50505050505050505050620009a4565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002678576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806200268f8a6004818e62003dc2565b8101906200269e919062003e8a565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002714576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002764576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002828919062003810565b5f604051808303815f865af19150503d805f811462002863576040519150601f19603f3d011682016040523d82523d5f602084013e62002868565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014589085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401620021cd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff8616916200295d919062003810565b5f60405180830381855afa9150503d805f811462002997576040519150601f19603f3d011682016040523d82523d5f602084013e6200299c565b606091505b509150915081620029e3576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d10565b62001d108162002e92565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002a71919062003810565b5f60405180830381855afa9150503d805f811462002aab576040519150601f19603f3d011682016040523d82523d5f602084013e62002ab0565b606091505b509150915081620029e3576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d10565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff86169162002b79919062003810565b5f60405180830381855afa9150503d805f811462002bb3576040519150601f19603f3d011682016040523d82523d5f602084013e62002bb8565b606091505b509150915081801562002bcc575080516020145b62002bd957601262001d10565b8080602001905181019062001d10919062003f11565b60018055565b60685460ff1662002c32576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009a4576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002d4b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200307d9092919063ffffffff16565b80519091501562001eba578080602001905181019062002d6c919062003f2f565b62001eba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401620012d8565b5f54610100900460ff1662002bef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b6060604082511062002eb457818060200190518101906200077e919062003f4d565b81516020036200303f575f5b60208110801562002f0b575082818151811062002ee15762002ee162003aa5565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002f26578062002f1d8162003aff565b91505062002ec0565b805f0362002f6957505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff81111562002f865762002f86620037bf565b6040519080825280601f01601f19166020018201604052801562002fb1576020820181803683370190505b5090505f5b82811015620030375784818151811062002fd45762002fd462003aa5565b602001015160f81c60f81b82828151811062002ff45762002ff462003aa5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350806200302e8162003aff565b91505062002fb6565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d1084845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051620030b2919062003810565b5f6040518083038185875af1925050503d805f8114620030ee576040519150601f19603f3d011682016040523d82523d5f602084013e620030f3565b606091505b5091509150620031068783838762003111565b979650505050505050565b60608315620031ab5782515f03620031a35773ffffffffffffffffffffffffffffffffffffffff85163b620031a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620012d8565b508162001d10565b62001d108383815115620031c25781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620012d8919062003fc8565b611b0d8062003fdd83390190565b803563ffffffff8116811462003078575f80fd5b73ffffffffffffffffffffffffffffffffffffffff811681146200323c575f80fd5b50565b5f806040838503121562003251575f80fd5b6200325c8362003206565b915060208301356200326e816200321a565b809150509250929050565b80151581146200323c575f80fd5b5f8083601f84011262003298575f80fd5b50813567ffffffffffffffff811115620032b0575f80fd5b602083019150836020828501011115620032c8575f80fd5b9250929050565b5f805f805f60808688031215620032e4575f80fd5b620032ef8662003206565b9450602086013562003301816200321a565b93506040860135620033138162003279565b9250606086013567ffffffffffffffff8111156200332f575f80fd5b6200333d8882890162003287565b969995985093965092949392505050565b8061040081018310156200077e575f80fd5b5f805f805f805f805f805f6105208c8e0312156200337c575f80fd5b620033888d8d6200334e565b9a50620033996104008d0162003206565b99506104208c013598506104408c01359750620033ba6104608d0162003206565b96506104808c0135620033cd816200321a565b9550620033de6104a08d0162003206565b94506104c08c0135620033f1816200321a565b93506104e08c013592506105008c013567ffffffffffffffff81111562003416575f80fd5b620034248e828f0162003287565b915080935050809150509295989b509295989b9093969950565b5f602082840312156200344f575f80fd5b81356200345c816200321a565b9392505050565b60ff811681146200323c575f80fd5b5f805f805f805f60e0888a03121562003489575f80fd5b8735620034968162003463565b9650620034a66020890162003206565b95506040880135620034b8816200321a565b9450620034c86060890162003206565b93506080880135620034da816200321a565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156200350a575f80fd5b620035158462003206565b9250602084013562003527816200321a565b9150604084013562003539816200321a565b809150509250925092565b5f6020828403121562003555575f80fd5b5035919050565b5f805f805f805f60a0888a03121562003573575f80fd5b6200357e8862003206565b9650602088013562003590816200321a565b9550604088013567ffffffffffffffff80821115620035ad575f80fd5b620035bb8b838c0162003287565b909750955060608a0135915080821115620035d4575f80fd5b50620035e38a828b0162003287565b9094509250506080880135620035f98162003463565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003620575f80fd5b6200362b8862003206565b965060208801356200363d816200321a565b955060408801359450606088013562003656816200321a565b93506080880135620036688162003279565b925060a088013567ffffffffffffffff81111562003684575f80fd5b620036928a828b0162003287565b989b979a50959850939692959293505050565b5f805f806104608587031215620036ba575f80fd5b84359350620036cd86602087016200334e565b9250620036de610420860162003206565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620037968285018789620036ef565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003808578181015183820152602001620037ee565b50505f910152565b5f825162003823818460208701620037ec565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715620038775762003877620037bf565b604052919050565b5f67ffffffffffffffff8211156200389b576200389b620037bf565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112620038d7575f80fd5b8135620038ee620038e8826200387f565b6200382d565b81815284602083860101111562003903575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003932575f80fd5b833567ffffffffffffffff808211156200394a575f80fd5b6200395887838801620038c7565b945060208601359150808211156200396e575f80fd5b506200397d86828701620038c7565b9250506040840135620035398162003463565b5f8151808452620039a9816020860160208601620037ec565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f620039ef606083018662003990565b828103602084015262003a03818662003990565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff80871660208401528086166040840152506080606083015262003106608083018486620036ef565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003a9b606083018486620036ef565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003b325762003b3262003ad2565b5060010190565b606081525f62003b4e606083018789620036ef565b828103602084015262003b63818688620036ef565b91505060ff831660408301529695505050505050565b5f835162003b8c818460208801620037ec565b83519083019062003ba2818360208801620037ec565b01949350505050565b5f6020828403121562003bbc575f80fd5b5051919050565b818103818111156200077e576200077e62003ad2565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003c388285018762003990565b925080851660e085015250509998505050505050505050565b600181815b8085111562003cb057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003c945762003c9462003ad2565b8085161562003ca257918102915b93841c939080029062003c56565b509250929050565b5f8262003cc8575060016200077e565b8162003cd657505f6200077e565b816001811462003cef576002811462003cfa5762003d1a565b60019150506200077e565b60ff84111562003d0e5762003d0e62003ad2565b50506001821b6200077e565b5060208310610133831016604e8410600b841016171562003d3f575081810a6200077e565b62003d4b838362003c51565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d805762003d8062003ad2565b029392505050565b5f6200345c838362003cb8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f808585111562003dd1575f80fd5b8386111562003dde575f80fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003e2c5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562003e4b575f80fd5b873562003e58816200321a565b9650602088013562003e6a816200321a565b955060408801359450606088013593506080880135620034da8162003463565b5f805f805f805f80610100898b03121562003ea3575f80fd5b883562003eb0816200321a565b9750602089013562003ec2816200321a565b96506040890135955060608901359450608089013562003ee28162003279565b935060a089013562003ef48162003463565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562003f22575f80fd5b81516200345c8162003463565b5f6020828403121562003f40575f80fd5b81516200345c8162003279565b5f6020828403121562003f5e575f80fd5b815167ffffffffffffffff81111562003f75575f80fd5b8201601f8101841362003f86575f80fd5b805162003f97620038e8826200387f565b81815285602083850101111562003fac575f80fd5b62003fbf826020830160208601620037ec565b95945050505050565b602081525f6200345c60208301846200399056fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a2646970667358221220efc010afd4f7ef7135c2d52e7832f4d0832c536dbd0768cad0ec9406e70e02b864736f6c63430008140033", - "deployedBytecode": "0x60806040526004361062000197575f3560e01c8063647c576c11620000e2578063be5831c71162000086578063dbc16976116200005e578063dbc16976146200061a578063ee25560b1462000631578063fb5708341462000660575f80fd5b8063be5831c71462000591578063cd58657914620005cc578063d02103ca14620005e3575f80fd5b80639e34070f11620000ba5780639e34070f14620004f1578063aaa13cc21462000534578063bab161bf1462000558575f80fd5b8063647c576c146200047157806379e2cf97146200049557806381b1c17414620004ac575f80fd5b80632d2c9d94116200014a57806334ac9cf2116200012257806334ac9cf2146200033a5780633ae0504714620003685780633e197043146200037f575f80fd5b80632d2c9d9414620002695780632dfdf0b5146200028d578063318aee3d14620002b3575f80fd5b806322e95f2c116200017e57806322e95f2c14620001e4578063240ff378146200022e5780632cffd02e1462000245575f80fd5b806315064c96146200019b5780632072f6c514620001cb575b5f80fd5b348015620001a7575f80fd5b50606854620001b69060ff1681565b60405190151581526020015b60405180910390f35b348015620001d7575f80fd5b50620001e262000684565b005b348015620001f0575f80fd5b5062000208620002023660046200323f565b620006e2565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001c2565b620001e26200023f366004620032cf565b62000784565b34801562000251575f80fd5b50620001e26200026336600462003360565b620009ab565b34801562000275575f80fd5b50620001e26200028736600462003360565b62000f30565b34801562000299575f80fd5b50620002a460535481565b604051908152602001620001c2565b348015620002bf575f80fd5b5062000308620002d13660046200343e565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001c2565b34801562000346575f80fd5b50606c54620002089073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000374575f80fd5b50620002a462001130565b3480156200038b575f80fd5b50620002a46200039d36600462003472565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200047d575f80fd5b50620001e26200048f366004620034f7565b62001215565b348015620004a1575f80fd5b50620001e26200145e565b348015620004b8575f80fd5b5062000208620004ca36600462003544565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620004fd575f80fd5b50620001b66200050f36600462003544565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b34801562000540575f80fd5b5062000208620005523660046200355c565b62001498565b34801562000564575f80fd5b506068546200057b90610100900463ffffffff1681565b60405163ffffffff9091168152602001620001c2565b3480156200059d575f80fd5b506068546200057b90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001e2620005dd36600462003609565b62001682565b348015620005ef575f80fd5b50606854620002089065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000626575f80fd5b50620001e262001bd4565b3480156200063d575f80fd5b50620002a46200064f36600462003544565b60696020525f908152604090205481565b3480156200066c575f80fd5b50620001b66200067e366004620036a5565b62001c30565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006d6576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062001d18565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007c2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620007e85750600263ffffffff861610155b1562000820576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620008769998979695949392919062003736565b60405180910390a1620009936200098d6001606860019054906101000a900463ffffffff16338989348989604051620008b1929190620037b0565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001dab565b8215620009a457620009a462001ebf565b5050505050565b60685460ff1615620009e9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620009ff8b8b8b8b8b8b8b8b8b8b8b5f62001f8f565b73ffffffffffffffffffffffffffffffffffffffff861662000ad757604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a53919062003810565b5f6040518083038185875af1925050503d805f811462000a8f576040519150601f19603f3d011682016040523d82523d5f602084013e62000a94565b606091505b505090508062000ad0576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000eb8565b60685463ffffffff61010090910481169088160362000b195762000b1373ffffffffffffffffffffffffffffffffffffffff871685856200217a565b62000eb8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e2f575f808062000beb868801886200391f565b9250925092505f8584848460405162000c0490620031f8565b62000c1293929190620039db565b8190604051809103905ff590508015801562000c30573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000ca3575f80fd5b505af115801562000cb6573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e1d95949392919062003a17565b60405180910390a15050505062000eb5565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562000e9d575f80fd5b505af115801562000eb0573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000f6e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000f858b8b8b8b8b8b8b8b8b8b8b600162001f8f565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000fb7949392919062003a5e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200103a919062003810565b5f6040518083038185875af1925050503d805f811462001076576040519150601f19603f3d011682016040523d82523d5f602084013e6200107b565b606091505b5050905080620010b7576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200120c578083901c6001166001036200119d576033816020811062001169576200116962003aa5565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620011ca565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620012039062003aff565b9150506200113a565b50919392505050565b5f54610100900460ff16158080156200123457505f54600160ff909116105b806200124f5750303b1580156200124f57505f5460ff166001145b620012e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200133e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016918416919091179055620013f562002250565b801562001458575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620006e057620006e062001ebf565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b3083604051806020016200152c90620031f8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905262001577908d908d908d908d908d9060200162003b39565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052620015b5929160200162003b79565b604051602081830303815290604052805190602001206040516020016200163e94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff1615620016c0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620016ca620022f2565b60685463ffffffff888116610100909204161480620016f05750600263ffffffff881610155b1562001728576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff88166200178c5788341462001783576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f925062001a79565b3415620017c5576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620018ae576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b15801562001884575f80fd5b505af115801562001897573d5f803e3d5ffd5b5050505080602001519450805f0151935062001a77565b8515620018c357620018c3898b898962002367565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200192e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001954919062003bab565b90506200197a73ffffffffffffffffffffffffffffffffffffffff8b1633308e6200287a565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015620019e5573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001a0b919062003bab565b905062001a19828262003bc3565b6068548c9850610100900463ffffffff169650935062001a3987620028da565b62001a448c620029ee565b62001a4f8d62002af7565b60405160200162001a6393929190620039db565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e868860535460405162001aba98979695949392919062003bd9565b60405180910390a162001bac6200098d5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b861562001bbd5762001bbd62001ebf565b5050505062001bcb60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c26576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062002bf5565b5f84815b602081101562001d0a57600163ffffffff8616821c8116900362001ca65785816020811062001c675762001c6762003aa5565b60200201358260405160200162001c88929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001cf5565b8186826020811062001cbc5762001cbc62003aa5565b602002013560405160200162001cdc929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d018162003aff565b91505062001c34565b50821490505b949350505050565b60685460ff161562001d56576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001dbc6020600262003d88565b62001dc8919062003bc3565b6053541062001e03576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001e149062003aff565b918290555090505f5b602081101562001eaf578082901c60011660010362001e5557826033826020811062001e4d5762001e4d62003aa5565b015550505050565b6033816020811062001e6b5762001e6b62003aa5565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001ea69062003aff565b91505062001e1d565b5062001eba62003d95565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001f4562001130565b6040518263ffffffff1660e01b815260040162001f6491815260200190565b5f604051808303815f87803b15801562001f7c575f80fd5b505af115801562001458573d5f803e3d5ffd5b62001fa08b63ffffffff1662002c84565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af11580156200203f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002065919062003bab565b9050805f03620020a0576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8881166101009092041614620020ea576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff16620021075750896200210a565b508a5b620021336200212a848c8c8c8c8c8c8c604051620008b1929190620037b0565b8f8f8462001c30565b6200216a576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001eba9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002ce8565b5f54610100900460ff16620022e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b620006e062002dfa565b60026001540362002360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401620012d8565b6002600155565b5f62002377600482848662003dc2565b620023829162003deb565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620025fc575f808080808080620023e4896004818d62003dc2565b810190620023f3919062003e34565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002467576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff86163014620024b7576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a8514620024f1576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620025ac919062003810565b5f604051808303815f865af19150503d805f8114620025e7576040519150601f19603f3d011682016040523d82523d5f602084013e620025ec565b606091505b50505050505050505050620009a4565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002678576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806200268f8a6004818e62003dc2565b8101906200269e919062003e8a565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002714576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002764576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002828919062003810565b5f604051808303815f865af19150503d805f811462002863576040519150601f19603f3d011682016040523d82523d5f602084013e62002868565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014589085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401620021cd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff8616916200295d919062003810565b5f60405180830381855afa9150503d805f811462002997576040519150601f19603f3d011682016040523d82523d5f602084013e6200299c565b606091505b509150915081620029e3576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d10565b62001d108162002e92565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002a71919062003810565b5f60405180830381855afa9150503d805f811462002aab576040519150601f19603f3d011682016040523d82523d5f602084013e62002ab0565b606091505b509150915081620029e3576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d10565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff86169162002b79919062003810565b5f60405180830381855afa9150503d805f811462002bb3576040519150601f19603f3d011682016040523d82523d5f602084013e62002bb8565b606091505b509150915081801562002bcc575080516020145b62002bd957601262001d10565b8080602001905181019062001d10919062003f11565b60018055565b60685460ff1662002c32576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009a4576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002d4b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200307d9092919063ffffffff16565b80519091501562001eba578080602001905181019062002d6c919062003f2f565b62001eba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401620012d8565b5f54610100900460ff1662002bef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b6060604082511062002eb457818060200190518101906200077e919062003f4d565b81516020036200303f575f5b60208110801562002f0b575082818151811062002ee15762002ee162003aa5565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002f26578062002f1d8162003aff565b91505062002ec0565b805f0362002f6957505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff81111562002f865762002f86620037bf565b6040519080825280601f01601f19166020018201604052801562002fb1576020820181803683370190505b5090505f5b82811015620030375784818151811062002fd45762002fd462003aa5565b602001015160f81c60f81b82828151811062002ff45762002ff462003aa5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350806200302e8162003aff565b91505062002fb6565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d1084845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051620030b2919062003810565b5f6040518083038185875af1925050503d805f8114620030ee576040519150601f19603f3d011682016040523d82523d5f602084013e620030f3565b606091505b5091509150620031068783838762003111565b979650505050505050565b60608315620031ab5782515f03620031a35773ffffffffffffffffffffffffffffffffffffffff85163b620031a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620012d8565b508162001d10565b62001d108383815115620031c25781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620012d8919062003fc8565b611b0d8062003fdd83390190565b803563ffffffff8116811462003078575f80fd5b73ffffffffffffffffffffffffffffffffffffffff811681146200323c575f80fd5b50565b5f806040838503121562003251575f80fd5b6200325c8362003206565b915060208301356200326e816200321a565b809150509250929050565b80151581146200323c575f80fd5b5f8083601f84011262003298575f80fd5b50813567ffffffffffffffff811115620032b0575f80fd5b602083019150836020828501011115620032c8575f80fd5b9250929050565b5f805f805f60808688031215620032e4575f80fd5b620032ef8662003206565b9450602086013562003301816200321a565b93506040860135620033138162003279565b9250606086013567ffffffffffffffff8111156200332f575f80fd5b6200333d8882890162003287565b969995985093965092949392505050565b8061040081018310156200077e575f80fd5b5f805f805f805f805f805f6105208c8e0312156200337c575f80fd5b620033888d8d6200334e565b9a50620033996104008d0162003206565b99506104208c013598506104408c01359750620033ba6104608d0162003206565b96506104808c0135620033cd816200321a565b9550620033de6104a08d0162003206565b94506104c08c0135620033f1816200321a565b93506104e08c013592506105008c013567ffffffffffffffff81111562003416575f80fd5b620034248e828f0162003287565b915080935050809150509295989b509295989b9093969950565b5f602082840312156200344f575f80fd5b81356200345c816200321a565b9392505050565b60ff811681146200323c575f80fd5b5f805f805f805f60e0888a03121562003489575f80fd5b8735620034968162003463565b9650620034a66020890162003206565b95506040880135620034b8816200321a565b9450620034c86060890162003206565b93506080880135620034da816200321a565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156200350a575f80fd5b620035158462003206565b9250602084013562003527816200321a565b9150604084013562003539816200321a565b809150509250925092565b5f6020828403121562003555575f80fd5b5035919050565b5f805f805f805f60a0888a03121562003573575f80fd5b6200357e8862003206565b9650602088013562003590816200321a565b9550604088013567ffffffffffffffff80821115620035ad575f80fd5b620035bb8b838c0162003287565b909750955060608a0135915080821115620035d4575f80fd5b50620035e38a828b0162003287565b9094509250506080880135620035f98162003463565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003620575f80fd5b6200362b8862003206565b965060208801356200363d816200321a565b955060408801359450606088013562003656816200321a565b93506080880135620036688162003279565b925060a088013567ffffffffffffffff81111562003684575f80fd5b620036928a828b0162003287565b989b979a50959850939692959293505050565b5f805f806104608587031215620036ba575f80fd5b84359350620036cd86602087016200334e565b9250620036de610420860162003206565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620037968285018789620036ef565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003808578181015183820152602001620037ee565b50505f910152565b5f825162003823818460208701620037ec565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715620038775762003877620037bf565b604052919050565b5f67ffffffffffffffff8211156200389b576200389b620037bf565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112620038d7575f80fd5b8135620038ee620038e8826200387f565b6200382d565b81815284602083860101111562003903575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003932575f80fd5b833567ffffffffffffffff808211156200394a575f80fd5b6200395887838801620038c7565b945060208601359150808211156200396e575f80fd5b506200397d86828701620038c7565b9250506040840135620035398162003463565b5f8151808452620039a9816020860160208601620037ec565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f620039ef606083018662003990565b828103602084015262003a03818662003990565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff80871660208401528086166040840152506080606083015262003106608083018486620036ef565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003a9b606083018486620036ef565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003b325762003b3262003ad2565b5060010190565b606081525f62003b4e606083018789620036ef565b828103602084015262003b63818688620036ef565b91505060ff831660408301529695505050505050565b5f835162003b8c818460208801620037ec565b83519083019062003ba2818360208801620037ec565b01949350505050565b5f6020828403121562003bbc575f80fd5b5051919050565b818103818111156200077e576200077e62003ad2565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003c388285018762003990565b925080851660e085015250509998505050505050505050565b600181815b8085111562003cb057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003c945762003c9462003ad2565b8085161562003ca257918102915b93841c939080029062003c56565b509250929050565b5f8262003cc8575060016200077e565b8162003cd657505f6200077e565b816001811462003cef576002811462003cfa5762003d1a565b60019150506200077e565b60ff84111562003d0e5762003d0e62003ad2565b50506001821b6200077e565b5060208310610133831016604e8410600b841016171562003d3f575081810a6200077e565b62003d4b838362003c51565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d805762003d8062003ad2565b029392505050565b5f6200345c838362003cb8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f808585111562003dd1575f80fd5b8386111562003dde575f80fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003e2c5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562003e4b575f80fd5b873562003e58816200321a565b9650602088013562003e6a816200321a565b955060408801359450606088013593506080880135620034da8162003463565b5f805f805f805f80610100898b03121562003ea3575f80fd5b883562003eb0816200321a565b9750602089013562003ec2816200321a565b96506040890135955060608901359450608089013562003ee28162003279565b935060a089013562003ef48162003463565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562003f22575f80fd5b81516200345c8162003463565b5f6020828403121562003f40575f80fd5b81516200345c8162003279565b5f6020828403121562003f5e575f80fd5b815167ffffffffffffffff81111562003f75575f80fd5b8201601f8101841362003f86575f80fd5b805162003f97620038e8826200387f565b81815285602083850101111562003fac575f80fd5b62003fbf826020830160208601620037ec565b95945050505050565b602081525f6200345c60208301846200399056fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a2646970667358221220efc010afd4f7ef7135c2d52e7832f4d0832c536dbd0768cad0ec9406e70e02b864736f6c63430008140033", + "bytecode": "0x608060405234801561000f575f80fd5b50615b1f8061001d5f395ff3fe60806040526004361062000197575f3560e01c8063647c576c11620000e2578063be5831c71162000086578063dbc16976116200005e578063dbc16976146200061a578063ee25560b1462000631578063fb5708341462000660575f80fd5b8063be5831c71462000591578063cd58657914620005cc578063d02103ca14620005e3575f80fd5b80639e34070f11620000ba5780639e34070f14620004f1578063aaa13cc21462000534578063bab161bf1462000558575f80fd5b8063647c576c146200047157806379e2cf97146200049557806381b1c17414620004ac575f80fd5b80632d2c9d94116200014a57806334ac9cf2116200012257806334ac9cf2146200033a5780633e19704314620003685780635ca1e165146200045a575f80fd5b80632d2c9d9414620002695780632dfdf0b5146200028d578063318aee3d14620002b3575f80fd5b806322e95f2c116200017e57806322e95f2c14620001e4578063240ff378146200022e5780632cffd02e1462000245575f80fd5b806315064c96146200019b5780632072f6c514620001cb575b5f80fd5b348015620001a7575f80fd5b50606854620001b69060ff1681565b60405190151581526020015b60405180910390f35b348015620001d7575f80fd5b50620001e262000684565b005b348015620001f0575f80fd5b5062000208620002023660046200323f565b620006e2565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001c2565b620001e26200023f366004620032cf565b62000784565b34801562000251575f80fd5b50620001e26200026336600462003360565b620009ab565b34801562000275575f80fd5b50620001e26200028736600462003360565b62000f30565b34801562000299575f80fd5b50620002a460535481565b604051908152602001620001c2565b348015620002bf575f80fd5b5062000308620002d13660046200343e565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001c2565b34801562000346575f80fd5b50606c54620002089073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000374575f80fd5b50620002a46200038636600462003472565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b34801562000466575f80fd5b50620002a462001130565b3480156200047d575f80fd5b50620001e26200048f366004620034f7565b62001215565b348015620004a1575f80fd5b50620001e26200145e565b348015620004b8575f80fd5b5062000208620004ca36600462003544565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620004fd575f80fd5b50620001b66200050f36600462003544565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b34801562000540575f80fd5b5062000208620005523660046200355c565b62001498565b34801562000564575f80fd5b506068546200057b90610100900463ffffffff1681565b60405163ffffffff9091168152602001620001c2565b3480156200059d575f80fd5b506068546200057b90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001e2620005dd36600462003609565b62001682565b348015620005ef575f80fd5b50606854620002089065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000626575f80fd5b50620001e262001bd4565b3480156200063d575f80fd5b50620002a46200064f36600462003544565b60696020525f908152604090205481565b3480156200066c575f80fd5b50620001b66200067e366004620036a5565b62001c30565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006d6576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062001d18565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007c2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620007e85750600263ffffffff861610155b1562000820576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620008769998979695949392919062003736565b60405180910390a1620009936200098d6001606860019054906101000a900463ffffffff16338989348989604051620008b1929190620037b0565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001dab565b8215620009a457620009a462001ebf565b5050505050565b60685460ff1615620009e9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620009ff8b8b8b8b8b8b8b8b8b8b8b5f62001f8f565b73ffffffffffffffffffffffffffffffffffffffff861662000ad757604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a53919062003810565b5f6040518083038185875af1925050503d805f811462000a8f576040519150601f19603f3d011682016040523d82523d5f602084013e62000a94565b606091505b505090508062000ad0576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000eb8565b60685463ffffffff61010090910481169088160362000b195762000b1373ffffffffffffffffffffffffffffffffffffffff871685856200217a565b62000eb8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e2f575f808062000beb868801886200391f565b9250925092505f8584848460405162000c0490620031f8565b62000c1293929190620039db565b8190604051809103905ff590508015801562000c30573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000ca3575f80fd5b505af115801562000cb6573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e1d95949392919062003a17565b60405180910390a15050505062000eb5565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562000e9d575f80fd5b505af115801562000eb0573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000f6e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000f858b8b8b8b8b8b8b8b8b8b8b600162001f8f565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000fb7949392919062003a5e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200103a919062003810565b5f6040518083038185875af1925050503d805f811462001076576040519150601f19603f3d011682016040523d82523d5f602084013e6200107b565b606091505b5050905080620010b7576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200120c578083901c6001166001036200119d576033816020811062001169576200116962003aa5565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620011ca565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620012039062003aff565b9150506200113a565b50919392505050565b5f54610100900460ff16158080156200123457505f54600160ff909116105b806200124f5750303b1580156200124f57505f5460ff166001145b620012e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200133e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016918416919091179055620013f562002250565b801562001458575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620006e057620006e062001ebf565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b3083604051806020016200152c90620031f8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905262001577908d908d908d908d908d9060200162003b39565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052620015b5929160200162003b79565b604051602081830303815290604052805190602001206040516020016200163e94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff1615620016c0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620016ca620022f2565b60685463ffffffff888116610100909204161480620016f05750600263ffffffff881610155b1562001728576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff88166200178c5788341462001783576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f925062001a79565b3415620017c5576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620018ae576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b15801562001884575f80fd5b505af115801562001897573d5f803e3d5ffd5b5050505080602001519450805f0151935062001a77565b8515620018c357620018c3898b898962002367565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200192e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001954919062003bab565b90506200197a73ffffffffffffffffffffffffffffffffffffffff8b1633308e6200287a565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015620019e5573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001a0b919062003bab565b905062001a19828262003bc3565b6068548c9850610100900463ffffffff169650935062001a3987620028da565b62001a448c620029ee565b62001a4f8d62002af7565b60405160200162001a6393929190620039db565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e868860535460405162001aba98979695949392919062003bd9565b60405180910390a162001bac6200098d5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b861562001bbd5762001bbd62001ebf565b5050505062001bcb60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c26576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062002bf5565b5f84815b602081101562001d0a57600163ffffffff8616821c8116900362001ca65785816020811062001c675762001c6762003aa5565b60200201358260405160200162001c88929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001cf5565b8186826020811062001cbc5762001cbc62003aa5565b602002013560405160200162001cdc929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d018162003aff565b91505062001c34565b50821490505b949350505050565b60685460ff161562001d56576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001dbc6020600262003d88565b62001dc8919062003bc3565b6053541062001e03576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001e149062003aff565b918290555090505f5b602081101562001eaf578082901c60011660010362001e5557826033826020811062001e4d5762001e4d62003aa5565b015550505050565b6033816020811062001e6b5762001e6b62003aa5565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001ea69062003aff565b91505062001e1d565b5062001eba62003d95565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001f4562001130565b6040518263ffffffff1660e01b815260040162001f6491815260200190565b5f604051808303815f87803b15801562001f7c575f80fd5b505af115801562001458573d5f803e3d5ffd5b62001fa08b63ffffffff1662002c84565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af11580156200203f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002065919062003bab565b9050805f03620020a0576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8881166101009092041614620020ea576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff16620021075750896200210a565b508a5b620021336200212a848c8c8c8c8c8c8c604051620008b1929190620037b0565b8f8f8462001c30565b6200216a576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001eba9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002ce8565b5f54610100900460ff16620022e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b620006e062002dfa565b60026001540362002360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401620012d8565b6002600155565b5f62002377600482848662003dc2565b620023829162003deb565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620025fc575f808080808080620023e4896004818d62003dc2565b810190620023f3919062003e34565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002467576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff86163014620024b7576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a8514620024f1576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620025ac919062003810565b5f604051808303815f865af19150503d805f8114620025e7576040519150601f19603f3d011682016040523d82523d5f602084013e620025ec565b606091505b50505050505050505050620009a4565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002678576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806200268f8a6004818e62003dc2565b8101906200269e919062003e8a565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002714576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002764576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002828919062003810565b5f604051808303815f865af19150503d805f811462002863576040519150601f19603f3d011682016040523d82523d5f602084013e62002868565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014589085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401620021cd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff8616916200295d919062003810565b5f60405180830381855afa9150503d805f811462002997576040519150601f19603f3d011682016040523d82523d5f602084013e6200299c565b606091505b509150915081620029e3576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d10565b62001d108162002e92565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002a71919062003810565b5f60405180830381855afa9150503d805f811462002aab576040519150601f19603f3d011682016040523d82523d5f602084013e62002ab0565b606091505b509150915081620029e3576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d10565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff86169162002b79919062003810565b5f60405180830381855afa9150503d805f811462002bb3576040519150601f19603f3d011682016040523d82523d5f602084013e62002bb8565b606091505b509150915081801562002bcc575080516020145b62002bd957601262001d10565b8080602001905181019062001d10919062003f11565b60018055565b60685460ff1662002c32576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009a4576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002d4b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200307d9092919063ffffffff16565b80519091501562001eba578080602001905181019062002d6c919062003f2f565b62001eba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401620012d8565b5f54610100900460ff1662002bef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b6060604082511062002eb457818060200190518101906200077e919062003f4d565b81516020036200303f575f5b60208110801562002f0b575082818151811062002ee15762002ee162003aa5565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002f26578062002f1d8162003aff565b91505062002ec0565b805f0362002f6957505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff81111562002f865762002f86620037bf565b6040519080825280601f01601f19166020018201604052801562002fb1576020820181803683370190505b5090505f5b82811015620030375784818151811062002fd45762002fd462003aa5565b602001015160f81c60f81b82828151811062002ff45762002ff462003aa5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350806200302e8162003aff565b91505062002fb6565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d1084845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051620030b2919062003810565b5f6040518083038185875af1925050503d805f8114620030ee576040519150601f19603f3d011682016040523d82523d5f602084013e620030f3565b606091505b5091509150620031068783838762003111565b979650505050505050565b60608315620031ab5782515f03620031a35773ffffffffffffffffffffffffffffffffffffffff85163b620031a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620012d8565b508162001d10565b62001d108383815115620031c25781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620012d8919062003fc8565b611b0d8062003fdd83390190565b803563ffffffff8116811462003078575f80fd5b73ffffffffffffffffffffffffffffffffffffffff811681146200323c575f80fd5b50565b5f806040838503121562003251575f80fd5b6200325c8362003206565b915060208301356200326e816200321a565b809150509250929050565b80151581146200323c575f80fd5b5f8083601f84011262003298575f80fd5b50813567ffffffffffffffff811115620032b0575f80fd5b602083019150836020828501011115620032c8575f80fd5b9250929050565b5f805f805f60808688031215620032e4575f80fd5b620032ef8662003206565b9450602086013562003301816200321a565b93506040860135620033138162003279565b9250606086013567ffffffffffffffff8111156200332f575f80fd5b6200333d8882890162003287565b969995985093965092949392505050565b8061040081018310156200077e575f80fd5b5f805f805f805f805f805f6105208c8e0312156200337c575f80fd5b620033888d8d6200334e565b9a50620033996104008d0162003206565b99506104208c013598506104408c01359750620033ba6104608d0162003206565b96506104808c0135620033cd816200321a565b9550620033de6104a08d0162003206565b94506104c08c0135620033f1816200321a565b93506104e08c013592506105008c013567ffffffffffffffff81111562003416575f80fd5b620034248e828f0162003287565b915080935050809150509295989b509295989b9093969950565b5f602082840312156200344f575f80fd5b81356200345c816200321a565b9392505050565b60ff811681146200323c575f80fd5b5f805f805f805f60e0888a03121562003489575f80fd5b8735620034968162003463565b9650620034a66020890162003206565b95506040880135620034b8816200321a565b9450620034c86060890162003206565b93506080880135620034da816200321a565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156200350a575f80fd5b620035158462003206565b9250602084013562003527816200321a565b9150604084013562003539816200321a565b809150509250925092565b5f6020828403121562003555575f80fd5b5035919050565b5f805f805f805f60a0888a03121562003573575f80fd5b6200357e8862003206565b9650602088013562003590816200321a565b9550604088013567ffffffffffffffff80821115620035ad575f80fd5b620035bb8b838c0162003287565b909750955060608a0135915080821115620035d4575f80fd5b50620035e38a828b0162003287565b9094509250506080880135620035f98162003463565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003620575f80fd5b6200362b8862003206565b965060208801356200363d816200321a565b955060408801359450606088013562003656816200321a565b93506080880135620036688162003279565b925060a088013567ffffffffffffffff81111562003684575f80fd5b620036928a828b0162003287565b989b979a50959850939692959293505050565b5f805f806104608587031215620036ba575f80fd5b84359350620036cd86602087016200334e565b9250620036de610420860162003206565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620037968285018789620036ef565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003808578181015183820152602001620037ee565b50505f910152565b5f825162003823818460208701620037ec565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715620038775762003877620037bf565b604052919050565b5f67ffffffffffffffff8211156200389b576200389b620037bf565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112620038d7575f80fd5b8135620038ee620038e8826200387f565b6200382d565b81815284602083860101111562003903575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003932575f80fd5b833567ffffffffffffffff808211156200394a575f80fd5b6200395887838801620038c7565b945060208601359150808211156200396e575f80fd5b506200397d86828701620038c7565b9250506040840135620035398162003463565b5f8151808452620039a9816020860160208601620037ec565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f620039ef606083018662003990565b828103602084015262003a03818662003990565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff80871660208401528086166040840152506080606083015262003106608083018486620036ef565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003a9b606083018486620036ef565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003b325762003b3262003ad2565b5060010190565b606081525f62003b4e606083018789620036ef565b828103602084015262003b63818688620036ef565b91505060ff831660408301529695505050505050565b5f835162003b8c818460208801620037ec565b83519083019062003ba2818360208801620037ec565b01949350505050565b5f6020828403121562003bbc575f80fd5b5051919050565b818103818111156200077e576200077e62003ad2565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003c388285018762003990565b925080851660e085015250509998505050505050505050565b600181815b8085111562003cb057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003c945762003c9462003ad2565b8085161562003ca257918102915b93841c939080029062003c56565b509250929050565b5f8262003cc8575060016200077e565b8162003cd657505f6200077e565b816001811462003cef576002811462003cfa5762003d1a565b60019150506200077e565b60ff84111562003d0e5762003d0e62003ad2565b50506001821b6200077e565b5060208310610133831016604e8410600b841016171562003d3f575081810a6200077e565b62003d4b838362003c51565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d805762003d8062003ad2565b029392505050565b5f6200345c838362003cb8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f808585111562003dd1575f80fd5b8386111562003dde575f80fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003e2c5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562003e4b575f80fd5b873562003e58816200321a565b9650602088013562003e6a816200321a565b955060408801359450606088013593506080880135620034da8162003463565b5f805f805f805f80610100898b03121562003ea3575f80fd5b883562003eb0816200321a565b9750602089013562003ec2816200321a565b96506040890135955060608901359450608089013562003ee28162003279565b935060a089013562003ef48162003463565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562003f22575f80fd5b81516200345c8162003463565b5f6020828403121562003f40575f80fd5b81516200345c8162003279565b5f6020828403121562003f5e575f80fd5b815167ffffffffffffffff81111562003f75575f80fd5b8201601f8101841362003f86575f80fd5b805162003f97620038e8826200387f565b81815285602083850101111562003fac575f80fd5b62003fbf826020830160208601620037ec565b95945050505050565b602081525f6200345c60208301846200399056fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a2646970667358221220a5a87ee7306addc678df728ba95068cf49221fa5fc9eb0965302ffda8e2e3ae564736f6c63430008140033", + "deployedBytecode": "0x60806040526004361062000197575f3560e01c8063647c576c11620000e2578063be5831c71162000086578063dbc16976116200005e578063dbc16976146200061a578063ee25560b1462000631578063fb5708341462000660575f80fd5b8063be5831c71462000591578063cd58657914620005cc578063d02103ca14620005e3575f80fd5b80639e34070f11620000ba5780639e34070f14620004f1578063aaa13cc21462000534578063bab161bf1462000558575f80fd5b8063647c576c146200047157806379e2cf97146200049557806381b1c17414620004ac575f80fd5b80632d2c9d94116200014a57806334ac9cf2116200012257806334ac9cf2146200033a5780633e19704314620003685780635ca1e165146200045a575f80fd5b80632d2c9d9414620002695780632dfdf0b5146200028d578063318aee3d14620002b3575f80fd5b806322e95f2c116200017e57806322e95f2c14620001e4578063240ff378146200022e5780632cffd02e1462000245575f80fd5b806315064c96146200019b5780632072f6c514620001cb575b5f80fd5b348015620001a7575f80fd5b50606854620001b69060ff1681565b60405190151581526020015b60405180910390f35b348015620001d7575f80fd5b50620001e262000684565b005b348015620001f0575f80fd5b5062000208620002023660046200323f565b620006e2565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001c2565b620001e26200023f366004620032cf565b62000784565b34801562000251575f80fd5b50620001e26200026336600462003360565b620009ab565b34801562000275575f80fd5b50620001e26200028736600462003360565b62000f30565b34801562000299575f80fd5b50620002a460535481565b604051908152602001620001c2565b348015620002bf575f80fd5b5062000308620002d13660046200343e565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001c2565b34801562000346575f80fd5b50606c54620002089073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000374575f80fd5b50620002a46200038636600462003472565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b34801562000466575f80fd5b50620002a462001130565b3480156200047d575f80fd5b50620001e26200048f366004620034f7565b62001215565b348015620004a1575f80fd5b50620001e26200145e565b348015620004b8575f80fd5b5062000208620004ca36600462003544565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620004fd575f80fd5b50620001b66200050f36600462003544565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b34801562000540575f80fd5b5062000208620005523660046200355c565b62001498565b34801562000564575f80fd5b506068546200057b90610100900463ffffffff1681565b60405163ffffffff9091168152602001620001c2565b3480156200059d575f80fd5b506068546200057b90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001e2620005dd36600462003609565b62001682565b348015620005ef575f80fd5b50606854620002089065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000626575f80fd5b50620001e262001bd4565b3480156200063d575f80fd5b50620002a46200064f36600462003544565b60696020525f908152604090205481565b3480156200066c575f80fd5b50620001b66200067e366004620036a5565b62001c30565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006d6576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062001d18565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007c2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620007e85750600263ffffffff861610155b1562000820576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620008769998979695949392919062003736565b60405180910390a1620009936200098d6001606860019054906101000a900463ffffffff16338989348989604051620008b1929190620037b0565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001dab565b8215620009a457620009a462001ebf565b5050505050565b60685460ff1615620009e9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620009ff8b8b8b8b8b8b8b8b8b8b8b5f62001f8f565b73ffffffffffffffffffffffffffffffffffffffff861662000ad757604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a53919062003810565b5f6040518083038185875af1925050503d805f811462000a8f576040519150601f19603f3d011682016040523d82523d5f602084013e62000a94565b606091505b505090508062000ad0576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000eb8565b60685463ffffffff61010090910481169088160362000b195762000b1373ffffffffffffffffffffffffffffffffffffffff871685856200217a565b62000eb8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e2f575f808062000beb868801886200391f565b9250925092505f8584848460405162000c0490620031f8565b62000c1293929190620039db565b8190604051809103905ff590508015801562000c30573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000ca3575f80fd5b505af115801562000cb6573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e1d95949392919062003a17565b60405180910390a15050505062000eb5565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562000e9d575f80fd5b505af115801562000eb0573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000f6e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000f858b8b8b8b8b8b8b8b8b8b8b600162001f8f565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000fb7949392919062003a5e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200103a919062003810565b5f6040518083038185875af1925050503d805f811462001076576040519150601f19603f3d011682016040523d82523d5f602084013e6200107b565b606091505b5050905080620010b7576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200120c578083901c6001166001036200119d576033816020811062001169576200116962003aa5565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620011ca565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620012039062003aff565b9150506200113a565b50919392505050565b5f54610100900460ff16158080156200123457505f54600160ff909116105b806200124f5750303b1580156200124f57505f5460ff166001145b620012e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200133e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016918416919091179055620013f562002250565b801562001458575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620006e057620006e062001ebf565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b3083604051806020016200152c90620031f8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905262001577908d908d908d908d908d9060200162003b39565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052620015b5929160200162003b79565b604051602081830303815290604052805190602001206040516020016200163e94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff1615620016c0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620016ca620022f2565b60685463ffffffff888116610100909204161480620016f05750600263ffffffff881610155b1562001728576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff88166200178c5788341462001783576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f925062001a79565b3415620017c5576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620018ae576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b15801562001884575f80fd5b505af115801562001897573d5f803e3d5ffd5b5050505080602001519450805f0151935062001a77565b8515620018c357620018c3898b898962002367565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200192e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001954919062003bab565b90506200197a73ffffffffffffffffffffffffffffffffffffffff8b1633308e6200287a565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015620019e5573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001a0b919062003bab565b905062001a19828262003bc3565b6068548c9850610100900463ffffffff169650935062001a3987620028da565b62001a448c620029ee565b62001a4f8d62002af7565b60405160200162001a6393929190620039db565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e868860535460405162001aba98979695949392919062003bd9565b60405180910390a162001bac6200098d5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b861562001bbd5762001bbd62001ebf565b5050505062001bcb60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c26576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062002bf5565b5f84815b602081101562001d0a57600163ffffffff8616821c8116900362001ca65785816020811062001c675762001c6762003aa5565b60200201358260405160200162001c88929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001cf5565b8186826020811062001cbc5762001cbc62003aa5565b602002013560405160200162001cdc929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d018162003aff565b91505062001c34565b50821490505b949350505050565b60685460ff161562001d56576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001dbc6020600262003d88565b62001dc8919062003bc3565b6053541062001e03576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001e149062003aff565b918290555090505f5b602081101562001eaf578082901c60011660010362001e5557826033826020811062001e4d5762001e4d62003aa5565b015550505050565b6033816020811062001e6b5762001e6b62003aa5565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001ea69062003aff565b91505062001e1d565b5062001eba62003d95565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001f4562001130565b6040518263ffffffff1660e01b815260040162001f6491815260200190565b5f604051808303815f87803b15801562001f7c575f80fd5b505af115801562001458573d5f803e3d5ffd5b62001fa08b63ffffffff1662002c84565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af11580156200203f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002065919062003bab565b9050805f03620020a0576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8881166101009092041614620020ea576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff16620021075750896200210a565b508a5b620021336200212a848c8c8c8c8c8c8c604051620008b1929190620037b0565b8f8f8462001c30565b6200216a576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001eba9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002ce8565b5f54610100900460ff16620022e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b620006e062002dfa565b60026001540362002360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401620012d8565b6002600155565b5f62002377600482848662003dc2565b620023829162003deb565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620025fc575f808080808080620023e4896004818d62003dc2565b810190620023f3919062003e34565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002467576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff86163014620024b7576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a8514620024f1576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620025ac919062003810565b5f604051808303815f865af19150503d805f8114620025e7576040519150601f19603f3d011682016040523d82523d5f602084013e620025ec565b606091505b50505050505050505050620009a4565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002678576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806200268f8a6004818e62003dc2565b8101906200269e919062003e8a565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002714576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002764576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002828919062003810565b5f604051808303815f865af19150503d805f811462002863576040519150601f19603f3d011682016040523d82523d5f602084013e62002868565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014589085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401620021cd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff8616916200295d919062003810565b5f60405180830381855afa9150503d805f811462002997576040519150601f19603f3d011682016040523d82523d5f602084013e6200299c565b606091505b509150915081620029e3576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d10565b62001d108162002e92565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002a71919062003810565b5f60405180830381855afa9150503d805f811462002aab576040519150601f19603f3d011682016040523d82523d5f602084013e62002ab0565b606091505b509150915081620029e3576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d10565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff86169162002b79919062003810565b5f60405180830381855afa9150503d805f811462002bb3576040519150601f19603f3d011682016040523d82523d5f602084013e62002bb8565b606091505b509150915081801562002bcc575080516020145b62002bd957601262001d10565b8080602001905181019062001d10919062003f11565b60018055565b60685460ff1662002c32576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009a4576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002d4b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200307d9092919063ffffffff16565b80519091501562001eba578080602001905181019062002d6c919062003f2f565b62001eba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401620012d8565b5f54610100900460ff1662002bef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b6060604082511062002eb457818060200190518101906200077e919062003f4d565b81516020036200303f575f5b60208110801562002f0b575082818151811062002ee15762002ee162003aa5565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002f26578062002f1d8162003aff565b91505062002ec0565b805f0362002f6957505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff81111562002f865762002f86620037bf565b6040519080825280601f01601f19166020018201604052801562002fb1576020820181803683370190505b5090505f5b82811015620030375784818151811062002fd45762002fd462003aa5565b602001015160f81c60f81b82828151811062002ff45762002ff462003aa5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350806200302e8162003aff565b91505062002fb6565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d1084845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051620030b2919062003810565b5f6040518083038185875af1925050503d805f8114620030ee576040519150601f19603f3d011682016040523d82523d5f602084013e620030f3565b606091505b5091509150620031068783838762003111565b979650505050505050565b60608315620031ab5782515f03620031a35773ffffffffffffffffffffffffffffffffffffffff85163b620031a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620012d8565b508162001d10565b62001d108383815115620031c25781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620012d8919062003fc8565b611b0d8062003fdd83390190565b803563ffffffff8116811462003078575f80fd5b73ffffffffffffffffffffffffffffffffffffffff811681146200323c575f80fd5b50565b5f806040838503121562003251575f80fd5b6200325c8362003206565b915060208301356200326e816200321a565b809150509250929050565b80151581146200323c575f80fd5b5f8083601f84011262003298575f80fd5b50813567ffffffffffffffff811115620032b0575f80fd5b602083019150836020828501011115620032c8575f80fd5b9250929050565b5f805f805f60808688031215620032e4575f80fd5b620032ef8662003206565b9450602086013562003301816200321a565b93506040860135620033138162003279565b9250606086013567ffffffffffffffff8111156200332f575f80fd5b6200333d8882890162003287565b969995985093965092949392505050565b8061040081018310156200077e575f80fd5b5f805f805f805f805f805f6105208c8e0312156200337c575f80fd5b620033888d8d6200334e565b9a50620033996104008d0162003206565b99506104208c013598506104408c01359750620033ba6104608d0162003206565b96506104808c0135620033cd816200321a565b9550620033de6104a08d0162003206565b94506104c08c0135620033f1816200321a565b93506104e08c013592506105008c013567ffffffffffffffff81111562003416575f80fd5b620034248e828f0162003287565b915080935050809150509295989b509295989b9093969950565b5f602082840312156200344f575f80fd5b81356200345c816200321a565b9392505050565b60ff811681146200323c575f80fd5b5f805f805f805f60e0888a03121562003489575f80fd5b8735620034968162003463565b9650620034a66020890162003206565b95506040880135620034b8816200321a565b9450620034c86060890162003206565b93506080880135620034da816200321a565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156200350a575f80fd5b620035158462003206565b9250602084013562003527816200321a565b9150604084013562003539816200321a565b809150509250925092565b5f6020828403121562003555575f80fd5b5035919050565b5f805f805f805f60a0888a03121562003573575f80fd5b6200357e8862003206565b9650602088013562003590816200321a565b9550604088013567ffffffffffffffff80821115620035ad575f80fd5b620035bb8b838c0162003287565b909750955060608a0135915080821115620035d4575f80fd5b50620035e38a828b0162003287565b9094509250506080880135620035f98162003463565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003620575f80fd5b6200362b8862003206565b965060208801356200363d816200321a565b955060408801359450606088013562003656816200321a565b93506080880135620036688162003279565b925060a088013567ffffffffffffffff81111562003684575f80fd5b620036928a828b0162003287565b989b979a50959850939692959293505050565b5f805f806104608587031215620036ba575f80fd5b84359350620036cd86602087016200334e565b9250620036de610420860162003206565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620037968285018789620036ef565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003808578181015183820152602001620037ee565b50505f910152565b5f825162003823818460208701620037ec565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715620038775762003877620037bf565b604052919050565b5f67ffffffffffffffff8211156200389b576200389b620037bf565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112620038d7575f80fd5b8135620038ee620038e8826200387f565b6200382d565b81815284602083860101111562003903575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003932575f80fd5b833567ffffffffffffffff808211156200394a575f80fd5b6200395887838801620038c7565b945060208601359150808211156200396e575f80fd5b506200397d86828701620038c7565b9250506040840135620035398162003463565b5f8151808452620039a9816020860160208601620037ec565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f620039ef606083018662003990565b828103602084015262003a03818662003990565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff80871660208401528086166040840152506080606083015262003106608083018486620036ef565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003a9b606083018486620036ef565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003b325762003b3262003ad2565b5060010190565b606081525f62003b4e606083018789620036ef565b828103602084015262003b63818688620036ef565b91505060ff831660408301529695505050505050565b5f835162003b8c818460208801620037ec565b83519083019062003ba2818360208801620037ec565b01949350505050565b5f6020828403121562003bbc575f80fd5b5051919050565b818103818111156200077e576200077e62003ad2565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003c388285018762003990565b925080851660e085015250509998505050505050505050565b600181815b8085111562003cb057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003c945762003c9462003ad2565b8085161562003ca257918102915b93841c939080029062003c56565b509250929050565b5f8262003cc8575060016200077e565b8162003cd657505f6200077e565b816001811462003cef576002811462003cfa5762003d1a565b60019150506200077e565b60ff84111562003d0e5762003d0e62003ad2565b50506001821b6200077e565b5060208310610133831016604e8410600b841016171562003d3f575081810a6200077e565b62003d4b838362003c51565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d805762003d8062003ad2565b029392505050565b5f6200345c838362003cb8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f808585111562003dd1575f80fd5b8386111562003dde575f80fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003e2c5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562003e4b575f80fd5b873562003e58816200321a565b9650602088013562003e6a816200321a565b955060408801359450606088013593506080880135620034da8162003463565b5f805f805f805f80610100898b03121562003ea3575f80fd5b883562003eb0816200321a565b9750602089013562003ec2816200321a565b96506040890135955060608901359450608089013562003ee28162003279565b935060a089013562003ef48162003463565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562003f22575f80fd5b81516200345c8162003463565b5f6020828403121562003f40575f80fd5b81516200345c8162003279565b5f6020828403121562003f5e575f80fd5b815167ffffffffffffffff81111562003f75575f80fd5b8201601f8101841362003f86575f80fd5b805162003f97620038e8826200387f565b81815285602083850101111562003fac575f80fd5b62003fbf826020830160208601620037ec565b95945050505050565b602081525f6200345c60208301846200399056fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a2646970667358221220a5a87ee7306addc678df728ba95068cf49221fa5fc9eb0965302ffda8e2e3ae564736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMBridgeMock.json b/compiled-contracts/PolygonZkEVMBridgeMock.json index 80c9d0f50..d632e253b 100644 --- a/compiled-contracts/PolygonZkEVMBridgeMock.json +++ b/compiled-contracts/PolygonZkEVMBridgeMock.json @@ -478,19 +478,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "getDepositRoot", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -540,6 +527,19 @@ "stateMutability": "pure", "type": "function" }, + { + "inputs": [], + "name": "getRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -867,8 +867,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561000f575f80fd5b50615f348061001d5f395ff3fe608060405260043610620001df575f3560e01c8063715018a61162000106578063bab161bf116200009e578063dbc16976116200006a578063dbc169761462000704578063ee25560b146200071b578063f2fde38b146200074a578063fb570834146200076e575f80fd5b8063bab161bf1462000642578063be5831c7146200067b578063cd58657914620006b6578063d02103ca14620006cd575f80fd5b80638da5cb5b11620000de5780638da5cb5b146200059857806391e57e2d14620005c45780639e34070f14620005db578063aaa13cc2146200061e575f80fd5b8063715018a6146200052557806379e2cf97146200053c57806381b1c1741462000553575f80fd5b80632d2c9d94116200017a57806334ac9cf2116200015257806334ac9cf214620003ca5780633ae0504714620003f85780633e197043146200040f578063647c576c1462000501575f80fd5b80632d2c9d9414620002f95780632dfdf0b5146200031d578063318aee3d1462000343575f80fd5b8063240ff37811620001ba578063240ff37814620002765780632b5e42e7146200028d5780632c3f58cd14620002b15780632cffd02e14620002d5575f80fd5b806315064c9614620001e35780632072f6c5146200021357806322e95f2c146200022c575b5f80fd5b348015620001ef575f80fd5b50606854620001fe9060ff1681565b60405190151581526020015b60405180910390f35b3480156200021f575f80fd5b506200022a62000792565b005b34801562000238575f80fd5b50620002506200024a36600462003638565b620007f0565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016200020a565b6200022a62000287366004620036c8565b62000892565b34801562000299575f80fd5b506200022a620002ab36600462003747565b62000ab9565b348015620002bd575f80fd5b506200022a620002cf3660046200375f565b62000ac8565b348015620002e1575f80fd5b506200022a620002f336600462003794565b62000b0e565b34801562000305575f80fd5b506200022a6200031736600462003794565b62001093565b34801562000329575f80fd5b506200033460535481565b6040519081526020016200020a565b3480156200034f575f80fd5b50620003986200036136600462003872565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff9091166020830152016200020a565b348015620003d6575f80fd5b50606c54620002509073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000404575f80fd5b506200033462001293565b3480156200041b575f80fd5b50620003346200042d3660046200389f565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200050d575f80fd5b506200022a6200051f36600462003924565b62001378565b34801562000531575f80fd5b506200022a620015cd565b34801562000548575f80fd5b506200022a620015e2565b3480156200055f575f80fd5b50620002506200057136600462003747565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005a4575f80fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff1662000250565b348015620005d0575f80fd5b506200033460d15481565b348015620005e7575f80fd5b50620001fe620005f936600462003747565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b3480156200062a575f80fd5b50620002506200063c36600462003971565b6200161c565b3480156200064e575f80fd5b506068546200066590610100900463ffffffff1681565b60405163ffffffff90911681526020016200020a565b34801562000687575f80fd5b506068546200066590790100000000000000000000000000000000000000000000000000900463ffffffff1681565b6200022a620006c736600462003a1e565b62001806565b348015620006d9575f80fd5b50606854620002509065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000710575f80fd5b506200022a620018da565b34801562000727575f80fd5b50620003346200073936600462003747565b60696020525f908152604090205481565b34801562000756575f80fd5b506200022a6200076836600462003872565b62001936565b3480156200077a575f80fd5b50620001fe6200078c36600462003aba565b620019f3565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620007e4576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee62001adb565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620008d0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620008f65750600263ffffffff861610155b156200092e576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009849998979695949392919062003b4b565b60405180910390a162000aa162000a9b6001606860019054906101000a900463ffffffff16338989348989604051620009bf92919062003bc5565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001b6e565b821562000ab25762000ab262001c82565b5050505050565b62000ac362001d52565b60d155565b62000ad262001d52565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b4c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b628b8b8b8b8b8b8b8b8b8b8b5f62001dd5565b73ffffffffffffffffffffffffffffffffffffffff861662000c3a57604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000bb6919062003c25565b5f6040518083038185875af1925050503d805f811462000bf2576040519150601f19603f3d011682016040523d82523d5f602084013e62000bf7565b606091505b505090508062000c33576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506200101b565b60685463ffffffff61010090910481169088160362000c7c5762000c7673ffffffffffffffffffffffffffffffffffffffff8716858562001fc0565b6200101b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000f92575f808062000d4e8688018862003d34565b9250925092505f8584848460405162000d6790620035f4565b62000d759392919062003df0565b8190604051809103905ff590508015801562000d93573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000e06575f80fd5b505af115801562000e19573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000f8095949392919062003e2c565b60405180910390a15050505062001018565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562001000575f80fd5b505af115801562001013573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff1615620010d1576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620010e88b8b8b8b8b8b8b8b8b8b8b600162001dd5565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a86866040516024016200111a949392919062003e73565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200119d919062003c25565b5f6040518083038185875af1925050503d805f8114620011d9576040519150601f19603f3d011682016040523d82523d5f602084013e620011de565b606091505b50509050806200121a576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200136f578083901c600116600103620013005760338160208110620012cc57620012cc62003eba565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200132d565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013669062003f14565b9150506200129d565b50919392505050565b5f54610100900460ff16158080156200139757505f54600160ff909116105b80620013b25750303b158015620013b257505f5460ff166001145b62001444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014a1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d1556200156462002096565b8015620015c7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b620015d762001d52565b620007ee5f62002134565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620007ee57620007ee62001c82565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180602001620016b090620035f4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620016fb908d908d908d908d908d9060200162003f4e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001739929160200162003f8e565b60405160208183030381529060405280519060200120604051602001620017c294939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d154341115620018c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200143b565b620018d187878787878787620021aa565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff1633146200192c576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee620026f3565b6200194062001d52565b73ffffffffffffffffffffffffffffffffffffffff8116620019e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200143b565b620019f08162002134565b50565b5f84815b602081101562001acd57600163ffffffff8616821c8116900362001a695785816020811062001a2a5762001a2a62003eba565b60200201358260405160200162001a4b929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001ab8565b8186826020811062001a7f5762001a7f62003eba565b602002013560405160200162001a9f929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001ac48162003f14565b915050620019f7565b50821490505b949350505050565b60685460ff161562001b19576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001b7f60206002620040f7565b62001b8b919062004104565b6053541062001bc6576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001bd79062003f14565b918290555090505f5b602081101562001c72578082901c60011660010362001c1857826033826020811062001c105762001c1062003eba565b015550505050565b6033816020811062001c2e5762001c2e62003eba565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001c699062003f14565b91505062001be0565b5062001c7d6200411a565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001d0862001293565b6040518263ffffffff1660e01b815260040162001d2791815260200190565b5f604051808303815f87803b15801562001d3f575f80fd5b505af1158015620015c7573d5f803e3d5ffd5b609f5473ffffffffffffffffffffffffffffffffffffffff163314620007ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200143b565b62001de68b63ffffffff1662002782565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af115801562001e85573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001eab919062004147565b9050805f0362001ee6576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462001f30576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff1662001f4d57508962001f50565b508a5b62001f7962001f70848c8c8c8c8c8c8c604051620009bf92919062003bc5565b8f8f84620019f3565b62001fb0576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001c7d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152620027e6565b5f54610100900460ff166200212e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200143b565b620007ee335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60685460ff1615620021e8576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620021f2620028f8565b60685463ffffffff888116610100909204161480620022185750600263ffffffff881610155b1562002250576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff8816620022b457883414620022ab576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f9250620025a1565b3415620022ed576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620023d6576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b158015620023ac575f80fd5b505af1158015620023bf573d5f803e3d5ffd5b5050505080602001519450805f015193506200259f565b8515620023eb57620023eb898b89896200296d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa15801562002456573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200247c919062004147565b9050620024a273ffffffffffffffffffffffffffffffffffffffff8b1633308e62002e80565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa1580156200250d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002533919062004147565b905062002541828262004104565b6068548c9850610100900463ffffffff1696509350620025618762002ee0565b6200256c8c62002ff4565b620025778d620030fd565b6040516020016200258b9392919062003df0565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620025e29897969594939291906200415f565b60405180910390a1620026d462000a9b5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b8615620026e557620026e562001c82565b50505050620018d160018055565b60685460ff1662002730576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000ab2576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002849826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031f59092919063ffffffff16565b80519091501562001c7d57808060200190518101906200286a9190620041d7565b62001c7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200143b565b60026001540362002966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200143b565b6002600155565b5f6200297d6004828486620041f5565b62002988916200421e565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002c02575f808080808080620029ea896004818d620041f5565b810190620029f9919062004267565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002a6d576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002abd576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002af7576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002bb2919062003c25565b5f604051808303815f865af19150503d805f811462002bed576040519150601f19603f3d011682016040523d82523d5f602084013e62002bf2565b606091505b5050505050505050505062000ab2565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002c7e576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080808080808062002c958a6004818e620041f5565b81019062002ca49190620042bd565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002d1a576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002d6a576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002e2e919062003c25565b5f604051808303815f865af19150503d805f811462002e69576040519150601f19603f3d011682016040523d82523d5f602084013e62002e6e565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620015c79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002013565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002f63919062003c25565b5f60405180830381855afa9150503d805f811462002f9d576040519150601f19603f3d011682016040523d82523d5f602084013e62002fa2565b606091505b50915091508162002fe9576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001ad3565b62001ad38162003205565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162003077919062003c25565b5f60405180830381855afa9150503d805f8114620030b1576040519150601f19603f3d011682016040523d82523d5f602084013e620030b6565b606091505b50915091508162002fe9576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001ad3565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff8616916200317f919062003c25565b5f60405180830381855afa9150503d805f8114620031b9576040519150601f19603f3d011682016040523d82523d5f602084013e620031be565b606091505b5091509150818015620031d2575080516020145b620031df57601262001ad3565b8080602001905181019062001ad3919062004344565b606062001ad384845f85620033f0565b606060408251106200322757818060200190518101906200088c919062004362565b8151602003620033b2575f5b6020811080156200327e575082818151811062003254576200325462003eba565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620032995780620032908162003f14565b91505062003233565b805f03620032dc57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115620032f957620032f962003bd4565b6040519080825280601f01601f19166020018201604052801562003324576020820181803683370190505b5090505f5b82811015620033aa5784818151811062003347576200334762003eba565b602001015160f81c60f81b82828151811062003367576200336762003eba565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620033a18162003f14565b91505062003329565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200143b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051620034ae919062003c25565b5f6040518083038185875af1925050503d805f8114620034ea576040519150601f19603f3d011682016040523d82523d5f602084013e620034ef565b606091505b509150915062003502878383876200350d565b979650505050505050565b60608315620035a75782515f036200359f5773ffffffffffffffffffffffffffffffffffffffff85163b6200359f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200143b565b508162001ad3565b62001ad38383815115620035be5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200143b9190620043dd565b611b0d80620043f283390190565b803563ffffffff81168114620033eb575f80fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620019f0575f80fd5b5f80604083850312156200364a575f80fd5b620036558362003602565b91506020830135620036678162003616565b809150509250929050565b8015158114620019f0575f80fd5b5f8083601f84011262003691575f80fd5b50813567ffffffffffffffff811115620036a9575f80fd5b602083019150836020828501011115620036c1575f80fd5b9250929050565b5f805f805f60808688031215620036dd575f80fd5b620036e88662003602565b94506020860135620036fa8162003616565b935060408601356200370c8162003672565b9250606086013567ffffffffffffffff81111562003728575f80fd5b620037368882890162003680565b969995985093965092949392505050565b5f6020828403121562003758575f80fd5b5035919050565b5f6020828403121562003770575f80fd5b6200377b8262003602565b9392505050565b8061040081018310156200088c575f80fd5b5f805f805f805f805f805f6105208c8e031215620037b0575f80fd5b620037bc8d8d62003782565b9a50620037cd6104008d0162003602565b99506104208c013598506104408c01359750620037ee6104608d0162003602565b96506104808c0135620038018162003616565b9550620038126104a08d0162003602565b94506104c08c0135620038258162003616565b93506104e08c013592506105008c013567ffffffffffffffff8111156200384a575f80fd5b620038588e828f0162003680565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562003883575f80fd5b81356200377b8162003616565b60ff81168114620019f0575f80fd5b5f805f805f805f60e0888a031215620038b6575f80fd5b8735620038c38162003890565b9650620038d36020890162003602565b95506040880135620038e58162003616565b9450620038f56060890162003602565b93506080880135620039078162003616565b9699959850939692959460a0840135945060c09093013592915050565b5f805f6060848603121562003937575f80fd5b620039428462003602565b92506020840135620039548162003616565b91506040840135620039668162003616565b809150509250925092565b5f805f805f805f60a0888a03121562003988575f80fd5b620039938862003602565b96506020880135620039a58162003616565b9550604088013567ffffffffffffffff80821115620039c2575f80fd5b620039d08b838c0162003680565b909750955060608a0135915080821115620039e9575f80fd5b50620039f88a828b0162003680565b909450925050608088013562003a0e8162003890565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003a35575f80fd5b62003a408862003602565b9650602088013562003a528162003616565b955060408801359450606088013562003a6b8162003616565b9350608088013562003a7d8162003672565b925060a088013567ffffffffffffffff81111562003a99575f80fd5b62003aa78a828b0162003680565b989b979a50959850939692959293505050565b5f805f80610460858703121562003acf575f80fd5b8435935062003ae2866020870162003782565b925062003af3610420860162003602565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003bab828501878962003b04565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003c1d57818101518382015260200162003c03565b50505f910152565b5f825162003c3881846020870162003c01565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003c8c5762003c8c62003bd4565b604052919050565b5f67ffffffffffffffff82111562003cb05762003cb062003bd4565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011262003cec575f80fd5b813562003d0362003cfd8262003c94565b62003c42565b81815284602083860101111562003d18575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003d47575f80fd5b833567ffffffffffffffff8082111562003d5f575f80fd5b62003d6d8783880162003cdc565b9450602086013591508082111562003d83575f80fd5b5062003d928682870162003cdc565b9250506040840135620039668162003890565b5f815180845262003dbe81602086016020860162003c01565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f62003e04606083018662003da5565b828103602084015262003e18818662003da5565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200350260808301848662003b04565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003eb060608301848662003b04565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003f475762003f4762003ee7565b5060010190565b606081525f62003f6360608301878962003b04565b828103602084015262003f7881868862003b04565b91505060ff831660408301529695505050505050565b5f835162003fa181846020880162003c01565b83519083019062003fb781836020880162003c01565b01949350505050565b600181815b808511156200401f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562004003576200400362003ee7565b808516156200401157918102915b93841c939080029062003fc5565b509250929050565b5f8262004037575060016200088c565b816200404557505f6200088c565b81600181146200405e5760028114620040695762004089565b60019150506200088c565b60ff8411156200407d576200407d62003ee7565b50506001821b6200088c565b5060208310610133831016604e8410600b8410161715620040ae575081810a6200088c565b620040ba838362003fc0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620040ef57620040ef62003ee7565b029392505050565b5f6200377b838362004027565b818103818111156200088c576200088c62003ee7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6020828403121562004158575f80fd5b5051919050565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620041be8285018762003da5565b925080851660e085015250509998505050505050505050565b5f60208284031215620041e8575f80fd5b81516200377b8162003672565b5f808585111562004204575f80fd5b8386111562004211575f80fd5b5050820193919092039150565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156200425f5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a0312156200427e575f80fd5b87356200428b8162003616565b965060208801356200429d8162003616565b955060408801359450606088013593506080880135620039078162003890565b5f805f805f805f80610100898b031215620042d6575f80fd5b8835620042e38162003616565b97506020890135620042f58162003616565b965060408901359550606089013594506080890135620043158162003672565b935060a0890135620043278162003890565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004355575f80fd5b81516200377b8162003890565b5f6020828403121562004373575f80fd5b815167ffffffffffffffff8111156200438a575f80fd5b8201601f810184136200439b575f80fd5b8051620043ac62003cfd8262003c94565b818152856020838501011115620043c1575f80fd5b620043d482602083016020860162003c01565b95945050505050565b602081525f6200377b602083018462003da556fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a26469706673582212200d390c87d91133753c2d28c32519eb100fa1cf5754ba3d4ee472f42bf463e27764736f6c63430008140033", - "deployedBytecode": "0x608060405260043610620001df575f3560e01c8063715018a61162000106578063bab161bf116200009e578063dbc16976116200006a578063dbc169761462000704578063ee25560b146200071b578063f2fde38b146200074a578063fb570834146200076e575f80fd5b8063bab161bf1462000642578063be5831c7146200067b578063cd58657914620006b6578063d02103ca14620006cd575f80fd5b80638da5cb5b11620000de5780638da5cb5b146200059857806391e57e2d14620005c45780639e34070f14620005db578063aaa13cc2146200061e575f80fd5b8063715018a6146200052557806379e2cf97146200053c57806381b1c1741462000553575f80fd5b80632d2c9d94116200017a57806334ac9cf2116200015257806334ac9cf214620003ca5780633ae0504714620003f85780633e197043146200040f578063647c576c1462000501575f80fd5b80632d2c9d9414620002f95780632dfdf0b5146200031d578063318aee3d1462000343575f80fd5b8063240ff37811620001ba578063240ff37814620002765780632b5e42e7146200028d5780632c3f58cd14620002b15780632cffd02e14620002d5575f80fd5b806315064c9614620001e35780632072f6c5146200021357806322e95f2c146200022c575b5f80fd5b348015620001ef575f80fd5b50606854620001fe9060ff1681565b60405190151581526020015b60405180910390f35b3480156200021f575f80fd5b506200022a62000792565b005b34801562000238575f80fd5b50620002506200024a36600462003638565b620007f0565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016200020a565b6200022a62000287366004620036c8565b62000892565b34801562000299575f80fd5b506200022a620002ab36600462003747565b62000ab9565b348015620002bd575f80fd5b506200022a620002cf3660046200375f565b62000ac8565b348015620002e1575f80fd5b506200022a620002f336600462003794565b62000b0e565b34801562000305575f80fd5b506200022a6200031736600462003794565b62001093565b34801562000329575f80fd5b506200033460535481565b6040519081526020016200020a565b3480156200034f575f80fd5b50620003986200036136600462003872565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff9091166020830152016200020a565b348015620003d6575f80fd5b50606c54620002509073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000404575f80fd5b506200033462001293565b3480156200041b575f80fd5b50620003346200042d3660046200389f565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200050d575f80fd5b506200022a6200051f36600462003924565b62001378565b34801562000531575f80fd5b506200022a620015cd565b34801562000548575f80fd5b506200022a620015e2565b3480156200055f575f80fd5b50620002506200057136600462003747565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005a4575f80fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff1662000250565b348015620005d0575f80fd5b506200033460d15481565b348015620005e7575f80fd5b50620001fe620005f936600462003747565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b3480156200062a575f80fd5b50620002506200063c36600462003971565b6200161c565b3480156200064e575f80fd5b506068546200066590610100900463ffffffff1681565b60405163ffffffff90911681526020016200020a565b34801562000687575f80fd5b506068546200066590790100000000000000000000000000000000000000000000000000900463ffffffff1681565b6200022a620006c736600462003a1e565b62001806565b348015620006d9575f80fd5b50606854620002509065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000710575f80fd5b506200022a620018da565b34801562000727575f80fd5b50620003346200073936600462003747565b60696020525f908152604090205481565b34801562000756575f80fd5b506200022a6200076836600462003872565b62001936565b3480156200077a575f80fd5b50620001fe6200078c36600462003aba565b620019f3565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620007e4576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee62001adb565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620008d0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620008f65750600263ffffffff861610155b156200092e576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009849998979695949392919062003b4b565b60405180910390a162000aa162000a9b6001606860019054906101000a900463ffffffff16338989348989604051620009bf92919062003bc5565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001b6e565b821562000ab25762000ab262001c82565b5050505050565b62000ac362001d52565b60d155565b62000ad262001d52565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b4c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b628b8b8b8b8b8b8b8b8b8b8b5f62001dd5565b73ffffffffffffffffffffffffffffffffffffffff861662000c3a57604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000bb6919062003c25565b5f6040518083038185875af1925050503d805f811462000bf2576040519150601f19603f3d011682016040523d82523d5f602084013e62000bf7565b606091505b505090508062000c33576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506200101b565b60685463ffffffff61010090910481169088160362000c7c5762000c7673ffffffffffffffffffffffffffffffffffffffff8716858562001fc0565b6200101b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000f92575f808062000d4e8688018862003d34565b9250925092505f8584848460405162000d6790620035f4565b62000d759392919062003df0565b8190604051809103905ff590508015801562000d93573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000e06575f80fd5b505af115801562000e19573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000f8095949392919062003e2c565b60405180910390a15050505062001018565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562001000575f80fd5b505af115801562001013573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff1615620010d1576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620010e88b8b8b8b8b8b8b8b8b8b8b600162001dd5565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a86866040516024016200111a949392919062003e73565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200119d919062003c25565b5f6040518083038185875af1925050503d805f8114620011d9576040519150601f19603f3d011682016040523d82523d5f602084013e620011de565b606091505b50509050806200121a576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200136f578083901c600116600103620013005760338160208110620012cc57620012cc62003eba565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200132d565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013669062003f14565b9150506200129d565b50919392505050565b5f54610100900460ff16158080156200139757505f54600160ff909116105b80620013b25750303b158015620013b257505f5460ff166001145b62001444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014a1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d1556200156462002096565b8015620015c7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b620015d762001d52565b620007ee5f62002134565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620007ee57620007ee62001c82565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180602001620016b090620035f4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620016fb908d908d908d908d908d9060200162003f4e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001739929160200162003f8e565b60405160208183030381529060405280519060200120604051602001620017c294939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d154341115620018c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200143b565b620018d187878787878787620021aa565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff1633146200192c576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee620026f3565b6200194062001d52565b73ffffffffffffffffffffffffffffffffffffffff8116620019e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200143b565b620019f08162002134565b50565b5f84815b602081101562001acd57600163ffffffff8616821c8116900362001a695785816020811062001a2a5762001a2a62003eba565b60200201358260405160200162001a4b929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001ab8565b8186826020811062001a7f5762001a7f62003eba565b602002013560405160200162001a9f929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001ac48162003f14565b915050620019f7565b50821490505b949350505050565b60685460ff161562001b19576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001b7f60206002620040f7565b62001b8b919062004104565b6053541062001bc6576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001bd79062003f14565b918290555090505f5b602081101562001c72578082901c60011660010362001c1857826033826020811062001c105762001c1062003eba565b015550505050565b6033816020811062001c2e5762001c2e62003eba565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001c699062003f14565b91505062001be0565b5062001c7d6200411a565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001d0862001293565b6040518263ffffffff1660e01b815260040162001d2791815260200190565b5f604051808303815f87803b15801562001d3f575f80fd5b505af1158015620015c7573d5f803e3d5ffd5b609f5473ffffffffffffffffffffffffffffffffffffffff163314620007ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200143b565b62001de68b63ffffffff1662002782565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af115801562001e85573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001eab919062004147565b9050805f0362001ee6576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462001f30576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff1662001f4d57508962001f50565b508a5b62001f7962001f70848c8c8c8c8c8c8c604051620009bf92919062003bc5565b8f8f84620019f3565b62001fb0576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001c7d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152620027e6565b5f54610100900460ff166200212e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200143b565b620007ee335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60685460ff1615620021e8576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620021f2620028f8565b60685463ffffffff888116610100909204161480620022185750600263ffffffff881610155b1562002250576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff8816620022b457883414620022ab576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f9250620025a1565b3415620022ed576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620023d6576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b158015620023ac575f80fd5b505af1158015620023bf573d5f803e3d5ffd5b5050505080602001519450805f015193506200259f565b8515620023eb57620023eb898b89896200296d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa15801562002456573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200247c919062004147565b9050620024a273ffffffffffffffffffffffffffffffffffffffff8b1633308e62002e80565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa1580156200250d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002533919062004147565b905062002541828262004104565b6068548c9850610100900463ffffffff1696509350620025618762002ee0565b6200256c8c62002ff4565b620025778d620030fd565b6040516020016200258b9392919062003df0565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620025e29897969594939291906200415f565b60405180910390a1620026d462000a9b5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b8615620026e557620026e562001c82565b50505050620018d160018055565b60685460ff1662002730576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000ab2576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002849826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031f59092919063ffffffff16565b80519091501562001c7d57808060200190518101906200286a9190620041d7565b62001c7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200143b565b60026001540362002966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200143b565b6002600155565b5f6200297d6004828486620041f5565b62002988916200421e565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002c02575f808080808080620029ea896004818d620041f5565b810190620029f9919062004267565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002a6d576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002abd576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002af7576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002bb2919062003c25565b5f604051808303815f865af19150503d805f811462002bed576040519150601f19603f3d011682016040523d82523d5f602084013e62002bf2565b606091505b5050505050505050505062000ab2565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002c7e576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080808080808062002c958a6004818e620041f5565b81019062002ca49190620042bd565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002d1a576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002d6a576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002e2e919062003c25565b5f604051808303815f865af19150503d805f811462002e69576040519150601f19603f3d011682016040523d82523d5f602084013e62002e6e565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620015c79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002013565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002f63919062003c25565b5f60405180830381855afa9150503d805f811462002f9d576040519150601f19603f3d011682016040523d82523d5f602084013e62002fa2565b606091505b50915091508162002fe9576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001ad3565b62001ad38162003205565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162003077919062003c25565b5f60405180830381855afa9150503d805f8114620030b1576040519150601f19603f3d011682016040523d82523d5f602084013e620030b6565b606091505b50915091508162002fe9576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001ad3565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff8616916200317f919062003c25565b5f60405180830381855afa9150503d805f8114620031b9576040519150601f19603f3d011682016040523d82523d5f602084013e620031be565b606091505b5091509150818015620031d2575080516020145b620031df57601262001ad3565b8080602001905181019062001ad3919062004344565b606062001ad384845f85620033f0565b606060408251106200322757818060200190518101906200088c919062004362565b8151602003620033b2575f5b6020811080156200327e575082818151811062003254576200325462003eba565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620032995780620032908162003f14565b91505062003233565b805f03620032dc57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115620032f957620032f962003bd4565b6040519080825280601f01601f19166020018201604052801562003324576020820181803683370190505b5090505f5b82811015620033aa5784818151811062003347576200334762003eba565b602001015160f81c60f81b82828151811062003367576200336762003eba565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620033a18162003f14565b91505062003329565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200143b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051620034ae919062003c25565b5f6040518083038185875af1925050503d805f8114620034ea576040519150601f19603f3d011682016040523d82523d5f602084013e620034ef565b606091505b509150915062003502878383876200350d565b979650505050505050565b60608315620035a75782515f036200359f5773ffffffffffffffffffffffffffffffffffffffff85163b6200359f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200143b565b508162001ad3565b62001ad38383815115620035be5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200143b9190620043dd565b611b0d80620043f283390190565b803563ffffffff81168114620033eb575f80fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620019f0575f80fd5b5f80604083850312156200364a575f80fd5b620036558362003602565b91506020830135620036678162003616565b809150509250929050565b8015158114620019f0575f80fd5b5f8083601f84011262003691575f80fd5b50813567ffffffffffffffff811115620036a9575f80fd5b602083019150836020828501011115620036c1575f80fd5b9250929050565b5f805f805f60808688031215620036dd575f80fd5b620036e88662003602565b94506020860135620036fa8162003616565b935060408601356200370c8162003672565b9250606086013567ffffffffffffffff81111562003728575f80fd5b620037368882890162003680565b969995985093965092949392505050565b5f6020828403121562003758575f80fd5b5035919050565b5f6020828403121562003770575f80fd5b6200377b8262003602565b9392505050565b8061040081018310156200088c575f80fd5b5f805f805f805f805f805f6105208c8e031215620037b0575f80fd5b620037bc8d8d62003782565b9a50620037cd6104008d0162003602565b99506104208c013598506104408c01359750620037ee6104608d0162003602565b96506104808c0135620038018162003616565b9550620038126104a08d0162003602565b94506104c08c0135620038258162003616565b93506104e08c013592506105008c013567ffffffffffffffff8111156200384a575f80fd5b620038588e828f0162003680565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562003883575f80fd5b81356200377b8162003616565b60ff81168114620019f0575f80fd5b5f805f805f805f60e0888a031215620038b6575f80fd5b8735620038c38162003890565b9650620038d36020890162003602565b95506040880135620038e58162003616565b9450620038f56060890162003602565b93506080880135620039078162003616565b9699959850939692959460a0840135945060c09093013592915050565b5f805f6060848603121562003937575f80fd5b620039428462003602565b92506020840135620039548162003616565b91506040840135620039668162003616565b809150509250925092565b5f805f805f805f60a0888a03121562003988575f80fd5b620039938862003602565b96506020880135620039a58162003616565b9550604088013567ffffffffffffffff80821115620039c2575f80fd5b620039d08b838c0162003680565b909750955060608a0135915080821115620039e9575f80fd5b50620039f88a828b0162003680565b909450925050608088013562003a0e8162003890565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003a35575f80fd5b62003a408862003602565b9650602088013562003a528162003616565b955060408801359450606088013562003a6b8162003616565b9350608088013562003a7d8162003672565b925060a088013567ffffffffffffffff81111562003a99575f80fd5b62003aa78a828b0162003680565b989b979a50959850939692959293505050565b5f805f80610460858703121562003acf575f80fd5b8435935062003ae2866020870162003782565b925062003af3610420860162003602565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003bab828501878962003b04565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003c1d57818101518382015260200162003c03565b50505f910152565b5f825162003c3881846020870162003c01565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003c8c5762003c8c62003bd4565b604052919050565b5f67ffffffffffffffff82111562003cb05762003cb062003bd4565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011262003cec575f80fd5b813562003d0362003cfd8262003c94565b62003c42565b81815284602083860101111562003d18575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003d47575f80fd5b833567ffffffffffffffff8082111562003d5f575f80fd5b62003d6d8783880162003cdc565b9450602086013591508082111562003d83575f80fd5b5062003d928682870162003cdc565b9250506040840135620039668162003890565b5f815180845262003dbe81602086016020860162003c01565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f62003e04606083018662003da5565b828103602084015262003e18818662003da5565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200350260808301848662003b04565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003eb060608301848662003b04565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003f475762003f4762003ee7565b5060010190565b606081525f62003f6360608301878962003b04565b828103602084015262003f7881868862003b04565b91505060ff831660408301529695505050505050565b5f835162003fa181846020880162003c01565b83519083019062003fb781836020880162003c01565b01949350505050565b600181815b808511156200401f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562004003576200400362003ee7565b808516156200401157918102915b93841c939080029062003fc5565b509250929050565b5f8262004037575060016200088c565b816200404557505f6200088c565b81600181146200405e5760028114620040695762004089565b60019150506200088c565b60ff8411156200407d576200407d62003ee7565b50506001821b6200088c565b5060208310610133831016604e8410600b8410161715620040ae575081810a6200088c565b620040ba838362003fc0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620040ef57620040ef62003ee7565b029392505050565b5f6200377b838362004027565b818103818111156200088c576200088c62003ee7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6020828403121562004158575f80fd5b5051919050565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620041be8285018762003da5565b925080851660e085015250509998505050505050505050565b5f60208284031215620041e8575f80fd5b81516200377b8162003672565b5f808585111562004204575f80fd5b8386111562004211575f80fd5b5050820193919092039150565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156200425f5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a0312156200427e575f80fd5b87356200428b8162003616565b965060208801356200429d8162003616565b955060408801359450606088013593506080880135620039078162003890565b5f805f805f805f80610100898b031215620042d6575f80fd5b8835620042e38162003616565b97506020890135620042f58162003616565b965060408901359550606089013594506080890135620043158162003672565b935060a0890135620043278162003890565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004355575f80fd5b81516200377b8162003890565b5f6020828403121562004373575f80fd5b815167ffffffffffffffff8111156200438a575f80fd5b8201601f810184136200439b575f80fd5b8051620043ac62003cfd8262003c94565b818152856020838501011115620043c1575f80fd5b620043d482602083016020860162003c01565b95945050505050565b602081525f6200377b602083018462003da556fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a26469706673582212200d390c87d91133753c2d28c32519eb100fa1cf5754ba3d4ee472f42bf463e27764736f6c63430008140033", + "bytecode": "0x608060405234801561000f575f80fd5b50615f348061001d5f395ff3fe608060405260043610620001df575f3560e01c8063715018a61162000106578063bab161bf116200009e578063dbc16976116200006a578063dbc169761462000704578063ee25560b146200071b578063f2fde38b146200074a578063fb570834146200076e575f80fd5b8063bab161bf1462000642578063be5831c7146200067b578063cd58657914620006b6578063d02103ca14620006cd575f80fd5b80638da5cb5b11620000de5780638da5cb5b146200059857806391e57e2d14620005c45780639e34070f14620005db578063aaa13cc2146200061e575f80fd5b8063715018a6146200052557806379e2cf97146200053c57806381b1c1741462000553575f80fd5b80632d2c9d94116200017a57806334ac9cf2116200015257806334ac9cf214620003ca5780633e19704314620003f85780635ca1e16514620004ea578063647c576c1462000501575f80fd5b80632d2c9d9414620002f95780632dfdf0b5146200031d578063318aee3d1462000343575f80fd5b8063240ff37811620001ba578063240ff37814620002765780632b5e42e7146200028d5780632c3f58cd14620002b15780632cffd02e14620002d5575f80fd5b806315064c9614620001e35780632072f6c5146200021357806322e95f2c146200022c575b5f80fd5b348015620001ef575f80fd5b50606854620001fe9060ff1681565b60405190151581526020015b60405180910390f35b3480156200021f575f80fd5b506200022a62000792565b005b34801562000238575f80fd5b50620002506200024a36600462003638565b620007f0565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016200020a565b6200022a62000287366004620036c8565b62000892565b34801562000299575f80fd5b506200022a620002ab36600462003747565b62000ab9565b348015620002bd575f80fd5b506200022a620002cf3660046200375f565b62000ac8565b348015620002e1575f80fd5b506200022a620002f336600462003794565b62000b0e565b34801562000305575f80fd5b506200022a6200031736600462003794565b62001093565b34801562000329575f80fd5b506200033460535481565b6040519081526020016200020a565b3480156200034f575f80fd5b50620003986200036136600462003872565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff9091166020830152016200020a565b348015620003d6575f80fd5b50606c54620002509073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000404575f80fd5b5062000334620004163660046200389f565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b348015620004f6575f80fd5b506200033462001293565b3480156200050d575f80fd5b506200022a6200051f36600462003924565b62001378565b34801562000531575f80fd5b506200022a620015cd565b34801562000548575f80fd5b506200022a620015e2565b3480156200055f575f80fd5b50620002506200057136600462003747565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005a4575f80fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff1662000250565b348015620005d0575f80fd5b506200033460d15481565b348015620005e7575f80fd5b50620001fe620005f936600462003747565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b3480156200062a575f80fd5b50620002506200063c36600462003971565b6200161c565b3480156200064e575f80fd5b506068546200066590610100900463ffffffff1681565b60405163ffffffff90911681526020016200020a565b34801562000687575f80fd5b506068546200066590790100000000000000000000000000000000000000000000000000900463ffffffff1681565b6200022a620006c736600462003a1e565b62001806565b348015620006d9575f80fd5b50606854620002509065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000710575f80fd5b506200022a620018da565b34801562000727575f80fd5b50620003346200073936600462003747565b60696020525f908152604090205481565b34801562000756575f80fd5b506200022a6200076836600462003872565b62001936565b3480156200077a575f80fd5b50620001fe6200078c36600462003aba565b620019f3565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620007e4576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee62001adb565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620008d0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620008f65750600263ffffffff861610155b156200092e576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009849998979695949392919062003b4b565b60405180910390a162000aa162000a9b6001606860019054906101000a900463ffffffff16338989348989604051620009bf92919062003bc5565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001b6e565b821562000ab25762000ab262001c82565b5050505050565b62000ac362001d52565b60d155565b62000ad262001d52565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b4c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b628b8b8b8b8b8b8b8b8b8b8b5f62001dd5565b73ffffffffffffffffffffffffffffffffffffffff861662000c3a57604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000bb6919062003c25565b5f6040518083038185875af1925050503d805f811462000bf2576040519150601f19603f3d011682016040523d82523d5f602084013e62000bf7565b606091505b505090508062000c33576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506200101b565b60685463ffffffff61010090910481169088160362000c7c5762000c7673ffffffffffffffffffffffffffffffffffffffff8716858562001fc0565b6200101b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000f92575f808062000d4e8688018862003d34565b9250925092505f8584848460405162000d6790620035f4565b62000d759392919062003df0565b8190604051809103905ff590508015801562000d93573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000e06575f80fd5b505af115801562000e19573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000f8095949392919062003e2c565b60405180910390a15050505062001018565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562001000575f80fd5b505af115801562001013573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff1615620010d1576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620010e88b8b8b8b8b8b8b8b8b8b8b600162001dd5565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a86866040516024016200111a949392919062003e73565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200119d919062003c25565b5f6040518083038185875af1925050503d805f8114620011d9576040519150601f19603f3d011682016040523d82523d5f602084013e620011de565b606091505b50509050806200121a576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200136f578083901c600116600103620013005760338160208110620012cc57620012cc62003eba565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200132d565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013669062003f14565b9150506200129d565b50919392505050565b5f54610100900460ff16158080156200139757505f54600160ff909116105b80620013b25750303b158015620013b257505f5460ff166001145b62001444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014a1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d1556200156462002096565b8015620015c7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b620015d762001d52565b620007ee5f62002134565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620007ee57620007ee62001c82565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180602001620016b090620035f4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620016fb908d908d908d908d908d9060200162003f4e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001739929160200162003f8e565b60405160208183030381529060405280519060200120604051602001620017c294939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d154341115620018c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200143b565b620018d187878787878787620021aa565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff1633146200192c576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee620026f3565b6200194062001d52565b73ffffffffffffffffffffffffffffffffffffffff8116620019e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200143b565b620019f08162002134565b50565b5f84815b602081101562001acd57600163ffffffff8616821c8116900362001a695785816020811062001a2a5762001a2a62003eba565b60200201358260405160200162001a4b929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001ab8565b8186826020811062001a7f5762001a7f62003eba565b602002013560405160200162001a9f929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001ac48162003f14565b915050620019f7565b50821490505b949350505050565b60685460ff161562001b19576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001b7f60206002620040f7565b62001b8b919062004104565b6053541062001bc6576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001bd79062003f14565b918290555090505f5b602081101562001c72578082901c60011660010362001c1857826033826020811062001c105762001c1062003eba565b015550505050565b6033816020811062001c2e5762001c2e62003eba565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001c699062003f14565b91505062001be0565b5062001c7d6200411a565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001d0862001293565b6040518263ffffffff1660e01b815260040162001d2791815260200190565b5f604051808303815f87803b15801562001d3f575f80fd5b505af1158015620015c7573d5f803e3d5ffd5b609f5473ffffffffffffffffffffffffffffffffffffffff163314620007ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200143b565b62001de68b63ffffffff1662002782565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af115801562001e85573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001eab919062004147565b9050805f0362001ee6576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462001f30576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff1662001f4d57508962001f50565b508a5b62001f7962001f70848c8c8c8c8c8c8c604051620009bf92919062003bc5565b8f8f84620019f3565b62001fb0576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001c7d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152620027e6565b5f54610100900460ff166200212e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200143b565b620007ee335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60685460ff1615620021e8576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620021f2620028f8565b60685463ffffffff888116610100909204161480620022185750600263ffffffff881610155b1562002250576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff8816620022b457883414620022ab576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f9250620025a1565b3415620022ed576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620023d6576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b158015620023ac575f80fd5b505af1158015620023bf573d5f803e3d5ffd5b5050505080602001519450805f015193506200259f565b8515620023eb57620023eb898b89896200296d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa15801562002456573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200247c919062004147565b9050620024a273ffffffffffffffffffffffffffffffffffffffff8b1633308e62002e80565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa1580156200250d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002533919062004147565b905062002541828262004104565b6068548c9850610100900463ffffffff1696509350620025618762002ee0565b6200256c8c62002ff4565b620025778d620030fd565b6040516020016200258b9392919062003df0565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620025e29897969594939291906200415f565b60405180910390a1620026d462000a9b5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b8615620026e557620026e562001c82565b50505050620018d160018055565b60685460ff1662002730576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000ab2576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002849826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031f59092919063ffffffff16565b80519091501562001c7d57808060200190518101906200286a9190620041d7565b62001c7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200143b565b60026001540362002966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200143b565b6002600155565b5f6200297d6004828486620041f5565b62002988916200421e565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002c02575f808080808080620029ea896004818d620041f5565b810190620029f9919062004267565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002a6d576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002abd576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002af7576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002bb2919062003c25565b5f604051808303815f865af19150503d805f811462002bed576040519150601f19603f3d011682016040523d82523d5f602084013e62002bf2565b606091505b5050505050505050505062000ab2565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002c7e576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080808080808062002c958a6004818e620041f5565b81019062002ca49190620042bd565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002d1a576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002d6a576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002e2e919062003c25565b5f604051808303815f865af19150503d805f811462002e69576040519150601f19603f3d011682016040523d82523d5f602084013e62002e6e565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620015c79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002013565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002f63919062003c25565b5f60405180830381855afa9150503d805f811462002f9d576040519150601f19603f3d011682016040523d82523d5f602084013e62002fa2565b606091505b50915091508162002fe9576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001ad3565b62001ad38162003205565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162003077919062003c25565b5f60405180830381855afa9150503d805f8114620030b1576040519150601f19603f3d011682016040523d82523d5f602084013e620030b6565b606091505b50915091508162002fe9576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001ad3565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff8616916200317f919062003c25565b5f60405180830381855afa9150503d805f8114620031b9576040519150601f19603f3d011682016040523d82523d5f602084013e620031be565b606091505b5091509150818015620031d2575080516020145b620031df57601262001ad3565b8080602001905181019062001ad3919062004344565b606062001ad384845f85620033f0565b606060408251106200322757818060200190518101906200088c919062004362565b8151602003620033b2575f5b6020811080156200327e575082818151811062003254576200325462003eba565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620032995780620032908162003f14565b91505062003233565b805f03620032dc57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115620032f957620032f962003bd4565b6040519080825280601f01601f19166020018201604052801562003324576020820181803683370190505b5090505f5b82811015620033aa5784818151811062003347576200334762003eba565b602001015160f81c60f81b82828151811062003367576200336762003eba565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620033a18162003f14565b91505062003329565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200143b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051620034ae919062003c25565b5f6040518083038185875af1925050503d805f8114620034ea576040519150601f19603f3d011682016040523d82523d5f602084013e620034ef565b606091505b509150915062003502878383876200350d565b979650505050505050565b60608315620035a75782515f036200359f5773ffffffffffffffffffffffffffffffffffffffff85163b6200359f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200143b565b508162001ad3565b62001ad38383815115620035be5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200143b9190620043dd565b611b0d80620043f283390190565b803563ffffffff81168114620033eb575f80fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620019f0575f80fd5b5f80604083850312156200364a575f80fd5b620036558362003602565b91506020830135620036678162003616565b809150509250929050565b8015158114620019f0575f80fd5b5f8083601f84011262003691575f80fd5b50813567ffffffffffffffff811115620036a9575f80fd5b602083019150836020828501011115620036c1575f80fd5b9250929050565b5f805f805f60808688031215620036dd575f80fd5b620036e88662003602565b94506020860135620036fa8162003616565b935060408601356200370c8162003672565b9250606086013567ffffffffffffffff81111562003728575f80fd5b620037368882890162003680565b969995985093965092949392505050565b5f6020828403121562003758575f80fd5b5035919050565b5f6020828403121562003770575f80fd5b6200377b8262003602565b9392505050565b8061040081018310156200088c575f80fd5b5f805f805f805f805f805f6105208c8e031215620037b0575f80fd5b620037bc8d8d62003782565b9a50620037cd6104008d0162003602565b99506104208c013598506104408c01359750620037ee6104608d0162003602565b96506104808c0135620038018162003616565b9550620038126104a08d0162003602565b94506104c08c0135620038258162003616565b93506104e08c013592506105008c013567ffffffffffffffff8111156200384a575f80fd5b620038588e828f0162003680565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562003883575f80fd5b81356200377b8162003616565b60ff81168114620019f0575f80fd5b5f805f805f805f60e0888a031215620038b6575f80fd5b8735620038c38162003890565b9650620038d36020890162003602565b95506040880135620038e58162003616565b9450620038f56060890162003602565b93506080880135620039078162003616565b9699959850939692959460a0840135945060c09093013592915050565b5f805f6060848603121562003937575f80fd5b620039428462003602565b92506020840135620039548162003616565b91506040840135620039668162003616565b809150509250925092565b5f805f805f805f60a0888a03121562003988575f80fd5b620039938862003602565b96506020880135620039a58162003616565b9550604088013567ffffffffffffffff80821115620039c2575f80fd5b620039d08b838c0162003680565b909750955060608a0135915080821115620039e9575f80fd5b50620039f88a828b0162003680565b909450925050608088013562003a0e8162003890565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003a35575f80fd5b62003a408862003602565b9650602088013562003a528162003616565b955060408801359450606088013562003a6b8162003616565b9350608088013562003a7d8162003672565b925060a088013567ffffffffffffffff81111562003a99575f80fd5b62003aa78a828b0162003680565b989b979a50959850939692959293505050565b5f805f80610460858703121562003acf575f80fd5b8435935062003ae2866020870162003782565b925062003af3610420860162003602565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003bab828501878962003b04565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003c1d57818101518382015260200162003c03565b50505f910152565b5f825162003c3881846020870162003c01565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003c8c5762003c8c62003bd4565b604052919050565b5f67ffffffffffffffff82111562003cb05762003cb062003bd4565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011262003cec575f80fd5b813562003d0362003cfd8262003c94565b62003c42565b81815284602083860101111562003d18575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003d47575f80fd5b833567ffffffffffffffff8082111562003d5f575f80fd5b62003d6d8783880162003cdc565b9450602086013591508082111562003d83575f80fd5b5062003d928682870162003cdc565b9250506040840135620039668162003890565b5f815180845262003dbe81602086016020860162003c01565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f62003e04606083018662003da5565b828103602084015262003e18818662003da5565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200350260808301848662003b04565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003eb060608301848662003b04565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003f475762003f4762003ee7565b5060010190565b606081525f62003f6360608301878962003b04565b828103602084015262003f7881868862003b04565b91505060ff831660408301529695505050505050565b5f835162003fa181846020880162003c01565b83519083019062003fb781836020880162003c01565b01949350505050565b600181815b808511156200401f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562004003576200400362003ee7565b808516156200401157918102915b93841c939080029062003fc5565b509250929050565b5f8262004037575060016200088c565b816200404557505f6200088c565b81600181146200405e5760028114620040695762004089565b60019150506200088c565b60ff8411156200407d576200407d62003ee7565b50506001821b6200088c565b5060208310610133831016604e8410600b8410161715620040ae575081810a6200088c565b620040ba838362003fc0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620040ef57620040ef62003ee7565b029392505050565b5f6200377b838362004027565b818103818111156200088c576200088c62003ee7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6020828403121562004158575f80fd5b5051919050565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620041be8285018762003da5565b925080851660e085015250509998505050505050505050565b5f60208284031215620041e8575f80fd5b81516200377b8162003672565b5f808585111562004204575f80fd5b8386111562004211575f80fd5b5050820193919092039150565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156200425f5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a0312156200427e575f80fd5b87356200428b8162003616565b965060208801356200429d8162003616565b955060408801359450606088013593506080880135620039078162003890565b5f805f805f805f80610100898b031215620042d6575f80fd5b8835620042e38162003616565b97506020890135620042f58162003616565b965060408901359550606089013594506080890135620043158162003672565b935060a0890135620043278162003890565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004355575f80fd5b81516200377b8162003890565b5f6020828403121562004373575f80fd5b815167ffffffffffffffff8111156200438a575f80fd5b8201601f810184136200439b575f80fd5b8051620043ac62003cfd8262003c94565b818152856020838501011115620043c1575f80fd5b620043d482602083016020860162003c01565b95945050505050565b602081525f6200377b602083018462003da556fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a2646970667358221220afdccfa9486655f8756b2a046212d040fae4be6515fb658fcf4d74aa59ae08e964736f6c63430008140033", + "deployedBytecode": "0x608060405260043610620001df575f3560e01c8063715018a61162000106578063bab161bf116200009e578063dbc16976116200006a578063dbc169761462000704578063ee25560b146200071b578063f2fde38b146200074a578063fb570834146200076e575f80fd5b8063bab161bf1462000642578063be5831c7146200067b578063cd58657914620006b6578063d02103ca14620006cd575f80fd5b80638da5cb5b11620000de5780638da5cb5b146200059857806391e57e2d14620005c45780639e34070f14620005db578063aaa13cc2146200061e575f80fd5b8063715018a6146200052557806379e2cf97146200053c57806381b1c1741462000553575f80fd5b80632d2c9d94116200017a57806334ac9cf2116200015257806334ac9cf214620003ca5780633e19704314620003f85780635ca1e16514620004ea578063647c576c1462000501575f80fd5b80632d2c9d9414620002f95780632dfdf0b5146200031d578063318aee3d1462000343575f80fd5b8063240ff37811620001ba578063240ff37814620002765780632b5e42e7146200028d5780632c3f58cd14620002b15780632cffd02e14620002d5575f80fd5b806315064c9614620001e35780632072f6c5146200021357806322e95f2c146200022c575b5f80fd5b348015620001ef575f80fd5b50606854620001fe9060ff1681565b60405190151581526020015b60405180910390f35b3480156200021f575f80fd5b506200022a62000792565b005b34801562000238575f80fd5b50620002506200024a36600462003638565b620007f0565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016200020a565b6200022a62000287366004620036c8565b62000892565b34801562000299575f80fd5b506200022a620002ab36600462003747565b62000ab9565b348015620002bd575f80fd5b506200022a620002cf3660046200375f565b62000ac8565b348015620002e1575f80fd5b506200022a620002f336600462003794565b62000b0e565b34801562000305575f80fd5b506200022a6200031736600462003794565b62001093565b34801562000329575f80fd5b506200033460535481565b6040519081526020016200020a565b3480156200034f575f80fd5b50620003986200036136600462003872565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff9091166020830152016200020a565b348015620003d6575f80fd5b50606c54620002509073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000404575f80fd5b5062000334620004163660046200389f565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b348015620004f6575f80fd5b506200033462001293565b3480156200050d575f80fd5b506200022a6200051f36600462003924565b62001378565b34801562000531575f80fd5b506200022a620015cd565b34801562000548575f80fd5b506200022a620015e2565b3480156200055f575f80fd5b50620002506200057136600462003747565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005a4575f80fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff1662000250565b348015620005d0575f80fd5b506200033460d15481565b348015620005e7575f80fd5b50620001fe620005f936600462003747565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b3480156200062a575f80fd5b50620002506200063c36600462003971565b6200161c565b3480156200064e575f80fd5b506068546200066590610100900463ffffffff1681565b60405163ffffffff90911681526020016200020a565b34801562000687575f80fd5b506068546200066590790100000000000000000000000000000000000000000000000000900463ffffffff1681565b6200022a620006c736600462003a1e565b62001806565b348015620006d9575f80fd5b50606854620002509065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000710575f80fd5b506200022a620018da565b34801562000727575f80fd5b50620003346200073936600462003747565b60696020525f908152604090205481565b34801562000756575f80fd5b506200022a6200076836600462003872565b62001936565b3480156200077a575f80fd5b50620001fe6200078c36600462003aba565b620019f3565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620007e4576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee62001adb565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620008d0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620008f65750600263ffffffff861610155b156200092e576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009849998979695949392919062003b4b565b60405180910390a162000aa162000a9b6001606860019054906101000a900463ffffffff16338989348989604051620009bf92919062003bc5565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001b6e565b821562000ab25762000ab262001c82565b5050505050565b62000ac362001d52565b60d155565b62000ad262001d52565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b4c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b628b8b8b8b8b8b8b8b8b8b8b5f62001dd5565b73ffffffffffffffffffffffffffffffffffffffff861662000c3a57604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000bb6919062003c25565b5f6040518083038185875af1925050503d805f811462000bf2576040519150601f19603f3d011682016040523d82523d5f602084013e62000bf7565b606091505b505090508062000c33576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506200101b565b60685463ffffffff61010090910481169088160362000c7c5762000c7673ffffffffffffffffffffffffffffffffffffffff8716858562001fc0565b6200101b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000f92575f808062000d4e8688018862003d34565b9250925092505f8584848460405162000d6790620035f4565b62000d759392919062003df0565b8190604051809103905ff590508015801562000d93573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000e06575f80fd5b505af115801562000e19573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000f8095949392919062003e2c565b60405180910390a15050505062001018565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562001000575f80fd5b505af115801562001013573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff1615620010d1576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620010e88b8b8b8b8b8b8b8b8b8b8b600162001dd5565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a86866040516024016200111a949392919062003e73565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200119d919062003c25565b5f6040518083038185875af1925050503d805f8114620011d9576040519150601f19603f3d011682016040523d82523d5f602084013e620011de565b606091505b50509050806200121a576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200136f578083901c600116600103620013005760338160208110620012cc57620012cc62003eba565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200132d565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013669062003f14565b9150506200129d565b50919392505050565b5f54610100900460ff16158080156200139757505f54600160ff909116105b80620013b25750303b158015620013b257505f5460ff166001145b62001444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014a1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d1556200156462002096565b8015620015c7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b620015d762001d52565b620007ee5f62002134565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620007ee57620007ee62001c82565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180602001620016b090620035f4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620016fb908d908d908d908d908d9060200162003f4e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001739929160200162003f8e565b60405160208183030381529060405280519060200120604051602001620017c294939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d154341115620018c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200143b565b620018d187878787878787620021aa565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff1633146200192c576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee620026f3565b6200194062001d52565b73ffffffffffffffffffffffffffffffffffffffff8116620019e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200143b565b620019f08162002134565b50565b5f84815b602081101562001acd57600163ffffffff8616821c8116900362001a695785816020811062001a2a5762001a2a62003eba565b60200201358260405160200162001a4b929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001ab8565b8186826020811062001a7f5762001a7f62003eba565b602002013560405160200162001a9f929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001ac48162003f14565b915050620019f7565b50821490505b949350505050565b60685460ff161562001b19576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001b7f60206002620040f7565b62001b8b919062004104565b6053541062001bc6576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001bd79062003f14565b918290555090505f5b602081101562001c72578082901c60011660010362001c1857826033826020811062001c105762001c1062003eba565b015550505050565b6033816020811062001c2e5762001c2e62003eba565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001c699062003f14565b91505062001be0565b5062001c7d6200411a565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001d0862001293565b6040518263ffffffff1660e01b815260040162001d2791815260200190565b5f604051808303815f87803b15801562001d3f575f80fd5b505af1158015620015c7573d5f803e3d5ffd5b609f5473ffffffffffffffffffffffffffffffffffffffff163314620007ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200143b565b62001de68b63ffffffff1662002782565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af115801562001e85573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001eab919062004147565b9050805f0362001ee6576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462001f30576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff1662001f4d57508962001f50565b508a5b62001f7962001f70848c8c8c8c8c8c8c604051620009bf92919062003bc5565b8f8f84620019f3565b62001fb0576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001c7d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152620027e6565b5f54610100900460ff166200212e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200143b565b620007ee335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60685460ff1615620021e8576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620021f2620028f8565b60685463ffffffff888116610100909204161480620022185750600263ffffffff881610155b1562002250576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff8816620022b457883414620022ab576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f9250620025a1565b3415620022ed576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620023d6576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b158015620023ac575f80fd5b505af1158015620023bf573d5f803e3d5ffd5b5050505080602001519450805f015193506200259f565b8515620023eb57620023eb898b89896200296d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa15801562002456573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200247c919062004147565b9050620024a273ffffffffffffffffffffffffffffffffffffffff8b1633308e62002e80565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa1580156200250d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002533919062004147565b905062002541828262004104565b6068548c9850610100900463ffffffff1696509350620025618762002ee0565b6200256c8c62002ff4565b620025778d620030fd565b6040516020016200258b9392919062003df0565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620025e29897969594939291906200415f565b60405180910390a1620026d462000a9b5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b8615620026e557620026e562001c82565b50505050620018d160018055565b60685460ff1662002730576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000ab2576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002849826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031f59092919063ffffffff16565b80519091501562001c7d57808060200190518101906200286a9190620041d7565b62001c7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200143b565b60026001540362002966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200143b565b6002600155565b5f6200297d6004828486620041f5565b62002988916200421e565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002c02575f808080808080620029ea896004818d620041f5565b810190620029f9919062004267565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002a6d576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002abd576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002af7576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002bb2919062003c25565b5f604051808303815f865af19150503d805f811462002bed576040519150601f19603f3d011682016040523d82523d5f602084013e62002bf2565b606091505b5050505050505050505062000ab2565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002c7e576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080808080808062002c958a6004818e620041f5565b81019062002ca49190620042bd565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002d1a576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002d6a576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002e2e919062003c25565b5f604051808303815f865af19150503d805f811462002e69576040519150601f19603f3d011682016040523d82523d5f602084013e62002e6e565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620015c79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002013565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002f63919062003c25565b5f60405180830381855afa9150503d805f811462002f9d576040519150601f19603f3d011682016040523d82523d5f602084013e62002fa2565b606091505b50915091508162002fe9576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001ad3565b62001ad38162003205565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162003077919062003c25565b5f60405180830381855afa9150503d805f8114620030b1576040519150601f19603f3d011682016040523d82523d5f602084013e620030b6565b606091505b50915091508162002fe9576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001ad3565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff8616916200317f919062003c25565b5f60405180830381855afa9150503d805f8114620031b9576040519150601f19603f3d011682016040523d82523d5f602084013e620031be565b606091505b5091509150818015620031d2575080516020145b620031df57601262001ad3565b8080602001905181019062001ad3919062004344565b606062001ad384845f85620033f0565b606060408251106200322757818060200190518101906200088c919062004362565b8151602003620033b2575f5b6020811080156200327e575082818151811062003254576200325462003eba565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620032995780620032908162003f14565b91505062003233565b805f03620032dc57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115620032f957620032f962003bd4565b6040519080825280601f01601f19166020018201604052801562003324576020820181803683370190505b5090505f5b82811015620033aa5784818151811062003347576200334762003eba565b602001015160f81c60f81b82828151811062003367576200336762003eba565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620033a18162003f14565b91505062003329565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200143b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051620034ae919062003c25565b5f6040518083038185875af1925050503d805f8114620034ea576040519150601f19603f3d011682016040523d82523d5f602084013e620034ef565b606091505b509150915062003502878383876200350d565b979650505050505050565b60608315620035a75782515f036200359f5773ffffffffffffffffffffffffffffffffffffffff85163b6200359f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200143b565b508162001ad3565b62001ad38383815115620035be5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200143b9190620043dd565b611b0d80620043f283390190565b803563ffffffff81168114620033eb575f80fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620019f0575f80fd5b5f80604083850312156200364a575f80fd5b620036558362003602565b91506020830135620036678162003616565b809150509250929050565b8015158114620019f0575f80fd5b5f8083601f84011262003691575f80fd5b50813567ffffffffffffffff811115620036a9575f80fd5b602083019150836020828501011115620036c1575f80fd5b9250929050565b5f805f805f60808688031215620036dd575f80fd5b620036e88662003602565b94506020860135620036fa8162003616565b935060408601356200370c8162003672565b9250606086013567ffffffffffffffff81111562003728575f80fd5b620037368882890162003680565b969995985093965092949392505050565b5f6020828403121562003758575f80fd5b5035919050565b5f6020828403121562003770575f80fd5b6200377b8262003602565b9392505050565b8061040081018310156200088c575f80fd5b5f805f805f805f805f805f6105208c8e031215620037b0575f80fd5b620037bc8d8d62003782565b9a50620037cd6104008d0162003602565b99506104208c013598506104408c01359750620037ee6104608d0162003602565b96506104808c0135620038018162003616565b9550620038126104a08d0162003602565b94506104c08c0135620038258162003616565b93506104e08c013592506105008c013567ffffffffffffffff8111156200384a575f80fd5b620038588e828f0162003680565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562003883575f80fd5b81356200377b8162003616565b60ff81168114620019f0575f80fd5b5f805f805f805f60e0888a031215620038b6575f80fd5b8735620038c38162003890565b9650620038d36020890162003602565b95506040880135620038e58162003616565b9450620038f56060890162003602565b93506080880135620039078162003616565b9699959850939692959460a0840135945060c09093013592915050565b5f805f6060848603121562003937575f80fd5b620039428462003602565b92506020840135620039548162003616565b91506040840135620039668162003616565b809150509250925092565b5f805f805f805f60a0888a03121562003988575f80fd5b620039938862003602565b96506020880135620039a58162003616565b9550604088013567ffffffffffffffff80821115620039c2575f80fd5b620039d08b838c0162003680565b909750955060608a0135915080821115620039e9575f80fd5b50620039f88a828b0162003680565b909450925050608088013562003a0e8162003890565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003a35575f80fd5b62003a408862003602565b9650602088013562003a528162003616565b955060408801359450606088013562003a6b8162003616565b9350608088013562003a7d8162003672565b925060a088013567ffffffffffffffff81111562003a99575f80fd5b62003aa78a828b0162003680565b989b979a50959850939692959293505050565b5f805f80610460858703121562003acf575f80fd5b8435935062003ae2866020870162003782565b925062003af3610420860162003602565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003bab828501878962003b04565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003c1d57818101518382015260200162003c03565b50505f910152565b5f825162003c3881846020870162003c01565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003c8c5762003c8c62003bd4565b604052919050565b5f67ffffffffffffffff82111562003cb05762003cb062003bd4565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011262003cec575f80fd5b813562003d0362003cfd8262003c94565b62003c42565b81815284602083860101111562003d18575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003d47575f80fd5b833567ffffffffffffffff8082111562003d5f575f80fd5b62003d6d8783880162003cdc565b9450602086013591508082111562003d83575f80fd5b5062003d928682870162003cdc565b9250506040840135620039668162003890565b5f815180845262003dbe81602086016020860162003c01565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f62003e04606083018662003da5565b828103602084015262003e18818662003da5565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200350260808301848662003b04565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003eb060608301848662003b04565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003f475762003f4762003ee7565b5060010190565b606081525f62003f6360608301878962003b04565b828103602084015262003f7881868862003b04565b91505060ff831660408301529695505050505050565b5f835162003fa181846020880162003c01565b83519083019062003fb781836020880162003c01565b01949350505050565b600181815b808511156200401f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562004003576200400362003ee7565b808516156200401157918102915b93841c939080029062003fc5565b509250929050565b5f8262004037575060016200088c565b816200404557505f6200088c565b81600181146200405e5760028114620040695762004089565b60019150506200088c565b60ff8411156200407d576200407d62003ee7565b50506001821b6200088c565b5060208310610133831016604e8410600b8410161715620040ae575081810a6200088c565b620040ba838362003fc0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620040ef57620040ef62003ee7565b029392505050565b5f6200377b838362004027565b818103818111156200088c576200088c62003ee7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6020828403121562004158575f80fd5b5051919050565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620041be8285018762003da5565b925080851660e085015250509998505050505050505050565b5f60208284031215620041e8575f80fd5b81516200377b8162003672565b5f808585111562004204575f80fd5b8386111562004211575f80fd5b5050820193919092039150565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156200425f5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a0312156200427e575f80fd5b87356200428b8162003616565b965060208801356200429d8162003616565b955060408801359450606088013593506080880135620039078162003890565b5f805f805f805f80610100898b031215620042d6575f80fd5b8835620042e38162003616565b97506020890135620042f58162003616565b965060408901359550606089013594506080890135620043158162003672565b935060a0890135620043278162003890565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004355575f80fd5b81516200377b8162003890565b5f6020828403121562004373575f80fd5b815167ffffffffffffffff8111156200438a575f80fd5b8201601f810184136200439b575f80fd5b8051620043ac62003cfd8262003c94565b818152856020838501011115620043c1575f80fd5b620043d482602083016020860162003c01565b95945050505050565b602081525f6200377b602083018462003da556fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a2646970667358221220afdccfa9486655f8756b2a046212d040fae4be6515fb658fcf4d74aa59ae08e964736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMGlobalExitRoot.json b/compiled-contracts/PolygonZkEVMGlobalExitRoot.json index a2d289423..d50e6235c 100644 --- a/compiled-contracts/PolygonZkEVMGlobalExitRoot.json +++ b/compiled-contracts/PolygonZkEVMGlobalExitRoot.json @@ -19,6 +19,11 @@ "stateMutability": "nonpayable", "type": "constructor" }, + { + "inputs": [], + "name": "MerkleTreeFull", + "type": "error" + }, { "inputs": [], "name": "OnlyAllowedContracts", @@ -56,6 +61,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "depositCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "getLastGlobalExitRoot", @@ -69,6 +87,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "getRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -139,10 +170,44 @@ "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": "0x60c060405234801561000f575f80fd5b506040516103e13803806103e183398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a0516103226100bf5f395f818160e301526101b601525f818161012f015261016d01526103225ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c806333d6247d1161005857806333d6247d146100c15780633ed691ef146100d65780635ec6a8df146100de578063a3c573eb1461012a575f80fd5b806301fd90441461007e578063257b363214610099578063319cf735146100b8575b5f80fd5b6100865f5481565b6040519081526020015b60405180910390f35b6100866100a73660046102d5565b60026020525f908152604090205481565b61008660015481565b6100d46100cf3660046102d5565b610151565b005b61008661029b565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610090565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361019f575060018290558161021a565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101e8575f83905582915061021a565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f8181526002602052604081205491925003610295575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6102d06001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f602082840312156102e5575f80fd5b503591905056fea26469706673582212205b8fae68ff3c2dfc257497be9184a2e772688dbece1343c3dc2e8c1923291be864736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061007a575f3560e01c806333d6247d1161005857806333d6247d146100c15780633ed691ef146100d65780635ec6a8df146100de578063a3c573eb1461012a575f80fd5b806301fd90441461007e578063257b363214610099578063319cf735146100b8575b5f80fd5b6100865f5481565b6040519081526020015b60405180910390f35b6100866100a73660046102d5565b60026020525f908152604090205481565b61008660015481565b6100d46100cf3660046102d5565b610151565b005b61008661029b565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610090565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361019f575060018290558161021a565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101e8575f83905582915061021a565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f8181526002602052604081205491925003610295575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6102d06001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f602082840312156102e5575f80fd5b503591905056fea26469706673582212205b8fae68ff3c2dfc257497be9184a2e772688dbece1343c3dc2e8c1923291be864736f6c63430008140033", + "bytecode": "0x60c060405234801561000f575f80fd5b5060405161095738038061095783398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a0516108976100c05f395f8181610134015261022b01525f818161018001526101e201526108975ff3fe608060405234801561000f575f80fd5b50600436106100b9575f3560e01c80633ed691ef116100725780635ec6a8df116100585780635ec6a8df1461012f578063a3c573eb1461017b578063fb570834146101a2575f80fd5b80633ed691ef1461011f5780635ca1e16514610127575f80fd5b80632dfdf0b5116100a25780632dfdf0b5146100f8578063319cf7351461010157806333d6247d1461010a575f80fd5b806301fd9044146100bd578063257b3632146100d9575b5f80fd5b6100c6602b5481565b6040519081526020015b60405180910390f35b6100c66100e73660046105f7565b602d6020525f908152604090205481565b6100c660205481565b6100c6602c5481565b61011d6101183660046105f7565b6101c5565b005b6100c66102fa565b6100c661030e565b6101567f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100d0565b6101567f000000000000000000000000000000000000000000000000000000000000000081565b6101b56101b036600461060e565b610317565b60405190151581526020016100d0565b602b54602c5473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102145750602c82905581610290565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361025e57602b839055829150610290565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61029b82846103ef565b5f818152602d6020526040812054919250036102f4575f818152602d602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a36102f48161041e565b50505050565b5f610309602c54602b546103ef565b905090565b5f61030961051c565b5f84815b60208110156103e357600163ffffffff8616821c811690036103865785816020811061034957610349610660565b602002013582604051602001610369929190918252602082015260400190565b6040516020818303038152906040528051906020012091506103d1565b8186826020811061039957610399610660565b60200201356040516020016103b8929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806103db816106ba565b91505061031b565b50909114949350505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b80600161042d6020600261080f565b6104379190610821565b60205410610471576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60205f8154610480906106ba565b918290555090505f5b602081101561050e578082901c6001166001036104bb57825f82602081106104b3576104b3610660565b015550505050565b5f81602081106104cd576104cd610660565b015460408051602081019290925281018490526060016040516020818303038152906040528051906020012092508080610506906106ba565b915050610489565b50610517610834565b505050565b6020545f90819081805b60208110156105ee578083901c600116600103610582575f816020811061054f5761054f610660565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506105af565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806105e6906106ba565b915050610526565b50919392505050565b5f60208284031215610607575f80fd5b5035919050565b5f805f806104608587031215610622575f80fd5b84359350610420850186811115610637575f80fd5b6020860193503563ffffffff8116811461064f575f80fd5b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036106ea576106ea61068d565b5060010190565b600181815b8085111561074a57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156107305761073061068d565b8085161561073d57918102915b93841c93908002906106f6565b509250929050565b5f8261076057506001610418565b8161076c57505f610418565b8160018114610782576002811461078c576107a8565b6001915050610418565b60ff84111561079d5761079d61068d565b50506001821b610418565b5060208310610133831016604e8410600b84101617156107cb575081810a610418565b6107d583836106f1565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156108075761080761068d565b029392505050565b5f61081a8383610752565b9392505050565b818103818111156104185761041861068d565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea264697066735822122059114d99f90ecc01a66dc3046f440796b34e627715701744b7bb9633b21df6b464736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106100b9575f3560e01c80633ed691ef116100725780635ec6a8df116100585780635ec6a8df1461012f578063a3c573eb1461017b578063fb570834146101a2575f80fd5b80633ed691ef1461011f5780635ca1e16514610127575f80fd5b80632dfdf0b5116100a25780632dfdf0b5146100f8578063319cf7351461010157806333d6247d1461010a575f80fd5b806301fd9044146100bd578063257b3632146100d9575b5f80fd5b6100c6602b5481565b6040519081526020015b60405180910390f35b6100c66100e73660046105f7565b602d6020525f908152604090205481565b6100c660205481565b6100c6602c5481565b61011d6101183660046105f7565b6101c5565b005b6100c66102fa565b6100c661030e565b6101567f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100d0565b6101567f000000000000000000000000000000000000000000000000000000000000000081565b6101b56101b036600461060e565b610317565b60405190151581526020016100d0565b602b54602c5473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102145750602c82905581610290565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361025e57602b839055829150610290565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61029b82846103ef565b5f818152602d6020526040812054919250036102f4575f818152602d602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a36102f48161041e565b50505050565b5f610309602c54602b546103ef565b905090565b5f61030961051c565b5f84815b60208110156103e357600163ffffffff8616821c811690036103865785816020811061034957610349610660565b602002013582604051602001610369929190918252602082015260400190565b6040516020818303038152906040528051906020012091506103d1565b8186826020811061039957610399610660565b60200201356040516020016103b8929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806103db816106ba565b91505061031b565b50909114949350505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b80600161042d6020600261080f565b6104379190610821565b60205410610471576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60205f8154610480906106ba565b918290555090505f5b602081101561050e578082901c6001166001036104bb57825f82602081106104b3576104b3610660565b015550505050565b5f81602081106104cd576104cd610660565b015460408051602081019290925281018490526060016040516020818303038152906040528051906020012092508080610506906106ba565b915050610489565b50610517610834565b505050565b6020545f90819081805b60208110156105ee578083901c600116600103610582575f816020811061054f5761054f610660565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506105af565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806105e6906106ba565b915050610526565b50919392505050565b5f60208284031215610607575f80fd5b5035919050565b5f805f806104608587031215610622575f80fd5b84359350610420850186811115610637575f80fd5b6020860193503563ffffffff8116811461064f575f80fd5b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036106ea576106ea61068d565b5060010190565b600181815b8085111561074a57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156107305761073061068d565b8085161561073d57918102915b93841c93908002906106f6565b509250929050565b5f8261076057506001610418565b8161076c57505f610418565b8160018114610782576002811461078c576107a8565b6001915050610418565b60ff84111561079d5761079d61068d565b50506001821b610418565b5060208310610133831016604e8410600b84101617156107cb575081810a610418565b6107d583836106f1565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156108075761080761068d565b029392505050565b5f61081a8383610752565b9392505050565b818103818111156104185761041861068d565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea264697066735822122059114d99f90ecc01a66dc3046f440796b34e627715701744b7bb9633b21df6b464736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMGlobalExitRootMock.json b/compiled-contracts/PolygonZkEVMGlobalExitRootMock.json index 6bde95a70..c729a1367 100644 --- a/compiled-contracts/PolygonZkEVMGlobalExitRootMock.json +++ b/compiled-contracts/PolygonZkEVMGlobalExitRootMock.json @@ -19,6 +19,11 @@ "stateMutability": "nonpayable", "type": "constructor" }, + { + "inputs": [], + "name": "MerkleTreeFull", + "type": "error" + }, { "inputs": [], "name": "OnlyAllowedContracts", @@ -56,6 +61,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "depositCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "getLastGlobalExitRoot", @@ -69,6 +87,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "getRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -170,10 +201,44 @@ "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": "0x60c060405234801561000f575f80fd5b5060405161047838038061047883398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a0516103b86100c05f395f818161013a015261022c01525f818161018601526101e301526103b85ff3fe608060405234801561000f575f80fd5b506004361061009f575f3560e01c806333d6247d116100725780635bcef673116100585780635bcef673146101165780635ec6a8df14610135578063a3c573eb14610181575f80fd5b806333d6247d146100fb5780633ed691ef1461010e575f80fd5b806301fd9044146100a3578063051a9e28146100be578063257b3632146100d3578063319cf735146100f2575b5f80fd5b6100ab5f5481565b6040519081526020015b60405180910390f35b6100d16100cc36600461034b565b6101a8565b005b6100ab6100e136600461034b565b60026020525f908152604090205481565b6100ab60015481565b6100d161010936600461034b565b6101c7565b6100ab610311565b6100d1610124366004610362565b5f9182526002602052604090912055565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b8060025f6101b4610311565b815260208101919091526040015f205550565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102155750600182905581610290565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361025e575f839055829150610290565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f818152600260205260408120549192500361030b575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6103466001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f6020828403121561035b575f80fd5b5035919050565b5f8060408385031215610373575f80fd5b5050803592602090910135915056fea26469706673582212200799b5f60aa8eaf6d49205025cc41bfba78ce4f6ad614164e5da3c0bdc94810464736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061009f575f3560e01c806333d6247d116100725780635bcef673116100585780635bcef673146101165780635ec6a8df14610135578063a3c573eb14610181575f80fd5b806333d6247d146100fb5780633ed691ef1461010e575f80fd5b806301fd9044146100a3578063051a9e28146100be578063257b3632146100d3578063319cf735146100f2575b5f80fd5b6100ab5f5481565b6040519081526020015b60405180910390f35b6100d16100cc36600461034b565b6101a8565b005b6100ab6100e136600461034b565b60026020525f908152604090205481565b6100ab60015481565b6100d161010936600461034b565b6101c7565b6100ab610311565b6100d1610124366004610362565b5f9182526002602052604090912055565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b8060025f6101b4610311565b815260208101919091526040015f205550565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102155750600182905581610290565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361025e575f839055829150610290565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f818152600260205260408120549192500361030b575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6103466001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f6020828403121561035b575f80fd5b5035919050565b5f8060408385031215610373575f80fd5b5050803592602090910135915056fea26469706673582212200799b5f60aa8eaf6d49205025cc41bfba78ce4f6ad614164e5da3c0bdc94810464736f6c63430008140033", + "bytecode": "0x60c060405234801561000f575f80fd5b506040516109de3803806109de83398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a05161091e6100c05f395f818161017c015261029201525f81816101c80152610249015261091e5ff3fe608060405234801561000f575f80fd5b50600436106100cf575f3560e01c80633ed691ef1161007d5780635ec6a8df116100585780635ec6a8df14610177578063a3c573eb146101c3578063fb570834146101ea575f80fd5b80633ed691ef146101485780635bcef673146101505780635ca1e1651461016f575f80fd5b80632dfdf0b5116100ad5780632dfdf0b514610123578063319cf7351461012c57806333d6247d14610135575f80fd5b806301fd9044146100d3578063051a9e28146100ef578063257b363214610104575b5f80fd5b6100dc602b5481565b6040519081526020015b60405180910390f35b6101026100fd36600461065e565b61020d565b005b6100dc61011236600461065e565b602d6020525f908152604090205481565b6100dc60205481565b6100dc602c5481565b61010261014336600461065e565b61022c565b6100dc610361565b61010261015e366004610675565b5f918252602d602052604090912055565b6100dc610375565b61019e7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e6565b61019e7f000000000000000000000000000000000000000000000000000000000000000081565b6101fd6101f8366004610695565b61037e565b60405190151581526020016100e6565b80602d5f610219610361565b815260208101919091526040015f205550565b602b54602c5473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361027b5750602c829055816102f7565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102c557602b8390558291506102f7565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6103028284610456565b5f818152602d60205260408120549192500361035b575f818152602d602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a361035b81610485565b50505050565b5f610370602c54602b54610456565b905090565b5f610370610583565b5f84815b602081101561044a57600163ffffffff8616821c811690036103ed578581602081106103b0576103b06106e7565b6020020135826040516020016103d0929190918252602082015260400190565b604051602081830303815290604052805190602001209150610438565b81868260208110610400576104006106e7565b602002013560405160200161041f929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8061044281610741565b915050610382565b50909114949350505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b80600161049460206002610896565b61049e91906108a8565b602054106104d8576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60205f81546104e790610741565b918290555090505f5b6020811015610575578082901c60011660010361052257825f826020811061051a5761051a6106e7565b015550505050565b5f8160208110610534576105346106e7565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061056d90610741565b9150506104f0565b5061057e6108bb565b505050565b6020545f90819081805b6020811015610655578083901c6001166001036105e9575f81602081106105b6576105b66106e7565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610616565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b6040805160208101849052908101839052606001604051602081830303815290604052805190602001209150808061064d90610741565b91505061058d565b50919392505050565b5f6020828403121561066e575f80fd5b5035919050565b5f8060408385031215610686575f80fd5b50508035926020909101359150565b5f805f8061046085870312156106a9575f80fd5b843593506104208501868111156106be575f80fd5b6020860193503563ffffffff811681146106d6575f80fd5b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361077157610771610714565b5060010190565b600181815b808511156107d157817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156107b7576107b7610714565b808516156107c457918102915b93841c939080029061077d565b509250929050565b5f826107e75750600161047f565b816107f357505f61047f565b816001811461080957600281146108135761082f565b600191505061047f565b60ff84111561082457610824610714565b50506001821b61047f565b5060208310610133831016604e8410600b8410161715610852575081810a61047f565b61085c8383610778565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561088e5761088e610714565b029392505050565b5f6108a183836107d9565b9392505050565b8181038181111561047f5761047f610714565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea2646970667358221220bf3f4de702c9ce3edf71d69ca8d09c648531ae2831a2dbb3496a5daa427876e264736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106100cf575f3560e01c80633ed691ef1161007d5780635ec6a8df116100585780635ec6a8df14610177578063a3c573eb146101c3578063fb570834146101ea575f80fd5b80633ed691ef146101485780635bcef673146101505780635ca1e1651461016f575f80fd5b80632dfdf0b5116100ad5780632dfdf0b514610123578063319cf7351461012c57806333d6247d14610135575f80fd5b806301fd9044146100d3578063051a9e28146100ef578063257b363214610104575b5f80fd5b6100dc602b5481565b6040519081526020015b60405180910390f35b6101026100fd36600461065e565b61020d565b005b6100dc61011236600461065e565b602d6020525f908152604090205481565b6100dc60205481565b6100dc602c5481565b61010261014336600461065e565b61022c565b6100dc610361565b61010261015e366004610675565b5f918252602d602052604090912055565b6100dc610375565b61019e7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e6565b61019e7f000000000000000000000000000000000000000000000000000000000000000081565b6101fd6101f8366004610695565b61037e565b60405190151581526020016100e6565b80602d5f610219610361565b815260208101919091526040015f205550565b602b54602c5473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361027b5750602c829055816102f7565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102c557602b8390558291506102f7565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6103028284610456565b5f818152602d60205260408120549192500361035b575f818152602d602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a361035b81610485565b50505050565b5f610370602c54602b54610456565b905090565b5f610370610583565b5f84815b602081101561044a57600163ffffffff8616821c811690036103ed578581602081106103b0576103b06106e7565b6020020135826040516020016103d0929190918252602082015260400190565b604051602081830303815290604052805190602001209150610438565b81868260208110610400576104006106e7565b602002013560405160200161041f929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8061044281610741565b915050610382565b50909114949350505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b80600161049460206002610896565b61049e91906108a8565b602054106104d8576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60205f81546104e790610741565b918290555090505f5b6020811015610575578082901c60011660010361052257825f826020811061051a5761051a6106e7565b015550505050565b5f8160208110610534576105346106e7565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061056d90610741565b9150506104f0565b5061057e6108bb565b505050565b6020545f90819081805b6020811015610655578083901c6001166001036105e9575f81602081106105b6576105b66106e7565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610616565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b6040805160208101849052908101839052606001604051602081830303815290604052805190602001209150808061064d90610741565b91505061058d565b50919392505050565b5f6020828403121561066e575f80fd5b5035919050565b5f8060408385031215610686575f80fd5b50508035926020909101359150565b5f805f8061046085870312156106a9575f80fd5b843593506104208501868111156106be575f80fd5b6020860193503563ffffffff811681146106d6575f80fd5b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361077157610771610714565b5060010190565b600181815b808511156107d157817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156107b7576107b7610714565b808516156107c457918102915b93841c939080029061077d565b509250929050565b5f826107e75750600161047f565b816107f357505f61047f565b816001811461080957600281146108135761082f565b600191505061047f565b60ff84111561082457610824610714565b50506001821b61047f565b5060208310610133831016604e8410600b8410161715610852575081810a61047f565b61085c8383610778565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561088e5761088e610714565b029392505050565b5f6108a183836107d9565b9392505050565b8181038181111561047f5761047f610714565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea2646970667358221220bf3f4de702c9ce3edf71d69ca8d09c648531ae2831a2dbb3496a5daa427876e264736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMMock.json b/compiled-contracts/PolygonZkEVMMock.json index e122b9b6b..b2e23569d 100644 --- a/compiled-contracts/PolygonZkEVMMock.json +++ b/compiled-contracts/PolygonZkEVMMock.json @@ -746,6 +746,11 @@ "internalType": "address", "name": "sequencerAddress", "type": "address" + }, + { + "internalType": "bool", + "name": "isForced", + "type": "bool" } ], "name": "calculateAccInputHash", @@ -887,6 +892,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "gapLastTimestamp", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "getForcedBatchFee", @@ -1174,19 +1192,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "lastTimestamp", - "outputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "lastVerifiedBatch", @@ -1429,14 +1434,9 @@ }, { "internalType": "bytes32", - "name": "globalExitRoot", + "name": "forcedHistoricGlobalExitRoot", "type": "bytes32" }, - { - "internalType": "uint64", - "name": "timestamp", - "type": "uint64" - }, { "internalType": "uint64", "name": "minForcedTimestamp", @@ -1469,7 +1469,7 @@ }, { "internalType": "bytes32", - "name": "globalExitRoot", + "name": "forcedHistoricGlobalExitRoot", "type": "bytes32" }, { @@ -1478,7 +1478,7 @@ "type": "uint64" } ], - "internalType": "struct PolygonZkEVM.ForcedBatchData[]", + "internalType": "struct PolygonZkEVM.BatchData[]", "name": "batches", "type": "tuple[]" } @@ -1935,8 +1935,8 @@ "type": "function" } ], - "bytecode": "0x61014060405234801562000011575f80fd5b5060405162006f2038038062006f208339810160408190526200003491620000a2565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b039182166101005216610120526200012a565b6001600160a01b038116811462000083575f80fd5b50565b80516001600160401b03811681146200009d575f80fd5b919050565b5f805f805f8060c08789031215620000b8575f80fd5b8651620000c5816200006e565b6020880151909650620000d8816200006e565b6040880151909550620000eb816200006e565b6060880151909450620000fe816200006e565b92506200010e6080880162000086565b91506200011e60a0880162000086565b90509295509295509295565b60805160a05160c05160e0516101005161012051616d29620001f75f395f818161081501528181611a560152613e5601525f81816109a70152611a2c01525f818161096d015281816129e3015281816144e701526159e601525f8181610b380152818161170c01528181611bc801528181611d93015281816125f001528181612db101528181614757015261554301525f8181610bf801528181614eac01526152fa01525f8181610a75015281816129b1015281816132d90152818161472c0152614f980152616d295ff3fe608060405234801561000f575f80fd5b5060043610610475575f3560e01c80638c3d73011161025d578063c754c7ed11610148578063e7a7ed02116100c3578063f14916d611610093578063f851a44011610079578063f851a44014610c80578063f8b823e414610ca0578063fe16564f14610ca9575f80fd5b8063f14916d614610c5a578063f2fde38b14610c6d575f80fd5b8063e7a7ed0214610bc3578063e8bf92ed14610bf3578063eaeb077b14610c1a578063ed6b010414610c2d575f80fd5b8063d2e129f911610118578063d939b315116100fe578063d939b31514610b80578063dbc1697614610ba8578063e0d1744114610bb0575f80fd5b8063d2e129f914610b5a578063d8d1091b14610b6d575f80fd5b8063c754c7ed14610ac5578063c89e42df14610af1578063cfa8ed4714610b04578063d02103ca14610b33575f80fd5b8063ada8f919116101d8578063b4f77ea9116101a8578063ba58ae391161018e578063ba58ae3914610a97578063c0cad30214610aaa578063c0ed84e014610abd575f80fd5b8063b4f77ea914610a5d578063b6b0b09714610a70575f80fd5b8063ada8f9191461098f578063adc879e9146109a2578063afd23cbe146109c9578063b4d63f58146109f7575f80fd5b80639aa972a31161022d5780639c9f3dfe116102135780639c9f3dfe14610942578063a066215c14610955578063a3c573eb14610968575f80fd5b80639aa972a31461091c5780639b7967601461092f575f80fd5b80638c3d7301146108db5780638da5cb5b146108e357806396dc3d391461090157806399f5634e14610914575f80fd5b80634a1a89a71161037d578063621dd411116102f85780637215541a116102c8578063831c7ead116102ae578063831c7ead14610810578063837a473814610837578063841b24d7146108ab575f80fd5b80637215541a146107e95780637fcb3653146107fc575f80fd5b8063621dd4111461079c5780636b8616ce146107af5780636ff512cc146107ce578063715018a6146107e1575f80fd5b8063542028d51161034d5780635e9145c9116103335780635e9145c9146107795780635ec919581461078c5780636046916914610794575f80fd5b8063542028d5146106d0578063574f649e146106d8575f80fd5b80634a1a89a71461066b5780634a910e6a1461068b5780634e4877061461069e5780635392c5e0146106b1575f80fd5b8063267822471161040d578063383b3be8116103dd578063423fa856116103c3578063423fa8561461060f578063456052671461062f578063458c047714610657575f80fd5b8063383b3be8146105e9578063394218e9146105fc575f80fd5b8063267822471461055257806329878983146105975780632b0006fa146105c35780632c1f816a146105d6575f80fd5b806315064c961161044857806315064c96146104fb5780631816b7e51461051857806319d8ac611461052b578063220d78991461053f575f80fd5b80630a0d9fbe146104795780630eaa86ea146104b0578063107bf28c146104d157806310a01a72146104e6575b5f80fd5b606f5461049290610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6104c36104be366004615fac565b610cbc565b6040519081526020016104a7565b6104d961118c565b6040516104a79190616068565b6104f96104f4366004616097565b611218565b005b606f546105089060ff1681565b60405190151581526020016104a7565b6104f9610526366004616124565b6117c6565b6073546104929067ffffffffffffffff1681565b6104d961054d366004616145565b6118de565b607b546105729073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104a7565b6074546105729068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104f96105d136600461619f565b611ab4565b6104f96105e4366004616203565b611c7e565b6105086105f7366004616278565b611e86565b6104f961060a366004616278565b611edb565b6073546104929068010000000000000000900467ffffffffffffffff1681565b60735461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546104929067ffffffffffffffff1681565b6079546104929068010000000000000000900467ffffffffffffffff1681565b6104f9610699366004616278565b61205f565b6104f96106ac366004616278565b612112565b6104c36106bf366004616278565b60756020525f908152604090205481565b6104d9612296565b6104c36106e6366004616388565b835160209485012060408051808701979097528681019190915260608087019490945260c09290921b7fffffffffffffffff00000000000000000000000000000000000000000000000016608086015290911b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888401528051808403607c018152609c9093019052815191012090565b6104f961078736600461643d565b6122a3565b6104f9612a9c565b6104c3612b9b565b6104f96107aa36600461619f565b612bb0565b6104c36107bd366004616278565b60716020525f908152604090205481565b6104f96107dc36600461648d565b612f2e565b6104f9613003565b6104f96107f7366004616278565b613016565b6074546104929067ffffffffffffffff1681565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b61087f6108453660046164a6565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016104a7565b607954610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9613183565b60335473ffffffffffffffffffffffffffffffffffffffff16610572565b6104f961090f366004616278565b61324f565b6104c3613292565b6104f961092a366004616203565b6133e5565b6104f961093d366004616278565b613495565b6104f9610950366004616278565b6134e4565b6104f9610963366004616278565b613660565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f961099d36600461648d565b613766565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b606f546109e4906901000000000000000000900461ffff1681565b60405161ffff90911681526020016104a7565b610a37610a05366004616278565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016104a7565b6104f9610a6b366004616278565b61382a565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b610508610aa53660046164a6565b61383b565b6104f9610ab83660046164bd565b6138c3565b6104926138db565b607b546104929074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9610aff3660046164bd565b61392e565b606f54610572906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610b6836600461652d565b6139bb565b6104f9610b7b3660046165d8565b613ef9565b60795461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6104f9614494565b6104f9610bbe366004616617565b614568565b607354610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610c28366004616661565b6145f7565b607b54610508907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b6104f9610c6836600461648d565b6149e7565b6104f9610c7b36600461648d565b614ab9565b607a546105729073ffffffffffffffffffffffffffffffffffffffff1681565b6104c360705481565b6104f9610cb73660046166a9565b614b6d565b5f805f610cc76138db565b905067ffffffffffffffff881615610e935760795467ffffffffffffffff9081169089161115610da4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a4015b60405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614610e8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610d9b565b5061102b565b67ffffffffffffffff87165f90815260756020526040902054915081610f61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610d9b565b8067ffffffffffffffff168767ffffffffffffffff16111561102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610d9b565b8067ffffffffffffffff168667ffffffffffffffff16116110f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610d9b565b5f61110288888886896118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161113691906166d3565b602060405180830381855afa158015611151573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061117491906166ee565b61117e9190616732565b9a9950505050505050505050565b6077805461119990616745565b80601f01602080910402602001604051908101604052809291908181526020018280546111c590616745565b80156112105780601f106111e757610100808354040283529160200191611210565b820191905f5260205f20905b8154815290600101906020018083116111f357829003601f168201915b505050505081565b611220614b8f565b5f8061122a6138db565b905067ffffffffffffffff8a16156113f15760795467ffffffffffffffff908116908b161115611302576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a401610d9b565b67ffffffffffffffff808b165f9081526078602052604090206002810154815490945090918b81166801000000000000000090920416146113eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610d9b565b50611589565b67ffffffffffffffff89165f908152607560205260409020549150816114bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610d9b565b8067ffffffffffffffff168967ffffffffffffffff161115611589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610d9b565b8067ffffffffffffffff168867ffffffffffffffff1611611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610d9b565b5f6116608a8a8a868b6118de565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8c81169182179092555f90815260756020526040902089905560795491925016156116dd57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018990527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611762575f80fd5b505af1158015611774573d5f803e3d5ffd5b505060405189815233925067ffffffffffffffff8c1691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe9060200160405180910390a35050505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611817576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff16108061183057506103ff8161ffff16115b15611867576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590611911575081155b15611948576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8061197f576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119888461383b565b6119be576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611b11576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b1f868686868686614c10565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611b9957607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611c1e575f80fd5b505af1158015611c30573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611cdb576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cea87878787878787614fcb565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611d6457607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611de9575f80fd5b505af1158015611dfb573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611ec992700100000000000000000000000000000000909204811691166167c3565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611f2c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611f73576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16611fe25760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611fe2576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1906020016118d3565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461210657606f5460ff16156120c7576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120d081611e86565b612106576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61210f816153fa565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612163576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156121aa576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661221557607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610612215576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020016118d3565b6076805461119990616745565b606f5460ff16156122e0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314612340576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361237b576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156123b7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f81815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b868110156127ff575f8a8a8381811061241d5761241d6167eb565b905060200281019061242f9190616818565b6124389061684a565b8051805160209091012060608201519192509067ffffffffffffffff16156125ad5785612464816168d4565b9650505f81836020015184606001516040516020016124bb93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260719093529120549091508114612543576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088165f9081526071602052604080822091909155606085015190850151908216911610156125a7576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506126e7565b602082015115801590612671575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af115801561264b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061266f91906166ee565b155b156126a8576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156126e7576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff16108061271a575042826040015167ffffffffffffffff16115b15612751576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519750505080806127f7906168fa565b915050612402565b5061280a86856167c3565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115612873576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61287e8285616931565b6128929067ffffffffffffffff1688616952565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c841691161793029290921790559091508281169085161461298757607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6129d933308360705461299a9190616965565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190615607565b6129e16156e9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612a46575f80fd5b505af1158015612a58573d5f803e3d5ffd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612aed576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16612b49576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f6070546064612bab9190616965565b905090565b606f5460ff1615612bed576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f908152607260205260409020600101544292612c39927801000000000000000000000000000000000000000000000000909104811691166167c3565b67ffffffffffffffff161115612c7b576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612c888686616931565b67ffffffffffffffff161115612cca576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cd8868686868686614c10565b612ce184615794565b607954700100000000000000000000000000000000900467ffffffffffffffff165f03612e2257607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615612d8257607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612e07575f80fd5b505af1158015612e19573d5f803e3d5ffd5b50505050612ef0565b612e2a6156e9565b6079805467ffffffffffffffff16905f612e43836168d4565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001611c6e565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612f7f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016118d3565b61300b614b8f565b6130145f61596e565b565b60335473ffffffffffffffffffffffffffffffffffffffff16331461317b575f61303e6138db565b90508067ffffffffffffffff168267ffffffffffffffff161161308d576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000909104811690831611806130d2575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15613109576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916131379162093a8091166167c3565b67ffffffffffffffff161115613179576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61210f6159e4565b607b5473ffffffffffffffffffffffffffffffffffffffff1633146131d4576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b613257614b8f565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561331e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061334291906166ee565b90505f61334d6138db565b60735467ffffffffffffffff6801000000000000000082048116916133a59170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416616931565b6133af91906167c3565b6133b99190616931565b67ffffffffffffffff169050805f036133d4575f9250505090565b6133de818361697c565b9250505090565b606f5460ff1615613422576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61343187878787878787614fcb565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a161348c6159e4565b50505050505050565b61349d614b8f565b6073805467ffffffffffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613535576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561357c576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166135e35760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106135e3576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75906020016118d3565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146136b1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156136f8576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28906020016118d3565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146137b7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016118d3565b613832614b8f565b61210f81615794565b5f67ffffffff0000000167ffffffffffffffff8316108015613872575067ffffffff00000001604083901c67ffffffffffffffff16105b8015613893575067ffffffff00000001608083901c67ffffffffffffffff16105b80156138aa575067ffffffff0000000160c083901c105b156138b757506001919050565b505f919050565b919050565b6138cb614b8f565b60776138d782826169dc565b5050565b6079545f9067ffffffffffffffff161561391d575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461397f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607661398b82826169dc565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516118d39190616068565b5f54610100900460ff16158080156139d957505f54600160ff909116105b806139f25750303b1580156139f257505f5460ff166001145b613a7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610d9b565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015613ada575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b613ae7602088018861648d565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055613b3c604088016020890161648d565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055613ba1608088016060890161648d565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076613c2b86826169dc565b506077613c3885826169dc565b5062093a80613c4d6060890160408a01616278565b67ffffffffffffffff161115613c8f576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613c9f6060880160408901616278565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80613d0160a0890160808a01616278565b67ffffffffffffffff161115613d43576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d5360a0880160808901616278565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613e32615a67565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f00000000000000000000000000000000000000000000000000000000000000008585604051613e879493929190616b3b565b60405180910390a1801561348c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613f56576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615613f93576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613fce576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561400a576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff78010000000000000000000000000000000000000000000000008204811691614055918491700100000000000000000000000000000000900416616b72565b111561408d576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b84811015614332575f8787838181106140eb576140eb6167eb565b90506020028101906140fd9190616b85565b61410690616bb7565b905083614112816168d4565b825180516020918201208185015160408087015190519499509194505f936141739386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146141fb576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f9081526071602052604081205561421f600189616952565b840361428e5742607b60149054906101000a900467ffffffffffffffff16846040015161424c91906167c3565b67ffffffffffffffff16111561428e576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450505050808061432a906168fa565b9150506140d0565b5061433d84846167c3565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146144e5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561454a575f80fd5b505af115801561455c573d5f803e3d5ffd5b50505050613014615b06565b614570614b8f565b6040805160608101825293845267ffffffffffffffff92831660208086019182529284168583019081529584165f908152607290935291209251835551600190920180549351821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169290911691909117919091179055565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615614654576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614691576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61469a612b9b565b9050818111156146d6576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115614712576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61475473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084615607565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156147be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147e291906166ee565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff1690601861481c836168d4565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051614853929190616c30565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303614981576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26149e0565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931823388886040516149d79493929190616c3f565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314614a38576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca906020016118d3565b614ac1614b8f565b73ffffffffffffffffffffffffffffffffffffffff8116614b64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610d9b565b61210f8161596e565b614b75614b8f565b67ffffffffffffffff165f90815260756020526040902055565b60335473ffffffffffffffffffffffffffffffffffffffff163314613014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d9b565b5f80614c1a6138db565b905067ffffffffffffffff881615614ce95760795467ffffffffffffffff9081169089161115614c76576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614614ce3576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614d89565b67ffffffffffffffff87165f90815260756020526040902054915081614d3b576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115614d89576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611614dd6576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f614de488888886896118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051614e1891906166d3565b602060405180830381855afa158015614e33573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614e5691906166ee565b614e609190616732565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91614ee291899190600401616c74565b602060405180830381865afa158015614efd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614f219190616cae565b614f57576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614fbf33614f65858b616931565b67ffffffffffffffff16614f77613292565b614f819190616965565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190615b94565b50505050505050505050565b5f67ffffffffffffffff8816156150975760795467ffffffffffffffff9081169089161115615026576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614615091576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50615132565b5067ffffffffffffffff85165f90815260756020526040902054806150e8576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff9081169087161115615132576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff908116908816118061516457508767ffffffffffffffff168767ffffffffffffffff1611155b8061518b575060795467ffffffffffffffff68010000000000000000909104811690881611155b156151c2576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f90815260786020526040902054680100000000000000009004811690861614615224576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61523287878785886118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161526691906166d3565b602060405180830381855afa158015615281573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906152a491906166ee565b6152ae9190616732565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161533091889190600401616c74565b602060405180830381865afa15801561534b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061536f9190616cae565b6153a5576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614fbf576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff680100000000000000009091048116908216111580615434575060795467ffffffffffffffff908116908216115b1561546b576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015615599575f80fd5b505af11580156155ab573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e84600201546040516155fa91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526156e39085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152615bef565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115613014576079545f906157319068010000000000000000900467ffffffffffffffff1660016167c3565b905061573c81611e86565b1561210f576079545f9060029061575e90849067ffffffffffffffff16616931565b6157689190616ccd565b61577290836167c3565b905061577d81611e86565b1561578b576138d7816153fa565b6138d7826153fa565b5f61579d6138db565b9050815f806157ac8484616931565b606f5467ffffffffffffffff91821692505f916157cf9161010090041642616952565b90505b8467ffffffffffffffff168467ffffffffffffffff16146158595767ffffffffffffffff8085165f908152607260205260409020600181015490911682101561583757600181015468010000000000000000900467ffffffffffffffff169450615853565b6158418686616931565b67ffffffffffffffff16935050615859565b506157d2565b5f6158648484616952565b9050838110156158bb57808403600c811161587f5780615882565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a60705402816158b1576158b1616705565b046070555061592a565b838103600c81116158cc57806158cf565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a7640000028161590557615905616705565b04905080607054670de0b6b3a7640000028161592357615923616705565b0460705550505b683635c9adc5dea00000607054111561594f57683635c9adc5dea0000060705561348c565b633b9aca00607054101561348c57633b9aca0060705550505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015615a49575f80fd5b505af1158015615a5b573d5f803e3d5ffd5b50505050613014615cfa565b5f54610100900460ff16615afd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610d9b565b6130143361596e565b606f5460ff16615b42576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052615bea9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401615661565b505050565b5f615c50826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615d8c9092919063ffffffff16565b805190915015615bea5780806020019051810190615c6e9190616cae565b615bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610d9b565b606f5460ff1615615d37576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b6060615d9a84845f85615da2565b949350505050565b606082471015615e34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610d9b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051615e5c91906166d3565b5f6040518083038185875af1925050503d805f8114615e96576040519150601f19603f3d011682016040523d82523d5f602084013e615e9b565b606091505b5091509150615eac87838387615eb7565b979650505050505050565b60608315615f4c5782515f03615f455773ffffffffffffffffffffffffffffffffffffffff85163b615f45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d9b565b5081615d9a565b615d9a8383815115615f615781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9b9190616068565b803567ffffffffffffffff811681146138be575f80fd5b5f805f805f60a08688031215615fc0575f80fd5b615fc986615f95565b9450615fd760208701615f95565b9350615fe560408701615f95565b94979396509394606081013594506080013592915050565b5f5b83811015616017578181015183820152602001615fff565b50505f910152565b5f8151808452616036816020860160208601615ffd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61607a602083018461601f565b9392505050565b8060408101831015616091575f80fd5b92915050565b5f805f805f805f806101a0898b0312156160af575f80fd5b6160b889615f95565b97506160c660208a01615f95565b96506160d460408a01615f95565b955060608901359450608089013593506160f18a60a08b01616081565b925061016089018a811115616104575f80fd5b60e08a0192506161148b82616081565b9150509295985092959890939650565b5f60208284031215616134575f80fd5b813561ffff8116811461607a575f80fd5b5f805f805f60a08688031215616159575f80fd5b61616286615f95565b945061617060208701615f95565b94979496505050506040830135926060810135926080909101359150565b806103008101831015616091575f80fd5b5f805f805f806103a087890312156161b5575f80fd5b6161be87615f95565b95506161cc60208801615f95565b94506161da60408801615f95565b935060608701359250608087013591506161f78860a0890161618e565b90509295509295509295565b5f805f805f805f6103c0888a03121561621a575f80fd5b61622388615f95565b965061623160208901615f95565b955061623f60408901615f95565b945061624d60608901615f95565b93506080880135925060a0880135915061626a8960c08a0161618e565b905092959891949750929550565b5f60208284031215616288575f80fd5b61607a82615f95565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126162cd575f80fd5b813567ffffffffffffffff808211156162e8576162e8616291565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561632e5761632e616291565b81604052838152866020858801011115616346575f80fd5b836020870160208301375f602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146138be575f80fd5b5f805f805f60a0868803121561639c575f80fd5b85359450602086013567ffffffffffffffff8111156163b9575f80fd5b6163c5888289016162be565b945050604086013592506163db60608701615f95565b91506163e960808701616365565b90509295509295909350565b5f8083601f840112616405575f80fd5b50813567ffffffffffffffff81111561641c575f80fd5b6020830191508360208260051b8501011115616436575f80fd5b9250929050565b5f805f6040848603121561644f575f80fd5b833567ffffffffffffffff811115616465575f80fd5b616471868287016163f5565b9094509250616484905060208501616365565b90509250925092565b5f6020828403121561649d575f80fd5b61607a82616365565b5f602082840312156164b6575f80fd5b5035919050565b5f602082840312156164cd575f80fd5b813567ffffffffffffffff8111156164e3575f80fd5b615d9a848285016162be565b5f8083601f8401126164ff575f80fd5b50813567ffffffffffffffff811115616516575f80fd5b602083019150836020828501011115616436575f80fd5b5f805f805f80868803610120811215616544575f80fd5b60a0811215616551575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff80821115616576575f80fd5b6165828a838b016162be565b955060e0890135915080821115616597575f80fd5b6165a38a838b016162be565b94506101008901359150808211156165b9575f80fd5b506165c689828a016164ef565b979a9699509497509295939492505050565b5f80602083850312156165e9575f80fd5b823567ffffffffffffffff8111156165ff575f80fd5b61660b858286016163f5565b90969095509350505050565b5f805f806080858703121561662a575f80fd5b61663385615f95565b93506020850135925061664860408601615f95565b915061665660608601615f95565b905092959194509250565b5f805f60408486031215616673575f80fd5b833567ffffffffffffffff811115616689575f80fd5b616695868287016164ef565b909790965060209590950135949350505050565b5f80604083850312156166ba575f80fd5b823591506166ca60208401615f95565b90509250929050565b5f82516166e4818460208701615ffd565b9190910192915050565b5f602082840312156166fe575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f8261674057616740616705565b500690565b600181811c9082168061675957607f821691505b602082108103616790577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156167e4576167e4616796565b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126166e4575f80fd5b5f6080823603121561685a575f80fd5b6040516080810167ffffffffffffffff828210818311171561687e5761687e616291565b816040528435915080821115616892575f80fd5b5061689f368286016162be565b825250602083013560208201526168b860408401615f95565b60408201526168c960608401615f95565b606082015292915050565b5f67ffffffffffffffff8083168181036168f0576168f0616796565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361692a5761692a616796565b5060010190565b67ffffffffffffffff8281168282160390808211156167e4576167e4616796565b8181038181111561609157616091616796565b808202811582820484141761609157616091616796565b5f8261698a5761698a616705565b500490565b601f821115615bea575f81815260208120601f850160051c810160208610156169b55750805b601f850160051c820191505b818110156169d4578281556001016169c1565b505050505050565b815167ffffffffffffffff8111156169f6576169f6616291565b616a0a81616a048454616745565b8461698f565b602080601f831160018114616a5c575f8415616a265750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556169d4565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015616aa857888601518255948401946001909101908401616a89565b5085821015616ae457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152616b68606083018486616af4565b9695505050505050565b8082018082111561609157616091616796565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126166e4575f80fd5b5f60608236031215616bc7575f80fd5b6040516060810167ffffffffffffffff8282108183111715616beb57616beb616291565b816040528435915080821115616bff575f80fd5b50616c0c368286016162be565b82525060208301356020820152616c2560408401615f95565b604082015292915050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f616b68606083018486616af4565b6103208101610300808584378201835f5b6001811015616ca4578151835260209283019290910190600101616c85565b5050509392505050565b5f60208284031215616cbe575f80fd5b8151801515811461607a575f80fd5b5f67ffffffffffffffff80841680616ce757616ce7616705565b9216919091049291505056fea26469706673582212203d78dd0bda59d6322d20458734dd51eab51ad00e93348cf59380a0e5731cf93a64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610475575f3560e01c80638c3d73011161025d578063c754c7ed11610148578063e7a7ed02116100c3578063f14916d611610093578063f851a44011610079578063f851a44014610c80578063f8b823e414610ca0578063fe16564f14610ca9575f80fd5b8063f14916d614610c5a578063f2fde38b14610c6d575f80fd5b8063e7a7ed0214610bc3578063e8bf92ed14610bf3578063eaeb077b14610c1a578063ed6b010414610c2d575f80fd5b8063d2e129f911610118578063d939b315116100fe578063d939b31514610b80578063dbc1697614610ba8578063e0d1744114610bb0575f80fd5b8063d2e129f914610b5a578063d8d1091b14610b6d575f80fd5b8063c754c7ed14610ac5578063c89e42df14610af1578063cfa8ed4714610b04578063d02103ca14610b33575f80fd5b8063ada8f919116101d8578063b4f77ea9116101a8578063ba58ae391161018e578063ba58ae3914610a97578063c0cad30214610aaa578063c0ed84e014610abd575f80fd5b8063b4f77ea914610a5d578063b6b0b09714610a70575f80fd5b8063ada8f9191461098f578063adc879e9146109a2578063afd23cbe146109c9578063b4d63f58146109f7575f80fd5b80639aa972a31161022d5780639c9f3dfe116102135780639c9f3dfe14610942578063a066215c14610955578063a3c573eb14610968575f80fd5b80639aa972a31461091c5780639b7967601461092f575f80fd5b80638c3d7301146108db5780638da5cb5b146108e357806396dc3d391461090157806399f5634e14610914575f80fd5b80634a1a89a71161037d578063621dd411116102f85780637215541a116102c8578063831c7ead116102ae578063831c7ead14610810578063837a473814610837578063841b24d7146108ab575f80fd5b80637215541a146107e95780637fcb3653146107fc575f80fd5b8063621dd4111461079c5780636b8616ce146107af5780636ff512cc146107ce578063715018a6146107e1575f80fd5b8063542028d51161034d5780635e9145c9116103335780635e9145c9146107795780635ec919581461078c5780636046916914610794575f80fd5b8063542028d5146106d0578063574f649e146106d8575f80fd5b80634a1a89a71461066b5780634a910e6a1461068b5780634e4877061461069e5780635392c5e0146106b1575f80fd5b8063267822471161040d578063383b3be8116103dd578063423fa856116103c3578063423fa8561461060f578063456052671461062f578063458c047714610657575f80fd5b8063383b3be8146105e9578063394218e9146105fc575f80fd5b8063267822471461055257806329878983146105975780632b0006fa146105c35780632c1f816a146105d6575f80fd5b806315064c961161044857806315064c96146104fb5780631816b7e51461051857806319d8ac611461052b578063220d78991461053f575f80fd5b80630a0d9fbe146104795780630eaa86ea146104b0578063107bf28c146104d157806310a01a72146104e6575b5f80fd5b606f5461049290610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6104c36104be366004615fac565b610cbc565b6040519081526020016104a7565b6104d961118c565b6040516104a79190616068565b6104f96104f4366004616097565b611218565b005b606f546105089060ff1681565b60405190151581526020016104a7565b6104f9610526366004616124565b6117c6565b6073546104929067ffffffffffffffff1681565b6104d961054d366004616145565b6118de565b607b546105729073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104a7565b6074546105729068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104f96105d136600461619f565b611ab4565b6104f96105e4366004616203565b611c7e565b6105086105f7366004616278565b611e86565b6104f961060a366004616278565b611edb565b6073546104929068010000000000000000900467ffffffffffffffff1681565b60735461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546104929067ffffffffffffffff1681565b6079546104929068010000000000000000900467ffffffffffffffff1681565b6104f9610699366004616278565b61205f565b6104f96106ac366004616278565b612112565b6104c36106bf366004616278565b60756020525f908152604090205481565b6104d9612296565b6104c36106e6366004616388565b835160209485012060408051808701979097528681019190915260608087019490945260c09290921b7fffffffffffffffff00000000000000000000000000000000000000000000000016608086015290911b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888401528051808403607c018152609c9093019052815191012090565b6104f961078736600461643d565b6122a3565b6104f9612a9c565b6104c3612b9b565b6104f96107aa36600461619f565b612bb0565b6104c36107bd366004616278565b60716020525f908152604090205481565b6104f96107dc36600461648d565b612f2e565b6104f9613003565b6104f96107f7366004616278565b613016565b6074546104929067ffffffffffffffff1681565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b61087f6108453660046164a6565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016104a7565b607954610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9613183565b60335473ffffffffffffffffffffffffffffffffffffffff16610572565b6104f961090f366004616278565b61324f565b6104c3613292565b6104f961092a366004616203565b6133e5565b6104f961093d366004616278565b613495565b6104f9610950366004616278565b6134e4565b6104f9610963366004616278565b613660565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f961099d36600461648d565b613766565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b606f546109e4906901000000000000000000900461ffff1681565b60405161ffff90911681526020016104a7565b610a37610a05366004616278565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016104a7565b6104f9610a6b366004616278565b61382a565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b610508610aa53660046164a6565b61383b565b6104f9610ab83660046164bd565b6138c3565b6104926138db565b607b546104929074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9610aff3660046164bd565b61392e565b606f54610572906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610b6836600461652d565b6139bb565b6104f9610b7b3660046165d8565b613ef9565b60795461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6104f9614494565b6104f9610bbe366004616617565b614568565b607354610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610c28366004616661565b6145f7565b607b54610508907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b6104f9610c6836600461648d565b6149e7565b6104f9610c7b36600461648d565b614ab9565b607a546105729073ffffffffffffffffffffffffffffffffffffffff1681565b6104c360705481565b6104f9610cb73660046166a9565b614b6d565b5f805f610cc76138db565b905067ffffffffffffffff881615610e935760795467ffffffffffffffff9081169089161115610da4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a4015b60405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614610e8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610d9b565b5061102b565b67ffffffffffffffff87165f90815260756020526040902054915081610f61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610d9b565b8067ffffffffffffffff168767ffffffffffffffff16111561102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610d9b565b8067ffffffffffffffff168667ffffffffffffffff16116110f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610d9b565b5f61110288888886896118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161113691906166d3565b602060405180830381855afa158015611151573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061117491906166ee565b61117e9190616732565b9a9950505050505050505050565b6077805461119990616745565b80601f01602080910402602001604051908101604052809291908181526020018280546111c590616745565b80156112105780601f106111e757610100808354040283529160200191611210565b820191905f5260205f20905b8154815290600101906020018083116111f357829003601f168201915b505050505081565b611220614b8f565b5f8061122a6138db565b905067ffffffffffffffff8a16156113f15760795467ffffffffffffffff908116908b161115611302576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a401610d9b565b67ffffffffffffffff808b165f9081526078602052604090206002810154815490945090918b81166801000000000000000090920416146113eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610d9b565b50611589565b67ffffffffffffffff89165f908152607560205260409020549150816114bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610d9b565b8067ffffffffffffffff168967ffffffffffffffff161115611589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610d9b565b8067ffffffffffffffff168867ffffffffffffffff1611611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610d9b565b5f6116608a8a8a868b6118de565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8c81169182179092555f90815260756020526040902089905560795491925016156116dd57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018990527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611762575f80fd5b505af1158015611774573d5f803e3d5ffd5b505060405189815233925067ffffffffffffffff8c1691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe9060200160405180910390a35050505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611817576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff16108061183057506103ff8161ffff16115b15611867576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590611911575081155b15611948576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8061197f576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119888461383b565b6119be576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611b11576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b1f868686868686614c10565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611b9957607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611c1e575f80fd5b505af1158015611c30573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611cdb576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cea87878787878787614fcb565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611d6457607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611de9575f80fd5b505af1158015611dfb573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611ec992700100000000000000000000000000000000909204811691166167c3565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611f2c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611f73576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16611fe25760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611fe2576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1906020016118d3565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461210657606f5460ff16156120c7576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120d081611e86565b612106576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61210f816153fa565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612163576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156121aa576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661221557607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610612215576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020016118d3565b6076805461119990616745565b606f5460ff16156122e0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314612340576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361237b576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156123b7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f81815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b868110156127ff575f8a8a8381811061241d5761241d6167eb565b905060200281019061242f9190616818565b6124389061684a565b8051805160209091012060608201519192509067ffffffffffffffff16156125ad5785612464816168d4565b9650505f81836020015184606001516040516020016124bb93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260719093529120549091508114612543576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088165f9081526071602052604080822091909155606085015190850151908216911610156125a7576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506126e7565b602082015115801590612671575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af115801561264b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061266f91906166ee565b155b156126a8576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156126e7576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff16108061271a575042826040015167ffffffffffffffff16115b15612751576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519750505080806127f7906168fa565b915050612402565b5061280a86856167c3565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115612873576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61287e8285616931565b6128929067ffffffffffffffff1688616952565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c841691161793029290921790559091508281169085161461298757607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6129d933308360705461299a9190616965565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190615607565b6129e16156e9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612a46575f80fd5b505af1158015612a58573d5f803e3d5ffd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612aed576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16612b49576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f6070546064612bab9190616965565b905090565b606f5460ff1615612bed576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f908152607260205260409020600101544292612c39927801000000000000000000000000000000000000000000000000909104811691166167c3565b67ffffffffffffffff161115612c7b576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612c888686616931565b67ffffffffffffffff161115612cca576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cd8868686868686614c10565b612ce184615794565b607954700100000000000000000000000000000000900467ffffffffffffffff165f03612e2257607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615612d8257607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612e07575f80fd5b505af1158015612e19573d5f803e3d5ffd5b50505050612ef0565b612e2a6156e9565b6079805467ffffffffffffffff16905f612e43836168d4565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001611c6e565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612f7f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016118d3565b61300b614b8f565b6130145f61596e565b565b60335473ffffffffffffffffffffffffffffffffffffffff16331461317b575f61303e6138db565b90508067ffffffffffffffff168267ffffffffffffffff161161308d576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000909104811690831611806130d2575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15613109576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916131379162093a8091166167c3565b67ffffffffffffffff161115613179576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61210f6159e4565b607b5473ffffffffffffffffffffffffffffffffffffffff1633146131d4576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b613257614b8f565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561331e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061334291906166ee565b90505f61334d6138db565b60735467ffffffffffffffff6801000000000000000082048116916133a59170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416616931565b6133af91906167c3565b6133b99190616931565b67ffffffffffffffff169050805f036133d4575f9250505090565b6133de818361697c565b9250505090565b606f5460ff1615613422576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61343187878787878787614fcb565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a161348c6159e4565b50505050505050565b61349d614b8f565b6073805467ffffffffffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613535576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561357c576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166135e35760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106135e3576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75906020016118d3565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146136b1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156136f8576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28906020016118d3565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146137b7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016118d3565b613832614b8f565b61210f81615794565b5f67ffffffff0000000167ffffffffffffffff8316108015613872575067ffffffff00000001604083901c67ffffffffffffffff16105b8015613893575067ffffffff00000001608083901c67ffffffffffffffff16105b80156138aa575067ffffffff0000000160c083901c105b156138b757506001919050565b505f919050565b919050565b6138cb614b8f565b60776138d782826169dc565b5050565b6079545f9067ffffffffffffffff161561391d575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461397f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607661398b82826169dc565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516118d39190616068565b5f54610100900460ff16158080156139d957505f54600160ff909116105b806139f25750303b1580156139f257505f5460ff166001145b613a7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610d9b565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015613ada575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b613ae7602088018861648d565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055613b3c604088016020890161648d565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055613ba1608088016060890161648d565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076613c2b86826169dc565b506077613c3885826169dc565b5062093a80613c4d6060890160408a01616278565b67ffffffffffffffff161115613c8f576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613c9f6060880160408901616278565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80613d0160a0890160808a01616278565b67ffffffffffffffff161115613d43576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d5360a0880160808901616278565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613e32615a67565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f00000000000000000000000000000000000000000000000000000000000000008585604051613e879493929190616b3b565b60405180910390a1801561348c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613f56576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615613f93576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613fce576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561400a576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff78010000000000000000000000000000000000000000000000008204811691614055918491700100000000000000000000000000000000900416616b72565b111561408d576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b84811015614332575f8787838181106140eb576140eb6167eb565b90506020028101906140fd9190616b85565b61410690616bb7565b905083614112816168d4565b825180516020918201208185015160408087015190519499509194505f936141739386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146141fb576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f9081526071602052604081205561421f600189616952565b840361428e5742607b60149054906101000a900467ffffffffffffffff16846040015161424c91906167c3565b67ffffffffffffffff16111561428e576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450505050808061432a906168fa565b9150506140d0565b5061433d84846167c3565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146144e5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561454a575f80fd5b505af115801561455c573d5f803e3d5ffd5b50505050613014615b06565b614570614b8f565b6040805160608101825293845267ffffffffffffffff92831660208086019182529284168583019081529584165f908152607290935291209251835551600190920180549351821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169290911691909117919091179055565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615614654576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614691576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61469a612b9b565b9050818111156146d6576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115614712576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61475473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084615607565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156147be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147e291906166ee565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff1690601861481c836168d4565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051614853929190616c30565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303614981576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26149e0565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931823388886040516149d79493929190616c3f565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314614a38576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca906020016118d3565b614ac1614b8f565b73ffffffffffffffffffffffffffffffffffffffff8116614b64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610d9b565b61210f8161596e565b614b75614b8f565b67ffffffffffffffff165f90815260756020526040902055565b60335473ffffffffffffffffffffffffffffffffffffffff163314613014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d9b565b5f80614c1a6138db565b905067ffffffffffffffff881615614ce95760795467ffffffffffffffff9081169089161115614c76576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614614ce3576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614d89565b67ffffffffffffffff87165f90815260756020526040902054915081614d3b576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115614d89576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611614dd6576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f614de488888886896118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051614e1891906166d3565b602060405180830381855afa158015614e33573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614e5691906166ee565b614e609190616732565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91614ee291899190600401616c74565b602060405180830381865afa158015614efd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614f219190616cae565b614f57576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614fbf33614f65858b616931565b67ffffffffffffffff16614f77613292565b614f819190616965565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190615b94565b50505050505050505050565b5f67ffffffffffffffff8816156150975760795467ffffffffffffffff9081169089161115615026576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614615091576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50615132565b5067ffffffffffffffff85165f90815260756020526040902054806150e8576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff9081169087161115615132576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff908116908816118061516457508767ffffffffffffffff168767ffffffffffffffff1611155b8061518b575060795467ffffffffffffffff68010000000000000000909104811690881611155b156151c2576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f90815260786020526040902054680100000000000000009004811690861614615224576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61523287878785886118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161526691906166d3565b602060405180830381855afa158015615281573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906152a491906166ee565b6152ae9190616732565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161533091889190600401616c74565b602060405180830381865afa15801561534b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061536f9190616cae565b6153a5576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614fbf576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff680100000000000000009091048116908216111580615434575060795467ffffffffffffffff908116908216115b1561546b576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015615599575f80fd5b505af11580156155ab573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e84600201546040516155fa91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526156e39085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152615bef565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115613014576079545f906157319068010000000000000000900467ffffffffffffffff1660016167c3565b905061573c81611e86565b1561210f576079545f9060029061575e90849067ffffffffffffffff16616931565b6157689190616ccd565b61577290836167c3565b905061577d81611e86565b1561578b576138d7816153fa565b6138d7826153fa565b5f61579d6138db565b9050815f806157ac8484616931565b606f5467ffffffffffffffff91821692505f916157cf9161010090041642616952565b90505b8467ffffffffffffffff168467ffffffffffffffff16146158595767ffffffffffffffff8085165f908152607260205260409020600181015490911682101561583757600181015468010000000000000000900467ffffffffffffffff169450615853565b6158418686616931565b67ffffffffffffffff16935050615859565b506157d2565b5f6158648484616952565b9050838110156158bb57808403600c811161587f5780615882565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a60705402816158b1576158b1616705565b046070555061592a565b838103600c81116158cc57806158cf565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a7640000028161590557615905616705565b04905080607054670de0b6b3a7640000028161592357615923616705565b0460705550505b683635c9adc5dea00000607054111561594f57683635c9adc5dea0000060705561348c565b633b9aca00607054101561348c57633b9aca0060705550505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015615a49575f80fd5b505af1158015615a5b573d5f803e3d5ffd5b50505050613014615cfa565b5f54610100900460ff16615afd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610d9b565b6130143361596e565b606f5460ff16615b42576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052615bea9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401615661565b505050565b5f615c50826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615d8c9092919063ffffffff16565b805190915015615bea5780806020019051810190615c6e9190616cae565b615bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610d9b565b606f5460ff1615615d37576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b6060615d9a84845f85615da2565b949350505050565b606082471015615e34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610d9b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051615e5c91906166d3565b5f6040518083038185875af1925050503d805f8114615e96576040519150601f19603f3d011682016040523d82523d5f602084013e615e9b565b606091505b5091509150615eac87838387615eb7565b979650505050505050565b60608315615f4c5782515f03615f455773ffffffffffffffffffffffffffffffffffffffff85163b615f45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d9b565b5081615d9a565b615d9a8383815115615f615781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9b9190616068565b803567ffffffffffffffff811681146138be575f80fd5b5f805f805f60a08688031215615fc0575f80fd5b615fc986615f95565b9450615fd760208701615f95565b9350615fe560408701615f95565b94979396509394606081013594506080013592915050565b5f5b83811015616017578181015183820152602001615fff565b50505f910152565b5f8151808452616036816020860160208601615ffd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61607a602083018461601f565b9392505050565b8060408101831015616091575f80fd5b92915050565b5f805f805f805f806101a0898b0312156160af575f80fd5b6160b889615f95565b97506160c660208a01615f95565b96506160d460408a01615f95565b955060608901359450608089013593506160f18a60a08b01616081565b925061016089018a811115616104575f80fd5b60e08a0192506161148b82616081565b9150509295985092959890939650565b5f60208284031215616134575f80fd5b813561ffff8116811461607a575f80fd5b5f805f805f60a08688031215616159575f80fd5b61616286615f95565b945061617060208701615f95565b94979496505050506040830135926060810135926080909101359150565b806103008101831015616091575f80fd5b5f805f805f806103a087890312156161b5575f80fd5b6161be87615f95565b95506161cc60208801615f95565b94506161da60408801615f95565b935060608701359250608087013591506161f78860a0890161618e565b90509295509295509295565b5f805f805f805f6103c0888a03121561621a575f80fd5b61622388615f95565b965061623160208901615f95565b955061623f60408901615f95565b945061624d60608901615f95565b93506080880135925060a0880135915061626a8960c08a0161618e565b905092959891949750929550565b5f60208284031215616288575f80fd5b61607a82615f95565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126162cd575f80fd5b813567ffffffffffffffff808211156162e8576162e8616291565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561632e5761632e616291565b81604052838152866020858801011115616346575f80fd5b836020870160208301375f602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146138be575f80fd5b5f805f805f60a0868803121561639c575f80fd5b85359450602086013567ffffffffffffffff8111156163b9575f80fd5b6163c5888289016162be565b945050604086013592506163db60608701615f95565b91506163e960808701616365565b90509295509295909350565b5f8083601f840112616405575f80fd5b50813567ffffffffffffffff81111561641c575f80fd5b6020830191508360208260051b8501011115616436575f80fd5b9250929050565b5f805f6040848603121561644f575f80fd5b833567ffffffffffffffff811115616465575f80fd5b616471868287016163f5565b9094509250616484905060208501616365565b90509250925092565b5f6020828403121561649d575f80fd5b61607a82616365565b5f602082840312156164b6575f80fd5b5035919050565b5f602082840312156164cd575f80fd5b813567ffffffffffffffff8111156164e3575f80fd5b615d9a848285016162be565b5f8083601f8401126164ff575f80fd5b50813567ffffffffffffffff811115616516575f80fd5b602083019150836020828501011115616436575f80fd5b5f805f805f80868803610120811215616544575f80fd5b60a0811215616551575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff80821115616576575f80fd5b6165828a838b016162be565b955060e0890135915080821115616597575f80fd5b6165a38a838b016162be565b94506101008901359150808211156165b9575f80fd5b506165c689828a016164ef565b979a9699509497509295939492505050565b5f80602083850312156165e9575f80fd5b823567ffffffffffffffff8111156165ff575f80fd5b61660b858286016163f5565b90969095509350505050565b5f805f806080858703121561662a575f80fd5b61663385615f95565b93506020850135925061664860408601615f95565b915061665660608601615f95565b905092959194509250565b5f805f60408486031215616673575f80fd5b833567ffffffffffffffff811115616689575f80fd5b616695868287016164ef565b909790965060209590950135949350505050565b5f80604083850312156166ba575f80fd5b823591506166ca60208401615f95565b90509250929050565b5f82516166e4818460208701615ffd565b9190910192915050565b5f602082840312156166fe575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f8261674057616740616705565b500690565b600181811c9082168061675957607f821691505b602082108103616790577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156167e4576167e4616796565b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126166e4575f80fd5b5f6080823603121561685a575f80fd5b6040516080810167ffffffffffffffff828210818311171561687e5761687e616291565b816040528435915080821115616892575f80fd5b5061689f368286016162be565b825250602083013560208201526168b860408401615f95565b60408201526168c960608401615f95565b606082015292915050565b5f67ffffffffffffffff8083168181036168f0576168f0616796565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361692a5761692a616796565b5060010190565b67ffffffffffffffff8281168282160390808211156167e4576167e4616796565b8181038181111561609157616091616796565b808202811582820484141761609157616091616796565b5f8261698a5761698a616705565b500490565b601f821115615bea575f81815260208120601f850160051c810160208610156169b55750805b601f850160051c820191505b818110156169d4578281556001016169c1565b505050505050565b815167ffffffffffffffff8111156169f6576169f6616291565b616a0a81616a048454616745565b8461698f565b602080601f831160018114616a5c575f8415616a265750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556169d4565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015616aa857888601518255948401946001909101908401616a89565b5085821015616ae457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152616b68606083018486616af4565b9695505050505050565b8082018082111561609157616091616796565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126166e4575f80fd5b5f60608236031215616bc7575f80fd5b6040516060810167ffffffffffffffff8282108183111715616beb57616beb616291565b816040528435915080821115616bff575f80fd5b50616c0c368286016162be565b82525060208301356020820152616c2560408401615f95565b604082015292915050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f616b68606083018486616af4565b6103208101610300808584378201835f5b6001811015616ca4578151835260209283019290910190600101616c85565b5050509392505050565b5f60208284031215616cbe575f80fd5b8151801515811461607a575f80fd5b5f67ffffffffffffffff80841680616ce757616ce7616705565b9216919091049291505056fea26469706673582212203d78dd0bda59d6322d20458734dd51eab51ad00e93348cf59380a0e5731cf93a64736f6c63430008140033", + "bytecode": "0x61014060405234801562000011575f80fd5b5060405162006e4638038062006e468339810160408190526200003491620000a2565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b039182166101005216610120526200012a565b6001600160a01b038116811462000083575f80fd5b50565b80516001600160401b03811681146200009d575f80fd5b919050565b5f805f805f8060c08789031215620000b8575f80fd5b8651620000c5816200006e565b6020880151909650620000d8816200006e565b6040880151909550620000eb816200006e565b6060880151909450620000fe816200006e565b92506200010e6080880162000086565b91506200011e60a0880162000086565b90509295509295509295565b60805160a05160c05160e0516101005161012051616c4f620001f75f395f818161076101528181611a600152613e1b01525f818161099e0152611a3601525f8181610964015281816131ea015281816144ad01526158ca01525f8181610b420152818161171601528181611bd201528181611d9d015281816125c2015281816132660152818161471d015261550901525f8181610c0201528181614e7201526152c001525f8181610a6c01528181612aea01528181613817015281816146f20152614f5e0152616c4f5ff3fe608060405234801561000f575f80fd5b5060043610610475575f3560e01c80638da5cb5b1161025d578063c754c7ed11610148578063e7a7ed02116100c3578063f14916d611610093578063f851a44011610079578063f851a44014610c8a578063f8b823e414610caa578063fe16564f14610cb3575f80fd5b8063f14916d614610c64578063f2fde38b14610c77575f80fd5b8063e7a7ed0214610bcd578063e8bf92ed14610bfd578063eaeb077b14610c24578063ed6b010414610c37575f80fd5b8063d2e129f911610118578063d939b315116100fe578063d939b31514610b8a578063dbc1697614610bb2578063e0d1744114610bba575f80fd5b8063d2e129f914610b64578063d8d1091b14610b77575f80fd5b8063c754c7ed14610acf578063c89e42df14610afb578063cfa8ed4714610b0e578063d02103ca14610b3d575f80fd5b8063adc879e9116101d8578063b6b0b097116101a8578063c00e0dc91161018e578063c00e0dc914610aa1578063c0cad30214610ab4578063c0ed84e014610ac7575f80fd5b8063b6b0b09714610a67578063ba58ae3914610a8e575f80fd5b8063adc879e914610999578063afd23cbe146109c0578063b4d63f58146109ee578063b4f77ea914610a54575f80fd5b80639b7967601161022d578063a066215c11610213578063a066215c1461094c578063a3c573eb1461095f578063ada8f91914610986575f80fd5b80639b796760146109265780639c9f3dfe14610939575f80fd5b80638da5cb5b146108da57806396dc3d39146108f857806399f5634e1461090b5780639aa972a314610913575f80fd5b80634a1a89a71161037d5780636ff512cc116102f8578063831c7ead116102c8578063841b24d7116102ae578063841b24d7146107f75780638449a79c146108275780638c3d7301146108d2575f80fd5b8063831c7ead1461075c578063837a473814610783575f80fd5b80636ff512cc1461071a578063715018a61461072d5780637215541a146107355780637fcb365314610748575f80fd5b8063542028d51161034d578063604691691161033357806360469169146106e0578063621dd411146106e85780636b8616ce146106fb575f80fd5b8063542028d5146106d05780635ec91958146106d8575f80fd5b80634a1a89a71461066b5780634a910e6a1461068b5780634e4877061461069e5780635392c5e0146106b1575f80fd5b8063298789831161040d578063383b3be8116103dd578063423fa856116103c3578063423fa8561461060f578063456052671461062f578063458c047714610657575f80fd5b8063383b3be8146105e9578063394218e9146105fc575f80fd5b806329878983146105835780632a9f208f146105af5780632b0006fa146105c35780632c1f816a146105d6575f80fd5b806315064c961161044857806315064c96146104fb5780631816b7e514610518578063220d78991461052b578063267822471461053e575f80fd5b80630a0d9fbe146104795780630eaa86ea146104b0578063107bf28c146104d157806310a01a72146104e6575b5f80fd5b606f5461049290610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6104c36104be366004615f72565b610cc6565b6040519081526020016104a7565b6104d9611196565b6040516104a7919061602e565b6104f96104f436600461605d565b611222565b005b606f546105089060ff1681565b60405190151581526020016104a7565b6104f96105263660046160ea565b6117d0565b6104d961053936600461610b565b6118e8565b607b5461055e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104a7565b60745461055e9068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6073546104929067ffffffffffffffff1681565b6104f96105d1366004616165565b611abe565b6104f96105e43660046161c9565b611c88565b6105086105f736600461623e565b611e90565b6104f961060a36600461623e565b611ee5565b6073546104929068010000000000000000900467ffffffffffffffff1681565b60735461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546104929067ffffffffffffffff1681565b6079546104929068010000000000000000900467ffffffffffffffff1681565b6104f961069936600461623e565b612069565b6104f96106ac36600461623e565b61211c565b6104c36106bf36600461623e565b60756020525f908152604090205481565b6104d96122a0565b6104f96122ad565b6104c36123ac565b6104f96106f6366004616165565b6123c1565b6104c361070936600461623e565b60716020525f908152604090205481565b6104f961072836600461627a565b61273f565b6104f9612814565b6104f961074336600461623e565b612827565b6074546104929067ffffffffffffffff1681565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b6107cb610791366004616293565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016104a7565b607954610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104c361083536600461638b565b845160209586012060408051808801989098528781019190915260608088019590955260c09390931b7fffffffffffffffff000000000000000000000000000000000000000000000000166080870152921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608885015290151560f81b609c8401528051808403607d018152609d9093019052815191012090565b6104f9612994565b60335473ffffffffffffffffffffffffffffffffffffffff1661055e565b6104f961090636600461623e565b612a60565b6104c3612aa3565b6104f96109213660046161c9565b612bf6565b6104f961093436600461623e565b612ca6565b6104f961094736600461623e565b612cf5565b6104f961095a36600461623e565b612e71565b61055e7f000000000000000000000000000000000000000000000000000000000000000081565b6104f961099436600461627a565b612f77565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b606f546109db906901000000000000000000900461ffff1681565b60405161ffff90911681526020016104a7565b610a2e6109fc36600461623e565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016104a7565b6104f9610a6236600461623e565b61303b565b61055e7f000000000000000000000000000000000000000000000000000000000000000081565b610508610a9c366004616293565b61304c565b6104f9610aaf366004616453565b6130d4565b6104f9610ac23660046164a3565b613888565b6104926138a0565b607b546104929074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9610b093660046164a3565b6138f3565b606f5461055e906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61055e7f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610b72366004616513565b613980565b6104f9610b853660046165be565b613ebe565b60795461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6104f961445a565b6104f9610bc83660046165fd565b61452e565b607354610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61055e7f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610c32366004616647565b6145bd565b607b54610508907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b6104f9610c7236600461627a565b6149ad565b6104f9610c8536600461627a565b614a7f565b607a5461055e9073ffffffffffffffffffffffffffffffffffffffff1681565b6104c360705481565b6104f9610cc136600461668f565b614b33565b5f805f610cd16138a0565b905067ffffffffffffffff881615610e9d5760795467ffffffffffffffff9081169089161115610dae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a4015b60405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614610e97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610da5565b50611035565b67ffffffffffffffff87165f90815260756020526040902054915081610f6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610da5565b8067ffffffffffffffff168767ffffffffffffffff161115611035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610da5565b8067ffffffffffffffff168667ffffffffffffffff16116110fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610da5565b5f61110c88888886896118e8565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161114091906166b9565b602060405180830381855afa15801561115b573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061117e91906166d4565b6111889190616718565b9a9950505050505050505050565b607780546111a39061672b565b80601f01602080910402602001604051908101604052809291908181526020018280546111cf9061672b565b801561121a5780601f106111f15761010080835404028352916020019161121a565b820191905f5260205f20905b8154815290600101906020018083116111fd57829003601f168201915b505050505081565b61122a614b55565b5f806112346138a0565b905067ffffffffffffffff8a16156113fb5760795467ffffffffffffffff908116908b16111561130c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a401610da5565b67ffffffffffffffff808b165f9081526078602052604090206002810154815490945090918b81166801000000000000000090920416146113f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610da5565b50611593565b67ffffffffffffffff89165f908152607560205260409020549150816114c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610da5565b8067ffffffffffffffff168967ffffffffffffffff161115611593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610da5565b8067ffffffffffffffff168867ffffffffffffffff161161165c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610da5565b5f61166a8a8a8a868b6118e8565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8c81169182179092555f90815260756020526040902089905560795491925016156116e757607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018990527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b15801561176c575f80fd5b505af115801561177e573d5f803e3d5ffd5b505060405189815233925067ffffffffffffffff8c1691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe9060200160405180910390a35050505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611821576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff16108061183a57506103ff8161ffff16115b15611871576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f81815260726020526040808220549388168252902054606092911580159061191b575081155b15611952576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80611989576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119928461304c565b6119c8576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611b1b576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b29868686868686614bd6565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611ba357607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611c28575f80fd5b505af1158015611c3a573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611ce5576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cf487878787878787614f91565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611d6e57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611df3575f80fd5b505af1158015611e05573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611ed392700100000000000000000000000000000000909204811691166167a9565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611f36576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611f7d576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16611fec5760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611fec576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1906020016118dd565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461211057606f5460ff16156120d1576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120da81611e90565b612110576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612119816153c0565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461216d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156121b4576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661221f57607b5467ffffffffffffffff7401000000000000000000000000000000000000000090910481169082161061221f576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020016118dd565b607680546111a39061672b565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146122fe576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1661235a576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f60705460646123bc91906167d1565b905090565b606f5460ff16156123fe576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f90815260726020526040902060010154429261244a927801000000000000000000000000000000000000000000000000909104811691166167a9565b67ffffffffffffffff16111561248c576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e861249986866167e8565b67ffffffffffffffff1611156124db576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124e9868686868686614bd6565b6124f2846155cd565b607954700100000000000000000000000000000000900467ffffffffffffffff165f0361263357607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f908152607560205260409020839055607954161561259357607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612618575f80fd5b505af115801561262a573d5f803e3d5ffd5b50505050612701565b61263b6157a7565b6079805467ffffffffffffffff16905f61265483616809565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001611c78565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612790576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016118dd565b61281c614b55565b6128255f615852565b565b60335473ffffffffffffffffffffffffffffffffffffffff16331461298c575f61284f6138a0565b90508067ffffffffffffffff168267ffffffffffffffff161161289e576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000909104811690831611806128e3575067ffffffffffffffff8083165f9081526072602052604090206001015416155b1561291a576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916129489162093a8091166167a9565b67ffffffffffffffff16111561298a576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6121196158c8565b607b5473ffffffffffffffffffffffffffffffffffffffff1633146129e5576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b612a68614b55565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015612b2f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b5391906166d4565b90505f612b5e6138a0565b60735467ffffffffffffffff680100000000000000008204811691612bb691700100000000000000000000000000000000820481169178010000000000000000000000000000000000000000000000009004166167e8565b612bc091906167a9565b612bca91906167e8565b67ffffffffffffffff169050805f03612be5575f9250505090565b612bef818361682f565b9250505090565b606f5460ff1615612c33576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c4287878787878787614f91565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1612c9d6158c8565b50505050505050565b612cae614b55565b6073805467ffffffffffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612d46576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115612d8d576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16612df45760795467ffffffffffffffff700100000000000000000000000000000000909104811690821610612df4576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75906020016118dd565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612ec2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff161115612f09576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28906020016118dd565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612fc8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016118dd565b613043614b55565b612119816155cd565b5f67ffffffff0000000167ffffffffffffffff8316108015613083575067ffffffff00000001604083901c67ffffffffffffffff16105b80156130a4575067ffffffff00000001608083901c67ffffffffffffffff16105b80156130bb575067ffffffff0000000160c083901c105b156130c857506001919050565b505f919050565b919050565b606f5460ff1615613111576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314613171576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f8190036131ac576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156131e8576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561324d575f80fd5b505af115801561325f573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132f191906166d4565b60735467ffffffffffffffff68010000000000000000820481165f818152607260205260408120549495504294919370010000000000000000000000000000000090049092169182905b87811015613647575f8b8b8381811061335657613356616842565b9050602002810190613368919061686f565b613371906168a1565b8051805160209091012060408201519192509067ffffffffffffffff1615613562578561339d81616809565b9650505f81836020015184604001516040516020016133f493929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f9081526071909352912054909150811461347c576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015181519384018a905290830185905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528d901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201527f0100000000000000000000000000000000000000000000000000000000000000609c820152609d0160405160208183030381529060405280519060200120955060715f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550613632565b8151516201d4c010156135a1576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018b905260c08a901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528c901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c820152609d016040516020818303038152906040528051906020012094505b5050808061363f9061691a565b91505061333b565b5061365287856167a9565b60735490945067ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690841611156136bb576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516060810182528381524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528b86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090931692909217948416830294909417905582547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff1693029290921790558790828116908516146137ed5761378f82856167e8565b6137a39067ffffffffffffffff1682616951565b607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff88160217905590505b61383f33308360705461380091906167d1565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692919061594b565b6138476157a7565b60405167ffffffffffffffff8616907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce905f90a25050505050505050505050565b613890614b55565b607761389c82826169b1565b5050565b6079545f9067ffffffffffffffff16156138e2575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613944576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607661395082826169b1565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516118dd919061602e565b5f54610100900460ff161580801561399e57505f54600160ff909116105b806139b75750303b1580156139b757505f5460ff166001145b613a43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610da5565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015613a9f575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b613aac602088018861627a565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055613b01604088016020890161627a565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055613b66608088016060890161627a565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076613bf086826169b1565b506077613bfd85826169b1565b5062093a80613c126060890160408a0161623e565b67ffffffffffffffff161115613c54576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613c64606088016040890161623e565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80613cc660a0890160808a0161623e565b67ffffffffffffffff161115613d08576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d1860a088016080890161623e565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613df7615a2d565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f00000000000000000000000000000000000000000000000000000000000000008585604051613e4c9493929190616b10565b60405180910390a18015612c9d575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613f1b576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615613f58576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613f93576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115613fcf576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff7801000000000000000000000000000000000000000000000000820481169161401a918491700100000000000000000000000000000000900416616b47565b1115614052576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b84811015614321575f8787838181106140b0576140b0616842565b90506020028101906140c2919061686f565b6140cb906168a1565b9050836140d781616809565b825180516020918201208185015160408087015190519499509194505f936141389386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146141c0576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f908152607160205260408120556141e4600189616951565b84036142535742607b60149054906101000a900467ffffffffffffffff16846040015161421191906167a9565b67ffffffffffffffff161115614253576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602083810151604080860151815193840189905290830185905260608084019290925260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201527f0100000000000000000000000000000000000000000000000000000000000000609c820152609d0160405160208183030381529060405280519060200120945050505080806143199061691a565b915050614095565b5061432c84846167a9565b6040805160608101825283815267ffffffffffffffff428116602080840191825260738054680100000000000000009081900485168688019081528589165f8181526072909552888520975188559451600190970180549151871683027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921697871697909717179095558054938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff958402959095167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff9094169390931793909317909155915192955090917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146144ab576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b158015614510575f80fd5b505af1158015614522573d5f803e3d5ffd5b50505050612825615acc565b614536614b55565b6040805160608101825293845267ffffffffffffffff92831660208086019182529284168583019081529584165f908152607290935291209251835551600190920180549351821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169290911691909117919091179055565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561461a576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614657576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6146606123ac565b90508181111561469c576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113888311156146d8576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61471a73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308461594b565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015614784573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147a891906166d4565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff169060186147e283616809565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051614819929190616b5a565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303614947576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26149a6565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9318233888860405161499d9493929190616b69565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146149fe576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca906020016118dd565b614a87614b55565b73ffffffffffffffffffffffffffffffffffffffff8116614b2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610da5565b61211981615852565b614b3b614b55565b67ffffffffffffffff165f90815260756020526040902055565b60335473ffffffffffffffffffffffffffffffffffffffff163314612825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610da5565b5f80614be06138a0565b905067ffffffffffffffff881615614caf5760795467ffffffffffffffff9081169089161115614c3c576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614614ca9576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614d4f565b67ffffffffffffffff87165f90815260756020526040902054915081614d01576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115614d4f576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611614d9c576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f614daa88888886896118e8565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051614dde91906166b9565b602060405180830381855afa158015614df9573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614e1c91906166d4565b614e269190616718565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91614ea891899190600401616b9e565b602060405180830381865afa158015614ec3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ee79190616bd8565b614f1d576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f8533614f2b858b6167e8565b67ffffffffffffffff16614f3d612aa3565b614f4791906167d1565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190615b5a565b50505050505050505050565b5f67ffffffffffffffff88161561505d5760795467ffffffffffffffff9081169089161115614fec576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614615057576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506150f8565b5067ffffffffffffffff85165f90815260756020526040902054806150ae576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff90811690871611156150f8576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff908116908816118061512a57508767ffffffffffffffff168767ffffffffffffffff1611155b80615151575060795467ffffffffffffffff68010000000000000000909104811690881611155b15615188576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f908152607860205260409020546801000000000000000090048116908616146151ea576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6151f887878785886118e8565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161522c91906166b9565b602060405180830381855afa158015615247573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061526a91906166d4565b6152749190616718565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916152f691889190600401616b9e565b602060405180830381865afa158015615311573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906153359190616bd8565b61536b576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614f85576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff6801000000000000000090910481169082161115806153fa575060795467ffffffffffffffff908116908216115b15615431576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b15801561555f575f80fd5b505af1158015615571573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e84600201546040516155c091815260200190565b60405180910390a3505050565b5f6155d66138a0565b9050815f806155e584846167e8565b606f5467ffffffffffffffff91821692505f916156089161010090041642616951565b90505b8467ffffffffffffffff168467ffffffffffffffff16146156925767ffffffffffffffff8085165f908152607260205260409020600181015490911682101561567057600181015468010000000000000000900467ffffffffffffffff16945061568c565b61567a86866167e8565b67ffffffffffffffff16935050615692565b5061560b565b5f61569d8484616951565b9050838110156156f457808403600c81116156b857806156bb565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a60705402816156ea576156ea6166eb565b0460705550615763565b838103600c81116157055780615708565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a7640000028161573e5761573e6166eb565b04905080607054670de0b6b3a7640000028161575c5761575c6166eb565b0460705550505b683635c9adc5dea00000607054111561578857683635c9adc5dea00000607055612c9d565b633b9aca006070541015612c9d57633b9aca0060705550505050505050565b60795467ffffffffffffffff680100000000000000008204811691161115612825576079545f906157ef9068010000000000000000900467ffffffffffffffff1660016167a9565b90506157fa81611e90565b15612119576079545f9060029061581c90849067ffffffffffffffff166167e8565b6158269190616bf3565b61583090836167a9565b905061583b81611e90565b156158495761389c816153c0565b61389c826153c0565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561592d575f80fd5b505af115801561593f573d5f803e3d5ffd5b50505050612825615bb5565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052615a279085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152615c47565b50505050565b5f54610100900460ff16615ac3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610da5565b61282533615852565b606f5460ff16615b08576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052615bb09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016159a5565b505050565b606f5460ff1615615bf2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f615ca8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615d529092919063ffffffff16565b805190915015615bb05780806020019051810190615cc69190616bd8565b615bb0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610da5565b6060615d6084845f85615d68565b949350505050565b606082471015615dfa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610da5565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051615e2291906166b9565b5f6040518083038185875af1925050503d805f8114615e5c576040519150601f19603f3d011682016040523d82523d5f602084013e615e61565b606091505b5091509150615e7287838387615e7d565b979650505050505050565b60608315615f125782515f03615f0b5773ffffffffffffffffffffffffffffffffffffffff85163b615f0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610da5565b5081615d60565b615d608383815115615f275781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da5919061602e565b803567ffffffffffffffff811681146130cf575f80fd5b5f805f805f60a08688031215615f86575f80fd5b615f8f86615f5b565b9450615f9d60208701615f5b565b9350615fab60408701615f5b565b94979396509394606081013594506080013592915050565b5f5b83811015615fdd578181015183820152602001615fc5565b50505f910152565b5f8151808452615ffc816020860160208601615fc3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6160406020830184615fe5565b9392505050565b8060408101831015616057575f80fd5b92915050565b5f805f805f805f806101a0898b031215616075575f80fd5b61607e89615f5b565b975061608c60208a01615f5b565b965061609a60408a01615f5b565b955060608901359450608089013593506160b78a60a08b01616047565b925061016089018a8111156160ca575f80fd5b60e08a0192506160da8b82616047565b9150509295985092959890939650565b5f602082840312156160fa575f80fd5b813561ffff81168114616040575f80fd5b5f805f805f60a0868803121561611f575f80fd5b61612886615f5b565b945061613660208701615f5b565b94979496505050506040830135926060810135926080909101359150565b806103008101831015616057575f80fd5b5f805f805f806103a0878903121561617b575f80fd5b61618487615f5b565b955061619260208801615f5b565b94506161a060408801615f5b565b935060608701359250608087013591506161bd8860a08901616154565b90509295509295509295565b5f805f805f805f6103c0888a0312156161e0575f80fd5b6161e988615f5b565b96506161f760208901615f5b565b955061620560408901615f5b565b945061621360608901615f5b565b93506080880135925060a088013591506162308960c08a01616154565b905092959891949750929550565b5f6020828403121561624e575f80fd5b61604082615f5b565b803573ffffffffffffffffffffffffffffffffffffffff811681146130cf575f80fd5b5f6020828403121561628a575f80fd5b61604082616257565b5f602082840312156162a3575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126162e6575f80fd5b813567ffffffffffffffff80821115616301576163016162aa565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715616347576163476162aa565b8160405283815286602085880101111561635f575f80fd5b836020870160208301375f602085830101528094505050505092915050565b8015158114612119575f80fd5b5f805f805f8060c087890312156163a0575f80fd5b86359550602087013567ffffffffffffffff8111156163bd575f80fd5b6163c989828a016162d7565b955050604087013593506163df60608801615f5b565b92506163ed60808801616257565b915060a08701356163fd8161637e565b809150509295509295509295565b5f8083601f84011261641b575f80fd5b50813567ffffffffffffffff811115616432575f80fd5b6020830191508360208260051b850101111561644c575f80fd5b9250929050565b5f805f60408486031215616465575f80fd5b833567ffffffffffffffff81111561647b575f80fd5b6164878682870161640b565b909450925061649a905060208501616257565b90509250925092565b5f602082840312156164b3575f80fd5b813567ffffffffffffffff8111156164c9575f80fd5b615d60848285016162d7565b5f8083601f8401126164e5575f80fd5b50813567ffffffffffffffff8111156164fc575f80fd5b60208301915083602082850101111561644c575f80fd5b5f805f805f8086880361012081121561652a575f80fd5b60a0811215616537575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff8082111561655c575f80fd5b6165688a838b016162d7565b955060e089013591508082111561657d575f80fd5b6165898a838b016162d7565b945061010089013591508082111561659f575f80fd5b506165ac89828a016164d5565b979a9699509497509295939492505050565b5f80602083850312156165cf575f80fd5b823567ffffffffffffffff8111156165e5575f80fd5b6165f18582860161640b565b90969095509350505050565b5f805f8060808587031215616610575f80fd5b61661985615f5b565b93506020850135925061662e60408601615f5b565b915061663c60608601615f5b565b905092959194509250565b5f805f60408486031215616659575f80fd5b833567ffffffffffffffff81111561666f575f80fd5b61667b868287016164d5565b909790965060209590950135949350505050565b5f80604083850312156166a0575f80fd5b823591506166b060208401615f5b565b90509250929050565b5f82516166ca818460208701615fc3565b9190910192915050565b5f602082840312156166e4575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82616726576167266166eb565b500690565b600181811c9082168061673f57607f821691505b602082108103616776577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156167ca576167ca61677c565b5092915050565b80820281158282048414176160575761605761677c565b67ffffffffffffffff8281168282160390808211156167ca576167ca61677c565b5f67ffffffffffffffff8083168181036168255761682561677c565b6001019392505050565b5f8261683d5761683d6166eb565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126166ca575f80fd5b5f606082360312156168b1575f80fd5b6040516060810167ffffffffffffffff82821081831117156168d5576168d56162aa565b8160405284359150808211156168e9575f80fd5b506168f6368286016162d7565b8252506020830135602082015261690f60408401615f5b565b604082015292915050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361694a5761694a61677c565b5060010190565b818103818111156160575761605761677c565b601f821115615bb0575f81815260208120601f850160051c8101602086101561698a5750805b601f850160051c820191505b818110156169a957828155600101616996565b505050505050565b815167ffffffffffffffff8111156169cb576169cb6162aa565b6169df816169d9845461672b565b84616964565b602080601f831160018114616a31575f84156169fb5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556169a9565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015616a7d57888601518255948401946001909101908401616a5e565b5085821015616ab957878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152616b3d606083018486616ac9565b9695505050505050565b808201808211156160575761605761677c565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f616b3d606083018486616ac9565b6103208101610300808584378201835f5b6001811015616bce578151835260209283019290910190600101616baf565b5050509392505050565b5f60208284031215616be8575f80fd5b81516160408161637e565b5f67ffffffffffffffff80841680616c0d57616c0d6166eb565b9216919091049291505056fea264697066735822122030d7e5b8e946812a9ca8fbe3f42e166f37589c6e0b9c47a75570b8bd2e1c9a8d64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610475575f3560e01c80638da5cb5b1161025d578063c754c7ed11610148578063e7a7ed02116100c3578063f14916d611610093578063f851a44011610079578063f851a44014610c8a578063f8b823e414610caa578063fe16564f14610cb3575f80fd5b8063f14916d614610c64578063f2fde38b14610c77575f80fd5b8063e7a7ed0214610bcd578063e8bf92ed14610bfd578063eaeb077b14610c24578063ed6b010414610c37575f80fd5b8063d2e129f911610118578063d939b315116100fe578063d939b31514610b8a578063dbc1697614610bb2578063e0d1744114610bba575f80fd5b8063d2e129f914610b64578063d8d1091b14610b77575f80fd5b8063c754c7ed14610acf578063c89e42df14610afb578063cfa8ed4714610b0e578063d02103ca14610b3d575f80fd5b8063adc879e9116101d8578063b6b0b097116101a8578063c00e0dc91161018e578063c00e0dc914610aa1578063c0cad30214610ab4578063c0ed84e014610ac7575f80fd5b8063b6b0b09714610a67578063ba58ae3914610a8e575f80fd5b8063adc879e914610999578063afd23cbe146109c0578063b4d63f58146109ee578063b4f77ea914610a54575f80fd5b80639b7967601161022d578063a066215c11610213578063a066215c1461094c578063a3c573eb1461095f578063ada8f91914610986575f80fd5b80639b796760146109265780639c9f3dfe14610939575f80fd5b80638da5cb5b146108da57806396dc3d39146108f857806399f5634e1461090b5780639aa972a314610913575f80fd5b80634a1a89a71161037d5780636ff512cc116102f8578063831c7ead116102c8578063841b24d7116102ae578063841b24d7146107f75780638449a79c146108275780638c3d7301146108d2575f80fd5b8063831c7ead1461075c578063837a473814610783575f80fd5b80636ff512cc1461071a578063715018a61461072d5780637215541a146107355780637fcb365314610748575f80fd5b8063542028d51161034d578063604691691161033357806360469169146106e0578063621dd411146106e85780636b8616ce146106fb575f80fd5b8063542028d5146106d05780635ec91958146106d8575f80fd5b80634a1a89a71461066b5780634a910e6a1461068b5780634e4877061461069e5780635392c5e0146106b1575f80fd5b8063298789831161040d578063383b3be8116103dd578063423fa856116103c3578063423fa8561461060f578063456052671461062f578063458c047714610657575f80fd5b8063383b3be8146105e9578063394218e9146105fc575f80fd5b806329878983146105835780632a9f208f146105af5780632b0006fa146105c35780632c1f816a146105d6575f80fd5b806315064c961161044857806315064c96146104fb5780631816b7e514610518578063220d78991461052b578063267822471461053e575f80fd5b80630a0d9fbe146104795780630eaa86ea146104b0578063107bf28c146104d157806310a01a72146104e6575b5f80fd5b606f5461049290610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6104c36104be366004615f72565b610cc6565b6040519081526020016104a7565b6104d9611196565b6040516104a7919061602e565b6104f96104f436600461605d565b611222565b005b606f546105089060ff1681565b60405190151581526020016104a7565b6104f96105263660046160ea565b6117d0565b6104d961053936600461610b565b6118e8565b607b5461055e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104a7565b60745461055e9068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6073546104929067ffffffffffffffff1681565b6104f96105d1366004616165565b611abe565b6104f96105e43660046161c9565b611c88565b6105086105f736600461623e565b611e90565b6104f961060a36600461623e565b611ee5565b6073546104929068010000000000000000900467ffffffffffffffff1681565b60735461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546104929067ffffffffffffffff1681565b6079546104929068010000000000000000900467ffffffffffffffff1681565b6104f961069936600461623e565b612069565b6104f96106ac36600461623e565b61211c565b6104c36106bf36600461623e565b60756020525f908152604090205481565b6104d96122a0565b6104f96122ad565b6104c36123ac565b6104f96106f6366004616165565b6123c1565b6104c361070936600461623e565b60716020525f908152604090205481565b6104f961072836600461627a565b61273f565b6104f9612814565b6104f961074336600461623e565b612827565b6074546104929067ffffffffffffffff1681565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b6107cb610791366004616293565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016104a7565b607954610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104c361083536600461638b565b845160209586012060408051808801989098528781019190915260608088019590955260c09390931b7fffffffffffffffff000000000000000000000000000000000000000000000000166080870152921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608885015290151560f81b609c8401528051808403607d018152609d9093019052815191012090565b6104f9612994565b60335473ffffffffffffffffffffffffffffffffffffffff1661055e565b6104f961090636600461623e565b612a60565b6104c3612aa3565b6104f96109213660046161c9565b612bf6565b6104f961093436600461623e565b612ca6565b6104f961094736600461623e565b612cf5565b6104f961095a36600461623e565b612e71565b61055e7f000000000000000000000000000000000000000000000000000000000000000081565b6104f961099436600461627a565b612f77565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b606f546109db906901000000000000000000900461ffff1681565b60405161ffff90911681526020016104a7565b610a2e6109fc36600461623e565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016104a7565b6104f9610a6236600461623e565b61303b565b61055e7f000000000000000000000000000000000000000000000000000000000000000081565b610508610a9c366004616293565b61304c565b6104f9610aaf366004616453565b6130d4565b6104f9610ac23660046164a3565b613888565b6104926138a0565b607b546104929074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9610b093660046164a3565b6138f3565b606f5461055e906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61055e7f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610b72366004616513565b613980565b6104f9610b853660046165be565b613ebe565b60795461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6104f961445a565b6104f9610bc83660046165fd565b61452e565b607354610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61055e7f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610c32366004616647565b6145bd565b607b54610508907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b6104f9610c7236600461627a565b6149ad565b6104f9610c8536600461627a565b614a7f565b607a5461055e9073ffffffffffffffffffffffffffffffffffffffff1681565b6104c360705481565b6104f9610cc136600461668f565b614b33565b5f805f610cd16138a0565b905067ffffffffffffffff881615610e9d5760795467ffffffffffffffff9081169089161115610dae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a4015b60405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614610e97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610da5565b50611035565b67ffffffffffffffff87165f90815260756020526040902054915081610f6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610da5565b8067ffffffffffffffff168767ffffffffffffffff161115611035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610da5565b8067ffffffffffffffff168667ffffffffffffffff16116110fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610da5565b5f61110c88888886896118e8565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161114091906166b9565b602060405180830381855afa15801561115b573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061117e91906166d4565b6111889190616718565b9a9950505050505050505050565b607780546111a39061672b565b80601f01602080910402602001604051908101604052809291908181526020018280546111cf9061672b565b801561121a5780601f106111f15761010080835404028352916020019161121a565b820191905f5260205f20905b8154815290600101906020018083116111fd57829003601f168201915b505050505081565b61122a614b55565b5f806112346138a0565b905067ffffffffffffffff8a16156113fb5760795467ffffffffffffffff908116908b16111561130c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a401610da5565b67ffffffffffffffff808b165f9081526078602052604090206002810154815490945090918b81166801000000000000000090920416146113f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610da5565b50611593565b67ffffffffffffffff89165f908152607560205260409020549150816114c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610da5565b8067ffffffffffffffff168967ffffffffffffffff161115611593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610da5565b8067ffffffffffffffff168867ffffffffffffffff161161165c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610da5565b5f61166a8a8a8a868b6118e8565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8c81169182179092555f90815260756020526040902089905560795491925016156116e757607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018990527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b15801561176c575f80fd5b505af115801561177e573d5f803e3d5ffd5b505060405189815233925067ffffffffffffffff8c1691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe9060200160405180910390a35050505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611821576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff16108061183a57506103ff8161ffff16115b15611871576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f81815260726020526040808220549388168252902054606092911580159061191b575081155b15611952576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80611989576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119928461304c565b6119c8576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611b1b576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b29868686868686614bd6565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611ba357607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611c28575f80fd5b505af1158015611c3a573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611ce5576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cf487878787878787614f91565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611d6e57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611df3575f80fd5b505af1158015611e05573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611ed392700100000000000000000000000000000000909204811691166167a9565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611f36576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611f7d576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16611fec5760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611fec576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1906020016118dd565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461211057606f5460ff16156120d1576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120da81611e90565b612110576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612119816153c0565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461216d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156121b4576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661221f57607b5467ffffffffffffffff7401000000000000000000000000000000000000000090910481169082161061221f576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020016118dd565b607680546111a39061672b565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146122fe576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1661235a576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f60705460646123bc91906167d1565b905090565b606f5460ff16156123fe576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f90815260726020526040902060010154429261244a927801000000000000000000000000000000000000000000000000909104811691166167a9565b67ffffffffffffffff16111561248c576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e861249986866167e8565b67ffffffffffffffff1611156124db576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124e9868686868686614bd6565b6124f2846155cd565b607954700100000000000000000000000000000000900467ffffffffffffffff165f0361263357607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f908152607560205260409020839055607954161561259357607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612618575f80fd5b505af115801561262a573d5f803e3d5ffd5b50505050612701565b61263b6157a7565b6079805467ffffffffffffffff16905f61265483616809565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001611c78565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612790576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016118dd565b61281c614b55565b6128255f615852565b565b60335473ffffffffffffffffffffffffffffffffffffffff16331461298c575f61284f6138a0565b90508067ffffffffffffffff168267ffffffffffffffff161161289e576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000909104811690831611806128e3575067ffffffffffffffff8083165f9081526072602052604090206001015416155b1561291a576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916129489162093a8091166167a9565b67ffffffffffffffff16111561298a576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6121196158c8565b607b5473ffffffffffffffffffffffffffffffffffffffff1633146129e5576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b612a68614b55565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015612b2f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b5391906166d4565b90505f612b5e6138a0565b60735467ffffffffffffffff680100000000000000008204811691612bb691700100000000000000000000000000000000820481169178010000000000000000000000000000000000000000000000009004166167e8565b612bc091906167a9565b612bca91906167e8565b67ffffffffffffffff169050805f03612be5575f9250505090565b612bef818361682f565b9250505090565b606f5460ff1615612c33576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c4287878787878787614f91565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1612c9d6158c8565b50505050505050565b612cae614b55565b6073805467ffffffffffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612d46576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115612d8d576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16612df45760795467ffffffffffffffff700100000000000000000000000000000000909104811690821610612df4576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75906020016118dd565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612ec2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff161115612f09576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28906020016118dd565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612fc8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016118dd565b613043614b55565b612119816155cd565b5f67ffffffff0000000167ffffffffffffffff8316108015613083575067ffffffff00000001604083901c67ffffffffffffffff16105b80156130a4575067ffffffff00000001608083901c67ffffffffffffffff16105b80156130bb575067ffffffff0000000160c083901c105b156130c857506001919050565b505f919050565b919050565b606f5460ff1615613111576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314613171576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f8190036131ac576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156131e8576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561324d575f80fd5b505af115801561325f573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132f191906166d4565b60735467ffffffffffffffff68010000000000000000820481165f818152607260205260408120549495504294919370010000000000000000000000000000000090049092169182905b87811015613647575f8b8b8381811061335657613356616842565b9050602002810190613368919061686f565b613371906168a1565b8051805160209091012060408201519192509067ffffffffffffffff1615613562578561339d81616809565b9650505f81836020015184604001516040516020016133f493929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f9081526071909352912054909150811461347c576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015181519384018a905290830185905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528d901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201527f0100000000000000000000000000000000000000000000000000000000000000609c820152609d0160405160208183030381529060405280519060200120955060715f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550613632565b8151516201d4c010156135a1576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018b905260c08a901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528c901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c820152609d016040516020818303038152906040528051906020012094505b5050808061363f9061691a565b91505061333b565b5061365287856167a9565b60735490945067ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690841611156136bb576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516060810182528381524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528b86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090931692909217948416830294909417905582547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff1693029290921790558790828116908516146137ed5761378f82856167e8565b6137a39067ffffffffffffffff1682616951565b607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff88160217905590505b61383f33308360705461380091906167d1565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692919061594b565b6138476157a7565b60405167ffffffffffffffff8616907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce905f90a25050505050505050505050565b613890614b55565b607761389c82826169b1565b5050565b6079545f9067ffffffffffffffff16156138e2575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613944576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607661395082826169b1565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516118dd919061602e565b5f54610100900460ff161580801561399e57505f54600160ff909116105b806139b75750303b1580156139b757505f5460ff166001145b613a43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610da5565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015613a9f575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b613aac602088018861627a565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055613b01604088016020890161627a565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055613b66608088016060890161627a565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076613bf086826169b1565b506077613bfd85826169b1565b5062093a80613c126060890160408a0161623e565b67ffffffffffffffff161115613c54576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613c64606088016040890161623e565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80613cc660a0890160808a0161623e565b67ffffffffffffffff161115613d08576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d1860a088016080890161623e565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613df7615a2d565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f00000000000000000000000000000000000000000000000000000000000000008585604051613e4c9493929190616b10565b60405180910390a18015612c9d575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613f1b576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615613f58576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613f93576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115613fcf576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff7801000000000000000000000000000000000000000000000000820481169161401a918491700100000000000000000000000000000000900416616b47565b1115614052576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b84811015614321575f8787838181106140b0576140b0616842565b90506020028101906140c2919061686f565b6140cb906168a1565b9050836140d781616809565b825180516020918201208185015160408087015190519499509194505f936141389386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146141c0576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f908152607160205260408120556141e4600189616951565b84036142535742607b60149054906101000a900467ffffffffffffffff16846040015161421191906167a9565b67ffffffffffffffff161115614253576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602083810151604080860151815193840189905290830185905260608084019290925260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201527f0100000000000000000000000000000000000000000000000000000000000000609c820152609d0160405160208183030381529060405280519060200120945050505080806143199061691a565b915050614095565b5061432c84846167a9565b6040805160608101825283815267ffffffffffffffff428116602080840191825260738054680100000000000000009081900485168688019081528589165f8181526072909552888520975188559451600190970180549151871683027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921697871697909717179095558054938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff958402959095167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff9094169390931793909317909155915192955090917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146144ab576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b158015614510575f80fd5b505af1158015614522573d5f803e3d5ffd5b50505050612825615acc565b614536614b55565b6040805160608101825293845267ffffffffffffffff92831660208086019182529284168583019081529584165f908152607290935291209251835551600190920180549351821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169290911691909117919091179055565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561461a576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614657576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6146606123ac565b90508181111561469c576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113888311156146d8576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61471a73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308461594b565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015614784573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147a891906166d4565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff169060186147e283616809565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051614819929190616b5a565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303614947576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26149a6565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9318233888860405161499d9493929190616b69565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146149fe576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca906020016118dd565b614a87614b55565b73ffffffffffffffffffffffffffffffffffffffff8116614b2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610da5565b61211981615852565b614b3b614b55565b67ffffffffffffffff165f90815260756020526040902055565b60335473ffffffffffffffffffffffffffffffffffffffff163314612825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610da5565b5f80614be06138a0565b905067ffffffffffffffff881615614caf5760795467ffffffffffffffff9081169089161115614c3c576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614614ca9576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614d4f565b67ffffffffffffffff87165f90815260756020526040902054915081614d01576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115614d4f576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611614d9c576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f614daa88888886896118e8565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051614dde91906166b9565b602060405180830381855afa158015614df9573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614e1c91906166d4565b614e269190616718565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91614ea891899190600401616b9e565b602060405180830381865afa158015614ec3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ee79190616bd8565b614f1d576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f8533614f2b858b6167e8565b67ffffffffffffffff16614f3d612aa3565b614f4791906167d1565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190615b5a565b50505050505050505050565b5f67ffffffffffffffff88161561505d5760795467ffffffffffffffff9081169089161115614fec576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614615057576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506150f8565b5067ffffffffffffffff85165f90815260756020526040902054806150ae576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff90811690871611156150f8576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff908116908816118061512a57508767ffffffffffffffff168767ffffffffffffffff1611155b80615151575060795467ffffffffffffffff68010000000000000000909104811690881611155b15615188576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f908152607860205260409020546801000000000000000090048116908616146151ea576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6151f887878785886118e8565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161522c91906166b9565b602060405180830381855afa158015615247573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061526a91906166d4565b6152749190616718565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916152f691889190600401616b9e565b602060405180830381865afa158015615311573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906153359190616bd8565b61536b576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614f85576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff6801000000000000000090910481169082161115806153fa575060795467ffffffffffffffff908116908216115b15615431576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b15801561555f575f80fd5b505af1158015615571573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e84600201546040516155c091815260200190565b60405180910390a3505050565b5f6155d66138a0565b9050815f806155e584846167e8565b606f5467ffffffffffffffff91821692505f916156089161010090041642616951565b90505b8467ffffffffffffffff168467ffffffffffffffff16146156925767ffffffffffffffff8085165f908152607260205260409020600181015490911682101561567057600181015468010000000000000000900467ffffffffffffffff16945061568c565b61567a86866167e8565b67ffffffffffffffff16935050615692565b5061560b565b5f61569d8484616951565b9050838110156156f457808403600c81116156b857806156bb565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a60705402816156ea576156ea6166eb565b0460705550615763565b838103600c81116157055780615708565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a7640000028161573e5761573e6166eb565b04905080607054670de0b6b3a7640000028161575c5761575c6166eb565b0460705550505b683635c9adc5dea00000607054111561578857683635c9adc5dea00000607055612c9d565b633b9aca006070541015612c9d57633b9aca0060705550505050505050565b60795467ffffffffffffffff680100000000000000008204811691161115612825576079545f906157ef9068010000000000000000900467ffffffffffffffff1660016167a9565b90506157fa81611e90565b15612119576079545f9060029061581c90849067ffffffffffffffff166167e8565b6158269190616bf3565b61583090836167a9565b905061583b81611e90565b156158495761389c816153c0565b61389c826153c0565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561592d575f80fd5b505af115801561593f573d5f803e3d5ffd5b50505050612825615bb5565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052615a279085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152615c47565b50505050565b5f54610100900460ff16615ac3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610da5565b61282533615852565b606f5460ff16615b08576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052615bb09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016159a5565b505050565b606f5460ff1615615bf2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f615ca8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615d529092919063ffffffff16565b805190915015615bb05780806020019051810190615cc69190616bd8565b615bb0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610da5565b6060615d6084845f85615d68565b949350505050565b606082471015615dfa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610da5565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051615e2291906166b9565b5f6040518083038185875af1925050503d805f8114615e5c576040519150601f19603f3d011682016040523d82523d5f602084013e615e61565b606091505b5091509150615e7287838387615e7d565b979650505050505050565b60608315615f125782515f03615f0b5773ffffffffffffffffffffffffffffffffffffffff85163b615f0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610da5565b5081615d60565b615d608383815115615f275781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da5919061602e565b803567ffffffffffffffff811681146130cf575f80fd5b5f805f805f60a08688031215615f86575f80fd5b615f8f86615f5b565b9450615f9d60208701615f5b565b9350615fab60408701615f5b565b94979396509394606081013594506080013592915050565b5f5b83811015615fdd578181015183820152602001615fc5565b50505f910152565b5f8151808452615ffc816020860160208601615fc3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6160406020830184615fe5565b9392505050565b8060408101831015616057575f80fd5b92915050565b5f805f805f805f806101a0898b031215616075575f80fd5b61607e89615f5b565b975061608c60208a01615f5b565b965061609a60408a01615f5b565b955060608901359450608089013593506160b78a60a08b01616047565b925061016089018a8111156160ca575f80fd5b60e08a0192506160da8b82616047565b9150509295985092959890939650565b5f602082840312156160fa575f80fd5b813561ffff81168114616040575f80fd5b5f805f805f60a0868803121561611f575f80fd5b61612886615f5b565b945061613660208701615f5b565b94979496505050506040830135926060810135926080909101359150565b806103008101831015616057575f80fd5b5f805f805f806103a0878903121561617b575f80fd5b61618487615f5b565b955061619260208801615f5b565b94506161a060408801615f5b565b935060608701359250608087013591506161bd8860a08901616154565b90509295509295509295565b5f805f805f805f6103c0888a0312156161e0575f80fd5b6161e988615f5b565b96506161f760208901615f5b565b955061620560408901615f5b565b945061621360608901615f5b565b93506080880135925060a088013591506162308960c08a01616154565b905092959891949750929550565b5f6020828403121561624e575f80fd5b61604082615f5b565b803573ffffffffffffffffffffffffffffffffffffffff811681146130cf575f80fd5b5f6020828403121561628a575f80fd5b61604082616257565b5f602082840312156162a3575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126162e6575f80fd5b813567ffffffffffffffff80821115616301576163016162aa565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715616347576163476162aa565b8160405283815286602085880101111561635f575f80fd5b836020870160208301375f602085830101528094505050505092915050565b8015158114612119575f80fd5b5f805f805f8060c087890312156163a0575f80fd5b86359550602087013567ffffffffffffffff8111156163bd575f80fd5b6163c989828a016162d7565b955050604087013593506163df60608801615f5b565b92506163ed60808801616257565b915060a08701356163fd8161637e565b809150509295509295509295565b5f8083601f84011261641b575f80fd5b50813567ffffffffffffffff811115616432575f80fd5b6020830191508360208260051b850101111561644c575f80fd5b9250929050565b5f805f60408486031215616465575f80fd5b833567ffffffffffffffff81111561647b575f80fd5b6164878682870161640b565b909450925061649a905060208501616257565b90509250925092565b5f602082840312156164b3575f80fd5b813567ffffffffffffffff8111156164c9575f80fd5b615d60848285016162d7565b5f8083601f8401126164e5575f80fd5b50813567ffffffffffffffff8111156164fc575f80fd5b60208301915083602082850101111561644c575f80fd5b5f805f805f8086880361012081121561652a575f80fd5b60a0811215616537575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff8082111561655c575f80fd5b6165688a838b016162d7565b955060e089013591508082111561657d575f80fd5b6165898a838b016162d7565b945061010089013591508082111561659f575f80fd5b506165ac89828a016164d5565b979a9699509497509295939492505050565b5f80602083850312156165cf575f80fd5b823567ffffffffffffffff8111156165e5575f80fd5b6165f18582860161640b565b90969095509350505050565b5f805f8060808587031215616610575f80fd5b61661985615f5b565b93506020850135925061662e60408601615f5b565b915061663c60608601615f5b565b905092959194509250565b5f805f60408486031215616659575f80fd5b833567ffffffffffffffff81111561666f575f80fd5b61667b868287016164d5565b909790965060209590950135949350505050565b5f80604083850312156166a0575f80fd5b823591506166b060208401615f5b565b90509250929050565b5f82516166ca818460208701615fc3565b9190910192915050565b5f602082840312156166e4575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82616726576167266166eb565b500690565b600181811c9082168061673f57607f821691505b602082108103616776577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156167ca576167ca61677c565b5092915050565b80820281158282048414176160575761605761677c565b67ffffffffffffffff8281168282160390808211156167ca576167ca61677c565b5f67ffffffffffffffff8083168181036168255761682561677c565b6001019392505050565b5f8261683d5761683d6166eb565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126166ca575f80fd5b5f606082360312156168b1575f80fd5b6040516060810167ffffffffffffffff82821081831117156168d5576168d56162aa565b8160405284359150808211156168e9575f80fd5b506168f6368286016162d7565b8252506020830135602082015261690f60408401615f5b565b604082015292915050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361694a5761694a61677c565b5060010190565b818103818111156160575761605761677c565b601f821115615bb0575f81815260208120601f850160051c8101602086101561698a5750805b601f850160051c820191505b818110156169a957828155600101616996565b505050505050565b815167ffffffffffffffff8111156169cb576169cb6162aa565b6169df816169d9845461672b565b84616964565b602080601f831160018114616a31575f84156169fb5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556169a9565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015616a7d57888601518255948401946001909101908401616a5e565b5085821015616ab957878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152616b3d606083018486616ac9565b9695505050505050565b808201808211156160575761605761677c565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f616b3d606083018486616ac9565b6103208101610300808584378201835f5b6001811015616bce578151835260209283019290910190600101616baf565b5050509392505050565b5f60208284031215616be8575f80fd5b81516160408161637e565b5f67ffffffffffffffff80841680616c0d57616c0d6166eb565b9216919091049291505056fea264697066735822122030d7e5b8e946812a9ca8fbe3f42e166f37589c6e0b9c47a75570b8bd2e1c9a8d64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMTimelock.json b/compiled-contracts/PolygonZkEVMTimelock.json index 701df5c31..1ae918d75 100644 --- a/compiled-contracts/PolygonZkEVMTimelock.json +++ b/compiled-contracts/PolygonZkEVMTimelock.json @@ -892,8 +892,8 @@ "type": "receive" } ], - "bytecode": "0x60a060405234801562000010575f80fd5b5060405162002c4d38038062002c4d833981016040819052620000339162000412565b84848484620000515f8051602062002bcd8339815191528062000232565b620000795f8051602062002bed8339815191525f8051602062002bcd83398151915262000232565b620000a15f8051602062002c0d8339815191525f8051602062002bcd83398151915262000232565b620000c95f8051602062002c2d8339815191525f8051602062002bcd83398151915262000232565b620000e35f8051602062002bcd833981519152306200027c565b6001600160a01b038116156200010d576200010d5f8051602062002bcd833981519152826200027c565b5f5b83518110156200019057620001555f8051602062002bed833981519152858381518110620001415762000141620004ad565b60200260200101516200027c60201b60201c565b6200017d5f8051602062002c2d833981519152858381518110620001415762000141620004ad565b6200018881620004c1565b90506200010f565b505f5b8251811015620001d857620001c55f8051602062002c0d833981519152848381518110620001415762000141620004ad565b620001d081620004c1565b905062000193565b506002849055604080515f8152602081018690527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1505050506001600160a01b031660805250620004e692505050565b5f82815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6200028882826200028c565b5050565b5f828152602081815260408083206001600160a01b038516845290915290205460ff1662000288575f828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620002e63390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b634e487b7160e01b5f52604160045260245ffd5b6001600160a01b038116811462000353575f80fd5b50565b805162000363816200033e565b919050565b5f82601f83011262000378575f80fd5b815160206001600160401b03808311156200039757620003976200032a565b8260051b604051601f19603f83011681018181108482111715620003bf57620003bf6200032a565b604052938452858101830193838101925087851115620003dd575f80fd5b83870191505b848210156200040757620003f78262000356565b83529183019190830190620003e3565b979650505050505050565b5f805f805f60a0868803121562000427575f80fd5b855160208701519095506001600160401b038082111562000446575f80fd5b6200045489838a0162000368565b955060408801519150808211156200046a575f80fd5b50620004798882890162000368565b93505060608601516200048c816200033e565b60808701519092506200049f816200033e565b809150509295509295909350565b634e487b7160e01b5f52603260045260245ffd5b5f60018201620004df57634e487b7160e01b5f52601160045260245ffd5b5060010190565b6080516126c06200050d5f395f818161040201528181611124015261116401526126c05ff3fe6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220d904e0b10230579952f8427a107aa4349f9a1f5799108d399b11e28b578463e464736f6c634300081400335f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63fd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783", - "deployedBytecode": "0x6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220d904e0b10230579952f8427a107aa4349f9a1f5799108d399b11e28b578463e464736f6c63430008140033", + "bytecode": "0x60a060405234801562000010575f80fd5b5060405162002c4d38038062002c4d833981016040819052620000339162000412565b84848484620000515f8051602062002bcd8339815191528062000232565b620000795f8051602062002bed8339815191525f8051602062002bcd83398151915262000232565b620000a15f8051602062002c0d8339815191525f8051602062002bcd83398151915262000232565b620000c95f8051602062002c2d8339815191525f8051602062002bcd83398151915262000232565b620000e35f8051602062002bcd833981519152306200027c565b6001600160a01b038116156200010d576200010d5f8051602062002bcd833981519152826200027c565b5f5b83518110156200019057620001555f8051602062002bed833981519152858381518110620001415762000141620004ad565b60200260200101516200027c60201b60201c565b6200017d5f8051602062002c2d833981519152858381518110620001415762000141620004ad565b6200018881620004c1565b90506200010f565b505f5b8251811015620001d857620001c55f8051602062002c0d833981519152848381518110620001415762000141620004ad565b620001d081620004c1565b905062000193565b506002849055604080515f8152602081018690527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1505050506001600160a01b031660805250620004e692505050565b5f82815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6200028882826200028c565b5050565b5f828152602081815260408083206001600160a01b038516845290915290205460ff1662000288575f828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620002e63390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b634e487b7160e01b5f52604160045260245ffd5b6001600160a01b038116811462000353575f80fd5b50565b805162000363816200033e565b919050565b5f82601f83011262000378575f80fd5b815160206001600160401b03808311156200039757620003976200032a565b8260051b604051601f19603f83011681018181108482111715620003bf57620003bf6200032a565b604052938452858101830193838101925087851115620003dd575f80fd5b83870191505b848210156200040757620003f78262000356565b83529183019190830190620003e3565b979650505050505050565b5f805f805f60a0868803121562000427575f80fd5b855160208701519095506001600160401b038082111562000446575f80fd5b6200045489838a0162000368565b955060408801519150808211156200046a575f80fd5b50620004798882890162000368565b93505060608601516200048c816200033e565b60808701519092506200049f816200033e565b809150509295509295909350565b634e487b7160e01b5f52603260045260245ffd5b5f60018201620004df57634e487b7160e01b5f52601160045260245ffd5b5060010190565b6080516126c06200050d5f395f818161040201528181611124015261116401526126c05ff3fe6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220a51e9c8ab40666965f2c6a426c31d35eef4ebd6fb765348033b8ae6b30f36d1664736f6c634300081400335f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63fd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783", + "deployedBytecode": "0x6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220a51e9c8ab40666965f2c6a426c31d35eef4ebd6fb765348033b8ae6b30f36d1664736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/contracts/interfaces/IPolygonRollupManager.sol b/contracts/interfaces/IPolygonRollupManager.sol index 1fe55c374..1a822406a 100644 --- a/contracts/interfaces/IPolygonRollupManager.sol +++ b/contracts/interfaces/IPolygonRollupManager.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.17; +pragma solidity 0.8.20; interface IPolygonRollupManager { /** diff --git a/contracts/lib/DepositContractLib.sol b/contracts/lib/DepositContractLib.sol index 27fdf45f8..c685e90df 100644 --- a/contracts/lib/DepositContractLib.sol +++ b/contracts/lib/DepositContractLib.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.17; +pragma solidity 0.8.20; /** * This contract will be used as a helper for all the sparse merkle tree related functions diff --git a/contracts/v2/PolygonStateManager.sol b/contracts/v2/PolygonStateManager.sol index 312e99665..b4d83e1e5 100644 --- a/contracts/v2/PolygonStateManager.sol +++ b/contracts/v2/PolygonStateManager.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.17; +pragma solidity 0.8.20; import "../interfaces/IPolygonRollupManager.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index 2eba146fe..5fa89b5c6 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -1,922 +1,921 @@ -// SPDX-License-Identifier: AGPL-3.0 - -pragma solidity 0.8.17; - -import "../lib/DepositContract.sol"; -import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; -import "../lib/TokenWrapped.sol"; -import "../interfaces/IBasePolygonZkEVMGlobalExitRoot.sol"; -import "../interfaces/IBridgeMessageReceiver.sol"; -import "../interfaces/IPolygonZkEVMBridge.sol"; -import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol"; -import "../lib/EmergencyManager.sol"; -import "../lib/GlobalExitRootLib.sol"; - -/** - * PolygonZkEVMBridge that will be deployed on both networks Ethereum and Polygon zkEVM - * Contract responsible to manage the token interactions with other networks - */ -contract PolygonZkEVMBridgeV2 is - DepositContract, - EmergencyManager, - IPolygonZkEVMBridge -{ - using SafeERC20Upgradeable for IERC20Upgradeable; - - // Wrapped Token information struct - struct TokenInformation { - uint32 originNetwork; - address originTokenAddress; - } - - // bytes4(keccak256(bytes("permit(address,address,uint256,uint256,uint8,bytes32,bytes32)"))); - bytes4 private constant _PERMIT_SIGNATURE = 0xd505accf; - - // bytes4(keccak256(bytes("permit(address,address,uint256,uint256,bool,uint8,bytes32,bytes32)"))); - bytes4 private constant _PERMIT_SIGNATURE_DAI = 0x8fcbaf0c; - - // Mainnet identifier - uint32 private constant _MAINNET_NETWORK_ID = 0; - - // ZkEVM identifier - uint32 private constant _ZKEVM_NETWORK_ID = 1; - - // Number of networks supported by the bridge - uint32 private constant _CURRENT_SUPPORTED_NETWORKS = 2; - - // Leaf type asset - uint8 private constant _LEAF_TYPE_ASSET = 0; - - // Leaf type message - uint8 private constant _LEAF_TYPE_MESSAGE = 1; - - // Nullifier offset - uint256 private constant _MAX_LEAFS_PER_NETWORK = 2 ** 32; - - // // Indicate where's the mainnet flag bit in the global index - // uint256 private constant _GLOBAL_INDEX_MAINNET_FLAG = 2 ** 64; - - // Network identifier - uint32 public networkID; - - // Global Exit Root address - IBasePolygonZkEVMGlobalExitRoot public globalExitRootManager; - - // Last updated deposit count to the global exit root manager - uint32 public lastUpdatedDepositCount; - - // Leaf index --> claimed bit map - mapping(uint256 => uint256) public claimedBitMap; - - // keccak256(OriginNetwork || tokenAddress) --> Wrapped token address - mapping(bytes32 => address) public tokenInfoToWrappedToken; - - // Wrapped token Address --> Origin token information - mapping(address => TokenInformation) public wrappedTokenToTokenInfo; - - // PolygonZkEVM address - address public polygonRollupManager; - - /** - * @param _networkID networkID - * @param _globalExitRootManager global exit root manager address - * @param _polygonRollupManager polygonZkEVM address - * @notice The value of `_polygonRollupManager` on the L2 deployment of the contract will be address(0), so - * emergency state is not possible for the L2 deployment of the bridge, intentionally - */ - function initialize( - uint32 _networkID, - IBasePolygonZkEVMGlobalExitRoot _globalExitRootManager, - address _polygonRollupManager - ) external virtual initializer { - networkID = _networkID; - globalExitRootManager = _globalExitRootManager; - polygonRollupManager = _polygonRollupManager; - - // Initialize OZ contracts - __ReentrancyGuard_init(); - } - - modifier onlyPolygonZkEVM() { - if (polygonRollupManager != msg.sender) { - revert OnlyPolygonZkEVM(); - } - _; - } - - /** - * @dev Emitted when bridge assets or messages to another network - */ - event BridgeEvent( - uint8 leafType, - uint32 originNetwork, - address originAddress, - uint32 destinationNetwork, - address destinationAddress, - uint256 amount, - bytes metadata, - uint32 depositCount - ); - - /** - * @dev Emitted when a claim is done from another network - */ - event ClaimEvent( - uint256 index, - uint32 originNetwork, - address originAddress, - address destinationAddress, - uint256 amount - ); - - /** - * @dev Emitted when a new wrapped token is created - */ - event NewWrappedToken( - uint32 originNetwork, - address originTokenAddress, - address wrappedTokenAddress, - bytes metadata - ); - - /** - * @notice Deposit add a new leaf to the merkle tree - * @param destinationNetwork Network destination - * @param destinationAddress Address destination - * @param amount Amount of tokens - * @param token Token address, 0 address is reserved for ether - * @param forceUpdateGlobalExitRoot Indicates if the new global exit root is updated or not - * @param permitData Raw data of the call `permit` of the token - */ - function bridgeAsset( - uint32 destinationNetwork, - address destinationAddress, - uint256 amount, - address token, - bool forceUpdateGlobalExitRoot, - bytes calldata permitData - ) public payable virtual ifNotEmergencyState nonReentrant { - if ( - destinationNetwork == networkID || - destinationNetwork >= _CURRENT_SUPPORTED_NETWORKS - ) { - revert DestinationNetworkInvalid(); - } - - address originTokenAddress; - uint32 originNetwork; - bytes memory metadata; - uint256 leafAmount = amount; - - if (token == address(0)) { - // Ether transfer - if (msg.value != amount) { - revert AmountDoesNotMatchMsgValue(); - } - - // Ether is treated as ether from mainnet - originNetwork = _MAINNET_NETWORK_ID; - } else { - // Check msg.value is 0 if tokens are bridged - if (msg.value != 0) { - revert MsgValueNotZero(); - } - - TokenInformation memory tokenInfo = wrappedTokenToTokenInfo[token]; - - if (tokenInfo.originTokenAddress != address(0)) { - // The token is a wrapped token from another network - - // Burn tokens - TokenWrapped(token).burn(msg.sender, amount); - - originTokenAddress = tokenInfo.originTokenAddress; - originNetwork = tokenInfo.originNetwork; - } else { - // Use permit if any - if (permitData.length != 0) { - _permit(token, amount, permitData); - } - - // In order to support fee tokens check the amount received, not the transferred - uint256 balanceBefore = IERC20Upgradeable(token).balanceOf( - address(this) - ); - IERC20Upgradeable(token).safeTransferFrom( - msg.sender, - address(this), - amount - ); - uint256 balanceAfter = IERC20Upgradeable(token).balanceOf( - address(this) - ); - - // Override leafAmount with the received amount - leafAmount = balanceAfter - balanceBefore; - - originTokenAddress = token; - originNetwork = networkID; - - // Encode metadata - metadata = abi.encode( - _safeName(token), - _safeSymbol(token), - _safeDecimals(token) - ); - } - } - - emit BridgeEvent( - _LEAF_TYPE_ASSET, - originNetwork, - originTokenAddress, - destinationNetwork, - destinationAddress, - leafAmount, - metadata, - uint32(depositCount) - ); - - _addLeaf( - getLeafValue( - _LEAF_TYPE_ASSET, - originNetwork, - originTokenAddress, - destinationNetwork, - destinationAddress, - leafAmount, - keccak256(metadata) - ) - ); - - // Update the new root to the global exit root manager if set by the user - if (forceUpdateGlobalExitRoot) { - _updateGlobalExitRoot(); - } - } - - /** - * @notice Bridge message and send ETH value - * @param destinationNetwork Network destination - * @param destinationAddress Address destination - * @param forceUpdateGlobalExitRoot Indicates if the new global exit root is updated or not - * @param metadata Message metadata - */ - function bridgeMessage( - uint32 destinationNetwork, - address destinationAddress, - bool forceUpdateGlobalExitRoot, - bytes calldata metadata - ) external payable ifNotEmergencyState { - if ( - destinationNetwork == networkID || - destinationNetwork >= _CURRENT_SUPPORTED_NETWORKS - ) { - revert DestinationNetworkInvalid(); - } - - emit BridgeEvent( - _LEAF_TYPE_MESSAGE, - networkID, - msg.sender, - destinationNetwork, - destinationAddress, - msg.value, - metadata, - uint32(depositCount) - ); - - _addLeaf( - getLeafValue( - _LEAF_TYPE_MESSAGE, - networkID, - msg.sender, - destinationNetwork, - destinationAddress, - msg.value, - keccak256(metadata) - ) - ); - - // Update the new root to the global exit root manager if set by the user - if (forceUpdateGlobalExitRoot) { - _updateGlobalExitRoot(); - } - } - - /** - * @notice Verify merkle proof and withdraw tokens/ether - * @param smtProof Smt proof - * @param globalIndex Global index: bool(isMainnet)||uint32(indexRollupRoot)||uint32(indexDepositLeaf) - * @param mainnetExitRoot Mainnet exit root - * @param rollupExitRoot Rollup exit root - * @param originNetwork Origin network - * @param originTokenAddress Origin token address, 0 address is reserved for ether - * @param destinationNetwork Network destination - * @param destinationAddress Address destination - * @param amount Amount of tokens - * @param metadata Abi encoded metadata if any, empty otherwise - */ - function claimAsset( - bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, - uint256 globalIndex, - bytes32 mainnetExitRoot, - bytes32 rollupExitRoot, - uint32 originNetwork, - address originTokenAddress, - uint32 destinationNetwork, - address destinationAddress, - uint256 amount, - bytes calldata metadata - ) external ifNotEmergencyState { - // Verify leaf exist and it does not have been claimed - _verifyLeaf( - smtProof, - globalIndex, - mainnetExitRoot, - rollupExitRoot, - originNetwork, - originTokenAddress, - destinationNetwork, - destinationAddress, - amount, - metadata, - _LEAF_TYPE_ASSET - ); - - // Transfer funds - if (originTokenAddress == address(0)) { - // Transfer ether - /* solhint-disable avoid-low-level-calls */ - (bool success, ) = destinationAddress.call{value: amount}( - new bytes(0) - ); - if (!success) { - revert EtherTransferFailed(); - } - } else { - // Transfer tokens - if (originNetwork == networkID) { - // The token is an ERC20 from this network - IERC20Upgradeable(originTokenAddress).safeTransfer( - destinationAddress, - amount - ); - } else { - // The tokens is not from this network - // Create a wrapper for the token if not exist yet - bytes32 tokenInfoHash = keccak256( - abi.encodePacked(originNetwork, originTokenAddress) - ); - address wrappedToken = tokenInfoToWrappedToken[tokenInfoHash]; - - if (wrappedToken == address(0)) { - // Get ERC20 metadata - ( - string memory name, - string memory symbol, - uint8 decimals - ) = abi.decode(metadata, (string, string, uint8)); - - // Create a new wrapped erc20 using create2 - TokenWrapped newWrappedToken = (new TokenWrapped){ - salt: tokenInfoHash - }(name, symbol, decimals); - - // Mint tokens for the destination address - newWrappedToken.mint(destinationAddress, amount); - - // Create mappings - tokenInfoToWrappedToken[tokenInfoHash] = address( - newWrappedToken - ); - - wrappedTokenToTokenInfo[ - address(newWrappedToken) - ] = TokenInformation(originNetwork, originTokenAddress); - - emit NewWrappedToken( - originNetwork, - originTokenAddress, - address(newWrappedToken), - metadata - ); - } else { - // Use the existing wrapped erc20 - TokenWrapped(wrappedToken).mint(destinationAddress, amount); - } - } - } - - emit ClaimEvent( - globalIndex, - originNetwork, - originTokenAddress, - destinationAddress, - amount - ); - } - - /** - * @notice Verify merkle proof and execute message - * If the receiving address is an EOA, the call will result as a success - * Which means that the amount of ether will be transferred correctly, but the message - * will not trigger any execution - * @param smtProof Smt proof - * @param globalIndex Index of the leaf - * @param mainnetExitRoot Mainnet exit root - * @param rollupExitRoot Rollup exit root - * @param originNetwork Origin network - * @param originAddress Origin address - * @param destinationNetwork Network destination - * @param destinationAddress Address destination - * @param amount message value - * @param metadata Abi encoded metadata if any, empty otherwise - */ - function claimMessage( - bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, - uint256 globalIndex, - bytes32 mainnetExitRoot, - bytes32 rollupExitRoot, - uint32 originNetwork, - address originAddress, - uint32 destinationNetwork, - address destinationAddress, - uint256 amount, - bytes calldata metadata - ) external ifNotEmergencyState { - // Verify leaf exist and it does not have been claimed - _verifyLeaf( - smtProof, - globalIndex, - mainnetExitRoot, - rollupExitRoot, - originNetwork, - originAddress, - destinationNetwork, - destinationAddress, - amount, - metadata, - _LEAF_TYPE_MESSAGE - ); - - // Execute message - // Transfer ether - /* solhint-disable avoid-low-level-calls */ - (bool success, ) = destinationAddress.call{value: amount}( - abi.encodeCall( - IBridgeMessageReceiver.onMessageReceived, - (originAddress, originNetwork, metadata) - ) - ); - if (!success) { - revert MessageFailed(); - } - - emit ClaimEvent( - globalIndex, - originNetwork, - originAddress, - destinationAddress, - amount - ); - } - - /** - * @notice Returns the precalculated address of a wrapper using the token information - * Note Updating the metadata of a token is not supported. - * Since the metadata has relevance in the address deployed, this function will not return a valid - * wrapped address if the metadata provided is not the original one. - * @param originNetwork Origin network - * @param originTokenAddress Origin token address, 0 address is reserved for ether - * @param name Name of the token - * @param symbol Symbol of the token - * @param decimals Decimals of the token - */ - function precalculatedWrapperAddress( - uint32 originNetwork, - address originTokenAddress, - string calldata name, - string calldata symbol, - uint8 decimals - ) external view returns (address) { - bytes32 salt = keccak256( - abi.encodePacked(originNetwork, originTokenAddress) - ); - - bytes32 hashCreate2 = keccak256( - abi.encodePacked( - bytes1(0xff), - address(this), - salt, - keccak256( - abi.encodePacked( - type(TokenWrapped).creationCode, - abi.encode(name, symbol, decimals) - ) - ) - ) - ); - - // last 20 bytes of hash to address - return address(uint160(uint256(hashCreate2))); - } - - /** - * @notice Returns the address of a wrapper using the token information if already exist - * @param originNetwork Origin network - * @param originTokenAddress Origin token address, 0 address is reserved for ether - */ - function getTokenWrappedAddress( - uint32 originNetwork, - address originTokenAddress - ) external view returns (address) { - return - tokenInfoToWrappedToken[ - keccak256(abi.encodePacked(originNetwork, originTokenAddress)) - ]; - } - - /** - * @notice Function to activate the emergency state - " Only can be called by the Polygon ZK-EVM in extreme situations - */ - function activateEmergencyState() external onlyPolygonZkEVM { - _activateEmergencyState(); - } - - /** - * @notice Function to deactivate the emergency state - " Only can be called by the Polygon ZK-EVM - */ - function deactivateEmergencyState() external onlyPolygonZkEVM { - _deactivateEmergencyState(); - } - - /** - * @notice Verify leaf and checks that it has not been claimed - * @param smtProof Smt proof - * @param globalIndex Index of the leaf - * @param mainnetExitRoot Mainnet exit root - * @param rollupExitRoot Rollup exit root - * @param originNetwork Origin network - * @param originAddress Origin address - * @param destinationNetwork Network destination - * @param destinationAddress Address destination - * @param amount Amount of tokens - * @param metadata Abi encoded metadata if any, empty otherwise - * @param leafType Leaf type --> [0] transfer Ether / ERC20 tokens, [1] message - */ - function _verifyLeaf( - bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, - uint256 globalIndex, - bytes32 mainnetExitRoot, - bytes32 rollupExitRoot, - uint32 originNetwork, - address originAddress, - uint32 destinationNetwork, - address destinationAddress, - uint256 amount, - bytes calldata metadata, - uint8 leafType - ) internal { - uint256 leafIndex; - - if (globalIndex & _GLOBAL_INDEX_MAINNET_FLAG == 0) { - // Rollup claim - - // Verify merkle proof using rollup exit root - claimRoot = rollupExitRoot; - if ( - !verifyMerkleProof( - getLeafValue( - leafType, - originNetwork, - originAddress, - destinationNetwork, - destinationAddress, - amount, - keccak256(metadata) - ), - smtProof, - index, - rollupExitRoot - ) - ) { - revert InvalidSmtProof(); - } - } else { - // mainnet claim - - // verify merkle proof using mainnet exit root - if ( - !verifyMerkleProof( - getLeafValue( - leafType, - originNetwork, - originAddress, - destinationNetwork, - destinationAddress, - amount, - keccak256(metadata) - ), - smtProof, - index, - mainnetExitRoot - ) - ) { - revert InvalidSmtProof(); - } - } - - // Set and check nullifier - _setAndCheckClaimed(leafIndex, originNetwork); - - // Check timestamp where the global exit root was set - uint256 timestampGlobalExitRoot = globalExitRootManager - .globalExitRootMap( - GlobalExitRootLib.calculateGlobalExitRoot( - mainnetExitRoot, - rollupExitRoot - ) - ); - - if (timestampGlobalExitRoot == 0) { - revert GlobalExitRootInvalid(); - } - - // Destination network must be networkID - if (destinationNetwork != networkID) { - revert DestinationNetworkInvalid(); - } - - bytes32 claimRoot; - if (networkID == _MAINNET_NETWORK_ID) { - // Verify merkle proof using rollup exit root - claimRoot = rollupExitRoot; - } else { - // Verify merkle proof using mainnet exit root - claimRoot = mainnetExitRoot; - } - } - - /** - * @notice Function to check if an index is claimed or not - * @param index Index - * @param originNetwork origin network - */ - function isClaimed( - uint32 index, - uint32 originNetwork - ) external view returns (bool) { - uint256 globalIndex; - - // For consistency with the previous setted nullifiers - if ( - networkID == _MAINNET_NETWORK_ID && - originNetwork == _ZKEVM_NETWORK_ID - ) { - globalIndex = uint256(index); - } else { - globalIndex = - uint256(index) + - uint256(originNetwork) * - _MAX_LEAFS_PER_NETWORK; - } - (uint256 wordPos, uint256 bitPos) = _bitmapPositions(globalIndex); - uint256 mask = (1 << bitPos); - return (claimedBitMap[wordPos] & mask) == mask; - } - - /** - * @notice Function to check that an index is not claimed and set it as claimed - * @param leafIndex Index - * @param originNetwork origin network - */ - function _setAndCheckClaimed( - uint256 leafIndex, - uint256 originNetwork - ) private { - uint256 globalIndex = leafIndex + - originNetwork * - _MAX_LEAFS_PER_NETWORK; - (uint256 wordPos, uint256 bitPos) = _bitmapPositions(globalIndex); - uint256 mask = 1 << bitPos; - uint256 flipped = claimedBitMap[wordPos] ^= mask; - if (flipped & mask == 0) { - revert AlreadyClaimed(); - } - } - - /** - * @notice Function to update the globalExitRoot if the last deposit is not submitted - */ - function updateGlobalExitRoot() external { - if (lastUpdatedDepositCount < depositCount) { - _updateGlobalExitRoot(); - } - } - - /** - * @notice Function to update the globalExitRoot - */ - function _updateGlobalExitRoot() internal { - lastUpdatedDepositCount = uint32(depositCount); - globalExitRootManager.updateExitRoot(getRoot()); - } - - /** - * @notice Function decode an index into a wordPos and bitPos - * @param index Index - */ - function _bitmapPositions( - uint256 index - ) private pure returns (uint256 wordPos, uint256 bitPos) { - wordPos = uint248(index >> 8); - bitPos = uint8(index); - } - - /** - * @notice Function to call token permit method of extended ERC20 - + @param token ERC20 token address - * @param amount Quantity that is expected to be allowed - * @param permitData Raw data of the call `permit` of the token - */ - function _permit( - address token, - uint256 amount, - bytes calldata permitData - ) internal { - bytes4 sig = bytes4(permitData[:4]); - if (sig == _PERMIT_SIGNATURE) { - ( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) = abi.decode( - permitData[4:], - ( - address, - address, - uint256, - uint256, - uint8, - bytes32, - bytes32 - ) - ); - if (owner != msg.sender) { - revert NotValidOwner(); - } - if (spender != address(this)) { - revert NotValidSpender(); - } - - if (value != amount) { - revert NotValidAmount(); - } - - // we call without checking the result, in case it fails and he doesn't have enough balance - // the following transferFrom should be fail. This prevents DoS attacks from using a signature - // before the smartcontract call - /* solhint-disable avoid-low-level-calls */ - address(token).call( - abi.encodeWithSelector( - _PERMIT_SIGNATURE, - owner, - spender, - value, - deadline, - v, - r, - s - ) - ); - } else { - if (sig != _PERMIT_SIGNATURE_DAI) { - revert NotValidSignature(); - } - - ( - address holder, - address spender, - uint256 nonce, - uint256 expiry, - bool allowed, - uint8 v, - bytes32 r, - bytes32 s - ) = abi.decode( - permitData[4:], - ( - address, - address, - uint256, - uint256, - bool, - uint8, - bytes32, - bytes32 - ) - ); - - if (holder != msg.sender) { - revert NotValidOwner(); - } - - if (spender != address(this)) { - revert NotValidSpender(); - } - - // we call without checking the result, in case it fails and he doesn't have enough balance - // the following transferFrom should be fail. This prevents DoS attacks from using a signature - // before the smartcontract call - /* solhint-disable avoid-low-level-calls */ - address(token).call( - abi.encodeWithSelector( - _PERMIT_SIGNATURE_DAI, - holder, - spender, - nonce, - expiry, - allowed, - v, - r, - s - ) - ); - } - } - - // Helpers to safely get the metadata from a token, inspired by https://github.com/traderjoe-xyz/joe-core/blob/main/contracts/MasterChefJoeV3.sol#L55-L95 - - /** - * @notice Provides a safe ERC20.symbol version which returns 'NO_SYMBOL' as fallback string - * @param token The address of the ERC-20 token contract - */ - function _safeSymbol(address token) internal view returns (string memory) { - (bool success, bytes memory data) = address(token).staticcall( - abi.encodeCall(IERC20MetadataUpgradeable.symbol, ()) - ); - return success ? _returnDataToString(data) : "NO_SYMBOL"; - } - - /** - * @notice Provides a safe ERC20.name version which returns 'NO_NAME' as fallback string. - * @param token The address of the ERC-20 token contract. - */ - function _safeName(address token) internal view returns (string memory) { - (bool success, bytes memory data) = address(token).staticcall( - abi.encodeCall(IERC20MetadataUpgradeable.name, ()) - ); - return success ? _returnDataToString(data) : "NO_NAME"; - } - - /** - * @notice Provides a safe ERC20.decimals version which returns '18' as fallback value. - * Note Tokens with (decimals > 255) are not supported - * @param token The address of the ERC-20 token contract - */ - function _safeDecimals(address token) internal view returns (uint8) { - (bool success, bytes memory data) = address(token).staticcall( - abi.encodeCall(IERC20MetadataUpgradeable.decimals, ()) - ); - return success && data.length == 32 ? abi.decode(data, (uint8)) : 18; - } - - /** - * @notice Function to convert returned data to string - * returns 'NOT_VALID_ENCODING' as fallback value. - * @param data returned data - */ - function _returnDataToString( - bytes memory data - ) internal pure returns (string memory) { - if (data.length >= 64) { - return abi.decode(data, (string)); - } else if (data.length == 32) { - // Since the strings on bytes32 are encoded left-right, check the first zero in the data - uint256 nonZeroBytes; - while (nonZeroBytes < 32 && data[nonZeroBytes] != 0) { - nonZeroBytes++; - } - - // If the first one is 0, we do not handle the encoding - if (nonZeroBytes == 0) { - return "NOT_VALID_ENCODING"; - } - // Create a byte array with nonZeroBytes length - bytes memory bytesArray = new bytes(nonZeroBytes); - for (uint256 i = 0; i < nonZeroBytes; i++) { - bytesArray[i] = data[i]; - } - return string(bytesArray); - } else { - return "NOT_VALID_ENCODING"; - } - } -} +// // SPDX-License-Identifier: AGPL-3.0 + +// pragma solidity 0.8.20; + +// import "../lib/DepositContract.sol"; +// import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; +// import "../lib/TokenWrapped.sol"; +// import "../interfaces/IBasePolygonZkEVMGlobalExitRoot.sol"; +// import "../interfaces/IBridgeMessageReceiver.sol"; +// import "../interfaces/IPolygonZkEVMBridge.sol"; +// import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol"; +// import "../lib/EmergencyManager.sol"; +// import "../lib/GlobalExitRootLib.sol"; + +// /** +// * PolygonZkEVMBridge that will be deployed on both networks Ethereum and Polygon zkEVM +// * Contract responsible to manage the token interactions with other networks +// */ +// contract PolygonZkEVMBridgeV2 is +// DepositContract, +// EmergencyManager, +// IPolygonZkEVMBridge +// { +// using SafeERC20Upgradeable for IERC20Upgradeable; + +// // Wrapped Token information struct +// struct TokenInformation { +// uint32 originNetwork; +// address originTokenAddress; +// } + +// // bytes4(keccak256(bytes("permit(address,address,uint256,uint256,uint8,bytes32,bytes32)"))); +// bytes4 private constant _PERMIT_SIGNATURE = 0xd505accf; + +// // bytes4(keccak256(bytes("permit(address,address,uint256,uint256,bool,uint8,bytes32,bytes32)"))); +// bytes4 private constant _PERMIT_SIGNATURE_DAI = 0x8fcbaf0c; + +// // Mainnet identifier +// uint32 private constant _MAINNET_NETWORK_ID = 0; + +// // ZkEVM identifier +// uint32 private constant _ZKEVM_NETWORK_ID = 1; + +// // Number of networks supported by the bridge +// uint32 private constant _CURRENT_SUPPORTED_NETWORKS = 2; + +// // Leaf type asset +// uint8 private constant _LEAF_TYPE_ASSET = 0; + +// // Leaf type message +// uint8 private constant _LEAF_TYPE_MESSAGE = 1; + +// // Nullifier offset +// uint256 private constant _MAX_LEAFS_PER_NETWORK = 2 ** 32; + +// // // Indicate where's the mainnet flag bit in the global index +// uint256 private constant _GLOBAL_INDEX_MAINNET_FLAG = 2 ** 64; + +// // Network identifier +// uint32 public networkID; + +// // Global Exit Root address +// IBasePolygonZkEVMGlobalExitRoot public globalExitRootManager; + +// // Last updated deposit count to the global exit root manager +// uint32 public lastUpdatedDepositCount; + +// // Leaf index --> claimed bit map +// mapping(uint256 => uint256) public claimedBitMap; + +// // keccak256(OriginNetwork || tokenAddress) --> Wrapped token address +// mapping(bytes32 => address) public tokenInfoToWrappedToken; + +// // Wrapped token Address --> Origin token information +// mapping(address => TokenInformation) public wrappedTokenToTokenInfo; + +// // PolygonZkEVM address +// address public polygonRollupManager; + +// /** +// * @param _networkID networkID +// * @param _globalExitRootManager global exit root manager address +// * @param _polygonRollupManager polygonZkEVM address +// * @notice The value of `_polygonRollupManager` on the L2 deployment of the contract will be address(0), so +// * emergency state is not possible for the L2 deployment of the bridge, intentionally +// */ +// function initialize( +// uint32 _networkID, +// IBasePolygonZkEVMGlobalExitRoot _globalExitRootManager, +// address _polygonRollupManager +// ) external virtual initializer { +// networkID = _networkID; +// globalExitRootManager = _globalExitRootManager; +// polygonRollupManager = _polygonRollupManager; + +// // Initialize OZ contracts +// __ReentrancyGuard_init(); +// } + +// modifier onlyPolygonZkEVM() { +// if (polygonRollupManager != msg.sender) { +// revert OnlyPolygonZkEVM(); +// } +// _; +// } + +// /** +// * @dev Emitted when bridge assets or messages to another network +// */ +// event BridgeEvent( +// uint8 leafType, +// uint32 originNetwork, +// address originAddress, +// uint32 destinationNetwork, +// address destinationAddress, +// uint256 amount, +// bytes metadata, +// uint32 depositCount +// ); + +// /** +// * @dev Emitted when a claim is done from another network +// */ +// event ClaimEvent( +// uint256 index, +// uint32 originNetwork, +// address originAddress, +// address destinationAddress, +// uint256 amount +// ); + +// /** +// * @dev Emitted when a new wrapped token is created +// */ +// event NewWrappedToken( +// uint32 originNetwork, +// address originTokenAddress, +// address wrappedTokenAddress, +// bytes metadata +// ); + +// /** +// * @notice Deposit add a new leaf to the merkle tree +// * @param destinationNetwork Network destination +// * @param destinationAddress Address destination +// * @param amount Amount of tokens +// * @param token Token address, 0 address is reserved for ether +// * @param forceUpdateGlobalExitRoot Indicates if the new global exit root is updated or not +// * @param permitData Raw data of the call `permit` of the token +// */ +// function bridgeAsset( +// uint32 destinationNetwork, +// address destinationAddress, +// uint256 amount, +// address token, +// bool forceUpdateGlobalExitRoot, +// bytes calldata permitData +// ) public payable virtual ifNotEmergencyState nonReentrant { +// if ( +// destinationNetwork == networkID || +// destinationNetwork >= _CURRENT_SUPPORTED_NETWORKS +// ) { +// revert DestinationNetworkInvalid(); +// } + +// address originTokenAddress; +// uint32 originNetwork; +// bytes memory metadata; +// uint256 leafAmount = amount; + +// if (token == address(0)) { +// // Ether transfer +// if (msg.value != amount) { +// revert AmountDoesNotMatchMsgValue(); +// } + +// // Ether is treated as ether from mainnet +// originNetwork = _MAINNET_NETWORK_ID; +// } else { +// // Check msg.value is 0 if tokens are bridged +// if (msg.value != 0) { +// revert MsgValueNotZero(); +// } + +// TokenInformation memory tokenInfo = wrappedTokenToTokenInfo[token]; + +// if (tokenInfo.originTokenAddress != address(0)) { +// // The token is a wrapped token from another network + +// // Burn tokens +// TokenWrapped(token).burn(msg.sender, amount); + +// originTokenAddress = tokenInfo.originTokenAddress; +// originNetwork = tokenInfo.originNetwork; +// } else { +// // Use permit if any +// if (permitData.length != 0) { +// _permit(token, amount, permitData); +// } + +// // In order to support fee tokens check the amount received, not the transferred +// uint256 balanceBefore = IERC20Upgradeable(token).balanceOf( +// address(this) +// ); +// IERC20Upgradeable(token).safeTransferFrom( +// msg.sender, +// address(this), +// amount +// ); +// uint256 balanceAfter = IERC20Upgradeable(token).balanceOf( +// address(this) +// ); + +// // Override leafAmount with the received amount +// leafAmount = balanceAfter - balanceBefore; + +// originTokenAddress = token; +// originNetwork = networkID; + +// // Encode metadata +// metadata = abi.encode( +// _safeName(token), +// _safeSymbol(token), +// _safeDecimals(token) +// ); +// } +// } + +// emit BridgeEvent( +// _LEAF_TYPE_ASSET, +// originNetwork, +// originTokenAddress, +// destinationNetwork, +// destinationAddress, +// leafAmount, +// metadata, +// uint32(depositCount) +// ); + +// _addLeaf( +// getLeafValue( +// _LEAF_TYPE_ASSET, +// originNetwork, +// originTokenAddress, +// destinationNetwork, +// destinationAddress, +// leafAmount, +// keccak256(metadata) +// ) +// ); + +// // Update the new root to the global exit root manager if set by the user +// if (forceUpdateGlobalExitRoot) { +// _updateGlobalExitRoot(); +// } +// } + +// /** +// * @notice Bridge message and send ETH value +// * @param destinationNetwork Network destination +// * @param destinationAddress Address destination +// * @param forceUpdateGlobalExitRoot Indicates if the new global exit root is updated or not +// * @param metadata Message metadata +// */ +// function bridgeMessage( +// uint32 destinationNetwork, +// address destinationAddress, +// bool forceUpdateGlobalExitRoot, +// bytes calldata metadata +// ) external payable ifNotEmergencyState { +// if ( +// destinationNetwork == networkID || +// destinationNetwork >= _CURRENT_SUPPORTED_NETWORKS +// ) { +// revert DestinationNetworkInvalid(); +// } + +// emit BridgeEvent( +// _LEAF_TYPE_MESSAGE, +// networkID, +// msg.sender, +// destinationNetwork, +// destinationAddress, +// msg.value, +// metadata, +// uint32(depositCount) +// ); + +// _addLeaf( +// getLeafValue( +// _LEAF_TYPE_MESSAGE, +// networkID, +// msg.sender, +// destinationNetwork, +// destinationAddress, +// msg.value, +// keccak256(metadata) +// ) +// ); + +// // Update the new root to the global exit root manager if set by the user +// if (forceUpdateGlobalExitRoot) { +// _updateGlobalExitRoot(); +// } +// } + +// /** +// * @notice Verify merkle proof and withdraw tokens/ether +// * @param smtProof Smt proof +// * @param globalIndex Global index: bool(isMainnet)||uint32(indexRollupRoot)||uint32(indexDepositLeaf) +// * @param mainnetExitRoot Mainnet exit root +// * @param rollupExitRoot Rollup exit root +// * @param originNetwork Origin network +// * @param originTokenAddress Origin token address, 0 address is reserved for ether +// * @param destinationNetwork Network destination +// * @param destinationAddress Address destination +// * @param amount Amount of tokens +// * @param metadata Abi encoded metadata if any, empty otherwise +// */ +// function claimAsset( +// bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, +// uint256 globalIndex, +// bytes32 mainnetExitRoot, +// bytes32 rollupExitRoot, +// uint32 originNetwork, +// address originTokenAddress, +// uint32 destinationNetwork, +// address destinationAddress, +// uint256 amount, +// bytes calldata metadata +// ) external ifNotEmergencyState { +// // Verify leaf exist and it does not have been claimed +// _verifyLeaf( +// smtProof, +// globalIndex, +// mainnetExitRoot, +// rollupExitRoot, +// originNetwork, +// originTokenAddress, +// destinationNetwork, +// destinationAddress, +// amount, +// metadata, +// _LEAF_TYPE_ASSET +// ); + +// // Transfer funds +// if (originTokenAddress == address(0)) { +// // Transfer ether +// /* solhint-disable avoid-low-level-calls */ +// (bool success, ) = destinationAddress.call{value: amount}( +// new bytes(0) +// ); +// if (!success) { +// revert EtherTransferFailed(); +// } +// } else { +// // Transfer tokens +// if (originNetwork == networkID) { +// // The token is an ERC20 from this network +// IERC20Upgradeable(originTokenAddress).safeTransfer( +// destinationAddress, +// amount +// ); +// } else { +// // The tokens is not from this network +// // Create a wrapper for the token if not exist yet +// bytes32 tokenInfoHash = keccak256( +// abi.encodePacked(originNetwork, originTokenAddress) +// ); +// address wrappedToken = tokenInfoToWrappedToken[tokenInfoHash]; + +// if (wrappedToken == address(0)) { +// // Get ERC20 metadata +// ( +// string memory name, +// string memory symbol, +// uint8 decimals +// ) = abi.decode(metadata, (string, string, uint8)); + +// // Create a new wrapped erc20 using create2 +// TokenWrapped newWrappedToken = (new TokenWrapped){ +// salt: tokenInfoHash +// }(name, symbol, decimals); + +// // Mint tokens for the destination address +// newWrappedToken.mint(destinationAddress, amount); + +// // Create mappings +// tokenInfoToWrappedToken[tokenInfoHash] = address( +// newWrappedToken +// ); + +// wrappedTokenToTokenInfo[ +// address(newWrappedToken) +// ] = TokenInformation(originNetwork, originTokenAddress); + +// emit NewWrappedToken( +// originNetwork, +// originTokenAddress, +// address(newWrappedToken), +// metadata +// ); +// } else { +// // Use the existing wrapped erc20 +// TokenWrapped(wrappedToken).mint(destinationAddress, amount); +// } +// } +// } + +// emit ClaimEvent( +// globalIndex, +// originNetwork, +// originTokenAddress, +// destinationAddress, +// amount +// ); +// } + +// /** +// * @notice Verify merkle proof and execute message +// * If the receiving address is an EOA, the call will result as a success +// * Which means that the amount of ether will be transferred correctly, but the message +// * will not trigger any execution +// * @param smtProof Smt proof +// * @param globalIndex Index of the leaf +// * @param mainnetExitRoot Mainnet exit root +// * @param rollupExitRoot Rollup exit root +// * @param originNetwork Origin network +// * @param originAddress Origin address +// * @param destinationNetwork Network destination +// * @param destinationAddress Address destination +// * @param amount message value +// * @param metadata Abi encoded metadata if any, empty otherwise +// */ +// function claimMessage( +// bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, +// uint256 globalIndex, +// bytes32 mainnetExitRoot, +// bytes32 rollupExitRoot, +// uint32 originNetwork, +// address originAddress, +// uint32 destinationNetwork, +// address destinationAddress, +// uint256 amount, +// bytes calldata metadata +// ) external ifNotEmergencyState { +// // Verify leaf exist and it does not have been claimed +// _verifyLeaf( +// smtProof, +// globalIndex, +// mainnetExitRoot, +// rollupExitRoot, +// originNetwork, +// originAddress, +// destinationNetwork, +// destinationAddress, +// amount, +// metadata, +// _LEAF_TYPE_MESSAGE +// ); + +// // Execute message +// // Transfer ether +// /* solhint-disable avoid-low-level-calls */ +// (bool success, ) = destinationAddress.call{value: amount}( +// abi.encodeCall( +// IBridgeMessageReceiver.onMessageReceived, +// (originAddress, originNetwork, metadata) +// ) +// ); +// if (!success) { +// revert MessageFailed(); +// } + +// emit ClaimEvent( +// globalIndex, +// originNetwork, +// originAddress, +// destinationAddress, +// amount +// ); +// } + +// /** +// * @notice Returns the precalculated address of a wrapper using the token information +// * Note Updating the metadata of a token is not supported. +// * Since the metadata has relevance in the address deployed, this function will not return a valid +// * wrapped address if the metadata provided is not the original one. +// * @param originNetwork Origin network +// * @param originTokenAddress Origin token address, 0 address is reserved for ether +// * @param name Name of the token +// * @param symbol Symbol of the token +// * @param decimals Decimals of the token +// */ +// function precalculatedWrapperAddress( +// uint32 originNetwork, +// address originTokenAddress, +// string calldata name, +// string calldata symbol, +// uint8 decimals +// ) external view returns (address) { +// bytes32 salt = keccak256( +// abi.encodePacked(originNetwork, originTokenAddress) +// ); + +// bytes32 hashCreate2 = keccak256( +// abi.encodePacked( +// bytes1(0xff), +// address(this), +// salt, +// keccak256( +// abi.encodePacked( +// type(TokenWrapped).creationCode, +// abi.encode(name, symbol, decimals) +// ) +// ) +// ) +// ); + +// // last 20 bytes of hash to address +// return address(uint160(uint256(hashCreate2))); +// } + +// /** +// * @notice Returns the address of a wrapper using the token information if already exist +// * @param originNetwork Origin network +// * @param originTokenAddress Origin token address, 0 address is reserved for ether +// */ +// function getTokenWrappedAddress( +// uint32 originNetwork, +// address originTokenAddress +// ) external view returns (address) { +// return +// tokenInfoToWrappedToken[ +// keccak256(abi.encodePacked(originNetwork, originTokenAddress)) +// ]; +// } + +// /** +// * @notice Function to activate the emergency state +// " Only can be called by the Polygon ZK-EVM in extreme situations +// */ +// function activateEmergencyState() external onlyPolygonZkEVM { +// _activateEmergencyState(); +// } + +// /** +// * @notice Function to deactivate the emergency state +// " Only can be called by the Polygon ZK-EVM +// */ +// function deactivateEmergencyState() external onlyPolygonZkEVM { +// _deactivateEmergencyState(); +// } + +// /** +// * @notice Verify leaf and checks that it has not been claimed +// * @param smtProof Smt proof +// * @param globalIndex Index of the leaf +// * @param mainnetExitRoot Mainnet exit root +// * @param rollupExitRoot Rollup exit root +// * @param originNetwork Origin network +// * @param originAddress Origin address +// * @param destinationNetwork Network destination +// * @param destinationAddress Address destination +// * @param amount Amount of tokens +// * @param metadata Abi encoded metadata if any, empty otherwise +// * @param leafType Leaf type --> [0] transfer Ether / ERC20 tokens, [1] message +// */ +// function _verifyLeaf( +// bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, +// uint256 globalIndex, +// bytes32 mainnetExitRoot, +// bytes32 rollupExitRoot, +// uint32 originNetwork, +// address originAddress, +// uint32 destinationNetwork, +// address destinationAddress, +// uint256 amount, +// bytes calldata metadata, +// uint8 leafType +// ) internal { +// // Check timestamp where the global exit root was set +// uint256 timestampGlobalExitRoot = globalExitRootManager +// .globalExitRootMap( +// GlobalExitRootLib.calculateGlobalExitRoot( +// mainnetExitRoot, +// rollupExitRoot +// ) +// ); + +// if (timestampGlobalExitRoot == 0) { +// revert GlobalExitRootInvalid(); +// } + +// // Destination network must be networkID +// if (destinationNetwork != networkID) { +// revert DestinationNetworkInvalid(); +// } + +// uint32 leafIndex; +// bytes32 claimRoot; +// if (networkID == _MAINNET_NETWORK_ID) { +// // Verify merkle proof using rollup exit root +// claimRoot = rollupExitRoot; +// } else { +// // Verify merkle proof using mainnet exit root +// claimRoot = mainnetExitRoot; +// } + +// if (globalIndex & _GLOBAL_INDEX_MAINNET_FLAG == 0) { +// // Rollup claim + +// // Verify merkle proof using rollup exit root +// claimRoot = rollupExitRoot; +// if ( +// !verifyMerkleProof( +// getLeafValue( +// leafType, +// originNetwork, +// originAddress, +// destinationNetwork, +// destinationAddress, +// amount, +// keccak256(metadata) +// ), +// smtProof, +// leafIndex, +// rollupExitRoot +// ) +// ) { +// revert InvalidSmtProof(); +// } +// } else { +// // mainnet claim + +// // verify merkle proof using mainnet exit root +// if ( +// !verifyMerkleProof( +// getLeafValue( +// leafType, +// originNetwork, +// originAddress, +// destinationNetwork, +// destinationAddress, +// amount, +// keccak256(metadata) +// ), +// smtProof, +// leafIndex, +// mainnetExitRoot +// ) +// ) { +// revert InvalidSmtProof(); +// } +// } + +// // Set and check nullifier +// _setAndCheckClaimed(leafIndex, originNetwork); +// } + +// /** +// * @notice Function to check if an index is claimed or not +// * @param index Index +// * @param originNetwork origin network +// */ +// function isClaimed( +// uint32 index, +// uint32 originNetwork +// ) external view returns (bool) { +// uint256 globalIndex; + +// // For consistency with the previous setted nullifiers +// if ( +// networkID == _MAINNET_NETWORK_ID && +// originNetwork == _ZKEVM_NETWORK_ID +// ) { +// globalIndex = uint256(index); +// } else { +// globalIndex = +// uint256(index) + +// uint256(originNetwork) * +// _MAX_LEAFS_PER_NETWORK; +// } +// (uint256 wordPos, uint256 bitPos) = _bitmapPositions(globalIndex); +// uint256 mask = (1 << bitPos); +// return (claimedBitMap[wordPos] & mask) == mask; +// } + +// /** +// * @notice Function to check that an index is not claimed and set it as claimed +// * @param leafIndex Index +// * @param originNetwork origin network +// */ +// function _setAndCheckClaimed( +// uint256 leafIndex, +// uint256 originNetwork +// ) private { +// uint256 globalIndex = leafIndex + +// originNetwork * +// _MAX_LEAFS_PER_NETWORK; +// (uint256 wordPos, uint256 bitPos) = _bitmapPositions(globalIndex); +// uint256 mask = 1 << bitPos; +// uint256 flipped = claimedBitMap[wordPos] ^= mask; +// if (flipped & mask == 0) { +// revert AlreadyClaimed(); +// } +// } + +// /** +// * @notice Function to update the globalExitRoot if the last deposit is not submitted +// */ +// function updateGlobalExitRoot() external { +// if (lastUpdatedDepositCount < depositCount) { +// _updateGlobalExitRoot(); +// } +// } + +// /** +// * @notice Function to update the globalExitRoot +// */ +// function _updateGlobalExitRoot() internal { +// lastUpdatedDepositCount = uint32(depositCount); +// globalExitRootManager.updateExitRoot(getRoot()); +// } + +// /** +// * @notice Function decode an index into a wordPos and bitPos +// * @param index Index +// */ +// function _bitmapPositions( +// uint256 index +// ) private pure returns (uint256 wordPos, uint256 bitPos) { +// wordPos = uint248(index >> 8); +// bitPos = uint8(index); +// } + +// /** +// * @notice Function to call token permit method of extended ERC20 +// + @param token ERC20 token address +// * @param amount Quantity that is expected to be allowed +// * @param permitData Raw data of the call `permit` of the token +// */ +// function _permit( +// address token, +// uint256 amount, +// bytes calldata permitData +// ) internal { +// bytes4 sig = bytes4(permitData[:4]); +// if (sig == _PERMIT_SIGNATURE) { +// ( +// address owner, +// address spender, +// uint256 value, +// uint256 deadline, +// uint8 v, +// bytes32 r, +// bytes32 s +// ) = abi.decode( +// permitData[4:], +// ( +// address, +// address, +// uint256, +// uint256, +// uint8, +// bytes32, +// bytes32 +// ) +// ); +// if (owner != msg.sender) { +// revert NotValidOwner(); +// } +// if (spender != address(this)) { +// revert NotValidSpender(); +// } + +// if (value != amount) { +// revert NotValidAmount(); +// } + +// // we call without checking the result, in case it fails and he doesn't have enough balance +// // the following transferFrom should be fail. This prevents DoS attacks from using a signature +// // before the smartcontract call +// /* solhint-disable avoid-low-level-calls */ +// address(token).call( +// abi.encodeWithSelector( +// _PERMIT_SIGNATURE, +// owner, +// spender, +// value, +// deadline, +// v, +// r, +// s +// ) +// ); +// } else { +// if (sig != _PERMIT_SIGNATURE_DAI) { +// revert NotValidSignature(); +// } + +// ( +// address holder, +// address spender, +// uint256 nonce, +// uint256 expiry, +// bool allowed, +// uint8 v, +// bytes32 r, +// bytes32 s +// ) = abi.decode( +// permitData[4:], +// ( +// address, +// address, +// uint256, +// uint256, +// bool, +// uint8, +// bytes32, +// bytes32 +// ) +// ); + +// if (holder != msg.sender) { +// revert NotValidOwner(); +// } + +// if (spender != address(this)) { +// revert NotValidSpender(); +// } + +// // we call without checking the result, in case it fails and he doesn't have enough balance +// // the following transferFrom should be fail. This prevents DoS attacks from using a signature +// // before the smartcontract call +// /* solhint-disable avoid-low-level-calls */ +// address(token).call( +// abi.encodeWithSelector( +// _PERMIT_SIGNATURE_DAI, +// holder, +// spender, +// nonce, +// expiry, +// allowed, +// v, +// r, +// s +// ) +// ); +// } +// } + +// // Helpers to safely get the metadata from a token, inspired by https://github.com/traderjoe-xyz/joe-core/blob/main/contracts/MasterChefJoeV3.sol#L55-L95 + +// /** +// * @notice Provides a safe ERC20.symbol version which returns 'NO_SYMBOL' as fallback string +// * @param token The address of the ERC-20 token contract +// */ +// function _safeSymbol(address token) internal view returns (string memory) { +// (bool success, bytes memory data) = address(token).staticcall( +// abi.encodeCall(IERC20MetadataUpgradeable.symbol, ()) +// ); +// return success ? _returnDataToString(data) : "NO_SYMBOL"; +// } + +// /** +// * @notice Provides a safe ERC20.name version which returns 'NO_NAME' as fallback string. +// * @param token The address of the ERC-20 token contract. +// */ +// function _safeName(address token) internal view returns (string memory) { +// (bool success, bytes memory data) = address(token).staticcall( +// abi.encodeCall(IERC20MetadataUpgradeable.name, ()) +// ); +// return success ? _returnDataToString(data) : "NO_NAME"; +// } + +// /** +// * @notice Provides a safe ERC20.decimals version which returns '18' as fallback value. +// * Note Tokens with (decimals > 255) are not supported +// * @param token The address of the ERC-20 token contract +// */ +// function _safeDecimals(address token) internal view returns (uint8) { +// (bool success, bytes memory data) = address(token).staticcall( +// abi.encodeCall(IERC20MetadataUpgradeable.decimals, ()) +// ); +// return success && data.length == 32 ? abi.decode(data, (uint8)) : 18; +// } + +// /** +// * @notice Function to convert returned data to string +// * returns 'NOT_VALID_ENCODING' as fallback value. +// * @param data returned data +// */ +// function _returnDataToString( +// bytes memory data +// ) internal pure returns (string memory) { +// if (data.length >= 64) { +// return abi.decode(data, (string)); +// } else if (data.length == 32) { +// // Since the strings on bytes32 are encoded left-right, check the first zero in the data +// uint256 nonZeroBytes; +// while (nonZeroBytes < 32 && data[nonZeroBytes] != 0) { +// nonZeroBytes++; +// } + +// // If the first one is 0, we do not handle the encoding +// if (nonZeroBytes == 0) { +// return "NOT_VALID_ENCODING"; +// } +// // Create a byte array with nonZeroBytes length +// bytes memory bytesArray = new bytes(nonZeroBytes); +// for (uint256 i = 0; i < nonZeroBytes; i++) { +// bytesArray[i] = data[i]; +// } +// return string(bytesArray); +// } else { +// return "NOT_VALID_ENCODING"; +// } +// } +// } diff --git a/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol b/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol index 27453d83c..e7b6df354 100644 --- a/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol +++ b/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.17; +pragma solidity 0.8.20; import "../interfaces/IPolygonZkEVMGlobalExitRoot.sol"; import "../lib/GlobalExitRootLib.sol"; diff --git a/docs/v2/PolygonRollupManager.md b/docs/v2/PolygonRollupManager.md new file mode 100644 index 000000000..e124c4463 --- /dev/null +++ b/docs/v2/PolygonRollupManager.md @@ -0,0 +1,86 @@ +Contract responsible for managing the exit roots across multiple networks + + +## Functions +### initialize +```solidity + function initialize( + ) external +``` + + + + +### addNewConsensus +```solidity + function addNewConsensus( + address newConsensusAddress + ) external +``` +Add a new consensus contract + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`newConsensusAddress` | address | new exit tree root + +### addNewVerifier +```solidity + function addNewVerifier( + address newVerifierAddress + ) external +``` +Add a new vefifier contract + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`newVerifierAddress` | address | new verifier address + +### createNewNetwork +```solidity + function createNewNetwork( + address newVerifierAddress + ) external +``` +Add a new vefifier contract + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`newVerifierAddress` | address | new verifier address + +### calculateCurrentRollupRoot +```solidity + function calculateCurrentRollupRoot( + address newVerifierAddress + ) external +``` +Add a new vefifier contract + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`newVerifierAddress` | address | new verifier address + +## Events +### AddNewConsensus +```solidity + event AddNewConsensus( + ) +``` + +Emitted when a new consensus is added + +### AddNewVerifier +```solidity + event AddNewVerifier( + ) +``` + +Emitted when a new verifier is added + diff --git a/docs/v2/PolygonZkEVMGlobalExitRootV2.md b/docs/v2/PolygonZkEVMGlobalExitRootV2.md index dd9e76c09..723cbb46a 100644 --- a/docs/v2/PolygonZkEVMGlobalExitRootV2.md +++ b/docs/v2/PolygonZkEVMGlobalExitRootV2.md @@ -5,7 +5,7 @@ Contract responsible for managing the exit roots across multiple networks ### constructor ```solidity function constructor( - address _rollupAddress, + address _rollupManager, address _bridgeAddress ) public ``` @@ -14,7 +14,7 @@ Contract responsible for managing the exit roots across multiple networks #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`_rollupAddress` | address | Rollup contract address +|`_rollupManager` | address | Rollup contract address |`_bridgeAddress` | address | PolygonZkEVMBridge contract address ### updateExitRoot @@ -40,6 +40,15 @@ Return last global exit root +### getRoot +```solidity + function getRoot( + ) public returns (bytes32) +``` +Computes and returns the merkle root + + + ## Events ### UpdateGlobalExitRoot ```solidity From b230454641d2d5bf44840f508c503931c3efc1af Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 30 Aug 2023 14:32:35 +0200 Subject: [PATCH 014/230] advance --- contracts/v2/PolygonStateManager.sol | 89 +- contracts/v2/PolygonZkEVMBridgeV2.sol | 1842 ++++++++++++------------- contracts/v2/PolygonZkEVMV2.sol | 1679 ++++++++++++++++++++++ 3 files changed, 2645 insertions(+), 965 deletions(-) create mode 100644 contracts/v2/PolygonZkEVMV2.sol diff --git a/contracts/v2/PolygonStateManager.sol b/contracts/v2/PolygonStateManager.sol index b4d83e1e5..081b88899 100644 --- a/contracts/v2/PolygonStateManager.sol +++ b/contracts/v2/PolygonStateManager.sol @@ -9,41 +9,6 @@ import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; * Contract responsible for managing the exit roots across multiple networks */ abstract contract PolygonRollupManager is IPolygonRollupManager, Initializable { - // struct to store consensus metadata?¿ - - // Number of consensus added, every new consensus will be assigned sequencially a new ID - uint256 public consensusCount; - - // Consensus mapping - // consensusID => consensusImpl - mapping(uint256 => address) public consensusMap; - - // Number of verifiers added, every new verifiers will be assigned sequencially a new ID - uint256 public verifierCount; - - // Verifiers mapping - // verifierID => verifierAddress - mapping(uint256 => address) public verifierMap; - - // Governance address - address public governance; - - // Governance address - address public networkCount; - - // Time target of the verification of a batch - // Adaptatly the batchFee will be updated to achieve this target - uint64 public verifyBatchTimeTarget; - - // Batch fee multiplier with 3 decimals that goes from 1000 - 1023 - uint16 public multiplierBatchFee; - - // Trusted sequencer address - address public trustedSequencer; - - // Current matic fee per batch sequenced - uint256 public batchFee; - /** * @notice Struct which will be stored for every batch sequence * @param accInputHash Hash chain that contains all the information to process a batch: @@ -57,6 +22,24 @@ abstract contract PolygonRollupManager is IPolygonRollupManager, Initializable { uint64 previousLastBatchSequenced; } + /** + * @notice Struct which to store the rollup data of each chain + * @param accInputHash Hash chain that contains all the information to process a batch: + * keccak256(bytes32 oldAccInputHash, keccak256(bytes transactions), bytes32 globalExitRoot, uint64 timestamp, address seqAddress) + * @param sequencedTimestamp Sequenced timestamp + * @param previousLastBatchSequenced Previous last batch sequenced before the current one, this is used to properly calculate the fees + */ + struct ChainData { + mapping(uint64 => SequencedBatchData) sequencedBatches; + mapping(uint64 => bytes32) batchNumToStateRoot; + mapping(uint256 => PendingState) pendingStateTransitions; + uint64 lastBatchSequenced; + uint64 lastVerifiedBatch; + uint64 lastPendingState; + uint64 lastPendingStateConsolidated; + address trustedAggregator; + } + /** * @notice Struct to store the pending states * Pending state will be an intermediary state, that after a timeout can be consolidated, which means that will be added @@ -74,15 +57,27 @@ abstract contract PolygonRollupManager is IPolygonRollupManager, Initializable { bytes32 stateRoot; } - struct ChainData { - mapping(uint64 => SequencedBatchData) sequencedBatches; - mapping(uint64 => bytes32) batchNumToStateRoot; - mapping(uint256 => PendingState) pendingStateTransitions; - uint64 lastBatchSequenced; - uint64 lastVerifiedBatch; - uint64 lastPendingState; - uint64 lastPendingStateConsolidated; - } + // struct to store consensus metadata?¿ + + // Number of consensus added, every new consensus will be assigned sequencially a new ID + uint256 public consensusCount; + + // Consensus mapping + // consensusID => consensusImpl + mapping(uint256 => address) public consensusMap; + + // Number of verifiers added, every new verifiers will be assigned sequencially a new ID + uint256 public verifierCount; + + // Verifiers mapping + // verifierID => verifierAddress + mapping(uint256 => address) public verifierMap; + + // Governance address + address public governance; + + // Governance address + address public networkCount; // Once a pending state exceeds this timeout it can be consolidated uint64 public pendingStateTimeout; @@ -91,6 +86,12 @@ abstract contract PolygonRollupManager is IPolygonRollupManager, Initializable { // everyone can verify that sequence uint64 public trustedAggregatorTimeout; + // Address that will be able to adjust contract parameters or stop the emergency state + address public admin; + + // This account will be able to accept the admin role + address public pendingAdmin; + /** * @dev Emitted when a new consensus is added */ diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index 5fa89b5c6..ce627279f 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -1,921 +1,921 @@ -// // SPDX-License-Identifier: AGPL-3.0 - -// pragma solidity 0.8.20; - -// import "../lib/DepositContract.sol"; -// import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; -// import "../lib/TokenWrapped.sol"; -// import "../interfaces/IBasePolygonZkEVMGlobalExitRoot.sol"; -// import "../interfaces/IBridgeMessageReceiver.sol"; -// import "../interfaces/IPolygonZkEVMBridge.sol"; -// import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol"; -// import "../lib/EmergencyManager.sol"; -// import "../lib/GlobalExitRootLib.sol"; - -// /** -// * PolygonZkEVMBridge that will be deployed on both networks Ethereum and Polygon zkEVM -// * Contract responsible to manage the token interactions with other networks -// */ -// contract PolygonZkEVMBridgeV2 is -// DepositContract, -// EmergencyManager, -// IPolygonZkEVMBridge -// { -// using SafeERC20Upgradeable for IERC20Upgradeable; - -// // Wrapped Token information struct -// struct TokenInformation { -// uint32 originNetwork; -// address originTokenAddress; -// } - -// // bytes4(keccak256(bytes("permit(address,address,uint256,uint256,uint8,bytes32,bytes32)"))); -// bytes4 private constant _PERMIT_SIGNATURE = 0xd505accf; - -// // bytes4(keccak256(bytes("permit(address,address,uint256,uint256,bool,uint8,bytes32,bytes32)"))); -// bytes4 private constant _PERMIT_SIGNATURE_DAI = 0x8fcbaf0c; - -// // Mainnet identifier -// uint32 private constant _MAINNET_NETWORK_ID = 0; - -// // ZkEVM identifier -// uint32 private constant _ZKEVM_NETWORK_ID = 1; - -// // Number of networks supported by the bridge -// uint32 private constant _CURRENT_SUPPORTED_NETWORKS = 2; - -// // Leaf type asset -// uint8 private constant _LEAF_TYPE_ASSET = 0; - -// // Leaf type message -// uint8 private constant _LEAF_TYPE_MESSAGE = 1; - -// // Nullifier offset -// uint256 private constant _MAX_LEAFS_PER_NETWORK = 2 ** 32; - -// // // Indicate where's the mainnet flag bit in the global index -// uint256 private constant _GLOBAL_INDEX_MAINNET_FLAG = 2 ** 64; - -// // Network identifier -// uint32 public networkID; - -// // Global Exit Root address -// IBasePolygonZkEVMGlobalExitRoot public globalExitRootManager; - -// // Last updated deposit count to the global exit root manager -// uint32 public lastUpdatedDepositCount; - -// // Leaf index --> claimed bit map -// mapping(uint256 => uint256) public claimedBitMap; - -// // keccak256(OriginNetwork || tokenAddress) --> Wrapped token address -// mapping(bytes32 => address) public tokenInfoToWrappedToken; - -// // Wrapped token Address --> Origin token information -// mapping(address => TokenInformation) public wrappedTokenToTokenInfo; - -// // PolygonZkEVM address -// address public polygonRollupManager; - -// /** -// * @param _networkID networkID -// * @param _globalExitRootManager global exit root manager address -// * @param _polygonRollupManager polygonZkEVM address -// * @notice The value of `_polygonRollupManager` on the L2 deployment of the contract will be address(0), so -// * emergency state is not possible for the L2 deployment of the bridge, intentionally -// */ -// function initialize( -// uint32 _networkID, -// IBasePolygonZkEVMGlobalExitRoot _globalExitRootManager, -// address _polygonRollupManager -// ) external virtual initializer { -// networkID = _networkID; -// globalExitRootManager = _globalExitRootManager; -// polygonRollupManager = _polygonRollupManager; - -// // Initialize OZ contracts -// __ReentrancyGuard_init(); -// } - -// modifier onlyPolygonZkEVM() { -// if (polygonRollupManager != msg.sender) { -// revert OnlyPolygonZkEVM(); -// } -// _; -// } - -// /** -// * @dev Emitted when bridge assets or messages to another network -// */ -// event BridgeEvent( -// uint8 leafType, -// uint32 originNetwork, -// address originAddress, -// uint32 destinationNetwork, -// address destinationAddress, -// uint256 amount, -// bytes metadata, -// uint32 depositCount -// ); - -// /** -// * @dev Emitted when a claim is done from another network -// */ -// event ClaimEvent( -// uint256 index, -// uint32 originNetwork, -// address originAddress, -// address destinationAddress, -// uint256 amount -// ); - -// /** -// * @dev Emitted when a new wrapped token is created -// */ -// event NewWrappedToken( -// uint32 originNetwork, -// address originTokenAddress, -// address wrappedTokenAddress, -// bytes metadata -// ); - -// /** -// * @notice Deposit add a new leaf to the merkle tree -// * @param destinationNetwork Network destination -// * @param destinationAddress Address destination -// * @param amount Amount of tokens -// * @param token Token address, 0 address is reserved for ether -// * @param forceUpdateGlobalExitRoot Indicates if the new global exit root is updated or not -// * @param permitData Raw data of the call `permit` of the token -// */ -// function bridgeAsset( -// uint32 destinationNetwork, -// address destinationAddress, -// uint256 amount, -// address token, -// bool forceUpdateGlobalExitRoot, -// bytes calldata permitData -// ) public payable virtual ifNotEmergencyState nonReentrant { -// if ( -// destinationNetwork == networkID || -// destinationNetwork >= _CURRENT_SUPPORTED_NETWORKS -// ) { -// revert DestinationNetworkInvalid(); -// } - -// address originTokenAddress; -// uint32 originNetwork; -// bytes memory metadata; -// uint256 leafAmount = amount; - -// if (token == address(0)) { -// // Ether transfer -// if (msg.value != amount) { -// revert AmountDoesNotMatchMsgValue(); -// } - -// // Ether is treated as ether from mainnet -// originNetwork = _MAINNET_NETWORK_ID; -// } else { -// // Check msg.value is 0 if tokens are bridged -// if (msg.value != 0) { -// revert MsgValueNotZero(); -// } - -// TokenInformation memory tokenInfo = wrappedTokenToTokenInfo[token]; - -// if (tokenInfo.originTokenAddress != address(0)) { -// // The token is a wrapped token from another network - -// // Burn tokens -// TokenWrapped(token).burn(msg.sender, amount); - -// originTokenAddress = tokenInfo.originTokenAddress; -// originNetwork = tokenInfo.originNetwork; -// } else { -// // Use permit if any -// if (permitData.length != 0) { -// _permit(token, amount, permitData); -// } - -// // In order to support fee tokens check the amount received, not the transferred -// uint256 balanceBefore = IERC20Upgradeable(token).balanceOf( -// address(this) -// ); -// IERC20Upgradeable(token).safeTransferFrom( -// msg.sender, -// address(this), -// amount -// ); -// uint256 balanceAfter = IERC20Upgradeable(token).balanceOf( -// address(this) -// ); - -// // Override leafAmount with the received amount -// leafAmount = balanceAfter - balanceBefore; - -// originTokenAddress = token; -// originNetwork = networkID; - -// // Encode metadata -// metadata = abi.encode( -// _safeName(token), -// _safeSymbol(token), -// _safeDecimals(token) -// ); -// } -// } - -// emit BridgeEvent( -// _LEAF_TYPE_ASSET, -// originNetwork, -// originTokenAddress, -// destinationNetwork, -// destinationAddress, -// leafAmount, -// metadata, -// uint32(depositCount) -// ); - -// _addLeaf( -// getLeafValue( -// _LEAF_TYPE_ASSET, -// originNetwork, -// originTokenAddress, -// destinationNetwork, -// destinationAddress, -// leafAmount, -// keccak256(metadata) -// ) -// ); - -// // Update the new root to the global exit root manager if set by the user -// if (forceUpdateGlobalExitRoot) { -// _updateGlobalExitRoot(); -// } -// } - -// /** -// * @notice Bridge message and send ETH value -// * @param destinationNetwork Network destination -// * @param destinationAddress Address destination -// * @param forceUpdateGlobalExitRoot Indicates if the new global exit root is updated or not -// * @param metadata Message metadata -// */ -// function bridgeMessage( -// uint32 destinationNetwork, -// address destinationAddress, -// bool forceUpdateGlobalExitRoot, -// bytes calldata metadata -// ) external payable ifNotEmergencyState { -// if ( -// destinationNetwork == networkID || -// destinationNetwork >= _CURRENT_SUPPORTED_NETWORKS -// ) { -// revert DestinationNetworkInvalid(); -// } - -// emit BridgeEvent( -// _LEAF_TYPE_MESSAGE, -// networkID, -// msg.sender, -// destinationNetwork, -// destinationAddress, -// msg.value, -// metadata, -// uint32(depositCount) -// ); - -// _addLeaf( -// getLeafValue( -// _LEAF_TYPE_MESSAGE, -// networkID, -// msg.sender, -// destinationNetwork, -// destinationAddress, -// msg.value, -// keccak256(metadata) -// ) -// ); - -// // Update the new root to the global exit root manager if set by the user -// if (forceUpdateGlobalExitRoot) { -// _updateGlobalExitRoot(); -// } -// } - -// /** -// * @notice Verify merkle proof and withdraw tokens/ether -// * @param smtProof Smt proof -// * @param globalIndex Global index: bool(isMainnet)||uint32(indexRollupRoot)||uint32(indexDepositLeaf) -// * @param mainnetExitRoot Mainnet exit root -// * @param rollupExitRoot Rollup exit root -// * @param originNetwork Origin network -// * @param originTokenAddress Origin token address, 0 address is reserved for ether -// * @param destinationNetwork Network destination -// * @param destinationAddress Address destination -// * @param amount Amount of tokens -// * @param metadata Abi encoded metadata if any, empty otherwise -// */ -// function claimAsset( -// bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, -// uint256 globalIndex, -// bytes32 mainnetExitRoot, -// bytes32 rollupExitRoot, -// uint32 originNetwork, -// address originTokenAddress, -// uint32 destinationNetwork, -// address destinationAddress, -// uint256 amount, -// bytes calldata metadata -// ) external ifNotEmergencyState { -// // Verify leaf exist and it does not have been claimed -// _verifyLeaf( -// smtProof, -// globalIndex, -// mainnetExitRoot, -// rollupExitRoot, -// originNetwork, -// originTokenAddress, -// destinationNetwork, -// destinationAddress, -// amount, -// metadata, -// _LEAF_TYPE_ASSET -// ); - -// // Transfer funds -// if (originTokenAddress == address(0)) { -// // Transfer ether -// /* solhint-disable avoid-low-level-calls */ -// (bool success, ) = destinationAddress.call{value: amount}( -// new bytes(0) -// ); -// if (!success) { -// revert EtherTransferFailed(); -// } -// } else { -// // Transfer tokens -// if (originNetwork == networkID) { -// // The token is an ERC20 from this network -// IERC20Upgradeable(originTokenAddress).safeTransfer( -// destinationAddress, -// amount -// ); -// } else { -// // The tokens is not from this network -// // Create a wrapper for the token if not exist yet -// bytes32 tokenInfoHash = keccak256( -// abi.encodePacked(originNetwork, originTokenAddress) -// ); -// address wrappedToken = tokenInfoToWrappedToken[tokenInfoHash]; - -// if (wrappedToken == address(0)) { -// // Get ERC20 metadata -// ( -// string memory name, -// string memory symbol, -// uint8 decimals -// ) = abi.decode(metadata, (string, string, uint8)); - -// // Create a new wrapped erc20 using create2 -// TokenWrapped newWrappedToken = (new TokenWrapped){ -// salt: tokenInfoHash -// }(name, symbol, decimals); - -// // Mint tokens for the destination address -// newWrappedToken.mint(destinationAddress, amount); - -// // Create mappings -// tokenInfoToWrappedToken[tokenInfoHash] = address( -// newWrappedToken -// ); - -// wrappedTokenToTokenInfo[ -// address(newWrappedToken) -// ] = TokenInformation(originNetwork, originTokenAddress); - -// emit NewWrappedToken( -// originNetwork, -// originTokenAddress, -// address(newWrappedToken), -// metadata -// ); -// } else { -// // Use the existing wrapped erc20 -// TokenWrapped(wrappedToken).mint(destinationAddress, amount); -// } -// } -// } - -// emit ClaimEvent( -// globalIndex, -// originNetwork, -// originTokenAddress, -// destinationAddress, -// amount -// ); -// } - -// /** -// * @notice Verify merkle proof and execute message -// * If the receiving address is an EOA, the call will result as a success -// * Which means that the amount of ether will be transferred correctly, but the message -// * will not trigger any execution -// * @param smtProof Smt proof -// * @param globalIndex Index of the leaf -// * @param mainnetExitRoot Mainnet exit root -// * @param rollupExitRoot Rollup exit root -// * @param originNetwork Origin network -// * @param originAddress Origin address -// * @param destinationNetwork Network destination -// * @param destinationAddress Address destination -// * @param amount message value -// * @param metadata Abi encoded metadata if any, empty otherwise -// */ -// function claimMessage( -// bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, -// uint256 globalIndex, -// bytes32 mainnetExitRoot, -// bytes32 rollupExitRoot, -// uint32 originNetwork, -// address originAddress, -// uint32 destinationNetwork, -// address destinationAddress, -// uint256 amount, -// bytes calldata metadata -// ) external ifNotEmergencyState { -// // Verify leaf exist and it does not have been claimed -// _verifyLeaf( -// smtProof, -// globalIndex, -// mainnetExitRoot, -// rollupExitRoot, -// originNetwork, -// originAddress, -// destinationNetwork, -// destinationAddress, -// amount, -// metadata, -// _LEAF_TYPE_MESSAGE -// ); - -// // Execute message -// // Transfer ether -// /* solhint-disable avoid-low-level-calls */ -// (bool success, ) = destinationAddress.call{value: amount}( -// abi.encodeCall( -// IBridgeMessageReceiver.onMessageReceived, -// (originAddress, originNetwork, metadata) -// ) -// ); -// if (!success) { -// revert MessageFailed(); -// } - -// emit ClaimEvent( -// globalIndex, -// originNetwork, -// originAddress, -// destinationAddress, -// amount -// ); -// } - -// /** -// * @notice Returns the precalculated address of a wrapper using the token information -// * Note Updating the metadata of a token is not supported. -// * Since the metadata has relevance in the address deployed, this function will not return a valid -// * wrapped address if the metadata provided is not the original one. -// * @param originNetwork Origin network -// * @param originTokenAddress Origin token address, 0 address is reserved for ether -// * @param name Name of the token -// * @param symbol Symbol of the token -// * @param decimals Decimals of the token -// */ -// function precalculatedWrapperAddress( -// uint32 originNetwork, -// address originTokenAddress, -// string calldata name, -// string calldata symbol, -// uint8 decimals -// ) external view returns (address) { -// bytes32 salt = keccak256( -// abi.encodePacked(originNetwork, originTokenAddress) -// ); - -// bytes32 hashCreate2 = keccak256( -// abi.encodePacked( -// bytes1(0xff), -// address(this), -// salt, -// keccak256( -// abi.encodePacked( -// type(TokenWrapped).creationCode, -// abi.encode(name, symbol, decimals) -// ) -// ) -// ) -// ); - -// // last 20 bytes of hash to address -// return address(uint160(uint256(hashCreate2))); -// } - -// /** -// * @notice Returns the address of a wrapper using the token information if already exist -// * @param originNetwork Origin network -// * @param originTokenAddress Origin token address, 0 address is reserved for ether -// */ -// function getTokenWrappedAddress( -// uint32 originNetwork, -// address originTokenAddress -// ) external view returns (address) { -// return -// tokenInfoToWrappedToken[ -// keccak256(abi.encodePacked(originNetwork, originTokenAddress)) -// ]; -// } - -// /** -// * @notice Function to activate the emergency state -// " Only can be called by the Polygon ZK-EVM in extreme situations -// */ -// function activateEmergencyState() external onlyPolygonZkEVM { -// _activateEmergencyState(); -// } - -// /** -// * @notice Function to deactivate the emergency state -// " Only can be called by the Polygon ZK-EVM -// */ -// function deactivateEmergencyState() external onlyPolygonZkEVM { -// _deactivateEmergencyState(); -// } - -// /** -// * @notice Verify leaf and checks that it has not been claimed -// * @param smtProof Smt proof -// * @param globalIndex Index of the leaf -// * @param mainnetExitRoot Mainnet exit root -// * @param rollupExitRoot Rollup exit root -// * @param originNetwork Origin network -// * @param originAddress Origin address -// * @param destinationNetwork Network destination -// * @param destinationAddress Address destination -// * @param amount Amount of tokens -// * @param metadata Abi encoded metadata if any, empty otherwise -// * @param leafType Leaf type --> [0] transfer Ether / ERC20 tokens, [1] message -// */ -// function _verifyLeaf( -// bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, -// uint256 globalIndex, -// bytes32 mainnetExitRoot, -// bytes32 rollupExitRoot, -// uint32 originNetwork, -// address originAddress, -// uint32 destinationNetwork, -// address destinationAddress, -// uint256 amount, -// bytes calldata metadata, -// uint8 leafType -// ) internal { -// // Check timestamp where the global exit root was set -// uint256 timestampGlobalExitRoot = globalExitRootManager -// .globalExitRootMap( -// GlobalExitRootLib.calculateGlobalExitRoot( -// mainnetExitRoot, -// rollupExitRoot -// ) -// ); - -// if (timestampGlobalExitRoot == 0) { -// revert GlobalExitRootInvalid(); -// } - -// // Destination network must be networkID -// if (destinationNetwork != networkID) { -// revert DestinationNetworkInvalid(); -// } - -// uint32 leafIndex; -// bytes32 claimRoot; -// if (networkID == _MAINNET_NETWORK_ID) { -// // Verify merkle proof using rollup exit root -// claimRoot = rollupExitRoot; -// } else { -// // Verify merkle proof using mainnet exit root -// claimRoot = mainnetExitRoot; -// } - -// if (globalIndex & _GLOBAL_INDEX_MAINNET_FLAG == 0) { -// // Rollup claim - -// // Verify merkle proof using rollup exit root -// claimRoot = rollupExitRoot; -// if ( -// !verifyMerkleProof( -// getLeafValue( -// leafType, -// originNetwork, -// originAddress, -// destinationNetwork, -// destinationAddress, -// amount, -// keccak256(metadata) -// ), -// smtProof, -// leafIndex, -// rollupExitRoot -// ) -// ) { -// revert InvalidSmtProof(); -// } -// } else { -// // mainnet claim - -// // verify merkle proof using mainnet exit root -// if ( -// !verifyMerkleProof( -// getLeafValue( -// leafType, -// originNetwork, -// originAddress, -// destinationNetwork, -// destinationAddress, -// amount, -// keccak256(metadata) -// ), -// smtProof, -// leafIndex, -// mainnetExitRoot -// ) -// ) { -// revert InvalidSmtProof(); -// } -// } - -// // Set and check nullifier -// _setAndCheckClaimed(leafIndex, originNetwork); -// } - -// /** -// * @notice Function to check if an index is claimed or not -// * @param index Index -// * @param originNetwork origin network -// */ -// function isClaimed( -// uint32 index, -// uint32 originNetwork -// ) external view returns (bool) { -// uint256 globalIndex; - -// // For consistency with the previous setted nullifiers -// if ( -// networkID == _MAINNET_NETWORK_ID && -// originNetwork == _ZKEVM_NETWORK_ID -// ) { -// globalIndex = uint256(index); -// } else { -// globalIndex = -// uint256(index) + -// uint256(originNetwork) * -// _MAX_LEAFS_PER_NETWORK; -// } -// (uint256 wordPos, uint256 bitPos) = _bitmapPositions(globalIndex); -// uint256 mask = (1 << bitPos); -// return (claimedBitMap[wordPos] & mask) == mask; -// } - -// /** -// * @notice Function to check that an index is not claimed and set it as claimed -// * @param leafIndex Index -// * @param originNetwork origin network -// */ -// function _setAndCheckClaimed( -// uint256 leafIndex, -// uint256 originNetwork -// ) private { -// uint256 globalIndex = leafIndex + -// originNetwork * -// _MAX_LEAFS_PER_NETWORK; -// (uint256 wordPos, uint256 bitPos) = _bitmapPositions(globalIndex); -// uint256 mask = 1 << bitPos; -// uint256 flipped = claimedBitMap[wordPos] ^= mask; -// if (flipped & mask == 0) { -// revert AlreadyClaimed(); -// } -// } - -// /** -// * @notice Function to update the globalExitRoot if the last deposit is not submitted -// */ -// function updateGlobalExitRoot() external { -// if (lastUpdatedDepositCount < depositCount) { -// _updateGlobalExitRoot(); -// } -// } - -// /** -// * @notice Function to update the globalExitRoot -// */ -// function _updateGlobalExitRoot() internal { -// lastUpdatedDepositCount = uint32(depositCount); -// globalExitRootManager.updateExitRoot(getRoot()); -// } - -// /** -// * @notice Function decode an index into a wordPos and bitPos -// * @param index Index -// */ -// function _bitmapPositions( -// uint256 index -// ) private pure returns (uint256 wordPos, uint256 bitPos) { -// wordPos = uint248(index >> 8); -// bitPos = uint8(index); -// } - -// /** -// * @notice Function to call token permit method of extended ERC20 -// + @param token ERC20 token address -// * @param amount Quantity that is expected to be allowed -// * @param permitData Raw data of the call `permit` of the token -// */ -// function _permit( -// address token, -// uint256 amount, -// bytes calldata permitData -// ) internal { -// bytes4 sig = bytes4(permitData[:4]); -// if (sig == _PERMIT_SIGNATURE) { -// ( -// address owner, -// address spender, -// uint256 value, -// uint256 deadline, -// uint8 v, -// bytes32 r, -// bytes32 s -// ) = abi.decode( -// permitData[4:], -// ( -// address, -// address, -// uint256, -// uint256, -// uint8, -// bytes32, -// bytes32 -// ) -// ); -// if (owner != msg.sender) { -// revert NotValidOwner(); -// } -// if (spender != address(this)) { -// revert NotValidSpender(); -// } - -// if (value != amount) { -// revert NotValidAmount(); -// } - -// // we call without checking the result, in case it fails and he doesn't have enough balance -// // the following transferFrom should be fail. This prevents DoS attacks from using a signature -// // before the smartcontract call -// /* solhint-disable avoid-low-level-calls */ -// address(token).call( -// abi.encodeWithSelector( -// _PERMIT_SIGNATURE, -// owner, -// spender, -// value, -// deadline, -// v, -// r, -// s -// ) -// ); -// } else { -// if (sig != _PERMIT_SIGNATURE_DAI) { -// revert NotValidSignature(); -// } - -// ( -// address holder, -// address spender, -// uint256 nonce, -// uint256 expiry, -// bool allowed, -// uint8 v, -// bytes32 r, -// bytes32 s -// ) = abi.decode( -// permitData[4:], -// ( -// address, -// address, -// uint256, -// uint256, -// bool, -// uint8, -// bytes32, -// bytes32 -// ) -// ); - -// if (holder != msg.sender) { -// revert NotValidOwner(); -// } - -// if (spender != address(this)) { -// revert NotValidSpender(); -// } - -// // we call without checking the result, in case it fails and he doesn't have enough balance -// // the following transferFrom should be fail. This prevents DoS attacks from using a signature -// // before the smartcontract call -// /* solhint-disable avoid-low-level-calls */ -// address(token).call( -// abi.encodeWithSelector( -// _PERMIT_SIGNATURE_DAI, -// holder, -// spender, -// nonce, -// expiry, -// allowed, -// v, -// r, -// s -// ) -// ); -// } -// } - -// // Helpers to safely get the metadata from a token, inspired by https://github.com/traderjoe-xyz/joe-core/blob/main/contracts/MasterChefJoeV3.sol#L55-L95 - -// /** -// * @notice Provides a safe ERC20.symbol version which returns 'NO_SYMBOL' as fallback string -// * @param token The address of the ERC-20 token contract -// */ -// function _safeSymbol(address token) internal view returns (string memory) { -// (bool success, bytes memory data) = address(token).staticcall( -// abi.encodeCall(IERC20MetadataUpgradeable.symbol, ()) -// ); -// return success ? _returnDataToString(data) : "NO_SYMBOL"; -// } - -// /** -// * @notice Provides a safe ERC20.name version which returns 'NO_NAME' as fallback string. -// * @param token The address of the ERC-20 token contract. -// */ -// function _safeName(address token) internal view returns (string memory) { -// (bool success, bytes memory data) = address(token).staticcall( -// abi.encodeCall(IERC20MetadataUpgradeable.name, ()) -// ); -// return success ? _returnDataToString(data) : "NO_NAME"; -// } - -// /** -// * @notice Provides a safe ERC20.decimals version which returns '18' as fallback value. -// * Note Tokens with (decimals > 255) are not supported -// * @param token The address of the ERC-20 token contract -// */ -// function _safeDecimals(address token) internal view returns (uint8) { -// (bool success, bytes memory data) = address(token).staticcall( -// abi.encodeCall(IERC20MetadataUpgradeable.decimals, ()) -// ); -// return success && data.length == 32 ? abi.decode(data, (uint8)) : 18; -// } - -// /** -// * @notice Function to convert returned data to string -// * returns 'NOT_VALID_ENCODING' as fallback value. -// * @param data returned data -// */ -// function _returnDataToString( -// bytes memory data -// ) internal pure returns (string memory) { -// if (data.length >= 64) { -// return abi.decode(data, (string)); -// } else if (data.length == 32) { -// // Since the strings on bytes32 are encoded left-right, check the first zero in the data -// uint256 nonZeroBytes; -// while (nonZeroBytes < 32 && data[nonZeroBytes] != 0) { -// nonZeroBytes++; -// } - -// // If the first one is 0, we do not handle the encoding -// if (nonZeroBytes == 0) { -// return "NOT_VALID_ENCODING"; -// } -// // Create a byte array with nonZeroBytes length -// bytes memory bytesArray = new bytes(nonZeroBytes); -// for (uint256 i = 0; i < nonZeroBytes; i++) { -// bytesArray[i] = data[i]; -// } -// return string(bytesArray); -// } else { -// return "NOT_VALID_ENCODING"; -// } -// } -// } +// SPDX-License-Identifier: AGPL-3.0 + +pragma solidity 0.8.20; + +import "../lib/DepositContract.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; +import "../lib/TokenWrapped.sol"; +import "../interfaces/IBasePolygonZkEVMGlobalExitRoot.sol"; +import "../interfaces/IBridgeMessageReceiver.sol"; +import "../interfaces/IPolygonZkEVMBridge.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol"; +import "../lib/EmergencyManager.sol"; +import "../lib/GlobalExitRootLib.sol"; + +/** + * PolygonZkEVMBridge that will be deployed on both networks Ethereum and Polygon zkEVM + * Contract responsible to manage the token interactions with other networks + */ +contract PolygonZkEVMBridgeV2 is + DepositContract, + EmergencyManager, + IPolygonZkEVMBridge +{ + using SafeERC20Upgradeable for IERC20Upgradeable; + + // Wrapped Token information struct + struct TokenInformation { + uint32 originNetwork; + address originTokenAddress; + } + + // bytes4(keccak256(bytes("permit(address,address,uint256,uint256,uint8,bytes32,bytes32)"))); + bytes4 private constant _PERMIT_SIGNATURE = 0xd505accf; + + // bytes4(keccak256(bytes("permit(address,address,uint256,uint256,bool,uint8,bytes32,bytes32)"))); + bytes4 private constant _PERMIT_SIGNATURE_DAI = 0x8fcbaf0c; + + // Mainnet identifier + uint32 private constant _MAINNET_NETWORK_ID = 0; + + // ZkEVM identifier + uint32 private constant _ZKEVM_NETWORK_ID = 1; + + // Number of networks supported by the bridge + uint32 private constant _CURRENT_SUPPORTED_NETWORKS = 2; + + // Leaf type asset + uint8 private constant _LEAF_TYPE_ASSET = 0; + + // Leaf type message + uint8 private constant _LEAF_TYPE_MESSAGE = 1; + + // Nullifier offset + uint256 private constant _MAX_LEAFS_PER_NETWORK = 2 ** 32; + + // // Indicate where's the mainnet flag bit in the global index + uint256 private constant _GLOBAL_INDEX_MAINNET_FLAG = 2 ** 64; + + // Network identifier + uint32 public networkID; + + // Global Exit Root address + IBasePolygonZkEVMGlobalExitRoot public globalExitRootManager; + + // Last updated deposit count to the global exit root manager + uint32 public lastUpdatedDepositCount; + + // Leaf index --> claimed bit map + mapping(uint256 => uint256) public claimedBitMap; + + // keccak256(OriginNetwork || tokenAddress) --> Wrapped token address + mapping(bytes32 => address) public tokenInfoToWrappedToken; + + // Wrapped token Address --> Origin token information + mapping(address => TokenInformation) public wrappedTokenToTokenInfo; + + // PolygonZkEVM address + address public polygonRollupManager; + + /** + * @param _networkID networkID + * @param _globalExitRootManager global exit root manager address + * @param _polygonRollupManager polygonZkEVM address + * @notice The value of `_polygonRollupManager` on the L2 deployment of the contract will be address(0), so + * emergency state is not possible for the L2 deployment of the bridge, intentionally + */ + function initialize( + uint32 _networkID, + IBasePolygonZkEVMGlobalExitRoot _globalExitRootManager, + address _polygonRollupManager + ) external virtual initializer { + networkID = _networkID; + globalExitRootManager = _globalExitRootManager; + polygonRollupManager = _polygonRollupManager; + + // Initialize OZ contracts + __ReentrancyGuard_init(); + } + + modifier onlyPolygonZkEVM() { + if (polygonRollupManager != msg.sender) { + revert OnlyPolygonZkEVM(); + } + _; + } + + /** + * @dev Emitted when bridge assets or messages to another network + */ + event BridgeEvent( + uint8 leafType, + uint32 originNetwork, + address originAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes metadata, + uint32 depositCount + ); + + /** + * @dev Emitted when a claim is done from another network + */ + event ClaimEvent( + uint256 index, + uint32 originNetwork, + address originAddress, + address destinationAddress, + uint256 amount + ); + + /** + * @dev Emitted when a new wrapped token is created + */ + event NewWrappedToken( + uint32 originNetwork, + address originTokenAddress, + address wrappedTokenAddress, + bytes metadata + ); + + /** + * @notice Deposit add a new leaf to the merkle tree + * @param destinationNetwork Network destination + * @param destinationAddress Address destination + * @param amount Amount of tokens + * @param token Token address, 0 address is reserved for ether + * @param forceUpdateGlobalExitRoot Indicates if the new global exit root is updated or not + * @param permitData Raw data of the call `permit` of the token + */ + function bridgeAsset( + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + address token, + bool forceUpdateGlobalExitRoot, + bytes calldata permitData + ) public payable virtual ifNotEmergencyState nonReentrant { + if ( + destinationNetwork == networkID || + destinationNetwork >= _CURRENT_SUPPORTED_NETWORKS + ) { + revert DestinationNetworkInvalid(); + } + + address originTokenAddress; + uint32 originNetwork; + bytes memory metadata; + uint256 leafAmount = amount; + + if (token == address(0)) { + // Ether transfer + if (msg.value != amount) { + revert AmountDoesNotMatchMsgValue(); + } + + // Ether is treated as ether from mainnet + originNetwork = _MAINNET_NETWORK_ID; + } else { + // Check msg.value is 0 if tokens are bridged + if (msg.value != 0) { + revert MsgValueNotZero(); + } + + TokenInformation memory tokenInfo = wrappedTokenToTokenInfo[token]; + + if (tokenInfo.originTokenAddress != address(0)) { + // The token is a wrapped token from another network + + // Burn tokens + TokenWrapped(token).burn(msg.sender, amount); + + originTokenAddress = tokenInfo.originTokenAddress; + originNetwork = tokenInfo.originNetwork; + } else { + // Use permit if any + if (permitData.length != 0) { + _permit(token, amount, permitData); + } + + // In order to support fee tokens check the amount received, not the transferred + uint256 balanceBefore = IERC20Upgradeable(token).balanceOf( + address(this) + ); + IERC20Upgradeable(token).safeTransferFrom( + msg.sender, + address(this), + amount + ); + uint256 balanceAfter = IERC20Upgradeable(token).balanceOf( + address(this) + ); + + // Override leafAmount with the received amount + leafAmount = balanceAfter - balanceBefore; + + originTokenAddress = token; + originNetwork = networkID; + + // Encode metadata + metadata = abi.encode( + _safeName(token), + _safeSymbol(token), + _safeDecimals(token) + ); + } + } + + emit BridgeEvent( + _LEAF_TYPE_ASSET, + originNetwork, + originTokenAddress, + destinationNetwork, + destinationAddress, + leafAmount, + metadata, + uint32(depositCount) + ); + + _addLeaf( + getLeafValue( + _LEAF_TYPE_ASSET, + originNetwork, + originTokenAddress, + destinationNetwork, + destinationAddress, + leafAmount, + keccak256(metadata) + ) + ); + + // Update the new root to the global exit root manager if set by the user + if (forceUpdateGlobalExitRoot) { + _updateGlobalExitRoot(); + } + } + + /** + * @notice Bridge message and send ETH value + * @param destinationNetwork Network destination + * @param destinationAddress Address destination + * @param forceUpdateGlobalExitRoot Indicates if the new global exit root is updated or not + * @param metadata Message metadata + */ + function bridgeMessage( + uint32 destinationNetwork, + address destinationAddress, + bool forceUpdateGlobalExitRoot, + bytes calldata metadata + ) external payable ifNotEmergencyState { + if ( + destinationNetwork == networkID || + destinationNetwork >= _CURRENT_SUPPORTED_NETWORKS + ) { + revert DestinationNetworkInvalid(); + } + + emit BridgeEvent( + _LEAF_TYPE_MESSAGE, + networkID, + msg.sender, + destinationNetwork, + destinationAddress, + msg.value, + metadata, + uint32(depositCount) + ); + + _addLeaf( + getLeafValue( + _LEAF_TYPE_MESSAGE, + networkID, + msg.sender, + destinationNetwork, + destinationAddress, + msg.value, + keccak256(metadata) + ) + ); + + // Update the new root to the global exit root manager if set by the user + if (forceUpdateGlobalExitRoot) { + _updateGlobalExitRoot(); + } + } + + /** + * @notice Verify merkle proof and withdraw tokens/ether + * @param smtProof Smt proof + * @param globalIndex Global index: bool(isMainnet)||uint32(indexRollupRoot)||uint32(indexDepositLeaf) + * @param mainnetExitRoot Mainnet exit root + * @param rollupExitRoot Rollup exit root + * @param originNetwork Origin network + * @param originTokenAddress Origin token address, 0 address is reserved for ether + * @param destinationNetwork Network destination + * @param destinationAddress Address destination + * @param amount Amount of tokens + * @param metadata Abi encoded metadata if any, empty otherwise + */ + function claimAsset( + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, + uint256 globalIndex, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + uint32 originNetwork, + address originTokenAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes calldata metadata + ) external ifNotEmergencyState { + // Verify leaf exist and it does not have been claimed + _verifyLeaf( + smtProof, + globalIndex, + mainnetExitRoot, + rollupExitRoot, + originNetwork, + originTokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata, + _LEAF_TYPE_ASSET + ); + + // Transfer funds + if (originTokenAddress == address(0)) { + // Transfer ether + /* solhint-disable avoid-low-level-calls */ + (bool success, ) = destinationAddress.call{value: amount}( + new bytes(0) + ); + if (!success) { + revert EtherTransferFailed(); + } + } else { + // Transfer tokens + if (originNetwork == networkID) { + // The token is an ERC20 from this network + IERC20Upgradeable(originTokenAddress).safeTransfer( + destinationAddress, + amount + ); + } else { + // The tokens is not from this network + // Create a wrapper for the token if not exist yet + bytes32 tokenInfoHash = keccak256( + abi.encodePacked(originNetwork, originTokenAddress) + ); + address wrappedToken = tokenInfoToWrappedToken[tokenInfoHash]; + + if (wrappedToken == address(0)) { + // Get ERC20 metadata + ( + string memory name, + string memory symbol, + uint8 decimals + ) = abi.decode(metadata, (string, string, uint8)); + + // Create a new wrapped erc20 using create2 + TokenWrapped newWrappedToken = (new TokenWrapped){ + salt: tokenInfoHash + }(name, symbol, decimals); + + // Mint tokens for the destination address + newWrappedToken.mint(destinationAddress, amount); + + // Create mappings + tokenInfoToWrappedToken[tokenInfoHash] = address( + newWrappedToken + ); + + wrappedTokenToTokenInfo[ + address(newWrappedToken) + ] = TokenInformation(originNetwork, originTokenAddress); + + emit NewWrappedToken( + originNetwork, + originTokenAddress, + address(newWrappedToken), + metadata + ); + } else { + // Use the existing wrapped erc20 + TokenWrapped(wrappedToken).mint(destinationAddress, amount); + } + } + } + + emit ClaimEvent( + globalIndex, + originNetwork, + originTokenAddress, + destinationAddress, + amount + ); + } + + /** + * @notice Verify merkle proof and execute message + * If the receiving address is an EOA, the call will result as a success + * Which means that the amount of ether will be transferred correctly, but the message + * will not trigger any execution + * @param smtProof Smt proof + * @param globalIndex Index of the leaf + * @param mainnetExitRoot Mainnet exit root + * @param rollupExitRoot Rollup exit root + * @param originNetwork Origin network + * @param originAddress Origin address + * @param destinationNetwork Network destination + * @param destinationAddress Address destination + * @param amount message value + * @param metadata Abi encoded metadata if any, empty otherwise + */ + function claimMessage( + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, + uint256 globalIndex, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + uint32 originNetwork, + address originAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes calldata metadata + ) external ifNotEmergencyState { + // Verify leaf exist and it does not have been claimed + _verifyLeaf( + smtProof, + globalIndex, + mainnetExitRoot, + rollupExitRoot, + originNetwork, + originAddress, + destinationNetwork, + destinationAddress, + amount, + metadata, + _LEAF_TYPE_MESSAGE + ); + + // Execute message + // Transfer ether + /* solhint-disable avoid-low-level-calls */ + (bool success, ) = destinationAddress.call{value: amount}( + abi.encodeCall( + IBridgeMessageReceiver.onMessageReceived, + (originAddress, originNetwork, metadata) + ) + ); + if (!success) { + revert MessageFailed(); + } + + emit ClaimEvent( + globalIndex, + originNetwork, + originAddress, + destinationAddress, + amount + ); + } + + /** + * @notice Returns the precalculated address of a wrapper using the token information + * Note Updating the metadata of a token is not supported. + * Since the metadata has relevance in the address deployed, this function will not return a valid + * wrapped address if the metadata provided is not the original one. + * @param originNetwork Origin network + * @param originTokenAddress Origin token address, 0 address is reserved for ether + * @param name Name of the token + * @param symbol Symbol of the token + * @param decimals Decimals of the token + */ + function precalculatedWrapperAddress( + uint32 originNetwork, + address originTokenAddress, + string calldata name, + string calldata symbol, + uint8 decimals + ) external view returns (address) { + bytes32 salt = keccak256( + abi.encodePacked(originNetwork, originTokenAddress) + ); + + bytes32 hashCreate2 = keccak256( + abi.encodePacked( + bytes1(0xff), + address(this), + salt, + keccak256( + abi.encodePacked( + type(TokenWrapped).creationCode, + abi.encode(name, symbol, decimals) + ) + ) + ) + ); + + // last 20 bytes of hash to address + return address(uint160(uint256(hashCreate2))); + } + + /** + * @notice Returns the address of a wrapper using the token information if already exist + * @param originNetwork Origin network + * @param originTokenAddress Origin token address, 0 address is reserved for ether + */ + function getTokenWrappedAddress( + uint32 originNetwork, + address originTokenAddress + ) external view returns (address) { + return + tokenInfoToWrappedToken[ + keccak256(abi.encodePacked(originNetwork, originTokenAddress)) + ]; + } + + /** + * @notice Function to activate the emergency state + " Only can be called by the Polygon ZK-EVM in extreme situations + */ + function activateEmergencyState() external onlyPolygonZkEVM { + _activateEmergencyState(); + } + + /** + * @notice Function to deactivate the emergency state + " Only can be called by the Polygon ZK-EVM + */ + function deactivateEmergencyState() external onlyPolygonZkEVM { + _deactivateEmergencyState(); + } + + /** + * @notice Verify leaf and checks that it has not been claimed + * @param smtProof Smt proof + * @param globalIndex Index of the leaf + * @param mainnetExitRoot Mainnet exit root + * @param rollupExitRoot Rollup exit root + * @param originNetwork Origin network + * @param originAddress Origin address + * @param destinationNetwork Network destination + * @param destinationAddress Address destination + * @param amount Amount of tokens + * @param metadata Abi encoded metadata if any, empty otherwise + * @param leafType Leaf type --> [0] transfer Ether / ERC20 tokens, [1] message + */ + function _verifyLeaf( + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, + uint256 globalIndex, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + uint32 originNetwork, + address originAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes calldata metadata, + uint8 leafType + ) internal { + // Check timestamp where the global exit root was set + uint256 timestampGlobalExitRoot = globalExitRootManager + .globalExitRootMap( + GlobalExitRootLib.calculateGlobalExitRoot( + mainnetExitRoot, + rollupExitRoot + ) + ); + + if (timestampGlobalExitRoot == 0) { + revert GlobalExitRootInvalid(); + } + + // Destination network must be networkID + if (destinationNetwork != networkID) { + revert DestinationNetworkInvalid(); + } + + uint32 leafIndex; + bytes32 claimRoot; + if (networkID == _MAINNET_NETWORK_ID) { + // Verify merkle proof using rollup exit root + claimRoot = rollupExitRoot; + } else { + // Verify merkle proof using mainnet exit root + claimRoot = mainnetExitRoot; + } + + if (globalIndex & _GLOBAL_INDEX_MAINNET_FLAG == 0) { + // Rollup claim + + // Verify merkle proof using rollup exit root + claimRoot = rollupExitRoot; + if ( + !verifyMerkleProof( + getLeafValue( + leafType, + originNetwork, + originAddress, + destinationNetwork, + destinationAddress, + amount, + keccak256(metadata) + ), + smtProof, + leafIndex, + rollupExitRoot + ) + ) { + revert InvalidSmtProof(); + } + } else { + // mainnet claim + + // verify merkle proof using mainnet exit root + if ( + !verifyMerkleProof( + getLeafValue( + leafType, + originNetwork, + originAddress, + destinationNetwork, + destinationAddress, + amount, + keccak256(metadata) + ), + smtProof, + leafIndex, + mainnetExitRoot + ) + ) { + revert InvalidSmtProof(); + } + } + + // Set and check nullifier + _setAndCheckClaimed(leafIndex, originNetwork); + } + + /** + * @notice Function to check if an index is claimed or not + * @param index Index + * @param originNetwork origin network + */ + function isClaimed( + uint32 index, + uint32 originNetwork + ) external view returns (bool) { + uint256 globalIndex; + + // For consistency with the previous setted nullifiers + if ( + networkID == _MAINNET_NETWORK_ID && + originNetwork == _ZKEVM_NETWORK_ID + ) { + globalIndex = uint256(index); + } else { + globalIndex = + uint256(index) + + uint256(originNetwork) * + _MAX_LEAFS_PER_NETWORK; + } + (uint256 wordPos, uint256 bitPos) = _bitmapPositions(globalIndex); + uint256 mask = (1 << bitPos); + return (claimedBitMap[wordPos] & mask) == mask; + } + + /** + * @notice Function to check that an index is not claimed and set it as claimed + * @param leafIndex Index + * @param originNetwork origin network + */ + function _setAndCheckClaimed( + uint256 leafIndex, + uint256 originNetwork + ) private { + uint256 globalIndex = leafIndex + + originNetwork * + _MAX_LEAFS_PER_NETWORK; + (uint256 wordPos, uint256 bitPos) = _bitmapPositions(globalIndex); + uint256 mask = 1 << bitPos; + uint256 flipped = claimedBitMap[wordPos] ^= mask; + if (flipped & mask == 0) { + revert AlreadyClaimed(); + } + } + + /** + * @notice Function to update the globalExitRoot if the last deposit is not submitted + */ + function updateGlobalExitRoot() external { + if (lastUpdatedDepositCount < depositCount) { + _updateGlobalExitRoot(); + } + } + + /** + * @notice Function to update the globalExitRoot + */ + function _updateGlobalExitRoot() internal { + lastUpdatedDepositCount = uint32(depositCount); + globalExitRootManager.updateExitRoot(getRoot()); + } + + /** + * @notice Function decode an index into a wordPos and bitPos + * @param index Index + */ + function _bitmapPositions( + uint256 index + ) private pure returns (uint256 wordPos, uint256 bitPos) { + wordPos = uint248(index >> 8); + bitPos = uint8(index); + } + + /** + * @notice Function to call token permit method of extended ERC20 + + @param token ERC20 token address + * @param amount Quantity that is expected to be allowed + * @param permitData Raw data of the call `permit` of the token + */ + function _permit( + address token, + uint256 amount, + bytes calldata permitData + ) internal { + bytes4 sig = bytes4(permitData[:4]); + if (sig == _PERMIT_SIGNATURE) { + ( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) = abi.decode( + permitData[4:], + ( + address, + address, + uint256, + uint256, + uint8, + bytes32, + bytes32 + ) + ); + if (owner != msg.sender) { + revert NotValidOwner(); + } + if (spender != address(this)) { + revert NotValidSpender(); + } + + if (value != amount) { + revert NotValidAmount(); + } + + // we call without checking the result, in case it fails and he doesn't have enough balance + // the following transferFrom should be fail. This prevents DoS attacks from using a signature + // before the smartcontract call + /* solhint-disable avoid-low-level-calls */ + address(token).call( + abi.encodeWithSelector( + _PERMIT_SIGNATURE, + owner, + spender, + value, + deadline, + v, + r, + s + ) + ); + } else { + if (sig != _PERMIT_SIGNATURE_DAI) { + revert NotValidSignature(); + } + + ( + address holder, + address spender, + uint256 nonce, + uint256 expiry, + bool allowed, + uint8 v, + bytes32 r, + bytes32 s + ) = abi.decode( + permitData[4:], + ( + address, + address, + uint256, + uint256, + bool, + uint8, + bytes32, + bytes32 + ) + ); + + if (holder != msg.sender) { + revert NotValidOwner(); + } + + if (spender != address(this)) { + revert NotValidSpender(); + } + + // we call without checking the result, in case it fails and he doesn't have enough balance + // the following transferFrom should be fail. This prevents DoS attacks from using a signature + // before the smartcontract call + /* solhint-disable avoid-low-level-calls */ + address(token).call( + abi.encodeWithSelector( + _PERMIT_SIGNATURE_DAI, + holder, + spender, + nonce, + expiry, + allowed, + v, + r, + s + ) + ); + } + } + + // Helpers to safely get the metadata from a token, inspired by https://github.com/traderjoe-xyz/joe-core/blob/main/contracts/MasterChefJoeV3.sol#L55-L95 + + /** + * @notice Provides a safe ERC20.symbol version which returns 'NO_SYMBOL' as fallback string + * @param token The address of the ERC-20 token contract + */ + function _safeSymbol(address token) internal view returns (string memory) { + (bool success, bytes memory data) = address(token).staticcall( + abi.encodeCall(IERC20MetadataUpgradeable.symbol, ()) + ); + return success ? _returnDataToString(data) : "NO_SYMBOL"; + } + + /** + * @notice Provides a safe ERC20.name version which returns 'NO_NAME' as fallback string. + * @param token The address of the ERC-20 token contract. + */ + function _safeName(address token) internal view returns (string memory) { + (bool success, bytes memory data) = address(token).staticcall( + abi.encodeCall(IERC20MetadataUpgradeable.name, ()) + ); + return success ? _returnDataToString(data) : "NO_NAME"; + } + + /** + * @notice Provides a safe ERC20.decimals version which returns '18' as fallback value. + * Note Tokens with (decimals > 255) are not supported + * @param token The address of the ERC-20 token contract + */ + function _safeDecimals(address token) internal view returns (uint8) { + (bool success, bytes memory data) = address(token).staticcall( + abi.encodeCall(IERC20MetadataUpgradeable.decimals, ()) + ); + return success && data.length == 32 ? abi.decode(data, (uint8)) : 18; + } + + /** + * @notice Function to convert returned data to string + * returns 'NOT_VALID_ENCODING' as fallback value. + * @param data returned data + */ + function _returnDataToString( + bytes memory data + ) internal pure returns (string memory) { + if (data.length >= 64) { + return abi.decode(data, (string)); + } else if (data.length == 32) { + // Since the strings on bytes32 are encoded left-right, check the first zero in the data + uint256 nonZeroBytes; + while (nonZeroBytes < 32 && data[nonZeroBytes] != 0) { + nonZeroBytes++; + } + + // If the first one is 0, we do not handle the encoding + if (nonZeroBytes == 0) { + return "NOT_VALID_ENCODING"; + } + // Create a byte array with nonZeroBytes length + bytes memory bytesArray = new bytes(nonZeroBytes); + for (uint256 i = 0; i < nonZeroBytes; i++) { + bytesArray[i] = data[i]; + } + return string(bytesArray); + } else { + return "NOT_VALID_ENCODING"; + } + } +} diff --git a/contracts/v2/PolygonZkEVMV2.sol b/contracts/v2/PolygonZkEVMV2.sol new file mode 100644 index 000000000..66dfd84e9 --- /dev/null +++ b/contracts/v2/PolygonZkEVMV2.sol @@ -0,0 +1,1679 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; +import "../interfaces/IVerifierRollup.sol"; +import "../interfaces/IPolygonZkEVMGlobalExitRoot.sol"; +import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import "../interfaces/IPolygonZkEVMBridge.sol"; +import "../lib/EmergencyManager.sol"; +import "../interfaces/IPolygonZkEVMErrors.sol"; + +/** + * 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. + */ +contract PolygonZkEVMV2 is + OwnableUpgradeable, + EmergencyManager, + IPolygonZkEVMErrors +{ + using SafeERC20Upgradeable for IERC20Upgradeable; + + /** + * @notice Struct which will be used to call sequenceBatches + * @param transactions L2 ethereum transactions EIP-155 or pre-EIP-155 with signature: + * EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data, chainid, 0, 0,) || v || r || s + * pre-EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data) || v || r || s + * @param forcedHistoricGlobalExitRoot Global exit root of the batch + * @param minForcedTimestamp Minimum timestamp of the force batch data, empty when non forced batch + */ + struct BatchData { + bytes transactions; + bytes32 forcedHistoricGlobalExitRoot; + uint64 minForcedTimestamp; + } + + /** + * @notice Struct which will be stored for every batch sequence + * @param accInputHash Hash chain that contains all the information to process a batch: + * keccak256(bytes32 oldAccInputHash, keccak256(bytes transactions), bytes32 globalExitRoot, uint64 timestamp, address seqAddress) + * @param sequencedTimestamp Sequenced timestamp + * @param previousLastBatchSequenced Previous last batch sequenced before the current one, this is used to properly calculate the fees + */ + struct SequencedBatchData { + bytes32 accInputHash; + uint64 sequencedTimestamp; + uint64 previousLastBatchSequenced; + } + + /** + * @notice Struct to store the pending states + * Pending state will be an intermediary state, that after a timeout can be consolidated, which means that will be added + * to the state root mapping, and the global exit root will be updated + * This is a protection mechanism against soundness attacks, that will be turned off in the future + * @param timestamp Timestamp where the pending state is added to the queue + * @param lastVerifiedBatch Last batch verified batch of this pending state + * @param exitRoot Pending exit root + * @param stateRoot Pending state root + */ + struct PendingState { + uint64 timestamp; + uint64 lastVerifiedBatch; + bytes32 exitRoot; + bytes32 stateRoot; + } + + /** + * @notice Struct to call initialize, this saves gas because pack the parameters and avoid stack too deep errors. + * @param admin Admin address + * @param trustedSequencer Trusted sequencer address + * @param pendingStateTimeout Pending state timeout + * @param trustedAggregator Trusted aggregator + * @param trustedAggregatorTimeout Trusted aggregator timeout + */ + struct InitializePackedParameters { + address admin; + address trustedSequencer; + uint64 pendingStateTimeout; + address trustedAggregator; + uint64 trustedAggregatorTimeout; + } + + // Modulus zkSNARK + uint256 internal constant _RFIELD = + 21888242871839275222246405745257275088548364400416034343698204186575808495617; + + // Max transactions bytes that can be added in a single batch + // Max keccaks circuit = (2**23 / 155286) * 44 = 2376 + // Bytes per keccak = 136 + // Minimum Static keccaks batch = 2 + // Max bytes allowed = (2376 - 2) * 136 = 322864 bytes - 1 byte padding + // Rounded to 300000 bytes + // In order to process the transaction, the data is approximately hashed twice for ecrecover: + // 300000 bytes / 2 = 150000 bytes + // Since geth pool currently only accepts at maximum 128kb transactions: + // https://github.com/ethereum/go-ethereum/blob/master/core/txpool/txpool.go#L54 + // We will limit this length to be compliant with the geth restrictions since our node will use it + // We let 8kb as a sanity margin + uint256 internal constant _MAX_TRANSACTIONS_BYTE_LENGTH = 120000; + + // Max force batch transaction length + // This is used to avoid huge calldata attacks, where the attacker call force batches from another contract + uint256 internal constant _MAX_FORCE_BATCH_BYTE_LENGTH = 5000; + + // If a sequenced batch exceeds this timeout without being verified, the contract enters in emergency mode + uint64 internal constant _HALT_AGGREGATION_TIMEOUT = 1 weeks; + + // Maximum batches that can be verified in one call. It depends on our current metrics + // This should be a protection against someone that tries to generate huge chunk of invalid batches, and we can't prove otherwise before the pending timeout expires + uint64 internal constant _MAX_VERIFY_BATCHES = 1000; + + // Max batch multiplier per verification + uint256 internal constant _MAX_BATCH_MULTIPLIER = 12; + + // Max batch fee value + uint256 internal constant _MAX_BATCH_FEE = 1000 ether; + + // Min value batch fee + uint256 internal constant _MIN_BATCH_FEE = 1 gwei; + + // Goldilocks prime field + uint256 internal constant _GOLDILOCKS_PRIME_FIELD = 0xFFFFFFFF00000001; // 2 ** 64 - 2 ** 32 + 1 + + // Max uint64 + uint256 internal constant _MAX_UINT_64 = type(uint64).max; // 0xFFFFFFFFFFFFFFFF + + // Boolena indicating that is a forced batch + bool internal constant _IS_FORCED_BATCH = true; + + // Boolena indicating that is not a forced batch + bool internal constant _IS_NOT_FORCED_BATCH = false; + + // Rollup verifier interface + IVerifierRollup public immutable rollupVerifier; + + // Global Exit Root interface + IPolygonZkEVMGlobalExitRoot public immutable globalExitRootManager; + + // PolygonZkEVM Bridge Address + IPolygonZkEVMBridge public immutable bridgeAddress; + + // L2 chain identifier + uint64 public immutable chainID; + + // L2 chain identifier + uint64 public immutable forkID; + + // Time target of the verification of a batch + // Adaptatly the batchFee will be updated to achieve this target + uint64 public verifyBatchTimeTarget; + + // Batch fee multiplier with 3 decimals that goes from 1000 - 1023 + uint16 public multiplierBatchFee; + + // Trusted sequencer address + address public trustedSequencer; + + // Current matic fee per batch sequenced + uint256 public batchFee; + + // Queue of forced batches with their associated data + // ForceBatchNum --> hashedForcedBatchData + // hashedForcedBatchData: hash containing the necessary information to force a batch: + // keccak256(keccak256(bytes transactions), bytes32 globalExitRoot, unint64 minForcedTimestamp) + mapping(uint64 => bytes32) public forcedBatches; + + // Queue of batches that defines the virtual state + // SequenceBatchNum --> SequencedBatchData + mapping(uint64 => SequencedBatchData) public sequencedBatches; + + // Last sequenced timestamp + uint64 public gapLastTimestamp; + + // Last batch sent by the sequencers + uint64 public lastBatchSequenced; + + // Last forced batch included in the sequence + uint64 public lastForceBatchSequenced; + + // Last forced batch + uint64 public lastForceBatch; + + // Last batch verified by the aggregators + uint64 public lastVerifiedBatch; + + // Trusted aggregator address + address public trustedAggregator; + + // State root mapping + // BatchNum --> state root + mapping(uint64 => bytes32) public batchNumToStateRoot; + + // Trusted sequencer URL + string public trustedSequencerURL; + + // L2 network name + string public networkName; + + // Pending state mapping + // pendingStateNumber --> PendingState + mapping(uint256 => PendingState) public pendingStateTransitions; + + // Last pending state + uint64 public lastPendingState; + + // Last pending state consolidated + uint64 public lastPendingStateConsolidated; + + // Once a pending state exceeds this timeout it can be consolidated + uint64 public pendingStateTimeout; + + // Trusted aggregator timeout, if a sequence is not verified in this time frame, + // everyone can verify that sequence + uint64 public trustedAggregatorTimeout; + + // Address that will be able to adjust contract parameters or stop the emergency state + address public admin; + + // This account will be able to accept the admin role + address public pendingAdmin; + + // Force batch timeout + uint64 public forceBatchTimeout; + + // Indicates if forced batches are disallowed + bool public isForcedBatchDisallowed; + + // fee token address + IERC20Upgradeable public feeToken; + + /** + * @dev Emitted when the trusted sequencer sends a new batch of transactions + */ + event SequenceBatches(uint64 indexed numBatch); + + /** + * @dev Emitted when a batch is forced + */ + event ForceBatch( + uint64 indexed forceBatchNum, + bytes32 lastGlobalExitRoot, + address sequencer, + bytes transactions + ); + + /** + * @dev Emitted when forced batches are sequenced by not the trusted sequencer + */ + event SequenceForceBatches(uint64 indexed numBatch); + + /** + * @dev Emitted when a aggregator verifies batches + */ + event VerifyBatches( + uint64 indexed numBatch, + bytes32 stateRoot, + address indexed aggregator + ); + + /** + * @dev Emitted when the trusted aggregator verifies batches + */ + event VerifyBatchesTrustedAggregator( + uint64 indexed numBatch, + bytes32 stateRoot, + address indexed aggregator + ); + + /** + * @dev Emitted when pending state is consolidated + */ + event ConsolidatePendingState( + uint64 indexed numBatch, + bytes32 stateRoot, + uint64 indexed pendingStateNum + ); + + /** + * @dev Emitted when the admin updates the trusted sequencer address + */ + event SetTrustedSequencer(address newTrustedSequencer); + + /** + * @dev Emitted when the admin updates the sequencer URL + */ + event SetTrustedSequencerURL(string newTrustedSequencerURL); + + /** + * @dev Emitted when the admin updates the trusted aggregator timeout + */ + event SetTrustedAggregatorTimeout(uint64 newTrustedAggregatorTimeout); + + /** + * @dev Emitted when the admin updates the pending state timeout + */ + event SetPendingStateTimeout(uint64 newPendingStateTimeout); + + /** + * @dev Emitted when the admin updates the trusted aggregator address + */ + event SetTrustedAggregator(address newTrustedAggregator); + + /** + * @dev Emitted when the admin updates the multiplier batch fee + */ + event SetMultiplierBatchFee(uint16 newMultiplierBatchFee); + + /** + * @dev Emitted when the admin updates the verify batch timeout + */ + event SetVerifyBatchTimeTarget(uint64 newVerifyBatchTimeTarget); + + /** + * @dev Emitted when the admin update the force batch timeout + */ + event SetForceBatchTimeout(uint64 newforceBatchTimeout); + + /** + * @dev Emitted when activate force batches + */ + event ActivateForceBatches(); + + /** + * @dev Emitted when the admin starts the two-step transfer role setting a new pending admin + */ + event TransferAdminRole(address newPendingAdmin); + + /** + * @dev Emitted when the pending admin accepts the admin role + */ + event AcceptAdminRole(address newAdmin); + + /** + * @dev Emitted when is proved a different state given the same batches + */ + event ProveNonDeterministicPendingState( + bytes32 storedStateRoot, + bytes32 provedStateRoot + ); + + /** + * @dev Emitted when the trusted aggregator overrides pending state + */ + event OverridePendingState( + uint64 indexed numBatch, + bytes32 stateRoot, + address indexed aggregator + ); + + /** + * @dev Emitted everytime the forkID is updated, this includes the first initialization of the contract + * This event is intended to be emitted for every upgrade of the contract with relevant changes for the nodes + */ + event UpdateZkEVMVersion(uint64 numBatch, uint64 forkID, string version); + + /** + * @param _globalExitRootManager Global exit root manager address + * @param _rollupVerifier Rollup verifier address + * @param _bridgeAddress Bridge address + * @param _chainID L2 chainID + * @param _forkID Fork Id + */ + constructor( + IVerifierRollup _rollupVerifier, + IPolygonZkEVMBridge _bridgeAddress, + uint64 _chainID, + uint64 _forkID + ) { + rollupVerifier = _rollupVerifier; + bridgeAddress = _bridgeAddress; + chainID = _chainID; + forkID = _forkID; + } + + /** + * @param initializePackedParameters Struct to save gas and avoid stack too deep errors + * @param genesisRoot Rollup genesis root + * @param _trustedSequencerURL Trusted sequencer URL + * @param _networkName L2 network name + */ + function initialize( + InitializePackedParameters calldata initializePackedParameters, + bytes32 genesisRoot, + string memory _trustedSequencerURL, + string memory _networkName, + string calldata _version, + IERC20Upgradeable _feeToken + ) external initializer { + admin = initializePackedParameters.admin; + trustedSequencer = initializePackedParameters.trustedSequencer; + trustedAggregator = initializePackedParameters.trustedAggregator; + batchNumToStateRoot[0] = genesisRoot; + trustedSequencerURL = _trustedSequencerURL; + networkName = _networkName; + feeToken =_feeToken + + // Check initialize parameters + if ( + initializePackedParameters.pendingStateTimeout > + _HALT_AGGREGATION_TIMEOUT + ) { + revert PendingStateTimeoutExceedHaltAggregationTimeout(); + } + pendingStateTimeout = initializePackedParameters.pendingStateTimeout; + + if ( + initializePackedParameters.trustedAggregatorTimeout > + _HALT_AGGREGATION_TIMEOUT + ) { + revert TrustedAggregatorTimeoutExceedHaltAggregationTimeout(); + } + + trustedAggregatorTimeout = initializePackedParameters + .trustedAggregatorTimeout; + + // Constant deployment variables + batchFee = 0.1 ether; // 0.1 Matic + verifyBatchTimeTarget = 30 minutes; + multiplierBatchFee = 1002; + forceBatchTimeout = 5 days; + isForcedBatchDisallowed = true; + + // Initialize OZ contracts + __Ownable_init_unchained(); + + // emit version event + emit UpdateZkEVMVersion(0, forkID, _version); + } + + modifier onlyAdmin() { + if (admin != msg.sender) { + revert OnlyAdmin(); + } + _; + } + + modifier onlyTrustedSequencer() { + if (trustedSequencer != msg.sender) { + revert OnlyTrustedSequencer(); + } + _; + } + + modifier onlyTrustedAggregator() { + if (trustedAggregator != msg.sender) { + revert OnlyTrustedAggregator(); + } + _; + } + + modifier isForceBatchAllowed() { + if (isForcedBatchDisallowed) { + revert ForceBatchNotAllowed(); + } + _; + } + + ///////////////////////////////////// + // Sequence/Verify batches functions + //////////////////////////////////// + + /** + * @notice Allows a sequencer to send multiple batches + * @param batches Struct array which holds the necessary data to append new batches to the sequence + * @param l2Coinbase Address that will receive the fees from L2 + */ + function sequenceBatches( + BatchData[] calldata batches, + address l2Coinbase + ) external ifNotEmergencyState onlyTrustedSequencer { + uint256 batchesNum = batches.length; + if (batchesNum == 0) { + revert SequenceZeroBatches(); + } + + if (batchesNum > _MAX_VERIFY_BATCHES) { + // TODO remove? + revert ExceedMaxVerifyBatches(); + } + + // Update global exit root if there are new deposits + bridgeAddress.updateGlobalExitRoot(); + + // Get global batch variables + bytes32 historicGlobalExitRoot = globalExitRootManager.getRoot(); + uint64 currentTimestamp = uint64(block.timestamp); + + // Store storage variables in memory, to save gas, because will be overrided multiple times + uint64 currentBatchSequenced = lastBatchSequenced; + uint64 currentLastForceBatchSequenced = lastForceBatchSequenced; + bytes32 currentAccInputHash = sequencedBatches[currentBatchSequenced] + .accInputHash; + + // Store in a temporal variable, for avoid access again the storage slot + uint64 initLastForceBatchSequenced = currentLastForceBatchSequenced; + + for (uint256 i = 0; i < batchesNum; i++) { + // Load current sequence + BatchData memory currentBatch = batches[i]; + + // Store the current transactions hash since can be used more than once for gas saving + bytes32 currentTransactionsHash = keccak256( + currentBatch.transactions + ); + + // Check if it's a forced batch + if (currentBatch.minForcedTimestamp > 0) { + currentLastForceBatchSequenced++; + + // Check forced data matches + bytes32 hashedForcedBatchData = keccak256( + abi.encodePacked( + currentTransactionsHash, + currentBatch.forcedHistoricGlobalExitRoot, + currentBatch.minForcedTimestamp + ) + ); + + if ( + hashedForcedBatchData != + forcedBatches[currentLastForceBatchSequenced] + ) { + revert ForcedDataDoesNotMatch(); + } + + // Calculate next accumulated input hash + currentAccInputHash = keccak256( + abi.encodePacked( + currentAccInputHash, + currentTransactionsHash, + currentBatch.forcedHistoricGlobalExitRoot, + currentBatch.minForcedTimestamp, + l2Coinbase, + _IS_FORCED_BATCH + ) + ); + + // Delete forceBatch data since won't be used anymore + delete forcedBatches[currentLastForceBatchSequenced]; + } else { + // These checks are already done in the forceBatches call + if ( + currentBatch.transactions.length > + _MAX_TRANSACTIONS_BYTE_LENGTH + ) { + revert TransactionsLengthAboveMax(); + } + + // Calculate next accumulated input hash + currentAccInputHash = keccak256( + abi.encodePacked( + currentAccInputHash, + currentTransactionsHash, + historicGlobalExitRoot, + currentTimestamp, + l2Coinbase, + _IS_NOT_FORCED_BATCH + ) + ); + } + } + // Update currentBatchSequenced + currentBatchSequenced += uint64(batchesNum); + + // Sanity check, should be unreachable + if (currentLastForceBatchSequenced > lastForceBatch) { + revert ForceBatchesOverflow(); + } + + // Update sequencedBatches mapping + sequencedBatches[currentBatchSequenced] = SequencedBatchData({ + accInputHash: currentAccInputHash, + sequencedTimestamp: uint64(block.timestamp), + previousLastBatchSequenced: lastBatchSequenced + }); + + // Store back the storage variables + lastBatchSequenced = currentBatchSequenced; + + uint256 nonForcedBatchesSequenced = batchesNum; + + // Check if there has been forced batches + if (currentLastForceBatchSequenced != initLastForceBatchSequenced) { + // substract forced batches + nonForcedBatchesSequenced -= + currentLastForceBatchSequenced - + initLastForceBatchSequenced; + + // Store new last force batch sequenced + lastForceBatchSequenced = currentLastForceBatchSequenced; + } + + // Pay collateral for every non-forced batch submitted + matic.safeTransferFrom( + msg.sender, + address(this), + batchFee * nonForcedBatchesSequenced + ); + + // Consolidate pending state if possible + _tryConsolidatePendingState(); + + emit SequenceBatches(currentBatchSequenced); + } + + /** + * @notice Allows an aggregator to verify multiple batches + * @param pendingStateNum Init pending state, 0 if consolidated state is used + * @param initNumBatch Batch which the aggregator starts the verification + * @param finalNewBatch Last batch aggregator intends to verify + * @param newLocalExitRoot New local exit root once the batch is processed + * @param newStateRoot New State root once the batch is processed + * @param proof fflonk proof + */ + function verifyBatches( + uint64 pendingStateNum, + uint64 initNumBatch, + uint64 finalNewBatch, + bytes32 newLocalExitRoot, + bytes32 newStateRoot, + bytes32[24] calldata proof + ) external ifNotEmergencyState { + // Check if the trusted aggregator timeout expired, + // Note that the sequencedBatches struct must exists for this finalNewBatch, if not newAccInputHash will be 0 + if ( + sequencedBatches[finalNewBatch].sequencedTimestamp + + trustedAggregatorTimeout > + block.timestamp + ) { + revert TrustedAggregatorTimeoutNotExpired(); + } + + if (finalNewBatch - initNumBatch > _MAX_VERIFY_BATCHES) { + revert ExceedMaxVerifyBatches(); + } + + _verifyAndRewardBatches( + pendingStateNum, + initNumBatch, + finalNewBatch, + newLocalExitRoot, + newStateRoot, + proof + ); + + // Update batch fees + _updateBatchFee(finalNewBatch); + + if (pendingStateTimeout == 0) { + // Consolidate state + lastVerifiedBatch = finalNewBatch; + batchNumToStateRoot[finalNewBatch] = newStateRoot; + + // Clean pending state if any + if (lastPendingState > 0) { + lastPendingState = 0; + lastPendingStateConsolidated = 0; + } + + // Interact with globalExitRootManager + globalExitRootManager.updateExitRoot(newLocalExitRoot); + } else { + // Consolidate pending state if possible + _tryConsolidatePendingState(); + + // Update pending state + lastPendingState++; + pendingStateTransitions[lastPendingState] = PendingState({ + timestamp: uint64(block.timestamp), + lastVerifiedBatch: finalNewBatch, + exitRoot: newLocalExitRoot, + stateRoot: newStateRoot + }); + } + + emit VerifyBatches(finalNewBatch, newStateRoot, msg.sender); + } + + /** + * @notice Allows an aggregator to verify multiple batches + * @param pendingStateNum Init pending state, 0 if consolidated state is used + * @param initNumBatch Batch which the aggregator starts the verification + * @param finalNewBatch Last batch aggregator intends to verify + * @param newLocalExitRoot New local exit root once the batch is processed + * @param newStateRoot New State root once the batch is processed + * @param proof fflonk proof + */ + function verifyBatchesTrustedAggregator( + uint64 pendingStateNum, + uint64 initNumBatch, + uint64 finalNewBatch, + bytes32 newLocalExitRoot, + bytes32 newStateRoot, + bytes32[24] calldata proof + ) external onlyTrustedAggregator { + _verifyAndRewardBatches( + pendingStateNum, + initNumBatch, + finalNewBatch, + newLocalExitRoot, + newStateRoot, + proof + ); + + // Consolidate state + lastVerifiedBatch = finalNewBatch; + batchNumToStateRoot[finalNewBatch] = newStateRoot; + + // Clean pending state if any + if (lastPendingState > 0) { + lastPendingState = 0; + lastPendingStateConsolidated = 0; + } + + // Interact with globalExitRootManager + globalExitRootManager.updateExitRoot(newLocalExitRoot); + + emit VerifyBatchesTrustedAggregator( + finalNewBatch, + newStateRoot, + msg.sender + ); + } + + /** + * @notice Verify and reward batches internal function + * @param pendingStateNum Init pending state, 0 if consolidated state is used + * @param initNumBatch Batch which the aggregator starts the verification + * @param finalNewBatch Last batch aggregator intends to verify + * @param newLocalExitRoot New local exit root once the batch is processed + * @param newStateRoot New State root once the batch is processed + * @param proof fflonk proof + */ + function _verifyAndRewardBatches( + uint64 pendingStateNum, + uint64 initNumBatch, + uint64 finalNewBatch, + bytes32 newLocalExitRoot, + bytes32 newStateRoot, + bytes32[24] calldata proof + ) internal virtual { + bytes32 oldStateRoot; + uint64 currentLastVerifiedBatch = getLastVerifiedBatch(); + + // Use pending state if specified, otherwise use consolidated state + if (pendingStateNum != 0) { + // Check that pending state exist + // Already consolidated pending states can be used aswell + if (pendingStateNum > lastPendingState) { + revert PendingStateDoesNotExist(); + } + + // Check choosen pending state + PendingState storage currentPendingState = pendingStateTransitions[ + pendingStateNum + ]; + + // Get oldStateRoot from pending batch + oldStateRoot = currentPendingState.stateRoot; + + // Check initNumBatch matches the pending state + if (initNumBatch != currentPendingState.lastVerifiedBatch) { + revert InitNumBatchDoesNotMatchPendingState(); + } + } else { + // Use consolidated state + oldStateRoot = batchNumToStateRoot[initNumBatch]; + + if (oldStateRoot == bytes32(0)) { + revert OldStateRootDoesNotExist(); + } + + // Check initNumBatch is inside the range, sanity check + if (initNumBatch > currentLastVerifiedBatch) { + revert InitNumBatchAboveLastVerifiedBatch(); + } + } + + // Check final batch + if (finalNewBatch <= currentLastVerifiedBatch) { + revert FinalNumBatchBelowLastVerifiedBatch(); + } + + // Get snark bytes + bytes memory snarkHashBytes = getInputSnarkBytes( + initNumBatch, + finalNewBatch, + newLocalExitRoot, + oldStateRoot, + newStateRoot + ); + + // Calulate the snark input + uint256 inputSnark = uint256(sha256(snarkHashBytes)) % _RFIELD; + // Verify proof + if (!rollupVerifier.verifyProof(proof, [inputSnark])) { + revert InvalidProof(); + } + + // Get MATIC reward + matic.safeTransfer( + msg.sender, + calculateRewardPerBatch() * + (finalNewBatch - currentLastVerifiedBatch) + ); + } + + /** + * @notice Internal function to consolidate the state automatically once sequence or verify batches are called + * It tries to consolidate the first and the middle pending state in the queue + */ + function _tryConsolidatePendingState() internal { + // Check if there's any state to consolidate + if (lastPendingState > lastPendingStateConsolidated) { + // Check if it's possible to consolidate the next pending state + uint64 nextPendingState = lastPendingStateConsolidated + 1; + if (isPendingStateConsolidable(nextPendingState)) { + // Check middle pending state ( binary search of 1 step) + uint64 middlePendingState = nextPendingState + + (lastPendingState - nextPendingState) / + 2; + + // Try to consolidate it, and if not, consolidate the nextPendingState + if (isPendingStateConsolidable(middlePendingState)) { + _consolidatePendingState(middlePendingState); + } else { + _consolidatePendingState(nextPendingState); + } + } + } + } + + /** + * @notice Allows to consolidate any pending state that has already exceed the pendingStateTimeout + * Can be called by the trusted aggregator, which can consolidate any state without the timeout restrictions + * @param pendingStateNum Pending state to consolidate + */ + function consolidatePendingState(uint64 pendingStateNum) external { + // Check if pending state can be consolidated + // If trusted aggregator is the sender, do not check the timeout or the emergency state + if (msg.sender != trustedAggregator) { + if (isEmergencyState) { + revert OnlyNotEmergencyState(); + } + + if (!isPendingStateConsolidable(pendingStateNum)) { + revert PendingStateNotConsolidable(); + } + } + _consolidatePendingState(pendingStateNum); + } + + /** + * @notice Internal function to consolidate any pending state that has already exceed the pendingStateTimeout + * @param pendingStateNum Pending state to consolidate + */ + function _consolidatePendingState(uint64 pendingStateNum) internal { + // Check if pendingStateNum is in correct range + // - not consolidated (implicity checks that is not 0) + // - exist ( has been added) + if ( + pendingStateNum <= lastPendingStateConsolidated || + pendingStateNum > lastPendingState + ) { + revert PendingStateInvalid(); + } + + PendingState storage currentPendingState = pendingStateTransitions[ + pendingStateNum + ]; + + // Update state + uint64 newLastVerifiedBatch = currentPendingState.lastVerifiedBatch; + lastVerifiedBatch = newLastVerifiedBatch; + batchNumToStateRoot[newLastVerifiedBatch] = currentPendingState + .stateRoot; + + // Update pending state + lastPendingStateConsolidated = pendingStateNum; + + // Interact with globalExitRootManager + globalExitRootManager.updateExitRoot(currentPendingState.exitRoot); + + emit ConsolidatePendingState( + newLastVerifiedBatch, + currentPendingState.stateRoot, + pendingStateNum + ); + } + + /** + * @notice 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 + * @param newLastVerifiedBatch New last verified batch + */ + function _updateBatchFee(uint64 newLastVerifiedBatch) internal { + uint64 currentLastVerifiedBatch = getLastVerifiedBatch(); + uint64 currentBatch = newLastVerifiedBatch; + + uint256 totalBatchesAboveTarget; + uint256 newBatchesVerified = newLastVerifiedBatch - + currentLastVerifiedBatch; + + uint256 targetTimestamp = block.timestamp - verifyBatchTimeTarget; + + while (currentBatch != currentLastVerifiedBatch) { + // Load sequenced batchdata + SequencedBatchData + storage currentSequencedBatchData = sequencedBatches[ + currentBatch + ]; + + // Check if timestamp is below the verifyBatchTimeTarget + if ( + targetTimestamp < currentSequencedBatchData.sequencedTimestamp + ) { + // update currentBatch + currentBatch = currentSequencedBatchData + .previousLastBatchSequenced; + } else { + // The rest of batches will be above + totalBatchesAboveTarget = + currentBatch - + currentLastVerifiedBatch; + break; + } + } + + uint256 totalBatchesBelowTarget = newBatchesVerified - + totalBatchesAboveTarget; + + // _MAX_BATCH_FEE --> (< 70 bits) + // multiplierBatchFee --> (< 10 bits) + // _MAX_BATCH_MULTIPLIER = 12 + // multiplierBatchFee ** _MAX_BATCH_MULTIPLIER --> (< 128 bits) + // batchFee * (multiplierBatchFee ** _MAX_BATCH_MULTIPLIER)--> + // (< 70 bits) * (< 128 bits) = < 256 bits + + // Since all the following operations cannot overflow, we can optimize this operations with unchecked + unchecked { + if (totalBatchesBelowTarget < totalBatchesAboveTarget) { + // There are more batches above target, fee is multiplied + uint256 diffBatches = totalBatchesAboveTarget - + totalBatchesBelowTarget; + + diffBatches = diffBatches > _MAX_BATCH_MULTIPLIER + ? _MAX_BATCH_MULTIPLIER + : diffBatches; + + // For every multiplierBatchFee multiplication we must shift 3 zeroes since we have 3 decimals + batchFee = + (batchFee * (uint256(multiplierBatchFee) ** diffBatches)) / + (uint256(1000) ** diffBatches); + } else { + // There are more batches below target, fee is divided + uint256 diffBatches = totalBatchesBelowTarget - + totalBatchesAboveTarget; + + diffBatches = diffBatches > _MAX_BATCH_MULTIPLIER + ? _MAX_BATCH_MULTIPLIER + : diffBatches; + + // For every multiplierBatchFee multiplication we must shift 3 zeroes since we have 3 decimals + uint256 accDivisor = (uint256(1 ether) * + (uint256(multiplierBatchFee) ** diffBatches)) / + (uint256(1000) ** diffBatches); + + // multiplyFactor = multiplierBatchFee ** diffBatches / 10 ** (diffBatches * 3) + // accDivisor = 1E18 * multiplyFactor + // 1E18 * batchFee / accDivisor = batchFee / multiplyFactor + // < 60 bits * < 70 bits / ~60 bits --> overflow not possible + batchFee = (uint256(1 ether) * batchFee) / accDivisor; + } + } + + // Batch fee must remain inside a range + if (batchFee > _MAX_BATCH_FEE) { + batchFee = _MAX_BATCH_FEE; + } else if (batchFee < _MIN_BATCH_FEE) { + batchFee = _MIN_BATCH_FEE; + } + } + + //////////////////////////// + // Force batches functions + //////////////////////////// + + /** + * @notice 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 + * @param transactions L2 ethereum transactions EIP-155 or pre-EIP-155 with signature: + * @param maticAmount Max amount of MATIC tokens that the sender is willing to pay + */ + function forceBatch( + bytes calldata transactions, + uint256 maticAmount + ) public isForceBatchAllowed ifNotEmergencyState { + // Calculate matic collateral + uint256 maticFee = getForcedBatchFee(); + + if (maticFee > maticAmount) { + revert NotEnoughMaticAmount(); + } + + if (transactions.length > _MAX_FORCE_BATCH_BYTE_LENGTH) { + revert TransactionsLengthAboveMax(); + } + + matic.safeTransferFrom(msg.sender, address(this), maticFee); + + // Get historic global exit root + bytes32 historicGlobalExitRoot = globalExitRootManager.getRoot(); + + // Update forcedBatches mapping + lastForceBatch++; + + forcedBatches[lastForceBatch] = keccak256( + abi.encodePacked( + keccak256(transactions), + historicGlobalExitRoot, + uint64(block.timestamp) + ) + ); + + if (msg.sender == tx.origin) { + // Getting the calldata from an EOA is easy so no need to put the `transactions` in the event + emit ForceBatch( + lastForceBatch, + historicGlobalExitRoot, + msg.sender, + "" + ); + } else { + // Getting internal transaction calldata is complicated (because it requires an archive node) + // Therefore it's worth it to put the `transactions` in the event, which is easy to query + emit ForceBatch( + lastForceBatch, + historicGlobalExitRoot, + msg.sender, + transactions + ); + } + } + + /** + * @notice Allows anyone to sequence forced Batches if the trusted sequencer has not done so in the timeout period + * @param batches Struct array which holds the necessary data to append force batches + */ + function sequenceForceBatches( + BatchData[] calldata batches + ) external isForceBatchAllowed ifNotEmergencyState { + uint256 batchesNum = batches.length; + + if (batchesNum == 0) { + revert SequenceZeroBatches(); + } + + if (batchesNum > _MAX_VERIFY_BATCHES) { + revert ExceedMaxVerifyBatches(); + } + + if ( + uint256(lastForceBatchSequenced) + batchesNum > + uint256(lastForceBatch) + ) { + revert ForceBatchesOverflow(); + } + + // Store storage variables in memory, to save gas, because will be overrided multiple times + uint64 currentBatchSequenced = lastBatchSequenced; + uint64 currentLastForceBatchSequenced = lastForceBatchSequenced; + bytes32 currentAccInputHash = sequencedBatches[currentBatchSequenced] + .accInputHash; + + // Sequence force batches + for (uint256 i = 0; i < batchesNum; i++) { + // Load current sequence + BatchData memory currentBatch = batches[i]; + currentLastForceBatchSequenced++; + + // Store the current transactions hash since it's used more than once for gas saving + bytes32 currentTransactionsHash = keccak256( + currentBatch.transactions + ); + + // Check forced data matches + bytes32 hashedForcedBatchData = keccak256( + abi.encodePacked( + currentTransactionsHash, + currentBatch.forcedHistoricGlobalExitRoot, + currentBatch.minForcedTimestamp + ) + ); + + if ( + hashedForcedBatchData != + forcedBatches[currentLastForceBatchSequenced] + ) { + revert ForcedDataDoesNotMatch(); + } + + // Delete forceBatch data since won't be used anymore + delete forcedBatches[currentLastForceBatchSequenced]; + + if (i == (batchesNum - 1)) { + // The last batch will have the most restrictive timestamp + if ( + currentBatch.minForcedTimestamp + forceBatchTimeout > + block.timestamp + ) { + revert ForceBatchTimeoutNotExpired(); + } + } + + // Calculate next acc input hash + currentAccInputHash = keccak256( + abi.encodePacked( + currentAccInputHash, + currentTransactionsHash, + currentBatch.forcedHistoricGlobalExitRoot, + currentBatch.minForcedTimestamp, // could be current timestamp + msg.sender, + _IS_FORCED_BATCH + ) + ); + } + // Update currentBatchSequenced + currentBatchSequenced += uint64(batchesNum); + + // Store back the storage variables + sequencedBatches[currentBatchSequenced] = SequencedBatchData({ + accInputHash: currentAccInputHash, + sequencedTimestamp: uint64(block.timestamp), + previousLastBatchSequenced: lastBatchSequenced + }); + lastBatchSequenced = currentBatchSequenced; + lastForceBatchSequenced = currentLastForceBatchSequenced; + + emit SequenceForceBatches(currentBatchSequenced); + } + + ////////////////// + // admin functions + ////////////////// + + /** + * @notice Allow the admin to set a new trusted sequencer + * @param newTrustedSequencer Address of the new trusted sequencer + */ + function setTrustedSequencer( + address newTrustedSequencer + ) external onlyAdmin { + trustedSequencer = newTrustedSequencer; + + emit SetTrustedSequencer(newTrustedSequencer); + } + + /** + * @notice Allow the admin to set the trusted sequencer URL + * @param newTrustedSequencerURL URL of trusted sequencer + */ + function setTrustedSequencerURL( + string memory newTrustedSequencerURL + ) external onlyAdmin { + trustedSequencerURL = newTrustedSequencerURL; + + emit SetTrustedSequencerURL(newTrustedSequencerURL); + } + + /** + * @notice Allow the admin to set a new trusted aggregator address + * @param newTrustedAggregator Address of the new trusted aggregator + */ + function setTrustedAggregator( + address newTrustedAggregator + ) external onlyAdmin { + trustedAggregator = newTrustedAggregator; + + emit SetTrustedAggregator(newTrustedAggregator); + } + + /** + * @notice Allow the admin to set a new pending state timeout + * The timeout can only be lowered, except if emergency state is active + * @param newTrustedAggregatorTimeout Trusted aggregator timeout + */ + function setTrustedAggregatorTimeout( + uint64 newTrustedAggregatorTimeout + ) external onlyAdmin { + if (newTrustedAggregatorTimeout > _HALT_AGGREGATION_TIMEOUT) { + revert TrustedAggregatorTimeoutExceedHaltAggregationTimeout(); + } + + if (!isEmergencyState) { + if (newTrustedAggregatorTimeout >= trustedAggregatorTimeout) { + revert NewTrustedAggregatorTimeoutMustBeLower(); + } + } + + trustedAggregatorTimeout = newTrustedAggregatorTimeout; + emit SetTrustedAggregatorTimeout(newTrustedAggregatorTimeout); + } + + /** + * @notice Allow the admin to set a new trusted aggregator timeout + * The timeout can only be lowered, except if emergency state is active + * @param newPendingStateTimeout Trusted aggregator timeout + */ + function setPendingStateTimeout( + uint64 newPendingStateTimeout + ) external onlyAdmin { + if (newPendingStateTimeout > _HALT_AGGREGATION_TIMEOUT) { + revert PendingStateTimeoutExceedHaltAggregationTimeout(); + } + + if (!isEmergencyState) { + if (newPendingStateTimeout >= pendingStateTimeout) { + revert NewPendingStateTimeoutMustBeLower(); + } + } + + pendingStateTimeout = newPendingStateTimeout; + emit SetPendingStateTimeout(newPendingStateTimeout); + } + + /** + * @notice Allow the admin to set a new multiplier batch fee + * @param newMultiplierBatchFee multiplier batch fee + */ + function setMultiplierBatchFee( + uint16 newMultiplierBatchFee + ) external onlyAdmin { + if (newMultiplierBatchFee < 1000 || newMultiplierBatchFee > 1023) { + revert InvalidRangeMultiplierBatchFee(); + } + + multiplierBatchFee = newMultiplierBatchFee; + emit SetMultiplierBatchFee(newMultiplierBatchFee); + } + + /** + * @notice 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 + * @param newVerifyBatchTimeTarget Verify batch time target + */ + function setVerifyBatchTimeTarget( + uint64 newVerifyBatchTimeTarget + ) external onlyAdmin { + if (newVerifyBatchTimeTarget > 1 days) { + revert InvalidRangeBatchTimeTarget(); + } + verifyBatchTimeTarget = newVerifyBatchTimeTarget; + emit SetVerifyBatchTimeTarget(newVerifyBatchTimeTarget); + } + + /** + * @notice Allow the admin to set the forcedBatchTimeout + * The new value can only be lower, except if emergency state is active + * @param newforceBatchTimeout New force batch timeout + */ + function setForceBatchTimeout( + uint64 newforceBatchTimeout + ) external onlyAdmin { + if (newforceBatchTimeout > _HALT_AGGREGATION_TIMEOUT) { + revert InvalidRangeForceBatchTimeout(); + } + + if (!isEmergencyState) { + if (newforceBatchTimeout >= forceBatchTimeout) { + revert InvalidRangeForceBatchTimeout(); + } + } + + forceBatchTimeout = newforceBatchTimeout; + emit SetForceBatchTimeout(newforceBatchTimeout); + } + + /** + * @notice Allow the admin to turn on the force batches + * This action is not reversible + */ + function activateForceBatches() external onlyAdmin { + if (!isForcedBatchDisallowed) { + revert ForceBatchesAlreadyActive(); + } + isForcedBatchDisallowed = false; + emit ActivateForceBatches(); + } + + /** + * @notice Starts the admin role transfer + * This is a two step process, the pending admin must accepted to finalize the process + * @param newPendingAdmin Address of the new pending admin + */ + function transferAdminRole(address newPendingAdmin) external onlyAdmin { + pendingAdmin = newPendingAdmin; + emit TransferAdminRole(newPendingAdmin); + } + + /** + * @notice Allow the current pending admin to accept the admin role + */ + function acceptAdminRole() external { + if (pendingAdmin != msg.sender) { + revert OnlyPendingAdmin(); + } + + admin = pendingAdmin; + emit AcceptAdminRole(pendingAdmin); + } + + ///////////////////////////////// + // Soundness protection functions + ///////////////////////////////// + + /** + * @notice Allows the trusted aggregator to override the pending state + * if it's possible to prove a different state root given the same batches + * @param initPendingStateNum Init pending state, 0 if consolidated state is used + * @param finalPendingStateNum Final pending state, that will be used to compare with the newStateRoot + * @param initNumBatch Batch which the aggregator starts the verification + * @param finalNewBatch Last batch aggregator intends to verify + * @param newLocalExitRoot New local exit root once the batch is processed + * @param newStateRoot New State root once the batch is processed + * @param proof fflonk proof + */ + function overridePendingState( + uint64 initPendingStateNum, + uint64 finalPendingStateNum, + uint64 initNumBatch, + uint64 finalNewBatch, + bytes32 newLocalExitRoot, + bytes32 newStateRoot, + bytes32[24] calldata proof + ) external onlyTrustedAggregator { + _proveDistinctPendingState( + initPendingStateNum, + finalPendingStateNum, + initNumBatch, + finalNewBatch, + newLocalExitRoot, + newStateRoot, + proof + ); + + // Consolidate state state + lastVerifiedBatch = finalNewBatch; + batchNumToStateRoot[finalNewBatch] = newStateRoot; + + // Clean pending state if any + if (lastPendingState > 0) { + lastPendingState = 0; + lastPendingStateConsolidated = 0; + } + + // Interact with globalExitRootManager + globalExitRootManager.updateExitRoot(newLocalExitRoot); + + // Update trusted aggregator timeout to max + trustedAggregatorTimeout = _HALT_AGGREGATION_TIMEOUT; + + emit OverridePendingState(finalNewBatch, newStateRoot, msg.sender); + } + + /** + * @notice Allows to halt the PolygonZkEVM if its possible to prove a different state root given the same batches + * @param initPendingStateNum Init pending state, 0 if consolidated state is used + * @param finalPendingStateNum Final pending state, that will be used to compare with the newStateRoot + * @param initNumBatch Batch which the aggregator starts the verification + * @param finalNewBatch Last batch aggregator intends to verify + * @param newLocalExitRoot New local exit root once the batch is processed + * @param newStateRoot New State root once the batch is processed + * @param proof fflonk proof + */ + function proveNonDeterministicPendingState( + uint64 initPendingStateNum, + uint64 finalPendingStateNum, + uint64 initNumBatch, + uint64 finalNewBatch, + bytes32 newLocalExitRoot, + bytes32 newStateRoot, + bytes32[24] calldata proof + ) external ifNotEmergencyState { + _proveDistinctPendingState( + initPendingStateNum, + finalPendingStateNum, + initNumBatch, + finalNewBatch, + newLocalExitRoot, + newStateRoot, + proof + ); + + emit ProveNonDeterministicPendingState( + batchNumToStateRoot[finalNewBatch], + newStateRoot + ); + + // Activate emergency state + _activateEmergencyState(); + } + + /** + * @notice Internal function that proves a different state root given the same batches to verify + * @param initPendingStateNum Init pending state, 0 if consolidated state is used + * @param finalPendingStateNum Final pending state, that will be used to compare with the newStateRoot + * @param initNumBatch Batch which the aggregator starts the verification + * @param finalNewBatch Last batch aggregator intends to verify + * @param newLocalExitRoot New local exit root once the batch is processed + * @param newStateRoot New State root once the batch is processed + * @param proof fflonk proof + */ + function _proveDistinctPendingState( + uint64 initPendingStateNum, + uint64 finalPendingStateNum, + uint64 initNumBatch, + uint64 finalNewBatch, + bytes32 newLocalExitRoot, + bytes32 newStateRoot, + bytes32[24] calldata proof + ) internal view virtual { + bytes32 oldStateRoot; + + // Use pending state if specified, otherwise use consolidated state + if (initPendingStateNum != 0) { + // Check that pending state exist + // Already consolidated pending states can be used aswell + if (initPendingStateNum > lastPendingState) { + revert PendingStateDoesNotExist(); + } + + // Check choosen pending state + PendingState storage initPendingState = pendingStateTransitions[ + initPendingStateNum + ]; + + // Get oldStateRoot from init pending state + oldStateRoot = initPendingState.stateRoot; + + // Check initNumBatch matches the init pending state + if (initNumBatch != initPendingState.lastVerifiedBatch) { + revert InitNumBatchDoesNotMatchPendingState(); + } + } else { + // Use consolidated state + oldStateRoot = batchNumToStateRoot[initNumBatch]; + if (oldStateRoot == bytes32(0)) { + revert OldStateRootDoesNotExist(); + } + + // Check initNumBatch is inside the range, sanity check + if (initNumBatch > lastVerifiedBatch) { + revert InitNumBatchAboveLastVerifiedBatch(); + } + } + + // Assert final pending state num is in correct range + // - exist ( has been added) + // - bigger than the initPendingstate + // - not consolidated + if ( + finalPendingStateNum > lastPendingState || + finalPendingStateNum <= initPendingStateNum || + finalPendingStateNum <= lastPendingStateConsolidated + ) { + revert FinalPendingStateNumInvalid(); + } + + // Check final num batch + if ( + finalNewBatch != + pendingStateTransitions[finalPendingStateNum].lastVerifiedBatch + ) { + revert FinalNumBatchDoesNotMatchPendingState(); + } + + // Get snark bytes + bytes memory snarkHashBytes = getInputSnarkBytes( + initNumBatch, + finalNewBatch, + newLocalExitRoot, + oldStateRoot, + newStateRoot + ); + + // Calulate the snark input + uint256 inputSnark = uint256(sha256(snarkHashBytes)) % _RFIELD; + + // Verify proof + if (!rollupVerifier.verifyProof(proof, [inputSnark])) { + revert InvalidProof(); + } + + if ( + pendingStateTransitions[finalPendingStateNum].stateRoot == + newStateRoot + ) { + revert StoredRootMustBeDifferentThanNewRoot(); + } + } + + /** + * @notice 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 + * @param sequencedBatchNum Sequenced batch number that has not been aggreagated in _HALT_AGGREGATION_TIMEOUT + */ + function activateEmergencyState(uint64 sequencedBatchNum) external { + if (msg.sender != owner()) { + // Only check conditions if is not called by the owner + uint64 currentLastVerifiedBatch = getLastVerifiedBatch(); + + // Check that the batch has not been verified + if (sequencedBatchNum <= currentLastVerifiedBatch) { + revert BatchAlreadyVerified(); + } + + // Check that the batch has been sequenced and this was the end of a sequence + if ( + sequencedBatchNum > lastBatchSequenced || + sequencedBatches[sequencedBatchNum].sequencedTimestamp == 0 + ) { + revert BatchNotSequencedOrNotSequenceEnd(); + } + + // Check that has been passed _HALT_AGGREGATION_TIMEOUT since it was sequenced + if ( + sequencedBatches[sequencedBatchNum].sequencedTimestamp + + _HALT_AGGREGATION_TIMEOUT > + block.timestamp + ) { + revert HaltTimeoutNotExpired(); + } + } + _activateEmergencyState(); + } + + /** + * @notice Function to deactivate emergency state on both PolygonZkEVM and PolygonZkEVMBridge contracts + */ + function deactivateEmergencyState() external onlyAdmin { + // Deactivate emergency state on PolygonZkEVMBridge + bridgeAddress.deactivateEmergencyState(); + + // Deactivate emergency state on this contract + super._deactivateEmergencyState(); + } + + /** + * @notice Internal function to activate emergency state on both PolygonZkEVM and PolygonZkEVMBridge contracts + */ + function _activateEmergencyState() internal override { + // Activate emergency state on PolygonZkEVM Bridge + bridgeAddress.activateEmergencyState(); + + // Activate emergency state on this contract + super._activateEmergencyState(); + } + + //////////////////////// + // public/view functions + //////////////////////// + + /** + * @notice Get forced batch fee + */ + function getForcedBatchFee() public view returns (uint256) { + return batchFee * 100; + } + + /** + * @notice Get the last verified batch + */ + function getLastVerifiedBatch() public view returns (uint64) { + if (lastPendingState > 0) { + return pendingStateTransitions[lastPendingState].lastVerifiedBatch; + } else { + return lastVerifiedBatch; + } + } + + /** + * @notice Returns a boolean that indicates if the pendingStateNum is or not consolidable + * Note that his function does not check if the pending state currently exists, or if it's consolidated already + */ + function isPendingStateConsolidable( + uint64 pendingStateNum + ) public view returns (bool) { + return (pendingStateTransitions[pendingStateNum].timestamp + + pendingStateTimeout <= + block.timestamp); + } + + /** + * @notice Function to calculate the reward to verify a single batch + */ + function calculateRewardPerBatch() public view returns (uint256) { + uint256 currentBalance = matic.balanceOf(address(this)); + + // Total Sequenced Batches = forcedBatches to be sequenced (total forced Batches - sequenced Batches) + sequencedBatches + // Total Batches to be verified = Total Sequenced Batches - verified Batches + uint256 totalBatchesToVerify = ((lastForceBatch - + lastForceBatchSequenced) + lastBatchSequenced) - + getLastVerifiedBatch(); + + if (totalBatchesToVerify == 0) return 0; + return currentBalance / totalBatchesToVerify; + } + + /** + * @notice Function to calculate the input snark bytes + * @param initNumBatch Batch which the aggregator starts the verification + * @param finalNewBatch Last batch aggregator intends to verify + * @param newLocalExitRoot New local exit root once the batch is processed + * @param oldStateRoot State root before batch is processed + * @param newStateRoot New State root once the batch is processed + */ + function getInputSnarkBytes( + uint64 initNumBatch, + uint64 finalNewBatch, + bytes32 newLocalExitRoot, + bytes32 oldStateRoot, + bytes32 newStateRoot + ) public view returns (bytes memory) { + // sanity checks + bytes32 oldAccInputHash = sequencedBatches[initNumBatch].accInputHash; + bytes32 newAccInputHash = sequencedBatches[finalNewBatch].accInputHash; + + if (initNumBatch != 0 && oldAccInputHash == bytes32(0)) { + revert OldAccInputHashDoesNotExist(); + } + + if (newAccInputHash == bytes32(0)) { + revert NewAccInputHashDoesNotExist(); + } + + // Check that new state root is inside goldilocks field + if (!checkStateRootInsidePrime(uint256(newStateRoot))) { + revert NewStateRootNotInsidePrime(); + } + + return + abi.encodePacked( + msg.sender, + oldStateRoot, + oldAccInputHash, + initNumBatch, + chainID, + forkID, + newStateRoot, + newAccInputHash, + newLocalExitRoot, + finalNewBatch + ); + } + + function checkStateRootInsidePrime( + uint256 newStateRoot + ) public pure returns (bool) { + if ( + ((newStateRoot & _MAX_UINT_64) < _GOLDILOCKS_PRIME_FIELD) && + (((newStateRoot >> 64) & _MAX_UINT_64) < _GOLDILOCKS_PRIME_FIELD) && + (((newStateRoot >> 128) & _MAX_UINT_64) < + _GOLDILOCKS_PRIME_FIELD) && + ((newStateRoot >> 192) < _GOLDILOCKS_PRIME_FIELD) + ) { + return true; + } else { + return false; + } + } +} From d2d947ec6f049827872b4325f2d335224cfccdf7 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Thu, 31 Aug 2023 09:52:55 +0200 Subject: [PATCH 015/230] continue --- contracts/v2/PolygonZkEVMV2.sol | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/contracts/v2/PolygonZkEVMV2.sol b/contracts/v2/PolygonZkEVMV2.sol index 66dfd84e9..2b0b3f01c 100644 --- a/contracts/v2/PolygonZkEVMV2.sol +++ b/contracts/v2/PolygonZkEVMV2.sol @@ -72,15 +72,13 @@ contract PolygonZkEVMV2 is * @notice Struct to call initialize, this saves gas because pack the parameters and avoid stack too deep errors. * @param admin Admin address * @param trustedSequencer Trusted sequencer address - * @param pendingStateTimeout Pending state timeout * @param trustedAggregator Trusted aggregator * @param trustedAggregatorTimeout Trusted aggregator timeout */ struct InitializePackedParameters { address admin; address trustedSequencer; - uint64 pendingStateTimeout; - address trustedAggregator; + address trustedAggregator; //¿?¿?¿?¿? uint64 trustedAggregatorTimeout; } @@ -357,22 +355,21 @@ contract PolygonZkEVMV2 is */ event UpdateZkEVMVersion(uint64 numBatch, uint64 forkID, string version); + + // General parameters that will have all networks that deploys this contract + + /** - * @param _globalExitRootManager Global exit root manager address * @param _rollupVerifier Rollup verifier address - * @param _bridgeAddress Bridge address - * @param _chainID L2 chainID - * @param _forkID Fork Id + * @param _rollupManager Global exit root manager address + * @param _forkID Fork ID */ constructor( IVerifierRollup _rollupVerifier, - IPolygonZkEVMBridge _bridgeAddress, - uint64 _chainID, - uint64 _forkID + IRollupManager _rollupManager ) { rollupVerifier = _rollupVerifier; - bridgeAddress = _bridgeAddress; - chainID = _chainID; + rollupManager = _rollupManager; forkID = _forkID; } @@ -381,6 +378,7 @@ contract PolygonZkEVMV2 is * @param genesisRoot Rollup genesis root * @param _trustedSequencerURL Trusted sequencer URL * @param _networkName L2 network name + * @param _chainID L2 chainID */ function initialize( InitializePackedParameters calldata initializePackedParameters, @@ -388,7 +386,9 @@ contract PolygonZkEVMV2 is string memory _trustedSequencerURL, string memory _networkName, string calldata _version, - IERC20Upgradeable _feeToken + IERC20Upgradeable _feeToken, + uint64 _chainID, + uint64 _forkID ) external initializer { admin = initializePackedParameters.admin; trustedSequencer = initializePackedParameters.trustedSequencer; @@ -424,6 +424,9 @@ contract PolygonZkEVMV2 is forceBatchTimeout = 5 days; isForcedBatchDisallowed = true; + chainID = _chainID; + forkID = _forkID; + // Initialize OZ contracts __Ownable_init_unchained(); From 21bcf594bc2cd0a2af660a7099dcbd5428c86085 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Thu, 21 Sep 2023 16:06:46 +0200 Subject: [PATCH 016/230] first approach --- compiled-contracts/PolygonZkEVM.json | 41 +- compiled-contracts/PolygonZkEVMBridge.json | 30 +- .../PolygonZkEVMBridgeMock.json | 30 +- .../PolygonZkEVMGlobalExitRoot.json | 69 +- .../PolygonZkEVMGlobalExitRootMock.json | 69 +- compiled-contracts/PolygonZkEVMMock.json | 46 +- compiled-contracts/PolygonZkEVMTimelock.json | 4 +- contracts/PolygonZkEVMGlobalExitRoot.sol | 5 + .../interfaces/IPolygonRollupManager.sol | 222 ++- .../interfaces/IPolygonZkEVMBridgeV2.sol | 118 ++ .../interfaces/IPolygonZkEVMV2Errors.sol | 15 + contracts/v2/PolygonRollupManager.sol | 1465 +++++++++++++++++ contracts/v2/PolygonStateManager.sol | 167 -- contracts/v2/PolygonZkEVMBridgeV2.sol | 6 +- contracts/v2/PolygonZkEVMGlobalExitRootV2.sol | 64 +- contracts/v2/PolygonZkEVMV2.sol | 796 +-------- docs/v2/PolygonRollupManager.md | 643 +++++++- docs/v2/PolygonZkEVMBridgeV2.md | 364 ++++ docs/v2/PolygonZkEVMGlobalExitRootV2.md | 17 + docs/v2/PolygonZkEVMV2.md | 426 +++++ 20 files changed, 3397 insertions(+), 1200 deletions(-) create mode 100644 contracts/interfaces/IPolygonZkEVMBridgeV2.sol create mode 100644 contracts/interfaces/IPolygonZkEVMV2Errors.sol create mode 100644 contracts/v2/PolygonRollupManager.sol delete mode 100644 contracts/v2/PolygonStateManager.sol create mode 100644 docs/v2/PolygonZkEVMBridgeV2.md create mode 100644 docs/v2/PolygonZkEVMV2.md 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 d1e9e6cdd..da2451474 100644 --- a/compiled-contracts/PolygonZkEVMBridge.json +++ b/compiled-contracts/PolygonZkEVMBridge.json @@ -459,6 +459,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "getDepositRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -508,19 +521,6 @@ "stateMutability": "pure", "type": "function" }, - { - "inputs": [], - "name": "getRoot", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -776,8 +776,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561000f575f80fd5b50615b1f8061001d5f395ff3fe60806040526004361062000197575f3560e01c8063647c576c11620000e2578063be5831c71162000086578063dbc16976116200005e578063dbc16976146200061a578063ee25560b1462000631578063fb5708341462000660575f80fd5b8063be5831c71462000591578063cd58657914620005cc578063d02103ca14620005e3575f80fd5b80639e34070f11620000ba5780639e34070f14620004f1578063aaa13cc21462000534578063bab161bf1462000558575f80fd5b8063647c576c146200047157806379e2cf97146200049557806381b1c17414620004ac575f80fd5b80632d2c9d94116200014a57806334ac9cf2116200012257806334ac9cf2146200033a5780633e19704314620003685780635ca1e165146200045a575f80fd5b80632d2c9d9414620002695780632dfdf0b5146200028d578063318aee3d14620002b3575f80fd5b806322e95f2c116200017e57806322e95f2c14620001e4578063240ff378146200022e5780632cffd02e1462000245575f80fd5b806315064c96146200019b5780632072f6c514620001cb575b5f80fd5b348015620001a7575f80fd5b50606854620001b69060ff1681565b60405190151581526020015b60405180910390f35b348015620001d7575f80fd5b50620001e262000684565b005b348015620001f0575f80fd5b5062000208620002023660046200323f565b620006e2565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001c2565b620001e26200023f366004620032cf565b62000784565b34801562000251575f80fd5b50620001e26200026336600462003360565b620009ab565b34801562000275575f80fd5b50620001e26200028736600462003360565b62000f30565b34801562000299575f80fd5b50620002a460535481565b604051908152602001620001c2565b348015620002bf575f80fd5b5062000308620002d13660046200343e565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001c2565b34801562000346575f80fd5b50606c54620002089073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000374575f80fd5b50620002a46200038636600462003472565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b34801562000466575f80fd5b50620002a462001130565b3480156200047d575f80fd5b50620001e26200048f366004620034f7565b62001215565b348015620004a1575f80fd5b50620001e26200145e565b348015620004b8575f80fd5b5062000208620004ca36600462003544565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620004fd575f80fd5b50620001b66200050f36600462003544565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b34801562000540575f80fd5b5062000208620005523660046200355c565b62001498565b34801562000564575f80fd5b506068546200057b90610100900463ffffffff1681565b60405163ffffffff9091168152602001620001c2565b3480156200059d575f80fd5b506068546200057b90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001e2620005dd36600462003609565b62001682565b348015620005ef575f80fd5b50606854620002089065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000626575f80fd5b50620001e262001bd4565b3480156200063d575f80fd5b50620002a46200064f36600462003544565b60696020525f908152604090205481565b3480156200066c575f80fd5b50620001b66200067e366004620036a5565b62001c30565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006d6576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062001d18565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007c2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620007e85750600263ffffffff861610155b1562000820576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620008769998979695949392919062003736565b60405180910390a1620009936200098d6001606860019054906101000a900463ffffffff16338989348989604051620008b1929190620037b0565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001dab565b8215620009a457620009a462001ebf565b5050505050565b60685460ff1615620009e9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620009ff8b8b8b8b8b8b8b8b8b8b8b5f62001f8f565b73ffffffffffffffffffffffffffffffffffffffff861662000ad757604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a53919062003810565b5f6040518083038185875af1925050503d805f811462000a8f576040519150601f19603f3d011682016040523d82523d5f602084013e62000a94565b606091505b505090508062000ad0576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000eb8565b60685463ffffffff61010090910481169088160362000b195762000b1373ffffffffffffffffffffffffffffffffffffffff871685856200217a565b62000eb8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e2f575f808062000beb868801886200391f565b9250925092505f8584848460405162000c0490620031f8565b62000c1293929190620039db565b8190604051809103905ff590508015801562000c30573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000ca3575f80fd5b505af115801562000cb6573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e1d95949392919062003a17565b60405180910390a15050505062000eb5565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562000e9d575f80fd5b505af115801562000eb0573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000f6e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000f858b8b8b8b8b8b8b8b8b8b8b600162001f8f565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000fb7949392919062003a5e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200103a919062003810565b5f6040518083038185875af1925050503d805f811462001076576040519150601f19603f3d011682016040523d82523d5f602084013e6200107b565b606091505b5050905080620010b7576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200120c578083901c6001166001036200119d576033816020811062001169576200116962003aa5565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620011ca565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620012039062003aff565b9150506200113a565b50919392505050565b5f54610100900460ff16158080156200123457505f54600160ff909116105b806200124f5750303b1580156200124f57505f5460ff166001145b620012e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200133e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016918416919091179055620013f562002250565b801562001458575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620006e057620006e062001ebf565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b3083604051806020016200152c90620031f8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905262001577908d908d908d908d908d9060200162003b39565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052620015b5929160200162003b79565b604051602081830303815290604052805190602001206040516020016200163e94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff1615620016c0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620016ca620022f2565b60685463ffffffff888116610100909204161480620016f05750600263ffffffff881610155b1562001728576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff88166200178c5788341462001783576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f925062001a79565b3415620017c5576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620018ae576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b15801562001884575f80fd5b505af115801562001897573d5f803e3d5ffd5b5050505080602001519450805f0151935062001a77565b8515620018c357620018c3898b898962002367565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200192e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001954919062003bab565b90506200197a73ffffffffffffffffffffffffffffffffffffffff8b1633308e6200287a565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015620019e5573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001a0b919062003bab565b905062001a19828262003bc3565b6068548c9850610100900463ffffffff169650935062001a3987620028da565b62001a448c620029ee565b62001a4f8d62002af7565b60405160200162001a6393929190620039db565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e868860535460405162001aba98979695949392919062003bd9565b60405180910390a162001bac6200098d5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b861562001bbd5762001bbd62001ebf565b5050505062001bcb60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c26576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062002bf5565b5f84815b602081101562001d0a57600163ffffffff8616821c8116900362001ca65785816020811062001c675762001c6762003aa5565b60200201358260405160200162001c88929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001cf5565b8186826020811062001cbc5762001cbc62003aa5565b602002013560405160200162001cdc929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d018162003aff565b91505062001c34565b50821490505b949350505050565b60685460ff161562001d56576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001dbc6020600262003d88565b62001dc8919062003bc3565b6053541062001e03576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001e149062003aff565b918290555090505f5b602081101562001eaf578082901c60011660010362001e5557826033826020811062001e4d5762001e4d62003aa5565b015550505050565b6033816020811062001e6b5762001e6b62003aa5565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001ea69062003aff565b91505062001e1d565b5062001eba62003d95565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001f4562001130565b6040518263ffffffff1660e01b815260040162001f6491815260200190565b5f604051808303815f87803b15801562001f7c575f80fd5b505af115801562001458573d5f803e3d5ffd5b62001fa08b63ffffffff1662002c84565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af11580156200203f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002065919062003bab565b9050805f03620020a0576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8881166101009092041614620020ea576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff16620021075750896200210a565b508a5b620021336200212a848c8c8c8c8c8c8c604051620008b1929190620037b0565b8f8f8462001c30565b6200216a576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001eba9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002ce8565b5f54610100900460ff16620022e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b620006e062002dfa565b60026001540362002360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401620012d8565b6002600155565b5f62002377600482848662003dc2565b620023829162003deb565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620025fc575f808080808080620023e4896004818d62003dc2565b810190620023f3919062003e34565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002467576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff86163014620024b7576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a8514620024f1576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620025ac919062003810565b5f604051808303815f865af19150503d805f8114620025e7576040519150601f19603f3d011682016040523d82523d5f602084013e620025ec565b606091505b50505050505050505050620009a4565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002678576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806200268f8a6004818e62003dc2565b8101906200269e919062003e8a565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002714576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002764576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002828919062003810565b5f604051808303815f865af19150503d805f811462002863576040519150601f19603f3d011682016040523d82523d5f602084013e62002868565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014589085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401620021cd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff8616916200295d919062003810565b5f60405180830381855afa9150503d805f811462002997576040519150601f19603f3d011682016040523d82523d5f602084013e6200299c565b606091505b509150915081620029e3576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d10565b62001d108162002e92565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002a71919062003810565b5f60405180830381855afa9150503d805f811462002aab576040519150601f19603f3d011682016040523d82523d5f602084013e62002ab0565b606091505b509150915081620029e3576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d10565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff86169162002b79919062003810565b5f60405180830381855afa9150503d805f811462002bb3576040519150601f19603f3d011682016040523d82523d5f602084013e62002bb8565b606091505b509150915081801562002bcc575080516020145b62002bd957601262001d10565b8080602001905181019062001d10919062003f11565b60018055565b60685460ff1662002c32576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009a4576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002d4b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200307d9092919063ffffffff16565b80519091501562001eba578080602001905181019062002d6c919062003f2f565b62001eba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401620012d8565b5f54610100900460ff1662002bef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b6060604082511062002eb457818060200190518101906200077e919062003f4d565b81516020036200303f575f5b60208110801562002f0b575082818151811062002ee15762002ee162003aa5565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002f26578062002f1d8162003aff565b91505062002ec0565b805f0362002f6957505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff81111562002f865762002f86620037bf565b6040519080825280601f01601f19166020018201604052801562002fb1576020820181803683370190505b5090505f5b82811015620030375784818151811062002fd45762002fd462003aa5565b602001015160f81c60f81b82828151811062002ff45762002ff462003aa5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350806200302e8162003aff565b91505062002fb6565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d1084845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051620030b2919062003810565b5f6040518083038185875af1925050503d805f8114620030ee576040519150601f19603f3d011682016040523d82523d5f602084013e620030f3565b606091505b5091509150620031068783838762003111565b979650505050505050565b60608315620031ab5782515f03620031a35773ffffffffffffffffffffffffffffffffffffffff85163b620031a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620012d8565b508162001d10565b62001d108383815115620031c25781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620012d8919062003fc8565b611b0d8062003fdd83390190565b803563ffffffff8116811462003078575f80fd5b73ffffffffffffffffffffffffffffffffffffffff811681146200323c575f80fd5b50565b5f806040838503121562003251575f80fd5b6200325c8362003206565b915060208301356200326e816200321a565b809150509250929050565b80151581146200323c575f80fd5b5f8083601f84011262003298575f80fd5b50813567ffffffffffffffff811115620032b0575f80fd5b602083019150836020828501011115620032c8575f80fd5b9250929050565b5f805f805f60808688031215620032e4575f80fd5b620032ef8662003206565b9450602086013562003301816200321a565b93506040860135620033138162003279565b9250606086013567ffffffffffffffff8111156200332f575f80fd5b6200333d8882890162003287565b969995985093965092949392505050565b8061040081018310156200077e575f80fd5b5f805f805f805f805f805f6105208c8e0312156200337c575f80fd5b620033888d8d6200334e565b9a50620033996104008d0162003206565b99506104208c013598506104408c01359750620033ba6104608d0162003206565b96506104808c0135620033cd816200321a565b9550620033de6104a08d0162003206565b94506104c08c0135620033f1816200321a565b93506104e08c013592506105008c013567ffffffffffffffff81111562003416575f80fd5b620034248e828f0162003287565b915080935050809150509295989b509295989b9093969950565b5f602082840312156200344f575f80fd5b81356200345c816200321a565b9392505050565b60ff811681146200323c575f80fd5b5f805f805f805f60e0888a03121562003489575f80fd5b8735620034968162003463565b9650620034a66020890162003206565b95506040880135620034b8816200321a565b9450620034c86060890162003206565b93506080880135620034da816200321a565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156200350a575f80fd5b620035158462003206565b9250602084013562003527816200321a565b9150604084013562003539816200321a565b809150509250925092565b5f6020828403121562003555575f80fd5b5035919050565b5f805f805f805f60a0888a03121562003573575f80fd5b6200357e8862003206565b9650602088013562003590816200321a565b9550604088013567ffffffffffffffff80821115620035ad575f80fd5b620035bb8b838c0162003287565b909750955060608a0135915080821115620035d4575f80fd5b50620035e38a828b0162003287565b9094509250506080880135620035f98162003463565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003620575f80fd5b6200362b8862003206565b965060208801356200363d816200321a565b955060408801359450606088013562003656816200321a565b93506080880135620036688162003279565b925060a088013567ffffffffffffffff81111562003684575f80fd5b620036928a828b0162003287565b989b979a50959850939692959293505050565b5f805f806104608587031215620036ba575f80fd5b84359350620036cd86602087016200334e565b9250620036de610420860162003206565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620037968285018789620036ef565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003808578181015183820152602001620037ee565b50505f910152565b5f825162003823818460208701620037ec565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715620038775762003877620037bf565b604052919050565b5f67ffffffffffffffff8211156200389b576200389b620037bf565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112620038d7575f80fd5b8135620038ee620038e8826200387f565b6200382d565b81815284602083860101111562003903575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003932575f80fd5b833567ffffffffffffffff808211156200394a575f80fd5b6200395887838801620038c7565b945060208601359150808211156200396e575f80fd5b506200397d86828701620038c7565b9250506040840135620035398162003463565b5f8151808452620039a9816020860160208601620037ec565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f620039ef606083018662003990565b828103602084015262003a03818662003990565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff80871660208401528086166040840152506080606083015262003106608083018486620036ef565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003a9b606083018486620036ef565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003b325762003b3262003ad2565b5060010190565b606081525f62003b4e606083018789620036ef565b828103602084015262003b63818688620036ef565b91505060ff831660408301529695505050505050565b5f835162003b8c818460208801620037ec565b83519083019062003ba2818360208801620037ec565b01949350505050565b5f6020828403121562003bbc575f80fd5b5051919050565b818103818111156200077e576200077e62003ad2565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003c388285018762003990565b925080851660e085015250509998505050505050505050565b600181815b8085111562003cb057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003c945762003c9462003ad2565b8085161562003ca257918102915b93841c939080029062003c56565b509250929050565b5f8262003cc8575060016200077e565b8162003cd657505f6200077e565b816001811462003cef576002811462003cfa5762003d1a565b60019150506200077e565b60ff84111562003d0e5762003d0e62003ad2565b50506001821b6200077e565b5060208310610133831016604e8410600b841016171562003d3f575081810a6200077e565b62003d4b838362003c51565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d805762003d8062003ad2565b029392505050565b5f6200345c838362003cb8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f808585111562003dd1575f80fd5b8386111562003dde575f80fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003e2c5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562003e4b575f80fd5b873562003e58816200321a565b9650602088013562003e6a816200321a565b955060408801359450606088013593506080880135620034da8162003463565b5f805f805f805f80610100898b03121562003ea3575f80fd5b883562003eb0816200321a565b9750602089013562003ec2816200321a565b96506040890135955060608901359450608089013562003ee28162003279565b935060a089013562003ef48162003463565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562003f22575f80fd5b81516200345c8162003463565b5f6020828403121562003f40575f80fd5b81516200345c8162003279565b5f6020828403121562003f5e575f80fd5b815167ffffffffffffffff81111562003f75575f80fd5b8201601f8101841362003f86575f80fd5b805162003f97620038e8826200387f565b81815285602083850101111562003fac575f80fd5b62003fbf826020830160208601620037ec565b95945050505050565b602081525f6200345c60208301846200399056fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a2646970667358221220a5a87ee7306addc678df728ba95068cf49221fa5fc9eb0965302ffda8e2e3ae564736f6c63430008140033", - "deployedBytecode": "0x60806040526004361062000197575f3560e01c8063647c576c11620000e2578063be5831c71162000086578063dbc16976116200005e578063dbc16976146200061a578063ee25560b1462000631578063fb5708341462000660575f80fd5b8063be5831c71462000591578063cd58657914620005cc578063d02103ca14620005e3575f80fd5b80639e34070f11620000ba5780639e34070f14620004f1578063aaa13cc21462000534578063bab161bf1462000558575f80fd5b8063647c576c146200047157806379e2cf97146200049557806381b1c17414620004ac575f80fd5b80632d2c9d94116200014a57806334ac9cf2116200012257806334ac9cf2146200033a5780633e19704314620003685780635ca1e165146200045a575f80fd5b80632d2c9d9414620002695780632dfdf0b5146200028d578063318aee3d14620002b3575f80fd5b806322e95f2c116200017e57806322e95f2c14620001e4578063240ff378146200022e5780632cffd02e1462000245575f80fd5b806315064c96146200019b5780632072f6c514620001cb575b5f80fd5b348015620001a7575f80fd5b50606854620001b69060ff1681565b60405190151581526020015b60405180910390f35b348015620001d7575f80fd5b50620001e262000684565b005b348015620001f0575f80fd5b5062000208620002023660046200323f565b620006e2565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001c2565b620001e26200023f366004620032cf565b62000784565b34801562000251575f80fd5b50620001e26200026336600462003360565b620009ab565b34801562000275575f80fd5b50620001e26200028736600462003360565b62000f30565b34801562000299575f80fd5b50620002a460535481565b604051908152602001620001c2565b348015620002bf575f80fd5b5062000308620002d13660046200343e565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001c2565b34801562000346575f80fd5b50606c54620002089073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000374575f80fd5b50620002a46200038636600462003472565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b34801562000466575f80fd5b50620002a462001130565b3480156200047d575f80fd5b50620001e26200048f366004620034f7565b62001215565b348015620004a1575f80fd5b50620001e26200145e565b348015620004b8575f80fd5b5062000208620004ca36600462003544565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620004fd575f80fd5b50620001b66200050f36600462003544565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b34801562000540575f80fd5b5062000208620005523660046200355c565b62001498565b34801562000564575f80fd5b506068546200057b90610100900463ffffffff1681565b60405163ffffffff9091168152602001620001c2565b3480156200059d575f80fd5b506068546200057b90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001e2620005dd36600462003609565b62001682565b348015620005ef575f80fd5b50606854620002089065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000626575f80fd5b50620001e262001bd4565b3480156200063d575f80fd5b50620002a46200064f36600462003544565b60696020525f908152604090205481565b3480156200066c575f80fd5b50620001b66200067e366004620036a5565b62001c30565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006d6576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062001d18565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007c2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620007e85750600263ffffffff861610155b1562000820576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620008769998979695949392919062003736565b60405180910390a1620009936200098d6001606860019054906101000a900463ffffffff16338989348989604051620008b1929190620037b0565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001dab565b8215620009a457620009a462001ebf565b5050505050565b60685460ff1615620009e9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620009ff8b8b8b8b8b8b8b8b8b8b8b5f62001f8f565b73ffffffffffffffffffffffffffffffffffffffff861662000ad757604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a53919062003810565b5f6040518083038185875af1925050503d805f811462000a8f576040519150601f19603f3d011682016040523d82523d5f602084013e62000a94565b606091505b505090508062000ad0576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000eb8565b60685463ffffffff61010090910481169088160362000b195762000b1373ffffffffffffffffffffffffffffffffffffffff871685856200217a565b62000eb8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e2f575f808062000beb868801886200391f565b9250925092505f8584848460405162000c0490620031f8565b62000c1293929190620039db565b8190604051809103905ff590508015801562000c30573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000ca3575f80fd5b505af115801562000cb6573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e1d95949392919062003a17565b60405180910390a15050505062000eb5565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562000e9d575f80fd5b505af115801562000eb0573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000f6e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000f858b8b8b8b8b8b8b8b8b8b8b600162001f8f565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000fb7949392919062003a5e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200103a919062003810565b5f6040518083038185875af1925050503d805f811462001076576040519150601f19603f3d011682016040523d82523d5f602084013e6200107b565b606091505b5050905080620010b7576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200120c578083901c6001166001036200119d576033816020811062001169576200116962003aa5565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620011ca565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620012039062003aff565b9150506200113a565b50919392505050565b5f54610100900460ff16158080156200123457505f54600160ff909116105b806200124f5750303b1580156200124f57505f5460ff166001145b620012e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200133e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016918416919091179055620013f562002250565b801562001458575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620006e057620006e062001ebf565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b3083604051806020016200152c90620031f8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905262001577908d908d908d908d908d9060200162003b39565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052620015b5929160200162003b79565b604051602081830303815290604052805190602001206040516020016200163e94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff1615620016c0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620016ca620022f2565b60685463ffffffff888116610100909204161480620016f05750600263ffffffff881610155b1562001728576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff88166200178c5788341462001783576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f925062001a79565b3415620017c5576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620018ae576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b15801562001884575f80fd5b505af115801562001897573d5f803e3d5ffd5b5050505080602001519450805f0151935062001a77565b8515620018c357620018c3898b898962002367565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200192e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001954919062003bab565b90506200197a73ffffffffffffffffffffffffffffffffffffffff8b1633308e6200287a565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015620019e5573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001a0b919062003bab565b905062001a19828262003bc3565b6068548c9850610100900463ffffffff169650935062001a3987620028da565b62001a448c620029ee565b62001a4f8d62002af7565b60405160200162001a6393929190620039db565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e868860535460405162001aba98979695949392919062003bd9565b60405180910390a162001bac6200098d5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b861562001bbd5762001bbd62001ebf565b5050505062001bcb60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c26576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062002bf5565b5f84815b602081101562001d0a57600163ffffffff8616821c8116900362001ca65785816020811062001c675762001c6762003aa5565b60200201358260405160200162001c88929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001cf5565b8186826020811062001cbc5762001cbc62003aa5565b602002013560405160200162001cdc929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d018162003aff565b91505062001c34565b50821490505b949350505050565b60685460ff161562001d56576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001dbc6020600262003d88565b62001dc8919062003bc3565b6053541062001e03576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001e149062003aff565b918290555090505f5b602081101562001eaf578082901c60011660010362001e5557826033826020811062001e4d5762001e4d62003aa5565b015550505050565b6033816020811062001e6b5762001e6b62003aa5565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001ea69062003aff565b91505062001e1d565b5062001eba62003d95565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001f4562001130565b6040518263ffffffff1660e01b815260040162001f6491815260200190565b5f604051808303815f87803b15801562001f7c575f80fd5b505af115801562001458573d5f803e3d5ffd5b62001fa08b63ffffffff1662002c84565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af11580156200203f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002065919062003bab565b9050805f03620020a0576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8881166101009092041614620020ea576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff16620021075750896200210a565b508a5b620021336200212a848c8c8c8c8c8c8c604051620008b1929190620037b0565b8f8f8462001c30565b6200216a576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001eba9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002ce8565b5f54610100900460ff16620022e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b620006e062002dfa565b60026001540362002360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401620012d8565b6002600155565b5f62002377600482848662003dc2565b620023829162003deb565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620025fc575f808080808080620023e4896004818d62003dc2565b810190620023f3919062003e34565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002467576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff86163014620024b7576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a8514620024f1576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620025ac919062003810565b5f604051808303815f865af19150503d805f8114620025e7576040519150601f19603f3d011682016040523d82523d5f602084013e620025ec565b606091505b50505050505050505050620009a4565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002678576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806200268f8a6004818e62003dc2565b8101906200269e919062003e8a565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002714576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002764576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002828919062003810565b5f604051808303815f865af19150503d805f811462002863576040519150601f19603f3d011682016040523d82523d5f602084013e62002868565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014589085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401620021cd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff8616916200295d919062003810565b5f60405180830381855afa9150503d805f811462002997576040519150601f19603f3d011682016040523d82523d5f602084013e6200299c565b606091505b509150915081620029e3576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d10565b62001d108162002e92565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002a71919062003810565b5f60405180830381855afa9150503d805f811462002aab576040519150601f19603f3d011682016040523d82523d5f602084013e62002ab0565b606091505b509150915081620029e3576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d10565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff86169162002b79919062003810565b5f60405180830381855afa9150503d805f811462002bb3576040519150601f19603f3d011682016040523d82523d5f602084013e62002bb8565b606091505b509150915081801562002bcc575080516020145b62002bd957601262001d10565b8080602001905181019062001d10919062003f11565b60018055565b60685460ff1662002c32576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009a4576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002d4b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200307d9092919063ffffffff16565b80519091501562001eba578080602001905181019062002d6c919062003f2f565b62001eba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401620012d8565b5f54610100900460ff1662002bef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b6060604082511062002eb457818060200190518101906200077e919062003f4d565b81516020036200303f575f5b60208110801562002f0b575082818151811062002ee15762002ee162003aa5565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002f26578062002f1d8162003aff565b91505062002ec0565b805f0362002f6957505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff81111562002f865762002f86620037bf565b6040519080825280601f01601f19166020018201604052801562002fb1576020820181803683370190505b5090505f5b82811015620030375784818151811062002fd45762002fd462003aa5565b602001015160f81c60f81b82828151811062002ff45762002ff462003aa5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350806200302e8162003aff565b91505062002fb6565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d1084845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051620030b2919062003810565b5f6040518083038185875af1925050503d805f8114620030ee576040519150601f19603f3d011682016040523d82523d5f602084013e620030f3565b606091505b5091509150620031068783838762003111565b979650505050505050565b60608315620031ab5782515f03620031a35773ffffffffffffffffffffffffffffffffffffffff85163b620031a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620012d8565b508162001d10565b62001d108383815115620031c25781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620012d8919062003fc8565b611b0d8062003fdd83390190565b803563ffffffff8116811462003078575f80fd5b73ffffffffffffffffffffffffffffffffffffffff811681146200323c575f80fd5b50565b5f806040838503121562003251575f80fd5b6200325c8362003206565b915060208301356200326e816200321a565b809150509250929050565b80151581146200323c575f80fd5b5f8083601f84011262003298575f80fd5b50813567ffffffffffffffff811115620032b0575f80fd5b602083019150836020828501011115620032c8575f80fd5b9250929050565b5f805f805f60808688031215620032e4575f80fd5b620032ef8662003206565b9450602086013562003301816200321a565b93506040860135620033138162003279565b9250606086013567ffffffffffffffff8111156200332f575f80fd5b6200333d8882890162003287565b969995985093965092949392505050565b8061040081018310156200077e575f80fd5b5f805f805f805f805f805f6105208c8e0312156200337c575f80fd5b620033888d8d6200334e565b9a50620033996104008d0162003206565b99506104208c013598506104408c01359750620033ba6104608d0162003206565b96506104808c0135620033cd816200321a565b9550620033de6104a08d0162003206565b94506104c08c0135620033f1816200321a565b93506104e08c013592506105008c013567ffffffffffffffff81111562003416575f80fd5b620034248e828f0162003287565b915080935050809150509295989b509295989b9093969950565b5f602082840312156200344f575f80fd5b81356200345c816200321a565b9392505050565b60ff811681146200323c575f80fd5b5f805f805f805f60e0888a03121562003489575f80fd5b8735620034968162003463565b9650620034a66020890162003206565b95506040880135620034b8816200321a565b9450620034c86060890162003206565b93506080880135620034da816200321a565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156200350a575f80fd5b620035158462003206565b9250602084013562003527816200321a565b9150604084013562003539816200321a565b809150509250925092565b5f6020828403121562003555575f80fd5b5035919050565b5f805f805f805f60a0888a03121562003573575f80fd5b6200357e8862003206565b9650602088013562003590816200321a565b9550604088013567ffffffffffffffff80821115620035ad575f80fd5b620035bb8b838c0162003287565b909750955060608a0135915080821115620035d4575f80fd5b50620035e38a828b0162003287565b9094509250506080880135620035f98162003463565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003620575f80fd5b6200362b8862003206565b965060208801356200363d816200321a565b955060408801359450606088013562003656816200321a565b93506080880135620036688162003279565b925060a088013567ffffffffffffffff81111562003684575f80fd5b620036928a828b0162003287565b989b979a50959850939692959293505050565b5f805f806104608587031215620036ba575f80fd5b84359350620036cd86602087016200334e565b9250620036de610420860162003206565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620037968285018789620036ef565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003808578181015183820152602001620037ee565b50505f910152565b5f825162003823818460208701620037ec565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715620038775762003877620037bf565b604052919050565b5f67ffffffffffffffff8211156200389b576200389b620037bf565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112620038d7575f80fd5b8135620038ee620038e8826200387f565b6200382d565b81815284602083860101111562003903575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003932575f80fd5b833567ffffffffffffffff808211156200394a575f80fd5b6200395887838801620038c7565b945060208601359150808211156200396e575f80fd5b506200397d86828701620038c7565b9250506040840135620035398162003463565b5f8151808452620039a9816020860160208601620037ec565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f620039ef606083018662003990565b828103602084015262003a03818662003990565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff80871660208401528086166040840152506080606083015262003106608083018486620036ef565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003a9b606083018486620036ef565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003b325762003b3262003ad2565b5060010190565b606081525f62003b4e606083018789620036ef565b828103602084015262003b63818688620036ef565b91505060ff831660408301529695505050505050565b5f835162003b8c818460208801620037ec565b83519083019062003ba2818360208801620037ec565b01949350505050565b5f6020828403121562003bbc575f80fd5b5051919050565b818103818111156200077e576200077e62003ad2565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003c388285018762003990565b925080851660e085015250509998505050505050505050565b600181815b8085111562003cb057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003c945762003c9462003ad2565b8085161562003ca257918102915b93841c939080029062003c56565b509250929050565b5f8262003cc8575060016200077e565b8162003cd657505f6200077e565b816001811462003cef576002811462003cfa5762003d1a565b60019150506200077e565b60ff84111562003d0e5762003d0e62003ad2565b50506001821b6200077e565b5060208310610133831016604e8410600b841016171562003d3f575081810a6200077e565b62003d4b838362003c51565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d805762003d8062003ad2565b029392505050565b5f6200345c838362003cb8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f808585111562003dd1575f80fd5b8386111562003dde575f80fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003e2c5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562003e4b575f80fd5b873562003e58816200321a565b9650602088013562003e6a816200321a565b955060408801359450606088013593506080880135620034da8162003463565b5f805f805f805f80610100898b03121562003ea3575f80fd5b883562003eb0816200321a565b9750602089013562003ec2816200321a565b96506040890135955060608901359450608089013562003ee28162003279565b935060a089013562003ef48162003463565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562003f22575f80fd5b81516200345c8162003463565b5f6020828403121562003f40575f80fd5b81516200345c8162003279565b5f6020828403121562003f5e575f80fd5b815167ffffffffffffffff81111562003f75575f80fd5b8201601f8101841362003f86575f80fd5b805162003f97620038e8826200387f565b81815285602083850101111562003fac575f80fd5b62003fbf826020830160208601620037ec565b95945050505050565b602081525f6200345c60208301846200399056fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a2646970667358221220a5a87ee7306addc678df728ba95068cf49221fa5fc9eb0965302ffda8e2e3ae564736f6c63430008140033", + "bytecode": "0x608060405234801561000f575f80fd5b50615b1f8061001d5f395ff3fe60806040526004361062000197575f3560e01c8063647c576c11620000e2578063be5831c71162000086578063dbc16976116200005e578063dbc16976146200061a578063ee25560b1462000631578063fb5708341462000660575f80fd5b8063be5831c71462000591578063cd58657914620005cc578063d02103ca14620005e3575f80fd5b80639e34070f11620000ba5780639e34070f14620004f1578063aaa13cc21462000534578063bab161bf1462000558575f80fd5b8063647c576c146200047157806379e2cf97146200049557806381b1c17414620004ac575f80fd5b80632d2c9d94116200014a57806334ac9cf2116200012257806334ac9cf2146200033a5780633ae0504714620003685780633e197043146200037f575f80fd5b80632d2c9d9414620002695780632dfdf0b5146200028d578063318aee3d14620002b3575f80fd5b806322e95f2c116200017e57806322e95f2c14620001e4578063240ff378146200022e5780632cffd02e1462000245575f80fd5b806315064c96146200019b5780632072f6c514620001cb575b5f80fd5b348015620001a7575f80fd5b50606854620001b69060ff1681565b60405190151581526020015b60405180910390f35b348015620001d7575f80fd5b50620001e262000684565b005b348015620001f0575f80fd5b5062000208620002023660046200323f565b620006e2565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001c2565b620001e26200023f366004620032cf565b62000784565b34801562000251575f80fd5b50620001e26200026336600462003360565b620009ab565b34801562000275575f80fd5b50620001e26200028736600462003360565b62000f30565b34801562000299575f80fd5b50620002a460535481565b604051908152602001620001c2565b348015620002bf575f80fd5b5062000308620002d13660046200343e565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001c2565b34801562000346575f80fd5b50606c54620002089073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000374575f80fd5b50620002a462001130565b3480156200038b575f80fd5b50620002a46200039d36600462003472565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200047d575f80fd5b50620001e26200048f366004620034f7565b62001215565b348015620004a1575f80fd5b50620001e26200145e565b348015620004b8575f80fd5b5062000208620004ca36600462003544565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620004fd575f80fd5b50620001b66200050f36600462003544565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b34801562000540575f80fd5b5062000208620005523660046200355c565b62001498565b34801562000564575f80fd5b506068546200057b90610100900463ffffffff1681565b60405163ffffffff9091168152602001620001c2565b3480156200059d575f80fd5b506068546200057b90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001e2620005dd36600462003609565b62001682565b348015620005ef575f80fd5b50606854620002089065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000626575f80fd5b50620001e262001bd4565b3480156200063d575f80fd5b50620002a46200064f36600462003544565b60696020525f908152604090205481565b3480156200066c575f80fd5b50620001b66200067e366004620036a5565b62001c30565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006d6576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062001d18565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007c2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620007e85750600263ffffffff861610155b1562000820576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620008769998979695949392919062003736565b60405180910390a1620009936200098d6001606860019054906101000a900463ffffffff16338989348989604051620008b1929190620037b0565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001dab565b8215620009a457620009a462001ebf565b5050505050565b60685460ff1615620009e9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620009ff8b8b8b8b8b8b8b8b8b8b8b5f62001f8f565b73ffffffffffffffffffffffffffffffffffffffff861662000ad757604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a53919062003810565b5f6040518083038185875af1925050503d805f811462000a8f576040519150601f19603f3d011682016040523d82523d5f602084013e62000a94565b606091505b505090508062000ad0576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000eb8565b60685463ffffffff61010090910481169088160362000b195762000b1373ffffffffffffffffffffffffffffffffffffffff871685856200217a565b62000eb8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e2f575f808062000beb868801886200391f565b9250925092505f8584848460405162000c0490620031f8565b62000c1293929190620039db565b8190604051809103905ff590508015801562000c30573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000ca3575f80fd5b505af115801562000cb6573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e1d95949392919062003a17565b60405180910390a15050505062000eb5565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562000e9d575f80fd5b505af115801562000eb0573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000f6e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000f858b8b8b8b8b8b8b8b8b8b8b600162001f8f565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000fb7949392919062003a5e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200103a919062003810565b5f6040518083038185875af1925050503d805f811462001076576040519150601f19603f3d011682016040523d82523d5f602084013e6200107b565b606091505b5050905080620010b7576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200120c578083901c6001166001036200119d576033816020811062001169576200116962003aa5565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620011ca565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620012039062003aff565b9150506200113a565b50919392505050565b5f54610100900460ff16158080156200123457505f54600160ff909116105b806200124f5750303b1580156200124f57505f5460ff166001145b620012e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200133e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016918416919091179055620013f562002250565b801562001458575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620006e057620006e062001ebf565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b3083604051806020016200152c90620031f8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905262001577908d908d908d908d908d9060200162003b39565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052620015b5929160200162003b79565b604051602081830303815290604052805190602001206040516020016200163e94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff1615620016c0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620016ca620022f2565b60685463ffffffff888116610100909204161480620016f05750600263ffffffff881610155b1562001728576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff88166200178c5788341462001783576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f925062001a79565b3415620017c5576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620018ae576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b15801562001884575f80fd5b505af115801562001897573d5f803e3d5ffd5b5050505080602001519450805f0151935062001a77565b8515620018c357620018c3898b898962002367565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200192e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001954919062003bab565b90506200197a73ffffffffffffffffffffffffffffffffffffffff8b1633308e6200287a565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015620019e5573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001a0b919062003bab565b905062001a19828262003bc3565b6068548c9850610100900463ffffffff169650935062001a3987620028da565b62001a448c620029ee565b62001a4f8d62002af7565b60405160200162001a6393929190620039db565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e868860535460405162001aba98979695949392919062003bd9565b60405180910390a162001bac6200098d5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b861562001bbd5762001bbd62001ebf565b5050505062001bcb60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c26576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062002bf5565b5f84815b602081101562001d0a57600163ffffffff8616821c8116900362001ca65785816020811062001c675762001c6762003aa5565b60200201358260405160200162001c88929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001cf5565b8186826020811062001cbc5762001cbc62003aa5565b602002013560405160200162001cdc929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d018162003aff565b91505062001c34565b50821490505b949350505050565b60685460ff161562001d56576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001dbc6020600262003d88565b62001dc8919062003bc3565b6053541062001e03576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001e149062003aff565b918290555090505f5b602081101562001eaf578082901c60011660010362001e5557826033826020811062001e4d5762001e4d62003aa5565b015550505050565b6033816020811062001e6b5762001e6b62003aa5565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001ea69062003aff565b91505062001e1d565b5062001eba62003d95565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001f4562001130565b6040518263ffffffff1660e01b815260040162001f6491815260200190565b5f604051808303815f87803b15801562001f7c575f80fd5b505af115801562001458573d5f803e3d5ffd5b62001fa08b63ffffffff1662002c84565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af11580156200203f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002065919062003bab565b9050805f03620020a0576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8881166101009092041614620020ea576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff16620021075750896200210a565b508a5b620021336200212a848c8c8c8c8c8c8c604051620008b1929190620037b0565b8f8f8462001c30565b6200216a576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001eba9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002ce8565b5f54610100900460ff16620022e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b620006e062002dfa565b60026001540362002360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401620012d8565b6002600155565b5f62002377600482848662003dc2565b620023829162003deb565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620025fc575f808080808080620023e4896004818d62003dc2565b810190620023f3919062003e34565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002467576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff86163014620024b7576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a8514620024f1576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620025ac919062003810565b5f604051808303815f865af19150503d805f8114620025e7576040519150601f19603f3d011682016040523d82523d5f602084013e620025ec565b606091505b50505050505050505050620009a4565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002678576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806200268f8a6004818e62003dc2565b8101906200269e919062003e8a565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002714576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002764576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002828919062003810565b5f604051808303815f865af19150503d805f811462002863576040519150601f19603f3d011682016040523d82523d5f602084013e62002868565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014589085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401620021cd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff8616916200295d919062003810565b5f60405180830381855afa9150503d805f811462002997576040519150601f19603f3d011682016040523d82523d5f602084013e6200299c565b606091505b509150915081620029e3576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d10565b62001d108162002e92565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002a71919062003810565b5f60405180830381855afa9150503d805f811462002aab576040519150601f19603f3d011682016040523d82523d5f602084013e62002ab0565b606091505b509150915081620029e3576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d10565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff86169162002b79919062003810565b5f60405180830381855afa9150503d805f811462002bb3576040519150601f19603f3d011682016040523d82523d5f602084013e62002bb8565b606091505b509150915081801562002bcc575080516020145b62002bd957601262001d10565b8080602001905181019062001d10919062003f11565b60018055565b60685460ff1662002c32576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009a4576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002d4b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200307d9092919063ffffffff16565b80519091501562001eba578080602001905181019062002d6c919062003f2f565b62001eba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401620012d8565b5f54610100900460ff1662002bef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b6060604082511062002eb457818060200190518101906200077e919062003f4d565b81516020036200303f575f5b60208110801562002f0b575082818151811062002ee15762002ee162003aa5565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002f26578062002f1d8162003aff565b91505062002ec0565b805f0362002f6957505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff81111562002f865762002f86620037bf565b6040519080825280601f01601f19166020018201604052801562002fb1576020820181803683370190505b5090505f5b82811015620030375784818151811062002fd45762002fd462003aa5565b602001015160f81c60f81b82828151811062002ff45762002ff462003aa5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350806200302e8162003aff565b91505062002fb6565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d1084845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051620030b2919062003810565b5f6040518083038185875af1925050503d805f8114620030ee576040519150601f19603f3d011682016040523d82523d5f602084013e620030f3565b606091505b5091509150620031068783838762003111565b979650505050505050565b60608315620031ab5782515f03620031a35773ffffffffffffffffffffffffffffffffffffffff85163b620031a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620012d8565b508162001d10565b62001d108383815115620031c25781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620012d8919062003fc8565b611b0d8062003fdd83390190565b803563ffffffff8116811462003078575f80fd5b73ffffffffffffffffffffffffffffffffffffffff811681146200323c575f80fd5b50565b5f806040838503121562003251575f80fd5b6200325c8362003206565b915060208301356200326e816200321a565b809150509250929050565b80151581146200323c575f80fd5b5f8083601f84011262003298575f80fd5b50813567ffffffffffffffff811115620032b0575f80fd5b602083019150836020828501011115620032c8575f80fd5b9250929050565b5f805f805f60808688031215620032e4575f80fd5b620032ef8662003206565b9450602086013562003301816200321a565b93506040860135620033138162003279565b9250606086013567ffffffffffffffff8111156200332f575f80fd5b6200333d8882890162003287565b969995985093965092949392505050565b8061040081018310156200077e575f80fd5b5f805f805f805f805f805f6105208c8e0312156200337c575f80fd5b620033888d8d6200334e565b9a50620033996104008d0162003206565b99506104208c013598506104408c01359750620033ba6104608d0162003206565b96506104808c0135620033cd816200321a565b9550620033de6104a08d0162003206565b94506104c08c0135620033f1816200321a565b93506104e08c013592506105008c013567ffffffffffffffff81111562003416575f80fd5b620034248e828f0162003287565b915080935050809150509295989b509295989b9093969950565b5f602082840312156200344f575f80fd5b81356200345c816200321a565b9392505050565b60ff811681146200323c575f80fd5b5f805f805f805f60e0888a03121562003489575f80fd5b8735620034968162003463565b9650620034a66020890162003206565b95506040880135620034b8816200321a565b9450620034c86060890162003206565b93506080880135620034da816200321a565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156200350a575f80fd5b620035158462003206565b9250602084013562003527816200321a565b9150604084013562003539816200321a565b809150509250925092565b5f6020828403121562003555575f80fd5b5035919050565b5f805f805f805f60a0888a03121562003573575f80fd5b6200357e8862003206565b9650602088013562003590816200321a565b9550604088013567ffffffffffffffff80821115620035ad575f80fd5b620035bb8b838c0162003287565b909750955060608a0135915080821115620035d4575f80fd5b50620035e38a828b0162003287565b9094509250506080880135620035f98162003463565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003620575f80fd5b6200362b8862003206565b965060208801356200363d816200321a565b955060408801359450606088013562003656816200321a565b93506080880135620036688162003279565b925060a088013567ffffffffffffffff81111562003684575f80fd5b620036928a828b0162003287565b989b979a50959850939692959293505050565b5f805f806104608587031215620036ba575f80fd5b84359350620036cd86602087016200334e565b9250620036de610420860162003206565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620037968285018789620036ef565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003808578181015183820152602001620037ee565b50505f910152565b5f825162003823818460208701620037ec565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715620038775762003877620037bf565b604052919050565b5f67ffffffffffffffff8211156200389b576200389b620037bf565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112620038d7575f80fd5b8135620038ee620038e8826200387f565b6200382d565b81815284602083860101111562003903575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003932575f80fd5b833567ffffffffffffffff808211156200394a575f80fd5b6200395887838801620038c7565b945060208601359150808211156200396e575f80fd5b506200397d86828701620038c7565b9250506040840135620035398162003463565b5f8151808452620039a9816020860160208601620037ec565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f620039ef606083018662003990565b828103602084015262003a03818662003990565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff80871660208401528086166040840152506080606083015262003106608083018486620036ef565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003a9b606083018486620036ef565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003b325762003b3262003ad2565b5060010190565b606081525f62003b4e606083018789620036ef565b828103602084015262003b63818688620036ef565b91505060ff831660408301529695505050505050565b5f835162003b8c818460208801620037ec565b83519083019062003ba2818360208801620037ec565b01949350505050565b5f6020828403121562003bbc575f80fd5b5051919050565b818103818111156200077e576200077e62003ad2565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003c388285018762003990565b925080851660e085015250509998505050505050505050565b600181815b8085111562003cb057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003c945762003c9462003ad2565b8085161562003ca257918102915b93841c939080029062003c56565b509250929050565b5f8262003cc8575060016200077e565b8162003cd657505f6200077e565b816001811462003cef576002811462003cfa5762003d1a565b60019150506200077e565b60ff84111562003d0e5762003d0e62003ad2565b50506001821b6200077e565b5060208310610133831016604e8410600b841016171562003d3f575081810a6200077e565b62003d4b838362003c51565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d805762003d8062003ad2565b029392505050565b5f6200345c838362003cb8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f808585111562003dd1575f80fd5b8386111562003dde575f80fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003e2c5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562003e4b575f80fd5b873562003e58816200321a565b9650602088013562003e6a816200321a565b955060408801359450606088013593506080880135620034da8162003463565b5f805f805f805f80610100898b03121562003ea3575f80fd5b883562003eb0816200321a565b9750602089013562003ec2816200321a565b96506040890135955060608901359450608089013562003ee28162003279565b935060a089013562003ef48162003463565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562003f22575f80fd5b81516200345c8162003463565b5f6020828403121562003f40575f80fd5b81516200345c8162003279565b5f6020828403121562003f5e575f80fd5b815167ffffffffffffffff81111562003f75575f80fd5b8201601f8101841362003f86575f80fd5b805162003f97620038e8826200387f565b81815285602083850101111562003fac575f80fd5b62003fbf826020830160208601620037ec565b95945050505050565b602081525f6200345c60208301846200399056fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a2646970667358221220efc010afd4f7ef7135c2d52e7832f4d0832c536dbd0768cad0ec9406e70e02b864736f6c63430008140033", + "deployedBytecode": "0x60806040526004361062000197575f3560e01c8063647c576c11620000e2578063be5831c71162000086578063dbc16976116200005e578063dbc16976146200061a578063ee25560b1462000631578063fb5708341462000660575f80fd5b8063be5831c71462000591578063cd58657914620005cc578063d02103ca14620005e3575f80fd5b80639e34070f11620000ba5780639e34070f14620004f1578063aaa13cc21462000534578063bab161bf1462000558575f80fd5b8063647c576c146200047157806379e2cf97146200049557806381b1c17414620004ac575f80fd5b80632d2c9d94116200014a57806334ac9cf2116200012257806334ac9cf2146200033a5780633ae0504714620003685780633e197043146200037f575f80fd5b80632d2c9d9414620002695780632dfdf0b5146200028d578063318aee3d14620002b3575f80fd5b806322e95f2c116200017e57806322e95f2c14620001e4578063240ff378146200022e5780632cffd02e1462000245575f80fd5b806315064c96146200019b5780632072f6c514620001cb575b5f80fd5b348015620001a7575f80fd5b50606854620001b69060ff1681565b60405190151581526020015b60405180910390f35b348015620001d7575f80fd5b50620001e262000684565b005b348015620001f0575f80fd5b5062000208620002023660046200323f565b620006e2565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001c2565b620001e26200023f366004620032cf565b62000784565b34801562000251575f80fd5b50620001e26200026336600462003360565b620009ab565b34801562000275575f80fd5b50620001e26200028736600462003360565b62000f30565b34801562000299575f80fd5b50620002a460535481565b604051908152602001620001c2565b348015620002bf575f80fd5b5062000308620002d13660046200343e565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001c2565b34801562000346575f80fd5b50606c54620002089073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000374575f80fd5b50620002a462001130565b3480156200038b575f80fd5b50620002a46200039d36600462003472565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200047d575f80fd5b50620001e26200048f366004620034f7565b62001215565b348015620004a1575f80fd5b50620001e26200145e565b348015620004b8575f80fd5b5062000208620004ca36600462003544565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620004fd575f80fd5b50620001b66200050f36600462003544565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b34801562000540575f80fd5b5062000208620005523660046200355c565b62001498565b34801562000564575f80fd5b506068546200057b90610100900463ffffffff1681565b60405163ffffffff9091168152602001620001c2565b3480156200059d575f80fd5b506068546200057b90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001e2620005dd36600462003609565b62001682565b348015620005ef575f80fd5b50606854620002089065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000626575f80fd5b50620001e262001bd4565b3480156200063d575f80fd5b50620002a46200064f36600462003544565b60696020525f908152604090205481565b3480156200066c575f80fd5b50620001b66200067e366004620036a5565b62001c30565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006d6576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062001d18565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007c2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620007e85750600263ffffffff861610155b1562000820576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620008769998979695949392919062003736565b60405180910390a1620009936200098d6001606860019054906101000a900463ffffffff16338989348989604051620008b1929190620037b0565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001dab565b8215620009a457620009a462001ebf565b5050505050565b60685460ff1615620009e9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620009ff8b8b8b8b8b8b8b8b8b8b8b5f62001f8f565b73ffffffffffffffffffffffffffffffffffffffff861662000ad757604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a53919062003810565b5f6040518083038185875af1925050503d805f811462000a8f576040519150601f19603f3d011682016040523d82523d5f602084013e62000a94565b606091505b505090508062000ad0576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000eb8565b60685463ffffffff61010090910481169088160362000b195762000b1373ffffffffffffffffffffffffffffffffffffffff871685856200217a565b62000eb8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e2f575f808062000beb868801886200391f565b9250925092505f8584848460405162000c0490620031f8565b62000c1293929190620039db565b8190604051809103905ff590508015801562000c30573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000ca3575f80fd5b505af115801562000cb6573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e1d95949392919062003a17565b60405180910390a15050505062000eb5565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562000e9d575f80fd5b505af115801562000eb0573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000f6e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000f858b8b8b8b8b8b8b8b8b8b8b600162001f8f565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000fb7949392919062003a5e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200103a919062003810565b5f6040518083038185875af1925050503d805f811462001076576040519150601f19603f3d011682016040523d82523d5f602084013e6200107b565b606091505b5050905080620010b7576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200120c578083901c6001166001036200119d576033816020811062001169576200116962003aa5565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620011ca565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620012039062003aff565b9150506200113a565b50919392505050565b5f54610100900460ff16158080156200123457505f54600160ff909116105b806200124f5750303b1580156200124f57505f5460ff166001145b620012e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200133e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016918416919091179055620013f562002250565b801562001458575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620006e057620006e062001ebf565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b3083604051806020016200152c90620031f8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905262001577908d908d908d908d908d9060200162003b39565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052620015b5929160200162003b79565b604051602081830303815290604052805190602001206040516020016200163e94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff1615620016c0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620016ca620022f2565b60685463ffffffff888116610100909204161480620016f05750600263ffffffff881610155b1562001728576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff88166200178c5788341462001783576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f925062001a79565b3415620017c5576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620018ae576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b15801562001884575f80fd5b505af115801562001897573d5f803e3d5ffd5b5050505080602001519450805f0151935062001a77565b8515620018c357620018c3898b898962002367565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200192e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001954919062003bab565b90506200197a73ffffffffffffffffffffffffffffffffffffffff8b1633308e6200287a565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015620019e5573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001a0b919062003bab565b905062001a19828262003bc3565b6068548c9850610100900463ffffffff169650935062001a3987620028da565b62001a448c620029ee565b62001a4f8d62002af7565b60405160200162001a6393929190620039db565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e868860535460405162001aba98979695949392919062003bd9565b60405180910390a162001bac6200098d5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b861562001bbd5762001bbd62001ebf565b5050505062001bcb60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c26576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062002bf5565b5f84815b602081101562001d0a57600163ffffffff8616821c8116900362001ca65785816020811062001c675762001c6762003aa5565b60200201358260405160200162001c88929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001cf5565b8186826020811062001cbc5762001cbc62003aa5565b602002013560405160200162001cdc929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d018162003aff565b91505062001c34565b50821490505b949350505050565b60685460ff161562001d56576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001dbc6020600262003d88565b62001dc8919062003bc3565b6053541062001e03576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001e149062003aff565b918290555090505f5b602081101562001eaf578082901c60011660010362001e5557826033826020811062001e4d5762001e4d62003aa5565b015550505050565b6033816020811062001e6b5762001e6b62003aa5565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001ea69062003aff565b91505062001e1d565b5062001eba62003d95565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001f4562001130565b6040518263ffffffff1660e01b815260040162001f6491815260200190565b5f604051808303815f87803b15801562001f7c575f80fd5b505af115801562001458573d5f803e3d5ffd5b62001fa08b63ffffffff1662002c84565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af11580156200203f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002065919062003bab565b9050805f03620020a0576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8881166101009092041614620020ea576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff16620021075750896200210a565b508a5b620021336200212a848c8c8c8c8c8c8c604051620008b1929190620037b0565b8f8f8462001c30565b6200216a576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001eba9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002ce8565b5f54610100900460ff16620022e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b620006e062002dfa565b60026001540362002360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401620012d8565b6002600155565b5f62002377600482848662003dc2565b620023829162003deb565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620025fc575f808080808080620023e4896004818d62003dc2565b810190620023f3919062003e34565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002467576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff86163014620024b7576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a8514620024f1576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620025ac919062003810565b5f604051808303815f865af19150503d805f8114620025e7576040519150601f19603f3d011682016040523d82523d5f602084013e620025ec565b606091505b50505050505050505050620009a4565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002678576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806200268f8a6004818e62003dc2565b8101906200269e919062003e8a565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002714576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002764576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002828919062003810565b5f604051808303815f865af19150503d805f811462002863576040519150601f19603f3d011682016040523d82523d5f602084013e62002868565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014589085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401620021cd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff8616916200295d919062003810565b5f60405180830381855afa9150503d805f811462002997576040519150601f19603f3d011682016040523d82523d5f602084013e6200299c565b606091505b509150915081620029e3576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d10565b62001d108162002e92565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002a71919062003810565b5f60405180830381855afa9150503d805f811462002aab576040519150601f19603f3d011682016040523d82523d5f602084013e62002ab0565b606091505b509150915081620029e3576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d10565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff86169162002b79919062003810565b5f60405180830381855afa9150503d805f811462002bb3576040519150601f19603f3d011682016040523d82523d5f602084013e62002bb8565b606091505b509150915081801562002bcc575080516020145b62002bd957601262001d10565b8080602001905181019062001d10919062003f11565b60018055565b60685460ff1662002c32576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009a4576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002d4b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200307d9092919063ffffffff16565b80519091501562001eba578080602001905181019062002d6c919062003f2f565b62001eba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401620012d8565b5f54610100900460ff1662002bef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b6060604082511062002eb457818060200190518101906200077e919062003f4d565b81516020036200303f575f5b60208110801562002f0b575082818151811062002ee15762002ee162003aa5565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002f26578062002f1d8162003aff565b91505062002ec0565b805f0362002f6957505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff81111562002f865762002f86620037bf565b6040519080825280601f01601f19166020018201604052801562002fb1576020820181803683370190505b5090505f5b82811015620030375784818151811062002fd45762002fd462003aa5565b602001015160f81c60f81b82828151811062002ff45762002ff462003aa5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350806200302e8162003aff565b91505062002fb6565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d1084845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051620030b2919062003810565b5f6040518083038185875af1925050503d805f8114620030ee576040519150601f19603f3d011682016040523d82523d5f602084013e620030f3565b606091505b5091509150620031068783838762003111565b979650505050505050565b60608315620031ab5782515f03620031a35773ffffffffffffffffffffffffffffffffffffffff85163b620031a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620012d8565b508162001d10565b62001d108383815115620031c25781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620012d8919062003fc8565b611b0d8062003fdd83390190565b803563ffffffff8116811462003078575f80fd5b73ffffffffffffffffffffffffffffffffffffffff811681146200323c575f80fd5b50565b5f806040838503121562003251575f80fd5b6200325c8362003206565b915060208301356200326e816200321a565b809150509250929050565b80151581146200323c575f80fd5b5f8083601f84011262003298575f80fd5b50813567ffffffffffffffff811115620032b0575f80fd5b602083019150836020828501011115620032c8575f80fd5b9250929050565b5f805f805f60808688031215620032e4575f80fd5b620032ef8662003206565b9450602086013562003301816200321a565b93506040860135620033138162003279565b9250606086013567ffffffffffffffff8111156200332f575f80fd5b6200333d8882890162003287565b969995985093965092949392505050565b8061040081018310156200077e575f80fd5b5f805f805f805f805f805f6105208c8e0312156200337c575f80fd5b620033888d8d6200334e565b9a50620033996104008d0162003206565b99506104208c013598506104408c01359750620033ba6104608d0162003206565b96506104808c0135620033cd816200321a565b9550620033de6104a08d0162003206565b94506104c08c0135620033f1816200321a565b93506104e08c013592506105008c013567ffffffffffffffff81111562003416575f80fd5b620034248e828f0162003287565b915080935050809150509295989b509295989b9093969950565b5f602082840312156200344f575f80fd5b81356200345c816200321a565b9392505050565b60ff811681146200323c575f80fd5b5f805f805f805f60e0888a03121562003489575f80fd5b8735620034968162003463565b9650620034a66020890162003206565b95506040880135620034b8816200321a565b9450620034c86060890162003206565b93506080880135620034da816200321a565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156200350a575f80fd5b620035158462003206565b9250602084013562003527816200321a565b9150604084013562003539816200321a565b809150509250925092565b5f6020828403121562003555575f80fd5b5035919050565b5f805f805f805f60a0888a03121562003573575f80fd5b6200357e8862003206565b9650602088013562003590816200321a565b9550604088013567ffffffffffffffff80821115620035ad575f80fd5b620035bb8b838c0162003287565b909750955060608a0135915080821115620035d4575f80fd5b50620035e38a828b0162003287565b9094509250506080880135620035f98162003463565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003620575f80fd5b6200362b8862003206565b965060208801356200363d816200321a565b955060408801359450606088013562003656816200321a565b93506080880135620036688162003279565b925060a088013567ffffffffffffffff81111562003684575f80fd5b620036928a828b0162003287565b989b979a50959850939692959293505050565b5f805f806104608587031215620036ba575f80fd5b84359350620036cd86602087016200334e565b9250620036de610420860162003206565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620037968285018789620036ef565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003808578181015183820152602001620037ee565b50505f910152565b5f825162003823818460208701620037ec565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715620038775762003877620037bf565b604052919050565b5f67ffffffffffffffff8211156200389b576200389b620037bf565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112620038d7575f80fd5b8135620038ee620038e8826200387f565b6200382d565b81815284602083860101111562003903575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003932575f80fd5b833567ffffffffffffffff808211156200394a575f80fd5b6200395887838801620038c7565b945060208601359150808211156200396e575f80fd5b506200397d86828701620038c7565b9250506040840135620035398162003463565b5f8151808452620039a9816020860160208601620037ec565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f620039ef606083018662003990565b828103602084015262003a03818662003990565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff80871660208401528086166040840152506080606083015262003106608083018486620036ef565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003a9b606083018486620036ef565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003b325762003b3262003ad2565b5060010190565b606081525f62003b4e606083018789620036ef565b828103602084015262003b63818688620036ef565b91505060ff831660408301529695505050505050565b5f835162003b8c818460208801620037ec565b83519083019062003ba2818360208801620037ec565b01949350505050565b5f6020828403121562003bbc575f80fd5b5051919050565b818103818111156200077e576200077e62003ad2565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003c388285018762003990565b925080851660e085015250509998505050505050505050565b600181815b8085111562003cb057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003c945762003c9462003ad2565b8085161562003ca257918102915b93841c939080029062003c56565b509250929050565b5f8262003cc8575060016200077e565b8162003cd657505f6200077e565b816001811462003cef576002811462003cfa5762003d1a565b60019150506200077e565b60ff84111562003d0e5762003d0e62003ad2565b50506001821b6200077e565b5060208310610133831016604e8410600b841016171562003d3f575081810a6200077e565b62003d4b838362003c51565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d805762003d8062003ad2565b029392505050565b5f6200345c838362003cb8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f808585111562003dd1575f80fd5b8386111562003dde575f80fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003e2c5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562003e4b575f80fd5b873562003e58816200321a565b9650602088013562003e6a816200321a565b955060408801359450606088013593506080880135620034da8162003463565b5f805f805f805f80610100898b03121562003ea3575f80fd5b883562003eb0816200321a565b9750602089013562003ec2816200321a565b96506040890135955060608901359450608089013562003ee28162003279565b935060a089013562003ef48162003463565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562003f22575f80fd5b81516200345c8162003463565b5f6020828403121562003f40575f80fd5b81516200345c8162003279565b5f6020828403121562003f5e575f80fd5b815167ffffffffffffffff81111562003f75575f80fd5b8201601f8101841362003f86575f80fd5b805162003f97620038e8826200387f565b81815285602083850101111562003fac575f80fd5b62003fbf826020830160208601620037ec565b95945050505050565b602081525f6200345c60208301846200399056fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a2646970667358221220efc010afd4f7ef7135c2d52e7832f4d0832c536dbd0768cad0ec9406e70e02b864736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMBridgeMock.json b/compiled-contracts/PolygonZkEVMBridgeMock.json index d632e253b..80c9d0f50 100644 --- a/compiled-contracts/PolygonZkEVMBridgeMock.json +++ b/compiled-contracts/PolygonZkEVMBridgeMock.json @@ -478,6 +478,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "getDepositRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -527,19 +540,6 @@ "stateMutability": "pure", "type": "function" }, - { - "inputs": [], - "name": "getRoot", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -867,8 +867,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561000f575f80fd5b50615f348061001d5f395ff3fe608060405260043610620001df575f3560e01c8063715018a61162000106578063bab161bf116200009e578063dbc16976116200006a578063dbc169761462000704578063ee25560b146200071b578063f2fde38b146200074a578063fb570834146200076e575f80fd5b8063bab161bf1462000642578063be5831c7146200067b578063cd58657914620006b6578063d02103ca14620006cd575f80fd5b80638da5cb5b11620000de5780638da5cb5b146200059857806391e57e2d14620005c45780639e34070f14620005db578063aaa13cc2146200061e575f80fd5b8063715018a6146200052557806379e2cf97146200053c57806381b1c1741462000553575f80fd5b80632d2c9d94116200017a57806334ac9cf2116200015257806334ac9cf214620003ca5780633e19704314620003f85780635ca1e16514620004ea578063647c576c1462000501575f80fd5b80632d2c9d9414620002f95780632dfdf0b5146200031d578063318aee3d1462000343575f80fd5b8063240ff37811620001ba578063240ff37814620002765780632b5e42e7146200028d5780632c3f58cd14620002b15780632cffd02e14620002d5575f80fd5b806315064c9614620001e35780632072f6c5146200021357806322e95f2c146200022c575b5f80fd5b348015620001ef575f80fd5b50606854620001fe9060ff1681565b60405190151581526020015b60405180910390f35b3480156200021f575f80fd5b506200022a62000792565b005b34801562000238575f80fd5b50620002506200024a36600462003638565b620007f0565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016200020a565b6200022a62000287366004620036c8565b62000892565b34801562000299575f80fd5b506200022a620002ab36600462003747565b62000ab9565b348015620002bd575f80fd5b506200022a620002cf3660046200375f565b62000ac8565b348015620002e1575f80fd5b506200022a620002f336600462003794565b62000b0e565b34801562000305575f80fd5b506200022a6200031736600462003794565b62001093565b34801562000329575f80fd5b506200033460535481565b6040519081526020016200020a565b3480156200034f575f80fd5b50620003986200036136600462003872565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff9091166020830152016200020a565b348015620003d6575f80fd5b50606c54620002509073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000404575f80fd5b5062000334620004163660046200389f565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b348015620004f6575f80fd5b506200033462001293565b3480156200050d575f80fd5b506200022a6200051f36600462003924565b62001378565b34801562000531575f80fd5b506200022a620015cd565b34801562000548575f80fd5b506200022a620015e2565b3480156200055f575f80fd5b50620002506200057136600462003747565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005a4575f80fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff1662000250565b348015620005d0575f80fd5b506200033460d15481565b348015620005e7575f80fd5b50620001fe620005f936600462003747565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b3480156200062a575f80fd5b50620002506200063c36600462003971565b6200161c565b3480156200064e575f80fd5b506068546200066590610100900463ffffffff1681565b60405163ffffffff90911681526020016200020a565b34801562000687575f80fd5b506068546200066590790100000000000000000000000000000000000000000000000000900463ffffffff1681565b6200022a620006c736600462003a1e565b62001806565b348015620006d9575f80fd5b50606854620002509065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000710575f80fd5b506200022a620018da565b34801562000727575f80fd5b50620003346200073936600462003747565b60696020525f908152604090205481565b34801562000756575f80fd5b506200022a6200076836600462003872565b62001936565b3480156200077a575f80fd5b50620001fe6200078c36600462003aba565b620019f3565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620007e4576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee62001adb565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620008d0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620008f65750600263ffffffff861610155b156200092e576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009849998979695949392919062003b4b565b60405180910390a162000aa162000a9b6001606860019054906101000a900463ffffffff16338989348989604051620009bf92919062003bc5565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001b6e565b821562000ab25762000ab262001c82565b5050505050565b62000ac362001d52565b60d155565b62000ad262001d52565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b4c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b628b8b8b8b8b8b8b8b8b8b8b5f62001dd5565b73ffffffffffffffffffffffffffffffffffffffff861662000c3a57604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000bb6919062003c25565b5f6040518083038185875af1925050503d805f811462000bf2576040519150601f19603f3d011682016040523d82523d5f602084013e62000bf7565b606091505b505090508062000c33576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506200101b565b60685463ffffffff61010090910481169088160362000c7c5762000c7673ffffffffffffffffffffffffffffffffffffffff8716858562001fc0565b6200101b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000f92575f808062000d4e8688018862003d34565b9250925092505f8584848460405162000d6790620035f4565b62000d759392919062003df0565b8190604051809103905ff590508015801562000d93573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000e06575f80fd5b505af115801562000e19573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000f8095949392919062003e2c565b60405180910390a15050505062001018565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562001000575f80fd5b505af115801562001013573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff1615620010d1576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620010e88b8b8b8b8b8b8b8b8b8b8b600162001dd5565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a86866040516024016200111a949392919062003e73565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200119d919062003c25565b5f6040518083038185875af1925050503d805f8114620011d9576040519150601f19603f3d011682016040523d82523d5f602084013e620011de565b606091505b50509050806200121a576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200136f578083901c600116600103620013005760338160208110620012cc57620012cc62003eba565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200132d565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013669062003f14565b9150506200129d565b50919392505050565b5f54610100900460ff16158080156200139757505f54600160ff909116105b80620013b25750303b158015620013b257505f5460ff166001145b62001444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014a1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d1556200156462002096565b8015620015c7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b620015d762001d52565b620007ee5f62002134565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620007ee57620007ee62001c82565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180602001620016b090620035f4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620016fb908d908d908d908d908d9060200162003f4e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001739929160200162003f8e565b60405160208183030381529060405280519060200120604051602001620017c294939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d154341115620018c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200143b565b620018d187878787878787620021aa565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff1633146200192c576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee620026f3565b6200194062001d52565b73ffffffffffffffffffffffffffffffffffffffff8116620019e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200143b565b620019f08162002134565b50565b5f84815b602081101562001acd57600163ffffffff8616821c8116900362001a695785816020811062001a2a5762001a2a62003eba565b60200201358260405160200162001a4b929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001ab8565b8186826020811062001a7f5762001a7f62003eba565b602002013560405160200162001a9f929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001ac48162003f14565b915050620019f7565b50821490505b949350505050565b60685460ff161562001b19576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001b7f60206002620040f7565b62001b8b919062004104565b6053541062001bc6576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001bd79062003f14565b918290555090505f5b602081101562001c72578082901c60011660010362001c1857826033826020811062001c105762001c1062003eba565b015550505050565b6033816020811062001c2e5762001c2e62003eba565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001c699062003f14565b91505062001be0565b5062001c7d6200411a565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001d0862001293565b6040518263ffffffff1660e01b815260040162001d2791815260200190565b5f604051808303815f87803b15801562001d3f575f80fd5b505af1158015620015c7573d5f803e3d5ffd5b609f5473ffffffffffffffffffffffffffffffffffffffff163314620007ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200143b565b62001de68b63ffffffff1662002782565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af115801562001e85573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001eab919062004147565b9050805f0362001ee6576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462001f30576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff1662001f4d57508962001f50565b508a5b62001f7962001f70848c8c8c8c8c8c8c604051620009bf92919062003bc5565b8f8f84620019f3565b62001fb0576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001c7d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152620027e6565b5f54610100900460ff166200212e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200143b565b620007ee335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60685460ff1615620021e8576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620021f2620028f8565b60685463ffffffff888116610100909204161480620022185750600263ffffffff881610155b1562002250576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff8816620022b457883414620022ab576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f9250620025a1565b3415620022ed576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620023d6576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b158015620023ac575f80fd5b505af1158015620023bf573d5f803e3d5ffd5b5050505080602001519450805f015193506200259f565b8515620023eb57620023eb898b89896200296d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa15801562002456573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200247c919062004147565b9050620024a273ffffffffffffffffffffffffffffffffffffffff8b1633308e62002e80565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa1580156200250d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002533919062004147565b905062002541828262004104565b6068548c9850610100900463ffffffff1696509350620025618762002ee0565b6200256c8c62002ff4565b620025778d620030fd565b6040516020016200258b9392919062003df0565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620025e29897969594939291906200415f565b60405180910390a1620026d462000a9b5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b8615620026e557620026e562001c82565b50505050620018d160018055565b60685460ff1662002730576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000ab2576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002849826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031f59092919063ffffffff16565b80519091501562001c7d57808060200190518101906200286a9190620041d7565b62001c7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200143b565b60026001540362002966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200143b565b6002600155565b5f6200297d6004828486620041f5565b62002988916200421e565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002c02575f808080808080620029ea896004818d620041f5565b810190620029f9919062004267565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002a6d576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002abd576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002af7576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002bb2919062003c25565b5f604051808303815f865af19150503d805f811462002bed576040519150601f19603f3d011682016040523d82523d5f602084013e62002bf2565b606091505b5050505050505050505062000ab2565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002c7e576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080808080808062002c958a6004818e620041f5565b81019062002ca49190620042bd565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002d1a576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002d6a576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002e2e919062003c25565b5f604051808303815f865af19150503d805f811462002e69576040519150601f19603f3d011682016040523d82523d5f602084013e62002e6e565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620015c79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002013565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002f63919062003c25565b5f60405180830381855afa9150503d805f811462002f9d576040519150601f19603f3d011682016040523d82523d5f602084013e62002fa2565b606091505b50915091508162002fe9576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001ad3565b62001ad38162003205565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162003077919062003c25565b5f60405180830381855afa9150503d805f8114620030b1576040519150601f19603f3d011682016040523d82523d5f602084013e620030b6565b606091505b50915091508162002fe9576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001ad3565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff8616916200317f919062003c25565b5f60405180830381855afa9150503d805f8114620031b9576040519150601f19603f3d011682016040523d82523d5f602084013e620031be565b606091505b5091509150818015620031d2575080516020145b620031df57601262001ad3565b8080602001905181019062001ad3919062004344565b606062001ad384845f85620033f0565b606060408251106200322757818060200190518101906200088c919062004362565b8151602003620033b2575f5b6020811080156200327e575082818151811062003254576200325462003eba565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620032995780620032908162003f14565b91505062003233565b805f03620032dc57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115620032f957620032f962003bd4565b6040519080825280601f01601f19166020018201604052801562003324576020820181803683370190505b5090505f5b82811015620033aa5784818151811062003347576200334762003eba565b602001015160f81c60f81b82828151811062003367576200336762003eba565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620033a18162003f14565b91505062003329565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200143b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051620034ae919062003c25565b5f6040518083038185875af1925050503d805f8114620034ea576040519150601f19603f3d011682016040523d82523d5f602084013e620034ef565b606091505b509150915062003502878383876200350d565b979650505050505050565b60608315620035a75782515f036200359f5773ffffffffffffffffffffffffffffffffffffffff85163b6200359f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200143b565b508162001ad3565b62001ad38383815115620035be5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200143b9190620043dd565b611b0d80620043f283390190565b803563ffffffff81168114620033eb575f80fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620019f0575f80fd5b5f80604083850312156200364a575f80fd5b620036558362003602565b91506020830135620036678162003616565b809150509250929050565b8015158114620019f0575f80fd5b5f8083601f84011262003691575f80fd5b50813567ffffffffffffffff811115620036a9575f80fd5b602083019150836020828501011115620036c1575f80fd5b9250929050565b5f805f805f60808688031215620036dd575f80fd5b620036e88662003602565b94506020860135620036fa8162003616565b935060408601356200370c8162003672565b9250606086013567ffffffffffffffff81111562003728575f80fd5b620037368882890162003680565b969995985093965092949392505050565b5f6020828403121562003758575f80fd5b5035919050565b5f6020828403121562003770575f80fd5b6200377b8262003602565b9392505050565b8061040081018310156200088c575f80fd5b5f805f805f805f805f805f6105208c8e031215620037b0575f80fd5b620037bc8d8d62003782565b9a50620037cd6104008d0162003602565b99506104208c013598506104408c01359750620037ee6104608d0162003602565b96506104808c0135620038018162003616565b9550620038126104a08d0162003602565b94506104c08c0135620038258162003616565b93506104e08c013592506105008c013567ffffffffffffffff8111156200384a575f80fd5b620038588e828f0162003680565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562003883575f80fd5b81356200377b8162003616565b60ff81168114620019f0575f80fd5b5f805f805f805f60e0888a031215620038b6575f80fd5b8735620038c38162003890565b9650620038d36020890162003602565b95506040880135620038e58162003616565b9450620038f56060890162003602565b93506080880135620039078162003616565b9699959850939692959460a0840135945060c09093013592915050565b5f805f6060848603121562003937575f80fd5b620039428462003602565b92506020840135620039548162003616565b91506040840135620039668162003616565b809150509250925092565b5f805f805f805f60a0888a03121562003988575f80fd5b620039938862003602565b96506020880135620039a58162003616565b9550604088013567ffffffffffffffff80821115620039c2575f80fd5b620039d08b838c0162003680565b909750955060608a0135915080821115620039e9575f80fd5b50620039f88a828b0162003680565b909450925050608088013562003a0e8162003890565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003a35575f80fd5b62003a408862003602565b9650602088013562003a528162003616565b955060408801359450606088013562003a6b8162003616565b9350608088013562003a7d8162003672565b925060a088013567ffffffffffffffff81111562003a99575f80fd5b62003aa78a828b0162003680565b989b979a50959850939692959293505050565b5f805f80610460858703121562003acf575f80fd5b8435935062003ae2866020870162003782565b925062003af3610420860162003602565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003bab828501878962003b04565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003c1d57818101518382015260200162003c03565b50505f910152565b5f825162003c3881846020870162003c01565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003c8c5762003c8c62003bd4565b604052919050565b5f67ffffffffffffffff82111562003cb05762003cb062003bd4565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011262003cec575f80fd5b813562003d0362003cfd8262003c94565b62003c42565b81815284602083860101111562003d18575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003d47575f80fd5b833567ffffffffffffffff8082111562003d5f575f80fd5b62003d6d8783880162003cdc565b9450602086013591508082111562003d83575f80fd5b5062003d928682870162003cdc565b9250506040840135620039668162003890565b5f815180845262003dbe81602086016020860162003c01565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f62003e04606083018662003da5565b828103602084015262003e18818662003da5565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200350260808301848662003b04565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003eb060608301848662003b04565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003f475762003f4762003ee7565b5060010190565b606081525f62003f6360608301878962003b04565b828103602084015262003f7881868862003b04565b91505060ff831660408301529695505050505050565b5f835162003fa181846020880162003c01565b83519083019062003fb781836020880162003c01565b01949350505050565b600181815b808511156200401f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562004003576200400362003ee7565b808516156200401157918102915b93841c939080029062003fc5565b509250929050565b5f8262004037575060016200088c565b816200404557505f6200088c565b81600181146200405e5760028114620040695762004089565b60019150506200088c565b60ff8411156200407d576200407d62003ee7565b50506001821b6200088c565b5060208310610133831016604e8410600b8410161715620040ae575081810a6200088c565b620040ba838362003fc0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620040ef57620040ef62003ee7565b029392505050565b5f6200377b838362004027565b818103818111156200088c576200088c62003ee7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6020828403121562004158575f80fd5b5051919050565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620041be8285018762003da5565b925080851660e085015250509998505050505050505050565b5f60208284031215620041e8575f80fd5b81516200377b8162003672565b5f808585111562004204575f80fd5b8386111562004211575f80fd5b5050820193919092039150565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156200425f5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a0312156200427e575f80fd5b87356200428b8162003616565b965060208801356200429d8162003616565b955060408801359450606088013593506080880135620039078162003890565b5f805f805f805f80610100898b031215620042d6575f80fd5b8835620042e38162003616565b97506020890135620042f58162003616565b965060408901359550606089013594506080890135620043158162003672565b935060a0890135620043278162003890565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004355575f80fd5b81516200377b8162003890565b5f6020828403121562004373575f80fd5b815167ffffffffffffffff8111156200438a575f80fd5b8201601f810184136200439b575f80fd5b8051620043ac62003cfd8262003c94565b818152856020838501011115620043c1575f80fd5b620043d482602083016020860162003c01565b95945050505050565b602081525f6200377b602083018462003da556fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a2646970667358221220afdccfa9486655f8756b2a046212d040fae4be6515fb658fcf4d74aa59ae08e964736f6c63430008140033", - "deployedBytecode": "0x608060405260043610620001df575f3560e01c8063715018a61162000106578063bab161bf116200009e578063dbc16976116200006a578063dbc169761462000704578063ee25560b146200071b578063f2fde38b146200074a578063fb570834146200076e575f80fd5b8063bab161bf1462000642578063be5831c7146200067b578063cd58657914620006b6578063d02103ca14620006cd575f80fd5b80638da5cb5b11620000de5780638da5cb5b146200059857806391e57e2d14620005c45780639e34070f14620005db578063aaa13cc2146200061e575f80fd5b8063715018a6146200052557806379e2cf97146200053c57806381b1c1741462000553575f80fd5b80632d2c9d94116200017a57806334ac9cf2116200015257806334ac9cf214620003ca5780633e19704314620003f85780635ca1e16514620004ea578063647c576c1462000501575f80fd5b80632d2c9d9414620002f95780632dfdf0b5146200031d578063318aee3d1462000343575f80fd5b8063240ff37811620001ba578063240ff37814620002765780632b5e42e7146200028d5780632c3f58cd14620002b15780632cffd02e14620002d5575f80fd5b806315064c9614620001e35780632072f6c5146200021357806322e95f2c146200022c575b5f80fd5b348015620001ef575f80fd5b50606854620001fe9060ff1681565b60405190151581526020015b60405180910390f35b3480156200021f575f80fd5b506200022a62000792565b005b34801562000238575f80fd5b50620002506200024a36600462003638565b620007f0565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016200020a565b6200022a62000287366004620036c8565b62000892565b34801562000299575f80fd5b506200022a620002ab36600462003747565b62000ab9565b348015620002bd575f80fd5b506200022a620002cf3660046200375f565b62000ac8565b348015620002e1575f80fd5b506200022a620002f336600462003794565b62000b0e565b34801562000305575f80fd5b506200022a6200031736600462003794565b62001093565b34801562000329575f80fd5b506200033460535481565b6040519081526020016200020a565b3480156200034f575f80fd5b50620003986200036136600462003872565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff9091166020830152016200020a565b348015620003d6575f80fd5b50606c54620002509073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000404575f80fd5b5062000334620004163660046200389f565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b348015620004f6575f80fd5b506200033462001293565b3480156200050d575f80fd5b506200022a6200051f36600462003924565b62001378565b34801562000531575f80fd5b506200022a620015cd565b34801562000548575f80fd5b506200022a620015e2565b3480156200055f575f80fd5b50620002506200057136600462003747565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005a4575f80fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff1662000250565b348015620005d0575f80fd5b506200033460d15481565b348015620005e7575f80fd5b50620001fe620005f936600462003747565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b3480156200062a575f80fd5b50620002506200063c36600462003971565b6200161c565b3480156200064e575f80fd5b506068546200066590610100900463ffffffff1681565b60405163ffffffff90911681526020016200020a565b34801562000687575f80fd5b506068546200066590790100000000000000000000000000000000000000000000000000900463ffffffff1681565b6200022a620006c736600462003a1e565b62001806565b348015620006d9575f80fd5b50606854620002509065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000710575f80fd5b506200022a620018da565b34801562000727575f80fd5b50620003346200073936600462003747565b60696020525f908152604090205481565b34801562000756575f80fd5b506200022a6200076836600462003872565b62001936565b3480156200077a575f80fd5b50620001fe6200078c36600462003aba565b620019f3565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620007e4576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee62001adb565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620008d0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620008f65750600263ffffffff861610155b156200092e576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009849998979695949392919062003b4b565b60405180910390a162000aa162000a9b6001606860019054906101000a900463ffffffff16338989348989604051620009bf92919062003bc5565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001b6e565b821562000ab25762000ab262001c82565b5050505050565b62000ac362001d52565b60d155565b62000ad262001d52565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b4c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b628b8b8b8b8b8b8b8b8b8b8b5f62001dd5565b73ffffffffffffffffffffffffffffffffffffffff861662000c3a57604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000bb6919062003c25565b5f6040518083038185875af1925050503d805f811462000bf2576040519150601f19603f3d011682016040523d82523d5f602084013e62000bf7565b606091505b505090508062000c33576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506200101b565b60685463ffffffff61010090910481169088160362000c7c5762000c7673ffffffffffffffffffffffffffffffffffffffff8716858562001fc0565b6200101b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000f92575f808062000d4e8688018862003d34565b9250925092505f8584848460405162000d6790620035f4565b62000d759392919062003df0565b8190604051809103905ff590508015801562000d93573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000e06575f80fd5b505af115801562000e19573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000f8095949392919062003e2c565b60405180910390a15050505062001018565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562001000575f80fd5b505af115801562001013573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff1615620010d1576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620010e88b8b8b8b8b8b8b8b8b8b8b600162001dd5565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a86866040516024016200111a949392919062003e73565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200119d919062003c25565b5f6040518083038185875af1925050503d805f8114620011d9576040519150601f19603f3d011682016040523d82523d5f602084013e620011de565b606091505b50509050806200121a576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200136f578083901c600116600103620013005760338160208110620012cc57620012cc62003eba565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200132d565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013669062003f14565b9150506200129d565b50919392505050565b5f54610100900460ff16158080156200139757505f54600160ff909116105b80620013b25750303b158015620013b257505f5460ff166001145b62001444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014a1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d1556200156462002096565b8015620015c7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b620015d762001d52565b620007ee5f62002134565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620007ee57620007ee62001c82565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180602001620016b090620035f4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620016fb908d908d908d908d908d9060200162003f4e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001739929160200162003f8e565b60405160208183030381529060405280519060200120604051602001620017c294939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d154341115620018c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200143b565b620018d187878787878787620021aa565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff1633146200192c576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee620026f3565b6200194062001d52565b73ffffffffffffffffffffffffffffffffffffffff8116620019e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200143b565b620019f08162002134565b50565b5f84815b602081101562001acd57600163ffffffff8616821c8116900362001a695785816020811062001a2a5762001a2a62003eba565b60200201358260405160200162001a4b929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001ab8565b8186826020811062001a7f5762001a7f62003eba565b602002013560405160200162001a9f929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001ac48162003f14565b915050620019f7565b50821490505b949350505050565b60685460ff161562001b19576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001b7f60206002620040f7565b62001b8b919062004104565b6053541062001bc6576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001bd79062003f14565b918290555090505f5b602081101562001c72578082901c60011660010362001c1857826033826020811062001c105762001c1062003eba565b015550505050565b6033816020811062001c2e5762001c2e62003eba565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001c699062003f14565b91505062001be0565b5062001c7d6200411a565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001d0862001293565b6040518263ffffffff1660e01b815260040162001d2791815260200190565b5f604051808303815f87803b15801562001d3f575f80fd5b505af1158015620015c7573d5f803e3d5ffd5b609f5473ffffffffffffffffffffffffffffffffffffffff163314620007ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200143b565b62001de68b63ffffffff1662002782565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af115801562001e85573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001eab919062004147565b9050805f0362001ee6576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462001f30576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff1662001f4d57508962001f50565b508a5b62001f7962001f70848c8c8c8c8c8c8c604051620009bf92919062003bc5565b8f8f84620019f3565b62001fb0576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001c7d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152620027e6565b5f54610100900460ff166200212e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200143b565b620007ee335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60685460ff1615620021e8576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620021f2620028f8565b60685463ffffffff888116610100909204161480620022185750600263ffffffff881610155b1562002250576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff8816620022b457883414620022ab576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f9250620025a1565b3415620022ed576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620023d6576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b158015620023ac575f80fd5b505af1158015620023bf573d5f803e3d5ffd5b5050505080602001519450805f015193506200259f565b8515620023eb57620023eb898b89896200296d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa15801562002456573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200247c919062004147565b9050620024a273ffffffffffffffffffffffffffffffffffffffff8b1633308e62002e80565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa1580156200250d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002533919062004147565b905062002541828262004104565b6068548c9850610100900463ffffffff1696509350620025618762002ee0565b6200256c8c62002ff4565b620025778d620030fd565b6040516020016200258b9392919062003df0565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620025e29897969594939291906200415f565b60405180910390a1620026d462000a9b5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b8615620026e557620026e562001c82565b50505050620018d160018055565b60685460ff1662002730576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000ab2576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002849826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031f59092919063ffffffff16565b80519091501562001c7d57808060200190518101906200286a9190620041d7565b62001c7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200143b565b60026001540362002966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200143b565b6002600155565b5f6200297d6004828486620041f5565b62002988916200421e565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002c02575f808080808080620029ea896004818d620041f5565b810190620029f9919062004267565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002a6d576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002abd576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002af7576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002bb2919062003c25565b5f604051808303815f865af19150503d805f811462002bed576040519150601f19603f3d011682016040523d82523d5f602084013e62002bf2565b606091505b5050505050505050505062000ab2565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002c7e576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080808080808062002c958a6004818e620041f5565b81019062002ca49190620042bd565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002d1a576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002d6a576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002e2e919062003c25565b5f604051808303815f865af19150503d805f811462002e69576040519150601f19603f3d011682016040523d82523d5f602084013e62002e6e565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620015c79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002013565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002f63919062003c25565b5f60405180830381855afa9150503d805f811462002f9d576040519150601f19603f3d011682016040523d82523d5f602084013e62002fa2565b606091505b50915091508162002fe9576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001ad3565b62001ad38162003205565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162003077919062003c25565b5f60405180830381855afa9150503d805f8114620030b1576040519150601f19603f3d011682016040523d82523d5f602084013e620030b6565b606091505b50915091508162002fe9576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001ad3565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff8616916200317f919062003c25565b5f60405180830381855afa9150503d805f8114620031b9576040519150601f19603f3d011682016040523d82523d5f602084013e620031be565b606091505b5091509150818015620031d2575080516020145b620031df57601262001ad3565b8080602001905181019062001ad3919062004344565b606062001ad384845f85620033f0565b606060408251106200322757818060200190518101906200088c919062004362565b8151602003620033b2575f5b6020811080156200327e575082818151811062003254576200325462003eba565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620032995780620032908162003f14565b91505062003233565b805f03620032dc57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115620032f957620032f962003bd4565b6040519080825280601f01601f19166020018201604052801562003324576020820181803683370190505b5090505f5b82811015620033aa5784818151811062003347576200334762003eba565b602001015160f81c60f81b82828151811062003367576200336762003eba565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620033a18162003f14565b91505062003329565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200143b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051620034ae919062003c25565b5f6040518083038185875af1925050503d805f8114620034ea576040519150601f19603f3d011682016040523d82523d5f602084013e620034ef565b606091505b509150915062003502878383876200350d565b979650505050505050565b60608315620035a75782515f036200359f5773ffffffffffffffffffffffffffffffffffffffff85163b6200359f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200143b565b508162001ad3565b62001ad38383815115620035be5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200143b9190620043dd565b611b0d80620043f283390190565b803563ffffffff81168114620033eb575f80fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620019f0575f80fd5b5f80604083850312156200364a575f80fd5b620036558362003602565b91506020830135620036678162003616565b809150509250929050565b8015158114620019f0575f80fd5b5f8083601f84011262003691575f80fd5b50813567ffffffffffffffff811115620036a9575f80fd5b602083019150836020828501011115620036c1575f80fd5b9250929050565b5f805f805f60808688031215620036dd575f80fd5b620036e88662003602565b94506020860135620036fa8162003616565b935060408601356200370c8162003672565b9250606086013567ffffffffffffffff81111562003728575f80fd5b620037368882890162003680565b969995985093965092949392505050565b5f6020828403121562003758575f80fd5b5035919050565b5f6020828403121562003770575f80fd5b6200377b8262003602565b9392505050565b8061040081018310156200088c575f80fd5b5f805f805f805f805f805f6105208c8e031215620037b0575f80fd5b620037bc8d8d62003782565b9a50620037cd6104008d0162003602565b99506104208c013598506104408c01359750620037ee6104608d0162003602565b96506104808c0135620038018162003616565b9550620038126104a08d0162003602565b94506104c08c0135620038258162003616565b93506104e08c013592506105008c013567ffffffffffffffff8111156200384a575f80fd5b620038588e828f0162003680565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562003883575f80fd5b81356200377b8162003616565b60ff81168114620019f0575f80fd5b5f805f805f805f60e0888a031215620038b6575f80fd5b8735620038c38162003890565b9650620038d36020890162003602565b95506040880135620038e58162003616565b9450620038f56060890162003602565b93506080880135620039078162003616565b9699959850939692959460a0840135945060c09093013592915050565b5f805f6060848603121562003937575f80fd5b620039428462003602565b92506020840135620039548162003616565b91506040840135620039668162003616565b809150509250925092565b5f805f805f805f60a0888a03121562003988575f80fd5b620039938862003602565b96506020880135620039a58162003616565b9550604088013567ffffffffffffffff80821115620039c2575f80fd5b620039d08b838c0162003680565b909750955060608a0135915080821115620039e9575f80fd5b50620039f88a828b0162003680565b909450925050608088013562003a0e8162003890565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003a35575f80fd5b62003a408862003602565b9650602088013562003a528162003616565b955060408801359450606088013562003a6b8162003616565b9350608088013562003a7d8162003672565b925060a088013567ffffffffffffffff81111562003a99575f80fd5b62003aa78a828b0162003680565b989b979a50959850939692959293505050565b5f805f80610460858703121562003acf575f80fd5b8435935062003ae2866020870162003782565b925062003af3610420860162003602565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003bab828501878962003b04565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003c1d57818101518382015260200162003c03565b50505f910152565b5f825162003c3881846020870162003c01565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003c8c5762003c8c62003bd4565b604052919050565b5f67ffffffffffffffff82111562003cb05762003cb062003bd4565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011262003cec575f80fd5b813562003d0362003cfd8262003c94565b62003c42565b81815284602083860101111562003d18575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003d47575f80fd5b833567ffffffffffffffff8082111562003d5f575f80fd5b62003d6d8783880162003cdc565b9450602086013591508082111562003d83575f80fd5b5062003d928682870162003cdc565b9250506040840135620039668162003890565b5f815180845262003dbe81602086016020860162003c01565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f62003e04606083018662003da5565b828103602084015262003e18818662003da5565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200350260808301848662003b04565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003eb060608301848662003b04565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003f475762003f4762003ee7565b5060010190565b606081525f62003f6360608301878962003b04565b828103602084015262003f7881868862003b04565b91505060ff831660408301529695505050505050565b5f835162003fa181846020880162003c01565b83519083019062003fb781836020880162003c01565b01949350505050565b600181815b808511156200401f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562004003576200400362003ee7565b808516156200401157918102915b93841c939080029062003fc5565b509250929050565b5f8262004037575060016200088c565b816200404557505f6200088c565b81600181146200405e5760028114620040695762004089565b60019150506200088c565b60ff8411156200407d576200407d62003ee7565b50506001821b6200088c565b5060208310610133831016604e8410600b8410161715620040ae575081810a6200088c565b620040ba838362003fc0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620040ef57620040ef62003ee7565b029392505050565b5f6200377b838362004027565b818103818111156200088c576200088c62003ee7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6020828403121562004158575f80fd5b5051919050565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620041be8285018762003da5565b925080851660e085015250509998505050505050505050565b5f60208284031215620041e8575f80fd5b81516200377b8162003672565b5f808585111562004204575f80fd5b8386111562004211575f80fd5b5050820193919092039150565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156200425f5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a0312156200427e575f80fd5b87356200428b8162003616565b965060208801356200429d8162003616565b955060408801359450606088013593506080880135620039078162003890565b5f805f805f805f80610100898b031215620042d6575f80fd5b8835620042e38162003616565b97506020890135620042f58162003616565b965060408901359550606089013594506080890135620043158162003672565b935060a0890135620043278162003890565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004355575f80fd5b81516200377b8162003890565b5f6020828403121562004373575f80fd5b815167ffffffffffffffff8111156200438a575f80fd5b8201601f810184136200439b575f80fd5b8051620043ac62003cfd8262003c94565b818152856020838501011115620043c1575f80fd5b620043d482602083016020860162003c01565b95945050505050565b602081525f6200377b602083018462003da556fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a2646970667358221220afdccfa9486655f8756b2a046212d040fae4be6515fb658fcf4d74aa59ae08e964736f6c63430008140033", + "bytecode": "0x608060405234801561000f575f80fd5b50615f348061001d5f395ff3fe608060405260043610620001df575f3560e01c8063715018a61162000106578063bab161bf116200009e578063dbc16976116200006a578063dbc169761462000704578063ee25560b146200071b578063f2fde38b146200074a578063fb570834146200076e575f80fd5b8063bab161bf1462000642578063be5831c7146200067b578063cd58657914620006b6578063d02103ca14620006cd575f80fd5b80638da5cb5b11620000de5780638da5cb5b146200059857806391e57e2d14620005c45780639e34070f14620005db578063aaa13cc2146200061e575f80fd5b8063715018a6146200052557806379e2cf97146200053c57806381b1c1741462000553575f80fd5b80632d2c9d94116200017a57806334ac9cf2116200015257806334ac9cf214620003ca5780633ae0504714620003f85780633e197043146200040f578063647c576c1462000501575f80fd5b80632d2c9d9414620002f95780632dfdf0b5146200031d578063318aee3d1462000343575f80fd5b8063240ff37811620001ba578063240ff37814620002765780632b5e42e7146200028d5780632c3f58cd14620002b15780632cffd02e14620002d5575f80fd5b806315064c9614620001e35780632072f6c5146200021357806322e95f2c146200022c575b5f80fd5b348015620001ef575f80fd5b50606854620001fe9060ff1681565b60405190151581526020015b60405180910390f35b3480156200021f575f80fd5b506200022a62000792565b005b34801562000238575f80fd5b50620002506200024a36600462003638565b620007f0565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016200020a565b6200022a62000287366004620036c8565b62000892565b34801562000299575f80fd5b506200022a620002ab36600462003747565b62000ab9565b348015620002bd575f80fd5b506200022a620002cf3660046200375f565b62000ac8565b348015620002e1575f80fd5b506200022a620002f336600462003794565b62000b0e565b34801562000305575f80fd5b506200022a6200031736600462003794565b62001093565b34801562000329575f80fd5b506200033460535481565b6040519081526020016200020a565b3480156200034f575f80fd5b50620003986200036136600462003872565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff9091166020830152016200020a565b348015620003d6575f80fd5b50606c54620002509073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000404575f80fd5b506200033462001293565b3480156200041b575f80fd5b50620003346200042d3660046200389f565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200050d575f80fd5b506200022a6200051f36600462003924565b62001378565b34801562000531575f80fd5b506200022a620015cd565b34801562000548575f80fd5b506200022a620015e2565b3480156200055f575f80fd5b50620002506200057136600462003747565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005a4575f80fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff1662000250565b348015620005d0575f80fd5b506200033460d15481565b348015620005e7575f80fd5b50620001fe620005f936600462003747565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b3480156200062a575f80fd5b50620002506200063c36600462003971565b6200161c565b3480156200064e575f80fd5b506068546200066590610100900463ffffffff1681565b60405163ffffffff90911681526020016200020a565b34801562000687575f80fd5b506068546200066590790100000000000000000000000000000000000000000000000000900463ffffffff1681565b6200022a620006c736600462003a1e565b62001806565b348015620006d9575f80fd5b50606854620002509065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000710575f80fd5b506200022a620018da565b34801562000727575f80fd5b50620003346200073936600462003747565b60696020525f908152604090205481565b34801562000756575f80fd5b506200022a6200076836600462003872565b62001936565b3480156200077a575f80fd5b50620001fe6200078c36600462003aba565b620019f3565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620007e4576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee62001adb565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620008d0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620008f65750600263ffffffff861610155b156200092e576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009849998979695949392919062003b4b565b60405180910390a162000aa162000a9b6001606860019054906101000a900463ffffffff16338989348989604051620009bf92919062003bc5565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001b6e565b821562000ab25762000ab262001c82565b5050505050565b62000ac362001d52565b60d155565b62000ad262001d52565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b4c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b628b8b8b8b8b8b8b8b8b8b8b5f62001dd5565b73ffffffffffffffffffffffffffffffffffffffff861662000c3a57604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000bb6919062003c25565b5f6040518083038185875af1925050503d805f811462000bf2576040519150601f19603f3d011682016040523d82523d5f602084013e62000bf7565b606091505b505090508062000c33576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506200101b565b60685463ffffffff61010090910481169088160362000c7c5762000c7673ffffffffffffffffffffffffffffffffffffffff8716858562001fc0565b6200101b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000f92575f808062000d4e8688018862003d34565b9250925092505f8584848460405162000d6790620035f4565b62000d759392919062003df0565b8190604051809103905ff590508015801562000d93573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000e06575f80fd5b505af115801562000e19573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000f8095949392919062003e2c565b60405180910390a15050505062001018565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562001000575f80fd5b505af115801562001013573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff1615620010d1576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620010e88b8b8b8b8b8b8b8b8b8b8b600162001dd5565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a86866040516024016200111a949392919062003e73565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200119d919062003c25565b5f6040518083038185875af1925050503d805f8114620011d9576040519150601f19603f3d011682016040523d82523d5f602084013e620011de565b606091505b50509050806200121a576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200136f578083901c600116600103620013005760338160208110620012cc57620012cc62003eba565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200132d565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013669062003f14565b9150506200129d565b50919392505050565b5f54610100900460ff16158080156200139757505f54600160ff909116105b80620013b25750303b158015620013b257505f5460ff166001145b62001444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014a1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d1556200156462002096565b8015620015c7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b620015d762001d52565b620007ee5f62002134565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620007ee57620007ee62001c82565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180602001620016b090620035f4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620016fb908d908d908d908d908d9060200162003f4e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001739929160200162003f8e565b60405160208183030381529060405280519060200120604051602001620017c294939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d154341115620018c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200143b565b620018d187878787878787620021aa565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff1633146200192c576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee620026f3565b6200194062001d52565b73ffffffffffffffffffffffffffffffffffffffff8116620019e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200143b565b620019f08162002134565b50565b5f84815b602081101562001acd57600163ffffffff8616821c8116900362001a695785816020811062001a2a5762001a2a62003eba565b60200201358260405160200162001a4b929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001ab8565b8186826020811062001a7f5762001a7f62003eba565b602002013560405160200162001a9f929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001ac48162003f14565b915050620019f7565b50821490505b949350505050565b60685460ff161562001b19576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001b7f60206002620040f7565b62001b8b919062004104565b6053541062001bc6576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001bd79062003f14565b918290555090505f5b602081101562001c72578082901c60011660010362001c1857826033826020811062001c105762001c1062003eba565b015550505050565b6033816020811062001c2e5762001c2e62003eba565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001c699062003f14565b91505062001be0565b5062001c7d6200411a565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001d0862001293565b6040518263ffffffff1660e01b815260040162001d2791815260200190565b5f604051808303815f87803b15801562001d3f575f80fd5b505af1158015620015c7573d5f803e3d5ffd5b609f5473ffffffffffffffffffffffffffffffffffffffff163314620007ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200143b565b62001de68b63ffffffff1662002782565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af115801562001e85573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001eab919062004147565b9050805f0362001ee6576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462001f30576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff1662001f4d57508962001f50565b508a5b62001f7962001f70848c8c8c8c8c8c8c604051620009bf92919062003bc5565b8f8f84620019f3565b62001fb0576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001c7d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152620027e6565b5f54610100900460ff166200212e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200143b565b620007ee335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60685460ff1615620021e8576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620021f2620028f8565b60685463ffffffff888116610100909204161480620022185750600263ffffffff881610155b1562002250576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff8816620022b457883414620022ab576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f9250620025a1565b3415620022ed576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620023d6576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b158015620023ac575f80fd5b505af1158015620023bf573d5f803e3d5ffd5b5050505080602001519450805f015193506200259f565b8515620023eb57620023eb898b89896200296d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa15801562002456573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200247c919062004147565b9050620024a273ffffffffffffffffffffffffffffffffffffffff8b1633308e62002e80565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa1580156200250d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002533919062004147565b905062002541828262004104565b6068548c9850610100900463ffffffff1696509350620025618762002ee0565b6200256c8c62002ff4565b620025778d620030fd565b6040516020016200258b9392919062003df0565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620025e29897969594939291906200415f565b60405180910390a1620026d462000a9b5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b8615620026e557620026e562001c82565b50505050620018d160018055565b60685460ff1662002730576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000ab2576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002849826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031f59092919063ffffffff16565b80519091501562001c7d57808060200190518101906200286a9190620041d7565b62001c7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200143b565b60026001540362002966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200143b565b6002600155565b5f6200297d6004828486620041f5565b62002988916200421e565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002c02575f808080808080620029ea896004818d620041f5565b810190620029f9919062004267565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002a6d576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002abd576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002af7576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002bb2919062003c25565b5f604051808303815f865af19150503d805f811462002bed576040519150601f19603f3d011682016040523d82523d5f602084013e62002bf2565b606091505b5050505050505050505062000ab2565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002c7e576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080808080808062002c958a6004818e620041f5565b81019062002ca49190620042bd565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002d1a576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002d6a576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002e2e919062003c25565b5f604051808303815f865af19150503d805f811462002e69576040519150601f19603f3d011682016040523d82523d5f602084013e62002e6e565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620015c79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002013565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002f63919062003c25565b5f60405180830381855afa9150503d805f811462002f9d576040519150601f19603f3d011682016040523d82523d5f602084013e62002fa2565b606091505b50915091508162002fe9576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001ad3565b62001ad38162003205565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162003077919062003c25565b5f60405180830381855afa9150503d805f8114620030b1576040519150601f19603f3d011682016040523d82523d5f602084013e620030b6565b606091505b50915091508162002fe9576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001ad3565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff8616916200317f919062003c25565b5f60405180830381855afa9150503d805f8114620031b9576040519150601f19603f3d011682016040523d82523d5f602084013e620031be565b606091505b5091509150818015620031d2575080516020145b620031df57601262001ad3565b8080602001905181019062001ad3919062004344565b606062001ad384845f85620033f0565b606060408251106200322757818060200190518101906200088c919062004362565b8151602003620033b2575f5b6020811080156200327e575082818151811062003254576200325462003eba565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620032995780620032908162003f14565b91505062003233565b805f03620032dc57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115620032f957620032f962003bd4565b6040519080825280601f01601f19166020018201604052801562003324576020820181803683370190505b5090505f5b82811015620033aa5784818151811062003347576200334762003eba565b602001015160f81c60f81b82828151811062003367576200336762003eba565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620033a18162003f14565b91505062003329565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200143b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051620034ae919062003c25565b5f6040518083038185875af1925050503d805f8114620034ea576040519150601f19603f3d011682016040523d82523d5f602084013e620034ef565b606091505b509150915062003502878383876200350d565b979650505050505050565b60608315620035a75782515f036200359f5773ffffffffffffffffffffffffffffffffffffffff85163b6200359f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200143b565b508162001ad3565b62001ad38383815115620035be5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200143b9190620043dd565b611b0d80620043f283390190565b803563ffffffff81168114620033eb575f80fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620019f0575f80fd5b5f80604083850312156200364a575f80fd5b620036558362003602565b91506020830135620036678162003616565b809150509250929050565b8015158114620019f0575f80fd5b5f8083601f84011262003691575f80fd5b50813567ffffffffffffffff811115620036a9575f80fd5b602083019150836020828501011115620036c1575f80fd5b9250929050565b5f805f805f60808688031215620036dd575f80fd5b620036e88662003602565b94506020860135620036fa8162003616565b935060408601356200370c8162003672565b9250606086013567ffffffffffffffff81111562003728575f80fd5b620037368882890162003680565b969995985093965092949392505050565b5f6020828403121562003758575f80fd5b5035919050565b5f6020828403121562003770575f80fd5b6200377b8262003602565b9392505050565b8061040081018310156200088c575f80fd5b5f805f805f805f805f805f6105208c8e031215620037b0575f80fd5b620037bc8d8d62003782565b9a50620037cd6104008d0162003602565b99506104208c013598506104408c01359750620037ee6104608d0162003602565b96506104808c0135620038018162003616565b9550620038126104a08d0162003602565b94506104c08c0135620038258162003616565b93506104e08c013592506105008c013567ffffffffffffffff8111156200384a575f80fd5b620038588e828f0162003680565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562003883575f80fd5b81356200377b8162003616565b60ff81168114620019f0575f80fd5b5f805f805f805f60e0888a031215620038b6575f80fd5b8735620038c38162003890565b9650620038d36020890162003602565b95506040880135620038e58162003616565b9450620038f56060890162003602565b93506080880135620039078162003616565b9699959850939692959460a0840135945060c09093013592915050565b5f805f6060848603121562003937575f80fd5b620039428462003602565b92506020840135620039548162003616565b91506040840135620039668162003616565b809150509250925092565b5f805f805f805f60a0888a03121562003988575f80fd5b620039938862003602565b96506020880135620039a58162003616565b9550604088013567ffffffffffffffff80821115620039c2575f80fd5b620039d08b838c0162003680565b909750955060608a0135915080821115620039e9575f80fd5b50620039f88a828b0162003680565b909450925050608088013562003a0e8162003890565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003a35575f80fd5b62003a408862003602565b9650602088013562003a528162003616565b955060408801359450606088013562003a6b8162003616565b9350608088013562003a7d8162003672565b925060a088013567ffffffffffffffff81111562003a99575f80fd5b62003aa78a828b0162003680565b989b979a50959850939692959293505050565b5f805f80610460858703121562003acf575f80fd5b8435935062003ae2866020870162003782565b925062003af3610420860162003602565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003bab828501878962003b04565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003c1d57818101518382015260200162003c03565b50505f910152565b5f825162003c3881846020870162003c01565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003c8c5762003c8c62003bd4565b604052919050565b5f67ffffffffffffffff82111562003cb05762003cb062003bd4565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011262003cec575f80fd5b813562003d0362003cfd8262003c94565b62003c42565b81815284602083860101111562003d18575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003d47575f80fd5b833567ffffffffffffffff8082111562003d5f575f80fd5b62003d6d8783880162003cdc565b9450602086013591508082111562003d83575f80fd5b5062003d928682870162003cdc565b9250506040840135620039668162003890565b5f815180845262003dbe81602086016020860162003c01565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f62003e04606083018662003da5565b828103602084015262003e18818662003da5565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200350260808301848662003b04565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003eb060608301848662003b04565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003f475762003f4762003ee7565b5060010190565b606081525f62003f6360608301878962003b04565b828103602084015262003f7881868862003b04565b91505060ff831660408301529695505050505050565b5f835162003fa181846020880162003c01565b83519083019062003fb781836020880162003c01565b01949350505050565b600181815b808511156200401f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562004003576200400362003ee7565b808516156200401157918102915b93841c939080029062003fc5565b509250929050565b5f8262004037575060016200088c565b816200404557505f6200088c565b81600181146200405e5760028114620040695762004089565b60019150506200088c565b60ff8411156200407d576200407d62003ee7565b50506001821b6200088c565b5060208310610133831016604e8410600b8410161715620040ae575081810a6200088c565b620040ba838362003fc0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620040ef57620040ef62003ee7565b029392505050565b5f6200377b838362004027565b818103818111156200088c576200088c62003ee7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6020828403121562004158575f80fd5b5051919050565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620041be8285018762003da5565b925080851660e085015250509998505050505050505050565b5f60208284031215620041e8575f80fd5b81516200377b8162003672565b5f808585111562004204575f80fd5b8386111562004211575f80fd5b5050820193919092039150565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156200425f5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a0312156200427e575f80fd5b87356200428b8162003616565b965060208801356200429d8162003616565b955060408801359450606088013593506080880135620039078162003890565b5f805f805f805f80610100898b031215620042d6575f80fd5b8835620042e38162003616565b97506020890135620042f58162003616565b965060408901359550606089013594506080890135620043158162003672565b935060a0890135620043278162003890565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004355575f80fd5b81516200377b8162003890565b5f6020828403121562004373575f80fd5b815167ffffffffffffffff8111156200438a575f80fd5b8201601f810184136200439b575f80fd5b8051620043ac62003cfd8262003c94565b818152856020838501011115620043c1575f80fd5b620043d482602083016020860162003c01565b95945050505050565b602081525f6200377b602083018462003da556fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a26469706673582212200d390c87d91133753c2d28c32519eb100fa1cf5754ba3d4ee472f42bf463e27764736f6c63430008140033", + "deployedBytecode": "0x608060405260043610620001df575f3560e01c8063715018a61162000106578063bab161bf116200009e578063dbc16976116200006a578063dbc169761462000704578063ee25560b146200071b578063f2fde38b146200074a578063fb570834146200076e575f80fd5b8063bab161bf1462000642578063be5831c7146200067b578063cd58657914620006b6578063d02103ca14620006cd575f80fd5b80638da5cb5b11620000de5780638da5cb5b146200059857806391e57e2d14620005c45780639e34070f14620005db578063aaa13cc2146200061e575f80fd5b8063715018a6146200052557806379e2cf97146200053c57806381b1c1741462000553575f80fd5b80632d2c9d94116200017a57806334ac9cf2116200015257806334ac9cf214620003ca5780633ae0504714620003f85780633e197043146200040f578063647c576c1462000501575f80fd5b80632d2c9d9414620002f95780632dfdf0b5146200031d578063318aee3d1462000343575f80fd5b8063240ff37811620001ba578063240ff37814620002765780632b5e42e7146200028d5780632c3f58cd14620002b15780632cffd02e14620002d5575f80fd5b806315064c9614620001e35780632072f6c5146200021357806322e95f2c146200022c575b5f80fd5b348015620001ef575f80fd5b50606854620001fe9060ff1681565b60405190151581526020015b60405180910390f35b3480156200021f575f80fd5b506200022a62000792565b005b34801562000238575f80fd5b50620002506200024a36600462003638565b620007f0565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016200020a565b6200022a62000287366004620036c8565b62000892565b34801562000299575f80fd5b506200022a620002ab36600462003747565b62000ab9565b348015620002bd575f80fd5b506200022a620002cf3660046200375f565b62000ac8565b348015620002e1575f80fd5b506200022a620002f336600462003794565b62000b0e565b34801562000305575f80fd5b506200022a6200031736600462003794565b62001093565b34801562000329575f80fd5b506200033460535481565b6040519081526020016200020a565b3480156200034f575f80fd5b50620003986200036136600462003872565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff9091166020830152016200020a565b348015620003d6575f80fd5b50606c54620002509073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000404575f80fd5b506200033462001293565b3480156200041b575f80fd5b50620003346200042d3660046200389f565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200050d575f80fd5b506200022a6200051f36600462003924565b62001378565b34801562000531575f80fd5b506200022a620015cd565b34801562000548575f80fd5b506200022a620015e2565b3480156200055f575f80fd5b50620002506200057136600462003747565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005a4575f80fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff1662000250565b348015620005d0575f80fd5b506200033460d15481565b348015620005e7575f80fd5b50620001fe620005f936600462003747565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b3480156200062a575f80fd5b50620002506200063c36600462003971565b6200161c565b3480156200064e575f80fd5b506068546200066590610100900463ffffffff1681565b60405163ffffffff90911681526020016200020a565b34801562000687575f80fd5b506068546200066590790100000000000000000000000000000000000000000000000000900463ffffffff1681565b6200022a620006c736600462003a1e565b62001806565b348015620006d9575f80fd5b50606854620002509065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000710575f80fd5b506200022a620018da565b34801562000727575f80fd5b50620003346200073936600462003747565b60696020525f908152604090205481565b34801562000756575f80fd5b506200022a6200076836600462003872565b62001936565b3480156200077a575f80fd5b50620001fe6200078c36600462003aba565b620019f3565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620007e4576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee62001adb565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620008d0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620008f65750600263ffffffff861610155b156200092e576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009849998979695949392919062003b4b565b60405180910390a162000aa162000a9b6001606860019054906101000a900463ffffffff16338989348989604051620009bf92919062003bc5565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001b6e565b821562000ab25762000ab262001c82565b5050505050565b62000ac362001d52565b60d155565b62000ad262001d52565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b4c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b628b8b8b8b8b8b8b8b8b8b8b5f62001dd5565b73ffffffffffffffffffffffffffffffffffffffff861662000c3a57604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000bb6919062003c25565b5f6040518083038185875af1925050503d805f811462000bf2576040519150601f19603f3d011682016040523d82523d5f602084013e62000bf7565b606091505b505090508062000c33576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506200101b565b60685463ffffffff61010090910481169088160362000c7c5762000c7673ffffffffffffffffffffffffffffffffffffffff8716858562001fc0565b6200101b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000f92575f808062000d4e8688018862003d34565b9250925092505f8584848460405162000d6790620035f4565b62000d759392919062003df0565b8190604051809103905ff590508015801562000d93573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000e06575f80fd5b505af115801562000e19573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000f8095949392919062003e2c565b60405180910390a15050505062001018565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562001000575f80fd5b505af115801562001013573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff1615620010d1576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620010e88b8b8b8b8b8b8b8b8b8b8b600162001dd5565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a86866040516024016200111a949392919062003e73565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200119d919062003c25565b5f6040518083038185875af1925050503d805f8114620011d9576040519150601f19603f3d011682016040523d82523d5f602084013e620011de565b606091505b50509050806200121a576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200136f578083901c600116600103620013005760338160208110620012cc57620012cc62003eba565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200132d565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013669062003f14565b9150506200129d565b50919392505050565b5f54610100900460ff16158080156200139757505f54600160ff909116105b80620013b25750303b158015620013b257505f5460ff166001145b62001444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014a1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d1556200156462002096565b8015620015c7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b620015d762001d52565b620007ee5f62002134565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620007ee57620007ee62001c82565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180602001620016b090620035f4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620016fb908d908d908d908d908d9060200162003f4e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001739929160200162003f8e565b60405160208183030381529060405280519060200120604051602001620017c294939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d154341115620018c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200143b565b620018d187878787878787620021aa565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff1633146200192c576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee620026f3565b6200194062001d52565b73ffffffffffffffffffffffffffffffffffffffff8116620019e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200143b565b620019f08162002134565b50565b5f84815b602081101562001acd57600163ffffffff8616821c8116900362001a695785816020811062001a2a5762001a2a62003eba565b60200201358260405160200162001a4b929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001ab8565b8186826020811062001a7f5762001a7f62003eba565b602002013560405160200162001a9f929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001ac48162003f14565b915050620019f7565b50821490505b949350505050565b60685460ff161562001b19576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001b7f60206002620040f7565b62001b8b919062004104565b6053541062001bc6576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001bd79062003f14565b918290555090505f5b602081101562001c72578082901c60011660010362001c1857826033826020811062001c105762001c1062003eba565b015550505050565b6033816020811062001c2e5762001c2e62003eba565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001c699062003f14565b91505062001be0565b5062001c7d6200411a565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001d0862001293565b6040518263ffffffff1660e01b815260040162001d2791815260200190565b5f604051808303815f87803b15801562001d3f575f80fd5b505af1158015620015c7573d5f803e3d5ffd5b609f5473ffffffffffffffffffffffffffffffffffffffff163314620007ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200143b565b62001de68b63ffffffff1662002782565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af115801562001e85573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001eab919062004147565b9050805f0362001ee6576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462001f30576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff1662001f4d57508962001f50565b508a5b62001f7962001f70848c8c8c8c8c8c8c604051620009bf92919062003bc5565b8f8f84620019f3565b62001fb0576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001c7d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152620027e6565b5f54610100900460ff166200212e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200143b565b620007ee335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60685460ff1615620021e8576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620021f2620028f8565b60685463ffffffff888116610100909204161480620022185750600263ffffffff881610155b1562002250576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff8816620022b457883414620022ab576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f9250620025a1565b3415620022ed576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620023d6576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b158015620023ac575f80fd5b505af1158015620023bf573d5f803e3d5ffd5b5050505080602001519450805f015193506200259f565b8515620023eb57620023eb898b89896200296d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa15801562002456573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200247c919062004147565b9050620024a273ffffffffffffffffffffffffffffffffffffffff8b1633308e62002e80565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa1580156200250d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002533919062004147565b905062002541828262004104565b6068548c9850610100900463ffffffff1696509350620025618762002ee0565b6200256c8c62002ff4565b620025778d620030fd565b6040516020016200258b9392919062003df0565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620025e29897969594939291906200415f565b60405180910390a1620026d462000a9b5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b8615620026e557620026e562001c82565b50505050620018d160018055565b60685460ff1662002730576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000ab2576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002849826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031f59092919063ffffffff16565b80519091501562001c7d57808060200190518101906200286a9190620041d7565b62001c7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200143b565b60026001540362002966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200143b565b6002600155565b5f6200297d6004828486620041f5565b62002988916200421e565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002c02575f808080808080620029ea896004818d620041f5565b810190620029f9919062004267565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002a6d576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002abd576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002af7576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002bb2919062003c25565b5f604051808303815f865af19150503d805f811462002bed576040519150601f19603f3d011682016040523d82523d5f602084013e62002bf2565b606091505b5050505050505050505062000ab2565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002c7e576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080808080808062002c958a6004818e620041f5565b81019062002ca49190620042bd565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002d1a576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002d6a576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002e2e919062003c25565b5f604051808303815f865af19150503d805f811462002e69576040519150601f19603f3d011682016040523d82523d5f602084013e62002e6e565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620015c79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002013565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002f63919062003c25565b5f60405180830381855afa9150503d805f811462002f9d576040519150601f19603f3d011682016040523d82523d5f602084013e62002fa2565b606091505b50915091508162002fe9576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001ad3565b62001ad38162003205565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162003077919062003c25565b5f60405180830381855afa9150503d805f8114620030b1576040519150601f19603f3d011682016040523d82523d5f602084013e620030b6565b606091505b50915091508162002fe9576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001ad3565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff8616916200317f919062003c25565b5f60405180830381855afa9150503d805f8114620031b9576040519150601f19603f3d011682016040523d82523d5f602084013e620031be565b606091505b5091509150818015620031d2575080516020145b620031df57601262001ad3565b8080602001905181019062001ad3919062004344565b606062001ad384845f85620033f0565b606060408251106200322757818060200190518101906200088c919062004362565b8151602003620033b2575f5b6020811080156200327e575082818151811062003254576200325462003eba565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620032995780620032908162003f14565b91505062003233565b805f03620032dc57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115620032f957620032f962003bd4565b6040519080825280601f01601f19166020018201604052801562003324576020820181803683370190505b5090505f5b82811015620033aa5784818151811062003347576200334762003eba565b602001015160f81c60f81b82828151811062003367576200336762003eba565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620033a18162003f14565b91505062003329565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200143b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051620034ae919062003c25565b5f6040518083038185875af1925050503d805f8114620034ea576040519150601f19603f3d011682016040523d82523d5f602084013e620034ef565b606091505b509150915062003502878383876200350d565b979650505050505050565b60608315620035a75782515f036200359f5773ffffffffffffffffffffffffffffffffffffffff85163b6200359f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200143b565b508162001ad3565b62001ad38383815115620035be5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200143b9190620043dd565b611b0d80620043f283390190565b803563ffffffff81168114620033eb575f80fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620019f0575f80fd5b5f80604083850312156200364a575f80fd5b620036558362003602565b91506020830135620036678162003616565b809150509250929050565b8015158114620019f0575f80fd5b5f8083601f84011262003691575f80fd5b50813567ffffffffffffffff811115620036a9575f80fd5b602083019150836020828501011115620036c1575f80fd5b9250929050565b5f805f805f60808688031215620036dd575f80fd5b620036e88662003602565b94506020860135620036fa8162003616565b935060408601356200370c8162003672565b9250606086013567ffffffffffffffff81111562003728575f80fd5b620037368882890162003680565b969995985093965092949392505050565b5f6020828403121562003758575f80fd5b5035919050565b5f6020828403121562003770575f80fd5b6200377b8262003602565b9392505050565b8061040081018310156200088c575f80fd5b5f805f805f805f805f805f6105208c8e031215620037b0575f80fd5b620037bc8d8d62003782565b9a50620037cd6104008d0162003602565b99506104208c013598506104408c01359750620037ee6104608d0162003602565b96506104808c0135620038018162003616565b9550620038126104a08d0162003602565b94506104c08c0135620038258162003616565b93506104e08c013592506105008c013567ffffffffffffffff8111156200384a575f80fd5b620038588e828f0162003680565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562003883575f80fd5b81356200377b8162003616565b60ff81168114620019f0575f80fd5b5f805f805f805f60e0888a031215620038b6575f80fd5b8735620038c38162003890565b9650620038d36020890162003602565b95506040880135620038e58162003616565b9450620038f56060890162003602565b93506080880135620039078162003616565b9699959850939692959460a0840135945060c09093013592915050565b5f805f6060848603121562003937575f80fd5b620039428462003602565b92506020840135620039548162003616565b91506040840135620039668162003616565b809150509250925092565b5f805f805f805f60a0888a03121562003988575f80fd5b620039938862003602565b96506020880135620039a58162003616565b9550604088013567ffffffffffffffff80821115620039c2575f80fd5b620039d08b838c0162003680565b909750955060608a0135915080821115620039e9575f80fd5b50620039f88a828b0162003680565b909450925050608088013562003a0e8162003890565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003a35575f80fd5b62003a408862003602565b9650602088013562003a528162003616565b955060408801359450606088013562003a6b8162003616565b9350608088013562003a7d8162003672565b925060a088013567ffffffffffffffff81111562003a99575f80fd5b62003aa78a828b0162003680565b989b979a50959850939692959293505050565b5f805f80610460858703121562003acf575f80fd5b8435935062003ae2866020870162003782565b925062003af3610420860162003602565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003bab828501878962003b04565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003c1d57818101518382015260200162003c03565b50505f910152565b5f825162003c3881846020870162003c01565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003c8c5762003c8c62003bd4565b604052919050565b5f67ffffffffffffffff82111562003cb05762003cb062003bd4565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011262003cec575f80fd5b813562003d0362003cfd8262003c94565b62003c42565b81815284602083860101111562003d18575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003d47575f80fd5b833567ffffffffffffffff8082111562003d5f575f80fd5b62003d6d8783880162003cdc565b9450602086013591508082111562003d83575f80fd5b5062003d928682870162003cdc565b9250506040840135620039668162003890565b5f815180845262003dbe81602086016020860162003c01565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f62003e04606083018662003da5565b828103602084015262003e18818662003da5565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200350260808301848662003b04565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003eb060608301848662003b04565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003f475762003f4762003ee7565b5060010190565b606081525f62003f6360608301878962003b04565b828103602084015262003f7881868862003b04565b91505060ff831660408301529695505050505050565b5f835162003fa181846020880162003c01565b83519083019062003fb781836020880162003c01565b01949350505050565b600181815b808511156200401f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562004003576200400362003ee7565b808516156200401157918102915b93841c939080029062003fc5565b509250929050565b5f8262004037575060016200088c565b816200404557505f6200088c565b81600181146200405e5760028114620040695762004089565b60019150506200088c565b60ff8411156200407d576200407d62003ee7565b50506001821b6200088c565b5060208310610133831016604e8410600b8410161715620040ae575081810a6200088c565b620040ba838362003fc0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620040ef57620040ef62003ee7565b029392505050565b5f6200377b838362004027565b818103818111156200088c576200088c62003ee7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6020828403121562004158575f80fd5b5051919050565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620041be8285018762003da5565b925080851660e085015250509998505050505050505050565b5f60208284031215620041e8575f80fd5b81516200377b8162003672565b5f808585111562004204575f80fd5b8386111562004211575f80fd5b5050820193919092039150565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156200425f5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a0312156200427e575f80fd5b87356200428b8162003616565b965060208801356200429d8162003616565b955060408801359450606088013593506080880135620039078162003890565b5f805f805f805f80610100898b031215620042d6575f80fd5b8835620042e38162003616565b97506020890135620042f58162003616565b965060408901359550606089013594506080890135620043158162003672565b935060a0890135620043278162003890565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004355575f80fd5b81516200377b8162003890565b5f6020828403121562004373575f80fd5b815167ffffffffffffffff8111156200438a575f80fd5b8201601f810184136200439b575f80fd5b8051620043ac62003cfd8262003c94565b818152856020838501011115620043c1575f80fd5b620043d482602083016020860162003c01565b95945050505050565b602081525f6200377b602083018462003da556fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a26469706673582212200d390c87d91133753c2d28c32519eb100fa1cf5754ba3d4ee472f42bf463e27764736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMGlobalExitRoot.json b/compiled-contracts/PolygonZkEVMGlobalExitRoot.json index d50e6235c..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,19 +56,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "depositCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "getLastGlobalExitRoot", @@ -87,19 +69,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "getRoot", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -170,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": "0x60c060405234801561000f575f80fd5b5060405161095738038061095783398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a0516108976100c05f395f8181610134015261022b01525f818161018001526101e201526108975ff3fe608060405234801561000f575f80fd5b50600436106100b9575f3560e01c80633ed691ef116100725780635ec6a8df116100585780635ec6a8df1461012f578063a3c573eb1461017b578063fb570834146101a2575f80fd5b80633ed691ef1461011f5780635ca1e16514610127575f80fd5b80632dfdf0b5116100a25780632dfdf0b5146100f8578063319cf7351461010157806333d6247d1461010a575f80fd5b806301fd9044146100bd578063257b3632146100d9575b5f80fd5b6100c6602b5481565b6040519081526020015b60405180910390f35b6100c66100e73660046105f7565b602d6020525f908152604090205481565b6100c660205481565b6100c6602c5481565b61011d6101183660046105f7565b6101c5565b005b6100c66102fa565b6100c661030e565b6101567f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100d0565b6101567f000000000000000000000000000000000000000000000000000000000000000081565b6101b56101b036600461060e565b610317565b60405190151581526020016100d0565b602b54602c5473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102145750602c82905581610290565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361025e57602b839055829150610290565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61029b82846103ef565b5f818152602d6020526040812054919250036102f4575f818152602d602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a36102f48161041e565b50505050565b5f610309602c54602b546103ef565b905090565b5f61030961051c565b5f84815b60208110156103e357600163ffffffff8616821c811690036103865785816020811061034957610349610660565b602002013582604051602001610369929190918252602082015260400190565b6040516020818303038152906040528051906020012091506103d1565b8186826020811061039957610399610660565b60200201356040516020016103b8929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806103db816106ba565b91505061031b565b50909114949350505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b80600161042d6020600261080f565b6104379190610821565b60205410610471576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60205f8154610480906106ba565b918290555090505f5b602081101561050e578082901c6001166001036104bb57825f82602081106104b3576104b3610660565b015550505050565b5f81602081106104cd576104cd610660565b015460408051602081019290925281018490526060016040516020818303038152906040528051906020012092508080610506906106ba565b915050610489565b50610517610834565b505050565b6020545f90819081805b60208110156105ee578083901c600116600103610582575f816020811061054f5761054f610660565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506105af565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806105e6906106ba565b915050610526565b50919392505050565b5f60208284031215610607575f80fd5b5035919050565b5f805f806104608587031215610622575f80fd5b84359350610420850186811115610637575f80fd5b6020860193503563ffffffff8116811461064f575f80fd5b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036106ea576106ea61068d565b5060010190565b600181815b8085111561074a57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156107305761073061068d565b8085161561073d57918102915b93841c93908002906106f6565b509250929050565b5f8261076057506001610418565b8161076c57505f610418565b8160018114610782576002811461078c576107a8565b6001915050610418565b60ff84111561079d5761079d61068d565b50506001821b610418565b5060208310610133831016604e8410600b84101617156107cb575081810a610418565b6107d583836106f1565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156108075761080761068d565b029392505050565b5f61081a8383610752565b9392505050565b818103818111156104185761041861068d565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea264697066735822122059114d99f90ecc01a66dc3046f440796b34e627715701744b7bb9633b21df6b464736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106100b9575f3560e01c80633ed691ef116100725780635ec6a8df116100585780635ec6a8df1461012f578063a3c573eb1461017b578063fb570834146101a2575f80fd5b80633ed691ef1461011f5780635ca1e16514610127575f80fd5b80632dfdf0b5116100a25780632dfdf0b5146100f8578063319cf7351461010157806333d6247d1461010a575f80fd5b806301fd9044146100bd578063257b3632146100d9575b5f80fd5b6100c6602b5481565b6040519081526020015b60405180910390f35b6100c66100e73660046105f7565b602d6020525f908152604090205481565b6100c660205481565b6100c6602c5481565b61011d6101183660046105f7565b6101c5565b005b6100c66102fa565b6100c661030e565b6101567f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100d0565b6101567f000000000000000000000000000000000000000000000000000000000000000081565b6101b56101b036600461060e565b610317565b60405190151581526020016100d0565b602b54602c5473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102145750602c82905581610290565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361025e57602b839055829150610290565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61029b82846103ef565b5f818152602d6020526040812054919250036102f4575f818152602d602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a36102f48161041e565b50505050565b5f610309602c54602b546103ef565b905090565b5f61030961051c565b5f84815b60208110156103e357600163ffffffff8616821c811690036103865785816020811061034957610349610660565b602002013582604051602001610369929190918252602082015260400190565b6040516020818303038152906040528051906020012091506103d1565b8186826020811061039957610399610660565b60200201356040516020016103b8929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806103db816106ba565b91505061031b565b50909114949350505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b80600161042d6020600261080f565b6104379190610821565b60205410610471576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60205f8154610480906106ba565b918290555090505f5b602081101561050e578082901c6001166001036104bb57825f82602081106104b3576104b3610660565b015550505050565b5f81602081106104cd576104cd610660565b015460408051602081019290925281018490526060016040516020818303038152906040528051906020012092508080610506906106ba565b915050610489565b50610517610834565b505050565b6020545f90819081805b60208110156105ee578083901c600116600103610582575f816020811061054f5761054f610660565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506105af565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806105e6906106ba565b915050610526565b50919392505050565b5f60208284031215610607575f80fd5b5035919050565b5f805f806104608587031215610622575f80fd5b84359350610420850186811115610637575f80fd5b6020860193503563ffffffff8116811461064f575f80fd5b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036106ea576106ea61068d565b5060010190565b600181815b8085111561074a57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156107305761073061068d565b8085161561073d57918102915b93841c93908002906106f6565b509250929050565b5f8261076057506001610418565b8161076c57505f610418565b8160018114610782576002811461078c576107a8565b6001915050610418565b60ff84111561079d5761079d61068d565b50506001821b610418565b5060208310610133831016604e8410600b84101617156107cb575081810a610418565b6107d583836106f1565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156108075761080761068d565b029392505050565b5f61081a8383610752565b9392505050565b818103818111156104185761041861068d565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea264697066735822122059114d99f90ecc01a66dc3046f440796b34e627715701744b7bb9633b21df6b464736f6c63430008140033", + "bytecode": "0x60c060405234801561000f575f80fd5b506040516103e13803806103e183398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a0516103226100bf5f395f818160e301526101b601525f818161012f015261016d01526103225ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c806333d6247d1161005857806333d6247d146100c15780633ed691ef146100d65780635ec6a8df146100de578063a3c573eb1461012a575f80fd5b806301fd90441461007e578063257b363214610099578063319cf735146100b8575b5f80fd5b6100865f5481565b6040519081526020015b60405180910390f35b6100866100a73660046102d5565b60026020525f908152604090205481565b61008660015481565b6100d46100cf3660046102d5565b610151565b005b61008661029b565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610090565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361019f575060018290558161021a565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101e8575f83905582915061021a565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f8181526002602052604081205491925003610295575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6102d06001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f602082840312156102e5575f80fd5b503591905056fea26469706673582212205b8fae68ff3c2dfc257497be9184a2e772688dbece1343c3dc2e8c1923291be864736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061007a575f3560e01c806333d6247d1161005857806333d6247d146100c15780633ed691ef146100d65780635ec6a8df146100de578063a3c573eb1461012a575f80fd5b806301fd90441461007e578063257b363214610099578063319cf735146100b8575b5f80fd5b6100865f5481565b6040519081526020015b60405180910390f35b6100866100a73660046102d5565b60026020525f908152604090205481565b61008660015481565b6100d46100cf3660046102d5565b610151565b005b61008661029b565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610090565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361019f575060018290558161021a565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101e8575f83905582915061021a565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f8181526002602052604081205491925003610295575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6102d06001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f602082840312156102e5575f80fd5b503591905056fea26469706673582212205b8fae68ff3c2dfc257497be9184a2e772688dbece1343c3dc2e8c1923291be864736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMGlobalExitRootMock.json b/compiled-contracts/PolygonZkEVMGlobalExitRootMock.json index c729a1367..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,19 +56,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "depositCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "getLastGlobalExitRoot", @@ -87,19 +69,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "getRoot", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -201,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": "0x60c060405234801561000f575f80fd5b506040516109de3803806109de83398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a05161091e6100c05f395f818161017c015261029201525f81816101c80152610249015261091e5ff3fe608060405234801561000f575f80fd5b50600436106100cf575f3560e01c80633ed691ef1161007d5780635ec6a8df116100585780635ec6a8df14610177578063a3c573eb146101c3578063fb570834146101ea575f80fd5b80633ed691ef146101485780635bcef673146101505780635ca1e1651461016f575f80fd5b80632dfdf0b5116100ad5780632dfdf0b514610123578063319cf7351461012c57806333d6247d14610135575f80fd5b806301fd9044146100d3578063051a9e28146100ef578063257b363214610104575b5f80fd5b6100dc602b5481565b6040519081526020015b60405180910390f35b6101026100fd36600461065e565b61020d565b005b6100dc61011236600461065e565b602d6020525f908152604090205481565b6100dc60205481565b6100dc602c5481565b61010261014336600461065e565b61022c565b6100dc610361565b61010261015e366004610675565b5f918252602d602052604090912055565b6100dc610375565b61019e7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e6565b61019e7f000000000000000000000000000000000000000000000000000000000000000081565b6101fd6101f8366004610695565b61037e565b60405190151581526020016100e6565b80602d5f610219610361565b815260208101919091526040015f205550565b602b54602c5473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361027b5750602c829055816102f7565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102c557602b8390558291506102f7565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6103028284610456565b5f818152602d60205260408120549192500361035b575f818152602d602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a361035b81610485565b50505050565b5f610370602c54602b54610456565b905090565b5f610370610583565b5f84815b602081101561044a57600163ffffffff8616821c811690036103ed578581602081106103b0576103b06106e7565b6020020135826040516020016103d0929190918252602082015260400190565b604051602081830303815290604052805190602001209150610438565b81868260208110610400576104006106e7565b602002013560405160200161041f929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8061044281610741565b915050610382565b50909114949350505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b80600161049460206002610896565b61049e91906108a8565b602054106104d8576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60205f81546104e790610741565b918290555090505f5b6020811015610575578082901c60011660010361052257825f826020811061051a5761051a6106e7565b015550505050565b5f8160208110610534576105346106e7565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061056d90610741565b9150506104f0565b5061057e6108bb565b505050565b6020545f90819081805b6020811015610655578083901c6001166001036105e9575f81602081106105b6576105b66106e7565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610616565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b6040805160208101849052908101839052606001604051602081830303815290604052805190602001209150808061064d90610741565b91505061058d565b50919392505050565b5f6020828403121561066e575f80fd5b5035919050565b5f8060408385031215610686575f80fd5b50508035926020909101359150565b5f805f8061046085870312156106a9575f80fd5b843593506104208501868111156106be575f80fd5b6020860193503563ffffffff811681146106d6575f80fd5b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361077157610771610714565b5060010190565b600181815b808511156107d157817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156107b7576107b7610714565b808516156107c457918102915b93841c939080029061077d565b509250929050565b5f826107e75750600161047f565b816107f357505f61047f565b816001811461080957600281146108135761082f565b600191505061047f565b60ff84111561082457610824610714565b50506001821b61047f565b5060208310610133831016604e8410600b8410161715610852575081810a61047f565b61085c8383610778565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561088e5761088e610714565b029392505050565b5f6108a183836107d9565b9392505050565b8181038181111561047f5761047f610714565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea2646970667358221220bf3f4de702c9ce3edf71d69ca8d09c648531ae2831a2dbb3496a5daa427876e264736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106100cf575f3560e01c80633ed691ef1161007d5780635ec6a8df116100585780635ec6a8df14610177578063a3c573eb146101c3578063fb570834146101ea575f80fd5b80633ed691ef146101485780635bcef673146101505780635ca1e1651461016f575f80fd5b80632dfdf0b5116100ad5780632dfdf0b514610123578063319cf7351461012c57806333d6247d14610135575f80fd5b806301fd9044146100d3578063051a9e28146100ef578063257b363214610104575b5f80fd5b6100dc602b5481565b6040519081526020015b60405180910390f35b6101026100fd36600461065e565b61020d565b005b6100dc61011236600461065e565b602d6020525f908152604090205481565b6100dc60205481565b6100dc602c5481565b61010261014336600461065e565b61022c565b6100dc610361565b61010261015e366004610675565b5f918252602d602052604090912055565b6100dc610375565b61019e7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e6565b61019e7f000000000000000000000000000000000000000000000000000000000000000081565b6101fd6101f8366004610695565b61037e565b60405190151581526020016100e6565b80602d5f610219610361565b815260208101919091526040015f205550565b602b54602c5473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361027b5750602c829055816102f7565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102c557602b8390558291506102f7565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6103028284610456565b5f818152602d60205260408120549192500361035b575f818152602d602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a361035b81610485565b50505050565b5f610370602c54602b54610456565b905090565b5f610370610583565b5f84815b602081101561044a57600163ffffffff8616821c811690036103ed578581602081106103b0576103b06106e7565b6020020135826040516020016103d0929190918252602082015260400190565b604051602081830303815290604052805190602001209150610438565b81868260208110610400576104006106e7565b602002013560405160200161041f929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8061044281610741565b915050610382565b50909114949350505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b80600161049460206002610896565b61049e91906108a8565b602054106104d8576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60205f81546104e790610741565b918290555090505f5b6020811015610575578082901c60011660010361052257825f826020811061051a5761051a6106e7565b015550505050565b5f8160208110610534576105346106e7565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061056d90610741565b9150506104f0565b5061057e6108bb565b505050565b6020545f90819081805b6020811015610655578083901c6001166001036105e9575f81602081106105b6576105b66106e7565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610616565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b6040805160208101849052908101839052606001604051602081830303815290604052805190602001209150808061064d90610741565b91505061058d565b50919392505050565b5f6020828403121561066e575f80fd5b5035919050565b5f8060408385031215610686575f80fd5b50508035926020909101359150565b5f805f8061046085870312156106a9575f80fd5b843593506104208501868111156106be575f80fd5b6020860193503563ffffffff811681146106d6575f80fd5b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361077157610771610714565b5060010190565b600181815b808511156107d157817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156107b7576107b7610714565b808516156107c457918102915b93841c939080029061077d565b509250929050565b5f826107e75750600161047f565b816107f357505f61047f565b816001811461080957600281146108135761082f565b600191505061047f565b60ff84111561082457610824610714565b50506001821b61047f565b5060208310610133831016604e8410600b8410161715610852575081810a61047f565b61085c8383610778565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561088e5761088e610714565b029392505050565b5f6108a183836107d9565b9392505050565b8181038181111561047f5761047f610714565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea2646970667358221220bf3f4de702c9ce3edf71d69ca8d09c648531ae2831a2dbb3496a5daa427876e264736f6c63430008140033", + "bytecode": "0x60c060405234801561000f575f80fd5b5060405161047838038061047883398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a0516103b86100c05f395f818161013a015261022c01525f818161018601526101e301526103b85ff3fe608060405234801561000f575f80fd5b506004361061009f575f3560e01c806333d6247d116100725780635bcef673116100585780635bcef673146101165780635ec6a8df14610135578063a3c573eb14610181575f80fd5b806333d6247d146100fb5780633ed691ef1461010e575f80fd5b806301fd9044146100a3578063051a9e28146100be578063257b3632146100d3578063319cf735146100f2575b5f80fd5b6100ab5f5481565b6040519081526020015b60405180910390f35b6100d16100cc36600461034b565b6101a8565b005b6100ab6100e136600461034b565b60026020525f908152604090205481565b6100ab60015481565b6100d161010936600461034b565b6101c7565b6100ab610311565b6100d1610124366004610362565b5f9182526002602052604090912055565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b8060025f6101b4610311565b815260208101919091526040015f205550565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102155750600182905581610290565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361025e575f839055829150610290565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f818152600260205260408120549192500361030b575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6103466001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f6020828403121561035b575f80fd5b5035919050565b5f8060408385031215610373575f80fd5b5050803592602090910135915056fea26469706673582212200799b5f60aa8eaf6d49205025cc41bfba78ce4f6ad614164e5da3c0bdc94810464736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061009f575f3560e01c806333d6247d116100725780635bcef673116100585780635bcef673146101165780635ec6a8df14610135578063a3c573eb14610181575f80fd5b806333d6247d146100fb5780633ed691ef1461010e575f80fd5b806301fd9044146100a3578063051a9e28146100be578063257b3632146100d3578063319cf735146100f2575b5f80fd5b6100ab5f5481565b6040519081526020015b60405180910390f35b6100d16100cc36600461034b565b6101a8565b005b6100ab6100e136600461034b565b60026020525f908152604090205481565b6100ab60015481565b6100d161010936600461034b565b6101c7565b6100ab610311565b6100d1610124366004610362565b5f9182526002602052604090912055565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b8060025f6101b4610311565b815260208101919091526040015f205550565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102155750600182905581610290565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361025e575f839055829150610290565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f818152600260205260408120549192500361030b575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6103466001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f6020828403121561035b575f80fd5b5035919050565b5f8060408385031215610373575f80fd5b5050803592602090910135915056fea26469706673582212200799b5f60aa8eaf6d49205025cc41bfba78ce4f6ad614164e5da3c0bdc94810464736f6c63430008140033", "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/contracts/PolygonZkEVMGlobalExitRoot.sol b/contracts/PolygonZkEVMGlobalExitRoot.sol index db2d0c633..8fbd47cf5 100644 --- a/contracts/PolygonZkEVMGlobalExitRoot.sol +++ b/contracts/PolygonZkEVMGlobalExitRoot.sol @@ -6,6 +6,11 @@ import "./interfaces/IPolygonZkEVMGlobalExitRoot.sol"; import "./lib/GlobalExitRootLib.sol"; import "./lib/DepositContractLib.sol"; +// TODO it is requierde a special ugpradbility for this contract since overlap storage slots +// This means that the lastRollupExitRoot and the lastMainnetExitRoot must be copei using assembly form prv version + +// another and seems better approach will be to define a contract base which will contain tthe same slots + /** * Contract responsible for managing the exit roots across multiple networks */ diff --git a/contracts/interfaces/IPolygonRollupManager.sol b/contracts/interfaces/IPolygonRollupManager.sol index 1a822406a..ab7720861 100644 --- a/contracts/interfaces/IPolygonRollupManager.sol +++ b/contracts/interfaces/IPolygonRollupManager.sol @@ -3,116 +3,208 @@ pragma solidity 0.8.20; interface IPolygonRollupManager { + /** + * @dev Thrown when the pending state timeout exceeds the _HALT_AGGREGATION_TIMEOUT + */ + error PendingStateTimeoutExceedHaltAggregationTimeout(); + + /** + * @dev Thrown when the trusted aggregator timeout exceeds the _HALT_AGGREGATION_TIMEOUT + */ + error TrustedAggregatorTimeoutExceedHaltAggregationTimeout(); + /** * @dev Thrown when sender is not the PolygonZkEVM address */ error OnlyGovernance(); /** - * @dev Thrown when the destination network is invalid + * @dev Thrown when sender is not the PolygonZkEVM address */ - error DestinationNetworkInvalid(); + error OnlyTrustedAggregator(); /** - * @dev Thrown when the amount does not match msg.value + * @dev Thrown when sender is not the PolygonZkEVM address */ - error AmountDoesNotMatchMsgValue(); + error ConsensusAlreadyExist(); /** - * @dev Thrown when user is bridging tokens and is also sending a value + * @dev Thrown when sender is not the PolygonZkEVM address */ - error MsgValueNotZero(); + error VerifierAlreadyExist(); /** - * @dev Thrown when the Ether transfer on claimAsset fails + * @dev Thrown when sender is not the PolygonZkEVM address */ - error EtherTransferFailed(); + error ConsensusDoesNotExist(); /** - * @dev Thrown when the message transaction on claimMessage fails + * @dev Thrown when sender is not the PolygonZkEVM address */ - error MessageFailed(); + error VerifierDoesNotExist(); /** - * @dev Thrown when the global exit root does not exist + * @dev Thrown when sender is not the PolygonZkEVM address */ - error GlobalExitRootInvalid(); + error UpgradeToSameImplementation(); /** - * @dev Thrown when the smt proof does not match + * @dev Thrown when sender is not the PolygonZkEVM address */ - error InvalidSmtProof(); + error RollupMustExist(); /** - * @dev Thrown when an index is already claimed + * @dev Thrown when sender is not the PolygonZkEVM address */ - error AlreadyClaimed(); + error VerifierMustBeDifferent(); /** - * @dev Thrown when the owner of permit does not match the sender + * @dev Thrown when sender is not the PolygonZkEVM address */ - error NotValidOwner(); + error SenderMustBeRollup(); /** - * @dev Thrown when the spender of the permit does not match this contract address + * @dev Thrown when sender is not the PolygonZkEVM address */ - error NotValidSpender(); + error NewSequencedBatchMustBeBigger(); /** - * @dev Thrown when the amount of the permit does not match + * @dev Thrown when sender is not the PolygonZkEVM address */ - error NotValidAmount(); + error TrustedAggregatorTimeoutNotExpired(); /** - * @dev Thrown when the permit data contains an invalid signature + * @dev Thrown when sender is not the PolygonZkEVM address */ - error NotValidSignature(); + error ExceedMaxVerifyBatches(); - function bridgeAsset( - uint32 destinationNetwork, - address destinationAddress, - uint256 amount, - address token, - bool forceUpdateGlobalExitRoot, - bytes calldata permitData - ) external payable; + /** + * @dev Thrown when attempting to access a pending state that does not exist + */ + error PendingStateDoesNotExist(); - function bridgeMessage( - uint32 destinationNetwork, - address destinationAddress, - bool forceUpdateGlobalExitRoot, - bytes calldata metadata - ) external payable; + /** + * @dev Thrown when the init num batch does not match with the one in the pending state + */ + error InitNumBatchDoesNotMatchPendingState(); - function claimAsset( - bytes32[32] calldata smtProof, - uint32 index, - bytes32 mainnetExitRoot, - bytes32 rollupExitRoot, - uint32 originNetwork, - address originTokenAddress, - uint32 destinationNetwork, - address destinationAddress, - uint256 amount, - bytes calldata metadata - ) external; + /** + * @dev Thrown when the old state root of a certain batch does not exist + */ + error OldStateRootDoesNotExist(); + + /** + * @dev Thrown when the init verification batch is above the last verification batch + */ + error InitNumBatchAboveLastVerifiedBatch(); + + /** + * @dev Thrown when the final verification batch is below or equal the last verification batch + */ + error FinalNumBatchBelowLastVerifiedBatch(); + + /** + * @dev Thrown when the zkproof is not valid + */ + error InvalidProof(); + + /** + * @dev Thrown when attempting to consolidate a pending state not yet consolidable + */ + error PendingStateNotConsolidable(); - function claimMessage( - bytes32[32] calldata smtProof, - uint32 index, - bytes32 mainnetExitRoot, - bytes32 rollupExitRoot, - uint32 originNetwork, - address originAddress, - uint32 destinationNetwork, - address destinationAddress, - uint256 amount, - bytes calldata metadata - ) external; + /** + * @dev Thrown when attempting to consolidate a pending state that is already consolidated or does not exist + */ + error PendingStateInvalid(); - function updateGlobalExitRoot() external; + /** + * @dev Thrown when the new accumulate input hash does not exist + */ + error NewAccInputHashDoesNotExist(); - function activateEmergencyState() external; + /** + * @dev Thrown when the new state root is not inside prime + */ + error NewStateRootNotInsidePrime(); + + /** + * @dev Thrown when force batch is not allowed + */ + error ForceBatchNotAllowed(); - function deactivateEmergencyState() external; + /** + * @dev Thrown when try to activate force batches when they are already active + */ + error ForceBatchesAlreadyActive(); + + /** + * @dev Thrown when try to activate force batches when they are already active + */ + error NotSupportedCurrently(); + + /** + * @dev Thrown when the final pending state num is not in a valid range + */ + error FinalPendingStateNumInvalid(); + + /** + * @dev Thrown when the final num batch does not match with the one in the pending state + */ + error FinalNumBatchDoesNotMatchPendingState(); + + /** + * @dev Thrown when the stored root matches the new root proving a different state + */ + error StoredRootMustBeDifferentThanNewRoot(); + + /** + * @dev Thrown when the batch is already verified when attempting to activate the emergency state + */ + error BatchAlreadyVerified(); + + /** + * @dev Thrown when the batch is not sequenced or not at the end of a sequence when attempting to activate the emergency state + */ + error BatchNotSequencedOrNotSequenceEnd(); + + /** + * @dev Thrown when the halt timeout is not expired when attempting to activate the emergency state + */ + error HaltTimeoutNotExpired(); + + /** + * @dev Thrown when the old accumulate input hash does not exist + */ + error OldAccInputHashDoesNotExist(); + + /** + * @dev Thrown when attempting to set a new trusted aggregator timeout equal or bigger than current one + */ + error NewTrustedAggregatorTimeoutMustBeLower(); + + /** + * @dev Thrown when attempting to set a new pending state timeout equal or bigger than current one + */ + error NewPendingStateTimeoutMustBeLower(); + + /** + * @dev Thrown when attempting to set a new multiplier batch fee in a invalid range of values + */ + error InvalidRangeMultiplierBatchFee(); + + /** + * @dev Thrown when attempting to set a batch time target in an invalid range of values + */ + error InvalidRangeBatchTimeTarget(); + + /** + * @dev Thrown when attempting to set a force batch timeout in an invalid range of values + */ + error InvalidRangeForceBatchTimeout(); + + /** + * @dev Thrown when the caller is not the pending admin + */ + error OnlyPendingGovernance(); } diff --git a/contracts/interfaces/IPolygonZkEVMBridgeV2.sol b/contracts/interfaces/IPolygonZkEVMBridgeV2.sol new file mode 100644 index 000000000..2ce7b35fd --- /dev/null +++ b/contracts/interfaces/IPolygonZkEVMBridgeV2.sol @@ -0,0 +1,118 @@ +// SPDX-License-Identifier: AGPL-3.0 + +pragma solidity ^0.8.20; + +interface IPolygonZkEVMBridgeV2 { + /** + * @dev Thrown when sender is not the PolygonZkEVM address + */ + error OnlyPolygonZkEVM(); + + /** + * @dev Thrown when the destination network is invalid + */ + error DestinationNetworkInvalid(); + + /** + * @dev Thrown when the amount does not match msg.value + */ + error AmountDoesNotMatchMsgValue(); + + /** + * @dev Thrown when user is bridging tokens and is also sending a value + */ + error MsgValueNotZero(); + + /** + * @dev Thrown when the Ether transfer on claimAsset fails + */ + error EtherTransferFailed(); + + /** + * @dev Thrown when the message transaction on claimMessage fails + */ + error MessageFailed(); + + /** + * @dev Thrown when the global exit root does not exist + */ + error GlobalExitRootInvalid(); + + /** + * @dev Thrown when the smt proof does not match + */ + error InvalidSmtProof(); + + /** + * @dev Thrown when an index is already claimed + */ + error AlreadyClaimed(); + + /** + * @dev Thrown when the owner of permit does not match the sender + */ + error NotValidOwner(); + + /** + * @dev Thrown when the spender of the permit does not match this contract address + */ + error NotValidSpender(); + + /** + * @dev Thrown when the amount of the permit does not match + */ + error NotValidAmount(); + + /** + * @dev Thrown when the permit data contains an invalid signature + */ + error NotValidSignature(); + + function bridgeAsset( + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + address token, + bool forceUpdateGlobalExitRoot, + bytes calldata permitData + ) external payable; + + function bridgeMessage( + uint32 destinationNetwork, + address destinationAddress, + bool forceUpdateGlobalExitRoot, + bytes calldata metadata + ) external payable; + + function claimAsset( + bytes32[32] calldata smtProof, + uint256 globalIndex, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + uint32 originNetwork, + address originTokenAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes calldata metadata + ) external; + + function claimMessage( + bytes32[32] calldata smtProof, + uint256 globalIndex, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + uint32 originNetwork, + address originAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes calldata metadata + ) external; + + function updateGlobalExitRoot() external; + + function activateEmergencyState() external; + + function deactivateEmergencyState() external; +} diff --git a/contracts/interfaces/IPolygonZkEVMV2Errors.sol b/contracts/interfaces/IPolygonZkEVMV2Errors.sol new file mode 100644 index 000000000..594e65be8 --- /dev/null +++ b/contracts/interfaces/IPolygonZkEVMV2Errors.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: AGPL-3.0 + +pragma solidity ^0.8.20; + +interface IPolygonZkEVMV2Errors { + /** + * @dev Thrown when the caller is not the trusted sequencer + */ + error OnlyRollupManager(); + + /** + * @dev Thrown when the caller is not the trusted sequencer + */ + error NotEnoughfeeTokenAmount(); +} diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol new file mode 100644 index 000000000..15f6fe716 --- /dev/null +++ b/contracts/v2/PolygonRollupManager.sol @@ -0,0 +1,1465 @@ +// SPDX-License-Identifier: AGPL-3.0 + +pragma solidity 0.8.20; + +import "../interfaces/IPolygonRollupManager.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "../interfaces/IPolygonZkEVMGlobalExitRoot.sol"; +import "../interfaces/IPolygonZkEVMBridge.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import "./PolygonZkEVMV2.sol"; +import "../lib/EmergencyManager.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; + +//roles TODO + +/** + * Contract responsible for managing the exit roots across multiple Rollups + */ +abstract contract PolygonRollupManager is + IPolygonRollupManager, + Initializable, + EmergencyManager +{ + /** + * @notice Struct which will be stored for every batch sequence + * @param accInputHash Hash chain that contains all the information to process a batch: + * keccak256(bytes32 oldAccInputHash, keccak256(bytes transactions), bytes32 globalExitRoot, uint64 timestamp, address seqAddress) + * @param sequencedTimestamp Sequenced timestamp + * @param previousLastBatchSequenced Previous last batch sequenced before the current one, this is used to properly calculate the fees + */ + struct SequencedBatchData { + bytes32 accInputHash; + uint64 sequencedTimestamp; + uint64 previousLastBatchSequenced; + } + + /** + * @notice Struct which to store the verifier data + * @param accInputHash Hash chain that contains all the information to process a batch: + * keccak256(bytes32 oldAccInputHash, keccak256(bytes transactions), bytes32 globalExitRoot, uint64 timestamp, address seqAddress) + * @param sequencedTimestamp Sequenced timestamp + * @param previousLastBatchSequenced Previous last batch sequenced before the current one, this is used to properly calculate the fees + */ + struct VerifierData { + uint64 verifierID; + uint64 forkID; + string description; + } + + /** + * @notice Struct which to store the verifier data + * @param accInputHash Hash chain that contains all the information to process a batch: + * keccak256(bytes32 oldAccInputHash, keccak256(bytes transactions), bytes32 globalExitRoot, uint64 timestamp, address seqAddress) + * @param sequencedTimestamp Sequenced timestamp + * @param previousLastBatchSequenced Previous last batch sequenced before the current one, this is used to properly calculate the fees + */ + struct ConsensusData { + uint64 consensusID; + string description; + } + + /** + * @notice Struct which to store the rollup data of each chain + * @param accInputHash Hash chain that contains all the information to process a batch: + * keccak256(bytes32 oldAccInputHash, keccak256(bytes transactions), bytes32 globalExitRoot, uint64 timestamp, address seqAddress) + * @param sequencedTimestamp Sequenced timestamp + * @param previousLastBatchSequenced Previous last batch sequenced before the current one, this is used to properly calculate the fees + */ + struct RollupData { + address rollupAddress; + IVerifierRollup verifierAddress; // address?¿ + uint64 chainID; + mapping(uint64 => SequencedBatchData) sequencedBatches; + mapping(uint64 => bytes32) batchNumToStateRoot; + mapping(uint256 => PendingState) pendingStateTransitions; + bytes32 lastLocalExitRoot; + uint64 lastBatchSequenced; + uint64 lastVerifiedBatch; + uint64 lastPendingState; + uint64 lastPendingStateConsolidated; + } + + /** + * @notice Struct to store the pending states + * Pending state will be an intermediary state, that after a timeout can be consolidated, which means that will be added + * to the state root mapping, and the global exit root will be updated + * This is a protection mechanism against soundness attacks, that will be turned off in the future + * @param timestamp Timestamp where the pending state is added to the queue + * @param lastVerifiedBatch Last batch verified batch of this pending state + * @param exitRoot Pending exit root + * @param stateRoot Pending state root + */ + struct PendingState { + uint64 timestamp; + uint64 lastVerifiedBatch; + bytes32 exitRoot; + bytes32 stateRoot; + } + + // Modulus zkSNARK + uint256 internal constant _RFIELD = + 21888242871839275222246405745257275088548364400416034343698204186575808495617; + + // Maximum batches that can be verified in one call. It depends on our current metrics + // This should be a protection against someone that tries to generate huge chunk of invalid batches, and we can't prove otherwise before the pending timeout expires + uint64 internal constant _MAX_VERIFY_BATCHES = 1000; + + // If a sequenced batch exceeds this timeout without being verified, the contract enters in emergency mode + uint64 internal constant _HALT_AGGREGATION_TIMEOUT = 1 weeks; + + // Goldilocks prime field + uint256 internal constant _GOLDILOCKS_PRIME_FIELD = 0xFFFFFFFF00000001; // 2 ** 64 - 2 ** 32 + 1 + + // Max uint64 + uint256 internal constant _MAX_UINT_64 = type(uint64).max; // 0xFFFFFFFFFFFFFFFF + + // Exit merkle tree levels + uint256 internal constant _EXIT_TREE_DEPTH = 32; + + // Global Exit Root interface + IPolygonZkEVMGlobalExitRoot public immutable globalExitRootManager; + + // PolygonZkEVM Bridge Address + IPolygonZkEVMBridge public immutable bridgeAddress; + + // TODO struct to store consensus metadata?¿ and also for the vierifer + + // Number of consensus added, every new consensus will be assigned sequencially a new ID + uint64 public consensusCount; + + // Consensus mapping + // consensus address => consensus Implementation + mapping(address => ConsensusData) public consensusMap; + + // Number of verifiers added, every new verifier will be assigned sequencially a new ID + uint64 public verifierCount; + + // Verifiers mapping + // verifierID => verifierAddress + mapping(address => VerifierData) public verifierMap; + + // Rollup Count + uint64 public rollupCount; + + // Rollups mapping + // RollupID => Rollup Data + mapping(uint64 => RollupData) public rollupIDToRollupData; + + // Rollups mapping + // RollupAddress => rollupID + mapping(address => uint64) public rollupAddressToID; + + // Trusted aggregator for all the Rollups + address public trustedAggregator; + + // Once a pending state exceeds this timeout it can be consolidated + uint64 public pendingStateTimeout; + + // Trusted aggregator timeout, if a sequence is not verified in this time frame, + // everyone can verify that sequence + uint64 public trustedAggregatorTimeout; + + // Governance address + address public governance; // two steps governance + + // This account will be able to accept the governance role + address public pendingGovernance; + + /** + * @dev Emitted when a new consensus is added + */ + event AddNewConsensus( + uint256 consensusID, + address consensusAddress, + string description + ); + + /** + * @dev Emitted when a new consensus is added + */ + event AddNewVerifier( + uint256 verifierId, + address verifierAddress, + string description + ); + + /** + * @dev Emitted when a new verifier is added + */ + event DeleteConsensus(address consensusAddress); + + /** + * @dev Emitted when a new verifier is added + */ + event DeleteVerifier(address verifierAddress); + + /** + * @dev Emitted when a new verifier is added + */ + event AddNewRollup( + address rollupAddress, + address consensusAddress, + address verifierAddress, + uint64 chainID + ); + + /** + * @dev Emitted when a new verifier is added + */ + event RollupUpgraded(address rollupAddress, address newConsensusAddress); + + /** + * @dev Emitted when a new verifier is added + */ + event OnSequenceBatches( + uint64 newSequencedBatch, + bytes32 newAccInputHash, + uint64 rollupID + ); + + /** + * @dev Emitted when a aggregator verifies batches + */ + event VerifyBatches( + uint64 rollupID, + uint64 indexed numBatch, + bytes32 stateRoot, + address indexed aggregator + ); + + /** + * @dev Emitted when a aggregator verifies batches + */ + event VerifyBatchesTrustedAggregator( + uint64 rollupID, + uint64 indexed numBatch, + bytes32 stateRoot, + address indexed aggregator + ); + + /** + * @dev Emitted when pending state is consolidated + */ + event ConsolidatePendingState( + uint64 rollupID, + uint64 indexed numBatch, + bytes32 stateRoot, + uint64 indexed pendingStateNum + ); + + /** + * @dev Emitted when is proved a different state given the same batches + */ + event ProveNonDeterministicPendingState( + bytes32 storedStateRoot, + bytes32 provedStateRoot + ); + + /** + * @dev Emitted when the trusted aggregator overrides pending state + */ + event OverridePendingState( + uint64 indexed numBatch, + bytes32 stateRoot, + address indexed aggregator + ); + + /** + * @dev Emitted when the admin updates the trusted aggregator timeout + */ + event SetTrustedAggregatorTimeout(uint64 newTrustedAggregatorTimeout); + + /** + * @dev Emitted when the admin updates the pending state timeout + */ + event SetPendingStateTimeout(uint64 newPendingStateTimeout); + + /** + * @dev Emitted when the admin updates the trusted aggregator address + */ + event SetTrustedAggregator(address newTrustedAggregator); + + /** + * @dev Emitted when the admin updates the multiplier batch fee + */ + event SetMultiplierBatchFee(uint16 newMultiplierBatchFee); + + /** + * @dev Emitted when the admin updates the verify batch timeout + */ + event SetVerifyBatchTimeTarget(uint64 newVerifyBatchTimeTarget); + + /** + * @dev Emitted when the governance starts the two-step transfer role setting a new pending governance + */ + event TransferGovernanceRole(address newPendingGovernance); + + /** + * @dev Emitted when the pending Governance accepts the Governance role + */ + event AcceptGovernanceRole(address newGovernance); + + /** + * @param _globalExitRootManager Global exit root manager address + * @param _bridgeAddress Bridge address + */ + constructor( + IPolygonZkEVMGlobalExitRoot _globalExitRootManager, + IPolygonZkEVMBridge _bridgeAddress + ) { + globalExitRootManager = _globalExitRootManager; + bridgeAddress = _bridgeAddress; + } + + function initialize( + address _governance, + uint64 _pendingStateTimeout, + address _trustedAggregator, + uint64 _trustedAggregatorTimeout + ) external initializer { + governance = _governance; + trustedAggregator = _trustedAggregator; + + // Check initialize parameters + if (_pendingStateTimeout > _HALT_AGGREGATION_TIMEOUT) { + revert PendingStateTimeoutExceedHaltAggregationTimeout(); + } + pendingStateTimeout = _pendingStateTimeout; + + if (_trustedAggregatorTimeout > _HALT_AGGREGATION_TIMEOUT) { + revert TrustedAggregatorTimeoutExceedHaltAggregationTimeout(); + } + + trustedAggregatorTimeout = _trustedAggregatorTimeout; + + // Initialize OZ contracts + //__Ownable_init_unchained(); + } + + modifier onlyGovernance() { + if (governance != msg.sender) { + revert OnlyGovernance(); + } + _; + } + + modifier onlyTrustedAggregator() { + if (trustedAggregator != msg.sender) { + revert OnlyTrustedAggregator(); + } + _; + } + + /** + * @notice Add a new consensus implementation contract + * This contract will be used as base for the new created Rollups + * @param newConsensusAddress new exit tree root + * @param description description of the consensus + */ + function addNewConsensus( + address newConsensusAddress, + string memory description + ) external onlyGovernance { + if (consensusMap[newConsensusAddress].consensusID != 0) { + revert ConsensusAlreadyExist(); + } + + uint64 consensusID = consensusCount++; + consensusMap[newConsensusAddress] = ConsensusData({ + consensusID: consensusID, + description: description + }); + // Check a view on the consensus contract?¿ + + emit AddNewConsensus(consensusID, newConsensusAddress, description); + } + + /** + * @notice Add a new vefifier contract + * @param newVerifierAddress new verifier address + */ + function addNewVerifier( + address newVerifierAddress, + uint64 forkID, + string memory description + ) external onlyGovernance { + if (verifierMap[newVerifierAddress].verifierID == 0) { + revert VerifierAlreadyExist(); + } + + uint64 verifierID = verifierCount++; + verifierMap[newVerifierAddress] = VerifierData({ + verifierID: verifierID, + forkID: forkID, + description: description + }); + + emit AddNewVerifier(verifierID, newVerifierAddress, description); + } + + /** + * @notice Delete Conensus + * @param consensusAddress Consensus address to delete + */ + function deleteConsensus(address consensusAddress) external onlyGovernance { + if (consensusMap[consensusAddress].consensusID == 0) { + revert ConsensusDoesNotExist(); + } + + delete consensusMap[consensusAddress].description; + delete consensusMap[consensusAddress]; + + emit DeleteConsensus(consensusAddress); + } + + /** + * @notice Delete Verifier + * @param verifierAddress Verifier address to delete + */ + function deleteVerifier(address verifierAddress) external onlyGovernance { + if (verifierMap[verifierAddress].verifierID != 0) { + revert VerifierDoesNotExist(); + } + + delete verifierMap[verifierAddress].description; + delete verifierMap[verifierAddress]; + + emit DeleteVerifier(verifierAddress); + } + + /** + * @notice Create a new rollup + * @param consensusAddress consensus implementation address + * @param verifierAddress chainID + * @param _admin admin of the new created rollup + * @param _trustedSequencer trusted sequencer of the new created rollup + * @param _feeToken fee token of the new created rollup + * @param _trustedSequencerURL trusted sequencer URL of the new created rollup + * @param _networkName network name of the new created rollup + * @param _version version string of the new created rollup + */ + function createNewRollup( + address consensusAddress, + address verifierAddress, + uint64 chainID, + address _admin, + address _trustedSequencer, + IERC20Upgradeable _feeToken, + string memory _trustedSequencerURL, + string memory _networkName, + string calldata _version + ) external onlyGovernance { + if (consensusMap[consensusAddress].consensusID == 0) { + revert ConsensusDoesNotExist(); + } + + if (verifierMap[verifierAddress].verifierID != 0) { + revert VerifierDoesNotExist(); + } + + uint64 rollupID = rollupCount++; + + // Create a proxy, with the consensus as a implementation, and the governance as admin + address rollupAddress = address( + new TransparentUpgradeableProxy( + consensusAddress, + governance, + abi.encodeCall( + PolygonZkEVMV2.initialize, + ( + _admin, + _trustedSequencer, + _feeToken, + _trustedSequencerURL, + _networkName, + _version, + rollupID + ) // TODO Make lib about, like basePolygonRollup + ) + ) + ); + + rollupAddressToID[rollupAddress] = rollupID; + + RollupData storage rollup = rollupIDToRollupData[rollupID]; + rollup.rollupAddress = rollupAddress; + rollup.verifierAddress = IVerifierRollup(verifierAddress); + rollup.chainID = chainID; + + emit AddNewRollup( + rollupAddress, + consensusAddress, + verifierAddress, + chainID + ); + } + + // Add existing rollup, case of zkEVM, could even be hardcoded?¿ + + /** + * @notice Add a new vefifier contract + * @param rollupAddress rollup address + * @param verifierAddress verifier address, must be added before + * @param chainID chain id of the created rollup + */ + function addExistingRollup( + address rollupAddress, + address verifierAddress, + uint64 chainID + ) external onlyGovernance { + uint64 rollupID = rollupCount++; + + rollupAddressToID[rollupAddress] = rollupID; + + RollupData storage rollup = rollupIDToRollupData[rollupID]; + rollup.rollupAddress = rollupAddress; + rollup.verifierAddress = IVerifierRollup(verifierAddress); + rollup.chainID = chainID; + + emit AddNewRollup(rollupAddress, address(0), verifierAddress, chainID); + } + + /** + * @notice Upgrade an existing rollup + * @param rollupAddress Rollup consensus proxy address + * @param newConsensusAddress new implementation of the consensus + * @param upgradeData Upgrade data + */ + function upgradeRollupImplementation( + TransparentUpgradeableProxy rollupAddress, + address newConsensusAddress, + bytes calldata upgradeData + ) external onlyGovernance { + if (consensusMap[newConsensusAddress].consensusID == 0) { + revert ConsensusDoesNotExist(); + } + + if (rollupAddress.implementation() == newConsensusAddress) { + revert UpgradeToSameImplementation(); + } + + rollupAddress.upgradeToAndCall(newConsensusAddress, upgradeData); + + emit RollupUpgraded(address(rollupAddress), newConsensusAddress); + } + + /** + * @notice Add a new vefifier contract + * @param newVerifierAddress new verifier address + */ + function upgradeRollupVerifier( + address rollupAddress, + IVerifierRollup newVerifierAddress + ) external onlyGovernance { + uint64 rollupID = rollupAddressToID[rollupAddress]; + + if (rollupID == 0) { + revert RollupMustExist(); + } + + if (verifierMap[address(newVerifierAddress)].verifierID != 0) { + revert VerifierDoesNotExist(); + } + + RollupData storage rollup = rollupIDToRollupData[rollupID]; + + if (rollup.verifierAddress == newVerifierAddress) { + revert VerifierMustBeDifferent(); + } + + rollup.verifierAddress = newVerifierAddress; + + emit RollupUpgraded(rollupAddress, address(newVerifierAddress)); + } + + // Since it's expected to have no more than 4-5 levels, this approach is good enough + // In a future this computation will be done inside the circuit + + /** + * @notice get the current rollup exit root + */ + function getRollupExitRoot() public view returns (bytes32) { + uint256 currentNodes = rollupCount; + + // if there are no nodes return 0 + if (currentNodes == 0) { + return bytes32(0); + } + + uint256 levelsToCompute; + while ((currentNodes >> levelsToCompute) > 0) { + levelsToCompute++; + } + + // This array will contain the nodes of the current iteration + bytes32[] memory tmpTree = new bytes32[](currentNodes); + + // In the first iteration the nodes will be the leafs which are the local exit roots of each network + for (uint256 i = 0; i < currentNodes; i++) { + tmpTree[i] = rollupIDToRollupData[uint64(i)].lastLocalExitRoot; + } + + // This variable will keep track of the zero hashes + bytes32 currentZeroHashHeight = 0; + + // Calculate the root of the sub-tree that contains all the localExitRoots + while (tmpTree.length != 1) { + uint256 nextIterationNodes = currentNodes / 2 + (currentNodes % 2); + bytes32[] memory nextTmpTree = new bytes32[](nextIterationNodes); + for (uint256 i = 0; i < nextIterationNodes; i++) { + // if we are on the last iteration of the current level and the nodes are odd + if (i == nextIterationNodes - 1 && (currentNodes % 2) == 1) { + nextTmpTree[i] = keccak256( + abi.encodePacked(tmpTree[i * 2], currentZeroHashHeight) + ); + } else { + nextTmpTree[i] = keccak256( + abi.encodePacked(tmpTree[i * 2], tmpTree[(i * 2) + 1]) + ); + } + } + + // update tmpTrees + tmpTree = nextTmpTree; + currentNodes = nextIterationNodes; + currentZeroHashHeight = keccak256( + abi.encodePacked(currentZeroHashHeight, currentZeroHashHeight) + ); + } + bytes32 currentRoot = tmpTree[0]; + uint256 remainingLevels = _EXIT_TREE_DEPTH - levelsToCompute; + + // Calculate remaining levels, since it's a sequencial merkle tree, the rest of the tree is zeroes + for (uint256 i = 0; i < remainingLevels; i++) { + currentRoot = keccak256( + abi.encodePacked(currentRoot, currentZeroHashHeight) + ); + currentZeroHashHeight = keccak256( + abi.encodePacked(currentZeroHashHeight, currentZeroHashHeight) + ); + } + return currentRoot; + } + + ///////////////////////////////////// + // Sequence/Verify batches functions + //////////////////////////////////// + + /** + * @notice Sequence batches + * @param newSequencedBatch new sequenced batch + * @param newAccInputHash new accumualted input hash + */ + function onSequenceBatches( + uint64 newSequencedBatch, + bytes32 newAccInputHash + ) external { + // Get current Rollup + uint64 rollupID = rollupAddressToID[msg.sender]; + + if (rollupID == 0) { + revert SenderMustBeRollup(); + } + + RollupData storage rollup = rollupIDToRollupData[rollupID]; + + if (newSequencedBatch <= rollup.lastBatchSequenced) { + revert NewSequencedBatchMustBeBigger(); + } + // Update rollup data with the new sequence + rollup.sequencedBatches[newSequencedBatch] = SequencedBatchData({ + accInputHash: newAccInputHash, + sequencedTimestamp: uint64(block.timestamp), + previousLastBatchSequenced: rollup.lastBatchSequenced + }); + rollup.lastBatchSequenced = newSequencedBatch; + + emit OnSequenceBatches(newSequencedBatch, newAccInputHash, rollupID); + } + + /** + * @notice Allows an aggregator to verify multiple batches + * @param pendingStateNum Init pending state, 0 if consolidated state is used + * @param initNumBatch Batch which the aggregator starts the verification + * @param finalNewBatch Last batch aggregator intends to verify + * @param newLocalExitRoot New local exit root once the batch is processed + * @param newStateRoot New State root once the batch is processed + * @param proof fflonk proof + */ + function verifyBatches( + uint64 rollupID, + uint64 pendingStateNum, + uint64 initNumBatch, + uint64 finalNewBatch, + bytes32 newLocalExitRoot, + bytes32 newStateRoot, + bytes32[24] calldata proof + ) external ifNotEmergencyState { + RollupData storage rollup = rollupIDToRollupData[rollupID]; + + // Check if the trusted aggregator timeout expired, + // Note that the sequencedBatches struct must exists for this finalNewBatch, if not newAccInputHash will be 0 + if ( + rollup.sequencedBatches[finalNewBatch].sequencedTimestamp + + trustedAggregatorTimeout > + block.timestamp + ) { + revert TrustedAggregatorTimeoutNotExpired(); + } + + if (finalNewBatch - initNumBatch > _MAX_VERIFY_BATCHES) { + revert ExceedMaxVerifyBatches(); + } + + _verifyAndRewardBatches( + rollup, + pendingStateNum, + initNumBatch, + finalNewBatch, + newLocalExitRoot, + newStateRoot, + proof + ); + + if (pendingStateTimeout == 0) { + // Consolidate state + rollup.lastVerifiedBatch = finalNewBatch; + rollup.batchNumToStateRoot[finalNewBatch] = newStateRoot; + rollup.lastLocalExitRoot = newLocalExitRoot; + + // Clean pending state if any + if (rollup.lastPendingState > 0) { + rollup.lastPendingState = 0; + rollup.lastPendingStateConsolidated = 0; + } + + // Interact with globalExitRootManager + globalExitRootManager.updateExitRoot(getRollupExitRoot()); + } else { + // Consolidate pending state if possible + _tryConsolidatePendingState(rollup); + + // Update pending state + rollup.lastPendingState++; + rollup.pendingStateTransitions[ + rollup.lastPendingState + ] = PendingState({ + timestamp: uint64(block.timestamp), + lastVerifiedBatch: finalNewBatch, + exitRoot: newLocalExitRoot, + stateRoot: newStateRoot + }); + } + + emit VerifyBatches(rollupID, finalNewBatch, newStateRoot, msg.sender); + } + + /** + * @notice Allows an aggregator to verify multiple batches + * @param pendingStateNum Init pending state, 0 if consolidated state is used + * @param initNumBatch Batch which the aggregator starts the verification + * @param finalNewBatch Last batch aggregator intends to verify + * @param newLocalExitRoot New local exit root once the batch is processed + * @param newStateRoot New State root once the batch is processed + * @param proof fflonk proof + */ + function verifyBatchesTrustedAggregator( + uint64 rollupID, + uint64 pendingStateNum, + uint64 initNumBatch, + uint64 finalNewBatch, + bytes32 newLocalExitRoot, + bytes32 newStateRoot, + bytes32[24] calldata proof + ) external onlyTrustedAggregator { + RollupData storage rollup = rollupIDToRollupData[rollupID]; + + _verifyAndRewardBatches( + rollup, + pendingStateNum, + initNumBatch, + finalNewBatch, + newLocalExitRoot, + newStateRoot, + proof + ); + + // Consolidate state + rollup.lastVerifiedBatch = finalNewBatch; + rollup.batchNumToStateRoot[finalNewBatch] = newStateRoot; + rollup.lastLocalExitRoot = newLocalExitRoot; + + // Clean pending state if any + if (rollup.lastPendingState > 0) { + rollup.lastPendingState = 0; + rollup.lastPendingStateConsolidated = 0; + } + + // Interact with globalExitRootManager + globalExitRootManager.updateExitRoot(getRollupExitRoot()); + + emit VerifyBatchesTrustedAggregator( + rollupID, + finalNewBatch, + newStateRoot, + msg.sender + ); + } + + /** + * @notice Verify and reward batches internal function + * @param pendingStateNum Init pending state, 0 if consolidated state is used + * @param initNumBatch Batch which the aggregator starts the verification + * @param finalNewBatch Last batch aggregator intends to verify + * @param newLocalExitRoot New local exit root once the batch is processed + * @param newStateRoot New State root once the batch is processed + * @param proof fflonk proof + */ + function _verifyAndRewardBatches( + RollupData storage rollup, + uint64 pendingStateNum, + uint64 initNumBatch, + uint64 finalNewBatch, + bytes32 newLocalExitRoot, + bytes32 newStateRoot, + bytes32[24] calldata proof + ) internal virtual { + bytes32 oldStateRoot; + uint64 currentLastVerifiedBatch = _getLastVerifiedBatch(rollup); + + // Use pending state if specified, otherwise use consolidated state + if (pendingStateNum != 0) { + // Check that pending state exist + // Already consolidated pending states can be used aswell + if (pendingStateNum > rollup.lastPendingState) { + revert PendingStateDoesNotExist(); + } + + // Check choosen pending state + PendingState storage currentPendingState = rollup + .pendingStateTransitions[pendingStateNum]; + + // Get oldStateRoot from pending batch + oldStateRoot = currentPendingState.stateRoot; + + // Check initNumBatch matches the pending state + if (initNumBatch != currentPendingState.lastVerifiedBatch) { + revert InitNumBatchDoesNotMatchPendingState(); + } + } else { + // Use consolidated state + oldStateRoot = rollup.batchNumToStateRoot[initNumBatch]; + + if (oldStateRoot == bytes32(0)) { + revert OldStateRootDoesNotExist(); + } + + // Check initNumBatch is inside the range, sanity check + if (initNumBatch > currentLastVerifiedBatch) { + revert InitNumBatchAboveLastVerifiedBatch(); + } + } + + // Check final batch + if (finalNewBatch <= currentLastVerifiedBatch) { + revert FinalNumBatchBelowLastVerifiedBatch(); + } + + // Get snark bytes + bytes memory snarkHashBytes = _getInputSnarkBytes( + rollup, + initNumBatch, + finalNewBatch, + newLocalExitRoot, + oldStateRoot, + newStateRoot + ); + + // Calulate the snark input + uint256 inputSnark = uint256(sha256(snarkHashBytes)) % _RFIELD; + + // Verify proof + if (!rollup.verifierAddress.verifyProof(proof, [inputSnark])) { + revert InvalidProof(); + } + + PolygonZkEVMV2(rollup.rollupAddress).verifyAndRewardBatches( + msg.sender, + (finalNewBatch - currentLastVerifiedBatch) + ); + } + + /** + * @notice Internal function to consolidate the state automatically once sequence or verify batches are called + * It tries to consolidate the first and the middle pending state in the queue + */ + function _tryConsolidatePendingState(RollupData storage rollup) internal { + // Check if there's any state to consolidate + if (rollup.lastPendingState > rollup.lastPendingStateConsolidated) { + // Check if it's possible to consolidate the next pending state + uint64 nextPendingState = rollup.lastPendingStateConsolidated + 1; + if (_isPendingStateConsolidable(rollup, nextPendingState)) { + // Check middle pending state ( binary search of 1 step) + uint64 middlePendingState = nextPendingState + + (rollup.lastPendingState - nextPendingState) / + 2; + + // Try to consolidate it, and if not, consolidate the nextPendingState + if (_isPendingStateConsolidable(rollup, middlePendingState)) { + _consolidatePendingState(rollup, middlePendingState); + } else { + _consolidatePendingState(rollup, nextPendingState); + } + } + } + } + + /** + * @notice Allows to consolidate any pending state that has already exceed the pendingStateTimeout + * Can be called by the trusted aggregator, which can consolidate any state without the timeout restrictions + * @param pendingStateNum Pending state to consolidate + */ + function consolidatePendingState( + uint64 rollupID, + uint64 pendingStateNum + ) external { + RollupData storage rollup = rollupIDToRollupData[rollupID]; + // Check if pending state can be consolidated + // If trusted aggregator is the sender, do not check the timeout or the emergency state + if (msg.sender != trustedAggregator) { + if (isEmergencyState) { + revert OnlyNotEmergencyState(); + } + + if (!_isPendingStateConsolidable(rollup, pendingStateNum)) { + revert PendingStateNotConsolidable(); + } + } + _consolidatePendingState(rollup, pendingStateNum); + } + + /** + * @notice Internal function to consolidate any pending state that has already exceed the pendingStateTimeout + * @param pendingStateNum Pending state to consolidate + */ + function _consolidatePendingState( + RollupData storage rollup, + uint64 pendingStateNum + ) internal { + // Check if pendingStateNum is in correct range + // - not consolidated (implicity checks that is not 0) + // - exist ( has been added) + if ( + pendingStateNum <= rollup.lastPendingStateConsolidated || + pendingStateNum > rollup.lastPendingState + ) { + revert PendingStateInvalid(); + } + + PendingState storage currentPendingState = rollup + .pendingStateTransitions[pendingStateNum]; + + // Update state + uint64 newLastVerifiedBatch = currentPendingState.lastVerifiedBatch; + rollup.lastVerifiedBatch = newLastVerifiedBatch; + rollup.batchNumToStateRoot[newLastVerifiedBatch] = currentPendingState + .stateRoot; + + // Update pending state + rollup.lastPendingStateConsolidated = pendingStateNum; + + // Interact with globalExitRootManager + globalExitRootManager.updateExitRoot(currentPendingState.exitRoot); + + emit ConsolidatePendingState( + rollupAddressToID[rollup.rollupAddress], + newLastVerifiedBatch, + currentPendingState.stateRoot, + pendingStateNum + ); + } + + ///////////////////////////////// + // Soundness protection functions + ///////////////////////////////// + + /** + * @notice Allows the trusted aggregator to override the pending state + * if it's possible to prove a different state root given the same batches + * @param initPendingStateNum Init pending state, 0 if consolidated state is used + * @param finalPendingStateNum Final pending state, that will be used to compare with the newStateRoot + * @param initNumBatch Batch which the aggregator starts the verification + * @param finalNewBatch Last batch aggregator intends to verify + * @param newLocalExitRoot New local exit root once the batch is processed + * @param newStateRoot New State root once the batch is processed + * @param proof fflonk proof + */ + function overridePendingState( + uint64 rollupID, + uint64 initPendingStateNum, + uint64 finalPendingStateNum, + uint64 initNumBatch, + uint64 finalNewBatch, + bytes32 newLocalExitRoot, + bytes32 newStateRoot, + bytes32[24] calldata proof + ) external onlyTrustedAggregator { + RollupData storage rollup = rollupIDToRollupData[rollupID]; + + _proveDistinctPendingState( + rollup, + initPendingStateNum, + finalPendingStateNum, + initNumBatch, + finalNewBatch, + newLocalExitRoot, + newStateRoot, + proof + ); + + // Consolidate state state + rollup.lastVerifiedBatch = finalNewBatch; + rollup.batchNumToStateRoot[finalNewBatch] = newStateRoot; + rollup.lastLocalExitRoot = newLocalExitRoot; + + // Clean pending state if any + if (rollup.lastPendingState > 0) { + rollup.lastPendingState = 0; + rollup.lastPendingStateConsolidated = 0; + } + + // Interact with globalExitRootManager + globalExitRootManager.updateExitRoot(getRollupExitRoot()); + + // Update trusted aggregator timeout to max + trustedAggregatorTimeout = _HALT_AGGREGATION_TIMEOUT; + + emit OverridePendingState(finalNewBatch, newStateRoot, msg.sender); + } + + /** + * @notice Allows to halt the PolygonZkEVM if its possible to prove a different state root given the same batches + * @param initPendingStateNum Init pending state, 0 if consolidated state is used + * @param finalPendingStateNum Final pending state, that will be used to compare with the newStateRoot + * @param initNumBatch Batch which the aggregator starts the verification + * @param finalNewBatch Last batch aggregator intends to verify + * @param newLocalExitRoot New local exit root once the batch is processed + * @param newStateRoot New State root once the batch is processed + * @param proof fflonk proof + */ + function proveNonDeterministicPendingState( + uint64 rollupID, + uint64 initPendingStateNum, + uint64 finalPendingStateNum, + uint64 initNumBatch, + uint64 finalNewBatch, + bytes32 newLocalExitRoot, + bytes32 newStateRoot, + bytes32[24] calldata proof + ) external ifNotEmergencyState { + RollupData storage rollup = rollupIDToRollupData[rollupID]; + + _proveDistinctPendingState( + rollup, + initPendingStateNum, + finalPendingStateNum, + initNumBatch, + finalNewBatch, + newLocalExitRoot, + newStateRoot, + proof + ); + + emit ProveNonDeterministicPendingState( + rollup.batchNumToStateRoot[finalNewBatch], + newStateRoot + ); + + // Activate emergency state + _activateEmergencyState(); + } + + /** + * @notice Internal function that proves a different state root given the same batches to verify + * @param initPendingStateNum Init pending state, 0 if consolidated state is used + * @param finalPendingStateNum Final pending state, that will be used to compare with the newStateRoot + * @param initNumBatch Batch which the aggregator starts the verification + * @param finalNewBatch Last batch aggregator intends to verify + * @param newLocalExitRoot New local exit root once the batch is processed + * @param newStateRoot New State root once the batch is processed + * @param proof fflonk proof + */ + function _proveDistinctPendingState( + RollupData storage rollup, + uint64 initPendingStateNum, + uint64 finalPendingStateNum, + uint64 initNumBatch, + uint64 finalNewBatch, + bytes32 newLocalExitRoot, + bytes32 newStateRoot, + bytes32[24] calldata proof + ) internal view virtual { + bytes32 oldStateRoot; + + // Use pending state if specified, otherwise use consolidated state + if (initPendingStateNum != 0) { + // Check that pending state exist + // Already consolidated pending states can be used aswell + if (initPendingStateNum > rollup.lastPendingState) { + revert PendingStateDoesNotExist(); + } + + // Check choosen pending state + PendingState storage initPendingState = rollup + .pendingStateTransitions[initPendingStateNum]; + + // Get oldStateRoot from init pending state + oldStateRoot = initPendingState.stateRoot; + + // Check initNumBatch matches the init pending state + if (initNumBatch != initPendingState.lastVerifiedBatch) { + revert InitNumBatchDoesNotMatchPendingState(); + } + } else { + // Use consolidated state + oldStateRoot = rollup.batchNumToStateRoot[initNumBatch]; + if (oldStateRoot == bytes32(0)) { + revert OldStateRootDoesNotExist(); + } + + // Check initNumBatch is inside the range, sanity check + if (initNumBatch > rollup.lastVerifiedBatch) { + revert InitNumBatchAboveLastVerifiedBatch(); + } + } + + // Assert final pending state num is in correct range + // - exist ( has been added) + // - bigger than the initPendingstate + // - not consolidated + if ( + finalPendingStateNum > rollup.lastPendingState || + finalPendingStateNum <= initPendingStateNum || + finalPendingStateNum <= rollup.lastPendingStateConsolidated + ) { + revert FinalPendingStateNumInvalid(); + } + + // Check final num batch + if ( + finalNewBatch != + rollup + .pendingStateTransitions[finalPendingStateNum] + .lastVerifiedBatch + ) { + revert FinalNumBatchDoesNotMatchPendingState(); + } + + // Get snark bytes + bytes memory snarkHashBytes = _getInputSnarkBytes( + rollup, + initNumBatch, + finalNewBatch, + newLocalExitRoot, + oldStateRoot, + newStateRoot + ); + + // Calulate the snark input + uint256 inputSnark = uint256(sha256(snarkHashBytes)) % _RFIELD; + + // Verify proof + if (!rollup.verifierAddress.verifyProof(proof, [inputSnark])) { + revert InvalidProof(); + } + + if ( + rollup.pendingStateTransitions[finalPendingStateNum].stateRoot == + newStateRoot + ) { + revert StoredRootMustBeDifferentThanNewRoot(); + } + } + + /** + * @notice 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 + * @param sequencedBatchNum Sequenced batch number that has not been aggreagated in _HALT_AGGREGATION_TIMEOUT + */ + function activateEmergencyState(uint64 sequencedBatchNum) external { + if (msg.sender != governance) { + // TODO + revert NotSupportedCurrently(); + // // Only check conditions if is not called by the owner + // uint64 currentLastVerifiedBatch = getLastVerifiedBatch(); + // // Check that the batch has not been verified + // if (sequencedBatchNum <= currentLastVerifiedBatch) { + // revert BatchAlreadyVerified(); + // } + // // Check that the batch has been sequenced and this was the end of a sequence + // if ( + // sequencedBatchNum > lastBatchSequenced || + // sequencedBatches[sequencedBatchNum].sequencedTimestamp == 0 + // ) { + // revert BatchNotSequencedOrNotSequenceEnd(); + // } + // // Check that has been passed _HALT_AGGREGATION_TIMEOUT since it was sequenced + // if ( + // sequencedBatches[sequencedBatchNum].sequencedTimestamp + + // _HALT_AGGREGATION_TIMEOUT > + // block.timestamp + // ) { + // revert HaltTimeoutNotExpired(); + // } + } + _activateEmergencyState(); + } + + /** + * @notice Function to deactivate emergency state on both PolygonZkEVM and PolygonZkEVMBridge contracts + */ + function deactivateEmergencyState() external onlyGovernance { + // Deactivate emergency state on PolygonZkEVMBridge + bridgeAddress.deactivateEmergencyState(); + + // Deactivate emergency state on this contract + super._deactivateEmergencyState(); + } + + /** + * @notice Internal function to activate emergency state on both PolygonZkEVM and PolygonZkEVMBridge contracts + */ + function _activateEmergencyState() internal override { + // Activate emergency state on PolygonZkEVM Bridge + bridgeAddress.activateEmergencyState(); + + // Activate emergency state on this contract + super._activateEmergencyState(); + } + + ////////////////// + // admin functions + ////////////////// + + /** + * @notice Allow the admin to set a new pending state timeout + * The timeout can only be lowered, except if emergency state is active + * @param newTrustedAggregatorTimeout Trusted aggregator timeout + */ + function setTrustedAggregatorTimeout( + uint64 newTrustedAggregatorTimeout + ) external onlyGovernance { + if (newTrustedAggregatorTimeout > _HALT_AGGREGATION_TIMEOUT) { + revert TrustedAggregatorTimeoutExceedHaltAggregationTimeout(); + } + + if (!isEmergencyState) { + if (newTrustedAggregatorTimeout >= trustedAggregatorTimeout) { + revert NewTrustedAggregatorTimeoutMustBeLower(); + } + } + + trustedAggregatorTimeout = newTrustedAggregatorTimeout; + emit SetTrustedAggregatorTimeout(newTrustedAggregatorTimeout); + } + + /** + * @notice Allow the admin to set a new trusted aggregator timeout + * The timeout can only be lowered, except if emergency state is active + * @param newPendingStateTimeout Trusted aggregator timeout + */ + function setPendingStateTimeout( + uint64 newPendingStateTimeout + ) external onlyGovernance { + if (newPendingStateTimeout > _HALT_AGGREGATION_TIMEOUT) { + revert PendingStateTimeoutExceedHaltAggregationTimeout(); + } + + if (!isEmergencyState) { + if (newPendingStateTimeout >= pendingStateTimeout) { + revert NewPendingStateTimeoutMustBeLower(); + } + } + + pendingStateTimeout = newPendingStateTimeout; + emit SetPendingStateTimeout(newPendingStateTimeout); + } + + /** + * @notice Starts the Governance role transfer + * This is a two step process, the pending Governance must accepted to finalize the process + * @param newPendingGovernance Address of the new pending Governance + */ + function transferGovernanceRole( + address newPendingGovernance + ) external onlyGovernance { + pendingGovernance = newPendingGovernance; + emit TransferGovernanceRole(newPendingGovernance); + } + + /** + * @notice Allow the current pending Governance to accept the Governance role + */ + function acceptGovernanceRole() external { + if (pendingGovernance != msg.sender) { + revert OnlyPendingGovernance(); + } + + governance = pendingGovernance; + emit AcceptGovernanceRole(pendingGovernance); + } + + //////////////////////// + // public/view functions + //////////////////////// + + /** + * @notice Get the last verified batch + */ + function getLastVerifiedBatch(uint64 rollupID) public returns (uint64) { + return _getLastVerifiedBatch(rollupIDToRollupData[rollupID]); + } + + /** + * @notice Get the last verified batch + */ + function _getLastVerifiedBatch( + RollupData storage rollup + ) internal returns (uint64) { + if (rollup.lastPendingState > 0) { + return + rollup + .pendingStateTransitions[rollup.lastPendingState] + .lastVerifiedBatch; + } else { + return rollup.lastVerifiedBatch; + } + } + + /** + * @notice Returns a boolean that indicates if the pendingStateNum is or not consolidable + * Note that his function does not check if the pending state currently exists, or if it's consolidated already + */ + function isPendingStateConsolidable( + uint64 rollupID, + uint64 pendingStateNum + ) public view returns (bool) { + return + _isPendingStateConsolidable( + rollupIDToRollupData[rollupID], + pendingStateNum + ); + } + + /** + * @notice Returns a boolean that indicates if the pendingStateNum is or not consolidable + * Note that his function does not check if the pending state currently exists, or if it's consolidated already + */ + function _isPendingStateConsolidable( + RollupData storage rollup, + uint64 pendingStateNum + ) internal view returns (bool) { + return (rollup.pendingStateTransitions[pendingStateNum].timestamp + + pendingStateTimeout <= + block.timestamp); + } + + /** + * @notice Function to calculate the input snark bytes + * @param initNumBatch Batch which the aggregator starts the verification + * @param finalNewBatch Last batch aggregator intends to verify + * @param newLocalExitRoot New local exit root once the batch is processed + * @param oldStateRoot State root before batch is processed + * @param newStateRoot New State root once the batch is processed + */ + function getInputSnarkBytes( + uint64 rollupID, + uint64 initNumBatch, + uint64 finalNewBatch, + bytes32 newLocalExitRoot, + bytes32 oldStateRoot, + bytes32 newStateRoot + ) public view returns (bytes memory) { + return + _getInputSnarkBytes( + rollupIDToRollupData[rollupID], + initNumBatch, + finalNewBatch, + newLocalExitRoot, + oldStateRoot, + newStateRoot + ); + } + + /** + * @notice Function to calculate the input snark bytes + * @param initNumBatch Batch which the aggregator starts the verification + * @param finalNewBatch Last batch aggregator intends to verify + * @param newLocalExitRoot New local exit root once the batch is processed + * @param oldStateRoot State root before batch is processed + * @param newStateRoot New State root once the batch is processed + */ + function _getInputSnarkBytes( + RollupData storage rollup, + uint64 initNumBatch, + uint64 finalNewBatch, + bytes32 newLocalExitRoot, + bytes32 oldStateRoot, + bytes32 newStateRoot + ) internal view returns (bytes memory) { + // sanity checks + bytes32 oldAccInputHash = rollup + .sequencedBatches[initNumBatch] + .accInputHash; + + bytes32 newAccInputHash = rollup + .sequencedBatches[finalNewBatch] + .accInputHash; + + // sanity checks + if (initNumBatch != 0 && oldAccInputHash == bytes32(0)) { + revert OldAccInputHashDoesNotExist(); + } + + if (newAccInputHash == bytes32(0)) { + revert NewAccInputHashDoesNotExist(); + } + + // Check that new state root is inside goldilocks field + if (!checkStateRootInsidePrime(uint256(newStateRoot))) { + revert NewStateRootNotInsidePrime(); + } + + return + abi.encodePacked( + msg.sender, // TODO=?¿ + oldStateRoot, + oldAccInputHash, + initNumBatch, + rollup.chainID, + verifierMap[address(rollup.verifierAddress)].forkID, + newStateRoot, + newAccInputHash, + newLocalExitRoot, + finalNewBatch + ); + } + + function checkStateRootInsidePrime( + uint256 newStateRoot + ) public pure returns (bool) { + if ( + ((newStateRoot & _MAX_UINT_64) < _GOLDILOCKS_PRIME_FIELD) && + (((newStateRoot >> 64) & _MAX_UINT_64) < _GOLDILOCKS_PRIME_FIELD) && + (((newStateRoot >> 128) & _MAX_UINT_64) < + _GOLDILOCKS_PRIME_FIELD) && + ((newStateRoot >> 192) < _GOLDILOCKS_PRIME_FIELD) + ) { + return true; + } else { + return false; + } + } +} diff --git a/contracts/v2/PolygonStateManager.sol b/contracts/v2/PolygonStateManager.sol deleted file mode 100644 index 081b88899..000000000 --- a/contracts/v2/PolygonStateManager.sol +++ /dev/null @@ -1,167 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 - -pragma solidity 0.8.20; - -import "../interfaces/IPolygonRollupManager.sol"; -import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; - -/** - * Contract responsible for managing the exit roots across multiple networks - */ -abstract contract PolygonRollupManager is IPolygonRollupManager, Initializable { - /** - * @notice Struct which will be stored for every batch sequence - * @param accInputHash Hash chain that contains all the information to process a batch: - * keccak256(bytes32 oldAccInputHash, keccak256(bytes transactions), bytes32 globalExitRoot, uint64 timestamp, address seqAddress) - * @param sequencedTimestamp Sequenced timestamp - * @param previousLastBatchSequenced Previous last batch sequenced before the current one, this is used to properly calculate the fees - */ - struct SequencedBatchData { - bytes32 accInputHash; - uint64 sequencedTimestamp; - uint64 previousLastBatchSequenced; - } - - /** - * @notice Struct which to store the rollup data of each chain - * @param accInputHash Hash chain that contains all the information to process a batch: - * keccak256(bytes32 oldAccInputHash, keccak256(bytes transactions), bytes32 globalExitRoot, uint64 timestamp, address seqAddress) - * @param sequencedTimestamp Sequenced timestamp - * @param previousLastBatchSequenced Previous last batch sequenced before the current one, this is used to properly calculate the fees - */ - struct ChainData { - mapping(uint64 => SequencedBatchData) sequencedBatches; - mapping(uint64 => bytes32) batchNumToStateRoot; - mapping(uint256 => PendingState) pendingStateTransitions; - uint64 lastBatchSequenced; - uint64 lastVerifiedBatch; - uint64 lastPendingState; - uint64 lastPendingStateConsolidated; - address trustedAggregator; - } - - /** - * @notice Struct to store the pending states - * Pending state will be an intermediary state, that after a timeout can be consolidated, which means that will be added - * to the state root mapping, and the global exit root will be updated - * This is a protection mechanism against soundness attacks, that will be turned off in the future - * @param timestamp Timestamp where the pending state is added to the queue - * @param lastVerifiedBatch Last batch verified batch of this pending state - * @param exitRoot Pending exit root - * @param stateRoot Pending state root - */ - struct PendingState { - uint64 timestamp; - uint64 lastVerifiedBatch; - bytes32 exitRoot; - bytes32 stateRoot; - } - - // struct to store consensus metadata?¿ - - // Number of consensus added, every new consensus will be assigned sequencially a new ID - uint256 public consensusCount; - - // Consensus mapping - // consensusID => consensusImpl - mapping(uint256 => address) public consensusMap; - - // Number of verifiers added, every new verifiers will be assigned sequencially a new ID - uint256 public verifierCount; - - // Verifiers mapping - // verifierID => verifierAddress - mapping(uint256 => address) public verifierMap; - - // Governance address - address public governance; - - // Governance address - address public networkCount; - - // Once a pending state exceeds this timeout it can be consolidated - uint64 public pendingStateTimeout; - - // Trusted aggregator timeout, if a sequence is not verified in this time frame, - // everyone can verify that sequence - uint64 public trustedAggregatorTimeout; - - // Address that will be able to adjust contract parameters or stop the emergency state - address public admin; - - // This account will be able to accept the admin role - address public pendingAdmin; - - /** - * @dev Emitted when a new consensus is added - */ - event AddNewConsensus(uint256 consensusID, address consensusAddress); - - /** - * @dev Emitted when a new verifier is added - */ - event AddNewVerifier(uint256 verifierID, address verifierAddress); - - function initialize(address _governance) external initializer { - governance = _governance; - } - - modifier onlyGovernance() { - if (governance != msg.sender) { - revert OnlyGovernance(); - } - _; - } - - /** - * @notice Add a new consensus contract - * @param newConsensusAddress new exit tree root - */ - function addNewConsensus( - address newConsensusAddress - ) external onlyGovernance { - uint256 consensusID = consensusCount++; - consensusMap[consensusID] = newConsensusAddress; - - emit AddNewConsensus(consensusID, newConsensusAddress); - } - - /** - * @notice Add a new vefifier contract - * @param newVerifierAddress new verifier address - */ - function addNewVerifier( - address newVerifierAddress - ) external onlyGovernance { - uint256 verifierID = verifierCount++; - verifierMap[verifierID] = newVerifierAddress; - - emit AddNewVerifier(verifierID, newVerifierAddress); - } - - /** - * @notice Add a new vefifier contract - * @param newVerifierAddress new verifier address - */ - function createNewNetwork( - address newVerifierAddress - ) external onlyGovernance { - uint256 verifierID = verifierCount++; - verifierMap[verifierID] = newVerifierAddress; - - emit AddNewVerifier(verifierID, newVerifierAddress); - } - - /** - * @notice Add a new vefifier contract - * @param newVerifierAddress new verifier address - */ - function calculateCurrentRollupRoot( - address newVerifierAddress - ) external onlyGovernance { - uint256 verifierID = verifierCount++; - verifierMap[verifierID] = newVerifierAddress; - - emit AddNewVerifier(verifierID, newVerifierAddress); - } -} diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index ce627279f..ecf0b2608 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -7,7 +7,7 @@ import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeab import "../lib/TokenWrapped.sol"; import "../interfaces/IBasePolygonZkEVMGlobalExitRoot.sol"; import "../interfaces/IBridgeMessageReceiver.sol"; -import "../interfaces/IPolygonZkEVMBridge.sol"; +import "../interfaces/IPolygonZkEVMBridgeV2.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol"; import "../lib/EmergencyManager.sol"; import "../lib/GlobalExitRootLib.sol"; @@ -19,7 +19,7 @@ import "../lib/GlobalExitRootLib.sol"; contract PolygonZkEVMBridgeV2 is DepositContract, EmergencyManager, - IPolygonZkEVMBridge + IPolygonZkEVMBridgeV2 { using SafeERC20Upgradeable for IERC20Upgradeable; @@ -600,6 +600,8 @@ contract PolygonZkEVMBridgeV2 is uint32 leafIndex; bytes32 claimRoot; + + //TODO if (networkID == _MAINNET_NETWORK_ID) { // Verify merkle proof using rollup exit root claimRoot = rollupExitRoot; diff --git a/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol b/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol index e7b6df354..4ed70a6db 100644 --- a/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol +++ b/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: AGPL-3.0 - + pragma solidity 0.8.20; - + import "../interfaces/IPolygonZkEVMGlobalExitRoot.sol"; import "../lib/GlobalExitRootLib.sol"; import "../lib/DepositContractLib.sol"; - + /** * Contract responsible for managing the exit roots across multiple networks */ @@ -15,19 +15,22 @@ contract PolygonZkEVMGlobalExitRootV2 is { // PolygonZkEVMBridge address address public immutable bridgeAddress; - + // Rollup manager contract address address public immutable rollupManager; - + // Rollup root, contains all exit roots of all rollups bytes32 public lastRollupExitRoot; - + // Mainnet exit root, this will be updated every time a deposit is made in mainnet bytes32 public lastMainnetExitRoot; - + // Store every global exit root: Root --> timestamp mapping(bytes32 => uint256) public globalExitRootMap; - + + // Store every global exit root: Root --> timestamp + mapping(bytes32 => uint256) public historicGlobalExitRootSnapshots; + /** * @dev Emitted when the global exit root is updated */ @@ -35,7 +38,15 @@ contract PolygonZkEVMGlobalExitRootV2 is bytes32 indexed mainnetExitRoot, bytes32 indexed rollupExitRoot ); - + + /** + * @dev Emitted when a snapshot of the historic global exit root is taken + */ + event HistoricGlobalExitRootSnapshot( + uint256 indexed depositCount, + bytes32 indexed historicGlobalExitRoot + ); + /** * @param _rollupManager Rollup contract address * @param _bridgeAddress PolygonZkEVMBridge contract address @@ -44,7 +55,7 @@ contract PolygonZkEVMGlobalExitRootV2 is rollupManager = _rollupManager; bridgeAddress = _bridgeAddress; } - + /** * @notice Update the exit root of one of the networks and the global exit root * @param newRoot new exit tree root @@ -53,7 +64,7 @@ contract PolygonZkEVMGlobalExitRootV2 is // Store storage variables into temporal variables since will be used multiple times bytes32 cacheLastRollupExitRoot = lastRollupExitRoot; bytes32 cacheLastMainnetExitRoot = lastMainnetExitRoot; - + if (msg.sender == bridgeAddress) { lastMainnetExitRoot = newRoot; cacheLastMainnetExitRoot = newRoot; @@ -63,12 +74,12 @@ contract PolygonZkEVMGlobalExitRootV2 is } else { revert OnlyAllowedContracts(); } - + bytes32 newGlobalExitRoot = GlobalExitRootLib.calculateGlobalExitRoot( cacheLastMainnetExitRoot, cacheLastRollupExitRoot ); - + // If it already exists, do not modify the timestamp if (globalExitRootMap[newGlobalExitRoot] == 0) { globalExitRootMap[newGlobalExitRoot] = block.timestamp; @@ -76,12 +87,12 @@ contract PolygonZkEVMGlobalExitRootV2 is cacheLastMainnetExitRoot, cacheLastRollupExitRoot ); - + // Update the historical roots _addLeaf(newGlobalExitRoot); } } - + /** * @notice Return last global exit root */ @@ -92,7 +103,7 @@ contract PolygonZkEVMGlobalExitRootV2 is lastRollupExitRoot ); } - + /** * @notice Computes and returns the merkle root */ @@ -104,4 +115,23 @@ contract PolygonZkEVMGlobalExitRootV2 is { return super.getRoot(); } -} \ No newline at end of file + + /** + * @notice Computes and returns the merkle root + */ + function makeHistoricGlobalExitRootSnapshot() public { + bytes32 currentHistoricGlobalExitRoot = getRoot(); + if ( + historicGlobalExitRootSnapshots[currentHistoricGlobalExitRoot] == 0 + ) { + historicGlobalExitRootSnapshots[ + currentHistoricGlobalExitRoot + ] = block.timestamp; + + emit HistoricGlobalExitRootSnapshot( + depositCount, + currentHistoricGlobalExitRoot + ); + } + } +} diff --git a/contracts/v2/PolygonZkEVMV2.sol b/contracts/v2/PolygonZkEVMV2.sol index 2b0b3f01c..73c4e8902 100644 --- a/contracts/v2/PolygonZkEVMV2.sol +++ b/contracts/v2/PolygonZkEVMV2.sol @@ -8,6 +8,8 @@ import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "../interfaces/IPolygonZkEVMBridge.sol"; import "../lib/EmergencyManager.sol"; import "../interfaces/IPolygonZkEVMErrors.sol"; +import "../interfaces/IPolygonZkEVMV2Errors.sol"; +import "./PolygonRollupManager.sol"; /** * Contract responsible for managing the states and the updates of L2 network. @@ -20,7 +22,8 @@ import "../interfaces/IPolygonZkEVMErrors.sol"; contract PolygonZkEVMV2 is OwnableUpgradeable, EmergencyManager, - IPolygonZkEVMErrors + IPolygonZkEVMErrors, + IPolygonZkEVMV2Errors { using SafeERC20Upgradeable for IERC20Upgradeable; @@ -78,7 +81,6 @@ contract PolygonZkEVMV2 is struct InitializePackedParameters { address admin; address trustedSequencer; - address trustedAggregator; //¿?¿?¿?¿? uint64 trustedAggregatorTimeout; } @@ -132,20 +134,23 @@ contract PolygonZkEVMV2 is // Boolena indicating that is not a forced batch bool internal constant _IS_NOT_FORCED_BATCH = false; + // Fee token address + IERC20Upgradeable public feeToken; + // Rollup verifier interface IVerifierRollup public immutable rollupVerifier; // Global Exit Root interface IPolygonZkEVMGlobalExitRoot public immutable globalExitRootManager; - // PolygonZkEVM Bridge Address - IPolygonZkEVMBridge public immutable bridgeAddress; + // // PolygonZkEVM Bridge Address + // IPolygonZkEVMBridge public immutable bridgeAddress; // L2 chain identifier - uint64 public immutable chainID; + uint64 public chainID; // L2 chain identifier - uint64 public immutable forkID; + uint64 public forkID; // Time target of the verification of a batch // Adaptatly the batchFee will be updated to achieve this target @@ -157,7 +162,7 @@ contract PolygonZkEVMV2 is // Trusted sequencer address address public trustedSequencer; - // Current matic fee per batch sequenced + // Current feeToken fee per batch sequenced uint256 public batchFee; // Queue of forced batches with their associated data @@ -227,8 +232,11 @@ contract PolygonZkEVMV2 is // Indicates if forced batches are disallowed bool public isForcedBatchDisallowed; - // fee token address - IERC20Upgradeable public feeToken; + // Rollup manager + PolygonRollupManager public rollupManager; + + // Rollup manager + uint64 public rollupID; /** * @dev Emitted when the trusted sequencer sends a new batch of transactions @@ -355,78 +363,54 @@ contract PolygonZkEVMV2 is */ event UpdateZkEVMVersion(uint64 numBatch, uint64 forkID, string version); - // General parameters that will have all networks that deploys this contract - /** + * @param _globalExitRootManager Global exit root manager address * @param _rollupVerifier Rollup verifier address * @param _rollupManager Global exit root manager address - * @param _forkID Fork ID */ constructor( + IPolygonZkEVMGlobalExitRoot _globalExitRootManager, IVerifierRollup _rollupVerifier, - IRollupManager _rollupManager + PolygonRollupManager _rollupManager ) { + globalExitRootManager = _globalExitRootManager; rollupVerifier = _rollupVerifier; rollupManager = _rollupManager; - forkID = _forkID; } /** - * @param initializePackedParameters Struct to save gas and avoid stack too deep errors - * @param genesisRoot Rollup genesis root + * @param _admin Admin address + * @param _trustedSequencer Trusted sequencer address + * @param _feeToken Fee token * @param _trustedSequencerURL Trusted sequencer URL * @param _networkName L2 network name - * @param _chainID L2 chainID + * @param _version version */ function initialize( - InitializePackedParameters calldata initializePackedParameters, - bytes32 genesisRoot, + address _admin, + address _trustedSequencer, + IERC20Upgradeable _feeToken, string memory _trustedSequencerURL, string memory _networkName, string calldata _version, - IERC20Upgradeable _feeToken, - uint64 _chainID, - uint64 _forkID + uint64 _rollupID ) external initializer { - admin = initializePackedParameters.admin; - trustedSequencer = initializePackedParameters.trustedSequencer; - trustedAggregator = initializePackedParameters.trustedAggregator; - batchNumToStateRoot[0] = genesisRoot; + admin = _admin; + trustedSequencer = _trustedSequencer; + feeToken = _feeToken; trustedSequencerURL = _trustedSequencerURL; networkName = _networkName; - feeToken =_feeToken - - // Check initialize parameters - if ( - initializePackedParameters.pendingStateTimeout > - _HALT_AGGREGATION_TIMEOUT - ) { - revert PendingStateTimeoutExceedHaltAggregationTimeout(); - } - pendingStateTimeout = initializePackedParameters.pendingStateTimeout; - - if ( - initializePackedParameters.trustedAggregatorTimeout > - _HALT_AGGREGATION_TIMEOUT - ) { - revert TrustedAggregatorTimeoutExceedHaltAggregationTimeout(); - } - - trustedAggregatorTimeout = initializePackedParameters - .trustedAggregatorTimeout; + rollupID = _rollupID; // Constant deployment variables - batchFee = 0.1 ether; // 0.1 Matic + batchFee = 0.1 ether; // 0.1 feeToken verifyBatchTimeTarget = 30 minutes; multiplierBatchFee = 1002; forceBatchTimeout = 5 days; isForcedBatchDisallowed = true; - chainID = _chainID; - forkID = _forkID; - // Initialize OZ contracts __Ownable_init_unchained(); @@ -448,9 +432,9 @@ contract PolygonZkEVMV2 is _; } - modifier onlyTrustedAggregator() { - if (trustedAggregator != msg.sender) { - revert OnlyTrustedAggregator(); + modifier onlyRollupManager() { + if (address(rollupManager) != msg.sender) { + revert OnlyRollupManager(); } _; } @@ -485,8 +469,8 @@ contract PolygonZkEVMV2 is revert ExceedMaxVerifyBatches(); } - // Update global exit root if there are new deposits - bridgeAddress.updateGlobalExitRoot(); + // // Update global exit root if there are new deposits TODO check in rollup manager + // bridgeAddress.updateGlobalExitRoot(); // Get global batch variables bytes32 historicGlobalExitRoot = globalExitRootManager.getRoot(); @@ -598,300 +582,28 @@ contract PolygonZkEVMV2 is } // Pay collateral for every non-forced batch submitted - matic.safeTransferFrom( + feeToken.safeTransferFrom( msg.sender, address(this), batchFee * nonForcedBatchesSequenced ); - // Consolidate pending state if possible - _tryConsolidatePendingState(); - emit SequenceBatches(currentBatchSequenced); } /** - * @notice Allows an aggregator to verify multiple batches - * @param pendingStateNum Init pending state, 0 if consolidated state is used - * @param initNumBatch Batch which the aggregator starts the verification - * @param finalNewBatch Last batch aggregator intends to verify - * @param newLocalExitRoot New local exit root once the batch is processed - * @param newStateRoot New State root once the batch is processed - * @param proof fflonk proof + * @notice Reward batches, can only be called by the rollup manager + * @param beneficiary Addres htat will receive the fees + * @param batchesToReward Batches to reward */ - function verifyBatches( - uint64 pendingStateNum, - uint64 initNumBatch, - uint64 finalNewBatch, - bytes32 newLocalExitRoot, - bytes32 newStateRoot, - bytes32[24] calldata proof - ) external ifNotEmergencyState { - // Check if the trusted aggregator timeout expired, - // Note that the sequencedBatches struct must exists for this finalNewBatch, if not newAccInputHash will be 0 - if ( - sequencedBatches[finalNewBatch].sequencedTimestamp + - trustedAggregatorTimeout > - block.timestamp - ) { - revert TrustedAggregatorTimeoutNotExpired(); - } - - if (finalNewBatch - initNumBatch > _MAX_VERIFY_BATCHES) { - revert ExceedMaxVerifyBatches(); - } - - _verifyAndRewardBatches( - pendingStateNum, - initNumBatch, - finalNewBatch, - newLocalExitRoot, - newStateRoot, - proof - ); - - // Update batch fees - _updateBatchFee(finalNewBatch); - - if (pendingStateTimeout == 0) { - // Consolidate state - lastVerifiedBatch = finalNewBatch; - batchNumToStateRoot[finalNewBatch] = newStateRoot; - - // Clean pending state if any - if (lastPendingState > 0) { - lastPendingState = 0; - lastPendingStateConsolidated = 0; - } - - // Interact with globalExitRootManager - globalExitRootManager.updateExitRoot(newLocalExitRoot); - } else { - // Consolidate pending state if possible - _tryConsolidatePendingState(); - - // Update pending state - lastPendingState++; - pendingStateTransitions[lastPendingState] = PendingState({ - timestamp: uint64(block.timestamp), - lastVerifiedBatch: finalNewBatch, - exitRoot: newLocalExitRoot, - stateRoot: newStateRoot - }); - } - - emit VerifyBatches(finalNewBatch, newStateRoot, msg.sender); - } - - /** - * @notice Allows an aggregator to verify multiple batches - * @param pendingStateNum Init pending state, 0 if consolidated state is used - * @param initNumBatch Batch which the aggregator starts the verification - * @param finalNewBatch Last batch aggregator intends to verify - * @param newLocalExitRoot New local exit root once the batch is processed - * @param newStateRoot New State root once the batch is processed - * @param proof fflonk proof - */ - function verifyBatchesTrustedAggregator( - uint64 pendingStateNum, - uint64 initNumBatch, - uint64 finalNewBatch, - bytes32 newLocalExitRoot, - bytes32 newStateRoot, - bytes32[24] calldata proof - ) external onlyTrustedAggregator { - _verifyAndRewardBatches( - pendingStateNum, - initNumBatch, - finalNewBatch, - newLocalExitRoot, - newStateRoot, - proof - ); - - // Consolidate state - lastVerifiedBatch = finalNewBatch; - batchNumToStateRoot[finalNewBatch] = newStateRoot; - - // Clean pending state if any - if (lastPendingState > 0) { - lastPendingState = 0; - lastPendingStateConsolidated = 0; - } - - // Interact with globalExitRootManager - globalExitRootManager.updateExitRoot(newLocalExitRoot); - - emit VerifyBatchesTrustedAggregator( - finalNewBatch, - newStateRoot, - msg.sender - ); - } - - /** - * @notice Verify and reward batches internal function - * @param pendingStateNum Init pending state, 0 if consolidated state is used - * @param initNumBatch Batch which the aggregator starts the verification - * @param finalNewBatch Last batch aggregator intends to verify - * @param newLocalExitRoot New local exit root once the batch is processed - * @param newStateRoot New State root once the batch is processed - * @param proof fflonk proof - */ - function _verifyAndRewardBatches( - uint64 pendingStateNum, - uint64 initNumBatch, - uint64 finalNewBatch, - bytes32 newLocalExitRoot, - bytes32 newStateRoot, - bytes32[24] calldata proof - ) internal virtual { - bytes32 oldStateRoot; - uint64 currentLastVerifiedBatch = getLastVerifiedBatch(); - - // Use pending state if specified, otherwise use consolidated state - if (pendingStateNum != 0) { - // Check that pending state exist - // Already consolidated pending states can be used aswell - if (pendingStateNum > lastPendingState) { - revert PendingStateDoesNotExist(); - } - - // Check choosen pending state - PendingState storage currentPendingState = pendingStateTransitions[ - pendingStateNum - ]; - - // Get oldStateRoot from pending batch - oldStateRoot = currentPendingState.stateRoot; - - // Check initNumBatch matches the pending state - if (initNumBatch != currentPendingState.lastVerifiedBatch) { - revert InitNumBatchDoesNotMatchPendingState(); - } - } else { - // Use consolidated state - oldStateRoot = batchNumToStateRoot[initNumBatch]; - - if (oldStateRoot == bytes32(0)) { - revert OldStateRootDoesNotExist(); - } - - // Check initNumBatch is inside the range, sanity check - if (initNumBatch > currentLastVerifiedBatch) { - revert InitNumBatchAboveLastVerifiedBatch(); - } - } - - // Check final batch - if (finalNewBatch <= currentLastVerifiedBatch) { - revert FinalNumBatchBelowLastVerifiedBatch(); - } - - // Get snark bytes - bytes memory snarkHashBytes = getInputSnarkBytes( - initNumBatch, - finalNewBatch, - newLocalExitRoot, - oldStateRoot, - newStateRoot - ); - - // Calulate the snark input - uint256 inputSnark = uint256(sha256(snarkHashBytes)) % _RFIELD; - // Verify proof - if (!rollupVerifier.verifyProof(proof, [inputSnark])) { - revert InvalidProof(); - } - - // Get MATIC reward - matic.safeTransfer( + function verifyAndRewardBatches( + address beneficiary, + uint64 batchesToReward + ) public onlyRollupManager { + // Get feeToken reward + feeToken.safeTransfer( msg.sender, - calculateRewardPerBatch() * - (finalNewBatch - currentLastVerifiedBatch) - ); - } - - /** - * @notice Internal function to consolidate the state automatically once sequence or verify batches are called - * It tries to consolidate the first and the middle pending state in the queue - */ - function _tryConsolidatePendingState() internal { - // Check if there's any state to consolidate - if (lastPendingState > lastPendingStateConsolidated) { - // Check if it's possible to consolidate the next pending state - uint64 nextPendingState = lastPendingStateConsolidated + 1; - if (isPendingStateConsolidable(nextPendingState)) { - // Check middle pending state ( binary search of 1 step) - uint64 middlePendingState = nextPendingState + - (lastPendingState - nextPendingState) / - 2; - - // Try to consolidate it, and if not, consolidate the nextPendingState - if (isPendingStateConsolidable(middlePendingState)) { - _consolidatePendingState(middlePendingState); - } else { - _consolidatePendingState(nextPendingState); - } - } - } - } - - /** - * @notice Allows to consolidate any pending state that has already exceed the pendingStateTimeout - * Can be called by the trusted aggregator, which can consolidate any state without the timeout restrictions - * @param pendingStateNum Pending state to consolidate - */ - function consolidatePendingState(uint64 pendingStateNum) external { - // Check if pending state can be consolidated - // If trusted aggregator is the sender, do not check the timeout or the emergency state - if (msg.sender != trustedAggregator) { - if (isEmergencyState) { - revert OnlyNotEmergencyState(); - } - - if (!isPendingStateConsolidable(pendingStateNum)) { - revert PendingStateNotConsolidable(); - } - } - _consolidatePendingState(pendingStateNum); - } - - /** - * @notice Internal function to consolidate any pending state that has already exceed the pendingStateTimeout - * @param pendingStateNum Pending state to consolidate - */ - function _consolidatePendingState(uint64 pendingStateNum) internal { - // Check if pendingStateNum is in correct range - // - not consolidated (implicity checks that is not 0) - // - exist ( has been added) - if ( - pendingStateNum <= lastPendingStateConsolidated || - pendingStateNum > lastPendingState - ) { - revert PendingStateInvalid(); - } - - PendingState storage currentPendingState = pendingStateTransitions[ - pendingStateNum - ]; - - // Update state - uint64 newLastVerifiedBatch = currentPendingState.lastVerifiedBatch; - lastVerifiedBatch = newLastVerifiedBatch; - batchNumToStateRoot[newLastVerifiedBatch] = currentPendingState - .stateRoot; - - // Update pending state - lastPendingStateConsolidated = pendingStateNum; - - // Interact with globalExitRootManager - globalExitRootManager.updateExitRoot(currentPendingState.exitRoot); - - emit ConsolidatePendingState( - newLastVerifiedBatch, - currentPendingState.stateRoot, - pendingStateNum + calculateRewardPerBatch() * (batchesToReward) ); } @@ -999,24 +711,24 @@ contract PolygonZkEVMV2 is * In order to assure that users force transactions will be processed properly, user must not sign any other transaction * with the same nonce * @param transactions L2 ethereum transactions EIP-155 or pre-EIP-155 with signature: - * @param maticAmount Max amount of MATIC tokens that the sender is willing to pay + * @param feeTokenAmount Max amount of feeToken tokens that the sender is willing to pay */ function forceBatch( bytes calldata transactions, - uint256 maticAmount + uint256 feeTokenAmount ) public isForceBatchAllowed ifNotEmergencyState { - // Calculate matic collateral - uint256 maticFee = getForcedBatchFee(); + // Calculate feeToken collateral + uint256 feeTokenFee = getForcedBatchFee(); - if (maticFee > maticAmount) { - revert NotEnoughMaticAmount(); + if (feeTokenFee > feeTokenAmount) { + revert NotEnoughfeeTokenAmount(); } if (transactions.length > _MAX_FORCE_BATCH_BYTE_LENGTH) { revert TransactionsLengthAboveMax(); } - matic.safeTransferFrom(msg.sender, address(this), maticFee); + feeToken.safeTransferFrom(msg.sender, address(this), feeTokenFee); // Get historic global exit root bytes32 historicGlobalExitRoot = globalExitRootManager.getRoot(); @@ -1177,62 +889,6 @@ contract PolygonZkEVMV2 is emit SetTrustedSequencerURL(newTrustedSequencerURL); } - /** - * @notice Allow the admin to set a new trusted aggregator address - * @param newTrustedAggregator Address of the new trusted aggregator - */ - function setTrustedAggregator( - address newTrustedAggregator - ) external onlyAdmin { - trustedAggregator = newTrustedAggregator; - - emit SetTrustedAggregator(newTrustedAggregator); - } - - /** - * @notice Allow the admin to set a new pending state timeout - * The timeout can only be lowered, except if emergency state is active - * @param newTrustedAggregatorTimeout Trusted aggregator timeout - */ - function setTrustedAggregatorTimeout( - uint64 newTrustedAggregatorTimeout - ) external onlyAdmin { - if (newTrustedAggregatorTimeout > _HALT_AGGREGATION_TIMEOUT) { - revert TrustedAggregatorTimeoutExceedHaltAggregationTimeout(); - } - - if (!isEmergencyState) { - if (newTrustedAggregatorTimeout >= trustedAggregatorTimeout) { - revert NewTrustedAggregatorTimeoutMustBeLower(); - } - } - - trustedAggregatorTimeout = newTrustedAggregatorTimeout; - emit SetTrustedAggregatorTimeout(newTrustedAggregatorTimeout); - } - - /** - * @notice Allow the admin to set a new trusted aggregator timeout - * The timeout can only be lowered, except if emergency state is active - * @param newPendingStateTimeout Trusted aggregator timeout - */ - function setPendingStateTimeout( - uint64 newPendingStateTimeout - ) external onlyAdmin { - if (newPendingStateTimeout > _HALT_AGGREGATION_TIMEOUT) { - revert PendingStateTimeoutExceedHaltAggregationTimeout(); - } - - if (!isEmergencyState) { - if (newPendingStateTimeout >= pendingStateTimeout) { - revert NewPendingStateTimeoutMustBeLower(); - } - } - - pendingStateTimeout = newPendingStateTimeout; - emit SetPendingStateTimeout(newPendingStateTimeout); - } - /** * @notice Allow the admin to set a new multiplier batch fee * @param newMultiplierBatchFee multiplier batch fee @@ -1320,253 +976,6 @@ contract PolygonZkEVMV2 is emit AcceptAdminRole(pendingAdmin); } - ///////////////////////////////// - // Soundness protection functions - ///////////////////////////////// - - /** - * @notice Allows the trusted aggregator to override the pending state - * if it's possible to prove a different state root given the same batches - * @param initPendingStateNum Init pending state, 0 if consolidated state is used - * @param finalPendingStateNum Final pending state, that will be used to compare with the newStateRoot - * @param initNumBatch Batch which the aggregator starts the verification - * @param finalNewBatch Last batch aggregator intends to verify - * @param newLocalExitRoot New local exit root once the batch is processed - * @param newStateRoot New State root once the batch is processed - * @param proof fflonk proof - */ - function overridePendingState( - uint64 initPendingStateNum, - uint64 finalPendingStateNum, - uint64 initNumBatch, - uint64 finalNewBatch, - bytes32 newLocalExitRoot, - bytes32 newStateRoot, - bytes32[24] calldata proof - ) external onlyTrustedAggregator { - _proveDistinctPendingState( - initPendingStateNum, - finalPendingStateNum, - initNumBatch, - finalNewBatch, - newLocalExitRoot, - newStateRoot, - proof - ); - - // Consolidate state state - lastVerifiedBatch = finalNewBatch; - batchNumToStateRoot[finalNewBatch] = newStateRoot; - - // Clean pending state if any - if (lastPendingState > 0) { - lastPendingState = 0; - lastPendingStateConsolidated = 0; - } - - // Interact with globalExitRootManager - globalExitRootManager.updateExitRoot(newLocalExitRoot); - - // Update trusted aggregator timeout to max - trustedAggregatorTimeout = _HALT_AGGREGATION_TIMEOUT; - - emit OverridePendingState(finalNewBatch, newStateRoot, msg.sender); - } - - /** - * @notice Allows to halt the PolygonZkEVM if its possible to prove a different state root given the same batches - * @param initPendingStateNum Init pending state, 0 if consolidated state is used - * @param finalPendingStateNum Final pending state, that will be used to compare with the newStateRoot - * @param initNumBatch Batch which the aggregator starts the verification - * @param finalNewBatch Last batch aggregator intends to verify - * @param newLocalExitRoot New local exit root once the batch is processed - * @param newStateRoot New State root once the batch is processed - * @param proof fflonk proof - */ - function proveNonDeterministicPendingState( - uint64 initPendingStateNum, - uint64 finalPendingStateNum, - uint64 initNumBatch, - uint64 finalNewBatch, - bytes32 newLocalExitRoot, - bytes32 newStateRoot, - bytes32[24] calldata proof - ) external ifNotEmergencyState { - _proveDistinctPendingState( - initPendingStateNum, - finalPendingStateNum, - initNumBatch, - finalNewBatch, - newLocalExitRoot, - newStateRoot, - proof - ); - - emit ProveNonDeterministicPendingState( - batchNumToStateRoot[finalNewBatch], - newStateRoot - ); - - // Activate emergency state - _activateEmergencyState(); - } - - /** - * @notice Internal function that proves a different state root given the same batches to verify - * @param initPendingStateNum Init pending state, 0 if consolidated state is used - * @param finalPendingStateNum Final pending state, that will be used to compare with the newStateRoot - * @param initNumBatch Batch which the aggregator starts the verification - * @param finalNewBatch Last batch aggregator intends to verify - * @param newLocalExitRoot New local exit root once the batch is processed - * @param newStateRoot New State root once the batch is processed - * @param proof fflonk proof - */ - function _proveDistinctPendingState( - uint64 initPendingStateNum, - uint64 finalPendingStateNum, - uint64 initNumBatch, - uint64 finalNewBatch, - bytes32 newLocalExitRoot, - bytes32 newStateRoot, - bytes32[24] calldata proof - ) internal view virtual { - bytes32 oldStateRoot; - - // Use pending state if specified, otherwise use consolidated state - if (initPendingStateNum != 0) { - // Check that pending state exist - // Already consolidated pending states can be used aswell - if (initPendingStateNum > lastPendingState) { - revert PendingStateDoesNotExist(); - } - - // Check choosen pending state - PendingState storage initPendingState = pendingStateTransitions[ - initPendingStateNum - ]; - - // Get oldStateRoot from init pending state - oldStateRoot = initPendingState.stateRoot; - - // Check initNumBatch matches the init pending state - if (initNumBatch != initPendingState.lastVerifiedBatch) { - revert InitNumBatchDoesNotMatchPendingState(); - } - } else { - // Use consolidated state - oldStateRoot = batchNumToStateRoot[initNumBatch]; - if (oldStateRoot == bytes32(0)) { - revert OldStateRootDoesNotExist(); - } - - // Check initNumBatch is inside the range, sanity check - if (initNumBatch > lastVerifiedBatch) { - revert InitNumBatchAboveLastVerifiedBatch(); - } - } - - // Assert final pending state num is in correct range - // - exist ( has been added) - // - bigger than the initPendingstate - // - not consolidated - if ( - finalPendingStateNum > lastPendingState || - finalPendingStateNum <= initPendingStateNum || - finalPendingStateNum <= lastPendingStateConsolidated - ) { - revert FinalPendingStateNumInvalid(); - } - - // Check final num batch - if ( - finalNewBatch != - pendingStateTransitions[finalPendingStateNum].lastVerifiedBatch - ) { - revert FinalNumBatchDoesNotMatchPendingState(); - } - - // Get snark bytes - bytes memory snarkHashBytes = getInputSnarkBytes( - initNumBatch, - finalNewBatch, - newLocalExitRoot, - oldStateRoot, - newStateRoot - ); - - // Calulate the snark input - uint256 inputSnark = uint256(sha256(snarkHashBytes)) % _RFIELD; - - // Verify proof - if (!rollupVerifier.verifyProof(proof, [inputSnark])) { - revert InvalidProof(); - } - - if ( - pendingStateTransitions[finalPendingStateNum].stateRoot == - newStateRoot - ) { - revert StoredRootMustBeDifferentThanNewRoot(); - } - } - - /** - * @notice 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 - * @param sequencedBatchNum Sequenced batch number that has not been aggreagated in _HALT_AGGREGATION_TIMEOUT - */ - function activateEmergencyState(uint64 sequencedBatchNum) external { - if (msg.sender != owner()) { - // Only check conditions if is not called by the owner - uint64 currentLastVerifiedBatch = getLastVerifiedBatch(); - - // Check that the batch has not been verified - if (sequencedBatchNum <= currentLastVerifiedBatch) { - revert BatchAlreadyVerified(); - } - - // Check that the batch has been sequenced and this was the end of a sequence - if ( - sequencedBatchNum > lastBatchSequenced || - sequencedBatches[sequencedBatchNum].sequencedTimestamp == 0 - ) { - revert BatchNotSequencedOrNotSequenceEnd(); - } - - // Check that has been passed _HALT_AGGREGATION_TIMEOUT since it was sequenced - if ( - sequencedBatches[sequencedBatchNum].sequencedTimestamp + - _HALT_AGGREGATION_TIMEOUT > - block.timestamp - ) { - revert HaltTimeoutNotExpired(); - } - } - _activateEmergencyState(); - } - - /** - * @notice Function to deactivate emergency state on both PolygonZkEVM and PolygonZkEVMBridge contracts - */ - function deactivateEmergencyState() external onlyAdmin { - // Deactivate emergency state on PolygonZkEVMBridge - bridgeAddress.deactivateEmergencyState(); - - // Deactivate emergency state on this contract - super._deactivateEmergencyState(); - } - - /** - * @notice Internal function to activate emergency state on both PolygonZkEVM and PolygonZkEVMBridge contracts - */ - function _activateEmergencyState() internal override { - // Activate emergency state on PolygonZkEVM Bridge - bridgeAddress.activateEmergencyState(); - - // Activate emergency state on this contract - super._activateEmergencyState(); - } - //////////////////////// // public/view functions //////////////////////// @@ -1575,37 +984,14 @@ contract PolygonZkEVMV2 is * @notice Get forced batch fee */ function getForcedBatchFee() public view returns (uint256) { - return batchFee * 100; - } - - /** - * @notice Get the last verified batch - */ - function getLastVerifiedBatch() public view returns (uint64) { - if (lastPendingState > 0) { - return pendingStateTransitions[lastPendingState].lastVerifiedBatch; - } else { - return lastVerifiedBatch; - } - } - - /** - * @notice Returns a boolean that indicates if the pendingStateNum is or not consolidable - * Note that his function does not check if the pending state currently exists, or if it's consolidated already - */ - function isPendingStateConsolidable( - uint64 pendingStateNum - ) public view returns (bool) { - return (pendingStateTransitions[pendingStateNum].timestamp + - pendingStateTimeout <= - block.timestamp); + return batchFee * 100; // TODO } /** * @notice Function to calculate the reward to verify a single batch */ - function calculateRewardPerBatch() public view returns (uint256) { - uint256 currentBalance = matic.balanceOf(address(this)); + function calculateRewardPerBatch() public returns (uint256) { + uint256 currentBalance = feeToken.balanceOf(address(this)); // Total Sequenced Batches = forcedBatches to be sequenced (total forced Batches - sequenced Batches) + sequencedBatches // Total Batches to be verified = Total Sequenced Batches - verified Batches @@ -1618,65 +1004,9 @@ contract PolygonZkEVMV2 is } /** - * @notice Function to calculate the input snark bytes - * @param initNumBatch Batch which the aggregator starts the verification - * @param finalNewBatch Last batch aggregator intends to verify - * @param newLocalExitRoot New local exit root once the batch is processed - * @param oldStateRoot State root before batch is processed - * @param newStateRoot New State root once the batch is processed + * @notice Get the last verified batch */ - function getInputSnarkBytes( - uint64 initNumBatch, - uint64 finalNewBatch, - bytes32 newLocalExitRoot, - bytes32 oldStateRoot, - bytes32 newStateRoot - ) public view returns (bytes memory) { - // sanity checks - bytes32 oldAccInputHash = sequencedBatches[initNumBatch].accInputHash; - bytes32 newAccInputHash = sequencedBatches[finalNewBatch].accInputHash; - - if (initNumBatch != 0 && oldAccInputHash == bytes32(0)) { - revert OldAccInputHashDoesNotExist(); - } - - if (newAccInputHash == bytes32(0)) { - revert NewAccInputHashDoesNotExist(); - } - - // Check that new state root is inside goldilocks field - if (!checkStateRootInsidePrime(uint256(newStateRoot))) { - revert NewStateRootNotInsidePrime(); - } - - return - abi.encodePacked( - msg.sender, - oldStateRoot, - oldAccInputHash, - initNumBatch, - chainID, - forkID, - newStateRoot, - newAccInputHash, - newLocalExitRoot, - finalNewBatch - ); - } - - function checkStateRootInsidePrime( - uint256 newStateRoot - ) public pure returns (bool) { - if ( - ((newStateRoot & _MAX_UINT_64) < _GOLDILOCKS_PRIME_FIELD) && - (((newStateRoot >> 64) & _MAX_UINT_64) < _GOLDILOCKS_PRIME_FIELD) && - (((newStateRoot >> 128) & _MAX_UINT_64) < - _GOLDILOCKS_PRIME_FIELD) && - ((newStateRoot >> 192) < _GOLDILOCKS_PRIME_FIELD) - ) { - return true; - } else { - return false; - } + function getLastVerifiedBatch() public returns (uint64) { + return rollupManager.getLastVerifiedBatch(rollupID); } } diff --git a/docs/v2/PolygonRollupManager.md b/docs/v2/PolygonRollupManager.md index e124c4463..4665a54d5 100644 --- a/docs/v2/PolygonRollupManager.md +++ b/docs/v2/PolygonRollupManager.md @@ -1,7 +1,22 @@ -Contract responsible for managing the exit roots across multiple networks +Contract responsible for managing the exit roots across multiple Rollups ## Functions +### constructor +```solidity + function constructor( + contract IPolygonZkEVMGlobalExitRoot _globalExitRootManager, + contract IPolygonZkEVMBridge _bridgeAddress + ) internal +``` + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`_globalExitRootManager` | contract IPolygonZkEVMGlobalExitRoot | Global exit root manager address +|`_bridgeAddress` | contract IPolygonZkEVMBridge | Bridge address + ### initialize ```solidity function initialize( @@ -14,16 +29,19 @@ Contract responsible for managing the exit roots across multiple networks ### addNewConsensus ```solidity function addNewConsensus( - address newConsensusAddress + address newConsensusAddress, + string description ) external ``` -Add a new consensus contract +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 @@ -39,10 +57,68 @@ Add a new vefifier contract | :--- | :--- | :------------------------------------------------------------------- | |`newVerifierAddress` | address | new verifier address -### createNewNetwork +### deleteConsensus ```solidity - function createNewNetwork( - address newVerifierAddress + function deleteConsensus( + address consensusAddress + ) external +``` +Delete Conensus + + +#### 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 + +### createNewRollup +```solidity + function createNewRollup( + address consensusAddress, + address verifierAddress, + uint64 _admin, + address _trustedSequencer, + address _feeToken, + contract IERC20Upgradeable _trustedSequencerURL, + string _networkName, + string _version + ) external +``` +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 + +### addExistingRollup +```solidity + function addExistingRollup( + address rollupAddress, + address verifierAddress, + uint64 chainID ) external ``` Add a new vefifier contract @@ -51,11 +127,31 @@ Add a new vefifier contract #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`newVerifierAddress` | address | new verifier address +|`rollupAddress` | address | rollup address +|`verifierAddress` | address | verifier address, must be added before +|`chainID` | uint64 | chain id of the created rollup + +### upgradeRollupImplementation +```solidity + function upgradeRollupImplementation( + contract TransparentUpgradeableProxy rollupAddress, + address newConsensusAddress, + bytes upgradeData + ) external +``` +Upgrade an existing rollup + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`rollupAddress` | contract TransparentUpgradeableProxy | Rollup consensus proxy address +|`newConsensusAddress` | address | new implementation of the consensus +|`upgradeData` | bytes | Upgrade data -### calculateCurrentRollupRoot +### upgradeRollupVerifier ```solidity - function calculateCurrentRollupRoot( + function upgradeRollupVerifier( address newVerifierAddress ) external ``` @@ -67,6 +163,399 @@ Add a new vefifier contract | :--- | :--- | :------------------------------------------------------------------- | |`newVerifierAddress` | address | new verifier address +### getRollupExitRoot +```solidity + function getRollupExitRoot( + ) public returns (bytes32) +``` +get the current rollup exit root + + + +### onSequenceBatches +```solidity + function onSequenceBatches( + uint64 newSequencedBatch, + bytes32 newAccInputHash + ) external +``` +Sequence batches + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`newSequencedBatch` | uint64 | new sequenced batch +|`newAccInputHash` | bytes32 | new accumualted input hash + +### verifyBatches +```solidity + function verifyBatches( + uint64 pendingStateNum, + uint64 initNumBatch, + uint64 finalNewBatch, + uint64 newLocalExitRoot, + bytes32 newStateRoot, + bytes32 proof + ) external +``` +Allows an aggregator to verify multiple batches + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`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 +|`newStateRoot` | bytes32 | New State root once the batch is processed +|`proof` | bytes32 | fflonk proof + +### verifyBatchesTrustedAggregator +```solidity + function verifyBatchesTrustedAggregator( + uint64 pendingStateNum, + uint64 initNumBatch, + uint64 finalNewBatch, + uint64 newLocalExitRoot, + bytes32 newStateRoot, + bytes32 proof + ) external +``` +Allows an aggregator to verify multiple batches + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`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 +|`newStateRoot` | bytes32 | New State root once the batch is processed +|`proof` | bytes32 | fflonk proof + +### _verifyAndRewardBatches +```solidity + function _verifyAndRewardBatches( + struct PolygonRollupManager.RollupData pendingStateNum, + uint64 initNumBatch, + uint64 finalNewBatch, + uint64 newLocalExitRoot, + bytes32 newStateRoot, + bytes32 proof + ) internal +``` +Verify and reward batches internal function + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`pendingStateNum` | struct PolygonRollupManager.RollupData | 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 +|`newStateRoot` | bytes32 | New State root once the batch is processed +|`proof` | bytes32 | fflonk proof + +### _tryConsolidatePendingState +```solidity + function _tryConsolidatePendingState( + ) internal +``` +Internal function to consolidate the state automatically once sequence or verify batches are called +It tries to consolidate the first and the middle pending state in the queue + + + +### consolidatePendingState +```solidity + function consolidatePendingState( + uint64 pendingStateNum + ) external +``` +Allows to consolidate any pending state that has already exceed the pendingStateTimeout +Can be called by the trusted aggregator, which can consolidate any state without the timeout restrictions + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`pendingStateNum` | uint64 | Pending state to consolidate + +### _consolidatePendingState +```solidity + function _consolidatePendingState( + struct PolygonRollupManager.RollupData pendingStateNum + ) internal +``` +Internal function to consolidate any pending state that has already exceed the pendingStateTimeout + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`pendingStateNum` | struct PolygonRollupManager.RollupData | Pending state to consolidate + +### overridePendingState +```solidity + function overridePendingState( + uint64 initPendingStateNum, + uint64 finalPendingStateNum, + uint64 initNumBatch, + uint64 finalNewBatch, + uint64 newLocalExitRoot, + bytes32 newStateRoot, + bytes32 proof + ) external +``` +Allows the trusted aggregator to override the pending state +if it's possible to prove a different state root given the same batches + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`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 +|`newStateRoot` | bytes32 | New State root once the batch is processed +|`proof` | bytes32 | fflonk proof + +### proveNonDeterministicPendingState +```solidity + function proveNonDeterministicPendingState( + uint64 initPendingStateNum, + uint64 finalPendingStateNum, + uint64 initNumBatch, + uint64 finalNewBatch, + uint64 newLocalExitRoot, + bytes32 newStateRoot, + bytes32 proof + ) external +``` +Allows to halt the PolygonZkEVM if its possible to prove a different state root given the same batches + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`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 +|`newStateRoot` | bytes32 | New State root once the batch is processed +|`proof` | bytes32 | fflonk proof + +### _proveDistinctPendingState +```solidity + function _proveDistinctPendingState( + struct PolygonRollupManager.RollupData initPendingStateNum, + uint64 finalPendingStateNum, + uint64 initNumBatch, + uint64 finalNewBatch, + uint64 newLocalExitRoot, + bytes32 newStateRoot, + bytes32 proof + ) internal +``` +Internal function that proves a different state root given the same batches to verify + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`initPendingStateNum` | struct PolygonRollupManager.RollupData | 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 +|`newStateRoot` | bytes32 | New State root once the batch is processed +|`proof` | bytes32 | fflonk proof + +### 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 + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`sequencedBatchNum` | uint64 | Sequenced batch number that has not been aggreagated in _HALT_AGGREGATION_TIMEOUT + +### deactivateEmergencyState +```solidity + function deactivateEmergencyState( + ) external +``` +Function to deactivate emergency state on both PolygonZkEVM and PolygonZkEVMBridge contracts + + + +### _activateEmergencyState +```solidity + function _activateEmergencyState( + ) internal +``` +Internal function to activate emergency state on both PolygonZkEVM and PolygonZkEVMBridge contracts + + + +### setTrustedAggregatorTimeout +```solidity + function setTrustedAggregatorTimeout( + uint64 newTrustedAggregatorTimeout + ) external +``` +Allow the admin to set a new pending state timeout +The timeout can only be lowered, except if emergency state is active + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`newTrustedAggregatorTimeout` | uint64 | Trusted aggregator timeout + +### setPendingStateTimeout +```solidity + function setPendingStateTimeout( + uint64 newPendingStateTimeout + ) external +``` +Allow the admin to set a new trusted aggregator timeout +The timeout can only be lowered, except if emergency state is active + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`newPendingStateTimeout` | uint64 | Trusted aggregator timeout + +### transferGovernanceRole +```solidity + function transferGovernanceRole( + address newPendingGovernance + ) external +``` +Starts the Governance role transfer +This is a two step process, the pending Governance must accepted to finalize the process + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`newPendingGovernance` | address | Address of the new pending Governance + +### acceptGovernanceRole +```solidity + function acceptGovernanceRole( + ) external +``` +Allow the current pending Governance to accept the Governance role + + + +### getLastVerifiedBatch +```solidity + function getLastVerifiedBatch( + ) public returns (uint64) +``` +Get the last verified batch + + + +### _getLastVerifiedBatch +```solidity + function _getLastVerifiedBatch( + ) internal returns (uint64) +``` +Get the last verified batch + + + +### isPendingStateConsolidable +```solidity + function isPendingStateConsolidable( + ) public returns (bool) +``` +Returns a boolean that indicates if the pendingStateNum is or not consolidable +Note that his function does not check if the pending state currently exists, or if it's consolidated already + + + +### _isPendingStateConsolidable +```solidity + function _isPendingStateConsolidable( + ) internal returns (bool) +``` +Returns a boolean that indicates if the pendingStateNum is or not consolidable +Note that his function does not check if the pending state currently exists, or if it's consolidated already + + + +### getInputSnarkBytes +```solidity + function getInputSnarkBytes( + uint64 initNumBatch, + uint64 finalNewBatch, + uint64 newLocalExitRoot, + bytes32 oldStateRoot, + bytes32 newStateRoot + ) public returns (bytes) +``` +Function to calculate the input snark bytes + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`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 +|`oldStateRoot` | bytes32 | State root before batch is processed +|`newStateRoot` | bytes32 | New State root once the batch is processed + +### _getInputSnarkBytes +```solidity + function _getInputSnarkBytes( + struct PolygonRollupManager.RollupData initNumBatch, + uint64 finalNewBatch, + uint64 newLocalExitRoot, + bytes32 oldStateRoot, + bytes32 newStateRoot + ) internal returns (bytes) +``` +Function to calculate the input snark bytes + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`initNumBatch` | struct PolygonRollupManager.RollupData | 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 +|`newStateRoot` | bytes32 | New State root once the batch is processed + +### checkStateRootInsidePrime +```solidity + function checkStateRootInsidePrime( + ) public returns (bool) +``` + + + + ## Events ### AddNewConsensus ```solidity @@ -82,5 +571,141 @@ Emitted when a new consensus is added ) ``` +Emitted when a new consensus is added + +### DeleteConsensus +```solidity + event DeleteConsensus( + ) +``` + Emitted when a new verifier is added +### DeleteVerifier +```solidity + event DeleteVerifier( + ) +``` + +Emitted when a new verifier is added + +### AddNewRollup +```solidity + event AddNewRollup( + ) +``` + +Emitted when a new verifier is added + +### RollupUpgraded +```solidity + event RollupUpgraded( + ) +``` + +Emitted when a new verifier is added + +### OnSequenceBatches +```solidity + event OnSequenceBatches( + ) +``` + +Emitted when a new verifier is added + +### VerifyBatches +```solidity + event VerifyBatches( + ) +``` + +Emitted when a aggregator verifies batches + +### VerifyBatchesTrustedAggregator +```solidity + event VerifyBatchesTrustedAggregator( + ) +``` + +Emitted when a aggregator verifies batches + +### ConsolidatePendingState +```solidity + event ConsolidatePendingState( + ) +``` + +Emitted when pending state is consolidated + +### ProveNonDeterministicPendingState +```solidity + event ProveNonDeterministicPendingState( + ) +``` + +Emitted when is proved a different state given the same batches + +### OverridePendingState +```solidity + event OverridePendingState( + ) +``` + +Emitted when the trusted aggregator overrides pending state + +### SetTrustedAggregatorTimeout +```solidity + event SetTrustedAggregatorTimeout( + ) +``` + +Emitted when the admin updates the trusted aggregator timeout + +### SetPendingStateTimeout +```solidity + event SetPendingStateTimeout( + ) +``` + +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( + ) +``` + +Emitted when the admin updates the multiplier batch fee + +### SetVerifyBatchTimeTarget +```solidity + event SetVerifyBatchTimeTarget( + ) +``` + +Emitted when the admin updates the verify batch timeout + +### TransferGovernanceRole +```solidity + event TransferGovernanceRole( + ) +``` + +Emitted when the governance starts the two-step transfer role setting a new pending governance + +### AcceptGovernanceRole +```solidity + event AcceptGovernanceRole( + ) +``` + +Emitted when the pending Governance accepts the Governance role + diff --git a/docs/v2/PolygonZkEVMBridgeV2.md b/docs/v2/PolygonZkEVMBridgeV2.md new file mode 100644 index 000000000..6eede6797 --- /dev/null +++ b/docs/v2/PolygonZkEVMBridgeV2.md @@ -0,0 +1,364 @@ +PolygonZkEVMBridge that will be deployed on both networks Ethereum and Polygon zkEVM +Contract responsible to manage the token interactions with other networks + + +## Functions +### initialize +```solidity + function initialize( + uint32 _networkID, + contract IBasePolygonZkEVMGlobalExitRoot _globalExitRootManager, + address _polygonRollupManager + ) external +``` +The value of `_polygonRollupManager` on the L2 deployment of the contract will be address(0), so +emergency state is not possible for the L2 deployment of the bridge, intentionally + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`_networkID` | uint32 | networkID +|`_globalExitRootManager` | contract IBasePolygonZkEVMGlobalExitRoot | global exit root manager address +|`_polygonRollupManager` | address | polygonZkEVM address + + +### bridgeAsset +```solidity + function bridgeAsset( + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + address token, + bool forceUpdateGlobalExitRoot, + bytes permitData + ) public +``` +Deposit add a new leaf to the merkle tree + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`destinationNetwork` | uint32 | Network destination +|`destinationAddress` | address | Address destination +|`amount` | uint256 | Amount of tokens +|`token` | address | Token address, 0 address is reserved for ether +|`forceUpdateGlobalExitRoot` | bool | Indicates if the new global exit root is updated or not +|`permitData` | bytes | Raw data of the call `permit` of the token + +### bridgeMessage +```solidity + function bridgeMessage( + uint32 destinationNetwork, + address destinationAddress, + bool forceUpdateGlobalExitRoot, + bytes metadata + ) external +``` +Bridge message and send ETH value + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`destinationNetwork` | uint32 | Network destination +|`destinationAddress` | address | Address destination +|`forceUpdateGlobalExitRoot` | bool | Indicates if the new global exit root is updated or not +|`metadata` | bytes | Message metadata + +### claimAsset +```solidity + function claimAsset( + bytes32[32] smtProof, + uint256 globalIndex, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + uint32 originNetwork, + address originTokenAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes metadata + ) external +``` +Verify merkle proof and withdraw tokens/ether + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`smtProof` | bytes32[32] | Smt proof +|`globalIndex` | uint256 | Global index: bool(isMainnet)||uint32(indexRollupRoot)||uint32(indexDepositLeaf) +|`mainnetExitRoot` | bytes32 | Mainnet exit root +|`rollupExitRoot` | bytes32 | Rollup exit root +|`originNetwork` | uint32 | Origin network +|`originTokenAddress` | address | Origin token address, 0 address is reserved for ether +|`destinationNetwork` | uint32 | Network destination +|`destinationAddress` | address | Address destination +|`amount` | uint256 | Amount of tokens +|`metadata` | bytes | Abi encoded metadata if any, empty otherwise + +### claimMessage +```solidity + function claimMessage( + bytes32[32] smtProof, + uint256 globalIndex, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + uint32 originNetwork, + address originAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes metadata + ) external +``` +Verify merkle proof and execute message +If the receiving address is an EOA, the call will result as a success +Which means that the amount of ether will be transferred correctly, but the message +will not trigger any execution + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`smtProof` | bytes32[32] | Smt proof +|`globalIndex` | uint256 | Index of the leaf +|`mainnetExitRoot` | bytes32 | Mainnet exit root +|`rollupExitRoot` | bytes32 | Rollup exit root +|`originNetwork` | uint32 | Origin network +|`originAddress` | address | Origin address +|`destinationNetwork` | uint32 | Network destination +|`destinationAddress` | address | Address destination +|`amount` | uint256 | message value +|`metadata` | bytes | Abi encoded metadata if any, empty otherwise + +### precalculatedWrapperAddress +```solidity + function precalculatedWrapperAddress( + uint32 originNetwork, + address originTokenAddress, + string name, + string symbol, + uint8 decimals + ) external returns (address) +``` +Returns the precalculated address of a wrapper using the token information +Note Updating the metadata of a token is not supported. +Since the metadata has relevance in the address deployed, this function will not return a valid +wrapped address if the metadata provided is not the original one. + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`originNetwork` | uint32 | Origin network +|`originTokenAddress` | address | Origin token address, 0 address is reserved for ether +|`name` | string | Name of the token +|`symbol` | string | Symbol of the token +|`decimals` | uint8 | Decimals of the token + +### getTokenWrappedAddress +```solidity + function getTokenWrappedAddress( + uint32 originNetwork, + address originTokenAddress + ) external returns (address) +``` +Returns the address of a wrapper using the token information if already exist + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`originNetwork` | uint32 | Origin network +|`originTokenAddress` | address | Origin token address, 0 address is reserved for ether + +### activateEmergencyState +```solidity + function activateEmergencyState( + ) external +``` +Function to activate the emergency state + " Only can be called by the Polygon ZK-EVM in extreme situations + + + +### deactivateEmergencyState +```solidity + function deactivateEmergencyState( + ) external +``` +Function to deactivate the emergency state + " Only can be called by the Polygon ZK-EVM + + + +### _verifyLeaf +```solidity + function _verifyLeaf( + bytes32[32] smtProof, + uint256 globalIndex, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + uint32 originNetwork, + address originAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes metadata, + uint8 leafType + ) internal +``` +Verify leaf and checks that it has not been claimed + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`smtProof` | bytes32[32] | Smt proof +|`globalIndex` | uint256 | Index of the leaf +|`mainnetExitRoot` | bytes32 | Mainnet exit root +|`rollupExitRoot` | bytes32 | Rollup exit root +|`originNetwork` | uint32 | Origin network +|`originAddress` | address | Origin address +|`destinationNetwork` | uint32 | Network destination +|`destinationAddress` | address | Address destination +|`amount` | uint256 | Amount of tokens +|`metadata` | bytes | Abi encoded metadata if any, empty otherwise +|`leafType` | uint8 | Leaf type --> [0] transfer Ether / ERC20 tokens, [1] message + +### isClaimed +```solidity + function isClaimed( + uint32 index, + uint32 originNetwork + ) external returns (bool) +``` +Function to check if an index is claimed or not + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`index` | uint32 | Index +|`originNetwork` | uint32 | origin network + +### updateGlobalExitRoot +```solidity + function updateGlobalExitRoot( + ) external +``` +Function to update the globalExitRoot if the last deposit is not submitted + + + +### _updateGlobalExitRoot +```solidity + function _updateGlobalExitRoot( + ) internal +``` +Function to update the globalExitRoot + + + +### _permit +```solidity + function _permit( + address amount, + uint256 permitData + ) internal +``` +Function to call token permit method of extended ERC20 + + @param token ERC20 token address + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`amount` | address | Quantity that is expected to be allowed +|`permitData` | uint256 | Raw data of the call `permit` of the token + +### _safeSymbol +```solidity + function _safeSymbol( + address token + ) internal returns (string) +``` +Provides a safe ERC20.symbol version which returns 'NO_SYMBOL' as fallback string + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`token` | address | The address of the ERC-20 token contract + +### _safeName +```solidity + function _safeName( + address token + ) internal returns (string) +``` + Provides a safe ERC20.name version which returns 'NO_NAME' as fallback string. + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`token` | address | The address of the ERC-20 token contract. + +### _safeDecimals +```solidity + function _safeDecimals( + address token + ) internal returns (uint8) +``` +Provides a safe ERC20.decimals version which returns '18' as fallback value. +Note Tokens with (decimals > 255) are not supported + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`token` | address | The address of the ERC-20 token contract + +### _returnDataToString +```solidity + function _returnDataToString( + bytes data + ) internal returns (string) +``` +Function to convert returned data to string +returns 'NOT_VALID_ENCODING' as fallback value. + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`data` | bytes | returned data + +## Events +### BridgeEvent +```solidity + event BridgeEvent( + ) +``` + +Emitted when bridge assets or messages to another network + +### ClaimEvent +```solidity + event ClaimEvent( + ) +``` + +Emitted when a claim is done from another network + +### NewWrappedToken +```solidity + event NewWrappedToken( + ) +``` + +Emitted when a new wrapped token is created + diff --git a/docs/v2/PolygonZkEVMGlobalExitRootV2.md b/docs/v2/PolygonZkEVMGlobalExitRootV2.md index 723cbb46a..ba5867306 100644 --- a/docs/v2/PolygonZkEVMGlobalExitRootV2.md +++ b/docs/v2/PolygonZkEVMGlobalExitRootV2.md @@ -49,6 +49,15 @@ Computes and returns the merkle root +### makeHistoricGlobalExitRootSnapshot +```solidity + function makeHistoricGlobalExitRootSnapshot( + ) public +``` +Computes and returns the merkle root + + + ## Events ### UpdateGlobalExitRoot ```solidity @@ -58,3 +67,11 @@ 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/PolygonZkEVMV2.md b/docs/v2/PolygonZkEVMV2.md new file mode 100644 index 000000000..92a65a309 --- /dev/null +++ b/docs/v2/PolygonZkEVMV2.md @@ -0,0 +1,426 @@ +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 IVerifierRollup _rollupVerifier, + contract PolygonRollupManager _rollupManager + ) public +``` + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`_globalExitRootManager` | contract IPolygonZkEVMGlobalExitRoot | Global exit root manager address +|`_rollupVerifier` | contract IVerifierRollup | Rollup verifier address +|`_rollupManager` | contract PolygonRollupManager | Global exit root manager address + +### initialize +```solidity + function initialize( + address _admin, + address _trustedSequencer, + contract IERC20Upgradeable _feeToken, + string _trustedSequencerURL, + string _networkName, + string _version + ) external +``` + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`_admin` | address | Admin address +|`_trustedSequencer` | address | Trusted sequencer address +|`_feeToken` | contract IERC20Upgradeable | Fee token +|`_trustedSequencerURL` | string | Trusted sequencer URL +|`_networkName` | string | L2 network name +|`_version` | string | version + +### sequenceBatches +```solidity + function sequenceBatches( + struct PolygonZkEVMV2.BatchData[] batches, + address l2Coinbase + ) external +``` +Allows a sequencer to send multiple batches + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`batches` | struct PolygonZkEVMV2.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 + +### verifyAndRewardBatches +```solidity + function verifyAndRewardBatches( + address beneficiary, + uint64 batchesToReward + ) public +``` +Reward batches, can only be called by the rollup manager + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`beneficiary` | address | Addres htat will receive the fees +|`batchesToReward` | uint64 | Batches to reward + +### _updateBatchFee +```solidity + function _updateBatchFee( + uint64 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` | uint64 | New last verified batch + +### forceBatch +```solidity + function forceBatch( + bytes transactions, + uint256 feeTokenAmount + ) 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: +|`feeTokenAmount` | uint256 | Max amount of feeToken tokens that the sender is willing to pay + +### sequenceForceBatches +```solidity + function sequenceForceBatches( + struct PolygonZkEVMV2.BatchData[] 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 PolygonZkEVMV2.BatchData[] | 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 + +### setMultiplierBatchFee +```solidity + function setMultiplierBatchFee( + uint16 newMultiplierBatchFee + ) external +``` +Allow the admin to set a new multiplier batch fee + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`newMultiplierBatchFee` | uint16 | multiplier batch fee + +### setVerifyBatchTimeTarget +```solidity + function setVerifyBatchTimeTarget( + uint64 newVerifyBatchTimeTarget + ) external +``` +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 + +### 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 + + + +### getForcedBatchFee +```solidity + function getForcedBatchFee( + ) public returns (uint256) +``` +Get forced batch fee + + + +### calculateRewardPerBatch +```solidity + function calculateRewardPerBatch( + ) public returns (uint256) +``` +Function to calculate the reward to verify a single batch + + + +### getLastVerifiedBatch +```solidity + function getLastVerifiedBatch( + ) public returns (uint64) +``` +Get the last verified batch + + + +## 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 + +### VerifyBatchesTrustedAggregator +```solidity + event VerifyBatchesTrustedAggregator( + ) +``` + +Emitted when the trusted aggregator verifies batches + +### ConsolidatePendingState +```solidity + event ConsolidatePendingState( + ) +``` + +Emitted when pending state is consolidated + +### 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 + +### SetTrustedAggregatorTimeout +```solidity + event SetTrustedAggregatorTimeout( + ) +``` + +Emitted when the admin updates the trusted aggregator timeout + +### SetPendingStateTimeout +```solidity + event SetPendingStateTimeout( + ) +``` + +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( + ) +``` + +Emitted when the admin updates the multiplier batch fee + +### SetVerifyBatchTimeTarget +```solidity + event SetVerifyBatchTimeTarget( + ) +``` + +Emitted when the admin updates the verify batch timeout + +### 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 + +### ProveNonDeterministicPendingState +```solidity + event ProveNonDeterministicPendingState( + ) +``` + +Emitted when is proved a different state given the same batches + +### OverridePendingState +```solidity + event OverridePendingState( + ) +``` + +Emitted when the trusted aggregator overrides pending state + +### UpdateZkEVMVersion +```solidity + event UpdateZkEVMVersion( + ) +``` + +Emitted everytime the forkID is updated, this includes the first initialization of the contract +This event is intended to be emitted for every upgrade of the contract with relevant changes for the nodes + From f880a42a1708d6e7a0f4528fc3d334409ad7e6e7 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Sat, 23 Sep 2023 15:21:20 +0200 Subject: [PATCH 017/230] it does compile :D --- compiled-contracts/PolygonZkEVM.json | 41 ++-- compiled-contracts/PolygonZkEVMBridge.json | 59 ++++-- .../PolygonZkEVMBridgeMock.json | 59 ++++-- .../PolygonZkEVMGlobalExitRoot.json | 98 +++++++++- .../PolygonZkEVMGlobalExitRootMock.json | 98 +++++++++- compiled-contracts/PolygonZkEVMMock.json | 46 ++--- compiled-contracts/PolygonZkEVMTimelock.json | 4 +- .../interfaces/IPolygonZkEVMBridgeV2.sol | 6 +- contracts/lib/DepositContractLib.sol | 27 +++ contracts/v2/PolygonRollupManager.sol | 8 +- contracts/v2/PolygonZkEVMBridgeV2.sol | 185 +++++++++--------- contracts/v2/PolygonZkEVMGlobalExitRootV2.sol | 5 + contracts/v2/PolygonZkEVMV2.sol | 6 +- docs/lib/DepositContractLib.md | 18 ++ docs/v2/PolygonRollupManager.md | 2 +- docs/v2/PolygonZkEVMBridgeV2.md | 38 ++-- 16 files changed, 495 insertions(+), 205 deletions(-) diff --git a/compiled-contracts/PolygonZkEVM.json b/compiled-contracts/PolygonZkEVM.json index 981bf9bf9..6d522c51b 100644 --- a/compiled-contracts/PolygonZkEVM.json +++ b/compiled-contracts/PolygonZkEVM.json @@ -848,6 +848,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "gapLastTimestamp", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "getForcedBatchFee", @@ -1096,19 +1109,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "lastTimestamp", - "outputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "lastVerifiedBatch", @@ -1351,14 +1351,9 @@ }, { "internalType": "bytes32", - "name": "globalExitRoot", + "name": "forcedHistoricGlobalExitRoot", "type": "bytes32" }, - { - "internalType": "uint64", - "name": "timestamp", - "type": "uint64" - }, { "internalType": "uint64", "name": "minForcedTimestamp", @@ -1391,7 +1386,7 @@ }, { "internalType": "bytes32", - "name": "globalExitRoot", + "name": "forcedHistoricGlobalExitRoot", "type": "bytes32" }, { @@ -1400,7 +1395,7 @@ "type": "uint64" } ], - "internalType": "struct PolygonZkEVM.ForcedBatchData[]", + "internalType": "struct PolygonZkEVM.BatchData[]", "name": "batches", "type": "tuple[]" } @@ -1711,8 +1706,8 @@ "type": "function" } ], - "bytecode": "0x61014060405234801562000011575f80fd5b5060405162005f6438038062005f648339810160408190526200003491620000a2565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b039182166101005216610120526200012a565b6001600160a01b038116811462000083575f80fd5b50565b80516001600160401b03811681146200009d575f80fd5b919050565b5f805f805f8060c08789031215620000b8575f80fd5b8651620000c5816200006e565b6020880151909650620000d8816200006e565b6040880151909550620000eb816200006e565b6060880151909450620000fe816200006e565b92506200010e6080880162000086565b91506200011e60a0880162000086565b90509295509295509295565b60805160a05160c05160e0516101005161012051615d74620001f05f395f818161068201528181610dd3015261311d01525f81816107ee0152610da901525f81816107b401528181611d60015281816137ae0152614c0001525f818161095901528181610f45015281816111100152818161196d0152818161212e0152818161398f01526146d801525f8181610a0601528181614041015261448f01525f81816108a901528181611d2e0152818161261301528181613964015261412d0152615d745ff3fe608060405234801561000f575f80fd5b50600436106103a9575f3560e01c8063841b24d7116101ea578063c754c7ed11610114578063e7a7ed02116100a9578063f14916d611610079578063f14916d614610a68578063f2fde38b14610a7b578063f851a44014610a8e578063f8b823e414610aae575f80fd5b8063e7a7ed02146109d1578063e8bf92ed14610a01578063eaeb077b14610a28578063ed6b010414610a3b575f80fd5b8063d2e129f9116100e4578063d2e129f91461097b578063d8d1091b1461098e578063d939b315146109a1578063dbc16976146109c9575f80fd5b8063c754c7ed146108e6578063c89e42df14610912578063cfa8ed4714610925578063d02103ca14610954575f80fd5b8063a3c573eb1161018a578063b4d63f581161015a578063b4d63f581461083e578063b6b0b097146108a4578063ba58ae39146108cb578063c0ed84e0146108de575f80fd5b8063a3c573eb146107af578063ada8f919146107d6578063adc879e9146107e9578063afd23cbe14610810575f80fd5b806399f5634e116101c557806399f5634e1461076e5780639aa972a3146107765780639c9f3dfe14610789578063a066215c1461079c575f80fd5b8063841b24d7146107185780638c3d7301146107485780638da5cb5b14610750575f80fd5b80634a1a89a7116102d6578063621dd4111161026b5780637215541a1161023b5780637215541a146106565780637fcb365314610669578063831c7ead1461067d578063837a4738146106a4575f80fd5b8063621dd411146106095780636b8616ce1461061c5780636ff512cc1461063b578063715018a61461064e575f80fd5b8063542028d5116102a6578063542028d5146105de5780635e9145c9146105e65780635ec91958146105f95780636046916914610601575f80fd5b80634a1a89a71461056b5780634a910e6a1461058b5780634e4877061461059e5780635392c5e0146105b1575f80fd5b8063298789831161034c578063394218e91161031c578063394218e9146104fc578063423fa8561461050f578063456052671461052f578063458c047714610557575f80fd5b806329878983146104975780632b0006fa146104c35780632c1f816a146104d6578063383b3be8146104e9575f80fd5b80631816b7e5116103875780631816b7e51461041657806319d8ac611461042b578063220d78991461043f5780632678224714610452575f80fd5b80630a0d9fbe146103ad578063107bf28c146103e457806315064c96146103f9575b5f80fd5b606f546103c690610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6103ec610ab7565b6040516103db919061521a565b606f546104069060ff1681565b60405190151581526020016103db565b610429610424366004615233565b610b43565b005b6073546103c69067ffffffffffffffff1681565b6103ec61044d36600461526b565b610c5b565b607b546104729073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103db565b6074546104729068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104296104d13660046152cb565b610e31565b6104296104e436600461532f565b610ffb565b6104066104f73660046153a4565b611203565b61042961050a3660046153a4565b611258565b6073546103c69068010000000000000000900467ffffffffffffffff1681565b6073546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546103c69067ffffffffffffffff1681565b6079546103c69068010000000000000000900467ffffffffffffffff1681565b6104296105993660046153a4565b6113dc565b6104296105ac3660046153a4565b61148f565b6105d06105bf3660046153a4565b60756020525f908152604090205481565b6040519081526020016103db565b6103ec611613565b6104296105f4366004615428565b611620565b610429611e19565b6105d0611f18565b6104296106173660046152cb565b611f2d565b6105d061062a3660046153a4565b60716020525f908152604090205481565b610429610649366004615478565b6122ab565b610429612380565b6104296106643660046153a4565b612393565b6074546103c69067ffffffffffffffff1681565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b6106ec6106b2366004615491565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016103db565b6079546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b610429612500565b60335473ffffffffffffffffffffffffffffffffffffffff16610472565b6105d06125cc565b61042961078436600461532f565b61271f565b6104296107973660046153a4565b6127cf565b6104296107aa3660046153a4565b61294b565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104296107e4366004615478565b612a51565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b606f5461082b906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103db565b61087e61084c3660046153a4565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016103db565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104066108d9366004615491565b612b15565b6103c6612b9d565b607b546103c69074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b61042961092036600461557c565b612bf0565b606f54610472906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104296109893660046155ec565b612c7d565b61042961099c366004615697565b6131c0565b6079546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b61042961375b565b6073546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b610429610a363660046156d6565b61382f565b607b54610406907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b610429610a76366004615478565b613c1f565b610429610a89366004615478565b613cf1565b607a546104729073ffffffffffffffffffffffffffffffffffffffff1681565b6105d060705481565b60778054610ac49061571e565b80601f0160208091040260200160405190810160405280929190818152602001828054610af09061571e565b8015610b3b5780601f10610b1257610100808354040283529160200191610b3b565b820191905f5260205f20905b815481529060010190602001808311610b1e57829003601f168201915b505050505081565b607a5473ffffffffffffffffffffffffffffffffffffffff163314610b94576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff161080610bad57506103ff8161ffff16115b15610be4576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590610c8e575081155b15610cc5576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610cfc576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d0584612b15565b610d3b576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610e8e576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e9c868686868686613da5565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615610f1657607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015610f9b575f80fd5b505af1158015610fad573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611058576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61106787878787878787614160565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156110e157607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611166575f80fd5b505af1158015611178573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611246927001000000000000000000000000000000009092048116911661579c565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146112a9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156112f0576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661135f5760795467ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169082161061135f576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610c50565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461148357606f5460ff1615611444576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61144d81611203565b611483576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61148c8161458f565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146114e0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611527576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661159257607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610611592576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001610c50565b60768054610ac49061571e565b606f5460ff161561165d576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146116bd576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f8190036116f8576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611734576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f81815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b86811015611b7c575f8a8a8381811061179a5761179a6157c4565b90506020028101906117ac91906157f1565b6117b59061582d565b8051805160209091012060608201519192509067ffffffffffffffff161561192a57856117e1816158b7565b9650505f818360200151846060015160405160200161183893929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f908152607190935291205490915081146118c0576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088165f908152607160205260408082209190915560608501519085015190821691161015611924576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611a64565b6020820151158015906119ee575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af11580156119c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ec91906158dd565b155b15611a25576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611a64576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080611a97575042826040015167ffffffffffffffff16115b15611ace576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151975050508080611b74906158f4565b91505061177f565b50611b87868561579c565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115611bf0576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611bfb828561592b565b611c0f9067ffffffffffffffff168861594c565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611d0457607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611d56333083607054611d17919061595f565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692919061479c565b611d5e61487e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611dc3575f80fd5b505af1158015611dd5573d5f803e3d5ffd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611e6a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16611ec6576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f6070546064611f28919061595f565b905090565b606f5460ff1615611f6a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f908152607260205260409020600101544292611fb69278010000000000000000000000000000000000000000000000009091048116911661579c565b67ffffffffffffffff161115611ff8576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612005868661592b565b67ffffffffffffffff161115612047576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612055868686868686613da5565b61205e8461492d565b607954700100000000000000000000000000000000900467ffffffffffffffff165f0361219f57607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156120ff57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612184575f80fd5b505af1158015612196573d5f803e3d5ffd5b5050505061226d565b6121a761487e565b6079805467ffffffffffffffff16905f6121c0836158b7565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001610feb565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146122fc576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c50565b612388614b07565b6123915f614b88565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146124f8575f6123bb612b9d565b90508067ffffffffffffffff168267ffffffffffffffff161161240a576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000009091048116908316118061244f575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15612486576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916124b49162093a80911661579c565b67ffffffffffffffff1611156124f6576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61148c614bfe565b607b5473ffffffffffffffffffffffffffffffffffffffff163314612551576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015612658573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061267c91906158dd565b90505f612687612b9d565b60735467ffffffffffffffff6801000000000000000082048116916126df917001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041661592b565b6126e9919061579c565b6126f3919061592b565b67ffffffffffffffff169050805f0361270e575f9250505090565b61271881836159a3565b9250505090565b606f5460ff161561275c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61276b87878787878787614160565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16127c6614bfe565b50505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612820576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115612867576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166128ce5760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106128ce576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461299c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156129e3576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612aa2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c50565b5f67ffffffff0000000167ffffffffffffffff8316108015612b4c575067ffffffff00000001604083901c67ffffffffffffffff16105b8015612b6d575067ffffffff00000001608083901c67ffffffffffffffff16105b8015612b84575067ffffffff0000000160c083901c105b15612b9157506001919050565b505f919050565b919050565b6079545f9067ffffffffffffffff1615612bdf575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612c41576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6076612c4d8282615a03565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c50919061521a565b5f54610100900460ff1615808015612c9b57505f54600160ff909116105b80612cb45750303b158015612cb457505f5460ff166001145b612d45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612da1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b612dae6020880188615478565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612e036040880160208901615478565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055612e686080880160608901615478565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076612ef28682615a03565b506077612eff8582615a03565b5062093a80612f146060890160408a016153a4565b67ffffffffffffffff161115612f56576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f6660608801604089016153a4565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80612fc860a0890160808a016153a4565b67ffffffffffffffff16111561300a576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61301a60a08801608089016153a4565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c01000000000006978000000000000000000000000000000000000000001790556130f9614c81565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f0000000000000000000000000000000000000000000000000000000000000000858560405161314e9493929190615b62565b60405180910390a180156127c6575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561321d576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff161561325a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613295576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156132d1576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff7801000000000000000000000000000000000000000000000000820481169161331c918491700100000000000000000000000000000000900416615b99565b1115613354576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b848110156135f9575f8787838181106133b2576133b26157c4565b90506020028101906133c49190615bac565b6133cd90615bde565b9050836133d9816158b7565b825180516020918201208185015160408087015190519499509194505f9361343a9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146134c2576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f908152607160205260408120556134e660018961594c565b84036135555742607b60149054906101000a900467ffffffffffffffff168460400151613513919061579c565b67ffffffffffffffff161115613555576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806135f1906158f4565b915050613397565b50613604848461579c565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146137ac576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613811575f80fd5b505af1158015613823573d5f803e3d5ffd5b50505050612391614d20565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561388c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16156138c9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6138d2611f18565b90508181111561390e576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138883111561394a576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61398c73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308461479c565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139f6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a1a91906158dd565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16906018613a54836158b7565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051613a8b929190615c57565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303613bb9576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613c18565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613c0f9493929190615c66565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613c70576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610c50565b613cf9614b07565b73ffffffffffffffffffffffffffffffffffffffff8116613d9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401612d3c565b61148c81614b88565b5f80613daf612b9d565b905067ffffffffffffffff881615613e7e5760795467ffffffffffffffff9081169089161115613e0b576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614613e78576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50613f1e565b67ffffffffffffffff87165f90815260756020526040902054915081613ed0576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115613f1e576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611613f6b576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613f798888888689610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051613fad9190615c9b565b602060405180830381855afa158015613fc8573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613feb91906158dd565b613ff59190615cac565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161407791899190600401615cbf565b602060405180830381865afa158015614092573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140b69190615cf9565b6140ec576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614154336140fa858b61592b565b67ffffffffffffffff1661410c6125cc565b614116919061595f565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190614dae565b50505050505050505050565b5f67ffffffffffffffff88161561422c5760795467ffffffffffffffff90811690891611156141bb576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614614226576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506142c7565b5067ffffffffffffffff85165f908152607560205260409020548061427d576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff90811690871611156142c7576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff90811690881611806142f957508767ffffffffffffffff168767ffffffffffffffff1611155b80614320575060795467ffffffffffffffff68010000000000000000909104811690881611155b15614357576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f908152607860205260409020546801000000000000000090048116908616146143b9576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6143c78787878588610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516143fb9190615c9b565b602060405180830381855afa158015614416573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061443991906158dd565b6144439190615cac565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916144c591889190600401615cbf565b602060405180830381865afa1580156144e0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145049190615cf9565b61453a576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614154576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff6801000000000000000090910481169082161115806145c9575060795467ffffffffffffffff908116908216115b15614600576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b15801561472e575f80fd5b505af1158015614740573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161478f91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526148789085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614e09565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115612391576079545f906148c69068010000000000000000900467ffffffffffffffff16600161579c565b90506148d181611203565b1561148c576079545f906002906148f390849067ffffffffffffffff1661592b565b6148fd9190615d18565b614907908361579c565b905061491281611203565b15614924576149208161458f565b5050565b6149208261458f565b5f614936612b9d565b9050815f80614945848461592b565b606f5467ffffffffffffffff91821692505f91614968916101009004164261594c565b90505b8467ffffffffffffffff168467ffffffffffffffff16146149f25767ffffffffffffffff8085165f90815260726020526040902060018101549091168210156149d057600181015468010000000000000000900467ffffffffffffffff1694506149ec565b6149da868661592b565b67ffffffffffffffff169350506149f2565b5061496b565b5f6149fd848461594c565b905083811015614a5457808403600c8111614a185780614a1b565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281614a4a57614a4a615976565b0460705550614ac3565b838103600c8111614a655780614a68565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a76400000281614a9e57614a9e615976565b04905080607054670de0b6b3a76400000281614abc57614abc615976565b0460705550505b683635c9adc5dea000006070541115614ae857683635c9adc5dea000006070556127c6565b633b9aca0060705410156127c657633b9aca0060705550505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314612391576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612d3c565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015614c63575f80fd5b505af1158015614c75573d5f803e3d5ffd5b50505050612391614f14565b5f54610100900460ff16614d17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401612d3c565b61239133614b88565b606f5460ff16614d5c576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052614e049084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016147f6565b505050565b5f614e6a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16614fa69092919063ffffffff16565b805190915015614e045780806020019051810190614e889190615cf9565b614e04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401612d3c565b606f5460ff1615614f51576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b6060614fb484845f85614fbc565b949350505050565b60608247101561504e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401612d3c565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516150769190615c9b565b5f6040518083038185875af1925050503d805f81146150b0576040519150601f19603f3d011682016040523d82523d5f602084013e6150b5565b606091505b50915091506150c6878383876150d1565b979650505050505050565b606083156151665782515f0361515f5773ffffffffffffffffffffffffffffffffffffffff85163b61515f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612d3c565b5081614fb4565b614fb4838381511561517b5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3c919061521a565b5f5b838110156151c95781810151838201526020016151b1565b50505f910152565b5f81518084526151e88160208601602086016151af565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61522c60208301846151d1565b9392505050565b5f60208284031215615243575f80fd5b813561ffff8116811461522c575f80fd5b803567ffffffffffffffff81168114612b98575f80fd5b5f805f805f60a0868803121561527f575f80fd5b61528886615254565b945061529660208701615254565b94979496505050506040830135926060810135926080909101359150565b8061030081018310156152c5575f80fd5b92915050565b5f805f805f806103a087890312156152e1575f80fd5b6152ea87615254565b95506152f860208801615254565b945061530660408801615254565b935060608701359250608087013591506153238860a089016152b4565b90509295509295509295565b5f805f805f805f6103c0888a031215615346575f80fd5b61534f88615254565b965061535d60208901615254565b955061536b60408901615254565b945061537960608901615254565b93506080880135925060a088013591506153968960c08a016152b4565b905092959891949750929550565b5f602082840312156153b4575f80fd5b61522c82615254565b5f8083601f8401126153cd575f80fd5b50813567ffffffffffffffff8111156153e4575f80fd5b6020830191508360208260051b85010111156153fe575f80fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612b98575f80fd5b5f805f6040848603121561543a575f80fd5b833567ffffffffffffffff811115615450575f80fd5b61545c868287016153bd565b909450925061546f905060208501615405565b90509250925092565b5f60208284031215615488575f80fd5b61522c82615405565b5f602082840312156154a1575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126154e4575f80fd5b813567ffffffffffffffff808211156154ff576154ff6154a8565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715615545576155456154a8565b8160405283815286602085880101111561555d575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6020828403121561558c575f80fd5b813567ffffffffffffffff8111156155a2575f80fd5b614fb4848285016154d5565b5f8083601f8401126155be575f80fd5b50813567ffffffffffffffff8111156155d5575f80fd5b6020830191508360208285010111156153fe575f80fd5b5f805f805f80868803610120811215615603575f80fd5b60a0811215615610575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff80821115615635575f80fd5b6156418a838b016154d5565b955060e0890135915080821115615656575f80fd5b6156628a838b016154d5565b9450610100890135915080821115615678575f80fd5b5061568589828a016155ae565b979a9699509497509295939492505050565b5f80602083850312156156a8575f80fd5b823567ffffffffffffffff8111156156be575f80fd5b6156ca858286016153bd565b90969095509350505050565b5f805f604084860312156156e8575f80fd5b833567ffffffffffffffff8111156156fe575f80fd5b61570a868287016155ae565b909790965060209590950135949350505050565b600181811c9082168061573257607f821691505b602082108103615769577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156157bd576157bd61576f565b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112615823575f80fd5b9190910192915050565b5f6080823603121561583d575f80fd5b6040516080810167ffffffffffffffff8282108183111715615861576158616154a8565b816040528435915080821115615875575f80fd5b50615882368286016154d5565b8252506020830135602082015261589b60408401615254565b60408201526158ac60608401615254565b606082015292915050565b5f67ffffffffffffffff8083168181036158d3576158d361576f565b6001019392505050565b5f602082840312156158ed575f80fd5b5051919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036159245761592461576f565b5060010190565b67ffffffffffffffff8281168282160390808211156157bd576157bd61576f565b818103818111156152c5576152c561576f565b80820281158282048414176152c5576152c561576f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f826159b1576159b1615976565b500490565b601f821115614e04575f81815260208120601f850160051c810160208610156159dc5750805b601f850160051c820191505b818110156159fb578281556001016159e8565b505050505050565b815167ffffffffffffffff811115615a1d57615a1d6154a8565b615a3181615a2b845461571e565b846159b6565b602080601f831160018114615a83575f8415615a4d5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556159fb565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615acf57888601518255948401946001909101908401615ab0565b5085821015615b0b57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152615b8f606083018486615b1b565b9695505050505050565b808201808211156152c5576152c561576f565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112615823575f80fd5b5f60608236031215615bee575f80fd5b6040516060810167ffffffffffffffff8282108183111715615c1257615c126154a8565b816040528435915080821115615c26575f80fd5b50615c33368286016154d5565b82525060208301356020820152615c4c60408401615254565b604082015292915050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f615b8f606083018486615b1b565b5f82516158238184602087016151af565b5f82615cba57615cba615976565b500690565b6103208101610300808584378201835f5b6001811015615cef578151835260209283019290910190600101615cd0565b5050509392505050565b5f60208284031215615d09575f80fd5b8151801515811461522c575f80fd5b5f67ffffffffffffffff80841680615d3257615d32615976565b9216919091049291505056fea2646970667358221220a50e6fa85418d984e88c8f7daf5faf4ee5e483c8bc96c6d92f33fe24b3cf94f764736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106103a9575f3560e01c8063841b24d7116101ea578063c754c7ed11610114578063e7a7ed02116100a9578063f14916d611610079578063f14916d614610a68578063f2fde38b14610a7b578063f851a44014610a8e578063f8b823e414610aae575f80fd5b8063e7a7ed02146109d1578063e8bf92ed14610a01578063eaeb077b14610a28578063ed6b010414610a3b575f80fd5b8063d2e129f9116100e4578063d2e129f91461097b578063d8d1091b1461098e578063d939b315146109a1578063dbc16976146109c9575f80fd5b8063c754c7ed146108e6578063c89e42df14610912578063cfa8ed4714610925578063d02103ca14610954575f80fd5b8063a3c573eb1161018a578063b4d63f581161015a578063b4d63f581461083e578063b6b0b097146108a4578063ba58ae39146108cb578063c0ed84e0146108de575f80fd5b8063a3c573eb146107af578063ada8f919146107d6578063adc879e9146107e9578063afd23cbe14610810575f80fd5b806399f5634e116101c557806399f5634e1461076e5780639aa972a3146107765780639c9f3dfe14610789578063a066215c1461079c575f80fd5b8063841b24d7146107185780638c3d7301146107485780638da5cb5b14610750575f80fd5b80634a1a89a7116102d6578063621dd4111161026b5780637215541a1161023b5780637215541a146106565780637fcb365314610669578063831c7ead1461067d578063837a4738146106a4575f80fd5b8063621dd411146106095780636b8616ce1461061c5780636ff512cc1461063b578063715018a61461064e575f80fd5b8063542028d5116102a6578063542028d5146105de5780635e9145c9146105e65780635ec91958146105f95780636046916914610601575f80fd5b80634a1a89a71461056b5780634a910e6a1461058b5780634e4877061461059e5780635392c5e0146105b1575f80fd5b8063298789831161034c578063394218e91161031c578063394218e9146104fc578063423fa8561461050f578063456052671461052f578063458c047714610557575f80fd5b806329878983146104975780632b0006fa146104c35780632c1f816a146104d6578063383b3be8146104e9575f80fd5b80631816b7e5116103875780631816b7e51461041657806319d8ac611461042b578063220d78991461043f5780632678224714610452575f80fd5b80630a0d9fbe146103ad578063107bf28c146103e457806315064c96146103f9575b5f80fd5b606f546103c690610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6103ec610ab7565b6040516103db919061521a565b606f546104069060ff1681565b60405190151581526020016103db565b610429610424366004615233565b610b43565b005b6073546103c69067ffffffffffffffff1681565b6103ec61044d36600461526b565b610c5b565b607b546104729073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103db565b6074546104729068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104296104d13660046152cb565b610e31565b6104296104e436600461532f565b610ffb565b6104066104f73660046153a4565b611203565b61042961050a3660046153a4565b611258565b6073546103c69068010000000000000000900467ffffffffffffffff1681565b6073546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546103c69067ffffffffffffffff1681565b6079546103c69068010000000000000000900467ffffffffffffffff1681565b6104296105993660046153a4565b6113dc565b6104296105ac3660046153a4565b61148f565b6105d06105bf3660046153a4565b60756020525f908152604090205481565b6040519081526020016103db565b6103ec611613565b6104296105f4366004615428565b611620565b610429611e19565b6105d0611f18565b6104296106173660046152cb565b611f2d565b6105d061062a3660046153a4565b60716020525f908152604090205481565b610429610649366004615478565b6122ab565b610429612380565b6104296106643660046153a4565b612393565b6074546103c69067ffffffffffffffff1681565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b6106ec6106b2366004615491565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016103db565b6079546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b610429612500565b60335473ffffffffffffffffffffffffffffffffffffffff16610472565b6105d06125cc565b61042961078436600461532f565b61271f565b6104296107973660046153a4565b6127cf565b6104296107aa3660046153a4565b61294b565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104296107e4366004615478565b612a51565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b606f5461082b906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103db565b61087e61084c3660046153a4565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016103db565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104066108d9366004615491565b612b15565b6103c6612b9d565b607b546103c69074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b61042961092036600461557c565b612bf0565b606f54610472906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104296109893660046155ec565b612c7d565b61042961099c366004615697565b6131c0565b6079546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b61042961375b565b6073546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b610429610a363660046156d6565b61382f565b607b54610406907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b610429610a76366004615478565b613c1f565b610429610a89366004615478565b613cf1565b607a546104729073ffffffffffffffffffffffffffffffffffffffff1681565b6105d060705481565b60778054610ac49061571e565b80601f0160208091040260200160405190810160405280929190818152602001828054610af09061571e565b8015610b3b5780601f10610b1257610100808354040283529160200191610b3b565b820191905f5260205f20905b815481529060010190602001808311610b1e57829003601f168201915b505050505081565b607a5473ffffffffffffffffffffffffffffffffffffffff163314610b94576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff161080610bad57506103ff8161ffff16115b15610be4576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590610c8e575081155b15610cc5576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610cfc576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d0584612b15565b610d3b576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610e8e576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e9c868686868686613da5565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615610f1657607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015610f9b575f80fd5b505af1158015610fad573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611058576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61106787878787878787614160565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156110e157607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611166575f80fd5b505af1158015611178573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611246927001000000000000000000000000000000009092048116911661579c565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146112a9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156112f0576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661135f5760795467ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169082161061135f576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610c50565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461148357606f5460ff1615611444576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61144d81611203565b611483576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61148c8161458f565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146114e0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611527576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661159257607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610611592576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001610c50565b60768054610ac49061571e565b606f5460ff161561165d576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146116bd576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f8190036116f8576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611734576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f81815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b86811015611b7c575f8a8a8381811061179a5761179a6157c4565b90506020028101906117ac91906157f1565b6117b59061582d565b8051805160209091012060608201519192509067ffffffffffffffff161561192a57856117e1816158b7565b9650505f818360200151846060015160405160200161183893929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f908152607190935291205490915081146118c0576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088165f908152607160205260408082209190915560608501519085015190821691161015611924576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611a64565b6020820151158015906119ee575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af11580156119c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ec91906158dd565b155b15611a25576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611a64576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080611a97575042826040015167ffffffffffffffff16115b15611ace576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151975050508080611b74906158f4565b91505061177f565b50611b87868561579c565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115611bf0576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611bfb828561592b565b611c0f9067ffffffffffffffff168861594c565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611d0457607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611d56333083607054611d17919061595f565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692919061479c565b611d5e61487e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611dc3575f80fd5b505af1158015611dd5573d5f803e3d5ffd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611e6a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16611ec6576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f6070546064611f28919061595f565b905090565b606f5460ff1615611f6a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f908152607260205260409020600101544292611fb69278010000000000000000000000000000000000000000000000009091048116911661579c565b67ffffffffffffffff161115611ff8576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612005868661592b565b67ffffffffffffffff161115612047576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612055868686868686613da5565b61205e8461492d565b607954700100000000000000000000000000000000900467ffffffffffffffff165f0361219f57607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156120ff57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612184575f80fd5b505af1158015612196573d5f803e3d5ffd5b5050505061226d565b6121a761487e565b6079805467ffffffffffffffff16905f6121c0836158b7565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001610feb565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146122fc576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c50565b612388614b07565b6123915f614b88565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146124f8575f6123bb612b9d565b90508067ffffffffffffffff168267ffffffffffffffff161161240a576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000009091048116908316118061244f575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15612486576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916124b49162093a80911661579c565b67ffffffffffffffff1611156124f6576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61148c614bfe565b607b5473ffffffffffffffffffffffffffffffffffffffff163314612551576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015612658573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061267c91906158dd565b90505f612687612b9d565b60735467ffffffffffffffff6801000000000000000082048116916126df917001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041661592b565b6126e9919061579c565b6126f3919061592b565b67ffffffffffffffff169050805f0361270e575f9250505090565b61271881836159a3565b9250505090565b606f5460ff161561275c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61276b87878787878787614160565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16127c6614bfe565b50505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612820576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115612867576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166128ce5760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106128ce576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461299c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156129e3576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612aa2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c50565b5f67ffffffff0000000167ffffffffffffffff8316108015612b4c575067ffffffff00000001604083901c67ffffffffffffffff16105b8015612b6d575067ffffffff00000001608083901c67ffffffffffffffff16105b8015612b84575067ffffffff0000000160c083901c105b15612b9157506001919050565b505f919050565b919050565b6079545f9067ffffffffffffffff1615612bdf575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612c41576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6076612c4d8282615a03565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c50919061521a565b5f54610100900460ff1615808015612c9b57505f54600160ff909116105b80612cb45750303b158015612cb457505f5460ff166001145b612d45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612da1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b612dae6020880188615478565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612e036040880160208901615478565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055612e686080880160608901615478565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076612ef28682615a03565b506077612eff8582615a03565b5062093a80612f146060890160408a016153a4565b67ffffffffffffffff161115612f56576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f6660608801604089016153a4565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80612fc860a0890160808a016153a4565b67ffffffffffffffff16111561300a576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61301a60a08801608089016153a4565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c01000000000006978000000000000000000000000000000000000000001790556130f9614c81565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f0000000000000000000000000000000000000000000000000000000000000000858560405161314e9493929190615b62565b60405180910390a180156127c6575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561321d576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff161561325a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613295576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156132d1576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff7801000000000000000000000000000000000000000000000000820481169161331c918491700100000000000000000000000000000000900416615b99565b1115613354576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b848110156135f9575f8787838181106133b2576133b26157c4565b90506020028101906133c49190615bac565b6133cd90615bde565b9050836133d9816158b7565b825180516020918201208185015160408087015190519499509194505f9361343a9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146134c2576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f908152607160205260408120556134e660018961594c565b84036135555742607b60149054906101000a900467ffffffffffffffff168460400151613513919061579c565b67ffffffffffffffff161115613555576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806135f1906158f4565b915050613397565b50613604848461579c565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146137ac576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613811575f80fd5b505af1158015613823573d5f803e3d5ffd5b50505050612391614d20565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561388c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16156138c9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6138d2611f18565b90508181111561390e576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138883111561394a576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61398c73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308461479c565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139f6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a1a91906158dd565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16906018613a54836158b7565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051613a8b929190615c57565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303613bb9576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613c18565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613c0f9493929190615c66565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613c70576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610c50565b613cf9614b07565b73ffffffffffffffffffffffffffffffffffffffff8116613d9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401612d3c565b61148c81614b88565b5f80613daf612b9d565b905067ffffffffffffffff881615613e7e5760795467ffffffffffffffff9081169089161115613e0b576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614613e78576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50613f1e565b67ffffffffffffffff87165f90815260756020526040902054915081613ed0576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115613f1e576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611613f6b576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613f798888888689610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051613fad9190615c9b565b602060405180830381855afa158015613fc8573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613feb91906158dd565b613ff59190615cac565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161407791899190600401615cbf565b602060405180830381865afa158015614092573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140b69190615cf9565b6140ec576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614154336140fa858b61592b565b67ffffffffffffffff1661410c6125cc565b614116919061595f565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190614dae565b50505050505050505050565b5f67ffffffffffffffff88161561422c5760795467ffffffffffffffff90811690891611156141bb576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614614226576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506142c7565b5067ffffffffffffffff85165f908152607560205260409020548061427d576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff90811690871611156142c7576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff90811690881611806142f957508767ffffffffffffffff168767ffffffffffffffff1611155b80614320575060795467ffffffffffffffff68010000000000000000909104811690881611155b15614357576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f908152607860205260409020546801000000000000000090048116908616146143b9576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6143c78787878588610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516143fb9190615c9b565b602060405180830381855afa158015614416573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061443991906158dd565b6144439190615cac565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916144c591889190600401615cbf565b602060405180830381865afa1580156144e0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145049190615cf9565b61453a576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614154576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff6801000000000000000090910481169082161115806145c9575060795467ffffffffffffffff908116908216115b15614600576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b15801561472e575f80fd5b505af1158015614740573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161478f91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526148789085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614e09565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115612391576079545f906148c69068010000000000000000900467ffffffffffffffff16600161579c565b90506148d181611203565b1561148c576079545f906002906148f390849067ffffffffffffffff1661592b565b6148fd9190615d18565b614907908361579c565b905061491281611203565b15614924576149208161458f565b5050565b6149208261458f565b5f614936612b9d565b9050815f80614945848461592b565b606f5467ffffffffffffffff91821692505f91614968916101009004164261594c565b90505b8467ffffffffffffffff168467ffffffffffffffff16146149f25767ffffffffffffffff8085165f90815260726020526040902060018101549091168210156149d057600181015468010000000000000000900467ffffffffffffffff1694506149ec565b6149da868661592b565b67ffffffffffffffff169350506149f2565b5061496b565b5f6149fd848461594c565b905083811015614a5457808403600c8111614a185780614a1b565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281614a4a57614a4a615976565b0460705550614ac3565b838103600c8111614a655780614a68565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a76400000281614a9e57614a9e615976565b04905080607054670de0b6b3a76400000281614abc57614abc615976565b0460705550505b683635c9adc5dea000006070541115614ae857683635c9adc5dea000006070556127c6565b633b9aca0060705410156127c657633b9aca0060705550505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314612391576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612d3c565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015614c63575f80fd5b505af1158015614c75573d5f803e3d5ffd5b50505050612391614f14565b5f54610100900460ff16614d17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401612d3c565b61239133614b88565b606f5460ff16614d5c576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052614e049084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016147f6565b505050565b5f614e6a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16614fa69092919063ffffffff16565b805190915015614e045780806020019051810190614e889190615cf9565b614e04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401612d3c565b606f5460ff1615614f51576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b6060614fb484845f85614fbc565b949350505050565b60608247101561504e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401612d3c565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516150769190615c9b565b5f6040518083038185875af1925050503d805f81146150b0576040519150601f19603f3d011682016040523d82523d5f602084013e6150b5565b606091505b50915091506150c6878383876150d1565b979650505050505050565b606083156151665782515f0361515f5773ffffffffffffffffffffffffffffffffffffffff85163b61515f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612d3c565b5081614fb4565b614fb4838381511561517b5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3c919061521a565b5f5b838110156151c95781810151838201526020016151b1565b50505f910152565b5f81518084526151e88160208601602086016151af565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61522c60208301846151d1565b9392505050565b5f60208284031215615243575f80fd5b813561ffff8116811461522c575f80fd5b803567ffffffffffffffff81168114612b98575f80fd5b5f805f805f60a0868803121561527f575f80fd5b61528886615254565b945061529660208701615254565b94979496505050506040830135926060810135926080909101359150565b8061030081018310156152c5575f80fd5b92915050565b5f805f805f806103a087890312156152e1575f80fd5b6152ea87615254565b95506152f860208801615254565b945061530660408801615254565b935060608701359250608087013591506153238860a089016152b4565b90509295509295509295565b5f805f805f805f6103c0888a031215615346575f80fd5b61534f88615254565b965061535d60208901615254565b955061536b60408901615254565b945061537960608901615254565b93506080880135925060a088013591506153968960c08a016152b4565b905092959891949750929550565b5f602082840312156153b4575f80fd5b61522c82615254565b5f8083601f8401126153cd575f80fd5b50813567ffffffffffffffff8111156153e4575f80fd5b6020830191508360208260051b85010111156153fe575f80fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612b98575f80fd5b5f805f6040848603121561543a575f80fd5b833567ffffffffffffffff811115615450575f80fd5b61545c868287016153bd565b909450925061546f905060208501615405565b90509250925092565b5f60208284031215615488575f80fd5b61522c82615405565b5f602082840312156154a1575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126154e4575f80fd5b813567ffffffffffffffff808211156154ff576154ff6154a8565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715615545576155456154a8565b8160405283815286602085880101111561555d575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6020828403121561558c575f80fd5b813567ffffffffffffffff8111156155a2575f80fd5b614fb4848285016154d5565b5f8083601f8401126155be575f80fd5b50813567ffffffffffffffff8111156155d5575f80fd5b6020830191508360208285010111156153fe575f80fd5b5f805f805f80868803610120811215615603575f80fd5b60a0811215615610575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff80821115615635575f80fd5b6156418a838b016154d5565b955060e0890135915080821115615656575f80fd5b6156628a838b016154d5565b9450610100890135915080821115615678575f80fd5b5061568589828a016155ae565b979a9699509497509295939492505050565b5f80602083850312156156a8575f80fd5b823567ffffffffffffffff8111156156be575f80fd5b6156ca858286016153bd565b90969095509350505050565b5f805f604084860312156156e8575f80fd5b833567ffffffffffffffff8111156156fe575f80fd5b61570a868287016155ae565b909790965060209590950135949350505050565b600181811c9082168061573257607f821691505b602082108103615769577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156157bd576157bd61576f565b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112615823575f80fd5b9190910192915050565b5f6080823603121561583d575f80fd5b6040516080810167ffffffffffffffff8282108183111715615861576158616154a8565b816040528435915080821115615875575f80fd5b50615882368286016154d5565b8252506020830135602082015261589b60408401615254565b60408201526158ac60608401615254565b606082015292915050565b5f67ffffffffffffffff8083168181036158d3576158d361576f565b6001019392505050565b5f602082840312156158ed575f80fd5b5051919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036159245761592461576f565b5060010190565b67ffffffffffffffff8281168282160390808211156157bd576157bd61576f565b818103818111156152c5576152c561576f565b80820281158282048414176152c5576152c561576f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f826159b1576159b1615976565b500490565b601f821115614e04575f81815260208120601f850160051c810160208610156159dc5750805b601f850160051c820191505b818110156159fb578281556001016159e8565b505050505050565b815167ffffffffffffffff811115615a1d57615a1d6154a8565b615a3181615a2b845461571e565b846159b6565b602080601f831160018114615a83575f8415615a4d5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556159fb565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615acf57888601518255948401946001909101908401615ab0565b5085821015615b0b57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152615b8f606083018486615b1b565b9695505050505050565b808201808211156152c5576152c561576f565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112615823575f80fd5b5f60608236031215615bee575f80fd5b6040516060810167ffffffffffffffff8282108183111715615c1257615c126154a8565b816040528435915080821115615c26575f80fd5b50615c33368286016154d5565b82525060208301356020820152615c4c60408401615254565b604082015292915050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f615b8f606083018486615b1b565b5f82516158238184602087016151af565b5f82615cba57615cba615976565b500690565b6103208101610300808584378201835f5b6001811015615cef578151835260209283019290910190600101615cd0565b5050509392505050565b5f60208284031215615d09575f80fd5b8151801515811461522c575f80fd5b5f67ffffffffffffffff80841680615d3257615d32615976565b9216919091049291505056fea2646970667358221220a50e6fa85418d984e88c8f7daf5faf4ee5e483c8bc96c6d92f33fe24b3cf94f764736f6c63430008140033", + "bytecode": "0x61014060405234801562000011575f80fd5b5060405162005e7f38038062005e7f8339810160408190526200003491620000a2565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b039182166101005216610120526200012a565b6001600160a01b038116811462000083575f80fd5b50565b80516001600160401b03811681146200009d575f80fd5b919050565b5f805f805f8060c08789031215620000b8575f80fd5b8651620000c5816200006e565b6020880151909650620000d8816200006e565b6040880151909550620000eb816200006e565b6060880151909450620000fe816200006e565b92506200010e6080880162000086565b91506200011e60a0880162000086565b90509295509295509295565b60805160a05160c05160e0516101005161012051615c8f620001f05f395f818161066f01528181610dd301526130d801525f81816107db0152610da901525f81816107a1015281816124ba0152818161376a0152614ada01525f818161095901528181610f450152818161111001528181611935015281816125360152818161394b015261469401525f8181610a0601528181613ffd015261444b01525f818161089601528181611e1a01528181612ae70152818161392001526140e90152615c8f5ff3fe608060405234801561000f575f80fd5b50600436106103a9575f3560e01c80638c3d7301116101ea578063c754c7ed11610114578063e7a7ed02116100a9578063f14916d611610079578063f14916d614610a68578063f2fde38b14610a7b578063f851a44014610a8e578063f8b823e414610aae575f80fd5b8063e7a7ed02146109d1578063e8bf92ed14610a01578063eaeb077b14610a28578063ed6b010414610a3b575f80fd5b8063d2e129f9116100e4578063d2e129f91461097b578063d8d1091b1461098e578063d939b315146109a1578063dbc16976146109c9575f80fd5b8063c754c7ed146108e6578063c89e42df14610912578063cfa8ed4714610925578063d02103ca14610954575f80fd5b8063ada8f9191161018a578063b6b0b0971161015a578063b6b0b09714610891578063ba58ae39146108b8578063c00e0dc9146108cb578063c0ed84e0146108de575f80fd5b8063ada8f919146107c3578063adc879e9146107d6578063afd23cbe146107fd578063b4d63f581461082b575f80fd5b80639aa972a3116101c55780639aa972a3146107635780639c9f3dfe14610776578063a066215c14610789578063a3c573eb1461079c575f80fd5b80638c3d7301146107355780638da5cb5b1461073d57806399f5634e1461075b575f80fd5b80634a1a89a7116102d65780636b8616ce1161026b5780637fcb36531161023b5780637fcb365314610656578063831c7ead1461066a578063837a473814610691578063841b24d714610705575f80fd5b80636b8616ce146106095780636ff512cc14610628578063715018a61461063b5780637215541a14610643575f80fd5b8063542028d5116102a6578063542028d5146105de5780635ec91958146105e657806360469169146105ee578063621dd411146105f6575f80fd5b80634a1a89a71461056b5780634a910e6a1461058b5780634e4877061461059e5780635392c5e0146105b1575f80fd5b80632a9f208f1161034c578063394218e91161031c578063394218e9146104fc578063423fa8561461050f578063456052671461052f578063458c047714610557575f80fd5b80632a9f208f146104af5780632b0006fa146104c35780632c1f816a146104d6578063383b3be8146104e9575f80fd5b80631816b7e5116103875780631816b7e514610416578063220d78991461042b578063267822471461043e5780632987898314610483575f80fd5b80630a0d9fbe146103ad578063107bf28c146103e457806315064c96146103f9575b5f80fd5b606f546103c690610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6103ec610ab7565b6040516103db91906151d6565b606f546104069060ff1681565b60405190151581526020016103db565b6104296104243660046151ef565b610b43565b005b6103ec610439366004615227565b610c5b565b607b5461045e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103db565b60745461045e9068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6073546103c69067ffffffffffffffff1681565b6104296104d1366004615287565b610e31565b6104296104e43660046152eb565b610ffb565b6104066104f7366004615360565b611203565b61042961050a366004615360565b611258565b6073546103c69068010000000000000000900467ffffffffffffffff1681565b6073546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546103c69067ffffffffffffffff1681565b6079546103c69068010000000000000000900467ffffffffffffffff1681565b610429610599366004615360565b6113dc565b6104296105ac366004615360565b61148f565b6105d06105bf366004615360565b60756020525f908152604090205481565b6040519081526020016103db565b6103ec611613565b610429611620565b6105d061171f565b610429610604366004615287565b611734565b6105d0610617366004615360565b60716020525f908152604090205481565b61042961063636600461539c565b611ab2565b610429611b87565b610429610651366004615360565b611b9a565b6074546103c69067ffffffffffffffff1681565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b6106d961069f3660046153b5565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016103db565b6079546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b610429611d07565b60335473ffffffffffffffffffffffffffffffffffffffff1661045e565b6105d0611dd3565b6104296107713660046152eb565b611f26565b610429610784366004615360565b611fd6565b610429610797366004615360565b612152565b61045e7f000000000000000000000000000000000000000000000000000000000000000081565b6104296107d136600461539c565b612258565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b606f54610818906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103db565b61086b610839366004615360565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016103db565b61045e7f000000000000000000000000000000000000000000000000000000000000000081565b6104066108c63660046153b5565b61231c565b6104296108d9366004615414565b6123a4565b6103c6612b58565b607b546103c69074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b610429610920366004615540565b612bab565b606f5461045e906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61045e7f000000000000000000000000000000000000000000000000000000000000000081565b6104296109893660046155b0565b612c38565b61042961099c36600461565b565b61317b565b6079546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b610429613717565b6073546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61045e7f000000000000000000000000000000000000000000000000000000000000000081565b610429610a3636600461569a565b6137eb565b607b54610406907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b610429610a7636600461539c565b613bdb565b610429610a8936600461539c565b613cad565b607a5461045e9073ffffffffffffffffffffffffffffffffffffffff1681565b6105d060705481565b60778054610ac4906156e2565b80601f0160208091040260200160405190810160405280929190818152602001828054610af0906156e2565b8015610b3b5780601f10610b1257610100808354040283529160200191610b3b565b820191905f5260205f20905b815481529060010190602001808311610b1e57829003601f168201915b505050505081565b607a5473ffffffffffffffffffffffffffffffffffffffff163314610b94576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff161080610bad57506103ff8161ffff16115b15610be4576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590610c8e575081155b15610cc5576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610cfc576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d058461231c565b610d3b576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610e8e576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e9c868686868686613d61565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615610f1657607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015610f9b575f80fd5b505af1158015610fad573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611058576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110678787878787878761411c565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156110e157607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611166575f80fd5b505af1158015611178573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f90815260786020526040812054909242926112469270010000000000000000000000000000000090920481169116615760565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146112a9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156112f0576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661135f5760795467ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169082161061135f576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610c50565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461148357606f5460ff1615611444576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61144d81611203565b611483576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61148c8161454b565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146114e0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611527576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661159257607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610611592576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001610c50565b60768054610ac4906156e2565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611671576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff166116cd576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f607054606461172f9190615788565b905090565b606f5460ff1615611771576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f9081526072602052604090206001015442926117bd92780100000000000000000000000000000000000000000000000090910481169116615760565b67ffffffffffffffff1611156117ff576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e861180c868661579f565b67ffffffffffffffff16111561184e576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61185c868686868686613d61565b61186584614758565b607954700100000000000000000000000000000000900467ffffffffffffffff165f036119a657607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f908152607560205260409020839055607954161561190657607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b15801561198b575f80fd5b505af115801561199d573d5f803e3d5ffd5b50505050611a74565b6119ae614932565b6079805467ffffffffffffffff16905f6119c7836157c0565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001610feb565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611b03576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c50565b611b8f6149e1565b611b985f614a62565b565b60335473ffffffffffffffffffffffffffffffffffffffff163314611cff575f611bc2612b58565b90508067ffffffffffffffff168267ffffffffffffffff1611611c11576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000090910481169083161180611c56575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15611c8d576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f908152607260205260409020600101544291611cbb9162093a809116615760565b67ffffffffffffffff161115611cfd576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61148c614ad8565b607b5473ffffffffffffffffffffffffffffffffffffffff163314611d58576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611e5f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e8391906157e6565b90505f611e8e612b58565b60735467ffffffffffffffff680100000000000000008204811691611ee6917001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041661579f565b611ef09190615760565b611efa919061579f565b67ffffffffffffffff169050805f03611f15575f9250505090565b611f1f818361582a565b9250505090565b606f5460ff1615611f63576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f728787878787878761411c565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1611fcd614ad8565b50505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612027576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561206e576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166120d55760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106120d5576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146121a3576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156121ea576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146122a9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c50565b5f67ffffffff0000000167ffffffffffffffff8316108015612353575067ffffffff00000001604083901c67ffffffffffffffff16105b8015612374575067ffffffff00000001608083901c67ffffffffffffffff16105b801561238b575067ffffffff0000000160c083901c105b1561239857506001919050565b505f919050565b919050565b606f5460ff16156123e1576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314612441576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361247c576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156124b8576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561251d575f80fd5b505af115801561252f573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561259d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125c191906157e6565b60735467ffffffffffffffff68010000000000000000820481165f818152607260205260408120549495504294919370010000000000000000000000000000000090049092169182905b87811015612917575f8b8b838181106126265761262661583d565b9050602002810190612638919061586a565b612641906158a6565b8051805160209091012060408201519192509067ffffffffffffffff1615612832578561266d816157c0565b9650505f81836020015184604001516040516020016126c493929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f9081526071909352912054909150811461274c576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015181519384018a905290830185905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528d901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201527f0100000000000000000000000000000000000000000000000000000000000000609c820152609d0160405160208183030381529060405280519060200120955060715f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550612902565b8151516201d4c01015612871576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018b905260c08a901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528c901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c820152609d016040516020818303038152906040528051906020012094505b5050808061290f90615932565b91505061260b565b506129228785615760565b60735490945067ffffffffffffffff78010000000000000000000000000000000000000000000000009091048116908416111561298b576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516060810182528381524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528b86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090931692909217948416830294909417905582547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169302929092179055879082811690851614612abd57612a5f828561579f565b612a739067ffffffffffffffff1682615969565b607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff88160217905590505b612b0f333083607054612ad09190615788565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190614b5b565b612b17614932565b60405167ffffffffffffffff8616907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce905f90a25050505050505050505050565b6079545f9067ffffffffffffffff1615612b9a575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612bfc576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6076612c0882826159c9565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c5091906151d6565b5f54610100900460ff1615808015612c5657505f54600160ff909116105b80612c6f5750303b158015612c6f57505f5460ff166001145b612d00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612d5c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b612d69602088018861539c565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612dbe604088016020890161539c565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055612e23608088016060890161539c565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076612ead86826159c9565b506077612eba85826159c9565b5062093a80612ecf6060890160408a01615360565b67ffffffffffffffff161115612f11576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f216060880160408901615360565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80612f8360a0890160808a01615360565b67ffffffffffffffff161115612fc5576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fd560a0880160808901615360565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c01000000000006978000000000000000000000000000000000000000001790556130b4614c3d565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f000000000000000000000000000000000000000000000000000000000000000085856040516131099493929190615b28565b60405180910390a18015611fcd575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16156131d8576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615613215576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613250576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561328c576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff780100000000000000000000000000000000000000000000000082048116916132d7918491700100000000000000000000000000000000900416615b5f565b111561330f576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b848110156135de575f87878381811061336d5761336d61583d565b905060200281019061337f919061586a565b613388906158a6565b905083613394816157c0565b825180516020918201208185015160408087015190519499509194505f936133f59386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f9081526071909352912054909150811461347d576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f908152607160205260408120556134a1600189615969565b84036135105742607b60149054906101000a900467ffffffffffffffff1684604001516134ce9190615760565b67ffffffffffffffff161115613510576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602083810151604080860151815193840189905290830185905260608084019290925260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201527f0100000000000000000000000000000000000000000000000000000000000000609c820152609d0160405160208183030381529060405280519060200120945050505080806135d690615932565b915050613352565b506135e98484615760565b6040805160608101825283815267ffffffffffffffff428116602080840191825260738054680100000000000000009081900485168688019081528589165f8181526072909552888520975188559451600190970180549151871683027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921697871697909717179095558054938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff958402959095167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff9094169390931793909317909155915192955090917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613768576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156137cd575f80fd5b505af11580156137df573d5f803e3d5ffd5b50505050611b98614cdc565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613848576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615613885576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61388e61171f565b9050818111156138ca576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115613906576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61394873ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084614b5b565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139d691906157e6565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16906018613a10836157c0565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051613a47929190615b72565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303613b75576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613bd4565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613bcb9493929190615b81565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613c2c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610c50565b613cb56149e1565b73ffffffffffffffffffffffffffffffffffffffff8116613d58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401612cf7565b61148c81614a62565b5f80613d6b612b58565b905067ffffffffffffffff881615613e3a5760795467ffffffffffffffff9081169089161115613dc7576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614613e34576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50613eda565b67ffffffffffffffff87165f90815260756020526040902054915081613e8c576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115613eda576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611613f27576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613f358888888689610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051613f699190615bb6565b602060405180830381855afa158015613f84573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613fa791906157e6565b613fb19190615bc7565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161403391899190600401615bda565b602060405180830381865afa15801561404e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140729190615c14565b6140a8576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614110336140b6858b61579f565b67ffffffffffffffff166140c8611dd3565b6140d29190615788565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190614d6a565b50505050505050505050565b5f67ffffffffffffffff8816156141e85760795467ffffffffffffffff9081169089161115614177576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f9081526078602052604090206002810154815490928881166801000000000000000090920416146141e2576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614283565b5067ffffffffffffffff85165f9081526075602052604090205480614239576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff9081169087161115614283576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff90811690881611806142b557508767ffffffffffffffff168767ffffffffffffffff1611155b806142dc575060795467ffffffffffffffff68010000000000000000909104811690881611155b15614313576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f90815260786020526040902054680100000000000000009004811690861614614375576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6143838787878588610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516143b79190615bb6565b602060405180830381855afa1580156143d2573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906143f591906157e6565b6143ff9190615bc7565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161448191889190600401615bda565b602060405180830381865afa15801561449c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144c09190615c14565b6144f6576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614110576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff680100000000000000009091048116908216111580614585575060795467ffffffffffffffff908116908216115b156145bc576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b1580156146ea575f80fd5b505af11580156146fc573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161474b91815260200190565b60405180910390a3505050565b5f614761612b58565b9050815f80614770848461579f565b606f5467ffffffffffffffff91821692505f916147939161010090041642615969565b90505b8467ffffffffffffffff168467ffffffffffffffff161461481d5767ffffffffffffffff8085165f90815260726020526040902060018101549091168210156147fb57600181015468010000000000000000900467ffffffffffffffff169450614817565b614805868661579f565b67ffffffffffffffff1693505061481d565b50614796565b5f6148288484615969565b90508381101561487f57808403600c81116148435780614846565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281614875576148756157fd565b04607055506148ee565b838103600c81116148905780614893565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a764000002816148c9576148c96157fd565b04905080607054670de0b6b3a764000002816148e7576148e76157fd565b0460705550505b683635c9adc5dea00000607054111561491357683635c9adc5dea00000607055611fcd565b633b9aca006070541015611fcd57633b9aca0060705550505050505050565b60795467ffffffffffffffff680100000000000000008204811691161115611b98576079545f9061497a9068010000000000000000900467ffffffffffffffff166001615760565b905061498581611203565b1561148c576079545f906002906149a790849067ffffffffffffffff1661579f565b6149b19190615c33565b6149bb9083615760565b90506149c681611203565b156149d8576149d48161454b565b5050565b6149d48261454b565b60335473ffffffffffffffffffffffffffffffffffffffff163314611b98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612cf7565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015614b3d575f80fd5b505af1158015614b4f573d5f803e3d5ffd5b50505050611b98614dc5565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052614c379085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614e57565b50505050565b5f54610100900460ff16614cd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401612cf7565b611b9833614a62565b606f5460ff16614d18576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052614dc09084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401614bb5565b505050565b606f5460ff1615614e02576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f614eb8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16614f629092919063ffffffff16565b805190915015614dc05780806020019051810190614ed69190615c14565b614dc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401612cf7565b6060614f7084845f85614f78565b949350505050565b60608247101561500a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401612cf7565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516150329190615bb6565b5f6040518083038185875af1925050503d805f811461506c576040519150601f19603f3d011682016040523d82523d5f602084013e615071565b606091505b50915091506150828783838761508d565b979650505050505050565b606083156151225782515f0361511b5773ffffffffffffffffffffffffffffffffffffffff85163b61511b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612cf7565b5081614f70565b614f7083838151156151375781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf791906151d6565b5f5b8381101561518557818101518382015260200161516d565b50505f910152565b5f81518084526151a481602086016020860161516b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6151e8602083018461518d565b9392505050565b5f602082840312156151ff575f80fd5b813561ffff811681146151e8575f80fd5b803567ffffffffffffffff8116811461239f575f80fd5b5f805f805f60a0868803121561523b575f80fd5b61524486615210565b945061525260208701615210565b94979496505050506040830135926060810135926080909101359150565b806103008101831015615281575f80fd5b92915050565b5f805f805f806103a0878903121561529d575f80fd5b6152a687615210565b95506152b460208801615210565b94506152c260408801615210565b935060608701359250608087013591506152df8860a08901615270565b90509295509295509295565b5f805f805f805f6103c0888a031215615302575f80fd5b61530b88615210565b965061531960208901615210565b955061532760408901615210565b945061533560608901615210565b93506080880135925060a088013591506153528960c08a01615270565b905092959891949750929550565b5f60208284031215615370575f80fd5b6151e882615210565b803573ffffffffffffffffffffffffffffffffffffffff8116811461239f575f80fd5b5f602082840312156153ac575f80fd5b6151e882615379565b5f602082840312156153c5575f80fd5b5035919050565b5f8083601f8401126153dc575f80fd5b50813567ffffffffffffffff8111156153f3575f80fd5b6020830191508360208260051b850101111561540d575f80fd5b9250929050565b5f805f60408486031215615426575f80fd5b833567ffffffffffffffff81111561543c575f80fd5b615448868287016153cc565b909450925061545b905060208501615379565b90509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f67ffffffffffffffff808411156154ab576154ab615464565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156154f1576154f1615464565b81604052809350858152868686011115615509575f80fd5b858560208301375f602087830101525050509392505050565b5f82601f830112615531575f80fd5b6151e883833560208501615491565b5f60208284031215615550575f80fd5b813567ffffffffffffffff811115615566575f80fd5b614f7084828501615522565b5f8083601f840112615582575f80fd5b50813567ffffffffffffffff811115615599575f80fd5b60208301915083602082850101111561540d575f80fd5b5f805f805f808688036101208112156155c7575f80fd5b60a08112156155d4575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff808211156155f9575f80fd5b6156058a838b01615522565b955060e089013591508082111561561a575f80fd5b6156268a838b01615522565b945061010089013591508082111561563c575f80fd5b5061564989828a01615572565b979a9699509497509295939492505050565b5f806020838503121561566c575f80fd5b823567ffffffffffffffff811115615682575f80fd5b61568e858286016153cc565b90969095509350505050565b5f805f604084860312156156ac575f80fd5b833567ffffffffffffffff8111156156c2575f80fd5b6156ce86828701615572565b909790965060209590950135949350505050565b600181811c908216806156f657607f821691505b60208210810361572d577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff81811683821601908082111561578157615781615733565b5092915050565b808202811582820484141761528157615281615733565b67ffffffffffffffff82811682821603908082111561578157615781615733565b5f67ffffffffffffffff8083168181036157dc576157dc615733565b6001019392505050565b5f602082840312156157f6575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82615838576158386157fd565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261589c575f80fd5b9190910192915050565b5f606082360312156158b6575f80fd5b6040516060810167ffffffffffffffff82821081831117156158da576158da615464565b8160405284359150808211156158ee575f80fd5b50830136601f8201126158ff575f80fd5b61590e36823560208401615491565b8252506020830135602082015261592760408401615210565b604082015292915050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361596257615962615733565b5060010190565b8181038181111561528157615281615733565b601f821115614dc0575f81815260208120601f850160051c810160208610156159a25750805b601f850160051c820191505b818110156159c1578281556001016159ae565b505050505050565b815167ffffffffffffffff8111156159e3576159e3615464565b6159f7816159f184546156e2565b8461597c565b602080601f831160018114615a49575f8415615a135750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556159c1565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615a9557888601518255948401946001909101908401615a76565b5085821015615ad157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152615b55606083018486615ae1565b9695505050505050565b8082018082111561528157615281615733565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f615b55606083018486615ae1565b5f825161589c81846020870161516b565b5f82615bd557615bd56157fd565b500690565b6103208101610300808584378201835f5b6001811015615c0a578151835260209283019290910190600101615beb565b5050509392505050565b5f60208284031215615c24575f80fd5b815180151581146151e8575f80fd5b5f67ffffffffffffffff80841680615c4d57615c4d6157fd565b9216919091049291505056fea2646970667358221220c1bba2a12efe116e21597e182ae83c49767a70ff696b4c924eaa8a3e168619fc64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106103a9575f3560e01c80638c3d7301116101ea578063c754c7ed11610114578063e7a7ed02116100a9578063f14916d611610079578063f14916d614610a68578063f2fde38b14610a7b578063f851a44014610a8e578063f8b823e414610aae575f80fd5b8063e7a7ed02146109d1578063e8bf92ed14610a01578063eaeb077b14610a28578063ed6b010414610a3b575f80fd5b8063d2e129f9116100e4578063d2e129f91461097b578063d8d1091b1461098e578063d939b315146109a1578063dbc16976146109c9575f80fd5b8063c754c7ed146108e6578063c89e42df14610912578063cfa8ed4714610925578063d02103ca14610954575f80fd5b8063ada8f9191161018a578063b6b0b0971161015a578063b6b0b09714610891578063ba58ae39146108b8578063c00e0dc9146108cb578063c0ed84e0146108de575f80fd5b8063ada8f919146107c3578063adc879e9146107d6578063afd23cbe146107fd578063b4d63f581461082b575f80fd5b80639aa972a3116101c55780639aa972a3146107635780639c9f3dfe14610776578063a066215c14610789578063a3c573eb1461079c575f80fd5b80638c3d7301146107355780638da5cb5b1461073d57806399f5634e1461075b575f80fd5b80634a1a89a7116102d65780636b8616ce1161026b5780637fcb36531161023b5780637fcb365314610656578063831c7ead1461066a578063837a473814610691578063841b24d714610705575f80fd5b80636b8616ce146106095780636ff512cc14610628578063715018a61461063b5780637215541a14610643575f80fd5b8063542028d5116102a6578063542028d5146105de5780635ec91958146105e657806360469169146105ee578063621dd411146105f6575f80fd5b80634a1a89a71461056b5780634a910e6a1461058b5780634e4877061461059e5780635392c5e0146105b1575f80fd5b80632a9f208f1161034c578063394218e91161031c578063394218e9146104fc578063423fa8561461050f578063456052671461052f578063458c047714610557575f80fd5b80632a9f208f146104af5780632b0006fa146104c35780632c1f816a146104d6578063383b3be8146104e9575f80fd5b80631816b7e5116103875780631816b7e514610416578063220d78991461042b578063267822471461043e5780632987898314610483575f80fd5b80630a0d9fbe146103ad578063107bf28c146103e457806315064c96146103f9575b5f80fd5b606f546103c690610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6103ec610ab7565b6040516103db91906151d6565b606f546104069060ff1681565b60405190151581526020016103db565b6104296104243660046151ef565b610b43565b005b6103ec610439366004615227565b610c5b565b607b5461045e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103db565b60745461045e9068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6073546103c69067ffffffffffffffff1681565b6104296104d1366004615287565b610e31565b6104296104e43660046152eb565b610ffb565b6104066104f7366004615360565b611203565b61042961050a366004615360565b611258565b6073546103c69068010000000000000000900467ffffffffffffffff1681565b6073546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546103c69067ffffffffffffffff1681565b6079546103c69068010000000000000000900467ffffffffffffffff1681565b610429610599366004615360565b6113dc565b6104296105ac366004615360565b61148f565b6105d06105bf366004615360565b60756020525f908152604090205481565b6040519081526020016103db565b6103ec611613565b610429611620565b6105d061171f565b610429610604366004615287565b611734565b6105d0610617366004615360565b60716020525f908152604090205481565b61042961063636600461539c565b611ab2565b610429611b87565b610429610651366004615360565b611b9a565b6074546103c69067ffffffffffffffff1681565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b6106d961069f3660046153b5565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016103db565b6079546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b610429611d07565b60335473ffffffffffffffffffffffffffffffffffffffff1661045e565b6105d0611dd3565b6104296107713660046152eb565b611f26565b610429610784366004615360565b611fd6565b610429610797366004615360565b612152565b61045e7f000000000000000000000000000000000000000000000000000000000000000081565b6104296107d136600461539c565b612258565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b606f54610818906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103db565b61086b610839366004615360565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016103db565b61045e7f000000000000000000000000000000000000000000000000000000000000000081565b6104066108c63660046153b5565b61231c565b6104296108d9366004615414565b6123a4565b6103c6612b58565b607b546103c69074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b610429610920366004615540565b612bab565b606f5461045e906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61045e7f000000000000000000000000000000000000000000000000000000000000000081565b6104296109893660046155b0565b612c38565b61042961099c36600461565b565b61317b565b6079546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b610429613717565b6073546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61045e7f000000000000000000000000000000000000000000000000000000000000000081565b610429610a3636600461569a565b6137eb565b607b54610406907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b610429610a7636600461539c565b613bdb565b610429610a8936600461539c565b613cad565b607a5461045e9073ffffffffffffffffffffffffffffffffffffffff1681565b6105d060705481565b60778054610ac4906156e2565b80601f0160208091040260200160405190810160405280929190818152602001828054610af0906156e2565b8015610b3b5780601f10610b1257610100808354040283529160200191610b3b565b820191905f5260205f20905b815481529060010190602001808311610b1e57829003601f168201915b505050505081565b607a5473ffffffffffffffffffffffffffffffffffffffff163314610b94576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff161080610bad57506103ff8161ffff16115b15610be4576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590610c8e575081155b15610cc5576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610cfc576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d058461231c565b610d3b576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610e8e576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e9c868686868686613d61565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615610f1657607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015610f9b575f80fd5b505af1158015610fad573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611058576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110678787878787878761411c565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156110e157607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611166575f80fd5b505af1158015611178573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f90815260786020526040812054909242926112469270010000000000000000000000000000000090920481169116615760565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146112a9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156112f0576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661135f5760795467ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169082161061135f576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610c50565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461148357606f5460ff1615611444576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61144d81611203565b611483576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61148c8161454b565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146114e0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611527576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661159257607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610611592576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001610c50565b60768054610ac4906156e2565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611671576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff166116cd576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f607054606461172f9190615788565b905090565b606f5460ff1615611771576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f9081526072602052604090206001015442926117bd92780100000000000000000000000000000000000000000000000090910481169116615760565b67ffffffffffffffff1611156117ff576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e861180c868661579f565b67ffffffffffffffff16111561184e576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61185c868686868686613d61565b61186584614758565b607954700100000000000000000000000000000000900467ffffffffffffffff165f036119a657607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f908152607560205260409020839055607954161561190657607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b15801561198b575f80fd5b505af115801561199d573d5f803e3d5ffd5b50505050611a74565b6119ae614932565b6079805467ffffffffffffffff16905f6119c7836157c0565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001610feb565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611b03576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c50565b611b8f6149e1565b611b985f614a62565b565b60335473ffffffffffffffffffffffffffffffffffffffff163314611cff575f611bc2612b58565b90508067ffffffffffffffff168267ffffffffffffffff1611611c11576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000090910481169083161180611c56575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15611c8d576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f908152607260205260409020600101544291611cbb9162093a809116615760565b67ffffffffffffffff161115611cfd576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61148c614ad8565b607b5473ffffffffffffffffffffffffffffffffffffffff163314611d58576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611e5f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e8391906157e6565b90505f611e8e612b58565b60735467ffffffffffffffff680100000000000000008204811691611ee6917001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041661579f565b611ef09190615760565b611efa919061579f565b67ffffffffffffffff169050805f03611f15575f9250505090565b611f1f818361582a565b9250505090565b606f5460ff1615611f63576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f728787878787878761411c565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1611fcd614ad8565b50505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612027576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561206e576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166120d55760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106120d5576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146121a3576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156121ea576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146122a9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c50565b5f67ffffffff0000000167ffffffffffffffff8316108015612353575067ffffffff00000001604083901c67ffffffffffffffff16105b8015612374575067ffffffff00000001608083901c67ffffffffffffffff16105b801561238b575067ffffffff0000000160c083901c105b1561239857506001919050565b505f919050565b919050565b606f5460ff16156123e1576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314612441576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361247c576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156124b8576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561251d575f80fd5b505af115801561252f573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561259d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125c191906157e6565b60735467ffffffffffffffff68010000000000000000820481165f818152607260205260408120549495504294919370010000000000000000000000000000000090049092169182905b87811015612917575f8b8b838181106126265761262661583d565b9050602002810190612638919061586a565b612641906158a6565b8051805160209091012060408201519192509067ffffffffffffffff1615612832578561266d816157c0565b9650505f81836020015184604001516040516020016126c493929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f9081526071909352912054909150811461274c576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015181519384018a905290830185905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528d901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201527f0100000000000000000000000000000000000000000000000000000000000000609c820152609d0160405160208183030381529060405280519060200120955060715f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550612902565b8151516201d4c01015612871576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018b905260c08a901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528c901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c820152609d016040516020818303038152906040528051906020012094505b5050808061290f90615932565b91505061260b565b506129228785615760565b60735490945067ffffffffffffffff78010000000000000000000000000000000000000000000000009091048116908416111561298b576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516060810182528381524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528b86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090931692909217948416830294909417905582547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169302929092179055879082811690851614612abd57612a5f828561579f565b612a739067ffffffffffffffff1682615969565b607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff88160217905590505b612b0f333083607054612ad09190615788565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190614b5b565b612b17614932565b60405167ffffffffffffffff8616907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce905f90a25050505050505050505050565b6079545f9067ffffffffffffffff1615612b9a575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612bfc576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6076612c0882826159c9565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c5091906151d6565b5f54610100900460ff1615808015612c5657505f54600160ff909116105b80612c6f5750303b158015612c6f57505f5460ff166001145b612d00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612d5c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b612d69602088018861539c565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612dbe604088016020890161539c565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055612e23608088016060890161539c565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076612ead86826159c9565b506077612eba85826159c9565b5062093a80612ecf6060890160408a01615360565b67ffffffffffffffff161115612f11576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f216060880160408901615360565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80612f8360a0890160808a01615360565b67ffffffffffffffff161115612fc5576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fd560a0880160808901615360565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c01000000000006978000000000000000000000000000000000000000001790556130b4614c3d565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f000000000000000000000000000000000000000000000000000000000000000085856040516131099493929190615b28565b60405180910390a18015611fcd575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16156131d8576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615613215576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613250576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561328c576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff780100000000000000000000000000000000000000000000000082048116916132d7918491700100000000000000000000000000000000900416615b5f565b111561330f576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b848110156135de575f87878381811061336d5761336d61583d565b905060200281019061337f919061586a565b613388906158a6565b905083613394816157c0565b825180516020918201208185015160408087015190519499509194505f936133f59386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f9081526071909352912054909150811461347d576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f908152607160205260408120556134a1600189615969565b84036135105742607b60149054906101000a900467ffffffffffffffff1684604001516134ce9190615760565b67ffffffffffffffff161115613510576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602083810151604080860151815193840189905290830185905260608084019290925260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201527f0100000000000000000000000000000000000000000000000000000000000000609c820152609d0160405160208183030381529060405280519060200120945050505080806135d690615932565b915050613352565b506135e98484615760565b6040805160608101825283815267ffffffffffffffff428116602080840191825260738054680100000000000000009081900485168688019081528589165f8181526072909552888520975188559451600190970180549151871683027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921697871697909717179095558054938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff958402959095167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff9094169390931793909317909155915192955090917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613768576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156137cd575f80fd5b505af11580156137df573d5f803e3d5ffd5b50505050611b98614cdc565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613848576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615613885576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61388e61171f565b9050818111156138ca576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115613906576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61394873ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084614b5b565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139d691906157e6565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16906018613a10836157c0565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051613a47929190615b72565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303613b75576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613bd4565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613bcb9493929190615b81565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613c2c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610c50565b613cb56149e1565b73ffffffffffffffffffffffffffffffffffffffff8116613d58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401612cf7565b61148c81614a62565b5f80613d6b612b58565b905067ffffffffffffffff881615613e3a5760795467ffffffffffffffff9081169089161115613dc7576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614613e34576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50613eda565b67ffffffffffffffff87165f90815260756020526040902054915081613e8c576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115613eda576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611613f27576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613f358888888689610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051613f699190615bb6565b602060405180830381855afa158015613f84573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613fa791906157e6565b613fb19190615bc7565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161403391899190600401615bda565b602060405180830381865afa15801561404e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140729190615c14565b6140a8576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614110336140b6858b61579f565b67ffffffffffffffff166140c8611dd3565b6140d29190615788565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190614d6a565b50505050505050505050565b5f67ffffffffffffffff8816156141e85760795467ffffffffffffffff9081169089161115614177576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f9081526078602052604090206002810154815490928881166801000000000000000090920416146141e2576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614283565b5067ffffffffffffffff85165f9081526075602052604090205480614239576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff9081169087161115614283576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff90811690881611806142b557508767ffffffffffffffff168767ffffffffffffffff1611155b806142dc575060795467ffffffffffffffff68010000000000000000909104811690881611155b15614313576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f90815260786020526040902054680100000000000000009004811690861614614375576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6143838787878588610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516143b79190615bb6565b602060405180830381855afa1580156143d2573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906143f591906157e6565b6143ff9190615bc7565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161448191889190600401615bda565b602060405180830381865afa15801561449c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144c09190615c14565b6144f6576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614110576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff680100000000000000009091048116908216111580614585575060795467ffffffffffffffff908116908216115b156145bc576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b1580156146ea575f80fd5b505af11580156146fc573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161474b91815260200190565b60405180910390a3505050565b5f614761612b58565b9050815f80614770848461579f565b606f5467ffffffffffffffff91821692505f916147939161010090041642615969565b90505b8467ffffffffffffffff168467ffffffffffffffff161461481d5767ffffffffffffffff8085165f90815260726020526040902060018101549091168210156147fb57600181015468010000000000000000900467ffffffffffffffff169450614817565b614805868661579f565b67ffffffffffffffff1693505061481d565b50614796565b5f6148288484615969565b90508381101561487f57808403600c81116148435780614846565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281614875576148756157fd565b04607055506148ee565b838103600c81116148905780614893565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a764000002816148c9576148c96157fd565b04905080607054670de0b6b3a764000002816148e7576148e76157fd565b0460705550505b683635c9adc5dea00000607054111561491357683635c9adc5dea00000607055611fcd565b633b9aca006070541015611fcd57633b9aca0060705550505050505050565b60795467ffffffffffffffff680100000000000000008204811691161115611b98576079545f9061497a9068010000000000000000900467ffffffffffffffff166001615760565b905061498581611203565b1561148c576079545f906002906149a790849067ffffffffffffffff1661579f565b6149b19190615c33565b6149bb9083615760565b90506149c681611203565b156149d8576149d48161454b565b5050565b6149d48261454b565b60335473ffffffffffffffffffffffffffffffffffffffff163314611b98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612cf7565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015614b3d575f80fd5b505af1158015614b4f573d5f803e3d5ffd5b50505050611b98614dc5565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052614c379085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614e57565b50505050565b5f54610100900460ff16614cd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401612cf7565b611b9833614a62565b606f5460ff16614d18576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052614dc09084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401614bb5565b505050565b606f5460ff1615614e02576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f614eb8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16614f629092919063ffffffff16565b805190915015614dc05780806020019051810190614ed69190615c14565b614dc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401612cf7565b6060614f7084845f85614f78565b949350505050565b60608247101561500a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401612cf7565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516150329190615bb6565b5f6040518083038185875af1925050503d805f811461506c576040519150601f19603f3d011682016040523d82523d5f602084013e615071565b606091505b50915091506150828783838761508d565b979650505050505050565b606083156151225782515f0361511b5773ffffffffffffffffffffffffffffffffffffffff85163b61511b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612cf7565b5081614f70565b614f7083838151156151375781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf791906151d6565b5f5b8381101561518557818101518382015260200161516d565b50505f910152565b5f81518084526151a481602086016020860161516b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6151e8602083018461518d565b9392505050565b5f602082840312156151ff575f80fd5b813561ffff811681146151e8575f80fd5b803567ffffffffffffffff8116811461239f575f80fd5b5f805f805f60a0868803121561523b575f80fd5b61524486615210565b945061525260208701615210565b94979496505050506040830135926060810135926080909101359150565b806103008101831015615281575f80fd5b92915050565b5f805f805f806103a0878903121561529d575f80fd5b6152a687615210565b95506152b460208801615210565b94506152c260408801615210565b935060608701359250608087013591506152df8860a08901615270565b90509295509295509295565b5f805f805f805f6103c0888a031215615302575f80fd5b61530b88615210565b965061531960208901615210565b955061532760408901615210565b945061533560608901615210565b93506080880135925060a088013591506153528960c08a01615270565b905092959891949750929550565b5f60208284031215615370575f80fd5b6151e882615210565b803573ffffffffffffffffffffffffffffffffffffffff8116811461239f575f80fd5b5f602082840312156153ac575f80fd5b6151e882615379565b5f602082840312156153c5575f80fd5b5035919050565b5f8083601f8401126153dc575f80fd5b50813567ffffffffffffffff8111156153f3575f80fd5b6020830191508360208260051b850101111561540d575f80fd5b9250929050565b5f805f60408486031215615426575f80fd5b833567ffffffffffffffff81111561543c575f80fd5b615448868287016153cc565b909450925061545b905060208501615379565b90509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f67ffffffffffffffff808411156154ab576154ab615464565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156154f1576154f1615464565b81604052809350858152868686011115615509575f80fd5b858560208301375f602087830101525050509392505050565b5f82601f830112615531575f80fd5b6151e883833560208501615491565b5f60208284031215615550575f80fd5b813567ffffffffffffffff811115615566575f80fd5b614f7084828501615522565b5f8083601f840112615582575f80fd5b50813567ffffffffffffffff811115615599575f80fd5b60208301915083602082850101111561540d575f80fd5b5f805f805f808688036101208112156155c7575f80fd5b60a08112156155d4575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff808211156155f9575f80fd5b6156058a838b01615522565b955060e089013591508082111561561a575f80fd5b6156268a838b01615522565b945061010089013591508082111561563c575f80fd5b5061564989828a01615572565b979a9699509497509295939492505050565b5f806020838503121561566c575f80fd5b823567ffffffffffffffff811115615682575f80fd5b61568e858286016153cc565b90969095509350505050565b5f805f604084860312156156ac575f80fd5b833567ffffffffffffffff8111156156c2575f80fd5b6156ce86828701615572565b909790965060209590950135949350505050565b600181811c908216806156f657607f821691505b60208210810361572d577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff81811683821601908082111561578157615781615733565b5092915050565b808202811582820484141761528157615281615733565b67ffffffffffffffff82811682821603908082111561578157615781615733565b5f67ffffffffffffffff8083168181036157dc576157dc615733565b6001019392505050565b5f602082840312156157f6575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82615838576158386157fd565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261589c575f80fd5b9190910192915050565b5f606082360312156158b6575f80fd5b6040516060810167ffffffffffffffff82821081831117156158da576158da615464565b8160405284359150808211156158ee575f80fd5b50830136601f8201126158ff575f80fd5b61590e36823560208401615491565b8252506020830135602082015261592760408401615210565b604082015292915050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361596257615962615733565b5060010190565b8181038181111561528157615281615733565b601f821115614dc0575f81815260208120601f850160051c810160208610156159a25750805b601f850160051c820191505b818110156159c1578281556001016159ae565b505050505050565b815167ffffffffffffffff8111156159e3576159e3615464565b6159f7816159f184546156e2565b8461597c565b602080601f831160018114615a49575f8415615a135750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556159c1565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615a9557888601518255948401946001909101908401615a76565b5085821015615ad157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152615b55606083018486615ae1565b9695505050505050565b8082018082111561528157615281615733565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f615b55606083018486615ae1565b5f825161589c81846020870161516b565b5f82615bd557615bd56157fd565b500690565b6103208101610300808584378201835f5b6001811015615c0a578151835260209283019290910190600101615beb565b5050509392505050565b5f60208284031215615c24575f80fd5b815180151581146151e8575f80fd5b5f67ffffffffffffffff80841680615c4d57615c4d6157fd565b9216919091049291505056fea2646970667358221220c1bba2a12efe116e21597e182ae83c49767a70ff696b4c924eaa8a3e168619fc64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMBridge.json b/compiled-contracts/PolygonZkEVMBridge.json index da2451474..90d83ac59 100644 --- a/compiled-contracts/PolygonZkEVMBridge.json +++ b/compiled-contracts/PolygonZkEVMBridge.json @@ -304,6 +304,35 @@ "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": [ { @@ -459,19 +488,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "getDepositRoot", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -521,6 +537,19 @@ "stateMutability": "pure", "type": "function" }, + { + "inputs": [], + "name": "getRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -776,8 +805,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561000f575f80fd5b50615b1f8061001d5f395ff3fe60806040526004361062000197575f3560e01c8063647c576c11620000e2578063be5831c71162000086578063dbc16976116200005e578063dbc16976146200061a578063ee25560b1462000631578063fb5708341462000660575f80fd5b8063be5831c71462000591578063cd58657914620005cc578063d02103ca14620005e3575f80fd5b80639e34070f11620000ba5780639e34070f14620004f1578063aaa13cc21462000534578063bab161bf1462000558575f80fd5b8063647c576c146200047157806379e2cf97146200049557806381b1c17414620004ac575f80fd5b80632d2c9d94116200014a57806334ac9cf2116200012257806334ac9cf2146200033a5780633ae0504714620003685780633e197043146200037f575f80fd5b80632d2c9d9414620002695780632dfdf0b5146200028d578063318aee3d14620002b3575f80fd5b806322e95f2c116200017e57806322e95f2c14620001e4578063240ff378146200022e5780632cffd02e1462000245575f80fd5b806315064c96146200019b5780632072f6c514620001cb575b5f80fd5b348015620001a7575f80fd5b50606854620001b69060ff1681565b60405190151581526020015b60405180910390f35b348015620001d7575f80fd5b50620001e262000684565b005b348015620001f0575f80fd5b5062000208620002023660046200323f565b620006e2565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001c2565b620001e26200023f366004620032cf565b62000784565b34801562000251575f80fd5b50620001e26200026336600462003360565b620009ab565b34801562000275575f80fd5b50620001e26200028736600462003360565b62000f30565b34801562000299575f80fd5b50620002a460535481565b604051908152602001620001c2565b348015620002bf575f80fd5b5062000308620002d13660046200343e565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001c2565b34801562000346575f80fd5b50606c54620002089073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000374575f80fd5b50620002a462001130565b3480156200038b575f80fd5b50620002a46200039d36600462003472565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200047d575f80fd5b50620001e26200048f366004620034f7565b62001215565b348015620004a1575f80fd5b50620001e26200145e565b348015620004b8575f80fd5b5062000208620004ca36600462003544565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620004fd575f80fd5b50620001b66200050f36600462003544565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b34801562000540575f80fd5b5062000208620005523660046200355c565b62001498565b34801562000564575f80fd5b506068546200057b90610100900463ffffffff1681565b60405163ffffffff9091168152602001620001c2565b3480156200059d575f80fd5b506068546200057b90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001e2620005dd36600462003609565b62001682565b348015620005ef575f80fd5b50606854620002089065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000626575f80fd5b50620001e262001bd4565b3480156200063d575f80fd5b50620002a46200064f36600462003544565b60696020525f908152604090205481565b3480156200066c575f80fd5b50620001b66200067e366004620036a5565b62001c30565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006d6576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062001d18565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007c2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620007e85750600263ffffffff861610155b1562000820576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620008769998979695949392919062003736565b60405180910390a1620009936200098d6001606860019054906101000a900463ffffffff16338989348989604051620008b1929190620037b0565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001dab565b8215620009a457620009a462001ebf565b5050505050565b60685460ff1615620009e9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620009ff8b8b8b8b8b8b8b8b8b8b8b5f62001f8f565b73ffffffffffffffffffffffffffffffffffffffff861662000ad757604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a53919062003810565b5f6040518083038185875af1925050503d805f811462000a8f576040519150601f19603f3d011682016040523d82523d5f602084013e62000a94565b606091505b505090508062000ad0576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000eb8565b60685463ffffffff61010090910481169088160362000b195762000b1373ffffffffffffffffffffffffffffffffffffffff871685856200217a565b62000eb8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e2f575f808062000beb868801886200391f565b9250925092505f8584848460405162000c0490620031f8565b62000c1293929190620039db565b8190604051809103905ff590508015801562000c30573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000ca3575f80fd5b505af115801562000cb6573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e1d95949392919062003a17565b60405180910390a15050505062000eb5565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562000e9d575f80fd5b505af115801562000eb0573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000f6e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000f858b8b8b8b8b8b8b8b8b8b8b600162001f8f565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000fb7949392919062003a5e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200103a919062003810565b5f6040518083038185875af1925050503d805f811462001076576040519150601f19603f3d011682016040523d82523d5f602084013e6200107b565b606091505b5050905080620010b7576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200120c578083901c6001166001036200119d576033816020811062001169576200116962003aa5565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620011ca565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620012039062003aff565b9150506200113a565b50919392505050565b5f54610100900460ff16158080156200123457505f54600160ff909116105b806200124f5750303b1580156200124f57505f5460ff166001145b620012e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200133e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016918416919091179055620013f562002250565b801562001458575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620006e057620006e062001ebf565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b3083604051806020016200152c90620031f8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905262001577908d908d908d908d908d9060200162003b39565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052620015b5929160200162003b79565b604051602081830303815290604052805190602001206040516020016200163e94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff1615620016c0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620016ca620022f2565b60685463ffffffff888116610100909204161480620016f05750600263ffffffff881610155b1562001728576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff88166200178c5788341462001783576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f925062001a79565b3415620017c5576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620018ae576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b15801562001884575f80fd5b505af115801562001897573d5f803e3d5ffd5b5050505080602001519450805f0151935062001a77565b8515620018c357620018c3898b898962002367565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200192e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001954919062003bab565b90506200197a73ffffffffffffffffffffffffffffffffffffffff8b1633308e6200287a565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015620019e5573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001a0b919062003bab565b905062001a19828262003bc3565b6068548c9850610100900463ffffffff169650935062001a3987620028da565b62001a448c620029ee565b62001a4f8d62002af7565b60405160200162001a6393929190620039db565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e868860535460405162001aba98979695949392919062003bd9565b60405180910390a162001bac6200098d5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b861562001bbd5762001bbd62001ebf565b5050505062001bcb60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c26576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062002bf5565b5f84815b602081101562001d0a57600163ffffffff8616821c8116900362001ca65785816020811062001c675762001c6762003aa5565b60200201358260405160200162001c88929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001cf5565b8186826020811062001cbc5762001cbc62003aa5565b602002013560405160200162001cdc929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d018162003aff565b91505062001c34565b50821490505b949350505050565b60685460ff161562001d56576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001dbc6020600262003d88565b62001dc8919062003bc3565b6053541062001e03576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001e149062003aff565b918290555090505f5b602081101562001eaf578082901c60011660010362001e5557826033826020811062001e4d5762001e4d62003aa5565b015550505050565b6033816020811062001e6b5762001e6b62003aa5565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001ea69062003aff565b91505062001e1d565b5062001eba62003d95565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001f4562001130565b6040518263ffffffff1660e01b815260040162001f6491815260200190565b5f604051808303815f87803b15801562001f7c575f80fd5b505af115801562001458573d5f803e3d5ffd5b62001fa08b63ffffffff1662002c84565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af11580156200203f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002065919062003bab565b9050805f03620020a0576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8881166101009092041614620020ea576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff16620021075750896200210a565b508a5b620021336200212a848c8c8c8c8c8c8c604051620008b1929190620037b0565b8f8f8462001c30565b6200216a576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001eba9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002ce8565b5f54610100900460ff16620022e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b620006e062002dfa565b60026001540362002360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401620012d8565b6002600155565b5f62002377600482848662003dc2565b620023829162003deb565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620025fc575f808080808080620023e4896004818d62003dc2565b810190620023f3919062003e34565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002467576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff86163014620024b7576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a8514620024f1576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620025ac919062003810565b5f604051808303815f865af19150503d805f8114620025e7576040519150601f19603f3d011682016040523d82523d5f602084013e620025ec565b606091505b50505050505050505050620009a4565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002678576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806200268f8a6004818e62003dc2565b8101906200269e919062003e8a565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002714576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002764576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002828919062003810565b5f604051808303815f865af19150503d805f811462002863576040519150601f19603f3d011682016040523d82523d5f602084013e62002868565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014589085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401620021cd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff8616916200295d919062003810565b5f60405180830381855afa9150503d805f811462002997576040519150601f19603f3d011682016040523d82523d5f602084013e6200299c565b606091505b509150915081620029e3576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d10565b62001d108162002e92565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002a71919062003810565b5f60405180830381855afa9150503d805f811462002aab576040519150601f19603f3d011682016040523d82523d5f602084013e62002ab0565b606091505b509150915081620029e3576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d10565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff86169162002b79919062003810565b5f60405180830381855afa9150503d805f811462002bb3576040519150601f19603f3d011682016040523d82523d5f602084013e62002bb8565b606091505b509150915081801562002bcc575080516020145b62002bd957601262001d10565b8080602001905181019062001d10919062003f11565b60018055565b60685460ff1662002c32576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009a4576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002d4b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200307d9092919063ffffffff16565b80519091501562001eba578080602001905181019062002d6c919062003f2f565b62001eba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401620012d8565b5f54610100900460ff1662002bef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b6060604082511062002eb457818060200190518101906200077e919062003f4d565b81516020036200303f575f5b60208110801562002f0b575082818151811062002ee15762002ee162003aa5565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002f26578062002f1d8162003aff565b91505062002ec0565b805f0362002f6957505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff81111562002f865762002f86620037bf565b6040519080825280601f01601f19166020018201604052801562002fb1576020820181803683370190505b5090505f5b82811015620030375784818151811062002fd45762002fd462003aa5565b602001015160f81c60f81b82828151811062002ff45762002ff462003aa5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350806200302e8162003aff565b91505062002fb6565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d1084845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051620030b2919062003810565b5f6040518083038185875af1925050503d805f8114620030ee576040519150601f19603f3d011682016040523d82523d5f602084013e620030f3565b606091505b5091509150620031068783838762003111565b979650505050505050565b60608315620031ab5782515f03620031a35773ffffffffffffffffffffffffffffffffffffffff85163b620031a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620012d8565b508162001d10565b62001d108383815115620031c25781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620012d8919062003fc8565b611b0d8062003fdd83390190565b803563ffffffff8116811462003078575f80fd5b73ffffffffffffffffffffffffffffffffffffffff811681146200323c575f80fd5b50565b5f806040838503121562003251575f80fd5b6200325c8362003206565b915060208301356200326e816200321a565b809150509250929050565b80151581146200323c575f80fd5b5f8083601f84011262003298575f80fd5b50813567ffffffffffffffff811115620032b0575f80fd5b602083019150836020828501011115620032c8575f80fd5b9250929050565b5f805f805f60808688031215620032e4575f80fd5b620032ef8662003206565b9450602086013562003301816200321a565b93506040860135620033138162003279565b9250606086013567ffffffffffffffff8111156200332f575f80fd5b6200333d8882890162003287565b969995985093965092949392505050565b8061040081018310156200077e575f80fd5b5f805f805f805f805f805f6105208c8e0312156200337c575f80fd5b620033888d8d6200334e565b9a50620033996104008d0162003206565b99506104208c013598506104408c01359750620033ba6104608d0162003206565b96506104808c0135620033cd816200321a565b9550620033de6104a08d0162003206565b94506104c08c0135620033f1816200321a565b93506104e08c013592506105008c013567ffffffffffffffff81111562003416575f80fd5b620034248e828f0162003287565b915080935050809150509295989b509295989b9093969950565b5f602082840312156200344f575f80fd5b81356200345c816200321a565b9392505050565b60ff811681146200323c575f80fd5b5f805f805f805f60e0888a03121562003489575f80fd5b8735620034968162003463565b9650620034a66020890162003206565b95506040880135620034b8816200321a565b9450620034c86060890162003206565b93506080880135620034da816200321a565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156200350a575f80fd5b620035158462003206565b9250602084013562003527816200321a565b9150604084013562003539816200321a565b809150509250925092565b5f6020828403121562003555575f80fd5b5035919050565b5f805f805f805f60a0888a03121562003573575f80fd5b6200357e8862003206565b9650602088013562003590816200321a565b9550604088013567ffffffffffffffff80821115620035ad575f80fd5b620035bb8b838c0162003287565b909750955060608a0135915080821115620035d4575f80fd5b50620035e38a828b0162003287565b9094509250506080880135620035f98162003463565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003620575f80fd5b6200362b8862003206565b965060208801356200363d816200321a565b955060408801359450606088013562003656816200321a565b93506080880135620036688162003279565b925060a088013567ffffffffffffffff81111562003684575f80fd5b620036928a828b0162003287565b989b979a50959850939692959293505050565b5f805f806104608587031215620036ba575f80fd5b84359350620036cd86602087016200334e565b9250620036de610420860162003206565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620037968285018789620036ef565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003808578181015183820152602001620037ee565b50505f910152565b5f825162003823818460208701620037ec565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715620038775762003877620037bf565b604052919050565b5f67ffffffffffffffff8211156200389b576200389b620037bf565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112620038d7575f80fd5b8135620038ee620038e8826200387f565b6200382d565b81815284602083860101111562003903575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003932575f80fd5b833567ffffffffffffffff808211156200394a575f80fd5b6200395887838801620038c7565b945060208601359150808211156200396e575f80fd5b506200397d86828701620038c7565b9250506040840135620035398162003463565b5f8151808452620039a9816020860160208601620037ec565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f620039ef606083018662003990565b828103602084015262003a03818662003990565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff80871660208401528086166040840152506080606083015262003106608083018486620036ef565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003a9b606083018486620036ef565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003b325762003b3262003ad2565b5060010190565b606081525f62003b4e606083018789620036ef565b828103602084015262003b63818688620036ef565b91505060ff831660408301529695505050505050565b5f835162003b8c818460208801620037ec565b83519083019062003ba2818360208801620037ec565b01949350505050565b5f6020828403121562003bbc575f80fd5b5051919050565b818103818111156200077e576200077e62003ad2565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003c388285018762003990565b925080851660e085015250509998505050505050505050565b600181815b8085111562003cb057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003c945762003c9462003ad2565b8085161562003ca257918102915b93841c939080029062003c56565b509250929050565b5f8262003cc8575060016200077e565b8162003cd657505f6200077e565b816001811462003cef576002811462003cfa5762003d1a565b60019150506200077e565b60ff84111562003d0e5762003d0e62003ad2565b50506001821b6200077e565b5060208310610133831016604e8410600b841016171562003d3f575081810a6200077e565b62003d4b838362003c51565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d805762003d8062003ad2565b029392505050565b5f6200345c838362003cb8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f808585111562003dd1575f80fd5b8386111562003dde575f80fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003e2c5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562003e4b575f80fd5b873562003e58816200321a565b9650602088013562003e6a816200321a565b955060408801359450606088013593506080880135620034da8162003463565b5f805f805f805f80610100898b03121562003ea3575f80fd5b883562003eb0816200321a565b9750602089013562003ec2816200321a565b96506040890135955060608901359450608089013562003ee28162003279565b935060a089013562003ef48162003463565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562003f22575f80fd5b81516200345c8162003463565b5f6020828403121562003f40575f80fd5b81516200345c8162003279565b5f6020828403121562003f5e575f80fd5b815167ffffffffffffffff81111562003f75575f80fd5b8201601f8101841362003f86575f80fd5b805162003f97620038e8826200387f565b81815285602083850101111562003fac575f80fd5b62003fbf826020830160208601620037ec565b95945050505050565b602081525f6200345c60208301846200399056fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a2646970667358221220efc010afd4f7ef7135c2d52e7832f4d0832c536dbd0768cad0ec9406e70e02b864736f6c63430008140033", - "deployedBytecode": "0x60806040526004361062000197575f3560e01c8063647c576c11620000e2578063be5831c71162000086578063dbc16976116200005e578063dbc16976146200061a578063ee25560b1462000631578063fb5708341462000660575f80fd5b8063be5831c71462000591578063cd58657914620005cc578063d02103ca14620005e3575f80fd5b80639e34070f11620000ba5780639e34070f14620004f1578063aaa13cc21462000534578063bab161bf1462000558575f80fd5b8063647c576c146200047157806379e2cf97146200049557806381b1c17414620004ac575f80fd5b80632d2c9d94116200014a57806334ac9cf2116200012257806334ac9cf2146200033a5780633ae0504714620003685780633e197043146200037f575f80fd5b80632d2c9d9414620002695780632dfdf0b5146200028d578063318aee3d14620002b3575f80fd5b806322e95f2c116200017e57806322e95f2c14620001e4578063240ff378146200022e5780632cffd02e1462000245575f80fd5b806315064c96146200019b5780632072f6c514620001cb575b5f80fd5b348015620001a7575f80fd5b50606854620001b69060ff1681565b60405190151581526020015b60405180910390f35b348015620001d7575f80fd5b50620001e262000684565b005b348015620001f0575f80fd5b5062000208620002023660046200323f565b620006e2565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001c2565b620001e26200023f366004620032cf565b62000784565b34801562000251575f80fd5b50620001e26200026336600462003360565b620009ab565b34801562000275575f80fd5b50620001e26200028736600462003360565b62000f30565b34801562000299575f80fd5b50620002a460535481565b604051908152602001620001c2565b348015620002bf575f80fd5b5062000308620002d13660046200343e565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001c2565b34801562000346575f80fd5b50606c54620002089073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000374575f80fd5b50620002a462001130565b3480156200038b575f80fd5b50620002a46200039d36600462003472565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200047d575f80fd5b50620001e26200048f366004620034f7565b62001215565b348015620004a1575f80fd5b50620001e26200145e565b348015620004b8575f80fd5b5062000208620004ca36600462003544565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620004fd575f80fd5b50620001b66200050f36600462003544565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b34801562000540575f80fd5b5062000208620005523660046200355c565b62001498565b34801562000564575f80fd5b506068546200057b90610100900463ffffffff1681565b60405163ffffffff9091168152602001620001c2565b3480156200059d575f80fd5b506068546200057b90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001e2620005dd36600462003609565b62001682565b348015620005ef575f80fd5b50606854620002089065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000626575f80fd5b50620001e262001bd4565b3480156200063d575f80fd5b50620002a46200064f36600462003544565b60696020525f908152604090205481565b3480156200066c575f80fd5b50620001b66200067e366004620036a5565b62001c30565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006d6576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062001d18565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007c2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620007e85750600263ffffffff861610155b1562000820576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620008769998979695949392919062003736565b60405180910390a1620009936200098d6001606860019054906101000a900463ffffffff16338989348989604051620008b1929190620037b0565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001dab565b8215620009a457620009a462001ebf565b5050505050565b60685460ff1615620009e9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620009ff8b8b8b8b8b8b8b8b8b8b8b5f62001f8f565b73ffffffffffffffffffffffffffffffffffffffff861662000ad757604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a53919062003810565b5f6040518083038185875af1925050503d805f811462000a8f576040519150601f19603f3d011682016040523d82523d5f602084013e62000a94565b606091505b505090508062000ad0576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000eb8565b60685463ffffffff61010090910481169088160362000b195762000b1373ffffffffffffffffffffffffffffffffffffffff871685856200217a565b62000eb8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e2f575f808062000beb868801886200391f565b9250925092505f8584848460405162000c0490620031f8565b62000c1293929190620039db565b8190604051809103905ff590508015801562000c30573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000ca3575f80fd5b505af115801562000cb6573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e1d95949392919062003a17565b60405180910390a15050505062000eb5565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562000e9d575f80fd5b505af115801562000eb0573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000f6e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000f858b8b8b8b8b8b8b8b8b8b8b600162001f8f565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000fb7949392919062003a5e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200103a919062003810565b5f6040518083038185875af1925050503d805f811462001076576040519150601f19603f3d011682016040523d82523d5f602084013e6200107b565b606091505b5050905080620010b7576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200120c578083901c6001166001036200119d576033816020811062001169576200116962003aa5565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620011ca565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620012039062003aff565b9150506200113a565b50919392505050565b5f54610100900460ff16158080156200123457505f54600160ff909116105b806200124f5750303b1580156200124f57505f5460ff166001145b620012e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200133e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016918416919091179055620013f562002250565b801562001458575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620006e057620006e062001ebf565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b3083604051806020016200152c90620031f8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905262001577908d908d908d908d908d9060200162003b39565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052620015b5929160200162003b79565b604051602081830303815290604052805190602001206040516020016200163e94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff1615620016c0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620016ca620022f2565b60685463ffffffff888116610100909204161480620016f05750600263ffffffff881610155b1562001728576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff88166200178c5788341462001783576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f925062001a79565b3415620017c5576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620018ae576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b15801562001884575f80fd5b505af115801562001897573d5f803e3d5ffd5b5050505080602001519450805f0151935062001a77565b8515620018c357620018c3898b898962002367565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200192e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001954919062003bab565b90506200197a73ffffffffffffffffffffffffffffffffffffffff8b1633308e6200287a565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015620019e5573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001a0b919062003bab565b905062001a19828262003bc3565b6068548c9850610100900463ffffffff169650935062001a3987620028da565b62001a448c620029ee565b62001a4f8d62002af7565b60405160200162001a6393929190620039db565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e868860535460405162001aba98979695949392919062003bd9565b60405180910390a162001bac6200098d5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b861562001bbd5762001bbd62001ebf565b5050505062001bcb60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c26576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062002bf5565b5f84815b602081101562001d0a57600163ffffffff8616821c8116900362001ca65785816020811062001c675762001c6762003aa5565b60200201358260405160200162001c88929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001cf5565b8186826020811062001cbc5762001cbc62003aa5565b602002013560405160200162001cdc929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d018162003aff565b91505062001c34565b50821490505b949350505050565b60685460ff161562001d56576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001dbc6020600262003d88565b62001dc8919062003bc3565b6053541062001e03576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001e149062003aff565b918290555090505f5b602081101562001eaf578082901c60011660010362001e5557826033826020811062001e4d5762001e4d62003aa5565b015550505050565b6033816020811062001e6b5762001e6b62003aa5565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001ea69062003aff565b91505062001e1d565b5062001eba62003d95565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001f4562001130565b6040518263ffffffff1660e01b815260040162001f6491815260200190565b5f604051808303815f87803b15801562001f7c575f80fd5b505af115801562001458573d5f803e3d5ffd5b62001fa08b63ffffffff1662002c84565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af11580156200203f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002065919062003bab565b9050805f03620020a0576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8881166101009092041614620020ea576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff16620021075750896200210a565b508a5b620021336200212a848c8c8c8c8c8c8c604051620008b1929190620037b0565b8f8f8462001c30565b6200216a576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001eba9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002ce8565b5f54610100900460ff16620022e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b620006e062002dfa565b60026001540362002360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401620012d8565b6002600155565b5f62002377600482848662003dc2565b620023829162003deb565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620025fc575f808080808080620023e4896004818d62003dc2565b810190620023f3919062003e34565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002467576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff86163014620024b7576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a8514620024f1576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620025ac919062003810565b5f604051808303815f865af19150503d805f8114620025e7576040519150601f19603f3d011682016040523d82523d5f602084013e620025ec565b606091505b50505050505050505050620009a4565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002678576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806200268f8a6004818e62003dc2565b8101906200269e919062003e8a565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002714576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002764576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002828919062003810565b5f604051808303815f865af19150503d805f811462002863576040519150601f19603f3d011682016040523d82523d5f602084013e62002868565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014589085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401620021cd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff8616916200295d919062003810565b5f60405180830381855afa9150503d805f811462002997576040519150601f19603f3d011682016040523d82523d5f602084013e6200299c565b606091505b509150915081620029e3576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d10565b62001d108162002e92565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002a71919062003810565b5f60405180830381855afa9150503d805f811462002aab576040519150601f19603f3d011682016040523d82523d5f602084013e62002ab0565b606091505b509150915081620029e3576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d10565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff86169162002b79919062003810565b5f60405180830381855afa9150503d805f811462002bb3576040519150601f19603f3d011682016040523d82523d5f602084013e62002bb8565b606091505b509150915081801562002bcc575080516020145b62002bd957601262001d10565b8080602001905181019062001d10919062003f11565b60018055565b60685460ff1662002c32576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009a4576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002d4b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200307d9092919063ffffffff16565b80519091501562001eba578080602001905181019062002d6c919062003f2f565b62001eba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401620012d8565b5f54610100900460ff1662002bef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b6060604082511062002eb457818060200190518101906200077e919062003f4d565b81516020036200303f575f5b60208110801562002f0b575082818151811062002ee15762002ee162003aa5565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002f26578062002f1d8162003aff565b91505062002ec0565b805f0362002f6957505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff81111562002f865762002f86620037bf565b6040519080825280601f01601f19166020018201604052801562002fb1576020820181803683370190505b5090505f5b82811015620030375784818151811062002fd45762002fd462003aa5565b602001015160f81c60f81b82828151811062002ff45762002ff462003aa5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350806200302e8162003aff565b91505062002fb6565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d1084845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051620030b2919062003810565b5f6040518083038185875af1925050503d805f8114620030ee576040519150601f19603f3d011682016040523d82523d5f602084013e620030f3565b606091505b5091509150620031068783838762003111565b979650505050505050565b60608315620031ab5782515f03620031a35773ffffffffffffffffffffffffffffffffffffffff85163b620031a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620012d8565b508162001d10565b62001d108383815115620031c25781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620012d8919062003fc8565b611b0d8062003fdd83390190565b803563ffffffff8116811462003078575f80fd5b73ffffffffffffffffffffffffffffffffffffffff811681146200323c575f80fd5b50565b5f806040838503121562003251575f80fd5b6200325c8362003206565b915060208301356200326e816200321a565b809150509250929050565b80151581146200323c575f80fd5b5f8083601f84011262003298575f80fd5b50813567ffffffffffffffff811115620032b0575f80fd5b602083019150836020828501011115620032c8575f80fd5b9250929050565b5f805f805f60808688031215620032e4575f80fd5b620032ef8662003206565b9450602086013562003301816200321a565b93506040860135620033138162003279565b9250606086013567ffffffffffffffff8111156200332f575f80fd5b6200333d8882890162003287565b969995985093965092949392505050565b8061040081018310156200077e575f80fd5b5f805f805f805f805f805f6105208c8e0312156200337c575f80fd5b620033888d8d6200334e565b9a50620033996104008d0162003206565b99506104208c013598506104408c01359750620033ba6104608d0162003206565b96506104808c0135620033cd816200321a565b9550620033de6104a08d0162003206565b94506104c08c0135620033f1816200321a565b93506104e08c013592506105008c013567ffffffffffffffff81111562003416575f80fd5b620034248e828f0162003287565b915080935050809150509295989b509295989b9093969950565b5f602082840312156200344f575f80fd5b81356200345c816200321a565b9392505050565b60ff811681146200323c575f80fd5b5f805f805f805f60e0888a03121562003489575f80fd5b8735620034968162003463565b9650620034a66020890162003206565b95506040880135620034b8816200321a565b9450620034c86060890162003206565b93506080880135620034da816200321a565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156200350a575f80fd5b620035158462003206565b9250602084013562003527816200321a565b9150604084013562003539816200321a565b809150509250925092565b5f6020828403121562003555575f80fd5b5035919050565b5f805f805f805f60a0888a03121562003573575f80fd5b6200357e8862003206565b9650602088013562003590816200321a565b9550604088013567ffffffffffffffff80821115620035ad575f80fd5b620035bb8b838c0162003287565b909750955060608a0135915080821115620035d4575f80fd5b50620035e38a828b0162003287565b9094509250506080880135620035f98162003463565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003620575f80fd5b6200362b8862003206565b965060208801356200363d816200321a565b955060408801359450606088013562003656816200321a565b93506080880135620036688162003279565b925060a088013567ffffffffffffffff81111562003684575f80fd5b620036928a828b0162003287565b989b979a50959850939692959293505050565b5f805f806104608587031215620036ba575f80fd5b84359350620036cd86602087016200334e565b9250620036de610420860162003206565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620037968285018789620036ef565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003808578181015183820152602001620037ee565b50505f910152565b5f825162003823818460208701620037ec565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715620038775762003877620037bf565b604052919050565b5f67ffffffffffffffff8211156200389b576200389b620037bf565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112620038d7575f80fd5b8135620038ee620038e8826200387f565b6200382d565b81815284602083860101111562003903575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003932575f80fd5b833567ffffffffffffffff808211156200394a575f80fd5b6200395887838801620038c7565b945060208601359150808211156200396e575f80fd5b506200397d86828701620038c7565b9250506040840135620035398162003463565b5f8151808452620039a9816020860160208601620037ec565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f620039ef606083018662003990565b828103602084015262003a03818662003990565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff80871660208401528086166040840152506080606083015262003106608083018486620036ef565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003a9b606083018486620036ef565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003b325762003b3262003ad2565b5060010190565b606081525f62003b4e606083018789620036ef565b828103602084015262003b63818688620036ef565b91505060ff831660408301529695505050505050565b5f835162003b8c818460208801620037ec565b83519083019062003ba2818360208801620037ec565b01949350505050565b5f6020828403121562003bbc575f80fd5b5051919050565b818103818111156200077e576200077e62003ad2565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003c388285018762003990565b925080851660e085015250509998505050505050505050565b600181815b8085111562003cb057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003c945762003c9462003ad2565b8085161562003ca257918102915b93841c939080029062003c56565b509250929050565b5f8262003cc8575060016200077e565b8162003cd657505f6200077e565b816001811462003cef576002811462003cfa5762003d1a565b60019150506200077e565b60ff84111562003d0e5762003d0e62003ad2565b50506001821b6200077e565b5060208310610133831016604e8410600b841016171562003d3f575081810a6200077e565b62003d4b838362003c51565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d805762003d8062003ad2565b029392505050565b5f6200345c838362003cb8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f808585111562003dd1575f80fd5b8386111562003dde575f80fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003e2c5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562003e4b575f80fd5b873562003e58816200321a565b9650602088013562003e6a816200321a565b955060408801359450606088013593506080880135620034da8162003463565b5f805f805f805f80610100898b03121562003ea3575f80fd5b883562003eb0816200321a565b9750602089013562003ec2816200321a565b96506040890135955060608901359450608089013562003ee28162003279565b935060a089013562003ef48162003463565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562003f22575f80fd5b81516200345c8162003463565b5f6020828403121562003f40575f80fd5b81516200345c8162003279565b5f6020828403121562003f5e575f80fd5b815167ffffffffffffffff81111562003f75575f80fd5b8201601f8101841362003f86575f80fd5b805162003f97620038e8826200387f565b81815285602083850101111562003fac575f80fd5b62003fbf826020830160208601620037ec565b95945050505050565b602081525f6200345c60208301846200399056fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a2646970667358221220efc010afd4f7ef7135c2d52e7832f4d0832c536dbd0768cad0ec9406e70e02b864736f6c63430008140033", + "bytecode": "0x608060405234801561000f575f80fd5b50615c738061001d5f395ff3fe608060405260043610620001a3575f3560e01c806379e2cf9711620000e2578063be5831c71162000086578063dbc16976116200005e578063dbc16976146200064a578063ee25560b1462000661578063fb5708341462000690575f80fd5b8063be5831c714620005c1578063cd58657914620005fc578063d02103ca1462000613575f80fd5b80639e34070f11620000ba5780639e34070f1462000521578063aaa13cc21462000564578063bab161bf1462000588575f80fd5b806379e2cf9714620004a157806381b1c17414620004b857806383f2440314620004fd575f80fd5b80632dfdf0b5116200014a5780633e19704311620001225780633e19704314620003745780635ca1e1651462000466578063647c576c146200047d575f80fd5b80632dfdf0b51462000299578063318aee3d14620002bf57806334ac9cf21462000346575f80fd5b8063240ff378116200017e578063240ff378146200023a5780632cffd02e14620002515780632d2c9d941462000275575f80fd5b806315064c9614620001a75780632072f6c514620001d757806322e95f2c14620001f0575b5f80fd5b348015620001b3575f80fd5b50606854620001c29060ff1681565b60405190151581526020015b60405180910390f35b348015620001e3575f80fd5b50620001ee620006b4565b005b348015620001fc575f80fd5b50620002146200020e36600462003352565b62000712565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001ce565b620001ee6200024b366004620033e2565b620007b4565b3480156200025d575f80fd5b50620001ee6200026f36600462003473565b620009db565b34801562000281575f80fd5b50620001ee6200029336600462003473565b62000f60565b348015620002a5575f80fd5b50620002b060535481565b604051908152602001620001ce565b348015620002cb575f80fd5b5062000314620002dd36600462003551565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001ce565b34801562000352575f80fd5b50606c54620002149073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000380575f80fd5b50620002b06200039236600462003585565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b34801562000472575f80fd5b50620002b062001160565b34801562000489575f80fd5b50620001ee6200049b3660046200360a565b62001245565b348015620004ad575f80fd5b50620001ee6200148e565b348015620004c4575f80fd5b5062000214620004d636600462003657565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000509575f80fd5b50620002b06200051b3660046200366f565b620014c8565b3480156200052d575f80fd5b50620001c26200053f36600462003657565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b34801562000570575f80fd5b506200021462000582366004620036b0565b620015ab565b34801562000594575f80fd5b50606854620005ab90610100900463ffffffff1681565b60405163ffffffff9091168152602001620001ce565b348015620005cd575f80fd5b50606854620005ab90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001ee6200060d3660046200375d565b62001795565b3480156200061f575f80fd5b50606854620002149065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000656575f80fd5b50620001ee62001ce7565b3480156200066d575f80fd5b50620002b06200067f36600462003657565b60696020525f908152604090205481565b3480156200069c575f80fd5b50620001c2620006ae366004620037f9565b62001d43565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462000706576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200071062001e2b565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007f2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620008185750600263ffffffff861610155b1562000850576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620008a6999897969594939291906200388a565b60405180910390a1620009c3620009bd6001606860019054906101000a900463ffffffff16338989348989604051620008e192919062003904565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001ebe565b8215620009d457620009d462001fd2565b5050505050565b60685460ff161562000a19576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000a2f8b8b8b8b8b8b8b8b8b8b8b5f620020a2565b73ffffffffffffffffffffffffffffffffffffffff861662000b0757604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a83919062003964565b5f6040518083038185875af1925050503d805f811462000abf576040519150601f19603f3d011682016040523d82523d5f602084013e62000ac4565b606091505b505090508062000b00576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000ee8565b60685463ffffffff61010090910481169088160362000b495762000b4373ffffffffffffffffffffffffffffffffffffffff871685856200228d565b62000ee8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e5f575f808062000c1b8688018862003a73565b9250925092505f8584848460405162000c34906200330b565b62000c429392919062003b2f565b8190604051809103905ff590508015801562000c60573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000cd3575f80fd5b505af115801562000ce6573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e4d95949392919062003b6b565b60405180910390a15050505062000ee5565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562000ecd575f80fd5b505af115801562000ee0573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000f9e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000fb58b8b8b8b8b8b8b8b8b8b8b6001620020a2565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000fe7949392919062003bb2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200106a919062003964565b5f6040518083038185875af1925050503d805f8114620010a6576040519150601f19603f3d011682016040523d82523d5f602084013e620010ab565b606091505b5050905080620010e7576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200123c578083901c600116600103620011cd576033816020811062001199576200119962003bf9565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620011fa565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620012339062003c53565b9150506200116a565b50919392505050565b5f54610100900460ff16158080156200126457505f54600160ff909116105b806200127f5750303b1580156200127f57505f5460ff166001145b62001311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200136e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556200142562002363565b801562001488575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000710576200071062001fd2565b5f83815b6020811015620015a257600163ffffffff8516821c811690036200153e57848160208110620014ff57620014ff62003bf9565b60200201358260405160200162001520929190918252602082015260400190565b6040516020818303038152906040528051906020012091506200158d565b8185826020811062001554576200155462003bf9565b602002013560405160200162001574929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80620015998162003c53565b915050620014cc565b50949350505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b3083604051806020016200163f906200330b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f9091011660408190526200168a908d908d908d908d908d9060200162003c8d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052620016c8929160200162003ccd565b604051602081830303815290604052805190602001206040516020016200175194939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff1615620017d3576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620017dd62002405565b60685463ffffffff888116610100909204161480620018035750600263ffffffff881610155b156200183b576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff88166200189f5788341462001896576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f925062001b8c565b3415620018d8576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620019c1576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b15801562001997575f80fd5b505af1158015620019aa573d5f803e3d5ffd5b5050505080602001519450805f0151935062001b8a565b8515620019d657620019d6898b89896200247a565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa15801562001a41573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001a67919062003cff565b905062001a8d73ffffffffffffffffffffffffffffffffffffffff8b1633308e6200298d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa15801562001af8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001b1e919062003cff565b905062001b2c828262003d17565b6068548c9850610100900463ffffffff169650935062001b4c87620029ed565b62001b578c62002b01565b62001b628d62002c0a565b60405160200162001b769392919062003b2f565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e868860535460405162001bcd98979695949392919062003d2d565b60405180910390a162001cbf620009bd5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b861562001cd05762001cd062001fd2565b5050505062001cde60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001d39576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200071062002d08565b5f84815b602081101562001e1d57600163ffffffff8616821c8116900362001db95785816020811062001d7a5762001d7a62003bf9565b60200201358260405160200162001d9b929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001e08565b8186826020811062001dcf5762001dcf62003bf9565b602002013560405160200162001def929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001e148162003c53565b91505062001d47565b50821490505b949350505050565b60685460ff161562001e69576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001ecf6020600262003edc565b62001edb919062003d17565b6053541062001f16576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001f279062003c53565b918290555090505f5b602081101562001fc2578082901c60011660010362001f6857826033826020811062001f605762001f6062003bf9565b015550505050565b6033816020811062001f7e5762001f7e62003bf9565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001fb99062003c53565b91505062001f30565b5062001fcd62003ee9565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d6200205862001160565b6040518263ffffffff1660e01b81526004016200207791815260200190565b5f604051808303815f87803b1580156200208f575f80fd5b505af115801562001488573d5f803e3d5ffd5b620020b38b63ffffffff1662002d97565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af115801562002152573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002178919062003cff565b9050805f03620021b3576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8881166101009092041614620021fd576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff166200221a5750896200221d565b508a5b620022466200223d848c8c8c8c8c8c8c604051620008e192919062003904565b8f8f8462001d43565b6200227d576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001fcd9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002dfb565b5f54610100900460ff16620023fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001308565b6200071062002f0d565b60026001540362002473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001308565b6002600155565b5f6200248a600482848662003f16565b620024959162003f3f565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016200270f575f808080808080620024f7896004818d62003f16565b81019062002506919062003f88565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16146200257a576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff86163014620025ca576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002604576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620026bf919062003964565b5f604051808303815f865af19150503d805f8114620026fa576040519150601f19603f3d011682016040523d82523d5f602084013e620026ff565b606091505b50505050505050505050620009d4565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c00000000000000000000000000000000000000000000000000000000146200278b576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80808080808080620027a28a6004818e62003f16565b810190620027b1919062003fde565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002827576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002877576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f16916200293b919062003964565b5f604051808303815f865af19150503d805f811462002976576040519150601f19603f3d011682016040523d82523d5f602084013e6200297b565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014889085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401620022e0565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002a70919062003964565b5f60405180830381855afa9150503d805f811462002aaa576040519150601f19603f3d011682016040523d82523d5f602084013e62002aaf565b606091505b50915091508162002af6576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001e23565b62001e238162002fa5565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002b84919062003964565b5f60405180830381855afa9150503d805f811462002bbe576040519150601f19603f3d011682016040523d82523d5f602084013e62002bc3565b606091505b50915091508162002af6576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001e23565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff86169162002c8c919062003964565b5f60405180830381855afa9150503d805f811462002cc6576040519150601f19603f3d011682016040523d82523d5f602084013e62002ccb565b606091505b509150915081801562002cdf575080516020145b62002cec57601262001e23565b8080602001905181019062001e23919062004065565b60018055565b60685460ff1662002d45576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009d4576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002e5e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031909092919063ffffffff16565b80519091501562001fcd578080602001905181019062002e7f919062004083565b62001fcd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001308565b5f54610100900460ff1662002d02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001308565b6060604082511062002fc75781806020019051810190620007ae9190620040a1565b815160200362003152575f5b6020811080156200301e575082818151811062002ff45762002ff462003bf9565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620030395780620030308162003c53565b91505062002fd3565b805f036200307c57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff81111562003099576200309962003913565b6040519080825280601f01601f191660200182016040528015620030c4576020820181803683370190505b5090505f5b828110156200314a57848181518110620030e757620030e762003bf9565b602001015160f81c60f81b82828151811062003107576200310762003bf9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620031418162003c53565b915050620030c9565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001e2384845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051620031c5919062003964565b5f6040518083038185875af1925050503d805f811462003201576040519150601f19603f3d011682016040523d82523d5f602084013e62003206565b606091505b5091509150620032198783838762003224565b979650505050505050565b60608315620032be5782515f03620032b65773ffffffffffffffffffffffffffffffffffffffff85163b620032b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001308565b508162001e23565b62001e238383815115620032d55781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200130891906200411c565b611b0d806200413183390190565b803563ffffffff811681146200318b575f80fd5b73ffffffffffffffffffffffffffffffffffffffff811681146200334f575f80fd5b50565b5f806040838503121562003364575f80fd5b6200336f8362003319565b9150602083013562003381816200332d565b809150509250929050565b80151581146200334f575f80fd5b5f8083601f840112620033ab575f80fd5b50813567ffffffffffffffff811115620033c3575f80fd5b602083019150836020828501011115620033db575f80fd5b9250929050565b5f805f805f60808688031215620033f7575f80fd5b620034028662003319565b9450602086013562003414816200332d565b9350604086013562003426816200338c565b9250606086013567ffffffffffffffff81111562003442575f80fd5b62003450888289016200339a565b969995985093965092949392505050565b806104008101831015620007ae575f80fd5b5f805f805f805f805f805f6105208c8e0312156200348f575f80fd5b6200349b8d8d62003461565b9a50620034ac6104008d0162003319565b99506104208c013598506104408c01359750620034cd6104608d0162003319565b96506104808c0135620034e0816200332d565b9550620034f16104a08d0162003319565b94506104c08c013562003504816200332d565b93506104e08c013592506105008c013567ffffffffffffffff81111562003529575f80fd5b620035378e828f016200339a565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562003562575f80fd5b81356200356f816200332d565b9392505050565b60ff811681146200334f575f80fd5b5f805f805f805f60e0888a0312156200359c575f80fd5b8735620035a98162003576565b9650620035b96020890162003319565b95506040880135620035cb816200332d565b9450620035db6060890162003319565b93506080880135620035ed816200332d565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156200361d575f80fd5b620036288462003319565b925060208401356200363a816200332d565b915060408401356200364c816200332d565b809150509250925092565b5f6020828403121562003668575f80fd5b5035919050565b5f805f610440848603121562003683575f80fd5b8335925062003696856020860162003461565b9150620036a7610420850162003319565b90509250925092565b5f805f805f805f60a0888a031215620036c7575f80fd5b620036d28862003319565b96506020880135620036e4816200332d565b9550604088013567ffffffffffffffff8082111562003701575f80fd5b6200370f8b838c016200339a565b909750955060608a013591508082111562003728575f80fd5b50620037378a828b016200339a565b90945092505060808801356200374d8162003576565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003774575f80fd5b6200377f8862003319565b9650602088013562003791816200332d565b9550604088013594506060880135620037aa816200332d565b93506080880135620037bc816200338c565b925060a088013567ffffffffffffffff811115620037d8575f80fd5b620037e68a828b016200339a565b989b979a50959850939692959293505050565b5f805f8061046085870312156200380e575f80fd5b8435935062003821866020870162003461565b925062003832610420860162003319565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620038ea828501878962003843565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b838110156200395c57818101518382015260200162003942565b50505f910152565b5f82516200397781846020870162003940565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715620039cb57620039cb62003913565b604052919050565b5f67ffffffffffffffff821115620039ef57620039ef62003913565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011262003a2b575f80fd5b813562003a4262003a3c82620039d3565b62003981565b81815284602083860101111562003a57575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003a86575f80fd5b833567ffffffffffffffff8082111562003a9e575f80fd5b62003aac8783880162003a1b565b9450602086013591508082111562003ac2575f80fd5b5062003ad18682870162003a1b565b92505060408401356200364c8162003576565b5f815180845262003afd81602086016020860162003940565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f62003b43606083018662003ae4565b828103602084015262003b57818662003ae4565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200321960808301848662003843565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003bef60608301848662003843565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003c865762003c8662003c26565b5060010190565b606081525f62003ca260608301878962003843565b828103602084015262003cb781868862003843565b91505060ff831660408301529695505050505050565b5f835162003ce081846020880162003940565b83519083019062003cf681836020880162003940565b01949350505050565b5f6020828403121562003d10575f80fd5b5051919050565b81810381811115620007ae57620007ae62003c26565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003d8c8285018762003ae4565b925080851660e085015250509998505050505050505050565b600181815b8085111562003e0457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003de85762003de862003c26565b8085161562003df657918102915b93841c939080029062003daa565b509250929050565b5f8262003e1c57506001620007ae565b8162003e2a57505f620007ae565b816001811462003e43576002811462003e4e5762003e6e565b6001915050620007ae565b60ff84111562003e625762003e6262003c26565b50506001821b620007ae565b5060208310610133831016604e8410600b841016171562003e93575081810a620007ae565b62003e9f838362003da5565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003ed45762003ed462003c26565b029392505050565b5f6200356f838362003e0c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f808585111562003f25575f80fd5b8386111562003f32575f80fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003f805780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562003f9f575f80fd5b873562003fac816200332d565b9650602088013562003fbe816200332d565b955060408801359450606088013593506080880135620035ed8162003576565b5f805f805f805f80610100898b03121562003ff7575f80fd5b883562004004816200332d565b9750602089013562004016816200332d565b96506040890135955060608901359450608089013562004036816200338c565b935060a0890135620040488162003576565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004076575f80fd5b81516200356f8162003576565b5f6020828403121562004094575f80fd5b81516200356f816200338c565b5f60208284031215620040b2575f80fd5b815167ffffffffffffffff811115620040c9575f80fd5b8201601f81018413620040da575f80fd5b8051620040eb62003a3c82620039d3565b81815285602083850101111562004100575f80fd5b6200411382602083016020860162003940565b95945050505050565b602081525f6200356f602083018462003ae456fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a264697066735822122004c06992f02d6f5a5fdf6dc9a47c64265ec78705a8b84bebf81be4b2edfc69c364736f6c63430008140033", + "deployedBytecode": "0x608060405260043610620001a3575f3560e01c806379e2cf9711620000e2578063be5831c71162000086578063dbc16976116200005e578063dbc16976146200064a578063ee25560b1462000661578063fb5708341462000690575f80fd5b8063be5831c714620005c1578063cd58657914620005fc578063d02103ca1462000613575f80fd5b80639e34070f11620000ba5780639e34070f1462000521578063aaa13cc21462000564578063bab161bf1462000588575f80fd5b806379e2cf9714620004a157806381b1c17414620004b857806383f2440314620004fd575f80fd5b80632dfdf0b5116200014a5780633e19704311620001225780633e19704314620003745780635ca1e1651462000466578063647c576c146200047d575f80fd5b80632dfdf0b51462000299578063318aee3d14620002bf57806334ac9cf21462000346575f80fd5b8063240ff378116200017e578063240ff378146200023a5780632cffd02e14620002515780632d2c9d941462000275575f80fd5b806315064c9614620001a75780632072f6c514620001d757806322e95f2c14620001f0575b5f80fd5b348015620001b3575f80fd5b50606854620001c29060ff1681565b60405190151581526020015b60405180910390f35b348015620001e3575f80fd5b50620001ee620006b4565b005b348015620001fc575f80fd5b50620002146200020e36600462003352565b62000712565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001ce565b620001ee6200024b366004620033e2565b620007b4565b3480156200025d575f80fd5b50620001ee6200026f36600462003473565b620009db565b34801562000281575f80fd5b50620001ee6200029336600462003473565b62000f60565b348015620002a5575f80fd5b50620002b060535481565b604051908152602001620001ce565b348015620002cb575f80fd5b5062000314620002dd36600462003551565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001ce565b34801562000352575f80fd5b50606c54620002149073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000380575f80fd5b50620002b06200039236600462003585565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b34801562000472575f80fd5b50620002b062001160565b34801562000489575f80fd5b50620001ee6200049b3660046200360a565b62001245565b348015620004ad575f80fd5b50620001ee6200148e565b348015620004c4575f80fd5b5062000214620004d636600462003657565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000509575f80fd5b50620002b06200051b3660046200366f565b620014c8565b3480156200052d575f80fd5b50620001c26200053f36600462003657565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b34801562000570575f80fd5b506200021462000582366004620036b0565b620015ab565b34801562000594575f80fd5b50606854620005ab90610100900463ffffffff1681565b60405163ffffffff9091168152602001620001ce565b348015620005cd575f80fd5b50606854620005ab90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001ee6200060d3660046200375d565b62001795565b3480156200061f575f80fd5b50606854620002149065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000656575f80fd5b50620001ee62001ce7565b3480156200066d575f80fd5b50620002b06200067f36600462003657565b60696020525f908152604090205481565b3480156200069c575f80fd5b50620001c2620006ae366004620037f9565b62001d43565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462000706576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200071062001e2b565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007f2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620008185750600263ffffffff861610155b1562000850576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620008a6999897969594939291906200388a565b60405180910390a1620009c3620009bd6001606860019054906101000a900463ffffffff16338989348989604051620008e192919062003904565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001ebe565b8215620009d457620009d462001fd2565b5050505050565b60685460ff161562000a19576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000a2f8b8b8b8b8b8b8b8b8b8b8b5f620020a2565b73ffffffffffffffffffffffffffffffffffffffff861662000b0757604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a83919062003964565b5f6040518083038185875af1925050503d805f811462000abf576040519150601f19603f3d011682016040523d82523d5f602084013e62000ac4565b606091505b505090508062000b00576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000ee8565b60685463ffffffff61010090910481169088160362000b495762000b4373ffffffffffffffffffffffffffffffffffffffff871685856200228d565b62000ee8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e5f575f808062000c1b8688018862003a73565b9250925092505f8584848460405162000c34906200330b565b62000c429392919062003b2f565b8190604051809103905ff590508015801562000c60573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000cd3575f80fd5b505af115801562000ce6573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e4d95949392919062003b6b565b60405180910390a15050505062000ee5565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562000ecd575f80fd5b505af115801562000ee0573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000f9e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000fb58b8b8b8b8b8b8b8b8b8b8b6001620020a2565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000fe7949392919062003bb2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200106a919062003964565b5f6040518083038185875af1925050503d805f8114620010a6576040519150601f19603f3d011682016040523d82523d5f602084013e620010ab565b606091505b5050905080620010e7576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200123c578083901c600116600103620011cd576033816020811062001199576200119962003bf9565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620011fa565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620012339062003c53565b9150506200116a565b50919392505050565b5f54610100900460ff16158080156200126457505f54600160ff909116105b806200127f5750303b1580156200127f57505f5460ff166001145b62001311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200136e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556200142562002363565b801562001488575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000710576200071062001fd2565b5f83815b6020811015620015a257600163ffffffff8516821c811690036200153e57848160208110620014ff57620014ff62003bf9565b60200201358260405160200162001520929190918252602082015260400190565b6040516020818303038152906040528051906020012091506200158d565b8185826020811062001554576200155462003bf9565b602002013560405160200162001574929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80620015998162003c53565b915050620014cc565b50949350505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b3083604051806020016200163f906200330b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f9091011660408190526200168a908d908d908d908d908d9060200162003c8d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052620016c8929160200162003ccd565b604051602081830303815290604052805190602001206040516020016200175194939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff1615620017d3576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620017dd62002405565b60685463ffffffff888116610100909204161480620018035750600263ffffffff881610155b156200183b576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff88166200189f5788341462001896576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f925062001b8c565b3415620018d8576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620019c1576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b15801562001997575f80fd5b505af1158015620019aa573d5f803e3d5ffd5b5050505080602001519450805f0151935062001b8a565b8515620019d657620019d6898b89896200247a565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa15801562001a41573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001a67919062003cff565b905062001a8d73ffffffffffffffffffffffffffffffffffffffff8b1633308e6200298d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa15801562001af8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001b1e919062003cff565b905062001b2c828262003d17565b6068548c9850610100900463ffffffff169650935062001b4c87620029ed565b62001b578c62002b01565b62001b628d62002c0a565b60405160200162001b769392919062003b2f565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e868860535460405162001bcd98979695949392919062003d2d565b60405180910390a162001cbf620009bd5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b861562001cd05762001cd062001fd2565b5050505062001cde60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001d39576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200071062002d08565b5f84815b602081101562001e1d57600163ffffffff8616821c8116900362001db95785816020811062001d7a5762001d7a62003bf9565b60200201358260405160200162001d9b929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001e08565b8186826020811062001dcf5762001dcf62003bf9565b602002013560405160200162001def929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001e148162003c53565b91505062001d47565b50821490505b949350505050565b60685460ff161562001e69576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001ecf6020600262003edc565b62001edb919062003d17565b6053541062001f16576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001f279062003c53565b918290555090505f5b602081101562001fc2578082901c60011660010362001f6857826033826020811062001f605762001f6062003bf9565b015550505050565b6033816020811062001f7e5762001f7e62003bf9565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001fb99062003c53565b91505062001f30565b5062001fcd62003ee9565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d6200205862001160565b6040518263ffffffff1660e01b81526004016200207791815260200190565b5f604051808303815f87803b1580156200208f575f80fd5b505af115801562001488573d5f803e3d5ffd5b620020b38b63ffffffff1662002d97565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af115801562002152573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002178919062003cff565b9050805f03620021b3576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8881166101009092041614620021fd576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff166200221a5750896200221d565b508a5b620022466200223d848c8c8c8c8c8c8c604051620008e192919062003904565b8f8f8462001d43565b6200227d576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001fcd9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002dfb565b5f54610100900460ff16620023fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001308565b6200071062002f0d565b60026001540362002473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001308565b6002600155565b5f6200248a600482848662003f16565b620024959162003f3f565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016200270f575f808080808080620024f7896004818d62003f16565b81019062002506919062003f88565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16146200257a576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff86163014620025ca576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002604576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620026bf919062003964565b5f604051808303815f865af19150503d805f8114620026fa576040519150601f19603f3d011682016040523d82523d5f602084013e620026ff565b606091505b50505050505050505050620009d4565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c00000000000000000000000000000000000000000000000000000000146200278b576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80808080808080620027a28a6004818e62003f16565b810190620027b1919062003fde565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002827576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002877576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f16916200293b919062003964565b5f604051808303815f865af19150503d805f811462002976576040519150601f19603f3d011682016040523d82523d5f602084013e6200297b565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014889085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401620022e0565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002a70919062003964565b5f60405180830381855afa9150503d805f811462002aaa576040519150601f19603f3d011682016040523d82523d5f602084013e62002aaf565b606091505b50915091508162002af6576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001e23565b62001e238162002fa5565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002b84919062003964565b5f60405180830381855afa9150503d805f811462002bbe576040519150601f19603f3d011682016040523d82523d5f602084013e62002bc3565b606091505b50915091508162002af6576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001e23565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff86169162002c8c919062003964565b5f60405180830381855afa9150503d805f811462002cc6576040519150601f19603f3d011682016040523d82523d5f602084013e62002ccb565b606091505b509150915081801562002cdf575080516020145b62002cec57601262001e23565b8080602001905181019062001e23919062004065565b60018055565b60685460ff1662002d45576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009d4576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002e5e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031909092919063ffffffff16565b80519091501562001fcd578080602001905181019062002e7f919062004083565b62001fcd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001308565b5f54610100900460ff1662002d02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001308565b6060604082511062002fc75781806020019051810190620007ae9190620040a1565b815160200362003152575f5b6020811080156200301e575082818151811062002ff45762002ff462003bf9565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620030395780620030308162003c53565b91505062002fd3565b805f036200307c57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff81111562003099576200309962003913565b6040519080825280601f01601f191660200182016040528015620030c4576020820181803683370190505b5090505f5b828110156200314a57848181518110620030e757620030e762003bf9565b602001015160f81c60f81b82828151811062003107576200310762003bf9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620031418162003c53565b915050620030c9565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001e2384845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051620031c5919062003964565b5f6040518083038185875af1925050503d805f811462003201576040519150601f19603f3d011682016040523d82523d5f602084013e62003206565b606091505b5091509150620032198783838762003224565b979650505050505050565b60608315620032be5782515f03620032b65773ffffffffffffffffffffffffffffffffffffffff85163b620032b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001308565b508162001e23565b62001e238383815115620032d55781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200130891906200411c565b611b0d806200413183390190565b803563ffffffff811681146200318b575f80fd5b73ffffffffffffffffffffffffffffffffffffffff811681146200334f575f80fd5b50565b5f806040838503121562003364575f80fd5b6200336f8362003319565b9150602083013562003381816200332d565b809150509250929050565b80151581146200334f575f80fd5b5f8083601f840112620033ab575f80fd5b50813567ffffffffffffffff811115620033c3575f80fd5b602083019150836020828501011115620033db575f80fd5b9250929050565b5f805f805f60808688031215620033f7575f80fd5b620034028662003319565b9450602086013562003414816200332d565b9350604086013562003426816200338c565b9250606086013567ffffffffffffffff81111562003442575f80fd5b62003450888289016200339a565b969995985093965092949392505050565b806104008101831015620007ae575f80fd5b5f805f805f805f805f805f6105208c8e0312156200348f575f80fd5b6200349b8d8d62003461565b9a50620034ac6104008d0162003319565b99506104208c013598506104408c01359750620034cd6104608d0162003319565b96506104808c0135620034e0816200332d565b9550620034f16104a08d0162003319565b94506104c08c013562003504816200332d565b93506104e08c013592506105008c013567ffffffffffffffff81111562003529575f80fd5b620035378e828f016200339a565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562003562575f80fd5b81356200356f816200332d565b9392505050565b60ff811681146200334f575f80fd5b5f805f805f805f60e0888a0312156200359c575f80fd5b8735620035a98162003576565b9650620035b96020890162003319565b95506040880135620035cb816200332d565b9450620035db6060890162003319565b93506080880135620035ed816200332d565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156200361d575f80fd5b620036288462003319565b925060208401356200363a816200332d565b915060408401356200364c816200332d565b809150509250925092565b5f6020828403121562003668575f80fd5b5035919050565b5f805f610440848603121562003683575f80fd5b8335925062003696856020860162003461565b9150620036a7610420850162003319565b90509250925092565b5f805f805f805f60a0888a031215620036c7575f80fd5b620036d28862003319565b96506020880135620036e4816200332d565b9550604088013567ffffffffffffffff8082111562003701575f80fd5b6200370f8b838c016200339a565b909750955060608a013591508082111562003728575f80fd5b50620037378a828b016200339a565b90945092505060808801356200374d8162003576565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003774575f80fd5b6200377f8862003319565b9650602088013562003791816200332d565b9550604088013594506060880135620037aa816200332d565b93506080880135620037bc816200338c565b925060a088013567ffffffffffffffff811115620037d8575f80fd5b620037e68a828b016200339a565b989b979a50959850939692959293505050565b5f805f8061046085870312156200380e575f80fd5b8435935062003821866020870162003461565b925062003832610420860162003319565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620038ea828501878962003843565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b838110156200395c57818101518382015260200162003942565b50505f910152565b5f82516200397781846020870162003940565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715620039cb57620039cb62003913565b604052919050565b5f67ffffffffffffffff821115620039ef57620039ef62003913565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011262003a2b575f80fd5b813562003a4262003a3c82620039d3565b62003981565b81815284602083860101111562003a57575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003a86575f80fd5b833567ffffffffffffffff8082111562003a9e575f80fd5b62003aac8783880162003a1b565b9450602086013591508082111562003ac2575f80fd5b5062003ad18682870162003a1b565b92505060408401356200364c8162003576565b5f815180845262003afd81602086016020860162003940565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f62003b43606083018662003ae4565b828103602084015262003b57818662003ae4565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200321960808301848662003843565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003bef60608301848662003843565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003c865762003c8662003c26565b5060010190565b606081525f62003ca260608301878962003843565b828103602084015262003cb781868862003843565b91505060ff831660408301529695505050505050565b5f835162003ce081846020880162003940565b83519083019062003cf681836020880162003940565b01949350505050565b5f6020828403121562003d10575f80fd5b5051919050565b81810381811115620007ae57620007ae62003c26565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003d8c8285018762003ae4565b925080851660e085015250509998505050505050505050565b600181815b8085111562003e0457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003de85762003de862003c26565b8085161562003df657918102915b93841c939080029062003daa565b509250929050565b5f8262003e1c57506001620007ae565b8162003e2a57505f620007ae565b816001811462003e43576002811462003e4e5762003e6e565b6001915050620007ae565b60ff84111562003e625762003e6262003c26565b50506001821b620007ae565b5060208310610133831016604e8410600b841016171562003e93575081810a620007ae565b62003e9f838362003da5565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003ed45762003ed462003c26565b029392505050565b5f6200356f838362003e0c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f808585111562003f25575f80fd5b8386111562003f32575f80fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003f805780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562003f9f575f80fd5b873562003fac816200332d565b9650602088013562003fbe816200332d565b955060408801359450606088013593506080880135620035ed8162003576565b5f805f805f805f80610100898b03121562003ff7575f80fd5b883562004004816200332d565b9750602089013562004016816200332d565b96506040890135955060608901359450608089013562004036816200338c565b935060a0890135620040488162003576565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004076575f80fd5b81516200356f8162003576565b5f6020828403121562004094575f80fd5b81516200356f816200338c565b5f60208284031215620040b2575f80fd5b815167ffffffffffffffff811115620040c9575f80fd5b8201601f81018413620040da575f80fd5b8051620040eb62003a3c82620039d3565b81815285602083850101111562004100575f80fd5b6200411382602083016020860162003940565b95945050505050565b602081525f6200356f602083018462003ae456fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a264697066735822122004c06992f02d6f5a5fdf6dc9a47c64265ec78705a8b84bebf81be4b2edfc69c364736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMBridgeMock.json b/compiled-contracts/PolygonZkEVMBridgeMock.json index 80c9d0f50..455a0b3d4 100644 --- a/compiled-contracts/PolygonZkEVMBridgeMock.json +++ b/compiled-contracts/PolygonZkEVMBridgeMock.json @@ -323,6 +323,35 @@ "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": [ { @@ -478,19 +507,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "getDepositRoot", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -540,6 +556,19 @@ "stateMutability": "pure", "type": "function" }, + { + "inputs": [], + "name": "getRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -867,8 +896,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561000f575f80fd5b50615f348061001d5f395ff3fe608060405260043610620001df575f3560e01c8063715018a61162000106578063bab161bf116200009e578063dbc16976116200006a578063dbc169761462000704578063ee25560b146200071b578063f2fde38b146200074a578063fb570834146200076e575f80fd5b8063bab161bf1462000642578063be5831c7146200067b578063cd58657914620006b6578063d02103ca14620006cd575f80fd5b80638da5cb5b11620000de5780638da5cb5b146200059857806391e57e2d14620005c45780639e34070f14620005db578063aaa13cc2146200061e575f80fd5b8063715018a6146200052557806379e2cf97146200053c57806381b1c1741462000553575f80fd5b80632d2c9d94116200017a57806334ac9cf2116200015257806334ac9cf214620003ca5780633ae0504714620003f85780633e197043146200040f578063647c576c1462000501575f80fd5b80632d2c9d9414620002f95780632dfdf0b5146200031d578063318aee3d1462000343575f80fd5b8063240ff37811620001ba578063240ff37814620002765780632b5e42e7146200028d5780632c3f58cd14620002b15780632cffd02e14620002d5575f80fd5b806315064c9614620001e35780632072f6c5146200021357806322e95f2c146200022c575b5f80fd5b348015620001ef575f80fd5b50606854620001fe9060ff1681565b60405190151581526020015b60405180910390f35b3480156200021f575f80fd5b506200022a62000792565b005b34801562000238575f80fd5b50620002506200024a36600462003638565b620007f0565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016200020a565b6200022a62000287366004620036c8565b62000892565b34801562000299575f80fd5b506200022a620002ab36600462003747565b62000ab9565b348015620002bd575f80fd5b506200022a620002cf3660046200375f565b62000ac8565b348015620002e1575f80fd5b506200022a620002f336600462003794565b62000b0e565b34801562000305575f80fd5b506200022a6200031736600462003794565b62001093565b34801562000329575f80fd5b506200033460535481565b6040519081526020016200020a565b3480156200034f575f80fd5b50620003986200036136600462003872565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff9091166020830152016200020a565b348015620003d6575f80fd5b50606c54620002509073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000404575f80fd5b506200033462001293565b3480156200041b575f80fd5b50620003346200042d3660046200389f565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200050d575f80fd5b506200022a6200051f36600462003924565b62001378565b34801562000531575f80fd5b506200022a620015cd565b34801562000548575f80fd5b506200022a620015e2565b3480156200055f575f80fd5b50620002506200057136600462003747565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005a4575f80fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff1662000250565b348015620005d0575f80fd5b506200033460d15481565b348015620005e7575f80fd5b50620001fe620005f936600462003747565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b3480156200062a575f80fd5b50620002506200063c36600462003971565b6200161c565b3480156200064e575f80fd5b506068546200066590610100900463ffffffff1681565b60405163ffffffff90911681526020016200020a565b34801562000687575f80fd5b506068546200066590790100000000000000000000000000000000000000000000000000900463ffffffff1681565b6200022a620006c736600462003a1e565b62001806565b348015620006d9575f80fd5b50606854620002509065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000710575f80fd5b506200022a620018da565b34801562000727575f80fd5b50620003346200073936600462003747565b60696020525f908152604090205481565b34801562000756575f80fd5b506200022a6200076836600462003872565b62001936565b3480156200077a575f80fd5b50620001fe6200078c36600462003aba565b620019f3565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620007e4576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee62001adb565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620008d0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620008f65750600263ffffffff861610155b156200092e576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009849998979695949392919062003b4b565b60405180910390a162000aa162000a9b6001606860019054906101000a900463ffffffff16338989348989604051620009bf92919062003bc5565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001b6e565b821562000ab25762000ab262001c82565b5050505050565b62000ac362001d52565b60d155565b62000ad262001d52565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b4c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b628b8b8b8b8b8b8b8b8b8b8b5f62001dd5565b73ffffffffffffffffffffffffffffffffffffffff861662000c3a57604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000bb6919062003c25565b5f6040518083038185875af1925050503d805f811462000bf2576040519150601f19603f3d011682016040523d82523d5f602084013e62000bf7565b606091505b505090508062000c33576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506200101b565b60685463ffffffff61010090910481169088160362000c7c5762000c7673ffffffffffffffffffffffffffffffffffffffff8716858562001fc0565b6200101b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000f92575f808062000d4e8688018862003d34565b9250925092505f8584848460405162000d6790620035f4565b62000d759392919062003df0565b8190604051809103905ff590508015801562000d93573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000e06575f80fd5b505af115801562000e19573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000f8095949392919062003e2c565b60405180910390a15050505062001018565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562001000575f80fd5b505af115801562001013573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff1615620010d1576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620010e88b8b8b8b8b8b8b8b8b8b8b600162001dd5565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a86866040516024016200111a949392919062003e73565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200119d919062003c25565b5f6040518083038185875af1925050503d805f8114620011d9576040519150601f19603f3d011682016040523d82523d5f602084013e620011de565b606091505b50509050806200121a576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200136f578083901c600116600103620013005760338160208110620012cc57620012cc62003eba565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200132d565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013669062003f14565b9150506200129d565b50919392505050565b5f54610100900460ff16158080156200139757505f54600160ff909116105b80620013b25750303b158015620013b257505f5460ff166001145b62001444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014a1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d1556200156462002096565b8015620015c7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b620015d762001d52565b620007ee5f62002134565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620007ee57620007ee62001c82565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180602001620016b090620035f4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620016fb908d908d908d908d908d9060200162003f4e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001739929160200162003f8e565b60405160208183030381529060405280519060200120604051602001620017c294939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d154341115620018c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200143b565b620018d187878787878787620021aa565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff1633146200192c576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee620026f3565b6200194062001d52565b73ffffffffffffffffffffffffffffffffffffffff8116620019e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200143b565b620019f08162002134565b50565b5f84815b602081101562001acd57600163ffffffff8616821c8116900362001a695785816020811062001a2a5762001a2a62003eba565b60200201358260405160200162001a4b929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001ab8565b8186826020811062001a7f5762001a7f62003eba565b602002013560405160200162001a9f929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001ac48162003f14565b915050620019f7565b50821490505b949350505050565b60685460ff161562001b19576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001b7f60206002620040f7565b62001b8b919062004104565b6053541062001bc6576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001bd79062003f14565b918290555090505f5b602081101562001c72578082901c60011660010362001c1857826033826020811062001c105762001c1062003eba565b015550505050565b6033816020811062001c2e5762001c2e62003eba565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001c699062003f14565b91505062001be0565b5062001c7d6200411a565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001d0862001293565b6040518263ffffffff1660e01b815260040162001d2791815260200190565b5f604051808303815f87803b15801562001d3f575f80fd5b505af1158015620015c7573d5f803e3d5ffd5b609f5473ffffffffffffffffffffffffffffffffffffffff163314620007ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200143b565b62001de68b63ffffffff1662002782565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af115801562001e85573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001eab919062004147565b9050805f0362001ee6576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462001f30576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff1662001f4d57508962001f50565b508a5b62001f7962001f70848c8c8c8c8c8c8c604051620009bf92919062003bc5565b8f8f84620019f3565b62001fb0576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001c7d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152620027e6565b5f54610100900460ff166200212e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200143b565b620007ee335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60685460ff1615620021e8576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620021f2620028f8565b60685463ffffffff888116610100909204161480620022185750600263ffffffff881610155b1562002250576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff8816620022b457883414620022ab576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f9250620025a1565b3415620022ed576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620023d6576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b158015620023ac575f80fd5b505af1158015620023bf573d5f803e3d5ffd5b5050505080602001519450805f015193506200259f565b8515620023eb57620023eb898b89896200296d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa15801562002456573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200247c919062004147565b9050620024a273ffffffffffffffffffffffffffffffffffffffff8b1633308e62002e80565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa1580156200250d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002533919062004147565b905062002541828262004104565b6068548c9850610100900463ffffffff1696509350620025618762002ee0565b6200256c8c62002ff4565b620025778d620030fd565b6040516020016200258b9392919062003df0565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620025e29897969594939291906200415f565b60405180910390a1620026d462000a9b5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b8615620026e557620026e562001c82565b50505050620018d160018055565b60685460ff1662002730576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000ab2576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002849826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031f59092919063ffffffff16565b80519091501562001c7d57808060200190518101906200286a9190620041d7565b62001c7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200143b565b60026001540362002966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200143b565b6002600155565b5f6200297d6004828486620041f5565b62002988916200421e565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002c02575f808080808080620029ea896004818d620041f5565b810190620029f9919062004267565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002a6d576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002abd576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002af7576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002bb2919062003c25565b5f604051808303815f865af19150503d805f811462002bed576040519150601f19603f3d011682016040523d82523d5f602084013e62002bf2565b606091505b5050505050505050505062000ab2565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002c7e576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080808080808062002c958a6004818e620041f5565b81019062002ca49190620042bd565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002d1a576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002d6a576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002e2e919062003c25565b5f604051808303815f865af19150503d805f811462002e69576040519150601f19603f3d011682016040523d82523d5f602084013e62002e6e565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620015c79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002013565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002f63919062003c25565b5f60405180830381855afa9150503d805f811462002f9d576040519150601f19603f3d011682016040523d82523d5f602084013e62002fa2565b606091505b50915091508162002fe9576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001ad3565b62001ad38162003205565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162003077919062003c25565b5f60405180830381855afa9150503d805f8114620030b1576040519150601f19603f3d011682016040523d82523d5f602084013e620030b6565b606091505b50915091508162002fe9576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001ad3565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff8616916200317f919062003c25565b5f60405180830381855afa9150503d805f8114620031b9576040519150601f19603f3d011682016040523d82523d5f602084013e620031be565b606091505b5091509150818015620031d2575080516020145b620031df57601262001ad3565b8080602001905181019062001ad3919062004344565b606062001ad384845f85620033f0565b606060408251106200322757818060200190518101906200088c919062004362565b8151602003620033b2575f5b6020811080156200327e575082818151811062003254576200325462003eba565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620032995780620032908162003f14565b91505062003233565b805f03620032dc57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115620032f957620032f962003bd4565b6040519080825280601f01601f19166020018201604052801562003324576020820181803683370190505b5090505f5b82811015620033aa5784818151811062003347576200334762003eba565b602001015160f81c60f81b82828151811062003367576200336762003eba565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620033a18162003f14565b91505062003329565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200143b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051620034ae919062003c25565b5f6040518083038185875af1925050503d805f8114620034ea576040519150601f19603f3d011682016040523d82523d5f602084013e620034ef565b606091505b509150915062003502878383876200350d565b979650505050505050565b60608315620035a75782515f036200359f5773ffffffffffffffffffffffffffffffffffffffff85163b6200359f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200143b565b508162001ad3565b62001ad38383815115620035be5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200143b9190620043dd565b611b0d80620043f283390190565b803563ffffffff81168114620033eb575f80fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620019f0575f80fd5b5f80604083850312156200364a575f80fd5b620036558362003602565b91506020830135620036678162003616565b809150509250929050565b8015158114620019f0575f80fd5b5f8083601f84011262003691575f80fd5b50813567ffffffffffffffff811115620036a9575f80fd5b602083019150836020828501011115620036c1575f80fd5b9250929050565b5f805f805f60808688031215620036dd575f80fd5b620036e88662003602565b94506020860135620036fa8162003616565b935060408601356200370c8162003672565b9250606086013567ffffffffffffffff81111562003728575f80fd5b620037368882890162003680565b969995985093965092949392505050565b5f6020828403121562003758575f80fd5b5035919050565b5f6020828403121562003770575f80fd5b6200377b8262003602565b9392505050565b8061040081018310156200088c575f80fd5b5f805f805f805f805f805f6105208c8e031215620037b0575f80fd5b620037bc8d8d62003782565b9a50620037cd6104008d0162003602565b99506104208c013598506104408c01359750620037ee6104608d0162003602565b96506104808c0135620038018162003616565b9550620038126104a08d0162003602565b94506104c08c0135620038258162003616565b93506104e08c013592506105008c013567ffffffffffffffff8111156200384a575f80fd5b620038588e828f0162003680565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562003883575f80fd5b81356200377b8162003616565b60ff81168114620019f0575f80fd5b5f805f805f805f60e0888a031215620038b6575f80fd5b8735620038c38162003890565b9650620038d36020890162003602565b95506040880135620038e58162003616565b9450620038f56060890162003602565b93506080880135620039078162003616565b9699959850939692959460a0840135945060c09093013592915050565b5f805f6060848603121562003937575f80fd5b620039428462003602565b92506020840135620039548162003616565b91506040840135620039668162003616565b809150509250925092565b5f805f805f805f60a0888a03121562003988575f80fd5b620039938862003602565b96506020880135620039a58162003616565b9550604088013567ffffffffffffffff80821115620039c2575f80fd5b620039d08b838c0162003680565b909750955060608a0135915080821115620039e9575f80fd5b50620039f88a828b0162003680565b909450925050608088013562003a0e8162003890565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003a35575f80fd5b62003a408862003602565b9650602088013562003a528162003616565b955060408801359450606088013562003a6b8162003616565b9350608088013562003a7d8162003672565b925060a088013567ffffffffffffffff81111562003a99575f80fd5b62003aa78a828b0162003680565b989b979a50959850939692959293505050565b5f805f80610460858703121562003acf575f80fd5b8435935062003ae2866020870162003782565b925062003af3610420860162003602565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003bab828501878962003b04565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003c1d57818101518382015260200162003c03565b50505f910152565b5f825162003c3881846020870162003c01565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003c8c5762003c8c62003bd4565b604052919050565b5f67ffffffffffffffff82111562003cb05762003cb062003bd4565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011262003cec575f80fd5b813562003d0362003cfd8262003c94565b62003c42565b81815284602083860101111562003d18575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003d47575f80fd5b833567ffffffffffffffff8082111562003d5f575f80fd5b62003d6d8783880162003cdc565b9450602086013591508082111562003d83575f80fd5b5062003d928682870162003cdc565b9250506040840135620039668162003890565b5f815180845262003dbe81602086016020860162003c01565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f62003e04606083018662003da5565b828103602084015262003e18818662003da5565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200350260808301848662003b04565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003eb060608301848662003b04565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003f475762003f4762003ee7565b5060010190565b606081525f62003f6360608301878962003b04565b828103602084015262003f7881868862003b04565b91505060ff831660408301529695505050505050565b5f835162003fa181846020880162003c01565b83519083019062003fb781836020880162003c01565b01949350505050565b600181815b808511156200401f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562004003576200400362003ee7565b808516156200401157918102915b93841c939080029062003fc5565b509250929050565b5f8262004037575060016200088c565b816200404557505f6200088c565b81600181146200405e5760028114620040695762004089565b60019150506200088c565b60ff8411156200407d576200407d62003ee7565b50506001821b6200088c565b5060208310610133831016604e8410600b8410161715620040ae575081810a6200088c565b620040ba838362003fc0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620040ef57620040ef62003ee7565b029392505050565b5f6200377b838362004027565b818103818111156200088c576200088c62003ee7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6020828403121562004158575f80fd5b5051919050565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620041be8285018762003da5565b925080851660e085015250509998505050505050505050565b5f60208284031215620041e8575f80fd5b81516200377b8162003672565b5f808585111562004204575f80fd5b8386111562004211575f80fd5b5050820193919092039150565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156200425f5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a0312156200427e575f80fd5b87356200428b8162003616565b965060208801356200429d8162003616565b955060408801359450606088013593506080880135620039078162003890565b5f805f805f805f80610100898b031215620042d6575f80fd5b8835620042e38162003616565b97506020890135620042f58162003616565b965060408901359550606089013594506080890135620043158162003672565b935060a0890135620043278162003890565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004355575f80fd5b81516200377b8162003890565b5f6020828403121562004373575f80fd5b815167ffffffffffffffff8111156200438a575f80fd5b8201601f810184136200439b575f80fd5b8051620043ac62003cfd8262003c94565b818152856020838501011115620043c1575f80fd5b620043d482602083016020860162003c01565b95945050505050565b602081525f6200377b602083018462003da556fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a26469706673582212200d390c87d91133753c2d28c32519eb100fa1cf5754ba3d4ee472f42bf463e27764736f6c63430008140033", - "deployedBytecode": "0x608060405260043610620001df575f3560e01c8063715018a61162000106578063bab161bf116200009e578063dbc16976116200006a578063dbc169761462000704578063ee25560b146200071b578063f2fde38b146200074a578063fb570834146200076e575f80fd5b8063bab161bf1462000642578063be5831c7146200067b578063cd58657914620006b6578063d02103ca14620006cd575f80fd5b80638da5cb5b11620000de5780638da5cb5b146200059857806391e57e2d14620005c45780639e34070f14620005db578063aaa13cc2146200061e575f80fd5b8063715018a6146200052557806379e2cf97146200053c57806381b1c1741462000553575f80fd5b80632d2c9d94116200017a57806334ac9cf2116200015257806334ac9cf214620003ca5780633ae0504714620003f85780633e197043146200040f578063647c576c1462000501575f80fd5b80632d2c9d9414620002f95780632dfdf0b5146200031d578063318aee3d1462000343575f80fd5b8063240ff37811620001ba578063240ff37814620002765780632b5e42e7146200028d5780632c3f58cd14620002b15780632cffd02e14620002d5575f80fd5b806315064c9614620001e35780632072f6c5146200021357806322e95f2c146200022c575b5f80fd5b348015620001ef575f80fd5b50606854620001fe9060ff1681565b60405190151581526020015b60405180910390f35b3480156200021f575f80fd5b506200022a62000792565b005b34801562000238575f80fd5b50620002506200024a36600462003638565b620007f0565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016200020a565b6200022a62000287366004620036c8565b62000892565b34801562000299575f80fd5b506200022a620002ab36600462003747565b62000ab9565b348015620002bd575f80fd5b506200022a620002cf3660046200375f565b62000ac8565b348015620002e1575f80fd5b506200022a620002f336600462003794565b62000b0e565b34801562000305575f80fd5b506200022a6200031736600462003794565b62001093565b34801562000329575f80fd5b506200033460535481565b6040519081526020016200020a565b3480156200034f575f80fd5b50620003986200036136600462003872565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff9091166020830152016200020a565b348015620003d6575f80fd5b50606c54620002509073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000404575f80fd5b506200033462001293565b3480156200041b575f80fd5b50620003346200042d3660046200389f565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200050d575f80fd5b506200022a6200051f36600462003924565b62001378565b34801562000531575f80fd5b506200022a620015cd565b34801562000548575f80fd5b506200022a620015e2565b3480156200055f575f80fd5b50620002506200057136600462003747565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005a4575f80fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff1662000250565b348015620005d0575f80fd5b506200033460d15481565b348015620005e7575f80fd5b50620001fe620005f936600462003747565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b3480156200062a575f80fd5b50620002506200063c36600462003971565b6200161c565b3480156200064e575f80fd5b506068546200066590610100900463ffffffff1681565b60405163ffffffff90911681526020016200020a565b34801562000687575f80fd5b506068546200066590790100000000000000000000000000000000000000000000000000900463ffffffff1681565b6200022a620006c736600462003a1e565b62001806565b348015620006d9575f80fd5b50606854620002509065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000710575f80fd5b506200022a620018da565b34801562000727575f80fd5b50620003346200073936600462003747565b60696020525f908152604090205481565b34801562000756575f80fd5b506200022a6200076836600462003872565b62001936565b3480156200077a575f80fd5b50620001fe6200078c36600462003aba565b620019f3565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620007e4576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee62001adb565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620008d0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620008f65750600263ffffffff861610155b156200092e576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009849998979695949392919062003b4b565b60405180910390a162000aa162000a9b6001606860019054906101000a900463ffffffff16338989348989604051620009bf92919062003bc5565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001b6e565b821562000ab25762000ab262001c82565b5050505050565b62000ac362001d52565b60d155565b62000ad262001d52565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b4c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b628b8b8b8b8b8b8b8b8b8b8b5f62001dd5565b73ffffffffffffffffffffffffffffffffffffffff861662000c3a57604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000bb6919062003c25565b5f6040518083038185875af1925050503d805f811462000bf2576040519150601f19603f3d011682016040523d82523d5f602084013e62000bf7565b606091505b505090508062000c33576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506200101b565b60685463ffffffff61010090910481169088160362000c7c5762000c7673ffffffffffffffffffffffffffffffffffffffff8716858562001fc0565b6200101b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000f92575f808062000d4e8688018862003d34565b9250925092505f8584848460405162000d6790620035f4565b62000d759392919062003df0565b8190604051809103905ff590508015801562000d93573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000e06575f80fd5b505af115801562000e19573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000f8095949392919062003e2c565b60405180910390a15050505062001018565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562001000575f80fd5b505af115801562001013573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff1615620010d1576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620010e88b8b8b8b8b8b8b8b8b8b8b600162001dd5565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a86866040516024016200111a949392919062003e73565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200119d919062003c25565b5f6040518083038185875af1925050503d805f8114620011d9576040519150601f19603f3d011682016040523d82523d5f602084013e620011de565b606091505b50509050806200121a576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200136f578083901c600116600103620013005760338160208110620012cc57620012cc62003eba565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200132d565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013669062003f14565b9150506200129d565b50919392505050565b5f54610100900460ff16158080156200139757505f54600160ff909116105b80620013b25750303b158015620013b257505f5460ff166001145b62001444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014a1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d1556200156462002096565b8015620015c7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b620015d762001d52565b620007ee5f62002134565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620007ee57620007ee62001c82565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180602001620016b090620035f4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620016fb908d908d908d908d908d9060200162003f4e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001739929160200162003f8e565b60405160208183030381529060405280519060200120604051602001620017c294939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d154341115620018c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200143b565b620018d187878787878787620021aa565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff1633146200192c576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee620026f3565b6200194062001d52565b73ffffffffffffffffffffffffffffffffffffffff8116620019e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200143b565b620019f08162002134565b50565b5f84815b602081101562001acd57600163ffffffff8616821c8116900362001a695785816020811062001a2a5762001a2a62003eba565b60200201358260405160200162001a4b929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001ab8565b8186826020811062001a7f5762001a7f62003eba565b602002013560405160200162001a9f929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001ac48162003f14565b915050620019f7565b50821490505b949350505050565b60685460ff161562001b19576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001b7f60206002620040f7565b62001b8b919062004104565b6053541062001bc6576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001bd79062003f14565b918290555090505f5b602081101562001c72578082901c60011660010362001c1857826033826020811062001c105762001c1062003eba565b015550505050565b6033816020811062001c2e5762001c2e62003eba565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001c699062003f14565b91505062001be0565b5062001c7d6200411a565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001d0862001293565b6040518263ffffffff1660e01b815260040162001d2791815260200190565b5f604051808303815f87803b15801562001d3f575f80fd5b505af1158015620015c7573d5f803e3d5ffd5b609f5473ffffffffffffffffffffffffffffffffffffffff163314620007ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200143b565b62001de68b63ffffffff1662002782565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af115801562001e85573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001eab919062004147565b9050805f0362001ee6576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462001f30576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff1662001f4d57508962001f50565b508a5b62001f7962001f70848c8c8c8c8c8c8c604051620009bf92919062003bc5565b8f8f84620019f3565b62001fb0576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001c7d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152620027e6565b5f54610100900460ff166200212e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200143b565b620007ee335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60685460ff1615620021e8576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620021f2620028f8565b60685463ffffffff888116610100909204161480620022185750600263ffffffff881610155b1562002250576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff8816620022b457883414620022ab576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f9250620025a1565b3415620022ed576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620023d6576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b158015620023ac575f80fd5b505af1158015620023bf573d5f803e3d5ffd5b5050505080602001519450805f015193506200259f565b8515620023eb57620023eb898b89896200296d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa15801562002456573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200247c919062004147565b9050620024a273ffffffffffffffffffffffffffffffffffffffff8b1633308e62002e80565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa1580156200250d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002533919062004147565b905062002541828262004104565b6068548c9850610100900463ffffffff1696509350620025618762002ee0565b6200256c8c62002ff4565b620025778d620030fd565b6040516020016200258b9392919062003df0565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620025e29897969594939291906200415f565b60405180910390a1620026d462000a9b5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b8615620026e557620026e562001c82565b50505050620018d160018055565b60685460ff1662002730576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000ab2576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002849826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031f59092919063ffffffff16565b80519091501562001c7d57808060200190518101906200286a9190620041d7565b62001c7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200143b565b60026001540362002966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200143b565b6002600155565b5f6200297d6004828486620041f5565b62002988916200421e565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002c02575f808080808080620029ea896004818d620041f5565b810190620029f9919062004267565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002a6d576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002abd576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002af7576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002bb2919062003c25565b5f604051808303815f865af19150503d805f811462002bed576040519150601f19603f3d011682016040523d82523d5f602084013e62002bf2565b606091505b5050505050505050505062000ab2565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002c7e576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080808080808062002c958a6004818e620041f5565b81019062002ca49190620042bd565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002d1a576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002d6a576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002e2e919062003c25565b5f604051808303815f865af19150503d805f811462002e69576040519150601f19603f3d011682016040523d82523d5f602084013e62002e6e565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620015c79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002013565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002f63919062003c25565b5f60405180830381855afa9150503d805f811462002f9d576040519150601f19603f3d011682016040523d82523d5f602084013e62002fa2565b606091505b50915091508162002fe9576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001ad3565b62001ad38162003205565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162003077919062003c25565b5f60405180830381855afa9150503d805f8114620030b1576040519150601f19603f3d011682016040523d82523d5f602084013e620030b6565b606091505b50915091508162002fe9576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001ad3565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff8616916200317f919062003c25565b5f60405180830381855afa9150503d805f8114620031b9576040519150601f19603f3d011682016040523d82523d5f602084013e620031be565b606091505b5091509150818015620031d2575080516020145b620031df57601262001ad3565b8080602001905181019062001ad3919062004344565b606062001ad384845f85620033f0565b606060408251106200322757818060200190518101906200088c919062004362565b8151602003620033b2575f5b6020811080156200327e575082818151811062003254576200325462003eba565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620032995780620032908162003f14565b91505062003233565b805f03620032dc57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115620032f957620032f962003bd4565b6040519080825280601f01601f19166020018201604052801562003324576020820181803683370190505b5090505f5b82811015620033aa5784818151811062003347576200334762003eba565b602001015160f81c60f81b82828151811062003367576200336762003eba565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620033a18162003f14565b91505062003329565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200143b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051620034ae919062003c25565b5f6040518083038185875af1925050503d805f8114620034ea576040519150601f19603f3d011682016040523d82523d5f602084013e620034ef565b606091505b509150915062003502878383876200350d565b979650505050505050565b60608315620035a75782515f036200359f5773ffffffffffffffffffffffffffffffffffffffff85163b6200359f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200143b565b508162001ad3565b62001ad38383815115620035be5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200143b9190620043dd565b611b0d80620043f283390190565b803563ffffffff81168114620033eb575f80fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620019f0575f80fd5b5f80604083850312156200364a575f80fd5b620036558362003602565b91506020830135620036678162003616565b809150509250929050565b8015158114620019f0575f80fd5b5f8083601f84011262003691575f80fd5b50813567ffffffffffffffff811115620036a9575f80fd5b602083019150836020828501011115620036c1575f80fd5b9250929050565b5f805f805f60808688031215620036dd575f80fd5b620036e88662003602565b94506020860135620036fa8162003616565b935060408601356200370c8162003672565b9250606086013567ffffffffffffffff81111562003728575f80fd5b620037368882890162003680565b969995985093965092949392505050565b5f6020828403121562003758575f80fd5b5035919050565b5f6020828403121562003770575f80fd5b6200377b8262003602565b9392505050565b8061040081018310156200088c575f80fd5b5f805f805f805f805f805f6105208c8e031215620037b0575f80fd5b620037bc8d8d62003782565b9a50620037cd6104008d0162003602565b99506104208c013598506104408c01359750620037ee6104608d0162003602565b96506104808c0135620038018162003616565b9550620038126104a08d0162003602565b94506104c08c0135620038258162003616565b93506104e08c013592506105008c013567ffffffffffffffff8111156200384a575f80fd5b620038588e828f0162003680565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562003883575f80fd5b81356200377b8162003616565b60ff81168114620019f0575f80fd5b5f805f805f805f60e0888a031215620038b6575f80fd5b8735620038c38162003890565b9650620038d36020890162003602565b95506040880135620038e58162003616565b9450620038f56060890162003602565b93506080880135620039078162003616565b9699959850939692959460a0840135945060c09093013592915050565b5f805f6060848603121562003937575f80fd5b620039428462003602565b92506020840135620039548162003616565b91506040840135620039668162003616565b809150509250925092565b5f805f805f805f60a0888a03121562003988575f80fd5b620039938862003602565b96506020880135620039a58162003616565b9550604088013567ffffffffffffffff80821115620039c2575f80fd5b620039d08b838c0162003680565b909750955060608a0135915080821115620039e9575f80fd5b50620039f88a828b0162003680565b909450925050608088013562003a0e8162003890565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003a35575f80fd5b62003a408862003602565b9650602088013562003a528162003616565b955060408801359450606088013562003a6b8162003616565b9350608088013562003a7d8162003672565b925060a088013567ffffffffffffffff81111562003a99575f80fd5b62003aa78a828b0162003680565b989b979a50959850939692959293505050565b5f805f80610460858703121562003acf575f80fd5b8435935062003ae2866020870162003782565b925062003af3610420860162003602565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003bab828501878962003b04565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003c1d57818101518382015260200162003c03565b50505f910152565b5f825162003c3881846020870162003c01565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003c8c5762003c8c62003bd4565b604052919050565b5f67ffffffffffffffff82111562003cb05762003cb062003bd4565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011262003cec575f80fd5b813562003d0362003cfd8262003c94565b62003c42565b81815284602083860101111562003d18575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003d47575f80fd5b833567ffffffffffffffff8082111562003d5f575f80fd5b62003d6d8783880162003cdc565b9450602086013591508082111562003d83575f80fd5b5062003d928682870162003cdc565b9250506040840135620039668162003890565b5f815180845262003dbe81602086016020860162003c01565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f62003e04606083018662003da5565b828103602084015262003e18818662003da5565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200350260808301848662003b04565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003eb060608301848662003b04565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003f475762003f4762003ee7565b5060010190565b606081525f62003f6360608301878962003b04565b828103602084015262003f7881868862003b04565b91505060ff831660408301529695505050505050565b5f835162003fa181846020880162003c01565b83519083019062003fb781836020880162003c01565b01949350505050565b600181815b808511156200401f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562004003576200400362003ee7565b808516156200401157918102915b93841c939080029062003fc5565b509250929050565b5f8262004037575060016200088c565b816200404557505f6200088c565b81600181146200405e5760028114620040695762004089565b60019150506200088c565b60ff8411156200407d576200407d62003ee7565b50506001821b6200088c565b5060208310610133831016604e8410600b8410161715620040ae575081810a6200088c565b620040ba838362003fc0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620040ef57620040ef62003ee7565b029392505050565b5f6200377b838362004027565b818103818111156200088c576200088c62003ee7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6020828403121562004158575f80fd5b5051919050565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620041be8285018762003da5565b925080851660e085015250509998505050505050505050565b5f60208284031215620041e8575f80fd5b81516200377b8162003672565b5f808585111562004204575f80fd5b8386111562004211575f80fd5b5050820193919092039150565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156200425f5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a0312156200427e575f80fd5b87356200428b8162003616565b965060208801356200429d8162003616565b955060408801359450606088013593506080880135620039078162003890565b5f805f805f805f80610100898b031215620042d6575f80fd5b8835620042e38162003616565b97506020890135620042f58162003616565b965060408901359550606089013594506080890135620043158162003672565b935060a0890135620043278162003890565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004355575f80fd5b81516200377b8162003890565b5f6020828403121562004373575f80fd5b815167ffffffffffffffff8111156200438a575f80fd5b8201601f810184136200439b575f80fd5b8051620043ac62003cfd8262003c94565b818152856020838501011115620043c1575f80fd5b620043d482602083016020860162003c01565b95945050505050565b602081525f6200377b602083018462003da556fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a26469706673582212200d390c87d91133753c2d28c32519eb100fa1cf5754ba3d4ee472f42bf463e27764736f6c63430008140033", + "bytecode": "0x608060405234801561000f575f80fd5b506160888061001d5f395ff3fe608060405260043610620001eb575f3560e01c806379e2cf971162000106578063bab161bf116200009e578063dbc16976116200006a578063dbc169761462000734578063ee25560b146200074b578063f2fde38b146200077a578063fb570834146200079e575f80fd5b8063bab161bf1462000672578063be5831c714620006ab578063cd58657914620006e6578063d02103ca14620006fd575f80fd5b80638da5cb5b11620000de5780638da5cb5b14620005c857806391e57e2d14620005f45780639e34070f146200060b578063aaa13cc2146200064e575f80fd5b806379e2cf97146200054857806381b1c174146200055f57806383f2440314620005a4575f80fd5b80632d2c9d9411620001865780633e19704311620001525780633e19704314620004045780635ca1e16514620004f6578063647c576c146200050d578063715018a61462000531575f80fd5b80632d2c9d9414620003055780632dfdf0b51462000329578063318aee3d146200034f57806334ac9cf214620003d6575f80fd5b8063240ff37811620001c6578063240ff37814620002825780632b5e42e714620002995780632c3f58cd14620002bd5780632cffd02e14620002e1575f80fd5b806315064c9614620001ef5780632072f6c5146200021f57806322e95f2c1462000238575b5f80fd5b348015620001fb575f80fd5b506068546200020a9060ff1681565b60405190151581526020015b60405180910390f35b3480156200022b575f80fd5b5062000236620007c2565b005b34801562000244575f80fd5b506200025c620002563660046200374b565b62000820565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200162000216565b6200023662000293366004620037db565b620008c2565b348015620002a5575f80fd5b5062000236620002b73660046200385a565b62000ae9565b348015620002c9575f80fd5b5062000236620002db36600462003872565b62000af8565b348015620002ed575f80fd5b5062000236620002ff366004620038a7565b62000b3e565b34801562000311575f80fd5b506200023662000323366004620038a7565b620010c3565b34801562000335575f80fd5b506200034060535481565b60405190815260200162000216565b3480156200035b575f80fd5b50620003a46200036d36600462003985565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff90911660208301520162000216565b348015620003e2575f80fd5b50606c546200025c9073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000410575f80fd5b506200034062000422366004620039b2565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b34801562000502575f80fd5b5062000340620012c3565b34801562000519575f80fd5b50620002366200052b36600462003a37565b620013a8565b3480156200053d575f80fd5b5062000236620015fd565b34801562000554575f80fd5b506200023662001612565b3480156200056b575f80fd5b506200025c6200057d3660046200385a565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005b0575f80fd5b5062000340620005c236600462003a84565b6200164c565b348015620005d4575f80fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff166200025c565b34801562000600575f80fd5b506200034060d15481565b34801562000617575f80fd5b506200020a620006293660046200385a565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b3480156200065a575f80fd5b506200025c6200066c36600462003ac5565b6200172f565b3480156200067e575f80fd5b506068546200069590610100900463ffffffff1681565b60405163ffffffff909116815260200162000216565b348015620006b7575f80fd5b506068546200069590790100000000000000000000000000000000000000000000000000900463ffffffff1681565b62000236620006f736600462003b72565b62001919565b34801562000709575f80fd5b506068546200025c9065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000740575f80fd5b5062000236620019ed565b34801562000757575f80fd5b5062000340620007693660046200385a565b60696020525f908152604090205481565b34801562000786575f80fd5b50620002366200079836600462003985565b62001a49565b348015620007aa575f80fd5b506200020a620007bc36600462003c0e565b62001b06565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462000814576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200081e62001bee565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff161562000900576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620009265750600263ffffffff861610155b156200095e576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009b49998979695949392919062003c9f565b60405180910390a162000ad162000acb6001606860019054906101000a900463ffffffff16338989348989604051620009ef92919062003d19565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001c81565b821562000ae25762000ae262001d95565b5050505050565b62000af362001e65565b60d155565b62000b0262001e65565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b7c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b928b8b8b8b8b8b8b8b8b8b8b5f62001ee8565b73ffffffffffffffffffffffffffffffffffffffff861662000c6a57604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000be6919062003d79565b5f6040518083038185875af1925050503d805f811462000c22576040519150601f19603f3d011682016040523d82523d5f602084013e62000c27565b606091505b505090508062000c63576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506200104b565b60685463ffffffff61010090910481169088160362000cac5762000ca673ffffffffffffffffffffffffffffffffffffffff87168585620020d3565b6200104b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000fc2575f808062000d7e8688018862003e88565b9250925092505f8584848460405162000d979062003707565b62000da59392919062003f44565b8190604051809103905ff590508015801562000dc3573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000e36575f80fd5b505af115801562000e49573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000fb095949392919062003f80565b60405180910390a15050505062001048565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562001030575f80fd5b505af115801562001043573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562001101576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620011188b8b8b8b8b8b8b8b8b8b8b600162001ee8565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a86866040516024016200114a949392919062003fc7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f20000000000000000000000000000000000000000000000000000000017905251620011cd919062003d79565b5f6040518083038185875af1925050503d805f811462001209576040519150601f19603f3d011682016040523d82523d5f602084013e6200120e565b606091505b50509050806200124a576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200139f578083901c600116600103620013305760338160208110620012fc57620012fc6200400e565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200135d565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013969062004068565b915050620012cd565b50919392505050565b5f54610100900460ff1615808015620013c757505f54600160ff909116105b80620013e25750303b158015620013e257505f5460ff166001145b62001474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014d1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d15562001594620021a9565b8015620015f7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6200160762001e65565b6200081e5f62002247565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff1610156200081e576200081e62001d95565b5f83815b60208110156200172657600163ffffffff8516821c81169003620016c2578481602081106200168357620016836200400e565b602002013582604051602001620016a4929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001711565b81858260208110620016d857620016d86200400e565b6020020135604051602001620016f8929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806200171d8162004068565b91505062001650565b50949350505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180602001620017c39062003707565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f9091011660408190526200180e908d908d908d908d908d90602001620040a2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526200184c9291602001620040e2565b60405160208183030381529060405280519060200120604051602001620018d594939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d154341115620019d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200146b565b620019e487878787878787620022bd565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001a3f576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200081e62002806565b62001a5362001e65565b73ffffffffffffffffffffffffffffffffffffffff811662001af8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200146b565b62001b038162002247565b50565b5f84815b602081101562001be057600163ffffffff8616821c8116900362001b7c5785816020811062001b3d5762001b3d6200400e565b60200201358260405160200162001b5e929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001bcb565b8186826020811062001b925762001b926200400e565b602002013560405160200162001bb2929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001bd78162004068565b91505062001b0a565b50821490505b949350505050565b60685460ff161562001c2c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001c92602060026200424b565b62001c9e919062004258565b6053541062001cd9576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001cea9062004068565b918290555090505f5b602081101562001d85578082901c60011660010362001d2b57826033826020811062001d235762001d236200400e565b015550505050565b6033816020811062001d415762001d416200400e565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001d7c9062004068565b91505062001cf3565b5062001d906200426e565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001e1b620012c3565b6040518263ffffffff1660e01b815260040162001e3a91815260200190565b5f604051808303815f87803b15801562001e52575f80fd5b505af1158015620015f7573d5f803e3d5ffd5b609f5473ffffffffffffffffffffffffffffffffffffffff1633146200081e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200146b565b62001ef98b63ffffffff1662002895565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af115801562001f98573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001fbe91906200429b565b9050805f0362001ff9576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462002043576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff166200206057508962002063565b508a5b6200208c62002083848c8c8c8c8c8c8c604051620009ef92919062003d19565b8f8f8462001b06565b620020c3576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001d909084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152620028f9565b5f54610100900460ff1662002241576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200146b565b6200081e335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60685460ff1615620022fb576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200230562002a0b565b60685463ffffffff8881166101009092041614806200232b5750600263ffffffff881610155b1562002363576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff8816620023c757883414620023be576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f9250620026b4565b341562002400576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620024e9576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b158015620024bf575f80fd5b505af1158015620024d2573d5f803e3d5ffd5b5050505080602001519450805f01519350620026b2565b8515620024fe57620024fe898b898962002a80565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa15801562002569573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200258f91906200429b565b9050620025b573ffffffffffffffffffffffffffffffffffffffff8b1633308e62002f93565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa15801562002620573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200264691906200429b565b905062002654828262004258565b6068548c9850610100900463ffffffff1696509350620026748762002ff3565b6200267f8c62003107565b6200268a8d62003210565b6040516020016200269e9392919062003f44565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620026f5989796959493929190620042b3565b60405180910390a1620027e762000acb5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b8615620027f857620027f862001d95565b50505050620019e460018055565b60685460ff1662002843576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000ae2576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6200295c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620033089092919063ffffffff16565b80519091501562001d9057808060200190518101906200297d91906200432b565b62001d90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200146b565b60026001540362002a79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200146b565b6002600155565b5f62002a90600482848662004349565b62002a9b9162004372565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002d15575f80808080808062002afd896004818d62004349565b81019062002b0c9190620043bb565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002b80576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002bd0576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002c0a576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002cc5919062003d79565b5f604051808303815f865af19150503d805f811462002d00576040519150601f19603f3d011682016040523d82523d5f602084013e62002d05565b606091505b5050505050505050505062000ae2565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002d91576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080808080808062002da88a6004818e62004349565b81019062002db7919062004411565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002e2d576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002e7d576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002f41919062003d79565b5f604051808303815f865af19150503d805f811462002f7c576040519150601f19603f3d011682016040523d82523d5f602084013e62002f81565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620015f79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002126565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162003076919062003d79565b5f60405180830381855afa9150503d805f8114620030b0576040519150601f19603f3d011682016040523d82523d5f602084013e620030b5565b606091505b509150915081620030fc576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001be6565b62001be68162003318565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff8616916200318a919062003d79565b5f60405180830381855afa9150503d805f8114620031c4576040519150601f19603f3d011682016040523d82523d5f602084013e620031c9565b606091505b509150915081620030fc576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001be6565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff86169162003292919062003d79565b5f60405180830381855afa9150503d805f8114620032cc576040519150601f19603f3d011682016040523d82523d5f602084013e620032d1565b606091505b5091509150818015620032e5575080516020145b620032f257601262001be6565b8080602001905181019062001be6919062004498565b606062001be684845f8562003503565b606060408251106200333a5781806020019051810190620008bc9190620044b6565b8151602003620034c5575f5b6020811080156200339157508281815181106200336757620033676200400e565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620033ac5780620033a38162004068565b91505062003346565b805f03620033ef57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff8111156200340c576200340c62003d28565b6040519080825280601f01601f19166020018201604052801562003437576020820181803683370190505b5090505f5b82811015620034bd578481815181106200345a576200345a6200400e565b602001015160f81c60f81b8282815181106200347a576200347a6200400e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620034b48162004068565b9150506200343c565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200146b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051620035c1919062003d79565b5f6040518083038185875af1925050503d805f8114620035fd576040519150601f19603f3d011682016040523d82523d5f602084013e62003602565b606091505b5091509150620036158783838762003620565b979650505050505050565b60608315620036ba5782515f03620036b25773ffffffffffffffffffffffffffffffffffffffff85163b620036b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200146b565b508162001be6565b62001be68383815115620036d15781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200146b919062004531565b611b0d806200454683390190565b803563ffffffff81168114620034fe575f80fd5b73ffffffffffffffffffffffffffffffffffffffff8116811462001b03575f80fd5b5f80604083850312156200375d575f80fd5b620037688362003715565b915060208301356200377a8162003729565b809150509250929050565b801515811462001b03575f80fd5b5f8083601f840112620037a4575f80fd5b50813567ffffffffffffffff811115620037bc575f80fd5b602083019150836020828501011115620037d4575f80fd5b9250929050565b5f805f805f60808688031215620037f0575f80fd5b620037fb8662003715565b945060208601356200380d8162003729565b935060408601356200381f8162003785565b9250606086013567ffffffffffffffff8111156200383b575f80fd5b620038498882890162003793565b969995985093965092949392505050565b5f602082840312156200386b575f80fd5b5035919050565b5f6020828403121562003883575f80fd5b6200388e8262003715565b9392505050565b806104008101831015620008bc575f80fd5b5f805f805f805f805f805f6105208c8e031215620038c3575f80fd5b620038cf8d8d62003895565b9a50620038e06104008d0162003715565b99506104208c013598506104408c01359750620039016104608d0162003715565b96506104808c0135620039148162003729565b9550620039256104a08d0162003715565b94506104c08c0135620039388162003729565b93506104e08c013592506105008c013567ffffffffffffffff8111156200395d575f80fd5b6200396b8e828f0162003793565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562003996575f80fd5b81356200388e8162003729565b60ff8116811462001b03575f80fd5b5f805f805f805f60e0888a031215620039c9575f80fd5b8735620039d681620039a3565b9650620039e66020890162003715565b95506040880135620039f88162003729565b945062003a086060890162003715565b9350608088013562003a1a8162003729565b9699959850939692959460a0840135945060c09093013592915050565b5f805f6060848603121562003a4a575f80fd5b62003a558462003715565b9250602084013562003a678162003729565b9150604084013562003a798162003729565b809150509250925092565b5f805f610440848603121562003a98575f80fd5b8335925062003aab856020860162003895565b915062003abc610420850162003715565b90509250925092565b5f805f805f805f60a0888a03121562003adc575f80fd5b62003ae78862003715565b9650602088013562003af98162003729565b9550604088013567ffffffffffffffff8082111562003b16575f80fd5b62003b248b838c0162003793565b909750955060608a013591508082111562003b3d575f80fd5b5062003b4c8a828b0162003793565b909450925050608088013562003b6281620039a3565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003b89575f80fd5b62003b948862003715565b9650602088013562003ba68162003729565b955060408801359450606088013562003bbf8162003729565b9350608088013562003bd18162003785565b925060a088013567ffffffffffffffff81111562003bed575f80fd5b62003bfb8a828b0162003793565b989b979a50959850939692959293505050565b5f805f80610460858703121562003c23575f80fd5b8435935062003c36866020870162003895565b925062003c47610420860162003715565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003cff828501878962003c58565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003d7157818101518382015260200162003d57565b50505f910152565b5f825162003d8c81846020870162003d55565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003de05762003de062003d28565b604052919050565b5f67ffffffffffffffff82111562003e045762003e0462003d28565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011262003e40575f80fd5b813562003e5762003e518262003de8565b62003d96565b81815284602083860101111562003e6c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003e9b575f80fd5b833567ffffffffffffffff8082111562003eb3575f80fd5b62003ec18783880162003e30565b9450602086013591508082111562003ed7575f80fd5b5062003ee68682870162003e30565b925050604084013562003a7981620039a3565b5f815180845262003f1281602086016020860162003d55565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f62003f58606083018662003ef9565b828103602084015262003f6c818662003ef9565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200361560808301848662003c58565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f6200400460608301848662003c58565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036200409b576200409b6200403b565b5060010190565b606081525f620040b760608301878962003c58565b8281036020840152620040cc81868862003c58565b91505060ff831660408301529695505050505050565b5f8351620040f581846020880162003d55565b8351908301906200410b81836020880162003d55565b01949350505050565b600181815b808511156200417357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156200415757620041576200403b565b808516156200416557918102915b93841c939080029062004119565b509250929050565b5f826200418b57506001620008bc565b816200419957505f620008bc565b8160018114620041b25760028114620041bd57620041dd565b6001915050620008bc565b60ff841115620041d157620041d16200403b565b50506001821b620008bc565b5060208310610133831016604e8410600b841016171562004202575081810a620008bc565b6200420e838362004114565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156200424357620042436200403b565b029392505050565b5f6200388e83836200417b565b81810381811115620008bc57620008bc6200403b565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f60208284031215620042ac575f80fd5b5051919050565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620043128285018762003ef9565b925080851660e085015250509998505050505050505050565b5f602082840312156200433c575f80fd5b81516200388e8162003785565b5f808585111562004358575f80fd5b8386111562004365575f80fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620043b35780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215620043d2575f80fd5b8735620043df8162003729565b96506020880135620043f18162003729565b95506040880135945060608801359350608088013562003a1a81620039a3565b5f805f805f805f80610100898b0312156200442a575f80fd5b8835620044378162003729565b97506020890135620044498162003729565b965060408901359550606089013594506080890135620044698162003785565b935060a08901356200447b81620039a3565b979a969950949793969295929450505060c08201359160e0013590565b5f60208284031215620044a9575f80fd5b81516200388e81620039a3565b5f60208284031215620044c7575f80fd5b815167ffffffffffffffff811115620044de575f80fd5b8201601f81018413620044ef575f80fd5b80516200450062003e518262003de8565b81815285602083850101111562004515575f80fd5b6200452882602083016020860162003d55565b95945050505050565b602081525f6200388e602083018462003ef956fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a26469706673582212209b6ce339e0782833785e55be567c47a7623fa392322ca07d1904952201d6aca964736f6c63430008140033", + "deployedBytecode": "0x608060405260043610620001eb575f3560e01c806379e2cf971162000106578063bab161bf116200009e578063dbc16976116200006a578063dbc169761462000734578063ee25560b146200074b578063f2fde38b146200077a578063fb570834146200079e575f80fd5b8063bab161bf1462000672578063be5831c714620006ab578063cd58657914620006e6578063d02103ca14620006fd575f80fd5b80638da5cb5b11620000de5780638da5cb5b14620005c857806391e57e2d14620005f45780639e34070f146200060b578063aaa13cc2146200064e575f80fd5b806379e2cf97146200054857806381b1c174146200055f57806383f2440314620005a4575f80fd5b80632d2c9d9411620001865780633e19704311620001525780633e19704314620004045780635ca1e16514620004f6578063647c576c146200050d578063715018a61462000531575f80fd5b80632d2c9d9414620003055780632dfdf0b51462000329578063318aee3d146200034f57806334ac9cf214620003d6575f80fd5b8063240ff37811620001c6578063240ff37814620002825780632b5e42e714620002995780632c3f58cd14620002bd5780632cffd02e14620002e1575f80fd5b806315064c9614620001ef5780632072f6c5146200021f57806322e95f2c1462000238575b5f80fd5b348015620001fb575f80fd5b506068546200020a9060ff1681565b60405190151581526020015b60405180910390f35b3480156200022b575f80fd5b5062000236620007c2565b005b34801562000244575f80fd5b506200025c620002563660046200374b565b62000820565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200162000216565b6200023662000293366004620037db565b620008c2565b348015620002a5575f80fd5b5062000236620002b73660046200385a565b62000ae9565b348015620002c9575f80fd5b5062000236620002db36600462003872565b62000af8565b348015620002ed575f80fd5b5062000236620002ff366004620038a7565b62000b3e565b34801562000311575f80fd5b506200023662000323366004620038a7565b620010c3565b34801562000335575f80fd5b506200034060535481565b60405190815260200162000216565b3480156200035b575f80fd5b50620003a46200036d36600462003985565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff90911660208301520162000216565b348015620003e2575f80fd5b50606c546200025c9073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000410575f80fd5b506200034062000422366004620039b2565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b34801562000502575f80fd5b5062000340620012c3565b34801562000519575f80fd5b50620002366200052b36600462003a37565b620013a8565b3480156200053d575f80fd5b5062000236620015fd565b34801562000554575f80fd5b506200023662001612565b3480156200056b575f80fd5b506200025c6200057d3660046200385a565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005b0575f80fd5b5062000340620005c236600462003a84565b6200164c565b348015620005d4575f80fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff166200025c565b34801562000600575f80fd5b506200034060d15481565b34801562000617575f80fd5b506200020a620006293660046200385a565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b3480156200065a575f80fd5b506200025c6200066c36600462003ac5565b6200172f565b3480156200067e575f80fd5b506068546200069590610100900463ffffffff1681565b60405163ffffffff909116815260200162000216565b348015620006b7575f80fd5b506068546200069590790100000000000000000000000000000000000000000000000000900463ffffffff1681565b62000236620006f736600462003b72565b62001919565b34801562000709575f80fd5b506068546200025c9065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000740575f80fd5b5062000236620019ed565b34801562000757575f80fd5b5062000340620007693660046200385a565b60696020525f908152604090205481565b34801562000786575f80fd5b50620002366200079836600462003985565b62001a49565b348015620007aa575f80fd5b506200020a620007bc36600462003c0e565b62001b06565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462000814576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200081e62001bee565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff161562000900576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620009265750600263ffffffff861610155b156200095e576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009b49998979695949392919062003c9f565b60405180910390a162000ad162000acb6001606860019054906101000a900463ffffffff16338989348989604051620009ef92919062003d19565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001c81565b821562000ae25762000ae262001d95565b5050505050565b62000af362001e65565b60d155565b62000b0262001e65565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b7c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b928b8b8b8b8b8b8b8b8b8b8b5f62001ee8565b73ffffffffffffffffffffffffffffffffffffffff861662000c6a57604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000be6919062003d79565b5f6040518083038185875af1925050503d805f811462000c22576040519150601f19603f3d011682016040523d82523d5f602084013e62000c27565b606091505b505090508062000c63576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506200104b565b60685463ffffffff61010090910481169088160362000cac5762000ca673ffffffffffffffffffffffffffffffffffffffff87168585620020d3565b6200104b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000fc2575f808062000d7e8688018862003e88565b9250925092505f8584848460405162000d979062003707565b62000da59392919062003f44565b8190604051809103905ff590508015801562000dc3573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000e36575f80fd5b505af115801562000e49573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000fb095949392919062003f80565b60405180910390a15050505062001048565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562001030575f80fd5b505af115801562001043573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562001101576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620011188b8b8b8b8b8b8b8b8b8b8b600162001ee8565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a86866040516024016200114a949392919062003fc7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f20000000000000000000000000000000000000000000000000000000017905251620011cd919062003d79565b5f6040518083038185875af1925050503d805f811462001209576040519150601f19603f3d011682016040523d82523d5f602084013e6200120e565b606091505b50509050806200124a576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200139f578083901c600116600103620013305760338160208110620012fc57620012fc6200400e565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200135d565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013969062004068565b915050620012cd565b50919392505050565b5f54610100900460ff1615808015620013c757505f54600160ff909116105b80620013e25750303b158015620013e257505f5460ff166001145b62001474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014d1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d15562001594620021a9565b8015620015f7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6200160762001e65565b6200081e5f62002247565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff1610156200081e576200081e62001d95565b5f83815b60208110156200172657600163ffffffff8516821c81169003620016c2578481602081106200168357620016836200400e565b602002013582604051602001620016a4929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001711565b81858260208110620016d857620016d86200400e565b6020020135604051602001620016f8929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806200171d8162004068565b91505062001650565b50949350505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180602001620017c39062003707565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f9091011660408190526200180e908d908d908d908d908d90602001620040a2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526200184c9291602001620040e2565b60405160208183030381529060405280519060200120604051602001620018d594939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d154341115620019d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200146b565b620019e487878787878787620022bd565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001a3f576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200081e62002806565b62001a5362001e65565b73ffffffffffffffffffffffffffffffffffffffff811662001af8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200146b565b62001b038162002247565b50565b5f84815b602081101562001be057600163ffffffff8616821c8116900362001b7c5785816020811062001b3d5762001b3d6200400e565b60200201358260405160200162001b5e929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001bcb565b8186826020811062001b925762001b926200400e565b602002013560405160200162001bb2929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001bd78162004068565b91505062001b0a565b50821490505b949350505050565b60685460ff161562001c2c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001c92602060026200424b565b62001c9e919062004258565b6053541062001cd9576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001cea9062004068565b918290555090505f5b602081101562001d85578082901c60011660010362001d2b57826033826020811062001d235762001d236200400e565b015550505050565b6033816020811062001d415762001d416200400e565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001d7c9062004068565b91505062001cf3565b5062001d906200426e565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001e1b620012c3565b6040518263ffffffff1660e01b815260040162001e3a91815260200190565b5f604051808303815f87803b15801562001e52575f80fd5b505af1158015620015f7573d5f803e3d5ffd5b609f5473ffffffffffffffffffffffffffffffffffffffff1633146200081e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200146b565b62001ef98b63ffffffff1662002895565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af115801562001f98573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001fbe91906200429b565b9050805f0362001ff9576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462002043576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff166200206057508962002063565b508a5b6200208c62002083848c8c8c8c8c8c8c604051620009ef92919062003d19565b8f8f8462001b06565b620020c3576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001d909084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152620028f9565b5f54610100900460ff1662002241576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200146b565b6200081e335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60685460ff1615620022fb576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200230562002a0b565b60685463ffffffff8881166101009092041614806200232b5750600263ffffffff881610155b1562002363576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff8816620023c757883414620023be576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f9250620026b4565b341562002400576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620024e9576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b158015620024bf575f80fd5b505af1158015620024d2573d5f803e3d5ffd5b5050505080602001519450805f01519350620026b2565b8515620024fe57620024fe898b898962002a80565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa15801562002569573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200258f91906200429b565b9050620025b573ffffffffffffffffffffffffffffffffffffffff8b1633308e62002f93565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa15801562002620573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200264691906200429b565b905062002654828262004258565b6068548c9850610100900463ffffffff1696509350620026748762002ff3565b6200267f8c62003107565b6200268a8d62003210565b6040516020016200269e9392919062003f44565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620026f5989796959493929190620042b3565b60405180910390a1620027e762000acb5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b8615620027f857620027f862001d95565b50505050620019e460018055565b60685460ff1662002843576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000ae2576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6200295c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620033089092919063ffffffff16565b80519091501562001d9057808060200190518101906200297d91906200432b565b62001d90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200146b565b60026001540362002a79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200146b565b6002600155565b5f62002a90600482848662004349565b62002a9b9162004372565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002d15575f80808080808062002afd896004818d62004349565b81019062002b0c9190620043bb565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002b80576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002bd0576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002c0a576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002cc5919062003d79565b5f604051808303815f865af19150503d805f811462002d00576040519150601f19603f3d011682016040523d82523d5f602084013e62002d05565b606091505b5050505050505050505062000ae2565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002d91576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080808080808062002da88a6004818e62004349565b81019062002db7919062004411565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002e2d576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002e7d576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002f41919062003d79565b5f604051808303815f865af19150503d805f811462002f7c576040519150601f19603f3d011682016040523d82523d5f602084013e62002f81565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620015f79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002126565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162003076919062003d79565b5f60405180830381855afa9150503d805f8114620030b0576040519150601f19603f3d011682016040523d82523d5f602084013e620030b5565b606091505b509150915081620030fc576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001be6565b62001be68162003318565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff8616916200318a919062003d79565b5f60405180830381855afa9150503d805f8114620031c4576040519150601f19603f3d011682016040523d82523d5f602084013e620031c9565b606091505b509150915081620030fc576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001be6565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff86169162003292919062003d79565b5f60405180830381855afa9150503d805f8114620032cc576040519150601f19603f3d011682016040523d82523d5f602084013e620032d1565b606091505b5091509150818015620032e5575080516020145b620032f257601262001be6565b8080602001905181019062001be6919062004498565b606062001be684845f8562003503565b606060408251106200333a5781806020019051810190620008bc9190620044b6565b8151602003620034c5575f5b6020811080156200339157508281815181106200336757620033676200400e565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620033ac5780620033a38162004068565b91505062003346565b805f03620033ef57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff8111156200340c576200340c62003d28565b6040519080825280601f01601f19166020018201604052801562003437576020820181803683370190505b5090505f5b82811015620034bd578481815181106200345a576200345a6200400e565b602001015160f81c60f81b8282815181106200347a576200347a6200400e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620034b48162004068565b9150506200343c565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200146b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051620035c1919062003d79565b5f6040518083038185875af1925050503d805f8114620035fd576040519150601f19603f3d011682016040523d82523d5f602084013e62003602565b606091505b5091509150620036158783838762003620565b979650505050505050565b60608315620036ba5782515f03620036b25773ffffffffffffffffffffffffffffffffffffffff85163b620036b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200146b565b508162001be6565b62001be68383815115620036d15781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200146b919062004531565b611b0d806200454683390190565b803563ffffffff81168114620034fe575f80fd5b73ffffffffffffffffffffffffffffffffffffffff8116811462001b03575f80fd5b5f80604083850312156200375d575f80fd5b620037688362003715565b915060208301356200377a8162003729565b809150509250929050565b801515811462001b03575f80fd5b5f8083601f840112620037a4575f80fd5b50813567ffffffffffffffff811115620037bc575f80fd5b602083019150836020828501011115620037d4575f80fd5b9250929050565b5f805f805f60808688031215620037f0575f80fd5b620037fb8662003715565b945060208601356200380d8162003729565b935060408601356200381f8162003785565b9250606086013567ffffffffffffffff8111156200383b575f80fd5b620038498882890162003793565b969995985093965092949392505050565b5f602082840312156200386b575f80fd5b5035919050565b5f6020828403121562003883575f80fd5b6200388e8262003715565b9392505050565b806104008101831015620008bc575f80fd5b5f805f805f805f805f805f6105208c8e031215620038c3575f80fd5b620038cf8d8d62003895565b9a50620038e06104008d0162003715565b99506104208c013598506104408c01359750620039016104608d0162003715565b96506104808c0135620039148162003729565b9550620039256104a08d0162003715565b94506104c08c0135620039388162003729565b93506104e08c013592506105008c013567ffffffffffffffff8111156200395d575f80fd5b6200396b8e828f0162003793565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562003996575f80fd5b81356200388e8162003729565b60ff8116811462001b03575f80fd5b5f805f805f805f60e0888a031215620039c9575f80fd5b8735620039d681620039a3565b9650620039e66020890162003715565b95506040880135620039f88162003729565b945062003a086060890162003715565b9350608088013562003a1a8162003729565b9699959850939692959460a0840135945060c09093013592915050565b5f805f6060848603121562003a4a575f80fd5b62003a558462003715565b9250602084013562003a678162003729565b9150604084013562003a798162003729565b809150509250925092565b5f805f610440848603121562003a98575f80fd5b8335925062003aab856020860162003895565b915062003abc610420850162003715565b90509250925092565b5f805f805f805f60a0888a03121562003adc575f80fd5b62003ae78862003715565b9650602088013562003af98162003729565b9550604088013567ffffffffffffffff8082111562003b16575f80fd5b62003b248b838c0162003793565b909750955060608a013591508082111562003b3d575f80fd5b5062003b4c8a828b0162003793565b909450925050608088013562003b6281620039a3565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003b89575f80fd5b62003b948862003715565b9650602088013562003ba68162003729565b955060408801359450606088013562003bbf8162003729565b9350608088013562003bd18162003785565b925060a088013567ffffffffffffffff81111562003bed575f80fd5b62003bfb8a828b0162003793565b989b979a50959850939692959293505050565b5f805f80610460858703121562003c23575f80fd5b8435935062003c36866020870162003895565b925062003c47610420860162003715565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003cff828501878962003c58565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003d7157818101518382015260200162003d57565b50505f910152565b5f825162003d8c81846020870162003d55565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003de05762003de062003d28565b604052919050565b5f67ffffffffffffffff82111562003e045762003e0462003d28565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011262003e40575f80fd5b813562003e5762003e518262003de8565b62003d96565b81815284602083860101111562003e6c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003e9b575f80fd5b833567ffffffffffffffff8082111562003eb3575f80fd5b62003ec18783880162003e30565b9450602086013591508082111562003ed7575f80fd5b5062003ee68682870162003e30565b925050604084013562003a7981620039a3565b5f815180845262003f1281602086016020860162003d55565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f62003f58606083018662003ef9565b828103602084015262003f6c818662003ef9565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200361560808301848662003c58565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f6200400460608301848662003c58565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036200409b576200409b6200403b565b5060010190565b606081525f620040b760608301878962003c58565b8281036020840152620040cc81868862003c58565b91505060ff831660408301529695505050505050565b5f8351620040f581846020880162003d55565b8351908301906200410b81836020880162003d55565b01949350505050565b600181815b808511156200417357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156200415757620041576200403b565b808516156200416557918102915b93841c939080029062004119565b509250929050565b5f826200418b57506001620008bc565b816200419957505f620008bc565b8160018114620041b25760028114620041bd57620041dd565b6001915050620008bc565b60ff841115620041d157620041d16200403b565b50506001821b620008bc565b5060208310610133831016604e8410600b841016171562004202575081810a620008bc565b6200420e838362004114565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156200424357620042436200403b565b029392505050565b5f6200388e83836200417b565b81810381811115620008bc57620008bc6200403b565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f60208284031215620042ac575f80fd5b5051919050565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620043128285018762003ef9565b925080851660e085015250509998505050505050505050565b5f602082840312156200433c575f80fd5b81516200388e8162003785565b5f808585111562004358575f80fd5b8386111562004365575f80fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620043b35780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215620043d2575f80fd5b8735620043df8162003729565b96506020880135620043f18162003729565b95506040880135945060608801359350608088013562003a1a81620039a3565b5f805f805f805f80610100898b0312156200442a575f80fd5b8835620044378162003729565b97506020890135620044498162003729565b965060408901359550606089013594506080890135620044698162003785565b935060a08901356200447b81620039a3565b979a969950949793969295929450505060c08201359160e0013590565b5f60208284031215620044a9575f80fd5b81516200388e81620039a3565b5f60208284031215620044c7575f80fd5b815167ffffffffffffffff811115620044de575f80fd5b8201601f81018413620044ef575f80fd5b80516200450062003e518262003de8565b81815285602083850101111562004515575f80fd5b6200452882602083016020860162003d55565b95945050505050565b602081525f6200388e602083018462003ef956fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a26469706673582212209b6ce339e0782833785e55be567c47a7623fa392322ca07d1904952201d6aca964736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMGlobalExitRoot.json b/compiled-contracts/PolygonZkEVMGlobalExitRoot.json index a2d289423..08bcf6da5 100644 --- a/compiled-contracts/PolygonZkEVMGlobalExitRoot.json +++ b/compiled-contracts/PolygonZkEVMGlobalExitRoot.json @@ -19,6 +19,11 @@ "stateMutability": "nonpayable", "type": "constructor" }, + { + "inputs": [], + "name": "MerkleTreeFull", + "type": "error" + }, { "inputs": [], "name": "OnlyAllowedContracts", @@ -56,6 +61,48 @@ "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", @@ -69,6 +116,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "getRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -139,10 +199,44 @@ "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": "0x60c060405234801561000f575f80fd5b506040516103e13803806103e183398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a0516103226100bf5f395f818160e301526101b601525f818161012f015261016d01526103225ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c806333d6247d1161005857806333d6247d146100c15780633ed691ef146100d65780635ec6a8df146100de578063a3c573eb1461012a575f80fd5b806301fd90441461007e578063257b363214610099578063319cf735146100b8575b5f80fd5b6100865f5481565b6040519081526020015b60405180910390f35b6100866100a73660046102d5565b60026020525f908152604090205481565b61008660015481565b6100d46100cf3660046102d5565b610151565b005b61008661029b565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610090565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361019f575060018290558161021a565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101e8575f83905582915061021a565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f8181526002602052604081205491925003610295575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6102d06001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f602082840312156102e5575f80fd5b503591905056fea26469706673582212205b8fae68ff3c2dfc257497be9184a2e772688dbece1343c3dc2e8c1923291be864736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061007a575f3560e01c806333d6247d1161005857806333d6247d146100c15780633ed691ef146100d65780635ec6a8df146100de578063a3c573eb1461012a575f80fd5b806301fd90441461007e578063257b363214610099578063319cf735146100b8575b5f80fd5b6100865f5481565b6040519081526020015b60405180910390f35b6100866100a73660046102d5565b60026020525f908152604090205481565b61008660015481565b6100d46100cf3660046102d5565b610151565b005b61008661029b565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610090565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361019f575060018290558161021a565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101e8575f83905582915061021a565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f8181526002602052604081205491925003610295575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6102d06001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f602082840312156102e5575f80fd5b503591905056fea26469706673582212205b8fae68ff3c2dfc257497be9184a2e772688dbece1343c3dc2e8c1923291be864736f6c63430008140033", + "bytecode": "0x60c060405234801561000f575f80fd5b50604051610aa2380380610aa283398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a0516109e26100c05f395f818161013f015261024901525f818161019e015261020001526109e25ff3fe608060405234801561000f575f80fd5b50600436106100c4575f3560e01c80633ed691ef1161007d57806383f244031161005857806383f2440314610186578063a3c573eb14610199578063fb570834146101c0575f80fd5b80633ed691ef1461012a5780635ca1e165146101325780635ec6a8df1461013a575f80fd5b80632dfdf0b5116100ad5780632dfdf0b514610103578063319cf7351461010c57806333d6247d14610115575f80fd5b806301fd9044146100c8578063257b3632146100e4575b5f80fd5b6100d1602b5481565b6040519081526020015b60405180910390f35b6100d16100f23660046106ea565b602d6020525f908152604090205481565b6100d160205481565b6100d1602c5481565b6101286101233660046106ea565b6101e3565b005b6100d1610318565b6100d161032c565b6101617f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100db565b6100d161019436600461072a565b610335565b6101617f000000000000000000000000000000000000000000000000000000000000000081565b6101d36101ce366004610766565b61040a565b60405190151581526020016100db565b602b54602c5473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102325750602c829055816102ae565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361027c57602b8390558291506102ae565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6102b982846104e2565b5f818152602d602052604081205491925003610312575f818152602d602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a361031281610511565b50505050565b5f610327602c54602b546104e2565b905090565b5f61032761060f565b5f83815b602081101561040157600163ffffffff8516821c811690036103a457848160208110610367576103676107ab565b602002013582604051602001610387929190918252602082015260400190565b6040516020818303038152906040528051906020012091506103ef565b818582602081106103b7576103b76107ab565b60200201356040516020016103d6929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806103f981610805565b915050610339565b50949350505050565b5f84815b60208110156104d657600163ffffffff8616821c811690036104795785816020811061043c5761043c6107ab565b60200201358260405160200161045c929190918252602082015260400190565b6040516020818303038152906040528051906020012091506104c4565b8186826020811061048c5761048c6107ab565b60200201356040516020016104ab929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806104ce81610805565b91505061040e565b50909114949350505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b8060016105206020600261095a565b61052a919061096c565b60205410610564576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60205f815461057390610805565b918290555090505f5b6020811015610601578082901c6001166001036105ae57825f82602081106105a6576105a66107ab565b015550505050565b5f81602081106105c0576105c06107ab565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925080806105f990610805565b91505061057c565b5061060a61097f565b505050565b6020545f90819081805b60208110156106e1578083901c600116600103610675575f8160208110610642576106426107ab565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506106a2565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806106d990610805565b915050610619565b50919392505050565b5f602082840312156106fa575f80fd5b5035919050565b80610400810183101561050b575f80fd5b803563ffffffff81168114610725575f80fd5b919050565b5f805f610440848603121561073d575f80fd5b8335925061074e8560208601610701565b915061075d6104208501610712565b90509250925092565b5f805f80610460858703121561077a575f80fd5b8435935061078b8660208701610701565b925061079a6104208601610712565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610835576108356107d8565b5060010190565b600181815b8085111561089557817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561087b5761087b6107d8565b8085161561088857918102915b93841c9390800290610841565b509250929050565b5f826108ab5750600161050b565b816108b757505f61050b565b81600181146108cd57600281146108d7576108f3565b600191505061050b565b60ff8411156108e8576108e86107d8565b50506001821b61050b565b5060208310610133831016604e8410600b8410161715610916575081810a61050b565b610920838361083c565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610952576109526107d8565b029392505050565b5f610965838361089d565b9392505050565b8181038181111561050b5761050b6107d8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea2646970667358221220620178600a1135c1880ab6872ead11bab365c627812a5c5944b802aa54e9004364736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106100c4575f3560e01c80633ed691ef1161007d57806383f244031161005857806383f2440314610186578063a3c573eb14610199578063fb570834146101c0575f80fd5b80633ed691ef1461012a5780635ca1e165146101325780635ec6a8df1461013a575f80fd5b80632dfdf0b5116100ad5780632dfdf0b514610103578063319cf7351461010c57806333d6247d14610115575f80fd5b806301fd9044146100c8578063257b3632146100e4575b5f80fd5b6100d1602b5481565b6040519081526020015b60405180910390f35b6100d16100f23660046106ea565b602d6020525f908152604090205481565b6100d160205481565b6100d1602c5481565b6101286101233660046106ea565b6101e3565b005b6100d1610318565b6100d161032c565b6101617f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100db565b6100d161019436600461072a565b610335565b6101617f000000000000000000000000000000000000000000000000000000000000000081565b6101d36101ce366004610766565b61040a565b60405190151581526020016100db565b602b54602c5473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102325750602c829055816102ae565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361027c57602b8390558291506102ae565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6102b982846104e2565b5f818152602d602052604081205491925003610312575f818152602d602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a361031281610511565b50505050565b5f610327602c54602b546104e2565b905090565b5f61032761060f565b5f83815b602081101561040157600163ffffffff8516821c811690036103a457848160208110610367576103676107ab565b602002013582604051602001610387929190918252602082015260400190565b6040516020818303038152906040528051906020012091506103ef565b818582602081106103b7576103b76107ab565b60200201356040516020016103d6929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806103f981610805565b915050610339565b50949350505050565b5f84815b60208110156104d657600163ffffffff8616821c811690036104795785816020811061043c5761043c6107ab565b60200201358260405160200161045c929190918252602082015260400190565b6040516020818303038152906040528051906020012091506104c4565b8186826020811061048c5761048c6107ab565b60200201356040516020016104ab929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806104ce81610805565b91505061040e565b50909114949350505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b8060016105206020600261095a565b61052a919061096c565b60205410610564576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60205f815461057390610805565b918290555090505f5b6020811015610601578082901c6001166001036105ae57825f82602081106105a6576105a66107ab565b015550505050565b5f81602081106105c0576105c06107ab565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925080806105f990610805565b91505061057c565b5061060a61097f565b505050565b6020545f90819081805b60208110156106e1578083901c600116600103610675575f8160208110610642576106426107ab565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506106a2565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806106d990610805565b915050610619565b50919392505050565b5f602082840312156106fa575f80fd5b5035919050565b80610400810183101561050b575f80fd5b803563ffffffff81168114610725575f80fd5b919050565b5f805f610440848603121561073d575f80fd5b8335925061074e8560208601610701565b915061075d6104208501610712565b90509250925092565b5f805f80610460858703121561077a575f80fd5b8435935061078b8660208701610701565b925061079a6104208601610712565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610835576108356107d8565b5060010190565b600181815b8085111561089557817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561087b5761087b6107d8565b8085161561088857918102915b93841c9390800290610841565b509250929050565b5f826108ab5750600161050b565b816108b757505f61050b565b81600181146108cd57600281146108d7576108f3565b600191505061050b565b60ff8411156108e8576108e86107d8565b50506001821b61050b565b5060208310610133831016604e8410600b8410161715610916575081810a61050b565b610920838361083c565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610952576109526107d8565b029392505050565b5f610965838361089d565b9392505050565b8181038181111561050b5761050b6107d8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea2646970667358221220620178600a1135c1880ab6872ead11bab365c627812a5c5944b802aa54e9004364736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMGlobalExitRootMock.json b/compiled-contracts/PolygonZkEVMGlobalExitRootMock.json index 6bde95a70..1ddb328bc 100644 --- a/compiled-contracts/PolygonZkEVMGlobalExitRootMock.json +++ b/compiled-contracts/PolygonZkEVMGlobalExitRootMock.json @@ -19,6 +19,11 @@ "stateMutability": "nonpayable", "type": "constructor" }, + { + "inputs": [], + "name": "MerkleTreeFull", + "type": "error" + }, { "inputs": [], "name": "OnlyAllowedContracts", @@ -56,6 +61,48 @@ "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", @@ -69,6 +116,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "getRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -170,10 +230,44 @@ "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": "0x60c060405234801561000f575f80fd5b5060405161047838038061047883398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a0516103b86100c05f395f818161013a015261022c01525f818161018601526101e301526103b85ff3fe608060405234801561000f575f80fd5b506004361061009f575f3560e01c806333d6247d116100725780635bcef673116100585780635bcef673146101165780635ec6a8df14610135578063a3c573eb14610181575f80fd5b806333d6247d146100fb5780633ed691ef1461010e575f80fd5b806301fd9044146100a3578063051a9e28146100be578063257b3632146100d3578063319cf735146100f2575b5f80fd5b6100ab5f5481565b6040519081526020015b60405180910390f35b6100d16100cc36600461034b565b6101a8565b005b6100ab6100e136600461034b565b60026020525f908152604090205481565b6100ab60015481565b6100d161010936600461034b565b6101c7565b6100ab610311565b6100d1610124366004610362565b5f9182526002602052604090912055565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b8060025f6101b4610311565b815260208101919091526040015f205550565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102155750600182905581610290565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361025e575f839055829150610290565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f818152600260205260408120549192500361030b575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6103466001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f6020828403121561035b575f80fd5b5035919050565b5f8060408385031215610373575f80fd5b5050803592602090910135915056fea26469706673582212200799b5f60aa8eaf6d49205025cc41bfba78ce4f6ad614164e5da3c0bdc94810464736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061009f575f3560e01c806333d6247d116100725780635bcef673116100585780635bcef673146101165780635ec6a8df14610135578063a3c573eb14610181575f80fd5b806333d6247d146100fb5780633ed691ef1461010e575f80fd5b806301fd9044146100a3578063051a9e28146100be578063257b3632146100d3578063319cf735146100f2575b5f80fd5b6100ab5f5481565b6040519081526020015b60405180910390f35b6100d16100cc36600461034b565b6101a8565b005b6100ab6100e136600461034b565b60026020525f908152604090205481565b6100ab60015481565b6100d161010936600461034b565b6101c7565b6100ab610311565b6100d1610124366004610362565b5f9182526002602052604090912055565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b8060025f6101b4610311565b815260208101919091526040015f205550565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102155750600182905581610290565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361025e575f839055829150610290565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f818152600260205260408120549192500361030b575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6103466001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f6020828403121561035b575f80fd5b5035919050565b5f8060408385031215610373575f80fd5b5050803592602090910135915056fea26469706673582212200799b5f60aa8eaf6d49205025cc41bfba78ce4f6ad614164e5da3c0bdc94810464736f6c63430008140033", + "bytecode": "0x60c060405234801561000f575f80fd5b50604051610b29380380610b2983398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a051610a696100c05f395f818161018701526102b001525f81816101e601526102670152610a695ff3fe608060405234801561000f575f80fd5b50600436106100da575f3560e01c80633ed691ef116100885780635ec6a8df116100635780635ec6a8df1461018257806383f24403146101ce578063a3c573eb146101e1578063fb57083414610208575f80fd5b80633ed691ef146101535780635bcef6731461015b5780635ca1e1651461017a575f80fd5b80632dfdf0b5116100b85780632dfdf0b51461012e578063319cf7351461013757806333d6247d14610140575f80fd5b806301fd9044146100de578063051a9e28146100fa578063257b36321461010f575b5f80fd5b6100e7602b5481565b6040519081526020015b60405180910390f35b61010d610108366004610751565b61022b565b005b6100e761011d366004610751565b602d6020525f908152604090205481565b6100e760205481565b6100e7602c5481565b61010d61014e366004610751565b61024a565b6100e761037f565b61010d610169366004610768565b5f918252602d602052604090912055565b6100e7610393565b6101a97f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f1565b6100e76101dc3660046107b1565b61039c565b6101a97f000000000000000000000000000000000000000000000000000000000000000081565b61021b6102163660046107ed565b610471565b60405190151581526020016100f1565b80602d5f61023761037f565b815260208101919091526040015f205550565b602b54602c5473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102995750602c82905581610315565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102e357602b839055829150610315565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6103208284610549565b5f818152602d602052604081205491925003610379575f818152602d602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a361037981610578565b50505050565b5f61038e602c54602b54610549565b905090565b5f61038e610676565b5f83815b602081101561046857600163ffffffff8516821c8116900361040b578481602081106103ce576103ce610832565b6020020135826040516020016103ee929190918252602082015260400190565b604051602081830303815290604052805190602001209150610456565b8185826020811061041e5761041e610832565b602002013560405160200161043d929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806104608161088c565b9150506103a0565b50949350505050565b5f84815b602081101561053d57600163ffffffff8616821c811690036104e0578581602081106104a3576104a3610832565b6020020135826040516020016104c3929190918252602082015260400190565b60405160208183030381529060405280519060200120915061052b565b818682602081106104f3576104f3610832565b6020020135604051602001610512929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806105358161088c565b915050610475565b50909114949350505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b806001610587602060026109e1565b61059191906109f3565b602054106105cb576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60205f81546105da9061088c565b918290555090505f5b6020811015610668578082901c60011660010361061557825f826020811061060d5761060d610832565b015550505050565b5f816020811061062757610627610832565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925080806106609061088c565b9150506105e3565b50610671610a06565b505050565b6020545f90819081805b6020811015610748578083901c6001166001036106dc575f81602081106106a9576106a9610832565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610709565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806107409061088c565b915050610680565b50919392505050565b5f60208284031215610761575f80fd5b5035919050565b5f8060408385031215610779575f80fd5b50508035926020909101359150565b806104008101831015610572575f80fd5b803563ffffffff811681146107ac575f80fd5b919050565b5f805f61044084860312156107c4575f80fd5b833592506107d58560208601610788565b91506107e46104208501610799565b90509250925092565b5f805f806104608587031215610801575f80fd5b843593506108128660208701610788565b92506108216104208601610799565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036108bc576108bc61085f565b5060010190565b600181815b8085111561091c57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109025761090261085f565b8085161561090f57918102915b93841c93908002906108c8565b509250929050565b5f8261093257506001610572565b8161093e57505f610572565b8160018114610954576002811461095e5761097a565b6001915050610572565b60ff84111561096f5761096f61085f565b50506001821b610572565b5060208310610133831016604e8410600b841016171561099d575081810a610572565b6109a783836108c3565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109d9576109d961085f565b029392505050565b5f6109ec8383610924565b9392505050565b818103818111156105725761057261085f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea2646970667358221220a98316094c188d66989b6db4315ee6329349bd8b58d17fd810172d0b0fb51ee264736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106100da575f3560e01c80633ed691ef116100885780635ec6a8df116100635780635ec6a8df1461018257806383f24403146101ce578063a3c573eb146101e1578063fb57083414610208575f80fd5b80633ed691ef146101535780635bcef6731461015b5780635ca1e1651461017a575f80fd5b80632dfdf0b5116100b85780632dfdf0b51461012e578063319cf7351461013757806333d6247d14610140575f80fd5b806301fd9044146100de578063051a9e28146100fa578063257b36321461010f575b5f80fd5b6100e7602b5481565b6040519081526020015b60405180910390f35b61010d610108366004610751565b61022b565b005b6100e761011d366004610751565b602d6020525f908152604090205481565b6100e760205481565b6100e7602c5481565b61010d61014e366004610751565b61024a565b6100e761037f565b61010d610169366004610768565b5f918252602d602052604090912055565b6100e7610393565b6101a97f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f1565b6100e76101dc3660046107b1565b61039c565b6101a97f000000000000000000000000000000000000000000000000000000000000000081565b61021b6102163660046107ed565b610471565b60405190151581526020016100f1565b80602d5f61023761037f565b815260208101919091526040015f205550565b602b54602c5473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102995750602c82905581610315565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102e357602b839055829150610315565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6103208284610549565b5f818152602d602052604081205491925003610379575f818152602d602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a361037981610578565b50505050565b5f61038e602c54602b54610549565b905090565b5f61038e610676565b5f83815b602081101561046857600163ffffffff8516821c8116900361040b578481602081106103ce576103ce610832565b6020020135826040516020016103ee929190918252602082015260400190565b604051602081830303815290604052805190602001209150610456565b8185826020811061041e5761041e610832565b602002013560405160200161043d929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806104608161088c565b9150506103a0565b50949350505050565b5f84815b602081101561053d57600163ffffffff8616821c811690036104e0578581602081106104a3576104a3610832565b6020020135826040516020016104c3929190918252602082015260400190565b60405160208183030381529060405280519060200120915061052b565b818682602081106104f3576104f3610832565b6020020135604051602001610512929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806105358161088c565b915050610475565b50909114949350505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b806001610587602060026109e1565b61059191906109f3565b602054106105cb576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60205f81546105da9061088c565b918290555090505f5b6020811015610668578082901c60011660010361061557825f826020811061060d5761060d610832565b015550505050565b5f816020811061062757610627610832565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925080806106609061088c565b9150506105e3565b50610671610a06565b505050565b6020545f90819081805b6020811015610748578083901c6001166001036106dc575f81602081106106a9576106a9610832565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610709565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806107409061088c565b915050610680565b50919392505050565b5f60208284031215610761575f80fd5b5035919050565b5f8060408385031215610779575f80fd5b50508035926020909101359150565b806104008101831015610572575f80fd5b803563ffffffff811681146107ac575f80fd5b919050565b5f805f61044084860312156107c4575f80fd5b833592506107d58560208601610788565b91506107e46104208501610799565b90509250925092565b5f805f806104608587031215610801575f80fd5b843593506108128660208701610788565b92506108216104208601610799565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036108bc576108bc61085f565b5060010190565b600181815b8085111561091c57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109025761090261085f565b8085161561090f57918102915b93841c93908002906108c8565b509250929050565b5f8261093257506001610572565b8161093e57505f610572565b8160018114610954576002811461095e5761097a565b6001915050610572565b60ff84111561096f5761096f61085f565b50506001821b610572565b5060208310610133831016604e8410600b841016171561099d575081810a610572565b6109a783836108c3565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109d9576109d961085f565b029392505050565b5f6109ec8383610924565b9392505050565b818103818111156105725761057261085f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea2646970667358221220a98316094c188d66989b6db4315ee6329349bd8b58d17fd810172d0b0fb51ee264736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMMock.json b/compiled-contracts/PolygonZkEVMMock.json index e122b9b6b..b2e23569d 100644 --- a/compiled-contracts/PolygonZkEVMMock.json +++ b/compiled-contracts/PolygonZkEVMMock.json @@ -746,6 +746,11 @@ "internalType": "address", "name": "sequencerAddress", "type": "address" + }, + { + "internalType": "bool", + "name": "isForced", + "type": "bool" } ], "name": "calculateAccInputHash", @@ -887,6 +892,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "gapLastTimestamp", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "getForcedBatchFee", @@ -1174,19 +1192,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "lastTimestamp", - "outputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "lastVerifiedBatch", @@ -1429,14 +1434,9 @@ }, { "internalType": "bytes32", - "name": "globalExitRoot", + "name": "forcedHistoricGlobalExitRoot", "type": "bytes32" }, - { - "internalType": "uint64", - "name": "timestamp", - "type": "uint64" - }, { "internalType": "uint64", "name": "minForcedTimestamp", @@ -1469,7 +1469,7 @@ }, { "internalType": "bytes32", - "name": "globalExitRoot", + "name": "forcedHistoricGlobalExitRoot", "type": "bytes32" }, { @@ -1478,7 +1478,7 @@ "type": "uint64" } ], - "internalType": "struct PolygonZkEVM.ForcedBatchData[]", + "internalType": "struct PolygonZkEVM.BatchData[]", "name": "batches", "type": "tuple[]" } @@ -1935,8 +1935,8 @@ "type": "function" } ], - "bytecode": "0x61014060405234801562000011575f80fd5b5060405162006f2038038062006f208339810160408190526200003491620000a2565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b039182166101005216610120526200012a565b6001600160a01b038116811462000083575f80fd5b50565b80516001600160401b03811681146200009d575f80fd5b919050565b5f805f805f8060c08789031215620000b8575f80fd5b8651620000c5816200006e565b6020880151909650620000d8816200006e565b6040880151909550620000eb816200006e565b6060880151909450620000fe816200006e565b92506200010e6080880162000086565b91506200011e60a0880162000086565b90509295509295509295565b60805160a05160c05160e0516101005161012051616d29620001f75f395f818161081501528181611a560152613e5601525f81816109a70152611a2c01525f818161096d015281816129e3015281816144e701526159e601525f8181610b380152818161170c01528181611bc801528181611d93015281816125f001528181612db101528181614757015261554301525f8181610bf801528181614eac01526152fa01525f8181610a75015281816129b1015281816132d90152818161472c0152614f980152616d295ff3fe608060405234801561000f575f80fd5b5060043610610475575f3560e01c80638c3d73011161025d578063c754c7ed11610148578063e7a7ed02116100c3578063f14916d611610093578063f851a44011610079578063f851a44014610c80578063f8b823e414610ca0578063fe16564f14610ca9575f80fd5b8063f14916d614610c5a578063f2fde38b14610c6d575f80fd5b8063e7a7ed0214610bc3578063e8bf92ed14610bf3578063eaeb077b14610c1a578063ed6b010414610c2d575f80fd5b8063d2e129f911610118578063d939b315116100fe578063d939b31514610b80578063dbc1697614610ba8578063e0d1744114610bb0575f80fd5b8063d2e129f914610b5a578063d8d1091b14610b6d575f80fd5b8063c754c7ed14610ac5578063c89e42df14610af1578063cfa8ed4714610b04578063d02103ca14610b33575f80fd5b8063ada8f919116101d8578063b4f77ea9116101a8578063ba58ae391161018e578063ba58ae3914610a97578063c0cad30214610aaa578063c0ed84e014610abd575f80fd5b8063b4f77ea914610a5d578063b6b0b09714610a70575f80fd5b8063ada8f9191461098f578063adc879e9146109a2578063afd23cbe146109c9578063b4d63f58146109f7575f80fd5b80639aa972a31161022d5780639c9f3dfe116102135780639c9f3dfe14610942578063a066215c14610955578063a3c573eb14610968575f80fd5b80639aa972a31461091c5780639b7967601461092f575f80fd5b80638c3d7301146108db5780638da5cb5b146108e357806396dc3d391461090157806399f5634e14610914575f80fd5b80634a1a89a71161037d578063621dd411116102f85780637215541a116102c8578063831c7ead116102ae578063831c7ead14610810578063837a473814610837578063841b24d7146108ab575f80fd5b80637215541a146107e95780637fcb3653146107fc575f80fd5b8063621dd4111461079c5780636b8616ce146107af5780636ff512cc146107ce578063715018a6146107e1575f80fd5b8063542028d51161034d5780635e9145c9116103335780635e9145c9146107795780635ec919581461078c5780636046916914610794575f80fd5b8063542028d5146106d0578063574f649e146106d8575f80fd5b80634a1a89a71461066b5780634a910e6a1461068b5780634e4877061461069e5780635392c5e0146106b1575f80fd5b8063267822471161040d578063383b3be8116103dd578063423fa856116103c3578063423fa8561461060f578063456052671461062f578063458c047714610657575f80fd5b8063383b3be8146105e9578063394218e9146105fc575f80fd5b8063267822471461055257806329878983146105975780632b0006fa146105c35780632c1f816a146105d6575f80fd5b806315064c961161044857806315064c96146104fb5780631816b7e51461051857806319d8ac611461052b578063220d78991461053f575f80fd5b80630a0d9fbe146104795780630eaa86ea146104b0578063107bf28c146104d157806310a01a72146104e6575b5f80fd5b606f5461049290610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6104c36104be366004615fac565b610cbc565b6040519081526020016104a7565b6104d961118c565b6040516104a79190616068565b6104f96104f4366004616097565b611218565b005b606f546105089060ff1681565b60405190151581526020016104a7565b6104f9610526366004616124565b6117c6565b6073546104929067ffffffffffffffff1681565b6104d961054d366004616145565b6118de565b607b546105729073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104a7565b6074546105729068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104f96105d136600461619f565b611ab4565b6104f96105e4366004616203565b611c7e565b6105086105f7366004616278565b611e86565b6104f961060a366004616278565b611edb565b6073546104929068010000000000000000900467ffffffffffffffff1681565b60735461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546104929067ffffffffffffffff1681565b6079546104929068010000000000000000900467ffffffffffffffff1681565b6104f9610699366004616278565b61205f565b6104f96106ac366004616278565b612112565b6104c36106bf366004616278565b60756020525f908152604090205481565b6104d9612296565b6104c36106e6366004616388565b835160209485012060408051808701979097528681019190915260608087019490945260c09290921b7fffffffffffffffff00000000000000000000000000000000000000000000000016608086015290911b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888401528051808403607c018152609c9093019052815191012090565b6104f961078736600461643d565b6122a3565b6104f9612a9c565b6104c3612b9b565b6104f96107aa36600461619f565b612bb0565b6104c36107bd366004616278565b60716020525f908152604090205481565b6104f96107dc36600461648d565b612f2e565b6104f9613003565b6104f96107f7366004616278565b613016565b6074546104929067ffffffffffffffff1681565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b61087f6108453660046164a6565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016104a7565b607954610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9613183565b60335473ffffffffffffffffffffffffffffffffffffffff16610572565b6104f961090f366004616278565b61324f565b6104c3613292565b6104f961092a366004616203565b6133e5565b6104f961093d366004616278565b613495565b6104f9610950366004616278565b6134e4565b6104f9610963366004616278565b613660565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f961099d36600461648d565b613766565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b606f546109e4906901000000000000000000900461ffff1681565b60405161ffff90911681526020016104a7565b610a37610a05366004616278565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016104a7565b6104f9610a6b366004616278565b61382a565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b610508610aa53660046164a6565b61383b565b6104f9610ab83660046164bd565b6138c3565b6104926138db565b607b546104929074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9610aff3660046164bd565b61392e565b606f54610572906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610b6836600461652d565b6139bb565b6104f9610b7b3660046165d8565b613ef9565b60795461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6104f9614494565b6104f9610bbe366004616617565b614568565b607354610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610c28366004616661565b6145f7565b607b54610508907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b6104f9610c6836600461648d565b6149e7565b6104f9610c7b36600461648d565b614ab9565b607a546105729073ffffffffffffffffffffffffffffffffffffffff1681565b6104c360705481565b6104f9610cb73660046166a9565b614b6d565b5f805f610cc76138db565b905067ffffffffffffffff881615610e935760795467ffffffffffffffff9081169089161115610da4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a4015b60405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614610e8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610d9b565b5061102b565b67ffffffffffffffff87165f90815260756020526040902054915081610f61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610d9b565b8067ffffffffffffffff168767ffffffffffffffff16111561102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610d9b565b8067ffffffffffffffff168667ffffffffffffffff16116110f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610d9b565b5f61110288888886896118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161113691906166d3565b602060405180830381855afa158015611151573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061117491906166ee565b61117e9190616732565b9a9950505050505050505050565b6077805461119990616745565b80601f01602080910402602001604051908101604052809291908181526020018280546111c590616745565b80156112105780601f106111e757610100808354040283529160200191611210565b820191905f5260205f20905b8154815290600101906020018083116111f357829003601f168201915b505050505081565b611220614b8f565b5f8061122a6138db565b905067ffffffffffffffff8a16156113f15760795467ffffffffffffffff908116908b161115611302576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a401610d9b565b67ffffffffffffffff808b165f9081526078602052604090206002810154815490945090918b81166801000000000000000090920416146113eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610d9b565b50611589565b67ffffffffffffffff89165f908152607560205260409020549150816114bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610d9b565b8067ffffffffffffffff168967ffffffffffffffff161115611589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610d9b565b8067ffffffffffffffff168867ffffffffffffffff1611611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610d9b565b5f6116608a8a8a868b6118de565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8c81169182179092555f90815260756020526040902089905560795491925016156116dd57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018990527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611762575f80fd5b505af1158015611774573d5f803e3d5ffd5b505060405189815233925067ffffffffffffffff8c1691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe9060200160405180910390a35050505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611817576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff16108061183057506103ff8161ffff16115b15611867576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590611911575081155b15611948576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8061197f576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119888461383b565b6119be576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611b11576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b1f868686868686614c10565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611b9957607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611c1e575f80fd5b505af1158015611c30573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611cdb576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cea87878787878787614fcb565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611d6457607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611de9575f80fd5b505af1158015611dfb573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611ec992700100000000000000000000000000000000909204811691166167c3565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611f2c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611f73576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16611fe25760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611fe2576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1906020016118d3565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461210657606f5460ff16156120c7576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120d081611e86565b612106576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61210f816153fa565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612163576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156121aa576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661221557607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610612215576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020016118d3565b6076805461119990616745565b606f5460ff16156122e0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314612340576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361237b576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156123b7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f81815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b868110156127ff575f8a8a8381811061241d5761241d6167eb565b905060200281019061242f9190616818565b6124389061684a565b8051805160209091012060608201519192509067ffffffffffffffff16156125ad5785612464816168d4565b9650505f81836020015184606001516040516020016124bb93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260719093529120549091508114612543576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088165f9081526071602052604080822091909155606085015190850151908216911610156125a7576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506126e7565b602082015115801590612671575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af115801561264b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061266f91906166ee565b155b156126a8576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156126e7576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff16108061271a575042826040015167ffffffffffffffff16115b15612751576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519750505080806127f7906168fa565b915050612402565b5061280a86856167c3565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115612873576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61287e8285616931565b6128929067ffffffffffffffff1688616952565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c841691161793029290921790559091508281169085161461298757607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6129d933308360705461299a9190616965565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190615607565b6129e16156e9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612a46575f80fd5b505af1158015612a58573d5f803e3d5ffd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612aed576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16612b49576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f6070546064612bab9190616965565b905090565b606f5460ff1615612bed576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f908152607260205260409020600101544292612c39927801000000000000000000000000000000000000000000000000909104811691166167c3565b67ffffffffffffffff161115612c7b576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612c888686616931565b67ffffffffffffffff161115612cca576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cd8868686868686614c10565b612ce184615794565b607954700100000000000000000000000000000000900467ffffffffffffffff165f03612e2257607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615612d8257607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612e07575f80fd5b505af1158015612e19573d5f803e3d5ffd5b50505050612ef0565b612e2a6156e9565b6079805467ffffffffffffffff16905f612e43836168d4565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001611c6e565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612f7f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016118d3565b61300b614b8f565b6130145f61596e565b565b60335473ffffffffffffffffffffffffffffffffffffffff16331461317b575f61303e6138db565b90508067ffffffffffffffff168267ffffffffffffffff161161308d576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000909104811690831611806130d2575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15613109576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916131379162093a8091166167c3565b67ffffffffffffffff161115613179576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61210f6159e4565b607b5473ffffffffffffffffffffffffffffffffffffffff1633146131d4576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b613257614b8f565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561331e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061334291906166ee565b90505f61334d6138db565b60735467ffffffffffffffff6801000000000000000082048116916133a59170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416616931565b6133af91906167c3565b6133b99190616931565b67ffffffffffffffff169050805f036133d4575f9250505090565b6133de818361697c565b9250505090565b606f5460ff1615613422576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61343187878787878787614fcb565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a161348c6159e4565b50505050505050565b61349d614b8f565b6073805467ffffffffffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613535576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561357c576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166135e35760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106135e3576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75906020016118d3565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146136b1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156136f8576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28906020016118d3565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146137b7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016118d3565b613832614b8f565b61210f81615794565b5f67ffffffff0000000167ffffffffffffffff8316108015613872575067ffffffff00000001604083901c67ffffffffffffffff16105b8015613893575067ffffffff00000001608083901c67ffffffffffffffff16105b80156138aa575067ffffffff0000000160c083901c105b156138b757506001919050565b505f919050565b919050565b6138cb614b8f565b60776138d782826169dc565b5050565b6079545f9067ffffffffffffffff161561391d575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461397f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607661398b82826169dc565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516118d39190616068565b5f54610100900460ff16158080156139d957505f54600160ff909116105b806139f25750303b1580156139f257505f5460ff166001145b613a7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610d9b565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015613ada575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b613ae7602088018861648d565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055613b3c604088016020890161648d565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055613ba1608088016060890161648d565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076613c2b86826169dc565b506077613c3885826169dc565b5062093a80613c4d6060890160408a01616278565b67ffffffffffffffff161115613c8f576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613c9f6060880160408901616278565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80613d0160a0890160808a01616278565b67ffffffffffffffff161115613d43576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d5360a0880160808901616278565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613e32615a67565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f00000000000000000000000000000000000000000000000000000000000000008585604051613e879493929190616b3b565b60405180910390a1801561348c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613f56576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615613f93576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613fce576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561400a576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff78010000000000000000000000000000000000000000000000008204811691614055918491700100000000000000000000000000000000900416616b72565b111561408d576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b84811015614332575f8787838181106140eb576140eb6167eb565b90506020028101906140fd9190616b85565b61410690616bb7565b905083614112816168d4565b825180516020918201208185015160408087015190519499509194505f936141739386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146141fb576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f9081526071602052604081205561421f600189616952565b840361428e5742607b60149054906101000a900467ffffffffffffffff16846040015161424c91906167c3565b67ffffffffffffffff16111561428e576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450505050808061432a906168fa565b9150506140d0565b5061433d84846167c3565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146144e5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561454a575f80fd5b505af115801561455c573d5f803e3d5ffd5b50505050613014615b06565b614570614b8f565b6040805160608101825293845267ffffffffffffffff92831660208086019182529284168583019081529584165f908152607290935291209251835551600190920180549351821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169290911691909117919091179055565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615614654576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614691576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61469a612b9b565b9050818111156146d6576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115614712576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61475473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084615607565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156147be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147e291906166ee565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff1690601861481c836168d4565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051614853929190616c30565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303614981576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26149e0565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931823388886040516149d79493929190616c3f565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314614a38576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca906020016118d3565b614ac1614b8f565b73ffffffffffffffffffffffffffffffffffffffff8116614b64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610d9b565b61210f8161596e565b614b75614b8f565b67ffffffffffffffff165f90815260756020526040902055565b60335473ffffffffffffffffffffffffffffffffffffffff163314613014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d9b565b5f80614c1a6138db565b905067ffffffffffffffff881615614ce95760795467ffffffffffffffff9081169089161115614c76576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614614ce3576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614d89565b67ffffffffffffffff87165f90815260756020526040902054915081614d3b576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115614d89576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611614dd6576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f614de488888886896118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051614e1891906166d3565b602060405180830381855afa158015614e33573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614e5691906166ee565b614e609190616732565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91614ee291899190600401616c74565b602060405180830381865afa158015614efd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614f219190616cae565b614f57576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614fbf33614f65858b616931565b67ffffffffffffffff16614f77613292565b614f819190616965565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190615b94565b50505050505050505050565b5f67ffffffffffffffff8816156150975760795467ffffffffffffffff9081169089161115615026576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614615091576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50615132565b5067ffffffffffffffff85165f90815260756020526040902054806150e8576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff9081169087161115615132576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff908116908816118061516457508767ffffffffffffffff168767ffffffffffffffff1611155b8061518b575060795467ffffffffffffffff68010000000000000000909104811690881611155b156151c2576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f90815260786020526040902054680100000000000000009004811690861614615224576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61523287878785886118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161526691906166d3565b602060405180830381855afa158015615281573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906152a491906166ee565b6152ae9190616732565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161533091889190600401616c74565b602060405180830381865afa15801561534b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061536f9190616cae565b6153a5576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614fbf576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff680100000000000000009091048116908216111580615434575060795467ffffffffffffffff908116908216115b1561546b576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015615599575f80fd5b505af11580156155ab573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e84600201546040516155fa91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526156e39085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152615bef565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115613014576079545f906157319068010000000000000000900467ffffffffffffffff1660016167c3565b905061573c81611e86565b1561210f576079545f9060029061575e90849067ffffffffffffffff16616931565b6157689190616ccd565b61577290836167c3565b905061577d81611e86565b1561578b576138d7816153fa565b6138d7826153fa565b5f61579d6138db565b9050815f806157ac8484616931565b606f5467ffffffffffffffff91821692505f916157cf9161010090041642616952565b90505b8467ffffffffffffffff168467ffffffffffffffff16146158595767ffffffffffffffff8085165f908152607260205260409020600181015490911682101561583757600181015468010000000000000000900467ffffffffffffffff169450615853565b6158418686616931565b67ffffffffffffffff16935050615859565b506157d2565b5f6158648484616952565b9050838110156158bb57808403600c811161587f5780615882565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a60705402816158b1576158b1616705565b046070555061592a565b838103600c81116158cc57806158cf565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a7640000028161590557615905616705565b04905080607054670de0b6b3a7640000028161592357615923616705565b0460705550505b683635c9adc5dea00000607054111561594f57683635c9adc5dea0000060705561348c565b633b9aca00607054101561348c57633b9aca0060705550505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015615a49575f80fd5b505af1158015615a5b573d5f803e3d5ffd5b50505050613014615cfa565b5f54610100900460ff16615afd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610d9b565b6130143361596e565b606f5460ff16615b42576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052615bea9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401615661565b505050565b5f615c50826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615d8c9092919063ffffffff16565b805190915015615bea5780806020019051810190615c6e9190616cae565b615bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610d9b565b606f5460ff1615615d37576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b6060615d9a84845f85615da2565b949350505050565b606082471015615e34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610d9b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051615e5c91906166d3565b5f6040518083038185875af1925050503d805f8114615e96576040519150601f19603f3d011682016040523d82523d5f602084013e615e9b565b606091505b5091509150615eac87838387615eb7565b979650505050505050565b60608315615f4c5782515f03615f455773ffffffffffffffffffffffffffffffffffffffff85163b615f45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d9b565b5081615d9a565b615d9a8383815115615f615781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9b9190616068565b803567ffffffffffffffff811681146138be575f80fd5b5f805f805f60a08688031215615fc0575f80fd5b615fc986615f95565b9450615fd760208701615f95565b9350615fe560408701615f95565b94979396509394606081013594506080013592915050565b5f5b83811015616017578181015183820152602001615fff565b50505f910152565b5f8151808452616036816020860160208601615ffd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61607a602083018461601f565b9392505050565b8060408101831015616091575f80fd5b92915050565b5f805f805f805f806101a0898b0312156160af575f80fd5b6160b889615f95565b97506160c660208a01615f95565b96506160d460408a01615f95565b955060608901359450608089013593506160f18a60a08b01616081565b925061016089018a811115616104575f80fd5b60e08a0192506161148b82616081565b9150509295985092959890939650565b5f60208284031215616134575f80fd5b813561ffff8116811461607a575f80fd5b5f805f805f60a08688031215616159575f80fd5b61616286615f95565b945061617060208701615f95565b94979496505050506040830135926060810135926080909101359150565b806103008101831015616091575f80fd5b5f805f805f806103a087890312156161b5575f80fd5b6161be87615f95565b95506161cc60208801615f95565b94506161da60408801615f95565b935060608701359250608087013591506161f78860a0890161618e565b90509295509295509295565b5f805f805f805f6103c0888a03121561621a575f80fd5b61622388615f95565b965061623160208901615f95565b955061623f60408901615f95565b945061624d60608901615f95565b93506080880135925060a0880135915061626a8960c08a0161618e565b905092959891949750929550565b5f60208284031215616288575f80fd5b61607a82615f95565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126162cd575f80fd5b813567ffffffffffffffff808211156162e8576162e8616291565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561632e5761632e616291565b81604052838152866020858801011115616346575f80fd5b836020870160208301375f602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146138be575f80fd5b5f805f805f60a0868803121561639c575f80fd5b85359450602086013567ffffffffffffffff8111156163b9575f80fd5b6163c5888289016162be565b945050604086013592506163db60608701615f95565b91506163e960808701616365565b90509295509295909350565b5f8083601f840112616405575f80fd5b50813567ffffffffffffffff81111561641c575f80fd5b6020830191508360208260051b8501011115616436575f80fd5b9250929050565b5f805f6040848603121561644f575f80fd5b833567ffffffffffffffff811115616465575f80fd5b616471868287016163f5565b9094509250616484905060208501616365565b90509250925092565b5f6020828403121561649d575f80fd5b61607a82616365565b5f602082840312156164b6575f80fd5b5035919050565b5f602082840312156164cd575f80fd5b813567ffffffffffffffff8111156164e3575f80fd5b615d9a848285016162be565b5f8083601f8401126164ff575f80fd5b50813567ffffffffffffffff811115616516575f80fd5b602083019150836020828501011115616436575f80fd5b5f805f805f80868803610120811215616544575f80fd5b60a0811215616551575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff80821115616576575f80fd5b6165828a838b016162be565b955060e0890135915080821115616597575f80fd5b6165a38a838b016162be565b94506101008901359150808211156165b9575f80fd5b506165c689828a016164ef565b979a9699509497509295939492505050565b5f80602083850312156165e9575f80fd5b823567ffffffffffffffff8111156165ff575f80fd5b61660b858286016163f5565b90969095509350505050565b5f805f806080858703121561662a575f80fd5b61663385615f95565b93506020850135925061664860408601615f95565b915061665660608601615f95565b905092959194509250565b5f805f60408486031215616673575f80fd5b833567ffffffffffffffff811115616689575f80fd5b616695868287016164ef565b909790965060209590950135949350505050565b5f80604083850312156166ba575f80fd5b823591506166ca60208401615f95565b90509250929050565b5f82516166e4818460208701615ffd565b9190910192915050565b5f602082840312156166fe575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f8261674057616740616705565b500690565b600181811c9082168061675957607f821691505b602082108103616790577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156167e4576167e4616796565b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126166e4575f80fd5b5f6080823603121561685a575f80fd5b6040516080810167ffffffffffffffff828210818311171561687e5761687e616291565b816040528435915080821115616892575f80fd5b5061689f368286016162be565b825250602083013560208201526168b860408401615f95565b60408201526168c960608401615f95565b606082015292915050565b5f67ffffffffffffffff8083168181036168f0576168f0616796565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361692a5761692a616796565b5060010190565b67ffffffffffffffff8281168282160390808211156167e4576167e4616796565b8181038181111561609157616091616796565b808202811582820484141761609157616091616796565b5f8261698a5761698a616705565b500490565b601f821115615bea575f81815260208120601f850160051c810160208610156169b55750805b601f850160051c820191505b818110156169d4578281556001016169c1565b505050505050565b815167ffffffffffffffff8111156169f6576169f6616291565b616a0a81616a048454616745565b8461698f565b602080601f831160018114616a5c575f8415616a265750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556169d4565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015616aa857888601518255948401946001909101908401616a89565b5085821015616ae457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152616b68606083018486616af4565b9695505050505050565b8082018082111561609157616091616796565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126166e4575f80fd5b5f60608236031215616bc7575f80fd5b6040516060810167ffffffffffffffff8282108183111715616beb57616beb616291565b816040528435915080821115616bff575f80fd5b50616c0c368286016162be565b82525060208301356020820152616c2560408401615f95565b604082015292915050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f616b68606083018486616af4565b6103208101610300808584378201835f5b6001811015616ca4578151835260209283019290910190600101616c85565b5050509392505050565b5f60208284031215616cbe575f80fd5b8151801515811461607a575f80fd5b5f67ffffffffffffffff80841680616ce757616ce7616705565b9216919091049291505056fea26469706673582212203d78dd0bda59d6322d20458734dd51eab51ad00e93348cf59380a0e5731cf93a64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610475575f3560e01c80638c3d73011161025d578063c754c7ed11610148578063e7a7ed02116100c3578063f14916d611610093578063f851a44011610079578063f851a44014610c80578063f8b823e414610ca0578063fe16564f14610ca9575f80fd5b8063f14916d614610c5a578063f2fde38b14610c6d575f80fd5b8063e7a7ed0214610bc3578063e8bf92ed14610bf3578063eaeb077b14610c1a578063ed6b010414610c2d575f80fd5b8063d2e129f911610118578063d939b315116100fe578063d939b31514610b80578063dbc1697614610ba8578063e0d1744114610bb0575f80fd5b8063d2e129f914610b5a578063d8d1091b14610b6d575f80fd5b8063c754c7ed14610ac5578063c89e42df14610af1578063cfa8ed4714610b04578063d02103ca14610b33575f80fd5b8063ada8f919116101d8578063b4f77ea9116101a8578063ba58ae391161018e578063ba58ae3914610a97578063c0cad30214610aaa578063c0ed84e014610abd575f80fd5b8063b4f77ea914610a5d578063b6b0b09714610a70575f80fd5b8063ada8f9191461098f578063adc879e9146109a2578063afd23cbe146109c9578063b4d63f58146109f7575f80fd5b80639aa972a31161022d5780639c9f3dfe116102135780639c9f3dfe14610942578063a066215c14610955578063a3c573eb14610968575f80fd5b80639aa972a31461091c5780639b7967601461092f575f80fd5b80638c3d7301146108db5780638da5cb5b146108e357806396dc3d391461090157806399f5634e14610914575f80fd5b80634a1a89a71161037d578063621dd411116102f85780637215541a116102c8578063831c7ead116102ae578063831c7ead14610810578063837a473814610837578063841b24d7146108ab575f80fd5b80637215541a146107e95780637fcb3653146107fc575f80fd5b8063621dd4111461079c5780636b8616ce146107af5780636ff512cc146107ce578063715018a6146107e1575f80fd5b8063542028d51161034d5780635e9145c9116103335780635e9145c9146107795780635ec919581461078c5780636046916914610794575f80fd5b8063542028d5146106d0578063574f649e146106d8575f80fd5b80634a1a89a71461066b5780634a910e6a1461068b5780634e4877061461069e5780635392c5e0146106b1575f80fd5b8063267822471161040d578063383b3be8116103dd578063423fa856116103c3578063423fa8561461060f578063456052671461062f578063458c047714610657575f80fd5b8063383b3be8146105e9578063394218e9146105fc575f80fd5b8063267822471461055257806329878983146105975780632b0006fa146105c35780632c1f816a146105d6575f80fd5b806315064c961161044857806315064c96146104fb5780631816b7e51461051857806319d8ac611461052b578063220d78991461053f575f80fd5b80630a0d9fbe146104795780630eaa86ea146104b0578063107bf28c146104d157806310a01a72146104e6575b5f80fd5b606f5461049290610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6104c36104be366004615fac565b610cbc565b6040519081526020016104a7565b6104d961118c565b6040516104a79190616068565b6104f96104f4366004616097565b611218565b005b606f546105089060ff1681565b60405190151581526020016104a7565b6104f9610526366004616124565b6117c6565b6073546104929067ffffffffffffffff1681565b6104d961054d366004616145565b6118de565b607b546105729073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104a7565b6074546105729068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104f96105d136600461619f565b611ab4565b6104f96105e4366004616203565b611c7e565b6105086105f7366004616278565b611e86565b6104f961060a366004616278565b611edb565b6073546104929068010000000000000000900467ffffffffffffffff1681565b60735461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546104929067ffffffffffffffff1681565b6079546104929068010000000000000000900467ffffffffffffffff1681565b6104f9610699366004616278565b61205f565b6104f96106ac366004616278565b612112565b6104c36106bf366004616278565b60756020525f908152604090205481565b6104d9612296565b6104c36106e6366004616388565b835160209485012060408051808701979097528681019190915260608087019490945260c09290921b7fffffffffffffffff00000000000000000000000000000000000000000000000016608086015290911b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888401528051808403607c018152609c9093019052815191012090565b6104f961078736600461643d565b6122a3565b6104f9612a9c565b6104c3612b9b565b6104f96107aa36600461619f565b612bb0565b6104c36107bd366004616278565b60716020525f908152604090205481565b6104f96107dc36600461648d565b612f2e565b6104f9613003565b6104f96107f7366004616278565b613016565b6074546104929067ffffffffffffffff1681565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b61087f6108453660046164a6565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016104a7565b607954610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9613183565b60335473ffffffffffffffffffffffffffffffffffffffff16610572565b6104f961090f366004616278565b61324f565b6104c3613292565b6104f961092a366004616203565b6133e5565b6104f961093d366004616278565b613495565b6104f9610950366004616278565b6134e4565b6104f9610963366004616278565b613660565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f961099d36600461648d565b613766565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b606f546109e4906901000000000000000000900461ffff1681565b60405161ffff90911681526020016104a7565b610a37610a05366004616278565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016104a7565b6104f9610a6b366004616278565b61382a565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b610508610aa53660046164a6565b61383b565b6104f9610ab83660046164bd565b6138c3565b6104926138db565b607b546104929074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9610aff3660046164bd565b61392e565b606f54610572906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610b6836600461652d565b6139bb565b6104f9610b7b3660046165d8565b613ef9565b60795461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6104f9614494565b6104f9610bbe366004616617565b614568565b607354610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610c28366004616661565b6145f7565b607b54610508907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b6104f9610c6836600461648d565b6149e7565b6104f9610c7b36600461648d565b614ab9565b607a546105729073ffffffffffffffffffffffffffffffffffffffff1681565b6104c360705481565b6104f9610cb73660046166a9565b614b6d565b5f805f610cc76138db565b905067ffffffffffffffff881615610e935760795467ffffffffffffffff9081169089161115610da4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a4015b60405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614610e8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610d9b565b5061102b565b67ffffffffffffffff87165f90815260756020526040902054915081610f61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610d9b565b8067ffffffffffffffff168767ffffffffffffffff16111561102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610d9b565b8067ffffffffffffffff168667ffffffffffffffff16116110f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610d9b565b5f61110288888886896118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161113691906166d3565b602060405180830381855afa158015611151573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061117491906166ee565b61117e9190616732565b9a9950505050505050505050565b6077805461119990616745565b80601f01602080910402602001604051908101604052809291908181526020018280546111c590616745565b80156112105780601f106111e757610100808354040283529160200191611210565b820191905f5260205f20905b8154815290600101906020018083116111f357829003601f168201915b505050505081565b611220614b8f565b5f8061122a6138db565b905067ffffffffffffffff8a16156113f15760795467ffffffffffffffff908116908b161115611302576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a401610d9b565b67ffffffffffffffff808b165f9081526078602052604090206002810154815490945090918b81166801000000000000000090920416146113eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610d9b565b50611589565b67ffffffffffffffff89165f908152607560205260409020549150816114bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610d9b565b8067ffffffffffffffff168967ffffffffffffffff161115611589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610d9b565b8067ffffffffffffffff168867ffffffffffffffff1611611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610d9b565b5f6116608a8a8a868b6118de565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8c81169182179092555f90815260756020526040902089905560795491925016156116dd57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018990527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611762575f80fd5b505af1158015611774573d5f803e3d5ffd5b505060405189815233925067ffffffffffffffff8c1691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe9060200160405180910390a35050505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611817576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff16108061183057506103ff8161ffff16115b15611867576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590611911575081155b15611948576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8061197f576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119888461383b565b6119be576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611b11576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b1f868686868686614c10565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611b9957607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611c1e575f80fd5b505af1158015611c30573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611cdb576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cea87878787878787614fcb565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611d6457607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611de9575f80fd5b505af1158015611dfb573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611ec992700100000000000000000000000000000000909204811691166167c3565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611f2c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611f73576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16611fe25760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611fe2576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1906020016118d3565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461210657606f5460ff16156120c7576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120d081611e86565b612106576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61210f816153fa565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612163576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156121aa576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661221557607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610612215576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020016118d3565b6076805461119990616745565b606f5460ff16156122e0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314612340576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361237b576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156123b7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f81815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b868110156127ff575f8a8a8381811061241d5761241d6167eb565b905060200281019061242f9190616818565b6124389061684a565b8051805160209091012060608201519192509067ffffffffffffffff16156125ad5785612464816168d4565b9650505f81836020015184606001516040516020016124bb93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260719093529120549091508114612543576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088165f9081526071602052604080822091909155606085015190850151908216911610156125a7576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506126e7565b602082015115801590612671575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af115801561264b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061266f91906166ee565b155b156126a8576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156126e7576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff16108061271a575042826040015167ffffffffffffffff16115b15612751576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519750505080806127f7906168fa565b915050612402565b5061280a86856167c3565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115612873576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61287e8285616931565b6128929067ffffffffffffffff1688616952565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c841691161793029290921790559091508281169085161461298757607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6129d933308360705461299a9190616965565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190615607565b6129e16156e9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612a46575f80fd5b505af1158015612a58573d5f803e3d5ffd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612aed576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16612b49576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f6070546064612bab9190616965565b905090565b606f5460ff1615612bed576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f908152607260205260409020600101544292612c39927801000000000000000000000000000000000000000000000000909104811691166167c3565b67ffffffffffffffff161115612c7b576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612c888686616931565b67ffffffffffffffff161115612cca576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cd8868686868686614c10565b612ce184615794565b607954700100000000000000000000000000000000900467ffffffffffffffff165f03612e2257607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615612d8257607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612e07575f80fd5b505af1158015612e19573d5f803e3d5ffd5b50505050612ef0565b612e2a6156e9565b6079805467ffffffffffffffff16905f612e43836168d4565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001611c6e565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612f7f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016118d3565b61300b614b8f565b6130145f61596e565b565b60335473ffffffffffffffffffffffffffffffffffffffff16331461317b575f61303e6138db565b90508067ffffffffffffffff168267ffffffffffffffff161161308d576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000909104811690831611806130d2575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15613109576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916131379162093a8091166167c3565b67ffffffffffffffff161115613179576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61210f6159e4565b607b5473ffffffffffffffffffffffffffffffffffffffff1633146131d4576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b613257614b8f565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561331e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061334291906166ee565b90505f61334d6138db565b60735467ffffffffffffffff6801000000000000000082048116916133a59170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416616931565b6133af91906167c3565b6133b99190616931565b67ffffffffffffffff169050805f036133d4575f9250505090565b6133de818361697c565b9250505090565b606f5460ff1615613422576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61343187878787878787614fcb565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a161348c6159e4565b50505050505050565b61349d614b8f565b6073805467ffffffffffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613535576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561357c576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166135e35760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106135e3576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75906020016118d3565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146136b1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156136f8576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28906020016118d3565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146137b7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016118d3565b613832614b8f565b61210f81615794565b5f67ffffffff0000000167ffffffffffffffff8316108015613872575067ffffffff00000001604083901c67ffffffffffffffff16105b8015613893575067ffffffff00000001608083901c67ffffffffffffffff16105b80156138aa575067ffffffff0000000160c083901c105b156138b757506001919050565b505f919050565b919050565b6138cb614b8f565b60776138d782826169dc565b5050565b6079545f9067ffffffffffffffff161561391d575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461397f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607661398b82826169dc565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516118d39190616068565b5f54610100900460ff16158080156139d957505f54600160ff909116105b806139f25750303b1580156139f257505f5460ff166001145b613a7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610d9b565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015613ada575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b613ae7602088018861648d565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055613b3c604088016020890161648d565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055613ba1608088016060890161648d565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076613c2b86826169dc565b506077613c3885826169dc565b5062093a80613c4d6060890160408a01616278565b67ffffffffffffffff161115613c8f576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613c9f6060880160408901616278565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80613d0160a0890160808a01616278565b67ffffffffffffffff161115613d43576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d5360a0880160808901616278565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613e32615a67565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f00000000000000000000000000000000000000000000000000000000000000008585604051613e879493929190616b3b565b60405180910390a1801561348c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613f56576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615613f93576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613fce576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561400a576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff78010000000000000000000000000000000000000000000000008204811691614055918491700100000000000000000000000000000000900416616b72565b111561408d576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b84811015614332575f8787838181106140eb576140eb6167eb565b90506020028101906140fd9190616b85565b61410690616bb7565b905083614112816168d4565b825180516020918201208185015160408087015190519499509194505f936141739386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146141fb576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f9081526071602052604081205561421f600189616952565b840361428e5742607b60149054906101000a900467ffffffffffffffff16846040015161424c91906167c3565b67ffffffffffffffff16111561428e576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450505050808061432a906168fa565b9150506140d0565b5061433d84846167c3565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146144e5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561454a575f80fd5b505af115801561455c573d5f803e3d5ffd5b50505050613014615b06565b614570614b8f565b6040805160608101825293845267ffffffffffffffff92831660208086019182529284168583019081529584165f908152607290935291209251835551600190920180549351821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169290911691909117919091179055565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615614654576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614691576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61469a612b9b565b9050818111156146d6576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115614712576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61475473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084615607565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156147be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147e291906166ee565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff1690601861481c836168d4565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051614853929190616c30565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303614981576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26149e0565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931823388886040516149d79493929190616c3f565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314614a38576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca906020016118d3565b614ac1614b8f565b73ffffffffffffffffffffffffffffffffffffffff8116614b64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610d9b565b61210f8161596e565b614b75614b8f565b67ffffffffffffffff165f90815260756020526040902055565b60335473ffffffffffffffffffffffffffffffffffffffff163314613014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d9b565b5f80614c1a6138db565b905067ffffffffffffffff881615614ce95760795467ffffffffffffffff9081169089161115614c76576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614614ce3576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614d89565b67ffffffffffffffff87165f90815260756020526040902054915081614d3b576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115614d89576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611614dd6576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f614de488888886896118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051614e1891906166d3565b602060405180830381855afa158015614e33573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614e5691906166ee565b614e609190616732565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91614ee291899190600401616c74565b602060405180830381865afa158015614efd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614f219190616cae565b614f57576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614fbf33614f65858b616931565b67ffffffffffffffff16614f77613292565b614f819190616965565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190615b94565b50505050505050505050565b5f67ffffffffffffffff8816156150975760795467ffffffffffffffff9081169089161115615026576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614615091576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50615132565b5067ffffffffffffffff85165f90815260756020526040902054806150e8576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff9081169087161115615132576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff908116908816118061516457508767ffffffffffffffff168767ffffffffffffffff1611155b8061518b575060795467ffffffffffffffff68010000000000000000909104811690881611155b156151c2576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f90815260786020526040902054680100000000000000009004811690861614615224576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61523287878785886118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161526691906166d3565b602060405180830381855afa158015615281573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906152a491906166ee565b6152ae9190616732565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161533091889190600401616c74565b602060405180830381865afa15801561534b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061536f9190616cae565b6153a5576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614fbf576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff680100000000000000009091048116908216111580615434575060795467ffffffffffffffff908116908216115b1561546b576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015615599575f80fd5b505af11580156155ab573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e84600201546040516155fa91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526156e39085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152615bef565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115613014576079545f906157319068010000000000000000900467ffffffffffffffff1660016167c3565b905061573c81611e86565b1561210f576079545f9060029061575e90849067ffffffffffffffff16616931565b6157689190616ccd565b61577290836167c3565b905061577d81611e86565b1561578b576138d7816153fa565b6138d7826153fa565b5f61579d6138db565b9050815f806157ac8484616931565b606f5467ffffffffffffffff91821692505f916157cf9161010090041642616952565b90505b8467ffffffffffffffff168467ffffffffffffffff16146158595767ffffffffffffffff8085165f908152607260205260409020600181015490911682101561583757600181015468010000000000000000900467ffffffffffffffff169450615853565b6158418686616931565b67ffffffffffffffff16935050615859565b506157d2565b5f6158648484616952565b9050838110156158bb57808403600c811161587f5780615882565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a60705402816158b1576158b1616705565b046070555061592a565b838103600c81116158cc57806158cf565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a7640000028161590557615905616705565b04905080607054670de0b6b3a7640000028161592357615923616705565b0460705550505b683635c9adc5dea00000607054111561594f57683635c9adc5dea0000060705561348c565b633b9aca00607054101561348c57633b9aca0060705550505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015615a49575f80fd5b505af1158015615a5b573d5f803e3d5ffd5b50505050613014615cfa565b5f54610100900460ff16615afd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610d9b565b6130143361596e565b606f5460ff16615b42576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052615bea9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401615661565b505050565b5f615c50826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615d8c9092919063ffffffff16565b805190915015615bea5780806020019051810190615c6e9190616cae565b615bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610d9b565b606f5460ff1615615d37576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b6060615d9a84845f85615da2565b949350505050565b606082471015615e34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610d9b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051615e5c91906166d3565b5f6040518083038185875af1925050503d805f8114615e96576040519150601f19603f3d011682016040523d82523d5f602084013e615e9b565b606091505b5091509150615eac87838387615eb7565b979650505050505050565b60608315615f4c5782515f03615f455773ffffffffffffffffffffffffffffffffffffffff85163b615f45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d9b565b5081615d9a565b615d9a8383815115615f615781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9b9190616068565b803567ffffffffffffffff811681146138be575f80fd5b5f805f805f60a08688031215615fc0575f80fd5b615fc986615f95565b9450615fd760208701615f95565b9350615fe560408701615f95565b94979396509394606081013594506080013592915050565b5f5b83811015616017578181015183820152602001615fff565b50505f910152565b5f8151808452616036816020860160208601615ffd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61607a602083018461601f565b9392505050565b8060408101831015616091575f80fd5b92915050565b5f805f805f805f806101a0898b0312156160af575f80fd5b6160b889615f95565b97506160c660208a01615f95565b96506160d460408a01615f95565b955060608901359450608089013593506160f18a60a08b01616081565b925061016089018a811115616104575f80fd5b60e08a0192506161148b82616081565b9150509295985092959890939650565b5f60208284031215616134575f80fd5b813561ffff8116811461607a575f80fd5b5f805f805f60a08688031215616159575f80fd5b61616286615f95565b945061617060208701615f95565b94979496505050506040830135926060810135926080909101359150565b806103008101831015616091575f80fd5b5f805f805f806103a087890312156161b5575f80fd5b6161be87615f95565b95506161cc60208801615f95565b94506161da60408801615f95565b935060608701359250608087013591506161f78860a0890161618e565b90509295509295509295565b5f805f805f805f6103c0888a03121561621a575f80fd5b61622388615f95565b965061623160208901615f95565b955061623f60408901615f95565b945061624d60608901615f95565b93506080880135925060a0880135915061626a8960c08a0161618e565b905092959891949750929550565b5f60208284031215616288575f80fd5b61607a82615f95565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126162cd575f80fd5b813567ffffffffffffffff808211156162e8576162e8616291565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561632e5761632e616291565b81604052838152866020858801011115616346575f80fd5b836020870160208301375f602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146138be575f80fd5b5f805f805f60a0868803121561639c575f80fd5b85359450602086013567ffffffffffffffff8111156163b9575f80fd5b6163c5888289016162be565b945050604086013592506163db60608701615f95565b91506163e960808701616365565b90509295509295909350565b5f8083601f840112616405575f80fd5b50813567ffffffffffffffff81111561641c575f80fd5b6020830191508360208260051b8501011115616436575f80fd5b9250929050565b5f805f6040848603121561644f575f80fd5b833567ffffffffffffffff811115616465575f80fd5b616471868287016163f5565b9094509250616484905060208501616365565b90509250925092565b5f6020828403121561649d575f80fd5b61607a82616365565b5f602082840312156164b6575f80fd5b5035919050565b5f602082840312156164cd575f80fd5b813567ffffffffffffffff8111156164e3575f80fd5b615d9a848285016162be565b5f8083601f8401126164ff575f80fd5b50813567ffffffffffffffff811115616516575f80fd5b602083019150836020828501011115616436575f80fd5b5f805f805f80868803610120811215616544575f80fd5b60a0811215616551575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff80821115616576575f80fd5b6165828a838b016162be565b955060e0890135915080821115616597575f80fd5b6165a38a838b016162be565b94506101008901359150808211156165b9575f80fd5b506165c689828a016164ef565b979a9699509497509295939492505050565b5f80602083850312156165e9575f80fd5b823567ffffffffffffffff8111156165ff575f80fd5b61660b858286016163f5565b90969095509350505050565b5f805f806080858703121561662a575f80fd5b61663385615f95565b93506020850135925061664860408601615f95565b915061665660608601615f95565b905092959194509250565b5f805f60408486031215616673575f80fd5b833567ffffffffffffffff811115616689575f80fd5b616695868287016164ef565b909790965060209590950135949350505050565b5f80604083850312156166ba575f80fd5b823591506166ca60208401615f95565b90509250929050565b5f82516166e4818460208701615ffd565b9190910192915050565b5f602082840312156166fe575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f8261674057616740616705565b500690565b600181811c9082168061675957607f821691505b602082108103616790577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156167e4576167e4616796565b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126166e4575f80fd5b5f6080823603121561685a575f80fd5b6040516080810167ffffffffffffffff828210818311171561687e5761687e616291565b816040528435915080821115616892575f80fd5b5061689f368286016162be565b825250602083013560208201526168b860408401615f95565b60408201526168c960608401615f95565b606082015292915050565b5f67ffffffffffffffff8083168181036168f0576168f0616796565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361692a5761692a616796565b5060010190565b67ffffffffffffffff8281168282160390808211156167e4576167e4616796565b8181038181111561609157616091616796565b808202811582820484141761609157616091616796565b5f8261698a5761698a616705565b500490565b601f821115615bea575f81815260208120601f850160051c810160208610156169b55750805b601f850160051c820191505b818110156169d4578281556001016169c1565b505050505050565b815167ffffffffffffffff8111156169f6576169f6616291565b616a0a81616a048454616745565b8461698f565b602080601f831160018114616a5c575f8415616a265750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556169d4565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015616aa857888601518255948401946001909101908401616a89565b5085821015616ae457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152616b68606083018486616af4565b9695505050505050565b8082018082111561609157616091616796565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126166e4575f80fd5b5f60608236031215616bc7575f80fd5b6040516060810167ffffffffffffffff8282108183111715616beb57616beb616291565b816040528435915080821115616bff575f80fd5b50616c0c368286016162be565b82525060208301356020820152616c2560408401615f95565b604082015292915050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f616b68606083018486616af4565b6103208101610300808584378201835f5b6001811015616ca4578151835260209283019290910190600101616c85565b5050509392505050565b5f60208284031215616cbe575f80fd5b8151801515811461607a575f80fd5b5f67ffffffffffffffff80841680616ce757616ce7616705565b9216919091049291505056fea26469706673582212203d78dd0bda59d6322d20458734dd51eab51ad00e93348cf59380a0e5731cf93a64736f6c63430008140033", + "bytecode": "0x61014060405234801562000011575f80fd5b5060405162006e4638038062006e468339810160408190526200003491620000a2565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b039182166101005216610120526200012a565b6001600160a01b038116811462000083575f80fd5b50565b80516001600160401b03811681146200009d575f80fd5b919050565b5f805f805f8060c08789031215620000b8575f80fd5b8651620000c5816200006e565b6020880151909650620000d8816200006e565b6040880151909550620000eb816200006e565b6060880151909450620000fe816200006e565b92506200010e6080880162000086565b91506200011e60a0880162000086565b90509295509295509295565b60805160a05160c05160e0516101005161012051616c4f620001f75f395f818161076101528181611a600152613e1b01525f818161099e0152611a3601525f8181610964015281816131ea015281816144ad01526158ca01525f8181610b420152818161171601528181611bd201528181611d9d015281816125c2015281816132660152818161471d015261550901525f8181610c0201528181614e7201526152c001525f8181610a6c01528181612aea01528181613817015281816146f20152614f5e0152616c4f5ff3fe608060405234801561000f575f80fd5b5060043610610475575f3560e01c80638da5cb5b1161025d578063c754c7ed11610148578063e7a7ed02116100c3578063f14916d611610093578063f851a44011610079578063f851a44014610c8a578063f8b823e414610caa578063fe16564f14610cb3575f80fd5b8063f14916d614610c64578063f2fde38b14610c77575f80fd5b8063e7a7ed0214610bcd578063e8bf92ed14610bfd578063eaeb077b14610c24578063ed6b010414610c37575f80fd5b8063d2e129f911610118578063d939b315116100fe578063d939b31514610b8a578063dbc1697614610bb2578063e0d1744114610bba575f80fd5b8063d2e129f914610b64578063d8d1091b14610b77575f80fd5b8063c754c7ed14610acf578063c89e42df14610afb578063cfa8ed4714610b0e578063d02103ca14610b3d575f80fd5b8063adc879e9116101d8578063b6b0b097116101a8578063c00e0dc91161018e578063c00e0dc914610aa1578063c0cad30214610ab4578063c0ed84e014610ac7575f80fd5b8063b6b0b09714610a67578063ba58ae3914610a8e575f80fd5b8063adc879e914610999578063afd23cbe146109c0578063b4d63f58146109ee578063b4f77ea914610a54575f80fd5b80639b7967601161022d578063a066215c11610213578063a066215c1461094c578063a3c573eb1461095f578063ada8f91914610986575f80fd5b80639b796760146109265780639c9f3dfe14610939575f80fd5b80638da5cb5b146108da57806396dc3d39146108f857806399f5634e1461090b5780639aa972a314610913575f80fd5b80634a1a89a71161037d5780636ff512cc116102f8578063831c7ead116102c8578063841b24d7116102ae578063841b24d7146107f75780638449a79c146108275780638c3d7301146108d2575f80fd5b8063831c7ead1461075c578063837a473814610783575f80fd5b80636ff512cc1461071a578063715018a61461072d5780637215541a146107355780637fcb365314610748575f80fd5b8063542028d51161034d578063604691691161033357806360469169146106e0578063621dd411146106e85780636b8616ce146106fb575f80fd5b8063542028d5146106d05780635ec91958146106d8575f80fd5b80634a1a89a71461066b5780634a910e6a1461068b5780634e4877061461069e5780635392c5e0146106b1575f80fd5b8063298789831161040d578063383b3be8116103dd578063423fa856116103c3578063423fa8561461060f578063456052671461062f578063458c047714610657575f80fd5b8063383b3be8146105e9578063394218e9146105fc575f80fd5b806329878983146105835780632a9f208f146105af5780632b0006fa146105c35780632c1f816a146105d6575f80fd5b806315064c961161044857806315064c96146104fb5780631816b7e514610518578063220d78991461052b578063267822471461053e575f80fd5b80630a0d9fbe146104795780630eaa86ea146104b0578063107bf28c146104d157806310a01a72146104e6575b5f80fd5b606f5461049290610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6104c36104be366004615f72565b610cc6565b6040519081526020016104a7565b6104d9611196565b6040516104a7919061602e565b6104f96104f436600461605d565b611222565b005b606f546105089060ff1681565b60405190151581526020016104a7565b6104f96105263660046160ea565b6117d0565b6104d961053936600461610b565b6118e8565b607b5461055e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104a7565b60745461055e9068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6073546104929067ffffffffffffffff1681565b6104f96105d1366004616165565b611abe565b6104f96105e43660046161c9565b611c88565b6105086105f736600461623e565b611e90565b6104f961060a36600461623e565b611ee5565b6073546104929068010000000000000000900467ffffffffffffffff1681565b60735461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546104929067ffffffffffffffff1681565b6079546104929068010000000000000000900467ffffffffffffffff1681565b6104f961069936600461623e565b612069565b6104f96106ac36600461623e565b61211c565b6104c36106bf36600461623e565b60756020525f908152604090205481565b6104d96122a0565b6104f96122ad565b6104c36123ac565b6104f96106f6366004616165565b6123c1565b6104c361070936600461623e565b60716020525f908152604090205481565b6104f961072836600461627a565b61273f565b6104f9612814565b6104f961074336600461623e565b612827565b6074546104929067ffffffffffffffff1681565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b6107cb610791366004616293565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016104a7565b607954610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104c361083536600461638b565b845160209586012060408051808801989098528781019190915260608088019590955260c09390931b7fffffffffffffffff000000000000000000000000000000000000000000000000166080870152921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608885015290151560f81b609c8401528051808403607d018152609d9093019052815191012090565b6104f9612994565b60335473ffffffffffffffffffffffffffffffffffffffff1661055e565b6104f961090636600461623e565b612a60565b6104c3612aa3565b6104f96109213660046161c9565b612bf6565b6104f961093436600461623e565b612ca6565b6104f961094736600461623e565b612cf5565b6104f961095a36600461623e565b612e71565b61055e7f000000000000000000000000000000000000000000000000000000000000000081565b6104f961099436600461627a565b612f77565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b606f546109db906901000000000000000000900461ffff1681565b60405161ffff90911681526020016104a7565b610a2e6109fc36600461623e565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016104a7565b6104f9610a6236600461623e565b61303b565b61055e7f000000000000000000000000000000000000000000000000000000000000000081565b610508610a9c366004616293565b61304c565b6104f9610aaf366004616453565b6130d4565b6104f9610ac23660046164a3565b613888565b6104926138a0565b607b546104929074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9610b093660046164a3565b6138f3565b606f5461055e906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61055e7f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610b72366004616513565b613980565b6104f9610b853660046165be565b613ebe565b60795461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6104f961445a565b6104f9610bc83660046165fd565b61452e565b607354610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61055e7f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610c32366004616647565b6145bd565b607b54610508907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b6104f9610c7236600461627a565b6149ad565b6104f9610c8536600461627a565b614a7f565b607a5461055e9073ffffffffffffffffffffffffffffffffffffffff1681565b6104c360705481565b6104f9610cc136600461668f565b614b33565b5f805f610cd16138a0565b905067ffffffffffffffff881615610e9d5760795467ffffffffffffffff9081169089161115610dae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a4015b60405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614610e97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610da5565b50611035565b67ffffffffffffffff87165f90815260756020526040902054915081610f6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610da5565b8067ffffffffffffffff168767ffffffffffffffff161115611035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610da5565b8067ffffffffffffffff168667ffffffffffffffff16116110fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610da5565b5f61110c88888886896118e8565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161114091906166b9565b602060405180830381855afa15801561115b573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061117e91906166d4565b6111889190616718565b9a9950505050505050505050565b607780546111a39061672b565b80601f01602080910402602001604051908101604052809291908181526020018280546111cf9061672b565b801561121a5780601f106111f15761010080835404028352916020019161121a565b820191905f5260205f20905b8154815290600101906020018083116111fd57829003601f168201915b505050505081565b61122a614b55565b5f806112346138a0565b905067ffffffffffffffff8a16156113fb5760795467ffffffffffffffff908116908b16111561130c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a401610da5565b67ffffffffffffffff808b165f9081526078602052604090206002810154815490945090918b81166801000000000000000090920416146113f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610da5565b50611593565b67ffffffffffffffff89165f908152607560205260409020549150816114c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610da5565b8067ffffffffffffffff168967ffffffffffffffff161115611593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610da5565b8067ffffffffffffffff168867ffffffffffffffff161161165c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610da5565b5f61166a8a8a8a868b6118e8565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8c81169182179092555f90815260756020526040902089905560795491925016156116e757607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018990527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b15801561176c575f80fd5b505af115801561177e573d5f803e3d5ffd5b505060405189815233925067ffffffffffffffff8c1691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe9060200160405180910390a35050505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611821576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff16108061183a57506103ff8161ffff16115b15611871576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f81815260726020526040808220549388168252902054606092911580159061191b575081155b15611952576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80611989576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119928461304c565b6119c8576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611b1b576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b29868686868686614bd6565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611ba357607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611c28575f80fd5b505af1158015611c3a573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611ce5576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cf487878787878787614f91565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611d6e57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611df3575f80fd5b505af1158015611e05573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611ed392700100000000000000000000000000000000909204811691166167a9565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611f36576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611f7d576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16611fec5760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611fec576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1906020016118dd565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461211057606f5460ff16156120d1576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120da81611e90565b612110576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612119816153c0565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461216d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156121b4576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661221f57607b5467ffffffffffffffff7401000000000000000000000000000000000000000090910481169082161061221f576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020016118dd565b607680546111a39061672b565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146122fe576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1661235a576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f60705460646123bc91906167d1565b905090565b606f5460ff16156123fe576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f90815260726020526040902060010154429261244a927801000000000000000000000000000000000000000000000000909104811691166167a9565b67ffffffffffffffff16111561248c576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e861249986866167e8565b67ffffffffffffffff1611156124db576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124e9868686868686614bd6565b6124f2846155cd565b607954700100000000000000000000000000000000900467ffffffffffffffff165f0361263357607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f908152607560205260409020839055607954161561259357607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612618575f80fd5b505af115801561262a573d5f803e3d5ffd5b50505050612701565b61263b6157a7565b6079805467ffffffffffffffff16905f61265483616809565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001611c78565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612790576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016118dd565b61281c614b55565b6128255f615852565b565b60335473ffffffffffffffffffffffffffffffffffffffff16331461298c575f61284f6138a0565b90508067ffffffffffffffff168267ffffffffffffffff161161289e576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000909104811690831611806128e3575067ffffffffffffffff8083165f9081526072602052604090206001015416155b1561291a576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916129489162093a8091166167a9565b67ffffffffffffffff16111561298a576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6121196158c8565b607b5473ffffffffffffffffffffffffffffffffffffffff1633146129e5576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b612a68614b55565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015612b2f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b5391906166d4565b90505f612b5e6138a0565b60735467ffffffffffffffff680100000000000000008204811691612bb691700100000000000000000000000000000000820481169178010000000000000000000000000000000000000000000000009004166167e8565b612bc091906167a9565b612bca91906167e8565b67ffffffffffffffff169050805f03612be5575f9250505090565b612bef818361682f565b9250505090565b606f5460ff1615612c33576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c4287878787878787614f91565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1612c9d6158c8565b50505050505050565b612cae614b55565b6073805467ffffffffffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612d46576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115612d8d576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16612df45760795467ffffffffffffffff700100000000000000000000000000000000909104811690821610612df4576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75906020016118dd565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612ec2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff161115612f09576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28906020016118dd565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612fc8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016118dd565b613043614b55565b612119816155cd565b5f67ffffffff0000000167ffffffffffffffff8316108015613083575067ffffffff00000001604083901c67ffffffffffffffff16105b80156130a4575067ffffffff00000001608083901c67ffffffffffffffff16105b80156130bb575067ffffffff0000000160c083901c105b156130c857506001919050565b505f919050565b919050565b606f5460ff1615613111576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314613171576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f8190036131ac576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156131e8576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561324d575f80fd5b505af115801561325f573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132f191906166d4565b60735467ffffffffffffffff68010000000000000000820481165f818152607260205260408120549495504294919370010000000000000000000000000000000090049092169182905b87811015613647575f8b8b8381811061335657613356616842565b9050602002810190613368919061686f565b613371906168a1565b8051805160209091012060408201519192509067ffffffffffffffff1615613562578561339d81616809565b9650505f81836020015184604001516040516020016133f493929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f9081526071909352912054909150811461347c576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015181519384018a905290830185905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528d901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201527f0100000000000000000000000000000000000000000000000000000000000000609c820152609d0160405160208183030381529060405280519060200120955060715f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550613632565b8151516201d4c010156135a1576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018b905260c08a901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528c901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c820152609d016040516020818303038152906040528051906020012094505b5050808061363f9061691a565b91505061333b565b5061365287856167a9565b60735490945067ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690841611156136bb576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516060810182528381524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528b86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090931692909217948416830294909417905582547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff1693029290921790558790828116908516146137ed5761378f82856167e8565b6137a39067ffffffffffffffff1682616951565b607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff88160217905590505b61383f33308360705461380091906167d1565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692919061594b565b6138476157a7565b60405167ffffffffffffffff8616907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce905f90a25050505050505050505050565b613890614b55565b607761389c82826169b1565b5050565b6079545f9067ffffffffffffffff16156138e2575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613944576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607661395082826169b1565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516118dd919061602e565b5f54610100900460ff161580801561399e57505f54600160ff909116105b806139b75750303b1580156139b757505f5460ff166001145b613a43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610da5565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015613a9f575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b613aac602088018861627a565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055613b01604088016020890161627a565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055613b66608088016060890161627a565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076613bf086826169b1565b506077613bfd85826169b1565b5062093a80613c126060890160408a0161623e565b67ffffffffffffffff161115613c54576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613c64606088016040890161623e565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80613cc660a0890160808a0161623e565b67ffffffffffffffff161115613d08576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d1860a088016080890161623e565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613df7615a2d565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f00000000000000000000000000000000000000000000000000000000000000008585604051613e4c9493929190616b10565b60405180910390a18015612c9d575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613f1b576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615613f58576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613f93576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115613fcf576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff7801000000000000000000000000000000000000000000000000820481169161401a918491700100000000000000000000000000000000900416616b47565b1115614052576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b84811015614321575f8787838181106140b0576140b0616842565b90506020028101906140c2919061686f565b6140cb906168a1565b9050836140d781616809565b825180516020918201208185015160408087015190519499509194505f936141389386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146141c0576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f908152607160205260408120556141e4600189616951565b84036142535742607b60149054906101000a900467ffffffffffffffff16846040015161421191906167a9565b67ffffffffffffffff161115614253576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602083810151604080860151815193840189905290830185905260608084019290925260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201527f0100000000000000000000000000000000000000000000000000000000000000609c820152609d0160405160208183030381529060405280519060200120945050505080806143199061691a565b915050614095565b5061432c84846167a9565b6040805160608101825283815267ffffffffffffffff428116602080840191825260738054680100000000000000009081900485168688019081528589165f8181526072909552888520975188559451600190970180549151871683027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921697871697909717179095558054938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff958402959095167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff9094169390931793909317909155915192955090917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146144ab576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b158015614510575f80fd5b505af1158015614522573d5f803e3d5ffd5b50505050612825615acc565b614536614b55565b6040805160608101825293845267ffffffffffffffff92831660208086019182529284168583019081529584165f908152607290935291209251835551600190920180549351821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169290911691909117919091179055565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561461a576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614657576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6146606123ac565b90508181111561469c576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113888311156146d8576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61471a73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308461594b565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015614784573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147a891906166d4565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff169060186147e283616809565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051614819929190616b5a565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303614947576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26149a6565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9318233888860405161499d9493929190616b69565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146149fe576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca906020016118dd565b614a87614b55565b73ffffffffffffffffffffffffffffffffffffffff8116614b2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610da5565b61211981615852565b614b3b614b55565b67ffffffffffffffff165f90815260756020526040902055565b60335473ffffffffffffffffffffffffffffffffffffffff163314612825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610da5565b5f80614be06138a0565b905067ffffffffffffffff881615614caf5760795467ffffffffffffffff9081169089161115614c3c576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614614ca9576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614d4f565b67ffffffffffffffff87165f90815260756020526040902054915081614d01576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115614d4f576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611614d9c576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f614daa88888886896118e8565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051614dde91906166b9565b602060405180830381855afa158015614df9573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614e1c91906166d4565b614e269190616718565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91614ea891899190600401616b9e565b602060405180830381865afa158015614ec3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ee79190616bd8565b614f1d576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f8533614f2b858b6167e8565b67ffffffffffffffff16614f3d612aa3565b614f4791906167d1565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190615b5a565b50505050505050505050565b5f67ffffffffffffffff88161561505d5760795467ffffffffffffffff9081169089161115614fec576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614615057576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506150f8565b5067ffffffffffffffff85165f90815260756020526040902054806150ae576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff90811690871611156150f8576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff908116908816118061512a57508767ffffffffffffffff168767ffffffffffffffff1611155b80615151575060795467ffffffffffffffff68010000000000000000909104811690881611155b15615188576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f908152607860205260409020546801000000000000000090048116908616146151ea576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6151f887878785886118e8565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161522c91906166b9565b602060405180830381855afa158015615247573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061526a91906166d4565b6152749190616718565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916152f691889190600401616b9e565b602060405180830381865afa158015615311573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906153359190616bd8565b61536b576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614f85576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff6801000000000000000090910481169082161115806153fa575060795467ffffffffffffffff908116908216115b15615431576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b15801561555f575f80fd5b505af1158015615571573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e84600201546040516155c091815260200190565b60405180910390a3505050565b5f6155d66138a0565b9050815f806155e584846167e8565b606f5467ffffffffffffffff91821692505f916156089161010090041642616951565b90505b8467ffffffffffffffff168467ffffffffffffffff16146156925767ffffffffffffffff8085165f908152607260205260409020600181015490911682101561567057600181015468010000000000000000900467ffffffffffffffff16945061568c565b61567a86866167e8565b67ffffffffffffffff16935050615692565b5061560b565b5f61569d8484616951565b9050838110156156f457808403600c81116156b857806156bb565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a60705402816156ea576156ea6166eb565b0460705550615763565b838103600c81116157055780615708565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a7640000028161573e5761573e6166eb565b04905080607054670de0b6b3a7640000028161575c5761575c6166eb565b0460705550505b683635c9adc5dea00000607054111561578857683635c9adc5dea00000607055612c9d565b633b9aca006070541015612c9d57633b9aca0060705550505050505050565b60795467ffffffffffffffff680100000000000000008204811691161115612825576079545f906157ef9068010000000000000000900467ffffffffffffffff1660016167a9565b90506157fa81611e90565b15612119576079545f9060029061581c90849067ffffffffffffffff166167e8565b6158269190616bf3565b61583090836167a9565b905061583b81611e90565b156158495761389c816153c0565b61389c826153c0565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561592d575f80fd5b505af115801561593f573d5f803e3d5ffd5b50505050612825615bb5565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052615a279085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152615c47565b50505050565b5f54610100900460ff16615ac3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610da5565b61282533615852565b606f5460ff16615b08576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052615bb09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016159a5565b505050565b606f5460ff1615615bf2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f615ca8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615d529092919063ffffffff16565b805190915015615bb05780806020019051810190615cc69190616bd8565b615bb0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610da5565b6060615d6084845f85615d68565b949350505050565b606082471015615dfa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610da5565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051615e2291906166b9565b5f6040518083038185875af1925050503d805f8114615e5c576040519150601f19603f3d011682016040523d82523d5f602084013e615e61565b606091505b5091509150615e7287838387615e7d565b979650505050505050565b60608315615f125782515f03615f0b5773ffffffffffffffffffffffffffffffffffffffff85163b615f0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610da5565b5081615d60565b615d608383815115615f275781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da5919061602e565b803567ffffffffffffffff811681146130cf575f80fd5b5f805f805f60a08688031215615f86575f80fd5b615f8f86615f5b565b9450615f9d60208701615f5b565b9350615fab60408701615f5b565b94979396509394606081013594506080013592915050565b5f5b83811015615fdd578181015183820152602001615fc5565b50505f910152565b5f8151808452615ffc816020860160208601615fc3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6160406020830184615fe5565b9392505050565b8060408101831015616057575f80fd5b92915050565b5f805f805f805f806101a0898b031215616075575f80fd5b61607e89615f5b565b975061608c60208a01615f5b565b965061609a60408a01615f5b565b955060608901359450608089013593506160b78a60a08b01616047565b925061016089018a8111156160ca575f80fd5b60e08a0192506160da8b82616047565b9150509295985092959890939650565b5f602082840312156160fa575f80fd5b813561ffff81168114616040575f80fd5b5f805f805f60a0868803121561611f575f80fd5b61612886615f5b565b945061613660208701615f5b565b94979496505050506040830135926060810135926080909101359150565b806103008101831015616057575f80fd5b5f805f805f806103a0878903121561617b575f80fd5b61618487615f5b565b955061619260208801615f5b565b94506161a060408801615f5b565b935060608701359250608087013591506161bd8860a08901616154565b90509295509295509295565b5f805f805f805f6103c0888a0312156161e0575f80fd5b6161e988615f5b565b96506161f760208901615f5b565b955061620560408901615f5b565b945061621360608901615f5b565b93506080880135925060a088013591506162308960c08a01616154565b905092959891949750929550565b5f6020828403121561624e575f80fd5b61604082615f5b565b803573ffffffffffffffffffffffffffffffffffffffff811681146130cf575f80fd5b5f6020828403121561628a575f80fd5b61604082616257565b5f602082840312156162a3575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126162e6575f80fd5b813567ffffffffffffffff80821115616301576163016162aa565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715616347576163476162aa565b8160405283815286602085880101111561635f575f80fd5b836020870160208301375f602085830101528094505050505092915050565b8015158114612119575f80fd5b5f805f805f8060c087890312156163a0575f80fd5b86359550602087013567ffffffffffffffff8111156163bd575f80fd5b6163c989828a016162d7565b955050604087013593506163df60608801615f5b565b92506163ed60808801616257565b915060a08701356163fd8161637e565b809150509295509295509295565b5f8083601f84011261641b575f80fd5b50813567ffffffffffffffff811115616432575f80fd5b6020830191508360208260051b850101111561644c575f80fd5b9250929050565b5f805f60408486031215616465575f80fd5b833567ffffffffffffffff81111561647b575f80fd5b6164878682870161640b565b909450925061649a905060208501616257565b90509250925092565b5f602082840312156164b3575f80fd5b813567ffffffffffffffff8111156164c9575f80fd5b615d60848285016162d7565b5f8083601f8401126164e5575f80fd5b50813567ffffffffffffffff8111156164fc575f80fd5b60208301915083602082850101111561644c575f80fd5b5f805f805f8086880361012081121561652a575f80fd5b60a0811215616537575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff8082111561655c575f80fd5b6165688a838b016162d7565b955060e089013591508082111561657d575f80fd5b6165898a838b016162d7565b945061010089013591508082111561659f575f80fd5b506165ac89828a016164d5565b979a9699509497509295939492505050565b5f80602083850312156165cf575f80fd5b823567ffffffffffffffff8111156165e5575f80fd5b6165f18582860161640b565b90969095509350505050565b5f805f8060808587031215616610575f80fd5b61661985615f5b565b93506020850135925061662e60408601615f5b565b915061663c60608601615f5b565b905092959194509250565b5f805f60408486031215616659575f80fd5b833567ffffffffffffffff81111561666f575f80fd5b61667b868287016164d5565b909790965060209590950135949350505050565b5f80604083850312156166a0575f80fd5b823591506166b060208401615f5b565b90509250929050565b5f82516166ca818460208701615fc3565b9190910192915050565b5f602082840312156166e4575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82616726576167266166eb565b500690565b600181811c9082168061673f57607f821691505b602082108103616776577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156167ca576167ca61677c565b5092915050565b80820281158282048414176160575761605761677c565b67ffffffffffffffff8281168282160390808211156167ca576167ca61677c565b5f67ffffffffffffffff8083168181036168255761682561677c565b6001019392505050565b5f8261683d5761683d6166eb565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126166ca575f80fd5b5f606082360312156168b1575f80fd5b6040516060810167ffffffffffffffff82821081831117156168d5576168d56162aa565b8160405284359150808211156168e9575f80fd5b506168f6368286016162d7565b8252506020830135602082015261690f60408401615f5b565b604082015292915050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361694a5761694a61677c565b5060010190565b818103818111156160575761605761677c565b601f821115615bb0575f81815260208120601f850160051c8101602086101561698a5750805b601f850160051c820191505b818110156169a957828155600101616996565b505050505050565b815167ffffffffffffffff8111156169cb576169cb6162aa565b6169df816169d9845461672b565b84616964565b602080601f831160018114616a31575f84156169fb5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556169a9565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015616a7d57888601518255948401946001909101908401616a5e565b5085821015616ab957878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152616b3d606083018486616ac9565b9695505050505050565b808201808211156160575761605761677c565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f616b3d606083018486616ac9565b6103208101610300808584378201835f5b6001811015616bce578151835260209283019290910190600101616baf565b5050509392505050565b5f60208284031215616be8575f80fd5b81516160408161637e565b5f67ffffffffffffffff80841680616c0d57616c0d6166eb565b9216919091049291505056fea264697066735822122030d7e5b8e946812a9ca8fbe3f42e166f37589c6e0b9c47a75570b8bd2e1c9a8d64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610475575f3560e01c80638da5cb5b1161025d578063c754c7ed11610148578063e7a7ed02116100c3578063f14916d611610093578063f851a44011610079578063f851a44014610c8a578063f8b823e414610caa578063fe16564f14610cb3575f80fd5b8063f14916d614610c64578063f2fde38b14610c77575f80fd5b8063e7a7ed0214610bcd578063e8bf92ed14610bfd578063eaeb077b14610c24578063ed6b010414610c37575f80fd5b8063d2e129f911610118578063d939b315116100fe578063d939b31514610b8a578063dbc1697614610bb2578063e0d1744114610bba575f80fd5b8063d2e129f914610b64578063d8d1091b14610b77575f80fd5b8063c754c7ed14610acf578063c89e42df14610afb578063cfa8ed4714610b0e578063d02103ca14610b3d575f80fd5b8063adc879e9116101d8578063b6b0b097116101a8578063c00e0dc91161018e578063c00e0dc914610aa1578063c0cad30214610ab4578063c0ed84e014610ac7575f80fd5b8063b6b0b09714610a67578063ba58ae3914610a8e575f80fd5b8063adc879e914610999578063afd23cbe146109c0578063b4d63f58146109ee578063b4f77ea914610a54575f80fd5b80639b7967601161022d578063a066215c11610213578063a066215c1461094c578063a3c573eb1461095f578063ada8f91914610986575f80fd5b80639b796760146109265780639c9f3dfe14610939575f80fd5b80638da5cb5b146108da57806396dc3d39146108f857806399f5634e1461090b5780639aa972a314610913575f80fd5b80634a1a89a71161037d5780636ff512cc116102f8578063831c7ead116102c8578063841b24d7116102ae578063841b24d7146107f75780638449a79c146108275780638c3d7301146108d2575f80fd5b8063831c7ead1461075c578063837a473814610783575f80fd5b80636ff512cc1461071a578063715018a61461072d5780637215541a146107355780637fcb365314610748575f80fd5b8063542028d51161034d578063604691691161033357806360469169146106e0578063621dd411146106e85780636b8616ce146106fb575f80fd5b8063542028d5146106d05780635ec91958146106d8575f80fd5b80634a1a89a71461066b5780634a910e6a1461068b5780634e4877061461069e5780635392c5e0146106b1575f80fd5b8063298789831161040d578063383b3be8116103dd578063423fa856116103c3578063423fa8561461060f578063456052671461062f578063458c047714610657575f80fd5b8063383b3be8146105e9578063394218e9146105fc575f80fd5b806329878983146105835780632a9f208f146105af5780632b0006fa146105c35780632c1f816a146105d6575f80fd5b806315064c961161044857806315064c96146104fb5780631816b7e514610518578063220d78991461052b578063267822471461053e575f80fd5b80630a0d9fbe146104795780630eaa86ea146104b0578063107bf28c146104d157806310a01a72146104e6575b5f80fd5b606f5461049290610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6104c36104be366004615f72565b610cc6565b6040519081526020016104a7565b6104d9611196565b6040516104a7919061602e565b6104f96104f436600461605d565b611222565b005b606f546105089060ff1681565b60405190151581526020016104a7565b6104f96105263660046160ea565b6117d0565b6104d961053936600461610b565b6118e8565b607b5461055e9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104a7565b60745461055e9068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6073546104929067ffffffffffffffff1681565b6104f96105d1366004616165565b611abe565b6104f96105e43660046161c9565b611c88565b6105086105f736600461623e565b611e90565b6104f961060a36600461623e565b611ee5565b6073546104929068010000000000000000900467ffffffffffffffff1681565b60735461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546104929067ffffffffffffffff1681565b6079546104929068010000000000000000900467ffffffffffffffff1681565b6104f961069936600461623e565b612069565b6104f96106ac36600461623e565b61211c565b6104c36106bf36600461623e565b60756020525f908152604090205481565b6104d96122a0565b6104f96122ad565b6104c36123ac565b6104f96106f6366004616165565b6123c1565b6104c361070936600461623e565b60716020525f908152604090205481565b6104f961072836600461627a565b61273f565b6104f9612814565b6104f961074336600461623e565b612827565b6074546104929067ffffffffffffffff1681565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b6107cb610791366004616293565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016104a7565b607954610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104c361083536600461638b565b845160209586012060408051808801989098528781019190915260608088019590955260c09390931b7fffffffffffffffff000000000000000000000000000000000000000000000000166080870152921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608885015290151560f81b609c8401528051808403607d018152609d9093019052815191012090565b6104f9612994565b60335473ffffffffffffffffffffffffffffffffffffffff1661055e565b6104f961090636600461623e565b612a60565b6104c3612aa3565b6104f96109213660046161c9565b612bf6565b6104f961093436600461623e565b612ca6565b6104f961094736600461623e565b612cf5565b6104f961095a36600461623e565b612e71565b61055e7f000000000000000000000000000000000000000000000000000000000000000081565b6104f961099436600461627a565b612f77565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b606f546109db906901000000000000000000900461ffff1681565b60405161ffff90911681526020016104a7565b610a2e6109fc36600461623e565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016104a7565b6104f9610a6236600461623e565b61303b565b61055e7f000000000000000000000000000000000000000000000000000000000000000081565b610508610a9c366004616293565b61304c565b6104f9610aaf366004616453565b6130d4565b6104f9610ac23660046164a3565b613888565b6104926138a0565b607b546104929074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9610b093660046164a3565b6138f3565b606f5461055e906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61055e7f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610b72366004616513565b613980565b6104f9610b853660046165be565b613ebe565b60795461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6104f961445a565b6104f9610bc83660046165fd565b61452e565b607354610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61055e7f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610c32366004616647565b6145bd565b607b54610508907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b6104f9610c7236600461627a565b6149ad565b6104f9610c8536600461627a565b614a7f565b607a5461055e9073ffffffffffffffffffffffffffffffffffffffff1681565b6104c360705481565b6104f9610cc136600461668f565b614b33565b5f805f610cd16138a0565b905067ffffffffffffffff881615610e9d5760795467ffffffffffffffff9081169089161115610dae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a4015b60405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614610e97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610da5565b50611035565b67ffffffffffffffff87165f90815260756020526040902054915081610f6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610da5565b8067ffffffffffffffff168767ffffffffffffffff161115611035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610da5565b8067ffffffffffffffff168667ffffffffffffffff16116110fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610da5565b5f61110c88888886896118e8565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161114091906166b9565b602060405180830381855afa15801561115b573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061117e91906166d4565b6111889190616718565b9a9950505050505050505050565b607780546111a39061672b565b80601f01602080910402602001604051908101604052809291908181526020018280546111cf9061672b565b801561121a5780601f106111f15761010080835404028352916020019161121a565b820191905f5260205f20905b8154815290600101906020018083116111fd57829003601f168201915b505050505081565b61122a614b55565b5f806112346138a0565b905067ffffffffffffffff8a16156113fb5760795467ffffffffffffffff908116908b16111561130c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a401610da5565b67ffffffffffffffff808b165f9081526078602052604090206002810154815490945090918b81166801000000000000000090920416146113f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610da5565b50611593565b67ffffffffffffffff89165f908152607560205260409020549150816114c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610da5565b8067ffffffffffffffff168967ffffffffffffffff161115611593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610da5565b8067ffffffffffffffff168867ffffffffffffffff161161165c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610da5565b5f61166a8a8a8a868b6118e8565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8c81169182179092555f90815260756020526040902089905560795491925016156116e757607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018990527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b15801561176c575f80fd5b505af115801561177e573d5f803e3d5ffd5b505060405189815233925067ffffffffffffffff8c1691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe9060200160405180910390a35050505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611821576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff16108061183a57506103ff8161ffff16115b15611871576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f81815260726020526040808220549388168252902054606092911580159061191b575081155b15611952576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80611989576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119928461304c565b6119c8576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611b1b576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b29868686868686614bd6565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611ba357607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611c28575f80fd5b505af1158015611c3a573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611ce5576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cf487878787878787614f91565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611d6e57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611df3575f80fd5b505af1158015611e05573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611ed392700100000000000000000000000000000000909204811691166167a9565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611f36576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611f7d576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16611fec5760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611fec576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1906020016118dd565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461211057606f5460ff16156120d1576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120da81611e90565b612110576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612119816153c0565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461216d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156121b4576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661221f57607b5467ffffffffffffffff7401000000000000000000000000000000000000000090910481169082161061221f576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020016118dd565b607680546111a39061672b565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146122fe576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1661235a576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f60705460646123bc91906167d1565b905090565b606f5460ff16156123fe576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f90815260726020526040902060010154429261244a927801000000000000000000000000000000000000000000000000909104811691166167a9565b67ffffffffffffffff16111561248c576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e861249986866167e8565b67ffffffffffffffff1611156124db576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124e9868686868686614bd6565b6124f2846155cd565b607954700100000000000000000000000000000000900467ffffffffffffffff165f0361263357607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f908152607560205260409020839055607954161561259357607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612618575f80fd5b505af115801561262a573d5f803e3d5ffd5b50505050612701565b61263b6157a7565b6079805467ffffffffffffffff16905f61265483616809565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001611c78565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612790576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016118dd565b61281c614b55565b6128255f615852565b565b60335473ffffffffffffffffffffffffffffffffffffffff16331461298c575f61284f6138a0565b90508067ffffffffffffffff168267ffffffffffffffff161161289e576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000909104811690831611806128e3575067ffffffffffffffff8083165f9081526072602052604090206001015416155b1561291a576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916129489162093a8091166167a9565b67ffffffffffffffff16111561298a576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6121196158c8565b607b5473ffffffffffffffffffffffffffffffffffffffff1633146129e5576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b612a68614b55565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015612b2f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b5391906166d4565b90505f612b5e6138a0565b60735467ffffffffffffffff680100000000000000008204811691612bb691700100000000000000000000000000000000820481169178010000000000000000000000000000000000000000000000009004166167e8565b612bc091906167a9565b612bca91906167e8565b67ffffffffffffffff169050805f03612be5575f9250505090565b612bef818361682f565b9250505090565b606f5460ff1615612c33576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c4287878787878787614f91565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1612c9d6158c8565b50505050505050565b612cae614b55565b6073805467ffffffffffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612d46576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115612d8d576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16612df45760795467ffffffffffffffff700100000000000000000000000000000000909104811690821610612df4576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75906020016118dd565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612ec2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff161115612f09576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28906020016118dd565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612fc8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016118dd565b613043614b55565b612119816155cd565b5f67ffffffff0000000167ffffffffffffffff8316108015613083575067ffffffff00000001604083901c67ffffffffffffffff16105b80156130a4575067ffffffff00000001608083901c67ffffffffffffffff16105b80156130bb575067ffffffff0000000160c083901c105b156130c857506001919050565b505f919050565b919050565b606f5460ff1615613111576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314613171576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f8190036131ac576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156131e8576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561324d575f80fd5b505af115801561325f573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132f191906166d4565b60735467ffffffffffffffff68010000000000000000820481165f818152607260205260408120549495504294919370010000000000000000000000000000000090049092169182905b87811015613647575f8b8b8381811061335657613356616842565b9050602002810190613368919061686f565b613371906168a1565b8051805160209091012060408201519192509067ffffffffffffffff1615613562578561339d81616809565b9650505f81836020015184604001516040516020016133f493929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f9081526071909352912054909150811461347c576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015181519384018a905290830185905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528d901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201527f0100000000000000000000000000000000000000000000000000000000000000609c820152609d0160405160208183030381529060405280519060200120955060715f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550613632565b8151516201d4c010156135a1576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018b905260c08a901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528c901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c820152609d016040516020818303038152906040528051906020012094505b5050808061363f9061691a565b91505061333b565b5061365287856167a9565b60735490945067ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690841611156136bb576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516060810182528381524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528b86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090931692909217948416830294909417905582547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff1693029290921790558790828116908516146137ed5761378f82856167e8565b6137a39067ffffffffffffffff1682616951565b607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff88160217905590505b61383f33308360705461380091906167d1565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692919061594b565b6138476157a7565b60405167ffffffffffffffff8616907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce905f90a25050505050505050505050565b613890614b55565b607761389c82826169b1565b5050565b6079545f9067ffffffffffffffff16156138e2575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613944576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607661395082826169b1565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516118dd919061602e565b5f54610100900460ff161580801561399e57505f54600160ff909116105b806139b75750303b1580156139b757505f5460ff166001145b613a43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610da5565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015613a9f575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b613aac602088018861627a565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055613b01604088016020890161627a565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055613b66608088016060890161627a565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076613bf086826169b1565b506077613bfd85826169b1565b5062093a80613c126060890160408a0161623e565b67ffffffffffffffff161115613c54576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613c64606088016040890161623e565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80613cc660a0890160808a0161623e565b67ffffffffffffffff161115613d08576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d1860a088016080890161623e565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613df7615a2d565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f00000000000000000000000000000000000000000000000000000000000000008585604051613e4c9493929190616b10565b60405180910390a18015612c9d575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613f1b576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615613f58576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613f93576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115613fcf576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff7801000000000000000000000000000000000000000000000000820481169161401a918491700100000000000000000000000000000000900416616b47565b1115614052576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b84811015614321575f8787838181106140b0576140b0616842565b90506020028101906140c2919061686f565b6140cb906168a1565b9050836140d781616809565b825180516020918201208185015160408087015190519499509194505f936141389386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146141c0576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f908152607160205260408120556141e4600189616951565b84036142535742607b60149054906101000a900467ffffffffffffffff16846040015161421191906167a9565b67ffffffffffffffff161115614253576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602083810151604080860151815193840189905290830185905260608084019290925260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201527f0100000000000000000000000000000000000000000000000000000000000000609c820152609d0160405160208183030381529060405280519060200120945050505080806143199061691a565b915050614095565b5061432c84846167a9565b6040805160608101825283815267ffffffffffffffff428116602080840191825260738054680100000000000000009081900485168688019081528589165f8181526072909552888520975188559451600190970180549151871683027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921697871697909717179095558054938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff958402959095167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff9094169390931793909317909155915192955090917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146144ab576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b158015614510575f80fd5b505af1158015614522573d5f803e3d5ffd5b50505050612825615acc565b614536614b55565b6040805160608101825293845267ffffffffffffffff92831660208086019182529284168583019081529584165f908152607290935291209251835551600190920180549351821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169290911691909117919091179055565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561461a576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614657576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6146606123ac565b90508181111561469c576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113888311156146d8576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61471a73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308461594b565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015614784573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147a891906166d4565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff169060186147e283616809565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051614819929190616b5a565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303614947576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26149a6565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9318233888860405161499d9493929190616b69565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146149fe576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca906020016118dd565b614a87614b55565b73ffffffffffffffffffffffffffffffffffffffff8116614b2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610da5565b61211981615852565b614b3b614b55565b67ffffffffffffffff165f90815260756020526040902055565b60335473ffffffffffffffffffffffffffffffffffffffff163314612825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610da5565b5f80614be06138a0565b905067ffffffffffffffff881615614caf5760795467ffffffffffffffff9081169089161115614c3c576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614614ca9576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614d4f565b67ffffffffffffffff87165f90815260756020526040902054915081614d01576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115614d4f576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611614d9c576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f614daa88888886896118e8565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051614dde91906166b9565b602060405180830381855afa158015614df9573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614e1c91906166d4565b614e269190616718565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91614ea891899190600401616b9e565b602060405180830381865afa158015614ec3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ee79190616bd8565b614f1d576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f8533614f2b858b6167e8565b67ffffffffffffffff16614f3d612aa3565b614f4791906167d1565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190615b5a565b50505050505050505050565b5f67ffffffffffffffff88161561505d5760795467ffffffffffffffff9081169089161115614fec576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614615057576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506150f8565b5067ffffffffffffffff85165f90815260756020526040902054806150ae576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff90811690871611156150f8576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff908116908816118061512a57508767ffffffffffffffff168767ffffffffffffffff1611155b80615151575060795467ffffffffffffffff68010000000000000000909104811690881611155b15615188576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f908152607860205260409020546801000000000000000090048116908616146151ea576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6151f887878785886118e8565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161522c91906166b9565b602060405180830381855afa158015615247573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061526a91906166d4565b6152749190616718565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916152f691889190600401616b9e565b602060405180830381865afa158015615311573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906153359190616bd8565b61536b576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614f85576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff6801000000000000000090910481169082161115806153fa575060795467ffffffffffffffff908116908216115b15615431576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b15801561555f575f80fd5b505af1158015615571573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e84600201546040516155c091815260200190565b60405180910390a3505050565b5f6155d66138a0565b9050815f806155e584846167e8565b606f5467ffffffffffffffff91821692505f916156089161010090041642616951565b90505b8467ffffffffffffffff168467ffffffffffffffff16146156925767ffffffffffffffff8085165f908152607260205260409020600181015490911682101561567057600181015468010000000000000000900467ffffffffffffffff16945061568c565b61567a86866167e8565b67ffffffffffffffff16935050615692565b5061560b565b5f61569d8484616951565b9050838110156156f457808403600c81116156b857806156bb565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a60705402816156ea576156ea6166eb565b0460705550615763565b838103600c81116157055780615708565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a7640000028161573e5761573e6166eb565b04905080607054670de0b6b3a7640000028161575c5761575c6166eb565b0460705550505b683635c9adc5dea00000607054111561578857683635c9adc5dea00000607055612c9d565b633b9aca006070541015612c9d57633b9aca0060705550505050505050565b60795467ffffffffffffffff680100000000000000008204811691161115612825576079545f906157ef9068010000000000000000900467ffffffffffffffff1660016167a9565b90506157fa81611e90565b15612119576079545f9060029061581c90849067ffffffffffffffff166167e8565b6158269190616bf3565b61583090836167a9565b905061583b81611e90565b156158495761389c816153c0565b61389c826153c0565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561592d575f80fd5b505af115801561593f573d5f803e3d5ffd5b50505050612825615bb5565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052615a279085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152615c47565b50505050565b5f54610100900460ff16615ac3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610da5565b61282533615852565b606f5460ff16615b08576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052615bb09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016159a5565b505050565b606f5460ff1615615bf2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f615ca8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615d529092919063ffffffff16565b805190915015615bb05780806020019051810190615cc69190616bd8565b615bb0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610da5565b6060615d6084845f85615d68565b949350505050565b606082471015615dfa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610da5565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051615e2291906166b9565b5f6040518083038185875af1925050503d805f8114615e5c576040519150601f19603f3d011682016040523d82523d5f602084013e615e61565b606091505b5091509150615e7287838387615e7d565b979650505050505050565b60608315615f125782515f03615f0b5773ffffffffffffffffffffffffffffffffffffffff85163b615f0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610da5565b5081615d60565b615d608383815115615f275781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da5919061602e565b803567ffffffffffffffff811681146130cf575f80fd5b5f805f805f60a08688031215615f86575f80fd5b615f8f86615f5b565b9450615f9d60208701615f5b565b9350615fab60408701615f5b565b94979396509394606081013594506080013592915050565b5f5b83811015615fdd578181015183820152602001615fc5565b50505f910152565b5f8151808452615ffc816020860160208601615fc3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6160406020830184615fe5565b9392505050565b8060408101831015616057575f80fd5b92915050565b5f805f805f805f806101a0898b031215616075575f80fd5b61607e89615f5b565b975061608c60208a01615f5b565b965061609a60408a01615f5b565b955060608901359450608089013593506160b78a60a08b01616047565b925061016089018a8111156160ca575f80fd5b60e08a0192506160da8b82616047565b9150509295985092959890939650565b5f602082840312156160fa575f80fd5b813561ffff81168114616040575f80fd5b5f805f805f60a0868803121561611f575f80fd5b61612886615f5b565b945061613660208701615f5b565b94979496505050506040830135926060810135926080909101359150565b806103008101831015616057575f80fd5b5f805f805f806103a0878903121561617b575f80fd5b61618487615f5b565b955061619260208801615f5b565b94506161a060408801615f5b565b935060608701359250608087013591506161bd8860a08901616154565b90509295509295509295565b5f805f805f805f6103c0888a0312156161e0575f80fd5b6161e988615f5b565b96506161f760208901615f5b565b955061620560408901615f5b565b945061621360608901615f5b565b93506080880135925060a088013591506162308960c08a01616154565b905092959891949750929550565b5f6020828403121561624e575f80fd5b61604082615f5b565b803573ffffffffffffffffffffffffffffffffffffffff811681146130cf575f80fd5b5f6020828403121561628a575f80fd5b61604082616257565b5f602082840312156162a3575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126162e6575f80fd5b813567ffffffffffffffff80821115616301576163016162aa565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715616347576163476162aa565b8160405283815286602085880101111561635f575f80fd5b836020870160208301375f602085830101528094505050505092915050565b8015158114612119575f80fd5b5f805f805f8060c087890312156163a0575f80fd5b86359550602087013567ffffffffffffffff8111156163bd575f80fd5b6163c989828a016162d7565b955050604087013593506163df60608801615f5b565b92506163ed60808801616257565b915060a08701356163fd8161637e565b809150509295509295509295565b5f8083601f84011261641b575f80fd5b50813567ffffffffffffffff811115616432575f80fd5b6020830191508360208260051b850101111561644c575f80fd5b9250929050565b5f805f60408486031215616465575f80fd5b833567ffffffffffffffff81111561647b575f80fd5b6164878682870161640b565b909450925061649a905060208501616257565b90509250925092565b5f602082840312156164b3575f80fd5b813567ffffffffffffffff8111156164c9575f80fd5b615d60848285016162d7565b5f8083601f8401126164e5575f80fd5b50813567ffffffffffffffff8111156164fc575f80fd5b60208301915083602082850101111561644c575f80fd5b5f805f805f8086880361012081121561652a575f80fd5b60a0811215616537575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff8082111561655c575f80fd5b6165688a838b016162d7565b955060e089013591508082111561657d575f80fd5b6165898a838b016162d7565b945061010089013591508082111561659f575f80fd5b506165ac89828a016164d5565b979a9699509497509295939492505050565b5f80602083850312156165cf575f80fd5b823567ffffffffffffffff8111156165e5575f80fd5b6165f18582860161640b565b90969095509350505050565b5f805f8060808587031215616610575f80fd5b61661985615f5b565b93506020850135925061662e60408601615f5b565b915061663c60608601615f5b565b905092959194509250565b5f805f60408486031215616659575f80fd5b833567ffffffffffffffff81111561666f575f80fd5b61667b868287016164d5565b909790965060209590950135949350505050565b5f80604083850312156166a0575f80fd5b823591506166b060208401615f5b565b90509250929050565b5f82516166ca818460208701615fc3565b9190910192915050565b5f602082840312156166e4575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82616726576167266166eb565b500690565b600181811c9082168061673f57607f821691505b602082108103616776577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156167ca576167ca61677c565b5092915050565b80820281158282048414176160575761605761677c565b67ffffffffffffffff8281168282160390808211156167ca576167ca61677c565b5f67ffffffffffffffff8083168181036168255761682561677c565b6001019392505050565b5f8261683d5761683d6166eb565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126166ca575f80fd5b5f606082360312156168b1575f80fd5b6040516060810167ffffffffffffffff82821081831117156168d5576168d56162aa565b8160405284359150808211156168e9575f80fd5b506168f6368286016162d7565b8252506020830135602082015261690f60408401615f5b565b604082015292915050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361694a5761694a61677c565b5060010190565b818103818111156160575761605761677c565b601f821115615bb0575f81815260208120601f850160051c8101602086101561698a5750805b601f850160051c820191505b818110156169a957828155600101616996565b505050505050565b815167ffffffffffffffff8111156169cb576169cb6162aa565b6169df816169d9845461672b565b84616964565b602080601f831160018114616a31575f84156169fb5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556169a9565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015616a7d57888601518255948401946001909101908401616a5e565b5085821015616ab957878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152616b3d606083018486616ac9565b9695505050505050565b808201808211156160575761605761677c565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f616b3d606083018486616ac9565b6103208101610300808584378201835f5b6001811015616bce578151835260209283019290910190600101616baf565b5050509392505050565b5f60208284031215616be8575f80fd5b81516160408161637e565b5f67ffffffffffffffff80841680616c0d57616c0d6166eb565b9216919091049291505056fea264697066735822122030d7e5b8e946812a9ca8fbe3f42e166f37589c6e0b9c47a75570b8bd2e1c9a8d64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMTimelock.json b/compiled-contracts/PolygonZkEVMTimelock.json index 701df5c31..1ae918d75 100644 --- a/compiled-contracts/PolygonZkEVMTimelock.json +++ b/compiled-contracts/PolygonZkEVMTimelock.json @@ -892,8 +892,8 @@ "type": "receive" } ], - "bytecode": "0x60a060405234801562000010575f80fd5b5060405162002c4d38038062002c4d833981016040819052620000339162000412565b84848484620000515f8051602062002bcd8339815191528062000232565b620000795f8051602062002bed8339815191525f8051602062002bcd83398151915262000232565b620000a15f8051602062002c0d8339815191525f8051602062002bcd83398151915262000232565b620000c95f8051602062002c2d8339815191525f8051602062002bcd83398151915262000232565b620000e35f8051602062002bcd833981519152306200027c565b6001600160a01b038116156200010d576200010d5f8051602062002bcd833981519152826200027c565b5f5b83518110156200019057620001555f8051602062002bed833981519152858381518110620001415762000141620004ad565b60200260200101516200027c60201b60201c565b6200017d5f8051602062002c2d833981519152858381518110620001415762000141620004ad565b6200018881620004c1565b90506200010f565b505f5b8251811015620001d857620001c55f8051602062002c0d833981519152848381518110620001415762000141620004ad565b620001d081620004c1565b905062000193565b506002849055604080515f8152602081018690527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1505050506001600160a01b031660805250620004e692505050565b5f82815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6200028882826200028c565b5050565b5f828152602081815260408083206001600160a01b038516845290915290205460ff1662000288575f828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620002e63390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b634e487b7160e01b5f52604160045260245ffd5b6001600160a01b038116811462000353575f80fd5b50565b805162000363816200033e565b919050565b5f82601f83011262000378575f80fd5b815160206001600160401b03808311156200039757620003976200032a565b8260051b604051601f19603f83011681018181108482111715620003bf57620003bf6200032a565b604052938452858101830193838101925087851115620003dd575f80fd5b83870191505b848210156200040757620003f78262000356565b83529183019190830190620003e3565b979650505050505050565b5f805f805f60a0868803121562000427575f80fd5b855160208701519095506001600160401b038082111562000446575f80fd5b6200045489838a0162000368565b955060408801519150808211156200046a575f80fd5b50620004798882890162000368565b93505060608601516200048c816200033e565b60808701519092506200049f816200033e565b809150509295509295909350565b634e487b7160e01b5f52603260045260245ffd5b5f60018201620004df57634e487b7160e01b5f52601160045260245ffd5b5060010190565b6080516126c06200050d5f395f818161040201528181611124015261116401526126c05ff3fe6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220d904e0b10230579952f8427a107aa4349f9a1f5799108d399b11e28b578463e464736f6c634300081400335f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63fd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783", - "deployedBytecode": "0x6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220d904e0b10230579952f8427a107aa4349f9a1f5799108d399b11e28b578463e464736f6c63430008140033", + "bytecode": "0x60a060405234801562000010575f80fd5b5060405162002c4d38038062002c4d833981016040819052620000339162000412565b84848484620000515f8051602062002bcd8339815191528062000232565b620000795f8051602062002bed8339815191525f8051602062002bcd83398151915262000232565b620000a15f8051602062002c0d8339815191525f8051602062002bcd83398151915262000232565b620000c95f8051602062002c2d8339815191525f8051602062002bcd83398151915262000232565b620000e35f8051602062002bcd833981519152306200027c565b6001600160a01b038116156200010d576200010d5f8051602062002bcd833981519152826200027c565b5f5b83518110156200019057620001555f8051602062002bed833981519152858381518110620001415762000141620004ad565b60200260200101516200027c60201b60201c565b6200017d5f8051602062002c2d833981519152858381518110620001415762000141620004ad565b6200018881620004c1565b90506200010f565b505f5b8251811015620001d857620001c55f8051602062002c0d833981519152848381518110620001415762000141620004ad565b620001d081620004c1565b905062000193565b506002849055604080515f8152602081018690527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1505050506001600160a01b031660805250620004e692505050565b5f82815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6200028882826200028c565b5050565b5f828152602081815260408083206001600160a01b038516845290915290205460ff1662000288575f828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620002e63390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b634e487b7160e01b5f52604160045260245ffd5b6001600160a01b038116811462000353575f80fd5b50565b805162000363816200033e565b919050565b5f82601f83011262000378575f80fd5b815160206001600160401b03808311156200039757620003976200032a565b8260051b604051601f19603f83011681018181108482111715620003bf57620003bf6200032a565b604052938452858101830193838101925087851115620003dd575f80fd5b83870191505b848210156200040757620003f78262000356565b83529183019190830190620003e3565b979650505050505050565b5f805f805f60a0868803121562000427575f80fd5b855160208701519095506001600160401b038082111562000446575f80fd5b6200045489838a0162000368565b955060408801519150808211156200046a575f80fd5b50620004798882890162000368565b93505060608601516200048c816200033e565b60808701519092506200049f816200033e565b809150509295509295909350565b634e487b7160e01b5f52603260045260245ffd5b5f60018201620004df57634e487b7160e01b5f52601160045260245ffd5b5060010190565b6080516126c06200050d5f395f818161040201528181611124015261116401526126c05ff3fe6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220a51e9c8ab40666965f2c6a426c31d35eef4ebd6fb765348033b8ae6b30f36d1664736f6c634300081400335f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63fd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783", + "deployedBytecode": "0x6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220a51e9c8ab40666965f2c6a426c31d35eef4ebd6fb765348033b8ae6b30f36d1664736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/contracts/interfaces/IPolygonZkEVMBridgeV2.sol b/contracts/interfaces/IPolygonZkEVMBridgeV2.sol index 2ce7b35fd..63b0ec643 100644 --- a/contracts/interfaces/IPolygonZkEVMBridgeV2.sol +++ b/contracts/interfaces/IPolygonZkEVMBridgeV2.sol @@ -85,7 +85,8 @@ interface IPolygonZkEVMBridgeV2 { ) external payable; function claimAsset( - bytes32[32] calldata smtProof, + bytes32[32] calldata smtProofLocalExitRoot, + bytes32[32] calldata smtProofRollupExitRoot, uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, @@ -98,7 +99,8 @@ interface IPolygonZkEVMBridgeV2 { ) external; function claimMessage( - bytes32[32] calldata smtProof, + bytes32[32] calldata smtProofLocalExitRoot, + bytes32[32] calldata smtProofRollupExitRoot, uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, diff --git a/contracts/lib/DepositContractLib.sol b/contracts/lib/DepositContractLib.sol index c685e90df..a26099419 100644 --- a/contracts/lib/DepositContractLib.sol +++ b/contracts/lib/DepositContractLib.sol @@ -114,4 +114,31 @@ contract DepositContractLib { return node == root; } + + /** + * @notice calcualte root from merkle proof + * @param leafHash Leaf hash + * @param smtProof Smt proof + * @param index Index of the leaf + */ + function calculateRoot( + bytes32 leafHash, + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, + uint32 index + ) public pure returns (bytes32) { + bytes32 node = leafHash; + + // Check merkle proof + for ( + uint256 height = 0; + height < _DEPOSIT_CONTRACT_TREE_DEPTH; + height++ + ) { + if (((index >> height) & 1) == 1) + node = keccak256(abi.encodePacked(smtProof[height], node)); + else node = keccak256(abi.encodePacked(node, smtProof[height])); + } + + return node; + } } diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index 15f6fe716..573a5b413 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -648,7 +648,7 @@ abstract contract PolygonRollupManager is //////////////////////////////////// /** - * @notice Sequence batches + * @notice Sequence batches, callback called by one of the consensus managed by this contract * @param newSequencedBatch new sequenced batch * @param newAccInputHash new accumualted input hash */ @@ -1318,7 +1318,9 @@ abstract contract PolygonRollupManager is /** * @notice Get the last verified batch */ - function getLastVerifiedBatch(uint64 rollupID) public returns (uint64) { + function getLastVerifiedBatch( + uint64 rollupID + ) public view returns (uint64) { return _getLastVerifiedBatch(rollupIDToRollupData[rollupID]); } @@ -1327,7 +1329,7 @@ abstract contract PolygonRollupManager is */ function _getLastVerifiedBatch( RollupData storage rollup - ) internal returns (uint64) { + ) internal view returns (uint64) { if (rollup.lastPendingState > 0) { return rollup diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index ecf0b2608..7142458e9 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -157,8 +157,8 @@ contract PolygonZkEVMBridgeV2 is bytes calldata permitData ) public payable virtual ifNotEmergencyState nonReentrant { if ( - destinationNetwork == networkID || - destinationNetwork >= _CURRENT_SUPPORTED_NETWORKS + destinationNetwork == networkID + // TODO destinationNetwork >= rollupManager.rollupCount() ?¿ ) { revert DestinationNetworkInvalid(); } @@ -269,8 +269,7 @@ contract PolygonZkEVMBridgeV2 is bytes calldata metadata ) external payable ifNotEmergencyState { if ( - destinationNetwork == networkID || - destinationNetwork >= _CURRENT_SUPPORTED_NETWORKS + destinationNetwork == networkID // TODO destinationNetwork >= rollupManager.rollupCount() ?¿ ) { revert DestinationNetworkInvalid(); } @@ -304,9 +303,11 @@ contract PolygonZkEVMBridgeV2 is } } + // Maitain previous approach?¿ /** * @notice Verify merkle proof and withdraw tokens/ether - * @param smtProof Smt proof + * @param smtProofLocalExitRoot Smt proof + * @param smtProofRollupExitRoot Smt proof * @param globalIndex Global index: bool(isMainnet)||uint32(indexRollupRoot)||uint32(indexDepositLeaf) * @param mainnetExitRoot Mainnet exit root * @param rollupExitRoot Rollup exit root @@ -318,7 +319,8 @@ contract PolygonZkEVMBridgeV2 is * @param metadata Abi encoded metadata if any, empty otherwise */ function claimAsset( - bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofLocalExitRoot, + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot, uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, @@ -329,19 +331,27 @@ contract PolygonZkEVMBridgeV2 is uint256 amount, bytes calldata metadata ) external ifNotEmergencyState { + // Destination network must be this networkID + if (destinationNetwork != networkID) { + revert DestinationNetworkInvalid(); + } + // Verify leaf exist and it does not have been claimed _verifyLeaf( - smtProof, + smtProofLocalExitRoot, + smtProofRollupExitRoot, globalIndex, mainnetExitRoot, rollupExitRoot, - originNetwork, - originTokenAddress, - destinationNetwork, - destinationAddress, - amount, - metadata, - _LEAF_TYPE_ASSET + getLeafValue( + _LEAF_TYPE_ASSET, + originNetwork, + originTokenAddress, + destinationNetwork, + destinationAddress, + amount, + keccak256(metadata) + ) ); // Transfer funds @@ -422,7 +432,8 @@ contract PolygonZkEVMBridgeV2 is * If the receiving address is an EOA, the call will result as a success * Which means that the amount of ether will be transferred correctly, but the message * will not trigger any execution - * @param smtProof Smt proof + * @param smtProofLocalExitRoot Smt proof + * @param smtProofRollupExitRoot Smt proof * @param globalIndex Index of the leaf * @param mainnetExitRoot Mainnet exit root * @param rollupExitRoot Rollup exit root @@ -434,7 +445,8 @@ contract PolygonZkEVMBridgeV2 is * @param metadata Abi encoded metadata if any, empty otherwise */ function claimMessage( - bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofLocalExitRoot, + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot, uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, @@ -445,19 +457,27 @@ contract PolygonZkEVMBridgeV2 is uint256 amount, bytes calldata metadata ) external ifNotEmergencyState { + // Destination network must be this networkID + if (destinationNetwork != networkID) { + revert DestinationNetworkInvalid(); + } + // Verify leaf exist and it does not have been claimed _verifyLeaf( - smtProof, + smtProofLocalExitRoot, + smtProofRollupExitRoot, globalIndex, mainnetExitRoot, rollupExitRoot, - originNetwork, - originAddress, - destinationNetwork, - destinationAddress, - amount, - metadata, - _LEAF_TYPE_MESSAGE + getLeafValue( + _LEAF_TYPE_MESSAGE, + originNetwork, + originAddress, + destinationNetwork, + destinationAddress, + amount, + keccak256(metadata) + ) ); // Execute message @@ -555,30 +575,20 @@ contract PolygonZkEVMBridgeV2 is /** * @notice Verify leaf and checks that it has not been claimed - * @param smtProof Smt proof + * @param smtProofLocalExitRoot Smt proof + * @param smtProofRollupExitRoot Smt proof * @param globalIndex Index of the leaf * @param mainnetExitRoot Mainnet exit root * @param rollupExitRoot Rollup exit root - * @param originNetwork Origin network - * @param originAddress Origin address - * @param destinationNetwork Network destination - * @param destinationAddress Address destination - * @param amount Amount of tokens - * @param metadata Abi encoded metadata if any, empty otherwise - * @param leafType Leaf type --> [0] transfer Ether / ERC20 tokens, [1] message + * @param leafValue leaf value */ function _verifyLeaf( - bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofLocalExitRoot, + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot, uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, - uint32 originNetwork, - address originAddress, - uint32 destinationNetwork, - address destinationAddress, - uint256 amount, - bytes calldata metadata, - uint8 leafType + bytes32 leafValue ) internal { // Check timestamp where the global exit root was set uint256 timestampGlobalExitRoot = globalExitRootManager @@ -589,85 +599,65 @@ contract PolygonZkEVMBridgeV2 is ) ); + // check that thi global exit root exist if (timestampGlobalExitRoot == 0) { revert GlobalExitRootInvalid(); } - // Destination network must be networkID - if (destinationNetwork != networkID) { - revert DestinationNetworkInvalid(); - } - uint32 leafIndex; - bytes32 claimRoot; + uint32 originNetwork; - //TODO - if (networkID == _MAINNET_NETWORK_ID) { - // Verify merkle proof using rollup exit root - claimRoot = rollupExitRoot; - } else { - // Verify merkle proof using mainnet exit root - claimRoot = mainnetExitRoot; - } + // Get origin network from global index + if (globalIndex & _GLOBAL_INDEX_MAINNET_FLAG == 1) { + // It's mainnet, therefore origin network is 0 - if (globalIndex & _GLOBAL_INDEX_MAINNET_FLAG == 0) { - // Rollup claim + // last 32 bits are leafIndex + leafIndex = uint32(globalIndex); - // Verify merkle proof using rollup exit root - claimRoot = rollupExitRoot; if ( !verifyMerkleProof( - getLeafValue( - leafType, - originNetwork, - originAddress, - destinationNetwork, - destinationAddress, - amount, - keccak256(metadata) - ), - smtProof, + leafValue, + smtProofLocalExitRoot, leafIndex, - rollupExitRoot + mainnetExitRoot ) ) { revert InvalidSmtProof(); } } else { - // mainnet claim + // it's a rollup, therefore we have to infer the origin network + uint32 indexRollup = uint32(globalIndex >> 32); + originNetwork = indexRollup + 1; + + // last 32 bits are leafIndex + leafIndex = uint32(globalIndex); - // verify merkle proof using mainnet exit root + // verify merkle proof agains rollup exit root if ( !verifyMerkleProof( - getLeafValue( - leafType, - originNetwork, - originAddress, - destinationNetwork, - destinationAddress, - amount, - keccak256(metadata) - ), - smtProof, - leafIndex, - mainnetExitRoot + calculateRoot(leafValue, smtProofLocalExitRoot, leafIndex), + smtProofRollupExitRoot, + indexRollup, + rollupExitRoot ) ) { revert InvalidSmtProof(); } } + // TODO must calcualte TRUE origin network + // Set and check nullifier _setAndCheckClaimed(leafIndex, originNetwork); } /** * @notice Function to check if an index is claimed or not - * @param index Index + * @param leafIndex Index * @param originNetwork origin network */ function isClaimed( - uint32 index, + uint32 leafIndex, uint32 originNetwork ) external view returns (bool) { uint256 globalIndex; @@ -677,10 +667,10 @@ contract PolygonZkEVMBridgeV2 is networkID == _MAINNET_NETWORK_ID && originNetwork == _ZKEVM_NETWORK_ID ) { - globalIndex = uint256(index); + globalIndex = uint256(leafIndex); } else { globalIndex = - uint256(index) + + uint256(leafIndex) + uint256(originNetwork) * _MAX_LEAFS_PER_NETWORK; } @@ -695,12 +685,23 @@ contract PolygonZkEVMBridgeV2 is * @param originNetwork origin network */ function _setAndCheckClaimed( - uint256 leafIndex, - uint256 originNetwork + uint32 leafIndex, + uint32 originNetwork ) private { - uint256 globalIndex = leafIndex + - originNetwork * - _MAX_LEAFS_PER_NETWORK; + uint256 globalIndex; + + // For consistency with the previous setted nullifiers + if ( + networkID == _MAINNET_NETWORK_ID && + originNetwork == _ZKEVM_NETWORK_ID + ) { + globalIndex = uint256(leafIndex); + } else { + globalIndex = + uint256(leafIndex) + + uint256(originNetwork) * + _MAX_LEAFS_PER_NETWORK; + } (uint256 wordPos, uint256 bitPos) = _bitmapPositions(globalIndex); uint256 mask = 1 << bitPos; uint256 flipped = claimedBitMap[wordPos] ^= mask; diff --git a/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol b/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol index 4ed70a6db..3471f1c34 100644 --- a/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol +++ b/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol @@ -6,6 +6,11 @@ import "../interfaces/IPolygonZkEVMGlobalExitRoot.sol"; import "../lib/GlobalExitRootLib.sol"; import "../lib/DepositContractLib.sol"; +// TODO it is requierde a special ugpradbility for this contract since overlap storage slots +// This means that the lastRollupExitRoot and the lastMainnetExitRoot must be copei using assembly form prv version + +// another and seems better approach will be to define a contract base which will contain tthe same slots + /** * Contract responsible for managing the exit roots across multiple networks */ diff --git a/contracts/v2/PolygonZkEVMV2.sol b/contracts/v2/PolygonZkEVMV2.sol index 73c4e8902..94b018281 100644 --- a/contracts/v2/PolygonZkEVMV2.sol +++ b/contracts/v2/PolygonZkEVMV2.sol @@ -602,7 +602,7 @@ contract PolygonZkEVMV2 is ) public onlyRollupManager { // Get feeToken reward feeToken.safeTransfer( - msg.sender, + beneficiary, calculateRewardPerBatch() * (batchesToReward) ); } @@ -990,7 +990,7 @@ contract PolygonZkEVMV2 is /** * @notice Function to calculate the reward to verify a single batch */ - function calculateRewardPerBatch() public returns (uint256) { + function calculateRewardPerBatch() public view returns (uint256) { uint256 currentBalance = feeToken.balanceOf(address(this)); // Total Sequenced Batches = forcedBatches to be sequenced (total forced Batches - sequenced Batches) + sequencedBatches @@ -1006,7 +1006,7 @@ contract PolygonZkEVMV2 is /** * @notice Get the last verified batch */ - function getLastVerifiedBatch() public returns (uint64) { + function getLastVerifiedBatch() public view returns (uint64) { return rollupManager.getLastVerifiedBatch(rollupID); } } diff --git a/docs/lib/DepositContractLib.md b/docs/lib/DepositContractLib.md index b25396ffb..98d0b10b3 100644 --- a/docs/lib/DepositContractLib.md +++ b/docs/lib/DepositContractLib.md @@ -46,3 +46,21 @@ Verify merkle 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/PolygonRollupManager.md b/docs/v2/PolygonRollupManager.md index 4665a54d5..e3fc5ff38 100644 --- a/docs/v2/PolygonRollupManager.md +++ b/docs/v2/PolygonRollupManager.md @@ -179,7 +179,7 @@ get the current rollup exit root bytes32 newAccInputHash ) external ``` -Sequence batches +Sequence batches, callback called by one of the consensus managed by this contract #### Parameters: diff --git a/docs/v2/PolygonZkEVMBridgeV2.md b/docs/v2/PolygonZkEVMBridgeV2.md index 6eede6797..74e482f3c 100644 --- a/docs/v2/PolygonZkEVMBridgeV2.md +++ b/docs/v2/PolygonZkEVMBridgeV2.md @@ -69,7 +69,8 @@ Bridge message and send ETH value ### claimAsset ```solidity function claimAsset( - bytes32[32] smtProof, + bytes32[32] smtProofLocalExitRoot, + bytes32[32] smtProofRollupExitRoot, uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, @@ -87,7 +88,8 @@ Verify merkle proof and withdraw tokens/ether #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`smtProof` | bytes32[32] | Smt proof +|`smtProofLocalExitRoot` | bytes32[32] | Smt proof +|`smtProofRollupExitRoot` | bytes32[32] | Smt proof |`globalIndex` | uint256 | Global index: bool(isMainnet)||uint32(indexRollupRoot)||uint32(indexDepositLeaf) |`mainnetExitRoot` | bytes32 | Mainnet exit root |`rollupExitRoot` | bytes32 | Rollup exit root @@ -101,7 +103,8 @@ Verify merkle proof and withdraw tokens/ether ### claimMessage ```solidity function claimMessage( - bytes32[32] smtProof, + bytes32[32] smtProofLocalExitRoot, + bytes32[32] smtProofRollupExitRoot, uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, @@ -122,7 +125,8 @@ will not trigger any execution #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`smtProof` | bytes32[32] | Smt proof +|`smtProofLocalExitRoot` | bytes32[32] | Smt proof +|`smtProofRollupExitRoot` | bytes32[32] | Smt proof |`globalIndex` | uint256 | Index of the leaf |`mainnetExitRoot` | bytes32 | Mainnet exit root |`rollupExitRoot` | bytes32 | Rollup exit root @@ -197,17 +201,12 @@ Function to deactivate the emergency state ### _verifyLeaf ```solidity function _verifyLeaf( - bytes32[32] smtProof, + bytes32[32] smtProofLocalExitRoot, + bytes32[32] smtProofRollupExitRoot, uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, - uint32 originNetwork, - address originAddress, - uint32 destinationNetwork, - address destinationAddress, - uint256 amount, - bytes metadata, - uint8 leafType + bytes32 leafValue ) internal ``` Verify leaf and checks that it has not been claimed @@ -216,22 +215,17 @@ Verify leaf and checks that it has not been claimed #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`smtProof` | bytes32[32] | Smt proof +|`smtProofLocalExitRoot` | bytes32[32] | Smt proof +|`smtProofRollupExitRoot` | bytes32[32] | Smt proof |`globalIndex` | uint256 | Index of the leaf |`mainnetExitRoot` | bytes32 | Mainnet exit root |`rollupExitRoot` | bytes32 | Rollup exit root -|`originNetwork` | uint32 | Origin network -|`originAddress` | address | Origin address -|`destinationNetwork` | uint32 | Network destination -|`destinationAddress` | address | Address destination -|`amount` | uint256 | Amount of tokens -|`metadata` | bytes | Abi encoded metadata if any, empty otherwise -|`leafType` | uint8 | Leaf type --> [0] transfer Ether / ERC20 tokens, [1] message +|`leafValue` | bytes32 | leaf value ### isClaimed ```solidity function isClaimed( - uint32 index, + uint32 leafIndex, uint32 originNetwork ) external returns (bool) ``` @@ -241,7 +235,7 @@ Function to check if an index is claimed or not #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`index` | uint32 | Index +|`leafIndex` | uint32 | Index |`originNetwork` | uint32 | origin network ### updateGlobalExitRoot From 9fa8981718a626466f9e4aeae7e416a389e73f70 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 25 Sep 2023 07:33:00 +0200 Subject: [PATCH 018/230] fix --- contracts/v2/PolygonZkEVMBridgeV2.sol | 4 +--- contracts/v2/PolygonZkEVMGlobalExitRootV2.sol | 2 +- contracts/v2/PolygonZkEVMV2.sol | 3 +++ 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index 7142458e9..14a0bd821 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -625,7 +625,7 @@ contract PolygonZkEVMBridgeV2 is revert InvalidSmtProof(); } } else { - // it's a rollup, therefore we have to infer the origin network + // it's a rollup, therefore we have to get the origin network uint32 indexRollup = uint32(globalIndex >> 32); originNetwork = indexRollup + 1; @@ -645,8 +645,6 @@ contract PolygonZkEVMBridgeV2 is } } - // TODO must calcualte TRUE origin network - // Set and check nullifier _setAndCheckClaimed(leafIndex, originNetwork); } diff --git a/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol b/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol index 3471f1c34..c63f1efbc 100644 --- a/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol +++ b/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol @@ -124,7 +124,7 @@ contract PolygonZkEVMGlobalExitRootV2 is /** * @notice Computes and returns the merkle root */ - function makeHistoricGlobalExitRootSnapshot() public { + function takeHistoricGlobalExitRootSnapshot() public { bytes32 currentHistoricGlobalExitRoot = getRoot(); if ( historicGlobalExitRootSnapshots[currentHistoricGlobalExitRoot] == 0 diff --git a/contracts/v2/PolygonZkEVMV2.sol b/contracts/v2/PolygonZkEVMV2.sol index 94b018281..41b3bba2b 100644 --- a/contracts/v2/PolygonZkEVMV2.sol +++ b/contracts/v2/PolygonZkEVMV2.sol @@ -588,6 +588,7 @@ contract PolygonZkEVMV2 is batchFee * nonForcedBatchesSequenced ); + rollupManager.onSequenceBatches(currentBatchSequenced,currentAccInputHash); emit SequenceBatches(currentBatchSequenced); } @@ -858,6 +859,8 @@ contract PolygonZkEVMV2 is lastBatchSequenced = currentBatchSequenced; lastForceBatchSequenced = currentLastForceBatchSequenced; + rollupManager.onSequenceBatches(currentBatchSequenced,currentAccInputHash); + emit SequenceForceBatches(currentBatchSequenced); } From a45e0dbf440e270e7a421a3ef68d5d5948e41215 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 25 Sep 2023 09:08:19 +0200 Subject: [PATCH 019/230] add gas Tokens --- .../interfaces/IPolygonZkEVMBridgeV2.sol | 4 +- ...L2.sol => IPolygonZkEVMGasTokenBridge.sol} | 16 +- .../L2/PolygonZkEVMGasTokenBridge.sol} | 303 ++++++++++-------- contracts/{ => v2}/L2/WETHzkEVM.sol | 0 contracts/v2/PolygonZkEVMBridgeV2.sol | 12 +- deployment/1_createGenesis.js | 2 +- 6 files changed, 182 insertions(+), 155 deletions(-) rename contracts/interfaces/{IPolygonZkEVMBridgeL2.sol => IPolygonZkEVMGasTokenBridge.sol} (89%) rename contracts/{L2/PolygonZkEVMBridgeL2.sol => v2/L2/PolygonZkEVMGasTokenBridge.sol} (81%) rename contracts/{ => v2}/L2/WETHzkEVM.sol (100%) diff --git a/contracts/interfaces/IPolygonZkEVMBridgeV2.sol b/contracts/interfaces/IPolygonZkEVMBridgeV2.sol index 63b0ec643..f0a1f9509 100644 --- a/contracts/interfaces/IPolygonZkEVMBridgeV2.sol +++ b/contracts/interfaces/IPolygonZkEVMBridgeV2.sol @@ -4,9 +4,9 @@ pragma solidity ^0.8.20; interface IPolygonZkEVMBridgeV2 { /** - * @dev Thrown when sender is not the PolygonZkEVM address + * @dev Thrown when sender is not the rollup manager */ - error OnlyPolygonZkEVM(); + error OnlyRollupManager(); /** * @dev Thrown when the destination network is invalid diff --git a/contracts/interfaces/IPolygonZkEVMBridgeL2.sol b/contracts/interfaces/IPolygonZkEVMGasTokenBridge.sol similarity index 89% rename from contracts/interfaces/IPolygonZkEVMBridgeL2.sol rename to contracts/interfaces/IPolygonZkEVMGasTokenBridge.sol index 521c2776d..503ba87f8 100644 --- a/contracts/interfaces/IPolygonZkEVMBridgeL2.sol +++ b/contracts/interfaces/IPolygonZkEVMGasTokenBridge.sol @@ -2,7 +2,7 @@ pragma solidity 0.8.20; -interface IPolygonZkEVMBridgeL2 { +interface IPolygonZkEVMGasTokenBridge { /** * @dev Thrown when sender is not the PolygonZkEVM address */ @@ -86,8 +86,9 @@ interface IPolygonZkEVMBridgeL2 { ) external payable; function claimAsset( - bytes32[32] calldata smtProof, - uint32 index, + bytes32[32] calldata smtProofLocalExitRoot, + bytes32[32] calldata smtProofRollupExitRoot, + uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, @@ -99,8 +100,9 @@ interface IPolygonZkEVMBridgeL2 { ) external; function claimMessage( - bytes32[32] calldata smtProof, - uint32 index, + bytes32[32] calldata smtProofLocalExitRoot, + bytes32[32] calldata smtProofRollupExitRoot, + uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, @@ -112,8 +114,4 @@ interface IPolygonZkEVMBridgeL2 { ) external; function updateGlobalExitRoot() external; - - function activateEmergencyState() external; - - function deactivateEmergencyState() external; } diff --git a/contracts/L2/PolygonZkEVMBridgeL2.sol b/contracts/v2/L2/PolygonZkEVMGasTokenBridge.sol similarity index 81% rename from contracts/L2/PolygonZkEVMBridgeL2.sol rename to contracts/v2/L2/PolygonZkEVMGasTokenBridge.sol index 4d13c8d85..d3b89a0d9 100644 --- a/contracts/L2/PolygonZkEVMBridgeL2.sol +++ b/contracts/v2/L2/PolygonZkEVMGasTokenBridge.sol @@ -2,24 +2,22 @@ pragma solidity 0.8.20; -import "../lib/DepositContract.sol"; +import "../../lib/DepositContract.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; -import "../lib/TokenWrapped.sol"; -import "../interfaces/IBasePolygonZkEVMGlobalExitRoot.sol"; -import "../interfaces/IBridgeMessageReceiver.sol"; -import "../interfaces/IPolygonZkEVMBridgeL2.sol"; +import "../../lib/TokenWrapped.sol"; +import "../../interfaces/IBasePolygonZkEVMGlobalExitRoot.sol"; +import "../../interfaces/IBridgeMessageReceiver.sol"; +import "../../interfaces/IPolygonZkEVMGasTokenBridge.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol"; -import "../lib/EmergencyManager.sol"; -import "../lib/GlobalExitRootLib.sol"; +import "../../lib/GlobalExitRootLib.sol"; /** * PolygonZkEVMBridge that will be deployed on both networks Ethereum and Polygon zkEVM * Contract responsible to manage the token interactions with other networks */ -contract PolygonZkEVMBridgeL2 is +contract PolygonZkEVMGasTokenBridge is DepositContract, - EmergencyManager, - IPolygonZkEVMBridgeL2 + IPolygonZkEVMGasTokenBridge { using SafeERC20Upgradeable for IERC20Upgradeable; @@ -38,6 +36,9 @@ contract PolygonZkEVMBridgeL2 is // Mainnet identifier uint32 private constant _MAINNET_NETWORK_ID = 0; + // ZkEVM identifier + uint32 private constant _ZKEVM_NETWORK_ID = 1; + // Number of networks supported by the bridge uint32 private constant _CURRENT_SUPPORTED_NETWORKS = 2; @@ -47,6 +48,12 @@ contract PolygonZkEVMBridgeL2 is // Leaf type message uint8 private constant _LEAF_TYPE_MESSAGE = 1; + // Nullifier offset + uint256 private constant _MAX_LEAFS_PER_NETWORK = 2 ** 32; + + // // Indicate where's the mainnet flag bit in the global index + uint256 private constant _GLOBAL_INDEX_MAINNET_FLAG = 2 ** 64; + // Network identifier uint32 public networkID; @@ -65,9 +72,6 @@ contract PolygonZkEVMBridgeL2 is // Wrapped token Address --> Origin token information mapping(address => TokenInformation) public wrappedTokenToTokenInfo; - // PolygonZkEVM address - address public polygonZkEVMaddress; - // Native address address public gasTokenAddress; @@ -80,21 +84,18 @@ contract PolygonZkEVMBridgeL2 is /** * @param _networkID networkID * @param _globalExitRootManager global exit root manager address - * @param _polygonZkEVMaddress polygonZkEVM address * @notice The value of `_polygonZkEVMaddress` on the L2 deployment of the contract will be address(0), so * emergency state is not possible for the L2 deployment of the bridge, intentionally */ function initialize( uint32 _networkID, IBasePolygonZkEVMGlobalExitRoot _globalExitRootManager, - address _polygonZkEVMaddress, address _gasTokenAddress, uint32 _gasTokenNetwork, TokenWrapped _WETHToken ) external virtual initializer { networkID = _networkID; globalExitRootManager = _globalExitRootManager; - polygonZkEVMaddress = _polygonZkEVMaddress; // Set gas token gasTokenAddress = _gasTokenAddress; @@ -107,13 +108,6 @@ contract PolygonZkEVMBridgeL2 is __ReentrancyGuard_init(); } - modifier onlyPolygonZkEVM() { - if (polygonZkEVMaddress != msg.sender) { - revert OnlyPolygonZkEVM(); - } - _; - } - /** * @dev Emitted when bridge assets or messages to another network */ @@ -132,7 +126,7 @@ contract PolygonZkEVMBridgeL2 is * @dev Emitted when a claim is done from another network */ event ClaimEvent( - uint32 index, + uint256 globalIndex, uint32 originNetwork, address originAddress, address destinationAddress, @@ -165,10 +159,9 @@ contract PolygonZkEVMBridgeL2 is address token, bool forceUpdateGlobalExitRoot, bytes calldata permitData - ) public payable virtual ifNotEmergencyState nonReentrant { + ) public payable virtual nonReentrant { if ( - destinationNetwork == networkID || - destinationNetwork >= _CURRENT_SUPPORTED_NETWORKS + destinationNetwork == networkID // TODO ) { revert DestinationNetworkInvalid(); } @@ -260,7 +253,7 @@ contract PolygonZkEVMBridgeL2 is uint32(depositCount) ); - _deposit( + _addLeaf( getLeafValue( _LEAF_TYPE_ASSET, originNetwork, @@ -292,10 +285,9 @@ contract PolygonZkEVMBridgeL2 is uint256 amountWETH, bool forceUpdateGlobalExitRoot, bytes calldata metadata - ) external payable ifNotEmergencyState { + ) external payable { if ( - destinationNetwork == networkID || - destinationNetwork >= _CURRENT_SUPPORTED_NETWORKS + destinationNetwork == networkID // TODO ) { revert DestinationNetworkInvalid(); } @@ -319,7 +311,7 @@ contract PolygonZkEVMBridgeL2 is uint32(depositCount) ); - _deposit( + _addLeaf( getLeafValue( _LEAF_TYPE_MESSAGE, networkID, @@ -339,8 +331,9 @@ contract PolygonZkEVMBridgeL2 is /** * @notice Verify merkle proof and withdraw tokens/ether - * @param smtProof Smt proof - * @param index Index of the leaf + * @param smtProofLocalExitRoot Smt proof + * @param smtProofRollupExitRoot Smt proof + * @param globalIndex Global index: bool(isMainnet)||uint32(indexRollupRoot)||uint32(indexDepositLeaf) * @param mainnetExitRoot Mainnet exit root * @param rollupExitRoot Rollup exit root * @param originNetwork Origin network @@ -351,8 +344,9 @@ contract PolygonZkEVMBridgeL2 is * @param metadata Abi encoded metadata if any, empty otherwise */ function claimAsset( - bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, - uint32 index, + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofLocalExitRoot, + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot, + uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, @@ -361,20 +355,28 @@ contract PolygonZkEVMBridgeL2 is address destinationAddress, uint256 amount, bytes calldata metadata - ) external ifNotEmergencyState { + ) external { + // Destination network must be this networkID + if (destinationNetwork != networkID) { + revert DestinationNetworkInvalid(); + } + // Verify leaf exist and it does not have been claimed _verifyLeaf( - smtProof, - index, + smtProofLocalExitRoot, + smtProofRollupExitRoot, + globalIndex, mainnetExitRoot, rollupExitRoot, - originNetwork, - originTokenAddress, - destinationNetwork, - destinationAddress, - amount, - metadata, - _LEAF_TYPE_ASSET + getLeafValue( + _LEAF_TYPE_ASSET, + originNetwork, + originTokenAddress, + destinationNetwork, + destinationAddress, + amount, + keccak256(metadata) + ) ); // Transfer funds @@ -396,8 +398,8 @@ contract PolygonZkEVMBridgeL2 is revert EtherTransferFailed(); } } else { - if (originNetwork == networkID) // Transfer tokens - { + // Transfer tokens + if (originNetwork == networkID) { // The token is an ERC20 from this network IERC20Upgradeable(originTokenAddress).safeTransfer( destinationAddress, @@ -456,7 +458,7 @@ contract PolygonZkEVMBridgeL2 is } emit ClaimEvent( - index, + globalIndex, originNetwork, originTokenAddress, destinationAddress, @@ -469,8 +471,9 @@ contract PolygonZkEVMBridgeL2 is * If the receiving address is an EOA, the call will result as a success * Which means that the amount of ether will be transferred correctly, but the message * will not trigger any execution - * @param smtProof Smt proof - * @param index Index of the leaf + * @param smtProofLocalExitRoot Smt proof + * @param smtProofRollupExitRoot Smt proof + * @param globalIndex Index of the leaf * @param mainnetExitRoot Mainnet exit root * @param rollupExitRoot Rollup exit root * @param originNetwork Origin network @@ -481,8 +484,9 @@ contract PolygonZkEVMBridgeL2 is * @param metadata Abi encoded metadata if any, empty otherwise */ function claimMessage( - bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, - uint32 index, + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofLocalExitRoot, + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot, + uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, @@ -491,20 +495,27 @@ contract PolygonZkEVMBridgeL2 is address destinationAddress, uint256 amount, bytes calldata metadata - ) external ifNotEmergencyState { + ) external { + // Destination network must be this networkID + if (destinationNetwork != networkID) { + revert DestinationNetworkInvalid(); + } // Verify leaf exist and it does not have been claimed _verifyLeaf( - smtProof, - index, + smtProofLocalExitRoot, + smtProofRollupExitRoot, + globalIndex, mainnetExitRoot, rollupExitRoot, - originNetwork, - originAddress, - destinationNetwork, - destinationAddress, - amount, - metadata, - _LEAF_TYPE_MESSAGE + getLeafValue( + _LEAF_TYPE_MESSAGE, + originNetwork, + originAddress, + destinationNetwork, + destinationAddress, + amount, + keccak256(metadata) + ) ); // mint wETH tokens @@ -523,7 +534,7 @@ contract PolygonZkEVMBridgeL2 is } emit ClaimEvent( - index, + globalIndex, originNetwork, originAddress, destinationAddress, @@ -586,52 +597,23 @@ contract PolygonZkEVMBridgeL2 is ]; } - /** - * @notice Function to activate the emergency state - " Only can be called by the Polygon ZK-EVM in extreme situations - */ - function activateEmergencyState() external onlyPolygonZkEVM { - _activateEmergencyState(); - } - - /** - * @notice Function to deactivate the emergency state - " Only can be called by the Polygon ZK-EVM - */ - function deactivateEmergencyState() external onlyPolygonZkEVM { - _deactivateEmergencyState(); - } - /** * @notice Verify leaf and checks that it has not been claimed - * @param smtProof Smt proof - * @param index Index of the leaf + * @param smtProofLocalExitRoot Smt proof + * @param smtProofRollupExitRoot Smt proof + * @param globalIndex Index of the leaf * @param mainnetExitRoot Mainnet exit root * @param rollupExitRoot Rollup exit root - * @param originNetwork Origin network - * @param originAddress Origin address - * @param destinationNetwork Network destination - * @param destinationAddress Address destination - * @param amount Amount of tokens - * @param metadata Abi encoded metadata if any, empty otherwise - * @param leafType Leaf type --> [0] transfer Ether / ERC20 tokens, [1] message + * @param leafValue leaf value */ function _verifyLeaf( - bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, - uint32 index, + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofLocalExitRoot, + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot, + uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, - uint32 originNetwork, - address originAddress, - uint32 destinationNetwork, - address destinationAddress, - uint256 amount, - bytes calldata metadata, - uint8 leafType + bytes32 leafValue ) internal { - // Set and check nullifier - _setAndCheckClaimed(index); - // Check timestamp where the global exit root was set uint256 timestampGlobalExitRoot = globalExitRootManager .globalExitRootMap( @@ -641,59 +623,108 @@ contract PolygonZkEVMBridgeL2 is ) ); + // check that thi global exit root exist if (timestampGlobalExitRoot == 0) { revert GlobalExitRootInvalid(); } - // Destination network must be networkID - if (destinationNetwork != networkID) { - revert DestinationNetworkInvalid(); - } + uint32 leafIndex; + uint32 originNetwork; + + // Get origin network from global index + if (globalIndex & _GLOBAL_INDEX_MAINNET_FLAG == 1) { + // It's mainnet, therefore origin network is 0 + + // last 32 bits are leafIndex + leafIndex = uint32(globalIndex); - bytes32 claimRoot; - if (networkID == _MAINNET_NETWORK_ID) { - // Verify merkle proof using rollup exit root - claimRoot = rollupExitRoot; + if ( + !verifyMerkleProof( + leafValue, + smtProofLocalExitRoot, + leafIndex, + mainnetExitRoot + ) + ) { + revert InvalidSmtProof(); + } } else { - // Verify merkle proof using mainnet exit root - claimRoot = mainnetExitRoot; - } - if ( - !verifyMerkleProof( - getLeafValue( - leafType, - originNetwork, - originAddress, - destinationNetwork, - destinationAddress, - amount, - keccak256(metadata) - ), - smtProof, - index, - claimRoot - ) - ) { - revert InvalidSmtProof(); + // it's a rollup, therefore we have to get the origin network + uint32 indexRollup = uint32(globalIndex >> 32); + originNetwork = indexRollup + 1; + + // last 32 bits are leafIndex + leafIndex = uint32(globalIndex); + + // verify merkle proof agains rollup exit root + if ( + !verifyMerkleProof( + calculateRoot(leafValue, smtProofLocalExitRoot, leafIndex), + smtProofRollupExitRoot, + indexRollup, + rollupExitRoot + ) + ) { + revert InvalidSmtProof(); + } } + + // Set and check nullifier + _setAndCheckClaimed(leafIndex, originNetwork); } /** * @notice Function to check if an index is claimed or not - * @param index Index + * @param leafIndex Index + * @param originNetwork origin network */ - function isClaimed(uint256 index) external view returns (bool) { - (uint256 wordPos, uint256 bitPos) = _bitmapPositions(index); + function isClaimed( + uint32 leafIndex, + uint32 originNetwork + ) external view returns (bool) { + uint256 globalIndex; + + // For consistency with the previous setted nullifiers + if ( + networkID == _MAINNET_NETWORK_ID && + originNetwork == _ZKEVM_NETWORK_ID + ) { + globalIndex = uint256(leafIndex); + } else { + globalIndex = + uint256(leafIndex) + + uint256(originNetwork) * + _MAX_LEAFS_PER_NETWORK; + } + (uint256 wordPos, uint256 bitPos) = _bitmapPositions(globalIndex); uint256 mask = (1 << bitPos); return (claimedBitMap[wordPos] & mask) == mask; } /** * @notice Function to check that an index is not claimed and set it as claimed - * @param index Index + * @param leafIndex Index + * @param originNetwork origin network */ - function _setAndCheckClaimed(uint256 index) private { - (uint256 wordPos, uint256 bitPos) = _bitmapPositions(index); + function _setAndCheckClaimed( + uint32 leafIndex, + uint32 originNetwork + ) private { + uint256 globalIndex; + + // For consistency with the previous setted nullifiers + if ( + networkID == _MAINNET_NETWORK_ID && + originNetwork == _ZKEVM_NETWORK_ID + ) { + globalIndex = uint256(leafIndex); + } else { + globalIndex = + uint256(leafIndex) + + uint256(originNetwork) * + _MAX_LEAFS_PER_NETWORK; + } + (uint256 wordPos, uint256 bitPos) = _bitmapPositions(globalIndex); uint256 mask = 1 << bitPos; uint256 flipped = claimedBitMap[wordPos] ^= mask; if (flipped & mask == 0) { @@ -715,7 +746,7 @@ contract PolygonZkEVMBridgeL2 is */ function _updateGlobalExitRoot() internal { lastUpdatedDepositCount = uint32(depositCount); - globalExitRootManager.updateExitRoot(getDepositRoot()); + globalExitRootManager.updateExitRoot(getRoot()); } /** diff --git a/contracts/L2/WETHzkEVM.sol b/contracts/v2/L2/WETHzkEVM.sol similarity index 100% rename from contracts/L2/WETHzkEVM.sol rename to contracts/v2/L2/WETHzkEVM.sol diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index 14a0bd821..8bff9c7f7 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -97,9 +97,9 @@ contract PolygonZkEVMBridgeV2 is __ReentrancyGuard_init(); } - modifier onlyPolygonZkEVM() { + modifier onlyRollupManager() { if (polygonRollupManager != msg.sender) { - revert OnlyPolygonZkEVM(); + revert OnlyRollupManager(); } _; } @@ -122,7 +122,7 @@ contract PolygonZkEVMBridgeV2 is * @dev Emitted when a claim is done from another network */ event ClaimEvent( - uint256 index, + uint256 globalIndex, uint32 originNetwork, address originAddress, address destinationAddress, @@ -303,7 +303,6 @@ contract PolygonZkEVMBridgeV2 is } } - // Maitain previous approach?¿ /** * @notice Verify merkle proof and withdraw tokens/ether * @param smtProofLocalExitRoot Smt proof @@ -461,7 +460,6 @@ contract PolygonZkEVMBridgeV2 is if (destinationNetwork != networkID) { revert DestinationNetworkInvalid(); } - // Verify leaf exist and it does not have been claimed _verifyLeaf( smtProofLocalExitRoot, @@ -561,7 +559,7 @@ contract PolygonZkEVMBridgeV2 is * @notice Function to activate the emergency state " Only can be called by the Polygon ZK-EVM in extreme situations */ - function activateEmergencyState() external onlyPolygonZkEVM { + function activateEmergencyState() external onlyRollupManager { _activateEmergencyState(); } @@ -569,7 +567,7 @@ contract PolygonZkEVMBridgeV2 is * @notice Function to deactivate the emergency state " Only can be called by the Polygon ZK-EVM */ - function deactivateEmergencyState() external onlyPolygonZkEVM { + function deactivateEmergencyState() external onlyRollupManager { _deactivateEmergencyState(); } diff --git a/deployment/1_createGenesis.js b/deployment/1_createGenesis.js index 0db3cc42b..cf263cab7 100644 --- a/deployment/1_createGenesis.js +++ b/deployment/1_createGenesis.js @@ -163,7 +163,7 @@ async function main() { await WETHToken.deployed(); // Deploy implementation PolygonZkEVMBridge - const polygonZkEVMBridgeFactory = await ethers.getContractFactory('PolygonZkEVMBridgeL2', deployer); + const polygonZkEVMBridgeFactory = await ethers.getContractFactory('PolygonZkEVMGasTokenBridge', deployer); const deployTransactionBridge = (polygonZkEVMBridgeFactory.getDeployTransaction()).data; // Mandatory to override the gasLimit since the estimation with create are mess up D: const overrideGasLimit = ethers.BigNumber.from(5500000); From 487800ea5ff5ac38518f3ad3b31ec9ca355598bb Mon Sep 17 00:00:00 2001 From: invocamanman Date: Fri, 29 Sep 2023 13:50:28 +0200 Subject: [PATCH 020/230] ongoing development --- contracts/PolygonZkEVM.sol | 152 ++++++----- contracts/PolygonZkEVMBridge.sol | 6 +- contracts/PolygonZkEVMGlobalExitRoot.sol | 26 +- .../interfaces/IPolygonRollupManager.sol | 5 + .../IPolygonZkEVMGlobalExitRoot.sol | 2 - contracts/lib/DepositContract.sol | 139 +++++++++- contracts/lib/DepositContractLib.sol | 144 ---------- contracts/mocks/DepositContractMock.sol | 2 +- contracts/mocks/PolygonZkEVMMock.sol | 6 +- contracts/v2/PolygonRollupManager.sol | 70 ++--- contracts/v2/PolygonZkEVMBridgeV2.sol | 8 +- contracts/v2/PolygonZkEVMGlobalExitRootV2.sol | 56 +--- contracts/v2/PolygonZkEVMV2.sol | 247 ++++++++++-------- test/contracts/bridge.test.js | 10 +- test/contracts/bridgeMock.test.js | 2 +- test/contracts/bridge_metadata.test.js | 6 +- test/contracts/bridge_permit.test.js | 6 +- test/contracts/depositContractMock.test.js | 12 +- test/contracts/emergencyManager.test.js | 4 +- test/contracts/globalExitRootManager.test.js | 55 +--- test/contracts/polygonZkEVM.test.js | 218 ++++++++++++---- test/contracts/snark_stark_input.test.js | 4 +- 22 files changed, 597 insertions(+), 583 deletions(-) delete mode 100644 contracts/lib/DepositContractLib.sol diff --git a/contracts/PolygonZkEVM.sol b/contracts/PolygonZkEVM.sol index 8a1ebff18..4bc4a1826 100644 --- a/contracts/PolygonZkEVM.sol +++ b/contracts/PolygonZkEVM.sol @@ -29,12 +29,28 @@ contract PolygonZkEVM is * @param transactions L2 ethereum transactions EIP-155 or pre-EIP-155 with signature: * EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data, chainid, 0, 0,) || v || r || s * pre-EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data) || v || r || s - * @param forcedHistoricGlobalExitRoot Global exit root of the batch + * @param globalExitRoot Global exit root of the batch + * @param timestamp Sequenced timestamp of the batch * @param minForcedTimestamp Minimum timestamp of the force batch data, empty when non forced batch */ struct BatchData { bytes transactions; - bytes32 forcedHistoricGlobalExitRoot; + bytes32 globalExitRoot; + uint64 timestamp; + uint64 minForcedTimestamp; + } + + /** + * @notice Struct which will be used to call sequenceForceBatches + * @param transactions L2 ethereum transactions EIP-155 or pre-EIP-155 with signature: + * EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data, chainid, 0, 0,) || v || r || s + * pre-EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data) || v || r || s + * @param globalExitRoot Global exit root of the batch + * @param minForcedTimestamp Indicates the minimum sequenced timestamp of the batch + */ + struct ForcedBatchData { + bytes transactions; + bytes32 globalExitRoot; uint64 minForcedTimestamp; } @@ -128,12 +144,6 @@ contract PolygonZkEVM is // Max uint64 uint256 internal constant _MAX_UINT_64 = type(uint64).max; // 0xFFFFFFFFFFFFFFFF - // Boolena indicating that is a forced batch - bool internal constant _IS_FORCED_BATCH = true; - - // Boolena indicating that is not a forced batch - bool internal constant _IS_NOT_FORCED_BATCH = false; - // MATIC token address IERC20Upgradeable public immutable matic; @@ -176,7 +186,7 @@ contract PolygonZkEVM is mapping(uint64 => SequencedBatchData) public sequencedBatches; // Last sequenced timestamp - uint64 public gapLastTimestamp; + uint64 public lastTimestamp; // Last batch sent by the sequencers uint64 public lastBatchSequenced; @@ -481,18 +491,11 @@ contract PolygonZkEVM is } if (batchesNum > _MAX_VERIFY_BATCHES) { - // TODO remove? revert ExceedMaxVerifyBatches(); } - // Update global exit root if there are new deposits - bridgeAddress.updateGlobalExitRoot(); - - // Get global batch variables - bytes32 historicGlobalExitRoot = globalExitRootManager.getRoot(); - uint64 currentTimestamp = uint64(block.timestamp); - // Store storage variables in memory, to save gas, because will be overrided multiple times + uint64 currentTimestamp = lastTimestamp; uint64 currentBatchSequenced = lastBatchSequenced; uint64 currentLastForceBatchSequenced = lastForceBatchSequenced; bytes32 currentAccInputHash = sequencedBatches[currentBatchSequenced] @@ -518,7 +521,7 @@ contract PolygonZkEVM is bytes32 hashedForcedBatchData = keccak256( abi.encodePacked( currentTransactionsHash, - currentBatch.forcedHistoricGlobalExitRoot, + currentBatch.globalExitRoot, currentBatch.minForcedTimestamp ) ); @@ -530,41 +533,55 @@ contract PolygonZkEVM is revert ForcedDataDoesNotMatch(); } - // Calculate next accumulated input hash - currentAccInputHash = keccak256( - abi.encodePacked( - currentAccInputHash, - currentTransactionsHash, - currentBatch.forcedHistoricGlobalExitRoot, - currentBatch.minForcedTimestamp, - l2Coinbase, - _IS_FORCED_BATCH - ) - ); - // Delete forceBatch data since won't be used anymore delete forcedBatches[currentLastForceBatchSequenced]; + + // Check timestamp is bigger than min timestamp + if (currentBatch.timestamp < currentBatch.minForcedTimestamp) { + revert SequencedTimestampBelowForcedTimestamp(); + } } else { - // These checks are already done in the forceBatches call + // Check global exit root exists with proper batch length. These checks are already done in the forceBatches call + // Note that the sequencer can skip setting a global exit root putting zeros + if ( + currentBatch.globalExitRoot != bytes32(0) && + globalExitRootManager.globalExitRootMap( + currentBatch.globalExitRoot + ) == + 0 + ) { + revert GlobalExitRootNotExist(); + } + if ( currentBatch.transactions.length > _MAX_TRANSACTIONS_BYTE_LENGTH ) { revert TransactionsLengthAboveMax(); } + } - // Calculate next accumulated input hash - currentAccInputHash = keccak256( - abi.encodePacked( - currentAccInputHash, - currentTransactionsHash, - historicGlobalExitRoot, - currentTimestamp, - l2Coinbase, - _IS_NOT_FORCED_BATCH - ) - ); + // Check Batch timestamps are correct + if ( + currentBatch.timestamp < currentTimestamp || + currentBatch.timestamp > block.timestamp + ) { + revert SequencedTimestampInvalid(); } + + // Calculate next accumulated input hash + currentAccInputHash = keccak256( + abi.encodePacked( + currentAccInputHash, + currentTransactionsHash, + currentBatch.globalExitRoot, + currentBatch.timestamp, + l2Coinbase + ) + ); + + // Update timestamp + currentTimestamp = currentBatch.timestamp; } // Update currentBatchSequenced currentBatchSequenced += uint64(batchesNum); @@ -574,6 +591,9 @@ contract PolygonZkEVM is revert ForceBatchesOverflow(); } + uint256 nonForcedBatchesSequenced = batchesNum - + (currentLastForceBatchSequenced - initLastForceBatchSequenced); + // Update sequencedBatches mapping sequencedBatches[currentBatchSequenced] = SequencedBatchData({ accInputHash: currentAccInputHash, @@ -582,20 +602,11 @@ contract PolygonZkEVM is }); // Store back the storage variables + lastTimestamp = currentTimestamp; lastBatchSequenced = currentBatchSequenced; - uint256 nonForcedBatchesSequenced = batchesNum; - - // Check if there has been forced batches - if (currentLastForceBatchSequenced != initLastForceBatchSequenced) { - // substract forced batches - nonForcedBatchesSequenced -= - currentLastForceBatchSequenced - - initLastForceBatchSequenced; - - // Store new last force batch sequenced + if (currentLastForceBatchSequenced != initLastForceBatchSequenced) lastForceBatchSequenced = currentLastForceBatchSequenced; - } // Pay collateral for every non-forced batch submitted matic.safeTransferFrom( @@ -607,6 +618,9 @@ contract PolygonZkEVM is // Consolidate pending state if possible _tryConsolidatePendingState(); + // Update global exit root if there are new deposits + bridgeAddress.updateGlobalExitRoot(); + emit SequenceBatches(currentBatchSequenced); } @@ -1018,8 +1032,9 @@ contract PolygonZkEVM is matic.safeTransferFrom(msg.sender, address(this), maticFee); - // Get historic global exit root - bytes32 historicGlobalExitRoot = globalExitRootManager.getRoot(); + // Get globalExitRoot global exit root + bytes32 lastGlobalExitRoot = globalExitRootManager + .getLastGlobalExitRoot(); // Update forcedBatches mapping lastForceBatch++; @@ -1027,25 +1042,20 @@ contract PolygonZkEVM is forcedBatches[lastForceBatch] = keccak256( abi.encodePacked( keccak256(transactions), - historicGlobalExitRoot, + lastGlobalExitRoot, uint64(block.timestamp) ) ); if (msg.sender == tx.origin) { // Getting the calldata from an EOA is easy so no need to put the `transactions` in the event - emit ForceBatch( - lastForceBatch, - historicGlobalExitRoot, - msg.sender, - "" - ); + emit ForceBatch(lastForceBatch, lastGlobalExitRoot, msg.sender, ""); } else { // Getting internal transaction calldata is complicated (because it requires an archive node) // Therefore it's worth it to put the `transactions` in the event, which is easy to query emit ForceBatch( lastForceBatch, - historicGlobalExitRoot, + lastGlobalExitRoot, msg.sender, transactions ); @@ -1057,7 +1067,7 @@ contract PolygonZkEVM is * @param batches Struct array which holds the necessary data to append force batches */ function sequenceForceBatches( - BatchData[] calldata batches + ForcedBatchData[] calldata batches ) external isForceBatchAllowed ifNotEmergencyState { uint256 batchesNum = batches.length; @@ -1085,7 +1095,7 @@ contract PolygonZkEVM is // Sequence force batches for (uint256 i = 0; i < batchesNum; i++) { // Load current sequence - BatchData memory currentBatch = batches[i]; + ForcedBatchData memory currentBatch = batches[i]; currentLastForceBatchSequenced++; // Store the current transactions hash since it's used more than once for gas saving @@ -1097,7 +1107,7 @@ contract PolygonZkEVM is bytes32 hashedForcedBatchData = keccak256( abi.encodePacked( currentTransactionsHash, - currentBatch.forcedHistoricGlobalExitRoot, + currentBatch.globalExitRoot, currentBatch.minForcedTimestamp ) ); @@ -1121,22 +1131,22 @@ contract PolygonZkEVM is revert ForceBatchTimeoutNotExpired(); } } - // Calculate next acc input hash currentAccInputHash = keccak256( abi.encodePacked( currentAccInputHash, currentTransactionsHash, - currentBatch.forcedHistoricGlobalExitRoot, - currentBatch.minForcedTimestamp, // could be current timestamp - msg.sender, - _IS_FORCED_BATCH + currentBatch.globalExitRoot, + uint64(block.timestamp), + msg.sender ) ); } // Update currentBatchSequenced currentBatchSequenced += uint64(batchesNum); + lastTimestamp = uint64(block.timestamp); + // Store back the storage variables sequencedBatches[currentBatchSequenced] = SequencedBatchData({ accInputHash: currentAccInputHash, diff --git a/contracts/PolygonZkEVMBridge.sol b/contracts/PolygonZkEVMBridge.sol index f34639e09..08488d488 100644 --- a/contracts/PolygonZkEVMBridge.sol +++ b/contracts/PolygonZkEVMBridge.sol @@ -228,7 +228,7 @@ contract PolygonZkEVMBridge is uint32(depositCount) ); - _addLeaf( + _deposit( getLeafValue( _LEAF_TYPE_ASSET, originNetwork, @@ -277,7 +277,7 @@ contract PolygonZkEVMBridge is uint32(depositCount) ); - _addLeaf( + _deposit( getLeafValue( _LEAF_TYPE_MESSAGE, networkID, @@ -657,7 +657,7 @@ contract PolygonZkEVMBridge is */ function _updateGlobalExitRoot() internal { lastUpdatedDepositCount = uint32(depositCount); - globalExitRootManager.updateExitRoot(getRoot()); + globalExitRootManager.updateExitRoot(getDepositRoot()); } /** diff --git a/contracts/PolygonZkEVMGlobalExitRoot.sol b/contracts/PolygonZkEVMGlobalExitRoot.sol index 8fbd47cf5..af9e89498 100644 --- a/contracts/PolygonZkEVMGlobalExitRoot.sol +++ b/contracts/PolygonZkEVMGlobalExitRoot.sol @@ -4,20 +4,11 @@ pragma solidity 0.8.20; import "./interfaces/IPolygonZkEVMGlobalExitRoot.sol"; import "./lib/GlobalExitRootLib.sol"; -import "./lib/DepositContractLib.sol"; - -// TODO it is requierde a special ugpradbility for this contract since overlap storage slots -// This means that the lastRollupExitRoot and the lastMainnetExitRoot must be copei using assembly form prv version - -// another and seems better approach will be to define a contract base which will contain tthe same slots /** * Contract responsible for managing the exit roots across multiple networks */ -contract PolygonZkEVMGlobalExitRoot is - IPolygonZkEVMGlobalExitRoot, - DepositContractLib -{ +contract PolygonZkEVMGlobalExitRoot is IPolygonZkEVMGlobalExitRoot { // PolygonZkEVMBridge address address public immutable bridgeAddress; @@ -81,9 +72,6 @@ contract PolygonZkEVMGlobalExitRoot is cacheLastMainnetExitRoot, cacheLastRollupExitRoot ); - - // Update the historical roots - _addLeaf(newGlobalExitRoot); } } @@ -97,16 +85,4 @@ contract PolygonZkEVMGlobalExitRoot is lastRollupExitRoot ); } - - /** - * @notice Computes and returns the merkle root - */ - function getRoot() - public - view - override(DepositContractLib, IPolygonZkEVMGlobalExitRoot) - returns (bytes32) - { - return super.getRoot(); - } } diff --git a/contracts/interfaces/IPolygonRollupManager.sol b/contracts/interfaces/IPolygonRollupManager.sol index ab7720861..680b42b30 100644 --- a/contracts/interfaces/IPolygonRollupManager.sol +++ b/contracts/interfaces/IPolygonRollupManager.sol @@ -207,4 +207,9 @@ interface IPolygonRollupManager { * @dev Thrown when the caller is not the pending admin */ error OnlyPendingGovernance(); + + /** + * @dev Thrown when the caller is not the pending admin + */ + error ChainIDAlreadyExist(); } diff --git a/contracts/interfaces/IPolygonZkEVMGlobalExitRoot.sol b/contracts/interfaces/IPolygonZkEVMGlobalExitRoot.sol index 1f2eddecd..68c3d2495 100644 --- a/contracts/interfaces/IPolygonZkEVMGlobalExitRoot.sol +++ b/contracts/interfaces/IPolygonZkEVMGlobalExitRoot.sol @@ -5,6 +5,4 @@ import "./IBasePolygonZkEVMGlobalExitRoot.sol"; interface IPolygonZkEVMGlobalExitRoot is IBasePolygonZkEVMGlobalExitRoot { function getLastGlobalExitRoot() external view returns (bytes32); - - function getRoot() external view returns (bytes32); } diff --git a/contracts/lib/DepositContract.sol b/contracts/lib/DepositContract.sol index a269f79a2..ead711964 100644 --- a/contracts/lib/DepositContract.sol +++ b/contracts/lib/DepositContract.sol @@ -2,13 +2,148 @@ pragma solidity 0.8.20; import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; -import "./DepositContractLib.sol"; /** * 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 */ -contract DepositContract is ReentrancyGuardUpgradeable, DepositContractLib { +contract DepositContract is ReentrancyGuardUpgradeable { + /** + * @dev Thrown when the merkle tree is full + */ + error MerkleTreeFull(); + + // Merkle tree levels + uint256 internal constant _DEPOSIT_CONTRACT_TREE_DEPTH = 32; + + // This ensures `depositCount` will fit into 32-bits + uint256 internal constant _MAX_DEPOSIT_COUNT = + 2 ** _DEPOSIT_CONTRACT_TREE_DEPTH - 1; + + // Branch array which contains the necessary sibilings to compute the next root when a new + // leaf is inserted + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] internal _branch; + + // Counter of current deposits + uint256 public depositCount; + + /** + * @dev This empty reserved space is put in place to allow future versions to add new + * variables without shifting down storage in the inheritance chain. + */ + uint256[10] private _gap; + + /** + * @notice Computes and returns the merkle root + */ + function getDepositRoot() public view returns (bytes32) { + bytes32 node; + uint256 size = depositCount; + bytes32 currentZeroHashHeight = 0; + + for ( + uint256 height = 0; + height < _DEPOSIT_CONTRACT_TREE_DEPTH; + height++ + ) { + if (((size >> height) & 1) == 1) + node = keccak256(abi.encodePacked(_branch[height], node)); + else + node = keccak256(abi.encodePacked(node, currentZeroHashHeight)); + + currentZeroHashHeight = keccak256( + abi.encodePacked(currentZeroHashHeight, currentZeroHashHeight) + ); + } + return node; + } + + /** + * @notice Add a new leaf to the merkle tree + * @param leafHash Leaf hash + */ + function _deposit(bytes32 leafHash) internal { + bytes32 node = leafHash; + + // Avoid overflowing the Merkle tree (and prevent edge case in computing `_branch`) + if (depositCount >= _MAX_DEPOSIT_COUNT) { + revert MerkleTreeFull(); + } + + // Add deposit data root to Merkle tree (update a single `_branch` node) + uint256 size = ++depositCount; + for ( + uint256 height = 0; + height < _DEPOSIT_CONTRACT_TREE_DEPTH; + height++ + ) { + if (((size >> height) & 1) == 1) { + _branch[height] = node; + return; + } + node = keccak256(abi.encodePacked(_branch[height], node)); + } + // As the loop should always end prematurely with the `return` statement, + // this code should be unreachable. We assert `false` just to be safe. + assert(false); + } + + /** + * @notice Verify merkle proof + * @param leafHash Leaf hash + * @param smtProof Smt proof + * @param index Index of the leaf + * @param root Merkle root + */ + function verifyMerkleProof( + bytes32 leafHash, + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, + uint32 index, + bytes32 root + ) public pure returns (bool) { + bytes32 node = leafHash; + + // Check merkle proof + for ( + uint256 height = 0; + height < _DEPOSIT_CONTRACT_TREE_DEPTH; + height++ + ) { + if (((index >> height) & 1) == 1) + node = keccak256(abi.encodePacked(smtProof[height], node)); + else node = keccak256(abi.encodePacked(node, smtProof[height])); + } + + return node == root; + } + + /** + * @notice calcualte root from merkle proof + * @param leafHash Leaf hash + * @param smtProof Smt proof + * @param index Index of the leaf + */ + function calculateRoot( + bytes32 leafHash, + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, + uint32 index + ) public pure returns (bytes32) { + bytes32 node = leafHash; + + // Check merkle proof + for ( + uint256 height = 0; + height < _DEPOSIT_CONTRACT_TREE_DEPTH; + height++ + ) { + if (((index >> height) & 1) == 1) + node = keccak256(abi.encodePacked(smtProof[height], node)); + else node = keccak256(abi.encodePacked(node, smtProof[height])); + } + + return node; + } + /** * @notice Given the leaf data returns the leaf value * @param leafType Leaf type --> [0] transfer Ether / ERC20 tokens, [1] message diff --git a/contracts/lib/DepositContractLib.sol b/contracts/lib/DepositContractLib.sol deleted file mode 100644 index a26099419..000000000 --- a/contracts/lib/DepositContractLib.sol +++ /dev/null @@ -1,144 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.20; - -/** - * 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 - */ -contract DepositContractLib { - /** - * @dev Thrown when the merkle tree is full - */ - error MerkleTreeFull(); - - // Merkle tree levels - uint256 internal constant _DEPOSIT_CONTRACT_TREE_DEPTH = 32; - - // This ensures `depositCount` will fit into 32-bits - uint256 internal constant _MAX_DEPOSIT_COUNT = - 2 ** _DEPOSIT_CONTRACT_TREE_DEPTH - 1; - - // Branch array which contains the necessary sibilings to compute the next root when a new - // leaf is inserted - bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] internal _branch; - - // Counter of current deposits - uint256 public depositCount; - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - */ - uint256[10] private _gap; - - /** - * @notice Computes and returns the merkle root - */ - function getRoot() public view virtual returns (bytes32) { - bytes32 node; - uint256 size = depositCount; - bytes32 currentZeroHashHeight = 0; - - for ( - uint256 height = 0; - height < _DEPOSIT_CONTRACT_TREE_DEPTH; - height++ - ) { - if (((size >> height) & 1) == 1) - node = keccak256(abi.encodePacked(_branch[height], node)); - else - node = keccak256(abi.encodePacked(node, currentZeroHashHeight)); - - currentZeroHashHeight = keccak256( - abi.encodePacked(currentZeroHashHeight, currentZeroHashHeight) - ); - } - return node; - } - - /** - * @notice Add a new leaf to the merkle tree - * @param leaf Leaf - */ - function _addLeaf(bytes32 leaf) internal { - bytes32 node = leaf; - - // Avoid overflowing the Merkle tree (and prevent edge case in computing `_branch`) - if (depositCount >= _MAX_DEPOSIT_COUNT) { - revert MerkleTreeFull(); - } - - // Add deposit data root to Merkle tree (update a single `_branch` node) - uint256 size = ++depositCount; - for ( - uint256 height = 0; - height < _DEPOSIT_CONTRACT_TREE_DEPTH; - height++ - ) { - if (((size >> height) & 1) == 1) { - _branch[height] = node; - return; - } - node = keccak256(abi.encodePacked(_branch[height], node)); - } - // As the loop should always end prematurely with the `return` statement, - // this code should be unreachable. We assert `false` just to be safe. - assert(false); - } - - /** - * @notice Verify merkle proof - * @param leafHash Leaf hash - * @param smtProof Smt proof - * @param index Index of the leaf - * @param root Merkle root - */ - function verifyMerkleProof( - bytes32 leafHash, - bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, - uint32 index, - bytes32 root - ) public pure returns (bool) { - bytes32 node = leafHash; - - // Check merkle proof - for ( - uint256 height = 0; - height < _DEPOSIT_CONTRACT_TREE_DEPTH; - height++ - ) { - if (((index >> height) & 1) == 1) - node = keccak256(abi.encodePacked(smtProof[height], node)); - else node = keccak256(abi.encodePacked(node, smtProof[height])); - } - - return node == root; - } - - /** - * @notice calcualte root from merkle proof - * @param leafHash Leaf hash - * @param smtProof Smt proof - * @param index Index of the leaf - */ - function calculateRoot( - bytes32 leafHash, - bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, - uint32 index - ) public pure returns (bytes32) { - bytes32 node = leafHash; - - // Check merkle proof - for ( - uint256 height = 0; - height < _DEPOSIT_CONTRACT_TREE_DEPTH; - height++ - ) { - if (((index >> height) & 1) == 1) - node = keccak256(abi.encodePacked(smtProof[height], node)); - else node = keccak256(abi.encodePacked(node, smtProof[height])); - } - - return node; - } -} diff --git a/contracts/mocks/DepositContractMock.sol b/contracts/mocks/DepositContractMock.sol index f96f4a18c..ff2ebfad2 100644 --- a/contracts/mocks/DepositContractMock.sol +++ b/contracts/mocks/DepositContractMock.sol @@ -33,7 +33,7 @@ contract DepositContractMock is DepositContract { uint256 amount, bytes32 metadataHash ) public { - _addLeaf( + _deposit( getLeafValue( leafType, originNetwork, diff --git a/contracts/mocks/PolygonZkEVMMock.sol b/contracts/mocks/PolygonZkEVMMock.sol index 23721b8b9..23282e96c 100644 --- a/contracts/mocks/PolygonZkEVMMock.sol +++ b/contracts/mocks/PolygonZkEVMMock.sol @@ -48,8 +48,7 @@ contract PolygonZkEVMMock is PolygonZkEVM { bytes memory transactions, bytes32 globalExitRoot, uint64 timestamp, - address sequencerAddress, - bool isForced + address sequencerAddress ) public pure returns (bytes32) { return keccak256( @@ -58,8 +57,7 @@ contract PolygonZkEVMMock is PolygonZkEVM { keccak256(transactions), globalExitRoot, timestamp, - sequencerAddress, - isForced + sequencerAddress ) ); } diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index 573a5b413..8748309f0 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -124,32 +124,31 @@ abstract contract PolygonRollupManager is // PolygonZkEVM Bridge Address IPolygonZkEVMBridge public immutable bridgeAddress; - // TODO struct to store consensus metadata?¿ and also for the vierifer - // Number of consensus added, every new consensus will be assigned sequencially a new ID uint64 public consensusCount; // Consensus mapping - // consensus address => consensus Implementation - mapping(address => ConsensusData) public consensusMap; + mapping(address consensusAddress => ConsensusData) public consensusMap; // Number of verifiers added, every new verifier will be assigned sequencially a new ID uint64 public verifierCount; // Verifiers mapping - // verifierID => verifierAddress - mapping(address => VerifierData) public verifierMap; + mapping(address verifierAddress => VerifierData) public verifierMap; // Rollup Count uint64 public rollupCount; // Rollups mapping - // RollupID => Rollup Data - mapping(uint64 => RollupData) public rollupIDToRollupData; + mapping(uint64 rollupID => RollupData) public rollupIDToRollupData; // Rollups mapping // RollupAddress => rollupID - mapping(address => uint64) public rollupAddressToID; + mapping(address rollupAddress => uint64 rollupID) public rollupAddressToID; + + // Rollups mapping + // chainID => rollupID + mapping(uint64 chainID => uint64 rollupID) public chainIDToRollupID; // Trusted aggregator for all the Rollups address public trustedAggregator; @@ -366,7 +365,7 @@ abstract contract PolygonRollupManager is revert ConsensusAlreadyExist(); } - uint64 consensusID = consensusCount++; + uint64 consensusID = ++consensusCount; consensusMap[newConsensusAddress] = ConsensusData({ consensusID: consensusID, description: description @@ -385,11 +384,11 @@ abstract contract PolygonRollupManager is uint64 forkID, string memory description ) external onlyGovernance { - if (verifierMap[newVerifierAddress].verifierID == 0) { + if (verifierMap[newVerifierAddress].verifierID != 0) { revert VerifierAlreadyExist(); } - uint64 verifierID = verifierCount++; + uint64 verifierID = ++verifierCount; verifierMap[newVerifierAddress] = VerifierData({ verifierID: verifierID, forkID: forkID, @@ -419,7 +418,7 @@ abstract contract PolygonRollupManager is * @param verifierAddress Verifier address to delete */ function deleteVerifier(address verifierAddress) external onlyGovernance { - if (verifierMap[verifierAddress].verifierID != 0) { + if (verifierMap[verifierAddress].verifierID == 0) { revert VerifierDoesNotExist(); } @@ -432,10 +431,10 @@ abstract contract PolygonRollupManager is /** * @notice Create a new rollup * @param consensusAddress consensus implementation address - * @param verifierAddress chainID + * @param verifierAddress verifier address + * @param chainID chainID * @param _admin admin of the new created rollup * @param _trustedSequencer trusted sequencer of the new created rollup - * @param _feeToken fee token of the new created rollup * @param _trustedSequencerURL trusted sequencer URL of the new created rollup * @param _networkName network name of the new created rollup * @param _version version string of the new created rollup @@ -446,7 +445,6 @@ abstract contract PolygonRollupManager is uint64 chainID, address _admin, address _trustedSequencer, - IERC20Upgradeable _feeToken, string memory _trustedSequencerURL, string memory _networkName, string calldata _version @@ -455,11 +453,15 @@ abstract contract PolygonRollupManager is revert ConsensusDoesNotExist(); } - if (verifierMap[verifierAddress].verifierID != 0) { + if (verifierMap[verifierAddress].verifierID == 0) { revert VerifierDoesNotExist(); } - uint64 rollupID = rollupCount++; + if (chainIDToRollupID[chainID] != 0) { + revert ChainIDAlreadyExist(); + } + + uint64 rollupID = ++rollupCount; // Create a proxy, with the consensus as a implementation, and the governance as admin address rollupAddress = address( @@ -471,7 +473,7 @@ abstract contract PolygonRollupManager is ( _admin, _trustedSequencer, - _feeToken, + chainID, _trustedSequencerURL, _networkName, _version, @@ -509,7 +511,7 @@ abstract contract PolygonRollupManager is address verifierAddress, uint64 chainID ) external onlyGovernance { - uint64 rollupID = rollupCount++; + uint64 rollupID = ++rollupCount; rollupAddressToID[rollupAddress] = rollupID; @@ -588,11 +590,6 @@ abstract contract PolygonRollupManager is return bytes32(0); } - uint256 levelsToCompute; - while ((currentNodes >> levelsToCompute) > 0) { - levelsToCompute++; - } - // This array will contain the nodes of the current iteration bytes32[] memory tmpTree = new bytes32[](currentNodes); @@ -604,8 +601,11 @@ abstract contract PolygonRollupManager is // This variable will keep track of the zero hashes bytes32 currentZeroHashHeight = 0; + // This variable will keep track of the reamining levels to compute + uint256 remainingLevels = _EXIT_TREE_DEPTH; + // Calculate the root of the sub-tree that contains all the localExitRoots - while (tmpTree.length != 1) { + while (currentNodes != 1) { uint256 nextIterationNodes = currentNodes / 2 + (currentNodes % 2); bytes32[] memory nextTmpTree = new bytes32[](nextIterationNodes); for (uint256 i = 0; i < nextIterationNodes; i++) { @@ -621,17 +621,18 @@ abstract contract PolygonRollupManager is } } - // update tmpTrees + // update tree bariables tmpTree = nextTmpTree; currentNodes = nextIterationNodes; currentZeroHashHeight = keccak256( abi.encodePacked(currentZeroHashHeight, currentZeroHashHeight) ); + remainingLevels--; } + bytes32 currentRoot = tmpTree[0]; - uint256 remainingLevels = _EXIT_TREE_DEPTH - levelsToCompute; - // Calculate remaining levels, since it's a sequencial merkle tree, the rest of the tree is zeroes + // Calculate remaining levels, since it's a sequencial merkle tree, the rest of the tree are zeroes for (uint256 i = 0; i < remainingLevels; i++) { currentRoot = keccak256( abi.encodePacked(currentRoot, currentZeroHashHeight) @@ -679,6 +680,11 @@ abstract contract PolygonRollupManager is emit OnSequenceBatches(newSequencedBatch, newAccInputHash, rollupID); } + // Sequencer always have to pay in POL + // handles fees here! + // gas fees can be custom token + // seuqnecer is with POL + /** * @notice Allows an aggregator to verify multiple batches * @param pendingStateNum Init pending state, 0 if consolidated state is used @@ -772,6 +778,7 @@ abstract contract PolygonRollupManager is uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, + address beneficiary, bytes32[24] calldata proof ) external onlyTrustedAggregator { RollupData storage rollup = rollupIDToRollupData[rollupID]; @@ -783,6 +790,7 @@ abstract contract PolygonRollupManager is finalNewBatch, newLocalExitRoot, newStateRoot, + beneficiary, proof ); @@ -824,6 +832,7 @@ abstract contract PolygonRollupManager is uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, + address beneficiary, bytes32[24] calldata proof ) internal virtual { bytes32 oldStateRoot; @@ -886,7 +895,7 @@ abstract contract PolygonRollupManager is } PolygonZkEVMV2(rollup.rollupAddress).verifyAndRewardBatches( - msg.sender, + beneficiary, (finalNewBatch - currentLastVerifiedBatch) ); } @@ -1191,6 +1200,7 @@ abstract contract PolygonRollupManager is function activateEmergencyState(uint64 sequencedBatchNum) external { if (msg.sender != governance) { // TODO + // just one it's enough revert NotSupportedCurrently(); // // Only check conditions if is not called by the owner // uint64 currentLastVerifiedBatch = getLastVerifiedBatch(); diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index 8bff9c7f7..71b2e9661 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -237,7 +237,7 @@ contract PolygonZkEVMBridgeV2 is uint32(depositCount) ); - _addLeaf( + _deposit( getLeafValue( _LEAF_TYPE_ASSET, originNetwork, @@ -285,7 +285,7 @@ contract PolygonZkEVMBridgeV2 is uint32(depositCount) ); - _addLeaf( + _deposit( getLeafValue( _LEAF_TYPE_MESSAGE, networkID, @@ -597,7 +597,7 @@ contract PolygonZkEVMBridgeV2 is ) ); - // check that thi global exit root exist + // check that this global exit root exist if (timestampGlobalExitRoot == 0) { revert GlobalExitRootInvalid(); } @@ -720,7 +720,7 @@ contract PolygonZkEVMBridgeV2 is */ function _updateGlobalExitRoot() internal { lastUpdatedDepositCount = uint32(depositCount); - globalExitRootManager.updateExitRoot(getRoot()); + globalExitRootManager.updateExitRoot(getDepositRoot()); } /** diff --git a/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol b/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol index c63f1efbc..a40061d3a 100644 --- a/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol +++ b/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol @@ -4,20 +4,11 @@ pragma solidity 0.8.20; import "../interfaces/IPolygonZkEVMGlobalExitRoot.sol"; import "../lib/GlobalExitRootLib.sol"; -import "../lib/DepositContractLib.sol"; - -// TODO it is requierde a special ugpradbility for this contract since overlap storage slots -// This means that the lastRollupExitRoot and the lastMainnetExitRoot must be copei using assembly form prv version - -// another and seems better approach will be to define a contract base which will contain tthe same slots /** * Contract responsible for managing the exit roots across multiple networks */ -contract PolygonZkEVMGlobalExitRootV2 is - IPolygonZkEVMGlobalExitRoot, - DepositContractLib -{ +contract PolygonZkEVMGlobalExitRootV2 is IPolygonZkEVMGlobalExitRoot { // PolygonZkEVMBridge address address public immutable bridgeAddress; @@ -33,9 +24,6 @@ contract PolygonZkEVMGlobalExitRootV2 is // Store every global exit root: Root --> timestamp mapping(bytes32 => uint256) public globalExitRootMap; - // Store every global exit root: Root --> timestamp - mapping(bytes32 => uint256) public historicGlobalExitRootSnapshots; - /** * @dev Emitted when the global exit root is updated */ @@ -44,14 +32,6 @@ contract PolygonZkEVMGlobalExitRootV2 is bytes32 indexed rollupExitRoot ); - /** - * @dev Emitted when a snapshot of the historic global exit root is taken - */ - event HistoricGlobalExitRootSnapshot( - uint256 indexed depositCount, - bytes32 indexed historicGlobalExitRoot - ); - /** * @param _rollupManager Rollup contract address * @param _bridgeAddress PolygonZkEVMBridge contract address @@ -92,9 +72,6 @@ contract PolygonZkEVMGlobalExitRootV2 is cacheLastMainnetExitRoot, cacheLastRollupExitRoot ); - - // Update the historical roots - _addLeaf(newGlobalExitRoot); } } @@ -108,35 +85,4 @@ contract PolygonZkEVMGlobalExitRootV2 is lastRollupExitRoot ); } - - /** - * @notice Computes and returns the merkle root - */ - function getRoot() - public - view - override(DepositContractLib, IPolygonZkEVMGlobalExitRoot) - returns (bytes32) - { - return super.getRoot(); - } - - /** - * @notice Computes and returns the merkle root - */ - function takeHistoricGlobalExitRootSnapshot() public { - bytes32 currentHistoricGlobalExitRoot = getRoot(); - if ( - historicGlobalExitRootSnapshots[currentHistoricGlobalExitRoot] == 0 - ) { - historicGlobalExitRootSnapshots[ - currentHistoricGlobalExitRoot - ] = block.timestamp; - - emit HistoricGlobalExitRootSnapshot( - depositCount, - currentHistoricGlobalExitRoot - ); - } - } } diff --git a/contracts/v2/PolygonZkEVMV2.sol b/contracts/v2/PolygonZkEVMV2.sol index 41b3bba2b..eb028181a 100644 --- a/contracts/v2/PolygonZkEVMV2.sol +++ b/contracts/v2/PolygonZkEVMV2.sol @@ -32,12 +32,28 @@ contract PolygonZkEVMV2 is * @param transactions L2 ethereum transactions EIP-155 or pre-EIP-155 with signature: * EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data, chainid, 0, 0,) || v || r || s * pre-EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data) || v || r || s - * @param forcedHistoricGlobalExitRoot Global exit root of the batch + * @param globalExitRoot Global exit root of the batch + * @param timestamp Sequenced timestamp of the batch * @param minForcedTimestamp Minimum timestamp of the force batch data, empty when non forced batch */ struct BatchData { bytes transactions; - bytes32 forcedHistoricGlobalExitRoot; + bytes32 globalExitRoot; + uint64 timestamp; + uint64 minForcedTimestamp; + } + + /** + * @notice Struct which will be used to call sequenceForceBatches + * @param transactions L2 ethereum transactions EIP-155 or pre-EIP-155 with signature: + * EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data, chainid, 0, 0,) || v || r || s + * pre-EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data) || v || r || s + * @param globalExitRoot Global exit root of the batch + * @param minForcedTimestamp Indicates the minimum sequenced timestamp of the batch + */ + struct ForcedBatchData { + bytes transactions; + bytes32 globalExitRoot; uint64 minForcedTimestamp; } @@ -71,19 +87,6 @@ contract PolygonZkEVMV2 is bytes32 stateRoot; } - /** - * @notice Struct to call initialize, this saves gas because pack the parameters and avoid stack too deep errors. - * @param admin Admin address - * @param trustedSequencer Trusted sequencer address - * @param trustedAggregator Trusted aggregator - * @param trustedAggregatorTimeout Trusted aggregator timeout - */ - struct InitializePackedParameters { - address admin; - address trustedSequencer; - uint64 trustedAggregatorTimeout; - } - // Modulus zkSNARK uint256 internal constant _RFIELD = 21888242871839275222246405745257275088548364400416034343698204186575808495617; @@ -128,14 +131,8 @@ contract PolygonZkEVMV2 is // Max uint64 uint256 internal constant _MAX_UINT_64 = type(uint64).max; // 0xFFFFFFFFFFFFFFFF - // Boolena indicating that is a forced batch - bool internal constant _IS_FORCED_BATCH = true; - - // Boolena indicating that is not a forced batch - bool internal constant _IS_NOT_FORCED_BATCH = false; - - // Fee token address - IERC20Upgradeable public feeToken; + // MATIC token address // POL? + IERC20Upgradeable public immutable matic; // Rollup verifier interface IVerifierRollup public immutable rollupVerifier; @@ -143,14 +140,8 @@ contract PolygonZkEVMV2 is // Global Exit Root interface IPolygonZkEVMGlobalExitRoot public immutable globalExitRootManager; - // // PolygonZkEVM Bridge Address - // IPolygonZkEVMBridge public immutable bridgeAddress; - - // L2 chain identifier - uint64 public chainID; - - // L2 chain identifier - uint64 public forkID; + // PolygonZkEVM Bridge Address + IPolygonZkEVMBridge public immutable bridgeAddress; // Time target of the verification of a batch // Adaptatly the batchFee will be updated to achieve this target @@ -162,8 +153,8 @@ contract PolygonZkEVMV2 is // Trusted sequencer address address public trustedSequencer; - // Current feeToken fee per batch sequenced - uint256 public batchFee; + // Gap batch fee + uint256 public gapBatchFee; // Queue of forced batches with their associated data // ForceBatchNum --> hashedForcedBatchData @@ -176,7 +167,7 @@ contract PolygonZkEVMV2 is mapping(uint64 => SequencedBatchData) public sequencedBatches; // Last sequenced timestamp - uint64 public gapLastTimestamp; + uint64 public lastTimestamp; // Last batch sent by the sequencers uint64 public lastBatchSequenced; @@ -187,15 +178,15 @@ contract PolygonZkEVMV2 is // Last forced batch uint64 public lastForceBatch; - // Last batch verified by the aggregators - uint64 public lastVerifiedBatch; + // Gap Last batch verified by the aggregators + uint64 public gasLastVerifiedBatch; // Trusted aggregator address - address public trustedAggregator; + address public gapTrustedAggregator; // State root mapping // BatchNum --> state root - mapping(uint64 => bytes32) public batchNumToStateRoot; + mapping(uint64 => bytes32) public gapBatchNumToStateRoot; // Trusted sequencer URL string public trustedSequencerURL; @@ -205,20 +196,20 @@ contract PolygonZkEVMV2 is // Pending state mapping // pendingStateNumber --> PendingState - mapping(uint256 => PendingState) public pendingStateTransitions; + mapping(uint256 => PendingState) public gapPendingStateTransitions; // Last pending state - uint64 public lastPendingState; + uint64 public gapLastPendingState; // Last pending state consolidated - uint64 public lastPendingStateConsolidated; + uint64 public gapLastPendingStateConsolidated; // Once a pending state exceeds this timeout it can be consolidated - uint64 public pendingStateTimeout; + uint64 public gapPendingStateTimeout; // Trusted aggregator timeout, if a sequence is not verified in this time frame, // everyone can verify that sequence - uint64 public trustedAggregatorTimeout; + uint64 public gapTrustedAggregatorTimeout; // Address that will be able to adjust contract parameters or stop the emergency state address public admin; @@ -232,12 +223,28 @@ contract PolygonZkEVMV2 is // Indicates if forced batches are disallowed bool public isForcedBatchDisallowed; + // Indicates the current version + uint256 public version; + + // Last batch verified before the last upgrade + uint256 public lastVerifiedBatchBeforeUpgrade; + // Rollup manager PolygonRollupManager public rollupManager; + // TODO design: this could be immutble/ tgis could let be immutable in current polygonzkEMV but change the upgradabiltiy pattern for our current etnwork // Rollup manager uint64 public rollupID; + // L2 chain identifier + uint64 public chainID; + + // L2 chain identifier + uint64 public forkID; + + // Fee token address + IERC20Upgradeable public feeToken; + /** * @dev Emitted when the trusted sequencer sends a new batch of transactions */ @@ -363,27 +370,31 @@ contract PolygonZkEVMV2 is */ event UpdateZkEVMVersion(uint64 numBatch, uint64 forkID, string version); - // General parameters that will have all networks that deploys this contract + // General parameters that will have in common all networks that deploys rollup manager /** * @param _globalExitRootManager Global exit root manager address * @param _rollupVerifier Rollup verifier address + * @param _bridgeAddress Bridge address * @param _rollupManager Global exit root manager address */ constructor( IPolygonZkEVMGlobalExitRoot _globalExitRootManager, IVerifierRollup _rollupVerifier, + IPolygonZkEVMBridge _bridgeAddress, PolygonRollupManager _rollupManager ) { globalExitRootManager = _globalExitRootManager; rollupVerifier = _rollupVerifier; + bridgeAddress = _bridgeAddress; rollupManager = _rollupManager; } /** * @param _admin Admin address * @param _trustedSequencer Trusted sequencer address - * @param _feeToken Fee token + * @param _rollupID Rollup ID + * @param _chainID Chain ID * @param _trustedSequencerURL Trusted sequencer URL * @param _networkName L2 network name * @param _version version @@ -391,21 +402,24 @@ contract PolygonZkEVMV2 is function initialize( address _admin, address _trustedSequencer, - IERC20Upgradeable _feeToken, + uint64 _rollupID, + uint64 _chainID, + uint256 initialFee, string memory _trustedSequencerURL, string memory _networkName, - string calldata _version, - uint64 _rollupID + string calldata _version ) external initializer { admin = _admin; trustedSequencer = _trustedSequencer; feeToken = _feeToken; + rollupID = _rollupID; + chainID = _chainID; + trustedSequencerURL = _trustedSequencerURL; networkName = _networkName; - rollupID = _rollupID; // Constant deployment variables - batchFee = 0.1 ether; // 0.1 feeToken + batchFee = initialFee; verifyBatchTimeTarget = 30 minutes; multiplierBatchFee = 1002; forceBatchTimeout = 5 days; @@ -432,16 +446,16 @@ contract PolygonZkEVMV2 is _; } - modifier onlyRollupManager() { - if (address(rollupManager) != msg.sender) { - revert OnlyRollupManager(); + modifier isForceBatchAllowed() { + if (isForcedBatchDisallowed) { + revert ForceBatchNotAllowed(); } _; } - modifier isForceBatchAllowed() { - if (isForcedBatchDisallowed) { - revert ForceBatchNotAllowed(); + modifier onlyRollupManager() { + if (address(rollupManager) != msg.sender) { + revert OnlyRollupManager(); } _; } @@ -465,18 +479,11 @@ contract PolygonZkEVMV2 is } if (batchesNum > _MAX_VERIFY_BATCHES) { - // TODO remove? revert ExceedMaxVerifyBatches(); } - // // Update global exit root if there are new deposits TODO check in rollup manager - // bridgeAddress.updateGlobalExitRoot(); - - // Get global batch variables - bytes32 historicGlobalExitRoot = globalExitRootManager.getRoot(); - uint64 currentTimestamp = uint64(block.timestamp); - // Store storage variables in memory, to save gas, because will be overrided multiple times + uint64 currentTimestamp = lastTimestamp; uint64 currentBatchSequenced = lastBatchSequenced; uint64 currentLastForceBatchSequenced = lastForceBatchSequenced; bytes32 currentAccInputHash = sequencedBatches[currentBatchSequenced] @@ -502,7 +509,7 @@ contract PolygonZkEVMV2 is bytes32 hashedForcedBatchData = keccak256( abi.encodePacked( currentTransactionsHash, - currentBatch.forcedHistoricGlobalExitRoot, + currentBatch.globalExitRoot, currentBatch.minForcedTimestamp ) ); @@ -514,41 +521,55 @@ contract PolygonZkEVMV2 is revert ForcedDataDoesNotMatch(); } - // Calculate next accumulated input hash - currentAccInputHash = keccak256( - abi.encodePacked( - currentAccInputHash, - currentTransactionsHash, - currentBatch.forcedHistoricGlobalExitRoot, - currentBatch.minForcedTimestamp, - l2Coinbase, - _IS_FORCED_BATCH - ) - ); - // Delete forceBatch data since won't be used anymore delete forcedBatches[currentLastForceBatchSequenced]; + + // Check timestamp is bigger than min timestamp + if (currentBatch.timestamp < currentBatch.minForcedTimestamp) { + revert SequencedTimestampBelowForcedTimestamp(); + } } else { - // These checks are already done in the forceBatches call + // Check global exit root exists with proper batch length. These checks are already done in the forceBatches call + // Note that the sequencer can skip setting a global exit root putting zeros + if ( + currentBatch.globalExitRoot != bytes32(0) && + globalExitRootManager.globalExitRootMap( + currentBatch.globalExitRoot + ) == + 0 + ) { + revert GlobalExitRootNotExist(); + } + if ( currentBatch.transactions.length > _MAX_TRANSACTIONS_BYTE_LENGTH ) { revert TransactionsLengthAboveMax(); } + } - // Calculate next accumulated input hash - currentAccInputHash = keccak256( - abi.encodePacked( - currentAccInputHash, - currentTransactionsHash, - historicGlobalExitRoot, - currentTimestamp, - l2Coinbase, - _IS_NOT_FORCED_BATCH - ) - ); + // Check Batch timestamps are correct + if ( + currentBatch.timestamp < currentTimestamp || + currentBatch.timestamp > block.timestamp + ) { + revert SequencedTimestampInvalid(); } + + // Calculate next accumulated input hash + currentAccInputHash = keccak256( + abi.encodePacked( + currentAccInputHash, + currentTransactionsHash, + currentBatch.globalExitRoot, + currentBatch.timestamp, + l2Coinbase + ) + ); + + // Update timestamp + currentTimestamp = currentBatch.timestamp; } // Update currentBatchSequenced currentBatchSequenced += uint64(batchesNum); @@ -566,6 +587,7 @@ contract PolygonZkEVMV2 is }); // Store back the storage variables + lastTimestamp = currentTimestamp; lastBatchSequenced = currentBatchSequenced; uint256 nonForcedBatchesSequenced = batchesNum; @@ -588,7 +610,14 @@ contract PolygonZkEVMV2 is batchFee * nonForcedBatchesSequenced ); - rollupManager.onSequenceBatches(currentBatchSequenced,currentAccInputHash); + // Update global exit root if there are new deposits TODO check in rollup manager + bridgeAddress.updateGlobalExitRoot(); + + rollupManager.onSequenceBatches( + currentBatchSequenced, + currentAccInputHash + ); + emit SequenceBatches(currentBatchSequenced); } @@ -608,6 +637,7 @@ contract PolygonZkEVMV2 is ); } + // TODO UPDATE FEES /** * @notice 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 @@ -731,8 +761,9 @@ contract PolygonZkEVMV2 is feeToken.safeTransferFrom(msg.sender, address(this), feeTokenFee); - // Get historic global exit root - bytes32 historicGlobalExitRoot = globalExitRootManager.getRoot(); + // Get globalExitRoot global exit root + bytes32 lastGlobalExitRoot = globalExitRootManager + .getLastGlobalExitRoot(); // Update forcedBatches mapping lastForceBatch++; @@ -740,25 +771,20 @@ contract PolygonZkEVMV2 is forcedBatches[lastForceBatch] = keccak256( abi.encodePacked( keccak256(transactions), - historicGlobalExitRoot, + lastGlobalExitRoot, uint64(block.timestamp) ) ); if (msg.sender == tx.origin) { // Getting the calldata from an EOA is easy so no need to put the `transactions` in the event - emit ForceBatch( - lastForceBatch, - historicGlobalExitRoot, - msg.sender, - "" - ); + emit ForceBatch(lastForceBatch, lastGlobalExitRoot, msg.sender, ""); } else { // Getting internal transaction calldata is complicated (because it requires an archive node) // Therefore it's worth it to put the `transactions` in the event, which is easy to query emit ForceBatch( lastForceBatch, - historicGlobalExitRoot, + lastGlobalExitRoot, msg.sender, transactions ); @@ -770,7 +796,7 @@ contract PolygonZkEVMV2 is * @param batches Struct array which holds the necessary data to append force batches */ function sequenceForceBatches( - BatchData[] calldata batches + ForcedBatchData[] calldata batches ) external isForceBatchAllowed ifNotEmergencyState { uint256 batchesNum = batches.length; @@ -798,7 +824,7 @@ contract PolygonZkEVMV2 is // Sequence force batches for (uint256 i = 0; i < batchesNum; i++) { // Load current sequence - BatchData memory currentBatch = batches[i]; + ForcedBatchData memory currentBatch = batches[i]; currentLastForceBatchSequenced++; // Store the current transactions hash since it's used more than once for gas saving @@ -810,7 +836,7 @@ contract PolygonZkEVMV2 is bytes32 hashedForcedBatchData = keccak256( abi.encodePacked( currentTransactionsHash, - currentBatch.forcedHistoricGlobalExitRoot, + currentBatch.globalExitRoot, currentBatch.minForcedTimestamp ) ); @@ -834,22 +860,22 @@ contract PolygonZkEVMV2 is revert ForceBatchTimeoutNotExpired(); } } - // Calculate next acc input hash currentAccInputHash = keccak256( abi.encodePacked( currentAccInputHash, currentTransactionsHash, - currentBatch.forcedHistoricGlobalExitRoot, - currentBatch.minForcedTimestamp, // could be current timestamp - msg.sender, - _IS_FORCED_BATCH + currentBatch.globalExitRoot, + uint64(block.timestamp), + msg.sender ) ); } // Update currentBatchSequenced currentBatchSequenced += uint64(batchesNum); + lastTimestamp = uint64(block.timestamp); + // Store back the storage variables sequencedBatches[currentBatchSequenced] = SequencedBatchData({ accInputHash: currentAccInputHash, @@ -859,7 +885,10 @@ contract PolygonZkEVMV2 is lastBatchSequenced = currentBatchSequenced; lastForceBatchSequenced = currentLastForceBatchSequenced; - rollupManager.onSequenceBatches(currentBatchSequenced,currentAccInputHash); + rollupManager.onSequenceBatches( + currentBatchSequenced, + currentAccInputHash + ); emit SequenceForceBatches(currentBatchSequenced); } diff --git a/test/contracts/bridge.test.js b/test/contracts/bridge.test.js index 3b227e99a..a2bbc84a4 100644 --- a/test/contracts/bridge.test.js +++ b/test/contracts/bridge.test.js @@ -134,7 +134,7 @@ describe('PolygonZkEVMBridge Contract', () => { expect(await polygonZkEVMBridgeContract.lastUpdatedDepositCount()).to.be.equal(1); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); + const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); expect(rootSCMainnet).to.be.equal(rootJSMainnet); // check merkle proof @@ -195,7 +195,7 @@ describe('PolygonZkEVMBridge Contract', () => { ); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); + const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); expect(rootSCMainnet).to.be.equal(rootJSMainnet); // check merkle proof @@ -261,7 +261,7 @@ describe('PolygonZkEVMBridge Contract', () => { expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(ethers.constants.HashZero); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); + const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); expect(rootSCMainnet).to.be.equal(rootJSMainnet); // Update global exit root @@ -667,7 +667,7 @@ describe('PolygonZkEVMBridge Contract', () => { expect(await newWrappedToken.balanceOf(polygonZkEVMBridgeContract.address)).to.be.equal(0); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); + const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); expect(rootSCMainnet).to.be.equal(rootJSMainnet); // check merkle proof @@ -798,7 +798,7 @@ describe('PolygonZkEVMBridge Contract', () => { }); // Check merkle root with SC - const rootSC = await polygonZkEVMBridgeContract.getRoot(); + const rootSC = await polygonZkEVMBridgeContract.getDepositRoot(); const rootJS = merkleTree.getRoot(); expect(rootSC).to.be.equal(rootJS); diff --git a/test/contracts/bridgeMock.test.js b/test/contracts/bridgeMock.test.js index 0b4a53981..aa1cbb1dd 100644 --- a/test/contracts/bridgeMock.test.js +++ b/test/contracts/bridgeMock.test.js @@ -110,7 +110,7 @@ describe('PolygonZkEVMBridge Mock Contract', () => { expect(await tokenContract.balanceOf(polygonZkEVMBridgeContract.address)).to.be.equal(balanceBridge.add(amount)); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); + const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); expect(rootSCMainnet).to.be.equal(rootJSMainnet); // check merkle proof diff --git a/test/contracts/bridge_metadata.test.js b/test/contracts/bridge_metadata.test.js index c637c75ec..f6c8b34df 100644 --- a/test/contracts/bridge_metadata.test.js +++ b/test/contracts/bridge_metadata.test.js @@ -104,7 +104,7 @@ describe('PolygonZkEVMBridge Contract werid metadata', () => { .to.emit(polygonZkEVMBridgeContract, 'BridgeEvent') .withArgs(LEAF_TYPE_ASSET, originNetwork, tokenAddress, destinationNetwork, destinationAddress, amount, metadata, depositCount); - expect(await polygonZkEVMBridgeContract.getRoot()).to.be.equal(rootJSMainnet); + expect(await polygonZkEVMBridgeContract.getDepositRoot()).to.be.equal(rootJSMainnet); }); it('should PolygonZkEVMBridge with weird token metadata with reverts', async () => { @@ -170,7 +170,7 @@ describe('PolygonZkEVMBridge Contract werid metadata', () => { .to.emit(polygonZkEVMBridgeContract, 'BridgeEvent') .withArgs(LEAF_TYPE_ASSET, originNetwork, tokenAddress, destinationNetwork, destinationAddress, amount, metadata, depositCount); - expect(await polygonZkEVMBridgeContract.getRoot()).to.be.equal(rootJSMainnet); + expect(await polygonZkEVMBridgeContract.getDepositRoot()).to.be.equal(rootJSMainnet); }); it('should PolygonZkEVMBridge with weird token metadata with empty data', async () => { @@ -231,6 +231,6 @@ describe('PolygonZkEVMBridge Contract werid metadata', () => { .to.emit(polygonZkEVMBridgeContract, 'BridgeEvent') .withArgs(LEAF_TYPE_ASSET, originNetwork, tokenAddress, destinationNetwork, destinationAddress, amount, metadata, depositCount); - expect(await polygonZkEVMBridgeContract.getRoot()).to.be.equal(rootJSMainnet); + expect(await polygonZkEVMBridgeContract.getDepositRoot()).to.be.equal(rootJSMainnet); }); }); diff --git a/test/contracts/bridge_permit.test.js b/test/contracts/bridge_permit.test.js index 0783969d7..e5d4f3f39 100644 --- a/test/contracts/bridge_permit.test.js +++ b/test/contracts/bridge_permit.test.js @@ -136,7 +136,7 @@ describe('PolygonZkEVMBridge Contract Permit tests', () => { expect(await tokenContract.balanceOf(polygonZkEVMBridgeContract.address)).to.be.equal(balanceBridge.add(amount)); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); + const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); expect(rootSCMainnet).to.be.equal(rootJSMainnet); // check merkle proof @@ -234,7 +234,7 @@ describe('PolygonZkEVMBridge Contract Permit tests', () => { expect(await daiContract.balanceOf(polygonZkEVMBridgeContract.address)).to.be.equal(balanceBridge.add(amount)); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); + const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); expect(rootSCMainnet).to.be.equal(rootJSMainnet); // check merkle proof @@ -334,7 +334,7 @@ describe('PolygonZkEVMBridge Contract Permit tests', () => { expect(await uniContract.balanceOf(polygonZkEVMBridgeContract.address)).to.be.equal(balanceBridge.add(amount)); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); + const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); expect(rootSCMainnet).to.be.equal(rootJSMainnet); // check merkle proof diff --git a/test/contracts/depositContractMock.test.js b/test/contracts/depositContractMock.test.js index b7147f808..35fae5fe6 100644 --- a/test/contracts/depositContractMock.test.js +++ b/test/contracts/depositContractMock.test.js @@ -67,7 +67,7 @@ describe('Deposit Contract', () => { merkleTree.add(leafValueJs); - const rootSC = await depositContractMock.getRoot(); + const rootSC = await depositContractMock.getDepositRoot(); const rootJS = merkleTree.getRoot(); expect(rootSC).to.be.equal(rootJS); @@ -160,7 +160,7 @@ describe('Deposit Contract', () => { merkleTree.add(leafValueJs); merkleTree.add(leafValueJs2); - const rootSC = await depositContractMock.getRoot(); + const rootSC = await depositContractMock.getDepositRoot(); const rootJS = merkleTree.getRoot(); expect(rootSC).to.be.equal(rootJS); @@ -227,7 +227,7 @@ describe('Deposit Contract', () => { merkleTree.add(leafValue); - let rootSC = await depositContractMock.getRoot(); + let rootSC = await depositContractMock.getDepositRoot(); let rootJS = merkleTree.getRoot(); expect(rootSC).to.be.equal(rootJS); @@ -280,7 +280,7 @@ describe('Deposit Contract', () => { ); merkleTree.add(leafValue); - rootSC = await depositContractMock.getRoot(); + rootSC = await depositContractMock.getDepositRoot(); rootJS = merkleTree.getRoot(); expect(rootSC).to.be.equal(rootJS); @@ -328,7 +328,7 @@ describe('Deposit Contract', () => { ); merkleTree.add(leafValue); - rootSC = await depositContractMock.getRoot(); + rootSC = await depositContractMock.getDepositRoot(); rootJS = merkleTree.getRoot(); expect(rootSC).to.be.equal(rootJS); @@ -376,7 +376,7 @@ describe('Deposit Contract', () => { } await Promise.all(results); // Check roots - rootSC = await depositContractMock.getRoot(); + rootSC = await depositContractMock.getDepositRoot(); rootJS = merkleTree.getRoot(); expect(rootSC).to.be.equal(rootJS); diff --git a/test/contracts/emergencyManager.test.js b/test/contracts/emergencyManager.test.js index 6186af1c7..196e60519 100644 --- a/test/contracts/emergencyManager.test.js +++ b/test/contracts/emergencyManager.test.js @@ -144,10 +144,12 @@ describe('Emergency mode test', () => { // Once in emergency state no sequenceBatches/forceBatches can be done const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.batchFee(); + const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const sequence = { transactions: l2txData, - forcedHistoricGlobalExitRoot: ethers.constants.HashZero, + globalExitRoot: ethers.constants.HashZero, + timestamp: ethers.BigNumber.from(currentTimestamp), minForcedTimestamp: 0, }; diff --git a/test/contracts/globalExitRootManager.test.js b/test/contracts/globalExitRootManager.test.js index 886eaa984..78ff7a6aa 100644 --- a/test/contracts/globalExitRootManager.test.js +++ b/test/contracts/globalExitRootManager.test.js @@ -5,10 +5,6 @@ function calculateGlobalExitRoot(mainnetExitRoot, rollupExitRoot) { return ethers.utils.solidityKeccak256(['bytes32', 'bytes32'], [mainnetExitRoot, rollupExitRoot]); } const zero32bytes = '0x0000000000000000000000000000000000000000000000000000000000000000'; -const MerkleTreeBridge = require('@0xpolygonhermez/zkevm-commonjs').MTBridge; -const { - verifyMerkleProof, -} = require('@0xpolygonhermez/zkevm-commonjs').mtBridgeUtils; describe('Global Exit Root', () => { let rollup; @@ -34,12 +30,10 @@ describe('Global Exit Root', () => { expect(await polygonZkEVMGlobalExitRoot.bridgeAddress()).to.be.equal(PolygonZkEVMBridge.address); expect(await polygonZkEVMGlobalExitRoot.lastRollupExitRoot()).to.be.equal(zero32bytes); expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(zero32bytes); - expect(await polygonZkEVMGlobalExitRoot.depositCount()).to.be.equal(0); }); it('should update root and check global exit root', async () => { const newRootRollup = ethers.utils.hexlify(ethers.utils.randomBytes(32)); - const newRootGlobalExitRoot = calculateGlobalExitRoot(zero32bytes, newRootRollup); await expect(polygonZkEVMGlobalExitRoot.updateExitRoot(newRootRollup)) .to.be.revertedWith('OnlyAllowedContracts'); @@ -50,31 +44,7 @@ describe('Global Exit Root', () => { .withArgs(zero32bytes, newRootRollup); expect(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()) - .to.be.equal(newRootGlobalExitRoot); - - // compute root merkle tree in Js - const height = 32; - const merkleTree = new MerkleTreeBridge(height); - merkleTree.add(newRootGlobalExitRoot); - - const rootSC = await polygonZkEVMGlobalExitRoot.getRoot(); - const rootJS = merkleTree.getRoot(); - - expect(rootSC).to.be.equal(rootJS); - - // check merkle proof - const index = 0; - const proof = merkleTree.getProofTreeByIndex(index); - - // verify merkle proof - expect(verifyMerkleProof(newRootGlobalExitRoot, proof, index, rootSC)).to.be.equal(true); - - expect(await polygonZkEVMGlobalExitRoot.verifyMerkleProof( - newRootGlobalExitRoot, - proof, - index, - rootSC, - )).to.be.equal(true); + .to.be.equal(calculateGlobalExitRoot(zero32bytes, newRootRollup)); // Update root from the PolygonZkEVMBridge const newRootBridge = ethers.utils.hexlify(ethers.utils.randomBytes(32)); @@ -83,28 +53,7 @@ describe('Global Exit Root', () => { .withArgs(newRootBridge, newRootRollup); expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(newRootBridge); - const newRootGlobalExitRoot2 = calculateGlobalExitRoot(newRootBridge, newRootRollup); expect(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()) - .to.be.equal(newRootGlobalExitRoot2); - - // compute root merkle tree in Js - merkleTree.add(newRootGlobalExitRoot2); - const rootSC2 = await polygonZkEVMGlobalExitRoot.getRoot(); - const rootJS2 = merkleTree.getRoot(); - expect(rootSC2).to.be.equal(rootJS2); - - // check merkle proof - const index2 = 1; - const proof2 = merkleTree.getProofTreeByIndex(index2); - - // verify merkle proof - expect(verifyMerkleProof(newRootGlobalExitRoot2, proof2, index2, rootSC2)).to.be.equal(true); - - expect(await polygonZkEVMGlobalExitRoot.verifyMerkleProof( - newRootGlobalExitRoot2, - proof2, - index2, - rootSC2, - )).to.be.equal(true); + .to.be.equal(calculateGlobalExitRoot(newRootBridge, newRootRollup)); }); }); diff --git a/test/contracts/polygonZkEVM.test.js b/test/contracts/polygonZkEVM.test.js index b769183e2..764701fb8 100644 --- a/test/contracts/polygonZkEVM.test.js +++ b/test/contracts/polygonZkEVM.test.js @@ -389,10 +389,12 @@ describe('Polygon ZK-EVM', () => { it('should sequence a batch as trusted sequencer', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.batchFee(); + const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const sequence = { transactions: l2txData, - forcedHistoricGlobalExitRoot: ethers.constants.HashZero, + globalExitRoot: ethers.constants.HashZero, + timestamp: ethers.BigNumber.from(currentTimestamp), minForcedTimestamp: 0, }; @@ -419,12 +421,18 @@ describe('Polygon ZK-EVM', () => { await expect(polygonZkEVMContract.connect(trustedSequencer).sequenceBatches([], trustedSequencer.address)) .to.be.revertedWith('SequenceZeroBatches'); + sequence.globalExitRoot = ethers.constants.MaxUint256; + await expect(polygonZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address)) + .to.be.revertedWith('GlobalExitRootNotExist'); + sequence.globalExitRoot = ethers.constants.HashZero; + // Sequence batch await expect(polygonZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence], deployer.address)) .to.emit(polygonZkEVMContract, 'SequenceBatches') .withArgs(lastBatchSequenced + 1); - const currentTimestamp = (await ethers.provider.getBlock()).timestamp; + const sequencedTimestamp = (await ethers.provider.getBlock()).timestamp; + const finalOwnerBalance = await maticTokenContract.balanceOf( await trustedSequencer.address, ); @@ -439,12 +447,12 @@ describe('Polygon ZK-EVM', () => { const batchAccInputHashJs = calculateAccInputHash( (await polygonZkEVMContract.sequencedBatches(0)).accInputHash, calculateBatchHashData(sequence.transactions), - await polygonZkEVMGlobalExitRoot.getRoot(), - currentTimestamp, + sequence.globalExitRoot, + sequence.timestamp, deployer.address, - '0x00', ); expect(batchAccInputHash).to.be.equal(batchAccInputHashJs); + expect(sequencedBatchData.sequencedTimestamp).to.be.equal(sequencedTimestamp); expect(sequencedBatchData.previousLastBatchSequenced).to.be.equal(0); }); @@ -452,15 +460,19 @@ describe('Polygon ZK-EVM', () => { const l2txData = '0x1234'; const maticAmount = (await polygonZkEVMContract.batchFee()).mul(2); + const currentTimestamp = (await ethers.provider.getBlock()).timestamp; + const sequence = { transactions: l2txData, - forcedHistoricGlobalExitRoot: ethers.constants.HashZero, + globalExitRoot: ethers.constants.HashZero, + timestamp: currentTimestamp, minForcedTimestamp: 0, }; const sequence2 = { transactions: l2txData, - forcedHistoricGlobalExitRoot: ethers.constants.HashZero, + globalExitRoot: ethers.constants.HashZero, + timestamp: currentTimestamp, minForcedTimestamp: 0, }; @@ -480,8 +492,6 @@ describe('Polygon ZK-EVM', () => { .to.emit(polygonZkEVMContract, 'SequenceBatches') .withArgs(lastBatchSequenced + 2); - const currentTimestamp = (await ethers.provider.getBlock()).timestamp; - const finalOwnerBalance = await maticTokenContract.balanceOf( await trustedSequencer.address, ); @@ -500,21 +510,21 @@ describe('Polygon ZK-EVM', () => { const sequencedBatchData2 = await polygonZkEVMContract.sequencedBatches(2); const batchAccInputHash2 = sequencedBatchData2.accInputHash; - // Calcultate input Hash for batch 1 + // Calcultate input Hahs for batch 1 let batchAccInputHashJs = calculateAccInputHash( ethers.constants.HashZero, calculateBatchHashData(sequence.transactions), - await polygonZkEVMGlobalExitRoot.getRoot(), - currentTimestamp, + sequence.globalExitRoot, + sequence.timestamp, trustedSequencer.address, ); - // Calcultate input Hash for batch 2 + // Calcultate input Hahs for batch 2 batchAccInputHashJs = calculateAccInputHash( batchAccInputHashJs, calculateBatchHashData(sequence2.transactions), - await polygonZkEVMGlobalExitRoot.getRoot(), - currentTimestamp, + sequence2.globalExitRoot, + sequence2.timestamp, trustedSequencer.address, ); expect(batchAccInputHash2).to.be.equal(batchAccInputHashJs); @@ -523,7 +533,7 @@ describe('Polygon ZK-EVM', () => { it('force batches through smart contract', async () => { const l2txDataForceBatch = '0x123456'; const maticAmount = await polygonZkEVMContract.getForcedBatchFee(); - const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getRoot(); + const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); // deploy sender SC const sendDataFactory = await ethers.getContractFactory('SendData'); @@ -554,7 +564,7 @@ describe('Polygon ZK-EVM', () => { it('sequenceBatches should sequence multiple batches and force batches', async () => { const l2txDataForceBatch = '0x123456'; const maticAmount = await polygonZkEVMContract.getForcedBatchFee(); - const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getRoot(); + const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); await expect( maticTokenContract.approve(polygonZkEVMContract.address, maticAmount), @@ -576,17 +586,19 @@ describe('Polygon ZK-EVM', () => { const l2txData = '0x1234'; const maticAmountSequence = (await polygonZkEVMContract.batchFee()).mul(1); - let currentTimestamp = (await ethers.provider.getBlock()).timestamp; + const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const sequence = { transactions: l2txDataForceBatch, - forcedHistoricGlobalExitRoot: lastGlobalExitRoot, + globalExitRoot: lastGlobalExitRoot, + timestamp: currentTimestamp, minForcedTimestamp: currentTimestamp, }; const sequence2 = { transactions: l2txData, - forcedHistoricGlobalExitRoot: lastGlobalExitRoot, + globalExitRoot: ethers.constants.HashZero, + timestamp: currentTimestamp, minForcedTimestamp: 0, }; @@ -607,11 +619,28 @@ describe('Polygon ZK-EVM', () => { .to.be.revertedWith('ForcedDataDoesNotMatch'); sequence.minForcedTimestamp -= 1; + sequence.timestamp -= 1; + await expect(polygonZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence, sequence2], trustedSequencer.address)) + .to.be.revertedWith('SequencedTimestampBelowForcedTimestamp'); + sequence.timestamp += 1; + + sequence.timestamp = currentTimestamp + 10; + await expect(polygonZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence, sequence2], trustedSequencer.address)) + .to.be.revertedWith('SequencedTimestampInvalid'); + sequence.timestamp = currentTimestamp; + + sequence2.timestamp -= 1; + await expect(polygonZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence, sequence2], trustedSequencer.address)) + .to.be.revertedWith('SequencedTimestampInvalid'); + sequence2.timestamp += 1; + // Sequence Bathces await expect(polygonZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence, sequence2], trustedSequencer.address)) .to.emit(polygonZkEVMContract, 'SequenceBatches') .withArgs(Number(lastBatchSequenced) + 2); + const sequencedTimestamp = (await ethers.provider.getBlock()).timestamp; + const finalOwnerBalance = await maticTokenContract.balanceOf( await trustedSequencer.address, ); @@ -627,39 +656,101 @@ describe('Polygon ZK-EVM', () => { /* * Check batch mapping - * Calcultate input Hash for batch 1 + * Calcultate input Hahs for batch 1 */ - currentTimestamp = (await ethers.provider.getBlock()).timestamp; - let batchAccInputHashJs = calculateAccInputHash( ethers.constants.HashZero, calculateBatchHashData(sequence.transactions), - await polygonZkEVMGlobalExitRoot.getRoot(), - sequence.minForcedTimestamp, + sequence.globalExitRoot, + sequence.timestamp, trustedSequencer.address, - '0x01', ); - // Calcultate input Hash for batch 2 + // Calcultate input Hahs for batch 2 batchAccInputHashJs = calculateAccInputHash( batchAccInputHashJs, calculateBatchHashData(sequence2.transactions), - await polygonZkEVMGlobalExitRoot.getRoot(), - currentTimestamp, + sequence2.globalExitRoot, + sequence2.timestamp, trustedSequencer.address, - '0x00', ); - const batchData2 = await polygonZkEVMContract.sequencedBatches(2); expect(batchData2.accInputHash).to.be.equal(batchAccInputHashJs); - expect(batchData2.sequencedTimestamp).to.be.equal(currentTimestamp); + expect(batchData2.sequencedTimestamp).to.be.equal(sequencedTimestamp); expect(batchData2.previousLastBatchSequenced).to.be.equal(0); }); + it('sequenceBatches should check the timestamp correctly', async () => { + const l2txData = '0x'; + const maticAmount = (await polygonZkEVMContract.batchFee()).mul(2); + + const sequence = { + transactions: l2txData, + globalExitRoot: ethers.constants.HashZero, + timestamp: 0, + minForcedTimestamp: 0, + }; + + const sequence2 = { + transactions: l2txData, + globalExitRoot: ethers.constants.HashZero, + timestamp: 0, + minForcedTimestamp: 0, + }; + + const initialOwnerBalance = await maticTokenContract.balanceOf( + await trustedSequencer.address, + ); + + // Approve tokens + await expect( + maticTokenContract.connect(trustedSequencer).approve(polygonZkEVMContract.address, maticAmount), + ).to.emit(maticTokenContract, 'Approval'); + + const lastBatchSequenced = await polygonZkEVMContract.lastBatchSequenced(); + + let currentTimestamp = (await ethers.provider.getBlock()).timestamp; + await ethers.provider.send('evm_increaseTime', [1]); // evm_setNextBlockTimestamp + + sequence.timestamp = currentTimestamp + 2; // bigger than current block tiemstamp + + // revert because timestamp is more than the current one + await expect(polygonZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address)) + .to.be.revertedWith('SequencedTimestampInvalid'); + + currentTimestamp = (await ethers.provider.getBlock()).timestamp; + await ethers.provider.send('evm_increaseTime', [1]); + + sequence.timestamp = currentTimestamp; + sequence2.timestamp = currentTimestamp - 1; + + // revert because the second sequence has less timestamp than the previous batch + await expect(polygonZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence, sequence2], trustedSequencer.address)) + .to.be.revertedWith('SequencedTimestampInvalid'); + + currentTimestamp = (await ethers.provider.getBlock()).timestamp; + await ethers.provider.send('evm_increaseTime', [1]); + + sequence.timestamp = currentTimestamp + 1; // edge case, same timestamp as the block + sequence2.timestamp = currentTimestamp + 1; + + // Sequence Batches + await expect(polygonZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence, sequence2], trustedSequencer.address)) + .to.emit(polygonZkEVMContract, 'SequenceBatches') + .withArgs(lastBatchSequenced + 2); + + const finalOwnerBalance = await maticTokenContract.balanceOf( + await trustedSequencer.address, + ); + expect(finalOwnerBalance).to.equal( + ethers.BigNumber.from(initialOwnerBalance).sub(ethers.BigNumber.from(maticAmount)), + ); + }); + it('should force a batch of transactions', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.getForcedBatchFee(); - const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getRoot(); + const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); expect(maticAmount.toString()).to.be.equal((await polygonZkEVMContract.getForcedBatchFee()).toString()); @@ -715,7 +806,7 @@ describe('Polygon ZK-EVM', () => { it('should sequence force batches using sequenceForceBatches', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.getForcedBatchFee(); - const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getRoot(); + const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); await expect( maticTokenContract.approve(polygonZkEVMContract.address, maticAmount), @@ -753,7 +844,7 @@ describe('Polygon ZK-EVM', () => { const forceBatchStruct = { transactions: l2txData, - forcedHistoricGlobalExitRoot: lastGlobalExitRoot, + globalExitRoot: lastGlobalExitRoot, minForcedTimestamp: timestampForceBatch, }; @@ -771,7 +862,7 @@ describe('Polygon ZK-EVM', () => { const forceBatchStructBad = { transactions: l2txData, - forcedHistoricGlobalExitRoot: lastGlobalExitRoot, + globalExitRoot: lastGlobalExitRoot, minForcedTimestamp: timestampForceBatch, }; @@ -780,10 +871,10 @@ describe('Polygon ZK-EVM', () => { .to.be.revertedWith('ForcedDataDoesNotMatch'); forceBatchStructBad.minForcedTimestamp -= 1; - forceBatchStructBad.forcedHistoricGlobalExitRoot = ethers.constants.HashZero; + forceBatchStructBad.globalExitRoot = ethers.constants.HashZero; await expect(polygonZkEVMContract.sequenceForceBatches([forceBatchStructBad])) .to.be.revertedWith('ForcedDataDoesNotMatch'); - forceBatchStructBad.forcedHistoricGlobalExitRoot = lastGlobalExitRoot; + forceBatchStructBad.globalExitRoot = lastGlobalExitRoot; forceBatchStructBad.transactions = '0x1111'; await expect(polygonZkEVMContract.sequenceForceBatches([forceBatchStructBad])) @@ -798,6 +889,8 @@ describe('Polygon ZK-EVM', () => { .to.emit(polygonZkEVMContract, 'SequenceForceBatches') .withArgs(1); + const timestampSequenceBatch = (await ethers.provider.getBlock()).timestamp; + expect(await polygonZkEVMContract.lastForceBatchSequenced()).to.be.equal(1); expect(await polygonZkEVMContract.lastForceBatch()).to.be.equal(1); expect(await polygonZkEVMContract.lastBatchSequenced()).to.be.equal(1); @@ -808,10 +901,9 @@ describe('Polygon ZK-EVM', () => { const batchAccInputHashJs = calculateAccInputHash( ethers.constants.HashZero, calculateBatchHashData(l2txData), - await polygonZkEVMGlobalExitRoot.getRoot(), - forceBatchStruct.minForcedTimestamp, + lastGlobalExitRoot, + timestampSequenceBatch, deployer.address, - '0x01', ); expect(batchAccInputHash).to.be.equal(batchAccInputHashJs); }); @@ -819,10 +911,12 @@ describe('Polygon ZK-EVM', () => { it('should verify a sequenced batch using verifyBatchesTrustedAggregator', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.batchFee(); + const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const sequence = { transactions: l2txData, - forcedHistoricGlobalExitRoot: ethers.constants.HashZero, + globalExitRoot: ethers.constants.HashZero, + timestamp: currentTimestamp, minForcedTimestamp: 0, }; @@ -905,7 +999,7 @@ describe('Polygon ZK-EVM', () => { it('should verify forced sequenced batch using verifyBatchesTrustedAggregator', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.getForcedBatchFee(); - const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getRoot(); + const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); await expect( maticTokenContract.approve(polygonZkEVMContract.address, maticAmount), @@ -927,7 +1021,7 @@ describe('Polygon ZK-EVM', () => { const forceBatchStruct = { transactions: l2txData, - forcedHistoricGlobalExitRoot: lastGlobalExitRoot, + globalExitRoot: lastGlobalExitRoot, minForcedTimestamp: timestampForceBatch, }; @@ -974,10 +1068,12 @@ describe('Polygon ZK-EVM', () => { it('should match the computed SC input with the Js input', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.batchFee(); + const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const sequence = { transactions: l2txData, - forcedHistoricGlobalExitRoot: ethers.constants.HashZero, + globalExitRoot: ethers.constants.HashZero, + timestamp: currentTimestamp, minForcedTimestamp: 0, }; @@ -995,15 +1091,13 @@ describe('Polygon ZK-EVM', () => { const sentBatchHash = (await polygonZkEVMContract.sequencedBatches(lastBatchSequenced + 1)).accInputHash; const oldAccInputHash = (await polygonZkEVMContract.sequencedBatches(0)).accInputHash; - const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const batchAccInputHashJs = calculateAccInputHash( oldAccInputHash, calculateBatchHashData(sequence.transactions), - await polygonZkEVMGlobalExitRoot.getRoot(), - currentTimestamp, + sequence.globalExitRoot, + sequence.timestamp, trustedSequencer.address, - '0x00', ); expect(sentBatchHash).to.be.equal(batchAccInputHashJs); @@ -1043,7 +1137,7 @@ describe('Polygon ZK-EVM', () => { it('should match the computed SC input with the Js input in force batches', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.getForcedBatchFee(); - const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getRoot(); + const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); await expect( maticTokenContract.approve(polygonZkEVMContract.address, maticAmount), @@ -1066,7 +1160,7 @@ describe('Polygon ZK-EVM', () => { const forceBatchStruct = { transactions: l2txData, - forcedHistoricGlobalExitRoot: lastGlobalExitRoot, + globalExitRoot: lastGlobalExitRoot, minForcedTimestamp: timestampForceBatch, }; @@ -1075,16 +1169,16 @@ describe('Polygon ZK-EVM', () => { .to.emit(polygonZkEVMContract, 'SequenceForceBatches') .withArgs(lastForcedBatch); + const sequencedTimestmap = (await ethers.provider.getBlock()).timestamp; const oldAccInputHash = (await polygonZkEVMContract.sequencedBatches(0)).accInputHash; const batchAccInputHash = (await polygonZkEVMContract.sequencedBatches(1)).accInputHash; const batchAccInputHashJs = calculateAccInputHash( oldAccInputHash, calculateBatchHashData(l2txData), - await polygonZkEVMGlobalExitRoot.getRoot(), - forceBatchStruct.minForcedTimestamp, + lastGlobalExitRoot, + sequencedTimestmap, deployer.address, - '0x01', ); expect(batchAccInputHash).to.be.equal(batchAccInputHashJs); @@ -1124,10 +1218,12 @@ describe('Polygon ZK-EVM', () => { it('should verify a sequenced batch using verifyBatches', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.batchFee(); + const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const sequence = { transactions: l2txData, - forcedHistoricGlobalExitRoot: ethers.constants.HashZero, + globalExitRoot: ethers.constants.HashZero, + timestamp: currentTimestamp, minForcedTimestamp: 0, }; @@ -1280,11 +1376,13 @@ describe('Polygon ZK-EVM', () => { it('should test the pending state properly', async () => { const l2txData = '0x123456'; + const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const batchesForSequence = 5; const sequence = { transactions: l2txData, - forcedHistoricGlobalExitRoot: ethers.constants.HashZero, + globalExitRoot: ethers.constants.HashZero, + timestamp: currentTimestamp, minForcedTimestamp: 0, }; const sequencesArray = Array(batchesForSequence).fill(sequence); @@ -1657,10 +1755,12 @@ describe('Polygon ZK-EVM', () => { it('Activate emergency state due halt timeout', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.batchFee(); + const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const sequence = { transactions: l2txData, - forcedHistoricGlobalExitRoot: ethers.constants.HashZero, + globalExitRoot: ethers.constants.HashZero, + timestamp: ethers.BigNumber.from(currentTimestamp), minForcedTimestamp: 0, }; @@ -1703,11 +1803,13 @@ describe('Polygon ZK-EVM', () => { it('Test overridePendingState properly', async () => { const l2txData = '0x123456'; + const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const batchesForSequence = 5; const sequence = { transactions: l2txData, - forcedHistoricGlobalExitRoot: ethers.constants.HashZero, + globalExitRoot: ethers.constants.HashZero, + timestamp: currentTimestamp, minForcedTimestamp: 0, }; const sequencesArray = Array(batchesForSequence).fill(sequence); diff --git a/test/contracts/snark_stark_input.test.js b/test/contracts/snark_stark_input.test.js index 36a8ab60e..47c404673 100644 --- a/test/contracts/snark_stark_input.test.js +++ b/test/contracts/snark_stark_input.test.js @@ -56,7 +56,7 @@ describe('Polygon ZK-EVM snark stark input test', () => { const globalExitRoot = '0x090bcaf734c4f06c93954a827b45a6e8c67b8e0fd1e0a35a1c5982d6961828f9'; const timestamp = 1944498031; const sequencerAddr = '0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D'; - const expectedStarkHashExecutor = '0xef046bcaca930591f7c941cad928406dd1402a4e33b4dc704c519d130a05dd9f'; + const expectedStarkHashExecutor = '0x704d5cfd3e44b82028f7f8cae31168267a7422c5a447b90a65134116da5a8432'; const batchL2DataHash = contractUtils.calculateBatchHashData(batchL2Data); const accumulateInputHashJs = await contractUtils.calculateAccInputHash( @@ -65,7 +65,6 @@ describe('Polygon ZK-EVM snark stark input test', () => { globalExitRoot, timestamp, sequencerAddr, - '0x00', ); const accumulateInputHashSC = await polygonZkEVMContract.calculateAccInputHash( oldAccInputHash, @@ -73,7 +72,6 @@ describe('Polygon ZK-EVM snark stark input test', () => { globalExitRoot, timestamp, sequencerAddr, - false, ); expect(accumulateInputHashJs).to.be.equal(accumulateInputHashSC); expect(accumulateInputHashSC).to.be.equal(expectedStarkHashExecutor); From a6256d649071988cf6b4305122fad425e35ca1c0 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 3 Oct 2023 11:07:54 +0200 Subject: [PATCH 021/230] ongoing --- contracts/PolygonZkEVM.sol | 22 - .../v2/L2/PolygonZkEVMGasTokenBridge.sol | 4 +- contracts/v2/PolygonRollupManager.sol | 764 ++++++++++++------ contracts/v2/PolygonZkEVMBridgeV2.sol | 10 +- contracts/v2/PolygonZkEVMV2.sol | 256 +----- contracts/v2/lib/DepositContractLib.sol | 144 ++++ contracts/v2/lib/DepositContractV2.sol | 44 + .../lib/PolygonAccessControlUpgradeable.sol | 242 ++++++ 8 files changed, 994 insertions(+), 492 deletions(-) create mode 100644 contracts/v2/lib/DepositContractLib.sol create mode 100644 contracts/v2/lib/DepositContractV2.sol create mode 100644 contracts/v2/lib/PolygonAccessControlUpgradeable.sol diff --git a/contracts/PolygonZkEVM.sol b/contracts/PolygonZkEVM.sol index 4bc4a1826..435022435 100644 --- a/contracts/PolygonZkEVM.sol +++ b/contracts/PolygonZkEVM.sol @@ -1555,28 +1555,6 @@ contract PolygonZkEVM is _activateEmergencyState(); } - /** - * @notice Function to deactivate emergency state on both PolygonZkEVM and PolygonZkEVMBridge contracts - */ - function deactivateEmergencyState() external onlyAdmin { - // Deactivate emergency state on PolygonZkEVMBridge - bridgeAddress.deactivateEmergencyState(); - - // Deactivate emergency state on this contract - super._deactivateEmergencyState(); - } - - /** - * @notice Internal function to activate emergency state on both PolygonZkEVM and PolygonZkEVMBridge contracts - */ - function _activateEmergencyState() internal override { - // Activate emergency state on PolygonZkEVM Bridge - bridgeAddress.activateEmergencyState(); - - // Activate emergency state on this contract - super._activateEmergencyState(); - } - //////////////////////// // public/view functions //////////////////////// diff --git a/contracts/v2/L2/PolygonZkEVMGasTokenBridge.sol b/contracts/v2/L2/PolygonZkEVMGasTokenBridge.sol index d3b89a0d9..3b635d79d 100644 --- a/contracts/v2/L2/PolygonZkEVMGasTokenBridge.sol +++ b/contracts/v2/L2/PolygonZkEVMGasTokenBridge.sol @@ -2,7 +2,7 @@ pragma solidity 0.8.20; -import "../../lib/DepositContract.sol"; +import "../lib/DepositContractV2.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; import "../../lib/TokenWrapped.sol"; import "../../interfaces/IBasePolygonZkEVMGlobalExitRoot.sol"; @@ -16,7 +16,7 @@ import "../../lib/GlobalExitRootLib.sol"; * Contract responsible to manage the token interactions with other networks */ contract PolygonZkEVMGasTokenBridge is - DepositContract, + DepositContractV2, IPolygonZkEVMGasTokenBridge { using SafeERC20Upgradeable for IERC20Upgradeable; diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index 8748309f0..ed93e6eeb 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -6,21 +6,23 @@ import "../interfaces/IPolygonRollupManager.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "../interfaces/IPolygonZkEVMGlobalExitRoot.sol"; import "../interfaces/IPolygonZkEVMBridge.sol"; -import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; -import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import "./PolygonZkEVMV2.sol"; import "../lib/EmergencyManager.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import "./lib/PolygonAccessControlUpgradeable.sol"; -//roles TODO +// TODO CHECK STORAGE SLOTS!! /** * Contract responsible for managing the exit roots across multiple Rollups */ abstract contract PolygonRollupManager is - IPolygonRollupManager, - Initializable, - EmergencyManager + PolygonAccessControlUpgradeable, + EmergencyManager, + IPolygonRollupManager { /** * @notice Struct which will be stored for every batch sequence @@ -45,6 +47,7 @@ abstract contract PolygonRollupManager is struct VerifierData { uint64 verifierID; uint64 forkID; + bytes32 genesis; string description; } @@ -68,17 +71,18 @@ abstract contract PolygonRollupManager is * @param previousLastBatchSequenced Previous last batch sequenced before the current one, this is used to properly calculate the fees */ struct RollupData { - address rollupAddress; - IVerifierRollup verifierAddress; // address?¿ + address rollupAddress; // TODO base rollup + IVeraifierRollup verifierAddress; uint64 chainID; - mapping(uint64 => SequencedBatchData) sequencedBatches; mapping(uint64 => bytes32) batchNumToStateRoot; + mapping(uint64 => SequencedBatchData) sequencedBatches; mapping(uint256 => PendingState) pendingStateTransitions; bytes32 lastLocalExitRoot; uint64 lastBatchSequenced; uint64 lastVerifiedBatch; uint64 lastPendingState; uint64 lastPendingStateConsolidated; + uint64 lastVerifiedBatchBeforeUpgrade; } /** @@ -102,12 +106,21 @@ abstract contract PolygonRollupManager is uint256 internal constant _RFIELD = 21888242871839275222246405745257275088548364400416034343698204186575808495617; + // If a sequenced batch exceeds this timeout without being verified, the contract enters in emergency mode + uint64 internal constant _HALT_AGGREGATION_TIMEOUT = 1 weeks; + // Maximum batches that can be verified in one call. It depends on our current metrics // This should be a protection against someone that tries to generate huge chunk of invalid batches, and we can't prove otherwise before the pending timeout expires uint64 internal constant _MAX_VERIFY_BATCHES = 1000; - // If a sequenced batch exceeds this timeout without being verified, the contract enters in emergency mode - uint64 internal constant _HALT_AGGREGATION_TIMEOUT = 1 weeks; + // Max batch multiplier per verification + uint256 internal constant _MAX_BATCH_MULTIPLIER = 12; + + // Max batch fee value + uint256 internal constant _MAX_BATCH_FEE = 1000 ether; + + // Min value batch fee + uint256 internal constant _MIN_BATCH_FEE = 1 gwei; // Goldilocks prime field uint256 internal constant _GOLDILOCKS_PRIME_FIELD = 0xFFFFFFFF00000001; // 2 ** 64 - 2 ** 32 + 1 @@ -118,12 +131,129 @@ abstract contract PolygonRollupManager is // Exit merkle tree levels uint256 internal constant _EXIT_TREE_DEPTH = 32; + // Existing roles on rollup manager + + // Trusted aggregator will be able to verify batches without extra delau + bytes32 public constant ADD_VERIFIER_CONSENSUS_ROLE = + keccak256("ADD_VERIFIER_CONSENSUS_ROLE"); + + // Trusted aggregator will be able to verify batches without extra delau + bytes32 public constant DELETE_VERIFIER_CONSENSUS_ROLE = + keccak256("DELETE_VERIFIER_CONSENSUS_ROLE"); + + bytes32 public constant CREATE_ROLLUP_ROLE = + keccak256("CREATE_ROLLUP_ROLE"); + + bytes32 public constant ADD_EXISTING_ROLLUP_ROLE = + keccak256("ADD_EXISTING_ROLLUP_ROLE"); + + bytes32 public constant UPDATE_ROLLUP_ROLE = + keccak256("UPDATE_ROLLUP_ROLE"); + + // Trusted aggregator will be able to verify batches without extra delau + bytes32 public constant TRUSTED_AGGREGATOR_ROLE = + keccak256("TRUSTED_AGGREGATOR_ROLE"); + + bytes32 public constant STOP_EMERGENCY_ROLE = + keccak256("STOP_EMERGENCY_ROLE"); + + // Trusted aggregator will be able to verify batches without extra delau + bytes32 public constant EMERGENCY_COUNCIL_ROLE = + keccak256("EMERGENCY_COUNCIL_ROLE"); + + // Will be able to update the emergency council + bytes32 public constant EMERGENCY_COUNCIL_ADMIN = + keccak256("EMERGENCY_COUNCIL_ADMIN"); + // Global Exit Root interface IPolygonZkEVMGlobalExitRoot public immutable globalExitRootManager; // PolygonZkEVM Bridge Address IPolygonZkEVMBridge public immutable bridgeAddress; + // TODO could be optimized using the storage slot of the emergency mode + + // Time target of the verification of a batch + // Adaptatly the batchFee will be updated to achieve this target + uint64 internal _legacyVerifyBatchTimeTarget; + + // Batch fee multiplier with 3 decimals that goes from 1000 - 1023 + uint16 internal _legacyMultiplierBatchFee; + + // Trusted sequencer address + address internal _legacyTrustedSequencer; + + // Current matic fee per batch sequenced + uint256 internal _legacyBatchFee; + + // Queue of forced batches with their associated data + // ForceBatchNum --> hashedForcedBatchData + // hashedForcedBatchData: hash containing the necessary information to force a batch: + // keccak256(keccak256(bytes transactions), bytes32 globalExitRoot, unint64 minForcedTimestamp) + mapping(uint64 => bytes32) internal _legacyForcedBatches; + + // Queue of batches that defines the virtual state + // SequenceBatchNum --> SequencedBatchData + mapping(uint64 => SequencedBatchData) internal _legacySequencedBatches; + + // Last sequenced timestamp + uint64 internal _legacyLastTimestamp; + + // Last batch sent by the sequencers + uint64 internal _legacylastBatchSequenced; + + // Last forced batch included in the sequence + uint64 internal _legacylastForceBatchSequenced; + + // Last forced batch + uint64 internal _legacylastForceBatch; + + // Last batch verified by the aggregators + uint64 internal _legacylastVerifiedBatch; + + // Trusted aggregator address + address internal _legacyTrustedAggregator; // TODO legacy=? + + // State root mapping + // BatchNum --> state root + mapping(uint64 => bytes32) internal _legacybatchNumToStateRoot; + + // Trusted sequencer URL + string internal _legacyTrustedSequencerURL; + + // L2 network name + string internal _legacyNetworkName; + + // Pending state mapping + // pendingStateNumber --> PendingState + mapping(uint256 => PendingState) internal _legacyPendingStateTransitions; + + // Last pending state + uint64 internal _legacyLastPendingState; + + // Last pending state consolidated + uint64 internal _legacyLastPendingStateConsolidated; + + // Once a pending state exceeds this timeout it can be consolidated + uint64 internal _legacyPendingStateTimeout; + + // Trusted aggregator timeout, if a sequence is not verified in this time frame, + // everyone can verify that sequence + uint64 internal _legacyTrustedAggregatorTimeout; + + // Address that will be able to adjust contract parameters or stop the emergency state + address internal _legacyAdmin; + + // This account will be able to accept the admin role + address internal _legacyPendingAdmin; + + // Force batch timeout + uint64 internal _legacyForceBatchTimeout; + + // Indicates if forced batches are disallowed + bool internal _legacyIsForcedBatchDisallowed; + + // Start current variables // Number of consensus added, every new consensus will be assigned sequencially a new ID uint64 public consensusCount; @@ -150,9 +280,6 @@ abstract contract PolygonRollupManager is // chainID => rollupID mapping(uint64 chainID => uint64 rollupID) public chainIDToRollupID; - // Trusted aggregator for all the Rollups - address public trustedAggregator; - // Once a pending state exceeds this timeout it can be consolidated uint64 public pendingStateTimeout; @@ -160,11 +287,10 @@ abstract contract PolygonRollupManager is // everyone can verify that sequence uint64 public trustedAggregatorTimeout; - // Governance address - address public governance; // two steps governance - - // This account will be able to accept the governance role - address public pendingGovernance; + uint64 public totalSequencedBatches; + uint64 public totalPendingForcedBatches; + uint64 public totalVerifiedBatches; + uint64 public lastAggregationTimestamp; /** * @dev Emitted when a new consensus is added @@ -207,7 +333,7 @@ abstract contract PolygonRollupManager is /** * @dev Emitted when a new verifier is added */ - event RollupUpgraded(address rollupAddress, address newConsensusAddress); + event UpdateRollup(address rollupAddress, address newConsensusAddress); /** * @dev Emitted when a new verifier is added @@ -275,11 +401,6 @@ abstract contract PolygonRollupManager is */ event SetPendingStateTimeout(uint64 newPendingStateTimeout); - /** - * @dev Emitted when the admin updates the trusted aggregator address - */ - event SetTrustedAggregator(address newTrustedAggregator); - /** * @dev Emitted when the admin updates the multiplier batch fee */ @@ -290,16 +411,6 @@ abstract contract PolygonRollupManager is */ event SetVerifyBatchTimeTarget(uint64 newVerifyBatchTimeTarget); - /** - * @dev Emitted when the governance starts the two-step transfer role setting a new pending governance - */ - event TransferGovernanceRole(address newPendingGovernance); - - /** - * @dev Emitted when the pending Governance accepts the Governance role - */ - event AcceptGovernanceRole(address newGovernance); - /** * @param _globalExitRootManager Global exit root manager address * @param _bridgeAddress Bridge address @@ -312,13 +423,15 @@ abstract contract PolygonRollupManager is bridgeAddress = _bridgeAddress; } + // TODO Add array fo consensus and verifiers and deploy zkEVM with legacy information function initialize( - address _governance, uint64 _pendingStateTimeout, address _trustedAggregator, - uint64 _trustedAggregatorTimeout + uint64 _trustedAggregatorTimeout, + address admin, + address timelock, + address emergencyCouncil ) external initializer { - governance = _governance; trustedAggregator = _trustedAggregator; // Check initialize parameters @@ -334,23 +447,38 @@ abstract contract PolygonRollupManager is trustedAggregatorTimeout = _trustedAggregatorTimeout; // Initialize OZ contracts - //__Ownable_init_unchained(); - } + __AccessControl_init(); - modifier onlyGovernance() { - if (governance != msg.sender) { - revert OnlyGovernance(); - } - _; - } + // setup roles - modifier onlyTrustedAggregator() { - if (trustedAggregator != msg.sender) { - revert OnlyTrustedAggregator(); - } - _; + // Timelock roles + _setupRole(DEFAULT_ADMIN_ROLE, timelock); + _setupRole(ADD_VERIFIER_CONSENSUS_ROLE, timelock); + _setupRole(ADD_EXISTING_ROLLUP_ROLE, timelock); + // role fees + // role rst of parameters + + // Even this role can only update to an already added verifier/consensus + // Could break the compatibility of them, changing the virtual state + // review + _setupRole(UPDATE_ROLLUP_ROLE, timelock); + + // Admin roles + _setupRole(DELETE_VERIFIER_CONSENSUS_ROLE, admin); + _setupRole(CREATE_ROLLUP_ROLE, admin); + _setupRole(STOP_EMERGENCY_ROLE, admin); + + // Emergency council roles + _setupRole(EMERGENCY_COUNCIL_ROLE, emergencyCouncil); + _setupRole(EMERGENCY_COUNCIL_ADMIN, emergencyCouncil); + + // deploy zkEVM } + //////////////////////////////////////////////// + // Consensus-Verifiers-Rollups managment functions + /////////////////////////////////////////////// + /** * @notice Add a new consensus implementation contract * This contract will be used as base for the new created Rollups @@ -360,7 +488,20 @@ abstract contract PolygonRollupManager is function addNewConsensus( address newConsensusAddress, string memory description - ) external onlyGovernance { + ) external onlyRole(ADD_VERIFIER_CONSENSUS_ROLE) { + _addNewConsensus(newConsensusAddress, description); + } + + /** + * @notice Add a new consensus implementation contract + * This contract will be used as base for the new created Rollups + * @param newConsensusAddress new exit tree root + * @param description description of the consensus + */ + function _addNewConsensus( + address newConsensusAddress, + string memory description + ) internal { if (consensusMap[newConsensusAddress].consensusID != 0) { revert ConsensusAlreadyExist(); } @@ -382,8 +523,22 @@ abstract contract PolygonRollupManager is function addNewVerifier( address newVerifierAddress, uint64 forkID, + bytes32 genesis, string memory description - ) external onlyGovernance { + ) external onlyRole(ADD_VERIFIER_CONSENSUS_ROLE) { + _addNewVerifier(newVerifierAddress, forkID, genesis, description); + } + + /** + * @notice Add a new vefifier contract + * @param newVerifierAddress new verifier address + */ + function _addNewVerifier( + address newVerifierAddress, + uint64 forkID, + bytes32 genesis, + string memory description + ) internal { if (verifierMap[newVerifierAddress].verifierID != 0) { revert VerifierAlreadyExist(); } @@ -392,6 +547,7 @@ abstract contract PolygonRollupManager is verifierMap[newVerifierAddress] = VerifierData({ verifierID: verifierID, forkID: forkID, + genesis: genesis, description: description }); @@ -400,9 +556,12 @@ abstract contract PolygonRollupManager is /** * @notice Delete Conensus + * Note that can be some "holes" in the verifier map * @param consensusAddress Consensus address to delete */ - function deleteConsensus(address consensusAddress) external onlyGovernance { + function deleteConsensus( + address consensusAddress + ) external onlyRole(DELETE_VERIFIER_CONSENSUS_ROLE) { if (consensusMap[consensusAddress].consensusID == 0) { revert ConsensusDoesNotExist(); } @@ -415,9 +574,12 @@ abstract contract PolygonRollupManager is /** * @notice Delete Verifier + * Note that can be some "holes" in the verifier map * @param verifierAddress Verifier address to delete */ - function deleteVerifier(address verifierAddress) external onlyGovernance { + function deleteVerifier( + address verifierAddress + ) external onlyRole(DELETE_VERIFIER_CONSENSUS_ROLE) { if (verifierMap[verifierAddress].verifierID == 0) { revert VerifierDoesNotExist(); } @@ -433,64 +595,73 @@ abstract contract PolygonRollupManager is * @param consensusAddress consensus implementation address * @param verifierAddress verifier address * @param chainID chainID - * @param _admin admin of the new created rollup - * @param _trustedSequencer trusted sequencer of the new created rollup - * @param _trustedSequencerURL trusted sequencer URL of the new created rollup - * @param _networkName network name of the new created rollup - * @param _version version string of the new created rollup + * @param admin admin of the new created rollup + * @param trustedSequencer trusted sequencer of the new created rollup + * @param trustedSequencerURL trusted sequencer URL of the new created rollup + * @param networkName network name of the new created rollup + * @param version version string of the new created rollup */ function createNewRollup( address consensusAddress, address verifierAddress, uint64 chainID, - address _admin, - address _trustedSequencer, - string memory _trustedSequencerURL, - string memory _networkName, - string calldata _version - ) external onlyGovernance { + address admin, + address trustedSequencer, + string memory trustedSequencerURL, + string memory networkName, + string calldata version + ) external onlyRole(CREATE_ROLLUP_ROLE) { + // Check that consensus and verifier are already added if (consensusMap[consensusAddress].consensusID == 0) { revert ConsensusDoesNotExist(); } - if (verifierMap[verifierAddress].verifierID == 0) { + VerifierData verifier = verifierMap[verifierAddress]; + if (verifier.verifierID == 0) { revert VerifierDoesNotExist(); } + // Check chainID nullifier if (chainIDToRollupID[chainID] != 0) { revert ChainIDAlreadyExist(); } + // Create a new Rollup, using a transparent proxy pattern + // Consensus will be the implementation, and this contract the admin uint64 rollupID = ++rollupCount; - - // Create a proxy, with the consensus as a implementation, and the governance as admin address rollupAddress = address( new TransparentUpgradeableProxy( consensusAddress, - governance, + address(this), abi.encodeCall( PolygonZkEVMV2.initialize, ( - _admin, - _trustedSequencer, + admin, + trustedSequencer, chainID, - _trustedSequencerURL, - _networkName, - _version, + trustedSequencerURL, + networkName, + version, rollupID ) // TODO Make lib about, like basePolygonRollup ) ) ); + // Set chainID nullifier + chainIDToRollupID[chainID] = rollupID; + + // Store rollup data rollupAddressToID[rollupAddress] = rollupID; RollupData storage rollup = rollupIDToRollupData[rollupID]; rollup.rollupAddress = rollupAddress; rollup.verifierAddress = IVerifierRollup(verifierAddress); rollup.chainID = chainID; + rollup.batchNumToStateRoot[0] = verifier.genesis; emit AddNewRollup( + rollupID, rollupAddress, consensusAddress, verifierAddress, @@ -498,10 +669,9 @@ abstract contract PolygonRollupManager is ); } - // Add existing rollup, case of zkEVM, could even be hardcoded?¿ - + // review, could even delete this?¿ /** - * @notice Add a new vefifier contract + * @notice Add an already deployed rollup * @param rollupAddress rollup address * @param verifierAddress verifier address, must be added before * @param chainID chain id of the created rollup @@ -509,18 +679,33 @@ abstract contract PolygonRollupManager is function addExistingRollup( address rollupAddress, address verifierAddress, - uint64 chainID - ) external onlyGovernance { + uint64 chainID, + bytes32 genesis, + uint256 version + ) external onlyRole(ADD_EXISTING_ROLLUP_ROLE) { + // Check chainID nullifier + if (chainIDToRollupID[chainID] != 0) { + revert ChainIDAlreadyExist(); + } + uint64 rollupID = ++rollupCount; rollupAddressToID[rollupAddress] = rollupID; + chainIDToRollupID[chainID] = rollupID; RollupData storage rollup = rollupIDToRollupData[rollupID]; rollup.rollupAddress = rollupAddress; rollup.verifierAddress = IVerifierRollup(verifierAddress); rollup.chainID = chainID; + rollup.batchNumToStateRoot[0] = genesis; - emit AddNewRollup(rollupAddress, address(0), verifierAddress, chainID); + emit AddNewRollup( + rollupID, + rollupAddress, + address(0), + verifierAddress, + chainID + ); } /** @@ -529,119 +714,64 @@ abstract contract PolygonRollupManager is * @param newConsensusAddress new implementation of the consensus * @param upgradeData Upgrade data */ - function upgradeRollupImplementation( + function updateRollup( TransparentUpgradeableProxy rollupAddress, + IVerifierRollup newVerifierAddress, address newConsensusAddress, bytes calldata upgradeData - ) external onlyGovernance { - if (consensusMap[newConsensusAddress].consensusID == 0) { - revert ConsensusDoesNotExist(); - } - - if (rollupAddress.implementation() == newConsensusAddress) { - revert UpgradeToSameImplementation(); - } - - rollupAddress.upgradeToAndCall(newConsensusAddress, upgradeData); - - emit RollupUpgraded(address(rollupAddress), newConsensusAddress); - } - - /** - * @notice Add a new vefifier contract - * @param newVerifierAddress new verifier address - */ - function upgradeRollupVerifier( - address rollupAddress, - IVerifierRollup newVerifierAddress - ) external onlyGovernance { + ) external onlyRole(UPDATE_ROLLUP_ROLE) { uint64 rollupID = rollupAddressToID[rollupAddress]; if (rollupID == 0) { revert RollupMustExist(); } - if (verifierMap[address(newVerifierAddress)].verifierID != 0) { - revert VerifierDoesNotExist(); - } - RollupData storage rollup = rollupIDToRollupData[rollupID]; - if (rollup.verifierAddress == newVerifierAddress) { - revert VerifierMustBeDifferent(); - } - - rollup.verifierAddress = newVerifierAddress; - - emit RollupUpgraded(rollupAddress, address(newVerifierAddress)); - } - - // Since it's expected to have no more than 4-5 levels, this approach is good enough - // In a future this computation will be done inside the circuit - - /** - * @notice get the current rollup exit root - */ - function getRollupExitRoot() public view returns (bytes32) { - uint256 currentNodes = rollupCount; + // If it's defined a new verifier address, update verifier + if (newVerifierAddress != address(0)) { + VerifierData newVerifier = verifierMap[address(newVerifierAddress)]; - // if there are no nodes return 0 - if (currentNodes == 0) { - return bytes32(0); - } + if (newVerifier.verifierID == 0) { + revert VerifierDoesNotExist(); + } - // This array will contain the nodes of the current iteration - bytes32[] memory tmpTree = new bytes32[](currentNodes); + if (rollup.verifierAddress == newVerifierAddress) { + revert VerifierMustBeDifferent(); + } - // In the first iteration the nodes will be the leafs which are the local exit roots of each network - for (uint256 i = 0; i < currentNodes; i++) { - tmpTree[i] = rollupIDToRollupData[uint64(i)].lastLocalExitRoot; + if ( + verifierMap[address(rollup.verifierAddress)].genesis != + newVerifier.verifier + ) { + revert VerifiersMustHaveSameGenesis(); + } + rollup.verifierAddress = newVerifierAddress; + rollup.lastVerifiedBatchBeforeUpgrade = getLastVerifiedBatch( + rollupID + ); } - // This variable will keep track of the zero hashes - bytes32 currentZeroHashHeight = 0; - - // This variable will keep track of the reamining levels to compute - uint256 remainingLevels = _EXIT_TREE_DEPTH; + // If it's defined a new implementation address, update implementation + if (newConsensusAddress != address(0)) { + if (consensusMap[newConsensusAddress].consensusID == 0) { + revert ConsensusDoesNotExist(); + } - // Calculate the root of the sub-tree that contains all the localExitRoots - while (currentNodes != 1) { - uint256 nextIterationNodes = currentNodes / 2 + (currentNodes % 2); - bytes32[] memory nextTmpTree = new bytes32[](nextIterationNodes); - for (uint256 i = 0; i < nextIterationNodes; i++) { - // if we are on the last iteration of the current level and the nodes are odd - if (i == nextIterationNodes - 1 && (currentNodes % 2) == 1) { - nextTmpTree[i] = keccak256( - abi.encodePacked(tmpTree[i * 2], currentZeroHashHeight) - ); - } else { - nextTmpTree[i] = keccak256( - abi.encodePacked(tmpTree[i * 2], tmpTree[(i * 2) + 1]) - ); - } + if (rollupAddress.implementation() == newConsensusAddress) { + revert UpgradeToSameImplementation(); } - // update tree bariables - tmpTree = nextTmpTree; - currentNodes = nextIterationNodes; - currentZeroHashHeight = keccak256( - abi.encodePacked(currentZeroHashHeight, currentZeroHashHeight) - ); - remainingLevels--; + rollupAddress.upgradeToAndCall(newConsensusAddress, upgradeData); } - bytes32 currentRoot = tmpTree[0]; - - // Calculate remaining levels, since it's a sequencial merkle tree, the rest of the tree are zeroes - for (uint256 i = 0; i < remainingLevels; i++) { - currentRoot = keccak256( - abi.encodePacked(currentRoot, currentZeroHashHeight) - ); - currentZeroHashHeight = keccak256( - abi.encodePacked(currentZeroHashHeight, currentZeroHashHeight) - ); - } - return currentRoot; + // review Should emit forkID aswell?¿ + emit UpdateRollup( + rollupID, + newConsensusAddress, + newVerifierAddress, + rollup.lastVerifiedBatchBeforeUpgrade + ); } ///////////////////////////////////// @@ -655,29 +785,44 @@ abstract contract PolygonRollupManager is */ function onSequenceBatches( uint64 newSequencedBatch, + uint64 sequencedForcedBatches, bytes32 newAccInputHash - ) external { - // Get current Rollup + ) external ifNotEmergencyState { + // Check that the msg.sender is an added rollup uint64 rollupID = rollupAddressToID[msg.sender]; - if (rollupID == 0) { revert SenderMustBeRollup(); } RollupData storage rollup = rollupIDToRollupData[rollupID]; - if (newSequencedBatch <= rollup.lastBatchSequenced) { + // Update the total sequenced and pending forced batches + uint64 previousLastBatchSequenced = rollup.lastBatchSequenced; + if (newSequencedBatch <= previousLastBatchSequenced) { revert NewSequencedBatchMustBeBigger(); } - // Update rollup data with the new sequence + unchecked { + uint64 sequencedBatches = newSequencedBatch - + previousLastBatchSequenced; + } + totalSequencedBatches += sequencedBatches; + + if (sequencedForcedBatches != 0) { + totalPendingForcedBatches -= sequencedForcedBatches; + } + + // Update sequenced batches of the current rollup rollup.sequencedBatches[newSequencedBatch] = SequencedBatchData({ accInputHash: newAccInputHash, sequencedTimestamp: uint64(block.timestamp), - previousLastBatchSequenced: rollup.lastBatchSequenced + previousLastBatchSequenced: previousLastBatchSequenced }); rollup.lastBatchSequenced = newSequencedBatch; - emit OnSequenceBatches(newSequencedBatch, newAccInputHash, rollupID); + // Consolidate pending state if possible + _tryConsolidatePendingState(rollup); + + emit OnSequenceBatches(rollupID, newSequencedBatch); } // Sequencer always have to pay in POL @@ -780,7 +925,7 @@ abstract contract PolygonRollupManager is bytes32 newStateRoot, address beneficiary, bytes32[24] calldata proof - ) external onlyTrustedAggregator { + ) external onlyRole(TRUSTED_AGGREGATOR_ROLE) { RollupData storage rollup = rollupIDToRollupData[rollupID]; _verifyAndRewardBatches( @@ -894,9 +1039,10 @@ abstract contract PolygonRollupManager is revert InvalidProof(); } - PolygonZkEVMV2(rollup.rollupAddress).verifyAndRewardBatches( - beneficiary, - (finalNewBatch - currentLastVerifiedBatch) + PolygonZkEVMV2(rollup.rollupAddress).onVerifyBatches( + finalNewBatch, + newStateRoot, + aggregator ); } @@ -937,7 +1083,7 @@ abstract contract PolygonRollupManager is RollupData storage rollup = rollupIDToRollupData[rollupID]; // Check if pending state can be consolidated // If trusted aggregator is the sender, do not check the timeout or the emergency state - if (msg.sender != trustedAggregator) { + if (!hasRole(TRUSTED_AGGREGATOR_ROLE, msg.sender)) { if (isEmergencyState) { revert OnlyNotEmergencyState(); } @@ -1014,7 +1160,7 @@ abstract contract PolygonRollupManager is bytes32 newLocalExitRoot, bytes32 newStateRoot, bytes32[24] calldata proof - ) external onlyTrustedAggregator { + ) external onlyRole(TRUSTED_AGGREGATOR_ROLE) { RollupData storage rollup = rollupIDToRollupData[rollupID]; _proveDistinctPendingState( @@ -1192,37 +1338,118 @@ abstract contract PolygonRollupManager is } } + // TODO UPDATE FEES + + // + /** + * @notice 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 + * @param newLastVerifiedBatch New last verified batch + */ + function _updateBatchFee(uint64 newLastVerifiedBatch) internal { + uint64 currentLastVerifiedBatch = getLastVerifiedBatch(); + uint64 currentBatch = newLastVerifiedBatch; + + uint256 totalBatchesAboveTarget; + uint256 newBatchesVerified = newLastVerifiedBatch - + currentLastVerifiedBatch; + + uint256 targetTimestamp = block.timestamp - verifyBatchTimeTarget; + + while (currentBatch != currentLastVerifiedBatch) { + // Load sequenced batchdata + SequencedBatchData + storage currentSequencedBatchData = sequencedBatches[ + currentBatch + ]; + + // Check if timestamp is below the verifyBatchTimeTarget + if ( + targetTimestamp < currentSequencedBatchData.sequencedTimestamp + ) { + // update currentBatch + currentBatch = currentSequencedBatchData + .previousLastBatchSequenced; + } else { + // The rest of batches will be above + totalBatchesAboveTarget = + currentBatch - + currentLastVerifiedBatch; + break; + } + } + + uint256 totalBatchesBelowTarget = newBatchesVerified - + totalBatchesAboveTarget; + + // _MAX_BATCH_FEE --> (< 70 bits) + // multiplierBatchFee --> (< 10 bits) + // _MAX_BATCH_MULTIPLIER = 12 + // multiplierBatchFee ** _MAX_BATCH_MULTIPLIER --> (< 128 bits) + // batchFee * (multiplierBatchFee ** _MAX_BATCH_MULTIPLIER)--> + // (< 70 bits) * (< 128 bits) = < 256 bits + + // Since all the following operations cannot overflow, we can optimize this operations with unchecked + unchecked { + if (totalBatchesBelowTarget < totalBatchesAboveTarget) { + // There are more batches above target, fee is multiplied + uint256 diffBatches = totalBatchesAboveTarget - + totalBatchesBelowTarget; + + diffBatches = diffBatches > _MAX_BATCH_MULTIPLIER + ? _MAX_BATCH_MULTIPLIER + : diffBatches; + + // For every multiplierBatchFee multiplication we must shift 3 zeroes since we have 3 decimals + batchFee = + (batchFee * (uint256(multiplierBatchFee) ** diffBatches)) / + (uint256(1000) ** diffBatches); + } else { + // There are more batches below target, fee is divided + uint256 diffBatches = totalBatchesBelowTarget - + totalBatchesAboveTarget; + + diffBatches = diffBatches > _MAX_BATCH_MULTIPLIER + ? _MAX_BATCH_MULTIPLIER + : diffBatches; + + // For every multiplierBatchFee multiplication we must shift 3 zeroes since we have 3 decimals + uint256 accDivisor = (uint256(1 ether) * + (uint256(multiplierBatchFee) ** diffBatches)) / + (uint256(1000) ** diffBatches); + + // multiplyFactor = multiplierBatchFee ** diffBatches / 10 ** (diffBatches * 3) + // accDivisor = 1E18 * multiplyFactor + // 1E18 * batchFee / accDivisor = batchFee / multiplyFactor + // < 60 bits * < 70 bits / ~60 bits --> overflow not possible + batchFee = (uint256(1 ether) * batchFee) / accDivisor; + } + } + + // Batch fee must remain inside a range + if (batchFee > _MAX_BATCH_FEE) { + batchFee = _MAX_BATCH_FEE; + } else if (batchFee < _MIN_BATCH_FEE) { + batchFee = _MIN_BATCH_FEE; + } + } + + //////////////////////// + // Emergency state functions + //////////////////////// + /** * @notice 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 - * @param sequencedBatchNum Sequenced batch number that has not been aggreagated in _HALT_AGGREGATION_TIMEOUT + * If not called by the owner must not have been aggregated in a _HALT_AGGREGATION_TIMEOUT period */ - function activateEmergencyState(uint64 sequencedBatchNum) external { - if (msg.sender != governance) { - // TODO - // just one it's enough - revert NotSupportedCurrently(); - // // Only check conditions if is not called by the owner - // uint64 currentLastVerifiedBatch = getLastVerifiedBatch(); - // // Check that the batch has not been verified - // if (sequencedBatchNum <= currentLastVerifiedBatch) { - // revert BatchAlreadyVerified(); - // } - // // Check that the batch has been sequenced and this was the end of a sequence - // if ( - // sequencedBatchNum > lastBatchSequenced || - // sequencedBatches[sequencedBatchNum].sequencedTimestamp == 0 - // ) { - // revert BatchNotSequencedOrNotSequenceEnd(); - // } - // // Check that has been passed _HALT_AGGREGATION_TIMEOUT since it was sequenced - // if ( - // sequencedBatches[sequencedBatchNum].sequencedTimestamp + - // _HALT_AGGREGATION_TIMEOUT > - // block.timestamp - // ) { - // revert HaltTimeoutNotExpired(); - // } + function activateEmergencyState() external { + if (!hasRole(EMERGENCY_COUNCIL_ROLE, msg.sender)) { + if ( + lastAggregationTimestamp + _HALT_AGGREGATION_TIMEOUT > + block.timestamp + ) { + revert HaltTimeoutNotExpired(); + } } _activateEmergencyState(); } @@ -1297,33 +1524,77 @@ abstract contract PolygonRollupManager is emit SetPendingStateTimeout(newPendingStateTimeout); } - /** - * @notice Starts the Governance role transfer - * This is a two step process, the pending Governance must accepted to finalize the process - * @param newPendingGovernance Address of the new pending Governance - */ - function transferGovernanceRole( - address newPendingGovernance - ) external onlyGovernance { - pendingGovernance = newPendingGovernance; - emit TransferGovernanceRole(newPendingGovernance); - } + //////////////////////// + // view/pure functions + //////////////////////// + + // Since it's expected to have no more than 4-5 levels, this approach is good enough + // In a future this computation will be done inside the circuit /** - * @notice Allow the current pending Governance to accept the Governance role + * @notice get the current rollup exit root */ - function acceptGovernanceRole() external { - if (pendingGovernance != msg.sender) { - revert OnlyPendingGovernance(); + function getRollupExitRoot() public view returns (bytes32) { + uint256 currentNodes = rollupCount; + + // if there are no nodes return 0 + if (currentNodes == 0) { + return bytes32(0); } - governance = pendingGovernance; - emit AcceptGovernanceRole(pendingGovernance); - } + // This array will contain the nodes of the current iteration + bytes32[] memory tmpTree = new bytes32[](currentNodes); - //////////////////////// - // public/view functions - //////////////////////// + // In the first iteration the nodes will be the leafs which are the local exit roots of each network + for (uint256 i = 0; i < currentNodes; i++) { + tmpTree[i] = rollupIDToRollupData[uint64(i)].lastLocalExitRoot; + } + + // This variable will keep track of the zero hashes + bytes32 currentZeroHashHeight = 0; + + // This variable will keep track of the reamining levels to compute + uint256 remainingLevels = _EXIT_TREE_DEPTH; + + // Calculate the root of the sub-tree that contains all the localExitRoots + while (currentNodes != 1) { + uint256 nextIterationNodes = currentNodes / 2 + (currentNodes % 2); + bytes32[] memory nextTmpTree = new bytes32[](nextIterationNodes); + for (uint256 i = 0; i < nextIterationNodes; i++) { + // if we are on the last iteration of the current level and the nodes are odd + if (i == nextIterationNodes - 1 && (currentNodes % 2) == 1) { + nextTmpTree[i] = keccak256( + abi.encodePacked(tmpTree[i * 2], currentZeroHashHeight) + ); + } else { + nextTmpTree[i] = keccak256( + abi.encodePacked(tmpTree[i * 2], tmpTree[(i * 2) + 1]) + ); + } + } + + // update tree bariables + tmpTree = nextTmpTree; + currentNodes = nextIterationNodes; + currentZeroHashHeight = keccak256( + abi.encodePacked(currentZeroHashHeight, currentZeroHashHeight) + ); + remainingLevels--; + } + + bytes32 currentRoot = tmpTree[0]; + + // Calculate remaining levels, since it's a sequencial merkle tree, the rest of the tree are zeroes + for (uint256 i = 0; i < remainingLevels; i++) { + currentRoot = keccak256( + abi.encodePacked(currentRoot, currentZeroHashHeight) + ); + currentZeroHashHeight = keccak256( + abi.encodePacked(currentZeroHashHeight, currentZeroHashHeight) + ); + } + return currentRoot; + } /** * @notice Get the last verified batch @@ -1378,6 +1649,29 @@ abstract contract PolygonRollupManager is block.timestamp); } + /** + * @notice Function to calculate the reward to verify a single batch + */ + function calculateRewardPerBatch() public view returns (uint256) { + uint256 currentBalance = feeToken.balanceOf(address(this)); + + // Total Sequenced Batches = forcedBatches to be sequenced (total forced Batches - sequenced Batches) + sequencedBatches + // Total Batches to be verified = Total Sequenced Batches - verified Batches + uint256 totalBatchesToVerify = ((lastForceBatch - + lastForceBatchSequenced) + lastBatchSequenced) - + getLastVerifiedBatch(); + + if (totalBatchesToVerify == 0) return 0; + return currentBalance / totalBatchesToVerify; + } + + /** + * @notice Get forced batch fee + */ + function getForcedBatchFee() public view returns (uint256) { + return batchFee * 100; // TODO + } + /** * @notice Function to calculate the input snark bytes * @param initNumBatch Batch which the aggregator starts the verification diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index 71b2e9661..b7623d256 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -2,7 +2,7 @@ pragma solidity 0.8.20; -import "../lib/DepositContract.sol"; +import "./lib/DepositContractV2.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; import "../lib/TokenWrapped.sol"; import "../interfaces/IBasePolygonZkEVMGlobalExitRoot.sol"; @@ -17,7 +17,7 @@ import "../lib/GlobalExitRootLib.sol"; * Contract responsible to manage the token interactions with other networks */ contract PolygonZkEVMBridgeV2 is - DepositContract, + DepositContractV2, EmergencyManager, IPolygonZkEVMBridgeV2 { @@ -237,7 +237,7 @@ contract PolygonZkEVMBridgeV2 is uint32(depositCount) ); - _deposit( + _addLeaf( getLeafValue( _LEAF_TYPE_ASSET, originNetwork, @@ -285,7 +285,7 @@ contract PolygonZkEVMBridgeV2 is uint32(depositCount) ); - _deposit( + _addLeaf( getLeafValue( _LEAF_TYPE_MESSAGE, networkID, @@ -720,7 +720,7 @@ contract PolygonZkEVMBridgeV2 is */ function _updateGlobalExitRoot() internal { lastUpdatedDepositCount = uint32(depositCount); - globalExitRootManager.updateExitRoot(getDepositRoot()); + globalExitRootManager.updateExitRoot(getRoot()); } /** diff --git a/contracts/v2/PolygonZkEVMV2.sol b/contracts/v2/PolygonZkEVMV2.sol index eb028181a..c735f9e81 100644 --- a/contracts/v2/PolygonZkEVMV2.sol +++ b/contracts/v2/PolygonZkEVMV2.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.20; import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; import "../interfaces/IVerifierRollup.sol"; import "../interfaces/IPolygonZkEVMGlobalExitRoot.sol"; -import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "../interfaces/IPolygonZkEVMBridge.sol"; import "../lib/EmergencyManager.sol"; import "../interfaces/IPolygonZkEVMErrors.sol"; @@ -20,8 +20,7 @@ import "./PolygonRollupManager.sol"; * To enter and exit of the L2 network will be used a PolygonZkEVMBridge smart contract that will be deployed in both networks. */ contract PolygonZkEVMV2 is - OwnableUpgradeable, - EmergencyManager, + Initializable, IPolygonZkEVMErrors, IPolygonZkEVMV2Errors { @@ -143,13 +142,6 @@ contract PolygonZkEVMV2 is // PolygonZkEVM Bridge Address IPolygonZkEVMBridge public immutable bridgeAddress; - // Time target of the verification of a batch - // Adaptatly the batchFee will be updated to achieve this target - uint64 public verifyBatchTimeTarget; - - // Batch fee multiplier with 3 decimals that goes from 1000 - 1023 - uint16 public multiplierBatchFee; - // Trusted sequencer address address public trustedSequencer; @@ -162,10 +154,6 @@ contract PolygonZkEVMV2 is // keccak256(keccak256(bytes transactions), bytes32 globalExitRoot, unint64 minForcedTimestamp) mapping(uint64 => bytes32) public forcedBatches; - // Queue of batches that defines the virtual state - // SequenceBatchNum --> SequencedBatchData - mapping(uint64 => SequencedBatchData) public sequencedBatches; - // Last sequenced timestamp uint64 public lastTimestamp; @@ -224,27 +212,14 @@ contract PolygonZkEVMV2 is bool public isForcedBatchDisallowed; // Indicates the current version - uint256 public version; + uint256 public gapVersion; // Last batch verified before the last upgrade - uint256 public lastVerifiedBatchBeforeUpgrade; + uint256 public gapLastVerifiedBatchBeforeUpgrade; // Rollup manager PolygonRollupManager public rollupManager; - // TODO design: this could be immutble/ tgis could let be immutable in current polygonzkEMV but change the upgradabiltiy pattern for our current etnwork - // Rollup manager - uint64 public rollupID; - - // L2 chain identifier - uint64 public chainID; - - // L2 chain identifier - uint64 public forkID; - - // Fee token address - IERC20Upgradeable public feeToken; - /** * @dev Emitted when the trusted sequencer sends a new batch of transactions */ @@ -374,17 +349,20 @@ contract PolygonZkEVMV2 is /** * @param _globalExitRootManager Global exit root manager address + * @param _matic MATIC token address * @param _rollupVerifier Rollup verifier address * @param _bridgeAddress Bridge address * @param _rollupManager Global exit root manager address */ constructor( IPolygonZkEVMGlobalExitRoot _globalExitRootManager, + IERC20Upgradeable _matic, IVerifierRollup _rollupVerifier, IPolygonZkEVMBridge _bridgeAddress, PolygonRollupManager _rollupManager ) { globalExitRootManager = _globalExitRootManager; + matic = _matic; rollupVerifier = _rollupVerifier; bridgeAddress = _bridgeAddress; rollupManager = _rollupManager; @@ -393,8 +371,6 @@ contract PolygonZkEVMV2 is /** * @param _admin Admin address * @param _trustedSequencer Trusted sequencer address - * @param _rollupID Rollup ID - * @param _chainID Chain ID * @param _trustedSequencerURL Trusted sequencer URL * @param _networkName L2 network name * @param _version version @@ -402,34 +378,21 @@ contract PolygonZkEVMV2 is function initialize( address _admin, address _trustedSequencer, - uint64 _rollupID, - uint64 _chainID, - uint256 initialFee, string memory _trustedSequencerURL, string memory _networkName, string calldata _version ) external initializer { admin = _admin; trustedSequencer = _trustedSequencer; - feeToken = _feeToken; - rollupID = _rollupID; - chainID = _chainID; trustedSequencerURL = _trustedSequencerURL; networkName = _networkName; // Constant deployment variables - batchFee = initialFee; - verifyBatchTimeTarget = 30 minutes; - multiplierBatchFee = 1002; forceBatchTimeout = 5 days; isForcedBatchDisallowed = true; - // Initialize OZ contracts - __Ownable_init_unchained(); - - // emit version event - emit UpdateZkEVMVersion(0, forkID, _version); + // version events review } modifier onlyAdmin() { @@ -472,7 +435,7 @@ contract PolygonZkEVMV2 is function sequenceBatches( BatchData[] calldata batches, address l2Coinbase - ) external ifNotEmergencyState onlyTrustedSequencer { + ) external onlyTrustedSequencer { uint256 batchesNum = batches.length; if (batchesNum == 0) { revert SequenceZeroBatches(); @@ -602,12 +565,11 @@ contract PolygonZkEVMV2 is // Store new last force batch sequenced lastForceBatchSequenced = currentLastForceBatchSequenced; } - // Pay collateral for every non-forced batch submitted - feeToken.safeTransferFrom( + matic.safeTransferFrom( msg.sender, address(this), - batchFee * nonForcedBatchesSequenced + rollupManager.getBatchFee() * nonForcedBatchesSequenced ); // Update global exit root if there are new deposits TODO check in rollup manager @@ -623,112 +585,14 @@ contract PolygonZkEVMV2 is /** * @notice Reward batches, can only be called by the rollup manager - * @param beneficiary Addres htat will receive the fees - * @param batchesToReward Batches to reward + * @param lastVerifiedBatch Batches to reward */ - function verifyAndRewardBatches( - address beneficiary, - uint64 batchesToReward + function onVerifyBatches( + uint64 lastVerifiedBatch, + bytes32 stateRoot, + address aggregator ) public onlyRollupManager { - // Get feeToken reward - feeToken.safeTransfer( - beneficiary, - calculateRewardPerBatch() * (batchesToReward) - ); - } - - // TODO UPDATE FEES - /** - * @notice 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 - * @param newLastVerifiedBatch New last verified batch - */ - function _updateBatchFee(uint64 newLastVerifiedBatch) internal { - uint64 currentLastVerifiedBatch = getLastVerifiedBatch(); - uint64 currentBatch = newLastVerifiedBatch; - - uint256 totalBatchesAboveTarget; - uint256 newBatchesVerified = newLastVerifiedBatch - - currentLastVerifiedBatch; - - uint256 targetTimestamp = block.timestamp - verifyBatchTimeTarget; - - while (currentBatch != currentLastVerifiedBatch) { - // Load sequenced batchdata - SequencedBatchData - storage currentSequencedBatchData = sequencedBatches[ - currentBatch - ]; - - // Check if timestamp is below the verifyBatchTimeTarget - if ( - targetTimestamp < currentSequencedBatchData.sequencedTimestamp - ) { - // update currentBatch - currentBatch = currentSequencedBatchData - .previousLastBatchSequenced; - } else { - // The rest of batches will be above - totalBatchesAboveTarget = - currentBatch - - currentLastVerifiedBatch; - break; - } - } - - uint256 totalBatchesBelowTarget = newBatchesVerified - - totalBatchesAboveTarget; - - // _MAX_BATCH_FEE --> (< 70 bits) - // multiplierBatchFee --> (< 10 bits) - // _MAX_BATCH_MULTIPLIER = 12 - // multiplierBatchFee ** _MAX_BATCH_MULTIPLIER --> (< 128 bits) - // batchFee * (multiplierBatchFee ** _MAX_BATCH_MULTIPLIER)--> - // (< 70 bits) * (< 128 bits) = < 256 bits - - // Since all the following operations cannot overflow, we can optimize this operations with unchecked - unchecked { - if (totalBatchesBelowTarget < totalBatchesAboveTarget) { - // There are more batches above target, fee is multiplied - uint256 diffBatches = totalBatchesAboveTarget - - totalBatchesBelowTarget; - - diffBatches = diffBatches > _MAX_BATCH_MULTIPLIER - ? _MAX_BATCH_MULTIPLIER - : diffBatches; - - // For every multiplierBatchFee multiplication we must shift 3 zeroes since we have 3 decimals - batchFee = - (batchFee * (uint256(multiplierBatchFee) ** diffBatches)) / - (uint256(1000) ** diffBatches); - } else { - // There are more batches below target, fee is divided - uint256 diffBatches = totalBatchesBelowTarget - - totalBatchesAboveTarget; - - diffBatches = diffBatches > _MAX_BATCH_MULTIPLIER - ? _MAX_BATCH_MULTIPLIER - : diffBatches; - - // For every multiplierBatchFee multiplication we must shift 3 zeroes since we have 3 decimals - uint256 accDivisor = (uint256(1 ether) * - (uint256(multiplierBatchFee) ** diffBatches)) / - (uint256(1000) ** diffBatches); - - // multiplyFactor = multiplierBatchFee ** diffBatches / 10 ** (diffBatches * 3) - // accDivisor = 1E18 * multiplyFactor - // 1E18 * batchFee / accDivisor = batchFee / multiplyFactor - // < 60 bits * < 70 bits / ~60 bits --> overflow not possible - batchFee = (uint256(1 ether) * batchFee) / accDivisor; - } - } - - // Batch fee must remain inside a range - if (batchFee > _MAX_BATCH_FEE) { - batchFee = _MAX_BATCH_FEE; - } else if (batchFee < _MIN_BATCH_FEE) { - batchFee = _MIN_BATCH_FEE; - } + // emit event?!! } //////////////////////////// @@ -742,24 +606,24 @@ contract PolygonZkEVMV2 is * In order to assure that users force transactions will be processed properly, user must not sign any other transaction * with the same nonce * @param transactions L2 ethereum transactions EIP-155 or pre-EIP-155 with signature: - * @param feeTokenAmount Max amount of feeToken tokens that the sender is willing to pay + * @param maticAmount Max amount of matic tokens that the sender is willing to pay */ function forceBatch( bytes calldata transactions, - uint256 feeTokenAmount - ) public isForceBatchAllowed ifNotEmergencyState { - // Calculate feeToken collateral - uint256 feeTokenFee = getForcedBatchFee(); + uint256 maticAmount + ) public isForceBatchAllowed { + // Calculate matic collateral + uint256 maticFee = onlyRollupManager.getForcedBatchFee(); - if (feeTokenFee > feeTokenAmount) { - revert NotEnoughfeeTokenAmount(); + if (maticFee > maticAmount) { + revert NotEnoughMaticAmount(); } if (transactions.length > _MAX_FORCE_BATCH_BYTE_LENGTH) { revert TransactionsLengthAboveMax(); } - feeToken.safeTransferFrom(msg.sender, address(this), feeTokenFee); + matic.safeTransferFrom(msg.sender, address(this), maticFee); // Get globalExitRoot global exit root bytes32 lastGlobalExitRoot = globalExitRootManager @@ -797,7 +661,7 @@ contract PolygonZkEVMV2 is */ function sequenceForceBatches( ForcedBatchData[] calldata batches - ) external isForceBatchAllowed ifNotEmergencyState { + ) external isForceBatchAllowed { uint256 batchesNum = batches.length; if (batchesNum == 0) { @@ -887,6 +751,7 @@ contract PolygonZkEVMV2 is rollupManager.onSequenceBatches( currentBatchSequenced, + batchesNum, currentAccInputHash ); @@ -921,37 +786,6 @@ contract PolygonZkEVMV2 is emit SetTrustedSequencerURL(newTrustedSequencerURL); } - /** - * @notice Allow the admin to set a new multiplier batch fee - * @param newMultiplierBatchFee multiplier batch fee - */ - function setMultiplierBatchFee( - uint16 newMultiplierBatchFee - ) external onlyAdmin { - if (newMultiplierBatchFee < 1000 || newMultiplierBatchFee > 1023) { - revert InvalidRangeMultiplierBatchFee(); - } - - multiplierBatchFee = newMultiplierBatchFee; - emit SetMultiplierBatchFee(newMultiplierBatchFee); - } - - /** - * @notice 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 - * @param newVerifyBatchTimeTarget Verify batch time target - */ - function setVerifyBatchTimeTarget( - uint64 newVerifyBatchTimeTarget - ) external onlyAdmin { - if (newVerifyBatchTimeTarget > 1 days) { - revert InvalidRangeBatchTimeTarget(); - } - verifyBatchTimeTarget = newVerifyBatchTimeTarget; - emit SetVerifyBatchTimeTarget(newVerifyBatchTimeTarget); - } - /** * @notice Allow the admin to set the forcedBatchTimeout * The new value can only be lower, except if emergency state is active @@ -964,7 +798,7 @@ contract PolygonZkEVMV2 is revert InvalidRangeForceBatchTimeout(); } - if (!isEmergencyState) { + if (!rollupManager.isEmergencyState()) { if (newforceBatchTimeout >= forceBatchTimeout) { revert InvalidRangeForceBatchTimeout(); } @@ -1007,38 +841,4 @@ contract PolygonZkEVMV2 is admin = pendingAdmin; emit AcceptAdminRole(pendingAdmin); } - - //////////////////////// - // public/view functions - //////////////////////// - - /** - * @notice Get forced batch fee - */ - function getForcedBatchFee() public view returns (uint256) { - return batchFee * 100; // TODO - } - - /** - * @notice Function to calculate the reward to verify a single batch - */ - function calculateRewardPerBatch() public view returns (uint256) { - uint256 currentBalance = feeToken.balanceOf(address(this)); - - // Total Sequenced Batches = forcedBatches to be sequenced (total forced Batches - sequenced Batches) + sequencedBatches - // Total Batches to be verified = Total Sequenced Batches - verified Batches - uint256 totalBatchesToVerify = ((lastForceBatch - - lastForceBatchSequenced) + lastBatchSequenced) - - getLastVerifiedBatch(); - - if (totalBatchesToVerify == 0) return 0; - return currentBalance / totalBatchesToVerify; - } - - /** - * @notice Get the last verified batch - */ - function getLastVerifiedBatch() public view returns (uint64) { - return rollupManager.getLastVerifiedBatch(rollupID); - } } diff --git a/contracts/v2/lib/DepositContractLib.sol b/contracts/v2/lib/DepositContractLib.sol new file mode 100644 index 000000000..a26099419 --- /dev/null +++ b/contracts/v2/lib/DepositContractLib.sol @@ -0,0 +1,144 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.20; + +/** + * 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 + */ +contract DepositContractLib { + /** + * @dev Thrown when the merkle tree is full + */ + error MerkleTreeFull(); + + // Merkle tree levels + uint256 internal constant _DEPOSIT_CONTRACT_TREE_DEPTH = 32; + + // This ensures `depositCount` will fit into 32-bits + uint256 internal constant _MAX_DEPOSIT_COUNT = + 2 ** _DEPOSIT_CONTRACT_TREE_DEPTH - 1; + + // Branch array which contains the necessary sibilings to compute the next root when a new + // leaf is inserted + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] internal _branch; + + // Counter of current deposits + uint256 public depositCount; + + /** + * @dev This empty reserved space is put in place to allow future versions to add new + * variables without shifting down storage in the inheritance chain. + */ + uint256[10] private _gap; + + /** + * @notice Computes and returns the merkle root + */ + function getRoot() public view virtual returns (bytes32) { + bytes32 node; + uint256 size = depositCount; + bytes32 currentZeroHashHeight = 0; + + for ( + uint256 height = 0; + height < _DEPOSIT_CONTRACT_TREE_DEPTH; + height++ + ) { + if (((size >> height) & 1) == 1) + node = keccak256(abi.encodePacked(_branch[height], node)); + else + node = keccak256(abi.encodePacked(node, currentZeroHashHeight)); + + currentZeroHashHeight = keccak256( + abi.encodePacked(currentZeroHashHeight, currentZeroHashHeight) + ); + } + return node; + } + + /** + * @notice Add a new leaf to the merkle tree + * @param leaf Leaf + */ + function _addLeaf(bytes32 leaf) internal { + bytes32 node = leaf; + + // Avoid overflowing the Merkle tree (and prevent edge case in computing `_branch`) + if (depositCount >= _MAX_DEPOSIT_COUNT) { + revert MerkleTreeFull(); + } + + // Add deposit data root to Merkle tree (update a single `_branch` node) + uint256 size = ++depositCount; + for ( + uint256 height = 0; + height < _DEPOSIT_CONTRACT_TREE_DEPTH; + height++ + ) { + if (((size >> height) & 1) == 1) { + _branch[height] = node; + return; + } + node = keccak256(abi.encodePacked(_branch[height], node)); + } + // As the loop should always end prematurely with the `return` statement, + // this code should be unreachable. We assert `false` just to be safe. + assert(false); + } + + /** + * @notice Verify merkle proof + * @param leafHash Leaf hash + * @param smtProof Smt proof + * @param index Index of the leaf + * @param root Merkle root + */ + function verifyMerkleProof( + bytes32 leafHash, + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, + uint32 index, + bytes32 root + ) public pure returns (bool) { + bytes32 node = leafHash; + + // Check merkle proof + for ( + uint256 height = 0; + height < _DEPOSIT_CONTRACT_TREE_DEPTH; + height++ + ) { + if (((index >> height) & 1) == 1) + node = keccak256(abi.encodePacked(smtProof[height], node)); + else node = keccak256(abi.encodePacked(node, smtProof[height])); + } + + return node == root; + } + + /** + * @notice calcualte root from merkle proof + * @param leafHash Leaf hash + * @param smtProof Smt proof + * @param index Index of the leaf + */ + function calculateRoot( + bytes32 leafHash, + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, + uint32 index + ) public pure returns (bytes32) { + bytes32 node = leafHash; + + // Check merkle proof + for ( + uint256 height = 0; + height < _DEPOSIT_CONTRACT_TREE_DEPTH; + height++ + ) { + if (((index >> height) & 1) == 1) + node = keccak256(abi.encodePacked(smtProof[height], node)); + else node = keccak256(abi.encodePacked(node, smtProof[height])); + } + + return node; + } +} diff --git a/contracts/v2/lib/DepositContractV2.sol b/contracts/v2/lib/DepositContractV2.sol new file mode 100644 index 000000000..3abb418ef --- /dev/null +++ b/contracts/v2/lib/DepositContractV2.sol @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.20; + +import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; +import "./DepositContractLib.sol"; + +/** + * 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 + */ +contract DepositContractV2 is ReentrancyGuardUpgradeable, DepositContractLib { + /** + * @notice Given the leaf data returns the leaf value + * @param leafType Leaf type --> [0] transfer Ether / ERC20 tokens, [1] message + * @param originNetwork Origin Network + * @param originAddress [0] Origin token address, 0 address is reserved for ether, [1] msg.sender of the message + * @param destinationNetwork Destination network + * @param destinationAddress Destination address + * @param amount [0] Amount of tokens/ether, [1] Amount of ether + * @param metadataHash Hash of the metadata + */ + function getLeafValue( + uint8 leafType, + uint32 originNetwork, + address originAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes32 metadataHash + ) public pure returns (bytes32) { + return + keccak256( + abi.encodePacked( + leafType, + originNetwork, + originAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ) + ); + } +} diff --git a/contracts/v2/lib/PolygonAccessControlUpgradeable.sol b/contracts/v2/lib/PolygonAccessControlUpgradeable.sol new file mode 100644 index 000000000..932db0957 --- /dev/null +++ b/contracts/v2/lib/PolygonAccessControlUpgradeable.sol @@ -0,0 +1,242 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol) + +pragma solidity 0.8.20; + +import "@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; + +/** + * @dev Contrac 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 + */ +abstract contract PolygonAccessControlUpgradeable is + Initializable, + ContextUpgradeable, + IAccessControlUpgradeable +{ + function __AccessControl_init() internal onlyInitializing {} + + // Legacy variable + address internal _legacyOwner; + + struct RoleData { + mapping(address => bool) members; + bytes32 adminRole; + } + + mapping(bytes32 => RoleData) private _roles; + + bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; + + /** + * @dev Modifier that checks that an account has a specific role. Reverts + * with a standardized message including the required 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})$/ + * + * _Available since v4.1._ + */ + modifier onlyRole(bytes32 role) { + _checkRole(role); + _; + } + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole( + bytes32 role, + address account + ) public view virtual override returns (bool) { + return _roles[role].members[account]; + } + + /** + * @dev Revert with a standard message if `_msgSender()` 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._ + */ + function _checkRole(bytes32 role) internal view virtual { + _checkRole(role, _msgSender()); + } + + /** + * @dev 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})$/ + */ + function _checkRole(bytes32 role, address account) internal view virtual { + if (!hasRole(role, account)) { + revert( + string( + abi.encodePacked( + "AccessControl: account ", + StringsUpgradeable.toHexString(account), + " is missing role ", + StringsUpgradeable.toHexString(uint256(role), 32) + ) + ) + ); + } + } + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {_setRoleAdmin}. + */ + function getRoleAdmin( + bytes32 role + ) public view virtual override returns (bytes32) { + return _roles[role].adminRole; + } + + /** + * @dev 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. + */ + function grantRole( + bytes32 role, + address account + ) public virtual override onlyRole(getRoleAdmin(role)) { + _grantRole(role, account); + } + + /** + * @dev 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. + */ + function revokeRole( + bytes32 role, + address account + ) public virtual override onlyRole(getRoleAdmin(role)) { + _revokeRole(role, account); + } + + /** + * @dev 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. + */ + function renounceRole( + bytes32 role, + address account + ) public virtual override { + require( + account == _msgSender(), + "AccessControl: can only renounce roles for self" + ); + + _revokeRole(role, account); + } + + /** + * @dev 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}. + */ + function _setupRole(bytes32 role, address account) internal virtual { + _grantRole(role, account); + } + + /** + * @dev Sets `adminRole` as ``role``'s admin role. + * + * Emits a {RoleAdminChanged} event. + */ + function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { + bytes32 previousAdminRole = getRoleAdmin(role); + _roles[role].adminRole = adminRole; + emit RoleAdminChanged(role, previousAdminRole, adminRole); + } + + /** + * @dev Grants `role` to `account`. + * + * Internal function without access restriction. + * + * May emit a {RoleGranted} event. + */ + function _grantRole(bytes32 role, address account) internal virtual { + if (!hasRole(role, account)) { + _roles[role].members[account] = true; + emit RoleGranted(role, account, _msgSender()); + } + } + + /** + * @dev Revokes `role` from `account`. + * + * Internal function without access restriction. + * + * May emit a {RoleRevoked} event. + */ + function _revokeRole(bytes32 role, address account) internal virtual { + if (hasRole(role, account)) { + _roles[role].members[account] = false; + emit RoleRevoked(role, account, _msgSender()); + } + } + + /** + * @dev This empty reserved space is put in place to allow future versions to add new + * variables without shifting down storage in the inheritance chain. + * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps + */ + uint256[48] private __gap; +} From f04648375ec7cf4fc60db8d99204b48d4b3fdb8b Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 3 Oct 2023 13:49:20 +0200 Subject: [PATCH 022/230] it compiles again :D --- .../interfaces/IPolygonRollupManager.sol | 10 + contracts/v2/PolygonRollupManager.sol | 271 ++++++++++++------ contracts/v2/PolygonZkEVMV2.sol | 73 ++--- 3 files changed, 226 insertions(+), 128 deletions(-) diff --git a/contracts/interfaces/IPolygonRollupManager.sol b/contracts/interfaces/IPolygonRollupManager.sol index 680b42b30..59517e1cb 100644 --- a/contracts/interfaces/IPolygonRollupManager.sol +++ b/contracts/interfaces/IPolygonRollupManager.sol @@ -212,4 +212,14 @@ interface IPolygonRollupManager { * @dev Thrown when the caller is not the pending admin */ error ChainIDAlreadyExist(); + + /** + * @dev Thrown when the caller is not the pending admin + */ + error VerifiersMustHaveSameGenesis(); + + /** + * @dev Thrown when the caller is not the pending admin + */ + error MustSequenceSomeBatch(); } diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index ed93e6eeb..82744710c 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -13,6 +13,7 @@ import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import "./lib/PolygonAccessControlUpgradeable.sol"; +import "../interfaces/IVerifierRollup.sol"; // TODO CHECK STORAGE SLOTS!! @@ -24,6 +25,8 @@ abstract contract PolygonRollupManager is EmergencyManager, IPolygonRollupManager { + using SafeERC20Upgradeable for IERC20Upgradeable; + /** * @notice Struct which will be stored for every batch sequence * @param accInputHash Hash chain that contains all the information to process a batch: @@ -72,7 +75,7 @@ abstract contract PolygonRollupManager is */ struct RollupData { address rollupAddress; // TODO base rollup - IVeraifierRollup verifierAddress; + IVerifierRollup verifierAddress; uint64 chainID; mapping(uint64 => bytes32) batchNumToStateRoot; mapping(uint64 => SequencedBatchData) sequencedBatches; @@ -154,6 +157,12 @@ abstract contract PolygonRollupManager is bytes32 public constant TRUSTED_AGGREGATOR_ROLE = keccak256("TRUSTED_AGGREGATOR_ROLE"); + bytes32 public constant TWEAK_PARAMETERS_ROLE = + keccak256("TWEAK_PARAMETERS_ROLE"); + + // Will be able to set the current batch fee + bytes32 public constant SET_FEE_ROLE = keccak256("SET_FEE_ROLE"); + bytes32 public constant STOP_EMERGENCY_ROLE = keccak256("STOP_EMERGENCY_ROLE"); @@ -171,6 +180,9 @@ abstract contract PolygonRollupManager is // PolygonZkEVM Bridge Address IPolygonZkEVMBridge public immutable bridgeAddress; + // MATIC token address + IERC20Upgradeable public immutable matic; + // TODO could be optimized using the storage slot of the emergency mode // Time target of the verification of a batch @@ -292,6 +304,16 @@ abstract contract PolygonRollupManager is uint64 public totalVerifiedBatches; uint64 public lastAggregationTimestamp; + uint64 public verifyBatchTimeTarget; + + // Batch fee multiplier with 3 decimals that goes from 1000 - 1023 + uint16 public multiplierBatchFee; + + // Current matic fee per batch sequenced + uint256 public batchFee; + + address public trustedAggregator; + /** * @dev Emitted when a new consensus is added */ @@ -324,6 +346,7 @@ abstract contract PolygonRollupManager is * @dev Emitted when a new verifier is added */ event AddNewRollup( + uint64 rollupID, address rollupAddress, address consensusAddress, address verifierAddress, @@ -333,16 +356,17 @@ abstract contract PolygonRollupManager is /** * @dev Emitted when a new verifier is added */ - event UpdateRollup(address rollupAddress, address newConsensusAddress); + event UpdateRollup( + uint64 rollupID, + address newConsensusAddress, + address newVerifierAddress, + uint64 lastVerifiedBatchBeforeUpgrade + ); /** * @dev Emitted when a new verifier is added */ - event OnSequenceBatches( - uint64 newSequencedBatch, - bytes32 newAccInputHash, - uint64 rollupID - ); + event OnSequenceBatches(uint64 rollupID, uint64 lastBatchSequenced); /** * @dev Emitted when a aggregator verifies batches @@ -411,15 +435,27 @@ abstract contract PolygonRollupManager is */ event SetVerifyBatchTimeTarget(uint64 newVerifyBatchTimeTarget); + /** + * @dev Emitted when the admin updates the trusted aggregator address + */ + event SetTrustedAggregator(address newTrustedAggregator); + + /** + * @dev Emitted when the batch fee is set + */ + event SetBatchFee(uint256 newBatchFee); + /** * @param _globalExitRootManager Global exit root manager address * @param _bridgeAddress Bridge address */ constructor( IPolygonZkEVMGlobalExitRoot _globalExitRootManager, + IERC20Upgradeable _matic, IPolygonZkEVMBridge _bridgeAddress ) { globalExitRootManager = _globalExitRootManager; + matic = _matic; bridgeAddress = _bridgeAddress; } @@ -467,6 +503,11 @@ abstract contract PolygonRollupManager is _setupRole(DELETE_VERIFIER_CONSENSUS_ROLE, admin); _setupRole(CREATE_ROLLUP_ROLE, admin); _setupRole(STOP_EMERGENCY_ROLE, admin); + _setupRole(TRUSTED_AGGREGATOR_ROLE, admin); + _setupRole(TWEAK_PARAMETERS_ROLE, admin); + + // review Could be another address?¿ + _setupRole(SET_FEE_ROLE, admin); // Emergency council roles _setupRole(EMERGENCY_COUNCIL_ROLE, emergencyCouncil); @@ -590,6 +631,8 @@ abstract contract PolygonRollupManager is emit DeleteVerifier(verifierAddress); } + // * @param version version string of the new created rollup + /** * @notice Create a new rollup * @param consensusAddress consensus implementation address @@ -599,7 +642,6 @@ abstract contract PolygonRollupManager is * @param trustedSequencer trusted sequencer of the new created rollup * @param trustedSequencerURL trusted sequencer URL of the new created rollup * @param networkName network name of the new created rollup - * @param version version string of the new created rollup */ function createNewRollup( address consensusAddress, @@ -608,15 +650,18 @@ abstract contract PolygonRollupManager is address admin, address trustedSequencer, string memory trustedSequencerURL, - string memory networkName, - string calldata version - ) external onlyRole(CREATE_ROLLUP_ROLE) { + string memory networkName + ) + external + //string calldata version //¿ review + onlyRole(CREATE_ROLLUP_ROLE) + { // Check that consensus and verifier are already added if (consensusMap[consensusAddress].consensusID == 0) { revert ConsensusDoesNotExist(); } - VerifierData verifier = verifierMap[verifierAddress]; + VerifierData storage verifier = verifierMap[verifierAddress]; if (verifier.verifierID == 0) { revert VerifierDoesNotExist(); } @@ -635,15 +680,7 @@ abstract contract PolygonRollupManager is address(this), abi.encodeCall( PolygonZkEVMV2.initialize, - ( - admin, - trustedSequencer, - chainID, - trustedSequencerURL, - networkName, - version, - rollupID - ) // TODO Make lib about, like basePolygonRollup + (admin, trustedSequencer, trustedSequencerURL, networkName) // TODO Make lib about, like basePolygonRollup ) ) ); @@ -680,8 +717,7 @@ abstract contract PolygonRollupManager is address rollupAddress, address verifierAddress, uint64 chainID, - bytes32 genesis, - uint256 version + bytes32 genesis ) external onlyRole(ADD_EXISTING_ROLLUP_ROLE) { // Check chainID nullifier if (chainIDToRollupID[chainID] != 0) { @@ -720,7 +756,7 @@ abstract contract PolygonRollupManager is address newConsensusAddress, bytes calldata upgradeData ) external onlyRole(UPDATE_ROLLUP_ROLE) { - uint64 rollupID = rollupAddressToID[rollupAddress]; + uint64 rollupID = rollupAddressToID[address(rollupAddress)]; if (rollupID == 0) { revert RollupMustExist(); @@ -729,8 +765,10 @@ abstract contract PolygonRollupManager is RollupData storage rollup = rollupIDToRollupData[rollupID]; // If it's defined a new verifier address, update verifier - if (newVerifierAddress != address(0)) { - VerifierData newVerifier = verifierMap[address(newVerifierAddress)]; + if (address(newVerifierAddress) != address(0)) { + VerifierData storage newVerifier = verifierMap[ + address(newVerifierAddress) + ]; if (newVerifier.verifierID == 0) { revert VerifierDoesNotExist(); @@ -742,7 +780,7 @@ abstract contract PolygonRollupManager is if ( verifierMap[address(rollup.verifierAddress)].genesis != - newVerifier.verifier + newVerifier.genesis ) { revert VerifiersMustHaveSameGenesis(); } @@ -769,7 +807,7 @@ abstract contract PolygonRollupManager is emit UpdateRollup( rollupID, newConsensusAddress, - newVerifierAddress, + address(newVerifierAddress), rollup.lastVerifiedBatchBeforeUpgrade ); } @@ -780,14 +818,15 @@ abstract contract PolygonRollupManager is /** * @notice Sequence batches, callback called by one of the consensus managed by this contract - * @param newSequencedBatch new sequenced batch + * @param newSequencedBatches how many sequenced batches were sequenced + * @param forcedSequencedBatches how many forced batches were sequenced * @param newAccInputHash new accumualted input hash */ function onSequenceBatches( - uint64 newSequencedBatch, - uint64 sequencedForcedBatches, + uint64 newSequencedBatches, + uint64 forcedSequencedBatches, bytes32 newAccInputHash - ) external ifNotEmergencyState { + ) external ifNotEmergencyState returns (uint64) { // Check that the msg.sender is an added rollup uint64 rollupID = rollupAddressToID[msg.sender]; if (rollupID == 0) { @@ -796,39 +835,36 @@ abstract contract PolygonRollupManager is RollupData storage rollup = rollupIDToRollupData[rollupID]; - // Update the total sequenced and pending forced batches - uint64 previousLastBatchSequenced = rollup.lastBatchSequenced; - if (newSequencedBatch <= previousLastBatchSequenced) { - revert NewSequencedBatchMustBeBigger(); - } - unchecked { - uint64 sequencedBatches = newSequencedBatch - - previousLastBatchSequenced; + // Update total sequence parameters + if (newSequencedBatches == 0) { + revert MustSequenceSomeBatch(); } - totalSequencedBatches += sequencedBatches; - if (sequencedForcedBatches != 0) { - totalPendingForcedBatches -= sequencedForcedBatches; + totalSequencedBatches += newSequencedBatches; + + if (forcedSequencedBatches != 0) { + totalPendingForcedBatches -= forcedSequencedBatches; } // Update sequenced batches of the current rollup - rollup.sequencedBatches[newSequencedBatch] = SequencedBatchData({ + uint64 previousLastBatchSequenced = rollup.lastBatchSequenced; + uint64 newLastBatchSequenced = previousLastBatchSequenced + + newSequencedBatches; + + rollup.lastBatchSequenced = newLastBatchSequenced; + rollup.sequencedBatches[newLastBatchSequenced] = SequencedBatchData({ accInputHash: newAccInputHash, sequencedTimestamp: uint64(block.timestamp), previousLastBatchSequenced: previousLastBatchSequenced }); - rollup.lastBatchSequenced = newSequencedBatch; // Consolidate pending state if possible _tryConsolidatePendingState(rollup); - emit OnSequenceBatches(rollupID, newSequencedBatch); - } + emit OnSequenceBatches(rollupID, newLastBatchSequenced); - // Sequencer always have to pay in POL - // handles fees here! - // gas fees can be custom token - // seuqnecer is with POL + return newLastBatchSequenced; + } /** * @notice Allows an aggregator to verify multiple batches @@ -846,6 +882,7 @@ abstract contract PolygonRollupManager is uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, + address beneficiary, bytes32[24] calldata proof ) external ifNotEmergencyState { RollupData storage rollup = rollupIDToRollupData[rollupID]; @@ -871,9 +908,14 @@ abstract contract PolygonRollupManager is finalNewBatch, newLocalExitRoot, newStateRoot, + beneficiary, proof ); + // Update batch fees + // review, shoudl update awell in the ntrusted aggregation? + _updateBatchFee(rollup, finalNewBatch); + if (pendingStateTimeout == 0) { // Consolidate state rollup.lastVerifiedBatch = finalNewBatch; @@ -1039,10 +1081,23 @@ abstract contract PolygonRollupManager is revert InvalidProof(); } + // Pay MATIC rewards + uint64 newVerifiedBatches = finalNewBatch - currentLastVerifiedBatch; + + matic.safeTransfer( + beneficiary, + calculateRewardPerBatch() * newVerifiedBatches + ); + + // Update aggregation parameters + totalVerifiedBatches += newVerifiedBatches; + lastAggregationTimestamp = uint64(block.timestamp); + + // Callback to the rollup address PolygonZkEVMV2(rollup.rollupAddress).onVerifyBatches( finalNewBatch, newStateRoot, - aggregator + msg.sender ); } @@ -1338,16 +1393,16 @@ abstract contract PolygonRollupManager is } } - // TODO UPDATE FEES - - // /** * @notice 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 * @param newLastVerifiedBatch New last verified batch */ - function _updateBatchFee(uint64 newLastVerifiedBatch) internal { - uint64 currentLastVerifiedBatch = getLastVerifiedBatch(); + function _updateBatchFee( + RollupData storage rollup, + uint64 newLastVerifiedBatch + ) internal { + uint64 currentLastVerifiedBatch = _getLastVerifiedBatch(rollup); uint64 currentBatch = newLastVerifiedBatch; uint256 totalBatchesAboveTarget; @@ -1358,10 +1413,8 @@ abstract contract PolygonRollupManager is while (currentBatch != currentLastVerifiedBatch) { // Load sequenced batchdata - SequencedBatchData - storage currentSequencedBatchData = sequencedBatches[ - currentBatch - ]; + SequencedBatchData storage currentSequencedBatchData = rollup + .sequencedBatches[currentBatch]; // Check if timestamp is below the verifyBatchTimeTarget if ( @@ -1457,7 +1510,7 @@ abstract contract PolygonRollupManager is /** * @notice Function to deactivate emergency state on both PolygonZkEVM and PolygonZkEVMBridge contracts */ - function deactivateEmergencyState() external onlyGovernance { + function deactivateEmergencyState() external onlyRole(STOP_EMERGENCY_ROLE) { // Deactivate emergency state on PolygonZkEVMBridge bridgeAddress.deactivateEmergencyState(); @@ -1480,6 +1533,18 @@ abstract contract PolygonRollupManager is // admin functions ////////////////// + /** + * @notice Allow the admin to set a new trusted aggregator address + * @param newTrustedAggregator Address of the new trusted aggregator + */ + function setTrustedAggregator( + address newTrustedAggregator + ) external onlyRole(TWEAK_PARAMETERS_ROLE) { + trustedAggregator = newTrustedAggregator; + + emit SetTrustedAggregator(newTrustedAggregator); + } + /** * @notice Allow the admin to set a new pending state timeout * The timeout can only be lowered, except if emergency state is active @@ -1487,11 +1552,7 @@ abstract contract PolygonRollupManager is */ function setTrustedAggregatorTimeout( uint64 newTrustedAggregatorTimeout - ) external onlyGovernance { - if (newTrustedAggregatorTimeout > _HALT_AGGREGATION_TIMEOUT) { - revert TrustedAggregatorTimeoutExceedHaltAggregationTimeout(); - } - + ) external onlyRole(TWEAK_PARAMETERS_ROLE) { if (!isEmergencyState) { if (newTrustedAggregatorTimeout >= trustedAggregatorTimeout) { revert NewTrustedAggregatorTimeoutMustBeLower(); @@ -1509,11 +1570,7 @@ abstract contract PolygonRollupManager is */ function setPendingStateTimeout( uint64 newPendingStateTimeout - ) external onlyGovernance { - if (newPendingStateTimeout > _HALT_AGGREGATION_TIMEOUT) { - revert PendingStateTimeoutExceedHaltAggregationTimeout(); - } - + ) external onlyRole(TWEAK_PARAMETERS_ROLE) { if (!isEmergencyState) { if (newPendingStateTimeout >= pendingStateTimeout) { revert NewPendingStateTimeoutMustBeLower(); @@ -1524,15 +1581,55 @@ abstract contract PolygonRollupManager is emit SetPendingStateTimeout(newPendingStateTimeout); } + /** + * @notice Allow the admin to set a new multiplier batch fee + * @param newMultiplierBatchFee multiplier batch fee + */ + function setMultiplierBatchFee( + uint16 newMultiplierBatchFee + ) external onlyRole(TWEAK_PARAMETERS_ROLE) { + if (newMultiplierBatchFee < 1000 || newMultiplierBatchFee > 1023) { + revert InvalidRangeMultiplierBatchFee(); + } + + multiplierBatchFee = newMultiplierBatchFee; + emit SetMultiplierBatchFee(newMultiplierBatchFee); + } + + /** + * @notice 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 + * @param newVerifyBatchTimeTarget Verify batch time target + */ + function setVerifyBatchTimeTarget( + uint64 newVerifyBatchTimeTarget + ) external onlyRole(TWEAK_PARAMETERS_ROLE) { + if (newVerifyBatchTimeTarget > 1 days) { + revert InvalidRangeBatchTimeTarget(); + } + verifyBatchTimeTarget = newVerifyBatchTimeTarget; + emit SetVerifyBatchTimeTarget(newVerifyBatchTimeTarget); + } + + /** + * @notice Allow to corresponding role to set the current batch fee + * @param newBatchFee new batch fee + */ + function setBatchFee(uint256 newBatchFee) external onlyRole(SET_FEE_ROLE) { + batchFee = newBatchFee; + emit SetBatchFee(newBatchFee); + } + //////////////////////// // view/pure functions - //////////////////////// - - // Since it's expected to have no more than 4-5 levels, this approach is good enough - // In a future this computation will be done inside the circuit /** - * @notice get the current rollup exit root + * @notice 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 */ function getRollupExitRoot() public view returns (bytes32) { uint256 currentNodes = rollupCount; @@ -1653,23 +1750,29 @@ abstract contract PolygonRollupManager is * @notice Function to calculate the reward to verify a single batch */ function calculateRewardPerBatch() public view returns (uint256) { - uint256 currentBalance = feeToken.balanceOf(address(this)); + uint256 currentBalance = matic.balanceOf(address(this)); - // Total Sequenced Batches = forcedBatches to be sequenced (total forced Batches - sequenced Batches) + sequencedBatches - // Total Batches to be verified = Total Sequenced Batches - verified Batches - uint256 totalBatchesToVerify = ((lastForceBatch - - lastForceBatchSequenced) + lastBatchSequenced) - - getLastVerifiedBatch(); + // Total Sequenced Batches = total forcedBatches to be sequenced + total Sequenced Batches + // Total Batches to be verified = total Sequenced Batches - total verified Batches + uint256 totalBatchesToVerify = (totalPendingForcedBatches + + totalSequencedBatches) - totalVerifiedBatches; if (totalBatchesToVerify == 0) return 0; return currentBalance / totalBatchesToVerify; } + /** + * @notice Get batch fee + */ + function getBatchFee() public view returns (uint256) { + return batchFee; // review + } + /** * @notice Get forced batch fee */ function getForcedBatchFee() public view returns (uint256) { - return batchFee * 100; // TODO + return batchFee * 100; // review, should be a parameter? } /** diff --git a/contracts/v2/PolygonZkEVMV2.sol b/contracts/v2/PolygonZkEVMV2.sol index c735f9e81..3d6f31fbe 100644 --- a/contracts/v2/PolygonZkEVMV2.sol +++ b/contracts/v2/PolygonZkEVMV2.sol @@ -220,6 +220,8 @@ contract PolygonZkEVMV2 is // Rollup manager PolygonRollupManager public rollupManager; + bytes32 public accInputHash; + /** * @dev Emitted when the trusted sequencer sends a new batch of transactions */ @@ -373,14 +375,12 @@ contract PolygonZkEVMV2 is * @param _trustedSequencer Trusted sequencer address * @param _trustedSequencerURL Trusted sequencer URL * @param _networkName L2 network name - * @param _version version */ function initialize( address _admin, address _trustedSequencer, string memory _trustedSequencerURL, - string memory _networkName, - string calldata _version + string memory _networkName ) external initializer { admin = _admin; trustedSequencer = _trustedSequencer; @@ -427,6 +427,8 @@ contract PolygonZkEVMV2 is // Sequence/Verify batches functions //////////////////////////////////// + // TODO add the hashed forced data aswell?¿ + /** * @notice Allows a sequencer to send multiple batches * @param batches Struct array which holds the necessary data to append new batches to the sequence @@ -447,10 +449,8 @@ contract PolygonZkEVMV2 is // Store storage variables in memory, to save gas, because will be overrided multiple times uint64 currentTimestamp = lastTimestamp; - uint64 currentBatchSequenced = lastBatchSequenced; uint64 currentLastForceBatchSequenced = lastForceBatchSequenced; - bytes32 currentAccInputHash = sequencedBatches[currentBatchSequenced] - .accInputHash; + bytes32 currentAccInputHash = accInputHash; // Store in a temporal variable, for avoid access again the storage slot uint64 initLastForceBatchSequenced = currentLastForceBatchSequenced; @@ -484,13 +484,13 @@ contract PolygonZkEVMV2 is revert ForcedDataDoesNotMatch(); } - // Delete forceBatch data since won't be used anymore - delete forcedBatches[currentLastForceBatchSequenced]; - // Check timestamp is bigger than min timestamp if (currentBatch.timestamp < currentBatch.minForcedTimestamp) { revert SequencedTimestampBelowForcedTimestamp(); } + + // Delete forceBatch data since won't be used anymore + delete forcedBatches[currentLastForceBatchSequenced]; } else { // Check global exit root exists with proper batch length. These checks are already done in the forceBatches call // Note that the sequencer can skip setting a global exit root putting zeros @@ -534,24 +534,15 @@ contract PolygonZkEVMV2 is // Update timestamp currentTimestamp = currentBatch.timestamp; } - // Update currentBatchSequenced - currentBatchSequenced += uint64(batchesNum); // Sanity check, should be unreachable if (currentLastForceBatchSequenced > lastForceBatch) { revert ForceBatchesOverflow(); } - // Update sequencedBatches mapping - sequencedBatches[currentBatchSequenced] = SequencedBatchData({ - accInputHash: currentAccInputHash, - sequencedTimestamp: uint64(block.timestamp), - previousLastBatchSequenced: lastBatchSequenced - }); - // Store back the storage variables lastTimestamp = currentTimestamp; - lastBatchSequenced = currentBatchSequenced; + accInputHash = currentAccInputHash; uint256 nonForcedBatchesSequenced = batchesNum; @@ -565,18 +556,20 @@ contract PolygonZkEVMV2 is // Store new last force batch sequenced lastForceBatchSequenced = currentLastForceBatchSequenced; } + // Pay collateral for every non-forced batch submitted matic.safeTransferFrom( msg.sender, - address(this), + address(rollupManager), rollupManager.getBatchFee() * nonForcedBatchesSequenced ); - // Update global exit root if there are new deposits TODO check in rollup manager + // Update global exit root if there are new deposits bridgeAddress.updateGlobalExitRoot(); - rollupManager.onSequenceBatches( - currentBatchSequenced, + uint64 currentBatchSequenced = rollupManager.onSequenceBatches( + uint64(batchesNum), + uint64(batchesNum - nonForcedBatchesSequenced), currentAccInputHash ); @@ -584,15 +577,17 @@ contract PolygonZkEVMV2 is } /** - * @notice Reward batches, can only be called by the rollup manager - * @param lastVerifiedBatch Batches to reward + * @notice Callback on verify batches, can only be called by the rollup manager + * @param lastVerifiedBatch Last verified batch + * @param newStateRoot new state root + * @param aggregator Aggregator address */ function onVerifyBatches( uint64 lastVerifiedBatch, - bytes32 stateRoot, + bytes32 newStateRoot, address aggregator ) public onlyRollupManager { - // emit event?!! + emit VerifyBatches(lastVerifiedBatch, newStateRoot, aggregator); } //////////////////////////// @@ -613,7 +608,7 @@ contract PolygonZkEVMV2 is uint256 maticAmount ) public isForceBatchAllowed { // Calculate matic collateral - uint256 maticFee = onlyRollupManager.getForcedBatchFee(); + uint256 maticFee = rollupManager.getForcedBatchFee(); if (maticFee > maticAmount) { revert NotEnoughMaticAmount(); @@ -680,10 +675,8 @@ contract PolygonZkEVMV2 is } // Store storage variables in memory, to save gas, because will be overrided multiple times - uint64 currentBatchSequenced = lastBatchSequenced; uint64 currentLastForceBatchSequenced = lastForceBatchSequenced; - bytes32 currentAccInputHash = sequencedBatches[currentBatchSequenced] - .accInputHash; + bytes32 currentAccInputHash = accInputHash; // Sequence force batches for (uint256 i = 0; i < batchesNum; i++) { @@ -735,23 +728,15 @@ contract PolygonZkEVMV2 is ) ); } - // Update currentBatchSequenced - currentBatchSequenced += uint64(batchesNum); - - lastTimestamp = uint64(block.timestamp); // Store back the storage variables - sequencedBatches[currentBatchSequenced] = SequencedBatchData({ - accInputHash: currentAccInputHash, - sequencedTimestamp: uint64(block.timestamp), - previousLastBatchSequenced: lastBatchSequenced - }); - lastBatchSequenced = currentBatchSequenced; + accInputHash = currentAccInputHash; + lastTimestamp = uint64(block.timestamp); lastForceBatchSequenced = currentLastForceBatchSequenced; - rollupManager.onSequenceBatches( - currentBatchSequenced, - batchesNum, + uint64 currentBatchSequenced = rollupManager.onSequenceBatches( + uint64(batchesNum), + uint64(batchesNum), currentAccInputHash ); From 74bdb2f67991263aaaa6e1d44178f88e677e78d1 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 4 Oct 2023 15:25:01 +0200 Subject: [PATCH 023/230] add validiuM --- .../v2/L2/PolygonZkEVMGasTokenBridge.sol | 2 +- contracts/v2/PolygonRollupManager.sol | 31 ++- contracts/v2/PolygonZkEVMBridgeV2.sol | 2 +- contracts/v2/consensus/PolygonZkEVMV2.sol | 34 +++ .../consensus/validium/CDKDataCommittee.sol | 161 ++++++++++++ .../validium/PolygonDataComittee.sol | 245 ++++++++++++++++++ contracts/v2/interfaces/ICDKDataCommittee.sol | 7 + .../v2/interfaces/ICDKDataCommitteeErrors.sol | 40 +++ .../v2/interfaces/IPolygonDataComittee.sol | 10 + .../v2/interfaces/IPolygonRollupBase.sol | 18 ++ .../interfaces/IPolygonRollupManager.sol | 0 .../interfaces/IPolygonZkEVMBridgeV2.sol | 0 .../IPolygonZkEVMGasTokenBridge.sol | 0 .../interfaces/IPolygonZkEVMV2Errors.sol | 0 .../PolygonRollupBase.sol} | 235 ++++------------- 15 files changed, 584 insertions(+), 201 deletions(-) create mode 100644 contracts/v2/consensus/PolygonZkEVMV2.sol create mode 100644 contracts/v2/consensus/validium/CDKDataCommittee.sol create mode 100644 contracts/v2/consensus/validium/PolygonDataComittee.sol create mode 100644 contracts/v2/interfaces/ICDKDataCommittee.sol create mode 100644 contracts/v2/interfaces/ICDKDataCommitteeErrors.sol create mode 100644 contracts/v2/interfaces/IPolygonDataComittee.sol create mode 100644 contracts/v2/interfaces/IPolygonRollupBase.sol rename contracts/{ => v2}/interfaces/IPolygonRollupManager.sol (100%) rename contracts/{ => v2}/interfaces/IPolygonZkEVMBridgeV2.sol (100%) rename contracts/{ => v2}/interfaces/IPolygonZkEVMGasTokenBridge.sol (100%) rename contracts/{ => v2}/interfaces/IPolygonZkEVMV2Errors.sol (100%) rename contracts/v2/{PolygonZkEVMV2.sol => lib/PolygonRollupBase.sol} (80%) diff --git a/contracts/v2/L2/PolygonZkEVMGasTokenBridge.sol b/contracts/v2/L2/PolygonZkEVMGasTokenBridge.sol index 3b635d79d..4bac058fd 100644 --- a/contracts/v2/L2/PolygonZkEVMGasTokenBridge.sol +++ b/contracts/v2/L2/PolygonZkEVMGasTokenBridge.sol @@ -7,7 +7,7 @@ import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeab import "../../lib/TokenWrapped.sol"; import "../../interfaces/IBasePolygonZkEVMGlobalExitRoot.sol"; import "../../interfaces/IBridgeMessageReceiver.sol"; -import "../../interfaces/IPolygonZkEVMGasTokenBridge.sol"; +import "../interfaces/IPolygonZkEVMGasTokenBridge.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol"; import "../../lib/GlobalExitRootLib.sol"; diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index 82744710c..507bcef38 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -2,11 +2,11 @@ pragma solidity 0.8.20; -import "../interfaces/IPolygonRollupManager.sol"; +import "./interfaces/IPolygonRollupManager.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "../interfaces/IPolygonZkEVMGlobalExitRoot.sol"; import "../interfaces/IPolygonZkEVMBridge.sol"; -import "./PolygonZkEVMV2.sol"; +import "./interfaces/IPolygonRollupBase.sol"; import "../lib/EmergencyManager.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; @@ -15,7 +15,8 @@ import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.so import "./lib/PolygonAccessControlUpgradeable.sol"; import "../interfaces/IVerifierRollup.sol"; -// TODO CHECK STORAGE SLOTS!! +// TODO change name to network +// zkevm type uint8 /** * Contract responsible for managing the exit roots across multiple Rollups @@ -183,7 +184,9 @@ abstract contract PolygonRollupManager is // MATIC token address IERC20Upgradeable public immutable matic; - // TODO could be optimized using the storage slot of the emergency mode + // since this contract will be an update of the PolygonZkEVM there are legacy variables + // This ones would not be used generally,just for reserve the same storage slots, since + // this contract will be // Time target of the verification of a batch // Adaptatly the batchFee will be updated to achieve this target @@ -447,6 +450,7 @@ abstract contract PolygonRollupManager is /** * @param _globalExitRootManager Global exit root manager address + * @param _matic MATIC token address * @param _bridgeAddress Bridge address */ constructor( @@ -513,7 +517,11 @@ abstract contract PolygonRollupManager is _setupRole(EMERGENCY_COUNCIL_ROLE, emergencyCouncil); _setupRole(EMERGENCY_COUNCIL_ADMIN, emergencyCouncil); - // deploy zkEVM + // deploy zkEVM probably wont work bc initialize D: + + // TODO consisnten qiwht the bridge, networkCount == networkID, zkEVm MUst be the 1 + + // emit version review } //////////////////////////////////////////////// @@ -651,11 +659,7 @@ abstract contract PolygonRollupManager is address trustedSequencer, string memory trustedSequencerURL, string memory networkName - ) - external - //string calldata version //¿ review - onlyRole(CREATE_ROLLUP_ROLE) - { + ) external onlyRole(CREATE_ROLLUP_ROLE) { // Check that consensus and verifier are already added if (consensusMap[consensusAddress].consensusID == 0) { revert ConsensusDoesNotExist(); @@ -679,7 +683,7 @@ abstract contract PolygonRollupManager is consensusAddress, address(this), abi.encodeCall( - PolygonZkEVMV2.initialize, + IPolygonRollupBase.initialize, (admin, trustedSequencer, trustedSequencerURL, networkName) // TODO Make lib about, like basePolygonRollup ) ) @@ -1094,7 +1098,7 @@ abstract contract PolygonRollupManager is lastAggregationTimestamp = uint64(block.timestamp); // Callback to the rollup address - PolygonZkEVMV2(rollup.rollupAddress).onVerifyBatches( + IPolygonRollupBase(rollup.rollupAddress).onVerifyBatches( finalNewBatch, newStateRoot, msg.sender @@ -1533,6 +1537,8 @@ abstract contract PolygonRollupManager is // admin functions ////////////////// + // review Role + /** * @notice Allow the admin to set a new trusted aggregator address * @param newTrustedAggregator Address of the new trusted aggregator @@ -1623,6 +1629,7 @@ abstract contract PolygonRollupManager is //////////////////////// // view/pure functions + /////////////////////// /** * @notice Get the current rollup exit root diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index b7623d256..ad763dfb0 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -7,7 +7,7 @@ import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeab import "../lib/TokenWrapped.sol"; import "../interfaces/IBasePolygonZkEVMGlobalExitRoot.sol"; import "../interfaces/IBridgeMessageReceiver.sol"; -import "../interfaces/IPolygonZkEVMBridgeV2.sol"; +import "./interfaces/IPolygonZkEVMBridgeV2.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol"; import "../lib/EmergencyManager.sol"; import "../lib/GlobalExitRootLib.sol"; diff --git a/contracts/v2/consensus/PolygonZkEVMV2.sol b/contracts/v2/consensus/PolygonZkEVMV2.sol new file mode 100644 index 000000000..3d9d9de6d --- /dev/null +++ b/contracts/v2/consensus/PolygonZkEVMV2.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity ^0.8.20; + +import "../lib/PolygonRollupBase.sol"; + +/** + * 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. + */ +contract PolygonZkEVMV2 is PolygonRollupBase { + /** + * @param _globalExitRootManager Global exit root manager address + * @param _matic MATIC token address + * @param _bridgeAddress Bridge address + * @param _rollupManager Global exit root manager address + */ + constructor( + IPolygonZkEVMGlobalExitRoot _globalExitRootManager, + IERC20Upgradeable _matic, + IPolygonZkEVMBridge _bridgeAddress, + PolygonRollupManager _rollupManager + ) + PolygonRollupBase( + _globalExitRootManager, + _matic, + _bridgeAddress, + _rollupManager + ) + {} +} diff --git a/contracts/v2/consensus/validium/CDKDataCommittee.sol b/contracts/v2/consensus/validium/CDKDataCommittee.sol new file mode 100644 index 000000000..57eb9f6f4 --- /dev/null +++ b/contracts/v2/consensus/validium/CDKDataCommittee.sol @@ -0,0 +1,161 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.20; + +import "../../interfaces/ICDKDataCommitteeErrors.sol"; +import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; + +contract CDKDataCommittee is ICDKDataCommitteeErrors, OwnableUpgradeable { + /** + * @notice Struct which will store all the data of the committee members + * @param url string that represents the URL of the member to be used to access the data + * @param addr address of the member that will be used to sign + */ + struct Member { + string url; + address addr; + } + + // Size of a signature in bytes + uint256 internal constant _SIGNATURE_SIZE = 65; + + // Size of an address in bytes + uint256 internal constant _ADDR_SIZE = 20; + + // Specifies the required amount of signatures from members in the data availability committee + uint256 public requiredAmountOfSignatures; + + // Hash of the addresses of the committee + bytes32 public committeeHash; + + // Register of the members of the committee + Member[] public members; + + /** + * @dev Emitted when the committee is updated + * @param committeeHash hash of the addresses of the committee members + */ + event CommitteeUpdated(bytes32 committeeHash); + + function initialize() external initializer { + // Initialize OZ contracts + __Ownable_init_unchained(); + } + + /** + * @notice 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] + * @param _requiredAmountOfSignatures Required amount of signatures + * @param urls List of urls of the members of the committee + * @param addrsBytes Byte array that contains the addressess of the members of the committee + */ + function setupCommittee( + uint256 _requiredAmountOfSignatures, + string[] calldata urls, + bytes calldata addrsBytes + ) external onlyOwner { + uint256 membersLength = urls.length; + if (membersLength < _requiredAmountOfSignatures) { + revert TooManyRequiredSignatures(); + } + if (addrsBytes.length != membersLength * _ADDR_SIZE) { + revert UnexpectedAddrsBytesLength(); + } + + // delete previous member array + delete members; + + address lastAddr; + for (uint256 i = 0; i < membersLength; i++) { + uint256 currentAddresStartingByte = i * _ADDR_SIZE; + address currentMemberAddr = address( + bytes20( + addrsBytes[currentAddresStartingByte:currentAddresStartingByte + + _ADDR_SIZE] + ) + ); + + // Check url is not empty + if (bytes(urls[i]).length == 0) { + revert EmptyURLNotAllowed(); + } + + // Addresses must be setup in incremental order, in order to easily check duplicated address + if (lastAddr >= currentMemberAddr) { + revert WrongAddrOrder(); + } + members.push(Member({url: urls[i], addr: currentMemberAddr})); + + lastAddr = currentMemberAddr; + } + + committeeHash = keccak256(addrsBytes); + requiredAmountOfSignatures = _requiredAmountOfSignatures; + emit CommitteeUpdated(committeeHash); + } + + function getAmountOfMembers() public view returns (uint256) { + return members.length; + } + + /** + * @notice Verifies that the given signedHash has been signed by requiredAmountOfSignatures committee members + * @param signedHash Hash that must have been signed by requiredAmountOfSignatures of committee members + * @param signaturesAndAddrs 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 + */ + function verifySignatures( + bytes32 signedHash, + bytes calldata signaturesAndAddrs + ) external view { + // pre-check: byte array size + uint256 splitByte = _SIGNATURE_SIZE * requiredAmountOfSignatures; + if ( + signaturesAndAddrs.length < splitByte || + (signaturesAndAddrs.length - splitByte) % _ADDR_SIZE != 0 + ) { + revert UnexpectedAddrsAndSignaturesSize(); + } + + // hash the addresses part of the byte array and check that it's equal to committe hash + if (keccak256(signaturesAndAddrs[splitByte:]) != committeeHash) { + revert UnexpectedCommitteeHash(); + } + + // recover addresses from signatures and check that are part of the committee + uint256 lastAddrIndexUsed; + uint256 addrsLen = (signaturesAndAddrs.length - splitByte) / _ADDR_SIZE; + for (uint256 i = 0; i < requiredAmountOfSignatures; i++) { + uint256 currentSignatureStartingByte = i * _SIGNATURE_SIZE; + + address currentSigner = ECDSA.recover( + signedHash, + signaturesAndAddrs[currentSignatureStartingByte:currentSignatureStartingByte + + _SIGNATURE_SIZE] + ); + + // Search inside the address array, the signer + bool currentSignerIsPartOfCommittee = false; + for (uint256 j = lastAddrIndexUsed; j < addrsLen; j++) { + uint256 currentAddresStartingByte = splitByte + j * _ADDR_SIZE; + address committeeAddr = address( + bytes20( + signaturesAndAddrs[currentAddresStartingByte:currentAddresStartingByte + + _ADDR_SIZE] + ) + ); + if (committeeAddr == currentSigner) { + lastAddrIndexUsed = j + 1; + currentSignerIsPartOfCommittee = true; + break; + } + } + if (!currentSignerIsPartOfCommittee) { + revert CommitteeAddressDoesntExist(); + } + } + } +} diff --git a/contracts/v2/consensus/validium/PolygonDataComittee.sol b/contracts/v2/consensus/validium/PolygonDataComittee.sol new file mode 100644 index 000000000..30e436c29 --- /dev/null +++ b/contracts/v2/consensus/validium/PolygonDataComittee.sol @@ -0,0 +1,245 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity ^0.8.20; + +import "../../lib/PolygonRollupBase.sol"; +import "../../interfaces/ICDKDataCommittee.sol"; +import "../../interfaces/IPolygonDataComittee.sol"; + +/** + * 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. + */ +contract PolygonDataComittee is PolygonRollupBase, IPolygonDataComittee { + using SafeERC20Upgradeable for IERC20Upgradeable; + + /** + * @notice Struct which will be used to call sequenceBatches + * @param transactionsHash keccak256 hash of the L2 ethereum transactions EIP-155 or pre-EIP-155 with signature: + * EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data, chainid, 0, 0,) || v || r || s + * pre-EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data) || v || r || s + * @param globalExitRoot Global exit root of the batch + * @param timestamp Sequenced timestamp of the batch + * @param minForcedTimestamp Minimum timestamp of the force batch data, empty when non forced batch + */ + struct ValidiumBatchData { + bytes32 transactionsHash; + bytes32 globalExitRoot; + uint64 timestamp; + uint64 minForcedTimestamp; + } + + // CDK Data Committee Address + ICDKDataCommittee public immutable dataCommittee; + + // Indicates if sequence with data avialabiility is allowed + // This allow the sequencer to post the data and skip the Data comittee + bool public isSequenceWithDataAvailabilityAllowed; + + /** + * @dev Emitted when switch the ability to sequence with data availability + */ + event SwitchSequenceWithDataAvailability(); + + /** + * @param _globalExitRootManager Global exit root manager address + * @param _matic MATIC token address + * @param _bridgeAddress Bridge address + * @param _rollupManager Global exit root manager address + */ + constructor( + IPolygonZkEVMGlobalExitRoot _globalExitRootManager, + IERC20Upgradeable _matic, + IPolygonZkEVMBridge _bridgeAddress, + PolygonRollupManager _rollupManager, + ICDKDataCommittee _dataCommittee + ) + PolygonRollupBase( + _globalExitRootManager, + _matic, + _bridgeAddress, + _rollupManager + ) + { + dataCommittee = _dataCommittee; + } + + ///////////////////////////////////// + // Sequence/Verify batches functions + //////////////////////////////////// + + // function sequenceBatches( + // BatchData[] calldata batches, + // address l2Coinbase + // ) external override { + // if (!isSequenceWithDataAvailabilityAllowed) { + // revert SequenceWithDataAvailabilityNotAllowed(); + // } else { + // super.sequenceBatches(batches, l2Coinbase); + // } + // } + + /** + * @notice Allows a sequencer to send multiple batches + * @param batches Struct array which holds the necessary data to append new batches to the sequence + * @param l2Coinbase Address that will receive the fees from L2 + * @param dataAvailabilityMessage 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 + */ + function sequenceBatchesDataCommittee( + ValidiumBatchData[] calldata batches, + address l2Coinbase, + bytes calldata dataAvailabilityMessage + ) external onlyTrustedSequencer { + uint256 batchesNum = batches.length; + if (batchesNum == 0) { + revert SequenceZeroBatches(); + } + + if (batchesNum > _MAX_VERIFY_BATCHES) { + revert ExceedMaxVerifyBatches(); + } + + // Store storage variables in memory, to save gas, because will be overrided multiple times + uint64 currentTimestamp = lastTimestamp; + uint64 currentLastForceBatchSequenced = lastForceBatchSequenced; + bytes32 currentAccInputHash = lastAccInputHash; + + // Store in a temporal variable, for avoid access again the storage slot + uint64 initLastForceBatchSequenced = currentLastForceBatchSequenced; + + for (uint256 i = 0; i < batchesNum; i++) { + // Load current sequence + ValidiumBatchData memory currentBatch = batches[i]; + + // Store the current transactions hash since can be used more than once for gas saving + bytes32 currentTransactionsHash = currentBatch.transactionsHash; + + // Check if it's a forced batch + if (currentBatch.minForcedTimestamp > 0) { + currentLastForceBatchSequenced++; + + // Check forced data matches + bytes32 hashedForcedBatchData = keccak256( + abi.encodePacked( + currentTransactionsHash, + currentBatch.globalExitRoot, + currentBatch.minForcedTimestamp + ) + ); + + if ( + hashedForcedBatchData != + forcedBatches[currentLastForceBatchSequenced] + ) { + revert ForcedDataDoesNotMatch(); + } + + // Check timestamp is bigger than min timestamp + if (currentBatch.timestamp < currentBatch.minForcedTimestamp) { + revert SequencedTimestampBelowForcedTimestamp(); + } + + // Delete forceBatch data since won't be used anymore + delete forcedBatches[currentLastForceBatchSequenced]; + } else { + // Check global exit root exists with proper batch length. These checks are already done in the forceBatches call + // Note that the sequencer can skip setting a global exit root putting zeros + if ( + currentBatch.globalExitRoot != bytes32(0) && + globalExitRootManager.globalExitRootMap( + currentBatch.globalExitRoot + ) == + 0 + ) { + revert GlobalExitRootNotExist(); + } + } + + // Check Batch timestamps are correct + if ( + currentBatch.timestamp < currentTimestamp || + currentBatch.timestamp > block.timestamp + ) { + revert SequencedTimestampInvalid(); + } + + // Calculate next accumulated input hash + currentAccInputHash = keccak256( + abi.encodePacked( + currentAccInputHash, + currentTransactionsHash, + currentBatch.globalExitRoot, + currentBatch.timestamp, + l2Coinbase + ) + ); + + // Update timestamp + currentTimestamp = currentBatch.timestamp; + } + + // Sanity check, should be unreachable + if (currentLastForceBatchSequenced > lastForceBatch) { + revert ForceBatchesOverflow(); + } + + // Store back the storage variables + lastTimestamp = currentTimestamp; + lastAccInputHash = currentAccInputHash; + + uint256 nonForcedBatchesSequenced = batchesNum; + + // Validate that the data committee has signed the accInputHash for this sequence + dataCommittee.verifySignatures( + currentAccInputHash, + dataAvailabilityMessage + ); + + // Check if there has been forced batches + if (currentLastForceBatchSequenced != initLastForceBatchSequenced) { + // substract forced batches + nonForcedBatchesSequenced -= + currentLastForceBatchSequenced - + initLastForceBatchSequenced; + + // Store new last force batch sequenced + lastForceBatchSequenced = currentLastForceBatchSequenced; + } + + // Pay collateral for every non-forced batch submitted + matic.safeTransferFrom( + msg.sender, + address(rollupManager), + rollupManager.getBatchFee() * nonForcedBatchesSequenced + ); + + // Update global exit root if there are new deposits + bridgeAddress.updateGlobalExitRoot(); + + uint64 currentBatchSequenced = rollupManager.onSequenceBatches( + uint64(batchesNum), + uint64(batchesNum - nonForcedBatchesSequenced), + currentAccInputHash + ); + + emit SequenceBatches(currentBatchSequenced); + } + + ////////////////// + // admin functions + ////////////////// + + /** + * @notice Allow the admin to turn on the force batches + * This action is not reversible + */ + function switchSequenceWithDataAvailability() external onlyAdmin { + isSequenceWithDataAvailabilityAllowed = !isSequenceWithDataAvailabilityAllowed; + emit SwitchSequenceWithDataAvailability(); + } +} diff --git a/contracts/v2/interfaces/ICDKDataCommittee.sol b/contracts/v2/interfaces/ICDKDataCommittee.sol new file mode 100644 index 000000000..6b9de977c --- /dev/null +++ b/contracts/v2/interfaces/ICDKDataCommittee.sol @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: AGPL-3.0 + +pragma solidity 0.8.20; + +interface ICDKDataCommittee { + function verifySignatures(bytes32 hash, bytes memory signaturesAndAddrs) external view; +} \ No newline at end of file diff --git a/contracts/v2/interfaces/ICDKDataCommitteeErrors.sol b/contracts/v2/interfaces/ICDKDataCommitteeErrors.sol new file mode 100644 index 000000000..78aa2f4b2 --- /dev/null +++ b/contracts/v2/interfaces/ICDKDataCommitteeErrors.sol @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: AGPL-3.0 + +pragma solidity ^0.8.20; + +interface ICDKDataCommitteeErrors { + /** + * @dev Thrown when the addres bytes doesn't have the expected length + */ + error UnexpectedAddrsBytesLength(); + + /** + * @dev Thrown when the setup attempts to register a member with empty URL + */ + error EmptyURLNotAllowed(); + + /** + * @dev Thrown when the setup register doesn't order the members correctly + */ + error WrongAddrOrder(); + + /** + * @dev Thrown when the required amount of signatures is greater than the amount of members + */ + error TooManyRequiredSignatures(); + + /** + * @dev Thrown when the hash of the committee doesn't match with the provided addresses + */ + error UnexpectedCommitteeHash(); + + /** + * @dev Thrown when the signature of a DA hash doesn't belong to any member of the committee + */ + error CommitteeAddressDoesntExist(); + + /** + * @dev Thrown when the addresses and signatures byte array length has an unexpected size + */ + error UnexpectedAddrsAndSignaturesSize(); +} \ No newline at end of file diff --git a/contracts/v2/interfaces/IPolygonDataComittee.sol b/contracts/v2/interfaces/IPolygonDataComittee.sol new file mode 100644 index 000000000..9b3ccad9c --- /dev/null +++ b/contracts/v2/interfaces/IPolygonDataComittee.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: AGPL-3.0 + +pragma solidity ^0.8.20; + +interface IPolygonDataComittee { + /** + * @dev Thrown when try to activate force batches when they are already active + */ + error SequenceWithDataAvailabilityNotAllowed(); +} diff --git a/contracts/v2/interfaces/IPolygonRollupBase.sol b/contracts/v2/interfaces/IPolygonRollupBase.sol new file mode 100644 index 000000000..71320c57f --- /dev/null +++ b/contracts/v2/interfaces/IPolygonRollupBase.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: AGPL-3.0 + +pragma solidity 0.8.20; + +interface IPolygonRollupBase { + function initialize( + address _admin, + address _trustedSequencer, + string memory _trustedSequencerURL, + string memory _networkName + ) external; + + function onVerifyBatches( + uint64 lastVerifiedBatch, + bytes32 newStateRoot, + address aggregator + ) external; +} diff --git a/contracts/interfaces/IPolygonRollupManager.sol b/contracts/v2/interfaces/IPolygonRollupManager.sol similarity index 100% rename from contracts/interfaces/IPolygonRollupManager.sol rename to contracts/v2/interfaces/IPolygonRollupManager.sol diff --git a/contracts/interfaces/IPolygonZkEVMBridgeV2.sol b/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol similarity index 100% rename from contracts/interfaces/IPolygonZkEVMBridgeV2.sol rename to contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol diff --git a/contracts/interfaces/IPolygonZkEVMGasTokenBridge.sol b/contracts/v2/interfaces/IPolygonZkEVMGasTokenBridge.sol similarity index 100% rename from contracts/interfaces/IPolygonZkEVMGasTokenBridge.sol rename to contracts/v2/interfaces/IPolygonZkEVMGasTokenBridge.sol diff --git a/contracts/interfaces/IPolygonZkEVMV2Errors.sol b/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol similarity index 100% rename from contracts/interfaces/IPolygonZkEVMV2Errors.sol rename to contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol diff --git a/contracts/v2/PolygonZkEVMV2.sol b/contracts/v2/lib/PolygonRollupBase.sol similarity index 80% rename from contracts/v2/PolygonZkEVMV2.sol rename to contracts/v2/lib/PolygonRollupBase.sol index 3d6f31fbe..d239273c9 100644 --- a/contracts/v2/PolygonZkEVMV2.sol +++ b/contracts/v2/lib/PolygonRollupBase.sol @@ -2,14 +2,15 @@ pragma solidity ^0.8.20; import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; -import "../interfaces/IVerifierRollup.sol"; -import "../interfaces/IPolygonZkEVMGlobalExitRoot.sol"; +import "../../interfaces/IVerifierRollup.sol"; +import "../../interfaces/IPolygonZkEVMGlobalExitRoot.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; -import "../interfaces/IPolygonZkEVMBridge.sol"; -import "../lib/EmergencyManager.sol"; -import "../interfaces/IPolygonZkEVMErrors.sol"; +import "../../interfaces/IPolygonZkEVMBridge.sol"; +import "../../lib/EmergencyManager.sol"; +import "../../interfaces/IPolygonZkEVMErrors.sol"; import "../interfaces/IPolygonZkEVMV2Errors.sol"; -import "./PolygonRollupManager.sol"; +import "../PolygonRollupManager.sol"; +import "../interfaces/IPolygonRollupBase.sol"; /** * Contract responsible for managing the states and the updates of L2 network. @@ -19,10 +20,11 @@ import "./PolygonRollupManager.sol"; * 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. */ -contract PolygonZkEVMV2 is +contract PolygonRollupBase is Initializable, IPolygonZkEVMErrors, - IPolygonZkEVMV2Errors + IPolygonZkEVMV2Errors, + IPolygonRollupBase { using SafeERC20Upgradeable for IERC20Upgradeable; @@ -69,27 +71,6 @@ contract PolygonZkEVMV2 is uint64 previousLastBatchSequenced; } - /** - * @notice Struct to store the pending states - * Pending state will be an intermediary state, that after a timeout can be consolidated, which means that will be added - * to the state root mapping, and the global exit root will be updated - * This is a protection mechanism against soundness attacks, that will be turned off in the future - * @param timestamp Timestamp where the pending state is added to the queue - * @param lastVerifiedBatch Last batch verified batch of this pending state - * @param exitRoot Pending exit root - * @param stateRoot Pending state root - */ - struct PendingState { - uint64 timestamp; - uint64 lastVerifiedBatch; - bytes32 exitRoot; - bytes32 stateRoot; - } - - // Modulus zkSNARK - uint256 internal constant _RFIELD = - 21888242871839275222246405745257275088548364400416034343698204186575808495617; - // Max transactions bytes that can be added in a single batch // Max keccaks circuit = (2**23 / 155286) * 44 = 2376 // Bytes per keccak = 136 @@ -115,38 +96,36 @@ contract PolygonZkEVMV2 is // This should be a protection against someone that tries to generate huge chunk of invalid batches, and we can't prove otherwise before the pending timeout expires uint64 internal constant _MAX_VERIFY_BATCHES = 1000; - // Max batch multiplier per verification - uint256 internal constant _MAX_BATCH_MULTIPLIER = 12; - - // Max batch fee value - uint256 internal constant _MAX_BATCH_FEE = 1000 ether; - - // Min value batch fee - uint256 internal constant _MIN_BATCH_FEE = 1 gwei; - - // Goldilocks prime field - uint256 internal constant _GOLDILOCKS_PRIME_FIELD = 0xFFFFFFFF00000001; // 2 ** 64 - 2 ** 32 + 1 - - // Max uint64 - uint256 internal constant _MAX_UINT_64 = type(uint64).max; // 0xFFFFFFFFFFFFFFFF - - // MATIC token address // POL? + // MATIC token address // review POL IERC20Upgradeable public immutable matic; - // Rollup verifier interface - IVerifierRollup public immutable rollupVerifier; - // Global Exit Root interface IPolygonZkEVMGlobalExitRoot public immutable globalExitRootManager; // PolygonZkEVM Bridge Address IPolygonZkEVMBridge public immutable bridgeAddress; + // Rollup manager + PolygonRollupManager public immutable rollupManager; + + // review common variables + // Address that will be able to adjust contract parameters or stop the emergency state + address public admin; + + // This account will be able to accept the admin role + address public pendingAdmin; + // Trusted sequencer address address public trustedSequencer; - // Gap batch fee - uint256 public gapBatchFee; + // Trusted sequencer URL + string public trustedSequencerURL; + + // L2 network name + string public networkName; + + // Current accumulate input hash + bytes32 public lastAccInputHash; // Queue of forced batches with their associated data // ForceBatchNum --> hashedForcedBatchData @@ -157,70 +136,17 @@ contract PolygonZkEVMV2 is // Last sequenced timestamp uint64 public lastTimestamp; - // Last batch sent by the sequencers - uint64 public lastBatchSequenced; - - // Last forced batch included in the sequence - uint64 public lastForceBatchSequenced; - // Last forced batch uint64 public lastForceBatch; - // Gap Last batch verified by the aggregators - uint64 public gasLastVerifiedBatch; - - // Trusted aggregator address - address public gapTrustedAggregator; - - // State root mapping - // BatchNum --> state root - mapping(uint64 => bytes32) public gapBatchNumToStateRoot; - - // Trusted sequencer URL - string public trustedSequencerURL; - - // L2 network name - string public networkName; - - // Pending state mapping - // pendingStateNumber --> PendingState - mapping(uint256 => PendingState) public gapPendingStateTransitions; - - // Last pending state - uint64 public gapLastPendingState; - - // Last pending state consolidated - uint64 public gapLastPendingStateConsolidated; - - // Once a pending state exceeds this timeout it can be consolidated - uint64 public gapPendingStateTimeout; - - // Trusted aggregator timeout, if a sequence is not verified in this time frame, - // everyone can verify that sequence - uint64 public gapTrustedAggregatorTimeout; - - // Address that will be able to adjust contract parameters or stop the emergency state - address public admin; - - // This account will be able to accept the admin role - address public pendingAdmin; + // Last forced batch included in the sequence + uint64 public lastForceBatchSequenced; // Force batch timeout uint64 public forceBatchTimeout; - // Indicates if forced batches are disallowed - bool public isForcedBatchDisallowed; - - // Indicates the current version - uint256 public gapVersion; - - // Last batch verified before the last upgrade - uint256 public gapLastVerifiedBatchBeforeUpgrade; - - // Rollup manager - PolygonRollupManager public rollupManager; - - bytes32 public accInputHash; + // Indicates if forced batches are allowed + bool public isForcedBatchAllowed; /** * @dev Emitted when the trusted sequencer sends a new batch of transactions @@ -251,24 +177,6 @@ contract PolygonZkEVMV2 is address indexed aggregator ); - /** - * @dev Emitted when the trusted aggregator verifies batches - */ - event VerifyBatchesTrustedAggregator( - uint64 indexed numBatch, - bytes32 stateRoot, - address indexed aggregator - ); - - /** - * @dev Emitted when pending state is consolidated - */ - event ConsolidatePendingState( - uint64 indexed numBatch, - bytes32 stateRoot, - uint64 indexed pendingStateNum - ); - /** * @dev Emitted when the admin updates the trusted sequencer address */ @@ -279,31 +187,6 @@ contract PolygonZkEVMV2 is */ event SetTrustedSequencerURL(string newTrustedSequencerURL); - /** - * @dev Emitted when the admin updates the trusted aggregator timeout - */ - event SetTrustedAggregatorTimeout(uint64 newTrustedAggregatorTimeout); - - /** - * @dev Emitted when the admin updates the pending state timeout - */ - event SetPendingStateTimeout(uint64 newPendingStateTimeout); - - /** - * @dev Emitted when the admin updates the trusted aggregator address - */ - event SetTrustedAggregator(address newTrustedAggregator); - - /** - * @dev Emitted when the admin updates the multiplier batch fee - */ - event SetMultiplierBatchFee(uint16 newMultiplierBatchFee); - - /** - * @dev Emitted when the admin updates the verify batch timeout - */ - event SetVerifyBatchTimeTarget(uint64 newVerifyBatchTimeTarget); - /** * @dev Emitted when the admin update the force batch timeout */ @@ -324,23 +207,7 @@ contract PolygonZkEVMV2 is */ event AcceptAdminRole(address newAdmin); - /** - * @dev Emitted when is proved a different state given the same batches - */ - event ProveNonDeterministicPendingState( - bytes32 storedStateRoot, - bytes32 provedStateRoot - ); - - /** - * @dev Emitted when the trusted aggregator overrides pending state - */ - event OverridePendingState( - uint64 indexed numBatch, - bytes32 stateRoot, - address indexed aggregator - ); - + // review /** * @dev Emitted everytime the forkID is updated, this includes the first initialization of the contract * This event is intended to be emitted for every upgrade of the contract with relevant changes for the nodes @@ -352,20 +219,17 @@ contract PolygonZkEVMV2 is /** * @param _globalExitRootManager Global exit root manager address * @param _matic MATIC token address - * @param _rollupVerifier Rollup verifier address * @param _bridgeAddress Bridge address * @param _rollupManager Global exit root manager address */ constructor( IPolygonZkEVMGlobalExitRoot _globalExitRootManager, IERC20Upgradeable _matic, - IVerifierRollup _rollupVerifier, IPolygonZkEVMBridge _bridgeAddress, PolygonRollupManager _rollupManager ) { globalExitRootManager = _globalExitRootManager; matic = _matic; - rollupVerifier = _rollupVerifier; bridgeAddress = _bridgeAddress; rollupManager = _rollupManager; } @@ -381,7 +245,7 @@ contract PolygonZkEVMV2 is address _trustedSequencer, string memory _trustedSequencerURL, string memory _networkName - ) external initializer { + ) external virtual override initializer { admin = _admin; trustedSequencer = _trustedSequencer; @@ -390,9 +254,6 @@ contract PolygonZkEVMV2 is // Constant deployment variables forceBatchTimeout = 5 days; - isForcedBatchDisallowed = true; - - // version events review } modifier onlyAdmin() { @@ -409,8 +270,8 @@ contract PolygonZkEVMV2 is _; } - modifier isForceBatchAllowed() { - if (isForcedBatchDisallowed) { + modifier isForceBatchActive() { + if (!isForcedBatchAllowed) { revert ForceBatchNotAllowed(); } _; @@ -437,7 +298,7 @@ contract PolygonZkEVMV2 is function sequenceBatches( BatchData[] calldata batches, address l2Coinbase - ) external onlyTrustedSequencer { + ) external virtual onlyTrustedSequencer { uint256 batchesNum = batches.length; if (batchesNum == 0) { revert SequenceZeroBatches(); @@ -450,7 +311,7 @@ contract PolygonZkEVMV2 is // Store storage variables in memory, to save gas, because will be overrided multiple times uint64 currentTimestamp = lastTimestamp; uint64 currentLastForceBatchSequenced = lastForceBatchSequenced; - bytes32 currentAccInputHash = accInputHash; + bytes32 currentAccInputHash = lastAccInputHash; // Store in a temporal variable, for avoid access again the storage slot uint64 initLastForceBatchSequenced = currentLastForceBatchSequenced; @@ -542,7 +403,7 @@ contract PolygonZkEVMV2 is // Store back the storage variables lastTimestamp = currentTimestamp; - accInputHash = currentAccInputHash; + lastAccInputHash = currentAccInputHash; uint256 nonForcedBatchesSequenced = batchesNum; @@ -586,7 +447,7 @@ contract PolygonZkEVMV2 is uint64 lastVerifiedBatch, bytes32 newStateRoot, address aggregator - ) public onlyRollupManager { + ) public virtual override onlyRollupManager { emit VerifyBatches(lastVerifiedBatch, newStateRoot, aggregator); } @@ -606,7 +467,7 @@ contract PolygonZkEVMV2 is function forceBatch( bytes calldata transactions, uint256 maticAmount - ) public isForceBatchAllowed { + ) public virtual isForceBatchActive { // Calculate matic collateral uint256 maticFee = rollupManager.getForcedBatchFee(); @@ -618,7 +479,7 @@ contract PolygonZkEVMV2 is revert TransactionsLengthAboveMax(); } - matic.safeTransferFrom(msg.sender, address(this), maticFee); + matic.safeTransferFrom(msg.sender, address(rollupManager), maticFee); // Get globalExitRoot global exit root bytes32 lastGlobalExitRoot = globalExitRootManager @@ -656,7 +517,7 @@ contract PolygonZkEVMV2 is */ function sequenceForceBatches( ForcedBatchData[] calldata batches - ) external isForceBatchAllowed { + ) external virtual isForceBatchActive { uint256 batchesNum = batches.length; if (batchesNum == 0) { @@ -676,7 +537,7 @@ contract PolygonZkEVMV2 is // Store storage variables in memory, to save gas, because will be overrided multiple times uint64 currentLastForceBatchSequenced = lastForceBatchSequenced; - bytes32 currentAccInputHash = accInputHash; + bytes32 currentAccInputHash = lastAccInputHash; // Sequence force batches for (uint256 i = 0; i < batchesNum; i++) { @@ -730,7 +591,7 @@ contract PolygonZkEVMV2 is } // Store back the storage variables - accInputHash = currentAccInputHash; + lastAccInputHash = currentAccInputHash; lastTimestamp = uint64(block.timestamp); lastForceBatchSequenced = currentLastForceBatchSequenced; @@ -798,10 +659,10 @@ contract PolygonZkEVMV2 is * This action is not reversible */ function activateForceBatches() external onlyAdmin { - if (!isForcedBatchDisallowed) { + if (isForcedBatchAllowed) { revert ForceBatchesAlreadyActive(); } - isForcedBatchDisallowed = false; + isForcedBatchAllowed = true; emit ActivateForceBatches(); } From 196719a5c10dd816bc1bea1a38bbe33fca5d39fa Mon Sep 17 00:00:00 2001 From: invocamanman Date: Thu, 5 Oct 2023 20:25:29 +0200 Subject: [PATCH 024/230] not yet --- .../v2/L2/PolygonZkEVMGasTokenBridge.sol | 5 +- contracts/v2/PolygonRollupManager.sol | 429 ++++++++---------- contracts/v2/PolygonZkEVMBridgeV2.sol | 4 +- .../consensus/{ => zkEVM}/PolygonZkEVMV2.sol | 2 +- .../v2/interfaces/IPolygonRollupManager.sol | 12 +- contracts/v2/lib/PolygonRollupBase.sol | 1 + 6 files changed, 212 insertions(+), 241 deletions(-) rename contracts/v2/consensus/{ => zkEVM}/PolygonZkEVMV2.sol (96%) diff --git a/contracts/v2/L2/PolygonZkEVMGasTokenBridge.sol b/contracts/v2/L2/PolygonZkEVMGasTokenBridge.sol index 4bac058fd..597daae32 100644 --- a/contracts/v2/L2/PolygonZkEVMGasTokenBridge.sol +++ b/contracts/v2/L2/PolygonZkEVMGasTokenBridge.sol @@ -97,6 +97,7 @@ contract PolygonZkEVMGasTokenBridge is networkID = _networkID; globalExitRootManager = _globalExitRootManager; + // check native token TODO // Set gas token gasTokenAddress = _gasTokenAddress; gasTokenNetwork = _gasTokenNetwork; @@ -287,7 +288,7 @@ contract PolygonZkEVMGasTokenBridge is bytes calldata metadata ) external payable { if ( - destinationNetwork == networkID // TODO + destinationNetwork == networkID // destinationNetwork >= rollupManager.rollupCount() ?¿ TODO ) { revert DestinationNetworkInvalid(); } @@ -623,7 +624,7 @@ contract PolygonZkEVMGasTokenBridge is ) ); - // check that thi global exit root exist + // check that this global exit root exist if (timestampGlobalExitRoot == 0) { revert GlobalExitRootInvalid(); } diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index 507bcef38..f74b4169c 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -16,7 +16,6 @@ import "./lib/PolygonAccessControlUpgradeable.sol"; import "../interfaces/IVerifierRollup.sol"; // TODO change name to network -// zkevm type uint8 /** * Contract responsible for managing the exit roots across multiple Rollups @@ -42,31 +41,24 @@ abstract contract PolygonRollupManager is } /** - * @notice Struct which to store the verifier data - * @param accInputHash Hash chain that contains all the information to process a batch: - * keccak256(bytes32 oldAccInputHash, keccak256(bytes transactions), bytes32 globalExitRoot, uint64 timestamp, address seqAddress) - * @param sequencedTimestamp Sequenced timestamp - * @param previousLastBatchSequenced Previous last batch sequenced before the current one, this is used to properly calculate the fees + * @notice Struct which to store the rollup type data + * @param consensusImplementation Consensus implementation ( contains the consensus logic for the transaparent proxy) + * @param verifier verifier + * @param forkID fork ID + * @param rollupCompatibilityID Rollup compatibility ID, to check upgradability between rollup types + * @param genesis Genesis block of the rollup, note that will only be used on creating new rollups, not upgrade them + * @param description Previous last batch sequenced before the current one, this is used to properly calculate the fees */ - struct VerifierData { - uint64 verifierID; + struct RollupType { + address consensusImplementation; + IVerifierRollup verifier; uint64 forkID; + uint8 rollupCompatibilityID; + bool obsolete; bytes32 genesis; string description; } - /** - * @notice Struct which to store the verifier data - * @param accInputHash Hash chain that contains all the information to process a batch: - * keccak256(bytes32 oldAccInputHash, keccak256(bytes transactions), bytes32 globalExitRoot, uint64 timestamp, address seqAddress) - * @param sequencedTimestamp Sequenced timestamp - * @param previousLastBatchSequenced Previous last batch sequenced before the current one, this is used to properly calculate the fees - */ - struct ConsensusData { - uint64 consensusID; - string description; - } - /** * @notice Struct which to store the rollup data of each chain * @param accInputHash Hash chain that contains all the information to process a batch: @@ -75,9 +67,10 @@ abstract contract PolygonRollupManager is * @param previousLastBatchSequenced Previous last batch sequenced before the current one, this is used to properly calculate the fees */ struct RollupData { - address rollupAddress; // TODO base rollup - IVerifierRollup verifierAddress; + IPolygonRollupBase rollupContract; uint64 chainID; + IVerifierRollup verifier; + uint64 forkID; mapping(uint64 => bytes32) batchNumToStateRoot; mapping(uint64 => SequencedBatchData) sequencedBatches; mapping(uint256 => PendingState) pendingStateTransitions; @@ -86,8 +79,11 @@ abstract contract PolygonRollupManager is uint64 lastVerifiedBatch; uint64 lastPendingState; uint64 lastPendingStateConsolidated; - uint64 lastVerifiedBatchBeforeUpgrade; + uint64 lastVerifiedBatchBeforeUpgrade; // TODO ADD CHECK when verify + uint64 rollupTypeID; + uint8 rollupCompatibilityID; } + // review, description?¿ /** * @notice Struct to store the pending states @@ -138,12 +134,12 @@ abstract contract PolygonRollupManager is // Existing roles on rollup manager // Trusted aggregator will be able to verify batches without extra delau - bytes32 public constant ADD_VERIFIER_CONSENSUS_ROLE = - keccak256("ADD_VERIFIER_CONSENSUS_ROLE"); + bytes32 public constant ADD_ROLLUP_TYPE_ROLE = + keccak256("ADD_ROLLUP_TYPE_ROLE"); // Trusted aggregator will be able to verify batches without extra delau - bytes32 public constant DELETE_VERIFIER_CONSENSUS_ROLE = - keccak256("DELETE_VERIFIER_CONSENSUS_ROLE"); + bytes32 public constant DELETE_ROLLUP_TYPE_ROLE = + keccak256("DELETE_ROLLUP_TYPE_ROLE"); bytes32 public constant CREATE_ROLLUP_ROLE = keccak256("CREATE_ROLLUP_ROLE"); @@ -227,7 +223,7 @@ abstract contract PolygonRollupManager is uint64 internal _legacylastVerifiedBatch; // Trusted aggregator address - address internal _legacyTrustedAggregator; // TODO legacy=? + address internal _legacyTrustedAggregator; // State root mapping // BatchNum --> state root @@ -268,18 +264,11 @@ abstract contract PolygonRollupManager is // Indicates if forced batches are disallowed bool internal _legacyIsForcedBatchDisallowed; - // Start current variables - // Number of consensus added, every new consensus will be assigned sequencially a new ID - uint64 public consensusCount; + // Number of rollup types added, every new consensus will be assigned sequencially a new ID + uint64 public rollupTypeCount; // Consensus mapping - mapping(address consensusAddress => ConsensusData) public consensusMap; - - // Number of verifiers added, every new verifier will be assigned sequencially a new ID - uint64 public verifierCount; - - // Verifiers mapping - mapping(address verifierAddress => VerifierData) public verifierMap; + mapping(uint64 rollupTypeID => RollupType) public rollupTypeMap; // Rollup Count uint64 public rollupCount; @@ -318,51 +307,49 @@ abstract contract PolygonRollupManager is address public trustedAggregator; /** - * @dev Emitted when a new consensus is added + * @dev Emitted when a new rollup type is added */ - event AddNewConsensus( - uint256 consensusID, - address consensusAddress, + event AddNewRollupType( + uint64 rollupID, + address consensusImplementation, + address verifier, + uint64 forkID, + bytes32 genesis, string description ); /** - * @dev Emitted when a new consensus is added + * @dev Emitted when a a rolup type is deleted */ - event AddNewVerifier( - uint256 verifierId, - address verifierAddress, - string description - ); + event DeleteRollupType(uint64 rollupID); /** - * @dev Emitted when a new verifier is added + * @dev Emitted when a new rollup is created based on a rollupType */ - event DeleteConsensus(address consensusAddress); - - /** - * @dev Emitted when a new verifier is added - */ - event DeleteVerifier(address verifierAddress); + event CreateNewRollup( + uint64 rollupID, + uint64 rollupTypeID, + address rollupAddress, + uint64 chainID + ); /** - * @dev Emitted when a new verifier is added + * @dev Emitted when an existing rollup is added */ - event AddNewRollup( + event AddExistingRollup( uint64 rollupID, + uint64 forkID, address rollupAddress, - address consensusAddress, - address verifierAddress, - uint64 chainID + uint64 chainID, + uint8 rollupCompatibilityID ); /** - * @dev Emitted when a new verifier is added + * @dev Emitted when a rollup is udpated */ event UpdateRollup( uint64 rollupID, - address newConsensusAddress, - address newVerifierAddress, + uint64 newRollupTypeID, uint64 lastVerifiedBatchBeforeUpgrade ); @@ -493,7 +480,7 @@ abstract contract PolygonRollupManager is // Timelock roles _setupRole(DEFAULT_ADMIN_ROLE, timelock); - _setupRole(ADD_VERIFIER_CONSENSUS_ROLE, timelock); + _setupRole(ADD_ROLLUP_TYPE_ROLE, timelock); _setupRole(ADD_EXISTING_ROLLUP_ROLE, timelock); // role fees // role rst of parameters @@ -504,7 +491,7 @@ abstract contract PolygonRollupManager is _setupRole(UPDATE_ROLLUP_ROLE, timelock); // Admin roles - _setupRole(DELETE_VERIFIER_CONSENSUS_ROLE, admin); + _setupRole(DELETE_ROLLUP_TYPE_ROLE, admin); _setupRole(CREATE_ROLLUP_ROLE, admin); _setupRole(STOP_EMERGENCY_ROLE, admin); _setupRole(TRUSTED_AGGREGATOR_ROLE, admin); @@ -519,7 +506,9 @@ abstract contract PolygonRollupManager is // deploy zkEVM probably wont work bc initialize D: - // TODO consisnten qiwht the bridge, networkCount == networkID, zkEVm MUst be the 1 + // TODO consisnten with the bridge, networkCount == networkID, zkEVm MUst be the 1 + + // batchNumToStateRoot copy zkevm aswell, // emit version review } @@ -529,122 +518,91 @@ abstract contract PolygonRollupManager is /////////////////////////////////////////////// /** - * @notice Add a new consensus implementation contract - * This contract will be used as base for the new created Rollups - * @param newConsensusAddress new exit tree root - * @param description description of the consensus - */ - function addNewConsensus( - address newConsensusAddress, - string memory description - ) external onlyRole(ADD_VERIFIER_CONSENSUS_ROLE) { - _addNewConsensus(newConsensusAddress, description); - } - - /** - * @notice Add a new consensus implementation contract - * This contract will be used as base for the new created Rollups - * @param newConsensusAddress new exit tree root - * @param description description of the consensus - */ - function _addNewConsensus( - address newConsensusAddress, - string memory description - ) internal { - if (consensusMap[newConsensusAddress].consensusID != 0) { - revert ConsensusAlreadyExist(); - } - - uint64 consensusID = ++consensusCount; - consensusMap[newConsensusAddress] = ConsensusData({ - consensusID: consensusID, - description: description - }); - // Check a view on the consensus contract?¿ - - emit AddNewConsensus(consensusID, newConsensusAddress, description); - } - - /** - * @notice Add a new vefifier contract - * @param newVerifierAddress new verifier address + * @notice Add a new zkEVM type + * @param consensusAddress new consensus implementation + * @param verifierAddress new verifier address + * @param forkID forkID of the verifier + * @param genesis genesis block of the zkEVM + * @param description description of the zkEVM type */ - function addNewVerifier( - address newVerifierAddress, + function addNewRollupType( + address consensusAddress, + IVerifierRollup verifierAddress, uint64 forkID, bytes32 genesis, + uint8 rollupCompatibilityID, string memory description - ) external onlyRole(ADD_VERIFIER_CONSENSUS_ROLE) { - _addNewVerifier(newVerifierAddress, forkID, genesis, description); + ) external onlyRole(ADD_ROLLUP_TYPE_ROLE) { + _addNewRollupType( + consensusAddress, + verifierAddress, + forkID, + genesis, + rollupCompatibilityID, + description + ); } /** - * @notice Add a new vefifier contract - * @param newVerifierAddress new verifier address + * @notice Add a new zkEVM type + * @param consensusImplementation new consensus implementation + * @param verifier new verifier address + * @param forkID forkID of the verifier + * @param genesis genesis block of the zkEVM + * @param description description of the zkEVM type */ - function _addNewVerifier( - address newVerifierAddress, + function _addNewRollupType( + address consensusImplementation, + IVerifierRollup verifier, uint64 forkID, bytes32 genesis, + uint8 rollupCompatibilityID, string memory description ) internal { - if (verifierMap[newVerifierAddress].verifierID != 0) { - revert VerifierAlreadyExist(); - } + // nullify rollup type?¿ review hash(verifier, implementation, genesis) + // review check address are not 0? - uint64 verifierID = ++verifierCount; - verifierMap[newVerifierAddress] = VerifierData({ - verifierID: verifierID, + uint64 rollupTypeID = ++rollupTypeCount; + + rollupTypeMap[rollupTypeID] = RollupType({ + consensusImplementation: consensusImplementation, + verifier: verifier, forkID: forkID, + rollupCompatibilityID: rollupCompatibilityID, + obsolete: false, genesis: genesis, description: description }); - emit AddNewVerifier(verifierID, newVerifierAddress, description); - } - - /** - * @notice Delete Conensus - * Note that can be some "holes" in the verifier map - * @param consensusAddress Consensus address to delete - */ - function deleteConsensus( - address consensusAddress - ) external onlyRole(DELETE_VERIFIER_CONSENSUS_ROLE) { - if (consensusMap[consensusAddress].consensusID == 0) { - revert ConsensusDoesNotExist(); - } - - delete consensusMap[consensusAddress].description; - delete consensusMap[consensusAddress]; - - emit DeleteConsensus(consensusAddress); + emit AddNewRollupType( + rollupTypeID, + consensusImplementation, + address(verifier), + forkID, + genesis, + description + ); } /** - * @notice Delete Verifier - * Note that can be some "holes" in the verifier map - * @param verifierAddress Verifier address to delete + * @notice Obsolete Rollup type + * @param rollupTypeID Consensus address to obsolete */ - function deleteVerifier( - address verifierAddress - ) external onlyRole(DELETE_VERIFIER_CONSENSUS_ROLE) { - if (verifierMap[verifierAddress].verifierID == 0) { - revert VerifierDoesNotExist(); + function obsoleteRollupType( + uint64 rollupTypeID + ) external onlyRole(DELETE_ROLLUP_TYPE_ROLE) { + if (rollupTypeID == 0 || rollupTypeID > rollupTypeCount) { + revert RollupTypeDoesNotExist(); } - delete verifierMap[verifierAddress].description; - delete verifierMap[verifierAddress]; + rollupTypeMap[rollupTypeID].obsolete = true; - emit DeleteVerifier(verifierAddress); + emit DeleteRollupType(rollupTypeID); } - // * @param version version string of the new created rollup - /** * @notice Create a new rollup - * @param consensusAddress consensus implementation address - * @param verifierAddress verifier address + * @param rollupTypeID Rollup type to deploy * @param chainID chainID * @param admin admin of the new created rollup * @param trustedSequencer trusted sequencer of the new created rollup @@ -652,22 +610,22 @@ abstract contract PolygonRollupManager is * @param networkName network name of the new created rollup */ function createNewRollup( - address consensusAddress, - address verifierAddress, + uint64 rollupTypeID, uint64 chainID, address admin, address trustedSequencer, string memory trustedSequencerURL, string memory networkName ) external onlyRole(CREATE_ROLLUP_ROLE) { - // Check that consensus and verifier are already added - if (consensusMap[consensusAddress].consensusID == 0) { - revert ConsensusDoesNotExist(); + // Check that rollup type exists + if (rollupTypeID == 0 || rollupTypeID > rollupTypeCount) { + revert RollupTypeDoesNotExist(); } - VerifierData storage verifier = verifierMap[verifierAddress]; - if (verifier.verifierID == 0) { - revert VerifierDoesNotExist(); + // Check rollup type is not obsolete + RollupType storage rollupType = rollupTypeMap[rollupTypeID]; + if (rollupType.obsolete == true) { + revert RollupTypeObsolete(); } // Check chainID nullifier @@ -680,14 +638,17 @@ abstract contract PolygonRollupManager is uint64 rollupID = ++rollupCount; address rollupAddress = address( new TransparentUpgradeableProxy( - consensusAddress, + rollupType.consensusImplementation, address(this), abi.encodeCall( IPolygonRollupBase.initialize, - (admin, trustedSequencer, trustedSequencerURL, networkName) // TODO Make lib about, like basePolygonRollup + (admin, trustedSequencer, trustedSequencerURL, networkName) // review parameters ) ) ); + // TODO GENESIS MUST BE INITIALIZEWD with proper chainID, + //initialize(chainID, gasTOken, gasNetwork) + //in consensus contract generate proper encoding and singature // Set chainID nullifier chainIDToRollupID[chainID] = rollupID; @@ -696,32 +657,34 @@ abstract contract PolygonRollupManager is rollupAddressToID[rollupAddress] = rollupID; RollupData storage rollup = rollupIDToRollupData[rollupID]; - rollup.rollupAddress = rollupAddress; - rollup.verifierAddress = IVerifierRollup(verifierAddress); + + rollup.rollupContract = IPolygonRollupBase(rollupAddress); + rollup.forkID = rollupType.forkID; + rollup.verifier = rollupType.verifier; rollup.chainID = chainID; - rollup.batchNumToStateRoot[0] = verifier.genesis; + rollup.batchNumToStateRoot[0] = rollupType.genesis; + rollup.rollupTypeID = rollupTypeID; + rollup.rollupCompatibilityID = rollupType.rollupCompatibilityID; - emit AddNewRollup( - rollupID, - rollupAddress, - consensusAddress, - verifierAddress, - chainID - ); + emit CreateNewRollup(rollupID, rollupTypeID, rollupAddress, chainID); } // review, could even delete this?¿ /** * @notice Add an already deployed rollup * @param rollupAddress rollup address - * @param verifierAddress verifier address, must be added before + * @param verifier verifier address, must be added before + * @param forkID chain id of the created rollup * @param chainID chain id of the created rollup + * @param genesis chain id of the created rollup */ function addExistingRollup( - address rollupAddress, - address verifierAddress, + IPolygonRollupBase rollupAddress, + IVerifierRollup verifier, + uint64 forkID, uint64 chainID, - bytes32 genesis + bytes32 genesis, + uint8 rollupCompatibilityID ) external onlyRole(ADD_EXISTING_ROLLUP_ROLE) { // Check chainID nullifier if (chainIDToRollupID[chainID] != 0) { @@ -730,88 +693,84 @@ abstract contract PolygonRollupManager is uint64 rollupID = ++rollupCount; - rollupAddressToID[rollupAddress] = rollupID; + // Set chainID nullifier chainIDToRollupID[chainID] = rollupID; + // Store rollup data + rollupAddressToID[address(rollupAddress)] = rollupID; + RollupData storage rollup = rollupIDToRollupData[rollupID]; - rollup.rollupAddress = rollupAddress; - rollup.verifierAddress = IVerifierRollup(verifierAddress); + rollup.rollupContract = rollupAddress; + rollup.forkID = forkID; + rollup.verifier = verifier; rollup.chainID = chainID; rollup.batchNumToStateRoot[0] = genesis; + rollup.rollupCompatibilityID = rollupCompatibilityID; - emit AddNewRollup( + emit AddExistingRollup( rollupID, - rollupAddress, - address(0), - verifierAddress, - chainID + forkID, + address(rollupAddress), + chainID, + rollupCompatibilityID ); } + //review, should cehck that there are not sequenced batches eponding to be verified?¿? + //this way no one can break the virtual state, ( but maybe is worth to break it) + /** * @notice Upgrade an existing rollup - * @param rollupAddress Rollup consensus proxy address - * @param newConsensusAddress new implementation of the consensus + * @param rollupContract Rollup consensus proxy address + * @param newRollupTypeID New rolluptypeID to upgrade to * @param upgradeData Upgrade data */ function updateRollup( - TransparentUpgradeableProxy rollupAddress, - IVerifierRollup newVerifierAddress, - address newConsensusAddress, + TransparentUpgradeableProxy rollupContract, + uint64 newRollupTypeID, bytes calldata upgradeData ) external onlyRole(UPDATE_ROLLUP_ROLE) { - uint64 rollupID = rollupAddressToID[address(rollupAddress)]; + // TODO Check new rollup type was not deleted? it would be sanity check + // Check that rollup type exists + if (newRollupTypeID == 0 || newRollupTypeID > rollupTypeCount) { + revert RollupTypeDoesNotExist(); + } + uint64 rollupID = rollupAddressToID[address(rollupContract)]; if (rollupID == 0) { revert RollupMustExist(); } RollupData storage rollup = rollupIDToRollupData[rollupID]; - // If it's defined a new verifier address, update verifier - if (address(newVerifierAddress) != address(0)) { - VerifierData storage newVerifier = verifierMap[ - address(newVerifierAddress) - ]; - - if (newVerifier.verifierID == 0) { - revert VerifierDoesNotExist(); - } + if (rollup.rollupTypeID == newRollupTypeID) { + revert UpdateToSameRollupTypeID(); + } - if (rollup.verifierAddress == newVerifierAddress) { - revert VerifierMustBeDifferent(); - } + RollupType storage newRollupType = rollupTypeMap[newRollupTypeID]; - if ( - verifierMap[address(rollup.verifierAddress)].genesis != - newVerifier.genesis - ) { - revert VerifiersMustHaveSameGenesis(); - } - rollup.verifierAddress = newVerifierAddress; - rollup.lastVerifiedBatchBeforeUpgrade = getLastVerifiedBatch( - rollupID - ); + // check compatibility of the rollups + if ( + rollup.rollupCompatibilityID != newRollupType.rollupCompatibilityID + ) { + revert UpdateToSameRollupTypeID(); } - // If it's defined a new implementation address, update implementation - if (newConsensusAddress != address(0)) { - if (consensusMap[newConsensusAddress].consensusID == 0) { - revert ConsensusDoesNotExist(); - } - - if (rollupAddress.implementation() == newConsensusAddress) { - revert UpgradeToSameImplementation(); - } + // update rollup parameters + rollup.verifier = newRollupType.verifier; + rollup.forkID = newRollupType.forkID; + rollup.rollupTypeID = newRollupTypeID; + rollup.lastVerifiedBatchBeforeUpgrade = getLastVerifiedBatch(rollupID); - rollupAddress.upgradeToAndCall(newConsensusAddress, upgradeData); + // review if it's the same implementation do not upgrade + address newConsensusAddress = newRollupType.consensusImplementation; + if (rollupContract.implementation() != newConsensusAddress) { + rollupContract.upgradeToAndCall(newConsensusAddress, upgradeData); } - // review Should emit forkID aswell?¿ emit UpdateRollup( rollupID, - newConsensusAddress, - address(newVerifierAddress), + newRollupTypeID, rollup.lastVerifiedBatchBeforeUpgrade ); } @@ -1081,7 +1040,7 @@ abstract contract PolygonRollupManager is uint256 inputSnark = uint256(sha256(snarkHashBytes)) % _RFIELD; // Verify proof - if (!rollup.verifierAddress.verifyProof(proof, [inputSnark])) { + if (!rollup.verifier.verifyProof(proof, [inputSnark])) { revert InvalidProof(); } @@ -1098,7 +1057,7 @@ abstract contract PolygonRollupManager is lastAggregationTimestamp = uint64(block.timestamp); // Callback to the rollup address - IPolygonRollupBase(rollup.rollupAddress).onVerifyBatches( + rollup.rollupContract.onVerifyBatches( finalNewBatch, newStateRoot, msg.sender @@ -1188,7 +1147,7 @@ abstract contract PolygonRollupManager is globalExitRootManager.updateExitRoot(currentPendingState.exitRoot); emit ConsolidatePendingState( - rollupAddressToID[rollup.rollupAddress], + rollupAddressToID[address(rollup.rollupContract)], newLastVerifiedBatch, currentPendingState.stateRoot, pendingStateNum @@ -1385,7 +1344,7 @@ abstract contract PolygonRollupManager is uint256 inputSnark = uint256(sha256(snarkHashBytes)) % _RFIELD; // Verify proof - if (!rollup.verifierAddress.verifyProof(proof, [inputSnark])) { + if (!rollup.verifier.verifyProof(proof, [inputSnark])) { revert InvalidProof(); } @@ -1537,7 +1496,7 @@ abstract contract PolygonRollupManager is // admin functions ////////////////// - // review Role + // review Role TA /** * @notice Allow the admin to set a new trusted aggregator address @@ -1772,14 +1731,14 @@ abstract contract PolygonRollupManager is * @notice Get batch fee */ function getBatchFee() public view returns (uint256) { - return batchFee; // review + return batchFee; } /** * @notice Get forced batch fee */ function getForcedBatchFee() public view returns (uint256) { - return batchFee * 100; // review, should be a parameter? + return batchFee * 100; } /** @@ -1850,12 +1809,12 @@ abstract contract PolygonRollupManager is return abi.encodePacked( - msg.sender, // TODO=?¿ + msg.sender, oldStateRoot, oldAccInputHash, initNumBatch, rollup.chainID, - verifierMap[address(rollup.verifierAddress)].forkID, + rollup.forkID, newStateRoot, newAccInputHash, newLocalExitRoot, diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index ad763dfb0..19883e8f0 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -158,7 +158,7 @@ contract PolygonZkEVMBridgeV2 is ) public payable virtual ifNotEmergencyState nonReentrant { if ( destinationNetwork == networkID - // TODO destinationNetwork >= rollupManager.rollupCount() ?¿ + // TODO check desitnation network? destinationNetwork >= rollupManager.rollupCount() ?¿ ) { revert DestinationNetworkInvalid(); } @@ -603,7 +603,7 @@ contract PolygonZkEVMBridgeV2 is } uint32 leafIndex; - uint32 originNetwork; + uint32 originNetwork; // TODO renaming sourceBridgeNetwork // Get origin network from global index if (globalIndex & _GLOBAL_INDEX_MAINNET_FLAG == 1) { diff --git a/contracts/v2/consensus/PolygonZkEVMV2.sol b/contracts/v2/consensus/zkEVM/PolygonZkEVMV2.sol similarity index 96% rename from contracts/v2/consensus/PolygonZkEVMV2.sol rename to contracts/v2/consensus/zkEVM/PolygonZkEVMV2.sol index 3d9d9de6d..a19b8911e 100644 --- a/contracts/v2/consensus/PolygonZkEVMV2.sol +++ b/contracts/v2/consensus/zkEVM/PolygonZkEVMV2.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: AGPL-3.0 pragma solidity ^0.8.20; -import "../lib/PolygonRollupBase.sol"; +import "../../lib/PolygonRollupBase.sol"; /** * Contract responsible for managing the states and the updates of L2 network. diff --git a/contracts/v2/interfaces/IPolygonRollupManager.sol b/contracts/v2/interfaces/IPolygonRollupManager.sol index 59517e1cb..05fc8e4ff 100644 --- a/contracts/v2/interfaces/IPolygonRollupManager.sol +++ b/contracts/v2/interfaces/IPolygonRollupManager.sol @@ -46,7 +46,7 @@ interface IPolygonRollupManager { /** * @dev Thrown when sender is not the PolygonZkEVM address */ - error UpgradeToSameImplementation(); + error UpdateToSameRollupTypeID(); /** * @dev Thrown when sender is not the PolygonZkEVM address @@ -222,4 +222,14 @@ interface IPolygonRollupManager { * @dev Thrown when the caller is not the pending admin */ error MustSequenceSomeBatch(); + + /** + * @dev When a rollup type does not exist + */ + error RollupTypeDoesNotExist(); + + /** + * @dev When a rollup type does not exist + */ + error RollupTypeObsolete(); } diff --git a/contracts/v2/lib/PolygonRollupBase.sol b/contracts/v2/lib/PolygonRollupBase.sol index d239273c9..b75a2e09a 100644 --- a/contracts/v2/lib/PolygonRollupBase.sol +++ b/contracts/v2/lib/PolygonRollupBase.sol @@ -26,6 +26,7 @@ contract PolygonRollupBase is IPolygonZkEVMV2Errors, IPolygonRollupBase { + // INterface cehcks renaming using SafeERC20Upgradeable for IERC20Upgradeable; /** From ca99ad6c694544b7fcc8fea147e44f74f7dbbd46 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Thu, 5 Oct 2023 20:58:16 +0200 Subject: [PATCH 025/230] ayay --- contracts/v2/PolygonRollupManager.sol | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index f74b4169c..d5910a8f5 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -20,7 +20,7 @@ import "../interfaces/IVerifierRollup.sol"; /** * Contract responsible for managing the exit roots across multiple Rollups */ -abstract contract PolygonRollupManager is +contract PolygonRollupManager is PolygonAccessControlUpgradeable, EmergencyManager, IPolygonRollupManager @@ -291,11 +291,20 @@ abstract contract PolygonRollupManager is // everyone can verify that sequence uint64 public trustedAggregatorTimeout; + // Total sequenced batches between all rollups uint64 public totalSequencedBatches; + + // Total pending batches between all networks uint64 public totalPendingForcedBatches; + + // Total verified batches between all rollups uint64 public totalVerifiedBatches; + + // Last timestamp where an aggregation happen uint64 public lastAggregationTimestamp; + // Time target of the verification of a batch + // Adaptatly the batchFee will be updated to achieve this target uint64 public verifyBatchTimeTarget; // Batch fee multiplier with 3 decimals that goes from 1000 - 1023 @@ -304,6 +313,7 @@ abstract contract PolygonRollupManager is // Current matic fee per batch sequenced uint256 public batchFee; + // Address that has priority to verify batches, also enables bridges instantly address public trustedAggregator; /** @@ -510,11 +520,11 @@ abstract contract PolygonRollupManager is // batchNumToStateRoot copy zkevm aswell, - // emit version review + // emit version review yes here! } //////////////////////////////////////////////// - // Consensus-Verifiers-Rollups managment functions + // Rollups management functions /////////////////////////////////////////////// /** @@ -669,7 +679,6 @@ abstract contract PolygonRollupManager is emit CreateNewRollup(rollupID, rollupTypeID, rollupAddress, chainID); } - // review, could even delete this?¿ /** * @notice Add an already deployed rollup * @param rollupAddress rollup address @@ -677,6 +686,7 @@ abstract contract PolygonRollupManager is * @param forkID chain id of the created rollup * @param chainID chain id of the created rollup * @param genesis chain id of the created rollup + * @param rollupCompatibilityID chain id of the created rollup */ function addExistingRollup( IPolygonRollupBase rollupAddress, @@ -749,6 +759,11 @@ abstract contract PolygonRollupManager is RollupType storage newRollupType = rollupTypeMap[newRollupTypeID]; + // Check rollup type is not obsolete + if (newRollupType.obsolete == true) { + revert RollupTypeObsolete(); + } + // check compatibility of the rollups if ( rollup.rollupCompatibilityID != newRollupType.rollupCompatibilityID @@ -1496,15 +1511,13 @@ abstract contract PolygonRollupManager is // admin functions ////////////////// - // review Role TA - /** * @notice Allow the admin to set a new trusted aggregator address * @param newTrustedAggregator Address of the new trusted aggregator */ function setTrustedAggregator( address newTrustedAggregator - ) external onlyRole(TWEAK_PARAMETERS_ROLE) { + ) external onlyRole(TRUSTED_AGGREGATOR_ROLE) { trustedAggregator = newTrustedAggregator; emit SetTrustedAggregator(newTrustedAggregator); From ef3f4408b611ca247b55d267a469a33703a43705 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Thu, 5 Oct 2023 22:07:18 +0200 Subject: [PATCH 026/230] ongoing --- .../v2/L2/PolygonZkEVMGasTokenBridge.sol | 37 +++++++++++++------ contracts/v2/PolygonRollupManager.sol | 34 ++--------------- .../lib/PolygonAccessControlUpgradeable.sol | 17 ++++----- hardhat.config.js | 11 ++++++ 4 files changed, 48 insertions(+), 51 deletions(-) diff --git a/contracts/v2/L2/PolygonZkEVMGasTokenBridge.sol b/contracts/v2/L2/PolygonZkEVMGasTokenBridge.sol index 597daae32..0966fd604 100644 --- a/contracts/v2/L2/PolygonZkEVMGasTokenBridge.sol +++ b/contracts/v2/L2/PolygonZkEVMGasTokenBridge.sol @@ -11,6 +11,10 @@ import "../interfaces/IPolygonZkEVMGasTokenBridge.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol"; import "../../lib/GlobalExitRootLib.sol"; +// review this implementation DOES not take care the storage slots of bridge +// this means that if the bridge on mainnet or zkEVM should be updated in a future, should be done by +// the other contract + /** * PolygonZkEVMBridge that will be deployed on both networks Ethereum and Polygon zkEVM * Contract responsible to manage the token interactions with other networks @@ -58,7 +62,10 @@ contract PolygonZkEVMGasTokenBridge is uint32 public networkID; // Global Exit Root address - IBasePolygonZkEVMGlobalExitRoot public globalExitRootManager; + IBasePolygonZkEVMGlobalExitRoot public constant globalExitRootManager = + IBasePolygonZkEVMGlobalExitRoot( + 0xa40D5f56745a118D0906a34E69aeC8C0Db1cB8fA + ); // Last updated deposit count to the global exit root manager uint32 public lastUpdatedDepositCount; @@ -83,27 +90,35 @@ contract PolygonZkEVMGasTokenBridge is /** * @param _networkID networkID - * @param _globalExitRootManager global exit root manager address + * @param _gasTokenAddress networkID + * @param _gasTokenNetwork networkID * @notice The value of `_polygonZkEVMaddress` on the L2 deployment of the contract will be address(0), so * emergency state is not possible for the L2 deployment of the bridge, intentionally */ function initialize( uint32 _networkID, - IBasePolygonZkEVMGlobalExitRoot _globalExitRootManager, address _gasTokenAddress, - uint32 _gasTokenNetwork, - TokenWrapped _WETHToken + uint32 _gasTokenNetwork ) external virtual initializer { networkID = _networkID; - globalExitRootManager = _globalExitRootManager; // check native token TODO // Set gas token - gasTokenAddress = _gasTokenAddress; - gasTokenNetwork = _gasTokenNetwork; - - // set WETH - WETHToken = _WETHToken; + if (gasTokenAddress == address(0)) { + if (gasTokenNetwork != 0) { + revert(); + } + //WETHToken, gasTokenAddress and gasTokenNetwork will be address 0 + } else { + // Gas token + gasTokenAddress = _gasTokenAddress; + gasTokenNetwork = _gasTokenNetwork; // review check same network!! + WETHToken = (new TokenWrapped){salt: bytes32(0)}( + "Wrapped Ether", + "WETH", + 18 + ); + } // Initialize OZ contracts __ReentrancyGuard_init(); diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index d5910a8f5..255e63735 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -16,6 +16,7 @@ import "./lib/PolygonAccessControlUpgradeable.sol"; import "../interfaces/IVerifierRollup.sol"; // TODO change name to network +// TODO check contract slots! /** * Contract responsible for managing the exit roots across multiple Rollups @@ -83,7 +84,6 @@ contract PolygonRollupManager is uint64 rollupTypeID; uint8 rollupCompatibilityID; } - // review, description?¿ /** * @notice Struct to store the pending states @@ -493,7 +493,7 @@ contract PolygonRollupManager is _setupRole(ADD_ROLLUP_TYPE_ROLE, timelock); _setupRole(ADD_EXISTING_ROLLUP_ROLE, timelock); // role fees - // role rst of parameters + // role rest of parameters // Even this role can only update to an already added verifier/consensus // Could break the compatibility of them, changing the virtual state @@ -527,32 +527,6 @@ contract PolygonRollupManager is // Rollups management functions /////////////////////////////////////////////// - /** - * @notice Add a new zkEVM type - * @param consensusAddress new consensus implementation - * @param verifierAddress new verifier address - * @param forkID forkID of the verifier - * @param genesis genesis block of the zkEVM - * @param description description of the zkEVM type - */ - function addNewRollupType( - address consensusAddress, - IVerifierRollup verifierAddress, - uint64 forkID, - bytes32 genesis, - uint8 rollupCompatibilityID, - string memory description - ) external onlyRole(ADD_ROLLUP_TYPE_ROLE) { - _addNewRollupType( - consensusAddress, - verifierAddress, - forkID, - genesis, - rollupCompatibilityID, - description - ); - } - /** * @notice Add a new zkEVM type * @param consensusImplementation new consensus implementation @@ -561,14 +535,14 @@ contract PolygonRollupManager is * @param genesis genesis block of the zkEVM * @param description description of the zkEVM type */ - function _addNewRollupType( + function addNewRollupType( address consensusImplementation, IVerifierRollup verifier, uint64 forkID, bytes32 genesis, uint8 rollupCompatibilityID, string memory description - ) internal { + ) external onlyRole(ADD_ROLLUP_TYPE_ROLE) { // nullify rollup type?¿ review hash(verifier, implementation, genesis) // review check address are not 0? diff --git a/contracts/v2/lib/PolygonAccessControlUpgradeable.sol b/contracts/v2/lib/PolygonAccessControlUpgradeable.sol index 932db0957..574b6555d 100644 --- a/contracts/v2/lib/PolygonAccessControlUpgradeable.sol +++ b/contracts/v2/lib/PolygonAccessControlUpgradeable.sol @@ -14,6 +14,7 @@ import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; * - 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 */ abstract contract PolygonAccessControlUpgradeable is Initializable, @@ -34,6 +35,11 @@ abstract contract PolygonAccessControlUpgradeable is bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; + /** + * @dev Thrown when the addres does not have the required role + */ + error AddressDoNotHaveRequiredRole(); + /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. @@ -80,16 +86,7 @@ abstract contract PolygonAccessControlUpgradeable is */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { - revert( - string( - abi.encodePacked( - "AccessControl: account ", - StringsUpgradeable.toHexString(account), - " is missing role ", - StringsUpgradeable.toHexString(uint256(role), 32) - ) - ) - ); + revert AddressDoNotHaveRequiredRole(); } } diff --git a/hardhat.config.js b/hardhat.config.js index a7fe4b458..1d1ad9b91 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -65,6 +65,17 @@ module.exports = { }, }, ], + overrides: { + "contracts/v2/PolygonRollupManager.sol": { + version: '0.8.20', + settings: { + optimizer: { + enabled: true, + runs: 99, + }, + }, + } + } }, networks: { mainnet: { From 2f1efa10446a96947cda767c86e8a5e927cbc66a Mon Sep 17 00:00:00 2001 From: invocamanman Date: Fri, 6 Oct 2023 07:37:13 +0200 Subject: [PATCH 027/230] fix bridge L2 --- ...kenBridge.sol => PolygonZkEVMBridgeL2.sol} | 165 +++++++++++++----- contracts/v2/L2/WETHzkEVM.sol | 122 ------------- contracts/v2/PolygonZkEVMBridgeV2.sol | 22 +-- ...Bridge.sol => IPolygonZkEVMBaseBridge.sol} | 10 +- .../v2/interfaces/IPolygonZkEVMBridgeL2.sol | 29 +++ .../v2/interfaces/IPolygonZkEVMBridgeV2.sol | 109 +----------- 6 files changed, 163 insertions(+), 294 deletions(-) rename contracts/v2/L2/{PolygonZkEVMGasTokenBridge.sol => PolygonZkEVMBridgeL2.sol} (87%) delete mode 100644 contracts/v2/L2/WETHzkEVM.sol rename contracts/v2/interfaces/{IPolygonZkEVMGasTokenBridge.sol => IPolygonZkEVMBaseBridge.sol} (93%) create mode 100644 contracts/v2/interfaces/IPolygonZkEVMBridgeL2.sol diff --git a/contracts/v2/L2/PolygonZkEVMGasTokenBridge.sol b/contracts/v2/L2/PolygonZkEVMBridgeL2.sol similarity index 87% rename from contracts/v2/L2/PolygonZkEVMGasTokenBridge.sol rename to contracts/v2/L2/PolygonZkEVMBridgeL2.sol index 0966fd604..7c6be6d09 100644 --- a/contracts/v2/L2/PolygonZkEVMGasTokenBridge.sol +++ b/contracts/v2/L2/PolygonZkEVMBridgeL2.sol @@ -7,7 +7,7 @@ import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeab import "../../lib/TokenWrapped.sol"; import "../../interfaces/IBasePolygonZkEVMGlobalExitRoot.sol"; import "../../interfaces/IBridgeMessageReceiver.sol"; -import "../interfaces/IPolygonZkEVMGasTokenBridge.sol"; +import "../interfaces/IPolygonZkEVMBridgeL2.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol"; import "../../lib/GlobalExitRootLib.sol"; @@ -19,10 +19,7 @@ import "../../lib/GlobalExitRootLib.sol"; * PolygonZkEVMBridge that will be deployed on both networks Ethereum and Polygon zkEVM * Contract responsible to manage the token interactions with other networks */ -contract PolygonZkEVMGasTokenBridge is - DepositContractV2, - IPolygonZkEVMGasTokenBridge -{ +contract PolygonZkEVMBridgeL2 is DepositContractV2, IPolygonZkEVMBridgeL2 { using SafeERC20Upgradeable for IERC20Upgradeable; // Wrapped Token information struct @@ -102,15 +99,15 @@ contract PolygonZkEVMGasTokenBridge is ) external virtual initializer { networkID = _networkID; - // check native token TODO // Set gas token if (gasTokenAddress == address(0)) { + // gas token will be ether if (gasTokenNetwork != 0) { - revert(); + revert GasTokenNetworkMustBeZeroOnEther(); } - //WETHToken, gasTokenAddress and gasTokenNetwork will be address 0 + //WETHToken, gasTokenAddress and gasTokenNetwork will be 0 } else { - // Gas token + // Gas token will be an erc20 gasTokenAddress = _gasTokenAddress; gasTokenNetwork = _gasTokenNetwork; // review check same network!! WETHToken = (new TokenWrapped){salt: bytes32(0)}( @@ -187,7 +184,6 @@ contract PolygonZkEVMGasTokenBridge is bytes memory metadata; uint256 leafAmount = amount; - // Check if it's gas token if (token == address(0)) { // Check gas token transfer if (msg.value != amount) { @@ -204,12 +200,12 @@ contract PolygonZkEVMGasTokenBridge is } // Check if it's WETH + // In case ether is the native token, WETHToken will be 0, and the address 0 is already checked if (token == address(WETHToken)) { // Burn tokens TokenWrapped(token).burn(msg.sender, amount); - originNetwork = _MAINNET_NETWORK_ID; - originTokenAddress = address(0); + // Both origin network and originTokenAddress will be 0 } else { TokenInformation memory tokenInfo = wrappedTokenToTokenInfo[ token @@ -291,38 +287,89 @@ contract PolygonZkEVMGasTokenBridge is * @notice Bridge message and send ETH value * @param destinationNetwork Network destination * @param destinationAddress Address destination - * @param amountWETH Amount of WETH tokens * @param forceUpdateGlobalExitRoot Indicates if the new global exit root is updated or not * @param metadata Message metadata */ function bridgeMessage( uint32 destinationNetwork, address destinationAddress, - uint256 amountWETH, bool forceUpdateGlobalExitRoot, bytes calldata metadata ) external payable { - if ( - destinationNetwork == networkID // destinationNetwork >= rollupManager.rollupCount() ?¿ TODO - ) { - revert DestinationNetworkInvalid(); + // If exist a gas token, only let call this function without value + if (address(WETHToken) != address(0) && msg.value != 0) { + revert NoValueInMessagesOnGasTokenNetworks(); } - // Check msg.value is 0 for messages - if (msg.value != 0) { - revert MsgValueNotZero(); + _bridgeMessage( + destinationNetwork, + destinationAddress, + msg.value, + forceUpdateGlobalExitRoot, + metadata + ); + } + + /** + * @notice Bridge message and send ETH value + * @param destinationNetwork Network destination + * @param destinationAddress Address destination + * @param amountWETH Amount of WETH tokens + * @param forceUpdateGlobalExitRoot Indicates if the new global exit root is updated or not + * @param metadata Message metadata + */ + function bridgeMessageWETH( + uint32 destinationNetwork, + address destinationAddress, + uint256 amountWETH, + bool forceUpdateGlobalExitRoot, + bytes calldata metadata + ) external { + // if native token is ether, disable this function + if (address(WETHToken) == address(0)) { + revert NativeTokenIsEther(); } // Burn wETH tokens WETHToken.burn(msg.sender, amountWETH); + _bridgeMessage( + destinationNetwork, + destinationAddress, + amountWETH, + forceUpdateGlobalExitRoot, + metadata + ); + } + + /** + * @notice Bridge message and send ETH value + * @param destinationNetwork Network destination + * @param destinationAddress Address destination + * @param amountEther Amount of ether along with the message + * @param forceUpdateGlobalExitRoot Indicates if the new global exit root is updated or not + * @param metadata Message metadata + */ + function _bridgeMessage( + uint32 destinationNetwork, + address destinationAddress, + uint256 amountEther, + bool forceUpdateGlobalExitRoot, + bytes calldata metadata + ) internal { + if ( + destinationNetwork == networkID // TODO destinationNetwork >= rollupManager.rollupCount() ?¿ + ) { + revert DestinationNetworkInvalid(); + } + emit BridgeEvent( _LEAF_TYPE_MESSAGE, networkID, msg.sender, destinationNetwork, destinationAddress, - amountWETH, + amountEther, metadata, uint32(depositCount) ); @@ -334,7 +381,7 @@ contract PolygonZkEVMGasTokenBridge is msg.sender, destinationNetwork, destinationAddress, - amountWETH, + amountEther, keccak256(metadata) ) ); @@ -397,8 +444,19 @@ contract PolygonZkEVMGasTokenBridge is // Transfer funds if (originTokenAddress == address(0)) { - // Claim wETH - WETHToken.mint(destinationAddress, amount); + if (address(WETHToken) == address(0)) { + // Ether is the native token + /* solhint-disable avoid-low-level-calls */ + (bool success, ) = destinationAddress.call{value: amount}( + new bytes(0) + ); + if (!success) { + revert EtherTransferFailed(); + } + } else { + // Claim wETH + WETHToken.mint(destinationAddress, amount); + } } else { // Check if it's gas token if ( @@ -534,17 +592,32 @@ contract PolygonZkEVMGasTokenBridge is ) ); - // mint wETH tokens - WETHToken.mint(destinationAddress, amount); - // Execute message - /* solhint-disable avoid-low-level-calls */ - (bool success, ) = destinationAddress.call( - abi.encodeCall( - IBridgeMessageReceiver.onMessageReceived, - (originAddress, originNetwork, metadata) - ) - ); + bool success; + if (address(WETHToken) == address(0)) { + // Native token is ether + // Transfer ether + /* solhint-disable avoid-low-level-calls */ + (success, ) = destinationAddress.call{value: amount}( + abi.encodeCall( + IBridgeMessageReceiver.onMessageReceived, + (originAddress, originNetwork, metadata) + ) + ); + } else { + // mint wETH tokens + WETHToken.mint(destinationAddress, amount); + + // Execute message + /* solhint-disable avoid-low-level-calls */ + (success, ) = destinationAddress.call( + abi.encodeCall( + IBridgeMessageReceiver.onMessageReceived, + (originAddress, originNetwork, metadata) + ) + ); + } + if (!success) { revert MessageFailed(); } @@ -645,7 +718,7 @@ contract PolygonZkEVMGasTokenBridge is } uint32 leafIndex; - uint32 originNetwork; + uint32 sourceBridgeNetwork; // Get origin network from global index if (globalIndex & _GLOBAL_INDEX_MAINNET_FLAG == 1) { @@ -667,7 +740,7 @@ contract PolygonZkEVMGasTokenBridge is } else { // it's a rollup, therefore we have to get the origin network uint32 indexRollup = uint32(globalIndex >> 32); - originNetwork = indexRollup + 1; + sourceBridgeNetwork = indexRollup + 1; // last 32 bits are leafIndex leafIndex = uint32(globalIndex); @@ -686,30 +759,30 @@ contract PolygonZkEVMGasTokenBridge is } // Set and check nullifier - _setAndCheckClaimed(leafIndex, originNetwork); + _setAndCheckClaimed(leafIndex, sourceBridgeNetwork); } /** * @notice Function to check if an index is claimed or not * @param leafIndex Index - * @param originNetwork origin network + * @param sourceBridgeNetwork origin network */ function isClaimed( uint32 leafIndex, - uint32 originNetwork + uint32 sourceBridgeNetwork ) external view returns (bool) { uint256 globalIndex; // For consistency with the previous setted nullifiers if ( networkID == _MAINNET_NETWORK_ID && - originNetwork == _ZKEVM_NETWORK_ID + sourceBridgeNetwork == _ZKEVM_NETWORK_ID ) { globalIndex = uint256(leafIndex); } else { globalIndex = uint256(leafIndex) + - uint256(originNetwork) * + uint256(sourceBridgeNetwork) * _MAX_LEAFS_PER_NETWORK; } (uint256 wordPos, uint256 bitPos) = _bitmapPositions(globalIndex); @@ -720,24 +793,24 @@ contract PolygonZkEVMGasTokenBridge is /** * @notice Function to check that an index is not claimed and set it as claimed * @param leafIndex Index - * @param originNetwork origin network + * @param sourceBridgeNetwork origin network */ function _setAndCheckClaimed( uint32 leafIndex, - uint32 originNetwork + uint32 sourceBridgeNetwork ) private { uint256 globalIndex; // For consistency with the previous setted nullifiers if ( networkID == _MAINNET_NETWORK_ID && - originNetwork == _ZKEVM_NETWORK_ID + sourceBridgeNetwork == _ZKEVM_NETWORK_ID ) { globalIndex = uint256(leafIndex); } else { globalIndex = uint256(leafIndex) + - uint256(originNetwork) * + uint256(sourceBridgeNetwork) * _MAX_LEAFS_PER_NETWORK; } (uint256 wordPos, uint256 bitPos) = _bitmapPositions(globalIndex); diff --git a/contracts/v2/L2/WETHzkEVM.sol b/contracts/v2/L2/WETHzkEVM.sol deleted file mode 100644 index b1b42e857..000000000 --- a/contracts/v2/L2/WETHzkEVM.sol +++ /dev/null @@ -1,122 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -// Implementation of permit based on https://github.com/WETH10/WETH10/blob/main/contracts/WETH10.sol -pragma solidity 0.8.20; - -import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; - -contract WETHzkEVM is ERC20 { - // Domain typehash - bytes32 public constant DOMAIN_TYPEHASH = - keccak256( - "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" - ); - // Permit typehash - bytes32 public constant PERMIT_TYPEHASH = - keccak256( - "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" - ); - - // Version - string public constant VERSION = "1"; - - // Chain id on deployment - uint256 public immutable deploymentChainId; - - // Domain separator calculated on deployment - bytes32 private immutable _DEPLOYMENT_DOMAIN_SEPARATOR; - - // PolygonZkEVM Bridge address - address public immutable bridgeAddress; - - // Permit nonces - mapping(address => uint256) public nonces; - - modifier onlyBridge() { - require( - msg.sender == bridgeAddress, - "TokenWrapped::onlyBridge: Not PolygonZkEVMBridge" - ); - _; - } - - constructor(address _bridgeAddress) ERC20("Wrapped Ether", "WETH") { - bridgeAddress = _bridgeAddress; - deploymentChainId = block.chainid; - _DEPLOYMENT_DOMAIN_SEPARATOR = _calculateDomainSeparator(block.chainid); - } - - function mint(address to, uint256 value) external onlyBridge { - _mint(to, value); - } - - // Notice that is not require to approve wrapped tokens to use the bridge - function burn(address account, uint256 value) external onlyBridge { - _burn(account, value); - } - - // Permit relative functions - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external { - require( - block.timestamp <= deadline, - "TokenWrapped::permit: Expired permit" - ); - - bytes32 hashStruct = keccak256( - abi.encode( - PERMIT_TYPEHASH, - owner, - spender, - value, - nonces[owner]++, - deadline - ) - ); - - bytes32 digest = keccak256( - abi.encodePacked("\x19\x01", DOMAIN_SEPARATOR(), hashStruct) - ); - - address signer = ecrecover(digest, v, r, s); - require( - signer != address(0) && signer == owner, - "TokenWrapped::permit: Invalid signature" - ); - - _approve(owner, spender, value); - } - - /** - * @notice Calculate domain separator, given a chainID. - * @param chainId Current chainID - */ - function _calculateDomainSeparator( - uint256 chainId - ) private view returns (bytes32) { - return - keccak256( - abi.encode( - DOMAIN_TYPEHASH, - keccak256(bytes(name())), - keccak256(bytes(VERSION)), - chainId, - address(this) - ) - ); - } - - /// @dev Return the DOMAIN_SEPARATOR. - function DOMAIN_SEPARATOR() public view returns (bytes32) { - return - block.chainid == deploymentChainId - ? _DEPLOYMENT_DOMAIN_SEPARATOR - : _calculateDomainSeparator(block.chainid); - } -} diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index 19883e8f0..6d59c570c 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -603,7 +603,7 @@ contract PolygonZkEVMBridgeV2 is } uint32 leafIndex; - uint32 originNetwork; // TODO renaming sourceBridgeNetwork + uint32 sourceBridgeNetwork; // Get origin network from global index if (globalIndex & _GLOBAL_INDEX_MAINNET_FLAG == 1) { @@ -625,7 +625,7 @@ contract PolygonZkEVMBridgeV2 is } else { // it's a rollup, therefore we have to get the origin network uint32 indexRollup = uint32(globalIndex >> 32); - originNetwork = indexRollup + 1; + sourceBridgeNetwork = indexRollup + 1; // last 32 bits are leafIndex leafIndex = uint32(globalIndex); @@ -644,30 +644,30 @@ contract PolygonZkEVMBridgeV2 is } // Set and check nullifier - _setAndCheckClaimed(leafIndex, originNetwork); + _setAndCheckClaimed(leafIndex, sourceBridgeNetwork); } /** * @notice Function to check if an index is claimed or not * @param leafIndex Index - * @param originNetwork origin network + * @param sourceBridgeNetwork origin network */ function isClaimed( uint32 leafIndex, - uint32 originNetwork + uint32 sourceBridgeNetwork ) external view returns (bool) { uint256 globalIndex; // For consistency with the previous setted nullifiers if ( networkID == _MAINNET_NETWORK_ID && - originNetwork == _ZKEVM_NETWORK_ID + sourceBridgeNetwork == _ZKEVM_NETWORK_ID ) { globalIndex = uint256(leafIndex); } else { globalIndex = uint256(leafIndex) + - uint256(originNetwork) * + uint256(sourceBridgeNetwork) * _MAX_LEAFS_PER_NETWORK; } (uint256 wordPos, uint256 bitPos) = _bitmapPositions(globalIndex); @@ -678,24 +678,24 @@ contract PolygonZkEVMBridgeV2 is /** * @notice Function to check that an index is not claimed and set it as claimed * @param leafIndex Index - * @param originNetwork origin network + * @param sourceBridgeNetwork origin network */ function _setAndCheckClaimed( uint32 leafIndex, - uint32 originNetwork + uint32 sourceBridgeNetwork ) private { uint256 globalIndex; // For consistency with the previous setted nullifiers if ( networkID == _MAINNET_NETWORK_ID && - originNetwork == _ZKEVM_NETWORK_ID + sourceBridgeNetwork == _ZKEVM_NETWORK_ID ) { globalIndex = uint256(leafIndex); } else { globalIndex = uint256(leafIndex) + - uint256(originNetwork) * + uint256(sourceBridgeNetwork) * _MAX_LEAFS_PER_NETWORK; } (uint256 wordPos, uint256 bitPos) = _bitmapPositions(globalIndex); diff --git a/contracts/v2/interfaces/IPolygonZkEVMGasTokenBridge.sol b/contracts/v2/interfaces/IPolygonZkEVMBaseBridge.sol similarity index 93% rename from contracts/v2/interfaces/IPolygonZkEVMGasTokenBridge.sol rename to contracts/v2/interfaces/IPolygonZkEVMBaseBridge.sol index 503ba87f8..c7f9bc36c 100644 --- a/contracts/v2/interfaces/IPolygonZkEVMGasTokenBridge.sol +++ b/contracts/v2/interfaces/IPolygonZkEVMBaseBridge.sol @@ -1,13 +1,8 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.20; - -interface IPolygonZkEVMGasTokenBridge { - /** - * @dev Thrown when sender is not the PolygonZkEVM address - */ - error OnlyPolygonZkEVM(); +pragma solidity ^0.8.20; +interface IPolygonZkEVMBaseBridge { /** * @dev Thrown when the destination network is invalid */ @@ -80,7 +75,6 @@ interface IPolygonZkEVMGasTokenBridge { function bridgeMessage( uint32 destinationNetwork, address destinationAddress, - uint256 amountWETH, bool forceUpdateGlobalExitRoot, bytes calldata metadata ) external payable; diff --git a/contracts/v2/interfaces/IPolygonZkEVMBridgeL2.sol b/contracts/v2/interfaces/IPolygonZkEVMBridgeL2.sol new file mode 100644 index 000000000..a6b23c527 --- /dev/null +++ b/contracts/v2/interfaces/IPolygonZkEVMBridgeL2.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: AGPL-3.0 + +pragma solidity 0.8.20; +import "./IPolygonZkEVMBaseBridge.sol"; + +interface IPolygonZkEVMBridgeL2 is IPolygonZkEVMBaseBridge { + /** + * @dev Thrown when the permit data contains an invalid signature + */ + error NativeTokenIsEther(); + + /** + * @dev Thrown when the permit data contains an invalid signature + */ + error NoValueInMessagesOnGasTokenNetworks(); + + /** + * @dev Thrown when the permit data contains an invalid signature + */ + error GasTokenNetworkMustBeZeroOnEther(); + + function bridgeMessageWETH( + uint32 destinationNetwork, + address destinationAddress, + uint256 amountWETH, + bool forceUpdateGlobalExitRoot, + bytes calldata metadata + ) external; +} diff --git a/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol b/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol index f0a1f9509..e7a885e62 100644 --- a/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol +++ b/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol @@ -1,119 +1,14 @@ // SPDX-License-Identifier: AGPL-3.0 pragma solidity ^0.8.20; +import "./IPolygonZkEVMBaseBridge.sol"; -interface IPolygonZkEVMBridgeV2 { +interface IPolygonZkEVMBridgeV2 is IPolygonZkEVMBaseBridge { /** * @dev Thrown when sender is not the rollup manager */ error OnlyRollupManager(); - /** - * @dev Thrown when the destination network is invalid - */ - error DestinationNetworkInvalid(); - - /** - * @dev Thrown when the amount does not match msg.value - */ - error AmountDoesNotMatchMsgValue(); - - /** - * @dev Thrown when user is bridging tokens and is also sending a value - */ - error MsgValueNotZero(); - - /** - * @dev Thrown when the Ether transfer on claimAsset fails - */ - error EtherTransferFailed(); - - /** - * @dev Thrown when the message transaction on claimMessage fails - */ - error MessageFailed(); - - /** - * @dev Thrown when the global exit root does not exist - */ - error GlobalExitRootInvalid(); - - /** - * @dev Thrown when the smt proof does not match - */ - error InvalidSmtProof(); - - /** - * @dev Thrown when an index is already claimed - */ - error AlreadyClaimed(); - - /** - * @dev Thrown when the owner of permit does not match the sender - */ - error NotValidOwner(); - - /** - * @dev Thrown when the spender of the permit does not match this contract address - */ - error NotValidSpender(); - - /** - * @dev Thrown when the amount of the permit does not match - */ - error NotValidAmount(); - - /** - * @dev Thrown when the permit data contains an invalid signature - */ - error NotValidSignature(); - - function bridgeAsset( - uint32 destinationNetwork, - address destinationAddress, - uint256 amount, - address token, - bool forceUpdateGlobalExitRoot, - bytes calldata permitData - ) external payable; - - function bridgeMessage( - uint32 destinationNetwork, - address destinationAddress, - bool forceUpdateGlobalExitRoot, - bytes calldata metadata - ) external payable; - - function claimAsset( - bytes32[32] calldata smtProofLocalExitRoot, - bytes32[32] calldata smtProofRollupExitRoot, - uint256 globalIndex, - bytes32 mainnetExitRoot, - bytes32 rollupExitRoot, - uint32 originNetwork, - address originTokenAddress, - uint32 destinationNetwork, - address destinationAddress, - uint256 amount, - bytes calldata metadata - ) external; - - function claimMessage( - bytes32[32] calldata smtProofLocalExitRoot, - bytes32[32] calldata smtProofRollupExitRoot, - uint256 globalIndex, - bytes32 mainnetExitRoot, - bytes32 rollupExitRoot, - uint32 originNetwork, - address originAddress, - uint32 destinationNetwork, - address destinationAddress, - uint256 amount, - bytes calldata metadata - ) external; - - function updateGlobalExitRoot() external; - function activateEmergencyState() external; function deactivateEmergencyState() external; From ad90ea24f0148066825d4161c6888c52950773a6 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Fri, 6 Oct 2023 10:14:43 +0200 Subject: [PATCH 028/230] almost there --- contracts/v2/PolygonRollupManager.sol | 284 +++++++++++------- .../CDKDataCommittee.sol | 0 .../PolygonDataComittee.sol | 0 .../zkEVM/PolygonZkEVMV2Upgraded.sol | 64 ++++ .../v2/interfaces/IPolygonRollupBase.sol | 3 + .../v2/interfaces/IPolygonRollupManager.sol | 5 + contracts/v2/lib/PolygonRollupBase.sol | 7 +- 7 files changed, 259 insertions(+), 104 deletions(-) rename contracts/v2/consensus/{validium => dataComittee}/CDKDataCommittee.sol (100%) rename contracts/v2/consensus/{validium => dataComittee}/PolygonDataComittee.sol (100%) create mode 100644 contracts/v2/consensus/zkEVM/PolygonZkEVMV2Upgraded.sol diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index 255e63735..5179b2062 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -14,8 +14,9 @@ import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import "./lib/PolygonAccessControlUpgradeable.sol"; import "../interfaces/IVerifierRollup.sol"; +import "./consensus/zkEVM/PolygonZkEVMV2Upgraded.sol"; -// TODO change name to network +// TODO change name to network, networkID consistent // TODO check contract slots! /** @@ -131,44 +132,50 @@ contract PolygonRollupManager is // Exit merkle tree levels uint256 internal constant _EXIT_TREE_DEPTH = 32; + // L2 chain identifier + uint64 internal constant _ZKEVM_CHAINID = 1101; + + // zkEVM FORK ID + uint64 internal immutable _ZKEVM_FORKID = 5; + // Existing roles on rollup manager // Trusted aggregator will be able to verify batches without extra delau - bytes32 public constant ADD_ROLLUP_TYPE_ROLE = + bytes32 internal constant _ADD_ROLLUP_TYPE_ROLE = keccak256("ADD_ROLLUP_TYPE_ROLE"); // Trusted aggregator will be able to verify batches without extra delau - bytes32 public constant DELETE_ROLLUP_TYPE_ROLE = + bytes32 internal constant _DELETE_ROLLUP_TYPE_ROLE = keccak256("DELETE_ROLLUP_TYPE_ROLE"); - bytes32 public constant CREATE_ROLLUP_ROLE = + bytes32 internal constant _CREATE_ROLLUP_ROLE = keccak256("CREATE_ROLLUP_ROLE"); - bytes32 public constant ADD_EXISTING_ROLLUP_ROLE = + bytes32 internal constant _ADD_EXISTING_ROLLUP_ROLE = keccak256("ADD_EXISTING_ROLLUP_ROLE"); - bytes32 public constant UPDATE_ROLLUP_ROLE = + bytes32 internal constant _UPDATE_ROLLUP_ROLE = keccak256("UPDATE_ROLLUP_ROLE"); // Trusted aggregator will be able to verify batches without extra delau - bytes32 public constant TRUSTED_AGGREGATOR_ROLE = + bytes32 internal constant _TRUSTED_AGGREGATOR_ROLE = keccak256("TRUSTED_AGGREGATOR_ROLE"); - bytes32 public constant TWEAK_PARAMETERS_ROLE = + bytes32 internal constant _TWEAK_PARAMETERS_ROLE = keccak256("TWEAK_PARAMETERS_ROLE"); // Will be able to set the current batch fee - bytes32 public constant SET_FEE_ROLE = keccak256("SET_FEE_ROLE"); + bytes32 internal constant _SET_FEE_ROLE = keccak256("SET_FEE_ROLE"); - bytes32 public constant STOP_EMERGENCY_ROLE = + bytes32 internal constant _STOP_EMERGENCY_ROLE = keccak256("STOP_EMERGENCY_ROLE"); // Trusted aggregator will be able to verify batches without extra delau - bytes32 public constant EMERGENCY_COUNCIL_ROLE = + bytes32 internal constant _EMERGENCY_COUNCIL_ROLE = keccak256("EMERGENCY_COUNCIL_ROLE"); // Will be able to update the emergency council - bytes32 public constant EMERGENCY_COUNCIL_ADMIN = + bytes32 internal constant _EMERGENCY_COUNCIL_ADMIN = keccak256("EMERGENCY_COUNCIL_ADMIN"); // Global Exit Root interface @@ -214,20 +221,20 @@ contract PolygonRollupManager is uint64 internal _legacylastBatchSequenced; // Last forced batch included in the sequence - uint64 internal _legacylastForceBatchSequenced; + uint64 internal _legacyLastForceBatchSequenced; // Last forced batch - uint64 internal _legacylastForceBatch; + uint64 internal _legacyLastForceBatch; // Last batch verified by the aggregators - uint64 internal _legacylastVerifiedBatch; + uint64 internal _legacyLastVerifiedBatch; // Trusted aggregator address address internal _legacyTrustedAggregator; // State root mapping // BatchNum --> state root - mapping(uint64 => bytes32) internal _legacybatchNumToStateRoot; + mapping(uint64 => bytes32) internal _legacyBatchNumToStateRoot; // Trusted sequencer URL string internal _legacyTrustedSequencerURL; @@ -264,25 +271,31 @@ contract PolygonRollupManager is // Indicates if forced batches are disallowed bool internal _legacyIsForcedBatchDisallowed; + // Indicates the current version + uint256 internal _legacyVersion; + + // Last batch verified before the last upgrade + uint256 internal _legacyLastVerifiedBatchBeforeUpgrade; + // Number of rollup types added, every new consensus will be assigned sequencially a new ID - uint64 public rollupTypeCount; + uint32 public rollupTypeCount; // Consensus mapping mapping(uint64 rollupTypeID => RollupType) public rollupTypeMap; // Rollup Count - uint64 public rollupCount; + uint32 public rollupCount; // Rollups mapping - mapping(uint64 rollupID => RollupData) public rollupIDToRollupData; + mapping(uint32 rollupID => RollupData) public rollupIDToRollupData; // Rollups mapping // RollupAddress => rollupID - mapping(address rollupAddress => uint64 rollupID) public rollupAddressToID; + mapping(address rollupAddress => uint32 rollupID) public rollupAddressToID; // Rollups mapping // chainID => rollupID - mapping(uint64 chainID => uint64 rollupID) public chainIDToRollupID; + mapping(uint64 chainID => uint32 rollupID) public chainIDToRollupID; // Once a pending state exceeds this timeout it can be consolidated uint64 public pendingStateTimeout; @@ -320,7 +333,7 @@ contract PolygonRollupManager is * @dev Emitted when a new rollup type is added */ event AddNewRollupType( - uint64 rollupID, + uint32 rollupTypeID, address consensusImplementation, address verifier, uint64 forkID, @@ -331,14 +344,14 @@ contract PolygonRollupManager is /** * @dev Emitted when a a rolup type is deleted */ - event DeleteRollupType(uint64 rollupID); + event DeleteRollupType(uint32 rollupTypeID); /** * @dev Emitted when a new rollup is created based on a rollupType */ event CreateNewRollup( - uint64 rollupID, - uint64 rollupTypeID, + uint32 rollupID, + uint32 rollupTypeID, address rollupAddress, uint64 chainID ); @@ -347,7 +360,7 @@ contract PolygonRollupManager is * @dev Emitted when an existing rollup is added */ event AddExistingRollup( - uint64 rollupID, + uint32 rollupID, uint64 forkID, address rollupAddress, uint64 chainID, @@ -358,21 +371,21 @@ contract PolygonRollupManager is * @dev Emitted when a rollup is udpated */ event UpdateRollup( - uint64 rollupID, - uint64 newRollupTypeID, + uint32 rollupID, + uint32 newRollupTypeID, uint64 lastVerifiedBatchBeforeUpgrade ); /** * @dev Emitted when a new verifier is added */ - event OnSequenceBatches(uint64 rollupID, uint64 lastBatchSequenced); + event OnSequenceBatches(uint32 rollupID, uint64 lastBatchSequenced); /** * @dev Emitted when a aggregator verifies batches */ event VerifyBatches( - uint64 rollupID, + uint32 rollupID, uint64 indexed numBatch, bytes32 stateRoot, address indexed aggregator @@ -382,7 +395,7 @@ contract PolygonRollupManager is * @dev Emitted when a aggregator verifies batches */ event VerifyBatchesTrustedAggregator( - uint64 rollupID, + uint32 rollupID, uint64 indexed numBatch, bytes32 stateRoot, address indexed aggregator @@ -392,7 +405,7 @@ contract PolygonRollupManager is * @dev Emitted when pending state is consolidated */ event ConsolidatePendingState( - uint64 rollupID, + uint32 rollupID, uint64 indexed numBatch, bytes32 stateRoot, uint64 indexed pendingStateNum @@ -462,25 +475,17 @@ contract PolygonRollupManager is // TODO Add array fo consensus and verifiers and deploy zkEVM with legacy information function initialize( - uint64 _pendingStateTimeout, address _trustedAggregator, + uint64 _pendingStateTimeout, uint64 _trustedAggregatorTimeout, address admin, address timelock, - address emergencyCouncil + address emergencyCouncil, + PolygonZkEVMV2Upgraded polygonZkEVM, + IVerifierRollup zkEVMVerifier ) external initializer { trustedAggregator = _trustedAggregator; - - // Check initialize parameters - if (_pendingStateTimeout > _HALT_AGGREGATION_TIMEOUT) { - revert PendingStateTimeoutExceedHaltAggregationTimeout(); - } pendingStateTimeout = _pendingStateTimeout; - - if (_trustedAggregatorTimeout > _HALT_AGGREGATION_TIMEOUT) { - revert TrustedAggregatorTimeoutExceedHaltAggregationTimeout(); - } - trustedAggregatorTimeout = _trustedAggregatorTimeout; // Initialize OZ contracts @@ -490,37 +495,68 @@ contract PolygonRollupManager is // Timelock roles _setupRole(DEFAULT_ADMIN_ROLE, timelock); - _setupRole(ADD_ROLLUP_TYPE_ROLE, timelock); - _setupRole(ADD_EXISTING_ROLLUP_ROLE, timelock); + _setupRole(_ADD_ROLLUP_TYPE_ROLE, timelock); + _setupRole(_ADD_EXISTING_ROLLUP_ROLE, timelock); // role fees // role rest of parameters // Even this role can only update to an already added verifier/consensus // Could break the compatibility of them, changing the virtual state // review - _setupRole(UPDATE_ROLLUP_ROLE, timelock); + _setupRole(_UPDATE_ROLLUP_ROLE, timelock); // Admin roles - _setupRole(DELETE_ROLLUP_TYPE_ROLE, admin); - _setupRole(CREATE_ROLLUP_ROLE, admin); - _setupRole(STOP_EMERGENCY_ROLE, admin); - _setupRole(TRUSTED_AGGREGATOR_ROLE, admin); - _setupRole(TWEAK_PARAMETERS_ROLE, admin); + _setupRole(_DELETE_ROLLUP_TYPE_ROLE, admin); + _setupRole(_CREATE_ROLLUP_ROLE, admin); + _setupRole(_STOP_EMERGENCY_ROLE, admin); + _setupRole(_TRUSTED_AGGREGATOR_ROLE, admin); + _setupRole(_TWEAK_PARAMETERS_ROLE, admin); // review Could be another address?¿ - _setupRole(SET_FEE_ROLE, admin); + _setupRole(_SET_FEE_ROLE, admin); // Emergency council roles - _setupRole(EMERGENCY_COUNCIL_ROLE, emergencyCouncil); - _setupRole(EMERGENCY_COUNCIL_ADMIN, emergencyCouncil); - - // deploy zkEVM probably wont work bc initialize D: - - // TODO consisnten with the bridge, networkCount == networkID, zkEVm MUst be the 1 + _setupRole(_EMERGENCY_COUNCIL_ROLE, emergencyCouncil); + _setupRole(_EMERGENCY_COUNCIL_ADMIN, emergencyCouncil); + + // Initialize current zkEVM + RollupData storage currentZkEVM = _addExistingRollup( + IPolygonRollupBase(polygonZkEVM), + zkEVMVerifier, + _ZKEVM_FORKID, + _ZKEVM_CHAINID, + 0 // Rollup compatibility ID is 0 + ); - // batchNumToStateRoot copy zkevm aswell, + uint64 zkEVMLastBatchSequenced = _legacylastBatchSequenced; + uint64 zkEVMLastVerifiedBatch = _legacyLastVerifiedBatch; + if (zkEVMLastBatchSequenced != zkEVMLastVerifiedBatch) { + revert(); + } - // emit version review yes here! + // Copy variables from legacy + currentZkEVM.batchNumToStateRoot[ + zkEVMLastVerifiedBatch + ] = _legacyBatchNumToStateRoot[zkEVMLastVerifiedBatch]; + + currentZkEVM.sequencedBatches[ + zkEVMLastBatchSequenced + ] = _legacySequencedBatches[zkEVMLastBatchSequenced]; + + currentZkEVM.lastBatchSequenced = zkEVMLastBatchSequenced; + currentZkEVM.lastVerifiedBatch = zkEVMLastVerifiedBatch; + currentZkEVM.lastVerifiedBatchBeforeUpgrade = zkEVMLastVerifiedBatch; + // rollupType and rollupCompatibilityID will be both 0 + + // Initialize polygon zkevm + polygonZkEVM.initializeUpgrade( + _legacyAdmin, + _legacyTrustedSequencer, + _legacyTrustedSequencerURL, + _legacyNetworkName, + _legacySequencedBatches[zkEVMLastBatchSequenced].accInputHash, + _legacyLastTimestamp + ); } //////////////////////////////////////////////// @@ -542,11 +578,11 @@ contract PolygonRollupManager is bytes32 genesis, uint8 rollupCompatibilityID, string memory description - ) external onlyRole(ADD_ROLLUP_TYPE_ROLE) { + ) external onlyRole(_ADD_ROLLUP_TYPE_ROLE) { // nullify rollup type?¿ review hash(verifier, implementation, genesis) // review check address are not 0? - uint64 rollupTypeID = ++rollupTypeCount; + uint32 rollupTypeID = ++rollupTypeCount; rollupTypeMap[rollupTypeID] = RollupType({ consensusImplementation: consensusImplementation, @@ -573,8 +609,8 @@ contract PolygonRollupManager is * @param rollupTypeID Consensus address to obsolete */ function obsoleteRollupType( - uint64 rollupTypeID - ) external onlyRole(DELETE_ROLLUP_TYPE_ROLE) { + uint32 rollupTypeID + ) external onlyRole(_DELETE_ROLLUP_TYPE_ROLE) { if (rollupTypeID == 0 || rollupTypeID > rollupTypeCount) { revert RollupTypeDoesNotExist(); } @@ -594,13 +630,15 @@ contract PolygonRollupManager is * @param networkName network name of the new created rollup */ function createNewRollup( - uint64 rollupTypeID, + uint32 rollupTypeID, uint64 chainID, address admin, address trustedSequencer, + address gasTokenAddress, + uint32 gasTokenNetwork, string memory trustedSequencerURL, string memory networkName - ) external onlyRole(CREATE_ROLLUP_ROLE) { + ) external onlyRole(_CREATE_ROLLUP_ROLE) { // Check that rollup type exists if (rollupTypeID == 0 || rollupTypeID > rollupTypeCount) { revert RollupTypeDoesNotExist(); @@ -619,20 +657,25 @@ contract PolygonRollupManager is // Create a new Rollup, using a transparent proxy pattern // Consensus will be the implementation, and this contract the admin - uint64 rollupID = ++rollupCount; + uint32 rollupID = ++rollupCount; address rollupAddress = address( new TransparentUpgradeableProxy( rollupType.consensusImplementation, address(this), abi.encodeCall( IPolygonRollupBase.initialize, - (admin, trustedSequencer, trustedSequencerURL, networkName) // review parameters + ( + admin, + trustedSequencer, + rollupID, + gasTokenAddress, + gasTokenNetwork, + trustedSequencerURL, + networkName + ) ) ) ); - // TODO GENESIS MUST BE INITIALIZEWD with proper chainID, - //initialize(chainID, gasTOken, gasNetwork) - //in consensus contract generate proper encoding and singature // Set chainID nullifier chainIDToRollupID[chainID] = rollupID; @@ -669,13 +712,38 @@ contract PolygonRollupManager is uint64 chainID, bytes32 genesis, uint8 rollupCompatibilityID - ) external onlyRole(ADD_EXISTING_ROLLUP_ROLE) { + ) external onlyRole(_ADD_EXISTING_ROLLUP_ROLE) { // Check chainID nullifier if (chainIDToRollupID[chainID] != 0) { revert ChainIDAlreadyExist(); } - uint64 rollupID = ++rollupCount; + RollupData storage rollup = _addExistingRollup( + rollupAddress, + verifier, + forkID, + chainID, + rollupCompatibilityID + ); + rollup.batchNumToStateRoot[0] = genesis; + } + + /** + * @notice Add an already deployed rollup + * @param rollupAddress rollup address + * @param verifier verifier address, must be added before + * @param forkID chain id of the created rollup + * @param chainID chain id of the created rollup + * @param rollupCompatibilityID chain id of the created rollup + */ + function _addExistingRollup( + IPolygonRollupBase rollupAddress, + IVerifierRollup verifier, + uint64 forkID, + uint64 chainID, + uint8 rollupCompatibilityID + ) internal returns (RollupData storage rollup) { + uint32 rollupID = ++rollupCount; // Set chainID nullifier chainIDToRollupID[chainID] = rollupID; @@ -683,12 +751,11 @@ contract PolygonRollupManager is // Store rollup data rollupAddressToID[address(rollupAddress)] = rollupID; - RollupData storage rollup = rollupIDToRollupData[rollupID]; + rollup = rollupIDToRollupData[rollupID]; rollup.rollupContract = rollupAddress; rollup.forkID = forkID; rollup.verifier = verifier; rollup.chainID = chainID; - rollup.batchNumToStateRoot[0] = genesis; rollup.rollupCompatibilityID = rollupCompatibilityID; emit AddExistingRollup( @@ -711,16 +778,16 @@ contract PolygonRollupManager is */ function updateRollup( TransparentUpgradeableProxy rollupContract, - uint64 newRollupTypeID, + uint32 newRollupTypeID, bytes calldata upgradeData - ) external onlyRole(UPDATE_ROLLUP_ROLE) { + ) external onlyRole(_UPDATE_ROLLUP_ROLE) { // TODO Check new rollup type was not deleted? it would be sanity check // Check that rollup type exists if (newRollupTypeID == 0 || newRollupTypeID > rollupTypeCount) { revert RollupTypeDoesNotExist(); } - uint64 rollupID = rollupAddressToID[address(rollupContract)]; + uint32 rollupID = rollupAddressToID[address(rollupContract)]; if (rollupID == 0) { revert RollupMustExist(); } @@ -780,7 +847,7 @@ contract PolygonRollupManager is bytes32 newAccInputHash ) external ifNotEmergencyState returns (uint64) { // Check that the msg.sender is an added rollup - uint64 rollupID = rollupAddressToID[msg.sender]; + uint32 rollupID = rollupAddressToID[msg.sender]; if (rollupID == 0) { revert SenderMustBeRollup(); } @@ -828,7 +895,7 @@ contract PolygonRollupManager is * @param proof fflonk proof */ function verifyBatches( - uint64 rollupID, + uint32 rollupID, uint64 pendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, @@ -911,7 +978,7 @@ contract PolygonRollupManager is * @param proof fflonk proof */ function verifyBatchesTrustedAggregator( - uint64 rollupID, + uint32 rollupID, uint64 pendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, @@ -919,7 +986,7 @@ contract PolygonRollupManager is bytes32 newStateRoot, address beneficiary, bytes32[24] calldata proof - ) external onlyRole(TRUSTED_AGGREGATOR_ROLE) { + ) external onlyRole(_TRUSTED_AGGREGATOR_ROLE) { RollupData storage rollup = rollupIDToRollupData[rollupID]; _verifyAndRewardBatches( @@ -977,6 +1044,10 @@ contract PolygonRollupManager is bytes32 oldStateRoot; uint64 currentLastVerifiedBatch = _getLastVerifiedBatch(rollup); + if (initNumBatch < rollup.lastVerifiedBatchBeforeUpgrade) { + revert InitBatchMustMatchCurrentForkID(); + } + // Use pending state if specified, otherwise use consolidated state if (pendingStateNum != 0) { // Check that pending state exist @@ -1084,13 +1155,13 @@ contract PolygonRollupManager is * @param pendingStateNum Pending state to consolidate */ function consolidatePendingState( - uint64 rollupID, + uint32 rollupID, uint64 pendingStateNum ) external { RollupData storage rollup = rollupIDToRollupData[rollupID]; // Check if pending state can be consolidated // If trusted aggregator is the sender, do not check the timeout or the emergency state - if (!hasRole(TRUSTED_AGGREGATOR_ROLE, msg.sender)) { + if (!hasRole(_TRUSTED_AGGREGATOR_ROLE, msg.sender)) { if (isEmergencyState) { revert OnlyNotEmergencyState(); } @@ -1159,7 +1230,7 @@ contract PolygonRollupManager is * @param proof fflonk proof */ function overridePendingState( - uint64 rollupID, + uint32 rollupID, uint64 initPendingStateNum, uint64 finalPendingStateNum, uint64 initNumBatch, @@ -1167,7 +1238,7 @@ contract PolygonRollupManager is bytes32 newLocalExitRoot, bytes32 newStateRoot, bytes32[24] calldata proof - ) external onlyRole(TRUSTED_AGGREGATOR_ROLE) { + ) external onlyRole(_TRUSTED_AGGREGATOR_ROLE) { RollupData storage rollup = rollupIDToRollupData[rollupID]; _proveDistinctPendingState( @@ -1212,7 +1283,7 @@ contract PolygonRollupManager is * @param proof fflonk proof */ function proveNonDeterministicPendingState( - uint64 rollupID, + uint32 rollupID, uint64 initPendingStateNum, uint64 finalPendingStateNum, uint64 initNumBatch, @@ -1265,6 +1336,10 @@ contract PolygonRollupManager is ) internal view virtual { bytes32 oldStateRoot; + if (initNumBatch < rollup.lastVerifiedBatchBeforeUpgrade) { + revert InitBatchMustMatchCurrentForkID(); + } + // Use pending state if specified, otherwise use consolidated state if (initPendingStateNum != 0) { // Check that pending state exist @@ -1448,7 +1523,7 @@ contract PolygonRollupManager is * If not called by the owner must not have been aggregated in a _HALT_AGGREGATION_TIMEOUT period */ function activateEmergencyState() external { - if (!hasRole(EMERGENCY_COUNCIL_ROLE, msg.sender)) { + if (!hasRole(_EMERGENCY_COUNCIL_ROLE, msg.sender)) { if ( lastAggregationTimestamp + _HALT_AGGREGATION_TIMEOUT > block.timestamp @@ -1462,7 +1537,10 @@ contract PolygonRollupManager is /** * @notice Function to deactivate emergency state on both PolygonZkEVM and PolygonZkEVMBridge contracts */ - function deactivateEmergencyState() external onlyRole(STOP_EMERGENCY_ROLE) { + function deactivateEmergencyState() + external + onlyRole(_STOP_EMERGENCY_ROLE) + { // Deactivate emergency state on PolygonZkEVMBridge bridgeAddress.deactivateEmergencyState(); @@ -1491,7 +1569,7 @@ contract PolygonRollupManager is */ function setTrustedAggregator( address newTrustedAggregator - ) external onlyRole(TRUSTED_AGGREGATOR_ROLE) { + ) external onlyRole(_TRUSTED_AGGREGATOR_ROLE) { trustedAggregator = newTrustedAggregator; emit SetTrustedAggregator(newTrustedAggregator); @@ -1504,7 +1582,7 @@ contract PolygonRollupManager is */ function setTrustedAggregatorTimeout( uint64 newTrustedAggregatorTimeout - ) external onlyRole(TWEAK_PARAMETERS_ROLE) { + ) external onlyRole(_TWEAK_PARAMETERS_ROLE) { if (!isEmergencyState) { if (newTrustedAggregatorTimeout >= trustedAggregatorTimeout) { revert NewTrustedAggregatorTimeoutMustBeLower(); @@ -1522,7 +1600,7 @@ contract PolygonRollupManager is */ function setPendingStateTimeout( uint64 newPendingStateTimeout - ) external onlyRole(TWEAK_PARAMETERS_ROLE) { + ) external onlyRole(_TWEAK_PARAMETERS_ROLE) { if (!isEmergencyState) { if (newPendingStateTimeout >= pendingStateTimeout) { revert NewPendingStateTimeoutMustBeLower(); @@ -1539,7 +1617,7 @@ contract PolygonRollupManager is */ function setMultiplierBatchFee( uint16 newMultiplierBatchFee - ) external onlyRole(TWEAK_PARAMETERS_ROLE) { + ) external onlyRole(_TWEAK_PARAMETERS_ROLE) { if (newMultiplierBatchFee < 1000 || newMultiplierBatchFee > 1023) { revert InvalidRangeMultiplierBatchFee(); } @@ -1556,7 +1634,7 @@ contract PolygonRollupManager is */ function setVerifyBatchTimeTarget( uint64 newVerifyBatchTimeTarget - ) external onlyRole(TWEAK_PARAMETERS_ROLE) { + ) external onlyRole(_TWEAK_PARAMETERS_ROLE) { if (newVerifyBatchTimeTarget > 1 days) { revert InvalidRangeBatchTimeTarget(); } @@ -1568,7 +1646,7 @@ contract PolygonRollupManager is * @notice Allow to corresponding role to set the current batch fee * @param newBatchFee new batch fee */ - function setBatchFee(uint256 newBatchFee) external onlyRole(SET_FEE_ROLE) { + function setBatchFee(uint256 newBatchFee) external onlyRole(_SET_FEE_ROLE) { batchFee = newBatchFee; emit SetBatchFee(newBatchFee); } @@ -1597,7 +1675,7 @@ contract PolygonRollupManager is // In the first iteration the nodes will be the leafs which are the local exit roots of each network for (uint256 i = 0; i < currentNodes; i++) { - tmpTree[i] = rollupIDToRollupData[uint64(i)].lastLocalExitRoot; + tmpTree[i] = rollupIDToRollupData[uint32(i)].lastLocalExitRoot; } // This variable will keep track of the zero hashes @@ -1650,7 +1728,7 @@ contract PolygonRollupManager is * @notice Get the last verified batch */ function getLastVerifiedBatch( - uint64 rollupID + uint32 rollupID ) public view returns (uint64) { return _getLastVerifiedBatch(rollupIDToRollupData[rollupID]); } @@ -1676,7 +1754,7 @@ contract PolygonRollupManager is * Note that his function does not check if the pending state currently exists, or if it's consolidated already */ function isPendingStateConsolidable( - uint64 rollupID, + uint32 rollupID, uint64 pendingStateNum ) public view returns (bool) { return @@ -1737,7 +1815,7 @@ contract PolygonRollupManager is * @param newStateRoot New State root once the batch is processed */ function getInputSnarkBytes( - uint64 rollupID, + uint32 rollupID, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, @@ -1790,7 +1868,7 @@ contract PolygonRollupManager is } // Check that new state root is inside goldilocks field - if (!checkStateRootInsidePrime(uint256(newStateRoot))) { + if (!_checkStateRootInsidePrime(uint256(newStateRoot))) { revert NewStateRootNotInsidePrime(); } @@ -1809,9 +1887,9 @@ contract PolygonRollupManager is ); } - function checkStateRootInsidePrime( + function _checkStateRootInsidePrime( uint256 newStateRoot - ) public pure returns (bool) { + ) internal pure returns (bool) { if ( ((newStateRoot & _MAX_UINT_64) < _GOLDILOCKS_PRIME_FIELD) && (((newStateRoot >> 64) & _MAX_UINT_64) < _GOLDILOCKS_PRIME_FIELD) && diff --git a/contracts/v2/consensus/validium/CDKDataCommittee.sol b/contracts/v2/consensus/dataComittee/CDKDataCommittee.sol similarity index 100% rename from contracts/v2/consensus/validium/CDKDataCommittee.sol rename to contracts/v2/consensus/dataComittee/CDKDataCommittee.sol diff --git a/contracts/v2/consensus/validium/PolygonDataComittee.sol b/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol similarity index 100% rename from contracts/v2/consensus/validium/PolygonDataComittee.sol rename to contracts/v2/consensus/dataComittee/PolygonDataComittee.sol diff --git a/contracts/v2/consensus/zkEVM/PolygonZkEVMV2Upgraded.sol b/contracts/v2/consensus/zkEVM/PolygonZkEVMV2Upgraded.sol new file mode 100644 index 000000000..9ccccb987 --- /dev/null +++ b/contracts/v2/consensus/zkEVM/PolygonZkEVMV2Upgraded.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity ^0.8.20; + +import "../../lib/PolygonRollupBase.sol"; + +/** + * 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. + */ +contract PolygonZkEVMV2Upgraded is PolygonRollupBase { + /** + * @param _globalExitRootManager Global exit root manager address + * @param _matic MATIC token address + * @param _bridgeAddress Bridge address + * @param _rollupManager Global exit root manager address + */ + constructor( + IPolygonZkEVMGlobalExitRoot _globalExitRootManager, + IERC20Upgradeable _matic, + IPolygonZkEVMBridge _bridgeAddress, + PolygonRollupManager _rollupManager + ) + PolygonRollupBase( + _globalExitRootManager, + _matic, + _bridgeAddress, + _rollupManager + ) + {} + + /** + * @param _admin Admin address + * @param _trustedSequencer Trusted sequencer address + * @param _trustedSequencerURL Trusted sequencer URL + * @param _networkName L2 network name + * @param _lastAccInputHash Acc input hash + * @param _lastTimestamp Timestamp + */ + function initializeUpgrade( + address _admin, + address _trustedSequencer, + string memory _trustedSequencerURL, + string memory _networkName, + bytes32 _lastAccInputHash, + uint64 _lastTimestamp + ) external onlyRollupManager initializer { + admin = _admin; + trustedSequencer = _trustedSequencer; + + trustedSequencerURL = _trustedSequencerURL; + networkName = _networkName; + + // zkEVM Upgraded variables + lastAccInputHash = _lastAccInputHash; + lastTimestamp = _lastTimestamp; + + // Constant deployment variables + forceBatchTimeout = 5 days; + } +} diff --git a/contracts/v2/interfaces/IPolygonRollupBase.sol b/contracts/v2/interfaces/IPolygonRollupBase.sol index 71320c57f..5b3522f90 100644 --- a/contracts/v2/interfaces/IPolygonRollupBase.sol +++ b/contracts/v2/interfaces/IPolygonRollupBase.sol @@ -6,6 +6,9 @@ interface IPolygonRollupBase { function initialize( address _admin, address _trustedSequencer, + uint32 networkID, + address gasTokenAddress, + uint32 gasTokenNetwork, string memory _trustedSequencerURL, string memory _networkName ) external; diff --git a/contracts/v2/interfaces/IPolygonRollupManager.sol b/contracts/v2/interfaces/IPolygonRollupManager.sol index 05fc8e4ff..0e10cdbbc 100644 --- a/contracts/v2/interfaces/IPolygonRollupManager.sol +++ b/contracts/v2/interfaces/IPolygonRollupManager.sol @@ -232,4 +232,9 @@ interface IPolygonRollupManager { * @dev When a rollup type does not exist */ error RollupTypeObsolete(); + + /** + * @dev When a rollup type does not exist + */ + error InitBatchMustMatchCurrentForkID(); } diff --git a/contracts/v2/lib/PolygonRollupBase.sol b/contracts/v2/lib/PolygonRollupBase.sol index b75a2e09a..f820ec0f7 100644 --- a/contracts/v2/lib/PolygonRollupBase.sol +++ b/contracts/v2/lib/PolygonRollupBase.sol @@ -244,9 +244,12 @@ contract PolygonRollupBase is function initialize( address _admin, address _trustedSequencer, + uint32 networkID, + address gasTokenAddress, + uint32 gasTokenNetwork, string memory _trustedSequencerURL, string memory _networkName - ) external virtual override initializer { + ) external virtual onlyRollupManager initializer { admin = _admin; trustedSequencer = _trustedSequencer; @@ -255,6 +258,8 @@ contract PolygonRollupBase is // Constant deployment variables forceBatchTimeout = 5 days; + + // TODO sequence } modifier onlyAdmin() { From 93e27e681801532e10a004f64aa0517145d528bd Mon Sep 17 00:00:00 2001 From: invocamanman Date: Fri, 6 Oct 2023 13:20:00 +0200 Subject: [PATCH 029/230] add initialize transaction --- .../v2/interfaces/IPolygonZkEVMV2Errors.sol | 5 + contracts/v2/lib/PolygonRollupBase.sol | 94 ++++++++++++++++++- 2 files changed, 98 insertions(+), 1 deletion(-) diff --git a/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol b/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol index 594e65be8..6d25fecff 100644 --- a/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol +++ b/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol @@ -12,4 +12,9 @@ interface IPolygonZkEVMV2Errors { * @dev Thrown when the caller is not the trusted sequencer */ error NotEnoughfeeTokenAmount(); + + /** + * @dev Thrown when the caller is not the trusted sequencer + */ + error InvalidInitializeTransaction(); } diff --git a/contracts/v2/lib/PolygonRollupBase.sol b/contracts/v2/lib/PolygonRollupBase.sol index f820ec0f7..95da17d33 100644 --- a/contracts/v2/lib/PolygonRollupBase.sol +++ b/contracts/v2/lib/PolygonRollupBase.sol @@ -11,6 +11,7 @@ import "../../interfaces/IPolygonZkEVMErrors.sol"; import "../interfaces/IPolygonZkEVMV2Errors.sol"; import "../PolygonRollupManager.sol"; import "../interfaces/IPolygonRollupBase.sol"; +import "../L2/PolygonZkEVMBridgeL2.sol"; /** * Contract responsible for managing the states and the updates of L2 network. @@ -97,6 +98,25 @@ contract PolygonRollupBase is // This should be a protection against someone that tries to generate huge chunk of invalid batches, and we can't prove otherwise before the pending timeout expires uint64 internal constant _MAX_VERIFY_BATCHES = 1000; + // List rlp: 1 listLenLen "0xf8" (0xf7 + 1), + listLen 1 "0x83" + // 1 nonce "0x80" + 1 gasPrice "0x80" + 5 gasLimit "0x8401c9c380" + 21 to "0x942a3dd3eb832af982ec71669e178424b10dca2ede" + // + 1 value "0x80" + 1 stringLenLen "0xb8" (0xb7 + 1) + stringLen 1 "0x64" + 100 bytes data ( signature 4 bytes + 3parameters*32bytes) = 131 bytes (0x83) + bytes public constant BASE_INITIALIZE_TX_BRIDGE = + "0xf88380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b864"; + + // Signature used to initialize the bridge + + // V parameter of the initialize signature + uint8 public constant SIGNATURE_INITIALIZE_TX_V = 27; + + // R parameter of the initialize signature + bytes32 public constant SIGNATURE_INITIALIZE_TX_R = + 0x00000000000000000000000000000000000000000000000000000005ca1ab1e0; + + // S parameter of the initialize signature + bytes32 public constant SIGNATURE_INITIALIZE_TX_S = + 0x000000000000000000000000000000000000000000000000000000005ca1ab1e; + // MATIC token address // review POL IERC20Upgradeable public immutable matic; @@ -259,7 +279,37 @@ contract PolygonRollupBase is // Constant deployment variables forceBatchTimeout = 5 days; - // TODO sequence + // Sequence transaction to initilize the bridge + + // Calculate transaction to initialize the bridge + bytes memory transaction = generateInitializeTransaction( + networkID, + gasTokenAddress, + gasTokenNetwork + ); + + bytes32 currentTransactionsHash = keccak256(transaction); + uint64 currentTimestamp = uint64(block.timestamp); + + bytes32 newAccInputHash = keccak256( + abi.encodePacked( + bytes32(0), // current acc Input hash + currentTransactionsHash, + bytes32(0), // Global exit root + currentTimestamp, + trustedSequencer + ) + ); + lastTimestamp = currentTimestamp; + lastAccInputHash = newAccInputHash; + + uint64 currentBatchSequenced = rollupManager.onSequenceBatches( + uint64(1), // num total batches + uint64(0), // num forced batches + newAccInputHash + ); + + emit SequenceBatches(currentBatchSequenced); } modifier onlyAdmin() { @@ -693,4 +743,46 @@ contract PolygonRollupBase is admin = pendingAdmin; emit AcceptAdminRole(pendingAdmin); } + + ////////////////// + // view/pure functions + ////////////////// + + /** + * @notice Get forced batch fee + */ + function generateInitializeTransaction( + uint32 networkID, + address gasTokenAddress, + uint32 gasTokenNetwork + ) public pure returns (bytes memory) { + // Check the ecrecover, as a sanity check, to not allow invalid transactions + bytes memory bytesToSign = abi.encodePacked( + BASE_INITIALIZE_TX_BRIDGE, + abi.encodeCall( + PolygonZkEVMBridgeL2.initialize, + (networkID, gasTokenAddress, gasTokenNetwork) + ) + ); + + address signer = ecrecover( + keccak256(bytesToSign), + SIGNATURE_INITIALIZE_TX_V, + SIGNATURE_INITIALIZE_TX_R, + SIGNATURE_INITIALIZE_TX_S + ); + + if (signer == address(0)) { + revert InvalidInitializeTransaction(); + } + + bytes memory transaction = abi.encodePacked( + bytesToSign, + SIGNATURE_INITIALIZE_TX_V, + SIGNATURE_INITIALIZE_TX_R, + SIGNATURE_INITIALIZE_TX_S + ); + + return transaction; + } } From c4b09e26ce7c6c8747a9088c7e01ee313c26a043 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Fri, 6 Oct 2023 15:44:32 +0200 Subject: [PATCH 030/230] add effective gas --- contracts/v2/L2/PolygonZkEVMBridgeL2.sol | 2 +- contracts/v2/PolygonRollupManager.sol | 8 +++++--- contracts/v2/lib/PolygonRollupBase.sol | 10 ++++++++-- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/contracts/v2/L2/PolygonZkEVMBridgeL2.sol b/contracts/v2/L2/PolygonZkEVMBridgeL2.sol index 7c6be6d09..ee649035a 100644 --- a/contracts/v2/L2/PolygonZkEVMBridgeL2.sol +++ b/contracts/v2/L2/PolygonZkEVMBridgeL2.sol @@ -109,7 +109,7 @@ contract PolygonZkEVMBridgeL2 is DepositContractV2, IPolygonZkEVMBridgeL2 { } else { // Gas token will be an erc20 gasTokenAddress = _gasTokenAddress; - gasTokenNetwork = _gasTokenNetwork; // review check same network!! + gasTokenNetwork = _gasTokenNetwork; WETHToken = (new TokenWrapped){salt: bytes32(0)}( "Wrapped Ether", "WETH", diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index 5179b2062..caaa9aecf 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -61,6 +61,7 @@ contract PolygonRollupManager is string description; } + // review POssible optimization rto reduce bytecode, put maps on another struct or double mapping /** * @notice Struct which to store the rollup data of each chain * @param accInputHash Hash chain that contains all the information to process a batch: @@ -81,7 +82,7 @@ contract PolygonRollupManager is uint64 lastVerifiedBatch; uint64 lastPendingState; uint64 lastPendingStateConsolidated; - uint64 lastVerifiedBatchBeforeUpgrade; // TODO ADD CHECK when verify + uint64 lastVerifiedBatchBeforeUpgrade; uint64 rollupTypeID; uint8 rollupCompatibilityID; } @@ -473,7 +474,6 @@ contract PolygonRollupManager is bridgeAddress = _bridgeAddress; } - // TODO Add array fo consensus and verifiers and deploy zkEVM with legacy information function initialize( address _trustedAggregator, uint64 _pendingStateTimeout, @@ -626,6 +626,8 @@ contract PolygonRollupManager is * @param chainID chainID * @param admin admin of the new created rollup * @param trustedSequencer trusted sequencer of the new created rollup + * @param gasTokenAddress Indicates the token address that will be used to pay gas fees in the new rollup + * @param gasTokenNetwork Indicates the native network of the token address * @param trustedSequencerURL trusted sequencer URL of the new created rollup * @param networkName network name of the new created rollup */ @@ -767,7 +769,7 @@ contract PolygonRollupManager is ); } - //review, should cehck that there are not sequenced batches eponding to be verified?¿? + //review, should check that there are not sequenced batches pending to be verified?¿? //this way no one can break the virtual state, ( but maybe is worth to break it) /** diff --git a/contracts/v2/lib/PolygonRollupBase.sol b/contracts/v2/lib/PolygonRollupBase.sol index 95da17d33..2ccfa0e9c 100644 --- a/contracts/v2/lib/PolygonRollupBase.sol +++ b/contracts/v2/lib/PolygonRollupBase.sol @@ -117,6 +117,9 @@ contract PolygonRollupBase is bytes32 public constant SIGNATURE_INITIALIZE_TX_S = 0x000000000000000000000000000000000000000000000000000000005ca1ab1e; + // S parameter of the initialize signature + bytes1 public constant INITIALIZE_TX_EFFECTIVE_PERCENTAGE = 0xFF; + // MATIC token address // review POL IERC20Upgradeable public immutable matic; @@ -293,7 +296,7 @@ contract PolygonRollupBase is bytes32 newAccInputHash = keccak256( abi.encodePacked( - bytes32(0), // current acc Input hash + bytes32(0), // Current acc Input hash currentTransactionsHash, bytes32(0), // Global exit root currentTimestamp, @@ -765,6 +768,8 @@ contract PolygonRollupBase is ) ); + // Sanity check that the ecrecover will work + // should never happen giving a valid signature, "break" ecrecover address signer = ecrecover( keccak256(bytesToSign), SIGNATURE_INITIALIZE_TX_V, @@ -780,7 +785,8 @@ contract PolygonRollupBase is bytesToSign, SIGNATURE_INITIALIZE_TX_V, SIGNATURE_INITIALIZE_TX_R, - SIGNATURE_INITIALIZE_TX_S + SIGNATURE_INITIALIZE_TX_S, + INITIALIZE_TX_EFFECTIVE_PERCENTAGE ); return transaction; From 0fae26c9cff0b710d26b62e3c2c9683ef17c5431 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Fri, 6 Oct 2023 16:31:39 +0200 Subject: [PATCH 031/230] role udpate name --- contracts/v2/PolygonRollupManager.sol | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index caaa9aecf..11f20d096 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -146,8 +146,8 @@ contract PolygonRollupManager is keccak256("ADD_ROLLUP_TYPE_ROLE"); // Trusted aggregator will be able to verify batches without extra delau - bytes32 internal constant _DELETE_ROLLUP_TYPE_ROLE = - keccak256("DELETE_ROLLUP_TYPE_ROLE"); + bytes32 internal constant _OBSOLETE_ROLLUP_TYPE_ROLE = + keccak256("OBSOLETE_ROLLUP_TYPE_ROLE"); bytes32 internal constant _CREATE_ROLLUP_ROLE = keccak256("CREATE_ROLLUP_ROLE"); @@ -506,7 +506,7 @@ contract PolygonRollupManager is _setupRole(_UPDATE_ROLLUP_ROLE, timelock); // Admin roles - _setupRole(_DELETE_ROLLUP_TYPE_ROLE, admin); + _setupRole(_OBSOLETE_ROLLUP_TYPE_ROLE, admin); _setupRole(_CREATE_ROLLUP_ROLE, admin); _setupRole(_STOP_EMERGENCY_ROLE, admin); _setupRole(_TRUSTED_AGGREGATOR_ROLE, admin); @@ -610,7 +610,7 @@ contract PolygonRollupManager is */ function obsoleteRollupType( uint32 rollupTypeID - ) external onlyRole(_DELETE_ROLLUP_TYPE_ROLE) { + ) external onlyRole(_OBSOLETE_ROLLUP_TYPE_ROLE) { if (rollupTypeID == 0 || rollupTypeID > rollupTypeCount) { revert RollupTypeDoesNotExist(); } @@ -856,11 +856,11 @@ contract PolygonRollupManager is RollupData storage rollup = rollupIDToRollupData[rollupID]; - // Update total sequence parameters if (newSequencedBatches == 0) { revert MustSequenceSomeBatch(); } + // Update total sequence parameters totalSequencedBatches += newSequencedBatches; if (forcedSequencedBatches != 0) { From 5b4a2a79389298e733fd585d4483ab73286f67b3 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Fri, 6 Oct 2023 16:43:30 +0200 Subject: [PATCH 032/230] fee --- contracts/v2/PolygonRollupManager.sol | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index 11f20d096..db107508d 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -137,7 +137,7 @@ contract PolygonRollupManager is uint64 internal constant _ZKEVM_CHAINID = 1101; // zkEVM FORK ID - uint64 internal immutable _ZKEVM_FORKID = 5; + uint64 internal constant _ZKEVM_FORKID = 5; // Existing roles on rollup manager @@ -327,7 +327,7 @@ contract PolygonRollupManager is // Current matic fee per batch sequenced uint256 public batchFee; - // Address that has priority to verify batches, also enables bridges instantly + // Address that has priority to verify batches, also consolidates the state instantly address public trustedAggregator; /** @@ -345,7 +345,7 @@ contract PolygonRollupManager is /** * @dev Emitted when a a rolup type is deleted */ - event DeleteRollupType(uint32 rollupTypeID); + event ObsoleteRollupType(uint32 rollupTypeID); /** * @dev Emitted when a new rollup is created based on a rollupType @@ -497,8 +497,6 @@ contract PolygonRollupManager is _setupRole(DEFAULT_ADMIN_ROLE, timelock); _setupRole(_ADD_ROLLUP_TYPE_ROLE, timelock); _setupRole(_ADD_EXISTING_ROLLUP_ROLE, timelock); - // role fees - // role rest of parameters // Even this role can only update to an already added verifier/consensus // Could break the compatibility of them, changing the virtual state @@ -615,9 +613,13 @@ contract PolygonRollupManager is revert RollupTypeDoesNotExist(); } + if (rollupTypeMap[rollupTypeID].obsolete == true) { + revert RollupTypeObsolete(); + } + rollupTypeMap[rollupTypeID].obsolete = true; - emit DeleteRollupType(rollupTypeID); + emit ObsoleteRollupType(rollupTypeID); } /** @@ -934,7 +936,6 @@ contract PolygonRollupManager is ); // Update batch fees - // review, shoudl update awell in the ntrusted aggregation? _updateBatchFee(rollup, finalNewBatch); if (pendingStateTimeout == 0) { @@ -1649,6 +1650,10 @@ contract PolygonRollupManager is * @param newBatchFee new batch fee */ function setBatchFee(uint256 newBatchFee) external onlyRole(_SET_FEE_ROLE) { + // check fees min and max + if (newBatchFee > _MAX_BATCH_FEE || newBatchFee < _MIN_BATCH_FEE) { + revert(); + } batchFee = newBatchFee; emit SetBatchFee(newBatchFee); } From 7f0e97ae3cae15ab1875a3c28dafaa26cf297c6e Mon Sep 17 00:00:00 2001 From: invocamanman Date: Fri, 6 Oct 2023 16:48:29 +0200 Subject: [PATCH 033/230] comments --- contracts/v2/PolygonRollupManager.sol | 5 +---- deployment/1_createGenesis.js | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index db107508d..533f1f528 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -325,7 +325,7 @@ contract PolygonRollupManager is uint16 public multiplierBatchFee; // Current matic fee per batch sequenced - uint256 public batchFee; + uint256 public batchFee; // TODO internal?¿ // Address that has priority to verify batches, also consolidates the state instantly address public trustedAggregator; @@ -578,8 +578,6 @@ contract PolygonRollupManager is string memory description ) external onlyRole(_ADD_ROLLUP_TYPE_ROLE) { // nullify rollup type?¿ review hash(verifier, implementation, genesis) - // review check address are not 0? - uint32 rollupTypeID = ++rollupTypeCount; rollupTypeMap[rollupTypeID] = RollupType({ @@ -785,7 +783,6 @@ contract PolygonRollupManager is uint32 newRollupTypeID, bytes calldata upgradeData ) external onlyRole(_UPDATE_ROLLUP_ROLE) { - // TODO Check new rollup type was not deleted? it would be sanity check // Check that rollup type exists if (newRollupTypeID == 0 || newRollupTypeID > rollupTypeCount) { revert RollupTypeDoesNotExist(); diff --git a/deployment/1_createGenesis.js b/deployment/1_createGenesis.js index cf263cab7..0db3cc42b 100644 --- a/deployment/1_createGenesis.js +++ b/deployment/1_createGenesis.js @@ -163,7 +163,7 @@ async function main() { await WETHToken.deployed(); // Deploy implementation PolygonZkEVMBridge - const polygonZkEVMBridgeFactory = await ethers.getContractFactory('PolygonZkEVMGasTokenBridge', deployer); + const polygonZkEVMBridgeFactory = await ethers.getContractFactory('PolygonZkEVMBridgeL2', deployer); const deployTransactionBridge = (polygonZkEVMBridgeFactory.getDeployTransaction()).data; // Mandatory to override the gasLimit since the estimation with create are mess up D: const overrideGasLimit = ethers.BigNumber.from(5500000); From 2b98a446e140b2878b2d02300e77dd16d58dde2d Mon Sep 17 00:00:00 2001 From: invocamanman Date: Fri, 6 Oct 2023 21:36:55 +0200 Subject: [PATCH 034/230] pol --- contracts/v2/PolygonRollupManager.sol | 52 ++++++++++--------- .../dataComittee/PolygonDataComittee.sol | 27 +++++----- .../v2/consensus/zkEVM/PolygonZkEVMV2.sol | 6 +-- .../zkEVM/PolygonZkEVMV2Upgraded.sol | 6 +-- .../v2/interfaces/IPolygonRollupManager.sol | 10 ++-- .../v2/interfaces/IPolygonZkEVMV2Errors.sol | 2 +- .../lib/PolygonAccessControlUpgradeable.sol | 21 +++++--- contracts/v2/lib/PolygonRollupBase.sol | 32 ++++++------ 8 files changed, 83 insertions(+), 73 deletions(-) diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index 533f1f528..fc25211c5 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -185,8 +185,8 @@ contract PolygonRollupManager is // PolygonZkEVM Bridge Address IPolygonZkEVMBridge public immutable bridgeAddress; - // MATIC token address - IERC20Upgradeable public immutable matic; + // POL token address + IERC20Upgradeable public immutable pol; // since this contract will be an update of the PolygonZkEVM there are legacy variables // This ones would not be used generally,just for reserve the same storage slots, since @@ -325,7 +325,7 @@ contract PolygonRollupManager is uint16 public multiplierBatchFee; // Current matic fee per batch sequenced - uint256 public batchFee; // TODO internal?¿ + uint256 internal _batchFee; // TODO internal?¿ // Address that has priority to verify batches, also consolidates the state instantly address public trustedAggregator; @@ -461,16 +461,16 @@ contract PolygonRollupManager is /** * @param _globalExitRootManager Global exit root manager address - * @param _matic MATIC token address + * @param _pol MATIC token address * @param _bridgeAddress Bridge address */ constructor( IPolygonZkEVMGlobalExitRoot _globalExitRootManager, - IERC20Upgradeable _matic, + IERC20Upgradeable _pol, IPolygonZkEVMBridge _bridgeAddress ) { globalExitRootManager = _globalExitRootManager; - matic = _matic; + pol = _pol; bridgeAddress = _bridgeAddress; } @@ -537,6 +537,10 @@ contract PolygonRollupManager is zkEVMLastVerifiedBatch ] = _legacyBatchNumToStateRoot[zkEVMLastVerifiedBatch]; + // previousLastBatchSequenced will be inconsistent, since there will not be + // a sequence stored in that batch. + // However since lastVerifiedBatch is equal to the lastBatchSequenced + // won't affect in any case currentZkEVM.sequencedBatches[ zkEVMLastBatchSequenced ] = _legacySequencedBatches[zkEVMLastBatchSequenced]; @@ -611,11 +615,12 @@ contract PolygonRollupManager is revert RollupTypeDoesNotExist(); } - if (rollupTypeMap[rollupTypeID].obsolete == true) { + RollupType storage currentRollupType = rollupTypeMap[rollupTypeID]; + if (currentRollupType.obsolete == true) { revert RollupTypeObsolete(); } - rollupTypeMap[rollupTypeID].obsolete = true; + currentRollupType.obsolete = true; emit ObsoleteRollupType(rollupTypeID); } @@ -806,11 +811,11 @@ contract PolygonRollupManager is revert RollupTypeObsolete(); } - // check compatibility of the rollups + // review check compatibility of the rollups if ( rollup.rollupCompatibilityID != newRollupType.rollupCompatibilityID ) { - revert UpdateToSameRollupTypeID(); + revert UpdateNotCompatible(); } // update rollup parameters @@ -819,7 +824,6 @@ contract PolygonRollupManager is rollup.rollupTypeID = newRollupTypeID; rollup.lastVerifiedBatchBeforeUpgrade = getLastVerifiedBatch(rollupID); - // review if it's the same implementation do not upgrade address newConsensusAddress = newRollupType.consensusImplementation; if (rollupContract.implementation() != newConsensusAddress) { rollupContract.upgradeToAndCall(newConsensusAddress, upgradeData); @@ -1107,7 +1111,7 @@ contract PolygonRollupManager is // Pay MATIC rewards uint64 newVerifiedBatches = finalNewBatch - currentLastVerifiedBatch; - matic.safeTransfer( + pol.safeTransfer( beneficiary, calculateRewardPerBatch() * newVerifiedBatches ); @@ -1204,7 +1208,7 @@ contract PolygonRollupManager is rollup.lastPendingStateConsolidated = pendingStateNum; // Interact with globalExitRootManager - globalExitRootManager.updateExitRoot(currentPendingState.exitRoot); + globalExitRootManager.updateExitRoot(getRollupExitRoot()); emit ConsolidatePendingState( rollupAddressToID[address(rollup.rollupContract)], @@ -1481,8 +1485,8 @@ contract PolygonRollupManager is : diffBatches; // For every multiplierBatchFee multiplication we must shift 3 zeroes since we have 3 decimals - batchFee = - (batchFee * (uint256(multiplierBatchFee) ** diffBatches)) / + _batchFee = + (_batchFee * (uint256(multiplierBatchFee) ** diffBatches)) / (uint256(1000) ** diffBatches); } else { // There are more batches below target, fee is divided @@ -1502,15 +1506,15 @@ contract PolygonRollupManager is // accDivisor = 1E18 * multiplyFactor // 1E18 * batchFee / accDivisor = batchFee / multiplyFactor // < 60 bits * < 70 bits / ~60 bits --> overflow not possible - batchFee = (uint256(1 ether) * batchFee) / accDivisor; + _batchFee = (uint256(1 ether) * _batchFee) / accDivisor; } } // Batch fee must remain inside a range - if (batchFee > _MAX_BATCH_FEE) { - batchFee = _MAX_BATCH_FEE; - } else if (batchFee < _MIN_BATCH_FEE) { - batchFee = _MIN_BATCH_FEE; + if (_batchFee > _MAX_BATCH_FEE) { + _batchFee = _MAX_BATCH_FEE; + } else if (_batchFee < _MIN_BATCH_FEE) { + _batchFee = _MIN_BATCH_FEE; } } @@ -1651,7 +1655,7 @@ contract PolygonRollupManager is if (newBatchFee > _MAX_BATCH_FEE || newBatchFee < _MIN_BATCH_FEE) { revert(); } - batchFee = newBatchFee; + _batchFee = newBatchFee; emit SetBatchFee(newBatchFee); } @@ -1785,7 +1789,7 @@ contract PolygonRollupManager is * @notice Function to calculate the reward to verify a single batch */ function calculateRewardPerBatch() public view returns (uint256) { - uint256 currentBalance = matic.balanceOf(address(this)); + uint256 currentBalance = pol.balanceOf(address(this)); // Total Sequenced Batches = total forcedBatches to be sequenced + total Sequenced Batches // Total Batches to be verified = total Sequenced Batches - total verified Batches @@ -1800,14 +1804,14 @@ contract PolygonRollupManager is * @notice Get batch fee */ function getBatchFee() public view returns (uint256) { - return batchFee; + return _batchFee; } /** * @notice Get forced batch fee */ function getForcedBatchFee() public view returns (uint256) { - return batchFee * 100; + return _batchFee * 100; } /** diff --git a/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol b/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol index 30e436c29..113fc5998 100644 --- a/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol +++ b/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol @@ -46,20 +46,20 @@ contract PolygonDataComittee is PolygonRollupBase, IPolygonDataComittee { /** * @param _globalExitRootManager Global exit root manager address - * @param _matic MATIC token address + * @param _pol POL token address * @param _bridgeAddress Bridge address * @param _rollupManager Global exit root manager address */ constructor( IPolygonZkEVMGlobalExitRoot _globalExitRootManager, - IERC20Upgradeable _matic, + IERC20Upgradeable _pol, IPolygonZkEVMBridge _bridgeAddress, PolygonRollupManager _rollupManager, ICDKDataCommittee _dataCommittee ) PolygonRollupBase( _globalExitRootManager, - _matic, + _pol, _bridgeAddress, _rollupManager ) @@ -71,16 +71,15 @@ contract PolygonDataComittee is PolygonRollupBase, IPolygonDataComittee { // Sequence/Verify batches functions //////////////////////////////////// - // function sequenceBatches( - // BatchData[] calldata batches, - // address l2Coinbase - // ) external override { - // if (!isSequenceWithDataAvailabilityAllowed) { - // revert SequenceWithDataAvailabilityNotAllowed(); - // } else { - // super.sequenceBatches(batches, l2Coinbase); - // } - // } + function sequenceBatches( + BatchData[] calldata batches, + address l2Coinbase + ) public override { + if (!isSequenceWithDataAvailabilityAllowed) { + revert SequenceWithDataAvailabilityNotAllowed(); + } + super.sequenceBatches(batches, l2Coinbase); + } /** * @notice Allows a sequencer to send multiple batches @@ -212,7 +211,7 @@ contract PolygonDataComittee is PolygonRollupBase, IPolygonDataComittee { } // Pay collateral for every non-forced batch submitted - matic.safeTransferFrom( + pol.safeTransferFrom( msg.sender, address(rollupManager), rollupManager.getBatchFee() * nonForcedBatchesSequenced diff --git a/contracts/v2/consensus/zkEVM/PolygonZkEVMV2.sol b/contracts/v2/consensus/zkEVM/PolygonZkEVMV2.sol index a19b8911e..aa095d347 100644 --- a/contracts/v2/consensus/zkEVM/PolygonZkEVMV2.sol +++ b/contracts/v2/consensus/zkEVM/PolygonZkEVMV2.sol @@ -14,19 +14,19 @@ import "../../lib/PolygonRollupBase.sol"; contract PolygonZkEVMV2 is PolygonRollupBase { /** * @param _globalExitRootManager Global exit root manager address - * @param _matic MATIC token address + * @param _pol POL token address * @param _bridgeAddress Bridge address * @param _rollupManager Global exit root manager address */ constructor( IPolygonZkEVMGlobalExitRoot _globalExitRootManager, - IERC20Upgradeable _matic, + IERC20Upgradeable _pol, IPolygonZkEVMBridge _bridgeAddress, PolygonRollupManager _rollupManager ) PolygonRollupBase( _globalExitRootManager, - _matic, + _pol, _bridgeAddress, _rollupManager ) diff --git a/contracts/v2/consensus/zkEVM/PolygonZkEVMV2Upgraded.sol b/contracts/v2/consensus/zkEVM/PolygonZkEVMV2Upgraded.sol index 9ccccb987..56c3c9946 100644 --- a/contracts/v2/consensus/zkEVM/PolygonZkEVMV2Upgraded.sol +++ b/contracts/v2/consensus/zkEVM/PolygonZkEVMV2Upgraded.sol @@ -14,19 +14,19 @@ import "../../lib/PolygonRollupBase.sol"; contract PolygonZkEVMV2Upgraded is PolygonRollupBase { /** * @param _globalExitRootManager Global exit root manager address - * @param _matic MATIC token address + * @param _pol POL token address * @param _bridgeAddress Bridge address * @param _rollupManager Global exit root manager address */ constructor( IPolygonZkEVMGlobalExitRoot _globalExitRootManager, - IERC20Upgradeable _matic, + IERC20Upgradeable _pol, IPolygonZkEVMBridge _bridgeAddress, PolygonRollupManager _rollupManager ) PolygonRollupBase( _globalExitRootManager, - _matic, + _pol, _bridgeAddress, _rollupManager ) diff --git a/contracts/v2/interfaces/IPolygonRollupManager.sol b/contracts/v2/interfaces/IPolygonRollupManager.sol index 0e10cdbbc..c28ab6ae1 100644 --- a/contracts/v2/interfaces/IPolygonRollupManager.sol +++ b/contracts/v2/interfaces/IPolygonRollupManager.sol @@ -13,11 +13,6 @@ interface IPolygonRollupManager { */ error TrustedAggregatorTimeoutExceedHaltAggregationTimeout(); - /** - * @dev Thrown when sender is not the PolygonZkEVM address - */ - error OnlyGovernance(); - /** * @dev Thrown when sender is not the PolygonZkEVM address */ @@ -237,4 +232,9 @@ interface IPolygonRollupManager { * @dev When a rollup type does not exist */ error InitBatchMustMatchCurrentForkID(); + + /** + * @dev When a rollup type does not exist + */ + error UpdateNotCompatible(); } diff --git a/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol b/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol index 6d25fecff..73a838126 100644 --- a/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol +++ b/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol @@ -11,7 +11,7 @@ interface IPolygonZkEVMV2Errors { /** * @dev Thrown when the caller is not the trusted sequencer */ - error NotEnoughfeeTokenAmount(); + error NotEnoughPOLAmount(); /** * @dev Thrown when the caller is not the trusted sequencer diff --git a/contracts/v2/lib/PolygonAccessControlUpgradeable.sol b/contracts/v2/lib/PolygonAccessControlUpgradeable.sol index 574b6555d..15919c975 100644 --- a/contracts/v2/lib/PolygonAccessControlUpgradeable.sol +++ b/contracts/v2/lib/PolygonAccessControlUpgradeable.sol @@ -15,6 +15,7 @@ import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; * 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 */ abstract contract PolygonAccessControlUpgradeable is Initializable, @@ -40,6 +41,11 @@ abstract contract PolygonAccessControlUpgradeable is */ error AddressDoNotHaveRequiredRole(); + /** + * @dev Thrown when the renounce address is not the message sender + */ + error AccessControlOnlyCanRenounceRolesForSelf(); + /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. @@ -66,7 +72,7 @@ abstract contract PolygonAccessControlUpgradeable is } /** - * @dev Revert with a standard message if `_msgSender()` is missing `role`. + * @dev 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}. @@ -74,7 +80,7 @@ abstract contract PolygonAccessControlUpgradeable is * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { - _checkRole(role, _msgSender()); + _checkRole(role, msg.sender); } /** @@ -159,10 +165,9 @@ abstract contract PolygonAccessControlUpgradeable is bytes32 role, address account ) public virtual override { - require( - account == _msgSender(), - "AccessControl: can only renounce roles for self" - ); + if (account != msg.sender) { + revert AccessControlOnlyCanRenounceRolesForSelf(); + } _revokeRole(role, account); } @@ -212,7 +217,7 @@ abstract contract PolygonAccessControlUpgradeable is function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; - emit RoleGranted(role, account, _msgSender()); + emit RoleGranted(role, account, msg.sender); } } @@ -226,7 +231,7 @@ abstract contract PolygonAccessControlUpgradeable is function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; - emit RoleRevoked(role, account, _msgSender()); + emit RoleRevoked(role, account, msg.sender); } } diff --git a/contracts/v2/lib/PolygonRollupBase.sol b/contracts/v2/lib/PolygonRollupBase.sol index 2ccfa0e9c..582f2ac87 100644 --- a/contracts/v2/lib/PolygonRollupBase.sol +++ b/contracts/v2/lib/PolygonRollupBase.sol @@ -27,7 +27,7 @@ contract PolygonRollupBase is IPolygonZkEVMV2Errors, IPolygonRollupBase { - // INterface cehcks renaming + // Interface cehcks renaming using SafeERC20Upgradeable for IERC20Upgradeable; /** @@ -120,8 +120,8 @@ contract PolygonRollupBase is // S parameter of the initialize signature bytes1 public constant INITIALIZE_TX_EFFECTIVE_PERCENTAGE = 0xFF; - // MATIC token address // review POL - IERC20Upgradeable public immutable matic; + // POL token address + IERC20Upgradeable public immutable pol; // Global Exit Root interface IPolygonZkEVMGlobalExitRoot public immutable globalExitRootManager; @@ -242,18 +242,18 @@ contract PolygonRollupBase is /** * @param _globalExitRootManager Global exit root manager address - * @param _matic MATIC token address + * @param _pol POL token address * @param _bridgeAddress Bridge address * @param _rollupManager Global exit root manager address */ constructor( IPolygonZkEVMGlobalExitRoot _globalExitRootManager, - IERC20Upgradeable _matic, + IERC20Upgradeable _pol, IPolygonZkEVMBridge _bridgeAddress, PolygonRollupManager _rollupManager ) { globalExitRootManager = _globalExitRootManager; - matic = _matic; + pol = _pol; bridgeAddress = _bridgeAddress; rollupManager = _rollupManager; } @@ -292,6 +292,8 @@ contract PolygonRollupBase is ); bytes32 currentTransactionsHash = keccak256(transaction); + + // should be deterministic or easier deployment, TODO test 0 uint64 currentTimestamp = uint64(block.timestamp); bytes32 newAccInputHash = keccak256( @@ -357,7 +359,7 @@ contract PolygonRollupBase is function sequenceBatches( BatchData[] calldata batches, address l2Coinbase - ) external virtual onlyTrustedSequencer { + ) public virtual onlyTrustedSequencer { uint256 batchesNum = batches.length; if (batchesNum == 0) { revert SequenceZeroBatches(); @@ -478,7 +480,7 @@ contract PolygonRollupBase is } // Pay collateral for every non-forced batch submitted - matic.safeTransferFrom( + pol.safeTransferFrom( msg.sender, address(rollupManager), rollupManager.getBatchFee() * nonForcedBatchesSequenced @@ -521,24 +523,24 @@ contract PolygonRollupBase is * In order to assure that users force transactions will be processed properly, user must not sign any other transaction * with the same nonce * @param transactions L2 ethereum transactions EIP-155 or pre-EIP-155 with signature: - * @param maticAmount Max amount of matic tokens that the sender is willing to pay + * @param polAmount Max amount of pol tokens that the sender is willing to pay */ function forceBatch( bytes calldata transactions, - uint256 maticAmount + uint256 polAmount ) public virtual isForceBatchActive { - // Calculate matic collateral - uint256 maticFee = rollupManager.getForcedBatchFee(); + // Calculate pol collateral + uint256 polFee = rollupManager.getForcedBatchFee(); - if (maticFee > maticAmount) { - revert NotEnoughMaticAmount(); + if (polFee > polAmount) { + revert NotEnoughPOLAmount(); } if (transactions.length > _MAX_FORCE_BATCH_BYTE_LENGTH) { revert TransactionsLengthAboveMax(); } - matic.safeTransferFrom(msg.sender, address(rollupManager), maticFee); + pol.safeTransferFrom(msg.sender, address(rollupManager), polFee); // Get globalExitRoot global exit root bytes32 lastGlobalExitRoot = globalExitRootManager From 33fe93cdfba62a471c3544bdf3cb9302a2cf6880 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Fri, 6 Oct 2023 22:04:47 +0200 Subject: [PATCH 035/230] forced batches --- contracts/v2/PolygonRollupManager.sol | 19 +++++++++++++++++-- .../v2/interfaces/IPolygonRollupManager.sol | 5 +++++ contracts/v2/lib/PolygonRollupBase.sol | 3 +++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index fc25211c5..7bcf851b1 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -537,7 +537,7 @@ contract PolygonRollupManager is zkEVMLastVerifiedBatch ] = _legacyBatchNumToStateRoot[zkEVMLastVerifiedBatch]; - // previousLastBatchSequenced will be inconsistent, since there will not be + // note previousLastBatchSequenced will be inconsistent, since there will not be // a sequence stored in that batch. // However since lastVerifiedBatch is equal to the lastBatchSequenced // won't affect in any case @@ -890,6 +890,20 @@ contract PolygonRollupManager is return newLastBatchSequenced; } + // review + /** + * @notice callback called by one of the consensus managed by this contract, when forced a batch + */ + function onForcedBatch() external ifNotEmergencyState { + // Check that the msg.sender is an added rollup + uint32 rollupID = rollupAddressToID[msg.sender]; + if (rollupID == 0) { + revert SenderMustBeRollup(); + } + + totalPendingForcedBatches++; + } + /** * @notice Allows an aggregator to verify multiple batches * @param pendingStateNum Init pending state, 0 if consolidated state is used @@ -1203,6 +1217,7 @@ contract PolygonRollupManager is rollup.lastVerifiedBatch = newLastVerifiedBatch; rollup.batchNumToStateRoot[newLastVerifiedBatch] = currentPendingState .stateRoot; + rollup.lastLocalExitRoot = currentPendingState.exitRoot; // Update pending state rollup.lastPendingStateConsolidated = pendingStateNum; @@ -1653,7 +1668,7 @@ contract PolygonRollupManager is function setBatchFee(uint256 newBatchFee) external onlyRole(_SET_FEE_ROLE) { // check fees min and max if (newBatchFee > _MAX_BATCH_FEE || newBatchFee < _MIN_BATCH_FEE) { - revert(); + revert BatchFeeOutOfRange(); } _batchFee = newBatchFee; emit SetBatchFee(newBatchFee); diff --git a/contracts/v2/interfaces/IPolygonRollupManager.sol b/contracts/v2/interfaces/IPolygonRollupManager.sol index c28ab6ae1..ff9f0f090 100644 --- a/contracts/v2/interfaces/IPolygonRollupManager.sol +++ b/contracts/v2/interfaces/IPolygonRollupManager.sol @@ -237,4 +237,9 @@ interface IPolygonRollupManager { * @dev When a rollup type does not exist */ error UpdateNotCompatible(); + + /** + * @dev When a rollup type does not exist + */ + error BatchFeeOutOfRange(); } diff --git a/contracts/v2/lib/PolygonRollupBase.sol b/contracts/v2/lib/PolygonRollupBase.sol index 582f2ac87..39aacbe3c 100644 --- a/contracts/v2/lib/PolygonRollupBase.sol +++ b/contracts/v2/lib/PolygonRollupBase.sol @@ -557,6 +557,9 @@ contract PolygonRollupBase is ) ); + //review + rollupManager.onForcedBatch(); + if (msg.sender == tx.origin) { // Getting the calldata from an EOA is easy so no need to put the `transactions` in the event emit ForceBatch(lastForceBatch, lastGlobalExitRoot, msg.sender, ""); From 017cfe87a4865a0b2222dae906cda9d87b645124 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Fri, 6 Oct 2023 22:52:34 +0200 Subject: [PATCH 036/230] nice approach FE --- contracts/v2/PolygonRollupManager.sol | 28 ++------------- .../dataComittee/PolygonDataComittee.sol | 8 ++++- contracts/v2/lib/PolygonRollupBase.sol | 35 +++++++++++++++---- 3 files changed, 37 insertions(+), 34 deletions(-) diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index 7bcf851b1..4afd5c47b 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -308,9 +308,6 @@ contract PolygonRollupManager is // Total sequenced batches between all rollups uint64 public totalSequencedBatches; - // Total pending batches between all networks - uint64 public totalPendingForcedBatches; - // Total verified batches between all rollups uint64 public totalVerifiedBatches; @@ -843,12 +840,10 @@ contract PolygonRollupManager is /** * @notice Sequence batches, callback called by one of the consensus managed by this contract * @param newSequencedBatches how many sequenced batches were sequenced - * @param forcedSequencedBatches how many forced batches were sequenced * @param newAccInputHash new accumualted input hash */ function onSequenceBatches( uint64 newSequencedBatches, - uint64 forcedSequencedBatches, bytes32 newAccInputHash ) external ifNotEmergencyState returns (uint64) { // Check that the msg.sender is an added rollup @@ -866,10 +861,6 @@ contract PolygonRollupManager is // Update total sequence parameters totalSequencedBatches += newSequencedBatches; - if (forcedSequencedBatches != 0) { - totalPendingForcedBatches -= forcedSequencedBatches; - } - // Update sequenced batches of the current rollup uint64 previousLastBatchSequenced = rollup.lastBatchSequenced; uint64 newLastBatchSequenced = previousLastBatchSequenced + @@ -890,20 +881,6 @@ contract PolygonRollupManager is return newLastBatchSequenced; } - // review - /** - * @notice callback called by one of the consensus managed by this contract, when forced a batch - */ - function onForcedBatch() external ifNotEmergencyState { - // Check that the msg.sender is an added rollup - uint32 rollupID = rollupAddressToID[msg.sender]; - if (rollupID == 0) { - revert SenderMustBeRollup(); - } - - totalPendingForcedBatches++; - } - /** * @notice Allows an aggregator to verify multiple batches * @param pendingStateNum Init pending state, 0 if consolidated state is used @@ -1806,10 +1783,9 @@ contract PolygonRollupManager is function calculateRewardPerBatch() public view returns (uint256) { uint256 currentBalance = pol.balanceOf(address(this)); - // Total Sequenced Batches = total forcedBatches to be sequenced + total Sequenced Batches // Total Batches to be verified = total Sequenced Batches - total verified Batches - uint256 totalBatchesToVerify = (totalPendingForcedBatches + - totalSequencedBatches) - totalVerifiedBatches; + uint256 totalBatchesToVerify = totalSequencedBatches - + totalVerifiedBatches; if (totalBatchesToVerify == 0) return 0; return currentBalance / totalBatchesToVerify; diff --git a/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol b/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol index 113fc5998..05ae09be0 100644 --- a/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol +++ b/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol @@ -217,12 +217,18 @@ contract PolygonDataComittee is PolygonRollupBase, IPolygonDataComittee { rollupManager.getBatchFee() * nonForcedBatchesSequenced ); + // Transfer pol for every forced batch submitted + pol.safeTransfer( + address(rollupManager), + calculatePolPerForceBatch() * + (batchesNum - nonForcedBatchesSequenced) + ); + // Update global exit root if there are new deposits bridgeAddress.updateGlobalExitRoot(); uint64 currentBatchSequenced = rollupManager.onSequenceBatches( uint64(batchesNum), - uint64(batchesNum - nonForcedBatchesSequenced), currentAccInputHash ); diff --git a/contracts/v2/lib/PolygonRollupBase.sol b/contracts/v2/lib/PolygonRollupBase.sol index 39aacbe3c..d037f8b06 100644 --- a/contracts/v2/lib/PolygonRollupBase.sol +++ b/contracts/v2/lib/PolygonRollupBase.sol @@ -310,7 +310,6 @@ contract PolygonRollupBase is uint64 currentBatchSequenced = rollupManager.onSequenceBatches( uint64(1), // num total batches - uint64(0), // num forced batches newAccInputHash ); @@ -486,12 +485,18 @@ contract PolygonRollupBase is rollupManager.getBatchFee() * nonForcedBatchesSequenced ); + // Transfer pol for every forced batch submitted + pol.safeTransfer( + address(rollupManager), + calculatePolPerForceBatch() * + (batchesNum - nonForcedBatchesSequenced) + ); + // Update global exit root if there are new deposits bridgeAddress.updateGlobalExitRoot(); uint64 currentBatchSequenced = rollupManager.onSequenceBatches( uint64(batchesNum), - uint64(batchesNum - nonForcedBatchesSequenced), currentAccInputHash ); @@ -540,7 +545,8 @@ contract PolygonRollupBase is revert TransactionsLengthAboveMax(); } - pol.safeTransferFrom(msg.sender, address(rollupManager), polFee); + // keep the pol fees on this contract until forced it's sequenced + pol.safeTransferFrom(msg.sender, address(this), polFee); // Get globalExitRoot global exit root bytes32 lastGlobalExitRoot = globalExitRootManager @@ -557,9 +563,6 @@ contract PolygonRollupBase is ) ); - //review - rollupManager.onForcedBatch(); - if (msg.sender == tx.origin) { // Getting the calldata from an EOA is easy so no need to put the `transactions` in the event emit ForceBatch(lastForceBatch, lastGlobalExitRoot, msg.sender, ""); @@ -659,8 +662,13 @@ contract PolygonRollupBase is lastTimestamp = uint64(block.timestamp); lastForceBatchSequenced = currentLastForceBatchSequenced; + // Transfer pol for every forced batch submitted + pol.safeTransfer( + address(rollupManager), + calculatePolPerForceBatch() * (batchesNum) + ); + uint64 currentBatchSequenced = rollupManager.onSequenceBatches( - uint64(batchesNum), uint64(batchesNum), currentAccInputHash ); @@ -756,6 +764,19 @@ contract PolygonRollupBase is // view/pure functions ////////////////// + /** + * @notice Function to calculate the reward for a forced batch + */ + function calculatePolPerForceBatch() public view returns (uint256) { + uint256 currentBalance = pol.balanceOf(address(this)); + + // Pending forced Batches = last forced batch added - last forced batch sequenced + uint256 pendingForcedBatches = lastForceBatch - lastForceBatchSequenced; + + if (pendingForcedBatches == 0) return 0; + return currentBalance / pendingForcedBatches; + } + /** * @notice Get forced batch fee */ From 1f5276f91ec2f69919a76e56d7146cbc51793b38 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Fri, 6 Oct 2023 22:58:31 +0200 Subject: [PATCH 037/230] constant variables initialize --- contracts/v2/PolygonRollupManager.sol | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index 4afd5c47b..ffc88f153 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -485,6 +485,11 @@ contract PolygonRollupManager is pendingStateTimeout = _pendingStateTimeout; trustedAggregatorTimeout = _trustedAggregatorTimeout; + // Constant deployment variables + _batchFee = 0.1 ether; // 0.1 Matic + verifyBatchTimeTarget = 30 minutes; + multiplierBatchFee = 1002; + // Initialize OZ contracts __AccessControl_init(); From 2d2f9d02408a2cbfda49050e5b432ecbcfb0678b Mon Sep 17 00:00:00 2001 From: invocamanman Date: Sat, 7 Oct 2023 14:21:47 +0200 Subject: [PATCH 038/230] fix forced --- contracts/v2/PolygonRollupManager.sol | 24 ++++++++-------- .../dataComittee/PolygonDataComittee.sol | 18 ++++++------ contracts/v2/lib/PolygonRollupBase.sol | 28 +++++++++---------- 3 files changed, 34 insertions(+), 36 deletions(-) diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index ffc88f153..bf6a935f4 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -16,9 +16,8 @@ import "./lib/PolygonAccessControlUpgradeable.sol"; import "../interfaces/IVerifierRollup.sol"; import "./consensus/zkEVM/PolygonZkEVMV2Upgraded.sol"; -// TODO change name to network, networkID consistent // TODO check contract slots! - +// Update OZ libs, new transaparent proxy is cheaper, but admin immutable /** * Contract responsible for managing the exit roots across multiple Rollups */ @@ -298,13 +297,6 @@ contract PolygonRollupManager is // chainID => rollupID mapping(uint64 chainID => uint32 rollupID) public chainIDToRollupID; - // Once a pending state exceeds this timeout it can be consolidated - uint64 public pendingStateTimeout; - - // Trusted aggregator timeout, if a sequence is not verified in this time frame, - // everyone can verify that sequence - uint64 public trustedAggregatorTimeout; - // Total sequenced batches between all rollups uint64 public totalSequencedBatches; @@ -314,6 +306,13 @@ contract PolygonRollupManager is // Last timestamp where an aggregation happen uint64 public lastAggregationTimestamp; + // Trusted aggregator timeout, if a sequence is not verified in this time frame, + // everyone can verify that sequence + uint64 public trustedAggregatorTimeout; + + // Once a pending state exceeds this timeout it can be consolidated + uint64 public pendingStateTimeout; + // Time target of the verification of a batch // Adaptatly the batchFee will be updated to achieve this target uint64 public verifyBatchTimeTarget; @@ -322,7 +321,7 @@ contract PolygonRollupManager is uint16 public multiplierBatchFee; // Current matic fee per batch sequenced - uint256 internal _batchFee; // TODO internal?¿ + uint256 internal _batchFee; // Address that has priority to verify batches, also consolidates the state instantly address public trustedAggregator; @@ -540,7 +539,7 @@ contract PolygonRollupManager is ] = _legacyBatchNumToStateRoot[zkEVMLastVerifiedBatch]; // note previousLastBatchSequenced will be inconsistent, since there will not be - // a sequence stored in that batch. + // a sequence stored in the sequence mapping. // However since lastVerifiedBatch is equal to the lastBatchSequenced // won't affect in any case currentZkEVM.sequencedBatches[ @@ -613,10 +612,12 @@ contract PolygonRollupManager is function obsoleteRollupType( uint32 rollupTypeID ) external onlyRole(_OBSOLETE_ROLLUP_TYPE_ROLE) { + // Check that rollup type exists if (rollupTypeID == 0 || rollupTypeID > rollupTypeCount) { revert RollupTypeDoesNotExist(); } + // Check rollup type is not obsolete RollupType storage currentRollupType = rollupTypeMap[rollupTypeID]; if (currentRollupType.obsolete == true) { revert RollupTypeObsolete(); @@ -826,6 +827,7 @@ contract PolygonRollupManager is rollup.rollupTypeID = newRollupTypeID; rollup.lastVerifiedBatchBeforeUpgrade = getLastVerifiedBatch(rollupID); + // Upgrade rollup if the consensus implementation it's different address newConsensusAddress = newRollupType.consensusImplementation; if (rollupContract.implementation() != newConsensusAddress) { rollupContract.upgradeToAndCall(newConsensusAddress, upgradeData); diff --git a/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol b/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol index 05ae09be0..20896e762 100644 --- a/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol +++ b/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol @@ -201,10 +201,15 @@ contract PolygonDataComittee is PolygonRollupBase, IPolygonDataComittee { // Check if there has been forced batches if (currentLastForceBatchSequenced != initLastForceBatchSequenced) { - // substract forced batches - nonForcedBatchesSequenced -= - currentLastForceBatchSequenced - + uint64 forcedBatchesSequenced = currentLastForceBatchSequenced - initLastForceBatchSequenced; + // substract forced batches + nonForcedBatchesSequenced -= forcedBatchesSequenced; + + pol.safeTransfer( // Transfer pol for every forced batch submitted + address(rollupManager), + calculatePolPerForceBatch() * (forcedBatchesSequenced) + ); // Store new last force batch sequenced lastForceBatchSequenced = currentLastForceBatchSequenced; @@ -217,13 +222,6 @@ contract PolygonDataComittee is PolygonRollupBase, IPolygonDataComittee { rollupManager.getBatchFee() * nonForcedBatchesSequenced ); - // Transfer pol for every forced batch submitted - pol.safeTransfer( - address(rollupManager), - calculatePolPerForceBatch() * - (batchesNum - nonForcedBatchesSequenced) - ); - // Update global exit root if there are new deposits bridgeAddress.updateGlobalExitRoot(); diff --git a/contracts/v2/lib/PolygonRollupBase.sol b/contracts/v2/lib/PolygonRollupBase.sol index d037f8b06..03ff81583 100644 --- a/contracts/v2/lib/PolygonRollupBase.sol +++ b/contracts/v2/lib/PolygonRollupBase.sol @@ -469,10 +469,15 @@ contract PolygonRollupBase is // Check if there has been forced batches if (currentLastForceBatchSequenced != initLastForceBatchSequenced) { - // substract forced batches - nonForcedBatchesSequenced -= - currentLastForceBatchSequenced - + uint64 forcedBatchesSequenced = currentLastForceBatchSequenced - initLastForceBatchSequenced; + // substract forced batches + nonForcedBatchesSequenced -= forcedBatchesSequenced; + + pol.safeTransfer( // Transfer pol for every forced batch submitted + address(rollupManager), + calculatePolPerForceBatch() * (forcedBatchesSequenced) + ); // Store new last force batch sequenced lastForceBatchSequenced = currentLastForceBatchSequenced; @@ -485,13 +490,6 @@ contract PolygonRollupBase is rollupManager.getBatchFee() * nonForcedBatchesSequenced ); - // Transfer pol for every forced batch submitted - pol.safeTransfer( - address(rollupManager), - calculatePolPerForceBatch() * - (batchesNum - nonForcedBatchesSequenced) - ); - // Update global exit root if there are new deposits bridgeAddress.updateGlobalExitRoot(); @@ -657,17 +655,17 @@ contract PolygonRollupBase is ); } - // Store back the storage variables - lastAccInputHash = currentAccInputHash; - lastTimestamp = uint64(block.timestamp); - lastForceBatchSequenced = currentLastForceBatchSequenced; - // Transfer pol for every forced batch submitted pol.safeTransfer( address(rollupManager), calculatePolPerForceBatch() * (batchesNum) ); + // Store back the storage variables + lastAccInputHash = currentAccInputHash; + lastTimestamp = uint64(block.timestamp); + lastForceBatchSequenced = currentLastForceBatchSequenced; + uint64 currentBatchSequenced = rollupManager.onSequenceBatches( uint64(batchesNum), currentAccInputHash From dd84e6e5b213dc607e493e8137c6b8c0efd6f07b Mon Sep 17 00:00:00 2001 From: invocamanman Date: Sun, 8 Oct 2023 07:57:47 +0200 Subject: [PATCH 039/230] small changes --- contracts/v2/L2/PolygonZkEVMBridgeL2.sol | 36 +++++-------------- contracts/v2/PolygonRollupManager.sol | 30 ++++++++++------ contracts/v2/PolygonZkEVMBridgeV2.sol | 2 +- .../dataComittee/CDKDataCommittee.sol | 6 +++- .../zkEVM/PolygonZkEVMV2Upgraded.sol | 2 ++ .../v2/interfaces/IPolygonRollupManager.sol | 5 +++ contracts/v2/lib/PolygonRollupBase.sol | 2 +- 7 files changed, 43 insertions(+), 40 deletions(-) diff --git a/contracts/v2/L2/PolygonZkEVMBridgeL2.sol b/contracts/v2/L2/PolygonZkEVMBridgeL2.sol index ee649035a..1a4904ebc 100644 --- a/contracts/v2/L2/PolygonZkEVMBridgeL2.sol +++ b/contracts/v2/L2/PolygonZkEVMBridgeL2.sol @@ -722,7 +722,7 @@ contract PolygonZkEVMBridgeL2 is DepositContractV2, IPolygonZkEVMBridgeL2 { // Get origin network from global index if (globalIndex & _GLOBAL_INDEX_MAINNET_FLAG == 1) { - // It's mainnet, therefore origin network is 0 + // It's mainnet, therefore sourceBridgeNetwork is 0 // last 32 bits are leafIndex leafIndex = uint32(globalIndex); @@ -771,20 +771,11 @@ contract PolygonZkEVMBridgeL2 is DepositContractV2, IPolygonZkEVMBridgeL2 { uint32 leafIndex, uint32 sourceBridgeNetwork ) external view returns (bool) { - uint256 globalIndex; + // Since this is not a mainnet bridge, we can skip the previous nullifiers check (see PolygonZkEVMBridgeV2) + uint256 globalIndex = uint256(leafIndex) + + uint256(sourceBridgeNetwork) * + _MAX_LEAFS_PER_NETWORK; - // For consistency with the previous setted nullifiers - if ( - networkID == _MAINNET_NETWORK_ID && - sourceBridgeNetwork == _ZKEVM_NETWORK_ID - ) { - globalIndex = uint256(leafIndex); - } else { - globalIndex = - uint256(leafIndex) + - uint256(sourceBridgeNetwork) * - _MAX_LEAFS_PER_NETWORK; - } (uint256 wordPos, uint256 bitPos) = _bitmapPositions(globalIndex); uint256 mask = (1 << bitPos); return (claimedBitMap[wordPos] & mask) == mask; @@ -799,20 +790,11 @@ contract PolygonZkEVMBridgeL2 is DepositContractV2, IPolygonZkEVMBridgeL2 { uint32 leafIndex, uint32 sourceBridgeNetwork ) private { - uint256 globalIndex; + // Since this is not a mainnet bridge, we can skip the previous nullifiers check (see PolygonZkEVMBridgeV2) + uint256 globalIndex = uint256(leafIndex) + + uint256(sourceBridgeNetwork) * + _MAX_LEAFS_PER_NETWORK; - // For consistency with the previous setted nullifiers - if ( - networkID == _MAINNET_NETWORK_ID && - sourceBridgeNetwork == _ZKEVM_NETWORK_ID - ) { - globalIndex = uint256(leafIndex); - } else { - globalIndex = - uint256(leafIndex) + - uint256(sourceBridgeNetwork) * - _MAX_LEAFS_PER_NETWORK; - } (uint256 wordPos, uint256 bitPos) = _bitmapPositions(globalIndex); uint256 mask = 1 << bitPos; uint256 flipped = claimedBitMap[wordPos] ^= mask; diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index bf6a935f4..1b0803852 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -515,6 +515,7 @@ contract PolygonRollupManager is _setupRole(_SET_FEE_ROLE, admin); // Emergency council roles + _setRoleAdmin(_EMERGENCY_COUNCIL_ROLE, _EMERGENCY_COUNCIL_ADMIN); _setupRole(_EMERGENCY_COUNCIL_ROLE, emergencyCouncil); _setupRole(_EMERGENCY_COUNCIL_ADMIN, emergencyCouncil); @@ -530,7 +531,7 @@ contract PolygonRollupManager is uint64 zkEVMLastBatchSequenced = _legacylastBatchSequenced; uint64 zkEVMLastVerifiedBatch = _legacyLastVerifiedBatch; if (zkEVMLastBatchSequenced != zkEVMLastVerifiedBatch) { - revert(); + revert AllzkEVMSequencedBatchesMustBeVerified(); } // Copy variables from legacy @@ -567,12 +568,12 @@ contract PolygonRollupManager is /////////////////////////////////////////////// /** - * @notice Add a new zkEVM type - * @param consensusImplementation new consensus implementation - * @param verifier new verifier address + * @notice Add a new rollup type + * @param consensusImplementation consensus implementation + * @param verifier verifier address * @param forkID forkID of the verifier - * @param genesis genesis block of the zkEVM - * @param description description of the zkEVM type + * @param genesis genesis block of the rollup + * @param description description of the rollup type */ function addNewRollupType( address consensusImplementation, @@ -607,7 +608,7 @@ contract PolygonRollupManager is /** * @notice Obsolete Rollup type - * @param rollupTypeID Consensus address to obsolete + * @param rollupTypeID Rollup type to obsolete */ function obsoleteRollupType( uint32 rollupTypeID @@ -631,7 +632,7 @@ contract PolygonRollupManager is /** * @notice Create a new rollup * @param rollupTypeID Rollup type to deploy - * @param chainID chainID + * @param chainID chainID of the rollup, must be a new one * @param admin admin of the new created rollup * @param trustedSequencer trusted sequencer of the new created rollup * @param gasTokenAddress Indicates the token address that will be used to pay gas fees in the new rollup @@ -767,6 +768,7 @@ contract PolygonRollupManager is rollup.verifier = verifier; rollup.chainID = chainID; rollup.rollupCompatibilityID = rollupCompatibilityID; + // rollup type is 0, since it does not follow any rollup type emit AddExistingRollup( rollupID, @@ -859,12 +861,12 @@ contract PolygonRollupManager is revert SenderMustBeRollup(); } - RollupData storage rollup = rollupIDToRollupData[rollupID]; - if (newSequencedBatches == 0) { revert MustSequenceSomeBatch(); } + RollupData storage rollup = rollupIDToRollupData[rollupID]; + // Update total sequence parameters totalSequencedBatches += newSequencedBatches; @@ -890,11 +892,13 @@ contract PolygonRollupManager is /** * @notice Allows an aggregator to verify multiple batches + * @param rollupID Rollup identifier * @param pendingStateNum Init pending state, 0 if consolidated state is used * @param initNumBatch Batch which the aggregator starts the verification * @param finalNewBatch Last batch aggregator intends to verify * @param newLocalExitRoot New local exit root once the batch is processed * @param newStateRoot New State root once the batch is processed + * @param beneficiary Address that will receive the verification reward * @param proof fflonk proof */ function verifyBatches( @@ -972,11 +976,13 @@ contract PolygonRollupManager is /** * @notice Allows an aggregator to verify multiple batches + * @param rollupID Rollup identifier * @param pendingStateNum Init pending state, 0 if consolidated state is used * @param initNumBatch Batch which the aggregator starts the verification * @param finalNewBatch Last batch aggregator intends to verify * @param newLocalExitRoot New local exit root once the batch is processed * @param newStateRoot New State root once the batch is processed + * @param beneficiary Address that will receive the verification reward * @param proof fflonk proof */ function verifyBatchesTrustedAggregator( @@ -1026,6 +1032,7 @@ contract PolygonRollupManager is /** * @notice Verify and reward batches internal function + * @param rollup Rollup Data struct that will be used to the verification * @param pendingStateNum Init pending state, 0 if consolidated state is used * @param initNumBatch Batch which the aggregator starts the verification * @param finalNewBatch Last batch aggregator intends to verify @@ -1224,6 +1231,7 @@ contract PolygonRollupManager is /** * @notice Allows the trusted aggregator to override the pending state * if it's possible to prove a different state root given the same batches + * @param rollupID Rollup identifier * @param initPendingStateNum Init pending state, 0 if consolidated state is used * @param finalPendingStateNum Final pending state, that will be used to compare with the newStateRoot * @param initNumBatch Batch which the aggregator starts the verification @@ -1277,6 +1285,7 @@ contract PolygonRollupManager is /** * @notice Allows to halt the PolygonZkEVM if its possible to prove a different state root given the same batches + * @param rollupID Rollup identifier * @param initPendingStateNum Init pending state, 0 if consolidated state is used * @param finalPendingStateNum Final pending state, that will be used to compare with the newStateRoot * @param initNumBatch Batch which the aggregator starts the verification @@ -1319,6 +1328,7 @@ contract PolygonRollupManager is /** * @notice Internal function that proves a different state root given the same batches to verify + * @param rollup Rollup Data struct that will be checked * @param initPendingStateNum Init pending state, 0 if consolidated state is used * @param finalPendingStateNum Final pending state, that will be used to compare with the newStateRoot * @param initNumBatch Batch which the aggregator starts the verification diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index 6d59c570c..e33a8a812 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -607,7 +607,7 @@ contract PolygonZkEVMBridgeV2 is // Get origin network from global index if (globalIndex & _GLOBAL_INDEX_MAINNET_FLAG == 1) { - // It's mainnet, therefore origin network is 0 + // It's mainnet, therefore sourceBridgeNetwork is 0 // last 32 bits are leafIndex leafIndex = uint32(globalIndex); diff --git a/contracts/v2/consensus/dataComittee/CDKDataCommittee.sol b/contracts/v2/consensus/dataComittee/CDKDataCommittee.sol index 57eb9f6f4..e02b3b4e7 100644 --- a/contracts/v2/consensus/dataComittee/CDKDataCommittee.sol +++ b/contracts/v2/consensus/dataComittee/CDKDataCommittee.sol @@ -131,13 +131,14 @@ contract CDKDataCommittee is ICDKDataCommitteeErrors, OwnableUpgradeable { for (uint256 i = 0; i < requiredAmountOfSignatures; i++) { uint256 currentSignatureStartingByte = i * _SIGNATURE_SIZE; + // Recover currnet signer from the signature address currentSigner = ECDSA.recover( signedHash, signaturesAndAddrs[currentSignatureStartingByte:currentSignatureStartingByte + _SIGNATURE_SIZE] ); - // Search inside the address array, the signer + // Search the recovered signer inside the address array bool currentSignerIsPartOfCommittee = false; for (uint256 j = lastAddrIndexUsed; j < addrsLen; j++) { uint256 currentAddresStartingByte = splitByte + j * _ADDR_SIZE; @@ -153,6 +154,9 @@ contract CDKDataCommittee is ICDKDataCommitteeErrors, OwnableUpgradeable { break; } } + + // If an address is not on the comittee, or not enough required signatures are provided + // This verification reverts if (!currentSignerIsPartOfCommittee) { revert CommitteeAddressDoesntExist(); } diff --git a/contracts/v2/consensus/zkEVM/PolygonZkEVMV2Upgraded.sol b/contracts/v2/consensus/zkEVM/PolygonZkEVMV2Upgraded.sol index 56c3c9946..5afc593c8 100644 --- a/contracts/v2/consensus/zkEVM/PolygonZkEVMV2Upgraded.sol +++ b/contracts/v2/consensus/zkEVM/PolygonZkEVMV2Upgraded.sol @@ -33,6 +33,8 @@ contract PolygonZkEVMV2Upgraded is PolygonRollupBase { {} /** + * note This initializer will be called instead of the PolygonRollupBase + * This is a especial initializer since the zkEVM it's an already created network * @param _admin Admin address * @param _trustedSequencer Trusted sequencer address * @param _trustedSequencerURL Trusted sequencer URL diff --git a/contracts/v2/interfaces/IPolygonRollupManager.sol b/contracts/v2/interfaces/IPolygonRollupManager.sol index ff9f0f090..8571ac77e 100644 --- a/contracts/v2/interfaces/IPolygonRollupManager.sol +++ b/contracts/v2/interfaces/IPolygonRollupManager.sol @@ -242,4 +242,9 @@ interface IPolygonRollupManager { * @dev When a rollup type does not exist */ error BatchFeeOutOfRange(); + + /** + * @dev When a rollup type does not exist + */ + error AllzkEVMSequencedBatchesMustBeVerified(); } diff --git a/contracts/v2/lib/PolygonRollupBase.sol b/contracts/v2/lib/PolygonRollupBase.sol index 03ff81583..b91316976 100644 --- a/contracts/v2/lib/PolygonRollupBase.sol +++ b/contracts/v2/lib/PolygonRollupBase.sol @@ -293,7 +293,7 @@ contract PolygonRollupBase is bytes32 currentTransactionsHash = keccak256(transaction); - // should be deterministic or easier deployment, TODO test 0 + // should be deterministic for easier deployment, TODO test 0 uint64 currentTimestamp = uint64(block.timestamp); bytes32 newAccInputHash = keccak256( From 0958757057c0c60dce5c6a50262a7a897c307fb8 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Sun, 8 Oct 2023 08:12:41 +0200 Subject: [PATCH 040/230] add comments --- contracts/v2/PolygonRollupManager.sol | 23 +++++++++++++++-------- contracts/v2/lib/PolygonRollupBase.sol | 2 +- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index 1b0803852..e45a0e820 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -16,7 +16,7 @@ import "./lib/PolygonAccessControlUpgradeable.sol"; import "../interfaces/IVerifierRollup.sol"; import "./consensus/zkEVM/PolygonZkEVMV2Upgraded.sol"; -// TODO check contract slots! +// review check contract slots! // Update OZ libs, new transaparent proxy is cheaper, but admin immutable /** * Contract responsible for managing the exit roots across multiple Rollups @@ -709,12 +709,13 @@ contract PolygonRollupManager is /** * @notice Add an already deployed rollup + * note that this rollup does not follow any rollupType * @param rollupAddress rollup address * @param verifier verifier address, must be added before - * @param forkID chain id of the created rollup - * @param chainID chain id of the created rollup - * @param genesis chain id of the created rollup - * @param rollupCompatibilityID chain id of the created rollup + * @param forkID fork id of the added rollup + * @param chainID chain id of the added rollup + * @param genesis genesis block for this rollup + * @param rollupCompatibilityID compatibility ID for the added rollup */ function addExistingRollup( IPolygonRollupBase rollupAddress, @@ -741,11 +742,12 @@ contract PolygonRollupManager is /** * @notice Add an already deployed rollup + * note that this rollup does not follow any rollupType * @param rollupAddress rollup address * @param verifier verifier address, must be added before - * @param forkID chain id of the created rollup - * @param chainID chain id of the created rollup - * @param rollupCompatibilityID chain id of the created rollup + * @param forkID fork id of the added rollup + * @param chainID chain id of the added rollup + * @param rollupCompatibilityID compatibility ID for the added rollup */ function _addExistingRollup( IPolygonRollupBase rollupAddress, @@ -798,6 +800,7 @@ contract PolygonRollupManager is revert RollupTypeDoesNotExist(); } + // check the rollup exists uint32 rollupID = rollupAddressToID[address(rollupContract)]; if (rollupID == 0) { revert RollupMustExist(); @@ -805,6 +808,7 @@ contract PolygonRollupManager is RollupData storage rollup = rollupIDToRollupData[rollupID]; + // The update must be to a new rollup type if (rollup.rollupTypeID == newRollupTypeID) { revert UpdateToSameRollupTypeID(); } @@ -1808,8 +1812,11 @@ contract PolygonRollupManager is return currentBalance / totalBatchesToVerify; } + /** * @notice 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 */ function getBatchFee() public view returns (uint256) { return _batchFee; diff --git a/contracts/v2/lib/PolygonRollupBase.sol b/contracts/v2/lib/PolygonRollupBase.sol index b91316976..826da4699 100644 --- a/contracts/v2/lib/PolygonRollupBase.sol +++ b/contracts/v2/lib/PolygonRollupBase.sol @@ -348,7 +348,7 @@ contract PolygonRollupBase is // Sequence/Verify batches functions //////////////////////////////////// - // TODO add the hashed forced data aswell?¿ + // TODO add the hashed forced data aswell?¿ /** * @notice Allows a sequencer to send multiple batches From c1c4f6d97d209063f854ad46e469cbcbe5bafdff Mon Sep 17 00:00:00 2001 From: invocamanman Date: Sun, 8 Oct 2023 08:41:43 +0200 Subject: [PATCH 041/230] index events --- contracts/v2/PolygonRollupManager.sol | 44 ++++++++++++++------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index e45a0e820..a556b0617 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -48,7 +48,6 @@ contract PolygonRollupManager is * @param forkID fork ID * @param rollupCompatibilityID Rollup compatibility ID, to check upgradability between rollup types * @param genesis Genesis block of the rollup, note that will only be used on creating new rollups, not upgrade them - * @param description Previous last batch sequenced before the current one, this is used to properly calculate the fees */ struct RollupType { address consensusImplementation; @@ -57,7 +56,6 @@ contract PolygonRollupManager is uint8 rollupCompatibilityID; bool obsolete; bytes32 genesis; - string description; } // review POssible optimization rto reduce bytecode, put maps on another struct or double mapping @@ -330,7 +328,7 @@ contract PolygonRollupManager is * @dev Emitted when a new rollup type is added */ event AddNewRollupType( - uint32 rollupTypeID, + uint32 indexed rollupTypeID, address consensusImplementation, address verifier, uint64 forkID, @@ -347,7 +345,7 @@ contract PolygonRollupManager is * @dev Emitted when a new rollup is created based on a rollupType */ event CreateNewRollup( - uint32 rollupID, + uint32 indexed rollupID, uint32 rollupTypeID, address rollupAddress, uint64 chainID @@ -357,7 +355,7 @@ contract PolygonRollupManager is * @dev Emitted when an existing rollup is added */ event AddExistingRollup( - uint32 rollupID, + uint32 indexed rollupID, uint64 forkID, address rollupAddress, uint64 chainID, @@ -368,7 +366,7 @@ contract PolygonRollupManager is * @dev Emitted when a rollup is udpated */ event UpdateRollup( - uint32 rollupID, + uint32 indexed rollupID, uint32 newRollupTypeID, uint64 lastVerifiedBatchBeforeUpgrade ); @@ -376,14 +374,14 @@ contract PolygonRollupManager is /** * @dev Emitted when a new verifier is added */ - event OnSequenceBatches(uint32 rollupID, uint64 lastBatchSequenced); + event OnSequenceBatches(uint32 indexed rollupID, uint64 lastBatchSequenced); /** * @dev Emitted when a aggregator verifies batches */ event VerifyBatches( - uint32 rollupID, - uint64 indexed numBatch, + uint32 indexed rollupID, + uint64 numBatch, bytes32 stateRoot, address indexed aggregator ); @@ -392,8 +390,8 @@ contract PolygonRollupManager is * @dev Emitted when a aggregator verifies batches */ event VerifyBatchesTrustedAggregator( - uint32 rollupID, - uint64 indexed numBatch, + uint32 indexed rollupID, + uint64 numBatch, bytes32 stateRoot, address indexed aggregator ); @@ -402,10 +400,10 @@ contract PolygonRollupManager is * @dev Emitted when pending state is consolidated */ event ConsolidatePendingState( - uint32 rollupID, - uint64 indexed numBatch, + uint32 indexed rollupID, + uint64 numBatch, bytes32 stateRoot, - uint64 indexed pendingStateNum + uint64 pendingStateNum ); /** @@ -420,9 +418,10 @@ contract PolygonRollupManager is * @dev Emitted when the trusted aggregator overrides pending state */ event OverridePendingState( - uint64 indexed numBatch, + uint32 indexed rollupID, + uint64 numBatch, bytes32 stateRoot, - address indexed aggregator + address aggregator ); /** @@ -592,8 +591,7 @@ contract PolygonRollupManager is forkID: forkID, rollupCompatibilityID: rollupCompatibilityID, obsolete: false, - genesis: genesis, - description: description + genesis: genesis }); emit AddNewRollupType( @@ -1284,7 +1282,12 @@ contract PolygonRollupManager is // Update trusted aggregator timeout to max trustedAggregatorTimeout = _HALT_AGGREGATION_TIMEOUT; - emit OverridePendingState(finalNewBatch, newStateRoot, msg.sender); + emit OverridePendingState( + rollupID, + finalNewBatch, + newStateRoot, + msg.sender + ); } /** @@ -1812,10 +1815,9 @@ contract PolygonRollupManager is return currentBalance / totalBatchesToVerify; } - /** * @notice Get batch fee - * This function is used instad of the automatic public view one, + * 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 */ function getBatchFee() public view returns (uint256) { From eda2d5c63b6fc6351210d7e465ffae8299ad5064 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Sun, 8 Oct 2023 09:10:56 +0200 Subject: [PATCH 042/230] update package json --- contracts/PolygonZkEVM.sol | 22 + contracts/lib/DepositContract.sol | 27 - hardhat.config.js | 12 + package-lock.json | 1028 +++++++++++++++++++++-------- package.json | 18 +- 5 files changed, 791 insertions(+), 316 deletions(-) diff --git a/contracts/PolygonZkEVM.sol b/contracts/PolygonZkEVM.sol index 435022435..4bc4a1826 100644 --- a/contracts/PolygonZkEVM.sol +++ b/contracts/PolygonZkEVM.sol @@ -1555,6 +1555,28 @@ contract PolygonZkEVM is _activateEmergencyState(); } + /** + * @notice Function to deactivate emergency state on both PolygonZkEVM and PolygonZkEVMBridge contracts + */ + function deactivateEmergencyState() external onlyAdmin { + // Deactivate emergency state on PolygonZkEVMBridge + bridgeAddress.deactivateEmergencyState(); + + // Deactivate emergency state on this contract + super._deactivateEmergencyState(); + } + + /** + * @notice Internal function to activate emergency state on both PolygonZkEVM and PolygonZkEVMBridge contracts + */ + function _activateEmergencyState() internal override { + // Activate emergency state on PolygonZkEVM Bridge + bridgeAddress.activateEmergencyState(); + + // Activate emergency state on this contract + super._activateEmergencyState(); + } + //////////////////////// // public/view functions //////////////////////// diff --git a/contracts/lib/DepositContract.sol b/contracts/lib/DepositContract.sol index ead711964..24bc34ab2 100644 --- a/contracts/lib/DepositContract.sol +++ b/contracts/lib/DepositContract.sol @@ -117,33 +117,6 @@ contract DepositContract is ReentrancyGuardUpgradeable { return node == root; } - /** - * @notice calcualte root from merkle proof - * @param leafHash Leaf hash - * @param smtProof Smt proof - * @param index Index of the leaf - */ - function calculateRoot( - bytes32 leafHash, - bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, - uint32 index - ) public pure returns (bytes32) { - bytes32 node = leafHash; - - // Check merkle proof - for ( - uint256 height = 0; - height < _DEPOSIT_CONTRACT_TREE_DEPTH; - height++ - ) { - if (((index >> height) & 1) == 1) - node = keccak256(abi.encodePacked(smtProof[height], node)); - else node = keccak256(abi.encodePacked(node, smtProof[height])); - } - - return node; - } - /** * @notice Given the leaf data returns the leaf value * @param leafType Leaf type --> [0] transfer Ether / ERC20 tokens, [1] message diff --git a/hardhat.config.js b/hardhat.config.js index 1d1ad9b91..9600c160a 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -54,6 +54,7 @@ module.exports = { runs: 999999, }, }, + }, { version: '0.5.16', @@ -73,6 +74,17 @@ module.exports = { enabled: true, runs: 99, }, + evmVersion: "shanghai", + },// try yul optimizer + }, + "contracts/v2/L2/PolygonZkEVMBridgeL2.sol": { + version: '0.8.20', + settings: { + optimizer: { + enabled: true, + runs: 9999, + }, + evmVersion: "shanghai", }, } } diff --git a/package-lock.json b/package-lock.json index 39178baa7..2b9db672d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7 +1,7 @@ { "name": "@0xpolygonhermez/zkevm-contracts", "version": "2.0.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -9,38 +9,38 @@ "version": "2.0.0", "license": "pending", "dependencies": { - "chai": "^4.3.7", + "chai": "^4.3.10", "ethers": "^5.7.2" }, "devDependencies": { - "@0xpolygonhermez/zkevm-commonjs": "github:0xPolygonHermez/zkevm-commonjs#v2.0.0-fork.5", - "@nomiclabs/hardhat-ethers": "^2.2.2", + "@0xpolygonhermez/zkevm-commonjs": "github:0xPolygonHermez/zkevm-commonjs#main", + "@nomiclabs/hardhat-ethers": "^2.2.3", "@nomiclabs/hardhat-etherscan": "^3.1.7", - "@nomiclabs/hardhat-waffle": "^2.0.5", + "@nomiclabs/hardhat-waffle": "^2.0.6", "@openzeppelin/contracts": "4.8.2", "@openzeppelin/contracts-upgradeable": "4.8.2", "@openzeppelin/hardhat-upgrades": "1.22.1", "@openzeppelin/test-helpers": "0.5.16", "circomlibjs": "0.1.1", "dotenv": "^8.6.0", - "eslint": "^8.36.0", + "eslint": "^8.51.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-mocha": "^9.0.0", "ethereum-waffle": "^3.4.4", - "ffjavascript": "^0.2.57", - "hardhat": "^2.16.1", + "ffjavascript": "^0.2.60", + "hardhat": "^2.18.0", "hardhat-dependency-compiler": "^1.1.3", "hardhat-gas-reporter": "^1.0.9", - "prettier": "^2.8.4", + "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-coverage": "^0.7.22", "solidity-docgen": "^0.5.17" } }, "node_modules/@0xpolygonhermez/zkevm-commonjs": { "version": "2.0.0", - "resolved": "git+ssh://git@github.com/0xPolygonHermez/zkevm-commonjs.git#035c6ae54ebdf2164bf8a97bb7fc38cb8127c9dd", + "resolved": "git+ssh://git@github.com/0xPolygonHermez/zkevm-commonjs.git#06a731c47a1c1642b34aa4c9a496e61e017f8b47", "dev": true, "license": "pending", "dependencies": { @@ -65,9 +65,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz", + "integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -2691,9 +2691,9 @@ } }, "node_modules/@openzeppelin/upgrades-core": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.30.1.tgz", - "integrity": "sha512-mFUsZibpiWJv1DR2K89cjbFIseTc2CUV4D2kvPPK5xYke6m7+M87qcr/Xk24mMrdCmG7RWNxQohhVnzESI6Eeg==", + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.28.0.tgz", + "integrity": "sha512-8RKlyg98Adv+46GxDaR0awL3R8bVCcQ27DcSEwrgWOp6siHh8sZg4a2l+2dhPl1510S6uBfhHSydMH5VX2BV5g==", "dev": true, "dependencies": { "cbor": "^9.0.0", @@ -4947,13 +4947,10 @@ } }, "node_modules/@types/node": { - "version": "20.8.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.6.tgz", - "integrity": "sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ==", - "dev": true, - "dependencies": { - "undici-types": "~5.25.1" - } + "version": "20.5.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", + "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==", + "dev": true }, "node_modules/@types/node-fetch": { "version": "2.6.6", @@ -7157,20 +7154,6 @@ "node": ">=6" } }, - "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/define-properties": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", @@ -8445,6 +8428,7 @@ "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", @@ -18752,9 +18736,9 @@ } }, "node_modules/hardhat": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.18.1.tgz", - "integrity": "sha512-b55rW7Ka+fvJeg6oWuBTXoYQEUurevCCankjGNTwczwD3GnkhV9GEei7KUT+9IKmWx3lC+zyxlFxeDbg0gUoHw==", + "version": "2.17.2", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.17.2.tgz", + "integrity": "sha512-oUv40jBeHw0dKpbyQ+iH9cmNMziweLoTW3MnkNxJ2Gc0KGLrQR/1n4vV4xY60zn2LdmRgnwPqy3CgtY0mfwIIA==", "dev": true, "dependencies": { "@ethersproject/abi": "^5.1.2", @@ -22920,9 +22904,9 @@ "dev": true }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", "dev": true, "dependencies": { "is-core-module": "^2.13.0", @@ -25268,9 +25252,9 @@ } }, "node_modules/undici": { - "version": "5.26.3", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.3.tgz", - "integrity": "sha512-H7n2zmKEWgOllKkIUkLvFmsJQj062lSm3uA4EYApG8gLuiOM0/go9bIoC3HVaSnfg4xunowDE2i9p8drkXuvDw==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.24.0.tgz", + "integrity": "sha512-OKlckxBjFl0oXxcj9FU6oB8fDAaiRUq+D8jrFWGmOfI/gIyjk/IeS75LMzgYKUaeHzLUcYvf9bbJGSrUwTfwwQ==", "dev": true, "dependencies": { "@fastify/busboy": "^2.0.0" @@ -26898,9 +26882,9 @@ "dev": true }, "@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz", + "integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==", "dev": true, "requires": { "regenerator-runtime": "^0.14.0" @@ -27009,9 +26993,9 @@ } }, "@eslint-community/regexpp": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz", - "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", + "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", "dev": true }, "@eslint/eslintrc": { @@ -27032,9 +27016,9 @@ } }, "@eslint/js": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", - "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", + "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", "dev": true }, "@ethereum-waffle/chai": { @@ -27630,12 +27614,6 @@ "@ethersproject/strings": "^5.7.0" } }, - "@fastify/busboy": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz", - "integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==", - "dev": true - }, "@humanwhocodes/config-array": { "version": "0.11.11", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", @@ -28618,9 +28596,9 @@ } }, "@oclif/plugin-help": { - "version": "5.2.20", - "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-5.2.20.tgz", - "integrity": "sha512-u+GXX/KAGL9S10LxAwNUaWdzbEBARJ92ogmM7g3gDVud2HioCmvWQCDohNRVZ9GYV9oKwZ/M8xwd6a1d95rEKQ==", + "version": "5.2.19", + "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-5.2.19.tgz", + "integrity": "sha512-gf6/dFtzMJ8RA4ovlBCBGJsZsd4jPXhYWJho+Gh6KmA+Ev9LupoExbE0qT+a2uHJyHEvIg4uX/MBW3qdERD/8g==", "dev": true, "requires": { "@oclif/core": "^2.15.0" @@ -28765,9 +28743,9 @@ } }, "@openzeppelin/upgrades-core": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.30.1.tgz", - "integrity": "sha512-mFUsZibpiWJv1DR2K89cjbFIseTc2CUV4D2kvPPK5xYke6m7+M87qcr/Xk24mMrdCmG7RWNxQohhVnzESI6Eeg==", + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.28.0.tgz", + "integrity": "sha512-8RKlyg98Adv+46GxDaR0awL3R8bVCcQ27DcSEwrgWOp6siHh8sZg4a2l+2dhPl1510S6uBfhHSydMH5VX2BV5g==", "dev": true, "requires": { "cbor": "^9.0.0", @@ -28777,7 +28755,7 @@ "ethereumjs-util": "^7.0.3", "minimist": "^1.2.7", "proper-lockfile": "^4.1.1", - "solidity-ast": "^0.4.51" + "solidity-ast": "^0.4.26" }, "dependencies": { "ansi-styles": { @@ -29261,9 +29239,9 @@ } }, "@truffle/contract": { - "version": "4.6.31", - "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.6.31.tgz", - "integrity": "sha512-s+oHDpXASnZosiCdzu+X1Tx5mUJUs1L1CYXIcgRmzMghzqJkaUFmR6NpNo7nJYliYbO+O9/aW8oCKqQ7rCHfmQ==", + "version": "4.6.30", + "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.6.30.tgz", + "integrity": "sha512-B7cQECm0WPda0/Q6kX720+LfkPits7hytNMlBzpgopgySPhgSycAAKNGPBFGhd824aBqeAvO6KrjWme6E+MU+A==", "dev": true, "requires": { "@ensdomains/ensjs": "^2.1.0", @@ -29525,9 +29503,9 @@ "dev": true }, "uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", "dev": true } } @@ -29933,9 +29911,9 @@ "dev": true }, "uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", "dev": true } } @@ -30568,15 +30546,15 @@ } }, "@types/abstract-leveldown": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/@types/abstract-leveldown/-/abstract-leveldown-7.2.3.tgz", - "integrity": "sha512-YAdL8tIYbiKoFjAf/0Ir3mvRJ/iFvBP/FK0I8Xa5rGWgVcq0xWOEInzlJfs6TIPWFweEOTKgNSBdxneUcHRvaw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@types/abstract-leveldown/-/abstract-leveldown-7.2.2.tgz", + "integrity": "sha512-EVVYLp4D3zwP5/sS2S5x70t1w0BDrjbv0x0d0znngFKX/YExe+il/JAlHOEpo0cTdtY4Ohnllen32hPganG20w==", "dev": true }, "@types/bn.js": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.2.tgz", - "integrity": "sha512-dkpZu0szUtn9UXTmw+e0AJFd4D2XAxDnsCLdc05SfqpqzPEBft8eQr8uaFitfo/dUUOZERaLec2hHMG87A4Dxg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", "dev": true, "requires": { "@types/node": "*" @@ -30595,16 +30573,16 @@ } }, "@types/chai": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.8.tgz", - "integrity": "sha512-yW/qTM4mRBBcsA9Xw9FbcImYtFPY7sgr+G/O5RDYVmxiy9a+pE5FyoFUi8JYCZY5nicj8atrr1pcfPiYpeNGOA==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==", "dev": true, "peer": true }, "@types/cli-progress": { - "version": "3.11.3", - "resolved": "https://registry.npmjs.org/@types/cli-progress/-/cli-progress-3.11.3.tgz", - "integrity": "sha512-/+C9xAdVtc+g5yHHkGBThgAA8rYpi5B+2ve3wLtybYj0JHEBs57ivR4x/zGfSsplRnV+psE91Nfin1soNKqz5Q==", + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/@types/cli-progress/-/cli-progress-3.11.2.tgz", + "integrity": "sha512-Yt/8rEJalfa9ve2SbfQnwFHrc9QF52JIZYHW3FDaTMpkCvnns26ueKiPHDxyJ0CS//IqjMINTx7R5Xa7k7uFHQ==", "dev": true, "requires": { "@types/node": "*" @@ -30639,9 +30617,9 @@ } }, "@types/http-cache-semantics": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.2.tgz", - "integrity": "sha512-FD+nQWA2zJjh4L9+pFXqWOi0Hs1ryBCfI+985NjluQ1p8EYtoLvjLOKidXBtZ4/IcxDX4o8/E8qDS3540tNliw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", "dev": true }, "@types/json5": { @@ -30699,22 +30677,19 @@ } }, "@types/node": { - "version": "20.8.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.6.tgz", - "integrity": "sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ==", - "dev": true, - "requires": { - "undici-types": "~5.25.1" - } + "version": "20.5.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", + "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==", + "dev": true }, "@types/node-fetch": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.6.tgz", - "integrity": "sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", + "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", "dev": true, "requires": { "@types/node": "*", - "form-data": "^4.0.0" + "form-data": "^3.0.0" } }, "@types/pbkdf2": { @@ -30766,27 +30741,27 @@ } }, "@types/responselike": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.1.tgz", - "integrity": "sha512-TiGnitEDxj2X0j+98Eqk5lv/Cij8oHd32bU4D/Yw6AOq7vvTk0gSD2GPj0G/HkvhMoVsdlhYF4yqqlyPBTM6Sg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", "dev": true, "requires": { "@types/node": "*" } }, "@types/secp256k1": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.4.tgz", - "integrity": "sha512-oN0PFsYxDZnX/qSJ5S5OwaEDTYfekhvaM5vqui2bu1AA39pKofmgL104Q29KiOXizXS2yLjSzc5YdTyMKdcy4A==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", "dev": true, "requires": { "@types/node": "*" } }, "@types/sinon": { - "version": "10.0.19", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.19.tgz", - "integrity": "sha512-MWZNGPSchIdDfb5FL+VFi4zHsHbNOTQEgjqFQk7HazXSXwUU9PAX3z9XBqb3AJGYr9YwrtCtaSMsT3brYsN/jQ==", + "version": "10.0.16", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.16.tgz", + "integrity": "sha512-j2Du5SYpXZjJVJtXBokASpPRj+e2z+VUhCPHmM6WMfe3dpHu6iVKJMU6AiBcMp/XTAYnEj6Wc1trJUWwZ0QaAQ==", "dev": true, "peer": true, "requires": { @@ -30794,9 +30769,9 @@ } }, "@types/sinon-chai": { - "version": "3.2.10", - "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.10.tgz", - "integrity": "sha512-D+VFqUjMqeku/FGl4Ioo+fDeWOaIfbZ6Oj+glgFUgz5m5RJ4kgCER3FdV1uvhmEt0A+FRz+juPdybFlg5Hxfow==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.9.tgz", + "integrity": "sha512-/19t63pFYU0ikrdbXKBWj9PCdnKyTd0Qkz0X91Ta081cYsq90OxYdcWwK/dwEoDa6dtXgj2HJfmzgq+QZTHdmQ==", "dev": true, "peer": true, "requires": { @@ -30805,9 +30780,9 @@ } }, "@types/sinonjs__fake-timers": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.3.tgz", - "integrity": "sha512-4g+2YyWe0Ve+LBh+WUm1697PD0Kdi6coG1eU0YjQbwx61AZ8XbEpL1zIT6WjuUKrCMCROpEaYQPDjBnDouBVAQ==", + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz", + "integrity": "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==", "dev": true, "peer": true }, @@ -31140,6 +31115,19 @@ "es-shim-unscopables": "^1.0.0" } }, + "array.prototype.reduce": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz", + "integrity": "sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + } + }, "arraybuffer.prototype.slice": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", @@ -31261,17 +31249,6 @@ "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", "dev": true }, - "axios": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", - "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", - "dev": true, - "requires": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, "b4a": { "version": "1.6.4", "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", @@ -31623,14 +31600,23 @@ } }, "bufferutil": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", - "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", + "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", "devOptional": true, "requires": { "node-gyp-build": "^4.3.0" } }, + "busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dev": true, + "requires": { + "streamsearch": "^1.1.0" + } + }, "bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -31745,17 +31731,17 @@ } }, "chai": { - "version": "4.3.10", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", - "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.8.tgz", + "integrity": "sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ==", "requires": { "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", "pathval": "^1.1.1", - "type-detect": "^4.0.8" + "type-detect": "^4.0.5" } }, "chalk": { @@ -31802,12 +31788,9 @@ "dev": true }, "check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "requires": { - "get-func-name": "^2.0.2" - } + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==" }, "cheerio": { "version": "1.0.0-rc.12", @@ -32227,9 +32210,9 @@ "dev": true }, "core-js-pure": { - "version": "3.33.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.33.0.tgz", - "integrity": "sha512-FKSIDtJnds/YFIEaZ4HszRX7hkxGpNKM7FC9aJ9WLJbSd3lD4vOltFuVIBLR8asSx9frkTSqL0dw90SKQxgKrg==", + "version": "3.32.2", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.32.2.tgz", + "integrity": "sha512-Y2rxThOuNywTjnX/PgA5vWM6CZ9QB9sz9oGeCixV8MqXZO70z/5SHzf9EeBrEBK0PN36DnEBBu9O/aGWzKuMZQ==", "dev": true }, "core-util-is": { @@ -32501,24 +32484,12 @@ } } }, - "define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - } - }, "define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, "requires": { - "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } @@ -32817,18 +32788,18 @@ } }, "es-abstract": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz", - "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", "dev": true, "requires": { "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.1", "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", + "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.2.1", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", @@ -32844,25 +32815,31 @@ "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", + "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", "typed-array-buffer": "^1.0.0", "typed-array-byte-length": "^1.0.0", "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.10" } }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, "es-set-tostringtag": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", @@ -33011,16 +32988,16 @@ } }, "eslint": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", - "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", + "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.51.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/js": "8.48.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -33385,22 +33362,24 @@ } }, "eth-gas-reporter": { - "version": "0.2.27", - "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.27.tgz", - "integrity": "sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==", + "version": "0.2.25", + "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz", + "integrity": "sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ==", "dev": true, "requires": { + "@ethersproject/abi": "^5.0.0-beta.146", "@solidity-parser/parser": "^0.14.0", - "axios": "^1.5.1", "cli-table3": "^0.5.0", "colors": "1.4.0", "ethereum-cryptography": "^1.0.3", - "ethers": "^5.7.2", + "ethers": "^4.0.40", "fs-readdir-recursive": "^1.1.0", "lodash": "^4.17.14", "markdown-table": "^1.1.3", - "mocha": "^10.2.0", + "mocha": "^7.1.1", "req-cwd": "^2.0.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.5", "sha1": "^1.1.1", "sync-request": "^6.0.0" }, @@ -33432,6 +33411,99 @@ "@scure/base": "~1.1.0" } }, + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true + }, + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, "ethereum-cryptography": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", @@ -33443,6 +33515,332 @@ "@scure/bip32": "1.1.5", "@scure/bip39": "1.1.1" } + }, + "ethers": { + "version": "4.0.49", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", + "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", + "dev": true, + "requires": { + "aes-js": "3.0.0", + "bn.js": "^4.11.9", + "elliptic": "6.5.4", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.4", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "flat": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", + "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", + "dev": true, + "requires": { + "is-buffer": "~2.0.3" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true + }, + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "mocha": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", + "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", + "dev": true, + "requires": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "chokidar": "3.3.0", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "3.0.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.5", + "ms": "2.1.1", + "node-environment-flags": "1.0.6", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true + }, + "readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.4" + } + }, + "scrypt-js": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", + "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==", + "dev": true + }, + "setimmediate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", + "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true + }, + "supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + } } } }, @@ -34020,26 +34418,26 @@ "dev": true }, "flat-cache": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", - "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", "dev": true, "requires": { - "flatted": "^3.2.9", + "flatted": "^3.2.7", "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, "flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, "follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "dev": true }, "for-each": { @@ -34058,9 +34456,9 @@ "dev": true }, "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dev": true, "requires": { "asynckit": "^0.4.0", @@ -34132,9 +34530,9 @@ "optional": true }, "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, "function.prototype.name": { @@ -41219,9 +41617,9 @@ "dev": true }, "get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==" }, "get-intrinsic": { "version": "1.2.1", @@ -41347,9 +41745,9 @@ } }, "globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -41430,6 +41828,12 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, "handlebars": { "version": "4.7.8", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", @@ -41468,9 +41872,9 @@ } }, "hardhat": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.18.1.tgz", - "integrity": "sha512-b55rW7Ka+fvJeg6oWuBTXoYQEUurevCCankjGNTwczwD3GnkhV9GEei7KUT+9IKmWx3lC+zyxlFxeDbg0gUoHw==", + "version": "2.17.2", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.17.2.tgz", + "integrity": "sha512-oUv40jBeHw0dKpbyQ+iH9cmNMziweLoTW3MnkNxJ2Gc0KGLrQR/1n4vV4xY60zn2LdmRgnwPqy3CgtY0mfwIIA==", "dev": true, "requires": { "@ethersproject/abi": "^5.1.2", @@ -41709,10 +42113,13 @@ } }, "has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "dev": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } }, "has-bigints": { "version": "1.0.2", @@ -42504,9 +42911,9 @@ } }, "keccak": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", - "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz", + "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==", "dev": true, "requires": { "node-addon-api": "^2.0.0", @@ -42523,9 +42930,9 @@ } }, "keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", "dev": true, "requires": { "json-buffer": "3.0.1" @@ -42833,11 +43240,11 @@ } }, "loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", "requires": { - "get-func-name": "^2.0.1" + "get-func-name": "^2.0.0" } }, "lower-case": { @@ -43420,6 +43827,24 @@ "lodash": "^4.17.21" } }, + "node-environment-flags": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", + "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + }, + "dependencies": { + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + } + } + }, "node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -43528,9 +43953,9 @@ "dev": true }, "object-inspect": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.0.tgz", - "integrity": "sha512-HQ4J+ic8hKrgIt3mqk6cVOVrW2ozL4KdvHlqpBv9vDYWx9ysAgENAdvy4FoGF+KFdhR7nQTNm5J0ctAeOwn+3g==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true }, "object-keys": { @@ -43580,6 +44005,19 @@ "es-abstract": "^1.22.1" } }, + "object.getownpropertydescriptors": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz", + "integrity": "sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==", + "dev": true, + "requires": { + "array.prototype.reduce": "^1.0.6", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "safe-array-concat": "^1.0.0" + } + }, "object.groupby": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", @@ -44289,12 +44727,6 @@ "ipaddr.js": "1.9.1" } }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -44546,14 +44978,14 @@ "dev": true }, "regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "functions-have-names": "^1.2.3" } }, "req-cwd": { @@ -44629,6 +45061,26 @@ } } }, + "request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "requires": { + "lodash": "^4.17.19" + } + }, + "request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "dev": true, + "requires": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -44642,15 +45094,15 @@ "dev": true }, "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, "resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", "dev": true, "requires": { "is-core-module": "^2.13.0", @@ -45024,17 +45476,6 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, - "set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "dev": true, - "requires": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" - } - }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -45290,6 +45731,12 @@ "graceful-fs": "^4.1.6" } }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", + "dev": true + }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -45325,6 +45772,12 @@ "ansi-regex": "^2.0.0" } }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==", + "dev": true + }, "wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", @@ -45682,9 +46135,9 @@ } }, "spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", "dev": true }, "split2": { @@ -45747,6 +46200,18 @@ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", + "dev": true + }, + "streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "dev": true + }, "strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", @@ -46502,20 +46967,14 @@ } }, "undici": { - "version": "5.26.3", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.3.tgz", - "integrity": "sha512-H7n2zmKEWgOllKkIUkLvFmsJQj062lSm3uA4EYApG8gLuiOM0/go9bIoC3HVaSnfg4xunowDE2i9p8drkXuvDw==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.24.0.tgz", + "integrity": "sha512-OKlckxBjFl0oXxcj9FU6oB8fDAaiRUq+D8jrFWGmOfI/gIyjk/IeS75LMzgYKUaeHzLUcYvf9bbJGSrUwTfwwQ==", "dev": true, "requires": { - "@fastify/busboy": "^2.0.0" + "busboy": "^1.6.0" } }, - "undici-types": { - "version": "5.25.3", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", - "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==", - "dev": true - }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -46553,13 +47012,13 @@ } }, "url": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", - "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.1.tgz", + "integrity": "sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA==", "dev": true, "requires": { "punycode": "^1.4.1", - "qs": "^6.11.2" + "qs": "^6.11.0" }, "dependencies": { "punycode": { @@ -47065,9 +47524,9 @@ } }, "uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", "dev": true }, "web3-core-helpers": { @@ -47505,9 +47964,9 @@ } }, "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "dev": true }, "which-typed-array": { @@ -47523,6 +47982,15 @@ "has-tostringtag": "^1.0.0" } }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, "widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", diff --git a/package.json b/package.json index 9ebf7b85f..b8879ec4a 100644 --- a/package.json +++ b/package.json @@ -30,31 +30,31 @@ "homepage": "https://github.com/0xPolygonHermez/contracts-zkEVM#readme", "license": "pending", "dependencies": { - "chai": "^4.3.7", + "chai": "^4.3.10", "ethers": "^5.7.2" }, "devDependencies": { - "@0xpolygonhermez/zkevm-commonjs": "github:0xPolygonHermez/zkevm-commonjs#v3.0.0-fork.6", - "@nomiclabs/hardhat-ethers": "^2.2.2", + "@0xpolygonhermez/zkevm-commonjs": "github:0xPolygonHermez/zkevm-commonjs#main", + "@nomiclabs/hardhat-ethers": "^2.2.3", "@nomiclabs/hardhat-etherscan": "^3.1.7", - "@nomiclabs/hardhat-waffle": "^2.0.5", + "@nomiclabs/hardhat-waffle": "^2.0.6", "@openzeppelin/contracts": "4.8.2", "@openzeppelin/contracts-upgradeable": "4.8.2", "@openzeppelin/hardhat-upgrades": "1.22.1", "@openzeppelin/test-helpers": "0.5.16", "circomlibjs": "0.1.1", "dotenv": "^8.6.0", - "eslint": "^8.36.0", + "eslint": "^8.51.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-mocha": "^9.0.0", "ethereum-waffle": "^3.4.4", - "ffjavascript": "^0.2.57", - "hardhat": "^2.16.1", + "ffjavascript": "^0.2.60", + "hardhat": "^2.18.0", "hardhat-dependency-compiler": "^1.1.3", "hardhat-gas-reporter": "^1.0.9", - "prettier": "^2.8.4", + "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-coverage": "^0.7.22", "solidity-docgen": "^0.5.17" }, From 00d6ea8b4141f4653d8e997a8b8e0965c61035c2 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Sun, 8 Oct 2023 13:15:10 +0200 Subject: [PATCH 043/230] start ts migration --- .gitignore | 3 +- contracts/v2/PolygonRollupManager.sol | 5 +- .../v2/mocks/PolygonRollupManagerMock.sol | 67 + deployment/0_createGenesisMainnet.js | 26 +- deployment/1_createGenesis.js | 22 +- deployment/2_deployPolygonZKEVMDeployer.js | 6 +- deployment/3_deployContracts.js | 8 +- deployment/helpers/deployment-helpers.js | 18 +- deployment/testnet/prepareGasToken.js | 6 +- deployment/testnet/prepareTestnet.js | 10 +- deployment/verifyContracts.js | 2 +- hardhat.config.js => hardhat.config.ts | 19 +- package-lock.json | 34300 +++++++--------- package.json | 16 +- src/permit-helper.js | 16 +- test/contracts/bridge.test.js | 199 +- test/contracts/bridgeMock.test.js | 28 +- test/contracts/bridge_metadata.test.js | 36 +- test/contracts/bridge_permit.test.js | 34 +- test/contracts/depositContractMock.test.js | 25 +- test/contracts/emergencyManager.test.js | 20 +- test/contracts/globalExitRootManager.test.js | 6 +- .../contracts/globalExitRootManagerL2.test.js | 8 +- test/contracts/polygonZkEVM.test.js | 78 +- test/contracts/polygonZkEVMDeployer.test.js | 38 +- test/contracts/polygonZkEVMTestnetV2.test.js | 8 +- test/contracts/polygonZkEVMUpgraded.test.js | 26 +- .../real-prover/real-flow.test.js-ignore | 16 +- test/contracts/snark_stark_input.test.js | 2 +- test/contracts/timelockUpgradeTest.js | 26 +- test/contractsv2/PolygonRollupManager.test.js | 166 + tsconfig.json | 11 + upgrade/timeLockUpgrade.js | 8 +- 33 files changed, 15897 insertions(+), 19362 deletions(-) create mode 100644 contracts/v2/mocks/PolygonRollupManagerMock.sol rename hardhat.config.js => hardhat.config.ts (95%) create mode 100644 test/contractsv2/PolygonRollupManager.test.js create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore index 5b4527753..07ce8cbb8 100644 --- a/.gitignore +++ b/.gitignore @@ -17,4 +17,5 @@ deploy_parameters.json deployments upgrade_parameters.json docker/gethData/ -*.ignore/ \ No newline at end of file +*.ignore/ +typechain-types/ \ No newline at end of file diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index a556b0617..e2dbfc0d1 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -3,21 +3,18 @@ pragma solidity 0.8.20; import "./interfaces/IPolygonRollupManager.sol"; -import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "../interfaces/IPolygonZkEVMGlobalExitRoot.sol"; import "../interfaces/IPolygonZkEVMBridge.sol"; import "./interfaces/IPolygonRollupBase.sol"; import "../lib/EmergencyManager.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; -import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; -import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import "./lib/PolygonAccessControlUpgradeable.sol"; import "../interfaces/IVerifierRollup.sol"; import "./consensus/zkEVM/PolygonZkEVMV2Upgraded.sol"; // review check contract slots! -// Update OZ libs, new transaparent proxy is cheaper, but admin immutable +// review Update OZ libs, new transaparent proxy is cheaper, but admin immutable /** * Contract responsible for managing the exit roots across multiple Rollups */ diff --git a/contracts/v2/mocks/PolygonRollupManagerMock.sol b/contracts/v2/mocks/PolygonRollupManagerMock.sol new file mode 100644 index 000000000..f0403493e --- /dev/null +++ b/contracts/v2/mocks/PolygonRollupManagerMock.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.20; +import "../PolygonRollupManager.sol"; + +/** + * PolygonRollupManager mock + */ +contract PolygonRollupManagerMock is PolygonRollupManager { + /** + * @param _globalExitRootManager Global exit root manager address + * @param _pol MATIC token address + * @param _bridgeAddress Bridge address + */ + constructor( + IPolygonZkEVMGlobalExitRoot _globalExitRootManager, + IERC20Upgradeable _pol, + IPolygonZkEVMBridge _bridgeAddress + ) PolygonRollupManager(_globalExitRootManager, _pol, _bridgeAddress) {} + + function initializeMock( + address _trustedAggregator, + uint64 _pendingStateTimeout, + uint64 _trustedAggregatorTimeout, + address admin, + address timelock, + address emergencyCouncil + ) external initializer { + trustedAggregator = _trustedAggregator; + pendingStateTimeout = _pendingStateTimeout; + trustedAggregatorTimeout = _trustedAggregatorTimeout; + + // Constant deployment variables + _batchFee = 0.1 ether; // 0.1 Matic + verifyBatchTimeTarget = 30 minutes; + multiplierBatchFee = 1002; + + // Initialize OZ contracts + __AccessControl_init(); + + // setup roles + + // Timelock roles + _setupRole(DEFAULT_ADMIN_ROLE, timelock); + _setupRole(_ADD_ROLLUP_TYPE_ROLE, timelock); + _setupRole(_ADD_EXISTING_ROLLUP_ROLE, timelock); + + // Even this role can only update to an already added verifier/consensus + // Could break the compatibility of them, changing the virtual state + // review + _setupRole(_UPDATE_ROLLUP_ROLE, timelock); + + // Admin roles + _setupRole(_OBSOLETE_ROLLUP_TYPE_ROLE, admin); + _setupRole(_CREATE_ROLLUP_ROLE, admin); + _setupRole(_STOP_EMERGENCY_ROLE, admin); + _setupRole(_TRUSTED_AGGREGATOR_ROLE, admin); + _setupRole(_TWEAK_PARAMETERS_ROLE, admin); + + // review Could be another address?¿ + _setupRole(_SET_FEE_ROLE, admin); + + // Emergency council roles + _setRoleAdmin(_EMERGENCY_COUNCIL_ROLE, _EMERGENCY_COUNCIL_ADMIN); + _setupRole(_EMERGENCY_COUNCIL_ROLE, emergencyCouncil); + _setupRole(_EMERGENCY_COUNCIL_ADMIN, emergencyCouncil); + } +} diff --git a/deployment/0_createGenesisMainnet.js b/deployment/0_createGenesisMainnet.js index 2a4386d1e..38a756d80 100644 --- a/deployment/0_createGenesisMainnet.js +++ b/deployment/0_createGenesisMainnet.js @@ -43,7 +43,7 @@ async function main() { // Constant variables const attemptsDeployProxy = 20; const networkIDL2 = 1; - const zkevmAddressL2 = ethers.constants.AddressZero; + const zkevmAddressL2 = ethers.ZeroAddress; const timelockAddress = mainnetMultisig; const initialZkEVMDeployerOwner = mainnetInitialZkEVMDeployerOwner; @@ -190,8 +190,8 @@ async function main() { const bridgeProxyInfo = await getAddressInfo(proxyBridgeAddress); // Override admin and implementation slots: - bridgeProxyInfo.storage[_ADMIN_SLOT] = ethers.utils.hexZeroPad(mainnetProxyAdminAddress, 32); - bridgeProxyInfo.storage[_IMPLEMENTATION_SLOT] = ethers.utils.hexZeroPad(mainnetZkEVMBridgeImplementationAddress, 32); + bridgeProxyInfo.storage[_ADMIN_SLOT] = ethers.hexZeroPad(mainnetProxyAdminAddress, 32); + bridgeProxyInfo.storage[_IMPLEMENTATION_SLOT] = ethers.hexZeroPad(mainnetZkEVMBridgeImplementationAddress, 32); // update proxy storage genesis.push({ @@ -219,8 +219,8 @@ async function main() { const proxyGlobalExitRootL2Info = await getAddressInfo(polygonZkEVMGlobalExitRootL2.address); // Override admin and implementation slots: - proxyGlobalExitRootL2Info.storage[_ADMIN_SLOT] = ethers.utils.hexZeroPad(mainnetProxyAdminAddress, 32); - proxyGlobalExitRootL2Info.storage[_IMPLEMENTATION_SLOT] = ethers.utils.hexZeroPad(mainnetGlobalExitRootL2ImplementationAddress, 32); + proxyGlobalExitRootL2Info.storage[_ADMIN_SLOT] = ethers.hexZeroPad(mainnetProxyAdminAddress, 32); + proxyGlobalExitRootL2Info.storage[_IMPLEMENTATION_SLOT] = ethers.hexZeroPad(mainnetGlobalExitRootL2ImplementationAddress, 32); genesis.push({ contractName: 'PolygonZkEVMGlobalExitRootL2 proxy', @@ -242,26 +242,26 @@ async function main() { * bytes32 public constant CANCELLER_ROLE = keccak256("CANCELLER_ROLE"); */ const timelockRolesHash = [ - ethers.utils.id('TIMELOCK_ADMIN_ROLE'), - ethers.utils.id('PROPOSER_ROLE'), - ethers.utils.id('EXECUTOR_ROLE'), - ethers.utils.id('CANCELLER_ROLE'), + ethers.id('TIMELOCK_ADMIN_ROLE'), + ethers.id('PROPOSER_ROLE'), + ethers.id('EXECUTOR_ROLE'), + ethers.id('CANCELLER_ROLE'), ]; for (let i = 0; i < timelockRolesHash.length; i++) { const rolesMappingStoragePositionStruct = 0; - const storagePosition = ethers.utils.solidityKeccak256(['uint256', 'uint256'], [timelockRolesHash[i], rolesMappingStoragePositionStruct]); + const storagePosition = ethers.solidityPackedKeccak256(['uint256', 'uint256'], [timelockRolesHash[i], rolesMappingStoragePositionStruct]); // check timelock address manager, and timelock address itself const addressArray = [timelockAddress, timelockContract.address]; for (let j = 0; j < addressArray.length; j++) { - const storagePositionRole = ethers.utils.solidityKeccak256(['uint256', 'uint256'], [addressArray[j], storagePosition]); + const storagePositionRole = ethers.solidityPackedKeccak256(['uint256', 'uint256'], [addressArray[j], storagePosition]); const valueRole = await ethers.provider.getStorageAt(timelockContract.address, storagePositionRole); if (valueRole !== '0x0000000000000000000000000000000000000000000000000000000000000000') { timelockInfo.storage[storagePositionRole] = valueRole; } } - const roleAdminSlot = ethers.utils.hexZeroPad((ethers.BigNumber.from(storagePosition).add(1)).toHexString(), 32); + const roleAdminSlot = ethers.hexZeroPad((ethers.BigNumber.from(storagePosition).add(1)).toHexString(), 32); const valueRoleAdminSlot = await ethers.provider.getStorageAt(timelockContract.address, roleAdminSlot); if (valueRoleAdminSlot !== '0x0000000000000000000000000000000000000000000000000000000000000000') { timelockInfo.storage[roleAdminSlot] = valueRoleAdminSlot; @@ -326,7 +326,7 @@ async function getAddressInfo(address) { for (let i = 0; i < 120; i++) { const storageValue = await ethers.provider.getStorageAt(address, i); if (storageValue !== '0x0000000000000000000000000000000000000000000000000000000000000000') { - storage[ethers.utils.hexZeroPad(ethers.utils.hexlify(i), 32)] = storageValue; + storage[ethers.hexZeroPad(ethers.hexlify(i), 32)] = storageValue; } } diff --git a/deployment/1_createGenesis.js b/deployment/1_createGenesis.js index 0db3cc42b..56e27fbdb 100644 --- a/deployment/1_createGenesis.js +++ b/deployment/1_createGenesis.js @@ -34,7 +34,7 @@ async function main() { const attemptsDeployProxy = 20; const networkIDL2 = 1; const globalExitRootL2Address = '0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa'; - const zkevmAddressL2 = ethers.constants.AddressZero; + const zkevmAddressL2 = ethers.ZeroAddress; const maxUint256 = ethers.BigNumber.from('0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff').toString(); let balanceBrige; @@ -296,8 +296,8 @@ async function main() { // Bridge proxy const bridgeProxyInfo = await getAddressInfo(proxyBridgeAddress); // Override admin and implementation slots: - bridgeProxyInfo.storage[_ADMIN_SLOT] = ethers.utils.hexZeroPad(proxyAdminAddress, 32); - bridgeProxyInfo.storage[_IMPLEMENTATION_SLOT] = ethers.utils.hexZeroPad(finalBridgeImplAddress, 32); + bridgeProxyInfo.storage[_ADMIN_SLOT] = ethers.hexZeroPad(proxyAdminAddress, 32); + bridgeProxyInfo.storage[_IMPLEMENTATION_SLOT] = ethers.hexZeroPad(finalBridgeImplAddress, 32); genesis.push({ contractName: 'PolygonZkEVMBridge proxy', @@ -342,26 +342,26 @@ async function main() { * bytes32 public constant CANCELLER_ROLE = keccak256("CANCELLER_ROLE"); */ const timelockRolesHash = [ - ethers.utils.id('TIMELOCK_ADMIN_ROLE'), - ethers.utils.id('PROPOSER_ROLE'), - ethers.utils.id('EXECUTOR_ROLE'), - ethers.utils.id('CANCELLER_ROLE'), + ethers.id('TIMELOCK_ADMIN_ROLE'), + ethers.id('PROPOSER_ROLE'), + ethers.id('EXECUTOR_ROLE'), + ethers.id('CANCELLER_ROLE'), ]; for (let i = 0; i < timelockRolesHash.length; i++) { const rolesMappingStoragePositionStruct = 0; - const storagePosition = ethers.utils.solidityKeccak256(['uint256', 'uint256'], [timelockRolesHash[i], rolesMappingStoragePositionStruct]); + const storagePosition = ethers.solidityPackedKeccak256(['uint256', 'uint256'], [timelockRolesHash[i], rolesMappingStoragePositionStruct]); // check timelock address manager, and timelock address itself const addressArray = [timelockAddress, timelockContract.address]; for (let j = 0; j < addressArray.length; j++) { - const storagePositionRole = ethers.utils.solidityKeccak256(['uint256', 'uint256'], [addressArray[j], storagePosition]); + const storagePositionRole = ethers.solidityPackedKeccak256(['uint256', 'uint256'], [addressArray[j], storagePosition]); const valueRole = await ethers.provider.getStorageAt(timelockContract.address, storagePositionRole); if (valueRole !== '0x0000000000000000000000000000000000000000000000000000000000000000') { timelockInfo.storage[storagePositionRole] = valueRole; } } - const roleAdminSlot = ethers.utils.hexZeroPad((ethers.BigNumber.from(storagePosition).add(1)).toHexString(), 32); + const roleAdminSlot = ethers.hexZeroPad((ethers.BigNumber.from(storagePosition).add(1)).toHexString(), 32); const valueRoleAdminSlot = await ethers.provider.getStorageAt(timelockContract.address, roleAdminSlot); if (valueRoleAdminSlot !== '0x0000000000000000000000000000000000000000000000000000000000000000') { timelockInfo.storage[roleAdminSlot] = valueRoleAdminSlot; @@ -439,7 +439,7 @@ async function getAddressInfo(address) { for (let i = 0; i < 120; i++) { const storageValue = await ethers.provider.getStorageAt(address, i); if (storageValue !== '0x0000000000000000000000000000000000000000000000000000000000000000') { - storage[ethers.utils.hexZeroPad(ethers.utils.hexlify(i), 32)] = storageValue; + storage[ethers.hexZeroPad(ethers.hexlify(i), 32)] = storageValue; } } diff --git a/deployment/2_deployPolygonZKEVMDeployer.js b/deployment/2_deployPolygonZKEVMDeployer.js index fdb9836c2..54493d5ff 100644 --- a/deployment/2_deployPolygonZKEVMDeployer.js +++ b/deployment/2_deployPolygonZKEVMDeployer.js @@ -19,8 +19,8 @@ async function main() { if (deployParameters.maxPriorityFeePerGas && deployParameters.maxFeePerGas) { console.log(`Hardcoded gas used: MaxPriority${deployParameters.maxPriorityFeePerGas} gwei, MaxFee${deployParameters.maxFeePerGas} gwei`); const FEE_DATA = { - maxFeePerGas: ethers.utils.parseUnits(deployParameters.maxFeePerGas, 'gwei'), - maxPriorityFeePerGas: ethers.utils.parseUnits(deployParameters.maxPriorityFeePerGas, 'gwei'), + maxFeePerGas: ethers.parseUnits(deployParameters.maxFeePerGas, 'gwei'), + maxPriorityFeePerGas: ethers.parseUnits(deployParameters.maxPriorityFeePerGas, 'gwei'), }; currentProvider.getFeeData = async () => FEE_DATA; } else { @@ -58,7 +58,7 @@ async function main() { // Deploy PolygonZkEVMDeployer if is not deployed already using keyless deployment const [zkEVMDeployerContract, keylessDeployer] = await deployPolygonZkEVMDeployer(initialZkEVMDeployerOwner, deployer); - if (keylessDeployer === ethers.constants.AddressZero) { + if (keylessDeployer === ethers.ZeroAddress) { console.log('#######################\n'); console.log('polygonZkEVMDeployer already deployed on: ', zkEVMDeployerContract.address); } else { diff --git a/deployment/3_deployContracts.js b/deployment/3_deployContracts.js index 0cbd9bb8d..b1d1cbb71 100644 --- a/deployment/3_deployContracts.js +++ b/deployment/3_deployContracts.js @@ -90,8 +90,8 @@ async function main() { if (deployParameters.maxPriorityFeePerGas && deployParameters.maxFeePerGas) { console.log(`Hardcoded gas used: MaxPriority${deployParameters.maxPriorityFeePerGas} gwei, MaxFee${deployParameters.maxFeePerGas} gwei`); const FEE_DATA = { - maxFeePerGas: ethers.utils.parseUnits(deployParameters.maxFeePerGas, 'gwei'), - maxPriorityFeePerGas: ethers.utils.parseUnits(deployParameters.maxPriorityFeePerGas, 'gwei'), + maxFeePerGas: ethers.parseUnits(deployParameters.maxFeePerGas, 'gwei'), + maxPriorityFeePerGas: ethers.parseUnits(deployParameters.maxPriorityFeePerGas, 'gwei'), }; currentProvider.getFeeData = async () => FEE_DATA; } else { @@ -232,8 +232,8 @@ async function main() { fs.writeFileSync(pathOngoingDeploymentJson, JSON.stringify(ongoingDeployment, null, 1)); // Contracts are not deployed, normal deployment - precalculateGLobalExitRootAddress = ethers.utils.getContractAddress({ from: deployer.address, nonce: nonceProxyGlobalExitRoot }); - precalculateZkevmAddress = ethers.utils.getContractAddress({ from: deployer.address, nonce: nonceProxyZkevm }); + precalculateGLobalExitRootAddress = ethers.getContractAddress({ from: deployer.address, nonce: nonceProxyGlobalExitRoot }); + precalculateZkevmAddress = ethers.getContractAddress({ from: deployer.address, nonce: nonceProxyZkevm }); } const dataCallProxy = polygonZkEVMBridgeFactory.interface.encodeFunctionData( diff --git a/deployment/helpers/deployment-helpers.js b/deployment/helpers/deployment-helpers.js index 569f2529d..87f332fc7 100644 --- a/deployment/helpers/deployment-helpers.js +++ b/deployment/helpers/deployment-helpers.js @@ -13,7 +13,7 @@ async function deployPolygonZkEVMDeployer(deployerAddress, signer) { )).data; const gasLimit = ethers.BigNumber.from(1000000); // Put 1 Million, aprox 650k are necessary - const gasPrice = ethers.BigNumber.from(ethers.utils.parseUnits(gasPriceKeylessDeployment, 'gwei')); + const gasPrice = ethers.BigNumber.from(ethers.parseUnits(gasPriceKeylessDeployment, 'gwei')); const to = '0x'; // bc deployment transaction, "to" is "0x" const tx = { to, @@ -29,16 +29,16 @@ async function deployPolygonZkEVMDeployer(deployerAddress, signer) { r: '0x5ca1ab1e0', // Equals 0x00000000000000000000000000000000000000000000000000000005ca1ab1e0 s: '0x5ca1ab1e', // Equals 0x000000000000000000000000000000000000000000000000000000005ca1ab1e }; - const serializedTransaction = ethers.utils.serializeTransaction(tx, signature); - const resultTransaction = ethers.utils.parseTransaction(serializedTransaction); + const serializedTransaction = ethers.serializeTransaction(tx, signature); + const resultTransaction = ethers.parseTransaction(serializedTransaction); const totalEther = gasLimit.mul(gasPrice); // 0.1 ether // Check if it's already deployed - const zkEVMDeployerAddress = ethers.utils.getContractAddress(resultTransaction); + const zkEVMDeployerAddress = ethers.getContractAddress(resultTransaction); if (await signer.provider.getCode(zkEVMDeployerAddress) !== '0x') { const zkEVMDeployerContract = PolgonZKEVMDeployerFactory.attach(zkEVMDeployerAddress); expect(await zkEVMDeployerContract.owner()).to.be.equal(signer.address); - return [zkEVMDeployerContract, ethers.constants.AddressZero]; + return [zkEVMDeployerContract, ethers.ZeroAddress]; } // Fund keyless deployment @@ -58,10 +58,10 @@ async function deployPolygonZkEVMDeployer(deployerAddress, signer) { async function create2Deployment(polgonZKEVMDeployerContract, salt, deployTransaction, dataCall, deployer, hardcodedGasLimit) { // Encode deploy transaction - const hashInitCode = ethers.utils.solidityKeccak256(['bytes'], [deployTransaction]); + const hashInitCode = ethers.solidityPackedKeccak256(['bytes'], [deployTransaction]); // Precalculate create2 address - const precalculatedAddressDeployed = ethers.utils.getCreate2Address(polgonZKEVMDeployerContract.address, salt, hashInitCode); + const precalculatedAddressDeployed = ethers.getCreate2Address(polgonZKEVMDeployerContract.address, salt, hashInitCode); const amount = 0; if (await deployer.provider.getCode(precalculatedAddressDeployed) !== '0x') { @@ -101,10 +101,10 @@ async function create2Deployment(polgonZKEVMDeployerContract, salt, deployTransa function getCreate2Address(polgonZKEVMDeployerContract, salt, deployTransaction) { // Encode deploy transaction - const hashInitCode = ethers.utils.solidityKeccak256(['bytes'], [deployTransaction]); + const hashInitCode = ethers.solidityPackedKeccak256(['bytes'], [deployTransaction]); // Precalculate create2 address - return ethers.utils.getCreate2Address(polgonZKEVMDeployerContract.address, salt, hashInitCode); + return ethers.getCreate2Address(polgonZKEVMDeployerContract.address, salt, hashInitCode); } module.exports = { diff --git a/deployment/testnet/prepareGasToken.js b/deployment/testnet/prepareGasToken.js index 36d961ee0..aa8626134 100644 --- a/deployment/testnet/prepareGasToken.js +++ b/deployment/testnet/prepareGasToken.js @@ -17,8 +17,8 @@ async function main() { if (deployParameters.maxPriorityFeePerGas && deployParameters.maxFeePerGas) { console.log(`Hardcoded gas used: MaxPriority${deployParameters.maxPriorityFeePerGas} gwei, MaxFee${deployParameters.maxFeePerGas} gwei`); const FEE_DATA = { - maxFeePerGas: ethers.utils.parseUnits(deployParameters.maxFeePerGas, 'gwei'), - maxPriorityFeePerGas: ethers.utils.parseUnits(deployParameters.maxPriorityFeePerGas, 'gwei'), + maxFeePerGas: ethers.parseUnits(deployParameters.maxFeePerGas, 'gwei'), + maxPriorityFeePerGas: ethers.parseUnits(deployParameters.maxPriorityFeePerGas, 'gwei'), }; currentProvider.getFeeData = async () => FEE_DATA; } else { @@ -52,7 +52,7 @@ async function main() { */ const gasTokenName = 'Gas Token'; const gasTokenSymbol = 'GT'; - const gasTokenInitialBalance = ethers.utils.parseEther('20000000'); + const gasTokenInitialBalance = ethers.parseEther('20000000'); const gasTokenFactory = await ethers.getContractFactory('ERC20PermitMock', deployer); const gasTokenContract = await gasTokenFactory.deploy( diff --git a/deployment/testnet/prepareTestnet.js b/deployment/testnet/prepareTestnet.js index a337cd279..e1c4cec49 100644 --- a/deployment/testnet/prepareTestnet.js +++ b/deployment/testnet/prepareTestnet.js @@ -17,8 +17,8 @@ async function main() { if (deployParameters.maxPriorityFeePerGas && deployParameters.maxFeePerGas) { console.log(`Hardcoded gas used: MaxPriority${deployParameters.maxPriorityFeePerGas} gwei, MaxFee${deployParameters.maxFeePerGas} gwei`); const FEE_DATA = { - maxFeePerGas: ethers.utils.parseUnits(deployParameters.maxFeePerGas, 'gwei'), - maxPriorityFeePerGas: ethers.utils.parseUnits(deployParameters.maxPriorityFeePerGas, 'gwei'), + maxFeePerGas: ethers.parseUnits(deployParameters.maxFeePerGas, 'gwei'), + maxPriorityFeePerGas: ethers.parseUnits(deployParameters.maxPriorityFeePerGas, 'gwei'), }; currentProvider.getFeeData = async () => FEE_DATA; } else { @@ -69,7 +69,7 @@ async function main() { */ const maticTokenName = 'Matic Token'; const maticTokenSymbol = 'MATIC'; - const maticTokenInitialBalance = ethers.utils.parseEther('20000000'); + const maticTokenInitialBalance = ethers.parseEther('20000000'); const maticTokenFactory = await ethers.getContractFactory('ERC20PermitMock', deployer); const maticTokenContract = await maticTokenFactory.deploy( @@ -85,7 +85,7 @@ async function main() { // fund sequencer account with tokens and ether if it have less than 0.1 ether. const balanceEther = await ethers.provider.getBalance(trustedSequencer); - const minEtherBalance = ethers.utils.parseEther('0.1'); + const minEtherBalance = ethers.parseEther('0.1'); if (balanceEther < minEtherBalance) { const params = { to: trustedSequencer, @@ -93,7 +93,7 @@ async function main() { }; await deployer.sendTransaction(params); } - const tokensBalance = ethers.utils.parseEther('100000'); + const tokensBalance = ethers.parseEther('100000'); await (await maticTokenContract.transfer(trustedSequencer, tokensBalance)).wait(); // fund aggregator account with ether if it have less than 0.1 ether. diff --git a/deployment/verifyContracts.js b/deployment/verifyContracts.js index 9c26bde16..017866a63 100644 --- a/deployment/verifyContracts.js +++ b/deployment/verifyContracts.js @@ -19,7 +19,7 @@ async function main() { // verify maticToken const maticTokenName = 'Matic Token'; const maticTokenSymbol = 'MATIC'; - const maticTokenInitialBalance = ethers.utils.parseEther('20000000'); + const maticTokenInitialBalance = ethers.parseEther('20000000'); try { // verify governance await hre.run( diff --git a/hardhat.config.js b/hardhat.config.ts similarity index 95% rename from hardhat.config.js rename to hardhat.config.ts index 9600c160a..de851cb21 100644 --- a/hardhat.config.js +++ b/hardhat.config.ts @@ -1,10 +1,9 @@ -require('dotenv').config(); -require('@nomiclabs/hardhat-waffle'); -require('hardhat-gas-reporter'); -require('solidity-coverage'); -require('@nomiclabs/hardhat-etherscan'); -require('@openzeppelin/hardhat-upgrades'); -require('hardhat-dependency-compiler'); +import 'dotenv/config' +import "@nomicfoundation/hardhat-toolbox"; +import '@openzeppelin/hardhat-upgrades'; +import 'hardhat-dependency-compiler'; + +import { HardhatUserConfig } from "hardhat/config"; const DEFAULT_MNEMONIC = 'test test test test test test test test test test test junk'; @@ -16,7 +15,9 @@ const DEFAULT_MNEMONIC = 'test test test test test test test test test test test /** * @type import('hardhat/config').HardhatUserConfig */ -module.exports = { + + +const config: HardhatUserConfig = { dependencyCompiler: { paths: [ '@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol', @@ -197,3 +198,5 @@ module.exports = { ], }, }; + +export default config; diff --git a/package-lock.json b/package-lock.json index 2b9db672d..af6101bf6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,19 +8,13 @@ "name": "@0xpolygonhermez/zkevm-contracts", "version": "2.0.0", "license": "pending", - "dependencies": { - "chai": "^4.3.10", - "ethers": "^5.7.2" - }, "devDependencies": { "@0xpolygonhermez/zkevm-commonjs": "github:0xPolygonHermez/zkevm-commonjs#main", - "@nomiclabs/hardhat-ethers": "^2.2.3", - "@nomiclabs/hardhat-etherscan": "^3.1.7", - "@nomiclabs/hardhat-waffle": "^2.0.6", + "@nomicfoundation/hardhat-toolbox": "^3.0.0", "@openzeppelin/contracts": "4.8.2", "@openzeppelin/contracts-upgradeable": "4.8.2", - "@openzeppelin/hardhat-upgrades": "1.22.1", - "@openzeppelin/test-helpers": "0.5.16", + "@openzeppelin/contracts5": "npm:@openzeppelin/contracts@^5.0.0", + "@openzeppelin/hardhat-upgrades": "2.3.1", "circomlibjs": "0.1.1", "dotenv": "^8.6.0", "eslint": "^8.51.0", @@ -30,11 +24,9 @@ "ffjavascript": "^0.2.60", "hardhat": "^2.18.0", "hardhat-dependency-compiler": "^1.1.3", - "hardhat-gas-reporter": "^1.0.9", "prettier": "^2.8.8", "prettier-plugin-solidity": "^1.1.3", "solc-0.8": "npm:solc@^0.8.20", - "solidity-coverage": "^0.7.22", "solidity-docgen": "^0.5.17" } }, @@ -55,6 +47,54 @@ "pg": "^8.7.1" } }, + "node_modules/@0xpolygonhermez/zkevm-commonjs/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" + } + }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", @@ -70,12 +110,56 @@ "integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==", "dev": true, "dependencies": { - "regenerator-runtime": "^0.14.0" + "@aws-crypto/util": "^1.2.2", + "@aws-sdk/types": "^3.1.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/util": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-1.2.2.tgz", + "integrity": "sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "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==", + "dev": true, + "dependencies": { + "@smithy/types": "^2.3.4", + "tslib": "^2.5.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/types/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "dev": true, + "dependencies": { + "tslib": "^2.3.1" } }, + "node_modules/@aws-sdk/util-utf8-browser/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, "node_modules/@chainsafe/as-sha256": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz", @@ -114,27 +198,6 @@ "node": ">=12" } }, - "node_modules/@ensdomains/address-encoder": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@ensdomains/address-encoder/-/address-encoder-0.1.9.tgz", - "integrity": "sha512-E2d2gP4uxJQnDu2Kfg1tHNspefzbLT8Tyjrm5sEuim32UkU2sm5xL4VXtgc2X33fmPEw9+jUMpGs4veMbf+PYg==", - "dev": true, - "dependencies": { - "bech32": "^1.1.3", - "blakejs": "^1.1.0", - "bn.js": "^4.11.8", - "bs58": "^4.0.1", - "crypto-addr-codec": "^0.1.7", - "nano-base32": "^1.0.1", - "ripemd160": "^2.0.2" - } - }, - "node_modules/@ensdomains/address-encoder/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, "node_modules/@ensdomains/ens": { "version": "0.4.5", "resolved": "https://registry.npmjs.org/@ensdomains/ens/-/ens-0.4.5.tgz", @@ -149,127 +212,45 @@ "web3-utils": "^1.0.0-beta.31" } }, - "node_modules/@ensdomains/ensjs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@ensdomains/ensjs/-/ensjs-2.1.0.tgz", - "integrity": "sha512-GRbGPT8Z/OJMDuxs75U/jUNEC0tbL0aj7/L/QQznGYKm/tiasp+ndLOaoULy9kKJFC0TBByqfFliEHDgoLhyog==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.4.4", - "@ensdomains/address-encoder": "^0.1.7", - "@ensdomains/ens": "0.4.5", - "@ensdomains/resolver": "0.2.4", - "content-hash": "^2.5.2", - "eth-ens-namehash": "^2.0.8", - "ethers": "^5.0.13", - "js-sha3": "^0.8.0" - } - }, - "node_modules/@ensdomains/resolver": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz", - "integrity": "sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==", - "deprecated": "Please use @ensdomains/ens-contracts", - "dev": true - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz", - "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "node_modules/@ensdomains/ens/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=0.10.0" } }, - "node_modules/@eslint/js": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", - "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", + "node_modules/@ensdomains/ens/node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=0.10.0" } }, - "node_modules/@ethereum-waffle/chai": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@ethereum-waffle/chai/-/chai-3.4.4.tgz", - "integrity": "sha512-/K8czydBtXXkcM9X6q29EqEkc5dN3oYenyH2a9hF7rGAApAJUpH8QBtojxOY/xQ2up5W332jqgxwp0yPiYug1g==", + "node_modules/@ensdomains/ens/node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", "dev": true, "dependencies": { - "@ethereum-waffle/provider": "^3.4.4", - "ethers": "^5.5.2" - }, - "engines": { - "node": ">=10.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" } }, - "node_modules/@ethereum-waffle/compiler": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@ethereum-waffle/compiler/-/compiler-3.4.4.tgz", - "integrity": "sha512-RUK3axJ8IkD5xpWjWoJgyHclOeEzDLQFga6gKpeGxiS/zBu+HB0W2FvsrrLalTFIaPw/CGYACRBSIxqiCqwqTQ==", + "node_modules/@ensdomains/ens/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, - "dependencies": { - "@resolver-engine/imports": "^0.3.3", - "@resolver-engine/imports-fs": "^0.3.3", - "@typechain/ethers-v5": "^2.0.0", - "@types/mkdirp": "^0.5.2", - "@types/node-fetch": "^2.5.5", - "ethers": "^5.0.1", - "mkdirp": "^0.5.1", - "node-fetch": "^2.6.1", - "solc": "^0.6.3", - "ts-generator": "^0.1.1", - "typechain": "^3.0.0" - }, "engines": { - "node": ">=10.0" + "node": ">=0.10.0" } }, - "node_modules/@ethereum-waffle/compiler/node_modules/commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", - "dev": true - }, - "node_modules/@ethereum-waffle/compiler/node_modules/fs-extra": { + "node_modules/@ensdomains/ens/node_modules/fs-extra": { "version": "0.30.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", @@ -282,7 +263,25 @@ "rimraf": "^2.2.8" } }, - "node_modules/@ethereum-waffle/compiler/node_modules/jsonfile": { + "node_modules/@ensdomains/ens/node_modules/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "node_modules/@ensdomains/ens/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ensdomains/ens/node_modules/jsonfile": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", @@ -291,16 +290,16 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/@ethereum-waffle/compiler/node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "node_modules/@ensdomains/ens/node_modules/require-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/@ethereum-waffle/compiler/node_modules/rimraf": { + "node_modules/@ensdomains/ens/node_modules/rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", @@ -312,7 +311,7 @@ "rimraf": "bin.js" } }, - "node_modules/@ethereum-waffle/compiler/node_modules/semver": { + "node_modules/@ensdomains/ens/node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", @@ -321,174 +320,180 @@ "semver": "bin/semver" } }, - "node_modules/@ethereum-waffle/compiler/node_modules/solc": { - "version": "0.6.12", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.6.12.tgz", - "integrity": "sha512-Lm0Ql2G9Qc7yPP2Ba+WNmzw2jwsrd3u4PobHYlSOxaut3TtUbj9+5ZrT6f4DUpNPEoBaFUOEg9Op9C0mk7ge9g==", + "node_modules/@ensdomains/ens/node_modules/solc": { + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz", + "integrity": "sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==", "dev": true, "dependencies": { - "command-exists": "^1.2.8", - "commander": "3.0.2", "fs-extra": "^0.30.0", - "js-sha3": "0.8.0", "memorystream": "^0.3.1", - "require-from-string": "^2.0.0", - "semver": "^5.5.0", - "tmp": "0.0.33" + "require-from-string": "^1.1.0", + "semver": "^5.3.0", + "yargs": "^4.7.1" }, "bin": { "solcjs": "solcjs" - }, - "engines": { - "node": ">=8.0.0" } }, - "node_modules/@ethereum-waffle/ens": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@ethereum-waffle/ens/-/ens-3.4.4.tgz", - "integrity": "sha512-0m4NdwWxliy3heBYva1Wr4WbJKLnwXizmy5FfSSr5PMbjI7SIGCdCB59U7/ZzY773/hY3bLnzLwvG5mggVjJWg==", + "node_modules/@ensdomains/ens/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", "dev": true, "dependencies": { - "@ensdomains/ens": "^0.4.4", - "@ensdomains/resolver": "^0.2.4", - "ethers": "^5.5.2" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" }, "engines": { - "node": ">=10.0" + "node": ">=0.10.0" } }, - "node_modules/@ethereum-waffle/mock-contract": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-3.4.4.tgz", - "integrity": "sha512-Mp0iB2YNWYGUV+VMl5tjPsaXKbKo8MDH9wSJ702l9EBjdxFf/vBvnMBAC1Fub1lLtmD0JHtp1pq+mWzg/xlLnA==", + "node_modules/@ensdomains/ens/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "dependencies": { - "@ethersproject/abi": "^5.5.0", - "ethers": "^5.5.2" + "ansi-regex": "^2.0.0" }, "engines": { - "node": ">=10.0" + "node": ">=0.10.0" } }, - "node_modules/@ethereum-waffle/provider": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@ethereum-waffle/provider/-/provider-3.4.4.tgz", - "integrity": "sha512-GK8oKJAM8+PKy2nK08yDgl4A80mFuI8zBkE0C9GqTRYQqvuxIyXoLmJ5NZU9lIwyWVv5/KsoA11BgAv2jXE82g==", + "node_modules/@ensdomains/ens/node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", "dev": true, "dependencies": { - "@ethereum-waffle/ens": "^3.4.4", - "ethers": "^5.5.2", - "ganache-core": "^2.13.2", - "patch-package": "^6.2.2", - "postinstall-postinstall": "^2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" }, "engines": { - "node": ">=10.0" + "node": ">=0.10.0" } }, - "node_modules/@ethereumjs/block": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@ethereumjs/block/-/block-3.6.3.tgz", - "integrity": "sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg==", + "node_modules/@ensdomains/ens/node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true + }, + "node_modules/@ensdomains/ens/node_modules/yargs": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", + "integrity": "sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==", "dev": true, "dependencies": { - "@ethereumjs/common": "^2.6.5", - "@ethereumjs/tx": "^3.5.2", - "ethereumjs-util": "^7.1.5", - "merkle-patricia-tree": "^4.2.4" + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "lodash.assign": "^4.0.3", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.1", + "which-module": "^1.0.0", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^2.4.1" } }, - "node_modules/@ethereumjs/blockchain": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/@ethereumjs/blockchain/-/blockchain-5.5.3.tgz", - "integrity": "sha512-bi0wuNJ1gw4ByNCV56H0Z4Q7D+SxUbwyG12Wxzbvqc89PXLRNR20LBcSUZRKpN0+YCPo6m0XZL/JLio3B52LTw==", + "node_modules/@ensdomains/ens/node_modules/yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", "dev": true, "dependencies": { - "@ethereumjs/block": "^3.6.2", - "@ethereumjs/common": "^2.6.4", - "@ethereumjs/ethash": "^1.1.0", - "debug": "^4.3.3", - "ethereumjs-util": "^7.1.5", - "level-mem": "^5.0.1", - "lru-cache": "^5.1.1", - "semaphore-async-await": "^1.5.1" + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" } }, - "node_modules/@ethereumjs/common": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", - "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", + "node_modules/@ensdomains/resolver": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz", + "integrity": "sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==", + "deprecated": "Please use @ensdomains/ens-contracts", + "dev": true + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.5" + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@ethereumjs/ethash": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/ethash/-/ethash-1.1.0.tgz", - "integrity": "sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA==", + "node_modules/@eslint-community/regexpp": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz", + "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==", "dev": true, - "dependencies": { - "@ethereumjs/block": "^3.5.0", - "@types/levelup": "^4.3.0", - "buffer-xor": "^2.0.1", - "ethereumjs-util": "^7.1.1", - "miller-rabin": "^4.0.0" + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@ethereumjs/rlp": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", - "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", + "node_modules/@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", "dev": true, - "bin": { - "rlp": "bin/rlp" + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">=14" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@ethereumjs/tx": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", - "integrity": "sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==", + "node_modules/@eslint/js": { + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", + "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", "dev": true, - "dependencies": { - "@ethereumjs/common": "^2.6.4", - "ethereumjs-util": "^7.1.5" + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@ethereumjs/util": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", - "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", + "node_modules/@ethereum-waffle/chai": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/@ethereum-waffle/chai/-/chai-3.4.4.tgz", + "integrity": "sha512-/K8czydBtXXkcM9X6q29EqEkc5dN3oYenyH2a9hF7rGAApAJUpH8QBtojxOY/xQ2up5W332jqgxwp0yPiYug1g==", "dev": true, "dependencies": { - "@ethereumjs/rlp": "^4.0.1", - "ethereum-cryptography": "^2.0.0", - "micro-ftch": "^0.3.1" + "@ethereum-waffle/provider": "^3.4.4", + "ethers": "^5.5.2" }, "engines": { - "node": ">=14" + "node": ">=10.0" } }, - "node_modules/@ethereumjs/util/node_modules/ethereum-cryptography": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz", - "integrity": "sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==", + "node_modules/@ethereum-waffle/chai/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", "dev": true, - "dependencies": { - "@noble/curves": "1.1.0", - "@noble/hashes": "1.3.1", - "@scure/bip32": "1.3.1", - "@scure/bip39": "1.2.1" - } - }, - "node_modules/@ethersproject/abi": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", - "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", "funding": [ { "type": "individual", @@ -500,107 +505,104 @@ } ], "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" } }, - "node_modules/@ethersproject/abstract-provider": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", - "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0" + "node_modules/@ethereum-waffle/compiler": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/@ethereum-waffle/compiler/-/compiler-3.4.4.tgz", + "integrity": "sha512-RUK3axJ8IkD5xpWjWoJgyHclOeEzDLQFga6gKpeGxiS/zBu+HB0W2FvsrrLalTFIaPw/CGYACRBSIxqiCqwqTQ==", + "dev": true, + "dependencies": { + "@resolver-engine/imports": "^0.3.3", + "@resolver-engine/imports-fs": "^0.3.3", + "@typechain/ethers-v5": "^2.0.0", + "@types/mkdirp": "^0.5.2", + "@types/node-fetch": "^2.5.5", + "ethers": "^5.0.1", + "mkdirp": "^0.5.1", + "node-fetch": "^2.6.1", + "solc": "^0.6.3", + "ts-generator": "^0.1.1", + "typechain": "^3.0.0" + }, + "engines": { + "node": ">=10.0" } }, - "node_modules/@ethersproject/abstract-signer": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", - "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@ethereum-waffle/compiler/node_modules/@typechain/ethers-v5": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-2.0.0.tgz", + "integrity": "sha512-0xdCkyGOzdqh4h5JSf+zoWx85IusEjDcPIwNEHP8mrWSnCae4rvrqB+/gtpdNfX7zjlFlZiMeePn2r63EI3Lrw==", + "dev": true, "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0" + "ethers": "^5.0.2" + }, + "peerDependencies": { + "ethers": "^5.0.0", + "typechain": "^3.0.0" } }, - "node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@ethereum-waffle/compiler/node_modules/array-back": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", + "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", + "dev": true, "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" + "typical": "^2.6.1" + }, + "engines": { + "node": ">=4" } }, - "node_modules/@ethersproject/base64": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", - "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@ethereum-waffle/compiler/node_modules/command-line-args": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-4.0.7.tgz", + "integrity": "sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA==", + "dev": true, "dependencies": { - "@ethersproject/bytes": "^5.7.0" + "array-back": "^2.0.0", + "find-replace": "^1.0.3", + "typical": "^2.6.1" + }, + "bin": { + "command-line-args": "bin/cli.js" } }, - "node_modules/@ethersproject/basex": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", - "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", + "node_modules/@ethereum-waffle/compiler/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "dev": true, "funding": [ { "type": "individual", @@ -612,182 +614,147 @@ } ], "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/properties": "^5.7.0" + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" } }, - "node_modules/@ethersproject/bignumber": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", - "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@ethereum-waffle/compiler/node_modules/find-replace": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz", + "integrity": "sha512-KrUnjzDCD9426YnCP56zGYy/eieTnhtK6Vn++j+JJzmlsWWwEkDnsyVF575spT6HJ6Ow9tlbT3TQTDsa+O4UWA==", + "dev": true, "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "bn.js": "^5.2.1" + "array-back": "^1.0.4", + "test-value": "^2.1.0" + }, + "engines": { + "node": ">=4.0.0" } }, - "node_modules/@ethersproject/bytes": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", - "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@ethereum-waffle/compiler/node_modules/find-replace/node_modules/array-back": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", + "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==", + "dev": true, "dependencies": { - "@ethersproject/logger": "^5.7.0" + "typical": "^2.6.0" + }, + "engines": { + "node": ">=0.12.0" } }, - "node_modules/@ethersproject/constants": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", - "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@ethereum-waffle/compiler/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, "dependencies": { - "@ethersproject/bignumber": "^5.7.0" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" } }, - "node_modules/@ethersproject/contracts": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", - "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abi": "^5.7.0", - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0" + "node_modules/@ethereum-waffle/compiler/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/@ethersproject/hash": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", - "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" + "node_modules/@ethereum-waffle/compiler/node_modules/ts-essentials": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-6.0.7.tgz", + "integrity": "sha512-2E4HIIj4tQJlIHuATRHayv0EfMGK3ris/GRk1E3CFnsZzeNV+hUmelbaTZHLtXaZppM5oLhHRtO04gINC4Jusw==", + "dev": true, + "peerDependencies": { + "typescript": ">=3.7.0" } }, - "node_modules/@ethersproject/hdnode": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", - "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@ethereum-waffle/compiler/node_modules/typechain": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/typechain/-/typechain-3.0.0.tgz", + "integrity": "sha512-ft4KVmiN3zH4JUFu2WJBrwfHeDf772Tt2d8bssDTo/YcckKW2D+OwFrHXRC6hJvO3mHjFQTihoMV6fJOi0Hngg==", + "dev": true, "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" + "command-line-args": "^4.0.7", + "debug": "^4.1.1", + "fs-extra": "^7.0.0", + "js-sha3": "^0.8.0", + "lodash": "^4.17.15", + "ts-essentials": "^6.0.3", + "ts-generator": "^0.1.1" + }, + "bin": { + "typechain": "dist/cli/cli.js" } }, - "node_modules/@ethersproject/json-wallets": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", - "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@ethereum-waffle/compiler/node_modules/typical": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", + "integrity": "sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==", + "dev": true + }, + "node_modules/@ethereum-waffle/compiler/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@ethereum-waffle/ens": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/@ethereum-waffle/ens/-/ens-3.4.4.tgz", + "integrity": "sha512-0m4NdwWxliy3heBYva1Wr4WbJKLnwXizmy5FfSSr5PMbjI7SIGCdCB59U7/ZzY773/hY3bLnzLwvG5mggVjJWg==", + "dev": true, "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "aes-js": "3.0.0", - "scrypt-js": "3.0.1" + "@ensdomains/ens": "^0.4.4", + "@ensdomains/resolver": "^0.2.4", + "ethers": "^5.5.2" + }, + "engines": { + "node": ">=10.0" } }, - "node_modules/@ethersproject/keccak256": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", - "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", + "node_modules/@ethereum-waffle/ens/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "dev": true, "funding": [ { "type": "individual", @@ -799,29 +766,56 @@ } ], "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "js-sha3": "0.8.0" + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" } }, - "node_modules/@ethersproject/logger": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", - "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ] + "node_modules/@ethereum-waffle/mock-contract": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-3.4.4.tgz", + "integrity": "sha512-Mp0iB2YNWYGUV+VMl5tjPsaXKbKo8MDH9wSJ702l9EBjdxFf/vBvnMBAC1Fub1lLtmD0JHtp1pq+mWzg/xlLnA==", + "dev": true, + "dependencies": { + "@ethersproject/abi": "^5.5.0", + "ethers": "^5.5.2" + }, + "engines": { + "node": ">=10.0" + } }, - "node_modules/@ethersproject/networks": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", - "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", + "node_modules/@ethereum-waffle/mock-contract/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "dev": true, "funding": [ { "type": "individual", @@ -833,13 +827,59 @@ } ], "dependencies": { - "@ethersproject/logger": "^5.7.0" + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" } }, - "node_modules/@ethersproject/pbkdf2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", - "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", + "node_modules/@ethereum-waffle/provider": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/@ethereum-waffle/provider/-/provider-3.4.4.tgz", + "integrity": "sha512-GK8oKJAM8+PKy2nK08yDgl4A80mFuI8zBkE0C9GqTRYQqvuxIyXoLmJ5NZU9lIwyWVv5/KsoA11BgAv2jXE82g==", + "dev": true, + "dependencies": { + "@ethereum-waffle/ens": "^3.4.4", + "ethers": "^5.5.2", + "ganache-core": "^2.13.2", + "patch-package": "^6.2.2", + "postinstall-postinstall": "^2.1.0" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/@ethereum-waffle/provider/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "dev": true, "funding": [ { "type": "individual", @@ -851,32 +891,154 @@ } ], "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/sha2": "^5.7.0" - } - }, - "node_modules/@ethersproject/properties": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", - "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" + } + }, + "node_modules/@ethereumjs/block": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@ethereumjs/block/-/block-3.6.3.tgz", + "integrity": "sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg==", + "dev": true, "dependencies": { - "@ethersproject/logger": "^5.7.0" + "@ethereumjs/common": "^2.6.5", + "@ethereumjs/tx": "^3.5.2", + "ethereumjs-util": "^7.1.5", + "merkle-patricia-tree": "^4.2.4" } }, - "node_modules/@ethersproject/providers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", - "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", + "node_modules/@ethereumjs/blockchain": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/@ethereumjs/blockchain/-/blockchain-5.5.3.tgz", + "integrity": "sha512-bi0wuNJ1gw4ByNCV56H0Z4Q7D+SxUbwyG12Wxzbvqc89PXLRNR20LBcSUZRKpN0+YCPo6m0XZL/JLio3B52LTw==", + "dev": true, + "dependencies": { + "@ethereumjs/block": "^3.6.2", + "@ethereumjs/common": "^2.6.4", + "@ethereumjs/ethash": "^1.1.0", + "debug": "^4.3.3", + "ethereumjs-util": "^7.1.5", + "level-mem": "^5.0.1", + "lru-cache": "^5.1.1", + "semaphore-async-await": "^1.5.1" + } + }, + "node_modules/@ethereumjs/common": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", + "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", + "dev": true, + "dependencies": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.5" + } + }, + "node_modules/@ethereumjs/ethash": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/ethash/-/ethash-1.1.0.tgz", + "integrity": "sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA==", + "dev": true, + "dependencies": { + "@ethereumjs/block": "^3.5.0", + "@types/levelup": "^4.3.0", + "buffer-xor": "^2.0.1", + "ethereumjs-util": "^7.1.1", + "miller-rabin": "^4.0.0" + } + }, + "node_modules/@ethereumjs/rlp": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", + "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", + "dev": true, + "bin": { + "rlp": "bin/rlp" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@ethereumjs/tx": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", + "integrity": "sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==", + "dev": true, + "dependencies": { + "@ethereumjs/common": "^2.6.4", + "ethereumjs-util": "^7.1.5" + } + }, + "node_modules/@ethereumjs/util": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", + "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", + "dev": true, + "dependencies": { + "@ethereumjs/rlp": "^4.0.1", + "ethereum-cryptography": "^2.0.0", + "micro-ftch": "^0.3.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@ethereumjs/util/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==", + "dev": true, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ethereumjs/util/node_modules/ethereum-cryptography": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz", + "integrity": "sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==", + "dev": true, + "dependencies": { + "@noble/curves": "1.1.0", + "@noble/hashes": "1.3.1", + "@scure/bip32": "1.3.1", + "@scure/bip39": "1.2.1" + } + }, + "node_modules/@ethersproject/abi": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "dev": true, "funding": [ { "type": "individual", @@ -888,32 +1050,22 @@ } ], "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/basex": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/constants": "^5.7.0", "@ethersproject/hash": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0", - "bech32": "1.1.4", - "ws": "7.4.6" + "@ethersproject/strings": "^5.7.0" } }, - "node_modules/@ethersproject/random": { + "node_modules/@ethersproject/abstract-provider": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", - "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", + "dev": true, "funding": [ { "type": "individual", @@ -925,14 +1077,20 @@ } ], "dependencies": { + "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0" } }, - "node_modules/@ethersproject/rlp": { + "node_modules/@ethersproject/abstract-signer": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", - "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", + "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", + "dev": true, "funding": [ { "type": "individual", @@ -944,14 +1102,18 @@ } ], "dependencies": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0" } }, - "node_modules/@ethersproject/sha2": { + "node_modules/@ethersproject/address": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", - "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "dev": true, "funding": [ { "type": "individual", @@ -963,15 +1125,18 @@ } ], "dependencies": { + "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", "@ethersproject/logger": "^5.7.0", - "hash.js": "1.1.7" + "@ethersproject/rlp": "^5.7.0" } }, - "node_modules/@ethersproject/signing-key": { + "node_modules/@ethersproject/base64": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", - "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", + "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", + "dev": true, "funding": [ { "type": "individual", @@ -983,18 +1148,14 @@ } ], "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "bn.js": "^5.2.1", - "elliptic": "6.5.4", - "hash.js": "1.1.7" + "@ethersproject/bytes": "^5.7.0" } }, - "node_modules/@ethersproject/solidity": { + "node_modules/@ethersproject/basex": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", - "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", + "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", + "dev": true, "funding": [ { "type": "individual", @@ -1006,18 +1167,15 @@ } ], "dependencies": { - "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0" + "@ethersproject/properties": "^5.7.0" } }, - "node_modules/@ethersproject/strings": { + "node_modules/@ethersproject/bignumber": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", - "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", + "dev": true, "funding": [ { "type": "individual", @@ -1030,14 +1188,15 @@ ], "dependencies": { "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" } }, - "node_modules/@ethersproject/transactions": { + "node_modules/@ethersproject/bytes": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", - "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", + "dev": true, "funding": [ { "type": "individual", @@ -1049,21 +1208,14 @@ } ], "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0" + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/@ethersproject/units": { + "node_modules/@ethersproject/constants": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", - "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", + "dev": true, "funding": [ { "type": "individual", @@ -1075,15 +1227,14 @@ } ], "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" + "@ethersproject/bignumber": "^5.7.0" } }, - "node_modules/@ethersproject/wallet": { + "node_modules/@ethersproject/contracts": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", - "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", + "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", + "dev": true, "funding": [ { "type": "individual", @@ -1095,27 +1246,23 @@ } ], "dependencies": { + "@ethersproject/abi": "^5.7.0", "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/json-wallets": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/constants": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" + "@ethersproject/transactions": "^5.7.0" } }, - "node_modules/@ethersproject/web": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", - "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", + "node_modules/@ethersproject/hash": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", + "dev": true, "funding": [ { "type": "individual", @@ -1127,17 +1274,22 @@ } ], "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", "@ethersproject/base64": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/strings": "^5.7.0" } }, - "node_modules/@ethersproject/wordlists": { + "node_modules/@ethersproject/hdnode": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", - "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", + "dev": true, "funding": [ { "type": "individual", @@ -1149,5900 +1301,1616 @@ } ], "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@fastify/busboy": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz", - "integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==", - "dev": true, - "engines": { - "node": ">=14" + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "node_modules/@ethersproject/json-wallets": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", + "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "aes-js": "3.0.0", + "scrypt-js": "3.0.1" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "node_modules/@ethersproject/json-wallets/node_modules/aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", "dev": true }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "node_modules/@ethersproject/keccak256": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", + "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", "dev": true, - "engines": { - "node": ">=6.0.0" + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "js-sha3": "0.8.0" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "node_modules/@ethersproject/logger": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ] }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "node_modules/@ethersproject/networks": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/@metamask/eth-sig-util": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", - "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", + "node_modules/@ethersproject/pbkdf2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", + "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "ethereumjs-abi": "^0.6.8", - "ethereumjs-util": "^6.2.1", - "ethjs-util": "^0.1.6", - "tweetnacl": "^1.0.3", - "tweetnacl-util": "^0.15.1" - }, - "engines": { - "node": ">=12.0.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/sha2": "^5.7.0" } }, - "node_modules/@metamask/eth-sig-util/node_modules/@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "node_modules/@ethersproject/properties": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@types/node": "*" + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/@metamask/eth-sig-util/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/@metamask/eth-sig-util/node_modules/ethereumjs-util": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", - "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", - "dev": true, - "dependencies": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - }, - "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/@noble/hashes": { - "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" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/secp256k1": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", - "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nomicfoundation/ethereumjs-block": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.2.tgz", - "integrity": "sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-trie": "6.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "ethereum-cryptography": "0.1.3", - "ethers": "^5.7.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-blockchain": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.2.tgz", - "integrity": "sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.2", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-ethash": "3.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-trie": "6.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "abstract-level": "^1.0.3", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "level": "^8.0.0", - "lru-cache": "^5.1.1", - "memory-level": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-common": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.2.tgz", - "integrity": "sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-util": "9.0.2", - "crc-32": "^1.2.0" - } - }, - "node_modules/@nomicfoundation/ethereumjs-ethash": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.2.tgz", - "integrity": "sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "abstract-level": "^1.0.3", - "bigint-crypto-utils": "^3.0.23", - "ethereum-cryptography": "0.1.3" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-evm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.2.tgz", - "integrity": "sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ==", - "dev": true, - "dependencies": { - "@ethersproject/providers": "^5.7.1", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-rlp": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.2.tgz", - "integrity": "sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA==", - "dev": true, - "bin": { - "rlp": "bin/rlp" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-statemanager": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.2.tgz", - "integrity": "sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "ethers": "^5.7.1", - "js-sdsl": "^4.1.4" - } - }, - "node_modules/@nomicfoundation/ethereumjs-trie": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.2.tgz", - "integrity": "sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "@types/readable-stream": "^2.3.13", - "ethereum-cryptography": "0.1.3", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-tx": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.2.tgz", - "integrity": "sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g==", - "dev": true, - "dependencies": { - "@chainsafe/ssz": "^0.9.2", - "@ethersproject/providers": "^5.7.2", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "ethereum-cryptography": "0.1.3" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-util": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.2.tgz", - "integrity": "sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ==", - "dev": true, - "dependencies": { - "@chainsafe/ssz": "^0.10.0", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "ethereum-cryptography": "0.1.3" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/persistent-merkle-tree": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz", - "integrity": "sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==", - "dev": true, - "dependencies": { - "@chainsafe/as-sha256": "^0.3.1" - } - }, - "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/ssz": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.10.2.tgz", - "integrity": "sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==", - "dev": true, - "dependencies": { - "@chainsafe/as-sha256": "^0.3.1", - "@chainsafe/persistent-merkle-tree": "^0.5.0" - } - }, - "node_modules/@nomicfoundation/ethereumjs-vm": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.2.tgz", - "integrity": "sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.2", - "@nomicfoundation/ethereumjs-blockchain": "7.0.2", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-evm": "2.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-statemanager": "2.0.2", - "@nomicfoundation/ethereumjs-trie": "6.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz", - "integrity": "sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==", - "dev": true, - "engines": { - "node": ">= 12" - }, - "optionalDependencies": { - "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.1", - "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.1", - "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.1" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz", - "integrity": "sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz", - "integrity": "sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-freebsd-x64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz", - "integrity": "sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz", - "integrity": "sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz", - "integrity": "sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz", - "integrity": "sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz", - "integrity": "sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz", - "integrity": "sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz", - "integrity": "sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz", - "integrity": "sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomiclabs/hardhat-ethers": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz", - "integrity": "sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==", - "dev": true, - "peerDependencies": { - "ethers": "^5.0.0", - "hardhat": "^2.0.0" - } - }, - "node_modules/@nomiclabs/hardhat-etherscan": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.7.tgz", - "integrity": "sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ==", - "dev": true, - "dependencies": { - "@ethersproject/abi": "^5.1.2", - "@ethersproject/address": "^5.0.2", - "cbor": "^8.1.0", - "chalk": "^2.4.2", - "debug": "^4.1.1", - "fs-extra": "^7.0.1", - "lodash": "^4.17.11", - "semver": "^6.3.0", - "table": "^6.8.0", - "undici": "^5.14.0" - }, - "peerDependencies": { - "hardhat": "^2.0.4" - } - }, - "node_modules/@nomiclabs/hardhat-waffle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.6.tgz", - "integrity": "sha512-+Wz0hwmJGSI17B+BhU/qFRZ1l6/xMW82QGXE/Gi+WTmwgJrQefuBs1lIf7hzQ1hLk6hpkvb/zwcNkpVKRYTQYg==", - "dev": true, - "peerDependencies": { - "@nomiclabs/hardhat-ethers": "^2.0.0", - "@types/sinon-chai": "^3.2.3", - "ethereum-waffle": "*", - "ethers": "^5.0.0", - "hardhat": "^2.0.0" - } - }, - "node_modules/@oclif/command": { - "version": "1.8.36", - "resolved": "https://registry.npmjs.org/@oclif/command/-/command-1.8.36.tgz", - "integrity": "sha512-/zACSgaYGtAQRzc7HjzrlIs14FuEYAZrMOEwicRoUnZVyRunG4+t5iSEeQu0Xy2bgbCD0U1SP/EdeNZSTXRwjQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@oclif/config": "^1.18.2", - "@oclif/errors": "^1.3.6", - "@oclif/help": "^1.0.1", - "@oclif/parser": "^3.8.17", - "debug": "^4.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@oclif/config": "^1" - } - }, - "node_modules/@oclif/command/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@oclif/command/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@oclif/command/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@oclif/config": { - "version": "1.18.17", - "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.18.17.tgz", - "integrity": "sha512-k77qyeUvjU8qAJ3XK3fr/QVAqsZO8QOBuESnfeM5HHtPNLSyfVcwiMM2zveSW5xRdLSG3MfV8QnLVkuyCL2ENg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@oclif/errors": "^1.3.6", - "@oclif/parser": "^3.8.17", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-wsl": "^2.1.1", - "tslib": "^2.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@oclif/config/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@oclif/config/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/config/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, - "node_modules/@oclif/core": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-2.15.0.tgz", - "integrity": "sha512-fNEMG5DzJHhYmI3MgpByTvltBOMyFcnRIUMxbiz2ai8rhaYgaTHMG3Q38HcosfIvtw9nCjxpcQtC8MN8QtVCcA==", - "dev": true, - "dependencies": { - "@types/cli-progress": "^3.11.0", - "ansi-escapes": "^4.3.2", - "ansi-styles": "^4.3.0", - "cardinal": "^2.1.1", - "chalk": "^4.1.2", - "clean-stack": "^3.0.1", - "cli-progress": "^3.12.0", - "debug": "^4.3.4", - "ejs": "^3.1.8", - "get-package-type": "^0.1.0", - "globby": "^11.1.0", - "hyperlinker": "^1.0.0", - "indent-string": "^4.0.0", - "is-wsl": "^2.2.0", - "js-yaml": "^3.14.1", - "natural-orderby": "^2.0.3", - "object-treeify": "^1.1.33", - "password-prompt": "^1.1.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "supports-color": "^8.1.1", - "supports-hyperlinks": "^2.2.0", - "ts-node": "^10.9.1", - "tslib": "^2.5.0", - "widest-line": "^3.1.0", - "wordwrap": "^1.0.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oclif/core/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/core/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@oclif/core/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@oclif/core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@oclif/core/node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/core/node_modules/clean-stack": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", - "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@oclif/core/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@oclif/core/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@oclif/core/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@oclif/core/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@oclif/core/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@oclif/core/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/core/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@oclif/core/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/core/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/core/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/core/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/@oclif/core/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, - "node_modules/@oclif/errors": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/@oclif/errors/-/errors-1.3.6.tgz", - "integrity": "sha512-fYaU4aDceETd89KXP+3cLyg9EHZsLD3RxF2IU9yxahhBpspWjkWi3Dy3bTgcwZ3V47BgxQaGapzJWDM33XIVDQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "clean-stack": "^3.0.0", - "fs-extra": "^8.1", - "indent-string": "^4.0.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@oclif/errors/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/errors/node_modules/clean-stack": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", - "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@oclif/errors/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@oclif/errors/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@oclif/errors/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/help": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/@oclif/help/-/help-1.0.15.tgz", - "integrity": "sha512-Yt8UHoetk/XqohYX76DfdrUYLsPKMc5pgkzsZVHDyBSkLiGRzujVaGZdjr32ckVZU9q3a47IjhWxhip7Dz5W/g==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@oclif/config": "1.18.16", - "@oclif/errors": "1.3.6", - "chalk": "^4.1.2", - "indent-string": "^4.0.0", - "lodash": "^4.17.21", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "widest-line": "^3.1.0", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@oclif/help/node_modules/@oclif/config": { - "version": "1.18.16", - "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.18.16.tgz", - "integrity": "sha512-VskIxVcN22qJzxRUq+raalq6Q3HUde7sokB7/xk5TqRZGEKRVbFeqdQBxDWwQeudiJEgcNiMvIFbMQ43dY37FA==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@oclif/errors": "^1.3.6", - "@oclif/parser": "^3.8.16", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-wsl": "^2.1.1", - "tslib": "^2.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@oclif/help/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/help/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@oclif/help/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@oclif/help/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@oclif/help/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@oclif/help/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@oclif/help/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/help/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/help/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/help/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/help/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/help/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, - "node_modules/@oclif/help/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/linewrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@oclif/linewrap/-/linewrap-1.0.0.tgz", - "integrity": "sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw==", - "dev": true - }, - "node_modules/@oclif/parser": { - "version": "3.8.17", - "resolved": "https://registry.npmjs.org/@oclif/parser/-/parser-3.8.17.tgz", - "integrity": "sha512-l04iSd0xoh/16TGVpXb81Gg3z7tlQGrEup16BrVLsZBK6SEYpYHRJZnM32BwZrHI97ZSFfuSwVlzoo6HdsaK8A==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@oclif/errors": "^1.3.6", - "@oclif/linewrap": "^1.0.0", - "chalk": "^4.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@oclif/parser/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@oclif/parser/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@oclif/parser/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@oclif/parser/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@oclif/parser/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/parser/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@oclif/parser/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, - "node_modules/@oclif/plugin-help": { - "version": "5.2.20", - "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-5.2.20.tgz", - "integrity": "sha512-u+GXX/KAGL9S10LxAwNUaWdzbEBARJ92ogmM7g3gDVud2HioCmvWQCDohNRVZ9GYV9oKwZ/M8xwd6a1d95rEKQ==", - "dev": true, - "dependencies": { - "@oclif/core": "^2.15.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@openzeppelin/contract-loader": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@openzeppelin/contract-loader/-/contract-loader-0.6.3.tgz", - "integrity": "sha512-cOFIjBjwbGgZhDZsitNgJl0Ye1rd5yu/Yx5LMgeq3u0ZYzldm4uObzHDFq4gjDdoypvyORjjJa3BlFA7eAnVIg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "fs-extra": "^8.1.0" - } - }, - "node_modules/@openzeppelin/contract-loader/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@openzeppelin/contracts": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.8.2.tgz", - "integrity": "sha512-kEUOgPQszC0fSYWpbh2kT94ltOJwj1qfT2DWo+zVttmGmf97JZ99LspePNaeeaLhCImaHVeBbjaQFZQn7+Zc5g==", - "dev": true - }, - "node_modules/@openzeppelin/contracts-upgradeable": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.8.2.tgz", - "integrity": "sha512-zIggnBwemUmmt9IS73qxi+tumALxCY4QEs3zLCII78k0Gfse2hAOdAkuAeLUzvWUpneMUfFE5sGHzEUSTvn4Ag==", - "dev": true - }, - "node_modules/@openzeppelin/hardhat-upgrades": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-1.22.1.tgz", - "integrity": "sha512-MdoitCTLl4zwMU8MeE/bCj+7JMWBEvd38XqJkw36PkJrXlbv6FedDVCPoumMAhpmtymm0nTwTYYklYG+L6WiiQ==", - "dev": true, - "dependencies": { - "@openzeppelin/upgrades-core": "^1.20.0", - "chalk": "^4.1.0", - "debug": "^4.1.1", - "proper-lockfile": "^4.1.1" - }, - "bin": { - "migrate-oz-cli-project": "dist/scripts/migrate-oz-cli-project.js" - }, - "peerDependencies": { - "@nomiclabs/hardhat-ethers": "^2.0.0", - "@nomiclabs/hardhat-etherscan": "^3.1.0", - "ethers": "^5.0.5", - "hardhat": "^2.0.2" - }, - "peerDependenciesMeta": { - "@nomiclabs/harhdat-etherscan": { - "optional": true - } - } - }, - "node_modules/@openzeppelin/hardhat-upgrades/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@openzeppelin/hardhat-upgrades/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@openzeppelin/hardhat-upgrades/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@openzeppelin/hardhat-upgrades/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@openzeppelin/hardhat-upgrades/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@openzeppelin/hardhat-upgrades/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@openzeppelin/test-helpers": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/@openzeppelin/test-helpers/-/test-helpers-0.5.16.tgz", - "integrity": "sha512-T1EvspSfH1qQO/sgGlskLfYVBbqzJR23SZzYl/6B2JnT4EhThcI85UpvDk0BkLWKaDScQTabGHt4GzHW+3SfZg==", - "dev": true, - "dependencies": { - "@openzeppelin/contract-loader": "^0.6.2", - "@truffle/contract": "^4.0.35", - "ansi-colors": "^3.2.3", - "chai": "^4.2.0", - "chai-bn": "^0.2.1", - "ethjs-abi": "^0.2.1", - "lodash.flatten": "^4.4.0", - "semver": "^5.6.0", - "web3": "^1.2.5", - "web3-utils": "^1.2.5" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true, - "peer": true - }, - "node_modules/@openzeppelin/test-helpers/node_modules/chai-bn": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/chai-bn/-/chai-bn-0.2.2.tgz", - "integrity": "sha512-MzjelH0p8vWn65QKmEq/DLBG1Hle4WeyqT79ANhXZhn/UxRWO0OogkAxi5oGGtfzwU9bZR8mvbvYdoqNVWQwFg==", - "dev": true, - "peerDependencies": { - "bn.js": "^4.11.0", - "chai": "^4.0.0" - } - }, - "node_modules/@openzeppelin/test-helpers/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@openzeppelin/upgrades-core": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.28.0.tgz", - "integrity": "sha512-8RKlyg98Adv+46GxDaR0awL3R8bVCcQ27DcSEwrgWOp6siHh8sZg4a2l+2dhPl1510S6uBfhHSydMH5VX2BV5g==", - "dev": true, - "dependencies": { - "cbor": "^9.0.0", - "chalk": "^4.1.0", - "compare-versions": "^6.0.0", - "debug": "^4.1.1", - "ethereumjs-util": "^7.0.3", - "minimist": "^1.2.7", - "proper-lockfile": "^4.1.1", - "solidity-ast": "^0.4.51" - }, - "bin": { - "openzeppelin-upgrades-core": "dist/cli/cli.js" - } - }, - "node_modules/@openzeppelin/upgrades-core/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@openzeppelin/upgrades-core/node_modules/cbor": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-9.0.1.tgz", - "integrity": "sha512-/TQOWyamDxvVIv+DY9cOLNuABkoyz8K/F3QE56539pGVYohx0+MEA1f4lChFTX79dBTBS7R1PF6ovH7G+VtBfQ==", - "dev": true, - "dependencies": { - "nofilter": "^3.1.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@openzeppelin/upgrades-core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@openzeppelin/upgrades-core/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@openzeppelin/upgrades-core/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@openzeppelin/upgrades-core/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@openzeppelin/upgrades-core/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@polygon-hermez/common": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/@polygon-hermez/common/-/common-2.6.4.tgz", - "integrity": "sha512-ZGl/K1MaXHaDagqKCqkQgCRu9EfJ+mbK+t4GeVnDywMYGCyi7jF1u71Pyh4Rch3XFd/8rW/eVL4x4jkGwN16JQ==", - "dev": true, - "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.4" - } - }, - "node_modules/@polygon-hermez/vm": { - "version": "5.7.36", - "resolved": "https://registry.npmjs.org/@polygon-hermez/vm/-/vm-5.7.36.tgz", - "integrity": "sha512-BN/42g7NbQZYz1+f2uEaVvZOxf1eCjFKkT/mTCdTK5ARpxDOzBwIVnt3WTjzgUsj7BzDU4btB0ifPNaKKR2Dpw==", - "dev": true, - "dependencies": { - "@ethereumjs/block": "^3.6.1", - "@ethereumjs/blockchain": "^5.5.1", - "@ethereumjs/common": "^2.6.2", - "@ethereumjs/tx": "^3.5.0", - "@polygon-hermez/zkevm-commonjs": "github:hermeznetwork/zkevm-commonjs#v1.0.0", - "async-eventemitter": "^0.2.4", - "core-js-pure": "^3.0.1", - "debug": "^4.3.3", - "ethereumjs-util": "^7.1.4", - "ethers": "^5.6.2", - "functional-red-black-tree": "^1.0.1", - "lodash": "^4.17.21", - "mcl-wasm": "^0.7.1", - "merkle-patricia-tree": "^4.2.3", - "rustbn.js": "~0.2.0" - } - }, - "node_modules/@polygon-hermez/zkevm-commonjs": { - "name": "@0xpolygonhermez/zkevm-commonjs", - "version": "1.0.0", - "resolved": "git+ssh://git@github.com/hermeznetwork/zkevm-commonjs.git#34f72fe9f7a4c3c45965742476a87148c9e05c0f", - "dev": true, - "license": "pending", - "dependencies": { - "@ethereumjs/block": "^3.6.2", - "@ethereumjs/tx": "^3.4.0", - "@polygon-hermez/common": "2.6.4", - "@polygon-hermez/vm": "5.7.30", - "ethereumjs-util": "^7.1.4", - "ethers": "^5.5.4", - "ffjavascript": "^0.2.55", - "lodash": "^4.17.21", - "pg": "^8.7.1" - } - }, - "node_modules/@polygon-hermez/zkevm-commonjs/node_modules/@polygon-hermez/vm": { - "version": "5.7.30", - "resolved": "https://registry.npmjs.org/@polygon-hermez/vm/-/vm-5.7.30.tgz", - "integrity": "sha512-HxmrGuRpYsgwd4rnvYNQ4OR77OKdAbUsAD1Z6PoEvV18NHsMv6JGpMnvnSAseiCBCyqTHjnFqWynoQ1nl0Qr6g==", - "dev": true, - "dependencies": { - "@ethereumjs/block": "^3.6.1", - "@ethereumjs/blockchain": "^5.5.1", - "@ethereumjs/common": "^2.6.2", - "@ethereumjs/tx": "^3.5.0", - "@polygon-hermez/zkevm-commonjs": "github:hermeznetwork/zkevm-commonjs#v0.5.0.1", - "async-eventemitter": "^0.2.4", - "core-js-pure": "^3.0.1", - "debug": "^4.3.3", - "ethereumjs-util": "^7.1.4", - "ethers": "^5.6.2", - "functional-red-black-tree": "^1.0.1", - "lodash": "^4.17.21", - "mcl-wasm": "^0.7.1", - "merkle-patricia-tree": "^4.2.3", - "rustbn.js": "~0.2.0" - } - }, - "node_modules/@resolver-engine/core": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@resolver-engine/core/-/core-0.3.3.tgz", - "integrity": "sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ==", - "dev": true, - "dependencies": { - "debug": "^3.1.0", - "is-url": "^1.2.4", - "request": "^2.85.0" - } - }, - "node_modules/@resolver-engine/core/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@resolver-engine/fs": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@resolver-engine/fs/-/fs-0.3.3.tgz", - "integrity": "sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ==", - "dev": true, - "dependencies": { - "@resolver-engine/core": "^0.3.3", - "debug": "^3.1.0" - } - }, - "node_modules/@resolver-engine/fs/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@resolver-engine/imports": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@resolver-engine/imports/-/imports-0.3.3.tgz", - "integrity": "sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q==", - "dev": true, - "dependencies": { - "@resolver-engine/core": "^0.3.3", - "debug": "^3.1.0", - "hosted-git-info": "^2.6.0", - "path-browserify": "^1.0.0", - "url": "^0.11.0" - } - }, - "node_modules/@resolver-engine/imports-fs": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz", - "integrity": "sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA==", - "dev": true, - "dependencies": { - "@resolver-engine/fs": "^0.3.3", - "@resolver-engine/imports": "^0.3.3", - "debug": "^3.1.0" - } - }, - "node_modules/@resolver-engine/imports-fs/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@resolver-engine/imports/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@scure/base": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.3.tgz", - "integrity": "sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==", - "dev": true, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip32": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.1.tgz", - "integrity": "sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==", - "dev": true, - "dependencies": { - "@noble/curves": "~1.1.0", - "@noble/hashes": "~1.3.1", - "@scure/base": "~1.1.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip39": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz", - "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==", - "dev": true, - "dependencies": { - "@noble/hashes": "~1.3.0", - "@scure/base": "~1.1.0" - }, - "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", - "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", - "dev": true, - "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/hub": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", - "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", - "dev": true, - "dependencies": { - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/minimal": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", - "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", - "dev": true, - "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/node": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", - "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", - "dev": true, - "dependencies": { - "@sentry/core": "5.30.0", - "@sentry/hub": "5.30.0", - "@sentry/tracing": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "cookie": "^0.4.1", - "https-proxy-agent": "^5.0.0", - "lru_map": "^0.3.3", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/tracing": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", - "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", - "dev": true, - "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/types": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", - "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/utils": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", - "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", - "dev": true, - "dependencies": { - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@solidity-parser/parser": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz", - "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==", - "dev": true, - "dependencies": { - "antlr4ts": "^0.5.0-alpha.4" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/@truffle/abi-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-1.0.3.tgz", - "integrity": "sha512-AWhs01HCShaVKjml7Z4AbVREr/u4oiWxCcoR7Cktm0mEvtT04pvnxW5xB/cI4znRkrbPdFQlFt67kgrAjesYkw==", - "dev": true, - "dependencies": { - "change-case": "3.0.2", - "fast-check": "3.1.1", - "web3-utils": "1.10.0" - }, - "engines": { - "node": "^16.20 || ^18.16 || >=20" - } - }, - "node_modules/@truffle/abi-utils/node_modules/web3-utils": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", - "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", - "dev": true, - "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/blockchain-utils": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.1.9.tgz", - "integrity": "sha512-RHfumgbIVo68Rv9ofDYfynjnYZIfP/f1vZy4RoqkfYAO+fqfc58PDRzB1WAGq2U6GPuOnipOJxQhnqNnffORZg==", - "dev": true, - "engines": { - "node": "^16.20 || ^18.16 || >=20" - } - }, - "node_modules/@truffle/codec": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.17.3.tgz", - "integrity": "sha512-Ko/+dsnntNyrJa57jUD9u4qx9nQby+H4GsUO6yjiCPSX0TQnEHK08XWqBSg0WdmCH2+h0y1nr2CXSx8gbZapxg==", - "dev": true, - "dependencies": { - "@truffle/abi-utils": "^1.0.3", - "@truffle/compile-common": "^0.9.8", - "big.js": "^6.0.3", - "bn.js": "^5.1.3", - "cbor": "^5.2.0", - "debug": "^4.3.1", - "lodash": "^4.17.21", - "semver": "^7.5.4", - "utf8": "^3.0.0", - "web3-utils": "1.10.0" - }, - "engines": { - "node": "^16.20 || ^18.16 || >=20" - } - }, - "node_modules/@truffle/codec/node_modules/bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/@truffle/codec/node_modules/cbor": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", - "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", - "dev": true, - "dependencies": { - "bignumber.js": "^9.0.1", - "nofilter": "^1.0.4" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@truffle/codec/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@truffle/codec/node_modules/nofilter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", - "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@truffle/codec/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@truffle/codec/node_modules/web3-utils": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", - "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", - "dev": true, - "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/codec/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@truffle/compile-common": { - "version": "0.9.8", - "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.9.8.tgz", - "integrity": "sha512-DTpiyo32t/YhLI1spn84D3MHYHrnoVqO+Gp7ZHrYNwDs86mAxtNiH5lsVzSb8cPgiqlvNsRCU9nm9R0YmKMTBQ==", - "dev": true, - "dependencies": { - "@truffle/error": "^0.2.2", - "colors": "1.4.0" - }, - "engines": { - "node": "^16.20 || ^18.16 || >=20" - } - }, - "node_modules/@truffle/contract": { - "version": "4.6.31", - "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.6.31.tgz", - "integrity": "sha512-s+oHDpXASnZosiCdzu+X1Tx5mUJUs1L1CYXIcgRmzMghzqJkaUFmR6NpNo7nJYliYbO+O9/aW8oCKqQ7rCHfmQ==", - "dev": true, - "dependencies": { - "@ensdomains/ensjs": "^2.1.0", - "@truffle/blockchain-utils": "^0.1.9", - "@truffle/contract-schema": "^3.4.16", - "@truffle/debug-utils": "^6.0.57", - "@truffle/error": "^0.2.2", - "@truffle/interface-adapter": "^0.5.37", - "bignumber.js": "^7.2.1", - "debug": "^4.3.1", - "ethers": "^4.0.32", - "web3": "1.10.0", - "web3-core-helpers": "1.10.0", - "web3-core-promievent": "1.10.0", - "web3-eth-abi": "1.10.0", - "web3-utils": "1.10.0" - }, - "engines": { - "node": "^16.20 || ^18.16 || >=20" - } - }, - "node_modules/@truffle/contract-schema": { - "version": "3.4.16", - "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.16.tgz", - "integrity": "sha512-g0WNYR/J327DqtJPI70ubS19K1Fth/1wxt2jFqLsPmz5cGZVjCwuhiie+LfBde4/Mc9QR8G+L3wtmT5cyoBxAg==", - "dev": true, - "dependencies": { - "ajv": "^6.10.0", - "debug": "^4.3.1" - }, - "engines": { - "node": "^16.20 || ^18.16 || >=20" - } - }, - "node_modules/@truffle/contract/node_modules/@ethereumjs/common": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", - "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", - "dev": true, - "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.1" - } - }, - "node_modules/@truffle/contract/node_modules/@ethereumjs/tx": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", - "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", - "dev": true, - "dependencies": { - "@ethereumjs/common": "^2.5.0", - "ethereumjs-util": "^7.1.2" - } - }, - "node_modules/@truffle/contract/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "node_modules/@truffle/contract/node_modules/cross-fetch": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", - "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", - "dev": true, - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "node_modules/@truffle/contract/node_modules/eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/@truffle/contract/node_modules/eth-lib/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/@truffle/contract/node_modules/ethers": { - "version": "4.0.49", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", - "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", - "dev": true, - "dependencies": { - "aes-js": "3.0.0", - "bn.js": "^4.11.9", - "elliptic": "6.5.4", - "hash.js": "1.1.3", - "js-sha3": "0.5.7", - "scrypt-js": "2.0.4", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" - } - }, - "node_modules/@truffle/contract/node_modules/ethers/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/@truffle/contract/node_modules/hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", - "dev": true - }, - "node_modules/@truffle/contract/node_modules/scrypt-js": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", - "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==", - "dev": true - }, - "node_modules/@truffle/contract/node_modules/setimmediate": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==", - "dev": true - }, - "node_modules/@truffle/contract/node_modules/uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true - }, - "node_modules/@truffle/contract/node_modules/web3": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.10.0.tgz", - "integrity": "sha512-YfKY9wSkGcM8seO+daR89oVTcbu18NsVfvOngzqMYGUU0pPSQmE57qQDvQzUeoIOHAnXEBNzrhjQJmm8ER0rng==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "web3-bzz": "1.10.0", - "web3-core": "1.10.0", - "web3-eth": "1.10.0", - "web3-eth-personal": "1.10.0", - "web3-net": "1.10.0", - "web3-shh": "1.10.0", - "web3-utils": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-bzz": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.10.0.tgz", - "integrity": "sha512-o9IR59io3pDUsXTsps5pO5hW1D5zBmg46iNc2t4j2DkaYHNdDLwk2IP9ukoM2wg47QILfPEJYzhTfkS/CcX0KA==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@types/node": "^12.12.6", - "got": "12.1.0", - "swarm-js": "^0.1.40" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.10.0.tgz", - "integrity": "sha512-fWySwqy2hn3TL89w5TM8wXF1Z2Q6frQTKHWmP0ppRQorEK8NcHJRfeMiv/mQlSKoTS1F6n/nv2uyZsixFycjYQ==", - "dev": true, - "dependencies": { - "@types/bn.js": "^5.1.1", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.10.0", - "web3-core-method": "1.10.0", - "web3-core-requestmanager": "1.10.0", - "web3-utils": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-core-method": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.10.0.tgz", - "integrity": "sha512-4R700jTLAMKDMhQ+nsVfIXvH6IGJlJzGisIfMKWAIswH31h5AZz7uDUW2YctI+HrYd+5uOAlS4OJeeT9bIpvkA==", - "dev": true, - "dependencies": { - "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.10.0", - "web3-core-promievent": "1.10.0", - "web3-core-subscriptions": "1.10.0", - "web3-utils": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-core-requestmanager": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.10.0.tgz", - "integrity": "sha512-3z/JKE++Os62APml4dvBM+GAuId4h3L9ckUrj7ebEtS2AR0ixyQPbrBodgL91Sv7j7cQ3Y+hllaluqjguxvSaQ==", - "dev": true, - "dependencies": { - "util": "^0.12.5", - "web3-core-helpers": "1.10.0", - "web3-providers-http": "1.10.0", - "web3-providers-ipc": "1.10.0", - "web3-providers-ws": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-core-subscriptions": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.10.0.tgz", - "integrity": "sha512-HGm1PbDqsxejI075gxBc5OSkwymilRWZufIy9zEpnWKNmfbuv5FfHgW1/chtJP6aP3Uq2vHkvTDl3smQBb8l+g==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-core/node_modules/bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/@truffle/contract/node_modules/web3-eth": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.10.0.tgz", - "integrity": "sha512-Z5vT6slNMLPKuwRyKGbqeGYC87OAy8bOblaqRTgg94CXcn/mmqU7iPIlG4506YdcdK3x6cfEDG7B6w+jRxypKA==", - "dev": true, - "dependencies": { - "web3-core": "1.10.0", - "web3-core-helpers": "1.10.0", - "web3-core-method": "1.10.0", - "web3-core-subscriptions": "1.10.0", - "web3-eth-abi": "1.10.0", - "web3-eth-accounts": "1.10.0", - "web3-eth-contract": "1.10.0", - "web3-eth-ens": "1.10.0", - "web3-eth-iban": "1.10.0", - "web3-eth-personal": "1.10.0", - "web3-net": "1.10.0", - "web3-utils": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-eth-accounts": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.10.0.tgz", - "integrity": "sha512-wiq39Uc3mOI8rw24wE2n15hboLE0E9BsQLdlmsL4Zua9diDS6B5abXG0XhFcoNsXIGMWXVZz4TOq3u4EdpXF/Q==", - "dev": true, - "dependencies": { - "@ethereumjs/common": "2.5.0", - "@ethereumjs/tx": "3.3.2", - "eth-lib": "0.2.8", - "ethereumjs-util": "^7.1.5", - "scrypt-js": "^3.0.1", - "uuid": "^9.0.0", - "web3-core": "1.10.0", - "web3-core-helpers": "1.10.0", - "web3-core-method": "1.10.0", - "web3-utils": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-eth-accounts/node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "dev": true - }, - "node_modules/@truffle/contract/node_modules/web3-eth-accounts/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@truffle/contract/node_modules/web3-eth-contract": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.10.0.tgz", - "integrity": "sha512-MIC5FOzP/+2evDksQQ/dpcXhSqa/2hFNytdl/x61IeWxhh6vlFeSjq0YVTAyIzdjwnL7nEmZpjfI6y6/Ufhy7w==", - "dev": true, - "dependencies": { - "@types/bn.js": "^5.1.1", - "web3-core": "1.10.0", - "web3-core-helpers": "1.10.0", - "web3-core-method": "1.10.0", - "web3-core-promievent": "1.10.0", - "web3-core-subscriptions": "1.10.0", - "web3-eth-abi": "1.10.0", - "web3-utils": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-eth-ens": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.10.0.tgz", - "integrity": "sha512-3hpGgzX3qjgxNAmqdrC2YUQMTfnZbs4GeLEmy8aCWziVwogbuqQZ+Gzdfrym45eOZodk+lmXyLuAdqkNlvkc1g==", - "dev": true, - "dependencies": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.10.0", - "web3-core-helpers": "1.10.0", - "web3-core-promievent": "1.10.0", - "web3-eth-abi": "1.10.0", - "web3-eth-contract": "1.10.0", - "web3-utils": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-eth-personal": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.10.0.tgz", - "integrity": "sha512-anseKn98w/d703eWq52uNuZi7GhQeVjTC5/svrBWEKob0WZ5kPdo+EZoFN0sp5a5ubbrk/E0xSl1/M5yORMtpg==", - "dev": true, - "dependencies": { - "@types/node": "^12.12.6", - "web3-core": "1.10.0", - "web3-core-helpers": "1.10.0", - "web3-core-method": "1.10.0", - "web3-net": "1.10.0", - "web3-utils": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-net": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.10.0.tgz", - "integrity": "sha512-NLH/N3IshYWASpxk4/18Ge6n60GEvWBVeM8inx2dmZJVmRI6SJIlUxbL8jySgiTn3MMZlhbdvrGo8fpUW7a1GA==", - "dev": true, - "dependencies": { - "web3-core": "1.10.0", - "web3-core-method": "1.10.0", - "web3-utils": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-providers-http": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.10.0.tgz", - "integrity": "sha512-eNr965YB8a9mLiNrkjAWNAPXgmQWfpBfkkn7tpEFlghfww0u3I0tktMZiaToJVcL2+Xq+81cxbkpeWJ5XQDwOA==", - "dev": true, - "dependencies": { - "abortcontroller-polyfill": "^1.7.3", - "cross-fetch": "^3.1.4", - "es6-promise": "^4.2.8", - "web3-core-helpers": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-providers-ipc": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.10.0.tgz", - "integrity": "sha512-OfXG1aWN8L1OUqppshzq8YISkWrYHaATW9H8eh0p89TlWMc1KZOL9vttBuaBEi96D/n0eYDn2trzt22bqHWfXA==", - "dev": true, - "dependencies": { - "oboe": "2.1.5", - "web3-core-helpers": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-providers-ws": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.10.0.tgz", - "integrity": "sha512-sK0fNcglW36yD5xjnjtSGBnEtf59cbw4vZzJ+CmOWIKGIR96mP5l684g0WD0Eo+f4NQc2anWWXG74lRc9OVMCQ==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.10.0", - "websocket": "^1.0.32" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-shh": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.10.0.tgz", - "integrity": "sha512-uNUUuNsO2AjX41GJARV9zJibs11eq6HtOe6Wr0FtRUcj8SN6nHeYIzwstAvJ4fXA53gRqFMTxdntHEt9aXVjpg==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "web3-core": "1.10.0", - "web3-core-method": "1.10.0", - "web3-core-subscriptions": "1.10.0", - "web3-net": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/contract/node_modules/web3-utils": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", - "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", - "dev": true, - "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/debug-utils": { - "version": "6.0.57", - "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.57.tgz", - "integrity": "sha512-Q6oI7zLaeNLB69ixjwZk2UZEWBY6b2OD1sjLMGDKBGR7GaHYiw96GLR2PFgPH1uwEeLmV4N78LYaQCrDsHbNeA==", - "dev": true, - "dependencies": { - "@truffle/codec": "^0.17.3", - "@trufflesuite/chromafi": "^3.0.0", - "bn.js": "^5.1.3", - "chalk": "^2.4.2", - "debug": "^4.3.1", - "highlightjs-solidity": "^2.0.6" - }, - "engines": { - "node": "^16.20 || ^18.16 || >=20" - } - }, - "node_modules/@truffle/error": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.2.2.tgz", - "integrity": "sha512-TqbzJ0O8DHh34cu8gDujnYl4dUl6o2DE4PR6iokbybvnIm/L2xl6+Gv1VC+YJS45xfH83Yo3/Zyg/9Oq8/xZWg==", - "dev": true, - "engines": { - "node": "^16.20 || ^18.16 || >=20" - } - }, - "node_modules/@truffle/interface-adapter": { - "version": "0.5.37", - "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.37.tgz", - "integrity": "sha512-lPH9MDgU+7sNDlJSClwyOwPCfuOimqsCx0HfGkznL3mcFRymc1pukAR1k17zn7ErHqBwJjiKAZ6Ri72KkS+IWw==", - "dev": true, - "dependencies": { - "bn.js": "^5.1.3", - "ethers": "^4.0.32", - "web3": "1.10.0" - }, - "engines": { - "node": "^16.20 || ^18.16 || >=20" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/@ethereumjs/common": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", - "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", - "dev": true, - "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.1" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/@ethereumjs/tx": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", - "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", - "dev": true, - "dependencies": { - "@ethereumjs/common": "^2.5.0", - "ethereumjs-util": "^7.1.2" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "node_modules/@truffle/interface-adapter/node_modules/bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/cross-fetch": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", - "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", - "dev": true, - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/eth-lib/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/@truffle/interface-adapter/node_modules/ethers": { - "version": "4.0.49", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", - "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", - "dev": true, - "dependencies": { - "aes-js": "3.0.0", - "bn.js": "^4.11.9", - "elliptic": "6.5.4", - "hash.js": "1.1.3", - "js-sha3": "0.5.7", - "scrypt-js": "2.0.4", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/ethers/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/@truffle/interface-adapter/node_modules/hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", - "dev": true - }, - "node_modules/@truffle/interface-adapter/node_modules/scrypt-js": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", - "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==", - "dev": true - }, - "node_modules/@truffle/interface-adapter/node_modules/setimmediate": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==", - "dev": true - }, - "node_modules/@truffle/interface-adapter/node_modules/uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true - }, - "node_modules/@truffle/interface-adapter/node_modules/web3": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.10.0.tgz", - "integrity": "sha512-YfKY9wSkGcM8seO+daR89oVTcbu18NsVfvOngzqMYGUU0pPSQmE57qQDvQzUeoIOHAnXEBNzrhjQJmm8ER0rng==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "web3-bzz": "1.10.0", - "web3-core": "1.10.0", - "web3-eth": "1.10.0", - "web3-eth-personal": "1.10.0", - "web3-net": "1.10.0", - "web3-shh": "1.10.0", - "web3-utils": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-bzz": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.10.0.tgz", - "integrity": "sha512-o9IR59io3pDUsXTsps5pO5hW1D5zBmg46iNc2t4j2DkaYHNdDLwk2IP9ukoM2wg47QILfPEJYzhTfkS/CcX0KA==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@types/node": "^12.12.6", - "got": "12.1.0", - "swarm-js": "^0.1.40" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.10.0.tgz", - "integrity": "sha512-fWySwqy2hn3TL89w5TM8wXF1Z2Q6frQTKHWmP0ppRQorEK8NcHJRfeMiv/mQlSKoTS1F6n/nv2uyZsixFycjYQ==", - "dev": true, - "dependencies": { - "@types/bn.js": "^5.1.1", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.10.0", - "web3-core-method": "1.10.0", - "web3-core-requestmanager": "1.10.0", - "web3-utils": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-core-method": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.10.0.tgz", - "integrity": "sha512-4R700jTLAMKDMhQ+nsVfIXvH6IGJlJzGisIfMKWAIswH31h5AZz7uDUW2YctI+HrYd+5uOAlS4OJeeT9bIpvkA==", - "dev": true, - "dependencies": { - "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.10.0", - "web3-core-promievent": "1.10.0", - "web3-core-subscriptions": "1.10.0", - "web3-utils": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-core-requestmanager": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.10.0.tgz", - "integrity": "sha512-3z/JKE++Os62APml4dvBM+GAuId4h3L9ckUrj7ebEtS2AR0ixyQPbrBodgL91Sv7j7cQ3Y+hllaluqjguxvSaQ==", - "dev": true, - "dependencies": { - "util": "^0.12.5", - "web3-core-helpers": "1.10.0", - "web3-providers-http": "1.10.0", - "web3-providers-ipc": "1.10.0", - "web3-providers-ws": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-core-subscriptions": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.10.0.tgz", - "integrity": "sha512-HGm1PbDqsxejI075gxBc5OSkwymilRWZufIy9zEpnWKNmfbuv5FfHgW1/chtJP6aP3Uq2vHkvTDl3smQBb8l+g==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.10.0.tgz", - "integrity": "sha512-Z5vT6slNMLPKuwRyKGbqeGYC87OAy8bOblaqRTgg94CXcn/mmqU7iPIlG4506YdcdK3x6cfEDG7B6w+jRxypKA==", - "dev": true, - "dependencies": { - "web3-core": "1.10.0", - "web3-core-helpers": "1.10.0", - "web3-core-method": "1.10.0", - "web3-core-subscriptions": "1.10.0", - "web3-eth-abi": "1.10.0", - "web3-eth-accounts": "1.10.0", - "web3-eth-contract": "1.10.0", - "web3-eth-ens": "1.10.0", - "web3-eth-iban": "1.10.0", - "web3-eth-personal": "1.10.0", - "web3-net": "1.10.0", - "web3-utils": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-accounts": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.10.0.tgz", - "integrity": "sha512-wiq39Uc3mOI8rw24wE2n15hboLE0E9BsQLdlmsL4Zua9diDS6B5abXG0XhFcoNsXIGMWXVZz4TOq3u4EdpXF/Q==", - "dev": true, - "dependencies": { - "@ethereumjs/common": "2.5.0", - "@ethereumjs/tx": "3.3.2", - "eth-lib": "0.2.8", - "ethereumjs-util": "^7.1.5", - "scrypt-js": "^3.0.1", - "uuid": "^9.0.0", - "web3-core": "1.10.0", - "web3-core-helpers": "1.10.0", - "web3-core-method": "1.10.0", - "web3-utils": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-accounts/node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "dev": true - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-accounts/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-contract": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.10.0.tgz", - "integrity": "sha512-MIC5FOzP/+2evDksQQ/dpcXhSqa/2hFNytdl/x61IeWxhh6vlFeSjq0YVTAyIzdjwnL7nEmZpjfI6y6/Ufhy7w==", - "dev": true, - "dependencies": { - "@types/bn.js": "^5.1.1", - "web3-core": "1.10.0", - "web3-core-helpers": "1.10.0", - "web3-core-method": "1.10.0", - "web3-core-promievent": "1.10.0", - "web3-core-subscriptions": "1.10.0", - "web3-eth-abi": "1.10.0", - "web3-utils": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-ens": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.10.0.tgz", - "integrity": "sha512-3hpGgzX3qjgxNAmqdrC2YUQMTfnZbs4GeLEmy8aCWziVwogbuqQZ+Gzdfrym45eOZodk+lmXyLuAdqkNlvkc1g==", - "dev": true, - "dependencies": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.10.0", - "web3-core-helpers": "1.10.0", - "web3-core-promievent": "1.10.0", - "web3-eth-abi": "1.10.0", - "web3-eth-contract": "1.10.0", - "web3-utils": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-personal": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.10.0.tgz", - "integrity": "sha512-anseKn98w/d703eWq52uNuZi7GhQeVjTC5/svrBWEKob0WZ5kPdo+EZoFN0sp5a5ubbrk/E0xSl1/M5yORMtpg==", - "dev": true, - "dependencies": { - "@types/node": "^12.12.6", - "web3-core": "1.10.0", - "web3-core-helpers": "1.10.0", - "web3-core-method": "1.10.0", - "web3-net": "1.10.0", - "web3-utils": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-net": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.10.0.tgz", - "integrity": "sha512-NLH/N3IshYWASpxk4/18Ge6n60GEvWBVeM8inx2dmZJVmRI6SJIlUxbL8jySgiTn3MMZlhbdvrGo8fpUW7a1GA==", - "dev": true, - "dependencies": { - "web3-core": "1.10.0", - "web3-core-method": "1.10.0", - "web3-utils": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-providers-http": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.10.0.tgz", - "integrity": "sha512-eNr965YB8a9mLiNrkjAWNAPXgmQWfpBfkkn7tpEFlghfww0u3I0tktMZiaToJVcL2+Xq+81cxbkpeWJ5XQDwOA==", - "dev": true, - "dependencies": { - "abortcontroller-polyfill": "^1.7.3", - "cross-fetch": "^3.1.4", - "es6-promise": "^4.2.8", - "web3-core-helpers": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-providers-ipc": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.10.0.tgz", - "integrity": "sha512-OfXG1aWN8L1OUqppshzq8YISkWrYHaATW9H8eh0p89TlWMc1KZOL9vttBuaBEi96D/n0eYDn2trzt22bqHWfXA==", - "dev": true, - "dependencies": { - "oboe": "2.1.5", - "web3-core-helpers": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-providers-ws": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.10.0.tgz", - "integrity": "sha512-sK0fNcglW36yD5xjnjtSGBnEtf59cbw4vZzJ+CmOWIKGIR96mP5l684g0WD0Eo+f4NQc2anWWXG74lRc9OVMCQ==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.10.0", - "websocket": "^1.0.32" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-shh": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.10.0.tgz", - "integrity": "sha512-uNUUuNsO2AjX41GJARV9zJibs11eq6HtOe6Wr0FtRUcj8SN6nHeYIzwstAvJ4fXA53gRqFMTxdntHEt9aXVjpg==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "web3-core": "1.10.0", - "web3-core-method": "1.10.0", - "web3-core-subscriptions": "1.10.0", - "web3-net": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-utils": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", - "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", - "dev": true, - "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider": { - "version": "0.2.64", - "resolved": "https://registry.npmjs.org/@truffle/provider/-/provider-0.2.64.tgz", - "integrity": "sha512-ZwPsofw4EsCq/2h0t73SPnnFezu4YQWBmK4FxFaOUX0F+o8NsZuHKyfJzuZwyZbiktYmefM3yD9rM0Dj4BhNbw==", - "dev": true, - "dependencies": { - "@truffle/error": "^0.1.1", - "@truffle/interface-adapter": "^0.5.25", - "debug": "^4.3.1", - "web3": "1.7.4" - } - }, - "node_modules/@truffle/provider/node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@truffle/provider/node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "dependencies": { - "defer-to-connect": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@truffle/provider/node_modules/@truffle/error": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.1.1.tgz", - "integrity": "sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA==", - "dev": true - }, - "node_modules/@truffle/provider/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "node_modules/@truffle/provider/node_modules/bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/@truffle/provider/node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@truffle/provider/node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@truffle/provider/node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@truffle/provider/node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@truffle/provider/node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, - "node_modules/@truffle/provider/node_modules/eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/@truffle/provider/node_modules/eth-lib/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/@truffle/provider/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@truffle/provider/node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/@truffle/provider/node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", - "dev": true - }, - "node_modules/@truffle/provider/node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@truffle/provider/node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@truffle/provider/node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@truffle/provider/node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", - "dev": true, - "dependencies": { - "lowercase-keys": "^1.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/@truffle/provider/node_modules/web3": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.7.4.tgz", - "integrity": "sha512-iFGK5jO32vnXM/ASaJBaI0+gVR6uHozvYdxkdhaeOCD6HIQ4iIXadbO2atVpE9oc/H8l2MovJ4LtPhG7lIBN8A==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "web3-bzz": "1.7.4", - "web3-core": "1.7.4", - "web3-eth": "1.7.4", - "web3-eth-personal": "1.7.4", - "web3-net": "1.7.4", - "web3-shh": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-bzz": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.7.4.tgz", - "integrity": "sha512-w9zRhyEqTK/yi0LGRHjZMcPCfP24LBjYXI/9YxFw9VqsIZ9/G0CRCnUt12lUx0A56LRAMpF7iQ8eA73aBcO29Q==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@types/node": "^12.12.6", - "got": "9.6.0", - "swarm-js": "^0.1.40" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-core": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.7.4.tgz", - "integrity": "sha512-L0DCPlIh9bgIED37tYbe7bsWrddoXYc897ANGvTJ6MFkSNGiMwDkTLWSgYd9Mf8qu8b4iuPqXZHMwIo4atoh7Q==", - "dev": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-requestmanager": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-core-helpers": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.7.4.tgz", - "integrity": "sha512-F8PH11qIkE/LpK4/h1fF/lGYgt4B6doeMi8rukeV/s4ivseZHHslv1L6aaijLX/g/j4PsFmR42byynBI/MIzFg==", - "dev": true, - "dependencies": { - "web3-eth-iban": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-core-method": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.7.4.tgz", - "integrity": "sha512-56K7pq+8lZRkxJyzf5MHQPI9/VL3IJLoy4L/+q8HRdZJ3CkB1DkXYaXGU2PeylG1GosGiSzgIfu1ljqS7CP9xQ==", - "dev": true, - "dependencies": { - "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-core-promievent": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.7.4.tgz", - "integrity": "sha512-o4uxwXKDldN7ER7VUvDfWsqTx9nQSP1aDssi1XYXeYC2xJbVo0n+z6ryKtmcoWoRdRj7uSpVzal3nEmlr480mA==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-core-requestmanager": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.7.4.tgz", - "integrity": "sha512-IuXdAm65BQtPL4aI6LZJJOrKAs0SM5IK2Cqo2/lMNvVMT9Kssq6qOk68Uf7EBDH0rPuINi+ReLP+uH+0g3AnPA==", - "dev": true, - "dependencies": { - "util": "^0.12.0", - "web3-core-helpers": "1.7.4", - "web3-providers-http": "1.7.4", - "web3-providers-ipc": "1.7.4", - "web3-providers-ws": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-core-subscriptions": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.7.4.tgz", - "integrity": "sha512-VJvKWaXRyxk2nFWumOR94ut9xvjzMrRtS38c4qj8WBIRSsugrZr5lqUwgndtj0qx4F+50JhnU++QEqUEAtKm3g==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-eth": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.7.4.tgz", - "integrity": "sha512-JG0tTMv0Ijj039emXNHi07jLb0OiWSA9O24MRSk5vToTQyDNXihdF2oyq85LfHuF690lXZaAXrjhtLNlYqb7Ug==", - "dev": true, - "dependencies": { - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-eth-accounts": "1.7.4", - "web3-eth-contract": "1.7.4", - "web3-eth-ens": "1.7.4", - "web3-eth-iban": "1.7.4", - "web3-eth-personal": "1.7.4", - "web3-net": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-eth-abi": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.7.4.tgz", - "integrity": "sha512-eMZr8zgTbqyL9MCTCAvb67RbVyN5ZX7DvA0jbLOqRWCiw+KlJKTGnymKO6jPE8n5yjk4w01e165Qb11hTDwHgg==", - "dev": true, - "dependencies": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-eth-accounts": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.7.4.tgz", - "integrity": "sha512-Y9vYLRKP7VU7Cgq6wG1jFaG2k3/eIuiTKAG8RAuQnb6Cd9k5BRqTm5uPIiSo0AP/u11jDomZ8j7+WEgkU9+Btw==", - "dev": true, - "dependencies": { - "@ethereumjs/common": "^2.5.0", - "@ethereumjs/tx": "^3.3.2", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-util": "^7.0.10", - "scrypt-js": "^3.0.1", - "uuid": "3.3.2", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-eth-contract": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.7.4.tgz", - "integrity": "sha512-ZgSZMDVI1pE9uMQpK0T0HDT2oewHcfTCv0osEqf5qyn5KrcQDg1GT96/+S0dfqZ4HKj4lzS5O0rFyQiLPQ8LzQ==", - "dev": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-eth-ens": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.7.4.tgz", - "integrity": "sha512-Gw5CVU1+bFXP5RVXTCqJOmHn71X2ghNk9VcEH+9PchLr0PrKbHTA3hySpsPco1WJAyK4t8SNQVlNr3+bJ6/WZA==", - "dev": true, - "dependencies": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-eth-contract": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-eth-iban": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.7.4.tgz", - "integrity": "sha512-XyrsgWlZQMv5gRcjXMsNvAoCRvV5wN7YCfFV5+tHUCqN8g9T/o4XUS20vDWD0k4HNiAcWGFqT1nrls02MGZ08w==", - "dev": true, - "dependencies": { - "bn.js": "^5.2.1", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-eth-personal": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.7.4.tgz", - "integrity": "sha512-O10C1Hln5wvLQsDhlhmV58RhXo+GPZ5+W76frSsyIrkJWLtYQTCr5WxHtRC9sMD1idXLqODKKgI2DL+7xeZ0/g==", - "dev": true, - "dependencies": { - "@types/node": "^12.12.6", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-net": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-net": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.7.4.tgz", - "integrity": "sha512-d2Gj+DIARHvwIdmxFQ4PwAAXZVxYCR2lET0cxz4KXbE5Og3DNjJi+MoPkX+WqoUXqimu/EOd4Cd+7gefqVAFDg==", - "dev": true, - "dependencies": { - "web3-core": "1.7.4", - "web3-core-method": "1.7.4", - "web3-utils": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-providers-http": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.7.4.tgz", - "integrity": "sha512-AU+/S+49rcogUER99TlhW+UBMk0N2DxvN54CJ2pK7alc2TQ7+cprNPLHJu4KREe8ndV0fT6JtWUfOMyTvl+FRA==", - "dev": true, - "dependencies": { - "web3-core-helpers": "1.7.4", - "xhr2-cookies": "1.1.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-providers-ipc": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.7.4.tgz", - "integrity": "sha512-jhArOZ235dZy8fS8090t60nTxbd1ap92ibQw5xIrAQ9m7LcZKNfmLAQUVsD+3dTFvadRMi6z1vCO7zRi84gWHw==", - "dev": true, - "dependencies": { - "oboe": "2.1.5", - "web3-core-helpers": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-providers-ws": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.7.4.tgz", - "integrity": "sha512-g72X77nrcHMFU8hRzQJzfgi/072n8dHwRCoTw+WQrGp+XCQ71fsk2qIu3Tp+nlp5BPn8bRudQbPblVm2uT4myQ==", - "dev": true, - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.4", - "websocket": "^1.0.32" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-shh": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.7.4.tgz", - "integrity": "sha512-mlSZxSYcMkuMCxqhTYnZkUdahZ11h+bBv/8TlkXp/IHpEe4/Gg+KAbmfudakq3EzG/04z70XQmPgWcUPrsEJ+A==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "web3-core": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-net": "1.7.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/provider/node_modules/web3-utils": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz", - "integrity": "sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA==", - "dev": true, - "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@trufflesuite/chromafi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@trufflesuite/chromafi/-/chromafi-3.0.0.tgz", - "integrity": "sha512-oqWcOqn8nT1bwlPPfidfzS55vqcIDdpfzo3HbU9EnUmcSTX+I8z0UyUFI3tZQjByVJulbzxHxUGS3ZJPwK/GPQ==", - "dev": true, - "dependencies": { - "camelcase": "^4.1.0", - "chalk": "^2.3.2", - "cheerio": "^1.0.0-rc.2", - "detect-indent": "^5.0.0", - "highlight.js": "^10.4.1", - "lodash.merge": "^4.6.2", - "strip-ansi": "^4.0.0", - "strip-indent": "^2.0.0" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "node_modules/@typechain/ethers-v5": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-2.0.0.tgz", - "integrity": "sha512-0xdCkyGOzdqh4h5JSf+zoWx85IusEjDcPIwNEHP8mrWSnCae4rvrqB+/gtpdNfX7zjlFlZiMeePn2r63EI3Lrw==", - "dev": true, - "dependencies": { - "ethers": "^5.0.2" - }, - "peerDependencies": { - "ethers": "^5.0.0", - "typechain": "^3.0.0" - } - }, - "node_modules/@types/abstract-leveldown": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/@types/abstract-leveldown/-/abstract-leveldown-7.2.3.tgz", - "integrity": "sha512-YAdL8tIYbiKoFjAf/0Ir3mvRJ/iFvBP/FK0I8Xa5rGWgVcq0xWOEInzlJfs6TIPWFweEOTKgNSBdxneUcHRvaw==", - "dev": true - }, - "node_modules/@types/bn.js": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.2.tgz", - "integrity": "sha512-dkpZu0szUtn9UXTmw+e0AJFd4D2XAxDnsCLdc05SfqpqzPEBft8eQr8uaFitfo/dUUOZERaLec2hHMG87A4Dxg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dev": true, - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "node_modules/@types/chai": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.8.tgz", - "integrity": "sha512-yW/qTM4mRBBcsA9Xw9FbcImYtFPY7sgr+G/O5RDYVmxiy9a+pE5FyoFUi8JYCZY5nicj8atrr1pcfPiYpeNGOA==", - "dev": true, - "peer": true - }, - "node_modules/@types/cli-progress": { - "version": "3.11.3", - "resolved": "https://registry.npmjs.org/@types/cli-progress/-/cli-progress-3.11.3.tgz", - "integrity": "sha512-/+C9xAdVtc+g5yHHkGBThgAA8rYpi5B+2ve3wLtybYj0JHEBs57ivR4x/zGfSsplRnV+psE91Nfin1soNKqz5Q==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/concat-stream": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", - "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/form-data": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", - "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.2.tgz", - "integrity": "sha512-FD+nQWA2zJjh4L9+pFXqWOi0Hs1ryBCfI+985NjluQ1p8EYtoLvjLOKidXBtZ4/IcxDX4o8/E8qDS3540tNliw==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true, - "peer": true - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/level-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/level-errors/-/level-errors-3.0.0.tgz", - "integrity": "sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ==", - "dev": true - }, - "node_modules/@types/levelup": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@types/levelup/-/levelup-4.3.3.tgz", - "integrity": "sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA==", - "dev": true, - "dependencies": { - "@types/abstract-leveldown": "*", - "@types/level-errors": "*", - "@types/node": "*" - } - }, - "node_modules/@types/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", - "dev": true - }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true - }, - "node_modules/@types/mkdirp": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz", - "integrity": "sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "20.5.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", - "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==", - "dev": true - }, - "node_modules/@types/node-fetch": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.6.tgz", - "integrity": "sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw==", - "dev": true, - "dependencies": { - "@types/node": "*", - "form-data": "^4.0.0" - } - }, - "node_modules/@types/pbkdf2": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", - "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", - "dev": true - }, - "node_modules/@types/qs": { - "version": "6.9.8", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", - "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==", - "dev": true - }, - "node_modules/@types/readable-stream": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", - "integrity": "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "safe-buffer": "~5.1.1" - } - }, - "node_modules/@types/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/@types/resolve": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", - "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/responselike": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.1.tgz", - "integrity": "sha512-TiGnitEDxj2X0j+98Eqk5lv/Cij8oHd32bU4D/Yw6AOq7vvTk0gSD2GPj0G/HkvhMoVsdlhYF4yqqlyPBTM6Sg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/secp256k1": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.4.tgz", - "integrity": "sha512-oN0PFsYxDZnX/qSJ5S5OwaEDTYfekhvaM5vqui2bu1AA39pKofmgL104Q29KiOXizXS2yLjSzc5YdTyMKdcy4A==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/sinon": { - "version": "10.0.19", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.19.tgz", - "integrity": "sha512-MWZNGPSchIdDfb5FL+VFi4zHsHbNOTQEgjqFQk7HazXSXwUU9PAX3z9XBqb3AJGYr9YwrtCtaSMsT3brYsN/jQ==", - "dev": true, - "peer": true, - "dependencies": { - "@types/sinonjs__fake-timers": "*" - } - }, - "node_modules/@types/sinon-chai": { - "version": "3.2.10", - "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.10.tgz", - "integrity": "sha512-D+VFqUjMqeku/FGl4Ioo+fDeWOaIfbZ6Oj+glgFUgz5m5RJ4kgCER3FdV1uvhmEt0A+FRz+juPdybFlg5Hxfow==", - "dev": true, - "peer": true, - "dependencies": { - "@types/chai": "*", - "@types/sinon": "*" - } - }, - "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.3.tgz", - "integrity": "sha512-4g+2YyWe0Ve+LBh+WUm1697PD0Kdi6coG1eU0YjQbwx61AZ8XbEpL1zIT6WjuUKrCMCROpEaYQPDjBnDouBVAQ==", - "dev": true, - "peer": true - }, - "node_modules/@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true - }, - "node_modules/abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", - "dev": true - }, - "node_modules/abortcontroller-polyfill": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", - "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==", - "dev": true - }, - "node_modules/abstract-level": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", - "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", - "dev": true, - "dependencies": { - "buffer": "^6.0.3", - "catering": "^2.1.0", - "is-buffer": "^2.0.5", - "level-supports": "^4.0.0", - "level-transcoder": "^1.0.1", - "module-error": "^1.0.1", - "queue-microtask": "^1.2.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/abstract-level/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/abstract-leveldown": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz", - "integrity": "sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/abstract-leveldown/node_modules/level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "dev": true, - "dependencies": { - "xtend": "^4.0.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/adm-zip": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", - "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", - "dev": true, - "engines": { - "node": ">=0.3.0" - } - }, - "node_modules/aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.4.2" - } - }, - "node_modules/ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", - "dev": true - }, - "node_modules/antlr4ts": { - "version": "0.5.0-alpha.4", - "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", - "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", - "dev": true - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-back": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", - "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", - "dev": true, - "dependencies": { - "typical": "^2.6.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.3.tgz", - "integrity": "sha512-kcBubumjciBg4JKp5KTKtI7ec7tRefPk88yjkWJwaVKYd9QfTaxcsOxoMNKd7iBr447zCfDV0z1kOF47umv42g==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "engines": { - "node": "*" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/async-eventemitter": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", - "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", - "dev": true, - "dependencies": { - "async": "^2.4.0" - } - }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", - "dev": true - }, - "node_modules/axios": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", - "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/b4a": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", - "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==", - "dev": true - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "node_modules/@ethersproject/providers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", + "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", "dev": true, "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" } - ] - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/bcrypt-pbkdf/node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true - }, - "node_modules/bech32": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" - }, - "node_modules/big-integer": { - "version": "1.6.36", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz", - "integrity": "sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/big.js": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.1.tgz", - "integrity": "sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/bigjs" - } - }, - "node_modules/bigint-crypto-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz", - "integrity": "sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/bignumber.js": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", - "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/blake-hash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/blake-hash/-/blake-hash-2.0.0.tgz", - "integrity": "sha512-Igj8YowDu1PRkRsxZA7NVkdFNxH5rKv5cpLxQ0CVXSIA77pVYwCPRQJ2sMew/oneUpfuYRyjG6r8SmmmnbZb1w==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "node-addon-api": "^3.0.0", - "node-gyp-build": "^4.2.2", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/blake2b": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/blake2b/-/blake2b-2.1.4.tgz", - "integrity": "sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A==", - "dev": true, - "dependencies": { - "blake2b-wasm": "^2.4.0", - "nanoassert": "^2.0.0" - } - }, - "node_modules/blake2b-wasm": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz", - "integrity": "sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==", - "dev": true, + ], "dependencies": { - "b4a": "^1.0.1", - "nanoassert": "^2.0.0" + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0", + "bech32": "1.1.4", + "ws": "7.4.6" } }, - "node_modules/blakejs": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", - "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", - "dev": true - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "node_modules/@ethersproject/providers/node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", "dev": true, - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" + "node": ">=8.3.0" }, - "engines": { - "node": ">=0.6" + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@ethersproject/random": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", + "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "node_modules/@ethersproject/rlp": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" - }, - "node_modules/browser-level": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", - "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", + "node_modules/@ethersproject/sha2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", + "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.1", - "module-error": "^1.0.2", - "run-parallel-limit": "^1.1.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "hash.js": "1.1.7" } }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "node_modules/@ethersproject/signing-key": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", + "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "bn.js": "^5.2.1", + "elliptic": "6.5.4", + "hash.js": "1.1.7" } }, - "node_modules/browserify-aes/node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "dev": true - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "node_modules/@ethersproject/solidity": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", + "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "node_modules/@ethersproject/strings": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", + "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "node_modules/@ethersproject/transactions": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", + "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0" } }, - "node_modules/browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "node_modules/@ethersproject/units": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", + "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "node_modules/@ethersproject/wallet": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", + "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "base-x": "^3.0.2" + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/json-wallets": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" } }, - "node_modules/bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "node_modules/@ethersproject/web": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "node_modules/@ethersproject/wordlists": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", + "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", "dev": true, "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" } ], "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/buffer-to-arraybuffer": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", - "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==", - "dev": true - }, - "node_modules/buffer-writer": { + "node_modules/@fastify/busboy": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", - "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz", + "integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==", "dev": true, "engines": { - "node": ">=4" + "node": ">=14" } }, - "node_modules/buffer-xor": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-2.0.2.tgz", - "integrity": "sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==", + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", "dev": true, "dependencies": { - "safe-buffer": "^5.1.1" - } - }, - "node_modules/bufferutil": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", - "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", - "devOptional": true, - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^4.3.0" + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" }, "engines": { - "node": ">=6.14.2" + "node": ">=10.10.0" } }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "engines": { - "node": ">= 0.8" + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/cacheable-lookup": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", - "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true, "engines": { - "node": ">=10.6.0" + "node": ">=6.0.0" } }, - "node_modules/cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "node_modules/@metamask/eth-sig-util": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", + "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", "dev": true, "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" + "ethereumjs-abi": "^0.6.8", + "ethereumjs-util": "^6.2.1", + "ethjs-util": "^0.1.6", + "tweetnacl": "^1.0.3", + "tweetnacl-util": "^0.15.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, "engines": { - "node": ">=8" + "node": ">=12.0.0" } }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "node_modules/@metamask/eth-sig-util/node_modules/@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@types/node": "*" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } + "node_modules/@metamask/eth-sig-util/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true }, - "node_modules/camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "node_modules/@metamask/eth-sig-util/node_modules/ethereumjs-util": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", "dev": true, "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "node_modules/camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", - "dev": true, - "engines": { - "node": ">=4" + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" } }, - "node_modules/cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", + "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": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" + "@noble/hashes": "1.3.1" }, - "bin": { - "cdl": "bin/cdl.js" + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/case": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", - "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==", + "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==", "dev": true, "engines": { - "node": ">= 0.8.0" + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true + "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/catering": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", - "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", + "node_modules/@noble/secp256k1": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", + "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", "dev": true, - "engines": { - "node": ">=6" - } + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] }, - "node_modules/cbor": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", - "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "dependencies": { - "nofilter": "^3.1.0" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">=12.19" + "node": ">= 8" } }, - "node_modules/chai": { - "version": "4.3.10", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", - "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" - }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, "engines": { - "node": ">=4" + "node": ">= 8" } }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": ">=4" + "node": ">= 8" } }, - "node_modules/change-case": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.0.2.tgz", - "integrity": "sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==", + "node_modules/@nomicfoundation/ethereumjs-block": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.2.tgz", + "integrity": "sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q==", "dev": true, "dependencies": { - "camel-case": "^3.0.0", - "constant-case": "^2.0.0", - "dot-case": "^2.1.0", - "header-case": "^1.0.0", - "is-lower-case": "^1.1.0", - "is-upper-case": "^1.1.0", - "lower-case": "^1.1.1", - "lower-case-first": "^1.0.0", - "no-case": "^2.3.2", - "param-case": "^2.1.0", - "pascal-case": "^2.0.0", - "path-case": "^2.1.0", - "sentence-case": "^2.1.0", - "snake-case": "^2.1.0", - "swap-case": "^1.1.0", - "title-case": "^2.1.0", - "upper-case": "^1.1.1", - "upper-case-first": "^1.1.0" - } - }, - "node_modules/charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", - "dev": true, + "@nomicfoundation/ethereumjs-common": "4.0.2", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", + "@nomicfoundation/ethereumjs-trie": "6.0.2", + "@nomicfoundation/ethereumjs-tx": "5.0.2", + "@nomicfoundation/ethereumjs-util": "9.0.2", + "ethereum-cryptography": "0.1.3", + "ethers": "^5.7.1" + }, "engines": { - "node": "*" + "node": ">=14" } }, - "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "node_modules/@nomicfoundation/ethereumjs-block/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" } }, - "node_modules/cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "node_modules/@nomicfoundation/ethereumjs-blockchain": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.2.tgz", + "integrity": "sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w==", "dev": true, "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" + "@nomicfoundation/ethereumjs-block": "5.0.2", + "@nomicfoundation/ethereumjs-common": "4.0.2", + "@nomicfoundation/ethereumjs-ethash": "3.0.2", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", + "@nomicfoundation/ethereumjs-trie": "6.0.2", + "@nomicfoundation/ethereumjs-tx": "5.0.2", + "@nomicfoundation/ethereumjs-util": "9.0.2", + "abstract-level": "^1.0.3", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "level": "^8.0.0", + "lru-cache": "^5.1.1", + "memory-level": "^1.0.0" }, "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + "node": ">=14" } }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "node_modules/@nomicfoundation/ethereumjs-common": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.2.tgz", + "integrity": "sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg==", "dev": true, "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "@nomicfoundation/ethereumjs-util": "9.0.2", + "crc-32": "^1.2.0" } }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "node_modules/@nomicfoundation/ethereumjs-ethash": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.2.tgz", + "integrity": "sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "@nomicfoundation/ethereumjs-block": "5.0.2", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", + "@nomicfoundation/ethereumjs-util": "9.0.2", + "abstract-level": "^1.0.3", + "bigint-crypto-utils": "^3.0.23", + "ethereum-cryptography": "0.1.3" }, "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">=14" } }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/@nomicfoundation/ethereumjs-evm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.2.tgz", + "integrity": "sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ==", "dev": true, "dependencies": { - "is-glob": "^4.0.1" + "@ethersproject/providers": "^5.7.1", + "@nomicfoundation/ethereumjs-common": "4.0.2", + "@nomicfoundation/ethereumjs-tx": "5.0.2", + "@nomicfoundation/ethereumjs-util": "9.0.2", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" }, "engines": { - "node": ">= 6" + "node": ">=14" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "node_modules/cids": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", - "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", - "deprecated": "This module has been superseded by the multiformats module", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "class-is": "^1.1.0", - "multibase": "~0.6.0", - "multicodec": "^1.0.0", - "multihashes": "~0.4.15" + "node_modules/@nomicfoundation/ethereumjs-rlp": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.2.tgz", + "integrity": "sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA==", + "dev": true, + "bin": { + "rlp": "bin/rlp" }, "engines": { - "node": ">=4.0.0", - "npm": ">=3.0.0" + "node": ">=14" } }, - "node_modules/cids/node_modules/multicodec": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", - "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", - "deprecated": "This module has been superseded by the multiformats module", + "node_modules/@nomicfoundation/ethereumjs-statemanager": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.2.tgz", + "integrity": "sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA==", "dev": true, "dependencies": { - "buffer": "^5.6.0", - "varint": "^5.0.0" + "@nomicfoundation/ethereumjs-common": "4.0.2", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "ethers": "^5.7.1", + "js-sdsl": "^4.1.4" } }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "node_modules/@nomicfoundation/ethereumjs-statemanager/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" } }, - "node_modules/circomlibjs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/circomlibjs/-/circomlibjs-0.1.1.tgz", - "integrity": "sha512-Bl7Mylf/VERdI5bRTIQ4hpi2EgbfIvEyJrn/MPh2pEqScbCkatX44RF8fuNGigoiQGdhItaIikgHKLTdlPPLPQ==", + "node_modules/@nomicfoundation/ethereumjs-trie": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.2.tgz", + "integrity": "sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ==", "dev": true, "dependencies": { - "blake-hash": "^2.0.0", - "blake2b": "^2.1.3", - "ethers": "^5.5.1", - "ffjavascript": "^0.2.45" + "@nomicfoundation/ethereumjs-rlp": "5.0.2", + "@nomicfoundation/ethereumjs-util": "9.0.2", + "@types/readable-stream": "^2.3.13", + "ethereum-cryptography": "0.1.3", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=14" } }, - "node_modules/class-is": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", - "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==", - "dev": true - }, - "node_modules/classic-level": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.3.0.tgz", - "integrity": "sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==", + "node_modules/@nomicfoundation/ethereumjs-tx": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.2.tgz", + "integrity": "sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g==", "dev": true, - "hasInstallScript": true, "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.0", - "module-error": "^1.0.1", - "napi-macros": "^2.2.2", - "node-gyp-build": "^4.3.0" + "@chainsafe/ssz": "^0.9.2", + "@ethersproject/providers": "^5.7.2", + "@nomicfoundation/ethereumjs-common": "4.0.2", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", + "@nomicfoundation/ethereumjs-util": "9.0.2", + "ethereum-cryptography": "0.1.3" }, "engines": { - "node": ">=12" + "node": ">=14" } }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "node_modules/@nomicfoundation/ethereumjs-util": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.2.tgz", + "integrity": "sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ==", "dev": true, + "dependencies": { + "@chainsafe/ssz": "^0.10.0", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", + "ethereum-cryptography": "0.1.3" + }, "engines": { - "node": ">=6" + "node": ">=14" } }, - "node_modules/cli-progress": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", - "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==", + "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/persistent-merkle-tree": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz", + "integrity": "sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==", "dev": true, "dependencies": { - "string-width": "^4.2.3" - }, - "engines": { - "node": ">=4" + "@chainsafe/as-sha256": "^0.3.1" } }, - "node_modules/cli-progress/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/ssz": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.10.2.tgz", + "integrity": "sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==", "dev": true, - "engines": { - "node": ">=8" + "dependencies": { + "@chainsafe/as-sha256": "^0.3.1", + "@chainsafe/persistent-merkle-tree": "^0.5.0" } }, - "node_modules/cli-progress/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/@nomicfoundation/ethereumjs-vm": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.2.tgz", + "integrity": "sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@nomicfoundation/ethereumjs-block": "5.0.2", + "@nomicfoundation/ethereumjs-blockchain": "7.0.2", + "@nomicfoundation/ethereumjs-common": "4.0.2", + "@nomicfoundation/ethereumjs-evm": "2.0.2", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", + "@nomicfoundation/ethereumjs-statemanager": "2.0.2", + "@nomicfoundation/ethereumjs-trie": "6.0.2", + "@nomicfoundation/ethereumjs-tx": "5.0.2", + "@nomicfoundation/ethereumjs-util": "9.0.2", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" }, "engines": { - "node": ">=8" + "node": ">=14" } }, - "node_modules/cli-progress/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/@nomicfoundation/hardhat-chai-matchers": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.2.tgz", + "integrity": "sha512-9Wu9mRtkj0U9ohgXYFbB/RQDa+PcEdyBm2suyEtsJf3PqzZEEjLUZgWnMjlFhATMk/fp3BjmnYVPrwl+gr8oEw==", "dev": true, + "peer": true, "dependencies": { - "ansi-regex": "^5.0.1" + "@types/chai-as-promised": "^7.1.3", + "chai-as-promised": "^7.1.1", + "deep-eql": "^4.0.1", + "ordinal": "^1.0.3" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@nomicfoundation/hardhat-ethers": "^3.0.0", + "chai": "^4.2.0", + "ethers": "^6.1.0", + "hardhat": "^2.9.4" } }, - "node_modules/cli-table3": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", - "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", + "node_modules/@nomicfoundation/hardhat-ethers": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.4.tgz", + "integrity": "sha512-k9qbLoY7qn6C6Y1LI0gk2kyHXil2Tauj4kGzQ8pgxYXIGw8lWn8tuuL72E11CrlKaXRUvOgF0EXrv/msPI2SbA==", "dev": true, + "peer": true, "dependencies": { - "object-assign": "^4.1.0", - "string-width": "^2.1.1" - }, - "engines": { - "node": ">=6" + "debug": "^4.1.1", + "lodash.isequal": "^4.5.0" }, - "optionalDependencies": { - "colors": "^1.1.2" + "peerDependencies": { + "ethers": "^6.1.0", + "hardhat": "^2.0.0" } }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "node_modules/@nomicfoundation/hardhat-network-helpers": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.9.tgz", + "integrity": "sha512-OXWCv0cHpwLUO2u7bFxBna6dQtCC2Gg/aN/KtJLO7gmuuA28vgmVKYFRCDUqrbjujzgfwQ2aKyZ9Y3vSmDqS7Q==", "dev": true, + "peer": true, "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "ethereumjs-util": "^7.1.4" + }, + "peerDependencies": { + "hardhat": "^2.9.5" } }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/@nomicfoundation/hardhat-toolbox": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-3.0.0.tgz", + "integrity": "sha512-MsteDXd0UagMksqm9KvcFG6gNKYNa3GGNCy73iQ6bEasEgg2v8Qjl6XA5hjs8o5UD5A3153B6W2BIVJ8SxYUtA==", "dev": true, - "engines": { - "node": ">=8" + "peerDependencies": { + "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", + "@nomicfoundation/hardhat-ethers": "^3.0.0", + "@nomicfoundation/hardhat-network-helpers": "^1.0.0", + "@nomicfoundation/hardhat-verify": "^1.0.0", + "@typechain/ethers-v6": "^0.4.0", + "@typechain/hardhat": "^8.0.0", + "@types/chai": "^4.2.0", + "@types/mocha": ">=9.1.0", + "@types/node": ">=12.0.0", + "chai": "^4.2.0", + "ethers": "^6.4.0", + "hardhat": "^2.11.0", + "hardhat-gas-reporter": "^1.0.8", + "solidity-coverage": "^0.8.1", + "ts-node": ">=8.0.0", + "typechain": "^8.2.0", + "typescript": ">=4.5.0" } }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/@nomicfoundation/hardhat-verify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-1.1.1.tgz", + "integrity": "sha512-9QsTYD7pcZaQFEA3tBb/D/oCStYDiEVDN7Dxeo/4SCyHRSm86APypxxdOMEPlGmXsAvd+p1j/dTODcpxb8aztA==", "dev": true, + "peer": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@ethersproject/abi": "^5.1.2", + "@ethersproject/address": "^5.0.2", + "cbor": "^8.1.0", + "chalk": "^2.4.2", + "debug": "^4.1.1", + "lodash.clonedeep": "^4.5.0", + "semver": "^6.3.0", + "table": "^6.8.0", + "undici": "^5.14.0" }, + "peerDependencies": { + "hardhat": "^2.0.4" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz", + "integrity": "sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==", + "dev": true, "engines": { - "node": ">=8" + "node": ">= 12" + }, + "optionalDependencies": { + "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.1", + "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.1", + "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.1" } }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz", + "integrity": "sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=8" + "node": ">= 10" } }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz", + "integrity": "sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "node_modules/@nomicfoundation/solidity-analyzer-freebsd-x64": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz", + "integrity": "sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=0.10.0" + "node": ">= 10" } }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz", + "integrity": "sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "color-name": "1.1.3" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz", + "integrity": "sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.1.90" + "node": ">= 10" } }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz", + "integrity": "sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.8" + "node": ">= 10" } }, - "node_modules/command-exists": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", - "dev": true - }, - "node_modules/command-line-args": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-4.0.7.tgz", - "integrity": "sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA==", + "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz", + "integrity": "sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "array-back": "^2.0.0", - "find-replace": "^1.0.3", - "typical": "^2.6.1" - }, - "bin": { - "command-line-args": "bin/cli.js" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "node_modules/@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz", + "integrity": "sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 12" + "node": ">= 10" } }, - "node_modules/compare-versions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.0.tgz", - "integrity": "sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "node_modules/@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz", + "integrity": "sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==", + "cpu": [ + "ia32" + ], "dev": true, - "engines": [ - "node >= 0.8" + "optional": true, + "os": [ + "win32" ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "engines": { + "node": ">= 10" } }, - "node_modules/concat-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz", + "integrity": "sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/concat-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/@oclif/command": { + "version": "1.8.36", + "resolved": "https://registry.npmjs.org/@oclif/command/-/command-1.8.36.tgz", + "integrity": "sha512-/zACSgaYGtAQRzc7HjzrlIs14FuEYAZrMOEwicRoUnZVyRunG4+t5iSEeQu0Xy2bgbCD0U1SP/EdeNZSTXRwjQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dev": true, "dependencies": { - "safe-buffer": "~5.1.0" + "@oclif/config": "^1.18.2", + "@oclif/errors": "^1.3.6", + "@oclif/help": "^1.0.1", + "@oclif/parser": "^3.8.17", + "debug": "^4.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@oclif/config": "^1" } }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true - }, - "node_modules/constant-case": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", - "integrity": "sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==", + "node_modules/@oclif/command/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { - "snake-case": "^2.1.0", - "upper-case": "^1.1.1" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "node_modules/@oclif/command/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { - "safe-buffer": "5.2.1" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">= 0.6" + "node": ">=10" } }, - "node_modules/content-hash": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", - "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", + "node_modules/@oclif/command/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@oclif/config": { + "version": "1.18.17", + "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.18.17.tgz", + "integrity": "sha512-k77qyeUvjU8qAJ3XK3fr/QVAqsZO8QOBuESnfeM5HHtPNLSyfVcwiMM2zveSW5xRdLSG3MfV8QnLVkuyCL2ENg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dev": true, "dependencies": { - "cids": "^0.7.1", - "multicodec": "^0.5.5", - "multihashes": "^0.4.15" + "@oclif/errors": "^1.3.6", + "@oclif/parser": "^3.8.17", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-wsl": "^2.1.1", + "tslib": "^2.6.1" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "node_modules/@oclif/config/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "node_modules/@oclif/config/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "node_modules/cookiejar": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "node_modules/@oclif/config/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true }, - "node_modules/core-js-pure": { - "version": "3.33.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.33.0.tgz", - "integrity": "sha512-FKSIDtJnds/YFIEaZ4HszRX7hkxGpNKM7FC9aJ9WLJbSd3lD4vOltFuVIBLR8asSx9frkTSqL0dw90SKQxgKrg==", + "node_modules/@oclif/core": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-2.15.0.tgz", + "integrity": "sha512-fNEMG5DzJHhYmI3MgpByTvltBOMyFcnRIUMxbiz2ai8rhaYgaTHMG3Q38HcosfIvtw9nCjxpcQtC8MN8QtVCcA==", "dev": true, - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "dependencies": { + "@types/cli-progress": "^3.11.0", + "ansi-escapes": "^4.3.2", + "ansi-styles": "^4.3.0", + "cardinal": "^2.1.1", + "chalk": "^4.1.2", + "clean-stack": "^3.0.1", + "cli-progress": "^3.12.0", + "debug": "^4.3.4", + "ejs": "^3.1.8", + "get-package-type": "^0.1.0", + "globby": "^11.1.0", + "hyperlinker": "^1.0.0", + "indent-string": "^4.0.0", + "is-wsl": "^2.2.0", + "js-yaml": "^3.14.1", + "natural-orderby": "^2.0.3", + "object-treeify": "^1.1.33", + "password-prompt": "^1.1.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "supports-color": "^8.1.1", + "supports-hyperlinks": "^2.2.0", + "ts-node": "^10.9.1", + "tslib": "^2.5.0", + "widest-line": "^3.1.0", + "wordwrap": "^1.0.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "node_modules/@oclif/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "object-assign": "^4", - "vary": "^1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 0.10" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "node_modules/@oclif/core/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "bin": { - "crc32": "bin/crc32.njs" + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@oclif/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=0.8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "node_modules/@oclif/core/node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "node_modules/@oclif/core/node_modules/clean-stack": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", + "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==", "dev": true, "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" + "escape-string-regexp": "4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "node_modules/@oclif/core/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "node_modules/@oclif/core/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/cross-fetch": { + "node_modules/@oclif/core/node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "dependencies": { - "node-fetch": "^2.6.12" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/@oclif/core/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": ">= 8" + "node": ">=4" } }, - "node_modules/crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "node_modules/@oclif/core/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, "engines": { - "node": "*" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/crypto-addr-codec": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/crypto-addr-codec/-/crypto-addr-codec-0.1.8.tgz", - "integrity": "sha512-GqAK90iLLgP3FvhNmHbpT3wR6dEdaM8hZyZtLX29SPardh3OA13RFLHDR6sntGCgRWOfiHqW6sIyohpNqOtV/g==", + "node_modules/@oclif/core/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "base-x": "^3.0.8", - "big-integer": "1.6.36", - "blakejs": "^1.1.0", - "bs58": "^4.0.1", - "ripemd160-min": "0.0.6", - "safe-buffer": "^5.2.0", - "sha3": "^2.1.1" + "engines": { + "node": ">=8" } }, - "node_modules/crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "node_modules/@oclif/core/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@oclif/core/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "node_modules/@oclif/core/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "engines": { + "node": ">=8" } }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "node_modules/@oclif/core/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">= 6" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/fb55" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } + "node_modules/@oclif/core/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "node_modules/@oclif/errors": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@oclif/errors/-/errors-1.3.6.tgz", + "integrity": "sha512-fYaU4aDceETd89KXP+3cLyg9EHZsLD3RxF2IU9yxahhBpspWjkWi3Dy3bTgcwZ3V47BgxQaGapzJWDM33XIVDQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dev": true, "dependencies": { - "assert-plus": "^1.0.0" + "clean-stack": "^3.0.0", + "fs-extra": "^8.1", + "indent-string": "^4.0.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=0.10" + "node": ">=8.0.0" } }, - "node_modules/death": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", - "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@oclif/errors/node_modules/clean-stack": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", + "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==", "dev": true, "dependencies": { - "ms": "2.1.2" + "escape-string-regexp": "4.0.0" }, "engines": { - "node": ">=6.0" + "node": ">=10" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/decamelize": { + "node_modules/@oclif/errors/node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "engines": { "node": ">=10" @@ -7051,2348 +2919,2429 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "node_modules/@oclif/errors/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@oclif/errors/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@oclif/errors/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@oclif/help": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@oclif/help/-/help-1.0.15.tgz", + "integrity": "sha512-Yt8UHoetk/XqohYX76DfdrUYLsPKMc5pgkzsZVHDyBSkLiGRzujVaGZdjr32ckVZU9q3a47IjhWxhip7Dz5W/g==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "dependencies": { + "@oclif/config": "1.18.16", + "@oclif/errors": "1.3.6", + "chalk": "^4.1.2", + "indent-string": "^4.0.0", + "lodash": "^4.17.21", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "widest-line": "^3.1.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@oclif/help/node_modules/@oclif/config": { + "version": "1.18.16", + "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.18.16.tgz", + "integrity": "sha512-VskIxVcN22qJzxRUq+raalq6Q3HUde7sokB7/xk5TqRZGEKRVbFeqdQBxDWwQeudiJEgcNiMvIFbMQ43dY37FA==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dev": true, + "dependencies": { + "@oclif/errors": "^1.3.6", + "@oclif/parser": "^3.8.16", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-wsl": "^2.1.1", + "tslib": "^2.6.1" + }, "engines": { - "node": ">=0.10" + "node": ">=8.0.0" } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "node_modules/@oclif/help/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "mimic-response": "^3.1.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "node_modules/@oclif/help/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "node_modules/@oclif/help/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { - "type-detect": "^4.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=6" + "node": ">=7.0.0" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "node_modules/@oclif/help/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "node_modules/@oclif/help/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/deferred-leveldown": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz", - "integrity": "sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==", + "node_modules/@oclif/help/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "abstract-leveldown": "~6.2.1", - "inherits": "^2.0.3" - }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/deferred-leveldown/node_modules/abstract-leveldown": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", - "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", + "node_modules/@oclif/help/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/deferred-leveldown/node_modules/level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", + "node_modules/@oclif/help/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { - "xtend": "^4.0.2" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "node_modules/@oclif/help/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } + "node_modules/@oclif/help/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "node_modules/@oclif/help/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/des.js": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", - "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } + "node_modules/@oclif/linewrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@oclif/linewrap/-/linewrap-1.0.0.tgz", + "integrity": "sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw==", + "dev": true }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "node_modules/@oclif/parser": { + "version": "3.8.17", + "resolved": "https://registry.npmjs.org/@oclif/parser/-/parser-3.8.17.tgz", + "integrity": "sha512-l04iSd0xoh/16TGVpXb81Gg3z7tlQGrEup16BrVLsZBK6SEYpYHRJZnM32BwZrHI97ZSFfuSwVlzoo6HdsaK8A==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dev": true, + "dependencies": { + "@oclif/errors": "^1.3.6", + "@oclif/linewrap": "^1.0.0", + "chalk": "^4.1.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=8.0.0" } }, - "node_modules/detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", + "node_modules/@oclif/parser/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/detect-port": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", - "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", + "node_modules/@oclif/parser/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "address": "^1.0.1", - "debug": "4" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, - "bin": { - "detect": "bin/detect-port.js", - "detect-port": "bin/detect-port.js" - } - }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true, "engines": { - "node": ">=0.3.1" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "node_modules/@oclif/parser/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "node_modules/@oclif/parser/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/@oclif/parser/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, "engines": { "node": ">=8" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "node_modules/@oclif/parser/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "esutils": "^2.0.2" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=8" } }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "node_modules/@oclif/parser/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/@oclif/plugin-help": { + "version": "5.2.20", + "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-5.2.20.tgz", + "integrity": "sha512-u+GXX/KAGL9S10LxAwNUaWdzbEBARJ92ogmM7g3gDVud2HioCmvWQCDohNRVZ9GYV9oKwZ/M8xwd6a1d95rEKQ==", "dev": true, "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" + "@oclif/core": "^2.15.0" }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "engines": { + "node": ">=12.0.0" } }, - "node_modules/dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", + "node_modules/@openzeppelin/contracts": { + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.8.2.tgz", + "integrity": "sha512-kEUOgPQszC0fSYWpbh2kT94ltOJwj1qfT2DWo+zVttmGmf97JZ99LspePNaeeaLhCImaHVeBbjaQFZQn7+Zc5g==", "dev": true }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "node_modules/@openzeppelin/contracts-upgradeable": { + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.8.2.tgz", + "integrity": "sha512-zIggnBwemUmmt9IS73qxi+tumALxCY4QEs3zLCII78k0Gfse2hAOdAkuAeLUzvWUpneMUfFE5sGHzEUSTvn4Ag==", + "dev": true + }, + "node_modules/@openzeppelin/contracts5": { + "name": "@openzeppelin/contracts", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.0.0.tgz", + "integrity": "sha512-bv2sdS6LKqVVMLI5+zqnNrNU/CA+6z6CmwFXm/MzmOPBRSO5reEJN7z0Gbzvs0/bv/MZZXNklubpwy3v2+azsw==", + "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==", + "dev": true, + "dependencies": { + "@openzeppelin/defender-base-client": "1.48.0", + "axios": "^1.4.0", + "ethers": "^5.7.2", + "lodash": "^4.17.19", + "node-fetch": "^2.6.0" + } + }, + "node_modules/@openzeppelin/defender-admin-client/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", "dev": true, "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/fb55" + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" } - ] + ], + "dependencies": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" + } }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "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==", "dev": true, "dependencies": { - "domelementtype": "^2.3.0" + "amazon-cognito-identity-js": "^6.0.1", + "async-retry": "^1.3.3", + "axios": "^1.4.0", + "lodash": "^4.17.19", + "node-fetch": "^2.6.0" + } + }, + "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==", + "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", + "chalk": "^4.1.0", + "debug": "^4.1.1", + "ethereumjs-util": "^7.1.5", + "proper-lockfile": "^4.1.1", + "undici": "^5.14.0" }, - "engines": { - "node": ">= 4" + "bin": { + "migrate-oz-cli-project": "dist/scripts/migrate-oz-cli-project.js" }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "peerDependencies": { + "@nomicfoundation/hardhat-ethers": "^3.0.0", + "@nomicfoundation/hardhat-verify": "^1.1.0", + "ethers": "^6.6.0", + "hardhat": "^2.0.2" + }, + "peerDependenciesMeta": { + "@nomicfoundation/hardhat-verify": { + "optional": true + } } }, - "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "node_modules/@openzeppelin/hardhat-upgrades/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" }, "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/dot-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", - "integrity": "sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==", + "node_modules/@openzeppelin/hardhat-upgrades/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "no-case": "^2.2.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "node_modules/@openzeppelin/hardhat-upgrades/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=10" + "node": ">=7.0.0" } }, - "node_modules/duplexer3": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", - "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", + "node_modules/@openzeppelin/hardhat-upgrades/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "node_modules/@openzeppelin/hardhat-upgrades/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "engines": { + "node": ">=8" } }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "node_modules/ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "node_modules/@openzeppelin/hardhat-upgrades/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "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": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" + "@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/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "node_modules/@openzeppelin/upgrades-core": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.28.0.tgz", + "integrity": "sha512-8RKlyg98Adv+46GxDaR0awL3R8bVCcQ27DcSEwrgWOp6siHh8sZg4a2l+2dhPl1510S6uBfhHSydMH5VX2BV5g==", "dev": true, - "engines": { - "node": ">= 0.8" + "dependencies": { + "cbor": "^9.0.0", + "chalk": "^4.1.0", + "compare-versions": "^6.0.0", + "debug": "^4.1.1", + "ethereumjs-util": "^7.0.3", + "minimist": "^1.2.7", + "proper-lockfile": "^4.1.1", + "solidity-ast": "^0.4.51" + }, + "bin": { + "openzeppelin-upgrades-core": "dist/cli/cli.js" } }, - "node_modules/encoding-down": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz", - "integrity": "sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==", + "node_modules/@openzeppelin/upgrades-core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "abstract-leveldown": "^6.2.1", - "inherits": "^2.0.3", - "level-codec": "^9.0.0", - "level-errors": "^2.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "node_modules/@openzeppelin/upgrades-core/node_modules/cbor": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-9.0.1.tgz", + "integrity": "sha512-/TQOWyamDxvVIv+DY9cOLNuABkoyz8K/F3QE56539pGVYohx0+MEA1f4lChFTX79dBTBS7R1PF6ovH7G+VtBfQ==", "dev": true, "dependencies": { - "once": "^1.4.0" + "nofilter": "^3.1.0" + }, + "engines": { + "node": ">=16" } }, - "node_modules/enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "node_modules/@openzeppelin/upgrades-core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=8.6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/enquirer/node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "node_modules/@openzeppelin/upgrades-core/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=6" + "node": ">=7.0.0" } }, - "node_modules/enquirer/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/@openzeppelin/upgrades-core/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@openzeppelin/upgrades-core/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, - "node_modules/enquirer/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/@openzeppelin/upgrades-core/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" + "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "node_modules/@polygon-hermez/common": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/@polygon-hermez/common/-/common-2.6.4.tgz", + "integrity": "sha512-ZGl/K1MaXHaDagqKCqkQgCRu9EfJ+mbK+t4GeVnDywMYGCyi7jF1u71Pyh4Rch3XFd/8rW/eVL4x4jkGwN16JQ==", "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "dependencies": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.4" } }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "node_modules/@polygon-hermez/vm": { + "version": "5.7.36", + "resolved": "https://registry.npmjs.org/@polygon-hermez/vm/-/vm-5.7.36.tgz", + "integrity": "sha512-BN/42g7NbQZYz1+f2uEaVvZOxf1eCjFKkT/mTCdTK5ARpxDOzBwIVnt3WTjzgUsj7BzDU4btB0ifPNaKKR2Dpw==", "dev": true, - "engines": { - "node": ">=6" + "dependencies": { + "@ethereumjs/block": "^3.6.1", + "@ethereumjs/blockchain": "^5.5.1", + "@ethereumjs/common": "^2.6.2", + "@ethereumjs/tx": "^3.5.0", + "@polygon-hermez/zkevm-commonjs": "github:hermeznetwork/zkevm-commonjs#v1.0.0", + "async-eventemitter": "^0.2.4", + "core-js-pure": "^3.0.1", + "debug": "^4.3.3", + "ethereumjs-util": "^7.1.4", + "ethers": "^5.6.2", + "functional-red-black-tree": "^1.0.1", + "lodash": "^4.17.21", + "mcl-wasm": "^0.7.1", + "merkle-patricia-tree": "^4.2.3", + "rustbn.js": "~0.2.0" } }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "node_modules/@polygon-hermez/vm/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" + } + }, + "node_modules/@polygon-hermez/zkevm-commonjs": { + "name": "@0xpolygonhermez/zkevm-commonjs", + "version": "1.0.0", + "resolved": "git+ssh://git@github.com/hermeznetwork/zkevm-commonjs.git#34f72fe9f7a4c3c45965742476a87148c9e05c0f", + "dev": true, + "license": "pending", + "dependencies": { + "@ethereumjs/block": "^3.6.2", + "@ethereumjs/tx": "^3.4.0", + "@polygon-hermez/common": "2.6.4", + "@polygon-hermez/vm": "5.7.30", + "ethereumjs-util": "^7.1.4", + "ethers": "^5.5.4", + "ffjavascript": "^0.2.55", + "lodash": "^4.17.21", + "pg": "^8.7.1" + } + }, + "node_modules/@polygon-hermez/zkevm-commonjs/node_modules/@polygon-hermez/vm": { + "version": "5.7.30", + "resolved": "https://registry.npmjs.org/@polygon-hermez/vm/-/vm-5.7.30.tgz", + "integrity": "sha512-HxmrGuRpYsgwd4rnvYNQ4OR77OKdAbUsAD1Z6PoEvV18NHsMv6JGpMnvnSAseiCBCyqTHjnFqWynoQ1nl0Qr6g==", + "dev": true, + "dependencies": { + "@ethereumjs/block": "^3.6.1", + "@ethereumjs/blockchain": "^5.5.1", + "@ethereumjs/common": "^2.6.2", + "@ethereumjs/tx": "^3.5.0", + "@polygon-hermez/zkevm-commonjs": "github:hermeznetwork/zkevm-commonjs#v0.5.0.1", + "async-eventemitter": "^0.2.4", + "core-js-pure": "^3.0.1", + "debug": "^4.3.3", + "ethereumjs-util": "^7.1.4", + "ethers": "^5.6.2", + "functional-red-black-tree": "^1.0.1", + "lodash": "^4.17.21", + "mcl-wasm": "^0.7.1", + "merkle-patricia-tree": "^4.2.3", + "rustbn.js": "~0.2.0" + } + }, + "node_modules/@polygon-hermez/zkevm-commonjs/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" } }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/@resolver-engine/core": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@resolver-engine/core/-/core-0.3.3.tgz", + "integrity": "sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ==", "dev": true, "dependencies": { - "is-arrayish": "^0.2.1" + "debug": "^3.1.0", + "is-url": "^1.2.4", + "request": "^2.85.0" } }, - "node_modules/es-abstract": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz", - "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", + "node_modules/@resolver-engine/core/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.1", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.11" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "ms": "^2.1.1" } }, - "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "node_modules/@resolver-engine/fs": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@resolver-engine/fs/-/fs-0.3.3.tgz", + "integrity": "sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "@resolver-engine/core": "^0.3.3", + "debug": "^3.1.0" } }, - "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "node_modules/@resolver-engine/fs/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { - "has": "^1.0.3" + "ms": "^2.1.1" } }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "node_modules/@resolver-engine/imports": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@resolver-engine/imports/-/imports-0.3.3.tgz", + "integrity": "sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q==", "dev": true, "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@resolver-engine/core": "^0.3.3", + "debug": "^3.1.0", + "hosted-git-info": "^2.6.0", + "path-browserify": "^1.0.0", + "url": "^0.11.0" } }, - "node_modules/es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "node_modules/@resolver-engine/imports-fs": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz", + "integrity": "sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA==", "dev": true, - "hasInstallScript": true, "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.10" + "@resolver-engine/fs": "^0.3.3", + "@resolver-engine/imports": "^0.3.3", + "debug": "^3.1.0" } }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "node_modules/@resolver-engine/imports-fs/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" + "ms": "^2.1.1" } }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "node_modules/@resolver-engine/imports/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" + "ms": "^2.1.1" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/@scure/base": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.3.tgz", + "integrity": "sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==", "dev": true, - "engines": { - "node": ">=0.8.0" + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", + "node_modules/@scure/bip32": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.1.tgz", + "integrity": "sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==", "dev": true, "dependencies": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=0.12.0" + "@noble/curves": "~1.1.0", + "@noble/hashes": "~1.3.1", + "@scure/base": "~1.1.0" }, - "optionalDependencies": { - "source-map": "~0.2.0" + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", + "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==", "dev": true, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "node": ">= 16" }, - "engines": { - "node": ">= 0.8.0" + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "node_modules/@scure/bip39": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz", + "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==", "dev": true, "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "@noble/hashes": "~1.3.0", + "@scure/base": "~1.1.0" }, - "engines": { - "node": ">= 0.8.0" + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "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": ">= 0.8.0" + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "node_modules/@sentry/core": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", + "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", "dev": true, "dependencies": { - "prelude-ls": "~1.1.2" + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" }, "engines": { - "node": ">= 0.8.0" + "node": ">=6" } }, - "node_modules/eslint": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", - "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", + "node_modules/@sentry/hub": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", + "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.51.0", - "@humanwhocodes/config-array": "^0.11.11", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=6" } }, - "node_modules/eslint-config-airbnb-base": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", - "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "node_modules/@sentry/minimal": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", + "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", "dev": true, "dependencies": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5", - "semver": "^6.3.0" + "@sentry/hub": "5.30.0", + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "peerDependencies": { - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.2" + "node": ">=6" } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "node_modules/@sentry/node": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", + "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", "dev": true, - "peer": true, "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "@sentry/core": "5.30.0", + "@sentry/hub": "5.30.0", + "@sentry/tracing": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" } }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/@sentry/tracing": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", + "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", "dev": true, - "peer": true, "dependencies": { - "ms": "^2.1.1" + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" } }, - "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "node_modules/@sentry/types": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", + "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", "dev": true, - "peer": true, - "dependencies": { - "debug": "^3.2.7" - }, "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } + "node": ">=6" } }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/@sentry/utils": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", + "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", "dev": true, - "peer": true, "dependencies": { - "ms": "^2.1.1" + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" } }, - "node_modules/eslint-plugin-import": { - "version": "2.28.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", - "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", + "node_modules/@smithy/types": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.5.tgz", + "integrity": "sha512-ehyDt8M9hehyxrLQGoA1BGPou8Js1Ocoh5M0ngDhJMqbFmNK5N6Xhr9/ZExWkyIW8XcGkiMPq3ZUEE0ScrhbuQ==", "dev": true, - "peer": true, "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.findlastindex": "^1.2.2", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.8.0", - "has": "^1.0.3", - "is-core-module": "^2.13.0", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.6", - "object.groupby": "^1.0.0", - "object.values": "^1.1.6", - "semver": "^6.3.1", - "tsconfig-paths": "^3.14.2" + "tslib": "^2.5.0" }, "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "node": ">=14.0.0" } }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/@smithy/types/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/@solidity-parser/parser": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz", + "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==", "dev": true, "peer": true, "dependencies": { - "ms": "^2.1.1" + "antlr4ts": "^0.5.0-alpha.4" } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@typechain/ethers-v6": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@typechain/ethers-v6/-/ethers-v6-0.4.3.tgz", + "integrity": "sha512-TrxBsyb4ryhaY9keP6RzhFCviWYApcLCIRMPyWaKp2cZZrfaM3QBoxXTnw/eO4+DAY3l+8O0brNW0WgeQeOiDA==", "dev": true, "peer": true, "dependencies": { - "esutils": "^2.0.2" + "lodash": "^4.17.15", + "ts-essentials": "^7.0.1" }, - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "ethers": "6.x", + "typechain": "^8.3.1", + "typescript": ">=4.7.0" } }, - "node_modules/eslint-plugin-mocha": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-9.0.0.tgz", - "integrity": "sha512-d7knAcQj1jPCzZf3caeBIn3BnW6ikcvfz0kSqQpwPYcVGLoJV5sz0l0OJB2LR8I7dvTDbqq1oV6ylhSgzA10zg==", + "node_modules/@typechain/hardhat": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-8.0.3.tgz", + "integrity": "sha512-MytSmJJn+gs7Mqrpt/gWkTCOpOQ6ZDfRrRT2gtZL0rfGe4QrU4x9ZdW15fFbVM/XTa+5EsKiOMYXhRABibNeng==", "dev": true, + "peer": true, "dependencies": { - "eslint-utils": "^3.0.0", - "ramda": "^0.27.1" - }, - "engines": { - "node": ">=12.0.0" + "fs-extra": "^9.1.0" }, "peerDependencies": { - "eslint": ">=7.0.0" + "@typechain/ethers-v6": "^0.4.3", + "ethers": "^6.1.0", + "hardhat": "^2.9.9", + "typechain": "^8.3.1" } }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "node_modules/@types/abstract-leveldown": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@types/abstract-leveldown/-/abstract-leveldown-7.2.3.tgz", + "integrity": "sha512-YAdL8tIYbiKoFjAf/0Ir3mvRJ/iFvBP/FK0I8Xa5rGWgVcq0xWOEInzlJfs6TIPWFweEOTKgNSBdxneUcHRvaw==", + "dev": true + }, + "node_modules/@types/bn.js": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.2.tgz", + "integrity": "sha512-dkpZu0szUtn9UXTmw+e0AJFd4D2XAxDnsCLdc05SfqpqzPEBft8eQr8uaFitfo/dUUOZERaLec2hHMG87A4Dxg==", "dev": true, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "@types/node": "*" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "node_modules/@types/chai": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.8.tgz", + "integrity": "sha512-yW/qTM4mRBBcsA9Xw9FbcImYtFPY7sgr+G/O5RDYVmxiy9a+pE5FyoFUi8JYCZY5nicj8atrr1pcfPiYpeNGOA==", "dev": true, + "peer": true + }, + "node_modules/@types/chai-as-promised": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.6.tgz", + "integrity": "sha512-cQLhk8fFarRVZAXUQV1xEnZgMoPxqKojBvRkqPCKPQCzEhpbbSKl1Uu75kDng7k5Ln6LQLUmNBjLlFthCgm1NA==", + "dev": true, + "peer": true, "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" + "@types/chai": "*" } }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "node_modules/@types/cli-progress": { + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/@types/cli-progress/-/cli-progress-3.11.3.tgz", + "integrity": "sha512-/+C9xAdVtc+g5yHHkGBThgAA8rYpi5B+2ve3wLtybYj0JHEBs57ivR4x/zGfSsplRnV+psE91Nfin1soNKqz5Q==", "dev": true, - "engines": { - "node": ">=10" + "dependencies": { + "@types/node": "*" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "node_modules/@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "peer": true, + "dependencies": { + "@types/node": "*" } }, - "node_modules/eslint/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", "dev": true, - "engines": { - "node": ">=8" + "peer": true, + "dependencies": { + "@types/node": "*" } }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, + "peer": true, "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "@types/minimatch": "*", + "@types/node": "*" } }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "peer": true + }, + "node_modules/@types/level-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/level-errors/-/level-errors-3.0.0.tgz", + "integrity": "sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ==", + "dev": true + }, + "node_modules/@types/levelup": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@types/levelup/-/levelup-4.3.3.tgz", + "integrity": "sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "@types/abstract-leveldown": "*", + "@types/level-errors": "*", + "@types/node": "*" } }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@types/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", + "dev": true + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true, + "peer": true + }, + "node_modules/@types/mkdirp": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz", + "integrity": "sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==", "dev": true, "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "@types/node": "*" } }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "node_modules/@types/mocha": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.2.tgz", + "integrity": "sha512-NaHL0+0lLNhX6d9rs+NSt97WH/gIlRHmszXbQ/8/MV/eVcFNdeJ/GYhrFuUc8K7WuPhRhTSdMkCp8VMzhUq85w==", + "dev": true, + "peer": true + }, + "node_modules/@types/node": { + "version": "20.5.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", + "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==", "dev": true }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/@types/node-fetch": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.6.tgz", + "integrity": "sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" } }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/@types/pbkdf2": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", + "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", "dev": true, "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/node": "*" } }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "dev": true + }, + "node_modules/@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==", "dev": true, - "engines": { - "node": ">=8" - } + "peer": true }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/@types/readable-stream": { + "version": "2.3.15", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", + "integrity": "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==", "dev": true, "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/node": "*", + "safe-buffer": "~5.1.1" } }, - "node_modules/eslint/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/@types/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", "dev": true, "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/node": "*" } }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/@types/secp256k1": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.4.tgz", + "integrity": "sha512-oN0PFsYxDZnX/qSJ5S5OwaEDTYfekhvaM5vqui2bu1AA39pKofmgL104Q29KiOXizXS2yLjSzc5YdTyMKdcy4A==", "dev": true, "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/node": "*" } }, - "node_modules/eslint/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } + "peer": true }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/abstract-level": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", + "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "buffer": "^6.0.3", + "catering": "^2.1.0", + "is-buffer": "^2.0.5", + "level-supports": "^4.0.0", + "level-transcoder": "^1.0.1", + "module-error": "^1.0.1", + "queue-microtask": "^1.2.3" }, "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "node_modules/abstract-level/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "node_modules/abstract-leveldown": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz", + "integrity": "sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==", "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "dependencies": { + "buffer": "^5.5.0", + "immediate": "^3.2.3", + "level-concat-iterator": "~2.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "node_modules/abstract-leveldown/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "node_modules/abstract-leveldown/node_modules/level-supports": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", + "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", "dev": true, "dependencies": { - "estraverse": "^5.2.0" + "xtend": "^4.0.2" }, "engines": { - "node": ">=4.0" + "node": ">=6" } }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, + "bin": { + "acorn": "bin/acorn" + }, "engines": { - "node": ">=4.0" + "node": ">=0.4.0" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true, "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eth-ens-namehash": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", - "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==", - "dev": true, - "dependencies": { - "idna-uts46-hx": "^2.3.1", - "js-sha3": "^0.5.7" + "node": ">=0.4.0" } }, - "node_modules/eth-ens-namehash/node_modules/js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", - "dev": true - }, - "node_modules/eth-gas-reporter": { - "version": "0.2.27", - "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.27.tgz", - "integrity": "sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==", + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", "dev": true, - "dependencies": { - "@solidity-parser/parser": "^0.14.0", - "axios": "^1.5.1", - "cli-table3": "^0.5.0", - "colors": "1.4.0", - "ethereum-cryptography": "^1.0.3", - "ethers": "^5.7.2", - "fs-readdir-recursive": "^1.1.0", - "lodash": "^4.17.14", - "markdown-table": "^1.1.3", - "mocha": "^10.2.0", - "req-cwd": "^2.0.0", - "sha1": "^1.1.1", - "sync-request": "^6.0.0" - }, - "peerDependencies": { - "@codechecks/client": "^0.1.0" - }, - "peerDependenciesMeta": { - "@codechecks/client": { - "optional": true - } + "peer": true, + "engines": { + "node": ">= 10.0.0" } }, - "node_modules/eth-gas-reporter/node_modules/@noble/hashes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", - "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", + "node_modules/adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] + "engines": { + "node": ">=0.3.0" + } }, - "node_modules/eth-gas-reporter/node_modules/@scure/bip32": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", - "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", + "node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "@noble/hashes": "~1.2.0", - "@noble/secp256k1": "~1.7.0", - "@scure/base": "~1.1.0" - } + "peer": true }, - "node_modules/eth-gas-reporter/node_modules/@scure/bip39": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", - "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], "dependencies": { - "@noble/hashes": "~1.2.0", - "@scure/base": "~1.1.0" + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" } }, - "node_modules/eth-gas-reporter/node_modules/ethereum-cryptography": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", - "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, "dependencies": { - "@noble/hashes": "1.2.0", - "@noble/secp256k1": "1.7.1", - "@scure/bip32": "1.1.5", - "@scure/bip39": "1.1.1" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/eth-lib": { - "version": "0.1.29", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", - "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "nano-json-stream-parser": "^0.1.2", - "servify": "^0.1.12", - "ws": "^3.0.0", - "xhr-request-promise": "^0.1.2" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/eth-lib/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/eth-lib/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/eth-lib/node_modules/ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "node_modules/amazon-cognito-identity-js": { + "version": "6.3.6", + "resolved": "https://registry.npmjs.org/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.6.tgz", + "integrity": "sha512-kBq+GE6OkLrxtFj3ZduIOlKBFYeOqZK3EhxbDBkv476UTvy+uwfR0tlriTq2QzNdnvlQAjBIXnXuOM7DwR1UEQ==", "dev": true, "dependencies": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" + "@aws-crypto/sha256-js": "1.2.2", + "buffer": "4.9.2", + "fast-base64-decode": "^1.0.0", + "isomorphic-unfetch": "^3.0.0", + "js-cookie": "^2.2.1" } }, - "node_modules/ethereum-bloom-filters": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", - "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", "dev": true, - "dependencies": { - "js-sha3": "^0.8.0" + "optional": true, + "peer": true, + "engines": { + "node": ">=0.4.2" } }, - "node_modules/ethereum-cryptography": { - "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", + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "engines": { + "node": ">=6" } }, - "node_modules/ethereum-waffle": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/ethereum-waffle/-/ethereum-waffle-3.4.4.tgz", - "integrity": "sha512-PA9+jCjw4WC3Oc5ocSMBj5sXvueWQeAbvCA+hUlb6oFgwwKyq5ka3bWQ7QZcjzIX+TdFkxP4IbFmoY2D8Dkj9Q==", + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "dependencies": { - "@ethereum-waffle/chai": "^3.4.4", - "@ethereum-waffle/compiler": "^3.4.4", - "@ethereum-waffle/mock-contract": "^3.4.4", - "@ethereum-waffle/provider": "^3.4.4", - "ethers": "^5.0.1" + "type-fest": "^0.21.3" }, - "bin": { - "waffle": "bin/waffle" + "engines": { + "node": ">=8" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, "engines": { - "node": ">=10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ethereumjs-abi": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", - "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "dependencies": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/ethereumjs-abi/node_modules/@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "node_modules/ansicolors": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", + "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", + "dev": true + }, + "node_modules/antlr4ts": { + "version": "0.5.0-alpha.4", + "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", + "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "dependencies": { - "@types/node": "*" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/ethereumjs-abi/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, - "node_modules/ethereumjs-abi/node_modules/ethereumjs-util": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", - "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", "dev": true, "dependencies": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "node_modules/array-includes": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", "dev": true, + "peer": true, "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" }, "engines": { - "node": ">=10.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" } }, - "node_modules/ethjs-abi": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ethjs-abi/-/ethjs-abi-0.2.1.tgz", - "integrity": "sha512-g2AULSDYI6nEJyJaEVEXtTimRY2aPC2fi7ddSy0W+LXvEVL8Fe1y76o43ecbgdUKwZD+xsmEgX1yJr1Ia3r1IA==", + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.3.tgz", + "integrity": "sha512-kcBubumjciBg4JKp5KTKtI7ec7tRefPk88yjkWJwaVKYd9QfTaxcsOxoMNKd7iBr447zCfDV0z1kOF47umv42g==", "dev": true, "dependencies": { - "bn.js": "4.11.6", - "js-sha3": "0.5.5", - "number-to-bn": "1.7.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" }, "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ethjs-abi/node_modules/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", - "dev": true - }, - "node_modules/ethjs-abi/node_modules/js-sha3": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.5.tgz", - "integrity": "sha512-yLLwn44IVeunwjpDVTDZmQeVbB0h+dZpY2eO68B/Zik8hu6dH+rKeLxwua79GGIvW6xr8NBAcrtiUbYrTjEFTA==", - "dev": true - }, - "node_modules/ethjs-unit": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", + "node_modules/array.prototype.findlastindex": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", "dev": true, + "peer": true, "dependencies": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" }, "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ethjs-unit/node_modules/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", - "dev": true - }, - "node_modules/ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, + "peer": true, "dependencies": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" }, "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", - "dev": true - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, + "peer": true, "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", "dev": true, "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" }, "engines": { - "node": ">= 0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/express/node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "peer": true + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dev": true, "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "safer-buffer": "~2.1.0" } }, - "node_modules/express/node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=0.8" } }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true, - "dependencies": { - "ms": "2.0.0" + "peer": true, + "engines": { + "node": "*" } }, - "node_modules/express/node_modules/ms": { + "node_modules/astral-regex": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/express/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/express/node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" + "lodash": "^4.17.14" } }, - "node_modules/ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "node_modules/async-eventemitter": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", + "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", "dev": true, "dependencies": { - "type": "^2.7.2" + "async": "^2.4.0" } }, - "node_modules/ext/node_modules/type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", - "dev": true + "node_modules/async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "dev": true, + "dependencies": { + "retry": "0.13.1" + } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, - "engines": [ - "node >=0.6.0" - ] + "engines": { + "node": ">= 4.0.0" + } }, - "node_modules/fast-check": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.1.1.tgz", - "integrity": "sha512-3vtXinVyuUKCKFKYcwXhGE6NtGWkqF8Yh3rvMZNzmwz8EPrgoc/v4pDdLHyLnCyCI5MZpZZkDEwFyXyEONOxpA==", + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true, - "dependencies": { - "pure-rand": "^5.0.1" - }, "engines": { - "node": ">=8.0.0" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, "engines": { - "node": ">=8.6.0" + "node": "*" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "dev": true + }, + "node_modules/axios": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", + "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", "dev": true, "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "node_modules/b4a": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", + "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==", "dev": true }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "node_modules/base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", "dev": true, "dependencies": { - "reusify": "^1.0.4" + "safe-buffer": "^5.0.1" } }, - "node_modules/ffjavascript": { - "version": "0.2.60", - "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.60.tgz", - "integrity": "sha512-T/9bnEL5xAZRDbQoEMf+pM9nrhK+C3JyZNmqiWub26EQorW7Jt+jR54gpqDhceA4Nj0YctPQwYnl8xa52/A26A==", + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dev": true, "dependencies": { - "wasmbuilder": "0.0.16", - "wasmcurves": "0.2.2", - "web-worker": "^1.2.0" + "tweetnacl": "^0.14.3" } }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "node_modules/bcrypt-pbkdf/node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, + "node_modules/bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", + "dev": true + }, + "node_modules/bigint-crypto-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz", + "integrity": "sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/blake-hash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/blake-hash/-/blake-hash-2.0.0.tgz", + "integrity": "sha512-Igj8YowDu1PRkRsxZA7NVkdFNxH5rKv5cpLxQ0CVXSIA77pVYwCPRQJ2sMew/oneUpfuYRyjG6r8SmmmnbZb1w==", "dev": true, + "hasInstallScript": true, "dependencies": { - "flat-cache": "^3.0.4" + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2", + "readable-stream": "^3.6.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">= 10" } }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "node_modules/blake2b": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/blake2b/-/blake2b-2.1.4.tgz", + "integrity": "sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A==", "dev": true, "dependencies": { - "minimatch": "^5.0.1" + "blake2b-wasm": "^2.4.0", + "nanoassert": "^2.0.0" } }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/blake2b-wasm": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz", + "integrity": "sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0" + "b4a": "^1.0.1", + "nanoassert": "^2.0.0" } }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", + "dev": true + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "dependencies": { - "to-regex-range": "^5.0.1" + "fill-range": "^7.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/browser-level": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", + "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", "dev": true, "dependencies": { - "ms": "2.0.0" + "abstract-level": "^1.0.2", + "catering": "^2.1.1", + "module-error": "^1.0.2", + "run-parallel-limit": "^1.1.0" } }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, - "node_modules/find-replace": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz", - "integrity": "sha512-KrUnjzDCD9426YnCP56zGYy/eieTnhtK6Vn++j+JJzmlsWWwEkDnsyVF575spT6HJ6Ow9tlbT3TQTDsa+O4UWA==", + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "dependencies": { - "array-back": "^1.0.4", - "test-value": "^2.1.0" - }, - "engines": { - "node": ">=4.0.0" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "node_modules/find-replace/node_modules/array-back": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", - "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==", - "dev": true, - "dependencies": { - "typical": "^2.6.0" - }, - "engines": { - "node": ">=0.12.0" - } + "node_modules/browserify-aes/node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", "dev": true, "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" + "base-x": "^3.0.2" } }, - "node_modules/find-yarn-workspace-root": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", - "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", + "node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", "dev": true, "dependencies": { - "micromatch": "^4.0.2" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" } }, - "node_modules/flat-cache": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", - "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", "dev": true, "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=12.0.0" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" } }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "node_modules/follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "node_modules/buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "node": ">=4" } }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "node_modules/buffer-xor": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-2.0.2.tgz", + "integrity": "sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==", "dev": true, "dependencies": { - "is-callable": "^1.1.3" + "safe-buffer": "^5.1.1" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "node_modules/bufferutil": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", + "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", + "devOptional": true, + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, "engines": { - "node": "*" + "node": ">= 0.8" } }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" }, - "engines": { - "node": ">= 6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/form-data-encoder": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz", - "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==", - "dev": true - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=6" } }, - "node_modules/fp-ts": { - "version": "1.19.3", - "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", - "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", - "dev": true - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "node_modules/cardinal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", + "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", "dev": true, "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "ansicolors": "~0.3.2", + "redeyed": "~2.1.0" }, - "engines": { - "node": ">=6 <7 || >=8" + "bin": { + "cdl": "bin/cdl.js" } }, - "node_modules/fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "node_modules/case": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", + "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==", "dev": true, - "dependencies": { - "minipass": "^2.6.0" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": true }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "node_modules/catering": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", + "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=6" } }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "node_modules/cbor": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", + "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peer": true, + "dependencies": { + "nofilter": "^3.1.0" + }, + "engines": { + "node": ">=12.19" } }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "node_modules/chai": { + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", + "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", "dev": true, + "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "node_modules/chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peer": true, + "dependencies": { + "check-error": "^1.0.2" + }, + "peerDependencies": { + "chai": ">= 2.1.2 < 5" } }, - "node_modules/ganache-core": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/ganache-core/-/ganache-core-2.13.2.tgz", - "integrity": "sha512-tIF5cR+ANQz0+3pHWxHjIwHqFXcVo0Mb+kcsNhglNFALcYo49aQpnS9dqHartqPfMFjiHh/qFoD3mYK0d/qGgw==", - "bundleDependencies": [ - "keccak" - ], - "deprecated": "ganache-core is now ganache; visit https://trfl.io/g7 for details", + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "hasShrinkwrap": true, "dependencies": { - "abstract-leveldown": "3.0.0", - "async": "2.6.2", - "bip39": "2.5.0", - "cachedown": "1.0.0", - "clone": "2.1.2", - "debug": "3.2.6", - "encoding-down": "5.0.4", - "eth-sig-util": "3.0.0", - "ethereumjs-abi": "0.6.8", - "ethereumjs-account": "3.0.0", - "ethereumjs-block": "2.2.2", - "ethereumjs-common": "1.5.0", - "ethereumjs-tx": "2.1.2", - "ethereumjs-util": "6.2.1", - "ethereumjs-vm": "4.2.0", - "heap": "0.2.6", - "keccak": "3.0.1", - "level-sublevel": "6.6.4", - "levelup": "3.1.1", - "lodash": "4.17.20", - "lru-cache": "5.1.1", - "merkle-patricia-tree": "3.0.0", - "patch-package": "6.2.2", - "seedrandom": "3.0.1", - "source-map-support": "0.5.12", - "tmp": "0.1.0", - "web3-provider-engine": "14.2.1", - "websocket": "1.0.32" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=8.9.0" - }, - "optionalDependencies": { - "ethereumjs-wallet": "0.6.5", - "web3": "1.2.11" + "node": ">=4" } }, - "node_modules/ganache-core/node_modules/@ethersproject/abi": { - "version": "5.0.0-beta.153", + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/address": ">=5.0.0-beta.128", - "@ethersproject/bignumber": ">=5.0.0-beta.130", - "@ethersproject/bytes": ">=5.0.0-beta.129", - "@ethersproject/constants": ">=5.0.0-beta.128", - "@ethersproject/hash": ">=5.0.0-beta.128", - "@ethersproject/keccak256": ">=5.0.0-beta.127", - "@ethersproject/logger": ">=5.0.0-beta.129", - "@ethersproject/properties": ">=5.0.0-beta.131", - "@ethersproject/strings": ">=5.0.0-beta.130" + "peer": true, + "engines": { + "node": "*" } }, - "node_modules/ganache-core/node_modules/@ethersproject/abstract-provider": { - "version": "5.0.8", + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, + "peer": true, "dependencies": { - "@ethersproject/bignumber": "^5.0.13", - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/logger": "^5.0.8", - "@ethersproject/networks": "^5.0.7", - "@ethersproject/properties": "^5.0.7", - "@ethersproject/transactions": "^5.0.9", - "@ethersproject/web": "^5.0.12" + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" } }, - "node_modules/ganache-core/node_modules/@ethersproject/abstract-signer": { - "version": "5.0.10", + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, "funding": [ { "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" + "url": "https://paulmillr.com/funding/" } ], - "license": "MIT", - "optional": true, "dependencies": { - "@ethersproject/abstract-provider": "^5.0.8", - "@ethersproject/bignumber": "^5.0.13", - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/logger": "^5.0.8", - "@ethersproject/properties": "^5.0.7" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/ganache-core/node_modules/@ethersproject/address": { - "version": "5.0.9", + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, "dependencies": { - "@ethersproject/bignumber": "^5.0.13", - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/keccak256": "^5.0.7", - "@ethersproject/logger": "^5.0.8", - "@ethersproject/rlp": "^5.0.7" + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/ganache-core/node_modules/@ethersproject/base64": { - "version": "5.0.7", + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, "dependencies": { - "@ethersproject/bytes": "^5.0.9" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "node_modules/ganache-core/node_modules/@ethersproject/bignumber": { - "version": "5.0.13", + "node_modules/circomlibjs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/circomlibjs/-/circomlibjs-0.1.1.tgz", + "integrity": "sha512-Bl7Mylf/VERdI5bRTIQ4hpi2EgbfIvEyJrn/MPh2pEqScbCkatX44RF8fuNGigoiQGdhItaIikgHKLTdlPPLPQ==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, "dependencies": { - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/logger": "^5.0.8", - "bn.js": "^4.4.0" + "blake-hash": "^2.0.0", + "blake2b": "^2.1.3", + "ethers": "^5.5.1", + "ffjavascript": "^0.2.45" } }, - "node_modules/ganache-core/node_modules/@ethersproject/bytes": { - "version": "5.0.9", + "node_modules/circomlibjs/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", "dev": true, "funding": [ { @@ -9404,5980 +5353,6610 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", - "optional": true, "dependencies": { - "@ethersproject/logger": "^5.0.8" + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" } }, - "node_modules/ganache-core/node_modules/@ethersproject/constants": { - "version": "5.0.8", + "node_modules/classic-level": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.3.0.tgz", + "integrity": "sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, + "hasInstallScript": true, "dependencies": { - "@ethersproject/bignumber": "^5.0.13" + "abstract-level": "^1.0.2", + "catering": "^2.1.0", + "module-error": "^1.0.1", + "napi-macros": "^2.2.2", + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=12" } }, - "node_modules/ganache-core/node_modules/@ethersproject/hash": { - "version": "5.0.10", + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/abstract-signer": "^5.0.10", - "@ethersproject/address": "^5.0.9", - "@ethersproject/bignumber": "^5.0.13", - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/keccak256": "^5.0.7", - "@ethersproject/logger": "^5.0.8", - "@ethersproject/properties": "^5.0.7", - "@ethersproject/strings": "^5.0.8" + "engines": { + "node": ">=6" } }, - "node_modules/ganache-core/node_modules/@ethersproject/keccak256": { - "version": "5.0.7", + "node_modules/cli-progress": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", + "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, "dependencies": { - "@ethersproject/bytes": "^5.0.9", - "js-sha3": "0.5.7" + "string-width": "^4.2.3" + }, + "engines": { + "node": ">=4" } }, - "node_modules/ganache-core/node_modules/@ethersproject/logger": { - "version": "5.0.8", + "node_modules/cli-progress/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/ganache-core/node_modules/@ethersproject/networks": { - "version": "5.0.7", + "node_modules/cli-table3": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", + "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, + "peer": true, "dependencies": { - "@ethersproject/logger": "^5.0.8" + "object-assign": "^4.1.0", + "string-width": "^2.1.1" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "colors": "^1.1.2" } }, - "node_modules/ganache-core/node_modules/@ethersproject/properties": { - "version": "5.0.7", + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, "dependencies": { - "@ethersproject/logger": "^5.0.8" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/ganache-core/node_modules/@ethersproject/rlp": { - "version": "5.0.7", + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, "dependencies": { - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/logger": "^5.0.8" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/ganache-core/node_modules/@ethersproject/signing-key": { - "version": "5.0.8", + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/logger": "^5.0.8", - "@ethersproject/properties": "^5.0.7", - "elliptic": "6.5.3" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/@ethersproject/strings": { - "version": "5.0.8", + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, "dependencies": { - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/constants": "^5.0.8", - "@ethersproject/logger": "^5.0.8" + "color-name": "1.1.3" } }, - "node_modules/ganache-core/node_modules/@ethersproject/transactions": { - "version": "5.0.9", + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/address": "^5.0.9", - "@ethersproject/bignumber": "^5.0.13", - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/constants": "^5.0.8", - "@ethersproject/keccak256": "^5.0.7", - "@ethersproject/logger": "^5.0.8", - "@ethersproject/properties": "^5.0.7", - "@ethersproject/rlp": "^5.0.7", - "@ethersproject/signing-key": "^5.0.8" + "peer": true, + "engines": { + "node": ">=0.1.90" } }, - "node_modules/ganache-core/node_modules/@ethersproject/web": { - "version": "5.0.12", + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, "dependencies": { - "@ethersproject/base64": "^5.0.7", - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/logger": "^5.0.8", - "@ethersproject/properties": "^5.0.7", - "@ethersproject/strings": "^5.0.8" + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/ganache-core/node_modules/@sindresorhus/is": { - "version": "0.14.0", + "node_modules/command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", + "dev": true + }, + "node_modules/command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", "dev": true, - "license": "MIT", - "optional": true, + "peer": true, + "dependencies": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, "engines": { - "node": ">=6" + "node": ">=4.0.0" } }, - "node_modules/ganache-core/node_modules/@szmarczak/http-timer": { - "version": "1.1.2", + "node_modules/command-line-usage": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", + "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", "dev": true, - "license": "MIT", - "optional": true, + "peer": true, "dependencies": { - "defer-to-connect": "^1.0.1" + "array-back": "^4.0.2", + "chalk": "^2.4.2", + "table-layout": "^1.0.2", + "typical": "^5.2.0" }, "engines": { - "node": ">=6" + "node": ">=8.0.0" } }, - "node_modules/ganache-core/node_modules/@types/bn.js": { - "version": "4.11.6", + "node_modules/command-line-usage/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" + "peer": true, + "engines": { + "node": ">=8" } }, - "node_modules/ganache-core/node_modules/@types/node": { - "version": "14.14.20", + "node_modules/command-line-usage/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, - "license": "MIT" + "peer": true, + "engines": { + "node": ">=8" + } }, - "node_modules/ganache-core/node_modules/@types/pbkdf2": { - "version": "3.1.0", + "node_modules/commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", + "dev": true + }, + "node_modules/compare-versions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.0.tgz", + "integrity": "sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, - "license": "MIT", + "engines": [ + "node >= 0.8" + ], + "peer": true, "dependencies": { - "@types/node": "*" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, - "node_modules/ganache-core/node_modules/@types/secp256k1": { - "version": "4.0.1", + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, - "license": "MIT", + "peer": true, "dependencies": { - "@types/node": "*" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/ganache-core/node_modules/@yarnpkg/lockfile": { - "version": "1.1.0", + "node_modules/concat-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, - "license": "BSD-2-Clause" + "peer": true }, - "node_modules/ganache-core/node_modules/abstract-leveldown": { - "version": "3.0.0", + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, - "license": "MIT", + "peer": true, "dependencies": { - "xtend": "~4.0.0" - }, - "engines": { - "node": ">=4" + "safe-buffer": "~5.1.0" } }, - "node_modules/ganache-core/node_modules/accepts": { - "version": "1.3.7", + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - }, "engines": { "node": ">= 0.6" } }, - "node_modules/ganache-core/node_modules/aes-js": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/ajv": { - "version": "6.12.6", + "node_modules/core-js-pure": { + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.33.0.tgz", + "integrity": "sha512-FKSIDtJnds/YFIEaZ4HszRX7hkxGpNKM7FC9aJ9WLJbSd3lD4vOltFuVIBLR8asSx9frkTSqL0dw90SKQxgKrg==", "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, + "hasInstallScript": true, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/ganache-core/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true }, - "node_modules/ganache-core/node_modules/arr-diff": { - "version": "4.0.0", + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", "dev": true, - "license": "MIT", + "bin": { + "crc32": "bin/crc32.njs" + }, "engines": { - "node": ">=0.10.0" + "node": ">=0.8" } }, - "node_modules/ganache-core/node_modules/arr-flatten": { - "version": "1.1.0", + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, - "node_modules/ganache-core/node_modules/arr-union": { - "version": "3.1.0", + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, - "node_modules/ganache-core/node_modules/array-flatten": { + "node_modules/create-require": { "version": "1.1.1", - "dev": true, - "license": "MIT", - "optional": true + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true }, - "node_modules/ganache-core/node_modules/array-unique": { - "version": "0.3.2", + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, - "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/ganache-core/node_modules/asn1": { - "version": "0.2.4", + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": "~2.1.0" + "peer": true, + "engines": { + "node": "*" } }, - "node_modules/ganache-core/node_modules/asn1.js": { - "version": "5.4.1", + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dev": true, - "license": "MIT", - "optional": true, "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/ganache-core/node_modules/assert-plus": { - "version": "1.0.0", - "dev": true, - "license": "MIT", + "assert-plus": "^1.0.0" + }, "engines": { - "node": ">=0.8" + "node": ">=0.10" } }, - "node_modules/ganache-core/node_modules/assign-symbols": { - "version": "1.0.0", + "node_modules/death": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", + "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "peer": true }, - "node_modules/ganache-core/node_modules/async": { - "version": "2.6.2", + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, - "license": "MIT", "dependencies": { - "lodash": "^4.17.11" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/ganache-core/node_modules/async-eventemitter": { - "version": "0.2.4", + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "dev": true, - "license": "MIT", - "dependencies": { - "async": "^2.4.0" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ganache-core/node_modules/async-limiter": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/asynckit": { - "version": "0.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/atob": { - "version": "2.1.2", + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "dev": true, - "license": "(MIT OR Apache-2.0)", - "bin": { - "atob": "bin/atob.js" + "peer": true, + "dependencies": { + "type-detect": "^4.0.0" }, "engines": { - "node": ">= 4.5.0" + "node": ">=6" } }, - "node_modules/ganache-core/node_modules/aws-sign2": { - "version": "0.7.0", + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, - "license": "Apache-2.0", + "peer": true, "engines": { - "node": "*" + "node": ">=4.0.0" } }, - "node_modules/ganache-core/node_modules/aws4": { - "version": "1.11.0", - "dev": true, - "license": "MIT" + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true }, - "node_modules/ganache-core/node_modules/babel-code-frame": { - "version": "6.26.0", + "node_modules/deferred-leveldown": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz", + "integrity": "sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==", "dev": true, - "license": "MIT", "dependencies": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" + "abstract-leveldown": "~6.2.1", + "inherits": "^2.0.3" + }, + "engines": { + "node": ">=6" } }, - "node_modules/ganache-core/node_modules/babel-code-frame/node_modules/ansi-regex": { - "version": "2.1.1", + "node_modules/deferred-leveldown/node_modules/abstract-leveldown": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", + "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", "dev": true, - "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "immediate": "^3.2.3", + "level-concat-iterator": "~2.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/ganache-core/node_modules/babel-code-frame/node_modules/ansi-styles": { - "version": "2.2.1", + "node_modules/deferred-leveldown/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/ganache-core/node_modules/babel-code-frame/node_modules/chalk": { - "version": "1.1.3", + "node_modules/deferred-leveldown/node_modules/level-supports": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", + "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", "dev": true, - "license": "MIT", "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "xtend": "^4.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/ganache-core/node_modules/babel-code-frame/node_modules/js-tokens": { - "version": "3.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/babel-code-frame/node_modules/strip-ansi": { - "version": "3.0.1", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, - "license": "MIT", "dependencies": { - "ansi-regex": "^2.0.0" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ganache-core/node_modules/babel-code-frame/node_modules/supports-color": { - "version": "2.0.0", + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, - "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">=0.4.0" } }, - "node_modules/ganache-core/node_modules/babel-core": { - "version": "6.26.3", + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, - "license": "MIT", - "dependencies": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" + "engines": { + "node": ">= 0.8" } }, - "node_modules/ganache-core/node_modules/babel-core/node_modules/debug": { - "version": "2.6.9", + "node_modules/detect-port": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", + "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", "dev": true, - "license": "MIT", + "peer": true, "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/ganache-core/node_modules/babel-core/node_modules/json5": { - "version": "0.5.1", - "dev": true, - "license": "MIT", + "address": "^1.0.1", + "debug": "4" + }, "bin": { - "json5": "lib/cli.js" + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" } }, - "node_modules/ganache-core/node_modules/babel-core/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/babel-core/node_modules/slash": { - "version": "1.0.0", + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true, - "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=0.3.1" } }, - "node_modules/ganache-core/node_modules/babel-generator": { - "version": "6.26.1", + "node_modules/difflib": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", + "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", "dev": true, - "license": "MIT", + "peer": true, "dependencies": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" + "heap": ">= 0.2.0" + }, + "engines": { + "node": "*" } }, - "node_modules/ganache-core/node_modules/babel-generator/node_modules/jsesc": { - "version": "1.3.0", + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/ganache-core/node_modules/babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, - "license": "MIT", "dependencies": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/ganache-core/node_modules/babel-helper-call-delegate": { - "version": "6.24.1", + "node_modules/dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", "dev": true, - "license": "MIT", - "dependencies": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "engines": { + "node": ">=10" } }, - "node_modules/ganache-core/node_modules/babel-helper-define-map": { - "version": "6.26.0", + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dev": true, - "license": "MIT", "dependencies": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, - "node_modules/ganache-core/node_modules/babel-helper-explode-assignable-expression": { - "version": "6.24.1", + "node_modules/ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", "dev": true, - "license": "MIT", "dependencies": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/babel-helper-function-name": { - "version": "6.24.1", + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "dev": true, - "license": "MIT", "dependencies": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/ganache-core/node_modules/babel-helper-get-function-arity": { - "version": "6.24.1", + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/encoding-down": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz", + "integrity": "sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==", "dev": true, - "license": "MIT", "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "abstract-leveldown": "^6.2.1", + "inherits": "^2.0.3", + "level-codec": "^9.0.0", + "level-errors": "^2.0.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/ganache-core/node_modules/babel-helper-hoist-variables": { - "version": "6.24.1", + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", "dev": true, - "license": "MIT", "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" } }, - "node_modules/ganache-core/node_modules/babel-helper-optimise-call-expression": { - "version": "6.24.1", + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, - "license": "MIT", - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "engines": { + "node": ">=6" } }, - "node_modules/ganache-core/node_modules/babel-helper-regex": { - "version": "6.26.0", + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "dev": true, - "license": "MIT", "dependencies": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" } }, - "node_modules/ganache-core/node_modules/babel-helper-remap-async-to-generator": { - "version": "6.24.1", + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "license": "MIT", "dependencies": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "is-arrayish": "^0.2.1" } }, - "node_modules/ganache-core/node_modules/babel-helper-replace-supers": { - "version": "6.24.1", + "node_modules/es-abstract": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz", + "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", "dev": true, - "license": "MIT", "dependencies": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ganache-core/node_modules/babel-helpers": { - "version": "6.24.1", + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", "dev": true, - "license": "MIT", "dependencies": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/ganache-core/node_modules/babel-messages": { - "version": "6.23.0", + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", "dev": true, - "license": "MIT", "dependencies": { - "babel-runtime": "^6.22.0" + "has": "^1.0.3" } }, - "node_modules/ganache-core/node_modules/babel-plugin-check-es2015-constants": { - "version": "6.22.0", + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, - "license": "MIT", "dependencies": { - "babel-runtime": "^6.22.0" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ganache-core/node_modules/babel-plugin-syntax-async-functions": { - "version": "6.13.0", + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true, - "license": "MIT" + "engines": { + "node": ">=6" + } }, - "node_modules/ganache-core/node_modules/babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "license": "MIT" + "engines": { + "node": ">=0.8.0" + } }, - "node_modules/ganache-core/node_modules/babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", + "node_modules/escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", "dev": true, - "license": "MIT" + "peer": true, + "dependencies": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=0.12.0" + }, + "optionalDependencies": { + "source-map": "~0.2.0" + } }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-async-to-generator": { - "version": "6.24.1", + "node_modules/escodegen/node_modules/estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", "dev": true, - "license": "MIT", - "dependencies": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.0" + "peer": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, - "license": "MIT", + "peer": true, "dependencies": { - "babel-runtime": "^6.22.0" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, - "license": "MIT", + "peer": true, "dependencies": { - "babel-runtime": "^6.22.0" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "dev": true, - "license": "MIT", - "dependencies": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "peer": true, + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-classes": { - "version": "6.24.1", + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dev": true, - "license": "MIT", + "peer": true, "dependencies": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", + "node_modules/eslint": { + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", + "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", "dev": true, - "license": "MIT", "dependencies": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.51.0", + "@humanwhocodes/config-array": "^0.11.11", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", + "node_modules/eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", "dev": true, - "license": "MIT", "dependencies": { - "babel-runtime": "^6.22.0" + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" } }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, - "license": "MIT", + "peer": true, "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", + "peer": true, "dependencies": { - "babel-runtime": "^6.22.0" + "ms": "^2.1.1" } }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, - "license": "MIT", + "peer": true, "dependencies": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-literals": { - "version": "6.22.0", + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", + "peer": true, "dependencies": { - "babel-runtime": "^6.22.0" + "ms": "^2.1.1" } }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", + "node_modules/eslint-plugin-import": { + "version": "2.28.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", + "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", "dev": true, - "license": "MIT", + "peer": true, "dependencies": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "array-includes": "^3.1.6", + "array.prototype.findlastindex": "^1.2.2", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.8.0", + "has": "^1.0.3", + "is-core-module": "^2.13.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.6", + "object.groupby": "^1.0.0", + "object.values": "^1.1.6", + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", + "peer": true, "dependencies": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" + "ms": "^2.1.1" } }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, - "license": "MIT", + "peer": true, "dependencies": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", + "node_modules/eslint-plugin-mocha": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-9.0.0.tgz", + "integrity": "sha512-d7knAcQj1jPCzZf3caeBIn3BnW6ikcvfz0kSqQpwPYcVGLoJV5sz0l0OJB2LR8I7dvTDbqq1oV6ylhSgzA10zg==", "dev": true, - "license": "MIT", "dependencies": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "eslint-utils": "^3.0.0", + "ramda": "^0.27.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, - "license": "MIT", "dependencies": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, - "license": "MIT", "dependencies": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" } }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, - "license": "MIT", - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "engines": { + "node": ">=10" } }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-spread": { - "version": "6.22.0", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "MIT", - "dependencies": { - "babel-runtime": "^6.22.0" + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { - "babel-runtime": "^6.22.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { - "babel-runtime": "^6.22.0" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" - } + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "license": "MIT", - "dependencies": { - "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", - "babel-plugin-syntax-exponentiation-operator": "^6.8.0", - "babel-runtime": "^6.22.0" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-regenerator": { - "version": "6.26.0", + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", - "dependencies": { - "regenerator-transform": "^0.10.0" + "engines": { + "node": ">=8" } }, - "node_modules/ganache-core/node_modules/babel-plugin-transform-strict-mode": { - "version": "6.24.1", + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/ganache-core/node_modules/babel-preset-env": { - "version": "1.7.0", + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, - "license": "MIT", "dependencies": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-to-generator": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.23.0", - "babel-plugin-transform-es2015-classes": "^6.23.0", - "babel-plugin-transform-es2015-computed-properties": "^6.22.0", - "babel-plugin-transform-es2015-destructuring": "^6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", - "babel-plugin-transform-es2015-for-of": "^6.23.0", - "babel-plugin-transform-es2015-function-name": "^6.22.0", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.22.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-umd": "^6.23.0", - "babel-plugin-transform-es2015-object-super": "^6.22.0", - "babel-plugin-transform-es2015-parameters": "^6.23.0", - "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", - "babel-plugin-transform-exponentiation-operator": "^6.22.0", - "babel-plugin-transform-regenerator": "^6.22.0", - "browserslist": "^3.2.6", - "invariant": "^2.2.2", - "semver": "^5.3.0" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/ganache-core/node_modules/babel-preset-env/node_modules/semver": { - "version": "5.7.1", + "node_modules/esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", "dev": true, - "license": "ISC", + "peer": true, "bin": { - "semver": "bin/semver" + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/babel-register": { - "version": "6.26.0", + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, - "license": "MIT", "dependencies": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" } }, - "node_modules/ganache-core/node_modules/babel-register/node_modules/source-map-support": { - "version": "0.4.18", + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "license": "MIT", "dependencies": { - "source-map": "^0.5.6" + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" } }, - "node_modules/ganache-core/node_modules/babel-runtime": { - "version": "6.26.0", + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "MIT", - "dependencies": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" + "engines": { + "node": ">=4.0" } }, - "node_modules/ganache-core/node_modules/babel-template": { - "version": "6.26.0", + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eth-ens-namehash": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", + "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==", "dev": true, - "license": "MIT", "dependencies": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" + "idna-uts46-hx": "^2.3.1", + "js-sha3": "^0.5.7" } }, - "node_modules/ganache-core/node_modules/babel-traverse": { - "version": "6.26.0", + "node_modules/eth-ens-namehash/node_modules/js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", + "dev": true + }, + "node_modules/eth-gas-reporter": { + "version": "0.2.27", + "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.27.tgz", + "integrity": "sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==", "dev": true, - "license": "MIT", + "peer": true, "dependencies": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" + "@solidity-parser/parser": "^0.14.0", + "axios": "^1.5.1", + "cli-table3": "^0.5.0", + "colors": "1.4.0", + "ethereum-cryptography": "^1.0.3", + "ethers": "^5.7.2", + "fs-readdir-recursive": "^1.1.0", + "lodash": "^4.17.14", + "markdown-table": "^1.1.3", + "mocha": "^10.2.0", + "req-cwd": "^2.0.0", + "sha1": "^1.1.1", + "sync-request": "^6.0.0" + }, + "peerDependencies": { + "@codechecks/client": "^0.1.0" + }, + "peerDependenciesMeta": { + "@codechecks/client": { + "optional": true + } } }, - "node_modules/ganache-core/node_modules/babel-traverse/node_modules/debug": { - "version": "2.6.9", + "node_modules/eth-gas-reporter/node_modules/@noble/hashes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", + "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", "dev": true, - "license": "MIT", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "peer": true + }, + "node_modules/eth-gas-reporter/node_modules/@scure/bip32": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", + "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "peer": true, "dependencies": { - "ms": "2.0.0" + "@noble/hashes": "~1.2.0", + "@noble/secp256k1": "~1.7.0", + "@scure/base": "~1.1.0" } }, - "node_modules/ganache-core/node_modules/babel-traverse/node_modules/globals": { - "version": "9.18.0", + "node_modules/eth-gas-reporter/node_modules/@scure/bip39": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", + "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "peer": true, + "dependencies": { + "@noble/hashes": "~1.2.0", + "@scure/base": "~1.1.0" } }, - "node_modules/ganache-core/node_modules/babel-traverse/node_modules/ms": { - "version": "2.0.0", + "node_modules/eth-gas-reporter/node_modules/ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", "dev": true, - "license": "MIT" + "peer": true, + "dependencies": { + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" + } }, - "node_modules/ganache-core/node_modules/babel-types": { - "version": "6.26.0", + "node_modules/eth-gas-reporter/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", "dev": true, - "license": "MIT", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, "dependencies": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" } }, - "node_modules/ganache-core/node_modules/babel-types/node_modules/to-fast-properties": { - "version": "1.0.3", + "node_modules/ethereum-bloom-filters": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", + "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "js-sha3": "^0.8.0" } }, - "node_modules/ganache-core/node_modules/babelify": { - "version": "7.3.0", + "node_modules/ethereum-cryptography": { + "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, - "license": "MIT", "dependencies": { - "babel-core": "^6.0.14", - "object-assign": "^4.0.0" + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" } }, - "node_modules/ganache-core/node_modules/babylon": { - "version": "6.18.0", + "node_modules/ethereum-waffle": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/ethereum-waffle/-/ethereum-waffle-3.4.4.tgz", + "integrity": "sha512-PA9+jCjw4WC3Oc5ocSMBj5sXvueWQeAbvCA+hUlb6oFgwwKyq5ka3bWQ7QZcjzIX+TdFkxP4IbFmoY2D8Dkj9Q==", "dev": true, - "license": "MIT", + "dependencies": { + "@ethereum-waffle/chai": "^3.4.4", + "@ethereum-waffle/compiler": "^3.4.4", + "@ethereum-waffle/mock-contract": "^3.4.4", + "@ethereum-waffle/provider": "^3.4.4", + "ethers": "^5.0.1" + }, "bin": { - "babylon": "bin/babylon.js" + "waffle": "bin/waffle" + }, + "engines": { + "node": ">=10.0" } }, - "node_modules/ganache-core/node_modules/backoff": { - "version": "2.5.0", + "node_modules/ethereum-waffle/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", "dev": true, - "license": "MIT", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "precond": "0.2" - }, - "engines": { - "node": ">= 0.6" + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" } }, - "node_modules/ganache-core/node_modules/balanced-match": { - "version": "1.0.0", + "node_modules/ethereumjs-abi": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", + "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", "dev": true, - "license": "MIT" + "dependencies": { + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" + } }, - "node_modules/ganache-core/node_modules/base": { - "version": "0.11.2", + "node_modules/ethereumjs-abi/node_modules/@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", "dev": true, - "license": "MIT", "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" + "@types/node": "*" } }, - "node_modules/ganache-core/node_modules/base-x": { - "version": "3.0.8", + "node_modules/ethereumjs-abi/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/ethereumjs-abi/node_modules/ethereumjs-util": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", "dev": true, - "license": "MIT", "dependencies": { - "safe-buffer": "^5.0.1" + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" } }, - "node_modules/ganache-core/node_modules/base/node_modules/define-property": { - "version": "1.0.0", + "node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", "dev": true, - "license": "MIT", "dependencies": { - "is-descriptor": "^1.0.0" + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" }, "engines": { - "node": ">=0.10.0" + "node": ">=10.0.0" } }, - "node_modules/ganache-core/node_modules/base64-js": { - "version": "1.5.1", + "node_modules/ethers": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.7.1.tgz", + "integrity": "sha512-qX5kxIFMfg1i+epfgb0xF4WM7IqapIIu50pOJ17aebkxxa4BacW5jFrQRmCJpDEg2ZK2oNtR5QjrQ1WDBF29dA==", "dev": true, "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "dev": true, - "license": "BSD-3-Clause", + "peer": true, "dependencies": { - "tweetnacl": "^0.14.3" + "@adraffy/ens-normalize": "1.9.2", + "@noble/hashes": "1.1.2", + "@noble/secp256k1": "1.7.1", + "@types/node": "18.15.13", + "aes-js": "4.0.0-beta.5", + "tslib": "2.4.0", + "ws": "8.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/ganache-core/node_modules/bcrypt-pbkdf/node_modules/tweetnacl": { - "version": "0.14.5", + "node_modules/ethers/node_modules/@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==", "dev": true, - "license": "Unlicense" + "peer": true }, - "node_modules/ganache-core/node_modules/bignumber.js": { - "version": "9.0.1", + "node_modules/ethers/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": "*" - } + "peer": true }, - "node_modules/ganache-core/node_modules/bip39": { - "version": "2.5.0", + "node_modules/ethjs-unit": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", "dev": true, - "license": "ISC", "dependencies": { - "create-hash": "^1.1.0", - "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1", - "safe-buffer": "^5.0.1", - "unorm": "^1.3.3" + "bn.js": "4.11.6", + "number-to-bn": "1.7.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" } }, - "node_modules/ganache-core/node_modules/blakejs": { - "version": "1.1.0", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/ganache-core/node_modules/bluebird": { - "version": "3.7.2", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/bn.js": { - "version": "4.11.9", - "dev": true, - "license": "MIT" + "node_modules/ethjs-unit/node_modules/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", + "dev": true }, - "node_modules/ganache-core/node_modules/body-parser": { - "version": "1.19.0", + "node_modules/ethjs-util": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", + "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", "dev": true, - "license": "MIT", - "optional": true, "dependencies": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=6.5.0", + "npm": ">=3" } }, - "node_modules/ganache-core/node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, - "license": "MIT", - "optional": true, "dependencies": { - "ms": "2.0.0" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, - "node_modules/ganache-core/node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "dev": true, - "license": "MIT", - "optional": true + "engines": [ + "node >=0.6.0" + ] }, - "node_modules/ganache-core/node_modules/body-parser/node_modules/qs": { - "version": "6.7.0", + "node_modules/fast-base64-decode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz", + "integrity": "sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==", + "dev": true + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, - "license": "BSD-3-Clause", - "optional": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, "engines": { - "node": ">=0.6" + "node": ">=8.6.0" } }, - "node_modules/ganache-core/node_modules/brace-expansion": { - "version": "1.1.11", + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/ganache-core/node_modules/brorand": { - "version": "1.1.0", - "dev": true, - "license": "MIT" + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, - "node_modules/ganache-core/node_modules/browserify-aes": { - "version": "1.2.0", + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, - "license": "MIT", "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "reusify": "^1.0.4" } }, - "node_modules/ganache-core/node_modules/browserify-cipher": { - "version": "1.0.1", + "node_modules/ffjavascript": { + "version": "0.2.60", + "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.60.tgz", + "integrity": "sha512-T/9bnEL5xAZRDbQoEMf+pM9nrhK+C3JyZNmqiWub26EQorW7Jt+jR54gpqDhceA4Nj0YctPQwYnl8xa52/A26A==", "dev": true, - "license": "MIT", - "optional": true, "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" + "wasmbuilder": "0.0.16", + "wasmcurves": "0.2.2", + "web-worker": "^1.2.0" } }, - "node_modules/ganache-core/node_modules/browserify-des": { - "version": "1.0.2", + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, - "license": "MIT", - "optional": true, "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/ganache-core/node_modules/browserify-rsa": { - "version": "4.1.0", + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, - "license": "MIT", - "optional": true, "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" + "minimatch": "^5.0.1" } }, - "node_modules/ganache-core/node_modules/browserify-rsa/node_modules/bn.js": { - "version": "5.1.3", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/browserify-sign": { - "version": "4.2.1", + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "license": "ISC", - "optional": true, "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "balanced-match": "^1.0.0" } }, - "node_modules/ganache-core/node_modules/browserify-sign/node_modules/bn.js": { - "version": "5.1.3", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/browserify-sign/node_modules/readable-stream": { - "version": "3.6.0", + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, - "license": "MIT", - "optional": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">= 6" + "node": ">=10" } }, - "node_modules/ganache-core/node_modules/browserslist": { - "version": "3.2.8", + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, - "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30000844", - "electron-to-chromium": "^1.3.47" + "to-regex-range": "^5.0.1" }, - "bin": { - "browserslist": "cli.js" + "engines": { + "node": ">=8" } }, - "node_modules/ganache-core/node_modules/bs58": { - "version": "4.0.1", + "node_modules/find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", "dev": true, - "license": "MIT", + "peer": true, "dependencies": { - "base-x": "^3.0.2" + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" } }, - "node_modules/ganache-core/node_modules/bs58check": { - "version": "2.1.2", + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "license": "MIT", "dependencies": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ganache-core/node_modules/buffer": { - "version": "5.7.1", + "node_modules/find-yarn-workspace-root": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", + "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/ganache-core/node_modules/buffer-from": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/buffer-to-arraybuffer": { - "version": "0.0.5", - "dev": true, - "license": "MIT", - "optional": true + "micromatch": "^4.0.2" + } }, - "node_modules/ganache-core/node_modules/buffer-xor": { - "version": "1.0.3", + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, - "license": "MIT" + "bin": { + "flat": "cli.js" + } }, - "node_modules/ganache-core/node_modules/bufferutil": { - "version": "4.0.3", + "node_modules/flat-cache": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", + "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", "dev": true, - "hasInstallScript": true, - "license": "MIT", "dependencies": { - "node-gyp-build": "^4.2.0" + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" } }, - "node_modules/ganache-core/node_modules/bytes": { - "version": "3.1.0", + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", "dev": true, - "license": "MIT", - "optional": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], "engines": { - "node": ">= 0.8" + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/ganache-core/node_modules/bytewise": { - "version": "1.1.0", + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, - "license": "MIT", "dependencies": { - "bytewise-core": "^1.2.2", - "typewise": "^1.0.3" + "is-callable": "^1.1.3" } }, - "node_modules/ganache-core/node_modules/bytewise-core": { - "version": "1.2.3", + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "dev": true, - "license": "MIT", - "dependencies": { - "typewise-core": "^1.2" + "engines": { + "node": "*" } }, - "node_modules/ganache-core/node_modules/cache-base": { - "version": "1.0.1", + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, - "license": "MIT", "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/ganache-core/node_modules/cacheable-request": { - "version": "6.1.0", + "node_modules/fp-ts": { + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", + "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "license": "MIT", - "optional": true, "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/ganache-core/node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", + "node_modules/fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } + "peer": true }, - "node_modules/ganache-core/node_modules/cachedown": { + "node_modules/fs.realpath": { "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "abstract-leveldown": "^2.4.1", - "lru-cache": "^3.2.0" - } + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true }, - "node_modules/ganache-core/node_modules/cachedown/node_modules/abstract-leveldown": { - "version": "2.7.2", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "license": "MIT", - "dependencies": { - "xtend": "~4.0.0" + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/ganache-core/node_modules/cachedown/node_modules/lru-cache": { - "version": "3.2.0", + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, - "license": "ISC", - "dependencies": { - "pseudomap": "^1.0.1" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ganache-core/node_modules/call-bind": { - "version": "1.0.2", + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, - "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ganache-core/node_modules/caniuse-lite": { - "version": "1.0.30001174", - "dev": true, - "license": "CC-BY-4.0" - }, - "node_modules/ganache-core/node_modules/caseless": { - "version": "0.12.0", - "dev": true, - "license": "Apache-2.0" + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true }, - "node_modules/ganache-core/node_modules/chalk": { - "version": "2.4.2", + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ganache-core/node_modules/checkpoint-store": { - "version": "1.1.0", + "node_modules/ganache-core": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/ganache-core/-/ganache-core-2.13.2.tgz", + "integrity": "sha512-tIF5cR+ANQz0+3pHWxHjIwHqFXcVo0Mb+kcsNhglNFALcYo49aQpnS9dqHartqPfMFjiHh/qFoD3mYK0d/qGgw==", + "bundleDependencies": [ + "keccak" + ], + "deprecated": "ganache-core is now ganache; visit https://trfl.io/g7 for details", "dev": true, - "license": "ISC", + "hasShrinkwrap": true, "dependencies": { - "functional-red-black-tree": "^1.0.1" + "abstract-leveldown": "3.0.0", + "async": "2.6.2", + "bip39": "2.5.0", + "cachedown": "1.0.0", + "clone": "2.1.2", + "debug": "3.2.6", + "encoding-down": "5.0.4", + "eth-sig-util": "3.0.0", + "ethereumjs-abi": "0.6.8", + "ethereumjs-account": "3.0.0", + "ethereumjs-block": "2.2.2", + "ethereumjs-common": "1.5.0", + "ethereumjs-tx": "2.1.2", + "ethereumjs-util": "6.2.1", + "ethereumjs-vm": "4.2.0", + "heap": "0.2.6", + "keccak": "3.0.1", + "level-sublevel": "6.6.4", + "levelup": "3.1.1", + "lodash": "4.17.20", + "lru-cache": "5.1.1", + "merkle-patricia-tree": "3.0.0", + "patch-package": "6.2.2", + "seedrandom": "3.0.1", + "source-map-support": "0.5.12", + "tmp": "0.1.0", + "web3-provider-engine": "14.2.1", + "websocket": "1.0.32" + }, + "engines": { + "node": ">=8.9.0" + }, + "optionalDependencies": { + "ethereumjs-wallet": "0.6.5", + "web3": "1.2.11" } }, - "node_modules/ganache-core/node_modules/chownr": { - "version": "1.1.4", - "dev": true, - "license": "ISC", - "optional": true - }, - "node_modules/ganache-core/node_modules/ci-info": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/cids": { - "version": "0.7.5", + "node_modules/ganache-core/node_modules/@ethersproject/abi": { + "version": "5.0.0-beta.153", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "buffer": "^5.5.0", - "class-is": "^1.1.0", - "multibase": "~0.6.0", - "multicodec": "^1.0.0", - "multihashes": "~0.4.15" - }, - "engines": { - "node": ">=4.0.0", - "npm": ">=3.0.0" + "@ethersproject/address": ">=5.0.0-beta.128", + "@ethersproject/bignumber": ">=5.0.0-beta.130", + "@ethersproject/bytes": ">=5.0.0-beta.129", + "@ethersproject/constants": ">=5.0.0-beta.128", + "@ethersproject/hash": ">=5.0.0-beta.128", + "@ethersproject/keccak256": ">=5.0.0-beta.127", + "@ethersproject/logger": ">=5.0.0-beta.129", + "@ethersproject/properties": ">=5.0.0-beta.131", + "@ethersproject/strings": ">=5.0.0-beta.130" } }, - "node_modules/ganache-core/node_modules/cids/node_modules/multicodec": { - "version": "1.0.4", + "node_modules/ganache-core/node_modules/@ethersproject/abstract-provider": { + "version": "5.0.8", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", "optional": true, "dependencies": { - "buffer": "^5.6.0", - "varint": "^5.0.0" + "@ethersproject/bignumber": "^5.0.13", + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/logger": "^5.0.8", + "@ethersproject/networks": "^5.0.7", + "@ethersproject/properties": "^5.0.7", + "@ethersproject/transactions": "^5.0.9", + "@ethersproject/web": "^5.0.12" } }, - "node_modules/ganache-core/node_modules/cipher-base": { - "version": "1.0.4", + "node_modules/ganache-core/node_modules/@ethersproject/abstract-signer": { + "version": "5.0.10", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", + "optional": true, "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "@ethersproject/abstract-provider": "^5.0.8", + "@ethersproject/bignumber": "^5.0.13", + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/logger": "^5.0.8", + "@ethersproject/properties": "^5.0.7" } }, - "node_modules/ganache-core/node_modules/class-is": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/class-utils": { - "version": "0.3.6", + "node_modules/ganache-core/node_modules/@ethersproject/address": { + "version": "5.0.9", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", + "optional": true, "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" + "@ethersproject/bignumber": "^5.0.13", + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/keccak256": "^5.0.7", + "@ethersproject/logger": "^5.0.8", + "@ethersproject/rlp": "^5.0.7" } }, - "node_modules/ganache-core/node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", + "node_modules/ganache-core/node_modules/@ethersproject/base64": { + "version": "5.0.7", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", + "optional": true, "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" + "@ethersproject/bytes": "^5.0.9" } }, - "node_modules/ganache-core/node_modules/class-utils/node_modules/is-accessor-descriptor": { - "version": "0.1.6", + "node_modules/ganache-core/node_modules/@ethersproject/bignumber": { + "version": "5.0.13", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", + "optional": true, "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/logger": "^5.0.8", + "bn.js": "^4.4.0" } }, - "node_modules/ganache-core/node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", + "node_modules/ganache-core/node_modules/@ethersproject/bytes": { + "version": "5.0.9", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", + "optional": true, "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" + "@ethersproject/logger": "^5.0.8" } }, - "node_modules/ganache-core/node_modules/class-utils/node_modules/is-buffer": { - "version": "1.1.6", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/class-utils/node_modules/is-data-descriptor": { - "version": "0.1.4", + "node_modules/ganache-core/node_modules/@ethersproject/constants": { + "version": "5.0.8", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", + "optional": true, "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" + "@ethersproject/bignumber": "^5.0.13" } }, - "node_modules/ganache-core/node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", + "node_modules/ganache-core/node_modules/@ethersproject/hash": { + "version": "5.0.10", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", + "optional": true, "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" + "@ethersproject/abstract-signer": "^5.0.10", + "@ethersproject/address": "^5.0.9", + "@ethersproject/bignumber": "^5.0.13", + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/keccak256": "^5.0.7", + "@ethersproject/logger": "^5.0.8", + "@ethersproject/properties": "^5.0.7", + "@ethersproject/strings": "^5.0.8" } }, - "node_modules/ganache-core/node_modules/class-utils/node_modules/is-descriptor": { - "version": "0.1.6", + "node_modules/ganache-core/node_modules/@ethersproject/keccak256": { + "version": "5.0.7", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" + "optional": true, + "dependencies": { + "@ethersproject/bytes": "^5.0.9", + "js-sha3": "0.5.7" } }, - "node_modules/ganache-core/node_modules/class-utils/node_modules/kind-of": { - "version": "5.1.0", + "node_modules/ganache-core/node_modules/@ethersproject/logger": { + "version": "5.0.8", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "optional": true }, - "node_modules/ganache-core/node_modules/clone": { - "version": "2.1.2", + "node_modules/ganache-core/node_modules/@ethersproject/networks": { + "version": "5.0.7", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", - "engines": { - "node": ">=0.8" + "optional": true, + "dependencies": { + "@ethersproject/logger": "^5.0.8" } }, - "node_modules/ganache-core/node_modules/clone-response": { - "version": "1.0.2", + "node_modules/ganache-core/node_modules/@ethersproject/properties": { + "version": "5.0.7", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", "optional": true, "dependencies": { - "mimic-response": "^1.0.0" + "@ethersproject/logger": "^5.0.8" } }, - "node_modules/ganache-core/node_modules/collection-visit": { - "version": "1.0.0", + "node_modules/ganache-core/node_modules/@ethersproject/rlp": { + "version": "5.0.7", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", + "optional": true, "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/logger": "^5.0.8" } }, - "node_modules/ganache-core/node_modules/color-convert": { - "version": "1.9.3", + "node_modules/ganache-core/node_modules/@ethersproject/signing-key": { + "version": "5.0.8", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", + "optional": true, "dependencies": { - "color-name": "1.1.3" + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/logger": "^5.0.8", + "@ethersproject/properties": "^5.0.7", + "elliptic": "6.5.3" } }, - "node_modules/ganache-core/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/combined-stream": { - "version": "1.0.8", + "node_modules/ganache-core/node_modules/@ethersproject/strings": { + "version": "5.0.8", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", + "optional": true, "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/constants": "^5.0.8", + "@ethersproject/logger": "^5.0.8" } }, - "node_modules/ganache-core/node_modules/component-emitter": { - "version": "1.3.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/concat-stream": { - "version": "1.6.2", + "node_modules/ganache-core/node_modules/@ethersproject/transactions": { + "version": "5.0.9", "dev": true, - "engines": [ - "node >= 0.8" + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } ], "license": "MIT", + "optional": true, "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "@ethersproject/address": "^5.0.9", + "@ethersproject/bignumber": "^5.0.13", + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/constants": "^5.0.8", + "@ethersproject/keccak256": "^5.0.7", + "@ethersproject/logger": "^5.0.8", + "@ethersproject/properties": "^5.0.7", + "@ethersproject/rlp": "^5.0.7", + "@ethersproject/signing-key": "^5.0.8" } }, - "node_modules/ganache-core/node_modules/content-disposition": { - "version": "0.5.3", + "node_modules/ganache-core/node_modules/@ethersproject/web": { + "version": "5.0.12", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", "optional": true, "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.6" + "@ethersproject/base64": "^5.0.7", + "@ethersproject/bytes": "^5.0.9", + "@ethersproject/logger": "^5.0.8", + "@ethersproject/properties": "^5.0.7", + "@ethersproject/strings": "^5.0.8" } }, - "node_modules/ganache-core/node_modules/content-disposition/node_modules/safe-buffer": { - "version": "5.1.2", + "node_modules/ganache-core/node_modules/@sindresorhus/is": { + "version": "0.14.0", "dev": true, "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/content-hash": { - "version": "2.5.2", - "dev": true, - "license": "ISC", "optional": true, - "dependencies": { - "cids": "^0.7.1", - "multicodec": "^0.5.5", - "multihashes": "^0.4.15" + "engines": { + "node": ">=6" } }, - "node_modules/ganache-core/node_modules/content-type": { - "version": "1.0.4", + "node_modules/ganache-core/node_modules/@szmarczak/http-timer": { + "version": "1.1.2", "dev": true, "license": "MIT", "optional": true, + "dependencies": { + "defer-to-connect": "^1.0.1" + }, "engines": { - "node": ">= 0.6" + "node": ">=6" } }, - "node_modules/ganache-core/node_modules/convert-source-map": { - "version": "1.7.0", + "node_modules/ganache-core/node_modules/@types/bn.js": { + "version": "4.11.6", "dev": true, "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.1" + "@types/node": "*" } }, - "node_modules/ganache-core/node_modules/convert-source-map/node_modules/safe-buffer": { - "version": "5.1.2", + "node_modules/ganache-core/node_modules/@types/node": { + "version": "14.14.20", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/cookie": { - "version": "0.4.0", + "node_modules/ganache-core/node_modules/@types/pbkdf2": { + "version": "3.1.0", "dev": true, "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6" + "dependencies": { + "@types/node": "*" } }, - "node_modules/ganache-core/node_modules/cookie-signature": { - "version": "1.0.6", + "node_modules/ganache-core/node_modules/@types/secp256k1": { + "version": "4.0.1", "dev": true, "license": "MIT", - "optional": true + "dependencies": { + "@types/node": "*" + } }, - "node_modules/ganache-core/node_modules/cookiejar": { - "version": "2.1.2", + "node_modules/ganache-core/node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/ganache-core/node_modules/abstract-leveldown": { + "version": "3.0.0", "dev": true, "license": "MIT", - "optional": true + "dependencies": { + "xtend": "~4.0.0" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/ganache-core/node_modules/copy-descriptor": { - "version": "0.1.1", + "node_modules/ganache-core/node_modules/accepts": { + "version": "1.3.7", "dev": true, "license": "MIT", + "optional": true, + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/ganache-core/node_modules/core-js": { - "version": "2.6.12", + "node_modules/ganache-core/node_modules/aes-js": { + "version": "3.1.2", "dev": true, - "hasInstallScript": true, - "license": "MIT" + "license": "MIT", + "optional": true }, - "node_modules/ganache-core/node_modules/core-js-pure": { - "version": "3.8.2", + "node_modules/ganache-core/node_modules/ajv": { + "version": "6.12.6", "dev": true, - "hasInstallScript": true, "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ganache-core/node_modules/core-util-is": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/cors": { - "version": "2.8.5", + "node_modules/ganache-core/node_modules/ansi-styles": { + "version": "3.2.1", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "object-assign": "^4", - "vary": "^1" + "color-convert": "^1.9.0" }, "engines": { - "node": ">= 0.10" + "node": ">=4" } }, - "node_modules/ganache-core/node_modules/create-ecdh": { - "version": "4.0.4", + "node_modules/ganache-core/node_modules/arr-diff": { + "version": "4.0.0", "dev": true, "license": "MIT", - "optional": true, - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/create-hash": { - "version": "1.2.0", + "node_modules/ganache-core/node_modules/arr-flatten": { + "version": "1.1.0", "dev": true, "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/create-hmac": { - "version": "1.1.7", + "node_modules/ganache-core/node_modules/arr-union": { + "version": "3.1.0", "dev": true, "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/cross-fetch": { - "version": "2.2.3", + "node_modules/ganache-core/node_modules/array-flatten": { + "version": "1.1.1", "dev": true, "license": "MIT", - "dependencies": { - "node-fetch": "2.1.2", - "whatwg-fetch": "2.0.4" - } + "optional": true }, - "node_modules/ganache-core/node_modules/crypto-browserify": { - "version": "3.12.0", + "node_modules/ganache-core/node_modules/array-unique": { + "version": "0.3.2", "dev": true, "license": "MIT", - "optional": true, - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, "engines": { - "node": "*" + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/d": { - "version": "1.0.1", + "node_modules/ganache-core/node_modules/asn1": { + "version": "0.2.4", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" + "safer-buffer": "~2.1.0" } }, - "node_modules/ganache-core/node_modules/dashdash": { - "version": "1.14.1", + "node_modules/ganache-core/node_modules/asn1.js": { + "version": "5.4.1", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" } }, - "node_modules/ganache-core/node_modules/debug": { - "version": "3.2.6", + "node_modules/ganache-core/node_modules/assert-plus": { + "version": "1.0.0", "dev": true, "license": "MIT", - "dependencies": { - "ms": "^2.1.1" + "engines": { + "node": ">=0.8" } }, - "node_modules/ganache-core/node_modules/decode-uri-component": { - "version": "0.2.0", + "node_modules/ganache-core/node_modules/assign-symbols": { + "version": "1.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10" + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/decompress-response": { - "version": "3.3.0", + "node_modules/ganache-core/node_modules/async": { + "version": "2.6.2", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" + "lodash": "^4.17.11" } }, - "node_modules/ganache-core/node_modules/deep-equal": { - "version": "1.1.1", + "node_modules/ganache-core/node_modules/async-eventemitter": { + "version": "0.2.4", "dev": true, "license": "MIT", "dependencies": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "async": "^2.4.0" } }, - "node_modules/ganache-core/node_modules/defer-to-connect": { - "version": "1.1.3", + "node_modules/ganache-core/node_modules/async-limiter": { + "version": "1.0.1", "dev": true, - "license": "MIT", - "optional": true + "license": "MIT" }, - "node_modules/ganache-core/node_modules/deferred-leveldown": { - "version": "4.0.2", + "node_modules/ganache-core/node_modules/asynckit": { + "version": "0.4.0", "dev": true, - "license": "MIT", - "dependencies": { - "abstract-leveldown": "~5.0.0", - "inherits": "^2.0.3" + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/atob": { + "version": "2.1.2", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "bin": { + "atob": "bin/atob.js" }, "engines": { - "node": ">=6" + "node": ">= 4.5.0" } }, - "node_modules/ganache-core/node_modules/deferred-leveldown/node_modules/abstract-leveldown": { - "version": "5.0.0", + "node_modules/ganache-core/node_modules/aws-sign2": { + "version": "0.7.0", "dev": true, - "license": "MIT", - "dependencies": { - "xtend": "~4.0.0" - }, + "license": "Apache-2.0", "engines": { - "node": ">=6" + "node": "*" } }, - "node_modules/ganache-core/node_modules/define-properties": { - "version": "1.1.3", + "node_modules/ganache-core/node_modules/aws4": { + "version": "1.11.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/babel-code-frame": { + "version": "6.26.0", "dev": true, "license": "MIT", "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" } }, - "node_modules/ganache-core/node_modules/define-property": { - "version": "2.0.2", + "node_modules/ganache-core/node_modules/babel-code-frame/node_modules/ansi-regex": { + "version": "2.1.1", "dev": true, "license": "MIT", - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/defined": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/delayed-stream": { - "version": "1.0.0", + "node_modules/ganache-core/node_modules/babel-code-frame/node_modules/ansi-styles": { + "version": "2.2.1", "dev": true, "license": "MIT", "engines": { - "node": ">=0.4.0" + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/depd": { - "version": "1.1.2", + "node_modules/ganache-core/node_modules/babel-code-frame/node_modules/chalk": { + "version": "1.1.3", "dev": true, "license": "MIT", - "optional": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/des.js": { - "version": "1.0.1", + "node_modules/ganache-core/node_modules/babel-code-frame/node_modules/js-tokens": { + "version": "3.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/babel-code-frame/node_modules/strip-ansi": { + "version": "3.0.1", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/destroy": { - "version": "1.0.4", + "node_modules/ganache-core/node_modules/babel-code-frame/node_modules/supports-color": { + "version": "2.0.0", "dev": true, "license": "MIT", - "optional": true + "engines": { + "node": ">=0.8.0" + } }, - "node_modules/ganache-core/node_modules/detect-indent": { - "version": "4.0.0", + "node_modules/ganache-core/node_modules/babel-core": { + "version": "6.26.3", "dev": true, "license": "MIT", "dependencies": { - "repeating": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" } }, - "node_modules/ganache-core/node_modules/diffie-hellman": { - "version": "5.0.3", + "node_modules/ganache-core/node_modules/babel-core/node_modules/debug": { + "version": "2.6.9", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" + "ms": "2.0.0" } }, - "node_modules/ganache-core/node_modules/dom-walk": { - "version": "0.1.2", - "dev": true - }, - "node_modules/ganache-core/node_modules/dotignore": { - "version": "0.1.2", + "node_modules/ganache-core/node_modules/babel-core/node_modules/json5": { + "version": "0.5.1", "dev": true, "license": "MIT", - "dependencies": { - "minimatch": "^3.0.4" - }, "bin": { - "ignored": "bin/ignored" + "json5": "lib/cli.js" } }, - "node_modules/ganache-core/node_modules/duplexer3": { - "version": "0.1.4", + "node_modules/ganache-core/node_modules/babel-core/node_modules/ms": { + "version": "2.0.0", "dev": true, - "license": "BSD-3-Clause", - "optional": true + "license": "MIT" }, - "node_modules/ganache-core/node_modules/ecc-jsbn": { - "version": "0.1.2", + "node_modules/ganache-core/node_modules/babel-core/node_modules/slash": { + "version": "1.0.0", "dev": true, "license": "MIT", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/ee-first": { - "version": "1.1.1", + "node_modules/ganache-core/node_modules/babel-generator": { + "version": "6.26.1", "dev": true, "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/electron-to-chromium": { - "version": "1.3.636", - "dev": true, - "license": "ISC" + "dependencies": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + } }, - "node_modules/ganache-core/node_modules/elliptic": { - "version": "6.5.3", + "node_modules/ganache-core/node_modules/babel-generator/node_modules/jsesc": { + "version": "1.3.0", "dev": true, "license": "MIT", - "dependencies": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "bin": { + "jsesc": "bin/jsesc" } }, - "node_modules/ganache-core/node_modules/encodeurl": { - "version": "1.0.2", + "node_modules/ganache-core/node_modules/babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", "dev": true, "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.8" + "dependencies": { + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, - "node_modules/ganache-core/node_modules/encoding": { - "version": "0.1.13", + "node_modules/ganache-core/node_modules/babel-helper-call-delegate": { + "version": "6.24.1", "dev": true, "license": "MIT", "dependencies": { - "iconv-lite": "^0.6.2" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, - "node_modules/ganache-core/node_modules/encoding-down": { - "version": "5.0.4", + "node_modules/ganache-core/node_modules/babel-helper-define-map": { + "version": "6.26.0", "dev": true, "license": "MIT", "dependencies": { - "abstract-leveldown": "^5.0.0", - "inherits": "^2.0.3", - "level-codec": "^9.0.0", - "level-errors": "^2.0.0", - "xtend": "^4.0.1" - }, - "engines": { - "node": ">=6" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, - "node_modules/ganache-core/node_modules/encoding-down/node_modules/abstract-leveldown": { - "version": "5.0.0", + "node_modules/ganache-core/node_modules/babel-helper-explode-assignable-expression": { + "version": "6.24.1", "dev": true, "license": "MIT", "dependencies": { - "xtend": "~4.0.0" - }, - "engines": { - "node": ">=6" + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, - "node_modules/ganache-core/node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.2", + "node_modules/ganache-core/node_modules/babel-helper-function-name": { + "version": "6.24.1", "dev": true, "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, - "node_modules/ganache-core/node_modules/end-of-stream": { - "version": "1.4.4", + "node_modules/ganache-core/node_modules/babel-helper-get-function-arity": { + "version": "6.24.1", "dev": true, "license": "MIT", "dependencies": { - "once": "^1.4.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, - "node_modules/ganache-core/node_modules/errno": { - "version": "0.1.8", + "node_modules/ganache-core/node_modules/babel-helper-hoist-variables": { + "version": "6.24.1", "dev": true, "license": "MIT", "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, - "node_modules/ganache-core/node_modules/es-abstract": { - "version": "1.18.0-next.1", + "node_modules/ganache-core/node_modules/babel-helper-optimise-call-expression": { + "version": "6.24.1", "dev": true, "license": "MIT", "dependencies": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, - "node_modules/ganache-core/node_modules/es-to-primitive": { - "version": "1.2.1", + "node_modules/ganache-core/node_modules/babel-helper-regex": { + "version": "6.26.0", "dev": true, "license": "MIT", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, - "node_modules/ganache-core/node_modules/es5-ext": { - "version": "0.10.53", + "node_modules/ganache-core/node_modules/babel-helper-remap-async-to-generator": { + "version": "6.24.1", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, - "node_modules/ganache-core/node_modules/es6-iterator": { - "version": "2.0.3", + "node_modules/ganache-core/node_modules/babel-helper-replace-supers": { + "version": "6.24.1", "dev": true, "license": "MIT", "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, - "node_modules/ganache-core/node_modules/es6-symbol": { - "version": "3.1.3", + "node_modules/ganache-core/node_modules/babel-helpers": { + "version": "6.24.1", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, - "node_modules/ganache-core/node_modules/escape-html": { - "version": "1.0.3", + "node_modules/ganache-core/node_modules/babel-messages": { + "version": "6.23.0", "dev": true, "license": "MIT", - "optional": true + "dependencies": { + "babel-runtime": "^6.22.0" + } }, - "node_modules/ganache-core/node_modules/escape-string-regexp": { - "version": "1.0.5", + "node_modules/ganache-core/node_modules/babel-plugin-check-es2015-constants": { + "version": "6.22.0", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.8.0" + "dependencies": { + "babel-runtime": "^6.22.0" } }, - "node_modules/ganache-core/node_modules/esutils": { - "version": "2.0.3", + "node_modules/ganache-core/node_modules/babel-plugin-syntax-async-functions": { + "version": "6.13.0", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/ganache-core/node_modules/etag": { - "version": "1.8.1", + "node_modules/ganache-core/node_modules/babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6" - } + "license": "MIT" }, - "node_modules/ganache-core/node_modules/eth-block-tracker": { - "version": "3.0.1", + "node_modules/ganache-core/node_modules/babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/babel-plugin-transform-async-to-generator": { + "version": "6.24.1", "dev": true, "license": "MIT", "dependencies": { - "eth-query": "^2.1.0", - "ethereumjs-tx": "^1.3.3", - "ethereumjs-util": "^5.1.3", - "ethjs-util": "^0.1.3", - "json-rpc-engine": "^3.6.0", - "pify": "^2.3.0", - "tape": "^4.6.3" + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" } }, - "node_modules/ganache-core/node_modules/eth-block-tracker/node_modules/ethereumjs-tx": { - "version": "1.3.7", + "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", "dev": true, - "license": "MPL-2.0", + "license": "MIT", "dependencies": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" + "babel-runtime": "^6.22.0" } }, - "node_modules/ganache-core/node_modules/eth-block-tracker/node_modules/ethereumjs-util": { - "version": "5.2.1", + "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", "dev": true, - "license": "MPL-2.0", + "license": "MIT", "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" + "babel-runtime": "^6.22.0" } }, - "node_modules/ganache-core/node_modules/eth-block-tracker/node_modules/pify": { - "version": "2.3.0", + "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, - "node_modules/ganache-core/node_modules/eth-ens-namehash": { - "version": "2.0.8", + "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-classes": { + "version": "6.24.1", "dev": true, - "license": "ISC", - "optional": true, + "license": "MIT", "dependencies": { - "idna-uts46-hx": "^2.3.1", - "js-sha3": "^0.5.7" + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, - "node_modules/ganache-core/node_modules/eth-json-rpc-infura": { - "version": "3.2.1", + "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "cross-fetch": "^2.1.1", - "eth-json-rpc-middleware": "^1.5.0", - "json-rpc-engine": "^3.4.0", - "json-rpc-error": "^2.0.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware": { - "version": "1.6.0", + "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "async": "^2.5.0", - "eth-query": "^2.1.2", - "eth-tx-summary": "^3.1.2", - "ethereumjs-block": "^1.6.0", - "ethereumjs-tx": "^1.3.3", - "ethereumjs-util": "^5.1.2", - "ethereumjs-vm": "^2.1.0", - "fetch-ponyfill": "^4.0.0", - "json-rpc-engine": "^3.6.0", - "json-rpc-error": "^2.0.0", - "json-stable-stringify": "^1.0.1", - "promise-to-callback": "^1.0.0", - "tape": "^4.6.3" + "babel-runtime": "^6.22.0" } }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/abstract-leveldown": { - "version": "2.6.3", + "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", "dev": true, "license": "MIT", "dependencies": { - "xtend": "~4.0.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/deferred-leveldown": { - "version": "1.2.2", + "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", "dev": true, "license": "MIT", "dependencies": { - "abstract-leveldown": "~2.6.0" + "babel-runtime": "^6.22.0" } }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-account": { - "version": "2.0.5", + "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", "dev": true, - "license": "MPL-2.0", + "license": "MIT", "dependencies": { - "ethereumjs-util": "^5.0.0", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-block": { - "version": "1.7.1", + "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-literals": { + "version": "6.22.0", "dev": true, - "license": "MPL-2.0", + "license": "MIT", "dependencies": { - "async": "^2.0.1", - "ethereum-common": "0.2.0", - "ethereumjs-tx": "^1.2.2", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" + "babel-runtime": "^6.22.0" } }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-block/node_modules/ethereum-common": { - "version": "0.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-tx": { - "version": "1.3.7", + "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", "dev": true, - "license": "MPL-2.0", + "license": "MIT", "dependencies": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-util": { - "version": "5.2.1", + "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", "dev": true, - "license": "MPL-2.0", + "license": "MIT", "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" } }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-vm": { - "version": "2.6.0", + "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", "dev": true, - "license": "MPL-2.0", + "license": "MIT", "dependencies": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "ethereumjs-account": "^2.0.3", - "ethereumjs-block": "~2.2.0", - "ethereumjs-common": "^1.1.0", - "ethereumjs-util": "^6.0.0", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.3.2", - "rustbn.js": "~0.2.0", - "safe-buffer": "^5.1.1" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-vm/node_modules/ethereumjs-block": { - "version": "2.2.2", + "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", "dev": true, - "license": "MPL-2.0", + "license": "MIT", "dependencies": { - "async": "^2.0.1", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.1", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-vm/node_modules/ethereumjs-block/node_modules/ethereumjs-util": { - "version": "5.2.1", + "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", "dev": true, - "license": "MPL-2.0", + "license": "MIT", "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" } }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-vm/node_modules/ethereumjs-tx": { - "version": "2.1.2", + "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", "dev": true, - "license": "MPL-2.0", + "license": "MIT", "dependencies": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-vm/node_modules/ethereumjs-util": { - "version": "6.2.1", + "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", "dev": true, - "license": "MPL-2.0", + "license": "MIT", "dependencies": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/isarray": { - "version": "0.0.1", + "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-spread": { + "version": "6.22.0", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.22.0" + } }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-codec": { - "version": "7.0.1", + "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-errors": { - "version": "1.0.5", + "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", "dev": true, "license": "MIT", "dependencies": { - "errno": "~0.1.1" + "babel-runtime": "^6.22.0" } }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-iterator-stream": { - "version": "1.3.1", + "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", "dev": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" + "babel-runtime": "^6.22.0" } }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-iterator-stream/node_modules/readable-stream": { - "version": "1.1.14", + "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", "dev": true, "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" } }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-ws": { - "version": "0.0.0", + "node_modules/ganache-core/node_modules/babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", "dev": true, "license": "MIT", "dependencies": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" } }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-ws/node_modules/readable-stream": { - "version": "1.0.34", + "node_modules/ganache-core/node_modules/babel-plugin-transform-regenerator": { + "version": "6.26.0", "dev": true, "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "regenerator-transform": "^0.10.0" } }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-ws/node_modules/xtend": { - "version": "2.1.2", + "node_modules/ganache-core/node_modules/babel-plugin-transform-strict-mode": { + "version": "6.24.1", "dev": true, + "license": "MIT", "dependencies": { - "object-keys": "~0.4.0" - }, - "engines": { - "node": ">=0.4" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/levelup": { - "version": "1.3.9", + "node_modules/ganache-core/node_modules/babel-preset-env": { + "version": "1.7.0", "dev": true, "license": "MIT", "dependencies": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-to-generator": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.23.0", + "babel-plugin-transform-es2015-classes": "^6.23.0", + "babel-plugin-transform-es2015-computed-properties": "^6.22.0", + "babel-plugin-transform-es2015-destructuring": "^6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", + "babel-plugin-transform-es2015-for-of": "^6.23.0", + "babel-plugin-transform-es2015-function-name": "^6.22.0", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.22.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-umd": "^6.23.0", + "babel-plugin-transform-es2015-object-super": "^6.22.0", + "babel-plugin-transform-es2015-parameters": "^6.23.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", + "babel-plugin-transform-exponentiation-operator": "^6.22.0", + "babel-plugin-transform-regenerator": "^6.22.0", + "browserslist": "^3.2.6", + "invariant": "^2.2.2", + "semver": "^5.3.0" } }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ltgt": { - "version": "2.2.1", + "node_modules/ganache-core/node_modules/babel-preset-env/node_modules/semver": { + "version": "5.7.1", "dev": true, - "license": "MIT" + "license": "ISC", + "bin": { + "semver": "bin/semver" + } }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/memdown": { - "version": "1.4.1", + "node_modules/ganache-core/node_modules/babel-register": { + "version": "6.26.0", "dev": true, "license": "MIT", "dependencies": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" } }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/memdown/node_modules/abstract-leveldown": { - "version": "2.7.2", + "node_modules/ganache-core/node_modules/babel-register/node_modules/source-map-support": { + "version": "0.4.18", "dev": true, "license": "MIT", "dependencies": { - "xtend": "~4.0.0" + "source-map": "^0.5.6" } }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/merkle-patricia-tree": { - "version": "2.3.2", + "node_modules/ganache-core/node_modules/babel-runtime": { + "version": "6.26.0", "dev": true, - "license": "MPL-2.0", + "license": "MIT", "dependencies": { - "async": "^1.4.2", - "ethereumjs-util": "^5.0.0", - "level-ws": "0.0.0", - "levelup": "^1.2.1", - "memdown": "^1.0.0", - "readable-stream": "^2.0.0", - "rlp": "^2.0.0", - "semaphore": ">=1.0.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/merkle-patricia-tree/node_modules/async": { - "version": "1.5.2", + "node_modules/ganache-core/node_modules/babel-template": { + "version": "6.26.0", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/object-keys": { - "version": "0.4.0", + "node_modules/ganache-core/node_modules/babel-traverse": { + "version": "6.26.0", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/safe-buffer": { - "version": "5.1.2", + "node_modules/ganache-core/node_modules/babel-traverse/node_modules/debug": { + "version": "2.6.9", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/semver": { - "version": "5.4.1", + "node_modules/ganache-core/node_modules/babel-traverse/node_modules/globals": { + "version": "9.18.0", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/string_decoder": { - "version": "0.10.31", + "node_modules/ganache-core/node_modules/babel-traverse/node_modules/ms": { + "version": "2.0.0", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/eth-lib": { - "version": "0.1.29", + "node_modules/ganache-core/node_modules/babel-types": { + "version": "6.26.0", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "nano-json-stream-parser": "^0.1.2", - "servify": "^0.1.12", - "ws": "^3.0.0", - "xhr-request-promise": "^0.1.2" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" } }, - "node_modules/ganache-core/node_modules/eth-query": { - "version": "2.1.2", + "node_modules/ganache-core/node_modules/babel-types/node_modules/to-fast-properties": { + "version": "1.0.3", "dev": true, - "license": "ISC", - "dependencies": { - "json-rpc-random-id": "^1.0.0", - "xtend": "^4.0.1" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/eth-sig-util": { - "version": "3.0.0", + "node_modules/ganache-core/node_modules/babelify": { + "version": "7.3.0", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "buffer": "^5.2.1", - "elliptic": "^6.4.0", - "ethereumjs-abi": "0.6.5", - "ethereumjs-util": "^5.1.1", - "tweetnacl": "^1.0.0", - "tweetnacl-util": "^0.15.0" + "babel-core": "^6.0.14", + "object-assign": "^4.0.0" } }, - "node_modules/ganache-core/node_modules/eth-sig-util/node_modules/ethereumjs-abi": { - "version": "0.6.5", + "node_modules/ganache-core/node_modules/babylon": { + "version": "6.18.0", "dev": true, "license": "MIT", - "dependencies": { - "bn.js": "^4.10.0", - "ethereumjs-util": "^4.3.0" + "bin": { + "babylon": "bin/babylon.js" } }, - "node_modules/ganache-core/node_modules/eth-sig-util/node_modules/ethereumjs-abi/node_modules/ethereumjs-util": { - "version": "4.5.1", + "node_modules/ganache-core/node_modules/backoff": { + "version": "2.5.0", "dev": true, - "license": "MPL-2.0", + "license": "MIT", "dependencies": { - "bn.js": "^4.8.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.0.0" + "precond": "0.2" + }, + "engines": { + "node": ">= 0.6" } }, - "node_modules/ganache-core/node_modules/eth-sig-util/node_modules/ethereumjs-util": { - "version": "5.2.1", + "node_modules/ganache-core/node_modules/balanced-match": { + "version": "1.0.0", "dev": true, - "license": "MPL-2.0", - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } + "license": "MIT" }, - "node_modules/ganache-core/node_modules/eth-tx-summary": { - "version": "3.2.4", + "node_modules/ganache-core/node_modules/base": { + "version": "0.11.2", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "async": "^2.1.2", - "clone": "^2.0.0", - "concat-stream": "^1.5.1", - "end-of-stream": "^1.1.0", - "eth-query": "^2.0.2", - "ethereumjs-block": "^1.4.1", - "ethereumjs-tx": "^1.1.1", - "ethereumjs-util": "^5.0.1", - "ethereumjs-vm": "^2.6.0", - "through2": "^2.0.3" + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/abstract-leveldown": { - "version": "2.6.3", + "node_modules/ganache-core/node_modules/base-x": { + "version": "3.0.8", "dev": true, "license": "MIT", "dependencies": { - "xtend": "~4.0.0" + "safe-buffer": "^5.0.1" } }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/deferred-leveldown": { - "version": "1.2.2", + "node_modules/ganache-core/node_modules/base/node_modules/define-property": { + "version": "1.0.0", "dev": true, "license": "MIT", "dependencies": { - "abstract-leveldown": "~2.6.0" + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-account": { - "version": "2.0.5", + "node_modules/ganache-core/node_modules/base64-js": { + "version": "1.5.1", "dev": true, - "license": "MPL-2.0", - "dependencies": { - "ethereumjs-util": "^5.0.0", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-block": { - "version": "1.7.1", + "node_modules/ganache-core/node_modules/bcrypt-pbkdf": { + "version": "1.0.2", "dev": true, - "license": "MPL-2.0", + "license": "BSD-3-Clause", "dependencies": { - "async": "^2.0.1", - "ethereum-common": "0.2.0", - "ethereumjs-tx": "^1.2.2", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" + "tweetnacl": "^0.14.3" } }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-block/node_modules/ethereum-common": { - "version": "0.2.0", + "node_modules/ganache-core/node_modules/bcrypt-pbkdf/node_modules/tweetnacl": { + "version": "0.14.5", "dev": true, - "license": "MIT" + "license": "Unlicense" }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-tx": { - "version": "1.3.7", + "node_modules/ganache-core/node_modules/bignumber.js": { + "version": "9.0.1", "dev": true, - "license": "MPL-2.0", - "dependencies": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" + "license": "MIT", + "optional": true, + "engines": { + "node": "*" } }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-util": { - "version": "5.2.1", + "node_modules/ganache-core/node_modules/bip39": { + "version": "2.5.0", "dev": true, - "license": "MPL-2.0", + "license": "ISC", "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" + "create-hash": "^1.1.0", + "pbkdf2": "^3.0.9", + "randombytes": "^2.0.1", + "safe-buffer": "^5.0.1", + "unorm": "^1.3.3" } }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-vm": { - "version": "2.6.0", + "node_modules/ganache-core/node_modules/blakejs": { + "version": "1.1.0", "dev": true, - "license": "MPL-2.0", - "dependencies": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "ethereumjs-account": "^2.0.3", - "ethereumjs-block": "~2.2.0", - "ethereumjs-common": "^1.1.0", - "ethereumjs-util": "^6.0.0", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.3.2", - "rustbn.js": "~0.2.0", - "safe-buffer": "^5.1.1" - } + "license": "CC0-1.0" }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-vm/node_modules/ethereumjs-block": { - "version": "2.2.2", + "node_modules/ganache-core/node_modules/bluebird": { + "version": "3.7.2", "dev": true, - "license": "MPL-2.0", + "license": "MIT", + "optional": true + }, + "node_modules/ganache-core/node_modules/bn.js": { + "version": "4.11.9", + "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/body-parser": { + "version": "1.19.0", + "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "async": "^2.0.1", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.1", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-vm/node_modules/ethereumjs-block/node_modules/ethereumjs-util": { - "version": "5.2.1", + "node_modules/ganache-core/node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", "dev": true, - "license": "MPL-2.0", + "license": "MIT", + "optional": true, "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" + "ms": "2.0.0" } }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-vm/node_modules/ethereumjs-tx": { - "version": "2.1.2", + "node_modules/ganache-core/node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", "dev": true, - "license": "MPL-2.0", - "dependencies": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" + "license": "MIT", + "optional": true + }, + "node_modules/ganache-core/node_modules/body-parser/node_modules/qs": { + "version": "6.7.0", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.6" } }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-vm/node_modules/ethereumjs-util": { - "version": "6.2.1", + "node_modules/ganache-core/node_modules/brace-expansion": { + "version": "1.1.11", "dev": true, - "license": "MPL-2.0", + "license": "MIT", "dependencies": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/isarray": { - "version": "0.0.1", + "node_modules/ganache-core/node_modules/brorand": { + "version": "1.1.0", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-codec": { - "version": "7.0.1", + "node_modules/ganache-core/node_modules/browserify-aes": { + "version": "1.2.0", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-errors": { - "version": "1.0.5", + "node_modules/ganache-core/node_modules/browserify-cipher": { + "version": "1.0.1", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "errno": "~0.1.1" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-iterator-stream": { - "version": "1.3.1", + "node_modules/ganache-core/node_modules/browserify-des": { + "version": "1.0.2", "dev": true, "license": "MIT", + "optional": true, "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" + "safe-buffer": "^5.1.2" } }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-iterator-stream/node_modules/readable-stream": { - "version": "1.1.14", + "node_modules/ganache-core/node_modules/browserify-rsa": { + "version": "4.1.0", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" } }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-ws": { - "version": "0.0.0", + "node_modules/ganache-core/node_modules/browserify-rsa/node_modules/bn.js": { + "version": "5.1.3", "dev": true, "license": "MIT", + "optional": true + }, + "node_modules/ganache-core/node_modules/browserify-sign": { + "version": "4.2.1", + "dev": true, + "license": "ISC", + "optional": true, "dependencies": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" } }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-ws/node_modules/readable-stream": { - "version": "1.0.34", + "node_modules/ganache-core/node_modules/browserify-sign/node_modules/bn.js": { + "version": "5.1.3", "dev": true, "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } + "optional": true }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-ws/node_modules/xtend": { - "version": "2.1.2", + "node_modules/ganache-core/node_modules/browserify-sign/node_modules/readable-stream": { + "version": "3.6.0", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "object-keys": "~0.4.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">=0.4" + "node": ">= 6" } }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/levelup": { - "version": "1.3.9", + "node_modules/ganache-core/node_modules/browserslist": { + "version": "3.2.8", "dev": true, "license": "MIT", "dependencies": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" + "caniuse-lite": "^1.0.30000844", + "electron-to-chromium": "^1.3.47" + }, + "bin": { + "browserslist": "cli.js" } }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ltgt": { - "version": "2.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/memdown": { - "version": "1.4.1", + "node_modules/ganache-core/node_modules/bs58": { + "version": "4.0.1", "dev": true, "license": "MIT", "dependencies": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" + "base-x": "^3.0.2" } }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/memdown/node_modules/abstract-leveldown": { - "version": "2.7.2", + "node_modules/ganache-core/node_modules/bs58check": { + "version": "2.1.2", "dev": true, "license": "MIT", "dependencies": { - "xtend": "~4.0.0" + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" } }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/merkle-patricia-tree": { - "version": "2.3.2", + "node_modules/ganache-core/node_modules/buffer": { + "version": "5.7.1", "dev": true, - "license": "MPL-2.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", "dependencies": { - "async": "^1.4.2", - "ethereumjs-util": "^5.0.0", - "level-ws": "0.0.0", - "levelup": "^1.2.1", - "memdown": "^1.0.0", - "readable-stream": "^2.0.0", - "rlp": "^2.0.0", - "semaphore": ">=1.0.1" - } - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/merkle-patricia-tree/node_modules/async": { - "version": "1.5.2", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/object-keys": { - "version": "0.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/semver": { - "version": "5.4.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/string_decoder": { - "version": "0.10.31", + "node_modules/ganache-core/node_modules/buffer-from": { + "version": "1.1.1", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/ethashjs": { - "version": "0.0.8", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "async": "^2.1.2", - "buffer-xor": "^2.0.1", - "ethereumjs-util": "^7.0.2", - "miller-rabin": "^4.0.0" - } + "node_modules/ganache-core/node_modules/buffer-to-arraybuffer": { + "version": "0.0.5", + "dev": true, + "license": "MIT", + "optional": true }, - "node_modules/ganache-core/node_modules/ethashjs/node_modules/bn.js": { - "version": "5.1.3", + "node_modules/ganache-core/node_modules/buffer-xor": { + "version": "1.0.3", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/ethashjs/node_modules/buffer-xor": { - "version": "2.0.2", + "node_modules/ganache-core/node_modules/bufferutil": { + "version": "4.0.3", "dev": true, + "hasInstallScript": true, "license": "MIT", "dependencies": { - "safe-buffer": "^5.1.1" + "node-gyp-build": "^4.2.0" } }, - "node_modules/ganache-core/node_modules/ethashjs/node_modules/ethereumjs-util": { - "version": "7.0.7", + "node_modules/ganache-core/node_modules/bytes": { + "version": "3.1.0", "dev": true, - "license": "MPL-2.0", - "dependencies": { - "@types/bn.js": "^4.11.3", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.4" - }, + "license": "MIT", + "optional": true, "engines": { - "node": ">=10.0.0" + "node": ">= 0.8" } }, - "node_modules/ganache-core/node_modules/ethereum-bloom-filters": { - "version": "1.0.7", + "node_modules/ganache-core/node_modules/bytewise": { + "version": "1.1.0", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "js-sha3": "^0.8.0" + "bytewise-core": "^1.2.2", + "typewise": "^1.0.3" } }, - "node_modules/ganache-core/node_modules/ethereum-bloom-filters/node_modules/js-sha3": { - "version": "0.8.0", + "node_modules/ganache-core/node_modules/bytewise-core": { + "version": "1.2.3", "dev": true, "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/ethereum-common": { - "version": "0.0.18", - "dev": true, - "license": "MIT" + "dependencies": { + "typewise-core": "^1.2" + } }, - "node_modules/ganache-core/node_modules/ethereum-cryptography": { - "version": "0.1.3", + "node_modules/ganache-core/node_modules/cache-base": { + "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/ethereumjs-abi": { - "version": "0.6.8", + "node_modules/ganache-core/node_modules/cacheable-request": { + "version": "6.1.0", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" } }, - "node_modules/ganache-core/node_modules/ethereumjs-account": { - "version": "3.0.0", + "node_modules/ganache-core/node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", "dev": true, - "license": "MPL-2.0", - "dependencies": { - "ethereumjs-util": "^6.0.0", - "rlp": "^2.2.1", - "safe-buffer": "^5.1.1" + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" } }, - "node_modules/ganache-core/node_modules/ethereumjs-block": { - "version": "2.2.2", + "node_modules/ganache-core/node_modules/cachedown": { + "version": "1.0.0", "dev": true, - "license": "MPL-2.0", + "license": "MIT", "dependencies": { - "async": "^2.0.1", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.1", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" + "abstract-leveldown": "^2.4.1", + "lru-cache": "^3.2.0" } }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/abstract-leveldown": { - "version": "2.6.3", + "node_modules/ganache-core/node_modules/cachedown/node_modules/abstract-leveldown": { + "version": "2.7.2", "dev": true, "license": "MIT", "dependencies": { "xtend": "~4.0.0" } }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/deferred-leveldown": { - "version": "1.2.2", + "node_modules/ganache-core/node_modules/cachedown/node_modules/lru-cache": { + "version": "3.2.0", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "abstract-leveldown": "~2.6.0" + "pseudomap": "^1.0.1" } }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/ethereumjs-util": { - "version": "5.2.1", + "node_modules/ganache-core/node_modules/call-bind": { + "version": "1.0.2", "dev": true, - "license": "MPL-2.0", + "license": "MIT", "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/isarray": { - "version": "0.0.1", + "node_modules/ganache-core/node_modules/caniuse-lite": { + "version": "1.0.30001174", "dev": true, - "license": "MIT" + "license": "CC-BY-4.0" }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-codec": { - "version": "7.0.1", + "node_modules/ganache-core/node_modules/caseless": { + "version": "0.12.0", "dev": true, - "license": "MIT" + "license": "Apache-2.0" }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-errors": { - "version": "1.0.5", + "node_modules/ganache-core/node_modules/chalk": { + "version": "2.4.2", "dev": true, "license": "MIT", "dependencies": { - "errno": "~0.1.1" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-iterator-stream": { - "version": "1.3.1", + "node_modules/ganache-core/node_modules/checkpoint-store": { + "version": "1.1.0", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" + "functional-red-black-tree": "^1.0.1" } }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-iterator-stream/node_modules/readable-stream": { - "version": "1.1.14", + "node_modules/ganache-core/node_modules/chownr": { + "version": "1.1.4", "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } + "license": "ISC", + "optional": true }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-ws": { - "version": "0.0.0", + "node_modules/ganache-core/node_modules/ci-info": { + "version": "2.0.0", "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" - } + "license": "MIT" }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-ws/node_modules/readable-stream": { - "version": "1.0.34", + "node_modules/ganache-core/node_modules/cids": { + "version": "0.7.5", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "buffer": "^5.5.0", + "class-is": "^1.1.0", + "multibase": "~0.6.0", + "multicodec": "^1.0.0", + "multihashes": "~0.4.15" + }, + "engines": { + "node": ">=4.0.0", + "npm": ">=3.0.0" } }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-ws/node_modules/xtend": { - "version": "2.1.2", + "node_modules/ganache-core/node_modules/cids/node_modules/multicodec": { + "version": "1.0.4", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "object-keys": "~0.4.0" - }, - "engines": { - "node": ">=0.4" + "buffer": "^5.6.0", + "varint": "^5.0.0" } }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/levelup": { - "version": "1.3.9", + "node_modules/ganache-core/node_modules/cipher-base": { + "version": "1.0.4", "dev": true, "license": "MIT", "dependencies": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/ltgt": { - "version": "2.2.1", + "node_modules/ganache-core/node_modules/class-is": { + "version": "1.1.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/memdown": { - "version": "1.4.1", + "node_modules/ganache-core/node_modules/class-utils": { + "version": "0.3.6", "dev": true, "license": "MIT", "dependencies": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/memdown/node_modules/abstract-leveldown": { - "version": "2.7.2", + "node_modules/ganache-core/node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", "dev": true, "license": "MIT", "dependencies": { - "xtend": "~4.0.0" + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/merkle-patricia-tree": { - "version": "2.3.2", + "node_modules/ganache-core/node_modules/class-utils/node_modules/is-accessor-descriptor": { + "version": "0.1.6", "dev": true, - "license": "MPL-2.0", + "license": "MIT", "dependencies": { - "async": "^1.4.2", - "ethereumjs-util": "^5.0.0", - "level-ws": "0.0.0", - "levelup": "^1.2.1", - "memdown": "^1.0.0", - "readable-stream": "^2.0.0", - "rlp": "^2.0.0", - "semaphore": ">=1.0.1" + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/merkle-patricia-tree/node_modules/async": { - "version": "1.5.2", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/object-keys": { - "version": "0.4.0", + "node_modules/ganache-core/node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/safe-buffer": { - "version": "5.1.2", + "node_modules/ganache-core/node_modules/class-utils/node_modules/is-buffer": { + "version": "1.1.6", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/semver": { - "version": "5.4.1", + "node_modules/ganache-core/node_modules/class-utils/node_modules/is-data-descriptor": { + "version": "0.1.4", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/string_decoder": { - "version": "0.10.31", + "node_modules/ganache-core/node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/ganache-core/node_modules/ethereumjs-blockchain": { - "version": "4.0.4", + "node_modules/ganache-core/node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.6", "dev": true, - "license": "MPL-2.0", + "license": "MIT", "dependencies": { - "async": "^2.6.1", - "ethashjs": "~0.0.7", - "ethereumjs-block": "~2.2.2", - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.1.0", - "flow-stoplight": "^1.0.0", - "level-mem": "^3.0.1", - "lru-cache": "^5.1.1", - "rlp": "^2.2.2", - "semaphore": "^1.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/ethereumjs-common": { - "version": "1.5.0", + "node_modules/ganache-core/node_modules/class-utils/node_modules/kind-of": { + "version": "5.1.0", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/ganache-core/node_modules/ethereumjs-tx": { + "node_modules/ganache-core/node_modules/clone": { "version": "2.1.2", "dev": true, - "license": "MPL-2.0", - "dependencies": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" + "license": "MIT", + "engines": { + "node": ">=0.8" } }, - "node_modules/ganache-core/node_modules/ethereumjs-util": { - "version": "6.2.1", + "node_modules/ganache-core/node_modules/clone-response": { + "version": "1.0.2", "dev": true, - "license": "MPL-2.0", + "license": "MIT", + "optional": true, "dependencies": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" + "mimic-response": "^1.0.0" } }, - "node_modules/ganache-core/node_modules/ethereumjs-vm": { - "version": "4.2.0", + "node_modules/ganache-core/node_modules/collection-visit": { + "version": "1.0.0", "dev": true, - "license": "MPL-2.0", + "license": "MIT", "dependencies": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "core-js-pure": "^3.0.1", - "ethereumjs-account": "^3.0.0", - "ethereumjs-block": "^2.2.2", - "ethereumjs-blockchain": "^4.0.3", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.2", - "ethereumjs-util": "^6.2.0", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.3.2", - "rustbn.js": "~0.2.0", - "safe-buffer": "^5.1.1", - "util.promisify": "^1.0.0" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/abstract-leveldown": { - "version": "2.6.3", + "node_modules/ganache-core/node_modules/color-convert": { + "version": "1.9.3", "dev": true, "license": "MIT", "dependencies": { - "xtend": "~4.0.0" + "color-name": "1.1.3" } }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/deferred-leveldown": { - "version": "1.2.2", + "node_modules/ganache-core/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/combined-stream": { + "version": "1.0.8", "dev": true, "license": "MIT", "dependencies": { - "abstract-leveldown": "~2.6.0" + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/isarray": { - "version": "0.0.1", + "node_modules/ganache-core/node_modules/component-emitter": { + "version": "1.3.0", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-codec": { - "version": "7.0.1", + "node_modules/ganache-core/node_modules/concat-map": { + "version": "0.0.1", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-errors": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "errno": "~0.1.1" - } - }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-iterator-stream": { - "version": "1.3.1", + "node_modules/ganache-core/node_modules/concat-stream": { + "version": "1.6.2", "dev": true, + "engines": [ + "node >= 0.8" + ], "license": "MIT", "dependencies": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-iterator-stream/node_modules/readable-stream": { - "version": "1.1.14", + "node_modules/ganache-core/node_modules/content-disposition": { + "version": "0.5.3", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" } }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-ws": { - "version": "0.0.0", + "node_modules/ganache-core/node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.1.2", "dev": true, "license": "MIT", - "dependencies": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" - } + "optional": true }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-ws/node_modules/readable-stream": { - "version": "1.0.34", + "node_modules/ganache-core/node_modules/content-hash": { + "version": "2.5.2", "dev": true, - "license": "MIT", + "license": "ISC", + "optional": true, "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "cids": "^0.7.1", + "multicodec": "^0.5.5", + "multihashes": "^0.4.15" } }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-ws/node_modules/xtend": { - "version": "2.1.2", + "node_modules/ganache-core/node_modules/content-type": { + "version": "1.0.4", "dev": true, - "dependencies": { - "object-keys": "~0.4.0" - }, + "license": "MIT", + "optional": true, "engines": { - "node": ">=0.4" + "node": ">= 0.6" } }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/levelup": { - "version": "1.3.9", + "node_modules/ganache-core/node_modules/convert-source-map": { + "version": "1.7.0", "dev": true, "license": "MIT", "dependencies": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" + "safe-buffer": "~5.1.1" } }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/ltgt": { - "version": "2.2.1", + "node_modules/ganache-core/node_modules/convert-source-map/node_modules/safe-buffer": { + "version": "5.1.2", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/memdown": { - "version": "1.4.1", + "node_modules/ganache-core/node_modules/cookie": { + "version": "0.4.0", "dev": true, "license": "MIT", - "dependencies": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" + "optional": true, + "engines": { + "node": ">= 0.6" } }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/memdown/node_modules/abstract-leveldown": { - "version": "2.7.2", + "node_modules/ganache-core/node_modules/cookie-signature": { + "version": "1.0.6", "dev": true, "license": "MIT", - "dependencies": { - "xtend": "~4.0.0" - } + "optional": true }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/merkle-patricia-tree": { - "version": "2.3.2", + "node_modules/ganache-core/node_modules/cookiejar": { + "version": "2.1.2", "dev": true, - "license": "MPL-2.0", - "dependencies": { - "async": "^1.4.2", - "ethereumjs-util": "^5.0.0", - "level-ws": "0.0.0", - "levelup": "^1.2.1", - "memdown": "^1.0.0", - "readable-stream": "^2.0.0", - "rlp": "^2.0.0", - "semaphore": ">=1.0.1" + "license": "MIT", + "optional": true + }, + "node_modules/ganache-core/node_modules/copy-descriptor": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/merkle-patricia-tree/node_modules/async": { - "version": "1.5.2", + "node_modules/ganache-core/node_modules/core-js": { + "version": "2.6.12", "dev": true, + "hasInstallScript": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/merkle-patricia-tree/node_modules/ethereumjs-util": { - "version": "5.2.1", + "node_modules/ganache-core/node_modules/core-js-pure": { + "version": "3.8.2", "dev": true, - "license": "MPL-2.0", - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/object-keys": { - "version": "0.4.0", + "node_modules/ganache-core/node_modules/core-util-is": { + "version": "1.0.2", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/safe-buffer": { - "version": "5.1.2", + "node_modules/ganache-core/node_modules/cors": { + "version": "2.8.5", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/semver": { - "version": "5.4.1", + "node_modules/ganache-core/node_modules/create-ecdh": { + "version": "4.0.4", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" + "license": "MIT", + "optional": true, + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" } }, - "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/string_decoder": { - "version": "0.10.31", + "node_modules/ganache-core/node_modules/create-hash": { + "version": "1.2.0", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } }, - "node_modules/ganache-core/node_modules/ethereumjs-wallet": { - "version": "0.6.5", + "node_modules/ganache-core/node_modules/create-hmac": { + "version": "1.1.7", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "aes-js": "^3.1.1", - "bs58check": "^2.1.2", - "ethereum-cryptography": "^0.1.3", - "ethereumjs-util": "^6.0.0", - "randombytes": "^2.0.6", - "safe-buffer": "^5.1.2", - "scryptsy": "^1.2.1", - "utf8": "^3.0.0", - "uuid": "^3.3.2" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, - "node_modules/ganache-core/node_modules/ethjs-unit": { - "version": "0.1.6", + "node_modules/ganache-core/node_modules/cross-fetch": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "node-fetch": "2.1.2", + "whatwg-fetch": "2.0.4" + } + }, + "node_modules/ganache-core/node_modules/crypto-browserify": { + "version": "3.12.0", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" }, "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "node": "*" } }, - "node_modules/ganache-core/node_modules/ethjs-unit/node_modules/bn.js": { - "version": "4.11.6", + "node_modules/ganache-core/node_modules/d": { + "version": "1.0.1", "dev": true, - "license": "MIT", - "optional": true + "license": "ISC", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } }, - "node_modules/ganache-core/node_modules/ethjs-util": { - "version": "0.1.6", + "node_modules/ganache-core/node_modules/dashdash": { + "version": "1.14.1", "dev": true, "license": "MIT", "dependencies": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" + "assert-plus": "^1.0.0" }, "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "node": ">=0.10" } }, - "node_modules/ganache-core/node_modules/eventemitter3": { - "version": "4.0.4", + "node_modules/ganache-core/node_modules/debug": { + "version": "3.2.6", "dev": true, "license": "MIT", - "optional": true + "dependencies": { + "ms": "^2.1.1" + } }, - "node_modules/ganache-core/node_modules/events": { - "version": "3.2.0", + "node_modules/ganache-core/node_modules/decode-uri-component": { + "version": "0.2.0", "dev": true, "license": "MIT", "engines": { - "node": ">=0.8.x" + "node": ">=0.10" } }, - "node_modules/ganache-core/node_modules/evp_bytestokey": { - "version": "1.0.3", + "node_modules/ganache-core/node_modules/decompress-response": { + "version": "3.3.0", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/ganache-core/node_modules/expand-brackets": { - "version": "2.1.4", + "node_modules/ganache-core/node_modules/deep-equal": { + "version": "1.1.1", "dev": true, "license": "MIT", "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ganache-core/node_modules/expand-brackets/node_modules/debug": { - "version": "2.6.9", + "node_modules/ganache-core/node_modules/defer-to-connect": { + "version": "1.1.3", "dev": true, "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } + "optional": true }, - "node_modules/ganache-core/node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", + "node_modules/ganache-core/node_modules/deferred-leveldown": { + "version": "4.0.2", "dev": true, "license": "MIT", "dependencies": { - "is-descriptor": "^0.1.0" + "abstract-leveldown": "~5.0.0", + "inherits": "^2.0.3" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/ganache-core/node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", + "node_modules/ganache-core/node_modules/deferred-leveldown/node_modules/abstract-leveldown": { + "version": "5.0.0", "dev": true, "license": "MIT", "dependencies": { - "is-extendable": "^0.1.0" + "xtend": "~4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-accessor-descriptor": { - "version": "0.1.6", + "node_modules/ganache-core/node_modules/define-properties": { + "version": "1.1.3", "dev": true, "license": "MIT", "dependencies": { - "kind-of": "^3.0.2" + "object-keys": "^1.0.12" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", + "node_modules/ganache-core/node_modules/define-property": { + "version": "2.0.2", "dev": true, "license": "MIT", "dependencies": { - "is-buffer": "^1.1.5" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-buffer": { - "version": "1.1.6", + "node_modules/ganache-core/node_modules/defined": { + "version": "1.0.0", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-data-descriptor": { - "version": "0.1.4", + "node_modules/ganache-core/node_modules/delayed-stream": { + "version": "1.0.0", "dev": true, "license": "MIT", - "dependencies": { - "kind-of": "^3.0.2" - }, "engines": { - "node": ">=0.10.0" + "node": ">=0.4.0" } }, - "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", + "node_modules/ganache-core/node_modules/depd": { + "version": "1.1.2", "dev": true, "license": "MIT", - "dependencies": { - "is-buffer": "^1.1.5" - }, + "optional": true, "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.6", + "node_modules/ganache-core/node_modules/des.js": { + "version": "1.0.1", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, - "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-extendable": { - "version": "0.1.1", + "node_modules/ganache-core/node_modules/destroy": { + "version": "1.0.4", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "optional": true }, - "node_modules/ganache-core/node_modules/expand-brackets/node_modules/kind-of": { - "version": "5.1.0", + "node_modules/ganache-core/node_modules/detect-indent": { + "version": "4.0.0", "dev": true, "license": "MIT", + "dependencies": { + "repeating": "^2.0.0" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/expand-brackets/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/express": { - "version": "4.17.1", + "node_modules/ganache-core/node_modules/diffie-hellman": { + "version": "5.0.3", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, - "node_modules/ganache-core/node_modules/express/node_modules/debug": { - "version": "2.6.9", + "node_modules/ganache-core/node_modules/dom-walk": { + "version": "0.1.2", + "dev": true + }, + "node_modules/ganache-core/node_modules/dotignore": { + "version": "0.1.2", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "ms": "2.0.0" + "minimatch": "^3.0.4" + }, + "bin": { + "ignored": "bin/ignored" } }, - "node_modules/ganache-core/node_modules/express/node_modules/ms": { - "version": "2.0.0", + "node_modules/ganache-core/node_modules/duplexer3": { + "version": "0.1.4", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "optional": true }, - "node_modules/ganache-core/node_modules/express/node_modules/qs": { - "version": "6.7.0", + "node_modules/ganache-core/node_modules/ecc-jsbn": { + "version": "0.1.2", "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.6" + "license": "MIT", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, - "node_modules/ganache-core/node_modules/express/node_modules/safe-buffer": { - "version": "5.1.2", + "node_modules/ganache-core/node_modules/ee-first": { + "version": "1.1.1", "dev": true, "license": "MIT", "optional": true }, - "node_modules/ganache-core/node_modules/ext": { - "version": "1.4.0", + "node_modules/ganache-core/node_modules/electron-to-chromium": { + "version": "1.3.636", "dev": true, - "license": "ISC", - "dependencies": { - "type": "^2.0.0" - } + "license": "ISC" }, - "node_modules/ganache-core/node_modules/ext/node_modules/type": { - "version": "2.1.0", + "node_modules/ganache-core/node_modules/elliptic": { + "version": "6.5.3", "dev": true, - "license": "ISC" + "license": "MIT", + "dependencies": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } }, - "node_modules/ganache-core/node_modules/extend": { - "version": "3.0.2", + "node_modules/ganache-core/node_modules/encodeurl": { + "version": "1.0.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.8" + } }, - "node_modules/ganache-core/node_modules/extend-shallow": { - "version": "3.0.2", + "node_modules/ganache-core/node_modules/encoding": { + "version": "0.1.13", "dev": true, "license": "MIT", "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" + "iconv-lite": "^0.6.2" } }, - "node_modules/ganache-core/node_modules/extglob": { - "version": "2.0.4", + "node_modules/ganache-core/node_modules/encoding-down": { + "version": "5.0.4", "dev": true, "license": "MIT", "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "abstract-leveldown": "^5.0.0", + "inherits": "^2.0.3", + "level-codec": "^9.0.0", + "level-errors": "^2.0.0", + "xtend": "^4.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/ganache-core/node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", + "node_modules/ganache-core/node_modules/encoding-down/node_modules/abstract-leveldown": { + "version": "5.0.0", "dev": true, "license": "MIT", "dependencies": { - "is-descriptor": "^1.0.0" + "xtend": "~4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/ganache-core/node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", + "node_modules/ganache-core/node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.2", "dev": true, "license": "MIT", "dependencies": { - "is-extendable": "^0.1.0" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/extglob/node_modules/is-extendable": { - "version": "0.1.1", + "node_modules/ganache-core/node_modules/end-of-stream": { + "version": "1.4.4", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "once": "^1.4.0" } }, - "node_modules/ganache-core/node_modules/extsprintf": { - "version": "1.3.0", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/fake-merkle-patricia-tree": { - "version": "1.0.1", + "node_modules/ganache-core/node_modules/errno": { + "version": "0.1.8", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "checkpoint-store": "^1.1.0" + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" } }, - "node_modules/ganache-core/node_modules/fast-deep-equal": { - "version": "3.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/fetch-ponyfill": { - "version": "4.1.0", + "node_modules/ganache-core/node_modules/es-abstract": { + "version": "1.18.0-next.1", "dev": true, "license": "MIT", "dependencies": { - "node-fetch": "~1.7.1" + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ganache-core/node_modules/fetch-ponyfill/node_modules/is-stream": { - "version": "1.1.0", + "node_modules/ganache-core/node_modules/es-to-primitive": { + "version": "1.2.1", "dev": true, "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ganache-core/node_modules/fetch-ponyfill/node_modules/node-fetch": { - "version": "1.7.3", + "node_modules/ganache-core/node_modules/es5-ext": { + "version": "0.10.53", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" } }, - "node_modules/ganache-core/node_modules/finalhandler": { - "version": "1.1.2", + "node_modules/ganache-core/node_modules/es6-iterator": { + "version": "2.0.3", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, - "node_modules/ganache-core/node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", + "node_modules/ganache-core/node_modules/es6-symbol": { + "version": "3.1.3", "dev": true, - "license": "MIT", - "optional": true, + "license": "ISC", "dependencies": { - "ms": "2.0.0" + "d": "^1.0.1", + "ext": "^1.1.2" } }, - "node_modules/ganache-core/node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", + "node_modules/ganache-core/node_modules/escape-html": { + "version": "1.0.3", "dev": true, "license": "MIT", "optional": true }, - "node_modules/ganache-core/node_modules/find-yarn-workspace-root": { - "version": "1.2.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "fs-extra": "^4.0.3", - "micromatch": "^3.1.4" - } - }, - "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/braces": { - "version": "2.3.2", + "node_modules/ganache-core/node_modules/escape-string-regexp": { + "version": "1.0.5", "dev": true, "license": "MIT", - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, "engines": { - "node": ">=0.10.0" + "node": ">=0.8.0" } }, - "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", + "node_modules/ganache-core/node_modules/esutils": { + "version": "2.0.3", "dev": true, - "license": "MIT", - "dependencies": { - "is-extendable": "^0.1.0" - }, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/fill-range": { - "version": "4.0.0", + "node_modules/ganache-core/node_modules/etag": { + "version": "1.8.1", "dev": true, "license": "MIT", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, + "optional": true, "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", + "node_modules/ganache-core/node_modules/eth-block-tracker": { + "version": "3.0.1", "dev": true, "license": "MIT", "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" + "eth-query": "^2.1.0", + "ethereumjs-tx": "^1.3.3", + "ethereumjs-util": "^5.1.3", + "ethjs-util": "^0.1.3", + "json-rpc-engine": "^3.6.0", + "pify": "^2.3.0", + "tape": "^4.6.3" } }, - "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/fs-extra": { - "version": "4.0.3", + "node_modules/ganache-core/node_modules/eth-block-tracker/node_modules/ethereumjs-tx": { + "version": "1.3.7", "dev": true, - "license": "MIT", + "license": "MPL-2.0", "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "ethereum-common": "^0.0.18", + "ethereumjs-util": "^5.0.0" } }, - "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/is-buffer": { - "version": "1.1.6", + "node_modules/ganache-core/node_modules/eth-block-tracker/node_modules/ethereumjs-util": { + "version": "5.2.1", "dev": true, - "license": "MIT" + "license": "MPL-2.0", + "dependencies": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" + } }, - "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/is-extendable": { - "version": "0.1.1", + "node_modules/ganache-core/node_modules/eth-block-tracker/node_modules/pify": { + "version": "2.3.0", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/is-number": { - "version": "3.0.0", + "node_modules/ganache-core/node_modules/eth-ens-namehash": { + "version": "2.0.8", "dev": true, - "license": "MIT", + "license": "ISC", + "optional": true, "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" + "idna-uts46-hx": "^2.3.1", + "js-sha3": "^0.5.7" + } + }, + "node_modules/ganache-core/node_modules/eth-json-rpc-infura": { + "version": "3.2.1", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-fetch": "^2.1.1", + "eth-json-rpc-middleware": "^1.5.0", + "json-rpc-engine": "^3.4.0", + "json-rpc-error": "^2.0.0" + } + }, + "node_modules/ganache-core/node_modules/eth-json-rpc-middleware": { + "version": "1.6.0", + "dev": true, + "license": "ISC", + "dependencies": { + "async": "^2.5.0", + "eth-query": "^2.1.2", + "eth-tx-summary": "^3.1.2", + "ethereumjs-block": "^1.6.0", + "ethereumjs-tx": "^1.3.3", + "ethereumjs-util": "^5.1.2", + "ethereumjs-vm": "^2.1.0", + "fetch-ponyfill": "^4.0.0", + "json-rpc-engine": "^3.6.0", + "json-rpc-error": "^2.0.0", + "json-stable-stringify": "^1.0.1", + "promise-to-callback": "^1.0.0", + "tape": "^4.6.3" } }, - "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", + "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/abstract-leveldown": { + "version": "2.6.3", "dev": true, "license": "MIT", "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" + "xtend": "~4.0.0" } }, - "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/micromatch": { - "version": "3.1.10", + "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/deferred-leveldown": { + "version": "1.2.2", "dev": true, "license": "MIT", "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" + "abstract-leveldown": "~2.6.0" } }, - "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/to-regex-range": { - "version": "2.1.1", + "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-account": { + "version": "2.0.5", "dev": true, - "license": "MIT", + "license": "MPL-2.0", "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" + "ethereumjs-util": "^5.0.0", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/ganache-core/node_modules/flow-stoplight": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/ganache-core/node_modules/for-each": { - "version": "0.3.3", + "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-block": { + "version": "1.7.1", "dev": true, - "license": "MIT", + "license": "MPL-2.0", "dependencies": { - "is-callable": "^1.1.3" + "async": "^2.0.1", + "ethereum-common": "0.2.0", + "ethereumjs-tx": "^1.2.2", + "ethereumjs-util": "^5.0.0", + "merkle-patricia-tree": "^2.1.2" } }, - "node_modules/ganache-core/node_modules/for-in": { - "version": "1.0.2", + "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-block/node_modules/ethereum-common": { + "version": "0.2.0", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/ganache-core/node_modules/forever-agent": { - "version": "0.6.1", + "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-tx": { + "version": "1.3.7", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "*" + "license": "MPL-2.0", + "dependencies": { + "ethereum-common": "^0.0.18", + "ethereumjs-util": "^5.0.0" } }, - "node_modules/ganache-core/node_modules/form-data": { - "version": "2.3.3", + "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-util": { + "version": "5.2.1", "dev": true, - "license": "MIT", + "license": "MPL-2.0", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/ganache-core/node_modules/forwarded": { - "version": "0.1.2", + "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-vm": { + "version": "2.6.0", "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6" + "license": "MPL-2.0", + "dependencies": { + "async": "^2.1.2", + "async-eventemitter": "^0.2.2", + "ethereumjs-account": "^2.0.3", + "ethereumjs-block": "~2.2.0", + "ethereumjs-common": "^1.1.0", + "ethereumjs-util": "^6.0.0", + "fake-merkle-patricia-tree": "^1.0.1", + "functional-red-black-tree": "^1.0.1", + "merkle-patricia-tree": "^2.3.2", + "rustbn.js": "~0.2.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/ganache-core/node_modules/fragment-cache": { - "version": "0.2.1", + "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-vm/node_modules/ethereumjs-block": { + "version": "2.2.2", "dev": true, - "license": "MIT", + "license": "MPL-2.0", "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" + "async": "^2.0.1", + "ethereumjs-common": "^1.5.0", + "ethereumjs-tx": "^2.1.1", + "ethereumjs-util": "^5.0.0", + "merkle-patricia-tree": "^2.1.2" } }, - "node_modules/ganache-core/node_modules/fresh": { - "version": "0.5.2", + "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-vm/node_modules/ethereumjs-block/node_modules/ethereumjs-util": { + "version": "5.2.1", "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6" + "license": "MPL-2.0", + "dependencies": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/ganache-core/node_modules/fs-extra": { - "version": "7.0.1", + "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-vm/node_modules/ethereumjs-tx": { + "version": "2.1.2", "dev": true, - "license": "MIT", + "license": "MPL-2.0", "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" + "ethereumjs-common": "^1.5.0", + "ethereumjs-util": "^6.0.0" } }, - "node_modules/ganache-core/node_modules/fs.realpath": { - "version": "1.0.0", + "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-vm/node_modules/ethereumjs-util": { + "version": "6.2.1", "dev": true, - "license": "ISC" + "license": "MPL-2.0", + "dependencies": { + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" + } }, - "node_modules/ganache-core/node_modules/function-bind": { - "version": "1.1.1", + "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/isarray": { + "version": "0.0.1", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/functional-red-black-tree": { - "version": "1.0.1", + "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-codec": { + "version": "7.0.1", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/get-intrinsic": { - "version": "1.0.2", + "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-errors": { + "version": "1.0.5", "dev": true, "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "errno": "~0.1.1" } }, - "node_modules/ganache-core/node_modules/get-stream": { - "version": "5.2.0", + "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-iterator-stream": { + "version": "1.3.1", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "inherits": "^2.0.1", + "level-errors": "^1.0.3", + "readable-stream": "^1.0.33", + "xtend": "^4.0.0" } }, - "node_modules/ganache-core/node_modules/get-value": { - "version": "2.0.6", + "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-iterator-stream/node_modules/readable-stream": { + "version": "1.1.14", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "node_modules/ganache-core/node_modules/getpass": { - "version": "0.1.7", + "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-ws": { + "version": "0.0.0", "dev": true, "license": "MIT", "dependencies": { - "assert-plus": "^1.0.0" + "readable-stream": "~1.0.15", + "xtend": "~2.1.1" } }, - "node_modules/ganache-core/node_modules/glob": { - "version": "7.1.3", + "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-ws/node_modules/readable-stream": { + "version": "1.0.34", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-ws/node_modules/xtend": { + "version": "2.1.2", + "dev": true, + "dependencies": { + "object-keys": "~0.4.0" }, "engines": { - "node": "*" + "node": ">=0.4" } }, - "node_modules/ganache-core/node_modules/global": { - "version": "4.4.0", + "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/levelup": { + "version": "1.3.9", "dev": true, "license": "MIT", "dependencies": { - "min-document": "^2.19.0", - "process": "^0.11.10" + "deferred-leveldown": "~1.2.1", + "level-codec": "~7.0.0", + "level-errors": "~1.0.3", + "level-iterator-stream": "~1.3.0", + "prr": "~1.0.1", + "semver": "~5.4.1", + "xtend": "~4.0.0" } }, - "node_modules/ganache-core/node_modules/got": { - "version": "9.6.0", + "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ltgt": { + "version": "2.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/memdown": { + "version": "1.4.1", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" + "abstract-leveldown": "~2.7.1", + "functional-red-black-tree": "^1.0.1", + "immediate": "^3.2.3", + "inherits": "~2.0.1", + "ltgt": "~2.2.0", + "safe-buffer": "~5.1.1" } }, - "node_modules/ganache-core/node_modules/got/node_modules/get-stream": { - "version": "4.1.0", + "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/memdown/node_modules/abstract-leveldown": { + "version": "2.7.2", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" + "xtend": "~4.0.0" } }, - "node_modules/ganache-core/node_modules/graceful-fs": { - "version": "4.2.4", + "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/merkle-patricia-tree": { + "version": "2.3.2", "dev": true, - "license": "ISC" + "license": "MPL-2.0", + "dependencies": { + "async": "^1.4.2", + "ethereumjs-util": "^5.0.0", + "level-ws": "0.0.0", + "levelup": "^1.2.1", + "memdown": "^1.0.0", + "readable-stream": "^2.0.0", + "rlp": "^2.0.0", + "semaphore": ">=1.0.1" + } }, - "node_modules/ganache-core/node_modules/har-schema": { - "version": "2.0.0", + "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/merkle-patricia-tree/node_modules/async": { + "version": "1.5.2", + "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/object-keys": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/semver": { + "version": "5.4.1", "dev": true, "license": "ISC", - "engines": { - "node": ">=4" + "bin": { + "semver": "bin/semver" } }, - "node_modules/ganache-core/node_modules/har-validator": { - "version": "5.1.5", + "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/string_decoder": { + "version": "0.10.31", + "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/eth-lib": { + "version": "0.1.29", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "nano-json-stream-parser": "^0.1.2", + "servify": "^0.1.12", + "ws": "^3.0.0", + "xhr-request-promise": "^0.1.2" } }, - "node_modules/ganache-core/node_modules/has": { - "version": "1.0.3", + "node_modules/ganache-core/node_modules/eth-query": { + "version": "2.1.2", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" + "json-rpc-random-id": "^1.0.0", + "xtend": "^4.0.1" } }, - "node_modules/ganache-core/node_modules/has-ansi": { - "version": "2.0.0", + "node_modules/ganache-core/node_modules/eth-sig-util": { + "version": "3.0.0", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "buffer": "^5.2.1", + "elliptic": "^6.4.0", + "ethereumjs-abi": "0.6.5", + "ethereumjs-util": "^5.1.1", + "tweetnacl": "^1.0.0", + "tweetnacl-util": "^0.15.0" } }, - "node_modules/ganache-core/node_modules/has-ansi/node_modules/ansi-regex": { - "version": "2.1.1", + "node_modules/ganache-core/node_modules/eth-sig-util/node_modules/ethereumjs-abi": { + "version": "0.6.5", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "bn.js": "^4.10.0", + "ethereumjs-util": "^4.3.0" } }, - "node_modules/ganache-core/node_modules/has-flag": { - "version": "3.0.0", + "node_modules/ganache-core/node_modules/eth-sig-util/node_modules/ethereumjs-abi/node_modules/ethereumjs-util": { + "version": "4.5.1", "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" + "license": "MPL-2.0", + "dependencies": { + "bn.js": "^4.8.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.0.0" } }, - "node_modules/ganache-core/node_modules/has-symbol-support-x": { - "version": "1.4.2", + "node_modules/ganache-core/node_modules/eth-sig-util/node_modules/ethereumjs-util": { + "version": "5.2.1", "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": "*" + "license": "MPL-2.0", + "dependencies": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/ganache-core/node_modules/has-symbols": { - "version": "1.0.1", + "node_modules/ganache-core/node_modules/eth-tx-summary": { + "version": "3.2.4", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "license": "ISC", + "dependencies": { + "async": "^2.1.2", + "clone": "^2.0.0", + "concat-stream": "^1.5.1", + "end-of-stream": "^1.1.0", + "eth-query": "^2.0.2", + "ethereumjs-block": "^1.4.1", + "ethereumjs-tx": "^1.1.1", + "ethereumjs-util": "^5.0.1", + "ethereumjs-vm": "^2.6.0", + "through2": "^2.0.3" } }, - "node_modules/ganache-core/node_modules/has-to-string-tag-x": { - "version": "1.4.1", + "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/abstract-leveldown": { + "version": "2.6.3", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "has-symbol-support-x": "^1.4.1" - }, - "engines": { - "node": "*" + "xtend": "~4.0.0" } }, - "node_modules/ganache-core/node_modules/has-value": { - "version": "1.0.0", + "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/deferred-leveldown": { + "version": "1.2.2", "dev": true, "license": "MIT", "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" + "abstract-leveldown": "~2.6.0" } }, - "node_modules/ganache-core/node_modules/has-values": { - "version": "1.0.0", + "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-account": { + "version": "2.0.5", "dev": true, - "license": "MIT", + "license": "MPL-2.0", "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" + "ethereumjs-util": "^5.0.0", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/ganache-core/node_modules/has-values/node_modules/is-buffer": { - "version": "1.1.6", + "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-block": { + "version": "1.7.1", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "async": "^2.0.1", + "ethereum-common": "0.2.0", + "ethereumjs-tx": "^1.2.2", + "ethereumjs-util": "^5.0.0", + "merkle-patricia-tree": "^2.1.2" + } + }, + "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-block/node_modules/ethereum-common": { + "version": "0.2.0", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/has-values/node_modules/is-number": { - "version": "3.0.0", + "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-tx": { + "version": "1.3.7", "dev": true, - "license": "MIT", + "license": "MPL-2.0", "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" + "ethereum-common": "^0.0.18", + "ethereumjs-util": "^5.0.0" } }, - "node_modules/ganache-core/node_modules/has-values/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", + "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-util": { + "version": "5.2.1", "dev": true, - "license": "MIT", + "license": "MPL-2.0", "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/ganache-core/node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", + "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-vm": { + "version": "2.6.0", "dev": true, - "license": "MIT", + "license": "MPL-2.0", "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" + "async": "^2.1.2", + "async-eventemitter": "^0.2.2", + "ethereumjs-account": "^2.0.3", + "ethereumjs-block": "~2.2.0", + "ethereumjs-common": "^1.1.0", + "ethereumjs-util": "^6.0.0", + "fake-merkle-patricia-tree": "^1.0.1", + "functional-red-black-tree": "^1.0.1", + "merkle-patricia-tree": "^2.3.2", + "rustbn.js": "~0.2.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/ganache-core/node_modules/hash-base": { - "version": "3.1.0", + "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-vm/node_modules/ethereumjs-block": { + "version": "2.2.2", "dev": true, - "license": "MIT", + "license": "MPL-2.0", "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" + "async": "^2.0.1", + "ethereumjs-common": "^1.5.0", + "ethereumjs-tx": "^2.1.1", + "ethereumjs-util": "^5.0.0", + "merkle-patricia-tree": "^2.1.2" } }, - "node_modules/ganache-core/node_modules/hash-base/node_modules/readable-stream": { - "version": "3.6.0", + "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-vm/node_modules/ethereumjs-block/node_modules/ethereumjs-util": { + "version": "5.2.1", "dev": true, - "license": "MIT", + "license": "MPL-2.0", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/ganache-core/node_modules/hash.js": { - "version": "1.1.7", + "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-vm/node_modules/ethereumjs-tx": { + "version": "2.1.2", "dev": true, - "license": "MIT", + "license": "MPL-2.0", "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" + "ethereumjs-common": "^1.5.0", + "ethereumjs-util": "^6.0.0" } }, - "node_modules/ganache-core/node_modules/heap": { - "version": "0.2.6", - "dev": true - }, - "node_modules/ganache-core/node_modules/hmac-drbg": { - "version": "1.0.1", + "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-vm/node_modules/ethereumjs-util": { + "version": "6.2.1", "dev": true, - "license": "MIT", + "license": "MPL-2.0", "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" } }, - "node_modules/ganache-core/node_modules/home-or-tmp": { - "version": "2.0.0", + "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/isarray": { + "version": "0.0.1", "dev": true, - "license": "MIT", - "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/ganache-core/node_modules/http-cache-semantics": { - "version": "4.1.0", + "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-codec": { + "version": "7.0.1", "dev": true, - "license": "BSD-2-Clause", - "optional": true + "license": "MIT" }, - "node_modules/ganache-core/node_modules/http-errors": { - "version": "1.7.2", + "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-errors": { + "version": "1.0.5", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "engines": { - "node": ">= 0.6" + "errno": "~0.1.1" } }, - "node_modules/ganache-core/node_modules/http-errors/node_modules/inherits": { - "version": "2.0.3", - "dev": true, - "license": "ISC", - "optional": true - }, - "node_modules/ganache-core/node_modules/http-https": { - "version": "1.0.0", - "dev": true, - "license": "ISC", - "optional": true - }, - "node_modules/ganache-core/node_modules/http-signature": { - "version": "1.2.0", + "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-iterator-stream": { + "version": "1.3.1", "dev": true, "license": "MIT", "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" + "inherits": "^2.0.1", + "level-errors": "^1.0.3", + "readable-stream": "^1.0.33", + "xtend": "^4.0.0" } }, - "node_modules/ganache-core/node_modules/iconv-lite": { - "version": "0.4.24", + "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-iterator-stream/node_modules/readable-stream": { + "version": "1.1.14", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "node_modules/ganache-core/node_modules/idna-uts46-hx": { - "version": "2.3.1", + "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-ws": { + "version": "0.0.0", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "punycode": "2.1.0" - }, - "engines": { - "node": ">=4.0.0" + "readable-stream": "~1.0.15", + "xtend": "~2.1.1" } }, - "node_modules/ganache-core/node_modules/idna-uts46-hx/node_modules/punycode": { - "version": "2.1.0", + "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-ws/node_modules/readable-stream": { + "version": "1.0.34", "dev": true, "license": "MIT", - "optional": true, - "engines": { - "node": ">=6" + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "node_modules/ganache-core/node_modules/ieee754": { - "version": "1.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/ganache-core/node_modules/immediate": { - "version": "3.2.3", + "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-ws/node_modules/xtend": { + "version": "2.1.2", "dev": true, - "license": "MIT" + "dependencies": { + "object-keys": "~0.4.0" + }, + "engines": { + "node": ">=0.4" + } }, - "node_modules/ganache-core/node_modules/inflight": { - "version": "1.0.6", + "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/levelup": { + "version": "1.3.9", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "deferred-leveldown": "~1.2.1", + "level-codec": "~7.0.0", + "level-errors": "~1.0.3", + "level-iterator-stream": "~1.3.0", + "prr": "~1.0.1", + "semver": "~5.4.1", + "xtend": "~4.0.0" } }, - "node_modules/ganache-core/node_modules/inherits": { - "version": "2.0.4", + "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ltgt": { + "version": "2.2.1", "dev": true, - "license": "ISC" + "license": "MIT" }, - "node_modules/ganache-core/node_modules/invariant": { - "version": "2.2.4", + "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/memdown": { + "version": "1.4.1", "dev": true, "license": "MIT", "dependencies": { - "loose-envify": "^1.0.0" + "abstract-leveldown": "~2.7.1", + "functional-red-black-tree": "^1.0.1", + "immediate": "^3.2.3", + "inherits": "~2.0.1", + "ltgt": "~2.2.0", + "safe-buffer": "~5.1.1" } }, - "node_modules/ganache-core/node_modules/ipaddr.js": { - "version": "1.9.1", + "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/memdown/node_modules/abstract-leveldown": { + "version": "2.7.2", "dev": true, "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.10" + "dependencies": { + "xtend": "~4.0.0" } }, - "node_modules/ganache-core/node_modules/is-accessor-descriptor": { - "version": "1.0.0", + "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/merkle-patricia-tree": { + "version": "2.3.2", "dev": true, - "license": "MIT", + "license": "MPL-2.0", "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" + "async": "^1.4.2", + "ethereumjs-util": "^5.0.0", + "level-ws": "0.0.0", + "levelup": "^1.2.1", + "memdown": "^1.0.0", + "readable-stream": "^2.0.0", + "rlp": "^2.0.0", + "semaphore": ">=1.0.1" } }, - "node_modules/ganache-core/node_modules/is-arguments": { - "version": "1.1.0", + "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/merkle-patricia-tree/node_modules/async": { + "version": "1.5.2", "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, - "node_modules/ganache-core/node_modules/is-callable": { - "version": "1.2.2", + "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/object-keys": { + "version": "0.4.0", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, - "node_modules/ganache-core/node_modules/is-ci": { - "version": "2.0.0", + "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/safe-buffer": { + "version": "5.1.2", "dev": true, - "license": "MIT", - "dependencies": { - "ci-info": "^2.0.0" - }, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/semver": { + "version": "5.4.1", + "dev": true, + "license": "ISC", "bin": { - "is-ci": "bin.js" + "semver": "bin/semver" } }, - "node_modules/ganache-core/node_modules/is-data-descriptor": { - "version": "1.0.0", + "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/string_decoder": { + "version": "0.10.31", "dev": true, - "license": "MIT", + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/ethashjs": { + "version": "0.0.8", + "dev": true, + "license": "MPL-2.0", "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" + "async": "^2.1.2", + "buffer-xor": "^2.0.1", + "ethereumjs-util": "^7.0.2", + "miller-rabin": "^4.0.0" } }, - "node_modules/ganache-core/node_modules/is-date-object": { - "version": "1.0.2", + "node_modules/ganache-core/node_modules/ethashjs/node_modules/bn.js": { + "version": "5.1.3", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, - "node_modules/ganache-core/node_modules/is-descriptor": { - "version": "1.0.2", + "node_modules/ganache-core/node_modules/ethashjs/node_modules/buffer-xor": { + "version": "2.0.2", "dev": true, "license": "MIT", "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" + "safe-buffer": "^5.1.1" } }, - "node_modules/ganache-core/node_modules/is-extendable": { - "version": "1.0.1", + "node_modules/ganache-core/node_modules/ethashjs/node_modules/ethereumjs-util": { + "version": "7.0.7", "dev": true, - "license": "MIT", + "license": "MPL-2.0", "dependencies": { - "is-plain-object": "^2.0.4" + "@types/bn.js": "^4.11.3", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.4" }, "engines": { - "node": ">=0.10.0" + "node": ">=10.0.0" } }, - "node_modules/ganache-core/node_modules/is-finite": { - "version": "1.1.0", + "node_modules/ganache-core/node_modules/ethereum-bloom-filters": { + "version": "1.0.7", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optional": true, + "dependencies": { + "js-sha3": "^0.8.0" } }, - "node_modules/ganache-core/node_modules/is-fn": { - "version": "1.0.0", + "node_modules/ganache-core/node_modules/ethereum-bloom-filters/node_modules/js-sha3": { + "version": "0.8.0", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "optional": true }, - "node_modules/ganache-core/node_modules/is-function": { - "version": "1.0.2", + "node_modules/ganache-core/node_modules/ethereum-common": { + "version": "0.0.18", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/is-hex-prefixed": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/ganache-core/node_modules/is-negative-zero": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ganache-core/node_modules/is-object": { - "version": "1.0.2", + "node_modules/ganache-core/node_modules/ethereum-cryptography": { + "version": "0.1.3", "dev": true, "license": "MIT", - "optional": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" } }, - "node_modules/ganache-core/node_modules/is-plain-obj": { - "version": "1.1.0", + "node_modules/ganache-core/node_modules/ethereumjs-abi": { + "version": "0.6.8", "dev": true, "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" } }, - "node_modules/ganache-core/node_modules/is-plain-object": { - "version": "2.0.4", + "node_modules/ganache-core/node_modules/ethereumjs-account": { + "version": "3.0.0", "dev": true, - "license": "MIT", + "license": "MPL-2.0", "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" + "ethereumjs-util": "^6.0.0", + "rlp": "^2.2.1", + "safe-buffer": "^5.1.1" } }, - "node_modules/ganache-core/node_modules/is-regex": { - "version": "1.1.1", + "node_modules/ganache-core/node_modules/ethereumjs-block": { + "version": "2.2.2", "dev": true, - "license": "MIT", + "license": "MPL-2.0", "dependencies": { - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "async": "^2.0.1", + "ethereumjs-common": "^1.5.0", + "ethereumjs-tx": "^2.1.1", + "ethereumjs-util": "^5.0.0", + "merkle-patricia-tree": "^2.1.2" } }, - "node_modules/ganache-core/node_modules/is-retry-allowed": { - "version": "1.2.0", + "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/abstract-leveldown": { + "version": "2.6.3", "dev": true, "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "xtend": "~4.0.0" } }, - "node_modules/ganache-core/node_modules/is-symbol": { - "version": "1.0.3", + "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/deferred-leveldown": { + "version": "1.2.2", "dev": true, "license": "MIT", "dependencies": { - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "abstract-leveldown": "~2.6.0" } }, - "node_modules/ganache-core/node_modules/is-typedarray": { - "version": "1.0.0", + "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/ethereumjs-util": { + "version": "5.2.1", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/isarray": { + "version": "0.0.1", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/is-windows": { - "version": "1.0.2", + "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-codec": { + "version": "7.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-errors": { + "version": "1.0.5", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "errno": "~0.1.1" } }, - "node_modules/ganache-core/node_modules/isarray": { - "version": "1.0.0", + "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-iterator-stream": { + "version": "1.3.1", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "level-errors": "^1.0.3", + "readable-stream": "^1.0.33", + "xtend": "^4.0.0" + } }, - "node_modules/ganache-core/node_modules/isexe": { - "version": "2.0.0", + "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-iterator-stream/node_modules/readable-stream": { + "version": "1.1.14", "dev": true, - "license": "ISC" + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } }, - "node_modules/ganache-core/node_modules/isobject": { - "version": "3.0.1", + "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-ws": { + "version": "0.0.0", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "readable-stream": "~1.0.15", + "xtend": "~2.1.1" } }, - "node_modules/ganache-core/node_modules/isstream": { - "version": "0.1.2", + "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-ws/node_modules/readable-stream": { + "version": "1.0.34", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } }, - "node_modules/ganache-core/node_modules/isurl": { - "version": "1.0.0", + "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-ws/node_modules/xtend": { + "version": "2.1.2", "dev": true, - "license": "MIT", - "optional": true, "dependencies": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" + "object-keys": "~0.4.0" }, "engines": { - "node": ">= 4" + "node": ">=0.4" } }, - "node_modules/ganache-core/node_modules/js-sha3": { - "version": "0.5.7", + "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/levelup": { + "version": "1.3.9", "dev": true, "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/js-tokens": { - "version": "4.0.0", - "dev": true, - "license": "MIT" + "dependencies": { + "deferred-leveldown": "~1.2.1", + "level-codec": "~7.0.0", + "level-errors": "~1.0.3", + "level-iterator-stream": "~1.3.0", + "prr": "~1.0.1", + "semver": "~5.4.1", + "xtend": "~4.0.0" + } }, - "node_modules/ganache-core/node_modules/jsbn": { - "version": "0.1.1", + "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/ltgt": { + "version": "2.2.1", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/json-buffer": { - "version": "3.0.0", + "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/memdown": { + "version": "1.4.1", "dev": true, "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/json-rpc-engine": { - "version": "3.8.0", - "dev": true, - "license": "ISC", "dependencies": { - "async": "^2.0.1", - "babel-preset-env": "^1.7.0", - "babelify": "^7.3.0", - "json-rpc-error": "^2.0.0", - "promise-to-callback": "^1.0.0", - "safe-event-emitter": "^1.0.1" + "abstract-leveldown": "~2.7.1", + "functional-red-black-tree": "^1.0.1", + "immediate": "^3.2.3", + "inherits": "~2.0.1", + "ltgt": "~2.2.0", + "safe-buffer": "~5.1.1" } }, - "node_modules/ganache-core/node_modules/json-rpc-error": { - "version": "2.0.0", + "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/memdown/node_modules/abstract-leveldown": { + "version": "2.7.2", "dev": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.1" + "xtend": "~4.0.0" } }, - "node_modules/ganache-core/node_modules/json-rpc-random-id": { - "version": "1.0.1", + "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/merkle-patricia-tree": { + "version": "2.3.2", "dev": true, - "license": "ISC" - }, - "node_modules/ganache-core/node_modules/json-schema": { - "version": "0.2.3", - "dev": true + "license": "MPL-2.0", + "dependencies": { + "async": "^1.4.2", + "ethereumjs-util": "^5.0.0", + "level-ws": "0.0.0", + "levelup": "^1.2.1", + "memdown": "^1.0.0", + "readable-stream": "^2.0.0", + "rlp": "^2.0.0", + "semaphore": ">=1.0.1" + } }, - "node_modules/ganache-core/node_modules/json-schema-traverse": { - "version": "0.4.1", + "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/merkle-patricia-tree/node_modules/async": { + "version": "1.5.2", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/json-stable-stringify": { - "version": "1.0.1", + "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/object-keys": { + "version": "0.4.0", "dev": true, - "license": "MIT", - "dependencies": { - "jsonify": "~0.0.0" - } + "license": "MIT" }, - "node_modules/ganache-core/node_modules/json-stringify-safe": { - "version": "5.0.1", + "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/safe-buffer": { + "version": "5.1.2", "dev": true, - "license": "ISC" + "license": "MIT" }, - "node_modules/ganache-core/node_modules/jsonfile": { - "version": "4.0.0", + "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/semver": { + "version": "5.4.1", "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "license": "ISC", + "bin": { + "semver": "bin/semver" } }, - "node_modules/ganache-core/node_modules/jsonify": { - "version": "0.0.0", + "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/string_decoder": { + "version": "0.10.31", "dev": true, - "license": "Public Domain" + "license": "MIT" }, - "node_modules/ganache-core/node_modules/jsprim": { - "version": "1.4.1", + "node_modules/ganache-core/node_modules/ethereumjs-blockchain": { + "version": "4.0.4", "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT", + "license": "MPL-2.0", "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" + "async": "^2.6.1", + "ethashjs": "~0.0.7", + "ethereumjs-block": "~2.2.2", + "ethereumjs-common": "^1.5.0", + "ethereumjs-util": "^6.1.0", + "flow-stoplight": "^1.0.0", + "level-mem": "^3.0.1", + "lru-cache": "^5.1.1", + "rlp": "^2.2.2", + "semaphore": "^1.1.0" } }, - "node_modules/ganache-core/node_modules/keccak": { - "version": "3.0.1", + "node_modules/ganache-core/node_modules/ethereumjs-common": { + "version": "1.5.0", "dev": true, - "hasInstallScript": true, - "inBundle": true, - "license": "MIT", + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/ethereumjs-tx": { + "version": "2.1.2", + "dev": true, + "license": "MPL-2.0", "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - }, - "engines": { - "node": ">=10.0.0" + "ethereumjs-common": "^1.5.0", + "ethereumjs-util": "^6.0.0" } }, - "node_modules/ganache-core/node_modules/keyv": { - "version": "3.1.0", + "node_modules/ganache-core/node_modules/ethereumjs-util": { + "version": "6.2.1", "dev": true, - "license": "MIT", - "optional": true, + "license": "MPL-2.0", "dependencies": { - "json-buffer": "3.0.0" + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" } }, - "node_modules/ganache-core/node_modules/kind-of": { - "version": "6.0.3", + "node_modules/ganache-core/node_modules/ethereumjs-vm": { + "version": "4.2.0", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "license": "MPL-2.0", + "dependencies": { + "async": "^2.1.2", + "async-eventemitter": "^0.2.2", + "core-js-pure": "^3.0.1", + "ethereumjs-account": "^3.0.0", + "ethereumjs-block": "^2.2.2", + "ethereumjs-blockchain": "^4.0.3", + "ethereumjs-common": "^1.5.0", + "ethereumjs-tx": "^2.1.2", + "ethereumjs-util": "^6.2.0", + "fake-merkle-patricia-tree": "^1.0.1", + "functional-red-black-tree": "^1.0.1", + "merkle-patricia-tree": "^2.3.2", + "rustbn.js": "~0.2.0", + "safe-buffer": "^5.1.1", + "util.promisify": "^1.0.0" } }, - "node_modules/ganache-core/node_modules/klaw-sync": { - "version": "6.0.0", + "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/abstract-leveldown": { + "version": "2.6.3", "dev": true, "license": "MIT", "dependencies": { - "graceful-fs": "^4.1.11" + "xtend": "~4.0.0" } }, - "node_modules/ganache-core/node_modules/level-codec": { - "version": "9.0.2", + "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/deferred-leveldown": { + "version": "1.2.2", "dev": true, "license": "MIT", "dependencies": { - "buffer": "^5.6.0" - }, - "engines": { - "node": ">=6" + "abstract-leveldown": "~2.6.0" } }, - "node_modules/ganache-core/node_modules/level-errors": { - "version": "2.0.1", + "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/isarray": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-codec": { + "version": "7.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-errors": { + "version": "1.0.5", "dev": true, "license": "MIT", "dependencies": { "errno": "~0.1.1" - }, - "engines": { - "node": ">=6" } }, - "node_modules/ganache-core/node_modules/level-iterator-stream": { - "version": "2.0.3", + "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-iterator-stream": { + "version": "1.3.1", "dev": true, "license": "MIT", "dependencies": { "inherits": "^2.0.1", - "readable-stream": "^2.0.5", + "level-errors": "^1.0.3", + "readable-stream": "^1.0.33", "xtend": "^4.0.0" - }, - "engines": { - "node": ">=4" } }, - "node_modules/ganache-core/node_modules/level-mem": { - "version": "3.0.1", + "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-iterator-stream/node_modules/readable-stream": { + "version": "1.1.14", "dev": true, "license": "MIT", "dependencies": { - "level-packager": "~4.0.0", - "memdown": "~3.0.0" - }, - "engines": { - "node": ">=6" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "node_modules/ganache-core/node_modules/level-mem/node_modules/abstract-leveldown": { - "version": "5.0.0", + "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-ws": { + "version": "0.0.0", "dev": true, "license": "MIT", "dependencies": { - "xtend": "~4.0.0" - }, - "engines": { - "node": ">=6" + "readable-stream": "~1.0.15", + "xtend": "~2.1.1" } }, - "node_modules/ganache-core/node_modules/level-mem/node_modules/ltgt": { - "version": "2.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/level-mem/node_modules/memdown": { - "version": "3.0.0", + "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-ws/node_modules/readable-stream": { + "version": "1.0.34", "dev": true, "license": "MIT", "dependencies": { - "abstract-leveldown": "~5.0.0", - "functional-red-black-tree": "~1.0.1", - "immediate": "~3.2.3", + "core-util-is": "~1.0.0", "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" - }, - "engines": { - "node": ">=6" + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "node_modules/ganache-core/node_modules/level-mem/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/level-packager": { - "version": "4.0.1", + "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-ws/node_modules/xtend": { + "version": "2.1.2", "dev": true, - "license": "MIT", "dependencies": { - "encoding-down": "~5.0.0", - "levelup": "^3.0.0" + "object-keys": "~0.4.0" }, "engines": { - "node": ">=6" + "node": ">=0.4" } }, - "node_modules/ganache-core/node_modules/level-post": { - "version": "1.0.7", + "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/levelup": { + "version": "1.3.9", "dev": true, "license": "MIT", "dependencies": { - "ltgt": "^2.1.2" + "deferred-leveldown": "~1.2.1", + "level-codec": "~7.0.0", + "level-errors": "~1.0.3", + "level-iterator-stream": "~1.3.0", + "prr": "~1.0.1", + "semver": "~5.4.1", + "xtend": "~4.0.0" } }, - "node_modules/ganache-core/node_modules/level-sublevel": { - "version": "6.6.4", + "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/ltgt": { + "version": "2.2.1", "dev": true, - "license": "MIT", - "dependencies": { - "bytewise": "~1.1.0", - "level-codec": "^9.0.0", - "level-errors": "^2.0.0", - "level-iterator-stream": "^2.0.3", - "ltgt": "~2.1.1", - "pull-defer": "^0.2.2", - "pull-level": "^2.0.3", - "pull-stream": "^3.6.8", - "typewiselite": "~1.0.0", - "xtend": "~4.0.0" - } + "license": "MIT" }, - "node_modules/ganache-core/node_modules/level-ws": { - "version": "1.0.0", + "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/memdown": { + "version": "1.4.1", "dev": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "readable-stream": "^2.2.8", - "xtend": "^4.0.1" - }, - "engines": { - "node": ">=6" + "abstract-leveldown": "~2.7.1", + "functional-red-black-tree": "^1.0.1", + "immediate": "^3.2.3", + "inherits": "~2.0.1", + "ltgt": "~2.2.0", + "safe-buffer": "~5.1.1" } }, - "node_modules/ganache-core/node_modules/levelup": { - "version": "3.1.1", + "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/memdown/node_modules/abstract-leveldown": { + "version": "2.7.2", "dev": true, "license": "MIT", "dependencies": { - "deferred-leveldown": "~4.0.0", - "level-errors": "~2.0.0", - "level-iterator-stream": "~3.0.0", "xtend": "~4.0.0" - }, - "engines": { - "node": ">=6" } }, - "node_modules/ganache-core/node_modules/levelup/node_modules/level-iterator-stream": { - "version": "3.0.1", + "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/merkle-patricia-tree": { + "version": "2.3.2", "dev": true, - "license": "MIT", + "license": "MPL-2.0", "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">=6" + "async": "^1.4.2", + "ethereumjs-util": "^5.0.0", + "level-ws": "0.0.0", + "levelup": "^1.2.1", + "memdown": "^1.0.0", + "readable-stream": "^2.0.0", + "rlp": "^2.0.0", + "semaphore": ">=1.0.1" } }, - "node_modules/ganache-core/node_modules/lodash": { - "version": "4.17.20", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/looper": { - "version": "2.0.0", + "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/merkle-patricia-tree/node_modules/async": { + "version": "1.5.2", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/loose-envify": { - "version": "1.4.0", + "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/merkle-patricia-tree/node_modules/ethereumjs-util": { + "version": "5.2.1", "dev": true, - "license": "MIT", + "license": "MPL-2.0", "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/ganache-core/node_modules/lowercase-keys": { - "version": "1.0.1", + "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/object-keys": { + "version": "0.4.0", "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" }, - "node_modules/ganache-core/node_modules/lru-cache": { - "version": "5.1.1", + "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/semver": { + "version": "5.4.1", "dev": true, "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" + "bin": { + "semver": "bin/semver" } }, - "node_modules/ganache-core/node_modules/ltgt": { - "version": "2.1.3", + "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/string_decoder": { + "version": "0.10.31", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/map-cache": { - "version": "0.2.2", + "node_modules/ganache-core/node_modules/ethereumjs-wallet": { + "version": "0.6.5", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "optional": true, + "dependencies": { + "aes-js": "^3.1.1", + "bs58check": "^2.1.2", + "ethereum-cryptography": "^0.1.3", + "ethereumjs-util": "^6.0.0", + "randombytes": "^2.0.6", + "safe-buffer": "^5.1.2", + "scryptsy": "^1.2.1", + "utf8": "^3.0.0", + "uuid": "^3.3.2" } }, - "node_modules/ganache-core/node_modules/map-visit": { - "version": "1.0.0", + "node_modules/ganache-core/node_modules/ethjs-unit": { + "version": "0.1.6", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "object-visit": "^1.0.0" + "bn.js": "4.11.6", + "number-to-bn": "1.7.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.5.0", + "npm": ">=3" } }, - "node_modules/ganache-core/node_modules/md5.js": { - "version": "1.3.5", + "node_modules/ganache-core/node_modules/ethjs-unit/node_modules/bn.js": { + "version": "4.11.6", "dev": true, "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } + "optional": true }, - "node_modules/ganache-core/node_modules/media-typer": { - "version": "0.3.0", + "node_modules/ganache-core/node_modules/ethjs-util": { + "version": "0.1.6", "dev": true, "license": "MIT", - "optional": true, + "dependencies": { + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=6.5.0", + "npm": ">=3" } }, - "node_modules/ganache-core/node_modules/merge-descriptors": { - "version": "1.0.1", + "node_modules/ganache-core/node_modules/eventemitter3": { + "version": "4.0.4", "dev": true, "license": "MIT", "optional": true }, - "node_modules/ganache-core/node_modules/merkle-patricia-tree": { - "version": "3.0.0", + "node_modules/ganache-core/node_modules/events": { + "version": "3.2.0", "dev": true, - "license": "MPL-2.0", - "dependencies": { - "async": "^2.6.1", - "ethereumjs-util": "^5.2.0", - "level-mem": "^3.0.1", - "level-ws": "^1.0.0", - "readable-stream": "^3.0.6", - "rlp": "^2.0.0", - "semaphore": ">=1.0.1" + "license": "MIT", + "engines": { + "node": ">=0.8.x" } }, - "node_modules/ganache-core/node_modules/merkle-patricia-tree/node_modules/ethereumjs-util": { - "version": "5.2.1", + "node_modules/ganache-core/node_modules/evp_bytestokey": { + "version": "1.0.3", "dev": true, - "license": "MPL-2.0", + "license": "MIT", "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", + "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" } }, - "node_modules/ganache-core/node_modules/merkle-patricia-tree/node_modules/readable-stream": { - "version": "3.6.0", + "node_modules/ganache-core/node_modules/expand-brackets": { + "version": "2.1.4", "dev": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "engines": { - "node": ">= 6" + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/methods": { - "version": "1.1.2", + "node_modules/ganache-core/node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", "dev": true, "license": "MIT", - "optional": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/ganache-core/node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/miller-rabin": { - "version": "4.0.1", + "node_modules/ganache-core/node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" + "is-extendable": "^0.1.0" }, - "bin": { - "miller-rabin": "bin/miller-rabin" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/mime": { - "version": "1.6.0", + "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", "dev": true, "license": "MIT", - "optional": true, - "bin": { - "mime": "cli.js" + "dependencies": { + "kind-of": "^3.0.2" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/mime-db": { - "version": "1.45.0", + "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", "dev": true, "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/mime-types": { - "version": "2.1.28", + "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-buffer": { + "version": "1.1.6", + "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", "dev": true, "license": "MIT", "dependencies": { - "mime-db": "1.45.0" + "kind-of": "^3.0.2" }, "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/mimic-response": { - "version": "1.0.1", + "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", "dev": true, "license": "MIT", - "optional": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/min-document": { - "version": "2.19.0", + "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", "dev": true, + "license": "MIT", "dependencies": { - "dom-walk": "^0.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/minimalistic-assert": { - "version": "1.0.1", + "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-extendable": { + "version": "0.1.1", "dev": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/ganache-core/node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", + "node_modules/ganache-core/node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ganache-core/node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/minimatch": { - "version": "3.0.4", + "node_modules/ganache-core/node_modules/express": { + "version": "4.17.1", "dev": true, - "license": "ISC", + "license": "MIT", + "optional": true, "dependencies": { - "brace-expansion": "^1.1.7" + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" }, "engines": { - "node": "*" + "node": ">= 0.10.0" } }, - "node_modules/ganache-core/node_modules/minimist": { - "version": "1.2.5", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/minizlib": { - "version": "1.3.3", + "node_modules/ganache-core/node_modules/express/node_modules/debug": { + "version": "2.6.9", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "minipass": "^2.9.0" + "ms": "2.0.0" } }, - "node_modules/ganache-core/node_modules/minizlib/node_modules/minipass": { - "version": "2.9.0", + "node_modules/ganache-core/node_modules/express/node_modules/ms": { + "version": "2.0.0", "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } + "license": "MIT", + "optional": true }, - "node_modules/ganache-core/node_modules/mixin-deep": { - "version": "1.3.2", + "node_modules/ganache-core/node_modules/express/node_modules/qs": { + "version": "6.7.0", "dev": true, - "license": "MIT", - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, + "license": "BSD-3-Clause", + "optional": true, "engines": { - "node": ">=0.10.0" + "node": ">=0.6" } }, - "node_modules/ganache-core/node_modules/mkdirp": { - "version": "0.5.5", + "node_modules/ganache-core/node_modules/express/node_modules/safe-buffer": { + "version": "5.1.2", "dev": true, "license": "MIT", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } + "optional": true }, - "node_modules/ganache-core/node_modules/mkdirp-promise": { - "version": "5.0.1", + "node_modules/ganache-core/node_modules/ext": { + "version": "1.4.0", "dev": true, "license": "ISC", - "optional": true, "dependencies": { - "mkdirp": "*" - }, - "engines": { - "node": ">=4" + "type": "^2.0.0" } }, - "node_modules/ganache-core/node_modules/mock-fs": { - "version": "4.13.0", + "node_modules/ganache-core/node_modules/ext/node_modules/type": { + "version": "2.1.0", "dev": true, - "license": "MIT", - "optional": true + "license": "ISC" }, - "node_modules/ganache-core/node_modules/ms": { - "version": "2.1.3", + "node_modules/ganache-core/node_modules/extend": { + "version": "3.0.2", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/multibase": { - "version": "0.6.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" - } - }, - "node_modules/ganache-core/node_modules/multicodec": { - "version": "0.5.7", + "node_modules/ganache-core/node_modules/extend-shallow": { + "version": "3.0.2", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "varint": "^5.0.0" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/multihashes": { - "version": "0.4.21", + "node_modules/ganache-core/node_modules/extglob": { + "version": "2.0.4", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "buffer": "^5.5.0", - "multibase": "^0.7.0", - "varint": "^5.0.0" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/multihashes/node_modules/multibase": { - "version": "0.7.0", + "node_modules/ganache-core/node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/nano-json-stream-parser": { - "version": "0.1.2", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/nanomatch": { - "version": "1.2.13", + "node_modules/ganache-core/node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "is-extendable": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/negotiator": { - "version": "0.6.2", + "node_modules/ganache-core/node_modules/extglob/node_modules/is-extendable": { + "version": "0.1.1", "dev": true, "license": "MIT", - "optional": true, "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/next-tick": { - "version": "1.0.0", + "node_modules/ganache-core/node_modules/extsprintf": { + "version": "1.3.0", "dev": true, + "engines": [ + "node >=0.6.0" + ], "license": "MIT" }, - "node_modules/ganache-core/node_modules/nice-try": { - "version": "1.0.5", + "node_modules/ganache-core/node_modules/fake-merkle-patricia-tree": { + "version": "1.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "checkpoint-store": "^1.1.0" + } + }, + "node_modules/ganache-core/node_modules/fast-deep-equal": { + "version": "3.1.3", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/node-addon-api": { - "version": "2.0.2", + "node_modules/ganache-core/node_modules/fast-json-stable-stringify": { + "version": "2.1.0", "dev": true, - "inBundle": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/node-fetch": { - "version": "2.1.2", + "node_modules/ganache-core/node_modules/fetch-ponyfill": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "node-fetch": "~1.7.1" + } + }, + "node_modules/ganache-core/node_modules/fetch-ponyfill/node_modules/is-stream": { + "version": "1.1.0", "dev": true, "license": "MIT", "engines": { - "node": "4.x || >=6.0.0" + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/node-gyp-build": { - "version": "4.2.3", + "node_modules/ganache-core/node_modules/fetch-ponyfill/node_modules/node-fetch": { + "version": "1.7.3", "dev": true, - "inBundle": true, "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" + "dependencies": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" } }, - "node_modules/ganache-core/node_modules/normalize-url": { - "version": "4.5.0", + "node_modules/ganache-core/node_modules/finalhandler": { + "version": "1.1.2", "dev": true, "license": "MIT", "optional": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/ganache-core/node_modules/number-to-bn": { - "version": "1.7.0", + "node_modules/ganache-core/node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "ms": "2.0.0" } }, - "node_modules/ganache-core/node_modules/number-to-bn/node_modules/bn.js": { - "version": "4.11.6", + "node_modules/ganache-core/node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", "dev": true, "license": "MIT", "optional": true }, - "node_modules/ganache-core/node_modules/oauth-sign": { - "version": "0.9.0", + "node_modules/ganache-core/node_modules/find-yarn-workspace-root": { + "version": "1.2.1", "dev": true, "license": "Apache-2.0", + "dependencies": { + "fs-extra": "^4.0.3", + "micromatch": "^3.1.4" + } + }, + "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/braces": { + "version": "2.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, "engines": { - "node": "*" + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/object-assign": { - "version": "4.1.1", + "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", "dev": true, "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/object-copy": { - "version": "0.1.0", + "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/fill-range": { + "version": "4.0.0", "dev": true, "license": "MIT", "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", + "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { - "is-descriptor": "^0.1.0" + "is-extendable": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/object-copy/node_modules/is-accessor-descriptor": { - "version": "0.1.6", + "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/fs-extra": { + "version": "4.0.3", "dev": true, "license": "MIT", "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, - "node_modules/ganache-core/node_modules/object-copy/node_modules/is-buffer": { + "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/is-buffer": { "version": "1.1.6", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/object-copy/node_modules/is-data-descriptor": { - "version": "0.1.4", + "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/is-extendable": { + "version": "0.1.1", "dev": true, "license": "MIT", - "dependencies": { - "kind-of": "^3.0.2" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/object-copy/node_modules/is-descriptor": { - "version": "0.1.6", + "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/is-number": { + "version": "3.0.0", "dev": true, "license": "MIT", "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ganache-core/node_modules/object-copy/node_modules/kind-of": { + "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/is-number/node_modules/kind-of": { "version": "3.2.2", "dev": true, "license": "MIT", @@ -15388,636 +11967,615 @@ "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/object-inspect": { - "version": "1.9.0", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ganache-core/node_modules/object-is": { - "version": "1.1.4", + "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/micromatch": { + "version": "3.1.10", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ganache-core/node_modules/object-keys": { - "version": "1.1.1", - "dev": true, - "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/object-visit": { - "version": "1.0.1", + "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/to-regex-range": { + "version": "2.1.1", "dev": true, "license": "MIT", "dependencies": { - "isobject": "^3.0.0" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/object.assign": { - "version": "4.1.2", + "node_modules/ganache-core/node_modules/flow-stoplight": { + "version": "1.0.0", "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "ISC" }, - "node_modules/ganache-core/node_modules/object.getownpropertydescriptors": { - "version": "2.1.1", + "node_modules/ganache-core/node_modules/for-each": { + "version": "0.3.3", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "is-callable": "^1.1.3" } }, - "node_modules/ganache-core/node_modules/object.pick": { - "version": "1.3.0", + "node_modules/ganache-core/node_modules/for-in": { + "version": "1.0.2", "dev": true, "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/oboe": { - "version": "2.1.4", + "node_modules/ganache-core/node_modules/forever-agent": { + "version": "0.6.1", "dev": true, - "license": "BSD", - "optional": true, - "dependencies": { - "http-https": "^1.0.0" + "license": "Apache-2.0", + "engines": { + "node": "*" } }, - "node_modules/ganache-core/node_modules/on-finished": { - "version": "2.3.0", + "node_modules/ganache-core/node_modules/form-data": { + "version": "2.3.3", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "ee-first": "1.1.1" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" }, "engines": { - "node": ">= 0.8" - } - }, - "node_modules/ganache-core/node_modules/once": { - "version": "1.4.0", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" + "node": ">= 0.12" } }, - "node_modules/ganache-core/node_modules/os-homedir": { - "version": "1.0.2", + "node_modules/ganache-core/node_modules/forwarded": { + "version": "0.1.2", "dev": true, "license": "MIT", + "optional": true, "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/ganache-core/node_modules/os-tmpdir": { - "version": "1.0.2", + "node_modules/ganache-core/node_modules/fragment-cache": { + "version": "0.2.1", "dev": true, "license": "MIT", + "dependencies": { + "map-cache": "^0.2.2" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/p-cancelable": { - "version": "1.1.0", + "node_modules/ganache-core/node_modules/fresh": { + "version": "0.5.2", "dev": true, "license": "MIT", "optional": true, "engines": { - "node": ">=6" + "node": ">= 0.6" } }, - "node_modules/ganache-core/node_modules/p-timeout": { - "version": "1.2.1", + "node_modules/ganache-core/node_modules/fs-extra": { + "version": "7.0.1", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "p-finally": "^1.0.0" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">=4" + "node": ">=6 <7 || >=8" } }, - "node_modules/ganache-core/node_modules/p-timeout/node_modules/p-finally": { + "node_modules/ganache-core/node_modules/fs.realpath": { "version": "1.0.0", "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=4" - } + "license": "ISC" }, - "node_modules/ganache-core/node_modules/parse-asn1": { - "version": "5.1.6", + "node_modules/ganache-core/node_modules/function-bind": { + "version": "1.1.1", "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } + "license": "MIT" }, - "node_modules/ganache-core/node_modules/parse-headers": { - "version": "2.0.3", + "node_modules/ganache-core/node_modules/functional-red-black-tree": { + "version": "1.0.1", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/parseurl": { - "version": "1.3.3", + "node_modules/ganache-core/node_modules/get-intrinsic": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ganache-core/node_modules/get-stream": { + "version": "5.2.0", "dev": true, "license": "MIT", "optional": true, + "dependencies": { + "pump": "^3.0.0" + }, "engines": { - "node": ">= 0.8" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ganache-core/node_modules/pascalcase": { - "version": "0.1.1", + "node_modules/ganache-core/node_modules/get-value": { + "version": "2.0.6", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/patch-package": { - "version": "6.2.2", + "node_modules/ganache-core/node_modules/getpass": { + "version": "0.1.7", "dev": true, "license": "MIT", "dependencies": { - "@yarnpkg/lockfile": "^1.1.0", - "chalk": "^2.4.2", - "cross-spawn": "^6.0.5", - "find-yarn-workspace-root": "^1.2.1", - "fs-extra": "^7.0.1", - "is-ci": "^2.0.0", - "klaw-sync": "^6.0.0", - "minimist": "^1.2.0", - "rimraf": "^2.6.3", - "semver": "^5.6.0", - "slash": "^2.0.0", - "tmp": "^0.0.33" - }, - "bin": { - "patch-package": "index.js" - }, - "engines": { - "npm": ">5" + "assert-plus": "^1.0.0" } }, - "node_modules/ganache-core/node_modules/patch-package/node_modules/cross-spawn": { - "version": "6.0.5", + "node_modules/ganache-core/node_modules/glob": { + "version": "7.1.3", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=4.8" + "node": "*" } }, - "node_modules/ganache-core/node_modules/patch-package/node_modules/path-key": { - "version": "2.0.1", + "node_modules/ganache-core/node_modules/global": { + "version": "4.4.0", "dev": true, "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/ganache-core/node_modules/patch-package/node_modules/semver": { - "version": "5.7.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" } }, - "node_modules/ganache-core/node_modules/patch-package/node_modules/shebang-command": { - "version": "1.2.0", + "node_modules/ganache-core/node_modules/got": { + "version": "9.6.0", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "shebang-regex": "^1.0.0" + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8.6" } }, - "node_modules/ganache-core/node_modules/patch-package/node_modules/shebang-regex": { - "version": "1.0.0", + "node_modules/ganache-core/node_modules/got/node_modules/get-stream": { + "version": "4.1.0", "dev": true, "license": "MIT", + "optional": true, + "dependencies": { + "pump": "^3.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/ganache-core/node_modules/patch-package/node_modules/slash": { + "node_modules/ganache-core/node_modules/graceful-fs": { + "version": "4.2.4", + "dev": true, + "license": "ISC" + }, + "node_modules/ganache-core/node_modules/har-schema": { "version": "2.0.0", "dev": true, - "license": "MIT", + "license": "ISC", "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/ganache-core/node_modules/patch-package/node_modules/tmp": { - "version": "0.0.33", + "node_modules/ganache-core/node_modules/har-validator": { + "version": "5.1.5", "dev": true, "license": "MIT", "dependencies": { - "os-tmpdir": "~1.0.2" + "ajv": "^6.12.3", + "har-schema": "^2.0.0" }, "engines": { - "node": ">=0.6.0" + "node": ">=6" } }, - "node_modules/ganache-core/node_modules/patch-package/node_modules/which": { - "version": "1.3.1", + "node_modules/ganache-core/node_modules/has": { + "version": "1.0.3", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" + "function-bind": "^1.1.1" }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/ganache-core/node_modules/path-is-absolute": { - "version": "1.0.1", - "dev": true, - "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.4.0" } }, - "node_modules/ganache-core/node_modules/path-parse": { - "version": "1.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/path-to-regexp": { - "version": "0.1.7", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/pbkdf2": { - "version": "3.1.1", + "node_modules/ganache-core/node_modules/has-ansi": { + "version": "2.0.0", "dev": true, "license": "MIT", "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "ansi-regex": "^2.0.0" }, "engines": { - "node": ">=0.12" + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/performance-now": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/posix-character-classes": { - "version": "0.1.1", + "node_modules/ganache-core/node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/precond": { - "version": "0.2.3", + "node_modules/ganache-core/node_modules/has-flag": { + "version": "3.0.0", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=4" } }, - "node_modules/ganache-core/node_modules/prepend-http": { - "version": "2.0.0", + "node_modules/ganache-core/node_modules/has-symbol-support-x": { + "version": "1.4.2", "dev": true, "license": "MIT", "optional": true, "engines": { - "node": ">=4" + "node": "*" } }, - "node_modules/ganache-core/node_modules/private": { - "version": "0.1.8", + "node_modules/ganache-core/node_modules/has-symbols": { + "version": "1.0.1", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ganache-core/node_modules/process": { - "version": "0.11.10", + "node_modules/ganache-core/node_modules/has-to-string-tag-x": { + "version": "1.4.1", "dev": true, "license": "MIT", + "optional": true, + "dependencies": { + "has-symbol-support-x": "^1.4.1" + }, "engines": { - "node": ">= 0.6.0" + "node": "*" } }, - "node_modules/ganache-core/node_modules/process-nextick-args": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/promise-to-callback": { + "node_modules/ganache-core/node_modules/has-value": { "version": "1.0.0", "dev": true, "license": "MIT", "dependencies": { - "is-fn": "^1.0.0", - "set-immediate-shim": "^1.0.1" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/proxy-addr": { - "version": "2.0.6", + "node_modules/ganache-core/node_modules/has-values": { + "version": "1.0.0", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.1" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "engines": { - "node": ">= 0.10" - } - }, - "node_modules/ganache-core/node_modules/prr": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/pseudomap": { - "version": "1.0.2", - "dev": true, - "license": "ISC" - }, - "node_modules/ganache-core/node_modules/psl": { - "version": "1.8.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/public-encrypt": { - "version": "4.0.3", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/ganache-core/node_modules/pull-cat": { - "version": "1.1.11", - "dev": true, - "license": "MIT" + "node": ">=0.10.0" + } }, - "node_modules/ganache-core/node_modules/pull-defer": { - "version": "0.2.3", + "node_modules/ganache-core/node_modules/has-values/node_modules/is-buffer": { + "version": "1.1.6", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/pull-level": { - "version": "2.0.4", + "node_modules/ganache-core/node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", "dev": true, "license": "MIT", "dependencies": { - "level-post": "^1.0.7", - "pull-cat": "^1.1.9", - "pull-live": "^1.0.1", - "pull-pushable": "^2.0.0", - "pull-stream": "^3.4.0", - "pull-window": "^2.1.4", - "stream-to-pull-stream": "^1.7.1" + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/pull-live": { - "version": "1.0.1", + "node_modules/ganache-core/node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", "dev": true, "license": "MIT", "dependencies": { - "pull-cat": "^1.1.9", - "pull-stream": "^3.4.0" + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/pull-pushable": { - "version": "2.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/pull-stream": { - "version": "3.6.14", + "node_modules/ganache-core/node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/ganache-core/node_modules/pull-window": { - "version": "2.1.4", + "node_modules/ganache-core/node_modules/hash-base": { + "version": "3.1.0", "dev": true, "license": "MIT", "dependencies": { - "looper": "^2.0.0" + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/ganache-core/node_modules/pump": { - "version": "3.0.0", + "node_modules/ganache-core/node_modules/hash-base/node_modules/readable-stream": { + "version": "3.6.0", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/ganache-core/node_modules/punycode": { - "version": "2.1.1", + "node_modules/ganache-core/node_modules/hash.js": { + "version": "1.1.7", "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, - "node_modules/ganache-core/node_modules/qs": { - "version": "6.5.2", + "node_modules/ganache-core/node_modules/heap": { + "version": "0.2.6", + "dev": true + }, + "node_modules/ganache-core/node_modules/hmac-drbg": { + "version": "1.0.1", "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.6" + "license": "MIT", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/ganache-core/node_modules/query-string": { - "version": "5.1.1", + "node_modules/ganache-core/node_modules/home-or-tmp": { + "version": "2.0.0", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/randombytes": { - "version": "2.1.0", + "node_modules/ganache-core/node_modules/http-cache-semantics": { + "version": "4.1.0", + "dev": true, + "license": "BSD-2-Clause", + "optional": true + }, + "node_modules/ganache-core/node_modules/http-errors": { + "version": "1.7.2", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "safe-buffer": "^5.1.0" + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" } }, - "node_modules/ganache-core/node_modules/randomfill": { - "version": "1.0.4", + "node_modules/ganache-core/node_modules/http-errors/node_modules/inherits": { + "version": "2.0.3", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/ganache-core/node_modules/http-https": { + "version": "1.0.0", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/ganache-core/node_modules/http-signature": { + "version": "1.2.0", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" } }, - "node_modules/ganache-core/node_modules/range-parser": { - "version": "1.2.1", + "node_modules/ganache-core/node_modules/iconv-lite": { + "version": "0.4.24", "dev": true, "license": "MIT", "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/raw-body": { - "version": "2.4.0", + "node_modules/ganache-core/node_modules/idna-uts46-hx": { + "version": "2.3.1", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "punycode": "2.1.0" }, "engines": { - "node": ">= 0.8" + "node": ">=4.0.0" } }, - "node_modules/ganache-core/node_modules/readable-stream": { - "version": "2.3.7", + "node_modules/ganache-core/node_modules/idna-uts46-hx/node_modules/punycode": { + "version": "2.1.0", "dev": true, "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "optional": true, + "engines": { + "node": ">=6" } }, - "node_modules/ganache-core/node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", + "node_modules/ganache-core/node_modules/ieee754": { + "version": "1.2.1", "dev": true, - "license": "MIT" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" }, - "node_modules/ganache-core/node_modules/regenerate": { - "version": "1.4.2", + "node_modules/ganache-core/node_modules/immediate": { + "version": "3.2.3", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/regenerator-runtime": { - "version": "0.11.1", + "node_modules/ganache-core/node_modules/inflight": { + "version": "1.0.6", "dev": true, - "license": "MIT" + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } }, - "node_modules/ganache-core/node_modules/regenerator-transform": { - "version": "0.10.1", + "node_modules/ganache-core/node_modules/inherits": { + "version": "2.0.4", "dev": true, - "license": "BSD", + "license": "ISC" + }, + "node_modules/ganache-core/node_modules/invariant": { + "version": "2.2.4", + "dev": true, + "license": "MIT", "dependencies": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" + "loose-envify": "^1.0.0" } }, - "node_modules/ganache-core/node_modules/regex-not": { - "version": "1.0.2", + "node_modules/ganache-core/node_modules/ipaddr.js": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ganache-core/node_modules/is-accessor-descriptor": { + "version": "1.0.0", "dev": true, "license": "MIT", "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" + "kind-of": "^6.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/regexp.prototype.flags": { - "version": "1.3.0", + "node_modules/ganache-core/node_modules/is-arguments": { + "version": "1.1.0", "dev": true, "license": "MIT", "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "call-bind": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -16026,23 +12584,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ganache-core/node_modules/regexp.prototype.flags/node_modules/es-abstract": { - "version": "1.17.7", + "node_modules/ganache-core/node_modules/is-callable": { + "version": "1.2.2", "dev": true, "license": "MIT", - "dependencies": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - }, "engines": { "node": ">= 0.4" }, @@ -16050,5466 +12595,5132 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ganache-core/node_modules/regexpu-core": { + "node_modules/ganache-core/node_modules/is-ci": { "version": "2.0.0", "dev": true, "license": "MIT", "dependencies": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" } }, - "node_modules/ganache-core/node_modules/regjsgen": { - "version": "0.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/regjsparser": { - "version": "0.1.5", + "node_modules/ganache-core/node_modules/is-data-descriptor": { + "version": "1.0.0", "dev": true, - "license": "BSD", + "license": "MIT", "dependencies": { - "jsesc": "~0.5.0" + "kind-of": "^6.0.0" }, - "bin": { - "regjsparser": "bin/parser" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", + "node_modules/ganache-core/node_modules/is-date-object": { + "version": "1.0.2", "dev": true, - "bin": { - "jsesc": "bin/jsesc" + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ganache-core/node_modules/repeat-element": { - "version": "1.1.3", + "node_modules/ganache-core/node_modules/is-descriptor": { + "version": "1.0.2", "dev": true, "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/repeat-string": { - "version": "1.6.1", + "node_modules/ganache-core/node_modules/is-extendable": { + "version": "1.0.1", "dev": true, "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, "engines": { - "node": ">=0.10" + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/repeating": { - "version": "2.0.1", + "node_modules/ganache-core/node_modules/is-finite": { + "version": "1.1.0", "dev": true, "license": "MIT", - "dependencies": { - "is-finite": "^1.0.0" - }, "engines": { "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ganache-core/node_modules/request": { - "version": "2.88.2", + "node_modules/ganache-core/node_modules/is-fn": { + "version": "1.0.0", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, + "license": "MIT", "engines": { - "node": ">= 6" + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/resolve-url": { - "version": "0.2.1", + "node_modules/ganache-core/node_modules/is-function": { + "version": "1.0.2", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/responselike": { + "node_modules/ganache-core/node_modules/is-hex-prefixed": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/ganache-core/node_modules/is-negative-zero": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ganache-core/node_modules/is-object": { "version": "1.0.2", "dev": true, "license": "MIT", "optional": true, - "dependencies": { - "lowercase-keys": "^1.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ganache-core/node_modules/resumer": { - "version": "0.0.0", + "node_modules/ganache-core/node_modules/is-plain-obj": { + "version": "1.1.0", "dev": true, "license": "MIT", - "dependencies": { - "through": "~2.3.4" + "optional": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/ret": { - "version": "0.1.15", + "node_modules/ganache-core/node_modules/is-plain-object": { + "version": "2.0.4", "dev": true, "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, "engines": { - "node": ">=0.12" + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/rimraf": { - "version": "2.6.3", + "node_modules/ganache-core/node_modules/is-regex": { + "version": "1.1.1", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "has-symbols": "^1.0.1" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ganache-core/node_modules/ripemd160": { - "version": "2.0.2", + "node_modules/ganache-core/node_modules/is-retry-allowed": { + "version": "1.2.0", "dev": true, "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "optional": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/rlp": { - "version": "2.2.6", + "node_modules/ganache-core/node_modules/is-symbol": { + "version": "1.0.3", "dev": true, - "license": "MPL-2.0", + "license": "MIT", "dependencies": { - "bn.js": "^4.11.1" + "has-symbols": "^1.0.1" }, - "bin": { - "rlp": "bin/rlp" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ganache-core/node_modules/rustbn.js": { - "version": "0.2.0", - "dev": true, - "license": "(MIT OR Apache-2.0)" - }, - "node_modules/ganache-core/node_modules/safe-buffer": { - "version": "5.2.1", + "node_modules/ganache-core/node_modules/is-typedarray": { + "version": "1.0.0", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "license": "MIT" }, - "node_modules/ganache-core/node_modules/safe-event-emitter": { - "version": "1.0.1", + "node_modules/ganache-core/node_modules/is-windows": { + "version": "1.0.2", "dev": true, - "license": "ISC", - "dependencies": { - "events": "^3.0.0" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/safe-regex": { - "version": "1.1.0", + "node_modules/ganache-core/node_modules/isarray": { + "version": "1.0.0", "dev": true, - "license": "MIT", - "dependencies": { - "ret": "~0.1.10" - } + "license": "MIT" }, - "node_modules/ganache-core/node_modules/safer-buffer": { - "version": "2.1.2", + "node_modules/ganache-core/node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/ganache-core/node_modules/isobject": { + "version": "3.0.1", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/ganache-core/node_modules/scrypt-js": { - "version": "3.0.1", + "node_modules/ganache-core/node_modules/isstream": { + "version": "0.1.2", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/scryptsy": { - "version": "1.2.1", + "node_modules/ganache-core/node_modules/isurl": { + "version": "1.0.0", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "pbkdf2": "^3.0.3" + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" + }, + "engines": { + "node": ">= 4" } }, - "node_modules/ganache-core/node_modules/secp256k1": { - "version": "4.0.2", + "node_modules/ganache-core/node_modules/js-sha3": { + "version": "0.5.7", "dev": true, - "hasInstallScript": true, "license": "MIT", - "dependencies": { - "elliptic": "^6.5.2", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - }, - "engines": { - "node": ">=10.0.0" - } + "optional": true }, - "node_modules/ganache-core/node_modules/seedrandom": { - "version": "3.0.1", + "node_modules/ganache-core/node_modules/js-tokens": { + "version": "4.0.0", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/semaphore": { - "version": "1.1.0", + "node_modules/ganache-core/node_modules/jsbn": { + "version": "0.1.1", "dev": true, - "engines": { - "node": ">=0.8.0" - } + "license": "MIT" }, - "node_modules/ganache-core/node_modules/send": { - "version": "0.17.1", + "node_modules/ganache-core/node_modules/json-buffer": { + "version": "3.0.0", "dev": true, "license": "MIT", - "optional": true, + "optional": true + }, + "node_modules/ganache-core/node_modules/json-rpc-engine": { + "version": "3.8.0", + "dev": true, + "license": "ISC", "dependencies": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "engines": { - "node": ">= 0.8.0" + "async": "^2.0.1", + "babel-preset-env": "^1.7.0", + "babelify": "^7.3.0", + "json-rpc-error": "^2.0.0", + "promise-to-callback": "^1.0.0", + "safe-event-emitter": "^1.0.1" } }, - "node_modules/ganache-core/node_modules/send/node_modules/debug": { - "version": "2.6.9", + "node_modules/ganache-core/node_modules/json-rpc-error": { + "version": "2.0.0", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "ms": "2.0.0" + "inherits": "^2.0.1" } }, - "node_modules/ganache-core/node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", + "node_modules/ganache-core/node_modules/json-rpc-random-id": { + "version": "1.0.1", "dev": true, - "license": "MIT", - "optional": true + "license": "ISC" }, - "node_modules/ganache-core/node_modules/send/node_modules/ms": { - "version": "2.1.1", + "node_modules/ganache-core/node_modules/json-schema": { + "version": "0.2.3", + "dev": true + }, + "node_modules/ganache-core/node_modules/json-schema-traverse": { + "version": "0.4.1", "dev": true, - "license": "MIT", - "optional": true + "license": "MIT" }, - "node_modules/ganache-core/node_modules/serve-static": { - "version": "1.14.1", + "node_modules/ganache-core/node_modules/json-stable-stringify": { + "version": "1.0.1", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - }, - "engines": { - "node": ">= 0.8.0" + "jsonify": "~0.0.0" } }, - "node_modules/ganache-core/node_modules/servify": { - "version": "0.1.12", + "node_modules/ganache-core/node_modules/json-stringify-safe": { + "version": "5.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/ganache-core/node_modules/jsonfile": { + "version": "4.0.0", "dev": true, "license": "MIT", - "optional": true, - "dependencies": { - "body-parser": "^1.16.0", - "cors": "^2.8.1", - "express": "^4.14.0", - "request": "^2.79.0", - "xhr": "^2.3.3" - }, - "engines": { - "node": ">=6" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/ganache-core/node_modules/set-immediate-shim": { - "version": "1.0.1", + "node_modules/ganache-core/node_modules/jsonify": { + "version": "0.0.0", + "dev": true, + "license": "Public Domain" + }, + "node_modules/ganache-core/node_modules/jsprim": { + "version": "1.4.1", "dev": true, + "engines": [ + "node >=0.6.0" + ], "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" } }, - "node_modules/ganache-core/node_modules/set-value": { - "version": "2.0.1", + "node_modules/ganache-core/node_modules/keccak": { + "version": "3.0.1", "dev": true, + "hasInstallScript": true, + "inBundle": true, "license": "MIT", "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10.0.0" } }, - "node_modules/ganache-core/node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", + "node_modules/ganache-core/node_modules/keyv": { + "version": "3.1.0", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" + "json-buffer": "3.0.0" } }, - "node_modules/ganache-core/node_modules/set-value/node_modules/is-extendable": { - "version": "0.1.1", + "node_modules/ganache-core/node_modules/kind-of": { + "version": "6.0.3", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/setimmediate": { - "version": "1.0.5", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/setprototypeof": { - "version": "1.1.1", - "dev": true, - "license": "ISC", - "optional": true - }, - "node_modules/ganache-core/node_modules/sha.js": { - "version": "2.4.11", + "node_modules/ganache-core/node_modules/klaw-sync": { + "version": "6.0.0", "dev": true, - "license": "(MIT AND BSD-3-Clause)", + "license": "MIT", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" + "graceful-fs": "^4.1.11" } }, - "node_modules/ganache-core/node_modules/simple-concat": { - "version": "1.0.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/simple-get": { - "version": "2.8.1", + "node_modules/ganache-core/node_modules/level-codec": { + "version": "9.0.2", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "decompress-response": "^3.3.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" + "buffer": "^5.6.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/ganache-core/node_modules/snapdragon": { - "version": "0.8.2", + "node_modules/ganache-core/node_modules/level-errors": { + "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" + "errno": "~0.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ganache-core/node_modules/level-iterator-stream": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.5", + "xtend": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/ganache-core/node_modules/snapdragon-node": { - "version": "2.1.1", + "node_modules/ganache-core/node_modules/level-mem": { + "version": "3.0.1", "dev": true, "license": "MIT", "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" + "level-packager": "~4.0.0", + "memdown": "~3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/ganache-core/node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", + "node_modules/ganache-core/node_modules/level-mem/node_modules/abstract-leveldown": { + "version": "5.0.0", "dev": true, "license": "MIT", "dependencies": { - "is-descriptor": "^1.0.0" + "xtend": "~4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/ganache-core/node_modules/snapdragon-util": { - "version": "3.0.1", + "node_modules/ganache-core/node_modules/level-mem/node_modules/ltgt": { + "version": "2.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/level-mem/node_modules/memdown": { + "version": "3.0.0", "dev": true, "license": "MIT", "dependencies": { - "kind-of": "^3.2.0" + "abstract-leveldown": "~5.0.0", + "functional-red-black-tree": "~1.0.1", + "immediate": "~3.2.3", + "inherits": "~2.0.1", + "ltgt": "~2.2.0", + "safe-buffer": "~5.1.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/ganache-core/node_modules/snapdragon-util/node_modules/is-buffer": { - "version": "1.1.6", + "node_modules/ganache-core/node_modules/level-mem/node_modules/safe-buffer": { + "version": "5.1.2", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", + "node_modules/ganache-core/node_modules/level-packager": { + "version": "4.0.1", "dev": true, "license": "MIT", "dependencies": { - "is-buffer": "^1.1.5" + "encoding-down": "~5.0.0", + "levelup": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/ganache-core/node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", + "node_modules/ganache-core/node_modules/level-post": { + "version": "1.0.7", "dev": true, "license": "MIT", "dependencies": { - "ms": "2.0.0" + "ltgt": "^2.1.2" } }, - "node_modules/ganache-core/node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", + "node_modules/ganache-core/node_modules/level-sublevel": { + "version": "6.6.4", "dev": true, "license": "MIT", "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" + "bytewise": "~1.1.0", + "level-codec": "^9.0.0", + "level-errors": "^2.0.0", + "level-iterator-stream": "^2.0.3", + "ltgt": "~2.1.1", + "pull-defer": "^0.2.2", + "pull-level": "^2.0.3", + "pull-stream": "^3.6.8", + "typewiselite": "~1.0.0", + "xtend": "~4.0.0" } }, - "node_modules/ganache-core/node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", + "node_modules/ganache-core/node_modules/level-ws": { + "version": "1.0.0", "dev": true, "license": "MIT", "dependencies": { - "is-extendable": "^0.1.0" + "inherits": "^2.0.3", + "readable-stream": "^2.2.8", + "xtend": "^4.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-accessor-descriptor": { - "version": "0.1.6", + "node_modules/ganache-core/node_modules/levelup": { + "version": "3.1.1", "dev": true, "license": "MIT", "dependencies": { - "kind-of": "^3.0.2" + "deferred-leveldown": "~4.0.0", + "level-errors": "~2.0.0", + "level-iterator-stream": "~3.0.0", + "xtend": "~4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", + "node_modules/ganache-core/node_modules/levelup/node_modules/level-iterator-stream": { + "version": "3.0.1", "dev": true, "license": "MIT", "dependencies": { - "is-buffer": "^1.1.5" + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "xtend": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-buffer": { - "version": "1.1.6", + "node_modules/ganache-core/node_modules/lodash": { + "version": "4.17.20", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-data-descriptor": { - "version": "0.1.4", + "node_modules/ganache-core/node_modules/looper": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/loose-envify": { + "version": "1.4.0", "dev": true, "license": "MIT", "dependencies": { - "kind-of": "^3.0.2" + "js-tokens": "^3.0.0 || ^4.0.0" }, - "engines": { - "node": ">=0.10.0" + "bin": { + "loose-envify": "cli.js" } }, - "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", + "node_modules/ganache-core/node_modules/lowercase-keys": { + "version": "1.0.1", "dev": true, "license": "MIT", - "dependencies": { - "is-buffer": "^1.1.5" - }, + "optional": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-descriptor": { - "version": "0.1.6", + "node_modules/ganache-core/node_modules/lru-cache": { + "version": "5.1.1", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" + "yallist": "^3.0.2" } }, - "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-extendable": { - "version": "0.1.1", + "node_modules/ganache-core/node_modules/ltgt": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/map-cache": { + "version": "0.2.2", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/snapdragon/node_modules/kind-of": { - "version": "5.1.0", + "node_modules/ganache-core/node_modules/map-visit": { + "version": "1.0.0", "dev": true, "license": "MIT", + "dependencies": { + "object-visit": "^1.0.0" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/snapdragon/node_modules/ms": { - "version": "2.0.0", + "node_modules/ganache-core/node_modules/md5.js": { + "version": "1.3.5", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } }, - "node_modules/ganache-core/node_modules/source-map": { - "version": "0.5.7", + "node_modules/ganache-core/node_modules/media-typer": { + "version": "0.3.0", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", + "optional": true, "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/ganache-core/node_modules/source-map-resolve": { - "version": "0.5.3", + "node_modules/ganache-core/node_modules/merge-descriptors": { + "version": "1.0.1", "dev": true, "license": "MIT", + "optional": true + }, + "node_modules/ganache-core/node_modules/merkle-patricia-tree": { + "version": "3.0.0", + "dev": true, + "license": "MPL-2.0", "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "async": "^2.6.1", + "ethereumjs-util": "^5.2.0", + "level-mem": "^3.0.1", + "level-ws": "^1.0.0", + "readable-stream": "^3.0.6", + "rlp": "^2.0.0", + "semaphore": ">=1.0.1" } }, - "node_modules/ganache-core/node_modules/source-map-support": { - "version": "0.5.12", + "node_modules/ganache-core/node_modules/merkle-patricia-tree/node_modules/ethereumjs-util": { + "version": "5.2.1", "dev": true, - "license": "MIT", + "license": "MPL-2.0", "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/ganache-core/node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", + "node_modules/ganache-core/node_modules/merkle-patricia-tree/node_modules/readable-stream": { + "version": "3.6.0", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/ganache-core/node_modules/source-map-url": { - "version": "0.4.0", + "node_modules/ganache-core/node_modules/methods": { + "version": "1.1.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.6" + } }, - "node_modules/ganache-core/node_modules/split-string": { - "version": "3.1.0", + "node_modules/ganache-core/node_modules/miller-rabin": { + "version": "4.0.1", "dev": true, "license": "MIT", "dependencies": { - "extend-shallow": "^3.0.0" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" }, - "engines": { - "node": ">=0.10.0" + "bin": { + "miller-rabin": "bin/miller-rabin" } }, - "node_modules/ganache-core/node_modules/sshpk": { - "version": "1.16.1", + "node_modules/ganache-core/node_modules/mime": { + "version": "1.6.0", "dev": true, "license": "MIT", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" + "optional": true, + "bin": { + "mime": "cli.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/ganache-core/node_modules/sshpk/node_modules/tweetnacl": { - "version": "0.14.5", + "node_modules/ganache-core/node_modules/mime-db": { + "version": "1.45.0", "dev": true, - "license": "Unlicense" + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, - "node_modules/ganache-core/node_modules/static-extend": { - "version": "0.1.2", + "node_modules/ganache-core/node_modules/mime-types": { + "version": "2.1.28", "dev": true, "license": "MIT", "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" + "mime-db": "1.45.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/ganache-core/node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", + "node_modules/ganache-core/node_modules/mimic-response": { + "version": "1.0.1", "dev": true, "license": "MIT", - "dependencies": { - "is-descriptor": "^0.1.0" - }, + "optional": true, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/ganache-core/node_modules/static-extend/node_modules/is-accessor-descriptor": { - "version": "0.1.6", + "node_modules/ganache-core/node_modules/min-document": { + "version": "2.19.0", "dev": true, - "license": "MIT", "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" + "dom-walk": "^0.1.0" } }, - "node_modules/ganache-core/node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", + "node_modules/ganache-core/node_modules/minimalistic-assert": { + "version": "1.0.1", "dev": true, - "license": "MIT", + "license": "ISC" + }, + "node_modules/ganache-core/node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/minimatch": { + "version": "3.0.4", + "dev": true, + "license": "ISC", "dependencies": { - "is-buffer": "^1.1.5" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "node_modules/ganache-core/node_modules/static-extend/node_modules/is-buffer": { - "version": "1.1.6", + "node_modules/ganache-core/node_modules/minimist": { + "version": "1.2.5", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/static-extend/node_modules/is-data-descriptor": { - "version": "0.1.4", + "node_modules/ganache-core/node_modules/minizlib": { + "version": "1.3.3", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" + "minipass": "^2.9.0" } }, - "node_modules/ganache-core/node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", + "node_modules/ganache-core/node_modules/minizlib/node_modules/minipass": { + "version": "2.9.0", "dev": true, - "license": "MIT", + "license": "ISC", + "optional": true, "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" } }, - "node_modules/ganache-core/node_modules/static-extend/node_modules/is-descriptor": { - "version": "0.1.6", + "node_modules/ganache-core/node_modules/mixin-deep": { + "version": "1.3.2", "dev": true, "license": "MIT", "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/static-extend/node_modules/kind-of": { - "version": "5.1.0", + "node_modules/ganache-core/node_modules/mkdirp": { + "version": "0.5.5", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" } }, - "node_modules/ganache-core/node_modules/statuses": { - "version": "1.5.0", + "node_modules/ganache-core/node_modules/mkdirp-promise": { + "version": "5.0.1", "dev": true, - "license": "MIT", + "license": "ISC", "optional": true, + "dependencies": { + "mkdirp": "*" + }, "engines": { - "node": ">= 0.6" + "node": ">=4" } }, - "node_modules/ganache-core/node_modules/stream-to-pull-stream": { - "version": "1.7.3", + "node_modules/ganache-core/node_modules/mock-fs": { + "version": "4.13.0", "dev": true, "license": "MIT", - "dependencies": { - "looper": "^3.0.0", - "pull-stream": "^3.2.3" - } + "optional": true }, - "node_modules/ganache-core/node_modules/stream-to-pull-stream/node_modules/looper": { - "version": "3.0.0", + "node_modules/ganache-core/node_modules/ms": { + "version": "2.1.3", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/strict-uri-encode": { - "version": "1.1.0", + "node_modules/ganache-core/node_modules/multibase": { + "version": "0.6.1", "dev": true, "license": "MIT", "optional": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "base-x": "^3.0.8", + "buffer": "^5.5.0" } }, - "node_modules/ganache-core/node_modules/string_decoder": { - "version": "1.1.1", + "node_modules/ganache-core/node_modules/multicodec": { + "version": "0.5.7", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "safe-buffer": "~5.1.0" + "varint": "^5.0.0" } }, - "node_modules/ganache-core/node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", + "node_modules/ganache-core/node_modules/multihashes": { + "version": "0.4.21", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "dependencies": { + "buffer": "^5.5.0", + "multibase": "^0.7.0", + "varint": "^5.0.0" + } }, - "node_modules/ganache-core/node_modules/string.prototype.trim": { - "version": "1.2.3", + "node_modules/ganache-core/node_modules/multihashes/node_modules/multibase": { + "version": "0.7.0", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "base-x": "^3.0.8", + "buffer": "^5.5.0" } }, - "node_modules/ganache-core/node_modules/string.prototype.trimend": { - "version": "1.0.3", + "node_modules/ganache-core/node_modules/nano-json-stream-parser": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/ganache-core/node_modules/nanomatch": { + "version": "1.2.13", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/string.prototype.trimstart": { - "version": "1.0.3", + "node_modules/ganache-core/node_modules/negotiator": { + "version": "0.6.2", "dev": true, "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optional": true, + "engines": { + "node": ">= 0.6" } }, - "node_modules/ganache-core/node_modules/strip-hex-prefix": { + "node_modules/ganache-core/node_modules/next-tick": { "version": "1.0.0", "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/nice-try": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/node-addon-api": { + "version": "2.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/node-fetch": { + "version": "2.1.2", + "dev": true, "license": "MIT", - "dependencies": { - "is-hex-prefixed": "1.0.0" - }, "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "node": "4.x || >=6.0.0" } }, - "node_modules/ganache-core/node_modules/supports-color": { - "version": "5.5.0", + "node_modules/ganache-core/node_modules/node-gyp-build": { + "version": "4.2.3", "dev": true, + "inBundle": true, "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" } }, - "node_modules/ganache-core/node_modules/swarm-js": { - "version": "0.1.40", + "node_modules/ganache-core/node_modules/normalize-url": { + "version": "4.5.0", "dev": true, "license": "MIT", "optional": true, - "dependencies": { - "bluebird": "^3.5.0", - "buffer": "^5.0.5", - "eth-lib": "^0.1.26", - "fs-extra": "^4.0.2", - "got": "^7.1.0", - "mime-types": "^2.1.16", - "mkdirp-promise": "^5.0.1", - "mock-fs": "^4.1.0", - "setimmediate": "^1.0.5", - "tar": "^4.0.2", - "xhr-request": "^1.0.1" + "engines": { + "node": ">=8" } }, - "node_modules/ganache-core/node_modules/swarm-js/node_modules/fs-extra": { - "version": "4.0.3", + "node_modules/ganache-core/node_modules/number-to-bn": { + "version": "1.7.0", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "bn.js": "4.11.6", + "strip-hex-prefix": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" } }, - "node_modules/ganache-core/node_modules/swarm-js/node_modules/get-stream": { - "version": "3.0.0", + "node_modules/ganache-core/node_modules/number-to-bn/node_modules/bn.js": { + "version": "4.11.6", "dev": true, "license": "MIT", - "optional": true, + "optional": true + }, + "node_modules/ganache-core/node_modules/oauth-sign": { + "version": "0.9.0", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=4" + "node": "*" } }, - "node_modules/ganache-core/node_modules/swarm-js/node_modules/got": { - "version": "7.1.0", + "node_modules/ganache-core/node_modules/object-assign": { + "version": "4.1.1", "dev": true, "license": "MIT", - "optional": true, - "dependencies": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" - }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/swarm-js/node_modules/is-stream": { - "version": "1.1.0", + "node_modules/ganache-core/node_modules/object-copy": { + "version": "0.1.0", "dev": true, "license": "MIT", - "optional": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/swarm-js/node_modules/p-cancelable": { - "version": "0.3.0", + "node_modules/ganache-core/node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", "dev": true, "license": "MIT", - "optional": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/swarm-js/node_modules/prepend-http": { - "version": "1.0.4", + "node_modules/ganache-core/node_modules/object-copy/node_modules/is-accessor-descriptor": { + "version": "0.1.6", "dev": true, "license": "MIT", - "optional": true, + "dependencies": { + "kind-of": "^3.0.2" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/swarm-js/node_modules/url-parse-lax": { - "version": "1.0.0", + "node_modules/ganache-core/node_modules/object-copy/node_modules/is-buffer": { + "version": "1.1.6", + "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/object-copy/node_modules/is-data-descriptor": { + "version": "0.1.4", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "prepend-http": "^1.0.1" + "kind-of": "^3.0.2" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/tape": { - "version": "4.13.3", + "node_modules/ganache-core/node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.6", "dev": true, "license": "MIT", "dependencies": { - "deep-equal": "~1.1.1", - "defined": "~1.0.0", - "dotignore": "~0.1.2", - "for-each": "~0.3.3", - "function-bind": "~1.1.1", - "glob": "~7.1.6", - "has": "~1.0.3", - "inherits": "~2.0.4", - "is-regex": "~1.0.5", - "minimist": "~1.2.5", - "object-inspect": "~1.7.0", - "resolve": "~1.17.0", - "resumer": "~0.0.0", - "string.prototype.trim": "~1.2.1", - "through": "~2.3.8" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, - "bin": { - "tape": "bin/tape" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/tape/node_modules/glob": { - "version": "7.1.6", + "node_modules/ganache-core/node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, + "license": "MIT", "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/tape/node_modules/is-regex": { - "version": "1.0.5", + "node_modules/ganache-core/node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", "dev": true, "license": "MIT", "dependencies": { - "has": "^1.0.3" + "is-buffer": "^1.1.5" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/tape/node_modules/object-inspect": { - "version": "1.7.0", + "node_modules/ganache-core/node_modules/object-inspect": { + "version": "1.9.0", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ganache-core/node_modules/tape/node_modules/resolve": { - "version": "1.17.0", + "node_modules/ganache-core/node_modules/object-is": { + "version": "1.1.4", "dev": true, "license": "MIT", "dependencies": { - "path-parse": "^1.0.6" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ganache-core/node_modules/tar": { - "version": "4.4.13", + "node_modules/ganache-core/node_modules/object-keys": { + "version": "1.1.1", "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - }, + "license": "MIT", "engines": { - "node": ">=4.5" - } - }, - "node_modules/ganache-core/node_modules/tar/node_modules/fs-minipass": { - "version": "1.2.7", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^2.6.0" - } - }, - "node_modules/ganache-core/node_modules/tar/node_modules/minipass": { - "version": "2.9.0", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "node": ">= 0.4" } }, - "node_modules/ganache-core/node_modules/through": { - "version": "2.3.8", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/through2": { - "version": "2.0.5", + "node_modules/ganache-core/node_modules/object-visit": { + "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/timed-out": { - "version": "4.0.1", + "node_modules/ganache-core/node_modules/object.assign": { + "version": "4.1.2", "dev": true, "license": "MIT", - "optional": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ganache-core/node_modules/tmp": { - "version": "0.1.0", + "node_modules/ganache-core/node_modules/object.getownpropertydescriptors": { + "version": "2.1.1", "dev": true, "license": "MIT", "dependencies": { - "rimraf": "^2.6.3" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" }, "engines": { - "node": ">=6" + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ganache-core/node_modules/to-object-path": { - "version": "0.3.0", + "node_modules/ganache-core/node_modules/object.pick": { + "version": "1.3.0", "dev": true, "license": "MIT", "dependencies": { - "kind-of": "^3.0.2" + "isobject": "^3.0.1" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/to-object-path/node_modules/is-buffer": { - "version": "1.1.6", + "node_modules/ganache-core/node_modules/oboe": { + "version": "2.1.4", "dev": true, - "license": "MIT" + "license": "BSD", + "optional": true, + "dependencies": { + "http-https": "^1.0.0" + } }, - "node_modules/ganache-core/node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", + "node_modules/ganache-core/node_modules/on-finished": { + "version": "2.3.0", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "is-buffer": "^1.1.5" + "ee-first": "1.1.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "node_modules/ganache-core/node_modules/to-readable-stream": { - "version": "1.0.0", + "node_modules/ganache-core/node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/ganache-core/node_modules/os-homedir": { + "version": "1.0.2", "dev": true, "license": "MIT", - "optional": true, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/to-regex": { - "version": "3.0.2", + "node_modules/ganache-core/node_modules/os-tmpdir": { + "version": "1.0.2", "dev": true, "license": "MIT", - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/toidentifier": { - "version": "1.0.0", + "node_modules/ganache-core/node_modules/p-cancelable": { + "version": "1.1.0", "dev": true, "license": "MIT", "optional": true, "engines": { - "node": ">=0.6" + "node": ">=6" } }, - "node_modules/ganache-core/node_modules/tough-cookie": { - "version": "2.5.0", + "node_modules/ganache-core/node_modules/p-timeout": { + "version": "1.2.1", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", + "optional": true, "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "p-finally": "^1.0.0" }, "engines": { - "node": ">=0.8" + "node": ">=4" } }, - "node_modules/ganache-core/node_modules/trim-right": { - "version": "1.0.1", + "node_modules/ganache-core/node_modules/p-timeout/node_modules/p-finally": { + "version": "1.0.0", "dev": true, "license": "MIT", + "optional": true, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/ganache-core/node_modules/tunnel-agent": { - "version": "0.6.0", + "node_modules/ganache-core/node_modules/parse-asn1": { + "version": "5.1.6", "dev": true, - "license": "Apache-2.0", + "license": "ISC", + "optional": true, "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" } }, - "node_modules/ganache-core/node_modules/tweetnacl": { - "version": "1.0.3", - "dev": true, - "license": "Unlicense" - }, - "node_modules/ganache-core/node_modules/tweetnacl-util": { - "version": "0.15.1", - "dev": true, - "license": "Unlicense" - }, - "node_modules/ganache-core/node_modules/type": { - "version": "1.2.0", + "node_modules/ganache-core/node_modules/parse-headers": { + "version": "2.0.3", "dev": true, - "license": "ISC" + "license": "MIT" }, - "node_modules/ganache-core/node_modules/type-is": { - "version": "1.6.18", + "node_modules/ganache-core/node_modules/parseurl": { + "version": "1.3.3", "dev": true, "license": "MIT", "optional": true, - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, - "node_modules/ganache-core/node_modules/typedarray": { - "version": "0.0.6", + "node_modules/ganache-core/node_modules/pascalcase": { + "version": "0.1.1", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/ganache-core/node_modules/typedarray-to-buffer": { - "version": "3.1.5", + "node_modules/ganache-core/node_modules/patch-package": { + "version": "6.2.2", "dev": true, "license": "MIT", "dependencies": { - "is-typedarray": "^1.0.0" + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^2.4.2", + "cross-spawn": "^6.0.5", + "find-yarn-workspace-root": "^1.2.1", + "fs-extra": "^7.0.1", + "is-ci": "^2.0.0", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.0", + "rimraf": "^2.6.3", + "semver": "^5.6.0", + "slash": "^2.0.0", + "tmp": "^0.0.33" + }, + "bin": { + "patch-package": "index.js" + }, + "engines": { + "npm": ">5" } }, - "node_modules/ganache-core/node_modules/typewise": { - "version": "1.0.3", + "node_modules/ganache-core/node_modules/patch-package/node_modules/cross-spawn": { + "version": "6.0.5", "dev": true, "license": "MIT", "dependencies": { - "typewise-core": "^1.2.0" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" } }, - "node_modules/ganache-core/node_modules/typewise-core": { - "version": "1.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/typewiselite": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/ultron": { - "version": "1.1.1", + "node_modules/ganache-core/node_modules/patch-package/node_modules/path-key": { + "version": "2.0.1", "dev": true, "license": "MIT", - "optional": true + "engines": { + "node": ">=4" + } }, - "node_modules/ganache-core/node_modules/underscore": { - "version": "1.9.1", + "node_modules/ganache-core/node_modules/patch-package/node_modules/semver": { + "version": "5.7.1", "dev": true, - "license": "MIT", - "optional": true + "license": "ISC", + "bin": { + "semver": "bin/semver" + } }, - "node_modules/ganache-core/node_modules/union-value": { - "version": "1.0.1", + "node_modules/ganache-core/node_modules/patch-package/node_modules/shebang-command": { + "version": "1.2.0", "dev": true, "license": "MIT", "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" + "shebang-regex": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/union-value/node_modules/is-extendable": { - "version": "0.1.1", + "node_modules/ganache-core/node_modules/patch-package/node_modules/shebang-regex": { + "version": "1.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/universalify": { - "version": "0.1.2", + "node_modules/ganache-core/node_modules/patch-package/node_modules/slash": { + "version": "2.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">= 4.0.0" + "node": ">=6" } }, - "node_modules/ganache-core/node_modules/unorm": { - "version": "1.6.0", + "node_modules/ganache-core/node_modules/patch-package/node_modules/tmp": { + "version": "0.0.33", "dev": true, - "license": "MIT or GPL-2.0", + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, "engines": { - "node": ">= 0.4.0" + "node": ">=0.6.0" } }, - "node_modules/ganache-core/node_modules/unpipe": { - "version": "1.0.0", + "node_modules/ganache-core/node_modules/patch-package/node_modules/which": { + "version": "1.3.1", "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.8" + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" } }, - "node_modules/ganache-core/node_modules/unset-value": { - "version": "1.0.0", + "node_modules/ganache-core/node_modules/path-is-absolute": { + "version": "1.0.1", "dev": true, "license": "MIT", - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", + "node_modules/ganache-core/node_modules/path-parse": { + "version": "1.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/path-to-regexp": { + "version": "0.1.7", "dev": true, "license": "MIT", - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } + "optional": true }, - "node_modules/ganache-core/node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", + "node_modules/ganache-core/node_modules/pbkdf2": { + "version": "3.1.1", "dev": true, "license": "MIT", "dependencies": { - "isarray": "1.0.0" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.12" } }, - "node_modules/ganache-core/node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", + "node_modules/ganache-core/node_modules/performance-now": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/posix-character-classes": { + "version": "0.1.1", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/uri-js": { - "version": "4.4.1", + "node_modules/ganache-core/node_modules/precond": { + "version": "0.2.3", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" + "engines": { + "node": ">= 0.6" } }, - "node_modules/ganache-core/node_modules/urix": { - "version": "0.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/url-parse-lax": { - "version": "3.0.0", + "node_modules/ganache-core/node_modules/prepend-http": { + "version": "2.0.0", "dev": true, "license": "MIT", "optional": true, - "dependencies": { - "prepend-http": "^2.0.0" - }, "engines": { "node": ">=4" } }, - "node_modules/ganache-core/node_modules/url-set-query": { - "version": "1.0.0", + "node_modules/ganache-core/node_modules/private": { + "version": "0.1.8", "dev": true, "license": "MIT", - "optional": true + "engines": { + "node": ">= 0.6" + } }, - "node_modules/ganache-core/node_modules/url-to-options": { - "version": "1.0.1", + "node_modules/ganache-core/node_modules/process": { + "version": "0.11.10", "dev": true, "license": "MIT", - "optional": true, "engines": { - "node": ">= 4" + "node": ">= 0.6.0" } }, - "node_modules/ganache-core/node_modules/use": { - "version": "3.1.1", + "node_modules/ganache-core/node_modules/process-nextick-args": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/promise-to-callback": { + "version": "1.0.0", "dev": true, "license": "MIT", + "dependencies": { + "is-fn": "^1.0.0", + "set-immediate-shim": "^1.0.1" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/utf-8-validate": { - "version": "5.0.4", + "node_modules/ganache-core/node_modules/proxy-addr": { + "version": "2.0.6", "dev": true, - "hasInstallScript": true, "license": "MIT", + "optional": true, "dependencies": { - "node-gyp-build": "^4.2.0" + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" } }, - "node_modules/ganache-core/node_modules/utf8": { - "version": "3.0.0", + "node_modules/ganache-core/node_modules/prr": { + "version": "1.0.1", "dev": true, - "license": "MIT", - "optional": true + "license": "MIT" }, - "node_modules/ganache-core/node_modules/util-deprecate": { + "node_modules/ganache-core/node_modules/pseudomap": { "version": "1.0.2", "dev": true, - "license": "MIT" + "license": "ISC" }, - "node_modules/ganache-core/node_modules/util.promisify": { - "version": "1.1.1", + "node_modules/ganache-core/node_modules/psl": { + "version": "1.8.0", "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "for-each": "^0.3.3", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, - "node_modules/ganache-core/node_modules/utils-merge": { - "version": "1.0.1", + "node_modules/ganache-core/node_modules/public-encrypt": { + "version": "4.0.3", "dev": true, "license": "MIT", "optional": true, - "engines": { - "node": ">= 0.4.0" + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "node_modules/ganache-core/node_modules/uuid": { - "version": "3.4.0", + "node_modules/ganache-core/node_modules/pull-cat": { + "version": "1.1.11", "dev": true, - "license": "MIT", - "bin": { - "uuid": "bin/uuid" - } + "license": "MIT" }, - "node_modules/ganache-core/node_modules/varint": { - "version": "5.0.2", + "node_modules/ganache-core/node_modules/pull-defer": { + "version": "0.2.3", "dev": true, - "license": "MIT", - "optional": true + "license": "MIT" }, - "node_modules/ganache-core/node_modules/vary": { - "version": "1.1.2", + "node_modules/ganache-core/node_modules/pull-level": { + "version": "2.0.4", "dev": true, "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.8" + "dependencies": { + "level-post": "^1.0.7", + "pull-cat": "^1.1.9", + "pull-live": "^1.0.1", + "pull-pushable": "^2.0.0", + "pull-stream": "^3.4.0", + "pull-window": "^2.1.4", + "stream-to-pull-stream": "^1.7.1" } }, - "node_modules/ganache-core/node_modules/verror": { - "version": "1.10.0", + "node_modules/ganache-core/node_modules/pull-live": { + "version": "1.0.1", "dev": true, - "engines": [ - "node >=0.6.0" - ], "license": "MIT", "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "pull-cat": "^1.1.9", + "pull-stream": "^3.4.0" } }, - "node_modules/ganache-core/node_modules/web3": { - "version": "1.2.11", + "node_modules/ganache-core/node_modules/pull-pushable": { + "version": "2.2.0", "dev": true, - "hasInstallScript": true, - "license": "LGPL-3.0", - "optional": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/pull-stream": { + "version": "3.6.14", + "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/pull-window": { + "version": "2.1.4", + "dev": true, + "license": "MIT", "dependencies": { - "web3-bzz": "1.2.11", - "web3-core": "1.2.11", - "web3-eth": "1.2.11", - "web3-eth-personal": "1.2.11", - "web3-net": "1.2.11", - "web3-shh": "1.2.11", - "web3-utils": "1.2.11" - }, - "engines": { - "node": ">=8.0.0" + "looper": "^2.0.0" } }, - "node_modules/ganache-core/node_modules/web3-bzz": { - "version": "1.2.11", + "node_modules/ganache-core/node_modules/pump": { + "version": "3.0.0", "dev": true, - "license": "LGPL-3.0", + "license": "MIT", "optional": true, "dependencies": { - "@types/node": "^12.12.6", - "got": "9.6.0", - "swarm-js": "^0.1.40", - "underscore": "1.9.1" - }, - "engines": { - "node": ">=8.0.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "node_modules/ganache-core/node_modules/web3-bzz/node_modules/@types/node": { - "version": "12.19.12", + "node_modules/ganache-core/node_modules/punycode": { + "version": "2.1.1", "dev": true, "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/web3-core": { - "version": "1.2.11", - "dev": true, - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "@types/bn.js": "^4.11.5", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-core-requestmanager": "1.2.11", - "web3-utils": "1.2.11" - }, "engines": { - "node": ">=8.0.0" + "node": ">=6" } }, - "node_modules/ganache-core/node_modules/web3-core-helpers": { - "version": "1.2.11", + "node_modules/ganache-core/node_modules/qs": { + "version": "6.5.2", "dev": true, - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "underscore": "1.9.1", - "web3-eth-iban": "1.2.11", - "web3-utils": "1.2.11" - }, + "license": "BSD-3-Clause", "engines": { - "node": ">=8.0.0" + "node": ">=0.6" } }, - "node_modules/ganache-core/node_modules/web3-core-method": { - "version": "1.2.11", + "node_modules/ganache-core/node_modules/query-string": { + "version": "5.1.1", "dev": true, - "license": "LGPL-3.0", + "license": "MIT", "optional": true, "dependencies": { - "@ethersproject/transactions": "^5.0.0-beta.135", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.11", - "web3-core-promievent": "1.2.11", - "web3-core-subscriptions": "1.2.11", - "web3-utils": "1.2.11" + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/web3-core-promievent": { - "version": "1.2.11", + "node_modules/ganache-core/node_modules/randombytes": { + "version": "2.1.0", "dev": true, - "license": "LGPL-3.0", - "optional": true, + "license": "MIT", "dependencies": { - "eventemitter3": "4.0.4" - }, - "engines": { - "node": ">=8.0.0" + "safe-buffer": "^5.1.0" } }, - "node_modules/ganache-core/node_modules/web3-core-requestmanager": { - "version": "1.2.11", + "node_modules/ganache-core/node_modules/randomfill": { + "version": "1.0.4", "dev": true, - "license": "LGPL-3.0", + "license": "MIT", "optional": true, "dependencies": { - "underscore": "1.9.1", - "web3-core-helpers": "1.2.11", - "web3-providers-http": "1.2.11", - "web3-providers-ipc": "1.2.11", - "web3-providers-ws": "1.2.11" - }, + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/ganache-core/node_modules/range-parser": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "optional": true, "engines": { - "node": ">=8.0.0" + "node": ">= 0.6" } }, - "node_modules/ganache-core/node_modules/web3-core-subscriptions": { - "version": "1.2.11", + "node_modules/ganache-core/node_modules/raw-body": { + "version": "2.4.0", "dev": true, - "license": "LGPL-3.0", + "license": "MIT", "optional": true, "dependencies": { - "eventemitter3": "4.0.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.11" + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">= 0.8" } }, - "node_modules/ganache-core/node_modules/web3-core/node_modules/@types/node": { - "version": "12.19.12", + "node_modules/ganache-core/node_modules/readable-stream": { + "version": "2.3.7", "dev": true, "license": "MIT", - "optional": true + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } }, - "node_modules/ganache-core/node_modules/web3-eth": { - "version": "1.2.11", + "node_modules/ganache-core/node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", "dev": true, - "license": "LGPL-3.0", - "optional": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/regenerate": { + "version": "1.4.2", + "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/regenerator-runtime": { + "version": "0.11.1", + "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/regenerator-transform": { + "version": "0.10.1", + "dev": true, + "license": "BSD", "dependencies": { - "underscore": "1.9.1", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-core-subscriptions": "1.2.11", - "web3-eth-abi": "1.2.11", - "web3-eth-accounts": "1.2.11", - "web3-eth-contract": "1.2.11", - "web3-eth-ens": "1.2.11", - "web3-eth-iban": "1.2.11", - "web3-eth-personal": "1.2.11", - "web3-net": "1.2.11", - "web3-utils": "1.2.11" - }, - "engines": { - "node": ">=8.0.0" + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" } }, - "node_modules/ganache-core/node_modules/web3-eth-abi": { - "version": "1.2.11", + "node_modules/ganache-core/node_modules/regex-not": { + "version": "1.0.2", "dev": true, - "license": "LGPL-3.0", - "optional": true, + "license": "MIT", "dependencies": { - "@ethersproject/abi": "5.0.0-beta.153", - "underscore": "1.9.1", - "web3-utils": "1.2.11" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/web3-eth-accounts": { - "version": "1.2.11", + "node_modules/ganache-core/node_modules/regexp.prototype.flags": { + "version": "1.3.0", "dev": true, - "license": "LGPL-3.0", - "optional": true, + "license": "MIT", "dependencies": { - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-common": "^1.3.2", - "ethereumjs-tx": "^2.1.1", - "scrypt-js": "^3.0.1", - "underscore": "1.9.1", - "uuid": "3.3.2", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-utils": "1.2.11" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" }, "engines": { - "node": ">=8.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ganache-core/node_modules/web3-eth-accounts/node_modules/eth-lib": { - "version": "0.2.8", + "node_modules/ganache-core/node_modules/regexp.prototype.flags/node_modules/es-abstract": { + "version": "1.17.7", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ganache-core/node_modules/web3-eth-accounts/node_modules/uuid": { - "version": "3.3.2", + "node_modules/ganache-core/node_modules/regexpu-core": { + "version": "2.0.0", "dev": true, "license": "MIT", - "optional": true, - "bin": { - "uuid": "bin/uuid" + "dependencies": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" } }, - "node_modules/ganache-core/node_modules/web3-eth-contract": { - "version": "1.2.11", + "node_modules/ganache-core/node_modules/regjsgen": { + "version": "0.2.0", "dev": true, - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "@types/bn.js": "^4.11.5", - "underscore": "1.9.1", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-core-promievent": "1.2.11", - "web3-core-subscriptions": "1.2.11", - "web3-eth-abi": "1.2.11", - "web3-utils": "1.2.11" - }, - "engines": { - "node": ">=8.0.0" - } + "license": "MIT" }, - "node_modules/ganache-core/node_modules/web3-eth-ens": { - "version": "1.2.11", + "node_modules/ganache-core/node_modules/regjsparser": { + "version": "0.1.5", "dev": true, - "license": "LGPL-3.0", - "optional": true, + "license": "BSD", "dependencies": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "underscore": "1.9.1", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-promievent": "1.2.11", - "web3-eth-abi": "1.2.11", - "web3-eth-contract": "1.2.11", - "web3-utils": "1.2.11" + "jsesc": "~0.5.0" }, - "engines": { - "node": ">=8.0.0" + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/ganache-core/node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" } }, - "node_modules/ganache-core/node_modules/web3-eth-iban": { - "version": "1.2.11", + "node_modules/ganache-core/node_modules/repeat-element": { + "version": "1.1.3", "dev": true, - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "bn.js": "^4.11.9", - "web3-utils": "1.2.11" - }, + "license": "MIT", "engines": { - "node": ">=8.0.0" + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/web3-eth-personal": { - "version": "1.2.11", + "node_modules/ganache-core/node_modules/repeat-string": { + "version": "1.6.1", "dev": true, - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "@types/node": "^12.12.6", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-net": "1.2.11", - "web3-utils": "1.2.11" - }, + "license": "MIT", "engines": { - "node": ">=8.0.0" + "node": ">=0.10" } }, - "node_modules/ganache-core/node_modules/web3-eth-personal/node_modules/@types/node": { - "version": "12.19.12", + "node_modules/ganache-core/node_modules/repeating": { + "version": "2.0.1", "dev": true, "license": "MIT", - "optional": true + "dependencies": { + "is-finite": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/ganache-core/node_modules/web3-net": { - "version": "1.2.11", + "node_modules/ganache-core/node_modules/request": { + "version": "2.88.2", "dev": true, - "license": "LGPL-3.0", - "optional": true, + "license": "Apache-2.0", "dependencies": { - "web3-core": "1.2.11", - "web3-core-method": "1.2.11", - "web3-utils": "1.2.11" + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" }, "engines": { - "node": ">=8.0.0" + "node": ">= 6" } }, - "node_modules/ganache-core/node_modules/web3-provider-engine": { - "version": "14.2.1", + "node_modules/ganache-core/node_modules/resolve-url": { + "version": "0.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/responselike": { + "version": "1.0.2", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "async": "^2.5.0", - "backoff": "^2.5.0", - "clone": "^2.0.0", - "cross-fetch": "^2.1.0", - "eth-block-tracker": "^3.0.0", - "eth-json-rpc-infura": "^3.1.0", - "eth-sig-util": "3.0.0", - "ethereumjs-block": "^1.2.2", - "ethereumjs-tx": "^1.2.0", - "ethereumjs-util": "^5.1.5", - "ethereumjs-vm": "^2.3.4", - "json-rpc-error": "^2.0.0", - "json-stable-stringify": "^1.0.1", - "promise-to-callback": "^1.0.0", - "readable-stream": "^2.2.9", - "request": "^2.85.0", - "semaphore": "^1.0.3", - "ws": "^5.1.1", - "xhr": "^2.2.0", - "xtend": "^4.0.1" + "lowercase-keys": "^1.0.0" } }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/abstract-leveldown": { - "version": "2.6.3", + "node_modules/ganache-core/node_modules/resumer": { + "version": "0.0.0", "dev": true, "license": "MIT", "dependencies": { - "xtend": "~4.0.0" + "through": "~2.3.4" } }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/deferred-leveldown": { - "version": "1.2.2", + "node_modules/ganache-core/node_modules/ret": { + "version": "0.1.15", "dev": true, "license": "MIT", - "dependencies": { - "abstract-leveldown": "~2.6.0" + "engines": { + "node": ">=0.12" } }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/eth-sig-util": { - "version": "1.4.2", + "node_modules/ganache-core/node_modules/rimraf": { + "version": "2.6.3", "dev": true, "license": "ISC", "dependencies": { - "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git", - "ethereumjs-util": "^5.1.1" + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" } }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-account": { - "version": "2.0.5", + "node_modules/ganache-core/node_modules/ripemd160": { + "version": "2.0.2", "dev": true, - "license": "MPL-2.0", + "license": "MIT", "dependencies": { - "ethereumjs-util": "^5.0.0", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-block": { - "version": "1.7.1", + "node_modules/ganache-core/node_modules/rlp": { + "version": "2.2.6", "dev": true, "license": "MPL-2.0", "dependencies": { - "async": "^2.0.1", - "ethereum-common": "0.2.0", - "ethereumjs-tx": "^1.2.2", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" + "bn.js": "^4.11.1" + }, + "bin": { + "rlp": "bin/rlp" } }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-block/node_modules/ethereum-common": { + "node_modules/ganache-core/node_modules/rustbn.js": { "version": "0.2.0", "dev": true, - "license": "MIT" + "license": "(MIT OR Apache-2.0)" }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-tx": { - "version": "1.3.7", + "node_modules/ganache-core/node_modules/safe-buffer": { + "version": "5.2.1", "dev": true, - "license": "MPL-2.0", - "dependencies": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-util": { - "version": "5.2.1", + "node_modules/ganache-core/node_modules/safe-event-emitter": { + "version": "1.0.1", "dev": true, - "license": "MPL-2.0", + "license": "ISC", "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" + "events": "^3.0.0" } }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-vm": { - "version": "2.6.0", + "node_modules/ganache-core/node_modules/safe-regex": { + "version": "1.1.0", "dev": true, - "license": "MPL-2.0", + "license": "MIT", "dependencies": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "ethereumjs-account": "^2.0.3", - "ethereumjs-block": "~2.2.0", - "ethereumjs-common": "^1.1.0", - "ethereumjs-util": "^6.0.0", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.3.2", - "rustbn.js": "~0.2.0", - "safe-buffer": "^5.1.1" + "ret": "~0.1.10" } }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-vm/node_modules/ethereumjs-block": { - "version": "2.2.2", + "node_modules/ganache-core/node_modules/safer-buffer": { + "version": "2.1.2", "dev": true, - "license": "MPL-2.0", - "dependencies": { - "async": "^2.0.1", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.1", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - } + "license": "MIT" }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-vm/node_modules/ethereumjs-block/node_modules/ethereumjs-util": { - "version": "5.2.1", + "node_modules/ganache-core/node_modules/scrypt-js": { + "version": "3.0.1", "dev": true, - "license": "MPL-2.0", - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } + "license": "MIT" }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-vm/node_modules/ethereumjs-tx": { - "version": "2.1.2", + "node_modules/ganache-core/node_modules/scryptsy": { + "version": "1.2.1", "dev": true, - "license": "MPL-2.0", - "dependencies": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" + "license": "MIT", + "optional": true, + "dependencies": { + "pbkdf2": "^3.0.3" } }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-vm/node_modules/ethereumjs-util": { - "version": "6.2.1", + "node_modules/ganache-core/node_modules/secp256k1": { + "version": "4.0.2", "dev": true, - "license": "MPL-2.0", + "hasInstallScript": true, + "license": "MIT", "dependencies": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + }, + "engines": { + "node": ">=10.0.0" } }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/isarray": { - "version": "0.0.1", + "node_modules/ganache-core/node_modules/seedrandom": { + "version": "3.0.1", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-codec": { - "version": "7.0.1", + "node_modules/ganache-core/node_modules/semaphore": { + "version": "1.1.0", "dev": true, - "license": "MIT" + "engines": { + "node": ">=0.8.0" + } }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-errors": { - "version": "1.0.5", + "node_modules/ganache-core/node_modules/send": { + "version": "0.17.1", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "errno": "~0.1.1" + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-iterator-stream": { - "version": "1.3.1", + "node_modules/ganache-core/node_modules/send/node_modules/debug": { + "version": "2.6.9", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" + "ms": "2.0.0" } }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-iterator-stream/node_modules/readable-stream": { - "version": "1.1.14", + "node_modules/ganache-core/node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", "dev": true, "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } + "optional": true }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-ws": { - "version": "0.0.0", + "node_modules/ganache-core/node_modules/send/node_modules/ms": { + "version": "2.1.1", "dev": true, "license": "MIT", - "dependencies": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" - } + "optional": true }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-ws/node_modules/readable-stream": { - "version": "1.0.34", + "node_modules/ganache-core/node_modules/serve-static": { + "version": "1.14.1", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-ws/node_modules/xtend": { - "version": "2.1.2", + "node_modules/ganache-core/node_modules/servify": { + "version": "0.1.12", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "object-keys": "~0.4.0" + "body-parser": "^1.16.0", + "cors": "^2.8.1", + "express": "^4.14.0", + "request": "^2.79.0", + "xhr": "^2.3.3" }, "engines": { - "node": ">=0.4" + "node": ">=6" } }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/levelup": { - "version": "1.3.9", + "node_modules/ganache-core/node_modules/set-immediate-shim": { + "version": "1.0.1", "dev": true, "license": "MIT", - "dependencies": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ltgt": { - "version": "2.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/memdown": { - "version": "1.4.1", + "node_modules/ganache-core/node_modules/set-value": { + "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/memdown/node_modules/abstract-leveldown": { - "version": "2.7.2", + "node_modules/ganache-core/node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { - "xtend": "~4.0.0" + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/merkle-patricia-tree": { - "version": "2.3.2", + "node_modules/ganache-core/node_modules/set-value/node_modules/is-extendable": { + "version": "0.1.1", "dev": true, - "license": "MPL-2.0", - "dependencies": { - "async": "^1.4.2", - "ethereumjs-util": "^5.0.0", - "level-ws": "0.0.0", - "levelup": "^1.2.1", - "memdown": "^1.0.0", - "readable-stream": "^2.0.0", - "rlp": "^2.0.0", - "semaphore": ">=1.0.1" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/merkle-patricia-tree/node_modules/async": { - "version": "1.5.2", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/object-keys": { - "version": "0.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/safe-buffer": { - "version": "5.1.2", + "node_modules/ganache-core/node_modules/setimmediate": { + "version": "1.0.5", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/semver": { - "version": "5.4.1", + "node_modules/ganache-core/node_modules/setprototypeof": { + "version": "1.1.1", "dev": true, "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/string_decoder": { - "version": "0.10.31", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ws": { - "version": "5.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "async-limiter": "~1.0.0" - } + "optional": true }, - "node_modules/ganache-core/node_modules/web3-providers-http": { - "version": "1.2.11", + "node_modules/ganache-core/node_modules/sha.js": { + "version": "2.4.11", "dev": true, - "license": "LGPL-3.0", - "optional": true, + "license": "(MIT AND BSD-3-Clause)", "dependencies": { - "web3-core-helpers": "1.2.11", - "xhr2-cookies": "1.1.0" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" }, - "engines": { - "node": ">=8.0.0" + "bin": { + "sha.js": "bin.js" } }, - "node_modules/ganache-core/node_modules/web3-providers-ipc": { - "version": "1.2.11", + "node_modules/ganache-core/node_modules/simple-concat": { + "version": "1.0.1", "dev": true, - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "oboe": "2.1.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.11" - }, - "engines": { - "node": ">=8.0.0" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "optional": true }, - "node_modules/ganache-core/node_modules/web3-providers-ws": { - "version": "1.2.11", + "node_modules/ganache-core/node_modules/simple-get": { + "version": "2.8.1", "dev": true, - "license": "LGPL-3.0", + "license": "MIT", "optional": true, "dependencies": { - "eventemitter3": "4.0.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.11", - "websocket": "^1.0.31" - }, - "engines": { - "node": ">=8.0.0" + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" } }, - "node_modules/ganache-core/node_modules/web3-shh": { - "version": "1.2.11", + "node_modules/ganache-core/node_modules/snapdragon": { + "version": "0.8.2", "dev": true, - "license": "LGPL-3.0", - "optional": true, + "license": "MIT", "dependencies": { - "web3-core": "1.2.11", - "web3-core-method": "1.2.11", - "web3-core-subscriptions": "1.2.11", - "web3-net": "1.2.11" + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/web3-utils": { - "version": "1.2.11", + "node_modules/ganache-core/node_modules/snapdragon-node": { + "version": "2.1.1", "dev": true, - "license": "LGPL-3.0", - "optional": true, + "license": "MIT", "dependencies": { - "bn.js": "^4.11.9", - "eth-lib": "0.2.8", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" }, "engines": { - "node": ">=8.0.0" + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/web3-utils/node_modules/eth-lib": { - "version": "0.2.8", + "node_modules/ganache-core/node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", "dev": true, "license": "MIT", - "optional": true, - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/ganache-core/node_modules/websocket": { - "version": "1.0.32", - "dev": true, - "license": "Apache-2.0", "dependencies": { - "bufferutil": "^4.0.1", - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "typedarray-to-buffer": "^3.1.5", - "utf-8-validate": "^5.0.2", - "yaeti": "^0.0.6" + "is-descriptor": "^1.0.0" }, "engines": { - "node": ">=4.0.0" + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/websocket/node_modules/debug": { - "version": "2.6.9", + "node_modules/ganache-core/node_modules/snapdragon-util": { + "version": "3.0.1", "dev": true, "license": "MIT", "dependencies": { - "ms": "2.0.0" + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/websocket/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ganache-core/node_modules/whatwg-fetch": { - "version": "2.0.4", + "node_modules/ganache-core/node_modules/snapdragon-util/node_modules/is-buffer": { + "version": "1.1.6", "dev": true, "license": "MIT" }, - "node_modules/ganache-core/node_modules/wrappy": { - "version": "1.0.2", - "dev": true, - "license": "ISC" - }, - "node_modules/ganache-core/node_modules/ws": { - "version": "3.3.3", + "node_modules/ganache-core/node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/ws/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ganache-core/node_modules/xhr": { - "version": "2.6.0", + "node_modules/ganache-core/node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", "dev": true, "license": "MIT", "dependencies": { - "global": "~4.4.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" + "ms": "2.0.0" } }, - "node_modules/ganache-core/node_modules/xhr-request": { - "version": "1.1.0", + "node_modules/ganache-core/node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "buffer-to-arraybuffer": "^0.0.5", - "object-assign": "^4.1.1", - "query-string": "^5.0.1", - "simple-get": "^2.7.0", - "timed-out": "^4.0.1", - "url-set-query": "^1.0.0", - "xhr": "^2.0.4" + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/xhr-request-promise": { - "version": "0.1.3", + "node_modules/ganache-core/node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "xhr-request": "^1.1.0" + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/xhr2-cookies": { - "version": "1.1.0", + "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-accessor-descriptor": { + "version": "0.1.6", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "cookiejar": "^2.1.1" - } - }, - "node_modules/ganache-core/node_modules/xtend": { - "version": "4.0.2", - "dev": true, - "license": "MIT", + "kind-of": "^3.0.2" + }, "engines": { - "node": ">=0.4" + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/yaeti": { - "version": "0.0.6", + "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", "dev": true, "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, "engines": { - "node": ">=0.10.32" + "node": ">=0.10.0" } }, - "node_modules/ganache-core/node_modules/yallist": { - "version": "3.1.1", + "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-buffer": { + "version": "1.1.6", "dev": true, - "license": "ISC" + "license": "MIT" }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-data-descriptor": { + "version": "0.1.4", "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "engines": { - "node": "*" + "node": ">=0.10.0" } }, - "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", "dev": true, + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "is-buffer": "^1.1.5" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, "engines": { - "node": ">=8.0.0" + "node": ">=0.10.0" } }, - "node_modules/get-port": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", + "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.6", "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-extendable": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "node_modules/ganache-core/node_modules/snapdragon/node_modules/kind-of": { + "version": "5.1.0", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, + "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "node_modules/ganache-core/node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/source-map": { + "version": "0.5.7", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ghost-testrpc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", - "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==", + "node_modules/ganache-core/node_modules/source-map-resolve": { + "version": "0.5.3", "dev": true, + "license": "MIT", "dependencies": { - "chalk": "^2.4.2", - "node-emoji": "^1.10.0" - }, - "bin": { - "testrpc-sc": "index.js" + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" } }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "node_modules/ganache-core/node_modules/source-map-support": { + "version": "0.5.12", "dev": true, + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/ganache-core/node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, + "license": "BSD-3-Clause", "engines": { - "node": ">=10.13.0" + "node": ">=0.10.0" } }, - "node_modules/global": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "node_modules/ganache-core/node_modules/source-map-url": { + "version": "0.4.0", "dev": true, - "dependencies": { - "min-document": "^2.19.0", - "process": "^0.11.10" - } + "license": "MIT" }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "node_modules/ganache-core/node_modules/split-string": { + "version": "3.1.0", "dev": true, + "license": "MIT", "dependencies": { - "global-prefix": "^3.0.0" + "extend-shallow": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "node_modules/ganache-core/node_modules/sshpk": { + "version": "1.16.1", "dev": true, + "license": "MIT", "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/ganache-core/node_modules/sshpk/node_modules/tweetnacl": { + "version": "0.14.5", + "dev": true, + "license": "Unlicense" + }, + "node_modules/ganache-core/node_modules/static-extend": { + "version": "0.1.2", "dev": true, + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" }, - "bin": { - "which": "bin/which" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "node_modules/ganache-core/node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", "dev": true, + "license": "MIT", "dependencies": { - "type-fest": "^0.20.2" + "is-descriptor": "^0.1.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "node_modules/ganache-core/node_modules/static-extend/node_modules/is-accessor-descriptor": { + "version": "0.1.6", "dev": true, + "license": "MIT", "dependencies": { - "define-properties": "^1.1.3" + "kind-of": "^3.0.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "node_modules/ganache-core/node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", "dev": true, + "license": "MIT", "dependencies": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" + "is-buffer": "^1.1.5" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/globby/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/ganache-core/node_modules/static-extend/node_modules/is-buffer": { + "version": "1.1.6", "dev": true, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "node_modules/ganache-core/node_modules/static-extend/node_modules/is-data-descriptor": { + "version": "0.1.4", "dev": true, + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.3" + "kind-of": "^3.0.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/got": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", - "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", + "node_modules/ganache-core/node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", "dev": true, + "license": "MIT", "dependencies": { - "@sindresorhus/is": "^4.6.0", - "@szmarczak/http-timer": "^5.0.1", - "@types/cacheable-request": "^6.0.2", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^6.0.4", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "form-data-encoder": "1.7.1", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^2.0.0" + "is-buffer": "^1.1.5" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" + "node": ">=0.10.0" } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + }, + "node_modules/ganache-core/node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.6", "dev": true, + "license": "MIT", "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" + "node": ">=0.10.0" } }, - "node_modules/handlebars/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/ganache-core/node_modules/static-extend/node_modules/kind-of": { + "version": "5.1.0", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "node_modules/ganache-core/node_modules/statuses": { + "version": "1.5.0", "dev": true, + "license": "MIT", + "optional": true, "engines": { - "node": ">=4" + "node": ">= 0.6" } }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", + "node_modules/ganache-core/node_modules/stream-to-pull-stream": { + "version": "1.7.3", "dev": true, + "license": "MIT", "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, + "looper": "^3.0.0", + "pull-stream": "^3.2.3" + } + }, + "node_modules/ganache-core/node_modules/stream-to-pull-stream/node_modules/looper": { + "version": "3.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/strict-uri-encode": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "optional": true, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/hardhat": { - "version": "2.17.2", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.17.2.tgz", - "integrity": "sha512-oUv40jBeHw0dKpbyQ+iH9cmNMziweLoTW3MnkNxJ2Gc0KGLrQR/1n4vV4xY60zn2LdmRgnwPqy3CgtY0mfwIIA==", + "node_modules/ganache-core/node_modules/string_decoder": { + "version": "1.1.1", "dev": true, + "license": "MIT", "dependencies": { - "@ethersproject/abi": "^5.1.2", - "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "5.0.2", - "@nomicfoundation/ethereumjs-blockchain": "7.0.2", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-evm": "2.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-statemanager": "2.0.2", - "@nomicfoundation/ethereumjs-trie": "6.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "@nomicfoundation/ethereumjs-vm": "7.0.2", - "@nomicfoundation/solidity-analyzer": "^0.1.0", - "@sentry/node": "^5.18.1", - "@types/bn.js": "^5.1.0", - "@types/lru-cache": "^5.1.0", - "adm-zip": "^0.4.16", - "aggregate-error": "^3.0.0", - "ansi-escapes": "^4.3.0", - "chalk": "^2.4.2", - "chokidar": "^3.4.0", - "ci-info": "^2.0.0", - "debug": "^4.1.1", - "enquirer": "^2.3.0", - "env-paths": "^2.2.0", - "ethereum-cryptography": "^1.0.3", - "ethereumjs-abi": "^0.6.8", - "find-up": "^2.1.0", - "fp-ts": "1.19.3", - "fs-extra": "^7.0.1", - "glob": "7.2.0", - "immutable": "^4.0.0-rc.12", - "io-ts": "1.10.4", - "keccak": "^3.0.2", - "lodash": "^4.17.11", - "mnemonist": "^0.38.0", - "mocha": "^10.0.0", - "p-map": "^4.0.0", - "raw-body": "^2.4.1", - "resolve": "1.17.0", - "semver": "^6.3.0", - "solc": "0.7.3", - "source-map-support": "^0.5.13", - "stacktrace-parser": "^0.1.10", - "tsort": "0.0.1", - "undici": "^5.14.0", - "uuid": "^8.3.2", - "ws": "^7.4.6" + "safe-buffer": "~5.1.0" + } + }, + "node_modules/ganache-core/node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/string.prototype.trim": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" }, - "bin": { - "hardhat": "internal/cli/bootstrap.js" + "engines": { + "node": ">= 0.4" }, - "peerDependencies": { - "ts-node": "*", - "typescript": "*" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ganache-core/node_modules/string.prototype.trimend": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - }, - "typescript": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hardhat-dependency-compiler": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hardhat-dependency-compiler/-/hardhat-dependency-compiler-1.1.3.tgz", - "integrity": "sha512-bCDqsOxGST6WkbMvj4lPchYWidNSSBm5CFnkyAex1T11cGmr9otZTGl81W6f9pmrtBXbKCvr3OSuNJ6Q394sAw==", + "node_modules/ganache-core/node_modules/string.prototype.trimstart": { + "version": "1.0.3", "dev": true, - "engines": { - "node": ">=14.14.0" + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" }, - "peerDependencies": { - "hardhat": "^2.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hardhat-gas-reporter": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz", - "integrity": "sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==", + "node_modules/ganache-core/node_modules/strip-hex-prefix": { + "version": "1.0.0", "dev": true, + "license": "MIT", "dependencies": { - "array-uniq": "1.0.3", - "eth-gas-reporter": "^0.2.25", - "sha1": "^1.1.1" + "is-hex-prefixed": "1.0.0" }, - "peerDependencies": { - "hardhat": "^2.0.2" + "engines": { + "node": ">=6.5.0", + "npm": ">=3" } }, - "node_modules/hardhat/node_modules/@noble/hashes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", - "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", + "node_modules/ganache-core/node_modules/supports-color": { + "version": "5.5.0", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/hardhat/node_modules/@scure/bip32": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", - "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", + "node_modules/ganache-core/node_modules/swarm-js": { + "version": "0.1.40", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "license": "MIT", + "optional": true, "dependencies": { - "@noble/hashes": "~1.2.0", - "@noble/secp256k1": "~1.7.0", - "@scure/base": "~1.1.0" + "bluebird": "^3.5.0", + "buffer": "^5.0.5", + "eth-lib": "^0.1.26", + "fs-extra": "^4.0.2", + "got": "^7.1.0", + "mime-types": "^2.1.16", + "mkdirp-promise": "^5.0.1", + "mock-fs": "^4.1.0", + "setimmediate": "^1.0.5", + "tar": "^4.0.2", + "xhr-request": "^1.0.1" } }, - "node_modules/hardhat/node_modules/@scure/bip39": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", - "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", + "node_modules/ganache-core/node_modules/swarm-js/node_modules/fs-extra": { + "version": "4.0.3", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "license": "MIT", + "optional": true, "dependencies": { - "@noble/hashes": "~1.2.0", - "@scure/base": "~1.1.0" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, - "node_modules/hardhat/node_modules/commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", - "dev": true - }, - "node_modules/hardhat/node_modules/ethereum-cryptography": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", - "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "node_modules/ganache-core/node_modules/swarm-js/node_modules/get-stream": { + "version": "3.0.0", "dev": true, - "dependencies": { - "@noble/hashes": "1.2.0", - "@noble/secp256k1": "1.7.1", - "@scure/bip32": "1.1.5", - "@scure/bip39": "1.1.1" + "license": "MIT", + "optional": true, + "engines": { + "node": ">=4" } }, - "node_modules/hardhat/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "node_modules/ganache-core/node_modules/swarm-js/node_modules/got": { + "version": "7.1.0", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "locate-path": "^2.0.0" + "decompress-response": "^3.2.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-plain-obj": "^1.1.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "p-cancelable": "^0.3.0", + "p-timeout": "^1.1.1", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "url-parse-lax": "^1.0.0", + "url-to-options": "^1.0.1" }, "engines": { "node": ">=4" } }, - "node_modules/hardhat/node_modules/jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "node_modules/ganache-core/node_modules/swarm-js/node_modules/is-stream": { + "version": "1.1.0", "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/hardhat/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "node_modules/ganache-core/node_modules/swarm-js/node_modules/p-cancelable": { + "version": "0.3.0", "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, + "license": "MIT", + "optional": true, "engines": { "node": ">=4" } }, - "node_modules/hardhat/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "node_modules/ganache-core/node_modules/swarm-js/node_modules/prepend-http": { + "version": "1.0.4", "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, + "license": "MIT", + "optional": true, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/hardhat/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "node_modules/ganache-core/node_modules/swarm-js/node_modules/url-parse-lax": { + "version": "1.0.0", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "p-limit": "^1.1.0" + "prepend-http": "^1.0.1" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/hardhat/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "node_modules/ganache-core/node_modules/tape": { + "version": "4.13.3", "dev": true, - "engines": { - "node": ">=4" + "license": "MIT", + "dependencies": { + "deep-equal": "~1.1.1", + "defined": "~1.0.0", + "dotignore": "~0.1.2", + "for-each": "~0.3.3", + "function-bind": "~1.1.1", + "glob": "~7.1.6", + "has": "~1.0.3", + "inherits": "~2.0.4", + "is-regex": "~1.0.5", + "minimist": "~1.2.5", + "object-inspect": "~1.7.0", + "resolve": "~1.17.0", + "resumer": "~0.0.0", + "string.prototype.trim": "~1.2.1", + "through": "~2.3.8" + }, + "bin": { + "tape": "bin/tape" } }, - "node_modules/hardhat/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "node_modules/ganache-core/node_modules/tape/node_modules/glob": { + "version": "7.1.6", "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, "engines": { - "node": ">=4" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/hardhat/node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "node_modules/ganache-core/node_modules/tape/node_modules/is-regex": { + "version": "1.0.5", "dev": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hardhat/node_modules/resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "node_modules/ganache-core/node_modules/tape/node_modules/object-inspect": { + "version": "1.7.0", "dev": true, - "dependencies": { - "path-parse": "^1.0.6" - }, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hardhat/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "node_modules/ganache-core/node_modules/tape/node_modules/resolve": { + "version": "1.17.0", "dev": true, + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "path-parse": "^1.0.6" }, - "bin": { - "rimraf": "bin.js" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hardhat/node_modules/solc": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", - "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", + "node_modules/ganache-core/node_modules/tar": { + "version": "4.4.13", "dev": true, + "license": "ISC", + "optional": true, "dependencies": { - "command-exists": "^1.2.8", - "commander": "3.0.2", - "follow-redirects": "^1.12.1", - "fs-extra": "^0.30.0", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "require-from-string": "^2.0.0", - "semver": "^5.5.0", - "tmp": "0.0.33" - }, - "bin": { - "solcjs": "solcjs" + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" }, "engines": { - "node": ">=8.0.0" + "node": ">=4.5" } }, - "node_modules/hardhat/node_modules/solc/node_modules/fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", + "node_modules/ganache-core/node_modules/tar/node_modules/fs-minipass": { + "version": "1.2.7", "dev": true, + "license": "ISC", + "optional": true, "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" + "minipass": "^2.6.0" } }, - "node_modules/hardhat/node_modules/solc/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "node_modules/ganache-core/node_modules/tar/node_modules/minipass": { + "version": "2.9.0", "dev": true, - "bin": { - "semver": "bin/semver" + "license": "ISC", + "optional": true, + "dependencies": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" } }, - "node_modules/has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", + "node_modules/ganache-core/node_modules/through": { + "version": "2.3.8", "dev": true, - "engines": { - "node": ">= 0.4.0" - } + "license": "MIT" }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "node_modules/ganache-core/node_modules/through2": { + "version": "2.0.5", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/ganache-core/node_modules/timed-out": { + "version": "4.0.1", "dev": true, + "license": "MIT", + "optional": true, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "node_modules/ganache-core/node_modules/tmp": { + "version": "0.1.0", "dev": true, + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.1" + "rimraf": "^2.6.3" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=6" } }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "node_modules/ganache-core/node_modules/to-object-path": { + "version": "0.3.0", "dev": true, - "engines": { - "node": ">= 0.4" + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/ganache-core/node_modules/to-object-path/node_modules/is-buffer": { + "version": "1.1.6", "dev": true, - "engines": { - "node": ">= 0.4" + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/has-tostringtag": { + "node_modules/ganache-core/node_modules/to-readable-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, + "license": "MIT", + "optional": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6" } }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "node_modules/ganache-core/node_modules/to-regex": { + "version": "3.0.2", "dev": true, + "license": "MIT", "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" + "node_modules/ganache-core/node_modules/toidentifier": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.6" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "node_modules/ganache-core/node_modules/tough-cookie": { + "version": "2.5.0", "dev": true, - "bin": { - "he": "bin/he" + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" } }, - "node_modules/header-case": { + "node_modules/ganache-core/node_modules/trim-right": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", - "integrity": "sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==", "dev": true, - "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.1.3" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/highlight.js": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "node_modules/ganache-core/node_modules/tunnel-agent": { + "version": "0.6.0", "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, "engines": { "node": "*" } }, - "node_modules/highlightjs-solidity": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/highlightjs-solidity/-/highlightjs-solidity-2.0.6.tgz", - "integrity": "sha512-DySXWfQghjm2l6a/flF+cteroJqD4gI8GSdL4PtvxZSsAHie8m3yVe2JFoRg03ROKT6hp2Lc/BxXkqerNmtQYg==", - "dev": true - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } + "node_modules/ganache-core/node_modules/tweetnacl": { + "version": "1.0.3", + "dev": true, + "license": "Unlicense" }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true + "node_modules/ganache-core/node_modules/tweetnacl-util": { + "version": "0.15.1", + "dev": true, + "license": "Unlicense" }, - "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "node_modules/ganache-core/node_modules/type": { + "version": "1.2.0", "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } + "license": "ISC" }, - "node_modules/http-basic": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", - "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "node_modules/ganache-core/node_modules/type-is": { + "version": "1.6.18", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "caseless": "^0.12.0", - "concat-stream": "^1.6.2", - "http-response-object": "^3.0.1", - "parse-cache-control": "^1.0.1" + "media-typer": "0.3.0", + "mime-types": "~2.1.24" }, "engines": { - "node": ">=6.0.0" + "node": ">= 0.6" } }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true + "node_modules/ganache-core/node_modules/typedarray": { + "version": "0.0.6", + "dev": true, + "license": "MIT" }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "node_modules/ganache-core/node_modules/typedarray-to-buffer": { + "version": "3.1.5", "dev": true, + "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" + "is-typedarray": "^1.0.0" } }, - "node_modules/http-https": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", - "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==", - "dev": true - }, - "node_modules/http-response-object": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", - "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "node_modules/ganache-core/node_modules/typewise": { + "version": "1.0.3", "dev": true, + "license": "MIT", "dependencies": { - "@types/node": "^10.0.3" + "typewise-core": "^1.2.0" } }, - "node_modules/http-response-object/node_modules/@types/node": { - "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", - "dev": true + "node_modules/ganache-core/node_modules/typewise-core": { + "version": "1.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/typewiselite": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/ultron": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/ganache-core/node_modules/underscore": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "optional": true }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "node_modules/ganache-core/node_modules/union-value": { + "version": "1.0.1", "dev": true, + "license": "MIT", "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" }, "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" + "node": ">=0.10.0" } }, - "node_modules/http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", + "node_modules/ganache-core/node_modules/union-value/node_modules/is-extendable": { + "version": "0.1.1", "dev": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ganache-core/node_modules/universalify": { + "version": "0.1.2", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10.19.0" + "node": ">= 4.0.0" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "node_modules/ganache-core/node_modules/unorm": { + "version": "1.6.0", "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, + "license": "MIT or GPL-2.0", "engines": { - "node": ">= 6" + "node": ">= 0.4.0" } }, - "node_modules/hyperlinker": { + "node_modules/ganache-core/node_modules/unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hyperlinker/-/hyperlinker-1.0.0.tgz", - "integrity": "sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==", "dev": true, + "license": "MIT", + "optional": true, "engines": { - "node": ">=4" + "node": ">= 0.8" } }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/ganache-core/node_modules/unset-value": { + "version": "1.0.0", "dev": true, + "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "has-value": "^0.3.1", + "isobject": "^3.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/idna-uts46-hx": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", - "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", + "node_modules/ganache-core/node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", "dev": true, + "license": "MIT", "dependencies": { - "punycode": "2.1.0" + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" }, "engines": { - "node": ">=4.0.0" + "node": ">=0.10.0" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "node_modules/ganache-core/node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "license": "MIT", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "node_modules/ganache-core/node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", "dev": true, + "license": "MIT", "engines": { - "node": ">= 4" + "node": ">=0.10.0" } }, - "node_modules/immediate": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", - "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", - "dev": true + "node_modules/ganache-core/node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } }, - "node_modules/immutable": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", - "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", - "dev": true + "node_modules/ganache-core/node_modules/urix": { + "version": "0.1.0", + "dev": true, + "license": "MIT" }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "node_modules/ganache-core/node_modules/url-parse-lax": { + "version": "3.0.0", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "prepend-http": "^2.0.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "node_modules/ganache-core/node_modules/url-set-query": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/ganache-core/node_modules/url-to-options": { + "version": "1.0.1", "dev": true, + "license": "MIT", + "optional": true, "engines": { - "node": ">=0.8.19" + "node": ">= 4" } }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "node_modules/ganache-core/node_modules/use": { + "version": "3.1.1", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "node_modules/ganache-core/node_modules/utf-8-validate": { + "version": "5.0.4", "dev": true, + "hasInstallScript": true, + "license": "MIT", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "node-gyp-build": "^4.2.0" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "node_modules/ganache-core/node_modules/utf8": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "optional": true }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "node_modules/ganache-core/node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "license": "MIT" }, - "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "node_modules/ganache-core/node_modules/util.promisify": { + "version": "1.1.1", "dev": true, + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "for-each": "^0.3.3", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.1" }, - "engines": { - "node": ">= 0.4" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "node_modules/ganache-core/node_modules/utils-merge": { + "version": "1.0.1", "dev": true, + "license": "MIT", + "optional": true, "engines": { - "node": ">= 0.10" + "node": ">= 0.4.0" } }, - "node_modules/invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", + "node_modules/ganache-core/node_modules/uuid": { + "version": "3.4.0", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/ganache-core/node_modules/varint": { + "version": "5.0.2", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/ganache-core/node_modules/vary": { + "version": "1.1.2", "dev": true, + "license": "MIT", + "optional": true, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "node_modules/io-ts": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", - "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", + "node_modules/ganache-core/node_modules/verror": { + "version": "1.10.0", "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", "dependencies": { - "fp-ts": "^1.0.0" + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" } }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "node_modules/ganache-core/node_modules/web3": { + "version": "1.2.11", "dev": true, + "hasInstallScript": true, + "license": "LGPL-3.0", + "optional": true, + "dependencies": { + "web3-bzz": "1.2.11", + "web3-core": "1.2.11", + "web3-eth": "1.2.11", + "web3-eth-personal": "1.2.11", + "web3-net": "1.2.11", + "web3-shh": "1.2.11", + "web3-utils": "1.2.11" + }, "engines": { - "node": ">= 0.10" + "node": ">=8.0.0" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "node_modules/ganache-core/node_modules/web3-bzz": { + "version": "1.2.11", "dev": true, + "license": "LGPL-3.0", + "optional": true, "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "@types/node": "^12.12.6", + "got": "9.6.0", + "swarm-js": "^0.1.40", + "underscore": "1.9.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8.0.0" } }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "node_modules/ganache-core/node_modules/web3-bzz/node_modules/@types/node": { + "version": "12.19.12", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/ganache-core/node_modules/web3-core": { + "version": "1.2.11", "dev": true, + "license": "LGPL-3.0", + "optional": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "@types/bn.js": "^4.11.5", + "@types/node": "^12.12.6", + "bignumber.js": "^9.0.0", + "web3-core-helpers": "1.2.11", + "web3-core-method": "1.2.11", + "web3-core-requestmanager": "1.2.11", + "web3-utils": "1.2.11" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8.0.0" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "node_modules/ganache-core/node_modules/web3-core-helpers": { + "version": "1.2.11", "dev": true, + "license": "LGPL-3.0", + "optional": true, "dependencies": { - "has-bigints": "^1.0.1" + "underscore": "1.9.1", + "web3-eth-iban": "1.2.11", + "web3-utils": "1.2.11" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8.0.0" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/ganache-core/node_modules/web3-core-method": { + "version": "1.2.11", "dev": true, + "license": "LGPL-3.0", + "optional": true, "dependencies": { - "binary-extensions": "^2.0.0" + "@ethersproject/transactions": "^5.0.0-beta.135", + "underscore": "1.9.1", + "web3-core-helpers": "1.2.11", + "web3-core-promievent": "1.2.11", + "web3-core-subscriptions": "1.2.11", + "web3-utils": "1.2.11" }, "engines": { - "node": ">=8" + "node": ">=8.0.0" } }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "node_modules/ganache-core/node_modules/web3-core-promievent": { + "version": "1.2.11", "dev": true, + "license": "LGPL-3.0", + "optional": true, "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "eventemitter3": "4.0.4" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8.0.0" } }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "node_modules/ganache-core/node_modules/web3-core-requestmanager": { + "version": "1.2.11", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "license": "LGPL-3.0", + "optional": true, + "dependencies": { + "underscore": "1.9.1", + "web3-core-helpers": "1.2.11", + "web3-providers-http": "1.2.11", + "web3-providers-ipc": "1.2.11", + "web3-providers-ws": "1.2.11" + }, "engines": { - "node": ">=4" + "node": ">=8.0.0" } }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "node_modules/ganache-core/node_modules/web3-core-subscriptions": { + "version": "1.2.11", "dev": true, - "engines": { - "node": ">= 0.4" + "license": "LGPL-3.0", + "optional": true, + "dependencies": { + "eventemitter3": "4.0.4", + "underscore": "1.9.1", + "web3-core-helpers": "1.2.11" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8.0.0" } }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "node_modules/ganache-core/node_modules/web3-core/node_modules/@types/node": { + "version": "12.19.12", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/ganache-core/node_modules/web3-eth": { + "version": "1.2.11", "dev": true, + "license": "LGPL-3.0", + "optional": true, "dependencies": { - "ci-info": "^2.0.0" + "underscore": "1.9.1", + "web3-core": "1.2.11", + "web3-core-helpers": "1.2.11", + "web3-core-method": "1.2.11", + "web3-core-subscriptions": "1.2.11", + "web3-eth-abi": "1.2.11", + "web3-eth-accounts": "1.2.11", + "web3-eth-contract": "1.2.11", + "web3-eth-ens": "1.2.11", + "web3-eth-iban": "1.2.11", + "web3-eth-personal": "1.2.11", + "web3-net": "1.2.11", + "web3-utils": "1.2.11" }, - "bin": { - "is-ci": "bin.js" + "engines": { + "node": ">=8.0.0" } }, - "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "node_modules/ganache-core/node_modules/web3-eth-abi": { + "version": "1.2.11", "dev": true, + "license": "LGPL-3.0", + "optional": true, "dependencies": { - "has": "^1.0.3" + "@ethersproject/abi": "5.0.0-beta.153", + "underscore": "1.9.1", + "web3-utils": "1.2.11" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8.0.0" } }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "node_modules/ganache-core/node_modules/web3-eth-accounts": { + "version": "1.2.11", "dev": true, + "license": "LGPL-3.0", + "optional": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "crypto-browserify": "3.12.0", + "eth-lib": "0.2.8", + "ethereumjs-common": "^1.3.2", + "ethereumjs-tx": "^2.1.1", + "scrypt-js": "^3.0.1", + "underscore": "1.9.1", + "uuid": "3.3.2", + "web3-core": "1.2.11", + "web3-core-helpers": "1.2.11", + "web3-core-method": "1.2.11", + "web3-utils": "1.2.11" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8.0.0" } }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "node_modules/ganache-core/node_modules/web3-eth-accounts/node_modules/eth-lib": { + "version": "0.2.8", "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "license": "MIT", + "optional": true, + "dependencies": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/ganache-core/node_modules/web3-eth-accounts/node_modules/uuid": { + "version": "3.3.2", "dev": true, - "engines": { - "node": ">=0.10.0" + "license": "MIT", + "optional": true, + "bin": { + "uuid": "bin/uuid" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/ganache-core/node_modules/web3-eth-contract": { + "version": "1.2.11", "dev": true, + "license": "LGPL-3.0", + "optional": true, + "dependencies": { + "@types/bn.js": "^4.11.5", + "underscore": "1.9.1", + "web3-core": "1.2.11", + "web3-core-helpers": "1.2.11", + "web3-core-method": "1.2.11", + "web3-core-promievent": "1.2.11", + "web3-core-subscriptions": "1.2.11", + "web3-eth-abi": "1.2.11", + "web3-utils": "1.2.11" + }, "engines": { - "node": ">=8" + "node": ">=8.0.0" } }, - "node_modules/is-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", - "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==", - "dev": true - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "node_modules/ganache-core/node_modules/web3-eth-ens": { + "version": "1.2.11", "dev": true, + "license": "LGPL-3.0", + "optional": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "content-hash": "^2.5.2", + "eth-ens-namehash": "2.0.8", + "underscore": "1.9.1", + "web3-core": "1.2.11", + "web3-core-helpers": "1.2.11", + "web3-core-promievent": "1.2.11", + "web3-eth-abi": "1.2.11", + "web3-eth-contract": "1.2.11", + "web3-utils": "1.2.11" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8.0.0" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/ganache-core/node_modules/web3-eth-iban": { + "version": "1.2.11", "dev": true, + "license": "LGPL-3.0", + "optional": true, "dependencies": { - "is-extglob": "^2.1.1" + "bn.js": "^4.11.9", + "web3-utils": "1.2.11" }, "engines": { - "node": ">=0.10.0" + "node": ">=8.0.0" } }, - "node_modules/is-hex-prefixed": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", + "node_modules/ganache-core/node_modules/web3-eth-personal": { + "version": "1.2.11", "dev": true, + "license": "LGPL-3.0", + "optional": true, + "dependencies": { + "@types/node": "^12.12.6", + "web3-core": "1.2.11", + "web3-core-helpers": "1.2.11", + "web3-core-method": "1.2.11", + "web3-net": "1.2.11", + "web3-utils": "1.2.11" + }, "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "node": ">=8.0.0" } }, - "node_modules/is-lower-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", - "integrity": "sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==", + "node_modules/ganache-core/node_modules/web3-eth-personal/node_modules/@types/node": { + "version": "12.19.12", "dev": true, - "dependencies": { - "lower-case": "^1.1.0" - } + "license": "MIT", + "optional": true }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "node_modules/ganache-core/node_modules/web3-net": { + "version": "1.2.11", "dev": true, - "engines": { - "node": ">= 0.4" + "license": "LGPL-3.0", + "optional": true, + "dependencies": { + "web3-core": "1.2.11", + "web3-core-method": "1.2.11", + "web3-utils": "1.2.11" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8.0.0" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/ganache-core/node_modules/web3-provider-engine": { + "version": "14.2.1", "dev": true, - "engines": { - "node": ">=0.12.0" + "license": "MIT", + "dependencies": { + "async": "^2.5.0", + "backoff": "^2.5.0", + "clone": "^2.0.0", + "cross-fetch": "^2.1.0", + "eth-block-tracker": "^3.0.0", + "eth-json-rpc-infura": "^3.1.0", + "eth-sig-util": "3.0.0", + "ethereumjs-block": "^1.2.2", + "ethereumjs-tx": "^1.2.0", + "ethereumjs-util": "^5.1.5", + "ethereumjs-vm": "^2.3.4", + "json-rpc-error": "^2.0.0", + "json-stable-stringify": "^1.0.1", + "promise-to-callback": "^1.0.0", + "readable-stream": "^2.2.9", + "request": "^2.85.0", + "semaphore": "^1.0.3", + "ws": "^5.1.1", + "xhr": "^2.2.0", + "xtend": "^4.0.1" } }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/abstract-leveldown": { + "version": "2.6.3", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "xtend": "~4.0.0" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/deferred-leveldown": { + "version": "1.2.2", "dev": true, - "engines": { - "node": ">=8" + "license": "MIT", + "dependencies": { + "abstract-leveldown": "~2.6.0" } }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/eth-sig-util": { + "version": "1.4.2", "dev": true, - "engines": { - "node": ">=8" + "license": "ISC", + "dependencies": { + "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git", + "ethereumjs-util": "^5.1.1" } }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-account": { + "version": "2.0.5", "dev": true, + "license": "MPL-2.0", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "ethereumjs-util": "^5.0.0", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-block": { + "version": "1.7.1", "dev": true, + "license": "MPL-2.0", "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "async": "^2.0.1", + "ethereum-common": "0.2.0", + "ethereumjs-tx": "^1.2.2", + "ethereumjs-util": "^5.0.0", + "merkle-patricia-tree": "^2.1.2" } }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-block/node_modules/ethereum-common": { + "version": "0.2.0", "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-tx": { + "version": "1.3.7", + "dev": true, + "license": "MPL-2.0", "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "ethereum-common": "^0.0.18", + "ethereumjs-util": "^5.0.0" } }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-util": { + "version": "5.2.1", "dev": true, + "license": "MPL-2.0", "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-vm": { + "version": "2.6.0", "dev": true, + "license": "MPL-2.0", "dependencies": { - "which-typed-array": "^1.1.11" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "async": "^2.1.2", + "async-eventemitter": "^0.2.2", + "ethereumjs-account": "^2.0.3", + "ethereumjs-block": "~2.2.0", + "ethereumjs-common": "^1.1.0", + "ethereumjs-util": "^6.0.0", + "fake-merkle-patricia-tree": "^1.0.1", + "functional-red-black-tree": "^1.0.1", + "merkle-patricia-tree": "^2.3.2", + "rustbn.js": "~0.2.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-vm/node_modules/ethereumjs-block": { + "version": "2.2.2", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "license": "MPL-2.0", + "dependencies": { + "async": "^2.0.1", + "ethereumjs-common": "^1.5.0", + "ethereumjs-tx": "^2.1.1", + "ethereumjs-util": "^5.0.0", + "merkle-patricia-tree": "^2.1.2" } }, - "node_modules/is-upper-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", - "integrity": "sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==", + "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-vm/node_modules/ethereumjs-block/node_modules/ethereumjs-util": { + "version": "5.2.1", "dev": true, + "license": "MPL-2.0", "dependencies": { - "upper-case": "^1.1.0" + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/is-url": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", - "dev": true - }, - "node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", - "dev": true - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-vm/node_modules/ethereumjs-tx": { + "version": "2.1.2", "dev": true, + "license": "MPL-2.0", "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "ethereumjs-common": "^1.5.0", + "ethereumjs-util": "^6.0.0" } }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-vm/node_modules/ethereumjs-util": { + "version": "6.2.1", "dev": true, + "license": "MPL-2.0", "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" } }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/isarray": { + "version": "0.0.1", + "dev": true, + "license": "MIT" }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true + "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-codec": { + "version": "7.0.1", + "dev": true, + "license": "MIT" }, - "node_modules/jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-errors": { + "version": "1.0.5", "dev": true, + "license": "MIT", "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" + "errno": "~0.1.1" } }, - "node_modules/jake/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-iterator-stream": { + "version": "1.3.1", "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "inherits": "^2.0.1", + "level-errors": "^1.0.3", + "readable-stream": "^1.0.33", + "xtend": "^4.0.0" } }, - "node_modules/jake/node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "dev": true - }, - "node_modules/jake/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-iterator-stream/node_modules/readable-stream": { + "version": "1.1.14", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "node_modules/jake/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-ws": { + "version": "0.0.0", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "readable-stream": "~1.0.15", + "xtend": "~2.1.1" } }, - "node_modules/jake/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jake/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-ws/node_modules/readable-stream": { + "version": "1.0.34", "dev": true, - "engines": { - "node": ">=8" + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "node_modules/jake/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-ws/node_modules/xtend": { + "version": "2.1.2", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "object-keys": "~0.4.0" }, "engines": { - "node": ">=8" + "node": ">=0.4" } }, - "node_modules/js-sdsl": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.2.tgz", - "integrity": "sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==", + "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/levelup": { + "version": "1.3.9", "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" + "license": "MIT", + "dependencies": { + "deferred-leveldown": "~1.2.1", + "level-codec": "~7.0.0", + "level-errors": "~1.0.3", + "level-iterator-stream": "~1.3.0", + "prr": "~1.0.1", + "semver": "~5.4.1", + "xtend": "~4.0.0" } }, - "node_modules/js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ltgt": { + "version": "2.2.1", + "dev": true, + "license": "MIT" }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/memdown": { + "version": "1.4.1", "dev": true, + "license": "MIT", "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "abstract-leveldown": "~2.7.1", + "functional-red-black-tree": "^1.0.1", + "immediate": "^3.2.3", + "inherits": "~2.0.1", + "ltgt": "~2.2.0", + "safe-buffer": "~5.1.1" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true + "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/memdown/node_modules/abstract-leveldown": { + "version": "2.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "xtend": "~4.0.0" + } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/merkle-patricia-tree": { + "version": "2.3.2", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "async": "^1.4.2", + "ethereumjs-util": "^5.0.0", + "level-ws": "0.0.0", + "levelup": "^1.2.1", + "memdown": "^1.0.0", + "readable-stream": "^2.0.0", + "rlp": "^2.0.0", + "semaphore": ">=1.0.1" + } }, - "node_modules/json-schema": { + "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/merkle-patricia-tree/node_modules/async": { + "version": "1.5.2", + "dev": true, + "license": "MIT" + }, + "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/object-keys": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true + "dev": true, + "license": "MIT" }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/semver": { + "version": "5.4.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true + "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/string_decoder": { + "version": "0.10.31", + "dev": true, + "license": "MIT" }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ws": { + "version": "5.2.2", "dev": true, - "bin": { - "json5": "lib/cli.js" + "license": "MIT", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/ganache-core/node_modules/web3-providers-http": { + "version": "1.2.11", + "dev": true, + "license": "LGPL-3.0", + "optional": true, + "dependencies": { + "web3-core-helpers": "1.2.11", + "xhr2-cookies": "1.1.0" }, "engines": { - "node": ">=6" + "node": ">=8.0.0" } }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "node_modules/ganache-core/node_modules/web3-providers-ipc": { + "version": "1.2.11", "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "license": "LGPL-3.0", + "optional": true, + "dependencies": { + "oboe": "2.1.4", + "underscore": "1.9.1", + "web3-core-helpers": "1.2.11" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/jsonschema": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", - "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", + "node_modules/ganache-core/node_modules/web3-providers-ws": { + "version": "1.2.11", "dev": true, + "license": "LGPL-3.0", + "optional": true, + "dependencies": { + "eventemitter3": "4.0.4", + "underscore": "1.9.1", + "web3-core-helpers": "1.2.11", + "websocket": "^1.0.31" + }, "engines": { - "node": "*" + "node": ">=8.0.0" } }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "node_modules/ganache-core/node_modules/web3-shh": { + "version": "1.2.11", "dev": true, + "license": "LGPL-3.0", + "optional": true, "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" + "web3-core": "1.2.11", + "web3-core-method": "1.2.11", + "web3-core-subscriptions": "1.2.11", + "web3-net": "1.2.11" }, "engines": { - "node": ">=0.6.0" + "node": ">=8.0.0" } }, - "node_modules/keccak": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", - "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", + "node_modules/ganache-core/node_modules/web3-utils": { + "version": "1.2.11", "dev": true, - "hasInstallScript": true, + "license": "LGPL-3.0", + "optional": true, "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" + "bn.js": "^4.11.9", + "eth-lib": "0.2.8", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "underscore": "1.9.1", + "utf8": "3.0.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=8.0.0" } }, - "node_modules/keccak/node_modules/node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "dev": true + "node_modules/ganache-core/node_modules/web3-utils/node_modules/eth-lib": { + "version": "0.2.8", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "node_modules/ganache-core/node_modules/websocket": { + "version": "1.0.32", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bufferutil": "^4.0.1", + "debug": "^2.2.0", + "es5-ext": "^0.10.50", + "typedarray-to-buffer": "^3.1.5", + "utf-8-validate": "^5.0.2", + "yaeti": "^0.0.6" + }, + "engines": { + "node": ">=4.0.0" + } }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "node_modules/ganache-core/node_modules/websocket/node_modules/debug": { + "version": "2.6.9", "dev": true, + "license": "MIT", "dependencies": { - "json-buffer": "3.0.1" + "ms": "2.0.0" } }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "node_modules/ganache-core/node_modules/websocket/node_modules/ms": { + "version": "2.0.0", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", + "node_modules/ganache-core/node_modules/whatwg-fetch": { + "version": "2.0.4", "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.9" - } + "license": "MIT" }, - "node_modules/klaw-sync": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", - "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "node_modules/ganache-core/node_modules/wrappy": { + "version": "1.0.2", "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11" - } + "license": "ISC" }, - "node_modules/lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", + "node_modules/ganache-core/node_modules/ws": { + "version": "3.3.3", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "invert-kv": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" } }, - "node_modules/level": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", - "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", + "node_modules/ganache-core/node_modules/ws/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/ganache-core/node_modules/xhr": { + "version": "2.6.0", "dev": true, + "license": "MIT", "dependencies": { - "browser-level": "^1.0.1", - "classic-level": "^1.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/level" + "global": "~4.4.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" } }, - "node_modules/level-codec": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz", - "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==", + "node_modules/ganache-core/node_modules/xhr-request": { + "version": "1.1.0", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "buffer": "^5.6.0" - }, - "engines": { - "node": ">=6" + "buffer-to-arraybuffer": "^0.0.5", + "object-assign": "^4.1.1", + "query-string": "^5.0.1", + "simple-get": "^2.7.0", + "timed-out": "^4.0.1", + "url-set-query": "^1.0.0", + "xhr": "^2.0.4" } }, - "node_modules/level-concat-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", - "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==", + "node_modules/ganache-core/node_modules/xhr-request-promise": { + "version": "0.1.3", "dev": true, - "engines": { - "node": ">=6" + "license": "MIT", + "optional": true, + "dependencies": { + "xhr-request": "^1.1.0" } }, - "node_modules/level-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", - "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==", + "node_modules/ganache-core/node_modules/xhr2-cookies": { + "version": "1.1.0", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "errno": "~0.1.1" - }, - "engines": { - "node": ">=6" + "cookiejar": "^2.1.1" } }, - "node_modules/level-iterator-stream": { + "node_modules/ganache-core/node_modules/xtend": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz", - "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==", "dev": true, - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.4.0", - "xtend": "^4.0.2" - }, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=0.4" } }, - "node_modules/level-mem": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/level-mem/-/level-mem-5.0.1.tgz", - "integrity": "sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg==", + "node_modules/ganache-core/node_modules/yaeti": { + "version": "0.0.6", "dev": true, - "dependencies": { - "level-packager": "^5.0.3", - "memdown": "^5.0.0" - }, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=0.10.32" } }, - "node_modules/level-packager": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-5.1.1.tgz", - "integrity": "sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==", + "node_modules/ganache-core/node_modules/yallist": { + "version": "3.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, - "dependencies": { - "encoding-down": "^6.3.0", - "levelup": "^4.3.2" - }, "engines": { - "node": ">=6" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/level-supports": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", - "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, + "peer": true, "engines": { - "node": ">=12" + "node": "*" } }, - "node_modules/level-transcoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", - "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dev": true, "dependencies": { - "buffer": "^6.0.3", - "module-error": "^1.0.1" + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" }, - "engines": { - "node": ">=12" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/level-transcoder/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "engines": { + "node": ">=8.0.0" } }, - "node_modules/level-ws": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-2.0.0.tgz", - "integrity": "sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA==", + "node_modules/get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "readable-stream": "^3.1.0", - "xtend": "^4.0.1" - }, + "peer": true, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/levelup": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz", - "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==", + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, "dependencies": { - "deferred-leveldown": "~5.3.0", - "level-errors": "~2.0.0", - "level-iterator-stream": "~4.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/levelup/node_modules/level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dev": true, "dependencies": { - "xtend": "^4.0.2" - }, - "engines": { - "node": ">=6" + "assert-plus": "^1.0.0" } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "node_modules/ghost-testrpc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", + "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==", "dev": true, + "peer": true, "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "chalk": "^2.4.2", + "node-emoji": "^1.10.0" }, - "engines": { - "node": ">= 0.8.0" + "bin": { + "testrpc-sc": "index.js" } }, - "node_modules/load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/load-json-file/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10.13.0" } }, - "node_modules/load-json-file/node_modules/strip-bom": { + "node_modules/global-modules": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "dev": true, + "peer": true, "dependencies": { - "is-utf8": "^0.2.0" + "global-prefix": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dev": true, + "peer": true, "dependencies": { - "p-locate": "^4.1.0" + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==", - "dev": true - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "peer": true, "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" + "isexe": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "which": "bin/which" } }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "type-fest": "^0.20.2" }, "engines": { "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "define-properties": "^1.1.3" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", "dev": true, + "peer": true, "dependencies": { - "has-flag": "^4.0.0" + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", - "dev": true - }, - "node_modules/lower-case-first": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", - "integrity": "sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==", - "dev": true, - "dependencies": { - "lower-case": "^1.1.2" - } - }, - "node_modules/lowercase-keys": { + "node_modules/globby/node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lru_map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", - "dev": true + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, "dependencies": { - "yallist": "^3.0.2" + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ltgt": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==", - "dev": true - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "node_modules/markdown-table": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", - "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "node_modules/mcl-wasm": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", - "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, "engines": { - "node": ">=8.9.0" + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" } }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "node_modules/handlebars/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=4" } }, - "node_modules/memdown": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz", - "integrity": "sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==", + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", "dev": true, "dependencies": { - "abstract-leveldown": "~6.2.1", - "functional-red-black-tree": "~1.0.1", - "immediate": "~3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.2.0" + "ajv": "^6.12.3", + "har-schema": "^2.0.0" }, "engines": { "node": ">=6" } }, - "node_modules/memdown/node_modules/abstract-leveldown": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", - "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", + "node_modules/hardhat": { + "version": "2.17.2", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.17.2.tgz", + "integrity": "sha512-oUv40jBeHw0dKpbyQ+iH9cmNMziweLoTW3MnkNxJ2Gc0KGLrQR/1n4vV4xY60zn2LdmRgnwPqy3CgtY0mfwIIA==", "dev": true, "dependencies": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" + "@ethersproject/abi": "^5.1.2", + "@metamask/eth-sig-util": "^4.0.0", + "@nomicfoundation/ethereumjs-block": "5.0.2", + "@nomicfoundation/ethereumjs-blockchain": "7.0.2", + "@nomicfoundation/ethereumjs-common": "4.0.2", + "@nomicfoundation/ethereumjs-evm": "2.0.2", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", + "@nomicfoundation/ethereumjs-statemanager": "2.0.2", + "@nomicfoundation/ethereumjs-trie": "6.0.2", + "@nomicfoundation/ethereumjs-tx": "5.0.2", + "@nomicfoundation/ethereumjs-util": "9.0.2", + "@nomicfoundation/ethereumjs-vm": "7.0.2", + "@nomicfoundation/solidity-analyzer": "^0.1.0", + "@sentry/node": "^5.18.1", + "@types/bn.js": "^5.1.0", + "@types/lru-cache": "^5.1.0", + "adm-zip": "^0.4.16", + "aggregate-error": "^3.0.0", + "ansi-escapes": "^4.3.0", + "chalk": "^2.4.2", + "chokidar": "^3.4.0", + "ci-info": "^2.0.0", + "debug": "^4.1.1", + "enquirer": "^2.3.0", + "env-paths": "^2.2.0", + "ethereum-cryptography": "^1.0.3", + "ethereumjs-abi": "^0.6.8", + "find-up": "^2.1.0", + "fp-ts": "1.19.3", + "fs-extra": "^7.0.1", + "glob": "7.2.0", + "immutable": "^4.0.0-rc.12", + "io-ts": "1.10.4", + "keccak": "^3.0.2", + "lodash": "^4.17.11", + "mnemonist": "^0.38.0", + "mocha": "^10.0.0", + "p-map": "^4.0.0", + "raw-body": "^2.4.1", + "resolve": "1.17.0", + "semver": "^6.3.0", + "solc": "0.7.3", + "source-map-support": "^0.5.13", + "stacktrace-parser": "^0.1.10", + "tsort": "0.0.1", + "undici": "^5.14.0", + "uuid": "^8.3.2", + "ws": "^7.4.6" }, - "engines": { - "node": ">=6" + "bin": { + "hardhat": "internal/cli/bootstrap.js" + }, + "peerDependencies": { + "ts-node": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + }, + "typescript": { + "optional": true + } } }, - "node_modules/memdown/node_modules/immediate": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", - "integrity": "sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg==", - "dev": true - }, - "node_modules/memdown/node_modules/level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", + "node_modules/hardhat-dependency-compiler": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hardhat-dependency-compiler/-/hardhat-dependency-compiler-1.1.3.tgz", + "integrity": "sha512-bCDqsOxGST6WkbMvj4lPchYWidNSSBm5CFnkyAex1T11cGmr9otZTGl81W6f9pmrtBXbKCvr3OSuNJ6Q394sAw==", "dev": true, - "dependencies": { - "xtend": "^4.0.2" - }, "engines": { - "node": ">=6" + "node": ">=14.14.0" + }, + "peerDependencies": { + "hardhat": "^2.0.0" } }, - "node_modules/memory-level": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", - "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", + "node_modules/hardhat-gas-reporter": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz", + "integrity": "sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==", "dev": true, + "peer": true, "dependencies": { - "abstract-level": "^1.0.0", - "functional-red-black-tree": "^1.0.1", - "module-error": "^1.0.1" + "array-uniq": "1.0.3", + "eth-gas-reporter": "^0.2.25", + "sha1": "^1.1.1" }, - "engines": { - "node": ">=12" + "peerDependencies": { + "hardhat": "^2.0.2" } }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "node_modules/hardhat/node_modules/@noble/hashes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", + "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", "dev": true, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/hardhat/node_modules/@scure/bip32": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", + "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", "dev": true, - "engines": { - "node": ">= 8" + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.2.0", + "@noble/secp256k1": "~1.7.0", + "@scure/base": "~1.1.0" } }, - "node_modules/merkle-patricia-tree": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz", - "integrity": "sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w==", + "node_modules/hardhat/node_modules/@scure/bip39": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", + "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { - "@types/levelup": "^4.3.0", - "ethereumjs-util": "^7.1.4", - "level-mem": "^5.0.1", - "level-ws": "^2.0.0", - "readable-stream": "^3.6.0", - "semaphore-async-await": "^1.5.1" + "@noble/hashes": "~1.2.0", + "@scure/base": "~1.1.0" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "node_modules/hardhat/node_modules/ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", "dev": true, - "engines": { - "node": ">= 0.6" + "dependencies": { + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" } }, - "node_modules/micro-ftch": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", - "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==", - "dev": true - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "node_modules/hardhat/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", "dev": true, "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "locate-path": "^2.0.0" }, "engines": { - "node": ">=8.6" + "node": ">=4" } }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "node_modules/hardhat/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, - "bin": { - "miller-rabin": "bin/miller-rabin" + "engines": { + "node": ">=6 <7 || >=8" } }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "node_modules/hardhat/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "node_modules/hardhat/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", "dev": true, - "bin": { - "mime": "cli.js" + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "engines": { "node": ">=4" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/hardhat/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=4" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/hardhat/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", "dev": true, "dependencies": { - "mime-db": "1.52.0" + "p-limit": "^1.1.0" }, "engines": { - "node": ">= 0.6" + "node": ">=4" } }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "node_modules/hardhat/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, "engines": { "node": ">=4" } }, - "node_modules/min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", - "dev": true, - "dependencies": { - "dom-walk": "^0.1.0" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/hardhat/node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "path-parse": "^1.0.6" }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "node_modules/minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "dev": true, - "dependencies": { - "minipass": "^2.9.0" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "node_modules/hardhat/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "dependencies": { - "minimist": "^1.2.6" + "glob": "^7.1.3" }, "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mkdirp-promise": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", - "integrity": "sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==", - "deprecated": "This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that.", - "dev": true, - "dependencies": { - "mkdirp": "*" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mnemonist": { - "version": "0.38.5", - "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", - "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", - "dev": true, - "dependencies": { - "obliterator": "^2.0.0" + "rimraf": "bin.js" } }, - "node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "node_modules/hardhat/node_modules/solc": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", + "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", "dev": true, "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" + "command-exists": "^1.2.8", + "commander": "3.0.2", + "follow-redirects": "^1.12.1", + "fs-extra": "^0.30.0", + "js-sha3": "0.8.0", + "memorystream": "^0.3.1", + "require-from-string": "^2.0.0", + "semver": "^5.5.0", + "tmp": "0.0.33" }, "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" + "solcjs": "solcjs" }, "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "node": ">=8.0.0" } }, - "node_modules/mocha/node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "node_modules/hardhat/node_modules/solc/node_modules/fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", "dev": true, - "engines": { - "node": ">=6" + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" } }, - "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/hardhat/node_modules/solc/node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/mocha/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/hardhat/node_modules/solc/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/hardhat/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 4.0.0" } }, - "node_modules/mocha/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/hardhat/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, "engines": { - "node": ">=10" + "node": ">=8.3.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/mocha/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/has": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">= 0.4.0" } }, - "node_modules/mocha/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, "engines": { - "node": ">=10" + "node": ">=4" } }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/mocha/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", "dev": true, "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" + "get-intrinsic": "^1.1.1" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mocha/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/mock-fs": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", - "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==", - "dev": true - }, - "node_modules/module-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", - "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/multibase": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", - "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", - "deprecated": "This module has been superseded by the multiformats module", - "dev": true, - "dependencies": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" - } - }, - "node_modules/multicodec": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", - "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", - "deprecated": "This module has been superseded by the multiformats module", - "dev": true, - "dependencies": { - "varint": "^5.0.0" - } - }, - "node_modules/multihashes": { - "version": "0.4.21", - "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", - "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "multibase": "^0.7.0", - "varint": "^5.0.0" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/multihashes/node_modules/multibase": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", - "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", - "deprecated": "This module has been superseded by the multiformats module", + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dev": true, "dependencies": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/nano-base32": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nano-base32/-/nano-base32-1.0.1.tgz", - "integrity": "sha512-sxEtoTqAPdjWVGv71Q17koMFGsOMSiHsIFEvzOM7cNp8BXB4AnEwmDabm5dorusJf/v1z7QxaZYxUorU9RKaAw==", - "dev": true - }, - "node_modules/nano-json-stream-parser": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", - "integrity": "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==", - "dev": true - }, - "node_modules/nanoassert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", - "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">=4" } }, - "node_modules/napi-macros": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", - "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/natural-orderby": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-2.0.3.tgz", - "integrity": "sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==", + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, - "engines": { - "node": "*" + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, - "engines": { - "node": ">= 0.6" + "bin": { + "he": "bin/he" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "node_modules/heap": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", "dev": true }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", - "dev": true + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, - "node_modules/no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "node_modules/http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", "dev": true, + "peer": true, "dependencies": { - "lower-case": "^1.1.1" + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } }, - "node_modules/node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "node_modules/http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", "dev": true, + "peer": true, "dependencies": { - "lodash": "^4.17.21" + "@types/node": "^10.0.3" } }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "node_modules/http-response-object/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", + "dev": true, + "peer": true + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "dev": true, "dependencies": { - "whatwg-url": "^5.0.0" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" }, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "node": ">=0.8", + "npm": ">=1.3.7" } }, - "node_modules/node-gyp-build": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.1.tgz", - "integrity": "sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==", - "devOptional": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/nofilter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", - "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", + "node_modules/hyperlinker": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hyperlinker/-/hyperlinker-1.0.0.tgz", + "integrity": "sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==", "dev": true, "engines": { - "node": ">=12.19" + "node": ">=4" } }, - "node_modules/nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "dependencies": { - "abbrev": "1" + "safer-buffer": ">= 2.1.2 < 3" }, - "bin": { - "nopt": "bin/nopt.js" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "node_modules/idna-uts46-hx": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", + "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", "dev": true, "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "punycode": "2.1.0" + }, + "engines": { + "node": ">=4.0.0" } }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true, - "bin": { - "semver": "bin/semver" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">= 4" } }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "node_modules/immediate": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", + "dev": true + }, + "node_modules/immutable": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, "engines": { - "node": ">=10" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" + "engines": { + "node": ">=0.8.19" } }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/number-to-bn": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "dependencies": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/number-to-bn/node_modules/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true, - "engines": { - "node": "*" - } + "peer": true }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/object-inspect": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.0.tgz", - "integrity": "sha512-HQ4J+ic8hKrgIt3mqk6cVOVrW2ozL4KdvHlqpBv9vDYWx9ysAgENAdvy4FoGF+KFdhR7nQTNm5J0ctAeOwn+3g==", + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peer": true, + "engines": { + "node": ">= 0.10" } }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "node_modules/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", "dev": true, "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" } }, - "node_modules/object-treeify": { - "version": "1.1.33", - "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.33.tgz", - "integrity": "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==", + "node_modules/io-ts": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", + "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", "dev": true, - "engines": { - "node": ">= 10" + "dependencies": { + "fp-ts": "^1.0.0" } }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" }, - "engines": { - "node": ">= 0.4" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "binary-extensions": "^2.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -21518,30 +17729,34 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" } }, - "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, "engines": { "node": ">= 0.4" }, @@ -21549,50 +17764,52 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/obliterator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", - "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==", - "dev": true - }, - "node_modules/oboe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", - "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "dev": true, "dependencies": { - "http-https": "^1.0.0" + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" } }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "dev": true, "dependencies": { - "ee-first": "1.1.1" + "has": "^1.0.3" }, - "engines": { - "node": ">= 0.8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, "dependencies": { - "wrappy": "1" + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" + "bin": { + "is-docker": "cli.js" }, "engines": { "node": ">=8" @@ -21601,252 +17818,274 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, "engines": { - "node": ">= 0.8.0" + "node": ">=0.10.0" } }, - "node_modules/os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "dependencies": { - "lcid": "^1.0.0" + "is-extglob": "^2.1.1" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "node_modules/is-hex-prefixed": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", + "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=6.5.0", + "npm": ">=3" } }, - "node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, "engines": { - "node": ">=12.20" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "dependencies": { - "p-try": "^2.0.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, "engines": { "node": ">=8" } }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "dependencies": { - "aggregate-error": "^3.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, - "engines": { - "node": ">=6" + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/packet-reader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", - "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==", - "dev": true - }, - "node_modules/param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, "dependencies": { - "no-case": "^2.2.0" + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, "dependencies": { - "callsites": "^3.0.0" + "has-symbols": "^1.0.2" }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/parse-cache-control": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", - "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", - "dev": true - }, - "node_modules/parse-headers": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", - "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==", + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, - "node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, - "dependencies": { - "error-ex": "^1.2.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "node_modules/is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", + "dev": true + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "dependencies": { - "entities": "^4.4.0" + "call-bind": "^1.0.2" }, "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "dependencies": { - "domhandler": "^5.0.2", - "parse5": "^7.0.0" + "is-docker": "^2.0.0" }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/pascal-case": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", - "integrity": "sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==", - "dev": true, - "dependencies": { - "camel-case": "^3.0.0", - "upper-case-first": "^1.1.0" - } + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, - "node_modules/password-prompt": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/password-prompt/-/password-prompt-1.1.3.tgz", - "integrity": "sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw==", + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isomorphic-unfetch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz", + "integrity": "sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==", "dev": true, "dependencies": { - "ansi-escapes": "^4.3.2", - "cross-spawn": "^7.0.3" + "node-fetch": "^2.6.1", + "unfetch": "^4.2.0" } }, - "node_modules/patch-package": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.5.1.tgz", - "integrity": "sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA==", + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, + "node_modules/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", "dev": true, "dependencies": { - "@yarnpkg/lockfile": "^1.1.0", - "chalk": "^4.1.2", - "cross-spawn": "^6.0.5", - "find-yarn-workspace-root": "^2.0.0", - "fs-extra": "^9.0.0", - "is-ci": "^2.0.0", - "klaw-sync": "^6.0.0", - "minimist": "^1.2.6", - "open": "^7.4.2", - "rimraf": "^2.6.3", - "semver": "^5.6.0", - "slash": "^2.0.0", - "tmp": "^0.0.33", - "yaml": "^1.10.2" + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" }, "bin": { - "patch-package": "index.js" + "jake": "bin/cli.js" }, "engines": { - "node": ">=10", - "npm": ">5" + "node": ">=10" } }, - "node_modules/patch-package/node_modules/ansi-styles": { + "node_modules/jake/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", @@ -21861,7 +18100,13 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/patch-package/node_modules/chalk": { + "node_modules/jake/node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, + "node_modules/jake/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", @@ -21877,7 +18122,7 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/patch-package/node_modules/color-convert": { + "node_modules/jake/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", @@ -21889,44 +18134,13 @@ "node": ">=7.0.0" } }, - "node_modules/patch-package/node_modules/color-name": { + "node_modules/jake/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/patch-package/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/patch-package/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/patch-package/node_modules/has-flag": { + "node_modules/jake/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", @@ -21935,70 +18149,7 @@ "node": ">=8" } }, - "node_modules/patch-package/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/patch-package/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/patch-package/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/patch-package/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/patch-package/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/patch-package/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/patch-package/node_modules/supports-color": { + "node_modules/jake/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", @@ -22010,1929 +18161,1989 @@ "node": ">=8" } }, - "node_modules/patch-package/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/patch-package/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "node_modules/js-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", + "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==", "dev": true }, - "node_modules/path-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", - "integrity": "sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==", - "dev": true, - "dependencies": { - "no-case": "^2.2.0" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "node_modules/js-sdsl": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.2.tgz", + "integrity": "sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==", "dev": true, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "engines": { - "node": ">=8" + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "dev": true }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "bin": { + "json5": "lib/cli.js" + }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonschema": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", + "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", + "dev": true, + "peer": true, "engines": { "node": "*" } }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" }, "engines": { - "node": ">=0.12" + "node": ">=0.6.0" } }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true - }, - "node_modules/pg": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.3.tgz", - "integrity": "sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==", + "node_modules/keccak": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", + "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", "dev": true, + "hasInstallScript": true, "dependencies": { - "buffer-writer": "2.0.0", - "packet-reader": "1.0.0", - "pg-connection-string": "^2.6.2", - "pg-pool": "^3.6.1", - "pg-protocol": "^1.6.0", - "pg-types": "^2.1.0", - "pgpass": "1.x" + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" }, "engines": { - "node": ">= 8.0.0" - }, - "optionalDependencies": { - "pg-cloudflare": "^1.1.1" - }, - "peerDependencies": { - "pg-native": ">=3.0.1" - }, - "peerDependenciesMeta": { - "pg-native": { - "optional": true - } + "node": ">=10.0.0" } }, - "node_modules/pg-cloudflare": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", - "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", - "dev": true, - "optional": true - }, - "node_modules/pg-connection-string": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", - "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==", + "node_modules/keccak/node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", "dev": true }, - "node_modules/pg-int8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, - "engines": { - "node": ">=4.0.0" + "dependencies": { + "json-buffer": "3.0.1" } }, - "node_modules/pg-pool": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz", - "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==", + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, - "peerDependencies": { - "pg": ">=8.0" + "peer": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/pg-protocol": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", - "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==", - "dev": true - }, - "node_modules/pg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "node_modules/klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", "dev": true, - "dependencies": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" - }, - "engines": { - "node": ">=4" + "optionalDependencies": { + "graceful-fs": "^4.1.9" } }, - "node_modules/pgpass": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", - "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "node_modules/klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", "dev": true, "dependencies": { - "split2": "^4.1.0" + "graceful-fs": "^4.1.11" } }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", "dev": true, - "engines": { - "node": ">=8.6" + "dependencies": { + "invert-kv": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "node_modules/level": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", + "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", "dev": true, + "dependencies": { + "browser-level": "^1.0.1", + "classic-level": "^1.2.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/level" } }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "node_modules/level-codec": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz", + "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==", "dev": true, "dependencies": { - "pinkie": "^2.0.0" + "buffer": "^5.6.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "node_modules/level-codec/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, - "engines": { - "node": ">=4" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/postgres-bytea": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "node_modules/level-concat-iterator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", + "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "node_modules/level-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", + "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==", "dev": true, + "dependencies": { + "errno": "~0.1.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "node_modules/level-iterator-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz", + "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==", "dev": true, "dependencies": { - "xtend": "^4.0.0" + "inherits": "^2.0.4", + "readable-stream": "^3.4.0", + "xtend": "^4.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/postinstall-postinstall": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz", - "integrity": "sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ==", - "dev": true, - "hasInstallScript": true - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "node_modules/level-mem": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/level-mem/-/level-mem-5.0.1.tgz", + "integrity": "sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg==", "dev": true, + "dependencies": { + "level-packager": "^5.0.3", + "memdown": "^5.0.0" + }, "engines": { - "node": ">= 0.8.0" + "node": ">=6" } }, - "node_modules/prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", + "node_modules/level-packager": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-5.1.1.tgz", + "integrity": "sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==", "dev": true, + "dependencies": { + "encoding-down": "^6.3.0", + "levelup": "^4.3.2" + }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "node_modules/level-supports": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", + "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "node": ">=12" } }, - "node_modules/prettier-plugin-solidity": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.3.tgz", - "integrity": "sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg==", + "node_modules/level-transcoder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", + "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", "dev": true, "dependencies": { - "@solidity-parser/parser": "^0.16.0", - "semver": "^7.3.8", - "solidity-comments-extractor": "^0.0.7" + "buffer": "^6.0.3", + "module-error": "^1.0.1" }, "engines": { "node": ">=12" - }, - "peerDependencies": { - "prettier": ">=2.3.0 || >=3.0.0-alpha.0" } }, - "node_modules/prettier-plugin-solidity/node_modules/@solidity-parser/parser": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.1.tgz", - "integrity": "sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw==", + "node_modules/level-transcoder/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "antlr4ts": "^0.5.0-alpha.4" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/prettier-plugin-solidity/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/level-ws": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-2.0.0.tgz", + "integrity": "sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "inherits": "^2.0.3", + "readable-stream": "^3.1.0", + "xtend": "^4.0.1" }, "engines": { - "node": ">=10" + "node": ">=6" } }, - "node_modules/prettier-plugin-solidity/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "node_modules/levelup": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz", + "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "deferred-leveldown": "~5.3.0", + "level-errors": "~2.0.0", + "level-iterator-stream": "~4.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" } }, - "node_modules/prettier-plugin-solidity/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "node_modules/levelup/node_modules/level-supports": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", + "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", + "dev": true, + "dependencies": { + "xtend": "^4.0.2" + }, + "engines": { + "node": ">=6" + } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, "engines": { - "node": ">= 0.6.0" + "node": ">= 0.8.0" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/promise": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", - "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "node_modules/load-json-file/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, - "dependencies": { - "asap": "~2.0.6" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/proper-lockfile": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", - "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "node_modules/load-json-file/node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", "dev": true, "dependencies": { - "graceful-fs": "^4.2.4", - "retry": "^0.12.0", - "signal-exit": "^3.0.2" + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" + "p-locate": "^5.0.0" }, "engines": { - "node": ">= 0.10" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "node_modules/lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==", "dev": true }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true, + "peer": true }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } + "peer": true }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true, + "peer": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } + "peer": true }, - "node_modules/punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pure-rand": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-5.0.5.tgz", - "integrity": "sha512-BwQpbqxSCBJVpamI6ydzcKqyFmnd5msMWUGvzXLm1aXvusbbgkbOto/EUPM00hjveJEaJtdbhUjKSzWRhQVkaw==", + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ] + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=0.6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=0.10.0" + "node": ">=7.0.0" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">=10" + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=8" } }, - "node_modules/ramda": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", - "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==", + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/lru_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", "dev": true }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "dependencies": { - "safe-buffer": "^5.1.0" + "yallist": "^3.0.2" } }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "node_modules/ltgt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==", + "dev": true + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/markdown-table": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", + "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", "dev": true, - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } + "peer": true }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "node_modules/mcl-wasm": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", + "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=8.9.0" } }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dev": true, "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "node_modules/read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "node_modules/memdown": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz", + "integrity": "sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==", "dev": true, "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "abstract-leveldown": "~6.2.1", + "functional-red-black-tree": "~1.0.1", + "immediate": "~3.2.3", + "inherits": "~2.0.1", + "ltgt": "~2.2.0", + "safe-buffer": "~5.2.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "node_modules/memdown/node_modules/abstract-leveldown": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", + "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", "dev": true, "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "buffer": "^5.5.0", + "immediate": "^3.2.3", + "level-concat-iterator": "~2.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "node_modules/memdown/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "node_modules/memdown/node_modules/immediate": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", + "integrity": "sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg==", + "dev": true + }, + "node_modules/memdown/node_modules/level-supports": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", + "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", "dev": true, "dependencies": { - "pinkie-promise": "^2.0.0" + "xtend": "^4.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "node_modules/memory-level": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", + "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", "dev": true, "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "abstract-level": "^1.0.0", + "functional-red-black-tree": "^1.0.1", + "module-error": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/read-pkg/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">= 0.10.0" } }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, "engines": { - "node": ">= 6" + "node": ">= 8" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/merkle-patricia-tree": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz", + "integrity": "sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w==", "dev": true, "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" + "@types/levelup": "^4.3.0", + "ethereumjs-util": "^7.1.4", + "level-mem": "^5.0.1", + "level-ws": "^2.0.0", + "readable-stream": "^3.6.0", + "semaphore-async-await": "^1.5.1" } }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "node_modules/micro-ftch": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", + "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "dependencies": { - "resolve": "^1.1.6" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": ">= 0.10" + "node": ">=8.6" } }, - "node_modules/recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "dependencies": { - "minimatch": "^3.0.5" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" }, - "engines": { - "node": ">=6.0.0" + "bin": { + "miller-rabin": "bin/miller-rabin" } }, - "node_modules/redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, - "dependencies": { - "esprima": "~4.0.0" + "engines": { + "node": ">= 0.6" } }, - "node_modules/redeyed/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "dependencies": { + "mime-db": "1.52.0" }, "engines": { - "node": ">=4" + "node": ">= 0.6" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 0.4" - }, + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/req-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", - "integrity": "sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==", + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "dependencies": { - "req-from": "^2.0.0" + "minimist": "^1.2.6" }, - "engines": { - "node": ">=4" + "bin": { + "mkdirp": "bin/cmd.js" } }, - "node_modules/req-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz", - "integrity": "sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==", + "node_modules/mnemonist": { + "version": "0.38.5", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", + "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", "dev": true, "dependencies": { - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" + "obliterator": "^2.0.0" } }, - "node_modules/req-from/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "node_modules/mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", "dev": true, + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, "engines": { - "node": ">=4" + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" } }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "node_modules/mocha/node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true, - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, "engines": { - "node": ">= 6" + "node": ">=6" } }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" + "balanced-match": "^1.0.0" } }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "bin": { - "uuid": "bin/uuid" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "node_modules/mocha/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==", + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "has-flag": "^4.0.0" }, - "bin": { - "resolve": "bin/resolve" + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "node_modules/module-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", + "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", "dev": true, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoassert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", + "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true, - "dependencies": { - "lowercase-keys": "^2.0.0" + "bin": { + "nanoid": "bin/nanoid.cjs" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/responselike/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } + "node_modules/napi-macros": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", + "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "node_modules/natural-orderby": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-2.0.3.tgz", + "integrity": "sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==", "dev": true, "engines": { - "node": ">= 4" + "node": "*" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "peer": true, + "dependencies": { + "lodash": "^4.17.21" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dev": true, "dependencies": { - "glob": "^7.1.3" + "whatwg-url": "^5.0.0" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": "4.x || >=6.0.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "node_modules/node-gyp-build": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.1.tgz", + "integrity": "sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==", "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" } }, - "node_modules/ripemd160-min": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/ripemd160-min/-/ripemd160-min-0.0.6.tgz", - "integrity": "sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A==", + "node_modules/nofilter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12.19" } }, - "node_modules/rlp": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", - "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", + "node_modules/nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", "dev": true, + "peer": true, "dependencies": { - "bn.js": "^5.2.0" + "abbrev": "1" }, "bin": { - "rlp": "bin/rlp" + "nopt": "bin/nopt.js" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "dependencies": { - "queue-microtask": "^1.2.2" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "node_modules/run-parallel-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", - "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" + "bin": { + "semver": "bin/semver" } }, - "node_modules/rustbn.js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", - "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==", - "dev": true - }, - "node_modules/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/sc-istanbul": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz", - "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==", + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", "dev": true, - "dependencies": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.8.x", - "esprima": "2.7.x", - "glob": "^5.0.15", - "handlebars": "^4.0.1", - "js-yaml": "3.x", - "mkdirp": "0.5.x", - "nopt": "3.x", - "once": "1.x", - "resolve": "1.1.x", - "supports-color": "^3.1.0", - "which": "^1.1.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "istanbul": "lib/cli.js" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/sc-istanbul/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/number-to-bn": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", + "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", "dev": true, "dependencies": { - "sprintf-js": "~1.0.2" + "bn.js": "4.11.6", + "strip-hex-prefix": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" } }, - "node_modules/sc-istanbul/node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "node_modules/number-to-bn/node_modules/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", "dev": true }, - "node_modules/sc-istanbul/node_modules/glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true, - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, "engines": { "node": "*" } }, - "node_modules/sc-istanbul/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/sc-istanbul/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/object-inspect": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.0.tgz", + "integrity": "sha512-HQ4J+ic8hKrgIt3mqk6cVOVrW2ozL4KdvHlqpBv9vDYWx9ysAgENAdvy4FoGF+KFdhR7nQTNm5J0ctAeOwn+3g==", "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/sc-istanbul/node_modules/js-yaml/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-treeify": { + "version": "1.1.33", + "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.33.tgz", + "integrity": "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/sc-istanbul/node_modules/resolve": { + "node_modules/object.entries": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", - "dev": true - }, - "node_modules/sc-istanbul/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", "dev": true, "dependencies": { - "has-flag": "^1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { - "node": ">=0.8.0" + "node": ">= 0.4" } }, - "node_modules/sc-istanbul/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", "dev": true, + "peer": true, "dependencies": { - "isexe": "^2.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, - "bin": { - "which": "bin/which" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" + "node_modules/object.groupby": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" + } }, - "node_modules/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "node_modules/object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "dev": true, - "hasInstallScript": true, + "peer": true, "dependencies": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { - "node": ">=10.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/secp256k1/node_modules/node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", + "node_modules/obliterator": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", + "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==", "dev": true }, - "node_modules/semaphore-async-await": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz", - "integrity": "sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg==", + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, - "engines": { - "node": ">=4.1" + "dependencies": { + "wrappy": "1" } }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ordinal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz", + "integrity": "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==", + "dev": true, + "peer": true + }, + "node_modules/os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", + "dev": true, + "dependencies": { + "lcid": "^1.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=0.10.0" } }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true, - "dependencies": { - "ms": "2.0.0" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/sentence-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", - "integrity": "sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==", + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "dependencies": { - "no-case": "^2.2.0", - "upper-case-first": "^1.1.2" + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "dependencies": { - "randombytes": "^2.1.0" + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" + "aggregate-error": "^3.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/servify": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", - "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==", + "dev": true + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "dependencies": { - "body-parser": "^1.16.0", - "cors": "^2.8.1", - "express": "^4.14.0", - "request": "^2.79.0", - "xhr": "^2.3.3" + "callsites": "^3.0.0" }, "engines": { "node": ">=6" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true + "node_modules/parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", + "dev": true, + "peer": true }, - "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", "dev": true, "dependencies": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "error-ex": "^1.2.0" }, "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" } }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true + "node_modules/password-prompt": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/password-prompt/-/password-prompt-1.1.3.tgz", + "integrity": "sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.2", + "cross-spawn": "^7.0.3" + } }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "node_modules/patch-package": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.5.1.tgz", + "integrity": "sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA==", "dev": true, "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^4.1.2", + "cross-spawn": "^6.0.5", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^9.0.0", + "is-ci": "^2.0.0", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.6", + "open": "^7.4.2", + "rimraf": "^2.6.3", + "semver": "^5.6.0", + "slash": "^2.0.0", + "tmp": "^0.0.33", + "yaml": "^1.10.2" }, "bin": { - "sha.js": "bin.js" + "patch-package": "index.js" + }, + "engines": { + "node": ">=10", + "npm": ">5" } }, - "node_modules/sha1": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", - "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", + "node_modules/patch-package/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "charenc": ">= 0.0.1", - "crypt": ">= 0.0.1" + "color-convert": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/sha3": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/sha3/-/sha3-2.1.4.tgz", - "integrity": "sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==", + "node_modules/patch-package/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "buffer": "6.0.3" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/sha3/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "node_modules/patch-package/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "node_modules/patch-package/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/patch-package/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "dependencies": { - "shebang-regex": "^3.0.0" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" }, "engines": { - "node": ">=8" + "node": ">=4.8" } }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/patch-package/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "node_modules/patch-package/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "dev": true, - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, "engines": { "node": ">=4" } }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "node_modules/patch-package/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "glob": "^7.1.3" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "rimraf": "bin.js" } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/simple-get": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz", - "integrity": "sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==", + "node_modules/patch-package/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "dependencies": { - "decompress-response": "^3.3.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" + "bin": { + "semver": "bin/semver" } }, - "node_modules/simple-get/node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "node_modules/patch-package/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, "dependencies": { - "mimic-response": "^1.0.0" + "shebang-regex": "^1.0.0" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "node_modules/patch-package/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "node_modules/patch-package/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "node": ">=8" } }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/patch-package/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "isexe": "^2.0.0" }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, "engines": { - "node": ">=7.0.0" + "node": ">=0.10.0" } }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "node_modules/snake-case": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", - "integrity": "sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==", + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, - "dependencies": { - "no-case": "^2.2.0" + "engines": { + "node": ">=8" } }, - "node_modules/solc": { - "version": "0.4.26", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz", - "integrity": "sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==", + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true, - "dependencies": { - "fs-extra": "^0.30.0", - "memorystream": "^0.3.1", - "require-from-string": "^1.1.0", - "semver": "^5.3.0", - "yargs": "^4.7.1" - }, - "bin": { - "solcjs": "solcjs" + "peer": true, + "engines": { + "node": "*" } }, - "node_modules/solc-0.8": { - "name": "solc", - "version": "0.8.20", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.20.tgz", - "integrity": "sha512-fPRnGspIEqmhu63RFO3pc79sLA7ZmzO0Uy0L5l6hEt2wAsq0o7UV6pXkAp3Mfv9IBhg7Px/oTu3a+y4gs3BWrQ==", + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "dev": true, "dependencies": { - "command-exists": "^1.2.8", - "commander": "^8.1.0", - "follow-redirects": "^1.12.1", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "semver": "^5.5.0", - "tmp": "0.0.33" - }, - "bin": { - "solcjs": "solc.js" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" }, "engines": { - "node": ">=10.0.0" + "node": ">=0.12" } }, - "node_modules/solc-0.8/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true }, - "node_modules/solc/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "node_modules/pg": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.3.tgz", + "integrity": "sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==", "dev": true, + "dependencies": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.6.2", + "pg-pool": "^3.6.1", + "pg-protocol": "^1.6.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 8.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.1.1" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } } }, - "node_modules/solc/node_modules/camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", + "node_modules/pg-cloudflare": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", + "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "optional": true }, - "node_modules/solc/node_modules/cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", - "dev": true, - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } + "node_modules/pg-connection-string": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", + "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==", + "dev": true }, - "node_modules/solc/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=4.0.0" } }, - "node_modules/solc/node_modules/fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", + "node_modules/pg-pool": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz", + "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==", "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" + "peerDependencies": { + "pg": ">=8.0" } }, - "node_modules/solc/node_modules/get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "node_modules/pg-protocol": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", + "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==", "dev": true }, - "node_modules/solc/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", "dev": true, "dependencies": { - "number-is-nan": "^1.0.0" + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/solc/node_modules/jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "dependencies": { + "split2": "^4.1.0" } }, - "node_modules/solc/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "dependencies": { - "glob": "^7.1.3" + "engines": { + "node": ">=8.6" }, - "bin": { - "rimraf": "bin.js" + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/solc/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, - "bin": { - "semver": "bin/semver" + "peer": true, + "engines": { + "node": ">=6" } }, - "node_modules/solc/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", "dev": true, - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/solc/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "dev": true, "dependencies": { - "ansi-regex": "^2.0.0" + "pinkie": "^2.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/solc/node_modules/wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", "dev": true, - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/solc/node_modules/y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, - "node_modules/solc/node_modules/yargs": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", - "integrity": "sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==", + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", "dev": true, - "dependencies": { - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "lodash.assign": "^4.0.3", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.1", - "which-module": "^1.0.0", - "window-size": "^0.2.0", - "y18n": "^3.2.1", - "yargs-parser": "^2.4.1" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/solc/node_modules/yargs-parser": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", - "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", "dev": true, - "dependencies": { - "camelcase": "^3.0.0", - "lodash.assign": "^4.0.6" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/solidity-ast": { - "version": "0.4.52", - "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.52.tgz", - "integrity": "sha512-iOya9BSiB9jhM8Vf40n8lGELGzwrUc57rl5BhfNtJ5cvAaMvRcNlHeAMNvqJJyjoUnczqRbHqdivEqK89du3Cw==", + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", "dev": true, "dependencies": { - "array.prototype.findlast": "^1.2.2" + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/solidity-comments-extractor": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz", - "integrity": "sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==", - "dev": true + "node_modules/postinstall-postinstall": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz", + "integrity": "sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ==", + "dev": true, + "hasInstallScript": true }, - "node_modules/solidity-coverage": { - "version": "0.7.22", - "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.7.22.tgz", - "integrity": "sha512-I6Zd5tsFY+gmj1FDIp6w7OrUePx6ZpMgKQZg7dWgPaQHePLi3Jk+iJ8lwZxsWEoNy2Lcv91rMxATWHqRaFdQpw==", + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, - "dependencies": { - "@solidity-parser/parser": "^0.14.0", - "@truffle/provider": "^0.2.24", - "chalk": "^2.4.2", - "death": "^1.1.0", - "detect-port": "^1.3.0", - "fs-extra": "^8.1.0", - "ghost-testrpc": "^0.0.2", - "global-modules": "^2.0.0", - "globby": "^10.0.1", - "jsonschema": "^1.2.4", - "lodash": "^4.17.15", - "node-emoji": "^1.10.0", - "pify": "^4.0.1", - "recursive-readdir": "^2.2.2", - "sc-istanbul": "^0.4.5", - "semver": "^7.3.4", - "shelljs": "^0.8.3", - "web3-utils": "^1.3.0" - }, "bin": { - "solidity-coverage": "plugins/bin.js" + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/solidity-coverage/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "node_modules/prettier-plugin-solidity": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.3.tgz", + "integrity": "sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg==", "dev": true, "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "@solidity-parser/parser": "^0.16.0", + "semver": "^7.3.8", + "solidity-comments-extractor": "^0.0.7" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=12" + }, + "peerDependencies": { + "prettier": ">=2.3.0 || >=3.0.0-alpha.0" } }, - "node_modules/solidity-coverage/node_modules/lru-cache": { + "node_modules/prettier-plugin-solidity/node_modules/@solidity-parser/parser": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.1.tgz", + "integrity": "sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw==", + "dev": true, + "dependencies": { + "antlr4ts": "^0.5.0-alpha.4" + } + }, + "node_modules/prettier-plugin-solidity/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", @@ -23944,7 +20155,7 @@ "node": ">=10" } }, - "node_modules/solidity-coverage/node_modules/semver": { + "node_modules/prettier-plugin-solidity/node_modules/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", @@ -23959,1117 +20170,1268 @@ "node": ">=10" } }, - "node_modules/solidity-coverage/node_modules/yallist": { + "node_modules/prettier-plugin-solidity/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/solidity-docgen": { - "version": "0.5.17", - "resolved": "https://registry.npmjs.org/solidity-docgen/-/solidity-docgen-0.5.17.tgz", - "integrity": "sha512-RX5SPLFL9z0ZVBcZ/o5l/TKXMgSjNhWdumLuuv+Dy1O/66sThpHYd0HVpzdwAjVff0Ajk76bYM2zZYiMnqBfng==", + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "peer": true + }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "dev": true, + "peer": true, "dependencies": { - "@oclif/command": "^1.8.0", - "@oclif/config": "^1.17.0", - "@oclif/errors": "^1.3.3", - "@oclif/plugin-help": "^5.0.0", - "globby": "^11.0.0", - "handlebars": "^4.7.6", - "json5": "^2.1.3", - "lodash": "^4.17.15", - "micromatch": "^4.0.2", - "minimatch": "^5.0.0", - "semver": "^7.3.2", - "solc": "^0.6.7" - }, - "bin": { - "solidity-docgen": "dist/cli.js" + "asap": "~2.0.6" } }, - "node_modules/solidity-docgen/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0" + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" } }, - "node_modules/solidity-docgen/node_modules/commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", + "node_modules/proper-lockfile/node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, - "node_modules/solidity-docgen/node_modules/fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ramda": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", + "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==", + "dev": true + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" + "safe-buffer": "^5.1.0" } }, - "node_modules/solidity-docgen/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, "engines": { - "node": ">=10" + "node": ">= 0.8" + } + }, + "node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dev": true, + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/solidity-docgen/node_modules/jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/solidity-docgen/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/solidity-docgen/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/solidity-docgen/node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "node_modules/read-pkg/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/solidity-docgen/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "dependencies": { - "glob": "^7.1.3" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">= 6" } }, - "node_modules/solidity-docgen/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "picomatch": "^2.2.1" }, "engines": { - "node": ">=10" + "node": ">=8.10.0" } }, - "node_modules/solidity-docgen/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "dev": true, + "peer": true, + "dependencies": { + "resolve": "^1.1.6" + }, "engines": { - "node": ">=8" + "node": ">= 0.10" } }, - "node_modules/solidity-docgen/node_modules/solc": { - "version": "0.6.12", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.6.12.tgz", - "integrity": "sha512-Lm0Ql2G9Qc7yPP2Ba+WNmzw2jwsrd3u4PobHYlSOxaut3TtUbj9+5ZrT6f4DUpNPEoBaFUOEg9Op9C0mk7ge9g==", + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", "dev": true, + "peer": true, "dependencies": { - "command-exists": "^1.2.8", - "commander": "3.0.2", - "fs-extra": "^0.30.0", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "require-from-string": "^2.0.0", - "semver": "^5.5.0", - "tmp": "0.0.33" - }, - "bin": { - "solcjs": "solcjs" + "minimatch": "^3.0.5" }, "engines": { - "node": ">=8.0.0" + "node": ">=6.0.0" } }, - "node_modules/solidity-docgen/node_modules/solc/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "node_modules/redeyed": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", + "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", "dev": true, - "bin": { - "semver": "bin/semver" + "dependencies": { + "esprima": "~4.0.0" } }, - "node_modules/solidity-docgen/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", + "node_modules/redeyed/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "optional": true, - "dependencies": { - "amdefine": ">=0.0.4" + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": ">=0.8.0" + "node": ">=4" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "node_modules/reduce-flatten": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", + "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "peer": true, + "engines": { + "node": ">=6" } }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "node_modules/req-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", + "integrity": "sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==", "dev": true, + "peer": true, "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "req-from": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "node_modules/req-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz", + "integrity": "sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==", "dev": true, + "peer": true, "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", - "dev": true - }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "node_modules/req-from/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", "dev": true, + "peer": true, "engines": { - "node": ">= 10.x" + "node": ">=4" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", "dev": true, "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sshpk/node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true + "engines": { + "node": ">= 6" + } }, - "node_modules/stacktrace-parser": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", - "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "dependencies": { - "type-fest": "^0.7.1" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=6" + "node": ">= 0.12" } }, - "node_modules/stacktrace-parser/node_modules/type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "dev": true, - "engines": { - "node": ">=8" + "bin": { + "uuid": "bin/uuid" } }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "engines": { - "node": ">= 0.8" + "node": ">=0.10.0" } }, - "node_modules/strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "node_modules/require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", "dev": true, "dependencies": { - "safe-buffer": "~5.2.0" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, "engines": { "node": ">=4" } }, - "node_modules/string-width/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true, "engines": { - "node": ">=4" + "node": ">= 4" } }, - "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "glob": "^7.1.3" }, - "engines": { - "node": ">= 0.4" + "bin": { + "rimraf": "bin.js" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "node_modules/rlp": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", + "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "bn.js": "^5.2.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "rlp": "bin/rlp" } }, - "node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" + "queue-microtask": "^1.2.2" } }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "node_modules/run-parallel-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", + "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", "dev": true, - "peer": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rustbn.js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", + "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==", + "dev": true + }, + "node_modules/safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, "engines": { - "node": ">=4" + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/strip-hex-prefix": { + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", - "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", "dev": true, "dependencies": { - "is-hex-prefixed": "1.0.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", - "dev": true, - "engines": { - "node": ">=4" - } + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "node_modules/sc-istanbul": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz", + "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==", "dev": true, - "engines": { - "node": ">=8" + "peer": true, + "dependencies": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "istanbul": "lib/cli.js" } }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/sc-istanbul/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "peer": true, "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "sprintf-js": "~1.0.2" } }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "node_modules/sc-istanbul/node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true, + "peer": true + }, + "node_modules/sc-istanbul/node_modules/glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", "dev": true, + "peer": true, "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/supports-hyperlinks/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/sc-istanbul/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", "dev": true, + "peer": true, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/supports-hyperlinks/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/sc-istanbul/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "peer": true, "dependencies": { - "has-flag": "^4.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "engines": { - "node": ">=8" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "node_modules/sc-istanbul/node_modules/js-yaml/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "engines": { - "node": ">= 0.4" + "peer": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=4" } }, - "node_modules/swap-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", - "integrity": "sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==", + "node_modules/sc-istanbul/node_modules/resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", "dev": true, - "dependencies": { - "lower-case": "^1.1.1", - "upper-case": "^1.1.1" - } + "peer": true }, - "node_modules/swarm-js": { - "version": "0.1.42", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.42.tgz", - "integrity": "sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==", + "node_modules/sc-istanbul/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", "dev": true, + "peer": true, "dependencies": { - "bluebird": "^3.5.0", - "buffer": "^5.0.5", - "eth-lib": "^0.1.26", - "fs-extra": "^4.0.2", - "got": "^11.8.5", - "mime-types": "^2.1.16", - "mkdirp-promise": "^5.0.1", - "mock-fs": "^4.1.0", - "setimmediate": "^1.0.5", - "tar": "^4.0.2", - "xhr-request": "^1.0.1" + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" } }, - "node_modules/swarm-js/node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "node_modules/sc-istanbul/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "peer": true, "dependencies": { - "defer-to-connect": "^2.0.0" + "isexe": "^2.0.0" }, - "engines": { - "node": ">=10" + "bin": { + "which": "bin/which" } }, - "node_modules/swarm-js/node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "dev": true, - "engines": { - "node": ">=10.6.0" - } + "node_modules/scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", + "dev": true }, - "node_modules/swarm-js/node_modules/fs-extra": { + "node_modules/secp256k1": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "node_modules/swarm-js/node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", "dev": true, + "hasInstallScript": true, "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" + "elliptic": "^6.5.4", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" }, "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" + "node": ">=10.0.0" } }, - "node_modules/swarm-js/node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "node_modules/secp256k1/node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", + "dev": true + }, + "node_modules/semaphore-async-await": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz", + "integrity": "sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg==", "dev": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, "engines": { - "node": ">=10.19.0" + "node": ">=4.1" } }, - "node_modules/swarm-js/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "engines": { - "node": ">=8" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/swarm-js/node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, - "engines": { - "node": ">=8" + "dependencies": { + "randombytes": "^2.1.0" } }, - "node_modules/sync-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", - "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", "dev": true, "dependencies": { - "http-response-object": "^3.0.1", - "sync-rpc": "^1.2.1", - "then-request": "^6.0.0" + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">= 0.4" } }, - "node_modules/sync-rpc": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", - "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "dependencies": { - "get-port": "^3.1.0" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" } }, - "node_modules/table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "node_modules/sha1": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", + "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", "dev": true, + "peer": true, "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" + "charenc": ">= 0.0.1", + "crypt": ">= 0.0.1" }, "engines": { - "node": ">=10.0.0" + "node": "*" } }, - "node_modules/table/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "shebang-regex": "^3.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/table/node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/table/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "dev": true, + "peer": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/table/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tar": { - "version": "4.4.19", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", - "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true, - "dependencies": { - "chownr": "^1.1.4", - "fs-minipass": "^1.2.7", - "minipass": "^2.9.0", - "minizlib": "^1.3.3", - "mkdirp": "^0.5.5", - "safe-buffer": "^5.2.1", - "yallist": "^3.1.1" - }, "engines": { - "node": ">=4.5" + "node": ">=6" } }, - "node_modules/test-value": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz", - "integrity": "sha512-+1epbAxtKeXttkGFMTX9H42oqzOTufR1ceCF+GYA5aOmvaPq9wd4PUS8329fn2RRLGNeUkgRLnVpycjx8DsO2w==", + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "dependencies": { - "array-back": "^1.0.3", - "typical": "^2.6.0" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/test-value/node_modules/array-back": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", - "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==", + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "typical": "^2.6.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=0.12.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/testrpc": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz", - "integrity": "sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==", - "deprecated": "testrpc has been renamed to ganache-cli, please use this package from now on.", - "dev": true - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/then-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", - "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "@types/concat-stream": "^1.6.0", - "@types/form-data": "0.0.33", - "@types/node": "^8.0.0", - "@types/qs": "^6.2.31", - "caseless": "~0.12.0", - "concat-stream": "^1.6.0", - "form-data": "^2.2.0", - "http-basic": "^8.1.1", - "http-response-object": "^3.0.1", - "promise": "^8.0.0", - "qs": "^6.4.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=6.0.0" + "node": ">=7.0.0" } }, - "node_modules/then-request/node_modules/@types/node": { - "version": "8.10.66", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", - "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", + "node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/then-request/node_modules/form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "node_modules/solc": { + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.6.12.tgz", + "integrity": "sha512-Lm0Ql2G9Qc7yPP2Ba+WNmzw2jwsrd3u4PobHYlSOxaut3TtUbj9+5ZrT6f4DUpNPEoBaFUOEg9Op9C0mk7ge9g==", "dev": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "command-exists": "^1.2.8", + "commander": "3.0.2", + "fs-extra": "^0.30.0", + "js-sha3": "0.8.0", + "memorystream": "^0.3.1", + "require-from-string": "^2.0.0", + "semver": "^5.5.0", + "tmp": "0.0.33" + }, + "bin": { + "solcjs": "solcjs" }, "engines": { - "node": ">= 0.12" - } - }, - "node_modules/timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node": ">=8.0.0" } }, - "node_modules/title-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", - "integrity": "sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==", + "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==", "dev": true, "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.0.3" + "command-exists": "^1.2.8", + "commander": "^8.1.0", + "follow-redirects": "^1.12.1", + "js-sha3": "0.8.0", + "memorystream": "^0.3.1", + "semver": "^5.5.0", + "tmp": "0.0.33" + }, + "bin": { + "solcjs": "solc.js" + }, + "engines": { + "node": ">=10.0.0" } }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "node_modules/solc-0.8/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, "engines": { - "node": ">=0.6.0" + "node": ">= 12" } }, - "node_modules/to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "node_modules/solc-0.8/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "engines": { - "node": ">=6" + "bin": { + "semver": "bin/semver" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/solc/node_modules/fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", "dev": true, "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "node_modules/solc/node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", "dev": true, - "engines": { - "node": ">=0.6" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "node_modules/solc/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "glob": "^7.1.3" }, - "engines": { - "node": ">=0.8" + "bin": { + "rimraf": "bin.js" } }, - "node_modules/tough-cookie/node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "node_modules/solc/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "engines": { - "node": ">=6" + "bin": { + "semver": "bin/semver" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/ts-essentials": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-1.0.4.tgz", - "integrity": "sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ==", - "dev": true - }, - "node_modules/ts-generator": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ts-generator/-/ts-generator-0.1.1.tgz", - "integrity": "sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ==", + "node_modules/solidity-ast": { + "version": "0.4.52", + "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.52.tgz", + "integrity": "sha512-iOya9BSiB9jhM8Vf40n8lGELGzwrUc57rl5BhfNtJ5cvAaMvRcNlHeAMNvqJJyjoUnczqRbHqdivEqK89du3Cw==", "dev": true, "dependencies": { - "@types/mkdirp": "^0.5.2", - "@types/prettier": "^2.1.1", - "@types/resolve": "^0.0.8", - "chalk": "^2.4.1", - "glob": "^7.1.2", - "mkdirp": "^0.5.1", - "prettier": "^2.1.2", - "resolve": "^1.8.1", - "ts-essentials": "^1.0.0" - }, - "bin": { - "ts-generator": "dist/cli/run.js" + "array.prototype.findlast": "^1.2.2" } }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "node_modules/solidity-comments-extractor": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz", + "integrity": "sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==", + "dev": true + }, + "node_modules/solidity-coverage": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.5.tgz", + "integrity": "sha512-6C6N6OV2O8FQA0FWA95FdzVH+L16HU94iFgg5wAFZ29UpLFkgNI/DRR2HotG1bC0F4gAc/OMs2BJI44Q/DYlKQ==", "dev": true, + "peer": true, "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" + "@ethersproject/abi": "^5.0.9", + "@solidity-parser/parser": "^0.16.0", + "chalk": "^2.4.2", + "death": "^1.1.0", + "detect-port": "^1.3.0", + "difflib": "^0.2.4", + "fs-extra": "^8.1.0", + "ghost-testrpc": "^0.0.2", + "global-modules": "^2.0.0", + "globby": "^10.0.1", + "jsonschema": "^1.2.4", + "lodash": "^4.17.15", + "mocha": "10.2.0", + "node-emoji": "^1.10.0", + "pify": "^4.0.1", + "recursive-readdir": "^2.2.2", + "sc-istanbul": "^0.4.5", + "semver": "^7.3.4", + "shelljs": "^0.8.3", + "web3-utils": "^1.3.6" }, "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" + "solidity-coverage": "plugins/bin.js" }, "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" + "hardhat": "^2.11.0" } }, - "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "node_modules/solidity-coverage/node_modules/@solidity-parser/parser": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.1.tgz", + "integrity": "sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw==", "dev": true, "peer": true, "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "antlr4ts": "^0.5.0-alpha.4" } }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "node_modules/solidity-coverage/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "peer": true, "dependencies": { - "minimist": "^1.2.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, - "bin": { - "json5": "lib/cli.js" + "engines": { + "node": ">=6 <7 || >=8" } }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tsort": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", - "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==", - "dev": true + "node_modules/solidity-coverage/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "peer": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "node_modules/solidity-coverage/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "peer": true, "dependencies": { - "safe-buffer": "^5.0.1" + "yallist": "^4.0.0" }, "engines": { - "node": "*" + "node": ">=10" } }, - "node_modules/tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", - "dev": true + "node_modules/solidity-coverage/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "peer": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } }, - "node_modules/tweetnacl-util": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", - "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==", - "dev": true + "node_modules/solidity-coverage/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 4.0.0" + } }, - "node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "dev": true + "node_modules/solidity-coverage/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "peer": true }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "node_modules/solidity-docgen": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/solidity-docgen/-/solidity-docgen-0.5.17.tgz", + "integrity": "sha512-RX5SPLFL9z0ZVBcZ/o5l/TKXMgSjNhWdumLuuv+Dy1O/66sThpHYd0HVpzdwAjVff0Ajk76bYM2zZYiMnqBfng==", "dev": true, "dependencies": { - "prelude-ls": "^1.2.1" + "@oclif/command": "^1.8.0", + "@oclif/config": "^1.17.0", + "@oclif/errors": "^1.3.3", + "@oclif/plugin-help": "^5.0.0", + "globby": "^11.0.0", + "handlebars": "^4.7.6", + "json5": "^2.1.3", + "lodash": "^4.17.15", + "micromatch": "^4.0.2", + "minimatch": "^5.0.0", + "semver": "^7.3.2", + "solc": "^0.6.7" }, - "engines": { - "node": ">= 0.8.0" + "bin": { + "solidity-docgen": "dist/cli.js" } }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "engines": { - "node": ">=4" + "node_modules/solidity-docgen/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/solidity-docgen/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, "engines": { "node": ">=10" }, @@ -25077,1254 +21439,1323 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "node_modules/solidity-docgen/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "yallist": "^4.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">=10" } }, - "node_modules/typechain": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/typechain/-/typechain-3.0.0.tgz", - "integrity": "sha512-ft4KVmiN3zH4JUFu2WJBrwfHeDf772Tt2d8bssDTo/YcckKW2D+OwFrHXRC6hJvO3mHjFQTihoMV6fJOi0Hngg==", + "node_modules/solidity-docgen/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "dependencies": { - "command-line-args": "^4.0.7", - "debug": "^4.1.1", - "fs-extra": "^7.0.0", - "js-sha3": "^0.8.0", - "lodash": "^4.17.15", - "ts-essentials": "^6.0.3", - "ts-generator": "^0.1.1" + "brace-expansion": "^2.0.1" }, - "bin": { - "typechain": "dist/cli/cli.js" + "engines": { + "node": ">=10" } }, - "node_modules/typechain/node_modules/ts-essentials": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-6.0.7.tgz", - "integrity": "sha512-2E4HIIj4tQJlIHuATRHayv0EfMGK3ris/GRk1E3CFnsZzeNV+hUmelbaTZHLtXaZppM5oLhHRtO04gINC4Jusw==", + "node_modules/solidity-docgen/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, - "peerDependencies": { - "typescript": ">=3.7.0" + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "node_modules/solidity-docgen/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" - }, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "node_modules/solidity-docgen/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "amdefine": ">=0.0.4" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.8.0" } }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "dependencies": { - "is-typedarray": "^1.0.0" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "node_modules/spdx-license-ids": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "dev": true + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", "dev": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, "engines": { - "node": ">=14.17" + "node": ">= 10.x" } }, - "node_modules/typical": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", - "integrity": "sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==", + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", "dev": true, - "optional": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, "bin": { - "uglifyjs": "bin/uglifyjs" + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" }, "engines": { - "node": ">=0.8.0" + "node": ">=0.10.0" } }, - "node_modules/ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "node_modules/sshpk/node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "node_modules/stacktrace-parser": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", + "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "type-fest": "^0.7.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=6" } }, - "node_modules/undici": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.24.0.tgz", - "integrity": "sha512-OKlckxBjFl0oXxcj9FU6oB8fDAaiRUq+D8jrFWGmOfI/gIyjk/IeS75LMzgYKUaeHzLUcYvf9bbJGSrUwTfwwQ==", + "node_modules/stacktrace-parser/node_modules/type-fest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", "dev": true, - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, "engines": { - "node": ">=14.0" + "node": ">=8" } }, - "node_modules/undici-types": { - "version": "5.25.3", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", - "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==", - "dev": true - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, "engines": { - "node": ">= 4.0.0" + "node": ">= 0.8" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, - "engines": { - "node": ">= 0.8" + "dependencies": { + "safe-buffer": "~5.2.0" } }, - "node_modules/upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", - "dev": true + "node_modules/string-format": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", + "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", + "dev": true, + "peer": true }, - "node_modules/upper-case-first": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", - "integrity": "sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==", + "node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, + "peer": true, "dependencies": { - "upper-case": "^1.1.1" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "node_modules/string-width/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true, - "dependencies": { - "punycode": "^2.1.0" + "peer": true, + "engines": { + "node": ">=4" } }, - "node_modules/url": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", - "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", + "node_modules/string-width/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true, - "dependencies": { - "punycode": "^1.4.1", - "qs": "^6.11.2" + "peer": true, + "engines": { + "node": ">=4" } }, - "node_modules/url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", + "node_modules/string-width/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "dev": true, + "peer": true, "dependencies": { - "prepend-http": "^2.0.0" + "ansi-regex": "^3.0.0" }, "engines": { "node": ">=4" } }, - "node_modules/url-set-query": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", - "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==", - "dev": true - }, - "node_modules/url/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true - }, - "node_modules/url/node_modules/qs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", - "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { - "node": ">=0.6" + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/utf-8-validate": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", - "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", - "devOptional": true, - "hasInstallScript": true, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dev": true, "dependencies": { - "node-gyp-build": "^4.3.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, - "engines": { - "node": ">=6.14.2" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", - "dev": true - }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { - "node": ">= 0.4.0" + "node": ">=8" } }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, - "bin": { - "uuid": "dist/bin/uuid" + "peer": true, + "engines": { + "node": ">=4" } }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "node_modules/strip-hex-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", + "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", "dev": true, "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "is-hex-prefixed": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" } }, - "node_modules/varint": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", - "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==", - "dev": true - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "engines": { - "node": ">= 0.8" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "engines": [ - "node >=0.6.0" - ], "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/wasmbuilder": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz", - "integrity": "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA==", - "dev": true - }, - "node_modules/wasmcurves": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.2.tgz", - "integrity": "sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ==", + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, "dependencies": { - "wasmbuilder": "0.0.16" + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/web-worker": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", - "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==", - "dev": true + "node_modules/supports-hyperlinks/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "node_modules/web3": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.10.2.tgz", - "integrity": "sha512-DAtZ3a3ruPziE80uZ3Ob0YDZxt6Vk2un/F5BcBrxO70owJ9Z1Y2+loZmbh1MoAmoLGjA/SUSHeUtid3fYmBaog==", + "node_modules/supports-hyperlinks/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "hasInstallScript": true, "dependencies": { - "web3-bzz": "1.10.2", - "web3-core": "1.10.2", - "web3-eth": "1.10.2", - "web3-eth-personal": "1.10.2", - "web3-net": "1.10.2", - "web3-shh": "1.10.2", - "web3-utils": "1.10.2" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=8" } }, - "node_modules/web3-bzz": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.10.2.tgz", - "integrity": "sha512-vLOfDCj6198Qc7esDrCKeFA/M3ZLbowsaHQ0hIL4NmIHoq7lU8aSRTa5AI+JBh8cKN1gVryJsuW2ZCc5bM4I4Q==", + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, - "hasInstallScript": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "dev": true, + "peer": true, "dependencies": { - "@types/node": "^12.12.6", - "got": "12.1.0", - "swarm-js": "^0.1.40" + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" }, "engines": { "node": ">=8.0.0" } }, - "node_modules/web3-bzz/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true + "node_modules/sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "dev": true, + "peer": true, + "dependencies": { + "get-port": "^3.1.0" + } }, - "node_modules/web3-core": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.10.2.tgz", - "integrity": "sha512-qTn2UmtE8tvwMRsC5pXVdHxrQ4uZ6jiLgF5DRUVtdi7dPUmX18Dp9uxKfIfhGcA011EAn8P6+X7r3pvi2YRxBw==", + "node_modules/table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", "dev": true, + "peer": true, "dependencies": { - "@types/bn.js": "^5.1.1", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.10.2", - "web3-core-method": "1.10.2", - "web3-core-requestmanager": "1.10.2", - "web3-utils": "1.10.2" + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=8.0.0" + "node": ">=10.0.0" } }, - "node_modules/web3-core-helpers": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.0.tgz", - "integrity": "sha512-pIxAzFDS5vnbXvfvLSpaA1tfRykAe9adw43YCKsEYQwH0gCLL0kMLkaCX3q+Q8EVmAh+e1jWL/nl9U0de1+++g==", + "node_modules/table-layout": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", + "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", "dev": true, + "peer": true, "dependencies": { - "web3-eth-iban": "1.10.0", - "web3-utils": "1.10.0" + "array-back": "^4.0.1", + "deep-extend": "~0.6.0", + "typical": "^5.2.0", + "wordwrapjs": "^4.0.0" }, "engines": { "node": ">=8.0.0" } }, - "node_modules/web3-core-helpers/node_modules/web3-utils": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", - "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", + "node_modules/table-layout/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", "dev": true, - "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, + "peer": true, "engines": { - "node": ">=8.0.0" + "node": ">=8" } }, - "node_modules/web3-core-method": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.10.2.tgz", - "integrity": "sha512-gG6ES+LOuo01MJHML4gnEt702M8lcPGMYZoX8UjZzmEebGrPYOY9XccpCrsFgCeKgQzM12SVnlwwpMod1+lcLg==", + "node_modules/table-layout/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, - "dependencies": { - "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.10.2", - "web3-core-promievent": "1.10.2", - "web3-core-subscriptions": "1.10.2", - "web3-utils": "1.10.2" - }, + "peer": true, "engines": { - "node": ">=8.0.0" + "node": ">=8" } }, - "node_modules/web3-core-method/node_modules/web3-core-helpers": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.2.tgz", - "integrity": "sha512-1JfaNtox6/ZYJHNoI+QVc2ObgwEPeGF+YdxHZQ7aF5605BmlwM1Bk3A8xv6mg64jIRvEq1xX6k9oG6x7p1WgXQ==", + "node_modules/table/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, + "peer": true, "dependencies": { - "web3-eth-iban": "1.10.2", - "web3-utils": "1.10.2" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" }, - "engines": { - "node": ">=8.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/web3-core-method/node_modules/web3-core-promievent": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.10.2.tgz", - "integrity": "sha512-Qkkb1dCDOU8dZeORkcwJBQRAX+mdsjx8LqFBB+P4W9QgwMqyJ6LXda+y1XgyeEVeKEmY1RCeTq9Y94q1v62Sfw==", + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "peer": true + }, + "node_modules/table/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "peer": true, "dependencies": { - "eventemitter3": "4.0.4" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=8.0.0" + "node": ">=8" } }, - "node_modules/web3-core-method/node_modules/web3-eth-iban": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.2.tgz", - "integrity": "sha512-y8+Ii2XXdyHQMFNL2NWpBnXe+TVJ4ryvPlzNhObRRnIo4O4nLIXS010olLDMayozDzoUlmzCmBZJYc9Eev1g7A==", + "node_modules/test-value": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz", + "integrity": "sha512-+1epbAxtKeXttkGFMTX9H42oqzOTufR1ceCF+GYA5aOmvaPq9wd4PUS8329fn2RRLGNeUkgRLnVpycjx8DsO2w==", "dev": true, "dependencies": { - "bn.js": "^5.2.1", - "web3-utils": "1.10.2" + "array-back": "^1.0.3", + "typical": "^2.6.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=0.10.0" } }, - "node_modules/web3-core-promievent": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.10.0.tgz", - "integrity": "sha512-68N7k5LWL5R38xRaKFrTFT2pm2jBNFaM4GioS00YjAKXRQ3KjmhijOMG3TICz6Aa5+6GDWYelDNx21YAeZ4YTg==", + "node_modules/test-value/node_modules/array-back": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", + "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==", "dev": true, "dependencies": { - "eventemitter3": "4.0.4" + "typical": "^2.6.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=0.12.0" } }, - "node_modules/web3-core-requestmanager": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.10.2.tgz", - "integrity": "sha512-nlLeNJUu6fR+ZbJr2k9Du/nN3VWwB4AJPY4r6nxUODAmykgJq57T21cLP/BEk6mbiFQYGE9TrrPhh4qWxQEtAw==", + "node_modules/test-value/node_modules/typical": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", + "integrity": "sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==", + "dev": true + }, + "node_modules/testrpc": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz", + "integrity": "sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==", + "deprecated": "testrpc has been renamed to ganache-cli, please use this package from now on.", + "dev": true + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", "dev": true, + "peer": true, "dependencies": { - "util": "^0.12.5", - "web3-core-helpers": "1.10.2", - "web3-providers-http": "1.10.2", - "web3-providers-ipc": "1.10.2", - "web3-providers-ws": "1.10.2" + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=6.0.0" } }, - "node_modules/web3-core-requestmanager/node_modules/web3-core-helpers": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.2.tgz", - "integrity": "sha512-1JfaNtox6/ZYJHNoI+QVc2ObgwEPeGF+YdxHZQ7aF5605BmlwM1Bk3A8xv6mg64jIRvEq1xX6k9oG6x7p1WgXQ==", + "node_modules/then-request/node_modules/@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", + "dev": true, + "peer": true + }, + "node_modules/then-request/node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", "dev": true, + "peer": true, "dependencies": { - "web3-eth-iban": "1.10.2", - "web3-utils": "1.10.2" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=8.0.0" + "node": ">= 0.12" } }, - "node_modules/web3-core-requestmanager/node_modules/web3-eth-iban": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.2.tgz", - "integrity": "sha512-y8+Ii2XXdyHQMFNL2NWpBnXe+TVJ4ryvPlzNhObRRnIo4O4nLIXS010olLDMayozDzoUlmzCmBZJYc9Eev1g7A==", + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "dependencies": { - "bn.js": "^5.2.1", - "web3-utils": "1.10.2" + "os-tmpdir": "~1.0.2" }, "engines": { - "node": ">=8.0.0" + "node": ">=0.6.0" } }, - "node_modules/web3-core-subscriptions": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.10.2.tgz", - "integrity": "sha512-MiWcKjz4tco793EPPPLc/YOJmYUV3zAfxeQH/UVTfBejMfnNvmfwKa2SBKfPIvKQHz/xI5bV2TF15uvJEucU7w==", + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.10.2" + "is-number": "^7.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=8.0" } }, - "node_modules/web3-core-subscriptions/node_modules/web3-core-helpers": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.2.tgz", - "integrity": "sha512-1JfaNtox6/ZYJHNoI+QVc2ObgwEPeGF+YdxHZQ7aF5605BmlwM1Bk3A8xv6mg64jIRvEq1xX6k9oG6x7p1WgXQ==", + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, - "dependencies": { - "web3-eth-iban": "1.10.2", - "web3-utils": "1.10.2" - }, "engines": { - "node": ">=8.0.0" + "node": ">=0.6" } }, - "node_modules/web3-core-subscriptions/node_modules/web3-eth-iban": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.2.tgz", - "integrity": "sha512-y8+Ii2XXdyHQMFNL2NWpBnXe+TVJ4ryvPlzNhObRRnIo4O4nLIXS010olLDMayozDzoUlmzCmBZJYc9Eev1g7A==", + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, "dependencies": { - "bn.js": "^5.2.1", - "web3-utils": "1.10.2" + "psl": "^1.1.28", + "punycode": "^2.1.1" }, "engines": { - "node": ">=8.0.0" + "node": ">=0.8" } }, - "node_modules/web3-core/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "node_modules/web3-core/node_modules/bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "node_modules/tough-cookie/node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true, "engines": { - "node": "*" + "node": ">=6" } }, - "node_modules/web3-core/node_modules/web3-core-helpers": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.2.tgz", - "integrity": "sha512-1JfaNtox6/ZYJHNoI+QVc2ObgwEPeGF+YdxHZQ7aF5605BmlwM1Bk3A8xv6mg64jIRvEq1xX6k9oG6x7p1WgXQ==", + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/ts-command-line-args": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", + "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==", "dev": true, + "peer": true, "dependencies": { - "web3-eth-iban": "1.10.2", - "web3-utils": "1.10.2" + "chalk": "^4.1.0", + "command-line-args": "^5.1.1", + "command-line-usage": "^6.1.0", + "string-format": "^2.0.0" }, - "engines": { - "node": ">=8.0.0" + "bin": { + "write-markdown": "dist/write-markdown.js" } }, - "node_modules/web3-core/node_modules/web3-eth-iban": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.2.tgz", - "integrity": "sha512-y8+Ii2XXdyHQMFNL2NWpBnXe+TVJ4ryvPlzNhObRRnIo4O4nLIXS010olLDMayozDzoUlmzCmBZJYc9Eev1g7A==", + "node_modules/ts-command-line-args/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "peer": true, "dependencies": { - "bn.js": "^5.2.1", - "web3-utils": "1.10.2" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=8.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/web3-eth": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.10.2.tgz", - "integrity": "sha512-s38rhrntyhGShmXC4R/aQtfkpcmev9c7iZwgb9CDIBFo7K8nrEJvqIOyajeZTxnDIiGzTJmrHxiKSadii5qTRg==", + "node_modules/ts-command-line-args/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "peer": true, "dependencies": { - "web3-core": "1.10.2", - "web3-core-helpers": "1.10.2", - "web3-core-method": "1.10.2", - "web3-core-subscriptions": "1.10.2", - "web3-eth-abi": "1.10.2", - "web3-eth-accounts": "1.10.2", - "web3-eth-contract": "1.10.2", - "web3-eth-ens": "1.10.2", - "web3-eth-iban": "1.10.2", - "web3-eth-personal": "1.10.2", - "web3-net": "1.10.2", - "web3-utils": "1.10.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/web3-eth-abi": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.10.0.tgz", - "integrity": "sha512-cwS+qRBWpJ43aI9L3JS88QYPfFcSJJ3XapxOQ4j40v6mk7ATpA8CVK1vGTzpihNlOfMVRBkR95oAj7oL6aiDOg==", + "node_modules/ts-command-line-args/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "peer": true, "dependencies": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.10.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=8.0.0" + "node": ">=7.0.0" } }, - "node_modules/web3-eth-abi/node_modules/web3-utils": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", - "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", + "node_modules/ts-command-line-args/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, - "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, + "peer": true + }, + "node_modules/ts-command-line-args/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "peer": true, "engines": { - "node": ">=8.0.0" + "node": ">=8" } }, - "node_modules/web3-eth-accounts": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.10.2.tgz", - "integrity": "sha512-6/HhCBYAXN/f553/SyxS9gY62NbLgpD1zJpENcvRTDpJN3Znvli1cmpl5Q3ZIUJkvHnG//48EWfWh0cbb3fbKQ==", + "node_modules/ts-command-line-args/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "peer": true, "dependencies": { - "@ethereumjs/common": "2.5.0", - "@ethereumjs/tx": "3.3.2", - "@ethereumjs/util": "^8.1.0", - "eth-lib": "0.2.8", - "scrypt-js": "^3.0.1", - "uuid": "^9.0.0", - "web3-core": "1.10.2", - "web3-core-helpers": "1.10.2", - "web3-core-method": "1.10.2", - "web3-utils": "1.10.2" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=8" } }, - "node_modules/web3-eth-accounts/node_modules/@ethereumjs/common": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", - "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", + "node_modules/ts-essentials": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", + "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", "dev": true, - "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.1" + "peer": true, + "peerDependencies": { + "typescript": ">=3.7.0" } }, - "node_modules/web3-eth-accounts/node_modules/@ethereumjs/tx": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", - "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", + "node_modules/ts-generator": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ts-generator/-/ts-generator-0.1.1.tgz", + "integrity": "sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ==", "dev": true, "dependencies": { - "@ethereumjs/common": "^2.5.0", - "ethereumjs-util": "^7.1.2" + "@types/mkdirp": "^0.5.2", + "@types/prettier": "^2.1.1", + "@types/resolve": "^0.0.8", + "chalk": "^2.4.1", + "glob": "^7.1.2", + "mkdirp": "^0.5.1", + "prettier": "^2.1.2", + "resolve": "^1.8.1", + "ts-essentials": "^1.0.0" + }, + "bin": { + "ts-generator": "dist/cli/run.js" } }, - "node_modules/web3-eth-accounts/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "node_modules/ts-generator/node_modules/ts-essentials": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-1.0.4.tgz", + "integrity": "sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ==", "dev": true }, - "node_modules/web3-eth-accounts/node_modules/eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "dev": true, "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } } }, - "node_modules/web3-eth-accounts/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" + "engines": { + "node": ">=0.3.1" } }, - "node_modules/web3-eth-accounts/node_modules/web3-core-helpers": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.2.tgz", - "integrity": "sha512-1JfaNtox6/ZYJHNoI+QVc2ObgwEPeGF+YdxHZQ7aF5605BmlwM1Bk3A8xv6mg64jIRvEq1xX6k9oG6x7p1WgXQ==", + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", "dev": true, + "peer": true, "dependencies": { - "web3-eth-iban": "1.10.2", - "web3-utils": "1.10.2" - }, - "engines": { - "node": ">=8.0.0" + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" } }, - "node_modules/web3-eth-accounts/node_modules/web3-eth-iban": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.2.tgz", - "integrity": "sha512-y8+Ii2XXdyHQMFNL2NWpBnXe+TVJ4ryvPlzNhObRRnIo4O4nLIXS010olLDMayozDzoUlmzCmBZJYc9Eev1g7A==", + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, + "peer": true, "dependencies": { - "bn.js": "^5.2.1", - "web3-utils": "1.10.2" + "minimist": "^1.2.0" }, - "engines": { - "node": ">=8.0.0" + "bin": { + "json5": "lib/cli.js" } }, - "node_modules/web3-eth-accounts/node_modules/web3-eth-iban/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, - "node_modules/web3-eth-contract": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.10.2.tgz", - "integrity": "sha512-CZLKPQRmupP/+OZ5A/CBwWWkBiz5B/foOpARz0upMh1yjb0dEud4YzRW2gJaeNu0eGxDLsWVaXhUimJVGYprQw==", - "dev": true, - "dependencies": { - "@types/bn.js": "^5.1.1", - "web3-core": "1.10.2", - "web3-core-helpers": "1.10.2", - "web3-core-method": "1.10.2", - "web3-core-promievent": "1.10.2", - "web3-core-subscriptions": "1.10.2", - "web3-eth-abi": "1.10.2", - "web3-utils": "1.10.2" - }, - "engines": { - "node": ">=8.0.0" - } + "node_modules/tsort": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", + "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==", + "dev": true }, - "node_modules/web3-eth-contract/node_modules/web3-core-helpers": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.2.tgz", - "integrity": "sha512-1JfaNtox6/ZYJHNoI+QVc2ObgwEPeGF+YdxHZQ7aF5605BmlwM1Bk3A8xv6mg64jIRvEq1xX6k9oG6x7p1WgXQ==", + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, "dependencies": { - "web3-eth-iban": "1.10.2", - "web3-utils": "1.10.2" + "safe-buffer": "^5.0.1" }, "engines": { - "node": ">=8.0.0" + "node": "*" } }, - "node_modules/web3-eth-contract/node_modules/web3-core-promievent": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.10.2.tgz", - "integrity": "sha512-Qkkb1dCDOU8dZeORkcwJBQRAX+mdsjx8LqFBB+P4W9QgwMqyJ6LXda+y1XgyeEVeKEmY1RCeTq9Y94q1v62Sfw==", + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "dev": true + }, + "node_modules/tweetnacl-util": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", + "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "dependencies": { - "eventemitter3": "4.0.4" + "prelude-ls": "^1.2.1" }, "engines": { - "node": ">=8.0.0" + "node": ">= 0.8.0" } }, - "node_modules/web3-eth-contract/node_modules/web3-eth-abi": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.10.2.tgz", - "integrity": "sha512-pY4fQUio7W7ZRSLf+vsYkaxJqaT/jHcALZjIxy+uBQaYAJ3t6zpQqMZkJB3Dw7HUODRJ1yI0NPEFGTnkYf/17A==", + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, - "dependencies": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.10.2" - }, + "peer": true, "engines": { - "node": ">=8.0.0" + "node": ">=4" } }, - "node_modules/web3-eth-contract/node_modules/web3-eth-iban": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.2.tgz", - "integrity": "sha512-y8+Ii2XXdyHQMFNL2NWpBnXe+TVJ4ryvPlzNhObRRnIo4O4nLIXS010olLDMayozDzoUlmzCmBZJYc9Eev1g7A==", + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "dependencies": { - "bn.js": "^5.2.1", - "web3-utils": "1.10.2" - }, "engines": { - "node": ">=8.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/web3-eth-ens": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.10.2.tgz", - "integrity": "sha512-kTQ42UdNHy4BQJHgWe97bHNMkc3zCMBKKY7t636XOMxdI/lkRdIjdE5nQzt97VjQvSVasgIWYKRAtd8aRaiZiQ==", + "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==", "dev": true, + "peer": true, "dependencies": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.10.2", - "web3-core-helpers": "1.10.2", - "web3-core-promievent": "1.10.2", - "web3-eth-abi": "1.10.2", - "web3-eth-contract": "1.10.2", - "web3-utils": "1.10.2" + "@types/prettier": "^2.1.1", + "debug": "^4.3.1", + "fs-extra": "^7.0.0", + "glob": "7.1.7", + "js-sha3": "^0.8.0", + "lodash": "^4.17.15", + "mkdirp": "^1.0.4", + "prettier": "^2.3.1", + "ts-command-line-args": "^2.2.0", + "ts-essentials": "^7.0.1" }, - "engines": { - "node": ">=8.0.0" + "bin": { + "typechain": "dist/cli/cli.js" + }, + "peerDependencies": { + "typescript": ">=4.3.0" } }, - "node_modules/web3-eth-ens/node_modules/web3-core-helpers": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.2.tgz", - "integrity": "sha512-1JfaNtox6/ZYJHNoI+QVc2ObgwEPeGF+YdxHZQ7aF5605BmlwM1Bk3A8xv6mg64jIRvEq1xX6k9oG6x7p1WgXQ==", + "node_modules/typechain/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, + "peer": true, "dependencies": { - "web3-eth-iban": "1.10.2", - "web3-utils": "1.10.2" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=6 <7 || >=8" } }, - "node_modules/web3-eth-ens/node_modules/web3-core-promievent": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.10.2.tgz", - "integrity": "sha512-Qkkb1dCDOU8dZeORkcwJBQRAX+mdsjx8LqFBB+P4W9QgwMqyJ6LXda+y1XgyeEVeKEmY1RCeTq9Y94q1v62Sfw==", + "node_modules/typechain/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "dev": true, + "peer": true, "dependencies": { - "eventemitter3": "4.0.4" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=8.0.0" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/web3-eth-ens/node_modules/web3-eth-abi": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.10.2.tgz", - "integrity": "sha512-pY4fQUio7W7ZRSLf+vsYkaxJqaT/jHcALZjIxy+uBQaYAJ3t6zpQqMZkJB3Dw7HUODRJ1yI0NPEFGTnkYf/17A==", + "node_modules/typechain/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, - "dependencies": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.10.2" - }, - "engines": { - "node": ">=8.0.0" + "peer": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/web3-eth-ens/node_modules/web3-eth-iban": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.2.tgz", - "integrity": "sha512-y8+Ii2XXdyHQMFNL2NWpBnXe+TVJ4ryvPlzNhObRRnIo4O4nLIXS010olLDMayozDzoUlmzCmBZJYc9Eev1g7A==", + "node_modules/typechain/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, - "dependencies": { - "bn.js": "^5.2.1", - "web3-utils": "1.10.2" + "peer": true, + "bin": { + "mkdirp": "bin/cmd.js" }, "engines": { - "node": ">=8.0.0" + "node": ">=10" } }, - "node_modules/web3-eth-iban": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.0.tgz", - "integrity": "sha512-0l+SP3IGhInw7Q20LY3IVafYEuufo4Dn75jAHT7c2aDJsIolvf2Lc6ugHkBajlwUneGfbRQs/ccYPQ9JeMUbrg==", + "node_modules/typechain/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, - "dependencies": { - "bn.js": "^5.2.1", - "web3-utils": "1.10.0" - }, + "peer": true, "engines": { - "node": ">=8.0.0" + "node": ">= 4.0.0" } }, - "node_modules/web3-eth-iban/node_modules/web3-utils": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", - "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", "dev": true, "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" }, "engines": { - "node": ">=8.0.0" + "node": ">= 0.4" } }, - "node_modules/web3-eth-personal": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.10.2.tgz", - "integrity": "sha512-+vEbJsPUJc5J683y0c2aN645vXC+gPVlFVCQu4IjPvXzJrAtUfz26+IZ6AUOth4fDJPT0f1uSLS5W2yrUdw9BQ==", + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", "dev": true, "dependencies": { - "@types/node": "^12.12.6", - "web3-core": "1.10.2", - "web3-core-helpers": "1.10.2", - "web3-core-method": "1.10.2", - "web3-net": "1.10.2", - "web3-utils": "1.10.2" + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" }, "engines": { - "node": ">=8.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/web3-eth-personal/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "node_modules/web3-eth-personal/node_modules/web3-core-helpers": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.2.tgz", - "integrity": "sha512-1JfaNtox6/ZYJHNoI+QVc2ObgwEPeGF+YdxHZQ7aF5605BmlwM1Bk3A8xv6mg64jIRvEq1xX6k9oG6x7p1WgXQ==", + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", "dev": true, "dependencies": { - "web3-eth-iban": "1.10.2", - "web3-utils": "1.10.2" + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" }, "engines": { - "node": ">=8.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/web3-eth-personal/node_modules/web3-eth-iban": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.2.tgz", - "integrity": "sha512-y8+Ii2XXdyHQMFNL2NWpBnXe+TVJ4ryvPlzNhObRRnIo4O4nLIXS010olLDMayozDzoUlmzCmBZJYc9Eev1g7A==", + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", "dev": true, "dependencies": { - "bn.js": "^5.2.1", - "web3-utils": "1.10.2" + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" }, - "engines": { - "node": ">=8.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/web3-eth/node_modules/web3-core-helpers": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.2.tgz", - "integrity": "sha512-1JfaNtox6/ZYJHNoI+QVc2ObgwEPeGF+YdxHZQ7aF5605BmlwM1Bk3A8xv6mg64jIRvEq1xX6k9oG6x7p1WgXQ==", + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "dev": true, - "dependencies": { - "web3-eth-iban": "1.10.2", - "web3-utils": "1.10.2" + "peer": true + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=8.0.0" + "node": ">=14.17" } }, - "node_modules/web3-eth/node_modules/web3-eth-abi": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.10.2.tgz", - "integrity": "sha512-pY4fQUio7W7ZRSLf+vsYkaxJqaT/jHcALZjIxy+uBQaYAJ3t6zpQqMZkJB3Dw7HUODRJ1yI0NPEFGTnkYf/17A==", + "node_modules/typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", "dev": true, - "dependencies": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.10.2" - }, + "peer": true, "engines": { - "node": ">=8.0.0" + "node": ">=8" } }, - "node_modules/web3-eth/node_modules/web3-eth-iban": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.2.tgz", - "integrity": "sha512-y8+Ii2XXdyHQMFNL2NWpBnXe+TVJ4ryvPlzNhObRRnIo4O4nLIXS010olLDMayozDzoUlmzCmBZJYc9Eev1g7A==", + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, - "dependencies": { - "bn.js": "^5.2.1", - "web3-utils": "1.10.2" + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" }, "engines": { - "node": ">=8.0.0" + "node": ">=0.8.0" } }, - "node_modules/web3-net": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.10.2.tgz", - "integrity": "sha512-w9i1t2z7dItagfskhaCKwpp6W3ylUR88gs68u820y5f8yfK5EbPmHc6c2lD8X9ZrTnmDoeOpIRCN/RFPtZCp+g==", + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "dependencies": { - "web3-core": "1.10.2", - "web3-core-method": "1.10.2", - "web3-utils": "1.10.2" + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" }, - "engines": { - "node": ">=8.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/web3-providers-http": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.10.2.tgz", - "integrity": "sha512-G8abKtpkyKGpRVKvfjIF3I4O/epHP7mxXWN8mNMQLkQj1cjMFiZBZ13f+qI77lNJN7QOf6+LtNdKrhsTGU72TA==", + "node_modules/undici": { + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.24.0.tgz", + "integrity": "sha512-OKlckxBjFl0oXxcj9FU6oB8fDAaiRUq+D8jrFWGmOfI/gIyjk/IeS75LMzgYKUaeHzLUcYvf9bbJGSrUwTfwwQ==", "dev": true, "dependencies": { - "abortcontroller-polyfill": "^1.7.5", - "cross-fetch": "^4.0.0", - "es6-promise": "^4.2.8", - "web3-core-helpers": "1.10.2" + "@fastify/busboy": "^2.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=14.0" } }, - "node_modules/web3-providers-http/node_modules/web3-core-helpers": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.2.tgz", - "integrity": "sha512-1JfaNtox6/ZYJHNoI+QVc2ObgwEPeGF+YdxHZQ7aF5605BmlwM1Bk3A8xv6mg64jIRvEq1xX6k9oG6x7p1WgXQ==", + "node_modules/undici-types": { + "version": "5.25.3", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", + "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==", + "dev": true + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, - "dependencies": { - "web3-eth-iban": "1.10.2", - "web3-utils": "1.10.2" - }, "engines": { - "node": ">=8.0.0" + "node": ">= 10.0.0" } }, - "node_modules/web3-providers-http/node_modules/web3-eth-iban": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.2.tgz", - "integrity": "sha512-y8+Ii2XXdyHQMFNL2NWpBnXe+TVJ4ryvPlzNhObRRnIo4O4nLIXS010olLDMayozDzoUlmzCmBZJYc9Eev1g7A==", + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, - "dependencies": { - "bn.js": "^5.2.1", - "web3-utils": "1.10.2" - }, "engines": { - "node": ">=8.0.0" + "node": ">= 0.8" } }, - "node_modules/web3-providers-ipc": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.10.2.tgz", - "integrity": "sha512-lWbn6c+SgvhLymU8u4Ea/WOVC0Gqs7OJUvauejWz+iLycxeF0xFNyXnHVAi42ZJDPVI3vnfZotafoxcNNL7Sug==", + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "dependencies": { - "oboe": "2.1.5", - "web3-core-helpers": "1.10.2" - }, - "engines": { - "node": ">=8.0.0" + "punycode": "^2.1.0" } }, - "node_modules/web3-providers-ipc/node_modules/web3-core-helpers": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.2.tgz", - "integrity": "sha512-1JfaNtox6/ZYJHNoI+QVc2ObgwEPeGF+YdxHZQ7aF5605BmlwM1Bk3A8xv6mg64jIRvEq1xX6k9oG6x7p1WgXQ==", + "node_modules/url": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", + "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", "dev": true, "dependencies": { - "web3-eth-iban": "1.10.2", - "web3-utils": "1.10.2" - }, - "engines": { - "node": ">=8.0.0" + "punycode": "^1.4.1", + "qs": "^6.11.2" } }, - "node_modules/web3-providers-ipc/node_modules/web3-eth-iban": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.2.tgz", - "integrity": "sha512-y8+Ii2XXdyHQMFNL2NWpBnXe+TVJ4ryvPlzNhObRRnIo4O4nLIXS010olLDMayozDzoUlmzCmBZJYc9Eev1g7A==", + "node_modules/url/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, + "node_modules/url/node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dev": true, "dependencies": { - "bn.js": "^5.2.1", - "web3-utils": "1.10.2" + "side-channel": "^1.0.4" }, "engines": { - "node": ">=8.0.0" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/web3-providers-ws": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.10.2.tgz", - "integrity": "sha512-3nYSiP6grI5GvpkSoehctSywfCTodU21VY8bUtXyFHK/IVfDooNtMpd5lVIMvXVAlaxwwrCfjebokaJtKH2Iag==", + "node_modules/utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", + "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", + "dev": true + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.10.2", - "websocket": "^1.0.32" - }, - "engines": { - "node": ">=8.0.0" + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/web3-providers-ws/node_modules/web3-core-helpers": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.2.tgz", - "integrity": "sha512-1JfaNtox6/ZYJHNoI+QVc2ObgwEPeGF+YdxHZQ7aF5605BmlwM1Bk3A8xv6mg64jIRvEq1xX6k9oG6x7p1WgXQ==", + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "dependencies": { - "web3-eth-iban": "1.10.2", - "web3-utils": "1.10.2" - }, - "engines": { - "node": ">=8.0.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "node_modules/web3-providers-ws/node_modules/web3-eth-iban": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.2.tgz", - "integrity": "sha512-y8+Ii2XXdyHQMFNL2NWpBnXe+TVJ4ryvPlzNhObRRnIo4O4nLIXS010olLDMayozDzoUlmzCmBZJYc9Eev1g7A==", + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "dev": true, + "engines": [ + "node >=0.6.0" + ], "dependencies": { - "bn.js": "^5.2.1", - "web3-utils": "1.10.2" - }, - "engines": { - "node": ">=8.0.0" + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" } }, - "node_modules/web3-shh": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.10.2.tgz", - "integrity": "sha512-UP0Kc3pHv9uULFu0+LOVfPwKBSJ6B+sJ5KflF7NyBk6TvNRxlpF3hUhuaVDCjjB/dDUR6T0EQeg25FA2uzJbag==", + "node_modules/wasmbuilder": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz", + "integrity": "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA==", + "dev": true + }, + "node_modules/wasmcurves": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.2.tgz", + "integrity": "sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ==", "dev": true, - "hasInstallScript": true, "dependencies": { - "web3-core": "1.10.2", - "web3-core-method": "1.10.2", - "web3-core-subscriptions": "1.10.2", - "web3-net": "1.10.2" - }, - "engines": { - "node": ">=8.0.0" + "wasmbuilder": "0.0.16" } }, + "node_modules/web-worker": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==", + "dev": true + }, "node_modules/web3-utils": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.2.tgz", @@ -26344,6 +22775,18 @@ "node": ">=8.0.0" } }, + "node_modules/web3-utils/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==", + "dev": true, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/web3-utils/node_modules/ethereum-cryptography": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz", @@ -26362,38 +22805,6 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true }, - "node_modules/websocket": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", - "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", - "dev": true, - "dependencies": { - "bufferutil": "^4.0.1", - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "typedarray-to-buffer": "^3.1.5", - "utf-8-validate": "^5.0.2", - "yaeti": "^0.0.6" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/websocket/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/websocket/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -26472,15 +22883,6 @@ "node": ">=8" } }, - "node_modules/widest-line/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/widest-line/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -26495,18 +22897,6 @@ "node": ">=8" } }, - "node_modules/widest-line/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/window-size": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", @@ -26524,6 +22914,7 @@ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -26534,6 +22925,30 @@ "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true }, + "node_modules/wordwrapjs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", + "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", + "dev": true, + "peer": true, + "dependencies": { + "reduce-flatten": "^2.0.0", + "typical": "^5.2.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/wordwrapjs/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/workerpool": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", @@ -26557,15 +22972,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -26613,18 +23019,6 @@ "node": ">=8" } }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -26632,11 +23026,13 @@ "dev": true }, "node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "dev": true, + "peer": true, "engines": { - "node": ">=8.3.0" + "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", @@ -26651,60 +23047,6 @@ } } }, - "node_modules/xhr": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", - "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", - "dev": true, - "dependencies": { - "global": "~4.4.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "node_modules/xhr-request": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", - "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", - "dev": true, - "dependencies": { - "buffer-to-arraybuffer": "^0.0.5", - "object-assign": "^4.1.1", - "query-string": "^5.0.1", - "simple-get": "^2.7.0", - "timed-out": "^4.0.1", - "url-set-query": "^1.0.0", - "xhr": "^2.0.4" - } - }, - "node_modules/xhr-request-promise": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz", - "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==", - "dev": true, - "dependencies": { - "xhr-request": "^1.1.0" - } - }, - "node_modules/xhr2-cookies": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz", - "integrity": "sha512-hjXUA6q+jl/bd8ADHcVfFsSPIf+tyLIjuO9TwJC9WI6JP2zKcS7C+p56I9kCLLsaCiNT035iYvEUUzdEFj/8+g==", - "dev": true, - "dependencies": { - "cookiejar": "^2.1.1" - } - }, - "node_modules/xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -26723,15 +23065,6 @@ "node": ">=10" } }, - "node_modules/yaeti": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", - "dev": true, - "engines": { - "node": ">=0.10.32" - } - }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -26789,27 +23122,6 @@ "node": ">=10" } }, - "node_modules/yargs-unparser/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/yargs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -26824,18 +23136,6 @@ "node": ">=8" } }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/package.json b/package.json index b8879ec4a..4b9878469 100644 --- a/package.json +++ b/package.json @@ -29,19 +29,13 @@ }, "homepage": "https://github.com/0xPolygonHermez/contracts-zkEVM#readme", "license": "pending", - "dependencies": { - "chai": "^4.3.10", - "ethers": "^5.7.2" - }, "devDependencies": { "@0xpolygonhermez/zkevm-commonjs": "github:0xPolygonHermez/zkevm-commonjs#main", - "@nomiclabs/hardhat-ethers": "^2.2.3", - "@nomiclabs/hardhat-etherscan": "^3.1.7", - "@nomiclabs/hardhat-waffle": "^2.0.6", + "@nomicfoundation/hardhat-toolbox": "^3.0.0", "@openzeppelin/contracts": "4.8.2", "@openzeppelin/contracts-upgradeable": "4.8.2", - "@openzeppelin/hardhat-upgrades": "1.22.1", - "@openzeppelin/test-helpers": "0.5.16", + "@openzeppelin/contracts5": "npm:@openzeppelin/contracts@^5.0.0", + "@openzeppelin/hardhat-upgrades": "2.3.1", "circomlibjs": "0.1.1", "dotenv": "^8.6.0", "eslint": "^8.51.0", @@ -51,11 +45,9 @@ "ffjavascript": "^0.2.60", "hardhat": "^2.18.0", "hardhat-dependency-compiler": "^1.1.3", - "hardhat-gas-reporter": "^1.0.9", "prettier": "^2.8.8", "prettier-plugin-solidity": "^1.1.3", "solc-0.8": "npm:solc@^0.8.20", - "solidity-coverage": "^0.7.22", "solidity-docgen": "^0.5.17" }, "scripts": { @@ -95,4 +87,4 @@ "prepare:testnet:gasToken:ZkEVM:goerli": "npx hardhat run deployment/testnet/prepareTestnet.js --network goerli && npx hardhat run deployment/testnet/prepareGasToken.js --network goerli", "deploy:testnet:gasToken:ZkEVM:goerli": "npm run prepare:testnet:gasToken:ZkEVM:goerli && npm run deploy:ZkEVM:goerli" } -} +} \ No newline at end of file diff --git a/src/permit-helper.js b/src/permit-helper.js index 752010f7d..3edd40185 100644 --- a/src/permit-helper.js +++ b/src/permit-helper.js @@ -43,8 +43,8 @@ async function createPermitSignature(tokenContractInstance, wallet, spenderAddre }; const rawSignature = await wallet._signTypedData(domain, types, values); - const signature = ethers.utils.splitSignature(rawSignature); - const recoveredAddressTyped = ethers.utils.verifyTypedData(domain, types, values, rawSignature); + const signature = ethers.splitSignature(rawSignature); + const recoveredAddressTyped = ethers.verifyTypedData(domain, types, values, rawSignature); expect(recoveredAddressTyped).to.be.equal(wallet.address); return signature; @@ -94,8 +94,8 @@ async function createPermitSignatureDaiType(tokenContractInstance, wallet, spend }; const rawSignature = await wallet._signTypedData(domain, types, values); - const signature = ethers.utils.splitSignature(rawSignature); - const recoveredAddressTyped = ethers.utils.verifyTypedData(domain, types, values, rawSignature); + const signature = ethers.splitSignature(rawSignature); + const recoveredAddressTyped = ethers.verifyTypedData(domain, types, values, rawSignature); expect(recoveredAddressTyped).to.be.equal(wallet.address); @@ -144,8 +144,8 @@ async function createPermitSignatureUniType(tokenContractInstance, wallet, spend }; const rawSignature = await wallet._signTypedData(domain, types, values); - const signature = ethers.utils.splitSignature(rawSignature); - const recoveredAddressTyped = ethers.utils.verifyTypedData(domain, types, values, rawSignature); + const signature = ethers.splitSignature(rawSignature); + const recoveredAddressTyped = ethers.verifyTypedData(domain, types, values, rawSignature); expect(recoveredAddressTyped).to.be.equal(wallet.address); return signature; @@ -154,12 +154,12 @@ async function createPermitSignatureUniType(tokenContractInstance, wallet, spend /** * Permit interface */ -const ifacePermit = new ethers.utils.Interface(['function permit(address,address,uint256,uint256,uint8,bytes32,bytes32)']); +const ifacePermit = new ethers.Interface(['function permit(address,address,uint256,uint256,uint8,bytes32,bytes32)']); /** * Permit interface DAI */ -const ifacePermitDAI = new ethers.utils.Interface(['function permit(address,address,uint256,uint256,bool,uint8,bytes32,bytes32)']); +const ifacePermitDAI = new ethers.Interface(['function permit(address,address,uint256,uint256,bool,uint8,bytes32,bytes32)']); module.exports = { createPermitSignature, diff --git a/test/contracts/bridge.test.js b/test/contracts/bridge.test.js index a2bbc84a4..ffa8234f9 100644 --- a/test/contracts/bridge.test.js +++ b/test/contracts/bridge.test.js @@ -7,7 +7,7 @@ const { } = require('@0xpolygonhermez/zkevm-commonjs').mtBridgeUtils; function calculateGlobalExitRoot(mainnetExitRoot, rollupExitRoot) { - return ethers.utils.solidityKeccak256(['bytes32', 'bytes32'], [mainnetExitRoot, rollupExitRoot]); + return ethers.solidityPackedKeccak256(['bytes32', 'bytes32'], [mainnetExitRoot, rollupExitRoot]); } describe('PolygonZkEVMBridge Contract', () => { @@ -22,8 +22,8 @@ describe('PolygonZkEVMBridge Contract', () => { const tokenName = 'Matic Token'; const tokenSymbol = 'MATIC'; const decimals = 18; - const tokenInitialBalance = ethers.utils.parseEther('20000000'); - const metadataToken = ethers.utils.defaultAbiCoder.encode( + const tokenInitialBalance = ethers.parseEther('20000000'); + const metadataToken = ethers.AbiCoder.defaultAbiCoder().encode( ['string', 'string', 'uint8'], [tokenName, tokenSymbol, decimals], ); @@ -34,7 +34,7 @@ describe('PolygonZkEVMBridge Contract', () => { const LEAF_TYPE_ASSET = 0; const LEAF_TYPE_MESSAGE = 1; - const polygonZkEVMAddress = ethers.constants.AddressZero; + const polygonZkEVMAddress = ethers.ZeroAddress; beforeEach('Deploy contracts', async () => { // load signers @@ -46,9 +46,9 @@ describe('PolygonZkEVMBridge Contract', () => { // deploy global exit root manager const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory('PolygonZkEVMGlobalExitRoot'); - polygonZkEVMGlobalExitRoot = await PolygonZkEVMGlobalExitRootFactory.deploy(rollup.address, polygonZkEVMBridgeContract.address); + polygonZkEVMGlobalExitRoot = await PolygonZkEVMGlobalExitRootFactory.deploy(rollup.address, polygonZkEVMBridgeContract.target); - await polygonZkEVMBridgeContract.initialize(networkIDMainnet, polygonZkEVMGlobalExitRoot.address, polygonZkEVMAddress); + await polygonZkEVMBridgeContract.initialize(networkIDMainnet, polygonZkEVMGlobalExitRoot.target, polygonZkEVMAddress); // deploy token const maticTokenFactory = await ethers.getContractFactory('ERC20PermitMock'); @@ -58,11 +58,10 @@ describe('PolygonZkEVMBridge Contract', () => { deployer.address, tokenInitialBalance, ); - await tokenContract.deployed(); }); it('should check the constructor parameters', async () => { - expect(await polygonZkEVMBridgeContract.globalExitRootManager()).to.be.equal(polygonZkEVMGlobalExitRoot.address); + expect(await polygonZkEVMBridgeContract.globalExitRootManager()).to.be.equal(polygonZkEVMGlobalExitRoot.target); expect(await polygonZkEVMBridgeContract.networkID()).to.be.equal(networkIDMainnet); expect(await polygonZkEVMBridgeContract.polygonZkEVMaddress()).to.be.equal(polygonZkEVMAddress); }); @@ -70,23 +69,23 @@ describe('PolygonZkEVMBridge Contract', () => { it('should PolygonZkEVM bridge asset and verify merkle proof', async () => { const depositCount = await polygonZkEVMBridgeContract.depositCount(); const originNetwork = networkIDMainnet; - const tokenAddress = tokenContract.address; - const amount = ethers.utils.parseEther('10'); + const tokenAddress = tokenContract.target; + const amount = ethers.parseEther('10'); const destinationNetwork = networkIDRollup; const destinationAddress = deployer.address; const metadata = metadataToken; - const metadataHash = ethers.utils.solidityKeccak256(['bytes'], [metadata]); + const metadataHash = ethers.solidityPackedKeccak256(['bytes'], [metadata]); const balanceDeployer = await tokenContract.balanceOf(deployer.address); - const balanceBridge = await tokenContract.balanceOf(polygonZkEVMBridgeContract.address); + const balanceBridge = await tokenContract.balanceOf(polygonZkEVMBridgeContract.target); const rollupExitRoot = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); // create a new deposit - await expect(tokenContract.approve(polygonZkEVMBridgeContract.address, amount)) + await expect(tokenContract.approve(polygonZkEVMBridgeContract.target, amount)) .to.emit(tokenContract, 'Approval') - .withArgs(deployer.address, polygonZkEVMBridgeContract.address, amount); + .withArgs(deployer.address, polygonZkEVMBridgeContract.target, amount); // pre compute root merkle tree in Js const height = 32; @@ -97,7 +96,7 @@ describe('PolygonZkEVMBridge Contract', () => { tokenAddress, destinationNetwork, destinationAddress, - amount, + (amount), metadataHash, ); merkleTree.add(leafValue); @@ -111,7 +110,7 @@ describe('PolygonZkEVMBridge Contract', () => { tokenAddress, true, '0x', - )).to.be.revertedWith('DestinationNetworkInvalid'); + )).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, 'DestinationNetworkInvalid'); await expect(polygonZkEVMBridgeContract.bridgeAsset( destinationNetwork, @@ -121,7 +120,7 @@ describe('PolygonZkEVMBridge Contract', () => { true, '0x', { value: 1 }, - )).to.be.revertedWith('MsgValueNotZero'); + )).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, 'MsgValueNotZero'); await expect(polygonZkEVMBridgeContract.bridgeAsset(destinationNetwork, destinationAddress, amount, tokenAddress, true, '0x')) .to.emit(polygonZkEVMBridgeContract, 'BridgeEvent') @@ -129,8 +128,8 @@ describe('PolygonZkEVMBridge Contract', () => { .to.emit(polygonZkEVMGlobalExitRoot, 'UpdateGlobalExitRoot') .withArgs(rootJSMainnet, rollupExitRoot); - expect(await tokenContract.balanceOf(deployer.address)).to.be.equal(balanceDeployer.sub(amount)); - expect(await tokenContract.balanceOf(polygonZkEVMBridgeContract.address)).to.be.equal(balanceBridge.add(amount)); + expect(await tokenContract.balanceOf(deployer.address)).to.be.equal(balanceDeployer - amount); + expect(await tokenContract.balanceOf(polygonZkEVMBridgeContract.target)).to.be.equal(balanceBridge + (amount)); expect(await polygonZkEVMBridgeContract.lastUpdatedDepositCount()).to.be.equal(1); // check merkle root with SC @@ -158,12 +157,12 @@ describe('PolygonZkEVMBridge Contract', () => { const depositCount = await polygonZkEVMBridgeContract.depositCount(); const originNetwork = networkIDMainnet; const originAddress = deployer.address; - const amount = ethers.utils.parseEther('10'); + const amount = ethers.parseEther('10'); const destinationNetwork = networkIDRollup; const destinationAddress = deployer.address; const metadata = metadataToken; - const metadataHash = ethers.utils.solidityKeccak256(['bytes'], [metadata]); + const metadataHash = ethers.solidityPackedKeccak256(['bytes'], [metadata]); const rollupExitRoot = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); // pre compute root merkle tree in Js @@ -218,23 +217,23 @@ describe('PolygonZkEVMBridge Contract', () => { it('should PolygonZkEVM bridge asset and message to check global exit root updates', async () => { const depositCount = await polygonZkEVMBridgeContract.depositCount(); const originNetwork = networkIDMainnet; - const tokenAddress = tokenContract.address; - const amount = ethers.utils.parseEther('10'); + const tokenAddress = tokenContract.target; + const amount = ethers.parseEther('10'); const destinationNetwork = networkIDRollup; const destinationAddress = deployer.address; const metadata = metadataToken; - const metadataHash = ethers.utils.solidityKeccak256(['bytes'], [metadata]); + const metadataHash = ethers.solidityPackedKeccak256(['bytes'], [metadata]); const balanceDeployer = await tokenContract.balanceOf(deployer.address); - const balanceBridge = await tokenContract.balanceOf(polygonZkEVMBridgeContract.address); + const balanceBridge = await tokenContract.balanceOf(polygonZkEVMBridgeContract.target); const rollupExitRoot = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); // create a new deposit - await expect(tokenContract.approve(polygonZkEVMBridgeContract.address, amount)) + await expect(tokenContract.approve(polygonZkEVMBridgeContract.target, amount)) .to.emit(tokenContract, 'Approval') - .withArgs(deployer.address, polygonZkEVMBridgeContract.address, amount); + .withArgs(deployer.address, polygonZkEVMBridgeContract.target, amount); // pre compute root merkle tree in Js const height = 32; @@ -255,10 +254,10 @@ describe('PolygonZkEVMBridge Contract', () => { .to.emit(polygonZkEVMBridgeContract, 'BridgeEvent') .withArgs(LEAF_TYPE_ASSET, originNetwork, tokenAddress, destinationNetwork, destinationAddress, amount, metadata, depositCount); - expect(await tokenContract.balanceOf(deployer.address)).to.be.equal(balanceDeployer.sub(amount)); - expect(await tokenContract.balanceOf(polygonZkEVMBridgeContract.address)).to.be.equal(balanceBridge.add(amount)); + expect(await tokenContract.balanceOf(deployer.address)).to.be.equal(balanceDeployer - (amount)); + expect(await tokenContract.balanceOf(polygonZkEVMBridgeContract.target)).to.be.equal(balanceBridge + (amount)); expect(await polygonZkEVMBridgeContract.lastUpdatedDepositCount()).to.be.equal(0); - expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(ethers.constants.HashZero); + expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(ethers.ZeroHash); // check merkle root with SC const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); @@ -301,20 +300,20 @@ describe('PolygonZkEVMBridge Contract', () => { expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.not.be.equal(rootJSMainnet); // Just to have the metric of a low cost bridge Asset - const tokenAddress2 = ethers.constants.AddressZero; // Ether - const amount2 = ethers.utils.parseEther('10'); + const tokenAddress2 = ethers.ZeroAddress; // Ether + const amount2 = ethers.parseEther('10'); await polygonZkEVMBridgeContract.bridgeAsset(destinationNetwork, destinationAddress, amount2, tokenAddress2, false, '0x', { value: amount2 }); }); it('should claim tokens from Mainnet to Mainnet', async () => { const originNetwork = networkIDMainnet; - const tokenAddress = tokenContract.address; - const amount = ethers.utils.parseEther('10'); + const tokenAddress = tokenContract.target; + const amount = ethers.parseEther('10'); const destinationNetwork = networkIDMainnet; const destinationAddress = acc1.address; const metadata = metadataToken; - const metadataHash = ethers.utils.solidityKeccak256(['bytes'], [metadata]); + const metadataHash = ethers.solidityPackedKeccak256(['bytes'], [metadata]); const mainnetExitRoot = await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot(); @@ -337,7 +336,7 @@ describe('PolygonZkEVMBridge Contract', () => { // check only rollup account with update rollup exit root await expect(polygonZkEVMGlobalExitRoot.updateExitRoot(rootJSRollup)) - .to.be.revertedWith('OnlyAllowedContracts'); + .to.be.revertedWithCustomError(polygonZkEVMGlobalExitRoot, 'OnlyAllowedContracts'); // add rollup Merkle root await expect(polygonZkEVMGlobalExitRoot.connect(rollup).updateExitRoot(rootJSRollup)) @@ -379,12 +378,12 @@ describe('PolygonZkEVMBridge Contract', () => { destinationAddress, amount, metadata, - )).to.be.revertedWith('ERC20: transfer amount exceeds balance'); + )).to.be.revertedWithCustomError('ERC20: transfer amount exceeds balance'); // transfer tokens, then claim - await expect(tokenContract.transfer(polygonZkEVMBridgeContract.address, amount)) + await expect(tokenContract.transfer(polygonZkEVMBridgeContract.target, amount)) .to.emit(tokenContract, 'Transfer') - .withArgs(deployer.address, polygonZkEVMBridgeContract.address, amount); + .withArgs(deployer.address, polygonZkEVMBridgeContract.target, amount); expect(false).to.be.equal(await polygonZkEVMBridgeContract.isClaimed(index)); @@ -408,7 +407,7 @@ describe('PolygonZkEVMBridge Contract', () => { destinationAddress, amount, ).to.emit(tokenContract, 'Transfer') - .withArgs(polygonZkEVMBridgeContract.address, acc1.address, amount); + .withArgs(polygonZkEVMBridgeContract.target, acc1.address, amount); // Can't claim because nullifier await expect(polygonZkEVMBridgeContract.claimAsset( @@ -422,19 +421,19 @@ describe('PolygonZkEVMBridge Contract', () => { destinationAddress, amount, metadata, - )).to.be.revertedWith('AlreadyClaimed'); + )).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, 'AlreadyClaimed'); expect(true).to.be.equal(await polygonZkEVMBridgeContract.isClaimed(index)); }); it('should claim tokens from Rollup to Mainnet', async () => { const originNetwork = networkIDRollup; - const tokenAddress = ethers.utils.getAddress(ethers.utils.hexlify(ethers.utils.randomBytes(20))); - const amount = ethers.utils.parseEther('10'); + const tokenAddress = ethers.getAddress(ethers.hexlify(ethers.randomBytes(20))); + const amount = ethers.parseEther('10'); const destinationNetwork = networkIDMainnet; const destinationAddress = deployer.address; const metadata = metadataToken; // since we are inserting in the exit root can be anything - const metadataHash = ethers.utils.solidityKeccak256(['bytes'], [metadata]); + const metadataHash = ethers.solidityPackedKeccak256(['bytes'], [metadata]); const mainnetExitRoot = await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot(); @@ -452,15 +451,15 @@ describe('PolygonZkEVMBridge Contract', () => { ); // Add 2 leafs - merkleTreeRollup.add(leafValue); - merkleTreeRollup.add(leafValue); + merkleTreeRollup + (leafValue); + merkleTreeRollup + (leafValue); // check merkle root with SC const rootJSRollup = merkleTreeRollup.getRoot(); // check only rollup account with update rollup exit root await expect(polygonZkEVMGlobalExitRoot.updateExitRoot(rootJSRollup)) - .to.be.revertedWith('OnlyAllowedContracts'); + .to.be.revertedWithCustomError(polygonZkEVMBridgeContract, 'OnlyAllowedContracts'); // add rollup Merkle root await expect(polygonZkEVMGlobalExitRoot.connect(rollup).updateExitRoot(rootJSRollup)) @@ -493,10 +492,10 @@ describe('PolygonZkEVMBridge Contract', () => { const tokenWrappedFactory = await ethers.getContractFactory('TokenWrapped'); // create2 parameters - const salt = ethers.utils.solidityKeccak256(['uint32', 'address'], [networkIDRollup, tokenAddress]); + const salt = ethers.solidityPackedKeccak256(['uint32', 'address'], [networkIDRollup, tokenAddress]); const minimalBytecodeProxy = tokenWrappedFactory.bytecode; - const hashInitCode = ethers.utils.solidityKeccak256(['bytes', 'bytes'], [minimalBytecodeProxy, metadataToken]); - const precalculateWrappedErc20 = await ethers.utils.getCreate2Address(polygonZkEVMBridgeContract.address, salt, hashInitCode); + const hashInitCode = ethers.solidityPackedKeccak256(['bytes', 'bytes'], [minimalBytecodeProxy, metadataToken]); + const precalculateWrappedErc20 = await ethers.getCreate2Address(polygonZkEVMBridgeContract.target, salt, hashInitCode); const newWrappedToken = tokenWrappedFactory.attach(precalculateWrappedErc20); // Use precalculatedWrapperAddress and check if matches @@ -530,7 +529,7 @@ describe('PolygonZkEVMBridge Contract', () => { ).to.emit(polygonZkEVMBridgeContract, 'NewWrappedToken') .withArgs(originNetwork, tokenAddress, precalculateWrappedErc20, metadata) .to.emit(newWrappedToken, 'Transfer') - .withArgs(ethers.constants.AddressZero, deployer.address, amount); + .withArgs(ethers.ZeroAddress, deployer.address, amount); // Assert maps created const newTokenInfo = await polygonZkEVMBridgeContract.wrappedTokenToTokenInfo(precalculateWrappedErc20); @@ -565,7 +564,7 @@ describe('PolygonZkEVMBridge Contract', () => { destinationAddress, amount, metadata, - )).to.be.revertedWith('AlreadyClaimed'); + )).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, 'AlreadyClaimed'); // Check new token expect(await newWrappedToken.totalSupply()).to.be.equal(amount); @@ -594,19 +593,19 @@ describe('PolygonZkEVMBridge Contract', () => { destinationAddress, amount, ).to.emit(newWrappedToken, 'Transfer') - .withArgs(ethers.constants.AddressZero, deployer.address, amount); + .withArgs(ethers.ZeroAddress, deployer.address, amount); // Burn Tokens const depositCount = await polygonZkEVMBridgeContract.depositCount(); - const wrappedTokenAddress = newWrappedToken.address; + const wrappedTokenAddress = newWrappedToken.target; const newDestinationNetwork = networkIDRollup; const rollupExitRoot = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); // create a new deposit - await expect(newWrappedToken.approve(polygonZkEVMBridgeContract.address, amount)) + await expect(newWrappedToken.approve(polygonZkEVMBridgeContract.target, amount)) .to.emit(newWrappedToken, 'Approval') - .withArgs(deployer.address, polygonZkEVMBridgeContract.address, amount); + .withArgs(deployer.address, polygonZkEVMBridgeContract.target, amount); /* * pre compute root merkle tree in Js @@ -616,7 +615,7 @@ describe('PolygonZkEVMBridge Contract', () => { // Imporant calcualte leaf with origin token address no wrapped token address const originTokenAddress = tokenAddress; const metadataMainnet = '0x'; // since the token does not belong to this network - const metadataHashMainnet = ethers.utils.solidityKeccak256(['bytes'], [metadataMainnet]); + const metadataHashMainnet = ethers.solidityPackedKeccak256(['bytes'], [metadataMainnet]); const leafValueMainnet = getLeafValue( LEAF_TYPE_ASSET, @@ -638,7 +637,7 @@ describe('PolygonZkEVMBridge Contract', () => { ); expect(leafValueMainnet).to.be.equal(leafValueMainnetSC); - merkleTreeMainnet.add(leafValueMainnet); + merkleTreeMainnet + (leafValueMainnet); const rootJSMainnet = merkleTreeMainnet.getRoot(); // Tokens are burnt @@ -660,11 +659,11 @@ describe('PolygonZkEVMBridge Contract', () => { .to.emit(polygonZkEVMGlobalExitRoot, 'UpdateGlobalExitRoot') .withArgs(rootJSMainnet, rollupExitRoot) .to.emit(newWrappedToken, 'Transfer') - .withArgs(deployer.address, ethers.constants.AddressZero, amount); + .withArgs(deployer.address, ethers.ZeroAddress, amount); expect(await newWrappedToken.totalSupply()).to.be.equal(amount); expect(await newWrappedToken.balanceOf(deployer.address)).to.be.equal(amount); - expect(await newWrappedToken.balanceOf(polygonZkEVMBridgeContract.address)).to.be.equal(0); + expect(await newWrappedToken.balanceOf(polygonZkEVMBridgeContract.target)).to.be.equal(0); // check merkle root with SC const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); @@ -690,8 +689,8 @@ describe('PolygonZkEVMBridge Contract', () => { it('should PolygonZkEVMBridge and sync the current root with events', async () => { const depositCount = await polygonZkEVMBridgeContract.depositCount(); const originNetwork = networkIDMainnet; - const tokenAddress = ethers.constants.AddressZero; // Ether - const amount = ethers.utils.parseEther('10'); + const tokenAddress = ethers.ZeroAddress; // Ether + const amount = ethers.parseEther('10'); const destinationNetwork = networkIDRollup; const destinationAddress = deployer.address; @@ -743,7 +742,7 @@ describe('PolygonZkEVMBridge Contract', () => { destinationAddress, amount, metadata, - depositCount.add(1), + depositCount + (1), ); await expect(polygonZkEVMBridgeContract.bridgeAsset( @@ -767,7 +766,7 @@ describe('PolygonZkEVMBridge Contract', () => { destinationAddress, amount, metadata, - depositCount.add(2), + depositCount + (2), ); // Prepare merkle tree @@ -792,7 +791,7 @@ describe('PolygonZkEVMBridge Contract', () => { args.destinationNetwork, args.destinationAddress, args.amount, - ethers.utils.solidityKeccak256(['bytes'], [args.metadata]), + ethers.solidityPackedKeccak256(['bytes'], [args.metadata]), ); merkleTree.add(leafValue); }); @@ -807,13 +806,13 @@ describe('PolygonZkEVMBridge Contract', () => { it('should claim testing all the asserts', async () => { // Add a claim leaf to rollup exit tree const originNetwork = networkIDMainnet; - const tokenAddress = tokenContract.address; - const amount = ethers.utils.parseEther('10'); + const tokenAddress = tokenContract.target; + const amount = ethers.parseEther('10'); const destinationNetwork = networkIDMainnet; const destinationAddress = deployer.address; const metadata = metadataToken; - const metadataHash = ethers.utils.solidityKeccak256(['bytes'], [metadata]); + const metadataHash = ethers.solidityPackedKeccak256(['bytes'], [metadata]); const mainnetExitRoot = await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot(); @@ -871,12 +870,12 @@ describe('PolygonZkEVMBridge Contract', () => { destinationAddress, amount, metadata, - )).to.be.revertedWith('ERC20: transfer amount exceeds balance'); + )).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, 'ERC20: transfer amount exceeds balance'); // transfer tokens, then claim - await expect(tokenContract.transfer(polygonZkEVMBridgeContract.address, amount)) + await expect(tokenContract.transfer(polygonZkEVMBridgeContract.target, amount)) .to.emit(tokenContract, 'Transfer') - .withArgs(deployer.address, polygonZkEVMBridgeContract.address, amount); + .withArgs(deployer.address, polygonZkEVMBridgeContract.target, amount); // Check Destination network does not match assert await expect(polygonZkEVMBridgeContract.claimAsset( @@ -890,7 +889,7 @@ describe('PolygonZkEVMBridge Contract', () => { destinationAddress, amount, metadata, - )).to.be.revertedWith('DestinationNetworkInvalid'); + )).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, 'DestinationNetworkInvalid'); // Check GlobalExitRoot invalid assert await expect(polygonZkEVMBridgeContract.claimAsset( @@ -904,7 +903,7 @@ describe('PolygonZkEVMBridge Contract', () => { destinationAddress, amount, metadata, - )).to.be.revertedWith('GlobalExitRootInvalid'); + )).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, 'GlobalExitRootInvalid'); // Check Invalid smt proof assert await expect(polygonZkEVMBridgeContract.claimAsset( @@ -918,7 +917,7 @@ describe('PolygonZkEVMBridge Contract', () => { destinationAddress, amount, metadata, - )).to.be.revertedWith('InvalidSmtProof'); + )).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, 'InvalidSmtProof'); await expect(polygonZkEVMBridgeContract.claimAsset( proof, @@ -940,7 +939,7 @@ describe('PolygonZkEVMBridge Contract', () => { destinationAddress, amount, ).to.emit(tokenContract, 'Transfer') - .withArgs(polygonZkEVMBridgeContract.address, deployer.address, amount); + .withArgs(polygonZkEVMBridgeContract.target, deployer.address, amount); // Check Already claimed_claim await expect(polygonZkEVMBridgeContract.claimAsset( @@ -954,19 +953,19 @@ describe('PolygonZkEVMBridge Contract', () => { destinationAddress, amount, metadata, - )).to.be.revertedWith('AlreadyClaimed'); + )).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, 'AlreadyClaimed'); }); it('should claim ether', async () => { // Add a claim leaf to rollup exit tree const originNetwork = networkIDMainnet; - const tokenAddress = ethers.constants.AddressZero; // ether - const amount = ethers.utils.parseEther('10'); + const tokenAddress = ethers.ZeroAddress; // ether + const amount = ethers.parseEther('10'); const destinationNetwork = networkIDMainnet; const destinationAddress = deployer.address; const metadata = '0x'; // since is ether does not have metadata - const metadataHash = ethers.utils.solidityKeccak256(['bytes'], [metadata]); + const metadataHash = ethers.solidityPackedKeccak256(['bytes'], [metadata]); const mainnetExitRoot = await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot(); @@ -1027,7 +1026,7 @@ describe('PolygonZkEVMBridge Contract', () => { destinationAddress, amount, metadata, - )).to.be.revertedWith('EtherTransferFailed'); + )).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, 'EtherTransferFailed'); const balanceDeployer = await ethers.provider.getBalance(deployer.address); /* @@ -1041,8 +1040,8 @@ describe('PolygonZkEVMBridge Contract', () => { tokenAddress, true, '0x', - { value: ethers.utils.parseEther('100') }, - )).to.be.revertedWith('AmountDoesNotMatchMsgValue'); + { value: ethers.parseEther('100') }, + )).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, 'AmountDoesNotMatchMsgValue'); // Check mainnet destination assert await expect(polygonZkEVMBridgeContract.bridgeAsset( @@ -1053,7 +1052,7 @@ describe('PolygonZkEVMBridge Contract', () => { true, '0x', { value: amount }, - )).to.be.revertedWith('DestinationNetworkInvalid'); + )).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, 'DestinationNetworkInvalid'); // This is used just to pay ether to the PolygonZkEVMBridge smart contract and be able to claim it afterwards. expect(await polygonZkEVMBridgeContract.bridgeAsset( @@ -1067,8 +1066,8 @@ describe('PolygonZkEVMBridge Contract', () => { )); // Check balances before claim - expect(await ethers.provider.getBalance(polygonZkEVMBridgeContract.address)).to.be.equal(amount); - expect(await ethers.provider.getBalance(deployer.address)).to.be.lte(balanceDeployer.sub(amount)); + expect(await ethers.provider.getBalance(polygonZkEVMBridgeContract.target)).to.be.equal(amount); + expect(await ethers.provider.getBalance(deployer.address)).to.be.lte(balanceDeployer - (amount)); await expect(polygonZkEVMBridgeContract.claimAsset( proof, @@ -1092,7 +1091,7 @@ describe('PolygonZkEVMBridge Contract', () => { ); // Check balances after claim - expect(await ethers.provider.getBalance(polygonZkEVMBridgeContract.address)).to.be.equal(ethers.utils.parseEther('0')); + expect(await ethers.provider.getBalance(polygonZkEVMBridgeContract.target)).to.be.equal(ethers.parseEther('0')); expect(await ethers.provider.getBalance(deployer.address)).to.be.lte(balanceDeployer); // Can't claim because nullifier @@ -1107,19 +1106,19 @@ describe('PolygonZkEVMBridge Contract', () => { destinationAddress, amount, metadata, - )).to.be.revertedWith('AlreadyClaimed'); + )).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, 'AlreadyClaimed'); }); it('should claim message', async () => { // Add a claim leaf to rollup exit tree const originNetwork = networkIDMainnet; - const tokenAddress = ethers.constants.AddressZero; // ether - const amount = ethers.utils.parseEther('10'); + const tokenAddress = ethers.ZeroAddress; // ether + const amount = ethers.parseEther('10'); const destinationNetwork = networkIDMainnet; const destinationAddress = deployer.address; const metadata = '0x176923791298713271763697869132'; // since is ether does not have metadata - const metadataHash = ethers.utils.solidityKeccak256(['bytes'], [metadata]); + const metadataHash = ethers.solidityPackedKeccak256(['bytes'], [metadata]); const mainnetExitRoot = await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot(); @@ -1180,7 +1179,7 @@ describe('PolygonZkEVMBridge Contract', () => { destinationAddress, amount, metadata, - )).to.be.revertedWith('InvalidSmtProof'); + )).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, 'InvalidSmtProof'); /* * claim @@ -1197,7 +1196,7 @@ describe('PolygonZkEVMBridge Contract', () => { destinationAddress, amount, metadata, - )).to.be.revertedWith('MessageFailed'); + )).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, 'MessageFailed'); const balanceDeployer = await ethers.provider.getBalance(deployer.address); /* @@ -1211,8 +1210,8 @@ describe('PolygonZkEVMBridge Contract', () => { tokenAddress, true, '0x', - { value: ethers.utils.parseEther('100') }, - )).to.be.revertedWith('AmountDoesNotMatchMsgValue'); + { value: ethers.parseEther('100') }, + )).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, 'AmountDoesNotMatchMsgValue'); // Check mainnet destination assert await expect(polygonZkEVMBridgeContract.bridgeAsset( @@ -1223,7 +1222,7 @@ describe('PolygonZkEVMBridge Contract', () => { true, '0x', { value: amount }, - )).to.be.revertedWith('DestinationNetworkInvalid'); + )).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, 'DestinationNetworkInvalid'); // This is used just to pay ether to the PolygonZkEVMBridge smart contract and be able to claim it afterwards. expect(await polygonZkEVMBridgeContract.bridgeAsset( @@ -1237,8 +1236,8 @@ describe('PolygonZkEVMBridge Contract', () => { )); // Check balances before claim - expect(await ethers.provider.getBalance(polygonZkEVMBridgeContract.address)).to.be.equal(amount); - expect(await ethers.provider.getBalance(deployer.address)).to.be.lte(balanceDeployer.sub(amount)); + expect(await ethers.provider.getBalance(polygonZkEVMBridgeContract.target)).to.be.equal(amount); + expect(await ethers.provider.getBalance(deployer.address)).to.be.lte(balanceDeployer - (amount)); // Check mainnet destination assert await expect(polygonZkEVMBridgeContract.claimAsset( @@ -1252,7 +1251,7 @@ describe('PolygonZkEVMBridge Contract', () => { destinationAddress, amount, metadata, - )).to.be.revertedWith('InvalidSmtProof'); + )).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, 'InvalidSmtProof'); await expect(polygonZkEVMBridgeContract.claimMessage( proof, @@ -1276,7 +1275,7 @@ describe('PolygonZkEVMBridge Contract', () => { ); // Check balances after claim - expect(await ethers.provider.getBalance(polygonZkEVMBridgeContract.address)).to.be.equal(ethers.utils.parseEther('0')); + expect(await ethers.provider.getBalance(polygonZkEVMBridgeContract.target)).to.be.equal(ethers.parseEther('0')); expect(await ethers.provider.getBalance(deployer.address)).to.be.lte(balanceDeployer); // Can't claim because nullifier @@ -1291,6 +1290,6 @@ describe('PolygonZkEVMBridge Contract', () => { destinationAddress, amount, metadata, - )).to.be.revertedWith('AlreadyClaimed'); + )).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, 'AlreadyClaimed'); }); }); diff --git a/test/contracts/bridgeMock.test.js b/test/contracts/bridgeMock.test.js index aa1cbb1dd..7c3c583c1 100644 --- a/test/contracts/bridgeMock.test.js +++ b/test/contracts/bridgeMock.test.js @@ -7,7 +7,7 @@ const { } = require('@0xpolygonhermez/zkevm-commonjs').mtBridgeUtils; function calculateGlobalExitRoot(mainnetExitRoot, rollupExitRoot) { - return ethers.utils.solidityKeccak256(['bytes32', 'bytes32'], [mainnetExitRoot, rollupExitRoot]); + return ethers.solidityPackedKeccak256(['bytes32', 'bytes32'], [mainnetExitRoot, rollupExitRoot]); } describe('PolygonZkEVMBridge Mock Contract', () => { @@ -22,8 +22,8 @@ describe('PolygonZkEVMBridge Mock Contract', () => { const tokenName = 'Matic Token'; const tokenSymbol = 'MATIC'; const decimals = 18; - const tokenInitialBalance = ethers.utils.parseEther('20000000'); - const metadataToken = ethers.utils.defaultAbiCoder.encode( + const tokenInitialBalance = ethers.parseEther('20000000'); + const metadataToken = ethers.AbiCoder.defaultAbiCoder().encode( ['string', 'string', 'uint8'], [tokenName, tokenSymbol, decimals], ); @@ -32,7 +32,7 @@ describe('PolygonZkEVMBridge Mock Contract', () => { const networkIDRollup = 1; const LEAF_TYPE_ASSET = 0; - const polygonZkEVMAddress = ethers.constants.AddressZero; + const polygonZkEVMAddress = ethers.ZeroAddress; beforeEach('Deploy contracts', async () => { // load signers @@ -68,12 +68,12 @@ describe('PolygonZkEVMBridge Mock Contract', () => { const depositCount = await polygonZkEVMBridgeContract.depositCount(); const originNetwork = networkIDMainnet; const tokenAddress = tokenContract.address; - const amount = ethers.utils.parseEther('10'); + const amount = ethers.parseEther('10'); const destinationNetwork = networkIDRollup; const destinationAddress = deployer.address; const metadata = metadataToken; - const metadataHash = ethers.utils.solidityKeccak256(['bytes'], [metadata]); + const metadataHash = ethers.solidityPackedKeccak256(['bytes'], [metadata]); const balanceDeployer = await tokenContract.balanceOf(deployer.address); const balanceBridge = await tokenContract.balanceOf(polygonZkEVMBridgeContract.address); @@ -132,8 +132,8 @@ describe('PolygonZkEVMBridge Mock Contract', () => { it('shouldnt be able to PolygonZkEVMBridge more thna 0.25e ehters', async () => { // Add a claim leaf to rollup exit tree - const tokenAddress = ethers.constants.AddressZero; // ether - const amount = ethers.utils.parseEther('10'); + const tokenAddress = ethers.ZeroAddress; // ether + const amount = ethers.parseEther('10'); const destinationNetwork = networkIDRollup; const destinationAddress = deployer.address; @@ -144,29 +144,29 @@ describe('PolygonZkEVMBridge Mock Contract', () => { tokenAddress, true, '0x', - { value: ethers.utils.parseEther('10') }, + { value: ethers.parseEther('10') }, )).to.be.revertedWith('PolygonZkEVMBridge::bridgeAsset: Cannot bridge more than maxEtherBridge'); await polygonZkEVMBridgeContract.bridgeAsset( destinationNetwork, destinationAddress, - ethers.utils.parseEther('0.25'), + ethers.parseEther('0.25'), tokenAddress, true, '0x', - { value: ethers.utils.parseEther('0.25') }, + { value: ethers.parseEther('0.25') }, ); }); it('should claim tokens from Rollup to Rollup', async () => { const originNetwork = networkIDRollup; const tokenAddress = tokenContract.address; - const amount = ethers.utils.parseEther('10'); + const amount = ethers.parseEther('10'); const destinationNetwork = networkIDRollup; const destinationAddress = acc1.address; const metadata = metadataToken; - const metadataHash = ethers.utils.solidityKeccak256(['bytes'], [metadata]); + const metadataHash = ethers.solidityPackedKeccak256(['bytes'], [metadata]); // Set network to Rollup await polygonZkEVMBridgeContract.setNetworkID(1); @@ -187,7 +187,7 @@ describe('PolygonZkEVMBridge Mock Contract', () => { // check merkle root with SC const mainnetExitRoot = merkleTree.getRoot(); - const rollupExitRoot = ethers.constants.HashZero; + const rollupExitRoot = ethers.HashZero; const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRoot); // set globalExitRoot diff --git a/test/contracts/bridge_metadata.test.js b/test/contracts/bridge_metadata.test.js index f6c8b34df..25e2c1d1a 100644 --- a/test/contracts/bridge_metadata.test.js +++ b/test/contracts/bridge_metadata.test.js @@ -16,13 +16,13 @@ describe('PolygonZkEVMBridge Contract werid metadata', () => { const tokenName = 'Matic Token'; const tokenSymbol = 'MATIC'; const decimals = 18; - const tokenInitialBalance = ethers.utils.parseEther('20000000'); + const tokenInitialBalance = ethers.parseEther('20000000'); const networkIDMainnet = 0; const networkIDRollup = 1; const LEAF_TYPE_ASSET = 0; - const polygonZkEVMAddress = ethers.constants.AddressZero; + const polygonZkEVMAddress = ethers.ZeroAddress; beforeEach('Deploy contracts', async () => { // load signers @@ -56,8 +56,8 @@ describe('PolygonZkEVMBridge Contract werid metadata', () => { const nameWeird = 'nameToken'; const symbolWeird = 'NTK'; - const nameWeirdBytes32 = ethers.utils.formatBytes32String(nameWeird); - const symbolWeirdBytes = ethers.utils.toUtf8Bytes(symbolWeird); + const nameWeirdBytes32 = ethers.formatBytes32String(nameWeird); + const symbolWeirdBytes = ethers.toUtf8Bytes(symbolWeird); const decimalsWeird = 14; const weirdTokenContract = await weirdErc20Metadata.deploy( @@ -74,16 +74,16 @@ describe('PolygonZkEVMBridge Contract werid metadata', () => { const depositCount = await polygonZkEVMBridgeContract.depositCount(); const originNetwork = networkIDMainnet; const tokenAddress = weirdTokenContract.address; - const amount = ethers.utils.parseEther('10'); + const amount = ethers.parseEther('10'); const destinationNetwork = networkIDRollup; const destinationAddress = deployer.address; - const metadata = ethers.utils.defaultAbiCoder.encode( + const metadata = ethers.AbiCoder.defaultAbiCoder().encode( ['string', 'string', 'uint8'], [nameWeird, symbolWeird, decimalsWeird], ); - const metadataHash = ethers.utils.solidityKeccak256(['bytes'], [metadata]); + const metadataHash = ethers.solidityPackedKeccak256(['bytes'], [metadata]); // pre compute root merkle tree in Js const height = 32; @@ -113,9 +113,9 @@ describe('PolygonZkEVMBridge Contract werid metadata', () => { const nameWeird = 'nameToken'; const symbolWeird = 'NTK'; - const nameWeirdBytes32 = ethers.utils.formatBytes32String(nameWeird); - const symbolWeirdBytes = ethers.utils.toUtf8Bytes(symbolWeird); - const decimalsWeird = ethers.constants.MaxUint256; + const nameWeirdBytes32 = ethers.formatBytes32String(nameWeird); + const symbolWeirdBytes = ethers.toUtf8Bytes(symbolWeird); + const decimalsWeird = ethers.MaxUint256; const weirdTokenContract = await weirdErc20Metadata.deploy( nameWeirdBytes32, // bytes32 @@ -131,7 +131,7 @@ describe('PolygonZkEVMBridge Contract werid metadata', () => { const depositCount = await polygonZkEVMBridgeContract.depositCount(); const originNetwork = networkIDMainnet; const tokenAddress = weirdTokenContract.address; - const amount = ethers.utils.parseEther('10'); + const amount = ethers.parseEther('10'); const destinationNetwork = networkIDRollup; const destinationAddress = deployer.address; @@ -144,12 +144,12 @@ describe('PolygonZkEVMBridge Contract werid metadata', () => { const nameRevert = 'NO_NAME'; const symbolRevert = 'NO_SYMBOL'; const decimalsTooRevert = 18; - const metadata = ethers.utils.defaultAbiCoder.encode( + const metadata = ethers.AbiCoder.defaultAbiCoder().encode( ['string', 'string', 'uint8'], [nameRevert, symbolRevert, decimalsTooRevert], ); - const metadataHash = ethers.utils.solidityKeccak256(['bytes'], [metadata]); + const metadataHash = ethers.solidityPackedKeccak256(['bytes'], [metadata]); // pre compute root merkle tree in Js const height = 32; @@ -179,8 +179,8 @@ describe('PolygonZkEVMBridge Contract werid metadata', () => { const nameWeird = ''; const symbolWeird = ''; - const nameWeirdBytes32 = ethers.utils.formatBytes32String(nameWeird); - const symbolWeirdBytes = ethers.utils.toUtf8Bytes(symbolWeird); + const nameWeirdBytes32 = ethers.formatBytes32String(nameWeird); + const symbolWeirdBytes = ethers.toUtf8Bytes(symbolWeird); const decimalsWeird = 255; const weirdTokenContract = await weirdErc20Metadata.deploy( @@ -197,7 +197,7 @@ describe('PolygonZkEVMBridge Contract werid metadata', () => { const depositCount = await polygonZkEVMBridgeContract.depositCount(); const originNetwork = networkIDMainnet; const tokenAddress = weirdTokenContract.address; - const amount = ethers.utils.parseEther('10'); + const amount = ethers.parseEther('10'); const destinationNetwork = networkIDRollup; const destinationAddress = deployer.address; @@ -205,12 +205,12 @@ describe('PolygonZkEVMBridge Contract werid metadata', () => { const nameEmpty = 'NOT_VALID_ENCODING'; // bytes32 empty const symbolEmpty = ''; - const metadata = ethers.utils.defaultAbiCoder.encode( + const metadata = ethers.AbiCoder.defaultAbiCoder().encode( ['string', 'string', 'uint8'], [nameEmpty, symbolEmpty, decimalsWeird], ); - const metadataHash = ethers.utils.solidityKeccak256(['bytes'], [metadata]); + const metadataHash = ethers.solidityPackedKeccak256(['bytes'], [metadata]); // pre compute root merkle tree in Js const height = 32; diff --git a/test/contracts/bridge_permit.test.js b/test/contracts/bridge_permit.test.js index e5d4f3f39..e2f817a6a 100644 --- a/test/contracts/bridge_permit.test.js +++ b/test/contracts/bridge_permit.test.js @@ -15,7 +15,7 @@ const { } = require('../../src/permit-helper'); function calculateGlobalExitRoot(mainnetExitRoot, rollupExitRoot) { - return ethers.utils.solidityKeccak256(['bytes32', 'bytes32'], [mainnetExitRoot, rollupExitRoot]); + return ethers.solidityPackedKeccak256(['bytes32', 'bytes32'], [mainnetExitRoot, rollupExitRoot]); } describe('PolygonZkEVMBridge Contract Permit tests', () => { @@ -29,8 +29,8 @@ describe('PolygonZkEVMBridge Contract Permit tests', () => { const tokenName = 'Matic Token'; const tokenSymbol = 'MATIC'; const decimals = 18; - const tokenInitialBalance = ethers.utils.parseEther('20000000'); - const metadataToken = ethers.utils.defaultAbiCoder.encode( + const tokenInitialBalance = ethers.parseEther('20000000'); + const metadataToken = ethers.AbiCoder.defaultAbiCoder().encode( ['string', 'string', 'uint8'], [tokenName, tokenSymbol, decimals], ); @@ -39,7 +39,7 @@ describe('PolygonZkEVMBridge Contract Permit tests', () => { const networkIDRollup = 1; const LEAF_TYPE_ASSET = 0; - const polygonZkEVMAddress = ethers.constants.AddressZero; + const polygonZkEVMAddress = ethers.ZeroAddress; beforeEach('Deploy contracts', async () => { // load signers @@ -71,12 +71,12 @@ describe('PolygonZkEVMBridge Contract Permit tests', () => { const depositCount = await polygonZkEVMBridgeContract.depositCount(); const originNetwork = networkIDMainnet; const tokenAddress = tokenContract.address; - const amount = ethers.utils.parseEther('10'); + const amount = ethers.parseEther('10'); const destinationNetwork = networkIDRollup; const destinationAddress = deployer.address; const metadata = metadataToken; - const metadataHash = ethers.utils.solidityKeccak256(['bytes'], [metadata]); + const metadataHash = ethers.solidityPackedKeccak256(['bytes'], [metadata]); const balanceDeployer = await tokenContract.balanceOf(deployer.address); const balanceBridge = await tokenContract.balanceOf(polygonZkEVMBridgeContract.address); @@ -103,7 +103,7 @@ describe('PolygonZkEVMBridge Contract Permit tests', () => { // user permit const nonce = await tokenContract.nonces(deployer.address); - const deadline = ethers.constants.MaxUint256; + const deadline = ethers.MaxUint256; const { chainId } = await ethers.provider.getNetwork(); const { v, r, s } = await createPermitSignature( @@ -163,20 +163,20 @@ describe('PolygonZkEVMBridge Contract Permit tests', () => { chainId, ); await daiContract.deployed(); - await daiContract.mint(deployer.address, ethers.utils.parseEther('100')); + await daiContract.mint(deployer.address, ethers.parseEther('100')); const depositCount = await polygonZkEVMBridgeContract.depositCount(); const originNetwork = networkIDMainnet; const tokenAddress = daiContract.address; - const amount = ethers.utils.parseEther('10'); + const amount = ethers.parseEther('10'); const destinationNetwork = networkIDRollup; const destinationAddress = deployer.address; - const metadata = ethers.utils.defaultAbiCoder.encode( + const metadata = ethers.AbiCoder.defaultAbiCoder().encode( ['string', 'string', 'uint8'], [await daiContract.name(), await daiContract.symbol(), await daiContract.decimals()], ); - const metadataHash = ethers.utils.solidityKeccak256(['bytes'], [metadata]); + const metadataHash = ethers.solidityPackedKeccak256(['bytes'], [metadata]); const balanceDeployer = await daiContract.balanceOf(deployer.address); const balanceBridge = await daiContract.balanceOf(polygonZkEVMBridgeContract.address); @@ -203,7 +203,7 @@ describe('PolygonZkEVMBridge Contract Permit tests', () => { // user permit const nonce = await daiContract.nonces(deployer.address); - const deadline = ethers.constants.MaxUint256; + const deadline = ethers.MaxUint256; const { v, r, s } = await createPermitSignatureDaiType( daiContract, @@ -262,20 +262,20 @@ describe('PolygonZkEVMBridge Contract Permit tests', () => { (await ethers.provider.getBlock()).timestamp + 1, ); await uniContract.deployed(); - await uniContract.mint(deployer.address, ethers.utils.parseEther('100')); + await uniContract.mint(deployer.address, ethers.parseEther('100')); const depositCount = await polygonZkEVMBridgeContract.depositCount(); const originNetwork = networkIDMainnet; const tokenAddress = uniContract.address; - const amount = ethers.utils.parseEther('10'); + const amount = ethers.parseEther('10'); const destinationNetwork = networkIDRollup; const destinationAddress = deployer.address; - const metadata = ethers.utils.defaultAbiCoder.encode( + const metadata = ethers.AbiCoder.defaultAbiCoder().encode( ['string', 'string', 'uint8'], [await uniContract.name(), await uniContract.symbol(), await uniContract.decimals()], ); - const metadataHash = ethers.utils.solidityKeccak256(['bytes'], [metadata]); + const metadataHash = ethers.solidityPackedKeccak256(['bytes'], [metadata]); const balanceDeployer = await uniContract.balanceOf(deployer.address); const balanceBridge = await uniContract.balanceOf(polygonZkEVMBridgeContract.address); @@ -302,7 +302,7 @@ describe('PolygonZkEVMBridge Contract Permit tests', () => { // user permit const nonce = await uniContract.nonces(deployer.address); - const deadline = ethers.constants.MaxUint256; + const deadline = ethers.MaxUint256; const { chainId } = await ethers.provider.getNetwork(); const { v, r, s } = await createPermitSignatureUniType( diff --git a/test/contracts/depositContractMock.test.js b/test/contracts/depositContractMock.test.js index 35fae5fe6..b40cee38a 100644 --- a/test/contracts/depositContractMock.test.js +++ b/test/contracts/depositContractMock.test.js @@ -21,16 +21,15 @@ describe('Deposit Contract', () => { // deploy deposit contract mock const depositFactory = await ethers.getContractFactory('DepositContractMock'); depositContractMock = await depositFactory.deploy(); - await depositContractMock.deployed(); }); it('should deposit and verify merkle proof', async () => { const originNetwork = 0; const tokenAddress = deployer.address; - const amount = ethers.utils.parseEther('10'); + const amount = ethers.parseEther('10'); const destinationNetwork = 1; const destinationAddress = deployer.address; - const metadataHash = ethers.utils.hexlify(ethers.utils.randomBytes(32)); + const metadataHash = ethers.hexlify(ethers.randomBytes(32)); await depositContractMock.deposit( LEAF_TYPE_ASSET, @@ -90,10 +89,10 @@ describe('Deposit Contract', () => { it('should deposit and verify merkle proof with 2 leafs', async () => { const originNetwork = 0; const tokenAddress = deployer.address; - const amount = ethers.utils.parseEther('10'); + const amount = ethers.parseEther('10'); const destinationNetwork = 1; const destinationAddress = deployer.address; - const metadataHash = ethers.utils.hexlify(ethers.utils.randomBytes(32)); + const metadataHash = ethers.hexlify(ethers.randomBytes(32)); await depositContractMock.deposit( LEAF_TYPE_ASSET, @@ -186,10 +185,10 @@ describe('Deposit Contract', () => { */ let originNetwork = 0; // mainnet let tokenAddress = deployer.address; - let amount = ethers.utils.parseEther('10'); + let amount = ethers.parseEther('10'); let destinationNetwork = 1; let destinationAddress = deployer.address; - let metadataHash = ethers.utils.hexlify(ethers.utils.randomBytes(32)); + let metadataHash = ethers.hexlify(ethers.randomBytes(32)); await depositContractMock.deposit( LEAF_TYPE_ASSET, @@ -253,10 +252,10 @@ describe('Deposit Contract', () => { // Deposit 2 - different address and amount originNetwork = 0; tokenAddress = deployer.address; - amount = ethers.utils.parseEther('1'); + amount = ethers.parseEther('1'); destinationNetwork = 1; destinationAddress = acc2.address; - metadataHash = ethers.utils.hexlify(ethers.utils.randomBytes(32)); + metadataHash = ethers.hexlify(ethers.randomBytes(32)); await depositContractMock.connect(acc2).deposit( LEAF_TYPE_ASSET, @@ -300,11 +299,11 @@ describe('Deposit Contract', () => { // Deposit 3 - deposit ether originNetwork = 0; - tokenAddress = ethers.constants.AddressZero; // ether - amount = ethers.utils.parseEther('100'); + tokenAddress = ethers.ZeroAddress; // ether + amount = ethers.parseEther('100'); destinationNetwork = 1; destinationAddress = acc2.address; - metadataHash = ethers.utils.hexlify(ethers.utils.randomBytes(32)); + metadataHash = ethers.hexlify(ethers.randomBytes(32)); await depositContractMock.connect(acc2).deposit( LEAF_TYPE_ASSET, @@ -349,7 +348,7 @@ describe('Deposit Contract', () => { // Deposit lots of transactions const txCount = 100; const depositCount = Number(await depositContractMock.depositCount()); - amount = ethers.utils.parseEther('0.01'); + amount = ethers.parseEther('0.01'); leafValue = getLeafValue( LEAF_TYPE_ASSET, originNetwork, diff --git a/test/contracts/emergencyManager.test.js b/test/contracts/emergencyManager.test.js index 196e60519..5daeb7b71 100644 --- a/test/contracts/emergencyManager.test.js +++ b/test/contracts/emergencyManager.test.js @@ -15,7 +15,7 @@ describe('Emergency mode test', () => { const maticTokenName = 'Matic Token'; const maticTokenSymbol = 'MATIC'; - const maticTokenInitialBalance = ethers.utils.parseEther('20000000'); + const maticTokenInitialBalance = ethers.parseEther('20000000'); const genesisRoot = '0x0000000000000000000000000000000000000000000000000000000000000001'; @@ -62,8 +62,8 @@ describe('Emergency mode test', () => { const nonceProxyBridge = Number((await ethers.provider.getTransactionCount(deployer.address))) + (firstDeployment ? 3 : 2); const nonceProxyZkevm = nonceProxyBridge + 2; // Always have to redeploy impl since the polygonZkEVMGlobalExitRoot address changes - const precalculateBridgeAddress = ethers.utils.getContractAddress({ from: deployer.address, nonce: nonceProxyBridge }); - const precalculateZkevmAddress = ethers.utils.getContractAddress({ from: deployer.address, nonce: nonceProxyZkevm }); + const precalculateBridgeAddress = ethers.getContractAddress({ from: deployer.address, nonce: nonceProxyBridge }); + const precalculateZkevmAddress = ethers.getContractAddress({ from: deployer.address, nonce: nonceProxyZkevm }); firstDeployment = false; const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory('PolygonZkEVMGlobalExitRoot'); @@ -111,7 +111,7 @@ describe('Emergency mode test', () => { ); // fund sequencer address with Matic tokens - await maticTokenContract.transfer(trustedSequencer.address, ethers.utils.parseEther('1000')); + await maticTokenContract.transfer(trustedSequencer.address, ethers.parseEther('1000')); // Activate force batches await expect( @@ -148,7 +148,7 @@ describe('Emergency mode test', () => { const sequence = { transactions: l2txData, - globalExitRoot: ethers.constants.HashZero, + globalExitRoot: ethers.HashZero, timestamp: ethers.BigNumber.from(currentTimestamp), minForcedTimestamp: 0, }; @@ -173,7 +173,7 @@ describe('Emergency mode test', () => { const newLocalExitRoot = '0x0000000000000000000000000000000000000000000000000000000000000001'; const newStateRoot = '0x0000000000000000000000000000000000000000000000000000000000000001'; const numBatch = (await polygonZkEVMContract.lastVerifiedBatch()).toNumber() + 1; - const zkProofFFlonk = new Array(24).fill(ethers.constants.HashZero); + const zkProofFFlonk = new Array(24).fill(ethers.HashZero); const pendingStateNum = 0; await expect( @@ -188,8 +188,8 @@ describe('Emergency mode test', () => { ).to.be.revertedWith('OnlyNotEmergencyState'); // Check PolygonZkEVMBridge no PolygonZkEVMBridge is in emergency state also - const tokenAddress = ethers.constants.AddressZero; - const amount = ethers.utils.parseEther('10'); + const tokenAddress = ethers.ZeroAddress; + const amount = ethers.parseEther('10'); const destinationNetwork = 1; const destinationAddress = deployer.address; @@ -209,9 +209,9 @@ describe('Emergency mode test', () => { '0x', )).to.be.revertedWith('OnlyNotEmergencyState'); - const proof = Array(32).fill(ethers.constants.HashZero); + const proof = Array(32).fill(ethers.HashZero); const index = 0; - const root = ethers.constants.HashZero; + const root = ethers.HashZero; await expect(polygonZkEVMBridgeContract.claimAsset( proof, diff --git a/test/contracts/globalExitRootManager.test.js b/test/contracts/globalExitRootManager.test.js index 78ff7a6aa..17f5bc2a7 100644 --- a/test/contracts/globalExitRootManager.test.js +++ b/test/contracts/globalExitRootManager.test.js @@ -2,7 +2,7 @@ const { expect } = require('chai'); const { ethers } = require('hardhat'); function calculateGlobalExitRoot(mainnetExitRoot, rollupExitRoot) { - return ethers.utils.solidityKeccak256(['bytes32', 'bytes32'], [mainnetExitRoot, rollupExitRoot]); + return ethers.solidityPackedKeccak256(['bytes32', 'bytes32'], [mainnetExitRoot, rollupExitRoot]); } const zero32bytes = '0x0000000000000000000000000000000000000000000000000000000000000000'; @@ -33,7 +33,7 @@ describe('Global Exit Root', () => { }); it('should update root and check global exit root', async () => { - const newRootRollup = ethers.utils.hexlify(ethers.utils.randomBytes(32)); + const newRootRollup = ethers.hexlify(ethers.randomBytes(32)); await expect(polygonZkEVMGlobalExitRoot.updateExitRoot(newRootRollup)) .to.be.revertedWith('OnlyAllowedContracts'); @@ -47,7 +47,7 @@ describe('Global Exit Root', () => { .to.be.equal(calculateGlobalExitRoot(zero32bytes, newRootRollup)); // Update root from the PolygonZkEVMBridge - const newRootBridge = ethers.utils.hexlify(ethers.utils.randomBytes(32)); + const newRootBridge = ethers.hexlify(ethers.randomBytes(32)); await expect(polygonZkEVMGlobalExitRoot.connect(PolygonZkEVMBridge).updateExitRoot(newRootBridge)) .to.emit(polygonZkEVMGlobalExitRoot, 'UpdateGlobalExitRoot') .withArgs(newRootBridge, newRootRollup); diff --git a/test/contracts/globalExitRootManagerL2.test.js b/test/contracts/globalExitRootManagerL2.test.js index 69bbc7f59..3900968e9 100644 --- a/test/contracts/globalExitRootManagerL2.test.js +++ b/test/contracts/globalExitRootManagerL2.test.js @@ -23,7 +23,7 @@ describe('Global Exit Root L2', () => { }); it('should update root and check global exit root', async () => { - const newRootRollup = ethers.utils.hexlify(ethers.utils.randomBytes(32)); + const newRootRollup = ethers.hexlify(ethers.randomBytes(32)); await expect(polygonZkEVMGlobalExitRoot.updateExitRoot(newRootRollup)) .to.be.revertedWith('OnlyAllowedContracts'); @@ -36,18 +36,18 @@ describe('Global Exit Root L2', () => { it('should update root and check the storage position matches', async () => { // Check global exit root - const newRoot = ethers.utils.hexlify(ethers.utils.randomBytes(32)); + const newRoot = ethers.hexlify(ethers.randomBytes(32)); const blockNumber = 1; await polygonZkEVMGlobalExitRoot.setLastGlobalExitRoot(newRoot, blockNumber); expect(await polygonZkEVMGlobalExitRoot.globalExitRootMap(newRoot)).to.be.equal(blockNumber); const mapStoragePosition = 0; const key = newRoot; - const storagePosition = ethers.utils.solidityKeccak256(['uint256', 'uint256'], [key, mapStoragePosition]); + const storagePosition = ethers.solidityPackedKeccak256(['uint256', 'uint256'], [key, mapStoragePosition]); const storageValue = await ethers.provider.getStorageAt(polygonZkEVMGlobalExitRoot.address, storagePosition); expect(blockNumber).to.be.equal(ethers.BigNumber.from(storageValue).toNumber()); // Check rollup exit root - const newRootRollupExitRoot = ethers.utils.hexlify(ethers.utils.randomBytes(32)); + const newRootRollupExitRoot = ethers.hexlify(ethers.randomBytes(32)); await polygonZkEVMGlobalExitRoot.setExitRoot(newRootRollupExitRoot); expect(await polygonZkEVMGlobalExitRoot.lastRollupExitRoot()).to.be.equal(newRootRollupExitRoot); diff --git a/test/contracts/polygonZkEVM.test.js b/test/contracts/polygonZkEVM.test.js index 764701fb8..4d3855225 100644 --- a/test/contracts/polygonZkEVM.test.js +++ b/test/contracts/polygonZkEVM.test.js @@ -21,7 +21,7 @@ describe('Polygon ZK-EVM', () => { const maticTokenName = 'Matic Token'; const maticTokenSymbol = 'MATIC'; - const maticTokenInitialBalance = ethers.utils.parseEther('20000000'); + const maticTokenInitialBalance = ethers.parseEther('20000000'); const genesisRoot = '0x0000000000000000000000000000000000000000000000000000000000000001'; @@ -73,8 +73,8 @@ describe('Polygon ZK-EVM', () => { const nonceProxyBridge = Number((await ethers.provider.getTransactionCount(deployer.address))) + (firstDeployment ? 3 : 2); const nonceProxyZkevm = nonceProxyBridge + 2; // Always have to redeploy impl since the polygonZkEVMGlobalExitRoot address changes - const precalculateBridgeAddress = ethers.utils.getContractAddress({ from: deployer.address, nonce: nonceProxyBridge }); - const precalculateZkevmAddress = ethers.utils.getContractAddress({ from: deployer.address, nonce: nonceProxyZkevm }); + const precalculateBridgeAddress = ethers.getContractAddress({ from: deployer.address, nonce: nonceProxyBridge }); + const precalculateZkevmAddress = ethers.getContractAddress({ from: deployer.address, nonce: nonceProxyZkevm }); firstDeployment = false; const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory('PolygonZkEVMGlobalExitRoot'); @@ -122,7 +122,7 @@ describe('Polygon ZK-EVM', () => { ); // fund sequencer address with Matic tokens - await maticTokenContract.transfer(trustedSequencer.address, ethers.utils.parseEther('1000')); + await maticTokenContract.transfer(trustedSequencer.address, ethers.parseEther('1000')); }); it('should check the constructor parameters', async () => { @@ -143,9 +143,9 @@ describe('Polygon ZK-EVM', () => { expect(await polygonZkEVMContract.trustedSequencerURL()).to.be.equal(urlSequencer); expect(await polygonZkEVMContract.networkName()).to.be.equal(networkName); - expect(await polygonZkEVMContract.batchFee()).to.be.equal(ethers.utils.parseEther('0.1')); - expect(await polygonZkEVMContract.batchFee()).to.be.equal(ethers.utils.parseEther('0.1')); - expect(await polygonZkEVMContract.getForcedBatchFee()).to.be.equal(ethers.utils.parseEther('10')); + expect(await polygonZkEVMContract.batchFee()).to.be.equal(ethers.parseEther('0.1')); + expect(await polygonZkEVMContract.batchFee()).to.be.equal(ethers.parseEther('0.1')); + expect(await polygonZkEVMContract.getForcedBatchFee()).to.be.equal(ethers.parseEther('10')); expect(await polygonZkEVMContract.forceBatchTimeout()).to.be.equal(FORCE_BATCH_TIMEOUT); expect(await polygonZkEVMContract.isForcedBatchDisallowed()).to.be.equal(true); @@ -334,7 +334,7 @@ describe('Polygon ZK-EVM', () => { // Transfer admin role // First set pending Admin - expect(await polygonZkEVMContract.pendingAdmin()).to.be.equal(ethers.constants.AddressZero); + expect(await polygonZkEVMContract.pendingAdmin()).to.be.equal(ethers.ZeroAddress); await expect(polygonZkEVMContract.transferAdminRole(deployer.address)) .to.be.revertedWith('OnlyAdmin'); @@ -393,7 +393,7 @@ describe('Polygon ZK-EVM', () => { const sequence = { transactions: l2txData, - globalExitRoot: ethers.constants.HashZero, + globalExitRoot: ethers.HashZero, timestamp: ethers.BigNumber.from(currentTimestamp), minForcedTimestamp: 0, }; @@ -421,10 +421,10 @@ describe('Polygon ZK-EVM', () => { await expect(polygonZkEVMContract.connect(trustedSequencer).sequenceBatches([], trustedSequencer.address)) .to.be.revertedWith('SequenceZeroBatches'); - sequence.globalExitRoot = ethers.constants.MaxUint256; + sequence.globalExitRoot = ethers.MaxUint256; await expect(polygonZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address)) .to.be.revertedWith('GlobalExitRootNotExist'); - sequence.globalExitRoot = ethers.constants.HashZero; + sequence.globalExitRoot = ethers.HashZero; // Sequence batch await expect(polygonZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence], deployer.address)) @@ -464,14 +464,14 @@ describe('Polygon ZK-EVM', () => { const sequence = { transactions: l2txData, - globalExitRoot: ethers.constants.HashZero, + globalExitRoot: ethers.HashZero, timestamp: currentTimestamp, minForcedTimestamp: 0, }; const sequence2 = { transactions: l2txData, - globalExitRoot: ethers.constants.HashZero, + globalExitRoot: ethers.HashZero, timestamp: currentTimestamp, minForcedTimestamp: 0, }; @@ -505,14 +505,14 @@ describe('Polygon ZK-EVM', () => { const batchAccInputHash = sequencedBatchData.accInputHash; // Only last batch is added to the mapping - expect(batchAccInputHash).to.be.equal(ethers.constants.HashZero); + expect(batchAccInputHash).to.be.equal(ethers.HashZero); const sequencedBatchData2 = await polygonZkEVMContract.sequencedBatches(2); const batchAccInputHash2 = sequencedBatchData2.accInputHash; // Calcultate input Hahs for batch 1 let batchAccInputHashJs = calculateAccInputHash( - ethers.constants.HashZero, + ethers.HashZero, calculateBatchHashData(sequence.transactions), sequence.globalExitRoot, sequence.timestamp, @@ -541,7 +541,7 @@ describe('Polygon ZK-EVM', () => { await sendDataContract.deployed(); // transfer matic - await maticTokenContract.transfer(sendDataContract.address, ethers.utils.parseEther('1000')); + await maticTokenContract.transfer(sendDataContract.address, ethers.parseEther('1000')); // Approve matic const approveTx = await maticTokenContract.populateTransaction.approve(polygonZkEVMContract.address, maticAmount); @@ -597,7 +597,7 @@ describe('Polygon ZK-EVM', () => { const sequence2 = { transactions: l2txData, - globalExitRoot: ethers.constants.HashZero, + globalExitRoot: ethers.HashZero, timestamp: currentTimestamp, minForcedTimestamp: 0, }; @@ -652,14 +652,14 @@ describe('Polygon ZK-EVM', () => { // Check batch mapping const batchAccInputHash = (await polygonZkEVMContract.sequencedBatches(1)).accInputHash; // Only last batch is added to the mapping - expect(batchAccInputHash).to.be.equal(ethers.constants.HashZero); + expect(batchAccInputHash).to.be.equal(ethers.HashZero); /* * Check batch mapping * Calcultate input Hahs for batch 1 */ let batchAccInputHashJs = calculateAccInputHash( - ethers.constants.HashZero, + ethers.HashZero, calculateBatchHashData(sequence.transactions), sequence.globalExitRoot, sequence.timestamp, @@ -686,14 +686,14 @@ describe('Polygon ZK-EVM', () => { const sequence = { transactions: l2txData, - globalExitRoot: ethers.constants.HashZero, + globalExitRoot: ethers.HashZero, timestamp: 0, minForcedTimestamp: 0, }; const sequence2 = { transactions: l2txData, - globalExitRoot: ethers.constants.HashZero, + globalExitRoot: ethers.HashZero, timestamp: 0, minForcedTimestamp: 0, }; @@ -792,7 +792,7 @@ describe('Polygon ZK-EVM', () => { const batchHash = await polygonZkEVMContract.forcedBatches(1); const timestampForceBatch = (await ethers.provider.getBlock()).timestamp; - const batchHashJs = ethers.utils.solidityKeccak256( + const batchHashJs = ethers.solidityPackedKeccak256( ['bytes32', 'bytes32', 'uint64'], [ calculateBatchHashData(l2txData), @@ -827,7 +827,7 @@ describe('Polygon ZK-EVM', () => { const forceBatchHash = await polygonZkEVMContract.forcedBatches(1); - const batchHashJs = ethers.utils.solidityKeccak256( + const batchHashJs = ethers.solidityPackedKeccak256( ['bytes32', 'bytes32', 'uint64'], [ calculateBatchHashData(l2txData), @@ -871,7 +871,7 @@ describe('Polygon ZK-EVM', () => { .to.be.revertedWith('ForcedDataDoesNotMatch'); forceBatchStructBad.minForcedTimestamp -= 1; - forceBatchStructBad.globalExitRoot = ethers.constants.HashZero; + forceBatchStructBad.globalExitRoot = ethers.HashZero; await expect(polygonZkEVMContract.sequenceForceBatches([forceBatchStructBad])) .to.be.revertedWith('ForcedDataDoesNotMatch'); forceBatchStructBad.globalExitRoot = lastGlobalExitRoot; @@ -899,7 +899,7 @@ describe('Polygon ZK-EVM', () => { const batchAccInputHash = (await polygonZkEVMContract.sequencedBatches(1)).accInputHash; const batchAccInputHashJs = calculateAccInputHash( - ethers.constants.HashZero, + ethers.HashZero, calculateBatchHashData(l2txData), lastGlobalExitRoot, timestampSequenceBatch, @@ -915,7 +915,7 @@ describe('Polygon ZK-EVM', () => { const sequence = { transactions: l2txData, - globalExitRoot: ethers.constants.HashZero, + globalExitRoot: ethers.HashZero, timestamp: currentTimestamp, minForcedTimestamp: 0, }; @@ -936,7 +936,7 @@ describe('Polygon ZK-EVM', () => { const newLocalExitRoot = '0x0000000000000000000000000000000000000000000000000000000000000000'; const newStateRoot = '0x0000000000000000000000000000000000000000000000000000000000000000'; const numBatch = (await polygonZkEVMContract.lastVerifiedBatch()) + 1; - const zkProofFFlonk = new Array(24).fill(ethers.constants.HashZero); + const zkProofFFlonk = new Array(24).fill(ethers.HashZero); const initialAggregatorMatic = await maticTokenContract.balanceOf( trustedAggregator.address, @@ -1035,7 +1035,7 @@ describe('Polygon ZK-EVM', () => { const newLocalExitRoot = '0x0000000000000000000000000000000000000000000000000000000000000000'; const newStateRoot = '0x0000000000000000000000000000000000000000000000000000000000000000'; const numBatch = (await polygonZkEVMContract.lastVerifiedBatch()) + 1; - const zkProofFFlonk = new Array(24).fill(ethers.constants.HashZero); + const zkProofFFlonk = new Array(24).fill(ethers.HashZero); const initialAggregatorMatic = await maticTokenContract.balanceOf( trustedAggregator.address, @@ -1072,7 +1072,7 @@ describe('Polygon ZK-EVM', () => { const sequence = { transactions: l2txData, - globalExitRoot: ethers.constants.HashZero, + globalExitRoot: ethers.HashZero, timestamp: currentTimestamp, minForcedTimestamp: 0, }; @@ -1222,7 +1222,7 @@ describe('Polygon ZK-EVM', () => { const sequence = { transactions: l2txData, - globalExitRoot: ethers.constants.HashZero, + globalExitRoot: ethers.HashZero, timestamp: currentTimestamp, minForcedTimestamp: 0, }; @@ -1243,7 +1243,7 @@ describe('Polygon ZK-EVM', () => { const newLocalExitRoot = '0x0000000000000000000000000000000000000000000000000000000000000001'; const newStateRoot = '0x0000000000000000000000000000000000000000000000000000000000000002'; const numBatch = (await polygonZkEVMContract.lastVerifiedBatch()) + 1; - const zkProofFFlonk = new Array(24).fill(ethers.constants.HashZero); + const zkProofFFlonk = new Array(24).fill(ethers.HashZero); const initialAggregatorMatic = await maticTokenContract.balanceOf( aggregator1.address, @@ -1381,7 +1381,7 @@ describe('Polygon ZK-EVM', () => { const batchesForSequence = 5; const sequence = { transactions: l2txData, - globalExitRoot: ethers.constants.HashZero, + globalExitRoot: ethers.HashZero, timestamp: currentTimestamp, minForcedTimestamp: 0, }; @@ -1403,7 +1403,7 @@ describe('Polygon ZK-EVM', () => { // Forge first sequence with verifyBAtches const newLocalExitRoot = '0x0000000000000000000000000000000000000000000000000000000000000001'; const newStateRoot = '0x0000000000000000000000000000000000000000000000000000000000000002'; - const zkProofFFlonk = new Array(24).fill(ethers.constants.HashZero); + const zkProofFFlonk = new Array(24).fill(ethers.HashZero); let currentPendingState = 0; let currentNumBatch = 0; @@ -1505,7 +1505,7 @@ describe('Polygon ZK-EVM', () => { ).to.be.revertedWith('PendingStateDoesNotExist'); // Since this pending state was not consolidated, the currentNumBatch does not have stored root - expect(ethers.constants.HashZero).to.be.equal(await polygonZkEVMContract.batchNumToStateRoot(currentNumBatch)); + expect(ethers.HashZero).to.be.equal(await polygonZkEVMContract.batchNumToStateRoot(currentNumBatch)); await expect( polygonZkEVMContract.connect(trustedAggregator).verifyBatchesTrustedAggregator( currentPendingState, @@ -1759,7 +1759,7 @@ describe('Polygon ZK-EVM', () => { const sequence = { transactions: l2txData, - globalExitRoot: ethers.constants.HashZero, + globalExitRoot: ethers.HashZero, timestamp: ethers.BigNumber.from(currentTimestamp), minForcedTimestamp: 0, }; @@ -1808,7 +1808,7 @@ describe('Polygon ZK-EVM', () => { const batchesForSequence = 5; const sequence = { transactions: l2txData, - globalExitRoot: ethers.constants.HashZero, + globalExitRoot: ethers.HashZero, timestamp: currentTimestamp, minForcedTimestamp: 0, }; @@ -1830,7 +1830,7 @@ describe('Polygon ZK-EVM', () => { // Forge first sequence with verifyBAtches const newLocalExitRoot = '0x0000000000000000000000000000000000000000000000000000000000000001'; const newStateRoot = '0x0000000000000000000000000000000000000000000000000000000000000002'; - const zkProofFFlonk = new Array(24).fill(ethers.constants.HashZero); + const zkProofFFlonk = new Array(24).fill(ethers.HashZero); let currentPendingState = 0; let currentNumBatch = 0; @@ -2000,7 +2000,7 @@ describe('Polygon ZK-EVM', () => { }); it('Test batch fees properly', async () => { - const accInputData = ethers.constants.HashZero; + const accInputData = ethers.HashZero; const verifyBatchTimeTarget = Number(await polygonZkEVMContract.verifyBatchTimeTarget()); const currentTimestamp = (await ethers.provider.getBlock()).timestamp; @@ -2024,7 +2024,7 @@ describe('Polygon ZK-EVM', () => { // Assert currentFee let currentBatchFee = await polygonZkEVMContract.batchFee(); - expect(currentBatchFee).to.be.equal(ethers.utils.parseEther('0.1')); + expect(currentBatchFee).to.be.equal(ethers.parseEther('0.1')); await ethers.provider.send('evm_setNextBlockTimestamp', [currentTimestamp + verifyBatchTimeTarget * 2]); diff --git a/test/contracts/polygonZkEVMDeployer.test.js b/test/contracts/polygonZkEVMDeployer.test.js index c3c3ef352..8ea86847a 100644 --- a/test/contracts/polygonZkEVMDeployer.test.js +++ b/test/contracts/polygonZkEVMDeployer.test.js @@ -9,7 +9,7 @@ describe('Polygon ZK-EVM Deployer', () => { const maticTokenName = 'Matic Token'; const maticTokenSymbol = 'MATIC'; - const maticTokenInitialBalance = ethers.utils.parseEther('20000000'); + const maticTokenInitialBalance = ethers.parseEther('20000000'); beforeEach('Deploy contract', async () => { upgrades.silenceWarnings(); @@ -34,7 +34,7 @@ describe('Polygon ZK-EVM Deployer', () => { 'ERC20PresetFixedSupply', ); - const salt = ethers.constants.HashZero; + const salt = ethers.HashZero; // Encode deploy transaction const deployTransactionERC20 = (OZERC20PresetFactory.getDeployTransaction( @@ -43,10 +43,10 @@ describe('Polygon ZK-EVM Deployer', () => { maticTokenInitialBalance, owner.address, )).data; - const hashInitCode = ethers.utils.solidityKeccak256(['bytes'], [deployTransactionERC20]); + const hashInitCode = ethers.solidityPackedKeccak256(['bytes'], [deployTransactionERC20]); // Precalculate create2 address - const precalculateTokenDeployed = await ethers.utils.getCreate2Address(polgonZKEVMDeployerContract.address, salt, hashInitCode); + const precalculateTokenDeployed = await ethers.getCreate2Address(polgonZKEVMDeployerContract.address, salt, hashInitCode); expect(await polgonZKEVMDeployerContract.predictDeterministicAddress( salt, hashInitCode, @@ -66,7 +66,7 @@ describe('Polygon ZK-EVM Deployer', () => { deployTransactionERC20, )).to.emit(polgonZKEVMDeployerContract, 'NewDeterministicDeployment').withArgs(precalculateTokenDeployed); - const dataCall = OZERC20PresetFactory.interface.encodeFunctionData('transfer', [owner.address, ethers.utils.parseEther('1')]); + const dataCall = OZERC20PresetFactory.interface.encodeFunctionData('transfer', [owner.address, ethers.parseEther('1')]); // Check deployed contract const instanceToken = OZERC20PresetFactory.attach(precalculateTokenDeployed); expect(await instanceToken.balanceOf(owner.address)).to.be.equal(maticTokenInitialBalance); @@ -97,7 +97,7 @@ describe('Polygon ZK-EVM Deployer', () => { )).to.be.revertedWith('ERC20: transfer amount exceeds balance'); // Transfer tokens first - await instanceToken.connect(owner).transfer(polgonZKEVMDeployerContract.address, ethers.utils.parseEther('1')); + await instanceToken.connect(owner).transfer(polgonZKEVMDeployerContract.address, ethers.parseEther('1')); await expect(polgonZKEVMDeployerContract.connect(owner).functionCall( precalculateTokenDeployed, dataCall, @@ -110,7 +110,7 @@ describe('Polygon ZK-EVM Deployer', () => { 'ERC20PresetFixedSupply', ); - const salt = ethers.constants.HashZero; + const salt = ethers.HashZero; // Encode deploy transaction const deployTransactionERC20 = (OZERC20PresetFactory.getDeployTransaction( @@ -120,14 +120,14 @@ describe('Polygon ZK-EVM Deployer', () => { polgonZKEVMDeployerContract.address, )).data; - const hashInitCode = ethers.utils.solidityKeccak256(['bytes'], [deployTransactionERC20]); + const hashInitCode = ethers.solidityPackedKeccak256(['bytes'], [deployTransactionERC20]); // Precalculate create2 address - const precalculateTokenDeployed = await ethers.utils.getCreate2Address(polgonZKEVMDeployerContract.address, salt, hashInitCode); - const dataCall = OZERC20PresetFactory.interface.encodeFunctionData('transfer', [owner.address, ethers.utils.parseEther('1')]); + const precalculateTokenDeployed = await ethers.getCreate2Address(polgonZKEVMDeployerContract.address, salt, hashInitCode); + const dataCall = OZERC20PresetFactory.interface.encodeFunctionData('transfer', [owner.address, ethers.parseEther('1')]); const amount = 0; - const dataCallFail = OZERC20PresetFactory.interface.encodeFunctionData('transfer', [owner.address, ethers.utils.parseEther('20000001')]); + const dataCallFail = OZERC20PresetFactory.interface.encodeFunctionData('transfer', [owner.address, ethers.parseEther('20000001')]); // Cannot fails internal call, contract not deployed await expect(polgonZKEVMDeployerContract.connect(owner).deployDeterministicAndCall( @@ -146,7 +146,7 @@ describe('Polygon ZK-EVM Deployer', () => { )).to.emit(polgonZKEVMDeployerContract, 'NewDeterministicDeployment').withArgs(precalculateTokenDeployed); const instanceToken = OZERC20PresetFactory.attach(precalculateTokenDeployed); - expect(await instanceToken.balanceOf(owner.address)).to.be.equal(ethers.utils.parseEther('1')); + expect(await instanceToken.balanceOf(owner.address)).to.be.equal(ethers.parseEther('1')); // Cannot create 2 times the same contract await expect(polgonZKEVMDeployerContract.connect(owner).deployDeterministicAndCall( @@ -167,7 +167,7 @@ describe('Polygon ZK-EVM Deployer', () => { )).data; const gasLimit = ethers.BigNumber.from(1000000); // Put 1 Million, aprox 650k are necessary - const gasPrice = ethers.BigNumber.from(ethers.utils.parseUnits('100', 'gwei')); // just in case to be able to use always the transaction + const gasPrice = ethers.BigNumber.from(ethers.parseUnits('100', 'gwei')); // just in case to be able to use always the transaction const to = '0x'; // deployment transaction, to is 0 const tx = { to, @@ -183,8 +183,8 @@ describe('Polygon ZK-EVM Deployer', () => { r: '0x247000', // Equals 0x0000000000000000000000000000000000000000000000000000000000247000 s: '0x2470', // Equals 0x0000000000000000000000000000000000000000000000000000000000002470 }; - const serializedTransaction = ethers.utils.serializeTransaction(tx, signature); - const resultTransaction = ethers.utils.parseTransaction(serializedTransaction); + const serializedTransaction = ethers.serializeTransaction(tx, signature); + const resultTransaction = ethers.parseTransaction(serializedTransaction); const totalEther = gasLimit.mul(gasPrice); // 0.1 ether // Fund keyless deployment @@ -192,7 +192,7 @@ describe('Polygon ZK-EVM Deployer', () => { to: resultTransaction.from, value: totalEther.toHexString(), }; - const zkEVMDeployerAddress = ethers.utils.getContractAddress(resultTransaction); + const zkEVMDeployerAddress = ethers.getContractAddress(resultTransaction); await deployer.sendTransaction(params); await ethers.provider.sendTransaction(serializedTransaction); @@ -205,14 +205,14 @@ describe('Polygon ZK-EVM Deployer', () => { 'PolygonZkEVMBridge', ); - const salt = ethers.constants.HashZero; + const salt = ethers.HashZero; // Encode deploy transaction const deployTransactionBridge = (bridgeFactory.getDeployTransaction()).data; - const hashInitCode = ethers.utils.solidityKeccak256(['bytes'], [deployTransactionBridge]); + const hashInitCode = ethers.solidityPackedKeccak256(['bytes'], [deployTransactionBridge]); // Precalculate create2 address - const precalculateTokenDeployed = await ethers.utils.getCreate2Address(polgonZKEVMDeployerContract.address, salt, hashInitCode); + const precalculateTokenDeployed = await ethers.getCreate2Address(polgonZKEVMDeployerContract.address, salt, hashInitCode); expect(await polgonZKEVMDeployerContract.predictDeterministicAddress( salt, hashInitCode, diff --git a/test/contracts/polygonZkEVMTestnetV2.test.js b/test/contracts/polygonZkEVMTestnetV2.test.js index 508da7981..63704e7d5 100644 --- a/test/contracts/polygonZkEVMTestnetV2.test.js +++ b/test/contracts/polygonZkEVMTestnetV2.test.js @@ -16,7 +16,7 @@ describe('Polygon ZK-EVM TestnetV2', () => { const maticTokenName = 'Matic Token'; const maticTokenSymbol = 'MATIC'; - const maticTokenInitialBalance = ethers.utils.parseEther('20000000'); + const maticTokenInitialBalance = ethers.parseEther('20000000'); const genesisRoot = '0x0000000000000000000000000000000000000000000000000000000000000001'; @@ -63,8 +63,8 @@ describe('Polygon ZK-EVM TestnetV2', () => { const nonceProxyBridge = Number((await ethers.provider.getTransactionCount(deployer.address))) + (firstDeployment ? 3 : 2); const nonceProxyZkevm = nonceProxyBridge + 2; // Always have to redeploy impl since the polygonZkEVMGlobalExitRoot address changes - const precalculateBridgeAddress = ethers.utils.getContractAddress({ from: deployer.address, nonce: nonceProxyBridge }); - const precalculateZkevmAddress = ethers.utils.getContractAddress({ from: deployer.address, nonce: nonceProxyZkevm }); + const precalculateBridgeAddress = ethers.getContractAddress({ from: deployer.address, nonce: nonceProxyBridge }); + const precalculateZkevmAddress = ethers.getContractAddress({ from: deployer.address, nonce: nonceProxyZkevm }); firstDeployment = false; const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory('PolygonZkEVMGlobalExitRoot'); @@ -112,7 +112,7 @@ describe('Polygon ZK-EVM TestnetV2', () => { ); // fund sequencer address with Matic tokens - await maticTokenContract.transfer(trustedSequencer.address, ethers.utils.parseEther('1000')); + await maticTokenContract.transfer(trustedSequencer.address, ethers.parseEther('1000')); }); it('should check the constructor parameters', async () => { diff --git a/test/contracts/polygonZkEVMUpgraded.test.js b/test/contracts/polygonZkEVMUpgraded.test.js index 2bd8f4311..1f962beb0 100644 --- a/test/contracts/polygonZkEVMUpgraded.test.js +++ b/test/contracts/polygonZkEVMUpgraded.test.js @@ -17,7 +17,7 @@ describe('PolygonZkEVMUpgraded', () => { const maticTokenName = 'Matic Token'; const maticTokenSymbol = 'MATIC'; - const maticTokenInitialBalance = ethers.utils.parseEther('20000000'); + const maticTokenInitialBalance = ethers.parseEther('20000000'); const genesisRoot = '0x0000000000000000000000000000000000000000000000000000000000000001'; @@ -68,8 +68,8 @@ describe('PolygonZkEVMUpgraded', () => { const nonceProxyBridge = Number((await ethers.provider.getTransactionCount(deployer.address))) + (firstDeployment ? 3 : 2); const nonceProxyZkevm = nonceProxyBridge + 2; // Always have to redeploy impl since the polygonZkEVMGlobalExitRoot address changes - const precalculateBridgeAddress = ethers.utils.getContractAddress({ from: deployer.address, nonce: nonceProxyBridge }); - const precalculateZkevmAddress = ethers.utils.getContractAddress({ from: deployer.address, nonce: nonceProxyZkevm }); + const precalculateBridgeAddress = ethers.getContractAddress({ from: deployer.address, nonce: nonceProxyBridge }); + const precalculateZkevmAddress = ethers.getContractAddress({ from: deployer.address, nonce: nonceProxyZkevm }); firstDeployment = false; const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory('PolygonZkEVMGlobalExitRoot'); @@ -118,7 +118,7 @@ describe('PolygonZkEVMUpgraded', () => { ); // fund sequencer address with Matic tokens - await maticTokenContract.transfer(trustedSequencer.address, ethers.utils.parseEther('1000')); + await maticTokenContract.transfer(trustedSequencer.address, ethers.parseEther('1000')); }); it('should check the constructor parameters', async () => { @@ -221,9 +221,9 @@ describe('PolygonZkEVMUpgraded', () => { expect(await polygonZkEVMContract.trustedSequencerURL()).to.be.equal(urlSequencer); expect(await polygonZkEVMContract.networkName()).to.be.equal(networkName); - expect(await polygonZkEVMContract.batchFee()).to.be.equal(ethers.utils.parseEther('0.1')); - expect(await polygonZkEVMContract.batchFee()).to.be.equal(ethers.utils.parseEther('0.1')); - expect(await polygonZkEVMContract.getForcedBatchFee()).to.be.equal(ethers.utils.parseEther('10')); + expect(await polygonZkEVMContract.batchFee()).to.be.equal(ethers.parseEther('0.1')); + expect(await polygonZkEVMContract.batchFee()).to.be.equal(ethers.parseEther('0.1')); + expect(await polygonZkEVMContract.getForcedBatchFee()).to.be.equal(ethers.parseEther('10')); expect(await polygonZkEVMContract.forceBatchTimeout()).to.be.equal(FORCE_BATCH_TIMEOUT); expect(await polygonZkEVMContract.isForcedBatchDisallowed()).to.be.equal(true); @@ -236,7 +236,7 @@ describe('PolygonZkEVMUpgraded', () => { const batchesForSequence = 5; const sequence = { transactions: l2txData, - globalExitRoot: ethers.constants.HashZero, + globalExitRoot: ethers.HashZero, timestamp: currentTimestamp, minForcedTimestamp: 0, }; @@ -258,7 +258,7 @@ describe('PolygonZkEVMUpgraded', () => { // Forge first sequence with verifyBAtches const newLocalExitRoot = '0x0000000000000000000000000000000000000000000000000000000000000001'; const newStateRoot = '0x0000000000000000000000000000000000000000000000000000000000000002'; - const zkProofFFlonk = new Array(24).fill(ethers.constants.HashZero); + const zkProofFFlonk = new Array(24).fill(ethers.HashZero); let currentPendingState = 0; let currentNumBatch = 0; @@ -434,7 +434,7 @@ describe('PolygonZkEVMUpgraded', () => { const batchesForSequence = 5; const sequence = { transactions: l2txData, - globalExitRoot: ethers.constants.HashZero, + globalExitRoot: ethers.HashZero, timestamp: currentTimestamp, minForcedTimestamp: 0, }; @@ -456,7 +456,7 @@ describe('PolygonZkEVMUpgraded', () => { // Forge first sequence with verifyBAtches const newLocalExitRoot = '0x0000000000000000000000000000000000000000000000000000000000000001'; const newStateRoot = '0x0000000000000000000000000000000000000000000000000000000000000002'; - const zkProofFFlonk = new Array(24).fill(ethers.constants.HashZero); + const zkProofFFlonk = new Array(24).fill(ethers.HashZero); let currentPendingState = 0; let currentNumBatch = 0; @@ -527,7 +527,7 @@ describe('PolygonZkEVMUpgraded', () => { const batchesForSequence = 5; const sequence = { transactions: l2txData, - globalExitRoot: ethers.constants.HashZero, + globalExitRoot: ethers.HashZero, timestamp: currentTimestamp, minForcedTimestamp: 0, }; @@ -549,7 +549,7 @@ describe('PolygonZkEVMUpgraded', () => { // Forge first sequence with verifyBAtches const newLocalExitRoot = '0x0000000000000000000000000000000000000000000000000000000000000001'; const newStateRoot = '0x0000000000000000000000000000000000000000000000000000000000000002'; - const zkProofFFlonk = new Array(24).fill(ethers.constants.HashZero); + const zkProofFFlonk = new Array(24).fill(ethers.HashZero); let currentPendingState = 0; let currentNumBatch = 0; diff --git a/test/contracts/real-prover/real-flow.test.js-ignore b/test/contracts/real-prover/real-flow.test.js-ignore index 1760b43f4..bf0457c0b 100644 --- a/test/contracts/real-prover/real-flow.test.js-ignore +++ b/test/contracts/real-prover/real-flow.test.js-ignore @@ -27,7 +27,7 @@ describe('Real flow test', () => { const maticTokenName = 'Matic Token'; const maticTokenSymbol = 'MATIC'; - const maticTokenInitialBalance = ethers.utils.parseEther('20000000'); + const maticTokenInitialBalance = ethers.parseEther('20000000'); const genesisRoot = inputJson.oldStateRoot; @@ -54,7 +54,7 @@ describe('Real flow test', () => { trustedSequencer = await ethers.getSigner(trustedSequencerAddress); await deployer.sendTransaction({ to: trustedSequencerAddress, - value: ethers.utils.parseEther('4'), + value: ethers.parseEther('4'), }); // deploy mock verifier @@ -85,8 +85,8 @@ describe('Real flow test', () => { const nonceProxyBridge = Number((await ethers.provider.getTransactionCount(deployer.address))) + (firstDeployment ? 3 : 2); const nonceProxyZkevm = nonceProxyBridge + 2; // Always have to redeploy impl since the polygonZkEVMGlobalExitRoot address changes - const precalculateBridgeAddress = ethers.utils.getContractAddress({ from: deployer.address, nonce: nonceProxyBridge }); - const precalculateZkevmAddress = ethers.utils.getContractAddress({ from: deployer.address, nonce: nonceProxyZkevm }); + const precalculateBridgeAddress = ethers.getContractAddress({ from: deployer.address, nonce: nonceProxyBridge }); + const precalculateZkevmAddress = ethers.getContractAddress({ from: deployer.address, nonce: nonceProxyZkevm }); firstDeployment = false; const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory('PolygonZkEVMGlobalExitRootMock'); @@ -134,7 +134,7 @@ describe('Real flow test', () => { ); // fund sequencer address with Matic tokens - await maticTokenContract.transfer(trustedSequencer.address, ethers.utils.parseEther('1000')); + await maticTokenContract.transfer(trustedSequencer.address, ethers.parseEther('1000')); }); it('Test real prover', async () => { @@ -188,12 +188,12 @@ describe('Real flow test', () => { trustedSequencer = await ethers.getSigner(trustedSequencerAddress); await deployer.sendTransaction({ to: trustedSequencerAddress, - value: ethers.utils.parseEther('4'), + value: ethers.parseEther('4'), }); await expect( maticTokenContract.connect(trustedSequencer).approve(polygonZkEVMContract.address, maticAmount.mul(batchesNum)), ).to.emit(maticTokenContract, 'Approval'); - await maticTokenContract.transfer(trustedSequencer.address, ethers.utils.parseEther('100')); + await maticTokenContract.transfer(trustedSequencer.address, ethers.parseEther('100')); } // Sequence Batches @@ -210,7 +210,7 @@ describe('Real flow test', () => { const aggregator = await ethers.getSigner(aggregatorAddress); await deployer.sendTransaction({ to: aggregatorAddress, - value: ethers.utils.parseEther('4'), + value: ethers.parseEther('4'), }); await polygonZkEVMContract.connect(admin).setTrustedAggregator(aggregatorAddress); diff --git a/test/contracts/snark_stark_input.test.js b/test/contracts/snark_stark_input.test.js index 47c404673..b46f0f2cf 100644 --- a/test/contracts/snark_stark_input.test.js +++ b/test/contracts/snark_stark_input.test.js @@ -99,7 +99,7 @@ describe('Polygon ZK-EVM snark stark input test', () => { const aggregator = await ethers.getSigner(aggregatorAddress); await randomSigner.sendTransaction({ to: aggregatorAddress, - value: ethers.utils.parseEther('4'), + value: ethers.parseEther('4'), }); // Compute SC input diff --git a/test/contracts/timelockUpgradeTest.js b/test/contracts/timelockUpgradeTest.js index 752391685..5fd9bf75c 100644 --- a/test/contracts/timelockUpgradeTest.js +++ b/test/contracts/timelockUpgradeTest.js @@ -3,7 +3,7 @@ const { ethers, upgrades } = require('hardhat'); // OZ test functions function genOperation(target, value, data, predecessor, salt) { - const id = ethers.utils.solidityKeccak256([ + const id = ethers.solidityPackedKeccak256([ 'address', 'uint256', 'bytes', @@ -36,7 +36,7 @@ describe('Polygon ZK-EVM', () => { const maticTokenName = 'Matic Token'; const maticTokenSymbol = 'MATIC'; - const maticTokenInitialBalance = ethers.utils.parseEther('20000000'); + const maticTokenInitialBalance = ethers.parseEther('20000000'); const genesisRoot = '0x0000000000000000000000000000000000000000000000000000000000000001'; @@ -85,8 +85,8 @@ describe('Polygon ZK-EVM', () => { const nonceProxyBridge = Number((await ethers.provider.getTransactionCount(deployer.address))) + (firstDeployment ? 3 : 2); const nonceProxyZkevm = nonceProxyBridge + 2; // Always have to redeploy impl since the polygonZkEVMGlobalExitRoot address changes - const precalculateBridgeAddress = ethers.utils.getContractAddress({ from: deployer.address, nonce: nonceProxyBridge }); - const precalculateZkevmAddress = ethers.utils.getContractAddress({ from: deployer.address, nonce: nonceProxyZkevm }); + const precalculateBridgeAddress = ethers.getContractAddress({ from: deployer.address, nonce: nonceProxyBridge }); + const precalculateZkevmAddress = ethers.getContractAddress({ from: deployer.address, nonce: nonceProxyZkevm }); firstDeployment = false; const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory('PolygonZkEVMGlobalExitRoot'); @@ -134,7 +134,7 @@ describe('Polygon ZK-EVM', () => { ); // fund sequencer address with Matic tokens - await maticTokenContract.transfer(trustedSequencer.address, ethers.utils.parseEther('1000')); + await maticTokenContract.transfer(trustedSequencer.address, ethers.parseEther('1000')); const proposers = [deployer.address]; const executors = [deployer.address]; @@ -186,8 +186,8 @@ describe('Polygon ZK-EVM', () => { [polygonZkEVMBridgeContract.address, implBridgeV2Address], ), - ethers.constants.HashZero, - ethers.constants.HashZero, + ethers.HashZero, + ethers.HashZero, ); // Schedule operation @@ -250,8 +250,8 @@ describe('Polygon ZK-EVM', () => { [polygonZkEVMBridgeContract.address, implBridgeV2Address], ), - ethers.constants.HashZero, - ethers.constants.HashZero, + ethers.HashZero, + ethers.HashZero, ); // Check current delay @@ -296,13 +296,13 @@ describe('Polygon ZK-EVM', () => { proposers, executors, adminAddress, - ethers.constants.AddressZero, + ethers.ZeroAddress, ); await timelockContractL2.deployed(); // Check deploy parameters expect(await timelockContractL2.getMinDelay()).to.be.equal(minDelay); - expect(await timelockContractL2.polygonZkEVM()).to.be.equal(ethers.constants.AddressZero); + expect(await timelockContractL2.polygonZkEVM()).to.be.equal(ethers.ZeroAddress); // Upgrade the contract const polygonZkEVMBridgeFactoryV2 = await ethers.getContractFactory('PolygonZkEVMBridgeMock'); @@ -329,8 +329,8 @@ describe('Polygon ZK-EVM', () => { [polygonZkEVMBridgeContract.address, implBridgeV2Address], ), - ethers.constants.HashZero, - ethers.constants.HashZero, + ethers.HashZero, + ethers.HashZero, ); // Check current delay diff --git a/test/contractsv2/PolygonRollupManager.test.js b/test/contractsv2/PolygonRollupManager.test.js new file mode 100644 index 000000000..5fadbb033 --- /dev/null +++ b/test/contractsv2/PolygonRollupManager.test.js @@ -0,0 +1,166 @@ +/* eslint-disable no-plusplus, no-await-in-loop */ +const { expect } = require('chai'); +const { ethers, upgrades } = require('hardhat'); + +describe('Polygon ZK-EVM TestnetV2', () => { + let deployer; + let trustedAggregator; + let trustedSequencer; + let admin; + + let verifierContract; + let polygonZkEVMBridgeContract; + let polygonZkEVMContract; + let polTokenContract; + let polygonZkEVMGlobalExitRoot; + let rollupManagerContract; + + const polTokenName = 'POL Token'; + const polTokenSymbol = 'POL'; + const polTokenInitialBalance = ethers.parseEther('20000000'); + + const networkIDMainnet = 0; + const urlSequencer = 'http://zkevm-json-rpc:8123'; + const chainID = 1000; + const networkName = 'zkevm'; + const version = '0.0.1'; + const forkID = 0; + + const pendingStateTimeoutDefault = 100; + const trustedAggregatorTimeout = 100; + + let firstDeployment = true; + + //roles + const DEFAULT_ADMIN_ROLE = ethers.HashZero; + const ADD_ROLLUP_TYPE_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("ADD_ROLLUP_TYPE_ROLE")]); + const OBSOLETE_ROLLUP_TYPE_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("OBSOLETE_ROLLUP_TYPE_ROLE")]); + const CREATE_ROLLUP_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("CREATE_ROLLUP_ROLE")]); + const ADD_EXISTING_ROLLUP_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("ADD_EXISTING_ROLLUP_ROLE")]); + const UPDATE_ROLLUP_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("UPDATE_ROLLUP_ROLE")]); + const TRUSTED_AGGREGATOR_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("TRUSTED_AGGREGATOR_ROLE")]); + const TWEAK_PARAMETERS_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("TWEAK_PARAMETERS_ROLE")]); + const SET_FEE_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("SET_FEE_ROLE")]); + const STOP_EMERGENCY_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("STOP_EMERGENCY_ROLE")]); + const EMERGENCY_COUNCIL_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("EMERGENCY_COUNCIL_ROLE")]); + const EMERGENCY_COUNCIL_ADMIN = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("EMERGENCY_COUNCIL_ADMIN")]); + + + beforeEach('Deploy contract', async () => { + upgrades.silenceWarnings(); + + // load signers + [deployer, trustedAggregator, trustedSequencer, admin, timelock, emergencyCouncil] = await ethers.getSigners(); + + + // deploy mock verifier + const VerifierRollupHelperFactory = await ethers.getContractFactory( + 'VerifierRollupHelperMock', + ); + verifierContract = await VerifierRollupHelperFactory.deploy(); + + // deploy pol + const polTokenFactory = await ethers.getContractFactory('ERC20PermitMock'); + polTokenContract = await polTokenFactory.deploy( + polTokenName, + polTokenSymbol, + deployer.address, + polTokenInitialBalance, + ); + await polTokenContract.deployed(); + + /* + * deploy global exit root manager + * In order to not have trouble with nonce deploy first proxy admin + */ + await upgrades.deployProxyAdmin(); + if ((await upgrades.admin.getInstance()).address !== '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0') { + firstDeployment = false; + } + const nonceProxyBridge = Number((await ethers.provider.getTransactionCount(deployer.address))) + (firstDeployment ? 3 : 2); + const nonceProxyZkevm = nonceProxyBridge + 2; // Always have to redeploy impl since the polygonZkEVMGlobalExitRoot address changes + + const precalculateBridgeAddress = ethers.getContractAddress({ from: deployer.address, nonce: nonceProxyBridge }); + const precalculateRollupManagerAddress = ethers.getContractAddress({ from: deployer.address, nonce: nonceProxyZkevm }); + firstDeployment = false; + + // deploy globalExitRoot + const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory('PolygonZkEVMGlobalExitRoot'); + polygonZkEVMGlobalExitRoot = await upgrades.deployProxy(PolygonZkEVMGlobalExitRootFactory, [], { + initializer: false, + constructorArgs: [precalculateRollupManagerAddress, precalculateBridgeAddress], + unsafeAllow: ['constructor', 'state-variable-immutable'], + }); + + // deploy PolygonZkEVMBridge + const polygonZkEVMBridgeFactory = await ethers.getContractFactory('PolygonZkEVMBridgeV2'); + polygonZkEVMBridgeContract = await upgrades.deployProxy(polygonZkEVMBridgeFactory, [], { initializer: false }); + + // deploy mock verifier + const PolygonRollupManagerFactory = await ethers.getContractFactory( + 'PolygonRollupManagerMock', + ); + + rollupManagerContract = await upgrades.deployProxy(PolygonRollupManagerFactory, [], { + initializer: false, + constructorArgs: [polygonZkEVMGlobalExitRoot.address, + polTokenContract.address, + polygonZkEVMBridgeContract.address], + unsafeAllow: ['constructor', 'state-variable-immutable'], + }); + + await rollupManagerContract.deployed(); + + // check precalculated address + expect(precalculateBridgeAddress).to.be.equal(polygonZkEVMBridgeContract.address); + expect(precalculateRollupManagerAddress).to.be.equal(rollupManagerContract.address); + + await polygonZkEVMBridgeContract.initialize(networkIDMainnet, polygonZkEVMGlobalExitRoot.address, rollupManagerContract.address); + + // Initialize Mock + await rollupManagerContract.initializeMock(trustedAggregator.address, + pendingStateTimeoutDefault, + trustedAggregatorTimeout, + admin.address, + timelock.address, + emergencyCouncil.address); + + + // fund sequencer address with Matic tokens + await polTokenContract.transfer(trustedSequencer.address, ethers.parseEther('1000')); + }); + + it('should check the initalized parameters', async () => { + expect(await rollupManagerContract.globalExitRootManager()).to.be.equal(polygonZkEVMGlobalExitRoot.address); + expect(await rollupManagerContract.pol()).to.be.equal(polTokenContract.address); + expect(await rollupManagerContract.bridgeAddress()).to.be.equal(polygonZkEVMBridgeContract.address); + + expect(await rollupManagerContract.pendingStateTimeout()).to.be.equal(pendingStateTimeoutDefault); + expect(await rollupManagerContract.trustedAggregator()).to.be.equal(trustedAggregator.address); + expect(await rollupManagerContract.trustedAggregatorTimeout()).to.be.equal(trustedAggregatorTimeout); + + expect(await rollupManagerContract.getBatchFee()).to.be.equal(ethers.parseEther('0.1')); + expect(await rollupManagerContract.getForcedBatchFee()).to.be.equal(ethers.parseEther('10')); + + // Check roles + + expect(await rollupManagerContract.hasRole(DEFAULT_ADMIN_ROLE, timelock.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(ADD_ROLLUP_TYPE_ROLE, timelock.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(UPDATE_ROLLUP_ROLE, timelock.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(OBSOLETE_ROLLUP_TYPE_ROLE, admin.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(CREATE_ROLLUP_ROLE, admin.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(TRUSTED_AGGREGATOR_ROLE, admin.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(TWEAK_PARAMETERS_ROLE, admin.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(SET_FEE_ROLE, admin.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(STOP_EMERGENCY_ROLE, admin.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(EMERGENCY_COUNCIL_ROLE, emergencyCouncil.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(EMERGENCY_COUNCIL_ADMIN, emergencyCouncil.address)).to.be.equal(true); + }); + + it('should add a new rollup type', async () => { + + + }); +}); + + diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 000000000..4e44a2612 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "target": "es2020", + "module": "commonjs", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "resolveJsonModule": true + } +} \ No newline at end of file diff --git a/upgrade/timeLockUpgrade.js b/upgrade/timeLockUpgrade.js index bf8a5d306..c0c9114a1 100644 --- a/upgrade/timeLockUpgrade.js +++ b/upgrade/timeLockUpgrade.js @@ -77,7 +77,7 @@ async function main() { } // Use timelock - const salt = upgradeParameters.timelockSalt || ethers.constants.HashZero; + const salt = upgradeParameters.timelockSalt || ethers.HashZero; let operation; if (upgrade.callAfterUpgrade) { @@ -95,7 +95,7 @@ async function main() { ), ], ), - ethers.constants.HashZero, // predecesoor + ethers.HashZero, // predecesoor salt, // salt ); } else { @@ -107,7 +107,7 @@ async function main() { [proxyPolygonAddress, newImplPolygonAddress], ), - ethers.constants.HashZero, // predecesoor + ethers.HashZero, // predecesoor salt, // salt ); } @@ -160,7 +160,7 @@ main() // OZ test functions function genOperation(target, value, data, predecessor, salt) { - const id = ethers.utils.solidityKeccak256([ + const id = ethers.solidityPackedKeccak256([ 'address', 'uint256', 'bytes', From d8eff2b6f7cb4b3aac6f028ef24d291275e8bc89 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Sun, 8 Oct 2023 17:05:07 +0200 Subject: [PATCH 044/230] fix buuug --- .prettierrc | 35 +- contracts/v2/PolygonRollupManager.sol | 45 +- .../lib/PolygonAccessControlUpgradeable.sol | 2 +- contracts/v2/lib/PolygonTransparentProxy.sol | 80 ++++ hardhat.config.ts | 364 ++++++++-------- test/contractsv2/PolygonRollupManager.test.js | 166 -------- test/contractsv2/PolygonRollupManager.test.ts | 397 ++++++++++++++++++ 7 files changed, 709 insertions(+), 380 deletions(-) create mode 100644 contracts/v2/lib/PolygonTransparentProxy.sol delete mode 100644 test/contractsv2/PolygonRollupManager.test.js create mode 100644 test/contractsv2/PolygonRollupManager.test.ts diff --git a/.prettierrc b/.prettierrc index 00424a421..7b7a26b14 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,15 +1,24 @@ { - "overrides": [ - { - "files": "*.sol", - "options": { - "printWidth": 80, - "tabWidth": 4, - "useTabs": false, - "singleQuote": false, - "bracketSpacing": false, - "explicitTypes": "always" - } + "printWidth": 120, + "tabWidth": 4, + "useTabs": false, + "semi": true, + "singleQuote": false, + "quoteProps": "as-needed", + "trailingComma": "es5", + "bracketSpacing": false, + "arrowParens": "always", + "overrides": [ + { + "files": "*.sol", + "options": { + "printWidth": 80, + "tabWidth": 4, + "useTabs": false, + "singleQuote": false, + "bracketSpacing": false, + "explicitTypes": "always" } - ] - } \ No newline at end of file + } + ] +} \ No newline at end of file diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index e2dbfc0d1..2117583b6 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -8,7 +8,7 @@ import "../interfaces/IPolygonZkEVMBridge.sol"; import "./interfaces/IPolygonRollupBase.sol"; import "../lib/EmergencyManager.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; -import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import "./lib/PolygonTransparentProxy.sol"; import "./lib/PolygonAccessControlUpgradeable.sol"; import "../interfaces/IVerifierRollup.sol"; import "./consensus/zkEVM/PolygonZkEVMV2Upgraded.sol"; @@ -330,6 +330,7 @@ contract PolygonRollupManager is address verifier, uint64 forkID, bytes32 genesis, + uint8 rollupCompatibilityID, string description ); @@ -597,6 +598,7 @@ contract PolygonRollupManager is address(verifier), forkID, genesis, + rollupCompatibilityID, description ); } @@ -665,21 +667,10 @@ contract PolygonRollupManager is // Consensus will be the implementation, and this contract the admin uint32 rollupID = ++rollupCount; address rollupAddress = address( - new TransparentUpgradeableProxy( + new PolygonTransparentProxy( rollupType.consensusImplementation, address(this), - abi.encodeCall( - IPolygonRollupBase.initialize, - ( - admin, - trustedSequencer, - rollupID, - gasTokenAddress, - gasTokenNetwork, - trustedSequencerURL, - networkName - ) - ) + new bytes(0) ) ); @@ -700,6 +691,17 @@ contract PolygonRollupManager is rollup.rollupCompatibilityID = rollupType.rollupCompatibilityID; emit CreateNewRollup(rollupID, rollupTypeID, rollupAddress, chainID); + + // Initialize new rollup + IPolygonRollupBase(rollupAddress).initialize( + admin, + trustedSequencer, + rollupID, + gasTokenAddress, + gasTokenNetwork, + trustedSequencerURL, + networkName + ); } /** @@ -778,7 +780,8 @@ contract PolygonRollupManager is //review, should check that there are not sequenced batches pending to be verified?¿? //this way no one can break the virtual state, ( but maybe is worth to break it) - + // Also upgrade address can send `upgradeData` to the proxy, being able to call `onVerifyBathes` maliciously + // To avoid attacks, should data be empty, or should check that does not call `onVerifyBatches` /** * @notice Upgrade an existing rollup * @param rollupContract Rollup consensus proxy address @@ -786,7 +789,7 @@ contract PolygonRollupManager is * @param upgradeData Upgrade data */ function updateRollup( - TransparentUpgradeableProxy rollupContract, + ITransparentUpgradeableProxy rollupContract, uint32 newRollupTypeID, bytes calldata upgradeData ) external onlyRole(_UPDATE_ROLLUP_ROLE) { @@ -828,11 +831,11 @@ contract PolygonRollupManager is rollup.rollupTypeID = newRollupTypeID; rollup.lastVerifiedBatchBeforeUpgrade = getLastVerifiedBatch(rollupID); - // Upgrade rollup if the consensus implementation it's different - address newConsensusAddress = newRollupType.consensusImplementation; - if (rollupContract.implementation() != newConsensusAddress) { - rollupContract.upgradeToAndCall(newConsensusAddress, upgradeData); - } + // Upgrade rollup + rollupContract.upgradeToAndCall( + newRollupType.consensusImplementation, + upgradeData + ); emit UpdateRollup( rollupID, diff --git a/contracts/v2/lib/PolygonAccessControlUpgradeable.sol b/contracts/v2/lib/PolygonAccessControlUpgradeable.sol index 15919c975..d8545ec5b 100644 --- a/contracts/v2/lib/PolygonAccessControlUpgradeable.sol +++ b/contracts/v2/lib/PolygonAccessControlUpgradeable.sol @@ -10,7 +10,7 @@ import "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeabl import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; /** - * @dev Contrac AccessControlUpgradeable from Openzeppelin with the following modifications: + * @dev 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 diff --git a/contracts/v2/lib/PolygonTransparentProxy.sol b/contracts/v2/lib/PolygonTransparentProxy.sol new file mode 100644 index 000000000..c0392b06d --- /dev/null +++ b/contracts/v2/lib/PolygonTransparentProxy.sol @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (proxy/transparent/TransparentUpgradeableProxy.sol) + +pragma solidity ^0.8.20; + +import {ERC1967Utils} from "@openzeppelin/contracts5/proxy/ERC1967/ERC1967Utils.sol"; +import {ERC1967Proxy} from "@openzeppelin/contracts5/proxy/ERC1967/ERC1967Proxy.sol"; +import {IERC1967} from "@openzeppelin/contracts5/interfaces/IERC1967.sol"; +import {ProxyAdmin} from "@openzeppelin/contracts5/proxy/transparent/ProxyAdmin.sol"; +import {ITransparentUpgradeableProxy} from "@openzeppelin/contracts5/proxy/transparent/TransparentUpgradeableProxy.sol"; + +/** + * @dev 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 + */ +contract PolygonTransparentProxy is ERC1967Proxy { + // An immutable address for the admin to avoid unnecessary SLOADs before each call + // at the expense of removing the ability to change the admin once it's set. + // This is acceptable if the admin is always a ProxyAdmin instance or similar contract + // with its own ability to transfer the permissions to another account. + address private immutable _admin; + + /** + * @dev 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}. + */ + constructor( + address _logic, + address admin, + bytes memory _data + ) payable ERC1967Proxy(_logic, _data) { + _admin = admin; + // Set the storage value and emit an event for ERC-1967 compatibility + ERC1967Utils.changeAdmin(_proxyAdmin()); + } + + /** + * @dev Returns the admin of this proxy. + */ + function _proxyAdmin() internal virtual returns (address) { + return _admin; + } + + /** + * @dev If caller is the admin process the call internally, otherwise transparently fallback to the proxy behavior. + */ + function _fallback() internal virtual override { + if (msg.sender == _proxyAdmin()) { + if ( + msg.sig != + ITransparentUpgradeableProxy.upgradeToAndCall.selector + ) { + super._fallback(); + } else { + _dispatchUpgradeToAndCall(); + } + } else { + super._fallback(); + } + } + + /** + * @dev Upgrade the implementation of the proxy. See {ERC1967Utils-upgradeToAndCall}. + * + * Requirements: + * + * - If `data` is empty, `msg.value` must be zero. + */ + function _dispatchUpgradeToAndCall() private { + (address newImplementation, bytes memory data) = abi.decode( + msg.data[4:], + (address, bytes) + ); + ERC1967Utils.upgradeToAndCall(newImplementation, data); + } +} diff --git a/hardhat.config.ts b/hardhat.config.ts index de851cb21..bd9e921c9 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -1,11 +1,11 @@ import 'dotenv/config' -import "@nomicfoundation/hardhat-toolbox"; -import '@openzeppelin/hardhat-upgrades'; -import 'hardhat-dependency-compiler'; +import '@nomicfoundation/hardhat-toolbox' +import '@openzeppelin/hardhat-upgrades' +import 'hardhat-dependency-compiler' -import { HardhatUserConfig } from "hardhat/config"; +import { HardhatUserConfig } from 'hardhat/config' -const DEFAULT_MNEMONIC = 'test test test test test test test test test test test junk'; +const DEFAULT_MNEMONIC = 'test test test test test test test test test test test junk' /* * You need to export an object to set up your config @@ -16,187 +16,193 @@ const DEFAULT_MNEMONIC = 'test test test test test test test test test test test * @type import('hardhat/config').HardhatUserConfig */ - const config: HardhatUserConfig = { - dependencyCompiler: { - paths: [ - '@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol', - '@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol', - '@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol', - ], // , - // keep: true - }, - solidity: { - compilers: [ - { - version: '0.8.20', - settings: { - optimizer: { - enabled: true, - runs: 999999, - }, - evmVersion: "shanghai", - }, - }, - { - version: '0.6.11', - settings: { - optimizer: { - enabled: true, - runs: 999999, - }, - }, - }, - { - version: '0.5.12', - settings: { - optimizer: { - enabled: true, - runs: 999999, - }, - }, - - }, - { - version: '0.5.16', - settings: { - optimizer: { - enabled: true, - runs: 999999, - }, - }, - }, - ], - overrides: { - "contracts/v2/PolygonRollupManager.sol": { - version: '0.8.20', - settings: { - optimizer: { - enabled: true, - runs: 99, - }, - evmVersion: "shanghai", - },// try yul optimizer - }, - "contracts/v2/L2/PolygonZkEVMBridgeL2.sol": { - version: '0.8.20', - settings: { - optimizer: { - enabled: true, - runs: 9999, - }, - evmVersion: "shanghai", - }, - } - } - }, - networks: { - mainnet: { - url: process.env.MAINNET_PROVIDER ? process.env.MAINNET_PROVIDER : `https://mainnet.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, - accounts: { - mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, - path: "m/44'/60'/0'/0", - initialIndex: 0, - count: 20, - }, - }, - ropsten: { - url: process.env.ROPSTEN_PROVIDER ? process.env.ROPSTEN_PROVIDER : `https://ropsten.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, - accounts: { - mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, - path: "m/44'/60'/0'/0", - initialIndex: 0, - count: 20, - }, + dependencyCompiler: { + paths: [ + '@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol', + '@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol', + '@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol', + ], // , + // keep: true + }, + solidity: { + compilers: [ + { + version: '0.8.20', + settings: { + optimizer: { + enabled: true, + runs: 999999, + }, + evmVersion: 'shanghai', }, - goerli: { - url: process.env.GOERLI_PROVIDER ? process.env.GOERLI_PROVIDER : `https://goerli.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, - accounts: { - mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, - path: "m/44'/60'/0'/0", - initialIndex: 0, - count: 20, - }, + }, + { + version: '0.6.11', + settings: { + optimizer: { + enabled: true, + runs: 999999, + }, }, - rinkeby: { - url: process.env.RINKEBY_PROVIDER ? process.env.RINKEBY_PROVIDER : `https://rinkeby.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, - accounts: { - mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, - path: "m/44'/60'/0'/0", - initialIndex: 0, - count: 20, - }, + }, + { + version: '0.5.12', + settings: { + optimizer: { + enabled: true, + runs: 999999, + }, }, - localhost: { - url: 'http://127.0.0.1:8545', - accounts: { - mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, - path: "m/44'/60'/0'/0", - initialIndex: 0, - count: 20, - }, + }, + { + version: '0.5.16', + settings: { + optimizer: { + enabled: true, + runs: 999999, + }, }, - hardhat: { - initialDate: '0', - allowUnlimitedContractSize: true, - initialBaseFeePerGas: '0', - accounts: { - mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, - path: "m/44'/60'/0'/0", - initialIndex: 0, - count: 20, - }, - }, - polygonZKEVMTestnet: { - url: 'https://rpc.public.zkevm-test.net', - accounts: { - mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, - path: "m/44'/60'/0'/0", - initialIndex: 0, - count: 20, - }, - }, - polygonZKEVMMainnet: { - url: 'https://zkevm-rpc.com', - accounts: { - mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, - path: "m/44'/60'/0'/0", - initialIndex: 0, - count: 20, - }, + }, + ], + overrides: { + 'contracts/v2/PolygonRollupManager.sol': { + version: '0.8.20', + settings: { + optimizer: { + enabled: true, + runs: 99, + }, + evmVersion: 'shanghai', + }, // try yul optimizer + }, + 'contracts/v2/L2/PolygonZkEVMBridgeL2.sol': { + version: '0.8.20', + settings: { + optimizer: { + enabled: true, + runs: 9999, + }, + evmVersion: 'shanghai', }, + }, }, - gasReporter: { - enabled: !!process.env.REPORT_GAS, - outputFile: process.env.REPORT_GAS_FILE ? './gas_report.md' : null, - noColors: !!process.env.REPORT_GAS_FILE, + }, + networks: { + mainnet: { + url: process.env.MAINNET_PROVIDER + ? process.env.MAINNET_PROVIDER + : `https://mainnet.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, }, - etherscan: { - apiKey: { - polygonZKEVMTestnet: `${process.env.ETHERSCAN_ZKEVM_API_KEY}`, - polygonZKEVMMainnet: `${process.env.ETHERSCAN_ZKEVM_API_KEY}`, - goerli: `${process.env.ETHERSCAN_API_KEY}`, - mainnet: `${process.env.ETHERSCAN_API_KEY}`, - }, - customChains: [ - { - network: 'polygonZKEVMMainnet', - chainId: 1101, - urls: { - apiURL: 'https://api-zkevm.polygonscan.com/api', - browserURL: 'https://zkevm.polygonscan.com/', - }, - }, - { - network: 'polygonZKEVMTestnet', - chainId: 1442, - urls: { - apiURL: 'https://api-testnet-zkevm.polygonscan.com/api', - browserURL: 'https://testnet-zkevm.polygonscan.com/', - }, - }, - ], + ropsten: { + url: process.env.ROPSTEN_PROVIDER + ? process.env.ROPSTEN_PROVIDER + : `https://ropsten.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, + }, + goerli: { + url: process.env.GOERLI_PROVIDER + ? process.env.GOERLI_PROVIDER + : `https://goerli.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, }, -}; + rinkeby: { + url: process.env.RINKEBY_PROVIDER + ? process.env.RINKEBY_PROVIDER + : `https://rinkeby.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, + }, + localhost: { + url: 'http://127.0.0.1:8545', + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, + }, + hardhat: { + initialDate: '0', + allowUnlimitedContractSize: true, + initialBaseFeePerGas: '0', + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, + }, + polygonZKEVMTestnet: { + url: 'https://rpc.public.zkevm-test.net', + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, + }, + polygonZKEVMMainnet: { + url: 'https://zkevm-rpc.com', + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, + }, + }, + gasReporter: { + enabled: !!process.env.REPORT_GAS, + outputFile: process.env.REPORT_GAS_FILE ? './gas_report.md' : null, + noColors: !!process.env.REPORT_GAS_FILE, + }, + etherscan: { + apiKey: { + polygonZKEVMTestnet: `${process.env.ETHERSCAN_ZKEVM_API_KEY}`, + polygonZKEVMMainnet: `${process.env.ETHERSCAN_ZKEVM_API_KEY}`, + goerli: `${process.env.ETHERSCAN_API_KEY}`, + mainnet: `${process.env.ETHERSCAN_API_KEY}`, + }, + customChains: [ + { + network: 'polygonZKEVMMainnet', + chainId: 1101, + urls: { + apiURL: 'https://api-zkevm.polygonscan.com/api', + browserURL: 'https://zkevm.polygonscan.com/', + }, + }, + { + network: 'polygonZKEVMTestnet', + chainId: 1442, + urls: { + apiURL: 'https://api-testnet-zkevm.polygonscan.com/api', + browserURL: 'https://testnet-zkevm.polygonscan.com/', + }, + }, + ], + }, +} -export default config; +export default config diff --git a/test/contractsv2/PolygonRollupManager.test.js b/test/contractsv2/PolygonRollupManager.test.js deleted file mode 100644 index 5fadbb033..000000000 --- a/test/contractsv2/PolygonRollupManager.test.js +++ /dev/null @@ -1,166 +0,0 @@ -/* eslint-disable no-plusplus, no-await-in-loop */ -const { expect } = require('chai'); -const { ethers, upgrades } = require('hardhat'); - -describe('Polygon ZK-EVM TestnetV2', () => { - let deployer; - let trustedAggregator; - let trustedSequencer; - let admin; - - let verifierContract; - let polygonZkEVMBridgeContract; - let polygonZkEVMContract; - let polTokenContract; - let polygonZkEVMGlobalExitRoot; - let rollupManagerContract; - - const polTokenName = 'POL Token'; - const polTokenSymbol = 'POL'; - const polTokenInitialBalance = ethers.parseEther('20000000'); - - const networkIDMainnet = 0; - const urlSequencer = 'http://zkevm-json-rpc:8123'; - const chainID = 1000; - const networkName = 'zkevm'; - const version = '0.0.1'; - const forkID = 0; - - const pendingStateTimeoutDefault = 100; - const trustedAggregatorTimeout = 100; - - let firstDeployment = true; - - //roles - const DEFAULT_ADMIN_ROLE = ethers.HashZero; - const ADD_ROLLUP_TYPE_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("ADD_ROLLUP_TYPE_ROLE")]); - const OBSOLETE_ROLLUP_TYPE_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("OBSOLETE_ROLLUP_TYPE_ROLE")]); - const CREATE_ROLLUP_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("CREATE_ROLLUP_ROLE")]); - const ADD_EXISTING_ROLLUP_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("ADD_EXISTING_ROLLUP_ROLE")]); - const UPDATE_ROLLUP_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("UPDATE_ROLLUP_ROLE")]); - const TRUSTED_AGGREGATOR_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("TRUSTED_AGGREGATOR_ROLE")]); - const TWEAK_PARAMETERS_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("TWEAK_PARAMETERS_ROLE")]); - const SET_FEE_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("SET_FEE_ROLE")]); - const STOP_EMERGENCY_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("STOP_EMERGENCY_ROLE")]); - const EMERGENCY_COUNCIL_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("EMERGENCY_COUNCIL_ROLE")]); - const EMERGENCY_COUNCIL_ADMIN = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("EMERGENCY_COUNCIL_ADMIN")]); - - - beforeEach('Deploy contract', async () => { - upgrades.silenceWarnings(); - - // load signers - [deployer, trustedAggregator, trustedSequencer, admin, timelock, emergencyCouncil] = await ethers.getSigners(); - - - // deploy mock verifier - const VerifierRollupHelperFactory = await ethers.getContractFactory( - 'VerifierRollupHelperMock', - ); - verifierContract = await VerifierRollupHelperFactory.deploy(); - - // deploy pol - const polTokenFactory = await ethers.getContractFactory('ERC20PermitMock'); - polTokenContract = await polTokenFactory.deploy( - polTokenName, - polTokenSymbol, - deployer.address, - polTokenInitialBalance, - ); - await polTokenContract.deployed(); - - /* - * deploy global exit root manager - * In order to not have trouble with nonce deploy first proxy admin - */ - await upgrades.deployProxyAdmin(); - if ((await upgrades.admin.getInstance()).address !== '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0') { - firstDeployment = false; - } - const nonceProxyBridge = Number((await ethers.provider.getTransactionCount(deployer.address))) + (firstDeployment ? 3 : 2); - const nonceProxyZkevm = nonceProxyBridge + 2; // Always have to redeploy impl since the polygonZkEVMGlobalExitRoot address changes - - const precalculateBridgeAddress = ethers.getContractAddress({ from: deployer.address, nonce: nonceProxyBridge }); - const precalculateRollupManagerAddress = ethers.getContractAddress({ from: deployer.address, nonce: nonceProxyZkevm }); - firstDeployment = false; - - // deploy globalExitRoot - const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory('PolygonZkEVMGlobalExitRoot'); - polygonZkEVMGlobalExitRoot = await upgrades.deployProxy(PolygonZkEVMGlobalExitRootFactory, [], { - initializer: false, - constructorArgs: [precalculateRollupManagerAddress, precalculateBridgeAddress], - unsafeAllow: ['constructor', 'state-variable-immutable'], - }); - - // deploy PolygonZkEVMBridge - const polygonZkEVMBridgeFactory = await ethers.getContractFactory('PolygonZkEVMBridgeV2'); - polygonZkEVMBridgeContract = await upgrades.deployProxy(polygonZkEVMBridgeFactory, [], { initializer: false }); - - // deploy mock verifier - const PolygonRollupManagerFactory = await ethers.getContractFactory( - 'PolygonRollupManagerMock', - ); - - rollupManagerContract = await upgrades.deployProxy(PolygonRollupManagerFactory, [], { - initializer: false, - constructorArgs: [polygonZkEVMGlobalExitRoot.address, - polTokenContract.address, - polygonZkEVMBridgeContract.address], - unsafeAllow: ['constructor', 'state-variable-immutable'], - }); - - await rollupManagerContract.deployed(); - - // check precalculated address - expect(precalculateBridgeAddress).to.be.equal(polygonZkEVMBridgeContract.address); - expect(precalculateRollupManagerAddress).to.be.equal(rollupManagerContract.address); - - await polygonZkEVMBridgeContract.initialize(networkIDMainnet, polygonZkEVMGlobalExitRoot.address, rollupManagerContract.address); - - // Initialize Mock - await rollupManagerContract.initializeMock(trustedAggregator.address, - pendingStateTimeoutDefault, - trustedAggregatorTimeout, - admin.address, - timelock.address, - emergencyCouncil.address); - - - // fund sequencer address with Matic tokens - await polTokenContract.transfer(trustedSequencer.address, ethers.parseEther('1000')); - }); - - it('should check the initalized parameters', async () => { - expect(await rollupManagerContract.globalExitRootManager()).to.be.equal(polygonZkEVMGlobalExitRoot.address); - expect(await rollupManagerContract.pol()).to.be.equal(polTokenContract.address); - expect(await rollupManagerContract.bridgeAddress()).to.be.equal(polygonZkEVMBridgeContract.address); - - expect(await rollupManagerContract.pendingStateTimeout()).to.be.equal(pendingStateTimeoutDefault); - expect(await rollupManagerContract.trustedAggregator()).to.be.equal(trustedAggregator.address); - expect(await rollupManagerContract.trustedAggregatorTimeout()).to.be.equal(trustedAggregatorTimeout); - - expect(await rollupManagerContract.getBatchFee()).to.be.equal(ethers.parseEther('0.1')); - expect(await rollupManagerContract.getForcedBatchFee()).to.be.equal(ethers.parseEther('10')); - - // Check roles - - expect(await rollupManagerContract.hasRole(DEFAULT_ADMIN_ROLE, timelock.address)).to.be.equal(true); - expect(await rollupManagerContract.hasRole(ADD_ROLLUP_TYPE_ROLE, timelock.address)).to.be.equal(true); - expect(await rollupManagerContract.hasRole(UPDATE_ROLLUP_ROLE, timelock.address)).to.be.equal(true); - expect(await rollupManagerContract.hasRole(OBSOLETE_ROLLUP_TYPE_ROLE, admin.address)).to.be.equal(true); - expect(await rollupManagerContract.hasRole(CREATE_ROLLUP_ROLE, admin.address)).to.be.equal(true); - expect(await rollupManagerContract.hasRole(TRUSTED_AGGREGATOR_ROLE, admin.address)).to.be.equal(true); - expect(await rollupManagerContract.hasRole(TWEAK_PARAMETERS_ROLE, admin.address)).to.be.equal(true); - expect(await rollupManagerContract.hasRole(SET_FEE_ROLE, admin.address)).to.be.equal(true); - expect(await rollupManagerContract.hasRole(STOP_EMERGENCY_ROLE, admin.address)).to.be.equal(true); - expect(await rollupManagerContract.hasRole(EMERGENCY_COUNCIL_ROLE, emergencyCouncil.address)).to.be.equal(true); - expect(await rollupManagerContract.hasRole(EMERGENCY_COUNCIL_ADMIN, emergencyCouncil.address)).to.be.equal(true); - }); - - it('should add a new rollup type', async () => { - - - }); -}); - - diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts new file mode 100644 index 000000000..bd8868c2b --- /dev/null +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -0,0 +1,397 @@ +/* eslint-disable no-plusplus, no-await-in-loop */ +import {expect} from "chai"; +import {ethers, upgrades} from "hardhat"; +import { + VerifierRollupHelperMock, + ERC20PermitMock, + PolygonRollupManagerMock, + PolygonZkEVMGlobalExitRoot, + PolygonZkEVMBridgeV2, +} from "../../typechain-types"; +import {takeSnapshot, time} from "@nomicfoundation/hardhat-network-helpers"; + +describe("Polygon ZK-EVM TestnetV2", () => { + let deployer; + let timelock: any; + let emergencyCouncil: any; + let trustedAggregator: any; + let trustedSequencer: any; + let admin: any; + let verifierContract: VerifierRollupHelperMock; + + let polygonZkEVMBridgeContract: PolygonZkEVMBridgeV2; + let polTokenContract: ERC20PermitMock; + let polygonZkEVMGlobalExitRoot: PolygonZkEVMGlobalExitRoot; + let rollupManagerContract: PolygonRollupManagerMock; + + const polTokenName = "POL Token"; + const polTokenSymbol = "POL"; + const polTokenInitialBalance = ethers.parseEther("20000000"); + + const networkIDMainnet = 0; + + const pendingStateTimeoutDefault = 100; + const trustedAggregatorTimeout = 100; + + let firstDeployment = true; + + //roles + const DEFAULT_ADMIN_ROLE = ethers.ZeroHash; + const ADD_ROLLUP_TYPE_ROLE = ethers.id("ADD_ROLLUP_TYPE_ROLE"); + const OBSOLETE_ROLLUP_TYPE_ROLE = ethers.id("OBSOLETE_ROLLUP_TYPE_ROLE"); + const CREATE_ROLLUP_ROLE = ethers.id("CREATE_ROLLUP_ROLE"); + const ADD_EXISTING_ROLLUP_ROLE = ethers.id("ADD_EXISTING_ROLLUP_ROLE"); + const UPDATE_ROLLUP_ROLE = ethers.id("UPDATE_ROLLUP_ROLE"); + const TRUSTED_AGGREGATOR_ROLE = ethers.id("TRUSTED_AGGREGATOR_ROLE"); + const TWEAK_PARAMETERS_ROLE = ethers.id("TWEAK_PARAMETERS_ROLE"); + const SET_FEE_ROLE = ethers.id("SET_FEE_ROLE"); + const STOP_EMERGENCY_ROLE = ethers.id("STOP_EMERGENCY_ROLE"); + const EMERGENCY_COUNCIL_ROLE = ethers.id("EMERGENCY_COUNCIL_ROLE"); + const EMERGENCY_COUNCIL_ADMIN = ethers.id("EMERGENCY_COUNCIL_ADMIN"); + + beforeEach("Deploy contract", async () => { + upgrades.silenceWarnings(); + + // load signers + [deployer, trustedAggregator, trustedSequencer, admin, timelock, emergencyCouncil] = await ethers.getSigners(); + + // deploy mock verifier + const VerifierRollupHelperFactory = await ethers.getContractFactory("VerifierRollupHelperMock"); + verifierContract = await VerifierRollupHelperFactory.deploy(); + + // deploy pol + const polTokenFactory = await ethers.getContractFactory("ERC20PermitMock"); + polTokenContract = await polTokenFactory.deploy( + polTokenName, + polTokenSymbol, + deployer.address, + polTokenInitialBalance + ); + + /* + * deploy global exit root manager + * In order to not have trouble with nonce deploy first proxy admin + */ + await upgrades.deployProxyAdmin(); + + if ((await upgrades.admin.getInstance()).target !== "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0") { + firstDeployment = false; + } + const nonceProxyBridge = + Number(await ethers.provider.getTransactionCount(deployer.address)) + (firstDeployment ? 3 : 2); + + const nonceProxyZkevm = nonceProxyBridge + 2; // Always have to redeploy impl since the polygonZkEVMGlobalExitRoot address changes + + const precalculateBridgeAddress = ethers.getCreateAddress({ + from: deployer.address, + nonce: nonceProxyBridge, + }); + const precalculateRollupManagerAddress = ethers.getCreateAddress({ + from: deployer.address, + nonce: nonceProxyZkevm, + }); + firstDeployment = false; + + // deploy globalExitRoot + const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRoot"); + polygonZkEVMGlobalExitRoot = await upgrades.deployProxy(PolygonZkEVMGlobalExitRootFactory, [], { + initializer: false, + constructorArgs: [precalculateRollupManagerAddress, precalculateBridgeAddress], + unsafeAllow: ["constructor", "state-variable-immutable"], + }); + + // deploy PolygonZkEVMBridge + const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + polygonZkEVMBridgeContract = await upgrades.deployProxy(polygonZkEVMBridgeFactory, [], {initializer: false}); + + // deploy mock verifier + const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManagerMock"); + + rollupManagerContract = (await upgrades.deployProxy(PolygonRollupManagerFactory, [], { + initializer: false, + constructorArgs: [ + polygonZkEVMGlobalExitRoot.target, + polTokenContract.target, + polygonZkEVMBridgeContract.target, + ], + unsafeAllow: ["constructor", "state-variable-immutable"], + })) as unknown as PolygonRollupManagerMock; + + await rollupManagerContract.waitForDeployment(); + + // check precalculated address + expect(precalculateBridgeAddress).to.be.equal(polygonZkEVMBridgeContract.target); + expect(precalculateRollupManagerAddress).to.be.equal(rollupManagerContract.target); + + await polygonZkEVMBridgeContract.initialize( + networkIDMainnet, + polygonZkEVMGlobalExitRoot.target, + rollupManagerContract.target + ); + + // Initialize Mock + await rollupManagerContract.initializeMock( + trustedAggregator.address, + pendingStateTimeoutDefault, + trustedAggregatorTimeout, + admin.address, + timelock.address, + emergencyCouncil.address + ); + + // fund sequencer address with Matic tokens + await polTokenContract.transfer(trustedSequencer.address, ethers.parseEther("1000")); + }); + + it("should check the initalized parameters", async () => { + expect(await rollupManagerContract.globalExitRootManager()).to.be.equal(polygonZkEVMGlobalExitRoot.target); + expect(await rollupManagerContract.pol()).to.be.equal(polTokenContract.target); + expect(await rollupManagerContract.bridgeAddress()).to.be.equal(polygonZkEVMBridgeContract.target); + + expect(await rollupManagerContract.pendingStateTimeout()).to.be.equal(pendingStateTimeoutDefault); + expect(await rollupManagerContract.trustedAggregator()).to.be.equal(trustedAggregator.address); + expect(await rollupManagerContract.trustedAggregatorTimeout()).to.be.equal(trustedAggregatorTimeout); + + expect(await rollupManagerContract.getBatchFee()).to.be.equal(ethers.parseEther("0.1")); + expect(await rollupManagerContract.getForcedBatchFee()).to.be.equal(ethers.parseEther("10")); + + // Check roles + expect(await rollupManagerContract.hasRole(DEFAULT_ADMIN_ROLE, timelock.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(ADD_ROLLUP_TYPE_ROLE, timelock.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(UPDATE_ROLLUP_ROLE, timelock.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(ADD_EXISTING_ROLLUP_ROLE, timelock.address)).to.be.equal(true); + + expect(await rollupManagerContract.hasRole(OBSOLETE_ROLLUP_TYPE_ROLE, admin.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(CREATE_ROLLUP_ROLE, admin.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(TRUSTED_AGGREGATOR_ROLE, admin.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(TWEAK_PARAMETERS_ROLE, admin.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(SET_FEE_ROLE, admin.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(STOP_EMERGENCY_ROLE, admin.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(EMERGENCY_COUNCIL_ROLE, emergencyCouncil.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(EMERGENCY_COUNCIL_ADMIN, emergencyCouncil.address)).to.be.equal( + true + ); + }); + + it("should add a new rollup type zkEVM", async () => { + const urlSequencer = "http://zkevm-json-rpc:8123"; + const chainID = 1000; + const networkName = "zkevm"; + const forkID = 0; + const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001"; + const rollupCompatibilityID = 0; + const descirption = "zkevm test"; + // Native token will be ether + const gasTokenAddress = ethers.ZeroAddress; + const gasTokenNetwork = 0; + + // In order to create a new rollup type, create an implementation of the contract + + // Create zkEVM implementation + const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMV2"); + const PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy( + polygonZkEVMGlobalExitRoot.target, + polTokenContract.target, + polygonZkEVMBridgeContract.target, + rollupManagerContract.target + ); + await PolygonZKEVMV2Contract.waitForDeployment(); + + // Try to add a new rollup type + await expect( + rollupManagerContract.addNewRollupType( + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + genesisRandom, + rollupCompatibilityID, + descirption + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); + + // Add a new rollup type with timelock + const newRollupTypeID = 1; + await expect( + rollupManagerContract + .connect(timelock) + .addNewRollupType( + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + genesisRandom, + rollupCompatibilityID, + descirption + ) + ) + .to.emit(rollupManagerContract, "AddNewRollupType") + .withArgs( + newRollupTypeID, + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + genesisRandom, + rollupCompatibilityID, + descirption + ); + + // assert new rollup type + const createdRollupType = await rollupManagerContract.rollupTypeMap(newRollupTypeID); + + const expectedRollupType = [ + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + false, + genesisRandom, + ]; + expect(createdRollupType).to.be.deep.equal(expectedRollupType); + + // obsoleteRollupType, take snapshot for it + const snapshot = await takeSnapshot(); + + await expect(rollupManagerContract.obsoleteRollupType(newRollupTypeID)).to.be.revertedWithCustomError( + rollupManagerContract, + "AddressDoNotHaveRequiredRole" + ); + + await expect(rollupManagerContract.connect(admin).obsoleteRollupType(newRollupTypeID)) + .to.emit(rollupManagerContract, "ObsoleteRollupType") + .withArgs(newRollupTypeID); + + expect([ + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + true, + genesisRandom, + ]).to.be.deep.equal(await rollupManagerContract.rollupTypeMap(newRollupTypeID)); + await snapshot.restore(); + + expect(expectedRollupType).to.be.deep.equal(await rollupManagerContract.rollupTypeMap(newRollupTypeID)); + // Create a + + // Only admin can create new zkEVMs + await expect( + rollupManagerContract.createNewRollup( + newRollupTypeID, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + gasTokenNetwork, + urlSequencer, + networkName + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); + + const newCreatedRollupID = 1; + const newZKEVMAddress = ethers.getCreateAddress({ + from: rollupManagerContract.target, + nonce: 1, + }); + + await expect( + rollupManagerContract + .connect(admin) + .createNewRollup( + newRollupTypeID, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + gasTokenNetwork, + urlSequencer, + networkName + ) + ) + .to.emit(rollupManagerContract, "CreateNewRollup") + .withArgs(newCreatedRollupID, newRollupTypeID, newZKEVMAddress, chainID); + }); + + it("Should test obsolete rollup", async () => { + const forkID = 0; + const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001"; + const rollupCompatibilityID = 0; + const descirption = "zkevm test"; + + // In order to create a new rollup type, create an implementation of the contract + + // Create zkEVM implementation + const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMV2"); + const PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy( + polygonZkEVMGlobalExitRoot.target, + polTokenContract.target, + polygonZkEVMBridgeContract.target, + rollupManagerContract.target + ); + await PolygonZKEVMV2Contract.waitForDeployment(); + + // Add a new rollup type with timelock + const newRollupTypeID = 1; + await expect( + rollupManagerContract + .connect(timelock) + .addNewRollupType( + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + genesisRandom, + rollupCompatibilityID, + descirption + ) + ) + .to.emit(rollupManagerContract, "AddNewRollupType") + .withArgs( + newRollupTypeID, + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + genesisRandom, + rollupCompatibilityID, + descirption + ); + + // assert new rollup type + const createdRollupType = await rollupManagerContract.rollupTypeMap(newRollupTypeID); + + const expectedRollupType = [ + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + false, + genesisRandom, + ]; + expect(createdRollupType).to.be.deep.equal(expectedRollupType); + + // obsoleteRollupType, take snapshot for it + await expect(rollupManagerContract.obsoleteRollupType(newRollupTypeID)).to.be.revertedWithCustomError( + rollupManagerContract, + "AddressDoNotHaveRequiredRole" + ); + + // Try to obsolete unexisting types + await expect(rollupManagerContract.connect(admin).obsoleteRollupType(0)).to.be.revertedWithCustomError( + rollupManagerContract, + "RollupTypeDoesNotExist" + ); + + await expect(rollupManagerContract.connect(admin).obsoleteRollupType(2)).to.be.revertedWithCustomError( + rollupManagerContract, + "RollupTypeDoesNotExist" + ); + + // added correctly + await expect(rollupManagerContract.connect(admin).obsoleteRollupType(newRollupTypeID)) + .to.emit(rollupManagerContract, "ObsoleteRollupType") + .withArgs(newRollupTypeID); + + // already obsolete + await expect( + rollupManagerContract.connect(admin).obsoleteRollupType(newRollupTypeID) + ).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeDoesNotExist"); + // Create a zkEVM + }); +}); From b268acd57a8befa823b39d58504c40a09ecb3689 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Sun, 8 Oct 2023 21:29:18 +0200 Subject: [PATCH 045/230] fix singature --- contracts/v2/PolygonRollupManager.sol | 1 + contracts/v2/lib/PolygonRollupBase.sol | 4 +- test/contractsv2/PolygonRollupManager.test.ts | 109 +++++++++++++++++- 3 files changed, 108 insertions(+), 6 deletions(-) diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index 2117583b6..a173965a4 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -832,6 +832,7 @@ contract PolygonRollupManager is rollup.lastVerifiedBatchBeforeUpgrade = getLastVerifiedBatch(rollupID); // Upgrade rollup + // review could check previosu implementatio through rollup prev type and avoid upgrade rollupContract.upgradeToAndCall( newRollupType.consensusImplementation, upgradeData diff --git a/contracts/v2/lib/PolygonRollupBase.sol b/contracts/v2/lib/PolygonRollupBase.sol index 826da4699..02073858e 100644 --- a/contracts/v2/lib/PolygonRollupBase.sol +++ b/contracts/v2/lib/PolygonRollupBase.sol @@ -102,7 +102,7 @@ contract PolygonRollupBase is // 1 nonce "0x80" + 1 gasPrice "0x80" + 5 gasLimit "0x8401c9c380" + 21 to "0x942a3dd3eb832af982ec71669e178424b10dca2ede" // + 1 value "0x80" + 1 stringLenLen "0xb8" (0xb7 + 1) + stringLen 1 "0x64" + 100 bytes data ( signature 4 bytes + 3parameters*32bytes) = 131 bytes (0x83) bytes public constant BASE_INITIALIZE_TX_BRIDGE = - "0xf88380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b864"; + hex"f88380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b864"; // Signature used to initialize the bridge @@ -807,9 +807,9 @@ contract PolygonRollupBase is bytes memory transaction = abi.encodePacked( bytesToSign, - SIGNATURE_INITIALIZE_TX_V, SIGNATURE_INITIALIZE_TX_R, SIGNATURE_INITIALIZE_TX_S, + SIGNATURE_INITIALIZE_TX_V, INITIALIZE_TX_EFFECTIVE_PERCENTAGE ); diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index bd8868c2b..656d672f6 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -7,8 +7,10 @@ import { PolygonRollupManagerMock, PolygonZkEVMGlobalExitRoot, PolygonZkEVMBridgeV2, + PolygonZkEVMV2, } from "../../typechain-types"; import {takeSnapshot, time} from "@nomicfoundation/hardhat-network-helpers"; +import {processorUtils} from "@0xpolygonhermez/zkevm-commonjs"; describe("Polygon ZK-EVM TestnetV2", () => { let deployer; @@ -32,6 +34,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { const pendingStateTimeoutDefault = 100; const trustedAggregatorTimeout = 100; + const FORCE_BATCH_TIMEOUT = 60 * 60 * 24 * 5; // 5 days let firstDeployment = true; @@ -286,12 +289,53 @@ describe("Polygon ZK-EVM TestnetV2", () => { ) ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); + // UNexisting rollupType + await expect( + rollupManagerContract + .connect(admin) + .createNewRollup( + 0, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + gasTokenNetwork, + urlSequencer, + networkName + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeDoesNotExist"); + + // Obsolete rollup type and test that fails + const snapshot2 = await takeSnapshot(); + await expect(rollupManagerContract.connect(admin).obsoleteRollupType(newRollupTypeID)) + .to.emit(rollupManagerContract, "ObsoleteRollupType") + .withArgs(newRollupTypeID); + + await expect( + rollupManagerContract + .connect(admin) + .createNewRollup( + newRollupTypeID, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + gasTokenNetwork, + urlSequencer, + networkName + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeObsolete"); + await snapshot2.restore(); + const newCreatedRollupID = 1; const newZKEVMAddress = ethers.getCreateAddress({ - from: rollupManagerContract.target, + from: rollupManagerContract.target as string, nonce: 1, }); + const newZkEVMContract = PolygonZKEVMV2Factory.attach(newZKEVMAddress) as PolygonZkEVMV2; + const newSequencedBatch = 1; + await expect( rollupManagerContract .connect(admin) @@ -307,7 +351,65 @@ describe("Polygon ZK-EVM TestnetV2", () => { ) ) .to.emit(rollupManagerContract, "CreateNewRollup") - .withArgs(newCreatedRollupID, newRollupTypeID, newZKEVMAddress, chainID); + .withArgs(newCreatedRollupID, newRollupTypeID, newZKEVMAddress, chainID) + .to.emit(newZkEVMContract, "SequenceBatches") + .withArgs(newSequencedBatch) + .to.emit(rollupManagerContract, "OnSequenceBatches") + .withArgs(newCreatedRollupID, newSequencedBatch); + + // Assert new rollup created + expect(await newZkEVMContract.admin()).to.be.equal(admin.address); + expect(await newZkEVMContract.trustedSequencer()).to.be.equal(trustedSequencer.address); + expect(await newZkEVMContract.trustedSequencerURL()).to.be.equal(urlSequencer); + expect(await newZkEVMContract.networkName()).to.be.equal(networkName); + expect(await newZkEVMContract.forceBatchTimeout()).to.be.equal(FORCE_BATCH_TIMEOUT); + expect(await newZkEVMContract.lastTimestamp()).to.be.equal( + (await ethers.provider.getBlock("latest"))?.timestamp + ); + + // calcualte accINputHash + expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(FORCE_BATCH_TIMEOUT); + + // Cannot create 2 chains with the same chainID + await expect( + rollupManagerContract + .connect(admin) + .createNewRollup( + newRollupTypeID, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + gasTokenNetwork, + urlSequencer, + networkName + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "ChainIDAlreadyExist"); + + const transaction = await newZkEVMContract.generateInitializeTransaction( + newCreatedRollupID, + gasTokenAddress, + gasTokenNetwork + ); + const txBase = await newZkEVMContract.BASE_INITIALIZE_TX_BRIDGE(); + + // Check transaction + const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeL2"); + const encodedData = bridgeL2Factory.interface.encodeFunctionData("initialize", [ + newCreatedRollupID, + gasTokenAddress, + gasTokenNetwork, + ]); + + const rawTx = processorUtils.customRawTxToRawTx(transaction); + const tx = ethers.Transaction.from(rawTx); + expect(tx.to).to.be.equal("0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe"); + expect(tx.value).to.be.equal(0); + expect(tx.data).to.be.equal(encodedData); + expect(tx.gasPrice).to.be.equal(0); + expect(tx.gasLimit).to.be.equal(30000000); + expect(tx.nonce).to.be.equal(0); + expect(tx.chainId).to.be.equal(0); }); it("Should test obsolete rollup", async () => { @@ -391,7 +493,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { // already obsolete await expect( rollupManagerContract.connect(admin).obsoleteRollupType(newRollupTypeID) - ).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeDoesNotExist"); - // Create a zkEVM + ).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeObsolete"); }); }); From 4481ff170824293713f26947c2b3c3925edd81ce Mon Sep 17 00:00:00 2001 From: invocamanman Date: Sun, 8 Oct 2023 22:14:15 +0200 Subject: [PATCH 046/230] test --- contracts/v2/PolygonRollupManager.sol | 30 +++++++ .../v2/mocks/PolygonRollupManagerMock.sol | 11 +++ test/contractsv2/PolygonRollupManager.test.ts | 78 +++++++++++++++++-- 3 files changed, 112 insertions(+), 7 deletions(-) diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index a173965a4..9085a486a 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -1928,4 +1928,34 @@ contract PolygonRollupManager is return false; } } + + /** + * @notice Get the last verified batch + */ + function getRollupBatchNumToStateRoot( + uint32 rollupID, + uint64 batchNum + ) public view returns (bytes32) { + return rollupIDToRollupData[rollupID].batchNumToStateRoot[batchNum]; + } + + /** + * @notice Get the last verified batch + */ + function getRollupSequencedBatches( + uint32 rollupID, + uint64 batchNum + ) public view returns (SequencedBatchData memory) { + return rollupIDToRollupData[rollupID].sequencedBatches[batchNum]; + } + + /** + * @notice Get the last verified batch + */ + function getRollupPendingStateTransitions( + uint32 rollupID, + uint64 batchNum + ) public view returns (PendingState memory) { + return rollupIDToRollupData[rollupID].pendingStateTransitions[batchNum]; + } } diff --git a/contracts/v2/mocks/PolygonRollupManagerMock.sol b/contracts/v2/mocks/PolygonRollupManagerMock.sol index f0403493e..52684fc04 100644 --- a/contracts/v2/mocks/PolygonRollupManagerMock.sol +++ b/contracts/v2/mocks/PolygonRollupManagerMock.sol @@ -64,4 +64,15 @@ contract PolygonRollupManagerMock is PolygonRollupManager { _setupRole(_EMERGENCY_COUNCIL_ROLE, emergencyCouncil); _setupRole(_EMERGENCY_COUNCIL_ADMIN, emergencyCouncil); } + + function prepareMockCalculateRoot(bytes32[] memory localExitRoots) public { + rollupCount = uint32(localExitRoots.length); + + // Add local Exit roots; + for (uint256 i = 0; i < localExitRoots.length; i++) { + rollupIDToRollupData[uint32(i)].lastLocalExitRoot = localExitRoots[ + i + ]; + } + } } diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index 656d672f6..82f9937fb 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -10,7 +10,11 @@ import { PolygonZkEVMV2, } from "../../typechain-types"; import {takeSnapshot, time} from "@nomicfoundation/hardhat-network-helpers"; -import {processorUtils} from "@0xpolygonhermez/zkevm-commonjs"; +import {processorUtils, contractUtils, MTBridge, mtBridgeUtils} from "@0xpolygonhermez/zkevm-commonjs"; +const {calculateSnarkInput, calculateAccInputHash, calculateBatchHashData} = contractUtils; + +const MerkleTreeBridge = MTBridge; +const {verifyMerkleProof, getLeafValue} = mtBridgeUtils; describe("Polygon ZK-EVM TestnetV2", () => { let deployer; @@ -358,17 +362,13 @@ describe("Polygon ZK-EVM TestnetV2", () => { .withArgs(newCreatedRollupID, newSequencedBatch); // Assert new rollup created + const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; expect(await newZkEVMContract.admin()).to.be.equal(admin.address); expect(await newZkEVMContract.trustedSequencer()).to.be.equal(trustedSequencer.address); expect(await newZkEVMContract.trustedSequencerURL()).to.be.equal(urlSequencer); expect(await newZkEVMContract.networkName()).to.be.equal(networkName); expect(await newZkEVMContract.forceBatchTimeout()).to.be.equal(FORCE_BATCH_TIMEOUT); - expect(await newZkEVMContract.lastTimestamp()).to.be.equal( - (await ethers.provider.getBlock("latest"))?.timestamp - ); - - // calcualte accINputHash - expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(FORCE_BATCH_TIMEOUT); + expect(await newZkEVMContract.lastTimestamp()).to.be.equal(timestampCreatedRollup); // Cannot create 2 chains with the same chainID await expect( @@ -410,6 +410,40 @@ describe("Polygon ZK-EVM TestnetV2", () => { expect(tx.gasLimit).to.be.equal(30000000); expect(tx.nonce).to.be.equal(0); expect(tx.chainId).to.be.equal(0); + + const expectedAccInputHash = calculateAccInputHash( + ethers.ZeroHash, + ethers.keccak256(transaction), + ethers.ZeroHash, + timestampCreatedRollup, + trustedSequencer.address + ); + // calcualte accINputHash + expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash); + + // Check mapping on rollup Manager + const rollupData = await rollupManagerContract.rollupIDToRollupData(newCreatedRollupID); + expect(rollupData.rollupContract).to.be.equal(newZKEVMAddress); + expect(rollupData.chainID).to.be.equal(chainID); + expect(rollupData.verifier).to.be.equal(verifierContract.target); + expect(rollupData.forkID).to.be.equal(forkID); + expect(rollupData.lastLocalExitRoot).to.be.equal(ethers.ZeroHash); + expect(rollupData.lastBatchSequenced).to.be.equal(newSequencedBatch); + expect(rollupData.lastVerifiedBatch).to.be.equal(0); + expect(rollupData.lastPendingState).to.be.equal(0); + expect(rollupData.lastPendingStateConsolidated).to.be.equal(0); + expect(rollupData.lastVerifiedBatchBeforeUpgrade).to.be.equal(0); + expect(rollupData.rollupTypeID).to.be.equal(1); + expect(rollupData.rollupCompatibilityID).to.be.equal(0); + + const sequencedBatchData = await rollupManagerContract.getRollupSequencedBatches( + newCreatedRollupID, + newSequencedBatch + ); + + expect(sequencedBatchData.accInputHash).to.be.equal(expectedAccInputHash); + expect(sequencedBatchData.sequencedTimestamp).to.be.equal(timestampCreatedRollup); + expect(sequencedBatchData.previousLastBatchSequenced).to.be.equal(0); }); it("Should test obsolete rollup", async () => { @@ -495,4 +529,34 @@ describe("Polygon ZK-EVM TestnetV2", () => { rollupManagerContract.connect(admin).obsoleteRollupType(newRollupTypeID) ).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeObsolete"); }); + + it("Should test global exit root", async () => { + const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001"; + const genesisRandom2 = "0x0000000000000000000000000000000000000000000000000000000000000001"; + + // In order to create a new rollup type, create an implementation of the contract + + async function testRollupExitRoot(rollupsRootsArray: any) { + const height = 32; + const merkleTree = new MerkleTreeBridge(height); + + await rollupManagerContract.prepareMockCalculateRoot(rollupsRootsArray); + for (let i = 0; i < rollupsRootsArray.length; i++) { + merkleTree.add(rollupsRootsArray[i]); + } + const rootSC = await rollupManagerContract.getRollupExitRoot(); + const rootJS = merkleTree.getRoot(); + console.log(rootSC, rootJS); + expect(rootSC).to.be.equal(rootJS); + } + + for (let i = 1; i < 100; i++) { + const newRootsArray = []; + for (let j = 0; j < i; j++) { + newRootsArray.push(ethers.toBeHex(ethers.toQuantity(ethers.randomBytes(32)), 32)); + } + console.log(newRootsArray); + await testRollupExitRoot(newRootsArray); + } + }); }); From d99d5ab295b6e132636589d7f53bfc68f68a1f54 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 9 Oct 2023 05:37:30 +0200 Subject: [PATCH 047/230] upsie --- contracts/v2/PolygonRollupManager.sol | 30 ++--- .../v2/mocks/PolygonRollupManagerMock.sol | 9 +- test/contractsv2/PolygonRollupManager.test.ts | 125 ++++++++++++++++-- 3 files changed, 134 insertions(+), 30 deletions(-) diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index 9085a486a..349aa849d 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -152,10 +152,14 @@ contract PolygonRollupManager is bytes32 internal constant _UPDATE_ROLLUP_ROLE = keccak256("UPDATE_ROLLUP_ROLE"); - // Trusted aggregator will be able to verify batches without extra delau + // Role that has priority to verify batches, also consolidates the state instantly bytes32 internal constant _TRUSTED_AGGREGATOR_ROLE = keccak256("TRUSTED_AGGREGATOR_ROLE"); + // Role to Set the Trusted aggregator + bytes32 internal constant _TRUSTED_AGGREGATOR_ROLE_ADMIN = + keccak256("TRUSTED_AGGREGATOR_ROLE_ADMIN"); + bytes32 internal constant _TWEAK_PARAMETERS_ROLE = keccak256("TWEAK_PARAMETERS_ROLE"); @@ -318,9 +322,6 @@ contract PolygonRollupManager is // Current matic fee per batch sequenced uint256 internal _batchFee; - // Address that has priority to verify batches, also consolidates the state instantly - address public trustedAggregator; - /** * @dev Emitted when a new rollup type is added */ @@ -468,7 +469,7 @@ contract PolygonRollupManager is } function initialize( - address _trustedAggregator, + address trustedAggregator, uint64 _pendingStateTimeout, uint64 _trustedAggregatorTimeout, address admin, @@ -477,7 +478,6 @@ contract PolygonRollupManager is PolygonZkEVMV2Upgraded polygonZkEVM, IVerifierRollup zkEVMVerifier ) external initializer { - trustedAggregator = _trustedAggregator; pendingStateTimeout = _pendingStateTimeout; trustedAggregatorTimeout = _trustedAggregatorTimeout; @@ -491,6 +491,9 @@ contract PolygonRollupManager is // setup roles + // trusted aggregator role + _setupRole(_TRUSTED_AGGREGATOR_ROLE, trustedAggregator); + // Timelock roles _setupRole(DEFAULT_ADMIN_ROLE, timelock); _setupRole(_ADD_ROLLUP_TYPE_ROLE, timelock); @@ -505,8 +508,9 @@ contract PolygonRollupManager is _setupRole(_OBSOLETE_ROLLUP_TYPE_ROLE, admin); _setupRole(_CREATE_ROLLUP_ROLE, admin); _setupRole(_STOP_EMERGENCY_ROLE, admin); - _setupRole(_TRUSTED_AGGREGATOR_ROLE, admin); _setupRole(_TWEAK_PARAMETERS_ROLE, admin); + _setRoleAdmin(_TRUSTED_AGGREGATOR_ROLE, _TRUSTED_AGGREGATOR_ROLE_ADMIN); + _setupRole(_TRUSTED_AGGREGATOR_ROLE_ADMIN, admin); // review Could be another address?¿ _setupRole(_SET_FEE_ROLE, admin); @@ -1584,18 +1588,6 @@ contract PolygonRollupManager is // admin functions ////////////////// - /** - * @notice Allow the admin to set a new trusted aggregator address - * @param newTrustedAggregator Address of the new trusted aggregator - */ - function setTrustedAggregator( - address newTrustedAggregator - ) external onlyRole(_TRUSTED_AGGREGATOR_ROLE) { - trustedAggregator = newTrustedAggregator; - - emit SetTrustedAggregator(newTrustedAggregator); - } - /** * @notice Allow the admin to set a new pending state timeout * The timeout can only be lowered, except if emergency state is active diff --git a/contracts/v2/mocks/PolygonRollupManagerMock.sol b/contracts/v2/mocks/PolygonRollupManagerMock.sol index 52684fc04..d043660d0 100644 --- a/contracts/v2/mocks/PolygonRollupManagerMock.sol +++ b/contracts/v2/mocks/PolygonRollupManagerMock.sol @@ -18,14 +18,13 @@ contract PolygonRollupManagerMock is PolygonRollupManager { ) PolygonRollupManager(_globalExitRootManager, _pol, _bridgeAddress) {} function initializeMock( - address _trustedAggregator, + address trustedAggregator, uint64 _pendingStateTimeout, uint64 _trustedAggregatorTimeout, address admin, address timelock, address emergencyCouncil ) external initializer { - trustedAggregator = _trustedAggregator; pendingStateTimeout = _pendingStateTimeout; trustedAggregatorTimeout = _trustedAggregatorTimeout; @@ -39,6 +38,9 @@ contract PolygonRollupManagerMock is PolygonRollupManager { // setup roles + // trusted aggregator role + _setupRole(_TRUSTED_AGGREGATOR_ROLE, trustedAggregator); + // Timelock roles _setupRole(DEFAULT_ADMIN_ROLE, timelock); _setupRole(_ADD_ROLLUP_TYPE_ROLE, timelock); @@ -53,8 +55,9 @@ contract PolygonRollupManagerMock is PolygonRollupManager { _setupRole(_OBSOLETE_ROLLUP_TYPE_ROLE, admin); _setupRole(_CREATE_ROLLUP_ROLE, admin); _setupRole(_STOP_EMERGENCY_ROLE, admin); - _setupRole(_TRUSTED_AGGREGATOR_ROLE, admin); _setupRole(_TWEAK_PARAMETERS_ROLE, admin); + _setRoleAdmin(_TRUSTED_AGGREGATOR_ROLE, _TRUSTED_AGGREGATOR_ROLE_ADMIN); + _setupRole(_TRUSTED_AGGREGATOR_ROLE_ADMIN, admin); // review Could be another address?¿ _setupRole(_SET_FEE_ROLE, admin); diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index 82f9937fb..8f9972053 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -8,23 +8,27 @@ import { PolygonZkEVMGlobalExitRoot, PolygonZkEVMBridgeV2, PolygonZkEVMV2, + PolygonRollupBase, } from "../../typechain-types"; import {takeSnapshot, time} from "@nomicfoundation/hardhat-network-helpers"; import {processorUtils, contractUtils, MTBridge, mtBridgeUtils} from "@0xpolygonhermez/zkevm-commonjs"; const {calculateSnarkInput, calculateAccInputHash, calculateBatchHashData} = contractUtils; +type BatchDataStruct = PolygonRollupBase.BatchDataStruct; + const MerkleTreeBridge = MTBridge; const {verifyMerkleProof, getLeafValue} = mtBridgeUtils; describe("Polygon ZK-EVM TestnetV2", () => { - let deployer; + let deployer: any; let timelock: any; let emergencyCouncil: any; let trustedAggregator: any; let trustedSequencer: any; let admin: any; - let verifierContract: VerifierRollupHelperMock; + let beneficiary: any; + let verifierContract: VerifierRollupHelperMock; let polygonZkEVMBridgeContract: PolygonZkEVMBridgeV2; let polTokenContract: ERC20PermitMock; let polygonZkEVMGlobalExitRoot: PolygonZkEVMGlobalExitRoot; @@ -50,6 +54,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { const ADD_EXISTING_ROLLUP_ROLE = ethers.id("ADD_EXISTING_ROLLUP_ROLE"); const UPDATE_ROLLUP_ROLE = ethers.id("UPDATE_ROLLUP_ROLE"); const TRUSTED_AGGREGATOR_ROLE = ethers.id("TRUSTED_AGGREGATOR_ROLE"); + const TRUSTED_AGGREGATOR_ROLE_ADMIN = ethers.id("TRUSTED_AGGREGATOR_ROLE_ADMIN"); const TWEAK_PARAMETERS_ROLE = ethers.id("TWEAK_PARAMETERS_ROLE"); const SET_FEE_ROLE = ethers.id("SET_FEE_ROLE"); const STOP_EMERGENCY_ROLE = ethers.id("STOP_EMERGENCY_ROLE"); @@ -60,7 +65,8 @@ describe("Polygon ZK-EVM TestnetV2", () => { upgrades.silenceWarnings(); // load signers - [deployer, trustedAggregator, trustedSequencer, admin, timelock, emergencyCouncil] = await ethers.getSigners(); + [deployer, trustedAggregator, trustedSequencer, admin, timelock, emergencyCouncil, beneficiary] = + await ethers.getSigners(); // deploy mock verifier const VerifierRollupHelperFactory = await ethers.getContractFactory("VerifierRollupHelperMock"); @@ -156,7 +162,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { expect(await rollupManagerContract.bridgeAddress()).to.be.equal(polygonZkEVMBridgeContract.target); expect(await rollupManagerContract.pendingStateTimeout()).to.be.equal(pendingStateTimeoutDefault); - expect(await rollupManagerContract.trustedAggregator()).to.be.equal(trustedAggregator.address); expect(await rollupManagerContract.trustedAggregatorTimeout()).to.be.equal(trustedAggregatorTimeout); expect(await rollupManagerContract.getBatchFee()).to.be.equal(ethers.parseEther("0.1")); @@ -168,12 +173,17 @@ describe("Polygon ZK-EVM TestnetV2", () => { expect(await rollupManagerContract.hasRole(UPDATE_ROLLUP_ROLE, timelock.address)).to.be.equal(true); expect(await rollupManagerContract.hasRole(ADD_EXISTING_ROLLUP_ROLE, timelock.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(TRUSTED_AGGREGATOR_ROLE, trustedAggregator.address)).to.be.equal( + true + ); + expect(await rollupManagerContract.hasRole(OBSOLETE_ROLLUP_TYPE_ROLE, admin.address)).to.be.equal(true); expect(await rollupManagerContract.hasRole(CREATE_ROLLUP_ROLE, admin.address)).to.be.equal(true); - expect(await rollupManagerContract.hasRole(TRUSTED_AGGREGATOR_ROLE, admin.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(TRUSTED_AGGREGATOR_ROLE_ADMIN, admin.address)).to.be.equal(true); expect(await rollupManagerContract.hasRole(TWEAK_PARAMETERS_ROLE, admin.address)).to.be.equal(true); expect(await rollupManagerContract.hasRole(SET_FEE_ROLE, admin.address)).to.be.equal(true); expect(await rollupManagerContract.hasRole(STOP_EMERGENCY_ROLE, admin.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(EMERGENCY_COUNCIL_ROLE, emergencyCouncil.address)).to.be.equal(true); expect(await rollupManagerContract.hasRole(EMERGENCY_COUNCIL_ADMIN, emergencyCouncil.address)).to.be.equal( true @@ -444,6 +454,105 @@ describe("Polygon ZK-EVM TestnetV2", () => { expect(sequencedBatchData.accInputHash).to.be.equal(expectedAccInputHash); expect(sequencedBatchData.sequencedTimestamp).to.be.equal(timestampCreatedRollup); expect(sequencedBatchData.previousLastBatchSequenced).to.be.equal(0); + + // try verify batches + const l2txData = "0x123456"; + const maticAmount = await rollupManagerContract.getBatchFee(); + const currentTimestamp = (await ethers.provider.getBlock("latest"))?.timestamp; + + const sequence = { + transactions: l2txData, + globalExitRoot: ethers.ZeroHash, + timestamp: currentTimestamp, + minForcedTimestamp: 0, + } as BatchDataStruct; + + // Approve tokens + await expect(polTokenContract.connect(trustedSequencer).approve(newZkEVMContract.target, maticAmount)).to.emit( + polTokenContract, + "Approval" + ); + + // Sequence Batches + await expect(newZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address)) + .to.emit(newZkEVMContract, "SequenceBatches") + .withArgs(newSequencedBatch + 1); + + // trustedAggregator forge the batch + const pendingState = 0; + const newLocalExitRoot = "0x1230000000000000000000000000000000000000000000000000000000000000"; + const newStateRoot = "0x0000000000000000000000000000000000000000000000000000000000000123"; + const newVerifiedBatch = newSequencedBatch + 1; + const zkProofFFlonk = new Array(24).fill(ethers.ZeroHash); + const currentVerifiedBatch = 0; + + const initialAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); + await expect( + rollupManagerContract + .connect(deployer) + .verifyBatchesTrustedAggregator( + newCreatedRollupID, + pendingState, + currentVerifiedBatch, + newVerifiedBatch, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); + + await expect( + rollupManagerContract + .connect(trustedAggregator) + .verifyBatchesTrustedAggregator( + newCreatedRollupID, + pendingState, + currentVerifiedBatch, + currentVerifiedBatch, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "FinalNumBatchBelowLastVerifiedBatch"); + + await expect( + rollupManagerContract + .connect(trustedAggregator) + .verifyBatchesTrustedAggregator( + newCreatedRollupID, + pendingState, + currentVerifiedBatch, + 3, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "NewAccInputHashDoesNotExist"); + + // Verify batch + await expect( + rollupManagerContract + .connect(trustedAggregator) + .verifyBatchesTrustedAggregator( + newCreatedRollupID, + pendingState, + currentVerifiedBatch, + newVerifiedBatch, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ) + .to.emit(rollupManagerContract, "VerifyBatchesTrustedAggregator") + .withArgs(newCreatedRollupID, newVerifiedBatch, newStateRoot, trustedAggregator.address); + + const finalAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); + + expect(finalAggregatorMatic).to.equal(initialAggregatorMatic + maticAmount); }); it("Should test obsolete rollup", async () => { @@ -546,16 +655,16 @@ describe("Polygon ZK-EVM TestnetV2", () => { } const rootSC = await rollupManagerContract.getRollupExitRoot(); const rootJS = merkleTree.getRoot(); - console.log(rootSC, rootJS); + //console.log(rootSC, rootJS); expect(rootSC).to.be.equal(rootJS); } - for (let i = 1; i < 100; i++) { + // put 100 + for (let i = 1; i < 1; i++) { const newRootsArray = []; for (let j = 0; j < i; j++) { newRootsArray.push(ethers.toBeHex(ethers.toQuantity(ethers.randomBytes(32)), 32)); } - console.log(newRootsArray); await testRollupExitRoot(newRootsArray); } }); From 50fe1a62071d79b50022925468fd2415dfa0d6ce Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 9 Oct 2023 06:12:43 +0200 Subject: [PATCH 048/230] upsie v2 --- contracts/v2/PolygonRollupManager.sol | 2 +- test/contractsv2/PolygonRollupManager.test.ts | 33 ++++++++++++++++--- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index 349aa849d..d839537ac 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -1692,7 +1692,7 @@ contract PolygonRollupManager is // In the first iteration the nodes will be the leafs which are the local exit roots of each network for (uint256 i = 0; i < currentNodes; i++) { - tmpTree[i] = rollupIDToRollupData[uint32(i)].lastLocalExitRoot; + tmpTree[i] = rollupIDToRollupData[uint32(i + 1)].lastLocalExitRoot; } // This variable will keep track of the zero hashes diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index 8f9972053..37a747f1e 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -19,6 +19,10 @@ type BatchDataStruct = PolygonRollupBase.BatchDataStruct; const MerkleTreeBridge = MTBridge; const {verifyMerkleProof, getLeafValue} = mtBridgeUtils; +function calculateGlobalExitRoot(mainnetExitRoot: any, rollupExitRoot: any) { + return ethers.solidityPackedKeccak256(["bytes32", "bytes32"], [mainnetExitRoot, rollupExitRoot]); +} + describe("Polygon ZK-EVM TestnetV2", () => { let deployer: any; let timelock: any; @@ -478,6 +482,16 @@ describe("Polygon ZK-EVM TestnetV2", () => { .to.emit(newZkEVMContract, "SequenceBatches") .withArgs(newSequencedBatch + 1); + const expectedAccInputHash2 = calculateAccInputHash( + expectedAccInputHash, + ethers.keccak256(l2txData), + ethers.ZeroHash, + currentTimestamp, + trustedSequencer.address + ); + // calcualte accINputHash + expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash2); + // trustedAggregator forge the batch const pendingState = 0; const newLocalExitRoot = "0x1230000000000000000000000000000000000000000000000000000000000000"; @@ -532,6 +546,12 @@ describe("Polygon ZK-EVM TestnetV2", () => { ) ).to.be.revertedWithCustomError(rollupManagerContract, "NewAccInputHashDoesNotExist"); + // Calcualte new globalExitroot + const height = 32; + const merkleTree = new MerkleTreeBridge(height); + merkleTree.add(newLocalExitRoot); + const rootJS = merkleTree.getRoot(); + // Verify batch await expect( rollupManagerContract @@ -548,11 +568,19 @@ describe("Polygon ZK-EVM TestnetV2", () => { ) ) .to.emit(rollupManagerContract, "VerifyBatchesTrustedAggregator") - .withArgs(newCreatedRollupID, newVerifiedBatch, newStateRoot, trustedAggregator.address); + .withArgs(newCreatedRollupID, newVerifiedBatch, newStateRoot, trustedAggregator.address) + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .withArgs(ethers.ZeroHash, rootJS); + + expect(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()).to.be.equal( + calculateGlobalExitRoot(ethers.ZeroHash, rootJS) + ); const finalAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); expect(finalAggregatorMatic).to.equal(initialAggregatorMatic + maticAmount); + + // Assert global exit root }); it("Should test obsolete rollup", async () => { @@ -640,9 +668,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { }); it("Should test global exit root", async () => { - const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001"; - const genesisRandom2 = "0x0000000000000000000000000000000000000000000000000000000000000001"; - // In order to create a new rollup type, create an implementation of the contract async function testRollupExitRoot(rollupsRootsArray: any) { From fec71d4c42b49bb615e9de6998db9a37e0872fc6 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 9 Oct 2023 06:32:10 +0200 Subject: [PATCH 049/230] update test --- .vscode/settings.json | 14 +- .../v2/mocks/PolygonRollupManagerMock.sol | 5 +- hardhat.config.ts | 372 +++++++++--------- test/contractsv2/PolygonRollupManager.test.ts | 14 +- 4 files changed, 207 insertions(+), 198 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index d35333a5d..822a36ad4 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,16 @@ { - "editor.formatOnSave": false, + "editor.formatOnSave": true, "solidity.linter": "solhint", "solidity.compileUsingRemoteVersion": "v0.8.20+commit.e14f2714", - "solidity.remappings": ["@openzeppelin/=node_modules/@openzeppelin"], + "solidity.remappings": [ + "@openzeppelin/=node_modules/@openzeppelin" + ], + "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true + }, + "[solidity]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true + }, } diff --git a/contracts/v2/mocks/PolygonRollupManagerMock.sol b/contracts/v2/mocks/PolygonRollupManagerMock.sol index d043660d0..63156ade8 100644 --- a/contracts/v2/mocks/PolygonRollupManagerMock.sol +++ b/contracts/v2/mocks/PolygonRollupManagerMock.sol @@ -73,9 +73,8 @@ contract PolygonRollupManagerMock is PolygonRollupManager { // Add local Exit roots; for (uint256 i = 0; i < localExitRoots.length; i++) { - rollupIDToRollupData[uint32(i)].lastLocalExitRoot = localExitRoots[ - i - ]; + rollupIDToRollupData[uint32(i + 1)] + .lastLocalExitRoot = localExitRoots[i]; } } } diff --git a/hardhat.config.ts b/hardhat.config.ts index bd9e921c9..634ef9e9a 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -1,11 +1,11 @@ -import 'dotenv/config' -import '@nomicfoundation/hardhat-toolbox' -import '@openzeppelin/hardhat-upgrades' -import 'hardhat-dependency-compiler' +import "dotenv/config"; +import "@nomicfoundation/hardhat-toolbox"; +import "@openzeppelin/hardhat-upgrades"; +import "hardhat-dependency-compiler"; -import { HardhatUserConfig } from 'hardhat/config' +import {HardhatUserConfig} from "hardhat/config"; -const DEFAULT_MNEMONIC = 'test test test test test test test test test test test junk' +const DEFAULT_MNEMONIC = "test test test test test test test test test test test junk"; /* * You need to export an object to set up your config @@ -17,192 +17,192 @@ const DEFAULT_MNEMONIC = 'test test test test test test test test test test test */ const config: HardhatUserConfig = { - dependencyCompiler: { - paths: [ - '@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol', - '@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol', - '@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol', - ], // , - // keep: true - }, - solidity: { - compilers: [ - { - version: '0.8.20', - settings: { - optimizer: { - enabled: true, - runs: 999999, - }, - evmVersion: 'shanghai', + dependencyCompiler: { + paths: [ + "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol", + "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol", + "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol", + ], // , + // keep: true + }, + solidity: { + compilers: [ + { + version: "0.8.20", + settings: { + optimizer: { + enabled: true, + runs: 999999, + }, + evmVersion: "shanghai", + }, + }, + { + version: "0.6.11", + settings: { + optimizer: { + enabled: true, + runs: 999999, + }, + }, + }, + { + version: "0.5.12", + settings: { + optimizer: { + enabled: true, + runs: 999999, + }, + }, + }, + { + version: "0.5.16", + settings: { + optimizer: { + enabled: true, + runs: 999999, + }, + }, + }, + ], + overrides: { + "contracts/v2/PolygonRollupManager.sol": { + version: "0.8.20", + settings: { + optimizer: { + enabled: true, + runs: 99, + }, + evmVersion: "shanghai", + }, // try yul optimizer + }, + "contracts/v2/L2/PolygonZkEVMBridgeL2.sol": { + version: "0.8.20", + settings: { + optimizer: { + enabled: true, + runs: 9999, + }, + evmVersion: "shanghai", + }, + }, }, - }, - { - version: '0.6.11', - settings: { - optimizer: { - enabled: true, - runs: 999999, - }, + }, + networks: { + mainnet: { + url: process.env.MAINNET_PROVIDER + ? process.env.MAINNET_PROVIDER + : `https://mainnet.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, }, - }, - { - version: '0.5.12', - settings: { - optimizer: { - enabled: true, - runs: 999999, - }, + ropsten: { + url: process.env.ROPSTEN_PROVIDER + ? process.env.ROPSTEN_PROVIDER + : `https://ropsten.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, }, - }, - { - version: '0.5.16', - settings: { - optimizer: { - enabled: true, - runs: 999999, - }, + goerli: { + url: process.env.GOERLI_PROVIDER + ? process.env.GOERLI_PROVIDER + : `https://goerli.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, }, - }, - ], - overrides: { - 'contracts/v2/PolygonRollupManager.sol': { - version: '0.8.20', - settings: { - optimizer: { - enabled: true, - runs: 99, - }, - evmVersion: 'shanghai', - }, // try yul optimizer - }, - 'contracts/v2/L2/PolygonZkEVMBridgeL2.sol': { - version: '0.8.20', - settings: { - optimizer: { - enabled: true, - runs: 9999, - }, - evmVersion: 'shanghai', + rinkeby: { + url: process.env.RINKEBY_PROVIDER + ? process.env.RINKEBY_PROVIDER + : `https://rinkeby.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, + }, + localhost: { + url: "http://127.0.0.1:8545", + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, + }, + hardhat: { + initialDate: "0", + allowUnlimitedContractSize: true, + initialBaseFeePerGas: 0, + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, + }, + polygonZKEVMTestnet: { + url: "https://rpc.public.zkevm-test.net", + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, + }, + polygonZKEVMMainnet: { + url: "https://zkevm-rpc.com", + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, }, - }, - }, - }, - networks: { - mainnet: { - url: process.env.MAINNET_PROVIDER - ? process.env.MAINNET_PROVIDER - : `https://mainnet.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, - accounts: { - mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, - path: "m/44'/60'/0'/0", - initialIndex: 0, - count: 20, - }, - }, - ropsten: { - url: process.env.ROPSTEN_PROVIDER - ? process.env.ROPSTEN_PROVIDER - : `https://ropsten.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, - accounts: { - mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, - path: "m/44'/60'/0'/0", - initialIndex: 0, - count: 20, - }, - }, - goerli: { - url: process.env.GOERLI_PROVIDER - ? process.env.GOERLI_PROVIDER - : `https://goerli.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, - accounts: { - mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, - path: "m/44'/60'/0'/0", - initialIndex: 0, - count: 20, - }, - }, - rinkeby: { - url: process.env.RINKEBY_PROVIDER - ? process.env.RINKEBY_PROVIDER - : `https://rinkeby.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, - accounts: { - mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, - path: "m/44'/60'/0'/0", - initialIndex: 0, - count: 20, - }, - }, - localhost: { - url: 'http://127.0.0.1:8545', - accounts: { - mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, - path: "m/44'/60'/0'/0", - initialIndex: 0, - count: 20, - }, - }, - hardhat: { - initialDate: '0', - allowUnlimitedContractSize: true, - initialBaseFeePerGas: '0', - accounts: { - mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, - path: "m/44'/60'/0'/0", - initialIndex: 0, - count: 20, - }, - }, - polygonZKEVMTestnet: { - url: 'https://rpc.public.zkevm-test.net', - accounts: { - mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, - path: "m/44'/60'/0'/0", - initialIndex: 0, - count: 20, - }, - }, - polygonZKEVMMainnet: { - url: 'https://zkevm-rpc.com', - accounts: { - mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, - path: "m/44'/60'/0'/0", - initialIndex: 0, - count: 20, - }, }, - }, - gasReporter: { - enabled: !!process.env.REPORT_GAS, - outputFile: process.env.REPORT_GAS_FILE ? './gas_report.md' : null, - noColors: !!process.env.REPORT_GAS_FILE, - }, - etherscan: { - apiKey: { - polygonZKEVMTestnet: `${process.env.ETHERSCAN_ZKEVM_API_KEY}`, - polygonZKEVMMainnet: `${process.env.ETHERSCAN_ZKEVM_API_KEY}`, - goerli: `${process.env.ETHERSCAN_API_KEY}`, - mainnet: `${process.env.ETHERSCAN_API_KEY}`, + gasReporter: { + enabled: !!process.env.REPORT_GAS, + outputFile: process.env.REPORT_GAS_FILE ? "./gas_report.md" : undefined, + noColors: !!process.env.REPORT_GAS_FILE, }, - customChains: [ - { - network: 'polygonZKEVMMainnet', - chainId: 1101, - urls: { - apiURL: 'https://api-zkevm.polygonscan.com/api', - browserURL: 'https://zkevm.polygonscan.com/', + etherscan: { + apiKey: { + polygonZKEVMTestnet: `${process.env.ETHERSCAN_ZKEVM_API_KEY}`, + polygonZKEVMMainnet: `${process.env.ETHERSCAN_ZKEVM_API_KEY}`, + goerli: `${process.env.ETHERSCAN_API_KEY}`, + mainnet: `${process.env.ETHERSCAN_API_KEY}`, }, - }, - { - network: 'polygonZKEVMTestnet', - chainId: 1442, - urls: { - apiURL: 'https://api-testnet-zkevm.polygonscan.com/api', - browserURL: 'https://testnet-zkevm.polygonscan.com/', - }, - }, - ], - }, -} + customChains: [ + { + network: "polygonZKEVMMainnet", + chainId: 1101, + urls: { + apiURL: "https://api-zkevm.polygonscan.com/api", + browserURL: "https://zkevm.polygonscan.com/", + }, + }, + { + network: "polygonZKEVMTestnet", + chainId: 1442, + urls: { + apiURL: "https://api-testnet-zkevm.polygonscan.com/api", + browserURL: "https://testnet-zkevm.polygonscan.com/", + }, + }, + ], + }, +}; -export default config +export default config; diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index 37a747f1e..ed89ce4ba 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -572,15 +572,17 @@ describe("Polygon ZK-EVM TestnetV2", () => { .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") .withArgs(ethers.ZeroHash, rootJS); - expect(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()).to.be.equal( - calculateGlobalExitRoot(ethers.ZeroHash, rootJS) - ); - const finalAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); expect(finalAggregatorMatic).to.equal(initialAggregatorMatic + maticAmount); // Assert global exit root + expect(await polygonZkEVMGlobalExitRoot.lastRollupExitRoot()).to.be.equal(rootJS); + expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(ethers.ZeroHash); + + expect(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()).to.be.equal( + calculateGlobalExitRoot(ethers.ZeroHash, rootJS) + ); }); it("Should test obsolete rollup", async () => { @@ -669,7 +671,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { it("Should test global exit root", async () => { // In order to create a new rollup type, create an implementation of the contract - async function testRollupExitRoot(rollupsRootsArray: any) { const height = 32; const merkleTree = new MerkleTreeBridge(height); @@ -680,12 +681,11 @@ describe("Polygon ZK-EVM TestnetV2", () => { } const rootSC = await rollupManagerContract.getRollupExitRoot(); const rootJS = merkleTree.getRoot(); - //console.log(rootSC, rootJS); expect(rootSC).to.be.equal(rootJS); } // put 100 - for (let i = 1; i < 1; i++) { + for (let i = 1; i < 100; i++) { const newRootsArray = []; for (let j = 0; j < i; j++) { newRootsArray.push(ethers.toBeHex(ethers.toQuantity(ethers.randomBytes(32)), 32)); From 4b0b3166434c252d2be69b9aa2c0a88a0a91d7d0 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 9 Oct 2023 09:30:33 +0200 Subject: [PATCH 050/230] comments and test --- contracts/PolygonZkEVMBridge.sol | 4 + contracts/v2/PolygonRollupManager.sol | 4 +- contracts/v2/PolygonZkEVMBridgeV2.sol | 4 + test/contractsv2/PolygonRollupManager.test.ts | 169 ++++++++++++++++-- 4 files changed, 167 insertions(+), 14 deletions(-) diff --git a/contracts/PolygonZkEVMBridge.sol b/contracts/PolygonZkEVMBridge.sol index 08488d488..1892f6b26 100644 --- a/contracts/PolygonZkEVMBridge.sol +++ b/contracts/PolygonZkEVMBridge.sol @@ -132,6 +132,10 @@ contract PolygonZkEVMBridge is /** * @notice 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 * @param destinationNetwork Network destination * @param destinationAddress Address destination * @param amount Amount of tokens diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index d839537ac..eb191518a 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -836,7 +836,7 @@ contract PolygonRollupManager is rollup.lastVerifiedBatchBeforeUpgrade = getLastVerifiedBatch(rollupID); // Upgrade rollup - // review could check previosu implementatio through rollup prev type and avoid upgrade + // review could check previous implementatio through rollup prev type and avoid upgrade rollupContract.upgradeToAndCall( newRollupType.consensusImplementation, upgradeData @@ -1270,7 +1270,7 @@ contract PolygonRollupManager is proof ); - // Consolidate state state + // Consolidate state rollup.lastVerifiedBatch = finalNewBatch; rollup.batchNumToStateRoot[finalNewBatch] = newStateRoot; rollup.lastLocalExitRoot = newLocalExitRoot; diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index e33a8a812..b2bf49fd1 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -141,6 +141,10 @@ contract PolygonZkEVMBridgeV2 is /** * @notice 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 * @param destinationNetwork Network destination * @param destinationAddress Address destination * @param amount Amount of tokens diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index ed89ce4ba..f4e2863ec 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -9,6 +9,7 @@ import { PolygonZkEVMBridgeV2, PolygonZkEVMV2, PolygonRollupBase, + TokenWrapped, } from "../../typechain-types"; import {takeSnapshot, time} from "@nomicfoundation/hardhat-network-helpers"; import {processorUtils, contractUtils, MTBridge, mtBridgeUtils} from "@0xpolygonhermez/zkevm-commonjs"; @@ -42,12 +43,17 @@ describe("Polygon ZK-EVM TestnetV2", () => { const polTokenSymbol = "POL"; const polTokenInitialBalance = ethers.parseEther("20000000"); - const networkIDMainnet = 0; - const pendingStateTimeoutDefault = 100; const trustedAggregatorTimeout = 100; const FORCE_BATCH_TIMEOUT = 60 * 60 * 24 * 5; // 5 days + // BRidge constants + const networkIDMainnet = 0; + const networkIDRollup = 1; + + const LEAF_TYPE_ASSET = 0; + const LEAF_TYPE_MESSAGE = 1; + let firstDeployment = true; //roles @@ -194,7 +200,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { ); }); - it("should add a new rollup type zkEVM", async () => { + it("should check full flow", async () => { const urlSequencer = "http://zkevm-json-rpc:8123"; const chainID = 1000; const networkName = "zkevm"; @@ -492,9 +498,47 @@ describe("Polygon ZK-EVM TestnetV2", () => { // calcualte accINputHash expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash2); + // Create a new local exit root mocking some bridge + const tokenName = "Matic Token"; + const tokenSymbol = "MATIC"; + const decimals = 18; + const metadataToken = ethers.AbiCoder.defaultAbiCoder().encode( + ["string", "string", "uint8"], + [tokenName, tokenSymbol, decimals] + ); + + const originNetwork = networkIDRollup; + const tokenAddress = ethers.getAddress(ethers.hexlify(ethers.randomBytes(20))); + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDMainnet; + const destinationAddress = beneficiary.address; + const metadata = metadataToken; // since we are inserting in the exit root can be anything + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + // compute root merkle tree in Js + const height = 32; + const merkleTreezkEVM = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + + // Add 2 leafs + merkleTreezkEVM.add(leafValue); + merkleTreezkEVM.add(leafValue); + + // check merkle root with SC + const rootzkEVM = merkleTreezkEVM.getRoot(); + + // TODO // trustedAggregator forge the batch const pendingState = 0; - const newLocalExitRoot = "0x1230000000000000000000000000000000000000000000000000000000000000"; + const newLocalExitRoot = rootzkEVM; const newStateRoot = "0x0000000000000000000000000000000000000000000000000000000000000123"; const newVerifiedBatch = newSequencedBatch + 1; const zkProofFFlonk = new Array(24).fill(ethers.ZeroHash); @@ -547,10 +591,9 @@ describe("Polygon ZK-EVM TestnetV2", () => { ).to.be.revertedWithCustomError(rollupManagerContract, "NewAccInputHashDoesNotExist"); // Calcualte new globalExitroot - const height = 32; - const merkleTree = new MerkleTreeBridge(height); - merkleTree.add(newLocalExitRoot); - const rootJS = merkleTree.getRoot(); + const merkleTreeRollups = new MerkleTreeBridge(height); + merkleTreeRollups.add(newLocalExitRoot); + const rootRollups = merkleTreeRollups.getRoot(); // Verify batch await expect( @@ -570,19 +613,121 @@ describe("Polygon ZK-EVM TestnetV2", () => { .to.emit(rollupManagerContract, "VerifyBatchesTrustedAggregator") .withArgs(newCreatedRollupID, newVerifiedBatch, newStateRoot, trustedAggregator.address) .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") - .withArgs(ethers.ZeroHash, rootJS); + .withArgs(ethers.ZeroHash, rootRollups); const finalAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); expect(finalAggregatorMatic).to.equal(initialAggregatorMatic + maticAmount); // Assert global exit root - expect(await polygonZkEVMGlobalExitRoot.lastRollupExitRoot()).to.be.equal(rootJS); + expect(await polygonZkEVMGlobalExitRoot.lastRollupExitRoot()).to.be.equal(rootRollups); expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(ethers.ZeroHash); expect(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()).to.be.equal( - calculateGlobalExitRoot(ethers.ZeroHash, rootJS) + calculateGlobalExitRoot(ethers.ZeroHash, rootRollups) ); + + const indexLeaf = 0; + const proofZkEVM = merkleTreezkEVM.getProofTreeByIndex(indexLeaf); + const proofRollups = merkleTreeRollups.getProofTreeByIndex(indexLeaf); + + // verify merkle proof + expect(verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM)).to.be.equal(true); + expect(verifyMerkleProof(rootzkEVM, proofRollups, indexLeaf, rootRollups)).to.be.equal(true); + + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM) + ).to.be.equal(true); + + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(newLocalExitRoot, proofRollups, indexLeaf, rootRollups) + ).to.be.equal(true); + + // claim + const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); + // create2 parameters + const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]); + const minimalBytecodeProxy = tokenWrappedFactory.bytecode; + const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]); + const precalculateWrappedErc20 = await ethers.getCreate2Address( + polygonZkEVMBridgeContract.target as string, + salt, + hashInitCode + ); + const newWrappedToken = tokenWrappedFactory.attach(precalculateWrappedErc20) as TokenWrapped; + + // Use precalculatedWrapperAddress and check if matches + expect( + await polygonZkEVMBridgeContract.precalculatedWrapperAddress( + networkIDRollup, + tokenAddress, + tokenName, + tokenSymbol, + decimals + ) + ).to.be.equal(precalculateWrappedErc20); + + // index leaf is 0 bc, doe snot have mainnet flag, and it's rollup 0 on leaf 0 + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofZkEVM, + proofRollups, + indexLeaf, + ethers.ZeroHash, + rootRollups, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ) + .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") + .withArgs(indexLeaf, originNetwork, tokenAddress, destinationAddress, amount) + .to.emit(polygonZkEVMBridgeContract, "NewWrappedToken") + .withArgs(originNetwork, tokenAddress, precalculateWrappedErc20, metadata) + .to.emit(newWrappedToken, "Transfer") + .withArgs(ethers.ZeroAddress, beneficiary.address, amount); + + // Assert maps created + const newTokenInfo = await polygonZkEVMBridgeContract.wrappedTokenToTokenInfo(precalculateWrappedErc20); + + expect(newTokenInfo.originNetwork).to.be.equal(networkIDRollup); + expect(newTokenInfo.originTokenAddress).to.be.equal(tokenAddress); + expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( + precalculateWrappedErc20 + ); + expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( + precalculateWrappedErc20 + ); + + expect(await polygonZkEVMBridgeContract.tokenInfoToWrappedToken(salt)).to.be.equal(precalculateWrappedErc20); + + // Check the wrapper info + expect(await newWrappedToken.name()).to.be.equal(tokenName); + expect(await newWrappedToken.symbol()).to.be.equal(tokenSymbol); + expect(await newWrappedToken.decimals()).to.be.equal(decimals); + + // Can't claim because nullifier + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofZkEVM, + proofRollups, + indexLeaf, + ethers.ZeroHash, + rootRollups, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AlreadyClaimed"); + + // Check new token + expect(await newWrappedToken.totalSupply()).to.be.equal(amount); }); it("Should test obsolete rollup", async () => { @@ -685,7 +830,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { } // put 100 - for (let i = 1; i < 100; i++) { + for (let i = 1; i < 4; i++) { const newRootsArray = []; for (let j = 0; j < i; j++) { newRootsArray.push(ethers.toBeHex(ethers.toQuantity(ethers.randomBytes(32)), 32)); From 0d79170588dafa8b25702903c6feb965b890bd67 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 9 Oct 2023 12:19:07 +0200 Subject: [PATCH 051/230] update event info --- contracts/v2/L2/PolygonZkEVMBridgeL2.sol | 11 +- contracts/v2/PolygonRollupManager.sol | 46 +- contracts/v2/PolygonZkEVMBridgeV2.sol | 3 - ...pgraded.sol => PolygonZkEVMV2Existent.sol} | 4 +- .../v2/interfaces/IPolygonRollupBase.sol | 4 +- .../v2/interfaces/IPolygonZkEVMV2Errors.sol | 5 + contracts/v2/lib/PolygonRollupBase.sol | 51 +- test/contractsv2/BridgeV2.test.ts | 1400 +++++++++++++++++ test/contractsv2/PolygonRollupManager.test.ts | 4 +- 9 files changed, 1487 insertions(+), 41 deletions(-) rename contracts/v2/consensus/zkEVM/{PolygonZkEVMV2Upgraded.sol => PolygonZkEVMV2Existent.sol} (94%) create mode 100644 test/contractsv2/BridgeV2.test.ts diff --git a/contracts/v2/L2/PolygonZkEVMBridgeL2.sol b/contracts/v2/L2/PolygonZkEVMBridgeL2.sol index 1a4904ebc..3ad7b3984 100644 --- a/contracts/v2/L2/PolygonZkEVMBridgeL2.sol +++ b/contracts/v2/L2/PolygonZkEVMBridgeL2.sol @@ -40,9 +40,6 @@ contract PolygonZkEVMBridgeL2 is DepositContractV2, IPolygonZkEVMBridgeL2 { // ZkEVM identifier uint32 private constant _ZKEVM_NETWORK_ID = 1; - // Number of networks supported by the bridge - uint32 private constant _CURRENT_SUPPORTED_NETWORKS = 2; - // Leaf type asset uint8 private constant _LEAF_TYPE_ASSET = 0; @@ -87,10 +84,10 @@ contract PolygonZkEVMBridgeL2 is DepositContractV2, IPolygonZkEVMBridgeL2 { /** * @param _networkID networkID - * @param _gasTokenAddress networkID - * @param _gasTokenNetwork networkID - * @notice The value of `_polygonZkEVMaddress` on the L2 deployment of the contract will be address(0), so - * emergency state is not possible for the L2 deployment of the bridge, intentionally + * @param _gasTokenAddress gas token address + * @param _gasTokenNetwork gas token network + * @notice This function will be called in the first batch of the zkEVM, the inicialize transaction + * must be sequenced by the consensus smart contract */ function initialize( uint32 _networkID, diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index eb191518a..538604fc8 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -11,10 +11,12 @@ import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeab import "./lib/PolygonTransparentProxy.sol"; import "./lib/PolygonAccessControlUpgradeable.sol"; import "../interfaces/IVerifierRollup.sol"; -import "./consensus/zkEVM/PolygonZkEVMV2Upgraded.sol"; +import "./consensus/zkEVM/PolygonZkEVMV2Existent.sol"; // review check contract slots! // review Update OZ libs, new transaparent proxy is cheaper, but admin immutable + +// legacy storage slots base /** * Contract responsible for managing the exit roots across multiple Rollups */ @@ -347,7 +349,9 @@ contract PolygonRollupManager is uint32 indexed rollupID, uint32 rollupTypeID, address rollupAddress, - uint64 chainID + uint64 chainID, + address gasTokenAddress, + uint32 gasTokenNetwork ); /** @@ -382,6 +386,7 @@ contract PolygonRollupManager is uint32 indexed rollupID, uint64 numBatch, bytes32 stateRoot, + bytes32 exitRoot, address indexed aggregator ); @@ -392,6 +397,7 @@ contract PolygonRollupManager is uint32 indexed rollupID, uint64 numBatch, bytes32 stateRoot, + bytes32 exitRoot, address indexed aggregator ); @@ -402,6 +408,7 @@ contract PolygonRollupManager is uint32 indexed rollupID, uint64 numBatch, bytes32 stateRoot, + bytes32 exitRoot, uint64 pendingStateNum ); @@ -420,6 +427,7 @@ contract PolygonRollupManager is uint32 indexed rollupID, uint64 numBatch, bytes32 stateRoot, + bytes32 exitRoot, address aggregator ); @@ -475,7 +483,7 @@ contract PolygonRollupManager is address admin, address timelock, address emergencyCouncil, - PolygonZkEVMV2Upgraded polygonZkEVM, + PolygonZkEVMV2Existent polygonZkEVM, IVerifierRollup zkEVMVerifier ) external initializer { pendingStateTimeout = _pendingStateTimeout; @@ -635,20 +643,20 @@ contract PolygonRollupManager is * @param rollupTypeID Rollup type to deploy * @param chainID chainID of the rollup, must be a new one * @param admin admin of the new created rollup - * @param trustedSequencer trusted sequencer of the new created rollup + * @param sequencer sequencer of the new created rollup * @param gasTokenAddress Indicates the token address that will be used to pay gas fees in the new rollup * @param gasTokenNetwork Indicates the native network of the token address - * @param trustedSequencerURL trusted sequencer URL of the new created rollup + * @param sequencerURL sequencer URL of the new created rollup * @param networkName network name of the new created rollup */ function createNewRollup( uint32 rollupTypeID, uint64 chainID, address admin, - address trustedSequencer, + address sequencer, address gasTokenAddress, uint32 gasTokenNetwork, - string memory trustedSequencerURL, + string memory sequencerURL, string memory networkName ) external onlyRole(_CREATE_ROLLUP_ROLE) { // Check that rollup type exists @@ -694,16 +702,23 @@ contract PolygonRollupManager is rollup.rollupTypeID = rollupTypeID; rollup.rollupCompatibilityID = rollupType.rollupCompatibilityID; - emit CreateNewRollup(rollupID, rollupTypeID, rollupAddress, chainID); + emit CreateNewRollup( + rollupID, + rollupTypeID, + rollupAddress, + chainID, + gasTokenAddress, + gasTokenNetwork + ); // Initialize new rollup IPolygonRollupBase(rollupAddress).initialize( admin, - trustedSequencer, + sequencer, rollupID, gasTokenAddress, gasTokenNetwork, - trustedSequencerURL, + sequencerURL, networkName ); } @@ -978,7 +993,13 @@ contract PolygonRollupManager is }); } - emit VerifyBatches(rollupID, finalNewBatch, newStateRoot, msg.sender); + emit VerifyBatches( + rollupID, + finalNewBatch, + newStateRoot, + newLocalExitRoot, + msg.sender + ); } /** @@ -1033,6 +1054,7 @@ contract PolygonRollupManager is rollupID, finalNewBatch, newStateRoot, + newLocalExitRoot, msg.sender ); } @@ -1227,6 +1249,7 @@ contract PolygonRollupManager is rollupAddressToID[address(rollup.rollupContract)], newLastVerifiedBatch, currentPendingState.stateRoot, + currentPendingState.exitRoot, pendingStateNum ); } @@ -1291,6 +1314,7 @@ contract PolygonRollupManager is rollupID, finalNewBatch, newStateRoot, + newLocalExitRoot, msg.sender ); } diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index b2bf49fd1..440545a50 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -41,9 +41,6 @@ contract PolygonZkEVMBridgeV2 is // ZkEVM identifier uint32 private constant _ZKEVM_NETWORK_ID = 1; - // Number of networks supported by the bridge - uint32 private constant _CURRENT_SUPPORTED_NETWORKS = 2; - // Leaf type asset uint8 private constant _LEAF_TYPE_ASSET = 0; diff --git a/contracts/v2/consensus/zkEVM/PolygonZkEVMV2Upgraded.sol b/contracts/v2/consensus/zkEVM/PolygonZkEVMV2Existent.sol similarity index 94% rename from contracts/v2/consensus/zkEVM/PolygonZkEVMV2Upgraded.sol rename to contracts/v2/consensus/zkEVM/PolygonZkEVMV2Existent.sol index 5afc593c8..f6ffe5a5d 100644 --- a/contracts/v2/consensus/zkEVM/PolygonZkEVMV2Upgraded.sol +++ b/contracts/v2/consensus/zkEVM/PolygonZkEVMV2Existent.sol @@ -11,7 +11,7 @@ import "../../lib/PolygonRollupBase.sol"; * 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. */ -contract PolygonZkEVMV2Upgraded is PolygonRollupBase { +contract PolygonZkEVMV2Existent is PolygonRollupBase { /** * @param _globalExitRootManager Global exit root manager address * @param _pol POL token address @@ -62,5 +62,7 @@ contract PolygonZkEVMV2Upgraded is PolygonRollupBase { // Constant deployment variables forceBatchTimeout = 5 days; + + // Both gasTokenAddress and gasTokenNetwork are 0, since it uses ether } } diff --git a/contracts/v2/interfaces/IPolygonRollupBase.sol b/contracts/v2/interfaces/IPolygonRollupBase.sol index 5b3522f90..612688ffb 100644 --- a/contracts/v2/interfaces/IPolygonRollupBase.sol +++ b/contracts/v2/interfaces/IPolygonRollupBase.sol @@ -5,11 +5,11 @@ pragma solidity 0.8.20; interface IPolygonRollupBase { function initialize( address _admin, - address _trustedSequencer, + address sequencer, uint32 networkID, address gasTokenAddress, uint32 gasTokenNetwork, - string memory _trustedSequencerURL, + string memory sequencerURL, string memory _networkName ) external; diff --git a/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol b/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol index 73a838126..191510c18 100644 --- a/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol +++ b/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol @@ -17,4 +17,9 @@ interface IPolygonZkEVMV2Errors { * @dev Thrown when the caller is not the trusted sequencer */ error InvalidInitializeTransaction(); + + /** + * @dev Thrown when the caller is not the trusted sequencer + */ + error GasTokenNetworkMustBeZeroOnEther(); } diff --git a/contracts/v2/lib/PolygonRollupBase.sol b/contracts/v2/lib/PolygonRollupBase.sol index 02073858e..3f7060948 100644 --- a/contracts/v2/lib/PolygonRollupBase.sol +++ b/contracts/v2/lib/PolygonRollupBase.sol @@ -172,6 +172,12 @@ contract PolygonRollupBase is // Indicates if forced batches are allowed bool public isForcedBatchAllowed; + // Token address that will be used to pay gas fees in this rollup. This variable it's just for read purposes + address public gasTokenAddress; + + // Native network of the token address of the gas tokena address. This variable it's just for read purposes + uint32 public gasTokenNetwork; + /** * @dev Emitted when the trusted sequencer sends a new batch of transactions */ @@ -260,40 +266,54 @@ contract PolygonRollupBase is /** * @param _admin Admin address - * @param _trustedSequencer Trusted sequencer address - * @param _trustedSequencerURL Trusted sequencer URL + * @param sequencer Trusted sequencer address + * @param networkID Indicates the network identifier that will be used in the bridge + * @param _gasTokenAddress Indicates the token address that will be used to pay gas fees in the new rollup + * @param _gasTokenNetwork Indicates the native network of the token address + * @param sequencerURL Trusted sequencer URL * @param _networkName L2 network name */ function initialize( address _admin, - address _trustedSequencer, + address sequencer, uint32 networkID, - address gasTokenAddress, - uint32 gasTokenNetwork, - string memory _trustedSequencerURL, + address _gasTokenAddress, + uint32 _gasTokenNetwork, + string memory sequencerURL, string memory _networkName ) external virtual onlyRollupManager initializer { admin = _admin; - trustedSequencer = _trustedSequencer; + trustedSequencer = sequencer; - trustedSequencerURL = _trustedSequencerURL; + trustedSequencerURL = sequencerURL; networkName = _networkName; // Constant deployment variables forceBatchTimeout = 5 days; + if (_gasTokenAddress == address(0)) { + // gas token will be ether + if (_gasTokenNetwork != 0) { + revert GasTokenNetworkMustBeZeroOnEther(); + } + } + + // set gas token variables + gasTokenAddress = _gasTokenAddress; + gasTokenNetwork = _gasTokenNetwork; + // Sequence transaction to initilize the bridge // Calculate transaction to initialize the bridge bytes memory transaction = generateInitializeTransaction( networkID, - gasTokenAddress, - gasTokenNetwork + _gasTokenAddress, + _gasTokenNetwork ); bytes32 currentTransactionsHash = keccak256(transaction); - // should be deterministic for easier deployment, TODO test 0 + // should be deterministic for easier deployment uint64 currentTimestamp = uint64(block.timestamp); bytes32 newAccInputHash = keccak256( @@ -302,7 +322,7 @@ contract PolygonRollupBase is currentTransactionsHash, bytes32(0), // Global exit root currentTimestamp, - trustedSequencer + sequencer ) ); lastTimestamp = currentTimestamp; @@ -313,6 +333,7 @@ contract PolygonRollupBase is newAccInputHash ); + // review initialize events?¿ emit SequenceBatches(currentBatchSequenced); } @@ -780,15 +801,15 @@ contract PolygonRollupBase is */ function generateInitializeTransaction( uint32 networkID, - address gasTokenAddress, - uint32 gasTokenNetwork + address _gasTokenAddress, + uint32 _gasTokenNetwork ) public pure returns (bytes memory) { // Check the ecrecover, as a sanity check, to not allow invalid transactions bytes memory bytesToSign = abi.encodePacked( BASE_INITIALIZE_TX_BRIDGE, abi.encodeCall( PolygonZkEVMBridgeL2.initialize, - (networkID, gasTokenAddress, gasTokenNetwork) + (networkID, _gasTokenAddress, _gasTokenNetwork) ) ); diff --git a/test/contractsv2/BridgeV2.test.ts b/test/contractsv2/BridgeV2.test.ts new file mode 100644 index 000000000..6e7e1f08f --- /dev/null +++ b/test/contractsv2/BridgeV2.test.ts @@ -0,0 +1,1400 @@ +import {expect} from "chai"; +import {ethers, upgrades} from "hardhat"; +import { + VerifierRollupHelperMock, + ERC20PermitMock, + PolygonRollupManagerMock, + PolygonZkEVMGlobalExitRoot, + PolygonZkEVMBridgeV2, + PolygonZkEVMV2, + PolygonRollupBase, + TokenWrapped, +} from "../../typechain-types"; +import {takeSnapshot, time} from "@nomicfoundation/hardhat-network-helpers"; +import {processorUtils, contractUtils, MTBridge, mtBridgeUtils} from "@0xpolygonhermez/zkevm-commonjs"; +const {calculateSnarkInput, calculateAccInputHash, calculateBatchHashData} = contractUtils; +const MerkleTreeBridge = MTBridge; +const {verifyMerkleProof, getLeafValue} = mtBridgeUtils; + +function calculateGlobalExitRoot(mainnetExitRoot: any, rollupExitRoot: any) { + return ethers.solidityPackedKeccak256(["bytes32", "bytes32"], [mainnetExitRoot, rollupExitRoot]); +} +const _GLOBAL_INDEX_MAINNET_FLAG = 2n ** 64n; + +function computeGlobalIndex(indexLocal: any, indexRollup: any, isMainnet: Boolean) { + if (isMainnet === true) { + return BigInt(indexLocal) + _GLOBAL_INDEX_MAINNET_FLAG; + } else { + BigInt(indexLocal) + BigInt(indexRollup) * 2n ** 32n; + } +} + +// 1 bit (isMainnet) (32 bits) indicesd del rollup (32 bits) indice de la hoja LOcal +// X XXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +describe("PolygonZkEVMBridge Contract", () => { + let polygonZkEVMBridgeContract: PolygonZkEVMBridgeV2; + let polTokenContract: ERC20PermitMock; + let polygonZkEVMGlobalExitRoot: PolygonZkEVMGlobalExitRoot; + + let deployer: any; + let rollupManager: any; + let acc1: any; + + const tokenName = "Matic Token"; + const tokenSymbol = "MATIC"; + const decimals = 18; + const tokenInitialBalance = ethers.parseEther("20000000"); + const metadataToken = ethers.AbiCoder.defaultAbiCoder().encode( + ["string", "string", "uint8"], + [tokenName, tokenSymbol, decimals] + ); + + const networkIDMainnet = 0; + const networkIDRollup = 1; + + const LEAF_TYPE_ASSET = 0; + const LEAF_TYPE_MESSAGE = 1; + + const polygonZkEVMAddress = ethers.ZeroAddress; + + beforeEach("Deploy contracts", async () => { + // load signers + [deployer, rollupManager, acc1] = await ethers.getSigners(); + + // deploy PolygonZkEVMBridge + const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + polygonZkEVMBridgeContract = (await upgrades.deployProxy(polygonZkEVMBridgeFactory, [], { + initializer: false, + })) as unknown as PolygonZkEVMBridgeV2; + + // deploy global exit root manager + const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRoot"); + polygonZkEVMGlobalExitRoot = await PolygonZkEVMGlobalExitRootFactory.deploy( + rollupManager.address, + polygonZkEVMBridgeContract.target + ); + + await polygonZkEVMBridgeContract.initialize( + networkIDMainnet, + polygonZkEVMGlobalExitRoot.target, + rollupManager.address + ); + + // deploy token + const maticTokenFactory = await ethers.getContractFactory("ERC20PermitMock"); + polTokenContract = await maticTokenFactory.deploy( + tokenName, + tokenSymbol, + deployer.address, + tokenInitialBalance + ); + }); + + it("should check the constructor parameters", async () => { + expect(await polygonZkEVMBridgeContract.globalExitRootManager()).to.be.equal(polygonZkEVMGlobalExitRoot.target); + expect(await polygonZkEVMBridgeContract.networkID()).to.be.equal(networkIDMainnet); + expect(await polygonZkEVMBridgeContract.polygonRollupManager()).to.be.equal(rollupManager.address); + }); + + it("should PolygonZkEVM bridge asset and verify merkle proof", async () => { + const depositCount = await polygonZkEVMBridgeContract.depositCount(); + const originNetwork = networkIDMainnet; + const tokenAddress = polTokenContract.target; + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDRollup; + const destinationAddress = deployer.address; + + const metadata = metadataToken; + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + const balanceDeployer = await polTokenContract.balanceOf(deployer.address); + const balanceBridge = await polTokenContract.balanceOf(polygonZkEVMBridgeContract.target); + + const rollupExitRoot = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + + // create a new deposit + await expect(polTokenContract.approve(polygonZkEVMBridgeContract.target, amount)) + .to.emit(polTokenContract, "Approval") + .withArgs(deployer.address, polygonZkEVMBridgeContract.target, amount); + + // pre compute root merkle tree in Js + const height = 32; + const merkleTree = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + merkleTree.add(leafValue); + const rootJSMainnet = merkleTree.getRoot(); + + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount, + tokenAddress, + true, + "0x", + {value: 1} + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "MsgValueNotZero"); + + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount, + tokenAddress, + true, + "0x" + ) + ) + .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .withArgs( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata, + depositCount + ) + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .withArgs(rootJSMainnet, rollupExitRoot); + + expect(await polTokenContract.balanceOf(deployer.address)).to.be.equal(balanceDeployer - amount); + expect(await polTokenContract.balanceOf(polygonZkEVMBridgeContract.target)).to.be.equal(balanceBridge + amount); + expect(await polygonZkEVMBridgeContract.lastUpdatedDepositCount()).to.be.equal(1); + + // check merkle root with SC + const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); + expect(rootSCMainnet).to.be.equal(rootJSMainnet); + + // check merkle proof + const proof = merkleTree.getProofTreeByIndex(0); + const index = 0; + + // verify merkle proof + expect(verifyMerkleProof(leafValue, proof, index, rootSCMainnet)).to.be.equal(true); + expect(await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proof, index, rootSCMainnet)).to.be.equal( + true + ); + + const computedGlobalExitRoot = calculateGlobalExitRoot(rootJSMainnet, rollupExitRoot); + expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + }); + + it("should PolygonZkEVMBridge message and verify merkle proof", async () => { + const depositCount = await polygonZkEVMBridgeContract.depositCount(); + const originNetwork = networkIDMainnet; + const originAddress = deployer.address; + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDRollup; + const destinationAddress = deployer.address; + + const metadata = metadataToken; + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + const rollupExitRoot = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + + // pre compute root merkle tree in Js + const height = 32; + const merkleTree = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_MESSAGE, + originNetwork, + originAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + merkleTree.add(leafValue); + const rootJSMainnet = merkleTree.getRoot(); + + await expect( + polygonZkEVMBridgeContract.bridgeMessage(destinationNetwork, destinationAddress, true, metadata, { + value: amount, + }) + ) + .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .withArgs( + LEAF_TYPE_MESSAGE, + originNetwork, + originAddress, + destinationNetwork, + destinationAddress, + amount, + metadata, + depositCount + ); + + // check merkle root with SC + const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); + expect(rootSCMainnet).to.be.equal(rootJSMainnet); + + // check merkle proof + const proof = merkleTree.getProofTreeByIndex(0); + const index = 0; + + // verify merkle proof + expect(verifyMerkleProof(leafValue, proof, index, rootSCMainnet)).to.be.equal(true); + expect(await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proof, index, rootSCMainnet)).to.be.equal( + true + ); + + const computedGlobalExitRoot = calculateGlobalExitRoot(rootJSMainnet, rollupExitRoot); + expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + }); + + it("should PolygonZkEVM bridge asset and message to check global exit root updates", async () => { + const depositCount = await polygonZkEVMBridgeContract.depositCount(); + const originNetwork = networkIDMainnet; + const tokenAddress = polTokenContract.target; + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDRollup; + const destinationAddress = deployer.address; + + const metadata = metadataToken; + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + const balanceDeployer = await polTokenContract.balanceOf(deployer.address); + const balanceBridge = await polTokenContract.balanceOf(polygonZkEVMBridgeContract.target); + + const rollupExitRoot = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + + // create a new deposit + await expect(polTokenContract.approve(polygonZkEVMBridgeContract.target, amount)) + .to.emit(polTokenContract, "Approval") + .withArgs(deployer.address, polygonZkEVMBridgeContract.target, amount); + + // pre compute root merkle tree in Js + const height = 32; + const merkleTree = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + merkleTree.add(leafValue); + const rootJSMainnet = merkleTree.getRoot(); + + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount, + tokenAddress, + false, + "0x" + ) + ) + .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .withArgs( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata, + depositCount + ); + + expect(await polTokenContract.balanceOf(deployer.address)).to.be.equal(balanceDeployer - amount); + expect(await polTokenContract.balanceOf(polygonZkEVMBridgeContract.target)).to.be.equal(balanceBridge + amount); + expect(await polygonZkEVMBridgeContract.lastUpdatedDepositCount()).to.be.equal(0); + expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(ethers.ZeroHash); + + // check merkle root with SC + const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); + expect(rootSCMainnet).to.be.equal(rootJSMainnet); + + // Update global exit root + await expect(polygonZkEVMBridgeContract.updateGlobalExitRoot()) + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .withArgs(rootJSMainnet, rollupExitRoot); + + // no state changes since there are not any deposit pending to be updated + await polygonZkEVMBridgeContract.updateGlobalExitRoot(); + expect(await polygonZkEVMBridgeContract.lastUpdatedDepositCount()).to.be.equal(1); + expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(rootJSMainnet); + + const computedGlobalExitRoot = calculateGlobalExitRoot(rootJSMainnet, rollupExitRoot); + expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + + // bridge message + await expect( + polygonZkEVMBridgeContract.bridgeMessage(destinationNetwork, destinationAddress, false, metadata, { + value: amount, + }) + ) + .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .withArgs( + LEAF_TYPE_MESSAGE, + originNetwork, + deployer.address, + destinationNetwork, + destinationAddress, + amount, + metadata, + 1 + ); + expect(await polygonZkEVMBridgeContract.lastUpdatedDepositCount()).to.be.equal(1); + expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(rootJSMainnet); + + // Update global exit root + await expect(polygonZkEVMBridgeContract.updateGlobalExitRoot()).to.emit( + polygonZkEVMGlobalExitRoot, + "UpdateGlobalExitRoot" + ); + + expect(await polygonZkEVMBridgeContract.lastUpdatedDepositCount()).to.be.equal(2); + expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.not.be.equal(rootJSMainnet); + + // Just to have the metric of a low cost bridge Asset + const tokenAddress2 = ethers.ZeroAddress; // Ether + const amount2 = ethers.parseEther("10"); + await polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount2, + tokenAddress2, + false, + "0x", + {value: amount2} + ); + }); + + it("should claim tokens from Mainnet to Mainnet", async () => { + const originNetwork = networkIDMainnet; + const tokenAddress = polTokenContract.target; + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDMainnet; + const destinationAddress = acc1.address; + + const metadata = metadataToken; + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + const mainnetExitRoot = await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot(); + + // compute root merkle tree in Js + const height = 32; + const merkleTreeLocal = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + merkleTreeLocal.add(leafValue); + + const rootLocalRollup = merkleTreeLocal.getRoot(); + + // Try claim with 10 rollup leafs + const merkleTreeRollup = new MerkleTreeBridge(height); + for (let i = 0; i < 10; i++) { + merkleTreeRollup.add(rootLocalRollup); + } + + const rootRollup = merkleTreeRollup.getRoot(); + + // check only rollup account with update rollup exit root + await expect(polygonZkEVMGlobalExitRoot.updateExitRoot(rootRollup)).to.be.revertedWithCustomError( + polygonZkEVMGlobalExitRoot, + "OnlyAllowedContracts" + ); + + // add rollup Merkle root + await expect(polygonZkEVMGlobalExitRoot.connect(rollupManager).updateExitRoot(rootRollup)) + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .withArgs(mainnetExitRoot, rootRollup); + + // check roots + const rollupExitRootSC = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + expect(rollupExitRootSC).to.be.equal(rootRollup); + + const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC); + expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + + // check merkle proof + + // Merkle proof local + const indexLocal = 0; + const proofLocal = merkleTreeLocal.getProofTreeByIndex(indexLocal); + + // Merkle proof local + const indexRollup = 5; + const proofRollup = merkleTreeRollup.getProofTreeByIndex(indexRollup); + + // verify merkle proof + expect(verifyMerkleProof(rootLocalRollup, proofRollup, indexRollup, rootRollup)).to.be.equal(true); + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(rootLocalRollup, proofRollup, indexRollup, rootRollup) + ).to.be.equal(true); + const globalIndex = computeGlobalIndex(indexLocal, indexRollup, false); + /* + * claim + * Can't claim without tokens + */ + console.log("Hi"); + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofLocal, + proofRollup, + Number(globalIndex), + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWith("ERC20: transfer amount exceeds balance"); + console.log("Hi"); + + // transfer tokens, then claim + await expect(polTokenContract.transfer(polygonZkEVMBridgeContract.target, amount)) + .to.emit(polTokenContract, "Transfer") + .withArgs(deployer.address, polygonZkEVMBridgeContract.target, amount); + + expect(false).to.be.equal(await polygonZkEVMBridgeContract.isClaimed(indexLocal, indexRollup + 1)); + console.log("Hi"); + + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofLocal, + proofRollup, + globalIndex, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ) + .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") + .withArgs(globalIndex, originNetwork, tokenAddress, destinationAddress, amount) + .to.emit(polTokenContract, "Transfer") + .withArgs(polygonZkEVMBridgeContract.target, acc1.address, amount); + console.log("Hi"); + + // Can't claim because nullifier + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofLocal, + proofRollup, + Number(globalIndex), + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AlreadyClaimed"); + expect(true).to.be.equal(await polygonZkEVMBridgeContract.isClaimed(indexLocal, indexRollup + 1)); + }); + + it("should claim tokens from Rollup to Mainnet", async () => { + const originNetwork = networkIDRollup; + const tokenAddress = ethers.getAddress(ethers.hexlify(ethers.randomBytes(20))); + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDMainnet; + const destinationAddress = deployer.address; + + const metadata = metadataToken; // since we are inserting in the exit root can be anything + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + const mainnetExitRoot = await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot(); + + // compute root merkle tree in Js + const height = 32; + const merkleTreeRollup = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + + // Add 2 leafs + merkleTreeRollup + leafValue; + merkleTreeRollup + leafValue; + + // check merkle root with SC + const rootJSRollup = merkleTreeRollup.getRoot(); + + // check only rollup account with update rollup exit root + await expect(polygonZkEVMGlobalExitRoot.updateExitRoot(rootJSRollup)).to.be.revertedWithCustomError( + polygonZkEVMBridgeContract, + "OnlyAllowedContracts" + ); + + // add rollup Merkle root + await expect(polygonZkEVMGlobalExitRoot.connect(rollup).updateExitRoot(rootJSRollup)) + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .withArgs(mainnetExitRoot, rootJSRollup); + + // check roots + const rollupExitRootSC = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + expect(rollupExitRootSC).to.be.equal(rootJSRollup); + + const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC); + expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + + // check merkle proof + const proof = merkleTreeRollup.getProofTreeByIndex(0); + const index = 0; + + // verify merkle proof + expect(verifyMerkleProof(leafValue, proof, index, rootJSRollup)).to.be.equal(true); + expect(await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proof, index, rootJSRollup)).to.be.equal( + true + ); + + // claim + + // precalculate wrapped erc20 address + const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); + + // create2 parameters + const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]); + const minimalBytecodeProxy = tokenWrappedFactory.bytecode; + const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]); + const precalculateWrappedErc20 = await ethers.getCreate2Address( + polygonZkEVMBridgeContract.target, + salt, + hashInitCode + ); + const newWrappedToken = tokenWrappedFactory.attach(precalculateWrappedErc20); + + // Use precalculatedWrapperAddress and check if matches + expect( + await polygonZkEVMBridgeContract.precalculatedWrapperAddress( + networkIDRollup, + tokenAddress, + tokenName, + tokenSymbol, + decimals + ) + ).to.be.equal(precalculateWrappedErc20); + + await expect( + polygonZkEVMBridgeContract.claimAsset( + proof, + index, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ) + .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") + .withArgs(index, originNetwork, tokenAddress, destinationAddress, amount) + .to.emit(polygonZkEVMBridgeContract, "NewWrappedToken") + .withArgs(originNetwork, tokenAddress, precalculateWrappedErc20, metadata) + .to.emit(newWrappedToken, "Transfer") + .withArgs(ethers.ZeroAddress, deployer.address, amount); + + // Assert maps created + const newTokenInfo = await polygonZkEVMBridgeContract.wrappedTokenToTokenInfo(precalculateWrappedErc20); + + expect(newTokenInfo.originNetwork).to.be.equal(networkIDRollup); + expect(newTokenInfo.originTokenAddress).to.be.equal(tokenAddress); + expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( + precalculateWrappedErc20 + ); + expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( + precalculateWrappedErc20 + ); + + expect(await polygonZkEVMBridgeContract.tokenInfoToWrappedToken(salt)).to.be.equal(precalculateWrappedErc20); + + // Check the wrapper info + expect(await newWrappedToken.name()).to.be.equal(tokenName); + expect(await newWrappedToken.symbol()).to.be.equal(tokenSymbol); + expect(await newWrappedToken.decimals()).to.be.equal(decimals); + + // Can't claim because nullifier + await expect( + polygonZkEVMBridgeContract.claimAsset( + proof, + index, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AlreadyClaimed"); + + // Check new token + expect(await newWrappedToken.totalSupply()).to.be.equal(amount); + + // Claim again the other leaf to mint tokens + const index2 = 1; + const proof2 = merkleTreeRollup.getProofTreeByIndex(index2); + + await expect( + polygonZkEVMBridgeContract.claimAsset( + proof2, + index2, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ) + .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") + .withArgs(index, originNetwork, tokenAddress, destinationAddress, amount) + .to.emit(newWrappedToken, "Transfer") + .withArgs(ethers.ZeroAddress, deployer.address, amount); + + // Burn Tokens + const depositCount = await polygonZkEVMBridgeContract.depositCount(); + const wrappedTokenAddress = newWrappedToken.target; + const newDestinationNetwork = networkIDRollup; + + const rollupExitRoot = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + + // create a new deposit + await expect(newWrappedToken.approve(polygonZkEVMBridgeContract.target, amount)) + .to.emit(newWrappedToken, "Approval") + .withArgs(deployer.address, polygonZkEVMBridgeContract.target, amount); + + /* + * pre compute root merkle tree in Js + * const height = 32; + */ + const merkleTreeMainnet = new MerkleTreeBridge(height); + // Imporant calcualte leaf with origin token address no wrapped token address + const originTokenAddress = tokenAddress; + const metadataMainnet = "0x"; // since the token does not belong to this network + const metadataHashMainnet = ethers.solidityPackedKeccak256(["bytes"], [metadataMainnet]); + + const leafValueMainnet = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + originTokenAddress, + newDestinationNetwork, + destinationAddress, + amount, + metadataHashMainnet + ); + const leafValueMainnetSC = await polygonZkEVMBridgeContract.getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + originTokenAddress, + newDestinationNetwork, + destinationAddress, + amount, + metadataHashMainnet + ); + + expect(leafValueMainnet).to.be.equal(leafValueMainnetSC); + merkleTreeMainnet + leafValueMainnet; + const rootJSMainnet = merkleTreeMainnet.getRoot(); + + // Tokens are burnt + expect(await newWrappedToken.totalSupply()).to.be.equal(ethers.BigNumber.from(amount).mul(2)); + expect(await newWrappedToken.balanceOf(deployer.address)).to.be.equal(ethers.BigNumber.from(amount).mul(2)); + + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + newDestinationNetwork, + destinationAddress, + amount, + wrappedTokenAddress, + true, + "0x" + ) + ) + .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .withArgs( + LEAF_TYPE_ASSET, + originNetwork, + originTokenAddress, + newDestinationNetwork, + destinationAddress, + amount, + metadataMainnet, + depositCount + ) + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .withArgs(rootJSMainnet, rollupExitRoot) + .to.emit(newWrappedToken, "Transfer") + .withArgs(deployer.address, ethers.ZeroAddress, amount); + + expect(await newWrappedToken.totalSupply()).to.be.equal(amount); + expect(await newWrappedToken.balanceOf(deployer.address)).to.be.equal(amount); + expect(await newWrappedToken.balanceOf(polygonZkEVMBridgeContract.target)).to.be.equal(0); + + // check merkle root with SC + const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); + expect(rootSCMainnet).to.be.equal(rootJSMainnet); + + // check merkle proof + const proofMainnet = merkleTreeMainnet.getProofTreeByIndex(0); + const indexMainnet = 0; + + // verify merkle proof + expect(verifyMerkleProof(leafValueMainnet, proofMainnet, indexMainnet, rootSCMainnet)).to.be.equal(true); + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof( + leafValueMainnet, + proofMainnet, + indexMainnet, + rootSCMainnet + ) + ).to.be.equal(true); + + const computedGlobalExitRoot2 = calculateGlobalExitRoot(rootJSMainnet, rollupExitRoot); + expect(computedGlobalExitRoot2).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + }); + + it("should PolygonZkEVMBridge and sync the current root with events", async () => { + const depositCount = await polygonZkEVMBridgeContract.depositCount(); + const originNetwork = networkIDMainnet; + const tokenAddress = ethers.ZeroAddress; // Ether + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDRollup; + const destinationAddress = deployer.address; + + const metadata = "0x"; // since is ether does not have metadata + + // create 3 new deposit + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount, + tokenAddress, + true, + "0x", + {value: amount} + ) + ) + .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .withArgs( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata, + depositCount + ); + + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount, + tokenAddress, + true, + "0x", + {value: amount} + ) + ) + .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .withArgs( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata, + depositCount + 1 + ); + + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount, + tokenAddress, + true, + "0x", + {value: amount} + ) + ) + .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .withArgs( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata, + depositCount + 2 + ); + + // Prepare merkle tree + const height = 32; + const merkleTree = new MerkleTreeBridge(height); + + // Get the deposit's events + const filter = polygonZkEVMBridgeContract.filters.BridgeEvent(null, null, null, null, null); + const events = await polygonZkEVMBridgeContract.queryFilter(filter, 0, "latest"); + events.forEach((e) => { + const {args} = e; + const leafValue = getLeafValue( + args.leafType, + args.originNetwork, + args.originAddress, + args.destinationNetwork, + args.destinationAddress, + args.amount, + ethers.solidityPackedKeccak256(["bytes"], [args.metadata]) + ); + merkleTree.add(leafValue); + }); + + // Check merkle root with SC + const rootSC = await polygonZkEVMBridgeContract.getRoot(); + const rootJS = merkleTree.getRoot(); + + expect(rootSC).to.be.equal(rootJS); + }); + + it("should claim testing all the asserts", async () => { + // Add a claim leaf to rollup exit tree + const originNetwork = networkIDMainnet; + const tokenAddress = polTokenContract.target; + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDMainnet; + const destinationAddress = deployer.address; + + const metadata = metadataToken; + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + const mainnetExitRoot = await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot(); + + // compute root merkle tree in Js + const height = 32; + const merkleTree = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + merkleTree.add(leafValue); + + // check merkle root with SC + const rootJSRollup = merkleTree.getRoot(); + + // add rollup Merkle root + await expect(polygonZkEVMGlobalExitRoot.connect(rollup).updateExitRoot(rootJSRollup)) + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .withArgs(mainnetExitRoot, rootJSRollup); + + // check roots + const rollupExitRootSC = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + expect(rollupExitRootSC).to.be.equal(rootJSRollup); + + const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC); + expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + + // check merkle proof + const proof = merkleTree.getProofTreeByIndex(0); + const index = 0; + + // verify merkle proof + expect(verifyMerkleProof(leafValue, proof, index, rootJSRollup)).to.be.equal(true); + expect(await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proof, index, rootJSRollup)).to.be.equal( + true + ); + + // Can't claim without tokens + await expect( + polygonZkEVMBridgeContract.claimAsset( + proof, + index, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "ERC20: transfer amount exceeds balance"); + + // transfer tokens, then claim + await expect(polTokenContract.transfer(polygonZkEVMBridgeContract.target, amount)) + .to.emit(polTokenContract, "Transfer") + .withArgs(deployer.address, polygonZkEVMBridgeContract.target, amount); + + // Check Destination network does not match assert + await expect( + polygonZkEVMBridgeContract.claimAsset( + proof, + index, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + networkIDRollup, // Wrong destination network + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "DestinationNetworkInvalid"); + + // Check GlobalExitRoot invalid assert + await expect( + polygonZkEVMBridgeContract.claimAsset( + proof, + index, + mainnetExitRoot, + mainnetExitRoot, // Wrong rollup Root + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "GlobalExitRootInvalid"); + + // Check Invalid smt proof assert + await expect( + polygonZkEVMBridgeContract.claimAsset( + proof, + index + 1, // Wrong index + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "InvalidSmtProof"); + + await expect( + polygonZkEVMBridgeContract.claimAsset( + proof, + index, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ) + .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") + .withArgs(index, originNetwork, tokenAddress, destinationAddress, amount) + .to.emit(polTokenContract, "Transfer") + .withArgs(polygonZkEVMBridgeContract.target, deployer.address, amount); + + // Check Already claimed_claim + await expect( + polygonZkEVMBridgeContract.claimAsset( + proof, + index, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AlreadyClaimed"); + }); + + it("should claim ether", async () => { + // Add a claim leaf to rollup exit tree + const originNetwork = networkIDMainnet; + const tokenAddress = ethers.ZeroAddress; // ether + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDMainnet; + const destinationAddress = deployer.address; + + const metadata = "0x"; // since is ether does not have metadata + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + const mainnetExitRoot = await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot(); + + // compute root merkle tree in Js + const height = 32; + const merkleTree = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + merkleTree.add(leafValue); + + // check merkle root with SC + const rootJSRollup = merkleTree.getRoot(); + + // add rollup Merkle root + await expect(polygonZkEVMGlobalExitRoot.connect(rollup).updateExitRoot(rootJSRollup)) + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .withArgs(mainnetExitRoot, rootJSRollup); + + // check roots + const rollupExitRootSC = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + expect(rollupExitRootSC).to.be.equal(rootJSRollup); + + const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC); + expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + + // check merkle proof + const proof = merkleTree.getProofTreeByIndex(0); + const index = 0; + + // verify merkle proof + expect(verifyMerkleProof(leafValue, proof, index, rootJSRollup)).to.be.equal(true); + expect(await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proof, index, rootJSRollup)).to.be.equal( + true + ); + + /* + * claim + * Can't claim without ether + */ + await expect( + polygonZkEVMBridgeContract.claimAsset( + proof, + index, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "EtherTransferFailed"); + + const balanceDeployer = await ethers.provider.getBalance(deployer.address); + /* + * Create a deposit to add ether to the PolygonZkEVMBridge + * Check deposit amount ether asserts + */ + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + networkIDRollup, + destinationAddress, + amount, + tokenAddress, + true, + "0x", + {value: ethers.parseEther("100")} + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AmountDoesNotMatchMsgValue"); + + // Check mainnet destination assert + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + networkIDMainnet, + destinationAddress, + amount, + tokenAddress, + true, + "0x", + {value: amount} + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "DestinationNetworkInvalid"); + + // This is used just to pay ether to the PolygonZkEVMBridge smart contract and be able to claim it afterwards. + expect( + await polygonZkEVMBridgeContract.bridgeAsset( + networkIDRollup, + destinationAddress, + amount, + tokenAddress, + true, + "0x", + {value: amount} + ) + ); + + // Check balances before claim + expect(await ethers.provider.getBalance(polygonZkEVMBridgeContract.target)).to.be.equal(amount); + expect(await ethers.provider.getBalance(deployer.address)).to.be.lte(balanceDeployer - amount); + + await expect( + polygonZkEVMBridgeContract.claimAsset( + proof, + index, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ) + .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") + .withArgs(index, originNetwork, tokenAddress, destinationAddress, amount); + + // Check balances after claim + expect(await ethers.provider.getBalance(polygonZkEVMBridgeContract.target)).to.be.equal(ethers.parseEther("0")); + expect(await ethers.provider.getBalance(deployer.address)).to.be.lte(balanceDeployer); + + // Can't claim because nullifier + await expect( + polygonZkEVMBridgeContract.claimAsset( + proof, + index, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AlreadyClaimed"); + }); + + it("should claim message", async () => { + // Add a claim leaf to rollup exit tree + const originNetwork = networkIDMainnet; + const tokenAddress = ethers.ZeroAddress; // ether + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDMainnet; + const destinationAddress = deployer.address; + + const metadata = "0x176923791298713271763697869132"; // since is ether does not have metadata + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + const mainnetExitRoot = await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot(); + + // compute root merkle tree in Js + const height = 32; + const merkleTree = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_MESSAGE, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + merkleTree.add(leafValue); + + // check merkle root with SC + const rootJSRollup = merkleTree.getRoot(); + + // add rollup Merkle root + await expect(polygonZkEVMGlobalExitRoot.connect(rollup).updateExitRoot(rootJSRollup)) + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .withArgs(mainnetExitRoot, rootJSRollup); + + // check roots + const rollupExitRootSC = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + expect(rollupExitRootSC).to.be.equal(rootJSRollup); + + const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC); + expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + + // check merkle proof + const proof = merkleTree.getProofTreeByIndex(0); + const index = 0; + + // verify merkle proof + expect(verifyMerkleProof(leafValue, proof, index, rootJSRollup)).to.be.equal(true); + expect(await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proof, index, rootJSRollup)).to.be.equal( + true + ); + + /* + * claim + * Can't claim a message as an assets + */ + await expect( + polygonZkEVMBridgeContract.claimAsset( + proof, + index, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "InvalidSmtProof"); + + /* + * claim + * Can't claim without ether + */ + await expect( + polygonZkEVMBridgeContract.claimMessage( + proof, + index, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "MessageFailed"); + + const balanceDeployer = await ethers.provider.getBalance(deployer.address); + /* + * Create a deposit to add ether to the PolygonZkEVMBridge + * Check deposit amount ether asserts + */ + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + networkIDRollup, + destinationAddress, + amount, + tokenAddress, + true, + "0x", + {value: ethers.parseEther("100")} + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AmountDoesNotMatchMsgValue"); + + // Check mainnet destination assert + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + networkIDMainnet, + destinationAddress, + amount, + tokenAddress, + true, + "0x", + {value: amount} + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "DestinationNetworkInvalid"); + + // This is used just to pay ether to the PolygonZkEVMBridge smart contract and be able to claim it afterwards. + expect( + await polygonZkEVMBridgeContract.bridgeAsset( + networkIDRollup, + destinationAddress, + amount, + tokenAddress, + true, + "0x", + {value: amount} + ) + ); + + // Check balances before claim + expect(await ethers.provider.getBalance(polygonZkEVMBridgeContract.target)).to.be.equal(amount); + expect(await ethers.provider.getBalance(deployer.address)).to.be.lte(balanceDeployer - amount); + + // Check mainnet destination assert + await expect( + polygonZkEVMBridgeContract.claimAsset( + proof, + index, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "InvalidSmtProof"); + + await expect( + polygonZkEVMBridgeContract.claimMessage( + proof, + index, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ) + .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") + .withArgs(index, originNetwork, tokenAddress, destinationAddress, amount); + + // Check balances after claim + expect(await ethers.provider.getBalance(polygonZkEVMBridgeContract.target)).to.be.equal(ethers.parseEther("0")); + expect(await ethers.provider.getBalance(deployer.address)).to.be.lte(balanceDeployer); + + // Can't claim because nullifier + await expect( + polygonZkEVMBridgeContract.claimAsset( + proof, + index, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AlreadyClaimed"); + }); +}); diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index f4e2863ec..8655187d3 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -375,7 +375,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { ) ) .to.emit(rollupManagerContract, "CreateNewRollup") - .withArgs(newCreatedRollupID, newRollupTypeID, newZKEVMAddress, chainID) + .withArgs(newCreatedRollupID, newRollupTypeID, newZKEVMAddress, chainID, gasTokenAddress, gasTokenNetwork) .to.emit(newZkEVMContract, "SequenceBatches") .withArgs(newSequencedBatch) .to.emit(rollupManagerContract, "OnSequenceBatches") @@ -611,7 +611,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { ) ) .to.emit(rollupManagerContract, "VerifyBatchesTrustedAggregator") - .withArgs(newCreatedRollupID, newVerifiedBatch, newStateRoot, trustedAggregator.address) + .withArgs(newCreatedRollupID, newVerifiedBatch, newStateRoot, newLocalExitRoot, trustedAggregator.address) .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") .withArgs(ethers.ZeroHash, rootRollups); From 2592723840a2075de11f574d3f5feb12ead60c58 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 9 Oct 2023 16:21:23 +0200 Subject: [PATCH 052/230] one bridge to rull them all.. --- contracts/v2/L2/PolygonZkEVMBridgeL2.sol | 10 +- contracts/v2/PolygonRollupManager.sol | 6 +- contracts/v2/PolygonZkEVMBridgeV2.sol | 355 ++++++++++++------ .../v2/interfaces/IPolygonZkEVMBridgeV2.sol | 23 ++ contracts/v2/lib/PolygonRollupBase.sol | 9 - test/contractsv2/BridgeV2.test.ts | 12 +- test/contractsv2/PolygonRollupManager.test.ts | 2 + 7 files changed, 285 insertions(+), 132 deletions(-) diff --git a/contracts/v2/L2/PolygonZkEVMBridgeL2.sol b/contracts/v2/L2/PolygonZkEVMBridgeL2.sol index 3ad7b3984..168939342 100644 --- a/contracts/v2/L2/PolygonZkEVMBridgeL2.sol +++ b/contracts/v2/L2/PolygonZkEVMBridgeL2.sol @@ -11,6 +11,8 @@ import "../interfaces/IPolygonZkEVMBridgeL2.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol"; import "../../lib/GlobalExitRootLib.sol"; +// unify bridges TODO + // review this implementation DOES not take care the storage slots of bridge // this means that if the bridge on mainnet or zkEVM should be updated in a future, should be done by // the other contract @@ -170,9 +172,7 @@ contract PolygonZkEVMBridgeL2 is DepositContractV2, IPolygonZkEVMBridgeL2 { bool forceUpdateGlobalExitRoot, bytes calldata permitData ) public payable virtual nonReentrant { - if ( - destinationNetwork == networkID // TODO - ) { + if (destinationNetwork == networkID) { revert DestinationNetworkInvalid(); } @@ -354,9 +354,7 @@ contract PolygonZkEVMBridgeL2 is DepositContractV2, IPolygonZkEVMBridgeL2 { bool forceUpdateGlobalExitRoot, bytes calldata metadata ) internal { - if ( - destinationNetwork == networkID // TODO destinationNetwork >= rollupManager.rollupCount() ?¿ - ) { + if (destinationNetwork == networkID) { revert DestinationNetworkInvalid(); } diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index 538604fc8..804d8646e 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -14,9 +14,7 @@ import "../interfaces/IVerifierRollup.sol"; import "./consensus/zkEVM/PolygonZkEVMV2Existent.sol"; // review check contract slots! -// review Update OZ libs, new transaparent proxy is cheaper, but admin immutable - -// legacy storage slots base +// review legacy storage slots base /** * Contract responsible for managing the exit roots across multiple Rollups */ @@ -837,7 +835,7 @@ contract PolygonRollupManager is revert RollupTypeObsolete(); } - // review check compatibility of the rollups + // check compatibility of the rollups if ( rollup.rollupCompatibilityID != newRollupType.rollupCompatibilityID ) { diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index 440545a50..99b48424f 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -74,8 +74,19 @@ contract PolygonZkEVMBridgeV2 is // PolygonZkEVM address address public polygonRollupManager; + // Native address + address public gasTokenAddress; + + // Native address + uint32 public gasTokenNetwork; + + // WETH address + TokenWrapped public WETHToken; + /** * @param _networkID networkID + * @param _gasTokenAddress gas token address + * @param _gasTokenNetwork gas token network * @param _globalExitRootManager global exit root manager address * @param _polygonRollupManager polygonZkEVM address * @notice The value of `_polygonRollupManager` on the L2 deployment of the contract will be address(0), so @@ -83,6 +94,8 @@ contract PolygonZkEVMBridgeV2 is */ function initialize( uint32 _networkID, + address _gasTokenAddress, + uint32 _gasTokenNetwork, IBasePolygonZkEVMGlobalExitRoot _globalExitRootManager, address _polygonRollupManager ) external virtual initializer { @@ -90,6 +103,24 @@ contract PolygonZkEVMBridgeV2 is globalExitRootManager = _globalExitRootManager; polygonRollupManager = _polygonRollupManager; + // Set gas token + if (gasTokenAddress == address(0)) { + // gas token will be ether + if (gasTokenNetwork != 0) { + revert GasTokenNetworkMustBeZeroOnEther(); + } + //WETHToken, gasTokenAddress and gasTokenNetwork will be 0 + } else { + // Gas token will be an erc20 + gasTokenAddress = _gasTokenAddress; + gasTokenNetwork = _gasTokenNetwork; + WETHToken = (new TokenWrapped){salt: bytes32(0)}( + "Wrapped Ether", + "WETH", + 18 + ); + } + // Initialize OZ contracts __ReentrancyGuard_init(); } @@ -157,10 +188,8 @@ contract PolygonZkEVMBridgeV2 is bool forceUpdateGlobalExitRoot, bytes calldata permitData ) public payable virtual ifNotEmergencyState nonReentrant { - if ( - destinationNetwork == networkID - // TODO check desitnation network? destinationNetwork >= rollupManager.rollupCount() ?¿ - ) { + // User/UI must be aware of the existing/available networks + if (destinationNetwork == networkID) { revert DestinationNetworkInvalid(); } @@ -170,60 +199,72 @@ contract PolygonZkEVMBridgeV2 is uint256 leafAmount = amount; if (token == address(0)) { - // Ether transfer + // Check gas token transfer if (msg.value != amount) { revert AmountDoesNotMatchMsgValue(); } - // Ether is treated as ether from mainnet - originNetwork = _MAINNET_NETWORK_ID; + // Set gas token parameters + originNetwork = gasTokenNetwork; + originTokenAddress = gasTokenAddress; } else { // Check msg.value is 0 if tokens are bridged if (msg.value != 0) { revert MsgValueNotZero(); } - TokenInformation memory tokenInfo = wrappedTokenToTokenInfo[token]; - - if (tokenInfo.originTokenAddress != address(0)) { - // The token is a wrapped token from another network - + // Check if it's WETH, this only applies on L2 networks with gasTokens + // In case ether is the native token, WETHToken will be 0, and the address 0 is already checked + if (token == address(WETHToken)) { // Burn tokens TokenWrapped(token).burn(msg.sender, amount); - originTokenAddress = tokenInfo.originTokenAddress; - originNetwork = tokenInfo.originNetwork; + // Both origin network and originTokenAddress will be 0 } else { - // Use permit if any - if (permitData.length != 0) { - _permit(token, amount, permitData); - } + TokenInformation memory tokenInfo = wrappedTokenToTokenInfo[ + token + ]; - // In order to support fee tokens check the amount received, not the transferred - uint256 balanceBefore = IERC20Upgradeable(token).balanceOf( - address(this) - ); - IERC20Upgradeable(token).safeTransferFrom( - msg.sender, - address(this), - amount - ); - uint256 balanceAfter = IERC20Upgradeable(token).balanceOf( - address(this) - ); + if (tokenInfo.originTokenAddress != address(0)) { + // The token is a wrapped token from another network + + // Burn tokens + TokenWrapped(token).burn(msg.sender, amount); + + originTokenAddress = tokenInfo.originTokenAddress; + originNetwork = tokenInfo.originNetwork; + } else { + // Use permit if any + if (permitData.length != 0) { + _permit(token, amount, permitData); + } + + // In order to support fee tokens check the amount received, not the transferred + uint256 balanceBefore = IERC20Upgradeable(token).balanceOf( + address(this) + ); + IERC20Upgradeable(token).safeTransferFrom( + msg.sender, + address(this), + amount + ); + uint256 balanceAfter = IERC20Upgradeable(token).balanceOf( + address(this) + ); - // Override leafAmount with the received amount - leafAmount = balanceAfter - balanceBefore; + // Override leafAmount with the received amount + leafAmount = balanceAfter - balanceBefore; - originTokenAddress = token; - originNetwork = networkID; + originTokenAddress = token; + originNetwork = networkID; - // Encode metadata - metadata = abi.encode( - _safeName(token), - _safeSymbol(token), - _safeDecimals(token) - ); + // Encode metadata + metadata = abi.encode( + _safeName(token), + _safeSymbol(token), + _safeDecimals(token) + ); + } } } @@ -268,10 +309,70 @@ contract PolygonZkEVMBridgeV2 is address destinationAddress, bool forceUpdateGlobalExitRoot, bytes calldata metadata - ) external payable ifNotEmergencyState { - if ( - destinationNetwork == networkID // TODO destinationNetwork >= rollupManager.rollupCount() ?¿ - ) { + ) external payable { + // If exist a gas token, only let call this function without value + if (msg.value != 0 && address(WETHToken) != address(0)) { + revert NoValueInMessagesOnGasTokenNetworks(); + } + + _bridgeMessage( + destinationNetwork, + destinationAddress, + msg.value, + forceUpdateGlobalExitRoot, + metadata + ); + } + + /** + * @notice Bridge message and send ETH value + * @param destinationNetwork Network destination + * @param destinationAddress Address destination + * @param amountWETH Amount of WETH tokens + * @param forceUpdateGlobalExitRoot Indicates if the new global exit root is updated or not + * @param metadata Message metadata + */ + function bridgeMessageWETH( + uint32 destinationNetwork, + address destinationAddress, + uint256 amountWETH, + bool forceUpdateGlobalExitRoot, + bytes calldata metadata + ) external { + // if native token is ether, disable this function + if (address(WETHToken) == address(0)) { + revert NativeTokenIsEther(); + } + + // Burn wETH tokens + WETHToken.burn(msg.sender, amountWETH); + + _bridgeMessage( + destinationNetwork, + destinationAddress, + amountWETH, + forceUpdateGlobalExitRoot, + metadata + ); + } + + /** + * @notice Bridge message and send ETH value + * @param destinationNetwork Network destination + * @param destinationAddress Address destination + * @param amountEther Amount of ether along with the message + * @param forceUpdateGlobalExitRoot Indicates if the new global exit root is updated or not + * @param metadata Message metadata + */ + function _bridgeMessage( + uint32 destinationNetwork, + address destinationAddress, + uint256 amountEther, + bool forceUpdateGlobalExitRoot, + bytes calldata metadata + ) internal { + // User/UI must be aware of the existing/available networks + if (destinationNetwork == networkID) { revert DestinationNetworkInvalid(); } @@ -281,7 +382,7 @@ contract PolygonZkEVMBridgeV2 is msg.sender, destinationNetwork, destinationAddress, - msg.value, + amountEther, metadata, uint32(depositCount) ); @@ -293,7 +394,7 @@ contract PolygonZkEVMBridgeV2 is msg.sender, destinationNetwork, destinationAddress, - msg.value, + amountEther, keccak256(metadata) ) ); @@ -356,64 +457,89 @@ contract PolygonZkEVMBridgeV2 is // Transfer funds if (originTokenAddress == address(0)) { - // Transfer ether - /* solhint-disable avoid-low-level-calls */ - (bool success, ) = destinationAddress.call{value: amount}( - new bytes(0) - ); - if (!success) { - revert EtherTransferFailed(); + if (address(WETHToken) == address(0)) { + // Ether is the native token + /* solhint-disable avoid-low-level-calls */ + (bool success, ) = destinationAddress.call{value: amount}( + new bytes(0) + ); + if (!success) { + revert EtherTransferFailed(); + } + } else { + // Claim wETH + WETHToken.mint(destinationAddress, amount); } } else { - // Transfer tokens - if (originNetwork == networkID) { - // The token is an ERC20 from this network - IERC20Upgradeable(originTokenAddress).safeTransfer( - destinationAddress, - amount + // Check if it's gas token + if ( + originTokenAddress == gasTokenAddress && + gasTokenNetwork == originNetwork + ) { + // Transfer gas token + /* solhint-disable avoid-low-level-calls */ + (bool success, ) = destinationAddress.call{value: amount}( + new bytes(0) ); + if (!success) { + revert EtherTransferFailed(); + } } else { - // The tokens is not from this network - // Create a wrapper for the token if not exist yet - bytes32 tokenInfoHash = keccak256( - abi.encodePacked(originNetwork, originTokenAddress) - ); - address wrappedToken = tokenInfoToWrappedToken[tokenInfoHash]; - - if (wrappedToken == address(0)) { - // Get ERC20 metadata - ( - string memory name, - string memory symbol, - uint8 decimals - ) = abi.decode(metadata, (string, string, uint8)); - - // Create a new wrapped erc20 using create2 - TokenWrapped newWrappedToken = (new TokenWrapped){ - salt: tokenInfoHash - }(name, symbol, decimals); - - // Mint tokens for the destination address - newWrappedToken.mint(destinationAddress, amount); - - // Create mappings - tokenInfoToWrappedToken[tokenInfoHash] = address( - newWrappedToken - ); - - wrappedTokenToTokenInfo[ - address(newWrappedToken) - ] = TokenInformation(originNetwork, originTokenAddress); - - emit NewWrappedToken( - originNetwork, - originTokenAddress, - address(newWrappedToken), - metadata + // Transfer tokens + if (originNetwork == networkID) { + // The token is an ERC20 from this network + IERC20Upgradeable(originTokenAddress).safeTransfer( + destinationAddress, + amount ); } else { - // Use the existing wrapped erc20 - TokenWrapped(wrappedToken).mint(destinationAddress, amount); + // The tokens is not from this network + // Create a wrapper for the token if not exist yet + bytes32 tokenInfoHash = keccak256( + abi.encodePacked(originNetwork, originTokenAddress) + ); + address wrappedToken = tokenInfoToWrappedToken[ + tokenInfoHash + ]; + + if (wrappedToken == address(0)) { + // Get ERC20 metadata + ( + string memory name, + string memory symbol, + uint8 decimals + ) = abi.decode(metadata, (string, string, uint8)); + + // Create a new wrapped erc20 using create2 + TokenWrapped newWrappedToken = (new TokenWrapped){ + salt: tokenInfoHash + }(name, symbol, decimals); + + // Mint tokens for the destination address + newWrappedToken.mint(destinationAddress, amount); + + // Create mappings + tokenInfoToWrappedToken[tokenInfoHash] = address( + newWrappedToken + ); + + wrappedTokenToTokenInfo[ + address(newWrappedToken) + ] = TokenInformation(originNetwork, originTokenAddress); + + emit NewWrappedToken( + originNetwork, + originTokenAddress, + address(newWrappedToken), + metadata + ); + } else { + // Use the existing wrapped erc20 + TokenWrapped(wrappedToken).mint( + destinationAddress, + amount + ); + } } } } @@ -480,14 +606,31 @@ contract PolygonZkEVMBridgeV2 is ); // Execute message - // Transfer ether - /* solhint-disable avoid-low-level-calls */ - (bool success, ) = destinationAddress.call{value: amount}( - abi.encodeCall( - IBridgeMessageReceiver.onMessageReceived, - (originAddress, originNetwork, metadata) - ) - ); + bool success; + if (address(WETHToken) == address(0)) { + // Native token is ether + // Transfer ether + /* solhint-disable avoid-low-level-calls */ + (success, ) = destinationAddress.call{value: amount}( + abi.encodeCall( + IBridgeMessageReceiver.onMessageReceived, + (originAddress, originNetwork, metadata) + ) + ); + } else { + // mint wETH tokens + WETHToken.mint(destinationAddress, amount); + + // Execute message + /* solhint-disable avoid-low-level-calls */ + (success, ) = destinationAddress.call( + abi.encodeCall( + IBridgeMessageReceiver.onMessageReceived, + (originAddress, originNetwork, metadata) + ) + ); + } + if (!success) { revert MessageFailed(); } diff --git a/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol b/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol index e7a885e62..279089ec5 100644 --- a/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol +++ b/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol @@ -12,4 +12,27 @@ interface IPolygonZkEVMBridgeV2 is IPolygonZkEVMBaseBridge { function activateEmergencyState() external; function deactivateEmergencyState() external; + + /** + * @dev Thrown when the permit data contains an invalid signature + */ + error NativeTokenIsEther(); + + /** + * @dev Thrown when the permit data contains an invalid signature + */ + error NoValueInMessagesOnGasTokenNetworks(); + + /** + * @dev Thrown when the permit data contains an invalid signature + */ + error GasTokenNetworkMustBeZeroOnEther(); + + function bridgeMessageWETH( + uint32 destinationNetwork, + address destinationAddress, + uint256 amountWETH, + bool forceUpdateGlobalExitRoot, + bytes calldata metadata + ) external; } diff --git a/contracts/v2/lib/PolygonRollupBase.sol b/contracts/v2/lib/PolygonRollupBase.sol index 3f7060948..2d4b43f4e 100644 --- a/contracts/v2/lib/PolygonRollupBase.sol +++ b/contracts/v2/lib/PolygonRollupBase.sol @@ -237,13 +237,6 @@ contract PolygonRollupBase is */ event AcceptAdminRole(address newAdmin); - // review - /** - * @dev Emitted everytime the forkID is updated, this includes the first initialization of the contract - * This event is intended to be emitted for every upgrade of the contract with relevant changes for the nodes - */ - event UpdateZkEVMVersion(uint64 numBatch, uint64 forkID, string version); - // General parameters that will have in common all networks that deploys rollup manager /** @@ -369,8 +362,6 @@ contract PolygonRollupBase is // Sequence/Verify batches functions //////////////////////////////////// - // TODO add the hashed forced data aswell?¿ - /** * @notice Allows a sequencer to send multiple batches * @param batches Struct array which holds the necessary data to append new batches to the sequence diff --git a/test/contractsv2/BridgeV2.test.ts b/test/contractsv2/BridgeV2.test.ts index 6e7e1f08f..38339c339 100644 --- a/test/contractsv2/BridgeV2.test.ts +++ b/test/contractsv2/BridgeV2.test.ts @@ -25,11 +25,11 @@ function computeGlobalIndex(indexLocal: any, indexRollup: any, isMainnet: Boolea if (isMainnet === true) { return BigInt(indexLocal) + _GLOBAL_INDEX_MAINNET_FLAG; } else { - BigInt(indexLocal) + BigInt(indexRollup) * 2n ** 32n; + return BigInt(indexLocal) + BigInt(indexRollup) * 2n ** 32n; } } -// 1 bit (isMainnet) (32 bits) indicesd del rollup (32 bits) indice de la hoja LOcal +// 1 bit (isMainnet) (32 bits) indices del rollup (32 bits) indice de la hoja LOcal // X XXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX describe("PolygonZkEVMBridge Contract", () => { let polygonZkEVMBridgeContract: PolygonZkEVMBridgeV2; @@ -76,6 +76,8 @@ describe("PolygonZkEVMBridge Contract", () => { await polygonZkEVMBridgeContract.initialize( networkIDMainnet, + ethers.ZeroAddress, // zero for ether + ethers.ZeroAddress, // zero for ether polygonZkEVMGlobalExitRoot.target, rollupManager.address ); @@ -449,7 +451,6 @@ describe("PolygonZkEVMBridge Contract", () => { * claim * Can't claim without tokens */ - console.log("Hi"); await expect( polygonZkEVMBridgeContract.claimAsset( proofLocal, @@ -465,7 +466,6 @@ describe("PolygonZkEVMBridge Contract", () => { metadata ) ).to.be.revertedWith("ERC20: transfer amount exceeds balance"); - console.log("Hi"); // transfer tokens, then claim await expect(polTokenContract.transfer(polygonZkEVMBridgeContract.target, amount)) @@ -473,7 +473,6 @@ describe("PolygonZkEVMBridge Contract", () => { .withArgs(deployer.address, polygonZkEVMBridgeContract.target, amount); expect(false).to.be.equal(await polygonZkEVMBridgeContract.isClaimed(indexLocal, indexRollup + 1)); - console.log("Hi"); await expect( polygonZkEVMBridgeContract.claimAsset( @@ -494,14 +493,13 @@ describe("PolygonZkEVMBridge Contract", () => { .withArgs(globalIndex, originNetwork, tokenAddress, destinationAddress, amount) .to.emit(polTokenContract, "Transfer") .withArgs(polygonZkEVMBridgeContract.target, acc1.address, amount); - console.log("Hi"); // Can't claim because nullifier await expect( polygonZkEVMBridgeContract.claimAsset( proofLocal, proofRollup, - Number(globalIndex), + globalIndex, mainnetExitRoot, rollupExitRootSC, originNetwork, diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index 8655187d3..b62b82841 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -148,6 +148,8 @@ describe("Polygon ZK-EVM TestnetV2", () => { await polygonZkEVMBridgeContract.initialize( networkIDMainnet, + ethers.ZeroAddress, // zero for ether + ethers.ZeroAddress, // zero for ether polygonZkEVMGlobalExitRoot.target, rollupManagerContract.target ); From d925933363c05774e1ed0b1e07f2132977d02360 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 9 Oct 2023 16:37:13 +0200 Subject: [PATCH 053/230] one bridge to role them all with test --- contracts/v2/L2/PolygonZkEVMBridgeL2.sol | 1012 ----------------- .../v2/interfaces/IPolygonZkEVMBridgeL2.sol | 29 - contracts/v2/lib/PolygonRollupBase.sol | 26 +- test/contractsv2/PolygonRollupManager.test.ts | 7 +- 4 files changed, 26 insertions(+), 1048 deletions(-) delete mode 100644 contracts/v2/L2/PolygonZkEVMBridgeL2.sol delete mode 100644 contracts/v2/interfaces/IPolygonZkEVMBridgeL2.sol diff --git a/contracts/v2/L2/PolygonZkEVMBridgeL2.sol b/contracts/v2/L2/PolygonZkEVMBridgeL2.sol deleted file mode 100644 index 168939342..000000000 --- a/contracts/v2/L2/PolygonZkEVMBridgeL2.sol +++ /dev/null @@ -1,1012 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 - -pragma solidity 0.8.20; - -import "../lib/DepositContractV2.sol"; -import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; -import "../../lib/TokenWrapped.sol"; -import "../../interfaces/IBasePolygonZkEVMGlobalExitRoot.sol"; -import "../../interfaces/IBridgeMessageReceiver.sol"; -import "../interfaces/IPolygonZkEVMBridgeL2.sol"; -import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol"; -import "../../lib/GlobalExitRootLib.sol"; - -// unify bridges TODO - -// review this implementation DOES not take care the storage slots of bridge -// this means that if the bridge on mainnet or zkEVM should be updated in a future, should be done by -// the other contract - -/** - * PolygonZkEVMBridge that will be deployed on both networks Ethereum and Polygon zkEVM - * Contract responsible to manage the token interactions with other networks - */ -contract PolygonZkEVMBridgeL2 is DepositContractV2, IPolygonZkEVMBridgeL2 { - using SafeERC20Upgradeable for IERC20Upgradeable; - - // Wrapped Token information struct - struct TokenInformation { - uint32 originNetwork; - address originTokenAddress; - } - - // bytes4(keccak256(bytes("permit(address,address,uint256,uint256,uint8,bytes32,bytes32)"))); - bytes4 private constant _PERMIT_SIGNATURE = 0xd505accf; - - // bytes4(keccak256(bytes("permit(address,address,uint256,uint256,bool,uint8,bytes32,bytes32)"))); - bytes4 private constant _PERMIT_SIGNATURE_DAI = 0x8fcbaf0c; - - // Mainnet identifier - uint32 private constant _MAINNET_NETWORK_ID = 0; - - // ZkEVM identifier - uint32 private constant _ZKEVM_NETWORK_ID = 1; - - // Leaf type asset - uint8 private constant _LEAF_TYPE_ASSET = 0; - - // Leaf type message - uint8 private constant _LEAF_TYPE_MESSAGE = 1; - - // Nullifier offset - uint256 private constant _MAX_LEAFS_PER_NETWORK = 2 ** 32; - - // // Indicate where's the mainnet flag bit in the global index - uint256 private constant _GLOBAL_INDEX_MAINNET_FLAG = 2 ** 64; - - // Network identifier - uint32 public networkID; - - // Global Exit Root address - IBasePolygonZkEVMGlobalExitRoot public constant globalExitRootManager = - IBasePolygonZkEVMGlobalExitRoot( - 0xa40D5f56745a118D0906a34E69aeC8C0Db1cB8fA - ); - - // Last updated deposit count to the global exit root manager - uint32 public lastUpdatedDepositCount; - - // Leaf index --> claimed bit map - mapping(uint256 => uint256) public claimedBitMap; - - // keccak256(OriginNetwork || tokenAddress) --> Wrapped token address - mapping(bytes32 => address) public tokenInfoToWrappedToken; - - // Wrapped token Address --> Origin token information - mapping(address => TokenInformation) public wrappedTokenToTokenInfo; - - // Native address - address public gasTokenAddress; - - // Native address - uint32 public gasTokenNetwork; - - // WETH address - TokenWrapped public WETHToken; - - /** - * @param _networkID networkID - * @param _gasTokenAddress gas token address - * @param _gasTokenNetwork gas token network - * @notice This function will be called in the first batch of the zkEVM, the inicialize transaction - * must be sequenced by the consensus smart contract - */ - function initialize( - uint32 _networkID, - address _gasTokenAddress, - uint32 _gasTokenNetwork - ) external virtual initializer { - networkID = _networkID; - - // Set gas token - if (gasTokenAddress == address(0)) { - // gas token will be ether - if (gasTokenNetwork != 0) { - revert GasTokenNetworkMustBeZeroOnEther(); - } - //WETHToken, gasTokenAddress and gasTokenNetwork will be 0 - } else { - // Gas token will be an erc20 - gasTokenAddress = _gasTokenAddress; - gasTokenNetwork = _gasTokenNetwork; - WETHToken = (new TokenWrapped){salt: bytes32(0)}( - "Wrapped Ether", - "WETH", - 18 - ); - } - - // Initialize OZ contracts - __ReentrancyGuard_init(); - } - - /** - * @dev Emitted when bridge assets or messages to another network - */ - event BridgeEvent( - uint8 leafType, - uint32 originNetwork, - address originAddress, - uint32 destinationNetwork, - address destinationAddress, - uint256 amount, - bytes metadata, - uint32 depositCount - ); - - /** - * @dev Emitted when a claim is done from another network - */ - event ClaimEvent( - uint256 globalIndex, - uint32 originNetwork, - address originAddress, - address destinationAddress, - uint256 amount - ); - - /** - * @dev Emitted when a new wrapped token is created - */ - event NewWrappedToken( - uint32 originNetwork, - address originTokenAddress, - address wrappedTokenAddress, - bytes metadata - ); - - /** - * @notice Deposit add a new leaf to the merkle tree - * @param destinationNetwork Network destination - * @param destinationAddress Address destination - * @param amount Amount of tokens - * @param token Token address, 0 address is reserved for ether - * @param forceUpdateGlobalExitRoot Indicates if the new global exit root is updated or not - * @param permitData Raw data of the call `permit` of the token - */ - function bridgeAsset( - uint32 destinationNetwork, - address destinationAddress, - uint256 amount, - address token, - bool forceUpdateGlobalExitRoot, - bytes calldata permitData - ) public payable virtual nonReentrant { - if (destinationNetwork == networkID) { - revert DestinationNetworkInvalid(); - } - - address originTokenAddress; - uint32 originNetwork; - bytes memory metadata; - uint256 leafAmount = amount; - - if (token == address(0)) { - // Check gas token transfer - if (msg.value != amount) { - revert AmountDoesNotMatchMsgValue(); - } - - // Set gas token parameters - originNetwork = gasTokenNetwork; - originTokenAddress = gasTokenAddress; - } else { - // Check msg.value is 0 if tokens are bridged - if (msg.value != 0) { - revert MsgValueNotZero(); - } - - // Check if it's WETH - // In case ether is the native token, WETHToken will be 0, and the address 0 is already checked - if (token == address(WETHToken)) { - // Burn tokens - TokenWrapped(token).burn(msg.sender, amount); - - // Both origin network and originTokenAddress will be 0 - } else { - TokenInformation memory tokenInfo = wrappedTokenToTokenInfo[ - token - ]; - - if (tokenInfo.originTokenAddress != address(0)) { - // The token is a wrapped token from another network - - // Burn tokens - TokenWrapped(token).burn(msg.sender, amount); - - originTokenAddress = tokenInfo.originTokenAddress; - originNetwork = tokenInfo.originNetwork; - } else { - // Use permit if any - if (permitData.length != 0) { - _permit(token, amount, permitData); - } - - // In order to support fee tokens check the amount received, not the transferred - uint256 balanceBefore = IERC20Upgradeable(token).balanceOf( - address(this) - ); - IERC20Upgradeable(token).safeTransferFrom( - msg.sender, - address(this), - amount - ); - uint256 balanceAfter = IERC20Upgradeable(token).balanceOf( - address(this) - ); - - // Override leafAmount with the received amount - leafAmount = balanceAfter - balanceBefore; - - originTokenAddress = token; - originNetwork = networkID; - - // Encode metadata - metadata = abi.encode( - _safeName(token), - _safeSymbol(token), - _safeDecimals(token) - ); - } - } - } - - emit BridgeEvent( - _LEAF_TYPE_ASSET, - originNetwork, - originTokenAddress, - destinationNetwork, - destinationAddress, - leafAmount, - metadata, - uint32(depositCount) - ); - - _addLeaf( - getLeafValue( - _LEAF_TYPE_ASSET, - originNetwork, - originTokenAddress, - destinationNetwork, - destinationAddress, - leafAmount, - keccak256(metadata) - ) - ); - - // Update the new root to the global exit root manager if set by the user - if (forceUpdateGlobalExitRoot) { - _updateGlobalExitRoot(); - } - } - - /** - * @notice Bridge message and send ETH value - * @param destinationNetwork Network destination - * @param destinationAddress Address destination - * @param forceUpdateGlobalExitRoot Indicates if the new global exit root is updated or not - * @param metadata Message metadata - */ - function bridgeMessage( - uint32 destinationNetwork, - address destinationAddress, - bool forceUpdateGlobalExitRoot, - bytes calldata metadata - ) external payable { - // If exist a gas token, only let call this function without value - if (address(WETHToken) != address(0) && msg.value != 0) { - revert NoValueInMessagesOnGasTokenNetworks(); - } - - _bridgeMessage( - destinationNetwork, - destinationAddress, - msg.value, - forceUpdateGlobalExitRoot, - metadata - ); - } - - /** - * @notice Bridge message and send ETH value - * @param destinationNetwork Network destination - * @param destinationAddress Address destination - * @param amountWETH Amount of WETH tokens - * @param forceUpdateGlobalExitRoot Indicates if the new global exit root is updated or not - * @param metadata Message metadata - */ - function bridgeMessageWETH( - uint32 destinationNetwork, - address destinationAddress, - uint256 amountWETH, - bool forceUpdateGlobalExitRoot, - bytes calldata metadata - ) external { - // if native token is ether, disable this function - if (address(WETHToken) == address(0)) { - revert NativeTokenIsEther(); - } - - // Burn wETH tokens - WETHToken.burn(msg.sender, amountWETH); - - _bridgeMessage( - destinationNetwork, - destinationAddress, - amountWETH, - forceUpdateGlobalExitRoot, - metadata - ); - } - - /** - * @notice Bridge message and send ETH value - * @param destinationNetwork Network destination - * @param destinationAddress Address destination - * @param amountEther Amount of ether along with the message - * @param forceUpdateGlobalExitRoot Indicates if the new global exit root is updated or not - * @param metadata Message metadata - */ - function _bridgeMessage( - uint32 destinationNetwork, - address destinationAddress, - uint256 amountEther, - bool forceUpdateGlobalExitRoot, - bytes calldata metadata - ) internal { - if (destinationNetwork == networkID) { - revert DestinationNetworkInvalid(); - } - - emit BridgeEvent( - _LEAF_TYPE_MESSAGE, - networkID, - msg.sender, - destinationNetwork, - destinationAddress, - amountEther, - metadata, - uint32(depositCount) - ); - - _addLeaf( - getLeafValue( - _LEAF_TYPE_MESSAGE, - networkID, - msg.sender, - destinationNetwork, - destinationAddress, - amountEther, - keccak256(metadata) - ) - ); - - // Update the new root to the global exit root manager if set by the user - if (forceUpdateGlobalExitRoot) { - _updateGlobalExitRoot(); - } - } - - /** - * @notice Verify merkle proof and withdraw tokens/ether - * @param smtProofLocalExitRoot Smt proof - * @param smtProofRollupExitRoot Smt proof - * @param globalIndex Global index: bool(isMainnet)||uint32(indexRollupRoot)||uint32(indexDepositLeaf) - * @param mainnetExitRoot Mainnet exit root - * @param rollupExitRoot Rollup exit root - * @param originNetwork Origin network - * @param originTokenAddress Origin token address, 0 address is reserved for ether - * @param destinationNetwork Network destination - * @param destinationAddress Address destination - * @param amount Amount of tokens - * @param metadata Abi encoded metadata if any, empty otherwise - */ - function claimAsset( - bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofLocalExitRoot, - bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot, - uint256 globalIndex, - bytes32 mainnetExitRoot, - bytes32 rollupExitRoot, - uint32 originNetwork, - address originTokenAddress, - uint32 destinationNetwork, - address destinationAddress, - uint256 amount, - bytes calldata metadata - ) external { - // Destination network must be this networkID - if (destinationNetwork != networkID) { - revert DestinationNetworkInvalid(); - } - - // Verify leaf exist and it does not have been claimed - _verifyLeaf( - smtProofLocalExitRoot, - smtProofRollupExitRoot, - globalIndex, - mainnetExitRoot, - rollupExitRoot, - getLeafValue( - _LEAF_TYPE_ASSET, - originNetwork, - originTokenAddress, - destinationNetwork, - destinationAddress, - amount, - keccak256(metadata) - ) - ); - - // Transfer funds - if (originTokenAddress == address(0)) { - if (address(WETHToken) == address(0)) { - // Ether is the native token - /* solhint-disable avoid-low-level-calls */ - (bool success, ) = destinationAddress.call{value: amount}( - new bytes(0) - ); - if (!success) { - revert EtherTransferFailed(); - } - } else { - // Claim wETH - WETHToken.mint(destinationAddress, amount); - } - } else { - // Check if it's gas token - if ( - originTokenAddress == gasTokenAddress && - gasTokenNetwork == originNetwork - ) { - // Transfer gas token - /* solhint-disable avoid-low-level-calls */ - (bool success, ) = destinationAddress.call{value: amount}( - new bytes(0) - ); - if (!success) { - revert EtherTransferFailed(); - } - } else { - // Transfer tokens - if (originNetwork == networkID) { - // The token is an ERC20 from this network - IERC20Upgradeable(originTokenAddress).safeTransfer( - destinationAddress, - amount - ); - } else { - // The tokens is not from this network - // Create a wrapper for the token if not exist yet - bytes32 tokenInfoHash = keccak256( - abi.encodePacked(originNetwork, originTokenAddress) - ); - address wrappedToken = tokenInfoToWrappedToken[ - tokenInfoHash - ]; - - if (wrappedToken == address(0)) { - // Get ERC20 metadata - ( - string memory name, - string memory symbol, - uint8 decimals - ) = abi.decode(metadata, (string, string, uint8)); - - // Create a new wrapped erc20 using create2 - TokenWrapped newWrappedToken = (new TokenWrapped){ - salt: tokenInfoHash - }(name, symbol, decimals); - - // Mint tokens for the destination address - newWrappedToken.mint(destinationAddress, amount); - - // Create mappings - tokenInfoToWrappedToken[tokenInfoHash] = address( - newWrappedToken - ); - - wrappedTokenToTokenInfo[ - address(newWrappedToken) - ] = TokenInformation(originNetwork, originTokenAddress); - - emit NewWrappedToken( - originNetwork, - originTokenAddress, - address(newWrappedToken), - metadata - ); - } else { - // Use the existing wrapped erc20 - TokenWrapped(wrappedToken).mint( - destinationAddress, - amount - ); - } - } - } - } - - emit ClaimEvent( - globalIndex, - originNetwork, - originTokenAddress, - destinationAddress, - amount - ); - } - - /** - * @notice Verify merkle proof and execute message - * If the receiving address is an EOA, the call will result as a success - * Which means that the amount of ether will be transferred correctly, but the message - * will not trigger any execution - * @param smtProofLocalExitRoot Smt proof - * @param smtProofRollupExitRoot Smt proof - * @param globalIndex Index of the leaf - * @param mainnetExitRoot Mainnet exit root - * @param rollupExitRoot Rollup exit root - * @param originNetwork Origin network - * @param originAddress Origin address - * @param destinationNetwork Network destination - * @param destinationAddress Address destination - * @param amount message value - * @param metadata Abi encoded metadata if any, empty otherwise - */ - function claimMessage( - bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofLocalExitRoot, - bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot, - uint256 globalIndex, - bytes32 mainnetExitRoot, - bytes32 rollupExitRoot, - uint32 originNetwork, - address originAddress, - uint32 destinationNetwork, - address destinationAddress, - uint256 amount, - bytes calldata metadata - ) external { - // Destination network must be this networkID - if (destinationNetwork != networkID) { - revert DestinationNetworkInvalid(); - } - // Verify leaf exist and it does not have been claimed - _verifyLeaf( - smtProofLocalExitRoot, - smtProofRollupExitRoot, - globalIndex, - mainnetExitRoot, - rollupExitRoot, - getLeafValue( - _LEAF_TYPE_MESSAGE, - originNetwork, - originAddress, - destinationNetwork, - destinationAddress, - amount, - keccak256(metadata) - ) - ); - - // Execute message - bool success; - if (address(WETHToken) == address(0)) { - // Native token is ether - // Transfer ether - /* solhint-disable avoid-low-level-calls */ - (success, ) = destinationAddress.call{value: amount}( - abi.encodeCall( - IBridgeMessageReceiver.onMessageReceived, - (originAddress, originNetwork, metadata) - ) - ); - } else { - // mint wETH tokens - WETHToken.mint(destinationAddress, amount); - - // Execute message - /* solhint-disable avoid-low-level-calls */ - (success, ) = destinationAddress.call( - abi.encodeCall( - IBridgeMessageReceiver.onMessageReceived, - (originAddress, originNetwork, metadata) - ) - ); - } - - if (!success) { - revert MessageFailed(); - } - - emit ClaimEvent( - globalIndex, - originNetwork, - originAddress, - destinationAddress, - amount - ); - } - - /** - * @notice Returns the precalculated address of a wrapper using the token information - * Note Updating the metadata of a token is not supported. - * Since the metadata has relevance in the address deployed, this function will not return a valid - * wrapped address if the metadata provided is not the original one. - * @param originNetwork Origin network - * @param originTokenAddress Origin token address, 0 address is reserved for ether - * @param name Name of the token - * @param symbol Symbol of the token - * @param decimals Decimals of the token - */ - function precalculatedWrapperAddress( - uint32 originNetwork, - address originTokenAddress, - string calldata name, - string calldata symbol, - uint8 decimals - ) external view returns (address) { - bytes32 salt = keccak256( - abi.encodePacked(originNetwork, originTokenAddress) - ); - - bytes32 hashCreate2 = keccak256( - abi.encodePacked( - bytes1(0xff), - address(this), - salt, - keccak256( - abi.encodePacked( - type(TokenWrapped).creationCode, - abi.encode(name, symbol, decimals) - ) - ) - ) - ); - - // last 20 bytes of hash to address - return address(uint160(uint256(hashCreate2))); - } - - /** - * @notice Returns the address of a wrapper using the token information if already exist - * @param originNetwork Origin network - * @param originTokenAddress Origin token address, 0 address is reserved for ether - */ - function getTokenWrappedAddress( - uint32 originNetwork, - address originTokenAddress - ) external view returns (address) { - return - tokenInfoToWrappedToken[ - keccak256(abi.encodePacked(originNetwork, originTokenAddress)) - ]; - } - - /** - * @notice Verify leaf and checks that it has not been claimed - * @param smtProofLocalExitRoot Smt proof - * @param smtProofRollupExitRoot Smt proof - * @param globalIndex Index of the leaf - * @param mainnetExitRoot Mainnet exit root - * @param rollupExitRoot Rollup exit root - * @param leafValue leaf value - */ - function _verifyLeaf( - bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofLocalExitRoot, - bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot, - uint256 globalIndex, - bytes32 mainnetExitRoot, - bytes32 rollupExitRoot, - bytes32 leafValue - ) internal { - // Check timestamp where the global exit root was set - uint256 timestampGlobalExitRoot = globalExitRootManager - .globalExitRootMap( - GlobalExitRootLib.calculateGlobalExitRoot( - mainnetExitRoot, - rollupExitRoot - ) - ); - - // check that this global exit root exist - if (timestampGlobalExitRoot == 0) { - revert GlobalExitRootInvalid(); - } - - uint32 leafIndex; - uint32 sourceBridgeNetwork; - - // Get origin network from global index - if (globalIndex & _GLOBAL_INDEX_MAINNET_FLAG == 1) { - // It's mainnet, therefore sourceBridgeNetwork is 0 - - // last 32 bits are leafIndex - leafIndex = uint32(globalIndex); - - if ( - !verifyMerkleProof( - leafValue, - smtProofLocalExitRoot, - leafIndex, - mainnetExitRoot - ) - ) { - revert InvalidSmtProof(); - } - } else { - // it's a rollup, therefore we have to get the origin network - uint32 indexRollup = uint32(globalIndex >> 32); - sourceBridgeNetwork = indexRollup + 1; - - // last 32 bits are leafIndex - leafIndex = uint32(globalIndex); - - // verify merkle proof agains rollup exit root - if ( - !verifyMerkleProof( - calculateRoot(leafValue, smtProofLocalExitRoot, leafIndex), - smtProofRollupExitRoot, - indexRollup, - rollupExitRoot - ) - ) { - revert InvalidSmtProof(); - } - } - - // Set and check nullifier - _setAndCheckClaimed(leafIndex, sourceBridgeNetwork); - } - - /** - * @notice Function to check if an index is claimed or not - * @param leafIndex Index - * @param sourceBridgeNetwork origin network - */ - function isClaimed( - uint32 leafIndex, - uint32 sourceBridgeNetwork - ) external view returns (bool) { - // Since this is not a mainnet bridge, we can skip the previous nullifiers check (see PolygonZkEVMBridgeV2) - uint256 globalIndex = uint256(leafIndex) + - uint256(sourceBridgeNetwork) * - _MAX_LEAFS_PER_NETWORK; - - (uint256 wordPos, uint256 bitPos) = _bitmapPositions(globalIndex); - uint256 mask = (1 << bitPos); - return (claimedBitMap[wordPos] & mask) == mask; - } - - /** - * @notice Function to check that an index is not claimed and set it as claimed - * @param leafIndex Index - * @param sourceBridgeNetwork origin network - */ - function _setAndCheckClaimed( - uint32 leafIndex, - uint32 sourceBridgeNetwork - ) private { - // Since this is not a mainnet bridge, we can skip the previous nullifiers check (see PolygonZkEVMBridgeV2) - uint256 globalIndex = uint256(leafIndex) + - uint256(sourceBridgeNetwork) * - _MAX_LEAFS_PER_NETWORK; - - (uint256 wordPos, uint256 bitPos) = _bitmapPositions(globalIndex); - uint256 mask = 1 << bitPos; - uint256 flipped = claimedBitMap[wordPos] ^= mask; - if (flipped & mask == 0) { - revert AlreadyClaimed(); - } - } - - /** - * @notice Function to update the globalExitRoot if the last deposit is not submitted - */ - function updateGlobalExitRoot() external { - if (lastUpdatedDepositCount < depositCount) { - _updateGlobalExitRoot(); - } - } - - /** - * @notice Function to update the globalExitRoot - */ - function _updateGlobalExitRoot() internal { - lastUpdatedDepositCount = uint32(depositCount); - globalExitRootManager.updateExitRoot(getRoot()); - } - - /** - * @notice Function decode an index into a wordPos and bitPos - * @param index Index - */ - function _bitmapPositions( - uint256 index - ) private pure returns (uint256 wordPos, uint256 bitPos) { - wordPos = uint248(index >> 8); - bitPos = uint8(index); - } - - /** - * @notice Function to call token permit method of extended ERC20 - + @param token ERC20 token address - * @param amount Quantity that is expected to be allowed - * @param permitData Raw data of the call `permit` of the token - */ - function _permit( - address token, - uint256 amount, - bytes calldata permitData - ) internal { - bytes4 sig = bytes4(permitData[:4]); - if (sig == _PERMIT_SIGNATURE) { - ( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) = abi.decode( - permitData[4:], - ( - address, - address, - uint256, - uint256, - uint8, - bytes32, - bytes32 - ) - ); - if (owner != msg.sender) { - revert NotValidOwner(); - } - if (spender != address(this)) { - revert NotValidSpender(); - } - - if (value != amount) { - revert NotValidAmount(); - } - - // we call without checking the result, in case it fails and he doesn't have enough balance - // the following transferFrom should be fail. This prevents DoS attacks from using a signature - // before the smartcontract call - /* solhint-disable avoid-low-level-calls */ - address(token).call( - abi.encodeWithSelector( - _PERMIT_SIGNATURE, - owner, - spender, - value, - deadline, - v, - r, - s - ) - ); - } else { - if (sig != _PERMIT_SIGNATURE_DAI) { - revert NotValidSignature(); - } - - ( - address holder, - address spender, - uint256 nonce, - uint256 expiry, - bool allowed, - uint8 v, - bytes32 r, - bytes32 s - ) = abi.decode( - permitData[4:], - ( - address, - address, - uint256, - uint256, - bool, - uint8, - bytes32, - bytes32 - ) - ); - - if (holder != msg.sender) { - revert NotValidOwner(); - } - - if (spender != address(this)) { - revert NotValidSpender(); - } - - // we call without checking the result, in case it fails and he doesn't have enough balance - // the following transferFrom should be fail. This prevents DoS attacks from using a signature - // before the smartcontract call - /* solhint-disable avoid-low-level-calls */ - address(token).call( - abi.encodeWithSelector( - _PERMIT_SIGNATURE_DAI, - holder, - spender, - nonce, - expiry, - allowed, - v, - r, - s - ) - ); - } - } - - // Helpers to safely get the metadata from a token, inspired by https://github.com/traderjoe-xyz/joe-core/blob/main/contracts/MasterChefJoeV3.sol#L55-L95 - - /** - * @notice Provides a safe ERC20.symbol version which returns 'NO_SYMBOL' as fallback string - * @param token The address of the ERC-20 token contract - */ - function _safeSymbol(address token) internal view returns (string memory) { - (bool success, bytes memory data) = address(token).staticcall( - abi.encodeCall(IERC20MetadataUpgradeable.symbol, ()) - ); - return success ? _returnDataToString(data) : "NO_SYMBOL"; - } - - /** - * @notice Provides a safe ERC20.name version which returns 'NO_NAME' as fallback string. - * @param token The address of the ERC-20 token contract. - */ - function _safeName(address token) internal view returns (string memory) { - (bool success, bytes memory data) = address(token).staticcall( - abi.encodeCall(IERC20MetadataUpgradeable.name, ()) - ); - return success ? _returnDataToString(data) : "NO_NAME"; - } - - /** - * @notice Provides a safe ERC20.decimals version which returns '18' as fallback value. - * Note Tokens with (decimals > 255) are not supported - * @param token The address of the ERC-20 token contract - */ - function _safeDecimals(address token) internal view returns (uint8) { - (bool success, bytes memory data) = address(token).staticcall( - abi.encodeCall(IERC20MetadataUpgradeable.decimals, ()) - ); - return success && data.length == 32 ? abi.decode(data, (uint8)) : 18; - } - - /** - * @notice Function to convert returned data to string - * returns 'NOT_VALID_ENCODING' as fallback value. - * @param data returned data - */ - function _returnDataToString( - bytes memory data - ) internal pure returns (string memory) { - if (data.length >= 64) { - return abi.decode(data, (string)); - } else if (data.length == 32) { - // Since the strings on bytes32 are encoded left-right, check the first zero in the data - uint256 nonZeroBytes; - while (nonZeroBytes < 32 && data[nonZeroBytes] != 0) { - nonZeroBytes++; - } - - // If the first one is 0, we do not handle the encoding - if (nonZeroBytes == 0) { - return "NOT_VALID_ENCODING"; - } - // Create a byte array with nonZeroBytes length - bytes memory bytesArray = new bytes(nonZeroBytes); - for (uint256 i = 0; i < nonZeroBytes; i++) { - bytesArray[i] = data[i]; - } - return string(bytesArray); - } else { - return "NOT_VALID_ENCODING"; - } - } -} diff --git a/contracts/v2/interfaces/IPolygonZkEVMBridgeL2.sol b/contracts/v2/interfaces/IPolygonZkEVMBridgeL2.sol deleted file mode 100644 index a6b23c527..000000000 --- a/contracts/v2/interfaces/IPolygonZkEVMBridgeL2.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 - -pragma solidity 0.8.20; -import "./IPolygonZkEVMBaseBridge.sol"; - -interface IPolygonZkEVMBridgeL2 is IPolygonZkEVMBaseBridge { - /** - * @dev Thrown when the permit data contains an invalid signature - */ - error NativeTokenIsEther(); - - /** - * @dev Thrown when the permit data contains an invalid signature - */ - error NoValueInMessagesOnGasTokenNetworks(); - - /** - * @dev Thrown when the permit data contains an invalid signature - */ - error GasTokenNetworkMustBeZeroOnEther(); - - function bridgeMessageWETH( - uint32 destinationNetwork, - address destinationAddress, - uint256 amountWETH, - bool forceUpdateGlobalExitRoot, - bytes calldata metadata - ) external; -} diff --git a/contracts/v2/lib/PolygonRollupBase.sol b/contracts/v2/lib/PolygonRollupBase.sol index 2d4b43f4e..8dabf430a 100644 --- a/contracts/v2/lib/PolygonRollupBase.sol +++ b/contracts/v2/lib/PolygonRollupBase.sol @@ -11,7 +11,8 @@ import "../../interfaces/IPolygonZkEVMErrors.sol"; import "../interfaces/IPolygonZkEVMV2Errors.sol"; import "../PolygonRollupManager.sol"; import "../interfaces/IPolygonRollupBase.sol"; -import "../L2/PolygonZkEVMBridgeL2.sol"; +import "../PolygonZkEVMBridgeV2.sol"; +import "../../interfaces/IBasePolygonZkEVMGlobalExitRoot.sol"; /** * Contract responsible for managing the states and the updates of L2 network. @@ -98,11 +99,11 @@ contract PolygonRollupBase is // This should be a protection against someone that tries to generate huge chunk of invalid batches, and we can't prove otherwise before the pending timeout expires uint64 internal constant _MAX_VERIFY_BATCHES = 1000; - // List rlp: 1 listLenLen "0xf8" (0xf7 + 1), + listLen 1 "0x83" + // List rlp: 1 listLenLen "0xf8" (0xf7 + 1), + listLen 1 "0xc3" // 1 nonce "0x80" + 1 gasPrice "0x80" + 5 gasLimit "0x8401c9c380" + 21 to "0x942a3dd3eb832af982ec71669e178424b10dca2ede" - // + 1 value "0x80" + 1 stringLenLen "0xb8" (0xb7 + 1) + stringLen 1 "0x64" + 100 bytes data ( signature 4 bytes + 3parameters*32bytes) = 131 bytes (0x83) + // + 1 value "0x80" + 1 stringLenLen "0xb8" (0xb7 + 1) + stringLen 1 "0xa4" + 164 bytes data ( signature 4 bytes + 5parameters*32bytes) = 195 bytes (0xc3) bytes public constant BASE_INITIALIZE_TX_BRIDGE = - hex"f88380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b864"; + hex"f8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4"; // Signature used to initialize the bridge @@ -120,6 +121,13 @@ contract PolygonRollupBase is // S parameter of the initialize signature bytes1 public constant INITIALIZE_TX_EFFECTIVE_PERCENTAGE = 0xFF; + // Global Exit Root address L2 + IBasePolygonZkEVMGlobalExitRoot + public constant GLOBAL_EXIT_ROOT_MANAGER_L2 = + IBasePolygonZkEVMGlobalExitRoot( + 0xa40D5f56745a118D0906a34E69aeC8C0Db1cB8fA + ); + // POL token address IERC20Upgradeable public immutable pol; @@ -799,8 +807,14 @@ contract PolygonRollupBase is bytes memory bytesToSign = abi.encodePacked( BASE_INITIALIZE_TX_BRIDGE, abi.encodeCall( - PolygonZkEVMBridgeL2.initialize, - (networkID, _gasTokenAddress, _gasTokenNetwork) + PolygonZkEVMBridgeV2.initialize, + ( + networkID, + _gasTokenAddress, + _gasTokenNetwork, + GLOBAL_EXIT_ROOT_MANAGER_L2, + address(0) // Rollup manager on L2 does not exist + ) ) ); diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index b62b82841..6b1071b97 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -10,6 +10,7 @@ import { PolygonZkEVMV2, PolygonRollupBase, TokenWrapped, + Address, } from "../../typechain-types"; import {takeSnapshot, time} from "@nomicfoundation/hardhat-network-helpers"; import {processorUtils, contractUtils, MTBridge, mtBridgeUtils} from "@0xpolygonhermez/zkevm-commonjs"; @@ -54,6 +55,8 @@ describe("Polygon ZK-EVM TestnetV2", () => { const LEAF_TYPE_ASSET = 0; const LEAF_TYPE_MESSAGE = 1; + const globalExitRootL2Address = "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa" as unknown as Address; + let firstDeployment = true; //roles @@ -416,11 +419,13 @@ describe("Polygon ZK-EVM TestnetV2", () => { const txBase = await newZkEVMContract.BASE_INITIALIZE_TX_BRIDGE(); // Check transaction - const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeL2"); + const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); const encodedData = bridgeL2Factory.interface.encodeFunctionData("initialize", [ newCreatedRollupID, gasTokenAddress, gasTokenNetwork, + globalExitRootL2Address, + ethers.ZeroAddress, ]); const rawTx = processorUtils.customRawTxToRawTx(transaction); From 764f294b9877f08849d91f8fab39000b79764d82 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 10 Oct 2023 11:11:59 +0200 Subject: [PATCH 054/230] if does not compile, jsut comment it ^^ --- contracts/mocks/Uni.sol | 1590 +++++++++--------- contracts/mocks/VerifierRollupHelperMock.sol | 2 +- 2 files changed, 792 insertions(+), 800 deletions(-) diff --git a/contracts/mocks/Uni.sol b/contracts/mocks/Uni.sol index 3a24a6c5a..cd467abc3 100644 --- a/contracts/mocks/Uni.sol +++ b/contracts/mocks/Uni.sol @@ -1,799 +1,791 @@ -/** - *Submitted for verification at Etherscan.io on 2020-09-16 - */ - -/** - *Submitted for verification at Etherscan.io on 2020-09-15 - */ - -pragma solidity ^0.5.16; -pragma experimental ABIEncoderV2; - -// From https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/Math.sol -// Subject to the MIT license. - -/** - * @dev Wrappers over Solidity's arithmetic operations with added overflow - * checks. - * - * Arithmetic operations in Solidity wrap on overflow. This can easily result - * in bugs, because programmers usually assume that an overflow raises an - * error, which is the standard behavior in high level programming languages. - * `SafeMath` restores this intuition by reverting the transaction when an - * operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - */ -library SafeMath { - /** - * @dev Returns the addition of two unsigned integers, reverting on overflow. - * - * Counterpart to Solidity's `+` operator. - * - * Requirements: - * - Addition cannot overflow. - */ - function add(uint256 a, uint256 b) internal pure returns (uint256) { - uint256 c = a + b; - require(c >= a, "SafeMath: addition overflow"); - - return c; - } - - /** - * @dev Returns the addition of two unsigned integers, reverting with custom message on overflow. - * - * Counterpart to Solidity's `+` operator. - * - * Requirements: - * - Addition cannot overflow. - */ - function add( - uint256 a, - uint256 b, - string memory errorMessage - ) internal pure returns (uint256) { - uint256 c = a + b; - require(c >= a, errorMessage); - - return c; - } - - /** - * @dev Returns the subtraction of two unsigned integers, reverting on underflow (when the result is negative). - * - * Counterpart to Solidity's `-` operator. - * - * Requirements: - * - Subtraction cannot underflow. - */ - function sub(uint256 a, uint256 b) internal pure returns (uint256) { - return sub(a, b, "SafeMath: subtraction underflow"); - } - - /** - * @dev Returns the subtraction of two unsigned integers, reverting with custom message on underflow (when the result is negative). - * - * Counterpart to Solidity's `-` operator. - * - * Requirements: - * - Subtraction cannot underflow. - */ - function sub( - uint256 a, - uint256 b, - string memory errorMessage - ) internal pure returns (uint256) { - require(b <= a, errorMessage); - uint256 c = a - b; - - return c; - } - - /** - * @dev Returns the multiplication of two unsigned integers, reverting on overflow. - * - * Counterpart to Solidity's `*` operator. - * - * Requirements: - * - Multiplication cannot overflow. - */ - function mul(uint256 a, uint256 b) internal pure returns (uint256) { - // Gas optimization: this is cheaper than requiring 'a' not being zero, but the - // benefit is lost if 'b' is also tested. - // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 - if (a == 0) { - return 0; - } - - uint256 c = a * b; - require(c / a == b, "SafeMath: multiplication overflow"); - - return c; - } - - /** - * @dev Returns the multiplication of two unsigned integers, reverting on overflow. - * - * Counterpart to Solidity's `*` operator. - * - * Requirements: - * - Multiplication cannot overflow. - */ - function mul( - uint256 a, - uint256 b, - string memory errorMessage - ) internal pure returns (uint256) { - // Gas optimization: this is cheaper than requiring 'a' not being zero, but the - // benefit is lost if 'b' is also tested. - // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 - if (a == 0) { - return 0; - } - - uint256 c = a * b; - require(c / a == b, errorMessage); - - return c; - } - - /** - * @dev Returns the integer division of two unsigned integers. - * Reverts on division by zero. The result is rounded towards zero. - * - * Counterpart to Solidity's `/` operator. Note: this function uses a - * `revert` opcode (which leaves remaining gas untouched) while Solidity - * uses an invalid opcode to revert (consuming all remaining gas). - * - * Requirements: - * - The divisor cannot be zero. - */ - function div(uint256 a, uint256 b) internal pure returns (uint256) { - return div(a, b, "SafeMath: division by zero"); - } - - /** - * @dev Returns the integer division of two unsigned integers. - * Reverts with custom message on division by zero. The result is rounded towards zero. - * - * Counterpart to Solidity's `/` operator. Note: this function uses a - * `revert` opcode (which leaves remaining gas untouched) while Solidity - * uses an invalid opcode to revert (consuming all remaining gas). - * - * Requirements: - * - The divisor cannot be zero. - */ - function div( - uint256 a, - uint256 b, - string memory errorMessage - ) internal pure returns (uint256) { - // Solidity only automatically asserts when dividing by 0 - require(b > 0, errorMessage); - uint256 c = a / b; - // assert(a == b * c + a % b); // There is no case in which this doesn't hold - - return c; - } - - /** - * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), - * Reverts when dividing by zero. - * - * Counterpart to Solidity's `%` operator. This function uses a `revert` - * opcode (which leaves remaining gas untouched) while Solidity uses an - * invalid opcode to revert (consuming all remaining gas). - * - * Requirements: - * - The divisor cannot be zero. - */ - function mod(uint256 a, uint256 b) internal pure returns (uint256) { - return mod(a, b, "SafeMath: modulo by zero"); - } - - /** - * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), - * Reverts with custom message when dividing by zero. - * - * Counterpart to Solidity's `%` operator. This function uses a `revert` - * opcode (which leaves remaining gas untouched) while Solidity uses an - * invalid opcode to revert (consuming all remaining gas). - * - * Requirements: - * - The divisor cannot be zero. - */ - function mod( - uint256 a, - uint256 b, - string memory errorMessage - ) internal pure returns (uint256) { - require(b != 0, errorMessage); - return a % b; - } -} - -contract Uni { - /// @notice EIP-20 token name for this token - string public constant name = "Uniswap"; - - /// @notice EIP-20 token symbol for this token - string public constant symbol = "UNI"; - - /// @notice EIP-20 token decimals for this token - uint8 public constant decimals = 18; - - /// @notice Total number of tokens in circulation - uint256 public totalSupply = 1_000_000_000e18; // 1 billion Uni - - /// @notice Address which may mint new tokens - address public minter; - - /// @notice The timestamp after which minting may occur - uint256 public mintingAllowedAfter; - - /// @notice Minimum time between mints - uint32 public constant minimumTimeBetweenMints = 1 days * 365; - - /// @notice Cap on the percentage of totalSupply that can be minted at each mint - uint8 public constant mintCap = 2; - - /// @notice Allowance amounts on behalf of others - mapping(address => mapping(address => uint96)) internal allowances; - - /// @notice Official record of token balances for each account - mapping(address => uint96) internal balances; - - /// @notice A record of each accounts delegate - mapping(address => address) public delegates; - - /// @notice A checkpoint for marking number of votes from a given block - struct Checkpoint { - uint32 fromBlock; - uint96 votes; - } - - /// @notice A record of votes checkpoints for each account, by index - mapping(address => mapping(uint32 => Checkpoint)) public checkpoints; - - /// @notice The number of checkpoints for each account - mapping(address => uint32) public numCheckpoints; - - /// @notice The EIP-712 typehash for the contract's domain - bytes32 public constant DOMAIN_TYPEHASH = - keccak256( - "EIP712Domain(string name,uint256 chainId,address verifyingContract)" - ); - - /// @notice The EIP-712 typehash for the delegation struct used by the contract - bytes32 public constant DELEGATION_TYPEHASH = - keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); - - /// @notice The EIP-712 typehash for the permit struct used by the contract - bytes32 public constant PERMIT_TYPEHASH = - keccak256( - "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" - ); - - /// @notice A record of states for signing / validating signatures - mapping(address => uint256) public nonces; - - /// @notice An event thats emitted when the minter address is changed - event MinterChanged(address minter, address newMinter); - - /// @notice An event thats emitted when an account changes its delegate - event DelegateChanged( - address indexed delegator, - address indexed fromDelegate, - address indexed toDelegate - ); - - /// @notice An event thats emitted when a delegate account's vote balance changes - event DelegateVotesChanged( - address indexed delegate, - uint256 previousBalance, - uint256 newBalance - ); - - /// @notice The standard EIP-20 transfer event - event Transfer(address indexed from, address indexed to, uint256 amount); - - /// @notice The standard EIP-20 approval event - event Approval( - address indexed owner, - address indexed spender, - uint256 amount - ); - - /** - * @notice Construct a new Uni token - * @param account The initial account to grant all the tokens - * @param minter_ The account with minting ability - * @param mintingAllowedAfter_ The timestamp after which minting may occur - */ - constructor( - address account, - address minter_, - uint256 mintingAllowedAfter_ - ) public { - require( - mintingAllowedAfter_ >= block.timestamp, - "Uni::constructor: minting can only begin after deployment" - ); - - balances[account] = uint96(totalSupply); - emit Transfer(address(0), account, totalSupply); - minter = minter_; - emit MinterChanged(address(0), minter); - mintingAllowedAfter = mintingAllowedAfter_; - } - - /** - * @notice Change the minter address - * @param minter_ The address of the new minter - */ - function setMinter(address minter_) external { - require( - msg.sender == minter, - "Uni::setMinter: only the minter can change the minter address" - ); - emit MinterChanged(minter, minter_); - minter = minter_; - } - - /** - * @notice Mint new tokens - * @param dst The address of the destination account - * @param rawAmount The number of tokens to be minted - */ - function mint(address dst, uint256 rawAmount) external { - require(msg.sender == minter, "Uni::mint: only the minter can mint"); - require( - block.timestamp >= mintingAllowedAfter, - "Uni::mint: minting not allowed yet" - ); - require( - dst != address(0), - "Uni::mint: cannot transfer to the zero address" - ); - - // record the mint - mintingAllowedAfter = SafeMath.add( - block.timestamp, - minimumTimeBetweenMints - ); - - // mint the amount - uint96 amount = safe96(rawAmount, "Uni::mint: amount exceeds 96 bits"); - require( - amount <= SafeMath.div(SafeMath.mul(totalSupply, mintCap), 100), - "Uni::mint: exceeded mint cap" - ); - totalSupply = safe96( - SafeMath.add(totalSupply, amount), - "Uni::mint: totalSupply exceeds 96 bits" - ); - - // transfer the amount to the recipient - balances[dst] = add96( - balances[dst], - amount, - "Uni::mint: transfer amount overflows" - ); - emit Transfer(address(0), dst, amount); - - // move delegates - _moveDelegates(address(0), delegates[dst], amount); - } - - /** - * @notice Get the number of tokens `spender` is approved to spend on behalf of `account` - * @param account The address of the account holding the funds - * @param spender The address of the account spending the funds - * @return The number of tokens approved - */ - function allowance(address account, address spender) - external - view - returns (uint256) - { - return allowances[account][spender]; - } - - /** - * @notice Approve `spender` to transfer up to `amount` from `src` - * @dev This will overwrite the approval amount for `spender` - * and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve) - * @param spender The address of the account which may transfer tokens - * @param rawAmount The number of tokens that are approved (2^256-1 means infinite) - * @return Whether or not the approval succeeded - */ - function approve(address spender, uint256 rawAmount) - external - returns (bool) - { - uint96 amount; - if (rawAmount == uint256(-1)) { - amount = uint96(-1); - } else { - amount = safe96(rawAmount, "Uni::approve: amount exceeds 96 bits"); - } - - allowances[msg.sender][spender] = amount; - - emit Approval(msg.sender, spender, amount); - return true; - } - - /** - * @notice Triggers an approval from owner to spends - * @param owner The address to approve from - * @param spender The address to be approved - * @param rawAmount The number of tokens that are approved (2^256-1 means infinite) - * @param deadline The time at which to expire the signature - * @param v The recovery byte of the signature - * @param r Half of the ECDSA signature pair - * @param s Half of the ECDSA signature pair - */ - function permit( - address owner, - address spender, - uint256 rawAmount, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external { - uint96 amount; - if (rawAmount == uint256(-1)) { - amount = uint96(-1); - } else { - amount = safe96(rawAmount, "Uni::permit: amount exceeds 96 bits"); - } - - bytes32 domainSeparator = keccak256( - abi.encode( - DOMAIN_TYPEHASH, - keccak256(bytes(name)), - getChainId(), - address(this) - ) - ); - bytes32 structHash = keccak256( - abi.encode( - PERMIT_TYPEHASH, - owner, - spender, - rawAmount, - nonces[owner]++, - deadline - ) - ); - bytes32 digest = keccak256( - abi.encodePacked("\x19\x01", domainSeparator, structHash) - ); - address signatory = ecrecover(digest, v, r, s); - require(signatory != address(0), "Uni::permit: invalid signature"); - require(signatory == owner, "Uni::permit: unauthorized"); - require(now <= deadline, "Uni::permit: signature expired"); - - allowances[owner][spender] = amount; - - emit Approval(owner, spender, amount); - } - - /** - * @notice Get the number of tokens held by the `account` - * @param account The address of the account to get the balance of - * @return The number of tokens held - */ - function balanceOf(address account) external view returns (uint256) { - return balances[account]; - } - - /** - * @notice Transfer `amount` tokens from `msg.sender` to `dst` - * @param dst The address of the destination account - * @param rawAmount The number of tokens to transfer - * @return Whether or not the transfer succeeded - */ - function transfer(address dst, uint256 rawAmount) external returns (bool) { - uint96 amount = safe96( - rawAmount, - "Uni::transfer: amount exceeds 96 bits" - ); - _transferTokens(msg.sender, dst, amount); - return true; - } - - /** - * @notice Transfer `amount` tokens from `src` to `dst` - * @param src The address of the source account - * @param dst The address of the destination account - * @param rawAmount The number of tokens to transfer - * @return Whether or not the transfer succeeded - */ - function transferFrom( - address src, - address dst, - uint256 rawAmount - ) external returns (bool) { - address spender = msg.sender; - uint96 spenderAllowance = allowances[src][spender]; - uint96 amount = safe96( - rawAmount, - "Uni::approve: amount exceeds 96 bits" - ); - - if (spender != src && spenderAllowance != uint96(-1)) { - uint96 newAllowance = sub96( - spenderAllowance, - amount, - "Uni::transferFrom: transfer amount exceeds spender allowance" - ); - allowances[src][spender] = newAllowance; - - emit Approval(src, spender, newAllowance); - } - - _transferTokens(src, dst, amount); - return true; - } - - /** - * @notice Delegate votes from `msg.sender` to `delegatee` - * @param delegatee The address to delegate votes to - */ - function delegate(address delegatee) public { - return _delegate(msg.sender, delegatee); - } - - /** - * @notice Delegates votes from signatory to `delegatee` - * @param delegatee The address to delegate votes to - * @param nonce The contract state required to match the signature - * @param expiry The time at which to expire the signature - * @param v The recovery byte of the signature - * @param r Half of the ECDSA signature pair - * @param s Half of the ECDSA signature pair - */ - function delegateBySig( - address delegatee, - uint256 nonce, - uint256 expiry, - uint8 v, - bytes32 r, - bytes32 s - ) public { - bytes32 domainSeparator = keccak256( - abi.encode( - DOMAIN_TYPEHASH, - keccak256(bytes(name)), - getChainId(), - address(this) - ) - ); - bytes32 structHash = keccak256( - abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry) - ); - bytes32 digest = keccak256( - abi.encodePacked("\x19\x01", domainSeparator, structHash) - ); - address signatory = ecrecover(digest, v, r, s); - require( - signatory != address(0), - "Uni::delegateBySig: invalid signature" - ); - require( - nonce == nonces[signatory]++, - "Uni::delegateBySig: invalid nonce" - ); - require(now <= expiry, "Uni::delegateBySig: signature expired"); - return _delegate(signatory, delegatee); - } - - /** - * @notice Gets the current votes balance for `account` - * @param account The address to get votes balance - * @return The number of current votes for `account` - */ - function getCurrentVotes(address account) external view returns (uint96) { - uint32 nCheckpoints = numCheckpoints[account]; - return - nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; - } - - /** - * @notice Determine the prior number of votes for an account as of a block number - * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. - * @param account The address of the account to check - * @param blockNumber The block number to get the vote balance at - * @return The number of votes the account had as of the given block - */ - function getPriorVotes(address account, uint256 blockNumber) - public - view - returns (uint96) - { - require( - blockNumber < block.number, - "Uni::getPriorVotes: not yet determined" - ); - - uint32 nCheckpoints = numCheckpoints[account]; - if (nCheckpoints == 0) { - return 0; - } - - // First check most recent balance - if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { - return checkpoints[account][nCheckpoints - 1].votes; - } - - // Next check implicit zero balance - if (checkpoints[account][0].fromBlock > blockNumber) { - return 0; - } - - uint32 lower = 0; - uint32 upper = nCheckpoints - 1; - while (upper > lower) { - uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow - Checkpoint memory cp = checkpoints[account][center]; - if (cp.fromBlock == blockNumber) { - return cp.votes; - } else if (cp.fromBlock < blockNumber) { - lower = center; - } else { - upper = center - 1; - } - } - return checkpoints[account][lower].votes; - } - - function _delegate(address delegator, address delegatee) internal { - address currentDelegate = delegates[delegator]; - uint96 delegatorBalance = balances[delegator]; - delegates[delegator] = delegatee; - - emit DelegateChanged(delegator, currentDelegate, delegatee); - - _moveDelegates(currentDelegate, delegatee, delegatorBalance); - } - - function _transferTokens( - address src, - address dst, - uint96 amount - ) internal { - require( - src != address(0), - "Uni::_transferTokens: cannot transfer from the zero address" - ); - require( - dst != address(0), - "Uni::_transferTokens: cannot transfer to the zero address" - ); - - balances[src] = sub96( - balances[src], - amount, - "Uni::_transferTokens: transfer amount exceeds balance" - ); - balances[dst] = add96( - balances[dst], - amount, - "Uni::_transferTokens: transfer amount overflows" - ); - emit Transfer(src, dst, amount); - - _moveDelegates(delegates[src], delegates[dst], amount); - } - - function _moveDelegates( - address srcRep, - address dstRep, - uint96 amount - ) internal { - if (srcRep != dstRep && amount > 0) { - if (srcRep != address(0)) { - uint32 srcRepNum = numCheckpoints[srcRep]; - uint96 srcRepOld = srcRepNum > 0 - ? checkpoints[srcRep][srcRepNum - 1].votes - : 0; - uint96 srcRepNew = sub96( - srcRepOld, - amount, - "Uni::_moveVotes: vote amount underflows" - ); - _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); - } - - if (dstRep != address(0)) { - uint32 dstRepNum = numCheckpoints[dstRep]; - uint96 dstRepOld = dstRepNum > 0 - ? checkpoints[dstRep][dstRepNum - 1].votes - : 0; - uint96 dstRepNew = add96( - dstRepOld, - amount, - "Uni::_moveVotes: vote amount overflows" - ); - _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); - } - } - } - - function _writeCheckpoint( - address delegatee, - uint32 nCheckpoints, - uint96 oldVotes, - uint96 newVotes - ) internal { - uint32 blockNumber = safe32( - block.number, - "Uni::_writeCheckpoint: block number exceeds 32 bits" - ); - - if ( - nCheckpoints > 0 && - checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber - ) { - checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; - } else { - checkpoints[delegatee][nCheckpoints] = Checkpoint( - blockNumber, - newVotes - ); - numCheckpoints[delegatee] = nCheckpoints + 1; - } - - emit DelegateVotesChanged(delegatee, oldVotes, newVotes); - } - - function safe32(uint256 n, string memory errorMessage) - internal - pure - returns (uint32) - { - require(n < 2**32, errorMessage); - return uint32(n); - } - - function safe96(uint256 n, string memory errorMessage) - internal - pure - returns (uint96) - { - require(n < 2**96, errorMessage); - return uint96(n); - } - - function add96( - uint96 a, - uint96 b, - string memory errorMessage - ) internal pure returns (uint96) { - uint96 c = a + b; - require(c >= a, errorMessage); - return c; - } - - function sub96( - uint96 a, - uint96 b, - string memory errorMessage - ) internal pure returns (uint96) { - require(b <= a, errorMessage); - return a - b; - } - - function getChainId() internal pure returns (uint256) { - uint256 chainId; - assembly { - chainId := chainid() - } - return chainId; - } -} +// /** +// *Submitted for verification at Etherscan.io on 2020-09-16 +// */ + +// /** +// *Submitted for verification at Etherscan.io on 2020-09-15 +// */ + +// pragma solidity ^0.5.16; +// pragma experimental ABIEncoderV2; + +// // From https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/Math.sol +// // Subject to the MIT license. + +// /** +// * @dev Wrappers over Solidity's arithmetic operations with added overflow +// * checks. +// * +// * Arithmetic operations in Solidity wrap on overflow. This can easily result +// * in bugs, because programmers usually assume that an overflow raises an +// * error, which is the standard behavior in high level programming languages. +// * `SafeMath` restores this intuition by reverting the transaction when an +// * operation overflows. +// * +// * Using this library instead of the unchecked operations eliminates an entire +// * class of bugs, so it's recommended to use it always. +// */ +// library SafeMath { +// /** +// * @dev Returns the addition of two unsigned integers, reverting on overflow. +// * +// * Counterpart to Solidity's `+` operator. +// * +// * Requirements: +// * - Addition cannot overflow. +// */ +// function add(uint256 a, uint256 b) internal pure returns (uint256) { +// uint256 c = a + b; +// require(c >= a, "SafeMath: addition overflow"); + +// return c; +// } + +// /** +// * @dev Returns the addition of two unsigned integers, reverting with custom message on overflow. +// * +// * Counterpart to Solidity's `+` operator. +// * +// * Requirements: +// * - Addition cannot overflow. +// */ +// function add( +// uint256 a, +// uint256 b, +// string memory errorMessage +// ) internal pure returns (uint256) { +// uint256 c = a + b; +// require(c >= a, errorMessage); + +// return c; +// } + +// /** +// * @dev Returns the subtraction of two unsigned integers, reverting on underflow (when the result is negative). +// * +// * Counterpart to Solidity's `-` operator. +// * +// * Requirements: +// * - Subtraction cannot underflow. +// */ +// function sub(uint256 a, uint256 b) internal pure returns (uint256) { +// return sub(a, b, "SafeMath: subtraction underflow"); +// } + +// /** +// * @dev Returns the subtraction of two unsigned integers, reverting with custom message on underflow (when the result is negative). +// * +// * Counterpart to Solidity's `-` operator. +// * +// * Requirements: +// * - Subtraction cannot underflow. +// */ +// function sub( +// uint256 a, +// uint256 b, +// string memory errorMessage +// ) internal pure returns (uint256) { +// require(b <= a, errorMessage); +// uint256 c = a - b; + +// return c; +// } + +// /** +// * @dev Returns the multiplication of two unsigned integers, reverting on overflow. +// * +// * Counterpart to Solidity's `*` operator. +// * +// * Requirements: +// * - Multiplication cannot overflow. +// */ +// function mul(uint256 a, uint256 b) internal pure returns (uint256) { +// // Gas optimization: this is cheaper than requiring 'a' not being zero, but the +// // benefit is lost if 'b' is also tested. +// // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 +// if (a == 0) { +// return 0; +// } + +// uint256 c = a * b; +// require(c / a == b, "SafeMath: multiplication overflow"); + +// return c; +// } + +// /** +// * @dev Returns the multiplication of two unsigned integers, reverting on overflow. +// * +// * Counterpart to Solidity's `*` operator. +// * +// * Requirements: +// * - Multiplication cannot overflow. +// */ +// function mul( +// uint256 a, +// uint256 b, +// string memory errorMessage +// ) internal pure returns (uint256) { +// // Gas optimization: this is cheaper than requiring 'a' not being zero, but the +// // benefit is lost if 'b' is also tested. +// // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 +// if (a == 0) { +// return 0; +// } + +// uint256 c = a * b; +// require(c / a == b, errorMessage); + +// return c; +// } + +// /** +// * @dev Returns the integer division of two unsigned integers. +// * Reverts on division by zero. The result is rounded towards zero. +// * +// * Counterpart to Solidity's `/` operator. Note: this function uses a +// * `revert` opcode (which leaves remaining gas untouched) while Solidity +// * uses an invalid opcode to revert (consuming all remaining gas). +// * +// * Requirements: +// * - The divisor cannot be zero. +// */ +// function div(uint256 a, uint256 b) internal pure returns (uint256) { +// return div(a, b, "SafeMath: division by zero"); +// } + +// /** +// * @dev Returns the integer division of two unsigned integers. +// * Reverts with custom message on division by zero. The result is rounded towards zero. +// * +// * Counterpart to Solidity's `/` operator. Note: this function uses a +// * `revert` opcode (which leaves remaining gas untouched) while Solidity +// * uses an invalid opcode to revert (consuming all remaining gas). +// * +// * Requirements: +// * - The divisor cannot be zero. +// */ +// function div( +// uint256 a, +// uint256 b, +// string memory errorMessage +// ) internal pure returns (uint256) { +// // Solidity only automatically asserts when dividing by 0 +// require(b > 0, errorMessage); +// uint256 c = a / b; +// // assert(a == b * c + a % b); // There is no case in which this doesn't hold + +// return c; +// } + +// /** +// * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), +// * Reverts when dividing by zero. +// * +// * Counterpart to Solidity's `%` operator. This function uses a `revert` +// * opcode (which leaves remaining gas untouched) while Solidity uses an +// * invalid opcode to revert (consuming all remaining gas). +// * +// * Requirements: +// * - The divisor cannot be zero. +// */ +// function mod(uint256 a, uint256 b) internal pure returns (uint256) { +// return mod(a, b, "SafeMath: modulo by zero"); +// } + +// /** +// * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), +// * Reverts with custom message when dividing by zero. +// * +// * Counterpart to Solidity's `%` operator. This function uses a `revert` +// * opcode (which leaves remaining gas untouched) while Solidity uses an +// * invalid opcode to revert (consuming all remaining gas). +// * +// * Requirements: +// * - The divisor cannot be zero. +// */ +// function mod( +// uint256 a, +// uint256 b, +// string memory errorMessage +// ) internal pure returns (uint256) { +// require(b != 0, errorMessage); +// return a % b; +// } +// } + +// contract Uni { +// /// @notice EIP-20 token name for this token +// string public constant name = "Uniswap"; + +// /// @notice EIP-20 token symbol for this token +// string public constant symbol = "UNI"; + +// /// @notice EIP-20 token decimals for this token +// uint8 public constant decimals = 18; + +// /// @notice Total number of tokens in circulation +// uint256 public totalSupply = 1_000_000_000e18; // 1 billion Uni + +// /// @notice Address which may mint new tokens +// address public minter; + +// /// @notice The timestamp after which minting may occur +// uint256 public mintingAllowedAfter; + +// /// @notice Minimum time between mints +// uint32 public constant minimumTimeBetweenMints = 1 days * 365; + +// /// @notice Cap on the percentage of totalSupply that can be minted at each mint +// uint8 public constant mintCap = 2; + +// /// @notice Allowance amounts on behalf of others +// mapping(address => mapping(address => uint96)) internal allowances; + +// /// @notice Official record of token balances for each account +// mapping(address => uint96) internal balances; + +// /// @notice A record of each accounts delegate +// mapping(address => address) public delegates; + +// /// @notice A checkpoint for marking number of votes from a given block +// struct Checkpoint { +// uint32 fromBlock; +// uint96 votes; +// } + +// /// @notice A record of votes checkpoints for each account, by index +// mapping(address => mapping(uint32 => Checkpoint)) public checkpoints; + +// /// @notice The number of checkpoints for each account +// mapping(address => uint32) public numCheckpoints; + +// /// @notice The EIP-712 typehash for the contract's domain +// bytes32 public constant DOMAIN_TYPEHASH = +// keccak256( +// "EIP712Domain(string name,uint256 chainId,address verifyingContract)" +// ); + +// /// @notice The EIP-712 typehash for the delegation struct used by the contract +// bytes32 public constant DELEGATION_TYPEHASH = +// keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); + +// /// @notice The EIP-712 typehash for the permit struct used by the contract +// bytes32 public constant PERMIT_TYPEHASH = +// keccak256( +// "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" +// ); + +// /// @notice A record of states for signing / validating signatures +// mapping(address => uint256) public nonces; + +// /// @notice An event thats emitted when the minter address is changed +// event MinterChanged(address minter, address newMinter); + +// /// @notice An event thats emitted when an account changes its delegate +// event DelegateChanged( +// address indexed delegator, +// address indexed fromDelegate, +// address indexed toDelegate +// ); + +// /// @notice An event thats emitted when a delegate account's vote balance changes +// event DelegateVotesChanged( +// address indexed delegate, +// uint256 previousBalance, +// uint256 newBalance +// ); + +// /// @notice The standard EIP-20 transfer event +// event Transfer(address indexed from, address indexed to, uint256 amount); + +// /// @notice The standard EIP-20 approval event +// event Approval( +// address indexed owner, +// address indexed spender, +// uint256 amount +// ); + +// /** +// * @notice Construct a new Uni token +// * @param account The initial account to grant all the tokens +// * @param minter_ The account with minting ability +// * @param mintingAllowedAfter_ The timestamp after which minting may occur +// */ +// constructor( +// address account, +// address minter_, +// uint256 mintingAllowedAfter_ +// ) public { +// require( +// mintingAllowedAfter_ >= block.timestamp, +// "Uni::constructor: minting can only begin after deployment" +// ); + +// balances[account] = uint96(totalSupply); +// emit Transfer(address(0), account, totalSupply); +// minter = minter_; +// emit MinterChanged(address(0), minter); +// mintingAllowedAfter = mintingAllowedAfter_; +// } + +// /** +// * @notice Change the minter address +// * @param minter_ The address of the new minter +// */ +// function setMinter(address minter_) external { +// require( +// msg.sender == minter, +// "Uni::setMinter: only the minter can change the minter address" +// ); +// emit MinterChanged(minter, minter_); +// minter = minter_; +// } + +// /** +// * @notice Mint new tokens +// * @param dst The address of the destination account +// * @param rawAmount The number of tokens to be minted +// */ +// function mint(address dst, uint256 rawAmount) external { +// require(msg.sender == minter, "Uni::mint: only the minter can mint"); +// require( +// block.timestamp >= mintingAllowedAfter, +// "Uni::mint: minting not allowed yet" +// ); +// require( +// dst != address(0), +// "Uni::mint: cannot transfer to the zero address" +// ); + +// // record the mint +// mintingAllowedAfter = SafeMath.add( +// block.timestamp, +// minimumTimeBetweenMints +// ); + +// // mint the amount +// uint96 amount = safe96(rawAmount, "Uni::mint: amount exceeds 96 bits"); +// require( +// amount <= SafeMath.div(SafeMath.mul(totalSupply, mintCap), 100), +// "Uni::mint: exceeded mint cap" +// ); +// totalSupply = safe96( +// SafeMath.add(totalSupply, amount), +// "Uni::mint: totalSupply exceeds 96 bits" +// ); + +// // transfer the amount to the recipient +// balances[dst] = add96( +// balances[dst], +// amount, +// "Uni::mint: transfer amount overflows" +// ); +// emit Transfer(address(0), dst, amount); + +// // move delegates +// _moveDelegates(address(0), delegates[dst], amount); +// } + +// /** +// * @notice Get the number of tokens `spender` is approved to spend on behalf of `account` +// * @param account The address of the account holding the funds +// * @param spender The address of the account spending the funds +// * @return The number of tokens approved +// */ +// function allowance( +// address account, +// address spender +// ) external view returns (uint256) { +// return allowances[account][spender]; +// } + +// /** +// * @notice Approve `spender` to transfer up to `amount` from `src` +// * @dev This will overwrite the approval amount for `spender` +// * and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve) +// * @param spender The address of the account which may transfer tokens +// * @param rawAmount The number of tokens that are approved (2^256-1 means infinite) +// * @return Whether or not the approval succeeded +// */ +// function approve( +// address spender, +// uint256 rawAmount +// ) external returns (bool) { +// uint96 amount; +// if (rawAmount == uint256(-1)) { +// amount = uint96(-1); +// } else { +// amount = safe96(rawAmount, "Uni::approve: amount exceeds 96 bits"); +// } + +// allowances[msg.sender][spender] = amount; + +// emit Approval(msg.sender, spender, amount); +// return true; +// } + +// /** +// * @notice Triggers an approval from owner to spends +// * @param owner The address to approve from +// * @param spender The address to be approved +// * @param rawAmount The number of tokens that are approved (2^256-1 means infinite) +// * @param deadline The time at which to expire the signature +// * @param v The recovery byte of the signature +// * @param r Half of the ECDSA signature pair +// * @param s Half of the ECDSA signature pair +// */ +// function permit( +// address owner, +// address spender, +// uint256 rawAmount, +// uint256 deadline, +// uint8 v, +// bytes32 r, +// bytes32 s +// ) external { +// uint96 amount; +// if (rawAmount == uint256(-1)) { +// amount = uint96(-1); +// } else { +// amount = safe96(rawAmount, "Uni::permit: amount exceeds 96 bits"); +// } + +// bytes32 domainSeparator = keccak256( +// abi.encode( +// DOMAIN_TYPEHASH, +// keccak256(bytes(name)), +// getChainId(), +// address(this) +// ) +// ); +// bytes32 structHash = keccak256( +// abi.encode( +// PERMIT_TYPEHASH, +// owner, +// spender, +// rawAmount, +// nonces[owner]++, +// deadline +// ) +// ); +// bytes32 digest = keccak256( +// abi.encodePacked("\x19\x01", domainSeparator, structHash) +// ); +// address signatory = ecrecover(digest, v, r, s); +// require(signatory != address(0), "Uni::permit: invalid signature"); +// require(signatory == owner, "Uni::permit: unauthorized"); +// require(now <= deadline, "Uni::permit: signature expired"); + +// allowances[owner][spender] = amount; + +// emit Approval(owner, spender, amount); +// } + +// /** +// * @notice Get the number of tokens held by the `account` +// * @param account The address of the account to get the balance of +// * @return The number of tokens held +// */ +// function balanceOf(address account) external view returns (uint256) { +// return balances[account]; +// } + +// /** +// * @notice Transfer `amount` tokens from `msg.sender` to `dst` +// * @param dst The address of the destination account +// * @param rawAmount The number of tokens to transfer +// * @return Whether or not the transfer succeeded +// */ +// function transfer(address dst, uint256 rawAmount) external returns (bool) { +// uint96 amount = safe96( +// rawAmount, +// "Uni::transfer: amount exceeds 96 bits" +// ); +// _transferTokens(msg.sender, dst, amount); +// return true; +// } + +// /** +// * @notice Transfer `amount` tokens from `src` to `dst` +// * @param src The address of the source account +// * @param dst The address of the destination account +// * @param rawAmount The number of tokens to transfer +// * @return Whether or not the transfer succeeded +// */ +// function transferFrom( +// address src, +// address dst, +// uint256 rawAmount +// ) external returns (bool) { +// address spender = msg.sender; +// uint96 spenderAllowance = allowances[src][spender]; +// uint96 amount = safe96( +// rawAmount, +// "Uni::approve: amount exceeds 96 bits" +// ); + +// if (spender != src && spenderAllowance != uint96(-1)) { +// uint96 newAllowance = sub96( +// spenderAllowance, +// amount, +// "Uni::transferFrom: transfer amount exceeds spender allowance" +// ); +// allowances[src][spender] = newAllowance; + +// emit Approval(src, spender, newAllowance); +// } + +// _transferTokens(src, dst, amount); +// return true; +// } + +// /** +// * @notice Delegate votes from `msg.sender` to `delegatee` +// * @param delegatee The address to delegate votes to +// */ +// function delegate(address delegatee) public { +// return _delegate(msg.sender, delegatee); +// } + +// /** +// * @notice Delegates votes from signatory to `delegatee` +// * @param delegatee The address to delegate votes to +// * @param nonce The contract state required to match the signature +// * @param expiry The time at which to expire the signature +// * @param v The recovery byte of the signature +// * @param r Half of the ECDSA signature pair +// * @param s Half of the ECDSA signature pair +// */ +// function delegateBySig( +// address delegatee, +// uint256 nonce, +// uint256 expiry, +// uint8 v, +// bytes32 r, +// bytes32 s +// ) public { +// bytes32 domainSeparator = keccak256( +// abi.encode( +// DOMAIN_TYPEHASH, +// keccak256(bytes(name)), +// getChainId(), +// address(this) +// ) +// ); +// bytes32 structHash = keccak256( +// abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry) +// ); +// bytes32 digest = keccak256( +// abi.encodePacked("\x19\x01", domainSeparator, structHash) +// ); +// address signatory = ecrecover(digest, v, r, s); +// require( +// signatory != address(0), +// "Uni::delegateBySig: invalid signature" +// ); +// require( +// nonce == nonces[signatory]++, +// "Uni::delegateBySig: invalid nonce" +// ); +// require(now <= expiry, "Uni::delegateBySig: signature expired"); +// return _delegate(signatory, delegatee); +// } + +// /** +// * @notice Gets the current votes balance for `account` +// * @param account The address to get votes balance +// * @return The number of current votes for `account` +// */ +// function getCurrentVotes(address account) external view returns (uint96) { +// uint32 nCheckpoints = numCheckpoints[account]; +// return +// nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; +// } + +// /** +// * @notice Determine the prior number of votes for an account as of a block number +// * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. +// * @param account The address of the account to check +// * @param blockNumber The block number to get the vote balance at +// * @return The number of votes the account had as of the given block +// */ +// function getPriorVotes( +// address account, +// uint256 blockNumber +// ) public view returns (uint96) { +// require( +// blockNumber < block.number, +// "Uni::getPriorVotes: not yet determined" +// ); + +// uint32 nCheckpoints = numCheckpoints[account]; +// if (nCheckpoints == 0) { +// return 0; +// } + +// // First check most recent balance +// if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { +// return checkpoints[account][nCheckpoints - 1].votes; +// } + +// // Next check implicit zero balance +// if (checkpoints[account][0].fromBlock > blockNumber) { +// return 0; +// } + +// uint32 lower = 0; +// uint32 upper = nCheckpoints - 1; +// while (upper > lower) { +// uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow +// Checkpoint memory cp = checkpoints[account][center]; +// if (cp.fromBlock == blockNumber) { +// return cp.votes; +// } else if (cp.fromBlock < blockNumber) { +// lower = center; +// } else { +// upper = center - 1; +// } +// } +// return checkpoints[account][lower].votes; +// } + +// function _delegate(address delegator, address delegatee) internal { +// address currentDelegate = delegates[delegator]; +// uint96 delegatorBalance = balances[delegator]; +// delegates[delegator] = delegatee; + +// emit DelegateChanged(delegator, currentDelegate, delegatee); + +// _moveDelegates(currentDelegate, delegatee, delegatorBalance); +// } + +// function _transferTokens(address src, address dst, uint96 amount) internal { +// require( +// src != address(0), +// "Uni::_transferTokens: cannot transfer from the zero address" +// ); +// require( +// dst != address(0), +// "Uni::_transferTokens: cannot transfer to the zero address" +// ); + +// balances[src] = sub96( +// balances[src], +// amount, +// "Uni::_transferTokens: transfer amount exceeds balance" +// ); +// balances[dst] = add96( +// balances[dst], +// amount, +// "Uni::_transferTokens: transfer amount overflows" +// ); +// emit Transfer(src, dst, amount); + +// _moveDelegates(delegates[src], delegates[dst], amount); +// } + +// function _moveDelegates( +// address srcRep, +// address dstRep, +// uint96 amount +// ) internal { +// if (srcRep != dstRep && amount > 0) { +// if (srcRep != address(0)) { +// uint32 srcRepNum = numCheckpoints[srcRep]; +// uint96 srcRepOld = srcRepNum > 0 +// ? checkpoints[srcRep][srcRepNum - 1].votes +// : 0; +// uint96 srcRepNew = sub96( +// srcRepOld, +// amount, +// "Uni::_moveVotes: vote amount underflows" +// ); +// _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); +// } + +// if (dstRep != address(0)) { +// uint32 dstRepNum = numCheckpoints[dstRep]; +// uint96 dstRepOld = dstRepNum > 0 +// ? checkpoints[dstRep][dstRepNum - 1].votes +// : 0; +// uint96 dstRepNew = add96( +// dstRepOld, +// amount, +// "Uni::_moveVotes: vote amount overflows" +// ); +// _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); +// } +// } +// } + +// function _writeCheckpoint( +// address delegatee, +// uint32 nCheckpoints, +// uint96 oldVotes, +// uint96 newVotes +// ) internal { +// uint32 blockNumber = safe32( +// block.number, +// "Uni::_writeCheckpoint: block number exceeds 32 bits" +// ); + +// if ( +// nCheckpoints > 0 && +// checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber +// ) { +// checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; +// } else { +// checkpoints[delegatee][nCheckpoints] = Checkpoint( +// blockNumber, +// newVotes +// ); +// numCheckpoints[delegatee] = nCheckpoints + 1; +// } + +// emit DelegateVotesChanged(delegatee, oldVotes, newVotes); +// } + +// function safe32( +// uint256 n, +// string memory errorMessage +// ) internal pure returns (uint32) { +// require(n < 2 ** 32, errorMessage); +// return uint32(n); +// } + +// function safe96( +// uint256 n, +// string memory errorMessage +// ) internal pure returns (uint96) { +// require(n < 2 ** 96, errorMessage); +// return uint96(n); +// } + +// function add96( +// uint96 a, +// uint96 b, +// string memory errorMessage +// ) internal pure returns (uint96) { +// uint96 c = a + b; +// require(c >= a, errorMessage); +// return c; +// } + +// function sub96( +// uint96 a, +// uint96 b, +// string memory errorMessage +// ) internal pure returns (uint96) { +// require(b <= a, errorMessage); +// return a - b; +// } + +// function getChainId() internal pure returns (uint256) { +// uint256 chainId; +// assembly { +// chainId := chainid() +// } +// return chainId; +// } +// } diff --git a/contracts/mocks/VerifierRollupHelperMock.sol b/contracts/mocks/VerifierRollupHelperMock.sol index d7bca9b95..85e6b9192 100644 --- a/contracts/mocks/VerifierRollupHelperMock.sol +++ b/contracts/mocks/VerifierRollupHelperMock.sol @@ -8,7 +8,7 @@ contract VerifierRollupHelperMock is IVerifierRollup { function verifyProof( bytes32[24] calldata proof, uint256[1] memory pubSignals - ) public view override returns (bool) { + ) public pure override returns (bool) { return true; } } From ee42c5f720ac417169e5fa9eef65226db4ad6039 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 10 Oct 2023 12:34:22 +0200 Subject: [PATCH 055/230] fixing tests --- hardhat.config.ts | 4 +- test/contractsv2/BridgeV2.test.ts | 103 +++++++++++++++++------------- 2 files changed, 62 insertions(+), 45 deletions(-) diff --git a/hardhat.config.ts b/hardhat.config.ts index 634ef9e9a..423a2b1c6 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -76,12 +76,12 @@ const config: HardhatUserConfig = { evmVersion: "shanghai", }, // try yul optimizer }, - "contracts/v2/L2/PolygonZkEVMBridgeL2.sol": { + "contracts/v2/PolygonZkEVMBridgeV2.sol": { version: "0.8.20", settings: { optimizer: { enabled: true, - runs: 9999, + runs: 999999, }, evmVersion: "shanghai", }, diff --git a/test/contractsv2/BridgeV2.test.ts b/test/contractsv2/BridgeV2.test.ts index 38339c339..09cac9b85 100644 --- a/test/contractsv2/BridgeV2.test.ts +++ b/test/contractsv2/BridgeV2.test.ts @@ -515,19 +515,19 @@ describe("PolygonZkEVMBridge Contract", () => { it("should claim tokens from Rollup to Mainnet", async () => { const originNetwork = networkIDRollup; - const tokenAddress = ethers.getAddress(ethers.hexlify(ethers.randomBytes(20))); + const tokenAddress = polTokenContract.target; const amount = ethers.parseEther("10"); const destinationNetwork = networkIDMainnet; const destinationAddress = deployer.address; - const metadata = metadataToken; // since we are inserting in the exit root can be anything + const metadata = metadataToken; const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); const mainnetExitRoot = await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot(); // compute root merkle tree in Js const height = 32; - const merkleTreeRollup = new MerkleTreeBridge(height); + const merkleTreeLocal = new MerkleTreeBridge(height); const leafValue = getLeafValue( LEAF_TYPE_ASSET, originNetwork, @@ -537,57 +537,69 @@ describe("PolygonZkEVMBridge Contract", () => { amount, metadataHash ); + merkleTreeLocal.add(leafValue); + merkleTreeLocal.add(leafValue); - // Add 2 leafs - merkleTreeRollup + leafValue; - merkleTreeRollup + leafValue; + const rootLocalRollup = merkleTreeLocal.getRoot(); - // check merkle root with SC - const rootJSRollup = merkleTreeRollup.getRoot(); + // Try claim with 10 rollup leafs + const merkleTreeRollup = new MerkleTreeBridge(height); + for (let i = 0; i < 10; i++) { + merkleTreeRollup.add(rootLocalRollup); + } + + const rootRollup = merkleTreeRollup.getRoot(); // check only rollup account with update rollup exit root - await expect(polygonZkEVMGlobalExitRoot.updateExitRoot(rootJSRollup)).to.be.revertedWithCustomError( - polygonZkEVMBridgeContract, + await expect(polygonZkEVMGlobalExitRoot.updateExitRoot(rootRollup)).to.be.revertedWithCustomError( + polygonZkEVMGlobalExitRoot, "OnlyAllowedContracts" ); // add rollup Merkle root - await expect(polygonZkEVMGlobalExitRoot.connect(rollup).updateExitRoot(rootJSRollup)) + await expect(polygonZkEVMGlobalExitRoot.connect(rollupManager).updateExitRoot(rootRollup)) .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") - .withArgs(mainnetExitRoot, rootJSRollup); + .withArgs(mainnetExitRoot, rootRollup); // check roots const rollupExitRootSC = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); - expect(rollupExitRootSC).to.be.equal(rootJSRollup); + expect(rollupExitRootSC).to.be.equal(rootRollup); const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC); expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); // check merkle proof - const proof = merkleTreeRollup.getProofTreeByIndex(0); - const index = 0; + + // Merkle proof local + const indexLocal = 0; + const proofLocal = merkleTreeLocal.getProofTreeByIndex(indexLocal); + + // Merkle proof local + const indexRollup = 5; + const proofRollup = merkleTreeRollup.getProofTreeByIndex(indexRollup); // verify merkle proof - expect(verifyMerkleProof(leafValue, proof, index, rootJSRollup)).to.be.equal(true); - expect(await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proof, index, rootJSRollup)).to.be.equal( - true - ); + expect(verifyMerkleProof(leafValue, proofLocal, indexLocal, rootLocalRollup)).to.be.equal(true); + expect(verifyMerkleProof(rootLocalRollup, proofRollup, indexRollup, rootRollup)).to.be.equal(true); + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(rootLocalRollup, proofRollup, indexRollup, rootRollup) + ).to.be.equal(true); + const globalIndex = computeGlobalIndex(indexLocal, indexRollup, false); - // claim + expect(false).to.be.equal(await polygonZkEVMBridgeContract.isClaimed(indexLocal, indexRollup + 1)); - // precalculate wrapped erc20 address + // claim const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); - // create2 parameters const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]); const minimalBytecodeProxy = tokenWrappedFactory.bytecode; const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]); const precalculateWrappedErc20 = await ethers.getCreate2Address( - polygonZkEVMBridgeContract.target, + polygonZkEVMBridgeContract.target as string, salt, hashInitCode ); - const newWrappedToken = tokenWrappedFactory.attach(precalculateWrappedErc20); + const newWrappedToken = tokenWrappedFactory.attach(precalculateWrappedErc20) as TokenWrapped; // Use precalculatedWrapperAddress and check if matches expect( @@ -602,8 +614,9 @@ describe("PolygonZkEVMBridge Contract", () => { await expect( polygonZkEVMBridgeContract.claimAsset( - proof, - index, + proofLocal, + proofRollup, + globalIndex, mainnetExitRoot, rollupExitRootSC, originNetwork, @@ -615,13 +628,12 @@ describe("PolygonZkEVMBridge Contract", () => { ) ) .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") - .withArgs(index, originNetwork, tokenAddress, destinationAddress, amount) + .withArgs(globalIndex, originNetwork, tokenAddress, destinationAddress, amount) .to.emit(polygonZkEVMBridgeContract, "NewWrappedToken") .withArgs(originNetwork, tokenAddress, precalculateWrappedErc20, metadata) .to.emit(newWrappedToken, "Transfer") - .withArgs(ethers.ZeroAddress, deployer.address, amount); + .withArgs(ethers.ZeroAddress, destinationAddress, amount); - // Assert maps created const newTokenInfo = await polygonZkEVMBridgeContract.wrappedTokenToTokenInfo(precalculateWrappedErc20); expect(newTokenInfo.originNetwork).to.be.equal(networkIDRollup); @@ -643,8 +655,9 @@ describe("PolygonZkEVMBridge Contract", () => { // Can't claim because nullifier await expect( polygonZkEVMBridgeContract.claimAsset( - proof, - index, + proofLocal, + proofRollup, + globalIndex, mainnetExitRoot, rollupExitRootSC, originNetwork, @@ -655,18 +668,23 @@ describe("PolygonZkEVMBridge Contract", () => { metadata ) ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AlreadyClaimed"); + expect(true).to.be.equal(await polygonZkEVMBridgeContract.isClaimed(indexLocal, indexRollup + 1)); - // Check new token expect(await newWrappedToken.totalSupply()).to.be.equal(amount); // Claim again the other leaf to mint tokens const index2 = 1; - const proof2 = merkleTreeRollup.getProofTreeByIndex(index2); + const proof2 = merkleTreeLocal.getProofTreeByIndex(index2); + + expect(verifyMerkleProof(leafValue, proof2, index2, rootLocalRollup)).to.be.equal(true); + expect(verifyMerkleProof(rootLocalRollup, proofRollup, indexRollup, rollupExitRootSC)).to.be.equal(true); + const globalIndex2 = computeGlobalIndex(index2, indexRollup, false); await expect( polygonZkEVMBridgeContract.claimAsset( proof2, - index2, + proofRollup, + globalIndex2, mainnetExitRoot, rollupExitRootSC, originNetwork, @@ -678,9 +696,9 @@ describe("PolygonZkEVMBridge Contract", () => { ) ) .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") - .withArgs(index, originNetwork, tokenAddress, destinationAddress, amount) + .withArgs(globalIndex2, originNetwork, tokenAddress, destinationAddress, amount) .to.emit(newWrappedToken, "Transfer") - .withArgs(ethers.ZeroAddress, deployer.address, amount); + .withArgs(ethers.ZeroAddress, destinationAddress, amount); // Burn Tokens const depositCount = await polygonZkEVMBridgeContract.depositCount(); @@ -724,13 +742,12 @@ describe("PolygonZkEVMBridge Contract", () => { ); expect(leafValueMainnet).to.be.equal(leafValueMainnetSC); - merkleTreeMainnet + leafValueMainnet; + merkleTreeMainnet.add(leafValueMainnet); const rootJSMainnet = merkleTreeMainnet.getRoot(); // Tokens are burnt - expect(await newWrappedToken.totalSupply()).to.be.equal(ethers.BigNumber.from(amount).mul(2)); - expect(await newWrappedToken.balanceOf(deployer.address)).to.be.equal(ethers.BigNumber.from(amount).mul(2)); - + expect(await newWrappedToken.totalSupply()).to.be.equal(amount * 2n); + expect(await newWrappedToken.balanceOf(destinationAddress)).to.be.equal(amount * 2n); await expect( polygonZkEVMBridgeContract.bridgeAsset( newDestinationNetwork, @@ -923,7 +940,7 @@ describe("PolygonZkEVMBridge Contract", () => { const rootJSRollup = merkleTree.getRoot(); // add rollup Merkle root - await expect(polygonZkEVMGlobalExitRoot.connect(rollup).updateExitRoot(rootJSRollup)) + await expect(polygonZkEVMGlobalExitRoot.connect(rollupManager).updateExitRoot(rootJSRollup)) .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") .withArgs(mainnetExitRoot, rootJSRollup); @@ -1080,7 +1097,7 @@ describe("PolygonZkEVMBridge Contract", () => { const rootJSRollup = merkleTree.getRoot(); // add rollup Merkle root - await expect(polygonZkEVMGlobalExitRoot.connect(rollup).updateExitRoot(rootJSRollup)) + await expect(polygonZkEVMGlobalExitRoot.connect(rollupManager).updateExitRoot(rootJSRollup)) .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") .withArgs(mainnetExitRoot, rootJSRollup); @@ -1236,7 +1253,7 @@ describe("PolygonZkEVMBridge Contract", () => { const rootJSRollup = merkleTree.getRoot(); // add rollup Merkle root - await expect(polygonZkEVMGlobalExitRoot.connect(rollup).updateExitRoot(rootJSRollup)) + await expect(polygonZkEVMGlobalExitRoot.connect(rollupManager).updateExitRoot(rootJSRollup)) .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") .withArgs(mainnetExitRoot, rootJSRollup); From 1c943df3e4be0d4bfb08117f43f0fb2c379ff09c Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 10 Oct 2023 12:49:08 +0200 Subject: [PATCH 056/230] reduce bytecode bridge --- contracts/v2/PolygonRollupManager.sol | 1 + contracts/v2/lib/DepositContractLib.sol | 15 +-------------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index 804d8646e..cb0e8cb8b 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -294,6 +294,7 @@ contract PolygonRollupManager is // Rollups mapping // chainID => rollupID + // review, should we reserve some ChainIDs? mapping(uint64 chainID => uint32 rollupID) public chainIDToRollupID; // Total sequenced batches between all rollups diff --git a/contracts/v2/lib/DepositContractLib.sol b/contracts/v2/lib/DepositContractLib.sol index a26099419..3c6723432 100644 --- a/contracts/v2/lib/DepositContractLib.sol +++ b/contracts/v2/lib/DepositContractLib.sol @@ -99,20 +99,7 @@ contract DepositContractLib { uint32 index, bytes32 root ) public pure returns (bool) { - bytes32 node = leafHash; - - // Check merkle proof - for ( - uint256 height = 0; - height < _DEPOSIT_CONTRACT_TREE_DEPTH; - height++ - ) { - if (((index >> height) & 1) == 1) - node = keccak256(abi.encodePacked(smtProof[height], node)); - else node = keccak256(abi.encodePacked(node, smtProof[height])); - } - - return node == root; + return calculateRoot(leafHash, smtProof, index) == root; } /** From edb6906d414875cc5c8fa5c9215c856c93eb8b06 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 10 Oct 2023 14:01:49 +0200 Subject: [PATCH 057/230] small updates --- contracts/v2/PolygonRollupManager.sol | 5 +++-- .../{DepositContractLib.sol => DepositContractBase.sol} | 2 +- contracts/v2/lib/DepositContractV2.sol | 4 ++-- hardhat.config.ts | 2 +- test/contractsv2/BridgeV2.test.ts | 8 ++++++-- 5 files changed, 13 insertions(+), 8 deletions(-) rename contracts/v2/lib/{DepositContractLib.sol => DepositContractBase.sol} (99%) diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index cb0e8cb8b..4cd4b01bc 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -14,7 +14,7 @@ import "../interfaces/IVerifierRollup.sol"; import "./consensus/zkEVM/PolygonZkEVMV2Existent.sol"; // review check contract slots! -// review legacy storage slots base +// TODO legacy storage slots base /** * Contract responsible for managing the exit roots across multiple Rollups */ @@ -1715,6 +1715,7 @@ contract PolygonRollupManager is // In the first iteration the nodes will be the leafs which are the local exit roots of each network for (uint256 i = 0; i < currentNodes; i++) { + // The first rollup ID starts on 1 tmpTree[i] = rollupIDToRollupData[uint32(i + 1)].lastLocalExitRoot; } @@ -1741,7 +1742,7 @@ contract PolygonRollupManager is } } - // update tree bariables + // update tree variables tmpTree = nextTmpTree; currentNodes = nextIterationNodes; currentZeroHashHeight = keccak256( diff --git a/contracts/v2/lib/DepositContractLib.sol b/contracts/v2/lib/DepositContractBase.sol similarity index 99% rename from contracts/v2/lib/DepositContractLib.sol rename to contracts/v2/lib/DepositContractBase.sol index 3c6723432..c4636e19e 100644 --- a/contracts/v2/lib/DepositContractLib.sol +++ b/contracts/v2/lib/DepositContractBase.sol @@ -5,7 +5,7 @@ pragma solidity 0.8.20; * 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 */ -contract DepositContractLib { +contract DepositContractBase { /** * @dev Thrown when the merkle tree is full */ diff --git a/contracts/v2/lib/DepositContractV2.sol b/contracts/v2/lib/DepositContractV2.sol index 3abb418ef..494783589 100644 --- a/contracts/v2/lib/DepositContractV2.sol +++ b/contracts/v2/lib/DepositContractV2.sol @@ -2,13 +2,13 @@ pragma solidity 0.8.20; import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; -import "./DepositContractLib.sol"; +import "./DepositContractBase.sol"; /** * 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 */ -contract DepositContractV2 is ReentrancyGuardUpgradeable, DepositContractLib { +contract DepositContractV2 is ReentrancyGuardUpgradeable, DepositContractBase { /** * @notice Given the leaf data returns the leaf value * @param leafType Leaf type --> [0] transfer Ether / ERC20 tokens, [1] message diff --git a/hardhat.config.ts b/hardhat.config.ts index 423a2b1c6..ebebfe019 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -81,7 +81,7 @@ const config: HardhatUserConfig = { settings: { optimizer: { enabled: true, - runs: 999999, + runs: 9999, }, evmVersion: "shanghai", }, diff --git a/test/contractsv2/BridgeV2.test.ts b/test/contractsv2/BridgeV2.test.ts index 09cac9b85..69da94a10 100644 --- a/test/contractsv2/BridgeV2.test.ts +++ b/test/contractsv2/BridgeV2.test.ts @@ -404,11 +404,16 @@ describe("PolygonZkEVMBridge Contract", () => { merkleTreeLocal.add(leafValue); const rootLocalRollup = merkleTreeLocal.getRoot(); + const indexRollup = 5; // Try claim with 10 rollup leafs const merkleTreeRollup = new MerkleTreeBridge(height); for (let i = 0; i < 10; i++) { - merkleTreeRollup.add(rootLocalRollup); + if (i == indexRollup) { + merkleTreeRollup.add(rootLocalRollup); + } else { + merkleTreeRollup.add(ethers.toBeHex(ethers.toQuantity(ethers.randomBytes(32)), 32)); + } } const rootRollup = merkleTreeRollup.getRoot(); @@ -438,7 +443,6 @@ describe("PolygonZkEVMBridge Contract", () => { const proofLocal = merkleTreeLocal.getProofTreeByIndex(indexLocal); // Merkle proof local - const indexRollup = 5; const proofRollup = merkleTreeRollup.getProofTreeByIndex(indexRollup); // verify merkle proof From c08ddae71f68112dab51c1c65c5b2935cbeaa5d1 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 10 Oct 2023 15:39:21 +0200 Subject: [PATCH 058/230] legacy storage slots contract --- contracts/v2/PolygonRollupManager.sol | 126 +----------------- contracts/v2/PolygonZkEVMBridgeV2.sol | 1 + .../v2/lib/LegacyZKEVMStateVariables.sol | 126 ++++++++++++++++++ 3 files changed, 131 insertions(+), 122 deletions(-) create mode 100644 contracts/v2/lib/LegacyZKEVMStateVariables.sol diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index 4cd4b01bc..596c72e00 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -6,38 +6,27 @@ import "./interfaces/IPolygonRollupManager.sol"; import "../interfaces/IPolygonZkEVMGlobalExitRoot.sol"; import "../interfaces/IPolygonZkEVMBridge.sol"; import "./interfaces/IPolygonRollupBase.sol"; +import "../interfaces/IVerifierRollup.sol"; import "../lib/EmergencyManager.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; import "./lib/PolygonTransparentProxy.sol"; import "./lib/PolygonAccessControlUpgradeable.sol"; -import "../interfaces/IVerifierRollup.sol"; +import "./lib/LegacyZKEVMStateVariables.sol"; import "./consensus/zkEVM/PolygonZkEVMV2Existent.sol"; // review check contract slots! -// TODO legacy storage slots base + /** * Contract responsible for managing the exit roots across multiple Rollups */ contract PolygonRollupManager is PolygonAccessControlUpgradeable, EmergencyManager, + LegacyZKEVMStateVariables, IPolygonRollupManager { using SafeERC20Upgradeable for IERC20Upgradeable; - /** - * @notice Struct which will be stored for every batch sequence - * @param accInputHash Hash chain that contains all the information to process a batch: - * keccak256(bytes32 oldAccInputHash, keccak256(bytes transactions), bytes32 globalExitRoot, uint64 timestamp, address seqAddress) - * @param sequencedTimestamp Sequenced timestamp - * @param previousLastBatchSequenced Previous last batch sequenced before the current one, this is used to properly calculate the fees - */ - struct SequencedBatchData { - bytes32 accInputHash; - uint64 sequencedTimestamp; - uint64 previousLastBatchSequenced; - } - /** * @notice Struct which to store the rollup type data * @param consensusImplementation Consensus implementation ( contains the consensus logic for the transaparent proxy) @@ -81,23 +70,6 @@ contract PolygonRollupManager is uint8 rollupCompatibilityID; } - /** - * @notice Struct to store the pending states - * Pending state will be an intermediary state, that after a timeout can be consolidated, which means that will be added - * to the state root mapping, and the global exit root will be updated - * This is a protection mechanism against soundness attacks, that will be turned off in the future - * @param timestamp Timestamp where the pending state is added to the queue - * @param lastVerifiedBatch Last batch verified batch of this pending state - * @param exitRoot Pending exit root - * @param stateRoot Pending state root - */ - struct PendingState { - uint64 timestamp; - uint64 lastVerifiedBatch; - bytes32 exitRoot; - bytes32 stateRoot; - } - // Modulus zkSNARK uint256 internal constant _RFIELD = 21888242871839275222246405745257275088548364400416034343698204186575808495617; @@ -186,96 +158,6 @@ contract PolygonRollupManager is // POL token address IERC20Upgradeable public immutable pol; - // since this contract will be an update of the PolygonZkEVM there are legacy variables - // This ones would not be used generally,just for reserve the same storage slots, since - // this contract will be - - // Time target of the verification of a batch - // Adaptatly the batchFee will be updated to achieve this target - uint64 internal _legacyVerifyBatchTimeTarget; - - // Batch fee multiplier with 3 decimals that goes from 1000 - 1023 - uint16 internal _legacyMultiplierBatchFee; - - // Trusted sequencer address - address internal _legacyTrustedSequencer; - - // Current matic fee per batch sequenced - uint256 internal _legacyBatchFee; - - // Queue of forced batches with their associated data - // ForceBatchNum --> hashedForcedBatchData - // hashedForcedBatchData: hash containing the necessary information to force a batch: - // keccak256(keccak256(bytes transactions), bytes32 globalExitRoot, unint64 minForcedTimestamp) - mapping(uint64 => bytes32) internal _legacyForcedBatches; - - // Queue of batches that defines the virtual state - // SequenceBatchNum --> SequencedBatchData - mapping(uint64 => SequencedBatchData) internal _legacySequencedBatches; - - // Last sequenced timestamp - uint64 internal _legacyLastTimestamp; - - // Last batch sent by the sequencers - uint64 internal _legacylastBatchSequenced; - - // Last forced batch included in the sequence - uint64 internal _legacyLastForceBatchSequenced; - - // Last forced batch - uint64 internal _legacyLastForceBatch; - - // Last batch verified by the aggregators - uint64 internal _legacyLastVerifiedBatch; - - // Trusted aggregator address - address internal _legacyTrustedAggregator; - - // State root mapping - // BatchNum --> state root - mapping(uint64 => bytes32) internal _legacyBatchNumToStateRoot; - - // Trusted sequencer URL - string internal _legacyTrustedSequencerURL; - - // L2 network name - string internal _legacyNetworkName; - - // Pending state mapping - // pendingStateNumber --> PendingState - mapping(uint256 => PendingState) internal _legacyPendingStateTransitions; - - // Last pending state - uint64 internal _legacyLastPendingState; - - // Last pending state consolidated - uint64 internal _legacyLastPendingStateConsolidated; - - // Once a pending state exceeds this timeout it can be consolidated - uint64 internal _legacyPendingStateTimeout; - - // Trusted aggregator timeout, if a sequence is not verified in this time frame, - // everyone can verify that sequence - uint64 internal _legacyTrustedAggregatorTimeout; - - // Address that will be able to adjust contract parameters or stop the emergency state - address internal _legacyAdmin; - - // This account will be able to accept the admin role - address internal _legacyPendingAdmin; - - // Force batch timeout - uint64 internal _legacyForceBatchTimeout; - - // Indicates if forced batches are disallowed - bool internal _legacyIsForcedBatchDisallowed; - - // Indicates the current version - uint256 internal _legacyVersion; - - // Last batch verified before the last upgrade - uint256 internal _legacyLastVerifiedBatchBeforeUpgrade; - // Number of rollup types added, every new consensus will be assigned sequencially a new ID uint32 public rollupTypeCount; diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index 99b48424f..12e5c3423 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -750,6 +750,7 @@ contract PolygonZkEVMBridgeV2 is uint32 sourceBridgeNetwork; // Get origin network from global index + // review globalINdex, should assert the rest of unused bits to 0 if (globalIndex & _GLOBAL_INDEX_MAINNET_FLAG == 1) { // It's mainnet, therefore sourceBridgeNetwork is 0 diff --git a/contracts/v2/lib/LegacyZKEVMStateVariables.sol b/contracts/v2/lib/LegacyZKEVMStateVariables.sol new file mode 100644 index 000000000..c960f5a57 --- /dev/null +++ b/contracts/v2/lib/LegacyZKEVMStateVariables.sol @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: AGPL-3.0 + +pragma solidity 0.8.20; + +/** + * 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 + */ +contract LegacyZKEVMStateVariables { + /** + * @notice Struct which will be stored for every batch sequence + * @param accInputHash Hash chain that contains all the information to process a batch: + * keccak256(bytes32 oldAccInputHash, keccak256(bytes transactions), bytes32 globalExitRoot, uint64 timestamp, address seqAddress) + * @param sequencedTimestamp Sequenced timestamp + * @param previousLastBatchSequenced Previous last batch sequenced before the current one, this is used to properly calculate the fees + */ + struct SequencedBatchData { + bytes32 accInputHash; + uint64 sequencedTimestamp; + uint64 previousLastBatchSequenced; + } + + /** + * @notice Struct to store the pending states + * Pending state will be an intermediary state, that after a timeout can be consolidated, which means that will be added + * to the state root mapping, and the global exit root will be updated + * This is a protection mechanism against soundness attacks, that will be turned off in the future + * @param timestamp Timestamp where the pending state is added to the queue + * @param lastVerifiedBatch Last batch verified batch of this pending state + * @param exitRoot Pending exit root + * @param stateRoot Pending state root + */ + struct PendingState { + uint64 timestamp; + uint64 lastVerifiedBatch; + bytes32 exitRoot; + bytes32 stateRoot; + } + + // Time target of the verification of a batch + // Adaptatly the batchFee will be updated to achieve this target + uint64 internal _legacyVerifyBatchTimeTarget; + + // Batch fee multiplier with 3 decimals that goes from 1000 - 1023 + uint16 internal _legacyMultiplierBatchFee; + + // Trusted sequencer address + address internal _legacyTrustedSequencer; + + // Current matic fee per batch sequenced + uint256 internal _legacyBatchFee; + + // Queue of forced batches with their associated data + // ForceBatchNum --> hashedForcedBatchData + // hashedForcedBatchData: hash containing the necessary information to force a batch: + // keccak256(keccak256(bytes transactions), bytes32 globalExitRoot, unint64 minForcedTimestamp) + mapping(uint64 => bytes32) internal _legacyForcedBatches; + + // Queue of batches that defines the virtual state + // SequenceBatchNum --> SequencedBatchData + mapping(uint64 => SequencedBatchData) internal _legacySequencedBatches; + + // Last sequenced timestamp + uint64 internal _legacyLastTimestamp; + + // Last batch sent by the sequencers + uint64 internal _legacylastBatchSequenced; + + // Last forced batch included in the sequence + uint64 internal _legacyLastForceBatchSequenced; + + // Last forced batch + uint64 internal _legacyLastForceBatch; + + // Last batch verified by the aggregators + uint64 internal _legacyLastVerifiedBatch; + + // Trusted aggregator address + address internal _legacyTrustedAggregator; + + // State root mapping + // BatchNum --> state root + mapping(uint64 => bytes32) internal _legacyBatchNumToStateRoot; + + // Trusted sequencer URL + string internal _legacyTrustedSequencerURL; + + // L2 network name + string internal _legacyNetworkName; + + // Pending state mapping + // pendingStateNumber --> PendingState + mapping(uint256 => PendingState) internal _legacyPendingStateTransitions; + + // Last pending state + uint64 internal _legacyLastPendingState; + + // Last pending state consolidated + uint64 internal _legacyLastPendingStateConsolidated; + + // Once a pending state exceeds this timeout it can be consolidated + uint64 internal _legacyPendingStateTimeout; + + // Trusted aggregator timeout, if a sequence is not verified in this time frame, + // everyone can verify that sequence + uint64 internal _legacyTrustedAggregatorTimeout; + + // Address that will be able to adjust contract parameters or stop the emergency state + address internal _legacyAdmin; + + // This account will be able to accept the admin role + address internal _legacyPendingAdmin; + + // Force batch timeout + uint64 internal _legacyForceBatchTimeout; + + // Indicates if forced batches are disallowed + bool internal _legacyIsForcedBatchDisallowed; + + // Indicates the current version + uint256 internal _legacyVersion; + + // Last batch verified before the last upgrade + uint256 internal _legacyLastVerifiedBatchBeforeUpgrade; +} From b93468403d8aab131423811aaaa2ad5b36f328f1 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 11 Oct 2023 13:39:30 +0200 Subject: [PATCH 059/230] test bridgese heh --- hardhat.config.ts | 10 ++ test/contractsv2/BridgeV2.test.ts | 202 ++++++++++++++++++------------ 2 files changed, 131 insertions(+), 81 deletions(-) diff --git a/hardhat.config.ts b/hardhat.config.ts index ebebfe019..a9eecb6cd 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -86,6 +86,16 @@ const config: HardhatUserConfig = { evmVersion: "shanghai", }, }, + "contracts/lib/TokenWrapped.sol": { + version: "0.8.20", + settings: { + optimizer: { + enabled: true, + runs: 9999, // must be the same as bridge, for testing porpuses + }, + evmVersion: "shanghai", + }, + }, }, }, networks: { diff --git a/test/contractsv2/BridgeV2.test.ts b/test/contractsv2/BridgeV2.test.ts index 69da94a10..8195a9c0f 100644 --- a/test/contractsv2/BridgeV2.test.ts +++ b/test/contractsv2/BridgeV2.test.ts @@ -859,7 +859,7 @@ describe("PolygonZkEVMBridge Contract", () => { destinationAddress, amount, metadata, - depositCount + 1 + depositCount + 1n ); await expect( @@ -882,7 +882,7 @@ describe("PolygonZkEVMBridge Contract", () => { destinationAddress, amount, metadata, - depositCount + 2 + depositCount + 2n ); // Prepare merkle tree @@ -890,7 +890,16 @@ describe("PolygonZkEVMBridge Contract", () => { const merkleTree = new MerkleTreeBridge(height); // Get the deposit's events - const filter = polygonZkEVMBridgeContract.filters.BridgeEvent(null, null, null, null, null); + const filter = polygonZkEVMBridgeContract.filters.BridgeEvent( + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined + ); const events = await polygonZkEVMBridgeContract.queryFilter(filter, 0, "latest"); events.forEach((e) => { const {args} = e; @@ -943,33 +952,41 @@ describe("PolygonZkEVMBridge Contract", () => { // check merkle root with SC const rootJSRollup = merkleTree.getRoot(); + // Try claim with 10 rollup leafs + const merkleTreeRollup = new MerkleTreeBridge(height); + merkleTreeRollup.add(rootJSRollup); + const rollupRoot = merkleTreeRollup.getRoot(); + // add rollup Merkle root - await expect(polygonZkEVMGlobalExitRoot.connect(rollupManager).updateExitRoot(rootJSRollup)) + await expect(polygonZkEVMGlobalExitRoot.connect(rollupManager).updateExitRoot(rollupRoot)) .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") - .withArgs(mainnetExitRoot, rootJSRollup); + .withArgs(mainnetExitRoot, rollupRoot); // check roots const rollupExitRootSC = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); - expect(rollupExitRootSC).to.be.equal(rootJSRollup); + expect(rollupExitRootSC).to.be.equal(rollupRoot); const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC); expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); // check merkle proof - const proof = merkleTree.getProofTreeByIndex(0); const index = 0; + const proofLocal = merkleTree.getProofTreeByIndex(0); + const proofRollup = merkleTreeRollup.getProofTreeByIndex(0); // verify merkle proof - expect(verifyMerkleProof(leafValue, proof, index, rootJSRollup)).to.be.equal(true); - expect(await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proof, index, rootJSRollup)).to.be.equal( - true - ); + expect(verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)).to.be.equal(true); + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup) + ).to.be.equal(true); + const globalIndex = computeGlobalIndex(index, index, false); // Can't claim without tokens await expect( polygonZkEVMBridgeContract.claimAsset( - proof, - index, + proofLocal, + proofRollup, + globalIndex, mainnetExitRoot, rollupExitRootSC, originNetwork, @@ -979,7 +996,7 @@ describe("PolygonZkEVMBridge Contract", () => { amount, metadata ) - ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "ERC20: transfer amount exceeds balance"); + ).to.be.revertedWith("ERC20: transfer amount exceeds balance"); // transfer tokens, then claim await expect(polTokenContract.transfer(polygonZkEVMBridgeContract.target, amount)) @@ -987,28 +1004,30 @@ describe("PolygonZkEVMBridge Contract", () => { .withArgs(deployer.address, polygonZkEVMBridgeContract.target, amount); // Check Destination network does not match assert - await expect( - polygonZkEVMBridgeContract.claimAsset( - proof, - index, - mainnetExitRoot, - rollupExitRootSC, - originNetwork, - tokenAddress, - networkIDRollup, // Wrong destination network - destinationAddress, - amount, - metadata - ) - ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "DestinationNetworkInvalid"); + // await expect( + // polygonZkEVMBridgeContract.claimAsset( + // proofLocal, + // proofRollup, + // globalIndex, + // mainnetExitRoot, + // rollupExitRootSC, + // originNetwork, + // tokenAddress, + // destinationNetwork, + // destinationAddress, + // amount, + // metadata + // ) + // ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "DestinationNetworkInvalid"); // Check GlobalExitRoot invalid assert await expect( polygonZkEVMBridgeContract.claimAsset( - proof, - index, + proofLocal, + proofRollup, + globalIndex, + mainnetExitRoot, mainnetExitRoot, - mainnetExitRoot, // Wrong rollup Root originNetwork, tokenAddress, destinationNetwork, @@ -1021,8 +1040,9 @@ describe("PolygonZkEVMBridge Contract", () => { // Check Invalid smt proof assert await expect( polygonZkEVMBridgeContract.claimAsset( - proof, - index + 1, // Wrong index + proofLocal, + proofRollup, + globalIndex + 1n, mainnetExitRoot, rollupExitRootSC, originNetwork, @@ -1036,8 +1056,9 @@ describe("PolygonZkEVMBridge Contract", () => { await expect( polygonZkEVMBridgeContract.claimAsset( - proof, - index, + proofLocal, + proofRollup, + globalIndex, mainnetExitRoot, rollupExitRootSC, originNetwork, @@ -1056,8 +1077,9 @@ describe("PolygonZkEVMBridge Contract", () => { // Check Already claimed_claim await expect( polygonZkEVMBridgeContract.claimAsset( - proof, - index, + proofLocal, + proofRollup, + globalIndex, mainnetExitRoot, rollupExitRootSC, originNetwork, @@ -1099,28 +1121,33 @@ describe("PolygonZkEVMBridge Contract", () => { // check merkle root with SC const rootJSRollup = merkleTree.getRoot(); + const merkleTreeRollup = new MerkleTreeBridge(height); + merkleTreeRollup.add(rootJSRollup); + const rollupRoot = merkleTreeRollup.getRoot(); // add rollup Merkle root - await expect(polygonZkEVMGlobalExitRoot.connect(rollupManager).updateExitRoot(rootJSRollup)) + await expect(polygonZkEVMGlobalExitRoot.connect(rollupManager).updateExitRoot(rollupRoot)) .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") - .withArgs(mainnetExitRoot, rootJSRollup); + .withArgs(mainnetExitRoot, rollupRoot); // check roots const rollupExitRootSC = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); - expect(rollupExitRootSC).to.be.equal(rootJSRollup); + expect(rollupExitRootSC).to.be.equal(rollupRoot); const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC); expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); // check merkle proof - const proof = merkleTree.getProofTreeByIndex(0); const index = 0; + const proofLocal = merkleTree.getProofTreeByIndex(0); + const proofRollup = merkleTreeRollup.getProofTreeByIndex(0); + const globalIndex = computeGlobalIndex(index, index, false); // verify merkle proof - expect(verifyMerkleProof(leafValue, proof, index, rootJSRollup)).to.be.equal(true); - expect(await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proof, index, rootJSRollup)).to.be.equal( - true - ); + expect(verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)).to.be.equal(true); + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup) + ).to.be.equal(true); /* * claim @@ -1128,8 +1155,9 @@ describe("PolygonZkEVMBridge Contract", () => { */ await expect( polygonZkEVMBridgeContract.claimAsset( - proof, - index, + proofLocal, + proofRollup, + globalIndex, mainnetExitRoot, rollupExitRootSC, originNetwork, @@ -1146,17 +1174,17 @@ describe("PolygonZkEVMBridge Contract", () => { * Create a deposit to add ether to the PolygonZkEVMBridge * Check deposit amount ether asserts */ - await expect( - polygonZkEVMBridgeContract.bridgeAsset( - networkIDRollup, - destinationAddress, - amount, - tokenAddress, - true, - "0x", - {value: ethers.parseEther("100")} - ) - ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AmountDoesNotMatchMsgValue"); + // await expect( + // polygonZkEVMBridgeContract.bridgeAsset( + // networkIDRollup, + // destinationAddress, + // amount, + // tokenAddress, + // true, + // "0x", + // {value: ethers.parseEther("100")} + // ) + // ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AmountDoesNotMatchMsgValue"); // Check mainnet destination assert await expect( @@ -1190,8 +1218,9 @@ describe("PolygonZkEVMBridge Contract", () => { await expect( polygonZkEVMBridgeContract.claimAsset( - proof, - index, + proofLocal, + proofRollup, + globalIndex, mainnetExitRoot, rollupExitRootSC, originNetwork, @@ -1212,8 +1241,9 @@ describe("PolygonZkEVMBridge Contract", () => { // Can't claim because nullifier await expect( polygonZkEVMBridgeContract.claimAsset( - proof, - index, + proofLocal, + proofRollup, + globalIndex, mainnetExitRoot, rollupExitRootSC, originNetwork, @@ -1255,28 +1285,33 @@ describe("PolygonZkEVMBridge Contract", () => { // check merkle root with SC const rootJSRollup = merkleTree.getRoot(); + const merkleTreeRollup = new MerkleTreeBridge(height); + merkleTreeRollup.add(rootJSRollup); + const rollupRoot = merkleTreeRollup.getRoot(); // add rollup Merkle root - await expect(polygonZkEVMGlobalExitRoot.connect(rollupManager).updateExitRoot(rootJSRollup)) + await expect(polygonZkEVMGlobalExitRoot.connect(rollupManager).updateExitRoot(rollupRoot)) .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") - .withArgs(mainnetExitRoot, rootJSRollup); + .withArgs(mainnetExitRoot, rollupRoot); // check roots const rollupExitRootSC = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); - expect(rollupExitRootSC).to.be.equal(rootJSRollup); + expect(rollupExitRootSC).to.be.equal(rollupRoot); const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC); expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); // check merkle proof - const proof = merkleTree.getProofTreeByIndex(0); const index = 0; + const proofLocal = merkleTree.getProofTreeByIndex(0); + const proofRollup = merkleTreeRollup.getProofTreeByIndex(0); + const globalIndex = computeGlobalIndex(index, index, false); // verify merkle proof - expect(verifyMerkleProof(leafValue, proof, index, rootJSRollup)).to.be.equal(true); - expect(await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proof, index, rootJSRollup)).to.be.equal( - true - ); + expect(verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)).to.be.equal(true); + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup) + ).to.be.equal(true); /* * claim @@ -1284,8 +1319,9 @@ describe("PolygonZkEVMBridge Contract", () => { */ await expect( polygonZkEVMBridgeContract.claimAsset( - proof, - index, + proofLocal, + proofRollup, + globalIndex, mainnetExitRoot, rollupExitRootSC, originNetwork, @@ -1303,8 +1339,9 @@ describe("PolygonZkEVMBridge Contract", () => { */ await expect( polygonZkEVMBridgeContract.claimMessage( - proof, - index, + proofLocal, + proofRollup, + globalIndex, mainnetExitRoot, rollupExitRootSC, originNetwork, @@ -1366,8 +1403,9 @@ describe("PolygonZkEVMBridge Contract", () => { // Check mainnet destination assert await expect( polygonZkEVMBridgeContract.claimAsset( - proof, - index, + proofLocal, + proofRollup, + globalIndex, mainnetExitRoot, rollupExitRootSC, originNetwork, @@ -1381,8 +1419,9 @@ describe("PolygonZkEVMBridge Contract", () => { await expect( polygonZkEVMBridgeContract.claimMessage( - proof, - index, + proofLocal, + proofRollup, + globalIndex, mainnetExitRoot, rollupExitRootSC, originNetwork, @@ -1402,9 +1441,10 @@ describe("PolygonZkEVMBridge Contract", () => { // Can't claim because nullifier await expect( - polygonZkEVMBridgeContract.claimAsset( - proof, - index, + polygonZkEVMBridgeContract.claimMessage( + proofLocal, + proofRollup, + globalIndex, mainnetExitRoot, rollupExitRootSC, originNetwork, From 35477c0b15b4b297996744a314f0f8602307d312 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 11 Oct 2023 21:01:43 +0200 Subject: [PATCH 060/230] update comments --- contracts/v2/PolygonRollupManager.sol | 25 +++++++++++++------ contracts/v2/PolygonZkEVMBridgeV2.sol | 16 +++++++++--- .../dataComittee/PolygonDataComittee.sol | 2 +- .../zkEVM/PolygonZkEVMV2Existent.sol | 3 ++- contracts/v2/lib/PolygonRollupBase.sol | 2 -- test/contractsv2/BridgeV2.test.ts | 2 -- test/contractsv2/PolygonRollupManager.test.ts | 1 - 7 files changed, 34 insertions(+), 17 deletions(-) diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index 596c72e00..d2256229d 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -47,19 +47,30 @@ contract PolygonRollupManager is // review POssible optimization rto reduce bytecode, put maps on another struct or double mapping /** * @notice Struct which to store the rollup data of each chain - * @param accInputHash Hash chain that contains all the information to process a batch: - * keccak256(bytes32 oldAccInputHash, keccak256(bytes transactions), bytes32 globalExitRoot, uint64 timestamp, address seqAddress) - * @param sequencedTimestamp Sequenced timestamp - * @param previousLastBatchSequenced Previous last batch sequenced before the current one, this is used to properly calculate the fees + * @param rollupContract Rollup consensus contract, which manages everything + * related to sequencing transactions + * @param chainID Chain ID of the rollup + * @param verifier Verifier contract + * @param forkID ForkID of the rollup + * @param batchNumToStateRoot State root mapping + * @param sequencedBatches Queue of batches that defines the virtual state + * @param pendingStateTransitions Pending state mapping + * @param lastLocalExitRoot Last exit root verified, used for compute the rollupExitRoot + * @param lastBatchSequenced Last batch sent by the consensus contract + * @param lastPendingState Last pending state + * @param lastPendingStateConsolidated Last pending state consolidated + * @param lastVerifiedBatchBeforeUpgrade Last batch verified before the last upgrade + * @param rollupTypeID Rollup type ID, can be 0 if it was added as an existing rollup + * @param rollupCompatibilityID Rollup ID used for compatibility checks when upgrading */ struct RollupData { IPolygonRollupBase rollupContract; uint64 chainID; IVerifierRollup verifier; uint64 forkID; - mapping(uint64 => bytes32) batchNumToStateRoot; - mapping(uint64 => SequencedBatchData) sequencedBatches; - mapping(uint256 => PendingState) pendingStateTransitions; + mapping(uint64 batchNum => bytes32) batchNumToStateRoot; + mapping(uint64 batchNum => SequencedBatchData) sequencedBatches; + mapping(uint256 pendingStateNum => PendingState) pendingStateTransitions; bytes32 lastLocalExitRoot; uint64 lastBatchSequenced; uint64 lastVerifiedBatch; diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index 12e5c3423..ee66f0031 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -409,7 +409,12 @@ contract PolygonZkEVMBridgeV2 is * @notice Verify merkle proof and withdraw tokens/ether * @param smtProofLocalExitRoot Smt proof * @param smtProofRollupExitRoot Smt proof - * @param globalIndex Global index: bool(isMainnet)||uint32(indexRollupRoot)||uint32(indexDepositLeaf) + * @param globalIndex 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 * @param mainnetExitRoot Mainnet exit root * @param rollupExitRoot Rollup exit root * @param originNetwork Origin network @@ -560,7 +565,12 @@ contract PolygonZkEVMBridgeV2 is * will not trigger any execution * @param smtProofLocalExitRoot Smt proof * @param smtProofRollupExitRoot Smt proof - * @param globalIndex Index of the leaf + * @param globalIndex 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 * @param mainnetExitRoot Mainnet exit root * @param rollupExitRoot Rollup exit root * @param originNetwork Origin network @@ -587,6 +597,7 @@ contract PolygonZkEVMBridgeV2 is if (destinationNetwork != networkID) { revert DestinationNetworkInvalid(); } + // Verify leaf exist and it does not have been claimed _verifyLeaf( smtProofLocalExitRoot, @@ -750,7 +761,6 @@ contract PolygonZkEVMBridgeV2 is uint32 sourceBridgeNetwork; // Get origin network from global index - // review globalINdex, should assert the rest of unused bits to 0 if (globalIndex & _GLOBAL_INDEX_MAINNET_FLAG == 1) { // It's mainnet, therefore sourceBridgeNetwork is 0 diff --git a/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol b/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol index 20896e762..fa739e8a3 100644 --- a/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol +++ b/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol @@ -35,7 +35,7 @@ contract PolygonDataComittee is PolygonRollupBase, IPolygonDataComittee { // CDK Data Committee Address ICDKDataCommittee public immutable dataCommittee; - // Indicates if sequence with data avialabiility is allowed + // Indicates if sequence with data avialability is allowed // This allow the sequencer to post the data and skip the Data comittee bool public isSequenceWithDataAvailabilityAllowed; diff --git a/contracts/v2/consensus/zkEVM/PolygonZkEVMV2Existent.sol b/contracts/v2/consensus/zkEVM/PolygonZkEVMV2Existent.sol index f6ffe5a5d..412465f86 100644 --- a/contracts/v2/consensus/zkEVM/PolygonZkEVMV2Existent.sol +++ b/contracts/v2/consensus/zkEVM/PolygonZkEVMV2Existent.sol @@ -63,6 +63,7 @@ contract PolygonZkEVMV2Existent is PolygonRollupBase { // Constant deployment variables forceBatchTimeout = 5 days; - // Both gasTokenAddress and gasTokenNetwork are 0, since it uses ether + // Both gasTokenAddress and gasTokenNetwork are 0, since it uses ether as gas token + // Therefore is not necessary to set the variables } } diff --git a/contracts/v2/lib/PolygonRollupBase.sol b/contracts/v2/lib/PolygonRollupBase.sol index 8dabf430a..97e469824 100644 --- a/contracts/v2/lib/PolygonRollupBase.sol +++ b/contracts/v2/lib/PolygonRollupBase.sol @@ -140,7 +140,6 @@ contract PolygonRollupBase is // Rollup manager PolygonRollupManager public immutable rollupManager; - // review common variables // Address that will be able to adjust contract parameters or stop the emergency state address public admin; @@ -334,7 +333,6 @@ contract PolygonRollupBase is newAccInputHash ); - // review initialize events?¿ emit SequenceBatches(currentBatchSequenced); } diff --git a/test/contractsv2/BridgeV2.test.ts b/test/contractsv2/BridgeV2.test.ts index 8195a9c0f..e138575c2 100644 --- a/test/contractsv2/BridgeV2.test.ts +++ b/test/contractsv2/BridgeV2.test.ts @@ -29,8 +29,6 @@ function computeGlobalIndex(indexLocal: any, indexRollup: any, isMainnet: Boolea } } -// 1 bit (isMainnet) (32 bits) indices del rollup (32 bits) indice de la hoja LOcal -// X XXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX describe("PolygonZkEVMBridge Contract", () => { let polygonZkEVMBridgeContract: PolygonZkEVMBridgeV2; let polTokenContract: ERC20PermitMock; diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index 6b1071b97..b9d6b1644 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -542,7 +542,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { // check merkle root with SC const rootzkEVM = merkleTreezkEVM.getRoot(); - // TODO // trustedAggregator forge the batch const pendingState = 0; const newLocalExitRoot = rootzkEVM; From 4e2cca68af82266f7bc7be8b659d5558a95422d6 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 11 Oct 2023 21:55:16 +0200 Subject: [PATCH 061/230] start upgradability test --- contracts/v2/PolygonRollupManager.sol | 4 +- .../v2/mocks/PolygonRollupManagerMock.sol | 2 +- test/contractsv2/PolygonRollupManager.test.ts | 2 +- .../PolygonRollupManagerUpgrade.ts | 870 ++++++++++++++++++ 4 files changed, 875 insertions(+), 3 deletions(-) create mode 100644 test/contractsv2/PolygonRollupManagerUpgrade.ts diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index d2256229d..a2fb06557 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -368,6 +368,8 @@ contract PolygonRollupManager is bridgeAddress = _bridgeAddress; } + // TODO natspec + // TODO review reinitializer function initialize( address trustedAggregator, uint64 _pendingStateTimeout, @@ -377,7 +379,7 @@ contract PolygonRollupManager is address emergencyCouncil, PolygonZkEVMV2Existent polygonZkEVM, IVerifierRollup zkEVMVerifier - ) external initializer { + ) external reinitializer(2) { pendingStateTimeout = _pendingStateTimeout; trustedAggregatorTimeout = _trustedAggregatorTimeout; diff --git a/contracts/v2/mocks/PolygonRollupManagerMock.sol b/contracts/v2/mocks/PolygonRollupManagerMock.sol index 63156ade8..7b4378695 100644 --- a/contracts/v2/mocks/PolygonRollupManagerMock.sol +++ b/contracts/v2/mocks/PolygonRollupManagerMock.sol @@ -24,7 +24,7 @@ contract PolygonRollupManagerMock is PolygonRollupManager { address admin, address timelock, address emergencyCouncil - ) external initializer { + ) external reinitializer(2) { pendingStateTimeout = _pendingStateTimeout; trustedAggregatorTimeout = _trustedAggregatorTimeout; diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index b9d6b1644..d248e318e 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -673,7 +673,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { ) ).to.be.equal(precalculateWrappedErc20); - // index leaf is 0 bc, doe snot have mainnet flag, and it's rollup 0 on leaf 0 + // index leaf is 0 bc, does not have mainnet flag, and it's rollup 0 on leaf 0 await expect( polygonZkEVMBridgeContract.claimAsset( proofZkEVM, diff --git a/test/contractsv2/PolygonRollupManagerUpgrade.ts b/test/contractsv2/PolygonRollupManagerUpgrade.ts new file mode 100644 index 000000000..20612c40b --- /dev/null +++ b/test/contractsv2/PolygonRollupManagerUpgrade.ts @@ -0,0 +1,870 @@ +/* eslint-disable no-plusplus, no-await-in-loop */ +import {expect} from "chai"; +import {ethers, upgrades} from "hardhat"; +import { + VerifierRollupHelperMock, + ERC20PermitMock, + PolygonRollupManagerMock, + PolygonZkEVMGlobalExitRoot, + PolygonZkEVMBridgeV2, + PolygonZkEVMV2, + PolygonRollupBase, + TokenWrapped, + Address, + PolygonZkEVM, + PolygonZkEVMV2Existent, +} from "../../typechain-types"; +import {takeSnapshot, time} from "@nomicfoundation/hardhat-network-helpers"; +import {processorUtils, contractUtils, MTBridge, mtBridgeUtils} from "@0xpolygonhermez/zkevm-commonjs"; +const {calculateSnarkInput, calculateAccInputHash, calculateBatchHashData} = contractUtils; + +type BatchDataStruct = PolygonRollupBase.BatchDataStruct; + +const MerkleTreeBridge = MTBridge; +const {verifyMerkleProof, getLeafValue} = mtBridgeUtils; + +function calculateGlobalExitRoot(mainnetExitRoot: any, rollupExitRoot: any) { + return ethers.solidityPackedKeccak256(["bytes32", "bytes32"], [mainnetExitRoot, rollupExitRoot]); +} + +describe("Polygon ZK-EVM TestnetV2", () => { + let deployer: any; + let timelock: any; + let emergencyCouncil: any; + let trustedAggregator: any; + let trustedSequencer: any; + let admin: any; + let beneficiary: any; + + let polygonZkEVMContract: PolygonZkEVM; + let verifierContract: VerifierRollupHelperMock; + let polygonZkEVMBridgeContract: PolygonZkEVMBridgeV2; + let polTokenContract: ERC20PermitMock; + let polygonZkEVMGlobalExitRoot: PolygonZkEVMGlobalExitRoot; + let rollupManagerContract: PolygonRollupManagerMock; + + const polTokenName = "POL Token"; + const polTokenSymbol = "POL"; + const polTokenInitialBalance = ethers.parseEther("20000000"); + + const urlSequencer = "http://zkevm-json-rpc:8123"; + const chainID = 1000; + const networkName = "zkevm"; + const version = "0.0.1"; + const forkID = 0; + const genesisRoot = "0x0000000000000000000000000000000000000000000000000000000000000001"; + + const pendingStateTimeoutDefault = 100; + const trustedAggregatorTimeout = 100; + const FORCE_BATCH_TIMEOUT = 60 * 60 * 24 * 5; // 5 days + + // BRidge constants + const networkIDMainnet = 0; + const networkIDRollup = 1; + + const LEAF_TYPE_ASSET = 0; + const LEAF_TYPE_MESSAGE = 1; + + const globalExitRootL2Address = "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa" as unknown as Address; + + let firstDeployment = true; + + //roles + const DEFAULT_ADMIN_ROLE = ethers.ZeroHash; + const ADD_ROLLUP_TYPE_ROLE = ethers.id("ADD_ROLLUP_TYPE_ROLE"); + const OBSOLETE_ROLLUP_TYPE_ROLE = ethers.id("OBSOLETE_ROLLUP_TYPE_ROLE"); + const CREATE_ROLLUP_ROLE = ethers.id("CREATE_ROLLUP_ROLE"); + const ADD_EXISTING_ROLLUP_ROLE = ethers.id("ADD_EXISTING_ROLLUP_ROLE"); + const UPDATE_ROLLUP_ROLE = ethers.id("UPDATE_ROLLUP_ROLE"); + const TRUSTED_AGGREGATOR_ROLE = ethers.id("TRUSTED_AGGREGATOR_ROLE"); + const TRUSTED_AGGREGATOR_ROLE_ADMIN = ethers.id("TRUSTED_AGGREGATOR_ROLE_ADMIN"); + const TWEAK_PARAMETERS_ROLE = ethers.id("TWEAK_PARAMETERS_ROLE"); + const SET_FEE_ROLE = ethers.id("SET_FEE_ROLE"); + const STOP_EMERGENCY_ROLE = ethers.id("STOP_EMERGENCY_ROLE"); + const EMERGENCY_COUNCIL_ROLE = ethers.id("EMERGENCY_COUNCIL_ROLE"); + const EMERGENCY_COUNCIL_ADMIN = ethers.id("EMERGENCY_COUNCIL_ADMIN"); + + beforeEach("Deploy contract", async () => { + upgrades.silenceWarnings(); + + // load signers + [deployer, trustedAggregator, trustedSequencer, admin, timelock, emergencyCouncil, beneficiary] = + await ethers.getSigners(); + + // deploy mock verifier + const VerifierRollupHelperFactory = await ethers.getContractFactory("VerifierRollupHelperMock"); + verifierContract = await VerifierRollupHelperFactory.deploy(); + + // deploy pol + const polTokenFactory = await ethers.getContractFactory("ERC20PermitMock"); + polTokenContract = await polTokenFactory.deploy( + polTokenName, + polTokenSymbol, + deployer.address, + polTokenInitialBalance + ); + + /* + * deploy global exit root manager + * In order to not have trouble with nonce deploy first proxy admin + */ + await upgrades.deployProxyAdmin(); + + if ((await upgrades.admin.getInstance()).target !== "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0") { + firstDeployment = false; + } + const nonceProxyBridge = + Number(await ethers.provider.getTransactionCount(deployer.address)) + (firstDeployment ? 3 : 2); + + const nonceProxyZkevm = nonceProxyBridge + 2; // Always have to redeploy impl since the polygonZkEVMGlobalExitRoot address changes + + const precalculateBridgeAddress = ethers.getCreateAddress({ + from: deployer.address, + nonce: nonceProxyBridge, + }); + const precalculatezkEVM = ethers.getCreateAddress({ + from: deployer.address, + nonce: nonceProxyZkevm, + }); + firstDeployment = false; + + // deploy globalExitRoot + const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRoot"); + polygonZkEVMGlobalExitRoot = (await upgrades.deployProxy(PolygonZkEVMGlobalExitRootFactory, [], { + initializer: false, + constructorArgs: [precalculatezkEVM, precalculateBridgeAddress], + unsafeAllow: ["constructor", "state-variable-immutable"], + })) as any; + + // deploy PolygonZkEVMBridge + const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + polygonZkEVMBridgeContract = (await upgrades.deployProxy(polygonZkEVMBridgeFactory, [], { + initializer: false, + })) as any; + + // deploy PolygonZkEVM + const PolygonZkEVMFactory = await ethers.getContractFactory("PolygonZkEVM"); + polygonZkEVMContract = (await upgrades.deployProxy(PolygonZkEVMFactory, [], { + initializer: false, + constructorArgs: [ + polygonZkEVMGlobalExitRoot.target, + polTokenContract.target, + verifierContract.target, + polygonZkEVMBridgeContract.target, + chainID, + forkID, + ], + unsafeAllow: ["constructor", "state-variable-immutable"], + })) as any; + expect(precalculateBridgeAddress).to.be.equal(polygonZkEVMBridgeContract.target); + expect(precalculatezkEVM).to.be.equal(polygonZkEVMContract.target); + + const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager"); + rollupManagerContract = PolygonRollupManagerFactory.attach(polygonZkEVMContract.target) as any; + + await polygonZkEVMContract.initialize( + { + admin: admin.address, + trustedSequencer: trustedSequencer.address, + pendingStateTimeout: pendingStateTimeoutDefault, + trustedAggregator: trustedAggregator.address, + trustedAggregatorTimeout: trustedAggregatorTimeout, + }, + genesisRoot, + urlSequencer, + networkName, + version + ); + + await polygonZkEVMBridgeContract.initialize( + networkIDMainnet, + ethers.ZeroAddress, // zero for ether + ethers.ZeroAddress, // zero for ether + polygonZkEVMGlobalExitRoot.target, + rollupManagerContract.target + ); + + // fund sequencer address with Matic tokens + await polTokenContract.transfer(trustedSequencer.address, ethers.parseEther("1000")); + }); + + it("should check the initalized parameters", async () => { + // DEploy new zkEVM + const PolygonZkEVMV2ExistentFactory = await ethers.getContractFactory("PolygonZkEVMV2Existent"); + + const newPolygonZkEVMContract = (await upgrades.deployProxy(PolygonZkEVMV2ExistentFactory, [], { + initializer: false, + constructorArgs: [ + polygonZkEVMGlobalExitRoot.target, + polTokenContract.target, + polygonZkEVMBridgeContract.target, + rollupManagerContract.target, + ], + unsafeAllow: ["constructor", "state-variable-immutable"], + })) as any as PolygonZkEVMV2Existent; + + const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager"); + const txRollupManager = await upgrades.upgradeProxy(polygonZkEVMContract.target, PolygonRollupManagerFactory, { + constructorArgs: [ + polygonZkEVMGlobalExitRoot.target, + polTokenContract.target, + polygonZkEVMBridgeContract.target, + ], + unsafeAllow: ["constructor", "state-variable-immutable"], + unsafeAllowRenames: true, + call: { + fn: "initialize", + args: [ + trustedAggregator.address, + pendingStateTimeoutDefault, + trustedAggregatorTimeout, + admin.address, + timelock.address, + emergencyCouncil.address, + newPolygonZkEVMContract.target, + verifierContract.target, + ], + }, + }); + }); + + it("should check full flow", async () => { + const urlSequencer = "http://zkevm-json-rpc:8123"; + const chainID = 1000; + const networkName = "zkevm"; + const forkID = 0; + const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001"; + const rollupCompatibilityID = 0; + const descirption = "zkevm test"; + // Native token will be ether + const gasTokenAddress = ethers.ZeroAddress; + const gasTokenNetwork = 0; + + // In order to create a new rollup type, create an implementation of the contract + + // Create zkEVM implementation + const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMV2"); + const PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy( + polygonZkEVMGlobalExitRoot.target, + polTokenContract.target, + polygonZkEVMBridgeContract.target, + rollupManagerContract.target + ); + await PolygonZKEVMV2Contract.waitForDeployment(); + + // Try to add a new rollup type + await expect( + rollupManagerContract.addNewRollupType( + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + genesisRandom, + rollupCompatibilityID, + descirption + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); + + // Add a new rollup type with timelock + const newRollupTypeID = 1; + await expect( + rollupManagerContract + .connect(timelock) + .addNewRollupType( + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + genesisRandom, + rollupCompatibilityID, + descirption + ) + ) + .to.emit(rollupManagerContract, "AddNewRollupType") + .withArgs( + newRollupTypeID, + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + genesisRandom, + rollupCompatibilityID, + descirption + ); + + // assert new rollup type + const createdRollupType = await rollupManagerContract.rollupTypeMap(newRollupTypeID); + + const expectedRollupType = [ + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + false, + genesisRandom, + ]; + expect(createdRollupType).to.be.deep.equal(expectedRollupType); + + // obsoleteRollupType, take snapshot for it + const snapshot = await takeSnapshot(); + + await expect(rollupManagerContract.obsoleteRollupType(newRollupTypeID)).to.be.revertedWithCustomError( + rollupManagerContract, + "AddressDoNotHaveRequiredRole" + ); + + await expect(rollupManagerContract.connect(admin).obsoleteRollupType(newRollupTypeID)) + .to.emit(rollupManagerContract, "ObsoleteRollupType") + .withArgs(newRollupTypeID); + + expect([ + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + true, + genesisRandom, + ]).to.be.deep.equal(await rollupManagerContract.rollupTypeMap(newRollupTypeID)); + await snapshot.restore(); + + expect(expectedRollupType).to.be.deep.equal(await rollupManagerContract.rollupTypeMap(newRollupTypeID)); + // Create a + + // Only admin can create new zkEVMs + await expect( + rollupManagerContract.createNewRollup( + newRollupTypeID, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + gasTokenNetwork, + urlSequencer, + networkName + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); + + // UNexisting rollupType + await expect( + rollupManagerContract + .connect(admin) + .createNewRollup( + 0, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + gasTokenNetwork, + urlSequencer, + networkName + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeDoesNotExist"); + + // Obsolete rollup type and test that fails + const snapshot2 = await takeSnapshot(); + await expect(rollupManagerContract.connect(admin).obsoleteRollupType(newRollupTypeID)) + .to.emit(rollupManagerContract, "ObsoleteRollupType") + .withArgs(newRollupTypeID); + + await expect( + rollupManagerContract + .connect(admin) + .createNewRollup( + newRollupTypeID, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + gasTokenNetwork, + urlSequencer, + networkName + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeObsolete"); + await snapshot2.restore(); + + const newCreatedRollupID = 1; + const newZKEVMAddress = ethers.getCreateAddress({ + from: rollupManagerContract.target as string, + nonce: 1, + }); + + const newZkEVMContract = PolygonZKEVMV2Factory.attach(newZKEVMAddress) as PolygonZkEVMV2; + const newSequencedBatch = 1; + + await expect( + rollupManagerContract + .connect(admin) + .createNewRollup( + newRollupTypeID, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + gasTokenNetwork, + urlSequencer, + networkName + ) + ) + .to.emit(rollupManagerContract, "CreateNewRollup") + .withArgs(newCreatedRollupID, newRollupTypeID, newZKEVMAddress, chainID, gasTokenAddress, gasTokenNetwork) + .to.emit(newZkEVMContract, "SequenceBatches") + .withArgs(newSequencedBatch) + .to.emit(rollupManagerContract, "OnSequenceBatches") + .withArgs(newCreatedRollupID, newSequencedBatch); + + // Assert new rollup created + const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; + expect(await newZkEVMContract.admin()).to.be.equal(admin.address); + expect(await newZkEVMContract.trustedSequencer()).to.be.equal(trustedSequencer.address); + expect(await newZkEVMContract.trustedSequencerURL()).to.be.equal(urlSequencer); + expect(await newZkEVMContract.networkName()).to.be.equal(networkName); + expect(await newZkEVMContract.forceBatchTimeout()).to.be.equal(FORCE_BATCH_TIMEOUT); + expect(await newZkEVMContract.lastTimestamp()).to.be.equal(timestampCreatedRollup); + + // Cannot create 2 chains with the same chainID + await expect( + rollupManagerContract + .connect(admin) + .createNewRollup( + newRollupTypeID, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + gasTokenNetwork, + urlSequencer, + networkName + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "ChainIDAlreadyExist"); + + const transaction = await newZkEVMContract.generateInitializeTransaction( + newCreatedRollupID, + gasTokenAddress, + gasTokenNetwork + ); + const txBase = await newZkEVMContract.BASE_INITIALIZE_TX_BRIDGE(); + + // Check transaction + const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + const encodedData = bridgeL2Factory.interface.encodeFunctionData("initialize", [ + newCreatedRollupID, + gasTokenAddress, + gasTokenNetwork, + globalExitRootL2Address, + ethers.ZeroAddress, + ]); + + const rawTx = processorUtils.customRawTxToRawTx(transaction); + const tx = ethers.Transaction.from(rawTx); + expect(tx.to).to.be.equal("0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe"); + expect(tx.value).to.be.equal(0); + expect(tx.data).to.be.equal(encodedData); + expect(tx.gasPrice).to.be.equal(0); + expect(tx.gasLimit).to.be.equal(30000000); + expect(tx.nonce).to.be.equal(0); + expect(tx.chainId).to.be.equal(0); + + const expectedAccInputHash = calculateAccInputHash( + ethers.ZeroHash, + ethers.keccak256(transaction), + ethers.ZeroHash, + timestampCreatedRollup, + trustedSequencer.address + ); + // calcualte accINputHash + expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash); + + // Check mapping on rollup Manager + const rollupData = await rollupManagerContract.rollupIDToRollupData(newCreatedRollupID); + expect(rollupData.rollupContract).to.be.equal(newZKEVMAddress); + expect(rollupData.chainID).to.be.equal(chainID); + expect(rollupData.verifier).to.be.equal(verifierContract.target); + expect(rollupData.forkID).to.be.equal(forkID); + expect(rollupData.lastLocalExitRoot).to.be.equal(ethers.ZeroHash); + expect(rollupData.lastBatchSequenced).to.be.equal(newSequencedBatch); + expect(rollupData.lastVerifiedBatch).to.be.equal(0); + expect(rollupData.lastPendingState).to.be.equal(0); + expect(rollupData.lastPendingStateConsolidated).to.be.equal(0); + expect(rollupData.lastVerifiedBatchBeforeUpgrade).to.be.equal(0); + expect(rollupData.rollupTypeID).to.be.equal(1); + expect(rollupData.rollupCompatibilityID).to.be.equal(0); + + const sequencedBatchData = await rollupManagerContract.getRollupSequencedBatches( + newCreatedRollupID, + newSequencedBatch + ); + + expect(sequencedBatchData.accInputHash).to.be.equal(expectedAccInputHash); + expect(sequencedBatchData.sequencedTimestamp).to.be.equal(timestampCreatedRollup); + expect(sequencedBatchData.previousLastBatchSequenced).to.be.equal(0); + + // try verify batches + const l2txData = "0x123456"; + const maticAmount = await rollupManagerContract.getBatchFee(); + const currentTimestamp = (await ethers.provider.getBlock("latest"))?.timestamp; + + const sequence = { + transactions: l2txData, + globalExitRoot: ethers.ZeroHash, + timestamp: currentTimestamp, + minForcedTimestamp: 0, + } as BatchDataStruct; + + // Approve tokens + await expect(polTokenContract.connect(trustedSequencer).approve(newZkEVMContract.target, maticAmount)).to.emit( + polTokenContract, + "Approval" + ); + + // Sequence Batches + await expect(newZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address)) + .to.emit(newZkEVMContract, "SequenceBatches") + .withArgs(newSequencedBatch + 1); + + const expectedAccInputHash2 = calculateAccInputHash( + expectedAccInputHash, + ethers.keccak256(l2txData), + ethers.ZeroHash, + currentTimestamp, + trustedSequencer.address + ); + // calcualte accINputHash + expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash2); + + // Create a new local exit root mocking some bridge + const tokenName = "Matic Token"; + const tokenSymbol = "MATIC"; + const decimals = 18; + const metadataToken = ethers.AbiCoder.defaultAbiCoder().encode( + ["string", "string", "uint8"], + [tokenName, tokenSymbol, decimals] + ); + + const originNetwork = networkIDRollup; + const tokenAddress = ethers.getAddress(ethers.hexlify(ethers.randomBytes(20))); + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDMainnet; + const destinationAddress = beneficiary.address; + const metadata = metadataToken; // since we are inserting in the exit root can be anything + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + // compute root merkle tree in Js + const height = 32; + const merkleTreezkEVM = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + + // Add 2 leafs + merkleTreezkEVM.add(leafValue); + merkleTreezkEVM.add(leafValue); + + // check merkle root with SC + const rootzkEVM = merkleTreezkEVM.getRoot(); + + // trustedAggregator forge the batch + const pendingState = 0; + const newLocalExitRoot = rootzkEVM; + const newStateRoot = "0x0000000000000000000000000000000000000000000000000000000000000123"; + const newVerifiedBatch = newSequencedBatch + 1; + const zkProofFFlonk = new Array(24).fill(ethers.ZeroHash); + const currentVerifiedBatch = 0; + + const initialAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); + await expect( + rollupManagerContract + .connect(deployer) + .verifyBatchesTrustedAggregator( + newCreatedRollupID, + pendingState, + currentVerifiedBatch, + newVerifiedBatch, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); + + await expect( + rollupManagerContract + .connect(trustedAggregator) + .verifyBatchesTrustedAggregator( + newCreatedRollupID, + pendingState, + currentVerifiedBatch, + currentVerifiedBatch, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "FinalNumBatchBelowLastVerifiedBatch"); + + await expect( + rollupManagerContract + .connect(trustedAggregator) + .verifyBatchesTrustedAggregator( + newCreatedRollupID, + pendingState, + currentVerifiedBatch, + 3, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "NewAccInputHashDoesNotExist"); + + // Calcualte new globalExitroot + const merkleTreeRollups = new MerkleTreeBridge(height); + merkleTreeRollups.add(newLocalExitRoot); + const rootRollups = merkleTreeRollups.getRoot(); + + // Verify batch + await expect( + rollupManagerContract + .connect(trustedAggregator) + .verifyBatchesTrustedAggregator( + newCreatedRollupID, + pendingState, + currentVerifiedBatch, + newVerifiedBatch, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ) + .to.emit(rollupManagerContract, "VerifyBatchesTrustedAggregator") + .withArgs(newCreatedRollupID, newVerifiedBatch, newStateRoot, newLocalExitRoot, trustedAggregator.address) + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .withArgs(ethers.ZeroHash, rootRollups); + + const finalAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); + + expect(finalAggregatorMatic).to.equal(initialAggregatorMatic + maticAmount); + + // Assert global exit root + expect(await polygonZkEVMGlobalExitRoot.lastRollupExitRoot()).to.be.equal(rootRollups); + expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(ethers.ZeroHash); + + expect(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()).to.be.equal( + calculateGlobalExitRoot(ethers.ZeroHash, rootRollups) + ); + + const indexLeaf = 0; + const proofZkEVM = merkleTreezkEVM.getProofTreeByIndex(indexLeaf); + const proofRollups = merkleTreeRollups.getProofTreeByIndex(indexLeaf); + + // verify merkle proof + expect(verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM)).to.be.equal(true); + expect(verifyMerkleProof(rootzkEVM, proofRollups, indexLeaf, rootRollups)).to.be.equal(true); + + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM) + ).to.be.equal(true); + + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(newLocalExitRoot, proofRollups, indexLeaf, rootRollups) + ).to.be.equal(true); + + // claim + const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); + // create2 parameters + const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]); + const minimalBytecodeProxy = tokenWrappedFactory.bytecode; + const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]); + const precalculateWrappedErc20 = await ethers.getCreate2Address( + polygonZkEVMBridgeContract.target as string, + salt, + hashInitCode + ); + const newWrappedToken = tokenWrappedFactory.attach(precalculateWrappedErc20) as TokenWrapped; + + // Use precalculatedWrapperAddress and check if matches + expect( + await polygonZkEVMBridgeContract.precalculatedWrapperAddress( + networkIDRollup, + tokenAddress, + tokenName, + tokenSymbol, + decimals + ) + ).to.be.equal(precalculateWrappedErc20); + + // index leaf is 0 bc, does not have mainnet flag, and it's rollup 0 on leaf 0 + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofZkEVM, + proofRollups, + indexLeaf, + ethers.ZeroHash, + rootRollups, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ) + .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") + .withArgs(indexLeaf, originNetwork, tokenAddress, destinationAddress, amount) + .to.emit(polygonZkEVMBridgeContract, "NewWrappedToken") + .withArgs(originNetwork, tokenAddress, precalculateWrappedErc20, metadata) + .to.emit(newWrappedToken, "Transfer") + .withArgs(ethers.ZeroAddress, beneficiary.address, amount); + + // Assert maps created + const newTokenInfo = await polygonZkEVMBridgeContract.wrappedTokenToTokenInfo(precalculateWrappedErc20); + + expect(newTokenInfo.originNetwork).to.be.equal(networkIDRollup); + expect(newTokenInfo.originTokenAddress).to.be.equal(tokenAddress); + expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( + precalculateWrappedErc20 + ); + expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( + precalculateWrappedErc20 + ); + + expect(await polygonZkEVMBridgeContract.tokenInfoToWrappedToken(salt)).to.be.equal(precalculateWrappedErc20); + + // Check the wrapper info + expect(await newWrappedToken.name()).to.be.equal(tokenName); + expect(await newWrappedToken.symbol()).to.be.equal(tokenSymbol); + expect(await newWrappedToken.decimals()).to.be.equal(decimals); + + // Can't claim because nullifier + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofZkEVM, + proofRollups, + indexLeaf, + ethers.ZeroHash, + rootRollups, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AlreadyClaimed"); + + // Check new token + expect(await newWrappedToken.totalSupply()).to.be.equal(amount); + }); + + it("Should test obsolete rollup", async () => { + const forkID = 0; + const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001"; + const rollupCompatibilityID = 0; + const descirption = "zkevm test"; + + // In order to create a new rollup type, create an implementation of the contract + + // Create zkEVM implementation + const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMV2"); + const PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy( + polygonZkEVMGlobalExitRoot.target, + polTokenContract.target, + polygonZkEVMBridgeContract.target, + rollupManagerContract.target + ); + await PolygonZKEVMV2Contract.waitForDeployment(); + + // Add a new rollup type with timelock + const newRollupTypeID = 1; + await expect( + rollupManagerContract + .connect(timelock) + .addNewRollupType( + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + genesisRandom, + rollupCompatibilityID, + descirption + ) + ) + .to.emit(rollupManagerContract, "AddNewRollupType") + .withArgs( + newRollupTypeID, + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + genesisRandom, + rollupCompatibilityID, + descirption + ); + + // assert new rollup type + const createdRollupType = await rollupManagerContract.rollupTypeMap(newRollupTypeID); + + const expectedRollupType = [ + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + false, + genesisRandom, + ]; + expect(createdRollupType).to.be.deep.equal(expectedRollupType); + + // obsoleteRollupType, take snapshot for it + await expect(rollupManagerContract.obsoleteRollupType(newRollupTypeID)).to.be.revertedWithCustomError( + rollupManagerContract, + "AddressDoNotHaveRequiredRole" + ); + + // Try to obsolete unexisting types + await expect(rollupManagerContract.connect(admin).obsoleteRollupType(0)).to.be.revertedWithCustomError( + rollupManagerContract, + "RollupTypeDoesNotExist" + ); + + await expect(rollupManagerContract.connect(admin).obsoleteRollupType(2)).to.be.revertedWithCustomError( + rollupManagerContract, + "RollupTypeDoesNotExist" + ); + + // added correctly + await expect(rollupManagerContract.connect(admin).obsoleteRollupType(newRollupTypeID)) + .to.emit(rollupManagerContract, "ObsoleteRollupType") + .withArgs(newRollupTypeID); + + // already obsolete + await expect( + rollupManagerContract.connect(admin).obsoleteRollupType(newRollupTypeID) + ).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeObsolete"); + }); + + it("Should test global exit root", async () => { + // In order to create a new rollup type, create an implementation of the contract + async function testRollupExitRoot(rollupsRootsArray: any) { + const height = 32; + const merkleTree = new MerkleTreeBridge(height); + + await rollupManagerContract.prepareMockCalculateRoot(rollupsRootsArray); + for (let i = 0; i < rollupsRootsArray.length; i++) { + merkleTree.add(rollupsRootsArray[i]); + } + const rootSC = await rollupManagerContract.getRollupExitRoot(); + const rootJS = merkleTree.getRoot(); + expect(rootSC).to.be.equal(rootJS); + } + + // put 100 + for (let i = 1; i < 4; i++) { + const newRootsArray = []; + for (let j = 0; j < i; j++) { + newRootsArray.push(ethers.toBeHex(ethers.toQuantity(ethers.randomBytes(32)), 32)); + } + await testRollupExitRoot(newRootsArray); + } + }); +}); From 3890fe827961f62b65d25d02adc8f4e39a1d7efe Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 11 Oct 2023 22:41:30 +0200 Subject: [PATCH 062/230] frist upgradability test --- .../PolygonRollupManagerUpgrade.ts | 39 ++++++++++++------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/test/contractsv2/PolygonRollupManagerUpgrade.ts b/test/contractsv2/PolygonRollupManagerUpgrade.ts index 20612c40b..0f84a8512 100644 --- a/test/contractsv2/PolygonRollupManagerUpgrade.ts +++ b/test/contractsv2/PolygonRollupManagerUpgrade.ts @@ -26,6 +26,15 @@ const {verifyMerkleProof, getLeafValue} = mtBridgeUtils; function calculateGlobalExitRoot(mainnetExitRoot: any, rollupExitRoot: any) { return ethers.solidityPackedKeccak256(["bytes32", "bytes32"], [mainnetExitRoot, rollupExitRoot]); } +const _GLOBAL_INDEX_MAINNET_FLAG = 2n ** 64n; + +function computeGlobalIndex(indexLocal: any, indexRollup: any, isMainnet: Boolean) { + if (isMainnet === true) { + return BigInt(indexLocal) + _GLOBAL_INDEX_MAINNET_FLAG; + } else { + return BigInt(indexLocal) + BigInt(indexRollup) * 2n ** 32n; + } +} describe("Polygon ZK-EVM TestnetV2", () => { let deployer: any; @@ -143,7 +152,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { })) as any; // deploy PolygonZkEVM - const PolygonZkEVMFactory = await ethers.getContractFactory("PolygonZkEVM"); + const PolygonZkEVMFactory = await ethers.getContractFactory("PolygonZkEVMUpgraded"); polygonZkEVMContract = (await upgrades.deployProxy(PolygonZkEVMFactory, [], { initializer: false, constructorArgs: [ @@ -153,13 +162,14 @@ describe("Polygon ZK-EVM TestnetV2", () => { polygonZkEVMBridgeContract.target, chainID, forkID, + 0, ], unsafeAllow: ["constructor", "state-variable-immutable"], })) as any; expect(precalculateBridgeAddress).to.be.equal(polygonZkEVMBridgeContract.target); expect(precalculatezkEVM).to.be.equal(polygonZkEVMContract.target); - const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager"); + const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManagerMock"); rollupManagerContract = PolygonRollupManagerFactory.attach(polygonZkEVMContract.target) as any; await polygonZkEVMContract.initialize( @@ -186,9 +196,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { // fund sequencer address with Matic tokens await polTokenContract.transfer(trustedSequencer.address, ethers.parseEther("1000")); - }); - it("should check the initalized parameters", async () => { // DEploy new zkEVM const PolygonZkEVMV2ExistentFactory = await ethers.getContractFactory("PolygonZkEVMV2Existent"); @@ -203,7 +211,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { unsafeAllow: ["constructor", "state-variable-immutable"], })) as any as PolygonZkEVMV2Existent; - const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager"); + //const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager"); const txRollupManager = await upgrades.upgradeProxy(polygonZkEVMContract.target, PolygonRollupManagerFactory, { constructorArgs: [ polygonZkEVMGlobalExitRoot.target, @@ -211,7 +219,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { polygonZkEVMBridgeContract.target, ], unsafeAllow: ["constructor", "state-variable-immutable"], - unsafeAllowRenames: true, + unsafeAllowRenames: true, // i think the remapping on OZ goes wrong D: call: { fn: "initialize", args: [ @@ -228,6 +236,8 @@ describe("Polygon ZK-EVM TestnetV2", () => { }); }); + it("should check the initalized parameters", async () => {}); + it("should check full flow", async () => { const urlSequencer = "http://zkevm-json-rpc:8123"; const chainID = 1000; @@ -379,7 +389,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { ).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeObsolete"); await snapshot2.restore(); - const newCreatedRollupID = 1; + const newCreatedRollupID = 2; // 1 is zkEVM const newZKEVMAddress = ethers.getCreateAddress({ from: rollupManagerContract.target as string, nonce: 1, @@ -621,6 +631,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { // Calcualte new globalExitroot const merkleTreeRollups = new MerkleTreeBridge(height); + merkleTreeRollups.add(ethers.ZeroHash); merkleTreeRollups.add(newLocalExitRoot); const rootRollups = merkleTreeRollups.getRoot(); @@ -657,19 +668,20 @@ describe("Polygon ZK-EVM TestnetV2", () => { ); const indexLeaf = 0; + const indexRollup = 1; const proofZkEVM = merkleTreezkEVM.getProofTreeByIndex(indexLeaf); - const proofRollups = merkleTreeRollups.getProofTreeByIndex(indexLeaf); + const proofRollups = merkleTreeRollups.getProofTreeByIndex(indexRollup); // verify merkle proof expect(verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM)).to.be.equal(true); - expect(verifyMerkleProof(rootzkEVM, proofRollups, indexLeaf, rootRollups)).to.be.equal(true); + expect(verifyMerkleProof(rootzkEVM, proofRollups, indexRollup, rootRollups)).to.be.equal(true); expect( await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM) ).to.be.equal(true); expect( - await polygonZkEVMBridgeContract.verifyMerkleProof(newLocalExitRoot, proofRollups, indexLeaf, rootRollups) + await polygonZkEVMBridgeContract.verifyMerkleProof(newLocalExitRoot, proofRollups, indexRollup, rootRollups) ).to.be.equal(true); // claim @@ -697,11 +709,12 @@ describe("Polygon ZK-EVM TestnetV2", () => { ).to.be.equal(precalculateWrappedErc20); // index leaf is 0 bc, does not have mainnet flag, and it's rollup 0 on leaf 0 + const globalIndex = computeGlobalIndex(indexLeaf, indexRollup, false); await expect( polygonZkEVMBridgeContract.claimAsset( proofZkEVM, proofRollups, - indexLeaf, + globalIndex, ethers.ZeroHash, rootRollups, originNetwork, @@ -713,7 +726,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { ) ) .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") - .withArgs(indexLeaf, originNetwork, tokenAddress, destinationAddress, amount) + .withArgs(globalIndex, originNetwork, tokenAddress, destinationAddress, amount) .to.emit(polygonZkEVMBridgeContract, "NewWrappedToken") .withArgs(originNetwork, tokenAddress, precalculateWrappedErc20, metadata) .to.emit(newWrappedToken, "Transfer") @@ -743,7 +756,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { polygonZkEVMBridgeContract.claimAsset( proofZkEVM, proofRollups, - indexLeaf, + globalIndex, ethers.ZeroHash, rootRollups, originNetwork, From 206590d4e50d7de52db9ebe0946506997077f2ee Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 11 Oct 2023 22:49:02 +0200 Subject: [PATCH 063/230] test --- .../PolygonRollupManagerUpgrade.ts | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/test/contractsv2/PolygonRollupManagerUpgrade.ts b/test/contractsv2/PolygonRollupManagerUpgrade.ts index 0f84a8512..19b7497ae 100644 --- a/test/contractsv2/PolygonRollupManagerUpgrade.ts +++ b/test/contractsv2/PolygonRollupManagerUpgrade.ts @@ -236,7 +236,39 @@ describe("Polygon ZK-EVM TestnetV2", () => { }); }); - it("should check the initalized parameters", async () => {}); + it("should check the initalized parameters", async () => { + expect(await rollupManagerContract.globalExitRootManager()).to.be.equal(polygonZkEVMGlobalExitRoot.target); + expect(await rollupManagerContract.pol()).to.be.equal(polTokenContract.target); + expect(await rollupManagerContract.bridgeAddress()).to.be.equal(polygonZkEVMBridgeContract.target); + + expect(await rollupManagerContract.pendingStateTimeout()).to.be.equal(pendingStateTimeoutDefault); + expect(await rollupManagerContract.trustedAggregatorTimeout()).to.be.equal(trustedAggregatorTimeout); + + expect(await rollupManagerContract.getBatchFee()).to.be.equal(ethers.parseEther("0.1")); + expect(await rollupManagerContract.getForcedBatchFee()).to.be.equal(ethers.parseEther("10")); + + // Check roles + expect(await rollupManagerContract.hasRole(DEFAULT_ADMIN_ROLE, timelock.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(ADD_ROLLUP_TYPE_ROLE, timelock.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(UPDATE_ROLLUP_ROLE, timelock.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(ADD_EXISTING_ROLLUP_ROLE, timelock.address)).to.be.equal(true); + + expect(await rollupManagerContract.hasRole(TRUSTED_AGGREGATOR_ROLE, trustedAggregator.address)).to.be.equal( + true + ); + + expect(await rollupManagerContract.hasRole(OBSOLETE_ROLLUP_TYPE_ROLE, admin.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(CREATE_ROLLUP_ROLE, admin.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(TRUSTED_AGGREGATOR_ROLE_ADMIN, admin.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(TWEAK_PARAMETERS_ROLE, admin.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(SET_FEE_ROLE, admin.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(STOP_EMERGENCY_ROLE, admin.address)).to.be.equal(true); + + expect(await rollupManagerContract.hasRole(EMERGENCY_COUNCIL_ROLE, emergencyCouncil.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(EMERGENCY_COUNCIL_ADMIN, emergencyCouncil.address)).to.be.equal( + true + ); + }); it("should check full flow", async () => { const urlSequencer = "http://zkevm-json-rpc:8123"; From 6f17175a5807700c8f07faaf4b7be5c916eb6c9e Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 11 Oct 2023 22:58:44 +0200 Subject: [PATCH 064/230] first pending test --- .../PolygonRollupManagerUpgrade.ts | 524 ++++++++++++++++++ 1 file changed, 524 insertions(+) diff --git a/test/contractsv2/PolygonRollupManagerUpgrade.ts b/test/contractsv2/PolygonRollupManagerUpgrade.ts index 19b7497ae..263307c92 100644 --- a/test/contractsv2/PolygonRollupManagerUpgrade.ts +++ b/test/contractsv2/PolygonRollupManagerUpgrade.ts @@ -804,6 +804,530 @@ describe("Polygon ZK-EVM TestnetV2", () => { expect(await newWrappedToken.totalSupply()).to.be.equal(amount); }); + it("should check full flow no trusted aggreagtor", async () => { + const urlSequencer = "http://zkevm-json-rpc:8123"; + const chainID = 1000; + const networkName = "zkevm"; + const forkID = 0; + const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001"; + const rollupCompatibilityID = 0; + const descirption = "zkevm test"; + // Native token will be ether + const gasTokenAddress = ethers.ZeroAddress; + const gasTokenNetwork = 0; + + // In order to create a new rollup type, create an implementation of the contract + + // Create zkEVM implementation + const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMV2"); + const PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy( + polygonZkEVMGlobalExitRoot.target, + polTokenContract.target, + polygonZkEVMBridgeContract.target, + rollupManagerContract.target + ); + await PolygonZKEVMV2Contract.waitForDeployment(); + + // Try to add a new rollup type + await expect( + rollupManagerContract.addNewRollupType( + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + genesisRandom, + rollupCompatibilityID, + descirption + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); + + // Add a new rollup type with timelock + const newRollupTypeID = 1; + await expect( + rollupManagerContract + .connect(timelock) + .addNewRollupType( + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + genesisRandom, + rollupCompatibilityID, + descirption + ) + ) + .to.emit(rollupManagerContract, "AddNewRollupType") + .withArgs( + newRollupTypeID, + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + genesisRandom, + rollupCompatibilityID, + descirption + ); + + // assert new rollup type + const createdRollupType = await rollupManagerContract.rollupTypeMap(newRollupTypeID); + + const expectedRollupType = [ + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + false, + genesisRandom, + ]; + expect(createdRollupType).to.be.deep.equal(expectedRollupType); + + // obsoleteRollupType, take snapshot for it + const snapshot = await takeSnapshot(); + + await expect(rollupManagerContract.obsoleteRollupType(newRollupTypeID)).to.be.revertedWithCustomError( + rollupManagerContract, + "AddressDoNotHaveRequiredRole" + ); + + await expect(rollupManagerContract.connect(admin).obsoleteRollupType(newRollupTypeID)) + .to.emit(rollupManagerContract, "ObsoleteRollupType") + .withArgs(newRollupTypeID); + + expect([ + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + true, + genesisRandom, + ]).to.be.deep.equal(await rollupManagerContract.rollupTypeMap(newRollupTypeID)); + await snapshot.restore(); + + expect(expectedRollupType).to.be.deep.equal(await rollupManagerContract.rollupTypeMap(newRollupTypeID)); + // Create a + + // Only admin can create new zkEVMs + await expect( + rollupManagerContract.createNewRollup( + newRollupTypeID, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + gasTokenNetwork, + urlSequencer, + networkName + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); + + // UNexisting rollupType + await expect( + rollupManagerContract + .connect(admin) + .createNewRollup( + 0, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + gasTokenNetwork, + urlSequencer, + networkName + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeDoesNotExist"); + + // Obsolete rollup type and test that fails + const snapshot2 = await takeSnapshot(); + await expect(rollupManagerContract.connect(admin).obsoleteRollupType(newRollupTypeID)) + .to.emit(rollupManagerContract, "ObsoleteRollupType") + .withArgs(newRollupTypeID); + + await expect( + rollupManagerContract + .connect(admin) + .createNewRollup( + newRollupTypeID, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + gasTokenNetwork, + urlSequencer, + networkName + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeObsolete"); + await snapshot2.restore(); + + const newCreatedRollupID = 2; // 1 is zkEVM + const newZKEVMAddress = ethers.getCreateAddress({ + from: rollupManagerContract.target as string, + nonce: 1, + }); + + const newZkEVMContract = PolygonZKEVMV2Factory.attach(newZKEVMAddress) as PolygonZkEVMV2; + const newSequencedBatch = 1; + + await expect( + rollupManagerContract + .connect(admin) + .createNewRollup( + newRollupTypeID, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + gasTokenNetwork, + urlSequencer, + networkName + ) + ) + .to.emit(rollupManagerContract, "CreateNewRollup") + .withArgs(newCreatedRollupID, newRollupTypeID, newZKEVMAddress, chainID, gasTokenAddress, gasTokenNetwork) + .to.emit(newZkEVMContract, "SequenceBatches") + .withArgs(newSequencedBatch) + .to.emit(rollupManagerContract, "OnSequenceBatches") + .withArgs(newCreatedRollupID, newSequencedBatch); + + // Assert new rollup created + const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; + expect(await newZkEVMContract.admin()).to.be.equal(admin.address); + expect(await newZkEVMContract.trustedSequencer()).to.be.equal(trustedSequencer.address); + expect(await newZkEVMContract.trustedSequencerURL()).to.be.equal(urlSequencer); + expect(await newZkEVMContract.networkName()).to.be.equal(networkName); + expect(await newZkEVMContract.forceBatchTimeout()).to.be.equal(FORCE_BATCH_TIMEOUT); + expect(await newZkEVMContract.lastTimestamp()).to.be.equal(timestampCreatedRollup); + + // Cannot create 2 chains with the same chainID + await expect( + rollupManagerContract + .connect(admin) + .createNewRollup( + newRollupTypeID, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + gasTokenNetwork, + urlSequencer, + networkName + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "ChainIDAlreadyExist"); + + const transaction = await newZkEVMContract.generateInitializeTransaction( + newCreatedRollupID, + gasTokenAddress, + gasTokenNetwork + ); + const txBase = await newZkEVMContract.BASE_INITIALIZE_TX_BRIDGE(); + + // Check transaction + const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + const encodedData = bridgeL2Factory.interface.encodeFunctionData("initialize", [ + newCreatedRollupID, + gasTokenAddress, + gasTokenNetwork, + globalExitRootL2Address, + ethers.ZeroAddress, + ]); + + const rawTx = processorUtils.customRawTxToRawTx(transaction); + const tx = ethers.Transaction.from(rawTx); + expect(tx.to).to.be.equal("0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe"); + expect(tx.value).to.be.equal(0); + expect(tx.data).to.be.equal(encodedData); + expect(tx.gasPrice).to.be.equal(0); + expect(tx.gasLimit).to.be.equal(30000000); + expect(tx.nonce).to.be.equal(0); + expect(tx.chainId).to.be.equal(0); + + const expectedAccInputHash = calculateAccInputHash( + ethers.ZeroHash, + ethers.keccak256(transaction), + ethers.ZeroHash, + timestampCreatedRollup, + trustedSequencer.address + ); + // calcualte accINputHash + expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash); + + // Check mapping on rollup Manager + const rollupData = await rollupManagerContract.rollupIDToRollupData(newCreatedRollupID); + expect(rollupData.rollupContract).to.be.equal(newZKEVMAddress); + expect(rollupData.chainID).to.be.equal(chainID); + expect(rollupData.verifier).to.be.equal(verifierContract.target); + expect(rollupData.forkID).to.be.equal(forkID); + expect(rollupData.lastLocalExitRoot).to.be.equal(ethers.ZeroHash); + expect(rollupData.lastBatchSequenced).to.be.equal(newSequencedBatch); + expect(rollupData.lastVerifiedBatch).to.be.equal(0); + expect(rollupData.lastPendingState).to.be.equal(0); + expect(rollupData.lastPendingStateConsolidated).to.be.equal(0); + expect(rollupData.lastVerifiedBatchBeforeUpgrade).to.be.equal(0); + expect(rollupData.rollupTypeID).to.be.equal(1); + expect(rollupData.rollupCompatibilityID).to.be.equal(0); + + const sequencedBatchData = await rollupManagerContract.getRollupSequencedBatches( + newCreatedRollupID, + newSequencedBatch + ); + + expect(sequencedBatchData.accInputHash).to.be.equal(expectedAccInputHash); + expect(sequencedBatchData.sequencedTimestamp).to.be.equal(timestampCreatedRollup); + expect(sequencedBatchData.previousLastBatchSequenced).to.be.equal(0); + + // try verify batches + const l2txData = "0x123456"; + const maticAmount = await rollupManagerContract.getBatchFee(); + const currentTimestamp = (await ethers.provider.getBlock("latest"))?.timestamp; + + const sequence = { + transactions: l2txData, + globalExitRoot: ethers.ZeroHash, + timestamp: currentTimestamp, + minForcedTimestamp: 0, + } as BatchDataStruct; + + // Approve tokens + await expect(polTokenContract.connect(trustedSequencer).approve(newZkEVMContract.target, maticAmount)).to.emit( + polTokenContract, + "Approval" + ); + + // Sequence Batches + await expect(newZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address)) + .to.emit(newZkEVMContract, "SequenceBatches") + .withArgs(newSequencedBatch + 1); + + const expectedAccInputHash2 = calculateAccInputHash( + expectedAccInputHash, + ethers.keccak256(l2txData), + ethers.ZeroHash, + currentTimestamp, + trustedSequencer.address + ); + // calcualte accINputHash + expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash2); + + // Create a new local exit root mocking some bridge + const tokenName = "Matic Token"; + const tokenSymbol = "MATIC"; + const decimals = 18; + const metadataToken = ethers.AbiCoder.defaultAbiCoder().encode( + ["string", "string", "uint8"], + [tokenName, tokenSymbol, decimals] + ); + + const originNetwork = networkIDRollup; + const tokenAddress = ethers.getAddress(ethers.hexlify(ethers.randomBytes(20))); + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDMainnet; + const destinationAddress = beneficiary.address; + const metadata = metadataToken; // since we are inserting in the exit root can be anything + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + // compute root merkle tree in Js + const height = 32; + const merkleTreezkEVM = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + + // Add 2 leafs + merkleTreezkEVM.add(leafValue); + merkleTreezkEVM.add(leafValue); + + // check merkle root with SC + const rootzkEVM = merkleTreezkEVM.getRoot(); + + // trustedAggregator forge the batch + const pendingState = 0; + const newLocalExitRoot = rootzkEVM; + const newStateRoot = "0x0000000000000000000000000000000000000000000000000000000000000123"; + const newVerifiedBatch = newSequencedBatch + 1; + const zkProofFFlonk = new Array(24).fill(ethers.ZeroHash); + const currentVerifiedBatch = 0; + + const initialAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); + + await rollupManagerContract.connect(admin).setTrustedAggregatorTimeout(0); + + await expect( + rollupManagerContract + .connect(trustedAggregator) + .verifyBatches( + newCreatedRollupID, + pendingState, + currentVerifiedBatch, + currentVerifiedBatch, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "FinalNumBatchBelowLastVerifiedBatch"); + + await expect( + rollupManagerContract.verifyBatches( + newCreatedRollupID, + pendingState, + currentVerifiedBatch, + 3, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "NewAccInputHashDoesNotExist"); + + // Calcualte new globalExitroot + const merkleTreeRollups = new MerkleTreeBridge(height); + merkleTreeRollups.add(ethers.ZeroHash); + merkleTreeRollups.add(newLocalExitRoot); + const rootRollups = merkleTreeRollups.getRoot(); + + // Verify batch + await expect( + rollupManagerContract.verifyBatches( + newCreatedRollupID, + pendingState, + currentVerifiedBatch, + newVerifiedBatch, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ) + .to.emit(rollupManagerContract, "VerifyBatches") + .withArgs(newCreatedRollupID, newVerifiedBatch, newStateRoot, newLocalExitRoot, deployer.address); + + const finalAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); + expect(finalAggregatorMatic).to.equal(initialAggregatorMatic + maticAmount); + + const pendingStateNum = 1; + await expect( + rollupManagerContract + .connect(trustedAggregator) + .consolidatePendingState(newCreatedRollupID, pendingStateNum) + ) + .to.emit(rollupManagerContract, "ConsolidatePendingState") + .withArgs(newCreatedRollupID, newVerifiedBatch, newStateRoot, newLocalExitRoot, pendingStateNum); + + // Assert global exit root + expect(await polygonZkEVMGlobalExitRoot.lastRollupExitRoot()).to.be.equal(rootRollups); + expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(ethers.ZeroHash); + + expect(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()).to.be.equal( + calculateGlobalExitRoot(ethers.ZeroHash, rootRollups) + ); + + const indexLeaf = 0; + const indexRollup = 1; + const proofZkEVM = merkleTreezkEVM.getProofTreeByIndex(indexLeaf); + const proofRollups = merkleTreeRollups.getProofTreeByIndex(indexRollup); + + // verify merkle proof + expect(verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM)).to.be.equal(true); + expect(verifyMerkleProof(rootzkEVM, proofRollups, indexRollup, rootRollups)).to.be.equal(true); + + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM) + ).to.be.equal(true); + + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(newLocalExitRoot, proofRollups, indexRollup, rootRollups) + ).to.be.equal(true); + + // claim + const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); + // create2 parameters + const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]); + const minimalBytecodeProxy = tokenWrappedFactory.bytecode; + const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]); + const precalculateWrappedErc20 = await ethers.getCreate2Address( + polygonZkEVMBridgeContract.target as string, + salt, + hashInitCode + ); + const newWrappedToken = tokenWrappedFactory.attach(precalculateWrappedErc20) as TokenWrapped; + + // Use precalculatedWrapperAddress and check if matches + expect( + await polygonZkEVMBridgeContract.precalculatedWrapperAddress( + networkIDRollup, + tokenAddress, + tokenName, + tokenSymbol, + decimals + ) + ).to.be.equal(precalculateWrappedErc20); + + // index leaf is 0 bc, does not have mainnet flag, and it's rollup 0 on leaf 0 + const globalIndex = computeGlobalIndex(indexLeaf, indexRollup, false); + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofZkEVM, + proofRollups, + globalIndex, + ethers.ZeroHash, + rootRollups, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ) + .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") + .withArgs(globalIndex, originNetwork, tokenAddress, destinationAddress, amount) + .to.emit(polygonZkEVMBridgeContract, "NewWrappedToken") + .withArgs(originNetwork, tokenAddress, precalculateWrappedErc20, metadata) + .to.emit(newWrappedToken, "Transfer") + .withArgs(ethers.ZeroAddress, beneficiary.address, amount); + + // Assert maps created + const newTokenInfo = await polygonZkEVMBridgeContract.wrappedTokenToTokenInfo(precalculateWrappedErc20); + + expect(newTokenInfo.originNetwork).to.be.equal(networkIDRollup); + expect(newTokenInfo.originTokenAddress).to.be.equal(tokenAddress); + expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( + precalculateWrappedErc20 + ); + expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( + precalculateWrappedErc20 + ); + + expect(await polygonZkEVMBridgeContract.tokenInfoToWrappedToken(salt)).to.be.equal(precalculateWrappedErc20); + + // Check the wrapper info + expect(await newWrappedToken.name()).to.be.equal(tokenName); + expect(await newWrappedToken.symbol()).to.be.equal(tokenSymbol); + expect(await newWrappedToken.decimals()).to.be.equal(decimals); + + // Can't claim because nullifier + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofZkEVM, + proofRollups, + globalIndex, + ethers.ZeroHash, + rootRollups, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AlreadyClaimed"); + + // Check new token + expect(await newWrappedToken.totalSupply()).to.be.equal(amount); + }); + it("Should test obsolete rollup", async () => { const forkID = 0; const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001"; From 6a029006615c1931ef66f973324d9b9b5d302611 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Thu, 12 Oct 2023 08:51:04 +0200 Subject: [PATCH 065/230] add natspec --- contracts/v2/PolygonRollupManager.sol | 12 +++++++++++- contracts/v2/lib/PolygonRollupBase.sol | 5 ++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index a2fb06557..5dcb20578 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -368,8 +368,18 @@ contract PolygonRollupManager is bridgeAddress = _bridgeAddress; } - // TODO natspec // TODO review reinitializer + + /** + * @param trustedAggregator Trusted aggregatot address + * @param _pendingStateTimeout Pending state timeout + * @param _trustedAggregatorTimeout Trusted aggregator timeout + * @param admin Admin of the rollup manager + * @param timelock Timelock address + * @param emergencyCouncil Emergency council address + * @param polygonZkEVM New deployed Polygon zkEVM which will be initialized wiht previous values + * @param zkEVMVerifier Verifier of the new zkEVM deployed + */ function initialize( address trustedAggregator, uint64 _pendingStateTimeout, diff --git a/contracts/v2/lib/PolygonRollupBase.sol b/contracts/v2/lib/PolygonRollupBase.sol index 97e469824..c2defe610 100644 --- a/contracts/v2/lib/PolygonRollupBase.sol +++ b/contracts/v2/lib/PolygonRollupBase.sol @@ -794,7 +794,10 @@ contract PolygonRollupBase is } /** - * @notice Get forced batch fee + * @notice Generate Initialize transaction for hte bridge on L2 + * @param networkID Indicates the network identifier that will be used in the bridge + * @param _gasTokenAddress Indicates the token address that will be used to pay gas fees in the new rollup + * @param _gasTokenNetwork Indicates the native network of the token address */ function generateInitializeTransaction( uint32 networkID, From 4f9ed9a40eae231c788b7f39d1bc140927c0c0d1 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Fri, 13 Oct 2023 16:57:32 +0200 Subject: [PATCH 066/230] cool OZ comments makes everything better ^^ --- .../v2/lib/LegacyZKEVMStateVariables.sol | 26 +++++++++++++++++++ .../lib/PolygonAccessControlUpgradeable.sol | 1 + .../PolygonRollupManagerUpgrade.ts | 2 +- 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/contracts/v2/lib/LegacyZKEVMStateVariables.sol b/contracts/v2/lib/LegacyZKEVMStateVariables.sol index c960f5a57..66d93ca2f 100644 --- a/contracts/v2/lib/LegacyZKEVMStateVariables.sol +++ b/contracts/v2/lib/LegacyZKEVMStateVariables.sol @@ -40,87 +40,113 @@ contract LegacyZKEVMStateVariables { // Time target of the verification of a batch // Adaptatly the batchFee will be updated to achieve this target + /// @custom:oz-renamed-from verifyBatchTimeTarget uint64 internal _legacyVerifyBatchTimeTarget; // Batch fee multiplier with 3 decimals that goes from 1000 - 1023 + /// @custom:oz-renamed-from multiplierBatchFee uint16 internal _legacyMultiplierBatchFee; // Trusted sequencer address + /// @custom:oz-renamed-from trustedSequencer address internal _legacyTrustedSequencer; // Current matic fee per batch sequenced + /// @custom:oz-renamed-from batchFee uint256 internal _legacyBatchFee; // Queue of forced batches with their associated data // ForceBatchNum --> hashedForcedBatchData // hashedForcedBatchData: hash containing the necessary information to force a batch: // keccak256(keccak256(bytes transactions), bytes32 globalExitRoot, unint64 minForcedTimestamp) + /// @custom:oz-renamed-from forcedBatches mapping(uint64 => bytes32) internal _legacyForcedBatches; // Queue of batches that defines the virtual state // SequenceBatchNum --> SequencedBatchData + /// @custom:oz-renamed-from sequencedBatches mapping(uint64 => SequencedBatchData) internal _legacySequencedBatches; // Last sequenced timestamp + /// @custom:oz-renamed-from lastTimestamp uint64 internal _legacyLastTimestamp; // Last batch sent by the sequencers + /// @custom:oz-renamed-from lastBatchSequenced uint64 internal _legacylastBatchSequenced; // Last forced batch included in the sequence + /// @custom:oz-renamed-from lastForceBatchSequenced uint64 internal _legacyLastForceBatchSequenced; // Last forced batch + /// @custom:oz-renamed-from lastForceBatch uint64 internal _legacyLastForceBatch; // Last batch verified by the aggregators + /// @custom:oz-renamed-from lastVerifiedBatch uint64 internal _legacyLastVerifiedBatch; // Trusted aggregator address + /// @custom:oz-renamed-from trustedAggregator address internal _legacyTrustedAggregator; // State root mapping // BatchNum --> state root + /// @custom:oz-renamed-from batchNumToStateRoot mapping(uint64 => bytes32) internal _legacyBatchNumToStateRoot; // Trusted sequencer URL + /// @custom:oz-renamed-from trustedSequencerURL string internal _legacyTrustedSequencerURL; // L2 network name + /// @custom:oz-renamed-from networkName string internal _legacyNetworkName; // Pending state mapping // pendingStateNumber --> PendingState + /// @custom:oz-renamed-from pendingStateTransitions mapping(uint256 => PendingState) internal _legacyPendingStateTransitions; // Last pending state + /// @custom:oz-renamed-from lastPendingState uint64 internal _legacyLastPendingState; // Last pending state consolidated + /// @custom:oz-renamed-from lastPendingStateConsolidated uint64 internal _legacyLastPendingStateConsolidated; // Once a pending state exceeds this timeout it can be consolidated + /// @custom:oz-renamed-from pendingStateTimeout uint64 internal _legacyPendingStateTimeout; // Trusted aggregator timeout, if a sequence is not verified in this time frame, // everyone can verify that sequence + /// @custom:oz-renamed-from trustedAggregatorTimeout uint64 internal _legacyTrustedAggregatorTimeout; // Address that will be able to adjust contract parameters or stop the emergency state + /// @custom:oz-renamed-from admin address internal _legacyAdmin; // This account will be able to accept the admin role + /// @custom:oz-renamed-from pendingAdmin address internal _legacyPendingAdmin; // Force batch timeout + /// @custom:oz-renamed-from forceBatchTimeout uint64 internal _legacyForceBatchTimeout; // Indicates if forced batches are disallowed + /// @custom:oz-renamed-from isForcedBatchDisallowed bool internal _legacyIsForcedBatchDisallowed; // Indicates the current version + /// @custom:oz-renamed-from version uint256 internal _legacyVersion; // Last batch verified before the last upgrade + /// @custom:oz-renamed-from lastVerifiedBatchBeforeUpgrade uint256 internal _legacyLastVerifiedBatchBeforeUpgrade; } diff --git a/contracts/v2/lib/PolygonAccessControlUpgradeable.sol b/contracts/v2/lib/PolygonAccessControlUpgradeable.sol index d8545ec5b..d0ed7d030 100644 --- a/contracts/v2/lib/PolygonAccessControlUpgradeable.sol +++ b/contracts/v2/lib/PolygonAccessControlUpgradeable.sol @@ -25,6 +25,7 @@ abstract contract PolygonAccessControlUpgradeable is function __AccessControl_init() internal onlyInitializing {} // Legacy variable + /// @custom:oz-renamed-from _owner address internal _legacyOwner; struct RoleData { diff --git a/test/contractsv2/PolygonRollupManagerUpgrade.ts b/test/contractsv2/PolygonRollupManagerUpgrade.ts index 263307c92..0a6b7b648 100644 --- a/test/contractsv2/PolygonRollupManagerUpgrade.ts +++ b/test/contractsv2/PolygonRollupManagerUpgrade.ts @@ -219,7 +219,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { polygonZkEVMBridgeContract.target, ], unsafeAllow: ["constructor", "state-variable-immutable"], - unsafeAllowRenames: true, // i think the remapping on OZ goes wrong D: + unsafeAllowRenames: false, call: { fn: "initialize", args: [ From f6047e33763fed4b3c726c7b48868bd251367832 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Sun, 15 Oct 2023 13:41:23 +0200 Subject: [PATCH 067/230] comments and renamings --- contracts/v2/PolygonRollupManager.sol | 38 +++++++++---------- contracts/v2/PolygonZkEVMBridgeV2.sol | 11 +++--- test/contractsv2/PolygonRollupManager.test.ts | 10 ++--- .../PolygonRollupManagerUpgrade.ts | 16 ++++---- 4 files changed, 36 insertions(+), 39 deletions(-) diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index 5dcb20578..cadc1ef9d 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -14,8 +14,6 @@ import "./lib/PolygonAccessControlUpgradeable.sol"; import "./lib/LegacyZKEVMStateVariables.sol"; import "./consensus/zkEVM/PolygonZkEVMV2Existent.sol"; -// review check contract slots! - /** * Contract responsible for managing the exit roots across multiple Rollups */ @@ -182,11 +180,9 @@ contract PolygonRollupManager is mapping(uint32 rollupID => RollupData) public rollupIDToRollupData; // Rollups mapping - // RollupAddress => rollupID mapping(address rollupAddress => uint32 rollupID) public rollupAddressToID; // Rollups mapping - // chainID => rollupID // review, should we reserve some ChainIDs? mapping(uint64 chainID => uint32 rollupID) public chainIDToRollupID; @@ -214,6 +210,7 @@ contract PolygonRollupManager is uint16 public multiplierBatchFee; // Current matic fee per batch sequenced + // note This variable is internal, since the view function getBatchFee is likely to be ugpraded uint256 internal _batchFee; /** @@ -224,15 +221,15 @@ contract PolygonRollupManager is address consensusImplementation, address verifier, uint64 forkID, - bytes32 genesis, uint8 rollupCompatibilityID, + bytes32 genesis, string description ); /** * @dev Emitted when a a rolup type is deleted */ - event ObsoleteRollupType(uint32 rollupTypeID); + event ObsoleteRollupType(uint32 indexed rollupTypeID); /** * @dev Emitted when a new rollup is created based on a rollupType @@ -368,8 +365,6 @@ contract PolygonRollupManager is bridgeAddress = _bridgeAddress; } - // TODO review reinitializer - /** * @param trustedAggregator Trusted aggregatot address * @param _pendingStateTimeout Pending state timeout @@ -421,6 +416,8 @@ contract PolygonRollupManager is _setupRole(_CREATE_ROLLUP_ROLE, admin); _setupRole(_STOP_EMERGENCY_ROLE, admin); _setupRole(_TWEAK_PARAMETERS_ROLE, admin); + + // admin should be able to update the timelock address _setRoleAdmin(_TRUSTED_AGGREGATOR_ROLE, _TRUSTED_AGGREGATOR_ROLE_ADMIN); _setupRole(_TRUSTED_AGGREGATOR_ROLE_ADMIN, admin); @@ -452,8 +449,8 @@ contract PolygonRollupManager is zkEVMLastVerifiedBatch ] = _legacyBatchNumToStateRoot[zkEVMLastVerifiedBatch]; - // note previousLastBatchSequenced will be inconsistent, since there will not be - // a sequence stored in the sequence mapping. + // note previousLastBatchSequenced of the SequencedBatchData will be inconsistent, + // since there will not be a previous sequence stored in the sequence mapping. // However since lastVerifiedBatch is equal to the lastBatchSequenced // won't affect in any case currentZkEVM.sequencedBatches[ @@ -476,9 +473,9 @@ contract PolygonRollupManager is ); } - //////////////////////////////////////////////// + /////////////////////////////////////// // Rollups management functions - /////////////////////////////////////////////// + /////////////////////////////////////// /** * @notice Add a new rollup type @@ -492,8 +489,8 @@ contract PolygonRollupManager is address consensusImplementation, IVerifierRollup verifier, uint64 forkID, - bytes32 genesis, uint8 rollupCompatibilityID, + bytes32 genesis, string memory description ) external onlyRole(_ADD_ROLLUP_TYPE_ROLE) { // nullify rollup type?¿ review hash(verifier, implementation, genesis) @@ -513,8 +510,8 @@ contract PolygonRollupManager is consensusImplementation, address(verifier), forkID, - genesis, rollupCompatibilityID, + genesis, description ); } @@ -752,20 +749,18 @@ contract PolygonRollupManager is rollup.verifier = newRollupType.verifier; rollup.forkID = newRollupType.forkID; rollup.rollupTypeID = newRollupTypeID; - rollup.lastVerifiedBatchBeforeUpgrade = getLastVerifiedBatch(rollupID); + + uint64 lastVerifiedBatch = getLastVerifiedBatch(rollupID); + rollup.lastVerifiedBatchBeforeUpgrade = lastVerifiedBatch; // Upgrade rollup - // review could check previous implementatio through rollup prev type and avoid upgrade + // review could check previous implementation through rollup prev type and avoid upgrade rollupContract.upgradeToAndCall( newRollupType.consensusImplementation, upgradeData ); - emit UpdateRollup( - rollupID, - newRollupTypeID, - rollup.lastVerifiedBatchBeforeUpgrade - ); + emit UpdateRollup(rollupID, newRollupTypeID, lastVerifiedBatch); } ///////////////////////////////////// @@ -787,6 +782,7 @@ contract PolygonRollupManager is revert SenderMustBeRollup(); } + // This prevents overwritting sequencedBatches if (newSequencedBatches == 0) { revert MustSequenceSomeBatch(); } diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index ee66f0031..8cb420dcf 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -71,7 +71,8 @@ contract PolygonZkEVMBridgeV2 is // Wrapped token Address --> Origin token information mapping(address => TokenInformation) public wrappedTokenToTokenInfo; - // PolygonZkEVM address + // Rollup manager address, previously PolygonZkEVM + /// @custom:oz-renamed-from polygonZkEVMaddress address public polygonRollupManager; // Native address @@ -407,8 +408,8 @@ contract PolygonZkEVMBridgeV2 is /** * @notice Verify merkle proof and withdraw tokens/ether - * @param smtProofLocalExitRoot Smt proof - * @param smtProofRollupExitRoot Smt proof + * @param smtProofLocalExitRoot Smt proof to proof the leaf agains the exit root + * @param smtProofRollupExitRoot Smt proof to proof the rollupLocalExitRoot agains the RollupExitRoot * @param globalIndex 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 @@ -563,8 +564,8 @@ contract PolygonZkEVMBridgeV2 is * If the receiving address is an EOA, the call will result as a success * Which means that the amount of ether will be transferred correctly, but the message * will not trigger any execution - * @param smtProofLocalExitRoot Smt proof - * @param smtProofRollupExitRoot Smt proof + * @param smtProofLocalExitRoot Smt proof to proof the leaf agains the exit root + * @param smtProofRollupExitRoot Smt proof to proof the rollupLocalExitRoot agains the RollupExitRoot * @param globalIndex 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 diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index d248e318e..c8e102a3f 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -235,8 +235,8 @@ describe("Polygon ZK-EVM TestnetV2", () => { PolygonZKEVMV2Contract.target, verifierContract.target, forkID, - genesisRandom, rollupCompatibilityID, + genesisRandom, descirption ) ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); @@ -250,8 +250,8 @@ describe("Polygon ZK-EVM TestnetV2", () => { PolygonZKEVMV2Contract.target, verifierContract.target, forkID, - genesisRandom, rollupCompatibilityID, + genesisRandom, descirption ) ) @@ -261,8 +261,8 @@ describe("Polygon ZK-EVM TestnetV2", () => { PolygonZKEVMV2Contract.target, verifierContract.target, forkID, - genesisRandom, rollupCompatibilityID, + genesisRandom, descirption ); @@ -763,8 +763,8 @@ describe("Polygon ZK-EVM TestnetV2", () => { PolygonZKEVMV2Contract.target, verifierContract.target, forkID, - genesisRandom, rollupCompatibilityID, + genesisRandom, descirption ) ) @@ -774,8 +774,8 @@ describe("Polygon ZK-EVM TestnetV2", () => { PolygonZKEVMV2Contract.target, verifierContract.target, forkID, - genesisRandom, rollupCompatibilityID, + genesisRandom, descirption ); diff --git a/test/contractsv2/PolygonRollupManagerUpgrade.ts b/test/contractsv2/PolygonRollupManagerUpgrade.ts index 0a6b7b648..9bd827096 100644 --- a/test/contractsv2/PolygonRollupManagerUpgrade.ts +++ b/test/contractsv2/PolygonRollupManagerUpgrade.ts @@ -300,8 +300,8 @@ describe("Polygon ZK-EVM TestnetV2", () => { PolygonZKEVMV2Contract.target, verifierContract.target, forkID, - genesisRandom, rollupCompatibilityID, + genesisRandom, descirption ) ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); @@ -315,8 +315,8 @@ describe("Polygon ZK-EVM TestnetV2", () => { PolygonZKEVMV2Contract.target, verifierContract.target, forkID, - genesisRandom, rollupCompatibilityID, + genesisRandom, descirption ) ) @@ -326,8 +326,8 @@ describe("Polygon ZK-EVM TestnetV2", () => { PolygonZKEVMV2Contract.target, verifierContract.target, forkID, - genesisRandom, rollupCompatibilityID, + genesisRandom, descirption ); @@ -834,8 +834,8 @@ describe("Polygon ZK-EVM TestnetV2", () => { PolygonZKEVMV2Contract.target, verifierContract.target, forkID, - genesisRandom, rollupCompatibilityID, + genesisRandom, descirption ) ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); @@ -849,8 +849,8 @@ describe("Polygon ZK-EVM TestnetV2", () => { PolygonZKEVMV2Contract.target, verifierContract.target, forkID, - genesisRandom, rollupCompatibilityID, + genesisRandom, descirption ) ) @@ -860,8 +860,8 @@ describe("Polygon ZK-EVM TestnetV2", () => { PolygonZKEVMV2Contract.target, verifierContract.target, forkID, - genesisRandom, rollupCompatibilityID, + genesisRandom, descirption ); @@ -1355,8 +1355,8 @@ describe("Polygon ZK-EVM TestnetV2", () => { PolygonZKEVMV2Contract.target, verifierContract.target, forkID, - genesisRandom, rollupCompatibilityID, + genesisRandom, descirption ) ) @@ -1366,8 +1366,8 @@ describe("Polygon ZK-EVM TestnetV2", () => { PolygonZKEVMV2Contract.target, verifierContract.target, forkID, - genesisRandom, rollupCompatibilityID, + genesisRandom, descirption ); From 2a97bfcbe59f4d69e6ea95cce2dd7ef70eb89903 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 16 Oct 2023 12:14:26 +0200 Subject: [PATCH 068/230] 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 From 2a9187e3cc9a15d20ba6c0f62de73855d49ad1d3 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 16 Oct 2023 12:21:59 +0200 Subject: [PATCH 069/230] compiled contracts paris --- compiled-contracts/paris/ERC20PermitMock.json | 524 +++++ compiled-contracts/paris/FflonkVerifier.json | 35 + .../paris/PolygonDataComittee.json | 1102 +++++++++ .../paris/PolygonRollupManager.json | 2034 +++++++++++++++++ compiled-contracts/paris/PolygonZkEVM.json | 1718 ++++++++++++++ .../paris/PolygonZkEVMBridge.json | 783 +++++++ .../paris/PolygonZkEVMBridgeMock.json | 874 +++++++ .../paris/PolygonZkEVMBridgeV2.json | 924 ++++++++ .../paris/PolygonZkEVMDeployer.json | 191 ++ .../paris/PolygonZkEVMGlobalExitRoot.json | 148 ++ .../paris/PolygonZkEVMGlobalExitRootL2.json | 85 + .../PolygonZkEVMGlobalExitRootL2Mock.json | 116 + .../paris/PolygonZkEVMGlobalExitRootMock.json | 179 ++ .../paris/PolygonZkEVMGlobalExitRootV2.json | 148 ++ .../paris/PolygonZkEVMMock.json | 1942 ++++++++++++++++ .../paris/PolygonZkEVMTimelock.json | 899 ++++++++ compiled-contracts/paris/PolygonZkEVMV2.json | 1008 ++++++++ .../paris/PolygonZkEVMV2Existent.json | 1046 +++++++++ compiled-contracts/paris/ProxyAdmin.json | 160 ++ compiled-contracts/paris/TokenWrapped.json | 478 ++++ .../paris/TransparentUpgradeableProxy.json | 155 ++ .../paris/VerifierRollupHelperMock.json | 35 + 22 files changed, 14584 insertions(+) create mode 100644 compiled-contracts/paris/ERC20PermitMock.json create mode 100644 compiled-contracts/paris/FflonkVerifier.json create mode 100644 compiled-contracts/paris/PolygonDataComittee.json create mode 100644 compiled-contracts/paris/PolygonRollupManager.json create mode 100644 compiled-contracts/paris/PolygonZkEVM.json create mode 100644 compiled-contracts/paris/PolygonZkEVMBridge.json create mode 100644 compiled-contracts/paris/PolygonZkEVMBridgeMock.json create mode 100644 compiled-contracts/paris/PolygonZkEVMBridgeV2.json create mode 100644 compiled-contracts/paris/PolygonZkEVMDeployer.json create mode 100644 compiled-contracts/paris/PolygonZkEVMGlobalExitRoot.json create mode 100644 compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2.json create mode 100644 compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2Mock.json create mode 100644 compiled-contracts/paris/PolygonZkEVMGlobalExitRootMock.json create mode 100644 compiled-contracts/paris/PolygonZkEVMGlobalExitRootV2.json create mode 100644 compiled-contracts/paris/PolygonZkEVMMock.json create mode 100644 compiled-contracts/paris/PolygonZkEVMTimelock.json create mode 100644 compiled-contracts/paris/PolygonZkEVMV2.json create mode 100644 compiled-contracts/paris/PolygonZkEVMV2Existent.json create mode 100644 compiled-contracts/paris/ProxyAdmin.json create mode 100644 compiled-contracts/paris/TokenWrapped.json create mode 100644 compiled-contracts/paris/TransparentUpgradeableProxy.json create mode 100644 compiled-contracts/paris/VerifierRollupHelperMock.json diff --git a/compiled-contracts/paris/ERC20PermitMock.json b/compiled-contracts/paris/ERC20PermitMock.json new file mode 100644 index 000000000..98f93ab81 --- /dev/null +++ b/compiled-contracts/paris/ERC20PermitMock.json @@ -0,0 +1,524 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ERC20PermitMock", + "sourceName": "contracts/mocks/ERC20PermitMock.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "address", + "name": "initialAccount", + "type": "address" + }, + { + "internalType": "uint256", + "name": "initialBalance", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "EIP712DOMAIN_HASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "NAME_HASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PERMIT_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "VERSION_HASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "approveInternal", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getChainId", + "outputs": [ + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "transferInternal", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6080604052604051620018e6380380620018e6833981016040819052620000269162000201565b8383600362000036838262000322565b50600462000045828262000322565b5050506200005a82826200007160201b60201c565b505081516020909201919091206006555062000416565b6001600160a01b038216620000cc5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060026000828254620000e09190620003ee565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200016457600080fd5b81516001600160401b03808211156200018157620001816200013c565b604051601f8301601f19908116603f01168101908282118183101715620001ac57620001ac6200013c565b81604052838152602092508683858801011115620001c957600080fd5b600091505b83821015620001ed5785820183015181830184015290820190620001ce565b600093810190920192909252949350505050565b600080600080608085870312156200021857600080fd5b84516001600160401b03808211156200023057600080fd5b6200023e8883890162000152565b955060208701519150808211156200025557600080fd5b50620002648782880162000152565b604087015190945090506001600160a01b03811681146200028457600080fd5b6060959095015193969295505050565b600181811c90821680620002a957607f821691505b602082108103620002ca57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200013757600081815260208120601f850160051c81016020861015620002f95750805b601f850160051c820191505b818110156200031a5782815560010162000305565b505050505050565b81516001600160401b038111156200033e576200033e6200013c565b62000356816200034f845462000294565b84620002d0565b602080601f8311600181146200038e5760008415620003755750858301515b600019600386901b1c1916600185901b1785556200031a565b600085815260208120601f198616915b82811015620003bf578886015182559484019460019091019084016200039e565b5085821015620003de5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156200041057634e487b7160e01b600052601160045260246000fd5b92915050565b6114c080620004266000396000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c806340c10f19116100e35780639e4e73181161008c578063c473af3311610066578063c473af33146103d6578063d505accf146103fd578063dd62ed3e1461041057600080fd5b80639e4e731814610389578063a457c2d7146103b0578063a9059cbb146103c357600080fd5b806370a08231116100bd57806370a082311461032b5780637ecebe001461036157806395d89b411461038157600080fd5b806340c10f19146102f257806342966c681461030557806356189cb41461031857600080fd5b806323b872dd116101455780633408e4701161011f5780633408e4701461024c5780633644e5151461025257806339509351146102df57600080fd5b806323b872dd1461020357806330adf81f14610216578063313ce5671461023d57600080fd5b8063095ea7b311610176578063095ea7b3146101c357806318160ddd146101e6578063222f5be0146101ee57600080fd5b806304622c2e1461019257806306fdde03146101ae575b600080fd5b61019b60065481565b6040519081526020015b60405180910390f35b6101b6610456565b6040516101a591906111e1565b6101d66101d1366004611276565b6104e8565b60405190151581526020016101a5565b60025461019b565b6102016101fc3660046112a0565b610502565b005b6101d66102113660046112a0565b610512565b61019b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b604051601281526020016101a5565b4661019b565b61019b6006546000907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f907fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646604080516020810195909552840192909252606083015260808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6101d66102ed366004611276565b610536565b610201610300366004611276565b610582565b6102016103133660046112dc565b610590565b6102016103263660046112a0565b61059d565b61019b6103393660046112f5565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61019b61036f3660046112f5565b60056020526000908152604090205481565b6101b66105a8565b61019b7fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc681565b6101d66103be366004611276565b6105b7565b6101d66103d1366004611276565b61068d565b61019b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b61020161040b366004611317565b61069b565b61019b61041e36600461138a565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b606060038054610465906113bd565b80601f0160208091040260200160405190810160405280929190818152602001828054610491906113bd565b80156104de5780601f106104b3576101008083540402835291602001916104de565b820191906000526020600020905b8154815290600101906020018083116104c157829003601f168201915b5050505050905090565b6000336104f68185856107e2565b60019150505b92915050565b61050d838383610995565b505050565b600033610520858285610c06565b61052b858585610995565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104f6908290869061057d90879061143f565b6107e2565b61058c8282610cd7565b5050565b61059a3382610dca565b50565b61050d8383836107e2565b606060048054610465906113bd565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61052b82868684036107e2565b6000336104f6818585610995565b42841015610705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f48455a3a3a7065726d69743a20415554485f45585049524544000000000000006044820152606401610677565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661075f83611452565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506107cd8882868686610f8e565b6107d88888886107e2565b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610884576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff8216610927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316610a38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff8216610adb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610b91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35b50505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610c005781811015610cca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610677565b610c0084848484036107e2565b73ffffffffffffffffffffffffffffffffffffffff8216610d54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610677565b8060026000828254610d66919061143f565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216610e6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015610f23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b600654604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f602080830191909152818301939093527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528251808303909101815260c08201909252815191909201207f190100000000000000000000000000000000000000000000000000000000000060e083015260e2820181905261010282018690529060009061012201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156110da573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81161580159061115557508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b6107d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f48455a3a3a5f76616c69646174655369676e6564446174613a20494e56414c4960448201527f445f5349474e41545552450000000000000000000000000000000000000000006064820152608401610677565b600060208083528351808285015260005b8181101561120e578581018301518582016040015282016111f2565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461127157600080fd5b919050565b6000806040838503121561128957600080fd5b6112928361124d565b946020939093013593505050565b6000806000606084860312156112b557600080fd5b6112be8461124d565b92506112cc6020850161124d565b9150604084013590509250925092565b6000602082840312156112ee57600080fd5b5035919050565b60006020828403121561130757600080fd5b6113108261124d565b9392505050565b600080600080600080600060e0888a03121561133257600080fd5b61133b8861124d565b96506113496020890161124d565b95506040880135945060608801359350608088013560ff8116811461136d57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561139d57600080fd5b6113a68361124d565b91506113b46020840161124d565b90509250929050565b600181811c908216806113d157607f821691505b60208210810361140a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104fc576104fc611410565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361148357611483611410565b506001019056fea26469706673582212208b36599ef550f0c194373b0c511974c888d8ed7226087368a04dca3579711bcd64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061018d5760003560e01c806340c10f19116100e35780639e4e73181161008c578063c473af3311610066578063c473af33146103d6578063d505accf146103fd578063dd62ed3e1461041057600080fd5b80639e4e731814610389578063a457c2d7146103b0578063a9059cbb146103c357600080fd5b806370a08231116100bd57806370a082311461032b5780637ecebe001461036157806395d89b411461038157600080fd5b806340c10f19146102f257806342966c681461030557806356189cb41461031857600080fd5b806323b872dd116101455780633408e4701161011f5780633408e4701461024c5780633644e5151461025257806339509351146102df57600080fd5b806323b872dd1461020357806330adf81f14610216578063313ce5671461023d57600080fd5b8063095ea7b311610176578063095ea7b3146101c357806318160ddd146101e6578063222f5be0146101ee57600080fd5b806304622c2e1461019257806306fdde03146101ae575b600080fd5b61019b60065481565b6040519081526020015b60405180910390f35b6101b6610456565b6040516101a591906111e1565b6101d66101d1366004611276565b6104e8565b60405190151581526020016101a5565b60025461019b565b6102016101fc3660046112a0565b610502565b005b6101d66102113660046112a0565b610512565b61019b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b604051601281526020016101a5565b4661019b565b61019b6006546000907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f907fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646604080516020810195909552840192909252606083015260808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6101d66102ed366004611276565b610536565b610201610300366004611276565b610582565b6102016103133660046112dc565b610590565b6102016103263660046112a0565b61059d565b61019b6103393660046112f5565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61019b61036f3660046112f5565b60056020526000908152604090205481565b6101b66105a8565b61019b7fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc681565b6101d66103be366004611276565b6105b7565b6101d66103d1366004611276565b61068d565b61019b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b61020161040b366004611317565b61069b565b61019b61041e36600461138a565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b606060038054610465906113bd565b80601f0160208091040260200160405190810160405280929190818152602001828054610491906113bd565b80156104de5780601f106104b3576101008083540402835291602001916104de565b820191906000526020600020905b8154815290600101906020018083116104c157829003601f168201915b5050505050905090565b6000336104f68185856107e2565b60019150505b92915050565b61050d838383610995565b505050565b600033610520858285610c06565b61052b858585610995565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104f6908290869061057d90879061143f565b6107e2565b61058c8282610cd7565b5050565b61059a3382610dca565b50565b61050d8383836107e2565b606060048054610465906113bd565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61052b82868684036107e2565b6000336104f6818585610995565b42841015610705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f48455a3a3a7065726d69743a20415554485f45585049524544000000000000006044820152606401610677565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661075f83611452565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506107cd8882868686610f8e565b6107d88888886107e2565b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610884576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff8216610927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316610a38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff8216610adb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610b91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35b50505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610c005781811015610cca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610677565b610c0084848484036107e2565b73ffffffffffffffffffffffffffffffffffffffff8216610d54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610677565b8060026000828254610d66919061143f565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216610e6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015610f23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b600654604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f602080830191909152818301939093527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528251808303909101815260c08201909252815191909201207f190100000000000000000000000000000000000000000000000000000000000060e083015260e2820181905261010282018690529060009061012201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156110da573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81161580159061115557508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b6107d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f48455a3a3a5f76616c69646174655369676e6564446174613a20494e56414c4960448201527f445f5349474e41545552450000000000000000000000000000000000000000006064820152608401610677565b600060208083528351808285015260005b8181101561120e578581018301518582016040015282016111f2565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461127157600080fd5b919050565b6000806040838503121561128957600080fd5b6112928361124d565b946020939093013593505050565b6000806000606084860312156112b557600080fd5b6112be8461124d565b92506112cc6020850161124d565b9150604084013590509250925092565b6000602082840312156112ee57600080fd5b5035919050565b60006020828403121561130757600080fd5b6113108261124d565b9392505050565b600080600080600080600060e0888a03121561133257600080fd5b61133b8861124d565b96506113496020890161124d565b95506040880135945060608801359350608088013560ff8116811461136d57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561139d57600080fd5b6113a68361124d565b91506113b46020840161124d565b90509250929050565b600181811c908216806113d157607f821691505b60208210810361140a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104fc576104fc611410565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361148357611483611410565b506001019056fea26469706673582212208b36599ef550f0c194373b0c511974c888d8ed7226087368a04dca3579711bcd64736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/paris/FflonkVerifier.json b/compiled-contracts/paris/FflonkVerifier.json new file mode 100644 index 000000000..c1d65a241 --- /dev/null +++ b/compiled-contracts/paris/FflonkVerifier.json @@ -0,0 +1,35 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "FflonkVerifier", + "sourceName": "contracts/verifiers/FflonkVerifier.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "bytes32[24]", + "name": "proof", + "type": "bytes32[24]" + }, + { + "internalType": "uint256[1]", + "name": "pubSignals", + "type": "uint256[1]" + } + ], + "name": "verifyProof", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b506159ee80620000216000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80639121da8a14610030575b600080fd5b61004361003e366004615973565b610057565b604051901515815260200160405180910390f35b6000615901565b6040516104c08201518082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610500840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610520840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610620840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760840151820990508082526102e4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309600114610514576000805260206000f35b8091506020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161076085015183099150806107608501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001850151830991508060a06106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001850151830991508060806106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001850151830991508060606106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001850151830991508060406106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001850151830991508060206106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a085015183099150806106a08501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106200185015183099150806060610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106200185015183099150806040610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106200185015183099150806020610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161062085015183099150806106208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001850151830991508060e0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001850151830991508060c0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001850151830991508060a0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806105200185015183099150806080610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606105200185015183099150806060610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406105200185015183099150806040610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206105200185015183099150806020610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161052085015183099150806105208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161050085015183099150806105008501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e085015183099150806104e085015250806104c0840152505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110610d7a576000805260206000f35b50565b803560208201357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760037f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478085860985090891507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478182099050808214610e08576000805260206000f35b505050565b610e176004610d7d565b610e216044610d7d565b610e2b6084610d7d565b610e3560c4610d7d565b610e4161010435610d49565b610e4d61012435610d49565b610e5961014435610d49565b610e6561016435610d49565b610e7161018435610d49565b610e7d6101a435610d49565b610e896101c435610d49565b610e956101e435610d49565b610ea161020435610d49565b610ead61022435610d49565b610eb961024435610d49565b610ec561026435610d49565b610ed161028435610d49565b610edd6102a435610d49565b610ee96102c435610d49565b610ef56102e435610d49565b565b7f16d70f6937b88ea2890451712281f2073db9ac923d49d38d833cbbcbc2b281c861078082019081527f1f7e1d70965392e542392cab2e10e88c03912b89107ae96c3a6b13f31f3a4cd06107a0830190815283356107c084019081526004356107e085015260243561080085015260a083207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908190066020808701918252902081900660408601819052845260443590925260643590526060909120819006608083018190529081800960a0830181905260808301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001910960e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8060e0840151096101008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f70363660e0840151096101208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f1d59376149b959ccbd157ac850893a6f07c2d99b3852513ab8d01be8e846a56660e0840151096101408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000060e0840151096101608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0530d09118705106cbb4a786ead16926d5d174e181a26686af5448492e42a18160e0840151096101808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb60e0840151096101a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f130b17119778465cfb3acaee30f81dee20710ead41671f568b11d9ab07b95a9b60e0840151096101c083015260e08201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019080096101e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f7036366101e0840151096102008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006101e0840151096102208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb6101e0840151096102408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a08301516101e0840151096102608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f23610260840151096102808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd610260840151096102a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f283ce45a2e5b8e4e78f9fbaf5f6a348bfcfaf76dd28e5ca7121b74ef68fdec2e610260840151096102c08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f236102c0840151096102e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd6102c0840151096103008301526102608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081818009098060c08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018182097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000909101066104a084018190526104c0840152506107808201526101e06101046107a083013761020061078082019081207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081900680845282526084356107a084015260a4356107c08401526060918290200691015250565b60e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018160080960e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105208601526101c08501516101008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105408601526101a08501516101208601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105608601526101808501516101408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961058086015261016085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105a08601526101408501516101808601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105c08601526101208501516101a08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105e08601526101008501516101c08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830960e0610520018601525050505050565b6101e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001816004096101e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106208601526102408501516102008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961064086015261022085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106608601526102008501516102408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096060610620018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c0870151097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030660c0850151087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610260850151600309096102608301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181810381900684087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106a08601526102a08501516102808601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106c08601526102808501516102a08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960406106a0018601527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c08801517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103067f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08a015109087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c0880151600309096102c086015190935091507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001828103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107008601526103008501516102e08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107208601526102e08501516103008601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960a06106a0018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806101e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806104e08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102608501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102e08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016103008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806105008401526127ff8361194e565b61280883611d96565b61281183611fac565b505060c081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000083018190066301000000096107608401525050610d7a8161005e565b6104a08101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181610760840151096107608301525050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185356107608601510983030106905080610320830152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820860e083015190915060009081807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600061052001890151880984098508935061010086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001890151880984098508935061012086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001890151880984098508935061014086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001890151880984098508935061016086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001890151880984098508935061018086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06105200189015188098409850893506101a086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c06105200189015188098409850893506101c086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e4350983089150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e0610520018801518709830984089250505080610340840152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068208905060006102043561022435610244357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183610104350993507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180836101243509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018486096101443509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161018435850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610320870151850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c087015185096101e08701519094506000908490827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600002610620018d01518c098509850893508692506102008a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600102610620018d01518c098509850893508692506102208a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600202610620018d01518c098509850893508692506102408a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001858509098408925050507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600302610620018b01518a09830983089150508061036088015250505050505050565b606081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309905060017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08901510908820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830860c08501519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190817f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b82090990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183089150506000915060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c085015160208601510960408501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828408610204350892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028709086102243508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160038709086102443508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161026435840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a43560208b01510908610204350894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c43560208c015109086102243508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101e43560208c015109086102443508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161028435860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151840992506001610264350394507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760870151860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c08701518609610260870151909550915060009050807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206000026106a0018a0151880983098308915061028087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206001026106a0018a015188098309830891506102a087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206002026106a0018a015188098309830891506102c087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206003026106a0018a015188098309830891506102e087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206004026106a0018a0151880983098308915061030087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206005026106a0018a015188098309830891505080610380870152505050505050565b6040518151815260208201516020820152825160408201526020830151606082015260408260808360066107d05a03fa905080610e08576000805260206000f35b6000604051833581526020840135602082015284604082015260408160608360076107d05a03fa91508161514e576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa9150508061517f576000805260206000f35b50505050565b600060405183815284602082015285604082015260408160608360076107d05a03fa9150816151b8576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa915050806151e9576000805260206000f35b5050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101608601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806104e0850151830984510991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180610500850151830984517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908009097f16d70f6937b88ea2890451712281f2073db9ac923d49d38d833cbbcbc2b281c86103a08501527f1f7e1d70965392e542392cab2e10e88c03912b89107ae96c3a6b13f31f3a4cd060206103a0018501526156408360046103a08701615116565b6156508160446103a08701615116565b6156dd7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161038088015185097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161036089015188090861034087015108600260016103e08801615185565b50610e088160846104208601615116565b604051610400820180517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd479081038190069091526104408301805182039190910690526000906157466103e084016103a085016150d5565b61575861042084016103a085016150d5565b61576c606084015160c46103a08601615116565b6103a083015181526103c08301516020808301919091527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a083015260c43560c08301527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760e43581030660e08301527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6101008301527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6101208301527f1970ea81dd6992adfbc571effb03503adbbb6a857f578403c6c40e22d65b3c026101408301527f054793348f12c0cf5622c340573cb277586319de359ab9389778f689786b1e48610160830152816101808160086107d05a03fa90511692915050565b6040516107808101604052615914610e0d565b61591e8382610ef7565b615927816123b7565b61593081612878565b61593a83826128b1565b61594381612911565b61594c81613e61565b61595581614559565b61595e816151f0565b615967816156ee565b90508060005260206000f35b60008061032080848603121561598857600080fd5b61030084018581111561599a57600080fd5b8493508582860111156159ac57600080fd5b8092505050925092905056fea26469706673582212204e835be6085497477d8e8c8932e2bd14ceccfe12f0a45b7352b0cbcd0588cc9864736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80639121da8a14610030575b600080fd5b61004361003e366004615973565b610057565b604051901515815260200160405180910390f35b6000615901565b6040516104c08201518082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610500840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610520840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610620840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760840151820990508082526102e4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309600114610514576000805260206000f35b8091506020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161076085015183099150806107608501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001850151830991508060a06106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001850151830991508060806106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001850151830991508060606106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001850151830991508060406106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001850151830991508060206106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a085015183099150806106a08501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106200185015183099150806060610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106200185015183099150806040610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106200185015183099150806020610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161062085015183099150806106208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001850151830991508060e0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001850151830991508060c0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001850151830991508060a0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806105200185015183099150806080610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606105200185015183099150806060610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406105200185015183099150806040610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206105200185015183099150806020610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161052085015183099150806105208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161050085015183099150806105008501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e085015183099150806104e085015250806104c0840152505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110610d7a576000805260206000f35b50565b803560208201357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760037f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478085860985090891507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478182099050808214610e08576000805260206000f35b505050565b610e176004610d7d565b610e216044610d7d565b610e2b6084610d7d565b610e3560c4610d7d565b610e4161010435610d49565b610e4d61012435610d49565b610e5961014435610d49565b610e6561016435610d49565b610e7161018435610d49565b610e7d6101a435610d49565b610e896101c435610d49565b610e956101e435610d49565b610ea161020435610d49565b610ead61022435610d49565b610eb961024435610d49565b610ec561026435610d49565b610ed161028435610d49565b610edd6102a435610d49565b610ee96102c435610d49565b610ef56102e435610d49565b565b7f16d70f6937b88ea2890451712281f2073db9ac923d49d38d833cbbcbc2b281c861078082019081527f1f7e1d70965392e542392cab2e10e88c03912b89107ae96c3a6b13f31f3a4cd06107a0830190815283356107c084019081526004356107e085015260243561080085015260a083207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908190066020808701918252902081900660408601819052845260443590925260643590526060909120819006608083018190529081800960a0830181905260808301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001910960e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8060e0840151096101008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f70363660e0840151096101208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f1d59376149b959ccbd157ac850893a6f07c2d99b3852513ab8d01be8e846a56660e0840151096101408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000060e0840151096101608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0530d09118705106cbb4a786ead16926d5d174e181a26686af5448492e42a18160e0840151096101808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb60e0840151096101a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f130b17119778465cfb3acaee30f81dee20710ead41671f568b11d9ab07b95a9b60e0840151096101c083015260e08201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019080096101e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f7036366101e0840151096102008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006101e0840151096102208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb6101e0840151096102408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a08301516101e0840151096102608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f23610260840151096102808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd610260840151096102a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f283ce45a2e5b8e4e78f9fbaf5f6a348bfcfaf76dd28e5ca7121b74ef68fdec2e610260840151096102c08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f236102c0840151096102e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd6102c0840151096103008301526102608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081818009098060c08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018182097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000909101066104a084018190526104c0840152506107808201526101e06101046107a083013761020061078082019081207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081900680845282526084356107a084015260a4356107c08401526060918290200691015250565b60e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018160080960e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105208601526101c08501516101008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105408601526101a08501516101208601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105608601526101808501516101408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961058086015261016085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105a08601526101408501516101808601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105c08601526101208501516101a08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105e08601526101008501516101c08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830960e0610520018601525050505050565b6101e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001816004096101e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106208601526102408501516102008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961064086015261022085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106608601526102008501516102408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096060610620018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c0870151097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030660c0850151087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610260850151600309096102608301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181810381900684087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106a08601526102a08501516102808601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106c08601526102808501516102a08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960406106a0018601527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c08801517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103067f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08a015109087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c0880151600309096102c086015190935091507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001828103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107008601526103008501516102e08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107208601526102e08501516103008601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960a06106a0018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806101e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806104e08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102608501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102e08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016103008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806105008401526127ff8361194e565b61280883611d96565b61281183611fac565b505060c081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000083018190066301000000096107608401525050610d7a8161005e565b6104a08101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181610760840151096107608301525050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185356107608601510983030106905080610320830152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820860e083015190915060009081807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600061052001890151880984098508935061010086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001890151880984098508935061012086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001890151880984098508935061014086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001890151880984098508935061016086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001890151880984098508935061018086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06105200189015188098409850893506101a086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c06105200189015188098409850893506101c086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e4350983089150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e0610520018801518709830984089250505080610340840152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068208905060006102043561022435610244357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183610104350993507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180836101243509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018486096101443509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161018435850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610320870151850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c087015185096101e08701519094506000908490827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600002610620018d01518c098509850893508692506102008a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600102610620018d01518c098509850893508692506102208a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600202610620018d01518c098509850893508692506102408a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001858509098408925050507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600302610620018b01518a09830983089150508061036088015250505050505050565b606081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309905060017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08901510908820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830860c08501519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190817f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b82090990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183089150506000915060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c085015160208601510960408501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828408610204350892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028709086102243508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160038709086102443508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161026435840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a43560208b01510908610204350894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c43560208c015109086102243508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101e43560208c015109086102443508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161028435860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151840992506001610264350394507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760870151860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c08701518609610260870151909550915060009050807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206000026106a0018a0151880983098308915061028087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206001026106a0018a015188098309830891506102a087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206002026106a0018a015188098309830891506102c087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206003026106a0018a015188098309830891506102e087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206004026106a0018a0151880983098308915061030087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206005026106a0018a015188098309830891505080610380870152505050505050565b6040518151815260208201516020820152825160408201526020830151606082015260408260808360066107d05a03fa905080610e08576000805260206000f35b6000604051833581526020840135602082015284604082015260408160608360076107d05a03fa91508161514e576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa9150508061517f576000805260206000f35b50505050565b600060405183815284602082015285604082015260408160608360076107d05a03fa9150816151b8576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa915050806151e9576000805260206000f35b5050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101608601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806104e0850151830984510991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180610500850151830984517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908009097f16d70f6937b88ea2890451712281f2073db9ac923d49d38d833cbbcbc2b281c86103a08501527f1f7e1d70965392e542392cab2e10e88c03912b89107ae96c3a6b13f31f3a4cd060206103a0018501526156408360046103a08701615116565b6156508160446103a08701615116565b6156dd7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161038088015185097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161036089015188090861034087015108600260016103e08801615185565b50610e088160846104208601615116565b604051610400820180517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd479081038190069091526104408301805182039190910690526000906157466103e084016103a085016150d5565b61575861042084016103a085016150d5565b61576c606084015160c46103a08601615116565b6103a083015181526103c08301516020808301919091527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a083015260c43560c08301527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760e43581030660e08301527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6101008301527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6101208301527f1970ea81dd6992adfbc571effb03503adbbb6a857f578403c6c40e22d65b3c026101408301527f054793348f12c0cf5622c340573cb277586319de359ab9389778f689786b1e48610160830152816101808160086107d05a03fa90511692915050565b6040516107808101604052615914610e0d565b61591e8382610ef7565b615927816123b7565b61593081612878565b61593a83826128b1565b61594381612911565b61594c81613e61565b61595581614559565b61595e816151f0565b615967816156ee565b90508060005260206000f35b60008061032080848603121561598857600080fd5b61030084018581111561599a57600080fd5b8493508582860111156159ac57600080fd5b8092505050925092905056fea26469706673582212204e835be6085497477d8e8c8932e2bd14ceccfe12f0a45b7352b0cbcd0588cc9864736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/paris/PolygonDataComittee.json b/compiled-contracts/paris/PolygonDataComittee.json new file mode 100644 index 000000000..ccd07c633 --- /dev/null +++ b/compiled-contracts/paris/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": "0x6101206040523480156200001257600080fd5b506040516200475c3803806200475c833981016040819052620000359162000078565b6001600160a01b0394851660a05292841660805290831660c052821660e0521661010052620000f8565b6001600160a01b03811681146200007557600080fd5b50565b600080600080600060a086880312156200009157600080fd5b85516200009e816200005f565b6020870151909550620000b1816200005f565b6040870151909450620000c4816200005f565b6060870151909350620000d7816200005f565b6080870151909250620000ea816200005f565b809150509295509295909350565b60805160a05160c05160e05161010051614570620001ec600039600081816105120152611e3f0152600081816104a60152818161091c015281816109eb01528181610e6f0152818161103b01528181611f0101528181611fca01528181611fec01528181612183015281816126b70152818161278501528181612872015281816131f1015281816132720152818161329401526133be0152600081816105c6015281816120c401526132ff01526000818161068a01528181611bb2015281816129bd0152612f140152600081816106d7015281816107b401528181611f540152818161209a015261299101526145706000f3fe608060405234801561001057600080fd5b50600436106102d25760003560e01c80636ff512cc11610186578063c89e42df116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b14610719578063f35dda471461072c578063f851a4401461074657600080fd5b8063d8d1091b146106bf578063e46761c4146106d2578063e7a7ed02146106f957600080fd5b8063d02103ca116100c8578063d02103ca14610685578063d690be31146106ac578063d7bc90ff146106b457600080fd5b8063c89e42df14610652578063cfa8ed471461066557600080fd5b8063aa3587d31161013a578063b0afe1541161011f578063b0afe15414610603578063b81fcafd1461060f578063c754c7ed1461062257600080fd5b8063aa3587d3146105e8578063ada8f919146105f057600080fd5b806399af03971161016b57806399af0397146105935780639e001877146105a6578063a3c573eb146105c157600080fd5b80636ff512cc146105785780638c3d73011461058b57600080fd5b806347ebf1081161023457806356e29435116101e85780635ec91958116101cd5780635ec91958146105475780636b8616ce1461054f5780636e05d2cd1461056f57600080fd5b806356e294351461050d5780635e9145c91461053457600080fd5b80634c21fef3116102195780634c21fef3146104c85780634e487706146104f2578063542028d51461050557600080fd5b806347ebf1081461048e57806349b7b802146104a157600080fd5b806332c2d1531161028b5780633cbc795b116102705780633cbc795b146103d057806340b5de6c1461040e578063456052671461046657600080fd5b806332c2d153146103965780633c351e10146103ab57600080fd5b806319d8ac61116102bc57806319d8ac611461030757806326782247146103345780632b35b3ac1461037957600080fd5b8062d0295d146102d7578063107bf28c146102f2575b600080fd5b6102df61076c565b6040519081526020015b60405180910390f35b6102fa61088c565b6040516102e99190613946565b60075461031b9067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102e9565b6001546103549073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102e9565b6008546103869060ff1681565b60405190151581526020016102e9565b6103a96103a43660046139a2565b61091a565b005b60085461035490610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6008546103f9907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102e9565b6104357fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102e9565b60075461031b90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103a961049c366004613af7565b6109e9565b6103547f000000000000000000000000000000000000000000000000000000000000000081565b60085461038690790100000000000000000000000000000000000000000000000000900460ff1681565b6103a9610500366004613bae565b610f9b565b6102fa6111b5565b6103547f000000000000000000000000000000000000000000000000000000000000000081565b6103a9610542366004613c17565b6111c2565b6103a961122b565b6102df61055d366004613bae565b60066020526000908152604090205481565b6102df60055481565b6103a9610586366004613c62565b611315565b6103a96113df565b6102fa6105a1366004613c7d565b6114b2565b61035473a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103547f000000000000000000000000000000000000000000000000000000000000000081565b6103a9611730565b6103a96105fe366004613c62565b611802565b6102df6405ca1ab1e081565b6103a961061d366004613cf9565b6118cc565b60075461031b907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6103a9610660366004613dab565b61224c565b6002546103549073ffffffffffffffffffffffffffffffffffffffff1681565b6103547f000000000000000000000000000000000000000000000000000000000000000081565b6102fa6122df565b6102df635ca1ab1e81565b6103a96106cd366004613de0565b6122fb565b6103547f000000000000000000000000000000000000000000000000000000000000000081565b60075461031b9068010000000000000000900467ffffffffffffffff1681565b6103a9610727366004613e22565b612832565b610734601b81565b60405160ff90911681526020016102e9565b6000546103549062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156107fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081f9190613e6e565b60075490915060009061085e9067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613eb6565b67ffffffffffffffff1690508060000361087b5760009250505090565b6108858183613ede565b9250505090565b6004805461089990613f19565b80601f01602080910402602001604051908101604052809291908181526020018280546108c590613f19565b80156109125780601f106108e757610100808354040283529160200191610912565b820191906000526020600020905b8154815290600101906020018083116108f557829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610989576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966846040516109dc91815260200190565b60405180910390a3505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a58576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610a785750600054600160ff909116105b80610a925750303b158015610a92575060005460ff166001145b610b23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610b8157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8b81169190910291909117909155600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000169189169190911790556003610c098482613fba565b506004610c168382613fba565b506007805477ffffffffffffffffffffffffffffffffffffffffffffffff167a06978000000000000000000000000000000000000000000000000017905573ffffffffffffffffffffffffffffffffffffffff8516610cad5763ffffffff841615610cad576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8816027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff8716021790556000610d408787876114b2565b805160208083019190912060408051600093810184905290810182905260608082018490524260c081901b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015293945090929190609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291506000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015610ecd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef191906140d4565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050508015610f9157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ff2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611039576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c891906140f1565b6111315760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611131576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461089990613f19565b600854790100000000000000000000000000000000000000000000000000900460ff1661121b576040517f821935b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611226838383612c21565b505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611282576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff16156112bf576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461136c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016111aa565b60015473ffffffffffffffffffffffffffffffffffffffff163314611430576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600060405180606001604052806021815260200161451a6021913960405163ffffffff808816602483015273ffffffffffffffffffffffffffffffffffffffff871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa6084820152600060a482015260c401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd3476afe0000000000000000000000000000000000000000000000000000000017905290516115ab93929101614113565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015611639573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166116b1576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906116f79084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614142565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152919052979650505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611787576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff81167901000000000000000000000000000000000000000000000000009182900460ff16159091021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f4190600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611859576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016111aa565b60025473ffffffffffffffffffffffffffffffffffffffff16331461191d576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836000819003611959576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611995576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b85811015611d855760008b8b838181106119de576119de61419e565b9050608002018036038101906119f491906141cd565b805160608201519192509067ffffffffffffffff1615611b6f5785611a1881614222565b96505060008183602001518460600151604051602001611a7093929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114611af9576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015611b4f576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055611c6d565b602082015115801590611c36575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015611c10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c349190613e6e565b155b15611c6d576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff161080611ca0575042826040015167ffffffffffffffff16115b15611cd7576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151965050508080611d7d90614249565b9150506119c2565b5060075467ffffffffffffffff6801000000000000000090910481169084161115611ddc576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861617905560058290556040517fc7a823e000000000000000000000000000000000000000000000000000000000815285907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063c7a823e090611e8d9086908c908c906004016142ca565b60006040518083038186803b158015611ea557600080fd5b505afa158015611eb9573d6000803e3d6000fd5b505050508167ffffffffffffffff168467ffffffffffffffff1614611fc4576000611ee48386613eb6565b9050611efa67ffffffffffffffff8216836142ed565b9150611f7b7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611f3361076c565b611f3d9190614306565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613485565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6120c2337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612055573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120799190613e6e565b6120839190614306565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613559565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561212a57600080fd5b505af115801561213e573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af11580156121e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061220691906140d4565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a2505050505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146122a3576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036122af8282613fba565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516111aa9190613946565b60405180606001604052806021815260200161451a6021913981565b60085460ff16612337576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003612373576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156123af576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff6801000000000000000082048116916123ea91849170010000000000000000000000000000000090041661431d565b1115612422576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b838110156126b15760008686838181106124675761246761419e565b90506020028101906124799190614330565b6124829061436e565b90508361248e81614222565b825180516020918201208185015160408087015190519499509194506000936124f09386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612579576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff861660009081526006602052604081205561259e6001886142ed565b840361260d5742600760189054906101000a900467ffffffffffffffff1684604001516125cb91906143ec565b67ffffffffffffffff16111561260d576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806126a990614249565b91505061244b565b506126df7f000000000000000000000000000000000000000000000000000000000000000084611f3361076c565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af11580156127ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127f291906140d4565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff1661286e576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ff9190613e6e565b90508181111561293b576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612977576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129b973ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613559565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a4a9190613e6e565b600780549192506801000000000000000090910467ffffffffffffffff16906008612a7483614222565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612aab92919061440d565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612bbb576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612c1a565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612c11949392919061441d565b60405180910390a25b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612c72576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003612cae576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612cea576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b85811015613126576000898983818110612d3357612d3361419e565b9050602002810190612d45919061445d565b612d4e90614491565b8051805160209091012060608201519192509067ffffffffffffffff1615612ed15785612d7a81614222565b96505060008183602001518460600151604051602001612dd293929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114612e5b576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015612eb1576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff861660009081526006602052604081205561300e565b602082015115801590612f98575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015612f72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f969190613e6e565b155b15612fcf576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c0101561300e576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff161080613041575042826040015167ffffffffffffffff16115b15613078576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061311e90614249565b915050612d17565b5060075467ffffffffffffffff680100000000000000009091048116908416111561317d576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691909117909155600583905585908281169085161461326c5760006131d48386613eb6565b90506131ea67ffffffffffffffff8216836142ed565b91506132237f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611f3361076c565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6132fd337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612055573d6000803e3d6000fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561336557600080fd5b505af1158015613379573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af115801561341d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061344191906140d4565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112269084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526135bd565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526135b79085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016134d7565b50505050565b600061361f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166136c99092919063ffffffff16565b805190915015611226578080602001905181019061363d91906140f1565b611226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b1a565b60606136d884846000856136e0565b949350505050565b606082471015613772576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b1a565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161379b9190614507565b60006040518083038185875af1925050503d80600081146137d8576040519150601f19603f3d011682016040523d82523d6000602084013e6137dd565b606091505b50915091506137ee878383876137f9565b979650505050505050565b6060831561388f5782516000036138885773ffffffffffffffffffffffffffffffffffffffff85163b613888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b1a565b50816136d8565b6136d883838151156138a45781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1a9190613946565b60005b838110156138f35781810151838201526020016138db565b50506000910152565b600081518084526139148160208601602086016138d8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061395960208301846138fc565b9392505050565b67ffffffffffffffff8116811461397657600080fd5b50565b803573ffffffffffffffffffffffffffffffffffffffff8116811461399d57600080fd5b919050565b6000806000606084860312156139b757600080fd5b83356139c281613960565b9250602084013591506139d760408501613979565b90509250925092565b803563ffffffff8116811461399d57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715613a4657613a466139f4565b60405290565b600082601f830112613a5d57600080fd5b813567ffffffffffffffff80821115613a7857613a786139f4565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715613abe57613abe6139f4565b81604052838152866020858801011115613ad757600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a031215613b1257600080fd5b613b1b88613979565b9650613b2960208901613979565b9550613b37604089016139e0565b9450613b4560608901613979565b9350613b53608089016139e0565b925060a088013567ffffffffffffffff80821115613b7057600080fd5b613b7c8b838c01613a4c565b935060c08a0135915080821115613b9257600080fd5b50613b9f8a828b01613a4c565b91505092959891949750929550565b600060208284031215613bc057600080fd5b813561395981613960565b60008083601f840112613bdd57600080fd5b50813567ffffffffffffffff811115613bf557600080fd5b6020830191508360208260051b8501011115613c1057600080fd5b9250929050565b600080600060408486031215613c2c57600080fd5b833567ffffffffffffffff811115613c4357600080fd5b613c4f86828701613bcb565b90945092506139d7905060208501613979565b600060208284031215613c7457600080fd5b61395982613979565b600080600060608486031215613c9257600080fd5b613c9b846139e0565b9250613ca960208501613979565b91506139d7604085016139e0565b60008083601f840112613cc957600080fd5b50813567ffffffffffffffff811115613ce157600080fd5b602083019150836020828501011115613c1057600080fd5b600080600080600060608688031215613d1157600080fd5b853567ffffffffffffffff80821115613d2957600080fd5b818801915088601f830112613d3d57600080fd5b813581811115613d4c57600080fd5b8960208260071b8501011115613d6157600080fd5b60208301975080965050613d7760208901613979565b94506040880135915080821115613d8d57600080fd5b50613d9a88828901613cb7565b969995985093965092949392505050565b600060208284031215613dbd57600080fd5b813567ffffffffffffffff811115613dd457600080fd5b6136d884828501613a4c565b60008060208385031215613df357600080fd5b823567ffffffffffffffff811115613e0a57600080fd5b613e1685828601613bcb565b90969095509350505050565b600080600060408486031215613e3757600080fd5b833567ffffffffffffffff811115613e4e57600080fd5b613e5a86828701613cb7565b909790965060209590950135949350505050565b600060208284031215613e8057600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613ed757613ed7613e87565b5092915050565b600082613f14577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613f2d57607f821691505b602082108103613f66577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561122657600081815260208120601f850160051c81016020861015613f935750805b601f850160051c820191505b81811015613fb257828155600101613f9f565b505050505050565b815167ffffffffffffffff811115613fd457613fd46139f4565b613fe881613fe28454613f19565b84613f6c565b602080601f83116001811461403b57600084156140055750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613fb2565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561408857888601518255948401946001909101908401614069565b50858210156140c457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156140e657600080fd5b815161395981613960565b60006020828403121561410357600080fd5b8151801515811461395957600080fd5b600083516141258184602088016138d8565b8351908301906141398183602088016138d8565b01949350505050565b60008651614154818460208b016138d8565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000608082840312156141df57600080fd5b6141e7613a23565b8235815260208301356020820152604083013561420381613960565b6040820152606083013561421681613960565b60608201529392505050565b600067ffffffffffffffff80831681810361423f5761423f613e87565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361427a5761427a613e87565b5060010190565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8381526040602082015260006142e4604083018486614281565b95945050505050565b8181038181111561430057614300613e87565b92915050565b808202811582820484141761430057614300613e87565b8082018082111561430057614300613e87565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261436457600080fd5b9190910192915050565b60006060823603121561438057600080fd5b6040516060810167ffffffffffffffff82821081831117156143a4576143a46139f4565b8160405284359150808211156143b957600080fd5b506143c636828601613a4c565b8252506020830135602082015260408301356143e181613960565b604082015292915050565b67ffffffffffffffff818116838216019080821115613ed757613ed7613e87565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000614453606083018486614281565b9695505050505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261436457600080fd5b6000608082360312156144a357600080fd5b6144ab613a23565b823567ffffffffffffffff8111156144c257600080fd5b6144ce36828601613a4c565b8252506020830135602082015260408301356144e981613960565b604082015260608301356144fc81613960565b606082015292915050565b600082516143648184602087016138d856fef8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a264697066735822122045a2993cfa2ca76e08de8ae90432ad69a57d8cff79895c7ab562425e2ba345c864736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102d25760003560e01c80636ff512cc11610186578063c89e42df116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b14610719578063f35dda471461072c578063f851a4401461074657600080fd5b8063d8d1091b146106bf578063e46761c4146106d2578063e7a7ed02146106f957600080fd5b8063d02103ca116100c8578063d02103ca14610685578063d690be31146106ac578063d7bc90ff146106b457600080fd5b8063c89e42df14610652578063cfa8ed471461066557600080fd5b8063aa3587d31161013a578063b0afe1541161011f578063b0afe15414610603578063b81fcafd1461060f578063c754c7ed1461062257600080fd5b8063aa3587d3146105e8578063ada8f919146105f057600080fd5b806399af03971161016b57806399af0397146105935780639e001877146105a6578063a3c573eb146105c157600080fd5b80636ff512cc146105785780638c3d73011461058b57600080fd5b806347ebf1081161023457806356e29435116101e85780635ec91958116101cd5780635ec91958146105475780636b8616ce1461054f5780636e05d2cd1461056f57600080fd5b806356e294351461050d5780635e9145c91461053457600080fd5b80634c21fef3116102195780634c21fef3146104c85780634e487706146104f2578063542028d51461050557600080fd5b806347ebf1081461048e57806349b7b802146104a157600080fd5b806332c2d1531161028b5780633cbc795b116102705780633cbc795b146103d057806340b5de6c1461040e578063456052671461046657600080fd5b806332c2d153146103965780633c351e10146103ab57600080fd5b806319d8ac61116102bc57806319d8ac611461030757806326782247146103345780632b35b3ac1461037957600080fd5b8062d0295d146102d7578063107bf28c146102f2575b600080fd5b6102df61076c565b6040519081526020015b60405180910390f35b6102fa61088c565b6040516102e99190613946565b60075461031b9067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102e9565b6001546103549073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102e9565b6008546103869060ff1681565b60405190151581526020016102e9565b6103a96103a43660046139a2565b61091a565b005b60085461035490610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6008546103f9907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102e9565b6104357fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102e9565b60075461031b90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103a961049c366004613af7565b6109e9565b6103547f000000000000000000000000000000000000000000000000000000000000000081565b60085461038690790100000000000000000000000000000000000000000000000000900460ff1681565b6103a9610500366004613bae565b610f9b565b6102fa6111b5565b6103547f000000000000000000000000000000000000000000000000000000000000000081565b6103a9610542366004613c17565b6111c2565b6103a961122b565b6102df61055d366004613bae565b60066020526000908152604090205481565b6102df60055481565b6103a9610586366004613c62565b611315565b6103a96113df565b6102fa6105a1366004613c7d565b6114b2565b61035473a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103547f000000000000000000000000000000000000000000000000000000000000000081565b6103a9611730565b6103a96105fe366004613c62565b611802565b6102df6405ca1ab1e081565b6103a961061d366004613cf9565b6118cc565b60075461031b907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6103a9610660366004613dab565b61224c565b6002546103549073ffffffffffffffffffffffffffffffffffffffff1681565b6103547f000000000000000000000000000000000000000000000000000000000000000081565b6102fa6122df565b6102df635ca1ab1e81565b6103a96106cd366004613de0565b6122fb565b6103547f000000000000000000000000000000000000000000000000000000000000000081565b60075461031b9068010000000000000000900467ffffffffffffffff1681565b6103a9610727366004613e22565b612832565b610734601b81565b60405160ff90911681526020016102e9565b6000546103549062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156107fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081f9190613e6e565b60075490915060009061085e9067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613eb6565b67ffffffffffffffff1690508060000361087b5760009250505090565b6108858183613ede565b9250505090565b6004805461089990613f19565b80601f01602080910402602001604051908101604052809291908181526020018280546108c590613f19565b80156109125780601f106108e757610100808354040283529160200191610912565b820191906000526020600020905b8154815290600101906020018083116108f557829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610989576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966846040516109dc91815260200190565b60405180910390a3505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a58576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610a785750600054600160ff909116105b80610a925750303b158015610a92575060005460ff166001145b610b23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610b8157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8b81169190910291909117909155600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000169189169190911790556003610c098482613fba565b506004610c168382613fba565b506007805477ffffffffffffffffffffffffffffffffffffffffffffffff167a06978000000000000000000000000000000000000000000000000017905573ffffffffffffffffffffffffffffffffffffffff8516610cad5763ffffffff841615610cad576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8816027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff8716021790556000610d408787876114b2565b805160208083019190912060408051600093810184905290810182905260608082018490524260c081901b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015293945090929190609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291506000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015610ecd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef191906140d4565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050508015610f9157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ff2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611039576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c891906140f1565b6111315760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611131576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461089990613f19565b600854790100000000000000000000000000000000000000000000000000900460ff1661121b576040517f821935b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611226838383612c21565b505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611282576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff16156112bf576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461136c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016111aa565b60015473ffffffffffffffffffffffffffffffffffffffff163314611430576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600060405180606001604052806021815260200161451a6021913960405163ffffffff808816602483015273ffffffffffffffffffffffffffffffffffffffff871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa6084820152600060a482015260c401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd3476afe0000000000000000000000000000000000000000000000000000000017905290516115ab93929101614113565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015611639573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166116b1576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906116f79084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614142565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152919052979650505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611787576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff81167901000000000000000000000000000000000000000000000000009182900460ff16159091021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f4190600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611859576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016111aa565b60025473ffffffffffffffffffffffffffffffffffffffff16331461191d576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836000819003611959576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611995576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b85811015611d855760008b8b838181106119de576119de61419e565b9050608002018036038101906119f491906141cd565b805160608201519192509067ffffffffffffffff1615611b6f5785611a1881614222565b96505060008183602001518460600151604051602001611a7093929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114611af9576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015611b4f576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055611c6d565b602082015115801590611c36575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015611c10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c349190613e6e565b155b15611c6d576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff161080611ca0575042826040015167ffffffffffffffff16115b15611cd7576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151965050508080611d7d90614249565b9150506119c2565b5060075467ffffffffffffffff6801000000000000000090910481169084161115611ddc576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861617905560058290556040517fc7a823e000000000000000000000000000000000000000000000000000000000815285907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063c7a823e090611e8d9086908c908c906004016142ca565b60006040518083038186803b158015611ea557600080fd5b505afa158015611eb9573d6000803e3d6000fd5b505050508167ffffffffffffffff168467ffffffffffffffff1614611fc4576000611ee48386613eb6565b9050611efa67ffffffffffffffff8216836142ed565b9150611f7b7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611f3361076c565b611f3d9190614306565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613485565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6120c2337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612055573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120799190613e6e565b6120839190614306565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613559565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561212a57600080fd5b505af115801561213e573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af11580156121e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061220691906140d4565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a2505050505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146122a3576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036122af8282613fba565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516111aa9190613946565b60405180606001604052806021815260200161451a6021913981565b60085460ff16612337576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003612373576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156123af576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff6801000000000000000082048116916123ea91849170010000000000000000000000000000000090041661431d565b1115612422576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b838110156126b15760008686838181106124675761246761419e565b90506020028101906124799190614330565b6124829061436e565b90508361248e81614222565b825180516020918201208185015160408087015190519499509194506000936124f09386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612579576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff861660009081526006602052604081205561259e6001886142ed565b840361260d5742600760189054906101000a900467ffffffffffffffff1684604001516125cb91906143ec565b67ffffffffffffffff16111561260d576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806126a990614249565b91505061244b565b506126df7f000000000000000000000000000000000000000000000000000000000000000084611f3361076c565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af11580156127ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127f291906140d4565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff1661286e576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ff9190613e6e565b90508181111561293b576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612977576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129b973ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613559565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a4a9190613e6e565b600780549192506801000000000000000090910467ffffffffffffffff16906008612a7483614222565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612aab92919061440d565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612bbb576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612c1a565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612c11949392919061441d565b60405180910390a25b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612c72576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003612cae576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612cea576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b85811015613126576000898983818110612d3357612d3361419e565b9050602002810190612d45919061445d565b612d4e90614491565b8051805160209091012060608201519192509067ffffffffffffffff1615612ed15785612d7a81614222565b96505060008183602001518460600151604051602001612dd293929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114612e5b576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015612eb1576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff861660009081526006602052604081205561300e565b602082015115801590612f98575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015612f72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f969190613e6e565b155b15612fcf576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c0101561300e576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff161080613041575042826040015167ffffffffffffffff16115b15613078576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061311e90614249565b915050612d17565b5060075467ffffffffffffffff680100000000000000009091048116908416111561317d576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691909117909155600583905585908281169085161461326c5760006131d48386613eb6565b90506131ea67ffffffffffffffff8216836142ed565b91506132237f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611f3361076c565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6132fd337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612055573d6000803e3d6000fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561336557600080fd5b505af1158015613379573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af115801561341d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061344191906140d4565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112269084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526135bd565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526135b79085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016134d7565b50505050565b600061361f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166136c99092919063ffffffff16565b805190915015611226578080602001905181019061363d91906140f1565b611226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b1a565b60606136d884846000856136e0565b949350505050565b606082471015613772576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b1a565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161379b9190614507565b60006040518083038185875af1925050503d80600081146137d8576040519150601f19603f3d011682016040523d82523d6000602084013e6137dd565b606091505b50915091506137ee878383876137f9565b979650505050505050565b6060831561388f5782516000036138885773ffffffffffffffffffffffffffffffffffffffff85163b613888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b1a565b50816136d8565b6136d883838151156138a45781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1a9190613946565b60005b838110156138f35781810151838201526020016138db565b50506000910152565b600081518084526139148160208601602086016138d8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061395960208301846138fc565b9392505050565b67ffffffffffffffff8116811461397657600080fd5b50565b803573ffffffffffffffffffffffffffffffffffffffff8116811461399d57600080fd5b919050565b6000806000606084860312156139b757600080fd5b83356139c281613960565b9250602084013591506139d760408501613979565b90509250925092565b803563ffffffff8116811461399d57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715613a4657613a466139f4565b60405290565b600082601f830112613a5d57600080fd5b813567ffffffffffffffff80821115613a7857613a786139f4565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715613abe57613abe6139f4565b81604052838152866020858801011115613ad757600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a031215613b1257600080fd5b613b1b88613979565b9650613b2960208901613979565b9550613b37604089016139e0565b9450613b4560608901613979565b9350613b53608089016139e0565b925060a088013567ffffffffffffffff80821115613b7057600080fd5b613b7c8b838c01613a4c565b935060c08a0135915080821115613b9257600080fd5b50613b9f8a828b01613a4c565b91505092959891949750929550565b600060208284031215613bc057600080fd5b813561395981613960565b60008083601f840112613bdd57600080fd5b50813567ffffffffffffffff811115613bf557600080fd5b6020830191508360208260051b8501011115613c1057600080fd5b9250929050565b600080600060408486031215613c2c57600080fd5b833567ffffffffffffffff811115613c4357600080fd5b613c4f86828701613bcb565b90945092506139d7905060208501613979565b600060208284031215613c7457600080fd5b61395982613979565b600080600060608486031215613c9257600080fd5b613c9b846139e0565b9250613ca960208501613979565b91506139d7604085016139e0565b60008083601f840112613cc957600080fd5b50813567ffffffffffffffff811115613ce157600080fd5b602083019150836020828501011115613c1057600080fd5b600080600080600060608688031215613d1157600080fd5b853567ffffffffffffffff80821115613d2957600080fd5b818801915088601f830112613d3d57600080fd5b813581811115613d4c57600080fd5b8960208260071b8501011115613d6157600080fd5b60208301975080965050613d7760208901613979565b94506040880135915080821115613d8d57600080fd5b50613d9a88828901613cb7565b969995985093965092949392505050565b600060208284031215613dbd57600080fd5b813567ffffffffffffffff811115613dd457600080fd5b6136d884828501613a4c565b60008060208385031215613df357600080fd5b823567ffffffffffffffff811115613e0a57600080fd5b613e1685828601613bcb565b90969095509350505050565b600080600060408486031215613e3757600080fd5b833567ffffffffffffffff811115613e4e57600080fd5b613e5a86828701613cb7565b909790965060209590950135949350505050565b600060208284031215613e8057600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613ed757613ed7613e87565b5092915050565b600082613f14577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613f2d57607f821691505b602082108103613f66577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561122657600081815260208120601f850160051c81016020861015613f935750805b601f850160051c820191505b81811015613fb257828155600101613f9f565b505050505050565b815167ffffffffffffffff811115613fd457613fd46139f4565b613fe881613fe28454613f19565b84613f6c565b602080601f83116001811461403b57600084156140055750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613fb2565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561408857888601518255948401946001909101908401614069565b50858210156140c457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156140e657600080fd5b815161395981613960565b60006020828403121561410357600080fd5b8151801515811461395957600080fd5b600083516141258184602088016138d8565b8351908301906141398183602088016138d8565b01949350505050565b60008651614154818460208b016138d8565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000608082840312156141df57600080fd5b6141e7613a23565b8235815260208301356020820152604083013561420381613960565b6040820152606083013561421681613960565b60608201529392505050565b600067ffffffffffffffff80831681810361423f5761423f613e87565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361427a5761427a613e87565b5060010190565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8381526040602082015260006142e4604083018486614281565b95945050505050565b8181038181111561430057614300613e87565b92915050565b808202811582820484141761430057614300613e87565b8082018082111561430057614300613e87565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261436457600080fd5b9190910192915050565b60006060823603121561438057600080fd5b6040516060810167ffffffffffffffff82821081831117156143a4576143a46139f4565b8160405284359150808211156143b957600080fd5b506143c636828601613a4c565b8252506020830135602082015260408301356143e181613960565b604082015292915050565b67ffffffffffffffff818116838216019080821115613ed757613ed7613e87565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000614453606083018486614281565b9695505050505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261436457600080fd5b6000608082360312156144a357600080fd5b6144ab613a23565b823567ffffffffffffffff8111156144c257600080fd5b6144ce36828601613a4c565b8252506020830135602082015260408301356144e981613960565b604082015260608301356144fc81613960565b606082015292915050565b600082516143648184602087016138d856fef8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a264697066735822122045a2993cfa2ca76e08de8ae90432ad69a57d8cff79895c7ab562425e2ba345c864736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/paris/PolygonRollupManager.json b/compiled-contracts/paris/PolygonRollupManager.json new file mode 100644 index 000000000..297d08abf --- /dev/null +++ b/compiled-contracts/paris/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": "0x60e06040523480156200001157600080fd5b5060405162005d4638038062005d4683398101604081905262000034916200006b565b6001600160a01b0392831660805290821660c0521660a052620000bf565b6001600160a01b03811681146200006857600080fd5b50565b6000806000606084860312156200008157600080fd5b83516200008e8162000052565b6020850151909350620000a18162000052565b6040850151909250620000b48162000052565b809150509250925092565b60805160a05160c051615c1f6200012760003960008181610a0f01528181611c93015261371a0152600081816107010152818161281b01526139d801526000818161095201528181610c6601528181610e16015281816119d701526138c70152615c1f6000f3fe60806040523480156200001157600080fd5b5060043610620003095760003560e01c806391d14854116200019d578063ceee281d11620000eb578063dde0ff77116200009e578063dde0ff7714620009c0578063e0bfd3d214620009db578063e136edf714620009f2578063e46761c41462000a09578063f34eb8eb1462000a31578063f4e926751462000a48578063f9c4c2ae1462000a5957600080fd5b8063ceee281d1462000923578063d02103ca146200094c578063d5073f6f1462000974578063d547741f146200098b578063d939b31514620009a2578063dbc1697614620009b657600080fd5b8063a2967d991162000150578063a2967d9914620006f1578063a3c573eb14620006fb578063a4810bb2146200073c578063afd23cbe14620007eb578063b99d0ad71462000815578063c1acbc3414620008f1578063c4c928c2146200090c57600080fd5b806391d14854146200068257806399f5634e14620006995780639a908e7314620006a35780639c9f3dfe14620006ba578063a066215c14620006d1578063a217fddf14620006e857600080fd5b80632f2ff15d116200025b57806360469169116200020e5780636046916914620005c95780637222020f14620005d35780637975fcfe14620005ea5780637fb6e76a1462000610578063841b24d7146200063957806387c20c0114620006545780638bd4f071146200066b57600080fd5b80632f2ff15d146200052057806336568abe1462000537578063394218e9146200054e578063477fa27014620005655780634d4d3338146200056e57806355a71ee0146200058557600080fd5b806315064c9611620002c057806315064c9614620003c95780631608859c14620003d75780631796a1ae14620003ee5780631816b7e514620004155780632072f6c5146200042c578063248a9ca3146200043657806325280169146200046b57600080fd5b8063066ec012146200030e578063080b3111146200033f5780630a0d9fbe146200036757806311f6b287146200038257806312b86e1914620003995780631489ed1014620003b2575b600080fd5b60845462000322906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b62000356620003503660046200467c565b62000b70565b604051901515815260200162000336565b6085546200032290600160401b90046001600160401b031681565b6200032262000393366004620046b4565b62000b9a565b620003b0620003aa366004620046e5565b62000bba565b005b620003b0620003c336600462004792565b62000d6a565b606f54620003569060ff1681565b620003b0620003e83660046200467c565b62000f00565b607e54620003ff9063ffffffff1681565b60405163ffffffff909116815260200162000336565b620003b0620004263660046200481c565b62000f95565b620003b062001041565b6200045c6200044736600462004849565b60009081526034602052604090206001015490565b60405190815260200162000336565b620004ec6200047c3660046200467c565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b0390811691830191909152928201519092169082015260600162000336565b620003b06200053136600462004863565b620010bb565b620003b06200054836600462004863565b620010e4565b620003b06200055f36600462004896565b6200111e565b6086546200045c565b620003b06200057f366004620048b4565b620011d2565b6200045c620005963660046200467c565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b6200045c6200171f565b620003b0620005e4366004620046b4565b62001737565b62000601620005fb3660046200496a565b62001833565b60405162000336919062004a24565b620003ff6200062136600462004896565b60836020526000908152604090205463ffffffff1681565b6084546200032290600160c01b90046001600160401b031681565b620003b06200066536600462004792565b62001866565b620003b06200067c366004620046e5565b62001b90565b620003566200069336600462004863565b62001c46565b6200045c62001c71565b62000322620006b436600462004a39565b62001d58565b620003b0620006cb36600462004896565b62001f2a565b620003b0620006e236600462004896565b62001fd0565b6200045c600081565b6200045c62002074565b620007237f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200162000336565b620007a16200074d36600462004896565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c00162000336565b6085546200080190600160801b900461ffff1681565b60405161ffff909116815260200162000336565b620008ab620008263660046200467c565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b60405162000336919060006080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200032290600160801b90046001600160401b031681565b620003b06200091d36600462004a66565b62002449565b620003ff6200093436600462004afe565b60826020526000908152604090205463ffffffff1681565b620007237f000000000000000000000000000000000000000000000000000000000000000081565b620003b06200098536600462004849565b62002728565b620003b06200099c36600462004863565b620027c4565b60855462000322906001600160401b031681565b620003b0620027ed565b6084546200032290600160401b90046001600160401b031681565b620003b0620009ec36600462004b30565b6200289b565b620003b062000a0336600462004c56565b62002934565b620007237f000000000000000000000000000000000000000000000000000000000000000081565b620003b062000a4236600462004d36565b62002db9565b608054620003ff9063ffffffff1681565b62000af062000a6a366004620046b4565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff166101608201526101800162000336565b63ffffffff8216600090815260816020526040812062000b91908362002fb8565b90505b92915050565b63ffffffff8116600090815260816020526040812062000b949062002ffd565b60008051602062005bca83398151915262000bd5816200306e565b63ffffffff8916600090815260816020526040902062000bfc818a8a8a8a8a8a8a6200307a565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000c64576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000c9d62002074565b6040518263ffffffff1660e01b815260040162000cbc91815260200190565b600060405180830381600087803b15801562000cd757600080fd5b505af115801562000cec573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005bca83398151915262000d85816200306e565b63ffffffff8916600090815260816020526040902062000dac818a8a8a8a8a8a8a62003413565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562000e14576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000e4d62002074565b6040518263ffffffff1660e01b815260040162000e6c91815260200190565b600060405180830381600087803b15801562000e8757600080fd5b505af115801562000e9c573d6000803e3d6000fd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff8216600090815260816020526040902062000f3060008051602062005bca8339815191523362001c46565b62000f8457606f5460ff161562000f5a57604051630bc011ff60e21b815260040160405180910390fd5b62000f66818362002fb8565b62000f8457604051630674f25160e11b815260040160405180910390fd5b62000f908183620037e4565b505050565b60008051602062005b8a83398151915262000fb0816200306e565b6103e88261ffff16108062000fca57506103ff8261ffff16115b1562000fe957604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200105c60008051602062005baa8339815191523362001c46565b620010af576084544290620010869062093a8090600160801b90046001600160401b031662004de3565b6001600160401b03161115620010af5760405163692baaad60e11b815260040160405180910390fd5b620010b9620039d6565b565b600082815260346020526040902060010154620010d8816200306e565b62000f90838362003a55565b6001600160a01b03811633146200110e57604051630b4ad1cd60e31b815260040160405180910390fd5b6200111a828262003ac1565b5050565b60008051602062005b8a83398151915262001139816200306e565b606f5460ff166200117b576084546001600160401b03600160c01b9091048116908316106200117b5760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19060200162001035565b600054600290610100900460ff16158015620011f5575060005460ff8083169116105b6200125e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b179055620012df62003b2b565b620012fa60008051602062005bca8339815191528a62003b98565b6200130760008662003b98565b620013337fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908662003b98565b6200135f7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8662003b98565b6200138b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8662003b98565b620013b77fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8762003b98565b620013e37fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088762003b98565b6200140f7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48762003b98565b6200142a60008051602062005b8a8339815191528762003b98565b6200146560008051602062005bca8339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062003ba4565b620014917f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08762003b98565b620014bd7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8762003b98565b620014f860008051602062005baa8339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162003ba4565b6200151360008051602062005baa8339815191528562003b98565b6200153f7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518562003b98565b6000620015548484600561044d600062003bef565b6073546074549192506001600160401b03600160401b909104811691168082146200159257604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b0381811660008181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620016949695831695600160581b909104909216936076936077939192919091169060040162004eb9565b600060405180830381600087803b158015620016af57600080fd5b505af1158015620016c4573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498935060200191506200170c9050565b60405180910390a1505050505050505050565b6000608654606462001732919062004f1e565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd62001763816200306e565b63ffffffff82161580620017825750607e5463ffffffff908116908316115b15620017a157604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff1615159003620017e857604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b63ffffffff861660009081526081602052604090206060906200185b90878787878762003e14565b979650505050505050565b606f5460ff16156200188b57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a811686526003830190945291909320600101544292620018da92600160c01b90048116911662004de3565b6001600160401b031611156200190357604051638a0704d360e01b815260040160405180910390fd5b6103e862001912888862004f38565b6001600160401b031611156200193b57604051635acfba9d60e11b815260040160405180910390fd5b6200194d818989898989898962003413565b62001959818762003f54565b6085546001600160401b031660000362001a6757600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b90041615620019d5576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001a0e62002074565b6040518263ffffffff1660e01b815260040162001a2d91815260200190565b600060405180830381600087803b15801562001a4857600080fd5b505af115801562001a5d573d6000803e3d6000fd5b5050505062001b31565b62001a728162004151565b600681018054600160801b90046001600160401b031690601062001a968362004f5b565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff161562001bb557604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff8816600090815260816020526040902062001bdc81898989898989896200307a565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a162001c3b620039d6565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b815230600482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562001cdb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001d01919062004f84565b60845490915060009062001d28906001600160401b03600160401b82048116911662004f38565b6001600160401b031690508060000362001d455760009250505090565b62001d51818362004fb4565b9250505090565b606f5460009060ff161562001d8057604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362001db8576040516371653c1560e01b815260040160405180910390fd5b836001600160401b031660000362001de357604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81166000908152608160205260408120608480549192879262001e169084906001600160401b031662004de3565b82546101009290920a6001600160401b038181021990931691831602179091556006830154169050600062001e4c878362004de3565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b03199092169290931691909117179055905062001edc8362004151565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b60008051602062005b8a83398151915262001f45816200306e565b606f5460ff1662001f80576085546001600160401b039081169083161062001f805760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759060200162001035565b60008051602062005b8a83398151915262001feb816200306e565b62015180826001600160401b031611156200201957604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289060200162001035565b60805460009063ffffffff168082036200209057506000919050565b6000816001600160401b03811115620020ad57620020ad62004bac565b604051908082528060200260200182016040528015620020d7578160200160208202803683370190505b50905060005b828110156200214a5760816000620020f783600162004fcb565b63ffffffff1663ffffffff168152602001908152602001600020600501548282815181106200212a576200212a62004fe1565b602090810291909101015280620021418162004ff7565b915050620020dd565b50600060205b83600114620023a65760006200216860028662005013565b6200217560028762004fb4565b62002181919062004fcb565b90506000816001600160401b03811115620021a057620021a062004bac565b604051908082528060200260200182016040528015620021ca578160200160208202803683370190505b50905060005b828110156200235257620021e66001846200502a565b81148015620022015750620021fd60028862005013565b6001145b156200228957856200221582600262004f1e565b8151811062002228576200222862004fe1565b6020026020010151856040516020016200224c929190918252602082015260400190565b6040516020818303038152906040528051906020012082828151811062002277576200227762004fe1565b6020026020010181815250506200233d565b856200229782600262004f1e565b81518110620022aa57620022aa62004fe1565b602002602001015186826002620022c2919062004f1e565b620022cf90600162004fcb565b81518110620022e257620022e262004fe1565b602002602001015160405160200162002305929190918252602082015260400190565b6040516020818303038152906040528051906020012082828151811062002330576200233062004fe1565b6020026020010181815250505b80620023498162004ff7565b915050620021d0565b50809450819550838460405160200162002376929190918252602082015260400190565b60405160208183030381529060405280519060200120935082806200239b9062005040565b935050505062002150565b600083600081518110620023be57620023be62004fe1565b6020026020010151905060005b828110156200243f57604080516020810184905290810185905260600160408051601f19818403018152828252805160209182012090830187905290820186905292506060016040516020818303038152906040528051906020012093508080620024369062004ff7565b915050620023cb565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac62002475816200306e565b63ffffffff84161580620024945750607e5463ffffffff908116908516115b15620024b357604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff1690819003620024f4576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b0316036200254357604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff16151590036200258a57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b9092041614620025c857604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790556000620026488462000b9a565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef286926200269e9216908b908b906004016200505a565b600060405180830381600087803b158015620026b957600080fd5b505af1158015620026ce573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002754816200306e565b683635c9adc5dea000008211806200276f5750633b9aca0082105b156200278e57604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001035565b600082815260346020526040902060010154620027e1816200306e565b62000f90838362003ac1565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002819816200306e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200287557600080fd5b505af11580156200288a573d6000803e3d6000fd5b50505050620028986200421c565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e620028c7816200306e565b6001600160401b03841660009081526083602052604090205463ffffffff161562002905576040516337c8fe0960e11b815260040160405180910390fd5b600062002916888888888762003bef565b60008080526002909101602052604090209390935550505050505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd0862002960816200306e565b63ffffffff891615806200297f5750607e5463ffffffff908116908a16115b156200299e57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff89166000908152607f60205260409020600180820154600160e81b900460ff1615159003620029e557604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03891660009081526083602052604090205463ffffffff161562002a23576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062002a3e9063ffffffff166200509a565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162002a8c9062004641565b62002a9a93929190620050b6565b604051809103906000f08015801562002ab7573d6000803e3d6000fd5b50905081608360008d6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508b8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508c63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f9a84992ead4481f37097c7663e97ed883b31f216fae5685c6ee576a656483cd98e848f8d8d60405162002d3495949392919063ffffffff95861681526001600160a01b0394851660208201526001600160401b03939093166040840152921660608201529116608082015260a00190565b60405180910390a26040516308fd7e2160e31b81526001600160a01b038316906347ebf1089062002d76908e908e9088908f908f908f908f90600401620050ed565b600060405180830381600087803b15801562002d9157600080fd5b505af115801562002da6573d6000803e3d6000fd5b5050505050505050505050505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002de5816200306e565b607e805460009190829062002e009063ffffffff166200509a565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff166001600160401b0316815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002fa6969594939291906200515a565b60405180910390a25050505050505050565b6085546001600160401b0382811660009081526004850160205260408120549092429262002feb92918116911662004de3565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b03161562003051575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002898813362004275565b60078801546000906001600160401b039081169087161015620030b05760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620031515760068901546001600160401b03600160801b90910481169089161115620030fa5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200314a57604051632bd2e3e760e01b815260040160405180910390fd5b50620031c6565b506001600160401b0385166000908152600289016020526040902054806200318c576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620031c657604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620031ff5750876001600160401b0316876001600160401b031611155b8062003223575060068901546001600160401b03600160c01b909104811690881611155b15620032425760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b900481169086161462003289576040516332a2a77f60e01b815260040160405180910390fd5b60006200329b8a888888868962003e14565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620032d29190620051b3565b602060405180830381855afa158015620032f0573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003315919062004f84565b62003321919062005013565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200336591889190600401620051d1565b602060405180830381865afa15801562003383573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620033a991906200520e565b620033c7576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620034065760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620034218a62002ffd565b60078b01549091506001600160401b039081169089161015620034575760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620034fa5760068a01546001600160401b03600160801b9091048116908a161115620034a15760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620034f357604051632bd2e3e760e01b815260040160405180910390fd5b506200356a565b6001600160401b038816600090815260028b01602052604090205491508162003536576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200356a57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b0316116200359d5760405163b9b18f5760e01b815260040160405180910390fd5b6000620035af8b8a8a8a878b62003e14565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620035e69190620051b3565b602060405180830381855afa15801562003604573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003629919062004f84565b62003635919062005013565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200367991899190600401620051d1565b602060405180830381865afa15801562003697573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620036bd91906200520e565b620036db576040516309bde33960e01b815260040160405180910390fd5b6000620036e9848b62004f38565b90506200374287826001600160401b03166200370462001c71565b62003710919062004f1e565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906200429f565b80608460088282829054906101000a90046001600160401b031662003768919062004de3565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d1539060640162002d76565b60068201546001600160401b03600160c01b909104811690821611158062003823575060068201546001600160401b03600160801b9091048116908216115b15620038425760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620038fe62002074565b6040518263ffffffff1660e01b81526004016200391d91815260200190565b600060405180830381600087803b1580156200393857600080fd5b505af11580156200394d573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003a3257600080fd5b505af115801562003a47573d6000803e3d6000fd5b50505050620010b9620042f3565b62003a61828262001c46565b6200111a5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003acd828262001c46565b156200111a5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600054610100900460ff16620010b95760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162001255565b6200111a828262003a55565b600082815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080546000918291829062003c0b9063ffffffff166200509a565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000866001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508060826000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150868260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550858260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550838260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003e0294939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003e4a575081155b1562003e695760405163340c614f60e11b815260040160405180910390fd5b8062003e88576040516366385b5160e01b815260040160405180910390fd5b62003e938462004350565b62003eb1576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b600062003f618362002ffd565b90508160008062003f73848462004f38565b6085546001600160401b03918216925060009162003f9a91600160401b900416426200502a565b90505b846001600160401b0316846001600160401b03161462004024576001600160401b0380851660009081526003890160205260409020600181015490911682101562003fff576001810154600160401b90046001600160401b031694506200401d565b6200400b868662004f38565b6001600160401b031693505062004024565b5062003f9d565b60006200403284846200502a565b9050838110156200409057808403600c811162004050578062004053565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a608654028162004085576200408562004f9e565b046086555062004108565b838103600c8111620040a35780620040a6565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a76400000281620040e057620040e062004f9e565b04905080608654670de0b6b3a7640000028162004101576200410162004f9e565b0460865550505b683635c9adc5dea0000060865411156200412f57683635c9adc5dea0000060865562004147565b633b9aca0060865410156200414757633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b909204161115620028985760068101546000906200419c90600160c01b90046001600160401b0316600162004de3565b9050620041aa828262002fb8565b156200111a576006820154600090600290620041d8908490600160801b90046001600160401b031662004f38565b620041e4919062005232565b620041f0908362004de3565b9050620041fe838262002fb8565b15620042105762000f908382620037e4565b62000f908383620037e4565b606f5460ff166200424057604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b62004281828262001c46565b6200111a57604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905262000f90908490620043d6565b606f5460ff16156200431857604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b03831610801562004387575067ffffffff00000001604083901c6001600160401b0316105b8015620043a8575067ffffffff00000001608083901c6001600160401b0316105b8015620043c0575067ffffffff0000000160c083901c105b15620043ce57506001919050565b506000919050565b60006200442d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620044af9092919063ffffffff16565b80519091501562000f9057808060200190518101906200444e91906200520e565b62000f905760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162001255565b6060620044c08484600085620044c8565b949350505050565b6060824710156200452b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162001255565b600080866001600160a01b03168587604051620045499190620051b3565b60006040518083038185875af1925050503d806000811462004588576040519150601f19603f3d011682016040523d82523d6000602084013e6200458d565b606091505b50915091506200185b87838387606083156200460e57825160000362004606576001600160a01b0385163b620046065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001255565b5081620044c0565b620044c08383815115620046255781518083602001fd5b8060405162461bcd60e51b815260040162001255919062004a24565b61092e806200525c83390190565b803563ffffffff811681146200306957600080fd5b80356001600160401b03811681146200306957600080fd5b600080604083850312156200469057600080fd5b6200469b836200464f565b9150620046ab6020840162004664565b90509250929050565b600060208284031215620046c757600080fd5b62000b91826200464f565b80610300810183101562000b9457600080fd5b6000806000806000806000806103e0898b0312156200470357600080fd5b6200470e896200464f565b97506200471e60208a0162004664565b96506200472e60408a0162004664565b95506200473e60608a0162004664565b94506200474e60808a0162004664565b935060a0890135925060c089013591506200476d8a60e08b01620046d2565b90509295985092959890939650565b6001600160a01b03811681146200289857600080fd5b6000806000806000806000806103e0898b031215620047b057600080fd5b620047bb896200464f565b9750620047cb60208a0162004664565b9650620047db60408a0162004664565b9550620047eb60608a0162004664565b94506080890135935060a0890135925060c08901356200480b816200477c565b91506200476d8a60e08b01620046d2565b6000602082840312156200482f57600080fd5b813561ffff811681146200484257600080fd5b9392505050565b6000602082840312156200485c57600080fd5b5035919050565b600080604083850312156200487757600080fd5b8235915060208301356200488b816200477c565b809150509250929050565b600060208284031215620048a957600080fd5b62000b918262004664565b600080600080600080600080610100898b031215620048d257600080fd5b8835620048df816200477c565b9750620048ef60208a0162004664565b9650620048ff60408a0162004664565b9550606089013562004911816200477c565b9450608089013562004923816200477c565b935060a089013562004935816200477c565b925060c089013562004947816200477c565b915060e089013562004959816200477c565b809150509295985092959890939650565b60008060008060008060c087890312156200498457600080fd5b6200498f876200464f565b95506200499f6020880162004664565b9450620049af6040880162004664565b9350606087013592506080870135915060a087013590509295509295509295565b60005b83811015620049ed578181015183820152602001620049d3565b50506000910152565b6000815180845262004a10816020860160208601620049d0565b601f01601f19169290920160200192915050565b60208152600062000b916020830184620049f6565b6000806040838503121562004a4d57600080fd5b62004a588362004664565b946020939093013593505050565b6000806000806060858703121562004a7d57600080fd5b843562004a8a816200477c565b935062004a9a602086016200464f565b925060408501356001600160401b038082111562004ab757600080fd5b818701915087601f83011262004acc57600080fd5b81358181111562004adc57600080fd5b88602082850101111562004aef57600080fd5b95989497505060200194505050565b60006020828403121562004b1157600080fd5b813562004842816200477c565b803560ff811681146200306957600080fd5b60008060008060008060c0878903121562004b4a57600080fd5b863562004b57816200477c565b9550602087013562004b69816200477c565b945062004b796040880162004664565b935062004b896060880162004664565b92506080870135915062004ba060a0880162004b1e565b90509295509295509295565b634e487b7160e01b600052604160045260246000fd5b600082601f83011262004bd457600080fd5b81356001600160401b038082111562004bf15762004bf162004bac565b604051601f8301601f19908116603f0116810190828211818310171562004c1c5762004c1c62004bac565b8160405283815286602085880101111562004c3657600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600080610100898b03121562004c7457600080fd5b62004c7f896200464f565b975062004c8f60208a0162004664565b9650604089013562004ca1816200477c565b9550606089013562004cb3816200477c565b9450608089013562004cc5816200477c565b935062004cd560a08a016200464f565b925060c08901356001600160401b038082111562004cf257600080fd5b62004d008c838d0162004bc2565b935060e08b013591508082111562004d1757600080fd5b5062004d268b828c0162004bc2565b9150509295985092959890939650565b60008060008060008060c0878903121562004d5057600080fd5b863562004d5d816200477c565b9550602087013562004d6f816200477c565b945062004d7f6040880162004664565b935062004d8f6060880162004b1e565b92506080870135915060a08701356001600160401b0381111562004db257600080fd5b62004dc089828a0162004bc2565b9150509295509295509295565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004e065762004e0662004dcd565b5092915050565b8054600090600181811c908083168062004e2857607f831692505b6020808410820362004e4a57634e487b7160e01b600052602260045260246000fd5b8388526020880182801562004e68576001811462004e7f5762004eac565b60ff198716825285151560051b8201975062004eac565b60008981526020902060005b8781101562004ea65781548482015290860190840162004e8b565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c06040820181905260009062004ee79083018762004e0d565b828103606084015262004efb818762004e0d565b9150508360808301526001600160401b03831660a0830152979650505050505050565b808202811582820484141762000b945762000b9462004dcd565b6001600160401b0382811682821603908082111562004e065762004e0662004dcd565b60006001600160401b0380831681810362004f7a5762004f7a62004dcd565b6001019392505050565b60006020828403121562004f9757600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b60008262004fc65762004fc662004f9e565b500490565b8082018082111562000b945762000b9462004dcd565b634e487b7160e01b600052603260045260246000fd5b6000600182016200500c576200500c62004dcd565b5060010190565b60008262005025576200502562004f9e565b500690565b8181038181111562000b945762000b9462004dcd565b60008162005052576200505262004dcd565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b600063ffffffff80831681810362004f7a5762004f7a62004dcd565b6001600160a01b03848116825283166020820152606060408201819052600090620050e490830184620049f6565b95945050505050565b6001600160a01b038881168252878116602083015263ffffffff878116604084015290861660608301528416608082015260e060a082018190526000906200513890830185620049f6565b82810360c08401526200514c8185620049f6565b9a9950505050505050505050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a08201819052600090620051a790830184620049f6565b98975050505050505050565b60008251620051c7818460208701620049d0565b9190910192915050565b61032081016103008085843782018360005b600181101562005204578151835260209283019290910190600101620051e3565b5050509392505050565b6000602082840312156200522157600080fd5b815180151581146200484257600080fd5b60006001600160401b03808416806200524f576200524f62004f9e565b9216919091049291505056fe60a06040526040516200092e3803806200092e833981016040819052620000269162000383565b828162000034828262000060565b50506001600160a01b038216608052620000576200005160805190565b620000c6565b50505062000481565b6200006b8262000138565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115620000b857620000b38282620001b8565b505050565b620000c262000235565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620001086000805160206200090e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001358162000257565b50565b806001600160a01b03163b6000036200017457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b031684604051620001d7919062000463565b600060405180830381855af49150503d806000811462000214576040519150601f19603f3d011682016040523d82523d6000602084013e62000219565b606091505b5090925090506200022c8583836200029a565b95945050505050565b3415620002555760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166200028357604051633173bdd160e11b8152600060048201526024016200016b565b806000805160206200090e83398151915262000197565b606082620002b357620002ad8262000300565b620002f9565b8151158015620002cb57506001600160a01b0384163b155b15620002f657604051639996b31560e01b81526001600160a01b03851660048201526024016200016b565b50805b9392505050565b805115620003115780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b03811681146200034257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200037a57818101518382015260200162000360565b50506000910152565b6000806000606084860312156200039957600080fd5b620003a4846200032a565b9250620003b4602085016200032a565b60408501519092506001600160401b0380821115620003d257600080fd5b818601915086601f830112620003e757600080fd5b815181811115620003fc57620003fc62000347565b604051601f8201601f19908116603f0116810190838211818310171562000427576200042762000347565b816040528281528960208487010111156200044157600080fd5b620004548360208301602088016200035d565b80955050505050509250925092565b60008251620004778184602087016200035d565b9190910192915050565b6080516104726200049c6000396000601001526104726000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100e5565b60008061008e36600481846102fd565b81019061009b919061033d565b915091506100a98282610109565b5050565b60006100e07f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610104573d6000f35b3d6000fd5b61011282610164565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561015c5761015782826101e0565b505050565b6100a9610256565b806001600160a01b03163b60000361019f57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101fd919061040d565b600060405180830381855af49150503d8060008114610238576040519150601f19603f3d011682016040523d82523d6000602084013e61023d565b606091505b509150915061024d858383610275565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b60608261028a57610285826102d4565b6102cd565b81511580156102a157506001600160a01b0384163b155b156102ca57604051639996b31560e01b81526001600160a01b0385166004820152602401610196565b50805b9392505050565b8051156102e45780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6000808585111561030d57600080fd5b8386111561031a57600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035057600080fd5b82356001600160a01b038116811461036757600080fd5b9150602083013567ffffffffffffffff8082111561038457600080fd5b818501915085601f83011261039857600080fd5b8135818111156103aa576103aa610327565b604051601f8201601f19908116603f011681019083821181831017156103d2576103d2610327565b816040528281528860208487010111156103eb57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000825160005b8181101561042e5760208186018101518583015201610414565b50600092019182525091905056fea2646970667358221220d51c6fc430c553d1da2391464fd71dbfa43dc91a9531c4d842a3289bb581301664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220f5ac7cd2c2bce84174660f9e38a04abba5f38d6b7992b6159a363918c4e4e4a664736f6c63430008140033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620003095760003560e01c806391d14854116200019d578063ceee281d11620000eb578063dde0ff77116200009e578063dde0ff7714620009c0578063e0bfd3d214620009db578063e136edf714620009f2578063e46761c41462000a09578063f34eb8eb1462000a31578063f4e926751462000a48578063f9c4c2ae1462000a5957600080fd5b8063ceee281d1462000923578063d02103ca146200094c578063d5073f6f1462000974578063d547741f146200098b578063d939b31514620009a2578063dbc1697614620009b657600080fd5b8063a2967d991162000150578063a2967d9914620006f1578063a3c573eb14620006fb578063a4810bb2146200073c578063afd23cbe14620007eb578063b99d0ad71462000815578063c1acbc3414620008f1578063c4c928c2146200090c57600080fd5b806391d14854146200068257806399f5634e14620006995780639a908e7314620006a35780639c9f3dfe14620006ba578063a066215c14620006d1578063a217fddf14620006e857600080fd5b80632f2ff15d116200025b57806360469169116200020e5780636046916914620005c95780637222020f14620005d35780637975fcfe14620005ea5780637fb6e76a1462000610578063841b24d7146200063957806387c20c0114620006545780638bd4f071146200066b57600080fd5b80632f2ff15d146200052057806336568abe1462000537578063394218e9146200054e578063477fa27014620005655780634d4d3338146200056e57806355a71ee0146200058557600080fd5b806315064c9611620002c057806315064c9614620003c95780631608859c14620003d75780631796a1ae14620003ee5780631816b7e514620004155780632072f6c5146200042c578063248a9ca3146200043657806325280169146200046b57600080fd5b8063066ec012146200030e578063080b3111146200033f5780630a0d9fbe146200036757806311f6b287146200038257806312b86e1914620003995780631489ed1014620003b2575b600080fd5b60845462000322906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b62000356620003503660046200467c565b62000b70565b604051901515815260200162000336565b6085546200032290600160401b90046001600160401b031681565b6200032262000393366004620046b4565b62000b9a565b620003b0620003aa366004620046e5565b62000bba565b005b620003b0620003c336600462004792565b62000d6a565b606f54620003569060ff1681565b620003b0620003e83660046200467c565b62000f00565b607e54620003ff9063ffffffff1681565b60405163ffffffff909116815260200162000336565b620003b0620004263660046200481c565b62000f95565b620003b062001041565b6200045c6200044736600462004849565b60009081526034602052604090206001015490565b60405190815260200162000336565b620004ec6200047c3660046200467c565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b0390811691830191909152928201519092169082015260600162000336565b620003b06200053136600462004863565b620010bb565b620003b06200054836600462004863565b620010e4565b620003b06200055f36600462004896565b6200111e565b6086546200045c565b620003b06200057f366004620048b4565b620011d2565b6200045c620005963660046200467c565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b6200045c6200171f565b620003b0620005e4366004620046b4565b62001737565b62000601620005fb3660046200496a565b62001833565b60405162000336919062004a24565b620003ff6200062136600462004896565b60836020526000908152604090205463ffffffff1681565b6084546200032290600160c01b90046001600160401b031681565b620003b06200066536600462004792565b62001866565b620003b06200067c366004620046e5565b62001b90565b620003566200069336600462004863565b62001c46565b6200045c62001c71565b62000322620006b436600462004a39565b62001d58565b620003b0620006cb36600462004896565b62001f2a565b620003b0620006e236600462004896565b62001fd0565b6200045c600081565b6200045c62002074565b620007237f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200162000336565b620007a16200074d36600462004896565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c00162000336565b6085546200080190600160801b900461ffff1681565b60405161ffff909116815260200162000336565b620008ab620008263660046200467c565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b60405162000336919060006080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200032290600160801b90046001600160401b031681565b620003b06200091d36600462004a66565b62002449565b620003ff6200093436600462004afe565b60826020526000908152604090205463ffffffff1681565b620007237f000000000000000000000000000000000000000000000000000000000000000081565b620003b06200098536600462004849565b62002728565b620003b06200099c36600462004863565b620027c4565b60855462000322906001600160401b031681565b620003b0620027ed565b6084546200032290600160401b90046001600160401b031681565b620003b0620009ec36600462004b30565b6200289b565b620003b062000a0336600462004c56565b62002934565b620007237f000000000000000000000000000000000000000000000000000000000000000081565b620003b062000a4236600462004d36565b62002db9565b608054620003ff9063ffffffff1681565b62000af062000a6a366004620046b4565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff166101608201526101800162000336565b63ffffffff8216600090815260816020526040812062000b91908362002fb8565b90505b92915050565b63ffffffff8116600090815260816020526040812062000b949062002ffd565b60008051602062005bca83398151915262000bd5816200306e565b63ffffffff8916600090815260816020526040902062000bfc818a8a8a8a8a8a8a6200307a565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000c64576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000c9d62002074565b6040518263ffffffff1660e01b815260040162000cbc91815260200190565b600060405180830381600087803b15801562000cd757600080fd5b505af115801562000cec573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005bca83398151915262000d85816200306e565b63ffffffff8916600090815260816020526040902062000dac818a8a8a8a8a8a8a62003413565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562000e14576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000e4d62002074565b6040518263ffffffff1660e01b815260040162000e6c91815260200190565b600060405180830381600087803b15801562000e8757600080fd5b505af115801562000e9c573d6000803e3d6000fd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff8216600090815260816020526040902062000f3060008051602062005bca8339815191523362001c46565b62000f8457606f5460ff161562000f5a57604051630bc011ff60e21b815260040160405180910390fd5b62000f66818362002fb8565b62000f8457604051630674f25160e11b815260040160405180910390fd5b62000f908183620037e4565b505050565b60008051602062005b8a83398151915262000fb0816200306e565b6103e88261ffff16108062000fca57506103ff8261ffff16115b1562000fe957604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200105c60008051602062005baa8339815191523362001c46565b620010af576084544290620010869062093a8090600160801b90046001600160401b031662004de3565b6001600160401b03161115620010af5760405163692baaad60e11b815260040160405180910390fd5b620010b9620039d6565b565b600082815260346020526040902060010154620010d8816200306e565b62000f90838362003a55565b6001600160a01b03811633146200110e57604051630b4ad1cd60e31b815260040160405180910390fd5b6200111a828262003ac1565b5050565b60008051602062005b8a83398151915262001139816200306e565b606f5460ff166200117b576084546001600160401b03600160c01b9091048116908316106200117b5760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19060200162001035565b600054600290610100900460ff16158015620011f5575060005460ff8083169116105b6200125e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b179055620012df62003b2b565b620012fa60008051602062005bca8339815191528a62003b98565b6200130760008662003b98565b620013337fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908662003b98565b6200135f7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8662003b98565b6200138b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8662003b98565b620013b77fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8762003b98565b620013e37fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088762003b98565b6200140f7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48762003b98565b6200142a60008051602062005b8a8339815191528762003b98565b6200146560008051602062005bca8339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062003ba4565b620014917f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08762003b98565b620014bd7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8762003b98565b620014f860008051602062005baa8339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162003ba4565b6200151360008051602062005baa8339815191528562003b98565b6200153f7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518562003b98565b6000620015548484600561044d600062003bef565b6073546074549192506001600160401b03600160401b909104811691168082146200159257604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b0381811660008181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620016949695831695600160581b909104909216936076936077939192919091169060040162004eb9565b600060405180830381600087803b158015620016af57600080fd5b505af1158015620016c4573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498935060200191506200170c9050565b60405180910390a1505050505050505050565b6000608654606462001732919062004f1e565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd62001763816200306e565b63ffffffff82161580620017825750607e5463ffffffff908116908316115b15620017a157604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff1615159003620017e857604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b63ffffffff861660009081526081602052604090206060906200185b90878787878762003e14565b979650505050505050565b606f5460ff16156200188b57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a811686526003830190945291909320600101544292620018da92600160c01b90048116911662004de3565b6001600160401b031611156200190357604051638a0704d360e01b815260040160405180910390fd5b6103e862001912888862004f38565b6001600160401b031611156200193b57604051635acfba9d60e11b815260040160405180910390fd5b6200194d818989898989898962003413565b62001959818762003f54565b6085546001600160401b031660000362001a6757600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b90041615620019d5576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001a0e62002074565b6040518263ffffffff1660e01b815260040162001a2d91815260200190565b600060405180830381600087803b15801562001a4857600080fd5b505af115801562001a5d573d6000803e3d6000fd5b5050505062001b31565b62001a728162004151565b600681018054600160801b90046001600160401b031690601062001a968362004f5b565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff161562001bb557604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff8816600090815260816020526040902062001bdc81898989898989896200307a565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a162001c3b620039d6565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b815230600482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562001cdb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001d01919062004f84565b60845490915060009062001d28906001600160401b03600160401b82048116911662004f38565b6001600160401b031690508060000362001d455760009250505090565b62001d51818362004fb4565b9250505090565b606f5460009060ff161562001d8057604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362001db8576040516371653c1560e01b815260040160405180910390fd5b836001600160401b031660000362001de357604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81166000908152608160205260408120608480549192879262001e169084906001600160401b031662004de3565b82546101009290920a6001600160401b038181021990931691831602179091556006830154169050600062001e4c878362004de3565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b03199092169290931691909117179055905062001edc8362004151565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b60008051602062005b8a83398151915262001f45816200306e565b606f5460ff1662001f80576085546001600160401b039081169083161062001f805760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759060200162001035565b60008051602062005b8a83398151915262001feb816200306e565b62015180826001600160401b031611156200201957604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289060200162001035565b60805460009063ffffffff168082036200209057506000919050565b6000816001600160401b03811115620020ad57620020ad62004bac565b604051908082528060200260200182016040528015620020d7578160200160208202803683370190505b50905060005b828110156200214a5760816000620020f783600162004fcb565b63ffffffff1663ffffffff168152602001908152602001600020600501548282815181106200212a576200212a62004fe1565b602090810291909101015280620021418162004ff7565b915050620020dd565b50600060205b83600114620023a65760006200216860028662005013565b6200217560028762004fb4565b62002181919062004fcb565b90506000816001600160401b03811115620021a057620021a062004bac565b604051908082528060200260200182016040528015620021ca578160200160208202803683370190505b50905060005b828110156200235257620021e66001846200502a565b81148015620022015750620021fd60028862005013565b6001145b156200228957856200221582600262004f1e565b8151811062002228576200222862004fe1565b6020026020010151856040516020016200224c929190918252602082015260400190565b6040516020818303038152906040528051906020012082828151811062002277576200227762004fe1565b6020026020010181815250506200233d565b856200229782600262004f1e565b81518110620022aa57620022aa62004fe1565b602002602001015186826002620022c2919062004f1e565b620022cf90600162004fcb565b81518110620022e257620022e262004fe1565b602002602001015160405160200162002305929190918252602082015260400190565b6040516020818303038152906040528051906020012082828151811062002330576200233062004fe1565b6020026020010181815250505b80620023498162004ff7565b915050620021d0565b50809450819550838460405160200162002376929190918252602082015260400190565b60405160208183030381529060405280519060200120935082806200239b9062005040565b935050505062002150565b600083600081518110620023be57620023be62004fe1565b6020026020010151905060005b828110156200243f57604080516020810184905290810185905260600160408051601f19818403018152828252805160209182012090830187905290820186905292506060016040516020818303038152906040528051906020012093508080620024369062004ff7565b915050620023cb565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac62002475816200306e565b63ffffffff84161580620024945750607e5463ffffffff908116908516115b15620024b357604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff1690819003620024f4576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b0316036200254357604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff16151590036200258a57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b9092041614620025c857604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790556000620026488462000b9a565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef286926200269e9216908b908b906004016200505a565b600060405180830381600087803b158015620026b957600080fd5b505af1158015620026ce573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002754816200306e565b683635c9adc5dea000008211806200276f5750633b9aca0082105b156200278e57604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001035565b600082815260346020526040902060010154620027e1816200306e565b62000f90838362003ac1565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002819816200306e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200287557600080fd5b505af11580156200288a573d6000803e3d6000fd5b50505050620028986200421c565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e620028c7816200306e565b6001600160401b03841660009081526083602052604090205463ffffffff161562002905576040516337c8fe0960e11b815260040160405180910390fd5b600062002916888888888762003bef565b60008080526002909101602052604090209390935550505050505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd0862002960816200306e565b63ffffffff891615806200297f5750607e5463ffffffff908116908a16115b156200299e57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff89166000908152607f60205260409020600180820154600160e81b900460ff1615159003620029e557604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03891660009081526083602052604090205463ffffffff161562002a23576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062002a3e9063ffffffff166200509a565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162002a8c9062004641565b62002a9a93929190620050b6565b604051809103906000f08015801562002ab7573d6000803e3d6000fd5b50905081608360008d6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508b8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508c63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f9a84992ead4481f37097c7663e97ed883b31f216fae5685c6ee576a656483cd98e848f8d8d60405162002d3495949392919063ffffffff95861681526001600160a01b0394851660208201526001600160401b03939093166040840152921660608201529116608082015260a00190565b60405180910390a26040516308fd7e2160e31b81526001600160a01b038316906347ebf1089062002d76908e908e9088908f908f908f908f90600401620050ed565b600060405180830381600087803b15801562002d9157600080fd5b505af115801562002da6573d6000803e3d6000fd5b5050505050505050505050505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002de5816200306e565b607e805460009190829062002e009063ffffffff166200509a565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff166001600160401b0316815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002fa6969594939291906200515a565b60405180910390a25050505050505050565b6085546001600160401b0382811660009081526004850160205260408120549092429262002feb92918116911662004de3565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b03161562003051575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002898813362004275565b60078801546000906001600160401b039081169087161015620030b05760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620031515760068901546001600160401b03600160801b90910481169089161115620030fa5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200314a57604051632bd2e3e760e01b815260040160405180910390fd5b50620031c6565b506001600160401b0385166000908152600289016020526040902054806200318c576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620031c657604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620031ff5750876001600160401b0316876001600160401b031611155b8062003223575060068901546001600160401b03600160c01b909104811690881611155b15620032425760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b900481169086161462003289576040516332a2a77f60e01b815260040160405180910390fd5b60006200329b8a888888868962003e14565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620032d29190620051b3565b602060405180830381855afa158015620032f0573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003315919062004f84565b62003321919062005013565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200336591889190600401620051d1565b602060405180830381865afa15801562003383573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620033a991906200520e565b620033c7576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620034065760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620034218a62002ffd565b60078b01549091506001600160401b039081169089161015620034575760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620034fa5760068a01546001600160401b03600160801b9091048116908a161115620034a15760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620034f357604051632bd2e3e760e01b815260040160405180910390fd5b506200356a565b6001600160401b038816600090815260028b01602052604090205491508162003536576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200356a57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b0316116200359d5760405163b9b18f5760e01b815260040160405180910390fd5b6000620035af8b8a8a8a878b62003e14565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620035e69190620051b3565b602060405180830381855afa15801562003604573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003629919062004f84565b62003635919062005013565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200367991899190600401620051d1565b602060405180830381865afa15801562003697573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620036bd91906200520e565b620036db576040516309bde33960e01b815260040160405180910390fd5b6000620036e9848b62004f38565b90506200374287826001600160401b03166200370462001c71565b62003710919062004f1e565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906200429f565b80608460088282829054906101000a90046001600160401b031662003768919062004de3565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d1539060640162002d76565b60068201546001600160401b03600160c01b909104811690821611158062003823575060068201546001600160401b03600160801b9091048116908216115b15620038425760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620038fe62002074565b6040518263ffffffff1660e01b81526004016200391d91815260200190565b600060405180830381600087803b1580156200393857600080fd5b505af11580156200394d573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003a3257600080fd5b505af115801562003a47573d6000803e3d6000fd5b50505050620010b9620042f3565b62003a61828262001c46565b6200111a5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003acd828262001c46565b156200111a5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600054610100900460ff16620010b95760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162001255565b6200111a828262003a55565b600082815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080546000918291829062003c0b9063ffffffff166200509a565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000866001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508060826000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150868260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550858260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550838260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003e0294939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003e4a575081155b1562003e695760405163340c614f60e11b815260040160405180910390fd5b8062003e88576040516366385b5160e01b815260040160405180910390fd5b62003e938462004350565b62003eb1576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b600062003f618362002ffd565b90508160008062003f73848462004f38565b6085546001600160401b03918216925060009162003f9a91600160401b900416426200502a565b90505b846001600160401b0316846001600160401b03161462004024576001600160401b0380851660009081526003890160205260409020600181015490911682101562003fff576001810154600160401b90046001600160401b031694506200401d565b6200400b868662004f38565b6001600160401b031693505062004024565b5062003f9d565b60006200403284846200502a565b9050838110156200409057808403600c811162004050578062004053565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a608654028162004085576200408562004f9e565b046086555062004108565b838103600c8111620040a35780620040a6565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a76400000281620040e057620040e062004f9e565b04905080608654670de0b6b3a7640000028162004101576200410162004f9e565b0460865550505b683635c9adc5dea0000060865411156200412f57683635c9adc5dea0000060865562004147565b633b9aca0060865410156200414757633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b909204161115620028985760068101546000906200419c90600160c01b90046001600160401b0316600162004de3565b9050620041aa828262002fb8565b156200111a576006820154600090600290620041d8908490600160801b90046001600160401b031662004f38565b620041e4919062005232565b620041f0908362004de3565b9050620041fe838262002fb8565b15620042105762000f908382620037e4565b62000f908383620037e4565b606f5460ff166200424057604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b62004281828262001c46565b6200111a57604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905262000f90908490620043d6565b606f5460ff16156200431857604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b03831610801562004387575067ffffffff00000001604083901c6001600160401b0316105b8015620043a8575067ffffffff00000001608083901c6001600160401b0316105b8015620043c0575067ffffffff0000000160c083901c105b15620043ce57506001919050565b506000919050565b60006200442d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620044af9092919063ffffffff16565b80519091501562000f9057808060200190518101906200444e91906200520e565b62000f905760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162001255565b6060620044c08484600085620044c8565b949350505050565b6060824710156200452b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162001255565b600080866001600160a01b03168587604051620045499190620051b3565b60006040518083038185875af1925050503d806000811462004588576040519150601f19603f3d011682016040523d82523d6000602084013e6200458d565b606091505b50915091506200185b87838387606083156200460e57825160000362004606576001600160a01b0385163b620046065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001255565b5081620044c0565b620044c08383815115620046255781518083602001fd5b8060405162461bcd60e51b815260040162001255919062004a24565b61092e806200525c83390190565b803563ffffffff811681146200306957600080fd5b80356001600160401b03811681146200306957600080fd5b600080604083850312156200469057600080fd5b6200469b836200464f565b9150620046ab6020840162004664565b90509250929050565b600060208284031215620046c757600080fd5b62000b91826200464f565b80610300810183101562000b9457600080fd5b6000806000806000806000806103e0898b0312156200470357600080fd5b6200470e896200464f565b97506200471e60208a0162004664565b96506200472e60408a0162004664565b95506200473e60608a0162004664565b94506200474e60808a0162004664565b935060a0890135925060c089013591506200476d8a60e08b01620046d2565b90509295985092959890939650565b6001600160a01b03811681146200289857600080fd5b6000806000806000806000806103e0898b031215620047b057600080fd5b620047bb896200464f565b9750620047cb60208a0162004664565b9650620047db60408a0162004664565b9550620047eb60608a0162004664565b94506080890135935060a0890135925060c08901356200480b816200477c565b91506200476d8a60e08b01620046d2565b6000602082840312156200482f57600080fd5b813561ffff811681146200484257600080fd5b9392505050565b6000602082840312156200485c57600080fd5b5035919050565b600080604083850312156200487757600080fd5b8235915060208301356200488b816200477c565b809150509250929050565b600060208284031215620048a957600080fd5b62000b918262004664565b600080600080600080600080610100898b031215620048d257600080fd5b8835620048df816200477c565b9750620048ef60208a0162004664565b9650620048ff60408a0162004664565b9550606089013562004911816200477c565b9450608089013562004923816200477c565b935060a089013562004935816200477c565b925060c089013562004947816200477c565b915060e089013562004959816200477c565b809150509295985092959890939650565b60008060008060008060c087890312156200498457600080fd5b6200498f876200464f565b95506200499f6020880162004664565b9450620049af6040880162004664565b9350606087013592506080870135915060a087013590509295509295509295565b60005b83811015620049ed578181015183820152602001620049d3565b50506000910152565b6000815180845262004a10816020860160208601620049d0565b601f01601f19169290920160200192915050565b60208152600062000b916020830184620049f6565b6000806040838503121562004a4d57600080fd5b62004a588362004664565b946020939093013593505050565b6000806000806060858703121562004a7d57600080fd5b843562004a8a816200477c565b935062004a9a602086016200464f565b925060408501356001600160401b038082111562004ab757600080fd5b818701915087601f83011262004acc57600080fd5b81358181111562004adc57600080fd5b88602082850101111562004aef57600080fd5b95989497505060200194505050565b60006020828403121562004b1157600080fd5b813562004842816200477c565b803560ff811681146200306957600080fd5b60008060008060008060c0878903121562004b4a57600080fd5b863562004b57816200477c565b9550602087013562004b69816200477c565b945062004b796040880162004664565b935062004b896060880162004664565b92506080870135915062004ba060a0880162004b1e565b90509295509295509295565b634e487b7160e01b600052604160045260246000fd5b600082601f83011262004bd457600080fd5b81356001600160401b038082111562004bf15762004bf162004bac565b604051601f8301601f19908116603f0116810190828211818310171562004c1c5762004c1c62004bac565b8160405283815286602085880101111562004c3657600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600080610100898b03121562004c7457600080fd5b62004c7f896200464f565b975062004c8f60208a0162004664565b9650604089013562004ca1816200477c565b9550606089013562004cb3816200477c565b9450608089013562004cc5816200477c565b935062004cd560a08a016200464f565b925060c08901356001600160401b038082111562004cf257600080fd5b62004d008c838d0162004bc2565b935060e08b013591508082111562004d1757600080fd5b5062004d268b828c0162004bc2565b9150509295985092959890939650565b60008060008060008060c0878903121562004d5057600080fd5b863562004d5d816200477c565b9550602087013562004d6f816200477c565b945062004d7f6040880162004664565b935062004d8f6060880162004b1e565b92506080870135915060a08701356001600160401b0381111562004db257600080fd5b62004dc089828a0162004bc2565b9150509295509295509295565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004e065762004e0662004dcd565b5092915050565b8054600090600181811c908083168062004e2857607f831692505b6020808410820362004e4a57634e487b7160e01b600052602260045260246000fd5b8388526020880182801562004e68576001811462004e7f5762004eac565b60ff198716825285151560051b8201975062004eac565b60008981526020902060005b8781101562004ea65781548482015290860190840162004e8b565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c06040820181905260009062004ee79083018762004e0d565b828103606084015262004efb818762004e0d565b9150508360808301526001600160401b03831660a0830152979650505050505050565b808202811582820484141762000b945762000b9462004dcd565b6001600160401b0382811682821603908082111562004e065762004e0662004dcd565b60006001600160401b0380831681810362004f7a5762004f7a62004dcd565b6001019392505050565b60006020828403121562004f9757600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b60008262004fc65762004fc662004f9e565b500490565b8082018082111562000b945762000b9462004dcd565b634e487b7160e01b600052603260045260246000fd5b6000600182016200500c576200500c62004dcd565b5060010190565b60008262005025576200502562004f9e565b500690565b8181038181111562000b945762000b9462004dcd565b60008162005052576200505262004dcd565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b600063ffffffff80831681810362004f7a5762004f7a62004dcd565b6001600160a01b03848116825283166020820152606060408201819052600090620050e490830184620049f6565b95945050505050565b6001600160a01b038881168252878116602083015263ffffffff878116604084015290861660608301528416608082015260e060a082018190526000906200513890830185620049f6565b82810360c08401526200514c8185620049f6565b9a9950505050505050505050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a08201819052600090620051a790830184620049f6565b98975050505050505050565b60008251620051c7818460208701620049d0565b9190910192915050565b61032081016103008085843782018360005b600181101562005204578151835260209283019290910190600101620051e3565b5050509392505050565b6000602082840312156200522157600080fd5b815180151581146200484257600080fd5b60006001600160401b03808416806200524f576200524f62004f9e565b9216919091049291505056fe60a06040526040516200092e3803806200092e833981016040819052620000269162000383565b828162000034828262000060565b50506001600160a01b038216608052620000576200005160805190565b620000c6565b50505062000481565b6200006b8262000138565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115620000b857620000b38282620001b8565b505050565b620000c262000235565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620001086000805160206200090e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001358162000257565b50565b806001600160a01b03163b6000036200017457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b031684604051620001d7919062000463565b600060405180830381855af49150503d806000811462000214576040519150601f19603f3d011682016040523d82523d6000602084013e62000219565b606091505b5090925090506200022c8583836200029a565b95945050505050565b3415620002555760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166200028357604051633173bdd160e11b8152600060048201526024016200016b565b806000805160206200090e83398151915262000197565b606082620002b357620002ad8262000300565b620002f9565b8151158015620002cb57506001600160a01b0384163b155b15620002f657604051639996b31560e01b81526001600160a01b03851660048201526024016200016b565b50805b9392505050565b805115620003115780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b03811681146200034257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200037a57818101518382015260200162000360565b50506000910152565b6000806000606084860312156200039957600080fd5b620003a4846200032a565b9250620003b4602085016200032a565b60408501519092506001600160401b0380821115620003d257600080fd5b818601915086601f830112620003e757600080fd5b815181811115620003fc57620003fc62000347565b604051601f8201601f19908116603f0116810190838211818310171562000427576200042762000347565b816040528281528960208487010111156200044157600080fd5b620004548360208301602088016200035d565b80955050505050509250925092565b60008251620004778184602087016200035d565b9190910192915050565b6080516104726200049c6000396000601001526104726000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100e5565b60008061008e36600481846102fd565b81019061009b919061033d565b915091506100a98282610109565b5050565b60006100e07f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610104573d6000f35b3d6000fd5b61011282610164565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561015c5761015782826101e0565b505050565b6100a9610256565b806001600160a01b03163b60000361019f57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101fd919061040d565b600060405180830381855af49150503d8060008114610238576040519150601f19603f3d011682016040523d82523d6000602084013e61023d565b606091505b509150915061024d858383610275565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b60608261028a57610285826102d4565b6102cd565b81511580156102a157506001600160a01b0384163b155b156102ca57604051639996b31560e01b81526001600160a01b0385166004820152602401610196565b50805b9392505050565b8051156102e45780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6000808585111561030d57600080fd5b8386111561031a57600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035057600080fd5b82356001600160a01b038116811461036757600080fd5b9150602083013567ffffffffffffffff8082111561038457600080fd5b818501915085601f83011261039857600080fd5b8135818111156103aa576103aa610327565b604051601f8201601f19908116603f011681019083821181831017156103d2576103d2610327565b816040528281528860208487010111156103eb57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000825160005b8181101561042e5760208186018101518583015201610414565b50600092019182525091905056fea2646970667358221220d51c6fc430c553d1da2391464fd71dbfa43dc91a9531c4d842a3289bb581301664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220f5ac7cd2c2bce84174660f9e38a04abba5f38d6b7992b6159a363918c4e4e4a664736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/paris/PolygonZkEVM.json b/compiled-contracts/paris/PolygonZkEVM.json new file mode 100644 index 000000000..98e418fb3 --- /dev/null +++ b/compiled-contracts/paris/PolygonZkEVM.json @@ -0,0 +1,1718 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonZkEVM", + "sourceName": "contracts/PolygonZkEVM.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRoot", + "name": "_globalExitRootManager", + "type": "address" + }, + { + "internalType": "contract IERC20Upgradeable", + "name": "_matic", + "type": "address" + }, + { + "internalType": "contract IVerifierRollup", + "name": "_rollupVerifier", + "type": "address" + }, + { + "internalType": "contract IPolygonZkEVMBridge", + "name": "_bridgeAddress", + "type": "address" + }, + { + "internalType": "uint64", + "name": "_chainID", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "_forkID", + "type": "uint64" + } + ], + "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": "GlobalExitRootNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "HaltTimeoutNotExpired", + "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": "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": "OldAccInputHashDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "OldStateRootDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyAdmin", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyEmergencyState", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyNotEmergencyState", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyPendingAdmin", + "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": "numBatch", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "stateRoot", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint64", + "name": "pendingStateNum", + "type": "uint64" + } + ], + "name": "ConsolidatePendingState", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "EmergencyStateActivated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "EmergencyStateDeactivated", + "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" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "stateRoot", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "aggregator", + "type": "address" + } + ], + "name": "OverridePendingState", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "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": "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": "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": "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": "uint64", + "name": "newVerifyBatchTimeTarget", + "type": "uint64" + } + ], + "name": "SetVerifyBatchTimeTarget", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newPendingAdmin", + "type": "address" + } + ], + "name": "TransferAdminRole", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "numBatch", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "forkID", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "string", + "name": "version", + "type": "string" + } + ], + "name": "UpdateZkEVMVersion", + "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" + }, + { + "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": "VerifyBatchesTrustedAggregator", + "type": "event" + }, + { + "inputs": [], + "name": "acceptAdminRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "sequencedBatchNum", + "type": "uint64" + } + ], + "name": "activateEmergencyState", + "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": "batchFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "name": "batchNumToStateRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "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": [], + "name": "chainID", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newStateRoot", + "type": "uint256" + } + ], + "name": "checkStateRootInsidePrime", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "pendingStateNum", + "type": "uint64" + } + ], + "name": "consolidatePendingState", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "deactivateEmergencyState", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "maticAmount", + "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": "forkID", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getForcedBatchFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "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": [], + "name": "getLastVerifiedBatch", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalExitRootManager", + "outputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRoot", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "admin", + "type": "address" + }, + { + "internalType": "address", + "name": "trustedSequencer", + "type": "address" + }, + { + "internalType": "uint64", + "name": "pendingStateTimeout", + "type": "uint64" + }, + { + "internalType": "address", + "name": "trustedAggregator", + "type": "address" + }, + { + "internalType": "uint64", + "name": "trustedAggregatorTimeout", + "type": "uint64" + } + ], + "internalType": "struct PolygonZkEVM.InitializePackedParameters", + "name": "initializePackedParameters", + "type": "tuple" + }, + { + "internalType": "bytes32", + "name": "genesisRoot", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "_trustedSequencerURL", + "type": "string" + }, + { + "internalType": "string", + "name": "_networkName", + "type": "string" + }, + { + "internalType": "string", + "name": "_version", + "type": "string" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "isEmergencyState", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isForcedBatchDisallowed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "pendingStateNum", + "type": "uint64" + } + ], + "name": "isPendingStateConsolidable", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastBatchSequenced", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "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": "lastPendingState", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastPendingStateConsolidated", + "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": "lastVerifiedBatch", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "matic", + "outputs": [ + { + "internalType": "contract IERC20Upgradeable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "multiplierBatchFee", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "networkName", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "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": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingAdmin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingStateTimeout", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "pendingStateTransitions", + "outputs": [ + { + "internalType": "uint64", + "name": "timestamp", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "lastVerifiedBatch", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "exitRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "stateRoot", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "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": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "rollupVerifier", + "outputs": [ + { + "internalType": "contract IVerifierRollup", + "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 PolygonZkEVM.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 PolygonZkEVM.ForcedBatchData[]", + "name": "batches", + "type": "tuple[]" + } + ], + "name": "sequenceForceBatches", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "name": "sequencedBatches", + "outputs": [ + { + "internalType": "bytes32", + "name": "accInputHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "sequencedTimestamp", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "previousLastBatchSequenced", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "newforceBatchTimeout", + "type": "uint64" + } + ], + "name": "setForceBatchTimeout", + "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": "address", + "name": "newTrustedAggregator", + "type": "address" + } + ], + "name": "setTrustedAggregator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "newTrustedAggregatorTimeout", + "type": "uint64" + } + ], + "name": "setTrustedAggregatorTimeout", + "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": "uint64", + "name": "newVerifyBatchTimeTarget", + "type": "uint64" + } + ], + "name": "setVerifyBatchTimeTarget", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newPendingAdmin", + "type": "address" + } + ], + "name": "transferAdminRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "trustedAggregator", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "trustedAggregatorTimeout", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "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" + }, + { + "inputs": [], + "name": "verifyBatchTimeTarget", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "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": "bytes32[24]", + "name": "proof", + "type": "bytes32[24]" + } + ], + "name": "verifyBatches", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "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": "bytes32[24]", + "name": "proof", + "type": "bytes32[24]" + } + ], + "name": "verifyBatchesTrustedAggregator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101406040523480156200001257600080fd5b5060405162006078380380620060788339810160408190526200003591620000a5565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b0391821661010052166101205262000131565b6001600160a01b03811681146200008557600080fd5b50565b80516001600160401b0381168114620000a057600080fd5b919050565b60008060008060008060c08789031215620000bf57600080fd5b8651620000cc816200006f565b6020880151909650620000df816200006f565b6040880151909550620000f2816200006f565b606088015190945062000105816200006f565b9250620001156080880162000088565b91506200012560a0880162000088565b90509295509295509295565b60805160a05160c05160e0516101005161012051615e79620001ff6000396000818161069601528181610dec01526131760152600081816108030152610dc20152600081816107c901528181611d910152818161380f0152614c8f01526000818161096f01528181610f5f01528181611130015281816119990152818161216a015281816139f70152614759015260008181610a1c015281816140b4015261450c0152600081816108bf01528181611d5f0152818161265b015281816139cb01526141a20152615e796000f3fe608060405234801561001057600080fd5b50600436106103ba5760003560e01c8063841b24d7116101f4578063c754c7ed1161011a578063e7a7ed02116100ad578063f14916d61161007c578063f14916d614610a7e578063f2fde38b14610a91578063f851a44014610aa4578063f8b823e414610ac457600080fd5b8063e7a7ed02146109e7578063e8bf92ed14610a17578063eaeb077b14610a3e578063ed6b010414610a5157600080fd5b8063d2e129f9116100e9578063d2e129f914610991578063d8d1091b146109a4578063d939b315146109b7578063dbc16976146109df57600080fd5b8063c754c7ed146108fc578063c89e42df14610928578063cfa8ed471461093b578063d02103ca1461096a57600080fd5b8063a3c573eb11610192578063b4d63f5811610161578063b4d63f5814610853578063b6b0b097146108ba578063ba58ae39146108e1578063c0ed84e0146108f457600080fd5b8063a3c573eb146107c4578063ada8f919146107eb578063adc879e9146107fe578063afd23cbe1461082557600080fd5b806399f5634e116101ce57806399f5634e146107835780639aa972a31461078b5780639c9f3dfe1461079e578063a066215c146107b157600080fd5b8063841b24d71461072d5780638c3d73011461075d5780638da5cb5b1461076557600080fd5b80634a1a89a7116102e4578063621dd411116102775780637215541a116102465780637215541a1461066a5780637fcb36531461067d578063831c7ead14610691578063837a4738146106b857600080fd5b8063621dd4111461061c5780636b8616ce1461062f5780636ff512cc1461064f578063715018a61461066257600080fd5b8063542028d5116102b3578063542028d5146105f15780635e9145c9146105f95780635ec919581461060c578063604691691461061457600080fd5b80634a1a89a71461057d5780634a910e6a1461059d5780634e487706146105b05780635392c5e0146105c357600080fd5b8063298789831161035c578063394218e91161032b578063394218e91461050e578063423fa856146105215780634560526714610541578063458c04771461056957600080fd5b806329878983146104a95780632b0006fa146104d55780632c1f816a146104e8578063383b3be8146104fb57600080fd5b80631816b7e5116103985780631816b7e51461042857806319d8ac611461043d578063220d789914610451578063267822471461046457600080fd5b80630a0d9fbe146103bf578063107bf28c146103f657806315064c961461040b575b600080fd5b606f546103d890610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6103fe610acd565b6040516103ed91906152bb565b606f546104189060ff1681565b60405190151581526020016103ed565b61043b6104363660046152d5565b610b5b565b005b6073546103d89067ffffffffffffffff1681565b6103fe61045f366004615311565b610c73565b607b546104849073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103ed565b6074546104849068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61043b6104e3366004615376565b610e4a565b61043b6104f63660046153de565b61101a565b610418610509366004615458565b611228565b61043b61051c366004615458565b61127e565b6073546103d89068010000000000000000900467ffffffffffffffff1681565b6073546103d890700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546103d89067ffffffffffffffff1681565b6079546103d89068010000000000000000900467ffffffffffffffff1681565b61043b6105ab366004615458565b611402565b61043b6105be366004615458565b6114b5565b6105e36105d1366004615458565b60756020526000908152604090205481565b6040519081526020016103ed565b6103fe611639565b61043b6106073660046154e3565b611646565b61043b611e50565b6105e3611f50565b61043b61062a366004615376565b611f66565b6105e361063d366004615458565b60716020526000908152604090205481565b61043b61065d366004615537565b6122ee565b61043b6123c3565b61043b610678366004615458565b6123d7565b6074546103d89067ffffffffffffffff1681565b6103d87f000000000000000000000000000000000000000000000000000000000000000081565b6107016106c6366004615552565b60786020526000908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016103ed565b6079546103d8907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61043b612547565b60335473ffffffffffffffffffffffffffffffffffffffff16610484565b6105e3612613565b61043b6107993660046153de565b61276c565b61043b6107ac366004615458565b61281d565b61043b6107bf366004615458565b612999565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b61043b6107f9366004615537565b612a9f565b6103d87f000000000000000000000000000000000000000000000000000000000000000081565b606f54610840906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103ed565b610894610861366004615458565b6072602052600090815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016103ed565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b6104186108ef366004615552565b612b63565b6103d8612bed565b607b546103d89074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b61043b610936366004615645565b612c42565b606f54610484906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b61043b61099f3660046156bc565b612ccf565b61043b6109b236600461576f565b61321a565b6079546103d890700100000000000000000000000000000000900467ffffffffffffffff1681565b61043b6137bc565b6073546103d8907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b61043b610a4c3660046157b1565b613895565b607b54610418907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b61043b610a8c366004615537565b613c8b565b61043b610a9f366004615537565b613d5d565b607a546104849073ffffffffffffffffffffffffffffffffffffffff1681565b6105e360705481565b60778054610ada906157fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610b06906157fd565b8015610b535780601f10610b2857610100808354040283529160200191610b53565b820191906000526020600020905b815481529060010190602001808311610b3657829003601f168201915b505050505081565b607a5473ffffffffffffffffffffffffffffffffffffffff163314610bac576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff161080610bc557506103ff8161ffff16115b15610bfc576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086166000818152607260205260408082205493881682529020546060929115801590610ca7575081155b15610cde576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610d15576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d1e84612b63565b610d54576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610ea7576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610eb5868686868686613e11565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615610f3057607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015610fb857600080fd5b505af1158015610fcc573d6000803e3d6000fd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611077576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611086878787878787876141d5565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092556000908152607560205260409020839055607954161561110157607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b15801561118957600080fd5b505af115801561119d573d6000803e3d6000fd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281166000908152607860205260408120549092429261126c927001000000000000000000000000000000009092048116911661587f565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146112cf576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611316576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166113855760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611385576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610c68565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146114a957606f5460ff161561146a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61147381611228565b6114a9576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114b28161460f565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611506576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561154d576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166115b857607b5467ffffffffffffffff740100000000000000000000000000000000000000009091048116908216106115b8576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001610c68565b60768054610ada906157fd565b606f5460ff1615611683576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146116e3576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600081900361171f576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561175b576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000082048116600081815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b86811015611bab5760008a8a838181106117c3576117c36158a7565b90506020028101906117d591906158d6565b6117de90615914565b8051805160209091012060608201519192509067ffffffffffffffff1615611956578561180a816159a1565b9650506000818360200151846060015160405160200161186293929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a166000908152607190935291205490915081146118eb576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088166000908152607160205260408082209190915560608501519085015190821691161015611950576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611a93565b602082015115801590611a1d575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af11580156119f7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1b91906159c8565b155b15611a54576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611a93576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080611ac6575042826040015167ffffffffffffffff16115b15611afd576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151975050508080611ba3906159e1565b9150506117a7565b50611bb6868561587f565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115611c1f576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611c2b8285615a19565b611c3f9067ffffffffffffffff1688615a3a565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d861660008181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611d3557607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611d87333083607054611d489190615a4d565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190614822565b611d8f614904565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611df757600080fd5b505af1158015611e0b573d6000803e3d6000fd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611ea1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16611efd576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60006070546064611f619190615a4d565b905090565b606f5460ff1615611fa3576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581166000908152607260205260409020600101544292611ff09278010000000000000000000000000000000000000000000000009091048116911661587f565b67ffffffffffffffff161115612032576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e861203f8686615a19565b67ffffffffffffffff161115612081576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61208f868686868686613e11565b612098846149b5565b607954700100000000000000000000000000000000900467ffffffffffffffff166000036121e057607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092556000908152607560205260409020839055607954161561213b57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b1580156121c357600080fd5b505af11580156121d7573d6000803e3d6000fd5b505050506122b0565b6121e8614904565b6079805467ffffffffffffffff16906000612202836159a1565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487166000908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59669060200161100a565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461233f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c68565b6123cb614b95565b6123d56000614c16565b565b60335473ffffffffffffffffffffffffffffffffffffffff16331461253f576000612400612bed565b90508067ffffffffffffffff168267ffffffffffffffff161161244f576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000090910481169083161180612495575067ffffffffffffffff80831660009081526072602052604090206001015416155b156124cc576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff80831660009081526072602052604090206001015442916124fb9162093a80911661587f565b67ffffffffffffffff16111561253d576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6114b2614c8d565b607b5473ffffffffffffffffffffffffffffffffffffffff163314612598576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156126a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c691906159c8565b905060006126d2612bed565b60735467ffffffffffffffff68010000000000000000820481169161272a9170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416615a19565b612734919061587f565b61273e9190615a19565b67ffffffffffffffff1690508060000361275b5760009250505090565b6127658183615a93565b9250505090565b606f5460ff16156127a9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127b8878787878787876141d5565b67ffffffffffffffff84166000908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1612814614c8d565b50505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461286e576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156128b5576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661291c5760795467ffffffffffffffff70010000000000000000000000000000000090910481169082161061291c576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610c68565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146129ea576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff161115612a31576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001610c68565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612af0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c68565b600067ffffffff0000000167ffffffffffffffff8316108015612b9b575067ffffffff00000001604083901c67ffffffffffffffff16105b8015612bbc575067ffffffff00000001608083901c67ffffffffffffffff16105b8015612bd3575067ffffffff0000000160c083901c105b15612be057506001919050565b506000919050565b919050565b60795460009067ffffffffffffffff1615612c31575060795467ffffffffffffffff9081166000908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612c93576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6076612c9f8282615af5565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c6891906152bb565b600054610100900460ff1615808015612cef5750600054600160ff909116105b80612d095750303b158015612d09575060005460ff166001145b612d9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612df857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b612e056020880188615537565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612e5a6040880160208901615537565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055612ebf6080880160608901615537565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790556000805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076612f4a8682615af5565b506077612f578582615af5565b5062093a80612f6c6060890160408a01615458565b67ffffffffffffffff161115612fae576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fbe6060880160408901615458565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a8061302060a0890160808a01615458565b67ffffffffffffffff161115613062576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61307260a0880160808901615458565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613151614d15565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd660007f000000000000000000000000000000000000000000000000000000000000000085856040516131a79493929190615c58565b60405180910390a1801561281457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613277576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16156132b4576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036132f0576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561332c576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff78010000000000000000000000000000000000000000000000008204811691613377918491700100000000000000000000000000000000900416615c90565b11156133af576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000008204811660008181526072602052604081205491937001000000000000000000000000000000009004909216915b8481101561365957600087878381811061340f5761340f6158a7565b90506020028101906134219190615ca3565b61342a90615cd7565b905083613436816159a1565b825180516020918201208185015160408087015190519499509194506000936134989386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260719093529120549091508114613521576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260716020526040812055613546600189615a3a565b84036135b55742607b60149054906101000a900467ffffffffffffffff168460400151613573919061587f565b67ffffffffffffffff1611156135b5576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080613651906159e1565b9150506133f3565b50613664848461587f565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589166000818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461380d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561387557600080fd5b505af1158015613889573d6000803e3d6000fd5b505050506123d5614db5565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16156138f2576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff161561392f576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613939611f50565b905081811115613975576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113888311156139b1576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6139f373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084614822565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a8491906159c8565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16906018613abe836159a1565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051613af5929190615d53565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1660009081526071909352912055323303613c2557607354604080518381523360208201526060918101829052600091810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613c84565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613c7b9493929190615d63565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613cdc576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610c68565b613d65614b95565b73ffffffffffffffffffffffffffffffffffffffff8116613e08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401612d91565b6114b281614c16565b600080613e1c612bed565b905067ffffffffffffffff881615613eec5760795467ffffffffffffffff9081169089161115613e78576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089166000908152607860205260409020600281015481549094509091898116680100000000000000009092041614613ee6576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50613f8d565b67ffffffffffffffff8716600090815260756020526040902054915081613f3f576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115613f8d576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611613fda576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613fe98888888689610c73565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161401e9190615d99565b602060405180830381855afa15801561403b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061405e91906159c8565b6140689190615dab565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916140ea91899190600401615dbf565b602060405180830381865afa158015614107573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061412b9190615dfa565b614161576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6141c93361416f858b615a19565b67ffffffffffffffff16614181612613565b61418b9190615a4d565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190614e44565b50505050505050505050565b600067ffffffffffffffff8816156142a35760795467ffffffffffffffff9081169089161115614231576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff808816600090815260786020526040902060028101548154909288811668010000000000000000909204161461429d576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061433f565b5067ffffffffffffffff8516600090815260756020526040902054806142f5576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff908116908716111561433f576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff908116908816118061437157508767ffffffffffffffff168767ffffffffffffffff1611155b80614398575060795467ffffffffffffffff68010000000000000000909104811690881611155b156143cf576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff878116600090815260786020526040902054680100000000000000009004811690861614614432576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006144418787878588610c73565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516144769190615d99565b602060405180830381855afa158015614493573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906144b691906159c8565b6144c09190615dab565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161454291889190600401615dbf565b602060405180830381865afa15801561455f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145839190615dfa565b6145b9576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89166000908152607860205260409020600201548590036141c9576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff680100000000000000009091048116908216111580614649575060795467ffffffffffffffff908116908216115b15614680576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff818116600081815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b1580156147b257600080fd5b505af11580156147c6573d6000803e3d6000fd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161481591815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526148fe9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614e9f565b50505050565b60795467ffffffffffffffff6801000000000000000082048116911611156123d55760795460009061494d9068010000000000000000900467ffffffffffffffff16600161587f565b905061495881611228565b156114b25760795460009060029061497b90849067ffffffffffffffff16615a19565b6149859190615e1c565b61498f908361587f565b905061499a81611228565b156149ac576149a88161460f565b5050565b6149a88261460f565b60006149bf612bed565b9050816000806149cf8484615a19565b606f5467ffffffffffffffff91821692506000916149f39161010090041642615a3a565b90505b8467ffffffffffffffff168467ffffffffffffffff1614614a7e5767ffffffffffffffff80851660009081526072602052604090206001810154909116821015614a5c57600181015468010000000000000000900467ffffffffffffffff169450614a78565b614a668686615a19565b67ffffffffffffffff16935050614a7e565b506149f6565b6000614a8a8484615a3a565b905083811015614ae157808403600c8111614aa55780614aa8565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281614ad757614ad7615a64565b0460705550614b51565b838103600c8111614af25780614af5565b600c5b90506000816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a76400000281614b2c57614b2c615a64565b04905080607054670de0b6b3a76400000281614b4a57614b4a615a64565b0460705550505b683635c9adc5dea000006070541115614b7657683635c9adc5dea00000607055612814565b633b9aca00607054101561281457633b9aca0060705550505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146123d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612d91565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b158015614cf557600080fd5b505af1158015614d09573d6000803e3d6000fd5b505050506123d5614fab565b600054610100900460ff16614dac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401612d91565b6123d533614c16565b606f5460ff16614df1576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052614e9a9084907fa9059cbb000000000000000000000000000000000000000000000000000000009060640161487c565b505050565b6000614f01826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661503e9092919063ffffffff16565b805190915015614e9a5780806020019051810190614f1f9190615dfa565b614e9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401612d91565b606f5460ff1615614fe8576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b606061504d8484600085615055565b949350505050565b6060824710156150e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401612d91565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516151109190615d99565b60006040518083038185875af1925050503d806000811461514d576040519150601f19603f3d011682016040523d82523d6000602084013e615152565b606091505b50915091506151638783838761516e565b979650505050505050565b606083156152045782516000036151fd5773ffffffffffffffffffffffffffffffffffffffff85163b6151fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612d91565b508161504d565b61504d83838151156152195781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9191906152bb565b60005b83811015615268578181015183820152602001615250565b50506000910152565b6000815180845261528981602086016020860161524d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006152ce6020830184615271565b9392505050565b6000602082840312156152e757600080fd5b813561ffff811681146152ce57600080fd5b803567ffffffffffffffff81168114612be857600080fd5b600080600080600060a0868803121561532957600080fd5b615332866152f9565b9450615340602087016152f9565b94979496505050506040830135926060810135926080909101359150565b80610300810183101561537057600080fd5b92915050565b6000806000806000806103a0878903121561539057600080fd5b615399876152f9565b95506153a7602088016152f9565b94506153b5604088016152f9565b935060608701359250608087013591506153d28860a0890161535e565b90509295509295509295565b60008060008060008060006103c0888a0312156153fa57600080fd5b615403886152f9565b9650615411602089016152f9565b955061541f604089016152f9565b945061542d606089016152f9565b93506080880135925060a0880135915061544a8960c08a0161535e565b905092959891949750929550565b60006020828403121561546a57600080fd5b6152ce826152f9565b60008083601f84011261548557600080fd5b50813567ffffffffffffffff81111561549d57600080fd5b6020830191508360208260051b85010111156154b857600080fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612be857600080fd5b6000806000604084860312156154f857600080fd5b833567ffffffffffffffff81111561550f57600080fd5b61551b86828701615473565b909450925061552e9050602085016154bf565b90509250925092565b60006020828403121561554957600080fd5b6152ce826154bf565b60006020828403121561556457600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126155ab57600080fd5b813567ffffffffffffffff808211156155c6576155c661556b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561560c5761560c61556b565b8160405283815286602085880101111561562557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561565757600080fd5b813567ffffffffffffffff81111561566e57600080fd5b61504d8482850161559a565b60008083601f84011261568c57600080fd5b50813567ffffffffffffffff8111156156a457600080fd5b6020830191508360208285010111156154b857600080fd5b6000806000806000808688036101208112156156d757600080fd5b60a08112156156e557600080fd5b5086955060a0870135945060c087013567ffffffffffffffff8082111561570b57600080fd5b6157178a838b0161559a565b955060e089013591508082111561572d57600080fd5b6157398a838b0161559a565b945061010089013591508082111561575057600080fd5b5061575d89828a0161567a565b979a9699509497509295939492505050565b6000806020838503121561578257600080fd5b823567ffffffffffffffff81111561579957600080fd5b6157a585828601615473565b90969095509350505050565b6000806000604084860312156157c657600080fd5b833567ffffffffffffffff8111156157dd57600080fd5b6157e98682870161567a565b909790965060209590950135949350505050565b600181811c9082168061581157607f821691505b60208210810361584a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8181168382160190808211156158a0576158a0615850565b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261590a57600080fd5b9190910192915050565b60006080823603121561592657600080fd5b6040516080810167ffffffffffffffff828210818311171561594a5761594a61556b565b81604052843591508082111561595f57600080fd5b5061596c3682860161559a565b82525060208301356020820152615985604084016152f9565b6040820152615996606084016152f9565b606082015292915050565b600067ffffffffffffffff8083168181036159be576159be615850565b6001019392505050565b6000602082840312156159da57600080fd5b5051919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a1257615a12615850565b5060010190565b67ffffffffffffffff8281168282160390808211156158a0576158a0615850565b8181038181111561537057615370615850565b808202811582820484141761537057615370615850565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615aa257615aa2615a64565b500490565b601f821115614e9a57600081815260208120601f850160051c81016020861015615ace5750805b601f850160051c820191505b81811015615aed57828155600101615ada565b505050505050565b815167ffffffffffffffff811115615b0f57615b0f61556b565b615b2381615b1d84546157fd565b84615aa7565b602080601f831160018114615b765760008415615b405750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555615aed565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615bc357888601518255948401946001909101908401615ba4565b5085821015615bff57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600067ffffffffffffffff808716835280861660208401525060606040830152615c86606083018486615c0f565b9695505050505050565b8082018082111561537057615370615850565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261590a57600080fd5b600060608236031215615ce957600080fd5b6040516060810167ffffffffffffffff8282108183111715615d0d57615d0d61556b565b816040528435915080821115615d2257600080fd5b50615d2f3682860161559a565b82525060208301356020820152615d48604084016152f9565b604082015292915050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000615c86606083018486615c0f565b6000825161590a81846020870161524d565b600082615dba57615dba615a64565b500690565b61032081016103008085843782018360005b6001811015615df0578151835260209283019290910190600101615dd1565b5050509392505050565b600060208284031215615e0c57600080fd5b815180151581146152ce57600080fd5b600067ffffffffffffffff80841680615e3757615e37615a64565b9216919091049291505056fea26469706673582212207c65fe318a797352428af5d61503d4af269ad89de3f139b6d4f4cab38b830bc864736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106103ba5760003560e01c8063841b24d7116101f4578063c754c7ed1161011a578063e7a7ed02116100ad578063f14916d61161007c578063f14916d614610a7e578063f2fde38b14610a91578063f851a44014610aa4578063f8b823e414610ac457600080fd5b8063e7a7ed02146109e7578063e8bf92ed14610a17578063eaeb077b14610a3e578063ed6b010414610a5157600080fd5b8063d2e129f9116100e9578063d2e129f914610991578063d8d1091b146109a4578063d939b315146109b7578063dbc16976146109df57600080fd5b8063c754c7ed146108fc578063c89e42df14610928578063cfa8ed471461093b578063d02103ca1461096a57600080fd5b8063a3c573eb11610192578063b4d63f5811610161578063b4d63f5814610853578063b6b0b097146108ba578063ba58ae39146108e1578063c0ed84e0146108f457600080fd5b8063a3c573eb146107c4578063ada8f919146107eb578063adc879e9146107fe578063afd23cbe1461082557600080fd5b806399f5634e116101ce57806399f5634e146107835780639aa972a31461078b5780639c9f3dfe1461079e578063a066215c146107b157600080fd5b8063841b24d71461072d5780638c3d73011461075d5780638da5cb5b1461076557600080fd5b80634a1a89a7116102e4578063621dd411116102775780637215541a116102465780637215541a1461066a5780637fcb36531461067d578063831c7ead14610691578063837a4738146106b857600080fd5b8063621dd4111461061c5780636b8616ce1461062f5780636ff512cc1461064f578063715018a61461066257600080fd5b8063542028d5116102b3578063542028d5146105f15780635e9145c9146105f95780635ec919581461060c578063604691691461061457600080fd5b80634a1a89a71461057d5780634a910e6a1461059d5780634e487706146105b05780635392c5e0146105c357600080fd5b8063298789831161035c578063394218e91161032b578063394218e91461050e578063423fa856146105215780634560526714610541578063458c04771461056957600080fd5b806329878983146104a95780632b0006fa146104d55780632c1f816a146104e8578063383b3be8146104fb57600080fd5b80631816b7e5116103985780631816b7e51461042857806319d8ac611461043d578063220d789914610451578063267822471461046457600080fd5b80630a0d9fbe146103bf578063107bf28c146103f657806315064c961461040b575b600080fd5b606f546103d890610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6103fe610acd565b6040516103ed91906152bb565b606f546104189060ff1681565b60405190151581526020016103ed565b61043b6104363660046152d5565b610b5b565b005b6073546103d89067ffffffffffffffff1681565b6103fe61045f366004615311565b610c73565b607b546104849073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103ed565b6074546104849068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61043b6104e3366004615376565b610e4a565b61043b6104f63660046153de565b61101a565b610418610509366004615458565b611228565b61043b61051c366004615458565b61127e565b6073546103d89068010000000000000000900467ffffffffffffffff1681565b6073546103d890700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546103d89067ffffffffffffffff1681565b6079546103d89068010000000000000000900467ffffffffffffffff1681565b61043b6105ab366004615458565b611402565b61043b6105be366004615458565b6114b5565b6105e36105d1366004615458565b60756020526000908152604090205481565b6040519081526020016103ed565b6103fe611639565b61043b6106073660046154e3565b611646565b61043b611e50565b6105e3611f50565b61043b61062a366004615376565b611f66565b6105e361063d366004615458565b60716020526000908152604090205481565b61043b61065d366004615537565b6122ee565b61043b6123c3565b61043b610678366004615458565b6123d7565b6074546103d89067ffffffffffffffff1681565b6103d87f000000000000000000000000000000000000000000000000000000000000000081565b6107016106c6366004615552565b60786020526000908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016103ed565b6079546103d8907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61043b612547565b60335473ffffffffffffffffffffffffffffffffffffffff16610484565b6105e3612613565b61043b6107993660046153de565b61276c565b61043b6107ac366004615458565b61281d565b61043b6107bf366004615458565b612999565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b61043b6107f9366004615537565b612a9f565b6103d87f000000000000000000000000000000000000000000000000000000000000000081565b606f54610840906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103ed565b610894610861366004615458565b6072602052600090815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016103ed565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b6104186108ef366004615552565b612b63565b6103d8612bed565b607b546103d89074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b61043b610936366004615645565b612c42565b606f54610484906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b61043b61099f3660046156bc565b612ccf565b61043b6109b236600461576f565b61321a565b6079546103d890700100000000000000000000000000000000900467ffffffffffffffff1681565b61043b6137bc565b6073546103d8907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b61043b610a4c3660046157b1565b613895565b607b54610418907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b61043b610a8c366004615537565b613c8b565b61043b610a9f366004615537565b613d5d565b607a546104849073ffffffffffffffffffffffffffffffffffffffff1681565b6105e360705481565b60778054610ada906157fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610b06906157fd565b8015610b535780601f10610b2857610100808354040283529160200191610b53565b820191906000526020600020905b815481529060010190602001808311610b3657829003601f168201915b505050505081565b607a5473ffffffffffffffffffffffffffffffffffffffff163314610bac576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff161080610bc557506103ff8161ffff16115b15610bfc576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086166000818152607260205260408082205493881682529020546060929115801590610ca7575081155b15610cde576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610d15576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d1e84612b63565b610d54576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610ea7576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610eb5868686868686613e11565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615610f3057607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015610fb857600080fd5b505af1158015610fcc573d6000803e3d6000fd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611077576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611086878787878787876141d5565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092556000908152607560205260409020839055607954161561110157607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b15801561118957600080fd5b505af115801561119d573d6000803e3d6000fd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281166000908152607860205260408120549092429261126c927001000000000000000000000000000000009092048116911661587f565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146112cf576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611316576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166113855760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611385576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610c68565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146114a957606f5460ff161561146a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61147381611228565b6114a9576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114b28161460f565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611506576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561154d576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166115b857607b5467ffffffffffffffff740100000000000000000000000000000000000000009091048116908216106115b8576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001610c68565b60768054610ada906157fd565b606f5460ff1615611683576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146116e3576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600081900361171f576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561175b576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000082048116600081815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b86811015611bab5760008a8a838181106117c3576117c36158a7565b90506020028101906117d591906158d6565b6117de90615914565b8051805160209091012060608201519192509067ffffffffffffffff1615611956578561180a816159a1565b9650506000818360200151846060015160405160200161186293929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a166000908152607190935291205490915081146118eb576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088166000908152607160205260408082209190915560608501519085015190821691161015611950576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611a93565b602082015115801590611a1d575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af11580156119f7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1b91906159c8565b155b15611a54576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611a93576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080611ac6575042826040015167ffffffffffffffff16115b15611afd576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151975050508080611ba3906159e1565b9150506117a7565b50611bb6868561587f565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115611c1f576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611c2b8285615a19565b611c3f9067ffffffffffffffff1688615a3a565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d861660008181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611d3557607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611d87333083607054611d489190615a4d565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190614822565b611d8f614904565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611df757600080fd5b505af1158015611e0b573d6000803e3d6000fd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611ea1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16611efd576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60006070546064611f619190615a4d565b905090565b606f5460ff1615611fa3576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581166000908152607260205260409020600101544292611ff09278010000000000000000000000000000000000000000000000009091048116911661587f565b67ffffffffffffffff161115612032576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e861203f8686615a19565b67ffffffffffffffff161115612081576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61208f868686868686613e11565b612098846149b5565b607954700100000000000000000000000000000000900467ffffffffffffffff166000036121e057607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092556000908152607560205260409020839055607954161561213b57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b1580156121c357600080fd5b505af11580156121d7573d6000803e3d6000fd5b505050506122b0565b6121e8614904565b6079805467ffffffffffffffff16906000612202836159a1565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487166000908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59669060200161100a565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461233f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c68565b6123cb614b95565b6123d56000614c16565b565b60335473ffffffffffffffffffffffffffffffffffffffff16331461253f576000612400612bed565b90508067ffffffffffffffff168267ffffffffffffffff161161244f576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000090910481169083161180612495575067ffffffffffffffff80831660009081526072602052604090206001015416155b156124cc576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff80831660009081526072602052604090206001015442916124fb9162093a80911661587f565b67ffffffffffffffff16111561253d576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6114b2614c8d565b607b5473ffffffffffffffffffffffffffffffffffffffff163314612598576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156126a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c691906159c8565b905060006126d2612bed565b60735467ffffffffffffffff68010000000000000000820481169161272a9170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416615a19565b612734919061587f565b61273e9190615a19565b67ffffffffffffffff1690508060000361275b5760009250505090565b6127658183615a93565b9250505090565b606f5460ff16156127a9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127b8878787878787876141d5565b67ffffffffffffffff84166000908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1612814614c8d565b50505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461286e576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156128b5576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661291c5760795467ffffffffffffffff70010000000000000000000000000000000090910481169082161061291c576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610c68565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146129ea576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff161115612a31576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001610c68565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612af0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c68565b600067ffffffff0000000167ffffffffffffffff8316108015612b9b575067ffffffff00000001604083901c67ffffffffffffffff16105b8015612bbc575067ffffffff00000001608083901c67ffffffffffffffff16105b8015612bd3575067ffffffff0000000160c083901c105b15612be057506001919050565b506000919050565b919050565b60795460009067ffffffffffffffff1615612c31575060795467ffffffffffffffff9081166000908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612c93576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6076612c9f8282615af5565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c6891906152bb565b600054610100900460ff1615808015612cef5750600054600160ff909116105b80612d095750303b158015612d09575060005460ff166001145b612d9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612df857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b612e056020880188615537565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612e5a6040880160208901615537565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055612ebf6080880160608901615537565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790556000805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076612f4a8682615af5565b506077612f578582615af5565b5062093a80612f6c6060890160408a01615458565b67ffffffffffffffff161115612fae576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fbe6060880160408901615458565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a8061302060a0890160808a01615458565b67ffffffffffffffff161115613062576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61307260a0880160808901615458565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613151614d15565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd660007f000000000000000000000000000000000000000000000000000000000000000085856040516131a79493929190615c58565b60405180910390a1801561281457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613277576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16156132b4576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036132f0576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561332c576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff78010000000000000000000000000000000000000000000000008204811691613377918491700100000000000000000000000000000000900416615c90565b11156133af576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000008204811660008181526072602052604081205491937001000000000000000000000000000000009004909216915b8481101561365957600087878381811061340f5761340f6158a7565b90506020028101906134219190615ca3565b61342a90615cd7565b905083613436816159a1565b825180516020918201208185015160408087015190519499509194506000936134989386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260719093529120549091508114613521576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260716020526040812055613546600189615a3a565b84036135b55742607b60149054906101000a900467ffffffffffffffff168460400151613573919061587f565b67ffffffffffffffff1611156135b5576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080613651906159e1565b9150506133f3565b50613664848461587f565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589166000818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461380d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561387557600080fd5b505af1158015613889573d6000803e3d6000fd5b505050506123d5614db5565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16156138f2576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff161561392f576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613939611f50565b905081811115613975576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113888311156139b1576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6139f373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084614822565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a8491906159c8565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16906018613abe836159a1565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051613af5929190615d53565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1660009081526071909352912055323303613c2557607354604080518381523360208201526060918101829052600091810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613c84565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613c7b9493929190615d63565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613cdc576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610c68565b613d65614b95565b73ffffffffffffffffffffffffffffffffffffffff8116613e08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401612d91565b6114b281614c16565b600080613e1c612bed565b905067ffffffffffffffff881615613eec5760795467ffffffffffffffff9081169089161115613e78576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089166000908152607860205260409020600281015481549094509091898116680100000000000000009092041614613ee6576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50613f8d565b67ffffffffffffffff8716600090815260756020526040902054915081613f3f576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115613f8d576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611613fda576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613fe98888888689610c73565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161401e9190615d99565b602060405180830381855afa15801561403b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061405e91906159c8565b6140689190615dab565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916140ea91899190600401615dbf565b602060405180830381865afa158015614107573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061412b9190615dfa565b614161576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6141c93361416f858b615a19565b67ffffffffffffffff16614181612613565b61418b9190615a4d565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190614e44565b50505050505050505050565b600067ffffffffffffffff8816156142a35760795467ffffffffffffffff9081169089161115614231576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff808816600090815260786020526040902060028101548154909288811668010000000000000000909204161461429d576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061433f565b5067ffffffffffffffff8516600090815260756020526040902054806142f5576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff908116908716111561433f576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff908116908816118061437157508767ffffffffffffffff168767ffffffffffffffff1611155b80614398575060795467ffffffffffffffff68010000000000000000909104811690881611155b156143cf576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff878116600090815260786020526040902054680100000000000000009004811690861614614432576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006144418787878588610c73565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516144769190615d99565b602060405180830381855afa158015614493573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906144b691906159c8565b6144c09190615dab565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161454291889190600401615dbf565b602060405180830381865afa15801561455f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145839190615dfa565b6145b9576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89166000908152607860205260409020600201548590036141c9576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff680100000000000000009091048116908216111580614649575060795467ffffffffffffffff908116908216115b15614680576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff818116600081815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b1580156147b257600080fd5b505af11580156147c6573d6000803e3d6000fd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161481591815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526148fe9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614e9f565b50505050565b60795467ffffffffffffffff6801000000000000000082048116911611156123d55760795460009061494d9068010000000000000000900467ffffffffffffffff16600161587f565b905061495881611228565b156114b25760795460009060029061497b90849067ffffffffffffffff16615a19565b6149859190615e1c565b61498f908361587f565b905061499a81611228565b156149ac576149a88161460f565b5050565b6149a88261460f565b60006149bf612bed565b9050816000806149cf8484615a19565b606f5467ffffffffffffffff91821692506000916149f39161010090041642615a3a565b90505b8467ffffffffffffffff168467ffffffffffffffff1614614a7e5767ffffffffffffffff80851660009081526072602052604090206001810154909116821015614a5c57600181015468010000000000000000900467ffffffffffffffff169450614a78565b614a668686615a19565b67ffffffffffffffff16935050614a7e565b506149f6565b6000614a8a8484615a3a565b905083811015614ae157808403600c8111614aa55780614aa8565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281614ad757614ad7615a64565b0460705550614b51565b838103600c8111614af25780614af5565b600c5b90506000816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a76400000281614b2c57614b2c615a64565b04905080607054670de0b6b3a76400000281614b4a57614b4a615a64565b0460705550505b683635c9adc5dea000006070541115614b7657683635c9adc5dea00000607055612814565b633b9aca00607054101561281457633b9aca0060705550505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146123d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612d91565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b158015614cf557600080fd5b505af1158015614d09573d6000803e3d6000fd5b505050506123d5614fab565b600054610100900460ff16614dac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401612d91565b6123d533614c16565b606f5460ff16614df1576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052614e9a9084907fa9059cbb000000000000000000000000000000000000000000000000000000009060640161487c565b505050565b6000614f01826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661503e9092919063ffffffff16565b805190915015614e9a5780806020019051810190614f1f9190615dfa565b614e9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401612d91565b606f5460ff1615614fe8576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b606061504d8484600085615055565b949350505050565b6060824710156150e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401612d91565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516151109190615d99565b60006040518083038185875af1925050503d806000811461514d576040519150601f19603f3d011682016040523d82523d6000602084013e615152565b606091505b50915091506151638783838761516e565b979650505050505050565b606083156152045782516000036151fd5773ffffffffffffffffffffffffffffffffffffffff85163b6151fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612d91565b508161504d565b61504d83838151156152195781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9191906152bb565b60005b83811015615268578181015183820152602001615250565b50506000910152565b6000815180845261528981602086016020860161524d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006152ce6020830184615271565b9392505050565b6000602082840312156152e757600080fd5b813561ffff811681146152ce57600080fd5b803567ffffffffffffffff81168114612be857600080fd5b600080600080600060a0868803121561532957600080fd5b615332866152f9565b9450615340602087016152f9565b94979496505050506040830135926060810135926080909101359150565b80610300810183101561537057600080fd5b92915050565b6000806000806000806103a0878903121561539057600080fd5b615399876152f9565b95506153a7602088016152f9565b94506153b5604088016152f9565b935060608701359250608087013591506153d28860a0890161535e565b90509295509295509295565b60008060008060008060006103c0888a0312156153fa57600080fd5b615403886152f9565b9650615411602089016152f9565b955061541f604089016152f9565b945061542d606089016152f9565b93506080880135925060a0880135915061544a8960c08a0161535e565b905092959891949750929550565b60006020828403121561546a57600080fd5b6152ce826152f9565b60008083601f84011261548557600080fd5b50813567ffffffffffffffff81111561549d57600080fd5b6020830191508360208260051b85010111156154b857600080fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612be857600080fd5b6000806000604084860312156154f857600080fd5b833567ffffffffffffffff81111561550f57600080fd5b61551b86828701615473565b909450925061552e9050602085016154bf565b90509250925092565b60006020828403121561554957600080fd5b6152ce826154bf565b60006020828403121561556457600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126155ab57600080fd5b813567ffffffffffffffff808211156155c6576155c661556b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561560c5761560c61556b565b8160405283815286602085880101111561562557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561565757600080fd5b813567ffffffffffffffff81111561566e57600080fd5b61504d8482850161559a565b60008083601f84011261568c57600080fd5b50813567ffffffffffffffff8111156156a457600080fd5b6020830191508360208285010111156154b857600080fd5b6000806000806000808688036101208112156156d757600080fd5b60a08112156156e557600080fd5b5086955060a0870135945060c087013567ffffffffffffffff8082111561570b57600080fd5b6157178a838b0161559a565b955060e089013591508082111561572d57600080fd5b6157398a838b0161559a565b945061010089013591508082111561575057600080fd5b5061575d89828a0161567a565b979a9699509497509295939492505050565b6000806020838503121561578257600080fd5b823567ffffffffffffffff81111561579957600080fd5b6157a585828601615473565b90969095509350505050565b6000806000604084860312156157c657600080fd5b833567ffffffffffffffff8111156157dd57600080fd5b6157e98682870161567a565b909790965060209590950135949350505050565b600181811c9082168061581157607f821691505b60208210810361584a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8181168382160190808211156158a0576158a0615850565b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261590a57600080fd5b9190910192915050565b60006080823603121561592657600080fd5b6040516080810167ffffffffffffffff828210818311171561594a5761594a61556b565b81604052843591508082111561595f57600080fd5b5061596c3682860161559a565b82525060208301356020820152615985604084016152f9565b6040820152615996606084016152f9565b606082015292915050565b600067ffffffffffffffff8083168181036159be576159be615850565b6001019392505050565b6000602082840312156159da57600080fd5b5051919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a1257615a12615850565b5060010190565b67ffffffffffffffff8281168282160390808211156158a0576158a0615850565b8181038181111561537057615370615850565b808202811582820484141761537057615370615850565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615aa257615aa2615a64565b500490565b601f821115614e9a57600081815260208120601f850160051c81016020861015615ace5750805b601f850160051c820191505b81811015615aed57828155600101615ada565b505050505050565b815167ffffffffffffffff811115615b0f57615b0f61556b565b615b2381615b1d84546157fd565b84615aa7565b602080601f831160018114615b765760008415615b405750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555615aed565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615bc357888601518255948401946001909101908401615ba4565b5085821015615bff57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600067ffffffffffffffff808716835280861660208401525060606040830152615c86606083018486615c0f565b9695505050505050565b8082018082111561537057615370615850565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261590a57600080fd5b600060608236031215615ce957600080fd5b6040516060810167ffffffffffffffff8282108183111715615d0d57615d0d61556b565b816040528435915080821115615d2257600080fd5b50615d2f3682860161559a565b82525060208301356020820152615d48604084016152f9565b604082015292915050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000615c86606083018486615c0f565b6000825161590a81846020870161524d565b600082615dba57615dba615a64565b500690565b61032081016103008085843782018360005b6001811015615df0578151835260209283019290910190600101615dd1565b5050509392505050565b600060208284031215615e0c57600080fd5b815180151581146152ce57600080fd5b600067ffffffffffffffff80841680615e3757615e37615a64565b9216919091049291505056fea26469706673582212207c65fe318a797352428af5d61503d4af269ad89de3f139b6d4f4cab38b830bc864736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/paris/PolygonZkEVMBridge.json b/compiled-contracts/paris/PolygonZkEVMBridge.json new file mode 100644 index 000000000..b10a58ab2 --- /dev/null +++ b/compiled-contracts/paris/PolygonZkEVMBridge.json @@ -0,0 +1,783 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonZkEVMBridge", + "sourceName": "contracts/PolygonZkEVMBridge.sol", + "abi": [ + { + "inputs": [], + "name": "AlreadyClaimed", + "type": "error" + }, + { + "inputs": [], + "name": "AmountDoesNotMatchMsgValue", + "type": "error" + }, + { + "inputs": [], + "name": "DestinationNetworkInvalid", + "type": "error" + }, + { + "inputs": [], + "name": "EtherTransferFailed", + "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": "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": "OnlyPolygonZkEVM", + "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": "uint32", + "name": "index", + "type": "uint32" + }, + { + "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": "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": "bytes32[32]", + "name": "smtProof", + "type": "bytes32[32]" + }, + { + "internalType": "uint32", + "name": "index", + "type": "uint32" + }, + { + "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": "smtProof", + "type": "bytes32[32]" + }, + { + "internalType": "uint32", + "name": "index", + "type": "uint32" + }, + { + "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": "getDepositRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "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": [ + { + "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": "contract IBasePolygonZkEVMGlobalExitRoot", + "name": "_globalExitRootManager", + "type": "address" + }, + { + "internalType": "address", + "name": "_polygonZkEVMaddress", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "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": "polygonZkEVMaddress", + "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": "0x608060405234801561001057600080fd5b50615c83806100206000396000f3fe6080604052600436106200019f5760003560e01c8063647c576c11620000e7578063be5831c71162000089578063dbc169761162000060578063dbc169761462000639578063ee25560b1462000651578063fb570834146200068257600080fd5b8063be5831c714620005ae578063cd58657914620005ea578063d02103ca146200060157600080fd5b80639e34070f11620000be5780639e34070f146200050a578063aaa13cc2146200054f578063bab161bf146200057457600080fd5b8063647c576c146200048657806379e2cf9714620004ab57806381b1c17414620004c357600080fd5b80632d2c9d94116200015157806334ac9cf2116200012857806334ac9cf2146200034b5780633ae05047146200037a5780633e197043146200039257600080fd5b80632d2c9d9414620002765780632dfdf0b5146200029b578063318aee3d14620002c257600080fd5b806322e95f2c116200018657806322e95f2c14620001ef578063240ff378146200023a5780632cffd02e146200025157600080fd5b806315064c9614620001a45780632072f6c514620001d5575b600080fd5b348015620001b157600080fd5b50606854620001c09060ff1681565b60405190151581526020015b60405180910390f35b348015620001e257600080fd5b50620001ed620006a7565b005b348015620001fc57600080fd5b50620002146200020e366004620032db565b62000705565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001cc565b620001ed6200024b36600462003372565b620007a8565b3480156200025e57600080fd5b50620001ed6200027036600462003409565b620009d0565b3480156200028357600080fd5b50620001ed6200029536600462003409565b62000f74565b348015620002a857600080fd5b50620002b360535481565b604051908152602001620001cc565b348015620002cf57600080fd5b5062000319620002e1366004620034ef565b606b6020526000908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001cc565b3480156200035857600080fd5b50606c54620002149073ffffffffffffffffffffffffffffffffffffffff1681565b3480156200038757600080fd5b50620002b362001178565b3480156200039f57600080fd5b50620002b3620003b136600462003526565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200049357600080fd5b50620001ed620004a5366004620035b0565b6200125e565b348015620004b857600080fd5b50620001ed620014ad565b348015620004d057600080fd5b5062000214620004e236600462003600565b606a6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200051757600080fd5b50620001c06200052936600462003600565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b3480156200055c57600080fd5b50620002146200056e3660046200361a565b620014e7565b3480156200058157600080fd5b506068546200059890610100900463ffffffff1681565b60405163ffffffff9091168152602001620001cc565b348015620005bb57600080fd5b506068546200059890790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001ed620005fb366004620036ce565b620016d3565b3480156200060e57600080fd5b50606854620002149065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200064657600080fd5b50620001ed62001c37565b3480156200065e57600080fd5b50620002b36200067036600462003600565b60696020526000908152604090205481565b3480156200068f57600080fd5b50620001c0620006a136600462003770565b62001c93565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006f9576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200070362001d7c565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091206000908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007e6576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8681166101009092041614806200080c5750600263ffffffff861610155b1562000844576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff163388883488886053546040516200089a9998979695949392919062003806565b60405180910390a1620009b8620009b26001606860019054906101000a900463ffffffff16338989348989604051620008d592919062003881565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b62001e10565b8215620009c957620009c962001f27565b5050505050565b60685460ff161562000a0e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000a258b8b8b8b8b8b8b8b8b8b8b600062001ffc565b73ffffffffffffffffffffffffffffffffffffffff861662000b01576040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a7a9190620038e6565b60006040518083038185875af1925050503d806000811462000ab9576040519150601f19603f3d011682016040523d82523d6000602084013e62000abe565b606091505b505090508062000afa576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000efc565b60685463ffffffff61010090910481169088160362000b435762000b3d73ffffffffffffffffffffffffffffffffffffffff87168585620021ed565b62000efc565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b166024820152600090603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e6e576000808062000c1886880188620039fb565b92509250925060008584848460405162000c329062003292565b62000c409392919062003abd565b8190604051809103906000f590508015801562000c61573d6000803e3d6000fd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f1990604401600060405180830381600087803b15801562000cd757600080fd5b505af115801562000cec573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e5c95949392919062003afa565b60405180910390a15050505062000ef9565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f1990604401600060405180830381600087803b15801562000edf57600080fd5b505af115801562000ef4573d6000803e3d6000fd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000fb2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000fc98b8b8b8b8b8b8b8b8b8b8b600162001ffc565b60008473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000ffc949392919062003b42565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200107f9190620038e6565b60006040518083038185875af1925050503d8060008114620010be576040519150601f19603f3d011682016040523d82523d6000602084013e620010c3565b606091505b5050905080620010ff576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b605354600090819081805b602081101562001255578083901c600116600103620011e65760338160208110620011b257620011b262003b8a565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062001213565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806200124c9062003be8565b91505062001183565b50919392505050565b600054610100900460ff16158080156200127f5750600054600160ff909116105b806200129b5750303b1580156200129b575060005460ff166001145b6200132d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200138c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001691841691909117905562001443620022c3565b8015620014a757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000703576200070362001f27565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201526000908190603801604051602081830303815290604052805190602001209050600060ff60f81b3083604051806020016200157d9062003292565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620015c8908d908d908d908d908d9060200162003c23565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001606929160200162003c64565b604051602081830303815290604052805190602001206040516020016200168f94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff161562001711576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200171b62002366565b60685463ffffffff888116610100909204161480620017415750600263ffffffff881610155b1562001779576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060608773ffffffffffffffffffffffffffffffffffffffff8816620017df57883414620017d5576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000925062001ad9565b341562001818576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089166000908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901562001908576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac90604401600060405180830381600087803b158015620018db57600080fd5b505af1158015620018f0573d6000803e3d6000fd5b50505050806020015194508060000151935062001ad7565b85156200191d576200191d898b8989620023db565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200198b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620019b1919062003c97565b9050620019d773ffffffffffffffffffffffffffffffffffffffff8b1633308e620028f9565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa15801562001a45573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a6b919062003c97565b905062001a79828262003cb1565b6068548c9850610100900463ffffffff169650935062001a998762002959565b62001aa48c62002a71565b62001aaf8d62002b7e565b60405160200162001ac39392919062003abd565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e868860535460405162001b1b98979695949392919062003cc7565b60405180910390a162001c0f620009b2600085878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b861562001c205762001c2062001f27565b5050505062001c2e60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c89576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200070362002c80565b600084815b602081101562001d6e57600163ffffffff8616821c8116900362001d0a5785816020811062001ccb5762001ccb62003b8a565b60200201358260405160200162001cec929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001d59565b8186826020811062001d205762001d2062003b8a565b602002013560405160200162001d40929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d658162003be8565b91505062001c98565b50821490505b949350505050565b60685460ff161562001dba576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b80600162001e216020600262003e79565b62001e2d919062003cb1565b6053541062001e68576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060536000815462001e7b9062003be8565b9182905550905060005b602081101562001f17578082901c60011660010362001ebd57826033826020811062001eb55762001eb562003b8a565b015550505050565b6033816020811062001ed35762001ed362003b8a565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001f0e9062003be8565b91505062001e85565b5062001f2262003e87565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001fad62001178565b6040518263ffffffff1660e01b815260040162001fcc91815260200190565b600060405180830381600087803b15801562001fe757600080fd5b505af1158015620014a7573d6000803e3d6000fd5b6200200d8b63ffffffff1662002d10565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b363200000000000000000000000000000000000000000000000000000000909252606481019190915260009165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303816000875af1158015620020b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620020d6919062003c97565b90508060000362002112576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff88811661010090920416146200215c576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606854600090610100900463ffffffff166200217a5750896200217d565b508a5b620021a66200219d848c8c8c8c8c8c8c604051620008d592919062003881565b8f8f8462001c93565b620021dd576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001f229084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002d75565b600054610100900460ff166200235c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001324565b6200070362002e88565b600260015403620023d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001324565b6002600155565b6000620023ec600482848662003eb6565b620023f79162003ee2565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620026765760008080808080806200245a896004818d62003eb6565b81019062002469919062003f2b565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614620024dd576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff861630146200252d576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002567576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620026229190620038e6565b6000604051808303816000865af19150503d806000811462002661576040519150601f19603f3d011682016040523d82523d6000602084013e62002666565b606091505b50505050505050505050620009c9565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c0000000000000000000000000000000000000000000000000000000014620026f2576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808080808080806200270a8a6004818e62003eb6565b81019062002719919062003f86565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146200278f576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87163014620027df576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f1691620028a39190620038e6565b6000604051808303816000865af19150503d8060008114620028e2576040519150601f19603f3d011682016040523d82523d6000602084013e620028e7565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014a79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002240565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691620029dd9190620038e6565b600060405180830381855afa9150503d806000811462002a1a576040519150601f19603f3d011682016040523d82523d6000602084013e62002a1f565b606091505b50915091508162002a66576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d74565b62001d748162002f21565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162002af59190620038e6565b600060405180830381855afa9150503d806000811462002b32576040519150601f19603f3d011682016040523d82523d6000602084013e62002b37565b606091505b50915091508162002a66576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d74565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169162002c019190620038e6565b600060405180830381855afa9150503d806000811462002c3e576040519150601f19603f3d011682016040523d82523d6000602084013e62002c43565b606091505b509150915081801562002c57575080516020145b62002c6457601262001d74565b8080602001905181019062001d74919062004012565b60018055565b60685460ff1662002cbd576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600881901c60008181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009c9576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600062002dd9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031119092919063ffffffff16565b80519091501562001f22578080602001905181019062002dfa919062004032565b62001f22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001324565b600054610100900460ff1662002c7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001324565b6060604082511062002f435781806020019051810190620007a2919062004052565b8151602003620030d35760005b60208110801562002f9b575082818151811062002f715762002f7162003b8a565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002fb6578062002fad8162003be8565b91505062002f50565b8060000362002ffa57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111562003018576200301862003891565b6040519080825280601f01601f19166020018201604052801562003043576020820181803683370190505b50905060005b82811015620030cb5784818151811062003067576200306762003b8a565b602001015160f81c60f81b82828151811062003087576200308762003b8a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080620030c28162003be8565b91505062003049565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d748484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051620031489190620038e6565b60006040518083038185875af1925050503d806000811462003187576040519150601f19603f3d011682016040523d82523d6000602084013e6200318c565b606091505b50915091506200319f87838387620031aa565b979650505050505050565b60608315620032455782516000036200323d5773ffffffffffffffffffffffffffffffffffffffff85163b6200323d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001324565b508162001d74565b62001d7483838151156200325c5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620013249190620040d2565b611b6680620040e883390190565b803563ffffffff811681146200310c57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620032d857600080fd5b50565b60008060408385031215620032ef57600080fd5b620032fa83620032a0565b915060208301356200330c81620032b5565b809150509250929050565b8015158114620032d857600080fd5b60008083601f8401126200333957600080fd5b50813567ffffffffffffffff8111156200335257600080fd5b6020830191508360208285010111156200336b57600080fd5b9250929050565b6000806000806000608086880312156200338b57600080fd5b6200339686620032a0565b94506020860135620033a881620032b5565b93506040860135620033ba8162003317565b9250606086013567ffffffffffffffff811115620033d757600080fd5b620033e58882890162003326565b969995985093965092949392505050565b806104008101831015620007a257600080fd5b60008060008060008060008060008060006105208c8e0312156200342c57600080fd5b620034388d8d620033f6565b9a50620034496104008d01620032a0565b99506104208c013598506104408c013597506200346a6104608d01620032a0565b96506104808c01356200347d81620032b5565b95506200348e6104a08d01620032a0565b94506104c08c0135620034a181620032b5565b93506104e08c013592506105008c013567ffffffffffffffff811115620034c757600080fd5b620034d58e828f0162003326565b915080935050809150509295989b509295989b9093969950565b6000602082840312156200350257600080fd5b81356200350f81620032b5565b9392505050565b60ff81168114620032d857600080fd5b600080600080600080600060e0888a0312156200354257600080fd5b87356200354f8162003516565b96506200355f60208901620032a0565b955060408801356200357181620032b5565b94506200358160608901620032a0565b935060808801356200359381620032b5565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215620035c657600080fd5b620035d184620032a0565b92506020840135620035e381620032b5565b91506040840135620035f581620032b5565b809150509250925092565b6000602082840312156200361357600080fd5b5035919050565b600080600080600080600060a0888a0312156200363657600080fd5b6200364188620032a0565b965060208801356200365381620032b5565b9550604088013567ffffffffffffffff808211156200367157600080fd5b6200367f8b838c0162003326565b909750955060608a01359150808211156200369957600080fd5b50620036a88a828b0162003326565b9094509250506080880135620036be8162003516565b8091505092959891949750929550565b600080600080600080600060c0888a031215620036ea57600080fd5b620036f588620032a0565b965060208801356200370781620032b5565b95506040880135945060608801356200372081620032b5565b93506080880135620037328162003317565b925060a088013567ffffffffffffffff8111156200374f57600080fd5b6200375d8a828b0162003326565b989b979a50959850939692959293505050565b60008060008061046085870312156200378857600080fd5b843593506200379b8660208701620033f6565b9250620037ac6104208601620032a0565b939692955092936104400135925050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600061010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620038678285018789620037bd565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b83811015620038dd578181015183820152602001620038c3565b50506000910152565b60008251620038fa818460208701620038c0565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156200394e576200394e62003891565b604052919050565b600067ffffffffffffffff82111562003973576200397362003891565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112620039b157600080fd5b8135620039c8620039c28262003956565b62003904565b818152846020838601011115620039de57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562003a1157600080fd5b833567ffffffffffffffff8082111562003a2a57600080fd5b62003a38878388016200399f565b9450602086013591508082111562003a4f57600080fd5b5062003a5e868287016200399f565b9250506040840135620035f58162003516565b6000815180845262003a8b816020860160208601620038c0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60608152600062003ad2606083018662003a71565b828103602084015262003ae6818662003a71565b91505060ff83166040830152949350505050565b63ffffffff86168152600073ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200319f608083018486620037bd565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff8416602082015260606040820152600062003b80606083018486620037bd565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003c1c5762003c1c62003bb9565b5060010190565b60608152600062003c39606083018789620037bd565b828103602084015262003c4e818688620037bd565b91505060ff831660408301529695505050505050565b6000835162003c78818460208801620038c0565b83519083019062003c8e818360208801620038c0565b01949350505050565b60006020828403121562003caa57600080fd5b5051919050565b81810381811115620007a257620007a262003bb9565b600061010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003d278285018762003a71565b925080851660e085015250509998505050505050505050565b600181815b8085111562003d9f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d835762003d8362003bb9565b8085161562003d9157918102915b93841c939080029062003d45565b509250929050565b60008262003db857506001620007a2565b8162003dc757506000620007a2565b816001811462003de0576002811462003deb5762003e0b565b6001915050620007a2565b60ff84111562003dff5762003dff62003bb9565b50506001821b620007a2565b5060208310610133831016604e8410600b841016171562003e30575081810a620007a2565b62003e3c838362003d40565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003e715762003e7162003bb9565b029392505050565b60006200350f838362003da7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000808585111562003ec757600080fd5b8386111562003ed557600080fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003f235780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a03121562003f4757600080fd5b873562003f5481620032b5565b9650602088013562003f6681620032b5565b955060408801359450606088013593506080880135620035938162003516565b600080600080600080600080610100898b03121562003fa457600080fd5b883562003fb181620032b5565b9750602089013562003fc381620032b5565b96506040890135955060608901359450608089013562003fe38162003317565b935060a089013562003ff58162003516565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200402557600080fd5b81516200350f8162003516565b6000602082840312156200404557600080fd5b81516200350f8162003317565b6000602082840312156200406557600080fd5b815167ffffffffffffffff8111156200407d57600080fd5b8201601f810184136200408f57600080fd5b8051620040a0620039c28262003956565b818152856020838501011115620040b657600080fd5b620040c9826020830160208601620038c0565b95945050505050565b6020815260006200350f602083018462003a7156fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212206fe049be388a1d04319b9913fe6d100c4c8e272fe0f5748eb056bd0622beabcc64736f6c63430008140033a2646970667358221220ef4412c515d53043ca441d4b33288d9aa2b101bc9853f859467ab1a42f16139c64736f6c63430008140033", + "deployedBytecode": "0x6080604052600436106200019f5760003560e01c8063647c576c11620000e7578063be5831c71162000089578063dbc169761162000060578063dbc169761462000639578063ee25560b1462000651578063fb570834146200068257600080fd5b8063be5831c714620005ae578063cd58657914620005ea578063d02103ca146200060157600080fd5b80639e34070f11620000be5780639e34070f146200050a578063aaa13cc2146200054f578063bab161bf146200057457600080fd5b8063647c576c146200048657806379e2cf9714620004ab57806381b1c17414620004c357600080fd5b80632d2c9d94116200015157806334ac9cf2116200012857806334ac9cf2146200034b5780633ae05047146200037a5780633e197043146200039257600080fd5b80632d2c9d9414620002765780632dfdf0b5146200029b578063318aee3d14620002c257600080fd5b806322e95f2c116200018657806322e95f2c14620001ef578063240ff378146200023a5780632cffd02e146200025157600080fd5b806315064c9614620001a45780632072f6c514620001d5575b600080fd5b348015620001b157600080fd5b50606854620001c09060ff1681565b60405190151581526020015b60405180910390f35b348015620001e257600080fd5b50620001ed620006a7565b005b348015620001fc57600080fd5b50620002146200020e366004620032db565b62000705565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001cc565b620001ed6200024b36600462003372565b620007a8565b3480156200025e57600080fd5b50620001ed6200027036600462003409565b620009d0565b3480156200028357600080fd5b50620001ed6200029536600462003409565b62000f74565b348015620002a857600080fd5b50620002b360535481565b604051908152602001620001cc565b348015620002cf57600080fd5b5062000319620002e1366004620034ef565b606b6020526000908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001cc565b3480156200035857600080fd5b50606c54620002149073ffffffffffffffffffffffffffffffffffffffff1681565b3480156200038757600080fd5b50620002b362001178565b3480156200039f57600080fd5b50620002b3620003b136600462003526565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200049357600080fd5b50620001ed620004a5366004620035b0565b6200125e565b348015620004b857600080fd5b50620001ed620014ad565b348015620004d057600080fd5b5062000214620004e236600462003600565b606a6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200051757600080fd5b50620001c06200052936600462003600565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b3480156200055c57600080fd5b50620002146200056e3660046200361a565b620014e7565b3480156200058157600080fd5b506068546200059890610100900463ffffffff1681565b60405163ffffffff9091168152602001620001cc565b348015620005bb57600080fd5b506068546200059890790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001ed620005fb366004620036ce565b620016d3565b3480156200060e57600080fd5b50606854620002149065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200064657600080fd5b50620001ed62001c37565b3480156200065e57600080fd5b50620002b36200067036600462003600565b60696020526000908152604090205481565b3480156200068f57600080fd5b50620001c0620006a136600462003770565b62001c93565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006f9576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200070362001d7c565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091206000908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007e6576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8681166101009092041614806200080c5750600263ffffffff861610155b1562000844576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff163388883488886053546040516200089a9998979695949392919062003806565b60405180910390a1620009b8620009b26001606860019054906101000a900463ffffffff16338989348989604051620008d592919062003881565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b62001e10565b8215620009c957620009c962001f27565b5050505050565b60685460ff161562000a0e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000a258b8b8b8b8b8b8b8b8b8b8b600062001ffc565b73ffffffffffffffffffffffffffffffffffffffff861662000b01576040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a7a9190620038e6565b60006040518083038185875af1925050503d806000811462000ab9576040519150601f19603f3d011682016040523d82523d6000602084013e62000abe565b606091505b505090508062000afa576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000efc565b60685463ffffffff61010090910481169088160362000b435762000b3d73ffffffffffffffffffffffffffffffffffffffff87168585620021ed565b62000efc565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b166024820152600090603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e6e576000808062000c1886880188620039fb565b92509250925060008584848460405162000c329062003292565b62000c409392919062003abd565b8190604051809103906000f590508015801562000c61573d6000803e3d6000fd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f1990604401600060405180830381600087803b15801562000cd757600080fd5b505af115801562000cec573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e5c95949392919062003afa565b60405180910390a15050505062000ef9565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f1990604401600060405180830381600087803b15801562000edf57600080fd5b505af115801562000ef4573d6000803e3d6000fd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000fb2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000fc98b8b8b8b8b8b8b8b8b8b8b600162001ffc565b60008473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000ffc949392919062003b42565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200107f9190620038e6565b60006040518083038185875af1925050503d8060008114620010be576040519150601f19603f3d011682016040523d82523d6000602084013e620010c3565b606091505b5050905080620010ff576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b605354600090819081805b602081101562001255578083901c600116600103620011e65760338160208110620011b257620011b262003b8a565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062001213565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806200124c9062003be8565b91505062001183565b50919392505050565b600054610100900460ff16158080156200127f5750600054600160ff909116105b806200129b5750303b1580156200129b575060005460ff166001145b6200132d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200138c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001691841691909117905562001443620022c3565b8015620014a757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000703576200070362001f27565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201526000908190603801604051602081830303815290604052805190602001209050600060ff60f81b3083604051806020016200157d9062003292565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620015c8908d908d908d908d908d9060200162003c23565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001606929160200162003c64565b604051602081830303815290604052805190602001206040516020016200168f94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff161562001711576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200171b62002366565b60685463ffffffff888116610100909204161480620017415750600263ffffffff881610155b1562001779576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060608773ffffffffffffffffffffffffffffffffffffffff8816620017df57883414620017d5576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000925062001ad9565b341562001818576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089166000908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901562001908576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac90604401600060405180830381600087803b158015620018db57600080fd5b505af1158015620018f0573d6000803e3d6000fd5b50505050806020015194508060000151935062001ad7565b85156200191d576200191d898b8989620023db565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200198b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620019b1919062003c97565b9050620019d773ffffffffffffffffffffffffffffffffffffffff8b1633308e620028f9565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa15801562001a45573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a6b919062003c97565b905062001a79828262003cb1565b6068548c9850610100900463ffffffff169650935062001a998762002959565b62001aa48c62002a71565b62001aaf8d62002b7e565b60405160200162001ac39392919062003abd565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e868860535460405162001b1b98979695949392919062003cc7565b60405180910390a162001c0f620009b2600085878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b861562001c205762001c2062001f27565b5050505062001c2e60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c89576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200070362002c80565b600084815b602081101562001d6e57600163ffffffff8616821c8116900362001d0a5785816020811062001ccb5762001ccb62003b8a565b60200201358260405160200162001cec929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001d59565b8186826020811062001d205762001d2062003b8a565b602002013560405160200162001d40929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d658162003be8565b91505062001c98565b50821490505b949350505050565b60685460ff161562001dba576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b80600162001e216020600262003e79565b62001e2d919062003cb1565b6053541062001e68576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060536000815462001e7b9062003be8565b9182905550905060005b602081101562001f17578082901c60011660010362001ebd57826033826020811062001eb55762001eb562003b8a565b015550505050565b6033816020811062001ed35762001ed362003b8a565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001f0e9062003be8565b91505062001e85565b5062001f2262003e87565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001fad62001178565b6040518263ffffffff1660e01b815260040162001fcc91815260200190565b600060405180830381600087803b15801562001fe757600080fd5b505af1158015620014a7573d6000803e3d6000fd5b6200200d8b63ffffffff1662002d10565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b363200000000000000000000000000000000000000000000000000000000909252606481019190915260009165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303816000875af1158015620020b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620020d6919062003c97565b90508060000362002112576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff88811661010090920416146200215c576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606854600090610100900463ffffffff166200217a5750896200217d565b508a5b620021a66200219d848c8c8c8c8c8c8c604051620008d592919062003881565b8f8f8462001c93565b620021dd576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001f229084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002d75565b600054610100900460ff166200235c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001324565b6200070362002e88565b600260015403620023d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001324565b6002600155565b6000620023ec600482848662003eb6565b620023f79162003ee2565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620026765760008080808080806200245a896004818d62003eb6565b81019062002469919062003f2b565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614620024dd576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff861630146200252d576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002567576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620026229190620038e6565b6000604051808303816000865af19150503d806000811462002661576040519150601f19603f3d011682016040523d82523d6000602084013e62002666565b606091505b50505050505050505050620009c9565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c0000000000000000000000000000000000000000000000000000000014620026f2576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808080808080806200270a8a6004818e62003eb6565b81019062002719919062003f86565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146200278f576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87163014620027df576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f1691620028a39190620038e6565b6000604051808303816000865af19150503d8060008114620028e2576040519150601f19603f3d011682016040523d82523d6000602084013e620028e7565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014a79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002240565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691620029dd9190620038e6565b600060405180830381855afa9150503d806000811462002a1a576040519150601f19603f3d011682016040523d82523d6000602084013e62002a1f565b606091505b50915091508162002a66576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d74565b62001d748162002f21565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162002af59190620038e6565b600060405180830381855afa9150503d806000811462002b32576040519150601f19603f3d011682016040523d82523d6000602084013e62002b37565b606091505b50915091508162002a66576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d74565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169162002c019190620038e6565b600060405180830381855afa9150503d806000811462002c3e576040519150601f19603f3d011682016040523d82523d6000602084013e62002c43565b606091505b509150915081801562002c57575080516020145b62002c6457601262001d74565b8080602001905181019062001d74919062004012565b60018055565b60685460ff1662002cbd576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600881901c60008181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009c9576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600062002dd9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031119092919063ffffffff16565b80519091501562001f22578080602001905181019062002dfa919062004032565b62001f22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001324565b600054610100900460ff1662002c7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001324565b6060604082511062002f435781806020019051810190620007a2919062004052565b8151602003620030d35760005b60208110801562002f9b575082818151811062002f715762002f7162003b8a565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002fb6578062002fad8162003be8565b91505062002f50565b8060000362002ffa57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111562003018576200301862003891565b6040519080825280601f01601f19166020018201604052801562003043576020820181803683370190505b50905060005b82811015620030cb5784818151811062003067576200306762003b8a565b602001015160f81c60f81b82828151811062003087576200308762003b8a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080620030c28162003be8565b91505062003049565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d748484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051620031489190620038e6565b60006040518083038185875af1925050503d806000811462003187576040519150601f19603f3d011682016040523d82523d6000602084013e6200318c565b606091505b50915091506200319f87838387620031aa565b979650505050505050565b60608315620032455782516000036200323d5773ffffffffffffffffffffffffffffffffffffffff85163b6200323d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001324565b508162001d74565b62001d7483838151156200325c5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620013249190620040d2565b611b6680620040e883390190565b803563ffffffff811681146200310c57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620032d857600080fd5b50565b60008060408385031215620032ef57600080fd5b620032fa83620032a0565b915060208301356200330c81620032b5565b809150509250929050565b8015158114620032d857600080fd5b60008083601f8401126200333957600080fd5b50813567ffffffffffffffff8111156200335257600080fd5b6020830191508360208285010111156200336b57600080fd5b9250929050565b6000806000806000608086880312156200338b57600080fd5b6200339686620032a0565b94506020860135620033a881620032b5565b93506040860135620033ba8162003317565b9250606086013567ffffffffffffffff811115620033d757600080fd5b620033e58882890162003326565b969995985093965092949392505050565b806104008101831015620007a257600080fd5b60008060008060008060008060008060006105208c8e0312156200342c57600080fd5b620034388d8d620033f6565b9a50620034496104008d01620032a0565b99506104208c013598506104408c013597506200346a6104608d01620032a0565b96506104808c01356200347d81620032b5565b95506200348e6104a08d01620032a0565b94506104c08c0135620034a181620032b5565b93506104e08c013592506105008c013567ffffffffffffffff811115620034c757600080fd5b620034d58e828f0162003326565b915080935050809150509295989b509295989b9093969950565b6000602082840312156200350257600080fd5b81356200350f81620032b5565b9392505050565b60ff81168114620032d857600080fd5b600080600080600080600060e0888a0312156200354257600080fd5b87356200354f8162003516565b96506200355f60208901620032a0565b955060408801356200357181620032b5565b94506200358160608901620032a0565b935060808801356200359381620032b5565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215620035c657600080fd5b620035d184620032a0565b92506020840135620035e381620032b5565b91506040840135620035f581620032b5565b809150509250925092565b6000602082840312156200361357600080fd5b5035919050565b600080600080600080600060a0888a0312156200363657600080fd5b6200364188620032a0565b965060208801356200365381620032b5565b9550604088013567ffffffffffffffff808211156200367157600080fd5b6200367f8b838c0162003326565b909750955060608a01359150808211156200369957600080fd5b50620036a88a828b0162003326565b9094509250506080880135620036be8162003516565b8091505092959891949750929550565b600080600080600080600060c0888a031215620036ea57600080fd5b620036f588620032a0565b965060208801356200370781620032b5565b95506040880135945060608801356200372081620032b5565b93506080880135620037328162003317565b925060a088013567ffffffffffffffff8111156200374f57600080fd5b6200375d8a828b0162003326565b989b979a50959850939692959293505050565b60008060008061046085870312156200378857600080fd5b843593506200379b8660208701620033f6565b9250620037ac6104208601620032a0565b939692955092936104400135925050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600061010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620038678285018789620037bd565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b83811015620038dd578181015183820152602001620038c3565b50506000910152565b60008251620038fa818460208701620038c0565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156200394e576200394e62003891565b604052919050565b600067ffffffffffffffff82111562003973576200397362003891565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112620039b157600080fd5b8135620039c8620039c28262003956565b62003904565b818152846020838601011115620039de57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562003a1157600080fd5b833567ffffffffffffffff8082111562003a2a57600080fd5b62003a38878388016200399f565b9450602086013591508082111562003a4f57600080fd5b5062003a5e868287016200399f565b9250506040840135620035f58162003516565b6000815180845262003a8b816020860160208601620038c0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60608152600062003ad2606083018662003a71565b828103602084015262003ae6818662003a71565b91505060ff83166040830152949350505050565b63ffffffff86168152600073ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200319f608083018486620037bd565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff8416602082015260606040820152600062003b80606083018486620037bd565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003c1c5762003c1c62003bb9565b5060010190565b60608152600062003c39606083018789620037bd565b828103602084015262003c4e818688620037bd565b91505060ff831660408301529695505050505050565b6000835162003c78818460208801620038c0565b83519083019062003c8e818360208801620038c0565b01949350505050565b60006020828403121562003caa57600080fd5b5051919050565b81810381811115620007a257620007a262003bb9565b600061010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003d278285018762003a71565b925080851660e085015250509998505050505050505050565b600181815b8085111562003d9f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d835762003d8362003bb9565b8085161562003d9157918102915b93841c939080029062003d45565b509250929050565b60008262003db857506001620007a2565b8162003dc757506000620007a2565b816001811462003de0576002811462003deb5762003e0b565b6001915050620007a2565b60ff84111562003dff5762003dff62003bb9565b50506001821b620007a2565b5060208310610133831016604e8410600b841016171562003e30575081810a620007a2565b62003e3c838362003d40565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003e715762003e7162003bb9565b029392505050565b60006200350f838362003da7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000808585111562003ec757600080fd5b8386111562003ed557600080fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003f235780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a03121562003f4757600080fd5b873562003f5481620032b5565b9650602088013562003f6681620032b5565b955060408801359450606088013593506080880135620035938162003516565b600080600080600080600080610100898b03121562003fa457600080fd5b883562003fb181620032b5565b9750602089013562003fc381620032b5565b96506040890135955060608901359450608089013562003fe38162003317565b935060a089013562003ff58162003516565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200402557600080fd5b81516200350f8162003516565b6000602082840312156200404557600080fd5b81516200350f8162003317565b6000602082840312156200406557600080fd5b815167ffffffffffffffff8111156200407d57600080fd5b8201601f810184136200408f57600080fd5b8051620040a0620039c28262003956565b818152856020838501011115620040b657600080fd5b620040c9826020830160208601620038c0565b95945050505050565b6020815260006200350f602083018462003a7156fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212206fe049be388a1d04319b9913fe6d100c4c8e272fe0f5748eb056bd0622beabcc64736f6c63430008140033a2646970667358221220ef4412c515d53043ca441d4b33288d9aa2b101bc9853f859467ab1a42f16139c64736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/paris/PolygonZkEVMBridgeMock.json b/compiled-contracts/paris/PolygonZkEVMBridgeMock.json new file mode 100644 index 000000000..8bcc271f0 --- /dev/null +++ b/compiled-contracts/paris/PolygonZkEVMBridgeMock.json @@ -0,0 +1,874 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonZkEVMBridgeMock", + "sourceName": "contracts/mocks/PolygonZkEVMBridgeMock.sol", + "abi": [ + { + "inputs": [], + "name": "AlreadyClaimed", + "type": "error" + }, + { + "inputs": [], + "name": "AmountDoesNotMatchMsgValue", + "type": "error" + }, + { + "inputs": [], + "name": "DestinationNetworkInvalid", + "type": "error" + }, + { + "inputs": [], + "name": "EtherTransferFailed", + "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": "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": "OnlyPolygonZkEVM", + "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": "uint32", + "name": "index", + "type": "uint32" + }, + { + "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" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "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": "bytes32[32]", + "name": "smtProof", + "type": "bytes32[32]" + }, + { + "internalType": "uint32", + "name": "index", + "type": "uint32" + }, + { + "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": "smtProof", + "type": "bytes32[32]" + }, + { + "internalType": "uint32", + "name": "index", + "type": "uint32" + }, + { + "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": "getDepositRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "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": [ + { + "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": "contract IBasePolygonZkEVMGlobalExitRoot", + "name": "_globalExitRootManager", + "type": "address" + }, + { + "internalType": "address", + "name": "_polygonZkEVMaddress", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "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": "maxEtherBridge", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "networkID", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "polygonZkEVMaddress", + "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": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_maxEtherBridge", + "type": "uint256" + } + ], + "name": "setMaxEtherBridge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "_networkID", + "type": "uint32" + } + ], + "name": "setNetworkID", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "tokenInfoToWrappedToken", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "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": "0x608060405234801561001057600080fd5b506160a1806100206000396000f3fe608060405260043610620001e75760003560e01c8063715018a6116200010b578063bab161bf11620000a1578063dbc16976116200006c578063dbc169761462000728578063ee25560b1462000740578063f2fde38b1462000771578063fb570834146200079657600080fd5b8063bab161bf1462000663578063be5831c7146200069d578063cd58657914620006d9578063d02103ca14620006f057600080fd5b80638da5cb5b11620000e25780638da5cb5b14620005b457806391e57e2d14620005e15780639e34070f14620005f9578063aaa13cc2146200063e57600080fd5b8063715018a6146200053d57806379e2cf97146200055557806381b1c174146200056d57600080fd5b80632d2c9d94116200018157806334ac9cf2116200015857806334ac9cf214620003dd5780633ae05047146200040c5780633e1970431462000424578063647c576c146200051857600080fd5b80632d2c9d9414620003085780632dfdf0b5146200032d578063318aee3d146200035457600080fd5b8063240ff37811620001c2578063240ff37814620002825780632b5e42e714620002995780632c3f58cd14620002be5780632cffd02e14620002e357600080fd5b806315064c9614620001ec5780632072f6c5146200021d57806322e95f2c1462000237575b600080fd5b348015620001f957600080fd5b50606854620002089060ff1681565b60405190151581526020015b60405180910390f35b3480156200022a57600080fd5b5062000235620007bb565b005b3480156200024457600080fd5b506200025c62000256366004620036db565b62000819565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200162000214565b620002356200029336600462003772565b620008bc565b348015620002a657600080fd5b5062000235620002b8366004620037f6565b62000ae4565b348015620002cb57600080fd5b5062000235620002dd36600462003810565b62000af3565b348015620002f057600080fd5b50620002356200030236600462003848565b62000b39565b3480156200031557600080fd5b50620002356200032736600462003848565b620010dd565b3480156200033a57600080fd5b506200034560535481565b60405190815260200162000214565b3480156200036157600080fd5b50620003ab620003733660046200392e565b606b6020526000908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff90911660208301520162000214565b348015620003ea57600080fd5b50606c546200025c9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156200041957600080fd5b5062000345620012e1565b3480156200043157600080fd5b5062000345620004433660046200395e565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200052557600080fd5b506200023562000537366004620039e8565b620013c7565b3480156200054a57600080fd5b506200023562001622565b3480156200056257600080fd5b506200023562001638565b3480156200057a57600080fd5b506200025c6200058c366004620037f6565b606a6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005c157600080fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff166200025c565b348015620005ee57600080fd5b506200034560d15481565b3480156200060657600080fd5b506200020862000618366004620037f6565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b3480156200064b57600080fd5b506200025c6200065d36600462003a38565b62001672565b3480156200067057600080fd5b506068546200068790610100900463ffffffff1681565b60405163ffffffff909116815260200162000214565b348015620006aa57600080fd5b506068546200068790790100000000000000000000000000000000000000000000000000900463ffffffff1681565b62000235620006ea36600462003aec565b6200185e565b348015620006fd57600080fd5b506068546200025c9065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200073557600080fd5b506200023562001932565b3480156200074d57600080fd5b50620003456200075f366004620037f6565b60696020526000908152604090205481565b3480156200077e57600080fd5b5062000235620007903660046200392e565b6200198e565b348015620007a357600080fd5b5062000208620007b536600462003b8e565b62001a4b565b606c5473ffffffffffffffffffffffffffffffffffffffff1633146200080d576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200081762001b34565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091206000908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620008fa576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620009205750600263ffffffff861610155b1562000958576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009ae9998979695949392919062003c24565b60405180910390a162000acc62000ac66001606860019054906101000a900463ffffffff16338989348989604051620009e992919062003c9f565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b62001bc8565b821562000add5762000add62001cdf565b5050505050565b62000aee62001db4565b60d155565b62000afd62001db4565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b77576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b8e8b8b8b8b8b8b8b8b8b8b8b600062001e37565b73ffffffffffffffffffffffffffffffffffffffff861662000c6a576040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000be3919062003d04565b60006040518083038185875af1925050503d806000811462000c22576040519150601f19603f3d011682016040523d82523d6000602084013e62000c27565b606091505b505090508062000c63576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062001065565b60685463ffffffff61010090910481169088160362000cac5762000ca673ffffffffffffffffffffffffffffffffffffffff8716858562002028565b62001065565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b166024820152600090603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000fd7576000808062000d818688018862003e19565b92509250925060008584848460405162000d9b9062003695565b62000da99392919062003edb565b8190604051809103906000f590508015801562000dca573d6000803e3d6000fd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f1990604401600060405180830381600087803b15801562000e4057600080fd5b505af115801562000e55573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000fc595949392919062003f18565b60405180910390a15050505062001062565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f1990604401600060405180830381600087803b1580156200104857600080fd5b505af11580156200105d573d6000803e3d6000fd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff16156200111b576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620011328b8b8b8b8b8b8b8b8b8b8b600162001e37565b60008473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162001165949392919062003f60565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f20000000000000000000000000000000000000000000000000000000017905251620011e8919062003d04565b60006040518083038185875af1925050503d806000811462001227576040519150601f19603f3d011682016040523d82523d6000602084013e6200122c565b606091505b505090508062001268576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b605354600090819081805b6020811015620013be578083901c6001166001036200134f57603381602081106200131b576200131b62003fa8565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200137c565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013b59062004006565b915050620012ec565b50919392505050565b600054610100900460ff1615808015620013e85750600054600160ff909116105b80620014045750303b15801562001404575060005460ff166001145b62001496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014f557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d155620015b8620020fe565b80156200161c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6200162c62001db4565b6200081760006200219d565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000817576200081762001cdf565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201526000908190603801604051602081830303815290604052805190602001209050600060ff60f81b308360405180602001620017089062003695565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905262001753908d908d908d908d908d9060200162004041565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001791929160200162004082565b604051602081830303815290604052805190602001206040516020016200181a94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d15434111562001918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200148d565b620019298787878787878762002214565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001984576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620008176200276f565b6200199862001db4565b73ffffffffffffffffffffffffffffffffffffffff811662001a3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200148d565b62001a48816200219d565b50565b600084815b602081101562001b2657600163ffffffff8616821c8116900362001ac25785816020811062001a835762001a8362003fa8565b60200201358260405160200162001aa4929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001b11565b8186826020811062001ad85762001ad862003fa8565b602002013560405160200162001af8929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001b1d8162004006565b91505062001a50565b50821490505b949350505050565b60685460ff161562001b72576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b80600162001bd960206002620041ee565b62001be59190620041fc565b6053541062001c20576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060536000815462001c339062004006565b9182905550905060005b602081101562001ccf578082901c60011660010362001c7557826033826020811062001c6d5762001c6d62003fa8565b015550505050565b6033816020811062001c8b5762001c8b62003fa8565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001cc69062004006565b91505062001c3d565b5062001cda62004212565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001d65620012e1565b6040518263ffffffff1660e01b815260040162001d8491815260200190565b600060405180830381600087803b15801562001d9f57600080fd5b505af11580156200161c573d6000803e3d6000fd5b609f5473ffffffffffffffffffffffffffffffffffffffff16331462000817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200148d565b62001e488b63ffffffff16620027ff565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b363200000000000000000000000000000000000000000000000000000000909252606481019190915260009165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303816000875af115801562001eeb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001f11919062004241565b90508060000362001f4d576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462001f97576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606854600090610100900463ffffffff1662001fb557508962001fb8565b508a5b62001fe162001fd8848c8c8c8c8c8c8c604051620009e992919062003c9f565b8f8f8462001a4b565b62002018576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001cda9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002864565b600054610100900460ff1662002197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200148d565b62000817335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60685460ff161562002252576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200225c62002977565b60685463ffffffff888116610100909204161480620022825750600263ffffffff881610155b15620022ba576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060608773ffffffffffffffffffffffffffffffffffffffff8816620023205788341462002316576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600092506200261a565b341562002359576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089166000908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901562002449576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac90604401600060405180830381600087803b1580156200241c57600080fd5b505af115801562002431573d6000803e3d6000fd5b50505050806020015194508060000151935062002618565b85156200245e576200245e898b8989620029ec565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa158015620024cc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620024f2919062004241565b90506200251873ffffffffffffffffffffffffffffffffffffffff8b1633308e62002f0a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa15801562002586573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620025ac919062004241565b9050620025ba8282620041fc565b6068548c9850610100900463ffffffff1696509350620025da8762002f6a565b620025e58c62003082565b620025f08d6200318f565b604051602001620026049392919062003edb565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e86886053546040516200265c9897969594939291906200425b565b60405180910390a16200275062000ac6600085878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b861562002761576200276162001cdf565b505050506200192960018055565b60685460ff16620027ac576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600881901c60008181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000add576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000620028c8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200328b9092919063ffffffff16565b80519091501562001cda5780806020019051810190620028e99190620042d4565b62001cda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200148d565b600260015403620029e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200148d565b6002600155565b6000620029fd6004828486620042f4565b62002a089162004320565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002c8757600080808080808062002a6b896004818d620042f4565b81019062002a7a919062004369565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002aee576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002b3e576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002b78576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002c33919062003d04565b6000604051808303816000865af19150503d806000811462002c72576040519150601f19603f3d011682016040523d82523d6000602084013e62002c77565b606091505b5050505050505050505062000add565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002d03576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008080808080808062002d1b8a6004818e620042f4565b81019062002d2a9190620043c4565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002da0576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002df0576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002eb4919062003d04565b6000604051808303816000865af19150503d806000811462002ef3576040519150601f19603f3d011682016040523d82523d6000602084013e62002ef8565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526200161c9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016200207b565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162002fee919062003d04565b600060405180830381855afa9150503d80600081146200302b576040519150601f19603f3d011682016040523d82523d6000602084013e62003030565b606091505b50915091508162003077576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001b2c565b62001b2c816200329c565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162003106919062003d04565b600060405180830381855afa9150503d806000811462003143576040519150601f19603f3d011682016040523d82523d6000602084013e62003148565b606091505b50915091508162003077576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001b2c565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169162003212919062003d04565b600060405180830381855afa9150503d80600081146200324f576040519150601f19603f3d011682016040523d82523d6000602084013e62003254565b606091505b509150915081801562003268575080516020145b6200327557601262001b2c565b8080602001905181019062001b2c919062004450565b606062001b2c84846000856200348c565b60606040825110620032be5781806020019051810190620008b6919062004470565b81516020036200344e5760005b602081108015620033165750828181518110620032ec57620032ec62003fa8565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620033315780620033288162004006565b915050620032cb565b806000036200337557505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111562003393576200339362003caf565b6040519080825280601f01601f191660200182016040528015620033be576020820181803683370190505b50905060005b828110156200344657848181518110620033e257620033e262003fa8565b602001015160f81c60f81b82828151811062003402576200340262003fa8565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806200343d8162004006565b915050620033c4565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200148d565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516200354b919062003d04565b60006040518083038185875af1925050503d80600081146200358a576040519150601f19603f3d011682016040523d82523d6000602084013e6200358f565b606091505b5091509150620035a287838387620035ad565b979650505050505050565b6060831562003648578251600003620036405773ffffffffffffffffffffffffffffffffffffffff85163b62003640576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200148d565b508162001b2c565b62001b2c83838151156200365f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200148d9190620044f0565b611b66806200450683390190565b803563ffffffff811681146200348757600080fd5b73ffffffffffffffffffffffffffffffffffffffff8116811462001a4857600080fd5b60008060408385031215620036ef57600080fd5b620036fa83620036a3565b915060208301356200370c81620036b8565b809150509250929050565b801515811462001a4857600080fd5b60008083601f8401126200373957600080fd5b50813567ffffffffffffffff8111156200375257600080fd5b6020830191508360208285010111156200376b57600080fd5b9250929050565b6000806000806000608086880312156200378b57600080fd5b6200379686620036a3565b94506020860135620037a881620036b8565b93506040860135620037ba8162003717565b9250606086013567ffffffffffffffff811115620037d757600080fd5b620037e58882890162003726565b969995985093965092949392505050565b6000602082840312156200380957600080fd5b5035919050565b6000602082840312156200382357600080fd5b6200382e82620036a3565b9392505050565b806104008101831015620008b657600080fd5b60008060008060008060008060008060006105208c8e0312156200386b57600080fd5b620038778d8d62003835565b9a50620038886104008d01620036a3565b99506104208c013598506104408c01359750620038a96104608d01620036a3565b96506104808c0135620038bc81620036b8565b9550620038cd6104a08d01620036a3565b94506104c08c0135620038e081620036b8565b93506104e08c013592506105008c013567ffffffffffffffff8111156200390657600080fd5b620039148e828f0162003726565b915080935050809150509295989b509295989b9093969950565b6000602082840312156200394157600080fd5b81356200382e81620036b8565b60ff8116811462001a4857600080fd5b600080600080600080600060e0888a0312156200397a57600080fd5b873562003987816200394e565b96506200399760208901620036a3565b95506040880135620039a981620036b8565b9450620039b960608901620036a3565b93506080880135620039cb81620036b8565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215620039fe57600080fd5b62003a0984620036a3565b9250602084013562003a1b81620036b8565b9150604084013562003a2d81620036b8565b809150509250925092565b600080600080600080600060a0888a03121562003a5457600080fd5b62003a5f88620036a3565b9650602088013562003a7181620036b8565b9550604088013567ffffffffffffffff8082111562003a8f57600080fd5b62003a9d8b838c0162003726565b909750955060608a013591508082111562003ab757600080fd5b5062003ac68a828b0162003726565b909450925050608088013562003adc816200394e565b8091505092959891949750929550565b600080600080600080600060c0888a03121562003b0857600080fd5b62003b1388620036a3565b9650602088013562003b2581620036b8565b955060408801359450606088013562003b3e81620036b8565b9350608088013562003b508162003717565b925060a088013567ffffffffffffffff81111562003b6d57600080fd5b62003b7b8a828b0162003726565b989b979a50959850939692959293505050565b600080600080610460858703121562003ba657600080fd5b8435935062003bb9866020870162003835565b925062003bca6104208601620036a3565b939692955092936104400135925050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600061010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003c85828501878962003bdb565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b8381101562003cfb57818101518382015260200162003ce1565b50506000910152565b6000825162003d1881846020870162003cde565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003d6c5762003d6c62003caf565b604052919050565b600067ffffffffffffffff82111562003d915762003d9162003caf565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011262003dcf57600080fd5b813562003de662003de08262003d74565b62003d22565b81815284602083860101111562003dfc57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562003e2f57600080fd5b833567ffffffffffffffff8082111562003e4857600080fd5b62003e568783880162003dbd565b9450602086013591508082111562003e6d57600080fd5b5062003e7c8682870162003dbd565b925050604084013562003a2d816200394e565b6000815180845262003ea981602086016020860162003cde565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60608152600062003ef0606083018662003e8f565b828103602084015262003f04818662003e8f565b91505060ff83166040830152949350505050565b63ffffffff86168152600073ffffffffffffffffffffffffffffffffffffffff808716602084015280861660408401525060806060830152620035a260808301848662003bdb565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff8416602082015260606040820152600062003f9e60608301848662003bdb565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036200403a576200403a62003fd7565b5060010190565b6060815260006200405760608301878962003bdb565b82810360208401526200406c81868862003bdb565b91505060ff831660408301529695505050505050565b600083516200409681846020880162003cde565b835190830190620040ac81836020880162003cde565b01949350505050565b600181815b808511156200411457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620040f857620040f862003fd7565b808516156200410657918102915b93841c9390800290620040ba565b509250929050565b6000826200412d57506001620008b6565b816200413c57506000620008b6565b8160018114620041555760028114620041605762004180565b6001915050620008b6565b60ff84111562004174576200417462003fd7565b50506001821b620008b6565b5060208310610133831016604e8410600b8410161715620041a5575081810a620008b6565b620041b18383620040b5565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620041e657620041e662003fd7565b029392505050565b60006200382e83836200411c565b81810381811115620008b657620008b662003fd7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000602082840312156200425457600080fd5b5051919050565b600061010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620042bb8285018762003e8f565b925080851660e085015250509998505050505050505050565b600060208284031215620042e757600080fd5b81516200382e8162003717565b600080858511156200430557600080fd5b838611156200431357600080fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620043615780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a0312156200438557600080fd5b87356200439281620036b8565b96506020880135620043a481620036b8565b955060408801359450606088013593506080880135620039cb816200394e565b600080600080600080600080610100898b031215620043e257600080fd5b8835620043ef81620036b8565b975060208901356200440181620036b8565b965060408901359550606089013594506080890135620044218162003717565b935060a089013562004433816200394e565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200446357600080fd5b81516200382e816200394e565b6000602082840312156200448357600080fd5b815167ffffffffffffffff8111156200449b57600080fd5b8201601f81018413620044ad57600080fd5b8051620044be62003de08262003d74565b818152856020838501011115620044d457600080fd5b620044e782602083016020860162003cde565b95945050505050565b6020815260006200382e602083018462003e8f56fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212206fe049be388a1d04319b9913fe6d100c4c8e272fe0f5748eb056bd0622beabcc64736f6c63430008140033a2646970667358221220b14509f55d59293305a5dbe90fdf3a7b7ae9417e96c0bbfe4ba0150ddd7bb7a064736f6c63430008140033", + "deployedBytecode": "0x608060405260043610620001e75760003560e01c8063715018a6116200010b578063bab161bf11620000a1578063dbc16976116200006c578063dbc169761462000728578063ee25560b1462000740578063f2fde38b1462000771578063fb570834146200079657600080fd5b8063bab161bf1462000663578063be5831c7146200069d578063cd58657914620006d9578063d02103ca14620006f057600080fd5b80638da5cb5b11620000e25780638da5cb5b14620005b457806391e57e2d14620005e15780639e34070f14620005f9578063aaa13cc2146200063e57600080fd5b8063715018a6146200053d57806379e2cf97146200055557806381b1c174146200056d57600080fd5b80632d2c9d94116200018157806334ac9cf2116200015857806334ac9cf214620003dd5780633ae05047146200040c5780633e1970431462000424578063647c576c146200051857600080fd5b80632d2c9d9414620003085780632dfdf0b5146200032d578063318aee3d146200035457600080fd5b8063240ff37811620001c2578063240ff37814620002825780632b5e42e714620002995780632c3f58cd14620002be5780632cffd02e14620002e357600080fd5b806315064c9614620001ec5780632072f6c5146200021d57806322e95f2c1462000237575b600080fd5b348015620001f957600080fd5b50606854620002089060ff1681565b60405190151581526020015b60405180910390f35b3480156200022a57600080fd5b5062000235620007bb565b005b3480156200024457600080fd5b506200025c62000256366004620036db565b62000819565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200162000214565b620002356200029336600462003772565b620008bc565b348015620002a657600080fd5b5062000235620002b8366004620037f6565b62000ae4565b348015620002cb57600080fd5b5062000235620002dd36600462003810565b62000af3565b348015620002f057600080fd5b50620002356200030236600462003848565b62000b39565b3480156200031557600080fd5b50620002356200032736600462003848565b620010dd565b3480156200033a57600080fd5b506200034560535481565b60405190815260200162000214565b3480156200036157600080fd5b50620003ab620003733660046200392e565b606b6020526000908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff90911660208301520162000214565b348015620003ea57600080fd5b50606c546200025c9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156200041957600080fd5b5062000345620012e1565b3480156200043157600080fd5b5062000345620004433660046200395e565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200052557600080fd5b506200023562000537366004620039e8565b620013c7565b3480156200054a57600080fd5b506200023562001622565b3480156200056257600080fd5b506200023562001638565b3480156200057a57600080fd5b506200025c6200058c366004620037f6565b606a6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005c157600080fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff166200025c565b348015620005ee57600080fd5b506200034560d15481565b3480156200060657600080fd5b506200020862000618366004620037f6565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b3480156200064b57600080fd5b506200025c6200065d36600462003a38565b62001672565b3480156200067057600080fd5b506068546200068790610100900463ffffffff1681565b60405163ffffffff909116815260200162000214565b348015620006aa57600080fd5b506068546200068790790100000000000000000000000000000000000000000000000000900463ffffffff1681565b62000235620006ea36600462003aec565b6200185e565b348015620006fd57600080fd5b506068546200025c9065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200073557600080fd5b506200023562001932565b3480156200074d57600080fd5b50620003456200075f366004620037f6565b60696020526000908152604090205481565b3480156200077e57600080fd5b5062000235620007903660046200392e565b6200198e565b348015620007a357600080fd5b5062000208620007b536600462003b8e565b62001a4b565b606c5473ffffffffffffffffffffffffffffffffffffffff1633146200080d576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200081762001b34565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091206000908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620008fa576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620009205750600263ffffffff861610155b1562000958576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009ae9998979695949392919062003c24565b60405180910390a162000acc62000ac66001606860019054906101000a900463ffffffff16338989348989604051620009e992919062003c9f565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b62001bc8565b821562000add5762000add62001cdf565b5050505050565b62000aee62001db4565b60d155565b62000afd62001db4565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b77576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b8e8b8b8b8b8b8b8b8b8b8b8b600062001e37565b73ffffffffffffffffffffffffffffffffffffffff861662000c6a576040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000be3919062003d04565b60006040518083038185875af1925050503d806000811462000c22576040519150601f19603f3d011682016040523d82523d6000602084013e62000c27565b606091505b505090508062000c63576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062001065565b60685463ffffffff61010090910481169088160362000cac5762000ca673ffffffffffffffffffffffffffffffffffffffff8716858562002028565b62001065565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b166024820152600090603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000fd7576000808062000d818688018862003e19565b92509250925060008584848460405162000d9b9062003695565b62000da99392919062003edb565b8190604051809103906000f590508015801562000dca573d6000803e3d6000fd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f1990604401600060405180830381600087803b15801562000e4057600080fd5b505af115801562000e55573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000fc595949392919062003f18565b60405180910390a15050505062001062565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f1990604401600060405180830381600087803b1580156200104857600080fd5b505af11580156200105d573d6000803e3d6000fd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff16156200111b576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620011328b8b8b8b8b8b8b8b8b8b8b600162001e37565b60008473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162001165949392919062003f60565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f20000000000000000000000000000000000000000000000000000000017905251620011e8919062003d04565b60006040518083038185875af1925050503d806000811462001227576040519150601f19603f3d011682016040523d82523d6000602084013e6200122c565b606091505b505090508062001268576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b605354600090819081805b6020811015620013be578083901c6001166001036200134f57603381602081106200131b576200131b62003fa8565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200137c565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013b59062004006565b915050620012ec565b50919392505050565b600054610100900460ff1615808015620013e85750600054600160ff909116105b80620014045750303b15801562001404575060005460ff166001145b62001496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014f557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d155620015b8620020fe565b80156200161c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6200162c62001db4565b6200081760006200219d565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000817576200081762001cdf565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201526000908190603801604051602081830303815290604052805190602001209050600060ff60f81b308360405180602001620017089062003695565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905262001753908d908d908d908d908d9060200162004041565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001791929160200162004082565b604051602081830303815290604052805190602001206040516020016200181a94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d15434111562001918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200148d565b620019298787878787878762002214565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001984576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620008176200276f565b6200199862001db4565b73ffffffffffffffffffffffffffffffffffffffff811662001a3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200148d565b62001a48816200219d565b50565b600084815b602081101562001b2657600163ffffffff8616821c8116900362001ac25785816020811062001a835762001a8362003fa8565b60200201358260405160200162001aa4929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001b11565b8186826020811062001ad85762001ad862003fa8565b602002013560405160200162001af8929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001b1d8162004006565b91505062001a50565b50821490505b949350505050565b60685460ff161562001b72576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b80600162001bd960206002620041ee565b62001be59190620041fc565b6053541062001c20576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060536000815462001c339062004006565b9182905550905060005b602081101562001ccf578082901c60011660010362001c7557826033826020811062001c6d5762001c6d62003fa8565b015550505050565b6033816020811062001c8b5762001c8b62003fa8565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001cc69062004006565b91505062001c3d565b5062001cda62004212565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001d65620012e1565b6040518263ffffffff1660e01b815260040162001d8491815260200190565b600060405180830381600087803b15801562001d9f57600080fd5b505af11580156200161c573d6000803e3d6000fd5b609f5473ffffffffffffffffffffffffffffffffffffffff16331462000817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200148d565b62001e488b63ffffffff16620027ff565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b363200000000000000000000000000000000000000000000000000000000909252606481019190915260009165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303816000875af115801562001eeb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001f11919062004241565b90508060000362001f4d576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462001f97576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606854600090610100900463ffffffff1662001fb557508962001fb8565b508a5b62001fe162001fd8848c8c8c8c8c8c8c604051620009e992919062003c9f565b8f8f8462001a4b565b62002018576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001cda9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002864565b600054610100900460ff1662002197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200148d565b62000817335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60685460ff161562002252576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200225c62002977565b60685463ffffffff888116610100909204161480620022825750600263ffffffff881610155b15620022ba576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060608773ffffffffffffffffffffffffffffffffffffffff8816620023205788341462002316576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600092506200261a565b341562002359576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089166000908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901562002449576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac90604401600060405180830381600087803b1580156200241c57600080fd5b505af115801562002431573d6000803e3d6000fd5b50505050806020015194508060000151935062002618565b85156200245e576200245e898b8989620029ec565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa158015620024cc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620024f2919062004241565b90506200251873ffffffffffffffffffffffffffffffffffffffff8b1633308e62002f0a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa15801562002586573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620025ac919062004241565b9050620025ba8282620041fc565b6068548c9850610100900463ffffffff1696509350620025da8762002f6a565b620025e58c62003082565b620025f08d6200318f565b604051602001620026049392919062003edb565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e86886053546040516200265c9897969594939291906200425b565b60405180910390a16200275062000ac6600085878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b861562002761576200276162001cdf565b505050506200192960018055565b60685460ff16620027ac576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600881901c60008181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000add576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000620028c8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200328b9092919063ffffffff16565b80519091501562001cda5780806020019051810190620028e99190620042d4565b62001cda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200148d565b600260015403620029e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200148d565b6002600155565b6000620029fd6004828486620042f4565b62002a089162004320565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002c8757600080808080808062002a6b896004818d620042f4565b81019062002a7a919062004369565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002aee576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002b3e576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002b78576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002c33919062003d04565b6000604051808303816000865af19150503d806000811462002c72576040519150601f19603f3d011682016040523d82523d6000602084013e62002c77565b606091505b5050505050505050505062000add565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002d03576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008080808080808062002d1b8a6004818e620042f4565b81019062002d2a9190620043c4565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002da0576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002df0576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002eb4919062003d04565b6000604051808303816000865af19150503d806000811462002ef3576040519150601f19603f3d011682016040523d82523d6000602084013e62002ef8565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526200161c9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016200207b565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162002fee919062003d04565b600060405180830381855afa9150503d80600081146200302b576040519150601f19603f3d011682016040523d82523d6000602084013e62003030565b606091505b50915091508162003077576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001b2c565b62001b2c816200329c565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162003106919062003d04565b600060405180830381855afa9150503d806000811462003143576040519150601f19603f3d011682016040523d82523d6000602084013e62003148565b606091505b50915091508162003077576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001b2c565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169162003212919062003d04565b600060405180830381855afa9150503d80600081146200324f576040519150601f19603f3d011682016040523d82523d6000602084013e62003254565b606091505b509150915081801562003268575080516020145b6200327557601262001b2c565b8080602001905181019062001b2c919062004450565b606062001b2c84846000856200348c565b60606040825110620032be5781806020019051810190620008b6919062004470565b81516020036200344e5760005b602081108015620033165750828181518110620032ec57620032ec62003fa8565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620033315780620033288162004006565b915050620032cb565b806000036200337557505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111562003393576200339362003caf565b6040519080825280601f01601f191660200182016040528015620033be576020820181803683370190505b50905060005b828110156200344657848181518110620033e257620033e262003fa8565b602001015160f81c60f81b82828151811062003402576200340262003fa8565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806200343d8162004006565b915050620033c4565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200148d565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516200354b919062003d04565b60006040518083038185875af1925050503d80600081146200358a576040519150601f19603f3d011682016040523d82523d6000602084013e6200358f565b606091505b5091509150620035a287838387620035ad565b979650505050505050565b6060831562003648578251600003620036405773ffffffffffffffffffffffffffffffffffffffff85163b62003640576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200148d565b508162001b2c565b62001b2c83838151156200365f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200148d9190620044f0565b611b66806200450683390190565b803563ffffffff811681146200348757600080fd5b73ffffffffffffffffffffffffffffffffffffffff8116811462001a4857600080fd5b60008060408385031215620036ef57600080fd5b620036fa83620036a3565b915060208301356200370c81620036b8565b809150509250929050565b801515811462001a4857600080fd5b60008083601f8401126200373957600080fd5b50813567ffffffffffffffff8111156200375257600080fd5b6020830191508360208285010111156200376b57600080fd5b9250929050565b6000806000806000608086880312156200378b57600080fd5b6200379686620036a3565b94506020860135620037a881620036b8565b93506040860135620037ba8162003717565b9250606086013567ffffffffffffffff811115620037d757600080fd5b620037e58882890162003726565b969995985093965092949392505050565b6000602082840312156200380957600080fd5b5035919050565b6000602082840312156200382357600080fd5b6200382e82620036a3565b9392505050565b806104008101831015620008b657600080fd5b60008060008060008060008060008060006105208c8e0312156200386b57600080fd5b620038778d8d62003835565b9a50620038886104008d01620036a3565b99506104208c013598506104408c01359750620038a96104608d01620036a3565b96506104808c0135620038bc81620036b8565b9550620038cd6104a08d01620036a3565b94506104c08c0135620038e081620036b8565b93506104e08c013592506105008c013567ffffffffffffffff8111156200390657600080fd5b620039148e828f0162003726565b915080935050809150509295989b509295989b9093969950565b6000602082840312156200394157600080fd5b81356200382e81620036b8565b60ff8116811462001a4857600080fd5b600080600080600080600060e0888a0312156200397a57600080fd5b873562003987816200394e565b96506200399760208901620036a3565b95506040880135620039a981620036b8565b9450620039b960608901620036a3565b93506080880135620039cb81620036b8565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215620039fe57600080fd5b62003a0984620036a3565b9250602084013562003a1b81620036b8565b9150604084013562003a2d81620036b8565b809150509250925092565b600080600080600080600060a0888a03121562003a5457600080fd5b62003a5f88620036a3565b9650602088013562003a7181620036b8565b9550604088013567ffffffffffffffff8082111562003a8f57600080fd5b62003a9d8b838c0162003726565b909750955060608a013591508082111562003ab757600080fd5b5062003ac68a828b0162003726565b909450925050608088013562003adc816200394e565b8091505092959891949750929550565b600080600080600080600060c0888a03121562003b0857600080fd5b62003b1388620036a3565b9650602088013562003b2581620036b8565b955060408801359450606088013562003b3e81620036b8565b9350608088013562003b508162003717565b925060a088013567ffffffffffffffff81111562003b6d57600080fd5b62003b7b8a828b0162003726565b989b979a50959850939692959293505050565b600080600080610460858703121562003ba657600080fd5b8435935062003bb9866020870162003835565b925062003bca6104208601620036a3565b939692955092936104400135925050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600061010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003c85828501878962003bdb565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b8381101562003cfb57818101518382015260200162003ce1565b50506000910152565b6000825162003d1881846020870162003cde565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003d6c5762003d6c62003caf565b604052919050565b600067ffffffffffffffff82111562003d915762003d9162003caf565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011262003dcf57600080fd5b813562003de662003de08262003d74565b62003d22565b81815284602083860101111562003dfc57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562003e2f57600080fd5b833567ffffffffffffffff8082111562003e4857600080fd5b62003e568783880162003dbd565b9450602086013591508082111562003e6d57600080fd5b5062003e7c8682870162003dbd565b925050604084013562003a2d816200394e565b6000815180845262003ea981602086016020860162003cde565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60608152600062003ef0606083018662003e8f565b828103602084015262003f04818662003e8f565b91505060ff83166040830152949350505050565b63ffffffff86168152600073ffffffffffffffffffffffffffffffffffffffff808716602084015280861660408401525060806060830152620035a260808301848662003bdb565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff8416602082015260606040820152600062003f9e60608301848662003bdb565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036200403a576200403a62003fd7565b5060010190565b6060815260006200405760608301878962003bdb565b82810360208401526200406c81868862003bdb565b91505060ff831660408301529695505050505050565b600083516200409681846020880162003cde565b835190830190620040ac81836020880162003cde565b01949350505050565b600181815b808511156200411457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620040f857620040f862003fd7565b808516156200410657918102915b93841c9390800290620040ba565b509250929050565b6000826200412d57506001620008b6565b816200413c57506000620008b6565b8160018114620041555760028114620041605762004180565b6001915050620008b6565b60ff84111562004174576200417462003fd7565b50506001821b620008b6565b5060208310610133831016604e8410600b8410161715620041a5575081810a620008b6565b620041b18383620040b5565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620041e657620041e662003fd7565b029392505050565b60006200382e83836200411c565b81810381811115620008b657620008b662003fd7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000602082840312156200425457600080fd5b5051919050565b600061010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620042bb8285018762003e8f565b925080851660e085015250509998505050505050505050565b600060208284031215620042e757600080fd5b81516200382e8162003717565b600080858511156200430557600080fd5b838611156200431357600080fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620043615780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a0312156200438557600080fd5b87356200439281620036b8565b96506020880135620043a481620036b8565b955060408801359450606088013593506080880135620039cb816200394e565b600080600080600080600080610100898b031215620043e257600080fd5b8835620043ef81620036b8565b975060208901356200440181620036b8565b965060408901359550606089013594506080890135620044218162003717565b935060a089013562004433816200394e565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200446357600080fd5b81516200382e816200394e565b6000602082840312156200448357600080fd5b815167ffffffffffffffff8111156200449b57600080fd5b8201601f81018413620044ad57600080fd5b8051620044be62003de08262003d74565b818152856020838501011115620044d457600080fd5b620044e782602083016020860162003cde565b95945050505050565b6020815260006200382e602083018462003e8f56fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212206fe049be388a1d04319b9913fe6d100c4c8e272fe0f5748eb056bd0622beabcc64736f6c63430008140033a2646970667358221220b14509f55d59293305a5dbe90fdf3a7b7ae9417e96c0bbfe4ba0150ddd7bb7a064736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/paris/PolygonZkEVMBridgeV2.json b/compiled-contracts/paris/PolygonZkEVMBridgeV2.json new file mode 100644 index 000000000..e5f1d6d95 --- /dev/null +++ b/compiled-contracts/paris/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": "0x608060405234801561001057600080fd5b5061611c806100206000396000f3fe608060405260043610620001db5760003560e01c80638ed7e3f211620000ff578063cd5865791162000095578063dbc16976116200006c578063dbc1697614620006a7578063ee25560b14620006bf578063f5efcd7914620006f0578063fb570834146200071557600080fd5b8063cd5865791462000640578063d02103ca1462000657578063d3476afe146200068257600080fd5b8063bab161bf11620000d6578063bab161bf1462000596578063be5831c714620005ba578063cc46163214620005f6578063ccaa2d11146200061b57600080fd5b80638ed7e3f2146200052a578063aaa13cc2146200054c578063b8b284d0146200057157600080fd5b80633cbc795b11620001755780635ca1e165116200014c5780635ca1e165146200049b57806379e2cf9714620004b357806381b1c17414620004cb57806383f24403146200050557600080fd5b80633cbc795b14620003385780633e19704314620003855780634b2f336d146200047957600080fd5b8063240ff37811620001b6578063240ff37814620002695780632dfdf0b51462000280578063318aee3d14620002a75780633c351e10146200031657600080fd5b806315064c9614620001e05780632072f6c5146200021157806322e95f2c146200022b575b600080fd5b348015620001ed57600080fd5b50606854620001fc9060ff1681565b60405190151581526020015b60405180910390f35b3480156200021e57600080fd5b50620002296200073a565b005b3480156200023857600080fd5b50620002506200024a366004620037e3565b6200078b565b6040516001600160a01b03909116815260200162000208565b620002296200027a3660046200387a565b62000821565b3480156200028d57600080fd5b506200029860535481565b60405190815260200162000208565b348015620002b457600080fd5b50620002f1620002c6366004620038fe565b606b6020526000908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b0390911660208301520162000208565b3480156200032357600080fd5b50606d5462000250906001600160a01b031681565b3480156200034557600080fd5b50606d546200036f9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200162000208565b3480156200039257600080fd5b5062000298620003a436600462003935565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200048657600080fd5b50606e5462000250906001600160a01b031681565b348015620004a857600080fd5b50620002986200088a565b348015620004c057600080fd5b506200022962000970565b348015620004d857600080fd5b5062000250620004ea366004620039bf565b606a602052600090815260409020546001600160a01b031681565b3480156200051257600080fd5b506200029862000524366004620039ec565b620009aa565b3480156200053757600080fd5b50606c5462000250906001600160a01b031681565b3480156200055957600080fd5b50620002506200056b36600462003a30565b62000a8e565b3480156200057e57600080fd5b50620002296200059036600462003ae4565b62000c20565b348015620005a357600080fd5b506068546200036f90610100900463ffffffff1681565b348015620005c757600080fd5b506068546200036f90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b3480156200060357600080fd5b50620001fc6200061536600462003b71565b62000cfa565b3480156200062857600080fd5b50620002296200063a36600462003ba9565b62000d8b565b620002296200065136600462003ca5565b620014a6565b3480156200066457600080fd5b5060685462000250906501000000000090046001600160a01b031681565b3480156200068f57600080fd5b5062000229620006a136600462003d47565b62001a72565b348015620006b457600080fd5b506200022962001e50565b348015620006cc57600080fd5b5062000298620006de366004620039bf565b60696020526000908152604090205481565b348015620006fd57600080fd5b50620002296200070f36600462003ba9565b62001e9f565b3480156200072257600080fd5b50620001fc6200073436600462003dbf565b62002230565b606c546001600160a01b031633146200077f576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007896200224c565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091206000908152606a90915220546001600160a01b03165b92915050565b34158015906200083b5750606e546001600160a01b031615155b1562000873576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000883858534868686620022e0565b5050505050565b605354600090819081805b602081101562000967578083901c600116600103620008f85760338160208110620008c457620008c462003e0c565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062000925565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806200095e9062003e6a565b91505062000895565b50919392505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620007895762000789620023c8565b600083815b602081101562000a8557600163ffffffff8516821c8116900362000a2157848160208110620009e257620009e262003e0c565b60200201358260405160200162000a03929190918252602082015260400190565b60405160208183030381529060405280519060200120915062000a70565b8185826020811062000a375762000a3762003e0c565b602002013560405160200162000a57929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062000a7c8162003e6a565b915050620009af565b50949350505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201526000908190603801604051602081830303815290604052805190602001209050600060ff60f81b30836040518060200162000b2490620037a7565b601f1982820381018352601f90910116604081905262000b51908d908d908d908d908d9060200162003ed0565b60408051601f198184030181529082905262000b71929160200162003f37565b6040516020818303038152906040528051906020012060405160200162000bfa94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b606e546001600160a01b031662000c63576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606e546040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018690526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b15801562000cc957600080fd5b505af115801562000cde573d6000803e3d6000fd5b5050505062000cf2868686868686620022e0565b505050505050565b6068546000908190610100900463ffffffff1615801562000d21575063ffffffff83166001145b1562000d35575063ffffffff831662000d61565b62000d4c64010000000063ffffffff851662003f6a565b62000d5e9063ffffffff861662003f84565b90505b600881901c600090815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000dc9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161462000e13576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000f1c8c8c8c8c8c62000f1660008e8e8e8e8e8e8e60405162000e3992919062003f9a565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b62002496565b6001600160a01b0386166200109457606e546001600160a01b03166200100d5760006001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000f76576020820181803683370190505b5060405162000f86919062003fd9565b60006040518083038185875af1925050503d806000811462000fc5576040519150601f19603f3d011682016040523d82523d6000602084013e62000fca565b606091505b505090508062001006576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506200143c565b606e546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015260248201869052909116906340c10f1990604401600060405180830381600087803b1580156200107557600080fd5b505af11580156200108a573d6000803e3d6000fd5b505050506200143c565b606d546001600160a01b038781169116148015620010d45750606d5463ffffffff8881167401000000000000000000000000000000000000000090920416145b15620010ee5760006001600160a01b038516848262000f4b565b60685463ffffffff61010090910481169088160362001123576200111d6001600160a01b038716858562002674565b6200143c565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b16602482015260009060380160408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b031680620013bb5760008080620011cd86880188620040b2565b925092509250600085848484604051620011e790620037a7565b620011f59392919062004161565b8190604051809103906000f590508015801562001216573d6000803e3d6000fd5b506040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038c81166004830152602482018c9052919250908216906340c10f1990604401600060405180830381600087803b1580156200127f57600080fd5b505af115801562001294573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b604051620013a99594939291906200419e565b60405180910390a15050505062001439565b6040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152602482018790528216906340c10f1990604401600060405180830381600087803b1580156200141f57600080fd5b505af115801562001434573d6000803e3d6000fd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff1615620014e4576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620014ee62002724565b60685463ffffffff61010090910481169088160362001539576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806060876001600160a01b038816620015bd5788341462001588576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d546001600160a01b038116945074010000000000000000000000000000000000000000900463ffffffff1692506200190e565b3415620015f6576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606e546001600160a01b03908116908916036200168e576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018a90526001600160a01b03891690639dc29fac90604401600060405180830381600087803b1580156200166f57600080fd5b505af115801562001684573d6000803e3d6000fd5b505050506200190e565b6001600160a01b038089166000908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901562001764576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b90526001600160a01b038a1690639dc29fac90604401600060405180830381600087803b1580156200173757600080fd5b505af11580156200174c573d6000803e3d6000fd5b5050505080602001519450806000015193506200190c565b8515620017795762001779898b898962002799565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038b16906370a0823190602401602060405180830381865afa158015620017da573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620018009190620041d9565b9050620018196001600160a01b038b1633308e62002c4f565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038c16906370a0823190602401602060405180830381865afa1580156200187a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620018a09190620041d9565b9050620018ae8282620041f3565b6068548c9850610100900463ffffffff1696509350620018ce8762002ca2565b620018d98c62002dad565b620018e48d62002ead565b604051602001620018f89392919062004161565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e86886053546040516200195098979695949392919062004209565b60405180910390a162001a4a62001a44600085878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b62002f9c565b861562001a5b5762001a5b620023c8565b5050505062001a6960018055565b50505050505050565b600054610100900460ff161580801562001a935750600054600160ff909116105b8062001aaf5750303b15801562001aaf575060005460ff166001145b62001b41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801562001ba057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8916027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016848316179055606d541662001ca557606d5474010000000000000000000000000000000000000000900463ffffffff161562001c9f576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001ddb565b606d805463ffffffff861674010000000000000000000000000000000000000000027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b0388161717905560405160009060129062001d0d90620037a7565b6060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff909116604082015260e0018190604051809103906000f590508015801562001da1573d6000803e3d6000fd5b50606e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790555b62001de5620030b4565b801562000cf257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b606c546001600160a01b0316331462001e95576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200078962003157565b60685460ff161562001edd576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161462001f27576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001f4d8c8c8c8c8c62000f1660018e8e8e8e8e8e8e60405162000e3992919062003f9a565b606e546000906001600160a01b03166200203a57846001600160a01b031684888a868660405160240162001f85949392919062004275565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f2000000000000000000000000000000000000000000000000000000001790525162001fea919062003fd9565b60006040518083038185875af1925050503d806000811462002029576040519150601f19603f3d011682016040523d82523d6000602084013e6200202e565b606091505b5050809150506200218d565b606e546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260248201879052909116906340c10f1990604401600060405180830381600087803b158015620020a257600080fd5b505af1158015620020b7573d6000803e3d6000fd5b50505050846001600160a01b031687898585604051602401620020de949392919062004275565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f2000000000000000000000000000000000000000000000000000000001790525162002143919062003fd9565b6000604051808303816000865af19150503d806000811462002182576040519150601f19603f3d011682016040523d82523d6000602084013e62002187565b606091505b50909150505b80620021c5576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b60008162002240868686620009aa565b1490505b949350505050565b60685460ff16156200228a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b60685463ffffffff6101009091048116908716036200232b576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff163389898988886053546040516200238199989796959493929190620042b0565b60405180910390a1620023bc62001a446001606860019054906101000a900463ffffffff16338a8a8a898960405162000e3992919062003f9a565b821562000cf25762000cf25b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d620024416200088a565b6040518263ffffffff1660e01b81526004016200246091815260200190565b600060405180830381600087803b1580156200247b57600080fd5b505af115801562002490573d6000803e3d6000fd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091526000916501000000000090046001600160a01b03169063257b3632906084016020604051808303816000875af11580156200252c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620025529190620041d9565b9050806000036200258e576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080680100000000000000008716600103620025f357869150620025b6848a848962002230565b620025ed576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200265d565b602087901c620026058160016200431e565b9150879250620026246200261b868c86620009aa565b8a838962002230565b6200265b576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b620026698282620031e7565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526200271f9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152620032b1565b505050565b60026001540362002792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001b38565b6002600155565b6000620027aa600482848662004345565b620027b59162004371565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002a0057600080808080808062002818896004818d62004345565b810190620028279190620043ba565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161462002881576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0386163014620028c4576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a8514620028fe576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620029ac919062003fd9565b6000604051808303816000865af19150503d8060008114620029eb576040519150601f19603f3d011682016040523d82523d6000602084013e620029f0565b606091505b5050505050505050505062000883565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002a7c576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008080808080808062002a948a6004818e62004345565b81019062002aa3919062004415565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462002aff576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038716301462002b42576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002bf9919062003fd9565b6000604051808303816000865af19150503d806000811462002c38576040519150601f19603f3d011682016040523d82523d6000602084013e62002c3d565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052620024909085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401620026ba565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde0300000000000000000000000000000000000000000000000000000000179052905160609160009182916001600160a01b0386169162002d19919062003fd9565b600060405180830381855afa9150503d806000811462002d56576040519150601f19603f3d011682016040523d82523d6000602084013e62002d5b565b606091505b50915091508162002da2576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062002244565b6200224481620033b7565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b4100000000000000000000000000000000000000000000000000000000179052905160609160009182916001600160a01b0386169162002e24919062003fd9565b600060405180830381855afa9150503d806000811462002e61576040519150601f19603f3d011682016040523d82523d6000602084013e62002e66565b606091505b50915091508162002da2576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062002244565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce567000000000000000000000000000000000000000000000000000000001790529051600091829182916001600160a01b0386169162002f23919062003fd9565b600060405180830381855afa9150503d806000811462002f60576040519150601f19603f3d011682016040523d82523d6000602084013e62002f65565b606091505b509150915081801562002f79575080516020145b62002f8657601262002244565b80806020019051810190620022449190620044a1565b80600162002fad60206002620045fa565b62002fb99190620041f3565b6053541062002ff4576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000605360008154620030079062003e6a565b9182905550905060005b6020811015620030a3578082901c6001166001036200304957826033826020811062003041576200304162003e0c565b015550505050565b603381602081106200305f576200305f62003e0c565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925080806200309a9062003e6a565b91505062003011565b506200271f62004608565b60018055565b600054610100900460ff166200314d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001b38565b62000789620035a7565b60685460ff1662003194576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b606854600090610100900463ffffffff161580156200320c575063ffffffff82166001145b1562003220575063ffffffff82166200324c565b6200323764010000000063ffffffff841662003f6a565b620032499063ffffffff851662003f84565b90505b600881901c60008181526069602052604081208054600160ff861690811b9182189283905592909190818316900362001a69576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600062003308826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620036409092919063ffffffff16565b8051909150156200271f578080602001905181019062003329919062004637565b6200271f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001b38565b60606040825110620033d957818060200190518101906200081b919062004657565b8151602003620035695760005b60208110801562003431575082818151811062003407576200340762003e0c565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b156200344c5780620034438162003e6a565b915050620033e6565b806000036200349057505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115620034ae57620034ae62003faa565b6040519080825280601f01601f191660200182016040528015620034d9576020820181803683370190505b50905060005b828110156200356157848181518110620034fd57620034fd62003e0c565b602001015160f81c60f81b8282815181106200351d576200351d62003e0c565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080620035588162003e6a565b915050620034df565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b600054610100900460ff16620030ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001b38565b606062002244848460008585600080866001600160a01b031685876040516200366a919062003fd9565b60006040518083038185875af1925050503d8060008114620036a9576040519150601f19603f3d011682016040523d82523d6000602084013e620036ae565b606091505b5091509150620036c187838387620036cc565b979650505050505050565b606083156200375a57825160000362003752576001600160a01b0385163b62003752576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001b38565b508162002244565b620022448383815115620037715781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001b389190620046d7565b6119fa80620046ed83390190565b803563ffffffff81168114620035a257600080fd5b6001600160a01b0381168114620037e057600080fd5b50565b60008060408385031215620037f757600080fd5b6200380283620037b5565b915060208301356200381481620037ca565b809150509250929050565b8015158114620037e057600080fd5b60008083601f8401126200384157600080fd5b50813567ffffffffffffffff8111156200385a57600080fd5b6020830191508360208285010111156200387357600080fd5b9250929050565b6000806000806000608086880312156200389357600080fd5b6200389e86620037b5565b94506020860135620038b081620037ca565b93506040860135620038c2816200381f565b9250606086013567ffffffffffffffff811115620038df57600080fd5b620038ed888289016200382e565b969995985093965092949392505050565b6000602082840312156200391157600080fd5b81356200391e81620037ca565b9392505050565b60ff81168114620037e057600080fd5b600080600080600080600060e0888a0312156200395157600080fd5b87356200395e8162003925565b96506200396e60208901620037b5565b955060408801356200398081620037ca565b94506200399060608901620037b5565b93506080880135620039a281620037ca565b9699959850939692959460a0840135945060c09093013592915050565b600060208284031215620039d257600080fd5b5035919050565b8061040081018310156200081b57600080fd5b6000806000610440848603121562003a0357600080fd5b8335925062003a168560208601620039d9565b915062003a276104208501620037b5565b90509250925092565b600080600080600080600060a0888a03121562003a4c57600080fd5b62003a5788620037b5565b9650602088013562003a6981620037ca565b9550604088013567ffffffffffffffff8082111562003a8757600080fd5b62003a958b838c016200382e565b909750955060608a013591508082111562003aaf57600080fd5b5062003abe8a828b016200382e565b909450925050608088013562003ad48162003925565b8091505092959891949750929550565b60008060008060008060a0878903121562003afe57600080fd5b62003b0987620037b5565b9550602087013562003b1b81620037ca565b945060408701359350606087013562003b34816200381f565b9250608087013567ffffffffffffffff81111562003b5157600080fd5b62003b5f89828a016200382e565b979a9699509497509295939492505050565b6000806040838503121562003b8557600080fd5b62003b9083620037b5565b915062003ba060208401620037b5565b90509250929050565b6000806000806000806000806000806000806109208d8f03121562003bcd57600080fd5b62003bd98e8e620039d9565b9b5062003beb8e6104008f01620039d9565b9a506108008d013599506108208d013598506108408d0135975062003c146108608e01620037b5565b965062003c266108808e0135620037ca565b6108808d0135955062003c3d6108a08e01620037b5565b945062003c4f6108c08e0135620037ca565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111562003c7a57600080fd5b62003c8d8e6109008f01358f016200382e565b81935080925050509295989b509295989b509295989b565b600080600080600080600060c0888a03121562003cc157600080fd5b62003ccc88620037b5565b9650602088013562003cde81620037ca565b955060408801359450606088013562003cf781620037ca565b9350608088013562003d09816200381f565b925060a088013567ffffffffffffffff81111562003d2657600080fd5b62003d348a828b016200382e565b989b979a50959850939692959293505050565b600080600080600060a0868803121562003d6057600080fd5b62003d6b86620037b5565b9450602086013562003d7d81620037ca565b935062003d8d60408701620037b5565b9250606086013562003d9f81620037ca565b9150608086013562003db181620037ca565b809150509295509295909350565b600080600080610460858703121562003dd757600080fd5b8435935062003dea8660208701620039d9565b925062003dfb6104208601620037b5565b939692955092936104400135925050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003e9e5762003e9e62003e3b565b5060010190565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b60608152600062003ee660608301878962003ea5565b828103602084015262003efb81868862003ea5565b91505060ff831660408301529695505050505050565b60005b8381101562003f2e57818101518382015260200162003f14565b50506000910152565b6000835162003f4b81846020880162003f11565b83519083019062003f6181836020880162003f11565b01949350505050565b80820281158282048414176200081b576200081b62003e3b565b808201808211156200081b576200081b62003e3b565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825162003fed81846020870162003f11565b9190910192915050565b604051601f8201601f1916810167ffffffffffffffff8111828210171562004023576200402362003faa565b604052919050565b600067ffffffffffffffff82111562004048576200404862003faa565b50601f01601f191660200190565b600082601f8301126200406857600080fd5b81356200407f62004079826200402b565b62003ff7565b8181528460208386010111156200409557600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215620040c857600080fd5b833567ffffffffffffffff80821115620040e157600080fd5b620040ef8783880162004056565b945060208601359150808211156200410657600080fd5b50620041158682870162004056565b9250506040840135620041288162003925565b809150509250925092565b600081518084526200414d81602086016020860162003f11565b601f01601f19169290920160200192915050565b60608152600062004176606083018662004133565b82810360208401526200418a818662004133565b91505060ff83166040830152949350505050565b63ffffffff8616815260006001600160a01b03808716602084015280861660408401525060806060830152620036c160808301848662003ea5565b600060208284031215620041ec57600080fd5b5051919050565b818103818111156200081b576200081b62003e3b565b600061010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c08501526200425c8285018762004133565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201526000620042a660608301848662003ea5565b9695505050505050565b600061010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c085015262004304828501878962003ea5565b925080851660e085015250509a9950505050505050505050565b63ffffffff8181168382160190808211156200433e576200433e62003e3b565b5092915050565b600080858511156200435657600080fd5b838611156200436457600080fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620043b25780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a031215620043d657600080fd5b8735620043e381620037ca565b96506020880135620043f581620037ca565b955060408801359450606088013593506080880135620039a28162003925565b600080600080600080600080610100898b0312156200443357600080fd5b88356200444081620037ca565b975060208901356200445281620037ca565b96506040890135955060608901359450608089013562004472816200381f565b935060a0890135620044848162003925565b979a969950949793969295929450505060c08201359160e0013590565b600060208284031215620044b457600080fd5b81516200391e8162003925565b600181815b808511156200452057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562004504576200450462003e3b565b808516156200451257918102915b93841c9390800290620044c6565b509250929050565b60008262004539575060016200081b565b8162004548575060006200081b565b81600181146200456157600281146200456c576200458c565b60019150506200081b565b60ff84111562004580576200458062003e3b565b50506001821b6200081b565b5060208310610133831016604e8410600b8410161715620045b1575081810a6200081b565b620045bd8383620044c1565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620045f257620045f262003e3b565b029392505050565b60006200391e838362004528565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000602082840312156200464a57600080fd5b81516200391e816200381f565b6000602082840312156200466a57600080fd5b815167ffffffffffffffff8111156200468257600080fd5b8201601f810184136200469457600080fd5b8051620046a562004079826200402b565b818152856020838501011115620046bb57600080fd5b620046ce82602083016020860162003f11565b95945050505050565b6020815260006200391e60208301846200413356fe6101006040523480156200001257600080fd5b50604051620019fa380380620019fa83398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161153e620004bc6000396000610237015260008181610307015281816105c0015261068d0152600061053a0152600081816103790152610504015261153e6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b6040516101919190611278565b60405180910390f35b6101ad6101a836600461130d565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad610204366004611337565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad61027736600461130d565b61055c565b61028f61028a36600461130d565b6105a8565b005b6101c161029f366004611373565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d5366004611373565b60056020526000908152604090205481565b610184610666565b61028f6102fd36600461130d565b610675565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c36600461130d565b61072a565b6101ad61036f36600461130d565b6107e1565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611395565b6107ef565b6101c16103bc366004611408565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f9061143b565b80601f016020809104026020016040519081016040528092919081815260200182805461046b9061143b565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610af1565b60019150505b92915050565b6000336104ea858285610c71565b6104f5858585610d2e565b506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146105375761053246610f4f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a39087906114bd565b610af1565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106585760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106628282611017565b5050565b60606004805461043f9061143b565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146107205760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d42726964676500000000000000000000000000000000606482015260840161064f565b61066282826110f0565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107d45760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161064f565b6104f58286868403610af1565b6000336104d0818585610d2e565b834211156108645760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d697400000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866108be836114d0565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610929610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156109ed573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610a6857508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610ada5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e617475726500000000000000000000000000000000000000000000000000606482015260840161064f565b610ae58a8a8a610af1565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610b795760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8216610c025760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d285781811015610d1b5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161064f565b610d288484848403610af1565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610db75760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8216610e405760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610edc5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610d28565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610f7a610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff821661107a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161064f565b806002600082825461108c91906114bd565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166111795760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156112155760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610c64565b600060208083528351808285015260005b818110156112a557858101830151858201604001528201611289565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461130857600080fd5b919050565b6000806040838503121561132057600080fd5b611329836112e4565b946020939093013593505050565b60008060006060848603121561134c57600080fd5b611355846112e4565b9250611363602085016112e4565b9150604084013590509250925092565b60006020828403121561138557600080fd5b61138e826112e4565b9392505050565b600080600080600080600060e0888a0312156113b057600080fd5b6113b9886112e4565b96506113c7602089016112e4565b95506040880135945060608801359350608088013560ff811681146113eb57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561141b57600080fd5b611424836112e4565b9150611432602084016112e4565b90509250929050565b600181811c9082168061144f57607f821691505b602082108103611488577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d661148e565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036115015761150161148e565b506001019056fea2646970667358221220b49a146f369750b7055c494881ee723d063a73d92e8391e12d74eceb27ca91ef64736f6c63430008140033a2646970667358221220ea714517b77a730fcf3b4acad975476f67a3e6cd8f0f84834a89cd92be074e4b64736f6c63430008140033", + "deployedBytecode": "0x608060405260043610620001db5760003560e01c80638ed7e3f211620000ff578063cd5865791162000095578063dbc16976116200006c578063dbc1697614620006a7578063ee25560b14620006bf578063f5efcd7914620006f0578063fb570834146200071557600080fd5b8063cd5865791462000640578063d02103ca1462000657578063d3476afe146200068257600080fd5b8063bab161bf11620000d6578063bab161bf1462000596578063be5831c714620005ba578063cc46163214620005f6578063ccaa2d11146200061b57600080fd5b80638ed7e3f2146200052a578063aaa13cc2146200054c578063b8b284d0146200057157600080fd5b80633cbc795b11620001755780635ca1e165116200014c5780635ca1e165146200049b57806379e2cf9714620004b357806381b1c17414620004cb57806383f24403146200050557600080fd5b80633cbc795b14620003385780633e19704314620003855780634b2f336d146200047957600080fd5b8063240ff37811620001b6578063240ff37814620002695780632dfdf0b51462000280578063318aee3d14620002a75780633c351e10146200031657600080fd5b806315064c9614620001e05780632072f6c5146200021157806322e95f2c146200022b575b600080fd5b348015620001ed57600080fd5b50606854620001fc9060ff1681565b60405190151581526020015b60405180910390f35b3480156200021e57600080fd5b50620002296200073a565b005b3480156200023857600080fd5b50620002506200024a366004620037e3565b6200078b565b6040516001600160a01b03909116815260200162000208565b620002296200027a3660046200387a565b62000821565b3480156200028d57600080fd5b506200029860535481565b60405190815260200162000208565b348015620002b457600080fd5b50620002f1620002c6366004620038fe565b606b6020526000908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b0390911660208301520162000208565b3480156200032357600080fd5b50606d5462000250906001600160a01b031681565b3480156200034557600080fd5b50606d546200036f9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200162000208565b3480156200039257600080fd5b5062000298620003a436600462003935565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200048657600080fd5b50606e5462000250906001600160a01b031681565b348015620004a857600080fd5b50620002986200088a565b348015620004c057600080fd5b506200022962000970565b348015620004d857600080fd5b5062000250620004ea366004620039bf565b606a602052600090815260409020546001600160a01b031681565b3480156200051257600080fd5b506200029862000524366004620039ec565b620009aa565b3480156200053757600080fd5b50606c5462000250906001600160a01b031681565b3480156200055957600080fd5b50620002506200056b36600462003a30565b62000a8e565b3480156200057e57600080fd5b50620002296200059036600462003ae4565b62000c20565b348015620005a357600080fd5b506068546200036f90610100900463ffffffff1681565b348015620005c757600080fd5b506068546200036f90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b3480156200060357600080fd5b50620001fc6200061536600462003b71565b62000cfa565b3480156200062857600080fd5b50620002296200063a36600462003ba9565b62000d8b565b620002296200065136600462003ca5565b620014a6565b3480156200066457600080fd5b5060685462000250906501000000000090046001600160a01b031681565b3480156200068f57600080fd5b5062000229620006a136600462003d47565b62001a72565b348015620006b457600080fd5b506200022962001e50565b348015620006cc57600080fd5b5062000298620006de366004620039bf565b60696020526000908152604090205481565b348015620006fd57600080fd5b50620002296200070f36600462003ba9565b62001e9f565b3480156200072257600080fd5b50620001fc6200073436600462003dbf565b62002230565b606c546001600160a01b031633146200077f576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007896200224c565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091206000908152606a90915220546001600160a01b03165b92915050565b34158015906200083b5750606e546001600160a01b031615155b1562000873576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000883858534868686620022e0565b5050505050565b605354600090819081805b602081101562000967578083901c600116600103620008f85760338160208110620008c457620008c462003e0c565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062000925565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806200095e9062003e6a565b91505062000895565b50919392505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620007895762000789620023c8565b600083815b602081101562000a8557600163ffffffff8516821c8116900362000a2157848160208110620009e257620009e262003e0c565b60200201358260405160200162000a03929190918252602082015260400190565b60405160208183030381529060405280519060200120915062000a70565b8185826020811062000a375762000a3762003e0c565b602002013560405160200162000a57929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062000a7c8162003e6a565b915050620009af565b50949350505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201526000908190603801604051602081830303815290604052805190602001209050600060ff60f81b30836040518060200162000b2490620037a7565b601f1982820381018352601f90910116604081905262000b51908d908d908d908d908d9060200162003ed0565b60408051601f198184030181529082905262000b71929160200162003f37565b6040516020818303038152906040528051906020012060405160200162000bfa94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b606e546001600160a01b031662000c63576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606e546040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018690526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b15801562000cc957600080fd5b505af115801562000cde573d6000803e3d6000fd5b5050505062000cf2868686868686620022e0565b505050505050565b6068546000908190610100900463ffffffff1615801562000d21575063ffffffff83166001145b1562000d35575063ffffffff831662000d61565b62000d4c64010000000063ffffffff851662003f6a565b62000d5e9063ffffffff861662003f84565b90505b600881901c600090815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000dc9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161462000e13576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000f1c8c8c8c8c8c62000f1660008e8e8e8e8e8e8e60405162000e3992919062003f9a565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b62002496565b6001600160a01b0386166200109457606e546001600160a01b03166200100d5760006001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000f76576020820181803683370190505b5060405162000f86919062003fd9565b60006040518083038185875af1925050503d806000811462000fc5576040519150601f19603f3d011682016040523d82523d6000602084013e62000fca565b606091505b505090508062001006576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506200143c565b606e546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015260248201869052909116906340c10f1990604401600060405180830381600087803b1580156200107557600080fd5b505af11580156200108a573d6000803e3d6000fd5b505050506200143c565b606d546001600160a01b038781169116148015620010d45750606d5463ffffffff8881167401000000000000000000000000000000000000000090920416145b15620010ee5760006001600160a01b038516848262000f4b565b60685463ffffffff61010090910481169088160362001123576200111d6001600160a01b038716858562002674565b6200143c565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b16602482015260009060380160408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b031680620013bb5760008080620011cd86880188620040b2565b925092509250600085848484604051620011e790620037a7565b620011f59392919062004161565b8190604051809103906000f590508015801562001216573d6000803e3d6000fd5b506040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038c81166004830152602482018c9052919250908216906340c10f1990604401600060405180830381600087803b1580156200127f57600080fd5b505af115801562001294573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b604051620013a99594939291906200419e565b60405180910390a15050505062001439565b6040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152602482018790528216906340c10f1990604401600060405180830381600087803b1580156200141f57600080fd5b505af115801562001434573d6000803e3d6000fd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff1615620014e4576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620014ee62002724565b60685463ffffffff61010090910481169088160362001539576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806060876001600160a01b038816620015bd5788341462001588576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d546001600160a01b038116945074010000000000000000000000000000000000000000900463ffffffff1692506200190e565b3415620015f6576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606e546001600160a01b03908116908916036200168e576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018a90526001600160a01b03891690639dc29fac90604401600060405180830381600087803b1580156200166f57600080fd5b505af115801562001684573d6000803e3d6000fd5b505050506200190e565b6001600160a01b038089166000908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901562001764576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b90526001600160a01b038a1690639dc29fac90604401600060405180830381600087803b1580156200173757600080fd5b505af11580156200174c573d6000803e3d6000fd5b5050505080602001519450806000015193506200190c565b8515620017795762001779898b898962002799565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038b16906370a0823190602401602060405180830381865afa158015620017da573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620018009190620041d9565b9050620018196001600160a01b038b1633308e62002c4f565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038c16906370a0823190602401602060405180830381865afa1580156200187a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620018a09190620041d9565b9050620018ae8282620041f3565b6068548c9850610100900463ffffffff1696509350620018ce8762002ca2565b620018d98c62002dad565b620018e48d62002ead565b604051602001620018f89392919062004161565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e86886053546040516200195098979695949392919062004209565b60405180910390a162001a4a62001a44600085878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b62002f9c565b861562001a5b5762001a5b620023c8565b5050505062001a6960018055565b50505050505050565b600054610100900460ff161580801562001a935750600054600160ff909116105b8062001aaf5750303b15801562001aaf575060005460ff166001145b62001b41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801562001ba057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8916027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016848316179055606d541662001ca557606d5474010000000000000000000000000000000000000000900463ffffffff161562001c9f576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001ddb565b606d805463ffffffff861674010000000000000000000000000000000000000000027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b0388161717905560405160009060129062001d0d90620037a7565b6060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff909116604082015260e0018190604051809103906000f590508015801562001da1573d6000803e3d6000fd5b50606e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790555b62001de5620030b4565b801562000cf257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b606c546001600160a01b0316331462001e95576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200078962003157565b60685460ff161562001edd576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161462001f27576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001f4d8c8c8c8c8c62000f1660018e8e8e8e8e8e8e60405162000e3992919062003f9a565b606e546000906001600160a01b03166200203a57846001600160a01b031684888a868660405160240162001f85949392919062004275565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f2000000000000000000000000000000000000000000000000000000001790525162001fea919062003fd9565b60006040518083038185875af1925050503d806000811462002029576040519150601f19603f3d011682016040523d82523d6000602084013e6200202e565b606091505b5050809150506200218d565b606e546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260248201879052909116906340c10f1990604401600060405180830381600087803b158015620020a257600080fd5b505af1158015620020b7573d6000803e3d6000fd5b50505050846001600160a01b031687898585604051602401620020de949392919062004275565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f2000000000000000000000000000000000000000000000000000000001790525162002143919062003fd9565b6000604051808303816000865af19150503d806000811462002182576040519150601f19603f3d011682016040523d82523d6000602084013e62002187565b606091505b50909150505b80620021c5576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b60008162002240868686620009aa565b1490505b949350505050565b60685460ff16156200228a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b60685463ffffffff6101009091048116908716036200232b576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff163389898988886053546040516200238199989796959493929190620042b0565b60405180910390a1620023bc62001a446001606860019054906101000a900463ffffffff16338a8a8a898960405162000e3992919062003f9a565b821562000cf25762000cf25b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d620024416200088a565b6040518263ffffffff1660e01b81526004016200246091815260200190565b600060405180830381600087803b1580156200247b57600080fd5b505af115801562002490573d6000803e3d6000fd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091526000916501000000000090046001600160a01b03169063257b3632906084016020604051808303816000875af11580156200252c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620025529190620041d9565b9050806000036200258e576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080680100000000000000008716600103620025f357869150620025b6848a848962002230565b620025ed576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200265d565b602087901c620026058160016200431e565b9150879250620026246200261b868c86620009aa565b8a838962002230565b6200265b576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b620026698282620031e7565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526200271f9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152620032b1565b505050565b60026001540362002792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001b38565b6002600155565b6000620027aa600482848662004345565b620027b59162004371565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002a0057600080808080808062002818896004818d62004345565b810190620028279190620043ba565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161462002881576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0386163014620028c4576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a8514620028fe576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620029ac919062003fd9565b6000604051808303816000865af19150503d8060008114620029eb576040519150601f19603f3d011682016040523d82523d6000602084013e620029f0565b606091505b5050505050505050505062000883565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002a7c576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008080808080808062002a948a6004818e62004345565b81019062002aa3919062004415565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462002aff576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038716301462002b42576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002bf9919062003fd9565b6000604051808303816000865af19150503d806000811462002c38576040519150601f19603f3d011682016040523d82523d6000602084013e62002c3d565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052620024909085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401620026ba565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde0300000000000000000000000000000000000000000000000000000000179052905160609160009182916001600160a01b0386169162002d19919062003fd9565b600060405180830381855afa9150503d806000811462002d56576040519150601f19603f3d011682016040523d82523d6000602084013e62002d5b565b606091505b50915091508162002da2576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062002244565b6200224481620033b7565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b4100000000000000000000000000000000000000000000000000000000179052905160609160009182916001600160a01b0386169162002e24919062003fd9565b600060405180830381855afa9150503d806000811462002e61576040519150601f19603f3d011682016040523d82523d6000602084013e62002e66565b606091505b50915091508162002da2576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062002244565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce567000000000000000000000000000000000000000000000000000000001790529051600091829182916001600160a01b0386169162002f23919062003fd9565b600060405180830381855afa9150503d806000811462002f60576040519150601f19603f3d011682016040523d82523d6000602084013e62002f65565b606091505b509150915081801562002f79575080516020145b62002f8657601262002244565b80806020019051810190620022449190620044a1565b80600162002fad60206002620045fa565b62002fb99190620041f3565b6053541062002ff4576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000605360008154620030079062003e6a565b9182905550905060005b6020811015620030a3578082901c6001166001036200304957826033826020811062003041576200304162003e0c565b015550505050565b603381602081106200305f576200305f62003e0c565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925080806200309a9062003e6a565b91505062003011565b506200271f62004608565b60018055565b600054610100900460ff166200314d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001b38565b62000789620035a7565b60685460ff1662003194576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b606854600090610100900463ffffffff161580156200320c575063ffffffff82166001145b1562003220575063ffffffff82166200324c565b6200323764010000000063ffffffff841662003f6a565b620032499063ffffffff851662003f84565b90505b600881901c60008181526069602052604081208054600160ff861690811b9182189283905592909190818316900362001a69576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600062003308826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620036409092919063ffffffff16565b8051909150156200271f578080602001905181019062003329919062004637565b6200271f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001b38565b60606040825110620033d957818060200190518101906200081b919062004657565b8151602003620035695760005b60208110801562003431575082818151811062003407576200340762003e0c565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b156200344c5780620034438162003e6a565b915050620033e6565b806000036200349057505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115620034ae57620034ae62003faa565b6040519080825280601f01601f191660200182016040528015620034d9576020820181803683370190505b50905060005b828110156200356157848181518110620034fd57620034fd62003e0c565b602001015160f81c60f81b8282815181106200351d576200351d62003e0c565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080620035588162003e6a565b915050620034df565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b600054610100900460ff16620030ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001b38565b606062002244848460008585600080866001600160a01b031685876040516200366a919062003fd9565b60006040518083038185875af1925050503d8060008114620036a9576040519150601f19603f3d011682016040523d82523d6000602084013e620036ae565b606091505b5091509150620036c187838387620036cc565b979650505050505050565b606083156200375a57825160000362003752576001600160a01b0385163b62003752576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001b38565b508162002244565b620022448383815115620037715781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001b389190620046d7565b6119fa80620046ed83390190565b803563ffffffff81168114620035a257600080fd5b6001600160a01b0381168114620037e057600080fd5b50565b60008060408385031215620037f757600080fd5b6200380283620037b5565b915060208301356200381481620037ca565b809150509250929050565b8015158114620037e057600080fd5b60008083601f8401126200384157600080fd5b50813567ffffffffffffffff8111156200385a57600080fd5b6020830191508360208285010111156200387357600080fd5b9250929050565b6000806000806000608086880312156200389357600080fd5b6200389e86620037b5565b94506020860135620038b081620037ca565b93506040860135620038c2816200381f565b9250606086013567ffffffffffffffff811115620038df57600080fd5b620038ed888289016200382e565b969995985093965092949392505050565b6000602082840312156200391157600080fd5b81356200391e81620037ca565b9392505050565b60ff81168114620037e057600080fd5b600080600080600080600060e0888a0312156200395157600080fd5b87356200395e8162003925565b96506200396e60208901620037b5565b955060408801356200398081620037ca565b94506200399060608901620037b5565b93506080880135620039a281620037ca565b9699959850939692959460a0840135945060c09093013592915050565b600060208284031215620039d257600080fd5b5035919050565b8061040081018310156200081b57600080fd5b6000806000610440848603121562003a0357600080fd5b8335925062003a168560208601620039d9565b915062003a276104208501620037b5565b90509250925092565b600080600080600080600060a0888a03121562003a4c57600080fd5b62003a5788620037b5565b9650602088013562003a6981620037ca565b9550604088013567ffffffffffffffff8082111562003a8757600080fd5b62003a958b838c016200382e565b909750955060608a013591508082111562003aaf57600080fd5b5062003abe8a828b016200382e565b909450925050608088013562003ad48162003925565b8091505092959891949750929550565b60008060008060008060a0878903121562003afe57600080fd5b62003b0987620037b5565b9550602087013562003b1b81620037ca565b945060408701359350606087013562003b34816200381f565b9250608087013567ffffffffffffffff81111562003b5157600080fd5b62003b5f89828a016200382e565b979a9699509497509295939492505050565b6000806040838503121562003b8557600080fd5b62003b9083620037b5565b915062003ba060208401620037b5565b90509250929050565b6000806000806000806000806000806000806109208d8f03121562003bcd57600080fd5b62003bd98e8e620039d9565b9b5062003beb8e6104008f01620039d9565b9a506108008d013599506108208d013598506108408d0135975062003c146108608e01620037b5565b965062003c266108808e0135620037ca565b6108808d0135955062003c3d6108a08e01620037b5565b945062003c4f6108c08e0135620037ca565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111562003c7a57600080fd5b62003c8d8e6109008f01358f016200382e565b81935080925050509295989b509295989b509295989b565b600080600080600080600060c0888a03121562003cc157600080fd5b62003ccc88620037b5565b9650602088013562003cde81620037ca565b955060408801359450606088013562003cf781620037ca565b9350608088013562003d09816200381f565b925060a088013567ffffffffffffffff81111562003d2657600080fd5b62003d348a828b016200382e565b989b979a50959850939692959293505050565b600080600080600060a0868803121562003d6057600080fd5b62003d6b86620037b5565b9450602086013562003d7d81620037ca565b935062003d8d60408701620037b5565b9250606086013562003d9f81620037ca565b9150608086013562003db181620037ca565b809150509295509295909350565b600080600080610460858703121562003dd757600080fd5b8435935062003dea8660208701620039d9565b925062003dfb6104208601620037b5565b939692955092936104400135925050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003e9e5762003e9e62003e3b565b5060010190565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b60608152600062003ee660608301878962003ea5565b828103602084015262003efb81868862003ea5565b91505060ff831660408301529695505050505050565b60005b8381101562003f2e57818101518382015260200162003f14565b50506000910152565b6000835162003f4b81846020880162003f11565b83519083019062003f6181836020880162003f11565b01949350505050565b80820281158282048414176200081b576200081b62003e3b565b808201808211156200081b576200081b62003e3b565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825162003fed81846020870162003f11565b9190910192915050565b604051601f8201601f1916810167ffffffffffffffff8111828210171562004023576200402362003faa565b604052919050565b600067ffffffffffffffff82111562004048576200404862003faa565b50601f01601f191660200190565b600082601f8301126200406857600080fd5b81356200407f62004079826200402b565b62003ff7565b8181528460208386010111156200409557600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215620040c857600080fd5b833567ffffffffffffffff80821115620040e157600080fd5b620040ef8783880162004056565b945060208601359150808211156200410657600080fd5b50620041158682870162004056565b9250506040840135620041288162003925565b809150509250925092565b600081518084526200414d81602086016020860162003f11565b601f01601f19169290920160200192915050565b60608152600062004176606083018662004133565b82810360208401526200418a818662004133565b91505060ff83166040830152949350505050565b63ffffffff8616815260006001600160a01b03808716602084015280861660408401525060806060830152620036c160808301848662003ea5565b600060208284031215620041ec57600080fd5b5051919050565b818103818111156200081b576200081b62003e3b565b600061010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c08501526200425c8285018762004133565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201526000620042a660608301848662003ea5565b9695505050505050565b600061010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c085015262004304828501878962003ea5565b925080851660e085015250509a9950505050505050505050565b63ffffffff8181168382160190808211156200433e576200433e62003e3b565b5092915050565b600080858511156200435657600080fd5b838611156200436457600080fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620043b25780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a031215620043d657600080fd5b8735620043e381620037ca565b96506020880135620043f581620037ca565b955060408801359450606088013593506080880135620039a28162003925565b600080600080600080600080610100898b0312156200443357600080fd5b88356200444081620037ca565b975060208901356200445281620037ca565b96506040890135955060608901359450608089013562004472816200381f565b935060a0890135620044848162003925565b979a969950949793969295929450505060c08201359160e0013590565b600060208284031215620044b457600080fd5b81516200391e8162003925565b600181815b808511156200452057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562004504576200450462003e3b565b808516156200451257918102915b93841c9390800290620044c6565b509250929050565b60008262004539575060016200081b565b8162004548575060006200081b565b81600181146200456157600281146200456c576200458c565b60019150506200081b565b60ff84111562004580576200458062003e3b565b50506001821b6200081b565b5060208310610133831016604e8410600b8410161715620045b1575081810a6200081b565b620045bd8383620044c1565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620045f257620045f262003e3b565b029392505050565b60006200391e838362004528565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000602082840312156200464a57600080fd5b81516200391e816200381f565b6000602082840312156200466a57600080fd5b815167ffffffffffffffff8111156200468257600080fd5b8201601f810184136200469457600080fd5b8051620046a562004079826200402b565b818152856020838501011115620046bb57600080fd5b620046ce82602083016020860162003f11565b95945050505050565b6020815260006200391e60208301846200413356fe6101006040523480156200001257600080fd5b50604051620019fa380380620019fa83398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161153e620004bc6000396000610237015260008181610307015281816105c0015261068d0152600061053a0152600081816103790152610504015261153e6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b6040516101919190611278565b60405180910390f35b6101ad6101a836600461130d565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad610204366004611337565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad61027736600461130d565b61055c565b61028f61028a36600461130d565b6105a8565b005b6101c161029f366004611373565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d5366004611373565b60056020526000908152604090205481565b610184610666565b61028f6102fd36600461130d565b610675565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c36600461130d565b61072a565b6101ad61036f36600461130d565b6107e1565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611395565b6107ef565b6101c16103bc366004611408565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f9061143b565b80601f016020809104026020016040519081016040528092919081815260200182805461046b9061143b565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610af1565b60019150505b92915050565b6000336104ea858285610c71565b6104f5858585610d2e565b506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146105375761053246610f4f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a39087906114bd565b610af1565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106585760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106628282611017565b5050565b60606004805461043f9061143b565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146107205760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d42726964676500000000000000000000000000000000606482015260840161064f565b61066282826110f0565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107d45760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161064f565b6104f58286868403610af1565b6000336104d0818585610d2e565b834211156108645760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d697400000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866108be836114d0565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610929610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156109ed573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610a6857508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610ada5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e617475726500000000000000000000000000000000000000000000000000606482015260840161064f565b610ae58a8a8a610af1565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610b795760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8216610c025760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d285781811015610d1b5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161064f565b610d288484848403610af1565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610db75760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8216610e405760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610edc5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610d28565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610f7a610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff821661107a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161064f565b806002600082825461108c91906114bd565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166111795760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156112155760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610c64565b600060208083528351808285015260005b818110156112a557858101830151858201604001528201611289565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461130857600080fd5b919050565b6000806040838503121561132057600080fd5b611329836112e4565b946020939093013593505050565b60008060006060848603121561134c57600080fd5b611355846112e4565b9250611363602085016112e4565b9150604084013590509250925092565b60006020828403121561138557600080fd5b61138e826112e4565b9392505050565b600080600080600080600060e0888a0312156113b057600080fd5b6113b9886112e4565b96506113c7602089016112e4565b95506040880135945060608801359350608088013560ff811681146113eb57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561141b57600080fd5b611424836112e4565b9150611432602084016112e4565b90509250929050565b600181811c9082168061144f57607f821691505b602082108103611488577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d661148e565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036115015761150161148e565b506001019056fea2646970667358221220b49a146f369750b7055c494881ee723d063a73d92e8391e12d74eceb27ca91ef64736f6c63430008140033a2646970667358221220ea714517b77a730fcf3b4acad975476f67a3e6cd8f0f84834a89cd92be074e4b64736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/paris/PolygonZkEVMDeployer.json b/compiled-contracts/paris/PolygonZkEVMDeployer.json new file mode 100644 index 000000000..6d250a4ff --- /dev/null +++ b/compiled-contracts/paris/PolygonZkEVMDeployer.json @@ -0,0 +1,191 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonZkEVMDeployer", + "sourceName": "contracts/deployment/PolygonZkEVMDeployer.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [], + "name": "FunctionCall", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newContractAddress", + "type": "address" + } + ], + "name": "NewDeterministicDeployment", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "initBytecode", + "type": "bytes" + } + ], + "name": "deployDeterministic", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "initBytecode", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "dataCall", + "type": "bytes" + } + ], + "name": "deployDeterministicAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "targetAddress", + "type": "address" + }, + { + "internalType": "bytes", + "name": "dataCall", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "functionCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "bytecodeHash", + "type": "bytes32" + } + ], + "name": "predictDeterministicAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b50604051610c71380380610c7183398101604081905261002f91610097565b61003833610047565b61004181610047565b506100c7565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100a957600080fd5b81516001600160a01b03811681146100c057600080fd5b9392505050565b610b9b806100d66000396000f3fe6080604052600436106100705760003560e01c8063715018a61161004e578063715018a6146100e65780638da5cb5b146100fb578063e11ae6cb14610126578063f2fde38b1461013957600080fd5b80632b79805a146100755780634a94d4871461008a5780636d07dbf81461009d575b600080fd5b610088610083366004610927565b610159565b005b6100886100983660046109c7565b6101cb565b3480156100a957600080fd5b506100bd6100b8366004610a1e565b61020d565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b50610088610220565b34801561010757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166100bd565b610088610134366004610a40565b610234565b34801561014557600080fd5b50610088610154366004610a90565b61029b565b610161610357565b600061016e8585856103d8565b905061017a8183610537565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a15050505050565b6101d3610357565b6101de83838361057b565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b90600090a1505050565b600061021983836105a9565b9392505050565b610228610357565b61023260006105b6565b565b61023c610357565b60006102498484846103d8565b60405173ffffffffffffffffffffffffffffffffffffffff821681529091507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a150505050565b6102a3610357565b73ffffffffffffffffffffffffffffffffffffffff811661034b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610354816105b6565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610232576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610342565b600083471015610444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610342565b81516000036104af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610342565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116610219576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610342565b6060610219838360006040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c6564000081525061062b565b60606105a1848484604051806060016040528060298152602001610b3d6029913961062b565b949350505050565b6000610219838330610744565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156106bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610342565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516106e69190610acf565b60006040518083038185875af1925050503d8060008114610723576040519150601f19603f3d011682016040523d82523d6000602084013e610728565b606091505b50915091506107398783838761076e565b979650505050505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b606083156108045782516000036107fd5773ffffffffffffffffffffffffffffffffffffffff85163b6107fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610342565b50816105a1565b6105a183838151156108195781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103429190610aeb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261088d57600080fd5b813567ffffffffffffffff808211156108a8576108a861084d565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156108ee576108ee61084d565b8160405283815286602085880101111561090757600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806080858703121561093d57600080fd5b8435935060208501359250604085013567ffffffffffffffff8082111561096357600080fd5b61096f8883890161087c565b9350606087013591508082111561098557600080fd5b506109928782880161087c565b91505092959194509250565b803573ffffffffffffffffffffffffffffffffffffffff811681146109c257600080fd5b919050565b6000806000606084860312156109dc57600080fd5b6109e58461099e565b9250602084013567ffffffffffffffff811115610a0157600080fd5b610a0d8682870161087c565b925050604084013590509250925092565b60008060408385031215610a3157600080fd5b50508035926020909101359150565b600080600060608486031215610a5557600080fd5b8335925060208401359150604084013567ffffffffffffffff811115610a7a57600080fd5b610a868682870161087c565b9150509250925092565b600060208284031215610aa257600080fd5b6102198261099e565b60005b83811015610ac6578181015183820152602001610aae565b50506000910152565b60008251610ae1818460208701610aab565b9190910192915050565b6020815260008251806020840152610b0a816040850160208701610aab565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220964619cee0e0baf94c6f8763f013be157da5d54c89e5cff4a8caf4266e13f13a64736f6c63430008140033", + "deployedBytecode": "0x6080604052600436106100705760003560e01c8063715018a61161004e578063715018a6146100e65780638da5cb5b146100fb578063e11ae6cb14610126578063f2fde38b1461013957600080fd5b80632b79805a146100755780634a94d4871461008a5780636d07dbf81461009d575b600080fd5b610088610083366004610927565b610159565b005b6100886100983660046109c7565b6101cb565b3480156100a957600080fd5b506100bd6100b8366004610a1e565b61020d565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b50610088610220565b34801561010757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166100bd565b610088610134366004610a40565b610234565b34801561014557600080fd5b50610088610154366004610a90565b61029b565b610161610357565b600061016e8585856103d8565b905061017a8183610537565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a15050505050565b6101d3610357565b6101de83838361057b565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b90600090a1505050565b600061021983836105a9565b9392505050565b610228610357565b61023260006105b6565b565b61023c610357565b60006102498484846103d8565b60405173ffffffffffffffffffffffffffffffffffffffff821681529091507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a150505050565b6102a3610357565b73ffffffffffffffffffffffffffffffffffffffff811661034b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610354816105b6565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610232576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610342565b600083471015610444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610342565b81516000036104af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610342565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116610219576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610342565b6060610219838360006040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c6564000081525061062b565b60606105a1848484604051806060016040528060298152602001610b3d6029913961062b565b949350505050565b6000610219838330610744565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156106bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610342565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516106e69190610acf565b60006040518083038185875af1925050503d8060008114610723576040519150601f19603f3d011682016040523d82523d6000602084013e610728565b606091505b50915091506107398783838761076e565b979650505050505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b606083156108045782516000036107fd5773ffffffffffffffffffffffffffffffffffffffff85163b6107fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610342565b50816105a1565b6105a183838151156108195781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103429190610aeb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261088d57600080fd5b813567ffffffffffffffff808211156108a8576108a861084d565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156108ee576108ee61084d565b8160405283815286602085880101111561090757600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806080858703121561093d57600080fd5b8435935060208501359250604085013567ffffffffffffffff8082111561096357600080fd5b61096f8883890161087c565b9350606087013591508082111561098557600080fd5b506109928782880161087c565b91505092959194509250565b803573ffffffffffffffffffffffffffffffffffffffff811681146109c257600080fd5b919050565b6000806000606084860312156109dc57600080fd5b6109e58461099e565b9250602084013567ffffffffffffffff811115610a0157600080fd5b610a0d8682870161087c565b925050604084013590509250925092565b60008060408385031215610a3157600080fd5b50508035926020909101359150565b600080600060608486031215610a5557600080fd5b8335925060208401359150604084013567ffffffffffffffff811115610a7a57600080fd5b610a868682870161087c565b9150509250925092565b600060208284031215610aa257600080fd5b6102198261099e565b60005b83811015610ac6578181015183820152602001610aae565b50506000910152565b60008251610ae1818460208701610aab565b9190910192915050565b6020815260008251806020840152610b0a816040850160208701610aab565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220964619cee0e0baf94c6f8763f013be157da5d54c89e5cff4a8caf4266e13f13a64736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/paris/PolygonZkEVMGlobalExitRoot.json b/compiled-contracts/paris/PolygonZkEVMGlobalExitRoot.json new file mode 100644 index 000000000..7990be894 --- /dev/null +++ b/compiled-contracts/paris/PolygonZkEVMGlobalExitRoot.json @@ -0,0 +1,148 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonZkEVMGlobalExitRoot", + "sourceName": "contracts/PolygonZkEVMGlobalExitRoot.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_rollupAddress", + "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": "rollupAddress", + "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": "0x60c060405234801561001057600080fd5b506040516103f83803806103f883398101604081905261002f91610062565b6001600160a01b0391821660a05216608052610095565b80516001600160a01b038116811461005d57600080fd5b919050565b6000806040838503121561007557600080fd5b61007e83610046565b915061008c60208401610046565b90509250929050565b60805160a0516103316100c76000396000818160e901526101bd015260008181610135015261017401526103316000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c806333d6247d1161005b57806333d6247d146100c75780633ed691ef146100dc5780635ec6a8df146100e4578063a3c573eb1461013057600080fd5b806301fd904414610082578063257b36321461009e578063319cf735146100be575b600080fd5b61008b60005481565b6040519081526020015b60405180910390f35b61008b6100ac3660046102e2565b60026020526000908152604090205481565b61008b60015481565b6100da6100d53660046102e2565b610157565b005b61008b6102a6565b61010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610095565b61010b7f000000000000000000000000000000000000000000000000000000000000000081565b60005460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101a65750600182905581610222565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101f0576000839055829150610222565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051602080820184905281830185905282518083038401815260609092019092528051910120600090600081815260026020526040812054919250036102a05760008181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b60006102dd600154600054604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b6000602082840312156102f457600080fd5b503591905056fea264697066735822122066368a84a416778eb0d212b7acdeed4f6b4a8b676fc470e5579fc4c25caed2f364736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c806333d6247d1161005b57806333d6247d146100c75780633ed691ef146100dc5780635ec6a8df146100e4578063a3c573eb1461013057600080fd5b806301fd904414610082578063257b36321461009e578063319cf735146100be575b600080fd5b61008b60005481565b6040519081526020015b60405180910390f35b61008b6100ac3660046102e2565b60026020526000908152604090205481565b61008b60015481565b6100da6100d53660046102e2565b610157565b005b61008b6102a6565b61010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610095565b61010b7f000000000000000000000000000000000000000000000000000000000000000081565b60005460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101a65750600182905581610222565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101f0576000839055829150610222565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051602080820184905281830185905282518083038401815260609092019092528051910120600090600081815260026020526040812054919250036102a05760008181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b60006102dd600154600054604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b6000602082840312156102f457600080fd5b503591905056fea264697066735822122066368a84a416778eb0d212b7acdeed4f6b4a8b676fc470e5579fc4c25caed2f364736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2.json b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2.json new file mode 100644 index 000000000..6c5ff823e --- /dev/null +++ b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2.json @@ -0,0 +1,85 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonZkEVMGlobalExitRootL2", + "sourceName": "contracts/PolygonZkEVMGlobalExitRootL2.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_bridgeAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "OnlyAllowedContracts", + "type": "error" + }, + { + "inputs": [], + "name": "bridgeAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "globalExitRootMap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastRollupExitRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "newRoot", + "type": "bytes32" + } + ], + "name": "updateExitRoot", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60a060405234801561001057600080fd5b5060405161024238038061024283398101604081905261002f91610040565b6001600160a01b0316608052610070565b60006020828403121561005257600080fd5b81516001600160a01b038116811461006957600080fd5b9392505050565b6080516101b16100916000396000818160a7015261010601526101b16000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806301fd904414610051578063257b36321461006d57806333d6247d1461008d578063a3c573eb146100a2575b600080fd5b61005a60015481565b6040519081526020015b60405180910390f35b61005a61007b366004610162565b60006020819052908152604090205481565b6100a061009b366004610162565b6100ee565b005b6100c97f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610064565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461015d576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b60006020828403121561017457600080fd5b503591905056fea2646970667358221220ea2171e2c85c8bff947affc409ef6fc6a8fe82fb8c174ddeda988651e595d66564736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806301fd904414610051578063257b36321461006d57806333d6247d1461008d578063a3c573eb146100a2575b600080fd5b61005a60015481565b6040519081526020015b60405180910390f35b61005a61007b366004610162565b60006020819052908152604090205481565b6100a061009b366004610162565b6100ee565b005b6100c97f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610064565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461015d576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b60006020828403121561017457600080fd5b503591905056fea2646970667358221220ea2171e2c85c8bff947affc409ef6fc6a8fe82fb8c174ddeda988651e595d66564736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2Mock.json b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2Mock.json new file mode 100644 index 000000000..5b5d7d1a5 --- /dev/null +++ b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2Mock.json @@ -0,0 +1,116 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonZkEVMGlobalExitRootL2Mock", + "sourceName": "contracts/mocks/PolygonZkEVMGlobalExitRootL2Mock.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_bridgeAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "OnlyAllowedContracts", + "type": "error" + }, + { + "inputs": [], + "name": "bridgeAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "globalExitRootMap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastRollupExitRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "newRoot", + "type": "bytes32" + } + ], + "name": "setExitRoot", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "globalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + } + ], + "name": "setLastGlobalExitRoot", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "newRoot", + "type": "bytes32" + } + ], + "name": "updateExitRoot", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60a060405234801561001057600080fd5b506040516102b93803806102b983398101604081905261002f91610040565b6001600160a01b0316608052610070565b60006020828403121561005257600080fd5b81516001600160a01b038116811461006957600080fd5b9392505050565b60805161022761009260003960008181610100015261015f01526102276000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c806333d6247d1161005057806333d6247d146100c857806396e07459146100db578063a3c573eb146100fb57600080fd5b806301fd904414610077578063116c40c314610093578063257b3632146100a8575b600080fd5b61008060015481565b6040519081526020015b60405180910390f35b6100a66100a13660046101b6565b600155565b005b6100806100b63660046101b6565b60006020819052908152604090205481565b6100a66100d63660046101b6565b610147565b6100a66100e93660046101cf565b60009182526020829052604090912055565b6101227f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161008a565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146100a1576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602082840312156101c857600080fd5b5035919050565b600080604083850312156101e257600080fd5b5050803592602090910135915056fea26469706673582212203dc131ea7b3c9a0e0d9f97c222b405f0086fc9beecf67bf79956cd48dcb6461d64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100725760003560e01c806333d6247d1161005057806333d6247d146100c857806396e07459146100db578063a3c573eb146100fb57600080fd5b806301fd904414610077578063116c40c314610093578063257b3632146100a8575b600080fd5b61008060015481565b6040519081526020015b60405180910390f35b6100a66100a13660046101b6565b600155565b005b6100806100b63660046101b6565b60006020819052908152604090205481565b6100a66100d63660046101b6565b610147565b6100a66100e93660046101cf565b60009182526020829052604090912055565b6101227f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161008a565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146100a1576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602082840312156101c857600080fd5b5035919050565b600080604083850312156101e257600080fd5b5050803592602090910135915056fea26469706673582212203dc131ea7b3c9a0e0d9f97c222b405f0086fc9beecf67bf79956cd48dcb6461d64736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/paris/PolygonZkEVMGlobalExitRootMock.json b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootMock.json new file mode 100644 index 000000000..d3d496f00 --- /dev/null +++ b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootMock.json @@ -0,0 +1,179 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonZkEVMGlobalExitRootMock", + "sourceName": "contracts/mocks/PolygonZkEVMGlobalExitRootMock.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_rollupAddress", + "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": "rollupAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "globalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "name": "setGlobalExitRoot", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "name": "setLastGlobalExitRoot", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "newRoot", + "type": "bytes32" + } + ], + "name": "updateExitRoot", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60c060405234801561001057600080fd5b5060405161049538038061049583398101604081905261002f91610062565b6001600160a01b0391821660a05216608052610095565b80516001600160a01b038116811461005d57600080fd5b919050565b6000806040838503121561007557600080fd5b61007e83610046565b915061008c60208401610046565b90509250929050565b60805160a0516103cd6100c860003960008181610142015261023701526000818161018e01526101ee01526103cd6000f3fe608060405234801561001057600080fd5b50600436106100a35760003560e01c806333d6247d116100765780635bcef6731161005b5780635bcef6731461011d5780635ec6a8df1461013d578063a3c573eb1461018957600080fd5b806333d6247d146101025780633ed691ef1461011557600080fd5b806301fd9044146100a8578063051a9e28146100c4578063257b3632146100d9578063319cf735146100f9575b600080fd5b6100b160005481565b6040519081526020015b60405180910390f35b6100d76100d236600461035c565b6101b0565b005b6100b16100e736600461035c565b60026020526000908152604090205481565b6100b160015481565b6100d761011036600461035c565b6101d1565b6100b1610320565b6100d761012b366004610375565b60009182526002602052604090912055565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100bb565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b80600260006101bd610320565b815260208101919091526040016000205550565b60005460015473ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163303610220575060018290558161029c565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361026a57600083905582915061029c565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101206000906000818152600260205260408120549192500361031a5760008181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b6000610357600154600054604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b60006020828403121561036e57600080fd5b5035919050565b6000806040838503121561038857600080fd5b5050803592602090910135915056fea2646970667358221220eeb4ec189dc407e366db39253f2dd748a5e379bc3232254e15b86d12d0001bc064736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a35760003560e01c806333d6247d116100765780635bcef6731161005b5780635bcef6731461011d5780635ec6a8df1461013d578063a3c573eb1461018957600080fd5b806333d6247d146101025780633ed691ef1461011557600080fd5b806301fd9044146100a8578063051a9e28146100c4578063257b3632146100d9578063319cf735146100f9575b600080fd5b6100b160005481565b6040519081526020015b60405180910390f35b6100d76100d236600461035c565b6101b0565b005b6100b16100e736600461035c565b60026020526000908152604090205481565b6100b160015481565b6100d761011036600461035c565b6101d1565b6100b1610320565b6100d761012b366004610375565b60009182526002602052604090912055565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100bb565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b80600260006101bd610320565b815260208101919091526040016000205550565b60005460015473ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163303610220575060018290558161029c565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361026a57600083905582915061029c565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101206000906000818152600260205260408120549192500361031a5760008181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b6000610357600154600054604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b60006020828403121561036e57600080fd5b5035919050565b6000806040838503121561038857600080fd5b5050803592602090910135915056fea2646970667358221220eeb4ec189dc407e366db39253f2dd748a5e379bc3232254e15b86d12d0001bc064736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/paris/PolygonZkEVMGlobalExitRootV2.json b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootV2.json new file mode 100644 index 000000000..918c6bdaa --- /dev/null +++ b/compiled-contracts/paris/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": "0x60c060405234801561001057600080fd5b506040516103f83803806103f883398101604081905261002f91610062565b6001600160a01b0391821660a05216608052610095565b80516001600160a01b038116811461005d57600080fd5b919050565b6000806040838503121561007557600080fd5b61007e83610046565b915061008c60208401610046565b90509250929050565b60805160a0516103316100c76000396000818160e901526101bd015260008181610135015261017401526103316000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c806333d6247d1161005b57806333d6247d146100c75780633ed691ef146100dc57806349b7b802146100e4578063a3c573eb1461013057600080fd5b806301fd904414610082578063257b36321461009e578063319cf735146100be575b600080fd5b61008b60005481565b6040519081526020015b60405180910390f35b61008b6100ac3660046102e2565b60026020526000908152604090205481565b61008b60015481565b6100da6100d53660046102e2565b610157565b005b61008b6102a6565b61010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610095565b61010b7f000000000000000000000000000000000000000000000000000000000000000081565b60005460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101a65750600182905581610222565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101f0576000839055829150610222565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051602080820184905281830185905282518083038401815260609092019092528051910120600090600081815260026020526040812054919250036102a05760008181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b60006102dd600154600054604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b6000602082840312156102f457600080fd5b503591905056fea26469706673582212207a69b0f33aa2ba536ab8e8a536307d3770b547eb31562d13bb859bbb91a3899d64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c806333d6247d1161005b57806333d6247d146100c75780633ed691ef146100dc57806349b7b802146100e4578063a3c573eb1461013057600080fd5b806301fd904414610082578063257b36321461009e578063319cf735146100be575b600080fd5b61008b60005481565b6040519081526020015b60405180910390f35b61008b6100ac3660046102e2565b60026020526000908152604090205481565b61008b60015481565b6100da6100d53660046102e2565b610157565b005b61008b6102a6565b61010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610095565b61010b7f000000000000000000000000000000000000000000000000000000000000000081565b60005460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101a65750600182905581610222565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101f0576000839055829150610222565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051602080820184905281830185905282518083038401815260609092019092528051910120600090600081815260026020526040812054919250036102a05760008181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b60006102dd600154600054604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b6000602082840312156102f457600080fd5b503591905056fea26469706673582212207a69b0f33aa2ba536ab8e8a536307d3770b547eb31562d13bb859bbb91a3899d64736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/paris/PolygonZkEVMMock.json b/compiled-contracts/paris/PolygonZkEVMMock.json new file mode 100644 index 000000000..652ee5fb6 --- /dev/null +++ b/compiled-contracts/paris/PolygonZkEVMMock.json @@ -0,0 +1,1942 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonZkEVMMock", + "sourceName": "contracts/mocks/PolygonZkEVMMock.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRoot", + "name": "_globalExitRootManager", + "type": "address" + }, + { + "internalType": "contract IERC20Upgradeable", + "name": "_matic", + "type": "address" + }, + { + "internalType": "contract IVerifierRollup", + "name": "_rollupVerifier", + "type": "address" + }, + { + "internalType": "contract IPolygonZkEVMBridge", + "name": "_bridgeAddress", + "type": "address" + }, + { + "internalType": "uint64", + "name": "_chainID", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "_forkID", + "type": "uint64" + } + ], + "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": "GlobalExitRootNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "HaltTimeoutNotExpired", + "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": "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": "OldAccInputHashDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "OldStateRootDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyAdmin", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyEmergencyState", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyNotEmergencyState", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyPendingAdmin", + "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": "numBatch", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "stateRoot", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint64", + "name": "pendingStateNum", + "type": "uint64" + } + ], + "name": "ConsolidatePendingState", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "EmergencyStateActivated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "EmergencyStateDeactivated", + "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" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "stateRoot", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "aggregator", + "type": "address" + } + ], + "name": "OverridePendingState", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "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": "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": "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": "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": "uint64", + "name": "newVerifyBatchTimeTarget", + "type": "uint64" + } + ], + "name": "SetVerifyBatchTimeTarget", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newPendingAdmin", + "type": "address" + } + ], + "name": "TransferAdminRole", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "numBatch", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "forkID", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "string", + "name": "version", + "type": "string" + } + ], + "name": "UpdateZkEVMVersion", + "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" + }, + { + "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": "VerifyBatchesTrustedAggregator", + "type": "event" + }, + { + "inputs": [], + "name": "acceptAdminRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "sequencedBatchNum", + "type": "uint64" + } + ], + "name": "activateEmergencyState", + "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": "batchFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "name": "batchNumToStateRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "bridgeAddress", + "outputs": [ + { + "internalType": "contract IPolygonZkEVMBridge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "currentAccInputHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "globalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "timestamp", + "type": "uint64" + }, + { + "internalType": "address", + "name": "sequencerAddress", + "type": "address" + } + ], + "name": "calculateAccInputHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "calculateRewardPerBatch", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "chainID", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newStateRoot", + "type": "uint256" + } + ], + "name": "checkStateRootInsidePrime", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "pendingStateNum", + "type": "uint64" + } + ], + "name": "consolidatePendingState", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "deactivateEmergencyState", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "maticAmount", + "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": "forkID", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getForcedBatchFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "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": [], + "name": "getLastVerifiedBatch", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "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" + } + ], + "name": "getNextSnarkInput", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalExitRootManager", + "outputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRoot", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "admin", + "type": "address" + }, + { + "internalType": "address", + "name": "trustedSequencer", + "type": "address" + }, + { + "internalType": "uint64", + "name": "pendingStateTimeout", + "type": "uint64" + }, + { + "internalType": "address", + "name": "trustedAggregator", + "type": "address" + }, + { + "internalType": "uint64", + "name": "trustedAggregatorTimeout", + "type": "uint64" + } + ], + "internalType": "struct PolygonZkEVM.InitializePackedParameters", + "name": "initializePackedParameters", + "type": "tuple" + }, + { + "internalType": "bytes32", + "name": "genesisRoot", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "_trustedSequencerURL", + "type": "string" + }, + { + "internalType": "string", + "name": "_networkName", + "type": "string" + }, + { + "internalType": "string", + "name": "_version", + "type": "string" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "isEmergencyState", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isForcedBatchDisallowed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "pendingStateNum", + "type": "uint64" + } + ], + "name": "isPendingStateConsolidable", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastBatchSequenced", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "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": "lastPendingState", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastPendingStateConsolidated", + "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": "lastVerifiedBatch", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "matic", + "outputs": [ + { + "internalType": "contract IERC20Upgradeable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "multiplierBatchFee", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "networkName", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "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": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingAdmin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingStateTimeout", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "pendingStateTransitions", + "outputs": [ + { + "internalType": "uint64", + "name": "timestamp", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "lastVerifiedBatch", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "exitRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "stateRoot", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "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": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "rollupVerifier", + "outputs": [ + { + "internalType": "contract IVerifierRollup", + "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 PolygonZkEVM.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 PolygonZkEVM.ForcedBatchData[]", + "name": "batches", + "type": "tuple[]" + } + ], + "name": "sequenceForceBatches", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "name": "sequencedBatches", + "outputs": [ + { + "internalType": "bytes32", + "name": "accInputHash", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "sequencedTimestamp", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "previousLastBatchSequenced", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "newforceBatchTimeout", + "type": "uint64" + } + ], + "name": "setForceBatchTimeout", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "newMultiplierBatchFee", + "type": "uint16" + } + ], + "name": "setMultiplierBatchFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_networkName", + "type": "string" + } + ], + "name": "setNetworkName", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "newPendingStateTimeout", + "type": "uint64" + } + ], + "name": "setPendingStateTimeout", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "_numBatch", + "type": "uint64" + } + ], + "name": "setSequencedBatch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "batchNum", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "accInputData", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "timestamp", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "lastPendingStateConsolidated", + "type": "uint64" + } + ], + "name": "setSequencedBatches", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "newStateRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "batchNum", + "type": "uint64" + } + ], + "name": "setStateRoot", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newTrustedAggregator", + "type": "address" + } + ], + "name": "setTrustedAggregator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "newTrustedAggregatorTimeout", + "type": "uint64" + } + ], + "name": "setTrustedAggregatorTimeout", + "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": "uint64", + "name": "_numBatch", + "type": "uint64" + } + ], + "name": "setVerifiedBatch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "newVerifyBatchTimeTarget", + "type": "uint64" + } + ], + "name": "setVerifyBatchTimeTarget", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newPendingAdmin", + "type": "address" + } + ], + "name": "transferAdminRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "trustedAggregator", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "trustedAggregatorTimeout", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "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" + }, + { + "inputs": [ + { + "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": "uint256[2]", + "name": "proofA", + "type": "uint256[2]" + }, + { + "internalType": "uint256[2][2]", + "name": "proofB", + "type": "uint256[2][2]" + }, + { + "internalType": "uint256[2]", + "name": "proofC", + "type": "uint256[2]" + } + ], + "name": "trustedVerifyBatchesMock", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "newLastVerifiedBatch", + "type": "uint64" + } + ], + "name": "updateBatchFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "verifyBatchTimeTarget", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "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": "bytes32[24]", + "name": "proof", + "type": "bytes32[24]" + } + ], + "name": "verifyBatches", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "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": "bytes32[24]", + "name": "proof", + "type": "bytes32[24]" + } + ], + "name": "verifyBatchesTrustedAggregator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101406040523480156200001257600080fd5b5060405162007064380380620070648339810160408190526200003591620000a5565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b0391821661010052166101205262000131565b6001600160a01b03811681146200008557600080fd5b50565b80516001600160401b0381168114620000a057600080fd5b919050565b60008060008060008060c08789031215620000bf57600080fd5b8651620000cc816200006f565b6020880151909650620000df816200006f565b6040880151909550620000f2816200006f565b606088015190945062000105816200006f565b9250620001156080880162000088565b91506200012560a0880162000088565b90509295509295509295565b60805160a05160c05160e0516101005161012051616e5e620002066000396000818161083001528181611a880152613ec80152600081816109c30152611a5e01526000818161098901528181612a2d015281816145610152615a90015260008181610b550152818161173801528181611bfb01528181611dcc0152818161263501528181612e06015281816147d901526155df015260008181610c1501528181614f3a0152615392015260008181610a92015281816129fb0152818161333a015281816147ad01526150280152616e5e6000f3fe608060405234801561001057600080fd5b506004361061048d5760003560e01c80638c3d73011161026b578063c754c7ed11610150578063e7a7ed02116100c8578063f14916d611610097578063f851a4401161007c578063f851a44014610c9d578063f8b823e414610cbd578063fe16564f14610cc657600080fd5b8063f14916d614610c77578063f2fde38b14610c8a57600080fd5b8063e7a7ed0214610be0578063e8bf92ed14610c10578063eaeb077b14610c37578063ed6b010414610c4a57600080fd5b8063d2e129f91161011f578063d939b31511610104578063d939b31514610b9d578063dbc1697614610bc5578063e0d1744114610bcd57600080fd5b8063d2e129f914610b77578063d8d1091b14610b8a57600080fd5b8063c754c7ed14610ae2578063c89e42df14610b0e578063cfa8ed4714610b21578063d02103ca14610b5057600080fd5b8063ada8f919116101e3578063b4f77ea9116101b2578063ba58ae3911610197578063ba58ae3914610ab4578063c0cad30214610ac7578063c0ed84e014610ada57600080fd5b8063b4f77ea914610a7a578063b6b0b09714610a8d57600080fd5b8063ada8f919146109ab578063adc879e9146109be578063afd23cbe146109e5578063b4d63f5814610a1357600080fd5b80639aa972a31161023a5780639c9f3dfe1161021f5780639c9f3dfe1461095e578063a066215c14610971578063a3c573eb1461098457600080fd5b80639aa972a3146109385780639b7967601461094b57600080fd5b80638c3d7301146108f75780638da5cb5b146108ff57806396dc3d391461091d57806399f5634e1461093057600080fd5b80634a1a89a711610391578063621dd411116103095780637215541a116102d8578063831c7ead116102bd578063831c7ead1461082b578063837a473814610852578063841b24d7146108c757600080fd5b80637215541a146108045780637fcb36531461081757600080fd5b8063621dd411146107b65780636b8616ce146107c95780636ff512cc146107e9578063715018a6146107fc57600080fd5b8063542028d5116103605780635e9145c9116103455780635e9145c9146107935780635ec91958146107a657806360469169146107ae57600080fd5b8063542028d5146106ea578063574f649e146106f257600080fd5b80634a1a89a7146106845780634a910e6a146106a45780634e487706146106b75780635392c5e0146106ca57600080fd5b80632678224711610424578063383b3be8116103f3578063423fa856116103d8578063423fa856146106285780634560526714610648578063458c04771461067057600080fd5b8063383b3be814610602578063394218e91461061557600080fd5b8063267822471461056b57806329878983146105b05780632b0006fa146105dc5780632c1f816a146105ef57600080fd5b806315064c961161046057806315064c96146105145780631816b7e51461053157806319d8ac6114610544578063220d78991461055857600080fd5b80630a0d9fbe146104925780630eaa86ea146104c9578063107bf28c146104ea57806310a01a72146104ff575b600080fd5b606f546104ab90610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6104dc6104d7366004616066565b610cd9565b6040519081526020016104c0565b6104f26111b1565b6040516104c09190616129565b61051261050d36600461615a565b61123f565b005b606f546105219060ff1681565b60405190151581526020016104c0565b61051261053f3660046161ed565b6117f7565b6073546104ab9067ffffffffffffffff1681565b6104f2610566366004616211565b61190f565b607b5461058b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104c0565b60745461058b9068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6105126105ea366004616270565b611ae6565b6105126105fd3660046162d8565b611cb6565b610521610610366004616352565b611ec4565b610512610623366004616352565b611f1a565b6073546104ab9068010000000000000000900467ffffffffffffffff1681565b6073546104ab90700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546104ab9067ffffffffffffffff1681565b6079546104ab9068010000000000000000900467ffffffffffffffff1681565b6105126106b2366004616352565b61209e565b6105126106c5366004616352565b612151565b6104dc6106d8366004616352565b60756020526000908152604090205481565b6104f26122d5565b6104dc61070036600461646b565b835160209485012060408051808701979097528681019190915260608087019490945260c09290921b7fffffffffffffffff00000000000000000000000000000000000000000000000016608086015290911b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888401528051808403607c018152609c9093019052815191012090565b6105126107a1366004616529565b6122e2565b610512612aec565b6104dc612bec565b6105126107c4366004616270565b612c02565b6104dc6107d7366004616352565b60716020526000908152604090205481565b6105126107f736600461657d565b612f8a565b61051261305f565b610512610812366004616352565b613073565b6074546104ab9067ffffffffffffffff1681565b6104ab7f000000000000000000000000000000000000000000000000000000000000000081565b61089b610860366004616598565b60786020526000908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016104c0565b6079546104ab907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6105126131e3565b60335473ffffffffffffffffffffffffffffffffffffffff1661058b565b61051261092b366004616352565b6132af565b6104dc6132f2565b6105126109463660046162d8565b61344b565b610512610959366004616352565b6134fc565b61051261096c366004616352565b61354b565b61051261097f366004616352565b6136c7565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b6105126109b936600461657d565b6137cd565b6104ab7f000000000000000000000000000000000000000000000000000000000000000081565b606f54610a00906901000000000000000000900461ffff1681565b60405161ffff90911681526020016104c0565b610a54610a21366004616352565b6072602052600090815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016104c0565b610512610a88366004616352565b613891565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b610521610ac2366004616598565b6138a2565b610512610ad53660046165b1565b61392c565b6104ab613944565b607b546104ab9074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b610512610b1c3660046165b1565b613999565b606f5461058b906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b610512610b85366004616628565b613a26565b610512610b983660046166db565b613f6c565b6079546104ab90700100000000000000000000000000000000900467ffffffffffffffff1681565b61051261450e565b610512610bdb36600461671d565b6145e7565b6073546104ab907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b610512610c4536600461676a565b614677565b607b54610521907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b610512610c8536600461657d565b614a6d565b610512610c9836600461657d565b614b3f565b607a5461058b9073ffffffffffffffffffffffffffffffffffffffff1681565b6104dc60705481565b610512610cd43660046167b6565b614bf3565b6000806000610ce6613944565b905067ffffffffffffffff881615610eb35760795467ffffffffffffffff9081169089161115610dc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a4015b60405180910390fd5b67ffffffffffffffff8089166000908152607860205260409020600281015481549094509091898116680100000000000000009092041614610ead576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610dba565b5061104c565b67ffffffffffffffff8716600090815260756020526040902054915081610f82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610dba565b8067ffffffffffffffff168767ffffffffffffffff16111561104c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610dba565b8067ffffffffffffffff168667ffffffffffffffff1611611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610dba565b6000611124888888868961190f565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161115991906167e2565b602060405180830381855afa158015611176573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061119991906167fe565b6111a39190616846565b9a9950505050505050505050565b607780546111be9061685a565b80601f01602080910402602001604051908101604052809291908181526020018280546111ea9061685a565b80156112375780601f1061120c57610100808354040283529160200191611237565b820191906000526020600020905b81548152906001019060200180831161121a57829003601f168201915b505050505081565b611247614c16565b600080611252613944565b905067ffffffffffffffff8a161561141a5760795467ffffffffffffffff908116908b16111561132a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a401610dba565b67ffffffffffffffff808b1660009081526078602052604090206002810154815490945090918b8116680100000000000000009092041614611414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610dba565b506115b3565b67ffffffffffffffff89166000908152607560205260409020549150816114e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610dba565b8067ffffffffffffffff168967ffffffffffffffff1611156115b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610dba565b8067ffffffffffffffff168867ffffffffffffffff161161167c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610dba565b600061168b8a8a8a868b61190f565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8c81169182179092556000908152607560205260409020899055607954919250161561170957607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018990527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b15801561179157600080fd5b505af11580156117a5573d6000803e3d6000fd5b505060405189815233925067ffffffffffffffff8c1691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe9060200160405180910390a35050505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611848576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff16108061186157506103ff8161ffff16115b15611898576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086166000818152607260205260408082205493881682529020546060929115801590611943575081155b1561197a576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806119b1576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119ba846138a2565b6119f0576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611b43576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b51868686868686614c97565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615611bcc57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015611c5457600080fd5b505af1158015611c68573d6000803e3d6000fd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611d13576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d228787878787878761505b565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615611d9d57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015611e2557600080fd5b505af1158015611e39573d6000803e3d6000fd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff82811660009081526078602052604081205490924292611f0892700100000000000000000000000000000000909204811691166168dc565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611f6b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611fb2576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166120215760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610612021576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001611904565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461214557606f5460ff1615612106576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61210f81611ec4565b612145576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61214e81615495565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146121a2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156121e9576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661225457607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610612254576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001611904565b607680546111be9061685a565b606f5460ff161561231f576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461237f576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160008190036123bb576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156123f7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000082048116600081815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b868110156128475760008a8a8381811061245f5761245f616904565b90506020028101906124719190616933565b61247a90616967565b8051805160209091012060608201519192509067ffffffffffffffff16156125f257856124a6816169f4565b965050600081836020015184606001516040516020016124fe93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260719093529120549091508114612587576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff80881660009081526071602052604080822091909155606085015190850151908216911610156125ec576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061272f565b6020820151158015906126b9575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015612693573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b791906167fe565b155b156126f0576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c0101561272f576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080612762575042826040015167ffffffffffffffff16115b15612799576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015197505050808061283f90616a1b565b915050612443565b5061285286856168dc565b60735490945067ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690841611156128bb576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006128c78285616a53565b6128db9067ffffffffffffffff1688616a74565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d861660008181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c84169116179302929092179055909150828116908516146129d157607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b612a233330836070546129e49190616a87565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906156a8565b612a2b61578a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612a9357600080fd5b505af1158015612aa7573d6000803e3d6000fd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612b3d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16612b99576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60006070546064612bfd9190616a87565b905090565b606f5460ff1615612c3f576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581166000908152607260205260409020600101544292612c8c927801000000000000000000000000000000000000000000000000909104811691166168dc565b67ffffffffffffffff161115612cce576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612cdb8686616a53565b67ffffffffffffffff161115612d1d576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d2b868686868686614c97565b612d3484615837565b607954700100000000000000000000000000000000900467ffffffffffffffff16600003612e7c57607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615612dd757607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015612e5f57600080fd5b505af1158015612e73573d6000803e3d6000fd5b50505050612f4c565b612e8461578a565b6079805467ffffffffffffffff16906000612e9e836169f4565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487166000908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001611ca6565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612fdb576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001611904565b613067614c16565b6130716000615a17565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146131db57600061309c613944565b90508067ffffffffffffffff168267ffffffffffffffff16116130eb576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000090910481169083161180613131575067ffffffffffffffff80831660009081526072602052604090206001015416155b15613168576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff80831660009081526072602052604090206001015442916131979162093a8091166168dc565b67ffffffffffffffff1611156131d9576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61214e615a8e565b607b5473ffffffffffffffffffffffffffffffffffffffff163314613234576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6132b7614c16565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015613381573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133a591906167fe565b905060006133b1613944565b60735467ffffffffffffffff6801000000000000000082048116916134099170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416616a53565b61341391906168dc565b61341d9190616a53565b67ffffffffffffffff1690508060000361343a5760009250505090565b6134448183616a9e565b9250505090565b606f5460ff1615613488576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134978787878787878761505b565b67ffffffffffffffff84166000908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16134f3615a8e565b50505050505050565b613504614c16565b6073805467ffffffffffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461359c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156135e3576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661364a5760795467ffffffffffffffff70010000000000000000000000000000000090910481169082161061364a576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001611904565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613718576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff16111561375f576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001611904565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461381e576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001611904565b613899614c16565b61214e81615837565b600067ffffffff0000000167ffffffffffffffff83161080156138da575067ffffffff00000001604083901c67ffffffffffffffff16105b80156138fb575067ffffffff00000001608083901c67ffffffffffffffff16105b8015613912575067ffffffff0000000160c083901c105b1561391f57506001919050565b506000919050565b919050565b613934614c16565b60776139408282616b00565b5050565b60795460009067ffffffffffffffff1615613988575060795467ffffffffffffffff9081166000908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146139ea576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60766139f68282616b00565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516119049190616129565b600054610100900460ff1615808015613a465750600054600160ff909116105b80613a605750303b158015613a60575060005460ff166001145b613aec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610dba565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015613b4a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b613b57602088018861657d565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055613bac604088016020890161657d565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055613c11608088016060890161657d565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790556000805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076613c9c8682616b00565b506077613ca98582616b00565b5062093a80613cbe6060890160408a01616352565b67ffffffffffffffff161115613d00576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d106060880160408901616352565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80613d7260a0890160808a01616352565b67ffffffffffffffff161115613db4576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613dc460a0880160808901616352565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613ea3615b16565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd660007f00000000000000000000000000000000000000000000000000000000000000008585604051613ef99493929190616c63565b60405180910390a180156134f357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613fc9576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614006576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003614042576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561407e576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff780100000000000000000000000000000000000000000000000082048116916140c9918491700100000000000000000000000000000000900416616c9b565b1115614101576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000008204811660008181526072602052604081205491937001000000000000000000000000000000009004909216915b848110156143ab57600087878381811061416157614161616904565b90506020028101906141739190616cae565b61417c90616ce2565b905083614188816169f4565b825180516020918201208185015160408087015190519499509194506000936141ea9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260719093529120549091508114614273576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260716020526040812055614298600189616a74565b84036143075742607b60149054906101000a900467ffffffffffffffff1684604001516142c591906168dc565b67ffffffffffffffff161115614307576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806143a390616a1b565b915050614145565b506143b684846168dc565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589166000818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461455f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156145c757600080fd5b505af11580156145db573d6000803e3d6000fd5b50505050613071615bb6565b6145ef614c16565b6040805160608101825293845267ffffffffffffffff92831660208086019182529284168583019081529584166000908152607290935291209251835551600190920180549351821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169290911691909117919091179055565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16156146d4576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614711576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061471b612bec565b905081811115614757576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115614793576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6147d573ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846156a8565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614842573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061486691906167fe565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff169060186148a0836169f4565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505084846040516148d7929190616d5e565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1660009081526071909352912055323303614a0757607354604080518381523360208201526060918101829052600091810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2614a66565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051614a5d9493929190616d6e565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314614abe576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001611904565b614b47614c16565b73ffffffffffffffffffffffffffffffffffffffff8116614bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610dba565b61214e81615a17565b614bfb614c16565b67ffffffffffffffff16600090815260756020526040902055565b60335473ffffffffffffffffffffffffffffffffffffffff163314613071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dba565b600080614ca2613944565b905067ffffffffffffffff881615614d725760795467ffffffffffffffff9081169089161115614cfe576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089166000908152607860205260409020600281015481549094509091898116680100000000000000009092041614614d6c576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614e13565b67ffffffffffffffff8716600090815260756020526040902054915081614dc5576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115614e13576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611614e60576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000614e6f888888868961190f565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051614ea491906167e2565b602060405180830381855afa158015614ec1573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190614ee491906167fe565b614eee9190616846565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91614f7091899190600401616da4565b602060405180830381865afa158015614f8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614fb19190616ddf565b614fe7576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61504f33614ff5858b616a53565b67ffffffffffffffff166150076132f2565b6150119190616a87565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190615c45565b50505050505050505050565b600067ffffffffffffffff8816156151295760795467ffffffffffffffff90811690891611156150b7576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088166000908152607860205260409020600281015481549092888116680100000000000000009092041614615123576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506151c5565b5067ffffffffffffffff85166000908152607560205260409020548061517b576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff90811690871611156151c5576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff90811690881611806151f757508767ffffffffffffffff168767ffffffffffffffff1611155b8061521e575060795467ffffffffffffffff68010000000000000000909104811690881611155b15615255576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781166000908152607860205260409020546801000000000000000090048116908616146152b8576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006152c7878787858861190f565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516152fc91906167e2565b602060405180830381855afa158015615319573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061533c91906167fe565b6153469190616846565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916153c891889190600401616da4565b602060405180830381865afa1580156153e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906154099190616ddf565b61543f576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff891660009081526078602052604090206002015485900361504f576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff6801000000000000000090910481169082161115806154cf575060795467ffffffffffffffff908116908216115b15615506576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff818116600081815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b15801561563857600080fd5b505af115801561564c573d6000803e3d6000fd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161569b91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526157849085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152615ca0565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115613071576079546000906157d39068010000000000000000900467ffffffffffffffff1660016168dc565b90506157de81611ec4565b1561214e5760795460009060029061580190849067ffffffffffffffff16616a53565b61580b9190616e01565b61581590836168dc565b905061582081611ec4565b1561582e5761394081615495565b61394082615495565b6000615841613944565b9050816000806158518484616a53565b606f5467ffffffffffffffff91821692506000916158759161010090041642616a74565b90505b8467ffffffffffffffff168467ffffffffffffffff16146159005767ffffffffffffffff808516600090815260726020526040902060018101549091168210156158de57600181015468010000000000000000900467ffffffffffffffff1694506158fa565b6158e88686616a53565b67ffffffffffffffff16935050615900565b50615878565b600061590c8484616a74565b90508381101561596357808403600c8111615927578061592a565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a607054028161595957615959616817565b04607055506159d3565b838103600c81116159745780615977565b600c5b90506000816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a764000002816159ae576159ae616817565b04905080607054670de0b6b3a764000002816159cc576159cc616817565b0460705550505b683635c9adc5dea0000060705411156159f857683635c9adc5dea000006070556134f3565b633b9aca0060705410156134f357633b9aca0060705550505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b158015615af657600080fd5b505af1158015615b0a573d6000803e3d6000fd5b50505050613071615dac565b600054610100900460ff16615bad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610dba565b61307133615a17565b606f5460ff16615bf2576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052615c9b9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401615702565b505050565b6000615d02826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615e3f9092919063ffffffff16565b805190915015615c9b5780806020019051810190615d209190616ddf565b615c9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610dba565b606f5460ff1615615de9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b6060615e4e8484600085615e56565b949350505050565b606082471015615ee8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610dba565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051615f1191906167e2565b60006040518083038185875af1925050503d8060008114615f4e576040519150601f19603f3d011682016040523d82523d6000602084013e615f53565b606091505b5091509150615f6487838387615f6f565b979650505050505050565b60608315616005578251600003615ffe5773ffffffffffffffffffffffffffffffffffffffff85163b615ffe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610dba565b5081615e4e565b615e4e838381511561601a5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dba9190616129565b803567ffffffffffffffff8116811461392757600080fd5b600080600080600060a0868803121561607e57600080fd5b6160878661604e565b94506160956020870161604e565b93506160a36040870161604e565b94979396509394606081013594506080013592915050565b60005b838110156160d65781810151838201526020016160be565b50506000910152565b600081518084526160f78160208601602086016160bb565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061613c60208301846160df565b9392505050565b806040810183101561615457600080fd5b92915050565b6000806000806000806000806101a0898b03121561617757600080fd5b6161808961604e565b975061618e60208a0161604e565b965061619c60408a0161604e565b955060608901359450608089013593506161b98a60a08b01616143565b925061016089018a8111156161cd57600080fd5b60e08a0192506161dd8b82616143565b9150509295985092959890939650565b6000602082840312156161ff57600080fd5b813561ffff8116811461613c57600080fd5b600080600080600060a0868803121561622957600080fd5b6162328661604e565b94506162406020870161604e565b94979496505050506040830135926060810135926080909101359150565b80610300810183101561615457600080fd5b6000806000806000806103a0878903121561628a57600080fd5b6162938761604e565b95506162a16020880161604e565b94506162af6040880161604e565b935060608701359250608087013591506162cc8860a0890161625e565b90509295509295509295565b60008060008060008060006103c0888a0312156162f457600080fd5b6162fd8861604e565b965061630b6020890161604e565b95506163196040890161604e565b94506163276060890161604e565b93506080880135925060a088013591506163448960c08a0161625e565b905092959891949750929550565b60006020828403121561636457600080fd5b61613c8261604e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126163ad57600080fd5b813567ffffffffffffffff808211156163c8576163c861636d565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561640e5761640e61636d565b8160405283815286602085880101111561642757600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461392757600080fd5b600080600080600060a0868803121561648357600080fd5b85359450602086013567ffffffffffffffff8111156164a157600080fd5b6164ad8882890161639c565b945050604086013592506164c36060870161604e565b91506164d160808701616447565b90509295509295909350565b60008083601f8401126164ef57600080fd5b50813567ffffffffffffffff81111561650757600080fd5b6020830191508360208260051b850101111561652257600080fd5b9250929050565b60008060006040848603121561653e57600080fd5b833567ffffffffffffffff81111561655557600080fd5b616561868287016164dd565b9094509250616574905060208501616447565b90509250925092565b60006020828403121561658f57600080fd5b61613c82616447565b6000602082840312156165aa57600080fd5b5035919050565b6000602082840312156165c357600080fd5b813567ffffffffffffffff8111156165da57600080fd5b615e4e8482850161639c565b60008083601f8401126165f857600080fd5b50813567ffffffffffffffff81111561661057600080fd5b60208301915083602082850101111561652257600080fd5b60008060008060008086880361012081121561664357600080fd5b60a081121561665157600080fd5b5086955060a0870135945060c087013567ffffffffffffffff8082111561667757600080fd5b6166838a838b0161639c565b955060e089013591508082111561669957600080fd5b6166a58a838b0161639c565b94506101008901359150808211156166bc57600080fd5b506166c989828a016165e6565b979a9699509497509295939492505050565b600080602083850312156166ee57600080fd5b823567ffffffffffffffff81111561670557600080fd5b616711858286016164dd565b90969095509350505050565b6000806000806080858703121561673357600080fd5b61673c8561604e565b9350602085013592506167516040860161604e565b915061675f6060860161604e565b905092959194509250565b60008060006040848603121561677f57600080fd5b833567ffffffffffffffff81111561679657600080fd5b6167a2868287016165e6565b909790965060209590950135949350505050565b600080604083850312156167c957600080fd5b823591506167d96020840161604e565b90509250929050565b600082516167f48184602087016160bb565b9190910192915050565b60006020828403121561681057600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261685557616855616817565b500690565b600181811c9082168061686e57607f821691505b6020821081036168a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8181168382160190808211156168fd576168fd6168ad565b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126167f457600080fd5b60006080823603121561697957600080fd5b6040516080810167ffffffffffffffff828210818311171561699d5761699d61636d565b8160405284359150808211156169b257600080fd5b506169bf3682860161639c565b825250602083013560208201526169d86040840161604e565b60408201526169e96060840161604e565b606082015292915050565b600067ffffffffffffffff808316818103616a1157616a116168ad565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203616a4c57616a4c6168ad565b5060010190565b67ffffffffffffffff8281168282160390808211156168fd576168fd6168ad565b81810381811115616154576161546168ad565b8082028115828204841417616154576161546168ad565b600082616aad57616aad616817565b500490565b601f821115615c9b57600081815260208120601f850160051c81016020861015616ad95750805b601f850160051c820191505b81811015616af857828155600101616ae5565b505050505050565b815167ffffffffffffffff811115616b1a57616b1a61636d565b616b2e81616b28845461685a565b84616ab2565b602080601f831160018114616b815760008415616b4b5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555616af8565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015616bce57888601518255948401946001909101908401616baf565b5085821015616c0a57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600067ffffffffffffffff808716835280861660208401525060606040830152616c91606083018486616c1a565b9695505050505050565b80820180821115616154576161546168ad565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126167f457600080fd5b600060608236031215616cf457600080fd5b6040516060810167ffffffffffffffff8282108183111715616d1857616d1861636d565b816040528435915080821115616d2d57600080fd5b50616d3a3682860161639c565b82525060208301356020820152616d536040840161604e565b604082015292915050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000616c91606083018486616c1a565b61032081016103008085843782018360005b6001811015616dd5578151835260209283019290910190600101616db6565b5050509392505050565b600060208284031215616df157600080fd5b8151801515811461613c57600080fd5b600067ffffffffffffffff80841680616e1c57616e1c616817565b9216919091049291505056fea26469706673582212200d16bdfde0b321a22abe6c2d141b1b0579321cd6fce8fe87dd8ebcb5f5c5aaca64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061048d5760003560e01c80638c3d73011161026b578063c754c7ed11610150578063e7a7ed02116100c8578063f14916d611610097578063f851a4401161007c578063f851a44014610c9d578063f8b823e414610cbd578063fe16564f14610cc657600080fd5b8063f14916d614610c77578063f2fde38b14610c8a57600080fd5b8063e7a7ed0214610be0578063e8bf92ed14610c10578063eaeb077b14610c37578063ed6b010414610c4a57600080fd5b8063d2e129f91161011f578063d939b31511610104578063d939b31514610b9d578063dbc1697614610bc5578063e0d1744114610bcd57600080fd5b8063d2e129f914610b77578063d8d1091b14610b8a57600080fd5b8063c754c7ed14610ae2578063c89e42df14610b0e578063cfa8ed4714610b21578063d02103ca14610b5057600080fd5b8063ada8f919116101e3578063b4f77ea9116101b2578063ba58ae3911610197578063ba58ae3914610ab4578063c0cad30214610ac7578063c0ed84e014610ada57600080fd5b8063b4f77ea914610a7a578063b6b0b09714610a8d57600080fd5b8063ada8f919146109ab578063adc879e9146109be578063afd23cbe146109e5578063b4d63f5814610a1357600080fd5b80639aa972a31161023a5780639c9f3dfe1161021f5780639c9f3dfe1461095e578063a066215c14610971578063a3c573eb1461098457600080fd5b80639aa972a3146109385780639b7967601461094b57600080fd5b80638c3d7301146108f75780638da5cb5b146108ff57806396dc3d391461091d57806399f5634e1461093057600080fd5b80634a1a89a711610391578063621dd411116103095780637215541a116102d8578063831c7ead116102bd578063831c7ead1461082b578063837a473814610852578063841b24d7146108c757600080fd5b80637215541a146108045780637fcb36531461081757600080fd5b8063621dd411146107b65780636b8616ce146107c95780636ff512cc146107e9578063715018a6146107fc57600080fd5b8063542028d5116103605780635e9145c9116103455780635e9145c9146107935780635ec91958146107a657806360469169146107ae57600080fd5b8063542028d5146106ea578063574f649e146106f257600080fd5b80634a1a89a7146106845780634a910e6a146106a45780634e487706146106b75780635392c5e0146106ca57600080fd5b80632678224711610424578063383b3be8116103f3578063423fa856116103d8578063423fa856146106285780634560526714610648578063458c04771461067057600080fd5b8063383b3be814610602578063394218e91461061557600080fd5b8063267822471461056b57806329878983146105b05780632b0006fa146105dc5780632c1f816a146105ef57600080fd5b806315064c961161046057806315064c96146105145780631816b7e51461053157806319d8ac6114610544578063220d78991461055857600080fd5b80630a0d9fbe146104925780630eaa86ea146104c9578063107bf28c146104ea57806310a01a72146104ff575b600080fd5b606f546104ab90610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6104dc6104d7366004616066565b610cd9565b6040519081526020016104c0565b6104f26111b1565b6040516104c09190616129565b61051261050d36600461615a565b61123f565b005b606f546105219060ff1681565b60405190151581526020016104c0565b61051261053f3660046161ed565b6117f7565b6073546104ab9067ffffffffffffffff1681565b6104f2610566366004616211565b61190f565b607b5461058b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104c0565b60745461058b9068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6105126105ea366004616270565b611ae6565b6105126105fd3660046162d8565b611cb6565b610521610610366004616352565b611ec4565b610512610623366004616352565b611f1a565b6073546104ab9068010000000000000000900467ffffffffffffffff1681565b6073546104ab90700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546104ab9067ffffffffffffffff1681565b6079546104ab9068010000000000000000900467ffffffffffffffff1681565b6105126106b2366004616352565b61209e565b6105126106c5366004616352565b612151565b6104dc6106d8366004616352565b60756020526000908152604090205481565b6104f26122d5565b6104dc61070036600461646b565b835160209485012060408051808701979097528681019190915260608087019490945260c09290921b7fffffffffffffffff00000000000000000000000000000000000000000000000016608086015290911b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888401528051808403607c018152609c9093019052815191012090565b6105126107a1366004616529565b6122e2565b610512612aec565b6104dc612bec565b6105126107c4366004616270565b612c02565b6104dc6107d7366004616352565b60716020526000908152604090205481565b6105126107f736600461657d565b612f8a565b61051261305f565b610512610812366004616352565b613073565b6074546104ab9067ffffffffffffffff1681565b6104ab7f000000000000000000000000000000000000000000000000000000000000000081565b61089b610860366004616598565b60786020526000908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016104c0565b6079546104ab907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6105126131e3565b60335473ffffffffffffffffffffffffffffffffffffffff1661058b565b61051261092b366004616352565b6132af565b6104dc6132f2565b6105126109463660046162d8565b61344b565b610512610959366004616352565b6134fc565b61051261096c366004616352565b61354b565b61051261097f366004616352565b6136c7565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b6105126109b936600461657d565b6137cd565b6104ab7f000000000000000000000000000000000000000000000000000000000000000081565b606f54610a00906901000000000000000000900461ffff1681565b60405161ffff90911681526020016104c0565b610a54610a21366004616352565b6072602052600090815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016104c0565b610512610a88366004616352565b613891565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b610521610ac2366004616598565b6138a2565b610512610ad53660046165b1565b61392c565b6104ab613944565b607b546104ab9074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b610512610b1c3660046165b1565b613999565b606f5461058b906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b610512610b85366004616628565b613a26565b610512610b983660046166db565b613f6c565b6079546104ab90700100000000000000000000000000000000900467ffffffffffffffff1681565b61051261450e565b610512610bdb36600461671d565b6145e7565b6073546104ab907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b610512610c4536600461676a565b614677565b607b54610521907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b610512610c8536600461657d565b614a6d565b610512610c9836600461657d565b614b3f565b607a5461058b9073ffffffffffffffffffffffffffffffffffffffff1681565b6104dc60705481565b610512610cd43660046167b6565b614bf3565b6000806000610ce6613944565b905067ffffffffffffffff881615610eb35760795467ffffffffffffffff9081169089161115610dc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a4015b60405180910390fd5b67ffffffffffffffff8089166000908152607860205260409020600281015481549094509091898116680100000000000000009092041614610ead576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610dba565b5061104c565b67ffffffffffffffff8716600090815260756020526040902054915081610f82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610dba565b8067ffffffffffffffff168767ffffffffffffffff16111561104c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610dba565b8067ffffffffffffffff168667ffffffffffffffff1611611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610dba565b6000611124888888868961190f565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161115991906167e2565b602060405180830381855afa158015611176573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061119991906167fe565b6111a39190616846565b9a9950505050505050505050565b607780546111be9061685a565b80601f01602080910402602001604051908101604052809291908181526020018280546111ea9061685a565b80156112375780601f1061120c57610100808354040283529160200191611237565b820191906000526020600020905b81548152906001019060200180831161121a57829003601f168201915b505050505081565b611247614c16565b600080611252613944565b905067ffffffffffffffff8a161561141a5760795467ffffffffffffffff908116908b16111561132a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a401610dba565b67ffffffffffffffff808b1660009081526078602052604090206002810154815490945090918b8116680100000000000000009092041614611414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610dba565b506115b3565b67ffffffffffffffff89166000908152607560205260409020549150816114e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610dba565b8067ffffffffffffffff168967ffffffffffffffff1611156115b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610dba565b8067ffffffffffffffff168867ffffffffffffffff161161167c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610dba565b600061168b8a8a8a868b61190f565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8c81169182179092556000908152607560205260409020899055607954919250161561170957607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018990527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b15801561179157600080fd5b505af11580156117a5573d6000803e3d6000fd5b505060405189815233925067ffffffffffffffff8c1691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe9060200160405180910390a35050505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611848576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff16108061186157506103ff8161ffff16115b15611898576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086166000818152607260205260408082205493881682529020546060929115801590611943575081155b1561197a576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806119b1576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119ba846138a2565b6119f0576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611b43576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b51868686868686614c97565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615611bcc57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015611c5457600080fd5b505af1158015611c68573d6000803e3d6000fd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611d13576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d228787878787878761505b565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615611d9d57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015611e2557600080fd5b505af1158015611e39573d6000803e3d6000fd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff82811660009081526078602052604081205490924292611f0892700100000000000000000000000000000000909204811691166168dc565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611f6b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611fb2576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166120215760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610612021576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001611904565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461214557606f5460ff1615612106576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61210f81611ec4565b612145576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61214e81615495565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146121a2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156121e9576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661225457607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610612254576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001611904565b607680546111be9061685a565b606f5460ff161561231f576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461237f576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160008190036123bb576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156123f7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000082048116600081815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b868110156128475760008a8a8381811061245f5761245f616904565b90506020028101906124719190616933565b61247a90616967565b8051805160209091012060608201519192509067ffffffffffffffff16156125f257856124a6816169f4565b965050600081836020015184606001516040516020016124fe93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260719093529120549091508114612587576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff80881660009081526071602052604080822091909155606085015190850151908216911610156125ec576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061272f565b6020820151158015906126b9575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015612693573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b791906167fe565b155b156126f0576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c0101561272f576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080612762575042826040015167ffffffffffffffff16115b15612799576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015197505050808061283f90616a1b565b915050612443565b5061285286856168dc565b60735490945067ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690841611156128bb576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006128c78285616a53565b6128db9067ffffffffffffffff1688616a74565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d861660008181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c84169116179302929092179055909150828116908516146129d157607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b612a233330836070546129e49190616a87565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906156a8565b612a2b61578a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612a9357600080fd5b505af1158015612aa7573d6000803e3d6000fd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612b3d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16612b99576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60006070546064612bfd9190616a87565b905090565b606f5460ff1615612c3f576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581166000908152607260205260409020600101544292612c8c927801000000000000000000000000000000000000000000000000909104811691166168dc565b67ffffffffffffffff161115612cce576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612cdb8686616a53565b67ffffffffffffffff161115612d1d576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d2b868686868686614c97565b612d3484615837565b607954700100000000000000000000000000000000900467ffffffffffffffff16600003612e7c57607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615612dd757607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015612e5f57600080fd5b505af1158015612e73573d6000803e3d6000fd5b50505050612f4c565b612e8461578a565b6079805467ffffffffffffffff16906000612e9e836169f4565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487166000908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001611ca6565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612fdb576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001611904565b613067614c16565b6130716000615a17565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146131db57600061309c613944565b90508067ffffffffffffffff168267ffffffffffffffff16116130eb576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000090910481169083161180613131575067ffffffffffffffff80831660009081526072602052604090206001015416155b15613168576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff80831660009081526072602052604090206001015442916131979162093a8091166168dc565b67ffffffffffffffff1611156131d9576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61214e615a8e565b607b5473ffffffffffffffffffffffffffffffffffffffff163314613234576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6132b7614c16565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015613381573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133a591906167fe565b905060006133b1613944565b60735467ffffffffffffffff6801000000000000000082048116916134099170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416616a53565b61341391906168dc565b61341d9190616a53565b67ffffffffffffffff1690508060000361343a5760009250505090565b6134448183616a9e565b9250505090565b606f5460ff1615613488576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134978787878787878761505b565b67ffffffffffffffff84166000908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16134f3615a8e565b50505050505050565b613504614c16565b6073805467ffffffffffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461359c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156135e3576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661364a5760795467ffffffffffffffff70010000000000000000000000000000000090910481169082161061364a576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001611904565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613718576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff16111561375f576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001611904565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461381e576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001611904565b613899614c16565b61214e81615837565b600067ffffffff0000000167ffffffffffffffff83161080156138da575067ffffffff00000001604083901c67ffffffffffffffff16105b80156138fb575067ffffffff00000001608083901c67ffffffffffffffff16105b8015613912575067ffffffff0000000160c083901c105b1561391f57506001919050565b506000919050565b919050565b613934614c16565b60776139408282616b00565b5050565b60795460009067ffffffffffffffff1615613988575060795467ffffffffffffffff9081166000908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146139ea576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60766139f68282616b00565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516119049190616129565b600054610100900460ff1615808015613a465750600054600160ff909116105b80613a605750303b158015613a60575060005460ff166001145b613aec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610dba565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015613b4a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b613b57602088018861657d565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055613bac604088016020890161657d565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055613c11608088016060890161657d565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790556000805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076613c9c8682616b00565b506077613ca98582616b00565b5062093a80613cbe6060890160408a01616352565b67ffffffffffffffff161115613d00576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d106060880160408901616352565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80613d7260a0890160808a01616352565b67ffffffffffffffff161115613db4576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613dc460a0880160808901616352565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613ea3615b16565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd660007f00000000000000000000000000000000000000000000000000000000000000008585604051613ef99493929190616c63565b60405180910390a180156134f357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613fc9576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614006576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003614042576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561407e576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff780100000000000000000000000000000000000000000000000082048116916140c9918491700100000000000000000000000000000000900416616c9b565b1115614101576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000008204811660008181526072602052604081205491937001000000000000000000000000000000009004909216915b848110156143ab57600087878381811061416157614161616904565b90506020028101906141739190616cae565b61417c90616ce2565b905083614188816169f4565b825180516020918201208185015160408087015190519499509194506000936141ea9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260719093529120549091508114614273576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260716020526040812055614298600189616a74565b84036143075742607b60149054906101000a900467ffffffffffffffff1684604001516142c591906168dc565b67ffffffffffffffff161115614307576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806143a390616a1b565b915050614145565b506143b684846168dc565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589166000818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461455f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156145c757600080fd5b505af11580156145db573d6000803e3d6000fd5b50505050613071615bb6565b6145ef614c16565b6040805160608101825293845267ffffffffffffffff92831660208086019182529284168583019081529584166000908152607290935291209251835551600190920180549351821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169290911691909117919091179055565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16156146d4576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614711576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061471b612bec565b905081811115614757576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115614793576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6147d573ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846156a8565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614842573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061486691906167fe565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff169060186148a0836169f4565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505084846040516148d7929190616d5e565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1660009081526071909352912055323303614a0757607354604080518381523360208201526060918101829052600091810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2614a66565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051614a5d9493929190616d6e565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314614abe576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001611904565b614b47614c16565b73ffffffffffffffffffffffffffffffffffffffff8116614bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610dba565b61214e81615a17565b614bfb614c16565b67ffffffffffffffff16600090815260756020526040902055565b60335473ffffffffffffffffffffffffffffffffffffffff163314613071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dba565b600080614ca2613944565b905067ffffffffffffffff881615614d725760795467ffffffffffffffff9081169089161115614cfe576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089166000908152607860205260409020600281015481549094509091898116680100000000000000009092041614614d6c576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614e13565b67ffffffffffffffff8716600090815260756020526040902054915081614dc5576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115614e13576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611614e60576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000614e6f888888868961190f565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051614ea491906167e2565b602060405180830381855afa158015614ec1573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190614ee491906167fe565b614eee9190616846565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91614f7091899190600401616da4565b602060405180830381865afa158015614f8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614fb19190616ddf565b614fe7576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61504f33614ff5858b616a53565b67ffffffffffffffff166150076132f2565b6150119190616a87565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190615c45565b50505050505050505050565b600067ffffffffffffffff8816156151295760795467ffffffffffffffff90811690891611156150b7576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088166000908152607860205260409020600281015481549092888116680100000000000000009092041614615123576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506151c5565b5067ffffffffffffffff85166000908152607560205260409020548061517b576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff90811690871611156151c5576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff90811690881611806151f757508767ffffffffffffffff168767ffffffffffffffff1611155b8061521e575060795467ffffffffffffffff68010000000000000000909104811690881611155b15615255576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781166000908152607860205260409020546801000000000000000090048116908616146152b8576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006152c7878787858861190f565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516152fc91906167e2565b602060405180830381855afa158015615319573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061533c91906167fe565b6153469190616846565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916153c891889190600401616da4565b602060405180830381865afa1580156153e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906154099190616ddf565b61543f576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff891660009081526078602052604090206002015485900361504f576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff6801000000000000000090910481169082161115806154cf575060795467ffffffffffffffff908116908216115b15615506576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff818116600081815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b15801561563857600080fd5b505af115801561564c573d6000803e3d6000fd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161569b91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526157849085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152615ca0565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115613071576079546000906157d39068010000000000000000900467ffffffffffffffff1660016168dc565b90506157de81611ec4565b1561214e5760795460009060029061580190849067ffffffffffffffff16616a53565b61580b9190616e01565b61581590836168dc565b905061582081611ec4565b1561582e5761394081615495565b61394082615495565b6000615841613944565b9050816000806158518484616a53565b606f5467ffffffffffffffff91821692506000916158759161010090041642616a74565b90505b8467ffffffffffffffff168467ffffffffffffffff16146159005767ffffffffffffffff808516600090815260726020526040902060018101549091168210156158de57600181015468010000000000000000900467ffffffffffffffff1694506158fa565b6158e88686616a53565b67ffffffffffffffff16935050615900565b50615878565b600061590c8484616a74565b90508381101561596357808403600c8111615927578061592a565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a607054028161595957615959616817565b04607055506159d3565b838103600c81116159745780615977565b600c5b90506000816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a764000002816159ae576159ae616817565b04905080607054670de0b6b3a764000002816159cc576159cc616817565b0460705550505b683635c9adc5dea0000060705411156159f857683635c9adc5dea000006070556134f3565b633b9aca0060705410156134f357633b9aca0060705550505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b158015615af657600080fd5b505af1158015615b0a573d6000803e3d6000fd5b50505050613071615dac565b600054610100900460ff16615bad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610dba565b61307133615a17565b606f5460ff16615bf2576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052615c9b9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401615702565b505050565b6000615d02826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615e3f9092919063ffffffff16565b805190915015615c9b5780806020019051810190615d209190616ddf565b615c9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610dba565b606f5460ff1615615de9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b6060615e4e8484600085615e56565b949350505050565b606082471015615ee8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610dba565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051615f1191906167e2565b60006040518083038185875af1925050503d8060008114615f4e576040519150601f19603f3d011682016040523d82523d6000602084013e615f53565b606091505b5091509150615f6487838387615f6f565b979650505050505050565b60608315616005578251600003615ffe5773ffffffffffffffffffffffffffffffffffffffff85163b615ffe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610dba565b5081615e4e565b615e4e838381511561601a5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dba9190616129565b803567ffffffffffffffff8116811461392757600080fd5b600080600080600060a0868803121561607e57600080fd5b6160878661604e565b94506160956020870161604e565b93506160a36040870161604e565b94979396509394606081013594506080013592915050565b60005b838110156160d65781810151838201526020016160be565b50506000910152565b600081518084526160f78160208601602086016160bb565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061613c60208301846160df565b9392505050565b806040810183101561615457600080fd5b92915050565b6000806000806000806000806101a0898b03121561617757600080fd5b6161808961604e565b975061618e60208a0161604e565b965061619c60408a0161604e565b955060608901359450608089013593506161b98a60a08b01616143565b925061016089018a8111156161cd57600080fd5b60e08a0192506161dd8b82616143565b9150509295985092959890939650565b6000602082840312156161ff57600080fd5b813561ffff8116811461613c57600080fd5b600080600080600060a0868803121561622957600080fd5b6162328661604e565b94506162406020870161604e565b94979496505050506040830135926060810135926080909101359150565b80610300810183101561615457600080fd5b6000806000806000806103a0878903121561628a57600080fd5b6162938761604e565b95506162a16020880161604e565b94506162af6040880161604e565b935060608701359250608087013591506162cc8860a0890161625e565b90509295509295509295565b60008060008060008060006103c0888a0312156162f457600080fd5b6162fd8861604e565b965061630b6020890161604e565b95506163196040890161604e565b94506163276060890161604e565b93506080880135925060a088013591506163448960c08a0161625e565b905092959891949750929550565b60006020828403121561636457600080fd5b61613c8261604e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126163ad57600080fd5b813567ffffffffffffffff808211156163c8576163c861636d565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561640e5761640e61636d565b8160405283815286602085880101111561642757600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461392757600080fd5b600080600080600060a0868803121561648357600080fd5b85359450602086013567ffffffffffffffff8111156164a157600080fd5b6164ad8882890161639c565b945050604086013592506164c36060870161604e565b91506164d160808701616447565b90509295509295909350565b60008083601f8401126164ef57600080fd5b50813567ffffffffffffffff81111561650757600080fd5b6020830191508360208260051b850101111561652257600080fd5b9250929050565b60008060006040848603121561653e57600080fd5b833567ffffffffffffffff81111561655557600080fd5b616561868287016164dd565b9094509250616574905060208501616447565b90509250925092565b60006020828403121561658f57600080fd5b61613c82616447565b6000602082840312156165aa57600080fd5b5035919050565b6000602082840312156165c357600080fd5b813567ffffffffffffffff8111156165da57600080fd5b615e4e8482850161639c565b60008083601f8401126165f857600080fd5b50813567ffffffffffffffff81111561661057600080fd5b60208301915083602082850101111561652257600080fd5b60008060008060008086880361012081121561664357600080fd5b60a081121561665157600080fd5b5086955060a0870135945060c087013567ffffffffffffffff8082111561667757600080fd5b6166838a838b0161639c565b955060e089013591508082111561669957600080fd5b6166a58a838b0161639c565b94506101008901359150808211156166bc57600080fd5b506166c989828a016165e6565b979a9699509497509295939492505050565b600080602083850312156166ee57600080fd5b823567ffffffffffffffff81111561670557600080fd5b616711858286016164dd565b90969095509350505050565b6000806000806080858703121561673357600080fd5b61673c8561604e565b9350602085013592506167516040860161604e565b915061675f6060860161604e565b905092959194509250565b60008060006040848603121561677f57600080fd5b833567ffffffffffffffff81111561679657600080fd5b6167a2868287016165e6565b909790965060209590950135949350505050565b600080604083850312156167c957600080fd5b823591506167d96020840161604e565b90509250929050565b600082516167f48184602087016160bb565b9190910192915050565b60006020828403121561681057600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261685557616855616817565b500690565b600181811c9082168061686e57607f821691505b6020821081036168a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8181168382160190808211156168fd576168fd6168ad565b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126167f457600080fd5b60006080823603121561697957600080fd5b6040516080810167ffffffffffffffff828210818311171561699d5761699d61636d565b8160405284359150808211156169b257600080fd5b506169bf3682860161639c565b825250602083013560208201526169d86040840161604e565b60408201526169e96060840161604e565b606082015292915050565b600067ffffffffffffffff808316818103616a1157616a116168ad565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203616a4c57616a4c6168ad565b5060010190565b67ffffffffffffffff8281168282160390808211156168fd576168fd6168ad565b81810381811115616154576161546168ad565b8082028115828204841417616154576161546168ad565b600082616aad57616aad616817565b500490565b601f821115615c9b57600081815260208120601f850160051c81016020861015616ad95750805b601f850160051c820191505b81811015616af857828155600101616ae5565b505050505050565b815167ffffffffffffffff811115616b1a57616b1a61636d565b616b2e81616b28845461685a565b84616ab2565b602080601f831160018114616b815760008415616b4b5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555616af8565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015616bce57888601518255948401946001909101908401616baf565b5085821015616c0a57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600067ffffffffffffffff808716835280861660208401525060606040830152616c91606083018486616c1a565b9695505050505050565b80820180821115616154576161546168ad565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126167f457600080fd5b600060608236031215616cf457600080fd5b6040516060810167ffffffffffffffff8282108183111715616d1857616d1861636d565b816040528435915080821115616d2d57600080fd5b50616d3a3682860161639c565b82525060208301356020820152616d536040840161604e565b604082015292915050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000616c91606083018486616c1a565b61032081016103008085843782018360005b6001811015616dd5578151835260209283019290910190600101616db6565b5050509392505050565b600060208284031215616df157600080fd5b8151801515811461613c57600080fd5b600067ffffffffffffffff80841680616e1c57616e1c616817565b9216919091049291505056fea26469706673582212200d16bdfde0b321a22abe6c2d141b1b0579321cd6fce8fe87dd8ebcb5f5c5aaca64736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/paris/PolygonZkEVMTimelock.json b/compiled-contracts/paris/PolygonZkEVMTimelock.json new file mode 100644 index 000000000..81068dc6d --- /dev/null +++ b/compiled-contracts/paris/PolygonZkEVMTimelock.json @@ -0,0 +1,899 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonZkEVMTimelock", + "sourceName": "contracts/PolygonZkEVMTimelock.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "minDelay", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "proposers", + "type": "address[]" + }, + { + "internalType": "address[]", + "name": "executors", + "type": "address[]" + }, + { + "internalType": "address", + "name": "admin", + "type": "address" + }, + { + "internalType": "contract PolygonZkEVM", + "name": "_polygonZkEVM", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "CallExecuted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "predecessor", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "delay", + "type": "uint256" + } + ], + "name": "CallScheduled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + } + ], + "name": "Cancelled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "oldDuration", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newDuration", + "type": "uint256" + } + ], + "name": "MinDelayChange", + "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" + }, + { + "inputs": [], + "name": "CANCELLER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "EXECUTOR_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PROPOSER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TIMELOCK_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + } + ], + "name": "cancel", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "payload", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "predecessor", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + } + ], + "name": "execute", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "payloads", + "type": "bytes[]" + }, + { + "internalType": "bytes32", + "name": "predecessor", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + } + ], + "name": "executeBatch", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "getMinDelay", + "outputs": [ + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + } + ], + "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": "bytes32", + "name": "id", + "type": "bytes32" + } + ], + "name": "getTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "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": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "predecessor", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + } + ], + "name": "hashOperation", + "outputs": [ + { + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "payloads", + "type": "bytes[]" + }, + { + "internalType": "bytes32", + "name": "predecessor", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + } + ], + "name": "hashOperationBatch", + "outputs": [ + { + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + } + ], + "name": "isOperation", + "outputs": [ + { + "internalType": "bool", + "name": "registered", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + } + ], + "name": "isOperationDone", + "outputs": [ + { + "internalType": "bool", + "name": "done", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + } + ], + "name": "isOperationPending", + "outputs": [ + { + "internalType": "bool", + "name": "pending", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + } + ], + "name": "isOperationReady", + "outputs": [ + { + "internalType": "bool", + "name": "ready", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155BatchReceived", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC721Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "polygonZkEVM", + "outputs": [ + { + "internalType": "contract PolygonZkEVM", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "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": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "predecessor", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "delay", + "type": "uint256" + } + ], + "name": "schedule", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "payloads", + "type": "bytes[]" + }, + { + "internalType": "bytes32", + "name": "predecessor", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "delay", + "type": "uint256" + } + ], + "name": "scheduleBatch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newDelay", + "type": "uint256" + } + ], + "name": "updateDelay", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "bytecode": "0x60a06040523480156200001157600080fd5b5060405162002d2f38038062002d2f83398101604081905262000034916200042b565b848484846200005360008051602062002caf8339815191528062000242565b6200007d60008051602062002ccf83398151915260008051602062002caf83398151915262000242565b620000a760008051602062002cef83398151915260008051602062002caf83398151915262000242565b620000d160008051602062002d0f83398151915260008051602062002caf83398151915262000242565b620000ec60008051602062002caf833981519152306200028d565b6001600160a01b0381161562000117576200011760008051602062002caf833981519152826200028d565b60005b83518110156200019d576200016160008051602062002ccf8339815191528583815181106200014d576200014d620004cc565b60200260200101516200028d60201b60201c565b6200018a60008051602062002d0f8339815191528583815181106200014d576200014d620004cc565b6200019581620004e2565b90506200011a565b5060005b8251811015620001e757620001d460008051602062002cef8339815191528483815181106200014d576200014d620004cc565b620001df81620004e2565b9050620001a1565b5060028490556040805160008152602081018690527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1505050506001600160a01b0316608052506200050a92505050565b600082815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6200029982826200029d565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1662000299576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620002f93390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146200036957600080fd5b50565b8051620003798162000353565b919050565b600082601f8301126200039057600080fd5b815160206001600160401b0380831115620003af57620003af6200033d565b8260051b604051601f19603f83011681018181108482111715620003d757620003d76200033d565b604052938452858101830193838101925087851115620003f657600080fd5b83870191505b84821015620004205762000410826200036c565b83529183019190830190620003fc565b979650505050505050565b600080600080600060a086880312156200044457600080fd5b855160208701519095506001600160401b03808211156200046457600080fd5b6200047289838a016200037e565b955060408801519150808211156200048957600080fd5b5062000498888289016200037e565b9350506060860151620004ab8162000353565b6080870151909250620004be8162000353565b809150509295509295909350565b634e487b7160e01b600052603260045260246000fd5b6000600182016200050357634e487b7160e01b600052601160045260246000fd5b5060010190565b60805161277b620005346000396000818161041a0152818161116501526111a5015261277b6000f3fe6080604052600436106101c65760003560e01c806364d62353116100f7578063b1c5f42711610095578063d547741f11610064578063d547741f14610661578063e38335e514610681578063f23a6e6114610694578063f27a0c92146106d957600080fd5b8063b1c5f427146105af578063bc197c81146105cf578063c4d252f514610614578063d45c44351461063457600080fd5b80638f61f4f5116100d15780638f61f4f5146104e157806391d1485414610515578063a217fddf14610566578063b08e51c01461057b57600080fd5b806364d62353146104815780638065657f146104a15780638f2a0bb0146104c157600080fd5b8063248a9ca31161016457806331d507501161013e57806331d50750146103c857806336568abe146103e85780633a6aae7214610408578063584b153e1461046157600080fd5b8063248a9ca3146103475780632ab0f529146103775780632f2ff15d146103a857600080fd5b80630d3cf6fc116101a05780630d3cf6fc1461026b578063134008d31461029f57806313bc9f20146102b2578063150b7a02146102d257600080fd5b806301d5062a146101d257806301ffc9a7146101f457806307bd02651461022957600080fd5b366101cd57005b600080fd5b3480156101de57600080fd5b506101f26101ed366004611c52565b6106ee565b005b34801561020057600080fd5b5061021461020f366004611cc7565b610783565b60405190151581526020015b60405180910390f35b34801561023557600080fd5b5061025d7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610220565b34801561027757600080fd5b5061025d7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101f26102ad366004611d09565b6107df565b3480156102be57600080fd5b506102146102cd366004611d75565b6108d7565b3480156102de57600080fd5b506103166102ed366004611e9a565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610220565b34801561035357600080fd5b5061025d610362366004611d75565b60009081526020819052604090206001015490565b34801561038357600080fd5b50610214610392366004611d75565b6000908152600160208190526040909120541490565b3480156103b457600080fd5b506101f26103c3366004611f02565b6108fd565b3480156103d457600080fd5b506102146103e3366004611d75565b610927565b3480156103f457600080fd5b506101f2610403366004611f02565b610940565b34801561041457600080fd5b5061043c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610220565b34801561046d57600080fd5b5061021461047c366004611d75565b6109f8565b34801561048d57600080fd5b506101f261049c366004611d75565b610a0e565b3480156104ad57600080fd5b5061025d6104bc366004611d09565b610ade565b3480156104cd57600080fd5b506101f26104dc366004611f73565b610b1d565b3480156104ed57600080fd5b5061025d7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b34801561052157600080fd5b50610214610530366004611f02565b60009182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b34801561057257600080fd5b5061025d600081565b34801561058757600080fd5b5061025d7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b3480156105bb57600080fd5b5061025d6105ca366004612025565b610d4f565b3480156105db57600080fd5b506103166105ea36600461214e565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b34801561062057600080fd5b506101f261062f366004611d75565b610d94565b34801561064057600080fd5b5061025d61064f366004611d75565b60009081526001602052604090205490565b34801561066d57600080fd5b506101f261067c366004611f02565b610e8f565b6101f261068f366004612025565b610eb4565b3480156106a057600080fd5b506103166106af3660046121f8565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106e557600080fd5b5061025d611161565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161071881611244565b6000610728898989898989610ade565b90506107348184611251565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a604051610770969594939291906122a6565b60405180910390a3505050505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107d957506107d98261139e565b92915050565b600080527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661085c5761085c8133611435565b600061086c888888888888610ade565b905061087881856114ed565b6108848888888861162a565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a6040516108bc94939291906122f1565b60405180910390a36108cd8161172e565b5050505050505050565b6000818152600160205260408120546001811180156108f65750428111155b9392505050565b60008281526020819052604090206001015461091881611244565b61092283836117d7565b505050565b60008181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109f482826118c7565b5050565b6000818152600160208190526040822054610939565b333014610a9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109e1565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b6000868686868686604051602001610afb969594939291906122a6565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b4781611244565b888714610bd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b888514610c65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b6000610c778b8b8b8b8b8b8b8b610d4f565b9050610c838184611251565b60005b8a811015610d415780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610cc357610cc3612331565b9050602002016020810190610cd89190612360565b8d8d86818110610cea57610cea612331565b905060200201358c8c87818110610d0357610d03612331565b9050602002810190610d15919061237b565b8c8b604051610d29969594939291906122a6565b60405180910390a3610d3a8161240f565b9050610c86565b505050505050505050505050565b60008888888888888888604051602001610d709897969594939291906124f7565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610dbe81611244565b610dc7826109f8565b610e53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109e1565b6000828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b600082815260208190526040902060010154610eaa81611244565b61092283836118c7565b600080527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610f3157610f318133611435565b878614610fc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b87841461104f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b60006110618a8a8a8a8a8a8a8a610d4f565b905061106d81856114ed565b60005b8981101561114b5760008b8b8381811061108c5761108c612331565b90506020020160208101906110a19190612360565b905060008a8a848181106110b7576110b7612331565b9050602002013590503660008a8a868181106110d5576110d5612331565b90506020028101906110e7919061237b565b915091506110f78484848461162a565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588686868660405161112e94939291906122f1565b60405180910390a350505050806111449061240f565b9050611070565b506111558161172e565b50505050505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161580159061123257507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123291906125be565b1561123d5750600090565b5060025490565b61124e8133611435565b50565b61125a82610927565b156112e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109e1565b6112ef611161565b81101561137e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109e1565b61138881426125e0565b6000928352600160205260409092209190915550565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107d957507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107d9565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109f4576114738161197e565b61147e83602061199d565b60405160200161148f929190612617565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109e191600401612698565b6114f6826108d7565b611582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109e1565b80158061159e5750600081815260016020819052604090912054145b6109f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109e1565b60008473ffffffffffffffffffffffffffffffffffffffff168484846040516116549291906126e9565b60006040518083038185875af1925050503d8060008114611691576040519150601f19603f3d011682016040523d82523d6000602084013e611696565b606091505b5050905080611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109e1565b5050505050565b611737816108d7565b6117c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109e1565b600090815260016020819052604090912055565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109f45760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556118693390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109f45760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107d973ffffffffffffffffffffffffffffffffffffffff831660145b606060006119ac8360026126f9565b6119b79060026125e0565b67ffffffffffffffff8111156119cf576119cf611d8e565b6040519080825280601f01601f1916602001820160405280156119f9576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611a3057611a30612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a9357611a93612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000611acf8460026126f9565b611ada9060016125e0565b90505b6001811115611b77577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611b1b57611b1b612331565b1a60f81b828281518110611b3157611b31612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c93611b7081612710565b9050611add565b5083156108f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109e1565b803573ffffffffffffffffffffffffffffffffffffffff81168114611c0457600080fd5b919050565b60008083601f840112611c1b57600080fd5b50813567ffffffffffffffff811115611c3357600080fd5b602083019150836020828501011115611c4b57600080fd5b9250929050565b600080600080600080600060c0888a031215611c6d57600080fd5b611c7688611be0565b965060208801359550604088013567ffffffffffffffff811115611c9957600080fd5b611ca58a828b01611c09565b989b979a50986060810135976080820135975060a09091013595509350505050565b600060208284031215611cd957600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108f657600080fd5b60008060008060008060a08789031215611d2257600080fd5b611d2b87611be0565b955060208701359450604087013567ffffffffffffffff811115611d4e57600080fd5b611d5a89828a01611c09565b979a9699509760608101359660809091013595509350505050565b600060208284031215611d8757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611e0457611e04611d8e565b604052919050565b600082601f830112611e1d57600080fd5b813567ffffffffffffffff811115611e3757611e37611d8e565b611e6860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611dbd565b818152846020838601011115611e7d57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611eb057600080fd5b611eb985611be0565b9350611ec760208601611be0565b925060408501359150606085013567ffffffffffffffff811115611eea57600080fd5b611ef687828801611e0c565b91505092959194509250565b60008060408385031215611f1557600080fd5b82359150611f2560208401611be0565b90509250929050565b60008083601f840112611f4057600080fd5b50813567ffffffffffffffff811115611f5857600080fd5b6020830191508360208260051b8501011115611c4b57600080fd5b600080600080600080600080600060c08a8c031215611f9157600080fd5b893567ffffffffffffffff80821115611fa957600080fd5b611fb58d838e01611f2e565b909b50995060208c0135915080821115611fce57600080fd5b611fda8d838e01611f2e565b909950975060408c0135915080821115611ff357600080fd5b506120008c828d01611f2e565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b60008060008060008060008060a0898b03121561204157600080fd5b883567ffffffffffffffff8082111561205957600080fd5b6120658c838d01611f2e565b909a50985060208b013591508082111561207e57600080fd5b61208a8c838d01611f2e565b909850965060408b01359150808211156120a357600080fd5b506120b08b828c01611f2e565b999c989b509699959896976060870135966080013595509350505050565b600082601f8301126120df57600080fd5b8135602067ffffffffffffffff8211156120fb576120fb611d8e565b8160051b61210a828201611dbd565b928352848101820192828101908785111561212457600080fd5b83870192505b848310156121435782358252918301919083019061212a565b979650505050505050565b600080600080600060a0868803121561216657600080fd5b61216f86611be0565b945061217d60208701611be0565b9350604086013567ffffffffffffffff8082111561219a57600080fd5b6121a689838a016120ce565b945060608801359150808211156121bc57600080fd5b6121c889838a016120ce565b935060808801359150808211156121de57600080fd5b506121eb88828901611e0c565b9150509295509295909350565b600080600080600060a0868803121561221057600080fd5b61221986611be0565b945061222760208701611be0565b93506040860135925060608601359150608086013567ffffffffffffffff81111561225157600080fd5b6121eb88828901611e0c565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a0604082015260006122dc60a08301868861225d565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260606040820152600061232760608301848661225d565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561237257600080fd5b6108f682611be0565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126123b057600080fd5b83018035915067ffffffffffffffff8211156123cb57600080fd5b602001915036819003821315611c4b57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612440576124406123e0565b5060010190565b81835260006020808501808196508560051b810191508460005b878110156124ea57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126124a057600080fd5b8701858101903567ffffffffffffffff8111156124bc57600080fd5b8036038213156124cb57600080fd5b6124d686828461225d565b9a87019a9550505090840190600101612461565b5091979650505050505050565b60a0808252810188905260008960c08301825b8b8110156125455773ffffffffffffffffffffffffffffffffffffffff61253084611be0565b1682526020928301929091019060010161250a565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff89111561257e57600080fd5b8860051b9150818a602083013701828103602090810160408501526125a69082018789612447565b60608401959095525050608001529695505050505050565b6000602082840312156125d057600080fd5b815180151581146108f657600080fd5b808201808211156107d9576107d96123e0565b60005b8381101561260e5781810151838201526020016125f6565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161264f8160178501602088016125f3565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000601791840191820152835161268c8160288401602088016125f3565b01602801949350505050565b60208152600082518060208401526126b78160408501602087016125f3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b8183823760009101908152919050565b80820281158282048414176107d9576107d96123e0565b60008161271f5761271f6123e0565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea264697066735822122048ac459f9165e9eaa91bead23625fe941931ad2332a61820c2a6d1dcd92c218164736f6c634300081400335f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63fd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783", + "deployedBytecode": "0x6080604052600436106101c65760003560e01c806364d62353116100f7578063b1c5f42711610095578063d547741f11610064578063d547741f14610661578063e38335e514610681578063f23a6e6114610694578063f27a0c92146106d957600080fd5b8063b1c5f427146105af578063bc197c81146105cf578063c4d252f514610614578063d45c44351461063457600080fd5b80638f61f4f5116100d15780638f61f4f5146104e157806391d1485414610515578063a217fddf14610566578063b08e51c01461057b57600080fd5b806364d62353146104815780638065657f146104a15780638f2a0bb0146104c157600080fd5b8063248a9ca31161016457806331d507501161013e57806331d50750146103c857806336568abe146103e85780633a6aae7214610408578063584b153e1461046157600080fd5b8063248a9ca3146103475780632ab0f529146103775780632f2ff15d146103a857600080fd5b80630d3cf6fc116101a05780630d3cf6fc1461026b578063134008d31461029f57806313bc9f20146102b2578063150b7a02146102d257600080fd5b806301d5062a146101d257806301ffc9a7146101f457806307bd02651461022957600080fd5b366101cd57005b600080fd5b3480156101de57600080fd5b506101f26101ed366004611c52565b6106ee565b005b34801561020057600080fd5b5061021461020f366004611cc7565b610783565b60405190151581526020015b60405180910390f35b34801561023557600080fd5b5061025d7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610220565b34801561027757600080fd5b5061025d7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101f26102ad366004611d09565b6107df565b3480156102be57600080fd5b506102146102cd366004611d75565b6108d7565b3480156102de57600080fd5b506103166102ed366004611e9a565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610220565b34801561035357600080fd5b5061025d610362366004611d75565b60009081526020819052604090206001015490565b34801561038357600080fd5b50610214610392366004611d75565b6000908152600160208190526040909120541490565b3480156103b457600080fd5b506101f26103c3366004611f02565b6108fd565b3480156103d457600080fd5b506102146103e3366004611d75565b610927565b3480156103f457600080fd5b506101f2610403366004611f02565b610940565b34801561041457600080fd5b5061043c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610220565b34801561046d57600080fd5b5061021461047c366004611d75565b6109f8565b34801561048d57600080fd5b506101f261049c366004611d75565b610a0e565b3480156104ad57600080fd5b5061025d6104bc366004611d09565b610ade565b3480156104cd57600080fd5b506101f26104dc366004611f73565b610b1d565b3480156104ed57600080fd5b5061025d7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b34801561052157600080fd5b50610214610530366004611f02565b60009182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b34801561057257600080fd5b5061025d600081565b34801561058757600080fd5b5061025d7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b3480156105bb57600080fd5b5061025d6105ca366004612025565b610d4f565b3480156105db57600080fd5b506103166105ea36600461214e565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b34801561062057600080fd5b506101f261062f366004611d75565b610d94565b34801561064057600080fd5b5061025d61064f366004611d75565b60009081526001602052604090205490565b34801561066d57600080fd5b506101f261067c366004611f02565b610e8f565b6101f261068f366004612025565b610eb4565b3480156106a057600080fd5b506103166106af3660046121f8565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106e557600080fd5b5061025d611161565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161071881611244565b6000610728898989898989610ade565b90506107348184611251565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a604051610770969594939291906122a6565b60405180910390a3505050505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107d957506107d98261139e565b92915050565b600080527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661085c5761085c8133611435565b600061086c888888888888610ade565b905061087881856114ed565b6108848888888861162a565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a6040516108bc94939291906122f1565b60405180910390a36108cd8161172e565b5050505050505050565b6000818152600160205260408120546001811180156108f65750428111155b9392505050565b60008281526020819052604090206001015461091881611244565b61092283836117d7565b505050565b60008181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109f482826118c7565b5050565b6000818152600160208190526040822054610939565b333014610a9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109e1565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b6000868686868686604051602001610afb969594939291906122a6565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b4781611244565b888714610bd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b888514610c65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b6000610c778b8b8b8b8b8b8b8b610d4f565b9050610c838184611251565b60005b8a811015610d415780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610cc357610cc3612331565b9050602002016020810190610cd89190612360565b8d8d86818110610cea57610cea612331565b905060200201358c8c87818110610d0357610d03612331565b9050602002810190610d15919061237b565b8c8b604051610d29969594939291906122a6565b60405180910390a3610d3a8161240f565b9050610c86565b505050505050505050505050565b60008888888888888888604051602001610d709897969594939291906124f7565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610dbe81611244565b610dc7826109f8565b610e53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109e1565b6000828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b600082815260208190526040902060010154610eaa81611244565b61092283836118c7565b600080527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610f3157610f318133611435565b878614610fc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b87841461104f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b60006110618a8a8a8a8a8a8a8a610d4f565b905061106d81856114ed565b60005b8981101561114b5760008b8b8381811061108c5761108c612331565b90506020020160208101906110a19190612360565b905060008a8a848181106110b7576110b7612331565b9050602002013590503660008a8a868181106110d5576110d5612331565b90506020028101906110e7919061237b565b915091506110f78484848461162a565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588686868660405161112e94939291906122f1565b60405180910390a350505050806111449061240f565b9050611070565b506111558161172e565b50505050505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161580159061123257507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123291906125be565b1561123d5750600090565b5060025490565b61124e8133611435565b50565b61125a82610927565b156112e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109e1565b6112ef611161565b81101561137e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109e1565b61138881426125e0565b6000928352600160205260409092209190915550565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107d957507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107d9565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109f4576114738161197e565b61147e83602061199d565b60405160200161148f929190612617565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109e191600401612698565b6114f6826108d7565b611582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109e1565b80158061159e5750600081815260016020819052604090912054145b6109f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109e1565b60008473ffffffffffffffffffffffffffffffffffffffff168484846040516116549291906126e9565b60006040518083038185875af1925050503d8060008114611691576040519150601f19603f3d011682016040523d82523d6000602084013e611696565b606091505b5050905080611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109e1565b5050505050565b611737816108d7565b6117c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109e1565b600090815260016020819052604090912055565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109f45760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556118693390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109f45760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107d973ffffffffffffffffffffffffffffffffffffffff831660145b606060006119ac8360026126f9565b6119b79060026125e0565b67ffffffffffffffff8111156119cf576119cf611d8e565b6040519080825280601f01601f1916602001820160405280156119f9576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611a3057611a30612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a9357611a93612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000611acf8460026126f9565b611ada9060016125e0565b90505b6001811115611b77577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611b1b57611b1b612331565b1a60f81b828281518110611b3157611b31612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c93611b7081612710565b9050611add565b5083156108f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109e1565b803573ffffffffffffffffffffffffffffffffffffffff81168114611c0457600080fd5b919050565b60008083601f840112611c1b57600080fd5b50813567ffffffffffffffff811115611c3357600080fd5b602083019150836020828501011115611c4b57600080fd5b9250929050565b600080600080600080600060c0888a031215611c6d57600080fd5b611c7688611be0565b965060208801359550604088013567ffffffffffffffff811115611c9957600080fd5b611ca58a828b01611c09565b989b979a50986060810135976080820135975060a09091013595509350505050565b600060208284031215611cd957600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108f657600080fd5b60008060008060008060a08789031215611d2257600080fd5b611d2b87611be0565b955060208701359450604087013567ffffffffffffffff811115611d4e57600080fd5b611d5a89828a01611c09565b979a9699509760608101359660809091013595509350505050565b600060208284031215611d8757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611e0457611e04611d8e565b604052919050565b600082601f830112611e1d57600080fd5b813567ffffffffffffffff811115611e3757611e37611d8e565b611e6860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611dbd565b818152846020838601011115611e7d57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611eb057600080fd5b611eb985611be0565b9350611ec760208601611be0565b925060408501359150606085013567ffffffffffffffff811115611eea57600080fd5b611ef687828801611e0c565b91505092959194509250565b60008060408385031215611f1557600080fd5b82359150611f2560208401611be0565b90509250929050565b60008083601f840112611f4057600080fd5b50813567ffffffffffffffff811115611f5857600080fd5b6020830191508360208260051b8501011115611c4b57600080fd5b600080600080600080600080600060c08a8c031215611f9157600080fd5b893567ffffffffffffffff80821115611fa957600080fd5b611fb58d838e01611f2e565b909b50995060208c0135915080821115611fce57600080fd5b611fda8d838e01611f2e565b909950975060408c0135915080821115611ff357600080fd5b506120008c828d01611f2e565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b60008060008060008060008060a0898b03121561204157600080fd5b883567ffffffffffffffff8082111561205957600080fd5b6120658c838d01611f2e565b909a50985060208b013591508082111561207e57600080fd5b61208a8c838d01611f2e565b909850965060408b01359150808211156120a357600080fd5b506120b08b828c01611f2e565b999c989b509699959896976060870135966080013595509350505050565b600082601f8301126120df57600080fd5b8135602067ffffffffffffffff8211156120fb576120fb611d8e565b8160051b61210a828201611dbd565b928352848101820192828101908785111561212457600080fd5b83870192505b848310156121435782358252918301919083019061212a565b979650505050505050565b600080600080600060a0868803121561216657600080fd5b61216f86611be0565b945061217d60208701611be0565b9350604086013567ffffffffffffffff8082111561219a57600080fd5b6121a689838a016120ce565b945060608801359150808211156121bc57600080fd5b6121c889838a016120ce565b935060808801359150808211156121de57600080fd5b506121eb88828901611e0c565b9150509295509295909350565b600080600080600060a0868803121561221057600080fd5b61221986611be0565b945061222760208701611be0565b93506040860135925060608601359150608086013567ffffffffffffffff81111561225157600080fd5b6121eb88828901611e0c565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a0604082015260006122dc60a08301868861225d565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260606040820152600061232760608301848661225d565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561237257600080fd5b6108f682611be0565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126123b057600080fd5b83018035915067ffffffffffffffff8211156123cb57600080fd5b602001915036819003821315611c4b57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612440576124406123e0565b5060010190565b81835260006020808501808196508560051b810191508460005b878110156124ea57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126124a057600080fd5b8701858101903567ffffffffffffffff8111156124bc57600080fd5b8036038213156124cb57600080fd5b6124d686828461225d565b9a87019a9550505090840190600101612461565b5091979650505050505050565b60a0808252810188905260008960c08301825b8b8110156125455773ffffffffffffffffffffffffffffffffffffffff61253084611be0565b1682526020928301929091019060010161250a565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff89111561257e57600080fd5b8860051b9150818a602083013701828103602090810160408501526125a69082018789612447565b60608401959095525050608001529695505050505050565b6000602082840312156125d057600080fd5b815180151581146108f657600080fd5b808201808211156107d9576107d96123e0565b60005b8381101561260e5781810151838201526020016125f6565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161264f8160178501602088016125f3565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000601791840191820152835161268c8160288401602088016125f3565b01602801949350505050565b60208152600082518060208401526126b78160408501602087016125f3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b8183823760009101908152919050565b80820281158282048414176107d9576107d96123e0565b60008161271f5761271f6123e0565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea264697066735822122048ac459f9165e9eaa91bead23625fe941931ad2332a61820c2a6d1dcd92c218164736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/paris/PolygonZkEVMV2.json b/compiled-contracts/paris/PolygonZkEVMV2.json new file mode 100644 index 000000000..a75047c6a --- /dev/null +++ b/compiled-contracts/paris/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": "0x6101006040523480156200001257600080fd5b5060405162003ad238038062003ad2833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e051613941620001916000396000818161044a015281816108540152818161092301528181610da701528181610f73015281816116ca01528181611793015281816117b50152818161194c0152818161244d0152818161251b0152612608015260008181610519015261188d0152600081816105c2015281816113ed015261275301526000818161060f015281816106ec0152818161171d01528181611863015261272701526139416000f3fe608060405234801561001057600080fd5b50600436106102765760003560e01c80636ff512cc11610160578063cfa8ed47116100d8578063e46761c41161008c578063eaeb077b11610071578063eaeb077b14610651578063f35dda4714610664578063f851a4401461067e57600080fd5b8063e46761c41461060a578063e7a7ed021461063157600080fd5b8063d690be31116100bd578063d690be31146105e4578063d7bc90ff146105ec578063d8d1091b146105f757600080fd5b8063cfa8ed471461059d578063d02103ca146105bd57600080fd5b8063a3c573eb1161012f578063b0afe15411610114578063b0afe1541461054e578063c754c7ed1461055a578063c89e42df1461058a57600080fd5b8063a3c573eb14610514578063ada8f9191461053b57600080fd5b80636ff512cc146104cb5780638c3d7301146104de57806399af0397146104e65780639e001877146104f957600080fd5b806345605267116101f3578063542028d5116101c25780635ec91958116101a75780635ec919581461049a5780636b8616ce146104a25780636e05d2cd146104c257600080fd5b8063542028d51461047f5780635e9145c91461048757600080fd5b8063456052671461040a57806347ebf1081461043257806349b7b802146104455780634e4877061461046c57600080fd5b80632b35b3ac1161024a5780633c351e101161022f5780633c351e101461034f5780633cbc795b1461037457806340b5de6c146103b257600080fd5b80632b35b3ac1461031d57806332c2d1531461033a57600080fd5b8062d0295d1461027b578063107bf28c1461029657806319d8ac61146102ab57806326782247146102d8575b600080fd5b6102836106a4565b6040519081526020015b60405180910390f35b61029e6107c4565b60405161028d9190612e7d565b6007546102bf9067ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161028d565b6001546102f89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161028d565b60085461032a9060ff1681565b604051901515815260200161028d565b61034d610348366004612ed9565b610852565b005b6008546102f890610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60085461039d907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161028d565b6103d97fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161028d565b6007546102bf90700100000000000000000000000000000000900467ffffffffffffffff1681565b61034d610440366004613005565b610921565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b61034d61047a3660046130bc565b610ed3565b61029e6110ed565b61034d610495366004613125565b6110fa565b61034d611a13565b6102836104b03660046130bc565b60066020526000908152604090205481565b61028360055481565b61034d6104d9366004613170565b611afd565b61034d611bc7565b61029e6104f436600461318b565b611c9a565b6102f873a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b61034d610549366004613170565b611f18565b6102836405ca1ab1e081565b6007546102bf907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61034d6105983660046131c5565b611fe2565b6002546102f89073ffffffffffffffffffffffffffffffffffffffff1681565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b61029e612075565b610283635ca1ab1e81565b61034d6106053660046131fa565b612091565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b6007546102bf9068010000000000000000900467ffffffffffffffff1681565b61034d61065f36600461323c565b6125c8565b61066c601b81565b60405160ff909116815260200161028d565b6000546102f89062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610733573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075791906132b4565b6007549091506000906107969067ffffffffffffffff7001000000000000000000000000000000008204811691680100000000000000009004166132fc565b67ffffffffffffffff169050806000036107b35760009250505090565b6107bd8183613324565b9250505090565b600480546107d19061335f565b80601f01602080910402602001604051908101604052809291908181526020018280546107fd9061335f565b801561084a5780601f1061081f5761010080835404028352916020019161084a565b820191906000526020600020905b81548152906001019060200180831161082d57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146108c1576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59668460405161091491815260200190565b60405180910390a3505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610990576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156109b05750600054600160ff909116105b806109ca5750303b1580156109ca575060005460ff166001145b610a5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610ab957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8b81169190910291909117909155600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000169189169190911790556003610b418482613400565b506004610b4e8382613400565b506007805477ffffffffffffffffffffffffffffffffffffffffffffffff167a06978000000000000000000000000000000000000000000000000017905573ffffffffffffffffffffffffffffffffffffffff8516610be55763ffffffff841615610be5576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8816027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff8716021790556000610c78878787611c9a565b805160208083019190912060408051600093810184905290810182905260608082018490524260c081901b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015293945090929190609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291506000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e29919061351a565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050508015610ec957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610f2a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610f71576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fdc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110009190613537565b6110695760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611069576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546107d19061335f565b60025473ffffffffffffffffffffffffffffffffffffffff16331461114b576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003611187576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156111c3576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156115ff57600089898381811061120c5761120c613559565b905060200281019061121e9190613588565b611227906135c6565b8051805160209091012060608201519192509067ffffffffffffffff16156113aa578561125381613657565b965050600081836020015184606001516040516020016112ab93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114611334576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff16101561138a576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86166000908152600660205260408120556114e7565b602082015115801590611471575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af115801561144b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146f91906132b4565b155b156114a8576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156114e7576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff16108061151a575042826040015167ffffffffffffffff16115b15611551576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519650505080806115f79061367e565b9150506111f0565b5060075467ffffffffffffffff6801000000000000000090910481169084161115611656576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691909117909155600583905585908281169085161461178d5760006116ad83866132fc565b90506116c367ffffffffffffffff8216836136b6565b91506117447f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166116fc6106a4565b61170691906136cf565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691906129b7565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b61188b337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa15801561181e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184291906132b4565b61184c91906136cf565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190612a90565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156118f357600080fd5b505af1158015611907573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af11580156119ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119cf919061351a565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611a6a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615611aa7576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611b54576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016110e2565b60015473ffffffffffffffffffffffffffffffffffffffff163314611c18576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b606060006040518060600160405280602181526020016138eb6021913960405163ffffffff808816602483015273ffffffffffffffffffffffffffffffffffffffff871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa6084820152600060a482015260c401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd3476afe000000000000000000000000000000000000000000000000000000001790529051611d93939291016136e6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015611e21573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611e99576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051600090611edf9084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001613715565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152919052979650505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611f6f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016110e2565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612039576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036120458282613400565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516110e29190612e7d565b6040518060600160405280602181526020016138eb6021913981565b60085460ff166120cd576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003612109576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612145576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612180918491700100000000000000000000000000000000900416613771565b11156121b8576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b838110156124475760008686838181106121fd576121fd613559565b905060200281019061220f9190613784565b612218906137b8565b90508361222481613657565b825180516020918201208185015160408087015190519499509194506000936122869386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff891660009081526006909352912054909150811461230f576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86166000908152600660205260408120556123346001886136b6565b84036123a35742600760189054906101000a900467ffffffffffffffff1684604001516123619190613836565b67ffffffffffffffff1611156123a3576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450505050808061243f9061367e565b9150506121e1565b506124757f0000000000000000000000000000000000000000000000000000000000000000846116fc6106a4565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612564573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612588919061351a565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612604576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612671573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061269591906132b4565b9050818111156126d1576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138883111561270d576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61274f73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084612a90565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e091906132b4565b600780549192506801000000000000000090910467ffffffffffffffff1690600861280a83613657565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612841929190613857565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612951576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26129b0565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931823388886040516129a79493929190613867565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052612a8b9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612af4565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612aee9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612a09565b50505050565b6000612b56826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612c009092919063ffffffff16565b805190915015612a8b5780806020019051810190612b749190613537565b612a8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610a52565b6060612c0f8484600085612c17565b949350505050565b606082471015612ca9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610a52565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612cd291906138d8565b60006040518083038185875af1925050503d8060008114612d0f576040519150601f19603f3d011682016040523d82523d6000602084013e612d14565b606091505b5091509150612d2587838387612d30565b979650505050505050565b60608315612dc6578251600003612dbf5773ffffffffffffffffffffffffffffffffffffffff85163b612dbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a52565b5081612c0f565b612c0f8383815115612ddb5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a529190612e7d565b60005b83811015612e2a578181015183820152602001612e12565b50506000910152565b60008151808452612e4b816020860160208601612e0f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612e906020830184612e33565b9392505050565b67ffffffffffffffff81168114612ead57600080fd5b50565b803573ffffffffffffffffffffffffffffffffffffffff81168114612ed457600080fd5b919050565b600080600060608486031215612eee57600080fd5b8335612ef981612e97565b925060208401359150612f0e60408501612eb0565b90509250925092565b803563ffffffff81168114612ed457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112612f6b57600080fd5b813567ffffffffffffffff80821115612f8657612f86612f2b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612fcc57612fcc612f2b565b81604052838152866020858801011115612fe557600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121561302057600080fd5b61302988612eb0565b965061303760208901612eb0565b955061304560408901612f17565b945061305360608901612eb0565b935061306160808901612f17565b925060a088013567ffffffffffffffff8082111561307e57600080fd5b61308a8b838c01612f5a565b935060c08a01359150808211156130a057600080fd5b506130ad8a828b01612f5a565b91505092959891949750929550565b6000602082840312156130ce57600080fd5b8135612e9081612e97565b60008083601f8401126130eb57600080fd5b50813567ffffffffffffffff81111561310357600080fd5b6020830191508360208260051b850101111561311e57600080fd5b9250929050565b60008060006040848603121561313a57600080fd5b833567ffffffffffffffff81111561315157600080fd5b61315d868287016130d9565b9094509250612f0e905060208501612eb0565b60006020828403121561318257600080fd5b612e9082612eb0565b6000806000606084860312156131a057600080fd5b6131a984612f17565b92506131b760208501612eb0565b9150612f0e60408501612f17565b6000602082840312156131d757600080fd5b813567ffffffffffffffff8111156131ee57600080fd5b612c0f84828501612f5a565b6000806020838503121561320d57600080fd5b823567ffffffffffffffff81111561322457600080fd5b613230858286016130d9565b90969095509350505050565b60008060006040848603121561325157600080fd5b833567ffffffffffffffff8082111561326957600080fd5b818601915086601f83011261327d57600080fd5b81358181111561328c57600080fd5b87602082850101111561329e57600080fd5b6020928301989097509590910135949350505050565b6000602082840312156132c657600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff82811682821603908082111561331d5761331d6132cd565b5092915050565b60008261335a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061337357607f821691505b6020821081036133ac577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f821115612a8b57600081815260208120601f850160051c810160208610156133d95750805b601f850160051c820191505b818110156133f8578281556001016133e5565b505050505050565b815167ffffffffffffffff81111561341a5761341a612f2b565b61342e81613428845461335f565b846133b2565b602080601f831160018114613481576000841561344b5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556133f8565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156134ce578886015182559484019460019091019084016134af565b508582101561350a57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121561352c57600080fd5b8151612e9081612e97565b60006020828403121561354957600080fd5b81518015158114612e9057600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126135bc57600080fd5b9190910192915050565b6000608082360312156135d857600080fd5b6040516080810167ffffffffffffffff82821081831117156135fc576135fc612f2b565b81604052843591508082111561361157600080fd5b5061361e36828601612f5a565b82525060208301356020820152604083013561363981612e97565b6040820152606083013561364c81612e97565b606082015292915050565b600067ffffffffffffffff808316818103613674576136746132cd565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036136af576136af6132cd565b5060010190565b818103818111156136c9576136c96132cd565b92915050565b80820281158282048414176136c9576136c96132cd565b600083516136f8818460208801612e0f565b83519083019061370c818360208801612e0f565b01949350505050565b60008651613727818460208b01612e0f565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b808201808211156136c9576136c96132cd565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126135bc57600080fd5b6000606082360312156137ca57600080fd5b6040516060810167ffffffffffffffff82821081831117156137ee576137ee612f2b565b81604052843591508082111561380357600080fd5b5061381036828601612f5a565b82525060208301356020820152604083013561382b81612e97565b604082015292915050565b67ffffffffffffffff81811683821601908082111561331d5761331d6132cd565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b600082516135bc818460208701612e0f56fef8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a2646970667358221220317f572504470f2d6a52f975c62fbecafc00b9dc2adc0055266c25247ace451064736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102765760003560e01c80636ff512cc11610160578063cfa8ed47116100d8578063e46761c41161008c578063eaeb077b11610071578063eaeb077b14610651578063f35dda4714610664578063f851a4401461067e57600080fd5b8063e46761c41461060a578063e7a7ed021461063157600080fd5b8063d690be31116100bd578063d690be31146105e4578063d7bc90ff146105ec578063d8d1091b146105f757600080fd5b8063cfa8ed471461059d578063d02103ca146105bd57600080fd5b8063a3c573eb1161012f578063b0afe15411610114578063b0afe1541461054e578063c754c7ed1461055a578063c89e42df1461058a57600080fd5b8063a3c573eb14610514578063ada8f9191461053b57600080fd5b80636ff512cc146104cb5780638c3d7301146104de57806399af0397146104e65780639e001877146104f957600080fd5b806345605267116101f3578063542028d5116101c25780635ec91958116101a75780635ec919581461049a5780636b8616ce146104a25780636e05d2cd146104c257600080fd5b8063542028d51461047f5780635e9145c91461048757600080fd5b8063456052671461040a57806347ebf1081461043257806349b7b802146104455780634e4877061461046c57600080fd5b80632b35b3ac1161024a5780633c351e101161022f5780633c351e101461034f5780633cbc795b1461037457806340b5de6c146103b257600080fd5b80632b35b3ac1461031d57806332c2d1531461033a57600080fd5b8062d0295d1461027b578063107bf28c1461029657806319d8ac61146102ab57806326782247146102d8575b600080fd5b6102836106a4565b6040519081526020015b60405180910390f35b61029e6107c4565b60405161028d9190612e7d565b6007546102bf9067ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161028d565b6001546102f89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161028d565b60085461032a9060ff1681565b604051901515815260200161028d565b61034d610348366004612ed9565b610852565b005b6008546102f890610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60085461039d907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161028d565b6103d97fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161028d565b6007546102bf90700100000000000000000000000000000000900467ffffffffffffffff1681565b61034d610440366004613005565b610921565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b61034d61047a3660046130bc565b610ed3565b61029e6110ed565b61034d610495366004613125565b6110fa565b61034d611a13565b6102836104b03660046130bc565b60066020526000908152604090205481565b61028360055481565b61034d6104d9366004613170565b611afd565b61034d611bc7565b61029e6104f436600461318b565b611c9a565b6102f873a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b61034d610549366004613170565b611f18565b6102836405ca1ab1e081565b6007546102bf907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61034d6105983660046131c5565b611fe2565b6002546102f89073ffffffffffffffffffffffffffffffffffffffff1681565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b61029e612075565b610283635ca1ab1e81565b61034d6106053660046131fa565b612091565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b6007546102bf9068010000000000000000900467ffffffffffffffff1681565b61034d61065f36600461323c565b6125c8565b61066c601b81565b60405160ff909116815260200161028d565b6000546102f89062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610733573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075791906132b4565b6007549091506000906107969067ffffffffffffffff7001000000000000000000000000000000008204811691680100000000000000009004166132fc565b67ffffffffffffffff169050806000036107b35760009250505090565b6107bd8183613324565b9250505090565b600480546107d19061335f565b80601f01602080910402602001604051908101604052809291908181526020018280546107fd9061335f565b801561084a5780601f1061081f5761010080835404028352916020019161084a565b820191906000526020600020905b81548152906001019060200180831161082d57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146108c1576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59668460405161091491815260200190565b60405180910390a3505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610990576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156109b05750600054600160ff909116105b806109ca5750303b1580156109ca575060005460ff166001145b610a5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610ab957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8b81169190910291909117909155600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000169189169190911790556003610b418482613400565b506004610b4e8382613400565b506007805477ffffffffffffffffffffffffffffffffffffffffffffffff167a06978000000000000000000000000000000000000000000000000017905573ffffffffffffffffffffffffffffffffffffffff8516610be55763ffffffff841615610be5576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8816027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff8716021790556000610c78878787611c9a565b805160208083019190912060408051600093810184905290810182905260608082018490524260c081901b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015293945090929190609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291506000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e29919061351a565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050508015610ec957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610f2a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610f71576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fdc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110009190613537565b6110695760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611069576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546107d19061335f565b60025473ffffffffffffffffffffffffffffffffffffffff16331461114b576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003611187576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156111c3576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156115ff57600089898381811061120c5761120c613559565b905060200281019061121e9190613588565b611227906135c6565b8051805160209091012060608201519192509067ffffffffffffffff16156113aa578561125381613657565b965050600081836020015184606001516040516020016112ab93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114611334576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff16101561138a576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86166000908152600660205260408120556114e7565b602082015115801590611471575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af115801561144b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146f91906132b4565b155b156114a8576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156114e7576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff16108061151a575042826040015167ffffffffffffffff16115b15611551576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519650505080806115f79061367e565b9150506111f0565b5060075467ffffffffffffffff6801000000000000000090910481169084161115611656576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691909117909155600583905585908281169085161461178d5760006116ad83866132fc565b90506116c367ffffffffffffffff8216836136b6565b91506117447f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166116fc6106a4565b61170691906136cf565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691906129b7565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b61188b337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa15801561181e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184291906132b4565b61184c91906136cf565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190612a90565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156118f357600080fd5b505af1158015611907573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af11580156119ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119cf919061351a565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611a6a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615611aa7576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611b54576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016110e2565b60015473ffffffffffffffffffffffffffffffffffffffff163314611c18576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b606060006040518060600160405280602181526020016138eb6021913960405163ffffffff808816602483015273ffffffffffffffffffffffffffffffffffffffff871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa6084820152600060a482015260c401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd3476afe000000000000000000000000000000000000000000000000000000001790529051611d93939291016136e6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015611e21573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611e99576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051600090611edf9084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001613715565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152919052979650505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611f6f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016110e2565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612039576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036120458282613400565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516110e29190612e7d565b6040518060600160405280602181526020016138eb6021913981565b60085460ff166120cd576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003612109576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612145576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612180918491700100000000000000000000000000000000900416613771565b11156121b8576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b838110156124475760008686838181106121fd576121fd613559565b905060200281019061220f9190613784565b612218906137b8565b90508361222481613657565b825180516020918201208185015160408087015190519499509194506000936122869386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff891660009081526006909352912054909150811461230f576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86166000908152600660205260408120556123346001886136b6565b84036123a35742600760189054906101000a900467ffffffffffffffff1684604001516123619190613836565b67ffffffffffffffff1611156123a3576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450505050808061243f9061367e565b9150506121e1565b506124757f0000000000000000000000000000000000000000000000000000000000000000846116fc6106a4565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612564573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612588919061351a565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612604576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612671573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061269591906132b4565b9050818111156126d1576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138883111561270d576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61274f73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084612a90565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e091906132b4565b600780549192506801000000000000000090910467ffffffffffffffff1690600861280a83613657565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612841929190613857565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612951576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26129b0565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931823388886040516129a79493929190613867565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052612a8b9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612af4565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612aee9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612a09565b50505050565b6000612b56826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612c009092919063ffffffff16565b805190915015612a8b5780806020019051810190612b749190613537565b612a8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610a52565b6060612c0f8484600085612c17565b949350505050565b606082471015612ca9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610a52565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612cd291906138d8565b60006040518083038185875af1925050503d8060008114612d0f576040519150601f19603f3d011682016040523d82523d6000602084013e612d14565b606091505b5091509150612d2587838387612d30565b979650505050505050565b60608315612dc6578251600003612dbf5773ffffffffffffffffffffffffffffffffffffffff85163b612dbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a52565b5081612c0f565b612c0f8383815115612ddb5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a529190612e7d565b60005b83811015612e2a578181015183820152602001612e12565b50506000910152565b60008151808452612e4b816020860160208601612e0f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612e906020830184612e33565b9392505050565b67ffffffffffffffff81168114612ead57600080fd5b50565b803573ffffffffffffffffffffffffffffffffffffffff81168114612ed457600080fd5b919050565b600080600060608486031215612eee57600080fd5b8335612ef981612e97565b925060208401359150612f0e60408501612eb0565b90509250925092565b803563ffffffff81168114612ed457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112612f6b57600080fd5b813567ffffffffffffffff80821115612f8657612f86612f2b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612fcc57612fcc612f2b565b81604052838152866020858801011115612fe557600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121561302057600080fd5b61302988612eb0565b965061303760208901612eb0565b955061304560408901612f17565b945061305360608901612eb0565b935061306160808901612f17565b925060a088013567ffffffffffffffff8082111561307e57600080fd5b61308a8b838c01612f5a565b935060c08a01359150808211156130a057600080fd5b506130ad8a828b01612f5a565b91505092959891949750929550565b6000602082840312156130ce57600080fd5b8135612e9081612e97565b60008083601f8401126130eb57600080fd5b50813567ffffffffffffffff81111561310357600080fd5b6020830191508360208260051b850101111561311e57600080fd5b9250929050565b60008060006040848603121561313a57600080fd5b833567ffffffffffffffff81111561315157600080fd5b61315d868287016130d9565b9094509250612f0e905060208501612eb0565b60006020828403121561318257600080fd5b612e9082612eb0565b6000806000606084860312156131a057600080fd5b6131a984612f17565b92506131b760208501612eb0565b9150612f0e60408501612f17565b6000602082840312156131d757600080fd5b813567ffffffffffffffff8111156131ee57600080fd5b612c0f84828501612f5a565b6000806020838503121561320d57600080fd5b823567ffffffffffffffff81111561322457600080fd5b613230858286016130d9565b90969095509350505050565b60008060006040848603121561325157600080fd5b833567ffffffffffffffff8082111561326957600080fd5b818601915086601f83011261327d57600080fd5b81358181111561328c57600080fd5b87602082850101111561329e57600080fd5b6020928301989097509590910135949350505050565b6000602082840312156132c657600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff82811682821603908082111561331d5761331d6132cd565b5092915050565b60008261335a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061337357607f821691505b6020821081036133ac577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f821115612a8b57600081815260208120601f850160051c810160208610156133d95750805b601f850160051c820191505b818110156133f8578281556001016133e5565b505050505050565b815167ffffffffffffffff81111561341a5761341a612f2b565b61342e81613428845461335f565b846133b2565b602080601f831160018114613481576000841561344b5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556133f8565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156134ce578886015182559484019460019091019084016134af565b508582101561350a57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121561352c57600080fd5b8151612e9081612e97565b60006020828403121561354957600080fd5b81518015158114612e9057600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126135bc57600080fd5b9190910192915050565b6000608082360312156135d857600080fd5b6040516080810167ffffffffffffffff82821081831117156135fc576135fc612f2b565b81604052843591508082111561361157600080fd5b5061361e36828601612f5a565b82525060208301356020820152604083013561363981612e97565b6040820152606083013561364c81612e97565b606082015292915050565b600067ffffffffffffffff808316818103613674576136746132cd565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036136af576136af6132cd565b5060010190565b818103818111156136c9576136c96132cd565b92915050565b80820281158282048414176136c9576136c96132cd565b600083516136f8818460208801612e0f565b83519083019061370c818360208801612e0f565b01949350505050565b60008651613727818460208b01612e0f565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b808201808211156136c9576136c96132cd565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126135bc57600080fd5b6000606082360312156137ca57600080fd5b6040516060810167ffffffffffffffff82821081831117156137ee576137ee612f2b565b81604052843591508082111561380357600080fd5b5061381036828601612f5a565b82525060208301356020820152604083013561382b81612e97565b604082015292915050565b67ffffffffffffffff81811683821601908082111561331d5761331d6132cd565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b600082516135bc818460208701612e0f56fef8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a2646970667358221220317f572504470f2d6a52f975c62fbecafc00b9dc2adc0055266c25247ace451064736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/paris/PolygonZkEVMV2Existent.json b/compiled-contracts/paris/PolygonZkEVMV2Existent.json new file mode 100644 index 000000000..f06764216 --- /dev/null +++ b/compiled-contracts/paris/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": "0x6101006040523480156200001257600080fd5b5060405162003e8e38038062003e8e833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e051613cf66200019860003960008181610465015281816108820152818161095101528181610dd501528181610fa1015281816116f8015281816117c1015281816117e30152818161197a01528181612012015281816127600152818161282e015261291b01526000818161053401526118bb0152600081816105f00152818161141b0152612a6601526000818161063d0152818161071a0152818161174b015281816118910152612a3a0152613cf66000f3fe608060405234801561001057600080fd5b50600436106102915760003560e01c80638c3d730111610160578063cfa8ed47116100d8578063e46761c41161008c578063eaeb077b11610071578063eaeb077b1461067f578063f35dda4714610692578063f851a440146106ac57600080fd5b8063e46761c414610638578063e7a7ed021461065f57600080fd5b8063d690be31116100bd578063d690be3114610612578063d7bc90ff1461061a578063d8d1091b1461062557600080fd5b8063cfa8ed47146105cb578063d02103ca146105eb57600080fd5b8063ada8f9191161012f578063bb59070811610114578063bb59070814610575578063c754c7ed14610588578063c89e42df146105b857600080fd5b8063ada8f91914610556578063b0afe1541461056957600080fd5b80638c3d7301146104f957806399af0397146105015780639e00187714610514578063a3c573eb1461052f57600080fd5b8063456052671161020e5780635e9145c9116101c25780636b8616ce116101a75780636b8616ce146104bd5780636e05d2cd146104dd5780636ff512cc146104e657600080fd5b80635e9145c9146104a25780635ec91958146104b557600080fd5b806349b7b802116101f357806349b7b802146104605780634e48770614610487578063542028d51461049a57600080fd5b8063456052671461042557806347ebf1081461044d57600080fd5b80632b35b3ac116102655780633c351e101161024a5780633c351e101461036a5780633cbc795b1461038f57806340b5de6c146103cd57600080fd5b80632b35b3ac1461033857806332c2d1531461035557600080fd5b8062d0295d14610296578063107bf28c146102b157806319d8ac61146102c657806326782247146102f3575b600080fd5b61029e6106d2565b6040519081526020015b60405180910390f35b6102b96107f2565b6040516102a89190613190565b6007546102da9067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102a8565b6001546103139073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102a8565b6008546103459060ff1681565b60405190151581526020016102a8565b6103686103633660046131ec565b610880565b005b60085461031390610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6008546103b8907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102a8565b6103f47fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102a8565b6007546102da90700100000000000000000000000000000000900467ffffffffffffffff1681565b61036861045b366004613318565b61094f565b6103137f000000000000000000000000000000000000000000000000000000000000000081565b6103686104953660046133cf565b610f01565b6102b961111b565b6103686104b0366004613438565b611128565b610368611a41565b61029e6104cb3660046133cf565b60066020526000908152604090205481565b61029e60055481565b6103686104f4366004613483565b611b2b565b610368611bf5565b6102b961050f36600461349e565b611cc8565b61031373a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103137f000000000000000000000000000000000000000000000000000000000000000081565b610368610564366004613483565b611f46565b61029e6405ca1ab1e081565b6103686105833660046134d8565b612010565b6007546102da907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6103686105c636600461357a565b6122f5565b6002546103139073ffffffffffffffffffffffffffffffffffffffff1681565b6103137f000000000000000000000000000000000000000000000000000000000000000081565b6102b9612388565b61029e635ca1ab1e81565b6103686106333660046135af565b6123a4565b6103137f000000000000000000000000000000000000000000000000000000000000000081565b6007546102da9068010000000000000000900467ffffffffffffffff1681565b61036861068d3660046135f1565b6128db565b61069a601b81565b60405160ff90911681526020016102a8565b6000546103139062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610761573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107859190613669565b6007549091506000906107c49067ffffffffffffffff7001000000000000000000000000000000008204811691680100000000000000009004166136b1565b67ffffffffffffffff169050806000036107e15760009250505090565b6107eb81836136d9565b9250505090565b600480546107ff90613714565b80601f016020809104026020016040519081016040528092919081815260200182805461082b90613714565b80156108785780601f1061084d57610100808354040283529160200191610878565b820191906000526020600020905b81548152906001019060200180831161085b57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146108ef576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59668460405161094291815260200190565b60405180910390a3505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109be576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156109de5750600054600160ff909116105b806109f85750303b1580156109f8575060005460ff166001145b610a89576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610ae757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8b81169190910291909117909155600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000169189169190911790556003610b6f84826137b5565b506004610b7c83826137b5565b506007805477ffffffffffffffffffffffffffffffffffffffffffffffff167a06978000000000000000000000000000000000000000000000000017905573ffffffffffffffffffffffffffffffffffffffff8516610c135763ffffffff841615610c13576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8816027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff8716021790556000610ca6878787611cc8565b805160208083019190912060408051600093810184905290810182905260608082018490524260c081901b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015293945090929190609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291506000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015610e33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5791906138cf565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050508015610ef757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610f58576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610f9f576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102e91906138ec565b6110975760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611097576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546107ff90613714565b60025473ffffffffffffffffffffffffffffffffffffffff163314611179576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160008190036111b5576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156111f1576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b8581101561162d57600089898381811061123a5761123a61390e565b905060200281019061124c919061393d565b6112559061397b565b8051805160209091012060608201519192509067ffffffffffffffff16156113d8578561128181613a0c565b965050600081836020015184606001516040516020016112d993929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114611362576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff1610156113b8576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055611515565b60208201511580159061149f575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015611479573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149d9190613669565b155b156114d6576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611515576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff161080611548575042826040015167ffffffffffffffff16115b1561157f576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061162590613a33565b91505061121e565b5060075467ffffffffffffffff6801000000000000000090910481169084161115611684576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146117bb5760006116db83866136b1565b90506116f167ffffffffffffffff821683613a6b565b91506117727f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661172a6106d2565b6117349190613a84565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190612cca565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6118b9337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa15801561184c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118709190613669565b61187a9190613a84565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190612da3565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561192157600080fd5b505af1158015611935573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af11580156119d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119fd91906138cf565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611a98576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615611ad5576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611b82576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001611110565b60015473ffffffffffffffffffffffffffffffffffffffff163314611c46576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60606000604051806060016040528060218152602001613ca06021913960405163ffffffff808816602483015273ffffffffffffffffffffffffffffffffffffffff871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa6084820152600060a482015260c401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd3476afe000000000000000000000000000000000000000000000000000000001790529051611dc193929101613a9b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015611e4f573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611ec7576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051600090611f0d9084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001613aca565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152919052979650505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611f9d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001611110565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461207f576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff161580801561209f5750600054600160ff909116105b806120b95750303b1580156120b9575060005460ff166001145b612145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a80565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156121a357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8a81169190910291909117909155600280547fffffffffffffffffffffffff000000000000000000000000000000000000000016918816919091179055600361222b86826137b5565b50600461223885826137b5565b506005839055600780547a06978000000000000000000000000000000000000000000000000077ffffffffffffffffffffffffffffffff000000000000000090911667ffffffffffffffff85161717905580156122ec57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461234c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361235882826137b5565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516111109190613190565b604051806060016040528060218152602001613ca06021913981565b60085460ff166123e0576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081900361241c576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612458576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612493918491700100000000000000000000000000000000900416613b26565b11156124cb576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b8381101561275a5760008686838181106125105761251061390e565b90506020028101906125229190613b39565b61252b90613b6d565b90508361253781613a0c565b825180516020918201208185015160408087015190519499509194506000936125999386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612622576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055612647600188613a6b565b84036126b65742600760189054906101000a900467ffffffffffffffff1684604001516126749190613beb565b67ffffffffffffffff1611156126b6576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450505050808061275290613a33565b9150506124f4565b506127887f00000000000000000000000000000000000000000000000000000000000000008461172a6106d2565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612877573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289b91906138cf565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612917576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612984573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a89190613669565b9050818111156129e4576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612a20576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a6273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084612da3565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612acf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af39190613669565b600780549192506801000000000000000090910467ffffffffffffffff16906008612b1d83613a0c565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612b54929190613c0c565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612c64576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612cc3565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612cba9493929190613c1c565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052612d9e9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612e07565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612e019085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612d1c565b50505050565b6000612e69826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612f139092919063ffffffff16565b805190915015612d9e5780806020019051810190612e8791906138ec565b612d9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610a80565b6060612f228484600085612f2a565b949350505050565b606082471015612fbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610a80565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612fe59190613c8d565b60006040518083038185875af1925050503d8060008114613022576040519150601f19603f3d011682016040523d82523d6000602084013e613027565b606091505b509150915061303887838387613043565b979650505050505050565b606083156130d95782516000036130d25773ffffffffffffffffffffffffffffffffffffffff85163b6130d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a80565b5081612f22565b612f2283838151156130ee5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a809190613190565b60005b8381101561313d578181015183820152602001613125565b50506000910152565b6000815180845261315e816020860160208601613122565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006131a36020830184613146565b9392505050565b67ffffffffffffffff811681146131c057600080fd5b50565b803573ffffffffffffffffffffffffffffffffffffffff811681146131e757600080fd5b919050565b60008060006060848603121561320157600080fd5b833561320c816131aa565b925060208401359150613221604085016131c3565b90509250925092565b803563ffffffff811681146131e757600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261327e57600080fd5b813567ffffffffffffffff808211156132995761329961323e565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156132df576132df61323e565b816040528381528660208588010111156132f857600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121561333357600080fd5b61333c886131c3565b965061334a602089016131c3565b95506133586040890161322a565b9450613366606089016131c3565b93506133746080890161322a565b925060a088013567ffffffffffffffff8082111561339157600080fd5b61339d8b838c0161326d565b935060c08a01359150808211156133b357600080fd5b506133c08a828b0161326d565b91505092959891949750929550565b6000602082840312156133e157600080fd5b81356131a3816131aa565b60008083601f8401126133fe57600080fd5b50813567ffffffffffffffff81111561341657600080fd5b6020830191508360208260051b850101111561343157600080fd5b9250929050565b60008060006040848603121561344d57600080fd5b833567ffffffffffffffff81111561346457600080fd5b613470868287016133ec565b90945092506132219050602085016131c3565b60006020828403121561349557600080fd5b6131a3826131c3565b6000806000606084860312156134b357600080fd5b6134bc8461322a565b92506134ca602085016131c3565b91506132216040850161322a565b60008060008060008060c087890312156134f157600080fd5b6134fa876131c3565b9550613508602088016131c3565b9450604087013567ffffffffffffffff8082111561352557600080fd5b6135318a838b0161326d565b9550606089013591508082111561354757600080fd5b5061355489828a0161326d565b9350506080870135915060a087013561356c816131aa565b809150509295509295509295565b60006020828403121561358c57600080fd5b813567ffffffffffffffff8111156135a357600080fd5b612f228482850161326d565b600080602083850312156135c257600080fd5b823567ffffffffffffffff8111156135d957600080fd5b6135e5858286016133ec565b90969095509350505050565b60008060006040848603121561360657600080fd5b833567ffffffffffffffff8082111561361e57600080fd5b818601915086601f83011261363257600080fd5b81358181111561364157600080fd5b87602082850101111561365357600080fd5b6020928301989097509590910135949350505050565b60006020828403121561367b57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8281168282160390808211156136d2576136d2613682565b5092915050565b60008261370f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061372857607f821691505b602082108103613761577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f821115612d9e57600081815260208120601f850160051c8101602086101561378e5750805b601f850160051c820191505b818110156137ad5782815560010161379a565b505050505050565b815167ffffffffffffffff8111156137cf576137cf61323e565b6137e3816137dd8454613714565b84613767565b602080601f83116001811461383657600084156138005750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556137ad565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561388357888601518255948401946001909101908401613864565b50858210156138bf57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156138e157600080fd5b81516131a3816131aa565b6000602082840312156138fe57600080fd5b815180151581146131a357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261397157600080fd5b9190910192915050565b60006080823603121561398d57600080fd5b6040516080810167ffffffffffffffff82821081831117156139b1576139b161323e565b8160405284359150808211156139c657600080fd5b506139d33682860161326d565b8252506020830135602082015260408301356139ee816131aa565b60408201526060830135613a01816131aa565b606082015292915050565b600067ffffffffffffffff808316818103613a2957613a29613682565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613a6457613a64613682565b5060010190565b81810381811115613a7e57613a7e613682565b92915050565b8082028115828204841417613a7e57613a7e613682565b60008351613aad818460208801613122565b835190830190613ac1818360208801613122565b01949350505050565b60008651613adc818460208b01613122565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b80820180821115613a7e57613a7e613682565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261397157600080fd5b600060608236031215613b7f57600080fd5b6040516060810167ffffffffffffffff8282108183111715613ba357613ba361323e565b816040528435915080821115613bb857600080fd5b50613bc53682860161326d565b825250602083013560208201526040830135613be0816131aa565b604082015292915050565b67ffffffffffffffff8181168382160190808211156136d2576136d2613682565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b6000825161397181846020870161312256fef8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a2646970667358221220b8b9cc96275e330f97fe9d7a8ab9abb8b4daa7d33c46484329c4b87e82b6de6464736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102915760003560e01c80638c3d730111610160578063cfa8ed47116100d8578063e46761c41161008c578063eaeb077b11610071578063eaeb077b1461067f578063f35dda4714610692578063f851a440146106ac57600080fd5b8063e46761c414610638578063e7a7ed021461065f57600080fd5b8063d690be31116100bd578063d690be3114610612578063d7bc90ff1461061a578063d8d1091b1461062557600080fd5b8063cfa8ed47146105cb578063d02103ca146105eb57600080fd5b8063ada8f9191161012f578063bb59070811610114578063bb59070814610575578063c754c7ed14610588578063c89e42df146105b857600080fd5b8063ada8f91914610556578063b0afe1541461056957600080fd5b80638c3d7301146104f957806399af0397146105015780639e00187714610514578063a3c573eb1461052f57600080fd5b8063456052671161020e5780635e9145c9116101c25780636b8616ce116101a75780636b8616ce146104bd5780636e05d2cd146104dd5780636ff512cc146104e657600080fd5b80635e9145c9146104a25780635ec91958146104b557600080fd5b806349b7b802116101f357806349b7b802146104605780634e48770614610487578063542028d51461049a57600080fd5b8063456052671461042557806347ebf1081461044d57600080fd5b80632b35b3ac116102655780633c351e101161024a5780633c351e101461036a5780633cbc795b1461038f57806340b5de6c146103cd57600080fd5b80632b35b3ac1461033857806332c2d1531461035557600080fd5b8062d0295d14610296578063107bf28c146102b157806319d8ac61146102c657806326782247146102f3575b600080fd5b61029e6106d2565b6040519081526020015b60405180910390f35b6102b96107f2565b6040516102a89190613190565b6007546102da9067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102a8565b6001546103139073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102a8565b6008546103459060ff1681565b60405190151581526020016102a8565b6103686103633660046131ec565b610880565b005b60085461031390610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6008546103b8907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102a8565b6103f47fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102a8565b6007546102da90700100000000000000000000000000000000900467ffffffffffffffff1681565b61036861045b366004613318565b61094f565b6103137f000000000000000000000000000000000000000000000000000000000000000081565b6103686104953660046133cf565b610f01565b6102b961111b565b6103686104b0366004613438565b611128565b610368611a41565b61029e6104cb3660046133cf565b60066020526000908152604090205481565b61029e60055481565b6103686104f4366004613483565b611b2b565b610368611bf5565b6102b961050f36600461349e565b611cc8565b61031373a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103137f000000000000000000000000000000000000000000000000000000000000000081565b610368610564366004613483565b611f46565b61029e6405ca1ab1e081565b6103686105833660046134d8565b612010565b6007546102da907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6103686105c636600461357a565b6122f5565b6002546103139073ffffffffffffffffffffffffffffffffffffffff1681565b6103137f000000000000000000000000000000000000000000000000000000000000000081565b6102b9612388565b61029e635ca1ab1e81565b6103686106333660046135af565b6123a4565b6103137f000000000000000000000000000000000000000000000000000000000000000081565b6007546102da9068010000000000000000900467ffffffffffffffff1681565b61036861068d3660046135f1565b6128db565b61069a601b81565b60405160ff90911681526020016102a8565b6000546103139062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610761573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107859190613669565b6007549091506000906107c49067ffffffffffffffff7001000000000000000000000000000000008204811691680100000000000000009004166136b1565b67ffffffffffffffff169050806000036107e15760009250505090565b6107eb81836136d9565b9250505090565b600480546107ff90613714565b80601f016020809104026020016040519081016040528092919081815260200182805461082b90613714565b80156108785780601f1061084d57610100808354040283529160200191610878565b820191906000526020600020905b81548152906001019060200180831161085b57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146108ef576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59668460405161094291815260200190565b60405180910390a3505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109be576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156109de5750600054600160ff909116105b806109f85750303b1580156109f8575060005460ff166001145b610a89576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610ae757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8b81169190910291909117909155600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000169189169190911790556003610b6f84826137b5565b506004610b7c83826137b5565b506007805477ffffffffffffffffffffffffffffffffffffffffffffffff167a06978000000000000000000000000000000000000000000000000017905573ffffffffffffffffffffffffffffffffffffffff8516610c135763ffffffff841615610c13576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8816027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff8716021790556000610ca6878787611cc8565b805160208083019190912060408051600093810184905290810182905260608082018490524260c081901b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015293945090929190609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291506000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015610e33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5791906138cf565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050508015610ef757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610f58576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610f9f576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102e91906138ec565b6110975760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611097576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546107ff90613714565b60025473ffffffffffffffffffffffffffffffffffffffff163314611179576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160008190036111b5576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156111f1576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b8581101561162d57600089898381811061123a5761123a61390e565b905060200281019061124c919061393d565b6112559061397b565b8051805160209091012060608201519192509067ffffffffffffffff16156113d8578561128181613a0c565b965050600081836020015184606001516040516020016112d993929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114611362576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff1610156113b8576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055611515565b60208201511580159061149f575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015611479573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149d9190613669565b155b156114d6576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611515576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff161080611548575042826040015167ffffffffffffffff16115b1561157f576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061162590613a33565b91505061121e565b5060075467ffffffffffffffff6801000000000000000090910481169084161115611684576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146117bb5760006116db83866136b1565b90506116f167ffffffffffffffff821683613a6b565b91506117727f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661172a6106d2565b6117349190613a84565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190612cca565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6118b9337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa15801561184c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118709190613669565b61187a9190613a84565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190612da3565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561192157600080fd5b505af1158015611935573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af11580156119d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119fd91906138cf565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611a98576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615611ad5576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611b82576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001611110565b60015473ffffffffffffffffffffffffffffffffffffffff163314611c46576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60606000604051806060016040528060218152602001613ca06021913960405163ffffffff808816602483015273ffffffffffffffffffffffffffffffffffffffff871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa6084820152600060a482015260c401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd3476afe000000000000000000000000000000000000000000000000000000001790529051611dc193929101613a9b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015611e4f573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611ec7576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051600090611f0d9084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001613aca565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152919052979650505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611f9d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001611110565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461207f576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff161580801561209f5750600054600160ff909116105b806120b95750303b1580156120b9575060005460ff166001145b612145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a80565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156121a357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8a81169190910291909117909155600280547fffffffffffffffffffffffff000000000000000000000000000000000000000016918816919091179055600361222b86826137b5565b50600461223885826137b5565b506005839055600780547a06978000000000000000000000000000000000000000000000000077ffffffffffffffffffffffffffffffff000000000000000090911667ffffffffffffffff85161717905580156122ec57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461234c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361235882826137b5565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516111109190613190565b604051806060016040528060218152602001613ca06021913981565b60085460ff166123e0576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081900361241c576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612458576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612493918491700100000000000000000000000000000000900416613b26565b11156124cb576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b8381101561275a5760008686838181106125105761251061390e565b90506020028101906125229190613b39565b61252b90613b6d565b90508361253781613a0c565b825180516020918201208185015160408087015190519499509194506000936125999386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612622576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055612647600188613a6b565b84036126b65742600760189054906101000a900467ffffffffffffffff1684604001516126749190613beb565b67ffffffffffffffff1611156126b6576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450505050808061275290613a33565b9150506124f4565b506127887f00000000000000000000000000000000000000000000000000000000000000008461172a6106d2565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612877573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289b91906138cf565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612917576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612984573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a89190613669565b9050818111156129e4576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612a20576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a6273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084612da3565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612acf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af39190613669565b600780549192506801000000000000000090910467ffffffffffffffff16906008612b1d83613a0c565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612b54929190613c0c565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612c64576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612cc3565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612cba9493929190613c1c565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052612d9e9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612e07565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612e019085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612d1c565b50505050565b6000612e69826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612f139092919063ffffffff16565b805190915015612d9e5780806020019051810190612e8791906138ec565b612d9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610a80565b6060612f228484600085612f2a565b949350505050565b606082471015612fbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610a80565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612fe59190613c8d565b60006040518083038185875af1925050503d8060008114613022576040519150601f19603f3d011682016040523d82523d6000602084013e613027565b606091505b509150915061303887838387613043565b979650505050505050565b606083156130d95782516000036130d25773ffffffffffffffffffffffffffffffffffffffff85163b6130d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a80565b5081612f22565b612f2283838151156130ee5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a809190613190565b60005b8381101561313d578181015183820152602001613125565b50506000910152565b6000815180845261315e816020860160208601613122565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006131a36020830184613146565b9392505050565b67ffffffffffffffff811681146131c057600080fd5b50565b803573ffffffffffffffffffffffffffffffffffffffff811681146131e757600080fd5b919050565b60008060006060848603121561320157600080fd5b833561320c816131aa565b925060208401359150613221604085016131c3565b90509250925092565b803563ffffffff811681146131e757600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261327e57600080fd5b813567ffffffffffffffff808211156132995761329961323e565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156132df576132df61323e565b816040528381528660208588010111156132f857600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121561333357600080fd5b61333c886131c3565b965061334a602089016131c3565b95506133586040890161322a565b9450613366606089016131c3565b93506133746080890161322a565b925060a088013567ffffffffffffffff8082111561339157600080fd5b61339d8b838c0161326d565b935060c08a01359150808211156133b357600080fd5b506133c08a828b0161326d565b91505092959891949750929550565b6000602082840312156133e157600080fd5b81356131a3816131aa565b60008083601f8401126133fe57600080fd5b50813567ffffffffffffffff81111561341657600080fd5b6020830191508360208260051b850101111561343157600080fd5b9250929050565b60008060006040848603121561344d57600080fd5b833567ffffffffffffffff81111561346457600080fd5b613470868287016133ec565b90945092506132219050602085016131c3565b60006020828403121561349557600080fd5b6131a3826131c3565b6000806000606084860312156134b357600080fd5b6134bc8461322a565b92506134ca602085016131c3565b91506132216040850161322a565b60008060008060008060c087890312156134f157600080fd5b6134fa876131c3565b9550613508602088016131c3565b9450604087013567ffffffffffffffff8082111561352557600080fd5b6135318a838b0161326d565b9550606089013591508082111561354757600080fd5b5061355489828a0161326d565b9350506080870135915060a087013561356c816131aa565b809150509295509295509295565b60006020828403121561358c57600080fd5b813567ffffffffffffffff8111156135a357600080fd5b612f228482850161326d565b600080602083850312156135c257600080fd5b823567ffffffffffffffff8111156135d957600080fd5b6135e5858286016133ec565b90969095509350505050565b60008060006040848603121561360657600080fd5b833567ffffffffffffffff8082111561361e57600080fd5b818601915086601f83011261363257600080fd5b81358181111561364157600080fd5b87602082850101111561365357600080fd5b6020928301989097509590910135949350505050565b60006020828403121561367b57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8281168282160390808211156136d2576136d2613682565b5092915050565b60008261370f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061372857607f821691505b602082108103613761577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f821115612d9e57600081815260208120601f850160051c8101602086101561378e5750805b601f850160051c820191505b818110156137ad5782815560010161379a565b505050505050565b815167ffffffffffffffff8111156137cf576137cf61323e565b6137e3816137dd8454613714565b84613767565b602080601f83116001811461383657600084156138005750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556137ad565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561388357888601518255948401946001909101908401613864565b50858210156138bf57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156138e157600080fd5b81516131a3816131aa565b6000602082840312156138fe57600080fd5b815180151581146131a357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261397157600080fd5b9190910192915050565b60006080823603121561398d57600080fd5b6040516080810167ffffffffffffffff82821081831117156139b1576139b161323e565b8160405284359150808211156139c657600080fd5b506139d33682860161326d565b8252506020830135602082015260408301356139ee816131aa565b60408201526060830135613a01816131aa565b606082015292915050565b600067ffffffffffffffff808316818103613a2957613a29613682565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613a6457613a64613682565b5060010190565b81810381811115613a7e57613a7e613682565b92915050565b8082028115828204841417613a7e57613a7e613682565b60008351613aad818460208801613122565b835190830190613ac1818360208801613122565b01949350505050565b60008651613adc818460208b01613122565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b80820180821115613a7e57613a7e613682565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261397157600080fd5b600060608236031215613b7f57600080fd5b6040516060810167ffffffffffffffff8282108183111715613ba357613ba361323e565b816040528435915080821115613bb857600080fd5b50613bc53682860161326d565b825250602083013560208201526040830135613be0816131aa565b604082015292915050565b67ffffffffffffffff8181168382160190808211156136d2576136d2613682565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b6000825161397181846020870161312256fef8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a2646970667358221220b8b9cc96275e330f97fe9d7a8ab9abb8b4daa7d33c46484329c4b87e82b6de6464736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/paris/ProxyAdmin.json b/compiled-contracts/paris/ProxyAdmin.json new file mode 100644 index 000000000..50bdd2b68 --- /dev/null +++ b/compiled-contracts/paris/ProxyAdmin.json @@ -0,0 +1,160 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ProxyAdmin", + "sourceName": "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "contract TransparentUpgradeableProxy", + "name": "proxy", + "type": "address" + }, + { + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "changeProxyAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract TransparentUpgradeableProxy", + "name": "proxy", + "type": "address" + } + ], + "name": "getProxyAdmin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract TransparentUpgradeableProxy", + "name": "proxy", + "type": "address" + } + ], + "name": "getProxyImplementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract TransparentUpgradeableProxy", + "name": "proxy", + "type": "address" + }, + { + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "upgrade", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract TransparentUpgradeableProxy", + "name": "proxy", + "type": "address" + }, + { + "internalType": "address", + "name": "implementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6108658061007e6000396000f3fe60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461012b57806399a88ec41461013e578063f2fde38b1461015e578063f3b7dead1461017e57600080fd5b8063204e1c7a14610080578063715018a6146100c95780637eff275e146100e05780638da5cb5b14610100575b600080fd5b34801561008c57600080fd5b506100a061009b366004610608565b61019e565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100d557600080fd5b506100de610255565b005b3480156100ec57600080fd5b506100de6100fb36600461062c565b610269565b34801561010c57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166100a0565b6100de610139366004610694565b6102f7565b34801561014a57600080fd5b506100de61015936600461062c565b61038c565b34801561016a57600080fd5b506100de610179366004610608565b6103e8565b34801561018a57600080fd5b506100a0610199366004610608565b6104a4565b60008060008373ffffffffffffffffffffffffffffffffffffffff166040516101ea907f5c60da1b00000000000000000000000000000000000000000000000000000000815260040190565b600060405180830381855afa9150503d8060008114610225576040519150601f19603f3d011682016040523d82523d6000602084013e61022a565b606091505b50915091508161023957600080fd5b8080602001905181019061024d9190610788565b949350505050565b61025d6104f0565b6102676000610571565b565b6102716104f0565b6040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690638f283970906024015b600060405180830381600087803b1580156102db57600080fd5b505af11580156102ef573d6000803e3d6000fd5b505050505050565b6102ff6104f0565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef28690349061035590869086906004016107a5565b6000604051808303818588803b15801561036e57600080fd5b505af1158015610382573d6000803e3d6000fd5b5050505050505050565b6103946104f0565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690633659cfe6906024016102c1565b6103f06104f0565b73ffffffffffffffffffffffffffffffffffffffff8116610498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6104a181610571565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff166040516101ea907ff851a44000000000000000000000000000000000000000000000000000000000815260040190565b60005473ffffffffffffffffffffffffffffffffffffffff163314610267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161048f565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff811681146104a157600080fd5b60006020828403121561061a57600080fd5b8135610625816105e6565b9392505050565b6000806040838503121561063f57600080fd5b823561064a816105e6565b9150602083013561065a816105e6565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156106a957600080fd5b83356106b4816105e6565b925060208401356106c4816105e6565b9150604084013567ffffffffffffffff808211156106e157600080fd5b818601915086601f8301126106f557600080fd5b81358181111561070757610707610665565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561074d5761074d610665565b8160405282815289602084870101111561076657600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b60006020828403121561079a57600080fd5b8151610625816105e6565b73ffffffffffffffffffffffffffffffffffffffff8316815260006020604081840152835180604085015260005b818110156107ef578581018301518582016060015282016107d3565b5060006060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050939250505056fea2646970667358221220c9867ffac53151bdb1305d8f5e3e883cd83e5270c7ec09cdc24e837b2e65239064736f6c63430008140033", + "deployedBytecode": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461012b57806399a88ec41461013e578063f2fde38b1461015e578063f3b7dead1461017e57600080fd5b8063204e1c7a14610080578063715018a6146100c95780637eff275e146100e05780638da5cb5b14610100575b600080fd5b34801561008c57600080fd5b506100a061009b366004610608565b61019e565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100d557600080fd5b506100de610255565b005b3480156100ec57600080fd5b506100de6100fb36600461062c565b610269565b34801561010c57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166100a0565b6100de610139366004610694565b6102f7565b34801561014a57600080fd5b506100de61015936600461062c565b61038c565b34801561016a57600080fd5b506100de610179366004610608565b6103e8565b34801561018a57600080fd5b506100a0610199366004610608565b6104a4565b60008060008373ffffffffffffffffffffffffffffffffffffffff166040516101ea907f5c60da1b00000000000000000000000000000000000000000000000000000000815260040190565b600060405180830381855afa9150503d8060008114610225576040519150601f19603f3d011682016040523d82523d6000602084013e61022a565b606091505b50915091508161023957600080fd5b8080602001905181019061024d9190610788565b949350505050565b61025d6104f0565b6102676000610571565b565b6102716104f0565b6040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690638f283970906024015b600060405180830381600087803b1580156102db57600080fd5b505af11580156102ef573d6000803e3d6000fd5b505050505050565b6102ff6104f0565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef28690349061035590869086906004016107a5565b6000604051808303818588803b15801561036e57600080fd5b505af1158015610382573d6000803e3d6000fd5b5050505050505050565b6103946104f0565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690633659cfe6906024016102c1565b6103f06104f0565b73ffffffffffffffffffffffffffffffffffffffff8116610498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6104a181610571565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff166040516101ea907ff851a44000000000000000000000000000000000000000000000000000000000815260040190565b60005473ffffffffffffffffffffffffffffffffffffffff163314610267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161048f565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff811681146104a157600080fd5b60006020828403121561061a57600080fd5b8135610625816105e6565b9392505050565b6000806040838503121561063f57600080fd5b823561064a816105e6565b9150602083013561065a816105e6565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156106a957600080fd5b83356106b4816105e6565b925060208401356106c4816105e6565b9150604084013567ffffffffffffffff808211156106e157600080fd5b818601915086601f8301126106f557600080fd5b81358181111561070757610707610665565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561074d5761074d610665565b8160405282815289602084870101111561076657600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b60006020828403121561079a57600080fd5b8151610625816105e6565b73ffffffffffffffffffffffffffffffffffffffff8316815260006020604081840152835180604085015260005b818110156107ef578581018301518582016060015282016107d3565b5060006060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050939250505056fea2646970667358221220c9867ffac53151bdb1305d8f5e3e883cd83e5270c7ec09cdc24e837b2e65239064736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/paris/TokenWrapped.json b/compiled-contracts/paris/TokenWrapped.json new file mode 100644 index 000000000..a21f1b423 --- /dev/null +++ b/compiled-contracts/paris/TokenWrapped.json @@ -0,0 +1,478 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "TokenWrapped", + "sourceName": "contracts/lib/TokenWrapped.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "uint8", + "name": "__decimals", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DOMAIN_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PERMIT_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "VERSION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "bridgeAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "deploymentChainId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101006040523480156200001257600080fd5b50604051620019fa380380620019fa83398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161153e620004bc6000396000610237015260008181610307015281816105c0015261068d0152600061053a0152600081816103790152610504015261153e6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b6040516101919190611278565b60405180910390f35b6101ad6101a836600461130d565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad610204366004611337565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad61027736600461130d565b61055c565b61028f61028a36600461130d565b6105a8565b005b6101c161029f366004611373565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d5366004611373565b60056020526000908152604090205481565b610184610666565b61028f6102fd36600461130d565b610675565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c36600461130d565b61072a565b6101ad61036f36600461130d565b6107e1565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611395565b6107ef565b6101c16103bc366004611408565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f9061143b565b80601f016020809104026020016040519081016040528092919081815260200182805461046b9061143b565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610af1565b60019150505b92915050565b6000336104ea858285610c71565b6104f5858585610d2e565b506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146105375761053246610f4f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a39087906114bd565b610af1565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106585760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106628282611017565b5050565b60606004805461043f9061143b565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146107205760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d42726964676500000000000000000000000000000000606482015260840161064f565b61066282826110f0565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107d45760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161064f565b6104f58286868403610af1565b6000336104d0818585610d2e565b834211156108645760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d697400000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866108be836114d0565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610929610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156109ed573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610a6857508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610ada5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e617475726500000000000000000000000000000000000000000000000000606482015260840161064f565b610ae58a8a8a610af1565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610b795760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8216610c025760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d285781811015610d1b5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161064f565b610d288484848403610af1565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610db75760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8216610e405760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610edc5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610d28565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610f7a610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff821661107a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161064f565b806002600082825461108c91906114bd565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166111795760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156112155760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610c64565b600060208083528351808285015260005b818110156112a557858101830151858201604001528201611289565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461130857600080fd5b919050565b6000806040838503121561132057600080fd5b611329836112e4565b946020939093013593505050565b60008060006060848603121561134c57600080fd5b611355846112e4565b9250611363602085016112e4565b9150604084013590509250925092565b60006020828403121561138557600080fd5b61138e826112e4565b9392505050565b600080600080600080600060e0888a0312156113b057600080fd5b6113b9886112e4565b96506113c7602089016112e4565b95506040880135945060608801359350608088013560ff811681146113eb57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561141b57600080fd5b611424836112e4565b9150611432602084016112e4565b90509250929050565b600181811c9082168061144f57607f821691505b602082108103611488577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d661148e565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036115015761150161148e565b506001019056fea2646970667358221220b49a146f369750b7055c494881ee723d063a73d92e8391e12d74eceb27ca91ef64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b6040516101919190611278565b60405180910390f35b6101ad6101a836600461130d565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad610204366004611337565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad61027736600461130d565b61055c565b61028f61028a36600461130d565b6105a8565b005b6101c161029f366004611373565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d5366004611373565b60056020526000908152604090205481565b610184610666565b61028f6102fd36600461130d565b610675565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c36600461130d565b61072a565b6101ad61036f36600461130d565b6107e1565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611395565b6107ef565b6101c16103bc366004611408565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f9061143b565b80601f016020809104026020016040519081016040528092919081815260200182805461046b9061143b565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610af1565b60019150505b92915050565b6000336104ea858285610c71565b6104f5858585610d2e565b506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146105375761053246610f4f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a39087906114bd565b610af1565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106585760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106628282611017565b5050565b60606004805461043f9061143b565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146107205760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d42726964676500000000000000000000000000000000606482015260840161064f565b61066282826110f0565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107d45760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161064f565b6104f58286868403610af1565b6000336104d0818585610d2e565b834211156108645760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d697400000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866108be836114d0565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610929610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156109ed573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610a6857508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610ada5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e617475726500000000000000000000000000000000000000000000000000606482015260840161064f565b610ae58a8a8a610af1565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610b795760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8216610c025760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d285781811015610d1b5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161064f565b610d288484848403610af1565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610db75760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8216610e405760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610edc5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610d28565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610f7a610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff821661107a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161064f565b806002600082825461108c91906114bd565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166111795760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156112155760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610c64565b600060208083528351808285015260005b818110156112a557858101830151858201604001528201611289565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461130857600080fd5b919050565b6000806040838503121561132057600080fd5b611329836112e4565b946020939093013593505050565b60008060006060848603121561134c57600080fd5b611355846112e4565b9250611363602085016112e4565b9150604084013590509250925092565b60006020828403121561138557600080fd5b61138e826112e4565b9392505050565b600080600080600080600060e0888a0312156113b057600080fd5b6113b9886112e4565b96506113c7602089016112e4565b95506040880135945060608801359350608088013560ff811681146113eb57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561141b57600080fd5b611424836112e4565b9150611432602084016112e4565b90509250929050565b600181811c9082168061144f57607f821691505b602082108103611488577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d661148e565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036115015761150161148e565b506001019056fea2646970667358221220b49a146f369750b7055c494881ee723d063a73d92e8391e12d74eceb27ca91ef64736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/paris/TransparentUpgradeableProxy.json b/compiled-contracts/paris/TransparentUpgradeableProxy.json new file mode 100644 index 000000000..e65330111 --- /dev/null +++ b/compiled-contracts/paris/TransparentUpgradeableProxy.json @@ -0,0 +1,155 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "TransparentUpgradeableProxy", + "sourceName": "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "address", + "name": "admin_", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [], + "name": "admin", + "outputs": [ + { + "internalType": "address", + "name": "admin_", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "changeAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "implementation", + "outputs": [ + { + "internalType": "address", + "name": "implementation_", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "bytecode": "0x608060405260405162000fa938038062000fa9833981016040819052620000269162000424565b828162000036828260006200004d565b50620000449050826200007f565b50505062000557565b6200005883620000f1565b600082511180620000665750805b156200007a5762000078838362000133565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620000c160008051602062000f62833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620000ee8162000162565b50565b620000fc8162000200565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200015b838360405180606001604052806027815260200162000f826027913962000297565b9392505050565b6001600160a01b038116620001cd5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b8060008051602062000f628339815191525b80546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b0381163b6200026f5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401620001c4565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc620001df565b6060600080856001600160a01b031685604051620002b6919062000504565b600060405180830381855af49150503d8060008114620002f3576040519150601f19603f3d011682016040523d82523d6000602084013e620002f8565b606091505b5090925090506200030c8683838762000316565b9695505050505050565b606083156200038a57825160000362000382576001600160a01b0385163b620003825760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620001c4565b508162000396565b6200039683836200039e565b949350505050565b815115620003af5781518083602001fd5b8060405162461bcd60e51b8152600401620001c4919062000522565b80516001600160a01b0381168114620003e357600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200041b57818101518382015260200162000401565b50506000910152565b6000806000606084860312156200043a57600080fd5b6200044584620003cb565b92506200045560208501620003cb565b60408501519092506001600160401b03808211156200047357600080fd5b818601915086601f8301126200048857600080fd5b8151818111156200049d576200049d620003e8565b604051601f8201601f19908116603f01168101908382118183101715620004c857620004c8620003e8565b81604052828152896020848701011115620004e257600080fd5b620004f5836020830160208801620003fe565b80955050505050509250925092565b6000825162000518818460208701620003fe565b9190910192915050565b602081526000825180602084015262000543816040850160208701620003fe565b601f01601f19169190910160400192915050565b6109fb80620005676000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100a85780638f283970146100e6578063f851a440146101065761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61011b565b005b61006b61011b565b34801561008157600080fd5b5061006b61009036600461086f565b610135565b61006b6100a336600461088a565b61017f565b3480156100b457600080fd5b506100bd6101f3565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b5061006b61010136600461086f565b610231565b34801561011257600080fd5b506100bd61025e565b61012361028c565b61013361012e610363565b61036d565b565b61013d610391565b73ffffffffffffffffffffffffffffffffffffffff16330361017757610174816040518060200160405280600081525060006103d1565b50565b61017461011b565b610187610391565b73ffffffffffffffffffffffffffffffffffffffff1633036101eb576101e68383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250600192506103d1915050565b505050565b6101e661011b565b60006101fd610391565b73ffffffffffffffffffffffffffffffffffffffff16330361022657610221610363565b905090565b61022e61011b565b90565b610239610391565b73ffffffffffffffffffffffffffffffffffffffff16330361017757610174816103fc565b6000610268610391565b73ffffffffffffffffffffffffffffffffffffffff16330361022657610221610391565b610294610391565b73ffffffffffffffffffffffffffffffffffffffff163303610133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600061022161045d565b3660008037600080366000845af43d6000803e80801561038c573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b6103da83610485565b6000825111806103e75750805b156101e6576103f683836104d2565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f610425610391565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a1610174816104fe565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103b5565b61048e8161060a565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606104f7838360405180606001604052806027815260200161099f602791396106d5565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81166105a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035a565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b73ffffffffffffffffffffffffffffffffffffffff81163b6106ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e747261637400000000000000000000000000000000000000606482015260840161035a565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105c4565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516106ff9190610931565b600060405180830381855af49150503d806000811461073a576040519150601f19603f3d011682016040523d82523d6000602084013e61073f565b606091505b50915091506107508683838761075a565b9695505050505050565b606083156107f05782516000036107e95773ffffffffffffffffffffffffffffffffffffffff85163b6107e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161035a565b50816107fa565b6107fa8383610802565b949350505050565b8151156108125781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035a919061094d565b803573ffffffffffffffffffffffffffffffffffffffff8116811461086a57600080fd5b919050565b60006020828403121561088157600080fd5b6104f782610846565b60008060006040848603121561089f57600080fd5b6108a884610846565b9250602084013567ffffffffffffffff808211156108c557600080fd5b818601915086601f8301126108d957600080fd5b8135818111156108e857600080fd5b8760208285010111156108fa57600080fd5b6020830194508093505050509250925092565b60005b83811015610928578181015183820152602001610910565b50506000910152565b6000825161094381846020870161090d565b9190910192915050565b602081526000825180602084015261096c81604085016020870161090d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220701a0c26bdd76686e63fc3c65e4f28a20ba3ecc8a60246733c0627e679c9804e64736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "deployedBytecode": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100a85780638f283970146100e6578063f851a440146101065761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61011b565b005b61006b61011b565b34801561008157600080fd5b5061006b61009036600461086f565b610135565b61006b6100a336600461088a565b61017f565b3480156100b457600080fd5b506100bd6101f3565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b5061006b61010136600461086f565b610231565b34801561011257600080fd5b506100bd61025e565b61012361028c565b61013361012e610363565b61036d565b565b61013d610391565b73ffffffffffffffffffffffffffffffffffffffff16330361017757610174816040518060200160405280600081525060006103d1565b50565b61017461011b565b610187610391565b73ffffffffffffffffffffffffffffffffffffffff1633036101eb576101e68383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250600192506103d1915050565b505050565b6101e661011b565b60006101fd610391565b73ffffffffffffffffffffffffffffffffffffffff16330361022657610221610363565b905090565b61022e61011b565b90565b610239610391565b73ffffffffffffffffffffffffffffffffffffffff16330361017757610174816103fc565b6000610268610391565b73ffffffffffffffffffffffffffffffffffffffff16330361022657610221610391565b610294610391565b73ffffffffffffffffffffffffffffffffffffffff163303610133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600061022161045d565b3660008037600080366000845af43d6000803e80801561038c573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b6103da83610485565b6000825111806103e75750805b156101e6576103f683836104d2565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f610425610391565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a1610174816104fe565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103b5565b61048e8161060a565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606104f7838360405180606001604052806027815260200161099f602791396106d5565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81166105a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035a565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b73ffffffffffffffffffffffffffffffffffffffff81163b6106ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e747261637400000000000000000000000000000000000000606482015260840161035a565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105c4565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516106ff9190610931565b600060405180830381855af49150503d806000811461073a576040519150601f19603f3d011682016040523d82523d6000602084013e61073f565b606091505b50915091506107508683838761075a565b9695505050505050565b606083156107f05782516000036107e95773ffffffffffffffffffffffffffffffffffffffff85163b6107e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161035a565b50816107fa565b6107fa8383610802565b949350505050565b8151156108125781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035a919061094d565b803573ffffffffffffffffffffffffffffffffffffffff8116811461086a57600080fd5b919050565b60006020828403121561088157600080fd5b6104f782610846565b60008060006040848603121561089f57600080fd5b6108a884610846565b9250602084013567ffffffffffffffff808211156108c557600080fd5b818601915086601f8301126108d957600080fd5b8135818111156108e857600080fd5b8760208285010111156108fa57600080fd5b6020830194508093505050509250925092565b60005b83811015610928578181015183820152602001610910565b50506000910152565b6000825161094381846020870161090d565b9190910192915050565b602081526000825180602084015261096c81604085016020870161090d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220701a0c26bdd76686e63fc3c65e4f28a20ba3ecc8a60246733c0627e679c9804e64736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/paris/VerifierRollupHelperMock.json b/compiled-contracts/paris/VerifierRollupHelperMock.json new file mode 100644 index 000000000..b2751e2b5 --- /dev/null +++ b/compiled-contracts/paris/VerifierRollupHelperMock.json @@ -0,0 +1,35 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "VerifierRollupHelperMock", + "sourceName": "contracts/mocks/VerifierRollupHelperMock.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "bytes32[24]", + "name": "proof", + "type": "bytes32[24]" + }, + { + "internalType": "uint256[1]", + "name": "pubSignals", + "type": "uint256[1]" + } + ], + "name": "verifyProof", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b50610158806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80639121da8a14610030575b600080fd5b61004661003e366004610089565b600192915050565b604051901515815260200160405180910390f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008061032080848603121561009e57600080fd5b6103008401858111156100b057600080fd5b8493508561031f8601126100c357600080fd5b604051602080820182811067ffffffffffffffff821117156100e7576100e761005a565b6040529286019281888511156100fc57600080fd5b5b8484101561011457833581529281019281016100fd565b50949790965094505050505056fea264697066735822122061fd8311ce6da82f24c0874a992ea14a8aaf711e353693cae56066e3223abc5a64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80639121da8a14610030575b600080fd5b61004661003e366004610089565b600192915050565b604051901515815260200160405180910390f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008061032080848603121561009e57600080fd5b6103008401858111156100b057600080fd5b8493508561031f8601126100c357600080fd5b604051602080820182811067ffffffffffffffff821117156100e7576100e761005a565b6040529286019281888511156100fc57600080fd5b5b8484101561011457833581529281019281016100fd565b50949790965094505050505056fea264697066735822122061fd8311ce6da82f24c0874a992ea14a8aaf711e353693cae56066e3223abc5a64736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} From 34317cf4380fdbd31ebc52bb26f06841dc4fdac1 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 17 Oct 2023 09:58:54 +0200 Subject: [PATCH 070/230] ts deployment scripts --- contracts/deployment/PolygonZkEVMDeployer.sol | 2 +- contracts/v2/PolygonRollupManager.sol | 3 +- deployment/0_createGenesisMainnet.js | 343 ------------- deployment/1_createGenesis.js | 456 ----------------- deployment/1_createGenesis.ts | 484 ++++++++++++++++++ deployment/2_deployPolygonZKEVMDeployer.js | 76 --- deployment/2_deployPolygonZKEVMDeployer.ts | 92 ++++ ...eployContracts.js => 3_deployContracts.ts} | 373 +++++++------- deployment/helpers/deployment-helpers.js | 114 ----- deployment/helpers/deployment-helpers.ts | 150 ++++++ hardhat.config.ts | 9 + package-lock.json | 19 +- package.json | 3 +- tsconfig.json | 15 +- 14 files changed, 965 insertions(+), 1174 deletions(-) delete mode 100644 deployment/0_createGenesisMainnet.js delete mode 100644 deployment/1_createGenesis.js create mode 100644 deployment/1_createGenesis.ts delete mode 100644 deployment/2_deployPolygonZKEVMDeployer.js create mode 100644 deployment/2_deployPolygonZKEVMDeployer.ts rename deployment/{3_deployContracts.js => 3_deployContracts.ts} (61%) delete mode 100644 deployment/helpers/deployment-helpers.js create mode 100644 deployment/helpers/deployment-helpers.ts diff --git a/contracts/deployment/PolygonZkEVMDeployer.sol b/contracts/deployment/PolygonZkEVMDeployer.sol index 556fa1696..751abdde3 100644 --- a/contracts/deployment/PolygonZkEVMDeployer.sol +++ b/contracts/deployment/PolygonZkEVMDeployer.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.20; +pragma solidity 0.8.17; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/Create2.sol"; diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index cadc1ef9d..779bf729d 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -699,9 +699,10 @@ contract PolygonRollupManager is } //review, should check that there are not sequenced batches pending to be verified?¿? - //this way no one can break the virtual state, ( but maybe is worth to break it) + // this way no one can break the virtual state, ( but maybe is worth to break it) // Also upgrade address can send `upgradeData` to the proxy, being able to call `onVerifyBathes` maliciously // To avoid attacks, should data be empty, or should check that does not call `onVerifyBatches` + /** * @notice Upgrade an existing rollup * @param rollupContract Rollup consensus proxy address diff --git a/deployment/0_createGenesisMainnet.js b/deployment/0_createGenesisMainnet.js deleted file mode 100644 index 38a756d80..000000000 --- a/deployment/0_createGenesisMainnet.js +++ /dev/null @@ -1,343 +0,0 @@ -/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if, import/no-dynamic-require */ -/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved, no-restricted-syntax */ -const { expect } = require('chai'); -const path = require('path'); -const fs = require('fs'); -require('dotenv').config({ path: path.resolve(__dirname, '../.env') }); -const { argv } = require('yargs'); - -const DEFAULT_MNEMONIC = 'test test test test test test test test test test test junk'; -process.env.HARDHAT_NETWORK = 'hardhat'; -process.env.MNEMONIC = argv.test ? DEFAULT_MNEMONIC : process.env.MNEMONIC; -const { ethers, upgrades } = require('hardhat'); -const { - MemDB, ZkEVMDB, getPoseidon, smtUtils, -} = require('@0xpolygonhermez/zkevm-commonjs'); - -const { deployPolygonZkEVMDeployer, create2Deployment } = require('./helpers/deployment-helpers'); - -const outPath = argv.out ? argv.out : './genesis.json'; -const pathOutputJson = path.join(__dirname, outPath); - -/* - * bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; - * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; - */ -const _ADMIN_SLOT = '0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103'; -const _IMPLEMENTATION_SLOT = '0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc'; - -// Genesis mainnet address: -const mainnetZkEVMDeployerAddress = '0xCB19eDdE626906eB1EE52357a27F62dd519608C2'; -const mainnetProxyAdminAddress = '0x0F99738B2Fc14D77308337f3e2596b63aE7BCC4A'; -const mainnetZkEVMBridgeImplementationAddress = '0x5ac4182A1dd41AeEf465E40B82fd326BF66AB82C'; -const mainnetZkEVMBridgeProxyAddress = '0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe'; -const mainnetGlobalExitRootL2ImplementationAddress = '0x0200143Fa295EE4dffEF22eE2616c2E008D81688'; -const mainnetGlobalExitRootL2ProxyAddress = '0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa'; -const mainnetZkEVMTimelockAddress = '0xBBa0935Fa93Eb23de7990b47F0D96a8f75766d13'; - -const mainnetMultisig = '0x4c1665d6651ecEfa59B9B3041951608468b18891'; -const mainnetInitialZkEVMDeployerOwner = '0x4c1665d6651ecEfa59B9B3041951608468b18891'; -const mainnetMinDelayTimelock = 864000; - -async function main() { - // Constant variables - const attemptsDeployProxy = 20; - const networkIDL2 = 1; - const zkevmAddressL2 = ethers.ZeroAddress; - - const timelockAddress = mainnetMultisig; - const initialZkEVMDeployerOwner = mainnetInitialZkEVMDeployerOwner; - const salt = '0x0000000000000000000000000000000000000000000000000000000000000000'; // salt mock - const minDelayTimelock = mainnetMinDelayTimelock; - - // Load deployer - await ethers.provider.send('hardhat_impersonateAccount', [initialZkEVMDeployerOwner]); - await ethers.provider.send('hardhat_setBalance', [initialZkEVMDeployerOwner, '0xffffffffffffffff']); // 18 ethers aprox - const deployer = await ethers.getSigner(initialZkEVMDeployerOwner); - - // Deploy PolygonZkEVMDeployer if is not deployed already - const [zkEVMDeployerContract] = await deployPolygonZkEVMDeployer(initialZkEVMDeployerOwner, deployer); - - /* - * Deploy Bridge - * Deploy admin --> implementation --> proxy - */ - - // Deploy proxy admin: - const proxyAdminFactory = await ethers.getContractFactory('ProxyAdmin', deployer); - const deployTransactionAdmin = (proxyAdminFactory.getDeployTransaction()).data; - const dataCallAdmin = proxyAdminFactory.interface.encodeFunctionData('transferOwnership', [deployer.address]); - const [proxyAdminAddress] = await create2Deployment(zkEVMDeployerContract, salt, deployTransactionAdmin, dataCallAdmin, deployer); - - // Deploy implementation PolygonZkEVMBridg - const polygonZkEVMBridgeFactory = await ethers.getContractFactory('PolygonZkEVMBridge', deployer); - const deployTransactionBridge = (polygonZkEVMBridgeFactory.getDeployTransaction()).data; - // Mandatory to override the gasLimit since the estimation with create are mess up D: - const overrideGasLimit = ethers.BigNumber.from(5500000); - const [bridgeImplementationAddress] = await create2Deployment( - zkEVMDeployerContract, - salt, - deployTransactionBridge, - null, - deployer, - overrideGasLimit, - ); - - /* - * deploy proxy - * Do not initialize directlythe proxy since we want to deploy the same code on L2 and this will alter the bytecode deployed of the proxy - */ - const transparentProxyFactory = await ethers.getContractFactory('TransparentUpgradeableProxy', deployer); - const initializeEmptyDataProxy = '0x'; - const deployTransactionProxy = (transparentProxyFactory.getDeployTransaction( - bridgeImplementationAddress, - proxyAdminAddress, - initializeEmptyDataProxy, - )).data; - - const dataCallProxy = polygonZkEVMBridgeFactory.interface.encodeFunctionData( - 'initialize', - [ - networkIDL2, - mainnetGlobalExitRootL2ProxyAddress, - zkevmAddressL2, - ], - ); - const [proxyBridgeAddress] = await create2Deployment(zkEVMDeployerContract, salt, deployTransactionProxy, dataCallProxy, deployer); - - // Import OZ manifest the deployed contracts, its enough to import just the proyx, the rest are imported automatically ( admin/impl) - await upgrades.forceImport(proxyBridgeAddress, polygonZkEVMBridgeFactory, 'transparent'); - - /* - *Deployment Global exit root manager - */ - const PolygonZkEVMGlobalExitRootL2Factory = await ethers.getContractFactory('PolygonZkEVMGlobalExitRootL2', deployer); - let polygonZkEVMGlobalExitRootL2; - for (let i = 0; i < attemptsDeployProxy; i++) { - try { - polygonZkEVMGlobalExitRootL2 = await upgrades.deployProxy(PolygonZkEVMGlobalExitRootL2Factory, [], { - initializer: false, - constructorArgs: [mainnetZkEVMBridgeProxyAddress], - unsafeAllow: ['constructor', 'state-variable-immutable'], - }); - break; - } catch (error) { - console.log(`attempt ${i}`); - console.log('upgrades.deployProxy of polygonZkEVMGlobalExitRootL2 ', error.message); - } - - // reach limits of attempts - if (i + 1 === attemptsDeployProxy) { - throw new Error('polygonZkEVMGlobalExitRootL2 contract has not been deployed'); - } - } - - // Assert admin address - expect(await upgrades.erc1967.getAdminAddress(polygonZkEVMGlobalExitRootL2.address)).to.be.equal(proxyAdminAddress); - expect(await upgrades.erc1967.getAdminAddress(proxyBridgeAddress)).to.be.equal(proxyAdminAddress); - - const timelockContractFactory = await ethers.getContractFactory('PolygonZkEVMTimelock', deployer); - const timelockContract = await timelockContractFactory.deploy( - minDelayTimelock, - [timelockAddress], - [timelockAddress], - timelockAddress, - zkevmAddressL2, - ); - await timelockContract.deployed(); - - // Transfer ownership of the proxyAdmin to timelock - const proxyAdminInstance = proxyAdminFactory.attach(proxyAdminAddress); - await (await proxyAdminInstance.connect(deployer).transferOwnership(mainnetZkEVMTimelockAddress)).wait(); - - // Recreate genesis with the current information: - const genesis = []; - - // ZKEVMDeployer - const zkEVMDeployerInfo = await getAddressInfo(zkEVMDeployerContract.address); - genesis.push({ - contractName: 'PolygonZkEVMDeployer', - balance: '0', - nonce: zkEVMDeployerInfo.nonce.toString(), - address: mainnetZkEVMDeployerAddress, // override adddress - bytecode: zkEVMDeployerInfo.bytecode, - storage: zkEVMDeployerInfo.storage, - }); - - // Proxy Admin - const proxyAdminInfo = await getAddressInfo(proxyAdminAddress); - genesis.push({ - contractName: 'ProxyAdmin', - balance: '0', - nonce: proxyAdminInfo.nonce.toString(), - address: mainnetProxyAdminAddress, // override adddress - bytecode: proxyAdminInfo.bytecode, - storage: proxyAdminInfo.storage, - }); - - // Bridge implementation - const bridgeImplementationInfo = await getAddressInfo(bridgeImplementationAddress); - genesis.push({ - contractName: 'PolygonZkEVMBridge implementation', - balance: '0', - nonce: bridgeImplementationInfo.nonce.toString(), - address: mainnetZkEVMBridgeImplementationAddress, // override adddress - bytecode: bridgeImplementationInfo.bytecode, - // storage: bridgeImplementationInfo.storage, implementation do not have storage - }); - - // Bridge proxy - const bridgeProxyInfo = await getAddressInfo(proxyBridgeAddress); - - // Override admin and implementation slots: - bridgeProxyInfo.storage[_ADMIN_SLOT] = ethers.hexZeroPad(mainnetProxyAdminAddress, 32); - bridgeProxyInfo.storage[_IMPLEMENTATION_SLOT] = ethers.hexZeroPad(mainnetZkEVMBridgeImplementationAddress, 32); - - // update proxy storage - genesis.push({ - contractName: 'PolygonZkEVMBridge proxy', - balance: '200000000000000000000000000', - nonce: bridgeProxyInfo.nonce.toString(), - address: mainnetZkEVMBridgeProxyAddress, // override adddress - bytecode: bridgeProxyInfo.bytecode, - storage: bridgeProxyInfo.storage, - }); - - // polygonZkEVMGlobalExitRootL2 implementation - const implGlobalExitRootL2 = await upgrades.erc1967.getImplementationAddress(polygonZkEVMGlobalExitRootL2.address); - const implGlobalExitRootL2Info = await getAddressInfo(implGlobalExitRootL2); - genesis.push({ - contractName: 'PolygonZkEVMGlobalExitRootL2 implementation', - balance: '0', - nonce: implGlobalExitRootL2Info.nonce.toString(), - address: mainnetGlobalExitRootL2ImplementationAddress, // override address - bytecode: implGlobalExitRootL2Info.bytecode, - // storage: implGlobalExitRootL2Info.storage, , implementation do not have storage - }); - - // polygonZkEVMGlobalExitRootL2 proxy - const proxyGlobalExitRootL2Info = await getAddressInfo(polygonZkEVMGlobalExitRootL2.address); - - // Override admin and implementation slots: - proxyGlobalExitRootL2Info.storage[_ADMIN_SLOT] = ethers.hexZeroPad(mainnetProxyAdminAddress, 32); - proxyGlobalExitRootL2Info.storage[_IMPLEMENTATION_SLOT] = ethers.hexZeroPad(mainnetGlobalExitRootL2ImplementationAddress, 32); - - genesis.push({ - contractName: 'PolygonZkEVMGlobalExitRootL2 proxy', - balance: '0', - nonce: proxyGlobalExitRootL2Info.nonce.toString(), - address: mainnetGlobalExitRootL2ProxyAddress, // Override address! - bytecode: proxyGlobalExitRootL2Info.bytecode, - storage: proxyGlobalExitRootL2Info.storage, - }); - - // Timelock - const timelockInfo = await getAddressInfo(timelockContract.address); - - /* - * Since roles are used, most storage are writted in peusdoRandom storage slots - * bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256("TIMELOCK_ADMIN_ROLE"); - * bytes32 public constant PROPOSER_ROLE = keccak256("PROPOSER_ROLE"); - * bytes32 public constant EXECUTOR_ROLE = keccak256("EXECUTOR_ROLE"); - * bytes32 public constant CANCELLER_ROLE = keccak256("CANCELLER_ROLE"); - */ - const timelockRolesHash = [ - ethers.id('TIMELOCK_ADMIN_ROLE'), - ethers.id('PROPOSER_ROLE'), - ethers.id('EXECUTOR_ROLE'), - ethers.id('CANCELLER_ROLE'), - ]; - - for (let i = 0; i < timelockRolesHash.length; i++) { - const rolesMappingStoragePositionStruct = 0; - const storagePosition = ethers.solidityPackedKeccak256(['uint256', 'uint256'], [timelockRolesHash[i], rolesMappingStoragePositionStruct]); - - // check timelock address manager, and timelock address itself - const addressArray = [timelockAddress, timelockContract.address]; - for (let j = 0; j < addressArray.length; j++) { - const storagePositionRole = ethers.solidityPackedKeccak256(['uint256', 'uint256'], [addressArray[j], storagePosition]); - const valueRole = await ethers.provider.getStorageAt(timelockContract.address, storagePositionRole); - if (valueRole !== '0x0000000000000000000000000000000000000000000000000000000000000000') { - timelockInfo.storage[storagePositionRole] = valueRole; - } - } - const roleAdminSlot = ethers.hexZeroPad((ethers.BigNumber.from(storagePosition).add(1)).toHexString(), 32); - const valueRoleAdminSlot = await ethers.provider.getStorageAt(timelockContract.address, roleAdminSlot); - if (valueRoleAdminSlot !== '0x0000000000000000000000000000000000000000000000000000000000000000') { - timelockInfo.storage[roleAdminSlot] = valueRoleAdminSlot; - } - } - - genesis.push({ - contractName: 'PolygonZkEVMTimelock', - balance: '0', - nonce: timelockInfo.nonce.toString(), - address: timelockContract.address, - bytecode: timelockInfo.bytecode, - storage: timelockInfo.storage, - }); - - // Put nonces on deployers - - // deployer - const deployerInfo = await getAddressInfo(deployer.address); - genesis.push({ - accountName: 'deployer', - balance: '0', - nonce: deployerInfo.nonce.toString(), - address: deployer.address, - }); - - // calculate root - const poseidon = await getPoseidon(); - const { F } = poseidon; - const db = new MemDB(F); - const genesisRoot = [F.zero, F.zero, F.zero, F.zero]; - const accHashInput = [F.zero, F.zero, F.zero, F.zero]; - const defaultChainId = 1000; - - const zkEVMDB = await ZkEVMDB.newZkEVM( - db, - poseidon, - genesisRoot, - accHashInput, - genesis, - null, - null, - defaultChainId, - ); - - fs.writeFileSync(pathOutputJson, JSON.stringify({ - root: smtUtils.h4toString(zkEVMDB.stateRoot), - genesis, - }, null, 1)); -} - -main().catch((e) => { - console.error(e); - process.exit(1); -}); - -async function getAddressInfo(address) { - const nonce = await ethers.provider.getTransactionCount(address); - const bytecode = await ethers.provider.getCode(address); - - const storage = {}; - for (let i = 0; i < 120; i++) { - const storageValue = await ethers.provider.getStorageAt(address, i); - if (storageValue !== '0x0000000000000000000000000000000000000000000000000000000000000000') { - storage[ethers.hexZeroPad(ethers.hexlify(i), 32)] = storageValue; - } - } - - const valueAdminSlot = await ethers.provider.getStorageAt(address, _ADMIN_SLOT); - if (valueAdminSlot !== '0x0000000000000000000000000000000000000000000000000000000000000000') { - storage[_ADMIN_SLOT] = valueAdminSlot; - } - const valuImplementationSlot = await ethers.provider.getStorageAt(address, _IMPLEMENTATION_SLOT); - if (valuImplementationSlot !== '0x0000000000000000000000000000000000000000000000000000000000000000') { - storage[_IMPLEMENTATION_SLOT] = valuImplementationSlot; - } - - return { nonce, bytecode, storage }; -} diff --git a/deployment/1_createGenesis.js b/deployment/1_createGenesis.js deleted file mode 100644 index 56e27fbdb..000000000 --- a/deployment/1_createGenesis.js +++ /dev/null @@ -1,456 +0,0 @@ -/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if, import/no-dynamic-require */ -/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved, no-restricted-syntax */ -const { expect } = require('chai'); -const path = require('path'); -const fs = require('fs'); -require('dotenv').config({ path: path.resolve(__dirname, '../.env') }); -const { argv } = require('yargs'); - -const DEFAULT_MNEMONIC = 'test test test test test test test test test test test junk'; -process.env.HARDHAT_NETWORK = 'hardhat'; -process.env.MNEMONIC = argv.test ? DEFAULT_MNEMONIC : process.env.MNEMONIC; -const { ethers, upgrades } = require('hardhat'); -const { - MemDB, ZkEVMDB, getPoseidon, smtUtils, -} = require('@0xpolygonhermez/zkevm-commonjs'); - -const { deployPolygonZkEVMDeployer, create2Deployment, getCreate2Address } = require('./helpers/deployment-helpers'); - -const deployParametersPath = argv.input ? argv.input : './deploy_parameters.json'; -const deployParameters = require(deployParametersPath); - -const outPath = argv.out ? argv.out : './genesis.json'; -const pathOutputJson = path.join(__dirname, outPath); - -/* - * bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; - * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; - */ -const _ADMIN_SLOT = '0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103'; -const _IMPLEMENTATION_SLOT = '0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc'; - -async function main() { - // Constant variables - const attemptsDeployProxy = 20; - const networkIDL2 = 1; - const globalExitRootL2Address = '0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa'; - const zkevmAddressL2 = ethers.ZeroAddress; - const maxUint256 = ethers.BigNumber.from('0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff').toString(); - - let balanceBrige; - - let bridgeImplementationAddress; - let proxyBridgeAddress; - let finalBridgeImplAddress; - let finalBridgeProxyAddress; - - const genesis = []; - - // deploy parameters - const mandatoryDeploymentParameters = [ - 'timelockAddress', - 'minDelayTimelock', - 'salt', - 'initialZkEVMDeployerOwner', - ]; - - for (const parameterName of mandatoryDeploymentParameters) { - if (deployParameters[parameterName] === undefined || deployParameters[parameterName] === '') { - throw new Error(`Missing parameter: ${parameterName}`); - } - } - - const { - timelockAddress, - minDelayTimelock, - salt, - initialZkEVMDeployerOwner, - gasTokenAddress, - gasTokenNetwork, - } = deployParameters; - - // Load deployer - await ethers.provider.send('hardhat_impersonateAccount', [initialZkEVMDeployerOwner]); - await ethers.provider.send('hardhat_setBalance', [initialZkEVMDeployerOwner, '0xffffffffffffffff']); // 18 ethers aprox - const deployer = await ethers.getSigner(initialZkEVMDeployerOwner); - - // Deploy PolygonZkEVMDeployer if is not deployed already - const [zkEVMDeployerContract, keylessDeployer] = await deployPolygonZkEVMDeployer(initialZkEVMDeployerOwner, deployer); - - /* - * Deploy Bridge - * Deploy admin --> implementation --> proxy - */ - - // Deploy proxy admin: - const proxyAdminFactory = await ethers.getContractFactory('ProxyAdmin', deployer); - const deployTransactionAdmin = (proxyAdminFactory.getDeployTransaction()).data; - const dataCallAdmin = proxyAdminFactory.interface.encodeFunctionData('transferOwnership', [deployer.address]); - const [proxyAdminAddress] = await create2Deployment(zkEVMDeployerContract, salt, deployTransactionAdmin, dataCallAdmin, deployer); - - if ((gasTokenAddress === undefined || gasTokenAddress === '' || gasTokenAddress === '0x0000000000000000000000000000000000000000')) { - // deploy with ether as gasToken - balanceBrige = '200000000000000000000000000'; - - // Deploy implementation PolygonZkEVMBridge - const polygonZkEVMBridgeFactory = await ethers.getContractFactory('PolygonZkEVMBridge', deployer); - const deployTransactionBridge = (polygonZkEVMBridgeFactory.getDeployTransaction()).data; - // Mandatory to override the gasLimit since the estimation with create are mess up D: - const overrideGasLimit = ethers.BigNumber.from(5500000); - [bridgeImplementationAddress] = await create2Deployment( - zkEVMDeployerContract, - salt, - deployTransactionBridge, - null, - deployer, - overrideGasLimit, - ); - finalBridgeProxyAddress = bridgeImplementationAddress; - - /* - * deploy proxy - * Do not initialize directlythe proxy since we want to deploy the same code on L2 and this will alter the bytecode deployed of the proxy - */ - const transparentProxyFactory = await ethers.getContractFactory('TransparentUpgradeableProxy', deployer); - const initializeEmptyDataProxy = '0x'; - const deployTransactionProxy = (transparentProxyFactory.getDeployTransaction( - bridgeImplementationAddress, - proxyAdminAddress, - initializeEmptyDataProxy, - )).data; - - const dataCallProxy = polygonZkEVMBridgeFactory.interface.encodeFunctionData( - 'initialize', - [ - networkIDL2, - globalExitRootL2Address, - zkevmAddressL2, - ], - ); - [proxyBridgeAddress] = await create2Deployment(zkEVMDeployerContract, salt, deployTransactionProxy, dataCallProxy, deployer); - finalBridgeProxyAddress = proxyBridgeAddress; - - // Import OZ manifest the deployed contracts, its enough to import just the proyx, the rest are imported automatically ( admin/impl) - await upgrades.forceImport(proxyBridgeAddress, polygonZkEVMBridgeFactory, 'transparent'); - } else { - // deploy token as gasToken - balanceBrige = maxUint256; - - // Get L1 address - - // get bridge impl - const polygonZkEVML1BridgeFactory = await ethers.getContractFactory('PolygonZkEVMBridge', deployer); - const deployTransactionBridgeL1 = (polygonZkEVML1BridgeFactory.getDeployTransaction()).data; - finalBridgeImplAddress = getCreate2Address( - zkEVMDeployerContract, - salt, - deployTransactionBridgeL1, - ); - - // get bridge proxy - const transparentProxyFactoryL1 = await ethers.getContractFactory('TransparentUpgradeableProxy', deployer); - const initializeEmptyDataProxyL1 = '0x'; - const deployTransactionProxyL1 = (transparentProxyFactoryL1.getDeployTransaction( - finalBridgeImplAddress, - proxyAdminAddress, - initializeEmptyDataProxyL1, - )).data; - finalBridgeProxyAddress = getCreate2Address(zkEVMDeployerContract, salt, deployTransactionProxyL1); - - // Deploy WETH token - const WETHzkEVMFactory = await ethers.getContractFactory('WETHzkEVM', deployer); - const WETHToken = await WETHzkEVMFactory.deploy(finalBridgeProxyAddress); - await WETHToken.deployed(); - - // Deploy implementation PolygonZkEVMBridge - const polygonZkEVMBridgeFactory = await ethers.getContractFactory('PolygonZkEVMBridgeL2', deployer); - const deployTransactionBridge = (polygonZkEVMBridgeFactory.getDeployTransaction()).data; - // Mandatory to override the gasLimit since the estimation with create are mess up D: - const overrideGasLimit = ethers.BigNumber.from(5500000); - [bridgeImplementationAddress] = await create2Deployment( - zkEVMDeployerContract, - salt, - deployTransactionBridge, - null, - deployer, - overrideGasLimit, - ); - - /* - * deploy proxy - * Do not initialize directlythe proxy since we want to deploy the same code on L2 and this will alter the bytecode deployed of the proxy - */ - const transparentProxyFactory = await ethers.getContractFactory('TransparentUpgradeableProxy', deployer); - const initializeEmptyDataProxy = '0x'; - const deployTransactionProxy = (transparentProxyFactory.getDeployTransaction( - bridgeImplementationAddress, - proxyAdminAddress, - initializeEmptyDataProxy, - )).data; - - const dataCallProxy = polygonZkEVMBridgeFactory.interface.encodeFunctionData( - 'initialize', - [ - networkIDL2, - globalExitRootL2Address, - zkevmAddressL2, - gasTokenAddress, - gasTokenNetwork, - WETHToken.address, - ], - ); - [proxyBridgeAddress] = await create2Deployment(zkEVMDeployerContract, salt, deployTransactionProxy, dataCallProxy, deployer); - - // Import OZ manifest the deployed contracts, its enough to import just the proyx, the rest are imported automatically ( admin/impl) - await upgrades.forceImport(proxyBridgeAddress, polygonZkEVMBridgeFactory, 'transparent'); - - // Update genesis with the WETH token - const WETHInfo = await getAddressInfo(WETHToken.address); - genesis.push({ - contractName: 'WETHzkEVM', - balance: '0', - nonce: WETHInfo.nonce.toString(), - address: WETHToken.address, - bytecode: WETHInfo.bytecode, - storage: WETHInfo.storage, - }); - } - - /* - *Deployment Global exit root manager - */ - const PolygonZkEVMGlobalExitRootL2Factory = await ethers.getContractFactory('PolygonZkEVMGlobalExitRootL2', deployer); - let polygonZkEVMGlobalExitRootL2; - for (let i = 0; i < attemptsDeployProxy; i++) { - try { - polygonZkEVMGlobalExitRootL2 = await upgrades.deployProxy(PolygonZkEVMGlobalExitRootL2Factory, [], { - initializer: false, - constructorArgs: [finalBridgeProxyAddress], - unsafeAllow: ['constructor', 'state-variable-immutable'], - }); - break; - } catch (error) { - console.log(`attempt ${i}`); - console.log('upgrades.deployProxy of polygonZkEVMGlobalExitRootL2 ', error.message); - } - - // reach limits of attempts - if (i + 1 === attemptsDeployProxy) { - throw new Error('polygonZkEVMGlobalExitRootL2 contract has not been deployed'); - } - } - - // Assert admin address - expect(await upgrades.erc1967.getAdminAddress(polygonZkEVMGlobalExitRootL2.address)).to.be.equal(proxyAdminAddress); - expect(await upgrades.erc1967.getAdminAddress(proxyBridgeAddress)).to.be.equal(proxyAdminAddress); - - const timelockContractFactory = await ethers.getContractFactory('PolygonZkEVMTimelock', deployer); - const timelockContract = await timelockContractFactory.deploy( - minDelayTimelock, - [timelockAddress], - [timelockAddress], - timelockAddress, - zkevmAddressL2, - ); - await timelockContract.deployed(); - - // Transfer ownership of the proxyAdmin to timelock - const proxyAdminInstance = proxyAdminFactory.attach(proxyAdminAddress); - await (await proxyAdminInstance.connect(deployer).transferOwnership(timelockContract.address)).wait(); - - // Recreate genesis with the current information: - - // ZKEVMDeployer - const zkEVMDeployerInfo = await getAddressInfo(zkEVMDeployerContract.address); - genesis.push({ - contractName: 'PolygonZkEVMDeployer', - balance: '0', - nonce: zkEVMDeployerInfo.nonce.toString(), - address: zkEVMDeployerContract.address, - bytecode: zkEVMDeployerInfo.bytecode, - storage: zkEVMDeployerInfo.storage, - }); - - // Proxy Admin - const proxyAdminInfo = await getAddressInfo(proxyAdminAddress); - genesis.push({ - contractName: 'ProxyAdmin', - balance: '0', - nonce: proxyAdminInfo.nonce.toString(), - address: proxyAdminAddress, - bytecode: proxyAdminInfo.bytecode, - storage: proxyAdminInfo.storage, - }); - - // Bridge implementation - const bridgeImplementationInfo = await getAddressInfo(bridgeImplementationAddress); - genesis.push({ - contractName: 'PolygonZkEVMBridge implementation', - balance: '0', - nonce: bridgeImplementationInfo.nonce.toString(), - address: finalBridgeImplAddress, // override address - bytecode: bridgeImplementationInfo.bytecode, - // storage: bridgeImplementationInfo.storage, implementation do not have storage - }); - - // Bridge proxy - const bridgeProxyInfo = await getAddressInfo(proxyBridgeAddress); - // Override admin and implementation slots: - bridgeProxyInfo.storage[_ADMIN_SLOT] = ethers.hexZeroPad(proxyAdminAddress, 32); - bridgeProxyInfo.storage[_IMPLEMENTATION_SLOT] = ethers.hexZeroPad(finalBridgeImplAddress, 32); - - genesis.push({ - contractName: 'PolygonZkEVMBridge proxy', - balance: balanceBrige, - nonce: bridgeProxyInfo.nonce.toString(), - address: finalBridgeProxyAddress, // override adddress - bytecode: bridgeProxyInfo.bytecode, - storage: bridgeProxyInfo.storage, - }); - - // polygonZkEVMGlobalExitRootL2 implementation - const implGlobalExitRootL2 = await upgrades.erc1967.getImplementationAddress(polygonZkEVMGlobalExitRootL2.address); - const implGlobalExitRootL2Info = await getAddressInfo(implGlobalExitRootL2); - genesis.push({ - contractName: 'PolygonZkEVMGlobalExitRootL2 implementation', - balance: '0', - nonce: implGlobalExitRootL2Info.nonce.toString(), - address: implGlobalExitRootL2, - bytecode: implGlobalExitRootL2Info.bytecode, - // storage: implGlobalExitRootL2Info.storage, , implementation do not have storage - }); - - // polygonZkEVMGlobalExitRootL2 proxy - const proxyGlobalExitRootL2Info = await getAddressInfo(polygonZkEVMGlobalExitRootL2.address); - genesis.push({ - contractName: 'PolygonZkEVMGlobalExitRootL2 proxy', - balance: '0', - nonce: proxyGlobalExitRootL2Info.nonce.toString(), - address: globalExitRootL2Address, // Override address! - bytecode: proxyGlobalExitRootL2Info.bytecode, - storage: proxyGlobalExitRootL2Info.storage, - }); - - // Timelock - const timelockInfo = await getAddressInfo(timelockContract.address); - - /* - * Since roles are used, most storage are writted in peusdoRandom storage slots - * bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256("TIMELOCK_ADMIN_ROLE"); - * bytes32 public constant PROPOSER_ROLE = keccak256("PROPOSER_ROLE"); - * bytes32 public constant EXECUTOR_ROLE = keccak256("EXECUTOR_ROLE"); - * bytes32 public constant CANCELLER_ROLE = keccak256("CANCELLER_ROLE"); - */ - const timelockRolesHash = [ - ethers.id('TIMELOCK_ADMIN_ROLE'), - ethers.id('PROPOSER_ROLE'), - ethers.id('EXECUTOR_ROLE'), - ethers.id('CANCELLER_ROLE'), - ]; - - for (let i = 0; i < timelockRolesHash.length; i++) { - const rolesMappingStoragePositionStruct = 0; - const storagePosition = ethers.solidityPackedKeccak256(['uint256', 'uint256'], [timelockRolesHash[i], rolesMappingStoragePositionStruct]); - - // check timelock address manager, and timelock address itself - const addressArray = [timelockAddress, timelockContract.address]; - for (let j = 0; j < addressArray.length; j++) { - const storagePositionRole = ethers.solidityPackedKeccak256(['uint256', 'uint256'], [addressArray[j], storagePosition]); - const valueRole = await ethers.provider.getStorageAt(timelockContract.address, storagePositionRole); - if (valueRole !== '0x0000000000000000000000000000000000000000000000000000000000000000') { - timelockInfo.storage[storagePositionRole] = valueRole; - } - } - const roleAdminSlot = ethers.hexZeroPad((ethers.BigNumber.from(storagePosition).add(1)).toHexString(), 32); - const valueRoleAdminSlot = await ethers.provider.getStorageAt(timelockContract.address, roleAdminSlot); - if (valueRoleAdminSlot !== '0x0000000000000000000000000000000000000000000000000000000000000000') { - timelockInfo.storage[roleAdminSlot] = valueRoleAdminSlot; - } - } - - genesis.push({ - contractName: 'PolygonZkEVMTimelock', - balance: '0', - nonce: timelockInfo.nonce.toString(), - address: timelockContract.address, - bytecode: timelockInfo.bytecode, - storage: timelockInfo.storage, - }); - - // Put nonces on deployers - - // Keyless deployer - genesis.push({ - accountName: 'keyless Deployer', - balance: '0', - nonce: '1', - address: keylessDeployer, - }); - - // deployer - const deployerInfo = await getAddressInfo(deployer.address); - genesis.push({ - accountName: 'deployer', - balance: '0', - nonce: deployerInfo.nonce.toString(), - address: deployer.address, - }); - - if (argv.test) { - // Add tester account with ether - genesis[genesis.length - 1].balance = '100000000000000000000000'; - } - - // calculate root - const poseidon = await getPoseidon(); - const { F } = poseidon; - const db = new MemDB(F); - const genesisRoot = [F.zero, F.zero, F.zero, F.zero]; - const accHashInput = [F.zero, F.zero, F.zero, F.zero]; - const defaultChainId = 1000; - - const zkEVMDB = await ZkEVMDB.newZkEVM( - db, - poseidon, - genesisRoot, - accHashInput, - genesis, - null, - null, - defaultChainId, - ); - - fs.writeFileSync(pathOutputJson, JSON.stringify({ - root: smtUtils.h4toString(zkEVMDB.stateRoot), - genesis, - }, null, 1)); -} - -main().catch((e) => { - console.error(e); - process.exit(1); -}); - -async function getAddressInfo(address) { - const nonce = await ethers.provider.getTransactionCount(address); - const bytecode = await ethers.provider.getCode(address); - - const storage = {}; - for (let i = 0; i < 120; i++) { - const storageValue = await ethers.provider.getStorageAt(address, i); - if (storageValue !== '0x0000000000000000000000000000000000000000000000000000000000000000') { - storage[ethers.hexZeroPad(ethers.hexlify(i), 32)] = storageValue; - } - } - - const valueAdminSlot = await ethers.provider.getStorageAt(address, _ADMIN_SLOT); - if (valueAdminSlot !== '0x0000000000000000000000000000000000000000000000000000000000000000') { - storage[_ADMIN_SLOT] = valueAdminSlot; - } - const valuImplementationSlot = await ethers.provider.getStorageAt(address, _IMPLEMENTATION_SLOT); - if (valuImplementationSlot !== '0x0000000000000000000000000000000000000000000000000000000000000000') { - storage[_IMPLEMENTATION_SLOT] = valuImplementationSlot; - } - - return { nonce, bytecode, storage }; -} diff --git a/deployment/1_createGenesis.ts b/deployment/1_createGenesis.ts new file mode 100644 index 000000000..3e3839689 --- /dev/null +++ b/deployment/1_createGenesis.ts @@ -0,0 +1,484 @@ +/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if, import/no-dynamic-require */ +/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved, no-restricted-syntax */ +import {expect} from "chai"; +import path = require("path"); +import fs = require("fs"); + +import * as dotenv from "dotenv"; +dotenv.config({path: path.resolve(__dirname, "../.env")}); +import yargs from "yargs/yargs"; + +const argv = yargs(process.argv.slice(2)) + .options({ + test: {type: "boolean", default: false}, + input: {type: "string", default: "./deploy_parameters.json"}, + out: {type: "string", default: "./genesis.json"}, + }) + .parseSync(); + +const DEFAULT_MNEMONIC = "test test test test test test test test test test test junk"; +process.env.HARDHAT_NETWORK = "hardhat"; +process.env.MNEMONIC = argv.test ? DEFAULT_MNEMONIC : process.env.MNEMONIC; +import {ethers, upgrades} from "hardhat"; +import {MemDB, ZkEVMDB, getPoseidon, smtUtils} from "@0xpolygonhermez/zkevm-commonjs"; + +import {deployPolygonZkEVMDeployer, create2Deployment, getCreate2Address} from "./helpers/deployment-helpers"; +import {ProxyAdmin} from "../typechain-types"; +import {Addressable} from "ethers"; + +const deployParameters = require(argv.input); +const pathOutputJson = path.join(__dirname, argv.out); + +/* + * bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; + * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; + */ +const _ADMIN_SLOT = "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" as any; +const _IMPLEMENTATION_SLOT = "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" as any; + +// Genesis mainnet address: +const mainnetZkEVMDeployerAddress = "0xCB19eDdE626906eB1EE52357a27F62dd519608C2"; +const mainnetZkEVMTimelockAddress = "0xBBa0935Fa93Eb23de7990b47F0D96a8f75766d13"; +const mainnetProxyAdminAddress = "0x0F99738B2Fc14D77308337f3e2596b63aE7BCC4A"; +const mainnetZkEVMBridgeImplementationAddress = "0x5ac4182A1dd41AeEf465E40B82fd326BF66AB82C"; +const mainnetZkEVMBridgeProxyAddress = "0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe"; +const mainnetGlobalExitRootL2ImplementationAddress = "0x0200143Fa295EE4dffEF22eE2616c2E008D81688"; + +const keylessDeployerMainnet = "0x9d90066e7478496e2284E54c3548106bb4F90E50"; +const deployerMainnet = "0x4c1665d6651ecEfa59B9B3041951608468b18891"; + +const mainnetMultisig = "0x4c1665d6651ecEfa59B9B3041951608468b18891"; +const mainnetInitialZkEVMDeployerOwner = "0x4c1665d6651ecEfa59B9B3041951608468b18891"; +const mainnetMinDelayTimelock = 864000; + +const globalExitRootL2Address = "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa"; +const zkevmAddressL2 = ethers.ZeroAddress; + +async function main() { + // Constant variables + const attemptsDeployProxy = 20; + const balanceBrige = BigInt("0xffffffffffffffffffffffffffffffff"); // 128 bits + + let timelockAddress; + let initialZkEVMDeployerOwner; + let salt; + let minDelayTimelock; + + let bridgeImplementationAddress; + let finalBridgeImplAddress; + + let proxyBridgeAddress; + let finalBridgeProxyAddress; + + let proxyAdminAddress; + let finalProxyAdminAddress; + + let finalTimelockContractAdress; + + let finalzkEVMDeployerAdress; + + const finalGlobalExitRootL2ProxyAddress = globalExitRootL2Address; + + let finalGlobalExitRootL2ImplAddress; + + let finalKeylessDeployer; + let finalDeployer; + + const genesis = []; + + // Check if it's mainnet deployment + const isMainnet = deployParameters["isMainnet"] === true ? true : false; + + if (isMainnet === true) { + timelockAddress = mainnetMultisig; + minDelayTimelock = mainnetMinDelayTimelock; + salt = "0x0000000000000000000000000000000000000000000000000000000000000000"; // salt mock + initialZkEVMDeployerOwner = mainnetInitialZkEVMDeployerOwner; + + finalzkEVMDeployerAdress = mainnetZkEVMDeployerAddress; + finalTimelockContractAdress = mainnetZkEVMTimelockAddress; + finalProxyAdminAddress = mainnetProxyAdminAddress; + finalBridgeImplAddress = mainnetZkEVMBridgeImplementationAddress; + finalBridgeProxyAddress = mainnetZkEVMBridgeProxyAddress; + finalGlobalExitRootL2ImplAddress = mainnetGlobalExitRootL2ImplementationAddress; + finalKeylessDeployer = keylessDeployerMainnet; + finalDeployer = deployerMainnet; + } else { + // load deploy parameters + const mandatoryDeploymentParameters = [ + "timelockAddress", + "minDelayTimelock", + "salt", + "initialZkEVMDeployerOwner", + ]; + + for (const parameterName of mandatoryDeploymentParameters) { + if (deployParameters[parameterName] === undefined || deployParameters[parameterName] === "") { + throw new Error(`Missing parameter: ${parameterName}`); + } + } + ({timelockAddress, minDelayTimelock, salt, initialZkEVMDeployerOwner} = deployParameters); + } + + // Load deployer + await ethers.provider.send("hardhat_impersonateAccount", [initialZkEVMDeployerOwner]); + await ethers.provider.send("hardhat_setBalance", [initialZkEVMDeployerOwner, "0xffffffffffffffff"]); // 18 ethers aprox + const deployer = await ethers.getSigner(initialZkEVMDeployerOwner); + + // Deploy PolygonZkEVMDeployer if is not deployed already + const [zkEVMDeployerContract, keylessDeployer] = await deployPolygonZkEVMDeployer( + initialZkEVMDeployerOwner, + deployer + ); + if (isMainnet === false) { + finalDeployer = deployer.address; + finalKeylessDeployer = keylessDeployer; + finalzkEVMDeployerAdress = zkEVMDeployerContract.target; + } + /* + * Deploy Bridge + * Deploy admin --> implementation --> proxy + */ + + // Deploy proxy admin: + const proxyAdminFactory = await ethers.getContractFactory("ProxyAdmin", deployer); + const deployTransactionAdmin = (await proxyAdminFactory.getDeployTransaction()).data; + const dataCallAdmin = proxyAdminFactory.interface.encodeFunctionData("transferOwnership", [deployer.address]); + [proxyAdminAddress] = await create2Deployment( + zkEVMDeployerContract, + salt, + deployTransactionAdmin, + dataCallAdmin, + deployer, + null + ); + + if (isMainnet === false) { + finalProxyAdminAddress = proxyAdminAddress; + } + + // Deploy implementation PolygonZkEVMBridge + const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2", deployer); + const deployTransactionBridge = (await polygonZkEVMBridgeFactory.getDeployTransaction()).data; + // Mandatory to override the gasLimit since the estimation with create are mess up D: + const overrideGasLimit = BigInt(5500000); + [bridgeImplementationAddress] = await create2Deployment( + zkEVMDeployerContract, + salt, + deployTransactionBridge, + null, + deployer, + overrideGasLimit + ); + + if (isMainnet === false) { + finalBridgeImplAddress = bridgeImplementationAddress; + } + // Do not initialize the bridge! + + /* + * deploy proxy + * Do not initialize directly the proxy since we want to deploy the same code on L2 and this will alter the bytecode deployed of the proxy + */ + const transparentProxyFactory = await ethers.getContractFactory("TransparentUpgradeableProxy", deployer); + const initializeEmptyDataProxy = "0x"; + const deployTransactionProxy = ( + await transparentProxyFactory.getDeployTransaction( + bridgeImplementationAddress as string, // must have bytecode + proxyAdminAddress as string, + initializeEmptyDataProxy + ) + ).data; + + [proxyBridgeAddress] = await create2Deployment( + zkEVMDeployerContract, + salt, + deployTransactionProxy, + null, + deployer, + null + ); + + if (isMainnet === false) { + finalBridgeProxyAddress = proxyBridgeAddress; + } + + // Import OZ manifest the deployed contracts, its enough to import just the proyx, the rest are imported automatically ( admin/impl) + await upgrades.forceImport(proxyBridgeAddress as string, polygonZkEVMBridgeFactory, "transparent" as any); + + /* + *Deployment Global exit root manager + */ + const PolygonZkEVMGlobalExitRootL2Factory = await ethers.getContractFactory( + "PolygonZkEVMGlobalExitRootL2", + deployer + ); + let polygonZkEVMGlobalExitRootL2; + for (let i = 0; i < attemptsDeployProxy; i++) { + try { + polygonZkEVMGlobalExitRootL2 = await upgrades.deployProxy(PolygonZkEVMGlobalExitRootL2Factory, [], { + initializer: false, + constructorArgs: [finalBridgeProxyAddress], + unsafeAllow: ["constructor", "state-variable-immutable"], + }); + break; + } catch (error: any) { + console.log(`attempt ${i}`); + console.log("upgrades.deployProxy of polygonZkEVMGlobalExitRootL2 ", error.message); + } + + // reach limits of attempts + if (i + 1 === attemptsDeployProxy) { + throw new Error("polygonZkEVMGlobalExitRootL2 contract has not been deployed"); + } + } + + // Assert admin address + expect(await upgrades.erc1967.getAdminAddress(polygonZkEVMGlobalExitRootL2?.target as string)).to.be.equal( + proxyAdminAddress + ); + expect(await upgrades.erc1967.getAdminAddress(proxyBridgeAddress as string)).to.be.equal(proxyAdminAddress); + + const timelockContractFactory = await ethers.getContractFactory("PolygonZkEVMTimelock", deployer); + const timelockContract = await timelockContractFactory.deploy( + minDelayTimelock, + [timelockAddress], + [timelockAddress], + timelockAddress, + zkevmAddressL2 + ); + await timelockContract.waitForDeployment(); + if (isMainnet === false) { + finalTimelockContractAdress = timelockContract.target; + } + + // Transfer ownership of the proxyAdmin to timelock + const proxyAdminInstance = proxyAdminFactory.attach(proxyAdminAddress as string) as ProxyAdmin; + await (await proxyAdminInstance.connect(deployer).transferOwnership(finalTimelockContractAdress as string)).wait(); + + // Recreate genesis with the current information: + + // ZKEVMDeployer + const zkEVMDeployerInfo = await getAddressInfo(zkEVMDeployerContract.target); + genesis.push({ + contractName: "PolygonZkEVMDeployer", + balance: "0", + nonce: zkEVMDeployerInfo.nonce.toString(), + address: finalzkEVMDeployerAdress, + bytecode: zkEVMDeployerInfo.bytecode, + storage: zkEVMDeployerInfo.storage, + }); + + // Proxy Admin + const proxyAdminInfo = await getAddressInfo(proxyAdminAddress as string); + genesis.push({ + contractName: "ProxyAdmin", + balance: "0", + nonce: proxyAdminInfo.nonce.toString(), + address: finalProxyAdminAddress, + bytecode: proxyAdminInfo.bytecode, + storage: proxyAdminInfo.storage, + }); + + // Bridge implementation + const bridgeImplementationInfo = await getAddressInfo(bridgeImplementationAddress as string); + genesis.push({ + contractName: "PolygonZkEVMBridge implementation", + balance: "0", + nonce: bridgeImplementationInfo.nonce.toString(), + address: finalBridgeImplAddress, + bytecode: bridgeImplementationInfo.bytecode, + // storage: bridgeImplementationInfo.storage, implementation do not have storage + }); + + // Bridge proxy + const bridgeProxyInfo = await getAddressInfo(proxyBridgeAddress as string); + // Override admin and implementation slots: + bridgeProxyInfo.storage[_ADMIN_SLOT] = ethers.zeroPadValue(finalProxyAdminAddress as string, 32); + bridgeProxyInfo.storage[_IMPLEMENTATION_SLOT] = ethers.zeroPadValue(finalBridgeImplAddress as string, 32); + + genesis.push({ + contractName: "PolygonZkEVMBridge proxy", + balance: balanceBrige, + nonce: bridgeProxyInfo.nonce.toString(), + address: finalBridgeProxyAddress, + bytecode: bridgeProxyInfo.bytecode, + storage: bridgeProxyInfo.storage, + }); + + // polygonZkEVMGlobalExitRootL2 implementation + const implGlobalExitRootL2 = await upgrades.erc1967.getImplementationAddress( + polygonZkEVMGlobalExitRootL2?.target as string + ); + const implGlobalExitRootL2Info = await getAddressInfo(implGlobalExitRootL2); + + if (isMainnet === false) { + finalGlobalExitRootL2ImplAddress = implGlobalExitRootL2; + } + + genesis.push({ + contractName: "PolygonZkEVMGlobalExitRootL2 implementation", + balance: "0", + nonce: implGlobalExitRootL2Info.nonce.toString(), + address: finalGlobalExitRootL2ImplAddress, + bytecode: implGlobalExitRootL2Info.bytecode, + // storage: implGlobalExitRootL2Info.storage, , implementation do not have storage + }); + + // polygonZkEVMGlobalExitRootL2 proxy + const proxyGlobalExitRootL2Info = await getAddressInfo(polygonZkEVMGlobalExitRootL2?.target as string); + + proxyGlobalExitRootL2Info.storage[_ADMIN_SLOT] = ethers.zeroPadValue(finalProxyAdminAddress as string, 32); + proxyGlobalExitRootL2Info.storage[_IMPLEMENTATION_SLOT] = ethers.zeroPadValue( + finalGlobalExitRootL2ImplAddress as string, + 32 + ); + + genesis.push({ + contractName: "PolygonZkEVMGlobalExitRootL2 proxy", + balance: "0", + nonce: proxyGlobalExitRootL2Info.nonce.toString(), + address: finalGlobalExitRootL2ProxyAddress, + bytecode: proxyGlobalExitRootL2Info.bytecode, + storage: proxyGlobalExitRootL2Info.storage, + }); + + // Timelock + const timelockInfo = await getAddressInfo(timelockContract.target); + + /* + * Since roles are used, most storage are writted in peusdoRandom storage slots + * bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256("TIMELOCK_ADMIN_ROLE"); + * bytes32 public constant PROPOSER_ROLE = keccak256("PROPOSER_ROLE"); + * bytes32 public constant EXECUTOR_ROLE = keccak256("EXECUTOR_ROLE"); + * bytes32 public constant CANCELLER_ROLE = keccak256("CANCELLER_ROLE"); + */ + const timelockRolesHash = [ + ethers.id("TIMELOCK_ADMIN_ROLE"), + ethers.id("PROPOSER_ROLE"), + ethers.id("EXECUTOR_ROLE"), + ethers.id("CANCELLER_ROLE"), + ]; + + for (let i = 0; i < timelockRolesHash.length; i++) { + const rolesMappingStoragePositionStruct = 0; + const storagePosition = ethers.solidityPackedKeccak256( + ["uint256", "uint256"], + [timelockRolesHash[i], rolesMappingStoragePositionStruct] + ); + + // check timelock address manager, and timelock address itself + const addressArray = [timelockAddress, timelockContract.target]; + for (let j = 0; j < addressArray.length; j++) { + const storagePositionRole = ethers.solidityPackedKeccak256( + ["uint256", "uint256"], + [addressArray[j], storagePosition] + ); + const valueRole = await ethers.provider.getStorage(timelockContract.target, storagePositionRole); + if (valueRole !== "0x0000000000000000000000000000000000000000000000000000000000000000") { + timelockInfo.storage[storagePositionRole] = valueRole; + } + } + const roleAdminSlot = ethers.zeroPadValue(ethers.toQuantity(ethers.toBigInt(storagePosition) + 1n), 32); + const valueRoleAdminSlot = await ethers.provider.getStorage(timelockContract.target, roleAdminSlot); + if (valueRoleAdminSlot !== "0x0000000000000000000000000000000000000000000000000000000000000000") { + timelockInfo.storage[roleAdminSlot] = valueRoleAdminSlot; + } + } + + genesis.push({ + contractName: "PolygonZkEVMTimelock", + balance: "0", + nonce: timelockInfo.nonce.toString(), + address: finalTimelockContractAdress, + bytecode: timelockInfo.bytecode, + storage: timelockInfo.storage, + }); + + // Put nonces on deployers + + // Keyless deployer + genesis.push({ + accountName: "keyless Deployer", + balance: "0", + nonce: "1", + address: finalKeylessDeployer, + }); + + // deployer + const deployerInfo = await getAddressInfo(deployer.address); + genesis.push({ + accountName: "deployer", + balance: "0", + nonce: deployerInfo.nonce.toString(), + address: finalDeployer, + }); + + if (argv.test) { + // Add tester account with ether + genesis[genesis.length - 1].balance = "100000000000000000000000"; + } + + // calculate root + const poseidon = await getPoseidon(); + const {F} = poseidon; + const db = new MemDB(F); + const genesisRoot = [F.zero, F.zero, F.zero, F.zero]; + const accHashInput = [F.zero, F.zero, F.zero, F.zero]; + const defaultChainId = 1000; + + const zkEVMDB = await ZkEVMDB.newZkEVM( + db, + poseidon, + genesisRoot, + accHashInput, + genesis, + null, + null, + defaultChainId + ); + + fs.writeFileSync( + pathOutputJson, + JSON.stringify( + { + root: smtUtils.h4toString(zkEVMDB.stateRoot), + genesis, + }, + null, + 1 + ) + ); +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); + +async function getAddressInfo(address: string | Addressable) { + const nonce = await ethers.provider.getTransactionCount(address); + const bytecode = await ethers.provider.getCode(address); + + const storage = {} as { + [key: string]: number | string; + }; + + for (let i = 0; i < 200; i++) { + const storageValue = await ethers.provider.getStorage(address, i); + if (storageValue !== "0x0000000000000000000000000000000000000000000000000000000000000000") { + storage[ethers.zeroPadValue(ethers.toQuantity(i), 32)] = storageValue; + } + } + + const valueAdminSlot = await ethers.provider.getStorage(address, _ADMIN_SLOT); + if (valueAdminSlot !== "0x0000000000000000000000000000000000000000000000000000000000000000") { + storage[_ADMIN_SLOT] = valueAdminSlot; + } + const valuImplementationSlot = await ethers.provider.getStorage(address, _IMPLEMENTATION_SLOT); + if (valuImplementationSlot !== "0x0000000000000000000000000000000000000000000000000000000000000000") { + storage[_IMPLEMENTATION_SLOT] = valuImplementationSlot; + } + + return {nonce, bytecode, storage}; +} diff --git a/deployment/2_deployPolygonZKEVMDeployer.js b/deployment/2_deployPolygonZKEVMDeployer.js deleted file mode 100644 index 54493d5ff..000000000 --- a/deployment/2_deployPolygonZKEVMDeployer.js +++ /dev/null @@ -1,76 +0,0 @@ -/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if */ -/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */ -const { ethers } = require('hardhat'); -const path = require('path'); -const fs = require('fs'); -require('dotenv').config({ path: path.resolve(__dirname, '../.env') }); - -const { deployPolygonZkEVMDeployer } = require('./helpers/deployment-helpers'); - -const pathDeployParameters = path.join(__dirname, './deploy_parameters.json'); -const deployParameters = require('./deploy_parameters.json'); - -async function main() { - // Load provider - let currentProvider = ethers.provider; - if (deployParameters.multiplierGas || deployParameters.maxFeePerGas) { - if (process.env.HARDHAT_NETWORK !== 'hardhat') { - currentProvider = new ethers.providers.JsonRpcProvider(`https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}`); - if (deployParameters.maxPriorityFeePerGas && deployParameters.maxFeePerGas) { - console.log(`Hardcoded gas used: MaxPriority${deployParameters.maxPriorityFeePerGas} gwei, MaxFee${deployParameters.maxFeePerGas} gwei`); - const FEE_DATA = { - maxFeePerGas: ethers.parseUnits(deployParameters.maxFeePerGas, 'gwei'), - maxPriorityFeePerGas: ethers.parseUnits(deployParameters.maxPriorityFeePerGas, 'gwei'), - }; - currentProvider.getFeeData = async () => FEE_DATA; - } else { - console.log('Multiplier gas used: ', deployParameters.multiplierGas); - async function overrideFeeData() { - const feedata = await ethers.provider.getFeeData(); - return { - maxFeePerGas: feedata.maxFeePerGas.mul(deployParameters.multiplierGas).div(1000), - maxPriorityFeePerGas: feedata.maxPriorityFeePerGas.mul(deployParameters.multiplierGas).div(1000), - }; - } - currentProvider.getFeeData = overrideFeeData; - } - } - } - - // Load deployer - let deployer; - if (deployParameters.deployerPvtKey) { - deployer = new ethers.Wallet(deployParameters.deployerPvtKey, currentProvider); - } else if (process.env.MNEMONIC) { - deployer = ethers.Wallet.fromMnemonic(process.env.MNEMONIC, 'm/44\'/60\'/0\'/0/0').connect(currentProvider); - } else { - [deployer] = (await ethers.getSigners()); - } - - // Load initialZkEVMDeployerOwner - const { - initialZkEVMDeployerOwner, - } = deployParameters; - - if (initialZkEVMDeployerOwner === undefined || initialZkEVMDeployerOwner === '') { - throw new Error('Missing parameter: initialZkEVMDeployerOwner'); - } - - // Deploy PolygonZkEVMDeployer if is not deployed already using keyless deployment - const [zkEVMDeployerContract, keylessDeployer] = await deployPolygonZkEVMDeployer(initialZkEVMDeployerOwner, deployer); - if (keylessDeployer === ethers.ZeroAddress) { - console.log('#######################\n'); - console.log('polygonZkEVMDeployer already deployed on: ', zkEVMDeployerContract.address); - } else { - console.log('#######################\n'); - console.log('polygonZkEVMDeployer deployed on: ', zkEVMDeployerContract.address); - } - - deployParameters.zkEVMDeployerAddress = zkEVMDeployerContract.address; - fs.writeFileSync(pathDeployParameters, JSON.stringify(deployParameters, null, 1)); -} - -main().catch((e) => { - console.error(e); - process.exit(1); -}); diff --git a/deployment/2_deployPolygonZKEVMDeployer.ts b/deployment/2_deployPolygonZKEVMDeployer.ts new file mode 100644 index 000000000..aa471ae34 --- /dev/null +++ b/deployment/2_deployPolygonZKEVMDeployer.ts @@ -0,0 +1,92 @@ +/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if */ +/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */ +import {expect} from "chai"; +import path = require("path"); +import fs = require("fs"); + +import * as dotenv from "dotenv"; +dotenv.config({path: path.resolve(__dirname, "../.env")}); +import {ethers, upgrades} from "hardhat"; +import {HardhatEthersSigner} from "@nomicfoundation/hardhat-ethers/signers"; + +import {deployPolygonZkEVMDeployer} from "./helpers/deployment-helpers"; + +const pathDeployParameters = path.join(__dirname, "./deploy_parameters.json"); +const deployParameters = require("./deploy_parameters.json"); + +async function main() { + // Load provider + let currentProvider = ethers.provider; + if (deployParameters.multiplierGas || deployParameters.maxFeePerGas) { + if (process.env.HARDHAT_NETWORK !== "hardhat") { + currentProvider = ethers.getDefaultProvider( + `https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}` + ) as any; + if (deployParameters.maxPriorityFeePerGas && deployParameters.maxFeePerGas) { + console.log( + `Hardcoded gas used: MaxPriority${deployParameters.maxPriorityFeePerGas} gwei, MaxFee${deployParameters.maxFeePerGas} gwei` + ); + const FEE_DATA = new ethers.FeeData( + null, + ethers.parseUnits(deployParameters.maxFeePerGas, "gwei"), + ethers.parseUnits(deployParameters.maxPriorityFeePerGas, "gwei") + ); + + currentProvider.getFeeData = async () => FEE_DATA; + } else { + console.log("Multiplier gas used: ", deployParameters.multiplierGas); + async function overrideFeeData() { + const feedata = await ethers.provider.getFeeData(); + return new ethers.FeeData( + null, + ((feedata.maxFeePerGas as bigint) * BigInt(deployParameters.multiplierGas)) / 1000n, + ((feedata.maxPriorityFeePerGas as bigint) * BigInt(deployParameters.multiplierGas)) / 1000n + ); + } + currentProvider.getFeeData = overrideFeeData; + } + } + } + + // Load deployer + let deployer; + if (deployParameters.deployerPvtKey) { + deployer = new ethers.Wallet(deployParameters.deployerPvtKey, currentProvider); + } else if (process.env.MNEMONIC) { + deployer = ethers.HDNodeWallet.fromMnemonic( + ethers.Mnemonic.fromPhrase(process.env.MNEMONIC), + "m/44'/60'/0'/0/0" + ).connect(currentProvider); + } else { + [deployer] = await ethers.getSigners(); + } + + // Load initialZkEVMDeployerOwner + const {initialZkEVMDeployerOwner} = deployParameters; + + if (initialZkEVMDeployerOwner === undefined || initialZkEVMDeployerOwner === "") { + throw new Error("Missing parameter: initialZkEVMDeployerOwner"); + } + + // Deploy PolygonZkEVMDeployer if is not deployed already using keyless deployment + const [zkEVMDeployerContract, keylessDeployer] = await deployPolygonZkEVMDeployer( + initialZkEVMDeployerOwner, + deployer as HardhatEthersSigner + ); + + if (keylessDeployer === ethers.ZeroAddress) { + console.log("#######################\n"); + console.log("polygonZkEVMDeployer already deployed on: ", zkEVMDeployerContract.target); + } else { + console.log("#######################\n"); + console.log("polygonZkEVMDeployer deployed on: ", zkEVMDeployerContract.target); + } + + deployParameters.zkEVMDeployerAddress = zkEVMDeployerContract.target; + fs.writeFileSync(pathDeployParameters, JSON.stringify(deployParameters, null, 1)); +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/deployment/3_deployContracts.js b/deployment/3_deployContracts.ts similarity index 61% rename from deployment/3_deployContracts.js rename to deployment/3_deployContracts.ts index b1d1cbb71..08caa55a6 100644 --- a/deployment/3_deployContracts.js +++ b/deployment/3_deployContracts.ts @@ -1,25 +1,31 @@ -/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if, import/no-dynamic-require, global-require */ -/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved, no-restricted-syntax */ -const { expect } = require('chai'); -const { ethers, upgrades } = require('hardhat'); -const path = require('path'); -const fs = require('fs'); -require('dotenv').config({ path: path.resolve(__dirname, '../.env') }); +/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if */ +/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */ +import {expect} from "chai"; +import path = require("path"); +import fs = require("fs"); -const { create2Deployment } = require('./helpers/deployment-helpers'); +import * as dotenv from "dotenv"; +dotenv.config({path: path.resolve(__dirname, "../.env")}); +import {ethers, upgrades} from "hardhat"; +import {HardhatEthersSigner} from "@nomicfoundation/hardhat-ethers/signers"; -const pathOutputJson = path.join(__dirname, './deploy_output.json'); -const pathOngoingDeploymentJson = path.join(__dirname, './deploy_ongoing.json'); +const {create2Deployment} = require("./helpers/deployment-helpers"); -const deployParameters = require('./deploy_parameters.json'); -const genesis = require('./genesis.json'); +const pathOutputJson = path.join(__dirname, "./deploy_output.json"); +const pathOngoingDeploymentJson = path.join(__dirname, "./deploy_ongoing.json"); + +const deployParameters = require("./deploy_parameters.json"); +const genesis = require("./genesis.json"); +const {ProviderWrapper} = require("hardhat/plugins"); const pathOZUpgradability = path.join(__dirname, `../.openzeppelin/${process.env.HARDHAT_NETWORK}.json`); async function main() { // Check that there's no previous OZ deployment if (fs.existsSync(pathOZUpgradability)) { - throw new Error(`There's upgradability information from previous deployments, it's mandatory to erase them before start a new one, path: ${pathOZUpgradability}`); + throw new Error( + `There's upgradability information from previous deployments, it's mandatory to erase them before start a new one, path: ${pathOZUpgradability}` + ); } // Check if there's an ongoing deployment @@ -37,27 +43,27 @@ async function main() { * Check that every necessary parameter is fullfilled */ const mandatoryDeploymentParameters = [ - 'realVerifier', - 'trustedSequencerURL', - 'networkName', - 'version', - 'trustedSequencer', - 'chainID', - 'admin', - 'trustedAggregator', - 'trustedAggregatorTimeout', - 'pendingStateTimeout', - 'forkID', - 'zkEVMOwner', - 'timelockAddress', - 'minDelayTimelock', - 'salt', - 'zkEVMDeployerAddress', - 'maticTokenAddress', + "realVerifier", + "trustedSequencerURL", + "networkName", + "version", + "trustedSequencer", + "chainID", + "admin", + "trustedAggregator", + "trustedAggregatorTimeout", + "pendingStateTimeout", + "forkID", + "zkEVMOwner", + "timelockAddress", + "minDelayTimelock", + "salt", + "zkEVMDeployerAddress", + "maticTokenAddress", ]; for (const parameterName of mandatoryDeploymentParameters) { - if (deployParameters[parameterName] === undefined || deployParameters[parameterName] === '') { + if (deployParameters[parameterName] === undefined || deployParameters[parameterName] === "") { throw new Error(`Missing parameter: ${parameterName}`); } } @@ -83,24 +89,31 @@ async function main() { } = deployParameters; // Load provider + let currentProvider = ethers.provider; if (deployParameters.multiplierGas || deployParameters.maxFeePerGas) { - if (process.env.HARDHAT_NETWORK !== 'hardhat') { - currentProvider = new ethers.providers.JsonRpcProvider(`https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}`); + if (process.env.HARDHAT_NETWORK !== "hardhat") { + currentProvider = ethers.getDefaultProvider( + `https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}` + ); if (deployParameters.maxPriorityFeePerGas && deployParameters.maxFeePerGas) { - console.log(`Hardcoded gas used: MaxPriority${deployParameters.maxPriorityFeePerGas} gwei, MaxFee${deployParameters.maxFeePerGas} gwei`); + console.log( + `Hardcoded gas used: MaxPriority${deployParameters.maxPriorityFeePerGas} gwei, MaxFee${deployParameters.maxFeePerGas} gwei` + ); const FEE_DATA = { - maxFeePerGas: ethers.parseUnits(deployParameters.maxFeePerGas, 'gwei'), - maxPriorityFeePerGas: ethers.parseUnits(deployParameters.maxPriorityFeePerGas, 'gwei'), + maxFeePerGas: ethers.parseUnits(deployParameters.maxFeePerGas, "gwei"), + maxPriorityFeePerGas: ethers.parseUnits(deployParameters.maxPriorityFeePerGas, "gwei"), }; currentProvider.getFeeData = async () => FEE_DATA; } else { - console.log('Multiplier gas used: ', deployParameters.multiplierGas); + console.log("Multiplier gas used: ", deployParameters.multiplierGas); async function overrideFeeData() { const feedata = await ethers.provider.getFeeData(); return { maxFeePerGas: feedata.maxFeePerGas.mul(deployParameters.multiplierGas).div(1000), - maxPriorityFeePerGas: feedata.maxPriorityFeePerGas.mul(deployParameters.multiplierGas).div(1000), + maxPriorityFeePerGas: feedata.maxPriorityFeePerGas + .mul(deployParameters.multiplierGas) + .div(1000), }; } currentProvider.getFeeData = overrideFeeData; @@ -112,44 +125,44 @@ async function main() { let deployer; if (deployParameters.deployerPvtKey) { deployer = new ethers.Wallet(deployParameters.deployerPvtKey, currentProvider); - console.log('Using pvtKey deployer with address: ', deployer.address); + console.log("Using pvtKey deployer with address: ", deployer.address); } else if (process.env.MNEMONIC) { - deployer = ethers.Wallet.fromMnemonic(process.env.MNEMONIC, 'm/44\'/60\'/0\'/0/0').connect(currentProvider); - console.log('Using MNEMONIC deployer with address: ', deployer.address); + deployer = ethers.Wallet.fromMnemonic(process.env.MNEMONIC, "m/44'/60'/0'/0/0").connect(currentProvider); + console.log("Using MNEMONIC deployer with address: ", deployer.address); } else { - [deployer] = (await ethers.getSigners()); + [deployer] = await ethers.getSigners(); } // Load zkEVM deployer - const PolgonZKEVMDeployerFactory = await ethers.getContractFactory('PolygonZkEVMDeployer', deployer); + const PolgonZKEVMDeployerFactory = await ethers.getContractFactory("PolygonZkEVMDeployer", deployer); const zkEVMDeployerContract = PolgonZKEVMDeployerFactory.attach(zkEVMDeployerAddress); // check deployer is the owner of the deployer - if (await deployer.provider.getCode(zkEVMDeployerContract.address) === '0x') { - throw new Error('zkEVM deployer contract is not deployed'); + if ((await deployer.provider.getCode(zkEVMDeployerContract.address)) === "0x") { + throw new Error("zkEVM deployer contract is not deployed"); } expect(deployer.address).to.be.equal(await zkEVMDeployerContract.owner()); let verifierContract; if (!ongoingDeployment.verifierContract) { if (realVerifier === true) { - const VerifierRollup = await ethers.getContractFactory('FflonkVerifier', deployer); + const VerifierRollup = await ethers.getContractFactory("FflonkVerifier", deployer); verifierContract = await VerifierRollup.deploy(); await verifierContract.deployed(); } else { - const VerifierRollupHelperFactory = await ethers.getContractFactory('VerifierRollupHelperMock', deployer); + const VerifierRollupHelperFactory = await ethers.getContractFactory("VerifierRollupHelperMock", deployer); verifierContract = await VerifierRollupHelperFactory.deploy(); await verifierContract.deployed(); } - console.log('#######################\n'); - console.log('Verifier deployed to:', verifierContract.address); + console.log("#######################\n"); + console.log("Verifier deployed to:", verifierContract.address); // save an ongoing deployment ongoingDeployment.verifierContract = verifierContract.address; fs.writeFileSync(pathOngoingDeploymentJson, JSON.stringify(ongoingDeployment, null, 1)); } else { - console.log('Verifier already deployed on: ', ongoingDeployment.verifierContract); - const VerifierRollupFactory = await ethers.getContractFactory('FflonkVerifier', deployer); + console.log("Verifier already deployed on: ", ongoingDeployment.verifierContract); + const VerifierRollupFactory = await ethers.getContractFactory("FflonkVerifier", deployer); verifierContract = VerifierRollupFactory.attach(ongoingDeployment.verifierContract); } @@ -159,28 +172,28 @@ async function main() { */ // Deploy proxy admin: - const proxyAdminFactory = await ethers.getContractFactory('ProxyAdmin', deployer); - const deployTransactionAdmin = (proxyAdminFactory.getDeployTransaction()).data; - const dataCallAdmin = proxyAdminFactory.interface.encodeFunctionData('transferOwnership', [deployer.address]); + const proxyAdminFactory = await ethers.getContractFactory("ProxyAdmin", deployer); + const deployTransactionAdmin = proxyAdminFactory.getDeployTransaction().data; + const dataCallAdmin = proxyAdminFactory.interface.encodeFunctionData("transferOwnership", [deployer.address]); const [proxyAdminAddress, isProxyAdminDeployed] = await create2Deployment( zkEVMDeployerContract, salt, deployTransactionAdmin, dataCallAdmin, - deployer, + deployer ); if (isProxyAdminDeployed) { - console.log('#######################\n'); - console.log('Proxy admin deployed to:', proxyAdminAddress); + console.log("#######################\n"); + console.log("Proxy admin deployed to:", proxyAdminAddress); } else { - console.log('#######################\n'); - console.log('Proxy admin was already deployed to:', proxyAdminAddress); + console.log("#######################\n"); + console.log("Proxy admin was already deployed to:", proxyAdminAddress); } // Deploy implementation PolygonZkEVMBridge - const polygonZkEVMBridgeFactory = await ethers.getContractFactory('PolygonZkEVMBridge', deployer); - const deployTransactionBridge = (polygonZkEVMBridgeFactory.getDeployTransaction()).data; + const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridge", deployer); + const deployTransactionBridge = polygonZkEVMBridgeFactory.getDeployTransaction().data; const dataCallNull = null; // Mandatory to override the gasLimit since the estimation with create are mess up D: const overrideGasLimit = ethers.BigNumber.from(5500000); @@ -190,36 +203,36 @@ async function main() { deployTransactionBridge, dataCallNull, deployer, - overrideGasLimit, + overrideGasLimit ); if (isBridgeImplDeployed) { - console.log('#######################\n'); - console.log('bridge impl deployed to:', bridgeImplementationAddress); + console.log("#######################\n"); + console.log("bridge impl deployed to:", bridgeImplementationAddress); } else { - console.log('#######################\n'); - console.log('bridge impl was already deployed to:', bridgeImplementationAddress); + console.log("#######################\n"); + console.log("bridge impl was already deployed to:", bridgeImplementationAddress); } /* * deploy proxy * Do not initialize directly the proxy since we want to deploy the same code on L2 and this will alter the bytecode deployed of the proxy */ - const transparentProxyFactory = await ethers.getContractFactory('TransparentUpgradeableProxy', deployer); - const initializeEmptyDataProxy = '0x'; - const deployTransactionProxy = (transparentProxyFactory.getDeployTransaction( + const transparentProxyFactory = await ethers.getContractFactory("TransparentUpgradeableProxy", deployer); + const initializeEmptyDataProxy = "0x"; + const deployTransactionProxy = transparentProxyFactory.getDeployTransaction( bridgeImplementationAddress, proxyAdminAddress, - initializeEmptyDataProxy, - )).data; + initializeEmptyDataProxy + ).data; // Nonce globalExitRoot: currentNonce + 1 (deploy bridge proxy) + 1(impl globalExitRoot) = +2 - const nonceProxyGlobalExitRoot = Number((await ethers.provider.getTransactionCount(deployer.address))) + 2; + const nonceProxyGlobalExitRoot = Number(await ethers.provider.getTransactionCount(deployer.address)) + 2; // nonceProxyZkevm :Nonce globalExitRoot + 1 (proxy globalExitRoot) + 1 (impl Zkevm) = +2 const nonceProxyZkevm = nonceProxyGlobalExitRoot + 2; - let precalculateGLobalExitRootAddress; let - precalculateZkevmAddress; + let precalculateGLobalExitRootAddress; + let precalculateZkevmAddress; // Check if the contract is already deployed if (ongoingDeployment.polygonZkEVMGlobalExitRoot && ongoingDeployment.polygonZkEVMContract) { @@ -232,78 +245,78 @@ async function main() { fs.writeFileSync(pathOngoingDeploymentJson, JSON.stringify(ongoingDeployment, null, 1)); // Contracts are not deployed, normal deployment - precalculateGLobalExitRootAddress = ethers.getContractAddress({ from: deployer.address, nonce: nonceProxyGlobalExitRoot }); - precalculateZkevmAddress = ethers.getContractAddress({ from: deployer.address, nonce: nonceProxyZkevm }); + precalculateGLobalExitRootAddress = ethers.getContractAddress({ + from: deployer.address, + nonce: nonceProxyGlobalExitRoot, + }); + precalculateZkevmAddress = ethers.getContractAddress({from: deployer.address, nonce: nonceProxyZkevm}); } - const dataCallProxy = polygonZkEVMBridgeFactory.interface.encodeFunctionData( - 'initialize', - [ - networkIDMainnet, - precalculateGLobalExitRootAddress, - precalculateZkevmAddress, - ], - ); + const dataCallProxy = polygonZkEVMBridgeFactory.interface.encodeFunctionData("initialize", [ + networkIDMainnet, + precalculateGLobalExitRootAddress, + precalculateZkevmAddress, + ]); const [proxyBridgeAddress, isBridgeProxyDeployed] = await create2Deployment( zkEVMDeployerContract, salt, deployTransactionProxy, dataCallProxy, - deployer, + deployer ); const polygonZkEVMBridgeContract = polygonZkEVMBridgeFactory.attach(proxyBridgeAddress); if (isBridgeProxyDeployed) { - console.log('#######################\n'); - console.log('PolygonZkEVMBridge deployed to:', polygonZkEVMBridgeContract.address); + console.log("#######################\n"); + console.log("PolygonZkEVMBridge deployed to:", polygonZkEVMBridgeContract.address); } else { - console.log('#######################\n'); - console.log('PolygonZkEVMBridge was already deployed to:', polygonZkEVMBridgeContract.address); + console.log("#######################\n"); + console.log("PolygonZkEVMBridge was already deployed to:", polygonZkEVMBridgeContract.address); // If it was already deployed, check that the initialized calldata matches the actual deployment expect(precalculateGLobalExitRootAddress).to.be.equal(await polygonZkEVMBridgeContract.globalExitRootManager()); expect(precalculateZkevmAddress).to.be.equal(await polygonZkEVMBridgeContract.polygonZkEVMaddress()); } - console.log('\n#######################'); - console.log('##### Checks PolygonZkEVMBridge #####'); - console.log('#######################'); - console.log('PolygonZkEVMGlobalExitRootAddress:', await polygonZkEVMBridgeContract.globalExitRootManager()); - console.log('networkID:', await polygonZkEVMBridgeContract.networkID()); - console.log('zkEVMaddress:', await polygonZkEVMBridgeContract.polygonZkEVMaddress()); + console.log("\n#######################"); + console.log("##### Checks PolygonZkEVMBridge #####"); + console.log("#######################"); + console.log("PolygonZkEVMGlobalExitRootAddress:", await polygonZkEVMBridgeContract.globalExitRootManager()); + console.log("networkID:", await polygonZkEVMBridgeContract.networkID()); + console.log("zkEVMaddress:", await polygonZkEVMBridgeContract.polygonZkEVMaddress()); // Import OZ manifest the deployed contracts, its enough to import just the proxy, the rest are imported automatically (admin/impl) - await upgrades.forceImport(proxyBridgeAddress, polygonZkEVMBridgeFactory, 'transparent'); + await upgrades.forceImport(proxyBridgeAddress, polygonZkEVMBridgeFactory, "transparent"); /* *Deployment Global exit root manager */ let polygonZkEVMGlobalExitRoot; - const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory('PolygonZkEVMGlobalExitRoot', deployer); + const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRoot", deployer); if (!ongoingDeployment.polygonZkEVMGlobalExitRoot) { for (let i = 0; i < attemptsDeployProxy; i++) { try { polygonZkEVMGlobalExitRoot = await upgrades.deployProxy(PolygonZkEVMGlobalExitRootFactory, [], { initializer: false, constructorArgs: [precalculateZkevmAddress, proxyBridgeAddress], - unsafeAllow: ['constructor', 'state-variable-immutable'], + unsafeAllow: ["constructor", "state-variable-immutable"], }); break; } catch (error) { console.log(`attempt ${i}`); - console.log('upgrades.deployProxy of polygonZkEVMGlobalExitRoot ', error.message); + console.log("upgrades.deployProxy of polygonZkEVMGlobalExitRoot ", error.message); } // reach limits of attempts if (i + 1 === attemptsDeployProxy) { - throw new Error('polygonZkEVMGlobalExitRoot contract has not been deployed'); + throw new Error("polygonZkEVMGlobalExitRoot contract has not been deployed"); } } expect(precalculateGLobalExitRootAddress).to.be.equal(polygonZkEVMGlobalExitRoot.address); - console.log('#######################\n'); - console.log('polygonZkEVMGlobalExitRoot deployed to:', polygonZkEVMGlobalExitRoot.address); + console.log("#######################\n"); + console.log("polygonZkEVMGlobalExitRoot deployed to:", polygonZkEVMGlobalExitRoot.address); // save an ongoing deployment ongoingDeployment.polygonZkEVMGlobalExitRoot = polygonZkEVMGlobalExitRoot.address; @@ -312,13 +325,19 @@ async function main() { // sanity check expect(precalculateGLobalExitRootAddress).to.be.equal(polygonZkEVMGlobalExitRoot.address); // Expect the precalculate address matches de onogin deployment - polygonZkEVMGlobalExitRoot = PolygonZkEVMGlobalExitRootFactory.attach(ongoingDeployment.polygonZkEVMGlobalExitRoot); + polygonZkEVMGlobalExitRoot = PolygonZkEVMGlobalExitRootFactory.attach( + ongoingDeployment.polygonZkEVMGlobalExitRoot + ); - console.log('#######################\n'); - console.log('polygonZkEVMGlobalExitRoot already deployed on: ', ongoingDeployment.polygonZkEVMGlobalExitRoot); + console.log("#######################\n"); + console.log("polygonZkEVMGlobalExitRoot already deployed on: ", ongoingDeployment.polygonZkEVMGlobalExitRoot); // Import OZ manifest the deployed contracts, its enough to import just the proyx, the rest are imported automatically (admin/impl) - await upgrades.forceImport(ongoingDeployment.polygonZkEVMGlobalExitRoot, PolygonZkEVMGlobalExitRootFactory, 'transparent'); + await upgrades.forceImport( + ongoingDeployment.polygonZkEVMGlobalExitRoot, + PolygonZkEVMGlobalExitRootFactory, + "transparent" + ); // Check against current deployment expect(polygonZkEVMBridgeContract.address).to.be.equal(await polygonZkEVMBridgeContract.bridgeAddress()); @@ -328,28 +347,28 @@ async function main() { // deploy PolygonZkEVMM const genesisRootHex = genesis.root; - console.log('\n#######################'); - console.log('##### Deployment Polygon ZK-EVM #####'); - console.log('#######################'); - console.log('deployer:', deployer.address); - console.log('PolygonZkEVMGlobalExitRootAddress:', polygonZkEVMGlobalExitRoot.address); - console.log('maticTokenAddress:', maticTokenAddress); - console.log('verifierAddress:', verifierContract.address); - console.log('polygonZkEVMBridgeContract:', polygonZkEVMBridgeContract.address); - - console.log('admin:', admin); - console.log('chainID:', chainID); - console.log('trustedSequencer:', trustedSequencer); - console.log('pendingStateTimeout:', pendingStateTimeout); - console.log('trustedAggregator:', trustedAggregator); - console.log('trustedAggregatorTimeout:', trustedAggregatorTimeout); - - console.log('genesisRoot:', genesisRootHex); - console.log('trustedSequencerURL:', trustedSequencerURL); - console.log('networkName:', networkName); - console.log('forkID:', forkID); - - const PolygonZkEVMFactory = await ethers.getContractFactory('PolygonZkEVM', deployer); + console.log("\n#######################"); + console.log("##### Deployment Polygon ZK-EVM #####"); + console.log("#######################"); + console.log("deployer:", deployer.address); + console.log("PolygonZkEVMGlobalExitRootAddress:", polygonZkEVMGlobalExitRoot.address); + console.log("maticTokenAddress:", maticTokenAddress); + console.log("verifierAddress:", verifierContract.address); + console.log("polygonZkEVMBridgeContract:", polygonZkEVMBridgeContract.address); + + console.log("admin:", admin); + console.log("chainID:", chainID); + console.log("trustedSequencer:", trustedSequencer); + console.log("pendingStateTimeout:", pendingStateTimeout); + console.log("trustedAggregator:", trustedAggregator); + console.log("trustedAggregatorTimeout:", trustedAggregatorTimeout); + + console.log("genesisRoot:", genesisRootHex); + console.log("trustedSequencerURL:", trustedSequencerURL); + console.log("networkName:", networkName); + console.log("forkID:", forkID); + + const PolygonZkEVMFactory = await ethers.getContractFactory("PolygonZkEVM", deployer); let polygonZkEVMContract; let deploymentBlockNumber; @@ -380,25 +399,25 @@ async function main() { chainID, forkID, ], - unsafeAllow: ['constructor', 'state-variable-immutable'], - }, + unsafeAllow: ["constructor", "state-variable-immutable"], + } ); break; } catch (error) { console.log(`attempt ${i}`); - console.log('upgrades.deployProxy of polygonZkEVMContract ', error.message); + console.log("upgrades.deployProxy of polygonZkEVMContract ", error.message); } // reach limits of attempts if (i + 1 === attemptsDeployProxy) { - throw new Error('PolygonZkEVM contract has not been deployed'); + throw new Error("PolygonZkEVM contract has not been deployed"); } } expect(precalculateZkevmAddress).to.be.equal(polygonZkEVMContract.address); - console.log('#######################\n'); - console.log('polygonZkEVMContract deployed to:', polygonZkEVMContract.address); + console.log("#######################\n"); + console.log("polygonZkEVMContract deployed to:", polygonZkEVMContract.address); // save an ongoing deployment ongoingDeployment.polygonZkEVMContract = polygonZkEVMContract.address; @@ -415,11 +434,11 @@ async function main() { expect(precalculateZkevmAddress).to.be.equal(ongoingDeployment.polygonZkEVMContract); polygonZkEVMContract = PolygonZkEVMFactory.attach(ongoingDeployment.polygonZkEVMContract); - console.log('#######################\n'); - console.log('polygonZkEVMContract already deployed on: ', ongoingDeployment.polygonZkEVMContract); + console.log("#######################\n"); + console.log("polygonZkEVMContract already deployed on: ", ongoingDeployment.polygonZkEVMContract); // Import OZ manifest the deployed contracts, its enough to import just the proyx, the rest are imported automatically ( admin/impl) - await upgrades.forceImport(ongoingDeployment.polygonZkEVMContract, PolygonZkEVMFactory, 'transparent'); + await upgrades.forceImport(ongoingDeployment.polygonZkEVMContract, PolygonZkEVMFactory, "transparent"); const zkEVMOwnerContract = await polygonZkEVMContract.owner(); if (zkEVMOwnerContract === deployer.address) { @@ -433,26 +452,26 @@ async function main() { deploymentBlockNumber = 0; } - console.log('\n#######################'); - console.log('##### Checks PolygonZkEVM #####'); - console.log('#######################'); - console.log('PolygonZkEVMGlobalExitRootAddress:', await polygonZkEVMContract.globalExitRootManager()); - console.log('maticTokenAddress:', await polygonZkEVMContract.matic()); - console.log('verifierAddress:', await polygonZkEVMContract.rollupVerifier()); - console.log('polygonZkEVMBridgeContract:', await polygonZkEVMContract.bridgeAddress()); - - console.log('admin:', await polygonZkEVMContract.admin()); - console.log('chainID:', await polygonZkEVMContract.chainID()); - console.log('trustedSequencer:', await polygonZkEVMContract.trustedSequencer()); - console.log('pendingStateTimeout:', await polygonZkEVMContract.pendingStateTimeout()); - console.log('trustedAggregator:', await polygonZkEVMContract.trustedAggregator()); - console.log('trustedAggregatorTimeout:', await polygonZkEVMContract.trustedAggregatorTimeout()); - - console.log('genesiRoot:', await polygonZkEVMContract.batchNumToStateRoot(0)); - console.log('trustedSequencerURL:', await polygonZkEVMContract.trustedSequencerURL()); - console.log('networkName:', await polygonZkEVMContract.networkName()); - console.log('owner:', await polygonZkEVMContract.owner()); - console.log('forkID:', await polygonZkEVMContract.forkID()); + console.log("\n#######################"); + console.log("##### Checks PolygonZkEVM #####"); + console.log("#######################"); + console.log("PolygonZkEVMGlobalExitRootAddress:", await polygonZkEVMContract.globalExitRootManager()); + console.log("maticTokenAddress:", await polygonZkEVMContract.matic()); + console.log("verifierAddress:", await polygonZkEVMContract.rollupVerifier()); + console.log("polygonZkEVMBridgeContract:", await polygonZkEVMContract.bridgeAddress()); + + console.log("admin:", await polygonZkEVMContract.admin()); + console.log("chainID:", await polygonZkEVMContract.chainID()); + console.log("trustedSequencer:", await polygonZkEVMContract.trustedSequencer()); + console.log("pendingStateTimeout:", await polygonZkEVMContract.pendingStateTimeout()); + console.log("trustedAggregator:", await polygonZkEVMContract.trustedAggregator()); + console.log("trustedAggregatorTimeout:", await polygonZkEVMContract.trustedAggregatorTimeout()); + + console.log("genesiRoot:", await polygonZkEVMContract.batchNumToStateRoot(0)); + console.log("trustedSequencerURL:", await polygonZkEVMContract.trustedSequencerURL()); + console.log("networkName:", await polygonZkEVMContract.networkName()); + console.log("owner:", await polygonZkEVMContract.owner()); + console.log("forkID:", await polygonZkEVMContract.forkID()); // Assert admin address expect(await upgrades.erc1967.getAdminAddress(precalculateZkevmAddress)).to.be.equal(proxyAdminAddress); @@ -461,7 +480,7 @@ async function main() { const proxyAdminInstance = proxyAdminFactory.attach(proxyAdminAddress); const proxyAdminOwner = await proxyAdminInstance.owner(); - const timelockContractFactory = await ethers.getContractFactory('PolygonZkEVMTimelock', deployer); + const timelockContractFactory = await ethers.getContractFactory("PolygonZkEVMTimelock", deployer); // TODO test stop here @@ -471,43 +490,37 @@ async function main() { timelockContract = timelockContractFactory.attach(proxyAdminOwner); expect(precalculateZkevmAddress).to.be.equal(await timelockContract.polygonZkEVM()); - console.log('#######################\n'); - console.log( - 'Polygon timelockContract already deployed to:', - timelockContract.address, - ); + console.log("#######################\n"); + console.log("Polygon timelockContract already deployed to:", timelockContract.address); } else { // deploy timelock - console.log('\n#######################'); - console.log('##### Deployment TimelockContract #####'); - console.log('#######################'); - console.log('minDelayTimelock:', minDelayTimelock); - console.log('timelockAddress:', timelockAddress); - console.log('zkEVMAddress:', polygonZkEVMContract.address); + console.log("\n#######################"); + console.log("##### Deployment TimelockContract #####"); + console.log("#######################"); + console.log("minDelayTimelock:", minDelayTimelock); + console.log("timelockAddress:", timelockAddress); + console.log("zkEVMAddress:", polygonZkEVMContract.address); timelockContract = await timelockContractFactory.deploy( minDelayTimelock, [timelockAddress], [timelockAddress], timelockAddress, - polygonZkEVMContract.address, + polygonZkEVMContract.address ); await timelockContract.deployed(); - console.log('#######################\n'); - console.log( - 'Polygon timelockContract deployed to:', - timelockContract.address, - ); + console.log("#######################\n"); + console.log("Polygon timelockContract deployed to:", timelockContract.address); // Transfer ownership of the proxyAdmin to timelock const proxyAdminContract = proxyAdminFactory.attach(proxyAdminAddress); await (await proxyAdminContract.transferOwnership(timelockContract.address)).wait(); } - console.log('\n#######################'); - console.log('##### Checks TimelockContract #####'); - console.log('#######################'); - console.log('minDelayTimelock:', await timelockContract.getMinDelay()); - console.log('polygonZkEVM:', await timelockContract.polygonZkEVM()); + console.log("\n#######################"); + console.log("##### Checks TimelockContract #####"); + console.log("#######################"); + console.log("minDelayTimelock:", await timelockContract.getMinDelay()); + console.log("polygonZkEVM:", await timelockContract.polygonZkEVM()); const outputJson = { polygonZkEVMAddress: polygonZkEVMContract.address, diff --git a/deployment/helpers/deployment-helpers.js b/deployment/helpers/deployment-helpers.js deleted file mode 100644 index 87f332fc7..000000000 --- a/deployment/helpers/deployment-helpers.js +++ /dev/null @@ -1,114 +0,0 @@ -/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if, import/no-dynamic-require */ -/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */ -const { expect } = require('chai'); -const { ethers } = require('hardhat'); - -const gasPriceKeylessDeployment = '100'; // 100 gweis - -async function deployPolygonZkEVMDeployer(deployerAddress, signer) { - const PolgonZKEVMDeployerFactory = await ethers.getContractFactory('PolygonZkEVMDeployer', signer); - - const deployTxZKEVMDeployer = (PolgonZKEVMDeployerFactory.getDeployTransaction( - deployerAddress, - )).data; - - const gasLimit = ethers.BigNumber.from(1000000); // Put 1 Million, aprox 650k are necessary - const gasPrice = ethers.BigNumber.from(ethers.parseUnits(gasPriceKeylessDeployment, 'gwei')); - const to = '0x'; // bc deployment transaction, "to" is "0x" - const tx = { - to, - nonce: 0, - value: 0, - gasLimit: gasLimit.toHexString(), - gasPrice: gasPrice.toHexString(), - data: deployTxZKEVMDeployer, - }; - - const signature = { - v: 27, - r: '0x5ca1ab1e0', // Equals 0x00000000000000000000000000000000000000000000000000000005ca1ab1e0 - s: '0x5ca1ab1e', // Equals 0x000000000000000000000000000000000000000000000000000000005ca1ab1e - }; - const serializedTransaction = ethers.serializeTransaction(tx, signature); - const resultTransaction = ethers.parseTransaction(serializedTransaction); - const totalEther = gasLimit.mul(gasPrice); // 0.1 ether - - // Check if it's already deployed - const zkEVMDeployerAddress = ethers.getContractAddress(resultTransaction); - if (await signer.provider.getCode(zkEVMDeployerAddress) !== '0x') { - const zkEVMDeployerContract = PolgonZKEVMDeployerFactory.attach(zkEVMDeployerAddress); - expect(await zkEVMDeployerContract.owner()).to.be.equal(signer.address); - return [zkEVMDeployerContract, ethers.ZeroAddress]; - } - - // Fund keyless deployment - const params = { - to: resultTransaction.from, - value: totalEther.toHexString(), - }; - await (await signer.sendTransaction(params)).wait(); - - // Deploy zkEVMDeployer - await (await signer.provider.sendTransaction(serializedTransaction)).wait(); - - const zkEVMDeployerContract = await PolgonZKEVMDeployerFactory.attach(zkEVMDeployerAddress); - expect(await zkEVMDeployerContract.owner()).to.be.equal(deployerAddress); - return [zkEVMDeployerContract, resultTransaction.from]; -} - -async function create2Deployment(polgonZKEVMDeployerContract, salt, deployTransaction, dataCall, deployer, hardcodedGasLimit) { - // Encode deploy transaction - const hashInitCode = ethers.solidityPackedKeccak256(['bytes'], [deployTransaction]); - - // Precalculate create2 address - const precalculatedAddressDeployed = ethers.getCreate2Address(polgonZKEVMDeployerContract.address, salt, hashInitCode); - const amount = 0; - - if (await deployer.provider.getCode(precalculatedAddressDeployed) !== '0x') { - return [precalculatedAddressDeployed, false]; - } - - if (dataCall) { - // Deploy using create2 and call - if (hardcodedGasLimit) { - const populatedTransaction = await polgonZKEVMDeployerContract.populateTransaction.deployDeterministicAndCall( - amount, - salt, - deployTransaction, - dataCall, - ); - populatedTransaction.gasLimit = ethers.BigNumber.from(hardcodedGasLimit); - await (await deployer.sendTransaction(populatedTransaction)).wait(); - } else { - await (await polgonZKEVMDeployerContract.deployDeterministicAndCall(amount, salt, deployTransaction, dataCall)).wait(); - } - } else { - // Deploy using create2 - if (hardcodedGasLimit) { - const populatedTransaction = await polgonZKEVMDeployerContract.populateTransaction.deployDeterministic( - amount, - salt, - deployTransaction, - ); - populatedTransaction.gasLimit = ethers.BigNumber.from(hardcodedGasLimit); - await (await deployer.sendTransaction(populatedTransaction)).wait(); - } else { - await (await polgonZKEVMDeployerContract.deployDeterministic(amount, salt, deployTransaction)).wait(); - } - } - return [precalculatedAddressDeployed, true]; -} - -function getCreate2Address(polgonZKEVMDeployerContract, salt, deployTransaction) { - // Encode deploy transaction - const hashInitCode = ethers.solidityPackedKeccak256(['bytes'], [deployTransaction]); - - // Precalculate create2 address - return ethers.getCreate2Address(polgonZKEVMDeployerContract.address, salt, hashInitCode); -} - -module.exports = { - deployPolygonZkEVMDeployer, - create2Deployment, - getCreate2Address, -}; diff --git a/deployment/helpers/deployment-helpers.ts b/deployment/helpers/deployment-helpers.ts new file mode 100644 index 000000000..c87ed8587 --- /dev/null +++ b/deployment/helpers/deployment-helpers.ts @@ -0,0 +1,150 @@ +/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if, import/no-dynamic-require */ +/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */ +import {expect} from "chai"; +import {ethers} from "hardhat"; + +const gasPriceKeylessDeployment = "100"; // 100 gweis +// type Signer = ethers.types.Signer; +import {Signer} from "ethers"; +import {HardhatEthersSigner} from "@nomicfoundation/hardhat-ethers/signers"; +import {HardhatEthersProvider} from "@nomicfoundation/hardhat-ethers/internal/hardhat-ethers-provider"; + +import { + VerifierRollupHelperMock, + ERC20PermitMock, + PolygonRollupManagerMock, + PolygonZkEVMGlobalExitRoot, + PolygonZkEVMBridgeV2, + PolygonZkEVMV2, + PolygonRollupBase, + TokenWrapped, + Address, + PolygonZkEVM, + PolygonZkEVMV2Existent, + PolygonZkEVMDeployer, +} from "../../typechain-types"; +import {string} from "yargs"; + +export async function deployPolygonZkEVMDeployer( + deployerAddress: string, + signer: HardhatEthersSigner +): Promise<[PolygonZkEVMDeployer, string]> { + const PolgonZKEVMDeployerFactory = await ethers.getContractFactory("PolygonZkEVMDeployer", signer); + + const deployTxZKEVMDeployer = (await PolgonZKEVMDeployerFactory.getDeployTransaction(deployerAddress)).data; + + const gasLimit = BigInt(1000000); // Put 1 Million, aprox 650k are necessary + const gasPrice = BigInt(ethers.parseUnits(gasPriceKeylessDeployment, "gwei")); + + const signature = { + v: 27, + r: "0x5ca1ab1e0", // Equals 0x00000000000000000000000000000000000000000000000000000005ca1ab1e0 + s: "0x5ca1ab1e", // Equals 0x000000000000000000000000000000000000000000000000000000005ca1ab1e + }; + const tx = ethers.Transaction.from({ + to: null, // bc deployment transaction, "to" is "0x" + nonce: 0, + value: 0, + gasLimit: gasLimit, + gasPrice: gasPrice, + data: deployTxZKEVMDeployer, + type: 0, // legacy transaction + signature, + }); + + const totalEther = gasLimit * gasPrice; // 0.1 ether + const signerProvider = signer.provider as HardhatEthersProvider; + // Check if it's already deployed + const zkEVMDeployerAddress = ethers.getCreateAddress({from: tx.from as string, nonce: tx.nonce}); + if ((await signerProvider.getCode(zkEVMDeployerAddress)) !== "0x") { + const zkEVMDeployerContract = PolgonZKEVMDeployerFactory.attach(zkEVMDeployerAddress) as PolygonZkEVMDeployer; + expect(await zkEVMDeployerContract.owner()).to.be.equal(signer.address); + return [zkEVMDeployerContract, ethers.ZeroAddress]; + } + + // Fund keyless deployment + const params = { + to: tx.from, + value: totalEther, + }; + await (await signer.sendTransaction(params)).wait(); + + // Deploy zkEVMDeployer + + await (await signerProvider.broadcastTransaction(tx.serialized)).wait(); + + const zkEVMDeployerContract = (await PolgonZKEVMDeployerFactory.attach( + zkEVMDeployerAddress + )) as PolygonZkEVMDeployer; + expect(await zkEVMDeployerContract.owner()).to.be.equal(deployerAddress); + return [zkEVMDeployerContract, tx.from as string]; +} + +export async function create2Deployment( + polgonZKEVMDeployerContract: PolygonZkEVMDeployer, + salt: string, + deployTransaction: string, + dataCall: string | null, + deployer: HardhatEthersSigner, + hardcodedGasLimit: bigint | null +) { + // Encode deploy transaction + const hashInitCode = ethers.solidityPackedKeccak256(["bytes"], [deployTransaction]); + + // Precalculate create2 address + const precalculatedAddressDeployed = ethers.getCreate2Address( + polgonZKEVMDeployerContract.target as string, + salt, + hashInitCode + ); + const amount = 0; + + if ((await deployer.provider.getCode(precalculatedAddressDeployed)) !== "0x") { + return [precalculatedAddressDeployed, false]; + } + + if (dataCall) { + // Deploy using create2 and call + if (hardcodedGasLimit) { + const populatedTransaction = + await polgonZKEVMDeployerContract.deployDeterministicAndCall.populateTransaction( + amount, + salt, + deployTransaction, + dataCall + ); + populatedTransaction.gasLimit = hardcodedGasLimit; + await (await deployer.sendTransaction(populatedTransaction)).wait(); + } else { + await ( + await polgonZKEVMDeployerContract.deployDeterministicAndCall(amount, salt, deployTransaction, dataCall) + ).wait(); + } + } else { + // Deploy using create2 + if (hardcodedGasLimit) { + const populatedTransaction = await polgonZKEVMDeployerContract.deployDeterministic.populateTransaction( + amount, + salt, + deployTransaction + ); + populatedTransaction.gasLimit = hardcodedGasLimit; + await (await deployer.sendTransaction(populatedTransaction)).wait(); + } else { + await (await polgonZKEVMDeployerContract.deployDeterministic(amount, salt, deployTransaction)).wait(); + } + } + return [precalculatedAddressDeployed, true]; +} + +export function getCreate2Address( + polgonZKEVMDeployerContract: PolygonZkEVMDeployer, + salt: string, + deployTransaction: string +) { + // Encode deploy transaction + const hashInitCode = ethers.solidityPackedKeccak256(["bytes"], [deployTransaction]); + + // Precalculate create2 address + return ethers.getCreate2Address(polgonZKEVMDeployerContract.target as string, salt, hashInitCode); +} diff --git a/hardhat.config.ts b/hardhat.config.ts index a9eecb6cd..272c6c0cf 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -27,6 +27,15 @@ const config: HardhatUserConfig = { }, solidity: { compilers: [ + { + version: "0.8.17", + settings: { + optimizer: { + enabled: true, + runs: 999999, + }, + }, + }, { version: "0.8.20", settings: { diff --git a/package-lock.json b/package-lock.json index c4ec2797b..982589000 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "@openzeppelin/contracts-upgradeable": "4.8.2", "@openzeppelin/contracts5": "npm:@openzeppelin/contracts@^5.0.0", "@openzeppelin/hardhat-upgrades": "2.3.3", + "@types/yargs": "^17.0.28", "circomlibjs": "0.1.1", "dotenv": "^8.6.0", "eslint": "^8.51.0", @@ -4245,6 +4246,21 @@ "@types/node": "*" } }, + "node_modules/@types/yargs": { + "version": "17.0.28", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.28.tgz", + "integrity": "sha512-N3e3fkS86hNhtk6BEnc0rj3zcehaxx8QWhCROJkqpl5Zaoi7nAic3jH8q94jVD3zu5LGk+PUB6KAiDmimYOEQw==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ==", + "dev": true + }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", @@ -17408,7 +17424,8 @@ "version": "0.2.7", "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/hmac-drbg": { "version": "1.0.1", diff --git a/package.json b/package.json index aab304694..8b6eaef39 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "@openzeppelin/contracts-upgradeable": "4.8.2", "@openzeppelin/contracts5": "npm:@openzeppelin/contracts@^5.0.0", "@openzeppelin/hardhat-upgrades": "2.3.3", + "@types/yargs": "^17.0.28", "circomlibjs": "0.1.1", "dotenv": "^8.6.0", "eslint": "^8.51.0", @@ -87,4 +88,4 @@ "prepare:testnet:gasToken:ZkEVM:goerli": "npx hardhat run deployment/testnet/prepareTestnet.js --network goerli && npx hardhat run deployment/testnet/prepareGasToken.js --network goerli", "deploy:testnet:gasToken:ZkEVM:goerli": "npm run prepare:testnet:gasToken:ZkEVM:goerli && npm run deploy:ZkEVM:goerli" } -} \ No newline at end of file +} diff --git a/tsconfig.json b/tsconfig.json index 4e44a2612..6aee48488 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,5 +7,18 @@ "strict": true, "skipLibCheck": true, "resolveJsonModule": true - } + }, + "ts-node": { + // It is faster to skip typechecking. + // Remove if you want ts-node to do typechecking. + "transpileOnly": true, + + "files": true, + + "compilerOptions": { + // compilerOptions specified here will override those declared below, + // but *only* in ts-node. Useful if you want ts-node and tsc to use + // different options with a single tsconfig.json. + } + }, } \ No newline at end of file From 8a223b49a840d07067615404bd11fedecf32be9b Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 17 Oct 2023 11:57:48 +0200 Subject: [PATCH 071/230] ongoing --- contracts/v2/PolygonRollupManager.sol | 2 +- deployment/3_deployContracts.ts | 60 +++++++++++++++++---------- 2 files changed, 39 insertions(+), 23 deletions(-) diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index 779bf729d..59aae13ae 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -171,7 +171,7 @@ contract PolygonRollupManager is uint32 public rollupTypeCount; // Consensus mapping - mapping(uint64 rollupTypeID => RollupType) public rollupTypeMap; + mapping(uint32 rollupTypeID => RollupType) public rollupTypeMap; // Rollup Count uint32 public rollupCount; diff --git a/deployment/3_deployContracts.ts b/deployment/3_deployContracts.ts index 08caa55a6..f1a061a05 100644 --- a/deployment/3_deployContracts.ts +++ b/deployment/3_deployContracts.ts @@ -20,6 +20,21 @@ const {ProviderWrapper} = require("hardhat/plugins"); const pathOZUpgradability = path.join(__dirname, `../.openzeppelin/${process.env.HARDHAT_NETWORK}.json`); +import { + VerifierRollupHelperMock, + ERC20PermitMock, + PolygonRollupManagerMock, + PolygonZkEVMGlobalExitRoot, + PolygonZkEVMBridgeV2, + PolygonZkEVMV2, + PolygonRollupBase, + TokenWrapped, + Address, + PolygonZkEVM, + PolygonZkEVMV2Existent, + PolygonZkEVMDeployer, +} from "../typechain-types"; + async function main() { // Check that there's no previous OZ deployment if (fs.existsSync(pathOZUpgradability)) { @@ -29,7 +44,7 @@ async function main() { } // Check if there's an ongoing deployment - let ongoingDeployment = {}; + let ongoingDeployment = {} as any; if (fs.existsSync(pathOngoingDeploymentJson)) { ongoingDeployment = require(pathOngoingDeploymentJson); } @@ -89,32 +104,32 @@ async function main() { } = deployParameters; // Load provider - let currentProvider = ethers.provider; if (deployParameters.multiplierGas || deployParameters.maxFeePerGas) { if (process.env.HARDHAT_NETWORK !== "hardhat") { currentProvider = ethers.getDefaultProvider( `https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}` - ); + ) as any; if (deployParameters.maxPriorityFeePerGas && deployParameters.maxFeePerGas) { console.log( `Hardcoded gas used: MaxPriority${deployParameters.maxPriorityFeePerGas} gwei, MaxFee${deployParameters.maxFeePerGas} gwei` ); - const FEE_DATA = { - maxFeePerGas: ethers.parseUnits(deployParameters.maxFeePerGas, "gwei"), - maxPriorityFeePerGas: ethers.parseUnits(deployParameters.maxPriorityFeePerGas, "gwei"), - }; + const FEE_DATA = new ethers.FeeData( + null, + ethers.parseUnits(deployParameters.maxFeePerGas, "gwei"), + ethers.parseUnits(deployParameters.maxPriorityFeePerGas, "gwei") + ); + currentProvider.getFeeData = async () => FEE_DATA; } else { console.log("Multiplier gas used: ", deployParameters.multiplierGas); async function overrideFeeData() { const feedata = await ethers.provider.getFeeData(); - return { - maxFeePerGas: feedata.maxFeePerGas.mul(deployParameters.multiplierGas).div(1000), - maxPriorityFeePerGas: feedata.maxPriorityFeePerGas - .mul(deployParameters.multiplierGas) - .div(1000), - }; + return new ethers.FeeData( + null, + ((feedata.maxFeePerGas as bigint) * BigInt(deployParameters.multiplierGas)) / 1000n, + ((feedata.maxPriorityFeePerGas as bigint) * BigInt(deployParameters.multiplierGas)) / 1000n + ); } currentProvider.getFeeData = overrideFeeData; } @@ -125,20 +140,21 @@ async function main() { let deployer; if (deployParameters.deployerPvtKey) { deployer = new ethers.Wallet(deployParameters.deployerPvtKey, currentProvider); - console.log("Using pvtKey deployer with address: ", deployer.address); } else if (process.env.MNEMONIC) { - deployer = ethers.Wallet.fromMnemonic(process.env.MNEMONIC, "m/44'/60'/0'/0/0").connect(currentProvider); - console.log("Using MNEMONIC deployer with address: ", deployer.address); + deployer = ethers.HDNodeWallet.fromMnemonic( + ethers.Mnemonic.fromPhrase(process.env.MNEMONIC), + "m/44'/60'/0'/0/0" + ).connect(currentProvider); } else { [deployer] = await ethers.getSigners(); } // Load zkEVM deployer const PolgonZKEVMDeployerFactory = await ethers.getContractFactory("PolygonZkEVMDeployer", deployer); - const zkEVMDeployerContract = PolgonZKEVMDeployerFactory.attach(zkEVMDeployerAddress); + const zkEVMDeployerContract = PolgonZKEVMDeployerFactory.attach(zkEVMDeployerAddress) as PolygonZkEVMDeployer; // check deployer is the owner of the deployer - if ((await deployer.provider.getCode(zkEVMDeployerContract.address)) === "0x") { + if ((await deployer.provider?.getCode(zkEVMDeployerContract.target)) === "0x") { throw new Error("zkEVM deployer contract is not deployed"); } expect(deployer.address).to.be.equal(await zkEVMDeployerContract.owner()); @@ -148,17 +164,17 @@ async function main() { if (realVerifier === true) { const VerifierRollup = await ethers.getContractFactory("FflonkVerifier", deployer); verifierContract = await VerifierRollup.deploy(); - await verifierContract.deployed(); + await verifierContract.waitForDeployment(); } else { const VerifierRollupHelperFactory = await ethers.getContractFactory("VerifierRollupHelperMock", deployer); verifierContract = await VerifierRollupHelperFactory.deploy(); - await verifierContract.deployed(); + await verifierContract.waitForDeployment(); } console.log("#######################\n"); - console.log("Verifier deployed to:", verifierContract.address); + console.log("Verifier deployed to:", verifierContract.target); // save an ongoing deployment - ongoingDeployment.verifierContract = verifierContract.address; + ongoingDeployment.verifierContract = verifierContract.target; fs.writeFileSync(pathOngoingDeploymentJson, JSON.stringify(ongoingDeployment, null, 1)); } else { console.log("Verifier already deployed on: ", ongoingDeployment.verifierContract); From 0ca893b99e8666d0b16ff8ede6e7db549f8dab9b Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 17 Oct 2023 16:43:39 +0200 Subject: [PATCH 072/230] changes --- contracts/deployment/PolygonZkEVMDeployer.sol | 2 +- contracts/v2/PolygonRollupManager.sol | 2 + deployment/3_deployContracts copy.ts | 578 ++++++++++++++++++ deployment/3_deployContracts.ts | 396 ++++++------ ...ts => PolygonRollupManagerUpgrade.test.ts} | 0 5 files changed, 757 insertions(+), 221 deletions(-) create mode 100644 deployment/3_deployContracts copy.ts rename test/contractsv2/{PolygonRollupManagerUpgrade.ts => PolygonRollupManagerUpgrade.test.ts} (100%) diff --git a/contracts/deployment/PolygonZkEVMDeployer.sol b/contracts/deployment/PolygonZkEVMDeployer.sol index 751abdde3..556fa1696 100644 --- a/contracts/deployment/PolygonZkEVMDeployer.sol +++ b/contracts/deployment/PolygonZkEVMDeployer.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.17; +pragma solidity 0.8.20; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/Create2.sol"; diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index 59aae13ae..67224b47c 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -31,6 +31,7 @@ contract PolygonRollupManager is * @param verifier verifier * @param forkID fork ID * @param rollupCompatibilityID Rollup compatibility ID, to check upgradability between rollup types + * @param obsolete Indicates if the rollup type is obsolete * @param genesis Genesis block of the rollup, note that will only be used on creating new rollups, not upgrade them */ struct RollupType { @@ -55,6 +56,7 @@ contract PolygonRollupManager is * @param pendingStateTransitions Pending state mapping * @param lastLocalExitRoot Last exit root verified, used for compute the rollupExitRoot * @param lastBatchSequenced Last batch sent by the consensus contract + * @param lastVerifiedBatch Last batch verified * @param lastPendingState Last pending state * @param lastPendingStateConsolidated Last pending state consolidated * @param lastVerifiedBatchBeforeUpgrade Last batch verified before the last upgrade diff --git a/deployment/3_deployContracts copy.ts b/deployment/3_deployContracts copy.ts new file mode 100644 index 000000000..dd9ea7d39 --- /dev/null +++ b/deployment/3_deployContracts copy.ts @@ -0,0 +1,578 @@ +/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if */ +/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */ +import {expect} from "chai"; +import path = require("path"); +import fs = require("fs"); + +import * as dotenv from "dotenv"; +dotenv.config({path: path.resolve(__dirname, "../.env")}); +import {ethers, upgrades} from "hardhat"; +import {HardhatEthersSigner} from "@nomicfoundation/hardhat-ethers/signers"; + +const {create2Deployment} = require("./helpers/deployment-helpers"); + +const pathOutputJson = path.join(__dirname, "./deploy_output.json"); +const pathOngoingDeploymentJson = path.join(__dirname, "./deploy_ongoing.json"); + +const deployParameters = require("./deploy_parameters.json"); +const genesis = require("./genesis.json"); + +const pathOZUpgradability = path.join(__dirname, `../.openzeppelin/${process.env.HARDHAT_NETWORK}.json`); + +import { + VerifierRollupHelperMock, + ERC20PermitMock, + PolygonRollupManagerMock, + PolygonZkEVMGlobalExitRoot, + PolygonZkEVMBridgeV2, + PolygonZkEVMV2, + PolygonRollupBase, + TokenWrapped, + Address, + PolygonZkEVM, + PolygonZkEVMV2Existent, + PolygonZkEVMDeployer, + PolygonZkEVMGlobalExitRootV2, +} from "../typechain-types"; + +async function main() { + // Check that there's no previous OZ deployment + if (fs.existsSync(pathOZUpgradability)) { + throw new Error( + `There's upgradability information from previous deployments, it's mandatory to erase them before start a new one, path: ${pathOZUpgradability}` + ); + } + + // Check if there's an ongoing deployment + let ongoingDeployment = {} as any; + if (fs.existsSync(pathOngoingDeploymentJson)) { + console.log("WARNING: using ongoing deployment"); + ongoingDeployment = require(pathOngoingDeploymentJson); + } + + // Constant variables + const networkIDMainnet = 0; + + // Gas token variables are 0 in mainnet, since native token it's ether + const gasTokenAddressMainnet = ethers.ZeroAddress; + const gasTokenNetworkMainnet = 0n; + const attemptsDeployProxy = 20; + + /* + * Check deploy parameters + * Check that every necessary parameter is fullfilled + */ + const mandatoryDeploymentParameters = [ + "realVerifier", + "trustedSequencerURL", + "networkName", + "version", + "trustedSequencer", + "chainID", + "admin", + "trustedAggregator", + "trustedAggregatorTimeout", + "pendingStateTimeout", + "forkID", + "zkEVMOwner", + "timelockAddress", + "minDelayTimelock", + "salt", + "zkEVMDeployerAddress", + "polTokenAddress", + ]; + + for (const parameterName of mandatoryDeploymentParameters) { + if (deployParameters[parameterName] === undefined || deployParameters[parameterName] === "") { + throw new Error(`Missing parameter: ${parameterName}`); + } + } + + const { + realVerifier, + trustedSequencerURL, + networkName, + version, + trustedSequencer, + chainID, + admin, + trustedAggregator, + trustedAggregatorTimeout, + pendingStateTimeout, + forkID, + zkEVMOwner, + timelockAddress, + minDelayTimelock, + salt, + zkEVMDeployerAddress, + polTokenAddress, + } = deployParameters; + + // Load provider + let currentProvider = ethers.provider; + if (deployParameters.multiplierGas || deployParameters.maxFeePerGas) { + if (process.env.HARDHAT_NETWORK !== "hardhat") { + currentProvider = ethers.getDefaultProvider( + `https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}` + ) as any; + if (deployParameters.maxPriorityFeePerGas && deployParameters.maxFeePerGas) { + console.log( + `Hardcoded gas used: MaxPriority${deployParameters.maxPriorityFeePerGas} gwei, MaxFee${deployParameters.maxFeePerGas} gwei` + ); + const FEE_DATA = new ethers.FeeData( + null, + ethers.parseUnits(deployParameters.maxFeePerGas, "gwei"), + ethers.parseUnits(deployParameters.maxPriorityFeePerGas, "gwei") + ); + + currentProvider.getFeeData = async () => FEE_DATA; + } else { + console.log("Multiplier gas used: ", deployParameters.multiplierGas); + async function overrideFeeData() { + const feedata = await ethers.provider.getFeeData(); + return new ethers.FeeData( + null, + ((feedata.maxFeePerGas as bigint) * BigInt(deployParameters.multiplierGas)) / 1000n, + ((feedata.maxPriorityFeePerGas as bigint) * BigInt(deployParameters.multiplierGas)) / 1000n + ); + } + currentProvider.getFeeData = overrideFeeData; + } + } + } + + // Load deployer + let deployer; + if (deployParameters.deployerPvtKey) { + deployer = new ethers.Wallet(deployParameters.deployerPvtKey, currentProvider); + } else if (process.env.MNEMONIC) { + deployer = ethers.HDNodeWallet.fromMnemonic( + ethers.Mnemonic.fromPhrase(process.env.MNEMONIC), + "m/44'/60'/0'/0/0" + ).connect(currentProvider); + } else { + [deployer] = await ethers.getSigners(); + } + + // Load zkEVM deployer + const PolgonZKEVMDeployerFactory = await ethers.getContractFactory("PolygonZkEVMDeployer", deployer); + const zkEVMDeployerContract = PolgonZKEVMDeployerFactory.attach(zkEVMDeployerAddress) as PolygonZkEVMDeployer; + + // check deployer is the owner of the deployer + if ((await deployer.provider?.getCode(zkEVMDeployerContract.target)) === "0x") { + throw new Error("zkEVM deployer contract is not deployed"); + } + expect(deployer.address).to.be.equal(await zkEVMDeployerContract.owner()); + + let verifierContract; + if (!ongoingDeployment.verifierContract) { + if (realVerifier === true) { + const VerifierRollup = await ethers.getContractFactory("FflonkVerifier", deployer); + verifierContract = await VerifierRollup.deploy(); + await verifierContract.waitForDeployment(); + } else { + const VerifierRollupHelperFactory = await ethers.getContractFactory("VerifierRollupHelperMock", deployer); + verifierContract = await VerifierRollupHelperFactory.deploy(); + await verifierContract.waitForDeployment(); + } + console.log("#######################\n"); + console.log("Verifier deployed to:", verifierContract.target); + + // save an ongoing deployment + ongoingDeployment.verifierContract = verifierContract.target; + fs.writeFileSync(pathOngoingDeploymentJson, JSON.stringify(ongoingDeployment, null, 1)); + } else { + console.log("Verifier already deployed on: ", ongoingDeployment.verifierContract); + const VerifierRollupFactory = await ethers.getContractFactory("FflonkVerifier", deployer); + verifierContract = VerifierRollupFactory.attach(ongoingDeployment.verifierContract); + } + + /* + * Deploy Bridge + * Deploy admin --> implementation --> proxy + */ + + // Deploy proxy admin: + const proxyAdminFactory = await ethers.getContractFactory("ProxyAdmin", deployer); + const deployTransactionAdmin = (await proxyAdminFactory.getDeployTransaction()).data; + const dataCallAdmin = proxyAdminFactory.interface.encodeFunctionData("transferOwnership", [deployer.address]); + const [proxyAdminAddress, isProxyAdminDeployed] = await create2Deployment( + zkEVMDeployerContract, + salt, + deployTransactionAdmin, + dataCallAdmin, + deployer + ); + + if (isProxyAdminDeployed) { + console.log("#######################\n"); + console.log("Proxy admin deployed to:", proxyAdminAddress); + } else { + console.log("#######################\n"); + console.log("Proxy admin was already deployed to:", proxyAdminAddress); + } + + // Deploy implementation PolygonZkEVMBridge + const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2", deployer); + const deployTransactionBridge = (await polygonZkEVMBridgeFactory.getDeployTransaction()).data; + const dataCallNull = null; + // Mandatory to override the gasLimit since the estimation with create are mess up D: + const overrideGasLimit = 5500000n; + const [bridgeImplementationAddress, isBridgeImplDeployed] = await create2Deployment( + zkEVMDeployerContract, + salt, + deployTransactionBridge, + dataCallNull, + deployer, + overrideGasLimit + ); + + if (isBridgeImplDeployed) { + console.log("#######################\n"); + console.log("bridge impl deployed to:", bridgeImplementationAddress); + } else { + console.log("#######################\n"); + console.log("bridge impl was already deployed to:", bridgeImplementationAddress); + } + + /* + * deploy proxy + * Do not initialize directly the proxy since we want to deploy the same code on L2 and this will alter the bytecode deployed of the proxy + */ + const transparentProxyFactory = await ethers.getContractFactory("TransparentUpgradeableProxy", deployer); + const initializeEmptyDataProxy = "0x"; + const deployTransactionProxy = ( + await transparentProxyFactory.getDeployTransaction( + bridgeImplementationAddress, + proxyAdminAddress, + initializeEmptyDataProxy + ) + ).data; + + // Nonce globalExitRoot: currentNonce + 1 (deploy bridge proxy) + 1(impl globalExitRoot) = +2 + const nonceProxyGlobalExitRoot = Number(await ethers.provider.getTransactionCount(deployer.address)) + 2; + // nonceProxyRollupManager :Nonce globalExitRoot + 1 (proxy globalExitRoot) + 1 (impl rollupManager) = +2 + const nonceProxyRollupManager = nonceProxyGlobalExitRoot + 2; + + let precalculateGlobalExitRootAddress; + let precalculateRollupManager; + + // Check if the contract is already deployed + if (ongoingDeployment.polygonZkEVMGlobalExitRoot && ongoingDeployment.polygonZkEVMContract) { + precalculateGlobalExitRootAddress = ongoingDeployment.polygonZkEVMGlobalExitRoot; + precalculateRollupManager = ongoingDeployment.polygonZkEVMContract; + } else { + // If both are not deployed, it's better to deploy them both again + delete ongoingDeployment.polygonZkEVMGlobalExitRoot; + delete ongoingDeployment.polygonZkEVMContract; + fs.writeFileSync(pathOngoingDeploymentJson, JSON.stringify(ongoingDeployment, null, 1)); + + // Contracts are not deployed, normal deployment + precalculateGlobalExitRootAddress = ethers.getCreateAddress({ + from: deployer.address, + nonce: nonceProxyGlobalExitRoot, + }); + precalculateRollupManager = ethers.getCreateAddress({from: deployer.address, nonce: nonceProxyRollupManager}); + } + + const dataCallProxy = polygonZkEVMBridgeFactory.interface.encodeFunctionData("initialize", [ + networkIDMainnet, + gasTokenAddressMainnet, + gasTokenNetworkMainnet, + precalculateGlobalExitRootAddress, + precalculateRollupManager, + ]); + + const [proxyBridgeAddress, isBridgeProxyDeployed] = await create2Deployment( + zkEVMDeployerContract, + salt, + deployTransactionProxy, + dataCallProxy, + deployer + ); + const polygonZkEVMBridgeContract = polygonZkEVMBridgeFactory.attach(proxyBridgeAddress) as PolygonZkEVMBridgeV2; + + if (isBridgeProxyDeployed) { + console.log("#######################\n"); + console.log("PolygonZkEVMBridge deployed to:", polygonZkEVMBridgeContract.target); + } else { + console.log("#######################\n"); + console.log("PolygonZkEVMBridge was already deployed to:", polygonZkEVMBridgeContract.target); + + // If it was already deployed, check that the initialized calldata matches the actual deployment + expect(precalculateGlobalExitRootAddress).to.be.equal(await polygonZkEVMBridgeContract.globalExitRootManager()); + expect(precalculateRollupManager).to.be.equal(await polygonZkEVMBridgeContract.polygonRollupManager()); + } + + console.log("\n#######################"); + console.log("##### Checks PolygonZkEVMBridge #####"); + console.log("#######################"); + console.log("PolygonZkEVMGlobalExitRootAddress:", await polygonZkEVMBridgeContract.globalExitRootManager()); + console.log("networkID:", await polygonZkEVMBridgeContract.networkID()); + console.log("zkEVMaddress:", await polygonZkEVMBridgeContract.polygonRollupManager()); + + // Import OZ manifest the deployed contracts, its enough to import just the proxy, the rest are imported automatically (admin/impl) + await upgrades.forceImport(proxyBridgeAddress, polygonZkEVMBridgeFactory, "transparent" as any); + + /* + *Deployment Global exit root manager + */ + let polygonZkEVMGlobalExitRoot; + // TODO review should use V2?¿ + const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRootV2", deployer); + if (!ongoingDeployment.polygonZkEVMGlobalExitRoot) { + for (let i = 0; i < attemptsDeployProxy; i++) { + try { + polygonZkEVMGlobalExitRoot = await upgrades.deployProxy(PolygonZkEVMGlobalExitRootFactory, [], { + initializer: false, + constructorArgs: [precalculateRollupManager, proxyBridgeAddress], + unsafeAllow: ["constructor", "state-variable-immutable"], + }); + break; + } catch (error: any) { + console.log(`attempt ${i}`); + console.log("upgrades.deployProxy of polygonZkEVMGlobalExitRoot ", error.message); + } + + // reach limits of attempts + if (i + 1 === attemptsDeployProxy) { + throw new Error("polygonZkEVMGlobalExitRoot contract has not been deployed"); + } + } + + expect(precalculateGlobalExitRootAddress).to.be.equal(polygonZkEVMGlobalExitRoot?.target); + + console.log("#######################\n"); + console.log("polygonZkEVMGlobalExitRoot deployed to:", polygonZkEVMGlobalExitRoot?.target); + + // save an ongoing deployment + ongoingDeployment.polygonZkEVMGlobalExitRoot = polygonZkEVMGlobalExitRoot?.target; + fs.writeFileSync(pathOngoingDeploymentJson, JSON.stringify(ongoingDeployment, null, 1)); + } else { + // sanity check + expect(precalculateGlobalExitRootAddress).to.be.equal(ongoingDeployment.polygonZkEVMGlobalExitRoot); + + // Expect the precalculate address matches de onogin deployment + polygonZkEVMGlobalExitRoot = PolygonZkEVMGlobalExitRootFactory.attach( + ongoingDeployment.polygonZkEVMGlobalExitRoot + ) as PolygonZkEVMGlobalExitRootV2; + + console.log("#######################\n"); + console.log("polygonZkEVMGlobalExitRoot already deployed on: ", ongoingDeployment.polygonZkEVMGlobalExitRoot); + + // Import OZ manifest the deployed contracts, its enough to import just the proyx, the rest are imported automatically (admin/impl) + await upgrades.forceImport( + ongoingDeployment.polygonZkEVMGlobalExitRoot, + PolygonZkEVMGlobalExitRootFactory, + "transparent" as any + ); + + // Check against current deployment + expect(polygonZkEVMBridgeContract.target).to.be.equal(await polygonZkEVMGlobalExitRoot.bridgeAddress()); + expect(precalculateRollupManager).to.be.equal(await polygonZkEVMGlobalExitRoot.rollupManager()); + } + + // deploy PolygonZkEVMM + const genesisRootHex = genesis.root; + + console.log("\n#######################"); + console.log("##### Deployment Polygon ZK-EVM #####"); + console.log("#######################"); + console.log("deployer:", deployer.address); + console.log("PolygonZkEVMGlobalExitRootAddress:", polygonZkEVMGlobalExitRoot?.target); + console.log("polTokenAddress:", polTokenAddress); + console.log("polygonZkEVMBridgeContract:", polygonZkEVMBridgeContract.target); + + console.log("trustedAggregator:", trustedAggregator); + console.log("pendingStateTimeout:", pendingStateTimeout); + console.log("trustedAggregatorTimeout:", trustedAggregatorTimeout); + console.log("admin:", admin); + + console.log("chainID:", chainID); + console.log("trustedSequencer:", trustedSequencer); + + console.log("genesisRoot:", genesisRootHex); + console.log("verifierAddress:", verifierContract.target); + console.log("trustedSequencerURL:", trustedSequencerURL); + console.log("networkName:", networkName); + console.log("forkID:", forkID); + + const PolygonZkEVMFactory = await ethers.getContractFactory("PolygonRollupManagerMock", deployer); + + let polygonZkEVMContract; + let deploymentBlockNumber; + if (!ongoingDeployment.polygonZkEVMContract) { + for (let i = 0; i < attemptsDeployProxy; i++) { + try { + polygonZkEVMContract = await upgrades.deployProxy( + PolygonZkEVMFactory, + [ + trustedAggregator, + pendingStateTimeout, + trustedAggregatorTimeout, + admin, + timelock.address, + emergencyCouncil.address, + ], + { + constructorArgs: [ + polygonZkEVMGlobalExitRoot?.target, + polTokenAddress, + polygonZkEVMBridgeContract.target, + ], + unsafeAllow: ["constructor", "state-variable-immutable"], + } + ); + + break; + } catch (error) { + console.log(`attempt ${i}`); + console.log("upgrades.deployProxy of polygonZkEVMContract ", error.message); + } + + // reach limits of attempts + if (i + 1 === attemptsDeployProxy) { + throw new Error("PolygonZkEVM contract has not been deployed"); + } + } + + expect(precalculateRollupManager).to.be.equal(polygonZkEVMContract.address); + + console.log("#######################\n"); + console.log("polygonZkEVMContract deployed to:", polygonZkEVMContract.address); + + // save an ongoing deployment + ongoingDeployment.polygonZkEVMContract = polygonZkEVMContract.address; + fs.writeFileSync(pathOngoingDeploymentJson, JSON.stringify(ongoingDeployment, null, 1)); + + // Transfer ownership of polygonZkEVMContract + if (zkEVMOwner !== deployer.address) { + await (await polygonZkEVMContract.transferOwnership(zkEVMOwner)).wait(); + } + + deploymentBlockNumber = (await polygonZkEVMContract.deployTransaction.wait()).blockNumber; + } else { + // Expect the precalculate address matches de onogin deployment, sanity check + expect(precalculateRollupManager).to.be.equal(ongoingDeployment.polygonZkEVMContract); + polygonZkEVMContract = PolygonZkEVMFactory.attach(ongoingDeployment.polygonZkEVMContract); + + console.log("#######################\n"); + console.log("polygonZkEVMContract already deployed on: ", ongoingDeployment.polygonZkEVMContract); + + // Import OZ manifest the deployed contracts, its enough to import just the proyx, the rest are imported automatically ( admin/impl) + await upgrades.forceImport(ongoingDeployment.polygonZkEVMContract, PolygonZkEVMFactory, "transparent"); + + const zkEVMOwnerContract = await polygonZkEVMContract.owner(); + if (zkEVMOwnerContract === deployer.address) { + // Transfer ownership of polygonZkEVMContract + if (zkEVMOwner !== deployer.address) { + await (await polygonZkEVMContract.transferOwnership(zkEVMOwner)).wait(); + } + } else { + expect(zkEVMOwner).to.be.equal(zkEVMOwnerContract); + } + deploymentBlockNumber = 0; + } + + console.log("\n#######################"); + console.log("##### Checks PolygonZkEVM #####"); + console.log("#######################"); + console.log("PolygonZkEVMGlobalExitRootAddress:", await polygonZkEVMContract.globalExitRootManager()); + console.log("polTokenAddress:", await polygonZkEVMContract.matic()); + console.log("verifierAddress:", await polygonZkEVMContract.rollupVerifier()); + console.log("polygonZkEVMBridgeContract:", await polygonZkEVMContract.bridgeAddress()); + + console.log("admin:", await polygonZkEVMContract.admin()); + console.log("chainID:", await polygonZkEVMContract.chainID()); + console.log("trustedSequencer:", await polygonZkEVMContract.trustedSequencer()); + console.log("pendingStateTimeout:", await polygonZkEVMContract.pendingStateTimeout()); + console.log("trustedAggregator:", await polygonZkEVMContract.trustedAggregator()); + console.log("trustedAggregatorTimeout:", await polygonZkEVMContract.trustedAggregatorTimeout()); + + console.log("genesiRoot:", await polygonZkEVMContract.batchNumToStateRoot(0)); + console.log("trustedSequencerURL:", await polygonZkEVMContract.trustedSequencerURL()); + console.log("networkName:", await polygonZkEVMContract.networkName()); + console.log("owner:", await polygonZkEVMContract.owner()); + console.log("forkID:", await polygonZkEVMContract.forkID()); + + // Assert admin address + expect(await upgrades.erc1967.getAdminAddress(precalculateRollupManager)).to.be.equal(proxyAdminAddress); + expect(await upgrades.erc1967.getAdminAddress(precalculateGlobalExitRootAddress)).to.be.equal(proxyAdminAddress); + expect(await upgrades.erc1967.getAdminAddress(proxyBridgeAddress)).to.be.equal(proxyAdminAddress); + + const proxyAdminInstance = proxyAdminFactory.attach(proxyAdminAddress); + const proxyAdminOwner = await proxyAdminInstance.owner(); + const timelockContractFactory = await ethers.getContractFactory("PolygonZkEVMTimelock", deployer); + + // TODO test stop here + + let timelockContract; + if (proxyAdminOwner !== deployer.address) { + // Check if there's a timelock deployed there that match the current deployment + timelockContract = timelockContractFactory.attach(proxyAdminOwner); + expect(precalculateRollupManager).to.be.equal(await timelockContract.polygonZkEVM()); + + console.log("#######################\n"); + console.log("Polygon timelockContract already deployed to:", timelockContract.address); + } else { + // deploy timelock + console.log("\n#######################"); + console.log("##### Deployment TimelockContract #####"); + console.log("#######################"); + console.log("minDelayTimelock:", minDelayTimelock); + console.log("timelockAddress:", timelockAddress); + console.log("zkEVMAddress:", polygonZkEVMContract.address); + timelockContract = await timelockContractFactory.deploy( + minDelayTimelock, + [timelockAddress], + [timelockAddress], + timelockAddress, + polygonZkEVMContract.address + ); + await timelockContract.deployed(); + console.log("#######################\n"); + console.log("Polygon timelockContract deployed to:", timelockContract.address); + + // Transfer ownership of the proxyAdmin to timelock + const proxyAdminContract = proxyAdminFactory.attach(proxyAdminAddress); + await (await proxyAdminContract.transferOwnership(timelockContract.address)).wait(); + } + + console.log("\n#######################"); + console.log("##### Checks TimelockContract #####"); + console.log("#######################"); + console.log("minDelayTimelock:", await timelockContract.getMinDelay()); + console.log("polygonZkEVM:", await timelockContract.polygonZkEVM()); + + const outputJson = { + polygonZkEVMAddress: polygonZkEVMContract.address, + polygonZkEVMBridgeAddress: polygonZkEVMBridgeContract.address, + polygonZkEVMGlobalExitRootAddress: polygonZkEVMGlobalExitRoot.address, + polTokenAddress, + verifierAddress: verifierContract.address, + zkEVMDeployerContract: zkEVMDeployerContract.address, + deployerAddress: deployer.address, + timelockContractAddress: timelockContract.address, + deploymentBlockNumber, + genesisRoot: genesisRootHex, + trustedSequencer, + trustedSequencerURL, + chainID, + networkName, + admin, + trustedAggregator, + proxyAdminAddress, + forkID, + salt, + version, + }; + fs.writeFileSync(pathOutputJson, JSON.stringify(outputJson, null, 1)); + + // Remove ongoing deployment + fs.unlinkSync(pathOngoingDeploymentJson); +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/deployment/3_deployContracts.ts b/deployment/3_deployContracts.ts index f1a061a05..2a4283e08 100644 --- a/deployment/3_deployContracts.ts +++ b/deployment/3_deployContracts.ts @@ -15,8 +15,6 @@ const pathOutputJson = path.join(__dirname, "./deploy_output.json"); const pathOngoingDeploymentJson = path.join(__dirname, "./deploy_ongoing.json"); const deployParameters = require("./deploy_parameters.json"); -const genesis = require("./genesis.json"); -const {ProviderWrapper} = require("hardhat/plugins"); const pathOZUpgradability = path.join(__dirname, `../.openzeppelin/${process.env.HARDHAT_NETWORK}.json`); @@ -33,7 +31,11 @@ import { PolygonZkEVM, PolygonZkEVMV2Existent, PolygonZkEVMDeployer, + PolygonZkEVMGlobalExitRootV2, + PolygonZkEVMTimelock, } from "../typechain-types"; +import {ProxyAdmin} from "../typechain-types/@openzeppelin/contracts5/proxy/transparent"; +import {Contract} from "hardhat/internal/hardhat-network/stack-traces/model"; async function main() { // Check that there's no previous OZ deployment @@ -46,11 +48,16 @@ async function main() { // Check if there's an ongoing deployment let ongoingDeployment = {} as any; if (fs.existsSync(pathOngoingDeploymentJson)) { + console.log("WARNING: using ongoing deployment"); ongoingDeployment = require(pathOngoingDeploymentJson); } // Constant variables const networkIDMainnet = 0; + + // Gas token variables are 0 in mainnet, since native token it's ether + const gasTokenAddressMainnet = ethers.ZeroAddress; + const gasTokenNetworkMainnet = 0n; const attemptsDeployProxy = 20; /* @@ -58,23 +65,16 @@ async function main() { * Check that every necessary parameter is fullfilled */ const mandatoryDeploymentParameters = [ - "realVerifier", - "trustedSequencerURL", - "networkName", - "version", - "trustedSequencer", - "chainID", "admin", "trustedAggregator", "trustedAggregatorTimeout", "pendingStateTimeout", - "forkID", - "zkEVMOwner", - "timelockAddress", + "emergencyCouncilAddress", + "timelockAdminAddress", "minDelayTimelock", "salt", "zkEVMDeployerAddress", - "maticTokenAddress", + "polTokenAddress", ]; for (const parameterName of mandatoryDeploymentParameters) { @@ -84,23 +84,16 @@ async function main() { } const { - realVerifier, - trustedSequencerURL, - networkName, - version, - trustedSequencer, - chainID, admin, trustedAggregator, trustedAggregatorTimeout, pendingStateTimeout, - forkID, - zkEVMOwner, - timelockAddress, + emergencyCouncilAddress, + timelockAdminAddress, minDelayTimelock, salt, zkEVMDeployerAddress, - maticTokenAddress, + polTokenAddress, } = deployParameters; // Load provider @@ -159,29 +152,6 @@ async function main() { } expect(deployer.address).to.be.equal(await zkEVMDeployerContract.owner()); - let verifierContract; - if (!ongoingDeployment.verifierContract) { - if (realVerifier === true) { - const VerifierRollup = await ethers.getContractFactory("FflonkVerifier", deployer); - verifierContract = await VerifierRollup.deploy(); - await verifierContract.waitForDeployment(); - } else { - const VerifierRollupHelperFactory = await ethers.getContractFactory("VerifierRollupHelperMock", deployer); - verifierContract = await VerifierRollupHelperFactory.deploy(); - await verifierContract.waitForDeployment(); - } - console.log("#######################\n"); - console.log("Verifier deployed to:", verifierContract.target); - - // save an ongoing deployment - ongoingDeployment.verifierContract = verifierContract.target; - fs.writeFileSync(pathOngoingDeploymentJson, JSON.stringify(ongoingDeployment, null, 1)); - } else { - console.log("Verifier already deployed on: ", ongoingDeployment.verifierContract); - const VerifierRollupFactory = await ethers.getContractFactory("FflonkVerifier", deployer); - verifierContract = VerifierRollupFactory.attach(ongoingDeployment.verifierContract); - } - /* * Deploy Bridge * Deploy admin --> implementation --> proxy @@ -189,7 +159,7 @@ async function main() { // Deploy proxy admin: const proxyAdminFactory = await ethers.getContractFactory("ProxyAdmin", deployer); - const deployTransactionAdmin = proxyAdminFactory.getDeployTransaction().data; + const deployTransactionAdmin = (await proxyAdminFactory.getDeployTransaction()).data; const dataCallAdmin = proxyAdminFactory.interface.encodeFunctionData("transferOwnership", [deployer.address]); const [proxyAdminAddress, isProxyAdminDeployed] = await create2Deployment( zkEVMDeployerContract, @@ -207,12 +177,20 @@ async function main() { console.log("Proxy admin was already deployed to:", proxyAdminAddress); } + const proxyAdminInstance = proxyAdminFactory.attach(proxyAdminAddress) as ProxyAdmin; + const proxyAdminOwner = await proxyAdminInstance.owner(); + if (proxyAdminOwner !== deployer.address) { + throw new Error( + `Proxy admin was deployed, but the owner is not the deployer, deployer address: ${deployer.address}, proxyAdmin: ${proxyAdminOwner}` + ); + } + // Deploy implementation PolygonZkEVMBridge - const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridge", deployer); - const deployTransactionBridge = polygonZkEVMBridgeFactory.getDeployTransaction().data; + const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2", deployer); + const deployTransactionBridge = (await polygonZkEVMBridgeFactory.getDeployTransaction()).data; const dataCallNull = null; // Mandatory to override the gasLimit since the estimation with create are mess up D: - const overrideGasLimit = ethers.BigNumber.from(5500000); + const overrideGasLimit = 5500000n; const [bridgeImplementationAddress, isBridgeImplDeployed] = await create2Deployment( zkEVMDeployerContract, salt, @@ -230,49 +208,89 @@ async function main() { console.log("bridge impl was already deployed to:", bridgeImplementationAddress); } - /* - * deploy proxy - * Do not initialize directly the proxy since we want to deploy the same code on L2 and this will alter the bytecode deployed of the proxy - */ - const transparentProxyFactory = await ethers.getContractFactory("TransparentUpgradeableProxy", deployer); - const initializeEmptyDataProxy = "0x"; - const deployTransactionProxy = transparentProxyFactory.getDeployTransaction( - bridgeImplementationAddress, - proxyAdminAddress, - initializeEmptyDataProxy - ).data; - - // Nonce globalExitRoot: currentNonce + 1 (deploy bridge proxy) + 1(impl globalExitRoot) = +2 - const nonceProxyGlobalExitRoot = Number(await ethers.provider.getTransactionCount(deployer.address)) + 2; - // nonceProxyZkevm :Nonce globalExitRoot + 1 (proxy globalExitRoot) + 1 (impl Zkevm) = +2 - const nonceProxyZkevm = nonceProxyGlobalExitRoot + 2; + let precalculateGlobalExitRootAddress; + let precalculateRollupManager; + let timelockContract; - let precalculateGLobalExitRootAddress; - let precalculateZkevmAddress; + const timelockContractFactory = await ethers.getContractFactory("PolygonZkEVMTimelock", deployer); // Check if the contract is already deployed - if (ongoingDeployment.polygonZkEVMGlobalExitRoot && ongoingDeployment.polygonZkEVMContract) { - precalculateGLobalExitRootAddress = ongoingDeployment.polygonZkEVMGlobalExitRoot; - precalculateZkevmAddress = ongoingDeployment.polygonZkEVMContract; + if ( + ongoingDeployment.polygonZkEVMGlobalExitRoot && + ongoingDeployment.polygonRollupManagerContract && + ongoingDeployment.polygonTimelock + ) { + precalculateGlobalExitRootAddress = ongoingDeployment.polygonZkEVMGlobalExitRoot; + precalculateRollupManager = ongoingDeployment.polygonRollupManagerContract; + timelockContract = timelockContractFactory.attach(ongoingDeployment.polygonTimelock) as PolygonZkEVMTimelock; } else { // If both are not deployed, it's better to deploy them both again delete ongoingDeployment.polygonZkEVMGlobalExitRoot; - delete ongoingDeployment.polygonZkEVMContract; + delete ongoingDeployment.polygonRollupManagerContract; fs.writeFileSync(pathOngoingDeploymentJson, JSON.stringify(ongoingDeployment, null, 1)); + // Nonce globalExitRoot: currentNonce + 1 (deploy bridge proxy) + 1(impl globalExitRoot) + // + 1 (deployTimelock) + 1 (transfer Ownership Admin) = +4 + const nonceProxyGlobalExitRoot = Number(await ethers.provider.getTransactionCount(deployer.address)) + 4; + // nonceProxyRollupManager :Nonce globalExitRoot + 1 (proxy globalExitRoot) + 1 (impl rollupManager) = +2 + const nonceProxyRollupManager = nonceProxyGlobalExitRoot + 2; + // Contracts are not deployed, normal deployment - precalculateGLobalExitRootAddress = ethers.getContractAddress({ + precalculateGlobalExitRootAddress = ethers.getCreateAddress({ from: deployer.address, nonce: nonceProxyGlobalExitRoot, }); - precalculateZkevmAddress = ethers.getContractAddress({from: deployer.address, nonce: nonceProxyZkevm}); + precalculateRollupManager = ethers.getCreateAddress({from: deployer.address, nonce: nonceProxyRollupManager}); + + // deploy timelock + console.log("\n#######################"); + console.log("##### Deployment TimelockContract #####"); + console.log("#######################"); + console.log("minDelayTimelock:", minDelayTimelock); + console.log("timelockAdminAddress:", timelockAdminAddress); + console.log("Rollup Manager:", precalculateRollupManager); + timelockContract = await timelockContractFactory.deploy( + minDelayTimelock, + [timelockAdminAddress], + [timelockAdminAddress], + timelockAdminAddress, + precalculateRollupManager + ); + await timelockContract.waitForDeployment(); + console.log("#######################\n"); + console.log("Polygon timelockContract deployed to:", timelockContract.target); } + // Transfer ownership of the proxyAdmin to timelock + await (await proxyAdminInstance.transferOwnership(timelockContract.target)).wait(); + + console.log("\n#######################"); + console.log("##### Checks TimelockContract #####"); + console.log("#######################"); + console.log("minDelayTimelock:", await timelockContract.getMinDelay()); + console.log("polygonZkEVM:", await timelockContract.polygonZkEVM()); + + /* + * deploy proxy + * Do not initialize directly the proxy since we want to deploy the same code on L2 and this will alter the bytecode deployed of the proxy + */ + const transparentProxyFactory = await ethers.getContractFactory("TransparentUpgradeableProxy", deployer); + const initializeEmptyDataProxy = "0x"; + const deployTransactionProxy = ( + await transparentProxyFactory.getDeployTransaction( + bridgeImplementationAddress, + proxyAdminAddress, + initializeEmptyDataProxy + ) + ).data; const dataCallProxy = polygonZkEVMBridgeFactory.interface.encodeFunctionData("initialize", [ networkIDMainnet, - precalculateGLobalExitRootAddress, - precalculateZkevmAddress, + gasTokenAddressMainnet, + gasTokenNetworkMainnet, + precalculateGlobalExitRootAddress, + precalculateRollupManager, ]); + const [proxyBridgeAddress, isBridgeProxyDeployed] = await create2Deployment( zkEVMDeployerContract, salt, @@ -280,18 +298,18 @@ async function main() { dataCallProxy, deployer ); - const polygonZkEVMBridgeContract = polygonZkEVMBridgeFactory.attach(proxyBridgeAddress); + const polygonZkEVMBridgeContract = polygonZkEVMBridgeFactory.attach(proxyBridgeAddress) as PolygonZkEVMBridgeV2; if (isBridgeProxyDeployed) { console.log("#######################\n"); - console.log("PolygonZkEVMBridge deployed to:", polygonZkEVMBridgeContract.address); + console.log("PolygonZkEVMBridge deployed to:", polygonZkEVMBridgeContract.target); } else { console.log("#######################\n"); - console.log("PolygonZkEVMBridge was already deployed to:", polygonZkEVMBridgeContract.address); + console.log("PolygonZkEVMBridge was already deployed to:", polygonZkEVMBridgeContract.target); // If it was already deployed, check that the initialized calldata matches the actual deployment - expect(precalculateGLobalExitRootAddress).to.be.equal(await polygonZkEVMBridgeContract.globalExitRootManager()); - expect(precalculateZkevmAddress).to.be.equal(await polygonZkEVMBridgeContract.polygonZkEVMaddress()); + expect(precalculateGlobalExitRootAddress).to.be.equal(await polygonZkEVMBridgeContract.globalExitRootManager()); + expect(precalculateRollupManager).to.be.equal(await polygonZkEVMBridgeContract.polygonRollupManager()); } console.log("\n#######################"); @@ -299,26 +317,27 @@ async function main() { console.log("#######################"); console.log("PolygonZkEVMGlobalExitRootAddress:", await polygonZkEVMBridgeContract.globalExitRootManager()); console.log("networkID:", await polygonZkEVMBridgeContract.networkID()); - console.log("zkEVMaddress:", await polygonZkEVMBridgeContract.polygonZkEVMaddress()); + console.log("zkEVMaddress:", await polygonZkEVMBridgeContract.polygonRollupManager()); // Import OZ manifest the deployed contracts, its enough to import just the proxy, the rest are imported automatically (admin/impl) - await upgrades.forceImport(proxyBridgeAddress, polygonZkEVMBridgeFactory, "transparent"); + await upgrades.forceImport(proxyBridgeAddress, polygonZkEVMBridgeFactory, "transparent" as any); /* *Deployment Global exit root manager */ let polygonZkEVMGlobalExitRoot; - const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRoot", deployer); + // TODO review should use V2?¿ + const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRootV2", deployer); if (!ongoingDeployment.polygonZkEVMGlobalExitRoot) { for (let i = 0; i < attemptsDeployProxy; i++) { try { polygonZkEVMGlobalExitRoot = await upgrades.deployProxy(PolygonZkEVMGlobalExitRootFactory, [], { initializer: false, - constructorArgs: [precalculateZkevmAddress, proxyBridgeAddress], + constructorArgs: [precalculateRollupManager, proxyBridgeAddress], unsafeAllow: ["constructor", "state-variable-immutable"], }); break; - } catch (error) { + } catch (error: any) { console.log(`attempt ${i}`); console.log("upgrades.deployProxy of polygonZkEVMGlobalExitRoot ", error.message); } @@ -329,21 +348,22 @@ async function main() { } } - expect(precalculateGLobalExitRootAddress).to.be.equal(polygonZkEVMGlobalExitRoot.address); + expect(precalculateGlobalExitRootAddress).to.be.equal(polygonZkEVMGlobalExitRoot?.target); console.log("#######################\n"); - console.log("polygonZkEVMGlobalExitRoot deployed to:", polygonZkEVMGlobalExitRoot.address); + console.log("polygonZkEVMGlobalExitRoot deployed to:", polygonZkEVMGlobalExitRoot?.target); // save an ongoing deployment - ongoingDeployment.polygonZkEVMGlobalExitRoot = polygonZkEVMGlobalExitRoot.address; + ongoingDeployment.polygonZkEVMGlobalExitRoot = polygonZkEVMGlobalExitRoot?.target; fs.writeFileSync(pathOngoingDeploymentJson, JSON.stringify(ongoingDeployment, null, 1)); } else { // sanity check - expect(precalculateGLobalExitRootAddress).to.be.equal(polygonZkEVMGlobalExitRoot.address); + expect(precalculateGlobalExitRootAddress).to.be.equal(ongoingDeployment.polygonZkEVMGlobalExitRoot); + // Expect the precalculate address matches de onogin deployment polygonZkEVMGlobalExitRoot = PolygonZkEVMGlobalExitRootFactory.attach( ongoingDeployment.polygonZkEVMGlobalExitRoot - ); + ) as PolygonZkEVMGlobalExitRootV2; console.log("#######################\n"); console.log("polygonZkEVMGlobalExitRoot already deployed on: ", ongoingDeployment.polygonZkEVMGlobalExitRoot); @@ -352,76 +372,61 @@ async function main() { await upgrades.forceImport( ongoingDeployment.polygonZkEVMGlobalExitRoot, PolygonZkEVMGlobalExitRootFactory, - "transparent" + "transparent" as any ); // Check against current deployment - expect(polygonZkEVMBridgeContract.address).to.be.equal(await polygonZkEVMBridgeContract.bridgeAddress()); - expect(precalculateZkevmAddress).to.be.equal(await polygonZkEVMBridgeContract.rollupAddress()); + expect(polygonZkEVMBridgeContract.target).to.be.equal(await polygonZkEVMGlobalExitRoot.bridgeAddress()); + expect(precalculateRollupManager).to.be.equal(await polygonZkEVMGlobalExitRoot.rollupManager()); } - // deploy PolygonZkEVMM - const genesisRootHex = genesis.root; - + // deploy Rollup Managdr console.log("\n#######################"); console.log("##### Deployment Polygon ZK-EVM #####"); console.log("#######################"); console.log("deployer:", deployer.address); - console.log("PolygonZkEVMGlobalExitRootAddress:", polygonZkEVMGlobalExitRoot.address); - console.log("maticTokenAddress:", maticTokenAddress); - console.log("verifierAddress:", verifierContract.address); - console.log("polygonZkEVMBridgeContract:", polygonZkEVMBridgeContract.address); + console.log("PolygonZkEVMGlobalExitRootAddress:", polygonZkEVMGlobalExitRoot?.target); + console.log("polTokenAddress:", polTokenAddress); + console.log("polygonZkEVMBridgeContract:", polygonZkEVMBridgeContract.target); - console.log("admin:", admin); - console.log("chainID:", chainID); - console.log("trustedSequencer:", trustedSequencer); - console.log("pendingStateTimeout:", pendingStateTimeout); console.log("trustedAggregator:", trustedAggregator); + console.log("pendingStateTimeout:", pendingStateTimeout); console.log("trustedAggregatorTimeout:", trustedAggregatorTimeout); + console.log("admin:", admin); + console.log("timelockContract:", timelockContract.target); + console.log("emergencyCouncilAddress:", emergencyCouncilAddress); - console.log("genesisRoot:", genesisRootHex); - console.log("trustedSequencerURL:", trustedSequencerURL); - console.log("networkName:", networkName); - console.log("forkID:", forkID); - - const PolygonZkEVMFactory = await ethers.getContractFactory("PolygonZkEVM", deployer); + const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManagerMock", deployer); - let polygonZkEVMContract; + let polygonRollupManagerContract: any; let deploymentBlockNumber; - if (!ongoingDeployment.polygonZkEVMContract) { + if (!ongoingDeployment.polygonRollupManagerContract) { for (let i = 0; i < attemptsDeployProxy; i++) { try { - polygonZkEVMContract = await upgrades.deployProxy( - PolygonZkEVMFactory, + polygonRollupManagerContract = await upgrades.deployProxy( + PolygonRollupManagerFactory, [ - { - admin, - trustedSequencer, - pendingStateTimeout, - trustedAggregator, - trustedAggregatorTimeout, - }, - genesisRootHex, - trustedSequencerURL, - networkName, - version, + trustedAggregator, + pendingStateTimeout, + trustedAggregatorTimeout, + admin, + timelockContract.target, + emergencyCouncilAddress, ], { constructorArgs: [ - polygonZkEVMGlobalExitRoot.address, - maticTokenAddress, - verifierContract.address, - polygonZkEVMBridgeContract.address, - chainID, - forkID, + polygonZkEVMGlobalExitRoot?.target, + polTokenAddress, + polygonZkEVMBridgeContract.target, ], unsafeAllow: ["constructor", "state-variable-immutable"], } ); + break; - } catch (error) { + } catch (error: any) { console.log(`attempt ${i}`); - console.log("upgrades.deployProxy of polygonZkEVMContract ", error.message); + console.log("upgrades.deployProxy of polygonRollupManagerContract ", error.message); } // reach limits of attempts @@ -430,119 +435,70 @@ async function main() { } } - expect(precalculateZkevmAddress).to.be.equal(polygonZkEVMContract.address); + expect(precalculateRollupManager).to.be.equal(polygonRollupManagerContract?.target); console.log("#######################\n"); - console.log("polygonZkEVMContract deployed to:", polygonZkEVMContract.address); + console.log("polygonRollupManagerContract deployed to:", polygonRollupManagerContract?.target); // save an ongoing deployment - ongoingDeployment.polygonZkEVMContract = polygonZkEVMContract.address; + ongoingDeployment.polygonRollupManagerContract = polygonRollupManagerContract?.target; fs.writeFileSync(pathOngoingDeploymentJson, JSON.stringify(ongoingDeployment, null, 1)); - // Transfer ownership of polygonZkEVMContract - if (zkEVMOwner !== deployer.address) { - await (await polygonZkEVMContract.transferOwnership(zkEVMOwner)).wait(); - } - - deploymentBlockNumber = (await polygonZkEVMContract.deployTransaction.wait()).blockNumber; + deploymentBlockNumber = (await polygonRollupManagerContract.deployTransaction.wait()).blockNumber; } else { // Expect the precalculate address matches de onogin deployment, sanity check - expect(precalculateZkevmAddress).to.be.equal(ongoingDeployment.polygonZkEVMContract); - polygonZkEVMContract = PolygonZkEVMFactory.attach(ongoingDeployment.polygonZkEVMContract); + expect(precalculateRollupManager).to.be.equal(ongoingDeployment.polygonRollupManagerContract); + polygonRollupManagerContract = PolygonRollupManagerFactory.attach( + ongoingDeployment.polygonRollupManagerContract + ); console.log("#######################\n"); - console.log("polygonZkEVMContract already deployed on: ", ongoingDeployment.polygonZkEVMContract); + console.log( + "polygonRollupManagerContract already deployed on: ", + ongoingDeployment.polygonRollupManagerContract + ); // Import OZ manifest the deployed contracts, its enough to import just the proyx, the rest are imported automatically ( admin/impl) - await upgrades.forceImport(ongoingDeployment.polygonZkEVMContract, PolygonZkEVMFactory, "transparent"); + await upgrades.forceImport( + ongoingDeployment.polygonRollupManagerContract, + PolygonRollupManagerFactory, + "transparent" as any + ); - const zkEVMOwnerContract = await polygonZkEVMContract.owner(); - if (zkEVMOwnerContract === deployer.address) { - // Transfer ownership of polygonZkEVMContract - if (zkEVMOwner !== deployer.address) { - await (await polygonZkEVMContract.transferOwnership(zkEVMOwner)).wait(); - } - } else { - expect(zkEVMOwner).to.be.equal(zkEVMOwnerContract); - } deploymentBlockNumber = 0; } console.log("\n#######################"); console.log("##### Checks PolygonZkEVM #####"); console.log("#######################"); - console.log("PolygonZkEVMGlobalExitRootAddress:", await polygonZkEVMContract.globalExitRootManager()); - console.log("maticTokenAddress:", await polygonZkEVMContract.matic()); - console.log("verifierAddress:", await polygonZkEVMContract.rollupVerifier()); - console.log("polygonZkEVMBridgeContract:", await polygonZkEVMContract.bridgeAddress()); - - console.log("admin:", await polygonZkEVMContract.admin()); - console.log("chainID:", await polygonZkEVMContract.chainID()); - console.log("trustedSequencer:", await polygonZkEVMContract.trustedSequencer()); - console.log("pendingStateTimeout:", await polygonZkEVMContract.pendingStateTimeout()); - console.log("trustedAggregator:", await polygonZkEVMContract.trustedAggregator()); - console.log("trustedAggregatorTimeout:", await polygonZkEVMContract.trustedAggregatorTimeout()); - - console.log("genesiRoot:", await polygonZkEVMContract.batchNumToStateRoot(0)); - console.log("trustedSequencerURL:", await polygonZkEVMContract.trustedSequencerURL()); - console.log("networkName:", await polygonZkEVMContract.networkName()); - console.log("owner:", await polygonZkEVMContract.owner()); - console.log("forkID:", await polygonZkEVMContract.forkID()); + console.log("PolygonZkEVMGlobalExitRootAddress:", await polygonRollupManagerContract.globalExitRootManager()); + console.log("polTokenAddress:", await polygonRollupManagerContract.matic()); + console.log("verifierAddress:", await polygonRollupManagerContract.rollupVerifier()); + console.log("polygonZkEVMBridgeContract:", await polygonRollupManagerContract.bridgeAddress()); + + console.log("admin:", await polygonRollupManagerContract.admin()); + console.log("chainID:", await polygonRollupManagerContract.chainID()); + console.log("trustedSequencer:", await polygonRollupManagerContract.trustedSequencer()); + console.log("pendingStateTimeout:", await polygonRollupManagerContract.pendingStateTimeout()); + console.log("trustedAggregator:", await polygonRollupManagerContract.trustedAggregator()); + console.log("trustedAggregatorTimeout:", await polygonRollupManagerContract.trustedAggregatorTimeout()); + + console.log("genesiRoot:", await polygonRollupManagerContract.batchNumToStateRoot(0)); + console.log("trustedSequencerURL:", await polygonRollupManagerContract.trustedSequencerURL()); + console.log("networkName:", await polygonRollupManagerContract.networkName()); + console.log("owner:", await polygonRollupManagerContract.owner()); + console.log("forkID:", await polygonRollupManagerContract.forkID()); // Assert admin address - expect(await upgrades.erc1967.getAdminAddress(precalculateZkevmAddress)).to.be.equal(proxyAdminAddress); - expect(await upgrades.erc1967.getAdminAddress(precalculateGLobalExitRootAddress)).to.be.equal(proxyAdminAddress); + expect(await upgrades.erc1967.getAdminAddress(precalculateRollupManager)).to.be.equal(proxyAdminAddress); + expect(await upgrades.erc1967.getAdminAddress(precalculateGlobalExitRootAddress)).to.be.equal(proxyAdminAddress); expect(await upgrades.erc1967.getAdminAddress(proxyBridgeAddress)).to.be.equal(proxyAdminAddress); - const proxyAdminInstance = proxyAdminFactory.attach(proxyAdminAddress); - const proxyAdminOwner = await proxyAdminInstance.owner(); - const timelockContractFactory = await ethers.getContractFactory("PolygonZkEVMTimelock", deployer); - - // TODO test stop here - - let timelockContract; - if (proxyAdminOwner !== deployer.address) { - // Check if there's a timelock deployed there that match the current deployment - timelockContract = timelockContractFactory.attach(proxyAdminOwner); - expect(precalculateZkevmAddress).to.be.equal(await timelockContract.polygonZkEVM()); - - console.log("#######################\n"); - console.log("Polygon timelockContract already deployed to:", timelockContract.address); - } else { - // deploy timelock - console.log("\n#######################"); - console.log("##### Deployment TimelockContract #####"); - console.log("#######################"); - console.log("minDelayTimelock:", minDelayTimelock); - console.log("timelockAddress:", timelockAddress); - console.log("zkEVMAddress:", polygonZkEVMContract.address); - timelockContract = await timelockContractFactory.deploy( - minDelayTimelock, - [timelockAddress], - [timelockAddress], - timelockAddress, - polygonZkEVMContract.address - ); - await timelockContract.deployed(); - console.log("#######################\n"); - console.log("Polygon timelockContract deployed to:", timelockContract.address); - - // Transfer ownership of the proxyAdmin to timelock - const proxyAdminContract = proxyAdminFactory.attach(proxyAdminAddress); - await (await proxyAdminContract.transferOwnership(timelockContract.address)).wait(); - } - - console.log("\n#######################"); - console.log("##### Checks TimelockContract #####"); - console.log("#######################"); - console.log("minDelayTimelock:", await timelockContract.getMinDelay()); - console.log("polygonZkEVM:", await timelockContract.polygonZkEVM()); - const outputJson = { - polygonZkEVMAddress: polygonZkEVMContract.address, + polygonZkEVMAddress: polygonRollupManagerContract.address, polygonZkEVMBridgeAddress: polygonZkEVMBridgeContract.address, polygonZkEVMGlobalExitRootAddress: polygonZkEVMGlobalExitRoot.address, - maticTokenAddress, + polTokenAddress, verifierAddress: verifierContract.address, zkEVMDeployerContract: zkEVMDeployerContract.address, deployerAddress: deployer.address, diff --git a/test/contractsv2/PolygonRollupManagerUpgrade.ts b/test/contractsv2/PolygonRollupManagerUpgrade.test.ts similarity index 100% rename from test/contractsv2/PolygonRollupManagerUpgrade.ts rename to test/contractsv2/PolygonRollupManagerUpgrade.test.ts From 999e986e19ea0a95ec54a5d194f7cdfe30bcb517 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 17 Oct 2023 16:46:54 +0200 Subject: [PATCH 073/230] paris compiled without optimizations --- compiled-contracts/paris/ERC20PermitMock.json | 4 ++-- compiled-contracts/paris/FflonkVerifier.json | 4 ++-- compiled-contracts/paris/PolygonDataComittee.json | 4 ++-- compiled-contracts/paris/PolygonRollupManager.json | 8 ++++---- compiled-contracts/paris/PolygonZkEVM.json | 4 ++-- compiled-contracts/paris/PolygonZkEVMBridge.json | 4 ++-- compiled-contracts/paris/PolygonZkEVMBridgeMock.json | 4 ++-- compiled-contracts/paris/PolygonZkEVMBridgeV2.json | 4 ++-- compiled-contracts/paris/PolygonZkEVMDeployer.json | 4 ++-- compiled-contracts/paris/PolygonZkEVMGlobalExitRoot.json | 4 ++-- .../paris/PolygonZkEVMGlobalExitRootL2.json | 4 ++-- .../paris/PolygonZkEVMGlobalExitRootL2Mock.json | 4 ++-- .../paris/PolygonZkEVMGlobalExitRootMock.json | 4 ++-- .../paris/PolygonZkEVMGlobalExitRootV2.json | 4 ++-- compiled-contracts/paris/PolygonZkEVMMock.json | 4 ++-- compiled-contracts/paris/PolygonZkEVMTimelock.json | 4 ++-- compiled-contracts/paris/PolygonZkEVMV2.json | 4 ++-- compiled-contracts/paris/PolygonZkEVMV2Existent.json | 4 ++-- compiled-contracts/paris/ProxyAdmin.json | 4 ++-- compiled-contracts/paris/TokenWrapped.json | 4 ++-- compiled-contracts/paris/TransparentUpgradeableProxy.json | 4 ++-- compiled-contracts/paris/VerifierRollupHelperMock.json | 4 ++-- 22 files changed, 46 insertions(+), 46 deletions(-) diff --git a/compiled-contracts/paris/ERC20PermitMock.json b/compiled-contracts/paris/ERC20PermitMock.json index 98f93ab81..93b5eddf6 100644 --- a/compiled-contracts/paris/ERC20PermitMock.json +++ b/compiled-contracts/paris/ERC20PermitMock.json @@ -517,8 +517,8 @@ "type": "function" } ], - "bytecode": "0x6080604052604051620018e6380380620018e6833981016040819052620000269162000201565b8383600362000036838262000322565b50600462000045828262000322565b5050506200005a82826200007160201b60201c565b505081516020909201919091206006555062000416565b6001600160a01b038216620000cc5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060026000828254620000e09190620003ee565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200016457600080fd5b81516001600160401b03808211156200018157620001816200013c565b604051601f8301601f19908116603f01168101908282118183101715620001ac57620001ac6200013c565b81604052838152602092508683858801011115620001c957600080fd5b600091505b83821015620001ed5785820183015181830184015290820190620001ce565b600093810190920192909252949350505050565b600080600080608085870312156200021857600080fd5b84516001600160401b03808211156200023057600080fd5b6200023e8883890162000152565b955060208701519150808211156200025557600080fd5b50620002648782880162000152565b604087015190945090506001600160a01b03811681146200028457600080fd5b6060959095015193969295505050565b600181811c90821680620002a957607f821691505b602082108103620002ca57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200013757600081815260208120601f850160051c81016020861015620002f95750805b601f850160051c820191505b818110156200031a5782815560010162000305565b505050505050565b81516001600160401b038111156200033e576200033e6200013c565b62000356816200034f845462000294565b84620002d0565b602080601f8311600181146200038e5760008415620003755750858301515b600019600386901b1c1916600185901b1785556200031a565b600085815260208120601f198616915b82811015620003bf578886015182559484019460019091019084016200039e565b5085821015620003de5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156200041057634e487b7160e01b600052601160045260246000fd5b92915050565b6114c080620004266000396000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c806340c10f19116100e35780639e4e73181161008c578063c473af3311610066578063c473af33146103d6578063d505accf146103fd578063dd62ed3e1461041057600080fd5b80639e4e731814610389578063a457c2d7146103b0578063a9059cbb146103c357600080fd5b806370a08231116100bd57806370a082311461032b5780637ecebe001461036157806395d89b411461038157600080fd5b806340c10f19146102f257806342966c681461030557806356189cb41461031857600080fd5b806323b872dd116101455780633408e4701161011f5780633408e4701461024c5780633644e5151461025257806339509351146102df57600080fd5b806323b872dd1461020357806330adf81f14610216578063313ce5671461023d57600080fd5b8063095ea7b311610176578063095ea7b3146101c357806318160ddd146101e6578063222f5be0146101ee57600080fd5b806304622c2e1461019257806306fdde03146101ae575b600080fd5b61019b60065481565b6040519081526020015b60405180910390f35b6101b6610456565b6040516101a591906111e1565b6101d66101d1366004611276565b6104e8565b60405190151581526020016101a5565b60025461019b565b6102016101fc3660046112a0565b610502565b005b6101d66102113660046112a0565b610512565b61019b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b604051601281526020016101a5565b4661019b565b61019b6006546000907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f907fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646604080516020810195909552840192909252606083015260808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6101d66102ed366004611276565b610536565b610201610300366004611276565b610582565b6102016103133660046112dc565b610590565b6102016103263660046112a0565b61059d565b61019b6103393660046112f5565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61019b61036f3660046112f5565b60056020526000908152604090205481565b6101b66105a8565b61019b7fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc681565b6101d66103be366004611276565b6105b7565b6101d66103d1366004611276565b61068d565b61019b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b61020161040b366004611317565b61069b565b61019b61041e36600461138a565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b606060038054610465906113bd565b80601f0160208091040260200160405190810160405280929190818152602001828054610491906113bd565b80156104de5780601f106104b3576101008083540402835291602001916104de565b820191906000526020600020905b8154815290600101906020018083116104c157829003601f168201915b5050505050905090565b6000336104f68185856107e2565b60019150505b92915050565b61050d838383610995565b505050565b600033610520858285610c06565b61052b858585610995565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104f6908290869061057d90879061143f565b6107e2565b61058c8282610cd7565b5050565b61059a3382610dca565b50565b61050d8383836107e2565b606060048054610465906113bd565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61052b82868684036107e2565b6000336104f6818585610995565b42841015610705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f48455a3a3a7065726d69743a20415554485f45585049524544000000000000006044820152606401610677565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661075f83611452565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506107cd8882868686610f8e565b6107d88888886107e2565b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610884576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff8216610927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316610a38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff8216610adb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610b91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35b50505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610c005781811015610cca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610677565b610c0084848484036107e2565b73ffffffffffffffffffffffffffffffffffffffff8216610d54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610677565b8060026000828254610d66919061143f565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216610e6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015610f23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b600654604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f602080830191909152818301939093527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528251808303909101815260c08201909252815191909201207f190100000000000000000000000000000000000000000000000000000000000060e083015260e2820181905261010282018690529060009061012201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156110da573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81161580159061115557508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b6107d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f48455a3a3a5f76616c69646174655369676e6564446174613a20494e56414c4960448201527f445f5349474e41545552450000000000000000000000000000000000000000006064820152608401610677565b600060208083528351808285015260005b8181101561120e578581018301518582016040015282016111f2565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461127157600080fd5b919050565b6000806040838503121561128957600080fd5b6112928361124d565b946020939093013593505050565b6000806000606084860312156112b557600080fd5b6112be8461124d565b92506112cc6020850161124d565b9150604084013590509250925092565b6000602082840312156112ee57600080fd5b5035919050565b60006020828403121561130757600080fd5b6113108261124d565b9392505050565b600080600080600080600060e0888a03121561133257600080fd5b61133b8861124d565b96506113496020890161124d565b95506040880135945060608801359350608088013560ff8116811461136d57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561139d57600080fd5b6113a68361124d565b91506113b46020840161124d565b90509250929050565b600181811c908216806113d157607f821691505b60208210810361140a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104fc576104fc611410565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361148357611483611410565b506001019056fea26469706673582212208b36599ef550f0c194373b0c511974c888d8ed7226087368a04dca3579711bcd64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061018d5760003560e01c806340c10f19116100e35780639e4e73181161008c578063c473af3311610066578063c473af33146103d6578063d505accf146103fd578063dd62ed3e1461041057600080fd5b80639e4e731814610389578063a457c2d7146103b0578063a9059cbb146103c357600080fd5b806370a08231116100bd57806370a082311461032b5780637ecebe001461036157806395d89b411461038157600080fd5b806340c10f19146102f257806342966c681461030557806356189cb41461031857600080fd5b806323b872dd116101455780633408e4701161011f5780633408e4701461024c5780633644e5151461025257806339509351146102df57600080fd5b806323b872dd1461020357806330adf81f14610216578063313ce5671461023d57600080fd5b8063095ea7b311610176578063095ea7b3146101c357806318160ddd146101e6578063222f5be0146101ee57600080fd5b806304622c2e1461019257806306fdde03146101ae575b600080fd5b61019b60065481565b6040519081526020015b60405180910390f35b6101b6610456565b6040516101a591906111e1565b6101d66101d1366004611276565b6104e8565b60405190151581526020016101a5565b60025461019b565b6102016101fc3660046112a0565b610502565b005b6101d66102113660046112a0565b610512565b61019b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b604051601281526020016101a5565b4661019b565b61019b6006546000907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f907fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646604080516020810195909552840192909252606083015260808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6101d66102ed366004611276565b610536565b610201610300366004611276565b610582565b6102016103133660046112dc565b610590565b6102016103263660046112a0565b61059d565b61019b6103393660046112f5565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61019b61036f3660046112f5565b60056020526000908152604090205481565b6101b66105a8565b61019b7fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc681565b6101d66103be366004611276565b6105b7565b6101d66103d1366004611276565b61068d565b61019b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b61020161040b366004611317565b61069b565b61019b61041e36600461138a565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b606060038054610465906113bd565b80601f0160208091040260200160405190810160405280929190818152602001828054610491906113bd565b80156104de5780601f106104b3576101008083540402835291602001916104de565b820191906000526020600020905b8154815290600101906020018083116104c157829003601f168201915b5050505050905090565b6000336104f68185856107e2565b60019150505b92915050565b61050d838383610995565b505050565b600033610520858285610c06565b61052b858585610995565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104f6908290869061057d90879061143f565b6107e2565b61058c8282610cd7565b5050565b61059a3382610dca565b50565b61050d8383836107e2565b606060048054610465906113bd565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61052b82868684036107e2565b6000336104f6818585610995565b42841015610705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f48455a3a3a7065726d69743a20415554485f45585049524544000000000000006044820152606401610677565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661075f83611452565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506107cd8882868686610f8e565b6107d88888886107e2565b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610884576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff8216610927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316610a38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff8216610adb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610b91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35b50505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610c005781811015610cca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610677565b610c0084848484036107e2565b73ffffffffffffffffffffffffffffffffffffffff8216610d54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610677565b8060026000828254610d66919061143f565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216610e6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015610f23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b600654604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f602080830191909152818301939093527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528251808303909101815260c08201909252815191909201207f190100000000000000000000000000000000000000000000000000000000000060e083015260e2820181905261010282018690529060009061012201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156110da573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81161580159061115557508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b6107d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f48455a3a3a5f76616c69646174655369676e6564446174613a20494e56414c4960448201527f445f5349474e41545552450000000000000000000000000000000000000000006064820152608401610677565b600060208083528351808285015260005b8181101561120e578581018301518582016040015282016111f2565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461127157600080fd5b919050565b6000806040838503121561128957600080fd5b6112928361124d565b946020939093013593505050565b6000806000606084860312156112b557600080fd5b6112be8461124d565b92506112cc6020850161124d565b9150604084013590509250925092565b6000602082840312156112ee57600080fd5b5035919050565b60006020828403121561130757600080fd5b6113108261124d565b9392505050565b600080600080600080600060e0888a03121561133257600080fd5b61133b8861124d565b96506113496020890161124d565b95506040880135945060608801359350608088013560ff8116811461136d57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561139d57600080fd5b6113a68361124d565b91506113b46020840161124d565b90509250929050565b600181811c908216806113d157607f821691505b60208210810361140a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104fc576104fc611410565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361148357611483611410565b506001019056fea26469706673582212208b36599ef550f0c194373b0c511974c888d8ed7226087368a04dca3579711bcd64736f6c63430008140033", + "bytecode": "0x60806040526040516200137d3803806200137d8339810160408190526200002691620001f8565b8383600362000036838262000310565b50600462000045828262000310565b5050506200005a82826200007160201b60201c565b5050815160209092019190912060065550620003fe565b6001600160a01b038216620000cc5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060025f828254620000df9190620003d8565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126200015e575f80fd5b81516001600160401b03808211156200017b576200017b6200013a565b604051601f8301601f19908116603f01168101908282118183101715620001a657620001a66200013a565b81604052838152602092508683858801011115620001c2575f80fd5b5f91505b83821015620001e55785820183015181830184015290820190620001c6565b5f93810190920192909252949350505050565b5f805f80608085870312156200020c575f80fd5b84516001600160401b038082111562000223575f80fd5b62000231888389016200014e565b9550602087015191508082111562000247575f80fd5b5062000256878288016200014e565b604087015190945090506001600160a01b038116811462000275575f80fd5b6060959095015193969295505050565b600181811c908216806200029a57607f821691505b602082108103620002b957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000135575f81815260208120601f850160051c81016020861015620002e75750805b601f850160051c820191505b818110156200030857828155600101620002f3565b505050505050565b81516001600160401b038111156200032c576200032c6200013a565b62000344816200033d845462000285565b84620002bf565b602080601f8311600181146200037a575f8415620003625750858301515b5f19600386901b1c1916600185901b17855562000308565b5f85815260208120601f198616915b82811015620003aa5788860151825594840194600190910190840162000389565b5085821015620003c857878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115620003f857634e487b7160e01b5f52601160045260245ffd5b92915050565b610f71806200040c5f395ff3fe608060405234801561000f575f80fd5b506004361061011b575f3560e01c806304622c2e1461011f57806306fdde031461013b578063095ea7b31461015057806318160ddd14610173578063222f5be01461017b57806323b872dd1461019057806330adf81f146101a3578063313ce567146101b75780633408e470146101c65780633644e515146101cc57806339509351146101d457806340c10f19146101e757806342966c68146101fa57806356189cb41461020d57806370a08231146102205780637ecebe001461024857806395d89b41146102675780639e4e73181461026f578063a457c2d714610283578063a9059cbb14610296578063c473af33146102a9578063d505accf146102bd578063dd62ed3e146102d0575b5f80fd5b61012860065481565b6040519081526020015b60405180910390f35b6101436102e3565b6040516101329190610c7c565b61016361015e366004610ce2565b610373565b6040519015158152602001610132565b600254610128565b61018e610189366004610d0a565b61038c565b005b61016361019e366004610d0a565b61039c565b6101285f80516020610efc83398151915281565b60405160128152602001610132565b46610128565b6101286103bf565b6101636101e2366004610ce2565b610411565b61018e6101f5366004610ce2565b610432565b61018e610208366004610d43565b610440565b61018e61021b366004610d0a565b61044d565b61012861022e366004610d5a565b6001600160a01b03165f9081526020819052604090205490565b610128610256366004610d5a565b60056020525f908152604090205481565b610143610458565b6101285f80516020610ebc83398151915281565b610163610291366004610ce2565b610467565b6101636102a4366004610ce2565b6104e6565b6101285f80516020610f1c83398151915281565b61018e6102cb366004610d7a565b6104f3565b6101286102de366004610de7565b6105ee565b6060600380546102f290610e18565b80601f016020809104026020016040519081016040528092919081815260200182805461031e90610e18565b80156103695780601f1061034057610100808354040283529160200191610369565b820191905f5260205f20905b81548152906001019060200180831161034c57829003601f168201915b5050505050905090565b5f33610380818585610618565b60019150505b92915050565b61039783838361073b565b505050565b5f336103a98582856108cc565b6103b485858561073b565b506001949350505050565b6006546040515f916103f6915f80516020610f1c83398151915291905f80516020610ebc8339815191529046903090602001610e50565b60405160208183030381529060405280519060200120905090565b5f3361038081858561042383836105ee565b61042d9190610e90565b610618565b61043c828261093e565b5050565b61044a33826109e8565b50565b610397838383610618565b6060600480546102f290610e18565b5f338161047482866105ee565b9050838110156104d95760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b6103b48286868403610618565b5f3361038081858561073b565b4284101561053f5760405162461bcd60e51b81526020600482015260196024820152781211568e8e9c195c9b5a5d0e881055551217d1561412549151603a1b60448201526064016104d0565b6001600160a01b0387165f90815260056020526040812080545f80516020610efc833981519152918a918a918a91908661057883610ea3565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506105d98882868686610b05565b6105e4888888610618565b5050505050505050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661067a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104d0565b6001600160a01b0382166106db5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104d0565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661079f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104d0565b6001600160a01b0382166108015760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104d0565b6001600160a01b0383165f90815260208190526040902054818110156108785760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104d0565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290925f80516020610edc833981519152910160405180910390a35b50505050565b5f6108d784846105ee565b90505f1981146108c657818110156109315760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104d0565b6108c68484848403610618565b6001600160a01b0382166109945760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104d0565b8060025f8282546109a59190610e90565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481525f80516020610edc833981519152910160405180910390a35050565b6001600160a01b038216610a485760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104d0565b6001600160a01b0382165f9081526020819052604090205481811015610abb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104d0565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192915f80516020610edc833981519152910160405180910390a3505050565b6006546040515f91610b3c915f80516020610f1c83398151915291905f80516020610ebc8339815191529046903090602001610e50565b6040516020818303038152906040528051906020012090505f8186604051602001610b7e92919061190160f01b81526002810192909252602282015260420190565b60408051601f1981840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610be6573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811615801590610c1c5750876001600160a01b0316816001600160a01b0316145b6105e45760405162461bcd60e51b815260206004820152602b60248201527f48455a3a3a5f76616c69646174655369676e6564446174613a20494e56414c4960448201526a445f5349474e415455524560a81b60648201526084016104d0565b5f6020808352835180828501525f5b81811015610ca757858101830151858201604001528201610c8b565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610cdd575f80fd5b919050565b5f8060408385031215610cf3575f80fd5b610cfc83610cc7565b946020939093013593505050565b5f805f60608486031215610d1c575f80fd5b610d2584610cc7565b9250610d3360208501610cc7565b9150604084013590509250925092565b5f60208284031215610d53575f80fd5b5035919050565b5f60208284031215610d6a575f80fd5b610d7382610cc7565b9392505050565b5f805f805f805f60e0888a031215610d90575f80fd5b610d9988610cc7565b9650610da760208901610cc7565b95506040880135945060608801359350608088013560ff81168114610dca575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215610df8575f80fd5b610e0183610cc7565b9150610e0f60208401610cc7565b90509250929050565b600181811c90821680610e2c57607f821691505b602082108103610e4a57634e487b7160e01b5f52602260045260245ffd5b50919050565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561038657610386610e7c565b5f60018201610eb457610eb4610e7c565b506001019056fec89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa2646970667358221220e5557a8268dd346c07f8a97c7a37ab3faa7459a4309c313d2cabd53b00face4964736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061011b575f3560e01c806304622c2e1461011f57806306fdde031461013b578063095ea7b31461015057806318160ddd14610173578063222f5be01461017b57806323b872dd1461019057806330adf81f146101a3578063313ce567146101b75780633408e470146101c65780633644e515146101cc57806339509351146101d457806340c10f19146101e757806342966c68146101fa57806356189cb41461020d57806370a08231146102205780637ecebe001461024857806395d89b41146102675780639e4e73181461026f578063a457c2d714610283578063a9059cbb14610296578063c473af33146102a9578063d505accf146102bd578063dd62ed3e146102d0575b5f80fd5b61012860065481565b6040519081526020015b60405180910390f35b6101436102e3565b6040516101329190610c7c565b61016361015e366004610ce2565b610373565b6040519015158152602001610132565b600254610128565b61018e610189366004610d0a565b61038c565b005b61016361019e366004610d0a565b61039c565b6101285f80516020610efc83398151915281565b60405160128152602001610132565b46610128565b6101286103bf565b6101636101e2366004610ce2565b610411565b61018e6101f5366004610ce2565b610432565b61018e610208366004610d43565b610440565b61018e61021b366004610d0a565b61044d565b61012861022e366004610d5a565b6001600160a01b03165f9081526020819052604090205490565b610128610256366004610d5a565b60056020525f908152604090205481565b610143610458565b6101285f80516020610ebc83398151915281565b610163610291366004610ce2565b610467565b6101636102a4366004610ce2565b6104e6565b6101285f80516020610f1c83398151915281565b61018e6102cb366004610d7a565b6104f3565b6101286102de366004610de7565b6105ee565b6060600380546102f290610e18565b80601f016020809104026020016040519081016040528092919081815260200182805461031e90610e18565b80156103695780601f1061034057610100808354040283529160200191610369565b820191905f5260205f20905b81548152906001019060200180831161034c57829003601f168201915b5050505050905090565b5f33610380818585610618565b60019150505b92915050565b61039783838361073b565b505050565b5f336103a98582856108cc565b6103b485858561073b565b506001949350505050565b6006546040515f916103f6915f80516020610f1c83398151915291905f80516020610ebc8339815191529046903090602001610e50565b60405160208183030381529060405280519060200120905090565b5f3361038081858561042383836105ee565b61042d9190610e90565b610618565b61043c828261093e565b5050565b61044a33826109e8565b50565b610397838383610618565b6060600480546102f290610e18565b5f338161047482866105ee565b9050838110156104d95760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b6103b48286868403610618565b5f3361038081858561073b565b4284101561053f5760405162461bcd60e51b81526020600482015260196024820152781211568e8e9c195c9b5a5d0e881055551217d1561412549151603a1b60448201526064016104d0565b6001600160a01b0387165f90815260056020526040812080545f80516020610efc833981519152918a918a918a91908661057883610ea3565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506105d98882868686610b05565b6105e4888888610618565b5050505050505050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661067a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104d0565b6001600160a01b0382166106db5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104d0565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661079f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104d0565b6001600160a01b0382166108015760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104d0565b6001600160a01b0383165f90815260208190526040902054818110156108785760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104d0565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290925f80516020610edc833981519152910160405180910390a35b50505050565b5f6108d784846105ee565b90505f1981146108c657818110156109315760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104d0565b6108c68484848403610618565b6001600160a01b0382166109945760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104d0565b8060025f8282546109a59190610e90565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481525f80516020610edc833981519152910160405180910390a35050565b6001600160a01b038216610a485760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104d0565b6001600160a01b0382165f9081526020819052604090205481811015610abb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104d0565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192915f80516020610edc833981519152910160405180910390a3505050565b6006546040515f91610b3c915f80516020610f1c83398151915291905f80516020610ebc8339815191529046903090602001610e50565b6040516020818303038152906040528051906020012090505f8186604051602001610b7e92919061190160f01b81526002810192909252602282015260420190565b60408051601f1981840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610be6573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811615801590610c1c5750876001600160a01b0316816001600160a01b0316145b6105e45760405162461bcd60e51b815260206004820152602b60248201527f48455a3a3a5f76616c69646174655369676e6564446174613a20494e56414c4960448201526a445f5349474e415455524560a81b60648201526084016104d0565b5f6020808352835180828501525f5b81811015610ca757858101830151858201604001528201610c8b565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610cdd575f80fd5b919050565b5f8060408385031215610cf3575f80fd5b610cfc83610cc7565b946020939093013593505050565b5f805f60608486031215610d1c575f80fd5b610d2584610cc7565b9250610d3360208501610cc7565b9150604084013590509250925092565b5f60208284031215610d53575f80fd5b5035919050565b5f60208284031215610d6a575f80fd5b610d7382610cc7565b9392505050565b5f805f805f805f60e0888a031215610d90575f80fd5b610d9988610cc7565b9650610da760208901610cc7565b95506040880135945060608801359350608088013560ff81168114610dca575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215610df8575f80fd5b610e0183610cc7565b9150610e0f60208401610cc7565b90509250929050565b600181811c90821680610e2c57607f821691505b602082108103610e4a57634e487b7160e01b5f52602260045260245ffd5b50919050565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561038657610386610e7c565b5f60018201610eb457610eb4610e7c565b506001019056fec89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa2646970667358221220e5557a8268dd346c07f8a97c7a37ab3faa7459a4309c313d2cabd53b00face4964736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/FflonkVerifier.json b/compiled-contracts/paris/FflonkVerifier.json index c1d65a241..506d29da9 100644 --- a/compiled-contracts/paris/FflonkVerifier.json +++ b/compiled-contracts/paris/FflonkVerifier.json @@ -28,8 +28,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b506159ee80620000216000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80639121da8a14610030575b600080fd5b61004361003e366004615973565b610057565b604051901515815260200160405180910390f35b6000615901565b6040516104c08201518082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610500840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610520840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610620840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760840151820990508082526102e4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309600114610514576000805260206000f35b8091506020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161076085015183099150806107608501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001850151830991508060a06106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001850151830991508060806106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001850151830991508060606106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001850151830991508060406106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001850151830991508060206106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a085015183099150806106a08501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106200185015183099150806060610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106200185015183099150806040610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106200185015183099150806020610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161062085015183099150806106208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001850151830991508060e0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001850151830991508060c0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001850151830991508060a0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806105200185015183099150806080610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606105200185015183099150806060610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406105200185015183099150806040610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206105200185015183099150806020610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161052085015183099150806105208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161050085015183099150806105008501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e085015183099150806104e085015250806104c0840152505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110610d7a576000805260206000f35b50565b803560208201357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760037f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478085860985090891507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478182099050808214610e08576000805260206000f35b505050565b610e176004610d7d565b610e216044610d7d565b610e2b6084610d7d565b610e3560c4610d7d565b610e4161010435610d49565b610e4d61012435610d49565b610e5961014435610d49565b610e6561016435610d49565b610e7161018435610d49565b610e7d6101a435610d49565b610e896101c435610d49565b610e956101e435610d49565b610ea161020435610d49565b610ead61022435610d49565b610eb961024435610d49565b610ec561026435610d49565b610ed161028435610d49565b610edd6102a435610d49565b610ee96102c435610d49565b610ef56102e435610d49565b565b7f16d70f6937b88ea2890451712281f2073db9ac923d49d38d833cbbcbc2b281c861078082019081527f1f7e1d70965392e542392cab2e10e88c03912b89107ae96c3a6b13f31f3a4cd06107a0830190815283356107c084019081526004356107e085015260243561080085015260a083207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908190066020808701918252902081900660408601819052845260443590925260643590526060909120819006608083018190529081800960a0830181905260808301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001910960e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8060e0840151096101008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f70363660e0840151096101208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f1d59376149b959ccbd157ac850893a6f07c2d99b3852513ab8d01be8e846a56660e0840151096101408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000060e0840151096101608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0530d09118705106cbb4a786ead16926d5d174e181a26686af5448492e42a18160e0840151096101808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb60e0840151096101a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f130b17119778465cfb3acaee30f81dee20710ead41671f568b11d9ab07b95a9b60e0840151096101c083015260e08201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019080096101e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f7036366101e0840151096102008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006101e0840151096102208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb6101e0840151096102408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a08301516101e0840151096102608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f23610260840151096102808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd610260840151096102a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f283ce45a2e5b8e4e78f9fbaf5f6a348bfcfaf76dd28e5ca7121b74ef68fdec2e610260840151096102c08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f236102c0840151096102e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd6102c0840151096103008301526102608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081818009098060c08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018182097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000909101066104a084018190526104c0840152506107808201526101e06101046107a083013761020061078082019081207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081900680845282526084356107a084015260a4356107c08401526060918290200691015250565b60e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018160080960e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105208601526101c08501516101008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105408601526101a08501516101208601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105608601526101808501516101408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961058086015261016085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105a08601526101408501516101808601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105c08601526101208501516101a08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105e08601526101008501516101c08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830960e0610520018601525050505050565b6101e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001816004096101e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106208601526102408501516102008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961064086015261022085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106608601526102008501516102408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096060610620018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c0870151097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030660c0850151087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610260850151600309096102608301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181810381900684087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106a08601526102a08501516102808601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106c08601526102808501516102a08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960406106a0018601527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c08801517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103067f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08a015109087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c0880151600309096102c086015190935091507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001828103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107008601526103008501516102e08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107208601526102e08501516103008601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960a06106a0018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806101e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806104e08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102608501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102e08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016103008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806105008401526127ff8361194e565b61280883611d96565b61281183611fac565b505060c081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000083018190066301000000096107608401525050610d7a8161005e565b6104a08101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181610760840151096107608301525050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185356107608601510983030106905080610320830152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820860e083015190915060009081807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600061052001890151880984098508935061010086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001890151880984098508935061012086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001890151880984098508935061014086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001890151880984098508935061016086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001890151880984098508935061018086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06105200189015188098409850893506101a086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c06105200189015188098409850893506101c086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e4350983089150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e0610520018801518709830984089250505080610340840152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068208905060006102043561022435610244357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183610104350993507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180836101243509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018486096101443509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161018435850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610320870151850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c087015185096101e08701519094506000908490827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600002610620018d01518c098509850893508692506102008a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600102610620018d01518c098509850893508692506102208a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600202610620018d01518c098509850893508692506102408a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001858509098408925050507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600302610620018b01518a09830983089150508061036088015250505050505050565b606081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309905060017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08901510908820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830860c08501519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190817f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b82090990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183089150506000915060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c085015160208601510960408501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828408610204350892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028709086102243508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160038709086102443508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161026435840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a43560208b01510908610204350894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c43560208c015109086102243508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101e43560208c015109086102443508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161028435860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151840992506001610264350394507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760870151860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c08701518609610260870151909550915060009050807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206000026106a0018a0151880983098308915061028087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206001026106a0018a015188098309830891506102a087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206002026106a0018a015188098309830891506102c087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206003026106a0018a015188098309830891506102e087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206004026106a0018a0151880983098308915061030087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206005026106a0018a015188098309830891505080610380870152505050505050565b6040518151815260208201516020820152825160408201526020830151606082015260408260808360066107d05a03fa905080610e08576000805260206000f35b6000604051833581526020840135602082015284604082015260408160608360076107d05a03fa91508161514e576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa9150508061517f576000805260206000f35b50505050565b600060405183815284602082015285604082015260408160608360076107d05a03fa9150816151b8576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa915050806151e9576000805260206000f35b5050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101608601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806104e0850151830984510991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180610500850151830984517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908009097f16d70f6937b88ea2890451712281f2073db9ac923d49d38d833cbbcbc2b281c86103a08501527f1f7e1d70965392e542392cab2e10e88c03912b89107ae96c3a6b13f31f3a4cd060206103a0018501526156408360046103a08701615116565b6156508160446103a08701615116565b6156dd7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161038088015185097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161036089015188090861034087015108600260016103e08801615185565b50610e088160846104208601615116565b604051610400820180517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd479081038190069091526104408301805182039190910690526000906157466103e084016103a085016150d5565b61575861042084016103a085016150d5565b61576c606084015160c46103a08601615116565b6103a083015181526103c08301516020808301919091527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a083015260c43560c08301527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760e43581030660e08301527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6101008301527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6101208301527f1970ea81dd6992adfbc571effb03503adbbb6a857f578403c6c40e22d65b3c026101408301527f054793348f12c0cf5622c340573cb277586319de359ab9389778f689786b1e48610160830152816101808160086107d05a03fa90511692915050565b6040516107808101604052615914610e0d565b61591e8382610ef7565b615927816123b7565b61593081612878565b61593a83826128b1565b61594381612911565b61594c81613e61565b61595581614559565b61595e816151f0565b615967816156ee565b90508060005260206000f35b60008061032080848603121561598857600080fd5b61030084018581111561599a57600080fd5b8493508582860111156159ac57600080fd5b8092505050925092905056fea26469706673582212204e835be6085497477d8e8c8932e2bd14ceccfe12f0a45b7352b0cbcd0588cc9864736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80639121da8a14610030575b600080fd5b61004361003e366004615973565b610057565b604051901515815260200160405180910390f35b6000615901565b6040516104c08201518082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610500840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610520840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610620840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760840151820990508082526102e4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309600114610514576000805260206000f35b8091506020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161076085015183099150806107608501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001850151830991508060a06106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001850151830991508060806106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001850151830991508060606106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001850151830991508060406106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001850151830991508060206106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a085015183099150806106a08501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106200185015183099150806060610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106200185015183099150806040610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106200185015183099150806020610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161062085015183099150806106208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001850151830991508060e0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001850151830991508060c0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001850151830991508060a0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806105200185015183099150806080610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606105200185015183099150806060610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406105200185015183099150806040610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206105200185015183099150806020610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161052085015183099150806105208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161050085015183099150806105008501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e085015183099150806104e085015250806104c0840152505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110610d7a576000805260206000f35b50565b803560208201357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760037f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478085860985090891507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478182099050808214610e08576000805260206000f35b505050565b610e176004610d7d565b610e216044610d7d565b610e2b6084610d7d565b610e3560c4610d7d565b610e4161010435610d49565b610e4d61012435610d49565b610e5961014435610d49565b610e6561016435610d49565b610e7161018435610d49565b610e7d6101a435610d49565b610e896101c435610d49565b610e956101e435610d49565b610ea161020435610d49565b610ead61022435610d49565b610eb961024435610d49565b610ec561026435610d49565b610ed161028435610d49565b610edd6102a435610d49565b610ee96102c435610d49565b610ef56102e435610d49565b565b7f16d70f6937b88ea2890451712281f2073db9ac923d49d38d833cbbcbc2b281c861078082019081527f1f7e1d70965392e542392cab2e10e88c03912b89107ae96c3a6b13f31f3a4cd06107a0830190815283356107c084019081526004356107e085015260243561080085015260a083207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908190066020808701918252902081900660408601819052845260443590925260643590526060909120819006608083018190529081800960a0830181905260808301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001910960e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8060e0840151096101008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f70363660e0840151096101208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f1d59376149b959ccbd157ac850893a6f07c2d99b3852513ab8d01be8e846a56660e0840151096101408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000060e0840151096101608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0530d09118705106cbb4a786ead16926d5d174e181a26686af5448492e42a18160e0840151096101808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb60e0840151096101a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f130b17119778465cfb3acaee30f81dee20710ead41671f568b11d9ab07b95a9b60e0840151096101c083015260e08201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019080096101e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f7036366101e0840151096102008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006101e0840151096102208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb6101e0840151096102408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a08301516101e0840151096102608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f23610260840151096102808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd610260840151096102a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f283ce45a2e5b8e4e78f9fbaf5f6a348bfcfaf76dd28e5ca7121b74ef68fdec2e610260840151096102c08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f236102c0840151096102e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd6102c0840151096103008301526102608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081818009098060c08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018182097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000909101066104a084018190526104c0840152506107808201526101e06101046107a083013761020061078082019081207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081900680845282526084356107a084015260a4356107c08401526060918290200691015250565b60e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018160080960e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105208601526101c08501516101008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105408601526101a08501516101208601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105608601526101808501516101408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961058086015261016085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105a08601526101408501516101808601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105c08601526101208501516101a08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105e08601526101008501516101c08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830960e0610520018601525050505050565b6101e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001816004096101e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106208601526102408501516102008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961064086015261022085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106608601526102008501516102408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096060610620018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c0870151097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030660c0850151087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610260850151600309096102608301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181810381900684087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106a08601526102a08501516102808601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106c08601526102808501516102a08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960406106a0018601527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c08801517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103067f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08a015109087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c0880151600309096102c086015190935091507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001828103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107008601526103008501516102e08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107208601526102e08501516103008601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960a06106a0018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806101e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806104e08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102608501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102e08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016103008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806105008401526127ff8361194e565b61280883611d96565b61281183611fac565b505060c081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000083018190066301000000096107608401525050610d7a8161005e565b6104a08101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181610760840151096107608301525050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185356107608601510983030106905080610320830152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820860e083015190915060009081807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600061052001890151880984098508935061010086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001890151880984098508935061012086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001890151880984098508935061014086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001890151880984098508935061016086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001890151880984098508935061018086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06105200189015188098409850893506101a086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c06105200189015188098409850893506101c086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e4350983089150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e0610520018801518709830984089250505080610340840152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068208905060006102043561022435610244357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183610104350993507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180836101243509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018486096101443509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161018435850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610320870151850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c087015185096101e08701519094506000908490827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600002610620018d01518c098509850893508692506102008a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600102610620018d01518c098509850893508692506102208a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600202610620018d01518c098509850893508692506102408a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001858509098408925050507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600302610620018b01518a09830983089150508061036088015250505050505050565b606081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309905060017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08901510908820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830860c08501519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190817f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b82090990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183089150506000915060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c085015160208601510960408501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828408610204350892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028709086102243508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160038709086102443508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161026435840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a43560208b01510908610204350894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c43560208c015109086102243508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101e43560208c015109086102443508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161028435860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151840992506001610264350394507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760870151860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c08701518609610260870151909550915060009050807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206000026106a0018a0151880983098308915061028087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206001026106a0018a015188098309830891506102a087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206002026106a0018a015188098309830891506102c087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206003026106a0018a015188098309830891506102e087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206004026106a0018a0151880983098308915061030087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206005026106a0018a015188098309830891505080610380870152505050505050565b6040518151815260208201516020820152825160408201526020830151606082015260408260808360066107d05a03fa905080610e08576000805260206000f35b6000604051833581526020840135602082015284604082015260408160608360076107d05a03fa91508161514e576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa9150508061517f576000805260206000f35b50505050565b600060405183815284602082015285604082015260408160608360076107d05a03fa9150816151b8576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa915050806151e9576000805260206000f35b5050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101608601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806104e0850151830984510991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180610500850151830984517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908009097f16d70f6937b88ea2890451712281f2073db9ac923d49d38d833cbbcbc2b281c86103a08501527f1f7e1d70965392e542392cab2e10e88c03912b89107ae96c3a6b13f31f3a4cd060206103a0018501526156408360046103a08701615116565b6156508160446103a08701615116565b6156dd7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161038088015185097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161036089015188090861034087015108600260016103e08801615185565b50610e088160846104208601615116565b604051610400820180517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd479081038190069091526104408301805182039190910690526000906157466103e084016103a085016150d5565b61575861042084016103a085016150d5565b61576c606084015160c46103a08601615116565b6103a083015181526103c08301516020808301919091527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a083015260c43560c08301527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760e43581030660e08301527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6101008301527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6101208301527f1970ea81dd6992adfbc571effb03503adbbb6a857f578403c6c40e22d65b3c026101408301527f054793348f12c0cf5622c340573cb277586319de359ab9389778f689786b1e48610160830152816101808160086107d05a03fa90511692915050565b6040516107808101604052615914610e0d565b61591e8382610ef7565b615927816123b7565b61593081612878565b61593a83826128b1565b61594381612911565b61594c81613e61565b61595581614559565b61595e816151f0565b615967816156ee565b90508060005260206000f35b60008061032080848603121561598857600080fd5b61030084018581111561599a57600080fd5b8493508582860111156159ac57600080fd5b8092505050925092905056fea26469706673582212204e835be6085497477d8e8c8932e2bd14ceccfe12f0a45b7352b0cbcd0588cc9864736f6c63430008140033", + "bytecode": "0x608060405234801561000f575f80fd5b5061368f8061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c80639121da8a1461002d575b5f80fd5b61004061003b366004613518565b610054565b604051901515815260200160405180910390f35b5f6134a8565b6040516104c08201518082526020820191505f805160206135da8339815191526104e0840151820990508082526020820191505f805160206135da833981519152610500840151820990508082526020820191505f805160206135da833981519152610520840151820990508082526020820191505f805160206135da833981519152602061052001840151820990508082526020820191505f805160206135da833981519152604061052001840151820990508082526020820191505f805160206135da833981519152606061052001840151820990508082526020820191505f805160206135da833981519152608061052001840151820990508082526020820191505f805160206135da83398151915260a061052001840151820990508082526020820191505f805160206135da83398151915260c061052001840151820990508082526020820191505f805160206135da83398151915260e061052001840151820990508082526020820191505f805160206135da833981519152610620840151820990508082526020820191505f805160206135da833981519152602061062001840151820990508082526020820191505f805160206135da833981519152604061062001840151820990508082526020820191505f805160206135da833981519152606061062001840151820990508082526020820191505f805160206135da8339815191526106a0840151820990508082526020820191505f805160206135da83398151915260206106a001840151820990508082526020820191505f805160206135da83398151915260406106a001840151820990508082526020820191505f805160206135da83398151915260606106a001840151820990508082526020820191505f805160206135da83398151915260806106a001840151820990508082526020820191505f805160206135da83398151915260a06106a001840151820990508082526020820191505f805160206135da833981519152610760840151820990508082526102e4355f805160206135da83398151915281830960011461036c575f805260205ff35b8091506020830392505f805160206135da8339815191528351830990505f805160206135da83398151915261076085015183099150806107608501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260a06106a001850151830991508060a06106a0018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260806106a001850151830991508060806106a0018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260606106a001850151830991508060606106a0018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260406106a001850151830991508060406106a0018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260206106a001850151830991508060206106a0018501526020830392505f805160206135da8339815191528351830990505f805160206135da8339815191526106a085015183099150806106a08501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260606106200185015183099150806060610620018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260406106200185015183099150806040610620018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260206106200185015183099150806020610620018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915261062085015183099150806106208501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260e061052001850151830991508060e0610520018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260c061052001850151830991508060c0610520018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260a061052001850151830991508060a0610520018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260806105200185015183099150806080610520018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260606105200185015183099150806060610520018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260406105200185015183099150806040610520018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260206105200185015183099150806020610520018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915261052085015183099150806105208501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915261050085015183099150806105008501526020830392505f805160206135da8339815191528351830990505f805160206135da8339815191526104e085015183099150806104e085015250806104c0840152505050565b5f805160206135da833981519152811061089f575f805260205ff35b50565b803560208201355f8051602061355a83398151915260035f8051602061355a8339815191528085860985090891505f8051602061355a83398151915281820990508082146108f2575f805260205ff35b505050565b61090160046108a2565b61090b60446108a2565b61091560846108a2565b61091f60c46108a2565b61092b61010435610883565b61093761012435610883565b61094361014435610883565b61094f61016435610883565b61095b61018435610883565b6109676101a435610883565b6109736101c435610883565b61097f6101e435610883565b61098b61020435610883565b61099761022435610883565b6109a361024435610883565b6109af61026435610883565b6109bb61028435610883565b6109c76102a435610883565b6109d36102c435610883565b6109df6102e435610883565b565b5f8051602061363a83398151915261078082019081525f8051602061361a8339815191526107a0830190815283356107c084019081526004356107e085015260243561080085015260a083205f805160206135da833981519152908190066020808701918252902081900660408601819052845260443590925260643590526060909120819006608083018190529081800960a0830181905260808301515f805160206135da833981519152910960e08301525f805160206135da8339815191527f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8060e0840151096101008301525f805160206135da8339815191525f8051602061359a83398151915260e0840151096101208301525f805160206135da8339815191527f1d59376149b959ccbd157ac850893a6f07c2d99b3852513ab8d01be8e846a56660e0840151096101408301525f805160206135da8339815191525f805160206135fa83398151915260e0840151096101608301525f805160206135da8339815191527f0530d09118705106cbb4a786ead16926d5d174e181a26686af5448492e42a18160e0840151096101808301525f805160206135da83398151915277b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb60e0840151096101a08301525f805160206135da8339815191527f130b17119778465cfb3acaee30f81dee20710ead41671f568b11d9ab07b95a9b60e0840151096101c083015260e08201515f805160206135da8339815191529080096101e08301525f805160206135da8339815191525f8051602061359a8339815191526101e0840151096102008301525f805160206135da8339815191525f805160206135fa8339815191526101e0840151096102208301525f805160206135da83398151915277b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb6101e0840151096102408301525f805160206135da83398151915260a08301516101e0840151096102608301525f805160206135da8339815191525f8051602061357a833981519152610260840151096102808301525f805160206135da83398151915277b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd610260840151096102a08301525f805160206135da8339815191527f283ce45a2e5b8e4e78f9fbaf5f6a348bfcfaf76dd28e5ca7121b74ef68fdec2e610260840151096102c08301525f805160206135da8339815191525f8051602061357a8339815191526102c0840151096102e08301525f805160206135da83398151915277b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd6102c0840151096103008301526102608201515f805160206135da8339815191529081818009098060c08401525f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da8339815191528182095f805160206135da8339815191525f805160206135fa833981519152909101066104a084018190526104c0840152506107808201526101e06101046107a083013761020061078082019081205f805160206135da8339815191529081900680845282526084356107a084015260a4356107c08401526060918290200691015250565b60e0810151606082015160015f805160206135da83398151915283820990505f805160206135da83398151915283820990505f805160206135da83398151915283820990505f805160206135da83398151915283820990505f805160206135da83398151915283820990505f805160206135da83398151915283820990505f805160206135da8339815191528160080960e0850151935090505f805160206135da83398151915283810381900683085f805160206135da8339815191528082860983096105208601526101c08501516101008601519094505f805160206135da833981519152908103819006840890505f805160206135da8339815191528082860983096105408601526101a08501516101208601519094505f805160206135da833981519152908103819006840890505f805160206135da8339815191528082860983096105608601526101808501516101408601519094505f805160206135da833981519152908103819006840890505f805160206135da83398151915280828609830961058086015261016085015193505f805160206135da833981519152848103819006840890505f805160206135da8339815191528082860983096105a08601526101408501516101808601519094505f805160206135da833981519152908103819006840890505f805160206135da8339815191528082860983096105c08601526101208501516101a08601519094505f805160206135da833981519152908103819006840890505f805160206135da8339815191528082860983096105e08601526101008501516101c08601519094505f805160206135da833981519152908103819006840890505f805160206135da83398151915280828609830960e0610520018601525050505050565b6101e0810151606082015160015f805160206135da83398151915283820990505f805160206135da83398151915283820990505f805160206135da833981519152816004096101e0850151935090505f805160206135da83398151915283810381900683085f805160206135da8339815191528082860983096106208601526102408501516102008601519094505f805160206135da833981519152908103819006840890505f805160206135da83398151915280828609830961064086015261022085015193505f805160206135da833981519152848103819006840890505f805160206135da8339815191528082860983096106608601526102008501516102408601519094505f805160206135da833981519152908103819006840890505f805160206135da8339815191528082860983096060610620018601525050505050565b60608101515f805160206135da833981519152805f805160206135da833981519152805f805160206135ba83398151915260c0870151095f805160206135da833981519152030660c0850151085f805160206135da833981519152610260850151600309096102608301515f805160206135da83398151915281810381900684085f805160206135da8339815191528082840984096106a08601526102a08501516102808601519092505f805160206135da833981519152908103819006850890505f805160206135da8339815191528082840984096106c08601526102808501516102a08601519092505f805160206135da833981519152908103819006850890505f805160206135da83398151915280828409840960406106a0018601525f805160206135da833981519152805f805160206135da83398151915260c08801515f805160206135da83398151915203065f805160206135da8339815191525f805160206135ba83398151915260c08a015109085f805160206135da8339815191526102c0880151600309096102c086015190935091505f805160206135da833981519152828103819006850890505f805160206135da8339815191528082840984096107008601526103008501516102e08601519092505f805160206135da833981519152908103819006850890505f805160206135da8339815191528082840984096107208601526102e08501516103008601519092505f805160206135da833981519152908103819006850890505f805160206135da83398151915280828409840960a06106a0018601525050505050565b60608101515f805160206135da833981519152806101e08401515f805160206135da833981519152030682085f805160206135da833981519152805f805160206135da8339815191526102008601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526102208601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526102408601515f805160206135da8339815191520306840882099050806104e08401525f805160206135da833981519152806102608501515f805160206135da8339815191520306830890505f805160206135da833981519152805f805160206135da8339815191526102808601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526102a08601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526102c08601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526102e08601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526103008601515f805160206135da83398151915203068408820990508061050084015261188583611023565b61188e836112b6565b611897836113fb565b505060c081015160015f805160206135da8339815191525f805160206135fa8339815191528301819006630100000009610760840152505061089f8161005a565b6104a08101515f805160206135da83398151915281610760840151096107608301525050565b5f5f805160206135da833981519152805f805160206135da83398151915285356107608601510983030106905080610320830152505050565b600160608201515f805160206135da83398151915281830991505f805160206135da83398151915281830991505f805160206135da83398151915281830991505f805160206135da83398151915281830991505f805160206135da83398151915281830991505f805160206135da83398151915281830991505f805160206135da83398151915281830991505f805160206135da8339815191528183099150505f805160206135da8339815191528060c08401515f805160206135da8339815191520306820860e08301519091505f9081805f805160206135da83398151915280846101243509610104350891505f805160206135da83398151915283840990505f805160206135da83398151915280826101643509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101443509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101843509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101a43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101c43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101e43509830891505f805160206135da833981519152805f805160206135da8339815191525f61052001890151880984098508935061010086015192505f805160206135da83398151915280846101243509610104350891505f805160206135da83398151915283840990505f805160206135da83398151915280826101643509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101443509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101843509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101a43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101c43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101e43509830891505f805160206135da833981519152805f805160206135da833981519152602061052001890151880984098508935061012086015192505f805160206135da83398151915280846101243509610104350891505f805160206135da83398151915283840990505f805160206135da83398151915280826101643509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101443509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101843509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101a43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101c43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101e43509830891505f805160206135da833981519152805f805160206135da833981519152604061052001890151880984098508935061014086015192505f805160206135da83398151915280846101243509610104350891505f805160206135da83398151915283840990505f805160206135da83398151915280826101643509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101443509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101843509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101a43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101c43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101e43509830891505f805160206135da833981519152805f805160206135da833981519152606061052001890151880984098508935061016086015192505f805160206135da83398151915280846101243509610104350891505f805160206135da83398151915283840990505f805160206135da83398151915280826101643509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101443509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101843509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101a43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101c43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101e43509830891505f805160206135da833981519152805f805160206135da833981519152608061052001890151880984098508935061018086015192505f805160206135da83398151915280846101243509610104350891505f805160206135da83398151915283840990505f805160206135da83398151915280826101643509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101443509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101843509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101a43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101c43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101e43509830891505f805160206135da833981519152805f805160206135da83398151915260a06105200189015188098409850893506101a086015192505f805160206135da83398151915280846101243509610104350891505f805160206135da83398151915283840990505f805160206135da83398151915280826101643509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101443509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101843509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101a43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101c43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101e43509830891505f805160206135da833981519152805f805160206135da83398151915260c06105200189015188098409850893506101c086015192505f805160206135da83398151915280846101243509610104350891505f805160206135da83398151915283840990505f805160206135da83398151915280826101643509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101443509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101843509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101a43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101c43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101e4350983089150505f805160206135da833981519152805f805160206135da83398151915260e0610520018801518709830984089250505080610340840152505050565b600160608201515f805160206135da83398151915281830991505f805160206135da83398151915281830991505f805160206135da83398151915281830991505f805160206135da8339815191528183099150505f805160206135da8339815191528060c08401515f805160206135da8339815191520306820890505f6102043561022435610244355f805160206135da83398151915283610104350993505f805160206135da83398151915280836101243509850893505f805160206135da833981519152805f805160206135da8339815191528486096101443509850893505f805160206135da83398151915280826101643509850893505f805160206135da83398151915261018435850893505f805160206135da833981519152610320870151850893505f805160206135da8339815191526104c087015185096101e08701519094505f908490825f805160206135da83398151915280878409840892505f805160206135da83398151915282830990505f805160206135da83398151915280868309840892505f805160206135da83398151915280895f805160206135da83398151915285850909840892505f805160206135da833981519152805f805160206135da83398151915260205f02610620018d01518c098509850893508692506102008a015191505f805160206135da83398151915280878409840892505f805160206135da83398151915282830990505f805160206135da83398151915280868309840892505f805160206135da83398151915280895f805160206135da83398151915285850909840892505f805160206135da833981519152805f805160206135da8339815191526020600102610620018d01518c098509850893508692506102208a015191505f805160206135da83398151915280878409840892505f805160206135da83398151915282830990505f805160206135da83398151915280868309840892505f805160206135da83398151915280895f805160206135da83398151915285850909840892505f805160206135da833981519152805f805160206135da8339815191526020600202610620018d01518c098509850893508692506102408a015191505f805160206135da83398151915280878409840892505f805160206135da83398151915282830990505f805160206135da83398151915280868309840892505f805160206135da83398151915280895f805160206135da833981519152858509098408925050505f805160206135da833981519152805f805160206135da8339815191526020600302610620018b01518a09830983089150508061036088015250505050505050565b606081015160015f805160206135da83398151915281830990505f805160206135da83398151915281830990505f805160206135da83398151915281830990505f805160206135da83398151915281830990505f805160206135da83398151915281830990505f805160206135da833981519152818309905060015f805160206135da83398151915281840990505f805160206135da83398151915281840990505f805160206135da83398151915281840990505f805160206135da8339815191528060c08601515f805160206135da8339815191525f805160206135ba83398151915260c08901510908820990505f805160206135da83398151915280825f805160206135da8339815191520306830860c08501519092505f805160206135da83398151915290815f805160206135ba83398151915282090990505f805160206135da8339815191528183089150505f91505f5f805160206135da83398151915260c085015160208601510960408501515f805160206135da83398151915280828408610204350892505f805160206135da833981519152805f805160206135da833981519152835f805160206135da83398151915260028709086102243508840992505f805160206135da833981519152805f805160206135da833981519152835f805160206135da83398151915260038709086102443508840992505f805160206135da83398151915261026435840992505f805160206135da83398151915280825f805160206135da8339815191526101a43560208b01510908610204350894505f805160206135da833981519152805f805160206135da833981519152835f805160206135da8339815191526101c43560208c015109086102243508860994505f805160206135da833981519152805f805160206135da833981519152835f805160206135da8339815191526101e43560208c015109086102443508860994505f805160206135da83398151915261028435860994505f805160206135da83398151915280865f805160206135da8339815191520306840892505f805160206135da8339815191526104c0870151840992506001610264350394505f805160206135da833981519152610760870151860994505f805160206135da8339815191526104c0870151860961026087015190955091505f9050805f805160206135da83398151915280878509610264350890505f805160206135da83398151915280855f805160206135da83398151915286870909820890505f805160206135da833981519152805f805160206135da83398151915260205f026106a0018a0151880983098308915061028087015192505f805160206135da83398151915280878509610264350890505f805160206135da83398151915280855f805160206135da83398151915286870909820890505f805160206135da833981519152805f805160206135da83398151915260206001026106a0018a015188098309830891506102a087015192505f805160206135da83398151915280878509610264350890505f805160206135da83398151915280855f805160206135da83398151915286870909820890505f805160206135da833981519152805f805160206135da83398151915260206002026106a0018a015188098309830891506102c087015192505f805160206135da833981519152806102a4358509610284350890505f805160206135da833981519152806102c4355f805160206135da83398151915286870909820890505f805160206135da833981519152805f805160206135da83398151915260206003026106a0018a015188098309830891506102e087015192505f805160206135da833981519152806102a4358509610284350890505f805160206135da833981519152806102c4355f805160206135da83398151915286870909820890505f805160206135da833981519152805f805160206135da83398151915260206004026106a0018a0151880983098308915061030087015192505f805160206135da833981519152806102a4358509610284350890505f805160206135da833981519152806102c4355f805160206135da83398151915286870909820890505f805160206135da833981519152805f805160206135da83398151915260206005026106a0018a015188098309830891505080610380870152505050505050565b6040518151815260208201516020820152825160408201526020830151606082015260408260808360066107d05a03fa9050806108f2575f805260205ff35b5f604051833581526020840135602082015284604082015260408160608360076107d05a03fa915081612f70575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa91505080612f9f575f805260205ff35b50505050565b5f60405183815284602082015285604082015260408160608360076107d05a03fa915081612fd5575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa91505080613004575f805260205ff35b5050505050565b60608101515f805160206135da8339815191528060e08401515f805160206135da833981519152030682085f805160206135da833981519152805f805160206135da8339815191526101008601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526101208601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526101408601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526101608601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526101808601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526101a08601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526101c08601515f805160206135da83398151915203068408820990505f805160206135da833981519152806104e0850151830984510991505f805160206135da83398151915280610500850151830984515f805160206135da833981519152908009095f8051602061363a8339815191526103a08501525f8051602061361a83398151915260206103a0018501526132478360046103a08701612f3b565b6132578160446103a08701612f3b565b6132ab5f805160206135da833981519152805f805160206135da83398151915261038088015185095f805160206135da83398151915261036089015188090861034087015108600260016103e08801612fa5565b506108f28160846104208601612f3b565b604051610400820180515f8051602061355a8339815191529081038190069091526104408301805182039190910690525f906133006103e084016103a08501612efc565b61331261042084016103a08501612efc565b613326606084015160c46103a08601612f3b565b6103a083015181526103c08301516020808301919091527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a083015260c43560c08301525f8051602061355a83398151915260e43581030660e08301527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6101008301527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6101208301527f1970ea81dd6992adfbc571effb03503adbbb6a857f578403c6c40e22d65b3c026101408301527f054793348f12c0cf5622c340573cb277586319de359ab9389778f689786b1e48610160830152816101808160086107d05a03fa90511692915050565b60405161078081016040526134bb6108f7565b6134c583826109e1565b6134ce81611651565b6134d7816118d8565b6134e183826118fe565b6134ea81611937565b6134f3816124df565b6134fc816128b6565b6135058161300b565b61350e816132bc565b9050805f5260205ff35b5f8061032080848603121561352b575f80fd5b61030084018581111561353c575f80fd5b84935085828601111561354d575f80fd5b8092505050925092905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4730644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f2330644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f7036360c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000130644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000001f7e1d70965392e542392cab2e10e88c03912b89107ae96c3a6b13f31f3a4cd016d70f6937b88ea2890451712281f2073db9ac923d49d38d833cbbcbc2b281c8a26469706673582212205fa66a592bf4101f1e5004b13a7e721aec22545c56503f32844822602575231564736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610029575f3560e01c80639121da8a1461002d575b5f80fd5b61004061003b366004613518565b610054565b604051901515815260200160405180910390f35b5f6134a8565b6040516104c08201518082526020820191505f805160206135da8339815191526104e0840151820990508082526020820191505f805160206135da833981519152610500840151820990508082526020820191505f805160206135da833981519152610520840151820990508082526020820191505f805160206135da833981519152602061052001840151820990508082526020820191505f805160206135da833981519152604061052001840151820990508082526020820191505f805160206135da833981519152606061052001840151820990508082526020820191505f805160206135da833981519152608061052001840151820990508082526020820191505f805160206135da83398151915260a061052001840151820990508082526020820191505f805160206135da83398151915260c061052001840151820990508082526020820191505f805160206135da83398151915260e061052001840151820990508082526020820191505f805160206135da833981519152610620840151820990508082526020820191505f805160206135da833981519152602061062001840151820990508082526020820191505f805160206135da833981519152604061062001840151820990508082526020820191505f805160206135da833981519152606061062001840151820990508082526020820191505f805160206135da8339815191526106a0840151820990508082526020820191505f805160206135da83398151915260206106a001840151820990508082526020820191505f805160206135da83398151915260406106a001840151820990508082526020820191505f805160206135da83398151915260606106a001840151820990508082526020820191505f805160206135da83398151915260806106a001840151820990508082526020820191505f805160206135da83398151915260a06106a001840151820990508082526020820191505f805160206135da833981519152610760840151820990508082526102e4355f805160206135da83398151915281830960011461036c575f805260205ff35b8091506020830392505f805160206135da8339815191528351830990505f805160206135da83398151915261076085015183099150806107608501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260a06106a001850151830991508060a06106a0018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260806106a001850151830991508060806106a0018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260606106a001850151830991508060606106a0018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260406106a001850151830991508060406106a0018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260206106a001850151830991508060206106a0018501526020830392505f805160206135da8339815191528351830990505f805160206135da8339815191526106a085015183099150806106a08501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260606106200185015183099150806060610620018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260406106200185015183099150806040610620018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260206106200185015183099150806020610620018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915261062085015183099150806106208501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260e061052001850151830991508060e0610520018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260c061052001850151830991508060c0610520018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260a061052001850151830991508060a0610520018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260806105200185015183099150806080610520018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260606105200185015183099150806060610520018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260406105200185015183099150806040610520018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260206105200185015183099150806020610520018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915261052085015183099150806105208501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915261050085015183099150806105008501526020830392505f805160206135da8339815191528351830990505f805160206135da8339815191526104e085015183099150806104e085015250806104c0840152505050565b5f805160206135da833981519152811061089f575f805260205ff35b50565b803560208201355f8051602061355a83398151915260035f8051602061355a8339815191528085860985090891505f8051602061355a83398151915281820990508082146108f2575f805260205ff35b505050565b61090160046108a2565b61090b60446108a2565b61091560846108a2565b61091f60c46108a2565b61092b61010435610883565b61093761012435610883565b61094361014435610883565b61094f61016435610883565b61095b61018435610883565b6109676101a435610883565b6109736101c435610883565b61097f6101e435610883565b61098b61020435610883565b61099761022435610883565b6109a361024435610883565b6109af61026435610883565b6109bb61028435610883565b6109c76102a435610883565b6109d36102c435610883565b6109df6102e435610883565b565b5f8051602061363a83398151915261078082019081525f8051602061361a8339815191526107a0830190815283356107c084019081526004356107e085015260243561080085015260a083205f805160206135da833981519152908190066020808701918252902081900660408601819052845260443590925260643590526060909120819006608083018190529081800960a0830181905260808301515f805160206135da833981519152910960e08301525f805160206135da8339815191527f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8060e0840151096101008301525f805160206135da8339815191525f8051602061359a83398151915260e0840151096101208301525f805160206135da8339815191527f1d59376149b959ccbd157ac850893a6f07c2d99b3852513ab8d01be8e846a56660e0840151096101408301525f805160206135da8339815191525f805160206135fa83398151915260e0840151096101608301525f805160206135da8339815191527f0530d09118705106cbb4a786ead16926d5d174e181a26686af5448492e42a18160e0840151096101808301525f805160206135da83398151915277b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb60e0840151096101a08301525f805160206135da8339815191527f130b17119778465cfb3acaee30f81dee20710ead41671f568b11d9ab07b95a9b60e0840151096101c083015260e08201515f805160206135da8339815191529080096101e08301525f805160206135da8339815191525f8051602061359a8339815191526101e0840151096102008301525f805160206135da8339815191525f805160206135fa8339815191526101e0840151096102208301525f805160206135da83398151915277b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb6101e0840151096102408301525f805160206135da83398151915260a08301516101e0840151096102608301525f805160206135da8339815191525f8051602061357a833981519152610260840151096102808301525f805160206135da83398151915277b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd610260840151096102a08301525f805160206135da8339815191527f283ce45a2e5b8e4e78f9fbaf5f6a348bfcfaf76dd28e5ca7121b74ef68fdec2e610260840151096102c08301525f805160206135da8339815191525f8051602061357a8339815191526102c0840151096102e08301525f805160206135da83398151915277b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd6102c0840151096103008301526102608201515f805160206135da8339815191529081818009098060c08401525f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da8339815191528182095f805160206135da8339815191525f805160206135fa833981519152909101066104a084018190526104c0840152506107808201526101e06101046107a083013761020061078082019081205f805160206135da8339815191529081900680845282526084356107a084015260a4356107c08401526060918290200691015250565b60e0810151606082015160015f805160206135da83398151915283820990505f805160206135da83398151915283820990505f805160206135da83398151915283820990505f805160206135da83398151915283820990505f805160206135da83398151915283820990505f805160206135da83398151915283820990505f805160206135da8339815191528160080960e0850151935090505f805160206135da83398151915283810381900683085f805160206135da8339815191528082860983096105208601526101c08501516101008601519094505f805160206135da833981519152908103819006840890505f805160206135da8339815191528082860983096105408601526101a08501516101208601519094505f805160206135da833981519152908103819006840890505f805160206135da8339815191528082860983096105608601526101808501516101408601519094505f805160206135da833981519152908103819006840890505f805160206135da83398151915280828609830961058086015261016085015193505f805160206135da833981519152848103819006840890505f805160206135da8339815191528082860983096105a08601526101408501516101808601519094505f805160206135da833981519152908103819006840890505f805160206135da8339815191528082860983096105c08601526101208501516101a08601519094505f805160206135da833981519152908103819006840890505f805160206135da8339815191528082860983096105e08601526101008501516101c08601519094505f805160206135da833981519152908103819006840890505f805160206135da83398151915280828609830960e0610520018601525050505050565b6101e0810151606082015160015f805160206135da83398151915283820990505f805160206135da83398151915283820990505f805160206135da833981519152816004096101e0850151935090505f805160206135da83398151915283810381900683085f805160206135da8339815191528082860983096106208601526102408501516102008601519094505f805160206135da833981519152908103819006840890505f805160206135da83398151915280828609830961064086015261022085015193505f805160206135da833981519152848103819006840890505f805160206135da8339815191528082860983096106608601526102008501516102408601519094505f805160206135da833981519152908103819006840890505f805160206135da8339815191528082860983096060610620018601525050505050565b60608101515f805160206135da833981519152805f805160206135da833981519152805f805160206135ba83398151915260c0870151095f805160206135da833981519152030660c0850151085f805160206135da833981519152610260850151600309096102608301515f805160206135da83398151915281810381900684085f805160206135da8339815191528082840984096106a08601526102a08501516102808601519092505f805160206135da833981519152908103819006850890505f805160206135da8339815191528082840984096106c08601526102808501516102a08601519092505f805160206135da833981519152908103819006850890505f805160206135da83398151915280828409840960406106a0018601525f805160206135da833981519152805f805160206135da83398151915260c08801515f805160206135da83398151915203065f805160206135da8339815191525f805160206135ba83398151915260c08a015109085f805160206135da8339815191526102c0880151600309096102c086015190935091505f805160206135da833981519152828103819006850890505f805160206135da8339815191528082840984096107008601526103008501516102e08601519092505f805160206135da833981519152908103819006850890505f805160206135da8339815191528082840984096107208601526102e08501516103008601519092505f805160206135da833981519152908103819006850890505f805160206135da83398151915280828409840960a06106a0018601525050505050565b60608101515f805160206135da833981519152806101e08401515f805160206135da833981519152030682085f805160206135da833981519152805f805160206135da8339815191526102008601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526102208601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526102408601515f805160206135da8339815191520306840882099050806104e08401525f805160206135da833981519152806102608501515f805160206135da8339815191520306830890505f805160206135da833981519152805f805160206135da8339815191526102808601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526102a08601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526102c08601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526102e08601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526103008601515f805160206135da83398151915203068408820990508061050084015261188583611023565b61188e836112b6565b611897836113fb565b505060c081015160015f805160206135da8339815191525f805160206135fa8339815191528301819006630100000009610760840152505061089f8161005a565b6104a08101515f805160206135da83398151915281610760840151096107608301525050565b5f5f805160206135da833981519152805f805160206135da83398151915285356107608601510983030106905080610320830152505050565b600160608201515f805160206135da83398151915281830991505f805160206135da83398151915281830991505f805160206135da83398151915281830991505f805160206135da83398151915281830991505f805160206135da83398151915281830991505f805160206135da83398151915281830991505f805160206135da83398151915281830991505f805160206135da8339815191528183099150505f805160206135da8339815191528060c08401515f805160206135da8339815191520306820860e08301519091505f9081805f805160206135da83398151915280846101243509610104350891505f805160206135da83398151915283840990505f805160206135da83398151915280826101643509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101443509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101843509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101a43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101c43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101e43509830891505f805160206135da833981519152805f805160206135da8339815191525f61052001890151880984098508935061010086015192505f805160206135da83398151915280846101243509610104350891505f805160206135da83398151915283840990505f805160206135da83398151915280826101643509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101443509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101843509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101a43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101c43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101e43509830891505f805160206135da833981519152805f805160206135da833981519152602061052001890151880984098508935061012086015192505f805160206135da83398151915280846101243509610104350891505f805160206135da83398151915283840990505f805160206135da83398151915280826101643509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101443509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101843509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101a43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101c43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101e43509830891505f805160206135da833981519152805f805160206135da833981519152604061052001890151880984098508935061014086015192505f805160206135da83398151915280846101243509610104350891505f805160206135da83398151915283840990505f805160206135da83398151915280826101643509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101443509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101843509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101a43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101c43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101e43509830891505f805160206135da833981519152805f805160206135da833981519152606061052001890151880984098508935061016086015192505f805160206135da83398151915280846101243509610104350891505f805160206135da83398151915283840990505f805160206135da83398151915280826101643509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101443509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101843509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101a43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101c43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101e43509830891505f805160206135da833981519152805f805160206135da833981519152608061052001890151880984098508935061018086015192505f805160206135da83398151915280846101243509610104350891505f805160206135da83398151915283840990505f805160206135da83398151915280826101643509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101443509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101843509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101a43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101c43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101e43509830891505f805160206135da833981519152805f805160206135da83398151915260a06105200189015188098409850893506101a086015192505f805160206135da83398151915280846101243509610104350891505f805160206135da83398151915283840990505f805160206135da83398151915280826101643509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101443509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101843509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101a43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101c43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101e43509830891505f805160206135da833981519152805f805160206135da83398151915260c06105200189015188098409850893506101c086015192505f805160206135da83398151915280846101243509610104350891505f805160206135da83398151915283840990505f805160206135da83398151915280826101643509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101443509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101843509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101a43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101c43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101e4350983089150505f805160206135da833981519152805f805160206135da83398151915260e0610520018801518709830984089250505080610340840152505050565b600160608201515f805160206135da83398151915281830991505f805160206135da83398151915281830991505f805160206135da83398151915281830991505f805160206135da8339815191528183099150505f805160206135da8339815191528060c08401515f805160206135da8339815191520306820890505f6102043561022435610244355f805160206135da83398151915283610104350993505f805160206135da83398151915280836101243509850893505f805160206135da833981519152805f805160206135da8339815191528486096101443509850893505f805160206135da83398151915280826101643509850893505f805160206135da83398151915261018435850893505f805160206135da833981519152610320870151850893505f805160206135da8339815191526104c087015185096101e08701519094505f908490825f805160206135da83398151915280878409840892505f805160206135da83398151915282830990505f805160206135da83398151915280868309840892505f805160206135da83398151915280895f805160206135da83398151915285850909840892505f805160206135da833981519152805f805160206135da83398151915260205f02610620018d01518c098509850893508692506102008a015191505f805160206135da83398151915280878409840892505f805160206135da83398151915282830990505f805160206135da83398151915280868309840892505f805160206135da83398151915280895f805160206135da83398151915285850909840892505f805160206135da833981519152805f805160206135da8339815191526020600102610620018d01518c098509850893508692506102208a015191505f805160206135da83398151915280878409840892505f805160206135da83398151915282830990505f805160206135da83398151915280868309840892505f805160206135da83398151915280895f805160206135da83398151915285850909840892505f805160206135da833981519152805f805160206135da8339815191526020600202610620018d01518c098509850893508692506102408a015191505f805160206135da83398151915280878409840892505f805160206135da83398151915282830990505f805160206135da83398151915280868309840892505f805160206135da83398151915280895f805160206135da833981519152858509098408925050505f805160206135da833981519152805f805160206135da8339815191526020600302610620018b01518a09830983089150508061036088015250505050505050565b606081015160015f805160206135da83398151915281830990505f805160206135da83398151915281830990505f805160206135da83398151915281830990505f805160206135da83398151915281830990505f805160206135da83398151915281830990505f805160206135da833981519152818309905060015f805160206135da83398151915281840990505f805160206135da83398151915281840990505f805160206135da83398151915281840990505f805160206135da8339815191528060c08601515f805160206135da8339815191525f805160206135ba83398151915260c08901510908820990505f805160206135da83398151915280825f805160206135da8339815191520306830860c08501519092505f805160206135da83398151915290815f805160206135ba83398151915282090990505f805160206135da8339815191528183089150505f91505f5f805160206135da83398151915260c085015160208601510960408501515f805160206135da83398151915280828408610204350892505f805160206135da833981519152805f805160206135da833981519152835f805160206135da83398151915260028709086102243508840992505f805160206135da833981519152805f805160206135da833981519152835f805160206135da83398151915260038709086102443508840992505f805160206135da83398151915261026435840992505f805160206135da83398151915280825f805160206135da8339815191526101a43560208b01510908610204350894505f805160206135da833981519152805f805160206135da833981519152835f805160206135da8339815191526101c43560208c015109086102243508860994505f805160206135da833981519152805f805160206135da833981519152835f805160206135da8339815191526101e43560208c015109086102443508860994505f805160206135da83398151915261028435860994505f805160206135da83398151915280865f805160206135da8339815191520306840892505f805160206135da8339815191526104c0870151840992506001610264350394505f805160206135da833981519152610760870151860994505f805160206135da8339815191526104c0870151860961026087015190955091505f9050805f805160206135da83398151915280878509610264350890505f805160206135da83398151915280855f805160206135da83398151915286870909820890505f805160206135da833981519152805f805160206135da83398151915260205f026106a0018a0151880983098308915061028087015192505f805160206135da83398151915280878509610264350890505f805160206135da83398151915280855f805160206135da83398151915286870909820890505f805160206135da833981519152805f805160206135da83398151915260206001026106a0018a015188098309830891506102a087015192505f805160206135da83398151915280878509610264350890505f805160206135da83398151915280855f805160206135da83398151915286870909820890505f805160206135da833981519152805f805160206135da83398151915260206002026106a0018a015188098309830891506102c087015192505f805160206135da833981519152806102a4358509610284350890505f805160206135da833981519152806102c4355f805160206135da83398151915286870909820890505f805160206135da833981519152805f805160206135da83398151915260206003026106a0018a015188098309830891506102e087015192505f805160206135da833981519152806102a4358509610284350890505f805160206135da833981519152806102c4355f805160206135da83398151915286870909820890505f805160206135da833981519152805f805160206135da83398151915260206004026106a0018a0151880983098308915061030087015192505f805160206135da833981519152806102a4358509610284350890505f805160206135da833981519152806102c4355f805160206135da83398151915286870909820890505f805160206135da833981519152805f805160206135da83398151915260206005026106a0018a015188098309830891505080610380870152505050505050565b6040518151815260208201516020820152825160408201526020830151606082015260408260808360066107d05a03fa9050806108f2575f805260205ff35b5f604051833581526020840135602082015284604082015260408160608360076107d05a03fa915081612f70575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa91505080612f9f575f805260205ff35b50505050565b5f60405183815284602082015285604082015260408160608360076107d05a03fa915081612fd5575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa91505080613004575f805260205ff35b5050505050565b60608101515f805160206135da8339815191528060e08401515f805160206135da833981519152030682085f805160206135da833981519152805f805160206135da8339815191526101008601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526101208601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526101408601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526101608601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526101808601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526101a08601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526101c08601515f805160206135da83398151915203068408820990505f805160206135da833981519152806104e0850151830984510991505f805160206135da83398151915280610500850151830984515f805160206135da833981519152908009095f8051602061363a8339815191526103a08501525f8051602061361a83398151915260206103a0018501526132478360046103a08701612f3b565b6132578160446103a08701612f3b565b6132ab5f805160206135da833981519152805f805160206135da83398151915261038088015185095f805160206135da83398151915261036089015188090861034087015108600260016103e08801612fa5565b506108f28160846104208601612f3b565b604051610400820180515f8051602061355a8339815191529081038190069091526104408301805182039190910690525f906133006103e084016103a08501612efc565b61331261042084016103a08501612efc565b613326606084015160c46103a08601612f3b565b6103a083015181526103c08301516020808301919091527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a083015260c43560c08301525f8051602061355a83398151915260e43581030660e08301527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6101008301527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6101208301527f1970ea81dd6992adfbc571effb03503adbbb6a857f578403c6c40e22d65b3c026101408301527f054793348f12c0cf5622c340573cb277586319de359ab9389778f689786b1e48610160830152816101808160086107d05a03fa90511692915050565b60405161078081016040526134bb6108f7565b6134c583826109e1565b6134ce81611651565b6134d7816118d8565b6134e183826118fe565b6134ea81611937565b6134f3816124df565b6134fc816128b6565b6135058161300b565b61350e816132bc565b9050805f5260205ff35b5f8061032080848603121561352b575f80fd5b61030084018581111561353c575f80fd5b84935085828601111561354d575f80fd5b8092505050925092905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4730644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f2330644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f7036360c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000130644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000001f7e1d70965392e542392cab2e10e88c03912b89107ae96c3a6b13f31f3a4cd016d70f6937b88ea2890451712281f2073db9ac923d49d38d833cbbcbc2b281c8a26469706673582212205fa66a592bf4101f1e5004b13a7e721aec22545c56503f32844822602575231564736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonDataComittee.json b/compiled-contracts/paris/PolygonDataComittee.json index ccd07c633..fd92e617d 100644 --- a/compiled-contracts/paris/PolygonDataComittee.json +++ b/compiled-contracts/paris/PolygonDataComittee.json @@ -1095,8 +1095,8 @@ "type": "function" } ], - "bytecode": "0x6101206040523480156200001257600080fd5b506040516200475c3803806200475c833981016040819052620000359162000078565b6001600160a01b0394851660a05292841660805290831660c052821660e0521661010052620000f8565b6001600160a01b03811681146200007557600080fd5b50565b600080600080600060a086880312156200009157600080fd5b85516200009e816200005f565b6020870151909550620000b1816200005f565b6040870151909450620000c4816200005f565b6060870151909350620000d7816200005f565b6080870151909250620000ea816200005f565b809150509295509295909350565b60805160a05160c05160e05161010051614570620001ec600039600081816105120152611e3f0152600081816104a60152818161091c015281816109eb01528181610e6f0152818161103b01528181611f0101528181611fca01528181611fec01528181612183015281816126b70152818161278501528181612872015281816131f1015281816132720152818161329401526133be0152600081816105c6015281816120c401526132ff01526000818161068a01528181611bb2015281816129bd0152612f140152600081816106d7015281816107b401528181611f540152818161209a015261299101526145706000f3fe608060405234801561001057600080fd5b50600436106102d25760003560e01c80636ff512cc11610186578063c89e42df116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b14610719578063f35dda471461072c578063f851a4401461074657600080fd5b8063d8d1091b146106bf578063e46761c4146106d2578063e7a7ed02146106f957600080fd5b8063d02103ca116100c8578063d02103ca14610685578063d690be31146106ac578063d7bc90ff146106b457600080fd5b8063c89e42df14610652578063cfa8ed471461066557600080fd5b8063aa3587d31161013a578063b0afe1541161011f578063b0afe15414610603578063b81fcafd1461060f578063c754c7ed1461062257600080fd5b8063aa3587d3146105e8578063ada8f919146105f057600080fd5b806399af03971161016b57806399af0397146105935780639e001877146105a6578063a3c573eb146105c157600080fd5b80636ff512cc146105785780638c3d73011461058b57600080fd5b806347ebf1081161023457806356e29435116101e85780635ec91958116101cd5780635ec91958146105475780636b8616ce1461054f5780636e05d2cd1461056f57600080fd5b806356e294351461050d5780635e9145c91461053457600080fd5b80634c21fef3116102195780634c21fef3146104c85780634e487706146104f2578063542028d51461050557600080fd5b806347ebf1081461048e57806349b7b802146104a157600080fd5b806332c2d1531161028b5780633cbc795b116102705780633cbc795b146103d057806340b5de6c1461040e578063456052671461046657600080fd5b806332c2d153146103965780633c351e10146103ab57600080fd5b806319d8ac61116102bc57806319d8ac611461030757806326782247146103345780632b35b3ac1461037957600080fd5b8062d0295d146102d7578063107bf28c146102f2575b600080fd5b6102df61076c565b6040519081526020015b60405180910390f35b6102fa61088c565b6040516102e99190613946565b60075461031b9067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102e9565b6001546103549073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102e9565b6008546103869060ff1681565b60405190151581526020016102e9565b6103a96103a43660046139a2565b61091a565b005b60085461035490610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6008546103f9907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102e9565b6104357fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102e9565b60075461031b90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103a961049c366004613af7565b6109e9565b6103547f000000000000000000000000000000000000000000000000000000000000000081565b60085461038690790100000000000000000000000000000000000000000000000000900460ff1681565b6103a9610500366004613bae565b610f9b565b6102fa6111b5565b6103547f000000000000000000000000000000000000000000000000000000000000000081565b6103a9610542366004613c17565b6111c2565b6103a961122b565b6102df61055d366004613bae565b60066020526000908152604090205481565b6102df60055481565b6103a9610586366004613c62565b611315565b6103a96113df565b6102fa6105a1366004613c7d565b6114b2565b61035473a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103547f000000000000000000000000000000000000000000000000000000000000000081565b6103a9611730565b6103a96105fe366004613c62565b611802565b6102df6405ca1ab1e081565b6103a961061d366004613cf9565b6118cc565b60075461031b907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6103a9610660366004613dab565b61224c565b6002546103549073ffffffffffffffffffffffffffffffffffffffff1681565b6103547f000000000000000000000000000000000000000000000000000000000000000081565b6102fa6122df565b6102df635ca1ab1e81565b6103a96106cd366004613de0565b6122fb565b6103547f000000000000000000000000000000000000000000000000000000000000000081565b60075461031b9068010000000000000000900467ffffffffffffffff1681565b6103a9610727366004613e22565b612832565b610734601b81565b60405160ff90911681526020016102e9565b6000546103549062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156107fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081f9190613e6e565b60075490915060009061085e9067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613eb6565b67ffffffffffffffff1690508060000361087b5760009250505090565b6108858183613ede565b9250505090565b6004805461089990613f19565b80601f01602080910402602001604051908101604052809291908181526020018280546108c590613f19565b80156109125780601f106108e757610100808354040283529160200191610912565b820191906000526020600020905b8154815290600101906020018083116108f557829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610989576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966846040516109dc91815260200190565b60405180910390a3505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a58576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610a785750600054600160ff909116105b80610a925750303b158015610a92575060005460ff166001145b610b23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610b8157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8b81169190910291909117909155600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000169189169190911790556003610c098482613fba565b506004610c168382613fba565b506007805477ffffffffffffffffffffffffffffffffffffffffffffffff167a06978000000000000000000000000000000000000000000000000017905573ffffffffffffffffffffffffffffffffffffffff8516610cad5763ffffffff841615610cad576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8816027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff8716021790556000610d408787876114b2565b805160208083019190912060408051600093810184905290810182905260608082018490524260c081901b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015293945090929190609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291506000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015610ecd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef191906140d4565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050508015610f9157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ff2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611039576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c891906140f1565b6111315760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611131576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461089990613f19565b600854790100000000000000000000000000000000000000000000000000900460ff1661121b576040517f821935b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611226838383612c21565b505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611282576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff16156112bf576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461136c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016111aa565b60015473ffffffffffffffffffffffffffffffffffffffff163314611430576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600060405180606001604052806021815260200161451a6021913960405163ffffffff808816602483015273ffffffffffffffffffffffffffffffffffffffff871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa6084820152600060a482015260c401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd3476afe0000000000000000000000000000000000000000000000000000000017905290516115ab93929101614113565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015611639573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166116b1576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906116f79084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614142565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152919052979650505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611787576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff81167901000000000000000000000000000000000000000000000000009182900460ff16159091021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f4190600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611859576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016111aa565b60025473ffffffffffffffffffffffffffffffffffffffff16331461191d576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836000819003611959576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611995576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b85811015611d855760008b8b838181106119de576119de61419e565b9050608002018036038101906119f491906141cd565b805160608201519192509067ffffffffffffffff1615611b6f5785611a1881614222565b96505060008183602001518460600151604051602001611a7093929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114611af9576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015611b4f576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055611c6d565b602082015115801590611c36575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015611c10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c349190613e6e565b155b15611c6d576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff161080611ca0575042826040015167ffffffffffffffff16115b15611cd7576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151965050508080611d7d90614249565b9150506119c2565b5060075467ffffffffffffffff6801000000000000000090910481169084161115611ddc576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861617905560058290556040517fc7a823e000000000000000000000000000000000000000000000000000000000815285907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063c7a823e090611e8d9086908c908c906004016142ca565b60006040518083038186803b158015611ea557600080fd5b505afa158015611eb9573d6000803e3d6000fd5b505050508167ffffffffffffffff168467ffffffffffffffff1614611fc4576000611ee48386613eb6565b9050611efa67ffffffffffffffff8216836142ed565b9150611f7b7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611f3361076c565b611f3d9190614306565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613485565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6120c2337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612055573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120799190613e6e565b6120839190614306565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613559565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561212a57600080fd5b505af115801561213e573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af11580156121e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061220691906140d4565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a2505050505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146122a3576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036122af8282613fba565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516111aa9190613946565b60405180606001604052806021815260200161451a6021913981565b60085460ff16612337576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003612373576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156123af576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff6801000000000000000082048116916123ea91849170010000000000000000000000000000000090041661431d565b1115612422576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b838110156126b15760008686838181106124675761246761419e565b90506020028101906124799190614330565b6124829061436e565b90508361248e81614222565b825180516020918201208185015160408087015190519499509194506000936124f09386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612579576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff861660009081526006602052604081205561259e6001886142ed565b840361260d5742600760189054906101000a900467ffffffffffffffff1684604001516125cb91906143ec565b67ffffffffffffffff16111561260d576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806126a990614249565b91505061244b565b506126df7f000000000000000000000000000000000000000000000000000000000000000084611f3361076c565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af11580156127ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127f291906140d4565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff1661286e576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ff9190613e6e565b90508181111561293b576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612977576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129b973ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613559565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a4a9190613e6e565b600780549192506801000000000000000090910467ffffffffffffffff16906008612a7483614222565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612aab92919061440d565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612bbb576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612c1a565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612c11949392919061441d565b60405180910390a25b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612c72576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003612cae576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612cea576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b85811015613126576000898983818110612d3357612d3361419e565b9050602002810190612d45919061445d565b612d4e90614491565b8051805160209091012060608201519192509067ffffffffffffffff1615612ed15785612d7a81614222565b96505060008183602001518460600151604051602001612dd293929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114612e5b576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015612eb1576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff861660009081526006602052604081205561300e565b602082015115801590612f98575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015612f72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f969190613e6e565b155b15612fcf576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c0101561300e576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff161080613041575042826040015167ffffffffffffffff16115b15613078576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061311e90614249565b915050612d17565b5060075467ffffffffffffffff680100000000000000009091048116908416111561317d576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691909117909155600583905585908281169085161461326c5760006131d48386613eb6565b90506131ea67ffffffffffffffff8216836142ed565b91506132237f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611f3361076c565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6132fd337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612055573d6000803e3d6000fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561336557600080fd5b505af1158015613379573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af115801561341d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061344191906140d4565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112269084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526135bd565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526135b79085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016134d7565b50505050565b600061361f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166136c99092919063ffffffff16565b805190915015611226578080602001905181019061363d91906140f1565b611226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b1a565b60606136d884846000856136e0565b949350505050565b606082471015613772576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b1a565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161379b9190614507565b60006040518083038185875af1925050503d80600081146137d8576040519150601f19603f3d011682016040523d82523d6000602084013e6137dd565b606091505b50915091506137ee878383876137f9565b979650505050505050565b6060831561388f5782516000036138885773ffffffffffffffffffffffffffffffffffffffff85163b613888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b1a565b50816136d8565b6136d883838151156138a45781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1a9190613946565b60005b838110156138f35781810151838201526020016138db565b50506000910152565b600081518084526139148160208601602086016138d8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061395960208301846138fc565b9392505050565b67ffffffffffffffff8116811461397657600080fd5b50565b803573ffffffffffffffffffffffffffffffffffffffff8116811461399d57600080fd5b919050565b6000806000606084860312156139b757600080fd5b83356139c281613960565b9250602084013591506139d760408501613979565b90509250925092565b803563ffffffff8116811461399d57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715613a4657613a466139f4565b60405290565b600082601f830112613a5d57600080fd5b813567ffffffffffffffff80821115613a7857613a786139f4565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715613abe57613abe6139f4565b81604052838152866020858801011115613ad757600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a031215613b1257600080fd5b613b1b88613979565b9650613b2960208901613979565b9550613b37604089016139e0565b9450613b4560608901613979565b9350613b53608089016139e0565b925060a088013567ffffffffffffffff80821115613b7057600080fd5b613b7c8b838c01613a4c565b935060c08a0135915080821115613b9257600080fd5b50613b9f8a828b01613a4c565b91505092959891949750929550565b600060208284031215613bc057600080fd5b813561395981613960565b60008083601f840112613bdd57600080fd5b50813567ffffffffffffffff811115613bf557600080fd5b6020830191508360208260051b8501011115613c1057600080fd5b9250929050565b600080600060408486031215613c2c57600080fd5b833567ffffffffffffffff811115613c4357600080fd5b613c4f86828701613bcb565b90945092506139d7905060208501613979565b600060208284031215613c7457600080fd5b61395982613979565b600080600060608486031215613c9257600080fd5b613c9b846139e0565b9250613ca960208501613979565b91506139d7604085016139e0565b60008083601f840112613cc957600080fd5b50813567ffffffffffffffff811115613ce157600080fd5b602083019150836020828501011115613c1057600080fd5b600080600080600060608688031215613d1157600080fd5b853567ffffffffffffffff80821115613d2957600080fd5b818801915088601f830112613d3d57600080fd5b813581811115613d4c57600080fd5b8960208260071b8501011115613d6157600080fd5b60208301975080965050613d7760208901613979565b94506040880135915080821115613d8d57600080fd5b50613d9a88828901613cb7565b969995985093965092949392505050565b600060208284031215613dbd57600080fd5b813567ffffffffffffffff811115613dd457600080fd5b6136d884828501613a4c565b60008060208385031215613df357600080fd5b823567ffffffffffffffff811115613e0a57600080fd5b613e1685828601613bcb565b90969095509350505050565b600080600060408486031215613e3757600080fd5b833567ffffffffffffffff811115613e4e57600080fd5b613e5a86828701613cb7565b909790965060209590950135949350505050565b600060208284031215613e8057600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613ed757613ed7613e87565b5092915050565b600082613f14577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613f2d57607f821691505b602082108103613f66577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561122657600081815260208120601f850160051c81016020861015613f935750805b601f850160051c820191505b81811015613fb257828155600101613f9f565b505050505050565b815167ffffffffffffffff811115613fd457613fd46139f4565b613fe881613fe28454613f19565b84613f6c565b602080601f83116001811461403b57600084156140055750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613fb2565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561408857888601518255948401946001909101908401614069565b50858210156140c457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156140e657600080fd5b815161395981613960565b60006020828403121561410357600080fd5b8151801515811461395957600080fd5b600083516141258184602088016138d8565b8351908301906141398183602088016138d8565b01949350505050565b60008651614154818460208b016138d8565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000608082840312156141df57600080fd5b6141e7613a23565b8235815260208301356020820152604083013561420381613960565b6040820152606083013561421681613960565b60608201529392505050565b600067ffffffffffffffff80831681810361423f5761423f613e87565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361427a5761427a613e87565b5060010190565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8381526040602082015260006142e4604083018486614281565b95945050505050565b8181038181111561430057614300613e87565b92915050565b808202811582820484141761430057614300613e87565b8082018082111561430057614300613e87565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261436457600080fd5b9190910192915050565b60006060823603121561438057600080fd5b6040516060810167ffffffffffffffff82821081831117156143a4576143a46139f4565b8160405284359150808211156143b957600080fd5b506143c636828601613a4c565b8252506020830135602082015260408301356143e181613960565b604082015292915050565b67ffffffffffffffff818116838216019080821115613ed757613ed7613e87565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000614453606083018486614281565b9695505050505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261436457600080fd5b6000608082360312156144a357600080fd5b6144ab613a23565b823567ffffffffffffffff8111156144c257600080fd5b6144ce36828601613a4c565b8252506020830135602082015260408301356144e981613960565b604082015260608301356144fc81613960565b606082015292915050565b600082516143648184602087016138d856fef8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a264697066735822122045a2993cfa2ca76e08de8ae90432ad69a57d8cff79895c7ab562425e2ba345c864736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102d25760003560e01c80636ff512cc11610186578063c89e42df116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b14610719578063f35dda471461072c578063f851a4401461074657600080fd5b8063d8d1091b146106bf578063e46761c4146106d2578063e7a7ed02146106f957600080fd5b8063d02103ca116100c8578063d02103ca14610685578063d690be31146106ac578063d7bc90ff146106b457600080fd5b8063c89e42df14610652578063cfa8ed471461066557600080fd5b8063aa3587d31161013a578063b0afe1541161011f578063b0afe15414610603578063b81fcafd1461060f578063c754c7ed1461062257600080fd5b8063aa3587d3146105e8578063ada8f919146105f057600080fd5b806399af03971161016b57806399af0397146105935780639e001877146105a6578063a3c573eb146105c157600080fd5b80636ff512cc146105785780638c3d73011461058b57600080fd5b806347ebf1081161023457806356e29435116101e85780635ec91958116101cd5780635ec91958146105475780636b8616ce1461054f5780636e05d2cd1461056f57600080fd5b806356e294351461050d5780635e9145c91461053457600080fd5b80634c21fef3116102195780634c21fef3146104c85780634e487706146104f2578063542028d51461050557600080fd5b806347ebf1081461048e57806349b7b802146104a157600080fd5b806332c2d1531161028b5780633cbc795b116102705780633cbc795b146103d057806340b5de6c1461040e578063456052671461046657600080fd5b806332c2d153146103965780633c351e10146103ab57600080fd5b806319d8ac61116102bc57806319d8ac611461030757806326782247146103345780632b35b3ac1461037957600080fd5b8062d0295d146102d7578063107bf28c146102f2575b600080fd5b6102df61076c565b6040519081526020015b60405180910390f35b6102fa61088c565b6040516102e99190613946565b60075461031b9067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102e9565b6001546103549073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102e9565b6008546103869060ff1681565b60405190151581526020016102e9565b6103a96103a43660046139a2565b61091a565b005b60085461035490610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6008546103f9907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102e9565b6104357fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102e9565b60075461031b90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103a961049c366004613af7565b6109e9565b6103547f000000000000000000000000000000000000000000000000000000000000000081565b60085461038690790100000000000000000000000000000000000000000000000000900460ff1681565b6103a9610500366004613bae565b610f9b565b6102fa6111b5565b6103547f000000000000000000000000000000000000000000000000000000000000000081565b6103a9610542366004613c17565b6111c2565b6103a961122b565b6102df61055d366004613bae565b60066020526000908152604090205481565b6102df60055481565b6103a9610586366004613c62565b611315565b6103a96113df565b6102fa6105a1366004613c7d565b6114b2565b61035473a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103547f000000000000000000000000000000000000000000000000000000000000000081565b6103a9611730565b6103a96105fe366004613c62565b611802565b6102df6405ca1ab1e081565b6103a961061d366004613cf9565b6118cc565b60075461031b907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6103a9610660366004613dab565b61224c565b6002546103549073ffffffffffffffffffffffffffffffffffffffff1681565b6103547f000000000000000000000000000000000000000000000000000000000000000081565b6102fa6122df565b6102df635ca1ab1e81565b6103a96106cd366004613de0565b6122fb565b6103547f000000000000000000000000000000000000000000000000000000000000000081565b60075461031b9068010000000000000000900467ffffffffffffffff1681565b6103a9610727366004613e22565b612832565b610734601b81565b60405160ff90911681526020016102e9565b6000546103549062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156107fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081f9190613e6e565b60075490915060009061085e9067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613eb6565b67ffffffffffffffff1690508060000361087b5760009250505090565b6108858183613ede565b9250505090565b6004805461089990613f19565b80601f01602080910402602001604051908101604052809291908181526020018280546108c590613f19565b80156109125780601f106108e757610100808354040283529160200191610912565b820191906000526020600020905b8154815290600101906020018083116108f557829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610989576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966846040516109dc91815260200190565b60405180910390a3505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a58576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610a785750600054600160ff909116105b80610a925750303b158015610a92575060005460ff166001145b610b23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610b8157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8b81169190910291909117909155600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000169189169190911790556003610c098482613fba565b506004610c168382613fba565b506007805477ffffffffffffffffffffffffffffffffffffffffffffffff167a06978000000000000000000000000000000000000000000000000017905573ffffffffffffffffffffffffffffffffffffffff8516610cad5763ffffffff841615610cad576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8816027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff8716021790556000610d408787876114b2565b805160208083019190912060408051600093810184905290810182905260608082018490524260c081901b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015293945090929190609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291506000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015610ecd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef191906140d4565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050508015610f9157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ff2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611039576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c891906140f1565b6111315760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611131576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461089990613f19565b600854790100000000000000000000000000000000000000000000000000900460ff1661121b576040517f821935b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611226838383612c21565b505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611282576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff16156112bf576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461136c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016111aa565b60015473ffffffffffffffffffffffffffffffffffffffff163314611430576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600060405180606001604052806021815260200161451a6021913960405163ffffffff808816602483015273ffffffffffffffffffffffffffffffffffffffff871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa6084820152600060a482015260c401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd3476afe0000000000000000000000000000000000000000000000000000000017905290516115ab93929101614113565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015611639573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166116b1576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906116f79084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614142565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152919052979650505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611787576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff81167901000000000000000000000000000000000000000000000000009182900460ff16159091021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f4190600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611859576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016111aa565b60025473ffffffffffffffffffffffffffffffffffffffff16331461191d576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836000819003611959576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611995576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b85811015611d855760008b8b838181106119de576119de61419e565b9050608002018036038101906119f491906141cd565b805160608201519192509067ffffffffffffffff1615611b6f5785611a1881614222565b96505060008183602001518460600151604051602001611a7093929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114611af9576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015611b4f576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055611c6d565b602082015115801590611c36575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015611c10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c349190613e6e565b155b15611c6d576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff161080611ca0575042826040015167ffffffffffffffff16115b15611cd7576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151965050508080611d7d90614249565b9150506119c2565b5060075467ffffffffffffffff6801000000000000000090910481169084161115611ddc576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861617905560058290556040517fc7a823e000000000000000000000000000000000000000000000000000000000815285907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063c7a823e090611e8d9086908c908c906004016142ca565b60006040518083038186803b158015611ea557600080fd5b505afa158015611eb9573d6000803e3d6000fd5b505050508167ffffffffffffffff168467ffffffffffffffff1614611fc4576000611ee48386613eb6565b9050611efa67ffffffffffffffff8216836142ed565b9150611f7b7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611f3361076c565b611f3d9190614306565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613485565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6120c2337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612055573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120799190613e6e565b6120839190614306565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613559565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561212a57600080fd5b505af115801561213e573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af11580156121e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061220691906140d4565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a2505050505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146122a3576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036122af8282613fba565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516111aa9190613946565b60405180606001604052806021815260200161451a6021913981565b60085460ff16612337576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003612373576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156123af576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff6801000000000000000082048116916123ea91849170010000000000000000000000000000000090041661431d565b1115612422576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b838110156126b15760008686838181106124675761246761419e565b90506020028101906124799190614330565b6124829061436e565b90508361248e81614222565b825180516020918201208185015160408087015190519499509194506000936124f09386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612579576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff861660009081526006602052604081205561259e6001886142ed565b840361260d5742600760189054906101000a900467ffffffffffffffff1684604001516125cb91906143ec565b67ffffffffffffffff16111561260d576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806126a990614249565b91505061244b565b506126df7f000000000000000000000000000000000000000000000000000000000000000084611f3361076c565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af11580156127ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127f291906140d4565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff1661286e576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ff9190613e6e565b90508181111561293b576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612977576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129b973ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613559565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a4a9190613e6e565b600780549192506801000000000000000090910467ffffffffffffffff16906008612a7483614222565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612aab92919061440d565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612bbb576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612c1a565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612c11949392919061441d565b60405180910390a25b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612c72576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003612cae576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612cea576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b85811015613126576000898983818110612d3357612d3361419e565b9050602002810190612d45919061445d565b612d4e90614491565b8051805160209091012060608201519192509067ffffffffffffffff1615612ed15785612d7a81614222565b96505060008183602001518460600151604051602001612dd293929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114612e5b576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015612eb1576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff861660009081526006602052604081205561300e565b602082015115801590612f98575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015612f72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f969190613e6e565b155b15612fcf576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c0101561300e576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff161080613041575042826040015167ffffffffffffffff16115b15613078576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061311e90614249565b915050612d17565b5060075467ffffffffffffffff680100000000000000009091048116908416111561317d576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691909117909155600583905585908281169085161461326c5760006131d48386613eb6565b90506131ea67ffffffffffffffff8216836142ed565b91506132237f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611f3361076c565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6132fd337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612055573d6000803e3d6000fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561336557600080fd5b505af1158015613379573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af115801561341d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061344191906140d4565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112269084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526135bd565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526135b79085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016134d7565b50505050565b600061361f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166136c99092919063ffffffff16565b805190915015611226578080602001905181019061363d91906140f1565b611226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b1a565b60606136d884846000856136e0565b949350505050565b606082471015613772576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b1a565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161379b9190614507565b60006040518083038185875af1925050503d80600081146137d8576040519150601f19603f3d011682016040523d82523d6000602084013e6137dd565b606091505b50915091506137ee878383876137f9565b979650505050505050565b6060831561388f5782516000036138885773ffffffffffffffffffffffffffffffffffffffff85163b613888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b1a565b50816136d8565b6136d883838151156138a45781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1a9190613946565b60005b838110156138f35781810151838201526020016138db565b50506000910152565b600081518084526139148160208601602086016138d8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061395960208301846138fc565b9392505050565b67ffffffffffffffff8116811461397657600080fd5b50565b803573ffffffffffffffffffffffffffffffffffffffff8116811461399d57600080fd5b919050565b6000806000606084860312156139b757600080fd5b83356139c281613960565b9250602084013591506139d760408501613979565b90509250925092565b803563ffffffff8116811461399d57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715613a4657613a466139f4565b60405290565b600082601f830112613a5d57600080fd5b813567ffffffffffffffff80821115613a7857613a786139f4565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715613abe57613abe6139f4565b81604052838152866020858801011115613ad757600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a031215613b1257600080fd5b613b1b88613979565b9650613b2960208901613979565b9550613b37604089016139e0565b9450613b4560608901613979565b9350613b53608089016139e0565b925060a088013567ffffffffffffffff80821115613b7057600080fd5b613b7c8b838c01613a4c565b935060c08a0135915080821115613b9257600080fd5b50613b9f8a828b01613a4c565b91505092959891949750929550565b600060208284031215613bc057600080fd5b813561395981613960565b60008083601f840112613bdd57600080fd5b50813567ffffffffffffffff811115613bf557600080fd5b6020830191508360208260051b8501011115613c1057600080fd5b9250929050565b600080600060408486031215613c2c57600080fd5b833567ffffffffffffffff811115613c4357600080fd5b613c4f86828701613bcb565b90945092506139d7905060208501613979565b600060208284031215613c7457600080fd5b61395982613979565b600080600060608486031215613c9257600080fd5b613c9b846139e0565b9250613ca960208501613979565b91506139d7604085016139e0565b60008083601f840112613cc957600080fd5b50813567ffffffffffffffff811115613ce157600080fd5b602083019150836020828501011115613c1057600080fd5b600080600080600060608688031215613d1157600080fd5b853567ffffffffffffffff80821115613d2957600080fd5b818801915088601f830112613d3d57600080fd5b813581811115613d4c57600080fd5b8960208260071b8501011115613d6157600080fd5b60208301975080965050613d7760208901613979565b94506040880135915080821115613d8d57600080fd5b50613d9a88828901613cb7565b969995985093965092949392505050565b600060208284031215613dbd57600080fd5b813567ffffffffffffffff811115613dd457600080fd5b6136d884828501613a4c565b60008060208385031215613df357600080fd5b823567ffffffffffffffff811115613e0a57600080fd5b613e1685828601613bcb565b90969095509350505050565b600080600060408486031215613e3757600080fd5b833567ffffffffffffffff811115613e4e57600080fd5b613e5a86828701613cb7565b909790965060209590950135949350505050565b600060208284031215613e8057600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613ed757613ed7613e87565b5092915050565b600082613f14577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613f2d57607f821691505b602082108103613f66577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561122657600081815260208120601f850160051c81016020861015613f935750805b601f850160051c820191505b81811015613fb257828155600101613f9f565b505050505050565b815167ffffffffffffffff811115613fd457613fd46139f4565b613fe881613fe28454613f19565b84613f6c565b602080601f83116001811461403b57600084156140055750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613fb2565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561408857888601518255948401946001909101908401614069565b50858210156140c457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156140e657600080fd5b815161395981613960565b60006020828403121561410357600080fd5b8151801515811461395957600080fd5b600083516141258184602088016138d8565b8351908301906141398183602088016138d8565b01949350505050565b60008651614154818460208b016138d8565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000608082840312156141df57600080fd5b6141e7613a23565b8235815260208301356020820152604083013561420381613960565b6040820152606083013561421681613960565b60608201529392505050565b600067ffffffffffffffff80831681810361423f5761423f613e87565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361427a5761427a613e87565b5060010190565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8381526040602082015260006142e4604083018486614281565b95945050505050565b8181038181111561430057614300613e87565b92915050565b808202811582820484141761430057614300613e87565b8082018082111561430057614300613e87565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261436457600080fd5b9190910192915050565b60006060823603121561438057600080fd5b6040516060810167ffffffffffffffff82821081831117156143a4576143a46139f4565b8160405284359150808211156143b957600080fd5b506143c636828601613a4c565b8252506020830135602082015260408301356143e181613960565b604082015292915050565b67ffffffffffffffff818116838216019080821115613ed757613ed7613e87565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000614453606083018486614281565b9695505050505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261436457600080fd5b6000608082360312156144a357600080fd5b6144ab613a23565b823567ffffffffffffffff8111156144c257600080fd5b6144ce36828601613a4c565b8252506020830135602082015260408301356144e981613960565b604082015260608301356144fc81613960565b606082015292915050565b600082516143648184602087016138d856fef8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a264697066735822122045a2993cfa2ca76e08de8ae90432ad69a57d8cff79895c7ab562425e2ba345c864736f6c63430008140033", + "bytecode": "0x61012060405234801562000011575f80fd5b506040516200349238038062003492833981016040819052620000349162000076565b6001600160a01b0394851660a05292841660805290831660c052821660e0521661010052620000f2565b6001600160a01b038116811462000073575f80fd5b50565b5f805f805f60a086880312156200008b575f80fd5b855162000098816200005e565b6020870151909550620000ab816200005e565b6040870151909450620000be816200005e565b6060870151909350620000d1816200005e565b6080870151909250620000e4816200005e565b809150509295509295909350565b60805160a05160c05160e051610100516132b3620001df5f395f8181610385015261145301525f818161032f01528181610718015281816107b301528181610a2001528181610b760152818161150001528181611598015281816115ba015281816116fa01528181611a7901528181611af501528181611bd00152818161227a015281816122d7015281816122f901526123d901525f818161043801528181611676015261235501525f81816104d9015281816112b501528181611ccc015261208e01525f8181610526015281816105ab015281816115450152818161164c0152611ca101526132b35ff3fe608060405234801561000f575f80fd5b50600436106101e0575f3560e01c8062d0295d146101e4578063107bf28c146101ff57806319d8ac6114610214578063267822471461023f5780632b35b3ac1461025f57806332c2d1531461027c5780633c351e10146102915780633cbc795b146102a957806340b5de6c146102d557806345605267146102fd57806347ebf1081461031757806349b7b8021461032a5780634c21fef3146103515780634e48770614610365578063542028d51461037857806356e29435146103805780635e9145c9146103a75780635ec91958146103ba5780636b8616ce146103c25780636e05d2cd146103e15780636ff512cc146103ea5780638c3d7301146103fd57806399af0397146104055780639e00187714610418578063a3c573eb14610433578063aa3587d31461045a578063ada8f91914610462578063b0afe15414610475578063b81fcafd14610481578063c754c7ed14610494578063c89e42df146104ae578063cfa8ed47146104c1578063d02103ca146104d4578063d690be31146104fb578063d7bc90ff14610503578063d8d1091b1461050e578063e46761c414610521578063e7a7ed0214610548578063eaeb077b14610562578063f35dda4714610575578063f851a4401461058f575b5f80fd5b6101ec6105a7565b6040519081526020015b60405180910390f35b61020761068a565b6040516101f691906127c7565b600754610227906001600160401b031681565b6040516001600160401b0390911681526020016101f6565b600154610252906001600160a01b031681565b6040516101f691906127e0565b60085461026c9060ff1681565b60405190151581526020016101f6565b61028f61028a366004612826565b610716565b005b6008546102529061010090046001600160a01b031681565b6008546102c090600160a81b900463ffffffff1681565b60405163ffffffff90911681526020016101f6565b6102e46001600160f81b031981565b6040516001600160f81b031990911681526020016101f6565b60075461022790600160801b90046001600160401b031681565b61028f610325366004612938565b6107b1565b6102527f000000000000000000000000000000000000000000000000000000000000000081565b60085461026c90600160c81b900460ff1681565b61028f6103733660046129e7565b610b17565b610207610c8b565b6102527f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103b5366004612a49565b610c98565b61028f610cd2565b6101ec6103d03660046129e7565b60066020525f908152604090205481565b6101ec60055481565b61028f6103f8366004612a8f565b610d5d565b61028f610dd8565b610207610413366004612aa8565b610e64565b61025273a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6102527f000000000000000000000000000000000000000000000000000000000000000081565b61028f610feb565b61028f610470366004612a8f565b611064565b6101ec6405ca1ab1e081565b61028f61048f366004612b1c565b6110df565b60075461022790600160c01b90046001600160401b031681565b61028f6104bc366004612bc4565b6117a3565b600254610252906001600160a01b031681565b6102527f000000000000000000000000000000000000000000000000000000000000000081565b61020761180f565b6101ec635ca1ab1e81565b61028f61051c366004612bf5565b61182b565b6102527f000000000000000000000000000000000000000000000000000000000000000081565b60075461022790600160401b90046001600160401b031681565b61028f610570366004612c33565b611baa565b61057d601b81565b60405160ff90911681526020016101f6565b5f54610252906201000090046001600160a01b031681565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016105f591906127e0565b602060405180830381865afa158015610610573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106349190612c7a565b6007549091505f9061065f906001600160401b03600160801b8204811691600160401b900416612ca5565b6001600160401b03169050805f03610679575f9250505090565b6106838183612ccc565b9250505090565b6004805461069790612ceb565b80601f01602080910402602001604051908101604052809291908181526020018280546106c390612ceb565b801561070e5780601f106106e55761010080835404028352916020019161070e565b820191905f5260205f20905b8154815290600101906020018083116106f157829003601f168201915b505050505081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461075f57604051631736745960e31b815260040160405180910390fd5b806001600160a01b0316836001600160401b03167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966846040516107a491815260200190565b60405180910390a3505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146107fa57604051631736745960e31b815260040160405180910390fd5b5f54610100900460ff161580801561081857505f54600160ff909116105b80610838575061082730611e9c565b15801561083857505f5460ff166001145b6108a05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156108c1575f805461ff0019166101001790555b5f805462010000600160b01b031916620100006001600160a01b038b81169190910291909117909155600280546001600160a01b031916918916919091179055600361090d8482612d70565b50600461091a8382612d70565b50600780546001600160c01b0316610d2f60c71b1790556001600160a01b0385166109645763ffffffff84161561096457604051630d43a60960e11b815260040160405180910390fd5b60088054610100600160c81b0319166101006001600160a01b0388160263ffffffff60a81b191617600160a81b63ffffffff8716021790555f6109a8878787610e64565b90505f818051906020012090505f4290505f805f1b835f801b848e6040516020016109d7959493929190612e2b565b60408051808303601f19018152908290528051602090910120600780546001600160401b0319166001600160401b0386161790556005819055639a908e7360e01b825291505f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639a908e7390610a60906001908690600401612e6a565b6020604051808303815f875af1158015610a7c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa09190612e83565b6040519091506001600160401b038216905f8051602061321d833981519152905f90a250505050508015610b0d575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b5f546201000090046001600160a01b03163314610b4757604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610b745760405163f5e37f2f60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bd0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf49190612e9e565b610c2e576007546001600160401b03600160c01b909104811690821610610c2e5760405163f5e37f2f60e01b815260040160405180910390fd5b600780546001600160c01b0316600160c01b6001600160401b038416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461069790612ceb565b600854600160c81b900460ff16610cc2576040516320864d6d60e21b815260040160405180910390fd5b610ccd838383611eab565b505050565b5f546201000090046001600160a01b03163314610d0257604051634755657960e01b815260040160405180910390fd5b60085460ff1615610d265760405163f6ba91a160e01b815260040160405180910390fd5b6008805460ff191660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f546201000090046001600160a01b03163314610d8d57604051634755657960e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383161790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610c809083906127e0565b6001546001600160a01b03163314610e035760405163d1ec4b2360e01b815260040160405180910390fd5b6001545f8054620100006001600160a01b0390931692830262010000600160b01b03199091161790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e91610e5a916127e0565b60405180910390a1565b60605f60405180606001604052806021815260200161325d6021913960405163ffffffff80881660248301526001600160a01b03871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa60848201525f60a482015260c40160408051601f19818403018152918152602080830180516001600160e01b03166369a3b57f60e11b1790529051610f0293929101612ebd565b60408051601f1981840301815282825280516020808301919091205f80865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015610f6f573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116610fa35760405163668b0cb360e11b815260040160405180910390fd5b6040515f90610fd09084906405ca1ab1e090635ca1ab1e90601b906001600160f81b031990602001612eeb565b60408051808303601f19018152919052979650505050505050565b5f546201000090046001600160a01b0316331461101b57604051634755657960e01b815260040160405180910390fd5b6008805460ff60c81b198116600160c81b9182900460ff16159091021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f41905f90a1565b5f546201000090046001600160a01b0316331461109457604051634755657960e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610c809083906127e0565b6002546001600160a01b0316331461110a576040516311e7be1560e01b815260040160405180910390fd5b835f81900361112c5760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561114f57604051635acfba9d60e11b815260040160405180910390fd5b6007546005546001600160401b0380831692600160801b90041690815f5b858110156113ea575f8b8b8381811061118857611188612f2e565b90506080020180360381019061119e9190612f42565b80516060820151919250906001600160401b03161561128b57856111c181612f95565b9650505f81836020015184606001516040516020016111e293929190612fc2565b60408051601f1981840301815291815281516020928301206001600160401b038a165f908152600690935291205490915081146112325760405163671ebaaf60e11b815260040160405180910390fd5b82606001516001600160401b031683604001516001600160401b0316101561126d57604051633fbd5c3960e11b815260040160405180910390fd5b506001600160401b0386165f90815260066020526040812055611347565b602082015115801590611329575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303815f875af1158015611303573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113279190612c7a565b155b15611347576040516373bd668d60e01b815260040160405180910390fd5b866001600160401b031682604001516001600160401b0316108061137757504282604001516001600160401b0316115b15611395576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518e6040516020016113b6959493929190612e2b565b60405160208183030381529060405280519060200120945081604001519650505080806113e290612fe5565b91505061116d565b506007546001600160401b03600160401b909104811690841611156114225760405163c630a00d60e01b815260040160405180910390fd5b600780546001600160401b0319166001600160401b038616179055600582905560405163063d411f60e51b815285907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063c7a823e0906114949086908c908c90600401613025565b5f6040518083038186803b1580156114aa575f80fd5b505afa1580156114bc573d5f803e3d5ffd5b50505050816001600160401b0316846001600160401b031614611592575f6114e48386612ca5565b90506114f96001600160401b03821683613047565b915061156c7f0000000000000000000000000000000000000000000000000000000000000000826001600160401b03166115316105a7565b61153b9190613060565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190612480565b5060078054600160801b600160c01b031916600160801b6001600160401b038716021790555b611674337f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611614573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116389190612c7a565b6116429190613060565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169291906124e3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156116cc575f80fd5b505af11580156116de573d5f803e3d5ffd5b5050604051639a908e7360e01b81525f92506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150639a908e7390611732908a908890600401612e6a565b6020604051808303815f875af115801561174e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117729190612e83565b6040519091506001600160401b038216905f8051602061321d833981519152905f90a2505050505050505050505050565b5f546201000090046001600160a01b031633146117d357604051634755657960e01b815260040160405180910390fd5b60036117df8282612d70565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c8091906127c7565b60405180606001604052806021815260200161325d6021913981565b60085460ff1661184e576040516324eff8c360e01b815260040160405180910390fd5b805f8190036118705760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561189357604051635acfba9d60e11b815260040160405180910390fd5b6007546001600160401b03600160401b82048116916118bb918491600160801b900416613077565b11156118da5760405163c630a00d60e01b815260040160405180910390fd5b600754600554600160801b9091046001600160401b0316905f5b83811015611a73575f86868381811061190f5761190f612f2e565b9050602002810190611921919061308a565b61192a906130a8565b90508361193681612f95565b825180516020918201208185015160408087015190519499509194505f936119619386939101612fc2565b60408051601f1981840301815291815281516020928301206001600160401b0389165f908152600690935291205490915081146119b15760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b0386165f908152600660205260408120556119d4600188613047565b8403611a285742600760189054906101000a90046001600160401b03168460400151611a009190613122565b6001600160401b03161115611a285760405163c44a082160e01b815260040160405180910390fd5b848284602001514233604051602001611a45959493929190612e2b565b6040516020818303038152906040528051906020012094505050508080611a6b90612fe5565b9150506118f4565b50611aa17f0000000000000000000000000000000000000000000000000000000000000000846115316105a7565b6005819055600780546001600160401b03848116600160801b026001600160401b03600160801b03600160c01b0319909216429190911617179055604051639a908e7360e01b81525f906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611b2c9087908690600401612e6a565b6020604051808303815f875af1158015611b48573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b6c9190612e83565b6040519091506001600160401b038216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a2505050505050565b60085460ff16611bcd576040516324eff8c360e01b815260040160405180910390fd5b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c4e9190612c7a565b905081811115611c7157604051632354600f60e01b815260040160405180910390fd5b611388831115611c94576040516328a69b1f60e21b815260040160405180910390fd5b611cc96001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163330846124e3565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d26573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d4a9190612c7a565b60078054919250600160401b9091046001600160401b0316906008611d6e83612f95565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508484604051611da3929190613142565b604051908190038120611dbc9183904290602001612fc2565b60408051808303601f190181529181528151602092830120600754600160401b90046001600160401b03165f9081526006909352912055323303611e4b576007546040805183815233602082015260609181018290525f91810191909152600160401b9091046001600160401b0316905f8051602061323d8339815191529060800160405180910390a2611e95565b600760089054906101000a90046001600160401b03166001600160401b03165f8051602061323d83398151915282338888604051611e8c9493929190613151565b60405180910390a25b5050505050565b6001600160a01b03163b151590565b6002546001600160a01b03163314611ed6576040516311e7be1560e01b815260040160405180910390fd5b815f819003611ef85760405163cb591a5f60e01b815260040160405180910390fd5b6103e8811115611f1b57604051635acfba9d60e11b815260040160405180910390fd5b6007546005546001600160401b0380831692600160801b90041690815f5b858110156121e9575f898983818110611f5457611f54612f2e565b9050602002810190611f669190613185565b611f6f90613199565b805180516020909101206060820151919250906001600160401b0316156120645785611f9a81612f95565b9650505f8183602001518460600151604051602001611fbb93929190612fc2565b60408051601f1981840301815291815281516020928301206001600160401b038a165f9081526006909352912054909150811461200b5760405163671ebaaf60e11b815260040160405180910390fd5b82606001516001600160401b031683604001516001600160401b0316101561204657604051633fbd5c3960e11b815260040160405180910390fd5b506001600160401b0386165f90815260066020526040812055612146565b602082015115801590612102575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303815f875af11580156120dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121009190612c7a565b155b15612120576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c01015612146576040516328a69b1f60e21b815260040160405180910390fd5b866001600160401b031682604001516001600160401b0316108061217657504282604001516001600160401b0316115b15612194576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518c6040516020016121b5959493929190612e2b565b60405160208183030381529060405280519060200120945081604001519650505080806121e190612fe5565b915050611f39565b506007546001600160401b03600160401b909104811690841611156122215760405163c630a00d60e01b815260040160405180910390fd5b600780546001600160401b0319166001600160401b038681169190911790915560058390558590828116908516146122d1575f61225e8386612ca5565b90506122736001600160401b03821683613047565b91506122ab7f0000000000000000000000000000000000000000000000000000000000000000826001600160401b03166115316105a7565b5060078054600160801b600160c01b031916600160801b6001600160401b038716021790555b612353337f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611614573d5f803e3d5ffd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156123ab575f80fd5b505af11580156123bd573d5f803e3d5ffd5b5050604051639a908e7360e01b81525f92506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150639a908e7390612411908a908890600401612e6a565b6020604051808303815f875af115801561242d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124519190612e83565b6040519091506001600160401b038216905f8051602061321d833981519152905f90a250505050505050505050565b6040516001600160a01b038316602482015260448101829052610ccd90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612521565b6040516001600160a01b038085166024830152831660448201526064810182905261251b9085906323b872dd60e01b906084016124ac565b50505050565b5f612575826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166125f29092919063ffffffff16565b805190915015610ccd57808060200190518101906125939190612e9e565b610ccd5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610897565b606061260084845f85612608565b949350505050565b6060824710156126695760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610897565b5f80866001600160a01b03168587604051612684919061320b565b5f6040518083038185875af1925050503d805f81146126be576040519150601f19603f3d011682016040523d82523d5f602084013e6126c3565b606091505b50915091506126d4878383876126df565b979650505050505050565b6060831561274b5782515f03612744576126f885611e9c565b6127445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610897565b5081612600565b61260083838151156127605781518083602001fd5b8060405162461bcd60e51b815260040161089791906127c7565b5f5b8381101561279457818101518382015260200161277c565b50505f910152565b5f81518084526127b381602086016020860161277a565b601f01601f19169290920160200192915050565b602081525f6127d9602083018461279c565b9392505050565b6001600160a01b0391909116815260200190565b6001600160401b0381168114612808575f80fd5b50565b80356001600160a01b0381168114612821575f80fd5b919050565b5f805f60608486031215612838575f80fd5b8335612843816127f4565b9250602084013591506128586040850161280b565b90509250925092565b803563ffffffff81168114612821575f80fd5b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b03811182821017156128aa576128aa612874565b60405290565b5f82601f8301126128bf575f80fd5b81356001600160401b03808211156128d9576128d9612874565b604051601f8301601f19908116603f0116810190828211818310171561290157612901612874565b81604052838152866020858801011115612919575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a03121561294e575f80fd5b6129578861280b565b96506129656020890161280b565b955061297360408901612861565b94506129816060890161280b565b935061298f60808901612861565b925060a08801356001600160401b03808211156129aa575f80fd5b6129b68b838c016128b0565b935060c08a01359150808211156129cb575f80fd5b506129d88a828b016128b0565b91505092959891949750929550565b5f602082840312156129f7575f80fd5b81356127d9816127f4565b5f8083601f840112612a12575f80fd5b5081356001600160401b03811115612a28575f80fd5b6020830191508360208260051b8501011115612a42575f80fd5b9250929050565b5f805f60408486031215612a5b575f80fd5b83356001600160401b03811115612a70575f80fd5b612a7c86828701612a02565b909450925061285890506020850161280b565b5f60208284031215612a9f575f80fd5b6127d98261280b565b5f805f60608486031215612aba575f80fd5b612ac384612861565b9250612ad16020850161280b565b915061285860408501612861565b5f8083601f840112612aef575f80fd5b5081356001600160401b03811115612b05575f80fd5b602083019150836020828501011115612a42575f80fd5b5f805f805f60608688031215612b30575f80fd5b85356001600160401b0380821115612b46575f80fd5b818801915088601f830112612b59575f80fd5b813581811115612b67575f80fd5b8960208260071b8501011115612b7b575f80fd5b60208301975080965050612b916020890161280b565b94506040880135915080821115612ba6575f80fd5b50612bb388828901612adf565b969995985093965092949392505050565b5f60208284031215612bd4575f80fd5b81356001600160401b03811115612be9575f80fd5b612600848285016128b0565b5f8060208385031215612c06575f80fd5b82356001600160401b03811115612c1b575f80fd5b612c2785828601612a02565b90969095509350505050565b5f805f60408486031215612c45575f80fd5b83356001600160401b03811115612c5a575f80fd5b612c6686828701612adf565b909790965060209590950135949350505050565b5f60208284031215612c8a575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612cc557612cc5612c91565b5092915050565b5f82612ce657634e487b7160e01b5f52601260045260245ffd5b500490565b600181811c90821680612cff57607f821691505b602082108103612d1d57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610ccd575f81815260208120601f850160051c81016020861015612d495750805b601f850160051c820191505b81811015612d6857828155600101612d55565b505050505050565b81516001600160401b03811115612d8957612d89612874565b612d9d81612d978454612ceb565b84612d23565b602080601f831160018114612dd0575f8415612db95750858301515b5f19600386901b1c1916600185901b178555612d68565b5f85815260208120601f198616915b82811015612dfe57888601518255948401946001909101908401612ddf565b5085821015612e1b57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b6001600160401b03929092168252602082015260400190565b5f60208284031215612e93575f80fd5b81516127d9816127f4565b5f60208284031215612eae575f80fd5b815180151581146127d9575f80fd5b5f8351612ece81846020880161277a565b835190830190612ee281836020880161277a565b01949350505050565b5f8651612efc818460208b0161277a565b9190910194855250602084019290925260f81b6001600160f81b03199081166040840152166041820152604201919050565b634e487b7160e01b5f52603260045260245ffd5b5f60808284031215612f52575f80fd5b612f5a612888565b82358152602083013560208201526040830135612f76816127f4565b60408201526060830135612f89816127f4565b60608201529392505050565b5f6001600160401b038281166002600160401b03198101612fb857612fb8612c91565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b5f60018201612ff657612ff6612c91565b5060010190565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b838152604060208201525f61303e604083018486612ffd565b95945050505050565b8181038181111561305a5761305a612c91565b92915050565b808202811582820484141761305a5761305a612c91565b8082018082111561305a5761305a612c91565b5f8235605e1983360301811261309e575f80fd5b9190910192915050565b5f606082360312156130b8575f80fd5b604051606081016001600160401b0380821183831017156130db576130db612874565b8160405284359150808211156130ef575f80fd5b506130fc368286016128b0565b825250602083013560208201526040830135613117816127f4565b604082015292915050565b6001600160401b03818116838216019080821115612cc557612cc5612c91565b818382375f9101908152919050565b8481526001600160a01b03841660208201526060604082018190525f9061317b9083018486612ffd565b9695505050505050565b5f8235607e1983360301811261309e575f80fd5b5f608082360312156131a9575f80fd5b6131b1612888565b82356001600160401b038111156131c6575f80fd5b6131d2368286016128b0565b8252506020830135602082015260408301356131ed816127f4565b60408201526060830135613200816127f4565b606082015292915050565b5f825161309e81846020870161277a56fe303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fcef94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931f8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a26469706673582212207485279590b273ca494dfb980e9f20847a93dcde1b38eb0b3e71158ed47488ba64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106101e0575f3560e01c8062d0295d146101e4578063107bf28c146101ff57806319d8ac6114610214578063267822471461023f5780632b35b3ac1461025f57806332c2d1531461027c5780633c351e10146102915780633cbc795b146102a957806340b5de6c146102d557806345605267146102fd57806347ebf1081461031757806349b7b8021461032a5780634c21fef3146103515780634e48770614610365578063542028d51461037857806356e29435146103805780635e9145c9146103a75780635ec91958146103ba5780636b8616ce146103c25780636e05d2cd146103e15780636ff512cc146103ea5780638c3d7301146103fd57806399af0397146104055780639e00187714610418578063a3c573eb14610433578063aa3587d31461045a578063ada8f91914610462578063b0afe15414610475578063b81fcafd14610481578063c754c7ed14610494578063c89e42df146104ae578063cfa8ed47146104c1578063d02103ca146104d4578063d690be31146104fb578063d7bc90ff14610503578063d8d1091b1461050e578063e46761c414610521578063e7a7ed0214610548578063eaeb077b14610562578063f35dda4714610575578063f851a4401461058f575b5f80fd5b6101ec6105a7565b6040519081526020015b60405180910390f35b61020761068a565b6040516101f691906127c7565b600754610227906001600160401b031681565b6040516001600160401b0390911681526020016101f6565b600154610252906001600160a01b031681565b6040516101f691906127e0565b60085461026c9060ff1681565b60405190151581526020016101f6565b61028f61028a366004612826565b610716565b005b6008546102529061010090046001600160a01b031681565b6008546102c090600160a81b900463ffffffff1681565b60405163ffffffff90911681526020016101f6565b6102e46001600160f81b031981565b6040516001600160f81b031990911681526020016101f6565b60075461022790600160801b90046001600160401b031681565b61028f610325366004612938565b6107b1565b6102527f000000000000000000000000000000000000000000000000000000000000000081565b60085461026c90600160c81b900460ff1681565b61028f6103733660046129e7565b610b17565b610207610c8b565b6102527f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103b5366004612a49565b610c98565b61028f610cd2565b6101ec6103d03660046129e7565b60066020525f908152604090205481565b6101ec60055481565b61028f6103f8366004612a8f565b610d5d565b61028f610dd8565b610207610413366004612aa8565b610e64565b61025273a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6102527f000000000000000000000000000000000000000000000000000000000000000081565b61028f610feb565b61028f610470366004612a8f565b611064565b6101ec6405ca1ab1e081565b61028f61048f366004612b1c565b6110df565b60075461022790600160c01b90046001600160401b031681565b61028f6104bc366004612bc4565b6117a3565b600254610252906001600160a01b031681565b6102527f000000000000000000000000000000000000000000000000000000000000000081565b61020761180f565b6101ec635ca1ab1e81565b61028f61051c366004612bf5565b61182b565b6102527f000000000000000000000000000000000000000000000000000000000000000081565b60075461022790600160401b90046001600160401b031681565b61028f610570366004612c33565b611baa565b61057d601b81565b60405160ff90911681526020016101f6565b5f54610252906201000090046001600160a01b031681565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016105f591906127e0565b602060405180830381865afa158015610610573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106349190612c7a565b6007549091505f9061065f906001600160401b03600160801b8204811691600160401b900416612ca5565b6001600160401b03169050805f03610679575f9250505090565b6106838183612ccc565b9250505090565b6004805461069790612ceb565b80601f01602080910402602001604051908101604052809291908181526020018280546106c390612ceb565b801561070e5780601f106106e55761010080835404028352916020019161070e565b820191905f5260205f20905b8154815290600101906020018083116106f157829003601f168201915b505050505081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461075f57604051631736745960e31b815260040160405180910390fd5b806001600160a01b0316836001600160401b03167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966846040516107a491815260200190565b60405180910390a3505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146107fa57604051631736745960e31b815260040160405180910390fd5b5f54610100900460ff161580801561081857505f54600160ff909116105b80610838575061082730611e9c565b15801561083857505f5460ff166001145b6108a05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156108c1575f805461ff0019166101001790555b5f805462010000600160b01b031916620100006001600160a01b038b81169190910291909117909155600280546001600160a01b031916918916919091179055600361090d8482612d70565b50600461091a8382612d70565b50600780546001600160c01b0316610d2f60c71b1790556001600160a01b0385166109645763ffffffff84161561096457604051630d43a60960e11b815260040160405180910390fd5b60088054610100600160c81b0319166101006001600160a01b0388160263ffffffff60a81b191617600160a81b63ffffffff8716021790555f6109a8878787610e64565b90505f818051906020012090505f4290505f805f1b835f801b848e6040516020016109d7959493929190612e2b565b60408051808303601f19018152908290528051602090910120600780546001600160401b0319166001600160401b0386161790556005819055639a908e7360e01b825291505f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639a908e7390610a60906001908690600401612e6a565b6020604051808303815f875af1158015610a7c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa09190612e83565b6040519091506001600160401b038216905f8051602061321d833981519152905f90a250505050508015610b0d575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b5f546201000090046001600160a01b03163314610b4757604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610b745760405163f5e37f2f60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bd0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf49190612e9e565b610c2e576007546001600160401b03600160c01b909104811690821610610c2e5760405163f5e37f2f60e01b815260040160405180910390fd5b600780546001600160c01b0316600160c01b6001600160401b038416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461069790612ceb565b600854600160c81b900460ff16610cc2576040516320864d6d60e21b815260040160405180910390fd5b610ccd838383611eab565b505050565b5f546201000090046001600160a01b03163314610d0257604051634755657960e01b815260040160405180910390fd5b60085460ff1615610d265760405163f6ba91a160e01b815260040160405180910390fd5b6008805460ff191660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f546201000090046001600160a01b03163314610d8d57604051634755657960e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383161790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610c809083906127e0565b6001546001600160a01b03163314610e035760405163d1ec4b2360e01b815260040160405180910390fd5b6001545f8054620100006001600160a01b0390931692830262010000600160b01b03199091161790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e91610e5a916127e0565b60405180910390a1565b60605f60405180606001604052806021815260200161325d6021913960405163ffffffff80881660248301526001600160a01b03871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa60848201525f60a482015260c40160408051601f19818403018152918152602080830180516001600160e01b03166369a3b57f60e11b1790529051610f0293929101612ebd565b60408051601f1981840301815282825280516020808301919091205f80865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015610f6f573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116610fa35760405163668b0cb360e11b815260040160405180910390fd5b6040515f90610fd09084906405ca1ab1e090635ca1ab1e90601b906001600160f81b031990602001612eeb565b60408051808303601f19018152919052979650505050505050565b5f546201000090046001600160a01b0316331461101b57604051634755657960e01b815260040160405180910390fd5b6008805460ff60c81b198116600160c81b9182900460ff16159091021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f41905f90a1565b5f546201000090046001600160a01b0316331461109457604051634755657960e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610c809083906127e0565b6002546001600160a01b0316331461110a576040516311e7be1560e01b815260040160405180910390fd5b835f81900361112c5760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561114f57604051635acfba9d60e11b815260040160405180910390fd5b6007546005546001600160401b0380831692600160801b90041690815f5b858110156113ea575f8b8b8381811061118857611188612f2e565b90506080020180360381019061119e9190612f42565b80516060820151919250906001600160401b03161561128b57856111c181612f95565b9650505f81836020015184606001516040516020016111e293929190612fc2565b60408051601f1981840301815291815281516020928301206001600160401b038a165f908152600690935291205490915081146112325760405163671ebaaf60e11b815260040160405180910390fd5b82606001516001600160401b031683604001516001600160401b0316101561126d57604051633fbd5c3960e11b815260040160405180910390fd5b506001600160401b0386165f90815260066020526040812055611347565b602082015115801590611329575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303815f875af1158015611303573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113279190612c7a565b155b15611347576040516373bd668d60e01b815260040160405180910390fd5b866001600160401b031682604001516001600160401b0316108061137757504282604001516001600160401b0316115b15611395576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518e6040516020016113b6959493929190612e2b565b60405160208183030381529060405280519060200120945081604001519650505080806113e290612fe5565b91505061116d565b506007546001600160401b03600160401b909104811690841611156114225760405163c630a00d60e01b815260040160405180910390fd5b600780546001600160401b0319166001600160401b038616179055600582905560405163063d411f60e51b815285907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063c7a823e0906114949086908c908c90600401613025565b5f6040518083038186803b1580156114aa575f80fd5b505afa1580156114bc573d5f803e3d5ffd5b50505050816001600160401b0316846001600160401b031614611592575f6114e48386612ca5565b90506114f96001600160401b03821683613047565b915061156c7f0000000000000000000000000000000000000000000000000000000000000000826001600160401b03166115316105a7565b61153b9190613060565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190612480565b5060078054600160801b600160c01b031916600160801b6001600160401b038716021790555b611674337f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611614573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116389190612c7a565b6116429190613060565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169291906124e3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156116cc575f80fd5b505af11580156116de573d5f803e3d5ffd5b5050604051639a908e7360e01b81525f92506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150639a908e7390611732908a908890600401612e6a565b6020604051808303815f875af115801561174e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117729190612e83565b6040519091506001600160401b038216905f8051602061321d833981519152905f90a2505050505050505050505050565b5f546201000090046001600160a01b031633146117d357604051634755657960e01b815260040160405180910390fd5b60036117df8282612d70565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c8091906127c7565b60405180606001604052806021815260200161325d6021913981565b60085460ff1661184e576040516324eff8c360e01b815260040160405180910390fd5b805f8190036118705760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561189357604051635acfba9d60e11b815260040160405180910390fd5b6007546001600160401b03600160401b82048116916118bb918491600160801b900416613077565b11156118da5760405163c630a00d60e01b815260040160405180910390fd5b600754600554600160801b9091046001600160401b0316905f5b83811015611a73575f86868381811061190f5761190f612f2e565b9050602002810190611921919061308a565b61192a906130a8565b90508361193681612f95565b825180516020918201208185015160408087015190519499509194505f936119619386939101612fc2565b60408051601f1981840301815291815281516020928301206001600160401b0389165f908152600690935291205490915081146119b15760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b0386165f908152600660205260408120556119d4600188613047565b8403611a285742600760189054906101000a90046001600160401b03168460400151611a009190613122565b6001600160401b03161115611a285760405163c44a082160e01b815260040160405180910390fd5b848284602001514233604051602001611a45959493929190612e2b565b6040516020818303038152906040528051906020012094505050508080611a6b90612fe5565b9150506118f4565b50611aa17f0000000000000000000000000000000000000000000000000000000000000000846115316105a7565b6005819055600780546001600160401b03848116600160801b026001600160401b03600160801b03600160c01b0319909216429190911617179055604051639a908e7360e01b81525f906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611b2c9087908690600401612e6a565b6020604051808303815f875af1158015611b48573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b6c9190612e83565b6040519091506001600160401b038216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a2505050505050565b60085460ff16611bcd576040516324eff8c360e01b815260040160405180910390fd5b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c4e9190612c7a565b905081811115611c7157604051632354600f60e01b815260040160405180910390fd5b611388831115611c94576040516328a69b1f60e21b815260040160405180910390fd5b611cc96001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163330846124e3565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d26573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d4a9190612c7a565b60078054919250600160401b9091046001600160401b0316906008611d6e83612f95565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508484604051611da3929190613142565b604051908190038120611dbc9183904290602001612fc2565b60408051808303601f190181529181528151602092830120600754600160401b90046001600160401b03165f9081526006909352912055323303611e4b576007546040805183815233602082015260609181018290525f91810191909152600160401b9091046001600160401b0316905f8051602061323d8339815191529060800160405180910390a2611e95565b600760089054906101000a90046001600160401b03166001600160401b03165f8051602061323d83398151915282338888604051611e8c9493929190613151565b60405180910390a25b5050505050565b6001600160a01b03163b151590565b6002546001600160a01b03163314611ed6576040516311e7be1560e01b815260040160405180910390fd5b815f819003611ef85760405163cb591a5f60e01b815260040160405180910390fd5b6103e8811115611f1b57604051635acfba9d60e11b815260040160405180910390fd5b6007546005546001600160401b0380831692600160801b90041690815f5b858110156121e9575f898983818110611f5457611f54612f2e565b9050602002810190611f669190613185565b611f6f90613199565b805180516020909101206060820151919250906001600160401b0316156120645785611f9a81612f95565b9650505f8183602001518460600151604051602001611fbb93929190612fc2565b60408051601f1981840301815291815281516020928301206001600160401b038a165f9081526006909352912054909150811461200b5760405163671ebaaf60e11b815260040160405180910390fd5b82606001516001600160401b031683604001516001600160401b0316101561204657604051633fbd5c3960e11b815260040160405180910390fd5b506001600160401b0386165f90815260066020526040812055612146565b602082015115801590612102575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303815f875af11580156120dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121009190612c7a565b155b15612120576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c01015612146576040516328a69b1f60e21b815260040160405180910390fd5b866001600160401b031682604001516001600160401b0316108061217657504282604001516001600160401b0316115b15612194576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518c6040516020016121b5959493929190612e2b565b60405160208183030381529060405280519060200120945081604001519650505080806121e190612fe5565b915050611f39565b506007546001600160401b03600160401b909104811690841611156122215760405163c630a00d60e01b815260040160405180910390fd5b600780546001600160401b0319166001600160401b038681169190911790915560058390558590828116908516146122d1575f61225e8386612ca5565b90506122736001600160401b03821683613047565b91506122ab7f0000000000000000000000000000000000000000000000000000000000000000826001600160401b03166115316105a7565b5060078054600160801b600160c01b031916600160801b6001600160401b038716021790555b612353337f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611614573d5f803e3d5ffd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156123ab575f80fd5b505af11580156123bd573d5f803e3d5ffd5b5050604051639a908e7360e01b81525f92506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150639a908e7390612411908a908890600401612e6a565b6020604051808303815f875af115801561242d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124519190612e83565b6040519091506001600160401b038216905f8051602061321d833981519152905f90a250505050505050505050565b6040516001600160a01b038316602482015260448101829052610ccd90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612521565b6040516001600160a01b038085166024830152831660448201526064810182905261251b9085906323b872dd60e01b906084016124ac565b50505050565b5f612575826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166125f29092919063ffffffff16565b805190915015610ccd57808060200190518101906125939190612e9e565b610ccd5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610897565b606061260084845f85612608565b949350505050565b6060824710156126695760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610897565b5f80866001600160a01b03168587604051612684919061320b565b5f6040518083038185875af1925050503d805f81146126be576040519150601f19603f3d011682016040523d82523d5f602084013e6126c3565b606091505b50915091506126d4878383876126df565b979650505050505050565b6060831561274b5782515f03612744576126f885611e9c565b6127445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610897565b5081612600565b61260083838151156127605781518083602001fd5b8060405162461bcd60e51b815260040161089791906127c7565b5f5b8381101561279457818101518382015260200161277c565b50505f910152565b5f81518084526127b381602086016020860161277a565b601f01601f19169290920160200192915050565b602081525f6127d9602083018461279c565b9392505050565b6001600160a01b0391909116815260200190565b6001600160401b0381168114612808575f80fd5b50565b80356001600160a01b0381168114612821575f80fd5b919050565b5f805f60608486031215612838575f80fd5b8335612843816127f4565b9250602084013591506128586040850161280b565b90509250925092565b803563ffffffff81168114612821575f80fd5b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b03811182821017156128aa576128aa612874565b60405290565b5f82601f8301126128bf575f80fd5b81356001600160401b03808211156128d9576128d9612874565b604051601f8301601f19908116603f0116810190828211818310171561290157612901612874565b81604052838152866020858801011115612919575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a03121561294e575f80fd5b6129578861280b565b96506129656020890161280b565b955061297360408901612861565b94506129816060890161280b565b935061298f60808901612861565b925060a08801356001600160401b03808211156129aa575f80fd5b6129b68b838c016128b0565b935060c08a01359150808211156129cb575f80fd5b506129d88a828b016128b0565b91505092959891949750929550565b5f602082840312156129f7575f80fd5b81356127d9816127f4565b5f8083601f840112612a12575f80fd5b5081356001600160401b03811115612a28575f80fd5b6020830191508360208260051b8501011115612a42575f80fd5b9250929050565b5f805f60408486031215612a5b575f80fd5b83356001600160401b03811115612a70575f80fd5b612a7c86828701612a02565b909450925061285890506020850161280b565b5f60208284031215612a9f575f80fd5b6127d98261280b565b5f805f60608486031215612aba575f80fd5b612ac384612861565b9250612ad16020850161280b565b915061285860408501612861565b5f8083601f840112612aef575f80fd5b5081356001600160401b03811115612b05575f80fd5b602083019150836020828501011115612a42575f80fd5b5f805f805f60608688031215612b30575f80fd5b85356001600160401b0380821115612b46575f80fd5b818801915088601f830112612b59575f80fd5b813581811115612b67575f80fd5b8960208260071b8501011115612b7b575f80fd5b60208301975080965050612b916020890161280b565b94506040880135915080821115612ba6575f80fd5b50612bb388828901612adf565b969995985093965092949392505050565b5f60208284031215612bd4575f80fd5b81356001600160401b03811115612be9575f80fd5b612600848285016128b0565b5f8060208385031215612c06575f80fd5b82356001600160401b03811115612c1b575f80fd5b612c2785828601612a02565b90969095509350505050565b5f805f60408486031215612c45575f80fd5b83356001600160401b03811115612c5a575f80fd5b612c6686828701612adf565b909790965060209590950135949350505050565b5f60208284031215612c8a575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612cc557612cc5612c91565b5092915050565b5f82612ce657634e487b7160e01b5f52601260045260245ffd5b500490565b600181811c90821680612cff57607f821691505b602082108103612d1d57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610ccd575f81815260208120601f850160051c81016020861015612d495750805b601f850160051c820191505b81811015612d6857828155600101612d55565b505050505050565b81516001600160401b03811115612d8957612d89612874565b612d9d81612d978454612ceb565b84612d23565b602080601f831160018114612dd0575f8415612db95750858301515b5f19600386901b1c1916600185901b178555612d68565b5f85815260208120601f198616915b82811015612dfe57888601518255948401946001909101908401612ddf565b5085821015612e1b57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b6001600160401b03929092168252602082015260400190565b5f60208284031215612e93575f80fd5b81516127d9816127f4565b5f60208284031215612eae575f80fd5b815180151581146127d9575f80fd5b5f8351612ece81846020880161277a565b835190830190612ee281836020880161277a565b01949350505050565b5f8651612efc818460208b0161277a565b9190910194855250602084019290925260f81b6001600160f81b03199081166040840152166041820152604201919050565b634e487b7160e01b5f52603260045260245ffd5b5f60808284031215612f52575f80fd5b612f5a612888565b82358152602083013560208201526040830135612f76816127f4565b60408201526060830135612f89816127f4565b60608201529392505050565b5f6001600160401b038281166002600160401b03198101612fb857612fb8612c91565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b5f60018201612ff657612ff6612c91565b5060010190565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b838152604060208201525f61303e604083018486612ffd565b95945050505050565b8181038181111561305a5761305a612c91565b92915050565b808202811582820484141761305a5761305a612c91565b8082018082111561305a5761305a612c91565b5f8235605e1983360301811261309e575f80fd5b9190910192915050565b5f606082360312156130b8575f80fd5b604051606081016001600160401b0380821183831017156130db576130db612874565b8160405284359150808211156130ef575f80fd5b506130fc368286016128b0565b825250602083013560208201526040830135613117816127f4565b604082015292915050565b6001600160401b03818116838216019080821115612cc557612cc5612c91565b818382375f9101908152919050565b8481526001600160a01b03841660208201526060604082018190525f9061317b9083018486612ffd565b9695505050505050565b5f8235607e1983360301811261309e575f80fd5b5f608082360312156131a9575f80fd5b6131b1612888565b82356001600160401b038111156131c6575f80fd5b6131d2368286016128b0565b8252506020830135602082015260408301356131ed816127f4565b60408201526060830135613200816127f4565b606082015292915050565b5f825161309e81846020870161277a56fe303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fcef94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931f8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a26469706673582212207485279590b273ca494dfb980e9f20847a93dcde1b38eb0b3e71158ed47488ba64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonRollupManager.json b/compiled-contracts/paris/PolygonRollupManager.json index 297d08abf..ceb41c57d 100644 --- a/compiled-contracts/paris/PolygonRollupManager.json +++ b/compiled-contracts/paris/PolygonRollupManager.json @@ -1749,9 +1749,9 @@ { "inputs": [ { - "internalType": "uint64", + "internalType": "uint32", "name": "rollupTypeID", - "type": "uint64" + "type": "uint32" } ], "name": "rollupTypeMap", @@ -2027,8 +2027,8 @@ "type": "function" } ], - "bytecode": "0x60e06040523480156200001157600080fd5b5060405162005d4638038062005d4683398101604081905262000034916200006b565b6001600160a01b0392831660805290821660c0521660a052620000bf565b6001600160a01b03811681146200006857600080fd5b50565b6000806000606084860312156200008157600080fd5b83516200008e8162000052565b6020850151909350620000a18162000052565b6040850151909250620000b48162000052565b809150509250925092565b60805160a05160c051615c1f6200012760003960008181610a0f01528181611c93015261371a0152600081816107010152818161281b01526139d801526000818161095201528181610c6601528181610e16015281816119d701526138c70152615c1f6000f3fe60806040523480156200001157600080fd5b5060043610620003095760003560e01c806391d14854116200019d578063ceee281d11620000eb578063dde0ff77116200009e578063dde0ff7714620009c0578063e0bfd3d214620009db578063e136edf714620009f2578063e46761c41462000a09578063f34eb8eb1462000a31578063f4e926751462000a48578063f9c4c2ae1462000a5957600080fd5b8063ceee281d1462000923578063d02103ca146200094c578063d5073f6f1462000974578063d547741f146200098b578063d939b31514620009a2578063dbc1697614620009b657600080fd5b8063a2967d991162000150578063a2967d9914620006f1578063a3c573eb14620006fb578063a4810bb2146200073c578063afd23cbe14620007eb578063b99d0ad71462000815578063c1acbc3414620008f1578063c4c928c2146200090c57600080fd5b806391d14854146200068257806399f5634e14620006995780639a908e7314620006a35780639c9f3dfe14620006ba578063a066215c14620006d1578063a217fddf14620006e857600080fd5b80632f2ff15d116200025b57806360469169116200020e5780636046916914620005c95780637222020f14620005d35780637975fcfe14620005ea5780637fb6e76a1462000610578063841b24d7146200063957806387c20c0114620006545780638bd4f071146200066b57600080fd5b80632f2ff15d146200052057806336568abe1462000537578063394218e9146200054e578063477fa27014620005655780634d4d3338146200056e57806355a71ee0146200058557600080fd5b806315064c9611620002c057806315064c9614620003c95780631608859c14620003d75780631796a1ae14620003ee5780631816b7e514620004155780632072f6c5146200042c578063248a9ca3146200043657806325280169146200046b57600080fd5b8063066ec012146200030e578063080b3111146200033f5780630a0d9fbe146200036757806311f6b287146200038257806312b86e1914620003995780631489ed1014620003b2575b600080fd5b60845462000322906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b62000356620003503660046200467c565b62000b70565b604051901515815260200162000336565b6085546200032290600160401b90046001600160401b031681565b6200032262000393366004620046b4565b62000b9a565b620003b0620003aa366004620046e5565b62000bba565b005b620003b0620003c336600462004792565b62000d6a565b606f54620003569060ff1681565b620003b0620003e83660046200467c565b62000f00565b607e54620003ff9063ffffffff1681565b60405163ffffffff909116815260200162000336565b620003b0620004263660046200481c565b62000f95565b620003b062001041565b6200045c6200044736600462004849565b60009081526034602052604090206001015490565b60405190815260200162000336565b620004ec6200047c3660046200467c565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b0390811691830191909152928201519092169082015260600162000336565b620003b06200053136600462004863565b620010bb565b620003b06200054836600462004863565b620010e4565b620003b06200055f36600462004896565b6200111e565b6086546200045c565b620003b06200057f366004620048b4565b620011d2565b6200045c620005963660046200467c565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b6200045c6200171f565b620003b0620005e4366004620046b4565b62001737565b62000601620005fb3660046200496a565b62001833565b60405162000336919062004a24565b620003ff6200062136600462004896565b60836020526000908152604090205463ffffffff1681565b6084546200032290600160c01b90046001600160401b031681565b620003b06200066536600462004792565b62001866565b620003b06200067c366004620046e5565b62001b90565b620003566200069336600462004863565b62001c46565b6200045c62001c71565b62000322620006b436600462004a39565b62001d58565b620003b0620006cb36600462004896565b62001f2a565b620003b0620006e236600462004896565b62001fd0565b6200045c600081565b6200045c62002074565b620007237f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200162000336565b620007a16200074d36600462004896565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c00162000336565b6085546200080190600160801b900461ffff1681565b60405161ffff909116815260200162000336565b620008ab620008263660046200467c565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b60405162000336919060006080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200032290600160801b90046001600160401b031681565b620003b06200091d36600462004a66565b62002449565b620003ff6200093436600462004afe565b60826020526000908152604090205463ffffffff1681565b620007237f000000000000000000000000000000000000000000000000000000000000000081565b620003b06200098536600462004849565b62002728565b620003b06200099c36600462004863565b620027c4565b60855462000322906001600160401b031681565b620003b0620027ed565b6084546200032290600160401b90046001600160401b031681565b620003b0620009ec36600462004b30565b6200289b565b620003b062000a0336600462004c56565b62002934565b620007237f000000000000000000000000000000000000000000000000000000000000000081565b620003b062000a4236600462004d36565b62002db9565b608054620003ff9063ffffffff1681565b62000af062000a6a366004620046b4565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff166101608201526101800162000336565b63ffffffff8216600090815260816020526040812062000b91908362002fb8565b90505b92915050565b63ffffffff8116600090815260816020526040812062000b949062002ffd565b60008051602062005bca83398151915262000bd5816200306e565b63ffffffff8916600090815260816020526040902062000bfc818a8a8a8a8a8a8a6200307a565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000c64576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000c9d62002074565b6040518263ffffffff1660e01b815260040162000cbc91815260200190565b600060405180830381600087803b15801562000cd757600080fd5b505af115801562000cec573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005bca83398151915262000d85816200306e565b63ffffffff8916600090815260816020526040902062000dac818a8a8a8a8a8a8a62003413565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562000e14576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000e4d62002074565b6040518263ffffffff1660e01b815260040162000e6c91815260200190565b600060405180830381600087803b15801562000e8757600080fd5b505af115801562000e9c573d6000803e3d6000fd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff8216600090815260816020526040902062000f3060008051602062005bca8339815191523362001c46565b62000f8457606f5460ff161562000f5a57604051630bc011ff60e21b815260040160405180910390fd5b62000f66818362002fb8565b62000f8457604051630674f25160e11b815260040160405180910390fd5b62000f908183620037e4565b505050565b60008051602062005b8a83398151915262000fb0816200306e565b6103e88261ffff16108062000fca57506103ff8261ffff16115b1562000fe957604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200105c60008051602062005baa8339815191523362001c46565b620010af576084544290620010869062093a8090600160801b90046001600160401b031662004de3565b6001600160401b03161115620010af5760405163692baaad60e11b815260040160405180910390fd5b620010b9620039d6565b565b600082815260346020526040902060010154620010d8816200306e565b62000f90838362003a55565b6001600160a01b03811633146200110e57604051630b4ad1cd60e31b815260040160405180910390fd5b6200111a828262003ac1565b5050565b60008051602062005b8a83398151915262001139816200306e565b606f5460ff166200117b576084546001600160401b03600160c01b9091048116908316106200117b5760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19060200162001035565b600054600290610100900460ff16158015620011f5575060005460ff8083169116105b6200125e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b179055620012df62003b2b565b620012fa60008051602062005bca8339815191528a62003b98565b6200130760008662003b98565b620013337fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908662003b98565b6200135f7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8662003b98565b6200138b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8662003b98565b620013b77fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8762003b98565b620013e37fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088762003b98565b6200140f7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48762003b98565b6200142a60008051602062005b8a8339815191528762003b98565b6200146560008051602062005bca8339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062003ba4565b620014917f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08762003b98565b620014bd7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8762003b98565b620014f860008051602062005baa8339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162003ba4565b6200151360008051602062005baa8339815191528562003b98565b6200153f7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518562003b98565b6000620015548484600561044d600062003bef565b6073546074549192506001600160401b03600160401b909104811691168082146200159257604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b0381811660008181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620016949695831695600160581b909104909216936076936077939192919091169060040162004eb9565b600060405180830381600087803b158015620016af57600080fd5b505af1158015620016c4573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498935060200191506200170c9050565b60405180910390a1505050505050505050565b6000608654606462001732919062004f1e565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd62001763816200306e565b63ffffffff82161580620017825750607e5463ffffffff908116908316115b15620017a157604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff1615159003620017e857604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b63ffffffff861660009081526081602052604090206060906200185b90878787878762003e14565b979650505050505050565b606f5460ff16156200188b57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a811686526003830190945291909320600101544292620018da92600160c01b90048116911662004de3565b6001600160401b031611156200190357604051638a0704d360e01b815260040160405180910390fd5b6103e862001912888862004f38565b6001600160401b031611156200193b57604051635acfba9d60e11b815260040160405180910390fd5b6200194d818989898989898962003413565b62001959818762003f54565b6085546001600160401b031660000362001a6757600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b90041615620019d5576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001a0e62002074565b6040518263ffffffff1660e01b815260040162001a2d91815260200190565b600060405180830381600087803b15801562001a4857600080fd5b505af115801562001a5d573d6000803e3d6000fd5b5050505062001b31565b62001a728162004151565b600681018054600160801b90046001600160401b031690601062001a968362004f5b565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff161562001bb557604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff8816600090815260816020526040902062001bdc81898989898989896200307a565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a162001c3b620039d6565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b815230600482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562001cdb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001d01919062004f84565b60845490915060009062001d28906001600160401b03600160401b82048116911662004f38565b6001600160401b031690508060000362001d455760009250505090565b62001d51818362004fb4565b9250505090565b606f5460009060ff161562001d8057604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362001db8576040516371653c1560e01b815260040160405180910390fd5b836001600160401b031660000362001de357604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81166000908152608160205260408120608480549192879262001e169084906001600160401b031662004de3565b82546101009290920a6001600160401b038181021990931691831602179091556006830154169050600062001e4c878362004de3565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b03199092169290931691909117179055905062001edc8362004151565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b60008051602062005b8a83398151915262001f45816200306e565b606f5460ff1662001f80576085546001600160401b039081169083161062001f805760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759060200162001035565b60008051602062005b8a83398151915262001feb816200306e565b62015180826001600160401b031611156200201957604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289060200162001035565b60805460009063ffffffff168082036200209057506000919050565b6000816001600160401b03811115620020ad57620020ad62004bac565b604051908082528060200260200182016040528015620020d7578160200160208202803683370190505b50905060005b828110156200214a5760816000620020f783600162004fcb565b63ffffffff1663ffffffff168152602001908152602001600020600501548282815181106200212a576200212a62004fe1565b602090810291909101015280620021418162004ff7565b915050620020dd565b50600060205b83600114620023a65760006200216860028662005013565b6200217560028762004fb4565b62002181919062004fcb565b90506000816001600160401b03811115620021a057620021a062004bac565b604051908082528060200260200182016040528015620021ca578160200160208202803683370190505b50905060005b828110156200235257620021e66001846200502a565b81148015620022015750620021fd60028862005013565b6001145b156200228957856200221582600262004f1e565b8151811062002228576200222862004fe1565b6020026020010151856040516020016200224c929190918252602082015260400190565b6040516020818303038152906040528051906020012082828151811062002277576200227762004fe1565b6020026020010181815250506200233d565b856200229782600262004f1e565b81518110620022aa57620022aa62004fe1565b602002602001015186826002620022c2919062004f1e565b620022cf90600162004fcb565b81518110620022e257620022e262004fe1565b602002602001015160405160200162002305929190918252602082015260400190565b6040516020818303038152906040528051906020012082828151811062002330576200233062004fe1565b6020026020010181815250505b80620023498162004ff7565b915050620021d0565b50809450819550838460405160200162002376929190918252602082015260400190565b60405160208183030381529060405280519060200120935082806200239b9062005040565b935050505062002150565b600083600081518110620023be57620023be62004fe1565b6020026020010151905060005b828110156200243f57604080516020810184905290810185905260600160408051601f19818403018152828252805160209182012090830187905290820186905292506060016040516020818303038152906040528051906020012093508080620024369062004ff7565b915050620023cb565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac62002475816200306e565b63ffffffff84161580620024945750607e5463ffffffff908116908516115b15620024b357604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff1690819003620024f4576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b0316036200254357604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff16151590036200258a57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b9092041614620025c857604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790556000620026488462000b9a565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef286926200269e9216908b908b906004016200505a565b600060405180830381600087803b158015620026b957600080fd5b505af1158015620026ce573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002754816200306e565b683635c9adc5dea000008211806200276f5750633b9aca0082105b156200278e57604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001035565b600082815260346020526040902060010154620027e1816200306e565b62000f90838362003ac1565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002819816200306e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200287557600080fd5b505af11580156200288a573d6000803e3d6000fd5b50505050620028986200421c565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e620028c7816200306e565b6001600160401b03841660009081526083602052604090205463ffffffff161562002905576040516337c8fe0960e11b815260040160405180910390fd5b600062002916888888888762003bef565b60008080526002909101602052604090209390935550505050505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd0862002960816200306e565b63ffffffff891615806200297f5750607e5463ffffffff908116908a16115b156200299e57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff89166000908152607f60205260409020600180820154600160e81b900460ff1615159003620029e557604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03891660009081526083602052604090205463ffffffff161562002a23576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062002a3e9063ffffffff166200509a565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162002a8c9062004641565b62002a9a93929190620050b6565b604051809103906000f08015801562002ab7573d6000803e3d6000fd5b50905081608360008d6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508b8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508c63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f9a84992ead4481f37097c7663e97ed883b31f216fae5685c6ee576a656483cd98e848f8d8d60405162002d3495949392919063ffffffff95861681526001600160a01b0394851660208201526001600160401b03939093166040840152921660608201529116608082015260a00190565b60405180910390a26040516308fd7e2160e31b81526001600160a01b038316906347ebf1089062002d76908e908e9088908f908f908f908f90600401620050ed565b600060405180830381600087803b15801562002d9157600080fd5b505af115801562002da6573d6000803e3d6000fd5b5050505050505050505050505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002de5816200306e565b607e805460009190829062002e009063ffffffff166200509a565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff166001600160401b0316815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002fa6969594939291906200515a565b60405180910390a25050505050505050565b6085546001600160401b0382811660009081526004850160205260408120549092429262002feb92918116911662004de3565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b03161562003051575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002898813362004275565b60078801546000906001600160401b039081169087161015620030b05760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620031515760068901546001600160401b03600160801b90910481169089161115620030fa5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200314a57604051632bd2e3e760e01b815260040160405180910390fd5b50620031c6565b506001600160401b0385166000908152600289016020526040902054806200318c576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620031c657604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620031ff5750876001600160401b0316876001600160401b031611155b8062003223575060068901546001600160401b03600160c01b909104811690881611155b15620032425760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b900481169086161462003289576040516332a2a77f60e01b815260040160405180910390fd5b60006200329b8a888888868962003e14565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620032d29190620051b3565b602060405180830381855afa158015620032f0573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003315919062004f84565b62003321919062005013565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200336591889190600401620051d1565b602060405180830381865afa15801562003383573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620033a991906200520e565b620033c7576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620034065760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620034218a62002ffd565b60078b01549091506001600160401b039081169089161015620034575760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620034fa5760068a01546001600160401b03600160801b9091048116908a161115620034a15760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620034f357604051632bd2e3e760e01b815260040160405180910390fd5b506200356a565b6001600160401b038816600090815260028b01602052604090205491508162003536576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200356a57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b0316116200359d5760405163b9b18f5760e01b815260040160405180910390fd5b6000620035af8b8a8a8a878b62003e14565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620035e69190620051b3565b602060405180830381855afa15801562003604573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003629919062004f84565b62003635919062005013565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200367991899190600401620051d1565b602060405180830381865afa15801562003697573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620036bd91906200520e565b620036db576040516309bde33960e01b815260040160405180910390fd5b6000620036e9848b62004f38565b90506200374287826001600160401b03166200370462001c71565b62003710919062004f1e565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906200429f565b80608460088282829054906101000a90046001600160401b031662003768919062004de3565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d1539060640162002d76565b60068201546001600160401b03600160c01b909104811690821611158062003823575060068201546001600160401b03600160801b9091048116908216115b15620038425760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620038fe62002074565b6040518263ffffffff1660e01b81526004016200391d91815260200190565b600060405180830381600087803b1580156200393857600080fd5b505af11580156200394d573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003a3257600080fd5b505af115801562003a47573d6000803e3d6000fd5b50505050620010b9620042f3565b62003a61828262001c46565b6200111a5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003acd828262001c46565b156200111a5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600054610100900460ff16620010b95760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162001255565b6200111a828262003a55565b600082815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080546000918291829062003c0b9063ffffffff166200509a565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000866001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508060826000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150868260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550858260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550838260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003e0294939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003e4a575081155b1562003e695760405163340c614f60e11b815260040160405180910390fd5b8062003e88576040516366385b5160e01b815260040160405180910390fd5b62003e938462004350565b62003eb1576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b600062003f618362002ffd565b90508160008062003f73848462004f38565b6085546001600160401b03918216925060009162003f9a91600160401b900416426200502a565b90505b846001600160401b0316846001600160401b03161462004024576001600160401b0380851660009081526003890160205260409020600181015490911682101562003fff576001810154600160401b90046001600160401b031694506200401d565b6200400b868662004f38565b6001600160401b031693505062004024565b5062003f9d565b60006200403284846200502a565b9050838110156200409057808403600c811162004050578062004053565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a608654028162004085576200408562004f9e565b046086555062004108565b838103600c8111620040a35780620040a6565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a76400000281620040e057620040e062004f9e565b04905080608654670de0b6b3a7640000028162004101576200410162004f9e565b0460865550505b683635c9adc5dea0000060865411156200412f57683635c9adc5dea0000060865562004147565b633b9aca0060865410156200414757633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b909204161115620028985760068101546000906200419c90600160c01b90046001600160401b0316600162004de3565b9050620041aa828262002fb8565b156200111a576006820154600090600290620041d8908490600160801b90046001600160401b031662004f38565b620041e4919062005232565b620041f0908362004de3565b9050620041fe838262002fb8565b15620042105762000f908382620037e4565b62000f908383620037e4565b606f5460ff166200424057604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b62004281828262001c46565b6200111a57604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905262000f90908490620043d6565b606f5460ff16156200431857604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b03831610801562004387575067ffffffff00000001604083901c6001600160401b0316105b8015620043a8575067ffffffff00000001608083901c6001600160401b0316105b8015620043c0575067ffffffff0000000160c083901c105b15620043ce57506001919050565b506000919050565b60006200442d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620044af9092919063ffffffff16565b80519091501562000f9057808060200190518101906200444e91906200520e565b62000f905760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162001255565b6060620044c08484600085620044c8565b949350505050565b6060824710156200452b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162001255565b600080866001600160a01b03168587604051620045499190620051b3565b60006040518083038185875af1925050503d806000811462004588576040519150601f19603f3d011682016040523d82523d6000602084013e6200458d565b606091505b50915091506200185b87838387606083156200460e57825160000362004606576001600160a01b0385163b620046065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001255565b5081620044c0565b620044c08383815115620046255781518083602001fd5b8060405162461bcd60e51b815260040162001255919062004a24565b61092e806200525c83390190565b803563ffffffff811681146200306957600080fd5b80356001600160401b03811681146200306957600080fd5b600080604083850312156200469057600080fd5b6200469b836200464f565b9150620046ab6020840162004664565b90509250929050565b600060208284031215620046c757600080fd5b62000b91826200464f565b80610300810183101562000b9457600080fd5b6000806000806000806000806103e0898b0312156200470357600080fd5b6200470e896200464f565b97506200471e60208a0162004664565b96506200472e60408a0162004664565b95506200473e60608a0162004664565b94506200474e60808a0162004664565b935060a0890135925060c089013591506200476d8a60e08b01620046d2565b90509295985092959890939650565b6001600160a01b03811681146200289857600080fd5b6000806000806000806000806103e0898b031215620047b057600080fd5b620047bb896200464f565b9750620047cb60208a0162004664565b9650620047db60408a0162004664565b9550620047eb60608a0162004664565b94506080890135935060a0890135925060c08901356200480b816200477c565b91506200476d8a60e08b01620046d2565b6000602082840312156200482f57600080fd5b813561ffff811681146200484257600080fd5b9392505050565b6000602082840312156200485c57600080fd5b5035919050565b600080604083850312156200487757600080fd5b8235915060208301356200488b816200477c565b809150509250929050565b600060208284031215620048a957600080fd5b62000b918262004664565b600080600080600080600080610100898b031215620048d257600080fd5b8835620048df816200477c565b9750620048ef60208a0162004664565b9650620048ff60408a0162004664565b9550606089013562004911816200477c565b9450608089013562004923816200477c565b935060a089013562004935816200477c565b925060c089013562004947816200477c565b915060e089013562004959816200477c565b809150509295985092959890939650565b60008060008060008060c087890312156200498457600080fd5b6200498f876200464f565b95506200499f6020880162004664565b9450620049af6040880162004664565b9350606087013592506080870135915060a087013590509295509295509295565b60005b83811015620049ed578181015183820152602001620049d3565b50506000910152565b6000815180845262004a10816020860160208601620049d0565b601f01601f19169290920160200192915050565b60208152600062000b916020830184620049f6565b6000806040838503121562004a4d57600080fd5b62004a588362004664565b946020939093013593505050565b6000806000806060858703121562004a7d57600080fd5b843562004a8a816200477c565b935062004a9a602086016200464f565b925060408501356001600160401b038082111562004ab757600080fd5b818701915087601f83011262004acc57600080fd5b81358181111562004adc57600080fd5b88602082850101111562004aef57600080fd5b95989497505060200194505050565b60006020828403121562004b1157600080fd5b813562004842816200477c565b803560ff811681146200306957600080fd5b60008060008060008060c0878903121562004b4a57600080fd5b863562004b57816200477c565b9550602087013562004b69816200477c565b945062004b796040880162004664565b935062004b896060880162004664565b92506080870135915062004ba060a0880162004b1e565b90509295509295509295565b634e487b7160e01b600052604160045260246000fd5b600082601f83011262004bd457600080fd5b81356001600160401b038082111562004bf15762004bf162004bac565b604051601f8301601f19908116603f0116810190828211818310171562004c1c5762004c1c62004bac565b8160405283815286602085880101111562004c3657600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600080610100898b03121562004c7457600080fd5b62004c7f896200464f565b975062004c8f60208a0162004664565b9650604089013562004ca1816200477c565b9550606089013562004cb3816200477c565b9450608089013562004cc5816200477c565b935062004cd560a08a016200464f565b925060c08901356001600160401b038082111562004cf257600080fd5b62004d008c838d0162004bc2565b935060e08b013591508082111562004d1757600080fd5b5062004d268b828c0162004bc2565b9150509295985092959890939650565b60008060008060008060c0878903121562004d5057600080fd5b863562004d5d816200477c565b9550602087013562004d6f816200477c565b945062004d7f6040880162004664565b935062004d8f6060880162004b1e565b92506080870135915060a08701356001600160401b0381111562004db257600080fd5b62004dc089828a0162004bc2565b9150509295509295509295565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004e065762004e0662004dcd565b5092915050565b8054600090600181811c908083168062004e2857607f831692505b6020808410820362004e4a57634e487b7160e01b600052602260045260246000fd5b8388526020880182801562004e68576001811462004e7f5762004eac565b60ff198716825285151560051b8201975062004eac565b60008981526020902060005b8781101562004ea65781548482015290860190840162004e8b565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c06040820181905260009062004ee79083018762004e0d565b828103606084015262004efb818762004e0d565b9150508360808301526001600160401b03831660a0830152979650505050505050565b808202811582820484141762000b945762000b9462004dcd565b6001600160401b0382811682821603908082111562004e065762004e0662004dcd565b60006001600160401b0380831681810362004f7a5762004f7a62004dcd565b6001019392505050565b60006020828403121562004f9757600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b60008262004fc65762004fc662004f9e565b500490565b8082018082111562000b945762000b9462004dcd565b634e487b7160e01b600052603260045260246000fd5b6000600182016200500c576200500c62004dcd565b5060010190565b60008262005025576200502562004f9e565b500690565b8181038181111562000b945762000b9462004dcd565b60008162005052576200505262004dcd565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b600063ffffffff80831681810362004f7a5762004f7a62004dcd565b6001600160a01b03848116825283166020820152606060408201819052600090620050e490830184620049f6565b95945050505050565b6001600160a01b038881168252878116602083015263ffffffff878116604084015290861660608301528416608082015260e060a082018190526000906200513890830185620049f6565b82810360c08401526200514c8185620049f6565b9a9950505050505050505050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a08201819052600090620051a790830184620049f6565b98975050505050505050565b60008251620051c7818460208701620049d0565b9190910192915050565b61032081016103008085843782018360005b600181101562005204578151835260209283019290910190600101620051e3565b5050509392505050565b6000602082840312156200522157600080fd5b815180151581146200484257600080fd5b60006001600160401b03808416806200524f576200524f62004f9e565b9216919091049291505056fe60a06040526040516200092e3803806200092e833981016040819052620000269162000383565b828162000034828262000060565b50506001600160a01b038216608052620000576200005160805190565b620000c6565b50505062000481565b6200006b8262000138565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115620000b857620000b38282620001b8565b505050565b620000c262000235565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620001086000805160206200090e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001358162000257565b50565b806001600160a01b03163b6000036200017457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b031684604051620001d7919062000463565b600060405180830381855af49150503d806000811462000214576040519150601f19603f3d011682016040523d82523d6000602084013e62000219565b606091505b5090925090506200022c8583836200029a565b95945050505050565b3415620002555760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166200028357604051633173bdd160e11b8152600060048201526024016200016b565b806000805160206200090e83398151915262000197565b606082620002b357620002ad8262000300565b620002f9565b8151158015620002cb57506001600160a01b0384163b155b15620002f657604051639996b31560e01b81526001600160a01b03851660048201526024016200016b565b50805b9392505050565b805115620003115780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b03811681146200034257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200037a57818101518382015260200162000360565b50506000910152565b6000806000606084860312156200039957600080fd5b620003a4846200032a565b9250620003b4602085016200032a565b60408501519092506001600160401b0380821115620003d257600080fd5b818601915086601f830112620003e757600080fd5b815181811115620003fc57620003fc62000347565b604051601f8201601f19908116603f0116810190838211818310171562000427576200042762000347565b816040528281528960208487010111156200044157600080fd5b620004548360208301602088016200035d565b80955050505050509250925092565b60008251620004778184602087016200035d565b9190910192915050565b6080516104726200049c6000396000601001526104726000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100e5565b60008061008e36600481846102fd565b81019061009b919061033d565b915091506100a98282610109565b5050565b60006100e07f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610104573d6000f35b3d6000fd5b61011282610164565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561015c5761015782826101e0565b505050565b6100a9610256565b806001600160a01b03163b60000361019f57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101fd919061040d565b600060405180830381855af49150503d8060008114610238576040519150601f19603f3d011682016040523d82523d6000602084013e61023d565b606091505b509150915061024d858383610275565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b60608261028a57610285826102d4565b6102cd565b81511580156102a157506001600160a01b0384163b155b156102ca57604051639996b31560e01b81526001600160a01b0385166004820152602401610196565b50805b9392505050565b8051156102e45780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6000808585111561030d57600080fd5b8386111561031a57600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035057600080fd5b82356001600160a01b038116811461036757600080fd5b9150602083013567ffffffffffffffff8082111561038457600080fd5b818501915085601f83011261039857600080fd5b8135818111156103aa576103aa610327565b604051601f8201601f19908116603f011681019083821181831017156103d2576103d2610327565b816040528281528860208487010111156103eb57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000825160005b8181101561042e5760208186018101518583015201610414565b50600092019182525091905056fea2646970667358221220d51c6fc430c553d1da2391464fd71dbfa43dc91a9531c4d842a3289bb581301664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220f5ac7cd2c2bce84174660f9e38a04abba5f38d6b7992b6159a363918c4e4e4a664736f6c63430008140033", - "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620003095760003560e01c806391d14854116200019d578063ceee281d11620000eb578063dde0ff77116200009e578063dde0ff7714620009c0578063e0bfd3d214620009db578063e136edf714620009f2578063e46761c41462000a09578063f34eb8eb1462000a31578063f4e926751462000a48578063f9c4c2ae1462000a5957600080fd5b8063ceee281d1462000923578063d02103ca146200094c578063d5073f6f1462000974578063d547741f146200098b578063d939b31514620009a2578063dbc1697614620009b657600080fd5b8063a2967d991162000150578063a2967d9914620006f1578063a3c573eb14620006fb578063a4810bb2146200073c578063afd23cbe14620007eb578063b99d0ad71462000815578063c1acbc3414620008f1578063c4c928c2146200090c57600080fd5b806391d14854146200068257806399f5634e14620006995780639a908e7314620006a35780639c9f3dfe14620006ba578063a066215c14620006d1578063a217fddf14620006e857600080fd5b80632f2ff15d116200025b57806360469169116200020e5780636046916914620005c95780637222020f14620005d35780637975fcfe14620005ea5780637fb6e76a1462000610578063841b24d7146200063957806387c20c0114620006545780638bd4f071146200066b57600080fd5b80632f2ff15d146200052057806336568abe1462000537578063394218e9146200054e578063477fa27014620005655780634d4d3338146200056e57806355a71ee0146200058557600080fd5b806315064c9611620002c057806315064c9614620003c95780631608859c14620003d75780631796a1ae14620003ee5780631816b7e514620004155780632072f6c5146200042c578063248a9ca3146200043657806325280169146200046b57600080fd5b8063066ec012146200030e578063080b3111146200033f5780630a0d9fbe146200036757806311f6b287146200038257806312b86e1914620003995780631489ed1014620003b2575b600080fd5b60845462000322906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b62000356620003503660046200467c565b62000b70565b604051901515815260200162000336565b6085546200032290600160401b90046001600160401b031681565b6200032262000393366004620046b4565b62000b9a565b620003b0620003aa366004620046e5565b62000bba565b005b620003b0620003c336600462004792565b62000d6a565b606f54620003569060ff1681565b620003b0620003e83660046200467c565b62000f00565b607e54620003ff9063ffffffff1681565b60405163ffffffff909116815260200162000336565b620003b0620004263660046200481c565b62000f95565b620003b062001041565b6200045c6200044736600462004849565b60009081526034602052604090206001015490565b60405190815260200162000336565b620004ec6200047c3660046200467c565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b0390811691830191909152928201519092169082015260600162000336565b620003b06200053136600462004863565b620010bb565b620003b06200054836600462004863565b620010e4565b620003b06200055f36600462004896565b6200111e565b6086546200045c565b620003b06200057f366004620048b4565b620011d2565b6200045c620005963660046200467c565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b6200045c6200171f565b620003b0620005e4366004620046b4565b62001737565b62000601620005fb3660046200496a565b62001833565b60405162000336919062004a24565b620003ff6200062136600462004896565b60836020526000908152604090205463ffffffff1681565b6084546200032290600160c01b90046001600160401b031681565b620003b06200066536600462004792565b62001866565b620003b06200067c366004620046e5565b62001b90565b620003566200069336600462004863565b62001c46565b6200045c62001c71565b62000322620006b436600462004a39565b62001d58565b620003b0620006cb36600462004896565b62001f2a565b620003b0620006e236600462004896565b62001fd0565b6200045c600081565b6200045c62002074565b620007237f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200162000336565b620007a16200074d36600462004896565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c00162000336565b6085546200080190600160801b900461ffff1681565b60405161ffff909116815260200162000336565b620008ab620008263660046200467c565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b60405162000336919060006080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200032290600160801b90046001600160401b031681565b620003b06200091d36600462004a66565b62002449565b620003ff6200093436600462004afe565b60826020526000908152604090205463ffffffff1681565b620007237f000000000000000000000000000000000000000000000000000000000000000081565b620003b06200098536600462004849565b62002728565b620003b06200099c36600462004863565b620027c4565b60855462000322906001600160401b031681565b620003b0620027ed565b6084546200032290600160401b90046001600160401b031681565b620003b0620009ec36600462004b30565b6200289b565b620003b062000a0336600462004c56565b62002934565b620007237f000000000000000000000000000000000000000000000000000000000000000081565b620003b062000a4236600462004d36565b62002db9565b608054620003ff9063ffffffff1681565b62000af062000a6a366004620046b4565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff166101608201526101800162000336565b63ffffffff8216600090815260816020526040812062000b91908362002fb8565b90505b92915050565b63ffffffff8116600090815260816020526040812062000b949062002ffd565b60008051602062005bca83398151915262000bd5816200306e565b63ffffffff8916600090815260816020526040902062000bfc818a8a8a8a8a8a8a6200307a565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000c64576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000c9d62002074565b6040518263ffffffff1660e01b815260040162000cbc91815260200190565b600060405180830381600087803b15801562000cd757600080fd5b505af115801562000cec573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005bca83398151915262000d85816200306e565b63ffffffff8916600090815260816020526040902062000dac818a8a8a8a8a8a8a62003413565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562000e14576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000e4d62002074565b6040518263ffffffff1660e01b815260040162000e6c91815260200190565b600060405180830381600087803b15801562000e8757600080fd5b505af115801562000e9c573d6000803e3d6000fd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff8216600090815260816020526040902062000f3060008051602062005bca8339815191523362001c46565b62000f8457606f5460ff161562000f5a57604051630bc011ff60e21b815260040160405180910390fd5b62000f66818362002fb8565b62000f8457604051630674f25160e11b815260040160405180910390fd5b62000f908183620037e4565b505050565b60008051602062005b8a83398151915262000fb0816200306e565b6103e88261ffff16108062000fca57506103ff8261ffff16115b1562000fe957604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200105c60008051602062005baa8339815191523362001c46565b620010af576084544290620010869062093a8090600160801b90046001600160401b031662004de3565b6001600160401b03161115620010af5760405163692baaad60e11b815260040160405180910390fd5b620010b9620039d6565b565b600082815260346020526040902060010154620010d8816200306e565b62000f90838362003a55565b6001600160a01b03811633146200110e57604051630b4ad1cd60e31b815260040160405180910390fd5b6200111a828262003ac1565b5050565b60008051602062005b8a83398151915262001139816200306e565b606f5460ff166200117b576084546001600160401b03600160c01b9091048116908316106200117b5760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19060200162001035565b600054600290610100900460ff16158015620011f5575060005460ff8083169116105b6200125e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b179055620012df62003b2b565b620012fa60008051602062005bca8339815191528a62003b98565b6200130760008662003b98565b620013337fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908662003b98565b6200135f7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8662003b98565b6200138b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8662003b98565b620013b77fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8762003b98565b620013e37fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088762003b98565b6200140f7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48762003b98565b6200142a60008051602062005b8a8339815191528762003b98565b6200146560008051602062005bca8339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062003ba4565b620014917f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08762003b98565b620014bd7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8762003b98565b620014f860008051602062005baa8339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162003ba4565b6200151360008051602062005baa8339815191528562003b98565b6200153f7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518562003b98565b6000620015548484600561044d600062003bef565b6073546074549192506001600160401b03600160401b909104811691168082146200159257604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b0381811660008181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620016949695831695600160581b909104909216936076936077939192919091169060040162004eb9565b600060405180830381600087803b158015620016af57600080fd5b505af1158015620016c4573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498935060200191506200170c9050565b60405180910390a1505050505050505050565b6000608654606462001732919062004f1e565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd62001763816200306e565b63ffffffff82161580620017825750607e5463ffffffff908116908316115b15620017a157604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff1615159003620017e857604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b63ffffffff861660009081526081602052604090206060906200185b90878787878762003e14565b979650505050505050565b606f5460ff16156200188b57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a811686526003830190945291909320600101544292620018da92600160c01b90048116911662004de3565b6001600160401b031611156200190357604051638a0704d360e01b815260040160405180910390fd5b6103e862001912888862004f38565b6001600160401b031611156200193b57604051635acfba9d60e11b815260040160405180910390fd5b6200194d818989898989898962003413565b62001959818762003f54565b6085546001600160401b031660000362001a6757600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b90041615620019d5576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001a0e62002074565b6040518263ffffffff1660e01b815260040162001a2d91815260200190565b600060405180830381600087803b15801562001a4857600080fd5b505af115801562001a5d573d6000803e3d6000fd5b5050505062001b31565b62001a728162004151565b600681018054600160801b90046001600160401b031690601062001a968362004f5b565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff161562001bb557604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff8816600090815260816020526040902062001bdc81898989898989896200307a565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a162001c3b620039d6565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b815230600482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562001cdb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001d01919062004f84565b60845490915060009062001d28906001600160401b03600160401b82048116911662004f38565b6001600160401b031690508060000362001d455760009250505090565b62001d51818362004fb4565b9250505090565b606f5460009060ff161562001d8057604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362001db8576040516371653c1560e01b815260040160405180910390fd5b836001600160401b031660000362001de357604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81166000908152608160205260408120608480549192879262001e169084906001600160401b031662004de3565b82546101009290920a6001600160401b038181021990931691831602179091556006830154169050600062001e4c878362004de3565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b03199092169290931691909117179055905062001edc8362004151565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b60008051602062005b8a83398151915262001f45816200306e565b606f5460ff1662001f80576085546001600160401b039081169083161062001f805760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759060200162001035565b60008051602062005b8a83398151915262001feb816200306e565b62015180826001600160401b031611156200201957604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289060200162001035565b60805460009063ffffffff168082036200209057506000919050565b6000816001600160401b03811115620020ad57620020ad62004bac565b604051908082528060200260200182016040528015620020d7578160200160208202803683370190505b50905060005b828110156200214a5760816000620020f783600162004fcb565b63ffffffff1663ffffffff168152602001908152602001600020600501548282815181106200212a576200212a62004fe1565b602090810291909101015280620021418162004ff7565b915050620020dd565b50600060205b83600114620023a65760006200216860028662005013565b6200217560028762004fb4565b62002181919062004fcb565b90506000816001600160401b03811115620021a057620021a062004bac565b604051908082528060200260200182016040528015620021ca578160200160208202803683370190505b50905060005b828110156200235257620021e66001846200502a565b81148015620022015750620021fd60028862005013565b6001145b156200228957856200221582600262004f1e565b8151811062002228576200222862004fe1565b6020026020010151856040516020016200224c929190918252602082015260400190565b6040516020818303038152906040528051906020012082828151811062002277576200227762004fe1565b6020026020010181815250506200233d565b856200229782600262004f1e565b81518110620022aa57620022aa62004fe1565b602002602001015186826002620022c2919062004f1e565b620022cf90600162004fcb565b81518110620022e257620022e262004fe1565b602002602001015160405160200162002305929190918252602082015260400190565b6040516020818303038152906040528051906020012082828151811062002330576200233062004fe1565b6020026020010181815250505b80620023498162004ff7565b915050620021d0565b50809450819550838460405160200162002376929190918252602082015260400190565b60405160208183030381529060405280519060200120935082806200239b9062005040565b935050505062002150565b600083600081518110620023be57620023be62004fe1565b6020026020010151905060005b828110156200243f57604080516020810184905290810185905260600160408051601f19818403018152828252805160209182012090830187905290820186905292506060016040516020818303038152906040528051906020012093508080620024369062004ff7565b915050620023cb565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac62002475816200306e565b63ffffffff84161580620024945750607e5463ffffffff908116908516115b15620024b357604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff1690819003620024f4576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b0316036200254357604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff16151590036200258a57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b9092041614620025c857604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790556000620026488462000b9a565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef286926200269e9216908b908b906004016200505a565b600060405180830381600087803b158015620026b957600080fd5b505af1158015620026ce573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002754816200306e565b683635c9adc5dea000008211806200276f5750633b9aca0082105b156200278e57604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001035565b600082815260346020526040902060010154620027e1816200306e565b62000f90838362003ac1565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002819816200306e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200287557600080fd5b505af11580156200288a573d6000803e3d6000fd5b50505050620028986200421c565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e620028c7816200306e565b6001600160401b03841660009081526083602052604090205463ffffffff161562002905576040516337c8fe0960e11b815260040160405180910390fd5b600062002916888888888762003bef565b60008080526002909101602052604090209390935550505050505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd0862002960816200306e565b63ffffffff891615806200297f5750607e5463ffffffff908116908a16115b156200299e57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff89166000908152607f60205260409020600180820154600160e81b900460ff1615159003620029e557604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03891660009081526083602052604090205463ffffffff161562002a23576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062002a3e9063ffffffff166200509a565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162002a8c9062004641565b62002a9a93929190620050b6565b604051809103906000f08015801562002ab7573d6000803e3d6000fd5b50905081608360008d6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508b8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508c63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f9a84992ead4481f37097c7663e97ed883b31f216fae5685c6ee576a656483cd98e848f8d8d60405162002d3495949392919063ffffffff95861681526001600160a01b0394851660208201526001600160401b03939093166040840152921660608201529116608082015260a00190565b60405180910390a26040516308fd7e2160e31b81526001600160a01b038316906347ebf1089062002d76908e908e9088908f908f908f908f90600401620050ed565b600060405180830381600087803b15801562002d9157600080fd5b505af115801562002da6573d6000803e3d6000fd5b5050505050505050505050505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002de5816200306e565b607e805460009190829062002e009063ffffffff166200509a565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff166001600160401b0316815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002fa6969594939291906200515a565b60405180910390a25050505050505050565b6085546001600160401b0382811660009081526004850160205260408120549092429262002feb92918116911662004de3565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b03161562003051575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002898813362004275565b60078801546000906001600160401b039081169087161015620030b05760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620031515760068901546001600160401b03600160801b90910481169089161115620030fa5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200314a57604051632bd2e3e760e01b815260040160405180910390fd5b50620031c6565b506001600160401b0385166000908152600289016020526040902054806200318c576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620031c657604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620031ff5750876001600160401b0316876001600160401b031611155b8062003223575060068901546001600160401b03600160c01b909104811690881611155b15620032425760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b900481169086161462003289576040516332a2a77f60e01b815260040160405180910390fd5b60006200329b8a888888868962003e14565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620032d29190620051b3565b602060405180830381855afa158015620032f0573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003315919062004f84565b62003321919062005013565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200336591889190600401620051d1565b602060405180830381865afa15801562003383573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620033a991906200520e565b620033c7576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620034065760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620034218a62002ffd565b60078b01549091506001600160401b039081169089161015620034575760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620034fa5760068a01546001600160401b03600160801b9091048116908a161115620034a15760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620034f357604051632bd2e3e760e01b815260040160405180910390fd5b506200356a565b6001600160401b038816600090815260028b01602052604090205491508162003536576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200356a57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b0316116200359d5760405163b9b18f5760e01b815260040160405180910390fd5b6000620035af8b8a8a8a878b62003e14565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620035e69190620051b3565b602060405180830381855afa15801562003604573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003629919062004f84565b62003635919062005013565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200367991899190600401620051d1565b602060405180830381865afa15801562003697573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620036bd91906200520e565b620036db576040516309bde33960e01b815260040160405180910390fd5b6000620036e9848b62004f38565b90506200374287826001600160401b03166200370462001c71565b62003710919062004f1e565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906200429f565b80608460088282829054906101000a90046001600160401b031662003768919062004de3565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d1539060640162002d76565b60068201546001600160401b03600160c01b909104811690821611158062003823575060068201546001600160401b03600160801b9091048116908216115b15620038425760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620038fe62002074565b6040518263ffffffff1660e01b81526004016200391d91815260200190565b600060405180830381600087803b1580156200393857600080fd5b505af11580156200394d573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003a3257600080fd5b505af115801562003a47573d6000803e3d6000fd5b50505050620010b9620042f3565b62003a61828262001c46565b6200111a5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003acd828262001c46565b156200111a5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600054610100900460ff16620010b95760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162001255565b6200111a828262003a55565b600082815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080546000918291829062003c0b9063ffffffff166200509a565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000866001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508060826000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150868260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550858260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550838260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003e0294939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003e4a575081155b1562003e695760405163340c614f60e11b815260040160405180910390fd5b8062003e88576040516366385b5160e01b815260040160405180910390fd5b62003e938462004350565b62003eb1576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b600062003f618362002ffd565b90508160008062003f73848462004f38565b6085546001600160401b03918216925060009162003f9a91600160401b900416426200502a565b90505b846001600160401b0316846001600160401b03161462004024576001600160401b0380851660009081526003890160205260409020600181015490911682101562003fff576001810154600160401b90046001600160401b031694506200401d565b6200400b868662004f38565b6001600160401b031693505062004024565b5062003f9d565b60006200403284846200502a565b9050838110156200409057808403600c811162004050578062004053565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a608654028162004085576200408562004f9e565b046086555062004108565b838103600c8111620040a35780620040a6565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a76400000281620040e057620040e062004f9e565b04905080608654670de0b6b3a7640000028162004101576200410162004f9e565b0460865550505b683635c9adc5dea0000060865411156200412f57683635c9adc5dea0000060865562004147565b633b9aca0060865410156200414757633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b909204161115620028985760068101546000906200419c90600160c01b90046001600160401b0316600162004de3565b9050620041aa828262002fb8565b156200111a576006820154600090600290620041d8908490600160801b90046001600160401b031662004f38565b620041e4919062005232565b620041f0908362004de3565b9050620041fe838262002fb8565b15620042105762000f908382620037e4565b62000f908383620037e4565b606f5460ff166200424057604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b62004281828262001c46565b6200111a57604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905262000f90908490620043d6565b606f5460ff16156200431857604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b03831610801562004387575067ffffffff00000001604083901c6001600160401b0316105b8015620043a8575067ffffffff00000001608083901c6001600160401b0316105b8015620043c0575067ffffffff0000000160c083901c105b15620043ce57506001919050565b506000919050565b60006200442d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620044af9092919063ffffffff16565b80519091501562000f9057808060200190518101906200444e91906200520e565b62000f905760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162001255565b6060620044c08484600085620044c8565b949350505050565b6060824710156200452b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162001255565b600080866001600160a01b03168587604051620045499190620051b3565b60006040518083038185875af1925050503d806000811462004588576040519150601f19603f3d011682016040523d82523d6000602084013e6200458d565b606091505b50915091506200185b87838387606083156200460e57825160000362004606576001600160a01b0385163b620046065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001255565b5081620044c0565b620044c08383815115620046255781518083602001fd5b8060405162461bcd60e51b815260040162001255919062004a24565b61092e806200525c83390190565b803563ffffffff811681146200306957600080fd5b80356001600160401b03811681146200306957600080fd5b600080604083850312156200469057600080fd5b6200469b836200464f565b9150620046ab6020840162004664565b90509250929050565b600060208284031215620046c757600080fd5b62000b91826200464f565b80610300810183101562000b9457600080fd5b6000806000806000806000806103e0898b0312156200470357600080fd5b6200470e896200464f565b97506200471e60208a0162004664565b96506200472e60408a0162004664565b95506200473e60608a0162004664565b94506200474e60808a0162004664565b935060a0890135925060c089013591506200476d8a60e08b01620046d2565b90509295985092959890939650565b6001600160a01b03811681146200289857600080fd5b6000806000806000806000806103e0898b031215620047b057600080fd5b620047bb896200464f565b9750620047cb60208a0162004664565b9650620047db60408a0162004664565b9550620047eb60608a0162004664565b94506080890135935060a0890135925060c08901356200480b816200477c565b91506200476d8a60e08b01620046d2565b6000602082840312156200482f57600080fd5b813561ffff811681146200484257600080fd5b9392505050565b6000602082840312156200485c57600080fd5b5035919050565b600080604083850312156200487757600080fd5b8235915060208301356200488b816200477c565b809150509250929050565b600060208284031215620048a957600080fd5b62000b918262004664565b600080600080600080600080610100898b031215620048d257600080fd5b8835620048df816200477c565b9750620048ef60208a0162004664565b9650620048ff60408a0162004664565b9550606089013562004911816200477c565b9450608089013562004923816200477c565b935060a089013562004935816200477c565b925060c089013562004947816200477c565b915060e089013562004959816200477c565b809150509295985092959890939650565b60008060008060008060c087890312156200498457600080fd5b6200498f876200464f565b95506200499f6020880162004664565b9450620049af6040880162004664565b9350606087013592506080870135915060a087013590509295509295509295565b60005b83811015620049ed578181015183820152602001620049d3565b50506000910152565b6000815180845262004a10816020860160208601620049d0565b601f01601f19169290920160200192915050565b60208152600062000b916020830184620049f6565b6000806040838503121562004a4d57600080fd5b62004a588362004664565b946020939093013593505050565b6000806000806060858703121562004a7d57600080fd5b843562004a8a816200477c565b935062004a9a602086016200464f565b925060408501356001600160401b038082111562004ab757600080fd5b818701915087601f83011262004acc57600080fd5b81358181111562004adc57600080fd5b88602082850101111562004aef57600080fd5b95989497505060200194505050565b60006020828403121562004b1157600080fd5b813562004842816200477c565b803560ff811681146200306957600080fd5b60008060008060008060c0878903121562004b4a57600080fd5b863562004b57816200477c565b9550602087013562004b69816200477c565b945062004b796040880162004664565b935062004b896060880162004664565b92506080870135915062004ba060a0880162004b1e565b90509295509295509295565b634e487b7160e01b600052604160045260246000fd5b600082601f83011262004bd457600080fd5b81356001600160401b038082111562004bf15762004bf162004bac565b604051601f8301601f19908116603f0116810190828211818310171562004c1c5762004c1c62004bac565b8160405283815286602085880101111562004c3657600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600080610100898b03121562004c7457600080fd5b62004c7f896200464f565b975062004c8f60208a0162004664565b9650604089013562004ca1816200477c565b9550606089013562004cb3816200477c565b9450608089013562004cc5816200477c565b935062004cd560a08a016200464f565b925060c08901356001600160401b038082111562004cf257600080fd5b62004d008c838d0162004bc2565b935060e08b013591508082111562004d1757600080fd5b5062004d268b828c0162004bc2565b9150509295985092959890939650565b60008060008060008060c0878903121562004d5057600080fd5b863562004d5d816200477c565b9550602087013562004d6f816200477c565b945062004d7f6040880162004664565b935062004d8f6060880162004b1e565b92506080870135915060a08701356001600160401b0381111562004db257600080fd5b62004dc089828a0162004bc2565b9150509295509295509295565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004e065762004e0662004dcd565b5092915050565b8054600090600181811c908083168062004e2857607f831692505b6020808410820362004e4a57634e487b7160e01b600052602260045260246000fd5b8388526020880182801562004e68576001811462004e7f5762004eac565b60ff198716825285151560051b8201975062004eac565b60008981526020902060005b8781101562004ea65781548482015290860190840162004e8b565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c06040820181905260009062004ee79083018762004e0d565b828103606084015262004efb818762004e0d565b9150508360808301526001600160401b03831660a0830152979650505050505050565b808202811582820484141762000b945762000b9462004dcd565b6001600160401b0382811682821603908082111562004e065762004e0662004dcd565b60006001600160401b0380831681810362004f7a5762004f7a62004dcd565b6001019392505050565b60006020828403121562004f9757600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b60008262004fc65762004fc662004f9e565b500490565b8082018082111562000b945762000b9462004dcd565b634e487b7160e01b600052603260045260246000fd5b6000600182016200500c576200500c62004dcd565b5060010190565b60008262005025576200502562004f9e565b500690565b8181038181111562000b945762000b9462004dcd565b60008162005052576200505262004dcd565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b600063ffffffff80831681810362004f7a5762004f7a62004dcd565b6001600160a01b03848116825283166020820152606060408201819052600090620050e490830184620049f6565b95945050505050565b6001600160a01b038881168252878116602083015263ffffffff878116604084015290861660608301528416608082015260e060a082018190526000906200513890830185620049f6565b82810360c08401526200514c8185620049f6565b9a9950505050505050505050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a08201819052600090620051a790830184620049f6565b98975050505050505050565b60008251620051c7818460208701620049d0565b9190910192915050565b61032081016103008085843782018360005b600181101562005204578151835260209283019290910190600101620051e3565b5050509392505050565b6000602082840312156200522157600080fd5b815180151581146200484257600080fd5b60006001600160401b03808416806200524f576200524f62004f9e565b9216919091049291505056fe60a06040526040516200092e3803806200092e833981016040819052620000269162000383565b828162000034828262000060565b50506001600160a01b038216608052620000576200005160805190565b620000c6565b50505062000481565b6200006b8262000138565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115620000b857620000b38282620001b8565b505050565b620000c262000235565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620001086000805160206200090e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001358162000257565b50565b806001600160a01b03163b6000036200017457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b031684604051620001d7919062000463565b600060405180830381855af49150503d806000811462000214576040519150601f19603f3d011682016040523d82523d6000602084013e62000219565b606091505b5090925090506200022c8583836200029a565b95945050505050565b3415620002555760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166200028357604051633173bdd160e11b8152600060048201526024016200016b565b806000805160206200090e83398151915262000197565b606082620002b357620002ad8262000300565b620002f9565b8151158015620002cb57506001600160a01b0384163b155b15620002f657604051639996b31560e01b81526001600160a01b03851660048201526024016200016b565b50805b9392505050565b805115620003115780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b03811681146200034257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200037a57818101518382015260200162000360565b50506000910152565b6000806000606084860312156200039957600080fd5b620003a4846200032a565b9250620003b4602085016200032a565b60408501519092506001600160401b0380821115620003d257600080fd5b818601915086601f830112620003e757600080fd5b815181811115620003fc57620003fc62000347565b604051601f8201601f19908116603f0116810190838211818310171562000427576200042762000347565b816040528281528960208487010111156200044157600080fd5b620004548360208301602088016200035d565b80955050505050509250925092565b60008251620004778184602087016200035d565b9190910192915050565b6080516104726200049c6000396000601001526104726000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100e5565b60008061008e36600481846102fd565b81019061009b919061033d565b915091506100a98282610109565b5050565b60006100e07f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610104573d6000f35b3d6000fd5b61011282610164565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561015c5761015782826101e0565b505050565b6100a9610256565b806001600160a01b03163b60000361019f57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101fd919061040d565b600060405180830381855af49150503d8060008114610238576040519150601f19603f3d011682016040523d82523d6000602084013e61023d565b606091505b509150915061024d858383610275565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b60608261028a57610285826102d4565b6102cd565b81511580156102a157506001600160a01b0384163b155b156102ca57604051639996b31560e01b81526001600160a01b0385166004820152602401610196565b50805b9392505050565b8051156102e45780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6000808585111561030d57600080fd5b8386111561031a57600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035057600080fd5b82356001600160a01b038116811461036757600080fd5b9150602083013567ffffffffffffffff8082111561038457600080fd5b818501915085601f83011261039857600080fd5b8135818111156103aa576103aa610327565b604051601f8201601f19908116603f011681019083821181831017156103d2576103d2610327565b816040528281528860208487010111156103eb57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000825160005b8181101561042e5760208186018101518583015201610414565b50600092019182525091905056fea2646970667358221220d51c6fc430c553d1da2391464fd71dbfa43dc91a9531c4d842a3289bb581301664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220f5ac7cd2c2bce84174660f9e38a04abba5f38d6b7992b6159a363918c4e4e4a664736f6c63430008140033", + "bytecode": "0x60e060405234801562000010575f80fd5b5060405162005af738038062005af7833981016040819052620000339162000069565b6001600160a01b0392831660805290821660c0521660a052620000ba565b6001600160a01b038116811462000066575f80fd5b50565b5f805f606084860312156200007c575f80fd5b8351620000898162000051565b60208501519093506200009c8162000051565b6040850151909250620000af8162000051565b809150509250925092565b60805160a05160c0516159da6200011d5f395f818161096c01528181611abb015261344201525f818161071d015281816125e401526136f801525f81816108af01528181610bbd01528181610d650152818161182c01526135ed01526159da5ff3fe608060405234801562000010575f80fd5b506004361062000290575f3560e01c8063066ec0121462000294578063080b311114620002c05780630a0d9fbe14620002e857806311f6b287146200030357806312b86e19146200031a5780631489ed10146200033357806315064c96146200034a5780631608859c14620003585780631796a1ae146200036f5780631816b7e514620003965780632072f6c514620003ad578063248a9ca314620003b75780632528016914620003dd5780632f2ff15d146200049157806336568abe14620004a8578063394218e914620004bf578063477fa27014620004d65780634d4d333814620004df57806355a71ee014620004f657806360469169146200053957806365c0504d14620005435780637222020f14620005f15780637975fcfe14620006085780637fb6e76a146200062e578063841b24d7146200065657806387c20c0114620006715780638bd4f071146200068857806391d14854146200069f57806399f5634e14620006b65780639a908e7314620006c05780639c9f3dfe14620006d7578063a066215c14620006ee578063a217fddf1462000705578063a2967d99146200070d578063a3c573eb1462000717578063afd23cbe146200074e578063b99d0ad71462000778578063c1acbc34146200084f578063c4c928c2146200086a578063ceee281d1462000881578063d02103ca14620008a9578063d5073f6f14620008d1578063d547741f14620008e8578063d939b31514620008ff578063dbc169761462000913578063dde0ff77146200091d578063e0bfd3d21462000938578063e136edf7146200094f578063e46761c41462000966578063f34eb8eb146200098e578063f4e9267514620009a5578063f9c4c2ae14620009b6575b5f80fd5b608454620002a8906001600160401b031681565b604051620002b7919062004349565b60405180910390f35b620002d7620002d136600462004388565b62000acc565b6040519015158152602001620002b7565b608554620002a890600160401b90046001600160401b031681565b620002a862000314366004620043be565b62000af5565b620003316200032b366004620043ec565b62000b14565b005b620003316200034436600462004493565b62000cbc565b606f54620002d79060ff1681565b620003316200036936600462004388565b62000e44565b607e54620003809063ffffffff1681565b60405163ffffffff9091168152602001620002b7565b62000331620003a736600462004518565b62000ed7565b6200033162000f82565b620003ce620003c836600462004542565b62000ffb565b604051908152602001620002b7565b6200045d620003ee36600462004388565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002b7565b62000331620004a23660046200455a565b6200100f565b62000331620004b93660046200455a565b62001031565b62000331620004d03660046200458b565b6200106b565b608654620003ce565b62000331620004f0366004620045a7565b62001119565b620003ce6200050736600462004388565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620003ce6200158d565b620005a762000554366004620043be565b607f6020525f90815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002b7565b6200033162000602366004620043be565b620015a4565b6200061f6200061936600462004658565b6200168c565b604051620002b791906200470b565b620003806200063f3660046200458b565b60836020525f908152604090205463ffffffff1681565b608454620002a890600160c01b90046001600160401b031681565b620003316200068236600462004493565b620016be565b6200033162000699366004620043ec565b620019d9565b620002d7620006b03660046200455a565b62001a8d565b620003ce62001ab7565b620002a8620006d13660046200471f565b62001b9d565b62000331620006e83660046200458b565b62001d64565b62000331620006ff3660046200458b565b62001e06565b620003ce5f81565b620003ce62001ea4565b6200073f7f000000000000000000000000000000000000000000000000000000000000000081565b604051620002b791906200474a565b6085546200076490600160801b900461ffff1681565b60405161ffff9091168152602001620002b7565b6200080d6200078936600462004388565b60408051608080820183525f8083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002b7919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002a890600160801b90046001600160401b031681565b620003316200087b3660046200475e565b62002259565b6200038062000892366004620047ef565b60826020525f908152604090205463ffffffff1681565b6200073f7f000000000000000000000000000000000000000000000000000000000000000081565b62000331620008e236600462004542565b6200251c565b62000331620008f93660046200455a565b620025a6565b608554620002a8906001600160401b031681565b62000331620025c8565b608454620002a890600160401b90046001600160401b031681565b62000331620009493660046200481e565b6200265f565b62000331620009603660046200493a565b620026e3565b6200073f7f000000000000000000000000000000000000000000000000000000000000000081565b620003316200099f36600462004a13565b62002b3a565b608054620003809063ffffffff1681565b62000a4c620009c7366004620043be565b60816020525f9081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002b7565b63ffffffff82165f90815260816020526040812062000aec908362002d1c565b90505b92915050565b63ffffffff81165f90815260816020526040812062000aef9062002d60565b5f805160206200598583398151915262000b2e8162002dcf565b63ffffffff89165f90815260816020526040902062000b54818a8a8a8a8a8a8a62002ddb565b600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562000bbb576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000bf462001ea4565b6040518263ffffffff1660e01b815260040162000c1391815260200190565b5f604051808303815f87803b15801562000c2b575f80fd5b505af115801562000c3e573d5f803e3d5ffd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b5f805160206200598583398151915262000cd68162002dcf565b63ffffffff89165f90815260816020526040902062000cfc818a8a8a8a8a8a8a62003157565b600681018054600160401b600160801b031916600160401b6001600160401b038a81169182029290921783555f9081526002840160205260409020879055600583018890559054600160801b9004161562000d63576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000d9c62001ea4565b6040518263ffffffff1660e01b815260040162000dbb91815260200190565b5f604051808303815f87803b15801562000dd3575f80fd5b505af115801562000de6573d5f803e3d5ffd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a60405162000e309392919062004aa5565b60405180910390a350505050505050505050565b63ffffffff82165f90815260816020526040902062000e725f80516020620059858339815191523362001a8d565b62000ec657606f5460ff161562000e9c57604051630bc011ff60e21b815260040160405180910390fd5b62000ea8818362002d1c565b62000ec657604051630674f25160e11b815260040160405180910390fd5b62000ed281836200350b565b505050565b5f805160206200590583398151915262000ef18162002dcf565b6103e88261ffff16108062000f0b57506103ff8261ffff16115b1562000f2a57604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b62000f9c5f80516020620059458339815191523362001a8d565b62000fef57608454429062000fc69062093a8090600160801b90046001600160401b031662004ada565b6001600160401b0316111562000fef5760405163692baaad60e11b815260040160405180910390fd5b62000ff9620036f6565b565b5f9081526034602052604090206001015490565b6200101a8262000ffb565b620010258162002dcf565b62000ed2838362003770565b6001600160a01b03811633146200105b57604051630b4ad1cd60e31b815260040160405180910390fd5b620010678282620037db565b5050565b5f8051602062005905833981519152620010858162002dcf565b606f5460ff16620010c7576084546001600160401b03600160c01b909104811690831610620010c75760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19062000f7690849062004349565b5f54600290610100900460ff161580156200113a57505f5460ff8083169116105b620011a35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200122362003844565b6200123d5f80516020620059858339815191528a620038b0565b620012495f86620038b0565b620012635f805160206200588583398151915286620038b0565b6200127d5f80516020620058e583398151915286620038b0565b620012975f805160206200582583398151915286620038b0565b620012b15f805160206200586583398151915287620038b0565b620012cb5f805160206200596583398151915287620038b0565b620012e55f80516020620058a583398151915287620038b0565b620012ff5f805160206200590583398151915287620038b0565b620013275f80516020620059858339815191525f8051602062005805833981519152620038bc565b620013415f805160206200580583398151915287620038b0565b6200135b5f805160206200584583398151915287620038b0565b620013835f80516020620059458339815191525f8051602062005925833981519152620038bc565b6200139d5f805160206200594583398151915285620038b0565b620013b75f805160206200592583398151915285620038b0565b5f620013ca8484600561044d5f6200390f565b6073546074549192506001600160401b03600160401b909104811691168082146200140857604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b038181165f8181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620015089695831695600160581b909104909216936076936077939192919091169060040162004bab565b5f604051808303815f87803b15801562001520575f80fd5b505af115801562001533573d5f803e3d5ffd5b50505f805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498935060200191506200157a9050565b60405180910390a1505050505050505050565b5f60865460646200159f919062004c10565b905090565b5f8051602062005865833981519152620015be8162002dcf565b63ffffffff82161580620015dd5750607e5463ffffffff908116908316115b15620015fc57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f60205260409020600180820154600160e81b900460ff16151590036200164257604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b63ffffffff86165f908152608160205260409020606090620016b390878787878762003b27565b979650505050505050565b606f5460ff1615620016e357604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602090815260408083206084546001600160401b038a8116865260038301909452919093206001015442926200173192600160c01b90048116911662004ada565b6001600160401b031611156200175a57604051638a0704d360e01b815260040160405180910390fd5b6103e862001769888862004c2a565b6001600160401b031611156200179257604051635acfba9d60e11b815260040160405180910390fd5b620017a4818989898989898962003157565b620017b0818762003c61565b6085546001600160401b03165f03620018b757600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b900416156200182a576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200186362001ea4565b6040518263ffffffff1660e01b81526004016200188291815260200190565b5f604051808303815f87803b1580156200189a575f80fd5b505af1158015620018ad573d5f803e3d5ffd5b5050505062001980565b620018c28162003e58565b600681018054600160801b90046001600160401b0316906010620018e68362004c4d565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b900487165f90815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b4888789604051620019c69392919062004aa5565b60405180910390a3505050505050505050565b606f5460ff1615620019fe57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f90815260816020526040902062001a24818989898989898962002ddb565b6001600160401b0385165f9081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a162001a82620036f6565b505050505050505050565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162001b0791906200474a565b602060405180830381865afa15801562001b23573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001b49919062004c7d565b6084549091505f9062001b6f906001600160401b03600160401b82048116911662004c2a565b6001600160401b03169050805f0362001b8a575f9250505090565b62001b96818362004ca9565b9250505090565b606f545f9060ff161562001bc457604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff169081900362001bfb576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f0362001c2557604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f908152608160205260408120608480549192879262001c579084906001600160401b031662004ada565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f62001c8c878362004ada565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f95865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b03199092169290931691909117179055905062001d1a8362003e58565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a258260405162001d52919062004349565b60405180910390a29695505050505050565b5f805160206200590583398151915262001d7e8162002dcf565b606f5460ff1662001db9576085546001600160401b039081169083161062001db95760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759062000f7690849062004349565b5f805160206200590583398151915262001e208162002dcf565b62015180826001600160401b0316111562001e4e57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289062000f7690849062004349565b6080545f9063ffffffff1680820362001ebe57505f919050565b5f816001600160401b0381111562001eda5762001eda62004896565b60405190808252806020026020018201604052801562001f04578160200160208202803683370190505b5090505f5b8281101562001f745760815f62001f2283600162004cbf565b63ffffffff1663ffffffff1681526020019081526020015f206005015482828151811062001f545762001f5462004cd5565b60209081029190910101528062001f6b8162004ce9565b91505062001f09565b505f60205b83600114620021b4575f62001f9060028662004d04565b62001f9d60028762004ca9565b62001fa9919062004cbf565b90505f816001600160401b0381111562001fc75762001fc762004896565b60405190808252806020026020018201604052801562001ff1578160200160208202803683370190505b5090505f5b8281101562002168576200200c60018462004d1a565b811480156200202757506200202360028862004d04565b6001145b15620020a757856200203b82600262004c10565b815181106200204e576200204e62004cd5565b6020026020010151856040516020016200206a92919062004d30565b6040516020818303038152906040528051906020012082828151811062002095576200209562004cd5565b60200260200101818152505062002153565b85620020b582600262004c10565b81518110620020c857620020c862004cd5565b602002602001015186826002620020e0919062004c10565b620020ed90600162004cbf565b8151811062002100576200210062004cd5565b60200260200101516040516020016200211b92919062004d30565b6040516020818303038152906040528051906020012082828151811062002146576200214662004cd5565b6020026020010181815250505b806200215f8162004ce9565b91505062001ff6565b5080945081955083846040516020016200218492919062004d30565b6040516020818303038152906040528051906020012093508280620021a99062004d3e565b935050505062001f79565b5f835f81518110620021ca57620021ca62004cd5565b602002602001015190505f5b828110156200224f578184604051602001620021f492919062004d30565b60405160208183030381529060405280519060200120915083846040516020016200222192919062004d30565b6040516020818303038152906040528051906020012093508080620022469062004ce9565b915050620021d6565b5095945050505050565b5f8051602062005825833981519152620022738162002dcf565b63ffffffff84161580620022925750607e5463ffffffff908116908516115b15620022b157604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526082602052604081205463ffffffff1690819003620022f1576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918716600160401b9091046001600160401b0316036200233f57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86165f908152607f60205260409020600180820154600160e81b900460ff16151590036200238557604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b9092041614620023c357604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790555f620024428462000af5565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef28692620024979216908b908b9060040162004d56565b5f604051808303815f87803b158015620024af575f80fd5b505af1158015620024c2573d5f803e3d5ffd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b5f8051602062005845833981519152620025368162002dcf565b683635c9adc5dea00000821180620025515750633b9aca0082105b156200257057604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162000f76565b620025b18262000ffb565b620025bc8162002dcf565b62000ed28383620037db565b5f80516020620058a5833981519152620025e28162002dcf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156200263b575f80fd5b505af11580156200264e573d5f803e3d5ffd5b505050506200265c62003f21565b50565b5f80516020620058e5833981519152620026798162002dcf565b6001600160401b0384165f9081526083602052604090205463ffffffff1615620026b6576040516337c8fe0960e11b815260040160405180910390fd5b5f620026c688888888876200390f565b5f8080526002909101602052604090209390935550505050505050565b5f8051602062005965833981519152620026fd8162002dcf565b63ffffffff891615806200271c5750607e5463ffffffff908116908a16115b156200273b57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff89165f908152607f60205260409020600180820154600160e81b900460ff16151590036200278157604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b0389165f9081526083602052604090205463ffffffff1615620027be576040516337c8fe0960e11b815260040160405180910390fd5b608080545f91908290620027d89063ffffffff1662004d95565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b0390921691309162002825906200433b565b620028339392919062004db0565b604051809103905ff0801580156200284d573d5f803e3d5ffd5b5090508160835f8d6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508b815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508c63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f9a84992ead4481f37097c7663e97ed883b31f216fae5685c6ee576a656483cd98e848f8d8d60405162002aba95949392919063ffffffff95861681526001600160a01b0394851660208201526001600160401b03939093166040840152921660608201529116608082015260a00190565b60405180910390a26040516308fd7e2160e31b81526001600160a01b038316906347ebf1089062002afc908e908e9088908f908f908f908f9060040162004de6565b5f604051808303815f87803b15801562002b14575f80fd5b505af115801562002b27573d5f803e3d5ffd5b5050505050505050505050505050505050565b5f805160206200588583398151915262002b548162002dcf565b607e80545f9190829062002b6e9063ffffffff1662004d95565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff1681526020015f1515815260200185815250607f5f8363ffffffff1663ffffffff1681526020019081526020015f205f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002d0a9695949392919062004e52565b60405180910390a25050505050505050565b6085546001600160401b038281165f9081526004850160205260408120549092429262002d4e92918116911662004ada565b6001600160401b031611159392505050565b60068101545f90600160801b90046001600160401b03161562002db2575060068101546001600160401b03600160801b90910481165f9081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b6200265c813362003f79565b60078801545f906001600160401b03908116908716101562002e105760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b0388161562002eb05760068901546001600160401b03600160801b9091048116908916111562002e5a5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f90815260048a0160205260409020600281015481549092888116600160401b909204161462002ea957604051632bd2e3e760e01b815260040160405180910390fd5b5062002f24565b506001600160401b0385165f9081526002890160205260409020548062002eea576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b9091048116908716111562002f2457604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b9091048116908816118062002f5d5750876001600160401b0316876001600160401b031611155b8062002f81575060068901546001600160401b03600160c01b909104811690881611155b1562002fa05760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260048b016020526040902054600160401b900481169086161462002fe6576040516332a2a77f60e01b815260040160405180910390fd5b5f62002ff78a888888868962003b27565b90505f5f80516020620058c58339815191526002836040516200301b919062004eaa565b602060405180830381855afa15801562003037573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200305c919062004c7d565b62003068919062004d04565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620030ac9188919060040162004ec7565b602060405180830381865afa158015620030c8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620030ee919062004f03565b6200310c576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260048c0160205260409020600201548590036200314a5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b5f80620031648a62002d60565b60078b01549091506001600160401b0390811690891610156200319a5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038916156200323c5760068a01546001600160401b03600160801b9091048116908a161115620031e45760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a165f90815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200323557604051632bd2e3e760e01b815260040160405180910390fd5b50620032ab565b6001600160401b0388165f90815260028b01602052604090205491508162003277576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b03161115620032ab57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620032de5760405163b9b18f5760e01b815260040160405180910390fd5b5f620032ef8b8a8a8a878b62003b27565b90505f5f80516020620058c583398151915260028360405162003313919062004eaa565b602060405180830381855afa1580156200332f573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019062003354919062004c7d565b62003360919062004d04565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620033a49189919060040162004ec7565b602060405180830381865afa158015620033c0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620033e6919062004f03565b62003404576040516309bde33960e01b815260040160405180910390fd5b5f62003411848b62004c2a565b90506200346a87826001600160401b03166200342c62001ab7565b62003438919062004c10565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062003fa3565b80608460088282829054906101000a90046001600160401b031662003490919062004ada565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d1539060640162002afc565b60068201546001600160401b03600160c01b90910481169082161115806200354a575060068201546001600160401b03600160801b9091048116908216115b15620035695760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f81815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200362462001ea4565b6040518263ffffffff1660e01b81526004016200364391815260200190565b5f604051808303815f87803b1580156200365b575f80fd5b505af11580156200366e573d5f803e3d5ffd5b505085546001600160a01b03165f90815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156200374f575f80fd5b505af115801562003762573d5f803e3d5ffd5b5050505062000ff962003ff7565b6200377c828262001a8d565b62001067575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b620037e7828262001a8d565b1562001067575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b5f54610100900460ff1662000ff95760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016200119a565b62001067828262003770565b5f620038c88362000ffb565b5f84815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080545f91829182906200392a9063ffffffff1662004d95565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f866001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f896001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff16021790555060815f8263ffffffff1663ffffffff1681526020019081526020015f20915086825f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b0316021790555085826001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555083825f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003b1594939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086165f818152600389016020526040808220549388168252902054606092911580159062003b5c575081155b1562003b7b5760405163340c614f60e11b815260040160405180910390fd5b8062003b9a576040516366385b5160e01b815260040160405180910390fd5b62003ba58462004053565b62003bc3576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b5f62003c6d8362002d60565b9050815f8062003c7e848462004c2a565b6085546001600160401b0391821692505f9162003ca491600160401b9004164262004d1a565b90505b846001600160401b0316846001600160401b03161462003d2d576001600160401b038085165f9081526003890160205260409020600181015490911682101562003d08576001810154600160401b90046001600160401b0316945062003d26565b62003d14868662004c2a565b6001600160401b031693505062003d2d565b5062003ca7565b5f62003d3a848462004d1a565b90508381101562003d9857808403600c811162003d58578062003d5b565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a608654028162003d8d5762003d8d62004c95565b046086555062003e0f565b838103600c811162003dab578062003dae565b600c5b90505f816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162003de75762003de762004c95565b04905080608654670de0b6b3a7640000028162003e085762003e0862004c95565b0460865550505b683635c9adc5dea00000608654111562003e3657683635c9adc5dea0000060865562003e4e565b633b9aca00608654101562003e4e57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b9092041611156200265c5760068101545f9062003ea290600160c01b90046001600160401b0316600162004ada565b905062003eb0828262002d1c565b15620010675760068201545f9060029062003edd908490600160801b90046001600160401b031662004c2a565b62003ee9919062004f24565b62003ef5908362004ada565b905062003f03838262002d1c565b1562003f155762000ed283826200350b565b62000ed283836200350b565b606f5460ff1662003f4557604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b62003f85828262001a8d565b6200106757604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905262000ed2908490620040d7565b606f5460ff16156200401c57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff000000016001600160401b03831610801562004089575067ffffffff00000001604083901c6001600160401b0316105b8015620040aa575067ffffffff00000001608083901c6001600160401b0316105b8015620040c2575067ffffffff0000000160c083901c105b15620040d057506001919050565b505f919050565b5f6200412d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620041af9092919063ffffffff16565b80519091501562000ed257808060200190518101906200414e919062004f03565b62000ed25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200119a565b6060620041bf84845f85620041c7565b949350505050565b6060824710156200422a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200119a565b5f80866001600160a01b0316858760405162004247919062004eaa565b5f6040518083038185875af1925050503d805f811462004283576040519150601f19603f3d011682016040523d82523d5f602084013e62004288565b606091505b5091509150620016b38783838760608315620043085782515f0362004300576001600160a01b0385163b620043005760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200119a565b5081620041bf565b620041bf83838151156200431f5781518083602001fd5b8060405162461bcd60e51b81526004016200119a91906200470b565b6108b88062004f4d83390190565b6001600160401b0391909116815260200190565b803563ffffffff8116811462002dca575f80fd5b80356001600160401b038116811462002dca575f80fd5b5f80604083850312156200439a575f80fd5b620043a5836200435d565b9150620043b56020840162004371565b90509250929050565b5f60208284031215620043cf575f80fd5b62000aec826200435d565b80610300810183101562000aef575f80fd5b5f805f805f805f806103e0898b03121562004405575f80fd5b62004410896200435d565b97506200442060208a0162004371565b96506200443060408a0162004371565b95506200444060608a0162004371565b94506200445060808a0162004371565b935060a0890135925060c089013591506200446f8a60e08b01620043da565b90509295985092959890939650565b6001600160a01b03811681146200265c575f80fd5b5f805f805f805f806103e0898b031215620044ac575f80fd5b620044b7896200435d565b9750620044c760208a0162004371565b9650620044d760408a0162004371565b9550620044e760608a0162004371565b94506080890135935060a0890135925060c089013562004507816200447e565b91506200446f8a60e08b01620043da565b5f6020828403121562004529575f80fd5b813561ffff811681146200453b575f80fd5b9392505050565b5f6020828403121562004553575f80fd5b5035919050565b5f80604083850312156200456c575f80fd5b82359150602083013562004580816200447e565b809150509250929050565b5f602082840312156200459c575f80fd5b62000aec8262004371565b5f805f805f805f80610100898b031215620045c0575f80fd5b8835620045cd816200447e565b9750620045dd60208a0162004371565b9650620045ed60408a0162004371565b95506060890135620045ff816200447e565b9450608089013562004611816200447e565b935060a089013562004623816200447e565b925060c089013562004635816200447e565b915060e089013562004647816200447e565b809150509295985092959890939650565b5f805f805f8060c087890312156200466e575f80fd5b62004679876200435d565b9550620046896020880162004371565b9450620046996040880162004371565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b83811015620046d6578181015183820152602001620046bc565b50505f910152565b5f8151808452620046f7816020860160208601620046ba565b601f01601f19169290920160200192915050565b602081525f62000aec6020830184620046de565b5f806040838503121562004731575f80fd5b6200473c8362004371565b946020939093013593505050565b6001600160a01b0391909116815260200190565b5f805f806060858703121562004772575f80fd5b84356200477f816200447e565b93506200478f602086016200435d565b925060408501356001600160401b0380821115620047ab575f80fd5b818701915087601f830112620047bf575f80fd5b813581811115620047ce575f80fd5b886020828501011115620047e0575f80fd5b95989497505060200194505050565b5f6020828403121562004800575f80fd5b81356200453b816200447e565b803560ff8116811462002dca575f80fd5b5f805f805f8060c0878903121562004834575f80fd5b863562004841816200447e565b9550602087013562004853816200447e565b9450620048636040880162004371565b9350620048736060880162004371565b9250608087013591506200488a60a088016200480d565b90509295509295509295565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620048ba575f80fd5b81356001600160401b0380821115620048d757620048d762004896565b604051601f8301601f19908116603f0116810190828211818310171562004902576200490262004896565b816040528381528660208588010111156200491b575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f80610100898b03121562004953575f80fd5b6200495e896200435d565b97506200496e60208a0162004371565b9650604089013562004980816200447e565b9550606089013562004992816200447e565b94506080890135620049a4816200447e565b9350620049b460a08a016200435d565b925060c08901356001600160401b0380821115620049d0575f80fd5b620049de8c838d01620048aa565b935060e08b0135915080821115620049f4575f80fd5b5062004a038b828c01620048aa565b9150509295985092959890939650565b5f805f805f8060c0878903121562004a29575f80fd5b863562004a36816200447e565b9550602087013562004a48816200447e565b945062004a586040880162004371565b935062004a68606088016200480d565b92506080870135915060a08701356001600160401b0381111562004a8a575f80fd5b62004a9889828a01620048aa565b9150509295509295509295565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111562004afd5762004afd62004ac6565b5092915050565b80545f90600181811c908083168062004b1e57607f831692505b6020808410820362004b3e57634e487b7160e01b5f52602260045260245ffd5b8388526020880182801562004b5c576001811462004b735762004b9e565b60ff198716825285151560051b8201975062004b9e565b5f898152602090205f5b8781101562004b985781548482015290860190840162004b7d565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c0604082018190525f9062004bd89083018762004b04565b828103606084015262004bec818762004b04565b608084019590955250506001600160401b039190911660a090910152949350505050565b808202811582820484141762000aef5762000aef62004ac6565b6001600160401b0382811682821603908082111562004afd5762004afd62004ac6565b5f6001600160401b038281166002600160401b0319810162004c735762004c7362004ac6565b6001019392505050565b5f6020828403121562004c8e575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8262004cba5762004cba62004c95565b500490565b8082018082111562000aef5762000aef62004ac6565b634e487b7160e01b5f52603260045260245ffd5b5f6001820162004cfd5762004cfd62004ac6565b5060010190565b5f8262004d155762004d1562004c95565b500690565b8181038181111562000aef5762000aef62004ac6565b918252602082015260400190565b5f8162004d4f5762004d4f62004ac6565b505f190190565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b5f63ffffffff80831681810362004c735762004c7362004ac6565b6001600160a01b038481168252831660208201526060604082018190525f9062004ddd90830184620046de565b95945050505050565b6001600160a01b038881168252878116602083015263ffffffff878116604084015290861660608301528416608082015260e060a082018190525f9062004e3090830185620046de565b82810360c084015262004e448185620046de565b9a9950505050505050505050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190525f9062004e9e90830184620046de565b98975050505050505050565b5f825162004ebd818460208701620046ba565b9190910192915050565b6103208101610300808584378201835f5b600181101562004ef957815183526020928301929091019060010162004ed8565b5050509392505050565b5f6020828403121562004f14575f80fd5b815180151581146200453b575f80fd5b5f6001600160401b038381168062004f405762004f4062004c95565b9216919091049291505056fe60a06040526040516108b83803806108b883398101604081905261002291610349565b828161002e8282610056565b50506001600160a01b03821660805261004e61004960805190565b6100b4565b50505061042e565b61005f82610121565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100a8576100a3828261019f565b505050565b6100b0610212565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f35f80516020610898833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161011e81610233565b50565b806001600160a01b03163b5f0361015b57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516101bb9190610413565b5f60405180830381855af49150503d805f81146101f3576040519150601f19603f3d011682016040523d82523d5f602084013e6101f8565b606091505b509092509050610209858383610270565b95945050505050565b34156102315760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661025c57604051633173bdd160e11b81525f6004820152602401610152565b805f8051602061089883398151915261017e565b60608261028557610280826102cf565b6102c8565b815115801561029c57506001600160a01b0384163b155b156102c557604051639996b31560e01b81526001600160a01b0385166004820152602401610152565b50805b9392505050565b8051156102df5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461030e575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015610341578181015183820152602001610329565b50505f910152565b5f805f6060848603121561035b575f80fd5b610364846102f8565b9250610372602085016102f8565b60408501519092506001600160401b038082111561038e575f80fd5b818601915086601f8301126103a1575f80fd5b8151818111156103b3576103b3610313565b604051601f8201601f19908116603f011681019083821181831017156103db576103db610313565b816040528281528960208487010111156103f3575f80fd5b610404836020830160208801610327565b80955050505050509250925092565b5f8251610424818460208701610327565b9190910192915050565b6080516104536104455f395f601001526104535ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610069575f356001600160e01b03191663278f794360e11b146100615761005f61006d565b565b61005f61007d565b61005f5b61005f6100786100ab565b6100cf565b5f8061008c36600481846102ba565b81019061009991906102f5565b915091506100a782826100ed565b5050565b5f6100ca5f805160206103fe833981519152546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156100e9573d5ff35b3d5ffd5b6100f682610147565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561013f5761013a82826101aa565b505050565b6100a761021c565b806001600160a01b03163b5f0361017c5780604051634c9c8ce360e01b815260040161017391906103bd565b60405180910390fd5b5f805160206103fe83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101c691906103d1565b5f60405180830381855af49150503d805f81146101fe576040519150601f19603f3d011682016040523d82523d5f602084013e610203565b606091505b509150915061021385838361023b565b95945050505050565b341561005f5760405163b398979f60e01b815260040160405180910390fd5b6060826102505761024b82610291565b61028a565b815115801561026757506001600160a01b0384163b155b156102875783604051639996b31560e01b815260040161017391906103bd565b50805b9392505050565b8051156102a15780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f80858511156102c8575f80fd5b838611156102d4575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610306575f80fd5b82356001600160a01b038116811461031c575f80fd5b915060208301356001600160401b0380821115610337575f80fd5b818501915085601f83011261034a575f80fd5b81358181111561035c5761035c6102e1565b604051601f8201601f19908116603f01168101908382118183101715610384576103846102e1565b8160405282815288602084870101111561039c575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b5f82515f5b818110156103f057602081860181015185830152016103d6565b505f92019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220ed34fa57754ee02cddb50941efa15692106b258ce5586c40758a5937940c1a9864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000013dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220ba835c664aa1ec5efc320e5c8cd6c9ed245285050f4a1038f85a4b2b8f17dec364736f6c63430008140033", + "deployedBytecode": "0x608060405234801562000010575f80fd5b506004361062000290575f3560e01c8063066ec0121462000294578063080b311114620002c05780630a0d9fbe14620002e857806311f6b287146200030357806312b86e19146200031a5780631489ed10146200033357806315064c96146200034a5780631608859c14620003585780631796a1ae146200036f5780631816b7e514620003965780632072f6c514620003ad578063248a9ca314620003b75780632528016914620003dd5780632f2ff15d146200049157806336568abe14620004a8578063394218e914620004bf578063477fa27014620004d65780634d4d333814620004df57806355a71ee014620004f657806360469169146200053957806365c0504d14620005435780637222020f14620005f15780637975fcfe14620006085780637fb6e76a146200062e578063841b24d7146200065657806387c20c0114620006715780638bd4f071146200068857806391d14854146200069f57806399f5634e14620006b65780639a908e7314620006c05780639c9f3dfe14620006d7578063a066215c14620006ee578063a217fddf1462000705578063a2967d99146200070d578063a3c573eb1462000717578063afd23cbe146200074e578063b99d0ad71462000778578063c1acbc34146200084f578063c4c928c2146200086a578063ceee281d1462000881578063d02103ca14620008a9578063d5073f6f14620008d1578063d547741f14620008e8578063d939b31514620008ff578063dbc169761462000913578063dde0ff77146200091d578063e0bfd3d21462000938578063e136edf7146200094f578063e46761c41462000966578063f34eb8eb146200098e578063f4e9267514620009a5578063f9c4c2ae14620009b6575b5f80fd5b608454620002a8906001600160401b031681565b604051620002b7919062004349565b60405180910390f35b620002d7620002d136600462004388565b62000acc565b6040519015158152602001620002b7565b608554620002a890600160401b90046001600160401b031681565b620002a862000314366004620043be565b62000af5565b620003316200032b366004620043ec565b62000b14565b005b620003316200034436600462004493565b62000cbc565b606f54620002d79060ff1681565b620003316200036936600462004388565b62000e44565b607e54620003809063ffffffff1681565b60405163ffffffff9091168152602001620002b7565b62000331620003a736600462004518565b62000ed7565b6200033162000f82565b620003ce620003c836600462004542565b62000ffb565b604051908152602001620002b7565b6200045d620003ee36600462004388565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002b7565b62000331620004a23660046200455a565b6200100f565b62000331620004b93660046200455a565b62001031565b62000331620004d03660046200458b565b6200106b565b608654620003ce565b62000331620004f0366004620045a7565b62001119565b620003ce6200050736600462004388565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620003ce6200158d565b620005a762000554366004620043be565b607f6020525f90815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002b7565b6200033162000602366004620043be565b620015a4565b6200061f6200061936600462004658565b6200168c565b604051620002b791906200470b565b620003806200063f3660046200458b565b60836020525f908152604090205463ffffffff1681565b608454620002a890600160c01b90046001600160401b031681565b620003316200068236600462004493565b620016be565b6200033162000699366004620043ec565b620019d9565b620002d7620006b03660046200455a565b62001a8d565b620003ce62001ab7565b620002a8620006d13660046200471f565b62001b9d565b62000331620006e83660046200458b565b62001d64565b62000331620006ff3660046200458b565b62001e06565b620003ce5f81565b620003ce62001ea4565b6200073f7f000000000000000000000000000000000000000000000000000000000000000081565b604051620002b791906200474a565b6085546200076490600160801b900461ffff1681565b60405161ffff9091168152602001620002b7565b6200080d6200078936600462004388565b60408051608080820183525f8083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002b7919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002a890600160801b90046001600160401b031681565b620003316200087b3660046200475e565b62002259565b6200038062000892366004620047ef565b60826020525f908152604090205463ffffffff1681565b6200073f7f000000000000000000000000000000000000000000000000000000000000000081565b62000331620008e236600462004542565b6200251c565b62000331620008f93660046200455a565b620025a6565b608554620002a8906001600160401b031681565b62000331620025c8565b608454620002a890600160401b90046001600160401b031681565b62000331620009493660046200481e565b6200265f565b62000331620009603660046200493a565b620026e3565b6200073f7f000000000000000000000000000000000000000000000000000000000000000081565b620003316200099f36600462004a13565b62002b3a565b608054620003809063ffffffff1681565b62000a4c620009c7366004620043be565b60816020525f9081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002b7565b63ffffffff82165f90815260816020526040812062000aec908362002d1c565b90505b92915050565b63ffffffff81165f90815260816020526040812062000aef9062002d60565b5f805160206200598583398151915262000b2e8162002dcf565b63ffffffff89165f90815260816020526040902062000b54818a8a8a8a8a8a8a62002ddb565b600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562000bbb576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000bf462001ea4565b6040518263ffffffff1660e01b815260040162000c1391815260200190565b5f604051808303815f87803b15801562000c2b575f80fd5b505af115801562000c3e573d5f803e3d5ffd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b5f805160206200598583398151915262000cd68162002dcf565b63ffffffff89165f90815260816020526040902062000cfc818a8a8a8a8a8a8a62003157565b600681018054600160401b600160801b031916600160401b6001600160401b038a81169182029290921783555f9081526002840160205260409020879055600583018890559054600160801b9004161562000d63576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000d9c62001ea4565b6040518263ffffffff1660e01b815260040162000dbb91815260200190565b5f604051808303815f87803b15801562000dd3575f80fd5b505af115801562000de6573d5f803e3d5ffd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a60405162000e309392919062004aa5565b60405180910390a350505050505050505050565b63ffffffff82165f90815260816020526040902062000e725f80516020620059858339815191523362001a8d565b62000ec657606f5460ff161562000e9c57604051630bc011ff60e21b815260040160405180910390fd5b62000ea8818362002d1c565b62000ec657604051630674f25160e11b815260040160405180910390fd5b62000ed281836200350b565b505050565b5f805160206200590583398151915262000ef18162002dcf565b6103e88261ffff16108062000f0b57506103ff8261ffff16115b1562000f2a57604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b62000f9c5f80516020620059458339815191523362001a8d565b62000fef57608454429062000fc69062093a8090600160801b90046001600160401b031662004ada565b6001600160401b0316111562000fef5760405163692baaad60e11b815260040160405180910390fd5b62000ff9620036f6565b565b5f9081526034602052604090206001015490565b6200101a8262000ffb565b620010258162002dcf565b62000ed2838362003770565b6001600160a01b03811633146200105b57604051630b4ad1cd60e31b815260040160405180910390fd5b620010678282620037db565b5050565b5f8051602062005905833981519152620010858162002dcf565b606f5460ff16620010c7576084546001600160401b03600160c01b909104811690831610620010c75760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19062000f7690849062004349565b5f54600290610100900460ff161580156200113a57505f5460ff8083169116105b620011a35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200122362003844565b6200123d5f80516020620059858339815191528a620038b0565b620012495f86620038b0565b620012635f805160206200588583398151915286620038b0565b6200127d5f80516020620058e583398151915286620038b0565b620012975f805160206200582583398151915286620038b0565b620012b15f805160206200586583398151915287620038b0565b620012cb5f805160206200596583398151915287620038b0565b620012e55f80516020620058a583398151915287620038b0565b620012ff5f805160206200590583398151915287620038b0565b620013275f80516020620059858339815191525f8051602062005805833981519152620038bc565b620013415f805160206200580583398151915287620038b0565b6200135b5f805160206200584583398151915287620038b0565b620013835f80516020620059458339815191525f8051602062005925833981519152620038bc565b6200139d5f805160206200594583398151915285620038b0565b620013b75f805160206200592583398151915285620038b0565b5f620013ca8484600561044d5f6200390f565b6073546074549192506001600160401b03600160401b909104811691168082146200140857604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b038181165f8181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620015089695831695600160581b909104909216936076936077939192919091169060040162004bab565b5f604051808303815f87803b15801562001520575f80fd5b505af115801562001533573d5f803e3d5ffd5b50505f805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498935060200191506200157a9050565b60405180910390a1505050505050505050565b5f60865460646200159f919062004c10565b905090565b5f8051602062005865833981519152620015be8162002dcf565b63ffffffff82161580620015dd5750607e5463ffffffff908116908316115b15620015fc57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f60205260409020600180820154600160e81b900460ff16151590036200164257604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b63ffffffff86165f908152608160205260409020606090620016b390878787878762003b27565b979650505050505050565b606f5460ff1615620016e357604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602090815260408083206084546001600160401b038a8116865260038301909452919093206001015442926200173192600160c01b90048116911662004ada565b6001600160401b031611156200175a57604051638a0704d360e01b815260040160405180910390fd5b6103e862001769888862004c2a565b6001600160401b031611156200179257604051635acfba9d60e11b815260040160405180910390fd5b620017a4818989898989898962003157565b620017b0818762003c61565b6085546001600160401b03165f03620018b757600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b900416156200182a576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200186362001ea4565b6040518263ffffffff1660e01b81526004016200188291815260200190565b5f604051808303815f87803b1580156200189a575f80fd5b505af1158015620018ad573d5f803e3d5ffd5b5050505062001980565b620018c28162003e58565b600681018054600160801b90046001600160401b0316906010620018e68362004c4d565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b900487165f90815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b4888789604051620019c69392919062004aa5565b60405180910390a3505050505050505050565b606f5460ff1615620019fe57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f90815260816020526040902062001a24818989898989898962002ddb565b6001600160401b0385165f9081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a162001a82620036f6565b505050505050505050565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162001b0791906200474a565b602060405180830381865afa15801562001b23573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001b49919062004c7d565b6084549091505f9062001b6f906001600160401b03600160401b82048116911662004c2a565b6001600160401b03169050805f0362001b8a575f9250505090565b62001b96818362004ca9565b9250505090565b606f545f9060ff161562001bc457604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff169081900362001bfb576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f0362001c2557604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f908152608160205260408120608480549192879262001c579084906001600160401b031662004ada565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f62001c8c878362004ada565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f95865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b03199092169290931691909117179055905062001d1a8362003e58565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a258260405162001d52919062004349565b60405180910390a29695505050505050565b5f805160206200590583398151915262001d7e8162002dcf565b606f5460ff1662001db9576085546001600160401b039081169083161062001db95760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759062000f7690849062004349565b5f805160206200590583398151915262001e208162002dcf565b62015180826001600160401b0316111562001e4e57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289062000f7690849062004349565b6080545f9063ffffffff1680820362001ebe57505f919050565b5f816001600160401b0381111562001eda5762001eda62004896565b60405190808252806020026020018201604052801562001f04578160200160208202803683370190505b5090505f5b8281101562001f745760815f62001f2283600162004cbf565b63ffffffff1663ffffffff1681526020019081526020015f206005015482828151811062001f545762001f5462004cd5565b60209081029190910101528062001f6b8162004ce9565b91505062001f09565b505f60205b83600114620021b4575f62001f9060028662004d04565b62001f9d60028762004ca9565b62001fa9919062004cbf565b90505f816001600160401b0381111562001fc75762001fc762004896565b60405190808252806020026020018201604052801562001ff1578160200160208202803683370190505b5090505f5b8281101562002168576200200c60018462004d1a565b811480156200202757506200202360028862004d04565b6001145b15620020a757856200203b82600262004c10565b815181106200204e576200204e62004cd5565b6020026020010151856040516020016200206a92919062004d30565b6040516020818303038152906040528051906020012082828151811062002095576200209562004cd5565b60200260200101818152505062002153565b85620020b582600262004c10565b81518110620020c857620020c862004cd5565b602002602001015186826002620020e0919062004c10565b620020ed90600162004cbf565b8151811062002100576200210062004cd5565b60200260200101516040516020016200211b92919062004d30565b6040516020818303038152906040528051906020012082828151811062002146576200214662004cd5565b6020026020010181815250505b806200215f8162004ce9565b91505062001ff6565b5080945081955083846040516020016200218492919062004d30565b6040516020818303038152906040528051906020012093508280620021a99062004d3e565b935050505062001f79565b5f835f81518110620021ca57620021ca62004cd5565b602002602001015190505f5b828110156200224f578184604051602001620021f492919062004d30565b60405160208183030381529060405280519060200120915083846040516020016200222192919062004d30565b6040516020818303038152906040528051906020012093508080620022469062004ce9565b915050620021d6565b5095945050505050565b5f8051602062005825833981519152620022738162002dcf565b63ffffffff84161580620022925750607e5463ffffffff908116908516115b15620022b157604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526082602052604081205463ffffffff1690819003620022f1576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918716600160401b9091046001600160401b0316036200233f57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86165f908152607f60205260409020600180820154600160e81b900460ff16151590036200238557604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b9092041614620023c357604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790555f620024428462000af5565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef28692620024979216908b908b9060040162004d56565b5f604051808303815f87803b158015620024af575f80fd5b505af1158015620024c2573d5f803e3d5ffd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b5f8051602062005845833981519152620025368162002dcf565b683635c9adc5dea00000821180620025515750633b9aca0082105b156200257057604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162000f76565b620025b18262000ffb565b620025bc8162002dcf565b62000ed28383620037db565b5f80516020620058a5833981519152620025e28162002dcf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156200263b575f80fd5b505af11580156200264e573d5f803e3d5ffd5b505050506200265c62003f21565b50565b5f80516020620058e5833981519152620026798162002dcf565b6001600160401b0384165f9081526083602052604090205463ffffffff1615620026b6576040516337c8fe0960e11b815260040160405180910390fd5b5f620026c688888888876200390f565b5f8080526002909101602052604090209390935550505050505050565b5f8051602062005965833981519152620026fd8162002dcf565b63ffffffff891615806200271c5750607e5463ffffffff908116908a16115b156200273b57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff89165f908152607f60205260409020600180820154600160e81b900460ff16151590036200278157604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b0389165f9081526083602052604090205463ffffffff1615620027be576040516337c8fe0960e11b815260040160405180910390fd5b608080545f91908290620027d89063ffffffff1662004d95565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b0390921691309162002825906200433b565b620028339392919062004db0565b604051809103905ff0801580156200284d573d5f803e3d5ffd5b5090508160835f8d6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508b815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508c63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f9a84992ead4481f37097c7663e97ed883b31f216fae5685c6ee576a656483cd98e848f8d8d60405162002aba95949392919063ffffffff95861681526001600160a01b0394851660208201526001600160401b03939093166040840152921660608201529116608082015260a00190565b60405180910390a26040516308fd7e2160e31b81526001600160a01b038316906347ebf1089062002afc908e908e9088908f908f908f908f9060040162004de6565b5f604051808303815f87803b15801562002b14575f80fd5b505af115801562002b27573d5f803e3d5ffd5b5050505050505050505050505050505050565b5f805160206200588583398151915262002b548162002dcf565b607e80545f9190829062002b6e9063ffffffff1662004d95565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff1681526020015f1515815260200185815250607f5f8363ffffffff1663ffffffff1681526020019081526020015f205f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002d0a9695949392919062004e52565b60405180910390a25050505050505050565b6085546001600160401b038281165f9081526004850160205260408120549092429262002d4e92918116911662004ada565b6001600160401b031611159392505050565b60068101545f90600160801b90046001600160401b03161562002db2575060068101546001600160401b03600160801b90910481165f9081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b6200265c813362003f79565b60078801545f906001600160401b03908116908716101562002e105760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b0388161562002eb05760068901546001600160401b03600160801b9091048116908916111562002e5a5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f90815260048a0160205260409020600281015481549092888116600160401b909204161462002ea957604051632bd2e3e760e01b815260040160405180910390fd5b5062002f24565b506001600160401b0385165f9081526002890160205260409020548062002eea576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b9091048116908716111562002f2457604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b9091048116908816118062002f5d5750876001600160401b0316876001600160401b031611155b8062002f81575060068901546001600160401b03600160c01b909104811690881611155b1562002fa05760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260048b016020526040902054600160401b900481169086161462002fe6576040516332a2a77f60e01b815260040160405180910390fd5b5f62002ff78a888888868962003b27565b90505f5f80516020620058c58339815191526002836040516200301b919062004eaa565b602060405180830381855afa15801562003037573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200305c919062004c7d565b62003068919062004d04565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620030ac9188919060040162004ec7565b602060405180830381865afa158015620030c8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620030ee919062004f03565b6200310c576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260048c0160205260409020600201548590036200314a5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b5f80620031648a62002d60565b60078b01549091506001600160401b0390811690891610156200319a5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038916156200323c5760068a01546001600160401b03600160801b9091048116908a161115620031e45760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a165f90815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200323557604051632bd2e3e760e01b815260040160405180910390fd5b50620032ab565b6001600160401b0388165f90815260028b01602052604090205491508162003277576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b03161115620032ab57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620032de5760405163b9b18f5760e01b815260040160405180910390fd5b5f620032ef8b8a8a8a878b62003b27565b90505f5f80516020620058c583398151915260028360405162003313919062004eaa565b602060405180830381855afa1580156200332f573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019062003354919062004c7d565b62003360919062004d04565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620033a49189919060040162004ec7565b602060405180830381865afa158015620033c0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620033e6919062004f03565b62003404576040516309bde33960e01b815260040160405180910390fd5b5f62003411848b62004c2a565b90506200346a87826001600160401b03166200342c62001ab7565b62003438919062004c10565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062003fa3565b80608460088282829054906101000a90046001600160401b031662003490919062004ada565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d1539060640162002afc565b60068201546001600160401b03600160c01b90910481169082161115806200354a575060068201546001600160401b03600160801b9091048116908216115b15620035695760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f81815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200362462001ea4565b6040518263ffffffff1660e01b81526004016200364391815260200190565b5f604051808303815f87803b1580156200365b575f80fd5b505af11580156200366e573d5f803e3d5ffd5b505085546001600160a01b03165f90815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156200374f575f80fd5b505af115801562003762573d5f803e3d5ffd5b5050505062000ff962003ff7565b6200377c828262001a8d565b62001067575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b620037e7828262001a8d565b1562001067575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b5f54610100900460ff1662000ff95760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016200119a565b62001067828262003770565b5f620038c88362000ffb565b5f84815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080545f91829182906200392a9063ffffffff1662004d95565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f866001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f896001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff16021790555060815f8263ffffffff1663ffffffff1681526020019081526020015f20915086825f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b0316021790555085826001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555083825f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003b1594939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086165f818152600389016020526040808220549388168252902054606092911580159062003b5c575081155b1562003b7b5760405163340c614f60e11b815260040160405180910390fd5b8062003b9a576040516366385b5160e01b815260040160405180910390fd5b62003ba58462004053565b62003bc3576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b5f62003c6d8362002d60565b9050815f8062003c7e848462004c2a565b6085546001600160401b0391821692505f9162003ca491600160401b9004164262004d1a565b90505b846001600160401b0316846001600160401b03161462003d2d576001600160401b038085165f9081526003890160205260409020600181015490911682101562003d08576001810154600160401b90046001600160401b0316945062003d26565b62003d14868662004c2a565b6001600160401b031693505062003d2d565b5062003ca7565b5f62003d3a848462004d1a565b90508381101562003d9857808403600c811162003d58578062003d5b565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a608654028162003d8d5762003d8d62004c95565b046086555062003e0f565b838103600c811162003dab578062003dae565b600c5b90505f816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162003de75762003de762004c95565b04905080608654670de0b6b3a7640000028162003e085762003e0862004c95565b0460865550505b683635c9adc5dea00000608654111562003e3657683635c9adc5dea0000060865562003e4e565b633b9aca00608654101562003e4e57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b9092041611156200265c5760068101545f9062003ea290600160c01b90046001600160401b0316600162004ada565b905062003eb0828262002d1c565b15620010675760068201545f9060029062003edd908490600160801b90046001600160401b031662004c2a565b62003ee9919062004f24565b62003ef5908362004ada565b905062003f03838262002d1c565b1562003f155762000ed283826200350b565b62000ed283836200350b565b606f5460ff1662003f4557604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b62003f85828262001a8d565b6200106757604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905262000ed2908490620040d7565b606f5460ff16156200401c57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff000000016001600160401b03831610801562004089575067ffffffff00000001604083901c6001600160401b0316105b8015620040aa575067ffffffff00000001608083901c6001600160401b0316105b8015620040c2575067ffffffff0000000160c083901c105b15620040d057506001919050565b505f919050565b5f6200412d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620041af9092919063ffffffff16565b80519091501562000ed257808060200190518101906200414e919062004f03565b62000ed25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200119a565b6060620041bf84845f85620041c7565b949350505050565b6060824710156200422a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200119a565b5f80866001600160a01b0316858760405162004247919062004eaa565b5f6040518083038185875af1925050503d805f811462004283576040519150601f19603f3d011682016040523d82523d5f602084013e62004288565b606091505b5091509150620016b38783838760608315620043085782515f0362004300576001600160a01b0385163b620043005760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200119a565b5081620041bf565b620041bf83838151156200431f5781518083602001fd5b8060405162461bcd60e51b81526004016200119a91906200470b565b6108b88062004f4d83390190565b6001600160401b0391909116815260200190565b803563ffffffff8116811462002dca575f80fd5b80356001600160401b038116811462002dca575f80fd5b5f80604083850312156200439a575f80fd5b620043a5836200435d565b9150620043b56020840162004371565b90509250929050565b5f60208284031215620043cf575f80fd5b62000aec826200435d565b80610300810183101562000aef575f80fd5b5f805f805f805f806103e0898b03121562004405575f80fd5b62004410896200435d565b97506200442060208a0162004371565b96506200443060408a0162004371565b95506200444060608a0162004371565b94506200445060808a0162004371565b935060a0890135925060c089013591506200446f8a60e08b01620043da565b90509295985092959890939650565b6001600160a01b03811681146200265c575f80fd5b5f805f805f805f806103e0898b031215620044ac575f80fd5b620044b7896200435d565b9750620044c760208a0162004371565b9650620044d760408a0162004371565b9550620044e760608a0162004371565b94506080890135935060a0890135925060c089013562004507816200447e565b91506200446f8a60e08b01620043da565b5f6020828403121562004529575f80fd5b813561ffff811681146200453b575f80fd5b9392505050565b5f6020828403121562004553575f80fd5b5035919050565b5f80604083850312156200456c575f80fd5b82359150602083013562004580816200447e565b809150509250929050565b5f602082840312156200459c575f80fd5b62000aec8262004371565b5f805f805f805f80610100898b031215620045c0575f80fd5b8835620045cd816200447e565b9750620045dd60208a0162004371565b9650620045ed60408a0162004371565b95506060890135620045ff816200447e565b9450608089013562004611816200447e565b935060a089013562004623816200447e565b925060c089013562004635816200447e565b915060e089013562004647816200447e565b809150509295985092959890939650565b5f805f805f8060c087890312156200466e575f80fd5b62004679876200435d565b9550620046896020880162004371565b9450620046996040880162004371565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b83811015620046d6578181015183820152602001620046bc565b50505f910152565b5f8151808452620046f7816020860160208601620046ba565b601f01601f19169290920160200192915050565b602081525f62000aec6020830184620046de565b5f806040838503121562004731575f80fd5b6200473c8362004371565b946020939093013593505050565b6001600160a01b0391909116815260200190565b5f805f806060858703121562004772575f80fd5b84356200477f816200447e565b93506200478f602086016200435d565b925060408501356001600160401b0380821115620047ab575f80fd5b818701915087601f830112620047bf575f80fd5b813581811115620047ce575f80fd5b886020828501011115620047e0575f80fd5b95989497505060200194505050565b5f6020828403121562004800575f80fd5b81356200453b816200447e565b803560ff8116811462002dca575f80fd5b5f805f805f8060c0878903121562004834575f80fd5b863562004841816200447e565b9550602087013562004853816200447e565b9450620048636040880162004371565b9350620048736060880162004371565b9250608087013591506200488a60a088016200480d565b90509295509295509295565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620048ba575f80fd5b81356001600160401b0380821115620048d757620048d762004896565b604051601f8301601f19908116603f0116810190828211818310171562004902576200490262004896565b816040528381528660208588010111156200491b575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f80610100898b03121562004953575f80fd5b6200495e896200435d565b97506200496e60208a0162004371565b9650604089013562004980816200447e565b9550606089013562004992816200447e565b94506080890135620049a4816200447e565b9350620049b460a08a016200435d565b925060c08901356001600160401b0380821115620049d0575f80fd5b620049de8c838d01620048aa565b935060e08b0135915080821115620049f4575f80fd5b5062004a038b828c01620048aa565b9150509295985092959890939650565b5f805f805f8060c0878903121562004a29575f80fd5b863562004a36816200447e565b9550602087013562004a48816200447e565b945062004a586040880162004371565b935062004a68606088016200480d565b92506080870135915060a08701356001600160401b0381111562004a8a575f80fd5b62004a9889828a01620048aa565b9150509295509295509295565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111562004afd5762004afd62004ac6565b5092915050565b80545f90600181811c908083168062004b1e57607f831692505b6020808410820362004b3e57634e487b7160e01b5f52602260045260245ffd5b8388526020880182801562004b5c576001811462004b735762004b9e565b60ff198716825285151560051b8201975062004b9e565b5f898152602090205f5b8781101562004b985781548482015290860190840162004b7d565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c0604082018190525f9062004bd89083018762004b04565b828103606084015262004bec818762004b04565b608084019590955250506001600160401b039190911660a090910152949350505050565b808202811582820484141762000aef5762000aef62004ac6565b6001600160401b0382811682821603908082111562004afd5762004afd62004ac6565b5f6001600160401b038281166002600160401b0319810162004c735762004c7362004ac6565b6001019392505050565b5f6020828403121562004c8e575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8262004cba5762004cba62004c95565b500490565b8082018082111562000aef5762000aef62004ac6565b634e487b7160e01b5f52603260045260245ffd5b5f6001820162004cfd5762004cfd62004ac6565b5060010190565b5f8262004d155762004d1562004c95565b500690565b8181038181111562000aef5762000aef62004ac6565b918252602082015260400190565b5f8162004d4f5762004d4f62004ac6565b505f190190565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b5f63ffffffff80831681810362004c735762004c7362004ac6565b6001600160a01b038481168252831660208201526060604082018190525f9062004ddd90830184620046de565b95945050505050565b6001600160a01b038881168252878116602083015263ffffffff878116604084015290861660608301528416608082015260e060a082018190525f9062004e3090830185620046de565b82810360c084015262004e448185620046de565b9a9950505050505050505050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190525f9062004e9e90830184620046de565b98975050505050505050565b5f825162004ebd818460208701620046ba565b9190910192915050565b6103208101610300808584378201835f5b600181101562004ef957815183526020928301929091019060010162004ed8565b5050509392505050565b5f6020828403121562004f14575f80fd5b815180151581146200453b575f80fd5b5f6001600160401b038381168062004f405762004f4062004c95565b9216919091049291505056fe60a06040526040516108b83803806108b883398101604081905261002291610349565b828161002e8282610056565b50506001600160a01b03821660805261004e61004960805190565b6100b4565b50505061042e565b61005f82610121565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100a8576100a3828261019f565b505050565b6100b0610212565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f35f80516020610898833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161011e81610233565b50565b806001600160a01b03163b5f0361015b57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516101bb9190610413565b5f60405180830381855af49150503d805f81146101f3576040519150601f19603f3d011682016040523d82523d5f602084013e6101f8565b606091505b509092509050610209858383610270565b95945050505050565b34156102315760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661025c57604051633173bdd160e11b81525f6004820152602401610152565b805f8051602061089883398151915261017e565b60608261028557610280826102cf565b6102c8565b815115801561029c57506001600160a01b0384163b155b156102c557604051639996b31560e01b81526001600160a01b0385166004820152602401610152565b50805b9392505050565b8051156102df5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461030e575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015610341578181015183820152602001610329565b50505f910152565b5f805f6060848603121561035b575f80fd5b610364846102f8565b9250610372602085016102f8565b60408501519092506001600160401b038082111561038e575f80fd5b818601915086601f8301126103a1575f80fd5b8151818111156103b3576103b3610313565b604051601f8201601f19908116603f011681019083821181831017156103db576103db610313565b816040528281528960208487010111156103f3575f80fd5b610404836020830160208801610327565b80955050505050509250925092565b5f8251610424818460208701610327565b9190910192915050565b6080516104536104455f395f601001526104535ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610069575f356001600160e01b03191663278f794360e11b146100615761005f61006d565b565b61005f61007d565b61005f5b61005f6100786100ab565b6100cf565b5f8061008c36600481846102ba565b81019061009991906102f5565b915091506100a782826100ed565b5050565b5f6100ca5f805160206103fe833981519152546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156100e9573d5ff35b3d5ffd5b6100f682610147565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561013f5761013a82826101aa565b505050565b6100a761021c565b806001600160a01b03163b5f0361017c5780604051634c9c8ce360e01b815260040161017391906103bd565b60405180910390fd5b5f805160206103fe83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101c691906103d1565b5f60405180830381855af49150503d805f81146101fe576040519150601f19603f3d011682016040523d82523d5f602084013e610203565b606091505b509150915061021385838361023b565b95945050505050565b341561005f5760405163b398979f60e01b815260040160405180910390fd5b6060826102505761024b82610291565b61028a565b815115801561026757506001600160a01b0384163b155b156102875783604051639996b31560e01b815260040161017391906103bd565b50805b9392505050565b8051156102a15780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f80858511156102c8575f80fd5b838611156102d4575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610306575f80fd5b82356001600160a01b038116811461031c575f80fd5b915060208301356001600160401b0380821115610337575f80fd5b818501915085601f83011261034a575f80fd5b81358181111561035c5761035c6102e1565b604051601f8201601f19908116603f01168101908382118183101715610384576103846102e1565b8160405282815288602084870101111561039c575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b5f82515f5b818110156103f057602081860181015185830152016103d6565b505f92019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220ed34fa57754ee02cddb50941efa15692106b258ce5586c40758a5937940c1a9864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000013dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220ba835c664aa1ec5efc320e5c8cd6c9ed245285050f4a1038f85a4b2b8f17dec364736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVM.json b/compiled-contracts/paris/PolygonZkEVM.json index 98e418fb3..5ea36755a 100644 --- a/compiled-contracts/paris/PolygonZkEVM.json +++ b/compiled-contracts/paris/PolygonZkEVM.json @@ -1711,8 +1711,8 @@ "type": "function" } ], - "bytecode": "0x6101406040523480156200001257600080fd5b5060405162006078380380620060788339810160408190526200003591620000a5565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b0391821661010052166101205262000131565b6001600160a01b03811681146200008557600080fd5b50565b80516001600160401b0381168114620000a057600080fd5b919050565b60008060008060008060c08789031215620000bf57600080fd5b8651620000cc816200006f565b6020880151909650620000df816200006f565b6040880151909550620000f2816200006f565b606088015190945062000105816200006f565b9250620001156080880162000088565b91506200012560a0880162000088565b90509295509295509295565b60805160a05160c05160e0516101005161012051615e79620001ff6000396000818161069601528181610dec01526131760152600081816108030152610dc20152600081816107c901528181611d910152818161380f0152614c8f01526000818161096f01528181610f5f01528181611130015281816119990152818161216a015281816139f70152614759015260008181610a1c015281816140b4015261450c0152600081816108bf01528181611d5f0152818161265b015281816139cb01526141a20152615e796000f3fe608060405234801561001057600080fd5b50600436106103ba5760003560e01c8063841b24d7116101f4578063c754c7ed1161011a578063e7a7ed02116100ad578063f14916d61161007c578063f14916d614610a7e578063f2fde38b14610a91578063f851a44014610aa4578063f8b823e414610ac457600080fd5b8063e7a7ed02146109e7578063e8bf92ed14610a17578063eaeb077b14610a3e578063ed6b010414610a5157600080fd5b8063d2e129f9116100e9578063d2e129f914610991578063d8d1091b146109a4578063d939b315146109b7578063dbc16976146109df57600080fd5b8063c754c7ed146108fc578063c89e42df14610928578063cfa8ed471461093b578063d02103ca1461096a57600080fd5b8063a3c573eb11610192578063b4d63f5811610161578063b4d63f5814610853578063b6b0b097146108ba578063ba58ae39146108e1578063c0ed84e0146108f457600080fd5b8063a3c573eb146107c4578063ada8f919146107eb578063adc879e9146107fe578063afd23cbe1461082557600080fd5b806399f5634e116101ce57806399f5634e146107835780639aa972a31461078b5780639c9f3dfe1461079e578063a066215c146107b157600080fd5b8063841b24d71461072d5780638c3d73011461075d5780638da5cb5b1461076557600080fd5b80634a1a89a7116102e4578063621dd411116102775780637215541a116102465780637215541a1461066a5780637fcb36531461067d578063831c7ead14610691578063837a4738146106b857600080fd5b8063621dd4111461061c5780636b8616ce1461062f5780636ff512cc1461064f578063715018a61461066257600080fd5b8063542028d5116102b3578063542028d5146105f15780635e9145c9146105f95780635ec919581461060c578063604691691461061457600080fd5b80634a1a89a71461057d5780634a910e6a1461059d5780634e487706146105b05780635392c5e0146105c357600080fd5b8063298789831161035c578063394218e91161032b578063394218e91461050e578063423fa856146105215780634560526714610541578063458c04771461056957600080fd5b806329878983146104a95780632b0006fa146104d55780632c1f816a146104e8578063383b3be8146104fb57600080fd5b80631816b7e5116103985780631816b7e51461042857806319d8ac611461043d578063220d789914610451578063267822471461046457600080fd5b80630a0d9fbe146103bf578063107bf28c146103f657806315064c961461040b575b600080fd5b606f546103d890610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6103fe610acd565b6040516103ed91906152bb565b606f546104189060ff1681565b60405190151581526020016103ed565b61043b6104363660046152d5565b610b5b565b005b6073546103d89067ffffffffffffffff1681565b6103fe61045f366004615311565b610c73565b607b546104849073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103ed565b6074546104849068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61043b6104e3366004615376565b610e4a565b61043b6104f63660046153de565b61101a565b610418610509366004615458565b611228565b61043b61051c366004615458565b61127e565b6073546103d89068010000000000000000900467ffffffffffffffff1681565b6073546103d890700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546103d89067ffffffffffffffff1681565b6079546103d89068010000000000000000900467ffffffffffffffff1681565b61043b6105ab366004615458565b611402565b61043b6105be366004615458565b6114b5565b6105e36105d1366004615458565b60756020526000908152604090205481565b6040519081526020016103ed565b6103fe611639565b61043b6106073660046154e3565b611646565b61043b611e50565b6105e3611f50565b61043b61062a366004615376565b611f66565b6105e361063d366004615458565b60716020526000908152604090205481565b61043b61065d366004615537565b6122ee565b61043b6123c3565b61043b610678366004615458565b6123d7565b6074546103d89067ffffffffffffffff1681565b6103d87f000000000000000000000000000000000000000000000000000000000000000081565b6107016106c6366004615552565b60786020526000908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016103ed565b6079546103d8907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61043b612547565b60335473ffffffffffffffffffffffffffffffffffffffff16610484565b6105e3612613565b61043b6107993660046153de565b61276c565b61043b6107ac366004615458565b61281d565b61043b6107bf366004615458565b612999565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b61043b6107f9366004615537565b612a9f565b6103d87f000000000000000000000000000000000000000000000000000000000000000081565b606f54610840906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103ed565b610894610861366004615458565b6072602052600090815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016103ed565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b6104186108ef366004615552565b612b63565b6103d8612bed565b607b546103d89074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b61043b610936366004615645565b612c42565b606f54610484906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b61043b61099f3660046156bc565b612ccf565b61043b6109b236600461576f565b61321a565b6079546103d890700100000000000000000000000000000000900467ffffffffffffffff1681565b61043b6137bc565b6073546103d8907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b61043b610a4c3660046157b1565b613895565b607b54610418907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b61043b610a8c366004615537565b613c8b565b61043b610a9f366004615537565b613d5d565b607a546104849073ffffffffffffffffffffffffffffffffffffffff1681565b6105e360705481565b60778054610ada906157fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610b06906157fd565b8015610b535780601f10610b2857610100808354040283529160200191610b53565b820191906000526020600020905b815481529060010190602001808311610b3657829003601f168201915b505050505081565b607a5473ffffffffffffffffffffffffffffffffffffffff163314610bac576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff161080610bc557506103ff8161ffff16115b15610bfc576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086166000818152607260205260408082205493881682529020546060929115801590610ca7575081155b15610cde576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610d15576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d1e84612b63565b610d54576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610ea7576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610eb5868686868686613e11565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615610f3057607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015610fb857600080fd5b505af1158015610fcc573d6000803e3d6000fd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611077576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611086878787878787876141d5565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092556000908152607560205260409020839055607954161561110157607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b15801561118957600080fd5b505af115801561119d573d6000803e3d6000fd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281166000908152607860205260408120549092429261126c927001000000000000000000000000000000009092048116911661587f565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146112cf576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611316576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166113855760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611385576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610c68565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146114a957606f5460ff161561146a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61147381611228565b6114a9576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114b28161460f565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611506576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561154d576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166115b857607b5467ffffffffffffffff740100000000000000000000000000000000000000009091048116908216106115b8576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001610c68565b60768054610ada906157fd565b606f5460ff1615611683576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146116e3576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600081900361171f576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561175b576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000082048116600081815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b86811015611bab5760008a8a838181106117c3576117c36158a7565b90506020028101906117d591906158d6565b6117de90615914565b8051805160209091012060608201519192509067ffffffffffffffff1615611956578561180a816159a1565b9650506000818360200151846060015160405160200161186293929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a166000908152607190935291205490915081146118eb576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088166000908152607160205260408082209190915560608501519085015190821691161015611950576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611a93565b602082015115801590611a1d575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af11580156119f7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1b91906159c8565b155b15611a54576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611a93576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080611ac6575042826040015167ffffffffffffffff16115b15611afd576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151975050508080611ba3906159e1565b9150506117a7565b50611bb6868561587f565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115611c1f576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611c2b8285615a19565b611c3f9067ffffffffffffffff1688615a3a565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d861660008181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611d3557607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611d87333083607054611d489190615a4d565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190614822565b611d8f614904565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611df757600080fd5b505af1158015611e0b573d6000803e3d6000fd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611ea1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16611efd576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60006070546064611f619190615a4d565b905090565b606f5460ff1615611fa3576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581166000908152607260205260409020600101544292611ff09278010000000000000000000000000000000000000000000000009091048116911661587f565b67ffffffffffffffff161115612032576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e861203f8686615a19565b67ffffffffffffffff161115612081576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61208f868686868686613e11565b612098846149b5565b607954700100000000000000000000000000000000900467ffffffffffffffff166000036121e057607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092556000908152607560205260409020839055607954161561213b57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b1580156121c357600080fd5b505af11580156121d7573d6000803e3d6000fd5b505050506122b0565b6121e8614904565b6079805467ffffffffffffffff16906000612202836159a1565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487166000908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59669060200161100a565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461233f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c68565b6123cb614b95565b6123d56000614c16565b565b60335473ffffffffffffffffffffffffffffffffffffffff16331461253f576000612400612bed565b90508067ffffffffffffffff168267ffffffffffffffff161161244f576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000090910481169083161180612495575067ffffffffffffffff80831660009081526072602052604090206001015416155b156124cc576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff80831660009081526072602052604090206001015442916124fb9162093a80911661587f565b67ffffffffffffffff16111561253d576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6114b2614c8d565b607b5473ffffffffffffffffffffffffffffffffffffffff163314612598576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156126a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c691906159c8565b905060006126d2612bed565b60735467ffffffffffffffff68010000000000000000820481169161272a9170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416615a19565b612734919061587f565b61273e9190615a19565b67ffffffffffffffff1690508060000361275b5760009250505090565b6127658183615a93565b9250505090565b606f5460ff16156127a9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127b8878787878787876141d5565b67ffffffffffffffff84166000908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1612814614c8d565b50505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461286e576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156128b5576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661291c5760795467ffffffffffffffff70010000000000000000000000000000000090910481169082161061291c576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610c68565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146129ea576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff161115612a31576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001610c68565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612af0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c68565b600067ffffffff0000000167ffffffffffffffff8316108015612b9b575067ffffffff00000001604083901c67ffffffffffffffff16105b8015612bbc575067ffffffff00000001608083901c67ffffffffffffffff16105b8015612bd3575067ffffffff0000000160c083901c105b15612be057506001919050565b506000919050565b919050565b60795460009067ffffffffffffffff1615612c31575060795467ffffffffffffffff9081166000908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612c93576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6076612c9f8282615af5565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c6891906152bb565b600054610100900460ff1615808015612cef5750600054600160ff909116105b80612d095750303b158015612d09575060005460ff166001145b612d9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612df857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b612e056020880188615537565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612e5a6040880160208901615537565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055612ebf6080880160608901615537565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790556000805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076612f4a8682615af5565b506077612f578582615af5565b5062093a80612f6c6060890160408a01615458565b67ffffffffffffffff161115612fae576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fbe6060880160408901615458565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a8061302060a0890160808a01615458565b67ffffffffffffffff161115613062576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61307260a0880160808901615458565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613151614d15565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd660007f000000000000000000000000000000000000000000000000000000000000000085856040516131a79493929190615c58565b60405180910390a1801561281457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613277576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16156132b4576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036132f0576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561332c576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff78010000000000000000000000000000000000000000000000008204811691613377918491700100000000000000000000000000000000900416615c90565b11156133af576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000008204811660008181526072602052604081205491937001000000000000000000000000000000009004909216915b8481101561365957600087878381811061340f5761340f6158a7565b90506020028101906134219190615ca3565b61342a90615cd7565b905083613436816159a1565b825180516020918201208185015160408087015190519499509194506000936134989386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260719093529120549091508114613521576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260716020526040812055613546600189615a3a565b84036135b55742607b60149054906101000a900467ffffffffffffffff168460400151613573919061587f565b67ffffffffffffffff1611156135b5576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080613651906159e1565b9150506133f3565b50613664848461587f565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589166000818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461380d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561387557600080fd5b505af1158015613889573d6000803e3d6000fd5b505050506123d5614db5565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16156138f2576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff161561392f576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613939611f50565b905081811115613975576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113888311156139b1576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6139f373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084614822565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a8491906159c8565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16906018613abe836159a1565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051613af5929190615d53565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1660009081526071909352912055323303613c2557607354604080518381523360208201526060918101829052600091810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613c84565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613c7b9493929190615d63565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613cdc576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610c68565b613d65614b95565b73ffffffffffffffffffffffffffffffffffffffff8116613e08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401612d91565b6114b281614c16565b600080613e1c612bed565b905067ffffffffffffffff881615613eec5760795467ffffffffffffffff9081169089161115613e78576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089166000908152607860205260409020600281015481549094509091898116680100000000000000009092041614613ee6576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50613f8d565b67ffffffffffffffff8716600090815260756020526040902054915081613f3f576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115613f8d576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611613fda576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613fe98888888689610c73565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161401e9190615d99565b602060405180830381855afa15801561403b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061405e91906159c8565b6140689190615dab565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916140ea91899190600401615dbf565b602060405180830381865afa158015614107573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061412b9190615dfa565b614161576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6141c93361416f858b615a19565b67ffffffffffffffff16614181612613565b61418b9190615a4d565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190614e44565b50505050505050505050565b600067ffffffffffffffff8816156142a35760795467ffffffffffffffff9081169089161115614231576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff808816600090815260786020526040902060028101548154909288811668010000000000000000909204161461429d576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061433f565b5067ffffffffffffffff8516600090815260756020526040902054806142f5576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff908116908716111561433f576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff908116908816118061437157508767ffffffffffffffff168767ffffffffffffffff1611155b80614398575060795467ffffffffffffffff68010000000000000000909104811690881611155b156143cf576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff878116600090815260786020526040902054680100000000000000009004811690861614614432576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006144418787878588610c73565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516144769190615d99565b602060405180830381855afa158015614493573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906144b691906159c8565b6144c09190615dab565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161454291889190600401615dbf565b602060405180830381865afa15801561455f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145839190615dfa565b6145b9576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89166000908152607860205260409020600201548590036141c9576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff680100000000000000009091048116908216111580614649575060795467ffffffffffffffff908116908216115b15614680576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff818116600081815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b1580156147b257600080fd5b505af11580156147c6573d6000803e3d6000fd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161481591815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526148fe9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614e9f565b50505050565b60795467ffffffffffffffff6801000000000000000082048116911611156123d55760795460009061494d9068010000000000000000900467ffffffffffffffff16600161587f565b905061495881611228565b156114b25760795460009060029061497b90849067ffffffffffffffff16615a19565b6149859190615e1c565b61498f908361587f565b905061499a81611228565b156149ac576149a88161460f565b5050565b6149a88261460f565b60006149bf612bed565b9050816000806149cf8484615a19565b606f5467ffffffffffffffff91821692506000916149f39161010090041642615a3a565b90505b8467ffffffffffffffff168467ffffffffffffffff1614614a7e5767ffffffffffffffff80851660009081526072602052604090206001810154909116821015614a5c57600181015468010000000000000000900467ffffffffffffffff169450614a78565b614a668686615a19565b67ffffffffffffffff16935050614a7e565b506149f6565b6000614a8a8484615a3a565b905083811015614ae157808403600c8111614aa55780614aa8565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281614ad757614ad7615a64565b0460705550614b51565b838103600c8111614af25780614af5565b600c5b90506000816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a76400000281614b2c57614b2c615a64565b04905080607054670de0b6b3a76400000281614b4a57614b4a615a64565b0460705550505b683635c9adc5dea000006070541115614b7657683635c9adc5dea00000607055612814565b633b9aca00607054101561281457633b9aca0060705550505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146123d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612d91565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b158015614cf557600080fd5b505af1158015614d09573d6000803e3d6000fd5b505050506123d5614fab565b600054610100900460ff16614dac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401612d91565b6123d533614c16565b606f5460ff16614df1576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052614e9a9084907fa9059cbb000000000000000000000000000000000000000000000000000000009060640161487c565b505050565b6000614f01826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661503e9092919063ffffffff16565b805190915015614e9a5780806020019051810190614f1f9190615dfa565b614e9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401612d91565b606f5460ff1615614fe8576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b606061504d8484600085615055565b949350505050565b6060824710156150e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401612d91565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516151109190615d99565b60006040518083038185875af1925050503d806000811461514d576040519150601f19603f3d011682016040523d82523d6000602084013e615152565b606091505b50915091506151638783838761516e565b979650505050505050565b606083156152045782516000036151fd5773ffffffffffffffffffffffffffffffffffffffff85163b6151fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612d91565b508161504d565b61504d83838151156152195781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9191906152bb565b60005b83811015615268578181015183820152602001615250565b50506000910152565b6000815180845261528981602086016020860161524d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006152ce6020830184615271565b9392505050565b6000602082840312156152e757600080fd5b813561ffff811681146152ce57600080fd5b803567ffffffffffffffff81168114612be857600080fd5b600080600080600060a0868803121561532957600080fd5b615332866152f9565b9450615340602087016152f9565b94979496505050506040830135926060810135926080909101359150565b80610300810183101561537057600080fd5b92915050565b6000806000806000806103a0878903121561539057600080fd5b615399876152f9565b95506153a7602088016152f9565b94506153b5604088016152f9565b935060608701359250608087013591506153d28860a0890161535e565b90509295509295509295565b60008060008060008060006103c0888a0312156153fa57600080fd5b615403886152f9565b9650615411602089016152f9565b955061541f604089016152f9565b945061542d606089016152f9565b93506080880135925060a0880135915061544a8960c08a0161535e565b905092959891949750929550565b60006020828403121561546a57600080fd5b6152ce826152f9565b60008083601f84011261548557600080fd5b50813567ffffffffffffffff81111561549d57600080fd5b6020830191508360208260051b85010111156154b857600080fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612be857600080fd5b6000806000604084860312156154f857600080fd5b833567ffffffffffffffff81111561550f57600080fd5b61551b86828701615473565b909450925061552e9050602085016154bf565b90509250925092565b60006020828403121561554957600080fd5b6152ce826154bf565b60006020828403121561556457600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126155ab57600080fd5b813567ffffffffffffffff808211156155c6576155c661556b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561560c5761560c61556b565b8160405283815286602085880101111561562557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561565757600080fd5b813567ffffffffffffffff81111561566e57600080fd5b61504d8482850161559a565b60008083601f84011261568c57600080fd5b50813567ffffffffffffffff8111156156a457600080fd5b6020830191508360208285010111156154b857600080fd5b6000806000806000808688036101208112156156d757600080fd5b60a08112156156e557600080fd5b5086955060a0870135945060c087013567ffffffffffffffff8082111561570b57600080fd5b6157178a838b0161559a565b955060e089013591508082111561572d57600080fd5b6157398a838b0161559a565b945061010089013591508082111561575057600080fd5b5061575d89828a0161567a565b979a9699509497509295939492505050565b6000806020838503121561578257600080fd5b823567ffffffffffffffff81111561579957600080fd5b6157a585828601615473565b90969095509350505050565b6000806000604084860312156157c657600080fd5b833567ffffffffffffffff8111156157dd57600080fd5b6157e98682870161567a565b909790965060209590950135949350505050565b600181811c9082168061581157607f821691505b60208210810361584a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8181168382160190808211156158a0576158a0615850565b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261590a57600080fd5b9190910192915050565b60006080823603121561592657600080fd5b6040516080810167ffffffffffffffff828210818311171561594a5761594a61556b565b81604052843591508082111561595f57600080fd5b5061596c3682860161559a565b82525060208301356020820152615985604084016152f9565b6040820152615996606084016152f9565b606082015292915050565b600067ffffffffffffffff8083168181036159be576159be615850565b6001019392505050565b6000602082840312156159da57600080fd5b5051919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a1257615a12615850565b5060010190565b67ffffffffffffffff8281168282160390808211156158a0576158a0615850565b8181038181111561537057615370615850565b808202811582820484141761537057615370615850565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615aa257615aa2615a64565b500490565b601f821115614e9a57600081815260208120601f850160051c81016020861015615ace5750805b601f850160051c820191505b81811015615aed57828155600101615ada565b505050505050565b815167ffffffffffffffff811115615b0f57615b0f61556b565b615b2381615b1d84546157fd565b84615aa7565b602080601f831160018114615b765760008415615b405750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555615aed565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615bc357888601518255948401946001909101908401615ba4565b5085821015615bff57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600067ffffffffffffffff808716835280861660208401525060606040830152615c86606083018486615c0f565b9695505050505050565b8082018082111561537057615370615850565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261590a57600080fd5b600060608236031215615ce957600080fd5b6040516060810167ffffffffffffffff8282108183111715615d0d57615d0d61556b565b816040528435915080821115615d2257600080fd5b50615d2f3682860161559a565b82525060208301356020820152615d48604084016152f9565b604082015292915050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000615c86606083018486615c0f565b6000825161590a81846020870161524d565b600082615dba57615dba615a64565b500690565b61032081016103008085843782018360005b6001811015615df0578151835260209283019290910190600101615dd1565b5050509392505050565b600060208284031215615e0c57600080fd5b815180151581146152ce57600080fd5b600067ffffffffffffffff80841680615e3757615e37615a64565b9216919091049291505056fea26469706673582212207c65fe318a797352428af5d61503d4af269ad89de3f139b6d4f4cab38b830bc864736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106103ba5760003560e01c8063841b24d7116101f4578063c754c7ed1161011a578063e7a7ed02116100ad578063f14916d61161007c578063f14916d614610a7e578063f2fde38b14610a91578063f851a44014610aa4578063f8b823e414610ac457600080fd5b8063e7a7ed02146109e7578063e8bf92ed14610a17578063eaeb077b14610a3e578063ed6b010414610a5157600080fd5b8063d2e129f9116100e9578063d2e129f914610991578063d8d1091b146109a4578063d939b315146109b7578063dbc16976146109df57600080fd5b8063c754c7ed146108fc578063c89e42df14610928578063cfa8ed471461093b578063d02103ca1461096a57600080fd5b8063a3c573eb11610192578063b4d63f5811610161578063b4d63f5814610853578063b6b0b097146108ba578063ba58ae39146108e1578063c0ed84e0146108f457600080fd5b8063a3c573eb146107c4578063ada8f919146107eb578063adc879e9146107fe578063afd23cbe1461082557600080fd5b806399f5634e116101ce57806399f5634e146107835780639aa972a31461078b5780639c9f3dfe1461079e578063a066215c146107b157600080fd5b8063841b24d71461072d5780638c3d73011461075d5780638da5cb5b1461076557600080fd5b80634a1a89a7116102e4578063621dd411116102775780637215541a116102465780637215541a1461066a5780637fcb36531461067d578063831c7ead14610691578063837a4738146106b857600080fd5b8063621dd4111461061c5780636b8616ce1461062f5780636ff512cc1461064f578063715018a61461066257600080fd5b8063542028d5116102b3578063542028d5146105f15780635e9145c9146105f95780635ec919581461060c578063604691691461061457600080fd5b80634a1a89a71461057d5780634a910e6a1461059d5780634e487706146105b05780635392c5e0146105c357600080fd5b8063298789831161035c578063394218e91161032b578063394218e91461050e578063423fa856146105215780634560526714610541578063458c04771461056957600080fd5b806329878983146104a95780632b0006fa146104d55780632c1f816a146104e8578063383b3be8146104fb57600080fd5b80631816b7e5116103985780631816b7e51461042857806319d8ac611461043d578063220d789914610451578063267822471461046457600080fd5b80630a0d9fbe146103bf578063107bf28c146103f657806315064c961461040b575b600080fd5b606f546103d890610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6103fe610acd565b6040516103ed91906152bb565b606f546104189060ff1681565b60405190151581526020016103ed565b61043b6104363660046152d5565b610b5b565b005b6073546103d89067ffffffffffffffff1681565b6103fe61045f366004615311565b610c73565b607b546104849073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103ed565b6074546104849068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61043b6104e3366004615376565b610e4a565b61043b6104f63660046153de565b61101a565b610418610509366004615458565b611228565b61043b61051c366004615458565b61127e565b6073546103d89068010000000000000000900467ffffffffffffffff1681565b6073546103d890700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546103d89067ffffffffffffffff1681565b6079546103d89068010000000000000000900467ffffffffffffffff1681565b61043b6105ab366004615458565b611402565b61043b6105be366004615458565b6114b5565b6105e36105d1366004615458565b60756020526000908152604090205481565b6040519081526020016103ed565b6103fe611639565b61043b6106073660046154e3565b611646565b61043b611e50565b6105e3611f50565b61043b61062a366004615376565b611f66565b6105e361063d366004615458565b60716020526000908152604090205481565b61043b61065d366004615537565b6122ee565b61043b6123c3565b61043b610678366004615458565b6123d7565b6074546103d89067ffffffffffffffff1681565b6103d87f000000000000000000000000000000000000000000000000000000000000000081565b6107016106c6366004615552565b60786020526000908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016103ed565b6079546103d8907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61043b612547565b60335473ffffffffffffffffffffffffffffffffffffffff16610484565b6105e3612613565b61043b6107993660046153de565b61276c565b61043b6107ac366004615458565b61281d565b61043b6107bf366004615458565b612999565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b61043b6107f9366004615537565b612a9f565b6103d87f000000000000000000000000000000000000000000000000000000000000000081565b606f54610840906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103ed565b610894610861366004615458565b6072602052600090815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016103ed565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b6104186108ef366004615552565b612b63565b6103d8612bed565b607b546103d89074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b61043b610936366004615645565b612c42565b606f54610484906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b61043b61099f3660046156bc565b612ccf565b61043b6109b236600461576f565b61321a565b6079546103d890700100000000000000000000000000000000900467ffffffffffffffff1681565b61043b6137bc565b6073546103d8907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b61043b610a4c3660046157b1565b613895565b607b54610418907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b61043b610a8c366004615537565b613c8b565b61043b610a9f366004615537565b613d5d565b607a546104849073ffffffffffffffffffffffffffffffffffffffff1681565b6105e360705481565b60778054610ada906157fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610b06906157fd565b8015610b535780601f10610b2857610100808354040283529160200191610b53565b820191906000526020600020905b815481529060010190602001808311610b3657829003601f168201915b505050505081565b607a5473ffffffffffffffffffffffffffffffffffffffff163314610bac576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff161080610bc557506103ff8161ffff16115b15610bfc576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086166000818152607260205260408082205493881682529020546060929115801590610ca7575081155b15610cde576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610d15576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d1e84612b63565b610d54576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610ea7576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610eb5868686868686613e11565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615610f3057607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015610fb857600080fd5b505af1158015610fcc573d6000803e3d6000fd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611077576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611086878787878787876141d5565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092556000908152607560205260409020839055607954161561110157607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b15801561118957600080fd5b505af115801561119d573d6000803e3d6000fd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281166000908152607860205260408120549092429261126c927001000000000000000000000000000000009092048116911661587f565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146112cf576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611316576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166113855760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611385576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610c68565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146114a957606f5460ff161561146a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61147381611228565b6114a9576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114b28161460f565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611506576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561154d576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166115b857607b5467ffffffffffffffff740100000000000000000000000000000000000000009091048116908216106115b8576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001610c68565b60768054610ada906157fd565b606f5460ff1615611683576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146116e3576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600081900361171f576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561175b576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000082048116600081815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b86811015611bab5760008a8a838181106117c3576117c36158a7565b90506020028101906117d591906158d6565b6117de90615914565b8051805160209091012060608201519192509067ffffffffffffffff1615611956578561180a816159a1565b9650506000818360200151846060015160405160200161186293929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a166000908152607190935291205490915081146118eb576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088166000908152607160205260408082209190915560608501519085015190821691161015611950576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611a93565b602082015115801590611a1d575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af11580156119f7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1b91906159c8565b155b15611a54576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611a93576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080611ac6575042826040015167ffffffffffffffff16115b15611afd576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151975050508080611ba3906159e1565b9150506117a7565b50611bb6868561587f565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115611c1f576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611c2b8285615a19565b611c3f9067ffffffffffffffff1688615a3a565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d861660008181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611d3557607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611d87333083607054611d489190615a4d565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190614822565b611d8f614904565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611df757600080fd5b505af1158015611e0b573d6000803e3d6000fd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611ea1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16611efd576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60006070546064611f619190615a4d565b905090565b606f5460ff1615611fa3576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581166000908152607260205260409020600101544292611ff09278010000000000000000000000000000000000000000000000009091048116911661587f565b67ffffffffffffffff161115612032576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e861203f8686615a19565b67ffffffffffffffff161115612081576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61208f868686868686613e11565b612098846149b5565b607954700100000000000000000000000000000000900467ffffffffffffffff166000036121e057607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092556000908152607560205260409020839055607954161561213b57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b1580156121c357600080fd5b505af11580156121d7573d6000803e3d6000fd5b505050506122b0565b6121e8614904565b6079805467ffffffffffffffff16906000612202836159a1565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487166000908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59669060200161100a565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461233f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c68565b6123cb614b95565b6123d56000614c16565b565b60335473ffffffffffffffffffffffffffffffffffffffff16331461253f576000612400612bed565b90508067ffffffffffffffff168267ffffffffffffffff161161244f576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000090910481169083161180612495575067ffffffffffffffff80831660009081526072602052604090206001015416155b156124cc576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff80831660009081526072602052604090206001015442916124fb9162093a80911661587f565b67ffffffffffffffff16111561253d576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6114b2614c8d565b607b5473ffffffffffffffffffffffffffffffffffffffff163314612598576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156126a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c691906159c8565b905060006126d2612bed565b60735467ffffffffffffffff68010000000000000000820481169161272a9170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416615a19565b612734919061587f565b61273e9190615a19565b67ffffffffffffffff1690508060000361275b5760009250505090565b6127658183615a93565b9250505090565b606f5460ff16156127a9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127b8878787878787876141d5565b67ffffffffffffffff84166000908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1612814614c8d565b50505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461286e576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156128b5576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661291c5760795467ffffffffffffffff70010000000000000000000000000000000090910481169082161061291c576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610c68565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146129ea576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff161115612a31576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001610c68565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612af0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c68565b600067ffffffff0000000167ffffffffffffffff8316108015612b9b575067ffffffff00000001604083901c67ffffffffffffffff16105b8015612bbc575067ffffffff00000001608083901c67ffffffffffffffff16105b8015612bd3575067ffffffff0000000160c083901c105b15612be057506001919050565b506000919050565b919050565b60795460009067ffffffffffffffff1615612c31575060795467ffffffffffffffff9081166000908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612c93576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6076612c9f8282615af5565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c6891906152bb565b600054610100900460ff1615808015612cef5750600054600160ff909116105b80612d095750303b158015612d09575060005460ff166001145b612d9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612df857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b612e056020880188615537565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612e5a6040880160208901615537565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055612ebf6080880160608901615537565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790556000805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076612f4a8682615af5565b506077612f578582615af5565b5062093a80612f6c6060890160408a01615458565b67ffffffffffffffff161115612fae576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fbe6060880160408901615458565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a8061302060a0890160808a01615458565b67ffffffffffffffff161115613062576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61307260a0880160808901615458565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613151614d15565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd660007f000000000000000000000000000000000000000000000000000000000000000085856040516131a79493929190615c58565b60405180910390a1801561281457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613277576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16156132b4576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036132f0576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561332c576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff78010000000000000000000000000000000000000000000000008204811691613377918491700100000000000000000000000000000000900416615c90565b11156133af576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000008204811660008181526072602052604081205491937001000000000000000000000000000000009004909216915b8481101561365957600087878381811061340f5761340f6158a7565b90506020028101906134219190615ca3565b61342a90615cd7565b905083613436816159a1565b825180516020918201208185015160408087015190519499509194506000936134989386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260719093529120549091508114613521576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260716020526040812055613546600189615a3a565b84036135b55742607b60149054906101000a900467ffffffffffffffff168460400151613573919061587f565b67ffffffffffffffff1611156135b5576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080613651906159e1565b9150506133f3565b50613664848461587f565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589166000818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461380d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561387557600080fd5b505af1158015613889573d6000803e3d6000fd5b505050506123d5614db5565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16156138f2576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff161561392f576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613939611f50565b905081811115613975576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113888311156139b1576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6139f373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084614822565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a8491906159c8565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16906018613abe836159a1565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051613af5929190615d53565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1660009081526071909352912055323303613c2557607354604080518381523360208201526060918101829052600091810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613c84565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613c7b9493929190615d63565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613cdc576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610c68565b613d65614b95565b73ffffffffffffffffffffffffffffffffffffffff8116613e08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401612d91565b6114b281614c16565b600080613e1c612bed565b905067ffffffffffffffff881615613eec5760795467ffffffffffffffff9081169089161115613e78576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089166000908152607860205260409020600281015481549094509091898116680100000000000000009092041614613ee6576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50613f8d565b67ffffffffffffffff8716600090815260756020526040902054915081613f3f576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115613f8d576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611613fda576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613fe98888888689610c73565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161401e9190615d99565b602060405180830381855afa15801561403b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061405e91906159c8565b6140689190615dab565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916140ea91899190600401615dbf565b602060405180830381865afa158015614107573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061412b9190615dfa565b614161576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6141c93361416f858b615a19565b67ffffffffffffffff16614181612613565b61418b9190615a4d565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190614e44565b50505050505050505050565b600067ffffffffffffffff8816156142a35760795467ffffffffffffffff9081169089161115614231576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff808816600090815260786020526040902060028101548154909288811668010000000000000000909204161461429d576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061433f565b5067ffffffffffffffff8516600090815260756020526040902054806142f5576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff908116908716111561433f576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff908116908816118061437157508767ffffffffffffffff168767ffffffffffffffff1611155b80614398575060795467ffffffffffffffff68010000000000000000909104811690881611155b156143cf576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff878116600090815260786020526040902054680100000000000000009004811690861614614432576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006144418787878588610c73565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516144769190615d99565b602060405180830381855afa158015614493573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906144b691906159c8565b6144c09190615dab565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161454291889190600401615dbf565b602060405180830381865afa15801561455f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145839190615dfa565b6145b9576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89166000908152607860205260409020600201548590036141c9576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff680100000000000000009091048116908216111580614649575060795467ffffffffffffffff908116908216115b15614680576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff818116600081815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b1580156147b257600080fd5b505af11580156147c6573d6000803e3d6000fd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161481591815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526148fe9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614e9f565b50505050565b60795467ffffffffffffffff6801000000000000000082048116911611156123d55760795460009061494d9068010000000000000000900467ffffffffffffffff16600161587f565b905061495881611228565b156114b25760795460009060029061497b90849067ffffffffffffffff16615a19565b6149859190615e1c565b61498f908361587f565b905061499a81611228565b156149ac576149a88161460f565b5050565b6149a88261460f565b60006149bf612bed565b9050816000806149cf8484615a19565b606f5467ffffffffffffffff91821692506000916149f39161010090041642615a3a565b90505b8467ffffffffffffffff168467ffffffffffffffff1614614a7e5767ffffffffffffffff80851660009081526072602052604090206001810154909116821015614a5c57600181015468010000000000000000900467ffffffffffffffff169450614a78565b614a668686615a19565b67ffffffffffffffff16935050614a7e565b506149f6565b6000614a8a8484615a3a565b905083811015614ae157808403600c8111614aa55780614aa8565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281614ad757614ad7615a64565b0460705550614b51565b838103600c8111614af25780614af5565b600c5b90506000816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a76400000281614b2c57614b2c615a64565b04905080607054670de0b6b3a76400000281614b4a57614b4a615a64565b0460705550505b683635c9adc5dea000006070541115614b7657683635c9adc5dea00000607055612814565b633b9aca00607054101561281457633b9aca0060705550505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146123d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612d91565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b158015614cf557600080fd5b505af1158015614d09573d6000803e3d6000fd5b505050506123d5614fab565b600054610100900460ff16614dac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401612d91565b6123d533614c16565b606f5460ff16614df1576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052614e9a9084907fa9059cbb000000000000000000000000000000000000000000000000000000009060640161487c565b505050565b6000614f01826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661503e9092919063ffffffff16565b805190915015614e9a5780806020019051810190614f1f9190615dfa565b614e9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401612d91565b606f5460ff1615614fe8576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b606061504d8484600085615055565b949350505050565b6060824710156150e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401612d91565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516151109190615d99565b60006040518083038185875af1925050503d806000811461514d576040519150601f19603f3d011682016040523d82523d6000602084013e615152565b606091505b50915091506151638783838761516e565b979650505050505050565b606083156152045782516000036151fd5773ffffffffffffffffffffffffffffffffffffffff85163b6151fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612d91565b508161504d565b61504d83838151156152195781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9191906152bb565b60005b83811015615268578181015183820152602001615250565b50506000910152565b6000815180845261528981602086016020860161524d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006152ce6020830184615271565b9392505050565b6000602082840312156152e757600080fd5b813561ffff811681146152ce57600080fd5b803567ffffffffffffffff81168114612be857600080fd5b600080600080600060a0868803121561532957600080fd5b615332866152f9565b9450615340602087016152f9565b94979496505050506040830135926060810135926080909101359150565b80610300810183101561537057600080fd5b92915050565b6000806000806000806103a0878903121561539057600080fd5b615399876152f9565b95506153a7602088016152f9565b94506153b5604088016152f9565b935060608701359250608087013591506153d28860a0890161535e565b90509295509295509295565b60008060008060008060006103c0888a0312156153fa57600080fd5b615403886152f9565b9650615411602089016152f9565b955061541f604089016152f9565b945061542d606089016152f9565b93506080880135925060a0880135915061544a8960c08a0161535e565b905092959891949750929550565b60006020828403121561546a57600080fd5b6152ce826152f9565b60008083601f84011261548557600080fd5b50813567ffffffffffffffff81111561549d57600080fd5b6020830191508360208260051b85010111156154b857600080fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612be857600080fd5b6000806000604084860312156154f857600080fd5b833567ffffffffffffffff81111561550f57600080fd5b61551b86828701615473565b909450925061552e9050602085016154bf565b90509250925092565b60006020828403121561554957600080fd5b6152ce826154bf565b60006020828403121561556457600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126155ab57600080fd5b813567ffffffffffffffff808211156155c6576155c661556b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561560c5761560c61556b565b8160405283815286602085880101111561562557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561565757600080fd5b813567ffffffffffffffff81111561566e57600080fd5b61504d8482850161559a565b60008083601f84011261568c57600080fd5b50813567ffffffffffffffff8111156156a457600080fd5b6020830191508360208285010111156154b857600080fd5b6000806000806000808688036101208112156156d757600080fd5b60a08112156156e557600080fd5b5086955060a0870135945060c087013567ffffffffffffffff8082111561570b57600080fd5b6157178a838b0161559a565b955060e089013591508082111561572d57600080fd5b6157398a838b0161559a565b945061010089013591508082111561575057600080fd5b5061575d89828a0161567a565b979a9699509497509295939492505050565b6000806020838503121561578257600080fd5b823567ffffffffffffffff81111561579957600080fd5b6157a585828601615473565b90969095509350505050565b6000806000604084860312156157c657600080fd5b833567ffffffffffffffff8111156157dd57600080fd5b6157e98682870161567a565b909790965060209590950135949350505050565b600181811c9082168061581157607f821691505b60208210810361584a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8181168382160190808211156158a0576158a0615850565b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261590a57600080fd5b9190910192915050565b60006080823603121561592657600080fd5b6040516080810167ffffffffffffffff828210818311171561594a5761594a61556b565b81604052843591508082111561595f57600080fd5b5061596c3682860161559a565b82525060208301356020820152615985604084016152f9565b6040820152615996606084016152f9565b606082015292915050565b600067ffffffffffffffff8083168181036159be576159be615850565b6001019392505050565b6000602082840312156159da57600080fd5b5051919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a1257615a12615850565b5060010190565b67ffffffffffffffff8281168282160390808211156158a0576158a0615850565b8181038181111561537057615370615850565b808202811582820484141761537057615370615850565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615aa257615aa2615a64565b500490565b601f821115614e9a57600081815260208120601f850160051c81016020861015615ace5750805b601f850160051c820191505b81811015615aed57828155600101615ada565b505050505050565b815167ffffffffffffffff811115615b0f57615b0f61556b565b615b2381615b1d84546157fd565b84615aa7565b602080601f831160018114615b765760008415615b405750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555615aed565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615bc357888601518255948401946001909101908401615ba4565b5085821015615bff57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600067ffffffffffffffff808716835280861660208401525060606040830152615c86606083018486615c0f565b9695505050505050565b8082018082111561537057615370615850565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261590a57600080fd5b600060608236031215615ce957600080fd5b6040516060810167ffffffffffffffff8282108183111715615d0d57615d0d61556b565b816040528435915080821115615d2257600080fd5b50615d2f3682860161559a565b82525060208301356020820152615d48604084016152f9565b604082015292915050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000615c86606083018486615c0f565b6000825161590a81846020870161524d565b600082615dba57615dba615a64565b500690565b61032081016103008085843782018360005b6001811015615df0578151835260209283019290910190600101615dd1565b5050509392505050565b600060208284031215615e0c57600080fd5b815180151581146152ce57600080fd5b600067ffffffffffffffff80841680615e3757615e37615a64565b9216919091049291505056fea26469706673582212207c65fe318a797352428af5d61503d4af269ad89de3f139b6d4f4cab38b830bc864736f6c63430008140033", + "bytecode": "0x61014060405234801562000011575f80fd5b50604051620047ef380380620047ef8339810160408190526200003491620000a2565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b039182166101005216610120526200012a565b6001600160a01b038116811462000083575f80fd5b50565b80516001600160401b03811681146200009d575f80fd5b919050565b5f805f805f8060c08789031215620000b8575f80fd5b8651620000c5816200006e565b6020880151909650620000d8816200006e565b6040880151909550620000eb816200006e565b6060880151909450620000fe816200006e565b92506200010e6080880162000086565b91506200011e60a0880162000086565b90509295509295509295565b60805160a05160c05160e05161010051610120516145ff620001f05f395f818161055301528181610b18015261239e01525f818161068c0152610aee01525f818161065201528181611591015281816127d001526136ea01525f81816107c301528181610c1501528181610d5d015281816112d0015281816118230152818161291a01526132a101525f818161084c01528181612db801526130f701525f818161073a0152818161155f01528181611bb4015281816128ef0152612e7d01526145ff5ff3fe608060405234801561000f575f80fd5b50600436106102d7575f3560e01c8063841b24d711610181578063841b24d7146105e25780638c3d7301146105fc5780638da5cb5b1461060457806399f5634e1461060c5780639aa972a3146106145780639c9f3dfe14610627578063a066215c1461063a578063a3c573eb1461064d578063ada8f91914610674578063adc879e914610687578063afd23cbe146106ae578063b4d63f58146106d6578063b6b0b09714610735578063ba58ae391461075c578063c0ed84e01461076f578063c754c7ed14610777578063c89e42df14610791578063cfa8ed47146107a4578063d02103ca146107be578063d2e129f9146107e5578063d8d1091b146107f8578063d939b3151461080b578063dbc1697614610825578063e7a7ed021461082d578063e8bf92ed14610847578063eaeb077b1461086e578063ed6b010414610881578063f14916d614610895578063f2fde38b146108a8578063f851a440146108bb578063f8b823e4146108ce575f80fd5b80630a0d9fbe146102db578063107bf28c1461030957806315064c961461031e5780631816b7e51461033b57806319d8ac6114610350578063220d789914610363578063267822471461037657806329878983146103965780632b0006fa146103b05780632c1f816a146103c3578063383b3be8146103d6578063394218e9146103e9578063423fa856146103fc5780634560526714610416578063458c0477146104305780634a1a89a7146104435780634a910e6a1461045d5780634e487706146104705780635392c5e014610483578063542028d5146104b05780635e9145c9146104b85780635ec91958146104cb57806360469169146104d3578063621dd411146104db5780636b8616ce146104ee5780636ff512cc1461050d578063715018a6146105205780637215541a146105285780637fcb36531461053b578063831c7ead1461054e578063837a473814610575575b5f80fd5b606f546102f39061010090046001600160401b031681565b6040516103009190613b20565b60405180910390f35b6103116108d7565b6040516103009190613b81565b606f5461032b9060ff1681565b6040519015158152602001610300565b61034e610349366004613b9a565b610963565b005b6073546102f3906001600160401b031681565b610311610371366004613bd1565b610a1c565b607b54610389906001600160a01b031681565b6040516103009190613c1a565b60745461038990600160401b90046001600160a01b031681565b61034e6103be366004613c45565b610b76565b61034e6103d1366004613ca9565b610cbd565b61032b6103e4366004613d1e565b610e1b565b61034e6103f7366004613d1e565b610e61565b6073546102f390600160401b90046001600160401b031681565b6073546102f390600160801b90046001600160401b031681565b6079546102f3906001600160401b031681565b6079546102f390600160401b90046001600160401b031681565b61034e61046b366004613d1e565b610f49565b61034e61047e366004613d1e565b610fb8565b6104a2610491366004613d1e565b60756020525f908152604090205481565b604051908152602001610300565b6103116110a4565b61034e6104c6366004613d94565b6110b1565b61034e61163c565b6104a26116c8565b61034e6104e9366004613c45565b6116dd565b6104a26104fc366004613d1e565b60716020525f908152604090205481565b61034e61051b366004613de3565b611973565b61034e6119f2565b61034e610536366004613d1e565b611a05565b6074546102f3906001600160401b031681565b6102f37f000000000000000000000000000000000000000000000000000000000000000081565b6105b7610583366004613dfc565b60786020525f90815260409020805460018201546002909201546001600160401b0380831693600160401b90930416919084565b604080516001600160401b039586168152949093166020850152918301526060820152608001610300565b6079546102f390600160c01b90046001600160401b031681565b61034e611b1d565b610389611ba1565b6104a2611bb0565b61034e610622366004613ca9565b611cb7565b61034e610635366004613d1e565b611d4d565b61034e610648366004613d1e565b611e39565b6103897f000000000000000000000000000000000000000000000000000000000000000081565b61034e610682366004613de3565b611ee1565b6102f37f000000000000000000000000000000000000000000000000000000000000000081565b606f546106c390600160481b900461ffff1681565b60405161ffff9091168152602001610300565b6107106106e4366004613d1e565b60726020525f9081526040902080546001909101546001600160401b0380821691600160401b90041683565b604080519384526001600160401b039283166020850152911690820152606001610300565b6103897f000000000000000000000000000000000000000000000000000000000000000081565b61032b61076a366004613dfc565b611f57565b6102f3611fdc565b607b546102f390600160a01b90046001600160401b031681565b61034e61079f366004613eaf565b612027565b606f5461038990600160581b90046001600160a01b031681565b6103897f000000000000000000000000000000000000000000000000000000000000000081565b61034e6107f3366004613f1d565b61208e565b61034e610806366004613fc7565b612424565b6079546102f390600160801b90046001600160401b031681565b61034e6127a3565b6073546102f390600160c01b90046001600160401b031681565b6103897f000000000000000000000000000000000000000000000000000000000000000081565b61034e61087c366004614005565b612844565b607b5461032b90600160e01b900460ff1681565b61034e6108a3366004613de3565b612aea565b61034e6108b6366004613de3565b612b69565b607a54610389906001600160a01b031681565b6104a260705481565b607780546108e49061404c565b80601f01602080910402602001604051908101604052809291908181526020018280546109109061404c565b801561095b5780601f106109325761010080835404028352916020019161095b565b820191905f5260205f20905b81548152906001019060200180831161093e57829003601f168201915b505050505081565b607a546001600160a01b0316331461098e57604051634755657960e01b815260040160405180910390fd5b6103e88161ffff1610806109a757506103ff8161ffff16115b156109c557604051630984a67960e31b815260040160405180910390fd5b606f805461ffff60481b1916600160481b61ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b6001600160401b038086165f818152607260205260408082205493881682529020546060929115801590610a4e575081155b15610a6c5760405163340c614f60e11b815260040160405180910390fd5b80610a8a576040516366385b5160e01b815260040160405180910390fd5b610a9384611f57565b610ab0576040516305dae44f60e21b815260040160405180910390fd5b604080516001600160601b03193360601b166020820152603481019690965260548601929092526001600160c01b031960c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b607454600160401b90046001600160a01b03163314610ba85760405163bbcbbc0560e01b815260040160405180910390fd5b610bb6868686868686612bdf565b607480546001600160401b0319166001600160401b038681169182179092555f9081526075602052604090208390556079541615610bff57607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b158015610c5e575f80fd5b505af1158015610c70573d5f803e3d5ffd5b50506040518481523392506001600160401b03871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b607454600160401b90046001600160a01b03163314610cef5760405163bbcbbc0560e01b815260040160405180910390fd5b610cfe87878787878787612eb0565b607480546001600160401b0319166001600160401b038681169182179092555f9081526075602052604090208390556079541615610d4757607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b158015610da6575f80fd5b505af1158015610db8573d5f803e3d5ffd5b5050607980546001600160c01b031661127560c71b179055505060405182815233906001600160401b038616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b6079546001600160401b038281165f9081526078602052604081205490924292610e5092600160801b90920481169116614098565b6001600160401b0316111592915050565b607a546001600160a01b03163314610e8c57604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610eb957604051631d06e87960e01b815260040160405180910390fd5b606f5460ff16610ef9576079546001600160401b03600160c01b909104811690821610610ef95760405163401636df60e01b815260040160405180910390fd5b607980546001600160c01b0316600160c01b6001600160401b038416021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190610a11908390613b20565b607454600160401b90046001600160a01b03163314610fac57606f5460ff1615610f8657604051630bc011ff60e21b815260040160405180910390fd5b610f8f81610e1b565b610fac57604051630674f25160e11b815260040160405180910390fd5b610fb5816131c4565b50565b607a546001600160a01b03163314610fe357604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b03821611156110105760405163f5e37f2f60e01b815260040160405180910390fd5b606f5460ff1661105057607b546001600160401b03600160a01b9091048116908216106110505760405163f5e37f2f60e01b815260040160405180910390fd5b607b8054600160a01b600160e01b031916600160a01b6001600160401b038416021790556040517fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90610a11908390613b20565b607680546108e49061404c565b606f5460ff16156110d557604051630bc011ff60e21b815260040160405180910390fd5b606f54600160581b90046001600160a01b03163314611107576040516311e7be1560e01b815260040160405180910390fd5b815f8190036111295760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561114c57604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160401b820481165f81815260726020526040812054838516949293600160801b909304909216919082905b8681101561142b575f8a8a8381811061119f5761119f6140bf565b90506020028101906111b191906140d3565b6111ba906140f1565b805180516020909101206060820151919250906001600160401b0316156112a657856111e58161417a565b9650505f8183602001518460600151604051602001611206939291906141a7565b60408051601f1981840301815291815281516020928301206001600160401b038a165f908152607190935291205490915081146112565760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b038088165f9081526071602052604080822091909155606085015190850151908216911610156112a057604051633fbd5c3960e11b815260040160405180910390fd5b50611388565b602082015115801590611344575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303815f875af115801561131e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061134291906141ca565b155b15611362576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c01015611388576040516328a69b1f60e21b815260040160405180910390fd5b876001600160401b031682604001516001600160401b031610806113b857504282604001516001600160401b0316115b156113d6576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518d6040516020016113f79594939291906141e1565b604051602081830303815290604052805190602001209450816040015197505050808061142390614220565b915050611184565b506114368685614098565b6073549094506001600160401b03600160c01b909104811690841611156114705760405163c630a00d60e01b815260040160405180910390fd5b5f61147b8285614238565b61148e906001600160401b031688614258565b60408051606081018252858152426001600160401b03908116602080840191825260738054600160401b9081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585166001600160801b03199384161795851684029590951790945583548c84169116179302929092179055909150828116908516146115425760738054600160801b600160c01b031916600160801b6001600160401b038716021790555b611587333083607054611555919061426b565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613356565b61158f6133c7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156115e7575f80fd5b505af11580156115f9573d5f803e3d5ffd5b50506040516001600160401b03881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a546001600160a01b0316331461166757604051634755657960e01b815260040160405180910390fd5b607b54600160e01b900460ff166116915760405163f6ba91a160e01b815260040160405180910390fd5b607b805460ff60e01b191690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f60705460646116d8919061426b565b905090565b606f5460ff161561170157604051630bc011ff60e21b815260040160405180910390fd5b6079546001600160401b038581165f90815260726020526040902060010154429261173792600160c01b90910481169116614098565b6001600160401b0316111561175f57604051638a0704d360e01b815260040160405180910390fd5b6103e861176c8686614238565b6001600160401b0316111561179457604051635acfba9d60e11b815260040160405180910390fd5b6117a2868686868686612bdf565b6117ab84613469565b607954600160801b90046001600160401b03165f0361188757607480546001600160401b0319166001600160401b038681169182179092555f908152607560205260409020839055607954161561180d57607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b15801561186c575f80fd5b505af115801561187e573d5f803e3d5ffd5b50505050611936565b61188f6133c7565b607980546001600160401b0316905f6118a78361417a565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f9081526078909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b60405182815233906001600160401b038616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001610cad565b607a546001600160a01b0316331461199e57604051634755657960e01b815260040160405180910390fd5b606f8054600160581b600160f81b031916600160581b6001600160a01b038416021790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610a11908390613c1a565b6119fa613638565b611a035f613697565b565b611a0d611ba1565b6001600160a01b0316336001600160a01b031614611b15575f611a2e611fdc565b9050806001600160401b0316826001600160401b031611611a625760405163812a372d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b90910481169083161180611aa057506001600160401b038083165f9081526072602052604090206001015416155b15611abe57604051632631700560e21b815260040160405180910390fd5b6001600160401b038083165f908152607260205260409020600101544291611aeb9162093a809116614098565b6001600160401b03161115611b135760405163692baaad60e11b815260040160405180910390fd5b505b610fb56136e8565b607b546001600160a01b03163314611b485760405163d1ec4b2360e01b815260040160405180910390fd5b607b54607a80546001600160a01b0319166001600160a01b0390921691821790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e91611b9791613c1a565b60405180910390a1565b6033546001600160a01b031690565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401611bfe9190613c1a565b602060405180830381865afa158015611c19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c3d91906141ca565b90505f611c48611fdc565b6073546001600160401b03600160401b8204811691611c7891600160801b8204811691600160c01b900416614238565b611c829190614098565b611c8c9190614238565b6001600160401b03169050805f03611ca6575f9250505090565b611cb08183614296565b9250505090565b606f5460ff1615611cdb57604051630bc011ff60e21b815260040160405180910390fd5b611cea87878787878787612eb0565b6001600160401b0384165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1611d446136e8565b50505050505050565b607a546001600160a01b03163314611d7857604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115611da557604051630cc9650760e41b815260040160405180910390fd5b606f5460ff16611de5576079546001600160401b03600160801b909104811690821610611de55760405163048a05a960e41b815260040160405180910390fd5b60798054600160801b600160c01b031916600160801b6001600160401b038416021790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590610a11908390613b20565b607a546001600160a01b03163314611e6457604051634755657960e01b815260040160405180910390fd5b62015180816001600160401b03161115611e9157604051631c0cfbfd60e31b815260040160405180910390fd5b606f8054610100600160481b0319166101006001600160401b038416021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890610a11908390613b20565b607a546001600160a01b03163314611f0c57604051634755657960e01b815260040160405180910390fd5b607b80546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610a11908390613c1a565b5f67ffffffff000000016001600160401b038316108015611f8c575067ffffffff00000001604083901c6001600160401b0316105b8015611fac575067ffffffff00000001608083901c6001600160401b0316105b8015611fc3575067ffffffff0000000160c083901c105b15611fd057506001919050565b505f919050565b919050565b6079545f906001600160401b03161561201757506079546001600160401b039081165f90815260786020526040902054600160401b90041690565b506074546001600160401b031690565b607a546001600160a01b0316331461205257604051634755657960e01b815260040160405180910390fd5b607661205e82826142f6565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610a119190613b81565b5f54610100900460ff16158080156120ac57505f54600160ff909116105b806120cc57506120bb3061375e565b1580156120cc57505f5460ff166001145b6121345760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015612155575f805461ff0019166101001790555b6121626020880188613de3565b607a80546001600160a01b0319166001600160a01b03929092169190911790556121926040880160208901613de3565b606f80546001600160a01b0392909216600160581b02600160581b600160f81b03199092169190911790556121cd6080880160608901613de3565b607480546001600160a01b0392909216600160401b02600160401b600160e01b03199092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad869055607661223086826142f6565b50607761223d85826142f6565b5062093a806122526060890160408a01613d1e565b6001600160401b0316111561227a57604051630cc9650760e41b815260040160405180910390fd5b61228a6060880160408901613d1e565b607980546001600160401b0392909216600160801b02600160801b600160c01b031990921691909117905562093a806122c960a0890160808a01613d1e565b6001600160401b031611156122f157604051631d06e87960e01b815260040160405180910390fd5b61230160a0880160808901613d1e565b607980546001600160c01b0316600160c01b6001600160401b03939093169290920291909117905567016345785d8a0000607055606f8054610100600160581b031916620708006101f560491b01179055607b8054600160a01b600160e81b031916670200000000000d2f60a71b17905561237a61376d565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f000000000000000000000000000000000000000000000000000000000000000085856040516123cf94939291906143d9565b60405180910390a18015611d44575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b54600160e01b900460ff161561244f576040516324eff8c360e01b815260040160405180910390fd5b606f5460ff161561247357604051630bc011ff60e21b815260040160405180910390fd5b805f8190036124955760405163cb591a5f60e01b815260040160405180910390fd5b6103e88111156124b857604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160c01b82048116916124e0918491600160801b90041661440f565b11156124ff5760405163c630a00d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b820481165f818152607260205260408120549193600160801b9004909216915b848110156126ae575f87878381811061254a5761254a6140bf565b905060200281019061255c9190614422565b61256590614436565b9050836125718161417a565b825180516020918201208185015160408087015190519499509194505f9361259c93869391016141a7565b60408051601f1981840301815291815281516020928301206001600160401b0389165f908152607190935291205490915081146125ec5760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b0386165f9081526071602052604081205561260f600189614258565b84036126635742607b60149054906101000a90046001600160401b0316846040015161263b9190614098565b6001600160401b031611156126635760405163c44a082160e01b815260040160405180910390fd5b8482846020015142336040516020016126809594939291906141e1565b60405160208183030381529060405280519060200120945050505080806126a690614220565b91505061252f565b506126b98484614098565b607380546001600160401b034281166001600160401b03199092168217808455604080516060810182528781526020808201958652600160401b9384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686026001600160801b031990921693871693909317179091558554938916600160801b02600160801b600160c01b031993860293909316600160401b600160c01b031990941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a546001600160a01b031633146127ce57604051634755657960e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612826575f80fd5b505af1158015612838573d5f803e3d5ffd5b50505050611a036137e0565b607b54600160e01b900460ff161561286f576040516324eff8c360e01b815260040160405180910390fd5b606f5460ff161561289357604051630bc011ff60e21b815260040160405180910390fd5b5f61289c6116c8565b9050818111156128bf57604051634732fdb560e01b815260040160405180910390fd5b6113888311156128e2576040516328a69b1f60e21b815260040160405180910390fd5b6129176001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084613356565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612974573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061299891906141ca565b60738054919250600160c01b9091046001600160401b03169060186129bc8361417a565b91906101000a8154816001600160401b0302191690836001600160401b031602179055505084846040516129f19291906144ae565b604051908190038120612a0a91839042906020016141a7565b60408051808303601f190181529181528151602092830120607354600160c01b90046001600160401b03165f9081526071909352912055323303612a99576073546040805183815233602082015260609181018290525f91810191909152600160c01b9091046001600160401b0316905f805160206145aa8339815191529060800160405180910390a2612ae3565b607360189054906101000a90046001600160401b03166001600160401b03165f805160206145aa83398151915282338888604051612ada94939291906144bd565b60405180910390a25b5050505050565b607a546001600160a01b03163314612b1557604051634755657960e01b815260040160405180910390fd5b60748054600160401b600160e01b031916600160401b6001600160a01b038416021790556040517f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90610a11908390613c1a565b612b71613638565b6001600160a01b038116612bd65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161212b565b610fb581613697565b5f80612be9611fdc565b90506001600160401b03881615612c7e576079546001600160401b039081169089161115612c2a5760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b038089165f908152607860205260409020600281015481549094509091898116600160401b9092041614612c7857604051632bd2e3e760e01b815260040160405180910390fd5b50612ce9565b6001600160401b0387165f90815260756020526040902054915081612cb6576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316876001600160401b03161115612ce957604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316866001600160401b031611612d1b5760405163b9b18f5760e01b815260040160405180910390fd5b5f612d298888888689610a1c565b90505f5f8051602061458a833981519152600283604051612d4a91906144e7565b602060405180830381855afa158015612d65573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612d8891906141ca565b612d9291906144f8565b604080516020810182528281529051634890ed4560e11b81529192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91612dee9189919060040161450b565b602060405180830381865afa158015612e09573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e2d9190614545565b612e4a576040516309bde33960e01b815260040160405180910390fd5b612ea433612e58858b614238565b6001600160401b0316612e69611bb0565b612e73919061426b565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190613837565b50505050505050505050565b5f6001600160401b03881615612f42576079546001600160401b039081169089161115612ef05760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f908152607860205260409020600281015481549092888116600160401b9092041614612f3c57604051632bd2e3e760e01b815260040160405180910390fd5b50612fa9565b506001600160401b0385165f9081526075602052604090205480612f79576040516324cbdcc360e11b815260040160405180910390fd5b6074546001600160401b039081169087161115612fa957604051630f2b74f160e11b815260040160405180910390fd5b6079546001600160401b039081169088161180612fd85750876001600160401b0316876001600160401b031611155b80612ff957506079546001600160401b03600160401b909104811690881611155b156130175760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260786020526040902054600160401b900481169086161461305a576040516332a2a77f60e01b815260040160405180910390fd5b5f6130688787878588610a1c565b90505f5f8051602061458a83398151915260028360405161308991906144e7565b602060405180830381855afa1580156130a4573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906130c791906141ca565b6130d191906144f8565b604080516020810182528281529051634890ed4560e11b81529192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161312d9188919060040161450b565b602060405180830381865afa158015613148573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061316c9190614545565b613189576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260786020526040902060020154859003612ea45760405163a47276bd60e01b815260040160405180910390fd5b6079546001600160401b03600160401b90910481169082161115806131f757506079546001600160401b03908116908216115b156132155760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f818152607860209081526040808320805460748054600160401b928390049098166001600160401b03199098168817905560028201548786526075909452938290209290925560798054600160401b600160801b0319169390940292909217909255600182015490516333d6247d60e01b815260048101919091529091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b1580156132ea575f80fd5b505af11580156132fc573d5f803e3d5ffd5b50505050826001600160401b0316816001600160401b03167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161334991815260200190565b60405180910390a3505050565b6040516001600160a01b03808516602483015283166044820152606481018290526133c19085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261386c565b50505050565b6079546001600160401b03600160401b8204811691161115611a03576079545f9061340390600160401b90046001600160401b03166001614098565b905061340e81610e1b565b15610fb5576079545f9060029061342f9084906001600160401b0316614238565b6134399190614564565b6134439083614098565b905061344e81610e1b565b156134605761345c816131c4565b5050565b61345c826131c4565b5f613472611fdc565b9050815f806134818484614238565b606f546001600160401b0391821692505f916134a39161010090041642614258565b90505b846001600160401b0316846001600160401b031614613523576001600160401b038085165f9081526072602052604090206001810154909116821015613502576001810154600160401b90046001600160401b0316945061351d565b61350c8686614238565b6001600160401b0316935050613523565b506134a6565b5f61352e8484614258565b90508381101561358557808403600c8111613549578061354c565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a607054028161357b5761357b614282565b04607055506135f4565b838103600c81116135965780613599565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a764000002816135cf576135cf614282565b04905080607054670de0b6b3a764000002816135ed576135ed614282565b0460705550505b683635c9adc5dea00000607054111561361957683635c9adc5dea00000607055611d44565b633b9aca006070541015611d4457633b9aca0060705550505050505050565b33613641611ba1565b6001600160a01b031614611a035760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161212b565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613740575f80fd5b505af1158015613752573d5f803e3d5ffd5b50505050611a0361393d565b6001600160a01b03163b151590565b5f54610100900460ff166137d75760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161212b565b611a0333613697565b606f5460ff1661380357604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b6040516001600160a01b03831660248201526044810182905261386790849063a9059cbb60e01b9060640161338a565b505050565b5f6138c0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166139989092919063ffffffff16565b80519091501561386757808060200190518101906138de9190614545565b6138675760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161212b565b606f5460ff161561396157604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60606139a684845f856139ae565b949350505050565b606082471015613a0f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161212b565b5f80866001600160a01b03168587604051613a2a91906144e7565b5f6040518083038185875af1925050503d805f8114613a64576040519150601f19603f3d011682016040523d82523d5f602084013e613a69565b606091505b5091509150613a7a87838387613a85565b979650505050505050565b60608315613af15782515f03613aea57613a9e8561375e565b613aea5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161212b565b50816139a6565b6139a68383815115613b065781518083602001fd5b8060405162461bcd60e51b815260040161212b9190613b81565b6001600160401b0391909116815260200190565b5f5b83811015613b4e578181015183820152602001613b36565b50505f910152565b5f8151808452613b6d816020860160208601613b34565b601f01601f19169290920160200192915050565b602081525f613b936020830184613b56565b9392505050565b5f60208284031215613baa575f80fd5b813561ffff81168114613b93575f80fd5b80356001600160401b0381168114611fd7575f80fd5b5f805f805f60a08688031215613be5575f80fd5b613bee86613bbb565b9450613bfc60208701613bbb565b94979496505050506040830135926060810135926080909101359150565b6001600160a01b0391909116815260200190565b806103008101831015613c3f575f80fd5b92915050565b5f805f805f806103a08789031215613c5b575f80fd5b613c6487613bbb565b9550613c7260208801613bbb565b9450613c8060408801613bbb565b93506060870135925060808701359150613c9d8860a08901613c2e565b90509295509295509295565b5f805f805f805f6103c0888a031215613cc0575f80fd5b613cc988613bbb565b9650613cd760208901613bbb565b9550613ce560408901613bbb565b9450613cf360608901613bbb565b93506080880135925060a08801359150613d108960c08a01613c2e565b905092959891949750929550565b5f60208284031215613d2e575f80fd5b613b9382613bbb565b5f8083601f840112613d47575f80fd5b5081356001600160401b03811115613d5d575f80fd5b6020830191508360208260051b8501011115613d77575f80fd5b9250929050565b80356001600160a01b0381168114611fd7575f80fd5b5f805f60408486031215613da6575f80fd5b83356001600160401b03811115613dbb575f80fd5b613dc786828701613d37565b9094509250613dda905060208501613d7e565b90509250925092565b5f60208284031215613df3575f80fd5b613b9382613d7e565b5f60208284031215613e0c575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112613e36575f80fd5b81356001600160401b0380821115613e5057613e50613e13565b604051601f8301601f19908116603f01168101908282118183101715613e7857613e78613e13565b81604052838152866020858801011115613e90575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f60208284031215613ebf575f80fd5b81356001600160401b03811115613ed4575f80fd5b6139a684828501613e27565b5f8083601f840112613ef0575f80fd5b5081356001600160401b03811115613f06575f80fd5b602083019150836020828501011115613d77575f80fd5b5f805f805f80868803610120811215613f34575f80fd5b60a0811215613f41575f80fd5b5086955060a0860135945060c08601356001600160401b0380821115613f65575f80fd5b613f718a838b01613e27565b955060e0890135915080821115613f86575f80fd5b613f928a838b01613e27565b9450610100890135915080821115613fa8575f80fd5b50613fb589828a01613ee0565b979a9699509497509295939492505050565b5f8060208385031215613fd8575f80fd5b82356001600160401b03811115613fed575f80fd5b613ff985828601613d37565b90969095509350505050565b5f805f60408486031215614017575f80fd5b83356001600160401b0381111561402c575f80fd5b61403886828701613ee0565b909790965060209590950135949350505050565b600181811c9082168061406057607f821691505b60208210810361407e57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038181168382160190808211156140b8576140b8614084565b5092915050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e198336030181126140e7575f80fd5b9190910192915050565b5f60808236031215614101575f80fd5b604051608081016001600160401b03808211838310171561412457614124613e13565b816040528435915080821115614138575f80fd5b5061414536828601613e27565b8252506020830135602082015261415e60408401613bbb565b604082015261416f60608401613bbb565b606082015292915050565b5f6001600160401b038281166002600160401b0319810161419d5761419d614084565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b5f602082840312156141da575f80fd5b5051919050565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b5f6001820161423157614231614084565b5060010190565b6001600160401b038281168282160390808211156140b8576140b8614084565b81810381811115613c3f57613c3f614084565b8082028115828204841417613c3f57613c3f614084565b634e487b7160e01b5f52601260045260245ffd5b5f826142a4576142a4614282565b500490565b601f821115613867575f81815260208120601f850160051c810160208610156142cf5750805b601f850160051c820191505b818110156142ee578281556001016142db565b505050505050565b81516001600160401b0381111561430f5761430f613e13565b6143238161431d845461404c565b846142a9565b602080601f831160018114614356575f841561433f5750858301515b5f19600386901b1c1916600185901b1785556142ee565b5f85815260208120601f198616915b8281101561438457888601518255948401946001909101908401614365565b50858210156143a157878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160401b038581168252841660208201526060604082018190525f9061440590830184866143b1565b9695505050505050565b80820180821115613c3f57613c3f614084565b5f8235605e198336030181126140e7575f80fd5b5f60608236031215614446575f80fd5b604051606081016001600160401b03808211838310171561446957614469613e13565b81604052843591508082111561447d575f80fd5b5061448a36828601613e27565b825250602083013560208201526144a360408401613bbb565b604082015292915050565b818382375f9101908152919050565b8481526001600160a01b03841660208201526060604082018190525f9061440590830184866143b1565b5f82516140e7818460208701613b34565b5f8261450657614506614282565b500690565b6103208101610300808584378201835f5b600181101561453b57815183526020928301929091019060010161451c565b5050509392505050565b5f60208284031215614555575f80fd5b81518015158114613b93575f80fd5b5f6001600160401b038381168061457d5761457d614282565b9216919091049291505056fe30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001f94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931a2646970667358221220820f6390588faddb24f9b7ce2d20dfe664629e0fe77ff4263ebff40b7cb9125564736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106102d7575f3560e01c8063841b24d711610181578063841b24d7146105e25780638c3d7301146105fc5780638da5cb5b1461060457806399f5634e1461060c5780639aa972a3146106145780639c9f3dfe14610627578063a066215c1461063a578063a3c573eb1461064d578063ada8f91914610674578063adc879e914610687578063afd23cbe146106ae578063b4d63f58146106d6578063b6b0b09714610735578063ba58ae391461075c578063c0ed84e01461076f578063c754c7ed14610777578063c89e42df14610791578063cfa8ed47146107a4578063d02103ca146107be578063d2e129f9146107e5578063d8d1091b146107f8578063d939b3151461080b578063dbc1697614610825578063e7a7ed021461082d578063e8bf92ed14610847578063eaeb077b1461086e578063ed6b010414610881578063f14916d614610895578063f2fde38b146108a8578063f851a440146108bb578063f8b823e4146108ce575f80fd5b80630a0d9fbe146102db578063107bf28c1461030957806315064c961461031e5780631816b7e51461033b57806319d8ac6114610350578063220d789914610363578063267822471461037657806329878983146103965780632b0006fa146103b05780632c1f816a146103c3578063383b3be8146103d6578063394218e9146103e9578063423fa856146103fc5780634560526714610416578063458c0477146104305780634a1a89a7146104435780634a910e6a1461045d5780634e487706146104705780635392c5e014610483578063542028d5146104b05780635e9145c9146104b85780635ec91958146104cb57806360469169146104d3578063621dd411146104db5780636b8616ce146104ee5780636ff512cc1461050d578063715018a6146105205780637215541a146105285780637fcb36531461053b578063831c7ead1461054e578063837a473814610575575b5f80fd5b606f546102f39061010090046001600160401b031681565b6040516103009190613b20565b60405180910390f35b6103116108d7565b6040516103009190613b81565b606f5461032b9060ff1681565b6040519015158152602001610300565b61034e610349366004613b9a565b610963565b005b6073546102f3906001600160401b031681565b610311610371366004613bd1565b610a1c565b607b54610389906001600160a01b031681565b6040516103009190613c1a565b60745461038990600160401b90046001600160a01b031681565b61034e6103be366004613c45565b610b76565b61034e6103d1366004613ca9565b610cbd565b61032b6103e4366004613d1e565b610e1b565b61034e6103f7366004613d1e565b610e61565b6073546102f390600160401b90046001600160401b031681565b6073546102f390600160801b90046001600160401b031681565b6079546102f3906001600160401b031681565b6079546102f390600160401b90046001600160401b031681565b61034e61046b366004613d1e565b610f49565b61034e61047e366004613d1e565b610fb8565b6104a2610491366004613d1e565b60756020525f908152604090205481565b604051908152602001610300565b6103116110a4565b61034e6104c6366004613d94565b6110b1565b61034e61163c565b6104a26116c8565b61034e6104e9366004613c45565b6116dd565b6104a26104fc366004613d1e565b60716020525f908152604090205481565b61034e61051b366004613de3565b611973565b61034e6119f2565b61034e610536366004613d1e565b611a05565b6074546102f3906001600160401b031681565b6102f37f000000000000000000000000000000000000000000000000000000000000000081565b6105b7610583366004613dfc565b60786020525f90815260409020805460018201546002909201546001600160401b0380831693600160401b90930416919084565b604080516001600160401b039586168152949093166020850152918301526060820152608001610300565b6079546102f390600160c01b90046001600160401b031681565b61034e611b1d565b610389611ba1565b6104a2611bb0565b61034e610622366004613ca9565b611cb7565b61034e610635366004613d1e565b611d4d565b61034e610648366004613d1e565b611e39565b6103897f000000000000000000000000000000000000000000000000000000000000000081565b61034e610682366004613de3565b611ee1565b6102f37f000000000000000000000000000000000000000000000000000000000000000081565b606f546106c390600160481b900461ffff1681565b60405161ffff9091168152602001610300565b6107106106e4366004613d1e565b60726020525f9081526040902080546001909101546001600160401b0380821691600160401b90041683565b604080519384526001600160401b039283166020850152911690820152606001610300565b6103897f000000000000000000000000000000000000000000000000000000000000000081565b61032b61076a366004613dfc565b611f57565b6102f3611fdc565b607b546102f390600160a01b90046001600160401b031681565b61034e61079f366004613eaf565b612027565b606f5461038990600160581b90046001600160a01b031681565b6103897f000000000000000000000000000000000000000000000000000000000000000081565b61034e6107f3366004613f1d565b61208e565b61034e610806366004613fc7565b612424565b6079546102f390600160801b90046001600160401b031681565b61034e6127a3565b6073546102f390600160c01b90046001600160401b031681565b6103897f000000000000000000000000000000000000000000000000000000000000000081565b61034e61087c366004614005565b612844565b607b5461032b90600160e01b900460ff1681565b61034e6108a3366004613de3565b612aea565b61034e6108b6366004613de3565b612b69565b607a54610389906001600160a01b031681565b6104a260705481565b607780546108e49061404c565b80601f01602080910402602001604051908101604052809291908181526020018280546109109061404c565b801561095b5780601f106109325761010080835404028352916020019161095b565b820191905f5260205f20905b81548152906001019060200180831161093e57829003601f168201915b505050505081565b607a546001600160a01b0316331461098e57604051634755657960e01b815260040160405180910390fd5b6103e88161ffff1610806109a757506103ff8161ffff16115b156109c557604051630984a67960e31b815260040160405180910390fd5b606f805461ffff60481b1916600160481b61ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b6001600160401b038086165f818152607260205260408082205493881682529020546060929115801590610a4e575081155b15610a6c5760405163340c614f60e11b815260040160405180910390fd5b80610a8a576040516366385b5160e01b815260040160405180910390fd5b610a9384611f57565b610ab0576040516305dae44f60e21b815260040160405180910390fd5b604080516001600160601b03193360601b166020820152603481019690965260548601929092526001600160c01b031960c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b607454600160401b90046001600160a01b03163314610ba85760405163bbcbbc0560e01b815260040160405180910390fd5b610bb6868686868686612bdf565b607480546001600160401b0319166001600160401b038681169182179092555f9081526075602052604090208390556079541615610bff57607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b158015610c5e575f80fd5b505af1158015610c70573d5f803e3d5ffd5b50506040518481523392506001600160401b03871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b607454600160401b90046001600160a01b03163314610cef5760405163bbcbbc0560e01b815260040160405180910390fd5b610cfe87878787878787612eb0565b607480546001600160401b0319166001600160401b038681169182179092555f9081526075602052604090208390556079541615610d4757607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b158015610da6575f80fd5b505af1158015610db8573d5f803e3d5ffd5b5050607980546001600160c01b031661127560c71b179055505060405182815233906001600160401b038616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b6079546001600160401b038281165f9081526078602052604081205490924292610e5092600160801b90920481169116614098565b6001600160401b0316111592915050565b607a546001600160a01b03163314610e8c57604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610eb957604051631d06e87960e01b815260040160405180910390fd5b606f5460ff16610ef9576079546001600160401b03600160c01b909104811690821610610ef95760405163401636df60e01b815260040160405180910390fd5b607980546001600160c01b0316600160c01b6001600160401b038416021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190610a11908390613b20565b607454600160401b90046001600160a01b03163314610fac57606f5460ff1615610f8657604051630bc011ff60e21b815260040160405180910390fd5b610f8f81610e1b565b610fac57604051630674f25160e11b815260040160405180910390fd5b610fb5816131c4565b50565b607a546001600160a01b03163314610fe357604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b03821611156110105760405163f5e37f2f60e01b815260040160405180910390fd5b606f5460ff1661105057607b546001600160401b03600160a01b9091048116908216106110505760405163f5e37f2f60e01b815260040160405180910390fd5b607b8054600160a01b600160e01b031916600160a01b6001600160401b038416021790556040517fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90610a11908390613b20565b607680546108e49061404c565b606f5460ff16156110d557604051630bc011ff60e21b815260040160405180910390fd5b606f54600160581b90046001600160a01b03163314611107576040516311e7be1560e01b815260040160405180910390fd5b815f8190036111295760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561114c57604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160401b820481165f81815260726020526040812054838516949293600160801b909304909216919082905b8681101561142b575f8a8a8381811061119f5761119f6140bf565b90506020028101906111b191906140d3565b6111ba906140f1565b805180516020909101206060820151919250906001600160401b0316156112a657856111e58161417a565b9650505f8183602001518460600151604051602001611206939291906141a7565b60408051601f1981840301815291815281516020928301206001600160401b038a165f908152607190935291205490915081146112565760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b038088165f9081526071602052604080822091909155606085015190850151908216911610156112a057604051633fbd5c3960e11b815260040160405180910390fd5b50611388565b602082015115801590611344575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303815f875af115801561131e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061134291906141ca565b155b15611362576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c01015611388576040516328a69b1f60e21b815260040160405180910390fd5b876001600160401b031682604001516001600160401b031610806113b857504282604001516001600160401b0316115b156113d6576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518d6040516020016113f79594939291906141e1565b604051602081830303815290604052805190602001209450816040015197505050808061142390614220565b915050611184565b506114368685614098565b6073549094506001600160401b03600160c01b909104811690841611156114705760405163c630a00d60e01b815260040160405180910390fd5b5f61147b8285614238565b61148e906001600160401b031688614258565b60408051606081018252858152426001600160401b03908116602080840191825260738054600160401b9081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585166001600160801b03199384161795851684029590951790945583548c84169116179302929092179055909150828116908516146115425760738054600160801b600160c01b031916600160801b6001600160401b038716021790555b611587333083607054611555919061426b565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613356565b61158f6133c7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156115e7575f80fd5b505af11580156115f9573d5f803e3d5ffd5b50506040516001600160401b03881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a546001600160a01b0316331461166757604051634755657960e01b815260040160405180910390fd5b607b54600160e01b900460ff166116915760405163f6ba91a160e01b815260040160405180910390fd5b607b805460ff60e01b191690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f60705460646116d8919061426b565b905090565b606f5460ff161561170157604051630bc011ff60e21b815260040160405180910390fd5b6079546001600160401b038581165f90815260726020526040902060010154429261173792600160c01b90910481169116614098565b6001600160401b0316111561175f57604051638a0704d360e01b815260040160405180910390fd5b6103e861176c8686614238565b6001600160401b0316111561179457604051635acfba9d60e11b815260040160405180910390fd5b6117a2868686868686612bdf565b6117ab84613469565b607954600160801b90046001600160401b03165f0361188757607480546001600160401b0319166001600160401b038681169182179092555f908152607560205260409020839055607954161561180d57607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b15801561186c575f80fd5b505af115801561187e573d5f803e3d5ffd5b50505050611936565b61188f6133c7565b607980546001600160401b0316905f6118a78361417a565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f9081526078909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b60405182815233906001600160401b038616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001610cad565b607a546001600160a01b0316331461199e57604051634755657960e01b815260040160405180910390fd5b606f8054600160581b600160f81b031916600160581b6001600160a01b038416021790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610a11908390613c1a565b6119fa613638565b611a035f613697565b565b611a0d611ba1565b6001600160a01b0316336001600160a01b031614611b15575f611a2e611fdc565b9050806001600160401b0316826001600160401b031611611a625760405163812a372d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b90910481169083161180611aa057506001600160401b038083165f9081526072602052604090206001015416155b15611abe57604051632631700560e21b815260040160405180910390fd5b6001600160401b038083165f908152607260205260409020600101544291611aeb9162093a809116614098565b6001600160401b03161115611b135760405163692baaad60e11b815260040160405180910390fd5b505b610fb56136e8565b607b546001600160a01b03163314611b485760405163d1ec4b2360e01b815260040160405180910390fd5b607b54607a80546001600160a01b0319166001600160a01b0390921691821790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e91611b9791613c1a565b60405180910390a1565b6033546001600160a01b031690565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401611bfe9190613c1a565b602060405180830381865afa158015611c19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c3d91906141ca565b90505f611c48611fdc565b6073546001600160401b03600160401b8204811691611c7891600160801b8204811691600160c01b900416614238565b611c829190614098565b611c8c9190614238565b6001600160401b03169050805f03611ca6575f9250505090565b611cb08183614296565b9250505090565b606f5460ff1615611cdb57604051630bc011ff60e21b815260040160405180910390fd5b611cea87878787878787612eb0565b6001600160401b0384165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1611d446136e8565b50505050505050565b607a546001600160a01b03163314611d7857604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115611da557604051630cc9650760e41b815260040160405180910390fd5b606f5460ff16611de5576079546001600160401b03600160801b909104811690821610611de55760405163048a05a960e41b815260040160405180910390fd5b60798054600160801b600160c01b031916600160801b6001600160401b038416021790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590610a11908390613b20565b607a546001600160a01b03163314611e6457604051634755657960e01b815260040160405180910390fd5b62015180816001600160401b03161115611e9157604051631c0cfbfd60e31b815260040160405180910390fd5b606f8054610100600160481b0319166101006001600160401b038416021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890610a11908390613b20565b607a546001600160a01b03163314611f0c57604051634755657960e01b815260040160405180910390fd5b607b80546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610a11908390613c1a565b5f67ffffffff000000016001600160401b038316108015611f8c575067ffffffff00000001604083901c6001600160401b0316105b8015611fac575067ffffffff00000001608083901c6001600160401b0316105b8015611fc3575067ffffffff0000000160c083901c105b15611fd057506001919050565b505f919050565b919050565b6079545f906001600160401b03161561201757506079546001600160401b039081165f90815260786020526040902054600160401b90041690565b506074546001600160401b031690565b607a546001600160a01b0316331461205257604051634755657960e01b815260040160405180910390fd5b607661205e82826142f6565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610a119190613b81565b5f54610100900460ff16158080156120ac57505f54600160ff909116105b806120cc57506120bb3061375e565b1580156120cc57505f5460ff166001145b6121345760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015612155575f805461ff0019166101001790555b6121626020880188613de3565b607a80546001600160a01b0319166001600160a01b03929092169190911790556121926040880160208901613de3565b606f80546001600160a01b0392909216600160581b02600160581b600160f81b03199092169190911790556121cd6080880160608901613de3565b607480546001600160a01b0392909216600160401b02600160401b600160e01b03199092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad869055607661223086826142f6565b50607761223d85826142f6565b5062093a806122526060890160408a01613d1e565b6001600160401b0316111561227a57604051630cc9650760e41b815260040160405180910390fd5b61228a6060880160408901613d1e565b607980546001600160401b0392909216600160801b02600160801b600160c01b031990921691909117905562093a806122c960a0890160808a01613d1e565b6001600160401b031611156122f157604051631d06e87960e01b815260040160405180910390fd5b61230160a0880160808901613d1e565b607980546001600160c01b0316600160c01b6001600160401b03939093169290920291909117905567016345785d8a0000607055606f8054610100600160581b031916620708006101f560491b01179055607b8054600160a01b600160e81b031916670200000000000d2f60a71b17905561237a61376d565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f000000000000000000000000000000000000000000000000000000000000000085856040516123cf94939291906143d9565b60405180910390a18015611d44575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b54600160e01b900460ff161561244f576040516324eff8c360e01b815260040160405180910390fd5b606f5460ff161561247357604051630bc011ff60e21b815260040160405180910390fd5b805f8190036124955760405163cb591a5f60e01b815260040160405180910390fd5b6103e88111156124b857604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160c01b82048116916124e0918491600160801b90041661440f565b11156124ff5760405163c630a00d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b820481165f818152607260205260408120549193600160801b9004909216915b848110156126ae575f87878381811061254a5761254a6140bf565b905060200281019061255c9190614422565b61256590614436565b9050836125718161417a565b825180516020918201208185015160408087015190519499509194505f9361259c93869391016141a7565b60408051601f1981840301815291815281516020928301206001600160401b0389165f908152607190935291205490915081146125ec5760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b0386165f9081526071602052604081205561260f600189614258565b84036126635742607b60149054906101000a90046001600160401b0316846040015161263b9190614098565b6001600160401b031611156126635760405163c44a082160e01b815260040160405180910390fd5b8482846020015142336040516020016126809594939291906141e1565b60405160208183030381529060405280519060200120945050505080806126a690614220565b91505061252f565b506126b98484614098565b607380546001600160401b034281166001600160401b03199092168217808455604080516060810182528781526020808201958652600160401b9384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686026001600160801b031990921693871693909317179091558554938916600160801b02600160801b600160c01b031993860293909316600160401b600160c01b031990941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a546001600160a01b031633146127ce57604051634755657960e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612826575f80fd5b505af1158015612838573d5f803e3d5ffd5b50505050611a036137e0565b607b54600160e01b900460ff161561286f576040516324eff8c360e01b815260040160405180910390fd5b606f5460ff161561289357604051630bc011ff60e21b815260040160405180910390fd5b5f61289c6116c8565b9050818111156128bf57604051634732fdb560e01b815260040160405180910390fd5b6113888311156128e2576040516328a69b1f60e21b815260040160405180910390fd5b6129176001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084613356565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612974573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061299891906141ca565b60738054919250600160c01b9091046001600160401b03169060186129bc8361417a565b91906101000a8154816001600160401b0302191690836001600160401b031602179055505084846040516129f19291906144ae565b604051908190038120612a0a91839042906020016141a7565b60408051808303601f190181529181528151602092830120607354600160c01b90046001600160401b03165f9081526071909352912055323303612a99576073546040805183815233602082015260609181018290525f91810191909152600160c01b9091046001600160401b0316905f805160206145aa8339815191529060800160405180910390a2612ae3565b607360189054906101000a90046001600160401b03166001600160401b03165f805160206145aa83398151915282338888604051612ada94939291906144bd565b60405180910390a25b5050505050565b607a546001600160a01b03163314612b1557604051634755657960e01b815260040160405180910390fd5b60748054600160401b600160e01b031916600160401b6001600160a01b038416021790556040517f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90610a11908390613c1a565b612b71613638565b6001600160a01b038116612bd65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161212b565b610fb581613697565b5f80612be9611fdc565b90506001600160401b03881615612c7e576079546001600160401b039081169089161115612c2a5760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b038089165f908152607860205260409020600281015481549094509091898116600160401b9092041614612c7857604051632bd2e3e760e01b815260040160405180910390fd5b50612ce9565b6001600160401b0387165f90815260756020526040902054915081612cb6576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316876001600160401b03161115612ce957604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316866001600160401b031611612d1b5760405163b9b18f5760e01b815260040160405180910390fd5b5f612d298888888689610a1c565b90505f5f8051602061458a833981519152600283604051612d4a91906144e7565b602060405180830381855afa158015612d65573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612d8891906141ca565b612d9291906144f8565b604080516020810182528281529051634890ed4560e11b81529192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91612dee9189919060040161450b565b602060405180830381865afa158015612e09573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e2d9190614545565b612e4a576040516309bde33960e01b815260040160405180910390fd5b612ea433612e58858b614238565b6001600160401b0316612e69611bb0565b612e73919061426b565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190613837565b50505050505050505050565b5f6001600160401b03881615612f42576079546001600160401b039081169089161115612ef05760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f908152607860205260409020600281015481549092888116600160401b9092041614612f3c57604051632bd2e3e760e01b815260040160405180910390fd5b50612fa9565b506001600160401b0385165f9081526075602052604090205480612f79576040516324cbdcc360e11b815260040160405180910390fd5b6074546001600160401b039081169087161115612fa957604051630f2b74f160e11b815260040160405180910390fd5b6079546001600160401b039081169088161180612fd85750876001600160401b0316876001600160401b031611155b80612ff957506079546001600160401b03600160401b909104811690881611155b156130175760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260786020526040902054600160401b900481169086161461305a576040516332a2a77f60e01b815260040160405180910390fd5b5f6130688787878588610a1c565b90505f5f8051602061458a83398151915260028360405161308991906144e7565b602060405180830381855afa1580156130a4573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906130c791906141ca565b6130d191906144f8565b604080516020810182528281529051634890ed4560e11b81529192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161312d9188919060040161450b565b602060405180830381865afa158015613148573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061316c9190614545565b613189576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260786020526040902060020154859003612ea45760405163a47276bd60e01b815260040160405180910390fd5b6079546001600160401b03600160401b90910481169082161115806131f757506079546001600160401b03908116908216115b156132155760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f818152607860209081526040808320805460748054600160401b928390049098166001600160401b03199098168817905560028201548786526075909452938290209290925560798054600160401b600160801b0319169390940292909217909255600182015490516333d6247d60e01b815260048101919091529091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b1580156132ea575f80fd5b505af11580156132fc573d5f803e3d5ffd5b50505050826001600160401b0316816001600160401b03167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161334991815260200190565b60405180910390a3505050565b6040516001600160a01b03808516602483015283166044820152606481018290526133c19085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261386c565b50505050565b6079546001600160401b03600160401b8204811691161115611a03576079545f9061340390600160401b90046001600160401b03166001614098565b905061340e81610e1b565b15610fb5576079545f9060029061342f9084906001600160401b0316614238565b6134399190614564565b6134439083614098565b905061344e81610e1b565b156134605761345c816131c4565b5050565b61345c826131c4565b5f613472611fdc565b9050815f806134818484614238565b606f546001600160401b0391821692505f916134a39161010090041642614258565b90505b846001600160401b0316846001600160401b031614613523576001600160401b038085165f9081526072602052604090206001810154909116821015613502576001810154600160401b90046001600160401b0316945061351d565b61350c8686614238565b6001600160401b0316935050613523565b506134a6565b5f61352e8484614258565b90508381101561358557808403600c8111613549578061354c565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a607054028161357b5761357b614282565b04607055506135f4565b838103600c81116135965780613599565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a764000002816135cf576135cf614282565b04905080607054670de0b6b3a764000002816135ed576135ed614282565b0460705550505b683635c9adc5dea00000607054111561361957683635c9adc5dea00000607055611d44565b633b9aca006070541015611d4457633b9aca0060705550505050505050565b33613641611ba1565b6001600160a01b031614611a035760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161212b565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613740575f80fd5b505af1158015613752573d5f803e3d5ffd5b50505050611a0361393d565b6001600160a01b03163b151590565b5f54610100900460ff166137d75760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161212b565b611a0333613697565b606f5460ff1661380357604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b6040516001600160a01b03831660248201526044810182905261386790849063a9059cbb60e01b9060640161338a565b505050565b5f6138c0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166139989092919063ffffffff16565b80519091501561386757808060200190518101906138de9190614545565b6138675760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161212b565b606f5460ff161561396157604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60606139a684845f856139ae565b949350505050565b606082471015613a0f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161212b565b5f80866001600160a01b03168587604051613a2a91906144e7565b5f6040518083038185875af1925050503d805f8114613a64576040519150601f19603f3d011682016040523d82523d5f602084013e613a69565b606091505b5091509150613a7a87838387613a85565b979650505050505050565b60608315613af15782515f03613aea57613a9e8561375e565b613aea5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161212b565b50816139a6565b6139a68383815115613b065781518083602001fd5b8060405162461bcd60e51b815260040161212b9190613b81565b6001600160401b0391909116815260200190565b5f5b83811015613b4e578181015183820152602001613b36565b50505f910152565b5f8151808452613b6d816020860160208601613b34565b601f01601f19169290920160200192915050565b602081525f613b936020830184613b56565b9392505050565b5f60208284031215613baa575f80fd5b813561ffff81168114613b93575f80fd5b80356001600160401b0381168114611fd7575f80fd5b5f805f805f60a08688031215613be5575f80fd5b613bee86613bbb565b9450613bfc60208701613bbb565b94979496505050506040830135926060810135926080909101359150565b6001600160a01b0391909116815260200190565b806103008101831015613c3f575f80fd5b92915050565b5f805f805f806103a08789031215613c5b575f80fd5b613c6487613bbb565b9550613c7260208801613bbb565b9450613c8060408801613bbb565b93506060870135925060808701359150613c9d8860a08901613c2e565b90509295509295509295565b5f805f805f805f6103c0888a031215613cc0575f80fd5b613cc988613bbb565b9650613cd760208901613bbb565b9550613ce560408901613bbb565b9450613cf360608901613bbb565b93506080880135925060a08801359150613d108960c08a01613c2e565b905092959891949750929550565b5f60208284031215613d2e575f80fd5b613b9382613bbb565b5f8083601f840112613d47575f80fd5b5081356001600160401b03811115613d5d575f80fd5b6020830191508360208260051b8501011115613d77575f80fd5b9250929050565b80356001600160a01b0381168114611fd7575f80fd5b5f805f60408486031215613da6575f80fd5b83356001600160401b03811115613dbb575f80fd5b613dc786828701613d37565b9094509250613dda905060208501613d7e565b90509250925092565b5f60208284031215613df3575f80fd5b613b9382613d7e565b5f60208284031215613e0c575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112613e36575f80fd5b81356001600160401b0380821115613e5057613e50613e13565b604051601f8301601f19908116603f01168101908282118183101715613e7857613e78613e13565b81604052838152866020858801011115613e90575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f60208284031215613ebf575f80fd5b81356001600160401b03811115613ed4575f80fd5b6139a684828501613e27565b5f8083601f840112613ef0575f80fd5b5081356001600160401b03811115613f06575f80fd5b602083019150836020828501011115613d77575f80fd5b5f805f805f80868803610120811215613f34575f80fd5b60a0811215613f41575f80fd5b5086955060a0860135945060c08601356001600160401b0380821115613f65575f80fd5b613f718a838b01613e27565b955060e0890135915080821115613f86575f80fd5b613f928a838b01613e27565b9450610100890135915080821115613fa8575f80fd5b50613fb589828a01613ee0565b979a9699509497509295939492505050565b5f8060208385031215613fd8575f80fd5b82356001600160401b03811115613fed575f80fd5b613ff985828601613d37565b90969095509350505050565b5f805f60408486031215614017575f80fd5b83356001600160401b0381111561402c575f80fd5b61403886828701613ee0565b909790965060209590950135949350505050565b600181811c9082168061406057607f821691505b60208210810361407e57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038181168382160190808211156140b8576140b8614084565b5092915050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e198336030181126140e7575f80fd5b9190910192915050565b5f60808236031215614101575f80fd5b604051608081016001600160401b03808211838310171561412457614124613e13565b816040528435915080821115614138575f80fd5b5061414536828601613e27565b8252506020830135602082015261415e60408401613bbb565b604082015261416f60608401613bbb565b606082015292915050565b5f6001600160401b038281166002600160401b0319810161419d5761419d614084565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b5f602082840312156141da575f80fd5b5051919050565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b5f6001820161423157614231614084565b5060010190565b6001600160401b038281168282160390808211156140b8576140b8614084565b81810381811115613c3f57613c3f614084565b8082028115828204841417613c3f57613c3f614084565b634e487b7160e01b5f52601260045260245ffd5b5f826142a4576142a4614282565b500490565b601f821115613867575f81815260208120601f850160051c810160208610156142cf5750805b601f850160051c820191505b818110156142ee578281556001016142db565b505050505050565b81516001600160401b0381111561430f5761430f613e13565b6143238161431d845461404c565b846142a9565b602080601f831160018114614356575f841561433f5750858301515b5f19600386901b1c1916600185901b1785556142ee565b5f85815260208120601f198616915b8281101561438457888601518255948401946001909101908401614365565b50858210156143a157878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160401b038581168252841660208201526060604082018190525f9061440590830184866143b1565b9695505050505050565b80820180821115613c3f57613c3f614084565b5f8235605e198336030181126140e7575f80fd5b5f60608236031215614446575f80fd5b604051606081016001600160401b03808211838310171561446957614469613e13565b81604052843591508082111561447d575f80fd5b5061448a36828601613e27565b825250602083013560208201526144a360408401613bbb565b604082015292915050565b818382375f9101908152919050565b8481526001600160a01b03841660208201526060604082018190525f9061440590830184866143b1565b5f82516140e7818460208701613b34565b5f8261450657614506614282565b500690565b6103208101610300808584378201835f5b600181101561453b57815183526020928301929091019060010161451c565b5050509392505050565b5f60208284031215614555575f80fd5b81518015158114613b93575f80fd5b5f6001600160401b038381168061457d5761457d614282565b9216919091049291505056fe30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001f94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931a2646970667358221220820f6390588faddb24f9b7ce2d20dfe664629e0fe77ff4263ebff40b7cb9125564736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMBridge.json b/compiled-contracts/paris/PolygonZkEVMBridge.json index b10a58ab2..57fbf6ec3 100644 --- a/compiled-contracts/paris/PolygonZkEVMBridge.json +++ b/compiled-contracts/paris/PolygonZkEVMBridge.json @@ -776,8 +776,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50615c83806100206000396000f3fe6080604052600436106200019f5760003560e01c8063647c576c11620000e7578063be5831c71162000089578063dbc169761162000060578063dbc169761462000639578063ee25560b1462000651578063fb570834146200068257600080fd5b8063be5831c714620005ae578063cd58657914620005ea578063d02103ca146200060157600080fd5b80639e34070f11620000be5780639e34070f146200050a578063aaa13cc2146200054f578063bab161bf146200057457600080fd5b8063647c576c146200048657806379e2cf9714620004ab57806381b1c17414620004c357600080fd5b80632d2c9d94116200015157806334ac9cf2116200012857806334ac9cf2146200034b5780633ae05047146200037a5780633e197043146200039257600080fd5b80632d2c9d9414620002765780632dfdf0b5146200029b578063318aee3d14620002c257600080fd5b806322e95f2c116200018657806322e95f2c14620001ef578063240ff378146200023a5780632cffd02e146200025157600080fd5b806315064c9614620001a45780632072f6c514620001d5575b600080fd5b348015620001b157600080fd5b50606854620001c09060ff1681565b60405190151581526020015b60405180910390f35b348015620001e257600080fd5b50620001ed620006a7565b005b348015620001fc57600080fd5b50620002146200020e366004620032db565b62000705565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001cc565b620001ed6200024b36600462003372565b620007a8565b3480156200025e57600080fd5b50620001ed6200027036600462003409565b620009d0565b3480156200028357600080fd5b50620001ed6200029536600462003409565b62000f74565b348015620002a857600080fd5b50620002b360535481565b604051908152602001620001cc565b348015620002cf57600080fd5b5062000319620002e1366004620034ef565b606b6020526000908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001cc565b3480156200035857600080fd5b50606c54620002149073ffffffffffffffffffffffffffffffffffffffff1681565b3480156200038757600080fd5b50620002b362001178565b3480156200039f57600080fd5b50620002b3620003b136600462003526565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200049357600080fd5b50620001ed620004a5366004620035b0565b6200125e565b348015620004b857600080fd5b50620001ed620014ad565b348015620004d057600080fd5b5062000214620004e236600462003600565b606a6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200051757600080fd5b50620001c06200052936600462003600565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b3480156200055c57600080fd5b50620002146200056e3660046200361a565b620014e7565b3480156200058157600080fd5b506068546200059890610100900463ffffffff1681565b60405163ffffffff9091168152602001620001cc565b348015620005bb57600080fd5b506068546200059890790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001ed620005fb366004620036ce565b620016d3565b3480156200060e57600080fd5b50606854620002149065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200064657600080fd5b50620001ed62001c37565b3480156200065e57600080fd5b50620002b36200067036600462003600565b60696020526000908152604090205481565b3480156200068f57600080fd5b50620001c0620006a136600462003770565b62001c93565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006f9576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200070362001d7c565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091206000908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007e6576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8681166101009092041614806200080c5750600263ffffffff861610155b1562000844576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff163388883488886053546040516200089a9998979695949392919062003806565b60405180910390a1620009b8620009b26001606860019054906101000a900463ffffffff16338989348989604051620008d592919062003881565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b62001e10565b8215620009c957620009c962001f27565b5050505050565b60685460ff161562000a0e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000a258b8b8b8b8b8b8b8b8b8b8b600062001ffc565b73ffffffffffffffffffffffffffffffffffffffff861662000b01576040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a7a9190620038e6565b60006040518083038185875af1925050503d806000811462000ab9576040519150601f19603f3d011682016040523d82523d6000602084013e62000abe565b606091505b505090508062000afa576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000efc565b60685463ffffffff61010090910481169088160362000b435762000b3d73ffffffffffffffffffffffffffffffffffffffff87168585620021ed565b62000efc565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b166024820152600090603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e6e576000808062000c1886880188620039fb565b92509250925060008584848460405162000c329062003292565b62000c409392919062003abd565b8190604051809103906000f590508015801562000c61573d6000803e3d6000fd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f1990604401600060405180830381600087803b15801562000cd757600080fd5b505af115801562000cec573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e5c95949392919062003afa565b60405180910390a15050505062000ef9565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f1990604401600060405180830381600087803b15801562000edf57600080fd5b505af115801562000ef4573d6000803e3d6000fd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000fb2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000fc98b8b8b8b8b8b8b8b8b8b8b600162001ffc565b60008473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000ffc949392919062003b42565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200107f9190620038e6565b60006040518083038185875af1925050503d8060008114620010be576040519150601f19603f3d011682016040523d82523d6000602084013e620010c3565b606091505b5050905080620010ff576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b605354600090819081805b602081101562001255578083901c600116600103620011e65760338160208110620011b257620011b262003b8a565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062001213565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806200124c9062003be8565b91505062001183565b50919392505050565b600054610100900460ff16158080156200127f5750600054600160ff909116105b806200129b5750303b1580156200129b575060005460ff166001145b6200132d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200138c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001691841691909117905562001443620022c3565b8015620014a757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000703576200070362001f27565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201526000908190603801604051602081830303815290604052805190602001209050600060ff60f81b3083604051806020016200157d9062003292565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620015c8908d908d908d908d908d9060200162003c23565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001606929160200162003c64565b604051602081830303815290604052805190602001206040516020016200168f94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff161562001711576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200171b62002366565b60685463ffffffff888116610100909204161480620017415750600263ffffffff881610155b1562001779576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060608773ffffffffffffffffffffffffffffffffffffffff8816620017df57883414620017d5576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000925062001ad9565b341562001818576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089166000908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901562001908576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac90604401600060405180830381600087803b158015620018db57600080fd5b505af1158015620018f0573d6000803e3d6000fd5b50505050806020015194508060000151935062001ad7565b85156200191d576200191d898b8989620023db565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200198b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620019b1919062003c97565b9050620019d773ffffffffffffffffffffffffffffffffffffffff8b1633308e620028f9565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa15801562001a45573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a6b919062003c97565b905062001a79828262003cb1565b6068548c9850610100900463ffffffff169650935062001a998762002959565b62001aa48c62002a71565b62001aaf8d62002b7e565b60405160200162001ac39392919062003abd565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e868860535460405162001b1b98979695949392919062003cc7565b60405180910390a162001c0f620009b2600085878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b861562001c205762001c2062001f27565b5050505062001c2e60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c89576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200070362002c80565b600084815b602081101562001d6e57600163ffffffff8616821c8116900362001d0a5785816020811062001ccb5762001ccb62003b8a565b60200201358260405160200162001cec929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001d59565b8186826020811062001d205762001d2062003b8a565b602002013560405160200162001d40929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d658162003be8565b91505062001c98565b50821490505b949350505050565b60685460ff161562001dba576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b80600162001e216020600262003e79565b62001e2d919062003cb1565b6053541062001e68576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060536000815462001e7b9062003be8565b9182905550905060005b602081101562001f17578082901c60011660010362001ebd57826033826020811062001eb55762001eb562003b8a565b015550505050565b6033816020811062001ed35762001ed362003b8a565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001f0e9062003be8565b91505062001e85565b5062001f2262003e87565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001fad62001178565b6040518263ffffffff1660e01b815260040162001fcc91815260200190565b600060405180830381600087803b15801562001fe757600080fd5b505af1158015620014a7573d6000803e3d6000fd5b6200200d8b63ffffffff1662002d10565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b363200000000000000000000000000000000000000000000000000000000909252606481019190915260009165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303816000875af1158015620020b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620020d6919062003c97565b90508060000362002112576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff88811661010090920416146200215c576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606854600090610100900463ffffffff166200217a5750896200217d565b508a5b620021a66200219d848c8c8c8c8c8c8c604051620008d592919062003881565b8f8f8462001c93565b620021dd576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001f229084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002d75565b600054610100900460ff166200235c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001324565b6200070362002e88565b600260015403620023d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001324565b6002600155565b6000620023ec600482848662003eb6565b620023f79162003ee2565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620026765760008080808080806200245a896004818d62003eb6565b81019062002469919062003f2b565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614620024dd576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff861630146200252d576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002567576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620026229190620038e6565b6000604051808303816000865af19150503d806000811462002661576040519150601f19603f3d011682016040523d82523d6000602084013e62002666565b606091505b50505050505050505050620009c9565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c0000000000000000000000000000000000000000000000000000000014620026f2576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808080808080806200270a8a6004818e62003eb6565b81019062002719919062003f86565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146200278f576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87163014620027df576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f1691620028a39190620038e6565b6000604051808303816000865af19150503d8060008114620028e2576040519150601f19603f3d011682016040523d82523d6000602084013e620028e7565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014a79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002240565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691620029dd9190620038e6565b600060405180830381855afa9150503d806000811462002a1a576040519150601f19603f3d011682016040523d82523d6000602084013e62002a1f565b606091505b50915091508162002a66576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d74565b62001d748162002f21565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162002af59190620038e6565b600060405180830381855afa9150503d806000811462002b32576040519150601f19603f3d011682016040523d82523d6000602084013e62002b37565b606091505b50915091508162002a66576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d74565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169162002c019190620038e6565b600060405180830381855afa9150503d806000811462002c3e576040519150601f19603f3d011682016040523d82523d6000602084013e62002c43565b606091505b509150915081801562002c57575080516020145b62002c6457601262001d74565b8080602001905181019062001d74919062004012565b60018055565b60685460ff1662002cbd576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600881901c60008181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009c9576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600062002dd9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031119092919063ffffffff16565b80519091501562001f22578080602001905181019062002dfa919062004032565b62001f22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001324565b600054610100900460ff1662002c7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001324565b6060604082511062002f435781806020019051810190620007a2919062004052565b8151602003620030d35760005b60208110801562002f9b575082818151811062002f715762002f7162003b8a565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002fb6578062002fad8162003be8565b91505062002f50565b8060000362002ffa57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111562003018576200301862003891565b6040519080825280601f01601f19166020018201604052801562003043576020820181803683370190505b50905060005b82811015620030cb5784818151811062003067576200306762003b8a565b602001015160f81c60f81b82828151811062003087576200308762003b8a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080620030c28162003be8565b91505062003049565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d748484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051620031489190620038e6565b60006040518083038185875af1925050503d806000811462003187576040519150601f19603f3d011682016040523d82523d6000602084013e6200318c565b606091505b50915091506200319f87838387620031aa565b979650505050505050565b60608315620032455782516000036200323d5773ffffffffffffffffffffffffffffffffffffffff85163b6200323d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001324565b508162001d74565b62001d7483838151156200325c5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620013249190620040d2565b611b6680620040e883390190565b803563ffffffff811681146200310c57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620032d857600080fd5b50565b60008060408385031215620032ef57600080fd5b620032fa83620032a0565b915060208301356200330c81620032b5565b809150509250929050565b8015158114620032d857600080fd5b60008083601f8401126200333957600080fd5b50813567ffffffffffffffff8111156200335257600080fd5b6020830191508360208285010111156200336b57600080fd5b9250929050565b6000806000806000608086880312156200338b57600080fd5b6200339686620032a0565b94506020860135620033a881620032b5565b93506040860135620033ba8162003317565b9250606086013567ffffffffffffffff811115620033d757600080fd5b620033e58882890162003326565b969995985093965092949392505050565b806104008101831015620007a257600080fd5b60008060008060008060008060008060006105208c8e0312156200342c57600080fd5b620034388d8d620033f6565b9a50620034496104008d01620032a0565b99506104208c013598506104408c013597506200346a6104608d01620032a0565b96506104808c01356200347d81620032b5565b95506200348e6104a08d01620032a0565b94506104c08c0135620034a181620032b5565b93506104e08c013592506105008c013567ffffffffffffffff811115620034c757600080fd5b620034d58e828f0162003326565b915080935050809150509295989b509295989b9093969950565b6000602082840312156200350257600080fd5b81356200350f81620032b5565b9392505050565b60ff81168114620032d857600080fd5b600080600080600080600060e0888a0312156200354257600080fd5b87356200354f8162003516565b96506200355f60208901620032a0565b955060408801356200357181620032b5565b94506200358160608901620032a0565b935060808801356200359381620032b5565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215620035c657600080fd5b620035d184620032a0565b92506020840135620035e381620032b5565b91506040840135620035f581620032b5565b809150509250925092565b6000602082840312156200361357600080fd5b5035919050565b600080600080600080600060a0888a0312156200363657600080fd5b6200364188620032a0565b965060208801356200365381620032b5565b9550604088013567ffffffffffffffff808211156200367157600080fd5b6200367f8b838c0162003326565b909750955060608a01359150808211156200369957600080fd5b50620036a88a828b0162003326565b9094509250506080880135620036be8162003516565b8091505092959891949750929550565b600080600080600080600060c0888a031215620036ea57600080fd5b620036f588620032a0565b965060208801356200370781620032b5565b95506040880135945060608801356200372081620032b5565b93506080880135620037328162003317565b925060a088013567ffffffffffffffff8111156200374f57600080fd5b6200375d8a828b0162003326565b989b979a50959850939692959293505050565b60008060008061046085870312156200378857600080fd5b843593506200379b8660208701620033f6565b9250620037ac6104208601620032a0565b939692955092936104400135925050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600061010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620038678285018789620037bd565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b83811015620038dd578181015183820152602001620038c3565b50506000910152565b60008251620038fa818460208701620038c0565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156200394e576200394e62003891565b604052919050565b600067ffffffffffffffff82111562003973576200397362003891565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112620039b157600080fd5b8135620039c8620039c28262003956565b62003904565b818152846020838601011115620039de57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562003a1157600080fd5b833567ffffffffffffffff8082111562003a2a57600080fd5b62003a38878388016200399f565b9450602086013591508082111562003a4f57600080fd5b5062003a5e868287016200399f565b9250506040840135620035f58162003516565b6000815180845262003a8b816020860160208601620038c0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60608152600062003ad2606083018662003a71565b828103602084015262003ae6818662003a71565b91505060ff83166040830152949350505050565b63ffffffff86168152600073ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200319f608083018486620037bd565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff8416602082015260606040820152600062003b80606083018486620037bd565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003c1c5762003c1c62003bb9565b5060010190565b60608152600062003c39606083018789620037bd565b828103602084015262003c4e818688620037bd565b91505060ff831660408301529695505050505050565b6000835162003c78818460208801620038c0565b83519083019062003c8e818360208801620038c0565b01949350505050565b60006020828403121562003caa57600080fd5b5051919050565b81810381811115620007a257620007a262003bb9565b600061010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003d278285018762003a71565b925080851660e085015250509998505050505050505050565b600181815b8085111562003d9f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d835762003d8362003bb9565b8085161562003d9157918102915b93841c939080029062003d45565b509250929050565b60008262003db857506001620007a2565b8162003dc757506000620007a2565b816001811462003de0576002811462003deb5762003e0b565b6001915050620007a2565b60ff84111562003dff5762003dff62003bb9565b50506001821b620007a2565b5060208310610133831016604e8410600b841016171562003e30575081810a620007a2565b62003e3c838362003d40565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003e715762003e7162003bb9565b029392505050565b60006200350f838362003da7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000808585111562003ec757600080fd5b8386111562003ed557600080fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003f235780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a03121562003f4757600080fd5b873562003f5481620032b5565b9650602088013562003f6681620032b5565b955060408801359450606088013593506080880135620035938162003516565b600080600080600080600080610100898b03121562003fa457600080fd5b883562003fb181620032b5565b9750602089013562003fc381620032b5565b96506040890135955060608901359450608089013562003fe38162003317565b935060a089013562003ff58162003516565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200402557600080fd5b81516200350f8162003516565b6000602082840312156200404557600080fd5b81516200350f8162003317565b6000602082840312156200406557600080fd5b815167ffffffffffffffff8111156200407d57600080fd5b8201601f810184136200408f57600080fd5b8051620040a0620039c28262003956565b818152856020838501011115620040b657600080fd5b620040c9826020830160208601620038c0565b95945050505050565b6020815260006200350f602083018462003a7156fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212206fe049be388a1d04319b9913fe6d100c4c8e272fe0f5748eb056bd0622beabcc64736f6c63430008140033a2646970667358221220ef4412c515d53043ca441d4b33288d9aa2b101bc9853f859467ab1a42f16139c64736f6c63430008140033", - "deployedBytecode": "0x6080604052600436106200019f5760003560e01c8063647c576c11620000e7578063be5831c71162000089578063dbc169761162000060578063dbc169761462000639578063ee25560b1462000651578063fb570834146200068257600080fd5b8063be5831c714620005ae578063cd58657914620005ea578063d02103ca146200060157600080fd5b80639e34070f11620000be5780639e34070f146200050a578063aaa13cc2146200054f578063bab161bf146200057457600080fd5b8063647c576c146200048657806379e2cf9714620004ab57806381b1c17414620004c357600080fd5b80632d2c9d94116200015157806334ac9cf2116200012857806334ac9cf2146200034b5780633ae05047146200037a5780633e197043146200039257600080fd5b80632d2c9d9414620002765780632dfdf0b5146200029b578063318aee3d14620002c257600080fd5b806322e95f2c116200018657806322e95f2c14620001ef578063240ff378146200023a5780632cffd02e146200025157600080fd5b806315064c9614620001a45780632072f6c514620001d5575b600080fd5b348015620001b157600080fd5b50606854620001c09060ff1681565b60405190151581526020015b60405180910390f35b348015620001e257600080fd5b50620001ed620006a7565b005b348015620001fc57600080fd5b50620002146200020e366004620032db565b62000705565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001cc565b620001ed6200024b36600462003372565b620007a8565b3480156200025e57600080fd5b50620001ed6200027036600462003409565b620009d0565b3480156200028357600080fd5b50620001ed6200029536600462003409565b62000f74565b348015620002a857600080fd5b50620002b360535481565b604051908152602001620001cc565b348015620002cf57600080fd5b5062000319620002e1366004620034ef565b606b6020526000908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001cc565b3480156200035857600080fd5b50606c54620002149073ffffffffffffffffffffffffffffffffffffffff1681565b3480156200038757600080fd5b50620002b362001178565b3480156200039f57600080fd5b50620002b3620003b136600462003526565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200049357600080fd5b50620001ed620004a5366004620035b0565b6200125e565b348015620004b857600080fd5b50620001ed620014ad565b348015620004d057600080fd5b5062000214620004e236600462003600565b606a6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200051757600080fd5b50620001c06200052936600462003600565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b3480156200055c57600080fd5b50620002146200056e3660046200361a565b620014e7565b3480156200058157600080fd5b506068546200059890610100900463ffffffff1681565b60405163ffffffff9091168152602001620001cc565b348015620005bb57600080fd5b506068546200059890790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001ed620005fb366004620036ce565b620016d3565b3480156200060e57600080fd5b50606854620002149065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200064657600080fd5b50620001ed62001c37565b3480156200065e57600080fd5b50620002b36200067036600462003600565b60696020526000908152604090205481565b3480156200068f57600080fd5b50620001c0620006a136600462003770565b62001c93565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006f9576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200070362001d7c565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091206000908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007e6576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8681166101009092041614806200080c5750600263ffffffff861610155b1562000844576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff163388883488886053546040516200089a9998979695949392919062003806565b60405180910390a1620009b8620009b26001606860019054906101000a900463ffffffff16338989348989604051620008d592919062003881565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b62001e10565b8215620009c957620009c962001f27565b5050505050565b60685460ff161562000a0e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000a258b8b8b8b8b8b8b8b8b8b8b600062001ffc565b73ffffffffffffffffffffffffffffffffffffffff861662000b01576040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a7a9190620038e6565b60006040518083038185875af1925050503d806000811462000ab9576040519150601f19603f3d011682016040523d82523d6000602084013e62000abe565b606091505b505090508062000afa576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000efc565b60685463ffffffff61010090910481169088160362000b435762000b3d73ffffffffffffffffffffffffffffffffffffffff87168585620021ed565b62000efc565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b166024820152600090603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e6e576000808062000c1886880188620039fb565b92509250925060008584848460405162000c329062003292565b62000c409392919062003abd565b8190604051809103906000f590508015801562000c61573d6000803e3d6000fd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f1990604401600060405180830381600087803b15801562000cd757600080fd5b505af115801562000cec573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e5c95949392919062003afa565b60405180910390a15050505062000ef9565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f1990604401600060405180830381600087803b15801562000edf57600080fd5b505af115801562000ef4573d6000803e3d6000fd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000fb2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000fc98b8b8b8b8b8b8b8b8b8b8b600162001ffc565b60008473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000ffc949392919062003b42565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200107f9190620038e6565b60006040518083038185875af1925050503d8060008114620010be576040519150601f19603f3d011682016040523d82523d6000602084013e620010c3565b606091505b5050905080620010ff576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b605354600090819081805b602081101562001255578083901c600116600103620011e65760338160208110620011b257620011b262003b8a565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062001213565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806200124c9062003be8565b91505062001183565b50919392505050565b600054610100900460ff16158080156200127f5750600054600160ff909116105b806200129b5750303b1580156200129b575060005460ff166001145b6200132d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200138c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001691841691909117905562001443620022c3565b8015620014a757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000703576200070362001f27565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201526000908190603801604051602081830303815290604052805190602001209050600060ff60f81b3083604051806020016200157d9062003292565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620015c8908d908d908d908d908d9060200162003c23565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001606929160200162003c64565b604051602081830303815290604052805190602001206040516020016200168f94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff161562001711576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200171b62002366565b60685463ffffffff888116610100909204161480620017415750600263ffffffff881610155b1562001779576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060608773ffffffffffffffffffffffffffffffffffffffff8816620017df57883414620017d5576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000925062001ad9565b341562001818576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089166000908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901562001908576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac90604401600060405180830381600087803b158015620018db57600080fd5b505af1158015620018f0573d6000803e3d6000fd5b50505050806020015194508060000151935062001ad7565b85156200191d576200191d898b8989620023db565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200198b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620019b1919062003c97565b9050620019d773ffffffffffffffffffffffffffffffffffffffff8b1633308e620028f9565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa15801562001a45573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a6b919062003c97565b905062001a79828262003cb1565b6068548c9850610100900463ffffffff169650935062001a998762002959565b62001aa48c62002a71565b62001aaf8d62002b7e565b60405160200162001ac39392919062003abd565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e868860535460405162001b1b98979695949392919062003cc7565b60405180910390a162001c0f620009b2600085878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b861562001c205762001c2062001f27565b5050505062001c2e60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c89576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200070362002c80565b600084815b602081101562001d6e57600163ffffffff8616821c8116900362001d0a5785816020811062001ccb5762001ccb62003b8a565b60200201358260405160200162001cec929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001d59565b8186826020811062001d205762001d2062003b8a565b602002013560405160200162001d40929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d658162003be8565b91505062001c98565b50821490505b949350505050565b60685460ff161562001dba576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b80600162001e216020600262003e79565b62001e2d919062003cb1565b6053541062001e68576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060536000815462001e7b9062003be8565b9182905550905060005b602081101562001f17578082901c60011660010362001ebd57826033826020811062001eb55762001eb562003b8a565b015550505050565b6033816020811062001ed35762001ed362003b8a565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001f0e9062003be8565b91505062001e85565b5062001f2262003e87565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001fad62001178565b6040518263ffffffff1660e01b815260040162001fcc91815260200190565b600060405180830381600087803b15801562001fe757600080fd5b505af1158015620014a7573d6000803e3d6000fd5b6200200d8b63ffffffff1662002d10565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b363200000000000000000000000000000000000000000000000000000000909252606481019190915260009165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303816000875af1158015620020b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620020d6919062003c97565b90508060000362002112576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff88811661010090920416146200215c576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606854600090610100900463ffffffff166200217a5750896200217d565b508a5b620021a66200219d848c8c8c8c8c8c8c604051620008d592919062003881565b8f8f8462001c93565b620021dd576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001f229084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002d75565b600054610100900460ff166200235c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001324565b6200070362002e88565b600260015403620023d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001324565b6002600155565b6000620023ec600482848662003eb6565b620023f79162003ee2565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620026765760008080808080806200245a896004818d62003eb6565b81019062002469919062003f2b565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614620024dd576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff861630146200252d576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002567576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620026229190620038e6565b6000604051808303816000865af19150503d806000811462002661576040519150601f19603f3d011682016040523d82523d6000602084013e62002666565b606091505b50505050505050505050620009c9565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c0000000000000000000000000000000000000000000000000000000014620026f2576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808080808080806200270a8a6004818e62003eb6565b81019062002719919062003f86565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146200278f576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87163014620027df576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f1691620028a39190620038e6565b6000604051808303816000865af19150503d8060008114620028e2576040519150601f19603f3d011682016040523d82523d6000602084013e620028e7565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014a79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002240565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691620029dd9190620038e6565b600060405180830381855afa9150503d806000811462002a1a576040519150601f19603f3d011682016040523d82523d6000602084013e62002a1f565b606091505b50915091508162002a66576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d74565b62001d748162002f21565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162002af59190620038e6565b600060405180830381855afa9150503d806000811462002b32576040519150601f19603f3d011682016040523d82523d6000602084013e62002b37565b606091505b50915091508162002a66576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d74565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169162002c019190620038e6565b600060405180830381855afa9150503d806000811462002c3e576040519150601f19603f3d011682016040523d82523d6000602084013e62002c43565b606091505b509150915081801562002c57575080516020145b62002c6457601262001d74565b8080602001905181019062001d74919062004012565b60018055565b60685460ff1662002cbd576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600881901c60008181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009c9576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600062002dd9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031119092919063ffffffff16565b80519091501562001f22578080602001905181019062002dfa919062004032565b62001f22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001324565b600054610100900460ff1662002c7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001324565b6060604082511062002f435781806020019051810190620007a2919062004052565b8151602003620030d35760005b60208110801562002f9b575082818151811062002f715762002f7162003b8a565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002fb6578062002fad8162003be8565b91505062002f50565b8060000362002ffa57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111562003018576200301862003891565b6040519080825280601f01601f19166020018201604052801562003043576020820181803683370190505b50905060005b82811015620030cb5784818151811062003067576200306762003b8a565b602001015160f81c60f81b82828151811062003087576200308762003b8a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080620030c28162003be8565b91505062003049565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d748484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051620031489190620038e6565b60006040518083038185875af1925050503d806000811462003187576040519150601f19603f3d011682016040523d82523d6000602084013e6200318c565b606091505b50915091506200319f87838387620031aa565b979650505050505050565b60608315620032455782516000036200323d5773ffffffffffffffffffffffffffffffffffffffff85163b6200323d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001324565b508162001d74565b62001d7483838151156200325c5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620013249190620040d2565b611b6680620040e883390190565b803563ffffffff811681146200310c57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620032d857600080fd5b50565b60008060408385031215620032ef57600080fd5b620032fa83620032a0565b915060208301356200330c81620032b5565b809150509250929050565b8015158114620032d857600080fd5b60008083601f8401126200333957600080fd5b50813567ffffffffffffffff8111156200335257600080fd5b6020830191508360208285010111156200336b57600080fd5b9250929050565b6000806000806000608086880312156200338b57600080fd5b6200339686620032a0565b94506020860135620033a881620032b5565b93506040860135620033ba8162003317565b9250606086013567ffffffffffffffff811115620033d757600080fd5b620033e58882890162003326565b969995985093965092949392505050565b806104008101831015620007a257600080fd5b60008060008060008060008060008060006105208c8e0312156200342c57600080fd5b620034388d8d620033f6565b9a50620034496104008d01620032a0565b99506104208c013598506104408c013597506200346a6104608d01620032a0565b96506104808c01356200347d81620032b5565b95506200348e6104a08d01620032a0565b94506104c08c0135620034a181620032b5565b93506104e08c013592506105008c013567ffffffffffffffff811115620034c757600080fd5b620034d58e828f0162003326565b915080935050809150509295989b509295989b9093969950565b6000602082840312156200350257600080fd5b81356200350f81620032b5565b9392505050565b60ff81168114620032d857600080fd5b600080600080600080600060e0888a0312156200354257600080fd5b87356200354f8162003516565b96506200355f60208901620032a0565b955060408801356200357181620032b5565b94506200358160608901620032a0565b935060808801356200359381620032b5565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215620035c657600080fd5b620035d184620032a0565b92506020840135620035e381620032b5565b91506040840135620035f581620032b5565b809150509250925092565b6000602082840312156200361357600080fd5b5035919050565b600080600080600080600060a0888a0312156200363657600080fd5b6200364188620032a0565b965060208801356200365381620032b5565b9550604088013567ffffffffffffffff808211156200367157600080fd5b6200367f8b838c0162003326565b909750955060608a01359150808211156200369957600080fd5b50620036a88a828b0162003326565b9094509250506080880135620036be8162003516565b8091505092959891949750929550565b600080600080600080600060c0888a031215620036ea57600080fd5b620036f588620032a0565b965060208801356200370781620032b5565b95506040880135945060608801356200372081620032b5565b93506080880135620037328162003317565b925060a088013567ffffffffffffffff8111156200374f57600080fd5b6200375d8a828b0162003326565b989b979a50959850939692959293505050565b60008060008061046085870312156200378857600080fd5b843593506200379b8660208701620033f6565b9250620037ac6104208601620032a0565b939692955092936104400135925050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600061010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620038678285018789620037bd565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b83811015620038dd578181015183820152602001620038c3565b50506000910152565b60008251620038fa818460208701620038c0565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156200394e576200394e62003891565b604052919050565b600067ffffffffffffffff82111562003973576200397362003891565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112620039b157600080fd5b8135620039c8620039c28262003956565b62003904565b818152846020838601011115620039de57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562003a1157600080fd5b833567ffffffffffffffff8082111562003a2a57600080fd5b62003a38878388016200399f565b9450602086013591508082111562003a4f57600080fd5b5062003a5e868287016200399f565b9250506040840135620035f58162003516565b6000815180845262003a8b816020860160208601620038c0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60608152600062003ad2606083018662003a71565b828103602084015262003ae6818662003a71565b91505060ff83166040830152949350505050565b63ffffffff86168152600073ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200319f608083018486620037bd565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff8416602082015260606040820152600062003b80606083018486620037bd565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003c1c5762003c1c62003bb9565b5060010190565b60608152600062003c39606083018789620037bd565b828103602084015262003c4e818688620037bd565b91505060ff831660408301529695505050505050565b6000835162003c78818460208801620038c0565b83519083019062003c8e818360208801620038c0565b01949350505050565b60006020828403121562003caa57600080fd5b5051919050565b81810381811115620007a257620007a262003bb9565b600061010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003d278285018762003a71565b925080851660e085015250509998505050505050505050565b600181815b8085111562003d9f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d835762003d8362003bb9565b8085161562003d9157918102915b93841c939080029062003d45565b509250929050565b60008262003db857506001620007a2565b8162003dc757506000620007a2565b816001811462003de0576002811462003deb5762003e0b565b6001915050620007a2565b60ff84111562003dff5762003dff62003bb9565b50506001821b620007a2565b5060208310610133831016604e8410600b841016171562003e30575081810a620007a2565b62003e3c838362003d40565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003e715762003e7162003bb9565b029392505050565b60006200350f838362003da7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000808585111562003ec757600080fd5b8386111562003ed557600080fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003f235780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a03121562003f4757600080fd5b873562003f5481620032b5565b9650602088013562003f6681620032b5565b955060408801359450606088013593506080880135620035938162003516565b600080600080600080600080610100898b03121562003fa457600080fd5b883562003fb181620032b5565b9750602089013562003fc381620032b5565b96506040890135955060608901359450608089013562003fe38162003317565b935060a089013562003ff58162003516565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200402557600080fd5b81516200350f8162003516565b6000602082840312156200404557600080fd5b81516200350f8162003317565b6000602082840312156200406557600080fd5b815167ffffffffffffffff8111156200407d57600080fd5b8201601f810184136200408f57600080fd5b8051620040a0620039c28262003956565b818152856020838501011115620040b657600080fd5b620040c9826020830160208601620038c0565b95945050505050565b6020815260006200350f602083018462003a7156fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212206fe049be388a1d04319b9913fe6d100c4c8e272fe0f5748eb056bd0622beabcc64736f6c63430008140033a2646970667358221220ef4412c515d53043ca441d4b33288d9aa2b101bc9853f859467ab1a42f16139c64736f6c63430008140033", + "bytecode": "0x608060405234801561000f575f80fd5b506145ab8061001d5f395ff3fe60806040526004361062000127575f3560e01c806315064c96146200012b5780632072f6c5146200015b57806322e95f2c1462000174578063240ff37814620001a75780632cffd02e14620001be5780632d2c9d9414620001e25780632dfdf0b51462000206578063318aee3d146200022c57806334ac9cf214620002985780633ae0504714620002b95780633e19704314620002d0578063647c576c14620002f457806379e2cf97146200031857806381b1c174146200032f5780639e34070f1462000367578063aaa13cc214620003aa578063bab161bf14620003ce578063be5831c71462000407578063cd586579146200042c578063d02103ca1462000443578063dbc16976146200046b578063ee25560b1462000482578063fb57083414620004b1575b5f80fd5b34801562000137575f80fd5b50606854620001469060ff1681565b60405190151581526020015b60405180910390f35b34801562000167575f80fd5b5062000172620004d5565b005b34801562000180575f80fd5b50620001986200019236600462002332565b6200050d565b6040516200015291906200236c565b62000172620001b8366004620023d5565b6200055d565b348015620001ca575f80fd5b5062000172620001dc36600462002465565b62000672565b348015620001ee575f80fd5b50620001726200020036600462002465565b62000a45565b34801562000212575f80fd5b506200021d60535481565b60405190815260200162000152565b34801562000238575f80fd5b50620002736200024a36600462002542565b606b6020525f908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b0390911660208301520162000152565b348015620002a4575f80fd5b50606c5462000198906001600160a01b031681565b348015620002c5575f80fd5b506200021d62000b7e565b348015620002dc575f80fd5b506200021d620002ee36600462002576565b62000c65565b34801562000300575f80fd5b506200017262000312366004620025fb565b62000cf1565b34801562000324575f80fd5b506200017262000e6f565b3480156200033b575f80fd5b50620001986200034d36600462002648565b606a6020525f90815260409020546001600160a01b031681565b34801562000373575f80fd5b50620001466200038536600462002648565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b348015620003b6575f80fd5b5062000198620003c836600462002660565b62000e93565b348015620003da575f80fd5b50606854620003f190610100900463ffffffff1681565b60405163ffffffff909116815260200162000152565b34801562000413575f80fd5b50606854620003f190600160c81b900463ffffffff1681565b620001726200043d3660046200270c565b62000fa8565b3480156200044f575f80fd5b506068546200019890600160281b90046001600160a01b031681565b34801562000477575f80fd5b50620001726200132c565b3480156200048e575f80fd5b506200021d620004a036600462002648565b60696020525f908152604090205481565b348015620004bd575f80fd5b5062000146620004cf366004620027a7565b62001362565b606c546001600160a01b03163314620005015760405163e2e8106b60e01b815260040160405180910390fd5b6200050b6200143a565b565b5f606a5f848460405160200162000526929190620027f1565b60408051601f198184030181529181528151602092830120835290820192909252015f20546001600160a01b031690505b92915050565b60685460ff16156200058257604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161480620005a85750600263ffffffff861610155b15620005c7576040516302caf51760e11b815260040160405180910390fd5b5f80516020620045368339815191526001606860019054906101000a900463ffffffff163388883488886053546040516200060b9998979695949392919062002843565b60405180910390a16200065a620006546001606860019054906101000a900463ffffffff1633898934898960405162000646929190620028b1565b604051809103902062000c65565b62001496565b82156200066b576200066b62001591565b5050505050565b60685460ff16156200069757604051630bc011ff60e21b815260040160405180910390fd5b620006ad8b8b8b8b8b8b8b8b8b8b8b5f62001624565b6001600160a01b0386166200075257604080515f808252602082019092526001600160a01b038616908590604051620006e79190620028f8565b5f6040518083038185875af1925050503d805f811462000723576040519150601f19603f3d011682016040523d82523d5f602084013e62000728565b606091505b50509050806200074b57604051630ce8f45160e31b815260040160405180910390fd5b5062000a09565b60685463ffffffff6101009091048116908816036200078757620007816001600160a01b038716858562001787565b62000a09565b5f87876040516020016200079d929190620027f1565b60408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b031680620009a6575f8080620007e486880188620029c9565b9250925092505f85848484604051620007fd90620022f8565b6200080b9392919062002a66565b8190604051809103905ff590508015801562000829573d5f803e3d5ffd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f19906200085d908d908d9060040162002aa2565b5f604051808303815f87803b15801562000875575f80fd5b505af115801562000888573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b6040516200099495949392919062002abb565b60405180910390a15050505062000a06565b6040516340c10f1960e01b81526001600160a01b038216906340c10f1990620009d6908990899060040162002aa2565b5f604051808303815f87803b158015620009ee575f80fd5b505af115801562000a01573d5f803e3d5ffd5b505050505b50505b5f80516020620045568339815191528a8888878760405162000a3095949392919062002af5565b60405180910390a15050505050505050505050565b60685460ff161562000a6a57604051630bc011ff60e21b815260040160405180910390fd5b62000a818b8b8b8b8b8b8b8b8b8b8b600162001624565b5f846001600160a01b031684888a868660405160240162000aa6949392919062002b2c565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162000add9190620028f8565b5f6040518083038185875af1925050503d805f811462000b19576040519150601f19603f3d011682016040523d82523d5f602084013e62000b1e565b606091505b505090508062000b41576040516337e391c360e01b815260040160405180910390fd5b5f80516020620045568339815191528b8989888860405162000b6895949392919062002af5565b60405180910390a1505050505050505050505050565b6053545f90819081805b602081101562000c5c578083901c60011660010362000beb576033816020811062000bb75762000bb762002b68565b01548460405160200162000bcd92919062002b7c565b60405160208183030381529060405280519060200120935062000c19565b838260405160200162000c0092919062002b7c565b6040516020818303038152906040528051906020012093505b818260405160200162000c2e92919062002b7c565b604051602081830303815290604052805190602001209150808062000c539062002b9e565b91505062000b88565b50919392505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b5f54610100900460ff161580801562000d1057505f54600160ff909116105b8062000d34575062000d2230620017e1565b15801562000d3457505f5460ff166001145b62000d9d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801562000dbf575f805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff871602600160281b600160c81b03191617600160281b6001600160a01b038681169190910291909117909155606c80546001600160a01b03191691841691909117905562000e23620017f0565b801562000e69575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854600160c81b900463ffffffff1610156200050b576200050b62001591565b5f80888860405160200162000eaa929190620027f1565b6040516020818303038152906040528051906020012090505f60ff60f81b30836040518060200162000edc90620022f8565b601f1982820381018352601f90910116604081905262000f09908d908d908d908d908d9060200162002bb9565b60408051601f198184030181529082905262000f29929160200162002bf9565b6040516020818303038152906040528051906020012060405160200162000f8294939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b60685460ff161562000fcd57604051630bc011ff60e21b815260040160405180910390fd5b62000fd762001823565b60685463ffffffff88811661010090920416148062000ffd5750600263ffffffff881610155b156200101c576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b0388166200105a57883414620010515760405163b89240f560e01b815260040160405180910390fd5b5f9250620012b1565b34156200107a5760405163798ee6f160e01b815260040160405180910390fd5b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b900490921691810182905290156200113157604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac90620010ef9033908e9060040162002aa2565b5f604051808303815f87803b15801562001107575f80fd5b505af11580156200111a573d5f803e3d5ffd5b5050505080602001519450805f01519350620012af565b8515620011465762001146898b89896200187e565b6040516370a0823160e01b81525f906001600160a01b038b16906370a0823190620011769030906004016200236c565b602060405180830381865afa15801562001192573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620011b8919062002c2b565b9050620011d16001600160a01b038b1633308e62001bd5565b6040516370a0823160e01b81525f906001600160a01b038c16906370a0823190620012019030906004016200236c565b602060405180830381865afa1580156200121d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001243919062002c2b565b905062001251828262002c43565b6068548c9850610100900463ffffffff1696509350620012718762001c0f565b6200127c8c62001cd2565b620012878d62001d8c565b6040516020016200129b9392919062002a66565b604051602081830303815290604052945050505b505b5f80516020620045368339815191525f84868e8e8688605354604051620012e098979695949392919062002c59565b60405180910390a162001304620006545f85878f8f87898051906020012062000c65565b861562001315576200131562001591565b505050506200132360018055565b50505050505050565b606c546001600160a01b03163314620013585760405163e2e8106b60e01b815260040160405180910390fd5b6200050b62001e4f565b5f84815b60208110156200142c57600163ffffffff8616821c81169003620013d05785816020811062001399576200139962002b68565b602002013582604051602001620013b292919062002b7c565b60405160208183030381529060405280519060200120915062001417565b81868260208110620013e657620013e662002b68565b6020020135604051602001620013fe92919062002b7c565b6040516020818303038152906040528051906020012091505b80620014238162002b9e565b91505062001366565b50821490505b949350505050565b60685460ff16156200145f57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b806001620014a76020600262002dbe565b620014b3919062002c43565b60535410620014d5576040516377ae67b360e11b815260040160405180910390fd5b5f60535f8154620014e69062002b9e565b918290555090505f5b602081101562001581578082901c600116600103620015275782603382602081106200151f576200151f62002b68565b015550505050565b603381602081106200153d576200153d62002b68565b0154836040516020016200155392919062002b7c565b6040516020818303038152906040528051906020012092508080620015789062002b9e565b915050620014ef565b506200158c62002dcb565b505050565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d620015da62000b7e565b6040518263ffffffff1660e01b8152600401620015f991815260200190565b5f604051808303815f87803b15801562001611575f80fd5b505af115801562000e69573d5f803e3d5ffd5b620016358b63ffffffff1662001ea7565b6068545f90600160281b90046001600160a01b031663257b36326200165b8d8d62001ef2565b6040518263ffffffff1660e01b81526004016200167a91815260200190565b6020604051808303815f875af115801562001697573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620016bd919062002c2b565b9050805f03620016df57604051622f6fad60e01b815260040160405180910390fd5b60685463ffffffff888116610100909204161462001710576040516302caf51760e11b815260040160405180910390fd5b6068545f90610100900463ffffffff166200172d57508962001730565b508a5b6200175962001750848c8c8c8c8c8c8c60405162000646929190620028b1565b8f8f8462001362565b62001777576040516338105f3b60e21b815260040160405180910390fd5b5050505050505050505050505050565b6200158c8363a9059cbb60e01b8484604051602401620017a992919062002aa2565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262001f26565b6001600160a01b03163b151590565b5f54610100900460ff16620018195760405162461bcd60e51b815260040162000d949062002ddf565b6200050b62001ffe565b600260015403620018775760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000d94565b6002600155565b5f6200188e600482848662002e2a565b620018999162002e53565b9050632afa533160e01b6001600160e01b031982160162001a35575f808080808080620018ca896004818d62002e2a565b810190620018d9919062002e84565b9650965096509650965096509650336001600160a01b0316876001600160a01b0316146200191a5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0386163014620019445760405163750643af60e01b815260040160405180910390fd5b8a851462001965576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e1691620019e59190620028f8565b5f604051808303815f865af19150503d805f811462001a20576040519150601f19603f3d011682016040523d82523d5f602084013e62001a25565b606091505b505050505050505050506200066b565b6001600160e01b031981166323f2ebc360e21b1462001a6757604051637141605d60e11b815260040160405180910390fd5b5f8080808080808062001a7e8a6004818e62002e2a565b81019062001a8d919062002eda565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462001ad05760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038716301462001afa5760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169162001b839190620028f8565b5f604051808303815f865af19150503d805f811462001bbe576040519150601f19603f3d011682016040523d82523d5f602084013e62001bc3565b606091505b50505050505050505050505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905262000e699085906323b872dd60e01b90608401620017a9565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b17905290516060915f9182916001600160a01b0386169162001c579190620028f8565b5f60405180830381855afa9150503d805f811462001c91576040519150601f19603f3d011682016040523d82523d5f602084013e62001c96565b606091505b50915091508162001cc757604051806040016040528060078152602001664e4f5f4e414d4560c81b81525062001432565b620014328162002027565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b17905290516060915f9182916001600160a01b0386169162001d1a9190620028f8565b5f60405180830381855afa9150503d805f811462001d54576040519150601f19603f3d011682016040523d82523d5f602084013e62001d59565b606091505b50915091508162001cc757604051806040016040528060098152602001681393d7d4d6535093d360ba1b81525062001432565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f91829182916001600160a01b0386169162001dd39190620028f8565b5f60405180830381855afa9150503d805f811462001e0d576040519150601f19603f3d011682016040523d82523d5f602084013e62001e12565b606091505b509150915081801562001e26575080516020145b62001e3357601262001432565b8080602001905181019062001432919062002f61565b60018055565b60685460ff1662001e7357604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b918218928390559290919081831690036200066b57604051630c8d9eab60e31b815260040160405180910390fd5b5f828260405160200162001f0892919062002b7c565b60405160208183030381529060405280519060200120905092915050565b5f62001f7c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620021cb9092919063ffffffff16565b8051909150156200158c578080602001905181019062001f9d919062002f7f565b6200158c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000d94565b5f54610100900460ff1662001e495760405162461bcd60e51b815260040162000d949062002ddf565b6060604082511062002049578180602001905181019062000557919062002f9d565b815160200362002198575f5b60208110801562002088575082818151811062002076576200207662002b68565b01602001516001600160f81b03191615155b15620020a357806200209a8162002b9e565b91505062002055565b805f03620020db5750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b5f816001600160401b03811115620020f757620020f7620028c0565b6040519080825280601f01601f19166020018201604052801562002122576020820181803683370190505b5090505f5b82811015620021905784818151811062002145576200214562002b68565b602001015160f81c60f81b82828151811062002165576200216562002b68565b60200101906001600160f81b03191690815f1a90535080620021878162002b9e565b91505062002127565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b60606200143284845f85855f80866001600160a01b03168587604051620021f39190620028f8565b5f6040518083038185875af1925050503d805f81146200222f576040519150601f19603f3d011682016040523d82523d5f602084013e62002234565b606091505b5091509150620022478783838762002252565b979650505050505050565b60608315620022c55782515f03620022bd576200226f85620017e1565b620022bd5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000d94565b508162001432565b620014328383815115620022dc5781518083602001fd5b8060405162461bcd60e51b815260040162000d94919062003017565b61150a806200302c83390190565b803563ffffffff81168114620021c6575f80fd5b6001600160a01b03811681146200232f575f80fd5b50565b5f806040838503121562002344575f80fd5b6200234f8362002306565b9150602083013562002361816200231a565b809150509250929050565b6001600160a01b0391909116815260200190565b80151581146200232f575f80fd5b5f8083601f8401126200239f575f80fd5b5081356001600160401b03811115620023b6575f80fd5b602083019150836020828501011115620023ce575f80fd5b9250929050565b5f805f805f60808688031215620023ea575f80fd5b620023f58662002306565b9450602086013562002407816200231a565b93506040860135620024198162002380565b925060608601356001600160401b0381111562002434575f80fd5b62002442888289016200238e565b969995985093965092949392505050565b80610400810183101562000557575f80fd5b5f805f805f805f805f805f6105208c8e03121562002481575f80fd5b6200248d8d8d62002453565b9a506200249e6104008d0162002306565b99506104208c013598506104408c01359750620024bf6104608d0162002306565b96506104808c0135620024d2816200231a565b9550620024e36104a08d0162002306565b94506104c08c0135620024f6816200231a565b93506104e08c013592506105008c01356001600160401b038111156200251a575f80fd5b620025288e828f016200238e565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562002553575f80fd5b813562002560816200231a565b9392505050565b60ff811681146200232f575f80fd5b5f805f805f805f60e0888a0312156200258d575f80fd5b87356200259a8162002567565b9650620025aa6020890162002306565b95506040880135620025bc816200231a565b9450620025cc6060890162002306565b93506080880135620025de816200231a565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156200260e575f80fd5b620026198462002306565b925060208401356200262b816200231a565b915060408401356200263d816200231a565b809150509250925092565b5f6020828403121562002659575f80fd5b5035919050565b5f805f805f805f60a0888a03121562002677575f80fd5b620026828862002306565b9650602088013562002694816200231a565b955060408801356001600160401b0380821115620026b0575f80fd5b620026be8b838c016200238e565b909750955060608a0135915080821115620026d7575f80fd5b50620026e68a828b016200238e565b9094509250506080880135620026fc8162002567565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562002723575f80fd5b6200272e8862002306565b9650602088013562002740816200231a565b955060408801359450606088013562002759816200231a565b935060808801356200276b8162002380565b925060a08801356001600160401b0381111562002786575f80fd5b620027948a828b016200238e565b989b979a50959850939692959293505050565b5f805f806104608587031215620027bc575f80fd5b84359350620027cf866020870162002453565b9250620027e0610420860162002306565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c083018190525f916200289784830187896200281b565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015620028f0578181015183820152602001620028d6565b50505f910152565b5f82516200290b818460208701620028d4565b9190910192915050565b604051601f8201601f191681016001600160401b0381118282101715620029405762002940620028c0565b604052919050565b5f6001600160401b03821115620029635762002963620028c0565b50601f01601f191660200190565b5f82601f83011262002981575f80fd5b813562002998620029928262002948565b62002915565b818152846020838601011115620029ad575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f60608486031215620029dc575f80fd5b83356001600160401b0380821115620029f3575f80fd5b62002a018783880162002971565b9450602086013591508082111562002a17575f80fd5b5062002a268682870162002971565b92505060408401356200263d8162002567565b5f815180845262002a52816020860160208601620028d4565b601f01601f19169290920160200192915050565b606081525f62002a7a606083018662002a39565b828103602084015262002a8e818662002a39565b91505060ff83166040830152949350505050565b6001600160a01b03929092168252602082015260400190565b63ffffffff861681526001600160a01b038581166020830152841660408201526080606082018190525f906200224790830184866200281b565b63ffffffff95861681529390941660208401526001600160a01b039182166040840152166060820152608081019190915260a00190565b6001600160a01b038516815263ffffffff841660208201526060604082018190525f9062002b5e90830184866200281b565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b918252602082015260400190565b634e487b7160e01b5f52601160045260245ffd5b5f6001820162002bb25762002bb262002b8a565b5060010190565b606081525f62002bce6060830187896200281b565b828103602084015262002be38186886200281b565b91505060ff831660408301529695505050505050565b5f835162002c0c818460208801620028d4565b83519083019062002c22818360208801620028d4565b01949350505050565b5f6020828403121562002c3c575f80fd5b5051919050565b8181038181111562000557576200055762002b8a565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c083018190525f9162002cac8483018762002a39565b925080851660e085015250509998505050505050505050565b600181815b8085111562002d0557815f190482111562002ce95762002ce962002b8a565b8085161562002cf757918102915b93841c939080029062002cca565b509250929050565b5f8262002d1d5750600162000557565b8162002d2b57505f62000557565b816001811462002d44576002811462002d4f5762002d6f565b600191505062000557565b60ff84111562002d635762002d6362002b8a565b50506001821b62000557565b5060208310610133831016604e8410600b841016171562002d94575081810a62000557565b62002da0838362002cc5565b805f190482111562002db65762002db662002b8a565b029392505050565b5f62002560838362002d0d565b634e487b7160e01b5f52600160045260245ffd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f808585111562002e39575f80fd5b8386111562002e46575f80fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101562002e7c5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562002e9b575f80fd5b873562002ea8816200231a565b9650602088013562002eba816200231a565b955060408801359450606088013593506080880135620025de8162002567565b5f805f805f805f80610100898b03121562002ef3575f80fd5b883562002f00816200231a565b9750602089013562002f12816200231a565b96506040890135955060608901359450608089013562002f328162002380565b935060a089013562002f448162002567565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562002f72575f80fd5b8151620025608162002567565b5f6020828403121562002f90575f80fd5b8151620025608162002380565b5f6020828403121562002fae575f80fd5b81516001600160401b0381111562002fc4575f80fd5b8201601f8101841362002fd5575f80fd5b805162002fe6620029928262002948565b81815285602083850101111562002ffb575f80fd5b6200300e826020830160208601620028d4565b95945050505050565b602081525f62002560602083018462002a3956fe61010060405234801562000011575f80fd5b506040516200150a3803806200150a833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161106c6200049e5f395f61019e01525f818161025f0152818161047f01526104ed01525f61043101525f81816102c401526103fb015261106c5ff3fe608060405234801561000f575f80fd5b5060043610610105575f3560e01c806306fdde0314610109578063095ea7b31461012757806318160ddd1461014a57806320606b701461015c57806323b872dd1461017057806330adf81f14610183578063313ce567146101975780633644e515146101c857806339509351146101d057806340c10f19146101e357806370a08231146101f85780637ecebe001461022057806395d89b411461023f5780639dc29fac14610247578063a3c573eb1461025a578063a457c2d714610299578063a9059cbb146102ac578063cd0d0096146102bf578063d505accf146102e6578063dd62ed3e146102f9578063ffa1ad741461030c575b5f80fd5b61011161032c565b60405161011e9190610d8a565b60405180910390f35b61013a610135366004610df0565b6103bc565b604051901515815260200161011e565b6002545b60405190815260200161011e565b61014e5f8051602061101783398151915281565b61013a61017e366004610e18565b6103d5565b61014e5f80516020610ff783398151915281565b60405160ff7f000000000000000000000000000000000000000000000000000000000000000016815260200161011e565b61014e6103f8565b61013a6101de366004610df0565b610453565b6101f66101f1366004610df0565b610474565b005b61014e610206366004610e51565b6001600160a01b03165f9081526020819052604090205490565b61014e61022e366004610e51565b60056020525f908152604090205481565b6101116104d3565b6101f6610255366004610df0565b6104e2565b6102817f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161011e565b61013a6102a7366004610df0565b610534565b61013a6102ba366004610df0565b6105ae565b61014e7f000000000000000000000000000000000000000000000000000000000000000081565b6101f66102f4366004610e71565b6105bb565b61014e610307366004610ede565b6107de565b610111604051806040016040528060018152602001603160f81b81525081565b60606003805461033b90610f0f565b80601f016020809104026020016040519081016040528092919081815260200182805461036790610f0f565b80156103b25780601f10610389576101008083540402835291602001916103b2565b820191905f5260205f20905b81548152906001019060200180831161039557829003601f168201915b5050505050905090565b5f336103c9818585610808565b60019150505b92915050565b5f336103e285828561092c565b6103ed8585856109a4565b506001949350505050565b5f7f0000000000000000000000000000000000000000000000000000000000000000461461042e5761042946610b33565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b5f336103c981858561046583836107de565b61046f9190610f5b565b610808565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104c55760405162461bcd60e51b81526004016104bc90610f6e565b60405180910390fd5b6104cf8282610bcb565b5050565b60606004805461033b90610f0f565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461052a5760405162461bcd60e51b81526004016104bc90610f6e565b6104cf8282610c75565b5f338161054182866107de565b9050838110156105a15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104bc565b6103ed8286868403610808565b5f336103c98185856109a4565b834211156106175760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104bc565b6001600160a01b0387165f90815260056020526040812080545f80516020610ff7833981519152918a918a918a91908661065083610fbe565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6106ad6103f8565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f1981840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610735573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381161580159061076b5750896001600160a01b0316816001600160a01b0316145b6107c75760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104bc565b6107d28a8a8a610808565b50505050505050505050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661086a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104bc565b6001600160a01b0382166108cb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104bc565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b5f61093784846107de565b90505f19811461099e57818110156109915760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104bc565b61099e8484848403610808565b50505050565b6001600160a01b038316610a085760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104bc565b6001600160a01b038216610a6a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104bc565b6001600160a01b0383165f9081526020819052604090205481811015610ae15760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104bc565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290925f80516020610fd7833981519152910160405180910390a361099e565b5f5f80516020611017833981519152610b4a61032c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c215760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104bc565b8060025f828254610c329190610f5b565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481525f80516020610fd7833981519152910160405180910390a35050565b6001600160a01b038216610cd55760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104bc565b6001600160a01b0382165f9081526020819052604090205481811015610d485760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104bc565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192915f80516020610fd7833981519152910161091f565b5f6020808352835180828501525f5b81811015610db557858101830151858201604001528201610d99565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610deb575f80fd5b919050565b5f8060408385031215610e01575f80fd5b610e0a83610dd5565b946020939093013593505050565b5f805f60608486031215610e2a575f80fd5b610e3384610dd5565b9250610e4160208501610dd5565b9150604084013590509250925092565b5f60208284031215610e61575f80fd5b610e6a82610dd5565b9392505050565b5f805f805f805f60e0888a031215610e87575f80fd5b610e9088610dd5565b9650610e9e60208901610dd5565b95506040880135945060608801359350608088013560ff81168114610ec1575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215610eef575f80fd5b610ef883610dd5565b9150610f0660208401610dd5565b90509250929050565b600181811c90821680610f2357607f821691505b602082108103610f4157634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156103cf576103cf610f47565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b5f60018201610fcf57610fcf610f47565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa26469706673582212206c12be332dd873b7cf88c58dfc4762858b63e8ff3bf8563b47828a5a4272643b64736f6c63430008140033501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe27545983a2646970667358221220c9b1840436353a036fc77dd82a0a8f92815c9f865ef8221a65aee798b479fe5464736f6c63430008140033", + "deployedBytecode": "0x60806040526004361062000127575f3560e01c806315064c96146200012b5780632072f6c5146200015b57806322e95f2c1462000174578063240ff37814620001a75780632cffd02e14620001be5780632d2c9d9414620001e25780632dfdf0b51462000206578063318aee3d146200022c57806334ac9cf214620002985780633ae0504714620002b95780633e19704314620002d0578063647c576c14620002f457806379e2cf97146200031857806381b1c174146200032f5780639e34070f1462000367578063aaa13cc214620003aa578063bab161bf14620003ce578063be5831c71462000407578063cd586579146200042c578063d02103ca1462000443578063dbc16976146200046b578063ee25560b1462000482578063fb57083414620004b1575b5f80fd5b34801562000137575f80fd5b50606854620001469060ff1681565b60405190151581526020015b60405180910390f35b34801562000167575f80fd5b5062000172620004d5565b005b34801562000180575f80fd5b50620001986200019236600462002332565b6200050d565b6040516200015291906200236c565b62000172620001b8366004620023d5565b6200055d565b348015620001ca575f80fd5b5062000172620001dc36600462002465565b62000672565b348015620001ee575f80fd5b50620001726200020036600462002465565b62000a45565b34801562000212575f80fd5b506200021d60535481565b60405190815260200162000152565b34801562000238575f80fd5b50620002736200024a36600462002542565b606b6020525f908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b0390911660208301520162000152565b348015620002a4575f80fd5b50606c5462000198906001600160a01b031681565b348015620002c5575f80fd5b506200021d62000b7e565b348015620002dc575f80fd5b506200021d620002ee36600462002576565b62000c65565b34801562000300575f80fd5b506200017262000312366004620025fb565b62000cf1565b34801562000324575f80fd5b506200017262000e6f565b3480156200033b575f80fd5b50620001986200034d36600462002648565b606a6020525f90815260409020546001600160a01b031681565b34801562000373575f80fd5b50620001466200038536600462002648565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b348015620003b6575f80fd5b5062000198620003c836600462002660565b62000e93565b348015620003da575f80fd5b50606854620003f190610100900463ffffffff1681565b60405163ffffffff909116815260200162000152565b34801562000413575f80fd5b50606854620003f190600160c81b900463ffffffff1681565b620001726200043d3660046200270c565b62000fa8565b3480156200044f575f80fd5b506068546200019890600160281b90046001600160a01b031681565b34801562000477575f80fd5b50620001726200132c565b3480156200048e575f80fd5b506200021d620004a036600462002648565b60696020525f908152604090205481565b348015620004bd575f80fd5b5062000146620004cf366004620027a7565b62001362565b606c546001600160a01b03163314620005015760405163e2e8106b60e01b815260040160405180910390fd5b6200050b6200143a565b565b5f606a5f848460405160200162000526929190620027f1565b60408051601f198184030181529181528151602092830120835290820192909252015f20546001600160a01b031690505b92915050565b60685460ff16156200058257604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161480620005a85750600263ffffffff861610155b15620005c7576040516302caf51760e11b815260040160405180910390fd5b5f80516020620045368339815191526001606860019054906101000a900463ffffffff163388883488886053546040516200060b9998979695949392919062002843565b60405180910390a16200065a620006546001606860019054906101000a900463ffffffff1633898934898960405162000646929190620028b1565b604051809103902062000c65565b62001496565b82156200066b576200066b62001591565b5050505050565b60685460ff16156200069757604051630bc011ff60e21b815260040160405180910390fd5b620006ad8b8b8b8b8b8b8b8b8b8b8b5f62001624565b6001600160a01b0386166200075257604080515f808252602082019092526001600160a01b038616908590604051620006e79190620028f8565b5f6040518083038185875af1925050503d805f811462000723576040519150601f19603f3d011682016040523d82523d5f602084013e62000728565b606091505b50509050806200074b57604051630ce8f45160e31b815260040160405180910390fd5b5062000a09565b60685463ffffffff6101009091048116908816036200078757620007816001600160a01b038716858562001787565b62000a09565b5f87876040516020016200079d929190620027f1565b60408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b031680620009a6575f8080620007e486880188620029c9565b9250925092505f85848484604051620007fd90620022f8565b6200080b9392919062002a66565b8190604051809103905ff590508015801562000829573d5f803e3d5ffd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f19906200085d908d908d9060040162002aa2565b5f604051808303815f87803b15801562000875575f80fd5b505af115801562000888573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b6040516200099495949392919062002abb565b60405180910390a15050505062000a06565b6040516340c10f1960e01b81526001600160a01b038216906340c10f1990620009d6908990899060040162002aa2565b5f604051808303815f87803b158015620009ee575f80fd5b505af115801562000a01573d5f803e3d5ffd5b505050505b50505b5f80516020620045568339815191528a8888878760405162000a3095949392919062002af5565b60405180910390a15050505050505050505050565b60685460ff161562000a6a57604051630bc011ff60e21b815260040160405180910390fd5b62000a818b8b8b8b8b8b8b8b8b8b8b600162001624565b5f846001600160a01b031684888a868660405160240162000aa6949392919062002b2c565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162000add9190620028f8565b5f6040518083038185875af1925050503d805f811462000b19576040519150601f19603f3d011682016040523d82523d5f602084013e62000b1e565b606091505b505090508062000b41576040516337e391c360e01b815260040160405180910390fd5b5f80516020620045568339815191528b8989888860405162000b6895949392919062002af5565b60405180910390a1505050505050505050505050565b6053545f90819081805b602081101562000c5c578083901c60011660010362000beb576033816020811062000bb75762000bb762002b68565b01548460405160200162000bcd92919062002b7c565b60405160208183030381529060405280519060200120935062000c19565b838260405160200162000c0092919062002b7c565b6040516020818303038152906040528051906020012093505b818260405160200162000c2e92919062002b7c565b604051602081830303815290604052805190602001209150808062000c539062002b9e565b91505062000b88565b50919392505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b5f54610100900460ff161580801562000d1057505f54600160ff909116105b8062000d34575062000d2230620017e1565b15801562000d3457505f5460ff166001145b62000d9d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801562000dbf575f805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff871602600160281b600160c81b03191617600160281b6001600160a01b038681169190910291909117909155606c80546001600160a01b03191691841691909117905562000e23620017f0565b801562000e69575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854600160c81b900463ffffffff1610156200050b576200050b62001591565b5f80888860405160200162000eaa929190620027f1565b6040516020818303038152906040528051906020012090505f60ff60f81b30836040518060200162000edc90620022f8565b601f1982820381018352601f90910116604081905262000f09908d908d908d908d908d9060200162002bb9565b60408051601f198184030181529082905262000f29929160200162002bf9565b6040516020818303038152906040528051906020012060405160200162000f8294939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b60685460ff161562000fcd57604051630bc011ff60e21b815260040160405180910390fd5b62000fd762001823565b60685463ffffffff88811661010090920416148062000ffd5750600263ffffffff881610155b156200101c576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b0388166200105a57883414620010515760405163b89240f560e01b815260040160405180910390fd5b5f9250620012b1565b34156200107a5760405163798ee6f160e01b815260040160405180910390fd5b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b900490921691810182905290156200113157604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac90620010ef9033908e9060040162002aa2565b5f604051808303815f87803b15801562001107575f80fd5b505af11580156200111a573d5f803e3d5ffd5b5050505080602001519450805f01519350620012af565b8515620011465762001146898b89896200187e565b6040516370a0823160e01b81525f906001600160a01b038b16906370a0823190620011769030906004016200236c565b602060405180830381865afa15801562001192573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620011b8919062002c2b565b9050620011d16001600160a01b038b1633308e62001bd5565b6040516370a0823160e01b81525f906001600160a01b038c16906370a0823190620012019030906004016200236c565b602060405180830381865afa1580156200121d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001243919062002c2b565b905062001251828262002c43565b6068548c9850610100900463ffffffff1696509350620012718762001c0f565b6200127c8c62001cd2565b620012878d62001d8c565b6040516020016200129b9392919062002a66565b604051602081830303815290604052945050505b505b5f80516020620045368339815191525f84868e8e8688605354604051620012e098979695949392919062002c59565b60405180910390a162001304620006545f85878f8f87898051906020012062000c65565b861562001315576200131562001591565b505050506200132360018055565b50505050505050565b606c546001600160a01b03163314620013585760405163e2e8106b60e01b815260040160405180910390fd5b6200050b62001e4f565b5f84815b60208110156200142c57600163ffffffff8616821c81169003620013d05785816020811062001399576200139962002b68565b602002013582604051602001620013b292919062002b7c565b60405160208183030381529060405280519060200120915062001417565b81868260208110620013e657620013e662002b68565b6020020135604051602001620013fe92919062002b7c565b6040516020818303038152906040528051906020012091505b80620014238162002b9e565b91505062001366565b50821490505b949350505050565b60685460ff16156200145f57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b806001620014a76020600262002dbe565b620014b3919062002c43565b60535410620014d5576040516377ae67b360e11b815260040160405180910390fd5b5f60535f8154620014e69062002b9e565b918290555090505f5b602081101562001581578082901c600116600103620015275782603382602081106200151f576200151f62002b68565b015550505050565b603381602081106200153d576200153d62002b68565b0154836040516020016200155392919062002b7c565b6040516020818303038152906040528051906020012092508080620015789062002b9e565b915050620014ef565b506200158c62002dcb565b505050565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d620015da62000b7e565b6040518263ffffffff1660e01b8152600401620015f991815260200190565b5f604051808303815f87803b15801562001611575f80fd5b505af115801562000e69573d5f803e3d5ffd5b620016358b63ffffffff1662001ea7565b6068545f90600160281b90046001600160a01b031663257b36326200165b8d8d62001ef2565b6040518263ffffffff1660e01b81526004016200167a91815260200190565b6020604051808303815f875af115801562001697573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620016bd919062002c2b565b9050805f03620016df57604051622f6fad60e01b815260040160405180910390fd5b60685463ffffffff888116610100909204161462001710576040516302caf51760e11b815260040160405180910390fd5b6068545f90610100900463ffffffff166200172d57508962001730565b508a5b6200175962001750848c8c8c8c8c8c8c60405162000646929190620028b1565b8f8f8462001362565b62001777576040516338105f3b60e21b815260040160405180910390fd5b5050505050505050505050505050565b6200158c8363a9059cbb60e01b8484604051602401620017a992919062002aa2565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262001f26565b6001600160a01b03163b151590565b5f54610100900460ff16620018195760405162461bcd60e51b815260040162000d949062002ddf565b6200050b62001ffe565b600260015403620018775760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000d94565b6002600155565b5f6200188e600482848662002e2a565b620018999162002e53565b9050632afa533160e01b6001600160e01b031982160162001a35575f808080808080620018ca896004818d62002e2a565b810190620018d9919062002e84565b9650965096509650965096509650336001600160a01b0316876001600160a01b0316146200191a5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0386163014620019445760405163750643af60e01b815260040160405180910390fd5b8a851462001965576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e1691620019e59190620028f8565b5f604051808303815f865af19150503d805f811462001a20576040519150601f19603f3d011682016040523d82523d5f602084013e62001a25565b606091505b505050505050505050506200066b565b6001600160e01b031981166323f2ebc360e21b1462001a6757604051637141605d60e11b815260040160405180910390fd5b5f8080808080808062001a7e8a6004818e62002e2a565b81019062001a8d919062002eda565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462001ad05760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038716301462001afa5760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169162001b839190620028f8565b5f604051808303815f865af19150503d805f811462001bbe576040519150601f19603f3d011682016040523d82523d5f602084013e62001bc3565b606091505b50505050505050505050505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905262000e699085906323b872dd60e01b90608401620017a9565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b17905290516060915f9182916001600160a01b0386169162001c579190620028f8565b5f60405180830381855afa9150503d805f811462001c91576040519150601f19603f3d011682016040523d82523d5f602084013e62001c96565b606091505b50915091508162001cc757604051806040016040528060078152602001664e4f5f4e414d4560c81b81525062001432565b620014328162002027565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b17905290516060915f9182916001600160a01b0386169162001d1a9190620028f8565b5f60405180830381855afa9150503d805f811462001d54576040519150601f19603f3d011682016040523d82523d5f602084013e62001d59565b606091505b50915091508162001cc757604051806040016040528060098152602001681393d7d4d6535093d360ba1b81525062001432565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f91829182916001600160a01b0386169162001dd39190620028f8565b5f60405180830381855afa9150503d805f811462001e0d576040519150601f19603f3d011682016040523d82523d5f602084013e62001e12565b606091505b509150915081801562001e26575080516020145b62001e3357601262001432565b8080602001905181019062001432919062002f61565b60018055565b60685460ff1662001e7357604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b918218928390559290919081831690036200066b57604051630c8d9eab60e31b815260040160405180910390fd5b5f828260405160200162001f0892919062002b7c565b60405160208183030381529060405280519060200120905092915050565b5f62001f7c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620021cb9092919063ffffffff16565b8051909150156200158c578080602001905181019062001f9d919062002f7f565b6200158c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000d94565b5f54610100900460ff1662001e495760405162461bcd60e51b815260040162000d949062002ddf565b6060604082511062002049578180602001905181019062000557919062002f9d565b815160200362002198575f5b60208110801562002088575082818151811062002076576200207662002b68565b01602001516001600160f81b03191615155b15620020a357806200209a8162002b9e565b91505062002055565b805f03620020db5750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b5f816001600160401b03811115620020f757620020f7620028c0565b6040519080825280601f01601f19166020018201604052801562002122576020820181803683370190505b5090505f5b82811015620021905784818151811062002145576200214562002b68565b602001015160f81c60f81b82828151811062002165576200216562002b68565b60200101906001600160f81b03191690815f1a90535080620021878162002b9e565b91505062002127565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b60606200143284845f85855f80866001600160a01b03168587604051620021f39190620028f8565b5f6040518083038185875af1925050503d805f81146200222f576040519150601f19603f3d011682016040523d82523d5f602084013e62002234565b606091505b5091509150620022478783838762002252565b979650505050505050565b60608315620022c55782515f03620022bd576200226f85620017e1565b620022bd5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000d94565b508162001432565b620014328383815115620022dc5781518083602001fd5b8060405162461bcd60e51b815260040162000d94919062003017565b61150a806200302c83390190565b803563ffffffff81168114620021c6575f80fd5b6001600160a01b03811681146200232f575f80fd5b50565b5f806040838503121562002344575f80fd5b6200234f8362002306565b9150602083013562002361816200231a565b809150509250929050565b6001600160a01b0391909116815260200190565b80151581146200232f575f80fd5b5f8083601f8401126200239f575f80fd5b5081356001600160401b03811115620023b6575f80fd5b602083019150836020828501011115620023ce575f80fd5b9250929050565b5f805f805f60808688031215620023ea575f80fd5b620023f58662002306565b9450602086013562002407816200231a565b93506040860135620024198162002380565b925060608601356001600160401b0381111562002434575f80fd5b62002442888289016200238e565b969995985093965092949392505050565b80610400810183101562000557575f80fd5b5f805f805f805f805f805f6105208c8e03121562002481575f80fd5b6200248d8d8d62002453565b9a506200249e6104008d0162002306565b99506104208c013598506104408c01359750620024bf6104608d0162002306565b96506104808c0135620024d2816200231a565b9550620024e36104a08d0162002306565b94506104c08c0135620024f6816200231a565b93506104e08c013592506105008c01356001600160401b038111156200251a575f80fd5b620025288e828f016200238e565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562002553575f80fd5b813562002560816200231a565b9392505050565b60ff811681146200232f575f80fd5b5f805f805f805f60e0888a0312156200258d575f80fd5b87356200259a8162002567565b9650620025aa6020890162002306565b95506040880135620025bc816200231a565b9450620025cc6060890162002306565b93506080880135620025de816200231a565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156200260e575f80fd5b620026198462002306565b925060208401356200262b816200231a565b915060408401356200263d816200231a565b809150509250925092565b5f6020828403121562002659575f80fd5b5035919050565b5f805f805f805f60a0888a03121562002677575f80fd5b620026828862002306565b9650602088013562002694816200231a565b955060408801356001600160401b0380821115620026b0575f80fd5b620026be8b838c016200238e565b909750955060608a0135915080821115620026d7575f80fd5b50620026e68a828b016200238e565b9094509250506080880135620026fc8162002567565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562002723575f80fd5b6200272e8862002306565b9650602088013562002740816200231a565b955060408801359450606088013562002759816200231a565b935060808801356200276b8162002380565b925060a08801356001600160401b0381111562002786575f80fd5b620027948a828b016200238e565b989b979a50959850939692959293505050565b5f805f806104608587031215620027bc575f80fd5b84359350620027cf866020870162002453565b9250620027e0610420860162002306565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c083018190525f916200289784830187896200281b565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015620028f0578181015183820152602001620028d6565b50505f910152565b5f82516200290b818460208701620028d4565b9190910192915050565b604051601f8201601f191681016001600160401b0381118282101715620029405762002940620028c0565b604052919050565b5f6001600160401b03821115620029635762002963620028c0565b50601f01601f191660200190565b5f82601f83011262002981575f80fd5b813562002998620029928262002948565b62002915565b818152846020838601011115620029ad575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f60608486031215620029dc575f80fd5b83356001600160401b0380821115620029f3575f80fd5b62002a018783880162002971565b9450602086013591508082111562002a17575f80fd5b5062002a268682870162002971565b92505060408401356200263d8162002567565b5f815180845262002a52816020860160208601620028d4565b601f01601f19169290920160200192915050565b606081525f62002a7a606083018662002a39565b828103602084015262002a8e818662002a39565b91505060ff83166040830152949350505050565b6001600160a01b03929092168252602082015260400190565b63ffffffff861681526001600160a01b038581166020830152841660408201526080606082018190525f906200224790830184866200281b565b63ffffffff95861681529390941660208401526001600160a01b039182166040840152166060820152608081019190915260a00190565b6001600160a01b038516815263ffffffff841660208201526060604082018190525f9062002b5e90830184866200281b565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b918252602082015260400190565b634e487b7160e01b5f52601160045260245ffd5b5f6001820162002bb25762002bb262002b8a565b5060010190565b606081525f62002bce6060830187896200281b565b828103602084015262002be38186886200281b565b91505060ff831660408301529695505050505050565b5f835162002c0c818460208801620028d4565b83519083019062002c22818360208801620028d4565b01949350505050565b5f6020828403121562002c3c575f80fd5b5051919050565b8181038181111562000557576200055762002b8a565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c083018190525f9162002cac8483018762002a39565b925080851660e085015250509998505050505050505050565b600181815b8085111562002d0557815f190482111562002ce95762002ce962002b8a565b8085161562002cf757918102915b93841c939080029062002cca565b509250929050565b5f8262002d1d5750600162000557565b8162002d2b57505f62000557565b816001811462002d44576002811462002d4f5762002d6f565b600191505062000557565b60ff84111562002d635762002d6362002b8a565b50506001821b62000557565b5060208310610133831016604e8410600b841016171562002d94575081810a62000557565b62002da0838362002cc5565b805f190482111562002db65762002db662002b8a565b029392505050565b5f62002560838362002d0d565b634e487b7160e01b5f52600160045260245ffd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f808585111562002e39575f80fd5b8386111562002e46575f80fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101562002e7c5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562002e9b575f80fd5b873562002ea8816200231a565b9650602088013562002eba816200231a565b955060408801359450606088013593506080880135620025de8162002567565b5f805f805f805f80610100898b03121562002ef3575f80fd5b883562002f00816200231a565b9750602089013562002f12816200231a565b96506040890135955060608901359450608089013562002f328162002380565b935060a089013562002f448162002567565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562002f72575f80fd5b8151620025608162002567565b5f6020828403121562002f90575f80fd5b8151620025608162002380565b5f6020828403121562002fae575f80fd5b81516001600160401b0381111562002fc4575f80fd5b8201601f8101841362002fd5575f80fd5b805162002fe6620029928262002948565b81815285602083850101111562002ffb575f80fd5b6200300e826020830160208601620028d4565b95945050505050565b602081525f62002560602083018462002a3956fe61010060405234801562000011575f80fd5b506040516200150a3803806200150a833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161106c6200049e5f395f61019e01525f818161025f0152818161047f01526104ed01525f61043101525f81816102c401526103fb015261106c5ff3fe608060405234801561000f575f80fd5b5060043610610105575f3560e01c806306fdde0314610109578063095ea7b31461012757806318160ddd1461014a57806320606b701461015c57806323b872dd1461017057806330adf81f14610183578063313ce567146101975780633644e515146101c857806339509351146101d057806340c10f19146101e357806370a08231146101f85780637ecebe001461022057806395d89b411461023f5780639dc29fac14610247578063a3c573eb1461025a578063a457c2d714610299578063a9059cbb146102ac578063cd0d0096146102bf578063d505accf146102e6578063dd62ed3e146102f9578063ffa1ad741461030c575b5f80fd5b61011161032c565b60405161011e9190610d8a565b60405180910390f35b61013a610135366004610df0565b6103bc565b604051901515815260200161011e565b6002545b60405190815260200161011e565b61014e5f8051602061101783398151915281565b61013a61017e366004610e18565b6103d5565b61014e5f80516020610ff783398151915281565b60405160ff7f000000000000000000000000000000000000000000000000000000000000000016815260200161011e565b61014e6103f8565b61013a6101de366004610df0565b610453565b6101f66101f1366004610df0565b610474565b005b61014e610206366004610e51565b6001600160a01b03165f9081526020819052604090205490565b61014e61022e366004610e51565b60056020525f908152604090205481565b6101116104d3565b6101f6610255366004610df0565b6104e2565b6102817f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161011e565b61013a6102a7366004610df0565b610534565b61013a6102ba366004610df0565b6105ae565b61014e7f000000000000000000000000000000000000000000000000000000000000000081565b6101f66102f4366004610e71565b6105bb565b61014e610307366004610ede565b6107de565b610111604051806040016040528060018152602001603160f81b81525081565b60606003805461033b90610f0f565b80601f016020809104026020016040519081016040528092919081815260200182805461036790610f0f565b80156103b25780601f10610389576101008083540402835291602001916103b2565b820191905f5260205f20905b81548152906001019060200180831161039557829003601f168201915b5050505050905090565b5f336103c9818585610808565b60019150505b92915050565b5f336103e285828561092c565b6103ed8585856109a4565b506001949350505050565b5f7f0000000000000000000000000000000000000000000000000000000000000000461461042e5761042946610b33565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b5f336103c981858561046583836107de565b61046f9190610f5b565b610808565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104c55760405162461bcd60e51b81526004016104bc90610f6e565b60405180910390fd5b6104cf8282610bcb565b5050565b60606004805461033b90610f0f565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461052a5760405162461bcd60e51b81526004016104bc90610f6e565b6104cf8282610c75565b5f338161054182866107de565b9050838110156105a15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104bc565b6103ed8286868403610808565b5f336103c98185856109a4565b834211156106175760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104bc565b6001600160a01b0387165f90815260056020526040812080545f80516020610ff7833981519152918a918a918a91908661065083610fbe565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6106ad6103f8565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f1981840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610735573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381161580159061076b5750896001600160a01b0316816001600160a01b0316145b6107c75760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104bc565b6107d28a8a8a610808565b50505050505050505050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661086a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104bc565b6001600160a01b0382166108cb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104bc565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b5f61093784846107de565b90505f19811461099e57818110156109915760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104bc565b61099e8484848403610808565b50505050565b6001600160a01b038316610a085760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104bc565b6001600160a01b038216610a6a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104bc565b6001600160a01b0383165f9081526020819052604090205481811015610ae15760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104bc565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290925f80516020610fd7833981519152910160405180910390a361099e565b5f5f80516020611017833981519152610b4a61032c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c215760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104bc565b8060025f828254610c329190610f5b565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481525f80516020610fd7833981519152910160405180910390a35050565b6001600160a01b038216610cd55760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104bc565b6001600160a01b0382165f9081526020819052604090205481811015610d485760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104bc565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192915f80516020610fd7833981519152910161091f565b5f6020808352835180828501525f5b81811015610db557858101830151858201604001528201610d99565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610deb575f80fd5b919050565b5f8060408385031215610e01575f80fd5b610e0a83610dd5565b946020939093013593505050565b5f805f60608486031215610e2a575f80fd5b610e3384610dd5565b9250610e4160208501610dd5565b9150604084013590509250925092565b5f60208284031215610e61575f80fd5b610e6a82610dd5565b9392505050565b5f805f805f805f60e0888a031215610e87575f80fd5b610e9088610dd5565b9650610e9e60208901610dd5565b95506040880135945060608801359350608088013560ff81168114610ec1575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215610eef575f80fd5b610ef883610dd5565b9150610f0660208401610dd5565b90509250929050565b600181811c90821680610f2357607f821691505b602082108103610f4157634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156103cf576103cf610f47565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b5f60018201610fcf57610fcf610f47565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa26469706673582212206c12be332dd873b7cf88c58dfc4762858b63e8ff3bf8563b47828a5a4272643b64736f6c63430008140033501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe27545983a2646970667358221220c9b1840436353a036fc77dd82a0a8f92815c9f865ef8221a65aee798b479fe5464736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMBridgeMock.json b/compiled-contracts/paris/PolygonZkEVMBridgeMock.json index 8bcc271f0..30c8d7fd9 100644 --- a/compiled-contracts/paris/PolygonZkEVMBridgeMock.json +++ b/compiled-contracts/paris/PolygonZkEVMBridgeMock.json @@ -867,8 +867,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b506160a1806100206000396000f3fe608060405260043610620001e75760003560e01c8063715018a6116200010b578063bab161bf11620000a1578063dbc16976116200006c578063dbc169761462000728578063ee25560b1462000740578063f2fde38b1462000771578063fb570834146200079657600080fd5b8063bab161bf1462000663578063be5831c7146200069d578063cd58657914620006d9578063d02103ca14620006f057600080fd5b80638da5cb5b11620000e25780638da5cb5b14620005b457806391e57e2d14620005e15780639e34070f14620005f9578063aaa13cc2146200063e57600080fd5b8063715018a6146200053d57806379e2cf97146200055557806381b1c174146200056d57600080fd5b80632d2c9d94116200018157806334ac9cf2116200015857806334ac9cf214620003dd5780633ae05047146200040c5780633e1970431462000424578063647c576c146200051857600080fd5b80632d2c9d9414620003085780632dfdf0b5146200032d578063318aee3d146200035457600080fd5b8063240ff37811620001c2578063240ff37814620002825780632b5e42e714620002995780632c3f58cd14620002be5780632cffd02e14620002e357600080fd5b806315064c9614620001ec5780632072f6c5146200021d57806322e95f2c1462000237575b600080fd5b348015620001f957600080fd5b50606854620002089060ff1681565b60405190151581526020015b60405180910390f35b3480156200022a57600080fd5b5062000235620007bb565b005b3480156200024457600080fd5b506200025c62000256366004620036db565b62000819565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200162000214565b620002356200029336600462003772565b620008bc565b348015620002a657600080fd5b5062000235620002b8366004620037f6565b62000ae4565b348015620002cb57600080fd5b5062000235620002dd36600462003810565b62000af3565b348015620002f057600080fd5b50620002356200030236600462003848565b62000b39565b3480156200031557600080fd5b50620002356200032736600462003848565b620010dd565b3480156200033a57600080fd5b506200034560535481565b60405190815260200162000214565b3480156200036157600080fd5b50620003ab620003733660046200392e565b606b6020526000908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff90911660208301520162000214565b348015620003ea57600080fd5b50606c546200025c9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156200041957600080fd5b5062000345620012e1565b3480156200043157600080fd5b5062000345620004433660046200395e565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200052557600080fd5b506200023562000537366004620039e8565b620013c7565b3480156200054a57600080fd5b506200023562001622565b3480156200056257600080fd5b506200023562001638565b3480156200057a57600080fd5b506200025c6200058c366004620037f6565b606a6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005c157600080fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff166200025c565b348015620005ee57600080fd5b506200034560d15481565b3480156200060657600080fd5b506200020862000618366004620037f6565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b3480156200064b57600080fd5b506200025c6200065d36600462003a38565b62001672565b3480156200067057600080fd5b506068546200068790610100900463ffffffff1681565b60405163ffffffff909116815260200162000214565b348015620006aa57600080fd5b506068546200068790790100000000000000000000000000000000000000000000000000900463ffffffff1681565b62000235620006ea36600462003aec565b6200185e565b348015620006fd57600080fd5b506068546200025c9065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200073557600080fd5b506200023562001932565b3480156200074d57600080fd5b50620003456200075f366004620037f6565b60696020526000908152604090205481565b3480156200077e57600080fd5b5062000235620007903660046200392e565b6200198e565b348015620007a357600080fd5b5062000208620007b536600462003b8e565b62001a4b565b606c5473ffffffffffffffffffffffffffffffffffffffff1633146200080d576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200081762001b34565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091206000908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620008fa576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620009205750600263ffffffff861610155b1562000958576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009ae9998979695949392919062003c24565b60405180910390a162000acc62000ac66001606860019054906101000a900463ffffffff16338989348989604051620009e992919062003c9f565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b62001bc8565b821562000add5762000add62001cdf565b5050505050565b62000aee62001db4565b60d155565b62000afd62001db4565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b77576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b8e8b8b8b8b8b8b8b8b8b8b8b600062001e37565b73ffffffffffffffffffffffffffffffffffffffff861662000c6a576040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000be3919062003d04565b60006040518083038185875af1925050503d806000811462000c22576040519150601f19603f3d011682016040523d82523d6000602084013e62000c27565b606091505b505090508062000c63576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062001065565b60685463ffffffff61010090910481169088160362000cac5762000ca673ffffffffffffffffffffffffffffffffffffffff8716858562002028565b62001065565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b166024820152600090603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000fd7576000808062000d818688018862003e19565b92509250925060008584848460405162000d9b9062003695565b62000da99392919062003edb565b8190604051809103906000f590508015801562000dca573d6000803e3d6000fd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f1990604401600060405180830381600087803b15801562000e4057600080fd5b505af115801562000e55573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000fc595949392919062003f18565b60405180910390a15050505062001062565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f1990604401600060405180830381600087803b1580156200104857600080fd5b505af11580156200105d573d6000803e3d6000fd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff16156200111b576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620011328b8b8b8b8b8b8b8b8b8b8b600162001e37565b60008473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162001165949392919062003f60565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f20000000000000000000000000000000000000000000000000000000017905251620011e8919062003d04565b60006040518083038185875af1925050503d806000811462001227576040519150601f19603f3d011682016040523d82523d6000602084013e6200122c565b606091505b505090508062001268576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b605354600090819081805b6020811015620013be578083901c6001166001036200134f57603381602081106200131b576200131b62003fa8565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200137c565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013b59062004006565b915050620012ec565b50919392505050565b600054610100900460ff1615808015620013e85750600054600160ff909116105b80620014045750303b15801562001404575060005460ff166001145b62001496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014f557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d155620015b8620020fe565b80156200161c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6200162c62001db4565b6200081760006200219d565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000817576200081762001cdf565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201526000908190603801604051602081830303815290604052805190602001209050600060ff60f81b308360405180602001620017089062003695565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905262001753908d908d908d908d908d9060200162004041565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001791929160200162004082565b604051602081830303815290604052805190602001206040516020016200181a94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d15434111562001918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200148d565b620019298787878787878762002214565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001984576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620008176200276f565b6200199862001db4565b73ffffffffffffffffffffffffffffffffffffffff811662001a3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200148d565b62001a48816200219d565b50565b600084815b602081101562001b2657600163ffffffff8616821c8116900362001ac25785816020811062001a835762001a8362003fa8565b60200201358260405160200162001aa4929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001b11565b8186826020811062001ad85762001ad862003fa8565b602002013560405160200162001af8929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001b1d8162004006565b91505062001a50565b50821490505b949350505050565b60685460ff161562001b72576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b80600162001bd960206002620041ee565b62001be59190620041fc565b6053541062001c20576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060536000815462001c339062004006565b9182905550905060005b602081101562001ccf578082901c60011660010362001c7557826033826020811062001c6d5762001c6d62003fa8565b015550505050565b6033816020811062001c8b5762001c8b62003fa8565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001cc69062004006565b91505062001c3d565b5062001cda62004212565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001d65620012e1565b6040518263ffffffff1660e01b815260040162001d8491815260200190565b600060405180830381600087803b15801562001d9f57600080fd5b505af11580156200161c573d6000803e3d6000fd5b609f5473ffffffffffffffffffffffffffffffffffffffff16331462000817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200148d565b62001e488b63ffffffff16620027ff565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b363200000000000000000000000000000000000000000000000000000000909252606481019190915260009165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303816000875af115801562001eeb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001f11919062004241565b90508060000362001f4d576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462001f97576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606854600090610100900463ffffffff1662001fb557508962001fb8565b508a5b62001fe162001fd8848c8c8c8c8c8c8c604051620009e992919062003c9f565b8f8f8462001a4b565b62002018576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001cda9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002864565b600054610100900460ff1662002197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200148d565b62000817335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60685460ff161562002252576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200225c62002977565b60685463ffffffff888116610100909204161480620022825750600263ffffffff881610155b15620022ba576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060608773ffffffffffffffffffffffffffffffffffffffff8816620023205788341462002316576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600092506200261a565b341562002359576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089166000908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901562002449576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac90604401600060405180830381600087803b1580156200241c57600080fd5b505af115801562002431573d6000803e3d6000fd5b50505050806020015194508060000151935062002618565b85156200245e576200245e898b8989620029ec565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa158015620024cc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620024f2919062004241565b90506200251873ffffffffffffffffffffffffffffffffffffffff8b1633308e62002f0a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa15801562002586573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620025ac919062004241565b9050620025ba8282620041fc565b6068548c9850610100900463ffffffff1696509350620025da8762002f6a565b620025e58c62003082565b620025f08d6200318f565b604051602001620026049392919062003edb565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e86886053546040516200265c9897969594939291906200425b565b60405180910390a16200275062000ac6600085878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b861562002761576200276162001cdf565b505050506200192960018055565b60685460ff16620027ac576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600881901c60008181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000add576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000620028c8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200328b9092919063ffffffff16565b80519091501562001cda5780806020019051810190620028e99190620042d4565b62001cda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200148d565b600260015403620029e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200148d565b6002600155565b6000620029fd6004828486620042f4565b62002a089162004320565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002c8757600080808080808062002a6b896004818d620042f4565b81019062002a7a919062004369565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002aee576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002b3e576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002b78576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002c33919062003d04565b6000604051808303816000865af19150503d806000811462002c72576040519150601f19603f3d011682016040523d82523d6000602084013e62002c77565b606091505b5050505050505050505062000add565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002d03576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008080808080808062002d1b8a6004818e620042f4565b81019062002d2a9190620043c4565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002da0576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002df0576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002eb4919062003d04565b6000604051808303816000865af19150503d806000811462002ef3576040519150601f19603f3d011682016040523d82523d6000602084013e62002ef8565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526200161c9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016200207b565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162002fee919062003d04565b600060405180830381855afa9150503d80600081146200302b576040519150601f19603f3d011682016040523d82523d6000602084013e62003030565b606091505b50915091508162003077576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001b2c565b62001b2c816200329c565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162003106919062003d04565b600060405180830381855afa9150503d806000811462003143576040519150601f19603f3d011682016040523d82523d6000602084013e62003148565b606091505b50915091508162003077576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001b2c565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169162003212919062003d04565b600060405180830381855afa9150503d80600081146200324f576040519150601f19603f3d011682016040523d82523d6000602084013e62003254565b606091505b509150915081801562003268575080516020145b6200327557601262001b2c565b8080602001905181019062001b2c919062004450565b606062001b2c84846000856200348c565b60606040825110620032be5781806020019051810190620008b6919062004470565b81516020036200344e5760005b602081108015620033165750828181518110620032ec57620032ec62003fa8565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620033315780620033288162004006565b915050620032cb565b806000036200337557505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111562003393576200339362003caf565b6040519080825280601f01601f191660200182016040528015620033be576020820181803683370190505b50905060005b828110156200344657848181518110620033e257620033e262003fa8565b602001015160f81c60f81b82828151811062003402576200340262003fa8565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806200343d8162004006565b915050620033c4565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200148d565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516200354b919062003d04565b60006040518083038185875af1925050503d80600081146200358a576040519150601f19603f3d011682016040523d82523d6000602084013e6200358f565b606091505b5091509150620035a287838387620035ad565b979650505050505050565b6060831562003648578251600003620036405773ffffffffffffffffffffffffffffffffffffffff85163b62003640576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200148d565b508162001b2c565b62001b2c83838151156200365f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200148d9190620044f0565b611b66806200450683390190565b803563ffffffff811681146200348757600080fd5b73ffffffffffffffffffffffffffffffffffffffff8116811462001a4857600080fd5b60008060408385031215620036ef57600080fd5b620036fa83620036a3565b915060208301356200370c81620036b8565b809150509250929050565b801515811462001a4857600080fd5b60008083601f8401126200373957600080fd5b50813567ffffffffffffffff8111156200375257600080fd5b6020830191508360208285010111156200376b57600080fd5b9250929050565b6000806000806000608086880312156200378b57600080fd5b6200379686620036a3565b94506020860135620037a881620036b8565b93506040860135620037ba8162003717565b9250606086013567ffffffffffffffff811115620037d757600080fd5b620037e58882890162003726565b969995985093965092949392505050565b6000602082840312156200380957600080fd5b5035919050565b6000602082840312156200382357600080fd5b6200382e82620036a3565b9392505050565b806104008101831015620008b657600080fd5b60008060008060008060008060008060006105208c8e0312156200386b57600080fd5b620038778d8d62003835565b9a50620038886104008d01620036a3565b99506104208c013598506104408c01359750620038a96104608d01620036a3565b96506104808c0135620038bc81620036b8565b9550620038cd6104a08d01620036a3565b94506104c08c0135620038e081620036b8565b93506104e08c013592506105008c013567ffffffffffffffff8111156200390657600080fd5b620039148e828f0162003726565b915080935050809150509295989b509295989b9093969950565b6000602082840312156200394157600080fd5b81356200382e81620036b8565b60ff8116811462001a4857600080fd5b600080600080600080600060e0888a0312156200397a57600080fd5b873562003987816200394e565b96506200399760208901620036a3565b95506040880135620039a981620036b8565b9450620039b960608901620036a3565b93506080880135620039cb81620036b8565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215620039fe57600080fd5b62003a0984620036a3565b9250602084013562003a1b81620036b8565b9150604084013562003a2d81620036b8565b809150509250925092565b600080600080600080600060a0888a03121562003a5457600080fd5b62003a5f88620036a3565b9650602088013562003a7181620036b8565b9550604088013567ffffffffffffffff8082111562003a8f57600080fd5b62003a9d8b838c0162003726565b909750955060608a013591508082111562003ab757600080fd5b5062003ac68a828b0162003726565b909450925050608088013562003adc816200394e565b8091505092959891949750929550565b600080600080600080600060c0888a03121562003b0857600080fd5b62003b1388620036a3565b9650602088013562003b2581620036b8565b955060408801359450606088013562003b3e81620036b8565b9350608088013562003b508162003717565b925060a088013567ffffffffffffffff81111562003b6d57600080fd5b62003b7b8a828b0162003726565b989b979a50959850939692959293505050565b600080600080610460858703121562003ba657600080fd5b8435935062003bb9866020870162003835565b925062003bca6104208601620036a3565b939692955092936104400135925050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600061010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003c85828501878962003bdb565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b8381101562003cfb57818101518382015260200162003ce1565b50506000910152565b6000825162003d1881846020870162003cde565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003d6c5762003d6c62003caf565b604052919050565b600067ffffffffffffffff82111562003d915762003d9162003caf565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011262003dcf57600080fd5b813562003de662003de08262003d74565b62003d22565b81815284602083860101111562003dfc57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562003e2f57600080fd5b833567ffffffffffffffff8082111562003e4857600080fd5b62003e568783880162003dbd565b9450602086013591508082111562003e6d57600080fd5b5062003e7c8682870162003dbd565b925050604084013562003a2d816200394e565b6000815180845262003ea981602086016020860162003cde565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60608152600062003ef0606083018662003e8f565b828103602084015262003f04818662003e8f565b91505060ff83166040830152949350505050565b63ffffffff86168152600073ffffffffffffffffffffffffffffffffffffffff808716602084015280861660408401525060806060830152620035a260808301848662003bdb565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff8416602082015260606040820152600062003f9e60608301848662003bdb565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036200403a576200403a62003fd7565b5060010190565b6060815260006200405760608301878962003bdb565b82810360208401526200406c81868862003bdb565b91505060ff831660408301529695505050505050565b600083516200409681846020880162003cde565b835190830190620040ac81836020880162003cde565b01949350505050565b600181815b808511156200411457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620040f857620040f862003fd7565b808516156200410657918102915b93841c9390800290620040ba565b509250929050565b6000826200412d57506001620008b6565b816200413c57506000620008b6565b8160018114620041555760028114620041605762004180565b6001915050620008b6565b60ff84111562004174576200417462003fd7565b50506001821b620008b6565b5060208310610133831016604e8410600b8410161715620041a5575081810a620008b6565b620041b18383620040b5565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620041e657620041e662003fd7565b029392505050565b60006200382e83836200411c565b81810381811115620008b657620008b662003fd7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000602082840312156200425457600080fd5b5051919050565b600061010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620042bb8285018762003e8f565b925080851660e085015250509998505050505050505050565b600060208284031215620042e757600080fd5b81516200382e8162003717565b600080858511156200430557600080fd5b838611156200431357600080fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620043615780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a0312156200438557600080fd5b87356200439281620036b8565b96506020880135620043a481620036b8565b955060408801359450606088013593506080880135620039cb816200394e565b600080600080600080600080610100898b031215620043e257600080fd5b8835620043ef81620036b8565b975060208901356200440181620036b8565b965060408901359550606089013594506080890135620044218162003717565b935060a089013562004433816200394e565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200446357600080fd5b81516200382e816200394e565b6000602082840312156200448357600080fd5b815167ffffffffffffffff8111156200449b57600080fd5b8201601f81018413620044ad57600080fd5b8051620044be62003de08262003d74565b818152856020838501011115620044d457600080fd5b620044e782602083016020860162003cde565b95945050505050565b6020815260006200382e602083018462003e8f56fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212206fe049be388a1d04319b9913fe6d100c4c8e272fe0f5748eb056bd0622beabcc64736f6c63430008140033a2646970667358221220b14509f55d59293305a5dbe90fdf3a7b7ae9417e96c0bbfe4ba0150ddd7bb7a064736f6c63430008140033", - "deployedBytecode": "0x608060405260043610620001e75760003560e01c8063715018a6116200010b578063bab161bf11620000a1578063dbc16976116200006c578063dbc169761462000728578063ee25560b1462000740578063f2fde38b1462000771578063fb570834146200079657600080fd5b8063bab161bf1462000663578063be5831c7146200069d578063cd58657914620006d9578063d02103ca14620006f057600080fd5b80638da5cb5b11620000e25780638da5cb5b14620005b457806391e57e2d14620005e15780639e34070f14620005f9578063aaa13cc2146200063e57600080fd5b8063715018a6146200053d57806379e2cf97146200055557806381b1c174146200056d57600080fd5b80632d2c9d94116200018157806334ac9cf2116200015857806334ac9cf214620003dd5780633ae05047146200040c5780633e1970431462000424578063647c576c146200051857600080fd5b80632d2c9d9414620003085780632dfdf0b5146200032d578063318aee3d146200035457600080fd5b8063240ff37811620001c2578063240ff37814620002825780632b5e42e714620002995780632c3f58cd14620002be5780632cffd02e14620002e357600080fd5b806315064c9614620001ec5780632072f6c5146200021d57806322e95f2c1462000237575b600080fd5b348015620001f957600080fd5b50606854620002089060ff1681565b60405190151581526020015b60405180910390f35b3480156200022a57600080fd5b5062000235620007bb565b005b3480156200024457600080fd5b506200025c62000256366004620036db565b62000819565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200162000214565b620002356200029336600462003772565b620008bc565b348015620002a657600080fd5b5062000235620002b8366004620037f6565b62000ae4565b348015620002cb57600080fd5b5062000235620002dd36600462003810565b62000af3565b348015620002f057600080fd5b50620002356200030236600462003848565b62000b39565b3480156200031557600080fd5b50620002356200032736600462003848565b620010dd565b3480156200033a57600080fd5b506200034560535481565b60405190815260200162000214565b3480156200036157600080fd5b50620003ab620003733660046200392e565b606b6020526000908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff90911660208301520162000214565b348015620003ea57600080fd5b50606c546200025c9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156200041957600080fd5b5062000345620012e1565b3480156200043157600080fd5b5062000345620004433660046200395e565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200052557600080fd5b506200023562000537366004620039e8565b620013c7565b3480156200054a57600080fd5b506200023562001622565b3480156200056257600080fd5b506200023562001638565b3480156200057a57600080fd5b506200025c6200058c366004620037f6565b606a6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005c157600080fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff166200025c565b348015620005ee57600080fd5b506200034560d15481565b3480156200060657600080fd5b506200020862000618366004620037f6565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b3480156200064b57600080fd5b506200025c6200065d36600462003a38565b62001672565b3480156200067057600080fd5b506068546200068790610100900463ffffffff1681565b60405163ffffffff909116815260200162000214565b348015620006aa57600080fd5b506068546200068790790100000000000000000000000000000000000000000000000000900463ffffffff1681565b62000235620006ea36600462003aec565b6200185e565b348015620006fd57600080fd5b506068546200025c9065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200073557600080fd5b506200023562001932565b3480156200074d57600080fd5b50620003456200075f366004620037f6565b60696020526000908152604090205481565b3480156200077e57600080fd5b5062000235620007903660046200392e565b6200198e565b348015620007a357600080fd5b5062000208620007b536600462003b8e565b62001a4b565b606c5473ffffffffffffffffffffffffffffffffffffffff1633146200080d576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200081762001b34565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091206000908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620008fa576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620009205750600263ffffffff861610155b1562000958576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009ae9998979695949392919062003c24565b60405180910390a162000acc62000ac66001606860019054906101000a900463ffffffff16338989348989604051620009e992919062003c9f565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b62001bc8565b821562000add5762000add62001cdf565b5050505050565b62000aee62001db4565b60d155565b62000afd62001db4565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b77576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b8e8b8b8b8b8b8b8b8b8b8b8b600062001e37565b73ffffffffffffffffffffffffffffffffffffffff861662000c6a576040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000be3919062003d04565b60006040518083038185875af1925050503d806000811462000c22576040519150601f19603f3d011682016040523d82523d6000602084013e62000c27565b606091505b505090508062000c63576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062001065565b60685463ffffffff61010090910481169088160362000cac5762000ca673ffffffffffffffffffffffffffffffffffffffff8716858562002028565b62001065565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b166024820152600090603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000fd7576000808062000d818688018862003e19565b92509250925060008584848460405162000d9b9062003695565b62000da99392919062003edb565b8190604051809103906000f590508015801562000dca573d6000803e3d6000fd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f1990604401600060405180830381600087803b15801562000e4057600080fd5b505af115801562000e55573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000fc595949392919062003f18565b60405180910390a15050505062001062565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f1990604401600060405180830381600087803b1580156200104857600080fd5b505af11580156200105d573d6000803e3d6000fd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff16156200111b576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620011328b8b8b8b8b8b8b8b8b8b8b600162001e37565b60008473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162001165949392919062003f60565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f20000000000000000000000000000000000000000000000000000000017905251620011e8919062003d04565b60006040518083038185875af1925050503d806000811462001227576040519150601f19603f3d011682016040523d82523d6000602084013e6200122c565b606091505b505090508062001268576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b605354600090819081805b6020811015620013be578083901c6001166001036200134f57603381602081106200131b576200131b62003fa8565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200137c565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013b59062004006565b915050620012ec565b50919392505050565b600054610100900460ff1615808015620013e85750600054600160ff909116105b80620014045750303b15801562001404575060005460ff166001145b62001496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014f557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d155620015b8620020fe565b80156200161c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6200162c62001db4565b6200081760006200219d565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000817576200081762001cdf565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201526000908190603801604051602081830303815290604052805190602001209050600060ff60f81b308360405180602001620017089062003695565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905262001753908d908d908d908d908d9060200162004041565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001791929160200162004082565b604051602081830303815290604052805190602001206040516020016200181a94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d15434111562001918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200148d565b620019298787878787878762002214565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001984576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620008176200276f565b6200199862001db4565b73ffffffffffffffffffffffffffffffffffffffff811662001a3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200148d565b62001a48816200219d565b50565b600084815b602081101562001b2657600163ffffffff8616821c8116900362001ac25785816020811062001a835762001a8362003fa8565b60200201358260405160200162001aa4929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001b11565b8186826020811062001ad85762001ad862003fa8565b602002013560405160200162001af8929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001b1d8162004006565b91505062001a50565b50821490505b949350505050565b60685460ff161562001b72576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b80600162001bd960206002620041ee565b62001be59190620041fc565b6053541062001c20576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060536000815462001c339062004006565b9182905550905060005b602081101562001ccf578082901c60011660010362001c7557826033826020811062001c6d5762001c6d62003fa8565b015550505050565b6033816020811062001c8b5762001c8b62003fa8565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001cc69062004006565b91505062001c3d565b5062001cda62004212565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001d65620012e1565b6040518263ffffffff1660e01b815260040162001d8491815260200190565b600060405180830381600087803b15801562001d9f57600080fd5b505af11580156200161c573d6000803e3d6000fd5b609f5473ffffffffffffffffffffffffffffffffffffffff16331462000817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200148d565b62001e488b63ffffffff16620027ff565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b363200000000000000000000000000000000000000000000000000000000909252606481019190915260009165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303816000875af115801562001eeb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001f11919062004241565b90508060000362001f4d576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462001f97576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606854600090610100900463ffffffff1662001fb557508962001fb8565b508a5b62001fe162001fd8848c8c8c8c8c8c8c604051620009e992919062003c9f565b8f8f8462001a4b565b62002018576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001cda9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002864565b600054610100900460ff1662002197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200148d565b62000817335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60685460ff161562002252576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200225c62002977565b60685463ffffffff888116610100909204161480620022825750600263ffffffff881610155b15620022ba576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060608773ffffffffffffffffffffffffffffffffffffffff8816620023205788341462002316576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600092506200261a565b341562002359576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089166000908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901562002449576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac90604401600060405180830381600087803b1580156200241c57600080fd5b505af115801562002431573d6000803e3d6000fd5b50505050806020015194508060000151935062002618565b85156200245e576200245e898b8989620029ec565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa158015620024cc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620024f2919062004241565b90506200251873ffffffffffffffffffffffffffffffffffffffff8b1633308e62002f0a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa15801562002586573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620025ac919062004241565b9050620025ba8282620041fc565b6068548c9850610100900463ffffffff1696509350620025da8762002f6a565b620025e58c62003082565b620025f08d6200318f565b604051602001620026049392919062003edb565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e86886053546040516200265c9897969594939291906200425b565b60405180910390a16200275062000ac6600085878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b861562002761576200276162001cdf565b505050506200192960018055565b60685460ff16620027ac576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600881901c60008181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000add576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000620028c8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200328b9092919063ffffffff16565b80519091501562001cda5780806020019051810190620028e99190620042d4565b62001cda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200148d565b600260015403620029e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200148d565b6002600155565b6000620029fd6004828486620042f4565b62002a089162004320565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002c8757600080808080808062002a6b896004818d620042f4565b81019062002a7a919062004369565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002aee576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002b3e576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002b78576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002c33919062003d04565b6000604051808303816000865af19150503d806000811462002c72576040519150601f19603f3d011682016040523d82523d6000602084013e62002c77565b606091505b5050505050505050505062000add565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002d03576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008080808080808062002d1b8a6004818e620042f4565b81019062002d2a9190620043c4565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002da0576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002df0576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002eb4919062003d04565b6000604051808303816000865af19150503d806000811462002ef3576040519150601f19603f3d011682016040523d82523d6000602084013e62002ef8565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526200161c9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016200207b565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162002fee919062003d04565b600060405180830381855afa9150503d80600081146200302b576040519150601f19603f3d011682016040523d82523d6000602084013e62003030565b606091505b50915091508162003077576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001b2c565b62001b2c816200329c565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162003106919062003d04565b600060405180830381855afa9150503d806000811462003143576040519150601f19603f3d011682016040523d82523d6000602084013e62003148565b606091505b50915091508162003077576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001b2c565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169162003212919062003d04565b600060405180830381855afa9150503d80600081146200324f576040519150601f19603f3d011682016040523d82523d6000602084013e62003254565b606091505b509150915081801562003268575080516020145b6200327557601262001b2c565b8080602001905181019062001b2c919062004450565b606062001b2c84846000856200348c565b60606040825110620032be5781806020019051810190620008b6919062004470565b81516020036200344e5760005b602081108015620033165750828181518110620032ec57620032ec62003fa8565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620033315780620033288162004006565b915050620032cb565b806000036200337557505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111562003393576200339362003caf565b6040519080825280601f01601f191660200182016040528015620033be576020820181803683370190505b50905060005b828110156200344657848181518110620033e257620033e262003fa8565b602001015160f81c60f81b82828151811062003402576200340262003fa8565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806200343d8162004006565b915050620033c4565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200148d565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516200354b919062003d04565b60006040518083038185875af1925050503d80600081146200358a576040519150601f19603f3d011682016040523d82523d6000602084013e6200358f565b606091505b5091509150620035a287838387620035ad565b979650505050505050565b6060831562003648578251600003620036405773ffffffffffffffffffffffffffffffffffffffff85163b62003640576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200148d565b508162001b2c565b62001b2c83838151156200365f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200148d9190620044f0565b611b66806200450683390190565b803563ffffffff811681146200348757600080fd5b73ffffffffffffffffffffffffffffffffffffffff8116811462001a4857600080fd5b60008060408385031215620036ef57600080fd5b620036fa83620036a3565b915060208301356200370c81620036b8565b809150509250929050565b801515811462001a4857600080fd5b60008083601f8401126200373957600080fd5b50813567ffffffffffffffff8111156200375257600080fd5b6020830191508360208285010111156200376b57600080fd5b9250929050565b6000806000806000608086880312156200378b57600080fd5b6200379686620036a3565b94506020860135620037a881620036b8565b93506040860135620037ba8162003717565b9250606086013567ffffffffffffffff811115620037d757600080fd5b620037e58882890162003726565b969995985093965092949392505050565b6000602082840312156200380957600080fd5b5035919050565b6000602082840312156200382357600080fd5b6200382e82620036a3565b9392505050565b806104008101831015620008b657600080fd5b60008060008060008060008060008060006105208c8e0312156200386b57600080fd5b620038778d8d62003835565b9a50620038886104008d01620036a3565b99506104208c013598506104408c01359750620038a96104608d01620036a3565b96506104808c0135620038bc81620036b8565b9550620038cd6104a08d01620036a3565b94506104c08c0135620038e081620036b8565b93506104e08c013592506105008c013567ffffffffffffffff8111156200390657600080fd5b620039148e828f0162003726565b915080935050809150509295989b509295989b9093969950565b6000602082840312156200394157600080fd5b81356200382e81620036b8565b60ff8116811462001a4857600080fd5b600080600080600080600060e0888a0312156200397a57600080fd5b873562003987816200394e565b96506200399760208901620036a3565b95506040880135620039a981620036b8565b9450620039b960608901620036a3565b93506080880135620039cb81620036b8565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215620039fe57600080fd5b62003a0984620036a3565b9250602084013562003a1b81620036b8565b9150604084013562003a2d81620036b8565b809150509250925092565b600080600080600080600060a0888a03121562003a5457600080fd5b62003a5f88620036a3565b9650602088013562003a7181620036b8565b9550604088013567ffffffffffffffff8082111562003a8f57600080fd5b62003a9d8b838c0162003726565b909750955060608a013591508082111562003ab757600080fd5b5062003ac68a828b0162003726565b909450925050608088013562003adc816200394e565b8091505092959891949750929550565b600080600080600080600060c0888a03121562003b0857600080fd5b62003b1388620036a3565b9650602088013562003b2581620036b8565b955060408801359450606088013562003b3e81620036b8565b9350608088013562003b508162003717565b925060a088013567ffffffffffffffff81111562003b6d57600080fd5b62003b7b8a828b0162003726565b989b979a50959850939692959293505050565b600080600080610460858703121562003ba657600080fd5b8435935062003bb9866020870162003835565b925062003bca6104208601620036a3565b939692955092936104400135925050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600061010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003c85828501878962003bdb565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b8381101562003cfb57818101518382015260200162003ce1565b50506000910152565b6000825162003d1881846020870162003cde565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003d6c5762003d6c62003caf565b604052919050565b600067ffffffffffffffff82111562003d915762003d9162003caf565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011262003dcf57600080fd5b813562003de662003de08262003d74565b62003d22565b81815284602083860101111562003dfc57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562003e2f57600080fd5b833567ffffffffffffffff8082111562003e4857600080fd5b62003e568783880162003dbd565b9450602086013591508082111562003e6d57600080fd5b5062003e7c8682870162003dbd565b925050604084013562003a2d816200394e565b6000815180845262003ea981602086016020860162003cde565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60608152600062003ef0606083018662003e8f565b828103602084015262003f04818662003e8f565b91505060ff83166040830152949350505050565b63ffffffff86168152600073ffffffffffffffffffffffffffffffffffffffff808716602084015280861660408401525060806060830152620035a260808301848662003bdb565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff8416602082015260606040820152600062003f9e60608301848662003bdb565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036200403a576200403a62003fd7565b5060010190565b6060815260006200405760608301878962003bdb565b82810360208401526200406c81868862003bdb565b91505060ff831660408301529695505050505050565b600083516200409681846020880162003cde565b835190830190620040ac81836020880162003cde565b01949350505050565b600181815b808511156200411457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620040f857620040f862003fd7565b808516156200410657918102915b93841c9390800290620040ba565b509250929050565b6000826200412d57506001620008b6565b816200413c57506000620008b6565b8160018114620041555760028114620041605762004180565b6001915050620008b6565b60ff84111562004174576200417462003fd7565b50506001821b620008b6565b5060208310610133831016604e8410600b8410161715620041a5575081810a620008b6565b620041b18383620040b5565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620041e657620041e662003fd7565b029392505050565b60006200382e83836200411c565b81810381811115620008b657620008b662003fd7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000602082840312156200425457600080fd5b5051919050565b600061010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620042bb8285018762003e8f565b925080851660e085015250509998505050505050505050565b600060208284031215620042e757600080fd5b81516200382e8162003717565b600080858511156200430557600080fd5b838611156200431357600080fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620043615780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a0312156200438557600080fd5b87356200439281620036b8565b96506020880135620043a481620036b8565b955060408801359450606088013593506080880135620039cb816200394e565b600080600080600080600080610100898b031215620043e257600080fd5b8835620043ef81620036b8565b975060208901356200440181620036b8565b965060408901359550606089013594506080890135620044218162003717565b935060a089013562004433816200394e565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200446357600080fd5b81516200382e816200394e565b6000602082840312156200448357600080fd5b815167ffffffffffffffff8111156200449b57600080fd5b8201601f81018413620044ad57600080fd5b8051620044be62003de08262003d74565b818152856020838501011115620044d457600080fd5b620044e782602083016020860162003cde565b95945050505050565b6020815260006200382e602083018462003e8f56fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212206fe049be388a1d04319b9913fe6d100c4c8e272fe0f5748eb056bd0622beabcc64736f6c63430008140033a2646970667358221220b14509f55d59293305a5dbe90fdf3a7b7ae9417e96c0bbfe4ba0150ddd7bb7a064736f6c63430008140033", + "bytecode": "0x608060405234801561000f575f80fd5b506149238061001d5f395ff3fe6080604052600436106200016f575f3560e01c806315064c9614620001735780632072f6c514620001a357806322e95f2c14620001bc578063240ff37814620001ef5780632b5e42e714620002065780632c3f58cd146200022a5780632cffd02e146200024e5780632d2c9d9414620002725780632dfdf0b51462000296578063318aee3d14620002bc57806334ac9cf214620003285780633ae0504714620003495780633e1970431462000360578063647c576c1462000384578063715018a614620003a857806379e2cf9714620003bf57806381b1c17414620003d65780638da5cb5b146200040e57806391e57e2d14620004255780639e34070f146200043c578063aaa13cc2146200047f578063bab161bf14620004a3578063be5831c714620004dc578063cd5865791462000501578063d02103ca1462000518578063dbc169761462000540578063ee25560b1462000557578063f2fde38b1462000586578063fb57083414620005aa575b5f80fd5b3480156200017f575f80fd5b506068546200018e9060ff1681565b60405190151581526020015b60405180910390f35b348015620001af575f80fd5b50620001ba620005ce565b005b348015620001c8575f80fd5b50620001e0620001da366004620026d9565b62000606565b6040516200019a919062002713565b620001ba620002003660046200277c565b62000656565b34801562000212575f80fd5b50620001ba62000224366004620027fa565b6200076b565b34801562000236575f80fd5b50620001ba6200024836600462002812565b6200077a565b3480156200025a575f80fd5b50620001ba6200026c36600462002847565b620007a6565b3480156200027e575f80fd5b50620001ba6200029036600462002847565b62000b79565b348015620002a2575f80fd5b50620002ad60535481565b6040519081526020016200019a565b348015620002c8575f80fd5b5062000303620002da36600462002924565b606b6020525f908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b039091166020830152016200019a565b34801562000334575f80fd5b50606c54620001e0906001600160a01b031681565b34801562000355575f80fd5b50620002ad62000cb2565b3480156200036c575f80fd5b50620002ad6200037e36600462002951565b62000d99565b34801562000390575f80fd5b50620001ba620003a2366004620029d6565b62000e25565b348015620003b4575f80fd5b50620001ba62000faf565b348015620003cb575f80fd5b50620001ba62000fc4565b348015620003e2575f80fd5b50620001e0620003f4366004620027fa565b606a6020525f90815260409020546001600160a01b031681565b3480156200041a575f80fd5b50620001e062000fe8565b34801562000431575f80fd5b50620002ad60d15481565b34801562000448575f80fd5b506200018e6200045a366004620027fa565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b3480156200048b575f80fd5b50620001e06200049d36600462002a23565b62000ff7565b348015620004af575f80fd5b50606854620004c690610100900463ffffffff1681565b60405163ffffffff90911681526020016200019a565b348015620004e8575f80fd5b50606854620004c690600160c81b900463ffffffff1681565b620001ba6200051236600462002acf565b6200110c565b34801562000524575f80fd5b50606854620001e090600160281b90046001600160a01b031681565b3480156200054c575f80fd5b50620001ba620011b0565b34801562000563575f80fd5b50620002ad62000575366004620027fa565b60696020525f908152604090205481565b34801562000592575f80fd5b50620001ba620005a436600462002924565b620011e6565b348015620005b6575f80fd5b506200018e620005c836600462002b6a565b62001265565b606c546001600160a01b03163314620005fa5760405163e2e8106b60e01b815260040160405180910390fd5b620006046200133d565b565b5f606a5f84846040516020016200061f92919062002bb4565b60408051601f198184030181529181528151602092830120835290820192909252015f20546001600160a01b031690505b92915050565b60685460ff16156200067b57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161480620006a15750600263ffffffff861610155b15620006c0576040516302caf51760e11b815260040160405180910390fd5b5f80516020620048ae8339815191526001606860019054906101000a900463ffffffff16338888348888605354604051620007049998979695949392919062002c06565b60405180910390a1620007536200074d6001606860019054906101000a900463ffffffff163389893489896040516200073f92919062002c74565b604051809103902062000d99565b62001399565b821562000764576200076462001494565b5050505050565b6200077562001527565b60d155565b6200078462001527565b6068805463ffffffff9092166101000264ffffffff0019909216919091179055565b60685460ff1615620007cb57604051630bc011ff60e21b815260040160405180910390fd5b620007e18b8b8b8b8b8b8b8b8b8b8b5f6200158a565b6001600160a01b0386166200088657604080515f808252602082019092526001600160a01b0386169085906040516200081b919062002cbb565b5f6040518083038185875af1925050503d805f811462000857576040519150601f19603f3d011682016040523d82523d5f602084013e6200085c565b606091505b50509050806200087f57604051630ce8f45160e31b815260040160405180910390fd5b5062000b3d565b60685463ffffffff610100909104811690881603620008bb57620008b56001600160a01b0387168585620016ed565b62000b3d565b5f8787604051602001620008d192919062002bb4565b60408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b03168062000ada575f8080620009188688018862002d8c565b9250925092505f858484846040516200093190620026a2565b6200093f9392919062002e29565b8190604051809103905ff59050801580156200095d573d5f803e3d5ffd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f199062000991908d908d9060040162002e65565b5f604051808303815f87803b158015620009a9575f80fd5b505af1158015620009bc573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000ac895949392919062002e7e565b60405180910390a15050505062000b3a565b6040516340c10f1960e01b81526001600160a01b038216906340c10f199062000b0a908990899060040162002e65565b5f604051808303815f87803b15801562000b22575f80fd5b505af115801562000b35573d5f803e3d5ffd5b505050505b50505b5f80516020620048ce8339815191528a8888878760405162000b6495949392919062002eb8565b60405180910390a15050505050505050505050565b60685460ff161562000b9e57604051630bc011ff60e21b815260040160405180910390fd5b62000bb58b8b8b8b8b8b8b8b8b8b8b60016200158a565b5f846001600160a01b031684888a868660405160240162000bda949392919062002eef565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162000c11919062002cbb565b5f6040518083038185875af1925050503d805f811462000c4d576040519150601f19603f3d011682016040523d82523d5f602084013e62000c52565b606091505b505090508062000c75576040516337e391c360e01b815260040160405180910390fd5b5f80516020620048ce8339815191528b8989888860405162000c9c95949392919062002eb8565b60405180910390a1505050505050505050505050565b6053545f90819081805b602081101562000d90578083901c60011660010362000d1f576033816020811062000ceb5762000ceb62002f2b565b01548460405160200162000d0192919062002f3f565b60405160208183030381529060405280519060200120935062000d4d565b838260405160200162000d3492919062002f3f565b6040516020818303038152906040528051906020012093505b818260405160200162000d6292919062002f3f565b604051602081830303815290604052805190602001209150808062000d879062002f61565b91505062000cbc565b50919392505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b5f54610100900460ff161580801562000e4457505f54600160ff909116105b8062000e68575062000e563062001747565b15801562000e6857505f5460ff166001145b62000ed15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801562000ef3575f805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff871602600160281b600160c81b03191617600160281b6001600160a01b038681169190910291909117909155606c80546001600160a01b0319169184169190911790556703782dace9d9000060d15562000f6362001756565b801562000fa9575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b62000fb962001527565b620006045f620017c8565b605354606854600160c81b900463ffffffff16101562000604576200060462001494565b609f546001600160a01b031690565b5f8088886040516020016200100e92919062002bb4565b6040516020818303038152906040528051906020012090505f60ff60f81b3083604051806020016200104090620026a2565b601f1982820381018352601f9091011660408190526200106d908d908d908d908d908d9060200162002f7c565b60408051601f19818403018152908290526200108d929160200162002fbc565b60405160208183030381529060405280519060200120604051602001620010e694939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b60d154341115620011965760405162461bcd60e51b815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d6178457468656064820152667242726964676560c81b608482015260a40162000ec8565b620011a78787878787878762001819565b50505050505050565b606c546001600160a01b03163314620011dc5760405163e2e8106b60e01b815260040160405180910390fd5b6200060462001b94565b620011f062001527565b6001600160a01b038116620012575760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000ec8565b6200126281620017c8565b50565b5f84815b60208110156200132f57600163ffffffff8616821c81169003620012d3578581602081106200129c576200129c62002f2b565b602002013582604051602001620012b592919062002f3f565b6040516020818303038152906040528051906020012091506200131a565b81868260208110620012e957620012e962002f2b565b60200201356040516020016200130192919062002f3f565b6040516020818303038152906040528051906020012091505b80620013268162002f61565b91505062001269565b50821490505b949350505050565b60685460ff16156200136257604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b806001620013aa60206002620030e7565b620013b69190620030f4565b60535410620013d8576040516377ae67b360e11b815260040160405180910390fd5b5f60535f8154620013e99062002f61565b918290555090505f5b602081101562001484578082901c6001166001036200142a57826033826020811062001422576200142262002f2b565b015550505050565b6033816020811062001440576200144062002f2b565b0154836040516020016200145692919062002f3f565b60405160208183030381529060405280519060200120925080806200147b9062002f61565b915050620013f2565b506200148f6200310a565b505050565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d620014dd62000cb2565b6040518263ffffffff1660e01b8152600401620014fc91815260200190565b5f604051808303815f87803b15801562001514575f80fd5b505af115801562000fa9573d5f803e3d5ffd5b336200153262000fe8565b6001600160a01b031614620006045760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000ec8565b6200159b8b63ffffffff1662001bec565b6068545f90600160281b90046001600160a01b031663257b3632620015c18d8d62001c37565b6040518263ffffffff1660e01b8152600401620015e091815260200190565b6020604051808303815f875af1158015620015fd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200162391906200311e565b9050805f036200164557604051622f6fad60e01b815260040160405180910390fd5b60685463ffffffff888116610100909204161462001676576040516302caf51760e11b815260040160405180910390fd5b6068545f90610100900463ffffffff166200169357508962001696565b508a5b620016bf620016b6848c8c8c8c8c8c8c6040516200073f92919062002c74565b8f8f8462001265565b620016dd576040516338105f3b60e21b815260040160405180910390fd5b5050505050505050505050505050565b6200148f8363a9059cbb60e01b84846040516024016200170f92919062002e65565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262001c6b565b6001600160a01b03163b151590565b5f54610100900460ff16620017c25760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000ec8565b62000604335b609f80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60685460ff16156200183e57604051630bc011ff60e21b815260040160405180910390fd5b6200184862001d43565b60685463ffffffff8881166101009092041614806200186e5750600263ffffffff881610155b156200188d576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b038816620018cb57883414620018c25760405163b89240f560e01b815260040160405180910390fd5b5f925062001b22565b3415620018eb5760405163798ee6f160e01b815260040160405180910390fd5b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b90049092169181018290529015620019a257604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac90620019609033908e9060040162002e65565b5f604051808303815f87803b15801562001978575f80fd5b505af11580156200198b573d5f803e3d5ffd5b5050505080602001519450805f0151935062001b20565b8515620019b757620019b7898b898962001d9e565b6040516370a0823160e01b81525f906001600160a01b038b16906370a0823190620019e790309060040162002713565b602060405180830381865afa15801562001a03573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001a2991906200311e565b905062001a426001600160a01b038b1633308e620020f5565b6040516370a0823160e01b81525f906001600160a01b038c16906370a082319062001a7290309060040162002713565b602060405180830381865afa15801562001a8e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001ab491906200311e565b905062001ac28282620030f4565b6068548c9850610100900463ffffffff169650935062001ae2876200212f565b62001aed8c620021f2565b62001af88d620022ac565b60405160200162001b0c9392919062002e29565b604051602081830303815290604052945050505b505b5f80516020620048ae8339815191525f84868e8e868860535460405162001b5198979695949392919062003136565b60405180910390a162001b756200074d5f85878f8f87898051906020012062000d99565b861562001b865762001b8662001494565b50505050620011a760018055565b60685460ff1662001bb857604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b918218928390559290919081831690036200076457604051630c8d9eab60e31b815260040160405180910390fd5b5f828260405160200162001c4d92919062002f3f565b60405160208183030381529060405280519060200120905092915050565b5f62001cc1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620023699092919063ffffffff16565b8051909150156200148f578080602001905181019062001ce29190620031a2565b6200148f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000ec8565b60026001540362001d975760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000ec8565b6002600155565b5f62001dae6004828486620031c0565b62001db991620031e9565b9050632afa533160e01b6001600160e01b031982160162001f55575f80808080808062001dea896004818d620031c0565b81019062001df991906200321a565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161462001e3a5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038616301462001e645760405163750643af60e01b815260040160405180910390fd5b8a851462001e85576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e169162001f05919062002cbb565b5f604051808303815f865af19150503d805f811462001f40576040519150601f19603f3d011682016040523d82523d5f602084013e62001f45565b606091505b5050505050505050505062000764565b6001600160e01b031981166323f2ebc360e21b1462001f8757604051637141605d60e11b815260040160405180910390fd5b5f8080808080808062001f9e8a6004818e620031c0565b81019062001fad919062003270565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462001ff05760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146200201a5760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f1691620020a3919062002cbb565b5f604051808303815f865af19150503d805f8114620020de576040519150601f19603f3d011682016040523d82523d5f602084013e620020e3565b606091505b50505050505050505050505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905262000fa99085906323b872dd60e01b906084016200170f565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b17905290516060915f9182916001600160a01b0386169162002177919062002cbb565b5f60405180830381855afa9150503d805f8114620021b1576040519150601f19603f3d011682016040523d82523d5f602084013e620021b6565b606091505b509150915081620021e757604051806040016040528060078152602001664e4f5f4e414d4560c81b81525062001335565b620013358162002379565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b17905290516060915f9182916001600160a01b038616916200223a919062002cbb565b5f60405180830381855afa9150503d805f811462002274576040519150601f19603f3d011682016040523d82523d5f602084013e62002279565b606091505b509150915081620021e757604051806040016040528060098152602001681393d7d4d6535093d360ba1b81525062001335565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f91829182916001600160a01b03861691620022f3919062002cbb565b5f60405180830381855afa9150503d805f81146200232d576040519150601f19603f3d011682016040523d82523d5f602084013e62002332565b606091505b509150915081801562002346575080516020145b6200235357601262001335565b80806020019051810190620013359190620032f7565b60606200133584845f856200251d565b606060408251106200239b578180602001905181019062000650919062003315565b8151602003620024ea575f5b602081108015620023da5750828181518110620023c857620023c862002f2b565b01602001516001600160f81b03191615155b15620023f55780620023ec8162002f61565b915050620023a7565b805f036200242d5750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b5f816001600160401b0381111562002449576200244962002c83565b6040519080825280601f01601f19166020018201604052801562002474576020820181803683370190505b5090505f5b82811015620024e25784818151811062002497576200249762002f2b565b602001015160f81c60f81b828281518110620024b757620024b762002f2b565b60200101906001600160f81b03191690815f1a90535080620024d98162002f61565b91505062002479565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b606082471015620025805760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000ec8565b5f80866001600160a01b031685876040516200259d919062002cbb565b5f6040518083038185875af1925050503d805f8114620025d9576040519150601f19603f3d011682016040523d82523d5f602084013e620025de565b606091505b5091509150620025f187838387620025fc565b979650505050505050565b606083156200266f5782515f036200266757620026198562001747565b620026675760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000ec8565b508162001335565b620013358383815115620026865781518083602001fd5b8060405162461bcd60e51b815260040162000ec891906200338f565b61150a80620033a483390190565b803563ffffffff8116811462002518575f80fd5b6001600160a01b038116811462001262575f80fd5b5f8060408385031215620026eb575f80fd5b620026f683620026b0565b915060208301356200270881620026c4565b809150509250929050565b6001600160a01b0391909116815260200190565b801515811462001262575f80fd5b5f8083601f84011262002746575f80fd5b5081356001600160401b038111156200275d575f80fd5b60208301915083602082850101111562002775575f80fd5b9250929050565b5f805f805f6080868803121562002791575f80fd5b6200279c86620026b0565b94506020860135620027ae81620026c4565b93506040860135620027c08162002727565b925060608601356001600160401b03811115620027db575f80fd5b620027e98882890162002735565b969995985093965092949392505050565b5f602082840312156200280b575f80fd5b5035919050565b5f6020828403121562002823575f80fd5b6200282e82620026b0565b9392505050565b80610400810183101562000650575f80fd5b5f805f805f805f805f805f6105208c8e03121562002863575f80fd5b6200286f8d8d62002835565b9a50620028806104008d01620026b0565b99506104208c013598506104408c01359750620028a16104608d01620026b0565b96506104808c0135620028b481620026c4565b9550620028c56104a08d01620026b0565b94506104c08c0135620028d881620026c4565b93506104e08c013592506105008c01356001600160401b03811115620028fc575f80fd5b6200290a8e828f0162002735565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562002935575f80fd5b81356200282e81620026c4565b60ff8116811462001262575f80fd5b5f805f805f805f60e0888a03121562002968575f80fd5b8735620029758162002942565b96506200298560208901620026b0565b955060408801356200299781620026c4565b9450620029a760608901620026b0565b93506080880135620029b981620026c4565b9699959850939692959460a0840135945060c09093013592915050565b5f805f60608486031215620029e9575f80fd5b620029f484620026b0565b9250602084013562002a0681620026c4565b9150604084013562002a1881620026c4565b809150509250925092565b5f805f805f805f60a0888a03121562002a3a575f80fd5b62002a4588620026b0565b9650602088013562002a5781620026c4565b955060408801356001600160401b038082111562002a73575f80fd5b62002a818b838c0162002735565b909750955060608a013591508082111562002a9a575f80fd5b5062002aa98a828b0162002735565b909450925050608088013562002abf8162002942565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562002ae6575f80fd5b62002af188620026b0565b9650602088013562002b0381620026c4565b955060408801359450606088013562002b1c81620026c4565b9350608088013562002b2e8162002727565b925060a08801356001600160401b0381111562002b49575f80fd5b62002b578a828b0162002735565b989b979a50959850939692959293505050565b5f805f80610460858703121562002b7f575f80fd5b8435935062002b92866020870162002835565b925062002ba36104208601620026b0565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c083018190525f9162002c5a848301878962002bde565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101562002cb357818101518382015260200162002c99565b50505f910152565b5f825162002cce81846020870162002c97565b9190910192915050565b604051601f8201601f191681016001600160401b038111828210171562002d035762002d0362002c83565b604052919050565b5f6001600160401b0382111562002d265762002d2662002c83565b50601f01601f191660200190565b5f82601f83011262002d44575f80fd5b813562002d5b62002d558262002d0b565b62002cd8565b81815284602083860101111562002d70575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562002d9f575f80fd5b83356001600160401b038082111562002db6575f80fd5b62002dc48783880162002d34565b9450602086013591508082111562002dda575f80fd5b5062002de98682870162002d34565b925050604084013562002a188162002942565b5f815180845262002e1581602086016020860162002c97565b601f01601f19169290920160200192915050565b606081525f62002e3d606083018662002dfc565b828103602084015262002e51818662002dfc565b91505060ff83166040830152949350505050565b6001600160a01b03929092168252602082015260400190565b63ffffffff861681526001600160a01b038581166020830152841660408201526080606082018190525f90620025f1908301848662002bde565b63ffffffff95861681529390941660208401526001600160a01b039182166040840152166060820152608081019190915260a00190565b6001600160a01b038516815263ffffffff841660208201526060604082018190525f9062002f21908301848662002bde565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b918252602082015260400190565b634e487b7160e01b5f52601160045260245ffd5b5f6001820162002f755762002f7562002f4d565b5060010190565b606081525f62002f9160608301878962002bde565b828103602084015262002fa681868862002bde565b91505060ff831660408301529695505050505050565b5f835162002fcf81846020880162002c97565b83519083019062002fe581836020880162002c97565b01949350505050565b600181815b808511156200302e57815f190482111562003012576200301262002f4d565b808516156200302057918102915b93841c939080029062002ff3565b509250929050565b5f82620030465750600162000650565b816200305457505f62000650565b81600181146200306d5760028114620030785762003098565b600191505062000650565b60ff8411156200308c576200308c62002f4d565b50506001821b62000650565b5060208310610133831016604e8410600b8410161715620030bd575081810a62000650565b620030c9838362002fee565b805f1904821115620030df57620030df62002f4d565b029392505050565b5f6200282e838362003036565b8181038181111562000650576200065062002f4d565b634e487b7160e01b5f52600160045260245ffd5b5f602082840312156200312f575f80fd5b5051919050565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c083018190525f91620031898483018762002dfc565b925080851660e085015250509998505050505050505050565b5f60208284031215620031b3575f80fd5b81516200282e8162002727565b5f8085851115620031cf575f80fd5b83861115620031dc575f80fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015620032125780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562003231575f80fd5b87356200323e81620026c4565b965060208801356200325081620026c4565b955060408801359450606088013593506080880135620029b98162002942565b5f805f805f805f80610100898b03121562003289575f80fd5b88356200329681620026c4565b97506020890135620032a881620026c4565b965060408901359550606089013594506080890135620032c88162002727565b935060a0890135620032da8162002942565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562003308575f80fd5b81516200282e8162002942565b5f6020828403121562003326575f80fd5b81516001600160401b038111156200333c575f80fd5b8201601f810184136200334d575f80fd5b80516200335e62002d558262002d0b565b81815285602083850101111562003373575f80fd5b6200338682602083016020860162002c97565b95945050505050565b602081525f6200282e602083018462002dfc56fe61010060405234801562000011575f80fd5b506040516200150a3803806200150a833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161106c6200049e5f395f61019e01525f818161025f0152818161047f01526104ed01525f61043101525f81816102c401526103fb015261106c5ff3fe608060405234801561000f575f80fd5b5060043610610105575f3560e01c806306fdde0314610109578063095ea7b31461012757806318160ddd1461014a57806320606b701461015c57806323b872dd1461017057806330adf81f14610183578063313ce567146101975780633644e515146101c857806339509351146101d057806340c10f19146101e357806370a08231146101f85780637ecebe001461022057806395d89b411461023f5780639dc29fac14610247578063a3c573eb1461025a578063a457c2d714610299578063a9059cbb146102ac578063cd0d0096146102bf578063d505accf146102e6578063dd62ed3e146102f9578063ffa1ad741461030c575b5f80fd5b61011161032c565b60405161011e9190610d8a565b60405180910390f35b61013a610135366004610df0565b6103bc565b604051901515815260200161011e565b6002545b60405190815260200161011e565b61014e5f8051602061101783398151915281565b61013a61017e366004610e18565b6103d5565b61014e5f80516020610ff783398151915281565b60405160ff7f000000000000000000000000000000000000000000000000000000000000000016815260200161011e565b61014e6103f8565b61013a6101de366004610df0565b610453565b6101f66101f1366004610df0565b610474565b005b61014e610206366004610e51565b6001600160a01b03165f9081526020819052604090205490565b61014e61022e366004610e51565b60056020525f908152604090205481565b6101116104d3565b6101f6610255366004610df0565b6104e2565b6102817f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161011e565b61013a6102a7366004610df0565b610534565b61013a6102ba366004610df0565b6105ae565b61014e7f000000000000000000000000000000000000000000000000000000000000000081565b6101f66102f4366004610e71565b6105bb565b61014e610307366004610ede565b6107de565b610111604051806040016040528060018152602001603160f81b81525081565b60606003805461033b90610f0f565b80601f016020809104026020016040519081016040528092919081815260200182805461036790610f0f565b80156103b25780601f10610389576101008083540402835291602001916103b2565b820191905f5260205f20905b81548152906001019060200180831161039557829003601f168201915b5050505050905090565b5f336103c9818585610808565b60019150505b92915050565b5f336103e285828561092c565b6103ed8585856109a4565b506001949350505050565b5f7f0000000000000000000000000000000000000000000000000000000000000000461461042e5761042946610b33565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b5f336103c981858561046583836107de565b61046f9190610f5b565b610808565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104c55760405162461bcd60e51b81526004016104bc90610f6e565b60405180910390fd5b6104cf8282610bcb565b5050565b60606004805461033b90610f0f565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461052a5760405162461bcd60e51b81526004016104bc90610f6e565b6104cf8282610c75565b5f338161054182866107de565b9050838110156105a15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104bc565b6103ed8286868403610808565b5f336103c98185856109a4565b834211156106175760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104bc565b6001600160a01b0387165f90815260056020526040812080545f80516020610ff7833981519152918a918a918a91908661065083610fbe565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6106ad6103f8565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f1981840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610735573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381161580159061076b5750896001600160a01b0316816001600160a01b0316145b6107c75760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104bc565b6107d28a8a8a610808565b50505050505050505050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661086a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104bc565b6001600160a01b0382166108cb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104bc565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b5f61093784846107de565b90505f19811461099e57818110156109915760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104bc565b61099e8484848403610808565b50505050565b6001600160a01b038316610a085760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104bc565b6001600160a01b038216610a6a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104bc565b6001600160a01b0383165f9081526020819052604090205481811015610ae15760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104bc565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290925f80516020610fd7833981519152910160405180910390a361099e565b5f5f80516020611017833981519152610b4a61032c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c215760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104bc565b8060025f828254610c329190610f5b565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481525f80516020610fd7833981519152910160405180910390a35050565b6001600160a01b038216610cd55760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104bc565b6001600160a01b0382165f9081526020819052604090205481811015610d485760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104bc565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192915f80516020610fd7833981519152910161091f565b5f6020808352835180828501525f5b81811015610db557858101830151858201604001528201610d99565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610deb575f80fd5b919050565b5f8060408385031215610e01575f80fd5b610e0a83610dd5565b946020939093013593505050565b5f805f60608486031215610e2a575f80fd5b610e3384610dd5565b9250610e4160208501610dd5565b9150604084013590509250925092565b5f60208284031215610e61575f80fd5b610e6a82610dd5565b9392505050565b5f805f805f805f60e0888a031215610e87575f80fd5b610e9088610dd5565b9650610e9e60208901610dd5565b95506040880135945060608801359350608088013560ff81168114610ec1575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215610eef575f80fd5b610ef883610dd5565b9150610f0660208401610dd5565b90509250929050565b600181811c90821680610f2357607f821691505b602082108103610f4157634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156103cf576103cf610f47565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b5f60018201610fcf57610fcf610f47565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa26469706673582212206c12be332dd873b7cf88c58dfc4762858b63e8ff3bf8563b47828a5a4272643b64736f6c63430008140033501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe27545983a264697066735822122053f0ff7165bbc1149198710f0462239d3d51d7dcf1f5f963d7b1104b715a928964736f6c63430008140033", + "deployedBytecode": "0x6080604052600436106200016f575f3560e01c806315064c9614620001735780632072f6c514620001a357806322e95f2c14620001bc578063240ff37814620001ef5780632b5e42e714620002065780632c3f58cd146200022a5780632cffd02e146200024e5780632d2c9d9414620002725780632dfdf0b51462000296578063318aee3d14620002bc57806334ac9cf214620003285780633ae0504714620003495780633e1970431462000360578063647c576c1462000384578063715018a614620003a857806379e2cf9714620003bf57806381b1c17414620003d65780638da5cb5b146200040e57806391e57e2d14620004255780639e34070f146200043c578063aaa13cc2146200047f578063bab161bf14620004a3578063be5831c714620004dc578063cd5865791462000501578063d02103ca1462000518578063dbc169761462000540578063ee25560b1462000557578063f2fde38b1462000586578063fb57083414620005aa575b5f80fd5b3480156200017f575f80fd5b506068546200018e9060ff1681565b60405190151581526020015b60405180910390f35b348015620001af575f80fd5b50620001ba620005ce565b005b348015620001c8575f80fd5b50620001e0620001da366004620026d9565b62000606565b6040516200019a919062002713565b620001ba620002003660046200277c565b62000656565b34801562000212575f80fd5b50620001ba62000224366004620027fa565b6200076b565b34801562000236575f80fd5b50620001ba6200024836600462002812565b6200077a565b3480156200025a575f80fd5b50620001ba6200026c36600462002847565b620007a6565b3480156200027e575f80fd5b50620001ba6200029036600462002847565b62000b79565b348015620002a2575f80fd5b50620002ad60535481565b6040519081526020016200019a565b348015620002c8575f80fd5b5062000303620002da36600462002924565b606b6020525f908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b039091166020830152016200019a565b34801562000334575f80fd5b50606c54620001e0906001600160a01b031681565b34801562000355575f80fd5b50620002ad62000cb2565b3480156200036c575f80fd5b50620002ad6200037e36600462002951565b62000d99565b34801562000390575f80fd5b50620001ba620003a2366004620029d6565b62000e25565b348015620003b4575f80fd5b50620001ba62000faf565b348015620003cb575f80fd5b50620001ba62000fc4565b348015620003e2575f80fd5b50620001e0620003f4366004620027fa565b606a6020525f90815260409020546001600160a01b031681565b3480156200041a575f80fd5b50620001e062000fe8565b34801562000431575f80fd5b50620002ad60d15481565b34801562000448575f80fd5b506200018e6200045a366004620027fa565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b3480156200048b575f80fd5b50620001e06200049d36600462002a23565b62000ff7565b348015620004af575f80fd5b50606854620004c690610100900463ffffffff1681565b60405163ffffffff90911681526020016200019a565b348015620004e8575f80fd5b50606854620004c690600160c81b900463ffffffff1681565b620001ba6200051236600462002acf565b6200110c565b34801562000524575f80fd5b50606854620001e090600160281b90046001600160a01b031681565b3480156200054c575f80fd5b50620001ba620011b0565b34801562000563575f80fd5b50620002ad62000575366004620027fa565b60696020525f908152604090205481565b34801562000592575f80fd5b50620001ba620005a436600462002924565b620011e6565b348015620005b6575f80fd5b506200018e620005c836600462002b6a565b62001265565b606c546001600160a01b03163314620005fa5760405163e2e8106b60e01b815260040160405180910390fd5b620006046200133d565b565b5f606a5f84846040516020016200061f92919062002bb4565b60408051601f198184030181529181528151602092830120835290820192909252015f20546001600160a01b031690505b92915050565b60685460ff16156200067b57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161480620006a15750600263ffffffff861610155b15620006c0576040516302caf51760e11b815260040160405180910390fd5b5f80516020620048ae8339815191526001606860019054906101000a900463ffffffff16338888348888605354604051620007049998979695949392919062002c06565b60405180910390a1620007536200074d6001606860019054906101000a900463ffffffff163389893489896040516200073f92919062002c74565b604051809103902062000d99565b62001399565b821562000764576200076462001494565b5050505050565b6200077562001527565b60d155565b6200078462001527565b6068805463ffffffff9092166101000264ffffffff0019909216919091179055565b60685460ff1615620007cb57604051630bc011ff60e21b815260040160405180910390fd5b620007e18b8b8b8b8b8b8b8b8b8b8b5f6200158a565b6001600160a01b0386166200088657604080515f808252602082019092526001600160a01b0386169085906040516200081b919062002cbb565b5f6040518083038185875af1925050503d805f811462000857576040519150601f19603f3d011682016040523d82523d5f602084013e6200085c565b606091505b50509050806200087f57604051630ce8f45160e31b815260040160405180910390fd5b5062000b3d565b60685463ffffffff610100909104811690881603620008bb57620008b56001600160a01b0387168585620016ed565b62000b3d565b5f8787604051602001620008d192919062002bb4565b60408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b03168062000ada575f8080620009188688018862002d8c565b9250925092505f858484846040516200093190620026a2565b6200093f9392919062002e29565b8190604051809103905ff59050801580156200095d573d5f803e3d5ffd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f199062000991908d908d9060040162002e65565b5f604051808303815f87803b158015620009a9575f80fd5b505af1158015620009bc573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000ac895949392919062002e7e565b60405180910390a15050505062000b3a565b6040516340c10f1960e01b81526001600160a01b038216906340c10f199062000b0a908990899060040162002e65565b5f604051808303815f87803b15801562000b22575f80fd5b505af115801562000b35573d5f803e3d5ffd5b505050505b50505b5f80516020620048ce8339815191528a8888878760405162000b6495949392919062002eb8565b60405180910390a15050505050505050505050565b60685460ff161562000b9e57604051630bc011ff60e21b815260040160405180910390fd5b62000bb58b8b8b8b8b8b8b8b8b8b8b60016200158a565b5f846001600160a01b031684888a868660405160240162000bda949392919062002eef565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162000c11919062002cbb565b5f6040518083038185875af1925050503d805f811462000c4d576040519150601f19603f3d011682016040523d82523d5f602084013e62000c52565b606091505b505090508062000c75576040516337e391c360e01b815260040160405180910390fd5b5f80516020620048ce8339815191528b8989888860405162000c9c95949392919062002eb8565b60405180910390a1505050505050505050505050565b6053545f90819081805b602081101562000d90578083901c60011660010362000d1f576033816020811062000ceb5762000ceb62002f2b565b01548460405160200162000d0192919062002f3f565b60405160208183030381529060405280519060200120935062000d4d565b838260405160200162000d3492919062002f3f565b6040516020818303038152906040528051906020012093505b818260405160200162000d6292919062002f3f565b604051602081830303815290604052805190602001209150808062000d879062002f61565b91505062000cbc565b50919392505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b5f54610100900460ff161580801562000e4457505f54600160ff909116105b8062000e68575062000e563062001747565b15801562000e6857505f5460ff166001145b62000ed15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801562000ef3575f805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff871602600160281b600160c81b03191617600160281b6001600160a01b038681169190910291909117909155606c80546001600160a01b0319169184169190911790556703782dace9d9000060d15562000f6362001756565b801562000fa9575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b62000fb962001527565b620006045f620017c8565b605354606854600160c81b900463ffffffff16101562000604576200060462001494565b609f546001600160a01b031690565b5f8088886040516020016200100e92919062002bb4565b6040516020818303038152906040528051906020012090505f60ff60f81b3083604051806020016200104090620026a2565b601f1982820381018352601f9091011660408190526200106d908d908d908d908d908d9060200162002f7c565b60408051601f19818403018152908290526200108d929160200162002fbc565b60405160208183030381529060405280519060200120604051602001620010e694939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b60d154341115620011965760405162461bcd60e51b815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d6178457468656064820152667242726964676560c81b608482015260a40162000ec8565b620011a78787878787878762001819565b50505050505050565b606c546001600160a01b03163314620011dc5760405163e2e8106b60e01b815260040160405180910390fd5b6200060462001b94565b620011f062001527565b6001600160a01b038116620012575760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000ec8565b6200126281620017c8565b50565b5f84815b60208110156200132f57600163ffffffff8616821c81169003620012d3578581602081106200129c576200129c62002f2b565b602002013582604051602001620012b592919062002f3f565b6040516020818303038152906040528051906020012091506200131a565b81868260208110620012e957620012e962002f2b565b60200201356040516020016200130192919062002f3f565b6040516020818303038152906040528051906020012091505b80620013268162002f61565b91505062001269565b50821490505b949350505050565b60685460ff16156200136257604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b806001620013aa60206002620030e7565b620013b69190620030f4565b60535410620013d8576040516377ae67b360e11b815260040160405180910390fd5b5f60535f8154620013e99062002f61565b918290555090505f5b602081101562001484578082901c6001166001036200142a57826033826020811062001422576200142262002f2b565b015550505050565b6033816020811062001440576200144062002f2b565b0154836040516020016200145692919062002f3f565b60405160208183030381529060405280519060200120925080806200147b9062002f61565b915050620013f2565b506200148f6200310a565b505050565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d620014dd62000cb2565b6040518263ffffffff1660e01b8152600401620014fc91815260200190565b5f604051808303815f87803b15801562001514575f80fd5b505af115801562000fa9573d5f803e3d5ffd5b336200153262000fe8565b6001600160a01b031614620006045760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000ec8565b6200159b8b63ffffffff1662001bec565b6068545f90600160281b90046001600160a01b031663257b3632620015c18d8d62001c37565b6040518263ffffffff1660e01b8152600401620015e091815260200190565b6020604051808303815f875af1158015620015fd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200162391906200311e565b9050805f036200164557604051622f6fad60e01b815260040160405180910390fd5b60685463ffffffff888116610100909204161462001676576040516302caf51760e11b815260040160405180910390fd5b6068545f90610100900463ffffffff166200169357508962001696565b508a5b620016bf620016b6848c8c8c8c8c8c8c6040516200073f92919062002c74565b8f8f8462001265565b620016dd576040516338105f3b60e21b815260040160405180910390fd5b5050505050505050505050505050565b6200148f8363a9059cbb60e01b84846040516024016200170f92919062002e65565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262001c6b565b6001600160a01b03163b151590565b5f54610100900460ff16620017c25760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000ec8565b62000604335b609f80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60685460ff16156200183e57604051630bc011ff60e21b815260040160405180910390fd5b6200184862001d43565b60685463ffffffff8881166101009092041614806200186e5750600263ffffffff881610155b156200188d576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b038816620018cb57883414620018c25760405163b89240f560e01b815260040160405180910390fd5b5f925062001b22565b3415620018eb5760405163798ee6f160e01b815260040160405180910390fd5b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b90049092169181018290529015620019a257604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac90620019609033908e9060040162002e65565b5f604051808303815f87803b15801562001978575f80fd5b505af11580156200198b573d5f803e3d5ffd5b5050505080602001519450805f0151935062001b20565b8515620019b757620019b7898b898962001d9e565b6040516370a0823160e01b81525f906001600160a01b038b16906370a0823190620019e790309060040162002713565b602060405180830381865afa15801562001a03573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001a2991906200311e565b905062001a426001600160a01b038b1633308e620020f5565b6040516370a0823160e01b81525f906001600160a01b038c16906370a082319062001a7290309060040162002713565b602060405180830381865afa15801562001a8e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001ab491906200311e565b905062001ac28282620030f4565b6068548c9850610100900463ffffffff169650935062001ae2876200212f565b62001aed8c620021f2565b62001af88d620022ac565b60405160200162001b0c9392919062002e29565b604051602081830303815290604052945050505b505b5f80516020620048ae8339815191525f84868e8e868860535460405162001b5198979695949392919062003136565b60405180910390a162001b756200074d5f85878f8f87898051906020012062000d99565b861562001b865762001b8662001494565b50505050620011a760018055565b60685460ff1662001bb857604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b918218928390559290919081831690036200076457604051630c8d9eab60e31b815260040160405180910390fd5b5f828260405160200162001c4d92919062002f3f565b60405160208183030381529060405280519060200120905092915050565b5f62001cc1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620023699092919063ffffffff16565b8051909150156200148f578080602001905181019062001ce29190620031a2565b6200148f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000ec8565b60026001540362001d975760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000ec8565b6002600155565b5f62001dae6004828486620031c0565b62001db991620031e9565b9050632afa533160e01b6001600160e01b031982160162001f55575f80808080808062001dea896004818d620031c0565b81019062001df991906200321a565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161462001e3a5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038616301462001e645760405163750643af60e01b815260040160405180910390fd5b8a851462001e85576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e169162001f05919062002cbb565b5f604051808303815f865af19150503d805f811462001f40576040519150601f19603f3d011682016040523d82523d5f602084013e62001f45565b606091505b5050505050505050505062000764565b6001600160e01b031981166323f2ebc360e21b1462001f8757604051637141605d60e11b815260040160405180910390fd5b5f8080808080808062001f9e8a6004818e620031c0565b81019062001fad919062003270565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462001ff05760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146200201a5760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f1691620020a3919062002cbb565b5f604051808303815f865af19150503d805f8114620020de576040519150601f19603f3d011682016040523d82523d5f602084013e620020e3565b606091505b50505050505050505050505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905262000fa99085906323b872dd60e01b906084016200170f565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b17905290516060915f9182916001600160a01b0386169162002177919062002cbb565b5f60405180830381855afa9150503d805f8114620021b1576040519150601f19603f3d011682016040523d82523d5f602084013e620021b6565b606091505b509150915081620021e757604051806040016040528060078152602001664e4f5f4e414d4560c81b81525062001335565b620013358162002379565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b17905290516060915f9182916001600160a01b038616916200223a919062002cbb565b5f60405180830381855afa9150503d805f811462002274576040519150601f19603f3d011682016040523d82523d5f602084013e62002279565b606091505b509150915081620021e757604051806040016040528060098152602001681393d7d4d6535093d360ba1b81525062001335565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f91829182916001600160a01b03861691620022f3919062002cbb565b5f60405180830381855afa9150503d805f81146200232d576040519150601f19603f3d011682016040523d82523d5f602084013e62002332565b606091505b509150915081801562002346575080516020145b6200235357601262001335565b80806020019051810190620013359190620032f7565b60606200133584845f856200251d565b606060408251106200239b578180602001905181019062000650919062003315565b8151602003620024ea575f5b602081108015620023da5750828181518110620023c857620023c862002f2b565b01602001516001600160f81b03191615155b15620023f55780620023ec8162002f61565b915050620023a7565b805f036200242d5750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b5f816001600160401b0381111562002449576200244962002c83565b6040519080825280601f01601f19166020018201604052801562002474576020820181803683370190505b5090505f5b82811015620024e25784818151811062002497576200249762002f2b565b602001015160f81c60f81b828281518110620024b757620024b762002f2b565b60200101906001600160f81b03191690815f1a90535080620024d98162002f61565b91505062002479565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b606082471015620025805760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000ec8565b5f80866001600160a01b031685876040516200259d919062002cbb565b5f6040518083038185875af1925050503d805f8114620025d9576040519150601f19603f3d011682016040523d82523d5f602084013e620025de565b606091505b5091509150620025f187838387620025fc565b979650505050505050565b606083156200266f5782515f036200266757620026198562001747565b620026675760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000ec8565b508162001335565b620013358383815115620026865781518083602001fd5b8060405162461bcd60e51b815260040162000ec891906200338f565b61150a80620033a483390190565b803563ffffffff8116811462002518575f80fd5b6001600160a01b038116811462001262575f80fd5b5f8060408385031215620026eb575f80fd5b620026f683620026b0565b915060208301356200270881620026c4565b809150509250929050565b6001600160a01b0391909116815260200190565b801515811462001262575f80fd5b5f8083601f84011262002746575f80fd5b5081356001600160401b038111156200275d575f80fd5b60208301915083602082850101111562002775575f80fd5b9250929050565b5f805f805f6080868803121562002791575f80fd5b6200279c86620026b0565b94506020860135620027ae81620026c4565b93506040860135620027c08162002727565b925060608601356001600160401b03811115620027db575f80fd5b620027e98882890162002735565b969995985093965092949392505050565b5f602082840312156200280b575f80fd5b5035919050565b5f6020828403121562002823575f80fd5b6200282e82620026b0565b9392505050565b80610400810183101562000650575f80fd5b5f805f805f805f805f805f6105208c8e03121562002863575f80fd5b6200286f8d8d62002835565b9a50620028806104008d01620026b0565b99506104208c013598506104408c01359750620028a16104608d01620026b0565b96506104808c0135620028b481620026c4565b9550620028c56104a08d01620026b0565b94506104c08c0135620028d881620026c4565b93506104e08c013592506105008c01356001600160401b03811115620028fc575f80fd5b6200290a8e828f0162002735565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562002935575f80fd5b81356200282e81620026c4565b60ff8116811462001262575f80fd5b5f805f805f805f60e0888a03121562002968575f80fd5b8735620029758162002942565b96506200298560208901620026b0565b955060408801356200299781620026c4565b9450620029a760608901620026b0565b93506080880135620029b981620026c4565b9699959850939692959460a0840135945060c09093013592915050565b5f805f60608486031215620029e9575f80fd5b620029f484620026b0565b9250602084013562002a0681620026c4565b9150604084013562002a1881620026c4565b809150509250925092565b5f805f805f805f60a0888a03121562002a3a575f80fd5b62002a4588620026b0565b9650602088013562002a5781620026c4565b955060408801356001600160401b038082111562002a73575f80fd5b62002a818b838c0162002735565b909750955060608a013591508082111562002a9a575f80fd5b5062002aa98a828b0162002735565b909450925050608088013562002abf8162002942565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562002ae6575f80fd5b62002af188620026b0565b9650602088013562002b0381620026c4565b955060408801359450606088013562002b1c81620026c4565b9350608088013562002b2e8162002727565b925060a08801356001600160401b0381111562002b49575f80fd5b62002b578a828b0162002735565b989b979a50959850939692959293505050565b5f805f80610460858703121562002b7f575f80fd5b8435935062002b92866020870162002835565b925062002ba36104208601620026b0565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c083018190525f9162002c5a848301878962002bde565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101562002cb357818101518382015260200162002c99565b50505f910152565b5f825162002cce81846020870162002c97565b9190910192915050565b604051601f8201601f191681016001600160401b038111828210171562002d035762002d0362002c83565b604052919050565b5f6001600160401b0382111562002d265762002d2662002c83565b50601f01601f191660200190565b5f82601f83011262002d44575f80fd5b813562002d5b62002d558262002d0b565b62002cd8565b81815284602083860101111562002d70575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562002d9f575f80fd5b83356001600160401b038082111562002db6575f80fd5b62002dc48783880162002d34565b9450602086013591508082111562002dda575f80fd5b5062002de98682870162002d34565b925050604084013562002a188162002942565b5f815180845262002e1581602086016020860162002c97565b601f01601f19169290920160200192915050565b606081525f62002e3d606083018662002dfc565b828103602084015262002e51818662002dfc565b91505060ff83166040830152949350505050565b6001600160a01b03929092168252602082015260400190565b63ffffffff861681526001600160a01b038581166020830152841660408201526080606082018190525f90620025f1908301848662002bde565b63ffffffff95861681529390941660208401526001600160a01b039182166040840152166060820152608081019190915260a00190565b6001600160a01b038516815263ffffffff841660208201526060604082018190525f9062002f21908301848662002bde565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b918252602082015260400190565b634e487b7160e01b5f52601160045260245ffd5b5f6001820162002f755762002f7562002f4d565b5060010190565b606081525f62002f9160608301878962002bde565b828103602084015262002fa681868862002bde565b91505060ff831660408301529695505050505050565b5f835162002fcf81846020880162002c97565b83519083019062002fe581836020880162002c97565b01949350505050565b600181815b808511156200302e57815f190482111562003012576200301262002f4d565b808516156200302057918102915b93841c939080029062002ff3565b509250929050565b5f82620030465750600162000650565b816200305457505f62000650565b81600181146200306d5760028114620030785762003098565b600191505062000650565b60ff8411156200308c576200308c62002f4d565b50506001821b62000650565b5060208310610133831016604e8410600b8410161715620030bd575081810a62000650565b620030c9838362002fee565b805f1904821115620030df57620030df62002f4d565b029392505050565b5f6200282e838362003036565b8181038181111562000650576200065062002f4d565b634e487b7160e01b5f52600160045260245ffd5b5f602082840312156200312f575f80fd5b5051919050565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c083018190525f91620031898483018762002dfc565b925080851660e085015250509998505050505050505050565b5f60208284031215620031b3575f80fd5b81516200282e8162002727565b5f8085851115620031cf575f80fd5b83861115620031dc575f80fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015620032125780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562003231575f80fd5b87356200323e81620026c4565b965060208801356200325081620026c4565b955060408801359450606088013593506080880135620029b98162002942565b5f805f805f805f80610100898b03121562003289575f80fd5b88356200329681620026c4565b97506020890135620032a881620026c4565b965060408901359550606089013594506080890135620032c88162002727565b935060a0890135620032da8162002942565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562003308575f80fd5b81516200282e8162002942565b5f6020828403121562003326575f80fd5b81516001600160401b038111156200333c575f80fd5b8201601f810184136200334d575f80fd5b80516200335e62002d558262002d0b565b81815285602083850101111562003373575f80fd5b6200338682602083016020860162002c97565b95945050505050565b602081525f6200282e602083018462002dfc56fe61010060405234801562000011575f80fd5b506040516200150a3803806200150a833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161106c6200049e5f395f61019e01525f818161025f0152818161047f01526104ed01525f61043101525f81816102c401526103fb015261106c5ff3fe608060405234801561000f575f80fd5b5060043610610105575f3560e01c806306fdde0314610109578063095ea7b31461012757806318160ddd1461014a57806320606b701461015c57806323b872dd1461017057806330adf81f14610183578063313ce567146101975780633644e515146101c857806339509351146101d057806340c10f19146101e357806370a08231146101f85780637ecebe001461022057806395d89b411461023f5780639dc29fac14610247578063a3c573eb1461025a578063a457c2d714610299578063a9059cbb146102ac578063cd0d0096146102bf578063d505accf146102e6578063dd62ed3e146102f9578063ffa1ad741461030c575b5f80fd5b61011161032c565b60405161011e9190610d8a565b60405180910390f35b61013a610135366004610df0565b6103bc565b604051901515815260200161011e565b6002545b60405190815260200161011e565b61014e5f8051602061101783398151915281565b61013a61017e366004610e18565b6103d5565b61014e5f80516020610ff783398151915281565b60405160ff7f000000000000000000000000000000000000000000000000000000000000000016815260200161011e565b61014e6103f8565b61013a6101de366004610df0565b610453565b6101f66101f1366004610df0565b610474565b005b61014e610206366004610e51565b6001600160a01b03165f9081526020819052604090205490565b61014e61022e366004610e51565b60056020525f908152604090205481565b6101116104d3565b6101f6610255366004610df0565b6104e2565b6102817f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161011e565b61013a6102a7366004610df0565b610534565b61013a6102ba366004610df0565b6105ae565b61014e7f000000000000000000000000000000000000000000000000000000000000000081565b6101f66102f4366004610e71565b6105bb565b61014e610307366004610ede565b6107de565b610111604051806040016040528060018152602001603160f81b81525081565b60606003805461033b90610f0f565b80601f016020809104026020016040519081016040528092919081815260200182805461036790610f0f565b80156103b25780601f10610389576101008083540402835291602001916103b2565b820191905f5260205f20905b81548152906001019060200180831161039557829003601f168201915b5050505050905090565b5f336103c9818585610808565b60019150505b92915050565b5f336103e285828561092c565b6103ed8585856109a4565b506001949350505050565b5f7f0000000000000000000000000000000000000000000000000000000000000000461461042e5761042946610b33565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b5f336103c981858561046583836107de565b61046f9190610f5b565b610808565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104c55760405162461bcd60e51b81526004016104bc90610f6e565b60405180910390fd5b6104cf8282610bcb565b5050565b60606004805461033b90610f0f565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461052a5760405162461bcd60e51b81526004016104bc90610f6e565b6104cf8282610c75565b5f338161054182866107de565b9050838110156105a15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104bc565b6103ed8286868403610808565b5f336103c98185856109a4565b834211156106175760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104bc565b6001600160a01b0387165f90815260056020526040812080545f80516020610ff7833981519152918a918a918a91908661065083610fbe565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6106ad6103f8565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f1981840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610735573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381161580159061076b5750896001600160a01b0316816001600160a01b0316145b6107c75760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104bc565b6107d28a8a8a610808565b50505050505050505050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661086a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104bc565b6001600160a01b0382166108cb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104bc565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b5f61093784846107de565b90505f19811461099e57818110156109915760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104bc565b61099e8484848403610808565b50505050565b6001600160a01b038316610a085760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104bc565b6001600160a01b038216610a6a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104bc565b6001600160a01b0383165f9081526020819052604090205481811015610ae15760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104bc565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290925f80516020610fd7833981519152910160405180910390a361099e565b5f5f80516020611017833981519152610b4a61032c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c215760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104bc565b8060025f828254610c329190610f5b565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481525f80516020610fd7833981519152910160405180910390a35050565b6001600160a01b038216610cd55760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104bc565b6001600160a01b0382165f9081526020819052604090205481811015610d485760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104bc565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192915f80516020610fd7833981519152910161091f565b5f6020808352835180828501525f5b81811015610db557858101830151858201604001528201610d99565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610deb575f80fd5b919050565b5f8060408385031215610e01575f80fd5b610e0a83610dd5565b946020939093013593505050565b5f805f60608486031215610e2a575f80fd5b610e3384610dd5565b9250610e4160208501610dd5565b9150604084013590509250925092565b5f60208284031215610e61575f80fd5b610e6a82610dd5565b9392505050565b5f805f805f805f60e0888a031215610e87575f80fd5b610e9088610dd5565b9650610e9e60208901610dd5565b95506040880135945060608801359350608088013560ff81168114610ec1575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215610eef575f80fd5b610ef883610dd5565b9150610f0660208401610dd5565b90509250929050565b600181811c90821680610f2357607f821691505b602082108103610f4157634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156103cf576103cf610f47565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b5f60018201610fcf57610fcf610f47565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa26469706673582212206c12be332dd873b7cf88c58dfc4762858b63e8ff3bf8563b47828a5a4272643b64736f6c63430008140033501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe27545983a264697066735822122053f0ff7165bbc1149198710f0462239d3d51d7dcf1f5f963d7b1104b715a928964736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMBridgeV2.json b/compiled-contracts/paris/PolygonZkEVMBridgeV2.json index e5f1d6d95..37e6e6d3e 100644 --- a/compiled-contracts/paris/PolygonZkEVMBridgeV2.json +++ b/compiled-contracts/paris/PolygonZkEVMBridgeV2.json @@ -917,8 +917,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b5061611c806100206000396000f3fe608060405260043610620001db5760003560e01c80638ed7e3f211620000ff578063cd5865791162000095578063dbc16976116200006c578063dbc1697614620006a7578063ee25560b14620006bf578063f5efcd7914620006f0578063fb570834146200071557600080fd5b8063cd5865791462000640578063d02103ca1462000657578063d3476afe146200068257600080fd5b8063bab161bf11620000d6578063bab161bf1462000596578063be5831c714620005ba578063cc46163214620005f6578063ccaa2d11146200061b57600080fd5b80638ed7e3f2146200052a578063aaa13cc2146200054c578063b8b284d0146200057157600080fd5b80633cbc795b11620001755780635ca1e165116200014c5780635ca1e165146200049b57806379e2cf9714620004b357806381b1c17414620004cb57806383f24403146200050557600080fd5b80633cbc795b14620003385780633e19704314620003855780634b2f336d146200047957600080fd5b8063240ff37811620001b6578063240ff37814620002695780632dfdf0b51462000280578063318aee3d14620002a75780633c351e10146200031657600080fd5b806315064c9614620001e05780632072f6c5146200021157806322e95f2c146200022b575b600080fd5b348015620001ed57600080fd5b50606854620001fc9060ff1681565b60405190151581526020015b60405180910390f35b3480156200021e57600080fd5b50620002296200073a565b005b3480156200023857600080fd5b50620002506200024a366004620037e3565b6200078b565b6040516001600160a01b03909116815260200162000208565b620002296200027a3660046200387a565b62000821565b3480156200028d57600080fd5b506200029860535481565b60405190815260200162000208565b348015620002b457600080fd5b50620002f1620002c6366004620038fe565b606b6020526000908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b0390911660208301520162000208565b3480156200032357600080fd5b50606d5462000250906001600160a01b031681565b3480156200034557600080fd5b50606d546200036f9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200162000208565b3480156200039257600080fd5b5062000298620003a436600462003935565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200048657600080fd5b50606e5462000250906001600160a01b031681565b348015620004a857600080fd5b50620002986200088a565b348015620004c057600080fd5b506200022962000970565b348015620004d857600080fd5b5062000250620004ea366004620039bf565b606a602052600090815260409020546001600160a01b031681565b3480156200051257600080fd5b506200029862000524366004620039ec565b620009aa565b3480156200053757600080fd5b50606c5462000250906001600160a01b031681565b3480156200055957600080fd5b50620002506200056b36600462003a30565b62000a8e565b3480156200057e57600080fd5b50620002296200059036600462003ae4565b62000c20565b348015620005a357600080fd5b506068546200036f90610100900463ffffffff1681565b348015620005c757600080fd5b506068546200036f90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b3480156200060357600080fd5b50620001fc6200061536600462003b71565b62000cfa565b3480156200062857600080fd5b50620002296200063a36600462003ba9565b62000d8b565b620002296200065136600462003ca5565b620014a6565b3480156200066457600080fd5b5060685462000250906501000000000090046001600160a01b031681565b3480156200068f57600080fd5b5062000229620006a136600462003d47565b62001a72565b348015620006b457600080fd5b506200022962001e50565b348015620006cc57600080fd5b5062000298620006de366004620039bf565b60696020526000908152604090205481565b348015620006fd57600080fd5b50620002296200070f36600462003ba9565b62001e9f565b3480156200072257600080fd5b50620001fc6200073436600462003dbf565b62002230565b606c546001600160a01b031633146200077f576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007896200224c565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091206000908152606a90915220546001600160a01b03165b92915050565b34158015906200083b5750606e546001600160a01b031615155b1562000873576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000883858534868686620022e0565b5050505050565b605354600090819081805b602081101562000967578083901c600116600103620008f85760338160208110620008c457620008c462003e0c565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062000925565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806200095e9062003e6a565b91505062000895565b50919392505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620007895762000789620023c8565b600083815b602081101562000a8557600163ffffffff8516821c8116900362000a2157848160208110620009e257620009e262003e0c565b60200201358260405160200162000a03929190918252602082015260400190565b60405160208183030381529060405280519060200120915062000a70565b8185826020811062000a375762000a3762003e0c565b602002013560405160200162000a57929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062000a7c8162003e6a565b915050620009af565b50949350505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201526000908190603801604051602081830303815290604052805190602001209050600060ff60f81b30836040518060200162000b2490620037a7565b601f1982820381018352601f90910116604081905262000b51908d908d908d908d908d9060200162003ed0565b60408051601f198184030181529082905262000b71929160200162003f37565b6040516020818303038152906040528051906020012060405160200162000bfa94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b606e546001600160a01b031662000c63576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606e546040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018690526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b15801562000cc957600080fd5b505af115801562000cde573d6000803e3d6000fd5b5050505062000cf2868686868686620022e0565b505050505050565b6068546000908190610100900463ffffffff1615801562000d21575063ffffffff83166001145b1562000d35575063ffffffff831662000d61565b62000d4c64010000000063ffffffff851662003f6a565b62000d5e9063ffffffff861662003f84565b90505b600881901c600090815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000dc9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161462000e13576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000f1c8c8c8c8c8c62000f1660008e8e8e8e8e8e8e60405162000e3992919062003f9a565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b62002496565b6001600160a01b0386166200109457606e546001600160a01b03166200100d5760006001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000f76576020820181803683370190505b5060405162000f86919062003fd9565b60006040518083038185875af1925050503d806000811462000fc5576040519150601f19603f3d011682016040523d82523d6000602084013e62000fca565b606091505b505090508062001006576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506200143c565b606e546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015260248201869052909116906340c10f1990604401600060405180830381600087803b1580156200107557600080fd5b505af11580156200108a573d6000803e3d6000fd5b505050506200143c565b606d546001600160a01b038781169116148015620010d45750606d5463ffffffff8881167401000000000000000000000000000000000000000090920416145b15620010ee5760006001600160a01b038516848262000f4b565b60685463ffffffff61010090910481169088160362001123576200111d6001600160a01b038716858562002674565b6200143c565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b16602482015260009060380160408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b031680620013bb5760008080620011cd86880188620040b2565b925092509250600085848484604051620011e790620037a7565b620011f59392919062004161565b8190604051809103906000f590508015801562001216573d6000803e3d6000fd5b506040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038c81166004830152602482018c9052919250908216906340c10f1990604401600060405180830381600087803b1580156200127f57600080fd5b505af115801562001294573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b604051620013a99594939291906200419e565b60405180910390a15050505062001439565b6040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152602482018790528216906340c10f1990604401600060405180830381600087803b1580156200141f57600080fd5b505af115801562001434573d6000803e3d6000fd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff1615620014e4576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620014ee62002724565b60685463ffffffff61010090910481169088160362001539576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806060876001600160a01b038816620015bd5788341462001588576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d546001600160a01b038116945074010000000000000000000000000000000000000000900463ffffffff1692506200190e565b3415620015f6576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606e546001600160a01b03908116908916036200168e576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018a90526001600160a01b03891690639dc29fac90604401600060405180830381600087803b1580156200166f57600080fd5b505af115801562001684573d6000803e3d6000fd5b505050506200190e565b6001600160a01b038089166000908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901562001764576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b90526001600160a01b038a1690639dc29fac90604401600060405180830381600087803b1580156200173757600080fd5b505af11580156200174c573d6000803e3d6000fd5b5050505080602001519450806000015193506200190c565b8515620017795762001779898b898962002799565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038b16906370a0823190602401602060405180830381865afa158015620017da573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620018009190620041d9565b9050620018196001600160a01b038b1633308e62002c4f565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038c16906370a0823190602401602060405180830381865afa1580156200187a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620018a09190620041d9565b9050620018ae8282620041f3565b6068548c9850610100900463ffffffff1696509350620018ce8762002ca2565b620018d98c62002dad565b620018e48d62002ead565b604051602001620018f89392919062004161565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e86886053546040516200195098979695949392919062004209565b60405180910390a162001a4a62001a44600085878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b62002f9c565b861562001a5b5762001a5b620023c8565b5050505062001a6960018055565b50505050505050565b600054610100900460ff161580801562001a935750600054600160ff909116105b8062001aaf5750303b15801562001aaf575060005460ff166001145b62001b41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801562001ba057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8916027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016848316179055606d541662001ca557606d5474010000000000000000000000000000000000000000900463ffffffff161562001c9f576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001ddb565b606d805463ffffffff861674010000000000000000000000000000000000000000027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b0388161717905560405160009060129062001d0d90620037a7565b6060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff909116604082015260e0018190604051809103906000f590508015801562001da1573d6000803e3d6000fd5b50606e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790555b62001de5620030b4565b801562000cf257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b606c546001600160a01b0316331462001e95576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200078962003157565b60685460ff161562001edd576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161462001f27576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001f4d8c8c8c8c8c62000f1660018e8e8e8e8e8e8e60405162000e3992919062003f9a565b606e546000906001600160a01b03166200203a57846001600160a01b031684888a868660405160240162001f85949392919062004275565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f2000000000000000000000000000000000000000000000000000000001790525162001fea919062003fd9565b60006040518083038185875af1925050503d806000811462002029576040519150601f19603f3d011682016040523d82523d6000602084013e6200202e565b606091505b5050809150506200218d565b606e546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260248201879052909116906340c10f1990604401600060405180830381600087803b158015620020a257600080fd5b505af1158015620020b7573d6000803e3d6000fd5b50505050846001600160a01b031687898585604051602401620020de949392919062004275565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f2000000000000000000000000000000000000000000000000000000001790525162002143919062003fd9565b6000604051808303816000865af19150503d806000811462002182576040519150601f19603f3d011682016040523d82523d6000602084013e62002187565b606091505b50909150505b80620021c5576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b60008162002240868686620009aa565b1490505b949350505050565b60685460ff16156200228a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b60685463ffffffff6101009091048116908716036200232b576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff163389898988886053546040516200238199989796959493929190620042b0565b60405180910390a1620023bc62001a446001606860019054906101000a900463ffffffff16338a8a8a898960405162000e3992919062003f9a565b821562000cf25762000cf25b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d620024416200088a565b6040518263ffffffff1660e01b81526004016200246091815260200190565b600060405180830381600087803b1580156200247b57600080fd5b505af115801562002490573d6000803e3d6000fd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091526000916501000000000090046001600160a01b03169063257b3632906084016020604051808303816000875af11580156200252c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620025529190620041d9565b9050806000036200258e576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080680100000000000000008716600103620025f357869150620025b6848a848962002230565b620025ed576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200265d565b602087901c620026058160016200431e565b9150879250620026246200261b868c86620009aa565b8a838962002230565b6200265b576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b620026698282620031e7565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526200271f9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152620032b1565b505050565b60026001540362002792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001b38565b6002600155565b6000620027aa600482848662004345565b620027b59162004371565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002a0057600080808080808062002818896004818d62004345565b810190620028279190620043ba565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161462002881576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0386163014620028c4576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a8514620028fe576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620029ac919062003fd9565b6000604051808303816000865af19150503d8060008114620029eb576040519150601f19603f3d011682016040523d82523d6000602084013e620029f0565b606091505b5050505050505050505062000883565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002a7c576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008080808080808062002a948a6004818e62004345565b81019062002aa3919062004415565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462002aff576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038716301462002b42576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002bf9919062003fd9565b6000604051808303816000865af19150503d806000811462002c38576040519150601f19603f3d011682016040523d82523d6000602084013e62002c3d565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052620024909085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401620026ba565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde0300000000000000000000000000000000000000000000000000000000179052905160609160009182916001600160a01b0386169162002d19919062003fd9565b600060405180830381855afa9150503d806000811462002d56576040519150601f19603f3d011682016040523d82523d6000602084013e62002d5b565b606091505b50915091508162002da2576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062002244565b6200224481620033b7565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b4100000000000000000000000000000000000000000000000000000000179052905160609160009182916001600160a01b0386169162002e24919062003fd9565b600060405180830381855afa9150503d806000811462002e61576040519150601f19603f3d011682016040523d82523d6000602084013e62002e66565b606091505b50915091508162002da2576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062002244565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce567000000000000000000000000000000000000000000000000000000001790529051600091829182916001600160a01b0386169162002f23919062003fd9565b600060405180830381855afa9150503d806000811462002f60576040519150601f19603f3d011682016040523d82523d6000602084013e62002f65565b606091505b509150915081801562002f79575080516020145b62002f8657601262002244565b80806020019051810190620022449190620044a1565b80600162002fad60206002620045fa565b62002fb99190620041f3565b6053541062002ff4576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000605360008154620030079062003e6a565b9182905550905060005b6020811015620030a3578082901c6001166001036200304957826033826020811062003041576200304162003e0c565b015550505050565b603381602081106200305f576200305f62003e0c565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925080806200309a9062003e6a565b91505062003011565b506200271f62004608565b60018055565b600054610100900460ff166200314d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001b38565b62000789620035a7565b60685460ff1662003194576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b606854600090610100900463ffffffff161580156200320c575063ffffffff82166001145b1562003220575063ffffffff82166200324c565b6200323764010000000063ffffffff841662003f6a565b620032499063ffffffff851662003f84565b90505b600881901c60008181526069602052604081208054600160ff861690811b9182189283905592909190818316900362001a69576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600062003308826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620036409092919063ffffffff16565b8051909150156200271f578080602001905181019062003329919062004637565b6200271f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001b38565b60606040825110620033d957818060200190518101906200081b919062004657565b8151602003620035695760005b60208110801562003431575082818151811062003407576200340762003e0c565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b156200344c5780620034438162003e6a565b915050620033e6565b806000036200349057505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115620034ae57620034ae62003faa565b6040519080825280601f01601f191660200182016040528015620034d9576020820181803683370190505b50905060005b828110156200356157848181518110620034fd57620034fd62003e0c565b602001015160f81c60f81b8282815181106200351d576200351d62003e0c565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080620035588162003e6a565b915050620034df565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b600054610100900460ff16620030ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001b38565b606062002244848460008585600080866001600160a01b031685876040516200366a919062003fd9565b60006040518083038185875af1925050503d8060008114620036a9576040519150601f19603f3d011682016040523d82523d6000602084013e620036ae565b606091505b5091509150620036c187838387620036cc565b979650505050505050565b606083156200375a57825160000362003752576001600160a01b0385163b62003752576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001b38565b508162002244565b620022448383815115620037715781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001b389190620046d7565b6119fa80620046ed83390190565b803563ffffffff81168114620035a257600080fd5b6001600160a01b0381168114620037e057600080fd5b50565b60008060408385031215620037f757600080fd5b6200380283620037b5565b915060208301356200381481620037ca565b809150509250929050565b8015158114620037e057600080fd5b60008083601f8401126200384157600080fd5b50813567ffffffffffffffff8111156200385a57600080fd5b6020830191508360208285010111156200387357600080fd5b9250929050565b6000806000806000608086880312156200389357600080fd5b6200389e86620037b5565b94506020860135620038b081620037ca565b93506040860135620038c2816200381f565b9250606086013567ffffffffffffffff811115620038df57600080fd5b620038ed888289016200382e565b969995985093965092949392505050565b6000602082840312156200391157600080fd5b81356200391e81620037ca565b9392505050565b60ff81168114620037e057600080fd5b600080600080600080600060e0888a0312156200395157600080fd5b87356200395e8162003925565b96506200396e60208901620037b5565b955060408801356200398081620037ca565b94506200399060608901620037b5565b93506080880135620039a281620037ca565b9699959850939692959460a0840135945060c09093013592915050565b600060208284031215620039d257600080fd5b5035919050565b8061040081018310156200081b57600080fd5b6000806000610440848603121562003a0357600080fd5b8335925062003a168560208601620039d9565b915062003a276104208501620037b5565b90509250925092565b600080600080600080600060a0888a03121562003a4c57600080fd5b62003a5788620037b5565b9650602088013562003a6981620037ca565b9550604088013567ffffffffffffffff8082111562003a8757600080fd5b62003a958b838c016200382e565b909750955060608a013591508082111562003aaf57600080fd5b5062003abe8a828b016200382e565b909450925050608088013562003ad48162003925565b8091505092959891949750929550565b60008060008060008060a0878903121562003afe57600080fd5b62003b0987620037b5565b9550602087013562003b1b81620037ca565b945060408701359350606087013562003b34816200381f565b9250608087013567ffffffffffffffff81111562003b5157600080fd5b62003b5f89828a016200382e565b979a9699509497509295939492505050565b6000806040838503121562003b8557600080fd5b62003b9083620037b5565b915062003ba060208401620037b5565b90509250929050565b6000806000806000806000806000806000806109208d8f03121562003bcd57600080fd5b62003bd98e8e620039d9565b9b5062003beb8e6104008f01620039d9565b9a506108008d013599506108208d013598506108408d0135975062003c146108608e01620037b5565b965062003c266108808e0135620037ca565b6108808d0135955062003c3d6108a08e01620037b5565b945062003c4f6108c08e0135620037ca565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111562003c7a57600080fd5b62003c8d8e6109008f01358f016200382e565b81935080925050509295989b509295989b509295989b565b600080600080600080600060c0888a03121562003cc157600080fd5b62003ccc88620037b5565b9650602088013562003cde81620037ca565b955060408801359450606088013562003cf781620037ca565b9350608088013562003d09816200381f565b925060a088013567ffffffffffffffff81111562003d2657600080fd5b62003d348a828b016200382e565b989b979a50959850939692959293505050565b600080600080600060a0868803121562003d6057600080fd5b62003d6b86620037b5565b9450602086013562003d7d81620037ca565b935062003d8d60408701620037b5565b9250606086013562003d9f81620037ca565b9150608086013562003db181620037ca565b809150509295509295909350565b600080600080610460858703121562003dd757600080fd5b8435935062003dea8660208701620039d9565b925062003dfb6104208601620037b5565b939692955092936104400135925050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003e9e5762003e9e62003e3b565b5060010190565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b60608152600062003ee660608301878962003ea5565b828103602084015262003efb81868862003ea5565b91505060ff831660408301529695505050505050565b60005b8381101562003f2e57818101518382015260200162003f14565b50506000910152565b6000835162003f4b81846020880162003f11565b83519083019062003f6181836020880162003f11565b01949350505050565b80820281158282048414176200081b576200081b62003e3b565b808201808211156200081b576200081b62003e3b565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825162003fed81846020870162003f11565b9190910192915050565b604051601f8201601f1916810167ffffffffffffffff8111828210171562004023576200402362003faa565b604052919050565b600067ffffffffffffffff82111562004048576200404862003faa565b50601f01601f191660200190565b600082601f8301126200406857600080fd5b81356200407f62004079826200402b565b62003ff7565b8181528460208386010111156200409557600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215620040c857600080fd5b833567ffffffffffffffff80821115620040e157600080fd5b620040ef8783880162004056565b945060208601359150808211156200410657600080fd5b50620041158682870162004056565b9250506040840135620041288162003925565b809150509250925092565b600081518084526200414d81602086016020860162003f11565b601f01601f19169290920160200192915050565b60608152600062004176606083018662004133565b82810360208401526200418a818662004133565b91505060ff83166040830152949350505050565b63ffffffff8616815260006001600160a01b03808716602084015280861660408401525060806060830152620036c160808301848662003ea5565b600060208284031215620041ec57600080fd5b5051919050565b818103818111156200081b576200081b62003e3b565b600061010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c08501526200425c8285018762004133565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201526000620042a660608301848662003ea5565b9695505050505050565b600061010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c085015262004304828501878962003ea5565b925080851660e085015250509a9950505050505050505050565b63ffffffff8181168382160190808211156200433e576200433e62003e3b565b5092915050565b600080858511156200435657600080fd5b838611156200436457600080fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620043b25780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a031215620043d657600080fd5b8735620043e381620037ca565b96506020880135620043f581620037ca565b955060408801359450606088013593506080880135620039a28162003925565b600080600080600080600080610100898b0312156200443357600080fd5b88356200444081620037ca565b975060208901356200445281620037ca565b96506040890135955060608901359450608089013562004472816200381f565b935060a0890135620044848162003925565b979a969950949793969295929450505060c08201359160e0013590565b600060208284031215620044b457600080fd5b81516200391e8162003925565b600181815b808511156200452057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562004504576200450462003e3b565b808516156200451257918102915b93841c9390800290620044c6565b509250929050565b60008262004539575060016200081b565b8162004548575060006200081b565b81600181146200456157600281146200456c576200458c565b60019150506200081b565b60ff84111562004580576200458062003e3b565b50506001821b6200081b565b5060208310610133831016604e8410600b8410161715620045b1575081810a6200081b565b620045bd8383620044c1565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620045f257620045f262003e3b565b029392505050565b60006200391e838362004528565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000602082840312156200464a57600080fd5b81516200391e816200381f565b6000602082840312156200466a57600080fd5b815167ffffffffffffffff8111156200468257600080fd5b8201601f810184136200469457600080fd5b8051620046a562004079826200402b565b818152856020838501011115620046bb57600080fd5b620046ce82602083016020860162003f11565b95945050505050565b6020815260006200391e60208301846200413356fe6101006040523480156200001257600080fd5b50604051620019fa380380620019fa83398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161153e620004bc6000396000610237015260008181610307015281816105c0015261068d0152600061053a0152600081816103790152610504015261153e6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b6040516101919190611278565b60405180910390f35b6101ad6101a836600461130d565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad610204366004611337565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad61027736600461130d565b61055c565b61028f61028a36600461130d565b6105a8565b005b6101c161029f366004611373565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d5366004611373565b60056020526000908152604090205481565b610184610666565b61028f6102fd36600461130d565b610675565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c36600461130d565b61072a565b6101ad61036f36600461130d565b6107e1565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611395565b6107ef565b6101c16103bc366004611408565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f9061143b565b80601f016020809104026020016040519081016040528092919081815260200182805461046b9061143b565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610af1565b60019150505b92915050565b6000336104ea858285610c71565b6104f5858585610d2e565b506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146105375761053246610f4f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a39087906114bd565b610af1565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106585760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106628282611017565b5050565b60606004805461043f9061143b565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146107205760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d42726964676500000000000000000000000000000000606482015260840161064f565b61066282826110f0565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107d45760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161064f565b6104f58286868403610af1565b6000336104d0818585610d2e565b834211156108645760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d697400000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866108be836114d0565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610929610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156109ed573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610a6857508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610ada5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e617475726500000000000000000000000000000000000000000000000000606482015260840161064f565b610ae58a8a8a610af1565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610b795760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8216610c025760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d285781811015610d1b5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161064f565b610d288484848403610af1565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610db75760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8216610e405760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610edc5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610d28565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610f7a610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff821661107a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161064f565b806002600082825461108c91906114bd565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166111795760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156112155760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610c64565b600060208083528351808285015260005b818110156112a557858101830151858201604001528201611289565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461130857600080fd5b919050565b6000806040838503121561132057600080fd5b611329836112e4565b946020939093013593505050565b60008060006060848603121561134c57600080fd5b611355846112e4565b9250611363602085016112e4565b9150604084013590509250925092565b60006020828403121561138557600080fd5b61138e826112e4565b9392505050565b600080600080600080600060e0888a0312156113b057600080fd5b6113b9886112e4565b96506113c7602089016112e4565b95506040880135945060608801359350608088013560ff811681146113eb57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561141b57600080fd5b611424836112e4565b9150611432602084016112e4565b90509250929050565b600181811c9082168061144f57607f821691505b602082108103611488577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d661148e565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036115015761150161148e565b506001019056fea2646970667358221220b49a146f369750b7055c494881ee723d063a73d92e8391e12d74eceb27ca91ef64736f6c63430008140033a2646970667358221220ea714517b77a730fcf3b4acad975476f67a3e6cd8f0f84834a89cd92be074e4b64736f6c63430008140033", - "deployedBytecode": "0x608060405260043610620001db5760003560e01c80638ed7e3f211620000ff578063cd5865791162000095578063dbc16976116200006c578063dbc1697614620006a7578063ee25560b14620006bf578063f5efcd7914620006f0578063fb570834146200071557600080fd5b8063cd5865791462000640578063d02103ca1462000657578063d3476afe146200068257600080fd5b8063bab161bf11620000d6578063bab161bf1462000596578063be5831c714620005ba578063cc46163214620005f6578063ccaa2d11146200061b57600080fd5b80638ed7e3f2146200052a578063aaa13cc2146200054c578063b8b284d0146200057157600080fd5b80633cbc795b11620001755780635ca1e165116200014c5780635ca1e165146200049b57806379e2cf9714620004b357806381b1c17414620004cb57806383f24403146200050557600080fd5b80633cbc795b14620003385780633e19704314620003855780634b2f336d146200047957600080fd5b8063240ff37811620001b6578063240ff37814620002695780632dfdf0b51462000280578063318aee3d14620002a75780633c351e10146200031657600080fd5b806315064c9614620001e05780632072f6c5146200021157806322e95f2c146200022b575b600080fd5b348015620001ed57600080fd5b50606854620001fc9060ff1681565b60405190151581526020015b60405180910390f35b3480156200021e57600080fd5b50620002296200073a565b005b3480156200023857600080fd5b50620002506200024a366004620037e3565b6200078b565b6040516001600160a01b03909116815260200162000208565b620002296200027a3660046200387a565b62000821565b3480156200028d57600080fd5b506200029860535481565b60405190815260200162000208565b348015620002b457600080fd5b50620002f1620002c6366004620038fe565b606b6020526000908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b0390911660208301520162000208565b3480156200032357600080fd5b50606d5462000250906001600160a01b031681565b3480156200034557600080fd5b50606d546200036f9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200162000208565b3480156200039257600080fd5b5062000298620003a436600462003935565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200048657600080fd5b50606e5462000250906001600160a01b031681565b348015620004a857600080fd5b50620002986200088a565b348015620004c057600080fd5b506200022962000970565b348015620004d857600080fd5b5062000250620004ea366004620039bf565b606a602052600090815260409020546001600160a01b031681565b3480156200051257600080fd5b506200029862000524366004620039ec565b620009aa565b3480156200053757600080fd5b50606c5462000250906001600160a01b031681565b3480156200055957600080fd5b50620002506200056b36600462003a30565b62000a8e565b3480156200057e57600080fd5b50620002296200059036600462003ae4565b62000c20565b348015620005a357600080fd5b506068546200036f90610100900463ffffffff1681565b348015620005c757600080fd5b506068546200036f90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b3480156200060357600080fd5b50620001fc6200061536600462003b71565b62000cfa565b3480156200062857600080fd5b50620002296200063a36600462003ba9565b62000d8b565b620002296200065136600462003ca5565b620014a6565b3480156200066457600080fd5b5060685462000250906501000000000090046001600160a01b031681565b3480156200068f57600080fd5b5062000229620006a136600462003d47565b62001a72565b348015620006b457600080fd5b506200022962001e50565b348015620006cc57600080fd5b5062000298620006de366004620039bf565b60696020526000908152604090205481565b348015620006fd57600080fd5b50620002296200070f36600462003ba9565b62001e9f565b3480156200072257600080fd5b50620001fc6200073436600462003dbf565b62002230565b606c546001600160a01b031633146200077f576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007896200224c565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091206000908152606a90915220546001600160a01b03165b92915050565b34158015906200083b5750606e546001600160a01b031615155b1562000873576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000883858534868686620022e0565b5050505050565b605354600090819081805b602081101562000967578083901c600116600103620008f85760338160208110620008c457620008c462003e0c565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062000925565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806200095e9062003e6a565b91505062000895565b50919392505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620007895762000789620023c8565b600083815b602081101562000a8557600163ffffffff8516821c8116900362000a2157848160208110620009e257620009e262003e0c565b60200201358260405160200162000a03929190918252602082015260400190565b60405160208183030381529060405280519060200120915062000a70565b8185826020811062000a375762000a3762003e0c565b602002013560405160200162000a57929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062000a7c8162003e6a565b915050620009af565b50949350505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201526000908190603801604051602081830303815290604052805190602001209050600060ff60f81b30836040518060200162000b2490620037a7565b601f1982820381018352601f90910116604081905262000b51908d908d908d908d908d9060200162003ed0565b60408051601f198184030181529082905262000b71929160200162003f37565b6040516020818303038152906040528051906020012060405160200162000bfa94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b606e546001600160a01b031662000c63576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606e546040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018690526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b15801562000cc957600080fd5b505af115801562000cde573d6000803e3d6000fd5b5050505062000cf2868686868686620022e0565b505050505050565b6068546000908190610100900463ffffffff1615801562000d21575063ffffffff83166001145b1562000d35575063ffffffff831662000d61565b62000d4c64010000000063ffffffff851662003f6a565b62000d5e9063ffffffff861662003f84565b90505b600881901c600090815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000dc9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161462000e13576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000f1c8c8c8c8c8c62000f1660008e8e8e8e8e8e8e60405162000e3992919062003f9a565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b62002496565b6001600160a01b0386166200109457606e546001600160a01b03166200100d5760006001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000f76576020820181803683370190505b5060405162000f86919062003fd9565b60006040518083038185875af1925050503d806000811462000fc5576040519150601f19603f3d011682016040523d82523d6000602084013e62000fca565b606091505b505090508062001006576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506200143c565b606e546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015260248201869052909116906340c10f1990604401600060405180830381600087803b1580156200107557600080fd5b505af11580156200108a573d6000803e3d6000fd5b505050506200143c565b606d546001600160a01b038781169116148015620010d45750606d5463ffffffff8881167401000000000000000000000000000000000000000090920416145b15620010ee5760006001600160a01b038516848262000f4b565b60685463ffffffff61010090910481169088160362001123576200111d6001600160a01b038716858562002674565b6200143c565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b16602482015260009060380160408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b031680620013bb5760008080620011cd86880188620040b2565b925092509250600085848484604051620011e790620037a7565b620011f59392919062004161565b8190604051809103906000f590508015801562001216573d6000803e3d6000fd5b506040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038c81166004830152602482018c9052919250908216906340c10f1990604401600060405180830381600087803b1580156200127f57600080fd5b505af115801562001294573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b604051620013a99594939291906200419e565b60405180910390a15050505062001439565b6040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152602482018790528216906340c10f1990604401600060405180830381600087803b1580156200141f57600080fd5b505af115801562001434573d6000803e3d6000fd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff1615620014e4576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620014ee62002724565b60685463ffffffff61010090910481169088160362001539576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806060876001600160a01b038816620015bd5788341462001588576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d546001600160a01b038116945074010000000000000000000000000000000000000000900463ffffffff1692506200190e565b3415620015f6576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606e546001600160a01b03908116908916036200168e576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018a90526001600160a01b03891690639dc29fac90604401600060405180830381600087803b1580156200166f57600080fd5b505af115801562001684573d6000803e3d6000fd5b505050506200190e565b6001600160a01b038089166000908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901562001764576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b90526001600160a01b038a1690639dc29fac90604401600060405180830381600087803b1580156200173757600080fd5b505af11580156200174c573d6000803e3d6000fd5b5050505080602001519450806000015193506200190c565b8515620017795762001779898b898962002799565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038b16906370a0823190602401602060405180830381865afa158015620017da573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620018009190620041d9565b9050620018196001600160a01b038b1633308e62002c4f565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038c16906370a0823190602401602060405180830381865afa1580156200187a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620018a09190620041d9565b9050620018ae8282620041f3565b6068548c9850610100900463ffffffff1696509350620018ce8762002ca2565b620018d98c62002dad565b620018e48d62002ead565b604051602001620018f89392919062004161565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e86886053546040516200195098979695949392919062004209565b60405180910390a162001a4a62001a44600085878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b62002f9c565b861562001a5b5762001a5b620023c8565b5050505062001a6960018055565b50505050505050565b600054610100900460ff161580801562001a935750600054600160ff909116105b8062001aaf5750303b15801562001aaf575060005460ff166001145b62001b41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801562001ba057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8916027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016848316179055606d541662001ca557606d5474010000000000000000000000000000000000000000900463ffffffff161562001c9f576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001ddb565b606d805463ffffffff861674010000000000000000000000000000000000000000027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b0388161717905560405160009060129062001d0d90620037a7565b6060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff909116604082015260e0018190604051809103906000f590508015801562001da1573d6000803e3d6000fd5b50606e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790555b62001de5620030b4565b801562000cf257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b606c546001600160a01b0316331462001e95576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200078962003157565b60685460ff161562001edd576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161462001f27576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001f4d8c8c8c8c8c62000f1660018e8e8e8e8e8e8e60405162000e3992919062003f9a565b606e546000906001600160a01b03166200203a57846001600160a01b031684888a868660405160240162001f85949392919062004275565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f2000000000000000000000000000000000000000000000000000000001790525162001fea919062003fd9565b60006040518083038185875af1925050503d806000811462002029576040519150601f19603f3d011682016040523d82523d6000602084013e6200202e565b606091505b5050809150506200218d565b606e546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260248201879052909116906340c10f1990604401600060405180830381600087803b158015620020a257600080fd5b505af1158015620020b7573d6000803e3d6000fd5b50505050846001600160a01b031687898585604051602401620020de949392919062004275565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f2000000000000000000000000000000000000000000000000000000001790525162002143919062003fd9565b6000604051808303816000865af19150503d806000811462002182576040519150601f19603f3d011682016040523d82523d6000602084013e62002187565b606091505b50909150505b80620021c5576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b60008162002240868686620009aa565b1490505b949350505050565b60685460ff16156200228a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b60685463ffffffff6101009091048116908716036200232b576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff163389898988886053546040516200238199989796959493929190620042b0565b60405180910390a1620023bc62001a446001606860019054906101000a900463ffffffff16338a8a8a898960405162000e3992919062003f9a565b821562000cf25762000cf25b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d620024416200088a565b6040518263ffffffff1660e01b81526004016200246091815260200190565b600060405180830381600087803b1580156200247b57600080fd5b505af115801562002490573d6000803e3d6000fd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091526000916501000000000090046001600160a01b03169063257b3632906084016020604051808303816000875af11580156200252c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620025529190620041d9565b9050806000036200258e576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080680100000000000000008716600103620025f357869150620025b6848a848962002230565b620025ed576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200265d565b602087901c620026058160016200431e565b9150879250620026246200261b868c86620009aa565b8a838962002230565b6200265b576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b620026698282620031e7565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526200271f9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152620032b1565b505050565b60026001540362002792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001b38565b6002600155565b6000620027aa600482848662004345565b620027b59162004371565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002a0057600080808080808062002818896004818d62004345565b810190620028279190620043ba565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161462002881576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0386163014620028c4576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a8514620028fe576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620029ac919062003fd9565b6000604051808303816000865af19150503d8060008114620029eb576040519150601f19603f3d011682016040523d82523d6000602084013e620029f0565b606091505b5050505050505050505062000883565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002a7c576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008080808080808062002a948a6004818e62004345565b81019062002aa3919062004415565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462002aff576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038716301462002b42576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002bf9919062003fd9565b6000604051808303816000865af19150503d806000811462002c38576040519150601f19603f3d011682016040523d82523d6000602084013e62002c3d565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052620024909085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401620026ba565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde0300000000000000000000000000000000000000000000000000000000179052905160609160009182916001600160a01b0386169162002d19919062003fd9565b600060405180830381855afa9150503d806000811462002d56576040519150601f19603f3d011682016040523d82523d6000602084013e62002d5b565b606091505b50915091508162002da2576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062002244565b6200224481620033b7565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b4100000000000000000000000000000000000000000000000000000000179052905160609160009182916001600160a01b0386169162002e24919062003fd9565b600060405180830381855afa9150503d806000811462002e61576040519150601f19603f3d011682016040523d82523d6000602084013e62002e66565b606091505b50915091508162002da2576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062002244565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce567000000000000000000000000000000000000000000000000000000001790529051600091829182916001600160a01b0386169162002f23919062003fd9565b600060405180830381855afa9150503d806000811462002f60576040519150601f19603f3d011682016040523d82523d6000602084013e62002f65565b606091505b509150915081801562002f79575080516020145b62002f8657601262002244565b80806020019051810190620022449190620044a1565b80600162002fad60206002620045fa565b62002fb99190620041f3565b6053541062002ff4576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000605360008154620030079062003e6a565b9182905550905060005b6020811015620030a3578082901c6001166001036200304957826033826020811062003041576200304162003e0c565b015550505050565b603381602081106200305f576200305f62003e0c565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925080806200309a9062003e6a565b91505062003011565b506200271f62004608565b60018055565b600054610100900460ff166200314d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001b38565b62000789620035a7565b60685460ff1662003194576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b606854600090610100900463ffffffff161580156200320c575063ffffffff82166001145b1562003220575063ffffffff82166200324c565b6200323764010000000063ffffffff841662003f6a565b620032499063ffffffff851662003f84565b90505b600881901c60008181526069602052604081208054600160ff861690811b9182189283905592909190818316900362001a69576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600062003308826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620036409092919063ffffffff16565b8051909150156200271f578080602001905181019062003329919062004637565b6200271f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001b38565b60606040825110620033d957818060200190518101906200081b919062004657565b8151602003620035695760005b60208110801562003431575082818151811062003407576200340762003e0c565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b156200344c5780620034438162003e6a565b915050620033e6565b806000036200349057505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115620034ae57620034ae62003faa565b6040519080825280601f01601f191660200182016040528015620034d9576020820181803683370190505b50905060005b828110156200356157848181518110620034fd57620034fd62003e0c565b602001015160f81c60f81b8282815181106200351d576200351d62003e0c565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080620035588162003e6a565b915050620034df565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b600054610100900460ff16620030ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001b38565b606062002244848460008585600080866001600160a01b031685876040516200366a919062003fd9565b60006040518083038185875af1925050503d8060008114620036a9576040519150601f19603f3d011682016040523d82523d6000602084013e620036ae565b606091505b5091509150620036c187838387620036cc565b979650505050505050565b606083156200375a57825160000362003752576001600160a01b0385163b62003752576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001b38565b508162002244565b620022448383815115620037715781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001b389190620046d7565b6119fa80620046ed83390190565b803563ffffffff81168114620035a257600080fd5b6001600160a01b0381168114620037e057600080fd5b50565b60008060408385031215620037f757600080fd5b6200380283620037b5565b915060208301356200381481620037ca565b809150509250929050565b8015158114620037e057600080fd5b60008083601f8401126200384157600080fd5b50813567ffffffffffffffff8111156200385a57600080fd5b6020830191508360208285010111156200387357600080fd5b9250929050565b6000806000806000608086880312156200389357600080fd5b6200389e86620037b5565b94506020860135620038b081620037ca565b93506040860135620038c2816200381f565b9250606086013567ffffffffffffffff811115620038df57600080fd5b620038ed888289016200382e565b969995985093965092949392505050565b6000602082840312156200391157600080fd5b81356200391e81620037ca565b9392505050565b60ff81168114620037e057600080fd5b600080600080600080600060e0888a0312156200395157600080fd5b87356200395e8162003925565b96506200396e60208901620037b5565b955060408801356200398081620037ca565b94506200399060608901620037b5565b93506080880135620039a281620037ca565b9699959850939692959460a0840135945060c09093013592915050565b600060208284031215620039d257600080fd5b5035919050565b8061040081018310156200081b57600080fd5b6000806000610440848603121562003a0357600080fd5b8335925062003a168560208601620039d9565b915062003a276104208501620037b5565b90509250925092565b600080600080600080600060a0888a03121562003a4c57600080fd5b62003a5788620037b5565b9650602088013562003a6981620037ca565b9550604088013567ffffffffffffffff8082111562003a8757600080fd5b62003a958b838c016200382e565b909750955060608a013591508082111562003aaf57600080fd5b5062003abe8a828b016200382e565b909450925050608088013562003ad48162003925565b8091505092959891949750929550565b60008060008060008060a0878903121562003afe57600080fd5b62003b0987620037b5565b9550602087013562003b1b81620037ca565b945060408701359350606087013562003b34816200381f565b9250608087013567ffffffffffffffff81111562003b5157600080fd5b62003b5f89828a016200382e565b979a9699509497509295939492505050565b6000806040838503121562003b8557600080fd5b62003b9083620037b5565b915062003ba060208401620037b5565b90509250929050565b6000806000806000806000806000806000806109208d8f03121562003bcd57600080fd5b62003bd98e8e620039d9565b9b5062003beb8e6104008f01620039d9565b9a506108008d013599506108208d013598506108408d0135975062003c146108608e01620037b5565b965062003c266108808e0135620037ca565b6108808d0135955062003c3d6108a08e01620037b5565b945062003c4f6108c08e0135620037ca565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111562003c7a57600080fd5b62003c8d8e6109008f01358f016200382e565b81935080925050509295989b509295989b509295989b565b600080600080600080600060c0888a03121562003cc157600080fd5b62003ccc88620037b5565b9650602088013562003cde81620037ca565b955060408801359450606088013562003cf781620037ca565b9350608088013562003d09816200381f565b925060a088013567ffffffffffffffff81111562003d2657600080fd5b62003d348a828b016200382e565b989b979a50959850939692959293505050565b600080600080600060a0868803121562003d6057600080fd5b62003d6b86620037b5565b9450602086013562003d7d81620037ca565b935062003d8d60408701620037b5565b9250606086013562003d9f81620037ca565b9150608086013562003db181620037ca565b809150509295509295909350565b600080600080610460858703121562003dd757600080fd5b8435935062003dea8660208701620039d9565b925062003dfb6104208601620037b5565b939692955092936104400135925050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003e9e5762003e9e62003e3b565b5060010190565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b60608152600062003ee660608301878962003ea5565b828103602084015262003efb81868862003ea5565b91505060ff831660408301529695505050505050565b60005b8381101562003f2e57818101518382015260200162003f14565b50506000910152565b6000835162003f4b81846020880162003f11565b83519083019062003f6181836020880162003f11565b01949350505050565b80820281158282048414176200081b576200081b62003e3b565b808201808211156200081b576200081b62003e3b565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825162003fed81846020870162003f11565b9190910192915050565b604051601f8201601f1916810167ffffffffffffffff8111828210171562004023576200402362003faa565b604052919050565b600067ffffffffffffffff82111562004048576200404862003faa565b50601f01601f191660200190565b600082601f8301126200406857600080fd5b81356200407f62004079826200402b565b62003ff7565b8181528460208386010111156200409557600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215620040c857600080fd5b833567ffffffffffffffff80821115620040e157600080fd5b620040ef8783880162004056565b945060208601359150808211156200410657600080fd5b50620041158682870162004056565b9250506040840135620041288162003925565b809150509250925092565b600081518084526200414d81602086016020860162003f11565b601f01601f19169290920160200192915050565b60608152600062004176606083018662004133565b82810360208401526200418a818662004133565b91505060ff83166040830152949350505050565b63ffffffff8616815260006001600160a01b03808716602084015280861660408401525060806060830152620036c160808301848662003ea5565b600060208284031215620041ec57600080fd5b5051919050565b818103818111156200081b576200081b62003e3b565b600061010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c08501526200425c8285018762004133565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201526000620042a660608301848662003ea5565b9695505050505050565b600061010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c085015262004304828501878962003ea5565b925080851660e085015250509a9950505050505050505050565b63ffffffff8181168382160190808211156200433e576200433e62003e3b565b5092915050565b600080858511156200435657600080fd5b838611156200436457600080fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620043b25780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a031215620043d657600080fd5b8735620043e381620037ca565b96506020880135620043f581620037ca565b955060408801359450606088013593506080880135620039a28162003925565b600080600080600080600080610100898b0312156200443357600080fd5b88356200444081620037ca565b975060208901356200445281620037ca565b96506040890135955060608901359450608089013562004472816200381f565b935060a0890135620044848162003925565b979a969950949793969295929450505060c08201359160e0013590565b600060208284031215620044b457600080fd5b81516200391e8162003925565b600181815b808511156200452057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562004504576200450462003e3b565b808516156200451257918102915b93841c9390800290620044c6565b509250929050565b60008262004539575060016200081b565b8162004548575060006200081b565b81600181146200456157600281146200456c576200458c565b60019150506200081b565b60ff84111562004580576200458062003e3b565b50506001821b6200081b565b5060208310610133831016604e8410600b8410161715620045b1575081810a6200081b565b620045bd8383620044c1565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620045f257620045f262003e3b565b029392505050565b60006200391e838362004528565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000602082840312156200464a57600080fd5b81516200391e816200381f565b6000602082840312156200466a57600080fd5b815167ffffffffffffffff8111156200468257600080fd5b8201601f810184136200469457600080fd5b8051620046a562004079826200402b565b818152856020838501011115620046bb57600080fd5b620046ce82602083016020860162003f11565b95945050505050565b6020815260006200391e60208301846200413356fe6101006040523480156200001257600080fd5b50604051620019fa380380620019fa83398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161153e620004bc6000396000610237015260008181610307015281816105c0015261068d0152600061053a0152600081816103790152610504015261153e6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b6040516101919190611278565b60405180910390f35b6101ad6101a836600461130d565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad610204366004611337565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad61027736600461130d565b61055c565b61028f61028a36600461130d565b6105a8565b005b6101c161029f366004611373565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d5366004611373565b60056020526000908152604090205481565b610184610666565b61028f6102fd36600461130d565b610675565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c36600461130d565b61072a565b6101ad61036f36600461130d565b6107e1565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611395565b6107ef565b6101c16103bc366004611408565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f9061143b565b80601f016020809104026020016040519081016040528092919081815260200182805461046b9061143b565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610af1565b60019150505b92915050565b6000336104ea858285610c71565b6104f5858585610d2e565b506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146105375761053246610f4f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a39087906114bd565b610af1565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106585760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106628282611017565b5050565b60606004805461043f9061143b565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146107205760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d42726964676500000000000000000000000000000000606482015260840161064f565b61066282826110f0565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107d45760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161064f565b6104f58286868403610af1565b6000336104d0818585610d2e565b834211156108645760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d697400000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866108be836114d0565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610929610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156109ed573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610a6857508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610ada5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e617475726500000000000000000000000000000000000000000000000000606482015260840161064f565b610ae58a8a8a610af1565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610b795760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8216610c025760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d285781811015610d1b5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161064f565b610d288484848403610af1565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610db75760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8216610e405760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610edc5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610d28565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610f7a610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff821661107a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161064f565b806002600082825461108c91906114bd565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166111795760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156112155760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610c64565b600060208083528351808285015260005b818110156112a557858101830151858201604001528201611289565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461130857600080fd5b919050565b6000806040838503121561132057600080fd5b611329836112e4565b946020939093013593505050565b60008060006060848603121561134c57600080fd5b611355846112e4565b9250611363602085016112e4565b9150604084013590509250925092565b60006020828403121561138557600080fd5b61138e826112e4565b9392505050565b600080600080600080600060e0888a0312156113b057600080fd5b6113b9886112e4565b96506113c7602089016112e4565b95506040880135945060608801359350608088013560ff811681146113eb57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561141b57600080fd5b611424836112e4565b9150611432602084016112e4565b90509250929050565b600181811c9082168061144f57607f821691505b602082108103611488577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d661148e565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036115015761150161148e565b506001019056fea2646970667358221220b49a146f369750b7055c494881ee723d063a73d92e8391e12d74eceb27ca91ef64736f6c63430008140033a2646970667358221220ea714517b77a730fcf3b4acad975476f67a3e6cd8f0f84834a89cd92be074e4b64736f6c63430008140033", + "bytecode": "0x608060405234801561000f575f80fd5b50614dcf8061001d5f395ff3fe60806040526004361062000163575f3560e01c806315064c9614620001675780632072f6c5146200019757806322e95f2c14620001b0578063240ff37814620001e35780632dfdf0b514620001fa578063318aee3d14620002205780633c351e10146200028c5780633cbc795b14620002ad5780633e19704314620002e85780634b2f336d146200030c5780635ca1e165146200032d57806379e2cf97146200034457806381b1c174146200035b57806383f2440314620003935780638ed7e3f214620003b7578063aaa13cc214620003d8578063b8b284d014620003fc578063bab161bf1462000420578063be5831c71462000443578063cc4616321462000468578063ccaa2d11146200048c578063cd58657914620004b0578063d02103ca14620004c7578063d3476afe14620004ef578063dbc169761462000513578063ee25560b146200052a578063f5efcd791462000559578063fb570834146200057d575b5f80fd5b34801562000173575f80fd5b50606854620001829060ff1681565b60405190151581526020015b60405180910390f35b348015620001a3575f80fd5b50620001ae620005a1565b005b348015620001bc575f80fd5b50620001d4620001ce366004620029be565b620005d9565b6040516200018e9190620029f8565b620001ae620001f436600462002a61565b62000629565b34801562000206575f80fd5b506200021160535481565b6040519081526020016200018e565b3480156200022c575f80fd5b50620002676200023e36600462002adf565b606b6020525f908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b039091166020830152016200018e565b34801562000298575f80fd5b50606d54620001d4906001600160a01b031681565b348015620002b9575f80fd5b50606d54620002d290600160a01b900463ffffffff1681565b60405163ffffffff90911681526020016200018e565b348015620002f4575f80fd5b50620002116200030636600462002b13565b62000679565b34801562000318575f80fd5b50606e54620001d4906001600160a01b031681565b34801562000339575f80fd5b506200021162000705565b34801562000350575f80fd5b50620001ae620007ec565b34801562000367575f80fd5b50620001d46200037936600462002b98565b606a6020525f90815260409020546001600160a01b031681565b3480156200039f575f80fd5b5062000211620003b136600462002bc2565b62000810565b348015620003c3575f80fd5b50606c54620001d4906001600160a01b031681565b348015620003e4575f80fd5b50620001d4620003f636600462002c03565b620008e3565b34801562000408575f80fd5b50620001ae6200041a36600462002caf565b620009f8565b3480156200042c575f80fd5b50606854620002d290610100900463ffffffff1681565b3480156200044f575f80fd5b50606854620002d290600160c81b900463ffffffff1681565b34801562000474575f80fd5b50620001826200048636600462002d36565b62000a9d565b34801562000498575f80fd5b50620001ae620004aa36600462002d6c565b62000b2b565b620001ae620004c136600462002e5f565b62001033565b348015620004d3575f80fd5b50606854620001d490600160281b90046001600160a01b031681565b348015620004fb575f80fd5b50620001ae6200050d36600462002efa565b62001441565b3480156200051f575f80fd5b50620001ae620016c3565b34801562000536575f80fd5b50620002116200054836600462002b98565b60696020525f908152604090205481565b34801562000565575f80fd5b50620001ae6200057736600462002d6c565b620016f9565b34801562000589575f80fd5b50620001826200059b36600462002f6e565b62001990565b606c546001600160a01b03163314620005cd57604051631736745960e31b815260040160405180910390fd5b620005d7620019ab565b565b5f606a5f8484604051602001620005f292919062002fb8565b60408051601f198184030181529181528151602092830120835290820192909252015f20546001600160a01b031690505b92915050565b3415801590620006435750606e546001600160a01b031615155b1562000662576040516301bd897160e61b815260040160405180910390fd5b6200067285853486868662001a07565b5050505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b6053545f90819081805b6020811015620007e3578083901c6001166001036200077257603381602081106200073e576200073e62002fe2565b0154846040516020016200075492919062002ff6565b604051602081830303815290604052805190602001209350620007a0565b83826040516020016200078792919062002ff6565b6040516020818303038152906040528051906020012093505b8182604051602001620007b592919062002ff6565b6040516020818303038152906040528051906020012091508080620007da9062003018565b9150506200070f565b50919392505050565b605354606854600160c81b900463ffffffff161015620005d757620005d762001ac4565b5f83815b6020811015620008da57600163ffffffff8516821c811690036200087e5784816020811062000847576200084762002fe2565b6020020135826040516020016200086092919062002ff6565b604051602081830303815290604052805190602001209150620008c5565b8185826020811062000894576200089462002fe2565b6020020135604051602001620008ac92919062002ff6565b6040516020818303038152906040528051906020012091505b80620008d18162003018565b91505062000814565b50949350505050565b5f808888604051602001620008fa92919062002fb8565b6040516020818303038152906040528051906020012090505f60ff60f81b3083604051806020016200092c9062002984565b601f1982820381018352601f90910116604081905262000959908d908d908d908d908d906020016200305b565b60408051601f1981840301815290829052620009799291602001620030bf565b60405160208183030381529060405280519060200120604051602001620009d294939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b606e546001600160a01b031662000a225760405163dde3cda760e01b815260040160405180910390fd5b606e54604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac9062000a569033908890600401620030f1565b5f604051808303815f87803b15801562000a6e575f80fd5b505af115801562000a81573d5f803e3d5ffd5b5050505062000a9586868686868662001a07565b505050505050565b6068545f908190610100900463ffffffff1615801562000ac3575063ffffffff83166001145b1562000ad7575063ffffffff831662000b02565b62000aed600160201b63ffffffff85166200310a565b62000aff9063ffffffff861662003124565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000b5057604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161462000b81576040516302caf51760e11b815260040160405180910390fd5b62000bba8c8c8c8c8c62000bb45f8e8e8e8e8e8e8e60405162000ba69291906200313a565b604051809103902062000679565b62001b5d565b6001600160a01b03861662000cf757606e546001600160a01b031662000c8e575f6001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000c13576020820181803683370190505b5060405162000c2391906200315d565b5f6040518083038185875af1925050503d805f811462000c5f576040519150601f19603f3d011682016040523d82523d5f602084013e62000c64565b606091505b505090508062000c8757604051630ce8f45160e31b815260040160405180910390fd5b5062000ff6565b606e546040516340c10f1960e01b81526001600160a01b03909116906340c10f199062000cc29087908790600401620030f1565b5f604051808303815f87803b15801562000cda575f80fd5b505af115801562000ced573d5f803e3d5ffd5b5050505062000ff6565b606d546001600160a01b03878116911614801562000d265750606d5463ffffffff888116600160a01b90920416145b1562000d3f575f6001600160a01b038516848262000be8565b60685463ffffffff61010090910481169088160362000d745762000d6e6001600160a01b038716858562001cb5565b62000ff6565b5f878760405160200162000d8a92919062002fb8565b60408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b03168062000f93575f808062000dd1868801886200322e565b9250925092505f8584848460405162000dea9062002984565b62000df893929190620032d6565b8190604051809103905ff590508015801562000e16573d5f803e3d5ffd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f199062000e4a908d908d90600401620030f1565b5f604051808303815f87803b15801562000e62575f80fd5b505af115801562000e75573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000f8195949392919062003312565b60405180910390a15050505062000ff3565b6040516340c10f1960e01b81526001600160a01b038216906340c10f199062000fc39089908990600401620030f1565b5f604051808303815f87803b15801562000fdb575f80fd5b505af115801562000fee573d5f803e3d5ffd5b505050505b50505b5f8051602062004d7a8339815191528a888887876040516200101d9594939291906200334c565b60405180910390a1505050505050505050505050565b60685460ff16156200105857604051630bc011ff60e21b815260040160405180910390fd5b6200106262001d14565b60685463ffffffff61010090910481169088160362001094576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b038816620010ed57883414620010c95760405163b89240f560e01b815260040160405180910390fd5b606d546001600160a01b0381169450600160a01b900463ffffffff169250620013c0565b34156200110d5760405163798ee6f160e01b815260040160405180910390fd5b606e546001600160a01b03908116908916036200118957604051632770a7eb60e21b81526001600160a01b03891690639dc29fac90620011549033908d90600401620030f1565b5f604051808303815f87803b1580156200116c575f80fd5b505af11580156200117f573d5f803e3d5ffd5b50505050620013c0565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b900490921691810182905290156200124057604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac90620011fe9033908e90600401620030f1565b5f604051808303815f87803b15801562001216575f80fd5b505af115801562001229573d5f803e3d5ffd5b5050505080602001519450805f01519350620013be565b8515620012555762001255898b898962001d6f565b6040516370a0823160e01b81525f906001600160a01b038b16906370a082319062001285903090600401620029f8565b602060405180830381865afa158015620012a1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620012c791906200337e565b9050620012e06001600160a01b038b1633308e620020c6565b6040516370a0823160e01b81525f906001600160a01b038c16906370a082319062001310903090600401620029f8565b602060405180830381865afa1580156200132c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200135291906200337e565b905062001360828262003396565b6068548c9850610100900463ffffffff1696509350620013808762002100565b6200138b8c620021c3565b620013968d6200227d565b604051602001620013aa93929190620032d6565b604051602081830303815290604052945050505b505b5f8051602062004d5a8339815191525f84868e8e8688605354604051620013ef989796959493929190620033ac565b60405180910390a162001419620014135f85878f8f87898051906020012062000679565b6200233a565b86156200142a576200142a62001ac4565b505050506200143860018055565b50505050505050565b5f54610100900460ff16158080156200146057505f54600160ff909116105b80620014845750620014723062002436565b1580156200148457505f5460ff166001145b620014ed5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156200150f575f805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff891602600160281b600160c81b03191617600160281b6001600160a01b038681169190910291909117909155606c80546001600160a01b031916848316179055606d5416620015a457606d54600160a01b900463ffffffff16156200159e57604051630d43a60960e11b815260040160405180910390fd5b6200166c565b606d805463ffffffff8616600160a01b026001600160c01b03199091166001600160a01b038816171790556040515f90601290620015e29062002984565b6060808252600d908201526c2bb930b83832b21022ba3432b960991b608082015260a060208201819052600490820152630ae8aa8960e31b60c082015260ff909116604082015260e0018190604051809103905ff59050801580156200164a573d5f803e3d5ffd5b50606e80546001600160a01b0319166001600160a01b03929092169190911790555b6200167662002445565b801562000a95575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b606c546001600160a01b03163314620016ef57604051631736745960e31b815260040160405180910390fd5b620005d762002478565b60685460ff16156200171e57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146200174f576040516302caf51760e11b815260040160405180910390fd5b620017758c8c8c8c8c62000bb460018e8e8e8e8e8e8e60405162000ba69291906200313a565b606e545f906001600160a01b03166200183057846001600160a01b031684888a8686604051602401620017ac949392919062003418565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b17905251620017e391906200315d565b5f6040518083038185875af1925050503d805f81146200181f576040519150601f19603f3d011682016040523d82523d5f602084013e62001824565b606091505b50508091505062001933565b606e546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990620018649088908890600401620030f1565b5f604051808303815f87803b1580156200187c575f80fd5b505af11580156200188f573d5f803e3d5ffd5b50505050846001600160a01b031687898585604051602401620018b6949392919062003418565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b17905251620018ed91906200315d565b5f604051808303815f865af19150503d805f811462001928576040519150601f19603f3d011682016040523d82523d5f602084013e6200192d565b606091505b50909150505b8062001952576040516337e391c360e01b815260040160405180910390fd5b5f8051602062004d7a8339815191528b89898888604051620019799594939291906200334c565b60405180910390a150505050505050505050505050565b5f816200199f86868662000810565b1490505b949350505050565b60685460ff1615620019d057604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff61010090910481169087160362001a39576040516302caf51760e11b815260040160405180910390fd5b5f8051602062004d5a8339815191526001606860019054906101000a900463ffffffff1633898989888860535460405162001a7d9998979695949392919062003454565b60405180910390a162001ab8620014136001606860019054906101000a900463ffffffff16338a8a8a898960405162000ba69291906200313a565b821562000a955762000a955b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d62001b0d62000705565b6040518263ffffffff1660e01b815260040162001b2c91815260200190565b5f604051808303815f87803b15801562001b44575f80fd5b505af115801562001b57573d5f803e3d5ffd5b50505050565b6068545f90600160281b90046001600160a01b031663257b363262001b838686620024d0565b6040518263ffffffff1660e01b815260040162001ba291815260200190565b6020604051808303815f875af115801562001bbf573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001be591906200337e565b9050805f0362001c0757604051622f6fad60e01b815260040160405180910390fd5b5f80600160401b871660010362001c4d5786915062001c29848a848962001990565b62001c47576040516338105f3b60e21b815260040160405180910390fd5b62001c9e565b602087901c62001c5f816001620034c2565b915087925062001c7e62001c75868c8662000810565b8a838962001990565b62001c9c576040516338105f3b60e21b815260040160405180910390fd5b505b62001caa828262002504565b505050505050505050565b62001d0f8363a9059cbb60e01b848460405160240162001cd7929190620030f1565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152620025b2565b505050565b60026001540362001d685760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401620014e4565b6002600155565b5f62001d7f6004828486620034e9565b62001d8a9162003512565b9050632afa533160e01b6001600160e01b031982160162001f26575f80808080808062001dbb896004818d620034e9565b81019062001dca919062003543565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161462001e0b5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038616301462001e355760405163750643af60e01b815260040160405180910390fd5b8a851462001e56576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e169162001ed691906200315d565b5f604051808303815f865af19150503d805f811462001f11576040519150601f19603f3d011682016040523d82523d5f602084013e62001f16565b606091505b5050505050505050505062000672565b6001600160e01b031981166323f2ebc360e21b1462001f5857604051637141605d60e11b815260040160405180910390fd5b5f8080808080808062001f6f8a6004818e620034e9565b81019062001f7e919062003599565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462001fc15760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038716301462001feb5760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f16916200207491906200315d565b5f604051808303815f865af19150503d805f8114620020af576040519150601f19603f3d011682016040523d82523d5f602084013e620020b4565b606091505b50505050505050505050505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905262001b579085906323b872dd60e01b9060840162001cd7565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b17905290516060915f9182916001600160a01b038616916200214891906200315d565b5f60405180830381855afa9150503d805f811462002182576040519150601f19603f3d011682016040523d82523d5f602084013e62002187565b606091505b509150915081620021b857604051806040016040528060078152602001664e4f5f4e414d4560c81b815250620019a3565b620019a3816200268a565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b17905290516060915f9182916001600160a01b038616916200220b91906200315d565b5f60405180830381855afa9150503d805f811462002245576040519150601f19603f3d011682016040523d82523d5f602084013e6200224a565b606091505b509150915081620021b857604051806040016040528060098152602001681393d7d4d6535093d360ba1b815250620019a3565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f91829182916001600160a01b03861691620022c491906200315d565b5f60405180830381855afa9150503d805f8114620022fe576040519150601f19603f3d011682016040523d82523d5f602084013e62002303565b606091505b509150915081801562002317575080516020145b62002324576012620019a3565b80806020019051810190620019a3919062003620565b8060016200234b6020600262003737565b62002357919062003396565b6053541062002379576040516377ae67b360e11b815260040160405180910390fd5b5f60535f81546200238a9062003018565b918290555090505f5b602081101562002425578082901c600116600103620023cb578260338260208110620023c357620023c362002fe2565b015550505050565b60338160208110620023e157620023e162002fe2565b015483604051602001620023f792919062002ff6565b60405160208183030381529060405280519060200120925080806200241c9062003018565b91505062002393565b5062001d0f62003744565b60018055565b6001600160a01b03163b151590565b5f54610100900460ff166200246e5760405162461bcd60e51b8152600401620014e49062003758565b620005d76200282e565b60685460ff166200249c57604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f8282604051602001620024e692919062002ff6565b60405160208183030381529060405280519060200120905092915050565b6068545f90610100900463ffffffff1615801562002528575063ffffffff82166001145b156200253c575063ffffffff821662002567565b62002552600160201b63ffffffff84166200310a565b620025649063ffffffff851662003124565b90505b600881901c5f8181526069602052604081208054600160ff861690811b918218928390559290919081831690036200143857604051630c8d9eab60e31b815260040160405180910390fd5b5f62002608826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620028579092919063ffffffff16565b80519091501562001d0f5780806020019051810190620026299190620037a3565b62001d0f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401620014e4565b60606040825110620026ac5781806020019051810190620006239190620037c1565b8151602003620027fb575f5b602081108015620026eb5750828181518110620026d957620026d962002fe2565b01602001516001600160f81b03191615155b15620027065780620026fd8162003018565b915050620026b8565b805f036200273e5750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b5f816001600160401b038111156200275a576200275a62003149565b6040519080825280601f01601f19166020018201604052801562002785576020820181803683370190505b5090505f5b82811015620027f357848181518110620027a857620027a862002fe2565b602001015160f81c60f81b828281518110620027c857620027c862002fe2565b60200101906001600160f81b03191690815f1a90535080620027ea8162003018565b9150506200278a565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b5f54610100900460ff16620024305760405162461bcd60e51b8152600401620014e49062003758565b6060620019a384845f85855f80866001600160a01b031685876040516200287f91906200315d565b5f6040518083038185875af1925050503d805f8114620028bb576040519150601f19603f3d011682016040523d82523d5f602084013e620028c0565b606091505b5091509150620028d387838387620028de565b979650505050505050565b60608315620029515782515f036200294957620028fb8562002436565b620029495760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620014e4565b5081620019a3565b620019a38383815115620029685781518083602001fd5b8060405162461bcd60e51b8152600401620014e491906200383b565b61150a806200385083390190565b803563ffffffff8116811462002829575f80fd5b6001600160a01b0381168114620029bb575f80fd5b50565b5f8060408385031215620029d0575f80fd5b620029db8362002992565b91506020830135620029ed81620029a6565b809150509250929050565b6001600160a01b0391909116815260200190565b8015158114620029bb575f80fd5b5f8083601f84011262002a2b575f80fd5b5081356001600160401b0381111562002a42575f80fd5b60208301915083602082850101111562002a5a575f80fd5b9250929050565b5f805f805f6080868803121562002a76575f80fd5b62002a818662002992565b9450602086013562002a9381620029a6565b9350604086013562002aa58162002a0c565b925060608601356001600160401b0381111562002ac0575f80fd5b62002ace8882890162002a1a565b969995985093965092949392505050565b5f6020828403121562002af0575f80fd5b813562002afd81620029a6565b9392505050565b60ff81168114620029bb575f80fd5b5f805f805f805f60e0888a03121562002b2a575f80fd5b873562002b378162002b04565b965062002b476020890162002992565b9550604088013562002b5981620029a6565b945062002b696060890162002992565b9350608088013562002b7b81620029a6565b9699959850939692959460a0840135945060c09093013592915050565b5f6020828403121562002ba9575f80fd5b5035919050565b80610400810183101562000623575f80fd5b5f805f610440848603121562002bd6575f80fd5b8335925062002be9856020860162002bb0565b915062002bfa610420850162002992565b90509250925092565b5f805f805f805f60a0888a03121562002c1a575f80fd5b62002c258862002992565b9650602088013562002c3781620029a6565b955060408801356001600160401b038082111562002c53575f80fd5b62002c618b838c0162002a1a565b909750955060608a013591508082111562002c7a575f80fd5b5062002c898a828b0162002a1a565b909450925050608088013562002c9f8162002b04565b8091505092959891949750929550565b5f805f805f8060a0878903121562002cc5575f80fd5b62002cd08762002992565b9550602087013562002ce281620029a6565b945060408701359350606087013562002cfb8162002a0c565b925060808701356001600160401b0381111562002d16575f80fd5b62002d2489828a0162002a1a565b979a9699509497509295939492505050565b5f806040838503121562002d48575f80fd5b62002d538362002992565b915062002d636020840162002992565b90509250929050565b5f805f805f805f805f805f806109208d8f03121562002d89575f80fd5b62002d958e8e62002bb0565b9b5062002da78e6104008f0162002bb0565b9a506108008d013599506108208d013598506108408d0135975062002dd06108608e0162002992565b965062002de26108808e0135620029a6565b6108808d0135955062002df96108a08e0162002992565b945062002e0b6108c08e0135620029a6565b6108c08d013593506108e08d013592506001600160401b036109008e0135111562002e34575f80fd5b62002e478e6109008f01358f0162002a1a565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121562002e76575f80fd5b62002e818862002992565b9650602088013562002e9381620029a6565b955060408801359450606088013562002eac81620029a6565b9350608088013562002ebe8162002a0c565b925060a08801356001600160401b0381111562002ed9575f80fd5b62002ee78a828b0162002a1a565b989b979a50959850939692959293505050565b5f805f805f60a0868803121562002f0f575f80fd5b62002f1a8662002992565b9450602086013562002f2c81620029a6565b935062002f3c6040870162002992565b9250606086013562002f4e81620029a6565b9150608086013562002f6081620029a6565b809150509295509295909350565b5f805f80610460858703121562002f83575f80fd5b8435935062002f96866020870162002bb0565b925062002fa7610420860162002992565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b634e487b7160e01b5f52603260045260245ffd5b918252602082015260400190565b634e487b7160e01b5f52601160045260245ffd5b5f600182016200302c576200302c62003004565b5060010190565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b606081525f6200307060608301878962003033565b82810360208401526200308581868862003033565b91505060ff831660408301529695505050505050565b5f5b83811015620030b75781810151838201526020016200309d565b50505f910152565b5f8351620030d28184602088016200309b565b835190830190620030e88183602088016200309b565b01949350505050565b6001600160a01b03929092168252602082015260400190565b808202811582820484141762000623576200062362003004565b8082018082111562000623576200062362003004565b818382375f9101908152919050565b634e487b7160e01b5f52604160045260245ffd5b5f8251620031708184602087016200309b565b9190910192915050565b604051601f8201601f191681016001600160401b0381118282101715620031a557620031a562003149565b604052919050565b5f6001600160401b03821115620031c857620031c862003149565b50601f01601f191660200190565b5f82601f830112620031e6575f80fd5b8135620031fd620031f782620031ad565b6200317a565b81815284602083860101111562003212575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003241575f80fd5b83356001600160401b038082111562003258575f80fd5b6200326687838801620031d6565b945060208601359150808211156200327c575f80fd5b506200328b86828701620031d6565b92505060408401356200329e8162002b04565b809150509250925092565b5f8151808452620032c28160208601602086016200309b565b601f01601f19169290920160200192915050565b606081525f620032ea6060830186620032a9565b8281036020840152620032fe8186620032a9565b91505060ff83166040830152949350505050565b63ffffffff861681526001600160a01b038581166020830152841660408201526080606082018190525f90620028d3908301848662003033565b94855263ffffffff9390931660208501526001600160a01b039182166040850152166060830152608082015260a00190565b5f602082840312156200338f575f80fd5b5051919050565b8181038181111562000623576200062362003004565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c083018190525f91620033ff84830187620032a9565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff841660208201526060604082018190525f906200344a908301848662003033565b9695505050505050565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c083018190525f91620034a8848301878962003033565b925080851660e085015250509a9950505050505050505050565b63ffffffff818116838216019080821115620034e257620034e262003004565b5092915050565b5f8085851115620034f8575f80fd5b8386111562003505575f80fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156200353b5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a0312156200355a575f80fd5b87356200356781620029a6565b965060208801356200357981620029a6565b95506040880135945060608801359350608088013562002b7b8162002b04565b5f805f805f805f80610100898b031215620035b2575f80fd5b8835620035bf81620029a6565b97506020890135620035d181620029a6565b965060408901359550606089013594506080890135620035f18162002a0c565b935060a0890135620036038162002b04565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562003631575f80fd5b815162002afd8162002b04565b600181815b808511156200367e57815f190482111562003662576200366262003004565b808516156200367057918102915b93841c939080029062003643565b509250929050565b5f82620036965750600162000623565b81620036a457505f62000623565b8160018114620036bd5760028114620036c857620036e8565b600191505062000623565b60ff841115620036dc57620036dc62003004565b50506001821b62000623565b5060208310610133831016604e8410600b84101617156200370d575081810a62000623565b6200371983836200363e565b805f19048211156200372f576200372f62003004565b029392505050565b5f62002afd838362003686565b634e487b7160e01b5f52600160045260245ffd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f60208284031215620037b4575f80fd5b815162002afd8162002a0c565b5f60208284031215620037d2575f80fd5b81516001600160401b03811115620037e8575f80fd5b8201601f81018413620037f9575f80fd5b80516200380a620031f782620031ad565b8181528560208385010111156200381f575f80fd5b620038328260208301602086016200309b565b95945050505050565b602081525f62002afd6020830184620032a956fe61010060405234801562000011575f80fd5b506040516200150a3803806200150a833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161106c6200049e5f395f61019e01525f818161025f0152818161047f01526104ed01525f61043101525f81816102c401526103fb015261106c5ff3fe608060405234801561000f575f80fd5b5060043610610105575f3560e01c806306fdde0314610109578063095ea7b31461012757806318160ddd1461014a57806320606b701461015c57806323b872dd1461017057806330adf81f14610183578063313ce567146101975780633644e515146101c857806339509351146101d057806340c10f19146101e357806370a08231146101f85780637ecebe001461022057806395d89b411461023f5780639dc29fac14610247578063a3c573eb1461025a578063a457c2d714610299578063a9059cbb146102ac578063cd0d0096146102bf578063d505accf146102e6578063dd62ed3e146102f9578063ffa1ad741461030c575b5f80fd5b61011161032c565b60405161011e9190610d8a565b60405180910390f35b61013a610135366004610df0565b6103bc565b604051901515815260200161011e565b6002545b60405190815260200161011e565b61014e5f8051602061101783398151915281565b61013a61017e366004610e18565b6103d5565b61014e5f80516020610ff783398151915281565b60405160ff7f000000000000000000000000000000000000000000000000000000000000000016815260200161011e565b61014e6103f8565b61013a6101de366004610df0565b610453565b6101f66101f1366004610df0565b610474565b005b61014e610206366004610e51565b6001600160a01b03165f9081526020819052604090205490565b61014e61022e366004610e51565b60056020525f908152604090205481565b6101116104d3565b6101f6610255366004610df0565b6104e2565b6102817f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161011e565b61013a6102a7366004610df0565b610534565b61013a6102ba366004610df0565b6105ae565b61014e7f000000000000000000000000000000000000000000000000000000000000000081565b6101f66102f4366004610e71565b6105bb565b61014e610307366004610ede565b6107de565b610111604051806040016040528060018152602001603160f81b81525081565b60606003805461033b90610f0f565b80601f016020809104026020016040519081016040528092919081815260200182805461036790610f0f565b80156103b25780601f10610389576101008083540402835291602001916103b2565b820191905f5260205f20905b81548152906001019060200180831161039557829003601f168201915b5050505050905090565b5f336103c9818585610808565b60019150505b92915050565b5f336103e285828561092c565b6103ed8585856109a4565b506001949350505050565b5f7f0000000000000000000000000000000000000000000000000000000000000000461461042e5761042946610b33565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b5f336103c981858561046583836107de565b61046f9190610f5b565b610808565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104c55760405162461bcd60e51b81526004016104bc90610f6e565b60405180910390fd5b6104cf8282610bcb565b5050565b60606004805461033b90610f0f565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461052a5760405162461bcd60e51b81526004016104bc90610f6e565b6104cf8282610c75565b5f338161054182866107de565b9050838110156105a15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104bc565b6103ed8286868403610808565b5f336103c98185856109a4565b834211156106175760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104bc565b6001600160a01b0387165f90815260056020526040812080545f80516020610ff7833981519152918a918a918a91908661065083610fbe565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6106ad6103f8565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f1981840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610735573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381161580159061076b5750896001600160a01b0316816001600160a01b0316145b6107c75760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104bc565b6107d28a8a8a610808565b50505050505050505050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661086a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104bc565b6001600160a01b0382166108cb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104bc565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b5f61093784846107de565b90505f19811461099e57818110156109915760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104bc565b61099e8484848403610808565b50505050565b6001600160a01b038316610a085760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104bc565b6001600160a01b038216610a6a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104bc565b6001600160a01b0383165f9081526020819052604090205481811015610ae15760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104bc565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290925f80516020610fd7833981519152910160405180910390a361099e565b5f5f80516020611017833981519152610b4a61032c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c215760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104bc565b8060025f828254610c329190610f5b565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481525f80516020610fd7833981519152910160405180910390a35050565b6001600160a01b038216610cd55760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104bc565b6001600160a01b0382165f9081526020819052604090205481811015610d485760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104bc565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192915f80516020610fd7833981519152910161091f565b5f6020808352835180828501525f5b81811015610db557858101830151858201604001528201610d99565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610deb575f80fd5b919050565b5f8060408385031215610e01575f80fd5b610e0a83610dd5565b946020939093013593505050565b5f805f60608486031215610e2a575f80fd5b610e3384610dd5565b9250610e4160208501610dd5565b9150604084013590509250925092565b5f60208284031215610e61575f80fd5b610e6a82610dd5565b9392505050565b5f805f805f805f60e0888a031215610e87575f80fd5b610e9088610dd5565b9650610e9e60208901610dd5565b95506040880135945060608801359350608088013560ff81168114610ec1575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215610eef575f80fd5b610ef883610dd5565b9150610f0660208401610dd5565b90509250929050565b600181811c90821680610f2357607f821691505b602082108103610f4157634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156103cf576103cf610f47565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b5f60018201610fcf57610fcf610f47565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa26469706673582212206c12be332dd873b7cf88c58dfc4762858b63e8ff3bf8563b47828a5a4272643b64736f6c63430008140033501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4da264697066735822122051dba377c61d9aeab1e5350deccb942cf9d53197269f447215de0dba14c9847264736f6c63430008140033", + "deployedBytecode": "0x60806040526004361062000163575f3560e01c806315064c9614620001675780632072f6c5146200019757806322e95f2c14620001b0578063240ff37814620001e35780632dfdf0b514620001fa578063318aee3d14620002205780633c351e10146200028c5780633cbc795b14620002ad5780633e19704314620002e85780634b2f336d146200030c5780635ca1e165146200032d57806379e2cf97146200034457806381b1c174146200035b57806383f2440314620003935780638ed7e3f214620003b7578063aaa13cc214620003d8578063b8b284d014620003fc578063bab161bf1462000420578063be5831c71462000443578063cc4616321462000468578063ccaa2d11146200048c578063cd58657914620004b0578063d02103ca14620004c7578063d3476afe14620004ef578063dbc169761462000513578063ee25560b146200052a578063f5efcd791462000559578063fb570834146200057d575b5f80fd5b34801562000173575f80fd5b50606854620001829060ff1681565b60405190151581526020015b60405180910390f35b348015620001a3575f80fd5b50620001ae620005a1565b005b348015620001bc575f80fd5b50620001d4620001ce366004620029be565b620005d9565b6040516200018e9190620029f8565b620001ae620001f436600462002a61565b62000629565b34801562000206575f80fd5b506200021160535481565b6040519081526020016200018e565b3480156200022c575f80fd5b50620002676200023e36600462002adf565b606b6020525f908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b039091166020830152016200018e565b34801562000298575f80fd5b50606d54620001d4906001600160a01b031681565b348015620002b9575f80fd5b50606d54620002d290600160a01b900463ffffffff1681565b60405163ffffffff90911681526020016200018e565b348015620002f4575f80fd5b50620002116200030636600462002b13565b62000679565b34801562000318575f80fd5b50606e54620001d4906001600160a01b031681565b34801562000339575f80fd5b506200021162000705565b34801562000350575f80fd5b50620001ae620007ec565b34801562000367575f80fd5b50620001d46200037936600462002b98565b606a6020525f90815260409020546001600160a01b031681565b3480156200039f575f80fd5b5062000211620003b136600462002bc2565b62000810565b348015620003c3575f80fd5b50606c54620001d4906001600160a01b031681565b348015620003e4575f80fd5b50620001d4620003f636600462002c03565b620008e3565b34801562000408575f80fd5b50620001ae6200041a36600462002caf565b620009f8565b3480156200042c575f80fd5b50606854620002d290610100900463ffffffff1681565b3480156200044f575f80fd5b50606854620002d290600160c81b900463ffffffff1681565b34801562000474575f80fd5b50620001826200048636600462002d36565b62000a9d565b34801562000498575f80fd5b50620001ae620004aa36600462002d6c565b62000b2b565b620001ae620004c136600462002e5f565b62001033565b348015620004d3575f80fd5b50606854620001d490600160281b90046001600160a01b031681565b348015620004fb575f80fd5b50620001ae6200050d36600462002efa565b62001441565b3480156200051f575f80fd5b50620001ae620016c3565b34801562000536575f80fd5b50620002116200054836600462002b98565b60696020525f908152604090205481565b34801562000565575f80fd5b50620001ae6200057736600462002d6c565b620016f9565b34801562000589575f80fd5b50620001826200059b36600462002f6e565b62001990565b606c546001600160a01b03163314620005cd57604051631736745960e31b815260040160405180910390fd5b620005d7620019ab565b565b5f606a5f8484604051602001620005f292919062002fb8565b60408051601f198184030181529181528151602092830120835290820192909252015f20546001600160a01b031690505b92915050565b3415801590620006435750606e546001600160a01b031615155b1562000662576040516301bd897160e61b815260040160405180910390fd5b6200067285853486868662001a07565b5050505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b6053545f90819081805b6020811015620007e3578083901c6001166001036200077257603381602081106200073e576200073e62002fe2565b0154846040516020016200075492919062002ff6565b604051602081830303815290604052805190602001209350620007a0565b83826040516020016200078792919062002ff6565b6040516020818303038152906040528051906020012093505b8182604051602001620007b592919062002ff6565b6040516020818303038152906040528051906020012091508080620007da9062003018565b9150506200070f565b50919392505050565b605354606854600160c81b900463ffffffff161015620005d757620005d762001ac4565b5f83815b6020811015620008da57600163ffffffff8516821c811690036200087e5784816020811062000847576200084762002fe2565b6020020135826040516020016200086092919062002ff6565b604051602081830303815290604052805190602001209150620008c5565b8185826020811062000894576200089462002fe2565b6020020135604051602001620008ac92919062002ff6565b6040516020818303038152906040528051906020012091505b80620008d18162003018565b91505062000814565b50949350505050565b5f808888604051602001620008fa92919062002fb8565b6040516020818303038152906040528051906020012090505f60ff60f81b3083604051806020016200092c9062002984565b601f1982820381018352601f90910116604081905262000959908d908d908d908d908d906020016200305b565b60408051601f1981840301815290829052620009799291602001620030bf565b60405160208183030381529060405280519060200120604051602001620009d294939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b606e546001600160a01b031662000a225760405163dde3cda760e01b815260040160405180910390fd5b606e54604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac9062000a569033908890600401620030f1565b5f604051808303815f87803b15801562000a6e575f80fd5b505af115801562000a81573d5f803e3d5ffd5b5050505062000a9586868686868662001a07565b505050505050565b6068545f908190610100900463ffffffff1615801562000ac3575063ffffffff83166001145b1562000ad7575063ffffffff831662000b02565b62000aed600160201b63ffffffff85166200310a565b62000aff9063ffffffff861662003124565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000b5057604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161462000b81576040516302caf51760e11b815260040160405180910390fd5b62000bba8c8c8c8c8c62000bb45f8e8e8e8e8e8e8e60405162000ba69291906200313a565b604051809103902062000679565b62001b5d565b6001600160a01b03861662000cf757606e546001600160a01b031662000c8e575f6001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000c13576020820181803683370190505b5060405162000c2391906200315d565b5f6040518083038185875af1925050503d805f811462000c5f576040519150601f19603f3d011682016040523d82523d5f602084013e62000c64565b606091505b505090508062000c8757604051630ce8f45160e31b815260040160405180910390fd5b5062000ff6565b606e546040516340c10f1960e01b81526001600160a01b03909116906340c10f199062000cc29087908790600401620030f1565b5f604051808303815f87803b15801562000cda575f80fd5b505af115801562000ced573d5f803e3d5ffd5b5050505062000ff6565b606d546001600160a01b03878116911614801562000d265750606d5463ffffffff888116600160a01b90920416145b1562000d3f575f6001600160a01b038516848262000be8565b60685463ffffffff61010090910481169088160362000d745762000d6e6001600160a01b038716858562001cb5565b62000ff6565b5f878760405160200162000d8a92919062002fb8565b60408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b03168062000f93575f808062000dd1868801886200322e565b9250925092505f8584848460405162000dea9062002984565b62000df893929190620032d6565b8190604051809103905ff590508015801562000e16573d5f803e3d5ffd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f199062000e4a908d908d90600401620030f1565b5f604051808303815f87803b15801562000e62575f80fd5b505af115801562000e75573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000f8195949392919062003312565b60405180910390a15050505062000ff3565b6040516340c10f1960e01b81526001600160a01b038216906340c10f199062000fc39089908990600401620030f1565b5f604051808303815f87803b15801562000fdb575f80fd5b505af115801562000fee573d5f803e3d5ffd5b505050505b50505b5f8051602062004d7a8339815191528a888887876040516200101d9594939291906200334c565b60405180910390a1505050505050505050505050565b60685460ff16156200105857604051630bc011ff60e21b815260040160405180910390fd5b6200106262001d14565b60685463ffffffff61010090910481169088160362001094576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b038816620010ed57883414620010c95760405163b89240f560e01b815260040160405180910390fd5b606d546001600160a01b0381169450600160a01b900463ffffffff169250620013c0565b34156200110d5760405163798ee6f160e01b815260040160405180910390fd5b606e546001600160a01b03908116908916036200118957604051632770a7eb60e21b81526001600160a01b03891690639dc29fac90620011549033908d90600401620030f1565b5f604051808303815f87803b1580156200116c575f80fd5b505af11580156200117f573d5f803e3d5ffd5b50505050620013c0565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b900490921691810182905290156200124057604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac90620011fe9033908e90600401620030f1565b5f604051808303815f87803b15801562001216575f80fd5b505af115801562001229573d5f803e3d5ffd5b5050505080602001519450805f01519350620013be565b8515620012555762001255898b898962001d6f565b6040516370a0823160e01b81525f906001600160a01b038b16906370a082319062001285903090600401620029f8565b602060405180830381865afa158015620012a1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620012c791906200337e565b9050620012e06001600160a01b038b1633308e620020c6565b6040516370a0823160e01b81525f906001600160a01b038c16906370a082319062001310903090600401620029f8565b602060405180830381865afa1580156200132c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200135291906200337e565b905062001360828262003396565b6068548c9850610100900463ffffffff1696509350620013808762002100565b6200138b8c620021c3565b620013968d6200227d565b604051602001620013aa93929190620032d6565b604051602081830303815290604052945050505b505b5f8051602062004d5a8339815191525f84868e8e8688605354604051620013ef989796959493929190620033ac565b60405180910390a162001419620014135f85878f8f87898051906020012062000679565b6200233a565b86156200142a576200142a62001ac4565b505050506200143860018055565b50505050505050565b5f54610100900460ff16158080156200146057505f54600160ff909116105b80620014845750620014723062002436565b1580156200148457505f5460ff166001145b620014ed5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156200150f575f805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff891602600160281b600160c81b03191617600160281b6001600160a01b038681169190910291909117909155606c80546001600160a01b031916848316179055606d5416620015a457606d54600160a01b900463ffffffff16156200159e57604051630d43a60960e11b815260040160405180910390fd5b6200166c565b606d805463ffffffff8616600160a01b026001600160c01b03199091166001600160a01b038816171790556040515f90601290620015e29062002984565b6060808252600d908201526c2bb930b83832b21022ba3432b960991b608082015260a060208201819052600490820152630ae8aa8960e31b60c082015260ff909116604082015260e0018190604051809103905ff59050801580156200164a573d5f803e3d5ffd5b50606e80546001600160a01b0319166001600160a01b03929092169190911790555b6200167662002445565b801562000a95575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b606c546001600160a01b03163314620016ef57604051631736745960e31b815260040160405180910390fd5b620005d762002478565b60685460ff16156200171e57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146200174f576040516302caf51760e11b815260040160405180910390fd5b620017758c8c8c8c8c62000bb460018e8e8e8e8e8e8e60405162000ba69291906200313a565b606e545f906001600160a01b03166200183057846001600160a01b031684888a8686604051602401620017ac949392919062003418565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b17905251620017e391906200315d565b5f6040518083038185875af1925050503d805f81146200181f576040519150601f19603f3d011682016040523d82523d5f602084013e62001824565b606091505b50508091505062001933565b606e546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990620018649088908890600401620030f1565b5f604051808303815f87803b1580156200187c575f80fd5b505af11580156200188f573d5f803e3d5ffd5b50505050846001600160a01b031687898585604051602401620018b6949392919062003418565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b17905251620018ed91906200315d565b5f604051808303815f865af19150503d805f811462001928576040519150601f19603f3d011682016040523d82523d5f602084013e6200192d565b606091505b50909150505b8062001952576040516337e391c360e01b815260040160405180910390fd5b5f8051602062004d7a8339815191528b89898888604051620019799594939291906200334c565b60405180910390a150505050505050505050505050565b5f816200199f86868662000810565b1490505b949350505050565b60685460ff1615620019d057604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff61010090910481169087160362001a39576040516302caf51760e11b815260040160405180910390fd5b5f8051602062004d5a8339815191526001606860019054906101000a900463ffffffff1633898989888860535460405162001a7d9998979695949392919062003454565b60405180910390a162001ab8620014136001606860019054906101000a900463ffffffff16338a8a8a898960405162000ba69291906200313a565b821562000a955762000a955b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d62001b0d62000705565b6040518263ffffffff1660e01b815260040162001b2c91815260200190565b5f604051808303815f87803b15801562001b44575f80fd5b505af115801562001b57573d5f803e3d5ffd5b50505050565b6068545f90600160281b90046001600160a01b031663257b363262001b838686620024d0565b6040518263ffffffff1660e01b815260040162001ba291815260200190565b6020604051808303815f875af115801562001bbf573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001be591906200337e565b9050805f0362001c0757604051622f6fad60e01b815260040160405180910390fd5b5f80600160401b871660010362001c4d5786915062001c29848a848962001990565b62001c47576040516338105f3b60e21b815260040160405180910390fd5b62001c9e565b602087901c62001c5f816001620034c2565b915087925062001c7e62001c75868c8662000810565b8a838962001990565b62001c9c576040516338105f3b60e21b815260040160405180910390fd5b505b62001caa828262002504565b505050505050505050565b62001d0f8363a9059cbb60e01b848460405160240162001cd7929190620030f1565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152620025b2565b505050565b60026001540362001d685760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401620014e4565b6002600155565b5f62001d7f6004828486620034e9565b62001d8a9162003512565b9050632afa533160e01b6001600160e01b031982160162001f26575f80808080808062001dbb896004818d620034e9565b81019062001dca919062003543565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161462001e0b5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038616301462001e355760405163750643af60e01b815260040160405180910390fd5b8a851462001e56576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e169162001ed691906200315d565b5f604051808303815f865af19150503d805f811462001f11576040519150601f19603f3d011682016040523d82523d5f602084013e62001f16565b606091505b5050505050505050505062000672565b6001600160e01b031981166323f2ebc360e21b1462001f5857604051637141605d60e11b815260040160405180910390fd5b5f8080808080808062001f6f8a6004818e620034e9565b81019062001f7e919062003599565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462001fc15760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038716301462001feb5760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f16916200207491906200315d565b5f604051808303815f865af19150503d805f8114620020af576040519150601f19603f3d011682016040523d82523d5f602084013e620020b4565b606091505b50505050505050505050505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905262001b579085906323b872dd60e01b9060840162001cd7565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b17905290516060915f9182916001600160a01b038616916200214891906200315d565b5f60405180830381855afa9150503d805f811462002182576040519150601f19603f3d011682016040523d82523d5f602084013e62002187565b606091505b509150915081620021b857604051806040016040528060078152602001664e4f5f4e414d4560c81b815250620019a3565b620019a3816200268a565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b17905290516060915f9182916001600160a01b038616916200220b91906200315d565b5f60405180830381855afa9150503d805f811462002245576040519150601f19603f3d011682016040523d82523d5f602084013e6200224a565b606091505b509150915081620021b857604051806040016040528060098152602001681393d7d4d6535093d360ba1b815250620019a3565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f91829182916001600160a01b03861691620022c491906200315d565b5f60405180830381855afa9150503d805f8114620022fe576040519150601f19603f3d011682016040523d82523d5f602084013e62002303565b606091505b509150915081801562002317575080516020145b62002324576012620019a3565b80806020019051810190620019a3919062003620565b8060016200234b6020600262003737565b62002357919062003396565b6053541062002379576040516377ae67b360e11b815260040160405180910390fd5b5f60535f81546200238a9062003018565b918290555090505f5b602081101562002425578082901c600116600103620023cb578260338260208110620023c357620023c362002fe2565b015550505050565b60338160208110620023e157620023e162002fe2565b015483604051602001620023f792919062002ff6565b60405160208183030381529060405280519060200120925080806200241c9062003018565b91505062002393565b5062001d0f62003744565b60018055565b6001600160a01b03163b151590565b5f54610100900460ff166200246e5760405162461bcd60e51b8152600401620014e49062003758565b620005d76200282e565b60685460ff166200249c57604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f8282604051602001620024e692919062002ff6565b60405160208183030381529060405280519060200120905092915050565b6068545f90610100900463ffffffff1615801562002528575063ffffffff82166001145b156200253c575063ffffffff821662002567565b62002552600160201b63ffffffff84166200310a565b620025649063ffffffff851662003124565b90505b600881901c5f8181526069602052604081208054600160ff861690811b918218928390559290919081831690036200143857604051630c8d9eab60e31b815260040160405180910390fd5b5f62002608826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620028579092919063ffffffff16565b80519091501562001d0f5780806020019051810190620026299190620037a3565b62001d0f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401620014e4565b60606040825110620026ac5781806020019051810190620006239190620037c1565b8151602003620027fb575f5b602081108015620026eb5750828181518110620026d957620026d962002fe2565b01602001516001600160f81b03191615155b15620027065780620026fd8162003018565b915050620026b8565b805f036200273e5750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b5f816001600160401b038111156200275a576200275a62003149565b6040519080825280601f01601f19166020018201604052801562002785576020820181803683370190505b5090505f5b82811015620027f357848181518110620027a857620027a862002fe2565b602001015160f81c60f81b828281518110620027c857620027c862002fe2565b60200101906001600160f81b03191690815f1a90535080620027ea8162003018565b9150506200278a565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b5f54610100900460ff16620024305760405162461bcd60e51b8152600401620014e49062003758565b6060620019a384845f85855f80866001600160a01b031685876040516200287f91906200315d565b5f6040518083038185875af1925050503d805f8114620028bb576040519150601f19603f3d011682016040523d82523d5f602084013e620028c0565b606091505b5091509150620028d387838387620028de565b979650505050505050565b60608315620029515782515f036200294957620028fb8562002436565b620029495760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620014e4565b5081620019a3565b620019a38383815115620029685781518083602001fd5b8060405162461bcd60e51b8152600401620014e491906200383b565b61150a806200385083390190565b803563ffffffff8116811462002829575f80fd5b6001600160a01b0381168114620029bb575f80fd5b50565b5f8060408385031215620029d0575f80fd5b620029db8362002992565b91506020830135620029ed81620029a6565b809150509250929050565b6001600160a01b0391909116815260200190565b8015158114620029bb575f80fd5b5f8083601f84011262002a2b575f80fd5b5081356001600160401b0381111562002a42575f80fd5b60208301915083602082850101111562002a5a575f80fd5b9250929050565b5f805f805f6080868803121562002a76575f80fd5b62002a818662002992565b9450602086013562002a9381620029a6565b9350604086013562002aa58162002a0c565b925060608601356001600160401b0381111562002ac0575f80fd5b62002ace8882890162002a1a565b969995985093965092949392505050565b5f6020828403121562002af0575f80fd5b813562002afd81620029a6565b9392505050565b60ff81168114620029bb575f80fd5b5f805f805f805f60e0888a03121562002b2a575f80fd5b873562002b378162002b04565b965062002b476020890162002992565b9550604088013562002b5981620029a6565b945062002b696060890162002992565b9350608088013562002b7b81620029a6565b9699959850939692959460a0840135945060c09093013592915050565b5f6020828403121562002ba9575f80fd5b5035919050565b80610400810183101562000623575f80fd5b5f805f610440848603121562002bd6575f80fd5b8335925062002be9856020860162002bb0565b915062002bfa610420850162002992565b90509250925092565b5f805f805f805f60a0888a03121562002c1a575f80fd5b62002c258862002992565b9650602088013562002c3781620029a6565b955060408801356001600160401b038082111562002c53575f80fd5b62002c618b838c0162002a1a565b909750955060608a013591508082111562002c7a575f80fd5b5062002c898a828b0162002a1a565b909450925050608088013562002c9f8162002b04565b8091505092959891949750929550565b5f805f805f8060a0878903121562002cc5575f80fd5b62002cd08762002992565b9550602087013562002ce281620029a6565b945060408701359350606087013562002cfb8162002a0c565b925060808701356001600160401b0381111562002d16575f80fd5b62002d2489828a0162002a1a565b979a9699509497509295939492505050565b5f806040838503121562002d48575f80fd5b62002d538362002992565b915062002d636020840162002992565b90509250929050565b5f805f805f805f805f805f806109208d8f03121562002d89575f80fd5b62002d958e8e62002bb0565b9b5062002da78e6104008f0162002bb0565b9a506108008d013599506108208d013598506108408d0135975062002dd06108608e0162002992565b965062002de26108808e0135620029a6565b6108808d0135955062002df96108a08e0162002992565b945062002e0b6108c08e0135620029a6565b6108c08d013593506108e08d013592506001600160401b036109008e0135111562002e34575f80fd5b62002e478e6109008f01358f0162002a1a565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121562002e76575f80fd5b62002e818862002992565b9650602088013562002e9381620029a6565b955060408801359450606088013562002eac81620029a6565b9350608088013562002ebe8162002a0c565b925060a08801356001600160401b0381111562002ed9575f80fd5b62002ee78a828b0162002a1a565b989b979a50959850939692959293505050565b5f805f805f60a0868803121562002f0f575f80fd5b62002f1a8662002992565b9450602086013562002f2c81620029a6565b935062002f3c6040870162002992565b9250606086013562002f4e81620029a6565b9150608086013562002f6081620029a6565b809150509295509295909350565b5f805f80610460858703121562002f83575f80fd5b8435935062002f96866020870162002bb0565b925062002fa7610420860162002992565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b634e487b7160e01b5f52603260045260245ffd5b918252602082015260400190565b634e487b7160e01b5f52601160045260245ffd5b5f600182016200302c576200302c62003004565b5060010190565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b606081525f6200307060608301878962003033565b82810360208401526200308581868862003033565b91505060ff831660408301529695505050505050565b5f5b83811015620030b75781810151838201526020016200309d565b50505f910152565b5f8351620030d28184602088016200309b565b835190830190620030e88183602088016200309b565b01949350505050565b6001600160a01b03929092168252602082015260400190565b808202811582820484141762000623576200062362003004565b8082018082111562000623576200062362003004565b818382375f9101908152919050565b634e487b7160e01b5f52604160045260245ffd5b5f8251620031708184602087016200309b565b9190910192915050565b604051601f8201601f191681016001600160401b0381118282101715620031a557620031a562003149565b604052919050565b5f6001600160401b03821115620031c857620031c862003149565b50601f01601f191660200190565b5f82601f830112620031e6575f80fd5b8135620031fd620031f782620031ad565b6200317a565b81815284602083860101111562003212575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003241575f80fd5b83356001600160401b038082111562003258575f80fd5b6200326687838801620031d6565b945060208601359150808211156200327c575f80fd5b506200328b86828701620031d6565b92505060408401356200329e8162002b04565b809150509250925092565b5f8151808452620032c28160208601602086016200309b565b601f01601f19169290920160200192915050565b606081525f620032ea6060830186620032a9565b8281036020840152620032fe8186620032a9565b91505060ff83166040830152949350505050565b63ffffffff861681526001600160a01b038581166020830152841660408201526080606082018190525f90620028d3908301848662003033565b94855263ffffffff9390931660208501526001600160a01b039182166040850152166060830152608082015260a00190565b5f602082840312156200338f575f80fd5b5051919050565b8181038181111562000623576200062362003004565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c083018190525f91620033ff84830187620032a9565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff841660208201526060604082018190525f906200344a908301848662003033565b9695505050505050565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c083018190525f91620034a8848301878962003033565b925080851660e085015250509a9950505050505050505050565b63ffffffff818116838216019080821115620034e257620034e262003004565b5092915050565b5f8085851115620034f8575f80fd5b8386111562003505575f80fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156200353b5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a0312156200355a575f80fd5b87356200356781620029a6565b965060208801356200357981620029a6565b95506040880135945060608801359350608088013562002b7b8162002b04565b5f805f805f805f80610100898b031215620035b2575f80fd5b8835620035bf81620029a6565b97506020890135620035d181620029a6565b965060408901359550606089013594506080890135620035f18162002a0c565b935060a0890135620036038162002b04565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562003631575f80fd5b815162002afd8162002b04565b600181815b808511156200367e57815f190482111562003662576200366262003004565b808516156200367057918102915b93841c939080029062003643565b509250929050565b5f82620036965750600162000623565b81620036a457505f62000623565b8160018114620036bd5760028114620036c857620036e8565b600191505062000623565b60ff841115620036dc57620036dc62003004565b50506001821b62000623565b5060208310610133831016604e8410600b84101617156200370d575081810a62000623565b6200371983836200363e565b805f19048211156200372f576200372f62003004565b029392505050565b5f62002afd838362003686565b634e487b7160e01b5f52600160045260245ffd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f60208284031215620037b4575f80fd5b815162002afd8162002a0c565b5f60208284031215620037d2575f80fd5b81516001600160401b03811115620037e8575f80fd5b8201601f81018413620037f9575f80fd5b80516200380a620031f782620031ad565b8181528560208385010111156200381f575f80fd5b620038328260208301602086016200309b565b95945050505050565b602081525f62002afd6020830184620032a956fe61010060405234801562000011575f80fd5b506040516200150a3803806200150a833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161106c6200049e5f395f61019e01525f818161025f0152818161047f01526104ed01525f61043101525f81816102c401526103fb015261106c5ff3fe608060405234801561000f575f80fd5b5060043610610105575f3560e01c806306fdde0314610109578063095ea7b31461012757806318160ddd1461014a57806320606b701461015c57806323b872dd1461017057806330adf81f14610183578063313ce567146101975780633644e515146101c857806339509351146101d057806340c10f19146101e357806370a08231146101f85780637ecebe001461022057806395d89b411461023f5780639dc29fac14610247578063a3c573eb1461025a578063a457c2d714610299578063a9059cbb146102ac578063cd0d0096146102bf578063d505accf146102e6578063dd62ed3e146102f9578063ffa1ad741461030c575b5f80fd5b61011161032c565b60405161011e9190610d8a565b60405180910390f35b61013a610135366004610df0565b6103bc565b604051901515815260200161011e565b6002545b60405190815260200161011e565b61014e5f8051602061101783398151915281565b61013a61017e366004610e18565b6103d5565b61014e5f80516020610ff783398151915281565b60405160ff7f000000000000000000000000000000000000000000000000000000000000000016815260200161011e565b61014e6103f8565b61013a6101de366004610df0565b610453565b6101f66101f1366004610df0565b610474565b005b61014e610206366004610e51565b6001600160a01b03165f9081526020819052604090205490565b61014e61022e366004610e51565b60056020525f908152604090205481565b6101116104d3565b6101f6610255366004610df0565b6104e2565b6102817f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161011e565b61013a6102a7366004610df0565b610534565b61013a6102ba366004610df0565b6105ae565b61014e7f000000000000000000000000000000000000000000000000000000000000000081565b6101f66102f4366004610e71565b6105bb565b61014e610307366004610ede565b6107de565b610111604051806040016040528060018152602001603160f81b81525081565b60606003805461033b90610f0f565b80601f016020809104026020016040519081016040528092919081815260200182805461036790610f0f565b80156103b25780601f10610389576101008083540402835291602001916103b2565b820191905f5260205f20905b81548152906001019060200180831161039557829003601f168201915b5050505050905090565b5f336103c9818585610808565b60019150505b92915050565b5f336103e285828561092c565b6103ed8585856109a4565b506001949350505050565b5f7f0000000000000000000000000000000000000000000000000000000000000000461461042e5761042946610b33565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b5f336103c981858561046583836107de565b61046f9190610f5b565b610808565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104c55760405162461bcd60e51b81526004016104bc90610f6e565b60405180910390fd5b6104cf8282610bcb565b5050565b60606004805461033b90610f0f565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461052a5760405162461bcd60e51b81526004016104bc90610f6e565b6104cf8282610c75565b5f338161054182866107de565b9050838110156105a15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104bc565b6103ed8286868403610808565b5f336103c98185856109a4565b834211156106175760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104bc565b6001600160a01b0387165f90815260056020526040812080545f80516020610ff7833981519152918a918a918a91908661065083610fbe565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6106ad6103f8565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f1981840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610735573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381161580159061076b5750896001600160a01b0316816001600160a01b0316145b6107c75760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104bc565b6107d28a8a8a610808565b50505050505050505050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661086a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104bc565b6001600160a01b0382166108cb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104bc565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b5f61093784846107de565b90505f19811461099e57818110156109915760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104bc565b61099e8484848403610808565b50505050565b6001600160a01b038316610a085760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104bc565b6001600160a01b038216610a6a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104bc565b6001600160a01b0383165f9081526020819052604090205481811015610ae15760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104bc565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290925f80516020610fd7833981519152910160405180910390a361099e565b5f5f80516020611017833981519152610b4a61032c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c215760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104bc565b8060025f828254610c329190610f5b565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481525f80516020610fd7833981519152910160405180910390a35050565b6001600160a01b038216610cd55760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104bc565b6001600160a01b0382165f9081526020819052604090205481811015610d485760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104bc565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192915f80516020610fd7833981519152910161091f565b5f6020808352835180828501525f5b81811015610db557858101830151858201604001528201610d99565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610deb575f80fd5b919050565b5f8060408385031215610e01575f80fd5b610e0a83610dd5565b946020939093013593505050565b5f805f60608486031215610e2a575f80fd5b610e3384610dd5565b9250610e4160208501610dd5565b9150604084013590509250925092565b5f60208284031215610e61575f80fd5b610e6a82610dd5565b9392505050565b5f805f805f805f60e0888a031215610e87575f80fd5b610e9088610dd5565b9650610e9e60208901610dd5565b95506040880135945060608801359350608088013560ff81168114610ec1575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215610eef575f80fd5b610ef883610dd5565b9150610f0660208401610dd5565b90509250929050565b600181811c90821680610f2357607f821691505b602082108103610f4157634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156103cf576103cf610f47565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b5f60018201610fcf57610fcf610f47565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa26469706673582212206c12be332dd873b7cf88c58dfc4762858b63e8ff3bf8563b47828a5a4272643b64736f6c63430008140033501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4da264697066735822122051dba377c61d9aeab1e5350deccb942cf9d53197269f447215de0dba14c9847264736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMDeployer.json b/compiled-contracts/paris/PolygonZkEVMDeployer.json index 6d250a4ff..d614562ce 100644 --- a/compiled-contracts/paris/PolygonZkEVMDeployer.json +++ b/compiled-contracts/paris/PolygonZkEVMDeployer.json @@ -184,8 +184,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50604051610c71380380610c7183398101604081905261002f91610097565b61003833610047565b61004181610047565b506100c7565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100a957600080fd5b81516001600160a01b03811681146100c057600080fd5b9392505050565b610b9b806100d66000396000f3fe6080604052600436106100705760003560e01c8063715018a61161004e578063715018a6146100e65780638da5cb5b146100fb578063e11ae6cb14610126578063f2fde38b1461013957600080fd5b80632b79805a146100755780634a94d4871461008a5780636d07dbf81461009d575b600080fd5b610088610083366004610927565b610159565b005b6100886100983660046109c7565b6101cb565b3480156100a957600080fd5b506100bd6100b8366004610a1e565b61020d565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b50610088610220565b34801561010757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166100bd565b610088610134366004610a40565b610234565b34801561014557600080fd5b50610088610154366004610a90565b61029b565b610161610357565b600061016e8585856103d8565b905061017a8183610537565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a15050505050565b6101d3610357565b6101de83838361057b565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b90600090a1505050565b600061021983836105a9565b9392505050565b610228610357565b61023260006105b6565b565b61023c610357565b60006102498484846103d8565b60405173ffffffffffffffffffffffffffffffffffffffff821681529091507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a150505050565b6102a3610357565b73ffffffffffffffffffffffffffffffffffffffff811661034b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610354816105b6565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610232576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610342565b600083471015610444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610342565b81516000036104af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610342565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116610219576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610342565b6060610219838360006040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c6564000081525061062b565b60606105a1848484604051806060016040528060298152602001610b3d6029913961062b565b949350505050565b6000610219838330610744565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156106bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610342565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516106e69190610acf565b60006040518083038185875af1925050503d8060008114610723576040519150601f19603f3d011682016040523d82523d6000602084013e610728565b606091505b50915091506107398783838761076e565b979650505050505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b606083156108045782516000036107fd5773ffffffffffffffffffffffffffffffffffffffff85163b6107fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610342565b50816105a1565b6105a183838151156108195781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103429190610aeb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261088d57600080fd5b813567ffffffffffffffff808211156108a8576108a861084d565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156108ee576108ee61084d565b8160405283815286602085880101111561090757600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806080858703121561093d57600080fd5b8435935060208501359250604085013567ffffffffffffffff8082111561096357600080fd5b61096f8883890161087c565b9350606087013591508082111561098557600080fd5b506109928782880161087c565b91505092959194509250565b803573ffffffffffffffffffffffffffffffffffffffff811681146109c257600080fd5b919050565b6000806000606084860312156109dc57600080fd5b6109e58461099e565b9250602084013567ffffffffffffffff811115610a0157600080fd5b610a0d8682870161087c565b925050604084013590509250925092565b60008060408385031215610a3157600080fd5b50508035926020909101359150565b600080600060608486031215610a5557600080fd5b8335925060208401359150604084013567ffffffffffffffff811115610a7a57600080fd5b610a868682870161087c565b9150509250925092565b600060208284031215610aa257600080fd5b6102198261099e565b60005b83811015610ac6578181015183820152602001610aae565b50506000910152565b60008251610ae1818460208701610aab565b9190910192915050565b6020815260008251806020840152610b0a816040850160208701610aab565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220964619cee0e0baf94c6f8763f013be157da5d54c89e5cff4a8caf4266e13f13a64736f6c63430008140033", - "deployedBytecode": "0x6080604052600436106100705760003560e01c8063715018a61161004e578063715018a6146100e65780638da5cb5b146100fb578063e11ae6cb14610126578063f2fde38b1461013957600080fd5b80632b79805a146100755780634a94d4871461008a5780636d07dbf81461009d575b600080fd5b610088610083366004610927565b610159565b005b6100886100983660046109c7565b6101cb565b3480156100a957600080fd5b506100bd6100b8366004610a1e565b61020d565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b50610088610220565b34801561010757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166100bd565b610088610134366004610a40565b610234565b34801561014557600080fd5b50610088610154366004610a90565b61029b565b610161610357565b600061016e8585856103d8565b905061017a8183610537565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a15050505050565b6101d3610357565b6101de83838361057b565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b90600090a1505050565b600061021983836105a9565b9392505050565b610228610357565b61023260006105b6565b565b61023c610357565b60006102498484846103d8565b60405173ffffffffffffffffffffffffffffffffffffffff821681529091507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a150505050565b6102a3610357565b73ffffffffffffffffffffffffffffffffffffffff811661034b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610354816105b6565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610232576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610342565b600083471015610444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610342565b81516000036104af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610342565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116610219576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610342565b6060610219838360006040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c6564000081525061062b565b60606105a1848484604051806060016040528060298152602001610b3d6029913961062b565b949350505050565b6000610219838330610744565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156106bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610342565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516106e69190610acf565b60006040518083038185875af1925050503d8060008114610723576040519150601f19603f3d011682016040523d82523d6000602084013e610728565b606091505b50915091506107398783838761076e565b979650505050505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b606083156108045782516000036107fd5773ffffffffffffffffffffffffffffffffffffffff85163b6107fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610342565b50816105a1565b6105a183838151156108195781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103429190610aeb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261088d57600080fd5b813567ffffffffffffffff808211156108a8576108a861084d565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156108ee576108ee61084d565b8160405283815286602085880101111561090757600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806080858703121561093d57600080fd5b8435935060208501359250604085013567ffffffffffffffff8082111561096357600080fd5b61096f8883890161087c565b9350606087013591508082111561098557600080fd5b506109928782880161087c565b91505092959194509250565b803573ffffffffffffffffffffffffffffffffffffffff811681146109c257600080fd5b919050565b6000806000606084860312156109dc57600080fd5b6109e58461099e565b9250602084013567ffffffffffffffff811115610a0157600080fd5b610a0d8682870161087c565b925050604084013590509250925092565b60008060408385031215610a3157600080fd5b50508035926020909101359150565b600080600060608486031215610a5557600080fd5b8335925060208401359150604084013567ffffffffffffffff811115610a7a57600080fd5b610a868682870161087c565b9150509250925092565b600060208284031215610aa257600080fd5b6102198261099e565b60005b83811015610ac6578181015183820152602001610aae565b50506000910152565b60008251610ae1818460208701610aab565b9190910192915050565b6020815260008251806020840152610b0a816040850160208701610aab565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220964619cee0e0baf94c6f8763f013be157da5d54c89e5cff4a8caf4266e13f13a64736f6c63430008140033", + "bytecode": "0x608060405234801561000f575f80fd5b50604051610a2d380380610a2d83398101604081905261002e91610095565b61003733610046565b61004081610046565b506100c2565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100a5575f80fd5b81516001600160a01b03811681146100bb575f80fd5b9392505050565b61095e806100cf5f395ff3fe60806040526004361061005f575f3560e01c80632b79805a146100635780634a94d487146100785780636d07dbf81461008b578063715018a6146100c05780638da5cb5b146100d4578063e11ae6cb146100e8578063f2fde38b146100fb575b5f80fd5b6100766100713660046106fa565b61011a565b005b610076610086366004610786565b610166565b348015610096575f80fd5b506100aa6100a53660046107d8565b6101a7565b6040516100b791906107f8565b60405180910390f35b3480156100cb575f80fd5b506100766101b9565b3480156100df575f80fd5b506100aa6101cc565b6100766100f636600461080c565b6101da565b348015610106575f80fd5b50610076610115366004610857565b61021a565b610122610298565b5f61012e8585856102f7565b905061013a81836103f5565b505f805160206108e08339815191528160405161015791906107f8565b60405180910390a15050505050565b61016e610298565b610179838383610438565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b905f90a1505050565b5f6101b28383610466565b9392505050565b6101c1610298565b6101ca5f610472565b565b5f546001600160a01b031690565b6101e2610298565b5f6101ee8484846102f7565b90505f805160206108e08339815191528160405161020c91906107f8565b60405180910390a150505050565b610222610298565b6001600160a01b03811661028c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61029581610472565b50565b336102a16101cc565b6001600160a01b0316146101ca5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610283565b5f834710156103485760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610283565b81515f036103985760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610283565b8282516020840186f590506001600160a01b0381166101b25760405162461bcd60e51b8152602060048201526019602482015278437265617465323a204661696c6564206f6e206465706c6f7960381b6044820152606401610283565b60606101b283835f6040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c656400008152506104c1565b606061045e848484604051806060016040528060298152602001610900602991396104c1565b949350505050565b5f6101b2838330610598565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156105225760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610283565b5f80866001600160a01b0316858760405161053d9190610892565b5f6040518083038185875af1925050503d805f8114610577576040519150601f19603f3d011682016040523d82523d5f602084013e61057c565b606091505b509150915061058d878383876105c1565b979650505050505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6060831561062f5782515f03610628576001600160a01b0385163b6106285760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610283565b508161045e565b61045e83838151156106445781518083602001fd5b8060405162461bcd60e51b815260040161028391906108ad565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112610681575f80fd5b81356001600160401b038082111561069b5761069b61065e565b604051601f8301601f19908116603f011681019082821181831017156106c3576106c361065e565b816040528381528660208588010111156106db575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f806080858703121561070d575f80fd5b843593506020850135925060408501356001600160401b0380821115610731575f80fd5b61073d88838901610672565b93506060870135915080821115610752575f80fd5b5061075f87828801610672565b91505092959194509250565b80356001600160a01b0381168114610781575f80fd5b919050565b5f805f60608486031215610798575f80fd5b6107a18461076b565b925060208401356001600160401b038111156107bb575f80fd5b6107c786828701610672565b925050604084013590509250925092565b5f80604083850312156107e9575f80fd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b5f805f6060848603121561081e575f80fd5b833592506020840135915060408401356001600160401b03811115610841575f80fd5b61084d86828701610672565b9150509250925092565b5f60208284031215610867575f80fd5b6101b28261076b565b5f5b8381101561088a578181015183820152602001610872565b50505f910152565b5f82516108a3818460208701610870565b9190910192915050565b602081525f82518060208401526108cb816040850160208701610870565b601f01601f1916919091016040019291505056feba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a264697066735822122046ca0fbf676689fe3caf41f19380ababfbdb2fd13b798268ec428ddb13b8960064736f6c63430008140033", + "deployedBytecode": "0x60806040526004361061005f575f3560e01c80632b79805a146100635780634a94d487146100785780636d07dbf81461008b578063715018a6146100c05780638da5cb5b146100d4578063e11ae6cb146100e8578063f2fde38b146100fb575b5f80fd5b6100766100713660046106fa565b61011a565b005b610076610086366004610786565b610166565b348015610096575f80fd5b506100aa6100a53660046107d8565b6101a7565b6040516100b791906107f8565b60405180910390f35b3480156100cb575f80fd5b506100766101b9565b3480156100df575f80fd5b506100aa6101cc565b6100766100f636600461080c565b6101da565b348015610106575f80fd5b50610076610115366004610857565b61021a565b610122610298565b5f61012e8585856102f7565b905061013a81836103f5565b505f805160206108e08339815191528160405161015791906107f8565b60405180910390a15050505050565b61016e610298565b610179838383610438565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b905f90a1505050565b5f6101b28383610466565b9392505050565b6101c1610298565b6101ca5f610472565b565b5f546001600160a01b031690565b6101e2610298565b5f6101ee8484846102f7565b90505f805160206108e08339815191528160405161020c91906107f8565b60405180910390a150505050565b610222610298565b6001600160a01b03811661028c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61029581610472565b50565b336102a16101cc565b6001600160a01b0316146101ca5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610283565b5f834710156103485760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610283565b81515f036103985760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610283565b8282516020840186f590506001600160a01b0381166101b25760405162461bcd60e51b8152602060048201526019602482015278437265617465323a204661696c6564206f6e206465706c6f7960381b6044820152606401610283565b60606101b283835f6040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c656400008152506104c1565b606061045e848484604051806060016040528060298152602001610900602991396104c1565b949350505050565b5f6101b2838330610598565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156105225760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610283565b5f80866001600160a01b0316858760405161053d9190610892565b5f6040518083038185875af1925050503d805f8114610577576040519150601f19603f3d011682016040523d82523d5f602084013e61057c565b606091505b509150915061058d878383876105c1565b979650505050505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6060831561062f5782515f03610628576001600160a01b0385163b6106285760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610283565b508161045e565b61045e83838151156106445781518083602001fd5b8060405162461bcd60e51b815260040161028391906108ad565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112610681575f80fd5b81356001600160401b038082111561069b5761069b61065e565b604051601f8301601f19908116603f011681019082821181831017156106c3576106c361065e565b816040528381528660208588010111156106db575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f806080858703121561070d575f80fd5b843593506020850135925060408501356001600160401b0380821115610731575f80fd5b61073d88838901610672565b93506060870135915080821115610752575f80fd5b5061075f87828801610672565b91505092959194509250565b80356001600160a01b0381168114610781575f80fd5b919050565b5f805f60608486031215610798575f80fd5b6107a18461076b565b925060208401356001600160401b038111156107bb575f80fd5b6107c786828701610672565b925050604084013590509250925092565b5f80604083850312156107e9575f80fd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b5f805f6060848603121561081e575f80fd5b833592506020840135915060408401356001600160401b03811115610841575f80fd5b61084d86828701610672565b9150509250925092565b5f60208284031215610867575f80fd5b6101b28261076b565b5f5b8381101561088a578181015183820152602001610872565b50505f910152565b5f82516108a3818460208701610870565b9190910192915050565b602081525f82518060208401526108cb816040850160208701610870565b601f01601f1916919091016040019291505056feba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a264697066735822122046ca0fbf676689fe3caf41f19380ababfbdb2fd13b798268ec428ddb13b8960064736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMGlobalExitRoot.json b/compiled-contracts/paris/PolygonZkEVMGlobalExitRoot.json index 7990be894..80519f9e9 100644 --- a/compiled-contracts/paris/PolygonZkEVMGlobalExitRoot.json +++ b/compiled-contracts/paris/PolygonZkEVMGlobalExitRoot.json @@ -141,8 +141,8 @@ "type": "function" } ], - "bytecode": "0x60c060405234801561001057600080fd5b506040516103f83803806103f883398101604081905261002f91610062565b6001600160a01b0391821660a05216608052610095565b80516001600160a01b038116811461005d57600080fd5b919050565b6000806040838503121561007557600080fd5b61007e83610046565b915061008c60208401610046565b90509250929050565b60805160a0516103316100c76000396000818160e901526101bd015260008181610135015261017401526103316000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c806333d6247d1161005b57806333d6247d146100c75780633ed691ef146100dc5780635ec6a8df146100e4578063a3c573eb1461013057600080fd5b806301fd904414610082578063257b36321461009e578063319cf735146100be575b600080fd5b61008b60005481565b6040519081526020015b60405180910390f35b61008b6100ac3660046102e2565b60026020526000908152604090205481565b61008b60015481565b6100da6100d53660046102e2565b610157565b005b61008b6102a6565b61010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610095565b61010b7f000000000000000000000000000000000000000000000000000000000000000081565b60005460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101a65750600182905581610222565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101f0576000839055829150610222565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051602080820184905281830185905282518083038401815260609092019092528051910120600090600081815260026020526040812054919250036102a05760008181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b60006102dd600154600054604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b6000602082840312156102f457600080fd5b503591905056fea264697066735822122066368a84a416778eb0d212b7acdeed4f6b4a8b676fc470e5579fc4c25caed2f364736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c806333d6247d1161005b57806333d6247d146100c75780633ed691ef146100dc5780635ec6a8df146100e4578063a3c573eb1461013057600080fd5b806301fd904414610082578063257b36321461009e578063319cf735146100be575b600080fd5b61008b60005481565b6040519081526020015b60405180910390f35b61008b6100ac3660046102e2565b60026020526000908152604090205481565b61008b60015481565b6100da6100d53660046102e2565b610157565b005b61008b6102a6565b61010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610095565b61010b7f000000000000000000000000000000000000000000000000000000000000000081565b60005460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101a65750600182905581610222565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101f0576000839055829150610222565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051602080820184905281830185905282518083038401815260609092019092528051910120600090600081815260026020526040812054919250036102a05760008181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b60006102dd600154600054604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b6000602082840312156102f457600080fd5b503591905056fea264697066735822122066368a84a416778eb0d212b7acdeed4f6b4a8b676fc470e5579fc4c25caed2f364736f6c63430008140033", + "bytecode": "0x60c060405234801561000f575f80fd5b5060405161037838038061037883398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a0516102b96100bf5f395f818160d4015261018001525f8181610113015261014401526102b95ff3fe608060405234801561000f575f80fd5b506004361061006b575f3560e01c806301fd90441461006f578063257b36321461008a578063319cf735146100a957806333d6247d146100b25780633ed691ef146100c75780635ec6a8df146100cf578063a3c573eb1461010e575b5f80fd5b6100775f5481565b6040519081526020015b60405180910390f35b61007761009836600461026c565b60026020525f908152604090205481565b61007760015481565b6100c56100c036600461026c565b610135565b005b61007761022d565b6100f67f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610081565b6100f67f000000000000000000000000000000000000000000000000000000000000000081565b5f546001546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361017657506001829055816101cb565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101b2575f8390558291506101cb565b60405163b49365dd60e01b815260040160405180910390fd5b5f6101d68284610240565b5f8181526002602052604081205491925003610227575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f61023b6001545f54610240565b905090565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b5f6020828403121561027c575f80fd5b503591905056fea264697066735822122064d84de7c0da50200ff5c121c5078780ba8d55594c1d83fb5963328e7ce12bcd64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061006b575f3560e01c806301fd90441461006f578063257b36321461008a578063319cf735146100a957806333d6247d146100b25780633ed691ef146100c75780635ec6a8df146100cf578063a3c573eb1461010e575b5f80fd5b6100775f5481565b6040519081526020015b60405180910390f35b61007761009836600461026c565b60026020525f908152604090205481565b61007760015481565b6100c56100c036600461026c565b610135565b005b61007761022d565b6100f67f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610081565b6100f67f000000000000000000000000000000000000000000000000000000000000000081565b5f546001546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361017657506001829055816101cb565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101b2575f8390558291506101cb565b60405163b49365dd60e01b815260040160405180910390fd5b5f6101d68284610240565b5f8181526002602052604081205491925003610227575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f61023b6001545f54610240565b905090565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b5f6020828403121561027c575f80fd5b503591905056fea264697066735822122064d84de7c0da50200ff5c121c5078780ba8d55594c1d83fb5963328e7ce12bcd64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2.json b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2.json index 6c5ff823e..3b65fcfcb 100644 --- a/compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2.json +++ b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2.json @@ -78,8 +78,8 @@ "type": "function" } ], - "bytecode": "0x60a060405234801561001057600080fd5b5060405161024238038061024283398101604081905261002f91610040565b6001600160a01b0316608052610070565b60006020828403121561005257600080fd5b81516001600160a01b038116811461006957600080fd5b9392505050565b6080516101b16100916000396000818160a7015261010601526101b16000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806301fd904414610051578063257b36321461006d57806333d6247d1461008d578063a3c573eb146100a2575b600080fd5b61005a60015481565b6040519081526020015b60405180910390f35b61005a61007b366004610162565b60006020819052908152604090205481565b6100a061009b366004610162565b6100ee565b005b6100c97f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610064565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461015d576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b60006020828403121561017457600080fd5b503591905056fea2646970667358221220ea2171e2c85c8bff947affc409ef6fc6a8fe82fb8c174ddeda988651e595d66564736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806301fd904414610051578063257b36321461006d57806333d6247d1461008d578063a3c573eb146100a2575b600080fd5b61005a60015481565b6040519081526020015b60405180910390f35b61005a61007b366004610162565b60006020819052908152604090205481565b6100a061009b366004610162565b6100ee565b005b6100c97f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610064565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461015d576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b60006020828403121561017457600080fd5b503591905056fea2646970667358221220ea2171e2c85c8bff947affc409ef6fc6a8fe82fb8c174ddeda988651e595d66564736f6c63430008140033", + "bytecode": "0x60a060405234801561000f575f80fd5b5060405161020138038061020183398101604081905261002e9161003f565b6001600160a01b031660805261006c565b5f6020828403121561004f575f80fd5b81516001600160a01b0381168114610065575f80fd5b9392505050565b6080516101786100895f395f818160a3015260e801526101785ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301fd90441461004e578063257b36321461006a57806333d6247d14610089578063a3c573eb1461009e575b5f80fd5b61005760015481565b6040519081526020015b60405180910390f35b61005761007836600461012b565b5f6020819052908152604090205481565b61009c61009736600461012b565b6100dd565b005b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610061565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101265760405163b49365dd60e01b815260040160405180910390fd5b600155565b5f6020828403121561013b575f80fd5b503591905056fea264697066735822122056308b0c5d386c7c2d79206e623f5190b458132b17b5ad50acf8ed30d9a25ee864736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301fd90441461004e578063257b36321461006a57806333d6247d14610089578063a3c573eb1461009e575b5f80fd5b61005760015481565b6040519081526020015b60405180910390f35b61005761007836600461012b565b5f6020819052908152604090205481565b61009c61009736600461012b565b6100dd565b005b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610061565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101265760405163b49365dd60e01b815260040160405180910390fd5b600155565b5f6020828403121561013b575f80fd5b503591905056fea264697066735822122056308b0c5d386c7c2d79206e623f5190b458132b17b5ad50acf8ed30d9a25ee864736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2Mock.json b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2Mock.json index 5b5d7d1a5..38254afbd 100644 --- a/compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2Mock.json +++ b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2Mock.json @@ -109,8 +109,8 @@ "type": "function" } ], - "bytecode": "0x60a060405234801561001057600080fd5b506040516102b93803806102b983398101604081905261002f91610040565b6001600160a01b0316608052610070565b60006020828403121561005257600080fd5b81516001600160a01b038116811461006957600080fd5b9392505050565b60805161022761009260003960008181610100015261015f01526102276000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c806333d6247d1161005057806333d6247d146100c857806396e07459146100db578063a3c573eb146100fb57600080fd5b806301fd904414610077578063116c40c314610093578063257b3632146100a8575b600080fd5b61008060015481565b6040519081526020015b60405180910390f35b6100a66100a13660046101b6565b600155565b005b6100806100b63660046101b6565b60006020819052908152604090205481565b6100a66100d63660046101b6565b610147565b6100a66100e93660046101cf565b60009182526020829052604090912055565b6101227f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161008a565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146100a1576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602082840312156101c857600080fd5b5035919050565b600080604083850312156101e257600080fd5b5050803592602090910135915056fea26469706673582212203dc131ea7b3c9a0e0d9f97c222b405f0086fc9beecf67bf79956cd48dcb6461d64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100725760003560e01c806333d6247d1161005057806333d6247d146100c857806396e07459146100db578063a3c573eb146100fb57600080fd5b806301fd904414610077578063116c40c314610093578063257b3632146100a8575b600080fd5b61008060015481565b6040519081526020015b60405180910390f35b6100a66100a13660046101b6565b600155565b005b6100806100b63660046101b6565b60006020819052908152604090205481565b6100a66100d63660046101b6565b610147565b6100a66100e93660046101cf565b60009182526020829052604090912055565b6101227f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161008a565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146100a1576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602082840312156101c857600080fd5b5035919050565b600080604083850312156101e257600080fd5b5050803592602090910135915056fea26469706673582212203dc131ea7b3c9a0e0d9f97c222b405f0086fc9beecf67bf79956cd48dcb6461d64736f6c63430008140033", + "bytecode": "0x60a060405234801561000f575f80fd5b5060405161026538038061026583398101604081905261002e9161003f565b6001600160a01b031660805261006c565b5f6020828403121561004f575f80fd5b81516001600160a01b0381168114610065575f80fd5b9392505050565b6080516101db61008a5f395f818160eb015261013001526101db5ff3fe608060405234801561000f575f80fd5b5060043610610060575f3560e01c806301fd904414610064578063116c40c314610080578063257b36321461009557806333d6247d146100b457806396e07459146100c7578063a3c573eb146100e6575b5f80fd5b61006d60015481565b6040519081526020015b60405180910390f35b61009361008e36600461016e565b600155565b005b61006d6100a336600461016e565b5f6020819052908152604090205481565b6100936100c236600461016e565b610125565b6100936100d5366004610185565b5f9182526020829052604090912055565b61010d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610077565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461008e5760405163b49365dd60e01b815260040160405180910390fd5b5f6020828403121561017e575f80fd5b5035919050565b5f8060408385031215610196575f80fd5b5050803592602090910135915056fea264697066735822122054c6c745e8f803eb89bbd0aaade77a1d91a25da0cc69dded9bb37e13250b18e164736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610060575f3560e01c806301fd904414610064578063116c40c314610080578063257b36321461009557806333d6247d146100b457806396e07459146100c7578063a3c573eb146100e6575b5f80fd5b61006d60015481565b6040519081526020015b60405180910390f35b61009361008e36600461016e565b600155565b005b61006d6100a336600461016e565b5f6020819052908152604090205481565b6100936100c236600461016e565b610125565b6100936100d5366004610185565b5f9182526020829052604090912055565b61010d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610077565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461008e5760405163b49365dd60e01b815260040160405180910390fd5b5f6020828403121561017e575f80fd5b5035919050565b5f8060408385031215610196575f80fd5b5050803592602090910135915056fea264697066735822122054c6c745e8f803eb89bbd0aaade77a1d91a25da0cc69dded9bb37e13250b18e164736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMGlobalExitRootMock.json b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootMock.json index d3d496f00..40eb76de2 100644 --- a/compiled-contracts/paris/PolygonZkEVMGlobalExitRootMock.json +++ b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootMock.json @@ -172,8 +172,8 @@ "type": "function" } ], - "bytecode": "0x60c060405234801561001057600080fd5b5060405161049538038061049583398101604081905261002f91610062565b6001600160a01b0391821660a05216608052610095565b80516001600160a01b038116811461005d57600080fd5b919050565b6000806040838503121561007557600080fd5b61007e83610046565b915061008c60208401610046565b90509250929050565b60805160a0516103cd6100c860003960008181610142015261023701526000818161018e01526101ee01526103cd6000f3fe608060405234801561001057600080fd5b50600436106100a35760003560e01c806333d6247d116100765780635bcef6731161005b5780635bcef6731461011d5780635ec6a8df1461013d578063a3c573eb1461018957600080fd5b806333d6247d146101025780633ed691ef1461011557600080fd5b806301fd9044146100a8578063051a9e28146100c4578063257b3632146100d9578063319cf735146100f9575b600080fd5b6100b160005481565b6040519081526020015b60405180910390f35b6100d76100d236600461035c565b6101b0565b005b6100b16100e736600461035c565b60026020526000908152604090205481565b6100b160015481565b6100d761011036600461035c565b6101d1565b6100b1610320565b6100d761012b366004610375565b60009182526002602052604090912055565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100bb565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b80600260006101bd610320565b815260208101919091526040016000205550565b60005460015473ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163303610220575060018290558161029c565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361026a57600083905582915061029c565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101206000906000818152600260205260408120549192500361031a5760008181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b6000610357600154600054604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b60006020828403121561036e57600080fd5b5035919050565b6000806040838503121561038857600080fd5b5050803592602090910135915056fea2646970667358221220eeb4ec189dc407e366db39253f2dd748a5e379bc3232254e15b86d12d0001bc064736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a35760003560e01c806333d6247d116100765780635bcef6731161005b5780635bcef6731461011d5780635ec6a8df1461013d578063a3c573eb1461018957600080fd5b806333d6247d146101025780633ed691ef1461011557600080fd5b806301fd9044146100a8578063051a9e28146100c4578063257b3632146100d9578063319cf735146100f9575b600080fd5b6100b160005481565b6040519081526020015b60405180910390f35b6100d76100d236600461035c565b6101b0565b005b6100b16100e736600461035c565b60026020526000908152604090205481565b6100b160015481565b6100d761011036600461035c565b6101d1565b6100b1610320565b6100d761012b366004610375565b60009182526002602052604090912055565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100bb565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b80600260006101bd610320565b815260208101919091526040016000205550565b60005460015473ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163303610220575060018290558161029c565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361026a57600083905582915061029c565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101206000906000818152600260205260408120549192500361031a5760008181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b6000610357600154600054604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b60006020828403121561036e57600080fd5b5035919050565b6000806040838503121561038857600080fd5b5050803592602090910135915056fea2646970667358221220eeb4ec189dc407e366db39253f2dd748a5e379bc3232254e15b86d12d0001bc064736f6c63430008140033", + "bytecode": "0x60c060405234801561000f575f80fd5b5060405161040038038061040083398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a0516103406100c05f395f818161011c01526101e701525f818161015b01526101ab01526103405ff3fe608060405234801561000f575f80fd5b5060043610610081575f3560e01c806301fd904414610085578063051a9e28146100a0578063257b3632146100b5578063319cf735146100d457806333d6247d146100dd5780633ed691ef146100f05780635bcef673146100f85780635ec6a8df14610117578063a3c573eb14610156575b5f80fd5b61008d5f5481565b6040519081526020015b60405180910390f35b6100b36100ae3660046102d3565b61017d565b005b61008d6100c33660046102d3565b60026020525f908152604090205481565b61008d60015481565b6100b36100eb3660046102d3565b61019c565b61008d610294565b6100b36101063660046102ea565b5f9182526002602052604090912055565b61013e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610097565b61013e7f000000000000000000000000000000000000000000000000000000000000000081565b8060025f610189610294565b815260208101919091526040015f205550565b5f546001546001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101dd5750600182905581610232565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163303610219575f839055829150610232565b60405163b49365dd60e01b815260040160405180910390fd5b5f61023d82846102a7565b5f818152600260205260408120549192500361028e575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6102a26001545f546102a7565b905090565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b5f602082840312156102e3575f80fd5b5035919050565b5f80604083850312156102fb575f80fd5b5050803592602090910135915056fea2646970667358221220997f187cde3e8a9cccaa90b0ed9595b57003d76b03fffd42bf38b0240b6f034564736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610081575f3560e01c806301fd904414610085578063051a9e28146100a0578063257b3632146100b5578063319cf735146100d457806333d6247d146100dd5780633ed691ef146100f05780635bcef673146100f85780635ec6a8df14610117578063a3c573eb14610156575b5f80fd5b61008d5f5481565b6040519081526020015b60405180910390f35b6100b36100ae3660046102d3565b61017d565b005b61008d6100c33660046102d3565b60026020525f908152604090205481565b61008d60015481565b6100b36100eb3660046102d3565b61019c565b61008d610294565b6100b36101063660046102ea565b5f9182526002602052604090912055565b61013e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610097565b61013e7f000000000000000000000000000000000000000000000000000000000000000081565b8060025f610189610294565b815260208101919091526040015f205550565b5f546001546001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101dd5750600182905581610232565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163303610219575f839055829150610232565b60405163b49365dd60e01b815260040160405180910390fd5b5f61023d82846102a7565b5f818152600260205260408120549192500361028e575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6102a26001545f546102a7565b905090565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b5f602082840312156102e3575f80fd5b5035919050565b5f80604083850312156102fb575f80fd5b5050803592602090910135915056fea2646970667358221220997f187cde3e8a9cccaa90b0ed9595b57003d76b03fffd42bf38b0240b6f034564736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMGlobalExitRootV2.json b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootV2.json index 918c6bdaa..e08ecc5d6 100644 --- a/compiled-contracts/paris/PolygonZkEVMGlobalExitRootV2.json +++ b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootV2.json @@ -141,8 +141,8 @@ "type": "function" } ], - "bytecode": "0x60c060405234801561001057600080fd5b506040516103f83803806103f883398101604081905261002f91610062565b6001600160a01b0391821660a05216608052610095565b80516001600160a01b038116811461005d57600080fd5b919050565b6000806040838503121561007557600080fd5b61007e83610046565b915061008c60208401610046565b90509250929050565b60805160a0516103316100c76000396000818160e901526101bd015260008181610135015261017401526103316000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c806333d6247d1161005b57806333d6247d146100c75780633ed691ef146100dc57806349b7b802146100e4578063a3c573eb1461013057600080fd5b806301fd904414610082578063257b36321461009e578063319cf735146100be575b600080fd5b61008b60005481565b6040519081526020015b60405180910390f35b61008b6100ac3660046102e2565b60026020526000908152604090205481565b61008b60015481565b6100da6100d53660046102e2565b610157565b005b61008b6102a6565b61010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610095565b61010b7f000000000000000000000000000000000000000000000000000000000000000081565b60005460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101a65750600182905581610222565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101f0576000839055829150610222565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051602080820184905281830185905282518083038401815260609092019092528051910120600090600081815260026020526040812054919250036102a05760008181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b60006102dd600154600054604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b6000602082840312156102f457600080fd5b503591905056fea26469706673582212207a69b0f33aa2ba536ab8e8a536307d3770b547eb31562d13bb859bbb91a3899d64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c806333d6247d1161005b57806333d6247d146100c75780633ed691ef146100dc57806349b7b802146100e4578063a3c573eb1461013057600080fd5b806301fd904414610082578063257b36321461009e578063319cf735146100be575b600080fd5b61008b60005481565b6040519081526020015b60405180910390f35b61008b6100ac3660046102e2565b60026020526000908152604090205481565b61008b60015481565b6100da6100d53660046102e2565b610157565b005b61008b6102a6565b61010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610095565b61010b7f000000000000000000000000000000000000000000000000000000000000000081565b60005460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101a65750600182905581610222565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101f0576000839055829150610222565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051602080820184905281830185905282518083038401815260609092019092528051910120600090600081815260026020526040812054919250036102a05760008181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b60006102dd600154600054604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b6000602082840312156102f457600080fd5b503591905056fea26469706673582212207a69b0f33aa2ba536ab8e8a536307d3770b547eb31562d13bb859bbb91a3899d64736f6c63430008140033", + "bytecode": "0x60c060405234801561000f575f80fd5b5060405161037838038061037883398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a0516102b96100bf5f395f818160d4015261018001525f8181610113015261014401526102b95ff3fe608060405234801561000f575f80fd5b506004361061006b575f3560e01c806301fd90441461006f578063257b36321461008a578063319cf735146100a957806333d6247d146100b25780633ed691ef146100c757806349b7b802146100cf578063a3c573eb1461010e575b5f80fd5b6100775f5481565b6040519081526020015b60405180910390f35b61007761009836600461026c565b60026020525f908152604090205481565b61007760015481565b6100c56100c036600461026c565b610135565b005b61007761022d565b6100f67f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610081565b6100f67f000000000000000000000000000000000000000000000000000000000000000081565b5f546001546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361017657506001829055816101cb565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101b2575f8390558291506101cb565b60405163b49365dd60e01b815260040160405180910390fd5b5f6101d68284610240565b5f8181526002602052604081205491925003610227575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f61023b6001545f54610240565b905090565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b5f6020828403121561027c575f80fd5b503591905056fea26469706673582212200945871c1fc5a875ddc6b822f3353c5f34c74491abd97942dc1d761b165557b064736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061006b575f3560e01c806301fd90441461006f578063257b36321461008a578063319cf735146100a957806333d6247d146100b25780633ed691ef146100c757806349b7b802146100cf578063a3c573eb1461010e575b5f80fd5b6100775f5481565b6040519081526020015b60405180910390f35b61007761009836600461026c565b60026020525f908152604090205481565b61007760015481565b6100c56100c036600461026c565b610135565b005b61007761022d565b6100f67f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610081565b6100f67f000000000000000000000000000000000000000000000000000000000000000081565b5f546001546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361017657506001829055816101cb565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101b2575f8390558291506101cb565b60405163b49365dd60e01b815260040160405180910390fd5b5f6101d68284610240565b5f8181526002602052604081205491925003610227575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f61023b6001545f54610240565b905090565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b5f6020828403121561027c575f80fd5b503591905056fea26469706673582212200945871c1fc5a875ddc6b822f3353c5f34c74491abd97942dc1d761b165557b064736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMMock.json b/compiled-contracts/paris/PolygonZkEVMMock.json index 652ee5fb6..e8b79f0fd 100644 --- a/compiled-contracts/paris/PolygonZkEVMMock.json +++ b/compiled-contracts/paris/PolygonZkEVMMock.json @@ -1935,8 +1935,8 @@ "type": "function" } ], - "bytecode": "0x6101406040523480156200001257600080fd5b5060405162007064380380620070648339810160408190526200003591620000a5565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b0391821661010052166101205262000131565b6001600160a01b03811681146200008557600080fd5b50565b80516001600160401b0381168114620000a057600080fd5b919050565b60008060008060008060c08789031215620000bf57600080fd5b8651620000cc816200006f565b6020880151909650620000df816200006f565b6040880151909550620000f2816200006f565b606088015190945062000105816200006f565b9250620001156080880162000088565b91506200012560a0880162000088565b90509295509295509295565b60805160a05160c05160e0516101005161012051616e5e620002066000396000818161083001528181611a880152613ec80152600081816109c30152611a5e01526000818161098901528181612a2d015281816145610152615a90015260008181610b550152818161173801528181611bfb01528181611dcc0152818161263501528181612e06015281816147d901526155df015260008181610c1501528181614f3a0152615392015260008181610a92015281816129fb0152818161333a015281816147ad01526150280152616e5e6000f3fe608060405234801561001057600080fd5b506004361061048d5760003560e01c80638c3d73011161026b578063c754c7ed11610150578063e7a7ed02116100c8578063f14916d611610097578063f851a4401161007c578063f851a44014610c9d578063f8b823e414610cbd578063fe16564f14610cc657600080fd5b8063f14916d614610c77578063f2fde38b14610c8a57600080fd5b8063e7a7ed0214610be0578063e8bf92ed14610c10578063eaeb077b14610c37578063ed6b010414610c4a57600080fd5b8063d2e129f91161011f578063d939b31511610104578063d939b31514610b9d578063dbc1697614610bc5578063e0d1744114610bcd57600080fd5b8063d2e129f914610b77578063d8d1091b14610b8a57600080fd5b8063c754c7ed14610ae2578063c89e42df14610b0e578063cfa8ed4714610b21578063d02103ca14610b5057600080fd5b8063ada8f919116101e3578063b4f77ea9116101b2578063ba58ae3911610197578063ba58ae3914610ab4578063c0cad30214610ac7578063c0ed84e014610ada57600080fd5b8063b4f77ea914610a7a578063b6b0b09714610a8d57600080fd5b8063ada8f919146109ab578063adc879e9146109be578063afd23cbe146109e5578063b4d63f5814610a1357600080fd5b80639aa972a31161023a5780639c9f3dfe1161021f5780639c9f3dfe1461095e578063a066215c14610971578063a3c573eb1461098457600080fd5b80639aa972a3146109385780639b7967601461094b57600080fd5b80638c3d7301146108f75780638da5cb5b146108ff57806396dc3d391461091d57806399f5634e1461093057600080fd5b80634a1a89a711610391578063621dd411116103095780637215541a116102d8578063831c7ead116102bd578063831c7ead1461082b578063837a473814610852578063841b24d7146108c757600080fd5b80637215541a146108045780637fcb36531461081757600080fd5b8063621dd411146107b65780636b8616ce146107c95780636ff512cc146107e9578063715018a6146107fc57600080fd5b8063542028d5116103605780635e9145c9116103455780635e9145c9146107935780635ec91958146107a657806360469169146107ae57600080fd5b8063542028d5146106ea578063574f649e146106f257600080fd5b80634a1a89a7146106845780634a910e6a146106a45780634e487706146106b75780635392c5e0146106ca57600080fd5b80632678224711610424578063383b3be8116103f3578063423fa856116103d8578063423fa856146106285780634560526714610648578063458c04771461067057600080fd5b8063383b3be814610602578063394218e91461061557600080fd5b8063267822471461056b57806329878983146105b05780632b0006fa146105dc5780632c1f816a146105ef57600080fd5b806315064c961161046057806315064c96146105145780631816b7e51461053157806319d8ac6114610544578063220d78991461055857600080fd5b80630a0d9fbe146104925780630eaa86ea146104c9578063107bf28c146104ea57806310a01a72146104ff575b600080fd5b606f546104ab90610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6104dc6104d7366004616066565b610cd9565b6040519081526020016104c0565b6104f26111b1565b6040516104c09190616129565b61051261050d36600461615a565b61123f565b005b606f546105219060ff1681565b60405190151581526020016104c0565b61051261053f3660046161ed565b6117f7565b6073546104ab9067ffffffffffffffff1681565b6104f2610566366004616211565b61190f565b607b5461058b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104c0565b60745461058b9068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6105126105ea366004616270565b611ae6565b6105126105fd3660046162d8565b611cb6565b610521610610366004616352565b611ec4565b610512610623366004616352565b611f1a565b6073546104ab9068010000000000000000900467ffffffffffffffff1681565b6073546104ab90700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546104ab9067ffffffffffffffff1681565b6079546104ab9068010000000000000000900467ffffffffffffffff1681565b6105126106b2366004616352565b61209e565b6105126106c5366004616352565b612151565b6104dc6106d8366004616352565b60756020526000908152604090205481565b6104f26122d5565b6104dc61070036600461646b565b835160209485012060408051808701979097528681019190915260608087019490945260c09290921b7fffffffffffffffff00000000000000000000000000000000000000000000000016608086015290911b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888401528051808403607c018152609c9093019052815191012090565b6105126107a1366004616529565b6122e2565b610512612aec565b6104dc612bec565b6105126107c4366004616270565b612c02565b6104dc6107d7366004616352565b60716020526000908152604090205481565b6105126107f736600461657d565b612f8a565b61051261305f565b610512610812366004616352565b613073565b6074546104ab9067ffffffffffffffff1681565b6104ab7f000000000000000000000000000000000000000000000000000000000000000081565b61089b610860366004616598565b60786020526000908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016104c0565b6079546104ab907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6105126131e3565b60335473ffffffffffffffffffffffffffffffffffffffff1661058b565b61051261092b366004616352565b6132af565b6104dc6132f2565b6105126109463660046162d8565b61344b565b610512610959366004616352565b6134fc565b61051261096c366004616352565b61354b565b61051261097f366004616352565b6136c7565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b6105126109b936600461657d565b6137cd565b6104ab7f000000000000000000000000000000000000000000000000000000000000000081565b606f54610a00906901000000000000000000900461ffff1681565b60405161ffff90911681526020016104c0565b610a54610a21366004616352565b6072602052600090815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016104c0565b610512610a88366004616352565b613891565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b610521610ac2366004616598565b6138a2565b610512610ad53660046165b1565b61392c565b6104ab613944565b607b546104ab9074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b610512610b1c3660046165b1565b613999565b606f5461058b906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b610512610b85366004616628565b613a26565b610512610b983660046166db565b613f6c565b6079546104ab90700100000000000000000000000000000000900467ffffffffffffffff1681565b61051261450e565b610512610bdb36600461671d565b6145e7565b6073546104ab907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b610512610c4536600461676a565b614677565b607b54610521907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b610512610c8536600461657d565b614a6d565b610512610c9836600461657d565b614b3f565b607a5461058b9073ffffffffffffffffffffffffffffffffffffffff1681565b6104dc60705481565b610512610cd43660046167b6565b614bf3565b6000806000610ce6613944565b905067ffffffffffffffff881615610eb35760795467ffffffffffffffff9081169089161115610dc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a4015b60405180910390fd5b67ffffffffffffffff8089166000908152607860205260409020600281015481549094509091898116680100000000000000009092041614610ead576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610dba565b5061104c565b67ffffffffffffffff8716600090815260756020526040902054915081610f82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610dba565b8067ffffffffffffffff168767ffffffffffffffff16111561104c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610dba565b8067ffffffffffffffff168667ffffffffffffffff1611611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610dba565b6000611124888888868961190f565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161115991906167e2565b602060405180830381855afa158015611176573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061119991906167fe565b6111a39190616846565b9a9950505050505050505050565b607780546111be9061685a565b80601f01602080910402602001604051908101604052809291908181526020018280546111ea9061685a565b80156112375780601f1061120c57610100808354040283529160200191611237565b820191906000526020600020905b81548152906001019060200180831161121a57829003601f168201915b505050505081565b611247614c16565b600080611252613944565b905067ffffffffffffffff8a161561141a5760795467ffffffffffffffff908116908b16111561132a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a401610dba565b67ffffffffffffffff808b1660009081526078602052604090206002810154815490945090918b8116680100000000000000009092041614611414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610dba565b506115b3565b67ffffffffffffffff89166000908152607560205260409020549150816114e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610dba565b8067ffffffffffffffff168967ffffffffffffffff1611156115b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610dba565b8067ffffffffffffffff168867ffffffffffffffff161161167c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610dba565b600061168b8a8a8a868b61190f565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8c81169182179092556000908152607560205260409020899055607954919250161561170957607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018990527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b15801561179157600080fd5b505af11580156117a5573d6000803e3d6000fd5b505060405189815233925067ffffffffffffffff8c1691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe9060200160405180910390a35050505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611848576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff16108061186157506103ff8161ffff16115b15611898576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086166000818152607260205260408082205493881682529020546060929115801590611943575081155b1561197a576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806119b1576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119ba846138a2565b6119f0576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611b43576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b51868686868686614c97565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615611bcc57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015611c5457600080fd5b505af1158015611c68573d6000803e3d6000fd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611d13576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d228787878787878761505b565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615611d9d57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015611e2557600080fd5b505af1158015611e39573d6000803e3d6000fd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff82811660009081526078602052604081205490924292611f0892700100000000000000000000000000000000909204811691166168dc565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611f6b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611fb2576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166120215760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610612021576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001611904565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461214557606f5460ff1615612106576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61210f81611ec4565b612145576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61214e81615495565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146121a2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156121e9576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661225457607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610612254576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001611904565b607680546111be9061685a565b606f5460ff161561231f576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461237f576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160008190036123bb576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156123f7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000082048116600081815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b868110156128475760008a8a8381811061245f5761245f616904565b90506020028101906124719190616933565b61247a90616967565b8051805160209091012060608201519192509067ffffffffffffffff16156125f257856124a6816169f4565b965050600081836020015184606001516040516020016124fe93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260719093529120549091508114612587576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff80881660009081526071602052604080822091909155606085015190850151908216911610156125ec576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061272f565b6020820151158015906126b9575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015612693573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b791906167fe565b155b156126f0576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c0101561272f576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080612762575042826040015167ffffffffffffffff16115b15612799576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015197505050808061283f90616a1b565b915050612443565b5061285286856168dc565b60735490945067ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690841611156128bb576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006128c78285616a53565b6128db9067ffffffffffffffff1688616a74565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d861660008181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c84169116179302929092179055909150828116908516146129d157607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b612a233330836070546129e49190616a87565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906156a8565b612a2b61578a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612a9357600080fd5b505af1158015612aa7573d6000803e3d6000fd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612b3d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16612b99576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60006070546064612bfd9190616a87565b905090565b606f5460ff1615612c3f576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581166000908152607260205260409020600101544292612c8c927801000000000000000000000000000000000000000000000000909104811691166168dc565b67ffffffffffffffff161115612cce576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612cdb8686616a53565b67ffffffffffffffff161115612d1d576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d2b868686868686614c97565b612d3484615837565b607954700100000000000000000000000000000000900467ffffffffffffffff16600003612e7c57607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615612dd757607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015612e5f57600080fd5b505af1158015612e73573d6000803e3d6000fd5b50505050612f4c565b612e8461578a565b6079805467ffffffffffffffff16906000612e9e836169f4565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487166000908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001611ca6565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612fdb576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001611904565b613067614c16565b6130716000615a17565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146131db57600061309c613944565b90508067ffffffffffffffff168267ffffffffffffffff16116130eb576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000090910481169083161180613131575067ffffffffffffffff80831660009081526072602052604090206001015416155b15613168576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff80831660009081526072602052604090206001015442916131979162093a8091166168dc565b67ffffffffffffffff1611156131d9576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61214e615a8e565b607b5473ffffffffffffffffffffffffffffffffffffffff163314613234576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6132b7614c16565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015613381573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133a591906167fe565b905060006133b1613944565b60735467ffffffffffffffff6801000000000000000082048116916134099170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416616a53565b61341391906168dc565b61341d9190616a53565b67ffffffffffffffff1690508060000361343a5760009250505090565b6134448183616a9e565b9250505090565b606f5460ff1615613488576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134978787878787878761505b565b67ffffffffffffffff84166000908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16134f3615a8e565b50505050505050565b613504614c16565b6073805467ffffffffffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461359c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156135e3576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661364a5760795467ffffffffffffffff70010000000000000000000000000000000090910481169082161061364a576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001611904565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613718576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff16111561375f576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001611904565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461381e576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001611904565b613899614c16565b61214e81615837565b600067ffffffff0000000167ffffffffffffffff83161080156138da575067ffffffff00000001604083901c67ffffffffffffffff16105b80156138fb575067ffffffff00000001608083901c67ffffffffffffffff16105b8015613912575067ffffffff0000000160c083901c105b1561391f57506001919050565b506000919050565b919050565b613934614c16565b60776139408282616b00565b5050565b60795460009067ffffffffffffffff1615613988575060795467ffffffffffffffff9081166000908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146139ea576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60766139f68282616b00565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516119049190616129565b600054610100900460ff1615808015613a465750600054600160ff909116105b80613a605750303b158015613a60575060005460ff166001145b613aec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610dba565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015613b4a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b613b57602088018861657d565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055613bac604088016020890161657d565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055613c11608088016060890161657d565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790556000805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076613c9c8682616b00565b506077613ca98582616b00565b5062093a80613cbe6060890160408a01616352565b67ffffffffffffffff161115613d00576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d106060880160408901616352565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80613d7260a0890160808a01616352565b67ffffffffffffffff161115613db4576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613dc460a0880160808901616352565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613ea3615b16565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd660007f00000000000000000000000000000000000000000000000000000000000000008585604051613ef99493929190616c63565b60405180910390a180156134f357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613fc9576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614006576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003614042576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561407e576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff780100000000000000000000000000000000000000000000000082048116916140c9918491700100000000000000000000000000000000900416616c9b565b1115614101576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000008204811660008181526072602052604081205491937001000000000000000000000000000000009004909216915b848110156143ab57600087878381811061416157614161616904565b90506020028101906141739190616cae565b61417c90616ce2565b905083614188816169f4565b825180516020918201208185015160408087015190519499509194506000936141ea9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260719093529120549091508114614273576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260716020526040812055614298600189616a74565b84036143075742607b60149054906101000a900467ffffffffffffffff1684604001516142c591906168dc565b67ffffffffffffffff161115614307576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806143a390616a1b565b915050614145565b506143b684846168dc565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589166000818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461455f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156145c757600080fd5b505af11580156145db573d6000803e3d6000fd5b50505050613071615bb6565b6145ef614c16565b6040805160608101825293845267ffffffffffffffff92831660208086019182529284168583019081529584166000908152607290935291209251835551600190920180549351821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169290911691909117919091179055565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16156146d4576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614711576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061471b612bec565b905081811115614757576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115614793576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6147d573ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846156a8565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614842573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061486691906167fe565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff169060186148a0836169f4565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505084846040516148d7929190616d5e565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1660009081526071909352912055323303614a0757607354604080518381523360208201526060918101829052600091810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2614a66565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051614a5d9493929190616d6e565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314614abe576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001611904565b614b47614c16565b73ffffffffffffffffffffffffffffffffffffffff8116614bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610dba565b61214e81615a17565b614bfb614c16565b67ffffffffffffffff16600090815260756020526040902055565b60335473ffffffffffffffffffffffffffffffffffffffff163314613071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dba565b600080614ca2613944565b905067ffffffffffffffff881615614d725760795467ffffffffffffffff9081169089161115614cfe576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089166000908152607860205260409020600281015481549094509091898116680100000000000000009092041614614d6c576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614e13565b67ffffffffffffffff8716600090815260756020526040902054915081614dc5576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115614e13576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611614e60576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000614e6f888888868961190f565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051614ea491906167e2565b602060405180830381855afa158015614ec1573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190614ee491906167fe565b614eee9190616846565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91614f7091899190600401616da4565b602060405180830381865afa158015614f8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614fb19190616ddf565b614fe7576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61504f33614ff5858b616a53565b67ffffffffffffffff166150076132f2565b6150119190616a87565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190615c45565b50505050505050505050565b600067ffffffffffffffff8816156151295760795467ffffffffffffffff90811690891611156150b7576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088166000908152607860205260409020600281015481549092888116680100000000000000009092041614615123576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506151c5565b5067ffffffffffffffff85166000908152607560205260409020548061517b576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff90811690871611156151c5576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff90811690881611806151f757508767ffffffffffffffff168767ffffffffffffffff1611155b8061521e575060795467ffffffffffffffff68010000000000000000909104811690881611155b15615255576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781166000908152607860205260409020546801000000000000000090048116908616146152b8576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006152c7878787858861190f565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516152fc91906167e2565b602060405180830381855afa158015615319573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061533c91906167fe565b6153469190616846565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916153c891889190600401616da4565b602060405180830381865afa1580156153e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906154099190616ddf565b61543f576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff891660009081526078602052604090206002015485900361504f576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff6801000000000000000090910481169082161115806154cf575060795467ffffffffffffffff908116908216115b15615506576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff818116600081815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b15801561563857600080fd5b505af115801561564c573d6000803e3d6000fd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161569b91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526157849085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152615ca0565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115613071576079546000906157d39068010000000000000000900467ffffffffffffffff1660016168dc565b90506157de81611ec4565b1561214e5760795460009060029061580190849067ffffffffffffffff16616a53565b61580b9190616e01565b61581590836168dc565b905061582081611ec4565b1561582e5761394081615495565b61394082615495565b6000615841613944565b9050816000806158518484616a53565b606f5467ffffffffffffffff91821692506000916158759161010090041642616a74565b90505b8467ffffffffffffffff168467ffffffffffffffff16146159005767ffffffffffffffff808516600090815260726020526040902060018101549091168210156158de57600181015468010000000000000000900467ffffffffffffffff1694506158fa565b6158e88686616a53565b67ffffffffffffffff16935050615900565b50615878565b600061590c8484616a74565b90508381101561596357808403600c8111615927578061592a565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a607054028161595957615959616817565b04607055506159d3565b838103600c81116159745780615977565b600c5b90506000816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a764000002816159ae576159ae616817565b04905080607054670de0b6b3a764000002816159cc576159cc616817565b0460705550505b683635c9adc5dea0000060705411156159f857683635c9adc5dea000006070556134f3565b633b9aca0060705410156134f357633b9aca0060705550505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b158015615af657600080fd5b505af1158015615b0a573d6000803e3d6000fd5b50505050613071615dac565b600054610100900460ff16615bad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610dba565b61307133615a17565b606f5460ff16615bf2576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052615c9b9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401615702565b505050565b6000615d02826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615e3f9092919063ffffffff16565b805190915015615c9b5780806020019051810190615d209190616ddf565b615c9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610dba565b606f5460ff1615615de9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b6060615e4e8484600085615e56565b949350505050565b606082471015615ee8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610dba565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051615f1191906167e2565b60006040518083038185875af1925050503d8060008114615f4e576040519150601f19603f3d011682016040523d82523d6000602084013e615f53565b606091505b5091509150615f6487838387615f6f565b979650505050505050565b60608315616005578251600003615ffe5773ffffffffffffffffffffffffffffffffffffffff85163b615ffe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610dba565b5081615e4e565b615e4e838381511561601a5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dba9190616129565b803567ffffffffffffffff8116811461392757600080fd5b600080600080600060a0868803121561607e57600080fd5b6160878661604e565b94506160956020870161604e565b93506160a36040870161604e565b94979396509394606081013594506080013592915050565b60005b838110156160d65781810151838201526020016160be565b50506000910152565b600081518084526160f78160208601602086016160bb565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061613c60208301846160df565b9392505050565b806040810183101561615457600080fd5b92915050565b6000806000806000806000806101a0898b03121561617757600080fd5b6161808961604e565b975061618e60208a0161604e565b965061619c60408a0161604e565b955060608901359450608089013593506161b98a60a08b01616143565b925061016089018a8111156161cd57600080fd5b60e08a0192506161dd8b82616143565b9150509295985092959890939650565b6000602082840312156161ff57600080fd5b813561ffff8116811461613c57600080fd5b600080600080600060a0868803121561622957600080fd5b6162328661604e565b94506162406020870161604e565b94979496505050506040830135926060810135926080909101359150565b80610300810183101561615457600080fd5b6000806000806000806103a0878903121561628a57600080fd5b6162938761604e565b95506162a16020880161604e565b94506162af6040880161604e565b935060608701359250608087013591506162cc8860a0890161625e565b90509295509295509295565b60008060008060008060006103c0888a0312156162f457600080fd5b6162fd8861604e565b965061630b6020890161604e565b95506163196040890161604e565b94506163276060890161604e565b93506080880135925060a088013591506163448960c08a0161625e565b905092959891949750929550565b60006020828403121561636457600080fd5b61613c8261604e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126163ad57600080fd5b813567ffffffffffffffff808211156163c8576163c861636d565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561640e5761640e61636d565b8160405283815286602085880101111561642757600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461392757600080fd5b600080600080600060a0868803121561648357600080fd5b85359450602086013567ffffffffffffffff8111156164a157600080fd5b6164ad8882890161639c565b945050604086013592506164c36060870161604e565b91506164d160808701616447565b90509295509295909350565b60008083601f8401126164ef57600080fd5b50813567ffffffffffffffff81111561650757600080fd5b6020830191508360208260051b850101111561652257600080fd5b9250929050565b60008060006040848603121561653e57600080fd5b833567ffffffffffffffff81111561655557600080fd5b616561868287016164dd565b9094509250616574905060208501616447565b90509250925092565b60006020828403121561658f57600080fd5b61613c82616447565b6000602082840312156165aa57600080fd5b5035919050565b6000602082840312156165c357600080fd5b813567ffffffffffffffff8111156165da57600080fd5b615e4e8482850161639c565b60008083601f8401126165f857600080fd5b50813567ffffffffffffffff81111561661057600080fd5b60208301915083602082850101111561652257600080fd5b60008060008060008086880361012081121561664357600080fd5b60a081121561665157600080fd5b5086955060a0870135945060c087013567ffffffffffffffff8082111561667757600080fd5b6166838a838b0161639c565b955060e089013591508082111561669957600080fd5b6166a58a838b0161639c565b94506101008901359150808211156166bc57600080fd5b506166c989828a016165e6565b979a9699509497509295939492505050565b600080602083850312156166ee57600080fd5b823567ffffffffffffffff81111561670557600080fd5b616711858286016164dd565b90969095509350505050565b6000806000806080858703121561673357600080fd5b61673c8561604e565b9350602085013592506167516040860161604e565b915061675f6060860161604e565b905092959194509250565b60008060006040848603121561677f57600080fd5b833567ffffffffffffffff81111561679657600080fd5b6167a2868287016165e6565b909790965060209590950135949350505050565b600080604083850312156167c957600080fd5b823591506167d96020840161604e565b90509250929050565b600082516167f48184602087016160bb565b9190910192915050565b60006020828403121561681057600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261685557616855616817565b500690565b600181811c9082168061686e57607f821691505b6020821081036168a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8181168382160190808211156168fd576168fd6168ad565b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126167f457600080fd5b60006080823603121561697957600080fd5b6040516080810167ffffffffffffffff828210818311171561699d5761699d61636d565b8160405284359150808211156169b257600080fd5b506169bf3682860161639c565b825250602083013560208201526169d86040840161604e565b60408201526169e96060840161604e565b606082015292915050565b600067ffffffffffffffff808316818103616a1157616a116168ad565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203616a4c57616a4c6168ad565b5060010190565b67ffffffffffffffff8281168282160390808211156168fd576168fd6168ad565b81810381811115616154576161546168ad565b8082028115828204841417616154576161546168ad565b600082616aad57616aad616817565b500490565b601f821115615c9b57600081815260208120601f850160051c81016020861015616ad95750805b601f850160051c820191505b81811015616af857828155600101616ae5565b505050505050565b815167ffffffffffffffff811115616b1a57616b1a61636d565b616b2e81616b28845461685a565b84616ab2565b602080601f831160018114616b815760008415616b4b5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555616af8565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015616bce57888601518255948401946001909101908401616baf565b5085821015616c0a57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600067ffffffffffffffff808716835280861660208401525060606040830152616c91606083018486616c1a565b9695505050505050565b80820180821115616154576161546168ad565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126167f457600080fd5b600060608236031215616cf457600080fd5b6040516060810167ffffffffffffffff8282108183111715616d1857616d1861636d565b816040528435915080821115616d2d57600080fd5b50616d3a3682860161639c565b82525060208301356020820152616d536040840161604e565b604082015292915050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000616c91606083018486616c1a565b61032081016103008085843782018360005b6001811015616dd5578151835260209283019290910190600101616db6565b5050509392505050565b600060208284031215616df157600080fd5b8151801515811461613c57600080fd5b600067ffffffffffffffff80841680616e1c57616e1c616817565b9216919091049291505056fea26469706673582212200d16bdfde0b321a22abe6c2d141b1b0579321cd6fce8fe87dd8ebcb5f5c5aaca64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061048d5760003560e01c80638c3d73011161026b578063c754c7ed11610150578063e7a7ed02116100c8578063f14916d611610097578063f851a4401161007c578063f851a44014610c9d578063f8b823e414610cbd578063fe16564f14610cc657600080fd5b8063f14916d614610c77578063f2fde38b14610c8a57600080fd5b8063e7a7ed0214610be0578063e8bf92ed14610c10578063eaeb077b14610c37578063ed6b010414610c4a57600080fd5b8063d2e129f91161011f578063d939b31511610104578063d939b31514610b9d578063dbc1697614610bc5578063e0d1744114610bcd57600080fd5b8063d2e129f914610b77578063d8d1091b14610b8a57600080fd5b8063c754c7ed14610ae2578063c89e42df14610b0e578063cfa8ed4714610b21578063d02103ca14610b5057600080fd5b8063ada8f919116101e3578063b4f77ea9116101b2578063ba58ae3911610197578063ba58ae3914610ab4578063c0cad30214610ac7578063c0ed84e014610ada57600080fd5b8063b4f77ea914610a7a578063b6b0b09714610a8d57600080fd5b8063ada8f919146109ab578063adc879e9146109be578063afd23cbe146109e5578063b4d63f5814610a1357600080fd5b80639aa972a31161023a5780639c9f3dfe1161021f5780639c9f3dfe1461095e578063a066215c14610971578063a3c573eb1461098457600080fd5b80639aa972a3146109385780639b7967601461094b57600080fd5b80638c3d7301146108f75780638da5cb5b146108ff57806396dc3d391461091d57806399f5634e1461093057600080fd5b80634a1a89a711610391578063621dd411116103095780637215541a116102d8578063831c7ead116102bd578063831c7ead1461082b578063837a473814610852578063841b24d7146108c757600080fd5b80637215541a146108045780637fcb36531461081757600080fd5b8063621dd411146107b65780636b8616ce146107c95780636ff512cc146107e9578063715018a6146107fc57600080fd5b8063542028d5116103605780635e9145c9116103455780635e9145c9146107935780635ec91958146107a657806360469169146107ae57600080fd5b8063542028d5146106ea578063574f649e146106f257600080fd5b80634a1a89a7146106845780634a910e6a146106a45780634e487706146106b75780635392c5e0146106ca57600080fd5b80632678224711610424578063383b3be8116103f3578063423fa856116103d8578063423fa856146106285780634560526714610648578063458c04771461067057600080fd5b8063383b3be814610602578063394218e91461061557600080fd5b8063267822471461056b57806329878983146105b05780632b0006fa146105dc5780632c1f816a146105ef57600080fd5b806315064c961161046057806315064c96146105145780631816b7e51461053157806319d8ac6114610544578063220d78991461055857600080fd5b80630a0d9fbe146104925780630eaa86ea146104c9578063107bf28c146104ea57806310a01a72146104ff575b600080fd5b606f546104ab90610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6104dc6104d7366004616066565b610cd9565b6040519081526020016104c0565b6104f26111b1565b6040516104c09190616129565b61051261050d36600461615a565b61123f565b005b606f546105219060ff1681565b60405190151581526020016104c0565b61051261053f3660046161ed565b6117f7565b6073546104ab9067ffffffffffffffff1681565b6104f2610566366004616211565b61190f565b607b5461058b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104c0565b60745461058b9068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6105126105ea366004616270565b611ae6565b6105126105fd3660046162d8565b611cb6565b610521610610366004616352565b611ec4565b610512610623366004616352565b611f1a565b6073546104ab9068010000000000000000900467ffffffffffffffff1681565b6073546104ab90700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546104ab9067ffffffffffffffff1681565b6079546104ab9068010000000000000000900467ffffffffffffffff1681565b6105126106b2366004616352565b61209e565b6105126106c5366004616352565b612151565b6104dc6106d8366004616352565b60756020526000908152604090205481565b6104f26122d5565b6104dc61070036600461646b565b835160209485012060408051808701979097528681019190915260608087019490945260c09290921b7fffffffffffffffff00000000000000000000000000000000000000000000000016608086015290911b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888401528051808403607c018152609c9093019052815191012090565b6105126107a1366004616529565b6122e2565b610512612aec565b6104dc612bec565b6105126107c4366004616270565b612c02565b6104dc6107d7366004616352565b60716020526000908152604090205481565b6105126107f736600461657d565b612f8a565b61051261305f565b610512610812366004616352565b613073565b6074546104ab9067ffffffffffffffff1681565b6104ab7f000000000000000000000000000000000000000000000000000000000000000081565b61089b610860366004616598565b60786020526000908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016104c0565b6079546104ab907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6105126131e3565b60335473ffffffffffffffffffffffffffffffffffffffff1661058b565b61051261092b366004616352565b6132af565b6104dc6132f2565b6105126109463660046162d8565b61344b565b610512610959366004616352565b6134fc565b61051261096c366004616352565b61354b565b61051261097f366004616352565b6136c7565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b6105126109b936600461657d565b6137cd565b6104ab7f000000000000000000000000000000000000000000000000000000000000000081565b606f54610a00906901000000000000000000900461ffff1681565b60405161ffff90911681526020016104c0565b610a54610a21366004616352565b6072602052600090815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016104c0565b610512610a88366004616352565b613891565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b610521610ac2366004616598565b6138a2565b610512610ad53660046165b1565b61392c565b6104ab613944565b607b546104ab9074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b610512610b1c3660046165b1565b613999565b606f5461058b906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b610512610b85366004616628565b613a26565b610512610b983660046166db565b613f6c565b6079546104ab90700100000000000000000000000000000000900467ffffffffffffffff1681565b61051261450e565b610512610bdb36600461671d565b6145e7565b6073546104ab907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b610512610c4536600461676a565b614677565b607b54610521907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b610512610c8536600461657d565b614a6d565b610512610c9836600461657d565b614b3f565b607a5461058b9073ffffffffffffffffffffffffffffffffffffffff1681565b6104dc60705481565b610512610cd43660046167b6565b614bf3565b6000806000610ce6613944565b905067ffffffffffffffff881615610eb35760795467ffffffffffffffff9081169089161115610dc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a4015b60405180910390fd5b67ffffffffffffffff8089166000908152607860205260409020600281015481549094509091898116680100000000000000009092041614610ead576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610dba565b5061104c565b67ffffffffffffffff8716600090815260756020526040902054915081610f82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610dba565b8067ffffffffffffffff168767ffffffffffffffff16111561104c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610dba565b8067ffffffffffffffff168667ffffffffffffffff1611611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610dba565b6000611124888888868961190f565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161115991906167e2565b602060405180830381855afa158015611176573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061119991906167fe565b6111a39190616846565b9a9950505050505050505050565b607780546111be9061685a565b80601f01602080910402602001604051908101604052809291908181526020018280546111ea9061685a565b80156112375780601f1061120c57610100808354040283529160200191611237565b820191906000526020600020905b81548152906001019060200180831161121a57829003601f168201915b505050505081565b611247614c16565b600080611252613944565b905067ffffffffffffffff8a161561141a5760795467ffffffffffffffff908116908b16111561132a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a401610dba565b67ffffffffffffffff808b1660009081526078602052604090206002810154815490945090918b8116680100000000000000009092041614611414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610dba565b506115b3565b67ffffffffffffffff89166000908152607560205260409020549150816114e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610dba565b8067ffffffffffffffff168967ffffffffffffffff1611156115b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610dba565b8067ffffffffffffffff168867ffffffffffffffff161161167c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610dba565b600061168b8a8a8a868b61190f565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8c81169182179092556000908152607560205260409020899055607954919250161561170957607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018990527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b15801561179157600080fd5b505af11580156117a5573d6000803e3d6000fd5b505060405189815233925067ffffffffffffffff8c1691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe9060200160405180910390a35050505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611848576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff16108061186157506103ff8161ffff16115b15611898576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086166000818152607260205260408082205493881682529020546060929115801590611943575081155b1561197a576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806119b1576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119ba846138a2565b6119f0576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611b43576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b51868686868686614c97565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615611bcc57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015611c5457600080fd5b505af1158015611c68573d6000803e3d6000fd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611d13576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d228787878787878761505b565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615611d9d57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015611e2557600080fd5b505af1158015611e39573d6000803e3d6000fd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff82811660009081526078602052604081205490924292611f0892700100000000000000000000000000000000909204811691166168dc565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611f6b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611fb2576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166120215760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610612021576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001611904565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461214557606f5460ff1615612106576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61210f81611ec4565b612145576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61214e81615495565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146121a2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156121e9576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661225457607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610612254576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001611904565b607680546111be9061685a565b606f5460ff161561231f576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461237f576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160008190036123bb576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156123f7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000082048116600081815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b868110156128475760008a8a8381811061245f5761245f616904565b90506020028101906124719190616933565b61247a90616967565b8051805160209091012060608201519192509067ffffffffffffffff16156125f257856124a6816169f4565b965050600081836020015184606001516040516020016124fe93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260719093529120549091508114612587576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff80881660009081526071602052604080822091909155606085015190850151908216911610156125ec576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061272f565b6020820151158015906126b9575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015612693573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b791906167fe565b155b156126f0576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c0101561272f576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080612762575042826040015167ffffffffffffffff16115b15612799576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015197505050808061283f90616a1b565b915050612443565b5061285286856168dc565b60735490945067ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690841611156128bb576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006128c78285616a53565b6128db9067ffffffffffffffff1688616a74565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d861660008181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c84169116179302929092179055909150828116908516146129d157607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b612a233330836070546129e49190616a87565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906156a8565b612a2b61578a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612a9357600080fd5b505af1158015612aa7573d6000803e3d6000fd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612b3d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16612b99576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60006070546064612bfd9190616a87565b905090565b606f5460ff1615612c3f576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581166000908152607260205260409020600101544292612c8c927801000000000000000000000000000000000000000000000000909104811691166168dc565b67ffffffffffffffff161115612cce576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612cdb8686616a53565b67ffffffffffffffff161115612d1d576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d2b868686868686614c97565b612d3484615837565b607954700100000000000000000000000000000000900467ffffffffffffffff16600003612e7c57607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615612dd757607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015612e5f57600080fd5b505af1158015612e73573d6000803e3d6000fd5b50505050612f4c565b612e8461578a565b6079805467ffffffffffffffff16906000612e9e836169f4565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487166000908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001611ca6565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612fdb576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001611904565b613067614c16565b6130716000615a17565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146131db57600061309c613944565b90508067ffffffffffffffff168267ffffffffffffffff16116130eb576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000090910481169083161180613131575067ffffffffffffffff80831660009081526072602052604090206001015416155b15613168576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff80831660009081526072602052604090206001015442916131979162093a8091166168dc565b67ffffffffffffffff1611156131d9576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61214e615a8e565b607b5473ffffffffffffffffffffffffffffffffffffffff163314613234576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6132b7614c16565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015613381573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133a591906167fe565b905060006133b1613944565b60735467ffffffffffffffff6801000000000000000082048116916134099170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416616a53565b61341391906168dc565b61341d9190616a53565b67ffffffffffffffff1690508060000361343a5760009250505090565b6134448183616a9e565b9250505090565b606f5460ff1615613488576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134978787878787878761505b565b67ffffffffffffffff84166000908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16134f3615a8e565b50505050505050565b613504614c16565b6073805467ffffffffffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461359c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156135e3576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661364a5760795467ffffffffffffffff70010000000000000000000000000000000090910481169082161061364a576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001611904565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613718576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff16111561375f576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001611904565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461381e576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001611904565b613899614c16565b61214e81615837565b600067ffffffff0000000167ffffffffffffffff83161080156138da575067ffffffff00000001604083901c67ffffffffffffffff16105b80156138fb575067ffffffff00000001608083901c67ffffffffffffffff16105b8015613912575067ffffffff0000000160c083901c105b1561391f57506001919050565b506000919050565b919050565b613934614c16565b60776139408282616b00565b5050565b60795460009067ffffffffffffffff1615613988575060795467ffffffffffffffff9081166000908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146139ea576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60766139f68282616b00565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516119049190616129565b600054610100900460ff1615808015613a465750600054600160ff909116105b80613a605750303b158015613a60575060005460ff166001145b613aec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610dba565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015613b4a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b613b57602088018861657d565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055613bac604088016020890161657d565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055613c11608088016060890161657d565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790556000805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076613c9c8682616b00565b506077613ca98582616b00565b5062093a80613cbe6060890160408a01616352565b67ffffffffffffffff161115613d00576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d106060880160408901616352565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80613d7260a0890160808a01616352565b67ffffffffffffffff161115613db4576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613dc460a0880160808901616352565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613ea3615b16565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd660007f00000000000000000000000000000000000000000000000000000000000000008585604051613ef99493929190616c63565b60405180910390a180156134f357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613fc9576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614006576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003614042576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561407e576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff780100000000000000000000000000000000000000000000000082048116916140c9918491700100000000000000000000000000000000900416616c9b565b1115614101576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000008204811660008181526072602052604081205491937001000000000000000000000000000000009004909216915b848110156143ab57600087878381811061416157614161616904565b90506020028101906141739190616cae565b61417c90616ce2565b905083614188816169f4565b825180516020918201208185015160408087015190519499509194506000936141ea9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260719093529120549091508114614273576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260716020526040812055614298600189616a74565b84036143075742607b60149054906101000a900467ffffffffffffffff1684604001516142c591906168dc565b67ffffffffffffffff161115614307576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806143a390616a1b565b915050614145565b506143b684846168dc565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589166000818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461455f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156145c757600080fd5b505af11580156145db573d6000803e3d6000fd5b50505050613071615bb6565b6145ef614c16565b6040805160608101825293845267ffffffffffffffff92831660208086019182529284168583019081529584166000908152607290935291209251835551600190920180549351821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169290911691909117919091179055565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16156146d4576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614711576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061471b612bec565b905081811115614757576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115614793576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6147d573ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846156a8565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614842573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061486691906167fe565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff169060186148a0836169f4565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505084846040516148d7929190616d5e565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1660009081526071909352912055323303614a0757607354604080518381523360208201526060918101829052600091810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2614a66565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051614a5d9493929190616d6e565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314614abe576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001611904565b614b47614c16565b73ffffffffffffffffffffffffffffffffffffffff8116614bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610dba565b61214e81615a17565b614bfb614c16565b67ffffffffffffffff16600090815260756020526040902055565b60335473ffffffffffffffffffffffffffffffffffffffff163314613071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dba565b600080614ca2613944565b905067ffffffffffffffff881615614d725760795467ffffffffffffffff9081169089161115614cfe576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089166000908152607860205260409020600281015481549094509091898116680100000000000000009092041614614d6c576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614e13565b67ffffffffffffffff8716600090815260756020526040902054915081614dc5576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115614e13576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611614e60576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000614e6f888888868961190f565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051614ea491906167e2565b602060405180830381855afa158015614ec1573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190614ee491906167fe565b614eee9190616846565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91614f7091899190600401616da4565b602060405180830381865afa158015614f8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614fb19190616ddf565b614fe7576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61504f33614ff5858b616a53565b67ffffffffffffffff166150076132f2565b6150119190616a87565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190615c45565b50505050505050505050565b600067ffffffffffffffff8816156151295760795467ffffffffffffffff90811690891611156150b7576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088166000908152607860205260409020600281015481549092888116680100000000000000009092041614615123576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506151c5565b5067ffffffffffffffff85166000908152607560205260409020548061517b576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff90811690871611156151c5576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff90811690881611806151f757508767ffffffffffffffff168767ffffffffffffffff1611155b8061521e575060795467ffffffffffffffff68010000000000000000909104811690881611155b15615255576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781166000908152607860205260409020546801000000000000000090048116908616146152b8576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006152c7878787858861190f565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516152fc91906167e2565b602060405180830381855afa158015615319573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061533c91906167fe565b6153469190616846565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916153c891889190600401616da4565b602060405180830381865afa1580156153e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906154099190616ddf565b61543f576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff891660009081526078602052604090206002015485900361504f576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff6801000000000000000090910481169082161115806154cf575060795467ffffffffffffffff908116908216115b15615506576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff818116600081815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b15801561563857600080fd5b505af115801561564c573d6000803e3d6000fd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161569b91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526157849085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152615ca0565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115613071576079546000906157d39068010000000000000000900467ffffffffffffffff1660016168dc565b90506157de81611ec4565b1561214e5760795460009060029061580190849067ffffffffffffffff16616a53565b61580b9190616e01565b61581590836168dc565b905061582081611ec4565b1561582e5761394081615495565b61394082615495565b6000615841613944565b9050816000806158518484616a53565b606f5467ffffffffffffffff91821692506000916158759161010090041642616a74565b90505b8467ffffffffffffffff168467ffffffffffffffff16146159005767ffffffffffffffff808516600090815260726020526040902060018101549091168210156158de57600181015468010000000000000000900467ffffffffffffffff1694506158fa565b6158e88686616a53565b67ffffffffffffffff16935050615900565b50615878565b600061590c8484616a74565b90508381101561596357808403600c8111615927578061592a565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a607054028161595957615959616817565b04607055506159d3565b838103600c81116159745780615977565b600c5b90506000816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a764000002816159ae576159ae616817565b04905080607054670de0b6b3a764000002816159cc576159cc616817565b0460705550505b683635c9adc5dea0000060705411156159f857683635c9adc5dea000006070556134f3565b633b9aca0060705410156134f357633b9aca0060705550505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b158015615af657600080fd5b505af1158015615b0a573d6000803e3d6000fd5b50505050613071615dac565b600054610100900460ff16615bad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610dba565b61307133615a17565b606f5460ff16615bf2576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052615c9b9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401615702565b505050565b6000615d02826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615e3f9092919063ffffffff16565b805190915015615c9b5780806020019051810190615d209190616ddf565b615c9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610dba565b606f5460ff1615615de9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b6060615e4e8484600085615e56565b949350505050565b606082471015615ee8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610dba565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051615f1191906167e2565b60006040518083038185875af1925050503d8060008114615f4e576040519150601f19603f3d011682016040523d82523d6000602084013e615f53565b606091505b5091509150615f6487838387615f6f565b979650505050505050565b60608315616005578251600003615ffe5773ffffffffffffffffffffffffffffffffffffffff85163b615ffe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610dba565b5081615e4e565b615e4e838381511561601a5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dba9190616129565b803567ffffffffffffffff8116811461392757600080fd5b600080600080600060a0868803121561607e57600080fd5b6160878661604e565b94506160956020870161604e565b93506160a36040870161604e565b94979396509394606081013594506080013592915050565b60005b838110156160d65781810151838201526020016160be565b50506000910152565b600081518084526160f78160208601602086016160bb565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061613c60208301846160df565b9392505050565b806040810183101561615457600080fd5b92915050565b6000806000806000806000806101a0898b03121561617757600080fd5b6161808961604e565b975061618e60208a0161604e565b965061619c60408a0161604e565b955060608901359450608089013593506161b98a60a08b01616143565b925061016089018a8111156161cd57600080fd5b60e08a0192506161dd8b82616143565b9150509295985092959890939650565b6000602082840312156161ff57600080fd5b813561ffff8116811461613c57600080fd5b600080600080600060a0868803121561622957600080fd5b6162328661604e565b94506162406020870161604e565b94979496505050506040830135926060810135926080909101359150565b80610300810183101561615457600080fd5b6000806000806000806103a0878903121561628a57600080fd5b6162938761604e565b95506162a16020880161604e565b94506162af6040880161604e565b935060608701359250608087013591506162cc8860a0890161625e565b90509295509295509295565b60008060008060008060006103c0888a0312156162f457600080fd5b6162fd8861604e565b965061630b6020890161604e565b95506163196040890161604e565b94506163276060890161604e565b93506080880135925060a088013591506163448960c08a0161625e565b905092959891949750929550565b60006020828403121561636457600080fd5b61613c8261604e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126163ad57600080fd5b813567ffffffffffffffff808211156163c8576163c861636d565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561640e5761640e61636d565b8160405283815286602085880101111561642757600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461392757600080fd5b600080600080600060a0868803121561648357600080fd5b85359450602086013567ffffffffffffffff8111156164a157600080fd5b6164ad8882890161639c565b945050604086013592506164c36060870161604e565b91506164d160808701616447565b90509295509295909350565b60008083601f8401126164ef57600080fd5b50813567ffffffffffffffff81111561650757600080fd5b6020830191508360208260051b850101111561652257600080fd5b9250929050565b60008060006040848603121561653e57600080fd5b833567ffffffffffffffff81111561655557600080fd5b616561868287016164dd565b9094509250616574905060208501616447565b90509250925092565b60006020828403121561658f57600080fd5b61613c82616447565b6000602082840312156165aa57600080fd5b5035919050565b6000602082840312156165c357600080fd5b813567ffffffffffffffff8111156165da57600080fd5b615e4e8482850161639c565b60008083601f8401126165f857600080fd5b50813567ffffffffffffffff81111561661057600080fd5b60208301915083602082850101111561652257600080fd5b60008060008060008086880361012081121561664357600080fd5b60a081121561665157600080fd5b5086955060a0870135945060c087013567ffffffffffffffff8082111561667757600080fd5b6166838a838b0161639c565b955060e089013591508082111561669957600080fd5b6166a58a838b0161639c565b94506101008901359150808211156166bc57600080fd5b506166c989828a016165e6565b979a9699509497509295939492505050565b600080602083850312156166ee57600080fd5b823567ffffffffffffffff81111561670557600080fd5b616711858286016164dd565b90969095509350505050565b6000806000806080858703121561673357600080fd5b61673c8561604e565b9350602085013592506167516040860161604e565b915061675f6060860161604e565b905092959194509250565b60008060006040848603121561677f57600080fd5b833567ffffffffffffffff81111561679657600080fd5b6167a2868287016165e6565b909790965060209590950135949350505050565b600080604083850312156167c957600080fd5b823591506167d96020840161604e565b90509250929050565b600082516167f48184602087016160bb565b9190910192915050565b60006020828403121561681057600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261685557616855616817565b500690565b600181811c9082168061686e57607f821691505b6020821081036168a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8181168382160190808211156168fd576168fd6168ad565b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126167f457600080fd5b60006080823603121561697957600080fd5b6040516080810167ffffffffffffffff828210818311171561699d5761699d61636d565b8160405284359150808211156169b257600080fd5b506169bf3682860161639c565b825250602083013560208201526169d86040840161604e565b60408201526169e96060840161604e565b606082015292915050565b600067ffffffffffffffff808316818103616a1157616a116168ad565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203616a4c57616a4c6168ad565b5060010190565b67ffffffffffffffff8281168282160390808211156168fd576168fd6168ad565b81810381811115616154576161546168ad565b8082028115828204841417616154576161546168ad565b600082616aad57616aad616817565b500490565b601f821115615c9b57600081815260208120601f850160051c81016020861015616ad95750805b601f850160051c820191505b81811015616af857828155600101616ae5565b505050505050565b815167ffffffffffffffff811115616b1a57616b1a61636d565b616b2e81616b28845461685a565b84616ab2565b602080601f831160018114616b815760008415616b4b5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555616af8565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015616bce57888601518255948401946001909101908401616baf565b5085821015616c0a57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600067ffffffffffffffff808716835280861660208401525060606040830152616c91606083018486616c1a565b9695505050505050565b80820180821115616154576161546168ad565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126167f457600080fd5b600060608236031215616cf457600080fd5b6040516060810167ffffffffffffffff8282108183111715616d1857616d1861636d565b816040528435915080821115616d2d57600080fd5b50616d3a3682860161639c565b82525060208301356020820152616d536040840161604e565b604082015292915050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000616c91606083018486616c1a565b61032081016103008085843782018360005b6001811015616dd5578151835260209283019290910190600101616db6565b5050509392505050565b600060208284031215616df157600080fd5b8151801515811461613c57600080fd5b600067ffffffffffffffff80841680616e1c57616e1c616817565b9216919091049291505056fea26469706673582212200d16bdfde0b321a22abe6c2d141b1b0579321cd6fce8fe87dd8ebcb5f5c5aaca64736f6c63430008140033", + "bytecode": "0x61014060405234801562000011575f80fd5b506040516200527f3803806200527f8339810160408190526200003491620000a2565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b039182166101005216610120526200012a565b6001600160a01b038116811462000083575f80fd5b50565b80516001600160401b03811681146200009d575f80fd5b919050565b5f805f805f8060c08789031215620000b8575f80fd5b8651620000c5816200006e565b6020880151909650620000d8816200006e565b6040880151909550620000eb816200006e565b6060880151909450620000fe816200006e565b92506200010e6080880162000086565b91506200011e60a0880162000086565b90509295509295509295565b60805160a05160c05160e0516101005161012051615088620001f75f395f81816105ef01528181611034015261296b01525f818161074e015261100a01525f818161071401528181611adc01528181612d9d0152613d4501525f81816108ab01528181610de601528181611131015281816112660152818161181b01528181611d6e01528181612f58015261395f01525f81816109470152818161347601526137b501525f818161080f01528181611aaa0152818161212901528181612f2d015261353b01526150885ff3fe608060405234801561000f575f80fd5b506004361061033a575f3560e01c80638c3d7301116101b85780638c3d7301146106985780638da5cb5b146106a057806396dc3d39146106a857806399f5634e146106bb5780639aa972a3146106c35780639b796760146106d65780639c9f3dfe146106e9578063a066215c146106fc578063a3c573eb1461070f578063ada8f91914610736578063adc879e914610749578063afd23cbe14610770578063b4d63f5814610798578063b4f77ea9146107f7578063b6b0b0971461080a578063ba58ae3914610831578063c0cad30214610844578063c0ed84e014610857578063c754c7ed1461085f578063c89e42df14610879578063cfa8ed471461088c578063d02103ca146108a6578063d2e129f9146108cd578063d8d1091b146108e0578063d939b315146108f3578063dbc169761461090d578063e0d1744114610915578063e7a7ed0214610928578063e8bf92ed14610942578063eaeb077b14610969578063ed6b01041461097c578063f14916d614610990578063f2fde38b146109a3578063f851a440146109b6578063f8b823e4146109c9578063fe16564f146109d2575f80fd5b80630a0d9fbe1461033e5780630eaa86ea1461036c578063107bf28c1461038d57806310a01a72146103a257806315064c96146103b75780631816b7e5146103d457806319d8ac61146103e7578063220d7899146103fa578063267822471461040d578063298789831461042d5780632b0006fa146104475780632c1f816a1461045a578063383b3be81461046d578063394218e914610480578063423fa8561461049357806345605267146104ad578063458c0477146104c75780634a1a89a7146104da5780634a910e6a146104f45780634e487706146105075780635392c5e01461051a578063542028d514610539578063574f649e146105415780635e9145c9146105545780635ec9195814610567578063604691691461056f578063621dd411146105775780636b8616ce1461058a5780636ff512cc146105a9578063715018a6146105bc5780637215541a146105c45780637fcb3653146105d7578063831c7ead146105ea578063837a473814610611578063841b24d71461067e575b5f80fd5b606f546103569061010090046001600160401b031681565b604051610363919061417b565b60405180910390f35b61037f61037a3660046141a5565b6109e5565b604051908152602001610363565b610395610bab565b6040516103639190614243565b6103b56103b0366004614272565b610c37565b005b606f546103c49060ff1681565b6040519015158152602001610363565b6103b56103e23660046142ff565b610e7f565b607354610356906001600160401b031681565b610395610408366004614320565b610f38565b607b54610420906001600160a01b031681565b6040516103639190614369565b60745461042090600160401b90046001600160a01b031681565b6103b561045536600461438e565b611092565b6103b56104683660046143f2565b6111c6565b6103c461047b366004614467565b611324565b6103b561048e366004614467565b61136a565b60735461035690600160401b90046001600160401b031681565b60735461035690600160801b90046001600160401b031681565b607954610356906001600160401b031681565b60795461035690600160401b90046001600160401b031681565b6103b5610502366004614467565b611452565b6103b5610515366004614467565b6114c1565b61037f610528366004614467565b60756020525f908152604090205481565b6103956115ad565b61037f61054f366004614532565b6115ba565b6103b56105623660046145e5565b6115fc565b6103b5611b87565b61037f611c13565b6103b561058536600461438e565b611c28565b61037f610598366004614467565b60716020525f908152604090205481565b6103b56105b7366004614634565b611ebe565b6103b5611f3d565b6103b56105d2366004614467565b611f50565b607454610356906001600160401b031681565b6103567f000000000000000000000000000000000000000000000000000000000000000081565b61065361061f36600461464d565b60786020525f90815260409020805460018201546002909201546001600160401b0380831693600160401b90930416919084565b604080516001600160401b039586168152949093166020850152918301526060820152608001610363565b60795461035690600160c01b90046001600160401b031681565b6103b5612068565b6104206120ec565b6103b56106b6366004614467565b6120fb565b61037f612125565b6103b56106d13660046143f2565b61222c565b6103b56106e4366004614467565b6122c2565b6103b56106f7366004614467565b6122f6565b6103b561070a366004614467565b6123e2565b6104207f000000000000000000000000000000000000000000000000000000000000000081565b6103b5610744366004614634565b61248a565b6103567f000000000000000000000000000000000000000000000000000000000000000081565b606f5461078590600160481b900461ffff1681565b60405161ffff9091168152602001610363565b6107d26107a6366004614467565b60726020525f9081526040902080546001909101546001600160401b0380821691600160401b90041683565b604080519384526001600160401b039283166020850152911690820152606001610363565b6103b5610805366004614467565b612500565b6104207f000000000000000000000000000000000000000000000000000000000000000081565b6103c461083f36600461464d565b612511565b6103b5610852366004614664565b612596565b6103566125ae565b607b5461035690600160a01b90046001600160401b031681565b6103b5610887366004614664565b6125f9565b606f5461042090600160581b90046001600160a01b031681565b6104207f000000000000000000000000000000000000000000000000000000000000000081565b6103b56108db3660046146d2565b612660565b6103b56108ee36600461477c565b6129f1565b60795461035690600160801b90046001600160401b031681565b6103b5612d70565b6103b56109233660046147ba565b612e11565b60735461035690600160c01b90046001600160401b031681565b6104207f000000000000000000000000000000000000000000000000000000000000000081565b6103b5610977366004614804565b612e82565b607b546103c490600160e01b900460ff1681565b6103b561099e366004614634565b613128565b6103b56109b1366004614634565b6131a7565b607a54610420906001600160a01b031681565b61037f60705481565b6103b56109e036600461484b565b61321d565b5f805f6109f06125ae565b90506001600160401b03881615610a8c576079546001600160401b039081169089161115610a395760405162461bcd60e51b8152600401610a3090614875565b60405180910390fd5b6001600160401b038089165f908152607860205260409020600281015481549094509091898116600160401b9092041614610a865760405162461bcd60e51b8152600401610a30906148f3565b50610af5565b6001600160401b0387165f90815260756020526040902054915081610ac35760405162461bcd60e51b8152600401610a3090614952565b806001600160401b0316876001600160401b03161115610af55760405162461bcd60e51b8152600401610a30906149a8565b806001600160401b0316866001600160401b031611610b265760405162461bcd60e51b8152600401610a3090614a18565b5f610b348888888689610f38565b90505f5f80516020614ff3833981519152600283604051610b559190614a95565b602060405180830381855afa158015610b70573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b939190614ab0565b610b9d9190614adb565b9a9950505050505050505050565b60778054610bb890614aee565b80601f0160208091040260200160405190810160405280929190818152602001828054610be490614aee565b8015610c2f5780601f10610c0657610100808354040283529160200191610c2f565b820191905f5260205f20905b815481529060010190602001808311610c1257829003601f168201915b505050505081565b610c3f61323e565b5f80610c496125ae565b90506001600160401b038a1615610cdc576079546001600160401b03908116908b161115610c895760405162461bcd60e51b8152600401610a3090614875565b6001600160401b03808b165f9081526078602052604090206002810154815490945090918b8116600160401b9092041614610cd65760405162461bcd60e51b8152600401610a30906148f3565b50610d45565b6001600160401b0389165f90815260756020526040902054915081610d135760405162461bcd60e51b8152600401610a3090614952565b806001600160401b0316896001600160401b03161115610d455760405162461bcd60e51b8152600401610a30906149a8565b806001600160401b0316886001600160401b031611610d765760405162461bcd60e51b8152600401610a3090614a18565b5f610d848a8a8a868b610f38565b607480546001600160401b0319166001600160401b038c81169182179092555f9081526075602052604090208990556079549192501615610dd057607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018990527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b158015610e2f575f80fd5b505af1158015610e41573d5f803e3d5ffd5b50506040518981523392506001600160401b038c1691505f805160206150138339815191529060200160405180910390a35050505050505050505050565b607a546001600160a01b03163314610eaa57604051634755657960e01b815260040160405180910390fd5b6103e88161ffff161080610ec357506103ff8161ffff16115b15610ee157604051630984a67960e31b815260040160405180910390fd5b606f805461ffff60481b1916600160481b61ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b6001600160401b038086165f818152607260205260408082205493881682529020546060929115801590610f6a575081155b15610f885760405163340c614f60e11b815260040160405180910390fd5b80610fa6576040516366385b5160e01b815260040160405180910390fd5b610faf84612511565b610fcc576040516305dae44f60e21b815260040160405180910390fd5b604080516001600160601b03193360601b166020820152603481019690965260548601929092526001600160c01b031960c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b607454600160401b90046001600160a01b031633146110c45760405163bbcbbc0560e01b815260040160405180910390fd5b6110d286868686868661329d565b607480546001600160401b0319166001600160401b038681169182179092555f908152607560205260409020839055607954161561111b57607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b15801561117a575f80fd5b505af115801561118c573d5f803e3d5ffd5b50506040518481523392506001600160401b03871691505f80516020615013833981519152906020015b60405180910390a3505050505050565b607454600160401b90046001600160a01b031633146111f85760405163bbcbbc0560e01b815260040160405180910390fd5b6112078787878787878761356e565b607480546001600160401b0319166001600160401b038681169182179092555f908152607560205260409020839055607954161561125057607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b1580156112af575f80fd5b505af11580156112c1573d5f803e3d5ffd5b5050607980546001600160c01b031661127560c71b179055505060405182815233906001600160401b038616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b6079546001600160401b038281165f908152607860205260408120549092429261135992600160801b90920481169116614b3a565b6001600160401b0316111592915050565b607a546001600160a01b0316331461139557604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b03821611156113c257604051631d06e87960e01b815260040160405180910390fd5b606f5460ff16611402576079546001600160401b03600160c01b9091048116908216106114025760405163401636df60e01b815260040160405180910390fd5b607980546001600160c01b0316600160c01b6001600160401b038416021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190610f2d90839061417b565b607454600160401b90046001600160a01b031633146114b557606f5460ff161561148f57604051630bc011ff60e21b815260040160405180910390fd5b61149881611324565b6114b557604051630674f25160e11b815260040160405180910390fd5b6114be81613882565b50565b607a546001600160a01b031633146114ec57604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b03821611156115195760405163f5e37f2f60e01b815260040160405180910390fd5b606f5460ff1661155957607b546001600160401b03600160a01b9091048116908216106115595760405163f5e37f2f60e01b815260040160405180910390fd5b607b8054600160a01b600160e01b031916600160a01b6001600160401b038416021790556040517fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90610f2d90839061417b565b60768054610bb890614aee565b5f8585805190602001208585856040516020016115db959493929190614b61565b60405160208183030381529060405280519060200120905095945050505050565b606f5460ff161561162057604051630bc011ff60e21b815260040160405180910390fd5b606f54600160581b90046001600160a01b03163314611652576040516311e7be1560e01b815260040160405180910390fd5b815f8190036116745760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561169757604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160401b820481165f81815260726020526040812054838516949293600160801b909304909216919082905b86811015611976575f8a8a838181106116ea576116ea614ba0565b90506020028101906116fc9190614bb4565b61170590614bc8565b805180516020909101206060820151919250906001600160401b0316156117f1578561173081614c51565b9650505f818360200151846060015160405160200161175193929190614c7e565b60408051601f1981840301815291815281516020928301206001600160401b038a165f908152607190935291205490915081146117a15760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b038088165f9081526071602052604080822091909155606085015190850151908216911610156117eb57604051633fbd5c3960e11b815260040160405180910390fd5b506118d3565b60208201511580159061188f575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303815f875af1158015611869573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061188d9190614ab0565b155b156118ad576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c010156118d3576040516328a69b1f60e21b815260040160405180910390fd5b876001600160401b031682604001516001600160401b0316108061190357504282604001516001600160401b0316115b15611921576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518d604051602001611942959493929190614b61565b604051602081830303815290604052805190602001209450816040015197505050808061196e90614ca1565b9150506116cf565b506119818685614b3a565b6073549094506001600160401b03600160c01b909104811690841611156119bb5760405163c630a00d60e01b815260040160405180910390fd5b5f6119c68285614cb9565b6119d9906001600160401b031688614cd9565b60408051606081018252858152426001600160401b03908116602080840191825260738054600160401b9081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585166001600160801b03199384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611a8d5760738054600160801b600160c01b031916600160801b6001600160401b038716021790555b611ad2333083607054611aa09190614cec565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613a14565b611ada613a85565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611b32575f80fd5b505af1158015611b44573d5f803e3d5ffd5b50506040516001600160401b03881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a546001600160a01b03163314611bb257604051634755657960e01b815260040160405180910390fd5b607b54600160e01b900460ff16611bdc5760405163f6ba91a160e01b815260040160405180910390fd5b607b805460ff60e01b191690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f6070546064611c239190614cec565b905090565b606f5460ff1615611c4c57604051630bc011ff60e21b815260040160405180910390fd5b6079546001600160401b038581165f908152607260205260409020600101544292611c8292600160c01b90910481169116614b3a565b6001600160401b03161115611caa57604051638a0704d360e01b815260040160405180910390fd5b6103e8611cb78686614cb9565b6001600160401b03161115611cdf57604051635acfba9d60e11b815260040160405180910390fd5b611ced86868686868661329d565b611cf684613b23565b607954600160801b90046001600160401b03165f03611dd257607480546001600160401b0319166001600160401b038681169182179092555f9081526075602052604090208390556079541615611d5857607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b158015611db7575f80fd5b505af1158015611dc9573d5f803e3d5ffd5b50505050611e81565b611dda613a85565b607980546001600160401b0316905f611df283614c51565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f9081526078909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b60405182815233906001600160401b038616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966906020016111b6565b607a546001600160a01b03163314611ee957604051634755657960e01b815260040160405180910390fd5b606f8054600160581b600160f81b031916600160581b6001600160a01b038416021790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610f2d908390614369565b611f4561323e565b611f4e5f613cf2565b565b611f586120ec565b6001600160a01b0316336001600160a01b031614612060575f611f796125ae565b9050806001600160401b0316826001600160401b031611611fad5760405163812a372d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b90910481169083161180611feb57506001600160401b038083165f9081526072602052604090206001015416155b1561200957604051632631700560e21b815260040160405180910390fd5b6001600160401b038083165f9081526072602052604090206001015442916120369162093a809116614b3a565b6001600160401b0316111561205e5760405163692baaad60e11b815260040160405180910390fd5b505b6114be613d43565b607b546001600160a01b031633146120935760405163d1ec4b2360e01b815260040160405180910390fd5b607b54607a80546001600160a01b0319166001600160a01b0390921691821790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e916120e291614369565b60405180910390a1565b6033546001600160a01b031690565b61210361323e565b607480546001600160401b0319166001600160401b0392909216919091179055565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016121739190614369565b602060405180830381865afa15801561218e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121b29190614ab0565b90505f6121bd6125ae565b6073546001600160401b03600160401b82048116916121ed91600160801b8204811691600160c01b900416614cb9565b6121f79190614b3a565b6122019190614cb9565b6001600160401b03169050805f0361221b575f9250505090565b6122258183614d03565b9250505090565b606f5460ff161561225057604051630bc011ff60e21b815260040160405180910390fd5b61225f8787878787878761356e565b6001600160401b0384165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16122b9613d43565b50505050505050565b6122ca61323e565b607380546001600160401b03909216600160401b02600160401b600160801b0319909216919091179055565b607a546001600160a01b0316331461232157604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b038216111561234e57604051630cc9650760e41b815260040160405180910390fd5b606f5460ff1661238e576079546001600160401b03600160801b90910481169082161061238e5760405163048a05a960e41b815260040160405180910390fd5b60798054600160801b600160c01b031916600160801b6001600160401b038416021790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590610f2d90839061417b565b607a546001600160a01b0316331461240d57604051634755657960e01b815260040160405180910390fd5b62015180816001600160401b0316111561243a57604051631c0cfbfd60e31b815260040160405180910390fd5b606f8054610100600160481b0319166101006001600160401b038416021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890610f2d90839061417b565b607a546001600160a01b031633146124b557604051634755657960e01b815260040160405180910390fd5b607b80546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610f2d908390614369565b61250861323e565b6114be81613b23565b5f67ffffffff000000016001600160401b038316108015612546575067ffffffff00000001604083901c6001600160401b0316105b8015612566575067ffffffff00000001608083901c6001600160401b0316105b801561257d575067ffffffff0000000160c083901c105b1561258a57506001919050565b505f919050565b919050565b61259e61323e565b60776125aa8282614d63565b5050565b6079545f906001600160401b0316156125e957506079546001600160401b039081165f90815260786020526040902054600160401b90041690565b506074546001600160401b031690565b607a546001600160a01b0316331461262457604051634755657960e01b815260040160405180910390fd5b60766126308282614d63565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610f2d9190614243565b5f54610100900460ff161580801561267e57505f54600160ff909116105b8061269e575061268d30613db9565b15801561269e57505f5460ff166001145b6127015760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610a30565b5f805460ff191660011790558015612722575f805461ff0019166101001790555b61272f6020880188614634565b607a80546001600160a01b0319166001600160a01b039290921691909117905561275f6040880160208901614634565b606f80546001600160a01b0392909216600160581b02600160581b600160f81b031990921691909117905561279a6080880160608901614634565b607480546001600160a01b0392909216600160401b02600160401b600160e01b03199092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad86905560766127fd8682614d63565b50607761280a8582614d63565b5062093a8061281f6060890160408a01614467565b6001600160401b0316111561284757604051630cc9650760e41b815260040160405180910390fd5b6128576060880160408901614467565b607980546001600160401b0392909216600160801b02600160801b600160c01b031990921691909117905562093a8061289660a0890160808a01614467565b6001600160401b031611156128be57604051631d06e87960e01b815260040160405180910390fd5b6128ce60a0880160808901614467565b607980546001600160c01b0316600160c01b6001600160401b03939093169290920291909117905567016345785d8a0000607055606f8054610100600160581b031916620708006101f560491b01179055607b8054600160a01b600160e81b031916670200000000000d2f60a71b179055612947613dc8565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f0000000000000000000000000000000000000000000000000000000000000000858560405161299c9493929190614e46565b60405180910390a180156122b9575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b54600160e01b900460ff1615612a1c576040516324eff8c360e01b815260040160405180910390fd5b606f5460ff1615612a4057604051630bc011ff60e21b815260040160405180910390fd5b805f819003612a625760405163cb591a5f60e01b815260040160405180910390fd5b6103e8811115612a8557604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160c01b8204811691612aad918491600160801b900416614e7c565b1115612acc5760405163c630a00d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b820481165f818152607260205260408120549193600160801b9004909216915b84811015612c7b575f878783818110612b1757612b17614ba0565b9050602002810190612b299190614e8f565b612b3290614ea3565b905083612b3e81614c51565b825180516020918201208185015160408087015190519499509194505f93612b699386939101614c7e565b60408051601f1981840301815291815281516020928301206001600160401b0389165f90815260719093529120549091508114612bb95760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b0386165f90815260716020526040812055612bdc600189614cd9565b8403612c305742607b60149054906101000a90046001600160401b03168460400151612c089190614b3a565b6001600160401b03161115612c305760405163c44a082160e01b815260040160405180910390fd5b848284602001514233604051602001612c4d959493929190614b61565b6040516020818303038152906040528051906020012094505050508080612c7390614ca1565b915050612afc565b50612c868484614b3a565b607380546001600160401b034281166001600160401b03199092168217808455604080516060810182528781526020808201958652600160401b9384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686026001600160801b031990921693871693909317179091558554938916600160801b02600160801b600160c01b031993860293909316600160401b600160c01b031990941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a546001600160a01b03163314612d9b57604051634755657960e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612df3575f80fd5b505af1158015612e05573d5f803e3d5ffd5b50505050611f4e613e3b565b612e1961323e565b604080516060810182529384526001600160401b0392831660208086019182529284168583019081529584165f9081526072909352912092518355516001909201805493518216600160401b026001600160801b03199094169290911691909117919091179055565b607b54600160e01b900460ff1615612ead576040516324eff8c360e01b815260040160405180910390fd5b606f5460ff1615612ed157604051630bc011ff60e21b815260040160405180910390fd5b5f612eda611c13565b905081811115612efd57604051634732fdb560e01b815260040160405180910390fd5b611388831115612f20576040516328a69b1f60e21b815260040160405180910390fd5b612f556001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084613a14565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fb2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fd69190614ab0565b60738054919250600160c01b9091046001600160401b0316906018612ffa83614c51565b91906101000a8154816001600160401b0302191690836001600160401b0316021790555050848460405161302f929190614f1b565b6040519081900381206130489183904290602001614c7e565b60408051808303601f190181529181528151602092830120607354600160c01b90046001600160401b03165f90815260719093529120553233036130d7576073546040805183815233602082015260609181018290525f91810191909152600160c01b9091046001600160401b0316905f805160206150338339815191529060800160405180910390a2613121565b607360189054906101000a90046001600160401b03166001600160401b03165f80516020615033833981519152823388886040516131189493929190614f2a565b60405180910390a25b5050505050565b607a546001600160a01b0316331461315357604051634755657960e01b815260040160405180910390fd5b60748054600160401b600160e01b031916600160401b6001600160a01b038416021790556040517f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90610f2d908390614369565b6131af61323e565b6001600160a01b0381166132145760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a30565b6114be81613cf2565b61322561323e565b6001600160401b03165f90815260756020526040902055565b336132476120ec565b6001600160a01b031614611f4e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a30565b5f806132a76125ae565b90506001600160401b0388161561333c576079546001600160401b0390811690891611156132e85760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b038089165f908152607860205260409020600281015481549094509091898116600160401b909204161461333657604051632bd2e3e760e01b815260040160405180910390fd5b506133a7565b6001600160401b0387165f90815260756020526040902054915081613374576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611156133a757604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316866001600160401b0316116133d95760405163b9b18f5760e01b815260040160405180910390fd5b5f6133e78888888689610f38565b90505f5f80516020614ff38339815191526002836040516134089190614a95565b602060405180830381855afa158015613423573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906134469190614ab0565b6134509190614adb565b604080516020810182528281529051634890ed4560e11b81529192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916134ac91899190600401614f54565b602060405180830381865afa1580156134c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134eb9190614f8e565b613508576040516309bde33960e01b815260040160405180910390fd5b61356233613516858b614cb9565b6001600160401b0316613527612125565b6135319190614cec565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190613e92565b50505050505050505050565b5f6001600160401b03881615613600576079546001600160401b0390811690891611156135ae5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f908152607860205260409020600281015481549092888116600160401b90920416146135fa57604051632bd2e3e760e01b815260040160405180910390fd5b50613667565b506001600160401b0385165f9081526075602052604090205480613637576040516324cbdcc360e11b815260040160405180910390fd5b6074546001600160401b03908116908716111561366757604051630f2b74f160e11b815260040160405180910390fd5b6079546001600160401b0390811690881611806136965750876001600160401b0316876001600160401b031611155b806136b757506079546001600160401b03600160401b909104811690881611155b156136d55760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260786020526040902054600160401b9004811690861614613718576040516332a2a77f60e01b815260040160405180910390fd5b5f6137268787878588610f38565b90505f5f80516020614ff38339815191526002836040516137479190614a95565b602060405180830381855afa158015613762573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137859190614ab0565b61378f9190614adb565b604080516020810182528281529051634890ed4560e11b81529192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916137eb91889190600401614f54565b602060405180830381865afa158015613806573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061382a9190614f8e565b613847576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f908152607860205260409020600201548590036135625760405163a47276bd60e01b815260040160405180910390fd5b6079546001600160401b03600160401b90910481169082161115806138b557506079546001600160401b03908116908216115b156138d35760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f818152607860209081526040808320805460748054600160401b928390049098166001600160401b03199098168817905560028201548786526075909452938290209290925560798054600160401b600160801b0319169390940292909217909255600182015490516333d6247d60e01b815260048101919091529091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b1580156139a8575f80fd5b505af11580156139ba573d5f803e3d5ffd5b50505050826001600160401b0316816001600160401b03167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e8460020154604051613a0791815260200190565b60405180910390a3505050565b6040516001600160a01b0380851660248301528316604482015260648101829052613a7f9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613ec7565b50505050565b6079546001600160401b03600160401b8204811691161115611f4e576079545f90613ac190600160401b90046001600160401b03166001614b3a565b9050613acc81611324565b156114be576079545f90600290613aed9084906001600160401b0316614cb9565b613af79190614fad565b613b019083614b3a565b9050613b0c81611324565b15613b1a576125aa81613882565b6125aa82613882565b5f613b2c6125ae565b9050815f80613b3b8484614cb9565b606f546001600160401b0391821692505f91613b5d9161010090041642614cd9565b90505b846001600160401b0316846001600160401b031614613bdd576001600160401b038085165f9081526072602052604090206001810154909116821015613bbc576001810154600160401b90046001600160401b03169450613bd7565b613bc68686614cb9565b6001600160401b0316935050613bdd565b50613b60565b5f613be88484614cd9565b905083811015613c3f57808403600c8111613c035780613c06565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281613c3557613c35614ac7565b0460705550613cae565b838103600c8111613c505780613c53565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a76400000281613c8957613c89614ac7565b04905080607054670de0b6b3a76400000281613ca757613ca7614ac7565b0460705550505b683635c9adc5dea000006070541115613cd357683635c9adc5dea000006070556122b9565b633b9aca0060705410156122b957633b9aca0060705550505050505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613d9b575f80fd5b505af1158015613dad573d5f803e3d5ffd5b50505050611f4e613f98565b6001600160a01b03163b151590565b5f54610100900460ff16613e325760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610a30565b611f4e33613cf2565b606f5460ff16613e5e57604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b6040516001600160a01b038316602482015260448101829052613ec290849063a9059cbb60e01b90606401613a48565b505050565b5f613f1b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613ff39092919063ffffffff16565b805190915015613ec25780806020019051810190613f399190614f8e565b613ec25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a30565b606f5460ff1615613fbc57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b606061400184845f85614009565b949350505050565b60608247101561406a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610a30565b5f80866001600160a01b031685876040516140859190614a95565b5f6040518083038185875af1925050503d805f81146140bf576040519150601f19603f3d011682016040523d82523d5f602084013e6140c4565b606091505b50915091506140d5878383876140e0565b979650505050505050565b6060831561414c5782515f03614145576140f985613db9565b6141455760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a30565b5081614001565b61400183838151156141615781518083602001fd5b8060405162461bcd60e51b8152600401610a309190614243565b6001600160401b0391909116815260200190565b80356001600160401b0381168114612591575f80fd5b5f805f805f60a086880312156141b9575f80fd5b6141c28661418f565b94506141d06020870161418f565b93506141de6040870161418f565b94979396509394606081013594506080013592915050565b5f5b838110156142105781810151838201526020016141f8565b50505f910152565b5f815180845261422f8160208601602086016141f6565b601f01601f19169290920160200192915050565b602081525f6142556020830184614218565b9392505050565b806040810183101561426c575f80fd5b92915050565b5f805f805f805f806101a0898b03121561428a575f80fd5b6142938961418f565b97506142a160208a0161418f565b96506142af60408a0161418f565b955060608901359450608089013593506142cc8a60a08b0161425c565b925061016089018a8111156142df575f80fd5b60e08a0192506142ef8b8261425c565b9150509295985092959890939650565b5f6020828403121561430f575f80fd5b813561ffff81168114614255575f80fd5b5f805f805f60a08688031215614334575f80fd5b61433d8661418f565b945061434b6020870161418f565b94979496505050506040830135926060810135926080909101359150565b6001600160a01b0391909116815260200190565b80610300810183101561426c575f80fd5b5f805f805f806103a087890312156143a4575f80fd5b6143ad8761418f565b95506143bb6020880161418f565b94506143c96040880161418f565b935060608701359250608087013591506143e68860a0890161437d565b90509295509295509295565b5f805f805f805f6103c0888a031215614409575f80fd5b6144128861418f565b96506144206020890161418f565b955061442e6040890161418f565b945061443c6060890161418f565b93506080880135925060a088013591506144598960c08a0161437d565b905092959891949750929550565b5f60208284031215614477575f80fd5b6142558261418f565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126144a3575f80fd5b81356001600160401b03808211156144bd576144bd614480565b604051601f8301601f19908116603f011681019082821181831017156144e5576144e5614480565b816040528381528660208588010111156144fd575f80fd5b836020870160208301375f602085830101528094505050505092915050565b80356001600160a01b0381168114612591575f80fd5b5f805f805f60a08688031215614546575f80fd5b8535945060208601356001600160401b03811115614562575f80fd5b61456e88828901614494565b945050604086013592506145846060870161418f565b91506145926080870161451c565b90509295509295909350565b5f8083601f8401126145ae575f80fd5b5081356001600160401b038111156145c4575f80fd5b6020830191508360208260051b85010111156145de575f80fd5b9250929050565b5f805f604084860312156145f7575f80fd5b83356001600160401b0381111561460c575f80fd5b6146188682870161459e565b909450925061462b90506020850161451c565b90509250925092565b5f60208284031215614644575f80fd5b6142558261451c565b5f6020828403121561465d575f80fd5b5035919050565b5f60208284031215614674575f80fd5b81356001600160401b03811115614689575f80fd5b61400184828501614494565b5f8083601f8401126146a5575f80fd5b5081356001600160401b038111156146bb575f80fd5b6020830191508360208285010111156145de575f80fd5b5f805f805f808688036101208112156146e9575f80fd5b60a08112156146f6575f80fd5b5086955060a0860135945060c08601356001600160401b038082111561471a575f80fd5b6147268a838b01614494565b955060e089013591508082111561473b575f80fd5b6147478a838b01614494565b945061010089013591508082111561475d575f80fd5b5061476a89828a01614695565b979a9699509497509295939492505050565b5f806020838503121561478d575f80fd5b82356001600160401b038111156147a2575f80fd5b6147ae8582860161459e565b90969095509350505050565b5f805f80608085870312156147cd575f80fd5b6147d68561418f565b9350602085013592506147eb6040860161418f565b91506147f96060860161418f565b905092959194509250565b5f805f60408486031215614816575f80fd5b83356001600160401b0381111561482b575f80fd5b61483786828701614695565b909790965060209590950135949350505050565b5f806040838503121561485c575f80fd5b8235915061486c6020840161418f565b90509250929050565b60208082526058908201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60408201527f64696e6753746174654e756d206d757374206265206c657373206f7220657175606082015277616c207468616e206c61737450656e64696e67537461746560401b608082015260a00190565b6020808252604c908201525f80516020614fd383398151915260408201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760608201526b040e6e8c2e8ca40c4c2e8c6d60a31b608082015260a00190565b60208082526043908201525f80516020614fd383398151915260408201527f744e756d426174636820737461746520726f6f7420646f6573206e6f742065786060820152621a5cdd60ea1b608082015260a00190565b6020808252605d908201525f80516020614fd383398151915260408201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060608201527f7468616e2063757272656e744c61737456657269666965644261746368000000608082015260a00190565b60208082526057908201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60408201527f616c4e65774261746368206d75737420626520626967676572207468616e20636060820152760eae4e4cadce898c2e6e8accae4d2ccd2cac884c2e8c6d604b1b608082015260a00190565b5f8251614aa68184602087016141f6565b9190910192915050565b5f60208284031215614ac0575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82614ae957614ae9614ac7565b500690565b600181811c90821680614b0257607f821691505b602082108103614b2057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03818116838216019080821115614b5a57614b5a614b26565b5092915050565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112614aa6575f80fd5b5f60808236031215614bd8575f80fd5b604051608081016001600160401b038082118383101715614bfb57614bfb614480565b816040528435915080821115614c0f575f80fd5b50614c1c36828601614494565b82525060208301356020820152614c356040840161418f565b6040820152614c466060840161418f565b606082015292915050565b5f6001600160401b038281166002600160401b03198101614c7457614c74614b26565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b5f60018201614cb257614cb2614b26565b5060010190565b6001600160401b03828116828216039080821115614b5a57614b5a614b26565b8181038181111561426c5761426c614b26565b808202811582820484141761426c5761426c614b26565b5f82614d1157614d11614ac7565b500490565b601f821115613ec2575f81815260208120601f850160051c81016020861015614d3c5750805b601f850160051c820191505b81811015614d5b57828155600101614d48565b505050505050565b81516001600160401b03811115614d7c57614d7c614480565b614d9081614d8a8454614aee565b84614d16565b602080601f831160018114614dc3575f8415614dac5750858301515b5f19600386901b1c1916600185901b178555614d5b565b5f85815260208120601f198616915b82811015614df157888601518255948401946001909101908401614dd2565b5085821015614e0e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160401b038581168252841660208201526060604082018190525f90614e729083018486614e1e565b9695505050505050565b8082018082111561426c5761426c614b26565b5f8235605e19833603018112614aa6575f80fd5b5f60608236031215614eb3575f80fd5b604051606081016001600160401b038082118383101715614ed657614ed6614480565b816040528435915080821115614eea575f80fd5b50614ef736828601614494565b82525060208301356020820152614f106040840161418f565b604082015292915050565b818382375f9101908152919050565b8481526001600160a01b03841660208201526060604082018190525f90614e729083018486614e1e565b6103208101610300808584378201835f5b6001811015614f84578151835260209283019290910190600101614f65565b5050509392505050565b5f60208284031215614f9e575f80fd5b81518015158114614255575f80fd5b5f6001600160401b0383811680614fc657614fc6614ac7565b9216919091049291505056fe506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6930644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001cb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fef94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931a2646970667358221220e9d0794f194ac421b9dc493895a874be8a13d701d1033aaa31a3f4a7f895a91464736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061033a575f3560e01c80638c3d7301116101b85780638c3d7301146106985780638da5cb5b146106a057806396dc3d39146106a857806399f5634e146106bb5780639aa972a3146106c35780639b796760146106d65780639c9f3dfe146106e9578063a066215c146106fc578063a3c573eb1461070f578063ada8f91914610736578063adc879e914610749578063afd23cbe14610770578063b4d63f5814610798578063b4f77ea9146107f7578063b6b0b0971461080a578063ba58ae3914610831578063c0cad30214610844578063c0ed84e014610857578063c754c7ed1461085f578063c89e42df14610879578063cfa8ed471461088c578063d02103ca146108a6578063d2e129f9146108cd578063d8d1091b146108e0578063d939b315146108f3578063dbc169761461090d578063e0d1744114610915578063e7a7ed0214610928578063e8bf92ed14610942578063eaeb077b14610969578063ed6b01041461097c578063f14916d614610990578063f2fde38b146109a3578063f851a440146109b6578063f8b823e4146109c9578063fe16564f146109d2575f80fd5b80630a0d9fbe1461033e5780630eaa86ea1461036c578063107bf28c1461038d57806310a01a72146103a257806315064c96146103b75780631816b7e5146103d457806319d8ac61146103e7578063220d7899146103fa578063267822471461040d578063298789831461042d5780632b0006fa146104475780632c1f816a1461045a578063383b3be81461046d578063394218e914610480578063423fa8561461049357806345605267146104ad578063458c0477146104c75780634a1a89a7146104da5780634a910e6a146104f45780634e487706146105075780635392c5e01461051a578063542028d514610539578063574f649e146105415780635e9145c9146105545780635ec9195814610567578063604691691461056f578063621dd411146105775780636b8616ce1461058a5780636ff512cc146105a9578063715018a6146105bc5780637215541a146105c45780637fcb3653146105d7578063831c7ead146105ea578063837a473814610611578063841b24d71461067e575b5f80fd5b606f546103569061010090046001600160401b031681565b604051610363919061417b565b60405180910390f35b61037f61037a3660046141a5565b6109e5565b604051908152602001610363565b610395610bab565b6040516103639190614243565b6103b56103b0366004614272565b610c37565b005b606f546103c49060ff1681565b6040519015158152602001610363565b6103b56103e23660046142ff565b610e7f565b607354610356906001600160401b031681565b610395610408366004614320565b610f38565b607b54610420906001600160a01b031681565b6040516103639190614369565b60745461042090600160401b90046001600160a01b031681565b6103b561045536600461438e565b611092565b6103b56104683660046143f2565b6111c6565b6103c461047b366004614467565b611324565b6103b561048e366004614467565b61136a565b60735461035690600160401b90046001600160401b031681565b60735461035690600160801b90046001600160401b031681565b607954610356906001600160401b031681565b60795461035690600160401b90046001600160401b031681565b6103b5610502366004614467565b611452565b6103b5610515366004614467565b6114c1565b61037f610528366004614467565b60756020525f908152604090205481565b6103956115ad565b61037f61054f366004614532565b6115ba565b6103b56105623660046145e5565b6115fc565b6103b5611b87565b61037f611c13565b6103b561058536600461438e565b611c28565b61037f610598366004614467565b60716020525f908152604090205481565b6103b56105b7366004614634565b611ebe565b6103b5611f3d565b6103b56105d2366004614467565b611f50565b607454610356906001600160401b031681565b6103567f000000000000000000000000000000000000000000000000000000000000000081565b61065361061f36600461464d565b60786020525f90815260409020805460018201546002909201546001600160401b0380831693600160401b90930416919084565b604080516001600160401b039586168152949093166020850152918301526060820152608001610363565b60795461035690600160c01b90046001600160401b031681565b6103b5612068565b6104206120ec565b6103b56106b6366004614467565b6120fb565b61037f612125565b6103b56106d13660046143f2565b61222c565b6103b56106e4366004614467565b6122c2565b6103b56106f7366004614467565b6122f6565b6103b561070a366004614467565b6123e2565b6104207f000000000000000000000000000000000000000000000000000000000000000081565b6103b5610744366004614634565b61248a565b6103567f000000000000000000000000000000000000000000000000000000000000000081565b606f5461078590600160481b900461ffff1681565b60405161ffff9091168152602001610363565b6107d26107a6366004614467565b60726020525f9081526040902080546001909101546001600160401b0380821691600160401b90041683565b604080519384526001600160401b039283166020850152911690820152606001610363565b6103b5610805366004614467565b612500565b6104207f000000000000000000000000000000000000000000000000000000000000000081565b6103c461083f36600461464d565b612511565b6103b5610852366004614664565b612596565b6103566125ae565b607b5461035690600160a01b90046001600160401b031681565b6103b5610887366004614664565b6125f9565b606f5461042090600160581b90046001600160a01b031681565b6104207f000000000000000000000000000000000000000000000000000000000000000081565b6103b56108db3660046146d2565b612660565b6103b56108ee36600461477c565b6129f1565b60795461035690600160801b90046001600160401b031681565b6103b5612d70565b6103b56109233660046147ba565b612e11565b60735461035690600160c01b90046001600160401b031681565b6104207f000000000000000000000000000000000000000000000000000000000000000081565b6103b5610977366004614804565b612e82565b607b546103c490600160e01b900460ff1681565b6103b561099e366004614634565b613128565b6103b56109b1366004614634565b6131a7565b607a54610420906001600160a01b031681565b61037f60705481565b6103b56109e036600461484b565b61321d565b5f805f6109f06125ae565b90506001600160401b03881615610a8c576079546001600160401b039081169089161115610a395760405162461bcd60e51b8152600401610a3090614875565b60405180910390fd5b6001600160401b038089165f908152607860205260409020600281015481549094509091898116600160401b9092041614610a865760405162461bcd60e51b8152600401610a30906148f3565b50610af5565b6001600160401b0387165f90815260756020526040902054915081610ac35760405162461bcd60e51b8152600401610a3090614952565b806001600160401b0316876001600160401b03161115610af55760405162461bcd60e51b8152600401610a30906149a8565b806001600160401b0316866001600160401b031611610b265760405162461bcd60e51b8152600401610a3090614a18565b5f610b348888888689610f38565b90505f5f80516020614ff3833981519152600283604051610b559190614a95565b602060405180830381855afa158015610b70573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b939190614ab0565b610b9d9190614adb565b9a9950505050505050505050565b60778054610bb890614aee565b80601f0160208091040260200160405190810160405280929190818152602001828054610be490614aee565b8015610c2f5780601f10610c0657610100808354040283529160200191610c2f565b820191905f5260205f20905b815481529060010190602001808311610c1257829003601f168201915b505050505081565b610c3f61323e565b5f80610c496125ae565b90506001600160401b038a1615610cdc576079546001600160401b03908116908b161115610c895760405162461bcd60e51b8152600401610a3090614875565b6001600160401b03808b165f9081526078602052604090206002810154815490945090918b8116600160401b9092041614610cd65760405162461bcd60e51b8152600401610a30906148f3565b50610d45565b6001600160401b0389165f90815260756020526040902054915081610d135760405162461bcd60e51b8152600401610a3090614952565b806001600160401b0316896001600160401b03161115610d455760405162461bcd60e51b8152600401610a30906149a8565b806001600160401b0316886001600160401b031611610d765760405162461bcd60e51b8152600401610a3090614a18565b5f610d848a8a8a868b610f38565b607480546001600160401b0319166001600160401b038c81169182179092555f9081526075602052604090208990556079549192501615610dd057607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018990527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b158015610e2f575f80fd5b505af1158015610e41573d5f803e3d5ffd5b50506040518981523392506001600160401b038c1691505f805160206150138339815191529060200160405180910390a35050505050505050505050565b607a546001600160a01b03163314610eaa57604051634755657960e01b815260040160405180910390fd5b6103e88161ffff161080610ec357506103ff8161ffff16115b15610ee157604051630984a67960e31b815260040160405180910390fd5b606f805461ffff60481b1916600160481b61ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b6001600160401b038086165f818152607260205260408082205493881682529020546060929115801590610f6a575081155b15610f885760405163340c614f60e11b815260040160405180910390fd5b80610fa6576040516366385b5160e01b815260040160405180910390fd5b610faf84612511565b610fcc576040516305dae44f60e21b815260040160405180910390fd5b604080516001600160601b03193360601b166020820152603481019690965260548601929092526001600160c01b031960c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b607454600160401b90046001600160a01b031633146110c45760405163bbcbbc0560e01b815260040160405180910390fd5b6110d286868686868661329d565b607480546001600160401b0319166001600160401b038681169182179092555f908152607560205260409020839055607954161561111b57607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b15801561117a575f80fd5b505af115801561118c573d5f803e3d5ffd5b50506040518481523392506001600160401b03871691505f80516020615013833981519152906020015b60405180910390a3505050505050565b607454600160401b90046001600160a01b031633146111f85760405163bbcbbc0560e01b815260040160405180910390fd5b6112078787878787878761356e565b607480546001600160401b0319166001600160401b038681169182179092555f908152607560205260409020839055607954161561125057607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b1580156112af575f80fd5b505af11580156112c1573d5f803e3d5ffd5b5050607980546001600160c01b031661127560c71b179055505060405182815233906001600160401b038616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b6079546001600160401b038281165f908152607860205260408120549092429261135992600160801b90920481169116614b3a565b6001600160401b0316111592915050565b607a546001600160a01b0316331461139557604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b03821611156113c257604051631d06e87960e01b815260040160405180910390fd5b606f5460ff16611402576079546001600160401b03600160c01b9091048116908216106114025760405163401636df60e01b815260040160405180910390fd5b607980546001600160c01b0316600160c01b6001600160401b038416021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190610f2d90839061417b565b607454600160401b90046001600160a01b031633146114b557606f5460ff161561148f57604051630bc011ff60e21b815260040160405180910390fd5b61149881611324565b6114b557604051630674f25160e11b815260040160405180910390fd5b6114be81613882565b50565b607a546001600160a01b031633146114ec57604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b03821611156115195760405163f5e37f2f60e01b815260040160405180910390fd5b606f5460ff1661155957607b546001600160401b03600160a01b9091048116908216106115595760405163f5e37f2f60e01b815260040160405180910390fd5b607b8054600160a01b600160e01b031916600160a01b6001600160401b038416021790556040517fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90610f2d90839061417b565b60768054610bb890614aee565b5f8585805190602001208585856040516020016115db959493929190614b61565b60405160208183030381529060405280519060200120905095945050505050565b606f5460ff161561162057604051630bc011ff60e21b815260040160405180910390fd5b606f54600160581b90046001600160a01b03163314611652576040516311e7be1560e01b815260040160405180910390fd5b815f8190036116745760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561169757604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160401b820481165f81815260726020526040812054838516949293600160801b909304909216919082905b86811015611976575f8a8a838181106116ea576116ea614ba0565b90506020028101906116fc9190614bb4565b61170590614bc8565b805180516020909101206060820151919250906001600160401b0316156117f1578561173081614c51565b9650505f818360200151846060015160405160200161175193929190614c7e565b60408051601f1981840301815291815281516020928301206001600160401b038a165f908152607190935291205490915081146117a15760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b038088165f9081526071602052604080822091909155606085015190850151908216911610156117eb57604051633fbd5c3960e11b815260040160405180910390fd5b506118d3565b60208201511580159061188f575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303815f875af1158015611869573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061188d9190614ab0565b155b156118ad576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c010156118d3576040516328a69b1f60e21b815260040160405180910390fd5b876001600160401b031682604001516001600160401b0316108061190357504282604001516001600160401b0316115b15611921576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518d604051602001611942959493929190614b61565b604051602081830303815290604052805190602001209450816040015197505050808061196e90614ca1565b9150506116cf565b506119818685614b3a565b6073549094506001600160401b03600160c01b909104811690841611156119bb5760405163c630a00d60e01b815260040160405180910390fd5b5f6119c68285614cb9565b6119d9906001600160401b031688614cd9565b60408051606081018252858152426001600160401b03908116602080840191825260738054600160401b9081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585166001600160801b03199384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611a8d5760738054600160801b600160c01b031916600160801b6001600160401b038716021790555b611ad2333083607054611aa09190614cec565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613a14565b611ada613a85565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611b32575f80fd5b505af1158015611b44573d5f803e3d5ffd5b50506040516001600160401b03881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a546001600160a01b03163314611bb257604051634755657960e01b815260040160405180910390fd5b607b54600160e01b900460ff16611bdc5760405163f6ba91a160e01b815260040160405180910390fd5b607b805460ff60e01b191690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f6070546064611c239190614cec565b905090565b606f5460ff1615611c4c57604051630bc011ff60e21b815260040160405180910390fd5b6079546001600160401b038581165f908152607260205260409020600101544292611c8292600160c01b90910481169116614b3a565b6001600160401b03161115611caa57604051638a0704d360e01b815260040160405180910390fd5b6103e8611cb78686614cb9565b6001600160401b03161115611cdf57604051635acfba9d60e11b815260040160405180910390fd5b611ced86868686868661329d565b611cf684613b23565b607954600160801b90046001600160401b03165f03611dd257607480546001600160401b0319166001600160401b038681169182179092555f9081526075602052604090208390556079541615611d5857607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b158015611db7575f80fd5b505af1158015611dc9573d5f803e3d5ffd5b50505050611e81565b611dda613a85565b607980546001600160401b0316905f611df283614c51565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f9081526078909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b60405182815233906001600160401b038616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966906020016111b6565b607a546001600160a01b03163314611ee957604051634755657960e01b815260040160405180910390fd5b606f8054600160581b600160f81b031916600160581b6001600160a01b038416021790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610f2d908390614369565b611f4561323e565b611f4e5f613cf2565b565b611f586120ec565b6001600160a01b0316336001600160a01b031614612060575f611f796125ae565b9050806001600160401b0316826001600160401b031611611fad5760405163812a372d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b90910481169083161180611feb57506001600160401b038083165f9081526072602052604090206001015416155b1561200957604051632631700560e21b815260040160405180910390fd5b6001600160401b038083165f9081526072602052604090206001015442916120369162093a809116614b3a565b6001600160401b0316111561205e5760405163692baaad60e11b815260040160405180910390fd5b505b6114be613d43565b607b546001600160a01b031633146120935760405163d1ec4b2360e01b815260040160405180910390fd5b607b54607a80546001600160a01b0319166001600160a01b0390921691821790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e916120e291614369565b60405180910390a1565b6033546001600160a01b031690565b61210361323e565b607480546001600160401b0319166001600160401b0392909216919091179055565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016121739190614369565b602060405180830381865afa15801561218e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121b29190614ab0565b90505f6121bd6125ae565b6073546001600160401b03600160401b82048116916121ed91600160801b8204811691600160c01b900416614cb9565b6121f79190614b3a565b6122019190614cb9565b6001600160401b03169050805f0361221b575f9250505090565b6122258183614d03565b9250505090565b606f5460ff161561225057604051630bc011ff60e21b815260040160405180910390fd5b61225f8787878787878761356e565b6001600160401b0384165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16122b9613d43565b50505050505050565b6122ca61323e565b607380546001600160401b03909216600160401b02600160401b600160801b0319909216919091179055565b607a546001600160a01b0316331461232157604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b038216111561234e57604051630cc9650760e41b815260040160405180910390fd5b606f5460ff1661238e576079546001600160401b03600160801b90910481169082161061238e5760405163048a05a960e41b815260040160405180910390fd5b60798054600160801b600160c01b031916600160801b6001600160401b038416021790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590610f2d90839061417b565b607a546001600160a01b0316331461240d57604051634755657960e01b815260040160405180910390fd5b62015180816001600160401b0316111561243a57604051631c0cfbfd60e31b815260040160405180910390fd5b606f8054610100600160481b0319166101006001600160401b038416021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890610f2d90839061417b565b607a546001600160a01b031633146124b557604051634755657960e01b815260040160405180910390fd5b607b80546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610f2d908390614369565b61250861323e565b6114be81613b23565b5f67ffffffff000000016001600160401b038316108015612546575067ffffffff00000001604083901c6001600160401b0316105b8015612566575067ffffffff00000001608083901c6001600160401b0316105b801561257d575067ffffffff0000000160c083901c105b1561258a57506001919050565b505f919050565b919050565b61259e61323e565b60776125aa8282614d63565b5050565b6079545f906001600160401b0316156125e957506079546001600160401b039081165f90815260786020526040902054600160401b90041690565b506074546001600160401b031690565b607a546001600160a01b0316331461262457604051634755657960e01b815260040160405180910390fd5b60766126308282614d63565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610f2d9190614243565b5f54610100900460ff161580801561267e57505f54600160ff909116105b8061269e575061268d30613db9565b15801561269e57505f5460ff166001145b6127015760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610a30565b5f805460ff191660011790558015612722575f805461ff0019166101001790555b61272f6020880188614634565b607a80546001600160a01b0319166001600160a01b039290921691909117905561275f6040880160208901614634565b606f80546001600160a01b0392909216600160581b02600160581b600160f81b031990921691909117905561279a6080880160608901614634565b607480546001600160a01b0392909216600160401b02600160401b600160e01b03199092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad86905560766127fd8682614d63565b50607761280a8582614d63565b5062093a8061281f6060890160408a01614467565b6001600160401b0316111561284757604051630cc9650760e41b815260040160405180910390fd5b6128576060880160408901614467565b607980546001600160401b0392909216600160801b02600160801b600160c01b031990921691909117905562093a8061289660a0890160808a01614467565b6001600160401b031611156128be57604051631d06e87960e01b815260040160405180910390fd5b6128ce60a0880160808901614467565b607980546001600160c01b0316600160c01b6001600160401b03939093169290920291909117905567016345785d8a0000607055606f8054610100600160581b031916620708006101f560491b01179055607b8054600160a01b600160e81b031916670200000000000d2f60a71b179055612947613dc8565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f0000000000000000000000000000000000000000000000000000000000000000858560405161299c9493929190614e46565b60405180910390a180156122b9575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b54600160e01b900460ff1615612a1c576040516324eff8c360e01b815260040160405180910390fd5b606f5460ff1615612a4057604051630bc011ff60e21b815260040160405180910390fd5b805f819003612a625760405163cb591a5f60e01b815260040160405180910390fd5b6103e8811115612a8557604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160c01b8204811691612aad918491600160801b900416614e7c565b1115612acc5760405163c630a00d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b820481165f818152607260205260408120549193600160801b9004909216915b84811015612c7b575f878783818110612b1757612b17614ba0565b9050602002810190612b299190614e8f565b612b3290614ea3565b905083612b3e81614c51565b825180516020918201208185015160408087015190519499509194505f93612b699386939101614c7e565b60408051601f1981840301815291815281516020928301206001600160401b0389165f90815260719093529120549091508114612bb95760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b0386165f90815260716020526040812055612bdc600189614cd9565b8403612c305742607b60149054906101000a90046001600160401b03168460400151612c089190614b3a565b6001600160401b03161115612c305760405163c44a082160e01b815260040160405180910390fd5b848284602001514233604051602001612c4d959493929190614b61565b6040516020818303038152906040528051906020012094505050508080612c7390614ca1565b915050612afc565b50612c868484614b3a565b607380546001600160401b034281166001600160401b03199092168217808455604080516060810182528781526020808201958652600160401b9384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686026001600160801b031990921693871693909317179091558554938916600160801b02600160801b600160c01b031993860293909316600160401b600160c01b031990941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a546001600160a01b03163314612d9b57604051634755657960e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612df3575f80fd5b505af1158015612e05573d5f803e3d5ffd5b50505050611f4e613e3b565b612e1961323e565b604080516060810182529384526001600160401b0392831660208086019182529284168583019081529584165f9081526072909352912092518355516001909201805493518216600160401b026001600160801b03199094169290911691909117919091179055565b607b54600160e01b900460ff1615612ead576040516324eff8c360e01b815260040160405180910390fd5b606f5460ff1615612ed157604051630bc011ff60e21b815260040160405180910390fd5b5f612eda611c13565b905081811115612efd57604051634732fdb560e01b815260040160405180910390fd5b611388831115612f20576040516328a69b1f60e21b815260040160405180910390fd5b612f556001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084613a14565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fb2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fd69190614ab0565b60738054919250600160c01b9091046001600160401b0316906018612ffa83614c51565b91906101000a8154816001600160401b0302191690836001600160401b0316021790555050848460405161302f929190614f1b565b6040519081900381206130489183904290602001614c7e565b60408051808303601f190181529181528151602092830120607354600160c01b90046001600160401b03165f90815260719093529120553233036130d7576073546040805183815233602082015260609181018290525f91810191909152600160c01b9091046001600160401b0316905f805160206150338339815191529060800160405180910390a2613121565b607360189054906101000a90046001600160401b03166001600160401b03165f80516020615033833981519152823388886040516131189493929190614f2a565b60405180910390a25b5050505050565b607a546001600160a01b0316331461315357604051634755657960e01b815260040160405180910390fd5b60748054600160401b600160e01b031916600160401b6001600160a01b038416021790556040517f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90610f2d908390614369565b6131af61323e565b6001600160a01b0381166132145760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a30565b6114be81613cf2565b61322561323e565b6001600160401b03165f90815260756020526040902055565b336132476120ec565b6001600160a01b031614611f4e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a30565b5f806132a76125ae565b90506001600160401b0388161561333c576079546001600160401b0390811690891611156132e85760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b038089165f908152607860205260409020600281015481549094509091898116600160401b909204161461333657604051632bd2e3e760e01b815260040160405180910390fd5b506133a7565b6001600160401b0387165f90815260756020526040902054915081613374576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611156133a757604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316866001600160401b0316116133d95760405163b9b18f5760e01b815260040160405180910390fd5b5f6133e78888888689610f38565b90505f5f80516020614ff38339815191526002836040516134089190614a95565b602060405180830381855afa158015613423573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906134469190614ab0565b6134509190614adb565b604080516020810182528281529051634890ed4560e11b81529192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916134ac91899190600401614f54565b602060405180830381865afa1580156134c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134eb9190614f8e565b613508576040516309bde33960e01b815260040160405180910390fd5b61356233613516858b614cb9565b6001600160401b0316613527612125565b6135319190614cec565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190613e92565b50505050505050505050565b5f6001600160401b03881615613600576079546001600160401b0390811690891611156135ae5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f908152607860205260409020600281015481549092888116600160401b90920416146135fa57604051632bd2e3e760e01b815260040160405180910390fd5b50613667565b506001600160401b0385165f9081526075602052604090205480613637576040516324cbdcc360e11b815260040160405180910390fd5b6074546001600160401b03908116908716111561366757604051630f2b74f160e11b815260040160405180910390fd5b6079546001600160401b0390811690881611806136965750876001600160401b0316876001600160401b031611155b806136b757506079546001600160401b03600160401b909104811690881611155b156136d55760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260786020526040902054600160401b9004811690861614613718576040516332a2a77f60e01b815260040160405180910390fd5b5f6137268787878588610f38565b90505f5f80516020614ff38339815191526002836040516137479190614a95565b602060405180830381855afa158015613762573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137859190614ab0565b61378f9190614adb565b604080516020810182528281529051634890ed4560e11b81529192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916137eb91889190600401614f54565b602060405180830381865afa158015613806573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061382a9190614f8e565b613847576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f908152607860205260409020600201548590036135625760405163a47276bd60e01b815260040160405180910390fd5b6079546001600160401b03600160401b90910481169082161115806138b557506079546001600160401b03908116908216115b156138d35760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f818152607860209081526040808320805460748054600160401b928390049098166001600160401b03199098168817905560028201548786526075909452938290209290925560798054600160401b600160801b0319169390940292909217909255600182015490516333d6247d60e01b815260048101919091529091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b1580156139a8575f80fd5b505af11580156139ba573d5f803e3d5ffd5b50505050826001600160401b0316816001600160401b03167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e8460020154604051613a0791815260200190565b60405180910390a3505050565b6040516001600160a01b0380851660248301528316604482015260648101829052613a7f9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613ec7565b50505050565b6079546001600160401b03600160401b8204811691161115611f4e576079545f90613ac190600160401b90046001600160401b03166001614b3a565b9050613acc81611324565b156114be576079545f90600290613aed9084906001600160401b0316614cb9565b613af79190614fad565b613b019083614b3a565b9050613b0c81611324565b15613b1a576125aa81613882565b6125aa82613882565b5f613b2c6125ae565b9050815f80613b3b8484614cb9565b606f546001600160401b0391821692505f91613b5d9161010090041642614cd9565b90505b846001600160401b0316846001600160401b031614613bdd576001600160401b038085165f9081526072602052604090206001810154909116821015613bbc576001810154600160401b90046001600160401b03169450613bd7565b613bc68686614cb9565b6001600160401b0316935050613bdd565b50613b60565b5f613be88484614cd9565b905083811015613c3f57808403600c8111613c035780613c06565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281613c3557613c35614ac7565b0460705550613cae565b838103600c8111613c505780613c53565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a76400000281613c8957613c89614ac7565b04905080607054670de0b6b3a76400000281613ca757613ca7614ac7565b0460705550505b683635c9adc5dea000006070541115613cd357683635c9adc5dea000006070556122b9565b633b9aca0060705410156122b957633b9aca0060705550505050505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613d9b575f80fd5b505af1158015613dad573d5f803e3d5ffd5b50505050611f4e613f98565b6001600160a01b03163b151590565b5f54610100900460ff16613e325760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610a30565b611f4e33613cf2565b606f5460ff16613e5e57604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b6040516001600160a01b038316602482015260448101829052613ec290849063a9059cbb60e01b90606401613a48565b505050565b5f613f1b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613ff39092919063ffffffff16565b805190915015613ec25780806020019051810190613f399190614f8e565b613ec25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a30565b606f5460ff1615613fbc57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b606061400184845f85614009565b949350505050565b60608247101561406a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610a30565b5f80866001600160a01b031685876040516140859190614a95565b5f6040518083038185875af1925050503d805f81146140bf576040519150601f19603f3d011682016040523d82523d5f602084013e6140c4565b606091505b50915091506140d5878383876140e0565b979650505050505050565b6060831561414c5782515f03614145576140f985613db9565b6141455760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a30565b5081614001565b61400183838151156141615781518083602001fd5b8060405162461bcd60e51b8152600401610a309190614243565b6001600160401b0391909116815260200190565b80356001600160401b0381168114612591575f80fd5b5f805f805f60a086880312156141b9575f80fd5b6141c28661418f565b94506141d06020870161418f565b93506141de6040870161418f565b94979396509394606081013594506080013592915050565b5f5b838110156142105781810151838201526020016141f8565b50505f910152565b5f815180845261422f8160208601602086016141f6565b601f01601f19169290920160200192915050565b602081525f6142556020830184614218565b9392505050565b806040810183101561426c575f80fd5b92915050565b5f805f805f805f806101a0898b03121561428a575f80fd5b6142938961418f565b97506142a160208a0161418f565b96506142af60408a0161418f565b955060608901359450608089013593506142cc8a60a08b0161425c565b925061016089018a8111156142df575f80fd5b60e08a0192506142ef8b8261425c565b9150509295985092959890939650565b5f6020828403121561430f575f80fd5b813561ffff81168114614255575f80fd5b5f805f805f60a08688031215614334575f80fd5b61433d8661418f565b945061434b6020870161418f565b94979496505050506040830135926060810135926080909101359150565b6001600160a01b0391909116815260200190565b80610300810183101561426c575f80fd5b5f805f805f806103a087890312156143a4575f80fd5b6143ad8761418f565b95506143bb6020880161418f565b94506143c96040880161418f565b935060608701359250608087013591506143e68860a0890161437d565b90509295509295509295565b5f805f805f805f6103c0888a031215614409575f80fd5b6144128861418f565b96506144206020890161418f565b955061442e6040890161418f565b945061443c6060890161418f565b93506080880135925060a088013591506144598960c08a0161437d565b905092959891949750929550565b5f60208284031215614477575f80fd5b6142558261418f565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126144a3575f80fd5b81356001600160401b03808211156144bd576144bd614480565b604051601f8301601f19908116603f011681019082821181831017156144e5576144e5614480565b816040528381528660208588010111156144fd575f80fd5b836020870160208301375f602085830101528094505050505092915050565b80356001600160a01b0381168114612591575f80fd5b5f805f805f60a08688031215614546575f80fd5b8535945060208601356001600160401b03811115614562575f80fd5b61456e88828901614494565b945050604086013592506145846060870161418f565b91506145926080870161451c565b90509295509295909350565b5f8083601f8401126145ae575f80fd5b5081356001600160401b038111156145c4575f80fd5b6020830191508360208260051b85010111156145de575f80fd5b9250929050565b5f805f604084860312156145f7575f80fd5b83356001600160401b0381111561460c575f80fd5b6146188682870161459e565b909450925061462b90506020850161451c565b90509250925092565b5f60208284031215614644575f80fd5b6142558261451c565b5f6020828403121561465d575f80fd5b5035919050565b5f60208284031215614674575f80fd5b81356001600160401b03811115614689575f80fd5b61400184828501614494565b5f8083601f8401126146a5575f80fd5b5081356001600160401b038111156146bb575f80fd5b6020830191508360208285010111156145de575f80fd5b5f805f805f808688036101208112156146e9575f80fd5b60a08112156146f6575f80fd5b5086955060a0860135945060c08601356001600160401b038082111561471a575f80fd5b6147268a838b01614494565b955060e089013591508082111561473b575f80fd5b6147478a838b01614494565b945061010089013591508082111561475d575f80fd5b5061476a89828a01614695565b979a9699509497509295939492505050565b5f806020838503121561478d575f80fd5b82356001600160401b038111156147a2575f80fd5b6147ae8582860161459e565b90969095509350505050565b5f805f80608085870312156147cd575f80fd5b6147d68561418f565b9350602085013592506147eb6040860161418f565b91506147f96060860161418f565b905092959194509250565b5f805f60408486031215614816575f80fd5b83356001600160401b0381111561482b575f80fd5b61483786828701614695565b909790965060209590950135949350505050565b5f806040838503121561485c575f80fd5b8235915061486c6020840161418f565b90509250929050565b60208082526058908201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60408201527f64696e6753746174654e756d206d757374206265206c657373206f7220657175606082015277616c207468616e206c61737450656e64696e67537461746560401b608082015260a00190565b6020808252604c908201525f80516020614fd383398151915260408201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760608201526b040e6e8c2e8ca40c4c2e8c6d60a31b608082015260a00190565b60208082526043908201525f80516020614fd383398151915260408201527f744e756d426174636820737461746520726f6f7420646f6573206e6f742065786060820152621a5cdd60ea1b608082015260a00190565b6020808252605d908201525f80516020614fd383398151915260408201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060608201527f7468616e2063757272656e744c61737456657269666965644261746368000000608082015260a00190565b60208082526057908201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60408201527f616c4e65774261746368206d75737420626520626967676572207468616e20636060820152760eae4e4cadce898c2e6e8accae4d2ccd2cac884c2e8c6d604b1b608082015260a00190565b5f8251614aa68184602087016141f6565b9190910192915050565b5f60208284031215614ac0575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82614ae957614ae9614ac7565b500690565b600181811c90821680614b0257607f821691505b602082108103614b2057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03818116838216019080821115614b5a57614b5a614b26565b5092915050565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112614aa6575f80fd5b5f60808236031215614bd8575f80fd5b604051608081016001600160401b038082118383101715614bfb57614bfb614480565b816040528435915080821115614c0f575f80fd5b50614c1c36828601614494565b82525060208301356020820152614c356040840161418f565b6040820152614c466060840161418f565b606082015292915050565b5f6001600160401b038281166002600160401b03198101614c7457614c74614b26565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b5f60018201614cb257614cb2614b26565b5060010190565b6001600160401b03828116828216039080821115614b5a57614b5a614b26565b8181038181111561426c5761426c614b26565b808202811582820484141761426c5761426c614b26565b5f82614d1157614d11614ac7565b500490565b601f821115613ec2575f81815260208120601f850160051c81016020861015614d3c5750805b601f850160051c820191505b81811015614d5b57828155600101614d48565b505050505050565b81516001600160401b03811115614d7c57614d7c614480565b614d9081614d8a8454614aee565b84614d16565b602080601f831160018114614dc3575f8415614dac5750858301515b5f19600386901b1c1916600185901b178555614d5b565b5f85815260208120601f198616915b82811015614df157888601518255948401946001909101908401614dd2565b5085821015614e0e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160401b038581168252841660208201526060604082018190525f90614e729083018486614e1e565b9695505050505050565b8082018082111561426c5761426c614b26565b5f8235605e19833603018112614aa6575f80fd5b5f60608236031215614eb3575f80fd5b604051606081016001600160401b038082118383101715614ed657614ed6614480565b816040528435915080821115614eea575f80fd5b50614ef736828601614494565b82525060208301356020820152614f106040840161418f565b604082015292915050565b818382375f9101908152919050565b8481526001600160a01b03841660208201526060604082018190525f90614e729083018486614e1e565b6103208101610300808584378201835f5b6001811015614f84578151835260209283019290910190600101614f65565b5050509392505050565b5f60208284031215614f9e575f80fd5b81518015158114614255575f80fd5b5f6001600160401b0383811680614fc657614fc6614ac7565b9216919091049291505056fe506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6930644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001cb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fef94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931a2646970667358221220e9d0794f194ac421b9dc493895a874be8a13d701d1033aaa31a3f4a7f895a91464736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMTimelock.json b/compiled-contracts/paris/PolygonZkEVMTimelock.json index 81068dc6d..11f93bd43 100644 --- a/compiled-contracts/paris/PolygonZkEVMTimelock.json +++ b/compiled-contracts/paris/PolygonZkEVMTimelock.json @@ -892,8 +892,8 @@ "type": "receive" } ], - "bytecode": "0x60a06040523480156200001157600080fd5b5060405162002d2f38038062002d2f83398101604081905262000034916200042b565b848484846200005360008051602062002caf8339815191528062000242565b6200007d60008051602062002ccf83398151915260008051602062002caf83398151915262000242565b620000a760008051602062002cef83398151915260008051602062002caf83398151915262000242565b620000d160008051602062002d0f83398151915260008051602062002caf83398151915262000242565b620000ec60008051602062002caf833981519152306200028d565b6001600160a01b0381161562000117576200011760008051602062002caf833981519152826200028d565b60005b83518110156200019d576200016160008051602062002ccf8339815191528583815181106200014d576200014d620004cc565b60200260200101516200028d60201b60201c565b6200018a60008051602062002d0f8339815191528583815181106200014d576200014d620004cc565b6200019581620004e2565b90506200011a565b5060005b8251811015620001e757620001d460008051602062002cef8339815191528483815181106200014d576200014d620004cc565b620001df81620004e2565b9050620001a1565b5060028490556040805160008152602081018690527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1505050506001600160a01b0316608052506200050a92505050565b600082815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6200029982826200029d565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1662000299576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620002f93390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146200036957600080fd5b50565b8051620003798162000353565b919050565b600082601f8301126200039057600080fd5b815160206001600160401b0380831115620003af57620003af6200033d565b8260051b604051601f19603f83011681018181108482111715620003d757620003d76200033d565b604052938452858101830193838101925087851115620003f657600080fd5b83870191505b84821015620004205762000410826200036c565b83529183019190830190620003fc565b979650505050505050565b600080600080600060a086880312156200044457600080fd5b855160208701519095506001600160401b03808211156200046457600080fd5b6200047289838a016200037e565b955060408801519150808211156200048957600080fd5b5062000498888289016200037e565b9350506060860151620004ab8162000353565b6080870151909250620004be8162000353565b809150509295509295909350565b634e487b7160e01b600052603260045260246000fd5b6000600182016200050357634e487b7160e01b600052601160045260246000fd5b5060010190565b60805161277b620005346000396000818161041a0152818161116501526111a5015261277b6000f3fe6080604052600436106101c65760003560e01c806364d62353116100f7578063b1c5f42711610095578063d547741f11610064578063d547741f14610661578063e38335e514610681578063f23a6e6114610694578063f27a0c92146106d957600080fd5b8063b1c5f427146105af578063bc197c81146105cf578063c4d252f514610614578063d45c44351461063457600080fd5b80638f61f4f5116100d15780638f61f4f5146104e157806391d1485414610515578063a217fddf14610566578063b08e51c01461057b57600080fd5b806364d62353146104815780638065657f146104a15780638f2a0bb0146104c157600080fd5b8063248a9ca31161016457806331d507501161013e57806331d50750146103c857806336568abe146103e85780633a6aae7214610408578063584b153e1461046157600080fd5b8063248a9ca3146103475780632ab0f529146103775780632f2ff15d146103a857600080fd5b80630d3cf6fc116101a05780630d3cf6fc1461026b578063134008d31461029f57806313bc9f20146102b2578063150b7a02146102d257600080fd5b806301d5062a146101d257806301ffc9a7146101f457806307bd02651461022957600080fd5b366101cd57005b600080fd5b3480156101de57600080fd5b506101f26101ed366004611c52565b6106ee565b005b34801561020057600080fd5b5061021461020f366004611cc7565b610783565b60405190151581526020015b60405180910390f35b34801561023557600080fd5b5061025d7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610220565b34801561027757600080fd5b5061025d7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101f26102ad366004611d09565b6107df565b3480156102be57600080fd5b506102146102cd366004611d75565b6108d7565b3480156102de57600080fd5b506103166102ed366004611e9a565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610220565b34801561035357600080fd5b5061025d610362366004611d75565b60009081526020819052604090206001015490565b34801561038357600080fd5b50610214610392366004611d75565b6000908152600160208190526040909120541490565b3480156103b457600080fd5b506101f26103c3366004611f02565b6108fd565b3480156103d457600080fd5b506102146103e3366004611d75565b610927565b3480156103f457600080fd5b506101f2610403366004611f02565b610940565b34801561041457600080fd5b5061043c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610220565b34801561046d57600080fd5b5061021461047c366004611d75565b6109f8565b34801561048d57600080fd5b506101f261049c366004611d75565b610a0e565b3480156104ad57600080fd5b5061025d6104bc366004611d09565b610ade565b3480156104cd57600080fd5b506101f26104dc366004611f73565b610b1d565b3480156104ed57600080fd5b5061025d7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b34801561052157600080fd5b50610214610530366004611f02565b60009182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b34801561057257600080fd5b5061025d600081565b34801561058757600080fd5b5061025d7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b3480156105bb57600080fd5b5061025d6105ca366004612025565b610d4f565b3480156105db57600080fd5b506103166105ea36600461214e565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b34801561062057600080fd5b506101f261062f366004611d75565b610d94565b34801561064057600080fd5b5061025d61064f366004611d75565b60009081526001602052604090205490565b34801561066d57600080fd5b506101f261067c366004611f02565b610e8f565b6101f261068f366004612025565b610eb4565b3480156106a057600080fd5b506103166106af3660046121f8565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106e557600080fd5b5061025d611161565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161071881611244565b6000610728898989898989610ade565b90506107348184611251565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a604051610770969594939291906122a6565b60405180910390a3505050505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107d957506107d98261139e565b92915050565b600080527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661085c5761085c8133611435565b600061086c888888888888610ade565b905061087881856114ed565b6108848888888861162a565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a6040516108bc94939291906122f1565b60405180910390a36108cd8161172e565b5050505050505050565b6000818152600160205260408120546001811180156108f65750428111155b9392505050565b60008281526020819052604090206001015461091881611244565b61092283836117d7565b505050565b60008181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109f482826118c7565b5050565b6000818152600160208190526040822054610939565b333014610a9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109e1565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b6000868686868686604051602001610afb969594939291906122a6565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b4781611244565b888714610bd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b888514610c65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b6000610c778b8b8b8b8b8b8b8b610d4f565b9050610c838184611251565b60005b8a811015610d415780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610cc357610cc3612331565b9050602002016020810190610cd89190612360565b8d8d86818110610cea57610cea612331565b905060200201358c8c87818110610d0357610d03612331565b9050602002810190610d15919061237b565b8c8b604051610d29969594939291906122a6565b60405180910390a3610d3a8161240f565b9050610c86565b505050505050505050505050565b60008888888888888888604051602001610d709897969594939291906124f7565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610dbe81611244565b610dc7826109f8565b610e53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109e1565b6000828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b600082815260208190526040902060010154610eaa81611244565b61092283836118c7565b600080527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610f3157610f318133611435565b878614610fc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b87841461104f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b60006110618a8a8a8a8a8a8a8a610d4f565b905061106d81856114ed565b60005b8981101561114b5760008b8b8381811061108c5761108c612331565b90506020020160208101906110a19190612360565b905060008a8a848181106110b7576110b7612331565b9050602002013590503660008a8a868181106110d5576110d5612331565b90506020028101906110e7919061237b565b915091506110f78484848461162a565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588686868660405161112e94939291906122f1565b60405180910390a350505050806111449061240f565b9050611070565b506111558161172e565b50505050505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161580159061123257507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123291906125be565b1561123d5750600090565b5060025490565b61124e8133611435565b50565b61125a82610927565b156112e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109e1565b6112ef611161565b81101561137e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109e1565b61138881426125e0565b6000928352600160205260409092209190915550565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107d957507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107d9565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109f4576114738161197e565b61147e83602061199d565b60405160200161148f929190612617565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109e191600401612698565b6114f6826108d7565b611582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109e1565b80158061159e5750600081815260016020819052604090912054145b6109f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109e1565b60008473ffffffffffffffffffffffffffffffffffffffff168484846040516116549291906126e9565b60006040518083038185875af1925050503d8060008114611691576040519150601f19603f3d011682016040523d82523d6000602084013e611696565b606091505b5050905080611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109e1565b5050505050565b611737816108d7565b6117c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109e1565b600090815260016020819052604090912055565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109f45760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556118693390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109f45760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107d973ffffffffffffffffffffffffffffffffffffffff831660145b606060006119ac8360026126f9565b6119b79060026125e0565b67ffffffffffffffff8111156119cf576119cf611d8e565b6040519080825280601f01601f1916602001820160405280156119f9576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611a3057611a30612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a9357611a93612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000611acf8460026126f9565b611ada9060016125e0565b90505b6001811115611b77577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611b1b57611b1b612331565b1a60f81b828281518110611b3157611b31612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c93611b7081612710565b9050611add565b5083156108f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109e1565b803573ffffffffffffffffffffffffffffffffffffffff81168114611c0457600080fd5b919050565b60008083601f840112611c1b57600080fd5b50813567ffffffffffffffff811115611c3357600080fd5b602083019150836020828501011115611c4b57600080fd5b9250929050565b600080600080600080600060c0888a031215611c6d57600080fd5b611c7688611be0565b965060208801359550604088013567ffffffffffffffff811115611c9957600080fd5b611ca58a828b01611c09565b989b979a50986060810135976080820135975060a09091013595509350505050565b600060208284031215611cd957600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108f657600080fd5b60008060008060008060a08789031215611d2257600080fd5b611d2b87611be0565b955060208701359450604087013567ffffffffffffffff811115611d4e57600080fd5b611d5a89828a01611c09565b979a9699509760608101359660809091013595509350505050565b600060208284031215611d8757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611e0457611e04611d8e565b604052919050565b600082601f830112611e1d57600080fd5b813567ffffffffffffffff811115611e3757611e37611d8e565b611e6860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611dbd565b818152846020838601011115611e7d57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611eb057600080fd5b611eb985611be0565b9350611ec760208601611be0565b925060408501359150606085013567ffffffffffffffff811115611eea57600080fd5b611ef687828801611e0c565b91505092959194509250565b60008060408385031215611f1557600080fd5b82359150611f2560208401611be0565b90509250929050565b60008083601f840112611f4057600080fd5b50813567ffffffffffffffff811115611f5857600080fd5b6020830191508360208260051b8501011115611c4b57600080fd5b600080600080600080600080600060c08a8c031215611f9157600080fd5b893567ffffffffffffffff80821115611fa957600080fd5b611fb58d838e01611f2e565b909b50995060208c0135915080821115611fce57600080fd5b611fda8d838e01611f2e565b909950975060408c0135915080821115611ff357600080fd5b506120008c828d01611f2e565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b60008060008060008060008060a0898b03121561204157600080fd5b883567ffffffffffffffff8082111561205957600080fd5b6120658c838d01611f2e565b909a50985060208b013591508082111561207e57600080fd5b61208a8c838d01611f2e565b909850965060408b01359150808211156120a357600080fd5b506120b08b828c01611f2e565b999c989b509699959896976060870135966080013595509350505050565b600082601f8301126120df57600080fd5b8135602067ffffffffffffffff8211156120fb576120fb611d8e565b8160051b61210a828201611dbd565b928352848101820192828101908785111561212457600080fd5b83870192505b848310156121435782358252918301919083019061212a565b979650505050505050565b600080600080600060a0868803121561216657600080fd5b61216f86611be0565b945061217d60208701611be0565b9350604086013567ffffffffffffffff8082111561219a57600080fd5b6121a689838a016120ce565b945060608801359150808211156121bc57600080fd5b6121c889838a016120ce565b935060808801359150808211156121de57600080fd5b506121eb88828901611e0c565b9150509295509295909350565b600080600080600060a0868803121561221057600080fd5b61221986611be0565b945061222760208701611be0565b93506040860135925060608601359150608086013567ffffffffffffffff81111561225157600080fd5b6121eb88828901611e0c565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a0604082015260006122dc60a08301868861225d565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260606040820152600061232760608301848661225d565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561237257600080fd5b6108f682611be0565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126123b057600080fd5b83018035915067ffffffffffffffff8211156123cb57600080fd5b602001915036819003821315611c4b57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612440576124406123e0565b5060010190565b81835260006020808501808196508560051b810191508460005b878110156124ea57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126124a057600080fd5b8701858101903567ffffffffffffffff8111156124bc57600080fd5b8036038213156124cb57600080fd5b6124d686828461225d565b9a87019a9550505090840190600101612461565b5091979650505050505050565b60a0808252810188905260008960c08301825b8b8110156125455773ffffffffffffffffffffffffffffffffffffffff61253084611be0565b1682526020928301929091019060010161250a565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff89111561257e57600080fd5b8860051b9150818a602083013701828103602090810160408501526125a69082018789612447565b60608401959095525050608001529695505050505050565b6000602082840312156125d057600080fd5b815180151581146108f657600080fd5b808201808211156107d9576107d96123e0565b60005b8381101561260e5781810151838201526020016125f6565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161264f8160178501602088016125f3565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000601791840191820152835161268c8160288401602088016125f3565b01602801949350505050565b60208152600082518060208401526126b78160408501602087016125f3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b8183823760009101908152919050565b80820281158282048414176107d9576107d96123e0565b60008161271f5761271f6123e0565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea264697066735822122048ac459f9165e9eaa91bead23625fe941931ad2332a61820c2a6d1dcd92c218164736f6c634300081400335f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63fd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783", - "deployedBytecode": "0x6080604052600436106101c65760003560e01c806364d62353116100f7578063b1c5f42711610095578063d547741f11610064578063d547741f14610661578063e38335e514610681578063f23a6e6114610694578063f27a0c92146106d957600080fd5b8063b1c5f427146105af578063bc197c81146105cf578063c4d252f514610614578063d45c44351461063457600080fd5b80638f61f4f5116100d15780638f61f4f5146104e157806391d1485414610515578063a217fddf14610566578063b08e51c01461057b57600080fd5b806364d62353146104815780638065657f146104a15780638f2a0bb0146104c157600080fd5b8063248a9ca31161016457806331d507501161013e57806331d50750146103c857806336568abe146103e85780633a6aae7214610408578063584b153e1461046157600080fd5b8063248a9ca3146103475780632ab0f529146103775780632f2ff15d146103a857600080fd5b80630d3cf6fc116101a05780630d3cf6fc1461026b578063134008d31461029f57806313bc9f20146102b2578063150b7a02146102d257600080fd5b806301d5062a146101d257806301ffc9a7146101f457806307bd02651461022957600080fd5b366101cd57005b600080fd5b3480156101de57600080fd5b506101f26101ed366004611c52565b6106ee565b005b34801561020057600080fd5b5061021461020f366004611cc7565b610783565b60405190151581526020015b60405180910390f35b34801561023557600080fd5b5061025d7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610220565b34801561027757600080fd5b5061025d7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101f26102ad366004611d09565b6107df565b3480156102be57600080fd5b506102146102cd366004611d75565b6108d7565b3480156102de57600080fd5b506103166102ed366004611e9a565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610220565b34801561035357600080fd5b5061025d610362366004611d75565b60009081526020819052604090206001015490565b34801561038357600080fd5b50610214610392366004611d75565b6000908152600160208190526040909120541490565b3480156103b457600080fd5b506101f26103c3366004611f02565b6108fd565b3480156103d457600080fd5b506102146103e3366004611d75565b610927565b3480156103f457600080fd5b506101f2610403366004611f02565b610940565b34801561041457600080fd5b5061043c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610220565b34801561046d57600080fd5b5061021461047c366004611d75565b6109f8565b34801561048d57600080fd5b506101f261049c366004611d75565b610a0e565b3480156104ad57600080fd5b5061025d6104bc366004611d09565b610ade565b3480156104cd57600080fd5b506101f26104dc366004611f73565b610b1d565b3480156104ed57600080fd5b5061025d7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b34801561052157600080fd5b50610214610530366004611f02565b60009182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b34801561057257600080fd5b5061025d600081565b34801561058757600080fd5b5061025d7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b3480156105bb57600080fd5b5061025d6105ca366004612025565b610d4f565b3480156105db57600080fd5b506103166105ea36600461214e565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b34801561062057600080fd5b506101f261062f366004611d75565b610d94565b34801561064057600080fd5b5061025d61064f366004611d75565b60009081526001602052604090205490565b34801561066d57600080fd5b506101f261067c366004611f02565b610e8f565b6101f261068f366004612025565b610eb4565b3480156106a057600080fd5b506103166106af3660046121f8565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106e557600080fd5b5061025d611161565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161071881611244565b6000610728898989898989610ade565b90506107348184611251565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a604051610770969594939291906122a6565b60405180910390a3505050505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107d957506107d98261139e565b92915050565b600080527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661085c5761085c8133611435565b600061086c888888888888610ade565b905061087881856114ed565b6108848888888861162a565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a6040516108bc94939291906122f1565b60405180910390a36108cd8161172e565b5050505050505050565b6000818152600160205260408120546001811180156108f65750428111155b9392505050565b60008281526020819052604090206001015461091881611244565b61092283836117d7565b505050565b60008181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109f482826118c7565b5050565b6000818152600160208190526040822054610939565b333014610a9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109e1565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b6000868686868686604051602001610afb969594939291906122a6565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b4781611244565b888714610bd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b888514610c65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b6000610c778b8b8b8b8b8b8b8b610d4f565b9050610c838184611251565b60005b8a811015610d415780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610cc357610cc3612331565b9050602002016020810190610cd89190612360565b8d8d86818110610cea57610cea612331565b905060200201358c8c87818110610d0357610d03612331565b9050602002810190610d15919061237b565b8c8b604051610d29969594939291906122a6565b60405180910390a3610d3a8161240f565b9050610c86565b505050505050505050505050565b60008888888888888888604051602001610d709897969594939291906124f7565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610dbe81611244565b610dc7826109f8565b610e53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109e1565b6000828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b600082815260208190526040902060010154610eaa81611244565b61092283836118c7565b600080527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610f3157610f318133611435565b878614610fc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b87841461104f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b60006110618a8a8a8a8a8a8a8a610d4f565b905061106d81856114ed565b60005b8981101561114b5760008b8b8381811061108c5761108c612331565b90506020020160208101906110a19190612360565b905060008a8a848181106110b7576110b7612331565b9050602002013590503660008a8a868181106110d5576110d5612331565b90506020028101906110e7919061237b565b915091506110f78484848461162a565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588686868660405161112e94939291906122f1565b60405180910390a350505050806111449061240f565b9050611070565b506111558161172e565b50505050505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161580159061123257507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123291906125be565b1561123d5750600090565b5060025490565b61124e8133611435565b50565b61125a82610927565b156112e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109e1565b6112ef611161565b81101561137e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109e1565b61138881426125e0565b6000928352600160205260409092209190915550565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107d957507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107d9565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109f4576114738161197e565b61147e83602061199d565b60405160200161148f929190612617565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109e191600401612698565b6114f6826108d7565b611582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109e1565b80158061159e5750600081815260016020819052604090912054145b6109f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109e1565b60008473ffffffffffffffffffffffffffffffffffffffff168484846040516116549291906126e9565b60006040518083038185875af1925050503d8060008114611691576040519150601f19603f3d011682016040523d82523d6000602084013e611696565b606091505b5050905080611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109e1565b5050505050565b611737816108d7565b6117c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109e1565b600090815260016020819052604090912055565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109f45760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556118693390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109f45760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107d973ffffffffffffffffffffffffffffffffffffffff831660145b606060006119ac8360026126f9565b6119b79060026125e0565b67ffffffffffffffff8111156119cf576119cf611d8e565b6040519080825280601f01601f1916602001820160405280156119f9576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611a3057611a30612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a9357611a93612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000611acf8460026126f9565b611ada9060016125e0565b90505b6001811115611b77577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611b1b57611b1b612331565b1a60f81b828281518110611b3157611b31612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c93611b7081612710565b9050611add565b5083156108f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109e1565b803573ffffffffffffffffffffffffffffffffffffffff81168114611c0457600080fd5b919050565b60008083601f840112611c1b57600080fd5b50813567ffffffffffffffff811115611c3357600080fd5b602083019150836020828501011115611c4b57600080fd5b9250929050565b600080600080600080600060c0888a031215611c6d57600080fd5b611c7688611be0565b965060208801359550604088013567ffffffffffffffff811115611c9957600080fd5b611ca58a828b01611c09565b989b979a50986060810135976080820135975060a09091013595509350505050565b600060208284031215611cd957600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108f657600080fd5b60008060008060008060a08789031215611d2257600080fd5b611d2b87611be0565b955060208701359450604087013567ffffffffffffffff811115611d4e57600080fd5b611d5a89828a01611c09565b979a9699509760608101359660809091013595509350505050565b600060208284031215611d8757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611e0457611e04611d8e565b604052919050565b600082601f830112611e1d57600080fd5b813567ffffffffffffffff811115611e3757611e37611d8e565b611e6860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611dbd565b818152846020838601011115611e7d57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611eb057600080fd5b611eb985611be0565b9350611ec760208601611be0565b925060408501359150606085013567ffffffffffffffff811115611eea57600080fd5b611ef687828801611e0c565b91505092959194509250565b60008060408385031215611f1557600080fd5b82359150611f2560208401611be0565b90509250929050565b60008083601f840112611f4057600080fd5b50813567ffffffffffffffff811115611f5857600080fd5b6020830191508360208260051b8501011115611c4b57600080fd5b600080600080600080600080600060c08a8c031215611f9157600080fd5b893567ffffffffffffffff80821115611fa957600080fd5b611fb58d838e01611f2e565b909b50995060208c0135915080821115611fce57600080fd5b611fda8d838e01611f2e565b909950975060408c0135915080821115611ff357600080fd5b506120008c828d01611f2e565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b60008060008060008060008060a0898b03121561204157600080fd5b883567ffffffffffffffff8082111561205957600080fd5b6120658c838d01611f2e565b909a50985060208b013591508082111561207e57600080fd5b61208a8c838d01611f2e565b909850965060408b01359150808211156120a357600080fd5b506120b08b828c01611f2e565b999c989b509699959896976060870135966080013595509350505050565b600082601f8301126120df57600080fd5b8135602067ffffffffffffffff8211156120fb576120fb611d8e565b8160051b61210a828201611dbd565b928352848101820192828101908785111561212457600080fd5b83870192505b848310156121435782358252918301919083019061212a565b979650505050505050565b600080600080600060a0868803121561216657600080fd5b61216f86611be0565b945061217d60208701611be0565b9350604086013567ffffffffffffffff8082111561219a57600080fd5b6121a689838a016120ce565b945060608801359150808211156121bc57600080fd5b6121c889838a016120ce565b935060808801359150808211156121de57600080fd5b506121eb88828901611e0c565b9150509295509295909350565b600080600080600060a0868803121561221057600080fd5b61221986611be0565b945061222760208701611be0565b93506040860135925060608601359150608086013567ffffffffffffffff81111561225157600080fd5b6121eb88828901611e0c565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a0604082015260006122dc60a08301868861225d565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260606040820152600061232760608301848661225d565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561237257600080fd5b6108f682611be0565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126123b057600080fd5b83018035915067ffffffffffffffff8211156123cb57600080fd5b602001915036819003821315611c4b57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612440576124406123e0565b5060010190565b81835260006020808501808196508560051b810191508460005b878110156124ea57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126124a057600080fd5b8701858101903567ffffffffffffffff8111156124bc57600080fd5b8036038213156124cb57600080fd5b6124d686828461225d565b9a87019a9550505090840190600101612461565b5091979650505050505050565b60a0808252810188905260008960c08301825b8b8110156125455773ffffffffffffffffffffffffffffffffffffffff61253084611be0565b1682526020928301929091019060010161250a565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff89111561257e57600080fd5b8860051b9150818a602083013701828103602090810160408501526125a69082018789612447565b60608401959095525050608001529695505050505050565b6000602082840312156125d057600080fd5b815180151581146108f657600080fd5b808201808211156107d9576107d96123e0565b60005b8381101561260e5781810151838201526020016125f6565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161264f8160178501602088016125f3565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000601791840191820152835161268c8160288401602088016125f3565b01602801949350505050565b60208152600082518060208401526126b78160408501602087016125f3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b8183823760009101908152919050565b80820281158282048414176107d9576107d96123e0565b60008161271f5761271f6123e0565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea264697066735822122048ac459f9165e9eaa91bead23625fe941931ad2332a61820c2a6d1dcd92c218164736f6c63430008140033", + "bytecode": "0x60a060405234801562000010575f80fd5b50604051620022ef380380620022ef833981016040819052620000339162000412565b84848484620000515f805160206200226f8339815191528062000232565b620000795f805160206200228f8339815191525f805160206200226f83398151915262000232565b620000a15f80516020620022af8339815191525f805160206200226f83398151915262000232565b620000c95f80516020620022cf8339815191525f805160206200226f83398151915262000232565b620000e35f805160206200226f833981519152306200027c565b6001600160a01b038116156200010d576200010d5f805160206200226f833981519152826200027c565b5f5b83518110156200019057620001555f805160206200228f833981519152858381518110620001415762000141620004ad565b60200260200101516200027c60201b60201c565b6200017d5f80516020620022cf833981519152858381518110620001415762000141620004ad565b6200018881620004c1565b90506200010f565b505f5b8251811015620001d857620001c55f80516020620022af833981519152848381518110620001415762000141620004ad565b620001d081620004c1565b905062000193565b506002849055604080515f8152602081018690527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1505050506001600160a01b031660805250620004e692505050565b5f82815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6200028882826200028c565b5050565b5f828152602081815260408083206001600160a01b038516845290915290205460ff1662000288575f828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620002e63390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b634e487b7160e01b5f52604160045260245ffd5b6001600160a01b038116811462000353575f80fd5b50565b805162000363816200033e565b919050565b5f82601f83011262000378575f80fd5b815160206001600160401b03808311156200039757620003976200032a565b8260051b604051601f19603f83011681018181108482111715620003bf57620003bf6200032a565b604052938452858101830193838101925087851115620003dd575f80fd5b83870191505b848210156200040757620003f78262000356565b83529183019190830190620003e3565b979650505050505050565b5f805f805f60a0868803121562000427575f80fd5b855160208701519095506001600160401b038082111562000446575f80fd5b6200045489838a0162000368565b955060408801519150808211156200046a575f80fd5b50620004798882890162000368565b93505060608601516200048c816200033e565b60808701519092506200049f816200033e565b809150509295509295909350565b634e487b7160e01b5f52603260045260245ffd5b5f60018201620004df57634e487b7160e01b5f52601160045260245ffd5b5060010190565b608051611d626200050d5f395f818161033601528181610c4e0152610c810152611d625ff3fe608060405260043610610154575f3560e01c806301d5062a1461015f57806301ffc9a71461018057806307bd0265146101b45780630d3cf6fc146101e2578063134008d31461021557806313bc9f2014610228578063150b7a0214610247578063248a9ca31461028a5780632ab0f529146102a95780632f2ff15d146102c857806331d50750146102e757806336568abe146103065780633a6aae7214610325578063584b153e1461037057806364d623531461038f5780638065657f146103ae5780638f2a0bb0146103cd5780638f61f4f5146103ec57806391d148541461040c578063a217fddf1461042b578063b08e51c01461043e578063b1c5f4271461045e578063bc197c811461047d578063c4d252f5146104a8578063d45c4435146104c7578063d547741f146104e6578063e38335e514610505578063f23a6e6114610518578063f27a0c9214610543575f80fd5b3661015b57005b5f80fd5b34801561016a575f80fd5b5061017e610179366004611322565b610557565b005b34801561018b575f80fd5b5061019f61019a366004611390565b6105c4565b60405190151581526020015b60405180910390f35b3480156101bf575f80fd5b506101d45f80516020611ccd83398151915281565b6040519081526020016101ab565b3480156101ed575f80fd5b506101d47f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b61017e6102233660046113b7565b6105ee565b348015610233575f80fd5b5061019f61024236600461141d565b61067a565b348015610252575f80fd5b506102716102613660046114e3565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016101ab565b348015610295575f80fd5b506101d46102a436600461141d565b61069e565b3480156102b4575f80fd5b5061019f6102c336600461141d565b6106b2565b3480156102d3575f80fd5b5061017e6102e2366004611546565b6106c5565b3480156102f2575f80fd5b5061019f61030136600461141d565b6106e6565b348015610311575f80fd5b5061017e610320366004611546565b6106f8565b348015610330575f80fd5b506103587f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101ab565b34801561037b575f80fd5b5061019f61038a36600461141d565b61077b565b34801561039a575f80fd5b5061017e6103a936600461141d565b610787565b3480156103b9575f80fd5b506101d46103c83660046113b7565b61082b565b3480156103d8575f80fd5b5061017e6103e73660046115b0565b610869565b3480156103f7575f80fd5b506101d45f80516020611cad83398151915281565b348015610417575f80fd5b5061019f610426366004611546565b610993565b348015610436575f80fd5b506101d45f81565b348015610449575f80fd5b506101d45f80516020611d0d83398151915281565b348015610469575f80fd5b506101d4610478366004611658565b6109bb565b348015610488575f80fd5b50610271610497366004611774565b63bc197c8160e01b95945050505050565b3480156104b3575f80fd5b5061017e6104c236600461141d565b6109ff565b3480156104d2575f80fd5b506101d46104e136600461141d565b610ac0565b3480156104f1575f80fd5b5061017e610500366004611546565b610ad1565b61017e610513366004611658565b610aed565b348015610523575f80fd5b50610271610532366004611816565b63f23a6e6160e01b95945050505050565b34801561054e575f80fd5b506101d4610c4b565b5f80516020611cad83398151915261056e81610d10565b5f61057d89898989898961082b565b90506105898184610d1d565b5f815f80516020611ced8339815191528b8b8b8b8b8a6040516105b19695949392919061189d565b60405180910390a3505050505050505050565b5f6001600160e01b03198216630271189760e51b14806105e857506105e882610e10565b92915050565b5f80516020611ccd833981519152610606815f610993565b610614576106148133610e44565b5f61062388888888888861082b565b905061062f8185610e9d565b61063b88888888610f2e565b5f815f80516020611c8d8339815191528a8a8a8a60405161065f94939291906118d9565b60405180910390a361067081610ffd565b5050505050505050565b5f8061068583610ac0565b90506001811180156106975750428111155b9392505050565b5f9081526020819052604090206001015490565b5f60016106be83610ac0565b1492915050565b6106ce8261069e565b6106d781610d10565b6106e18383611035565b505050565b5f806106f183610ac0565b1192915050565b6001600160a01b038116331461076d5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b61077782826110b8565b5050565b5f60016106f183610ac0565b3330146107ea5760405162461bcd60e51b815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201526a62652074696d656c6f636b60a81b6064820152608401610764565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f8686868686866040516020016108479695949392919061189d565b6040516020818303038152906040528051906020012090509695505050505050565b5f80516020611cad83398151915261088081610d10565b88871461089f5760405162461bcd60e51b81526004016107649061190a565b8885146108be5760405162461bcd60e51b81526004016107649061190a565b5f6108cf8b8b8b8b8b8b8b8b6109bb565b90506108db8184610d1d565b5f5b8a8110156109855780825f80516020611ced8339815191528e8e858181106109075761090761194d565b905060200201602081019061091c9190611961565b8d8d8681811061092e5761092e61194d565b905060200201358c8c878181106109475761094761194d565b9050602002810190610959919061197a565b8c8b60405161096d9695949392919061189d565b60405180910390a361097e816119d0565b90506108dd565b505050505050505050505050565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b5f88888888888888886040516020016109db989796959493929190611a74565b60405160208183030381529060405280519060200120905098975050505050505050565b5f80516020611d0d833981519152610a1681610d10565b610a1f8261077b565b610a855760405162461bcd60e51b815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e2063616044820152701b9b9bdd0818994818d85b98d95b1b1959607a1b6064820152608401610764565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f9081526001602052604090205490565b610ada8261069e565b610ae381610d10565b6106e183836110b8565b5f80516020611ccd833981519152610b05815f610993565b610b1357610b138133610e44565b878614610b325760405162461bcd60e51b81526004016107649061190a565b878414610b515760405162461bcd60e51b81526004016107649061190a565b5f610b628a8a8a8a8a8a8a8a6109bb565b9050610b6e8185610e9d565b5f5b89811015610c35575f8b8b83818110610b8b57610b8b61194d565b9050602002016020810190610ba09190611961565b90505f8a8a84818110610bb557610bb561194d565b905060200201359050365f8a8a86818110610bd257610bd261194d565b9050602002810190610be4919061197a565b91509150610bf484848484610f2e565b84865f80516020611c8d83398151915286868686604051610c1894939291906118d9565b60405180910390a35050505080610c2e906119d0565b9050610b70565b50610c3f81610ffd565b50505050505050505050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615801590610cff57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cdb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cff9190611b13565b15610d0957505f90565b5060025490565b610d1a8133610e44565b50565b610d26826106e6565b15610d8b5760405162461bcd60e51b815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201526e1c9958591e481cd8da19591d5b1959608a1b6064820152608401610764565b610d93610c4b565b811015610df15760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e746044820152652064656c617960d01b6064820152608401610764565b610dfb8142611b32565b5f928352600160205260409092209190915550565b5f6001600160e01b03198216637965db0b60e01b14806105e857506301ffc9a760e01b6001600160e01b03198316146105e8565b610e4e8282610993565b61077757610e5b8161111c565b610e6683602061112e565b604051602001610e77929190611b67565b60408051601f198184030181529082905262461bcd60e51b825261076491600401611bd5565b610ea68261067a565b610ec25760405162461bcd60e51b815260040161076490611c07565b801580610ed35750610ed3816106b2565b6107775760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e6720646570656044820152656e64656e637960d01b6064820152608401610764565b5f846001600160a01b0316848484604051610f4a929190611c51565b5f6040518083038185875af1925050503d805f8114610f84576040519150601f19603f3d011682016040523d82523d5f602084013e610f89565b606091505b5050905080610ff65760405162461bcd60e51b815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e6720746044820152721c985b9cd858dd1a5bdb881c995d995c9d1959606a1b6064820152608401610764565b5050505050565b6110068161067a565b6110225760405162461bcd60e51b815260040161076490611c07565b5f90815260016020819052604090912055565b61103f8282610993565b610777575f828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556110743390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6110c28282610993565b15610777575f828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606105e86001600160a01b03831660145b60605f61113c836002611c60565b611147906002611b32565b6001600160401b0381111561115e5761115e611434565b6040519080825280601f01601f191660200182016040528015611188576020820181803683370190505b509050600360fc1b815f815181106111a2576111a261194d565b60200101906001600160f81b03191690815f1a905350600f60fb1b816001815181106111d0576111d061194d565b60200101906001600160f81b03191690815f1a9053505f6111f2846002611c60565b6111fd906001611b32565b90505b6001811115611274576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106112315761123161194d565b1a60f81b8282815181106112475761124761194d565b60200101906001600160f81b03191690815f1a90535060049490941c9361126d81611c77565b9050611200565b5083156106975760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610764565b80356001600160a01b03811681146112d9575f80fd5b919050565b5f8083601f8401126112ee575f80fd5b5081356001600160401b03811115611304575f80fd5b60208301915083602082850101111561131b575f80fd5b9250929050565b5f805f805f805f60c0888a031215611338575f80fd5b611341886112c3565b96506020880135955060408801356001600160401b03811115611362575f80fd5b61136e8a828b016112de565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f602082840312156113a0575f80fd5b81356001600160e01b031981168114610697575f80fd5b5f805f805f8060a087890312156113cc575f80fd5b6113d5876112c3565b95506020870135945060408701356001600160401b038111156113f6575f80fd5b61140289828a016112de565b979a9699509760608101359660809091013595509350505050565b5f6020828403121561142d575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561147057611470611434565b604052919050565b5f82601f830112611487575f80fd5b81356001600160401b038111156114a0576114a0611434565b6114b3601f8201601f1916602001611448565b8181528460208386010111156114c7575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f80608085870312156114f6575f80fd5b6114ff856112c3565b935061150d602086016112c3565b92506040850135915060608501356001600160401b0381111561152e575f80fd5b61153a87828801611478565b91505092959194509250565b5f8060408385031215611557575f80fd5b82359150611567602084016112c3565b90509250929050565b5f8083601f840112611580575f80fd5b5081356001600160401b03811115611596575f80fd5b6020830191508360208260051b850101111561131b575f80fd5b5f805f805f805f805f60c08a8c0312156115c8575f80fd5b89356001600160401b03808211156115de575f80fd5b6115ea8d838e01611570565b909b50995060208c0135915080821115611602575f80fd5b61160e8d838e01611570565b909950975060408c0135915080821115611626575f80fd5b506116338c828d01611570565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b03121561166f575f80fd5b88356001600160401b0380821115611685575f80fd5b6116918c838d01611570565b909a50985060208b01359150808211156116a9575f80fd5b6116b58c838d01611570565b909850965060408b01359150808211156116cd575f80fd5b506116da8b828c01611570565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112611707575f80fd5b813560206001600160401b0382111561172257611722611434565b8160051b611731828201611448565b928352848101820192828101908785111561174a575f80fd5b83870192505b8483101561176957823582529183019190830190611750565b979650505050505050565b5f805f805f60a08688031215611788575f80fd5b611791866112c3565b945061179f602087016112c3565b935060408601356001600160401b03808211156117ba575f80fd5b6117c689838a016116f8565b945060608801359150808211156117db575f80fd5b6117e789838a016116f8565b935060808801359150808211156117fc575f80fd5b5061180988828901611478565b9150509295509295909350565b5f805f805f60a0868803121561182a575f80fd5b611833866112c3565b9450611841602087016112c3565b9350604086013592506060860135915060808601356001600160401b03811115611869575f80fd5b61180988828901611478565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60018060a01b038716815285602082015260a060408201525f6118c460a083018688611875565b60608301949094525060800152949350505050565b60018060a01b0385168152836020820152606060408201525f611900606083018486611875565b9695505050505050565b60208082526023908201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d616040820152620e8c6d60eb1b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611971575f80fd5b610697826112c3565b5f808335601e1984360301811261198f575f80fd5b8301803591506001600160401b038211156119a8575f80fd5b60200191503681900382131561131b575f80fd5b634e487b7160e01b5f52601160045260245ffd5b5f600182016119e1576119e16119bc565b5060010190565b8183525f6020808501808196508560051b81019150845f5b87811015611a675782840389528135601e19883603018112611a20575f80fd5b870185810190356001600160401b03811115611a3a575f80fd5b803603821315611a48575f80fd5b611a53868284611875565b9a87019a9550505090840190600101611a00565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b811015611ab4576001600160a01b03611a9f846112c3565b16825260209283019290910190600101611a86565b5083810360208501528881526001600160fb1b03891115611ad3575f80fd5b8860051b9150818a60208301370182810360209081016040850152611afb90820187896119e8565b60608401959095525050608001529695505050505050565b5f60208284031215611b23575f80fd5b81518015158114610697575f80fd5b808201808211156105e8576105e86119bc565b5f5b83811015611b5f578181015183820152602001611b47565b50505f910152565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b81525f8351611b98816017850160208801611b45565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611bc9816028840160208801611b45565b01602801949350505050565b602081525f8251806020840152611bf3816040850160208701611b45565b601f01601f19169190910160400192915050565b6020808252602a908201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e206973604082015269206e6f7420726561647960b01b606082015260800190565b818382375f9101908152919050565b80820281158282048414176105e8576105e86119bc565b5f81611c8557611c856119bc565b505f19019056fec2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e634cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dcafd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783a26469706673582212207b46519d3aba8bd92bdea0509201655b38da72321b77e33118fb7e673979bea364736f6c634300081400335f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63fd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783", + "deployedBytecode": "0x608060405260043610610154575f3560e01c806301d5062a1461015f57806301ffc9a71461018057806307bd0265146101b45780630d3cf6fc146101e2578063134008d31461021557806313bc9f2014610228578063150b7a0214610247578063248a9ca31461028a5780632ab0f529146102a95780632f2ff15d146102c857806331d50750146102e757806336568abe146103065780633a6aae7214610325578063584b153e1461037057806364d623531461038f5780638065657f146103ae5780638f2a0bb0146103cd5780638f61f4f5146103ec57806391d148541461040c578063a217fddf1461042b578063b08e51c01461043e578063b1c5f4271461045e578063bc197c811461047d578063c4d252f5146104a8578063d45c4435146104c7578063d547741f146104e6578063e38335e514610505578063f23a6e6114610518578063f27a0c9214610543575f80fd5b3661015b57005b5f80fd5b34801561016a575f80fd5b5061017e610179366004611322565b610557565b005b34801561018b575f80fd5b5061019f61019a366004611390565b6105c4565b60405190151581526020015b60405180910390f35b3480156101bf575f80fd5b506101d45f80516020611ccd83398151915281565b6040519081526020016101ab565b3480156101ed575f80fd5b506101d47f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b61017e6102233660046113b7565b6105ee565b348015610233575f80fd5b5061019f61024236600461141d565b61067a565b348015610252575f80fd5b506102716102613660046114e3565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016101ab565b348015610295575f80fd5b506101d46102a436600461141d565b61069e565b3480156102b4575f80fd5b5061019f6102c336600461141d565b6106b2565b3480156102d3575f80fd5b5061017e6102e2366004611546565b6106c5565b3480156102f2575f80fd5b5061019f61030136600461141d565b6106e6565b348015610311575f80fd5b5061017e610320366004611546565b6106f8565b348015610330575f80fd5b506103587f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101ab565b34801561037b575f80fd5b5061019f61038a36600461141d565b61077b565b34801561039a575f80fd5b5061017e6103a936600461141d565b610787565b3480156103b9575f80fd5b506101d46103c83660046113b7565b61082b565b3480156103d8575f80fd5b5061017e6103e73660046115b0565b610869565b3480156103f7575f80fd5b506101d45f80516020611cad83398151915281565b348015610417575f80fd5b5061019f610426366004611546565b610993565b348015610436575f80fd5b506101d45f81565b348015610449575f80fd5b506101d45f80516020611d0d83398151915281565b348015610469575f80fd5b506101d4610478366004611658565b6109bb565b348015610488575f80fd5b50610271610497366004611774565b63bc197c8160e01b95945050505050565b3480156104b3575f80fd5b5061017e6104c236600461141d565b6109ff565b3480156104d2575f80fd5b506101d46104e136600461141d565b610ac0565b3480156104f1575f80fd5b5061017e610500366004611546565b610ad1565b61017e610513366004611658565b610aed565b348015610523575f80fd5b50610271610532366004611816565b63f23a6e6160e01b95945050505050565b34801561054e575f80fd5b506101d4610c4b565b5f80516020611cad83398151915261056e81610d10565b5f61057d89898989898961082b565b90506105898184610d1d565b5f815f80516020611ced8339815191528b8b8b8b8b8a6040516105b19695949392919061189d565b60405180910390a3505050505050505050565b5f6001600160e01b03198216630271189760e51b14806105e857506105e882610e10565b92915050565b5f80516020611ccd833981519152610606815f610993565b610614576106148133610e44565b5f61062388888888888861082b565b905061062f8185610e9d565b61063b88888888610f2e565b5f815f80516020611c8d8339815191528a8a8a8a60405161065f94939291906118d9565b60405180910390a361067081610ffd565b5050505050505050565b5f8061068583610ac0565b90506001811180156106975750428111155b9392505050565b5f9081526020819052604090206001015490565b5f60016106be83610ac0565b1492915050565b6106ce8261069e565b6106d781610d10565b6106e18383611035565b505050565b5f806106f183610ac0565b1192915050565b6001600160a01b038116331461076d5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b61077782826110b8565b5050565b5f60016106f183610ac0565b3330146107ea5760405162461bcd60e51b815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201526a62652074696d656c6f636b60a81b6064820152608401610764565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f8686868686866040516020016108479695949392919061189d565b6040516020818303038152906040528051906020012090509695505050505050565b5f80516020611cad83398151915261088081610d10565b88871461089f5760405162461bcd60e51b81526004016107649061190a565b8885146108be5760405162461bcd60e51b81526004016107649061190a565b5f6108cf8b8b8b8b8b8b8b8b6109bb565b90506108db8184610d1d565b5f5b8a8110156109855780825f80516020611ced8339815191528e8e858181106109075761090761194d565b905060200201602081019061091c9190611961565b8d8d8681811061092e5761092e61194d565b905060200201358c8c878181106109475761094761194d565b9050602002810190610959919061197a565b8c8b60405161096d9695949392919061189d565b60405180910390a361097e816119d0565b90506108dd565b505050505050505050505050565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b5f88888888888888886040516020016109db989796959493929190611a74565b60405160208183030381529060405280519060200120905098975050505050505050565b5f80516020611d0d833981519152610a1681610d10565b610a1f8261077b565b610a855760405162461bcd60e51b815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e2063616044820152701b9b9bdd0818994818d85b98d95b1b1959607a1b6064820152608401610764565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f9081526001602052604090205490565b610ada8261069e565b610ae381610d10565b6106e183836110b8565b5f80516020611ccd833981519152610b05815f610993565b610b1357610b138133610e44565b878614610b325760405162461bcd60e51b81526004016107649061190a565b878414610b515760405162461bcd60e51b81526004016107649061190a565b5f610b628a8a8a8a8a8a8a8a6109bb565b9050610b6e8185610e9d565b5f5b89811015610c35575f8b8b83818110610b8b57610b8b61194d565b9050602002016020810190610ba09190611961565b90505f8a8a84818110610bb557610bb561194d565b905060200201359050365f8a8a86818110610bd257610bd261194d565b9050602002810190610be4919061197a565b91509150610bf484848484610f2e565b84865f80516020611c8d83398151915286868686604051610c1894939291906118d9565b60405180910390a35050505080610c2e906119d0565b9050610b70565b50610c3f81610ffd565b50505050505050505050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615801590610cff57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cdb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cff9190611b13565b15610d0957505f90565b5060025490565b610d1a8133610e44565b50565b610d26826106e6565b15610d8b5760405162461bcd60e51b815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201526e1c9958591e481cd8da19591d5b1959608a1b6064820152608401610764565b610d93610c4b565b811015610df15760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e746044820152652064656c617960d01b6064820152608401610764565b610dfb8142611b32565b5f928352600160205260409092209190915550565b5f6001600160e01b03198216637965db0b60e01b14806105e857506301ffc9a760e01b6001600160e01b03198316146105e8565b610e4e8282610993565b61077757610e5b8161111c565b610e6683602061112e565b604051602001610e77929190611b67565b60408051601f198184030181529082905262461bcd60e51b825261076491600401611bd5565b610ea68261067a565b610ec25760405162461bcd60e51b815260040161076490611c07565b801580610ed35750610ed3816106b2565b6107775760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e6720646570656044820152656e64656e637960d01b6064820152608401610764565b5f846001600160a01b0316848484604051610f4a929190611c51565b5f6040518083038185875af1925050503d805f8114610f84576040519150601f19603f3d011682016040523d82523d5f602084013e610f89565b606091505b5050905080610ff65760405162461bcd60e51b815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e6720746044820152721c985b9cd858dd1a5bdb881c995d995c9d1959606a1b6064820152608401610764565b5050505050565b6110068161067a565b6110225760405162461bcd60e51b815260040161076490611c07565b5f90815260016020819052604090912055565b61103f8282610993565b610777575f828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556110743390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6110c28282610993565b15610777575f828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606105e86001600160a01b03831660145b60605f61113c836002611c60565b611147906002611b32565b6001600160401b0381111561115e5761115e611434565b6040519080825280601f01601f191660200182016040528015611188576020820181803683370190505b509050600360fc1b815f815181106111a2576111a261194d565b60200101906001600160f81b03191690815f1a905350600f60fb1b816001815181106111d0576111d061194d565b60200101906001600160f81b03191690815f1a9053505f6111f2846002611c60565b6111fd906001611b32565b90505b6001811115611274576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106112315761123161194d565b1a60f81b8282815181106112475761124761194d565b60200101906001600160f81b03191690815f1a90535060049490941c9361126d81611c77565b9050611200565b5083156106975760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610764565b80356001600160a01b03811681146112d9575f80fd5b919050565b5f8083601f8401126112ee575f80fd5b5081356001600160401b03811115611304575f80fd5b60208301915083602082850101111561131b575f80fd5b9250929050565b5f805f805f805f60c0888a031215611338575f80fd5b611341886112c3565b96506020880135955060408801356001600160401b03811115611362575f80fd5b61136e8a828b016112de565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f602082840312156113a0575f80fd5b81356001600160e01b031981168114610697575f80fd5b5f805f805f8060a087890312156113cc575f80fd5b6113d5876112c3565b95506020870135945060408701356001600160401b038111156113f6575f80fd5b61140289828a016112de565b979a9699509760608101359660809091013595509350505050565b5f6020828403121561142d575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561147057611470611434565b604052919050565b5f82601f830112611487575f80fd5b81356001600160401b038111156114a0576114a0611434565b6114b3601f8201601f1916602001611448565b8181528460208386010111156114c7575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f80608085870312156114f6575f80fd5b6114ff856112c3565b935061150d602086016112c3565b92506040850135915060608501356001600160401b0381111561152e575f80fd5b61153a87828801611478565b91505092959194509250565b5f8060408385031215611557575f80fd5b82359150611567602084016112c3565b90509250929050565b5f8083601f840112611580575f80fd5b5081356001600160401b03811115611596575f80fd5b6020830191508360208260051b850101111561131b575f80fd5b5f805f805f805f805f60c08a8c0312156115c8575f80fd5b89356001600160401b03808211156115de575f80fd5b6115ea8d838e01611570565b909b50995060208c0135915080821115611602575f80fd5b61160e8d838e01611570565b909950975060408c0135915080821115611626575f80fd5b506116338c828d01611570565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b03121561166f575f80fd5b88356001600160401b0380821115611685575f80fd5b6116918c838d01611570565b909a50985060208b01359150808211156116a9575f80fd5b6116b58c838d01611570565b909850965060408b01359150808211156116cd575f80fd5b506116da8b828c01611570565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112611707575f80fd5b813560206001600160401b0382111561172257611722611434565b8160051b611731828201611448565b928352848101820192828101908785111561174a575f80fd5b83870192505b8483101561176957823582529183019190830190611750565b979650505050505050565b5f805f805f60a08688031215611788575f80fd5b611791866112c3565b945061179f602087016112c3565b935060408601356001600160401b03808211156117ba575f80fd5b6117c689838a016116f8565b945060608801359150808211156117db575f80fd5b6117e789838a016116f8565b935060808801359150808211156117fc575f80fd5b5061180988828901611478565b9150509295509295909350565b5f805f805f60a0868803121561182a575f80fd5b611833866112c3565b9450611841602087016112c3565b9350604086013592506060860135915060808601356001600160401b03811115611869575f80fd5b61180988828901611478565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60018060a01b038716815285602082015260a060408201525f6118c460a083018688611875565b60608301949094525060800152949350505050565b60018060a01b0385168152836020820152606060408201525f611900606083018486611875565b9695505050505050565b60208082526023908201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d616040820152620e8c6d60eb1b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611971575f80fd5b610697826112c3565b5f808335601e1984360301811261198f575f80fd5b8301803591506001600160401b038211156119a8575f80fd5b60200191503681900382131561131b575f80fd5b634e487b7160e01b5f52601160045260245ffd5b5f600182016119e1576119e16119bc565b5060010190565b8183525f6020808501808196508560051b81019150845f5b87811015611a675782840389528135601e19883603018112611a20575f80fd5b870185810190356001600160401b03811115611a3a575f80fd5b803603821315611a48575f80fd5b611a53868284611875565b9a87019a9550505090840190600101611a00565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b811015611ab4576001600160a01b03611a9f846112c3565b16825260209283019290910190600101611a86565b5083810360208501528881526001600160fb1b03891115611ad3575f80fd5b8860051b9150818a60208301370182810360209081016040850152611afb90820187896119e8565b60608401959095525050608001529695505050505050565b5f60208284031215611b23575f80fd5b81518015158114610697575f80fd5b808201808211156105e8576105e86119bc565b5f5b83811015611b5f578181015183820152602001611b47565b50505f910152565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b81525f8351611b98816017850160208801611b45565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611bc9816028840160208801611b45565b01602801949350505050565b602081525f8251806020840152611bf3816040850160208701611b45565b601f01601f19169190910160400192915050565b6020808252602a908201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e206973604082015269206e6f7420726561647960b01b606082015260800190565b818382375f9101908152919050565b80820281158282048414176105e8576105e86119bc565b5f81611c8557611c856119bc565b505f19019056fec2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e634cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dcafd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783a26469706673582212207b46519d3aba8bd92bdea0509201655b38da72321b77e33118fb7e673979bea364736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMV2.json b/compiled-contracts/paris/PolygonZkEVMV2.json index a75047c6a..36a58ea3c 100644 --- a/compiled-contracts/paris/PolygonZkEVMV2.json +++ b/compiled-contracts/paris/PolygonZkEVMV2.json @@ -1001,8 +1001,8 @@ "type": "function" } ], - "bytecode": "0x6101006040523480156200001257600080fd5b5060405162003ad238038062003ad2833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e051613941620001916000396000818161044a015281816108540152818161092301528181610da701528181610f73015281816116ca01528181611793015281816117b50152818161194c0152818161244d0152818161251b0152612608015260008181610519015261188d0152600081816105c2015281816113ed015261275301526000818161060f015281816106ec0152818161171d01528181611863015261272701526139416000f3fe608060405234801561001057600080fd5b50600436106102765760003560e01c80636ff512cc11610160578063cfa8ed47116100d8578063e46761c41161008c578063eaeb077b11610071578063eaeb077b14610651578063f35dda4714610664578063f851a4401461067e57600080fd5b8063e46761c41461060a578063e7a7ed021461063157600080fd5b8063d690be31116100bd578063d690be31146105e4578063d7bc90ff146105ec578063d8d1091b146105f757600080fd5b8063cfa8ed471461059d578063d02103ca146105bd57600080fd5b8063a3c573eb1161012f578063b0afe15411610114578063b0afe1541461054e578063c754c7ed1461055a578063c89e42df1461058a57600080fd5b8063a3c573eb14610514578063ada8f9191461053b57600080fd5b80636ff512cc146104cb5780638c3d7301146104de57806399af0397146104e65780639e001877146104f957600080fd5b806345605267116101f3578063542028d5116101c25780635ec91958116101a75780635ec919581461049a5780636b8616ce146104a25780636e05d2cd146104c257600080fd5b8063542028d51461047f5780635e9145c91461048757600080fd5b8063456052671461040a57806347ebf1081461043257806349b7b802146104455780634e4877061461046c57600080fd5b80632b35b3ac1161024a5780633c351e101161022f5780633c351e101461034f5780633cbc795b1461037457806340b5de6c146103b257600080fd5b80632b35b3ac1461031d57806332c2d1531461033a57600080fd5b8062d0295d1461027b578063107bf28c1461029657806319d8ac61146102ab57806326782247146102d8575b600080fd5b6102836106a4565b6040519081526020015b60405180910390f35b61029e6107c4565b60405161028d9190612e7d565b6007546102bf9067ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161028d565b6001546102f89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161028d565b60085461032a9060ff1681565b604051901515815260200161028d565b61034d610348366004612ed9565b610852565b005b6008546102f890610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60085461039d907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161028d565b6103d97fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161028d565b6007546102bf90700100000000000000000000000000000000900467ffffffffffffffff1681565b61034d610440366004613005565b610921565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b61034d61047a3660046130bc565b610ed3565b61029e6110ed565b61034d610495366004613125565b6110fa565b61034d611a13565b6102836104b03660046130bc565b60066020526000908152604090205481565b61028360055481565b61034d6104d9366004613170565b611afd565b61034d611bc7565b61029e6104f436600461318b565b611c9a565b6102f873a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b61034d610549366004613170565b611f18565b6102836405ca1ab1e081565b6007546102bf907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61034d6105983660046131c5565b611fe2565b6002546102f89073ffffffffffffffffffffffffffffffffffffffff1681565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b61029e612075565b610283635ca1ab1e81565b61034d6106053660046131fa565b612091565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b6007546102bf9068010000000000000000900467ffffffffffffffff1681565b61034d61065f36600461323c565b6125c8565b61066c601b81565b60405160ff909116815260200161028d565b6000546102f89062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610733573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075791906132b4565b6007549091506000906107969067ffffffffffffffff7001000000000000000000000000000000008204811691680100000000000000009004166132fc565b67ffffffffffffffff169050806000036107b35760009250505090565b6107bd8183613324565b9250505090565b600480546107d19061335f565b80601f01602080910402602001604051908101604052809291908181526020018280546107fd9061335f565b801561084a5780601f1061081f5761010080835404028352916020019161084a565b820191906000526020600020905b81548152906001019060200180831161082d57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146108c1576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59668460405161091491815260200190565b60405180910390a3505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610990576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156109b05750600054600160ff909116105b806109ca5750303b1580156109ca575060005460ff166001145b610a5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610ab957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8b81169190910291909117909155600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000169189169190911790556003610b418482613400565b506004610b4e8382613400565b506007805477ffffffffffffffffffffffffffffffffffffffffffffffff167a06978000000000000000000000000000000000000000000000000017905573ffffffffffffffffffffffffffffffffffffffff8516610be55763ffffffff841615610be5576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8816027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff8716021790556000610c78878787611c9a565b805160208083019190912060408051600093810184905290810182905260608082018490524260c081901b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015293945090929190609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291506000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e29919061351a565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050508015610ec957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610f2a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610f71576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fdc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110009190613537565b6110695760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611069576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546107d19061335f565b60025473ffffffffffffffffffffffffffffffffffffffff16331461114b576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003611187576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156111c3576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156115ff57600089898381811061120c5761120c613559565b905060200281019061121e9190613588565b611227906135c6565b8051805160209091012060608201519192509067ffffffffffffffff16156113aa578561125381613657565b965050600081836020015184606001516040516020016112ab93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114611334576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff16101561138a576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86166000908152600660205260408120556114e7565b602082015115801590611471575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af115801561144b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146f91906132b4565b155b156114a8576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156114e7576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff16108061151a575042826040015167ffffffffffffffff16115b15611551576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519650505080806115f79061367e565b9150506111f0565b5060075467ffffffffffffffff6801000000000000000090910481169084161115611656576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691909117909155600583905585908281169085161461178d5760006116ad83866132fc565b90506116c367ffffffffffffffff8216836136b6565b91506117447f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166116fc6106a4565b61170691906136cf565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691906129b7565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b61188b337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa15801561181e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184291906132b4565b61184c91906136cf565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190612a90565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156118f357600080fd5b505af1158015611907573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af11580156119ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119cf919061351a565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611a6a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615611aa7576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611b54576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016110e2565b60015473ffffffffffffffffffffffffffffffffffffffff163314611c18576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b606060006040518060600160405280602181526020016138eb6021913960405163ffffffff808816602483015273ffffffffffffffffffffffffffffffffffffffff871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa6084820152600060a482015260c401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd3476afe000000000000000000000000000000000000000000000000000000001790529051611d93939291016136e6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015611e21573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611e99576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051600090611edf9084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001613715565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152919052979650505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611f6f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016110e2565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612039576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036120458282613400565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516110e29190612e7d565b6040518060600160405280602181526020016138eb6021913981565b60085460ff166120cd576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003612109576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612145576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612180918491700100000000000000000000000000000000900416613771565b11156121b8576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b838110156124475760008686838181106121fd576121fd613559565b905060200281019061220f9190613784565b612218906137b8565b90508361222481613657565b825180516020918201208185015160408087015190519499509194506000936122869386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff891660009081526006909352912054909150811461230f576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86166000908152600660205260408120556123346001886136b6565b84036123a35742600760189054906101000a900467ffffffffffffffff1684604001516123619190613836565b67ffffffffffffffff1611156123a3576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450505050808061243f9061367e565b9150506121e1565b506124757f0000000000000000000000000000000000000000000000000000000000000000846116fc6106a4565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612564573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612588919061351a565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612604576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612671573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061269591906132b4565b9050818111156126d1576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138883111561270d576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61274f73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084612a90565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e091906132b4565b600780549192506801000000000000000090910467ffffffffffffffff1690600861280a83613657565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612841929190613857565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612951576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26129b0565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931823388886040516129a79493929190613867565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052612a8b9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612af4565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612aee9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612a09565b50505050565b6000612b56826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612c009092919063ffffffff16565b805190915015612a8b5780806020019051810190612b749190613537565b612a8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610a52565b6060612c0f8484600085612c17565b949350505050565b606082471015612ca9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610a52565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612cd291906138d8565b60006040518083038185875af1925050503d8060008114612d0f576040519150601f19603f3d011682016040523d82523d6000602084013e612d14565b606091505b5091509150612d2587838387612d30565b979650505050505050565b60608315612dc6578251600003612dbf5773ffffffffffffffffffffffffffffffffffffffff85163b612dbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a52565b5081612c0f565b612c0f8383815115612ddb5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a529190612e7d565b60005b83811015612e2a578181015183820152602001612e12565b50506000910152565b60008151808452612e4b816020860160208601612e0f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612e906020830184612e33565b9392505050565b67ffffffffffffffff81168114612ead57600080fd5b50565b803573ffffffffffffffffffffffffffffffffffffffff81168114612ed457600080fd5b919050565b600080600060608486031215612eee57600080fd5b8335612ef981612e97565b925060208401359150612f0e60408501612eb0565b90509250925092565b803563ffffffff81168114612ed457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112612f6b57600080fd5b813567ffffffffffffffff80821115612f8657612f86612f2b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612fcc57612fcc612f2b565b81604052838152866020858801011115612fe557600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121561302057600080fd5b61302988612eb0565b965061303760208901612eb0565b955061304560408901612f17565b945061305360608901612eb0565b935061306160808901612f17565b925060a088013567ffffffffffffffff8082111561307e57600080fd5b61308a8b838c01612f5a565b935060c08a01359150808211156130a057600080fd5b506130ad8a828b01612f5a565b91505092959891949750929550565b6000602082840312156130ce57600080fd5b8135612e9081612e97565b60008083601f8401126130eb57600080fd5b50813567ffffffffffffffff81111561310357600080fd5b6020830191508360208260051b850101111561311e57600080fd5b9250929050565b60008060006040848603121561313a57600080fd5b833567ffffffffffffffff81111561315157600080fd5b61315d868287016130d9565b9094509250612f0e905060208501612eb0565b60006020828403121561318257600080fd5b612e9082612eb0565b6000806000606084860312156131a057600080fd5b6131a984612f17565b92506131b760208501612eb0565b9150612f0e60408501612f17565b6000602082840312156131d757600080fd5b813567ffffffffffffffff8111156131ee57600080fd5b612c0f84828501612f5a565b6000806020838503121561320d57600080fd5b823567ffffffffffffffff81111561322457600080fd5b613230858286016130d9565b90969095509350505050565b60008060006040848603121561325157600080fd5b833567ffffffffffffffff8082111561326957600080fd5b818601915086601f83011261327d57600080fd5b81358181111561328c57600080fd5b87602082850101111561329e57600080fd5b6020928301989097509590910135949350505050565b6000602082840312156132c657600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff82811682821603908082111561331d5761331d6132cd565b5092915050565b60008261335a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061337357607f821691505b6020821081036133ac577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f821115612a8b57600081815260208120601f850160051c810160208610156133d95750805b601f850160051c820191505b818110156133f8578281556001016133e5565b505050505050565b815167ffffffffffffffff81111561341a5761341a612f2b565b61342e81613428845461335f565b846133b2565b602080601f831160018114613481576000841561344b5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556133f8565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156134ce578886015182559484019460019091019084016134af565b508582101561350a57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121561352c57600080fd5b8151612e9081612e97565b60006020828403121561354957600080fd5b81518015158114612e9057600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126135bc57600080fd5b9190910192915050565b6000608082360312156135d857600080fd5b6040516080810167ffffffffffffffff82821081831117156135fc576135fc612f2b565b81604052843591508082111561361157600080fd5b5061361e36828601612f5a565b82525060208301356020820152604083013561363981612e97565b6040820152606083013561364c81612e97565b606082015292915050565b600067ffffffffffffffff808316818103613674576136746132cd565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036136af576136af6132cd565b5060010190565b818103818111156136c9576136c96132cd565b92915050565b80820281158282048414176136c9576136c96132cd565b600083516136f8818460208801612e0f565b83519083019061370c818360208801612e0f565b01949350505050565b60008651613727818460208b01612e0f565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b808201808211156136c9576136c96132cd565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126135bc57600080fd5b6000606082360312156137ca57600080fd5b6040516060810167ffffffffffffffff82821081831117156137ee576137ee612f2b565b81604052843591508082111561380357600080fd5b5061381036828601612f5a565b82525060208301356020820152604083013561382b81612e97565b604082015292915050565b67ffffffffffffffff81811683821601908082111561331d5761331d6132cd565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b600082516135bc818460208701612e0f56fef8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a2646970667358221220317f572504470f2d6a52f975c62fbecafc00b9dc2adc0055266c25247ace451064736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102765760003560e01c80636ff512cc11610160578063cfa8ed47116100d8578063e46761c41161008c578063eaeb077b11610071578063eaeb077b14610651578063f35dda4714610664578063f851a4401461067e57600080fd5b8063e46761c41461060a578063e7a7ed021461063157600080fd5b8063d690be31116100bd578063d690be31146105e4578063d7bc90ff146105ec578063d8d1091b146105f757600080fd5b8063cfa8ed471461059d578063d02103ca146105bd57600080fd5b8063a3c573eb1161012f578063b0afe15411610114578063b0afe1541461054e578063c754c7ed1461055a578063c89e42df1461058a57600080fd5b8063a3c573eb14610514578063ada8f9191461053b57600080fd5b80636ff512cc146104cb5780638c3d7301146104de57806399af0397146104e65780639e001877146104f957600080fd5b806345605267116101f3578063542028d5116101c25780635ec91958116101a75780635ec919581461049a5780636b8616ce146104a25780636e05d2cd146104c257600080fd5b8063542028d51461047f5780635e9145c91461048757600080fd5b8063456052671461040a57806347ebf1081461043257806349b7b802146104455780634e4877061461046c57600080fd5b80632b35b3ac1161024a5780633c351e101161022f5780633c351e101461034f5780633cbc795b1461037457806340b5de6c146103b257600080fd5b80632b35b3ac1461031d57806332c2d1531461033a57600080fd5b8062d0295d1461027b578063107bf28c1461029657806319d8ac61146102ab57806326782247146102d8575b600080fd5b6102836106a4565b6040519081526020015b60405180910390f35b61029e6107c4565b60405161028d9190612e7d565b6007546102bf9067ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161028d565b6001546102f89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161028d565b60085461032a9060ff1681565b604051901515815260200161028d565b61034d610348366004612ed9565b610852565b005b6008546102f890610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60085461039d907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161028d565b6103d97fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161028d565b6007546102bf90700100000000000000000000000000000000900467ffffffffffffffff1681565b61034d610440366004613005565b610921565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b61034d61047a3660046130bc565b610ed3565b61029e6110ed565b61034d610495366004613125565b6110fa565b61034d611a13565b6102836104b03660046130bc565b60066020526000908152604090205481565b61028360055481565b61034d6104d9366004613170565b611afd565b61034d611bc7565b61029e6104f436600461318b565b611c9a565b6102f873a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b61034d610549366004613170565b611f18565b6102836405ca1ab1e081565b6007546102bf907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61034d6105983660046131c5565b611fe2565b6002546102f89073ffffffffffffffffffffffffffffffffffffffff1681565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b61029e612075565b610283635ca1ab1e81565b61034d6106053660046131fa565b612091565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b6007546102bf9068010000000000000000900467ffffffffffffffff1681565b61034d61065f36600461323c565b6125c8565b61066c601b81565b60405160ff909116815260200161028d565b6000546102f89062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610733573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075791906132b4565b6007549091506000906107969067ffffffffffffffff7001000000000000000000000000000000008204811691680100000000000000009004166132fc565b67ffffffffffffffff169050806000036107b35760009250505090565b6107bd8183613324565b9250505090565b600480546107d19061335f565b80601f01602080910402602001604051908101604052809291908181526020018280546107fd9061335f565b801561084a5780601f1061081f5761010080835404028352916020019161084a565b820191906000526020600020905b81548152906001019060200180831161082d57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146108c1576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59668460405161091491815260200190565b60405180910390a3505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610990576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156109b05750600054600160ff909116105b806109ca5750303b1580156109ca575060005460ff166001145b610a5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610ab957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8b81169190910291909117909155600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000169189169190911790556003610b418482613400565b506004610b4e8382613400565b506007805477ffffffffffffffffffffffffffffffffffffffffffffffff167a06978000000000000000000000000000000000000000000000000017905573ffffffffffffffffffffffffffffffffffffffff8516610be55763ffffffff841615610be5576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8816027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff8716021790556000610c78878787611c9a565b805160208083019190912060408051600093810184905290810182905260608082018490524260c081901b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015293945090929190609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291506000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e29919061351a565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050508015610ec957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610f2a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610f71576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fdc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110009190613537565b6110695760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611069576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546107d19061335f565b60025473ffffffffffffffffffffffffffffffffffffffff16331461114b576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003611187576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156111c3576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156115ff57600089898381811061120c5761120c613559565b905060200281019061121e9190613588565b611227906135c6565b8051805160209091012060608201519192509067ffffffffffffffff16156113aa578561125381613657565b965050600081836020015184606001516040516020016112ab93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114611334576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff16101561138a576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86166000908152600660205260408120556114e7565b602082015115801590611471575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af115801561144b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146f91906132b4565b155b156114a8576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156114e7576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff16108061151a575042826040015167ffffffffffffffff16115b15611551576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519650505080806115f79061367e565b9150506111f0565b5060075467ffffffffffffffff6801000000000000000090910481169084161115611656576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691909117909155600583905585908281169085161461178d5760006116ad83866132fc565b90506116c367ffffffffffffffff8216836136b6565b91506117447f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166116fc6106a4565b61170691906136cf565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691906129b7565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b61188b337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa15801561181e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184291906132b4565b61184c91906136cf565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190612a90565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156118f357600080fd5b505af1158015611907573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af11580156119ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119cf919061351a565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611a6a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615611aa7576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611b54576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016110e2565b60015473ffffffffffffffffffffffffffffffffffffffff163314611c18576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b606060006040518060600160405280602181526020016138eb6021913960405163ffffffff808816602483015273ffffffffffffffffffffffffffffffffffffffff871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa6084820152600060a482015260c401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd3476afe000000000000000000000000000000000000000000000000000000001790529051611d93939291016136e6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015611e21573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611e99576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051600090611edf9084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001613715565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152919052979650505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611f6f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016110e2565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612039576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036120458282613400565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516110e29190612e7d565b6040518060600160405280602181526020016138eb6021913981565b60085460ff166120cd576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003612109576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612145576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612180918491700100000000000000000000000000000000900416613771565b11156121b8576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b838110156124475760008686838181106121fd576121fd613559565b905060200281019061220f9190613784565b612218906137b8565b90508361222481613657565b825180516020918201208185015160408087015190519499509194506000936122869386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff891660009081526006909352912054909150811461230f576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86166000908152600660205260408120556123346001886136b6565b84036123a35742600760189054906101000a900467ffffffffffffffff1684604001516123619190613836565b67ffffffffffffffff1611156123a3576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450505050808061243f9061367e565b9150506121e1565b506124757f0000000000000000000000000000000000000000000000000000000000000000846116fc6106a4565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612564573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612588919061351a565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612604576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612671573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061269591906132b4565b9050818111156126d1576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138883111561270d576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61274f73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084612a90565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e091906132b4565b600780549192506801000000000000000090910467ffffffffffffffff1690600861280a83613657565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612841929190613857565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612951576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26129b0565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931823388886040516129a79493929190613867565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052612a8b9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612af4565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612aee9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612a09565b50505050565b6000612b56826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612c009092919063ffffffff16565b805190915015612a8b5780806020019051810190612b749190613537565b612a8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610a52565b6060612c0f8484600085612c17565b949350505050565b606082471015612ca9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610a52565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612cd291906138d8565b60006040518083038185875af1925050503d8060008114612d0f576040519150601f19603f3d011682016040523d82523d6000602084013e612d14565b606091505b5091509150612d2587838387612d30565b979650505050505050565b60608315612dc6578251600003612dbf5773ffffffffffffffffffffffffffffffffffffffff85163b612dbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a52565b5081612c0f565b612c0f8383815115612ddb5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a529190612e7d565b60005b83811015612e2a578181015183820152602001612e12565b50506000910152565b60008151808452612e4b816020860160208601612e0f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612e906020830184612e33565b9392505050565b67ffffffffffffffff81168114612ead57600080fd5b50565b803573ffffffffffffffffffffffffffffffffffffffff81168114612ed457600080fd5b919050565b600080600060608486031215612eee57600080fd5b8335612ef981612e97565b925060208401359150612f0e60408501612eb0565b90509250925092565b803563ffffffff81168114612ed457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112612f6b57600080fd5b813567ffffffffffffffff80821115612f8657612f86612f2b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612fcc57612fcc612f2b565b81604052838152866020858801011115612fe557600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121561302057600080fd5b61302988612eb0565b965061303760208901612eb0565b955061304560408901612f17565b945061305360608901612eb0565b935061306160808901612f17565b925060a088013567ffffffffffffffff8082111561307e57600080fd5b61308a8b838c01612f5a565b935060c08a01359150808211156130a057600080fd5b506130ad8a828b01612f5a565b91505092959891949750929550565b6000602082840312156130ce57600080fd5b8135612e9081612e97565b60008083601f8401126130eb57600080fd5b50813567ffffffffffffffff81111561310357600080fd5b6020830191508360208260051b850101111561311e57600080fd5b9250929050565b60008060006040848603121561313a57600080fd5b833567ffffffffffffffff81111561315157600080fd5b61315d868287016130d9565b9094509250612f0e905060208501612eb0565b60006020828403121561318257600080fd5b612e9082612eb0565b6000806000606084860312156131a057600080fd5b6131a984612f17565b92506131b760208501612eb0565b9150612f0e60408501612f17565b6000602082840312156131d757600080fd5b813567ffffffffffffffff8111156131ee57600080fd5b612c0f84828501612f5a565b6000806020838503121561320d57600080fd5b823567ffffffffffffffff81111561322457600080fd5b613230858286016130d9565b90969095509350505050565b60008060006040848603121561325157600080fd5b833567ffffffffffffffff8082111561326957600080fd5b818601915086601f83011261327d57600080fd5b81358181111561328c57600080fd5b87602082850101111561329e57600080fd5b6020928301989097509590910135949350505050565b6000602082840312156132c657600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff82811682821603908082111561331d5761331d6132cd565b5092915050565b60008261335a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061337357607f821691505b6020821081036133ac577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f821115612a8b57600081815260208120601f850160051c810160208610156133d95750805b601f850160051c820191505b818110156133f8578281556001016133e5565b505050505050565b815167ffffffffffffffff81111561341a5761341a612f2b565b61342e81613428845461335f565b846133b2565b602080601f831160018114613481576000841561344b5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556133f8565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156134ce578886015182559484019460019091019084016134af565b508582101561350a57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121561352c57600080fd5b8151612e9081612e97565b60006020828403121561354957600080fd5b81518015158114612e9057600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126135bc57600080fd5b9190910192915050565b6000608082360312156135d857600080fd5b6040516080810167ffffffffffffffff82821081831117156135fc576135fc612f2b565b81604052843591508082111561361157600080fd5b5061361e36828601612f5a565b82525060208301356020820152604083013561363981612e97565b6040820152606083013561364c81612e97565b606082015292915050565b600067ffffffffffffffff808316818103613674576136746132cd565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036136af576136af6132cd565b5060010190565b818103818111156136c9576136c96132cd565b92915050565b80820281158282048414176136c9576136c96132cd565b600083516136f8818460208801612e0f565b83519083019061370c818360208801612e0f565b01949350505050565b60008651613727818460208b01612e0f565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b808201808211156136c9576136c96132cd565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126135bc57600080fd5b6000606082360312156137ca57600080fd5b6040516060810167ffffffffffffffff82821081831117156137ee576137ee612f2b565b81604052843591508082111561380357600080fd5b5061381036828601612f5a565b82525060208301356020820152604083013561382b81612e97565b604082015292915050565b67ffffffffffffffff81811683821601908082111561331d5761331d6132cd565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b600082516135bc818460208701612e0f56fef8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a2646970667358221220317f572504470f2d6a52f975c62fbecafc00b9dc2adc0055266c25247ace451064736f6c63430008140033", + "bytecode": "0x61010060405234801562000011575f80fd5b5060405162002b8c38038062002b8c83398101604081905262000034916200006f565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d4565b6001600160a01b03811681146200006c575f80fd5b50565b5f805f806080858703121562000083575f80fd5b8451620000908162000057565b6020860151909450620000a38162000057565b6040860151909350620000b68162000057565b6060860151909250620000c98162000057565b939692955090935050565b60805160a05160c05160e051612a06620001865f395f818161030301528181610696015281816107310152818161099e01528181610af401528181610fe50152818161107d0152818161109f015281816111df015281816118f00152818161196c0152611a4701525f81816103d1015261115b01525f818161045701528181610df90152611b4301525f81816104a4015281816105290152818161102a015281816111310152611b180152612a065ff3fe608060405234801561000f575f80fd5b50600436106101b4575f3560e01c8062d0295d146101b8578063107bf28c146101d357806319d8ac61146101e857806326782247146102135780632b35b3ac1461023357806332c2d153146102505780633c351e10146102655780633cbc795b1461027d57806340b5de6c146102a957806345605267146102d157806347ebf108146102eb57806349b7b802146102fe5780634e48770614610325578063542028d5146103385780635e9145c9146103405780635ec91958146103535780636b8616ce1461035b5780636e05d2cd1461037a5780636ff512cc146103835780638c3d73011461039657806399af03971461039e5780639e001877146103b1578063a3c573eb146103cc578063ada8f919146103f3578063b0afe15414610406578063c754c7ed14610412578063c89e42df1461042c578063cfa8ed471461043f578063d02103ca14610452578063d690be3114610479578063d7bc90ff14610481578063d8d1091b1461048c578063e46761c41461049f578063e7a7ed02146104c6578063eaeb077b146104e0578063f35dda47146104f3578063f851a4401461050d575b5f80fd5b6101c0610525565b6040519081526020015b60405180910390f35b6101db610608565b6040516101ca919061206e565b6007546101fb906001600160401b031681565b6040516001600160401b0390911681526020016101ca565b600154610226906001600160a01b031681565b6040516101ca9190612087565b6008546102409060ff1681565b60405190151581526020016101ca565b61026361025e3660046120cd565b610694565b005b6008546102269061010090046001600160a01b031681565b60085461029490600160a81b900463ffffffff1681565b60405163ffffffff90911681526020016101ca565b6102b86001600160f81b031981565b6040516001600160f81b031990911681526020016101ca565b6007546101fb90600160801b90046001600160401b031681565b6102636102f93660046121b7565b61072f565b6102267f000000000000000000000000000000000000000000000000000000000000000081565b610263610333366004612266565b610a95565b6101db610c09565b61026361034e3660046122c8565b610c16565b610263611286565b6101c0610369366004612266565b60066020525f908152604090205481565b6101c060055481565b61026361039136600461230e565b611311565b61026361138c565b6101db6103ac366004612327565b611418565b61022673a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6102267f000000000000000000000000000000000000000000000000000000000000000081565b61026361040136600461230e565b61159f565b6101c06405ca1ab1e081565b6007546101fb90600160c01b90046001600160401b031681565b61026361043a36600461235e565b61161a565b600254610226906001600160a01b031681565b6102267f000000000000000000000000000000000000000000000000000000000000000081565b6101db611686565b6101c0635ca1ab1e81565b61026361049a36600461238f565b6116a2565b6102267f000000000000000000000000000000000000000000000000000000000000000081565b6007546101fb90600160401b90046001600160401b031681565b6102636104ee3660046123cd565b611a21565b6104fb601b81565b60405160ff90911681526020016101ca565b5f54610226906201000090046001600160a01b031681565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016105739190612087565b602060405180830381865afa15801561058e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105b2919061243d565b6007549091505f906105dd906001600160401b03600160801b8204811691600160401b900416612468565b6001600160401b03169050805f036105f7575f9250505090565b610601818361248f565b9250505090565b60048054610615906124ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610641906124ae565b801561068c5780601f106106635761010080835404028352916020019161068c565b820191905f5260205f20905b81548152906001019060200180831161066f57829003601f168201915b505050505081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146106dd57604051631736745960e31b815260040160405180910390fd5b806001600160a01b0316836001600160401b03167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59668460405161072291815260200190565b60405180910390a3505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461077857604051631736745960e31b815260040160405180910390fd5b5f54610100900460ff161580801561079657505f54600160ff909116105b806107b657506107a530611d13565b1580156107b657505f5460ff166001145b61081e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561083f575f805461ff0019166101001790555b5f805462010000600160b01b031916620100006001600160a01b038b81169190910291909117909155600280546001600160a01b031916918916919091179055600361088b8482612533565b5060046108988382612533565b50600780546001600160c01b0316610d2f60c71b1790556001600160a01b0385166108e25763ffffffff8416156108e257604051630d43a60960e11b815260040160405180910390fd5b60088054610100600160c81b0319166101006001600160a01b0388160263ffffffff60a81b191617600160a81b63ffffffff8716021790555f610926878787611418565b90505f818051906020012090505f4290505f805f1b835f801b848e6040516020016109559594939291906125ee565b60408051808303601f19018152908290528051602090910120600780546001600160401b0319166001600160401b0386161790556005819055639a908e7360e01b825291505f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639a908e73906109de90600190869060040161262d565b6020604051808303815f875af11580156109fa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a1e9190612646565b6040519091506001600160401b038216905f80516020612970833981519152905f90a250505050508015610a8b575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b5f546201000090046001600160a01b03163314610ac557604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610af25760405163f5e37f2f60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b729190612661565b610bac576007546001600160401b03600160c01b909104811690821610610bac5760405163f5e37f2f60e01b815260040160405180910390fd5b600780546001600160c01b0316600160c01b6001600160401b038416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b60038054610615906124ae565b6002546001600160a01b03163314610c41576040516311e7be1560e01b815260040160405180910390fd5b815f819003610c635760405163cb591a5f60e01b815260040160405180910390fd5b6103e8811115610c8657604051635acfba9d60e11b815260040160405180910390fd5b6007546005546001600160401b0380831692600160801b90041690815f5b85811015610f54575f898983818110610cbf57610cbf612680565b9050602002810190610cd19190612694565b610cda906126b2565b805180516020909101206060820151919250906001600160401b031615610dcf5785610d058161273f565b9650505f8183602001518460600151604051602001610d269392919061276c565b60408051601f1981840301815291815281516020928301206001600160401b038a165f90815260069093529120549091508114610d765760405163671ebaaf60e11b815260040160405180910390fd5b82606001516001600160401b031683604001516001600160401b03161015610db157604051633fbd5c3960e11b815260040160405180910390fd5b506001600160401b0386165f90815260066020526040812055610eb1565b602082015115801590610e6d575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303815f875af1158015610e47573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e6b919061243d565b155b15610e8b576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c01015610eb1576040516328a69b1f60e21b815260040160405180910390fd5b866001600160401b031682604001516001600160401b03161080610ee157504282604001516001600160401b0316115b15610eff576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518c604051602001610f209594939291906125ee565b6040516020818303038152906040528051906020012094508160400151965050508080610f4c9061278f565b915050610ca4565b506007546001600160401b03600160401b90910481169084161115610f8c5760405163c630a00d60e01b815260040160405180910390fd5b600780546001600160401b0319166001600160401b03868116919091179091556005839055859082811690851614611077575f610fc98386612468565b9050610fde6001600160401b038216836127a7565b91506110517f0000000000000000000000000000000000000000000000000000000000000000826001600160401b0316611016610525565b61102091906127c0565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190611d22565b5060078054600160801b600160c01b031916600160801b6001600160401b038716021790555b611159337f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061111d919061243d565b61112791906127c0565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190611d8a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156111b1575f80fd5b505af11580156111c3573d5f803e3d5ffd5b5050604051639a908e7360e01b81525f92506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150639a908e7390611217908a90889060040161262d565b6020604051808303815f875af1158015611233573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112579190612646565b6040519091506001600160401b038216905f80516020612970833981519152905f90a250505050505050505050565b5f546201000090046001600160a01b031633146112b657604051634755657960e01b815260040160405180910390fd5b60085460ff16156112da5760405163f6ba91a160e01b815260040160405180910390fd5b6008805460ff191660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f546201000090046001600160a01b0316331461134157604051634755657960e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383161790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610bfe908390612087565b6001546001600160a01b031633146113b75760405163d1ec4b2360e01b815260040160405180910390fd5b6001545f8054620100006001600160a01b0390931692830262010000600160b01b03199091161790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9161140e91612087565b60405180910390a1565b60605f6040518060600160405280602181526020016129b06021913960405163ffffffff80881660248301526001600160a01b03871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa60848201525f60a482015260c40160408051601f19818403018152918152602080830180516001600160e01b03166369a3b57f60e11b17905290516114b6939291016127d7565b60408051601f1981840301815282825280516020808301919091205f80865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015611523573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166115575760405163668b0cb360e11b815260040160405180910390fd5b6040515f906115849084906405ca1ab1e090635ca1ab1e90601b906001600160f81b031990602001612805565b60408051808303601f19018152919052979650505050505050565b5f546201000090046001600160a01b031633146115cf57604051634755657960e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610bfe908390612087565b5f546201000090046001600160a01b0316331461164a57604051634755657960e01b815260040160405180910390fd5b60036116568282612533565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610bfe919061206e565b6040518060600160405280602181526020016129b06021913981565b60085460ff166116c5576040516324eff8c360e01b815260040160405180910390fd5b805f8190036116e75760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561170a57604051635acfba9d60e11b815260040160405180910390fd5b6007546001600160401b03600160401b8204811691611732918491600160801b900416612848565b11156117515760405163c630a00d60e01b815260040160405180910390fd5b600754600554600160801b9091046001600160401b0316905f5b838110156118ea575f86868381811061178657611786612680565b9050602002810190611798919061285b565b6117a19061286f565b9050836117ad8161273f565b825180516020918201208185015160408087015190519499509194505f936117d8938693910161276c565b60408051601f1981840301815291815281516020928301206001600160401b0389165f908152600690935291205490915081146118285760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b0386165f9081526006602052604081205561184b6001886127a7565b840361189f5742600760189054906101000a90046001600160401b0316846040015161187791906128e9565b6001600160401b0316111561189f5760405163c44a082160e01b815260040160405180910390fd5b8482846020015142336040516020016118bc9594939291906125ee565b60405160208183030381529060405280519060200120945050505080806118e29061278f565b91505061176b565b506119187f000000000000000000000000000000000000000000000000000000000000000084611016610525565b6005819055600780546001600160401b03848116600160801b026001600160401b03600160801b03600160c01b0319909216429190911617179055604051639a908e7360e01b81525f906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906119a3908790869060040161262d565b6020604051808303815f875af11580156119bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119e39190612646565b6040519091506001600160401b038216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a2505050505050565b60085460ff16611a44576040516324eff8c360e01b815260040160405180910390fd5b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015611aa1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ac5919061243d565b905081811115611ae857604051632354600f60e01b815260040160405180910390fd5b611388831115611b0b576040516328a69b1f60e21b815260040160405180910390fd5b611b406001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084611d8a565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b9d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc1919061243d565b60078054919250600160401b9091046001600160401b0316906008611be58361273f565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508484604051611c1a929190612909565b604051908190038120611c33918390429060200161276c565b60408051808303601f190181529181528151602092830120600754600160401b90046001600160401b03165f9081526006909352912055323303611cc2576007546040805183815233602082015260609181018290525f91810191909152600160401b9091046001600160401b0316905f805160206129908339815191529060800160405180910390a2611d0c565b600760089054906101000a90046001600160401b03166001600160401b03165f8051602061299083398151915282338888604051611d039493929190612918565b60405180910390a25b5050505050565b6001600160a01b03163b151590565b6040516001600160a01b038316602482015260448101829052611d8590849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611dc8565b505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611dc29085906323b872dd60e01b90608401611d4e565b50505050565b5f611e1c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611e999092919063ffffffff16565b805190915015611d855780806020019051810190611e3a9190612661565b611d855760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610815565b6060611ea784845f85611eaf565b949350505050565b606082471015611f105760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610815565b5f80866001600160a01b03168587604051611f2b919061295e565b5f6040518083038185875af1925050503d805f8114611f65576040519150601f19603f3d011682016040523d82523d5f602084013e611f6a565b606091505b5091509150611f7b87838387611f86565b979650505050505050565b60608315611ff25782515f03611feb57611f9f85611d13565b611feb5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610815565b5081611ea7565b611ea783838151156120075781518083602001fd5b8060405162461bcd60e51b8152600401610815919061206e565b5f5b8381101561203b578181015183820152602001612023565b50505f910152565b5f815180845261205a816020860160208601612021565b601f01601f19169290920160200192915050565b602081525f6120806020830184612043565b9392505050565b6001600160a01b0391909116815260200190565b6001600160401b03811681146120af575f80fd5b50565b80356001600160a01b03811681146120c8575f80fd5b919050565b5f805f606084860312156120df575f80fd5b83356120ea8161209b565b9250602084013591506120ff604085016120b2565b90509250925092565b803563ffffffff811681146120c8575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261213e575f80fd5b81356001600160401b03808211156121585761215861211b565b604051601f8301601f19908116603f011681019082821181831017156121805761218061211b565b81604052838152866020858801011115612198575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a0312156121cd575f80fd5b6121d6886120b2565b96506121e4602089016120b2565b95506121f260408901612108565b9450612200606089016120b2565b935061220e60808901612108565b925060a08801356001600160401b0380821115612229575f80fd5b6122358b838c0161212f565b935060c08a013591508082111561224a575f80fd5b506122578a828b0161212f565b91505092959891949750929550565b5f60208284031215612276575f80fd5b81356120808161209b565b5f8083601f840112612291575f80fd5b5081356001600160401b038111156122a7575f80fd5b6020830191508360208260051b85010111156122c1575f80fd5b9250929050565b5f805f604084860312156122da575f80fd5b83356001600160401b038111156122ef575f80fd5b6122fb86828701612281565b90945092506120ff9050602085016120b2565b5f6020828403121561231e575f80fd5b612080826120b2565b5f805f60608486031215612339575f80fd5b61234284612108565b9250612350602085016120b2565b91506120ff60408501612108565b5f6020828403121561236e575f80fd5b81356001600160401b03811115612383575f80fd5b611ea78482850161212f565b5f80602083850312156123a0575f80fd5b82356001600160401b038111156123b5575f80fd5b6123c185828601612281565b90969095509350505050565b5f805f604084860312156123df575f80fd5b83356001600160401b03808211156123f5575f80fd5b818601915086601f830112612408575f80fd5b813581811115612416575f80fd5b876020828501011115612427575f80fd5b6020928301989097509590910135949350505050565b5f6020828403121561244d575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561248857612488612454565b5092915050565b5f826124a957634e487b7160e01b5f52601260045260245ffd5b500490565b600181811c908216806124c257607f821691505b6020821081036124e057634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115611d85575f81815260208120601f850160051c8101602086101561250c5750805b601f850160051c820191505b8181101561252b57828155600101612518565b505050505050565b81516001600160401b0381111561254c5761254c61211b565b6125608161255a84546124ae565b846124e6565b602080601f831160018114612593575f841561257c5750858301515b5f19600386901b1c1916600185901b17855561252b565b5f85815260208120601f198616915b828110156125c1578886015182559484019460019091019084016125a2565b50858210156125de57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b6001600160401b03929092168252602082015260400190565b5f60208284031215612656575f80fd5b81516120808161209b565b5f60208284031215612671575f80fd5b81518015158114612080575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e198336030181126126a8575f80fd5b9190910192915050565b5f608082360312156126c2575f80fd5b604051608081016001600160401b0380821183831017156126e5576126e561211b565b8160405284359150808211156126f9575f80fd5b506127063682860161212f565b8252506020830135602082015260408301356127218161209b565b604082015260608301356127348161209b565b606082015292915050565b5f6001600160401b038281166002600160401b0319810161276257612762612454565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b5f600182016127a0576127a0612454565b5060010190565b818103818111156127ba576127ba612454565b92915050565b80820281158282048414176127ba576127ba612454565b5f83516127e8818460208801612021565b8351908301906127fc818360208801612021565b01949350505050565b5f8651612816818460208b01612021565b9190910194855250602084019290925260f81b6001600160f81b03199081166040840152166041820152604201919050565b808201808211156127ba576127ba612454565b5f8235605e198336030181126126a8575f80fd5b5f6060823603121561287f575f80fd5b604051606081016001600160401b0380821183831017156128a2576128a261211b565b8160405284359150808211156128b6575f80fd5b506128c33682860161212f565b8252506020830135602082015260408301356128de8161209b565b604082015292915050565b6001600160401b0381811683821601908082111561248857612488612454565b818382375f9101908152919050565b8481526001600160a01b03841660208201526060604082018190528101829052818360808301375f818301608090810191909152601f909201601f191601019392505050565b5f82516126a881846020870161202156fe303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fcef94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931f8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a2646970667358221220f61c4458ce2cc81c093654c64779ca227a96bac01a14a4cc5dc7cfc4f0ae66fd64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106101b4575f3560e01c8062d0295d146101b8578063107bf28c146101d357806319d8ac61146101e857806326782247146102135780632b35b3ac1461023357806332c2d153146102505780633c351e10146102655780633cbc795b1461027d57806340b5de6c146102a957806345605267146102d157806347ebf108146102eb57806349b7b802146102fe5780634e48770614610325578063542028d5146103385780635e9145c9146103405780635ec91958146103535780636b8616ce1461035b5780636e05d2cd1461037a5780636ff512cc146103835780638c3d73011461039657806399af03971461039e5780639e001877146103b1578063a3c573eb146103cc578063ada8f919146103f3578063b0afe15414610406578063c754c7ed14610412578063c89e42df1461042c578063cfa8ed471461043f578063d02103ca14610452578063d690be3114610479578063d7bc90ff14610481578063d8d1091b1461048c578063e46761c41461049f578063e7a7ed02146104c6578063eaeb077b146104e0578063f35dda47146104f3578063f851a4401461050d575b5f80fd5b6101c0610525565b6040519081526020015b60405180910390f35b6101db610608565b6040516101ca919061206e565b6007546101fb906001600160401b031681565b6040516001600160401b0390911681526020016101ca565b600154610226906001600160a01b031681565b6040516101ca9190612087565b6008546102409060ff1681565b60405190151581526020016101ca565b61026361025e3660046120cd565b610694565b005b6008546102269061010090046001600160a01b031681565b60085461029490600160a81b900463ffffffff1681565b60405163ffffffff90911681526020016101ca565b6102b86001600160f81b031981565b6040516001600160f81b031990911681526020016101ca565b6007546101fb90600160801b90046001600160401b031681565b6102636102f93660046121b7565b61072f565b6102267f000000000000000000000000000000000000000000000000000000000000000081565b610263610333366004612266565b610a95565b6101db610c09565b61026361034e3660046122c8565b610c16565b610263611286565b6101c0610369366004612266565b60066020525f908152604090205481565b6101c060055481565b61026361039136600461230e565b611311565b61026361138c565b6101db6103ac366004612327565b611418565b61022673a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6102267f000000000000000000000000000000000000000000000000000000000000000081565b61026361040136600461230e565b61159f565b6101c06405ca1ab1e081565b6007546101fb90600160c01b90046001600160401b031681565b61026361043a36600461235e565b61161a565b600254610226906001600160a01b031681565b6102267f000000000000000000000000000000000000000000000000000000000000000081565b6101db611686565b6101c0635ca1ab1e81565b61026361049a36600461238f565b6116a2565b6102267f000000000000000000000000000000000000000000000000000000000000000081565b6007546101fb90600160401b90046001600160401b031681565b6102636104ee3660046123cd565b611a21565b6104fb601b81565b60405160ff90911681526020016101ca565b5f54610226906201000090046001600160a01b031681565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016105739190612087565b602060405180830381865afa15801561058e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105b2919061243d565b6007549091505f906105dd906001600160401b03600160801b8204811691600160401b900416612468565b6001600160401b03169050805f036105f7575f9250505090565b610601818361248f565b9250505090565b60048054610615906124ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610641906124ae565b801561068c5780601f106106635761010080835404028352916020019161068c565b820191905f5260205f20905b81548152906001019060200180831161066f57829003601f168201915b505050505081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146106dd57604051631736745960e31b815260040160405180910390fd5b806001600160a01b0316836001600160401b03167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59668460405161072291815260200190565b60405180910390a3505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461077857604051631736745960e31b815260040160405180910390fd5b5f54610100900460ff161580801561079657505f54600160ff909116105b806107b657506107a530611d13565b1580156107b657505f5460ff166001145b61081e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561083f575f805461ff0019166101001790555b5f805462010000600160b01b031916620100006001600160a01b038b81169190910291909117909155600280546001600160a01b031916918916919091179055600361088b8482612533565b5060046108988382612533565b50600780546001600160c01b0316610d2f60c71b1790556001600160a01b0385166108e25763ffffffff8416156108e257604051630d43a60960e11b815260040160405180910390fd5b60088054610100600160c81b0319166101006001600160a01b0388160263ffffffff60a81b191617600160a81b63ffffffff8716021790555f610926878787611418565b90505f818051906020012090505f4290505f805f1b835f801b848e6040516020016109559594939291906125ee565b60408051808303601f19018152908290528051602090910120600780546001600160401b0319166001600160401b0386161790556005819055639a908e7360e01b825291505f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639a908e73906109de90600190869060040161262d565b6020604051808303815f875af11580156109fa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a1e9190612646565b6040519091506001600160401b038216905f80516020612970833981519152905f90a250505050508015610a8b575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b5f546201000090046001600160a01b03163314610ac557604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610af25760405163f5e37f2f60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b729190612661565b610bac576007546001600160401b03600160c01b909104811690821610610bac5760405163f5e37f2f60e01b815260040160405180910390fd5b600780546001600160c01b0316600160c01b6001600160401b038416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b60038054610615906124ae565b6002546001600160a01b03163314610c41576040516311e7be1560e01b815260040160405180910390fd5b815f819003610c635760405163cb591a5f60e01b815260040160405180910390fd5b6103e8811115610c8657604051635acfba9d60e11b815260040160405180910390fd5b6007546005546001600160401b0380831692600160801b90041690815f5b85811015610f54575f898983818110610cbf57610cbf612680565b9050602002810190610cd19190612694565b610cda906126b2565b805180516020909101206060820151919250906001600160401b031615610dcf5785610d058161273f565b9650505f8183602001518460600151604051602001610d269392919061276c565b60408051601f1981840301815291815281516020928301206001600160401b038a165f90815260069093529120549091508114610d765760405163671ebaaf60e11b815260040160405180910390fd5b82606001516001600160401b031683604001516001600160401b03161015610db157604051633fbd5c3960e11b815260040160405180910390fd5b506001600160401b0386165f90815260066020526040812055610eb1565b602082015115801590610e6d575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303815f875af1158015610e47573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e6b919061243d565b155b15610e8b576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c01015610eb1576040516328a69b1f60e21b815260040160405180910390fd5b866001600160401b031682604001516001600160401b03161080610ee157504282604001516001600160401b0316115b15610eff576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518c604051602001610f209594939291906125ee565b6040516020818303038152906040528051906020012094508160400151965050508080610f4c9061278f565b915050610ca4565b506007546001600160401b03600160401b90910481169084161115610f8c5760405163c630a00d60e01b815260040160405180910390fd5b600780546001600160401b0319166001600160401b03868116919091179091556005839055859082811690851614611077575f610fc98386612468565b9050610fde6001600160401b038216836127a7565b91506110517f0000000000000000000000000000000000000000000000000000000000000000826001600160401b0316611016610525565b61102091906127c0565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190611d22565b5060078054600160801b600160c01b031916600160801b6001600160401b038716021790555b611159337f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061111d919061243d565b61112791906127c0565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190611d8a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156111b1575f80fd5b505af11580156111c3573d5f803e3d5ffd5b5050604051639a908e7360e01b81525f92506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150639a908e7390611217908a90889060040161262d565b6020604051808303815f875af1158015611233573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112579190612646565b6040519091506001600160401b038216905f80516020612970833981519152905f90a250505050505050505050565b5f546201000090046001600160a01b031633146112b657604051634755657960e01b815260040160405180910390fd5b60085460ff16156112da5760405163f6ba91a160e01b815260040160405180910390fd5b6008805460ff191660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f546201000090046001600160a01b0316331461134157604051634755657960e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383161790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610bfe908390612087565b6001546001600160a01b031633146113b75760405163d1ec4b2360e01b815260040160405180910390fd5b6001545f8054620100006001600160a01b0390931692830262010000600160b01b03199091161790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9161140e91612087565b60405180910390a1565b60605f6040518060600160405280602181526020016129b06021913960405163ffffffff80881660248301526001600160a01b03871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa60848201525f60a482015260c40160408051601f19818403018152918152602080830180516001600160e01b03166369a3b57f60e11b17905290516114b6939291016127d7565b60408051601f1981840301815282825280516020808301919091205f80865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015611523573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166115575760405163668b0cb360e11b815260040160405180910390fd5b6040515f906115849084906405ca1ab1e090635ca1ab1e90601b906001600160f81b031990602001612805565b60408051808303601f19018152919052979650505050505050565b5f546201000090046001600160a01b031633146115cf57604051634755657960e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610bfe908390612087565b5f546201000090046001600160a01b0316331461164a57604051634755657960e01b815260040160405180910390fd5b60036116568282612533565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610bfe919061206e565b6040518060600160405280602181526020016129b06021913981565b60085460ff166116c5576040516324eff8c360e01b815260040160405180910390fd5b805f8190036116e75760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561170a57604051635acfba9d60e11b815260040160405180910390fd5b6007546001600160401b03600160401b8204811691611732918491600160801b900416612848565b11156117515760405163c630a00d60e01b815260040160405180910390fd5b600754600554600160801b9091046001600160401b0316905f5b838110156118ea575f86868381811061178657611786612680565b9050602002810190611798919061285b565b6117a19061286f565b9050836117ad8161273f565b825180516020918201208185015160408087015190519499509194505f936117d8938693910161276c565b60408051601f1981840301815291815281516020928301206001600160401b0389165f908152600690935291205490915081146118285760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b0386165f9081526006602052604081205561184b6001886127a7565b840361189f5742600760189054906101000a90046001600160401b0316846040015161187791906128e9565b6001600160401b0316111561189f5760405163c44a082160e01b815260040160405180910390fd5b8482846020015142336040516020016118bc9594939291906125ee565b60405160208183030381529060405280519060200120945050505080806118e29061278f565b91505061176b565b506119187f000000000000000000000000000000000000000000000000000000000000000084611016610525565b6005819055600780546001600160401b03848116600160801b026001600160401b03600160801b03600160c01b0319909216429190911617179055604051639a908e7360e01b81525f906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906119a3908790869060040161262d565b6020604051808303815f875af11580156119bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119e39190612646565b6040519091506001600160401b038216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a2505050505050565b60085460ff16611a44576040516324eff8c360e01b815260040160405180910390fd5b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015611aa1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ac5919061243d565b905081811115611ae857604051632354600f60e01b815260040160405180910390fd5b611388831115611b0b576040516328a69b1f60e21b815260040160405180910390fd5b611b406001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084611d8a565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b9d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc1919061243d565b60078054919250600160401b9091046001600160401b0316906008611be58361273f565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508484604051611c1a929190612909565b604051908190038120611c33918390429060200161276c565b60408051808303601f190181529181528151602092830120600754600160401b90046001600160401b03165f9081526006909352912055323303611cc2576007546040805183815233602082015260609181018290525f91810191909152600160401b9091046001600160401b0316905f805160206129908339815191529060800160405180910390a2611d0c565b600760089054906101000a90046001600160401b03166001600160401b03165f8051602061299083398151915282338888604051611d039493929190612918565b60405180910390a25b5050505050565b6001600160a01b03163b151590565b6040516001600160a01b038316602482015260448101829052611d8590849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611dc8565b505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611dc29085906323b872dd60e01b90608401611d4e565b50505050565b5f611e1c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611e999092919063ffffffff16565b805190915015611d855780806020019051810190611e3a9190612661565b611d855760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610815565b6060611ea784845f85611eaf565b949350505050565b606082471015611f105760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610815565b5f80866001600160a01b03168587604051611f2b919061295e565b5f6040518083038185875af1925050503d805f8114611f65576040519150601f19603f3d011682016040523d82523d5f602084013e611f6a565b606091505b5091509150611f7b87838387611f86565b979650505050505050565b60608315611ff25782515f03611feb57611f9f85611d13565b611feb5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610815565b5081611ea7565b611ea783838151156120075781518083602001fd5b8060405162461bcd60e51b8152600401610815919061206e565b5f5b8381101561203b578181015183820152602001612023565b50505f910152565b5f815180845261205a816020860160208601612021565b601f01601f19169290920160200192915050565b602081525f6120806020830184612043565b9392505050565b6001600160a01b0391909116815260200190565b6001600160401b03811681146120af575f80fd5b50565b80356001600160a01b03811681146120c8575f80fd5b919050565b5f805f606084860312156120df575f80fd5b83356120ea8161209b565b9250602084013591506120ff604085016120b2565b90509250925092565b803563ffffffff811681146120c8575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261213e575f80fd5b81356001600160401b03808211156121585761215861211b565b604051601f8301601f19908116603f011681019082821181831017156121805761218061211b565b81604052838152866020858801011115612198575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a0312156121cd575f80fd5b6121d6886120b2565b96506121e4602089016120b2565b95506121f260408901612108565b9450612200606089016120b2565b935061220e60808901612108565b925060a08801356001600160401b0380821115612229575f80fd5b6122358b838c0161212f565b935060c08a013591508082111561224a575f80fd5b506122578a828b0161212f565b91505092959891949750929550565b5f60208284031215612276575f80fd5b81356120808161209b565b5f8083601f840112612291575f80fd5b5081356001600160401b038111156122a7575f80fd5b6020830191508360208260051b85010111156122c1575f80fd5b9250929050565b5f805f604084860312156122da575f80fd5b83356001600160401b038111156122ef575f80fd5b6122fb86828701612281565b90945092506120ff9050602085016120b2565b5f6020828403121561231e575f80fd5b612080826120b2565b5f805f60608486031215612339575f80fd5b61234284612108565b9250612350602085016120b2565b91506120ff60408501612108565b5f6020828403121561236e575f80fd5b81356001600160401b03811115612383575f80fd5b611ea78482850161212f565b5f80602083850312156123a0575f80fd5b82356001600160401b038111156123b5575f80fd5b6123c185828601612281565b90969095509350505050565b5f805f604084860312156123df575f80fd5b83356001600160401b03808211156123f5575f80fd5b818601915086601f830112612408575f80fd5b813581811115612416575f80fd5b876020828501011115612427575f80fd5b6020928301989097509590910135949350505050565b5f6020828403121561244d575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561248857612488612454565b5092915050565b5f826124a957634e487b7160e01b5f52601260045260245ffd5b500490565b600181811c908216806124c257607f821691505b6020821081036124e057634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115611d85575f81815260208120601f850160051c8101602086101561250c5750805b601f850160051c820191505b8181101561252b57828155600101612518565b505050505050565b81516001600160401b0381111561254c5761254c61211b565b6125608161255a84546124ae565b846124e6565b602080601f831160018114612593575f841561257c5750858301515b5f19600386901b1c1916600185901b17855561252b565b5f85815260208120601f198616915b828110156125c1578886015182559484019460019091019084016125a2565b50858210156125de57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b6001600160401b03929092168252602082015260400190565b5f60208284031215612656575f80fd5b81516120808161209b565b5f60208284031215612671575f80fd5b81518015158114612080575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e198336030181126126a8575f80fd5b9190910192915050565b5f608082360312156126c2575f80fd5b604051608081016001600160401b0380821183831017156126e5576126e561211b565b8160405284359150808211156126f9575f80fd5b506127063682860161212f565b8252506020830135602082015260408301356127218161209b565b604082015260608301356127348161209b565b606082015292915050565b5f6001600160401b038281166002600160401b0319810161276257612762612454565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b5f600182016127a0576127a0612454565b5060010190565b818103818111156127ba576127ba612454565b92915050565b80820281158282048414176127ba576127ba612454565b5f83516127e8818460208801612021565b8351908301906127fc818360208801612021565b01949350505050565b5f8651612816818460208b01612021565b9190910194855250602084019290925260f81b6001600160f81b03199081166040840152166041820152604201919050565b808201808211156127ba576127ba612454565b5f8235605e198336030181126126a8575f80fd5b5f6060823603121561287f575f80fd5b604051606081016001600160401b0380821183831017156128a2576128a261211b565b8160405284359150808211156128b6575f80fd5b506128c33682860161212f565b8252506020830135602082015260408301356128de8161209b565b604082015292915050565b6001600160401b0381811683821601908082111561248857612488612454565b818382375f9101908152919050565b8481526001600160a01b03841660208201526060604082018190528101829052818360808301375f818301608090810191909152601f909201601f191601019392505050565b5f82516126a881846020870161202156fe303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fcef94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931f8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a2646970667358221220f61c4458ce2cc81c093654c64779ca227a96bac01a14a4cc5dc7cfc4f0ae66fd64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMV2Existent.json b/compiled-contracts/paris/PolygonZkEVMV2Existent.json index f06764216..13b797a25 100644 --- a/compiled-contracts/paris/PolygonZkEVMV2Existent.json +++ b/compiled-contracts/paris/PolygonZkEVMV2Existent.json @@ -1039,8 +1039,8 @@ "type": "function" } ], - "bytecode": "0x6101006040523480156200001257600080fd5b5060405162003e8e38038062003e8e833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e051613cf66200019860003960008181610465015281816108820152818161095101528181610dd501528181610fa1015281816116f8015281816117c1015281816117e30152818161197a01528181612012015281816127600152818161282e015261291b01526000818161053401526118bb0152600081816105f00152818161141b0152612a6601526000818161063d0152818161071a0152818161174b015281816118910152612a3a0152613cf66000f3fe608060405234801561001057600080fd5b50600436106102915760003560e01c80638c3d730111610160578063cfa8ed47116100d8578063e46761c41161008c578063eaeb077b11610071578063eaeb077b1461067f578063f35dda4714610692578063f851a440146106ac57600080fd5b8063e46761c414610638578063e7a7ed021461065f57600080fd5b8063d690be31116100bd578063d690be3114610612578063d7bc90ff1461061a578063d8d1091b1461062557600080fd5b8063cfa8ed47146105cb578063d02103ca146105eb57600080fd5b8063ada8f9191161012f578063bb59070811610114578063bb59070814610575578063c754c7ed14610588578063c89e42df146105b857600080fd5b8063ada8f91914610556578063b0afe1541461056957600080fd5b80638c3d7301146104f957806399af0397146105015780639e00187714610514578063a3c573eb1461052f57600080fd5b8063456052671161020e5780635e9145c9116101c25780636b8616ce116101a75780636b8616ce146104bd5780636e05d2cd146104dd5780636ff512cc146104e657600080fd5b80635e9145c9146104a25780635ec91958146104b557600080fd5b806349b7b802116101f357806349b7b802146104605780634e48770614610487578063542028d51461049a57600080fd5b8063456052671461042557806347ebf1081461044d57600080fd5b80632b35b3ac116102655780633c351e101161024a5780633c351e101461036a5780633cbc795b1461038f57806340b5de6c146103cd57600080fd5b80632b35b3ac1461033857806332c2d1531461035557600080fd5b8062d0295d14610296578063107bf28c146102b157806319d8ac61146102c657806326782247146102f3575b600080fd5b61029e6106d2565b6040519081526020015b60405180910390f35b6102b96107f2565b6040516102a89190613190565b6007546102da9067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102a8565b6001546103139073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102a8565b6008546103459060ff1681565b60405190151581526020016102a8565b6103686103633660046131ec565b610880565b005b60085461031390610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6008546103b8907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102a8565b6103f47fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102a8565b6007546102da90700100000000000000000000000000000000900467ffffffffffffffff1681565b61036861045b366004613318565b61094f565b6103137f000000000000000000000000000000000000000000000000000000000000000081565b6103686104953660046133cf565b610f01565b6102b961111b565b6103686104b0366004613438565b611128565b610368611a41565b61029e6104cb3660046133cf565b60066020526000908152604090205481565b61029e60055481565b6103686104f4366004613483565b611b2b565b610368611bf5565b6102b961050f36600461349e565b611cc8565b61031373a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103137f000000000000000000000000000000000000000000000000000000000000000081565b610368610564366004613483565b611f46565b61029e6405ca1ab1e081565b6103686105833660046134d8565b612010565b6007546102da907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6103686105c636600461357a565b6122f5565b6002546103139073ffffffffffffffffffffffffffffffffffffffff1681565b6103137f000000000000000000000000000000000000000000000000000000000000000081565b6102b9612388565b61029e635ca1ab1e81565b6103686106333660046135af565b6123a4565b6103137f000000000000000000000000000000000000000000000000000000000000000081565b6007546102da9068010000000000000000900467ffffffffffffffff1681565b61036861068d3660046135f1565b6128db565b61069a601b81565b60405160ff90911681526020016102a8565b6000546103139062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610761573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107859190613669565b6007549091506000906107c49067ffffffffffffffff7001000000000000000000000000000000008204811691680100000000000000009004166136b1565b67ffffffffffffffff169050806000036107e15760009250505090565b6107eb81836136d9565b9250505090565b600480546107ff90613714565b80601f016020809104026020016040519081016040528092919081815260200182805461082b90613714565b80156108785780601f1061084d57610100808354040283529160200191610878565b820191906000526020600020905b81548152906001019060200180831161085b57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146108ef576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59668460405161094291815260200190565b60405180910390a3505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109be576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156109de5750600054600160ff909116105b806109f85750303b1580156109f8575060005460ff166001145b610a89576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610ae757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8b81169190910291909117909155600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000169189169190911790556003610b6f84826137b5565b506004610b7c83826137b5565b506007805477ffffffffffffffffffffffffffffffffffffffffffffffff167a06978000000000000000000000000000000000000000000000000017905573ffffffffffffffffffffffffffffffffffffffff8516610c135763ffffffff841615610c13576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8816027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff8716021790556000610ca6878787611cc8565b805160208083019190912060408051600093810184905290810182905260608082018490524260c081901b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015293945090929190609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291506000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015610e33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5791906138cf565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050508015610ef757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610f58576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610f9f576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102e91906138ec565b6110975760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611097576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546107ff90613714565b60025473ffffffffffffffffffffffffffffffffffffffff163314611179576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160008190036111b5576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156111f1576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b8581101561162d57600089898381811061123a5761123a61390e565b905060200281019061124c919061393d565b6112559061397b565b8051805160209091012060608201519192509067ffffffffffffffff16156113d8578561128181613a0c565b965050600081836020015184606001516040516020016112d993929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114611362576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff1610156113b8576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055611515565b60208201511580159061149f575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015611479573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149d9190613669565b155b156114d6576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611515576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff161080611548575042826040015167ffffffffffffffff16115b1561157f576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061162590613a33565b91505061121e565b5060075467ffffffffffffffff6801000000000000000090910481169084161115611684576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146117bb5760006116db83866136b1565b90506116f167ffffffffffffffff821683613a6b565b91506117727f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661172a6106d2565b6117349190613a84565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190612cca565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6118b9337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa15801561184c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118709190613669565b61187a9190613a84565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190612da3565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561192157600080fd5b505af1158015611935573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af11580156119d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119fd91906138cf565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611a98576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615611ad5576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611b82576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001611110565b60015473ffffffffffffffffffffffffffffffffffffffff163314611c46576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60606000604051806060016040528060218152602001613ca06021913960405163ffffffff808816602483015273ffffffffffffffffffffffffffffffffffffffff871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa6084820152600060a482015260c401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd3476afe000000000000000000000000000000000000000000000000000000001790529051611dc193929101613a9b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015611e4f573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611ec7576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051600090611f0d9084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001613aca565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152919052979650505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611f9d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001611110565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461207f576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff161580801561209f5750600054600160ff909116105b806120b95750303b1580156120b9575060005460ff166001145b612145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a80565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156121a357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8a81169190910291909117909155600280547fffffffffffffffffffffffff000000000000000000000000000000000000000016918816919091179055600361222b86826137b5565b50600461223885826137b5565b506005839055600780547a06978000000000000000000000000000000000000000000000000077ffffffffffffffffffffffffffffffff000000000000000090911667ffffffffffffffff85161717905580156122ec57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461234c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361235882826137b5565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516111109190613190565b604051806060016040528060218152602001613ca06021913981565b60085460ff166123e0576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081900361241c576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612458576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612493918491700100000000000000000000000000000000900416613b26565b11156124cb576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b8381101561275a5760008686838181106125105761251061390e565b90506020028101906125229190613b39565b61252b90613b6d565b90508361253781613a0c565b825180516020918201208185015160408087015190519499509194506000936125999386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612622576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055612647600188613a6b565b84036126b65742600760189054906101000a900467ffffffffffffffff1684604001516126749190613beb565b67ffffffffffffffff1611156126b6576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450505050808061275290613a33565b9150506124f4565b506127887f00000000000000000000000000000000000000000000000000000000000000008461172a6106d2565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612877573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289b91906138cf565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612917576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612984573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a89190613669565b9050818111156129e4576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612a20576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a6273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084612da3565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612acf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af39190613669565b600780549192506801000000000000000090910467ffffffffffffffff16906008612b1d83613a0c565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612b54929190613c0c565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612c64576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612cc3565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612cba9493929190613c1c565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052612d9e9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612e07565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612e019085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612d1c565b50505050565b6000612e69826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612f139092919063ffffffff16565b805190915015612d9e5780806020019051810190612e8791906138ec565b612d9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610a80565b6060612f228484600085612f2a565b949350505050565b606082471015612fbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610a80565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612fe59190613c8d565b60006040518083038185875af1925050503d8060008114613022576040519150601f19603f3d011682016040523d82523d6000602084013e613027565b606091505b509150915061303887838387613043565b979650505050505050565b606083156130d95782516000036130d25773ffffffffffffffffffffffffffffffffffffffff85163b6130d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a80565b5081612f22565b612f2283838151156130ee5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a809190613190565b60005b8381101561313d578181015183820152602001613125565b50506000910152565b6000815180845261315e816020860160208601613122565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006131a36020830184613146565b9392505050565b67ffffffffffffffff811681146131c057600080fd5b50565b803573ffffffffffffffffffffffffffffffffffffffff811681146131e757600080fd5b919050565b60008060006060848603121561320157600080fd5b833561320c816131aa565b925060208401359150613221604085016131c3565b90509250925092565b803563ffffffff811681146131e757600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261327e57600080fd5b813567ffffffffffffffff808211156132995761329961323e565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156132df576132df61323e565b816040528381528660208588010111156132f857600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121561333357600080fd5b61333c886131c3565b965061334a602089016131c3565b95506133586040890161322a565b9450613366606089016131c3565b93506133746080890161322a565b925060a088013567ffffffffffffffff8082111561339157600080fd5b61339d8b838c0161326d565b935060c08a01359150808211156133b357600080fd5b506133c08a828b0161326d565b91505092959891949750929550565b6000602082840312156133e157600080fd5b81356131a3816131aa565b60008083601f8401126133fe57600080fd5b50813567ffffffffffffffff81111561341657600080fd5b6020830191508360208260051b850101111561343157600080fd5b9250929050565b60008060006040848603121561344d57600080fd5b833567ffffffffffffffff81111561346457600080fd5b613470868287016133ec565b90945092506132219050602085016131c3565b60006020828403121561349557600080fd5b6131a3826131c3565b6000806000606084860312156134b357600080fd5b6134bc8461322a565b92506134ca602085016131c3565b91506132216040850161322a565b60008060008060008060c087890312156134f157600080fd5b6134fa876131c3565b9550613508602088016131c3565b9450604087013567ffffffffffffffff8082111561352557600080fd5b6135318a838b0161326d565b9550606089013591508082111561354757600080fd5b5061355489828a0161326d565b9350506080870135915060a087013561356c816131aa565b809150509295509295509295565b60006020828403121561358c57600080fd5b813567ffffffffffffffff8111156135a357600080fd5b612f228482850161326d565b600080602083850312156135c257600080fd5b823567ffffffffffffffff8111156135d957600080fd5b6135e5858286016133ec565b90969095509350505050565b60008060006040848603121561360657600080fd5b833567ffffffffffffffff8082111561361e57600080fd5b818601915086601f83011261363257600080fd5b81358181111561364157600080fd5b87602082850101111561365357600080fd5b6020928301989097509590910135949350505050565b60006020828403121561367b57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8281168282160390808211156136d2576136d2613682565b5092915050565b60008261370f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061372857607f821691505b602082108103613761577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f821115612d9e57600081815260208120601f850160051c8101602086101561378e5750805b601f850160051c820191505b818110156137ad5782815560010161379a565b505050505050565b815167ffffffffffffffff8111156137cf576137cf61323e565b6137e3816137dd8454613714565b84613767565b602080601f83116001811461383657600084156138005750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556137ad565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561388357888601518255948401946001909101908401613864565b50858210156138bf57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156138e157600080fd5b81516131a3816131aa565b6000602082840312156138fe57600080fd5b815180151581146131a357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261397157600080fd5b9190910192915050565b60006080823603121561398d57600080fd5b6040516080810167ffffffffffffffff82821081831117156139b1576139b161323e565b8160405284359150808211156139c657600080fd5b506139d33682860161326d565b8252506020830135602082015260408301356139ee816131aa565b60408201526060830135613a01816131aa565b606082015292915050565b600067ffffffffffffffff808316818103613a2957613a29613682565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613a6457613a64613682565b5060010190565b81810381811115613a7e57613a7e613682565b92915050565b8082028115828204841417613a7e57613a7e613682565b60008351613aad818460208801613122565b835190830190613ac1818360208801613122565b01949350505050565b60008651613adc818460208b01613122565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b80820180821115613a7e57613a7e613682565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261397157600080fd5b600060608236031215613b7f57600080fd5b6040516060810167ffffffffffffffff8282108183111715613ba357613ba361323e565b816040528435915080821115613bb857600080fd5b50613bc53682860161326d565b825250602083013560208201526040830135613be0816131aa565b604082015292915050565b67ffffffffffffffff8181168382160190808211156136d2576136d2613682565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b6000825161397181846020870161312256fef8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a2646970667358221220b8b9cc96275e330f97fe9d7a8ab9abb8b4daa7d33c46484329c4b87e82b6de6464736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102915760003560e01c80638c3d730111610160578063cfa8ed47116100d8578063e46761c41161008c578063eaeb077b11610071578063eaeb077b1461067f578063f35dda4714610692578063f851a440146106ac57600080fd5b8063e46761c414610638578063e7a7ed021461065f57600080fd5b8063d690be31116100bd578063d690be3114610612578063d7bc90ff1461061a578063d8d1091b1461062557600080fd5b8063cfa8ed47146105cb578063d02103ca146105eb57600080fd5b8063ada8f9191161012f578063bb59070811610114578063bb59070814610575578063c754c7ed14610588578063c89e42df146105b857600080fd5b8063ada8f91914610556578063b0afe1541461056957600080fd5b80638c3d7301146104f957806399af0397146105015780639e00187714610514578063a3c573eb1461052f57600080fd5b8063456052671161020e5780635e9145c9116101c25780636b8616ce116101a75780636b8616ce146104bd5780636e05d2cd146104dd5780636ff512cc146104e657600080fd5b80635e9145c9146104a25780635ec91958146104b557600080fd5b806349b7b802116101f357806349b7b802146104605780634e48770614610487578063542028d51461049a57600080fd5b8063456052671461042557806347ebf1081461044d57600080fd5b80632b35b3ac116102655780633c351e101161024a5780633c351e101461036a5780633cbc795b1461038f57806340b5de6c146103cd57600080fd5b80632b35b3ac1461033857806332c2d1531461035557600080fd5b8062d0295d14610296578063107bf28c146102b157806319d8ac61146102c657806326782247146102f3575b600080fd5b61029e6106d2565b6040519081526020015b60405180910390f35b6102b96107f2565b6040516102a89190613190565b6007546102da9067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102a8565b6001546103139073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102a8565b6008546103459060ff1681565b60405190151581526020016102a8565b6103686103633660046131ec565b610880565b005b60085461031390610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6008546103b8907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102a8565b6103f47fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102a8565b6007546102da90700100000000000000000000000000000000900467ffffffffffffffff1681565b61036861045b366004613318565b61094f565b6103137f000000000000000000000000000000000000000000000000000000000000000081565b6103686104953660046133cf565b610f01565b6102b961111b565b6103686104b0366004613438565b611128565b610368611a41565b61029e6104cb3660046133cf565b60066020526000908152604090205481565b61029e60055481565b6103686104f4366004613483565b611b2b565b610368611bf5565b6102b961050f36600461349e565b611cc8565b61031373a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103137f000000000000000000000000000000000000000000000000000000000000000081565b610368610564366004613483565b611f46565b61029e6405ca1ab1e081565b6103686105833660046134d8565b612010565b6007546102da907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6103686105c636600461357a565b6122f5565b6002546103139073ffffffffffffffffffffffffffffffffffffffff1681565b6103137f000000000000000000000000000000000000000000000000000000000000000081565b6102b9612388565b61029e635ca1ab1e81565b6103686106333660046135af565b6123a4565b6103137f000000000000000000000000000000000000000000000000000000000000000081565b6007546102da9068010000000000000000900467ffffffffffffffff1681565b61036861068d3660046135f1565b6128db565b61069a601b81565b60405160ff90911681526020016102a8565b6000546103139062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610761573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107859190613669565b6007549091506000906107c49067ffffffffffffffff7001000000000000000000000000000000008204811691680100000000000000009004166136b1565b67ffffffffffffffff169050806000036107e15760009250505090565b6107eb81836136d9565b9250505090565b600480546107ff90613714565b80601f016020809104026020016040519081016040528092919081815260200182805461082b90613714565b80156108785780601f1061084d57610100808354040283529160200191610878565b820191906000526020600020905b81548152906001019060200180831161085b57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146108ef576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59668460405161094291815260200190565b60405180910390a3505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109be576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156109de5750600054600160ff909116105b806109f85750303b1580156109f8575060005460ff166001145b610a89576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610ae757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8b81169190910291909117909155600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000169189169190911790556003610b6f84826137b5565b506004610b7c83826137b5565b506007805477ffffffffffffffffffffffffffffffffffffffffffffffff167a06978000000000000000000000000000000000000000000000000017905573ffffffffffffffffffffffffffffffffffffffff8516610c135763ffffffff841615610c13576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8816027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff8716021790556000610ca6878787611cc8565b805160208083019190912060408051600093810184905290810182905260608082018490524260c081901b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015293945090929190609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291506000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015610e33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5791906138cf565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050508015610ef757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610f58576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610f9f576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102e91906138ec565b6110975760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611097576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546107ff90613714565b60025473ffffffffffffffffffffffffffffffffffffffff163314611179576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160008190036111b5576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156111f1576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b8581101561162d57600089898381811061123a5761123a61390e565b905060200281019061124c919061393d565b6112559061397b565b8051805160209091012060608201519192509067ffffffffffffffff16156113d8578561128181613a0c565b965050600081836020015184606001516040516020016112d993929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114611362576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff1610156113b8576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055611515565b60208201511580159061149f575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015611479573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149d9190613669565b155b156114d6576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611515576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff161080611548575042826040015167ffffffffffffffff16115b1561157f576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061162590613a33565b91505061121e565b5060075467ffffffffffffffff6801000000000000000090910481169084161115611684576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146117bb5760006116db83866136b1565b90506116f167ffffffffffffffff821683613a6b565b91506117727f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661172a6106d2565b6117349190613a84565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190612cca565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6118b9337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa15801561184c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118709190613669565b61187a9190613a84565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190612da3565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561192157600080fd5b505af1158015611935573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af11580156119d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119fd91906138cf565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611a98576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615611ad5576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611b82576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001611110565b60015473ffffffffffffffffffffffffffffffffffffffff163314611c46576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60606000604051806060016040528060218152602001613ca06021913960405163ffffffff808816602483015273ffffffffffffffffffffffffffffffffffffffff871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa6084820152600060a482015260c401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd3476afe000000000000000000000000000000000000000000000000000000001790529051611dc193929101613a9b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015611e4f573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611ec7576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051600090611f0d9084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001613aca565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152919052979650505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611f9d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001611110565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461207f576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff161580801561209f5750600054600160ff909116105b806120b95750303b1580156120b9575060005460ff166001145b612145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a80565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156121a357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8a81169190910291909117909155600280547fffffffffffffffffffffffff000000000000000000000000000000000000000016918816919091179055600361222b86826137b5565b50600461223885826137b5565b506005839055600780547a06978000000000000000000000000000000000000000000000000077ffffffffffffffffffffffffffffffff000000000000000090911667ffffffffffffffff85161717905580156122ec57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461234c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361235882826137b5565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516111109190613190565b604051806060016040528060218152602001613ca06021913981565b60085460ff166123e0576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081900361241c576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612458576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612493918491700100000000000000000000000000000000900416613b26565b11156124cb576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b8381101561275a5760008686838181106125105761251061390e565b90506020028101906125229190613b39565b61252b90613b6d565b90508361253781613a0c565b825180516020918201208185015160408087015190519499509194506000936125999386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612622576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055612647600188613a6b565b84036126b65742600760189054906101000a900467ffffffffffffffff1684604001516126749190613beb565b67ffffffffffffffff1611156126b6576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450505050808061275290613a33565b9150506124f4565b506127887f00000000000000000000000000000000000000000000000000000000000000008461172a6106d2565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612877573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289b91906138cf565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612917576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612984573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a89190613669565b9050818111156129e4576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612a20576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a6273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084612da3565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612acf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af39190613669565b600780549192506801000000000000000090910467ffffffffffffffff16906008612b1d83613a0c565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612b54929190613c0c565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612c64576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612cc3565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612cba9493929190613c1c565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052612d9e9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612e07565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612e019085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612d1c565b50505050565b6000612e69826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612f139092919063ffffffff16565b805190915015612d9e5780806020019051810190612e8791906138ec565b612d9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610a80565b6060612f228484600085612f2a565b949350505050565b606082471015612fbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610a80565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612fe59190613c8d565b60006040518083038185875af1925050503d8060008114613022576040519150601f19603f3d011682016040523d82523d6000602084013e613027565b606091505b509150915061303887838387613043565b979650505050505050565b606083156130d95782516000036130d25773ffffffffffffffffffffffffffffffffffffffff85163b6130d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a80565b5081612f22565b612f2283838151156130ee5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a809190613190565b60005b8381101561313d578181015183820152602001613125565b50506000910152565b6000815180845261315e816020860160208601613122565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006131a36020830184613146565b9392505050565b67ffffffffffffffff811681146131c057600080fd5b50565b803573ffffffffffffffffffffffffffffffffffffffff811681146131e757600080fd5b919050565b60008060006060848603121561320157600080fd5b833561320c816131aa565b925060208401359150613221604085016131c3565b90509250925092565b803563ffffffff811681146131e757600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261327e57600080fd5b813567ffffffffffffffff808211156132995761329961323e565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156132df576132df61323e565b816040528381528660208588010111156132f857600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121561333357600080fd5b61333c886131c3565b965061334a602089016131c3565b95506133586040890161322a565b9450613366606089016131c3565b93506133746080890161322a565b925060a088013567ffffffffffffffff8082111561339157600080fd5b61339d8b838c0161326d565b935060c08a01359150808211156133b357600080fd5b506133c08a828b0161326d565b91505092959891949750929550565b6000602082840312156133e157600080fd5b81356131a3816131aa565b60008083601f8401126133fe57600080fd5b50813567ffffffffffffffff81111561341657600080fd5b6020830191508360208260051b850101111561343157600080fd5b9250929050565b60008060006040848603121561344d57600080fd5b833567ffffffffffffffff81111561346457600080fd5b613470868287016133ec565b90945092506132219050602085016131c3565b60006020828403121561349557600080fd5b6131a3826131c3565b6000806000606084860312156134b357600080fd5b6134bc8461322a565b92506134ca602085016131c3565b91506132216040850161322a565b60008060008060008060c087890312156134f157600080fd5b6134fa876131c3565b9550613508602088016131c3565b9450604087013567ffffffffffffffff8082111561352557600080fd5b6135318a838b0161326d565b9550606089013591508082111561354757600080fd5b5061355489828a0161326d565b9350506080870135915060a087013561356c816131aa565b809150509295509295509295565b60006020828403121561358c57600080fd5b813567ffffffffffffffff8111156135a357600080fd5b612f228482850161326d565b600080602083850312156135c257600080fd5b823567ffffffffffffffff8111156135d957600080fd5b6135e5858286016133ec565b90969095509350505050565b60008060006040848603121561360657600080fd5b833567ffffffffffffffff8082111561361e57600080fd5b818601915086601f83011261363257600080fd5b81358181111561364157600080fd5b87602082850101111561365357600080fd5b6020928301989097509590910135949350505050565b60006020828403121561367b57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8281168282160390808211156136d2576136d2613682565b5092915050565b60008261370f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061372857607f821691505b602082108103613761577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f821115612d9e57600081815260208120601f850160051c8101602086101561378e5750805b601f850160051c820191505b818110156137ad5782815560010161379a565b505050505050565b815167ffffffffffffffff8111156137cf576137cf61323e565b6137e3816137dd8454613714565b84613767565b602080601f83116001811461383657600084156138005750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556137ad565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561388357888601518255948401946001909101908401613864565b50858210156138bf57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156138e157600080fd5b81516131a3816131aa565b6000602082840312156138fe57600080fd5b815180151581146131a357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261397157600080fd5b9190910192915050565b60006080823603121561398d57600080fd5b6040516080810167ffffffffffffffff82821081831117156139b1576139b161323e565b8160405284359150808211156139c657600080fd5b506139d33682860161326d565b8252506020830135602082015260408301356139ee816131aa565b60408201526060830135613a01816131aa565b606082015292915050565b600067ffffffffffffffff808316818103613a2957613a29613682565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613a6457613a64613682565b5060010190565b81810381811115613a7e57613a7e613682565b92915050565b8082028115828204841417613a7e57613a7e613682565b60008351613aad818460208801613122565b835190830190613ac1818360208801613122565b01949350505050565b60008651613adc818460208b01613122565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b80820180821115613a7e57613a7e613682565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261397157600080fd5b600060608236031215613b7f57600080fd5b6040516060810167ffffffffffffffff8282108183111715613ba357613ba361323e565b816040528435915080821115613bb857600080fd5b50613bc53682860161326d565b825250602083013560208201526040830135613be0816131aa565b604082015292915050565b67ffffffffffffffff8181168382160190808211156136d2576136d2613682565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b6000825161397181846020870161312256fef8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a2646970667358221220b8b9cc96275e330f97fe9d7a8ab9abb8b4daa7d33c46484329c4b87e82b6de6464736f6c63430008140033", + "bytecode": "0x61010060405234801562000011575f80fd5b5060405162002de838038062002de883398101604081905262000034916200006f565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d4565b6001600160a01b03811681146200006c575f80fd5b50565b5f805f806080858703121562000083575f80fd5b8451620000908162000057565b6020860151909450620000a38162000057565b6040860151909350620000b68162000057565b6060860151909250620000c98162000057565b939692955090935050565b60805160a05160c05160e051612c5b6200018d5f395f818161030e015281816106b40152818161074f0152818161097901528181610abc01528181610fad0152818161104501528181611067015281816111a7015281816115e401528181611a3c01528181611ab80152611b9301525f81816103dc015261112301525f818161047501528181610dc10152611c8f01525f81816104c20152818161054701528181610ff2015281816110f90152611c640152612c5b5ff3fe608060405234801561000f575f80fd5b50600436106101bf575f3560e01c8062d0295d146101c3578063107bf28c146101de57806319d8ac61146101f3578063267822471461021e5780632b35b3ac1461023e57806332c2d1531461025b5780633c351e10146102705780633cbc795b1461028857806340b5de6c146102b457806345605267146102dc57806347ebf108146102f657806349b7b802146103095780634e48770614610330578063542028d5146103435780635e9145c91461034b5780635ec919581461035e5780636b8616ce146103665780636e05d2cd146103855780636ff512cc1461038e5780638c3d7301146103a157806399af0397146103a95780639e001877146103bc578063a3c573eb146103d7578063ada8f919146103fe578063b0afe15414610411578063bb5907081461041d578063c754c7ed14610430578063c89e42df1461044a578063cfa8ed471461045d578063d02103ca14610470578063d690be3114610497578063d7bc90ff1461049f578063d8d1091b146104aa578063e46761c4146104bd578063e7a7ed02146104e4578063eaeb077b146104fe578063f35dda4714610511578063f851a4401461052b575b5f80fd5b6101cb610543565b6040519081526020015b60405180910390f35b6101e6610626565b6040516101d591906121ba565b600754610206906001600160401b031681565b6040516001600160401b0390911681526020016101d5565b600154610231906001600160a01b031681565b6040516101d591906121d3565b60085461024b9060ff1681565b60405190151581526020016101d5565b61026e610269366004612219565b6106b2565b005b6008546102319061010090046001600160a01b031681565b60085461029f90600160a81b900463ffffffff1681565b60405163ffffffff90911681526020016101d5565b6102c36001600160f81b031981565b6040516001600160f81b031990911681526020016101d5565b60075461020690600160801b90046001600160401b031681565b61026e610304366004612303565b61074d565b6102317f000000000000000000000000000000000000000000000000000000000000000081565b61026e61033e3660046123b2565b610a5d565b6101e6610bd1565b61026e610359366004612414565b610bde565b61026e61124e565b6101cb6103743660046123b2565b60066020525f908152604090205481565b6101cb60055481565b61026e61039c36600461245a565b6112d9565b61026e611354565b6101e66103b7366004612473565b6113e0565b61023173a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6102317f000000000000000000000000000000000000000000000000000000000000000081565b61026e61040c36600461245a565b611567565b6101cb6405ca1ab1e081565b61026e61042b3660046124aa565b6115e2565b60075461020690600160c01b90046001600160401b031681565b61026e610458366004612545565b611766565b600254610231906001600160a01b031681565b6102317f000000000000000000000000000000000000000000000000000000000000000081565b6101e66117d2565b6101cb635ca1ab1e81565b61026e6104b8366004612576565b6117ee565b6102317f000000000000000000000000000000000000000000000000000000000000000081565b60075461020690600160401b90046001600160401b031681565b61026e61050c3660046125b4565b611b6d565b610519601b81565b60405160ff90911681526020016101d5565b5f54610231906201000090046001600160a01b031681565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161059191906121d3565b602060405180830381865afa1580156105ac573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105d09190612624565b6007549091505f906105fb906001600160401b03600160801b8204811691600160401b90041661264f565b6001600160401b03169050805f03610615575f9250505090565b61061f8183612676565b9250505090565b6004805461063390612695565b80601f016020809104026020016040519081016040528092919081815260200182805461065f90612695565b80156106aa5780601f10610681576101008083540402835291602001916106aa565b820191905f5260205f20905b81548152906001019060200180831161068d57829003601f168201915b505050505081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146106fb57604051631736745960e31b815260040160405180910390fd5b806001600160a01b0316836001600160401b03167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59668460405161074091815260200190565b60405180910390a3505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461079657604051631736745960e31b815260040160405180910390fd5b5f54610100900460ff16158080156107b457505f54600160ff909116105b806107d457506107c330611e5f565b1580156107d457505f5460ff166001145b6107f95760405162461bcd60e51b81526004016107f0906126cd565b60405180910390fd5b5f805460ff19166001179055801561081a575f805461ff0019166101001790555b5f805462010000600160b01b031916620100006001600160a01b038b81169190910291909117909155600280546001600160a01b03191691891691909117905560036108668482612768565b5060046108738382612768565b50600780546001600160c01b0316610d2f60c71b1790556001600160a01b0385166108bd5763ffffffff8416156108bd57604051630d43a60960e11b815260040160405180910390fd5b60088054610100600160c81b0319166101006001600160a01b0388160263ffffffff60a81b191617600160a81b63ffffffff8716021790555f6109018787876113e0565b90505f818051906020012090505f4290505f805f1b835f801b848e604051602001610930959493929190612823565b60408051808303601f19018152908290528051602090910120600780546001600160401b0319166001600160401b0386161790556005819055639a908e7360e01b825291505f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639a908e73906109b9906001908690600401612862565b6020604051808303815f875af11580156109d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109f9919061287b565b6040519091506001600160401b038216905f80516020612ba5833981519152905f90a250505050508015610a53575f805461ff0019169055604051600181525f80516020612bc58339815191529060200160405180910390a15b5050505050505050565b5f546201000090046001600160a01b03163314610a8d57604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610aba5760405163f5e37f2f60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b16573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3a9190612896565b610b74576007546001600160401b03600160c01b909104811690821610610b745760405163f5e37f2f60e01b815260040160405180910390fd5b600780546001600160c01b0316600160c01b6001600160401b038416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461063390612695565b6002546001600160a01b03163314610c09576040516311e7be1560e01b815260040160405180910390fd5b815f819003610c2b5760405163cb591a5f60e01b815260040160405180910390fd5b6103e8811115610c4e57604051635acfba9d60e11b815260040160405180910390fd5b6007546005546001600160401b0380831692600160801b90041690815f5b85811015610f1c575f898983818110610c8757610c876128b5565b9050602002810190610c9991906128c9565b610ca2906128e7565b805180516020909101206060820151919250906001600160401b031615610d975785610ccd81612974565b9650505f8183602001518460600151604051602001610cee939291906129a1565b60408051601f1981840301815291815281516020928301206001600160401b038a165f90815260069093529120549091508114610d3e5760405163671ebaaf60e11b815260040160405180910390fd5b82606001516001600160401b031683604001516001600160401b03161015610d7957604051633fbd5c3960e11b815260040160405180910390fd5b506001600160401b0386165f90815260066020526040812055610e79565b602082015115801590610e35575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303815f875af1158015610e0f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e339190612624565b155b15610e53576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c01015610e79576040516328a69b1f60e21b815260040160405180910390fd5b866001600160401b031682604001516001600160401b03161080610ea957504282604001516001600160401b0316115b15610ec7576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518c604051602001610ee8959493929190612823565b6040516020818303038152906040528051906020012094508160400151965050508080610f14906129c4565b915050610c6c565b506007546001600160401b03600160401b90910481169084161115610f545760405163c630a00d60e01b815260040160405180910390fd5b600780546001600160401b0319166001600160401b0386811691909117909155600583905585908281169085161461103f575f610f91838661264f565b9050610fa66001600160401b038216836129dc565b91506110197f0000000000000000000000000000000000000000000000000000000000000000826001600160401b0316610fde610543565b610fe891906129f5565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190611e6e565b5060078054600160801b600160c01b031916600160801b6001600160401b038716021790555b611121337f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110e59190612624565b6110ef91906129f5565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190611ed6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611179575f80fd5b505af115801561118b573d5f803e3d5ffd5b5050604051639a908e7360e01b81525f92506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150639a908e73906111df908a908890600401612862565b6020604051808303815f875af11580156111fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061121f919061287b565b6040519091506001600160401b038216905f80516020612ba5833981519152905f90a250505050505050505050565b5f546201000090046001600160a01b0316331461127e57604051634755657960e01b815260040160405180910390fd5b60085460ff16156112a25760405163f6ba91a160e01b815260040160405180910390fd5b6008805460ff191660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f546201000090046001600160a01b0316331461130957604051634755657960e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383161790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610bc69083906121d3565b6001546001600160a01b0316331461137f5760405163d1ec4b2360e01b815260040160405180910390fd5b6001545f8054620100006001600160a01b0390931692830262010000600160b01b03199091161790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e916113d6916121d3565b60405180910390a1565b60605f604051806060016040528060218152602001612c056021913960405163ffffffff80881660248301526001600160a01b03871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa60848201525f60a482015260c40160408051601f19818403018152918152602080830180516001600160e01b03166369a3b57f60e11b179052905161147e93929101612a0c565b60408051601f1981840301815282825280516020808301919091205f80865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa1580156114eb573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661151f5760405163668b0cb360e11b815260040160405180910390fd5b6040515f9061154c9084906405ca1ab1e090635ca1ab1e90601b906001600160f81b031990602001612a3a565b60408051808303601f19018152919052979650505050505050565b5f546201000090046001600160a01b0316331461159757604051634755657960e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610bc69083906121d3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461162b57604051631736745960e31b815260040160405180910390fd5b5f54610100900460ff161580801561164957505f54600160ff909116105b80611669575061165830611e5f565b15801561166957505f5460ff166001145b6116855760405162461bcd60e51b81526004016107f0906126cd565b5f805460ff1916600117905580156116a6575f805461ff0019166101001790555b5f805462010000600160b01b031916620100006001600160a01b038a81169190910291909117909155600280546001600160a01b03191691881691909117905560036116f28682612768565b5060046116ff8582612768565b50600583905560078054610d2f60c71b600160401b600160c01b039091166001600160401b03851617179055801561175d575f805461ff0019169055604051600181525f80516020612bc58339815191529060200160405180910390a15b50505050505050565b5f546201000090046001600160a01b0316331461179657604051634755657960e01b815260040160405180910390fd5b60036117a28282612768565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610bc691906121ba565b604051806060016040528060218152602001612c056021913981565b60085460ff16611811576040516324eff8c360e01b815260040160405180910390fd5b805f8190036118335760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561185657604051635acfba9d60e11b815260040160405180910390fd5b6007546001600160401b03600160401b820481169161187e918491600160801b900416612a7d565b111561189d5760405163c630a00d60e01b815260040160405180910390fd5b600754600554600160801b9091046001600160401b0316905f5b83811015611a36575f8686838181106118d2576118d26128b5565b90506020028101906118e49190612a90565b6118ed90612aa4565b9050836118f981612974565b825180516020918201208185015160408087015190519499509194505f9361192493869391016129a1565b60408051601f1981840301815291815281516020928301206001600160401b0389165f908152600690935291205490915081146119745760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b0386165f908152600660205260408120556119976001886129dc565b84036119eb5742600760189054906101000a90046001600160401b031684604001516119c39190612b1e565b6001600160401b031611156119eb5760405163c44a082160e01b815260040160405180910390fd5b848284602001514233604051602001611a08959493929190612823565b6040516020818303038152906040528051906020012094505050508080611a2e906129c4565b9150506118b7565b50611a647f000000000000000000000000000000000000000000000000000000000000000084610fde610543565b6005819055600780546001600160401b03848116600160801b026001600160401b03600160801b03600160c01b0319909216429190911617179055604051639a908e7360e01b81525f906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611aef9087908690600401612862565b6020604051808303815f875af1158015611b0b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b2f919061287b565b6040519091506001600160401b038216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a2505050505050565b60085460ff16611b90576040516324eff8c360e01b815260040160405180910390fd5b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c119190612624565b905081811115611c3457604051632354600f60e01b815260040160405180910390fd5b611388831115611c57576040516328a69b1f60e21b815260040160405180910390fd5b611c8c6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084611ed6565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ce9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d0d9190612624565b60078054919250600160401b9091046001600160401b0316906008611d3183612974565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508484604051611d66929190612b3e565b604051908190038120611d7f91839042906020016129a1565b60408051808303601f190181529181528151602092830120600754600160401b90046001600160401b03165f9081526006909352912055323303611e0e576007546040805183815233602082015260609181018290525f91810191909152600160401b9091046001600160401b0316905f80516020612be58339815191529060800160405180910390a2611e58565b600760089054906101000a90046001600160401b03166001600160401b03165f80516020612be583398151915282338888604051611e4f9493929190612b4d565b60405180910390a25b5050505050565b6001600160a01b03163b151590565b6040516001600160a01b038316602482015260448101829052611ed190849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611f14565b505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611f0e9085906323b872dd60e01b90608401611e9a565b50505050565b5f611f68826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611fe59092919063ffffffff16565b805190915015611ed15780806020019051810190611f869190612896565b611ed15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107f0565b6060611ff384845f85611ffb565b949350505050565b60608247101561205c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016107f0565b5f80866001600160a01b031685876040516120779190612b93565b5f6040518083038185875af1925050503d805f81146120b1576040519150601f19603f3d011682016040523d82523d5f602084013e6120b6565b606091505b50915091506120c7878383876120d2565b979650505050505050565b6060831561213e5782515f03612137576120eb85611e5f565b6121375760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107f0565b5081611ff3565b611ff383838151156121535781518083602001fd5b8060405162461bcd60e51b81526004016107f091906121ba565b5f5b8381101561218757818101518382015260200161216f565b50505f910152565b5f81518084526121a681602086016020860161216d565b601f01601f19169290920160200192915050565b602081525f6121cc602083018461218f565b9392505050565b6001600160a01b0391909116815260200190565b6001600160401b03811681146121fb575f80fd5b50565b80356001600160a01b0381168114612214575f80fd5b919050565b5f805f6060848603121561222b575f80fd5b8335612236816121e7565b92506020840135915061224b604085016121fe565b90509250925092565b803563ffffffff81168114612214575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261228a575f80fd5b81356001600160401b03808211156122a4576122a4612267565b604051601f8301601f19908116603f011681019082821181831017156122cc576122cc612267565b816040528381528660208588010111156122e4575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a031215612319575f80fd5b612322886121fe565b9650612330602089016121fe565b955061233e60408901612254565b945061234c606089016121fe565b935061235a60808901612254565b925060a08801356001600160401b0380821115612375575f80fd5b6123818b838c0161227b565b935060c08a0135915080821115612396575f80fd5b506123a38a828b0161227b565b91505092959891949750929550565b5f602082840312156123c2575f80fd5b81356121cc816121e7565b5f8083601f8401126123dd575f80fd5b5081356001600160401b038111156123f3575f80fd5b6020830191508360208260051b850101111561240d575f80fd5b9250929050565b5f805f60408486031215612426575f80fd5b83356001600160401b0381111561243b575f80fd5b612447868287016123cd565b909450925061224b9050602085016121fe565b5f6020828403121561246a575f80fd5b6121cc826121fe565b5f805f60608486031215612485575f80fd5b61248e84612254565b925061249c602085016121fe565b915061224b60408501612254565b5f805f805f8060c087890312156124bf575f80fd5b6124c8876121fe565b95506124d6602088016121fe565b945060408701356001600160401b03808211156124f1575f80fd5b6124fd8a838b0161227b565b95506060890135915080821115612512575f80fd5b5061251f89828a0161227b565b9350506080870135915060a0870135612537816121e7565b809150509295509295509295565b5f60208284031215612555575f80fd5b81356001600160401b0381111561256a575f80fd5b611ff38482850161227b565b5f8060208385031215612587575f80fd5b82356001600160401b0381111561259c575f80fd5b6125a8858286016123cd565b90969095509350505050565b5f805f604084860312156125c6575f80fd5b83356001600160401b03808211156125dc575f80fd5b818601915086601f8301126125ef575f80fd5b8135818111156125fd575f80fd5b87602082850101111561260e575f80fd5b6020928301989097509590910135949350505050565b5f60208284031215612634575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561266f5761266f61263b565b5092915050565b5f8261269057634e487b7160e01b5f52601260045260245ffd5b500490565b600181811c908216806126a957607f821691505b6020821081036126c757634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b601f821115611ed1575f81815260208120601f850160051c810160208610156127415750805b601f850160051c820191505b818110156127605782815560010161274d565b505050505050565b81516001600160401b0381111561278157612781612267565b6127958161278f8454612695565b8461271b565b602080601f8311600181146127c8575f84156127b15750858301515b5f19600386901b1c1916600185901b178555612760565b5f85815260208120601f198616915b828110156127f6578886015182559484019460019091019084016127d7565b508582101561281357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b6001600160401b03929092168252602082015260400190565b5f6020828403121561288b575f80fd5b81516121cc816121e7565b5f602082840312156128a6575f80fd5b815180151581146121cc575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e198336030181126128dd575f80fd5b9190910192915050565b5f608082360312156128f7575f80fd5b604051608081016001600160401b03808211838310171561291a5761291a612267565b81604052843591508082111561292e575f80fd5b5061293b3682860161227b565b825250602083013560208201526040830135612956816121e7565b60408201526060830135612969816121e7565b606082015292915050565b5f6001600160401b038281166002600160401b031981016129975761299761263b565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b5f600182016129d5576129d561263b565b5060010190565b818103818111156129ef576129ef61263b565b92915050565b80820281158282048414176129ef576129ef61263b565b5f8351612a1d81846020880161216d565b835190830190612a3181836020880161216d565b01949350505050565b5f8651612a4b818460208b0161216d565b9190910194855250602084019290925260f81b6001600160f81b03199081166040840152166041820152604201919050565b808201808211156129ef576129ef61263b565b5f8235605e198336030181126128dd575f80fd5b5f60608236031215612ab4575f80fd5b604051606081016001600160401b038082118383101715612ad757612ad7612267565b816040528435915080821115612aeb575f80fd5b50612af83682860161227b565b825250602083013560208201526040830135612b13816121e7565b604082015292915050565b6001600160401b0381811683821601908082111561266f5761266f61263b565b818382375f9101908152919050565b8481526001600160a01b03841660208201526060604082018190528101829052818360808301375f818301608090810191909152601f909201601f191601019392505050565b5f82516128dd81846020870161216d56fe303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498f94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931f8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a26469706673582212209b216003212743484fff6c6b25161a61690fc600987c4c294267f06f37deddd264736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106101bf575f3560e01c8062d0295d146101c3578063107bf28c146101de57806319d8ac61146101f3578063267822471461021e5780632b35b3ac1461023e57806332c2d1531461025b5780633c351e10146102705780633cbc795b1461028857806340b5de6c146102b457806345605267146102dc57806347ebf108146102f657806349b7b802146103095780634e48770614610330578063542028d5146103435780635e9145c91461034b5780635ec919581461035e5780636b8616ce146103665780636e05d2cd146103855780636ff512cc1461038e5780638c3d7301146103a157806399af0397146103a95780639e001877146103bc578063a3c573eb146103d7578063ada8f919146103fe578063b0afe15414610411578063bb5907081461041d578063c754c7ed14610430578063c89e42df1461044a578063cfa8ed471461045d578063d02103ca14610470578063d690be3114610497578063d7bc90ff1461049f578063d8d1091b146104aa578063e46761c4146104bd578063e7a7ed02146104e4578063eaeb077b146104fe578063f35dda4714610511578063f851a4401461052b575b5f80fd5b6101cb610543565b6040519081526020015b60405180910390f35b6101e6610626565b6040516101d591906121ba565b600754610206906001600160401b031681565b6040516001600160401b0390911681526020016101d5565b600154610231906001600160a01b031681565b6040516101d591906121d3565b60085461024b9060ff1681565b60405190151581526020016101d5565b61026e610269366004612219565b6106b2565b005b6008546102319061010090046001600160a01b031681565b60085461029f90600160a81b900463ffffffff1681565b60405163ffffffff90911681526020016101d5565b6102c36001600160f81b031981565b6040516001600160f81b031990911681526020016101d5565b60075461020690600160801b90046001600160401b031681565b61026e610304366004612303565b61074d565b6102317f000000000000000000000000000000000000000000000000000000000000000081565b61026e61033e3660046123b2565b610a5d565b6101e6610bd1565b61026e610359366004612414565b610bde565b61026e61124e565b6101cb6103743660046123b2565b60066020525f908152604090205481565b6101cb60055481565b61026e61039c36600461245a565b6112d9565b61026e611354565b6101e66103b7366004612473565b6113e0565b61023173a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6102317f000000000000000000000000000000000000000000000000000000000000000081565b61026e61040c36600461245a565b611567565b6101cb6405ca1ab1e081565b61026e61042b3660046124aa565b6115e2565b60075461020690600160c01b90046001600160401b031681565b61026e610458366004612545565b611766565b600254610231906001600160a01b031681565b6102317f000000000000000000000000000000000000000000000000000000000000000081565b6101e66117d2565b6101cb635ca1ab1e81565b61026e6104b8366004612576565b6117ee565b6102317f000000000000000000000000000000000000000000000000000000000000000081565b60075461020690600160401b90046001600160401b031681565b61026e61050c3660046125b4565b611b6d565b610519601b81565b60405160ff90911681526020016101d5565b5f54610231906201000090046001600160a01b031681565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161059191906121d3565b602060405180830381865afa1580156105ac573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105d09190612624565b6007549091505f906105fb906001600160401b03600160801b8204811691600160401b90041661264f565b6001600160401b03169050805f03610615575f9250505090565b61061f8183612676565b9250505090565b6004805461063390612695565b80601f016020809104026020016040519081016040528092919081815260200182805461065f90612695565b80156106aa5780601f10610681576101008083540402835291602001916106aa565b820191905f5260205f20905b81548152906001019060200180831161068d57829003601f168201915b505050505081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146106fb57604051631736745960e31b815260040160405180910390fd5b806001600160a01b0316836001600160401b03167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59668460405161074091815260200190565b60405180910390a3505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461079657604051631736745960e31b815260040160405180910390fd5b5f54610100900460ff16158080156107b457505f54600160ff909116105b806107d457506107c330611e5f565b1580156107d457505f5460ff166001145b6107f95760405162461bcd60e51b81526004016107f0906126cd565b60405180910390fd5b5f805460ff19166001179055801561081a575f805461ff0019166101001790555b5f805462010000600160b01b031916620100006001600160a01b038b81169190910291909117909155600280546001600160a01b03191691891691909117905560036108668482612768565b5060046108738382612768565b50600780546001600160c01b0316610d2f60c71b1790556001600160a01b0385166108bd5763ffffffff8416156108bd57604051630d43a60960e11b815260040160405180910390fd5b60088054610100600160c81b0319166101006001600160a01b0388160263ffffffff60a81b191617600160a81b63ffffffff8716021790555f6109018787876113e0565b90505f818051906020012090505f4290505f805f1b835f801b848e604051602001610930959493929190612823565b60408051808303601f19018152908290528051602090910120600780546001600160401b0319166001600160401b0386161790556005819055639a908e7360e01b825291505f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639a908e73906109b9906001908690600401612862565b6020604051808303815f875af11580156109d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109f9919061287b565b6040519091506001600160401b038216905f80516020612ba5833981519152905f90a250505050508015610a53575f805461ff0019169055604051600181525f80516020612bc58339815191529060200160405180910390a15b5050505050505050565b5f546201000090046001600160a01b03163314610a8d57604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610aba5760405163f5e37f2f60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b16573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3a9190612896565b610b74576007546001600160401b03600160c01b909104811690821610610b745760405163f5e37f2f60e01b815260040160405180910390fd5b600780546001600160c01b0316600160c01b6001600160401b038416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461063390612695565b6002546001600160a01b03163314610c09576040516311e7be1560e01b815260040160405180910390fd5b815f819003610c2b5760405163cb591a5f60e01b815260040160405180910390fd5b6103e8811115610c4e57604051635acfba9d60e11b815260040160405180910390fd5b6007546005546001600160401b0380831692600160801b90041690815f5b85811015610f1c575f898983818110610c8757610c876128b5565b9050602002810190610c9991906128c9565b610ca2906128e7565b805180516020909101206060820151919250906001600160401b031615610d975785610ccd81612974565b9650505f8183602001518460600151604051602001610cee939291906129a1565b60408051601f1981840301815291815281516020928301206001600160401b038a165f90815260069093529120549091508114610d3e5760405163671ebaaf60e11b815260040160405180910390fd5b82606001516001600160401b031683604001516001600160401b03161015610d7957604051633fbd5c3960e11b815260040160405180910390fd5b506001600160401b0386165f90815260066020526040812055610e79565b602082015115801590610e35575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303815f875af1158015610e0f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e339190612624565b155b15610e53576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c01015610e79576040516328a69b1f60e21b815260040160405180910390fd5b866001600160401b031682604001516001600160401b03161080610ea957504282604001516001600160401b0316115b15610ec7576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518c604051602001610ee8959493929190612823565b6040516020818303038152906040528051906020012094508160400151965050508080610f14906129c4565b915050610c6c565b506007546001600160401b03600160401b90910481169084161115610f545760405163c630a00d60e01b815260040160405180910390fd5b600780546001600160401b0319166001600160401b0386811691909117909155600583905585908281169085161461103f575f610f91838661264f565b9050610fa66001600160401b038216836129dc565b91506110197f0000000000000000000000000000000000000000000000000000000000000000826001600160401b0316610fde610543565b610fe891906129f5565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190611e6e565b5060078054600160801b600160c01b031916600160801b6001600160401b038716021790555b611121337f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110e59190612624565b6110ef91906129f5565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190611ed6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611179575f80fd5b505af115801561118b573d5f803e3d5ffd5b5050604051639a908e7360e01b81525f92506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150639a908e73906111df908a908890600401612862565b6020604051808303815f875af11580156111fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061121f919061287b565b6040519091506001600160401b038216905f80516020612ba5833981519152905f90a250505050505050505050565b5f546201000090046001600160a01b0316331461127e57604051634755657960e01b815260040160405180910390fd5b60085460ff16156112a25760405163f6ba91a160e01b815260040160405180910390fd5b6008805460ff191660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f546201000090046001600160a01b0316331461130957604051634755657960e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383161790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610bc69083906121d3565b6001546001600160a01b0316331461137f5760405163d1ec4b2360e01b815260040160405180910390fd5b6001545f8054620100006001600160a01b0390931692830262010000600160b01b03199091161790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e916113d6916121d3565b60405180910390a1565b60605f604051806060016040528060218152602001612c056021913960405163ffffffff80881660248301526001600160a01b03871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa60848201525f60a482015260c40160408051601f19818403018152918152602080830180516001600160e01b03166369a3b57f60e11b179052905161147e93929101612a0c565b60408051601f1981840301815282825280516020808301919091205f80865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa1580156114eb573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661151f5760405163668b0cb360e11b815260040160405180910390fd5b6040515f9061154c9084906405ca1ab1e090635ca1ab1e90601b906001600160f81b031990602001612a3a565b60408051808303601f19018152919052979650505050505050565b5f546201000090046001600160a01b0316331461159757604051634755657960e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610bc69083906121d3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461162b57604051631736745960e31b815260040160405180910390fd5b5f54610100900460ff161580801561164957505f54600160ff909116105b80611669575061165830611e5f565b15801561166957505f5460ff166001145b6116855760405162461bcd60e51b81526004016107f0906126cd565b5f805460ff1916600117905580156116a6575f805461ff0019166101001790555b5f805462010000600160b01b031916620100006001600160a01b038a81169190910291909117909155600280546001600160a01b03191691881691909117905560036116f28682612768565b5060046116ff8582612768565b50600583905560078054610d2f60c71b600160401b600160c01b039091166001600160401b03851617179055801561175d575f805461ff0019169055604051600181525f80516020612bc58339815191529060200160405180910390a15b50505050505050565b5f546201000090046001600160a01b0316331461179657604051634755657960e01b815260040160405180910390fd5b60036117a28282612768565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610bc691906121ba565b604051806060016040528060218152602001612c056021913981565b60085460ff16611811576040516324eff8c360e01b815260040160405180910390fd5b805f8190036118335760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561185657604051635acfba9d60e11b815260040160405180910390fd5b6007546001600160401b03600160401b820481169161187e918491600160801b900416612a7d565b111561189d5760405163c630a00d60e01b815260040160405180910390fd5b600754600554600160801b9091046001600160401b0316905f5b83811015611a36575f8686838181106118d2576118d26128b5565b90506020028101906118e49190612a90565b6118ed90612aa4565b9050836118f981612974565b825180516020918201208185015160408087015190519499509194505f9361192493869391016129a1565b60408051601f1981840301815291815281516020928301206001600160401b0389165f908152600690935291205490915081146119745760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b0386165f908152600660205260408120556119976001886129dc565b84036119eb5742600760189054906101000a90046001600160401b031684604001516119c39190612b1e565b6001600160401b031611156119eb5760405163c44a082160e01b815260040160405180910390fd5b848284602001514233604051602001611a08959493929190612823565b6040516020818303038152906040528051906020012094505050508080611a2e906129c4565b9150506118b7565b50611a647f000000000000000000000000000000000000000000000000000000000000000084610fde610543565b6005819055600780546001600160401b03848116600160801b026001600160401b03600160801b03600160c01b0319909216429190911617179055604051639a908e7360e01b81525f906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611aef9087908690600401612862565b6020604051808303815f875af1158015611b0b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b2f919061287b565b6040519091506001600160401b038216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a2505050505050565b60085460ff16611b90576040516324eff8c360e01b815260040160405180910390fd5b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c119190612624565b905081811115611c3457604051632354600f60e01b815260040160405180910390fd5b611388831115611c57576040516328a69b1f60e21b815260040160405180910390fd5b611c8c6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084611ed6565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ce9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d0d9190612624565b60078054919250600160401b9091046001600160401b0316906008611d3183612974565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508484604051611d66929190612b3e565b604051908190038120611d7f91839042906020016129a1565b60408051808303601f190181529181528151602092830120600754600160401b90046001600160401b03165f9081526006909352912055323303611e0e576007546040805183815233602082015260609181018290525f91810191909152600160401b9091046001600160401b0316905f80516020612be58339815191529060800160405180910390a2611e58565b600760089054906101000a90046001600160401b03166001600160401b03165f80516020612be583398151915282338888604051611e4f9493929190612b4d565b60405180910390a25b5050505050565b6001600160a01b03163b151590565b6040516001600160a01b038316602482015260448101829052611ed190849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611f14565b505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611f0e9085906323b872dd60e01b90608401611e9a565b50505050565b5f611f68826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611fe59092919063ffffffff16565b805190915015611ed15780806020019051810190611f869190612896565b611ed15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107f0565b6060611ff384845f85611ffb565b949350505050565b60608247101561205c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016107f0565b5f80866001600160a01b031685876040516120779190612b93565b5f6040518083038185875af1925050503d805f81146120b1576040519150601f19603f3d011682016040523d82523d5f602084013e6120b6565b606091505b50915091506120c7878383876120d2565b979650505050505050565b6060831561213e5782515f03612137576120eb85611e5f565b6121375760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107f0565b5081611ff3565b611ff383838151156121535781518083602001fd5b8060405162461bcd60e51b81526004016107f091906121ba565b5f5b8381101561218757818101518382015260200161216f565b50505f910152565b5f81518084526121a681602086016020860161216d565b601f01601f19169290920160200192915050565b602081525f6121cc602083018461218f565b9392505050565b6001600160a01b0391909116815260200190565b6001600160401b03811681146121fb575f80fd5b50565b80356001600160a01b0381168114612214575f80fd5b919050565b5f805f6060848603121561222b575f80fd5b8335612236816121e7565b92506020840135915061224b604085016121fe565b90509250925092565b803563ffffffff81168114612214575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261228a575f80fd5b81356001600160401b03808211156122a4576122a4612267565b604051601f8301601f19908116603f011681019082821181831017156122cc576122cc612267565b816040528381528660208588010111156122e4575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a031215612319575f80fd5b612322886121fe565b9650612330602089016121fe565b955061233e60408901612254565b945061234c606089016121fe565b935061235a60808901612254565b925060a08801356001600160401b0380821115612375575f80fd5b6123818b838c0161227b565b935060c08a0135915080821115612396575f80fd5b506123a38a828b0161227b565b91505092959891949750929550565b5f602082840312156123c2575f80fd5b81356121cc816121e7565b5f8083601f8401126123dd575f80fd5b5081356001600160401b038111156123f3575f80fd5b6020830191508360208260051b850101111561240d575f80fd5b9250929050565b5f805f60408486031215612426575f80fd5b83356001600160401b0381111561243b575f80fd5b612447868287016123cd565b909450925061224b9050602085016121fe565b5f6020828403121561246a575f80fd5b6121cc826121fe565b5f805f60608486031215612485575f80fd5b61248e84612254565b925061249c602085016121fe565b915061224b60408501612254565b5f805f805f8060c087890312156124bf575f80fd5b6124c8876121fe565b95506124d6602088016121fe565b945060408701356001600160401b03808211156124f1575f80fd5b6124fd8a838b0161227b565b95506060890135915080821115612512575f80fd5b5061251f89828a0161227b565b9350506080870135915060a0870135612537816121e7565b809150509295509295509295565b5f60208284031215612555575f80fd5b81356001600160401b0381111561256a575f80fd5b611ff38482850161227b565b5f8060208385031215612587575f80fd5b82356001600160401b0381111561259c575f80fd5b6125a8858286016123cd565b90969095509350505050565b5f805f604084860312156125c6575f80fd5b83356001600160401b03808211156125dc575f80fd5b818601915086601f8301126125ef575f80fd5b8135818111156125fd575f80fd5b87602082850101111561260e575f80fd5b6020928301989097509590910135949350505050565b5f60208284031215612634575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561266f5761266f61263b565b5092915050565b5f8261269057634e487b7160e01b5f52601260045260245ffd5b500490565b600181811c908216806126a957607f821691505b6020821081036126c757634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b601f821115611ed1575f81815260208120601f850160051c810160208610156127415750805b601f850160051c820191505b818110156127605782815560010161274d565b505050505050565b81516001600160401b0381111561278157612781612267565b6127958161278f8454612695565b8461271b565b602080601f8311600181146127c8575f84156127b15750858301515b5f19600386901b1c1916600185901b178555612760565b5f85815260208120601f198616915b828110156127f6578886015182559484019460019091019084016127d7565b508582101561281357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b6001600160401b03929092168252602082015260400190565b5f6020828403121561288b575f80fd5b81516121cc816121e7565b5f602082840312156128a6575f80fd5b815180151581146121cc575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e198336030181126128dd575f80fd5b9190910192915050565b5f608082360312156128f7575f80fd5b604051608081016001600160401b03808211838310171561291a5761291a612267565b81604052843591508082111561292e575f80fd5b5061293b3682860161227b565b825250602083013560208201526040830135612956816121e7565b60408201526060830135612969816121e7565b606082015292915050565b5f6001600160401b038281166002600160401b031981016129975761299761263b565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b5f600182016129d5576129d561263b565b5060010190565b818103818111156129ef576129ef61263b565b92915050565b80820281158282048414176129ef576129ef61263b565b5f8351612a1d81846020880161216d565b835190830190612a3181836020880161216d565b01949350505050565b5f8651612a4b818460208b0161216d565b9190910194855250602084019290925260f81b6001600160f81b03199081166040840152166041820152604201919050565b808201808211156129ef576129ef61263b565b5f8235605e198336030181126128dd575f80fd5b5f60608236031215612ab4575f80fd5b604051606081016001600160401b038082118383101715612ad757612ad7612267565b816040528435915080821115612aeb575f80fd5b50612af83682860161227b565b825250602083013560208201526040830135612b13816121e7565b604082015292915050565b6001600160401b0381811683821601908082111561266f5761266f61263b565b818382375f9101908152919050565b8481526001600160a01b03841660208201526060604082018190528101829052818360808301375f818301608090810191909152601f909201601f191601019392505050565b5f82516128dd81846020870161216d56fe303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498f94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931f8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a26469706673582212209b216003212743484fff6c6b25161a61690fc600987c4c294267f06f37deddd264736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/ProxyAdmin.json b/compiled-contracts/paris/ProxyAdmin.json index 50bdd2b68..23b280968 100644 --- a/compiled-contracts/paris/ProxyAdmin.json +++ b/compiled-contracts/paris/ProxyAdmin.json @@ -153,8 +153,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6108658061007e6000396000f3fe60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461012b57806399a88ec41461013e578063f2fde38b1461015e578063f3b7dead1461017e57600080fd5b8063204e1c7a14610080578063715018a6146100c95780637eff275e146100e05780638da5cb5b14610100575b600080fd5b34801561008c57600080fd5b506100a061009b366004610608565b61019e565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100d557600080fd5b506100de610255565b005b3480156100ec57600080fd5b506100de6100fb36600461062c565b610269565b34801561010c57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166100a0565b6100de610139366004610694565b6102f7565b34801561014a57600080fd5b506100de61015936600461062c565b61038c565b34801561016a57600080fd5b506100de610179366004610608565b6103e8565b34801561018a57600080fd5b506100a0610199366004610608565b6104a4565b60008060008373ffffffffffffffffffffffffffffffffffffffff166040516101ea907f5c60da1b00000000000000000000000000000000000000000000000000000000815260040190565b600060405180830381855afa9150503d8060008114610225576040519150601f19603f3d011682016040523d82523d6000602084013e61022a565b606091505b50915091508161023957600080fd5b8080602001905181019061024d9190610788565b949350505050565b61025d6104f0565b6102676000610571565b565b6102716104f0565b6040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690638f283970906024015b600060405180830381600087803b1580156102db57600080fd5b505af11580156102ef573d6000803e3d6000fd5b505050505050565b6102ff6104f0565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef28690349061035590869086906004016107a5565b6000604051808303818588803b15801561036e57600080fd5b505af1158015610382573d6000803e3d6000fd5b5050505050505050565b6103946104f0565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690633659cfe6906024016102c1565b6103f06104f0565b73ffffffffffffffffffffffffffffffffffffffff8116610498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6104a181610571565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff166040516101ea907ff851a44000000000000000000000000000000000000000000000000000000000815260040190565b60005473ffffffffffffffffffffffffffffffffffffffff163314610267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161048f565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff811681146104a157600080fd5b60006020828403121561061a57600080fd5b8135610625816105e6565b9392505050565b6000806040838503121561063f57600080fd5b823561064a816105e6565b9150602083013561065a816105e6565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156106a957600080fd5b83356106b4816105e6565b925060208401356106c4816105e6565b9150604084013567ffffffffffffffff808211156106e157600080fd5b818601915086601f8301126106f557600080fd5b81358181111561070757610707610665565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561074d5761074d610665565b8160405282815289602084870101111561076657600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b60006020828403121561079a57600080fd5b8151610625816105e6565b73ffffffffffffffffffffffffffffffffffffffff8316815260006020604081840152835180604085015260005b818110156107ef578581018301518582016060015282016107d3565b5060006060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050939250505056fea2646970667358221220c9867ffac53151bdb1305d8f5e3e883cd83e5270c7ec09cdc24e837b2e65239064736f6c63430008140033", - "deployedBytecode": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461012b57806399a88ec41461013e578063f2fde38b1461015e578063f3b7dead1461017e57600080fd5b8063204e1c7a14610080578063715018a6146100c95780637eff275e146100e05780638da5cb5b14610100575b600080fd5b34801561008c57600080fd5b506100a061009b366004610608565b61019e565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100d557600080fd5b506100de610255565b005b3480156100ec57600080fd5b506100de6100fb36600461062c565b610269565b34801561010c57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166100a0565b6100de610139366004610694565b6102f7565b34801561014a57600080fd5b506100de61015936600461062c565b61038c565b34801561016a57600080fd5b506100de610179366004610608565b6103e8565b34801561018a57600080fd5b506100a0610199366004610608565b6104a4565b60008060008373ffffffffffffffffffffffffffffffffffffffff166040516101ea907f5c60da1b00000000000000000000000000000000000000000000000000000000815260040190565b600060405180830381855afa9150503d8060008114610225576040519150601f19603f3d011682016040523d82523d6000602084013e61022a565b606091505b50915091508161023957600080fd5b8080602001905181019061024d9190610788565b949350505050565b61025d6104f0565b6102676000610571565b565b6102716104f0565b6040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690638f283970906024015b600060405180830381600087803b1580156102db57600080fd5b505af11580156102ef573d6000803e3d6000fd5b505050505050565b6102ff6104f0565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef28690349061035590869086906004016107a5565b6000604051808303818588803b15801561036e57600080fd5b505af1158015610382573d6000803e3d6000fd5b5050505050505050565b6103946104f0565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690633659cfe6906024016102c1565b6103f06104f0565b73ffffffffffffffffffffffffffffffffffffffff8116610498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6104a181610571565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff166040516101ea907ff851a44000000000000000000000000000000000000000000000000000000000815260040190565b60005473ffffffffffffffffffffffffffffffffffffffff163314610267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161048f565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff811681146104a157600080fd5b60006020828403121561061a57600080fd5b8135610625816105e6565b9392505050565b6000806040838503121561063f57600080fd5b823561064a816105e6565b9150602083013561065a816105e6565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156106a957600080fd5b83356106b4816105e6565b925060208401356106c4816105e6565b9150604084013567ffffffffffffffff808211156106e157600080fd5b818601915086601f8301126106f557600080fd5b81358181111561070757610707610665565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561074d5761074d610665565b8160405282815289602084870101111561076657600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b60006020828403121561079a57600080fd5b8151610625816105e6565b73ffffffffffffffffffffffffffffffffffffffff8316815260006020604081840152835180604085015260005b818110156107ef578581018301518582016060015282016107d3565b5060006060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050939250505056fea2646970667358221220c9867ffac53151bdb1305d8f5e3e883cd83e5270c7ec09cdc24e837b2e65239064736f6c63430008140033", + "bytecode": "0x608060405234801561000f575f80fd5b506100193361001e565b61006d565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61066b8061007a5f395ff3fe60806040526004361061006a575f3560e01c8063204e1c7a1461006e578063715018a6146100a35780637eff275e146100b95780638da5cb5b146100d85780639623609d146100ec57806399a88ec4146100ff578063f2fde38b1461011e578063f3b7dead1461013d575b5f80fd5b348015610079575f80fd5b5061008d610088366004610470565b61015c565b60405161009a9190610492565b60405180910390f35b3480156100ae575f80fd5b506100b76101e7565b005b3480156100c4575f80fd5b506100b76100d33660046104a6565b6101fa565b3480156100e3575f80fd5b5061008d61025f565b6100b76100fa3660046104f1565b61026d565b34801561010a575f80fd5b506100b76101193660046104a6565b6102d8565b348015610129575f80fd5b506100b7610138366004610470565b61030c565b348015610148575f80fd5b5061008d610157366004610470565b61038a565b5f805f836001600160a01b031660405161018090635c60da1b60e01b815260040190565b5f60405180830381855afa9150503d805f81146101b8576040519150601f19603f3d011682016040523d82523d5f602084013e6101bd565b606091505b5091509150816101cb575f80fd5b808060200190518101906101df91906105bf565b949350505050565b6101ef6103ae565b6101f85f61040d565b565b6102026103ae565b6040516308f2839760e41b81526001600160a01b03831690638f2839709061022e908490600401610492565b5f604051808303815f87803b158015610245575f80fd5b505af1158015610257573d5f803e3d5ffd5b505050505050565b5f546001600160a01b031690565b6102756103ae565b60405163278f794360e11b81526001600160a01b03841690634f1ef2869034906102a590869086906004016105da565b5f604051808303818588803b1580156102bc575f80fd5b505af11580156102ce573d5f803e3d5ffd5b5050505050505050565b6102e06103ae565b604051631b2ce7f360e11b81526001600160a01b03831690633659cfe69061022e908490600401610492565b6103146103ae565b6001600160a01b03811661037e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6103878161040d565b50565b5f805f836001600160a01b0316604051610180906303e1469160e61b815260040190565b336103b761025f565b6001600160a01b0316146101f85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610375565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610387575f80fd5b5f60208284031215610480575f80fd5b813561048b8161045c565b9392505050565b6001600160a01b0391909116815260200190565b5f80604083850312156104b7575f80fd5b82356104c28161045c565b915060208301356104d28161045c565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610503575f80fd5b833561050e8161045c565b9250602084013561051e8161045c565b915060408401356001600160401b0380821115610539575f80fd5b818601915086601f83011261054c575f80fd5b81358181111561055e5761055e6104dd565b604051601f8201601f19908116603f01168101908382118183101715610586576105866104dd565b8160405282815289602084870101111561059e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f602082840312156105cf575f80fd5b815161048b8161045c565b60018060a01b03831681525f602060408184015283518060408501525f5b81811015610614578581018301518582016060015282016105f8565b505f606082860101526060601f19601f83011685010192505050939250505056fea26469706673582212202fc04582b7c2b48c495ce0d90b114cc8562292a55b43c17cc68bfc1381aa1d3464736f6c63430008140033", + "deployedBytecode": "0x60806040526004361061006a575f3560e01c8063204e1c7a1461006e578063715018a6146100a35780637eff275e146100b95780638da5cb5b146100d85780639623609d146100ec57806399a88ec4146100ff578063f2fde38b1461011e578063f3b7dead1461013d575b5f80fd5b348015610079575f80fd5b5061008d610088366004610470565b61015c565b60405161009a9190610492565b60405180910390f35b3480156100ae575f80fd5b506100b76101e7565b005b3480156100c4575f80fd5b506100b76100d33660046104a6565b6101fa565b3480156100e3575f80fd5b5061008d61025f565b6100b76100fa3660046104f1565b61026d565b34801561010a575f80fd5b506100b76101193660046104a6565b6102d8565b348015610129575f80fd5b506100b7610138366004610470565b61030c565b348015610148575f80fd5b5061008d610157366004610470565b61038a565b5f805f836001600160a01b031660405161018090635c60da1b60e01b815260040190565b5f60405180830381855afa9150503d805f81146101b8576040519150601f19603f3d011682016040523d82523d5f602084013e6101bd565b606091505b5091509150816101cb575f80fd5b808060200190518101906101df91906105bf565b949350505050565b6101ef6103ae565b6101f85f61040d565b565b6102026103ae565b6040516308f2839760e41b81526001600160a01b03831690638f2839709061022e908490600401610492565b5f604051808303815f87803b158015610245575f80fd5b505af1158015610257573d5f803e3d5ffd5b505050505050565b5f546001600160a01b031690565b6102756103ae565b60405163278f794360e11b81526001600160a01b03841690634f1ef2869034906102a590869086906004016105da565b5f604051808303818588803b1580156102bc575f80fd5b505af11580156102ce573d5f803e3d5ffd5b5050505050505050565b6102e06103ae565b604051631b2ce7f360e11b81526001600160a01b03831690633659cfe69061022e908490600401610492565b6103146103ae565b6001600160a01b03811661037e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6103878161040d565b50565b5f805f836001600160a01b0316604051610180906303e1469160e61b815260040190565b336103b761025f565b6001600160a01b0316146101f85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610375565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610387575f80fd5b5f60208284031215610480575f80fd5b813561048b8161045c565b9392505050565b6001600160a01b0391909116815260200190565b5f80604083850312156104b7575f80fd5b82356104c28161045c565b915060208301356104d28161045c565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610503575f80fd5b833561050e8161045c565b9250602084013561051e8161045c565b915060408401356001600160401b0380821115610539575f80fd5b818601915086601f83011261054c575f80fd5b81358181111561055e5761055e6104dd565b604051601f8201601f19908116603f01168101908382118183101715610586576105866104dd565b8160405282815289602084870101111561059e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f602082840312156105cf575f80fd5b815161048b8161045c565b60018060a01b03831681525f602060408184015283518060408501525f5b81811015610614578581018301518582016060015282016105f8565b505f606082860101526060601f19601f83011685010192505050939250505056fea26469706673582212202fc04582b7c2b48c495ce0d90b114cc8562292a55b43c17cc68bfc1381aa1d3464736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/TokenWrapped.json b/compiled-contracts/paris/TokenWrapped.json index a21f1b423..2915000a5 100644 --- a/compiled-contracts/paris/TokenWrapped.json +++ b/compiled-contracts/paris/TokenWrapped.json @@ -471,8 +471,8 @@ "type": "function" } ], - "bytecode": "0x6101006040523480156200001257600080fd5b50604051620019fa380380620019fa83398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161153e620004bc6000396000610237015260008181610307015281816105c0015261068d0152600061053a0152600081816103790152610504015261153e6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b6040516101919190611278565b60405180910390f35b6101ad6101a836600461130d565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad610204366004611337565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad61027736600461130d565b61055c565b61028f61028a36600461130d565b6105a8565b005b6101c161029f366004611373565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d5366004611373565b60056020526000908152604090205481565b610184610666565b61028f6102fd36600461130d565b610675565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c36600461130d565b61072a565b6101ad61036f36600461130d565b6107e1565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611395565b6107ef565b6101c16103bc366004611408565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f9061143b565b80601f016020809104026020016040519081016040528092919081815260200182805461046b9061143b565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610af1565b60019150505b92915050565b6000336104ea858285610c71565b6104f5858585610d2e565b506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146105375761053246610f4f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a39087906114bd565b610af1565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106585760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106628282611017565b5050565b60606004805461043f9061143b565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146107205760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d42726964676500000000000000000000000000000000606482015260840161064f565b61066282826110f0565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107d45760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161064f565b6104f58286868403610af1565b6000336104d0818585610d2e565b834211156108645760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d697400000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866108be836114d0565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610929610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156109ed573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610a6857508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610ada5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e617475726500000000000000000000000000000000000000000000000000606482015260840161064f565b610ae58a8a8a610af1565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610b795760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8216610c025760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d285781811015610d1b5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161064f565b610d288484848403610af1565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610db75760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8216610e405760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610edc5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610d28565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610f7a610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff821661107a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161064f565b806002600082825461108c91906114bd565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166111795760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156112155760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610c64565b600060208083528351808285015260005b818110156112a557858101830151858201604001528201611289565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461130857600080fd5b919050565b6000806040838503121561132057600080fd5b611329836112e4565b946020939093013593505050565b60008060006060848603121561134c57600080fd5b611355846112e4565b9250611363602085016112e4565b9150604084013590509250925092565b60006020828403121561138557600080fd5b61138e826112e4565b9392505050565b600080600080600080600060e0888a0312156113b057600080fd5b6113b9886112e4565b96506113c7602089016112e4565b95506040880135945060608801359350608088013560ff811681146113eb57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561141b57600080fd5b611424836112e4565b9150611432602084016112e4565b90509250929050565b600181811c9082168061144f57607f821691505b602082108103611488577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d661148e565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036115015761150161148e565b506001019056fea2646970667358221220b49a146f369750b7055c494881ee723d063a73d92e8391e12d74eceb27ca91ef64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b6040516101919190611278565b60405180910390f35b6101ad6101a836600461130d565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad610204366004611337565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad61027736600461130d565b61055c565b61028f61028a36600461130d565b6105a8565b005b6101c161029f366004611373565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d5366004611373565b60056020526000908152604090205481565b610184610666565b61028f6102fd36600461130d565b610675565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c36600461130d565b61072a565b6101ad61036f36600461130d565b6107e1565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611395565b6107ef565b6101c16103bc366004611408565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f9061143b565b80601f016020809104026020016040519081016040528092919081815260200182805461046b9061143b565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610af1565b60019150505b92915050565b6000336104ea858285610c71565b6104f5858585610d2e565b506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146105375761053246610f4f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a39087906114bd565b610af1565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106585760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106628282611017565b5050565b60606004805461043f9061143b565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146107205760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d42726964676500000000000000000000000000000000606482015260840161064f565b61066282826110f0565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107d45760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161064f565b6104f58286868403610af1565b6000336104d0818585610d2e565b834211156108645760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d697400000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866108be836114d0565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610929610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156109ed573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610a6857508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610ada5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e617475726500000000000000000000000000000000000000000000000000606482015260840161064f565b610ae58a8a8a610af1565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610b795760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8216610c025760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d285781811015610d1b5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161064f565b610d288484848403610af1565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610db75760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8216610e405760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610edc5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610d28565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610f7a610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff821661107a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161064f565b806002600082825461108c91906114bd565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166111795760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156112155760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610c64565b600060208083528351808285015260005b818110156112a557858101830151858201604001528201611289565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461130857600080fd5b919050565b6000806040838503121561132057600080fd5b611329836112e4565b946020939093013593505050565b60008060006060848603121561134c57600080fd5b611355846112e4565b9250611363602085016112e4565b9150604084013590509250925092565b60006020828403121561138557600080fd5b61138e826112e4565b9392505050565b600080600080600080600060e0888a0312156113b057600080fd5b6113b9886112e4565b96506113c7602089016112e4565b95506040880135945060608801359350608088013560ff811681146113eb57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561141b57600080fd5b611424836112e4565b9150611432602084016112e4565b90509250929050565b600181811c9082168061144f57607f821691505b602082108103611488577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d661148e565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036115015761150161148e565b506001019056fea2646970667358221220b49a146f369750b7055c494881ee723d063a73d92e8391e12d74eceb27ca91ef64736f6c63430008140033", + "bytecode": "0x61010060405234801562000011575f80fd5b506040516200150a3803806200150a833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161106c6200049e5f395f61019e01525f818161025f0152818161047f01526104ed01525f61043101525f81816102c401526103fb015261106c5ff3fe608060405234801561000f575f80fd5b5060043610610105575f3560e01c806306fdde0314610109578063095ea7b31461012757806318160ddd1461014a57806320606b701461015c57806323b872dd1461017057806330adf81f14610183578063313ce567146101975780633644e515146101c857806339509351146101d057806340c10f19146101e357806370a08231146101f85780637ecebe001461022057806395d89b411461023f5780639dc29fac14610247578063a3c573eb1461025a578063a457c2d714610299578063a9059cbb146102ac578063cd0d0096146102bf578063d505accf146102e6578063dd62ed3e146102f9578063ffa1ad741461030c575b5f80fd5b61011161032c565b60405161011e9190610d8a565b60405180910390f35b61013a610135366004610df0565b6103bc565b604051901515815260200161011e565b6002545b60405190815260200161011e565b61014e5f8051602061101783398151915281565b61013a61017e366004610e18565b6103d5565b61014e5f80516020610ff783398151915281565b60405160ff7f000000000000000000000000000000000000000000000000000000000000000016815260200161011e565b61014e6103f8565b61013a6101de366004610df0565b610453565b6101f66101f1366004610df0565b610474565b005b61014e610206366004610e51565b6001600160a01b03165f9081526020819052604090205490565b61014e61022e366004610e51565b60056020525f908152604090205481565b6101116104d3565b6101f6610255366004610df0565b6104e2565b6102817f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161011e565b61013a6102a7366004610df0565b610534565b61013a6102ba366004610df0565b6105ae565b61014e7f000000000000000000000000000000000000000000000000000000000000000081565b6101f66102f4366004610e71565b6105bb565b61014e610307366004610ede565b6107de565b610111604051806040016040528060018152602001603160f81b81525081565b60606003805461033b90610f0f565b80601f016020809104026020016040519081016040528092919081815260200182805461036790610f0f565b80156103b25780601f10610389576101008083540402835291602001916103b2565b820191905f5260205f20905b81548152906001019060200180831161039557829003601f168201915b5050505050905090565b5f336103c9818585610808565b60019150505b92915050565b5f336103e285828561092c565b6103ed8585856109a4565b506001949350505050565b5f7f0000000000000000000000000000000000000000000000000000000000000000461461042e5761042946610b33565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b5f336103c981858561046583836107de565b61046f9190610f5b565b610808565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104c55760405162461bcd60e51b81526004016104bc90610f6e565b60405180910390fd5b6104cf8282610bcb565b5050565b60606004805461033b90610f0f565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461052a5760405162461bcd60e51b81526004016104bc90610f6e565b6104cf8282610c75565b5f338161054182866107de565b9050838110156105a15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104bc565b6103ed8286868403610808565b5f336103c98185856109a4565b834211156106175760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104bc565b6001600160a01b0387165f90815260056020526040812080545f80516020610ff7833981519152918a918a918a91908661065083610fbe565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6106ad6103f8565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f1981840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610735573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381161580159061076b5750896001600160a01b0316816001600160a01b0316145b6107c75760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104bc565b6107d28a8a8a610808565b50505050505050505050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661086a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104bc565b6001600160a01b0382166108cb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104bc565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b5f61093784846107de565b90505f19811461099e57818110156109915760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104bc565b61099e8484848403610808565b50505050565b6001600160a01b038316610a085760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104bc565b6001600160a01b038216610a6a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104bc565b6001600160a01b0383165f9081526020819052604090205481811015610ae15760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104bc565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290925f80516020610fd7833981519152910160405180910390a361099e565b5f5f80516020611017833981519152610b4a61032c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c215760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104bc565b8060025f828254610c329190610f5b565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481525f80516020610fd7833981519152910160405180910390a35050565b6001600160a01b038216610cd55760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104bc565b6001600160a01b0382165f9081526020819052604090205481811015610d485760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104bc565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192915f80516020610fd7833981519152910161091f565b5f6020808352835180828501525f5b81811015610db557858101830151858201604001528201610d99565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610deb575f80fd5b919050565b5f8060408385031215610e01575f80fd5b610e0a83610dd5565b946020939093013593505050565b5f805f60608486031215610e2a575f80fd5b610e3384610dd5565b9250610e4160208501610dd5565b9150604084013590509250925092565b5f60208284031215610e61575f80fd5b610e6a82610dd5565b9392505050565b5f805f805f805f60e0888a031215610e87575f80fd5b610e9088610dd5565b9650610e9e60208901610dd5565b95506040880135945060608801359350608088013560ff81168114610ec1575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215610eef575f80fd5b610ef883610dd5565b9150610f0660208401610dd5565b90509250929050565b600181811c90821680610f2357607f821691505b602082108103610f4157634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156103cf576103cf610f47565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b5f60018201610fcf57610fcf610f47565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa26469706673582212206c12be332dd873b7cf88c58dfc4762858b63e8ff3bf8563b47828a5a4272643b64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610105575f3560e01c806306fdde0314610109578063095ea7b31461012757806318160ddd1461014a57806320606b701461015c57806323b872dd1461017057806330adf81f14610183578063313ce567146101975780633644e515146101c857806339509351146101d057806340c10f19146101e357806370a08231146101f85780637ecebe001461022057806395d89b411461023f5780639dc29fac14610247578063a3c573eb1461025a578063a457c2d714610299578063a9059cbb146102ac578063cd0d0096146102bf578063d505accf146102e6578063dd62ed3e146102f9578063ffa1ad741461030c575b5f80fd5b61011161032c565b60405161011e9190610d8a565b60405180910390f35b61013a610135366004610df0565b6103bc565b604051901515815260200161011e565b6002545b60405190815260200161011e565b61014e5f8051602061101783398151915281565b61013a61017e366004610e18565b6103d5565b61014e5f80516020610ff783398151915281565b60405160ff7f000000000000000000000000000000000000000000000000000000000000000016815260200161011e565b61014e6103f8565b61013a6101de366004610df0565b610453565b6101f66101f1366004610df0565b610474565b005b61014e610206366004610e51565b6001600160a01b03165f9081526020819052604090205490565b61014e61022e366004610e51565b60056020525f908152604090205481565b6101116104d3565b6101f6610255366004610df0565b6104e2565b6102817f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161011e565b61013a6102a7366004610df0565b610534565b61013a6102ba366004610df0565b6105ae565b61014e7f000000000000000000000000000000000000000000000000000000000000000081565b6101f66102f4366004610e71565b6105bb565b61014e610307366004610ede565b6107de565b610111604051806040016040528060018152602001603160f81b81525081565b60606003805461033b90610f0f565b80601f016020809104026020016040519081016040528092919081815260200182805461036790610f0f565b80156103b25780601f10610389576101008083540402835291602001916103b2565b820191905f5260205f20905b81548152906001019060200180831161039557829003601f168201915b5050505050905090565b5f336103c9818585610808565b60019150505b92915050565b5f336103e285828561092c565b6103ed8585856109a4565b506001949350505050565b5f7f0000000000000000000000000000000000000000000000000000000000000000461461042e5761042946610b33565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b5f336103c981858561046583836107de565b61046f9190610f5b565b610808565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104c55760405162461bcd60e51b81526004016104bc90610f6e565b60405180910390fd5b6104cf8282610bcb565b5050565b60606004805461033b90610f0f565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461052a5760405162461bcd60e51b81526004016104bc90610f6e565b6104cf8282610c75565b5f338161054182866107de565b9050838110156105a15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104bc565b6103ed8286868403610808565b5f336103c98185856109a4565b834211156106175760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104bc565b6001600160a01b0387165f90815260056020526040812080545f80516020610ff7833981519152918a918a918a91908661065083610fbe565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6106ad6103f8565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f1981840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610735573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381161580159061076b5750896001600160a01b0316816001600160a01b0316145b6107c75760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104bc565b6107d28a8a8a610808565b50505050505050505050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661086a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104bc565b6001600160a01b0382166108cb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104bc565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b5f61093784846107de565b90505f19811461099e57818110156109915760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104bc565b61099e8484848403610808565b50505050565b6001600160a01b038316610a085760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104bc565b6001600160a01b038216610a6a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104bc565b6001600160a01b0383165f9081526020819052604090205481811015610ae15760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104bc565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290925f80516020610fd7833981519152910160405180910390a361099e565b5f5f80516020611017833981519152610b4a61032c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c215760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104bc565b8060025f828254610c329190610f5b565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481525f80516020610fd7833981519152910160405180910390a35050565b6001600160a01b038216610cd55760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104bc565b6001600160a01b0382165f9081526020819052604090205481811015610d485760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104bc565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192915f80516020610fd7833981519152910161091f565b5f6020808352835180828501525f5b81811015610db557858101830151858201604001528201610d99565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610deb575f80fd5b919050565b5f8060408385031215610e01575f80fd5b610e0a83610dd5565b946020939093013593505050565b5f805f60608486031215610e2a575f80fd5b610e3384610dd5565b9250610e4160208501610dd5565b9150604084013590509250925092565b5f60208284031215610e61575f80fd5b610e6a82610dd5565b9392505050565b5f805f805f805f60e0888a031215610e87575f80fd5b610e9088610dd5565b9650610e9e60208901610dd5565b95506040880135945060608801359350608088013560ff81168114610ec1575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215610eef575f80fd5b610ef883610dd5565b9150610f0660208401610dd5565b90509250929050565b600181811c90821680610f2357607f821691505b602082108103610f4157634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156103cf576103cf610f47565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b5f60018201610fcf57610fcf610f47565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa26469706673582212206c12be332dd873b7cf88c58dfc4762858b63e8ff3bf8563b47828a5a4272643b64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/TransparentUpgradeableProxy.json b/compiled-contracts/paris/TransparentUpgradeableProxy.json index e65330111..4947597b4 100644 --- a/compiled-contracts/paris/TransparentUpgradeableProxy.json +++ b/compiled-contracts/paris/TransparentUpgradeableProxy.json @@ -148,8 +148,8 @@ "type": "receive" } ], - "bytecode": "0x608060405260405162000fa938038062000fa9833981016040819052620000269162000424565b828162000036828260006200004d565b50620000449050826200007f565b50505062000557565b6200005883620000f1565b600082511180620000665750805b156200007a5762000078838362000133565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620000c160008051602062000f62833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620000ee8162000162565b50565b620000fc8162000200565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200015b838360405180606001604052806027815260200162000f826027913962000297565b9392505050565b6001600160a01b038116620001cd5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b8060008051602062000f628339815191525b80546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b0381163b6200026f5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401620001c4565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc620001df565b6060600080856001600160a01b031685604051620002b6919062000504565b600060405180830381855af49150503d8060008114620002f3576040519150601f19603f3d011682016040523d82523d6000602084013e620002f8565b606091505b5090925090506200030c8683838762000316565b9695505050505050565b606083156200038a57825160000362000382576001600160a01b0385163b620003825760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620001c4565b508162000396565b6200039683836200039e565b949350505050565b815115620003af5781518083602001fd5b8060405162461bcd60e51b8152600401620001c4919062000522565b80516001600160a01b0381168114620003e357600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200041b57818101518382015260200162000401565b50506000910152565b6000806000606084860312156200043a57600080fd5b6200044584620003cb565b92506200045560208501620003cb565b60408501519092506001600160401b03808211156200047357600080fd5b818601915086601f8301126200048857600080fd5b8151818111156200049d576200049d620003e8565b604051601f8201601f19908116603f01168101908382118183101715620004c857620004c8620003e8565b81604052828152896020848701011115620004e257600080fd5b620004f5836020830160208801620003fe565b80955050505050509250925092565b6000825162000518818460208701620003fe565b9190910192915050565b602081526000825180602084015262000543816040850160208701620003fe565b601f01601f19169190910160400192915050565b6109fb80620005676000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100a85780638f283970146100e6578063f851a440146101065761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61011b565b005b61006b61011b565b34801561008157600080fd5b5061006b61009036600461086f565b610135565b61006b6100a336600461088a565b61017f565b3480156100b457600080fd5b506100bd6101f3565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b5061006b61010136600461086f565b610231565b34801561011257600080fd5b506100bd61025e565b61012361028c565b61013361012e610363565b61036d565b565b61013d610391565b73ffffffffffffffffffffffffffffffffffffffff16330361017757610174816040518060200160405280600081525060006103d1565b50565b61017461011b565b610187610391565b73ffffffffffffffffffffffffffffffffffffffff1633036101eb576101e68383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250600192506103d1915050565b505050565b6101e661011b565b60006101fd610391565b73ffffffffffffffffffffffffffffffffffffffff16330361022657610221610363565b905090565b61022e61011b565b90565b610239610391565b73ffffffffffffffffffffffffffffffffffffffff16330361017757610174816103fc565b6000610268610391565b73ffffffffffffffffffffffffffffffffffffffff16330361022657610221610391565b610294610391565b73ffffffffffffffffffffffffffffffffffffffff163303610133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600061022161045d565b3660008037600080366000845af43d6000803e80801561038c573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b6103da83610485565b6000825111806103e75750805b156101e6576103f683836104d2565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f610425610391565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a1610174816104fe565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103b5565b61048e8161060a565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606104f7838360405180606001604052806027815260200161099f602791396106d5565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81166105a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035a565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b73ffffffffffffffffffffffffffffffffffffffff81163b6106ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e747261637400000000000000000000000000000000000000606482015260840161035a565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105c4565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516106ff9190610931565b600060405180830381855af49150503d806000811461073a576040519150601f19603f3d011682016040523d82523d6000602084013e61073f565b606091505b50915091506107508683838761075a565b9695505050505050565b606083156107f05782516000036107e95773ffffffffffffffffffffffffffffffffffffffff85163b6107e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161035a565b50816107fa565b6107fa8383610802565b949350505050565b8151156108125781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035a919061094d565b803573ffffffffffffffffffffffffffffffffffffffff8116811461086a57600080fd5b919050565b60006020828403121561088157600080fd5b6104f782610846565b60008060006040848603121561089f57600080fd5b6108a884610846565b9250602084013567ffffffffffffffff808211156108c557600080fd5b818601915086601f8301126108d957600080fd5b8135818111156108e857600080fd5b8760208285010111156108fa57600080fd5b6020830194508093505050509250925092565b60005b83811015610928578181015183820152602001610910565b50506000910152565b6000825161094381846020870161090d565b9190910192915050565b602081526000825180602084015261096c81604085016020870161090d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220701a0c26bdd76686e63fc3c65e4f28a20ba3ecc8a60246733c0627e679c9804e64736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", - "deployedBytecode": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100a85780638f283970146100e6578063f851a440146101065761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61011b565b005b61006b61011b565b34801561008157600080fd5b5061006b61009036600461086f565b610135565b61006b6100a336600461088a565b61017f565b3480156100b457600080fd5b506100bd6101f3565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b5061006b61010136600461086f565b610231565b34801561011257600080fd5b506100bd61025e565b61012361028c565b61013361012e610363565b61036d565b565b61013d610391565b73ffffffffffffffffffffffffffffffffffffffff16330361017757610174816040518060200160405280600081525060006103d1565b50565b61017461011b565b610187610391565b73ffffffffffffffffffffffffffffffffffffffff1633036101eb576101e68383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250600192506103d1915050565b505050565b6101e661011b565b60006101fd610391565b73ffffffffffffffffffffffffffffffffffffffff16330361022657610221610363565b905090565b61022e61011b565b90565b610239610391565b73ffffffffffffffffffffffffffffffffffffffff16330361017757610174816103fc565b6000610268610391565b73ffffffffffffffffffffffffffffffffffffffff16330361022657610221610391565b610294610391565b73ffffffffffffffffffffffffffffffffffffffff163303610133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600061022161045d565b3660008037600080366000845af43d6000803e80801561038c573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b6103da83610485565b6000825111806103e75750805b156101e6576103f683836104d2565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f610425610391565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a1610174816104fe565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103b5565b61048e8161060a565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606104f7838360405180606001604052806027815260200161099f602791396106d5565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81166105a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035a565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b73ffffffffffffffffffffffffffffffffffffffff81163b6106ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e747261637400000000000000000000000000000000000000606482015260840161035a565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105c4565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516106ff9190610931565b600060405180830381855af49150503d806000811461073a576040519150601f19603f3d011682016040523d82523d6000602084013e61073f565b606091505b50915091506107508683838761075a565b9695505050505050565b606083156107f05782516000036107e95773ffffffffffffffffffffffffffffffffffffffff85163b6107e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161035a565b50816107fa565b6107fa8383610802565b949350505050565b8151156108125781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035a919061094d565b803573ffffffffffffffffffffffffffffffffffffffff8116811461086a57600080fd5b919050565b60006020828403121561088157600080fd5b6104f782610846565b60008060006040848603121561089f57600080fd5b6108a884610846565b9250602084013567ffffffffffffffff808211156108c557600080fd5b818601915086601f8301126108d957600080fd5b8135818111156108e857600080fd5b8760208285010111156108fa57600080fd5b6020830194508093505050509250925092565b60005b83811015610928578181015183820152602001610910565b50506000910152565b6000825161094381846020870161090d565b9190910192915050565b602081526000825180602084015261096c81604085016020870161090d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220701a0c26bdd76686e63fc3c65e4f28a20ba3ecc8a60246733c0627e679c9804e64736f6c63430008140033", + "bytecode": "0x608060405260405162000d8c38038062000d8c833981016040819052620000269162000415565b82816200003582825f6200004c565b50620000439050826200007d565b50505062000540565b6200005783620000ee565b5f82511180620000645750805b1562000078576200007683836200012f565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620000be5f8051602062000d45833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620000eb816200015e565b50565b620000f981620001fb565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b606062000157838360405180606001604052806027815260200162000d656027913962000292565b9392505050565b6001600160a01b038116620001c95760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b805f8051602062000d458339815191525b80546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b0381163b6200026a5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401620001c0565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc620001da565b60605f80856001600160a01b031685604051620002b09190620004ef565b5f60405180830381855af49150503d805f8114620002ea576040519150601f19603f3d011682016040523d82523d5f602084013e620002ef565b606091505b50909250905062000303868383876200030d565b9695505050505050565b60608315620003805782515f0362000378576001600160a01b0385163b620003785760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620001c0565b50816200038c565b6200038c838362000394565b949350505050565b815115620003a55781518083602001fd5b8060405162461bcd60e51b8152600401620001c091906200050c565b80516001600160a01b0381168114620003d8575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b838110156200040d578181015183820152602001620003f3565b50505f910152565b5f805f6060848603121562000428575f80fd5b6200043384620003c1565b92506200044360208501620003c1565b60408501519092506001600160401b038082111562000460575f80fd5b818601915086601f83011262000474575f80fd5b815181811115620004895762000489620003dd565b604051601f8201601f19908116603f01168101908382118183101715620004b457620004b4620003dd565b81604052828152896020848701011115620004cd575f80fd5b620004e0836020830160208801620003f1565b80955050505050509250925092565b5f825162000502818460208701620003f1565b9190910192915050565b602081525f82518060208401526200052c816040850160208701620003f1565b601f01601f19169190910160400192915050565b6107f7806200054e5f395ff3fe60806040526004361061004d575f3560e01c80633659cfe6146100645780634f1ef286146100835780635c60da1b146100965780638f283970146100c6578063f851a440146100e55761005c565b3661005c5761005a6100f9565b005b61005a6100f9565b34801561006f575f80fd5b5061005a61007e366004610657565b610113565b61005a610091366004610670565b61014e565b3480156100a1575f80fd5b506100aa6101b4565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d1575f80fd5b5061005a6100e0366004610657565b6101e4565b3480156100f0575f80fd5b506100aa610204565b610101610224565b61011161010c6102b9565b6102c2565b565b61011b6102e0565b6001600160a01b03163303610146576101438160405180602001604052805f8152505f6102ff565b50565b6101436100f9565b6101566102e0565b6001600160a01b031633036101ac576101a78383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250600192506102ff915050565b505050565b6101a76100f9565b5f6101bd6102e0565b6001600160a01b031633036101d9576101d46102b9565b905090565b6101e16100f9565b90565b6101ec6102e0565b6001600160a01b031633036101465761014381610329565b5f61020d6102e0565b6001600160a01b031633036101d9576101d46102e0565b61022c6102e0565b6001600160a01b031633036101115760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b5f6101d461037d565b365f80375f80365f845af43d5f803e8080156102dc573d5ff35b3d5ffd5b5f5f8051602061075b8339815191525b546001600160a01b0316919050565b61030883610391565b5f825111806103145750805b156101a75761032383836103d0565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103526102e0565b604080516001600160a01b03928316815291841660208301520160405180910390a1610143816103fc565b5f5f8051602061077b8339815191526102f0565b61039a81610492565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606103f5838360405180606001604052806027815260200161079b60279139610511565b9392505050565b6001600160a01b0381166104615760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084016102b0565b805f8051602061075b8339815191525b80546001600160a01b0319166001600160a01b039290921691909117905550565b61049b81610585565b6104fd5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016102b0565b805f8051602061077b833981519152610471565b60605f80856001600160a01b03168560405161052d919061070d565b5f60405180830381855af49150503d805f8114610565576040519150601f19603f3d011682016040523d82523d5f602084013e61056a565b606091505b509150915061057b86838387610594565b9695505050505050565b6001600160a01b03163b151590565b606083156106005782515f036105f9576105ad85610585565b6105f95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102b0565b508161060a565b61060a8383610612565b949350505050565b8151156106225781518083602001fd5b8060405162461bcd60e51b81526004016102b09190610728565b80356001600160a01b0381168114610652575f80fd5b919050565b5f60208284031215610667575f80fd5b6103f58261063c565b5f805f60408486031215610682575f80fd5b61068b8461063c565b925060208401356001600160401b03808211156106a6575f80fd5b818601915086601f8301126106b9575f80fd5b8135818111156106c7575f80fd5b8760208285010111156106d8575f80fd5b6020830194508093505050509250925092565b5f5b838110156107055781810151838201526020016106ed565b50505f910152565b5f825161071e8184602087016106eb565b9190910192915050565b602081525f82518060208401526107468160408501602087016106eb565b601f01601f1916919091016040019291505056feb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220858d5e7a5b708b0c65136243a37bf0ca32473b7a684fc9d907aa577e829d236e64736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "deployedBytecode": "0x60806040526004361061004d575f3560e01c80633659cfe6146100645780634f1ef286146100835780635c60da1b146100965780638f283970146100c6578063f851a440146100e55761005c565b3661005c5761005a6100f9565b005b61005a6100f9565b34801561006f575f80fd5b5061005a61007e366004610657565b610113565b61005a610091366004610670565b61014e565b3480156100a1575f80fd5b506100aa6101b4565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d1575f80fd5b5061005a6100e0366004610657565b6101e4565b3480156100f0575f80fd5b506100aa610204565b610101610224565b61011161010c6102b9565b6102c2565b565b61011b6102e0565b6001600160a01b03163303610146576101438160405180602001604052805f8152505f6102ff565b50565b6101436100f9565b6101566102e0565b6001600160a01b031633036101ac576101a78383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250600192506102ff915050565b505050565b6101a76100f9565b5f6101bd6102e0565b6001600160a01b031633036101d9576101d46102b9565b905090565b6101e16100f9565b90565b6101ec6102e0565b6001600160a01b031633036101465761014381610329565b5f61020d6102e0565b6001600160a01b031633036101d9576101d46102e0565b61022c6102e0565b6001600160a01b031633036101115760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b5f6101d461037d565b365f80375f80365f845af43d5f803e8080156102dc573d5ff35b3d5ffd5b5f5f8051602061075b8339815191525b546001600160a01b0316919050565b61030883610391565b5f825111806103145750805b156101a75761032383836103d0565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103526102e0565b604080516001600160a01b03928316815291841660208301520160405180910390a1610143816103fc565b5f5f8051602061077b8339815191526102f0565b61039a81610492565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606103f5838360405180606001604052806027815260200161079b60279139610511565b9392505050565b6001600160a01b0381166104615760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084016102b0565b805f8051602061075b8339815191525b80546001600160a01b0319166001600160a01b039290921691909117905550565b61049b81610585565b6104fd5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016102b0565b805f8051602061077b833981519152610471565b60605f80856001600160a01b03168560405161052d919061070d565b5f60405180830381855af49150503d805f8114610565576040519150601f19603f3d011682016040523d82523d5f602084013e61056a565b606091505b509150915061057b86838387610594565b9695505050505050565b6001600160a01b03163b151590565b606083156106005782515f036105f9576105ad85610585565b6105f95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102b0565b508161060a565b61060a8383610612565b949350505050565b8151156106225781518083602001fd5b8060405162461bcd60e51b81526004016102b09190610728565b80356001600160a01b0381168114610652575f80fd5b919050565b5f60208284031215610667575f80fd5b6103f58261063c565b5f805f60408486031215610682575f80fd5b61068b8461063c565b925060208401356001600160401b03808211156106a6575f80fd5b818601915086601f8301126106b9575f80fd5b8135818111156106c7575f80fd5b8760208285010111156106d8575f80fd5b6020830194508093505050509250925092565b5f5b838110156107055781810151838201526020016106ed565b50505f910152565b5f825161071e8184602087016106eb565b9190910192915050565b602081525f82518060208401526107468160408501602087016106eb565b601f01601f1916919091016040019291505056feb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220858d5e7a5b708b0c65136243a37bf0ca32473b7a684fc9d907aa577e829d236e64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/VerifierRollupHelperMock.json b/compiled-contracts/paris/VerifierRollupHelperMock.json index b2751e2b5..64b38070b 100644 --- a/compiled-contracts/paris/VerifierRollupHelperMock.json +++ b/compiled-contracts/paris/VerifierRollupHelperMock.json @@ -28,8 +28,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50610158806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80639121da8a14610030575b600080fd5b61004661003e366004610089565b600192915050565b604051901515815260200160405180910390f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008061032080848603121561009e57600080fd5b6103008401858111156100b057600080fd5b8493508561031f8601126100c357600080fd5b604051602080820182811067ffffffffffffffff821117156100e7576100e761005a565b6040529286019281888511156100fc57600080fd5b5b8484101561011457833581529281019281016100fd565b50949790965094505050505056fea264697066735822122061fd8311ce6da82f24c0874a992ea14a8aaf711e353693cae56066e3223abc5a64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80639121da8a14610030575b600080fd5b61004661003e366004610089565b600192915050565b604051901515815260200160405180910390f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008061032080848603121561009e57600080fd5b6103008401858111156100b057600080fd5b8493508561031f8601126100c357600080fd5b604051602080820182811067ffffffffffffffff821117156100e7576100e761005a565b6040529286019281888511156100fc57600080fd5b5b8484101561011457833581529281019281016100fd565b50949790965094505050505056fea264697066735822122061fd8311ce6da82f24c0874a992ea14a8aaf711e353693cae56066e3223abc5a64736f6c63430008140033", + "bytecode": "0x608060405234801561000f575f80fd5b506101258061001d5f395ff3fe6080604052348015600e575f80fd5b50600436106026575f3560e01c80639121da8a14602a575b5f80fd5b603d60353660046065565b600192915050565b604051901515815260200160405180910390f35b634e487b7160e01b5f52604160045260245ffd5b5f806103208084860312156077575f80fd5b6103008401858111156087575f80fd5b8493508561031f8601126098575f80fd5b60405160208082016001600160401b038111838210171560b85760b86051565b60405292860192818885111560cb575f80fd5b5b8484101560e1578335815292810192810160cc565b50949790965094505050505056fea2646970667358221220619aeb02f8f540d5e45b1463521ffa47f214050fd4290a99f2fe93e7be61c73164736f6c63430008140033", + "deployedBytecode": "0x6080604052348015600e575f80fd5b50600436106026575f3560e01c80639121da8a14602a575b5f80fd5b603d60353660046065565b600192915050565b604051901515815260200160405180910390f35b634e487b7160e01b5f52604160045260245ffd5b5f806103208084860312156077575f80fd5b6103008401858111156087575f80fd5b8493508561031f8601126098575f80fd5b60405160208082016001600160401b038111838210171560b85760b86051565b60405292860192818885111560cb575f80fd5b5b8484101560e1578335815292810192810160cc565b50949790965094505050505056fea2646970667358221220619aeb02f8f540d5e45b1463521ffa47f214050fd4290a99f2fe93e7be61c73164736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } From f88c1413e86c5018cc99c4170c05d5f7dd9bc739 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 17 Oct 2023 19:08:44 +0200 Subject: [PATCH 074/230] update paris contracts --- compiled-contracts/paris/ERC20PermitMock.json | 4 ++-- compiled-contracts/paris/FflonkVerifier.json | 4 ++-- compiled-contracts/paris/PolygonDataComittee.json | 4 ++-- compiled-contracts/paris/PolygonRollupManager.json | 4 ++-- compiled-contracts/paris/PolygonZkEVM.json | 4 ++-- compiled-contracts/paris/PolygonZkEVMBridge.json | 4 ++-- compiled-contracts/paris/PolygonZkEVMBridgeMock.json | 4 ++-- compiled-contracts/paris/PolygonZkEVMBridgeV2.json | 4 ++-- compiled-contracts/paris/PolygonZkEVMDeployer.json | 4 ++-- compiled-contracts/paris/PolygonZkEVMGlobalExitRoot.json | 4 ++-- compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2.json | 4 ++-- .../paris/PolygonZkEVMGlobalExitRootL2Mock.json | 4 ++-- compiled-contracts/paris/PolygonZkEVMGlobalExitRootMock.json | 4 ++-- compiled-contracts/paris/PolygonZkEVMGlobalExitRootV2.json | 4 ++-- compiled-contracts/paris/PolygonZkEVMMock.json | 4 ++-- compiled-contracts/paris/PolygonZkEVMTimelock.json | 4 ++-- compiled-contracts/paris/PolygonZkEVMV2.json | 4 ++-- compiled-contracts/paris/PolygonZkEVMV2Existent.json | 4 ++-- compiled-contracts/paris/ProxyAdmin.json | 4 ++-- compiled-contracts/paris/TokenWrapped.json | 4 ++-- compiled-contracts/paris/TransparentUpgradeableProxy.json | 4 ++-- compiled-contracts/paris/VerifierRollupHelperMock.json | 4 ++-- 22 files changed, 44 insertions(+), 44 deletions(-) diff --git a/compiled-contracts/paris/ERC20PermitMock.json b/compiled-contracts/paris/ERC20PermitMock.json index 93b5eddf6..2fe791c2e 100644 --- a/compiled-contracts/paris/ERC20PermitMock.json +++ b/compiled-contracts/paris/ERC20PermitMock.json @@ -517,8 +517,8 @@ "type": "function" } ], - "bytecode": "0x60806040526040516200137d3803806200137d8339810160408190526200002691620001f8565b8383600362000036838262000310565b50600462000045828262000310565b5050506200005a82826200007160201b60201c565b5050815160209092019190912060065550620003fe565b6001600160a01b038216620000cc5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060025f828254620000df9190620003d8565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126200015e575f80fd5b81516001600160401b03808211156200017b576200017b6200013a565b604051601f8301601f19908116603f01168101908282118183101715620001a657620001a66200013a565b81604052838152602092508683858801011115620001c2575f80fd5b5f91505b83821015620001e55785820183015181830184015290820190620001c6565b5f93810190920192909252949350505050565b5f805f80608085870312156200020c575f80fd5b84516001600160401b038082111562000223575f80fd5b62000231888389016200014e565b9550602087015191508082111562000247575f80fd5b5062000256878288016200014e565b604087015190945090506001600160a01b038116811462000275575f80fd5b6060959095015193969295505050565b600181811c908216806200029a57607f821691505b602082108103620002b957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000135575f81815260208120601f850160051c81016020861015620002e75750805b601f850160051c820191505b818110156200030857828155600101620002f3565b505050505050565b81516001600160401b038111156200032c576200032c6200013a565b62000344816200033d845462000285565b84620002bf565b602080601f8311600181146200037a575f8415620003625750858301515b5f19600386901b1c1916600185901b17855562000308565b5f85815260208120601f198616915b82811015620003aa5788860151825594840194600190910190840162000389565b5085821015620003c857878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115620003f857634e487b7160e01b5f52601160045260245ffd5b92915050565b610f71806200040c5f395ff3fe608060405234801561000f575f80fd5b506004361061011b575f3560e01c806304622c2e1461011f57806306fdde031461013b578063095ea7b31461015057806318160ddd14610173578063222f5be01461017b57806323b872dd1461019057806330adf81f146101a3578063313ce567146101b75780633408e470146101c65780633644e515146101cc57806339509351146101d457806340c10f19146101e757806342966c68146101fa57806356189cb41461020d57806370a08231146102205780637ecebe001461024857806395d89b41146102675780639e4e73181461026f578063a457c2d714610283578063a9059cbb14610296578063c473af33146102a9578063d505accf146102bd578063dd62ed3e146102d0575b5f80fd5b61012860065481565b6040519081526020015b60405180910390f35b6101436102e3565b6040516101329190610c7c565b61016361015e366004610ce2565b610373565b6040519015158152602001610132565b600254610128565b61018e610189366004610d0a565b61038c565b005b61016361019e366004610d0a565b61039c565b6101285f80516020610efc83398151915281565b60405160128152602001610132565b46610128565b6101286103bf565b6101636101e2366004610ce2565b610411565b61018e6101f5366004610ce2565b610432565b61018e610208366004610d43565b610440565b61018e61021b366004610d0a565b61044d565b61012861022e366004610d5a565b6001600160a01b03165f9081526020819052604090205490565b610128610256366004610d5a565b60056020525f908152604090205481565b610143610458565b6101285f80516020610ebc83398151915281565b610163610291366004610ce2565b610467565b6101636102a4366004610ce2565b6104e6565b6101285f80516020610f1c83398151915281565b61018e6102cb366004610d7a565b6104f3565b6101286102de366004610de7565b6105ee565b6060600380546102f290610e18565b80601f016020809104026020016040519081016040528092919081815260200182805461031e90610e18565b80156103695780601f1061034057610100808354040283529160200191610369565b820191905f5260205f20905b81548152906001019060200180831161034c57829003601f168201915b5050505050905090565b5f33610380818585610618565b60019150505b92915050565b61039783838361073b565b505050565b5f336103a98582856108cc565b6103b485858561073b565b506001949350505050565b6006546040515f916103f6915f80516020610f1c83398151915291905f80516020610ebc8339815191529046903090602001610e50565b60405160208183030381529060405280519060200120905090565b5f3361038081858561042383836105ee565b61042d9190610e90565b610618565b61043c828261093e565b5050565b61044a33826109e8565b50565b610397838383610618565b6060600480546102f290610e18565b5f338161047482866105ee565b9050838110156104d95760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b6103b48286868403610618565b5f3361038081858561073b565b4284101561053f5760405162461bcd60e51b81526020600482015260196024820152781211568e8e9c195c9b5a5d0e881055551217d1561412549151603a1b60448201526064016104d0565b6001600160a01b0387165f90815260056020526040812080545f80516020610efc833981519152918a918a918a91908661057883610ea3565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506105d98882868686610b05565b6105e4888888610618565b5050505050505050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661067a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104d0565b6001600160a01b0382166106db5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104d0565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661079f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104d0565b6001600160a01b0382166108015760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104d0565b6001600160a01b0383165f90815260208190526040902054818110156108785760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104d0565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290925f80516020610edc833981519152910160405180910390a35b50505050565b5f6108d784846105ee565b90505f1981146108c657818110156109315760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104d0565b6108c68484848403610618565b6001600160a01b0382166109945760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104d0565b8060025f8282546109a59190610e90565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481525f80516020610edc833981519152910160405180910390a35050565b6001600160a01b038216610a485760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104d0565b6001600160a01b0382165f9081526020819052604090205481811015610abb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104d0565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192915f80516020610edc833981519152910160405180910390a3505050565b6006546040515f91610b3c915f80516020610f1c83398151915291905f80516020610ebc8339815191529046903090602001610e50565b6040516020818303038152906040528051906020012090505f8186604051602001610b7e92919061190160f01b81526002810192909252602282015260420190565b60408051601f1981840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610be6573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811615801590610c1c5750876001600160a01b0316816001600160a01b0316145b6105e45760405162461bcd60e51b815260206004820152602b60248201527f48455a3a3a5f76616c69646174655369676e6564446174613a20494e56414c4960448201526a445f5349474e415455524560a81b60648201526084016104d0565b5f6020808352835180828501525f5b81811015610ca757858101830151858201604001528201610c8b565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610cdd575f80fd5b919050565b5f8060408385031215610cf3575f80fd5b610cfc83610cc7565b946020939093013593505050565b5f805f60608486031215610d1c575f80fd5b610d2584610cc7565b9250610d3360208501610cc7565b9150604084013590509250925092565b5f60208284031215610d53575f80fd5b5035919050565b5f60208284031215610d6a575f80fd5b610d7382610cc7565b9392505050565b5f805f805f805f60e0888a031215610d90575f80fd5b610d9988610cc7565b9650610da760208901610cc7565b95506040880135945060608801359350608088013560ff81168114610dca575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215610df8575f80fd5b610e0183610cc7565b9150610e0f60208401610cc7565b90509250929050565b600181811c90821680610e2c57607f821691505b602082108103610e4a57634e487b7160e01b5f52602260045260245ffd5b50919050565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561038657610386610e7c565b5f60018201610eb457610eb4610e7c565b506001019056fec89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa2646970667358221220e5557a8268dd346c07f8a97c7a37ab3faa7459a4309c313d2cabd53b00face4964736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061011b575f3560e01c806304622c2e1461011f57806306fdde031461013b578063095ea7b31461015057806318160ddd14610173578063222f5be01461017b57806323b872dd1461019057806330adf81f146101a3578063313ce567146101b75780633408e470146101c65780633644e515146101cc57806339509351146101d457806340c10f19146101e757806342966c68146101fa57806356189cb41461020d57806370a08231146102205780637ecebe001461024857806395d89b41146102675780639e4e73181461026f578063a457c2d714610283578063a9059cbb14610296578063c473af33146102a9578063d505accf146102bd578063dd62ed3e146102d0575b5f80fd5b61012860065481565b6040519081526020015b60405180910390f35b6101436102e3565b6040516101329190610c7c565b61016361015e366004610ce2565b610373565b6040519015158152602001610132565b600254610128565b61018e610189366004610d0a565b61038c565b005b61016361019e366004610d0a565b61039c565b6101285f80516020610efc83398151915281565b60405160128152602001610132565b46610128565b6101286103bf565b6101636101e2366004610ce2565b610411565b61018e6101f5366004610ce2565b610432565b61018e610208366004610d43565b610440565b61018e61021b366004610d0a565b61044d565b61012861022e366004610d5a565b6001600160a01b03165f9081526020819052604090205490565b610128610256366004610d5a565b60056020525f908152604090205481565b610143610458565b6101285f80516020610ebc83398151915281565b610163610291366004610ce2565b610467565b6101636102a4366004610ce2565b6104e6565b6101285f80516020610f1c83398151915281565b61018e6102cb366004610d7a565b6104f3565b6101286102de366004610de7565b6105ee565b6060600380546102f290610e18565b80601f016020809104026020016040519081016040528092919081815260200182805461031e90610e18565b80156103695780601f1061034057610100808354040283529160200191610369565b820191905f5260205f20905b81548152906001019060200180831161034c57829003601f168201915b5050505050905090565b5f33610380818585610618565b60019150505b92915050565b61039783838361073b565b505050565b5f336103a98582856108cc565b6103b485858561073b565b506001949350505050565b6006546040515f916103f6915f80516020610f1c83398151915291905f80516020610ebc8339815191529046903090602001610e50565b60405160208183030381529060405280519060200120905090565b5f3361038081858561042383836105ee565b61042d9190610e90565b610618565b61043c828261093e565b5050565b61044a33826109e8565b50565b610397838383610618565b6060600480546102f290610e18565b5f338161047482866105ee565b9050838110156104d95760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b6103b48286868403610618565b5f3361038081858561073b565b4284101561053f5760405162461bcd60e51b81526020600482015260196024820152781211568e8e9c195c9b5a5d0e881055551217d1561412549151603a1b60448201526064016104d0565b6001600160a01b0387165f90815260056020526040812080545f80516020610efc833981519152918a918a918a91908661057883610ea3565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506105d98882868686610b05565b6105e4888888610618565b5050505050505050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661067a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104d0565b6001600160a01b0382166106db5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104d0565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661079f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104d0565b6001600160a01b0382166108015760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104d0565b6001600160a01b0383165f90815260208190526040902054818110156108785760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104d0565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290925f80516020610edc833981519152910160405180910390a35b50505050565b5f6108d784846105ee565b90505f1981146108c657818110156109315760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104d0565b6108c68484848403610618565b6001600160a01b0382166109945760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104d0565b8060025f8282546109a59190610e90565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481525f80516020610edc833981519152910160405180910390a35050565b6001600160a01b038216610a485760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104d0565b6001600160a01b0382165f9081526020819052604090205481811015610abb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104d0565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192915f80516020610edc833981519152910160405180910390a3505050565b6006546040515f91610b3c915f80516020610f1c83398151915291905f80516020610ebc8339815191529046903090602001610e50565b6040516020818303038152906040528051906020012090505f8186604051602001610b7e92919061190160f01b81526002810192909252602282015260420190565b60408051601f1981840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610be6573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811615801590610c1c5750876001600160a01b0316816001600160a01b0316145b6105e45760405162461bcd60e51b815260206004820152602b60248201527f48455a3a3a5f76616c69646174655369676e6564446174613a20494e56414c4960448201526a445f5349474e415455524560a81b60648201526084016104d0565b5f6020808352835180828501525f5b81811015610ca757858101830151858201604001528201610c8b565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610cdd575f80fd5b919050565b5f8060408385031215610cf3575f80fd5b610cfc83610cc7565b946020939093013593505050565b5f805f60608486031215610d1c575f80fd5b610d2584610cc7565b9250610d3360208501610cc7565b9150604084013590509250925092565b5f60208284031215610d53575f80fd5b5035919050565b5f60208284031215610d6a575f80fd5b610d7382610cc7565b9392505050565b5f805f805f805f60e0888a031215610d90575f80fd5b610d9988610cc7565b9650610da760208901610cc7565b95506040880135945060608801359350608088013560ff81168114610dca575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215610df8575f80fd5b610e0183610cc7565b9150610e0f60208401610cc7565b90509250929050565b600181811c90821680610e2c57607f821691505b602082108103610e4a57634e487b7160e01b5f52602260045260245ffd5b50919050565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561038657610386610e7c565b5f60018201610eb457610eb4610e7c565b506001019056fec89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa2646970667358221220e5557a8268dd346c07f8a97c7a37ab3faa7459a4309c313d2cabd53b00face4964736f6c63430008140033", + "bytecode": "0x6080604052604051620013d9380380620013d9833981016040819052620000269162000201565b8383600362000036838262000322565b50600462000045828262000322565b5050506200005a82826200007160201b60201c565b505081516020909201919091206006555062000416565b6001600160a01b038216620000cc5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060026000828254620000e09190620003ee565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200016457600080fd5b81516001600160401b03808211156200018157620001816200013c565b604051601f8301601f19908116603f01168101908282118183101715620001ac57620001ac6200013c565b81604052838152602092508683858801011115620001c957600080fd5b600091505b83821015620001ed5785820183015181830184015290820190620001ce565b600093810190920192909252949350505050565b600080600080608085870312156200021857600080fd5b84516001600160401b03808211156200023057600080fd5b6200023e8883890162000152565b955060208701519150808211156200025557600080fd5b50620002648782880162000152565b604087015190945090506001600160a01b03811681146200028457600080fd5b6060959095015193969295505050565b600181811c90821680620002a957607f821691505b602082108103620002ca57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200013757600081815260208120601f850160051c81016020861015620002f95750805b601f850160051c820191505b818110156200031a5782815560010162000305565b505050505050565b81516001600160401b038111156200033e576200033e6200013c565b62000356816200034f845462000294565b84620002d0565b602080601f8311600181146200038e5760008415620003755750858301515b600019600386901b1c1916600185901b1785556200031a565b600085815260208120601f198616915b82811015620003bf578886015182559484019460019091019084016200039e565b5085821015620003de5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156200041057634e487b7160e01b600052601160045260246000fd5b92915050565b610fb380620004266000396000f3fe608060405234801561001057600080fd5b506004361061011d5760003560e01c806304622c2e1461012257806306fdde031461013e578063095ea7b31461015357806318160ddd14610176578063222f5be01461017e57806323b872dd1461019357806330adf81f146101a6578063313ce567146101bb5780633408e470146101ca5780633644e515146101d057806339509351146101d857806340c10f19146101eb57806342966c68146101fe57806356189cb41461021157806370a08231146102245780637ecebe001461024d57806395d89b411461026d5780639e4e731814610275578063a457c2d71461028a578063a9059cbb1461029d578063c473af33146102b0578063d505accf146102c5578063dd62ed3e146102d8575b600080fd5b61012b60065481565b6040519081526020015b60405180910390f35b6101466102eb565b6040516101359190610ca4565b610166610161366004610d0e565b61037d565b6040519015158152602001610135565b60025461012b565b61019161018c366004610d38565b610397565b005b6101666101a1366004610d38565b6103a7565b61012b600080516020610f3e83398151915281565b60405160128152602001610135565b4661012b565b61012b6103cb565b6101666101e6366004610d0e565b610420565b6101916101f9366004610d0e565b610442565b61019161020c366004610d74565b610450565b61019161021f366004610d38565b61045d565b61012b610232366004610d8d565b6001600160a01b031660009081526020819052604090205490565b61012b61025b366004610d8d565b60056020526000908152604090205481565b610146610468565b61012b600080516020610efe83398151915281565b610166610298366004610d0e565b610477565b6101666102ab366004610d0e565b6104f7565b61012b600080516020610f5e83398151915281565b6101916102d3366004610daf565b610505565b61012b6102e6366004610e22565b610602565b6060600380546102fa90610e55565b80601f016020809104026020016040519081016040528092919081815260200182805461032690610e55565b80156103735780601f1061034857610100808354040283529160200191610373565b820191906000526020600020905b81548152906001019060200180831161035657829003601f168201915b5050505050905090565b60003361038b81858561062d565b60019150505b92915050565b6103a2838383610751565b505050565b6000336103b58582856108e5565b6103c0858585610751565b506001949350505050565b60065460405160009161040591600080516020610f5e8339815191529190600080516020610efe8339815191529046903090602001610e8f565b60405160208183030381529060405280519060200120905090565b60003361038b8185856104338383610602565b61043d9190610ed1565b61062d565b61044c8282610959565b5050565b61045a3382610a06565b50565b6103a283838361062d565b6060600480546102fa90610e55565b600033816104858286610602565b9050838110156104ea5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b6103c0828686840361062d565b60003361038b818585610751565b428410156105515760405162461bcd60e51b81526020600482015260196024820152781211568e8e9c195c9b5a5d0e881055551217d1561412549151603a1b60448201526064016104e1565b6001600160a01b03871660009081526005602052604081208054600080516020610f3e833981519152918a918a918a91908661058c83610ee4565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506105ed8882868686610b26565b6105f888888861062d565b5050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661068f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104e1565b6001600160a01b0382166106f05760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104e1565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166107b55760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104e1565b6001600160a01b0382166108175760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104e1565b6001600160a01b0383166000908152602081905260409020548181101561088f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104e1565b6001600160a01b0384811660008181526020818152604080832087870390559387168083529184902080548701905592518581529092600080516020610f1e833981519152910160405180910390a35b50505050565b60006108f18484610602565b905060001981146108df578181101561094c5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104e1565b6108df848484840361062d565b6001600160a01b0382166109af5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104e1565b80600260008282546109c19190610ed1565b90915550506001600160a01b03821660008181526020818152604080832080548601905551848152600080516020610f1e833981519152910160405180910390a35050565b6001600160a01b038216610a665760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104e1565b6001600160a01b03821660009081526020819052604090205481811015610ada5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104e1565b6001600160a01b038316600081815260208181526040808320868603905560028054879003905551858152919291600080516020610f1e833981519152910160405180910390a3505050565b600654604051600091610b6091600080516020610f5e8339815191529190600080516020610efe8339815191529046903090602001610e8f565b60405160208183030381529060405280519060200120905060008186604051602001610ba392919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610c0e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590610c445750876001600160a01b0316816001600160a01b0316145b6105f85760405162461bcd60e51b815260206004820152602b60248201527f48455a3a3a5f76616c69646174655369676e6564446174613a20494e56414c4960448201526a445f5349474e415455524560a81b60648201526084016104e1565b600060208083528351808285015260005b81811015610cd157858101830151858201604001528201610cb5565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610d0957600080fd5b919050565b60008060408385031215610d2157600080fd5b610d2a83610cf2565b946020939093013593505050565b600080600060608486031215610d4d57600080fd5b610d5684610cf2565b9250610d6460208501610cf2565b9150604084013590509250925092565b600060208284031215610d8657600080fd5b5035919050565b600060208284031215610d9f57600080fd5b610da882610cf2565b9392505050565b600080600080600080600060e0888a031215610dca57600080fd5b610dd388610cf2565b9650610de160208901610cf2565b95506040880135945060608801359350608088013560ff81168114610e0557600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610e3557600080fd5b610e3e83610cf2565b9150610e4c60208401610cf2565b90509250929050565b600181811c90821680610e6957607f821691505b602082108103610e8957634e487b7160e01b600052602260045260246000fd5b50919050565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561039157610391610ebb565b600060018201610ef657610ef6610ebb565b506001019056fec89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa264697066735822122041a6dcdc4cb18d6e1d492dee93c2f0a0cc6012cce6793b641662a6378ea999a464736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061011d5760003560e01c806304622c2e1461012257806306fdde031461013e578063095ea7b31461015357806318160ddd14610176578063222f5be01461017e57806323b872dd1461019357806330adf81f146101a6578063313ce567146101bb5780633408e470146101ca5780633644e515146101d057806339509351146101d857806340c10f19146101eb57806342966c68146101fe57806356189cb41461021157806370a08231146102245780637ecebe001461024d57806395d89b411461026d5780639e4e731814610275578063a457c2d71461028a578063a9059cbb1461029d578063c473af33146102b0578063d505accf146102c5578063dd62ed3e146102d8575b600080fd5b61012b60065481565b6040519081526020015b60405180910390f35b6101466102eb565b6040516101359190610ca4565b610166610161366004610d0e565b61037d565b6040519015158152602001610135565b60025461012b565b61019161018c366004610d38565b610397565b005b6101666101a1366004610d38565b6103a7565b61012b600080516020610f3e83398151915281565b60405160128152602001610135565b4661012b565b61012b6103cb565b6101666101e6366004610d0e565b610420565b6101916101f9366004610d0e565b610442565b61019161020c366004610d74565b610450565b61019161021f366004610d38565b61045d565b61012b610232366004610d8d565b6001600160a01b031660009081526020819052604090205490565b61012b61025b366004610d8d565b60056020526000908152604090205481565b610146610468565b61012b600080516020610efe83398151915281565b610166610298366004610d0e565b610477565b6101666102ab366004610d0e565b6104f7565b61012b600080516020610f5e83398151915281565b6101916102d3366004610daf565b610505565b61012b6102e6366004610e22565b610602565b6060600380546102fa90610e55565b80601f016020809104026020016040519081016040528092919081815260200182805461032690610e55565b80156103735780601f1061034857610100808354040283529160200191610373565b820191906000526020600020905b81548152906001019060200180831161035657829003601f168201915b5050505050905090565b60003361038b81858561062d565b60019150505b92915050565b6103a2838383610751565b505050565b6000336103b58582856108e5565b6103c0858585610751565b506001949350505050565b60065460405160009161040591600080516020610f5e8339815191529190600080516020610efe8339815191529046903090602001610e8f565b60405160208183030381529060405280519060200120905090565b60003361038b8185856104338383610602565b61043d9190610ed1565b61062d565b61044c8282610959565b5050565b61045a3382610a06565b50565b6103a283838361062d565b6060600480546102fa90610e55565b600033816104858286610602565b9050838110156104ea5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b6103c0828686840361062d565b60003361038b818585610751565b428410156105515760405162461bcd60e51b81526020600482015260196024820152781211568e8e9c195c9b5a5d0e881055551217d1561412549151603a1b60448201526064016104e1565b6001600160a01b03871660009081526005602052604081208054600080516020610f3e833981519152918a918a918a91908661058c83610ee4565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506105ed8882868686610b26565b6105f888888861062d565b5050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661068f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104e1565b6001600160a01b0382166106f05760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104e1565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166107b55760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104e1565b6001600160a01b0382166108175760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104e1565b6001600160a01b0383166000908152602081905260409020548181101561088f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104e1565b6001600160a01b0384811660008181526020818152604080832087870390559387168083529184902080548701905592518581529092600080516020610f1e833981519152910160405180910390a35b50505050565b60006108f18484610602565b905060001981146108df578181101561094c5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104e1565b6108df848484840361062d565b6001600160a01b0382166109af5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104e1565b80600260008282546109c19190610ed1565b90915550506001600160a01b03821660008181526020818152604080832080548601905551848152600080516020610f1e833981519152910160405180910390a35050565b6001600160a01b038216610a665760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104e1565b6001600160a01b03821660009081526020819052604090205481811015610ada5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104e1565b6001600160a01b038316600081815260208181526040808320868603905560028054879003905551858152919291600080516020610f1e833981519152910160405180910390a3505050565b600654604051600091610b6091600080516020610f5e8339815191529190600080516020610efe8339815191529046903090602001610e8f565b60405160208183030381529060405280519060200120905060008186604051602001610ba392919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610c0e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590610c445750876001600160a01b0316816001600160a01b0316145b6105f85760405162461bcd60e51b815260206004820152602b60248201527f48455a3a3a5f76616c69646174655369676e6564446174613a20494e56414c4960448201526a445f5349474e415455524560a81b60648201526084016104e1565b600060208083528351808285015260005b81811015610cd157858101830151858201604001528201610cb5565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610d0957600080fd5b919050565b60008060408385031215610d2157600080fd5b610d2a83610cf2565b946020939093013593505050565b600080600060608486031215610d4d57600080fd5b610d5684610cf2565b9250610d6460208501610cf2565b9150604084013590509250925092565b600060208284031215610d8657600080fd5b5035919050565b600060208284031215610d9f57600080fd5b610da882610cf2565b9392505050565b600080600080600080600060e0888a031215610dca57600080fd5b610dd388610cf2565b9650610de160208901610cf2565b95506040880135945060608801359350608088013560ff81168114610e0557600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610e3557600080fd5b610e3e83610cf2565b9150610e4c60208401610cf2565b90509250929050565b600181811c90821680610e6957607f821691505b602082108103610e8957634e487b7160e01b600052602260045260246000fd5b50919050565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561039157610391610ebb565b600060018201610ef657610ef6610ebb565b506001019056fec89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa264697066735822122041a6dcdc4cb18d6e1d492dee93c2f0a0cc6012cce6793b641662a6378ea999a464736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/FflonkVerifier.json b/compiled-contracts/paris/FflonkVerifier.json index 506d29da9..59e13bada 100644 --- a/compiled-contracts/paris/FflonkVerifier.json +++ b/compiled-contracts/paris/FflonkVerifier.json @@ -28,8 +28,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561000f575f80fd5b5061368f8061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c80639121da8a1461002d575b5f80fd5b61004061003b366004613518565b610054565b604051901515815260200160405180910390f35b5f6134a8565b6040516104c08201518082526020820191505f805160206135da8339815191526104e0840151820990508082526020820191505f805160206135da833981519152610500840151820990508082526020820191505f805160206135da833981519152610520840151820990508082526020820191505f805160206135da833981519152602061052001840151820990508082526020820191505f805160206135da833981519152604061052001840151820990508082526020820191505f805160206135da833981519152606061052001840151820990508082526020820191505f805160206135da833981519152608061052001840151820990508082526020820191505f805160206135da83398151915260a061052001840151820990508082526020820191505f805160206135da83398151915260c061052001840151820990508082526020820191505f805160206135da83398151915260e061052001840151820990508082526020820191505f805160206135da833981519152610620840151820990508082526020820191505f805160206135da833981519152602061062001840151820990508082526020820191505f805160206135da833981519152604061062001840151820990508082526020820191505f805160206135da833981519152606061062001840151820990508082526020820191505f805160206135da8339815191526106a0840151820990508082526020820191505f805160206135da83398151915260206106a001840151820990508082526020820191505f805160206135da83398151915260406106a001840151820990508082526020820191505f805160206135da83398151915260606106a001840151820990508082526020820191505f805160206135da83398151915260806106a001840151820990508082526020820191505f805160206135da83398151915260a06106a001840151820990508082526020820191505f805160206135da833981519152610760840151820990508082526102e4355f805160206135da83398151915281830960011461036c575f805260205ff35b8091506020830392505f805160206135da8339815191528351830990505f805160206135da83398151915261076085015183099150806107608501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260a06106a001850151830991508060a06106a0018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260806106a001850151830991508060806106a0018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260606106a001850151830991508060606106a0018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260406106a001850151830991508060406106a0018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260206106a001850151830991508060206106a0018501526020830392505f805160206135da8339815191528351830990505f805160206135da8339815191526106a085015183099150806106a08501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260606106200185015183099150806060610620018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260406106200185015183099150806040610620018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260206106200185015183099150806020610620018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915261062085015183099150806106208501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260e061052001850151830991508060e0610520018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260c061052001850151830991508060c0610520018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260a061052001850151830991508060a0610520018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260806105200185015183099150806080610520018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260606105200185015183099150806060610520018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260406105200185015183099150806040610520018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260206105200185015183099150806020610520018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915261052085015183099150806105208501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915261050085015183099150806105008501526020830392505f805160206135da8339815191528351830990505f805160206135da8339815191526104e085015183099150806104e085015250806104c0840152505050565b5f805160206135da833981519152811061089f575f805260205ff35b50565b803560208201355f8051602061355a83398151915260035f8051602061355a8339815191528085860985090891505f8051602061355a83398151915281820990508082146108f2575f805260205ff35b505050565b61090160046108a2565b61090b60446108a2565b61091560846108a2565b61091f60c46108a2565b61092b61010435610883565b61093761012435610883565b61094361014435610883565b61094f61016435610883565b61095b61018435610883565b6109676101a435610883565b6109736101c435610883565b61097f6101e435610883565b61098b61020435610883565b61099761022435610883565b6109a361024435610883565b6109af61026435610883565b6109bb61028435610883565b6109c76102a435610883565b6109d36102c435610883565b6109df6102e435610883565b565b5f8051602061363a83398151915261078082019081525f8051602061361a8339815191526107a0830190815283356107c084019081526004356107e085015260243561080085015260a083205f805160206135da833981519152908190066020808701918252902081900660408601819052845260443590925260643590526060909120819006608083018190529081800960a0830181905260808301515f805160206135da833981519152910960e08301525f805160206135da8339815191527f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8060e0840151096101008301525f805160206135da8339815191525f8051602061359a83398151915260e0840151096101208301525f805160206135da8339815191527f1d59376149b959ccbd157ac850893a6f07c2d99b3852513ab8d01be8e846a56660e0840151096101408301525f805160206135da8339815191525f805160206135fa83398151915260e0840151096101608301525f805160206135da8339815191527f0530d09118705106cbb4a786ead16926d5d174e181a26686af5448492e42a18160e0840151096101808301525f805160206135da83398151915277b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb60e0840151096101a08301525f805160206135da8339815191527f130b17119778465cfb3acaee30f81dee20710ead41671f568b11d9ab07b95a9b60e0840151096101c083015260e08201515f805160206135da8339815191529080096101e08301525f805160206135da8339815191525f8051602061359a8339815191526101e0840151096102008301525f805160206135da8339815191525f805160206135fa8339815191526101e0840151096102208301525f805160206135da83398151915277b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb6101e0840151096102408301525f805160206135da83398151915260a08301516101e0840151096102608301525f805160206135da8339815191525f8051602061357a833981519152610260840151096102808301525f805160206135da83398151915277b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd610260840151096102a08301525f805160206135da8339815191527f283ce45a2e5b8e4e78f9fbaf5f6a348bfcfaf76dd28e5ca7121b74ef68fdec2e610260840151096102c08301525f805160206135da8339815191525f8051602061357a8339815191526102c0840151096102e08301525f805160206135da83398151915277b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd6102c0840151096103008301526102608201515f805160206135da8339815191529081818009098060c08401525f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da8339815191528182095f805160206135da8339815191525f805160206135fa833981519152909101066104a084018190526104c0840152506107808201526101e06101046107a083013761020061078082019081205f805160206135da8339815191529081900680845282526084356107a084015260a4356107c08401526060918290200691015250565b60e0810151606082015160015f805160206135da83398151915283820990505f805160206135da83398151915283820990505f805160206135da83398151915283820990505f805160206135da83398151915283820990505f805160206135da83398151915283820990505f805160206135da83398151915283820990505f805160206135da8339815191528160080960e0850151935090505f805160206135da83398151915283810381900683085f805160206135da8339815191528082860983096105208601526101c08501516101008601519094505f805160206135da833981519152908103819006840890505f805160206135da8339815191528082860983096105408601526101a08501516101208601519094505f805160206135da833981519152908103819006840890505f805160206135da8339815191528082860983096105608601526101808501516101408601519094505f805160206135da833981519152908103819006840890505f805160206135da83398151915280828609830961058086015261016085015193505f805160206135da833981519152848103819006840890505f805160206135da8339815191528082860983096105a08601526101408501516101808601519094505f805160206135da833981519152908103819006840890505f805160206135da8339815191528082860983096105c08601526101208501516101a08601519094505f805160206135da833981519152908103819006840890505f805160206135da8339815191528082860983096105e08601526101008501516101c08601519094505f805160206135da833981519152908103819006840890505f805160206135da83398151915280828609830960e0610520018601525050505050565b6101e0810151606082015160015f805160206135da83398151915283820990505f805160206135da83398151915283820990505f805160206135da833981519152816004096101e0850151935090505f805160206135da83398151915283810381900683085f805160206135da8339815191528082860983096106208601526102408501516102008601519094505f805160206135da833981519152908103819006840890505f805160206135da83398151915280828609830961064086015261022085015193505f805160206135da833981519152848103819006840890505f805160206135da8339815191528082860983096106608601526102008501516102408601519094505f805160206135da833981519152908103819006840890505f805160206135da8339815191528082860983096060610620018601525050505050565b60608101515f805160206135da833981519152805f805160206135da833981519152805f805160206135ba83398151915260c0870151095f805160206135da833981519152030660c0850151085f805160206135da833981519152610260850151600309096102608301515f805160206135da83398151915281810381900684085f805160206135da8339815191528082840984096106a08601526102a08501516102808601519092505f805160206135da833981519152908103819006850890505f805160206135da8339815191528082840984096106c08601526102808501516102a08601519092505f805160206135da833981519152908103819006850890505f805160206135da83398151915280828409840960406106a0018601525f805160206135da833981519152805f805160206135da83398151915260c08801515f805160206135da83398151915203065f805160206135da8339815191525f805160206135ba83398151915260c08a015109085f805160206135da8339815191526102c0880151600309096102c086015190935091505f805160206135da833981519152828103819006850890505f805160206135da8339815191528082840984096107008601526103008501516102e08601519092505f805160206135da833981519152908103819006850890505f805160206135da8339815191528082840984096107208601526102e08501516103008601519092505f805160206135da833981519152908103819006850890505f805160206135da83398151915280828409840960a06106a0018601525050505050565b60608101515f805160206135da833981519152806101e08401515f805160206135da833981519152030682085f805160206135da833981519152805f805160206135da8339815191526102008601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526102208601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526102408601515f805160206135da8339815191520306840882099050806104e08401525f805160206135da833981519152806102608501515f805160206135da8339815191520306830890505f805160206135da833981519152805f805160206135da8339815191526102808601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526102a08601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526102c08601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526102e08601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526103008601515f805160206135da83398151915203068408820990508061050084015261188583611023565b61188e836112b6565b611897836113fb565b505060c081015160015f805160206135da8339815191525f805160206135fa8339815191528301819006630100000009610760840152505061089f8161005a565b6104a08101515f805160206135da83398151915281610760840151096107608301525050565b5f5f805160206135da833981519152805f805160206135da83398151915285356107608601510983030106905080610320830152505050565b600160608201515f805160206135da83398151915281830991505f805160206135da83398151915281830991505f805160206135da83398151915281830991505f805160206135da83398151915281830991505f805160206135da83398151915281830991505f805160206135da83398151915281830991505f805160206135da83398151915281830991505f805160206135da8339815191528183099150505f805160206135da8339815191528060c08401515f805160206135da8339815191520306820860e08301519091505f9081805f805160206135da83398151915280846101243509610104350891505f805160206135da83398151915283840990505f805160206135da83398151915280826101643509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101443509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101843509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101a43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101c43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101e43509830891505f805160206135da833981519152805f805160206135da8339815191525f61052001890151880984098508935061010086015192505f805160206135da83398151915280846101243509610104350891505f805160206135da83398151915283840990505f805160206135da83398151915280826101643509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101443509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101843509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101a43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101c43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101e43509830891505f805160206135da833981519152805f805160206135da833981519152602061052001890151880984098508935061012086015192505f805160206135da83398151915280846101243509610104350891505f805160206135da83398151915283840990505f805160206135da83398151915280826101643509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101443509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101843509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101a43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101c43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101e43509830891505f805160206135da833981519152805f805160206135da833981519152604061052001890151880984098508935061014086015192505f805160206135da83398151915280846101243509610104350891505f805160206135da83398151915283840990505f805160206135da83398151915280826101643509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101443509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101843509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101a43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101c43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101e43509830891505f805160206135da833981519152805f805160206135da833981519152606061052001890151880984098508935061016086015192505f805160206135da83398151915280846101243509610104350891505f805160206135da83398151915283840990505f805160206135da83398151915280826101643509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101443509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101843509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101a43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101c43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101e43509830891505f805160206135da833981519152805f805160206135da833981519152608061052001890151880984098508935061018086015192505f805160206135da83398151915280846101243509610104350891505f805160206135da83398151915283840990505f805160206135da83398151915280826101643509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101443509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101843509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101a43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101c43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101e43509830891505f805160206135da833981519152805f805160206135da83398151915260a06105200189015188098409850893506101a086015192505f805160206135da83398151915280846101243509610104350891505f805160206135da83398151915283840990505f805160206135da83398151915280826101643509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101443509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101843509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101a43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101c43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101e43509830891505f805160206135da833981519152805f805160206135da83398151915260c06105200189015188098409850893506101c086015192505f805160206135da83398151915280846101243509610104350891505f805160206135da83398151915283840990505f805160206135da83398151915280826101643509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101443509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101843509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101a43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101c43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101e4350983089150505f805160206135da833981519152805f805160206135da83398151915260e0610520018801518709830984089250505080610340840152505050565b600160608201515f805160206135da83398151915281830991505f805160206135da83398151915281830991505f805160206135da83398151915281830991505f805160206135da8339815191528183099150505f805160206135da8339815191528060c08401515f805160206135da8339815191520306820890505f6102043561022435610244355f805160206135da83398151915283610104350993505f805160206135da83398151915280836101243509850893505f805160206135da833981519152805f805160206135da8339815191528486096101443509850893505f805160206135da83398151915280826101643509850893505f805160206135da83398151915261018435850893505f805160206135da833981519152610320870151850893505f805160206135da8339815191526104c087015185096101e08701519094505f908490825f805160206135da83398151915280878409840892505f805160206135da83398151915282830990505f805160206135da83398151915280868309840892505f805160206135da83398151915280895f805160206135da83398151915285850909840892505f805160206135da833981519152805f805160206135da83398151915260205f02610620018d01518c098509850893508692506102008a015191505f805160206135da83398151915280878409840892505f805160206135da83398151915282830990505f805160206135da83398151915280868309840892505f805160206135da83398151915280895f805160206135da83398151915285850909840892505f805160206135da833981519152805f805160206135da8339815191526020600102610620018d01518c098509850893508692506102208a015191505f805160206135da83398151915280878409840892505f805160206135da83398151915282830990505f805160206135da83398151915280868309840892505f805160206135da83398151915280895f805160206135da83398151915285850909840892505f805160206135da833981519152805f805160206135da8339815191526020600202610620018d01518c098509850893508692506102408a015191505f805160206135da83398151915280878409840892505f805160206135da83398151915282830990505f805160206135da83398151915280868309840892505f805160206135da83398151915280895f805160206135da833981519152858509098408925050505f805160206135da833981519152805f805160206135da8339815191526020600302610620018b01518a09830983089150508061036088015250505050505050565b606081015160015f805160206135da83398151915281830990505f805160206135da83398151915281830990505f805160206135da83398151915281830990505f805160206135da83398151915281830990505f805160206135da83398151915281830990505f805160206135da833981519152818309905060015f805160206135da83398151915281840990505f805160206135da83398151915281840990505f805160206135da83398151915281840990505f805160206135da8339815191528060c08601515f805160206135da8339815191525f805160206135ba83398151915260c08901510908820990505f805160206135da83398151915280825f805160206135da8339815191520306830860c08501519092505f805160206135da83398151915290815f805160206135ba83398151915282090990505f805160206135da8339815191528183089150505f91505f5f805160206135da83398151915260c085015160208601510960408501515f805160206135da83398151915280828408610204350892505f805160206135da833981519152805f805160206135da833981519152835f805160206135da83398151915260028709086102243508840992505f805160206135da833981519152805f805160206135da833981519152835f805160206135da83398151915260038709086102443508840992505f805160206135da83398151915261026435840992505f805160206135da83398151915280825f805160206135da8339815191526101a43560208b01510908610204350894505f805160206135da833981519152805f805160206135da833981519152835f805160206135da8339815191526101c43560208c015109086102243508860994505f805160206135da833981519152805f805160206135da833981519152835f805160206135da8339815191526101e43560208c015109086102443508860994505f805160206135da83398151915261028435860994505f805160206135da83398151915280865f805160206135da8339815191520306840892505f805160206135da8339815191526104c0870151840992506001610264350394505f805160206135da833981519152610760870151860994505f805160206135da8339815191526104c0870151860961026087015190955091505f9050805f805160206135da83398151915280878509610264350890505f805160206135da83398151915280855f805160206135da83398151915286870909820890505f805160206135da833981519152805f805160206135da83398151915260205f026106a0018a0151880983098308915061028087015192505f805160206135da83398151915280878509610264350890505f805160206135da83398151915280855f805160206135da83398151915286870909820890505f805160206135da833981519152805f805160206135da83398151915260206001026106a0018a015188098309830891506102a087015192505f805160206135da83398151915280878509610264350890505f805160206135da83398151915280855f805160206135da83398151915286870909820890505f805160206135da833981519152805f805160206135da83398151915260206002026106a0018a015188098309830891506102c087015192505f805160206135da833981519152806102a4358509610284350890505f805160206135da833981519152806102c4355f805160206135da83398151915286870909820890505f805160206135da833981519152805f805160206135da83398151915260206003026106a0018a015188098309830891506102e087015192505f805160206135da833981519152806102a4358509610284350890505f805160206135da833981519152806102c4355f805160206135da83398151915286870909820890505f805160206135da833981519152805f805160206135da83398151915260206004026106a0018a0151880983098308915061030087015192505f805160206135da833981519152806102a4358509610284350890505f805160206135da833981519152806102c4355f805160206135da83398151915286870909820890505f805160206135da833981519152805f805160206135da83398151915260206005026106a0018a015188098309830891505080610380870152505050505050565b6040518151815260208201516020820152825160408201526020830151606082015260408260808360066107d05a03fa9050806108f2575f805260205ff35b5f604051833581526020840135602082015284604082015260408160608360076107d05a03fa915081612f70575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa91505080612f9f575f805260205ff35b50505050565b5f60405183815284602082015285604082015260408160608360076107d05a03fa915081612fd5575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa91505080613004575f805260205ff35b5050505050565b60608101515f805160206135da8339815191528060e08401515f805160206135da833981519152030682085f805160206135da833981519152805f805160206135da8339815191526101008601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526101208601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526101408601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526101608601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526101808601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526101a08601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526101c08601515f805160206135da83398151915203068408820990505f805160206135da833981519152806104e0850151830984510991505f805160206135da83398151915280610500850151830984515f805160206135da833981519152908009095f8051602061363a8339815191526103a08501525f8051602061361a83398151915260206103a0018501526132478360046103a08701612f3b565b6132578160446103a08701612f3b565b6132ab5f805160206135da833981519152805f805160206135da83398151915261038088015185095f805160206135da83398151915261036089015188090861034087015108600260016103e08801612fa5565b506108f28160846104208601612f3b565b604051610400820180515f8051602061355a8339815191529081038190069091526104408301805182039190910690525f906133006103e084016103a08501612efc565b61331261042084016103a08501612efc565b613326606084015160c46103a08601612f3b565b6103a083015181526103c08301516020808301919091527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a083015260c43560c08301525f8051602061355a83398151915260e43581030660e08301527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6101008301527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6101208301527f1970ea81dd6992adfbc571effb03503adbbb6a857f578403c6c40e22d65b3c026101408301527f054793348f12c0cf5622c340573cb277586319de359ab9389778f689786b1e48610160830152816101808160086107d05a03fa90511692915050565b60405161078081016040526134bb6108f7565b6134c583826109e1565b6134ce81611651565b6134d7816118d8565b6134e183826118fe565b6134ea81611937565b6134f3816124df565b6134fc816128b6565b6135058161300b565b61350e816132bc565b9050805f5260205ff35b5f8061032080848603121561352b575f80fd5b61030084018581111561353c575f80fd5b84935085828601111561354d575f80fd5b8092505050925092905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4730644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f2330644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f7036360c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000130644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000001f7e1d70965392e542392cab2e10e88c03912b89107ae96c3a6b13f31f3a4cd016d70f6937b88ea2890451712281f2073db9ac923d49d38d833cbbcbc2b281c8a26469706673582212205fa66a592bf4101f1e5004b13a7e721aec22545c56503f32844822602575231564736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610029575f3560e01c80639121da8a1461002d575b5f80fd5b61004061003b366004613518565b610054565b604051901515815260200160405180910390f35b5f6134a8565b6040516104c08201518082526020820191505f805160206135da8339815191526104e0840151820990508082526020820191505f805160206135da833981519152610500840151820990508082526020820191505f805160206135da833981519152610520840151820990508082526020820191505f805160206135da833981519152602061052001840151820990508082526020820191505f805160206135da833981519152604061052001840151820990508082526020820191505f805160206135da833981519152606061052001840151820990508082526020820191505f805160206135da833981519152608061052001840151820990508082526020820191505f805160206135da83398151915260a061052001840151820990508082526020820191505f805160206135da83398151915260c061052001840151820990508082526020820191505f805160206135da83398151915260e061052001840151820990508082526020820191505f805160206135da833981519152610620840151820990508082526020820191505f805160206135da833981519152602061062001840151820990508082526020820191505f805160206135da833981519152604061062001840151820990508082526020820191505f805160206135da833981519152606061062001840151820990508082526020820191505f805160206135da8339815191526106a0840151820990508082526020820191505f805160206135da83398151915260206106a001840151820990508082526020820191505f805160206135da83398151915260406106a001840151820990508082526020820191505f805160206135da83398151915260606106a001840151820990508082526020820191505f805160206135da83398151915260806106a001840151820990508082526020820191505f805160206135da83398151915260a06106a001840151820990508082526020820191505f805160206135da833981519152610760840151820990508082526102e4355f805160206135da83398151915281830960011461036c575f805260205ff35b8091506020830392505f805160206135da8339815191528351830990505f805160206135da83398151915261076085015183099150806107608501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260a06106a001850151830991508060a06106a0018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260806106a001850151830991508060806106a0018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260606106a001850151830991508060606106a0018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260406106a001850151830991508060406106a0018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260206106a001850151830991508060206106a0018501526020830392505f805160206135da8339815191528351830990505f805160206135da8339815191526106a085015183099150806106a08501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260606106200185015183099150806060610620018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260406106200185015183099150806040610620018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260206106200185015183099150806020610620018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915261062085015183099150806106208501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260e061052001850151830991508060e0610520018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260c061052001850151830991508060c0610520018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260a061052001850151830991508060a0610520018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260806105200185015183099150806080610520018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260606105200185015183099150806060610520018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260406105200185015183099150806040610520018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915260206105200185015183099150806020610520018501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915261052085015183099150806105208501526020830392505f805160206135da8339815191528351830990505f805160206135da83398151915261050085015183099150806105008501526020830392505f805160206135da8339815191528351830990505f805160206135da8339815191526104e085015183099150806104e085015250806104c0840152505050565b5f805160206135da833981519152811061089f575f805260205ff35b50565b803560208201355f8051602061355a83398151915260035f8051602061355a8339815191528085860985090891505f8051602061355a83398151915281820990508082146108f2575f805260205ff35b505050565b61090160046108a2565b61090b60446108a2565b61091560846108a2565b61091f60c46108a2565b61092b61010435610883565b61093761012435610883565b61094361014435610883565b61094f61016435610883565b61095b61018435610883565b6109676101a435610883565b6109736101c435610883565b61097f6101e435610883565b61098b61020435610883565b61099761022435610883565b6109a361024435610883565b6109af61026435610883565b6109bb61028435610883565b6109c76102a435610883565b6109d36102c435610883565b6109df6102e435610883565b565b5f8051602061363a83398151915261078082019081525f8051602061361a8339815191526107a0830190815283356107c084019081526004356107e085015260243561080085015260a083205f805160206135da833981519152908190066020808701918252902081900660408601819052845260443590925260643590526060909120819006608083018190529081800960a0830181905260808301515f805160206135da833981519152910960e08301525f805160206135da8339815191527f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8060e0840151096101008301525f805160206135da8339815191525f8051602061359a83398151915260e0840151096101208301525f805160206135da8339815191527f1d59376149b959ccbd157ac850893a6f07c2d99b3852513ab8d01be8e846a56660e0840151096101408301525f805160206135da8339815191525f805160206135fa83398151915260e0840151096101608301525f805160206135da8339815191527f0530d09118705106cbb4a786ead16926d5d174e181a26686af5448492e42a18160e0840151096101808301525f805160206135da83398151915277b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb60e0840151096101a08301525f805160206135da8339815191527f130b17119778465cfb3acaee30f81dee20710ead41671f568b11d9ab07b95a9b60e0840151096101c083015260e08201515f805160206135da8339815191529080096101e08301525f805160206135da8339815191525f8051602061359a8339815191526101e0840151096102008301525f805160206135da8339815191525f805160206135fa8339815191526101e0840151096102208301525f805160206135da83398151915277b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb6101e0840151096102408301525f805160206135da83398151915260a08301516101e0840151096102608301525f805160206135da8339815191525f8051602061357a833981519152610260840151096102808301525f805160206135da83398151915277b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd610260840151096102a08301525f805160206135da8339815191527f283ce45a2e5b8e4e78f9fbaf5f6a348bfcfaf76dd28e5ca7121b74ef68fdec2e610260840151096102c08301525f805160206135da8339815191525f8051602061357a8339815191526102c0840151096102e08301525f805160206135da83398151915277b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd6102c0840151096103008301526102608201515f805160206135da8339815191529081818009098060c08401525f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da83398151915281820990505f805160206135da8339815191528182095f805160206135da8339815191525f805160206135fa833981519152909101066104a084018190526104c0840152506107808201526101e06101046107a083013761020061078082019081205f805160206135da8339815191529081900680845282526084356107a084015260a4356107c08401526060918290200691015250565b60e0810151606082015160015f805160206135da83398151915283820990505f805160206135da83398151915283820990505f805160206135da83398151915283820990505f805160206135da83398151915283820990505f805160206135da83398151915283820990505f805160206135da83398151915283820990505f805160206135da8339815191528160080960e0850151935090505f805160206135da83398151915283810381900683085f805160206135da8339815191528082860983096105208601526101c08501516101008601519094505f805160206135da833981519152908103819006840890505f805160206135da8339815191528082860983096105408601526101a08501516101208601519094505f805160206135da833981519152908103819006840890505f805160206135da8339815191528082860983096105608601526101808501516101408601519094505f805160206135da833981519152908103819006840890505f805160206135da83398151915280828609830961058086015261016085015193505f805160206135da833981519152848103819006840890505f805160206135da8339815191528082860983096105a08601526101408501516101808601519094505f805160206135da833981519152908103819006840890505f805160206135da8339815191528082860983096105c08601526101208501516101a08601519094505f805160206135da833981519152908103819006840890505f805160206135da8339815191528082860983096105e08601526101008501516101c08601519094505f805160206135da833981519152908103819006840890505f805160206135da83398151915280828609830960e0610520018601525050505050565b6101e0810151606082015160015f805160206135da83398151915283820990505f805160206135da83398151915283820990505f805160206135da833981519152816004096101e0850151935090505f805160206135da83398151915283810381900683085f805160206135da8339815191528082860983096106208601526102408501516102008601519094505f805160206135da833981519152908103819006840890505f805160206135da83398151915280828609830961064086015261022085015193505f805160206135da833981519152848103819006840890505f805160206135da8339815191528082860983096106608601526102008501516102408601519094505f805160206135da833981519152908103819006840890505f805160206135da8339815191528082860983096060610620018601525050505050565b60608101515f805160206135da833981519152805f805160206135da833981519152805f805160206135ba83398151915260c0870151095f805160206135da833981519152030660c0850151085f805160206135da833981519152610260850151600309096102608301515f805160206135da83398151915281810381900684085f805160206135da8339815191528082840984096106a08601526102a08501516102808601519092505f805160206135da833981519152908103819006850890505f805160206135da8339815191528082840984096106c08601526102808501516102a08601519092505f805160206135da833981519152908103819006850890505f805160206135da83398151915280828409840960406106a0018601525f805160206135da833981519152805f805160206135da83398151915260c08801515f805160206135da83398151915203065f805160206135da8339815191525f805160206135ba83398151915260c08a015109085f805160206135da8339815191526102c0880151600309096102c086015190935091505f805160206135da833981519152828103819006850890505f805160206135da8339815191528082840984096107008601526103008501516102e08601519092505f805160206135da833981519152908103819006850890505f805160206135da8339815191528082840984096107208601526102e08501516103008601519092505f805160206135da833981519152908103819006850890505f805160206135da83398151915280828409840960a06106a0018601525050505050565b60608101515f805160206135da833981519152806101e08401515f805160206135da833981519152030682085f805160206135da833981519152805f805160206135da8339815191526102008601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526102208601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526102408601515f805160206135da8339815191520306840882099050806104e08401525f805160206135da833981519152806102608501515f805160206135da8339815191520306830890505f805160206135da833981519152805f805160206135da8339815191526102808601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526102a08601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526102c08601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526102e08601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526103008601515f805160206135da83398151915203068408820990508061050084015261188583611023565b61188e836112b6565b611897836113fb565b505060c081015160015f805160206135da8339815191525f805160206135fa8339815191528301819006630100000009610760840152505061089f8161005a565b6104a08101515f805160206135da83398151915281610760840151096107608301525050565b5f5f805160206135da833981519152805f805160206135da83398151915285356107608601510983030106905080610320830152505050565b600160608201515f805160206135da83398151915281830991505f805160206135da83398151915281830991505f805160206135da83398151915281830991505f805160206135da83398151915281830991505f805160206135da83398151915281830991505f805160206135da83398151915281830991505f805160206135da83398151915281830991505f805160206135da8339815191528183099150505f805160206135da8339815191528060c08401515f805160206135da8339815191520306820860e08301519091505f9081805f805160206135da83398151915280846101243509610104350891505f805160206135da83398151915283840990505f805160206135da83398151915280826101643509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101443509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101843509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101a43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101c43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101e43509830891505f805160206135da833981519152805f805160206135da8339815191525f61052001890151880984098508935061010086015192505f805160206135da83398151915280846101243509610104350891505f805160206135da83398151915283840990505f805160206135da83398151915280826101643509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101443509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101843509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101a43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101c43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101e43509830891505f805160206135da833981519152805f805160206135da833981519152602061052001890151880984098508935061012086015192505f805160206135da83398151915280846101243509610104350891505f805160206135da83398151915283840990505f805160206135da83398151915280826101643509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101443509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101843509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101a43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101c43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101e43509830891505f805160206135da833981519152805f805160206135da833981519152604061052001890151880984098508935061014086015192505f805160206135da83398151915280846101243509610104350891505f805160206135da83398151915283840990505f805160206135da83398151915280826101643509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101443509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101843509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101a43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101c43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101e43509830891505f805160206135da833981519152805f805160206135da833981519152606061052001890151880984098508935061016086015192505f805160206135da83398151915280846101243509610104350891505f805160206135da83398151915283840990505f805160206135da83398151915280826101643509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101443509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101843509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101a43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101c43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101e43509830891505f805160206135da833981519152805f805160206135da833981519152608061052001890151880984098508935061018086015192505f805160206135da83398151915280846101243509610104350891505f805160206135da83398151915283840990505f805160206135da83398151915280826101643509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101443509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101843509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101a43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101c43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101e43509830891505f805160206135da833981519152805f805160206135da83398151915260a06105200189015188098409850893506101a086015192505f805160206135da83398151915280846101243509610104350891505f805160206135da83398151915283840990505f805160206135da83398151915280826101643509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101443509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101843509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101a43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101c43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101e43509830891505f805160206135da833981519152805f805160206135da83398151915260c06105200189015188098409850893506101c086015192505f805160206135da83398151915280846101243509610104350891505f805160206135da83398151915283840990505f805160206135da83398151915280826101643509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101443509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101843509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101a43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101c43509830891505f805160206135da83398151915283820990505f805160206135da83398151915280826101e4350983089150505f805160206135da833981519152805f805160206135da83398151915260e0610520018801518709830984089250505080610340840152505050565b600160608201515f805160206135da83398151915281830991505f805160206135da83398151915281830991505f805160206135da83398151915281830991505f805160206135da8339815191528183099150505f805160206135da8339815191528060c08401515f805160206135da8339815191520306820890505f6102043561022435610244355f805160206135da83398151915283610104350993505f805160206135da83398151915280836101243509850893505f805160206135da833981519152805f805160206135da8339815191528486096101443509850893505f805160206135da83398151915280826101643509850893505f805160206135da83398151915261018435850893505f805160206135da833981519152610320870151850893505f805160206135da8339815191526104c087015185096101e08701519094505f908490825f805160206135da83398151915280878409840892505f805160206135da83398151915282830990505f805160206135da83398151915280868309840892505f805160206135da83398151915280895f805160206135da83398151915285850909840892505f805160206135da833981519152805f805160206135da83398151915260205f02610620018d01518c098509850893508692506102008a015191505f805160206135da83398151915280878409840892505f805160206135da83398151915282830990505f805160206135da83398151915280868309840892505f805160206135da83398151915280895f805160206135da83398151915285850909840892505f805160206135da833981519152805f805160206135da8339815191526020600102610620018d01518c098509850893508692506102208a015191505f805160206135da83398151915280878409840892505f805160206135da83398151915282830990505f805160206135da83398151915280868309840892505f805160206135da83398151915280895f805160206135da83398151915285850909840892505f805160206135da833981519152805f805160206135da8339815191526020600202610620018d01518c098509850893508692506102408a015191505f805160206135da83398151915280878409840892505f805160206135da83398151915282830990505f805160206135da83398151915280868309840892505f805160206135da83398151915280895f805160206135da833981519152858509098408925050505f805160206135da833981519152805f805160206135da8339815191526020600302610620018b01518a09830983089150508061036088015250505050505050565b606081015160015f805160206135da83398151915281830990505f805160206135da83398151915281830990505f805160206135da83398151915281830990505f805160206135da83398151915281830990505f805160206135da83398151915281830990505f805160206135da833981519152818309905060015f805160206135da83398151915281840990505f805160206135da83398151915281840990505f805160206135da83398151915281840990505f805160206135da8339815191528060c08601515f805160206135da8339815191525f805160206135ba83398151915260c08901510908820990505f805160206135da83398151915280825f805160206135da8339815191520306830860c08501519092505f805160206135da83398151915290815f805160206135ba83398151915282090990505f805160206135da8339815191528183089150505f91505f5f805160206135da83398151915260c085015160208601510960408501515f805160206135da83398151915280828408610204350892505f805160206135da833981519152805f805160206135da833981519152835f805160206135da83398151915260028709086102243508840992505f805160206135da833981519152805f805160206135da833981519152835f805160206135da83398151915260038709086102443508840992505f805160206135da83398151915261026435840992505f805160206135da83398151915280825f805160206135da8339815191526101a43560208b01510908610204350894505f805160206135da833981519152805f805160206135da833981519152835f805160206135da8339815191526101c43560208c015109086102243508860994505f805160206135da833981519152805f805160206135da833981519152835f805160206135da8339815191526101e43560208c015109086102443508860994505f805160206135da83398151915261028435860994505f805160206135da83398151915280865f805160206135da8339815191520306840892505f805160206135da8339815191526104c0870151840992506001610264350394505f805160206135da833981519152610760870151860994505f805160206135da8339815191526104c0870151860961026087015190955091505f9050805f805160206135da83398151915280878509610264350890505f805160206135da83398151915280855f805160206135da83398151915286870909820890505f805160206135da833981519152805f805160206135da83398151915260205f026106a0018a0151880983098308915061028087015192505f805160206135da83398151915280878509610264350890505f805160206135da83398151915280855f805160206135da83398151915286870909820890505f805160206135da833981519152805f805160206135da83398151915260206001026106a0018a015188098309830891506102a087015192505f805160206135da83398151915280878509610264350890505f805160206135da83398151915280855f805160206135da83398151915286870909820890505f805160206135da833981519152805f805160206135da83398151915260206002026106a0018a015188098309830891506102c087015192505f805160206135da833981519152806102a4358509610284350890505f805160206135da833981519152806102c4355f805160206135da83398151915286870909820890505f805160206135da833981519152805f805160206135da83398151915260206003026106a0018a015188098309830891506102e087015192505f805160206135da833981519152806102a4358509610284350890505f805160206135da833981519152806102c4355f805160206135da83398151915286870909820890505f805160206135da833981519152805f805160206135da83398151915260206004026106a0018a0151880983098308915061030087015192505f805160206135da833981519152806102a4358509610284350890505f805160206135da833981519152806102c4355f805160206135da83398151915286870909820890505f805160206135da833981519152805f805160206135da83398151915260206005026106a0018a015188098309830891505080610380870152505050505050565b6040518151815260208201516020820152825160408201526020830151606082015260408260808360066107d05a03fa9050806108f2575f805260205ff35b5f604051833581526020840135602082015284604082015260408160608360076107d05a03fa915081612f70575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa91505080612f9f575f805260205ff35b50505050565b5f60405183815284602082015285604082015260408160608360076107d05a03fa915081612fd5575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa91505080613004575f805260205ff35b5050505050565b60608101515f805160206135da8339815191528060e08401515f805160206135da833981519152030682085f805160206135da833981519152805f805160206135da8339815191526101008601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526101208601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526101408601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526101608601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526101808601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526101a08601515f805160206135da83398151915203068408820990505f805160206135da833981519152805f805160206135da8339815191526101c08601515f805160206135da83398151915203068408820990505f805160206135da833981519152806104e0850151830984510991505f805160206135da83398151915280610500850151830984515f805160206135da833981519152908009095f8051602061363a8339815191526103a08501525f8051602061361a83398151915260206103a0018501526132478360046103a08701612f3b565b6132578160446103a08701612f3b565b6132ab5f805160206135da833981519152805f805160206135da83398151915261038088015185095f805160206135da83398151915261036089015188090861034087015108600260016103e08801612fa5565b506108f28160846104208601612f3b565b604051610400820180515f8051602061355a8339815191529081038190069091526104408301805182039190910690525f906133006103e084016103a08501612efc565b61331261042084016103a08501612efc565b613326606084015160c46103a08601612f3b565b6103a083015181526103c08301516020808301919091527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a083015260c43560c08301525f8051602061355a83398151915260e43581030660e08301527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6101008301527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6101208301527f1970ea81dd6992adfbc571effb03503adbbb6a857f578403c6c40e22d65b3c026101408301527f054793348f12c0cf5622c340573cb277586319de359ab9389778f689786b1e48610160830152816101808160086107d05a03fa90511692915050565b60405161078081016040526134bb6108f7565b6134c583826109e1565b6134ce81611651565b6134d7816118d8565b6134e183826118fe565b6134ea81611937565b6134f3816124df565b6134fc816128b6565b6135058161300b565b61350e816132bc565b9050805f5260205ff35b5f8061032080848603121561352b575f80fd5b61030084018581111561353c575f80fd5b84935085828601111561354d575f80fd5b8092505050925092905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4730644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f2330644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f7036360c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000130644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000001f7e1d70965392e542392cab2e10e88c03912b89107ae96c3a6b13f31f3a4cd016d70f6937b88ea2890451712281f2073db9ac923d49d38d833cbbcbc2b281c8a26469706673582212205fa66a592bf4101f1e5004b13a7e721aec22545c56503f32844822602575231564736f6c63430008140033", + "bytecode": "0x608060405234801561001057600080fd5b5061389e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80639121da8a14610030575b600080fd5b61004361003e366004613723565b610057565b604051901515815260200160405180910390f35b60006136b1565b6040516104c08201518082526020820191506000805160206137e98339815191526104e0840151820990508082526020820191506000805160206137e9833981519152610500840151820990508082526020820191506000805160206137e9833981519152610520840151820990508082526020820191506000805160206137e9833981519152602061052001840151820990508082526020820191506000805160206137e9833981519152604061052001840151820990508082526020820191506000805160206137e9833981519152606061052001840151820990508082526020820191506000805160206137e9833981519152608061052001840151820990508082526020820191506000805160206137e983398151915260a061052001840151820990508082526020820191506000805160206137e983398151915260c061052001840151820990508082526020820191506000805160206137e983398151915260e061052001840151820990508082526020820191506000805160206137e9833981519152610620840151820990508082526020820191506000805160206137e9833981519152602061062001840151820990508082526020820191506000805160206137e9833981519152604061062001840151820990508082526020820191506000805160206137e9833981519152606061062001840151820990508082526020820191506000805160206137e98339815191526106a0840151820990508082526020820191506000805160206137e983398151915260206106a001840151820990508082526020820191506000805160206137e983398151915260406106a001840151820990508082526020820191506000805160206137e983398151915260606106a001840151820990508082526020820191506000805160206137e983398151915260806106a001840151820990508082526020820191506000805160206137e983398151915260a06106a001840151820990508082526020820191506000805160206137e9833981519152610760840151820990508082526102e4356000805160206137e9833981519152818309600114610388576000805260206000f35b8091506020830392506000805160206137e98339815191528351830990506000805160206137e983398151915261076085015183099150806107608501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260a06106a001850151830991508060a06106a0018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260806106a001850151830991508060806106a0018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260606106a001850151830991508060606106a0018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260406106a001850151830991508060406106a0018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260206106a001850151830991508060206106a0018501526020830392506000805160206137e98339815191528351830990506000805160206137e98339815191526106a085015183099150806106a08501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260606106200185015183099150806060610620018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260406106200185015183099150806040610620018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260206106200185015183099150806020610620018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915261062085015183099150806106208501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260e061052001850151830991508060e0610520018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260c061052001850151830991508060c0610520018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260a061052001850151830991508060a0610520018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260806105200185015183099150806080610520018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260606105200185015183099150806060610520018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260406105200185015183099150806040610520018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260206105200185015183099150806020610520018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915261052085015183099150806105208501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915261050085015183099150806105008501526020830392506000805160206137e98339815191528351830990506000805160206137e98339815191526104e085015183099150806104e085015250806104c0840152505050565b6000805160206137e983398151915281106108e8576000805260206000f35b50565b8035602082013560008051602061376983398151915260036000805160206137698339815191528085860985090891506000805160206137698339815191528182099050808214610940576000805260206000f35b505050565b61094f60046108eb565b61095960446108eb565b61096360846108eb565b61096d60c46108eb565b610979610104356108c9565b610985610124356108c9565b610991610144356108c9565b61099d610164356108c9565b6109a9610184356108c9565b6109b56101a4356108c9565b6109c16101c4356108c9565b6109cd6101e4356108c9565b6109d9610204356108c9565b6109e5610224356108c9565b6109f1610244356108c9565b6109fd610264356108c9565b610a09610284356108c9565b610a156102a4356108c9565b610a216102c4356108c9565b610a2d6102e4356108c9565b565b60008051602061384983398151915261078082019081526000805160206138298339815191526107a0830190815283356107c084019081526004356107e085015260243561080085015260a083206000805160206137e9833981519152908190066020808701918252902081900660408601819052845260443590925260643590526060909120819006608083018190529081800960a0830181905260808301516000805160206137e9833981519152910960e08301526000805160206137e98339815191527f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8060e0840151096101008301526000805160206137e98339815191526000805160206137a983398151915260e0840151096101208301526000805160206137e98339815191527f1d59376149b959ccbd157ac850893a6f07c2d99b3852513ab8d01be8e846a56660e0840151096101408301526000805160206137e983398151915260008051602061380983398151915260e0840151096101608301526000805160206137e98339815191527f0530d09118705106cbb4a786ead16926d5d174e181a26686af5448492e42a18160e0840151096101808301526000805160206137e983398151915277b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb60e0840151096101a08301526000805160206137e98339815191527f130b17119778465cfb3acaee30f81dee20710ead41671f568b11d9ab07b95a9b60e0840151096101c083015260e08201516000805160206137e98339815191529080096101e08301526000805160206137e98339815191526000805160206137a98339815191526101e0840151096102008301526000805160206137e98339815191526000805160206138098339815191526101e0840151096102208301526000805160206137e983398151915277b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb6101e0840151096102408301526000805160206137e983398151915260a08301516101e0840151096102608301526000805160206137e9833981519152600080516020613789833981519152610260840151096102808301526000805160206137e983398151915277b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd610260840151096102a08301526000805160206137e98339815191527f283ce45a2e5b8e4e78f9fbaf5f6a348bfcfaf76dd28e5ca7121b74ef68fdec2e610260840151096102c08301526000805160206137e98339815191526000805160206137898339815191526102c0840151096102e08301526000805160206137e983398151915277b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd6102c0840151096103008301526102608201516000805160206137e98339815191529081818009098060c08401526000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e98339815191528182096000805160206137e9833981519152600080516020613809833981519152909101066104a084018190526104c0840152506107808201526101e06101046107a083013761020061078082019081206000805160206137e98339815191529081900680845282526084356107a084015260a4356107c08401526060918290200691015250565b60e0810151606082015160016000805160206137e983398151915283820990506000805160206137e983398151915283820990506000805160206137e983398151915283820990506000805160206137e983398151915283820990506000805160206137e983398151915283820990506000805160206137e983398151915283820990506000805160206137e98339815191528160080960e0850151935090506000805160206137e983398151915283810381900683086000805160206137e98339815191528082860983096105208601526101c08501516101008601519094506000805160206137e9833981519152908103819006840890506000805160206137e98339815191528082860983096105408601526101a08501516101208601519094506000805160206137e9833981519152908103819006840890506000805160206137e98339815191528082860983096105608601526101808501516101408601519094506000805160206137e9833981519152908103819006840890506000805160206137e983398151915280828609830961058086015261016085015193506000805160206137e9833981519152848103819006840890506000805160206137e98339815191528082860983096105a08601526101408501516101808601519094506000805160206137e9833981519152908103819006840890506000805160206137e98339815191528082860983096105c08601526101208501516101a08601519094506000805160206137e9833981519152908103819006840890506000805160206137e98339815191528082860983096105e08601526101008501516101c08601519094506000805160206137e9833981519152908103819006840890506000805160206137e983398151915280828609830960e0610520018601525050505050565b6101e0810151606082015160016000805160206137e983398151915283820990506000805160206137e983398151915283820990506000805160206137e9833981519152816004096101e0850151935090506000805160206137e983398151915283810381900683086000805160206137e98339815191528082860983096106208601526102408501516102008601519094506000805160206137e9833981519152908103819006840890506000805160206137e983398151915280828609830961064086015261022085015193506000805160206137e9833981519152848103819006840890506000805160206137e98339815191528082860983096106608601526102008501516102408601519094506000805160206137e9833981519152908103819006840890506000805160206137e98339815191528082860983096060610620018601525050505050565b60608101516000805160206137e9833981519152806000805160206137e9833981519152806000805160206137c983398151915260c0870151096000805160206137e9833981519152030660c0850151086000805160206137e9833981519152610260850151600309096102608301516000805160206137e983398151915281810381900684086000805160206137e98339815191528082840984096106a08601526102a08501516102808601519092506000805160206137e9833981519152908103819006850890506000805160206137e98339815191528082840984096106c08601526102808501516102a08601519092506000805160206137e9833981519152908103819006850890506000805160206137e983398151915280828409840960406106a0018601526000805160206137e9833981519152806000805160206137e983398151915260c08801516000805160206137e983398151915203066000805160206137e98339815191526000805160206137c983398151915260c08a015109086000805160206137e98339815191526102c0880151600309096102c086015190935091506000805160206137e9833981519152828103819006850890506000805160206137e98339815191528082840984096107008601526103008501516102e08601519092506000805160206137e9833981519152908103819006850890506000805160206137e98339815191528082840984096107208601526102e08501516103008601519092506000805160206137e9833981519152908103819006850890506000805160206137e983398151915280828409840960a06106a0018601525050505050565b60608101516000805160206137e9833981519152806101e08401516000805160206137e9833981519152030682086000805160206137e9833981519152806000805160206137e98339815191526102008601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526102208601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526102408601516000805160206137e98339815191520306840882099050806104e08401526000805160206137e9833981519152806102608501516000805160206137e98339815191520306830890506000805160206137e9833981519152806000805160206137e98339815191526102808601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526102a08601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526102c08601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526102e08601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526103008601516000805160206137e983398151915203068408820990508061050084015261195f836110a8565b61196883611352565b611971836114a2565b505060c081015160016000805160206137e9833981519152600080516020613809833981519152830181900663010000000961076084015250506108e88161005e565b6104a08101516000805160206137e983398151915281610760840151096107608301525050565b60006000805160206137e9833981519152806000805160206137e983398151915285356107608601510983030106905080610320830152505050565b600160608201516000805160206137e983398151915281830991506000805160206137e983398151915281830991506000805160206137e983398151915281830991506000805160206137e983398151915281830991506000805160206137e983398151915281830991506000805160206137e983398151915281830991506000805160206137e983398151915281830991506000805160206137e98339815191528183099150506000805160206137e98339815191528060c08401516000805160206137e98339815191520306820860e083015190915060009081806000805160206137e983398151915280846101243509610104350891506000805160206137e983398151915283840990506000805160206137e983398151915280826101643509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101443509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101843509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101a43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101c43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101e43509830891506000805160206137e9833981519152806000805160206137e9833981519152600061052001890151880984098508935061010086015192506000805160206137e983398151915280846101243509610104350891506000805160206137e983398151915283840990506000805160206137e983398151915280826101643509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101443509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101843509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101a43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101c43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101e43509830891506000805160206137e9833981519152806000805160206137e9833981519152602061052001890151880984098508935061012086015192506000805160206137e983398151915280846101243509610104350891506000805160206137e983398151915283840990506000805160206137e983398151915280826101643509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101443509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101843509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101a43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101c43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101e43509830891506000805160206137e9833981519152806000805160206137e9833981519152604061052001890151880984098508935061014086015192506000805160206137e983398151915280846101243509610104350891506000805160206137e983398151915283840990506000805160206137e983398151915280826101643509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101443509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101843509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101a43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101c43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101e43509830891506000805160206137e9833981519152806000805160206137e9833981519152606061052001890151880984098508935061016086015192506000805160206137e983398151915280846101243509610104350891506000805160206137e983398151915283840990506000805160206137e983398151915280826101643509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101443509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101843509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101a43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101c43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101e43509830891506000805160206137e9833981519152806000805160206137e9833981519152608061052001890151880984098508935061018086015192506000805160206137e983398151915280846101243509610104350891506000805160206137e983398151915283840990506000805160206137e983398151915280826101643509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101443509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101843509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101a43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101c43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101e43509830891506000805160206137e9833981519152806000805160206137e983398151915260a06105200189015188098409850893506101a086015192506000805160206137e983398151915280846101243509610104350891506000805160206137e983398151915283840990506000805160206137e983398151915280826101643509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101443509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101843509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101a43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101c43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101e43509830891506000805160206137e9833981519152806000805160206137e983398151915260c06105200189015188098409850893506101c086015192506000805160206137e983398151915280846101243509610104350891506000805160206137e983398151915283840990506000805160206137e983398151915280826101643509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101443509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101843509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101a43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101c43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101e4350983089150506000805160206137e9833981519152806000805160206137e983398151915260e0610520018801518709830984089250505080610340840152505050565b600160608201516000805160206137e983398151915281830991506000805160206137e983398151915281830991506000805160206137e983398151915281830991506000805160206137e98339815191528183099150506000805160206137e98339815191528060c08401516000805160206137e983398151915203068208905060006102043561022435610244356000805160206137e983398151915283610104350993506000805160206137e983398151915280836101243509850893506000805160206137e9833981519152806000805160206137e98339815191528486096101443509850893506000805160206137e983398151915280826101643509850893506000805160206137e983398151915261018435850893506000805160206137e9833981519152610320870151850893506000805160206137e98339815191526104c087015185096101e08701519094506000908490826000805160206137e983398151915280878409840892506000805160206137e983398151915282830990506000805160206137e983398151915280868309840892506000805160206137e983398151915280896000805160206137e983398151915285850909840892506000805160206137e9833981519152806000805160206137e98339815191526020600002610620018d01518c098509850893508692506102008a015191506000805160206137e983398151915280878409840892506000805160206137e983398151915282830990506000805160206137e983398151915280868309840892506000805160206137e983398151915280896000805160206137e983398151915285850909840892506000805160206137e9833981519152806000805160206137e98339815191526020600102610620018d01518c098509850893508692506102208a015191506000805160206137e983398151915280878409840892506000805160206137e983398151915282830990506000805160206137e983398151915280868309840892506000805160206137e983398151915280896000805160206137e983398151915285850909840892506000805160206137e9833981519152806000805160206137e98339815191526020600202610620018d01518c098509850893508692506102408a015191506000805160206137e983398151915280878409840892506000805160206137e983398151915282830990506000805160206137e983398151915280868309840892506000805160206137e983398151915280896000805160206137e9833981519152858509098408925050506000805160206137e9833981519152806000805160206137e98339815191526020600302610620018b01518a09830983089150508061036088015250505050505050565b606081015160016000805160206137e983398151915281830990506000805160206137e983398151915281830990506000805160206137e983398151915281830990506000805160206137e983398151915281830990506000805160206137e983398151915281830990506000805160206137e9833981519152818309905060016000805160206137e983398151915281840990506000805160206137e983398151915281840990506000805160206137e983398151915281840990506000805160206137e98339815191528060c08601516000805160206137e98339815191526000805160206137c983398151915260c08901510908820990506000805160206137e983398151915280826000805160206137e98339815191520306830860c08501519092506000805160206137e983398151915290816000805160206137c983398151915282090990506000805160206137e98339815191528183089150506000915060006000805160206137e983398151915260c085015160208601510960408501516000805160206137e983398151915280828408610204350892506000805160206137e9833981519152806000805160206137e9833981519152836000805160206137e983398151915260028709086102243508840992506000805160206137e9833981519152806000805160206137e9833981519152836000805160206137e983398151915260038709086102443508840992506000805160206137e983398151915261026435840992506000805160206137e983398151915280826000805160206137e98339815191526101a43560208b01510908610204350894506000805160206137e9833981519152806000805160206137e9833981519152836000805160206137e98339815191526101c43560208c015109086102243508860994506000805160206137e9833981519152806000805160206137e9833981519152836000805160206137e98339815191526101e43560208c015109086102443508860994506000805160206137e983398151915261028435860994506000805160206137e983398151915280866000805160206137e98339815191520306840892506000805160206137e98339815191526104c0870151840992506001610264350394506000805160206137e9833981519152610760870151860994506000805160206137e98339815191526104c08701518609610260870151909550915060009050806000805160206137e983398151915280878509610264350890506000805160206137e983398151915280856000805160206137e983398151915286870909820890506000805160206137e9833981519152806000805160206137e983398151915260206000026106a0018a0151880983098308915061028087015192506000805160206137e983398151915280878509610264350890506000805160206137e983398151915280856000805160206137e983398151915286870909820890506000805160206137e9833981519152806000805160206137e983398151915260206001026106a0018a015188098309830891506102a087015192506000805160206137e983398151915280878509610264350890506000805160206137e983398151915280856000805160206137e983398151915286870909820890506000805160206137e9833981519152806000805160206137e983398151915260206002026106a0018a015188098309830891506102c087015192506000805160206137e9833981519152806102a4358509610284350890506000805160206137e9833981519152806102c4356000805160206137e983398151915286870909820890506000805160206137e9833981519152806000805160206137e983398151915260206003026106a0018a015188098309830891506102e087015192506000805160206137e9833981519152806102a4358509610284350890506000805160206137e9833981519152806102c4356000805160206137e983398151915286870909820890506000805160206137e9833981519152806000805160206137e983398151915260206004026106a0018a0151880983098308915061030087015192506000805160206137e9833981519152806102a4358509610284350890506000805160206137e9833981519152806102c4356000805160206137e983398151915286870909820890506000805160206137e9833981519152806000805160206137e983398151915260206005026106a0018a015188098309830891505080610380870152505050505050565b6040518151815260208201516020820152825160408201526020830151606082015260408260808360066107d05a03fa905080610940576000805260206000f35b6000604051833581526020840135602082015284604082015260408160608360076107d05a03fa915081613150576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa91505080613181576000805260206000f35b50505050565b600060405183815284602082015285604082015260408160608360076107d05a03fa9150816131ba576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa915050806131eb576000805260206000f35b5050505050565b60608101516000805160206137e98339815191528060e08401516000805160206137e9833981519152030682086000805160206137e9833981519152806000805160206137e98339815191526101008601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526101208601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526101408601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526101608601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526101808601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526101a08601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526101c08601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806104e0850151830984510991506000805160206137e983398151915280610500850151830984516000805160206137e9833981519152908009096000805160206138498339815191526103a085015260008051602061382983398151915260206103a00185015261344a8360046103a08701613118565b61345a8160446103a08701613118565b6134b16000805160206137e9833981519152806000805160206137e983398151915261038088015185096000805160206137e983398151915261036089015188090861034087015108600260016103e08801613187565b506109408160846104208601613118565b604051610400820180516000805160206137698339815191529081038190069091526104408301805182039190910690526000906135086103e084016103a085016130d7565b61351a61042084016103a085016130d7565b61352e606084015160c46103a08601613118565b6103a083015181526103c08301516020808301919091527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a083015260c43560c083015260008051602061376983398151915260e43581030660e08301527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6101008301527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6101208301527f1970ea81dd6992adfbc571effb03503adbbb6a857f578403c6c40e22d65b3c026101408301527f054793348f12c0cf5622c340573cb277586319de359ab9389778f689786b1e48610160830152816101808160086107d05a03fa90511692915050565b60405161078081016040526136c4610945565b6136ce8382610a2f565b6136d78161170f565b6136e0816119b4565b6136ea83826119db565b6136f381611a17565b6136fc81612643565b61370581612a47565b61370e816131f2565b613717816134c2565b90508060005260206000f35b60008061032080848603121561373857600080fd5b61030084018581111561374a57600080fd5b84935085828601111561375c57600080fd5b8092505050925092905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4730644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f2330644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f7036360c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000130644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000001f7e1d70965392e542392cab2e10e88c03912b89107ae96c3a6b13f31f3a4cd016d70f6937b88ea2890451712281f2073db9ac923d49d38d833cbbcbc2b281c8a2646970667358221220a785078cc5f6bc3fb1266f5d292fb6f9064dc37f0d490c579022dad84b830b3164736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80639121da8a14610030575b600080fd5b61004361003e366004613723565b610057565b604051901515815260200160405180910390f35b60006136b1565b6040516104c08201518082526020820191506000805160206137e98339815191526104e0840151820990508082526020820191506000805160206137e9833981519152610500840151820990508082526020820191506000805160206137e9833981519152610520840151820990508082526020820191506000805160206137e9833981519152602061052001840151820990508082526020820191506000805160206137e9833981519152604061052001840151820990508082526020820191506000805160206137e9833981519152606061052001840151820990508082526020820191506000805160206137e9833981519152608061052001840151820990508082526020820191506000805160206137e983398151915260a061052001840151820990508082526020820191506000805160206137e983398151915260c061052001840151820990508082526020820191506000805160206137e983398151915260e061052001840151820990508082526020820191506000805160206137e9833981519152610620840151820990508082526020820191506000805160206137e9833981519152602061062001840151820990508082526020820191506000805160206137e9833981519152604061062001840151820990508082526020820191506000805160206137e9833981519152606061062001840151820990508082526020820191506000805160206137e98339815191526106a0840151820990508082526020820191506000805160206137e983398151915260206106a001840151820990508082526020820191506000805160206137e983398151915260406106a001840151820990508082526020820191506000805160206137e983398151915260606106a001840151820990508082526020820191506000805160206137e983398151915260806106a001840151820990508082526020820191506000805160206137e983398151915260a06106a001840151820990508082526020820191506000805160206137e9833981519152610760840151820990508082526102e4356000805160206137e9833981519152818309600114610388576000805260206000f35b8091506020830392506000805160206137e98339815191528351830990506000805160206137e983398151915261076085015183099150806107608501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260a06106a001850151830991508060a06106a0018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260806106a001850151830991508060806106a0018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260606106a001850151830991508060606106a0018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260406106a001850151830991508060406106a0018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260206106a001850151830991508060206106a0018501526020830392506000805160206137e98339815191528351830990506000805160206137e98339815191526106a085015183099150806106a08501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260606106200185015183099150806060610620018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260406106200185015183099150806040610620018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260206106200185015183099150806020610620018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915261062085015183099150806106208501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260e061052001850151830991508060e0610520018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260c061052001850151830991508060c0610520018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260a061052001850151830991508060a0610520018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260806105200185015183099150806080610520018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260606105200185015183099150806060610520018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260406105200185015183099150806040610520018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260206105200185015183099150806020610520018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915261052085015183099150806105208501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915261050085015183099150806105008501526020830392506000805160206137e98339815191528351830990506000805160206137e98339815191526104e085015183099150806104e085015250806104c0840152505050565b6000805160206137e983398151915281106108e8576000805260206000f35b50565b8035602082013560008051602061376983398151915260036000805160206137698339815191528085860985090891506000805160206137698339815191528182099050808214610940576000805260206000f35b505050565b61094f60046108eb565b61095960446108eb565b61096360846108eb565b61096d60c46108eb565b610979610104356108c9565b610985610124356108c9565b610991610144356108c9565b61099d610164356108c9565b6109a9610184356108c9565b6109b56101a4356108c9565b6109c16101c4356108c9565b6109cd6101e4356108c9565b6109d9610204356108c9565b6109e5610224356108c9565b6109f1610244356108c9565b6109fd610264356108c9565b610a09610284356108c9565b610a156102a4356108c9565b610a216102c4356108c9565b610a2d6102e4356108c9565b565b60008051602061384983398151915261078082019081526000805160206138298339815191526107a0830190815283356107c084019081526004356107e085015260243561080085015260a083206000805160206137e9833981519152908190066020808701918252902081900660408601819052845260443590925260643590526060909120819006608083018190529081800960a0830181905260808301516000805160206137e9833981519152910960e08301526000805160206137e98339815191527f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8060e0840151096101008301526000805160206137e98339815191526000805160206137a983398151915260e0840151096101208301526000805160206137e98339815191527f1d59376149b959ccbd157ac850893a6f07c2d99b3852513ab8d01be8e846a56660e0840151096101408301526000805160206137e983398151915260008051602061380983398151915260e0840151096101608301526000805160206137e98339815191527f0530d09118705106cbb4a786ead16926d5d174e181a26686af5448492e42a18160e0840151096101808301526000805160206137e983398151915277b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb60e0840151096101a08301526000805160206137e98339815191527f130b17119778465cfb3acaee30f81dee20710ead41671f568b11d9ab07b95a9b60e0840151096101c083015260e08201516000805160206137e98339815191529080096101e08301526000805160206137e98339815191526000805160206137a98339815191526101e0840151096102008301526000805160206137e98339815191526000805160206138098339815191526101e0840151096102208301526000805160206137e983398151915277b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb6101e0840151096102408301526000805160206137e983398151915260a08301516101e0840151096102608301526000805160206137e9833981519152600080516020613789833981519152610260840151096102808301526000805160206137e983398151915277b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd610260840151096102a08301526000805160206137e98339815191527f283ce45a2e5b8e4e78f9fbaf5f6a348bfcfaf76dd28e5ca7121b74ef68fdec2e610260840151096102c08301526000805160206137e98339815191526000805160206137898339815191526102c0840151096102e08301526000805160206137e983398151915277b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd6102c0840151096103008301526102608201516000805160206137e98339815191529081818009098060c08401526000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e98339815191528182096000805160206137e9833981519152600080516020613809833981519152909101066104a084018190526104c0840152506107808201526101e06101046107a083013761020061078082019081206000805160206137e98339815191529081900680845282526084356107a084015260a4356107c08401526060918290200691015250565b60e0810151606082015160016000805160206137e983398151915283820990506000805160206137e983398151915283820990506000805160206137e983398151915283820990506000805160206137e983398151915283820990506000805160206137e983398151915283820990506000805160206137e983398151915283820990506000805160206137e98339815191528160080960e0850151935090506000805160206137e983398151915283810381900683086000805160206137e98339815191528082860983096105208601526101c08501516101008601519094506000805160206137e9833981519152908103819006840890506000805160206137e98339815191528082860983096105408601526101a08501516101208601519094506000805160206137e9833981519152908103819006840890506000805160206137e98339815191528082860983096105608601526101808501516101408601519094506000805160206137e9833981519152908103819006840890506000805160206137e983398151915280828609830961058086015261016085015193506000805160206137e9833981519152848103819006840890506000805160206137e98339815191528082860983096105a08601526101408501516101808601519094506000805160206137e9833981519152908103819006840890506000805160206137e98339815191528082860983096105c08601526101208501516101a08601519094506000805160206137e9833981519152908103819006840890506000805160206137e98339815191528082860983096105e08601526101008501516101c08601519094506000805160206137e9833981519152908103819006840890506000805160206137e983398151915280828609830960e0610520018601525050505050565b6101e0810151606082015160016000805160206137e983398151915283820990506000805160206137e983398151915283820990506000805160206137e9833981519152816004096101e0850151935090506000805160206137e983398151915283810381900683086000805160206137e98339815191528082860983096106208601526102408501516102008601519094506000805160206137e9833981519152908103819006840890506000805160206137e983398151915280828609830961064086015261022085015193506000805160206137e9833981519152848103819006840890506000805160206137e98339815191528082860983096106608601526102008501516102408601519094506000805160206137e9833981519152908103819006840890506000805160206137e98339815191528082860983096060610620018601525050505050565b60608101516000805160206137e9833981519152806000805160206137e9833981519152806000805160206137c983398151915260c0870151096000805160206137e9833981519152030660c0850151086000805160206137e9833981519152610260850151600309096102608301516000805160206137e983398151915281810381900684086000805160206137e98339815191528082840984096106a08601526102a08501516102808601519092506000805160206137e9833981519152908103819006850890506000805160206137e98339815191528082840984096106c08601526102808501516102a08601519092506000805160206137e9833981519152908103819006850890506000805160206137e983398151915280828409840960406106a0018601526000805160206137e9833981519152806000805160206137e983398151915260c08801516000805160206137e983398151915203066000805160206137e98339815191526000805160206137c983398151915260c08a015109086000805160206137e98339815191526102c0880151600309096102c086015190935091506000805160206137e9833981519152828103819006850890506000805160206137e98339815191528082840984096107008601526103008501516102e08601519092506000805160206137e9833981519152908103819006850890506000805160206137e98339815191528082840984096107208601526102e08501516103008601519092506000805160206137e9833981519152908103819006850890506000805160206137e983398151915280828409840960a06106a0018601525050505050565b60608101516000805160206137e9833981519152806101e08401516000805160206137e9833981519152030682086000805160206137e9833981519152806000805160206137e98339815191526102008601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526102208601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526102408601516000805160206137e98339815191520306840882099050806104e08401526000805160206137e9833981519152806102608501516000805160206137e98339815191520306830890506000805160206137e9833981519152806000805160206137e98339815191526102808601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526102a08601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526102c08601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526102e08601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526103008601516000805160206137e983398151915203068408820990508061050084015261195f836110a8565b61196883611352565b611971836114a2565b505060c081015160016000805160206137e9833981519152600080516020613809833981519152830181900663010000000961076084015250506108e88161005e565b6104a08101516000805160206137e983398151915281610760840151096107608301525050565b60006000805160206137e9833981519152806000805160206137e983398151915285356107608601510983030106905080610320830152505050565b600160608201516000805160206137e983398151915281830991506000805160206137e983398151915281830991506000805160206137e983398151915281830991506000805160206137e983398151915281830991506000805160206137e983398151915281830991506000805160206137e983398151915281830991506000805160206137e983398151915281830991506000805160206137e98339815191528183099150506000805160206137e98339815191528060c08401516000805160206137e98339815191520306820860e083015190915060009081806000805160206137e983398151915280846101243509610104350891506000805160206137e983398151915283840990506000805160206137e983398151915280826101643509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101443509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101843509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101a43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101c43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101e43509830891506000805160206137e9833981519152806000805160206137e9833981519152600061052001890151880984098508935061010086015192506000805160206137e983398151915280846101243509610104350891506000805160206137e983398151915283840990506000805160206137e983398151915280826101643509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101443509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101843509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101a43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101c43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101e43509830891506000805160206137e9833981519152806000805160206137e9833981519152602061052001890151880984098508935061012086015192506000805160206137e983398151915280846101243509610104350891506000805160206137e983398151915283840990506000805160206137e983398151915280826101643509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101443509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101843509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101a43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101c43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101e43509830891506000805160206137e9833981519152806000805160206137e9833981519152604061052001890151880984098508935061014086015192506000805160206137e983398151915280846101243509610104350891506000805160206137e983398151915283840990506000805160206137e983398151915280826101643509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101443509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101843509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101a43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101c43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101e43509830891506000805160206137e9833981519152806000805160206137e9833981519152606061052001890151880984098508935061016086015192506000805160206137e983398151915280846101243509610104350891506000805160206137e983398151915283840990506000805160206137e983398151915280826101643509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101443509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101843509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101a43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101c43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101e43509830891506000805160206137e9833981519152806000805160206137e9833981519152608061052001890151880984098508935061018086015192506000805160206137e983398151915280846101243509610104350891506000805160206137e983398151915283840990506000805160206137e983398151915280826101643509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101443509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101843509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101a43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101c43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101e43509830891506000805160206137e9833981519152806000805160206137e983398151915260a06105200189015188098409850893506101a086015192506000805160206137e983398151915280846101243509610104350891506000805160206137e983398151915283840990506000805160206137e983398151915280826101643509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101443509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101843509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101a43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101c43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101e43509830891506000805160206137e9833981519152806000805160206137e983398151915260c06105200189015188098409850893506101c086015192506000805160206137e983398151915280846101243509610104350891506000805160206137e983398151915283840990506000805160206137e983398151915280826101643509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101443509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101843509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101a43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101c43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101e4350983089150506000805160206137e9833981519152806000805160206137e983398151915260e0610520018801518709830984089250505080610340840152505050565b600160608201516000805160206137e983398151915281830991506000805160206137e983398151915281830991506000805160206137e983398151915281830991506000805160206137e98339815191528183099150506000805160206137e98339815191528060c08401516000805160206137e983398151915203068208905060006102043561022435610244356000805160206137e983398151915283610104350993506000805160206137e983398151915280836101243509850893506000805160206137e9833981519152806000805160206137e98339815191528486096101443509850893506000805160206137e983398151915280826101643509850893506000805160206137e983398151915261018435850893506000805160206137e9833981519152610320870151850893506000805160206137e98339815191526104c087015185096101e08701519094506000908490826000805160206137e983398151915280878409840892506000805160206137e983398151915282830990506000805160206137e983398151915280868309840892506000805160206137e983398151915280896000805160206137e983398151915285850909840892506000805160206137e9833981519152806000805160206137e98339815191526020600002610620018d01518c098509850893508692506102008a015191506000805160206137e983398151915280878409840892506000805160206137e983398151915282830990506000805160206137e983398151915280868309840892506000805160206137e983398151915280896000805160206137e983398151915285850909840892506000805160206137e9833981519152806000805160206137e98339815191526020600102610620018d01518c098509850893508692506102208a015191506000805160206137e983398151915280878409840892506000805160206137e983398151915282830990506000805160206137e983398151915280868309840892506000805160206137e983398151915280896000805160206137e983398151915285850909840892506000805160206137e9833981519152806000805160206137e98339815191526020600202610620018d01518c098509850893508692506102408a015191506000805160206137e983398151915280878409840892506000805160206137e983398151915282830990506000805160206137e983398151915280868309840892506000805160206137e983398151915280896000805160206137e9833981519152858509098408925050506000805160206137e9833981519152806000805160206137e98339815191526020600302610620018b01518a09830983089150508061036088015250505050505050565b606081015160016000805160206137e983398151915281830990506000805160206137e983398151915281830990506000805160206137e983398151915281830990506000805160206137e983398151915281830990506000805160206137e983398151915281830990506000805160206137e9833981519152818309905060016000805160206137e983398151915281840990506000805160206137e983398151915281840990506000805160206137e983398151915281840990506000805160206137e98339815191528060c08601516000805160206137e98339815191526000805160206137c983398151915260c08901510908820990506000805160206137e983398151915280826000805160206137e98339815191520306830860c08501519092506000805160206137e983398151915290816000805160206137c983398151915282090990506000805160206137e98339815191528183089150506000915060006000805160206137e983398151915260c085015160208601510960408501516000805160206137e983398151915280828408610204350892506000805160206137e9833981519152806000805160206137e9833981519152836000805160206137e983398151915260028709086102243508840992506000805160206137e9833981519152806000805160206137e9833981519152836000805160206137e983398151915260038709086102443508840992506000805160206137e983398151915261026435840992506000805160206137e983398151915280826000805160206137e98339815191526101a43560208b01510908610204350894506000805160206137e9833981519152806000805160206137e9833981519152836000805160206137e98339815191526101c43560208c015109086102243508860994506000805160206137e9833981519152806000805160206137e9833981519152836000805160206137e98339815191526101e43560208c015109086102443508860994506000805160206137e983398151915261028435860994506000805160206137e983398151915280866000805160206137e98339815191520306840892506000805160206137e98339815191526104c0870151840992506001610264350394506000805160206137e9833981519152610760870151860994506000805160206137e98339815191526104c08701518609610260870151909550915060009050806000805160206137e983398151915280878509610264350890506000805160206137e983398151915280856000805160206137e983398151915286870909820890506000805160206137e9833981519152806000805160206137e983398151915260206000026106a0018a0151880983098308915061028087015192506000805160206137e983398151915280878509610264350890506000805160206137e983398151915280856000805160206137e983398151915286870909820890506000805160206137e9833981519152806000805160206137e983398151915260206001026106a0018a015188098309830891506102a087015192506000805160206137e983398151915280878509610264350890506000805160206137e983398151915280856000805160206137e983398151915286870909820890506000805160206137e9833981519152806000805160206137e983398151915260206002026106a0018a015188098309830891506102c087015192506000805160206137e9833981519152806102a4358509610284350890506000805160206137e9833981519152806102c4356000805160206137e983398151915286870909820890506000805160206137e9833981519152806000805160206137e983398151915260206003026106a0018a015188098309830891506102e087015192506000805160206137e9833981519152806102a4358509610284350890506000805160206137e9833981519152806102c4356000805160206137e983398151915286870909820890506000805160206137e9833981519152806000805160206137e983398151915260206004026106a0018a0151880983098308915061030087015192506000805160206137e9833981519152806102a4358509610284350890506000805160206137e9833981519152806102c4356000805160206137e983398151915286870909820890506000805160206137e9833981519152806000805160206137e983398151915260206005026106a0018a015188098309830891505080610380870152505050505050565b6040518151815260208201516020820152825160408201526020830151606082015260408260808360066107d05a03fa905080610940576000805260206000f35b6000604051833581526020840135602082015284604082015260408160608360076107d05a03fa915081613150576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa91505080613181576000805260206000f35b50505050565b600060405183815284602082015285604082015260408160608360076107d05a03fa9150816131ba576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa915050806131eb576000805260206000f35b5050505050565b60608101516000805160206137e98339815191528060e08401516000805160206137e9833981519152030682086000805160206137e9833981519152806000805160206137e98339815191526101008601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526101208601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526101408601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526101608601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526101808601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526101a08601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526101c08601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806104e0850151830984510991506000805160206137e983398151915280610500850151830984516000805160206137e9833981519152908009096000805160206138498339815191526103a085015260008051602061382983398151915260206103a00185015261344a8360046103a08701613118565b61345a8160446103a08701613118565b6134b16000805160206137e9833981519152806000805160206137e983398151915261038088015185096000805160206137e983398151915261036089015188090861034087015108600260016103e08801613187565b506109408160846104208601613118565b604051610400820180516000805160206137698339815191529081038190069091526104408301805182039190910690526000906135086103e084016103a085016130d7565b61351a61042084016103a085016130d7565b61352e606084015160c46103a08601613118565b6103a083015181526103c08301516020808301919091527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a083015260c43560c083015260008051602061376983398151915260e43581030660e08301527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6101008301527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6101208301527f1970ea81dd6992adfbc571effb03503adbbb6a857f578403c6c40e22d65b3c026101408301527f054793348f12c0cf5622c340573cb277586319de359ab9389778f689786b1e48610160830152816101808160086107d05a03fa90511692915050565b60405161078081016040526136c4610945565b6136ce8382610a2f565b6136d78161170f565b6136e0816119b4565b6136ea83826119db565b6136f381611a17565b6136fc81612643565b61370581612a47565b61370e816131f2565b613717816134c2565b90508060005260206000f35b60008061032080848603121561373857600080fd5b61030084018581111561374a57600080fd5b84935085828601111561375c57600080fd5b8092505050925092905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4730644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f2330644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f7036360c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000130644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000001f7e1d70965392e542392cab2e10e88c03912b89107ae96c3a6b13f31f3a4cd016d70f6937b88ea2890451712281f2073db9ac923d49d38d833cbbcbc2b281c8a2646970667358221220a785078cc5f6bc3fb1266f5d292fb6f9064dc37f0d490c579022dad84b830b3164736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonDataComittee.json b/compiled-contracts/paris/PolygonDataComittee.json index fd92e617d..4c3b04f89 100644 --- a/compiled-contracts/paris/PolygonDataComittee.json +++ b/compiled-contracts/paris/PolygonDataComittee.json @@ -1095,8 +1095,8 @@ "type": "function" } ], - "bytecode": "0x61012060405234801562000011575f80fd5b506040516200349238038062003492833981016040819052620000349162000076565b6001600160a01b0394851660a05292841660805290831660c052821660e0521661010052620000f2565b6001600160a01b038116811462000073575f80fd5b50565b5f805f805f60a086880312156200008b575f80fd5b855162000098816200005e565b6020870151909550620000ab816200005e565b6040870151909450620000be816200005e565b6060870151909350620000d1816200005e565b6080870151909250620000e4816200005e565b809150509295509295909350565b60805160a05160c05160e051610100516132b3620001df5f395f8181610385015261145301525f818161032f01528181610718015281816107b301528181610a2001528181610b760152818161150001528181611598015281816115ba015281816116fa01528181611a7901528181611af501528181611bd00152818161227a015281816122d7015281816122f901526123d901525f818161043801528181611676015261235501525f81816104d9015281816112b501528181611ccc015261208e01525f8181610526015281816105ab015281816115450152818161164c0152611ca101526132b35ff3fe608060405234801561000f575f80fd5b50600436106101e0575f3560e01c8062d0295d146101e4578063107bf28c146101ff57806319d8ac6114610214578063267822471461023f5780632b35b3ac1461025f57806332c2d1531461027c5780633c351e10146102915780633cbc795b146102a957806340b5de6c146102d557806345605267146102fd57806347ebf1081461031757806349b7b8021461032a5780634c21fef3146103515780634e48770614610365578063542028d51461037857806356e29435146103805780635e9145c9146103a75780635ec91958146103ba5780636b8616ce146103c25780636e05d2cd146103e15780636ff512cc146103ea5780638c3d7301146103fd57806399af0397146104055780639e00187714610418578063a3c573eb14610433578063aa3587d31461045a578063ada8f91914610462578063b0afe15414610475578063b81fcafd14610481578063c754c7ed14610494578063c89e42df146104ae578063cfa8ed47146104c1578063d02103ca146104d4578063d690be31146104fb578063d7bc90ff14610503578063d8d1091b1461050e578063e46761c414610521578063e7a7ed0214610548578063eaeb077b14610562578063f35dda4714610575578063f851a4401461058f575b5f80fd5b6101ec6105a7565b6040519081526020015b60405180910390f35b61020761068a565b6040516101f691906127c7565b600754610227906001600160401b031681565b6040516001600160401b0390911681526020016101f6565b600154610252906001600160a01b031681565b6040516101f691906127e0565b60085461026c9060ff1681565b60405190151581526020016101f6565b61028f61028a366004612826565b610716565b005b6008546102529061010090046001600160a01b031681565b6008546102c090600160a81b900463ffffffff1681565b60405163ffffffff90911681526020016101f6565b6102e46001600160f81b031981565b6040516001600160f81b031990911681526020016101f6565b60075461022790600160801b90046001600160401b031681565b61028f610325366004612938565b6107b1565b6102527f000000000000000000000000000000000000000000000000000000000000000081565b60085461026c90600160c81b900460ff1681565b61028f6103733660046129e7565b610b17565b610207610c8b565b6102527f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103b5366004612a49565b610c98565b61028f610cd2565b6101ec6103d03660046129e7565b60066020525f908152604090205481565b6101ec60055481565b61028f6103f8366004612a8f565b610d5d565b61028f610dd8565b610207610413366004612aa8565b610e64565b61025273a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6102527f000000000000000000000000000000000000000000000000000000000000000081565b61028f610feb565b61028f610470366004612a8f565b611064565b6101ec6405ca1ab1e081565b61028f61048f366004612b1c565b6110df565b60075461022790600160c01b90046001600160401b031681565b61028f6104bc366004612bc4565b6117a3565b600254610252906001600160a01b031681565b6102527f000000000000000000000000000000000000000000000000000000000000000081565b61020761180f565b6101ec635ca1ab1e81565b61028f61051c366004612bf5565b61182b565b6102527f000000000000000000000000000000000000000000000000000000000000000081565b60075461022790600160401b90046001600160401b031681565b61028f610570366004612c33565b611baa565b61057d601b81565b60405160ff90911681526020016101f6565b5f54610252906201000090046001600160a01b031681565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016105f591906127e0565b602060405180830381865afa158015610610573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106349190612c7a565b6007549091505f9061065f906001600160401b03600160801b8204811691600160401b900416612ca5565b6001600160401b03169050805f03610679575f9250505090565b6106838183612ccc565b9250505090565b6004805461069790612ceb565b80601f01602080910402602001604051908101604052809291908181526020018280546106c390612ceb565b801561070e5780601f106106e55761010080835404028352916020019161070e565b820191905f5260205f20905b8154815290600101906020018083116106f157829003601f168201915b505050505081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461075f57604051631736745960e31b815260040160405180910390fd5b806001600160a01b0316836001600160401b03167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966846040516107a491815260200190565b60405180910390a3505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146107fa57604051631736745960e31b815260040160405180910390fd5b5f54610100900460ff161580801561081857505f54600160ff909116105b80610838575061082730611e9c565b15801561083857505f5460ff166001145b6108a05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156108c1575f805461ff0019166101001790555b5f805462010000600160b01b031916620100006001600160a01b038b81169190910291909117909155600280546001600160a01b031916918916919091179055600361090d8482612d70565b50600461091a8382612d70565b50600780546001600160c01b0316610d2f60c71b1790556001600160a01b0385166109645763ffffffff84161561096457604051630d43a60960e11b815260040160405180910390fd5b60088054610100600160c81b0319166101006001600160a01b0388160263ffffffff60a81b191617600160a81b63ffffffff8716021790555f6109a8878787610e64565b90505f818051906020012090505f4290505f805f1b835f801b848e6040516020016109d7959493929190612e2b565b60408051808303601f19018152908290528051602090910120600780546001600160401b0319166001600160401b0386161790556005819055639a908e7360e01b825291505f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639a908e7390610a60906001908690600401612e6a565b6020604051808303815f875af1158015610a7c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa09190612e83565b6040519091506001600160401b038216905f8051602061321d833981519152905f90a250505050508015610b0d575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b5f546201000090046001600160a01b03163314610b4757604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610b745760405163f5e37f2f60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bd0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf49190612e9e565b610c2e576007546001600160401b03600160c01b909104811690821610610c2e5760405163f5e37f2f60e01b815260040160405180910390fd5b600780546001600160c01b0316600160c01b6001600160401b038416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461069790612ceb565b600854600160c81b900460ff16610cc2576040516320864d6d60e21b815260040160405180910390fd5b610ccd838383611eab565b505050565b5f546201000090046001600160a01b03163314610d0257604051634755657960e01b815260040160405180910390fd5b60085460ff1615610d265760405163f6ba91a160e01b815260040160405180910390fd5b6008805460ff191660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f546201000090046001600160a01b03163314610d8d57604051634755657960e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383161790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610c809083906127e0565b6001546001600160a01b03163314610e035760405163d1ec4b2360e01b815260040160405180910390fd5b6001545f8054620100006001600160a01b0390931692830262010000600160b01b03199091161790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e91610e5a916127e0565b60405180910390a1565b60605f60405180606001604052806021815260200161325d6021913960405163ffffffff80881660248301526001600160a01b03871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa60848201525f60a482015260c40160408051601f19818403018152918152602080830180516001600160e01b03166369a3b57f60e11b1790529051610f0293929101612ebd565b60408051601f1981840301815282825280516020808301919091205f80865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015610f6f573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116610fa35760405163668b0cb360e11b815260040160405180910390fd5b6040515f90610fd09084906405ca1ab1e090635ca1ab1e90601b906001600160f81b031990602001612eeb565b60408051808303601f19018152919052979650505050505050565b5f546201000090046001600160a01b0316331461101b57604051634755657960e01b815260040160405180910390fd5b6008805460ff60c81b198116600160c81b9182900460ff16159091021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f41905f90a1565b5f546201000090046001600160a01b0316331461109457604051634755657960e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610c809083906127e0565b6002546001600160a01b0316331461110a576040516311e7be1560e01b815260040160405180910390fd5b835f81900361112c5760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561114f57604051635acfba9d60e11b815260040160405180910390fd5b6007546005546001600160401b0380831692600160801b90041690815f5b858110156113ea575f8b8b8381811061118857611188612f2e565b90506080020180360381019061119e9190612f42565b80516060820151919250906001600160401b03161561128b57856111c181612f95565b9650505f81836020015184606001516040516020016111e293929190612fc2565b60408051601f1981840301815291815281516020928301206001600160401b038a165f908152600690935291205490915081146112325760405163671ebaaf60e11b815260040160405180910390fd5b82606001516001600160401b031683604001516001600160401b0316101561126d57604051633fbd5c3960e11b815260040160405180910390fd5b506001600160401b0386165f90815260066020526040812055611347565b602082015115801590611329575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303815f875af1158015611303573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113279190612c7a565b155b15611347576040516373bd668d60e01b815260040160405180910390fd5b866001600160401b031682604001516001600160401b0316108061137757504282604001516001600160401b0316115b15611395576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518e6040516020016113b6959493929190612e2b565b60405160208183030381529060405280519060200120945081604001519650505080806113e290612fe5565b91505061116d565b506007546001600160401b03600160401b909104811690841611156114225760405163c630a00d60e01b815260040160405180910390fd5b600780546001600160401b0319166001600160401b038616179055600582905560405163063d411f60e51b815285907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063c7a823e0906114949086908c908c90600401613025565b5f6040518083038186803b1580156114aa575f80fd5b505afa1580156114bc573d5f803e3d5ffd5b50505050816001600160401b0316846001600160401b031614611592575f6114e48386612ca5565b90506114f96001600160401b03821683613047565b915061156c7f0000000000000000000000000000000000000000000000000000000000000000826001600160401b03166115316105a7565b61153b9190613060565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190612480565b5060078054600160801b600160c01b031916600160801b6001600160401b038716021790555b611674337f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611614573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116389190612c7a565b6116429190613060565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169291906124e3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156116cc575f80fd5b505af11580156116de573d5f803e3d5ffd5b5050604051639a908e7360e01b81525f92506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150639a908e7390611732908a908890600401612e6a565b6020604051808303815f875af115801561174e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117729190612e83565b6040519091506001600160401b038216905f8051602061321d833981519152905f90a2505050505050505050505050565b5f546201000090046001600160a01b031633146117d357604051634755657960e01b815260040160405180910390fd5b60036117df8282612d70565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c8091906127c7565b60405180606001604052806021815260200161325d6021913981565b60085460ff1661184e576040516324eff8c360e01b815260040160405180910390fd5b805f8190036118705760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561189357604051635acfba9d60e11b815260040160405180910390fd5b6007546001600160401b03600160401b82048116916118bb918491600160801b900416613077565b11156118da5760405163c630a00d60e01b815260040160405180910390fd5b600754600554600160801b9091046001600160401b0316905f5b83811015611a73575f86868381811061190f5761190f612f2e565b9050602002810190611921919061308a565b61192a906130a8565b90508361193681612f95565b825180516020918201208185015160408087015190519499509194505f936119619386939101612fc2565b60408051601f1981840301815291815281516020928301206001600160401b0389165f908152600690935291205490915081146119b15760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b0386165f908152600660205260408120556119d4600188613047565b8403611a285742600760189054906101000a90046001600160401b03168460400151611a009190613122565b6001600160401b03161115611a285760405163c44a082160e01b815260040160405180910390fd5b848284602001514233604051602001611a45959493929190612e2b565b6040516020818303038152906040528051906020012094505050508080611a6b90612fe5565b9150506118f4565b50611aa17f0000000000000000000000000000000000000000000000000000000000000000846115316105a7565b6005819055600780546001600160401b03848116600160801b026001600160401b03600160801b03600160c01b0319909216429190911617179055604051639a908e7360e01b81525f906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611b2c9087908690600401612e6a565b6020604051808303815f875af1158015611b48573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b6c9190612e83565b6040519091506001600160401b038216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a2505050505050565b60085460ff16611bcd576040516324eff8c360e01b815260040160405180910390fd5b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c4e9190612c7a565b905081811115611c7157604051632354600f60e01b815260040160405180910390fd5b611388831115611c94576040516328a69b1f60e21b815260040160405180910390fd5b611cc96001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163330846124e3565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d26573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d4a9190612c7a565b60078054919250600160401b9091046001600160401b0316906008611d6e83612f95565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508484604051611da3929190613142565b604051908190038120611dbc9183904290602001612fc2565b60408051808303601f190181529181528151602092830120600754600160401b90046001600160401b03165f9081526006909352912055323303611e4b576007546040805183815233602082015260609181018290525f91810191909152600160401b9091046001600160401b0316905f8051602061323d8339815191529060800160405180910390a2611e95565b600760089054906101000a90046001600160401b03166001600160401b03165f8051602061323d83398151915282338888604051611e8c9493929190613151565b60405180910390a25b5050505050565b6001600160a01b03163b151590565b6002546001600160a01b03163314611ed6576040516311e7be1560e01b815260040160405180910390fd5b815f819003611ef85760405163cb591a5f60e01b815260040160405180910390fd5b6103e8811115611f1b57604051635acfba9d60e11b815260040160405180910390fd5b6007546005546001600160401b0380831692600160801b90041690815f5b858110156121e9575f898983818110611f5457611f54612f2e565b9050602002810190611f669190613185565b611f6f90613199565b805180516020909101206060820151919250906001600160401b0316156120645785611f9a81612f95565b9650505f8183602001518460600151604051602001611fbb93929190612fc2565b60408051601f1981840301815291815281516020928301206001600160401b038a165f9081526006909352912054909150811461200b5760405163671ebaaf60e11b815260040160405180910390fd5b82606001516001600160401b031683604001516001600160401b0316101561204657604051633fbd5c3960e11b815260040160405180910390fd5b506001600160401b0386165f90815260066020526040812055612146565b602082015115801590612102575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303815f875af11580156120dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121009190612c7a565b155b15612120576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c01015612146576040516328a69b1f60e21b815260040160405180910390fd5b866001600160401b031682604001516001600160401b0316108061217657504282604001516001600160401b0316115b15612194576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518c6040516020016121b5959493929190612e2b565b60405160208183030381529060405280519060200120945081604001519650505080806121e190612fe5565b915050611f39565b506007546001600160401b03600160401b909104811690841611156122215760405163c630a00d60e01b815260040160405180910390fd5b600780546001600160401b0319166001600160401b038681169190911790915560058390558590828116908516146122d1575f61225e8386612ca5565b90506122736001600160401b03821683613047565b91506122ab7f0000000000000000000000000000000000000000000000000000000000000000826001600160401b03166115316105a7565b5060078054600160801b600160c01b031916600160801b6001600160401b038716021790555b612353337f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611614573d5f803e3d5ffd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156123ab575f80fd5b505af11580156123bd573d5f803e3d5ffd5b5050604051639a908e7360e01b81525f92506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150639a908e7390612411908a908890600401612e6a565b6020604051808303815f875af115801561242d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124519190612e83565b6040519091506001600160401b038216905f8051602061321d833981519152905f90a250505050505050505050565b6040516001600160a01b038316602482015260448101829052610ccd90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612521565b6040516001600160a01b038085166024830152831660448201526064810182905261251b9085906323b872dd60e01b906084016124ac565b50505050565b5f612575826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166125f29092919063ffffffff16565b805190915015610ccd57808060200190518101906125939190612e9e565b610ccd5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610897565b606061260084845f85612608565b949350505050565b6060824710156126695760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610897565b5f80866001600160a01b03168587604051612684919061320b565b5f6040518083038185875af1925050503d805f81146126be576040519150601f19603f3d011682016040523d82523d5f602084013e6126c3565b606091505b50915091506126d4878383876126df565b979650505050505050565b6060831561274b5782515f03612744576126f885611e9c565b6127445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610897565b5081612600565b61260083838151156127605781518083602001fd5b8060405162461bcd60e51b815260040161089791906127c7565b5f5b8381101561279457818101518382015260200161277c565b50505f910152565b5f81518084526127b381602086016020860161277a565b601f01601f19169290920160200192915050565b602081525f6127d9602083018461279c565b9392505050565b6001600160a01b0391909116815260200190565b6001600160401b0381168114612808575f80fd5b50565b80356001600160a01b0381168114612821575f80fd5b919050565b5f805f60608486031215612838575f80fd5b8335612843816127f4565b9250602084013591506128586040850161280b565b90509250925092565b803563ffffffff81168114612821575f80fd5b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b03811182821017156128aa576128aa612874565b60405290565b5f82601f8301126128bf575f80fd5b81356001600160401b03808211156128d9576128d9612874565b604051601f8301601f19908116603f0116810190828211818310171561290157612901612874565b81604052838152866020858801011115612919575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a03121561294e575f80fd5b6129578861280b565b96506129656020890161280b565b955061297360408901612861565b94506129816060890161280b565b935061298f60808901612861565b925060a08801356001600160401b03808211156129aa575f80fd5b6129b68b838c016128b0565b935060c08a01359150808211156129cb575f80fd5b506129d88a828b016128b0565b91505092959891949750929550565b5f602082840312156129f7575f80fd5b81356127d9816127f4565b5f8083601f840112612a12575f80fd5b5081356001600160401b03811115612a28575f80fd5b6020830191508360208260051b8501011115612a42575f80fd5b9250929050565b5f805f60408486031215612a5b575f80fd5b83356001600160401b03811115612a70575f80fd5b612a7c86828701612a02565b909450925061285890506020850161280b565b5f60208284031215612a9f575f80fd5b6127d98261280b565b5f805f60608486031215612aba575f80fd5b612ac384612861565b9250612ad16020850161280b565b915061285860408501612861565b5f8083601f840112612aef575f80fd5b5081356001600160401b03811115612b05575f80fd5b602083019150836020828501011115612a42575f80fd5b5f805f805f60608688031215612b30575f80fd5b85356001600160401b0380821115612b46575f80fd5b818801915088601f830112612b59575f80fd5b813581811115612b67575f80fd5b8960208260071b8501011115612b7b575f80fd5b60208301975080965050612b916020890161280b565b94506040880135915080821115612ba6575f80fd5b50612bb388828901612adf565b969995985093965092949392505050565b5f60208284031215612bd4575f80fd5b81356001600160401b03811115612be9575f80fd5b612600848285016128b0565b5f8060208385031215612c06575f80fd5b82356001600160401b03811115612c1b575f80fd5b612c2785828601612a02565b90969095509350505050565b5f805f60408486031215612c45575f80fd5b83356001600160401b03811115612c5a575f80fd5b612c6686828701612adf565b909790965060209590950135949350505050565b5f60208284031215612c8a575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612cc557612cc5612c91565b5092915050565b5f82612ce657634e487b7160e01b5f52601260045260245ffd5b500490565b600181811c90821680612cff57607f821691505b602082108103612d1d57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610ccd575f81815260208120601f850160051c81016020861015612d495750805b601f850160051c820191505b81811015612d6857828155600101612d55565b505050505050565b81516001600160401b03811115612d8957612d89612874565b612d9d81612d978454612ceb565b84612d23565b602080601f831160018114612dd0575f8415612db95750858301515b5f19600386901b1c1916600185901b178555612d68565b5f85815260208120601f198616915b82811015612dfe57888601518255948401946001909101908401612ddf565b5085821015612e1b57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b6001600160401b03929092168252602082015260400190565b5f60208284031215612e93575f80fd5b81516127d9816127f4565b5f60208284031215612eae575f80fd5b815180151581146127d9575f80fd5b5f8351612ece81846020880161277a565b835190830190612ee281836020880161277a565b01949350505050565b5f8651612efc818460208b0161277a565b9190910194855250602084019290925260f81b6001600160f81b03199081166040840152166041820152604201919050565b634e487b7160e01b5f52603260045260245ffd5b5f60808284031215612f52575f80fd5b612f5a612888565b82358152602083013560208201526040830135612f76816127f4565b60408201526060830135612f89816127f4565b60608201529392505050565b5f6001600160401b038281166002600160401b03198101612fb857612fb8612c91565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b5f60018201612ff657612ff6612c91565b5060010190565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b838152604060208201525f61303e604083018486612ffd565b95945050505050565b8181038181111561305a5761305a612c91565b92915050565b808202811582820484141761305a5761305a612c91565b8082018082111561305a5761305a612c91565b5f8235605e1983360301811261309e575f80fd5b9190910192915050565b5f606082360312156130b8575f80fd5b604051606081016001600160401b0380821183831017156130db576130db612874565b8160405284359150808211156130ef575f80fd5b506130fc368286016128b0565b825250602083013560208201526040830135613117816127f4565b604082015292915050565b6001600160401b03818116838216019080821115612cc557612cc5612c91565b818382375f9101908152919050565b8481526001600160a01b03841660208201526060604082018190525f9061317b9083018486612ffd565b9695505050505050565b5f8235607e1983360301811261309e575f80fd5b5f608082360312156131a9575f80fd5b6131b1612888565b82356001600160401b038111156131c6575f80fd5b6131d2368286016128b0565b8252506020830135602082015260408301356131ed816127f4565b60408201526060830135613200816127f4565b606082015292915050565b5f825161309e81846020870161277a56fe303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fcef94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931f8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a26469706673582212207485279590b273ca494dfb980e9f20847a93dcde1b38eb0b3e71158ed47488ba64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106101e0575f3560e01c8062d0295d146101e4578063107bf28c146101ff57806319d8ac6114610214578063267822471461023f5780632b35b3ac1461025f57806332c2d1531461027c5780633c351e10146102915780633cbc795b146102a957806340b5de6c146102d557806345605267146102fd57806347ebf1081461031757806349b7b8021461032a5780634c21fef3146103515780634e48770614610365578063542028d51461037857806356e29435146103805780635e9145c9146103a75780635ec91958146103ba5780636b8616ce146103c25780636e05d2cd146103e15780636ff512cc146103ea5780638c3d7301146103fd57806399af0397146104055780639e00187714610418578063a3c573eb14610433578063aa3587d31461045a578063ada8f91914610462578063b0afe15414610475578063b81fcafd14610481578063c754c7ed14610494578063c89e42df146104ae578063cfa8ed47146104c1578063d02103ca146104d4578063d690be31146104fb578063d7bc90ff14610503578063d8d1091b1461050e578063e46761c414610521578063e7a7ed0214610548578063eaeb077b14610562578063f35dda4714610575578063f851a4401461058f575b5f80fd5b6101ec6105a7565b6040519081526020015b60405180910390f35b61020761068a565b6040516101f691906127c7565b600754610227906001600160401b031681565b6040516001600160401b0390911681526020016101f6565b600154610252906001600160a01b031681565b6040516101f691906127e0565b60085461026c9060ff1681565b60405190151581526020016101f6565b61028f61028a366004612826565b610716565b005b6008546102529061010090046001600160a01b031681565b6008546102c090600160a81b900463ffffffff1681565b60405163ffffffff90911681526020016101f6565b6102e46001600160f81b031981565b6040516001600160f81b031990911681526020016101f6565b60075461022790600160801b90046001600160401b031681565b61028f610325366004612938565b6107b1565b6102527f000000000000000000000000000000000000000000000000000000000000000081565b60085461026c90600160c81b900460ff1681565b61028f6103733660046129e7565b610b17565b610207610c8b565b6102527f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103b5366004612a49565b610c98565b61028f610cd2565b6101ec6103d03660046129e7565b60066020525f908152604090205481565b6101ec60055481565b61028f6103f8366004612a8f565b610d5d565b61028f610dd8565b610207610413366004612aa8565b610e64565b61025273a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6102527f000000000000000000000000000000000000000000000000000000000000000081565b61028f610feb565b61028f610470366004612a8f565b611064565b6101ec6405ca1ab1e081565b61028f61048f366004612b1c565b6110df565b60075461022790600160c01b90046001600160401b031681565b61028f6104bc366004612bc4565b6117a3565b600254610252906001600160a01b031681565b6102527f000000000000000000000000000000000000000000000000000000000000000081565b61020761180f565b6101ec635ca1ab1e81565b61028f61051c366004612bf5565b61182b565b6102527f000000000000000000000000000000000000000000000000000000000000000081565b60075461022790600160401b90046001600160401b031681565b61028f610570366004612c33565b611baa565b61057d601b81565b60405160ff90911681526020016101f6565b5f54610252906201000090046001600160a01b031681565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016105f591906127e0565b602060405180830381865afa158015610610573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106349190612c7a565b6007549091505f9061065f906001600160401b03600160801b8204811691600160401b900416612ca5565b6001600160401b03169050805f03610679575f9250505090565b6106838183612ccc565b9250505090565b6004805461069790612ceb565b80601f01602080910402602001604051908101604052809291908181526020018280546106c390612ceb565b801561070e5780601f106106e55761010080835404028352916020019161070e565b820191905f5260205f20905b8154815290600101906020018083116106f157829003601f168201915b505050505081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461075f57604051631736745960e31b815260040160405180910390fd5b806001600160a01b0316836001600160401b03167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966846040516107a491815260200190565b60405180910390a3505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146107fa57604051631736745960e31b815260040160405180910390fd5b5f54610100900460ff161580801561081857505f54600160ff909116105b80610838575061082730611e9c565b15801561083857505f5460ff166001145b6108a05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156108c1575f805461ff0019166101001790555b5f805462010000600160b01b031916620100006001600160a01b038b81169190910291909117909155600280546001600160a01b031916918916919091179055600361090d8482612d70565b50600461091a8382612d70565b50600780546001600160c01b0316610d2f60c71b1790556001600160a01b0385166109645763ffffffff84161561096457604051630d43a60960e11b815260040160405180910390fd5b60088054610100600160c81b0319166101006001600160a01b0388160263ffffffff60a81b191617600160a81b63ffffffff8716021790555f6109a8878787610e64565b90505f818051906020012090505f4290505f805f1b835f801b848e6040516020016109d7959493929190612e2b565b60408051808303601f19018152908290528051602090910120600780546001600160401b0319166001600160401b0386161790556005819055639a908e7360e01b825291505f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639a908e7390610a60906001908690600401612e6a565b6020604051808303815f875af1158015610a7c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa09190612e83565b6040519091506001600160401b038216905f8051602061321d833981519152905f90a250505050508015610b0d575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b5f546201000090046001600160a01b03163314610b4757604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610b745760405163f5e37f2f60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bd0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf49190612e9e565b610c2e576007546001600160401b03600160c01b909104811690821610610c2e5760405163f5e37f2f60e01b815260040160405180910390fd5b600780546001600160c01b0316600160c01b6001600160401b038416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461069790612ceb565b600854600160c81b900460ff16610cc2576040516320864d6d60e21b815260040160405180910390fd5b610ccd838383611eab565b505050565b5f546201000090046001600160a01b03163314610d0257604051634755657960e01b815260040160405180910390fd5b60085460ff1615610d265760405163f6ba91a160e01b815260040160405180910390fd5b6008805460ff191660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f546201000090046001600160a01b03163314610d8d57604051634755657960e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383161790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610c809083906127e0565b6001546001600160a01b03163314610e035760405163d1ec4b2360e01b815260040160405180910390fd5b6001545f8054620100006001600160a01b0390931692830262010000600160b01b03199091161790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e91610e5a916127e0565b60405180910390a1565b60605f60405180606001604052806021815260200161325d6021913960405163ffffffff80881660248301526001600160a01b03871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa60848201525f60a482015260c40160408051601f19818403018152918152602080830180516001600160e01b03166369a3b57f60e11b1790529051610f0293929101612ebd565b60408051601f1981840301815282825280516020808301919091205f80865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015610f6f573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116610fa35760405163668b0cb360e11b815260040160405180910390fd5b6040515f90610fd09084906405ca1ab1e090635ca1ab1e90601b906001600160f81b031990602001612eeb565b60408051808303601f19018152919052979650505050505050565b5f546201000090046001600160a01b0316331461101b57604051634755657960e01b815260040160405180910390fd5b6008805460ff60c81b198116600160c81b9182900460ff16159091021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f41905f90a1565b5f546201000090046001600160a01b0316331461109457604051634755657960e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610c809083906127e0565b6002546001600160a01b0316331461110a576040516311e7be1560e01b815260040160405180910390fd5b835f81900361112c5760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561114f57604051635acfba9d60e11b815260040160405180910390fd5b6007546005546001600160401b0380831692600160801b90041690815f5b858110156113ea575f8b8b8381811061118857611188612f2e565b90506080020180360381019061119e9190612f42565b80516060820151919250906001600160401b03161561128b57856111c181612f95565b9650505f81836020015184606001516040516020016111e293929190612fc2565b60408051601f1981840301815291815281516020928301206001600160401b038a165f908152600690935291205490915081146112325760405163671ebaaf60e11b815260040160405180910390fd5b82606001516001600160401b031683604001516001600160401b0316101561126d57604051633fbd5c3960e11b815260040160405180910390fd5b506001600160401b0386165f90815260066020526040812055611347565b602082015115801590611329575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303815f875af1158015611303573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113279190612c7a565b155b15611347576040516373bd668d60e01b815260040160405180910390fd5b866001600160401b031682604001516001600160401b0316108061137757504282604001516001600160401b0316115b15611395576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518e6040516020016113b6959493929190612e2b565b60405160208183030381529060405280519060200120945081604001519650505080806113e290612fe5565b91505061116d565b506007546001600160401b03600160401b909104811690841611156114225760405163c630a00d60e01b815260040160405180910390fd5b600780546001600160401b0319166001600160401b038616179055600582905560405163063d411f60e51b815285907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063c7a823e0906114949086908c908c90600401613025565b5f6040518083038186803b1580156114aa575f80fd5b505afa1580156114bc573d5f803e3d5ffd5b50505050816001600160401b0316846001600160401b031614611592575f6114e48386612ca5565b90506114f96001600160401b03821683613047565b915061156c7f0000000000000000000000000000000000000000000000000000000000000000826001600160401b03166115316105a7565b61153b9190613060565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190612480565b5060078054600160801b600160c01b031916600160801b6001600160401b038716021790555b611674337f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611614573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116389190612c7a565b6116429190613060565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169291906124e3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156116cc575f80fd5b505af11580156116de573d5f803e3d5ffd5b5050604051639a908e7360e01b81525f92506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150639a908e7390611732908a908890600401612e6a565b6020604051808303815f875af115801561174e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117729190612e83565b6040519091506001600160401b038216905f8051602061321d833981519152905f90a2505050505050505050505050565b5f546201000090046001600160a01b031633146117d357604051634755657960e01b815260040160405180910390fd5b60036117df8282612d70565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c8091906127c7565b60405180606001604052806021815260200161325d6021913981565b60085460ff1661184e576040516324eff8c360e01b815260040160405180910390fd5b805f8190036118705760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561189357604051635acfba9d60e11b815260040160405180910390fd5b6007546001600160401b03600160401b82048116916118bb918491600160801b900416613077565b11156118da5760405163c630a00d60e01b815260040160405180910390fd5b600754600554600160801b9091046001600160401b0316905f5b83811015611a73575f86868381811061190f5761190f612f2e565b9050602002810190611921919061308a565b61192a906130a8565b90508361193681612f95565b825180516020918201208185015160408087015190519499509194505f936119619386939101612fc2565b60408051601f1981840301815291815281516020928301206001600160401b0389165f908152600690935291205490915081146119b15760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b0386165f908152600660205260408120556119d4600188613047565b8403611a285742600760189054906101000a90046001600160401b03168460400151611a009190613122565b6001600160401b03161115611a285760405163c44a082160e01b815260040160405180910390fd5b848284602001514233604051602001611a45959493929190612e2b565b6040516020818303038152906040528051906020012094505050508080611a6b90612fe5565b9150506118f4565b50611aa17f0000000000000000000000000000000000000000000000000000000000000000846115316105a7565b6005819055600780546001600160401b03848116600160801b026001600160401b03600160801b03600160c01b0319909216429190911617179055604051639a908e7360e01b81525f906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611b2c9087908690600401612e6a565b6020604051808303815f875af1158015611b48573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b6c9190612e83565b6040519091506001600160401b038216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a2505050505050565b60085460ff16611bcd576040516324eff8c360e01b815260040160405180910390fd5b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c4e9190612c7a565b905081811115611c7157604051632354600f60e01b815260040160405180910390fd5b611388831115611c94576040516328a69b1f60e21b815260040160405180910390fd5b611cc96001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163330846124e3565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d26573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d4a9190612c7a565b60078054919250600160401b9091046001600160401b0316906008611d6e83612f95565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508484604051611da3929190613142565b604051908190038120611dbc9183904290602001612fc2565b60408051808303601f190181529181528151602092830120600754600160401b90046001600160401b03165f9081526006909352912055323303611e4b576007546040805183815233602082015260609181018290525f91810191909152600160401b9091046001600160401b0316905f8051602061323d8339815191529060800160405180910390a2611e95565b600760089054906101000a90046001600160401b03166001600160401b03165f8051602061323d83398151915282338888604051611e8c9493929190613151565b60405180910390a25b5050505050565b6001600160a01b03163b151590565b6002546001600160a01b03163314611ed6576040516311e7be1560e01b815260040160405180910390fd5b815f819003611ef85760405163cb591a5f60e01b815260040160405180910390fd5b6103e8811115611f1b57604051635acfba9d60e11b815260040160405180910390fd5b6007546005546001600160401b0380831692600160801b90041690815f5b858110156121e9575f898983818110611f5457611f54612f2e565b9050602002810190611f669190613185565b611f6f90613199565b805180516020909101206060820151919250906001600160401b0316156120645785611f9a81612f95565b9650505f8183602001518460600151604051602001611fbb93929190612fc2565b60408051601f1981840301815291815281516020928301206001600160401b038a165f9081526006909352912054909150811461200b5760405163671ebaaf60e11b815260040160405180910390fd5b82606001516001600160401b031683604001516001600160401b0316101561204657604051633fbd5c3960e11b815260040160405180910390fd5b506001600160401b0386165f90815260066020526040812055612146565b602082015115801590612102575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303815f875af11580156120dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121009190612c7a565b155b15612120576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c01015612146576040516328a69b1f60e21b815260040160405180910390fd5b866001600160401b031682604001516001600160401b0316108061217657504282604001516001600160401b0316115b15612194576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518c6040516020016121b5959493929190612e2b565b60405160208183030381529060405280519060200120945081604001519650505080806121e190612fe5565b915050611f39565b506007546001600160401b03600160401b909104811690841611156122215760405163c630a00d60e01b815260040160405180910390fd5b600780546001600160401b0319166001600160401b038681169190911790915560058390558590828116908516146122d1575f61225e8386612ca5565b90506122736001600160401b03821683613047565b91506122ab7f0000000000000000000000000000000000000000000000000000000000000000826001600160401b03166115316105a7565b5060078054600160801b600160c01b031916600160801b6001600160401b038716021790555b612353337f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611614573d5f803e3d5ffd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156123ab575f80fd5b505af11580156123bd573d5f803e3d5ffd5b5050604051639a908e7360e01b81525f92506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150639a908e7390612411908a908890600401612e6a565b6020604051808303815f875af115801561242d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124519190612e83565b6040519091506001600160401b038216905f8051602061321d833981519152905f90a250505050505050505050565b6040516001600160a01b038316602482015260448101829052610ccd90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612521565b6040516001600160a01b038085166024830152831660448201526064810182905261251b9085906323b872dd60e01b906084016124ac565b50505050565b5f612575826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166125f29092919063ffffffff16565b805190915015610ccd57808060200190518101906125939190612e9e565b610ccd5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610897565b606061260084845f85612608565b949350505050565b6060824710156126695760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610897565b5f80866001600160a01b03168587604051612684919061320b565b5f6040518083038185875af1925050503d805f81146126be576040519150601f19603f3d011682016040523d82523d5f602084013e6126c3565b606091505b50915091506126d4878383876126df565b979650505050505050565b6060831561274b5782515f03612744576126f885611e9c565b6127445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610897565b5081612600565b61260083838151156127605781518083602001fd5b8060405162461bcd60e51b815260040161089791906127c7565b5f5b8381101561279457818101518382015260200161277c565b50505f910152565b5f81518084526127b381602086016020860161277a565b601f01601f19169290920160200192915050565b602081525f6127d9602083018461279c565b9392505050565b6001600160a01b0391909116815260200190565b6001600160401b0381168114612808575f80fd5b50565b80356001600160a01b0381168114612821575f80fd5b919050565b5f805f60608486031215612838575f80fd5b8335612843816127f4565b9250602084013591506128586040850161280b565b90509250925092565b803563ffffffff81168114612821575f80fd5b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b03811182821017156128aa576128aa612874565b60405290565b5f82601f8301126128bf575f80fd5b81356001600160401b03808211156128d9576128d9612874565b604051601f8301601f19908116603f0116810190828211818310171561290157612901612874565b81604052838152866020858801011115612919575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a03121561294e575f80fd5b6129578861280b565b96506129656020890161280b565b955061297360408901612861565b94506129816060890161280b565b935061298f60808901612861565b925060a08801356001600160401b03808211156129aa575f80fd5b6129b68b838c016128b0565b935060c08a01359150808211156129cb575f80fd5b506129d88a828b016128b0565b91505092959891949750929550565b5f602082840312156129f7575f80fd5b81356127d9816127f4565b5f8083601f840112612a12575f80fd5b5081356001600160401b03811115612a28575f80fd5b6020830191508360208260051b8501011115612a42575f80fd5b9250929050565b5f805f60408486031215612a5b575f80fd5b83356001600160401b03811115612a70575f80fd5b612a7c86828701612a02565b909450925061285890506020850161280b565b5f60208284031215612a9f575f80fd5b6127d98261280b565b5f805f60608486031215612aba575f80fd5b612ac384612861565b9250612ad16020850161280b565b915061285860408501612861565b5f8083601f840112612aef575f80fd5b5081356001600160401b03811115612b05575f80fd5b602083019150836020828501011115612a42575f80fd5b5f805f805f60608688031215612b30575f80fd5b85356001600160401b0380821115612b46575f80fd5b818801915088601f830112612b59575f80fd5b813581811115612b67575f80fd5b8960208260071b8501011115612b7b575f80fd5b60208301975080965050612b916020890161280b565b94506040880135915080821115612ba6575f80fd5b50612bb388828901612adf565b969995985093965092949392505050565b5f60208284031215612bd4575f80fd5b81356001600160401b03811115612be9575f80fd5b612600848285016128b0565b5f8060208385031215612c06575f80fd5b82356001600160401b03811115612c1b575f80fd5b612c2785828601612a02565b90969095509350505050565b5f805f60408486031215612c45575f80fd5b83356001600160401b03811115612c5a575f80fd5b612c6686828701612adf565b909790965060209590950135949350505050565b5f60208284031215612c8a575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612cc557612cc5612c91565b5092915050565b5f82612ce657634e487b7160e01b5f52601260045260245ffd5b500490565b600181811c90821680612cff57607f821691505b602082108103612d1d57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610ccd575f81815260208120601f850160051c81016020861015612d495750805b601f850160051c820191505b81811015612d6857828155600101612d55565b505050505050565b81516001600160401b03811115612d8957612d89612874565b612d9d81612d978454612ceb565b84612d23565b602080601f831160018114612dd0575f8415612db95750858301515b5f19600386901b1c1916600185901b178555612d68565b5f85815260208120601f198616915b82811015612dfe57888601518255948401946001909101908401612ddf565b5085821015612e1b57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b6001600160401b03929092168252602082015260400190565b5f60208284031215612e93575f80fd5b81516127d9816127f4565b5f60208284031215612eae575f80fd5b815180151581146127d9575f80fd5b5f8351612ece81846020880161277a565b835190830190612ee281836020880161277a565b01949350505050565b5f8651612efc818460208b0161277a565b9190910194855250602084019290925260f81b6001600160f81b03199081166040840152166041820152604201919050565b634e487b7160e01b5f52603260045260245ffd5b5f60808284031215612f52575f80fd5b612f5a612888565b82358152602083013560208201526040830135612f76816127f4565b60408201526060830135612f89816127f4565b60608201529392505050565b5f6001600160401b038281166002600160401b03198101612fb857612fb8612c91565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b5f60018201612ff657612ff6612c91565b5060010190565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b838152604060208201525f61303e604083018486612ffd565b95945050505050565b8181038181111561305a5761305a612c91565b92915050565b808202811582820484141761305a5761305a612c91565b8082018082111561305a5761305a612c91565b5f8235605e1983360301811261309e575f80fd5b9190910192915050565b5f606082360312156130b8575f80fd5b604051606081016001600160401b0380821183831017156130db576130db612874565b8160405284359150808211156130ef575f80fd5b506130fc368286016128b0565b825250602083013560208201526040830135613117816127f4565b604082015292915050565b6001600160401b03818116838216019080821115612cc557612cc5612c91565b818382375f9101908152919050565b8481526001600160a01b03841660208201526060604082018190525f9061317b9083018486612ffd565b9695505050505050565b5f8235607e1983360301811261309e575f80fd5b5f608082360312156131a9575f80fd5b6131b1612888565b82356001600160401b038111156131c6575f80fd5b6131d2368286016128b0565b8252506020830135602082015260408301356131ed816127f4565b60408201526060830135613200816127f4565b606082015292915050565b5f825161309e81846020870161277a56fe303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fcef94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931f8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a26469706673582212207485279590b273ca494dfb980e9f20847a93dcde1b38eb0b3e71158ed47488ba64736f6c63430008140033", + "bytecode": "0x6101206040523480156200001257600080fd5b506040516200358538038062003585833981016040819052620000359162000078565b6001600160a01b0394851660a05292841660805290831660c052821660e0521661010052620000f8565b6001600160a01b03811681146200007557600080fd5b50565b600080600080600060a086880312156200009157600080fd5b85516200009e816200005f565b6020870151909550620000b1816200005f565b6040870151909450620000c4816200005f565b6060870151909350620000d7816200005f565b6080870151909250620000ea816200005f565b809150509295509295909350565b60805160a05160c05160e05161010051613399620001ec60003960008181610388015261148c01526000818161033201528181610725015281816107c001528181610a3a01528181610b970152818161153e015281816115d6015281816115f80152818161174001528181611acb01528181611b4801528181611c28015281816122e50152818161234201528181612364015261244c01526000818161043c015281816116b601526123c20152600081816104dd015281816112eb01528181611d2701526120f501526000818161052a015281816105b1015281816115830152818161168c0152611cfb01526133996000f3fe608060405234801561001057600080fd5b50600436106101e25760003560e01c8062d0295d146101e7578063107bf28c1461020257806319d8ac611461021757806326782247146102425780632b35b3ac1461026257806332c2d1531461027f5780633c351e10146102945780633cbc795b146102ac57806340b5de6c146102d8578063456052671461030057806347ebf1081461031a57806349b7b8021461032d5780634c21fef3146103545780634e48770614610368578063542028d51461037b57806356e29435146103835780635e9145c9146103aa5780635ec91958146103bd5780636b8616ce146103c55780636e05d2cd146103e55780636ff512cc146103ee5780638c3d73011461040157806399af0397146104095780639e0018771461041c578063a3c573eb14610437578063aa3587d31461045e578063ada8f91914610466578063b0afe15414610479578063b81fcafd14610485578063c754c7ed14610498578063c89e42df146104b2578063cfa8ed47146104c5578063d02103ca146104d8578063d690be31146104ff578063d7bc90ff14610507578063d8d1091b14610512578063e46761c414610525578063e7a7ed021461054c578063eaeb077b14610566578063f35dda4714610579578063f851a44014610593575b600080fd5b6101ef6105ac565b6040519081526020015b60405180910390f35b61020a610695565b6040516101f99190612849565b60075461022a906001600160401b031681565b6040516001600160401b0390911681526020016101f9565b600154610255906001600160a01b031681565b6040516101f99190612863565b60085461026f9060ff1681565b60405190151581526020016101f9565b61029261028d3660046128ab565b610723565b005b6008546102559061010090046001600160a01b031681565b6008546102c390600160a81b900463ffffffff1681565b60405163ffffffff90911681526020016101f9565b6102e76001600160f81b031981565b6040516001600160f81b031990911681526020016101f9565b60075461022a90600160801b90046001600160401b031681565b6102926103283660046129c7565b6107be565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b60085461026f90600160c81b900460ff1681565b610292610376366004612a7d565b610b37565b61020a610cae565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b6102926103b8366004612ae5565b610cbb565b610292610cf5565b6101ef6103d3366004612a7d565b60066020526000908152604090205481565b6101ef60055481565b6102926103fc366004612b2f565b610d82565b610292610dfe565b61020a610417366004612b4a565b610e8b565b61025573a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b610292611018565b610292610474366004612b2f565b611093565b6101ef6405ca1ab1e081565b610292610493366004612bc5565b61110f565b60075461022a90600160c01b90046001600160401b031681565b6102926104c0366004612c76565b6117ee565b600254610255906001600160a01b031681565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b61020a61185b565b6101ef635ca1ab1e81565b610292610520366004612caa565b611877565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b60075461022a90600160401b90046001600160401b031681565b610292610574366004612ceb565b611c01565b610581601b81565b60405160ff90911681526020016101f9565b600054610255906201000090046001600160a01b031681565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016105fb9190612863565b602060405180830381865afa158015610618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063c9190612d36565b600754909150600090610668906001600160401b03600160801b8204811691600160401b900416612d65565b6001600160401b03169050806000036106845760009250505090565b61068e8183612d8c565b9250505090565b600480546106a290612dae565b80601f01602080910402602001604051908101604052809291908181526020018280546106ce90612dae565b801561071b5780601f106106f05761010080835404028352916020019161071b565b820191906000526020600020905b8154815290600101906020018083116106fe57829003601f168201915b505050505081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461076c57604051631736745960e31b815260040160405180910390fd5b806001600160a01b0316836001600160401b03167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966846040516107b191815260200190565b60405180910390a3505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461080757604051631736745960e31b815260040160405180910390fd5b600054610100900460ff16158080156108275750600054600160ff909116105b80610848575061083630611efd565b158015610848575060005460ff166001145b6108b05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156108d3576000805461ff0019166101001790555b6000805462010000600160b01b031916620100006001600160a01b038b81169190910291909117909155600280546001600160a01b03191691891691909117905560036109208482612e36565b50600461092d8382612e36565b50600780546001600160c01b0316610d2f60c71b1790556001600160a01b0385166109775763ffffffff84161561097757604051630d43a60960e11b815260040160405180910390fd5b60088054610100600160c81b0319166101006001600160a01b0388160263ffffffff60a81b191617600160a81b63ffffffff87160217905560006109bc878787610e8b565b9050600081805190602001209050600042905060008060001b836000801b848e6040516020016109f0959493929190612ef5565b60408051808303601f19018152908290528051602090910120600780546001600160401b0319166001600160401b0386161790556005819055639a908e7360e01b825291506000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639a908e7390610a7a906001908690600401612f34565b6020604051808303816000875af1158015610a99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abd9190612f4d565b6040519091506001600160401b0382169060008051602061330383398151915290600090a250505050508015610b2d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6000546201000090046001600160a01b03163314610b6857604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610b955760405163f5e37f2f60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bf3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c179190612f6a565b610c51576007546001600160401b03600160c01b909104811690821610610c515760405163f5e37f2f60e01b815260040160405180910390fd5b600780546001600160c01b0316600160c01b6001600160401b038416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546106a290612dae565b600854600160c81b900460ff16610ce5576040516320864d6d60e21b815260040160405180910390fd5b610cf0838383611f0c565b505050565b6000546201000090046001600160a01b03163314610d2657604051634755657960e01b815260040160405180910390fd5b60085460ff1615610d4a5760405163f6ba91a160e01b815260040160405180910390fd5b6008805460ff191660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b6000546201000090046001600160a01b03163314610db357604051634755657960e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383161790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610ca3908390612863565b6001546001600160a01b03163314610e295760405163d1ec4b2360e01b815260040160405180910390fd5b60015460008054620100006001600160a01b0390931692830262010000600160b01b03199091161790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e91610e8191612863565b60405180910390a1565b606060006040518060600160405280602181526020016133436021913960405163ffffffff80881660248301526001600160a01b03871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa6084820152600060a482015260c40160408051601f19818403018152918152602080830180516001600160e01b03166369a3b57f60e11b1790529051610f2b93929101612f8c565b60408051601f198184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015610f9b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610fcf5760405163668b0cb360e11b815260040160405180910390fd5b604051600090610ffd9084906405ca1ab1e090635ca1ab1e90601b906001600160f81b031990602001612fbb565b60408051808303601f19018152919052979650505050505050565b6000546201000090046001600160a01b0316331461104957604051634755657960e01b815260040160405180910390fd5b6008805460ff60c81b198116600160c81b9182900460ff16159091021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f4190600090a1565b6000546201000090046001600160a01b031633146110c457604051634755657960e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610ca3908390612863565b6002546001600160a01b0316331461113a576040516311e7be1560e01b815260040160405180910390fd5b83600081900361115d5760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561118057604051635acfba9d60e11b815260040160405180910390fd5b6007546005546001600160401b0380831692600160801b900416908160005b858110156114235760008b8b838181106111bb576111bb612fff565b9050608002018036038101906111d19190613015565b80516060820151919250906001600160401b0316156112c157856111f48161306a565b9650506000818360200151846060015160405160200161121693929190613098565b60408051601f1981840301815291815281516020928301206001600160401b038a166000908152600690935291205490915081146112675760405163671ebaaf60e11b815260040160405180910390fd5b82606001516001600160401b031683604001516001600160401b031610156112a257604051633fbd5c3960e11b815260040160405180910390fd5b506001600160401b038616600090815260066020526040812055611380565b602082015115801590611362575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303816000875af115801561133c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113609190612d36565b155b15611380576040516373bd668d60e01b815260040160405180910390fd5b866001600160401b031682604001516001600160401b031610806113b057504282604001516001600160401b0316115b156113ce576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518e6040516020016113ef959493929190612ef5565b604051602081830303815290604052805190602001209450816040015196505050808061141b906130bb565b91505061119f565b506007546001600160401b03600160401b9091048116908416111561145b5760405163c630a00d60e01b815260040160405180910390fd5b600780546001600160401b0319166001600160401b038616179055600582905560405163063d411f60e51b815285907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063c7a823e0906114cd9086908c908c906004016130fd565b60006040518083038186803b1580156114e557600080fd5b505afa1580156114f9573d6000803e3d6000fd5b50505050816001600160401b0316846001600160401b0316146115d05760006115228386612d65565b90506115376001600160401b03821683613120565b91506115aa7f0000000000000000000000000000000000000000000000000000000000000000826001600160401b031661156f6105ac565b6115799190613139565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906124f8565b5060078054600160801b600160c01b031916600160801b6001600160401b038716021790555b6116b4337f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611654573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116789190612d36565b6116829190613139565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001692919061255b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561170f57600080fd5b505af1158015611723573d6000803e3d6000fd5b5050604051639a908e7360e01b8152600092506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150639a908e7390611778908a908890600401612f34565b6020604051808303816000875af1158015611797573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117bb9190612f4d565b6040519091506001600160401b0382169060008051602061330383398151915290600090a2505050505050505050505050565b6000546201000090046001600160a01b0316331461181f57604051634755657960e01b815260040160405180910390fd5b600361182b8282612e36565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610ca39190612849565b6040518060600160405280602181526020016133436021913981565b60085460ff1661189a576040516324eff8c360e01b815260040160405180910390fd5b8060008190036118bd5760405163cb591a5f60e01b815260040160405180910390fd5b6103e88111156118e057604051635acfba9d60e11b815260040160405180910390fd5b6007546001600160401b03600160401b8204811691611908918491600160801b900416613150565b11156119275760405163c630a00d60e01b815260040160405180910390fd5b600754600554600160801b9091046001600160401b03169060005b83811015611ac557600086868381811061195e5761195e612fff565b90506020028101906119709190613163565b61197990613183565b9050836119858161306a565b825180516020918201208185015160408087015190519499509194506000936119b19386939101613098565b60408051601f1981840301815291815281516020928301206001600160401b038916600090815260069093529120549091508114611a025760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b038616600090815260066020526040812055611a26600188613120565b8403611a7a5742600760189054906101000a90046001600160401b03168460400151611a529190613200565b6001600160401b03161115611a7a5760405163c44a082160e01b815260040160405180910390fd5b848284602001514233604051602001611a97959493929190612ef5565b6040516020818303038152906040528051906020012094505050508080611abd906130bb565b915050611942565b50611af37f00000000000000000000000000000000000000000000000000000000000000008461156f6105ac565b6005819055600780546001600160401b03848116600160801b026001600160401b03600160801b03600160c01b0319909216429190911617179055604051639a908e7360e01b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611b7f9087908690600401612f34565b6020604051808303816000875af1158015611b9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc29190612f4d565b6040519091506001600160401b038216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16611c24576040516324eff8c360e01b815260040160405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca89190612d36565b905081811115611ccb57604051632354600f60e01b815260040160405180910390fd5b611388831115611cee576040516328a69b1f60e21b815260040160405180910390fd5b611d236001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633308461255b565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da79190612d36565b60078054919250600160401b9091046001600160401b0316906008611dcb8361306a565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508484604051611e00929190613220565b604051908190038120611e199183904290602001613098565b60408051808303601f190181529181528151602092830120600754600160401b90046001600160401b031660009081526006909352912055323303611eab57600754604080518381523360208201526060918101829052600091810191909152600160401b9091046001600160401b0316906000805160206133238339815191529060800160405180910390a2611ef6565b600760089054906101000a90046001600160401b03166001600160401b031660008051602061332383398151915282338888604051611eed9493929190613230565b60405180910390a25b5050505050565b6001600160a01b03163b151590565b6002546001600160a01b03163314611f37576040516311e7be1560e01b815260040160405180910390fd5b816000819003611f5a5760405163cb591a5f60e01b815260040160405180910390fd5b6103e8811115611f7d57604051635acfba9d60e11b815260040160405180910390fd5b6007546005546001600160401b0380831692600160801b900416908160005b85811015612253576000898983818110611fb857611fb8612fff565b9050602002810190611fca9190613265565b611fd39061327b565b805180516020909101206060820151919250906001600160401b0316156120cb5785611ffe8161306a565b9650506000818360200151846060015160405160200161202093929190613098565b60408051601f1981840301815291815281516020928301206001600160401b038a166000908152600690935291205490915081146120715760405163671ebaaf60e11b815260040160405180910390fd5b82606001516001600160401b031683604001516001600160401b031610156120ac57604051633fbd5c3960e11b815260040160405180910390fd5b506001600160401b0386166000908152600660205260408120556121b0565b60208201511580159061216c575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303816000875af1158015612146573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061216a9190612d36565b155b1561218a576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c010156121b0576040516328a69b1f60e21b815260040160405180910390fd5b866001600160401b031682604001516001600160401b031610806121e057504282604001516001600160401b0316115b156121fe576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518c60405160200161221f959493929190612ef5565b604051602081830303815290604052805190602001209450816040015196505050808061224b906130bb565b915050611f9c565b506007546001600160401b03600160401b9091048116908416111561228b5760405163c630a00d60e01b815260040160405180910390fd5b600780546001600160401b0319166001600160401b0386811691909117909155600583905585908281169085161461233c5760006122c98386612d65565b90506122de6001600160401b03821683613120565b91506123167f0000000000000000000000000000000000000000000000000000000000000000826001600160401b031661156f6105ac565b5060078054600160801b600160c01b031916600160801b6001600160401b038716021790555b6123c0337f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611654573d6000803e3d6000fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561241b57600080fd5b505af115801561242f573d6000803e3d6000fd5b5050604051639a908e7360e01b8152600092506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150639a908e7390612484908a908890600401612f34565b6020604051808303816000875af11580156124a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124c79190612f4d565b6040519091506001600160401b0382169060008051602061330383398151915290600090a250505050505050505050565b6040516001600160a01b038316602482015260448101829052610cf090849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612599565b6040516001600160a01b03808516602483015283166044820152606481018290526125939085906323b872dd60e01b90608401612524565b50505050565b60006125ee826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661266b9092919063ffffffff16565b805190915015610cf0578080602001905181019061260c9190612f6a565b610cf05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016108a7565b606061267a8484600085612682565b949350505050565b6060824710156126e35760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016108a7565b600080866001600160a01b031685876040516126ff91906132f0565b60006040518083038185875af1925050503d806000811461273c576040519150601f19603f3d011682016040523d82523d6000602084013e612741565b606091505b50915091506127528783838761275d565b979650505050505050565b606083156127ca5782516000036127c35761277785611efd565b6127c35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108a7565b508161267a565b61267a83838151156127df5781518083602001fd5b8060405162461bcd60e51b81526004016108a79190612849565b60005b838110156128145781810151838201526020016127fc565b50506000910152565b600081518084526128358160208601602086016127f9565b601f01601f19169290920160200192915050565b60208152600061285c602083018461281d565b9392505050565b6001600160a01b0391909116815260200190565b6001600160401b038116811461288c57600080fd5b50565b80356001600160a01b03811681146128a657600080fd5b919050565b6000806000606084860312156128c057600080fd5b83356128cb81612877565b9250602084013591506128e06040850161288f565b90509250925092565b803563ffffffff811681146128a657600080fd5b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715612935576129356128fd565b60405290565b600082601f83011261294c57600080fd5b81356001600160401b0380821115612966576129666128fd565b604051601f8301601f19908116603f0116810190828211818310171561298e5761298e6128fd565b816040528381528660208588010111156129a757600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a0312156129e257600080fd5b6129eb8861288f565b96506129f96020890161288f565b9550612a07604089016128e9565b9450612a156060890161288f565b9350612a23608089016128e9565b925060a08801356001600160401b0380821115612a3f57600080fd5b612a4b8b838c0161293b565b935060c08a0135915080821115612a6157600080fd5b50612a6e8a828b0161293b565b91505092959891949750929550565b600060208284031215612a8f57600080fd5b813561285c81612877565b60008083601f840112612aac57600080fd5b5081356001600160401b03811115612ac357600080fd5b6020830191508360208260051b8501011115612ade57600080fd5b9250929050565b600080600060408486031215612afa57600080fd5b83356001600160401b03811115612b1057600080fd5b612b1c86828701612a9a565b90945092506128e090506020850161288f565b600060208284031215612b4157600080fd5b61285c8261288f565b600080600060608486031215612b5f57600080fd5b612b68846128e9565b9250612b766020850161288f565b91506128e0604085016128e9565b60008083601f840112612b9657600080fd5b5081356001600160401b03811115612bad57600080fd5b602083019150836020828501011115612ade57600080fd5b600080600080600060608688031215612bdd57600080fd5b85356001600160401b0380821115612bf457600080fd5b818801915088601f830112612c0857600080fd5b813581811115612c1757600080fd5b8960208260071b8501011115612c2c57600080fd5b60208301975080965050612c426020890161288f565b94506040880135915080821115612c5857600080fd5b50612c6588828901612b84565b969995985093965092949392505050565b600060208284031215612c8857600080fd5b81356001600160401b03811115612c9e57600080fd5b61267a8482850161293b565b60008060208385031215612cbd57600080fd5b82356001600160401b03811115612cd357600080fd5b612cdf85828601612a9a565b90969095509350505050565b600080600060408486031215612d0057600080fd5b83356001600160401b03811115612d1657600080fd5b612d2286828701612b84565b909790965060209590950135949350505050565b600060208284031215612d4857600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03828116828216039080821115612d8557612d85612d4f565b5092915050565b600082612da957634e487b7160e01b600052601260045260246000fd5b500490565b600181811c90821680612dc257607f821691505b602082108103612de257634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610cf057600081815260208120601f850160051c81016020861015612e0f5750805b601f850160051c820191505b81811015612e2e57828155600101612e1b565b505050505050565b81516001600160401b03811115612e4f57612e4f6128fd565b612e6381612e5d8454612dae565b84612de8565b602080601f831160018114612e985760008415612e805750858301515b600019600386901b1c1916600185901b178555612e2e565b600085815260208120601f198616915b82811015612ec757888601518255948401946001909101908401612ea8565b5085821015612ee55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b6001600160401b03929092168252602082015260400190565b600060208284031215612f5f57600080fd5b815161285c81612877565b600060208284031215612f7c57600080fd5b8151801515811461285c57600080fd5b60008351612f9e8184602088016127f9565b835190830190612fb28183602088016127f9565b01949350505050565b60008651612fcd818460208b016127f9565b9190910194855250602084019290925260f81b6001600160f81b03199081166040840152166041820152604201919050565b634e487b7160e01b600052603260045260246000fd5b60006080828403121561302757600080fd5b61302f612913565b8235815260208301356020820152604083013561304b81612877565b6040820152606083013561305e81612877565b60608201529392505050565b60006001600160401b038281166002600160401b0319810161308e5761308e612d4f565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b6000600182016130cd576130cd612d4f565b5060010190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006131176040830184866130d4565b95945050505050565b8181038181111561313357613133612d4f565b92915050565b808202811582820484141761313357613133612d4f565b8082018082111561313357613133612d4f565b60008235605e1983360301811261317957600080fd5b9190910192915050565b60006060823603121561319557600080fd5b604051606081016001600160401b0380821183831017156131b8576131b86128fd565b8160405284359150808211156131cd57600080fd5b506131da3682860161293b565b8252506020830135602082015260408301356131f581612877565b604082015292915050565b6001600160401b03818116838216019080821115612d8557612d85612d4f565b8183823760009101908152919050565b8481526001600160a01b038416602082015260606040820181905260009061325b90830184866130d4565b9695505050505050565b60008235607e1983360301811261317957600080fd5b60006080823603121561328d57600080fd5b613295612913565b82356001600160401b038111156132ab57600080fd5b6132b73682860161293b565b8252506020830135602082015260408301356132d281612877565b604082015260608301356132e581612877565b606082015292915050565b600082516131798184602087016127f956fe303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fcef94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931f8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a2646970667358221220c4cd20d4038afe6dd468e6522f499aeecec4d8f2447a2a8bcae66bdc4c0a96ac64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101e25760003560e01c8062d0295d146101e7578063107bf28c1461020257806319d8ac611461021757806326782247146102425780632b35b3ac1461026257806332c2d1531461027f5780633c351e10146102945780633cbc795b146102ac57806340b5de6c146102d8578063456052671461030057806347ebf1081461031a57806349b7b8021461032d5780634c21fef3146103545780634e48770614610368578063542028d51461037b57806356e29435146103835780635e9145c9146103aa5780635ec91958146103bd5780636b8616ce146103c55780636e05d2cd146103e55780636ff512cc146103ee5780638c3d73011461040157806399af0397146104095780639e0018771461041c578063a3c573eb14610437578063aa3587d31461045e578063ada8f91914610466578063b0afe15414610479578063b81fcafd14610485578063c754c7ed14610498578063c89e42df146104b2578063cfa8ed47146104c5578063d02103ca146104d8578063d690be31146104ff578063d7bc90ff14610507578063d8d1091b14610512578063e46761c414610525578063e7a7ed021461054c578063eaeb077b14610566578063f35dda4714610579578063f851a44014610593575b600080fd5b6101ef6105ac565b6040519081526020015b60405180910390f35b61020a610695565b6040516101f99190612849565b60075461022a906001600160401b031681565b6040516001600160401b0390911681526020016101f9565b600154610255906001600160a01b031681565b6040516101f99190612863565b60085461026f9060ff1681565b60405190151581526020016101f9565b61029261028d3660046128ab565b610723565b005b6008546102559061010090046001600160a01b031681565b6008546102c390600160a81b900463ffffffff1681565b60405163ffffffff90911681526020016101f9565b6102e76001600160f81b031981565b6040516001600160f81b031990911681526020016101f9565b60075461022a90600160801b90046001600160401b031681565b6102926103283660046129c7565b6107be565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b60085461026f90600160c81b900460ff1681565b610292610376366004612a7d565b610b37565b61020a610cae565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b6102926103b8366004612ae5565b610cbb565b610292610cf5565b6101ef6103d3366004612a7d565b60066020526000908152604090205481565b6101ef60055481565b6102926103fc366004612b2f565b610d82565b610292610dfe565b61020a610417366004612b4a565b610e8b565b61025573a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b610292611018565b610292610474366004612b2f565b611093565b6101ef6405ca1ab1e081565b610292610493366004612bc5565b61110f565b60075461022a90600160c01b90046001600160401b031681565b6102926104c0366004612c76565b6117ee565b600254610255906001600160a01b031681565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b61020a61185b565b6101ef635ca1ab1e81565b610292610520366004612caa565b611877565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b60075461022a90600160401b90046001600160401b031681565b610292610574366004612ceb565b611c01565b610581601b81565b60405160ff90911681526020016101f9565b600054610255906201000090046001600160a01b031681565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016105fb9190612863565b602060405180830381865afa158015610618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063c9190612d36565b600754909150600090610668906001600160401b03600160801b8204811691600160401b900416612d65565b6001600160401b03169050806000036106845760009250505090565b61068e8183612d8c565b9250505090565b600480546106a290612dae565b80601f01602080910402602001604051908101604052809291908181526020018280546106ce90612dae565b801561071b5780601f106106f05761010080835404028352916020019161071b565b820191906000526020600020905b8154815290600101906020018083116106fe57829003601f168201915b505050505081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461076c57604051631736745960e31b815260040160405180910390fd5b806001600160a01b0316836001600160401b03167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966846040516107b191815260200190565b60405180910390a3505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461080757604051631736745960e31b815260040160405180910390fd5b600054610100900460ff16158080156108275750600054600160ff909116105b80610848575061083630611efd565b158015610848575060005460ff166001145b6108b05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156108d3576000805461ff0019166101001790555b6000805462010000600160b01b031916620100006001600160a01b038b81169190910291909117909155600280546001600160a01b03191691891691909117905560036109208482612e36565b50600461092d8382612e36565b50600780546001600160c01b0316610d2f60c71b1790556001600160a01b0385166109775763ffffffff84161561097757604051630d43a60960e11b815260040160405180910390fd5b60088054610100600160c81b0319166101006001600160a01b0388160263ffffffff60a81b191617600160a81b63ffffffff87160217905560006109bc878787610e8b565b9050600081805190602001209050600042905060008060001b836000801b848e6040516020016109f0959493929190612ef5565b60408051808303601f19018152908290528051602090910120600780546001600160401b0319166001600160401b0386161790556005819055639a908e7360e01b825291506000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639a908e7390610a7a906001908690600401612f34565b6020604051808303816000875af1158015610a99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abd9190612f4d565b6040519091506001600160401b0382169060008051602061330383398151915290600090a250505050508015610b2d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6000546201000090046001600160a01b03163314610b6857604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610b955760405163f5e37f2f60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bf3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c179190612f6a565b610c51576007546001600160401b03600160c01b909104811690821610610c515760405163f5e37f2f60e01b815260040160405180910390fd5b600780546001600160c01b0316600160c01b6001600160401b038416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546106a290612dae565b600854600160c81b900460ff16610ce5576040516320864d6d60e21b815260040160405180910390fd5b610cf0838383611f0c565b505050565b6000546201000090046001600160a01b03163314610d2657604051634755657960e01b815260040160405180910390fd5b60085460ff1615610d4a5760405163f6ba91a160e01b815260040160405180910390fd5b6008805460ff191660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b6000546201000090046001600160a01b03163314610db357604051634755657960e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383161790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610ca3908390612863565b6001546001600160a01b03163314610e295760405163d1ec4b2360e01b815260040160405180910390fd5b60015460008054620100006001600160a01b0390931692830262010000600160b01b03199091161790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e91610e8191612863565b60405180910390a1565b606060006040518060600160405280602181526020016133436021913960405163ffffffff80881660248301526001600160a01b03871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa6084820152600060a482015260c40160408051601f19818403018152918152602080830180516001600160e01b03166369a3b57f60e11b1790529051610f2b93929101612f8c565b60408051601f198184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015610f9b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610fcf5760405163668b0cb360e11b815260040160405180910390fd5b604051600090610ffd9084906405ca1ab1e090635ca1ab1e90601b906001600160f81b031990602001612fbb565b60408051808303601f19018152919052979650505050505050565b6000546201000090046001600160a01b0316331461104957604051634755657960e01b815260040160405180910390fd5b6008805460ff60c81b198116600160c81b9182900460ff16159091021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f4190600090a1565b6000546201000090046001600160a01b031633146110c457604051634755657960e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610ca3908390612863565b6002546001600160a01b0316331461113a576040516311e7be1560e01b815260040160405180910390fd5b83600081900361115d5760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561118057604051635acfba9d60e11b815260040160405180910390fd5b6007546005546001600160401b0380831692600160801b900416908160005b858110156114235760008b8b838181106111bb576111bb612fff565b9050608002018036038101906111d19190613015565b80516060820151919250906001600160401b0316156112c157856111f48161306a565b9650506000818360200151846060015160405160200161121693929190613098565b60408051601f1981840301815291815281516020928301206001600160401b038a166000908152600690935291205490915081146112675760405163671ebaaf60e11b815260040160405180910390fd5b82606001516001600160401b031683604001516001600160401b031610156112a257604051633fbd5c3960e11b815260040160405180910390fd5b506001600160401b038616600090815260066020526040812055611380565b602082015115801590611362575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303816000875af115801561133c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113609190612d36565b155b15611380576040516373bd668d60e01b815260040160405180910390fd5b866001600160401b031682604001516001600160401b031610806113b057504282604001516001600160401b0316115b156113ce576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518e6040516020016113ef959493929190612ef5565b604051602081830303815290604052805190602001209450816040015196505050808061141b906130bb565b91505061119f565b506007546001600160401b03600160401b9091048116908416111561145b5760405163c630a00d60e01b815260040160405180910390fd5b600780546001600160401b0319166001600160401b038616179055600582905560405163063d411f60e51b815285907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063c7a823e0906114cd9086908c908c906004016130fd565b60006040518083038186803b1580156114e557600080fd5b505afa1580156114f9573d6000803e3d6000fd5b50505050816001600160401b0316846001600160401b0316146115d05760006115228386612d65565b90506115376001600160401b03821683613120565b91506115aa7f0000000000000000000000000000000000000000000000000000000000000000826001600160401b031661156f6105ac565b6115799190613139565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906124f8565b5060078054600160801b600160c01b031916600160801b6001600160401b038716021790555b6116b4337f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611654573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116789190612d36565b6116829190613139565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001692919061255b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561170f57600080fd5b505af1158015611723573d6000803e3d6000fd5b5050604051639a908e7360e01b8152600092506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150639a908e7390611778908a908890600401612f34565b6020604051808303816000875af1158015611797573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117bb9190612f4d565b6040519091506001600160401b0382169060008051602061330383398151915290600090a2505050505050505050505050565b6000546201000090046001600160a01b0316331461181f57604051634755657960e01b815260040160405180910390fd5b600361182b8282612e36565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610ca39190612849565b6040518060600160405280602181526020016133436021913981565b60085460ff1661189a576040516324eff8c360e01b815260040160405180910390fd5b8060008190036118bd5760405163cb591a5f60e01b815260040160405180910390fd5b6103e88111156118e057604051635acfba9d60e11b815260040160405180910390fd5b6007546001600160401b03600160401b8204811691611908918491600160801b900416613150565b11156119275760405163c630a00d60e01b815260040160405180910390fd5b600754600554600160801b9091046001600160401b03169060005b83811015611ac557600086868381811061195e5761195e612fff565b90506020028101906119709190613163565b61197990613183565b9050836119858161306a565b825180516020918201208185015160408087015190519499509194506000936119b19386939101613098565b60408051601f1981840301815291815281516020928301206001600160401b038916600090815260069093529120549091508114611a025760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b038616600090815260066020526040812055611a26600188613120565b8403611a7a5742600760189054906101000a90046001600160401b03168460400151611a529190613200565b6001600160401b03161115611a7a5760405163c44a082160e01b815260040160405180910390fd5b848284602001514233604051602001611a97959493929190612ef5565b6040516020818303038152906040528051906020012094505050508080611abd906130bb565b915050611942565b50611af37f00000000000000000000000000000000000000000000000000000000000000008461156f6105ac565b6005819055600780546001600160401b03848116600160801b026001600160401b03600160801b03600160c01b0319909216429190911617179055604051639a908e7360e01b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611b7f9087908690600401612f34565b6020604051808303816000875af1158015611b9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc29190612f4d565b6040519091506001600160401b038216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16611c24576040516324eff8c360e01b815260040160405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca89190612d36565b905081811115611ccb57604051632354600f60e01b815260040160405180910390fd5b611388831115611cee576040516328a69b1f60e21b815260040160405180910390fd5b611d236001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633308461255b565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da79190612d36565b60078054919250600160401b9091046001600160401b0316906008611dcb8361306a565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508484604051611e00929190613220565b604051908190038120611e199183904290602001613098565b60408051808303601f190181529181528151602092830120600754600160401b90046001600160401b031660009081526006909352912055323303611eab57600754604080518381523360208201526060918101829052600091810191909152600160401b9091046001600160401b0316906000805160206133238339815191529060800160405180910390a2611ef6565b600760089054906101000a90046001600160401b03166001600160401b031660008051602061332383398151915282338888604051611eed9493929190613230565b60405180910390a25b5050505050565b6001600160a01b03163b151590565b6002546001600160a01b03163314611f37576040516311e7be1560e01b815260040160405180910390fd5b816000819003611f5a5760405163cb591a5f60e01b815260040160405180910390fd5b6103e8811115611f7d57604051635acfba9d60e11b815260040160405180910390fd5b6007546005546001600160401b0380831692600160801b900416908160005b85811015612253576000898983818110611fb857611fb8612fff565b9050602002810190611fca9190613265565b611fd39061327b565b805180516020909101206060820151919250906001600160401b0316156120cb5785611ffe8161306a565b9650506000818360200151846060015160405160200161202093929190613098565b60408051601f1981840301815291815281516020928301206001600160401b038a166000908152600690935291205490915081146120715760405163671ebaaf60e11b815260040160405180910390fd5b82606001516001600160401b031683604001516001600160401b031610156120ac57604051633fbd5c3960e11b815260040160405180910390fd5b506001600160401b0386166000908152600660205260408120556121b0565b60208201511580159061216c575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303816000875af1158015612146573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061216a9190612d36565b155b1561218a576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c010156121b0576040516328a69b1f60e21b815260040160405180910390fd5b866001600160401b031682604001516001600160401b031610806121e057504282604001516001600160401b0316115b156121fe576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518c60405160200161221f959493929190612ef5565b604051602081830303815290604052805190602001209450816040015196505050808061224b906130bb565b915050611f9c565b506007546001600160401b03600160401b9091048116908416111561228b5760405163c630a00d60e01b815260040160405180910390fd5b600780546001600160401b0319166001600160401b0386811691909117909155600583905585908281169085161461233c5760006122c98386612d65565b90506122de6001600160401b03821683613120565b91506123167f0000000000000000000000000000000000000000000000000000000000000000826001600160401b031661156f6105ac565b5060078054600160801b600160c01b031916600160801b6001600160401b038716021790555b6123c0337f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611654573d6000803e3d6000fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561241b57600080fd5b505af115801561242f573d6000803e3d6000fd5b5050604051639a908e7360e01b8152600092506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150639a908e7390612484908a908890600401612f34565b6020604051808303816000875af11580156124a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124c79190612f4d565b6040519091506001600160401b0382169060008051602061330383398151915290600090a250505050505050505050565b6040516001600160a01b038316602482015260448101829052610cf090849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612599565b6040516001600160a01b03808516602483015283166044820152606481018290526125939085906323b872dd60e01b90608401612524565b50505050565b60006125ee826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661266b9092919063ffffffff16565b805190915015610cf0578080602001905181019061260c9190612f6a565b610cf05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016108a7565b606061267a8484600085612682565b949350505050565b6060824710156126e35760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016108a7565b600080866001600160a01b031685876040516126ff91906132f0565b60006040518083038185875af1925050503d806000811461273c576040519150601f19603f3d011682016040523d82523d6000602084013e612741565b606091505b50915091506127528783838761275d565b979650505050505050565b606083156127ca5782516000036127c35761277785611efd565b6127c35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108a7565b508161267a565b61267a83838151156127df5781518083602001fd5b8060405162461bcd60e51b81526004016108a79190612849565b60005b838110156128145781810151838201526020016127fc565b50506000910152565b600081518084526128358160208601602086016127f9565b601f01601f19169290920160200192915050565b60208152600061285c602083018461281d565b9392505050565b6001600160a01b0391909116815260200190565b6001600160401b038116811461288c57600080fd5b50565b80356001600160a01b03811681146128a657600080fd5b919050565b6000806000606084860312156128c057600080fd5b83356128cb81612877565b9250602084013591506128e06040850161288f565b90509250925092565b803563ffffffff811681146128a657600080fd5b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715612935576129356128fd565b60405290565b600082601f83011261294c57600080fd5b81356001600160401b0380821115612966576129666128fd565b604051601f8301601f19908116603f0116810190828211818310171561298e5761298e6128fd565b816040528381528660208588010111156129a757600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a0312156129e257600080fd5b6129eb8861288f565b96506129f96020890161288f565b9550612a07604089016128e9565b9450612a156060890161288f565b9350612a23608089016128e9565b925060a08801356001600160401b0380821115612a3f57600080fd5b612a4b8b838c0161293b565b935060c08a0135915080821115612a6157600080fd5b50612a6e8a828b0161293b565b91505092959891949750929550565b600060208284031215612a8f57600080fd5b813561285c81612877565b60008083601f840112612aac57600080fd5b5081356001600160401b03811115612ac357600080fd5b6020830191508360208260051b8501011115612ade57600080fd5b9250929050565b600080600060408486031215612afa57600080fd5b83356001600160401b03811115612b1057600080fd5b612b1c86828701612a9a565b90945092506128e090506020850161288f565b600060208284031215612b4157600080fd5b61285c8261288f565b600080600060608486031215612b5f57600080fd5b612b68846128e9565b9250612b766020850161288f565b91506128e0604085016128e9565b60008083601f840112612b9657600080fd5b5081356001600160401b03811115612bad57600080fd5b602083019150836020828501011115612ade57600080fd5b600080600080600060608688031215612bdd57600080fd5b85356001600160401b0380821115612bf457600080fd5b818801915088601f830112612c0857600080fd5b813581811115612c1757600080fd5b8960208260071b8501011115612c2c57600080fd5b60208301975080965050612c426020890161288f565b94506040880135915080821115612c5857600080fd5b50612c6588828901612b84565b969995985093965092949392505050565b600060208284031215612c8857600080fd5b81356001600160401b03811115612c9e57600080fd5b61267a8482850161293b565b60008060208385031215612cbd57600080fd5b82356001600160401b03811115612cd357600080fd5b612cdf85828601612a9a565b90969095509350505050565b600080600060408486031215612d0057600080fd5b83356001600160401b03811115612d1657600080fd5b612d2286828701612b84565b909790965060209590950135949350505050565b600060208284031215612d4857600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03828116828216039080821115612d8557612d85612d4f565b5092915050565b600082612da957634e487b7160e01b600052601260045260246000fd5b500490565b600181811c90821680612dc257607f821691505b602082108103612de257634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610cf057600081815260208120601f850160051c81016020861015612e0f5750805b601f850160051c820191505b81811015612e2e57828155600101612e1b565b505050505050565b81516001600160401b03811115612e4f57612e4f6128fd565b612e6381612e5d8454612dae565b84612de8565b602080601f831160018114612e985760008415612e805750858301515b600019600386901b1c1916600185901b178555612e2e565b600085815260208120601f198616915b82811015612ec757888601518255948401946001909101908401612ea8565b5085821015612ee55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b6001600160401b03929092168252602082015260400190565b600060208284031215612f5f57600080fd5b815161285c81612877565b600060208284031215612f7c57600080fd5b8151801515811461285c57600080fd5b60008351612f9e8184602088016127f9565b835190830190612fb28183602088016127f9565b01949350505050565b60008651612fcd818460208b016127f9565b9190910194855250602084019290925260f81b6001600160f81b03199081166040840152166041820152604201919050565b634e487b7160e01b600052603260045260246000fd5b60006080828403121561302757600080fd5b61302f612913565b8235815260208301356020820152604083013561304b81612877565b6040820152606083013561305e81612877565b60608201529392505050565b60006001600160401b038281166002600160401b0319810161308e5761308e612d4f565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b6000600182016130cd576130cd612d4f565b5060010190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006131176040830184866130d4565b95945050505050565b8181038181111561313357613133612d4f565b92915050565b808202811582820484141761313357613133612d4f565b8082018082111561313357613133612d4f565b60008235605e1983360301811261317957600080fd5b9190910192915050565b60006060823603121561319557600080fd5b604051606081016001600160401b0380821183831017156131b8576131b86128fd565b8160405284359150808211156131cd57600080fd5b506131da3682860161293b565b8252506020830135602082015260408301356131f581612877565b604082015292915050565b6001600160401b03818116838216019080821115612d8557612d85612d4f565b8183823760009101908152919050565b8481526001600160a01b038416602082015260606040820181905260009061325b90830184866130d4565b9695505050505050565b60008235607e1983360301811261317957600080fd5b60006080823603121561328d57600080fd5b613295612913565b82356001600160401b038111156132ab57600080fd5b6132b73682860161293b565b8252506020830135602082015260408301356132d281612877565b604082015260608301356132e581612877565b606082015292915050565b600082516131798184602087016127f956fe303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fcef94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931f8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a2646970667358221220c4cd20d4038afe6dd468e6522f499aeecec4d8f2447a2a8bcae66bdc4c0a96ac64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonRollupManager.json b/compiled-contracts/paris/PolygonRollupManager.json index ceb41c57d..40b620b66 100644 --- a/compiled-contracts/paris/PolygonRollupManager.json +++ b/compiled-contracts/paris/PolygonRollupManager.json @@ -2027,8 +2027,8 @@ "type": "function" } ], - "bytecode": "0x60e060405234801562000010575f80fd5b5060405162005af738038062005af7833981016040819052620000339162000069565b6001600160a01b0392831660805290821660c0521660a052620000ba565b6001600160a01b038116811462000066575f80fd5b50565b5f805f606084860312156200007c575f80fd5b8351620000898162000051565b60208501519093506200009c8162000051565b6040850151909250620000af8162000051565b809150509250925092565b60805160a05160c0516159da6200011d5f395f818161096c01528181611abb015261344201525f818161071d015281816125e401526136f801525f81816108af01528181610bbd01528181610d650152818161182c01526135ed01526159da5ff3fe608060405234801562000010575f80fd5b506004361062000290575f3560e01c8063066ec0121462000294578063080b311114620002c05780630a0d9fbe14620002e857806311f6b287146200030357806312b86e19146200031a5780631489ed10146200033357806315064c96146200034a5780631608859c14620003585780631796a1ae146200036f5780631816b7e514620003965780632072f6c514620003ad578063248a9ca314620003b75780632528016914620003dd5780632f2ff15d146200049157806336568abe14620004a8578063394218e914620004bf578063477fa27014620004d65780634d4d333814620004df57806355a71ee014620004f657806360469169146200053957806365c0504d14620005435780637222020f14620005f15780637975fcfe14620006085780637fb6e76a146200062e578063841b24d7146200065657806387c20c0114620006715780638bd4f071146200068857806391d14854146200069f57806399f5634e14620006b65780639a908e7314620006c05780639c9f3dfe14620006d7578063a066215c14620006ee578063a217fddf1462000705578063a2967d99146200070d578063a3c573eb1462000717578063afd23cbe146200074e578063b99d0ad71462000778578063c1acbc34146200084f578063c4c928c2146200086a578063ceee281d1462000881578063d02103ca14620008a9578063d5073f6f14620008d1578063d547741f14620008e8578063d939b31514620008ff578063dbc169761462000913578063dde0ff77146200091d578063e0bfd3d21462000938578063e136edf7146200094f578063e46761c41462000966578063f34eb8eb146200098e578063f4e9267514620009a5578063f9c4c2ae14620009b6575b5f80fd5b608454620002a8906001600160401b031681565b604051620002b7919062004349565b60405180910390f35b620002d7620002d136600462004388565b62000acc565b6040519015158152602001620002b7565b608554620002a890600160401b90046001600160401b031681565b620002a862000314366004620043be565b62000af5565b620003316200032b366004620043ec565b62000b14565b005b620003316200034436600462004493565b62000cbc565b606f54620002d79060ff1681565b620003316200036936600462004388565b62000e44565b607e54620003809063ffffffff1681565b60405163ffffffff9091168152602001620002b7565b62000331620003a736600462004518565b62000ed7565b6200033162000f82565b620003ce620003c836600462004542565b62000ffb565b604051908152602001620002b7565b6200045d620003ee36600462004388565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002b7565b62000331620004a23660046200455a565b6200100f565b62000331620004b93660046200455a565b62001031565b62000331620004d03660046200458b565b6200106b565b608654620003ce565b62000331620004f0366004620045a7565b62001119565b620003ce6200050736600462004388565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620003ce6200158d565b620005a762000554366004620043be565b607f6020525f90815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002b7565b6200033162000602366004620043be565b620015a4565b6200061f6200061936600462004658565b6200168c565b604051620002b791906200470b565b620003806200063f3660046200458b565b60836020525f908152604090205463ffffffff1681565b608454620002a890600160c01b90046001600160401b031681565b620003316200068236600462004493565b620016be565b6200033162000699366004620043ec565b620019d9565b620002d7620006b03660046200455a565b62001a8d565b620003ce62001ab7565b620002a8620006d13660046200471f565b62001b9d565b62000331620006e83660046200458b565b62001d64565b62000331620006ff3660046200458b565b62001e06565b620003ce5f81565b620003ce62001ea4565b6200073f7f000000000000000000000000000000000000000000000000000000000000000081565b604051620002b791906200474a565b6085546200076490600160801b900461ffff1681565b60405161ffff9091168152602001620002b7565b6200080d6200078936600462004388565b60408051608080820183525f8083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002b7919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002a890600160801b90046001600160401b031681565b620003316200087b3660046200475e565b62002259565b6200038062000892366004620047ef565b60826020525f908152604090205463ffffffff1681565b6200073f7f000000000000000000000000000000000000000000000000000000000000000081565b62000331620008e236600462004542565b6200251c565b62000331620008f93660046200455a565b620025a6565b608554620002a8906001600160401b031681565b62000331620025c8565b608454620002a890600160401b90046001600160401b031681565b62000331620009493660046200481e565b6200265f565b62000331620009603660046200493a565b620026e3565b6200073f7f000000000000000000000000000000000000000000000000000000000000000081565b620003316200099f36600462004a13565b62002b3a565b608054620003809063ffffffff1681565b62000a4c620009c7366004620043be565b60816020525f9081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002b7565b63ffffffff82165f90815260816020526040812062000aec908362002d1c565b90505b92915050565b63ffffffff81165f90815260816020526040812062000aef9062002d60565b5f805160206200598583398151915262000b2e8162002dcf565b63ffffffff89165f90815260816020526040902062000b54818a8a8a8a8a8a8a62002ddb565b600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562000bbb576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000bf462001ea4565b6040518263ffffffff1660e01b815260040162000c1391815260200190565b5f604051808303815f87803b15801562000c2b575f80fd5b505af115801562000c3e573d5f803e3d5ffd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b5f805160206200598583398151915262000cd68162002dcf565b63ffffffff89165f90815260816020526040902062000cfc818a8a8a8a8a8a8a62003157565b600681018054600160401b600160801b031916600160401b6001600160401b038a81169182029290921783555f9081526002840160205260409020879055600583018890559054600160801b9004161562000d63576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000d9c62001ea4565b6040518263ffffffff1660e01b815260040162000dbb91815260200190565b5f604051808303815f87803b15801562000dd3575f80fd5b505af115801562000de6573d5f803e3d5ffd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a60405162000e309392919062004aa5565b60405180910390a350505050505050505050565b63ffffffff82165f90815260816020526040902062000e725f80516020620059858339815191523362001a8d565b62000ec657606f5460ff161562000e9c57604051630bc011ff60e21b815260040160405180910390fd5b62000ea8818362002d1c565b62000ec657604051630674f25160e11b815260040160405180910390fd5b62000ed281836200350b565b505050565b5f805160206200590583398151915262000ef18162002dcf565b6103e88261ffff16108062000f0b57506103ff8261ffff16115b1562000f2a57604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b62000f9c5f80516020620059458339815191523362001a8d565b62000fef57608454429062000fc69062093a8090600160801b90046001600160401b031662004ada565b6001600160401b0316111562000fef5760405163692baaad60e11b815260040160405180910390fd5b62000ff9620036f6565b565b5f9081526034602052604090206001015490565b6200101a8262000ffb565b620010258162002dcf565b62000ed2838362003770565b6001600160a01b03811633146200105b57604051630b4ad1cd60e31b815260040160405180910390fd5b620010678282620037db565b5050565b5f8051602062005905833981519152620010858162002dcf565b606f5460ff16620010c7576084546001600160401b03600160c01b909104811690831610620010c75760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19062000f7690849062004349565b5f54600290610100900460ff161580156200113a57505f5460ff8083169116105b620011a35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200122362003844565b6200123d5f80516020620059858339815191528a620038b0565b620012495f86620038b0565b620012635f805160206200588583398151915286620038b0565b6200127d5f80516020620058e583398151915286620038b0565b620012975f805160206200582583398151915286620038b0565b620012b15f805160206200586583398151915287620038b0565b620012cb5f805160206200596583398151915287620038b0565b620012e55f80516020620058a583398151915287620038b0565b620012ff5f805160206200590583398151915287620038b0565b620013275f80516020620059858339815191525f8051602062005805833981519152620038bc565b620013415f805160206200580583398151915287620038b0565b6200135b5f805160206200584583398151915287620038b0565b620013835f80516020620059458339815191525f8051602062005925833981519152620038bc565b6200139d5f805160206200594583398151915285620038b0565b620013b75f805160206200592583398151915285620038b0565b5f620013ca8484600561044d5f6200390f565b6073546074549192506001600160401b03600160401b909104811691168082146200140857604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b038181165f8181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620015089695831695600160581b909104909216936076936077939192919091169060040162004bab565b5f604051808303815f87803b15801562001520575f80fd5b505af115801562001533573d5f803e3d5ffd5b50505f805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498935060200191506200157a9050565b60405180910390a1505050505050505050565b5f60865460646200159f919062004c10565b905090565b5f8051602062005865833981519152620015be8162002dcf565b63ffffffff82161580620015dd5750607e5463ffffffff908116908316115b15620015fc57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f60205260409020600180820154600160e81b900460ff16151590036200164257604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b63ffffffff86165f908152608160205260409020606090620016b390878787878762003b27565b979650505050505050565b606f5460ff1615620016e357604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602090815260408083206084546001600160401b038a8116865260038301909452919093206001015442926200173192600160c01b90048116911662004ada565b6001600160401b031611156200175a57604051638a0704d360e01b815260040160405180910390fd5b6103e862001769888862004c2a565b6001600160401b031611156200179257604051635acfba9d60e11b815260040160405180910390fd5b620017a4818989898989898962003157565b620017b0818762003c61565b6085546001600160401b03165f03620018b757600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b900416156200182a576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200186362001ea4565b6040518263ffffffff1660e01b81526004016200188291815260200190565b5f604051808303815f87803b1580156200189a575f80fd5b505af1158015620018ad573d5f803e3d5ffd5b5050505062001980565b620018c28162003e58565b600681018054600160801b90046001600160401b0316906010620018e68362004c4d565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b900487165f90815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b4888789604051620019c69392919062004aa5565b60405180910390a3505050505050505050565b606f5460ff1615620019fe57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f90815260816020526040902062001a24818989898989898962002ddb565b6001600160401b0385165f9081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a162001a82620036f6565b505050505050505050565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162001b0791906200474a565b602060405180830381865afa15801562001b23573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001b49919062004c7d565b6084549091505f9062001b6f906001600160401b03600160401b82048116911662004c2a565b6001600160401b03169050805f0362001b8a575f9250505090565b62001b96818362004ca9565b9250505090565b606f545f9060ff161562001bc457604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff169081900362001bfb576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f0362001c2557604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f908152608160205260408120608480549192879262001c579084906001600160401b031662004ada565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f62001c8c878362004ada565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f95865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b03199092169290931691909117179055905062001d1a8362003e58565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a258260405162001d52919062004349565b60405180910390a29695505050505050565b5f805160206200590583398151915262001d7e8162002dcf565b606f5460ff1662001db9576085546001600160401b039081169083161062001db95760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759062000f7690849062004349565b5f805160206200590583398151915262001e208162002dcf565b62015180826001600160401b0316111562001e4e57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289062000f7690849062004349565b6080545f9063ffffffff1680820362001ebe57505f919050565b5f816001600160401b0381111562001eda5762001eda62004896565b60405190808252806020026020018201604052801562001f04578160200160208202803683370190505b5090505f5b8281101562001f745760815f62001f2283600162004cbf565b63ffffffff1663ffffffff1681526020019081526020015f206005015482828151811062001f545762001f5462004cd5565b60209081029190910101528062001f6b8162004ce9565b91505062001f09565b505f60205b83600114620021b4575f62001f9060028662004d04565b62001f9d60028762004ca9565b62001fa9919062004cbf565b90505f816001600160401b0381111562001fc75762001fc762004896565b60405190808252806020026020018201604052801562001ff1578160200160208202803683370190505b5090505f5b8281101562002168576200200c60018462004d1a565b811480156200202757506200202360028862004d04565b6001145b15620020a757856200203b82600262004c10565b815181106200204e576200204e62004cd5565b6020026020010151856040516020016200206a92919062004d30565b6040516020818303038152906040528051906020012082828151811062002095576200209562004cd5565b60200260200101818152505062002153565b85620020b582600262004c10565b81518110620020c857620020c862004cd5565b602002602001015186826002620020e0919062004c10565b620020ed90600162004cbf565b8151811062002100576200210062004cd5565b60200260200101516040516020016200211b92919062004d30565b6040516020818303038152906040528051906020012082828151811062002146576200214662004cd5565b6020026020010181815250505b806200215f8162004ce9565b91505062001ff6565b5080945081955083846040516020016200218492919062004d30565b6040516020818303038152906040528051906020012093508280620021a99062004d3e565b935050505062001f79565b5f835f81518110620021ca57620021ca62004cd5565b602002602001015190505f5b828110156200224f578184604051602001620021f492919062004d30565b60405160208183030381529060405280519060200120915083846040516020016200222192919062004d30565b6040516020818303038152906040528051906020012093508080620022469062004ce9565b915050620021d6565b5095945050505050565b5f8051602062005825833981519152620022738162002dcf565b63ffffffff84161580620022925750607e5463ffffffff908116908516115b15620022b157604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526082602052604081205463ffffffff1690819003620022f1576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918716600160401b9091046001600160401b0316036200233f57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86165f908152607f60205260409020600180820154600160e81b900460ff16151590036200238557604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b9092041614620023c357604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790555f620024428462000af5565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef28692620024979216908b908b9060040162004d56565b5f604051808303815f87803b158015620024af575f80fd5b505af1158015620024c2573d5f803e3d5ffd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b5f8051602062005845833981519152620025368162002dcf565b683635c9adc5dea00000821180620025515750633b9aca0082105b156200257057604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162000f76565b620025b18262000ffb565b620025bc8162002dcf565b62000ed28383620037db565b5f80516020620058a5833981519152620025e28162002dcf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156200263b575f80fd5b505af11580156200264e573d5f803e3d5ffd5b505050506200265c62003f21565b50565b5f80516020620058e5833981519152620026798162002dcf565b6001600160401b0384165f9081526083602052604090205463ffffffff1615620026b6576040516337c8fe0960e11b815260040160405180910390fd5b5f620026c688888888876200390f565b5f8080526002909101602052604090209390935550505050505050565b5f8051602062005965833981519152620026fd8162002dcf565b63ffffffff891615806200271c5750607e5463ffffffff908116908a16115b156200273b57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff89165f908152607f60205260409020600180820154600160e81b900460ff16151590036200278157604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b0389165f9081526083602052604090205463ffffffff1615620027be576040516337c8fe0960e11b815260040160405180910390fd5b608080545f91908290620027d89063ffffffff1662004d95565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b0390921691309162002825906200433b565b620028339392919062004db0565b604051809103905ff0801580156200284d573d5f803e3d5ffd5b5090508160835f8d6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508b815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508c63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f9a84992ead4481f37097c7663e97ed883b31f216fae5685c6ee576a656483cd98e848f8d8d60405162002aba95949392919063ffffffff95861681526001600160a01b0394851660208201526001600160401b03939093166040840152921660608201529116608082015260a00190565b60405180910390a26040516308fd7e2160e31b81526001600160a01b038316906347ebf1089062002afc908e908e9088908f908f908f908f9060040162004de6565b5f604051808303815f87803b15801562002b14575f80fd5b505af115801562002b27573d5f803e3d5ffd5b5050505050505050505050505050505050565b5f805160206200588583398151915262002b548162002dcf565b607e80545f9190829062002b6e9063ffffffff1662004d95565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff1681526020015f1515815260200185815250607f5f8363ffffffff1663ffffffff1681526020019081526020015f205f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002d0a9695949392919062004e52565b60405180910390a25050505050505050565b6085546001600160401b038281165f9081526004850160205260408120549092429262002d4e92918116911662004ada565b6001600160401b031611159392505050565b60068101545f90600160801b90046001600160401b03161562002db2575060068101546001600160401b03600160801b90910481165f9081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b6200265c813362003f79565b60078801545f906001600160401b03908116908716101562002e105760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b0388161562002eb05760068901546001600160401b03600160801b9091048116908916111562002e5a5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f90815260048a0160205260409020600281015481549092888116600160401b909204161462002ea957604051632bd2e3e760e01b815260040160405180910390fd5b5062002f24565b506001600160401b0385165f9081526002890160205260409020548062002eea576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b9091048116908716111562002f2457604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b9091048116908816118062002f5d5750876001600160401b0316876001600160401b031611155b8062002f81575060068901546001600160401b03600160c01b909104811690881611155b1562002fa05760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260048b016020526040902054600160401b900481169086161462002fe6576040516332a2a77f60e01b815260040160405180910390fd5b5f62002ff78a888888868962003b27565b90505f5f80516020620058c58339815191526002836040516200301b919062004eaa565b602060405180830381855afa15801562003037573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200305c919062004c7d565b62003068919062004d04565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620030ac9188919060040162004ec7565b602060405180830381865afa158015620030c8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620030ee919062004f03565b6200310c576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260048c0160205260409020600201548590036200314a5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b5f80620031648a62002d60565b60078b01549091506001600160401b0390811690891610156200319a5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038916156200323c5760068a01546001600160401b03600160801b9091048116908a161115620031e45760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a165f90815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200323557604051632bd2e3e760e01b815260040160405180910390fd5b50620032ab565b6001600160401b0388165f90815260028b01602052604090205491508162003277576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b03161115620032ab57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620032de5760405163b9b18f5760e01b815260040160405180910390fd5b5f620032ef8b8a8a8a878b62003b27565b90505f5f80516020620058c583398151915260028360405162003313919062004eaa565b602060405180830381855afa1580156200332f573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019062003354919062004c7d565b62003360919062004d04565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620033a49189919060040162004ec7565b602060405180830381865afa158015620033c0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620033e6919062004f03565b62003404576040516309bde33960e01b815260040160405180910390fd5b5f62003411848b62004c2a565b90506200346a87826001600160401b03166200342c62001ab7565b62003438919062004c10565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062003fa3565b80608460088282829054906101000a90046001600160401b031662003490919062004ada565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d1539060640162002afc565b60068201546001600160401b03600160c01b90910481169082161115806200354a575060068201546001600160401b03600160801b9091048116908216115b15620035695760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f81815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200362462001ea4565b6040518263ffffffff1660e01b81526004016200364391815260200190565b5f604051808303815f87803b1580156200365b575f80fd5b505af11580156200366e573d5f803e3d5ffd5b505085546001600160a01b03165f90815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156200374f575f80fd5b505af115801562003762573d5f803e3d5ffd5b5050505062000ff962003ff7565b6200377c828262001a8d565b62001067575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b620037e7828262001a8d565b1562001067575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b5f54610100900460ff1662000ff95760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016200119a565b62001067828262003770565b5f620038c88362000ffb565b5f84815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080545f91829182906200392a9063ffffffff1662004d95565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f866001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f896001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff16021790555060815f8263ffffffff1663ffffffff1681526020019081526020015f20915086825f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b0316021790555085826001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555083825f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003b1594939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086165f818152600389016020526040808220549388168252902054606092911580159062003b5c575081155b1562003b7b5760405163340c614f60e11b815260040160405180910390fd5b8062003b9a576040516366385b5160e01b815260040160405180910390fd5b62003ba58462004053565b62003bc3576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b5f62003c6d8362002d60565b9050815f8062003c7e848462004c2a565b6085546001600160401b0391821692505f9162003ca491600160401b9004164262004d1a565b90505b846001600160401b0316846001600160401b03161462003d2d576001600160401b038085165f9081526003890160205260409020600181015490911682101562003d08576001810154600160401b90046001600160401b0316945062003d26565b62003d14868662004c2a565b6001600160401b031693505062003d2d565b5062003ca7565b5f62003d3a848462004d1a565b90508381101562003d9857808403600c811162003d58578062003d5b565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a608654028162003d8d5762003d8d62004c95565b046086555062003e0f565b838103600c811162003dab578062003dae565b600c5b90505f816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162003de75762003de762004c95565b04905080608654670de0b6b3a7640000028162003e085762003e0862004c95565b0460865550505b683635c9adc5dea00000608654111562003e3657683635c9adc5dea0000060865562003e4e565b633b9aca00608654101562003e4e57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b9092041611156200265c5760068101545f9062003ea290600160c01b90046001600160401b0316600162004ada565b905062003eb0828262002d1c565b15620010675760068201545f9060029062003edd908490600160801b90046001600160401b031662004c2a565b62003ee9919062004f24565b62003ef5908362004ada565b905062003f03838262002d1c565b1562003f155762000ed283826200350b565b62000ed283836200350b565b606f5460ff1662003f4557604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b62003f85828262001a8d565b6200106757604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905262000ed2908490620040d7565b606f5460ff16156200401c57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff000000016001600160401b03831610801562004089575067ffffffff00000001604083901c6001600160401b0316105b8015620040aa575067ffffffff00000001608083901c6001600160401b0316105b8015620040c2575067ffffffff0000000160c083901c105b15620040d057506001919050565b505f919050565b5f6200412d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620041af9092919063ffffffff16565b80519091501562000ed257808060200190518101906200414e919062004f03565b62000ed25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200119a565b6060620041bf84845f85620041c7565b949350505050565b6060824710156200422a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200119a565b5f80866001600160a01b0316858760405162004247919062004eaa565b5f6040518083038185875af1925050503d805f811462004283576040519150601f19603f3d011682016040523d82523d5f602084013e62004288565b606091505b5091509150620016b38783838760608315620043085782515f0362004300576001600160a01b0385163b620043005760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200119a565b5081620041bf565b620041bf83838151156200431f5781518083602001fd5b8060405162461bcd60e51b81526004016200119a91906200470b565b6108b88062004f4d83390190565b6001600160401b0391909116815260200190565b803563ffffffff8116811462002dca575f80fd5b80356001600160401b038116811462002dca575f80fd5b5f80604083850312156200439a575f80fd5b620043a5836200435d565b9150620043b56020840162004371565b90509250929050565b5f60208284031215620043cf575f80fd5b62000aec826200435d565b80610300810183101562000aef575f80fd5b5f805f805f805f806103e0898b03121562004405575f80fd5b62004410896200435d565b97506200442060208a0162004371565b96506200443060408a0162004371565b95506200444060608a0162004371565b94506200445060808a0162004371565b935060a0890135925060c089013591506200446f8a60e08b01620043da565b90509295985092959890939650565b6001600160a01b03811681146200265c575f80fd5b5f805f805f805f806103e0898b031215620044ac575f80fd5b620044b7896200435d565b9750620044c760208a0162004371565b9650620044d760408a0162004371565b9550620044e760608a0162004371565b94506080890135935060a0890135925060c089013562004507816200447e565b91506200446f8a60e08b01620043da565b5f6020828403121562004529575f80fd5b813561ffff811681146200453b575f80fd5b9392505050565b5f6020828403121562004553575f80fd5b5035919050565b5f80604083850312156200456c575f80fd5b82359150602083013562004580816200447e565b809150509250929050565b5f602082840312156200459c575f80fd5b62000aec8262004371565b5f805f805f805f80610100898b031215620045c0575f80fd5b8835620045cd816200447e565b9750620045dd60208a0162004371565b9650620045ed60408a0162004371565b95506060890135620045ff816200447e565b9450608089013562004611816200447e565b935060a089013562004623816200447e565b925060c089013562004635816200447e565b915060e089013562004647816200447e565b809150509295985092959890939650565b5f805f805f8060c087890312156200466e575f80fd5b62004679876200435d565b9550620046896020880162004371565b9450620046996040880162004371565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b83811015620046d6578181015183820152602001620046bc565b50505f910152565b5f8151808452620046f7816020860160208601620046ba565b601f01601f19169290920160200192915050565b602081525f62000aec6020830184620046de565b5f806040838503121562004731575f80fd5b6200473c8362004371565b946020939093013593505050565b6001600160a01b0391909116815260200190565b5f805f806060858703121562004772575f80fd5b84356200477f816200447e565b93506200478f602086016200435d565b925060408501356001600160401b0380821115620047ab575f80fd5b818701915087601f830112620047bf575f80fd5b813581811115620047ce575f80fd5b886020828501011115620047e0575f80fd5b95989497505060200194505050565b5f6020828403121562004800575f80fd5b81356200453b816200447e565b803560ff8116811462002dca575f80fd5b5f805f805f8060c0878903121562004834575f80fd5b863562004841816200447e565b9550602087013562004853816200447e565b9450620048636040880162004371565b9350620048736060880162004371565b9250608087013591506200488a60a088016200480d565b90509295509295509295565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620048ba575f80fd5b81356001600160401b0380821115620048d757620048d762004896565b604051601f8301601f19908116603f0116810190828211818310171562004902576200490262004896565b816040528381528660208588010111156200491b575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f80610100898b03121562004953575f80fd5b6200495e896200435d565b97506200496e60208a0162004371565b9650604089013562004980816200447e565b9550606089013562004992816200447e565b94506080890135620049a4816200447e565b9350620049b460a08a016200435d565b925060c08901356001600160401b0380821115620049d0575f80fd5b620049de8c838d01620048aa565b935060e08b0135915080821115620049f4575f80fd5b5062004a038b828c01620048aa565b9150509295985092959890939650565b5f805f805f8060c0878903121562004a29575f80fd5b863562004a36816200447e565b9550602087013562004a48816200447e565b945062004a586040880162004371565b935062004a68606088016200480d565b92506080870135915060a08701356001600160401b0381111562004a8a575f80fd5b62004a9889828a01620048aa565b9150509295509295509295565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111562004afd5762004afd62004ac6565b5092915050565b80545f90600181811c908083168062004b1e57607f831692505b6020808410820362004b3e57634e487b7160e01b5f52602260045260245ffd5b8388526020880182801562004b5c576001811462004b735762004b9e565b60ff198716825285151560051b8201975062004b9e565b5f898152602090205f5b8781101562004b985781548482015290860190840162004b7d565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c0604082018190525f9062004bd89083018762004b04565b828103606084015262004bec818762004b04565b608084019590955250506001600160401b039190911660a090910152949350505050565b808202811582820484141762000aef5762000aef62004ac6565b6001600160401b0382811682821603908082111562004afd5762004afd62004ac6565b5f6001600160401b038281166002600160401b0319810162004c735762004c7362004ac6565b6001019392505050565b5f6020828403121562004c8e575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8262004cba5762004cba62004c95565b500490565b8082018082111562000aef5762000aef62004ac6565b634e487b7160e01b5f52603260045260245ffd5b5f6001820162004cfd5762004cfd62004ac6565b5060010190565b5f8262004d155762004d1562004c95565b500690565b8181038181111562000aef5762000aef62004ac6565b918252602082015260400190565b5f8162004d4f5762004d4f62004ac6565b505f190190565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b5f63ffffffff80831681810362004c735762004c7362004ac6565b6001600160a01b038481168252831660208201526060604082018190525f9062004ddd90830184620046de565b95945050505050565b6001600160a01b038881168252878116602083015263ffffffff878116604084015290861660608301528416608082015260e060a082018190525f9062004e3090830185620046de565b82810360c084015262004e448185620046de565b9a9950505050505050505050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190525f9062004e9e90830184620046de565b98975050505050505050565b5f825162004ebd818460208701620046ba565b9190910192915050565b6103208101610300808584378201835f5b600181101562004ef957815183526020928301929091019060010162004ed8565b5050509392505050565b5f6020828403121562004f14575f80fd5b815180151581146200453b575f80fd5b5f6001600160401b038381168062004f405762004f4062004c95565b9216919091049291505056fe60a06040526040516108b83803806108b883398101604081905261002291610349565b828161002e8282610056565b50506001600160a01b03821660805261004e61004960805190565b6100b4565b50505061042e565b61005f82610121565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100a8576100a3828261019f565b505050565b6100b0610212565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f35f80516020610898833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161011e81610233565b50565b806001600160a01b03163b5f0361015b57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516101bb9190610413565b5f60405180830381855af49150503d805f81146101f3576040519150601f19603f3d011682016040523d82523d5f602084013e6101f8565b606091505b509092509050610209858383610270565b95945050505050565b34156102315760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661025c57604051633173bdd160e11b81525f6004820152602401610152565b805f8051602061089883398151915261017e565b60608261028557610280826102cf565b6102c8565b815115801561029c57506001600160a01b0384163b155b156102c557604051639996b31560e01b81526001600160a01b0385166004820152602401610152565b50805b9392505050565b8051156102df5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461030e575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015610341578181015183820152602001610329565b50505f910152565b5f805f6060848603121561035b575f80fd5b610364846102f8565b9250610372602085016102f8565b60408501519092506001600160401b038082111561038e575f80fd5b818601915086601f8301126103a1575f80fd5b8151818111156103b3576103b3610313565b604051601f8201601f19908116603f011681019083821181831017156103db576103db610313565b816040528281528960208487010111156103f3575f80fd5b610404836020830160208801610327565b80955050505050509250925092565b5f8251610424818460208701610327565b9190910192915050565b6080516104536104455f395f601001526104535ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610069575f356001600160e01b03191663278f794360e11b146100615761005f61006d565b565b61005f61007d565b61005f5b61005f6100786100ab565b6100cf565b5f8061008c36600481846102ba565b81019061009991906102f5565b915091506100a782826100ed565b5050565b5f6100ca5f805160206103fe833981519152546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156100e9573d5ff35b3d5ffd5b6100f682610147565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561013f5761013a82826101aa565b505050565b6100a761021c565b806001600160a01b03163b5f0361017c5780604051634c9c8ce360e01b815260040161017391906103bd565b60405180910390fd5b5f805160206103fe83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101c691906103d1565b5f60405180830381855af49150503d805f81146101fe576040519150601f19603f3d011682016040523d82523d5f602084013e610203565b606091505b509150915061021385838361023b565b95945050505050565b341561005f5760405163b398979f60e01b815260040160405180910390fd5b6060826102505761024b82610291565b61028a565b815115801561026757506001600160a01b0384163b155b156102875783604051639996b31560e01b815260040161017391906103bd565b50805b9392505050565b8051156102a15780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f80858511156102c8575f80fd5b838611156102d4575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610306575f80fd5b82356001600160a01b038116811461031c575f80fd5b915060208301356001600160401b0380821115610337575f80fd5b818501915085601f83011261034a575f80fd5b81358181111561035c5761035c6102e1565b604051601f8201601f19908116603f01168101908382118183101715610384576103846102e1565b8160405282815288602084870101111561039c575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b5f82515f5b818110156103f057602081860181015185830152016103d6565b505f92019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220ed34fa57754ee02cddb50941efa15692106b258ce5586c40758a5937940c1a9864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000013dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220ba835c664aa1ec5efc320e5c8cd6c9ed245285050f4a1038f85a4b2b8f17dec364736f6c63430008140033", - "deployedBytecode": "0x608060405234801562000010575f80fd5b506004361062000290575f3560e01c8063066ec0121462000294578063080b311114620002c05780630a0d9fbe14620002e857806311f6b287146200030357806312b86e19146200031a5780631489ed10146200033357806315064c96146200034a5780631608859c14620003585780631796a1ae146200036f5780631816b7e514620003965780632072f6c514620003ad578063248a9ca314620003b75780632528016914620003dd5780632f2ff15d146200049157806336568abe14620004a8578063394218e914620004bf578063477fa27014620004d65780634d4d333814620004df57806355a71ee014620004f657806360469169146200053957806365c0504d14620005435780637222020f14620005f15780637975fcfe14620006085780637fb6e76a146200062e578063841b24d7146200065657806387c20c0114620006715780638bd4f071146200068857806391d14854146200069f57806399f5634e14620006b65780639a908e7314620006c05780639c9f3dfe14620006d7578063a066215c14620006ee578063a217fddf1462000705578063a2967d99146200070d578063a3c573eb1462000717578063afd23cbe146200074e578063b99d0ad71462000778578063c1acbc34146200084f578063c4c928c2146200086a578063ceee281d1462000881578063d02103ca14620008a9578063d5073f6f14620008d1578063d547741f14620008e8578063d939b31514620008ff578063dbc169761462000913578063dde0ff77146200091d578063e0bfd3d21462000938578063e136edf7146200094f578063e46761c41462000966578063f34eb8eb146200098e578063f4e9267514620009a5578063f9c4c2ae14620009b6575b5f80fd5b608454620002a8906001600160401b031681565b604051620002b7919062004349565b60405180910390f35b620002d7620002d136600462004388565b62000acc565b6040519015158152602001620002b7565b608554620002a890600160401b90046001600160401b031681565b620002a862000314366004620043be565b62000af5565b620003316200032b366004620043ec565b62000b14565b005b620003316200034436600462004493565b62000cbc565b606f54620002d79060ff1681565b620003316200036936600462004388565b62000e44565b607e54620003809063ffffffff1681565b60405163ffffffff9091168152602001620002b7565b62000331620003a736600462004518565b62000ed7565b6200033162000f82565b620003ce620003c836600462004542565b62000ffb565b604051908152602001620002b7565b6200045d620003ee36600462004388565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002b7565b62000331620004a23660046200455a565b6200100f565b62000331620004b93660046200455a565b62001031565b62000331620004d03660046200458b565b6200106b565b608654620003ce565b62000331620004f0366004620045a7565b62001119565b620003ce6200050736600462004388565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620003ce6200158d565b620005a762000554366004620043be565b607f6020525f90815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002b7565b6200033162000602366004620043be565b620015a4565b6200061f6200061936600462004658565b6200168c565b604051620002b791906200470b565b620003806200063f3660046200458b565b60836020525f908152604090205463ffffffff1681565b608454620002a890600160c01b90046001600160401b031681565b620003316200068236600462004493565b620016be565b6200033162000699366004620043ec565b620019d9565b620002d7620006b03660046200455a565b62001a8d565b620003ce62001ab7565b620002a8620006d13660046200471f565b62001b9d565b62000331620006e83660046200458b565b62001d64565b62000331620006ff3660046200458b565b62001e06565b620003ce5f81565b620003ce62001ea4565b6200073f7f000000000000000000000000000000000000000000000000000000000000000081565b604051620002b791906200474a565b6085546200076490600160801b900461ffff1681565b60405161ffff9091168152602001620002b7565b6200080d6200078936600462004388565b60408051608080820183525f8083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002b7919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002a890600160801b90046001600160401b031681565b620003316200087b3660046200475e565b62002259565b6200038062000892366004620047ef565b60826020525f908152604090205463ffffffff1681565b6200073f7f000000000000000000000000000000000000000000000000000000000000000081565b62000331620008e236600462004542565b6200251c565b62000331620008f93660046200455a565b620025a6565b608554620002a8906001600160401b031681565b62000331620025c8565b608454620002a890600160401b90046001600160401b031681565b62000331620009493660046200481e565b6200265f565b62000331620009603660046200493a565b620026e3565b6200073f7f000000000000000000000000000000000000000000000000000000000000000081565b620003316200099f36600462004a13565b62002b3a565b608054620003809063ffffffff1681565b62000a4c620009c7366004620043be565b60816020525f9081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002b7565b63ffffffff82165f90815260816020526040812062000aec908362002d1c565b90505b92915050565b63ffffffff81165f90815260816020526040812062000aef9062002d60565b5f805160206200598583398151915262000b2e8162002dcf565b63ffffffff89165f90815260816020526040902062000b54818a8a8a8a8a8a8a62002ddb565b600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562000bbb576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000bf462001ea4565b6040518263ffffffff1660e01b815260040162000c1391815260200190565b5f604051808303815f87803b15801562000c2b575f80fd5b505af115801562000c3e573d5f803e3d5ffd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b5f805160206200598583398151915262000cd68162002dcf565b63ffffffff89165f90815260816020526040902062000cfc818a8a8a8a8a8a8a62003157565b600681018054600160401b600160801b031916600160401b6001600160401b038a81169182029290921783555f9081526002840160205260409020879055600583018890559054600160801b9004161562000d63576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000d9c62001ea4565b6040518263ffffffff1660e01b815260040162000dbb91815260200190565b5f604051808303815f87803b15801562000dd3575f80fd5b505af115801562000de6573d5f803e3d5ffd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a60405162000e309392919062004aa5565b60405180910390a350505050505050505050565b63ffffffff82165f90815260816020526040902062000e725f80516020620059858339815191523362001a8d565b62000ec657606f5460ff161562000e9c57604051630bc011ff60e21b815260040160405180910390fd5b62000ea8818362002d1c565b62000ec657604051630674f25160e11b815260040160405180910390fd5b62000ed281836200350b565b505050565b5f805160206200590583398151915262000ef18162002dcf565b6103e88261ffff16108062000f0b57506103ff8261ffff16115b1562000f2a57604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b62000f9c5f80516020620059458339815191523362001a8d565b62000fef57608454429062000fc69062093a8090600160801b90046001600160401b031662004ada565b6001600160401b0316111562000fef5760405163692baaad60e11b815260040160405180910390fd5b62000ff9620036f6565b565b5f9081526034602052604090206001015490565b6200101a8262000ffb565b620010258162002dcf565b62000ed2838362003770565b6001600160a01b03811633146200105b57604051630b4ad1cd60e31b815260040160405180910390fd5b620010678282620037db565b5050565b5f8051602062005905833981519152620010858162002dcf565b606f5460ff16620010c7576084546001600160401b03600160c01b909104811690831610620010c75760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19062000f7690849062004349565b5f54600290610100900460ff161580156200113a57505f5460ff8083169116105b620011a35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200122362003844565b6200123d5f80516020620059858339815191528a620038b0565b620012495f86620038b0565b620012635f805160206200588583398151915286620038b0565b6200127d5f80516020620058e583398151915286620038b0565b620012975f805160206200582583398151915286620038b0565b620012b15f805160206200586583398151915287620038b0565b620012cb5f805160206200596583398151915287620038b0565b620012e55f80516020620058a583398151915287620038b0565b620012ff5f805160206200590583398151915287620038b0565b620013275f80516020620059858339815191525f8051602062005805833981519152620038bc565b620013415f805160206200580583398151915287620038b0565b6200135b5f805160206200584583398151915287620038b0565b620013835f80516020620059458339815191525f8051602062005925833981519152620038bc565b6200139d5f805160206200594583398151915285620038b0565b620013b75f805160206200592583398151915285620038b0565b5f620013ca8484600561044d5f6200390f565b6073546074549192506001600160401b03600160401b909104811691168082146200140857604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b038181165f8181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620015089695831695600160581b909104909216936076936077939192919091169060040162004bab565b5f604051808303815f87803b15801562001520575f80fd5b505af115801562001533573d5f803e3d5ffd5b50505f805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498935060200191506200157a9050565b60405180910390a1505050505050505050565b5f60865460646200159f919062004c10565b905090565b5f8051602062005865833981519152620015be8162002dcf565b63ffffffff82161580620015dd5750607e5463ffffffff908116908316115b15620015fc57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f60205260409020600180820154600160e81b900460ff16151590036200164257604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b63ffffffff86165f908152608160205260409020606090620016b390878787878762003b27565b979650505050505050565b606f5460ff1615620016e357604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602090815260408083206084546001600160401b038a8116865260038301909452919093206001015442926200173192600160c01b90048116911662004ada565b6001600160401b031611156200175a57604051638a0704d360e01b815260040160405180910390fd5b6103e862001769888862004c2a565b6001600160401b031611156200179257604051635acfba9d60e11b815260040160405180910390fd5b620017a4818989898989898962003157565b620017b0818762003c61565b6085546001600160401b03165f03620018b757600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b900416156200182a576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200186362001ea4565b6040518263ffffffff1660e01b81526004016200188291815260200190565b5f604051808303815f87803b1580156200189a575f80fd5b505af1158015620018ad573d5f803e3d5ffd5b5050505062001980565b620018c28162003e58565b600681018054600160801b90046001600160401b0316906010620018e68362004c4d565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b900487165f90815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b4888789604051620019c69392919062004aa5565b60405180910390a3505050505050505050565b606f5460ff1615620019fe57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f90815260816020526040902062001a24818989898989898962002ddb565b6001600160401b0385165f9081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a162001a82620036f6565b505050505050505050565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162001b0791906200474a565b602060405180830381865afa15801562001b23573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001b49919062004c7d565b6084549091505f9062001b6f906001600160401b03600160401b82048116911662004c2a565b6001600160401b03169050805f0362001b8a575f9250505090565b62001b96818362004ca9565b9250505090565b606f545f9060ff161562001bc457604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff169081900362001bfb576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f0362001c2557604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f908152608160205260408120608480549192879262001c579084906001600160401b031662004ada565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f62001c8c878362004ada565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f95865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b03199092169290931691909117179055905062001d1a8362003e58565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a258260405162001d52919062004349565b60405180910390a29695505050505050565b5f805160206200590583398151915262001d7e8162002dcf565b606f5460ff1662001db9576085546001600160401b039081169083161062001db95760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759062000f7690849062004349565b5f805160206200590583398151915262001e208162002dcf565b62015180826001600160401b0316111562001e4e57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289062000f7690849062004349565b6080545f9063ffffffff1680820362001ebe57505f919050565b5f816001600160401b0381111562001eda5762001eda62004896565b60405190808252806020026020018201604052801562001f04578160200160208202803683370190505b5090505f5b8281101562001f745760815f62001f2283600162004cbf565b63ffffffff1663ffffffff1681526020019081526020015f206005015482828151811062001f545762001f5462004cd5565b60209081029190910101528062001f6b8162004ce9565b91505062001f09565b505f60205b83600114620021b4575f62001f9060028662004d04565b62001f9d60028762004ca9565b62001fa9919062004cbf565b90505f816001600160401b0381111562001fc75762001fc762004896565b60405190808252806020026020018201604052801562001ff1578160200160208202803683370190505b5090505f5b8281101562002168576200200c60018462004d1a565b811480156200202757506200202360028862004d04565b6001145b15620020a757856200203b82600262004c10565b815181106200204e576200204e62004cd5565b6020026020010151856040516020016200206a92919062004d30565b6040516020818303038152906040528051906020012082828151811062002095576200209562004cd5565b60200260200101818152505062002153565b85620020b582600262004c10565b81518110620020c857620020c862004cd5565b602002602001015186826002620020e0919062004c10565b620020ed90600162004cbf565b8151811062002100576200210062004cd5565b60200260200101516040516020016200211b92919062004d30565b6040516020818303038152906040528051906020012082828151811062002146576200214662004cd5565b6020026020010181815250505b806200215f8162004ce9565b91505062001ff6565b5080945081955083846040516020016200218492919062004d30565b6040516020818303038152906040528051906020012093508280620021a99062004d3e565b935050505062001f79565b5f835f81518110620021ca57620021ca62004cd5565b602002602001015190505f5b828110156200224f578184604051602001620021f492919062004d30565b60405160208183030381529060405280519060200120915083846040516020016200222192919062004d30565b6040516020818303038152906040528051906020012093508080620022469062004ce9565b915050620021d6565b5095945050505050565b5f8051602062005825833981519152620022738162002dcf565b63ffffffff84161580620022925750607e5463ffffffff908116908516115b15620022b157604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526082602052604081205463ffffffff1690819003620022f1576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918716600160401b9091046001600160401b0316036200233f57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86165f908152607f60205260409020600180820154600160e81b900460ff16151590036200238557604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b9092041614620023c357604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790555f620024428462000af5565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef28692620024979216908b908b9060040162004d56565b5f604051808303815f87803b158015620024af575f80fd5b505af1158015620024c2573d5f803e3d5ffd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b5f8051602062005845833981519152620025368162002dcf565b683635c9adc5dea00000821180620025515750633b9aca0082105b156200257057604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162000f76565b620025b18262000ffb565b620025bc8162002dcf565b62000ed28383620037db565b5f80516020620058a5833981519152620025e28162002dcf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156200263b575f80fd5b505af11580156200264e573d5f803e3d5ffd5b505050506200265c62003f21565b50565b5f80516020620058e5833981519152620026798162002dcf565b6001600160401b0384165f9081526083602052604090205463ffffffff1615620026b6576040516337c8fe0960e11b815260040160405180910390fd5b5f620026c688888888876200390f565b5f8080526002909101602052604090209390935550505050505050565b5f8051602062005965833981519152620026fd8162002dcf565b63ffffffff891615806200271c5750607e5463ffffffff908116908a16115b156200273b57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff89165f908152607f60205260409020600180820154600160e81b900460ff16151590036200278157604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b0389165f9081526083602052604090205463ffffffff1615620027be576040516337c8fe0960e11b815260040160405180910390fd5b608080545f91908290620027d89063ffffffff1662004d95565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b0390921691309162002825906200433b565b620028339392919062004db0565b604051809103905ff0801580156200284d573d5f803e3d5ffd5b5090508160835f8d6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508b815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508c63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f9a84992ead4481f37097c7663e97ed883b31f216fae5685c6ee576a656483cd98e848f8d8d60405162002aba95949392919063ffffffff95861681526001600160a01b0394851660208201526001600160401b03939093166040840152921660608201529116608082015260a00190565b60405180910390a26040516308fd7e2160e31b81526001600160a01b038316906347ebf1089062002afc908e908e9088908f908f908f908f9060040162004de6565b5f604051808303815f87803b15801562002b14575f80fd5b505af115801562002b27573d5f803e3d5ffd5b5050505050505050505050505050505050565b5f805160206200588583398151915262002b548162002dcf565b607e80545f9190829062002b6e9063ffffffff1662004d95565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff1681526020015f1515815260200185815250607f5f8363ffffffff1663ffffffff1681526020019081526020015f205f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002d0a9695949392919062004e52565b60405180910390a25050505050505050565b6085546001600160401b038281165f9081526004850160205260408120549092429262002d4e92918116911662004ada565b6001600160401b031611159392505050565b60068101545f90600160801b90046001600160401b03161562002db2575060068101546001600160401b03600160801b90910481165f9081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b6200265c813362003f79565b60078801545f906001600160401b03908116908716101562002e105760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b0388161562002eb05760068901546001600160401b03600160801b9091048116908916111562002e5a5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f90815260048a0160205260409020600281015481549092888116600160401b909204161462002ea957604051632bd2e3e760e01b815260040160405180910390fd5b5062002f24565b506001600160401b0385165f9081526002890160205260409020548062002eea576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b9091048116908716111562002f2457604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b9091048116908816118062002f5d5750876001600160401b0316876001600160401b031611155b8062002f81575060068901546001600160401b03600160c01b909104811690881611155b1562002fa05760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260048b016020526040902054600160401b900481169086161462002fe6576040516332a2a77f60e01b815260040160405180910390fd5b5f62002ff78a888888868962003b27565b90505f5f80516020620058c58339815191526002836040516200301b919062004eaa565b602060405180830381855afa15801562003037573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200305c919062004c7d565b62003068919062004d04565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620030ac9188919060040162004ec7565b602060405180830381865afa158015620030c8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620030ee919062004f03565b6200310c576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260048c0160205260409020600201548590036200314a5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b5f80620031648a62002d60565b60078b01549091506001600160401b0390811690891610156200319a5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038916156200323c5760068a01546001600160401b03600160801b9091048116908a161115620031e45760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a165f90815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200323557604051632bd2e3e760e01b815260040160405180910390fd5b50620032ab565b6001600160401b0388165f90815260028b01602052604090205491508162003277576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b03161115620032ab57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620032de5760405163b9b18f5760e01b815260040160405180910390fd5b5f620032ef8b8a8a8a878b62003b27565b90505f5f80516020620058c583398151915260028360405162003313919062004eaa565b602060405180830381855afa1580156200332f573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019062003354919062004c7d565b62003360919062004d04565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620033a49189919060040162004ec7565b602060405180830381865afa158015620033c0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620033e6919062004f03565b62003404576040516309bde33960e01b815260040160405180910390fd5b5f62003411848b62004c2a565b90506200346a87826001600160401b03166200342c62001ab7565b62003438919062004c10565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062003fa3565b80608460088282829054906101000a90046001600160401b031662003490919062004ada565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d1539060640162002afc565b60068201546001600160401b03600160c01b90910481169082161115806200354a575060068201546001600160401b03600160801b9091048116908216115b15620035695760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f81815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200362462001ea4565b6040518263ffffffff1660e01b81526004016200364391815260200190565b5f604051808303815f87803b1580156200365b575f80fd5b505af11580156200366e573d5f803e3d5ffd5b505085546001600160a01b03165f90815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156200374f575f80fd5b505af115801562003762573d5f803e3d5ffd5b5050505062000ff962003ff7565b6200377c828262001a8d565b62001067575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b620037e7828262001a8d565b1562001067575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b5f54610100900460ff1662000ff95760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016200119a565b62001067828262003770565b5f620038c88362000ffb565b5f84815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080545f91829182906200392a9063ffffffff1662004d95565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f866001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f896001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff16021790555060815f8263ffffffff1663ffffffff1681526020019081526020015f20915086825f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b0316021790555085826001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555083825f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003b1594939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086165f818152600389016020526040808220549388168252902054606092911580159062003b5c575081155b1562003b7b5760405163340c614f60e11b815260040160405180910390fd5b8062003b9a576040516366385b5160e01b815260040160405180910390fd5b62003ba58462004053565b62003bc3576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b5f62003c6d8362002d60565b9050815f8062003c7e848462004c2a565b6085546001600160401b0391821692505f9162003ca491600160401b9004164262004d1a565b90505b846001600160401b0316846001600160401b03161462003d2d576001600160401b038085165f9081526003890160205260409020600181015490911682101562003d08576001810154600160401b90046001600160401b0316945062003d26565b62003d14868662004c2a565b6001600160401b031693505062003d2d565b5062003ca7565b5f62003d3a848462004d1a565b90508381101562003d9857808403600c811162003d58578062003d5b565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a608654028162003d8d5762003d8d62004c95565b046086555062003e0f565b838103600c811162003dab578062003dae565b600c5b90505f816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162003de75762003de762004c95565b04905080608654670de0b6b3a7640000028162003e085762003e0862004c95565b0460865550505b683635c9adc5dea00000608654111562003e3657683635c9adc5dea0000060865562003e4e565b633b9aca00608654101562003e4e57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b9092041611156200265c5760068101545f9062003ea290600160c01b90046001600160401b0316600162004ada565b905062003eb0828262002d1c565b15620010675760068201545f9060029062003edd908490600160801b90046001600160401b031662004c2a565b62003ee9919062004f24565b62003ef5908362004ada565b905062003f03838262002d1c565b1562003f155762000ed283826200350b565b62000ed283836200350b565b606f5460ff1662003f4557604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b62003f85828262001a8d565b6200106757604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905262000ed2908490620040d7565b606f5460ff16156200401c57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff000000016001600160401b03831610801562004089575067ffffffff00000001604083901c6001600160401b0316105b8015620040aa575067ffffffff00000001608083901c6001600160401b0316105b8015620040c2575067ffffffff0000000160c083901c105b15620040d057506001919050565b505f919050565b5f6200412d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620041af9092919063ffffffff16565b80519091501562000ed257808060200190518101906200414e919062004f03565b62000ed25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200119a565b6060620041bf84845f85620041c7565b949350505050565b6060824710156200422a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200119a565b5f80866001600160a01b0316858760405162004247919062004eaa565b5f6040518083038185875af1925050503d805f811462004283576040519150601f19603f3d011682016040523d82523d5f602084013e62004288565b606091505b5091509150620016b38783838760608315620043085782515f0362004300576001600160a01b0385163b620043005760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200119a565b5081620041bf565b620041bf83838151156200431f5781518083602001fd5b8060405162461bcd60e51b81526004016200119a91906200470b565b6108b88062004f4d83390190565b6001600160401b0391909116815260200190565b803563ffffffff8116811462002dca575f80fd5b80356001600160401b038116811462002dca575f80fd5b5f80604083850312156200439a575f80fd5b620043a5836200435d565b9150620043b56020840162004371565b90509250929050565b5f60208284031215620043cf575f80fd5b62000aec826200435d565b80610300810183101562000aef575f80fd5b5f805f805f805f806103e0898b03121562004405575f80fd5b62004410896200435d565b97506200442060208a0162004371565b96506200443060408a0162004371565b95506200444060608a0162004371565b94506200445060808a0162004371565b935060a0890135925060c089013591506200446f8a60e08b01620043da565b90509295985092959890939650565b6001600160a01b03811681146200265c575f80fd5b5f805f805f805f806103e0898b031215620044ac575f80fd5b620044b7896200435d565b9750620044c760208a0162004371565b9650620044d760408a0162004371565b9550620044e760608a0162004371565b94506080890135935060a0890135925060c089013562004507816200447e565b91506200446f8a60e08b01620043da565b5f6020828403121562004529575f80fd5b813561ffff811681146200453b575f80fd5b9392505050565b5f6020828403121562004553575f80fd5b5035919050565b5f80604083850312156200456c575f80fd5b82359150602083013562004580816200447e565b809150509250929050565b5f602082840312156200459c575f80fd5b62000aec8262004371565b5f805f805f805f80610100898b031215620045c0575f80fd5b8835620045cd816200447e565b9750620045dd60208a0162004371565b9650620045ed60408a0162004371565b95506060890135620045ff816200447e565b9450608089013562004611816200447e565b935060a089013562004623816200447e565b925060c089013562004635816200447e565b915060e089013562004647816200447e565b809150509295985092959890939650565b5f805f805f8060c087890312156200466e575f80fd5b62004679876200435d565b9550620046896020880162004371565b9450620046996040880162004371565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b83811015620046d6578181015183820152602001620046bc565b50505f910152565b5f8151808452620046f7816020860160208601620046ba565b601f01601f19169290920160200192915050565b602081525f62000aec6020830184620046de565b5f806040838503121562004731575f80fd5b6200473c8362004371565b946020939093013593505050565b6001600160a01b0391909116815260200190565b5f805f806060858703121562004772575f80fd5b84356200477f816200447e565b93506200478f602086016200435d565b925060408501356001600160401b0380821115620047ab575f80fd5b818701915087601f830112620047bf575f80fd5b813581811115620047ce575f80fd5b886020828501011115620047e0575f80fd5b95989497505060200194505050565b5f6020828403121562004800575f80fd5b81356200453b816200447e565b803560ff8116811462002dca575f80fd5b5f805f805f8060c0878903121562004834575f80fd5b863562004841816200447e565b9550602087013562004853816200447e565b9450620048636040880162004371565b9350620048736060880162004371565b9250608087013591506200488a60a088016200480d565b90509295509295509295565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620048ba575f80fd5b81356001600160401b0380821115620048d757620048d762004896565b604051601f8301601f19908116603f0116810190828211818310171562004902576200490262004896565b816040528381528660208588010111156200491b575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f80610100898b03121562004953575f80fd5b6200495e896200435d565b97506200496e60208a0162004371565b9650604089013562004980816200447e565b9550606089013562004992816200447e565b94506080890135620049a4816200447e565b9350620049b460a08a016200435d565b925060c08901356001600160401b0380821115620049d0575f80fd5b620049de8c838d01620048aa565b935060e08b0135915080821115620049f4575f80fd5b5062004a038b828c01620048aa565b9150509295985092959890939650565b5f805f805f8060c0878903121562004a29575f80fd5b863562004a36816200447e565b9550602087013562004a48816200447e565b945062004a586040880162004371565b935062004a68606088016200480d565b92506080870135915060a08701356001600160401b0381111562004a8a575f80fd5b62004a9889828a01620048aa565b9150509295509295509295565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111562004afd5762004afd62004ac6565b5092915050565b80545f90600181811c908083168062004b1e57607f831692505b6020808410820362004b3e57634e487b7160e01b5f52602260045260245ffd5b8388526020880182801562004b5c576001811462004b735762004b9e565b60ff198716825285151560051b8201975062004b9e565b5f898152602090205f5b8781101562004b985781548482015290860190840162004b7d565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c0604082018190525f9062004bd89083018762004b04565b828103606084015262004bec818762004b04565b608084019590955250506001600160401b039190911660a090910152949350505050565b808202811582820484141762000aef5762000aef62004ac6565b6001600160401b0382811682821603908082111562004afd5762004afd62004ac6565b5f6001600160401b038281166002600160401b0319810162004c735762004c7362004ac6565b6001019392505050565b5f6020828403121562004c8e575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8262004cba5762004cba62004c95565b500490565b8082018082111562000aef5762000aef62004ac6565b634e487b7160e01b5f52603260045260245ffd5b5f6001820162004cfd5762004cfd62004ac6565b5060010190565b5f8262004d155762004d1562004c95565b500690565b8181038181111562000aef5762000aef62004ac6565b918252602082015260400190565b5f8162004d4f5762004d4f62004ac6565b505f190190565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b5f63ffffffff80831681810362004c735762004c7362004ac6565b6001600160a01b038481168252831660208201526060604082018190525f9062004ddd90830184620046de565b95945050505050565b6001600160a01b038881168252878116602083015263ffffffff878116604084015290861660608301528416608082015260e060a082018190525f9062004e3090830185620046de565b82810360c084015262004e448185620046de565b9a9950505050505050505050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190525f9062004e9e90830184620046de565b98975050505050505050565b5f825162004ebd818460208701620046ba565b9190910192915050565b6103208101610300808584378201835f5b600181101562004ef957815183526020928301929091019060010162004ed8565b5050509392505050565b5f6020828403121562004f14575f80fd5b815180151581146200453b575f80fd5b5f6001600160401b038381168062004f405762004f4062004c95565b9216919091049291505056fe60a06040526040516108b83803806108b883398101604081905261002291610349565b828161002e8282610056565b50506001600160a01b03821660805261004e61004960805190565b6100b4565b50505061042e565b61005f82610121565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100a8576100a3828261019f565b505050565b6100b0610212565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f35f80516020610898833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161011e81610233565b50565b806001600160a01b03163b5f0361015b57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516101bb9190610413565b5f60405180830381855af49150503d805f81146101f3576040519150601f19603f3d011682016040523d82523d5f602084013e6101f8565b606091505b509092509050610209858383610270565b95945050505050565b34156102315760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661025c57604051633173bdd160e11b81525f6004820152602401610152565b805f8051602061089883398151915261017e565b60608261028557610280826102cf565b6102c8565b815115801561029c57506001600160a01b0384163b155b156102c557604051639996b31560e01b81526001600160a01b0385166004820152602401610152565b50805b9392505050565b8051156102df5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461030e575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015610341578181015183820152602001610329565b50505f910152565b5f805f6060848603121561035b575f80fd5b610364846102f8565b9250610372602085016102f8565b60408501519092506001600160401b038082111561038e575f80fd5b818601915086601f8301126103a1575f80fd5b8151818111156103b3576103b3610313565b604051601f8201601f19908116603f011681019083821181831017156103db576103db610313565b816040528281528960208487010111156103f3575f80fd5b610404836020830160208801610327565b80955050505050509250925092565b5f8251610424818460208701610327565b9190910192915050565b6080516104536104455f395f601001526104535ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610069575f356001600160e01b03191663278f794360e11b146100615761005f61006d565b565b61005f61007d565b61005f5b61005f6100786100ab565b6100cf565b5f8061008c36600481846102ba565b81019061009991906102f5565b915091506100a782826100ed565b5050565b5f6100ca5f805160206103fe833981519152546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156100e9573d5ff35b3d5ffd5b6100f682610147565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561013f5761013a82826101aa565b505050565b6100a761021c565b806001600160a01b03163b5f0361017c5780604051634c9c8ce360e01b815260040161017391906103bd565b60405180910390fd5b5f805160206103fe83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101c691906103d1565b5f60405180830381855af49150503d805f81146101fe576040519150601f19603f3d011682016040523d82523d5f602084013e610203565b606091505b509150915061021385838361023b565b95945050505050565b341561005f5760405163b398979f60e01b815260040160405180910390fd5b6060826102505761024b82610291565b61028a565b815115801561026757506001600160a01b0384163b155b156102875783604051639996b31560e01b815260040161017391906103bd565b50805b9392505050565b8051156102a15780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f80858511156102c8575f80fd5b838611156102d4575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610306575f80fd5b82356001600160a01b038116811461031c575f80fd5b915060208301356001600160401b0380821115610337575f80fd5b818501915085601f83011261034a575f80fd5b81358181111561035c5761035c6102e1565b604051601f8201601f19908116603f01168101908382118183101715610384576103846102e1565b8160405282815288602084870101111561039c575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b5f82515f5b818110156103f057602081860181015185830152016103d6565b505f92019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220ed34fa57754ee02cddb50941efa15692106b258ce5586c40758a5937940c1a9864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000013dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220ba835c664aa1ec5efc320e5c8cd6c9ed245285050f4a1038f85a4b2b8f17dec364736f6c63430008140033", + "bytecode": "0x60e06040523480156200001157600080fd5b5060405162005c9a38038062005c9a83398101604081905262000034916200006b565b6001600160a01b0392831660805290821660c0521660a052620000bf565b6001600160a01b03811681146200006857600080fd5b50565b6000806000606084860312156200008157600080fd5b83516200008e8162000052565b6020850151909350620000a18162000052565b6040850151909250620000b48162000052565b809150509250925092565b60805160a05160c051615b73620001276000396000818161097601528181611b0d01526135030152600081816107250152818161265c01526137c00152600081816108b901528181610bcd01528181610d7d0152818161187401526136af0152615b736000f3fe60806040523480156200001157600080fd5b5060043610620002925760003560e01c8063066ec0121462000297578063080b311114620002c35780630a0d9fbe14620002eb57806311f6b287146200030657806312b86e19146200031d5780631489ed10146200033657806315064c96146200034d5780631608859c146200035b5780631796a1ae14620003725780631816b7e514620003995780632072f6c514620003b0578063248a9ca314620003ba5780632528016914620003e05780632f2ff15d146200049557806336568abe14620004ac578063394218e914620004c3578063477fa27014620004da5780634d4d333814620004e357806355a71ee014620004fa57806360469169146200053e57806365c0504d14620005485780637222020f14620005f75780637975fcfe146200060e5780637fb6e76a1462000634578063841b24d7146200065d57806387c20c0114620006785780638bd4f071146200068f57806391d1485414620006a657806399f5634e14620006bd5780639a908e7314620006c75780639c9f3dfe14620006de578063a066215c14620006f5578063a217fddf146200070c578063a2967d991462000715578063a3c573eb146200071f578063afd23cbe1462000756578063b99d0ad71462000780578063c1acbc341462000858578063c4c928c21462000873578063ceee281d146200088a578063d02103ca14620008b3578063d5073f6f14620008db578063d547741f14620008f2578063d939b3151462000909578063dbc16976146200091d578063dde0ff771462000927578063e0bfd3d21462000942578063e136edf71462000959578063e46761c41462000970578063f34eb8eb1462000998578063f4e9267514620009af578063f9c4c2ae14620009c0575b600080fd5b608454620002ab906001600160401b031681565b604051620002ba91906200443c565b60405180910390f35b620002da620002d43660046200447d565b62000ad7565b6040519015158152602001620002ba565b608554620002ab90600160401b90046001600160401b031681565b620002ab62000317366004620044b5565b62000b01565b620003346200032e366004620044e6565b62000b21565b005b620003346200034736600462004593565b62000cd1565b606f54620002da9060ff1681565b620003346200036c3660046200447d565b62000e61565b607e54620003839063ffffffff1681565b60405163ffffffff9091168152602001620002ba565b62000334620003aa3660046200461d565b62000ef6565b6200033462000fa2565b620003d1620003cb3660046200464a565b6200101c565b604051908152602001620002ba565b62000461620003f13660046200447d565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002ba565b62000334620004a636600462004664565b62001031565b62000334620004bd36600462004664565b62001053565b62000334620004d436600462004697565b6200108d565b608654620003d1565b62000334620004f4366004620046b5565b6200113c565b620003d16200050b3660046200447d565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620003d1620015cd565b620005ad62000559366004620044b5565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002ba565b6200033462000608366004620044b5565b620015e5565b620006256200061f3660046200476b565b620016d0565b604051620002ba919062004825565b620003836200064536600462004697565b60836020526000908152604090205463ffffffff1681565b608454620002ab90600160c01b90046001600160401b031681565b620003346200068936600462004593565b62001703565b62000334620006a0366004620044e6565b62001a27565b620002da620006b736600462004664565b62001add565b620003d162001b08565b620002ab620006d83660046200483a565b62001bf4565b62000334620006ef36600462004697565b62001dc1565b620003346200070636600462004697565b62001e64565b620003d1600081565b620003d162001f03565b620007477f000000000000000000000000000000000000000000000000000000000000000081565b604051620002ba919062004867565b6085546200076c90600160801b900461ffff1681565b60405161ffff9091168152602001620002ba565b62000816620007913660046200447d565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002ba919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002ab90600160801b90046001600160401b031681565b62000334620008843660046200487b565b620022c5565b620003836200089b36600462004913565b60826020526000908152604090205463ffffffff1681565b620007477f000000000000000000000000000000000000000000000000000000000000000081565b62000334620008ec3660046200464a565b62002592565b620003346200090336600462004664565b6200261d565b608554620002ab906001600160401b031681565b620003346200263f565b608454620002ab90600160401b90046001600160401b031681565b620003346200095336600462004945565b620026dc565b620003346200096a36600462004a6b565b62002764565b620007477f000000000000000000000000000000000000000000000000000000000000000081565b62000334620009a936600462004b4b565b62002bd8565b608054620003839063ffffffff1681565b62000a57620009d1366004620044b5565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002ba565b63ffffffff8216600090815260816020526040812062000af8908362002dc3565b90505b92915050565b63ffffffff8116600090815260816020526040812062000afb9062002e08565b60008051602062005b1e83398151915262000b3c8162002e79565b63ffffffff8916600090815260816020526040902062000b63818a8a8a8a8a8a8a62002e85565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000bcb576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000c0462001f03565b6040518263ffffffff1660e01b815260040162000c2391815260200190565b600060405180830381600087803b15801562000c3e57600080fd5b505af115801562000c53573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005b1e83398151915262000cec8162002e79565b63ffffffff8916600090815260816020526040902062000d13818a8a8a8a8a8a8a6200320d565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562000d7b576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000db462001f03565b6040518263ffffffff1660e01b815260040162000dd391815260200190565b600060405180830381600087803b15801562000dee57600080fd5b505af115801562000e03573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a60405162000e4d9392919062004be2565b60405180910390a350505050505050505050565b63ffffffff8216600090815260816020526040902062000e9160008051602062005b1e8339815191523362001add565b62000ee557606f5460ff161562000ebb57604051630bc011ff60e21b815260040160405180910390fd5b62000ec7818362002dc3565b62000ee557604051630674f25160e11b815260040160405180910390fd5b62000ef18183620035cc565b505050565b60008051602062005a9e83398151915262000f118162002e79565b6103e88261ffff16108062000f2b57506103ff8261ffff16115b1562000f4a57604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b62000fbd60008051602062005ade8339815191523362001add565b6200101057608454429062000fe79062093a8090600160801b90046001600160401b031662004c19565b6001600160401b03161115620010105760405163692baaad60e11b815260040160405180910390fd5b6200101a620037be565b565b60009081526034602052604090206001015490565b6200103c826200101c565b620010478162002e79565b62000ef183836200383d565b6001600160a01b03811633146200107d57604051630b4ad1cd60e31b815260040160405180910390fd5b620010898282620038a9565b5050565b60008051602062005a9e833981519152620010a88162002e79565b606f5460ff16620010ea576084546001600160401b03600160c01b909104811690831610620010ea5760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19062000f969084906200443c565b600054600290610100900460ff161580156200115f575060005460ff8083169116105b620011c85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200124962003913565b6200126460008051602062005b1e8339815191528a62003980565b6200127160008662003980565b6200128c60008051602062005a1e8339815191528662003980565b620012a760008051602062005a7e8339815191528662003980565b620012c2600080516020620059be8339815191528662003980565b620012dd600080516020620059fe8339815191528762003980565b620012f860008051602062005afe8339815191528762003980565b6200131360008051602062005a3e8339815191528762003980565b6200132e60008051602062005a9e8339815191528762003980565b6200135860008051602062005b1e8339815191526000805160206200599e8339815191526200398c565b620013736000805160206200599e8339815191528762003980565b6200138e600080516020620059de8339815191528762003980565b620013b860008051602062005ade83398151915260008051602062005abe8339815191526200398c565b620013d360008051602062005ade8339815191528562003980565b620013ee60008051602062005abe8339815191528562003980565b6000620014038484600561044d6000620039e1565b6073546074549192506001600160401b03600160401b909104811691168082146200144157604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b0381811660008181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620015429695831695600160581b909104909216936076936077939192919091169060040162004cef565b600060405180830381600087803b1580156200155d57600080fd5b505af115801562001572573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620015ba9050565b60405180910390a1505050505050505050565b60006086546064620015e0919062004d55565b905090565b600080516020620059fe833981519152620016008162002e79565b63ffffffff821615806200161f5750607e5463ffffffff908116908316115b156200163e57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200168557604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b63ffffffff86166000908152608160205260409020606090620016f890878787878762003c06565b979650505050505050565b606f5460ff16156200172857604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a8116865260038301909452919093206001015442926200177792600160c01b90048116911662004c19565b6001600160401b03161115620017a057604051638a0704d360e01b815260040160405180910390fd5b6103e8620017af888862004d6f565b6001600160401b03161115620017d857604051635acfba9d60e11b815260040160405180910390fd5b620017ea81898989898989896200320d565b620017f6818762003d41565b6085546001600160401b03166000036200190457600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001872576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620018ab62001f03565b6040518263ffffffff1660e01b8152600401620018ca91815260200190565b600060405180830381600087803b158015620018e557600080fd5b505af1158015620018fa573d6000803e3d6000fd5b50505050620019ce565b6200190f8162003f3e565b600681018054600160801b90046001600160401b0316906010620019338362004d92565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b488878960405162001a149392919062004be2565b60405180910390a3505050505050505050565b606f5460ff161562001a4c57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff8816600090815260816020526040902062001a73818989898989898962002e85565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a162001ad2620037be565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162001b59919062004867565b602060405180830381865afa15801562001b77573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001b9d919062004dc3565b60845490915060009062001bc4906001600160401b03600160401b82048116911662004d6f565b6001600160401b031690508060000362001be15760009250505090565b62001bed818362004df3565b9250505090565b606f5460009060ff161562001c1c57604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362001c54576040516371653c1560e01b815260040160405180910390fd5b836001600160401b031660000362001c7f57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81166000908152608160205260408120608480549192879262001cb29084906001600160401b031662004c19565b82546101009290920a6001600160401b038181021990931691831602179091556006830154169050600062001ce8878362004c19565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b03199092169290931691909117179055905062001d778362003f3e565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a258260405162001daf91906200443c565b60405180910390a29695505050505050565b60008051602062005a9e83398151915262001ddc8162002e79565b606f5460ff1662001e17576085546001600160401b039081169083161062001e175760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759062000f969084906200443c565b60008051602062005a9e83398151915262001e7f8162002e79565b62015180826001600160401b0316111562001ead57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289062000f969084906200443c565b60805460009063ffffffff1680820362001f1f57506000919050565b6000816001600160401b0381111562001f3c5762001f3c620049c1565b60405190808252806020026020018201604052801562001f66578160200160208202803683370190505b50905060005b8281101562001fd9576081600062001f8683600162004e0a565b63ffffffff1663ffffffff1681526020019081526020016000206005015482828151811062001fb95762001fb962004e20565b60209081029190910101528062001fd08162004e36565b91505062001f6c565b50600060205b836001146200221d57600062001ff760028662004e52565b6200200460028762004df3565b62002010919062004e0a565b90506000816001600160401b038111156200202f576200202f620049c1565b60405190808252806020026020018201604052801562002059578160200160208202803683370190505b50905060005b82811015620021d1576200207560018462004e69565b811480156200209057506200208c60028862004e52565b6001145b15620021105785620020a482600262004d55565b81518110620020b757620020b762004e20565b602002602001015185604051602001620020d392919062004e7f565b60405160208183030381529060405280519060200120828281518110620020fe57620020fe62004e20565b602002602001018181525050620021bc565b856200211e82600262004d55565b8151811062002131576200213162004e20565b60200260200101518682600262002149919062004d55565b6200215690600162004e0a565b8151811062002169576200216962004e20565b60200260200101516040516020016200218492919062004e7f565b60405160208183030381529060405280519060200120828281518110620021af57620021af62004e20565b6020026020010181815250505b80620021c88162004e36565b9150506200205f565b508094508195508384604051602001620021ed92919062004e7f565b6040516020818303038152906040528051906020012093508280620022129062004e8d565b935050505062001fdf565b60008360008151811062002235576200223562004e20565b6020026020010151905060005b82811015620022bb5781846040516020016200226092919062004e7f565b60405160208183030381529060405280519060200120915083846040516020016200228d92919062004e7f565b6040516020818303038152906040528051906020012093508080620022b29062004e36565b91505062002242565b5095945050505050565b600080516020620059be833981519152620022e08162002e79565b63ffffffff84161580620022ff5750607e5463ffffffff908116908516115b156200231e57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff16908190036200235f576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b031603620023ae57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff1615159003620023f557604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b90920416146200243357604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790556000620024b38462000b01565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef28692620025089216908b908b9060040162004ea7565b600060405180830381600087803b1580156200252357600080fd5b505af115801562002538573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b600080516020620059de833981519152620025ad8162002e79565b683635c9adc5dea00000821180620025c85750633b9aca0082105b15620025e757604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162000f96565b62002628826200101c565b620026338162002e79565b62000ef18383620038a9565b60008051602062005a3e8339815191526200265a8162002e79565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620026b657600080fd5b505af1158015620026cb573d6000803e3d6000fd5b50505050620026d962004009565b50565b60008051602062005a7e833981519152620026f78162002e79565b6001600160401b03841660009081526083602052604090205463ffffffff161562002735576040516337c8fe0960e11b815260040160405180910390fd5b6000620027468888888887620039e1565b60008080526002909101602052604090209390935550505050505050565b60008051602062005afe8339815191526200277f8162002e79565b63ffffffff891615806200279e5750607e5463ffffffff908116908a16115b15620027bd57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff89166000908152607f60205260409020600180820154600160e81b900460ff16151590036200280457604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03891660009081526083602052604090205463ffffffff161562002842576040516337c8fe0960e11b815260040160405180910390fd5b608080546000919082906200285d9063ffffffff1662004ee7565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b03909216913091620028ab906200442e565b620028b99392919062004f03565b604051809103906000f080158015620028d6573d6000803e3d6000fd5b50905081608360008d6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508b8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508c63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f9a84992ead4481f37097c7663e97ed883b31f216fae5685c6ee576a656483cd98e848f8d8d60405162002b5395949392919063ffffffff95861681526001600160a01b0394851660208201526001600160401b03939093166040840152921660608201529116608082015260a00190565b60405180910390a26040516308fd7e2160e31b81526001600160a01b038316906347ebf1089062002b95908e908e9088908f908f908f908f9060040162004f3a565b600060405180830381600087803b15801562002bb057600080fd5b505af115801562002bc5573d6000803e3d6000fd5b5050505050505050505050505050505050565b60008051602062005a1e83398151915262002bf38162002e79565b607e805460009190829062002c0e9063ffffffff1662004ee7565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002db19695949392919062004fa7565b60405180910390a25050505050505050565b6085546001600160401b0382811660009081526004850160205260408120549092429262002df692918116911662004c19565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b03161562002e5c575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b620026d9813362004062565b60078801546000906001600160401b03908116908716101562002ebb5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b0388161562002f5c5760068901546001600160401b03600160801b9091048116908916111562002f055760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b909204161462002f5557604051632bd2e3e760e01b815260040160405180910390fd5b5062002fd1565b506001600160401b03851660009081526002890160205260409020548062002f97576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b9091048116908716111562002fd157604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b909104811690881611806200300a5750876001600160401b0316876001600160401b031611155b806200302e575060068901546001600160401b03600160c01b909104811690881611155b156200304d5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b900481169086161462003094576040516332a2a77f60e01b815260040160405180910390fd5b6000620030a68a888888868962003c06565b9050600060008051602062005a5e833981519152600283604051620030cc919062005000565b602060405180830381855afa158015620030ea573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200310f919062004dc3565b6200311b919062004e52565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200315f918891906004016200501e565b602060405180830381865afa1580156200317d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620031a391906200505b565b620031c1576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620032005760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b6000806200321b8a62002e08565b60078b01549091506001600160401b039081169089161015620032515760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620032f45760068a01546001600160401b03600160801b9091048116908a1611156200329b5760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620032ed57604051632bd2e3e760e01b815260040160405180910390fd5b5062003364565b6001600160401b038816600090815260028b01602052604090205491508162003330576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200336457604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620033975760405163b9b18f5760e01b815260040160405180910390fd5b6000620033a98b8a8a8a878b62003c06565b9050600060008051602062005a5e833981519152600283604051620033cf919062005000565b602060405180830381855afa158015620033ed573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003412919062004dc3565b6200341e919062004e52565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003462918991906004016200501e565b602060405180830381865afa15801562003480573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620034a691906200505b565b620034c4576040516309bde33960e01b815260040160405180910390fd5b6000620034d2848b62004d6f565b90506200352b87826001600160401b0316620034ed62001b08565b620034f9919062004d55565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906200408c565b80608460088282829054906101000a90046001600160401b031662003551919062004c19565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d1539060640162002b95565b60068201546001600160401b03600160c01b90910481169082161115806200360b575060068201546001600160401b03600160801b9091048116908216115b156200362a5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620036e662001f03565b6040518263ffffffff1660e01b81526004016200370591815260200190565b600060405180830381600087803b1580156200372057600080fd5b505af115801562003735573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200381a57600080fd5b505af11580156200382f573d6000803e3d6000fd5b505050506200101a620040e0565b62003849828262001add565b620010895760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b620038b5828262001add565b15620010895760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600054610100900460ff166200101a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620011bf565b6200108982826200383d565b600062003999836200101c565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6080805460009182918290620039fd9063ffffffff1662004ee7565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000866001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508060826000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150868260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550858260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550838260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003bf494939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003c3c575081155b1562003c5b5760405163340c614f60e11b815260040160405180910390fd5b8062003c7a576040516366385b5160e01b815260040160405180910390fd5b62003c85846200413d565b62003ca3576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b600062003d4e8362002e08565b90508160008062003d60848462004d6f565b6085546001600160401b03918216925060009162003d8791600160401b9004164262004e69565b90505b846001600160401b0316846001600160401b03161462003e11576001600160401b0380851660009081526003890160205260409020600181015490911682101562003dec576001810154600160401b90046001600160401b0316945062003e0a565b62003df8868662004d6f565b6001600160401b031693505062003e11565b5062003d8a565b600062003e1f848462004e69565b90508381101562003e7d57808403600c811162003e3d578062003e40565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a608654028162003e725762003e7262004ddd565b046086555062003ef5565b838103600c811162003e90578062003e93565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162003ecd5762003ecd62004ddd565b04905080608654670de0b6b3a7640000028162003eee5762003eee62004ddd565b0460865550505b683635c9adc5dea00000608654111562003f1c57683635c9adc5dea0000060865562003f34565b633b9aca00608654101562003f3457633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b909204161115620026d957600681015460009062003f8990600160c01b90046001600160401b0316600162004c19565b905062003f97828262002dc3565b156200108957600682015460009060029062003fc5908490600160801b90046001600160401b031662004d6f565b62003fd191906200507f565b62003fdd908362004c19565b905062003feb838262002dc3565b1562003ffd5762000ef18382620035cc565b62000ef18383620035cc565b606f5460ff166200402d57604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6200406e828262001add565b6200108957604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905262000ef1908490620041c3565b606f5460ff16156200410557604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b03831610801562004174575067ffffffff00000001604083901c6001600160401b0316105b801562004195575067ffffffff00000001608083901c6001600160401b0316105b8015620041ad575067ffffffff0000000160c083901c105b15620041bb57506001919050565b506000919050565b60006200421a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200429c9092919063ffffffff16565b80519091501562000ef157808060200190518101906200423b91906200505b565b62000ef15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401620011bf565b6060620042ad8484600085620042b5565b949350505050565b606082471015620043185760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401620011bf565b600080866001600160a01b0316858760405162004336919062005000565b60006040518083038185875af1925050503d806000811462004375576040519150601f19603f3d011682016040523d82523d6000602084013e6200437a565b606091505b5091509150620016f88783838760608315620043fb578251600003620043f3576001600160a01b0385163b620043f35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620011bf565b5081620042ad565b620042ad8383815115620044125781518083602001fd5b8060405162461bcd60e51b8152600401620011bf919062004825565b6108f580620050a983390190565b6001600160401b0391909116815260200190565b803563ffffffff8116811462002e7457600080fd5b80356001600160401b038116811462002e7457600080fd5b600080604083850312156200449157600080fd5b6200449c8362004450565b9150620044ac6020840162004465565b90509250929050565b600060208284031215620044c857600080fd5b62000af88262004450565b80610300810183101562000afb57600080fd5b6000806000806000806000806103e0898b0312156200450457600080fd5b6200450f8962004450565b97506200451f60208a0162004465565b96506200452f60408a0162004465565b95506200453f60608a0162004465565b94506200454f60808a0162004465565b935060a0890135925060c089013591506200456e8a60e08b01620044d3565b90509295985092959890939650565b6001600160a01b0381168114620026d957600080fd5b6000806000806000806000806103e0898b031215620045b157600080fd5b620045bc8962004450565b9750620045cc60208a0162004465565b9650620045dc60408a0162004465565b9550620045ec60608a0162004465565b94506080890135935060a0890135925060c08901356200460c816200457d565b91506200456e8a60e08b01620044d3565b6000602082840312156200463057600080fd5b813561ffff811681146200464357600080fd5b9392505050565b6000602082840312156200465d57600080fd5b5035919050565b600080604083850312156200467857600080fd5b8235915060208301356200468c816200457d565b809150509250929050565b600060208284031215620046aa57600080fd5b62000af88262004465565b600080600080600080600080610100898b031215620046d357600080fd5b8835620046e0816200457d565b9750620046f060208a0162004465565b96506200470060408a0162004465565b9550606089013562004712816200457d565b9450608089013562004724816200457d565b935060a089013562004736816200457d565b925060c089013562004748816200457d565b915060e08901356200475a816200457d565b809150509295985092959890939650565b60008060008060008060c087890312156200478557600080fd5b620047908762004450565b9550620047a06020880162004465565b9450620047b06040880162004465565b9350606087013592506080870135915060a087013590509295509295509295565b60005b83811015620047ee578181015183820152602001620047d4565b50506000910152565b6000815180845262004811816020860160208601620047d1565b601f01601f19169290920160200192915050565b60208152600062000af86020830184620047f7565b600080604083850312156200484e57600080fd5b620048598362004465565b946020939093013593505050565b6001600160a01b0391909116815260200190565b600080600080606085870312156200489257600080fd5b84356200489f816200457d565b9350620048af6020860162004450565b925060408501356001600160401b0380821115620048cc57600080fd5b818701915087601f830112620048e157600080fd5b813581811115620048f157600080fd5b8860208285010111156200490457600080fd5b95989497505060200194505050565b6000602082840312156200492657600080fd5b813562004643816200457d565b803560ff8116811462002e7457600080fd5b60008060008060008060c087890312156200495f57600080fd5b86356200496c816200457d565b955060208701356200497e816200457d565b94506200498e6040880162004465565b93506200499e6060880162004465565b925060808701359150620049b560a0880162004933565b90509295509295509295565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620049e957600080fd5b81356001600160401b038082111562004a065762004a06620049c1565b604051601f8301601f19908116603f0116810190828211818310171562004a315762004a31620049c1565b8160405283815286602085880101111562004a4b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600080610100898b03121562004a8957600080fd5b62004a948962004450565b975062004aa460208a0162004465565b9650604089013562004ab6816200457d565b9550606089013562004ac8816200457d565b9450608089013562004ada816200457d565b935062004aea60a08a0162004450565b925060c08901356001600160401b038082111562004b0757600080fd5b62004b158c838d01620049d7565b935060e08b013591508082111562004b2c57600080fd5b5062004b3b8b828c01620049d7565b9150509295985092959890939650565b60008060008060008060c0878903121562004b6557600080fd5b863562004b72816200457d565b9550602087013562004b84816200457d565b945062004b946040880162004465565b935062004ba46060880162004933565b92506080870135915060a08701356001600160401b0381111562004bc757600080fd5b62004bd589828a01620049d7565b9150509295509295509295565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004c3c5762004c3c62004c03565b5092915050565b8054600090600181811c908083168062004c5e57607f831692505b6020808410820362004c8057634e487b7160e01b600052602260045260246000fd5b8388526020880182801562004c9e576001811462004cb55762004ce2565b60ff198716825285151560051b8201975062004ce2565b60008981526020902060005b8781101562004cdc5781548482015290860190840162004cc1565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c06040820181905260009062004d1d9083018762004c43565b828103606084015262004d31818762004c43565b608084019590955250506001600160401b039190911660a090910152949350505050565b808202811582820484141762000afb5762000afb62004c03565b6001600160401b0382811682821603908082111562004c3c5762004c3c62004c03565b60006001600160401b038281166002600160401b0319810162004db95762004db962004c03565b6001019392505050565b60006020828403121562004dd657600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b60008262004e055762004e0562004ddd565b500490565b8082018082111562000afb5762000afb62004c03565b634e487b7160e01b600052603260045260246000fd5b60006001820162004e4b5762004e4b62004c03565b5060010190565b60008262004e645762004e6462004ddd565b500690565b8181038181111562000afb5762000afb62004c03565b918252602082015260400190565b60008162004e9f5762004e9f62004c03565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b600063ffffffff80831681810362004db95762004db962004c03565b6001600160a01b0384811682528316602082015260606040820181905260009062004f3190830184620047f7565b95945050505050565b6001600160a01b038881168252878116602083015263ffffffff878116604084015290861660608301528416608082015260e060a0820181905260009062004f8590830185620047f7565b82810360c084015262004f998185620047f7565b9a9950505050505050505050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a0820181905260009062004ff490830184620047f7565b98975050505050505050565b6000825162005014818460208701620047d1565b9190910192915050565b61032081016103008085843782018360005b60018110156200505157815183526020928301929091019060010162005030565b5050509392505050565b6000602082840312156200506e57600080fd5b815180151581146200464357600080fd5b60006001600160401b03838116806200509c576200509c62004ddd565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220a19e7a72432195d9a35c7ce8fa5f1284415aac66bb1ad08a4c2e1c252fd8690864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000013dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220e590b2a38db493225a75f9b9c00741c324f43d46574bb7d4aa692081fd7493f164736f6c63430008140033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620002925760003560e01c8063066ec0121462000297578063080b311114620002c35780630a0d9fbe14620002eb57806311f6b287146200030657806312b86e19146200031d5780631489ed10146200033657806315064c96146200034d5780631608859c146200035b5780631796a1ae14620003725780631816b7e514620003995780632072f6c514620003b0578063248a9ca314620003ba5780632528016914620003e05780632f2ff15d146200049557806336568abe14620004ac578063394218e914620004c3578063477fa27014620004da5780634d4d333814620004e357806355a71ee014620004fa57806360469169146200053e57806365c0504d14620005485780637222020f14620005f75780637975fcfe146200060e5780637fb6e76a1462000634578063841b24d7146200065d57806387c20c0114620006785780638bd4f071146200068f57806391d1485414620006a657806399f5634e14620006bd5780639a908e7314620006c75780639c9f3dfe14620006de578063a066215c14620006f5578063a217fddf146200070c578063a2967d991462000715578063a3c573eb146200071f578063afd23cbe1462000756578063b99d0ad71462000780578063c1acbc341462000858578063c4c928c21462000873578063ceee281d146200088a578063d02103ca14620008b3578063d5073f6f14620008db578063d547741f14620008f2578063d939b3151462000909578063dbc16976146200091d578063dde0ff771462000927578063e0bfd3d21462000942578063e136edf71462000959578063e46761c41462000970578063f34eb8eb1462000998578063f4e9267514620009af578063f9c4c2ae14620009c0575b600080fd5b608454620002ab906001600160401b031681565b604051620002ba91906200443c565b60405180910390f35b620002da620002d43660046200447d565b62000ad7565b6040519015158152602001620002ba565b608554620002ab90600160401b90046001600160401b031681565b620002ab62000317366004620044b5565b62000b01565b620003346200032e366004620044e6565b62000b21565b005b620003346200034736600462004593565b62000cd1565b606f54620002da9060ff1681565b620003346200036c3660046200447d565b62000e61565b607e54620003839063ffffffff1681565b60405163ffffffff9091168152602001620002ba565b62000334620003aa3660046200461d565b62000ef6565b6200033462000fa2565b620003d1620003cb3660046200464a565b6200101c565b604051908152602001620002ba565b62000461620003f13660046200447d565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002ba565b62000334620004a636600462004664565b62001031565b62000334620004bd36600462004664565b62001053565b62000334620004d436600462004697565b6200108d565b608654620003d1565b62000334620004f4366004620046b5565b6200113c565b620003d16200050b3660046200447d565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620003d1620015cd565b620005ad62000559366004620044b5565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002ba565b6200033462000608366004620044b5565b620015e5565b620006256200061f3660046200476b565b620016d0565b604051620002ba919062004825565b620003836200064536600462004697565b60836020526000908152604090205463ffffffff1681565b608454620002ab90600160c01b90046001600160401b031681565b620003346200068936600462004593565b62001703565b62000334620006a0366004620044e6565b62001a27565b620002da620006b736600462004664565b62001add565b620003d162001b08565b620002ab620006d83660046200483a565b62001bf4565b62000334620006ef36600462004697565b62001dc1565b620003346200070636600462004697565b62001e64565b620003d1600081565b620003d162001f03565b620007477f000000000000000000000000000000000000000000000000000000000000000081565b604051620002ba919062004867565b6085546200076c90600160801b900461ffff1681565b60405161ffff9091168152602001620002ba565b62000816620007913660046200447d565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002ba919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002ab90600160801b90046001600160401b031681565b62000334620008843660046200487b565b620022c5565b620003836200089b36600462004913565b60826020526000908152604090205463ffffffff1681565b620007477f000000000000000000000000000000000000000000000000000000000000000081565b62000334620008ec3660046200464a565b62002592565b620003346200090336600462004664565b6200261d565b608554620002ab906001600160401b031681565b620003346200263f565b608454620002ab90600160401b90046001600160401b031681565b620003346200095336600462004945565b620026dc565b620003346200096a36600462004a6b565b62002764565b620007477f000000000000000000000000000000000000000000000000000000000000000081565b62000334620009a936600462004b4b565b62002bd8565b608054620003839063ffffffff1681565b62000a57620009d1366004620044b5565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002ba565b63ffffffff8216600090815260816020526040812062000af8908362002dc3565b90505b92915050565b63ffffffff8116600090815260816020526040812062000afb9062002e08565b60008051602062005b1e83398151915262000b3c8162002e79565b63ffffffff8916600090815260816020526040902062000b63818a8a8a8a8a8a8a62002e85565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000bcb576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000c0462001f03565b6040518263ffffffff1660e01b815260040162000c2391815260200190565b600060405180830381600087803b15801562000c3e57600080fd5b505af115801562000c53573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005b1e83398151915262000cec8162002e79565b63ffffffff8916600090815260816020526040902062000d13818a8a8a8a8a8a8a6200320d565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562000d7b576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000db462001f03565b6040518263ffffffff1660e01b815260040162000dd391815260200190565b600060405180830381600087803b15801562000dee57600080fd5b505af115801562000e03573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a60405162000e4d9392919062004be2565b60405180910390a350505050505050505050565b63ffffffff8216600090815260816020526040902062000e9160008051602062005b1e8339815191523362001add565b62000ee557606f5460ff161562000ebb57604051630bc011ff60e21b815260040160405180910390fd5b62000ec7818362002dc3565b62000ee557604051630674f25160e11b815260040160405180910390fd5b62000ef18183620035cc565b505050565b60008051602062005a9e83398151915262000f118162002e79565b6103e88261ffff16108062000f2b57506103ff8261ffff16115b1562000f4a57604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b62000fbd60008051602062005ade8339815191523362001add565b6200101057608454429062000fe79062093a8090600160801b90046001600160401b031662004c19565b6001600160401b03161115620010105760405163692baaad60e11b815260040160405180910390fd5b6200101a620037be565b565b60009081526034602052604090206001015490565b6200103c826200101c565b620010478162002e79565b62000ef183836200383d565b6001600160a01b03811633146200107d57604051630b4ad1cd60e31b815260040160405180910390fd5b620010898282620038a9565b5050565b60008051602062005a9e833981519152620010a88162002e79565b606f5460ff16620010ea576084546001600160401b03600160c01b909104811690831610620010ea5760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19062000f969084906200443c565b600054600290610100900460ff161580156200115f575060005460ff8083169116105b620011c85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200124962003913565b6200126460008051602062005b1e8339815191528a62003980565b6200127160008662003980565b6200128c60008051602062005a1e8339815191528662003980565b620012a760008051602062005a7e8339815191528662003980565b620012c2600080516020620059be8339815191528662003980565b620012dd600080516020620059fe8339815191528762003980565b620012f860008051602062005afe8339815191528762003980565b6200131360008051602062005a3e8339815191528762003980565b6200132e60008051602062005a9e8339815191528762003980565b6200135860008051602062005b1e8339815191526000805160206200599e8339815191526200398c565b620013736000805160206200599e8339815191528762003980565b6200138e600080516020620059de8339815191528762003980565b620013b860008051602062005ade83398151915260008051602062005abe8339815191526200398c565b620013d360008051602062005ade8339815191528562003980565b620013ee60008051602062005abe8339815191528562003980565b6000620014038484600561044d6000620039e1565b6073546074549192506001600160401b03600160401b909104811691168082146200144157604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b0381811660008181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620015429695831695600160581b909104909216936076936077939192919091169060040162004cef565b600060405180830381600087803b1580156200155d57600080fd5b505af115801562001572573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620015ba9050565b60405180910390a1505050505050505050565b60006086546064620015e0919062004d55565b905090565b600080516020620059fe833981519152620016008162002e79565b63ffffffff821615806200161f5750607e5463ffffffff908116908316115b156200163e57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200168557604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b63ffffffff86166000908152608160205260409020606090620016f890878787878762003c06565b979650505050505050565b606f5460ff16156200172857604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a8116865260038301909452919093206001015442926200177792600160c01b90048116911662004c19565b6001600160401b03161115620017a057604051638a0704d360e01b815260040160405180910390fd5b6103e8620017af888862004d6f565b6001600160401b03161115620017d857604051635acfba9d60e11b815260040160405180910390fd5b620017ea81898989898989896200320d565b620017f6818762003d41565b6085546001600160401b03166000036200190457600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001872576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620018ab62001f03565b6040518263ffffffff1660e01b8152600401620018ca91815260200190565b600060405180830381600087803b158015620018e557600080fd5b505af1158015620018fa573d6000803e3d6000fd5b50505050620019ce565b6200190f8162003f3e565b600681018054600160801b90046001600160401b0316906010620019338362004d92565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b488878960405162001a149392919062004be2565b60405180910390a3505050505050505050565b606f5460ff161562001a4c57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff8816600090815260816020526040902062001a73818989898989898962002e85565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a162001ad2620037be565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162001b59919062004867565b602060405180830381865afa15801562001b77573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001b9d919062004dc3565b60845490915060009062001bc4906001600160401b03600160401b82048116911662004d6f565b6001600160401b031690508060000362001be15760009250505090565b62001bed818362004df3565b9250505090565b606f5460009060ff161562001c1c57604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362001c54576040516371653c1560e01b815260040160405180910390fd5b836001600160401b031660000362001c7f57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81166000908152608160205260408120608480549192879262001cb29084906001600160401b031662004c19565b82546101009290920a6001600160401b038181021990931691831602179091556006830154169050600062001ce8878362004c19565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b03199092169290931691909117179055905062001d778362003f3e565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a258260405162001daf91906200443c565b60405180910390a29695505050505050565b60008051602062005a9e83398151915262001ddc8162002e79565b606f5460ff1662001e17576085546001600160401b039081169083161062001e175760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759062000f969084906200443c565b60008051602062005a9e83398151915262001e7f8162002e79565b62015180826001600160401b0316111562001ead57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289062000f969084906200443c565b60805460009063ffffffff1680820362001f1f57506000919050565b6000816001600160401b0381111562001f3c5762001f3c620049c1565b60405190808252806020026020018201604052801562001f66578160200160208202803683370190505b50905060005b8281101562001fd9576081600062001f8683600162004e0a565b63ffffffff1663ffffffff1681526020019081526020016000206005015482828151811062001fb95762001fb962004e20565b60209081029190910101528062001fd08162004e36565b91505062001f6c565b50600060205b836001146200221d57600062001ff760028662004e52565b6200200460028762004df3565b62002010919062004e0a565b90506000816001600160401b038111156200202f576200202f620049c1565b60405190808252806020026020018201604052801562002059578160200160208202803683370190505b50905060005b82811015620021d1576200207560018462004e69565b811480156200209057506200208c60028862004e52565b6001145b15620021105785620020a482600262004d55565b81518110620020b757620020b762004e20565b602002602001015185604051602001620020d392919062004e7f565b60405160208183030381529060405280519060200120828281518110620020fe57620020fe62004e20565b602002602001018181525050620021bc565b856200211e82600262004d55565b8151811062002131576200213162004e20565b60200260200101518682600262002149919062004d55565b6200215690600162004e0a565b8151811062002169576200216962004e20565b60200260200101516040516020016200218492919062004e7f565b60405160208183030381529060405280519060200120828281518110620021af57620021af62004e20565b6020026020010181815250505b80620021c88162004e36565b9150506200205f565b508094508195508384604051602001620021ed92919062004e7f565b6040516020818303038152906040528051906020012093508280620022129062004e8d565b935050505062001fdf565b60008360008151811062002235576200223562004e20565b6020026020010151905060005b82811015620022bb5781846040516020016200226092919062004e7f565b60405160208183030381529060405280519060200120915083846040516020016200228d92919062004e7f565b6040516020818303038152906040528051906020012093508080620022b29062004e36565b91505062002242565b5095945050505050565b600080516020620059be833981519152620022e08162002e79565b63ffffffff84161580620022ff5750607e5463ffffffff908116908516115b156200231e57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff16908190036200235f576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b031603620023ae57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff1615159003620023f557604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b90920416146200243357604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790556000620024b38462000b01565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef28692620025089216908b908b9060040162004ea7565b600060405180830381600087803b1580156200252357600080fd5b505af115801562002538573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b600080516020620059de833981519152620025ad8162002e79565b683635c9adc5dea00000821180620025c85750633b9aca0082105b15620025e757604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162000f96565b62002628826200101c565b620026338162002e79565b62000ef18383620038a9565b60008051602062005a3e8339815191526200265a8162002e79565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620026b657600080fd5b505af1158015620026cb573d6000803e3d6000fd5b50505050620026d962004009565b50565b60008051602062005a7e833981519152620026f78162002e79565b6001600160401b03841660009081526083602052604090205463ffffffff161562002735576040516337c8fe0960e11b815260040160405180910390fd5b6000620027468888888887620039e1565b60008080526002909101602052604090209390935550505050505050565b60008051602062005afe8339815191526200277f8162002e79565b63ffffffff891615806200279e5750607e5463ffffffff908116908a16115b15620027bd57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff89166000908152607f60205260409020600180820154600160e81b900460ff16151590036200280457604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03891660009081526083602052604090205463ffffffff161562002842576040516337c8fe0960e11b815260040160405180910390fd5b608080546000919082906200285d9063ffffffff1662004ee7565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b03909216913091620028ab906200442e565b620028b99392919062004f03565b604051809103906000f080158015620028d6573d6000803e3d6000fd5b50905081608360008d6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508b8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508c63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f9a84992ead4481f37097c7663e97ed883b31f216fae5685c6ee576a656483cd98e848f8d8d60405162002b5395949392919063ffffffff95861681526001600160a01b0394851660208201526001600160401b03939093166040840152921660608201529116608082015260a00190565b60405180910390a26040516308fd7e2160e31b81526001600160a01b038316906347ebf1089062002b95908e908e9088908f908f908f908f9060040162004f3a565b600060405180830381600087803b15801562002bb057600080fd5b505af115801562002bc5573d6000803e3d6000fd5b5050505050505050505050505050505050565b60008051602062005a1e83398151915262002bf38162002e79565b607e805460009190829062002c0e9063ffffffff1662004ee7565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002db19695949392919062004fa7565b60405180910390a25050505050505050565b6085546001600160401b0382811660009081526004850160205260408120549092429262002df692918116911662004c19565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b03161562002e5c575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b620026d9813362004062565b60078801546000906001600160401b03908116908716101562002ebb5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b0388161562002f5c5760068901546001600160401b03600160801b9091048116908916111562002f055760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b909204161462002f5557604051632bd2e3e760e01b815260040160405180910390fd5b5062002fd1565b506001600160401b03851660009081526002890160205260409020548062002f97576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b9091048116908716111562002fd157604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b909104811690881611806200300a5750876001600160401b0316876001600160401b031611155b806200302e575060068901546001600160401b03600160c01b909104811690881611155b156200304d5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b900481169086161462003094576040516332a2a77f60e01b815260040160405180910390fd5b6000620030a68a888888868962003c06565b9050600060008051602062005a5e833981519152600283604051620030cc919062005000565b602060405180830381855afa158015620030ea573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200310f919062004dc3565b6200311b919062004e52565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200315f918891906004016200501e565b602060405180830381865afa1580156200317d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620031a391906200505b565b620031c1576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620032005760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b6000806200321b8a62002e08565b60078b01549091506001600160401b039081169089161015620032515760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620032f45760068a01546001600160401b03600160801b9091048116908a1611156200329b5760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620032ed57604051632bd2e3e760e01b815260040160405180910390fd5b5062003364565b6001600160401b038816600090815260028b01602052604090205491508162003330576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200336457604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620033975760405163b9b18f5760e01b815260040160405180910390fd5b6000620033a98b8a8a8a878b62003c06565b9050600060008051602062005a5e833981519152600283604051620033cf919062005000565b602060405180830381855afa158015620033ed573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003412919062004dc3565b6200341e919062004e52565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003462918991906004016200501e565b602060405180830381865afa15801562003480573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620034a691906200505b565b620034c4576040516309bde33960e01b815260040160405180910390fd5b6000620034d2848b62004d6f565b90506200352b87826001600160401b0316620034ed62001b08565b620034f9919062004d55565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906200408c565b80608460088282829054906101000a90046001600160401b031662003551919062004c19565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d1539060640162002b95565b60068201546001600160401b03600160c01b90910481169082161115806200360b575060068201546001600160401b03600160801b9091048116908216115b156200362a5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620036e662001f03565b6040518263ffffffff1660e01b81526004016200370591815260200190565b600060405180830381600087803b1580156200372057600080fd5b505af115801562003735573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200381a57600080fd5b505af11580156200382f573d6000803e3d6000fd5b505050506200101a620040e0565b62003849828262001add565b620010895760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b620038b5828262001add565b15620010895760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600054610100900460ff166200101a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620011bf565b6200108982826200383d565b600062003999836200101c565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6080805460009182918290620039fd9063ffffffff1662004ee7565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000866001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508060826000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150868260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550858260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550838260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003bf494939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003c3c575081155b1562003c5b5760405163340c614f60e11b815260040160405180910390fd5b8062003c7a576040516366385b5160e01b815260040160405180910390fd5b62003c85846200413d565b62003ca3576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b600062003d4e8362002e08565b90508160008062003d60848462004d6f565b6085546001600160401b03918216925060009162003d8791600160401b9004164262004e69565b90505b846001600160401b0316846001600160401b03161462003e11576001600160401b0380851660009081526003890160205260409020600181015490911682101562003dec576001810154600160401b90046001600160401b0316945062003e0a565b62003df8868662004d6f565b6001600160401b031693505062003e11565b5062003d8a565b600062003e1f848462004e69565b90508381101562003e7d57808403600c811162003e3d578062003e40565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a608654028162003e725762003e7262004ddd565b046086555062003ef5565b838103600c811162003e90578062003e93565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162003ecd5762003ecd62004ddd565b04905080608654670de0b6b3a7640000028162003eee5762003eee62004ddd565b0460865550505b683635c9adc5dea00000608654111562003f1c57683635c9adc5dea0000060865562003f34565b633b9aca00608654101562003f3457633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b909204161115620026d957600681015460009062003f8990600160c01b90046001600160401b0316600162004c19565b905062003f97828262002dc3565b156200108957600682015460009060029062003fc5908490600160801b90046001600160401b031662004d6f565b62003fd191906200507f565b62003fdd908362004c19565b905062003feb838262002dc3565b1562003ffd5762000ef18382620035cc565b62000ef18383620035cc565b606f5460ff166200402d57604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6200406e828262001add565b6200108957604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905262000ef1908490620041c3565b606f5460ff16156200410557604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b03831610801562004174575067ffffffff00000001604083901c6001600160401b0316105b801562004195575067ffffffff00000001608083901c6001600160401b0316105b8015620041ad575067ffffffff0000000160c083901c105b15620041bb57506001919050565b506000919050565b60006200421a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200429c9092919063ffffffff16565b80519091501562000ef157808060200190518101906200423b91906200505b565b62000ef15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401620011bf565b6060620042ad8484600085620042b5565b949350505050565b606082471015620043185760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401620011bf565b600080866001600160a01b0316858760405162004336919062005000565b60006040518083038185875af1925050503d806000811462004375576040519150601f19603f3d011682016040523d82523d6000602084013e6200437a565b606091505b5091509150620016f88783838760608315620043fb578251600003620043f3576001600160a01b0385163b620043f35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620011bf565b5081620042ad565b620042ad8383815115620044125781518083602001fd5b8060405162461bcd60e51b8152600401620011bf919062004825565b6108f580620050a983390190565b6001600160401b0391909116815260200190565b803563ffffffff8116811462002e7457600080fd5b80356001600160401b038116811462002e7457600080fd5b600080604083850312156200449157600080fd5b6200449c8362004450565b9150620044ac6020840162004465565b90509250929050565b600060208284031215620044c857600080fd5b62000af88262004450565b80610300810183101562000afb57600080fd5b6000806000806000806000806103e0898b0312156200450457600080fd5b6200450f8962004450565b97506200451f60208a0162004465565b96506200452f60408a0162004465565b95506200453f60608a0162004465565b94506200454f60808a0162004465565b935060a0890135925060c089013591506200456e8a60e08b01620044d3565b90509295985092959890939650565b6001600160a01b0381168114620026d957600080fd5b6000806000806000806000806103e0898b031215620045b157600080fd5b620045bc8962004450565b9750620045cc60208a0162004465565b9650620045dc60408a0162004465565b9550620045ec60608a0162004465565b94506080890135935060a0890135925060c08901356200460c816200457d565b91506200456e8a60e08b01620044d3565b6000602082840312156200463057600080fd5b813561ffff811681146200464357600080fd5b9392505050565b6000602082840312156200465d57600080fd5b5035919050565b600080604083850312156200467857600080fd5b8235915060208301356200468c816200457d565b809150509250929050565b600060208284031215620046aa57600080fd5b62000af88262004465565b600080600080600080600080610100898b031215620046d357600080fd5b8835620046e0816200457d565b9750620046f060208a0162004465565b96506200470060408a0162004465565b9550606089013562004712816200457d565b9450608089013562004724816200457d565b935060a089013562004736816200457d565b925060c089013562004748816200457d565b915060e08901356200475a816200457d565b809150509295985092959890939650565b60008060008060008060c087890312156200478557600080fd5b620047908762004450565b9550620047a06020880162004465565b9450620047b06040880162004465565b9350606087013592506080870135915060a087013590509295509295509295565b60005b83811015620047ee578181015183820152602001620047d4565b50506000910152565b6000815180845262004811816020860160208601620047d1565b601f01601f19169290920160200192915050565b60208152600062000af86020830184620047f7565b600080604083850312156200484e57600080fd5b620048598362004465565b946020939093013593505050565b6001600160a01b0391909116815260200190565b600080600080606085870312156200489257600080fd5b84356200489f816200457d565b9350620048af6020860162004450565b925060408501356001600160401b0380821115620048cc57600080fd5b818701915087601f830112620048e157600080fd5b813581811115620048f157600080fd5b8860208285010111156200490457600080fd5b95989497505060200194505050565b6000602082840312156200492657600080fd5b813562004643816200457d565b803560ff8116811462002e7457600080fd5b60008060008060008060c087890312156200495f57600080fd5b86356200496c816200457d565b955060208701356200497e816200457d565b94506200498e6040880162004465565b93506200499e6060880162004465565b925060808701359150620049b560a0880162004933565b90509295509295509295565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620049e957600080fd5b81356001600160401b038082111562004a065762004a06620049c1565b604051601f8301601f19908116603f0116810190828211818310171562004a315762004a31620049c1565b8160405283815286602085880101111562004a4b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600080610100898b03121562004a8957600080fd5b62004a948962004450565b975062004aa460208a0162004465565b9650604089013562004ab6816200457d565b9550606089013562004ac8816200457d565b9450608089013562004ada816200457d565b935062004aea60a08a0162004450565b925060c08901356001600160401b038082111562004b0757600080fd5b62004b158c838d01620049d7565b935060e08b013591508082111562004b2c57600080fd5b5062004b3b8b828c01620049d7565b9150509295985092959890939650565b60008060008060008060c0878903121562004b6557600080fd5b863562004b72816200457d565b9550602087013562004b84816200457d565b945062004b946040880162004465565b935062004ba46060880162004933565b92506080870135915060a08701356001600160401b0381111562004bc757600080fd5b62004bd589828a01620049d7565b9150509295509295509295565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004c3c5762004c3c62004c03565b5092915050565b8054600090600181811c908083168062004c5e57607f831692505b6020808410820362004c8057634e487b7160e01b600052602260045260246000fd5b8388526020880182801562004c9e576001811462004cb55762004ce2565b60ff198716825285151560051b8201975062004ce2565b60008981526020902060005b8781101562004cdc5781548482015290860190840162004cc1565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c06040820181905260009062004d1d9083018762004c43565b828103606084015262004d31818762004c43565b608084019590955250506001600160401b039190911660a090910152949350505050565b808202811582820484141762000afb5762000afb62004c03565b6001600160401b0382811682821603908082111562004c3c5762004c3c62004c03565b60006001600160401b038281166002600160401b0319810162004db95762004db962004c03565b6001019392505050565b60006020828403121562004dd657600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b60008262004e055762004e0562004ddd565b500490565b8082018082111562000afb5762000afb62004c03565b634e487b7160e01b600052603260045260246000fd5b60006001820162004e4b5762004e4b62004c03565b5060010190565b60008262004e645762004e6462004ddd565b500690565b8181038181111562000afb5762000afb62004c03565b918252602082015260400190565b60008162004e9f5762004e9f62004c03565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b600063ffffffff80831681810362004db95762004db962004c03565b6001600160a01b0384811682528316602082015260606040820181905260009062004f3190830184620047f7565b95945050505050565b6001600160a01b038881168252878116602083015263ffffffff878116604084015290861660608301528416608082015260e060a0820181905260009062004f8590830185620047f7565b82810360c084015262004f998185620047f7565b9a9950505050505050505050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a0820181905260009062004ff490830184620047f7565b98975050505050505050565b6000825162005014818460208701620047d1565b9190910192915050565b61032081016103008085843782018360005b60018110156200505157815183526020928301929091019060010162005030565b5050509392505050565b6000602082840312156200506e57600080fd5b815180151581146200464357600080fd5b60006001600160401b03838116806200509c576200509c62004ddd565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220a19e7a72432195d9a35c7ce8fa5f1284415aac66bb1ad08a4c2e1c252fd8690864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000013dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220e590b2a38db493225a75f9b9c00741c324f43d46574bb7d4aa692081fd7493f164736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVM.json b/compiled-contracts/paris/PolygonZkEVM.json index 5ea36755a..11e07d74d 100644 --- a/compiled-contracts/paris/PolygonZkEVM.json +++ b/compiled-contracts/paris/PolygonZkEVM.json @@ -1711,8 +1711,8 @@ "type": "function" } ], - "bytecode": "0x61014060405234801562000011575f80fd5b50604051620047ef380380620047ef8339810160408190526200003491620000a2565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b039182166101005216610120526200012a565b6001600160a01b038116811462000083575f80fd5b50565b80516001600160401b03811681146200009d575f80fd5b919050565b5f805f805f8060c08789031215620000b8575f80fd5b8651620000c5816200006e565b6020880151909650620000d8816200006e565b6040880151909550620000eb816200006e565b6060880151909450620000fe816200006e565b92506200010e6080880162000086565b91506200011e60a0880162000086565b90509295509295509295565b60805160a05160c05160e05161010051610120516145ff620001f05f395f818161055301528181610b18015261239e01525f818161068c0152610aee01525f818161065201528181611591015281816127d001526136ea01525f81816107c301528181610c1501528181610d5d015281816112d0015281816118230152818161291a01526132a101525f818161084c01528181612db801526130f701525f818161073a0152818161155f01528181611bb4015281816128ef0152612e7d01526145ff5ff3fe608060405234801561000f575f80fd5b50600436106102d7575f3560e01c8063841b24d711610181578063841b24d7146105e25780638c3d7301146105fc5780638da5cb5b1461060457806399f5634e1461060c5780639aa972a3146106145780639c9f3dfe14610627578063a066215c1461063a578063a3c573eb1461064d578063ada8f91914610674578063adc879e914610687578063afd23cbe146106ae578063b4d63f58146106d6578063b6b0b09714610735578063ba58ae391461075c578063c0ed84e01461076f578063c754c7ed14610777578063c89e42df14610791578063cfa8ed47146107a4578063d02103ca146107be578063d2e129f9146107e5578063d8d1091b146107f8578063d939b3151461080b578063dbc1697614610825578063e7a7ed021461082d578063e8bf92ed14610847578063eaeb077b1461086e578063ed6b010414610881578063f14916d614610895578063f2fde38b146108a8578063f851a440146108bb578063f8b823e4146108ce575f80fd5b80630a0d9fbe146102db578063107bf28c1461030957806315064c961461031e5780631816b7e51461033b57806319d8ac6114610350578063220d789914610363578063267822471461037657806329878983146103965780632b0006fa146103b05780632c1f816a146103c3578063383b3be8146103d6578063394218e9146103e9578063423fa856146103fc5780634560526714610416578063458c0477146104305780634a1a89a7146104435780634a910e6a1461045d5780634e487706146104705780635392c5e014610483578063542028d5146104b05780635e9145c9146104b85780635ec91958146104cb57806360469169146104d3578063621dd411146104db5780636b8616ce146104ee5780636ff512cc1461050d578063715018a6146105205780637215541a146105285780637fcb36531461053b578063831c7ead1461054e578063837a473814610575575b5f80fd5b606f546102f39061010090046001600160401b031681565b6040516103009190613b20565b60405180910390f35b6103116108d7565b6040516103009190613b81565b606f5461032b9060ff1681565b6040519015158152602001610300565b61034e610349366004613b9a565b610963565b005b6073546102f3906001600160401b031681565b610311610371366004613bd1565b610a1c565b607b54610389906001600160a01b031681565b6040516103009190613c1a565b60745461038990600160401b90046001600160a01b031681565b61034e6103be366004613c45565b610b76565b61034e6103d1366004613ca9565b610cbd565b61032b6103e4366004613d1e565b610e1b565b61034e6103f7366004613d1e565b610e61565b6073546102f390600160401b90046001600160401b031681565b6073546102f390600160801b90046001600160401b031681565b6079546102f3906001600160401b031681565b6079546102f390600160401b90046001600160401b031681565b61034e61046b366004613d1e565b610f49565b61034e61047e366004613d1e565b610fb8565b6104a2610491366004613d1e565b60756020525f908152604090205481565b604051908152602001610300565b6103116110a4565b61034e6104c6366004613d94565b6110b1565b61034e61163c565b6104a26116c8565b61034e6104e9366004613c45565b6116dd565b6104a26104fc366004613d1e565b60716020525f908152604090205481565b61034e61051b366004613de3565b611973565b61034e6119f2565b61034e610536366004613d1e565b611a05565b6074546102f3906001600160401b031681565b6102f37f000000000000000000000000000000000000000000000000000000000000000081565b6105b7610583366004613dfc565b60786020525f90815260409020805460018201546002909201546001600160401b0380831693600160401b90930416919084565b604080516001600160401b039586168152949093166020850152918301526060820152608001610300565b6079546102f390600160c01b90046001600160401b031681565b61034e611b1d565b610389611ba1565b6104a2611bb0565b61034e610622366004613ca9565b611cb7565b61034e610635366004613d1e565b611d4d565b61034e610648366004613d1e565b611e39565b6103897f000000000000000000000000000000000000000000000000000000000000000081565b61034e610682366004613de3565b611ee1565b6102f37f000000000000000000000000000000000000000000000000000000000000000081565b606f546106c390600160481b900461ffff1681565b60405161ffff9091168152602001610300565b6107106106e4366004613d1e565b60726020525f9081526040902080546001909101546001600160401b0380821691600160401b90041683565b604080519384526001600160401b039283166020850152911690820152606001610300565b6103897f000000000000000000000000000000000000000000000000000000000000000081565b61032b61076a366004613dfc565b611f57565b6102f3611fdc565b607b546102f390600160a01b90046001600160401b031681565b61034e61079f366004613eaf565b612027565b606f5461038990600160581b90046001600160a01b031681565b6103897f000000000000000000000000000000000000000000000000000000000000000081565b61034e6107f3366004613f1d565b61208e565b61034e610806366004613fc7565b612424565b6079546102f390600160801b90046001600160401b031681565b61034e6127a3565b6073546102f390600160c01b90046001600160401b031681565b6103897f000000000000000000000000000000000000000000000000000000000000000081565b61034e61087c366004614005565b612844565b607b5461032b90600160e01b900460ff1681565b61034e6108a3366004613de3565b612aea565b61034e6108b6366004613de3565b612b69565b607a54610389906001600160a01b031681565b6104a260705481565b607780546108e49061404c565b80601f01602080910402602001604051908101604052809291908181526020018280546109109061404c565b801561095b5780601f106109325761010080835404028352916020019161095b565b820191905f5260205f20905b81548152906001019060200180831161093e57829003601f168201915b505050505081565b607a546001600160a01b0316331461098e57604051634755657960e01b815260040160405180910390fd5b6103e88161ffff1610806109a757506103ff8161ffff16115b156109c557604051630984a67960e31b815260040160405180910390fd5b606f805461ffff60481b1916600160481b61ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b6001600160401b038086165f818152607260205260408082205493881682529020546060929115801590610a4e575081155b15610a6c5760405163340c614f60e11b815260040160405180910390fd5b80610a8a576040516366385b5160e01b815260040160405180910390fd5b610a9384611f57565b610ab0576040516305dae44f60e21b815260040160405180910390fd5b604080516001600160601b03193360601b166020820152603481019690965260548601929092526001600160c01b031960c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b607454600160401b90046001600160a01b03163314610ba85760405163bbcbbc0560e01b815260040160405180910390fd5b610bb6868686868686612bdf565b607480546001600160401b0319166001600160401b038681169182179092555f9081526075602052604090208390556079541615610bff57607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b158015610c5e575f80fd5b505af1158015610c70573d5f803e3d5ffd5b50506040518481523392506001600160401b03871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b607454600160401b90046001600160a01b03163314610cef5760405163bbcbbc0560e01b815260040160405180910390fd5b610cfe87878787878787612eb0565b607480546001600160401b0319166001600160401b038681169182179092555f9081526075602052604090208390556079541615610d4757607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b158015610da6575f80fd5b505af1158015610db8573d5f803e3d5ffd5b5050607980546001600160c01b031661127560c71b179055505060405182815233906001600160401b038616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b6079546001600160401b038281165f9081526078602052604081205490924292610e5092600160801b90920481169116614098565b6001600160401b0316111592915050565b607a546001600160a01b03163314610e8c57604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610eb957604051631d06e87960e01b815260040160405180910390fd5b606f5460ff16610ef9576079546001600160401b03600160c01b909104811690821610610ef95760405163401636df60e01b815260040160405180910390fd5b607980546001600160c01b0316600160c01b6001600160401b038416021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190610a11908390613b20565b607454600160401b90046001600160a01b03163314610fac57606f5460ff1615610f8657604051630bc011ff60e21b815260040160405180910390fd5b610f8f81610e1b565b610fac57604051630674f25160e11b815260040160405180910390fd5b610fb5816131c4565b50565b607a546001600160a01b03163314610fe357604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b03821611156110105760405163f5e37f2f60e01b815260040160405180910390fd5b606f5460ff1661105057607b546001600160401b03600160a01b9091048116908216106110505760405163f5e37f2f60e01b815260040160405180910390fd5b607b8054600160a01b600160e01b031916600160a01b6001600160401b038416021790556040517fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90610a11908390613b20565b607680546108e49061404c565b606f5460ff16156110d557604051630bc011ff60e21b815260040160405180910390fd5b606f54600160581b90046001600160a01b03163314611107576040516311e7be1560e01b815260040160405180910390fd5b815f8190036111295760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561114c57604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160401b820481165f81815260726020526040812054838516949293600160801b909304909216919082905b8681101561142b575f8a8a8381811061119f5761119f6140bf565b90506020028101906111b191906140d3565b6111ba906140f1565b805180516020909101206060820151919250906001600160401b0316156112a657856111e58161417a565b9650505f8183602001518460600151604051602001611206939291906141a7565b60408051601f1981840301815291815281516020928301206001600160401b038a165f908152607190935291205490915081146112565760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b038088165f9081526071602052604080822091909155606085015190850151908216911610156112a057604051633fbd5c3960e11b815260040160405180910390fd5b50611388565b602082015115801590611344575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303815f875af115801561131e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061134291906141ca565b155b15611362576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c01015611388576040516328a69b1f60e21b815260040160405180910390fd5b876001600160401b031682604001516001600160401b031610806113b857504282604001516001600160401b0316115b156113d6576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518d6040516020016113f79594939291906141e1565b604051602081830303815290604052805190602001209450816040015197505050808061142390614220565b915050611184565b506114368685614098565b6073549094506001600160401b03600160c01b909104811690841611156114705760405163c630a00d60e01b815260040160405180910390fd5b5f61147b8285614238565b61148e906001600160401b031688614258565b60408051606081018252858152426001600160401b03908116602080840191825260738054600160401b9081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585166001600160801b03199384161795851684029590951790945583548c84169116179302929092179055909150828116908516146115425760738054600160801b600160c01b031916600160801b6001600160401b038716021790555b611587333083607054611555919061426b565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613356565b61158f6133c7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156115e7575f80fd5b505af11580156115f9573d5f803e3d5ffd5b50506040516001600160401b03881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a546001600160a01b0316331461166757604051634755657960e01b815260040160405180910390fd5b607b54600160e01b900460ff166116915760405163f6ba91a160e01b815260040160405180910390fd5b607b805460ff60e01b191690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f60705460646116d8919061426b565b905090565b606f5460ff161561170157604051630bc011ff60e21b815260040160405180910390fd5b6079546001600160401b038581165f90815260726020526040902060010154429261173792600160c01b90910481169116614098565b6001600160401b0316111561175f57604051638a0704d360e01b815260040160405180910390fd5b6103e861176c8686614238565b6001600160401b0316111561179457604051635acfba9d60e11b815260040160405180910390fd5b6117a2868686868686612bdf565b6117ab84613469565b607954600160801b90046001600160401b03165f0361188757607480546001600160401b0319166001600160401b038681169182179092555f908152607560205260409020839055607954161561180d57607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b15801561186c575f80fd5b505af115801561187e573d5f803e3d5ffd5b50505050611936565b61188f6133c7565b607980546001600160401b0316905f6118a78361417a565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f9081526078909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b60405182815233906001600160401b038616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001610cad565b607a546001600160a01b0316331461199e57604051634755657960e01b815260040160405180910390fd5b606f8054600160581b600160f81b031916600160581b6001600160a01b038416021790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610a11908390613c1a565b6119fa613638565b611a035f613697565b565b611a0d611ba1565b6001600160a01b0316336001600160a01b031614611b15575f611a2e611fdc565b9050806001600160401b0316826001600160401b031611611a625760405163812a372d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b90910481169083161180611aa057506001600160401b038083165f9081526072602052604090206001015416155b15611abe57604051632631700560e21b815260040160405180910390fd5b6001600160401b038083165f908152607260205260409020600101544291611aeb9162093a809116614098565b6001600160401b03161115611b135760405163692baaad60e11b815260040160405180910390fd5b505b610fb56136e8565b607b546001600160a01b03163314611b485760405163d1ec4b2360e01b815260040160405180910390fd5b607b54607a80546001600160a01b0319166001600160a01b0390921691821790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e91611b9791613c1a565b60405180910390a1565b6033546001600160a01b031690565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401611bfe9190613c1a565b602060405180830381865afa158015611c19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c3d91906141ca565b90505f611c48611fdc565b6073546001600160401b03600160401b8204811691611c7891600160801b8204811691600160c01b900416614238565b611c829190614098565b611c8c9190614238565b6001600160401b03169050805f03611ca6575f9250505090565b611cb08183614296565b9250505090565b606f5460ff1615611cdb57604051630bc011ff60e21b815260040160405180910390fd5b611cea87878787878787612eb0565b6001600160401b0384165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1611d446136e8565b50505050505050565b607a546001600160a01b03163314611d7857604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115611da557604051630cc9650760e41b815260040160405180910390fd5b606f5460ff16611de5576079546001600160401b03600160801b909104811690821610611de55760405163048a05a960e41b815260040160405180910390fd5b60798054600160801b600160c01b031916600160801b6001600160401b038416021790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590610a11908390613b20565b607a546001600160a01b03163314611e6457604051634755657960e01b815260040160405180910390fd5b62015180816001600160401b03161115611e9157604051631c0cfbfd60e31b815260040160405180910390fd5b606f8054610100600160481b0319166101006001600160401b038416021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890610a11908390613b20565b607a546001600160a01b03163314611f0c57604051634755657960e01b815260040160405180910390fd5b607b80546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610a11908390613c1a565b5f67ffffffff000000016001600160401b038316108015611f8c575067ffffffff00000001604083901c6001600160401b0316105b8015611fac575067ffffffff00000001608083901c6001600160401b0316105b8015611fc3575067ffffffff0000000160c083901c105b15611fd057506001919050565b505f919050565b919050565b6079545f906001600160401b03161561201757506079546001600160401b039081165f90815260786020526040902054600160401b90041690565b506074546001600160401b031690565b607a546001600160a01b0316331461205257604051634755657960e01b815260040160405180910390fd5b607661205e82826142f6565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610a119190613b81565b5f54610100900460ff16158080156120ac57505f54600160ff909116105b806120cc57506120bb3061375e565b1580156120cc57505f5460ff166001145b6121345760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015612155575f805461ff0019166101001790555b6121626020880188613de3565b607a80546001600160a01b0319166001600160a01b03929092169190911790556121926040880160208901613de3565b606f80546001600160a01b0392909216600160581b02600160581b600160f81b03199092169190911790556121cd6080880160608901613de3565b607480546001600160a01b0392909216600160401b02600160401b600160e01b03199092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad869055607661223086826142f6565b50607761223d85826142f6565b5062093a806122526060890160408a01613d1e565b6001600160401b0316111561227a57604051630cc9650760e41b815260040160405180910390fd5b61228a6060880160408901613d1e565b607980546001600160401b0392909216600160801b02600160801b600160c01b031990921691909117905562093a806122c960a0890160808a01613d1e565b6001600160401b031611156122f157604051631d06e87960e01b815260040160405180910390fd5b61230160a0880160808901613d1e565b607980546001600160c01b0316600160c01b6001600160401b03939093169290920291909117905567016345785d8a0000607055606f8054610100600160581b031916620708006101f560491b01179055607b8054600160a01b600160e81b031916670200000000000d2f60a71b17905561237a61376d565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f000000000000000000000000000000000000000000000000000000000000000085856040516123cf94939291906143d9565b60405180910390a18015611d44575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b54600160e01b900460ff161561244f576040516324eff8c360e01b815260040160405180910390fd5b606f5460ff161561247357604051630bc011ff60e21b815260040160405180910390fd5b805f8190036124955760405163cb591a5f60e01b815260040160405180910390fd5b6103e88111156124b857604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160c01b82048116916124e0918491600160801b90041661440f565b11156124ff5760405163c630a00d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b820481165f818152607260205260408120549193600160801b9004909216915b848110156126ae575f87878381811061254a5761254a6140bf565b905060200281019061255c9190614422565b61256590614436565b9050836125718161417a565b825180516020918201208185015160408087015190519499509194505f9361259c93869391016141a7565b60408051601f1981840301815291815281516020928301206001600160401b0389165f908152607190935291205490915081146125ec5760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b0386165f9081526071602052604081205561260f600189614258565b84036126635742607b60149054906101000a90046001600160401b0316846040015161263b9190614098565b6001600160401b031611156126635760405163c44a082160e01b815260040160405180910390fd5b8482846020015142336040516020016126809594939291906141e1565b60405160208183030381529060405280519060200120945050505080806126a690614220565b91505061252f565b506126b98484614098565b607380546001600160401b034281166001600160401b03199092168217808455604080516060810182528781526020808201958652600160401b9384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686026001600160801b031990921693871693909317179091558554938916600160801b02600160801b600160c01b031993860293909316600160401b600160c01b031990941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a546001600160a01b031633146127ce57604051634755657960e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612826575f80fd5b505af1158015612838573d5f803e3d5ffd5b50505050611a036137e0565b607b54600160e01b900460ff161561286f576040516324eff8c360e01b815260040160405180910390fd5b606f5460ff161561289357604051630bc011ff60e21b815260040160405180910390fd5b5f61289c6116c8565b9050818111156128bf57604051634732fdb560e01b815260040160405180910390fd5b6113888311156128e2576040516328a69b1f60e21b815260040160405180910390fd5b6129176001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084613356565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612974573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061299891906141ca565b60738054919250600160c01b9091046001600160401b03169060186129bc8361417a565b91906101000a8154816001600160401b0302191690836001600160401b031602179055505084846040516129f19291906144ae565b604051908190038120612a0a91839042906020016141a7565b60408051808303601f190181529181528151602092830120607354600160c01b90046001600160401b03165f9081526071909352912055323303612a99576073546040805183815233602082015260609181018290525f91810191909152600160c01b9091046001600160401b0316905f805160206145aa8339815191529060800160405180910390a2612ae3565b607360189054906101000a90046001600160401b03166001600160401b03165f805160206145aa83398151915282338888604051612ada94939291906144bd565b60405180910390a25b5050505050565b607a546001600160a01b03163314612b1557604051634755657960e01b815260040160405180910390fd5b60748054600160401b600160e01b031916600160401b6001600160a01b038416021790556040517f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90610a11908390613c1a565b612b71613638565b6001600160a01b038116612bd65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161212b565b610fb581613697565b5f80612be9611fdc565b90506001600160401b03881615612c7e576079546001600160401b039081169089161115612c2a5760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b038089165f908152607860205260409020600281015481549094509091898116600160401b9092041614612c7857604051632bd2e3e760e01b815260040160405180910390fd5b50612ce9565b6001600160401b0387165f90815260756020526040902054915081612cb6576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316876001600160401b03161115612ce957604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316866001600160401b031611612d1b5760405163b9b18f5760e01b815260040160405180910390fd5b5f612d298888888689610a1c565b90505f5f8051602061458a833981519152600283604051612d4a91906144e7565b602060405180830381855afa158015612d65573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612d8891906141ca565b612d9291906144f8565b604080516020810182528281529051634890ed4560e11b81529192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91612dee9189919060040161450b565b602060405180830381865afa158015612e09573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e2d9190614545565b612e4a576040516309bde33960e01b815260040160405180910390fd5b612ea433612e58858b614238565b6001600160401b0316612e69611bb0565b612e73919061426b565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190613837565b50505050505050505050565b5f6001600160401b03881615612f42576079546001600160401b039081169089161115612ef05760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f908152607860205260409020600281015481549092888116600160401b9092041614612f3c57604051632bd2e3e760e01b815260040160405180910390fd5b50612fa9565b506001600160401b0385165f9081526075602052604090205480612f79576040516324cbdcc360e11b815260040160405180910390fd5b6074546001600160401b039081169087161115612fa957604051630f2b74f160e11b815260040160405180910390fd5b6079546001600160401b039081169088161180612fd85750876001600160401b0316876001600160401b031611155b80612ff957506079546001600160401b03600160401b909104811690881611155b156130175760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260786020526040902054600160401b900481169086161461305a576040516332a2a77f60e01b815260040160405180910390fd5b5f6130688787878588610a1c565b90505f5f8051602061458a83398151915260028360405161308991906144e7565b602060405180830381855afa1580156130a4573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906130c791906141ca565b6130d191906144f8565b604080516020810182528281529051634890ed4560e11b81529192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161312d9188919060040161450b565b602060405180830381865afa158015613148573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061316c9190614545565b613189576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260786020526040902060020154859003612ea45760405163a47276bd60e01b815260040160405180910390fd5b6079546001600160401b03600160401b90910481169082161115806131f757506079546001600160401b03908116908216115b156132155760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f818152607860209081526040808320805460748054600160401b928390049098166001600160401b03199098168817905560028201548786526075909452938290209290925560798054600160401b600160801b0319169390940292909217909255600182015490516333d6247d60e01b815260048101919091529091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b1580156132ea575f80fd5b505af11580156132fc573d5f803e3d5ffd5b50505050826001600160401b0316816001600160401b03167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161334991815260200190565b60405180910390a3505050565b6040516001600160a01b03808516602483015283166044820152606481018290526133c19085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261386c565b50505050565b6079546001600160401b03600160401b8204811691161115611a03576079545f9061340390600160401b90046001600160401b03166001614098565b905061340e81610e1b565b15610fb5576079545f9060029061342f9084906001600160401b0316614238565b6134399190614564565b6134439083614098565b905061344e81610e1b565b156134605761345c816131c4565b5050565b61345c826131c4565b5f613472611fdc565b9050815f806134818484614238565b606f546001600160401b0391821692505f916134a39161010090041642614258565b90505b846001600160401b0316846001600160401b031614613523576001600160401b038085165f9081526072602052604090206001810154909116821015613502576001810154600160401b90046001600160401b0316945061351d565b61350c8686614238565b6001600160401b0316935050613523565b506134a6565b5f61352e8484614258565b90508381101561358557808403600c8111613549578061354c565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a607054028161357b5761357b614282565b04607055506135f4565b838103600c81116135965780613599565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a764000002816135cf576135cf614282565b04905080607054670de0b6b3a764000002816135ed576135ed614282565b0460705550505b683635c9adc5dea00000607054111561361957683635c9adc5dea00000607055611d44565b633b9aca006070541015611d4457633b9aca0060705550505050505050565b33613641611ba1565b6001600160a01b031614611a035760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161212b565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613740575f80fd5b505af1158015613752573d5f803e3d5ffd5b50505050611a0361393d565b6001600160a01b03163b151590565b5f54610100900460ff166137d75760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161212b565b611a0333613697565b606f5460ff1661380357604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b6040516001600160a01b03831660248201526044810182905261386790849063a9059cbb60e01b9060640161338a565b505050565b5f6138c0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166139989092919063ffffffff16565b80519091501561386757808060200190518101906138de9190614545565b6138675760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161212b565b606f5460ff161561396157604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60606139a684845f856139ae565b949350505050565b606082471015613a0f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161212b565b5f80866001600160a01b03168587604051613a2a91906144e7565b5f6040518083038185875af1925050503d805f8114613a64576040519150601f19603f3d011682016040523d82523d5f602084013e613a69565b606091505b5091509150613a7a87838387613a85565b979650505050505050565b60608315613af15782515f03613aea57613a9e8561375e565b613aea5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161212b565b50816139a6565b6139a68383815115613b065781518083602001fd5b8060405162461bcd60e51b815260040161212b9190613b81565b6001600160401b0391909116815260200190565b5f5b83811015613b4e578181015183820152602001613b36565b50505f910152565b5f8151808452613b6d816020860160208601613b34565b601f01601f19169290920160200192915050565b602081525f613b936020830184613b56565b9392505050565b5f60208284031215613baa575f80fd5b813561ffff81168114613b93575f80fd5b80356001600160401b0381168114611fd7575f80fd5b5f805f805f60a08688031215613be5575f80fd5b613bee86613bbb565b9450613bfc60208701613bbb565b94979496505050506040830135926060810135926080909101359150565b6001600160a01b0391909116815260200190565b806103008101831015613c3f575f80fd5b92915050565b5f805f805f806103a08789031215613c5b575f80fd5b613c6487613bbb565b9550613c7260208801613bbb565b9450613c8060408801613bbb565b93506060870135925060808701359150613c9d8860a08901613c2e565b90509295509295509295565b5f805f805f805f6103c0888a031215613cc0575f80fd5b613cc988613bbb565b9650613cd760208901613bbb565b9550613ce560408901613bbb565b9450613cf360608901613bbb565b93506080880135925060a08801359150613d108960c08a01613c2e565b905092959891949750929550565b5f60208284031215613d2e575f80fd5b613b9382613bbb565b5f8083601f840112613d47575f80fd5b5081356001600160401b03811115613d5d575f80fd5b6020830191508360208260051b8501011115613d77575f80fd5b9250929050565b80356001600160a01b0381168114611fd7575f80fd5b5f805f60408486031215613da6575f80fd5b83356001600160401b03811115613dbb575f80fd5b613dc786828701613d37565b9094509250613dda905060208501613d7e565b90509250925092565b5f60208284031215613df3575f80fd5b613b9382613d7e565b5f60208284031215613e0c575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112613e36575f80fd5b81356001600160401b0380821115613e5057613e50613e13565b604051601f8301601f19908116603f01168101908282118183101715613e7857613e78613e13565b81604052838152866020858801011115613e90575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f60208284031215613ebf575f80fd5b81356001600160401b03811115613ed4575f80fd5b6139a684828501613e27565b5f8083601f840112613ef0575f80fd5b5081356001600160401b03811115613f06575f80fd5b602083019150836020828501011115613d77575f80fd5b5f805f805f80868803610120811215613f34575f80fd5b60a0811215613f41575f80fd5b5086955060a0860135945060c08601356001600160401b0380821115613f65575f80fd5b613f718a838b01613e27565b955060e0890135915080821115613f86575f80fd5b613f928a838b01613e27565b9450610100890135915080821115613fa8575f80fd5b50613fb589828a01613ee0565b979a9699509497509295939492505050565b5f8060208385031215613fd8575f80fd5b82356001600160401b03811115613fed575f80fd5b613ff985828601613d37565b90969095509350505050565b5f805f60408486031215614017575f80fd5b83356001600160401b0381111561402c575f80fd5b61403886828701613ee0565b909790965060209590950135949350505050565b600181811c9082168061406057607f821691505b60208210810361407e57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038181168382160190808211156140b8576140b8614084565b5092915050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e198336030181126140e7575f80fd5b9190910192915050565b5f60808236031215614101575f80fd5b604051608081016001600160401b03808211838310171561412457614124613e13565b816040528435915080821115614138575f80fd5b5061414536828601613e27565b8252506020830135602082015261415e60408401613bbb565b604082015261416f60608401613bbb565b606082015292915050565b5f6001600160401b038281166002600160401b0319810161419d5761419d614084565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b5f602082840312156141da575f80fd5b5051919050565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b5f6001820161423157614231614084565b5060010190565b6001600160401b038281168282160390808211156140b8576140b8614084565b81810381811115613c3f57613c3f614084565b8082028115828204841417613c3f57613c3f614084565b634e487b7160e01b5f52601260045260245ffd5b5f826142a4576142a4614282565b500490565b601f821115613867575f81815260208120601f850160051c810160208610156142cf5750805b601f850160051c820191505b818110156142ee578281556001016142db565b505050505050565b81516001600160401b0381111561430f5761430f613e13565b6143238161431d845461404c565b846142a9565b602080601f831160018114614356575f841561433f5750858301515b5f19600386901b1c1916600185901b1785556142ee565b5f85815260208120601f198616915b8281101561438457888601518255948401946001909101908401614365565b50858210156143a157878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160401b038581168252841660208201526060604082018190525f9061440590830184866143b1565b9695505050505050565b80820180821115613c3f57613c3f614084565b5f8235605e198336030181126140e7575f80fd5b5f60608236031215614446575f80fd5b604051606081016001600160401b03808211838310171561446957614469613e13565b81604052843591508082111561447d575f80fd5b5061448a36828601613e27565b825250602083013560208201526144a360408401613bbb565b604082015292915050565b818382375f9101908152919050565b8481526001600160a01b03841660208201526060604082018190525f9061440590830184866143b1565b5f82516140e7818460208701613b34565b5f8261450657614506614282565b500690565b6103208101610300808584378201835f5b600181101561453b57815183526020928301929091019060010161451c565b5050509392505050565b5f60208284031215614555575f80fd5b81518015158114613b93575f80fd5b5f6001600160401b038381168061457d5761457d614282565b9216919091049291505056fe30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001f94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931a2646970667358221220820f6390588faddb24f9b7ce2d20dfe664629e0fe77ff4263ebff40b7cb9125564736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106102d7575f3560e01c8063841b24d711610181578063841b24d7146105e25780638c3d7301146105fc5780638da5cb5b1461060457806399f5634e1461060c5780639aa972a3146106145780639c9f3dfe14610627578063a066215c1461063a578063a3c573eb1461064d578063ada8f91914610674578063adc879e914610687578063afd23cbe146106ae578063b4d63f58146106d6578063b6b0b09714610735578063ba58ae391461075c578063c0ed84e01461076f578063c754c7ed14610777578063c89e42df14610791578063cfa8ed47146107a4578063d02103ca146107be578063d2e129f9146107e5578063d8d1091b146107f8578063d939b3151461080b578063dbc1697614610825578063e7a7ed021461082d578063e8bf92ed14610847578063eaeb077b1461086e578063ed6b010414610881578063f14916d614610895578063f2fde38b146108a8578063f851a440146108bb578063f8b823e4146108ce575f80fd5b80630a0d9fbe146102db578063107bf28c1461030957806315064c961461031e5780631816b7e51461033b57806319d8ac6114610350578063220d789914610363578063267822471461037657806329878983146103965780632b0006fa146103b05780632c1f816a146103c3578063383b3be8146103d6578063394218e9146103e9578063423fa856146103fc5780634560526714610416578063458c0477146104305780634a1a89a7146104435780634a910e6a1461045d5780634e487706146104705780635392c5e014610483578063542028d5146104b05780635e9145c9146104b85780635ec91958146104cb57806360469169146104d3578063621dd411146104db5780636b8616ce146104ee5780636ff512cc1461050d578063715018a6146105205780637215541a146105285780637fcb36531461053b578063831c7ead1461054e578063837a473814610575575b5f80fd5b606f546102f39061010090046001600160401b031681565b6040516103009190613b20565b60405180910390f35b6103116108d7565b6040516103009190613b81565b606f5461032b9060ff1681565b6040519015158152602001610300565b61034e610349366004613b9a565b610963565b005b6073546102f3906001600160401b031681565b610311610371366004613bd1565b610a1c565b607b54610389906001600160a01b031681565b6040516103009190613c1a565b60745461038990600160401b90046001600160a01b031681565b61034e6103be366004613c45565b610b76565b61034e6103d1366004613ca9565b610cbd565b61032b6103e4366004613d1e565b610e1b565b61034e6103f7366004613d1e565b610e61565b6073546102f390600160401b90046001600160401b031681565b6073546102f390600160801b90046001600160401b031681565b6079546102f3906001600160401b031681565b6079546102f390600160401b90046001600160401b031681565b61034e61046b366004613d1e565b610f49565b61034e61047e366004613d1e565b610fb8565b6104a2610491366004613d1e565b60756020525f908152604090205481565b604051908152602001610300565b6103116110a4565b61034e6104c6366004613d94565b6110b1565b61034e61163c565b6104a26116c8565b61034e6104e9366004613c45565b6116dd565b6104a26104fc366004613d1e565b60716020525f908152604090205481565b61034e61051b366004613de3565b611973565b61034e6119f2565b61034e610536366004613d1e565b611a05565b6074546102f3906001600160401b031681565b6102f37f000000000000000000000000000000000000000000000000000000000000000081565b6105b7610583366004613dfc565b60786020525f90815260409020805460018201546002909201546001600160401b0380831693600160401b90930416919084565b604080516001600160401b039586168152949093166020850152918301526060820152608001610300565b6079546102f390600160c01b90046001600160401b031681565b61034e611b1d565b610389611ba1565b6104a2611bb0565b61034e610622366004613ca9565b611cb7565b61034e610635366004613d1e565b611d4d565b61034e610648366004613d1e565b611e39565b6103897f000000000000000000000000000000000000000000000000000000000000000081565b61034e610682366004613de3565b611ee1565b6102f37f000000000000000000000000000000000000000000000000000000000000000081565b606f546106c390600160481b900461ffff1681565b60405161ffff9091168152602001610300565b6107106106e4366004613d1e565b60726020525f9081526040902080546001909101546001600160401b0380821691600160401b90041683565b604080519384526001600160401b039283166020850152911690820152606001610300565b6103897f000000000000000000000000000000000000000000000000000000000000000081565b61032b61076a366004613dfc565b611f57565b6102f3611fdc565b607b546102f390600160a01b90046001600160401b031681565b61034e61079f366004613eaf565b612027565b606f5461038990600160581b90046001600160a01b031681565b6103897f000000000000000000000000000000000000000000000000000000000000000081565b61034e6107f3366004613f1d565b61208e565b61034e610806366004613fc7565b612424565b6079546102f390600160801b90046001600160401b031681565b61034e6127a3565b6073546102f390600160c01b90046001600160401b031681565b6103897f000000000000000000000000000000000000000000000000000000000000000081565b61034e61087c366004614005565b612844565b607b5461032b90600160e01b900460ff1681565b61034e6108a3366004613de3565b612aea565b61034e6108b6366004613de3565b612b69565b607a54610389906001600160a01b031681565b6104a260705481565b607780546108e49061404c565b80601f01602080910402602001604051908101604052809291908181526020018280546109109061404c565b801561095b5780601f106109325761010080835404028352916020019161095b565b820191905f5260205f20905b81548152906001019060200180831161093e57829003601f168201915b505050505081565b607a546001600160a01b0316331461098e57604051634755657960e01b815260040160405180910390fd5b6103e88161ffff1610806109a757506103ff8161ffff16115b156109c557604051630984a67960e31b815260040160405180910390fd5b606f805461ffff60481b1916600160481b61ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b6001600160401b038086165f818152607260205260408082205493881682529020546060929115801590610a4e575081155b15610a6c5760405163340c614f60e11b815260040160405180910390fd5b80610a8a576040516366385b5160e01b815260040160405180910390fd5b610a9384611f57565b610ab0576040516305dae44f60e21b815260040160405180910390fd5b604080516001600160601b03193360601b166020820152603481019690965260548601929092526001600160c01b031960c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b607454600160401b90046001600160a01b03163314610ba85760405163bbcbbc0560e01b815260040160405180910390fd5b610bb6868686868686612bdf565b607480546001600160401b0319166001600160401b038681169182179092555f9081526075602052604090208390556079541615610bff57607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b158015610c5e575f80fd5b505af1158015610c70573d5f803e3d5ffd5b50506040518481523392506001600160401b03871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b607454600160401b90046001600160a01b03163314610cef5760405163bbcbbc0560e01b815260040160405180910390fd5b610cfe87878787878787612eb0565b607480546001600160401b0319166001600160401b038681169182179092555f9081526075602052604090208390556079541615610d4757607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b158015610da6575f80fd5b505af1158015610db8573d5f803e3d5ffd5b5050607980546001600160c01b031661127560c71b179055505060405182815233906001600160401b038616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b6079546001600160401b038281165f9081526078602052604081205490924292610e5092600160801b90920481169116614098565b6001600160401b0316111592915050565b607a546001600160a01b03163314610e8c57604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610eb957604051631d06e87960e01b815260040160405180910390fd5b606f5460ff16610ef9576079546001600160401b03600160c01b909104811690821610610ef95760405163401636df60e01b815260040160405180910390fd5b607980546001600160c01b0316600160c01b6001600160401b038416021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190610a11908390613b20565b607454600160401b90046001600160a01b03163314610fac57606f5460ff1615610f8657604051630bc011ff60e21b815260040160405180910390fd5b610f8f81610e1b565b610fac57604051630674f25160e11b815260040160405180910390fd5b610fb5816131c4565b50565b607a546001600160a01b03163314610fe357604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b03821611156110105760405163f5e37f2f60e01b815260040160405180910390fd5b606f5460ff1661105057607b546001600160401b03600160a01b9091048116908216106110505760405163f5e37f2f60e01b815260040160405180910390fd5b607b8054600160a01b600160e01b031916600160a01b6001600160401b038416021790556040517fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90610a11908390613b20565b607680546108e49061404c565b606f5460ff16156110d557604051630bc011ff60e21b815260040160405180910390fd5b606f54600160581b90046001600160a01b03163314611107576040516311e7be1560e01b815260040160405180910390fd5b815f8190036111295760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561114c57604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160401b820481165f81815260726020526040812054838516949293600160801b909304909216919082905b8681101561142b575f8a8a8381811061119f5761119f6140bf565b90506020028101906111b191906140d3565b6111ba906140f1565b805180516020909101206060820151919250906001600160401b0316156112a657856111e58161417a565b9650505f8183602001518460600151604051602001611206939291906141a7565b60408051601f1981840301815291815281516020928301206001600160401b038a165f908152607190935291205490915081146112565760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b038088165f9081526071602052604080822091909155606085015190850151908216911610156112a057604051633fbd5c3960e11b815260040160405180910390fd5b50611388565b602082015115801590611344575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303815f875af115801561131e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061134291906141ca565b155b15611362576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c01015611388576040516328a69b1f60e21b815260040160405180910390fd5b876001600160401b031682604001516001600160401b031610806113b857504282604001516001600160401b0316115b156113d6576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518d6040516020016113f79594939291906141e1565b604051602081830303815290604052805190602001209450816040015197505050808061142390614220565b915050611184565b506114368685614098565b6073549094506001600160401b03600160c01b909104811690841611156114705760405163c630a00d60e01b815260040160405180910390fd5b5f61147b8285614238565b61148e906001600160401b031688614258565b60408051606081018252858152426001600160401b03908116602080840191825260738054600160401b9081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585166001600160801b03199384161795851684029590951790945583548c84169116179302929092179055909150828116908516146115425760738054600160801b600160c01b031916600160801b6001600160401b038716021790555b611587333083607054611555919061426b565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613356565b61158f6133c7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156115e7575f80fd5b505af11580156115f9573d5f803e3d5ffd5b50506040516001600160401b03881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a546001600160a01b0316331461166757604051634755657960e01b815260040160405180910390fd5b607b54600160e01b900460ff166116915760405163f6ba91a160e01b815260040160405180910390fd5b607b805460ff60e01b191690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f60705460646116d8919061426b565b905090565b606f5460ff161561170157604051630bc011ff60e21b815260040160405180910390fd5b6079546001600160401b038581165f90815260726020526040902060010154429261173792600160c01b90910481169116614098565b6001600160401b0316111561175f57604051638a0704d360e01b815260040160405180910390fd5b6103e861176c8686614238565b6001600160401b0316111561179457604051635acfba9d60e11b815260040160405180910390fd5b6117a2868686868686612bdf565b6117ab84613469565b607954600160801b90046001600160401b03165f0361188757607480546001600160401b0319166001600160401b038681169182179092555f908152607560205260409020839055607954161561180d57607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b15801561186c575f80fd5b505af115801561187e573d5f803e3d5ffd5b50505050611936565b61188f6133c7565b607980546001600160401b0316905f6118a78361417a565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f9081526078909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b60405182815233906001600160401b038616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001610cad565b607a546001600160a01b0316331461199e57604051634755657960e01b815260040160405180910390fd5b606f8054600160581b600160f81b031916600160581b6001600160a01b038416021790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610a11908390613c1a565b6119fa613638565b611a035f613697565b565b611a0d611ba1565b6001600160a01b0316336001600160a01b031614611b15575f611a2e611fdc565b9050806001600160401b0316826001600160401b031611611a625760405163812a372d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b90910481169083161180611aa057506001600160401b038083165f9081526072602052604090206001015416155b15611abe57604051632631700560e21b815260040160405180910390fd5b6001600160401b038083165f908152607260205260409020600101544291611aeb9162093a809116614098565b6001600160401b03161115611b135760405163692baaad60e11b815260040160405180910390fd5b505b610fb56136e8565b607b546001600160a01b03163314611b485760405163d1ec4b2360e01b815260040160405180910390fd5b607b54607a80546001600160a01b0319166001600160a01b0390921691821790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e91611b9791613c1a565b60405180910390a1565b6033546001600160a01b031690565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401611bfe9190613c1a565b602060405180830381865afa158015611c19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c3d91906141ca565b90505f611c48611fdc565b6073546001600160401b03600160401b8204811691611c7891600160801b8204811691600160c01b900416614238565b611c829190614098565b611c8c9190614238565b6001600160401b03169050805f03611ca6575f9250505090565b611cb08183614296565b9250505090565b606f5460ff1615611cdb57604051630bc011ff60e21b815260040160405180910390fd5b611cea87878787878787612eb0565b6001600160401b0384165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1611d446136e8565b50505050505050565b607a546001600160a01b03163314611d7857604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115611da557604051630cc9650760e41b815260040160405180910390fd5b606f5460ff16611de5576079546001600160401b03600160801b909104811690821610611de55760405163048a05a960e41b815260040160405180910390fd5b60798054600160801b600160c01b031916600160801b6001600160401b038416021790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590610a11908390613b20565b607a546001600160a01b03163314611e6457604051634755657960e01b815260040160405180910390fd5b62015180816001600160401b03161115611e9157604051631c0cfbfd60e31b815260040160405180910390fd5b606f8054610100600160481b0319166101006001600160401b038416021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890610a11908390613b20565b607a546001600160a01b03163314611f0c57604051634755657960e01b815260040160405180910390fd5b607b80546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610a11908390613c1a565b5f67ffffffff000000016001600160401b038316108015611f8c575067ffffffff00000001604083901c6001600160401b0316105b8015611fac575067ffffffff00000001608083901c6001600160401b0316105b8015611fc3575067ffffffff0000000160c083901c105b15611fd057506001919050565b505f919050565b919050565b6079545f906001600160401b03161561201757506079546001600160401b039081165f90815260786020526040902054600160401b90041690565b506074546001600160401b031690565b607a546001600160a01b0316331461205257604051634755657960e01b815260040160405180910390fd5b607661205e82826142f6565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610a119190613b81565b5f54610100900460ff16158080156120ac57505f54600160ff909116105b806120cc57506120bb3061375e565b1580156120cc57505f5460ff166001145b6121345760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015612155575f805461ff0019166101001790555b6121626020880188613de3565b607a80546001600160a01b0319166001600160a01b03929092169190911790556121926040880160208901613de3565b606f80546001600160a01b0392909216600160581b02600160581b600160f81b03199092169190911790556121cd6080880160608901613de3565b607480546001600160a01b0392909216600160401b02600160401b600160e01b03199092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad869055607661223086826142f6565b50607761223d85826142f6565b5062093a806122526060890160408a01613d1e565b6001600160401b0316111561227a57604051630cc9650760e41b815260040160405180910390fd5b61228a6060880160408901613d1e565b607980546001600160401b0392909216600160801b02600160801b600160c01b031990921691909117905562093a806122c960a0890160808a01613d1e565b6001600160401b031611156122f157604051631d06e87960e01b815260040160405180910390fd5b61230160a0880160808901613d1e565b607980546001600160c01b0316600160c01b6001600160401b03939093169290920291909117905567016345785d8a0000607055606f8054610100600160581b031916620708006101f560491b01179055607b8054600160a01b600160e81b031916670200000000000d2f60a71b17905561237a61376d565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f000000000000000000000000000000000000000000000000000000000000000085856040516123cf94939291906143d9565b60405180910390a18015611d44575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b54600160e01b900460ff161561244f576040516324eff8c360e01b815260040160405180910390fd5b606f5460ff161561247357604051630bc011ff60e21b815260040160405180910390fd5b805f8190036124955760405163cb591a5f60e01b815260040160405180910390fd5b6103e88111156124b857604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160c01b82048116916124e0918491600160801b90041661440f565b11156124ff5760405163c630a00d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b820481165f818152607260205260408120549193600160801b9004909216915b848110156126ae575f87878381811061254a5761254a6140bf565b905060200281019061255c9190614422565b61256590614436565b9050836125718161417a565b825180516020918201208185015160408087015190519499509194505f9361259c93869391016141a7565b60408051601f1981840301815291815281516020928301206001600160401b0389165f908152607190935291205490915081146125ec5760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b0386165f9081526071602052604081205561260f600189614258565b84036126635742607b60149054906101000a90046001600160401b0316846040015161263b9190614098565b6001600160401b031611156126635760405163c44a082160e01b815260040160405180910390fd5b8482846020015142336040516020016126809594939291906141e1565b60405160208183030381529060405280519060200120945050505080806126a690614220565b91505061252f565b506126b98484614098565b607380546001600160401b034281166001600160401b03199092168217808455604080516060810182528781526020808201958652600160401b9384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686026001600160801b031990921693871693909317179091558554938916600160801b02600160801b600160c01b031993860293909316600160401b600160c01b031990941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a546001600160a01b031633146127ce57604051634755657960e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612826575f80fd5b505af1158015612838573d5f803e3d5ffd5b50505050611a036137e0565b607b54600160e01b900460ff161561286f576040516324eff8c360e01b815260040160405180910390fd5b606f5460ff161561289357604051630bc011ff60e21b815260040160405180910390fd5b5f61289c6116c8565b9050818111156128bf57604051634732fdb560e01b815260040160405180910390fd5b6113888311156128e2576040516328a69b1f60e21b815260040160405180910390fd5b6129176001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084613356565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612974573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061299891906141ca565b60738054919250600160c01b9091046001600160401b03169060186129bc8361417a565b91906101000a8154816001600160401b0302191690836001600160401b031602179055505084846040516129f19291906144ae565b604051908190038120612a0a91839042906020016141a7565b60408051808303601f190181529181528151602092830120607354600160c01b90046001600160401b03165f9081526071909352912055323303612a99576073546040805183815233602082015260609181018290525f91810191909152600160c01b9091046001600160401b0316905f805160206145aa8339815191529060800160405180910390a2612ae3565b607360189054906101000a90046001600160401b03166001600160401b03165f805160206145aa83398151915282338888604051612ada94939291906144bd565b60405180910390a25b5050505050565b607a546001600160a01b03163314612b1557604051634755657960e01b815260040160405180910390fd5b60748054600160401b600160e01b031916600160401b6001600160a01b038416021790556040517f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90610a11908390613c1a565b612b71613638565b6001600160a01b038116612bd65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161212b565b610fb581613697565b5f80612be9611fdc565b90506001600160401b03881615612c7e576079546001600160401b039081169089161115612c2a5760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b038089165f908152607860205260409020600281015481549094509091898116600160401b9092041614612c7857604051632bd2e3e760e01b815260040160405180910390fd5b50612ce9565b6001600160401b0387165f90815260756020526040902054915081612cb6576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316876001600160401b03161115612ce957604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316866001600160401b031611612d1b5760405163b9b18f5760e01b815260040160405180910390fd5b5f612d298888888689610a1c565b90505f5f8051602061458a833981519152600283604051612d4a91906144e7565b602060405180830381855afa158015612d65573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612d8891906141ca565b612d9291906144f8565b604080516020810182528281529051634890ed4560e11b81529192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91612dee9189919060040161450b565b602060405180830381865afa158015612e09573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e2d9190614545565b612e4a576040516309bde33960e01b815260040160405180910390fd5b612ea433612e58858b614238565b6001600160401b0316612e69611bb0565b612e73919061426b565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190613837565b50505050505050505050565b5f6001600160401b03881615612f42576079546001600160401b039081169089161115612ef05760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f908152607860205260409020600281015481549092888116600160401b9092041614612f3c57604051632bd2e3e760e01b815260040160405180910390fd5b50612fa9565b506001600160401b0385165f9081526075602052604090205480612f79576040516324cbdcc360e11b815260040160405180910390fd5b6074546001600160401b039081169087161115612fa957604051630f2b74f160e11b815260040160405180910390fd5b6079546001600160401b039081169088161180612fd85750876001600160401b0316876001600160401b031611155b80612ff957506079546001600160401b03600160401b909104811690881611155b156130175760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260786020526040902054600160401b900481169086161461305a576040516332a2a77f60e01b815260040160405180910390fd5b5f6130688787878588610a1c565b90505f5f8051602061458a83398151915260028360405161308991906144e7565b602060405180830381855afa1580156130a4573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906130c791906141ca565b6130d191906144f8565b604080516020810182528281529051634890ed4560e11b81529192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161312d9188919060040161450b565b602060405180830381865afa158015613148573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061316c9190614545565b613189576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260786020526040902060020154859003612ea45760405163a47276bd60e01b815260040160405180910390fd5b6079546001600160401b03600160401b90910481169082161115806131f757506079546001600160401b03908116908216115b156132155760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f818152607860209081526040808320805460748054600160401b928390049098166001600160401b03199098168817905560028201548786526075909452938290209290925560798054600160401b600160801b0319169390940292909217909255600182015490516333d6247d60e01b815260048101919091529091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b1580156132ea575f80fd5b505af11580156132fc573d5f803e3d5ffd5b50505050826001600160401b0316816001600160401b03167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161334991815260200190565b60405180910390a3505050565b6040516001600160a01b03808516602483015283166044820152606481018290526133c19085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261386c565b50505050565b6079546001600160401b03600160401b8204811691161115611a03576079545f9061340390600160401b90046001600160401b03166001614098565b905061340e81610e1b565b15610fb5576079545f9060029061342f9084906001600160401b0316614238565b6134399190614564565b6134439083614098565b905061344e81610e1b565b156134605761345c816131c4565b5050565b61345c826131c4565b5f613472611fdc565b9050815f806134818484614238565b606f546001600160401b0391821692505f916134a39161010090041642614258565b90505b846001600160401b0316846001600160401b031614613523576001600160401b038085165f9081526072602052604090206001810154909116821015613502576001810154600160401b90046001600160401b0316945061351d565b61350c8686614238565b6001600160401b0316935050613523565b506134a6565b5f61352e8484614258565b90508381101561358557808403600c8111613549578061354c565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a607054028161357b5761357b614282565b04607055506135f4565b838103600c81116135965780613599565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a764000002816135cf576135cf614282565b04905080607054670de0b6b3a764000002816135ed576135ed614282565b0460705550505b683635c9adc5dea00000607054111561361957683635c9adc5dea00000607055611d44565b633b9aca006070541015611d4457633b9aca0060705550505050505050565b33613641611ba1565b6001600160a01b031614611a035760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161212b565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613740575f80fd5b505af1158015613752573d5f803e3d5ffd5b50505050611a0361393d565b6001600160a01b03163b151590565b5f54610100900460ff166137d75760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161212b565b611a0333613697565b606f5460ff1661380357604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b6040516001600160a01b03831660248201526044810182905261386790849063a9059cbb60e01b9060640161338a565b505050565b5f6138c0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166139989092919063ffffffff16565b80519091501561386757808060200190518101906138de9190614545565b6138675760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161212b565b606f5460ff161561396157604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60606139a684845f856139ae565b949350505050565b606082471015613a0f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161212b565b5f80866001600160a01b03168587604051613a2a91906144e7565b5f6040518083038185875af1925050503d805f8114613a64576040519150601f19603f3d011682016040523d82523d5f602084013e613a69565b606091505b5091509150613a7a87838387613a85565b979650505050505050565b60608315613af15782515f03613aea57613a9e8561375e565b613aea5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161212b565b50816139a6565b6139a68383815115613b065781518083602001fd5b8060405162461bcd60e51b815260040161212b9190613b81565b6001600160401b0391909116815260200190565b5f5b83811015613b4e578181015183820152602001613b36565b50505f910152565b5f8151808452613b6d816020860160208601613b34565b601f01601f19169290920160200192915050565b602081525f613b936020830184613b56565b9392505050565b5f60208284031215613baa575f80fd5b813561ffff81168114613b93575f80fd5b80356001600160401b0381168114611fd7575f80fd5b5f805f805f60a08688031215613be5575f80fd5b613bee86613bbb565b9450613bfc60208701613bbb565b94979496505050506040830135926060810135926080909101359150565b6001600160a01b0391909116815260200190565b806103008101831015613c3f575f80fd5b92915050565b5f805f805f806103a08789031215613c5b575f80fd5b613c6487613bbb565b9550613c7260208801613bbb565b9450613c8060408801613bbb565b93506060870135925060808701359150613c9d8860a08901613c2e565b90509295509295509295565b5f805f805f805f6103c0888a031215613cc0575f80fd5b613cc988613bbb565b9650613cd760208901613bbb565b9550613ce560408901613bbb565b9450613cf360608901613bbb565b93506080880135925060a08801359150613d108960c08a01613c2e565b905092959891949750929550565b5f60208284031215613d2e575f80fd5b613b9382613bbb565b5f8083601f840112613d47575f80fd5b5081356001600160401b03811115613d5d575f80fd5b6020830191508360208260051b8501011115613d77575f80fd5b9250929050565b80356001600160a01b0381168114611fd7575f80fd5b5f805f60408486031215613da6575f80fd5b83356001600160401b03811115613dbb575f80fd5b613dc786828701613d37565b9094509250613dda905060208501613d7e565b90509250925092565b5f60208284031215613df3575f80fd5b613b9382613d7e565b5f60208284031215613e0c575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112613e36575f80fd5b81356001600160401b0380821115613e5057613e50613e13565b604051601f8301601f19908116603f01168101908282118183101715613e7857613e78613e13565b81604052838152866020858801011115613e90575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f60208284031215613ebf575f80fd5b81356001600160401b03811115613ed4575f80fd5b6139a684828501613e27565b5f8083601f840112613ef0575f80fd5b5081356001600160401b03811115613f06575f80fd5b602083019150836020828501011115613d77575f80fd5b5f805f805f80868803610120811215613f34575f80fd5b60a0811215613f41575f80fd5b5086955060a0860135945060c08601356001600160401b0380821115613f65575f80fd5b613f718a838b01613e27565b955060e0890135915080821115613f86575f80fd5b613f928a838b01613e27565b9450610100890135915080821115613fa8575f80fd5b50613fb589828a01613ee0565b979a9699509497509295939492505050565b5f8060208385031215613fd8575f80fd5b82356001600160401b03811115613fed575f80fd5b613ff985828601613d37565b90969095509350505050565b5f805f60408486031215614017575f80fd5b83356001600160401b0381111561402c575f80fd5b61403886828701613ee0565b909790965060209590950135949350505050565b600181811c9082168061406057607f821691505b60208210810361407e57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038181168382160190808211156140b8576140b8614084565b5092915050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e198336030181126140e7575f80fd5b9190910192915050565b5f60808236031215614101575f80fd5b604051608081016001600160401b03808211838310171561412457614124613e13565b816040528435915080821115614138575f80fd5b5061414536828601613e27565b8252506020830135602082015261415e60408401613bbb565b604082015261416f60608401613bbb565b606082015292915050565b5f6001600160401b038281166002600160401b0319810161419d5761419d614084565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b5f602082840312156141da575f80fd5b5051919050565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b5f6001820161423157614231614084565b5060010190565b6001600160401b038281168282160390808211156140b8576140b8614084565b81810381811115613c3f57613c3f614084565b8082028115828204841417613c3f57613c3f614084565b634e487b7160e01b5f52601260045260245ffd5b5f826142a4576142a4614282565b500490565b601f821115613867575f81815260208120601f850160051c810160208610156142cf5750805b601f850160051c820191505b818110156142ee578281556001016142db565b505050505050565b81516001600160401b0381111561430f5761430f613e13565b6143238161431d845461404c565b846142a9565b602080601f831160018114614356575f841561433f5750858301515b5f19600386901b1c1916600185901b1785556142ee565b5f85815260208120601f198616915b8281101561438457888601518255948401946001909101908401614365565b50858210156143a157878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160401b038581168252841660208201526060604082018190525f9061440590830184866143b1565b9695505050505050565b80820180821115613c3f57613c3f614084565b5f8235605e198336030181126140e7575f80fd5b5f60608236031215614446575f80fd5b604051606081016001600160401b03808211838310171561446957614469613e13565b81604052843591508082111561447d575f80fd5b5061448a36828601613e27565b825250602083013560208201526144a360408401613bbb565b604082015292915050565b818382375f9101908152919050565b8481526001600160a01b03841660208201526060604082018190525f9061440590830184866143b1565b5f82516140e7818460208701613b34565b5f8261450657614506614282565b500690565b6103208101610300808584378201835f5b600181101561453b57815183526020928301929091019060010161451c565b5050509392505050565b5f60208284031215614555575f80fd5b81518015158114613b93575f80fd5b5f6001600160401b038381168061457d5761457d614282565b9216919091049291505056fe30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001f94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931a2646970667358221220820f6390588faddb24f9b7ce2d20dfe664629e0fe77ff4263ebff40b7cb9125564736f6c63430008140033", + "bytecode": "0x6101406040523480156200001257600080fd5b50604051620048fa380380620048fa8339810160408190526200003591620000a5565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b0391821661010052166101205262000131565b6001600160a01b03811681146200008557600080fd5b50565b80516001600160401b0381168114620000a057600080fd5b919050565b60008060008060008060c08789031215620000bf57600080fd5b8651620000cc816200006f565b6020880151909650620000df816200006f565b6040880151909550620000f2816200006f565b606088015190945062000105816200006f565b9250620001156080880162000088565b91506200012560a0880162000088565b90509295509295509295565b60805160a05160c05160e05161010051610120516146fb620001ff6000396000818161055901528181610b2301526123e90152600081816106930152610af9015260008181610659015281816115b401528181612823015261376f0152600081816107cb01528181610c2101528181610d6f015281816112ee0152818161185101528181612974015261331801526000818161085401528181612e20015261316a0152600081816107420152818161158201528181611bee015281816129480152612ee701526146fb6000f3fe608060405234801561001057600080fd5b50600436106102da5760003560e01c8063841b24d711610184578063841b24d7146105e95780638c3d7301146106035780638da5cb5b1461060b57806399f5634e146106135780639aa972a31461061b5780639c9f3dfe1461062e578063a066215c14610641578063a3c573eb14610654578063ada8f9191461067b578063adc879e91461068e578063afd23cbe146106b5578063b4d63f58146106dd578063b6b0b0971461073d578063ba58ae3914610764578063c0ed84e014610777578063c754c7ed1461077f578063c89e42df14610799578063cfa8ed47146107ac578063d02103ca146107c6578063d2e129f9146107ed578063d8d1091b14610800578063d939b31514610813578063dbc169761461082d578063e7a7ed0214610835578063e8bf92ed1461084f578063eaeb077b14610876578063ed6b010414610889578063f14916d61461089d578063f2fde38b146108b0578063f851a440146108c3578063f8b823e4146108d657600080fd5b80630a0d9fbe146102df578063107bf28c1461030d57806315064c96146103225780631816b7e51461033f57806319d8ac6114610354578063220d789914610367578063267822471461037a578063298789831461039a5780632b0006fa146103b45780632c1f816a146103c7578063383b3be8146103da578063394218e9146103ed578063423fa85614610400578063456052671461041a578063458c0477146104345780634a1a89a7146104475780634a910e6a146104615780634e487706146104745780635392c5e014610487578063542028d5146104b55780635e9145c9146104bd5780635ec91958146104d057806360469169146104d8578063621dd411146104e05780636b8616ce146104f35780636ff512cc14610513578063715018a6146105265780637215541a1461052e5780637fcb365314610541578063831c7ead14610554578063837a47381461057b575b600080fd5b606f546102f79061010090046001600160401b031681565b6040516103049190613bb4565b60405180910390f35b6103156108df565b6040516103049190613c18565b606f5461032f9060ff1681565b6040519015158152602001610304565b61035261034d366004613c32565b61096d565b005b6073546102f7906001600160401b031681565b610315610375366004613c6d565b610a26565b607b5461038d906001600160a01b031681565b6040516103049190613cba565b60745461038d90600160401b90046001600160a01b031681565b6103526103c2366004613ce6565b610b81565b6103526103d5366004613d4e565b610cce565b61032f6103e8366004613dc8565b610e32565b6103526103fb366004613dc8565b610e79565b6073546102f790600160401b90046001600160401b031681565b6073546102f790600160801b90046001600160401b031681565b6079546102f7906001600160401b031681565b6079546102f790600160401b90046001600160401b031681565b61035261046f366004613dc8565b610f61565b610352610482366004613dc8565b610fd0565b6104a7610495366004613dc8565b60756020526000908152604090205481565b604051908152602001610304565b6103156110bc565b6103526104cb366004613e45565b6110c9565b610352611665565b6104a76116f2565b6103526104ee366004613ce6565b611708565b6104a7610501366004613dc8565b60716020526000908152604090205481565b610352610521366004613e98565b6119a8565b610352611a27565b61035261053c366004613dc8565b611a3b565b6074546102f7906001600160401b031681565b6102f77f000000000000000000000000000000000000000000000000000000000000000081565b6105be610589366004613eb3565b6078602052600090815260409020805460018201546002909201546001600160401b0380831693600160401b90930416919084565b604080516001600160401b039586168152949093166020850152918301526060820152608001610304565b6079546102f790600160c01b90046001600160401b031681565b610352611b56565b61038d611bda565b6104a7611be9565b610352610629366004613d4e565b611cf6565b61035261063c366004613dc8565b611d8d565b61035261064f366004613dc8565b611e79565b61038d7f000000000000000000000000000000000000000000000000000000000000000081565b610352610689366004613e98565b611f21565b6102f77f000000000000000000000000000000000000000000000000000000000000000081565b606f546106ca90600160481b900461ffff1681565b60405161ffff9091168152602001610304565b6107186106eb366004613dc8565b607260205260009081526040902080546001909101546001600160401b0380821691600160401b90041683565b604080519384526001600160401b039283166020850152911690820152606001610304565b61038d7f000000000000000000000000000000000000000000000000000000000000000081565b61032f610772366004613eb3565b611f97565b6102f761201e565b607b546102f790600160a01b90046001600160401b031681565b6103526107a7366004613f6e565b61206b565b606f5461038d90600160581b90046001600160a01b031681565b61038d7f000000000000000000000000000000000000000000000000000000000000000081565b6103526107fb366004613fe3565b6120d2565b61035261080e366004614095565b612470565b6079546102f790600160801b90046001600160401b031681565b6103526127f6565b6073546102f790600160c01b90046001600160401b031681565b61038d7f000000000000000000000000000000000000000000000000000000000000000081565b6103526108843660046140d6565b61289c565b607b5461032f90600160e01b900460ff1681565b6103526108ab366004613e98565b612b4a565b6103526108be366004613e98565b612bc9565b607a5461038d906001600160a01b031681565b6104a760705481565b607780546108ec90614121565b80601f016020809104026020016040519081016040528092919081815260200182805461091890614121565b80156109655780601f1061093a57610100808354040283529160200191610965565b820191906000526020600020905b81548152906001019060200180831161094857829003601f168201915b505050505081565b607a546001600160a01b0316331461099857604051634755657960e01b815260040160405180910390fd5b6103e88161ffff1610806109b157506103ff8161ffff16115b156109cf57604051630984a67960e31b815260040160405180910390fd5b606f805461ffff60481b1916600160481b61ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b6001600160401b038086166000818152607260205260408082205493881682529020546060929115801590610a59575081155b15610a775760405163340c614f60e11b815260040160405180910390fd5b80610a95576040516366385b5160e01b815260040160405180910390fd5b610a9e84611f97565b610abb576040516305dae44f60e21b815260040160405180910390fd5b604080516001600160601b03193360601b166020820152603481019690965260548601929092526001600160c01b031960c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b607454600160401b90046001600160a01b03163314610bb35760405163bbcbbc0560e01b815260040160405180910390fd5b610bc1868686868686612c3f565b607480546001600160401b0319166001600160401b0386811691821790925560009081526075602052604090208390556079541615610c0b57607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b158015610c6d57600080fd5b505af1158015610c81573d6000803e3d6000fd5b50506040518481523392506001600160401b03871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b607454600160401b90046001600160a01b03163314610d005760405163bbcbbc0560e01b815260040160405180910390fd5b610d0f87878787878787612f1a565b607480546001600160401b0319166001600160401b0386811691821790925560009081526075602052604090208390556079541615610d5957607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b158015610dbb57600080fd5b505af1158015610dcf573d6000803e3d6000fd5b5050607980546001600160c01b031661127560c71b179055505060405182815233906001600160401b038616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b6079546001600160401b0382811660009081526078602052604081205490924292610e6892600160801b90920481169116614171565b6001600160401b0316111592915050565b607a546001600160a01b03163314610ea457604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610ed157604051631d06e87960e01b815260040160405180910390fd5b606f5460ff16610f11576079546001600160401b03600160c01b909104811690821610610f115760405163401636df60e01b815260040160405180910390fd5b607980546001600160c01b0316600160c01b6001600160401b038416021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190610a1b908390613bb4565b607454600160401b90046001600160a01b03163314610fc457606f5460ff1615610f9e57604051630bc011ff60e21b815260040160405180910390fd5b610fa781610e32565b610fc457604051630674f25160e11b815260040160405180910390fd5b610fcd8161323a565b50565b607a546001600160a01b03163314610ffb57604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b03821611156110285760405163f5e37f2f60e01b815260040160405180910390fd5b606f5460ff1661106857607b546001600160401b03600160a01b9091048116908216106110685760405163f5e37f2f60e01b815260040160405180910390fd5b607b8054600160a01b600160e01b031916600160a01b6001600160401b038416021790556040517fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90610a1b908390613bb4565b607680546108ec90614121565b606f5460ff16156110ed57604051630bc011ff60e21b815260040160405180910390fd5b606f54600160581b90046001600160a01b0316331461111f576040516311e7be1560e01b815260040160405180910390fd5b8160008190036111425760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561116557604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160401b82048116600081815260726020526040812054838516949293600160801b909304909216919082905b8681101561144c5760008a8a838181106111ba576111ba614198565b90506020028101906111cc91906141ae565b6111d5906141ce565b805180516020909101206060820151919250906001600160401b0316156112c457856112008161425a565b9650506000818360200151846060015160405160200161122293929190614288565b60408051601f1981840301815291815281516020928301206001600160401b038a166000908152607190935291205490915081146112735760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b0380881660009081526071602052604080822091909155606085015190850151908216911610156112be57604051633fbd5c3960e11b815260040160405180910390fd5b506113a9565b602082015115801590611365575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303816000875af115801561133f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136391906142ab565b155b15611383576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c010156113a9576040516328a69b1f60e21b815260040160405180910390fd5b876001600160401b031682604001516001600160401b031610806113d957504282604001516001600160401b0316115b156113f7576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518d6040516020016114189594939291906142c4565b604051602081830303815290604052805190602001209450816040015197505050808061144490614303565b91505061119e565b506114578685614171565b6073549094506001600160401b03600160c01b909104811690841611156114915760405163c630a00d60e01b815260040160405180910390fd5b600061149d828561431c565b6114b0906001600160401b03168861433c565b60408051606081018252858152426001600160401b03908116602080840191825260738054600160401b9081900485168688019081528d861660008181526072909552979093209551865592516001909501805492519585166001600160801b03199384161795851684029590951790945583548c84169116179302929092179055909150828116908516146115655760738054600160801b600160c01b031916600160801b6001600160401b038716021790555b6115aa333083607054611578919061434f565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169291906133d2565b6115b2613443565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561160d57600080fd5b505af1158015611621573d6000803e3d6000fd5b50506040516001600160401b03881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a250505050505050505050565b607a546001600160a01b0316331461169057604051634755657960e01b815260040160405180910390fd5b607b54600160e01b900460ff166116ba5760405163f6ba91a160e01b815260040160405180910390fd5b607b805460ff60e01b191690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60006070546064611703919061434f565b905090565b606f5460ff161561172c57604051630bc011ff60e21b815260040160405180910390fd5b6079546001600160401b03858116600090815260726020526040902060010154429261176392600160c01b90910481169116614171565b6001600160401b0316111561178b57604051638a0704d360e01b815260040160405180910390fd5b6103e8611798868661431c565b6001600160401b031611156117c057604051635acfba9d60e11b815260040160405180910390fd5b6117ce868686868686612c3f565b6117d7846134e7565b607954600160801b90046001600160401b03166000036118ba57607480546001600160401b0319166001600160401b038681169182179092556000908152607560205260409020839055607954161561183b57607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b15801561189d57600080fd5b505af11580156118b1573d6000803e3d6000fd5b5050505061196b565b6118c2613443565b607980546001600160401b03169060006118db8361425a565b82546001600160401b039182166101009390930a928302928202191691909117909155604080516080810182524283168152878316602080830191825282840189815260608401898152607954871660009081526078909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b60405182815233906001600160401b038616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001610cbe565b607a546001600160a01b031633146119d357604051634755657960e01b815260040160405180910390fd5b606f8054600160581b600160f81b031916600160581b6001600160a01b038416021790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610a1b908390613cba565b611a2f6136bc565b611a39600061371b565b565b611a43611bda565b6001600160a01b0316336001600160a01b031614611b4e576000611a6561201e565b9050806001600160401b0316826001600160401b031611611a995760405163812a372d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b90910481169083161180611ad857506001600160401b0380831660009081526072602052604090206001015416155b15611af657604051632631700560e21b815260040160405180910390fd5b6001600160401b038083166000908152607260205260409020600101544291611b249162093a809116614171565b6001600160401b03161115611b4c5760405163692baaad60e11b815260040160405180910390fd5b505b610fcd61376d565b607b546001600160a01b03163314611b815760405163d1ec4b2360e01b815260040160405180910390fd5b607b54607a80546001600160a01b0319166001600160a01b0390921691821790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e91611bd091613cba565b60405180910390a1565b6033546001600160a01b031690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401611c389190613cba565b602060405180830381865afa158015611c55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7991906142ab565b90506000611c8561201e565b6073546001600160401b03600160401b8204811691611cb591600160801b8204811691600160c01b90041661431c565b611cbf9190614171565b611cc9919061431c565b6001600160401b0316905080600003611ce55760009250505090565b611cef818361437c565b9250505090565b606f5460ff1615611d1a57604051630bc011ff60e21b815260040160405180910390fd5b611d2987878787878787612f1a565b6001600160401b0384166000908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1611d8461376d565b50505050505050565b607a546001600160a01b03163314611db857604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115611de557604051630cc9650760e41b815260040160405180910390fd5b606f5460ff16611e25576079546001600160401b03600160801b909104811690821610611e255760405163048a05a960e41b815260040160405180910390fd5b60798054600160801b600160c01b031916600160801b6001600160401b038416021790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590610a1b908390613bb4565b607a546001600160a01b03163314611ea457604051634755657960e01b815260040160405180910390fd5b62015180816001600160401b03161115611ed157604051631c0cfbfd60e31b815260040160405180910390fd5b606f8054610100600160481b0319166101006001600160401b038416021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890610a1b908390613bb4565b607a546001600160a01b03163314611f4c57604051634755657960e01b815260040160405180910390fd5b607b80546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610a1b908390613cba565b600067ffffffff000000016001600160401b038316108015611fcd575067ffffffff00000001604083901c6001600160401b0316105b8015611fed575067ffffffff00000001608083901c6001600160401b0316105b8015612004575067ffffffff0000000160c083901c105b1561201157506001919050565b506000919050565b919050565b6079546000906001600160401b03161561205b57506079546001600160401b03908116600090815260786020526040902054600160401b90041690565b506074546001600160401b031690565b607a546001600160a01b0316331461209657604051634755657960e01b815260040160405180910390fd5b60766120a282826143de565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610a1b9190613c18565b600054610100900460ff16158080156120f25750600054600160ff909116105b806121135750612101306137e8565b158015612113575060005460ff166001145b61217b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801561219e576000805461ff0019166101001790555b6121ab6020880188613e98565b607a80546001600160a01b0319166001600160a01b03929092169190911790556121db6040880160208901613e98565b606f80546001600160a01b0392909216600160581b02600160581b600160f81b03199092169190911790556122166080880160608901613e98565b607480546001600160a01b0392909216600160401b02600160401b600160e01b03199092169190911790556000805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad869055607661227a86826143de565b50607761228785826143de565b5062093a8061229c6060890160408a01613dc8565b6001600160401b031611156122c457604051630cc9650760e41b815260040160405180910390fd5b6122d46060880160408901613dc8565b607980546001600160401b0392909216600160801b02600160801b600160c01b031990921691909117905562093a8061231360a0890160808a01613dc8565b6001600160401b0316111561233b57604051631d06e87960e01b815260040160405180910390fd5b61234b60a0880160808901613dc8565b607980546001600160c01b0316600160c01b6001600160401b03939093169290920291909117905567016345785d8a0000607055606f8054610100600160581b031916620708006101f560491b01179055607b8054600160a01b600160e81b031916670200000000000d2f60a71b1790556123c46137f7565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd660007f0000000000000000000000000000000000000000000000000000000000000000858560405161241a94939291906144c6565b60405180910390a18015611d84576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b54600160e01b900460ff161561249b576040516324eff8c360e01b815260040160405180910390fd5b606f5460ff16156124bf57604051630bc011ff60e21b815260040160405180910390fd5b8060008190036124e25760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561250557604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160c01b820481169161252d918491600160801b9004166144fd565b111561254c5760405163c630a00d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b820481166000818152607260205260408120549193600160801b9004909216915b8481101561270057600087878381811061259957612599614198565b90506020028101906125ab9190614510565b6125b490614526565b9050836125c08161425a565b825180516020918201208185015160408087015190519499509194506000936125ec9386939101614288565b60408051601f1981840301815291815281516020928301206001600160401b03891660009081526071909352912054909150811461263d5760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b03861660009081526071602052604081205561266160018961433c565b84036126b55742607b60149054906101000a90046001600160401b0316846040015161268d9190614171565b6001600160401b031611156126b55760405163c44a082160e01b815260040160405180910390fd5b8482846020015142336040516020016126d29594939291906142c4565b60405160208183030381529060405280519060200120945050505080806126f890614303565b91505061257d565b5061270b8484614171565b607380546001600160401b034281166001600160401b03199092168217808455604080516060810182528781526020808201958652600160401b9384900485168284019081528589166000818152607290935284832093518455965160019390930180549151871686026001600160801b031990921693871693909317179091558554938916600160801b02600160801b600160c01b031993860293909316600160401b600160c01b031990941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a546001600160a01b0316331461282157604051634755657960e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561287c57600080fd5b505af1158015612890573d6000803e3d6000fd5b50505050611a3961386b565b607b54600160e01b900460ff16156128c7576040516324eff8c360e01b815260040160405180910390fd5b606f5460ff16156128eb57604051630bc011ff60e21b815260040160405180910390fd5b60006128f56116f2565b90508181111561291857604051634732fdb560e01b815260040160405180910390fd5b61138883111561293b576040516328a69b1f60e21b815260040160405180910390fd5b6129706001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163330846133d2565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129f491906142ab565b60738054919250600160c01b9091046001600160401b0316906018612a188361425a565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508484604051612a4d9291906145a1565b604051908190038120612a669183904290602001614288565b60408051808303601f190181529181528151602092830120607354600160c01b90046001600160401b031660009081526071909352912055323303612af857607354604080518381523360208201526060918101829052600091810191909152600160c01b9091046001600160401b0316906000805160206146a68339815191529060800160405180910390a2612b43565b607360189054906101000a90046001600160401b03166001600160401b03166000805160206146a683398151915282338888604051612b3a94939291906145b1565b60405180910390a25b5050505050565b607a546001600160a01b03163314612b7557604051634755657960e01b815260040160405180910390fd5b60748054600160401b600160e01b031916600160401b6001600160a01b038416021790556040517f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90610a1b908390613cba565b612bd16136bc565b6001600160a01b038116612c365760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401612172565b610fcd8161371b565b600080612c4a61201e565b90506001600160401b03881615612ce0576079546001600160401b039081169089161115612c8b5760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b038089166000908152607860205260409020600281015481549094509091898116600160401b9092041614612cda57604051632bd2e3e760e01b815260040160405180910390fd5b50612d4c565b6001600160401b038716600090815260756020526040902054915081612d19576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316876001600160401b03161115612d4c57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316866001600160401b031611612d7e5760405163b9b18f5760e01b815260040160405180910390fd5b6000612d8d8888888689610a26565b90506000600080516020614686833981519152600283604051612db091906145dc565b602060405180830381855afa158015612dcd573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190612df091906142ab565b612dfa91906145ee565b604080516020810182528281529051634890ed4560e11b81529192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91612e5691899190600401614602565b602060405180830381865afa158015612e73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e97919061463d565b612eb4576040516309bde33960e01b815260040160405180910390fd5b612f0e33612ec2858b61431c565b6001600160401b0316612ed3611be9565b612edd919061434f565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906138c3565b50505050505050505050565b60006001600160401b03881615612fae576079546001600160401b039081169089161115612f5b5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088166000908152607860205260409020600281015481549092888116600160401b9092041614612fa857604051632bd2e3e760e01b815260040160405180910390fd5b50613016565b506001600160401b03851660009081526075602052604090205480612fe6576040516324cbdcc360e11b815260040160405180910390fd5b6074546001600160401b03908116908716111561301657604051630f2b74f160e11b815260040160405180910390fd5b6079546001600160401b0390811690881611806130455750876001600160401b0316876001600160401b031611155b8061306657506079546001600160401b03600160401b909104811690881611155b156130845760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260786020526040902054600160401b90048116908616146130c8576040516332a2a77f60e01b815260040160405180910390fd5b60006130d78787878588610a26565b905060006000805160206146868339815191526002836040516130fa91906145dc565b602060405180830381855afa158015613117573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061313a91906142ab565b61314491906145ee565b604080516020810182528281529051634890ed4560e11b81529192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916131a091889190600401614602565b602060405180830381865afa1580156131bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131e1919061463d565b6131fe576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260786020526040902060020154859003612f0e5760405163a47276bd60e01b815260040160405180910390fd5b6079546001600160401b03600160401b909104811690821611158061326d57506079546001600160401b03908116908216115b1561328b5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181166000818152607860209081526040808320805460748054600160401b928390049098166001600160401b03199098168817905560028201548786526075909452938290209290925560798054600160401b600160801b0319169390940292909217909255600182015490516333d6247d60e01b815260048101919091529091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b15801561336457600080fd5b505af1158015613378573d6000803e3d6000fd5b50505050826001600160401b0316816001600160401b03167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e84600201546040516133c591815260200190565b60405180910390a3505050565b6040516001600160a01b038085166024830152831660448201526064810182905261343d9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526138f8565b50505050565b6079546001600160401b03600160401b8204811691161115611a395760795460009061348090600160401b90046001600160401b03166001614171565b905061348b81610e32565b15610fcd576079546000906002906134ad9084906001600160401b031661431c565b6134b7919061465f565b6134c19083614171565b90506134cc81610e32565b156134de576134da8161323a565b5050565b6134da8261323a565b60006134f161201e565b905081600080613501848461431c565b606f546001600160401b039182169250600091613524916101009004164261433c565b90505b846001600160401b0316846001600160401b0316146135a5576001600160401b0380851660009081526072602052604090206001810154909116821015613584576001810154600160401b90046001600160401b0316945061359f565b61358e868661431c565b6001600160401b03169350506135a5565b50613527565b60006135b1848461433c565b90508381101561360857808403600c81116135cc57806135cf565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a60705402816135fe576135fe614366565b0460705550613678565b838103600c8111613619578061361c565b600c5b90506000816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a7640000028161365357613653614366565b04905080607054670de0b6b3a7640000028161367157613671614366565b0460705550505b683635c9adc5dea00000607054111561369d57683635c9adc5dea00000607055611d84565b633b9aca006070541015611d8457633b9aca0060705550505050505050565b336136c5611bda565b6001600160a01b031614611a395760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612172565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156137c857600080fd5b505af11580156137dc573d6000803e3d6000fd5b50505050611a396139ca565b6001600160a01b03163b151590565b600054610100900460ff166138625760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401612172565b611a393361371b565b606f5460ff1661388e57604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6040516001600160a01b0383166024820152604481018290526138f390849063a9059cbb60e01b90606401613406565b505050565b600061394d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613a269092919063ffffffff16565b8051909150156138f3578080602001905181019061396b919061463d565b6138f35760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401612172565b606f5460ff16156139ee57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b6060613a358484600085613a3d565b949350505050565b606082471015613a9e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401612172565b600080866001600160a01b03168587604051613aba91906145dc565b60006040518083038185875af1925050503d8060008114613af7576040519150601f19603f3d011682016040523d82523d6000602084013e613afc565b606091505b5091509150613b0d87838387613b18565b979650505050505050565b60608315613b85578251600003613b7e57613b32856137e8565b613b7e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612172565b5081613a35565b613a358383815115613b9a5781518083602001fd5b8060405162461bcd60e51b81526004016121729190613c18565b6001600160401b0391909116815260200190565b60005b83811015613be3578181015183820152602001613bcb565b50506000910152565b60008151808452613c04816020860160208601613bc8565b601f01601f19169290920160200192915050565b602081526000613c2b6020830184613bec565b9392505050565b600060208284031215613c4457600080fd5b813561ffff81168114613c2b57600080fd5b80356001600160401b038116811461201957600080fd5b600080600080600060a08688031215613c8557600080fd5b613c8e86613c56565b9450613c9c60208701613c56565b94979496505050506040830135926060810135926080909101359150565b6001600160a01b0391909116815260200190565b806103008101831015613ce057600080fd5b92915050565b6000806000806000806103a08789031215613d0057600080fd5b613d0987613c56565b9550613d1760208801613c56565b9450613d2560408801613c56565b93506060870135925060808701359150613d428860a08901613cce565b90509295509295509295565b60008060008060008060006103c0888a031215613d6a57600080fd5b613d7388613c56565b9650613d8160208901613c56565b9550613d8f60408901613c56565b9450613d9d60608901613c56565b93506080880135925060a08801359150613dba8960c08a01613cce565b905092959891949750929550565b600060208284031215613dda57600080fd5b613c2b82613c56565b60008083601f840112613df557600080fd5b5081356001600160401b03811115613e0c57600080fd5b6020830191508360208260051b8501011115613e2757600080fd5b9250929050565b80356001600160a01b038116811461201957600080fd5b600080600060408486031215613e5a57600080fd5b83356001600160401b03811115613e7057600080fd5b613e7c86828701613de3565b9094509250613e8f905060208501613e2e565b90509250925092565b600060208284031215613eaa57600080fd5b613c2b82613e2e565b600060208284031215613ec557600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112613ef357600080fd5b81356001600160401b0380821115613f0d57613f0d613ecc565b604051601f8301601f19908116603f01168101908282118183101715613f3557613f35613ecc565b81604052838152866020858801011115613f4e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215613f8057600080fd5b81356001600160401b03811115613f9657600080fd5b613a3584828501613ee2565b60008083601f840112613fb457600080fd5b5081356001600160401b03811115613fcb57600080fd5b602083019150836020828501011115613e2757600080fd5b600080600080600080868803610120811215613ffe57600080fd5b60a081121561400c57600080fd5b5086955060a0860135945060c08601356001600160401b038082111561403157600080fd5b61403d8a838b01613ee2565b955060e089013591508082111561405357600080fd5b61405f8a838b01613ee2565b945061010089013591508082111561407657600080fd5b5061408389828a01613fa2565b979a9699509497509295939492505050565b600080602083850312156140a857600080fd5b82356001600160401b038111156140be57600080fd5b6140ca85828601613de3565b90969095509350505050565b6000806000604084860312156140eb57600080fd5b83356001600160401b0381111561410157600080fd5b61410d86828701613fa2565b909790965060209590950135949350505050565b600181811c9082168061413557607f821691505b60208210810361415557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b038181168382160190808211156141915761419161415b565b5092915050565b634e487b7160e01b600052603260045260246000fd5b60008235607e198336030181126141c457600080fd5b9190910192915050565b6000608082360312156141e057600080fd5b604051608081016001600160401b03808211838310171561420357614203613ecc565b81604052843591508082111561421857600080fd5b5061422536828601613ee2565b8252506020830135602082015261423e60408401613c56565b604082015261424f60608401613c56565b606082015292915050565b60006001600160401b038281166002600160401b0319810161427e5761427e61415b565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b6000602082840312156142bd57600080fd5b5051919050565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b6000600182016143155761431561415b565b5060010190565b6001600160401b038281168282160390808211156141915761419161415b565b81810381811115613ce057613ce061415b565b8082028115828204841417613ce057613ce061415b565b634e487b7160e01b600052601260045260246000fd5b60008261438b5761438b614366565b500490565b601f8211156138f357600081815260208120601f850160051c810160208610156143b75750805b601f850160051c820191505b818110156143d6578281556001016143c3565b505050505050565b81516001600160401b038111156143f7576143f7613ecc565b61440b816144058454614121565b84614390565b602080601f83116001811461444057600084156144285750858301515b600019600386901b1c1916600185901b1785556143d6565b600085815260208120601f198616915b8281101561446f57888601518255948401946001909101908401614450565b508582101561448d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160401b038581168252841660208201526060604082018190526000906144f3908301848661449d565b9695505050505050565b80820180821115613ce057613ce061415b565b60008235605e198336030181126141c457600080fd5b60006060823603121561453857600080fd5b604051606081016001600160401b03808211838310171561455b5761455b613ecc565b81604052843591508082111561457057600080fd5b5061457d36828601613ee2565b8252506020830135602082015261459660408401613c56565b604082015292915050565b8183823760009101908152919050565b8481526001600160a01b03841660208201526060604082018190526000906144f3908301848661449d565b600082516141c4818460208701613bc8565b6000826145fd576145fd614366565b500690565b61032081016103008085843782018360005b6001811015614633578151835260209283019290910190600101614614565b5050509392505050565b60006020828403121561464f57600080fd5b81518015158114613c2b57600080fd5b60006001600160401b038381168061467957614679614366565b9216919091049291505056fe30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001f94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931a26469706673582212203dd63ac4455709626e53911f693a236c7b43de99bda32c96cb6d6788e4fb0fcd64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102da5760003560e01c8063841b24d711610184578063841b24d7146105e95780638c3d7301146106035780638da5cb5b1461060b57806399f5634e146106135780639aa972a31461061b5780639c9f3dfe1461062e578063a066215c14610641578063a3c573eb14610654578063ada8f9191461067b578063adc879e91461068e578063afd23cbe146106b5578063b4d63f58146106dd578063b6b0b0971461073d578063ba58ae3914610764578063c0ed84e014610777578063c754c7ed1461077f578063c89e42df14610799578063cfa8ed47146107ac578063d02103ca146107c6578063d2e129f9146107ed578063d8d1091b14610800578063d939b31514610813578063dbc169761461082d578063e7a7ed0214610835578063e8bf92ed1461084f578063eaeb077b14610876578063ed6b010414610889578063f14916d61461089d578063f2fde38b146108b0578063f851a440146108c3578063f8b823e4146108d657600080fd5b80630a0d9fbe146102df578063107bf28c1461030d57806315064c96146103225780631816b7e51461033f57806319d8ac6114610354578063220d789914610367578063267822471461037a578063298789831461039a5780632b0006fa146103b45780632c1f816a146103c7578063383b3be8146103da578063394218e9146103ed578063423fa85614610400578063456052671461041a578063458c0477146104345780634a1a89a7146104475780634a910e6a146104615780634e487706146104745780635392c5e014610487578063542028d5146104b55780635e9145c9146104bd5780635ec91958146104d057806360469169146104d8578063621dd411146104e05780636b8616ce146104f35780636ff512cc14610513578063715018a6146105265780637215541a1461052e5780637fcb365314610541578063831c7ead14610554578063837a47381461057b575b600080fd5b606f546102f79061010090046001600160401b031681565b6040516103049190613bb4565b60405180910390f35b6103156108df565b6040516103049190613c18565b606f5461032f9060ff1681565b6040519015158152602001610304565b61035261034d366004613c32565b61096d565b005b6073546102f7906001600160401b031681565b610315610375366004613c6d565b610a26565b607b5461038d906001600160a01b031681565b6040516103049190613cba565b60745461038d90600160401b90046001600160a01b031681565b6103526103c2366004613ce6565b610b81565b6103526103d5366004613d4e565b610cce565b61032f6103e8366004613dc8565b610e32565b6103526103fb366004613dc8565b610e79565b6073546102f790600160401b90046001600160401b031681565b6073546102f790600160801b90046001600160401b031681565b6079546102f7906001600160401b031681565b6079546102f790600160401b90046001600160401b031681565b61035261046f366004613dc8565b610f61565b610352610482366004613dc8565b610fd0565b6104a7610495366004613dc8565b60756020526000908152604090205481565b604051908152602001610304565b6103156110bc565b6103526104cb366004613e45565b6110c9565b610352611665565b6104a76116f2565b6103526104ee366004613ce6565b611708565b6104a7610501366004613dc8565b60716020526000908152604090205481565b610352610521366004613e98565b6119a8565b610352611a27565b61035261053c366004613dc8565b611a3b565b6074546102f7906001600160401b031681565b6102f77f000000000000000000000000000000000000000000000000000000000000000081565b6105be610589366004613eb3565b6078602052600090815260409020805460018201546002909201546001600160401b0380831693600160401b90930416919084565b604080516001600160401b039586168152949093166020850152918301526060820152608001610304565b6079546102f790600160c01b90046001600160401b031681565b610352611b56565b61038d611bda565b6104a7611be9565b610352610629366004613d4e565b611cf6565b61035261063c366004613dc8565b611d8d565b61035261064f366004613dc8565b611e79565b61038d7f000000000000000000000000000000000000000000000000000000000000000081565b610352610689366004613e98565b611f21565b6102f77f000000000000000000000000000000000000000000000000000000000000000081565b606f546106ca90600160481b900461ffff1681565b60405161ffff9091168152602001610304565b6107186106eb366004613dc8565b607260205260009081526040902080546001909101546001600160401b0380821691600160401b90041683565b604080519384526001600160401b039283166020850152911690820152606001610304565b61038d7f000000000000000000000000000000000000000000000000000000000000000081565b61032f610772366004613eb3565b611f97565b6102f761201e565b607b546102f790600160a01b90046001600160401b031681565b6103526107a7366004613f6e565b61206b565b606f5461038d90600160581b90046001600160a01b031681565b61038d7f000000000000000000000000000000000000000000000000000000000000000081565b6103526107fb366004613fe3565b6120d2565b61035261080e366004614095565b612470565b6079546102f790600160801b90046001600160401b031681565b6103526127f6565b6073546102f790600160c01b90046001600160401b031681565b61038d7f000000000000000000000000000000000000000000000000000000000000000081565b6103526108843660046140d6565b61289c565b607b5461032f90600160e01b900460ff1681565b6103526108ab366004613e98565b612b4a565b6103526108be366004613e98565b612bc9565b607a5461038d906001600160a01b031681565b6104a760705481565b607780546108ec90614121565b80601f016020809104026020016040519081016040528092919081815260200182805461091890614121565b80156109655780601f1061093a57610100808354040283529160200191610965565b820191906000526020600020905b81548152906001019060200180831161094857829003601f168201915b505050505081565b607a546001600160a01b0316331461099857604051634755657960e01b815260040160405180910390fd5b6103e88161ffff1610806109b157506103ff8161ffff16115b156109cf57604051630984a67960e31b815260040160405180910390fd5b606f805461ffff60481b1916600160481b61ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b6001600160401b038086166000818152607260205260408082205493881682529020546060929115801590610a59575081155b15610a775760405163340c614f60e11b815260040160405180910390fd5b80610a95576040516366385b5160e01b815260040160405180910390fd5b610a9e84611f97565b610abb576040516305dae44f60e21b815260040160405180910390fd5b604080516001600160601b03193360601b166020820152603481019690965260548601929092526001600160c01b031960c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b607454600160401b90046001600160a01b03163314610bb35760405163bbcbbc0560e01b815260040160405180910390fd5b610bc1868686868686612c3f565b607480546001600160401b0319166001600160401b0386811691821790925560009081526075602052604090208390556079541615610c0b57607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b158015610c6d57600080fd5b505af1158015610c81573d6000803e3d6000fd5b50506040518481523392506001600160401b03871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b607454600160401b90046001600160a01b03163314610d005760405163bbcbbc0560e01b815260040160405180910390fd5b610d0f87878787878787612f1a565b607480546001600160401b0319166001600160401b0386811691821790925560009081526075602052604090208390556079541615610d5957607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b158015610dbb57600080fd5b505af1158015610dcf573d6000803e3d6000fd5b5050607980546001600160c01b031661127560c71b179055505060405182815233906001600160401b038616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b6079546001600160401b0382811660009081526078602052604081205490924292610e6892600160801b90920481169116614171565b6001600160401b0316111592915050565b607a546001600160a01b03163314610ea457604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610ed157604051631d06e87960e01b815260040160405180910390fd5b606f5460ff16610f11576079546001600160401b03600160c01b909104811690821610610f115760405163401636df60e01b815260040160405180910390fd5b607980546001600160c01b0316600160c01b6001600160401b038416021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190610a1b908390613bb4565b607454600160401b90046001600160a01b03163314610fc457606f5460ff1615610f9e57604051630bc011ff60e21b815260040160405180910390fd5b610fa781610e32565b610fc457604051630674f25160e11b815260040160405180910390fd5b610fcd8161323a565b50565b607a546001600160a01b03163314610ffb57604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b03821611156110285760405163f5e37f2f60e01b815260040160405180910390fd5b606f5460ff1661106857607b546001600160401b03600160a01b9091048116908216106110685760405163f5e37f2f60e01b815260040160405180910390fd5b607b8054600160a01b600160e01b031916600160a01b6001600160401b038416021790556040517fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90610a1b908390613bb4565b607680546108ec90614121565b606f5460ff16156110ed57604051630bc011ff60e21b815260040160405180910390fd5b606f54600160581b90046001600160a01b0316331461111f576040516311e7be1560e01b815260040160405180910390fd5b8160008190036111425760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561116557604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160401b82048116600081815260726020526040812054838516949293600160801b909304909216919082905b8681101561144c5760008a8a838181106111ba576111ba614198565b90506020028101906111cc91906141ae565b6111d5906141ce565b805180516020909101206060820151919250906001600160401b0316156112c457856112008161425a565b9650506000818360200151846060015160405160200161122293929190614288565b60408051601f1981840301815291815281516020928301206001600160401b038a166000908152607190935291205490915081146112735760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b0380881660009081526071602052604080822091909155606085015190850151908216911610156112be57604051633fbd5c3960e11b815260040160405180910390fd5b506113a9565b602082015115801590611365575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303816000875af115801561133f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136391906142ab565b155b15611383576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c010156113a9576040516328a69b1f60e21b815260040160405180910390fd5b876001600160401b031682604001516001600160401b031610806113d957504282604001516001600160401b0316115b156113f7576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518d6040516020016114189594939291906142c4565b604051602081830303815290604052805190602001209450816040015197505050808061144490614303565b91505061119e565b506114578685614171565b6073549094506001600160401b03600160c01b909104811690841611156114915760405163c630a00d60e01b815260040160405180910390fd5b600061149d828561431c565b6114b0906001600160401b03168861433c565b60408051606081018252858152426001600160401b03908116602080840191825260738054600160401b9081900485168688019081528d861660008181526072909552979093209551865592516001909501805492519585166001600160801b03199384161795851684029590951790945583548c84169116179302929092179055909150828116908516146115655760738054600160801b600160c01b031916600160801b6001600160401b038716021790555b6115aa333083607054611578919061434f565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169291906133d2565b6115b2613443565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561160d57600080fd5b505af1158015611621573d6000803e3d6000fd5b50506040516001600160401b03881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a250505050505050505050565b607a546001600160a01b0316331461169057604051634755657960e01b815260040160405180910390fd5b607b54600160e01b900460ff166116ba5760405163f6ba91a160e01b815260040160405180910390fd5b607b805460ff60e01b191690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60006070546064611703919061434f565b905090565b606f5460ff161561172c57604051630bc011ff60e21b815260040160405180910390fd5b6079546001600160401b03858116600090815260726020526040902060010154429261176392600160c01b90910481169116614171565b6001600160401b0316111561178b57604051638a0704d360e01b815260040160405180910390fd5b6103e8611798868661431c565b6001600160401b031611156117c057604051635acfba9d60e11b815260040160405180910390fd5b6117ce868686868686612c3f565b6117d7846134e7565b607954600160801b90046001600160401b03166000036118ba57607480546001600160401b0319166001600160401b038681169182179092556000908152607560205260409020839055607954161561183b57607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b15801561189d57600080fd5b505af11580156118b1573d6000803e3d6000fd5b5050505061196b565b6118c2613443565b607980546001600160401b03169060006118db8361425a565b82546001600160401b039182166101009390930a928302928202191691909117909155604080516080810182524283168152878316602080830191825282840189815260608401898152607954871660009081526078909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b60405182815233906001600160401b038616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001610cbe565b607a546001600160a01b031633146119d357604051634755657960e01b815260040160405180910390fd5b606f8054600160581b600160f81b031916600160581b6001600160a01b038416021790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610a1b908390613cba565b611a2f6136bc565b611a39600061371b565b565b611a43611bda565b6001600160a01b0316336001600160a01b031614611b4e576000611a6561201e565b9050806001600160401b0316826001600160401b031611611a995760405163812a372d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b90910481169083161180611ad857506001600160401b0380831660009081526072602052604090206001015416155b15611af657604051632631700560e21b815260040160405180910390fd5b6001600160401b038083166000908152607260205260409020600101544291611b249162093a809116614171565b6001600160401b03161115611b4c5760405163692baaad60e11b815260040160405180910390fd5b505b610fcd61376d565b607b546001600160a01b03163314611b815760405163d1ec4b2360e01b815260040160405180910390fd5b607b54607a80546001600160a01b0319166001600160a01b0390921691821790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e91611bd091613cba565b60405180910390a1565b6033546001600160a01b031690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401611c389190613cba565b602060405180830381865afa158015611c55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7991906142ab565b90506000611c8561201e565b6073546001600160401b03600160401b8204811691611cb591600160801b8204811691600160c01b90041661431c565b611cbf9190614171565b611cc9919061431c565b6001600160401b0316905080600003611ce55760009250505090565b611cef818361437c565b9250505090565b606f5460ff1615611d1a57604051630bc011ff60e21b815260040160405180910390fd5b611d2987878787878787612f1a565b6001600160401b0384166000908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1611d8461376d565b50505050505050565b607a546001600160a01b03163314611db857604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115611de557604051630cc9650760e41b815260040160405180910390fd5b606f5460ff16611e25576079546001600160401b03600160801b909104811690821610611e255760405163048a05a960e41b815260040160405180910390fd5b60798054600160801b600160c01b031916600160801b6001600160401b038416021790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590610a1b908390613bb4565b607a546001600160a01b03163314611ea457604051634755657960e01b815260040160405180910390fd5b62015180816001600160401b03161115611ed157604051631c0cfbfd60e31b815260040160405180910390fd5b606f8054610100600160481b0319166101006001600160401b038416021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890610a1b908390613bb4565b607a546001600160a01b03163314611f4c57604051634755657960e01b815260040160405180910390fd5b607b80546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610a1b908390613cba565b600067ffffffff000000016001600160401b038316108015611fcd575067ffffffff00000001604083901c6001600160401b0316105b8015611fed575067ffffffff00000001608083901c6001600160401b0316105b8015612004575067ffffffff0000000160c083901c105b1561201157506001919050565b506000919050565b919050565b6079546000906001600160401b03161561205b57506079546001600160401b03908116600090815260786020526040902054600160401b90041690565b506074546001600160401b031690565b607a546001600160a01b0316331461209657604051634755657960e01b815260040160405180910390fd5b60766120a282826143de565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610a1b9190613c18565b600054610100900460ff16158080156120f25750600054600160ff909116105b806121135750612101306137e8565b158015612113575060005460ff166001145b61217b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801561219e576000805461ff0019166101001790555b6121ab6020880188613e98565b607a80546001600160a01b0319166001600160a01b03929092169190911790556121db6040880160208901613e98565b606f80546001600160a01b0392909216600160581b02600160581b600160f81b03199092169190911790556122166080880160608901613e98565b607480546001600160a01b0392909216600160401b02600160401b600160e01b03199092169190911790556000805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad869055607661227a86826143de565b50607761228785826143de565b5062093a8061229c6060890160408a01613dc8565b6001600160401b031611156122c457604051630cc9650760e41b815260040160405180910390fd5b6122d46060880160408901613dc8565b607980546001600160401b0392909216600160801b02600160801b600160c01b031990921691909117905562093a8061231360a0890160808a01613dc8565b6001600160401b0316111561233b57604051631d06e87960e01b815260040160405180910390fd5b61234b60a0880160808901613dc8565b607980546001600160c01b0316600160c01b6001600160401b03939093169290920291909117905567016345785d8a0000607055606f8054610100600160581b031916620708006101f560491b01179055607b8054600160a01b600160e81b031916670200000000000d2f60a71b1790556123c46137f7565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd660007f0000000000000000000000000000000000000000000000000000000000000000858560405161241a94939291906144c6565b60405180910390a18015611d84576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b54600160e01b900460ff161561249b576040516324eff8c360e01b815260040160405180910390fd5b606f5460ff16156124bf57604051630bc011ff60e21b815260040160405180910390fd5b8060008190036124e25760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561250557604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160c01b820481169161252d918491600160801b9004166144fd565b111561254c5760405163c630a00d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b820481166000818152607260205260408120549193600160801b9004909216915b8481101561270057600087878381811061259957612599614198565b90506020028101906125ab9190614510565b6125b490614526565b9050836125c08161425a565b825180516020918201208185015160408087015190519499509194506000936125ec9386939101614288565b60408051601f1981840301815291815281516020928301206001600160401b03891660009081526071909352912054909150811461263d5760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b03861660009081526071602052604081205561266160018961433c565b84036126b55742607b60149054906101000a90046001600160401b0316846040015161268d9190614171565b6001600160401b031611156126b55760405163c44a082160e01b815260040160405180910390fd5b8482846020015142336040516020016126d29594939291906142c4565b60405160208183030381529060405280519060200120945050505080806126f890614303565b91505061257d565b5061270b8484614171565b607380546001600160401b034281166001600160401b03199092168217808455604080516060810182528781526020808201958652600160401b9384900485168284019081528589166000818152607290935284832093518455965160019390930180549151871686026001600160801b031990921693871693909317179091558554938916600160801b02600160801b600160c01b031993860293909316600160401b600160c01b031990941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a546001600160a01b0316331461282157604051634755657960e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561287c57600080fd5b505af1158015612890573d6000803e3d6000fd5b50505050611a3961386b565b607b54600160e01b900460ff16156128c7576040516324eff8c360e01b815260040160405180910390fd5b606f5460ff16156128eb57604051630bc011ff60e21b815260040160405180910390fd5b60006128f56116f2565b90508181111561291857604051634732fdb560e01b815260040160405180910390fd5b61138883111561293b576040516328a69b1f60e21b815260040160405180910390fd5b6129706001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163330846133d2565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129f491906142ab565b60738054919250600160c01b9091046001600160401b0316906018612a188361425a565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508484604051612a4d9291906145a1565b604051908190038120612a669183904290602001614288565b60408051808303601f190181529181528151602092830120607354600160c01b90046001600160401b031660009081526071909352912055323303612af857607354604080518381523360208201526060918101829052600091810191909152600160c01b9091046001600160401b0316906000805160206146a68339815191529060800160405180910390a2612b43565b607360189054906101000a90046001600160401b03166001600160401b03166000805160206146a683398151915282338888604051612b3a94939291906145b1565b60405180910390a25b5050505050565b607a546001600160a01b03163314612b7557604051634755657960e01b815260040160405180910390fd5b60748054600160401b600160e01b031916600160401b6001600160a01b038416021790556040517f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90610a1b908390613cba565b612bd16136bc565b6001600160a01b038116612c365760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401612172565b610fcd8161371b565b600080612c4a61201e565b90506001600160401b03881615612ce0576079546001600160401b039081169089161115612c8b5760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b038089166000908152607860205260409020600281015481549094509091898116600160401b9092041614612cda57604051632bd2e3e760e01b815260040160405180910390fd5b50612d4c565b6001600160401b038716600090815260756020526040902054915081612d19576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316876001600160401b03161115612d4c57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316866001600160401b031611612d7e5760405163b9b18f5760e01b815260040160405180910390fd5b6000612d8d8888888689610a26565b90506000600080516020614686833981519152600283604051612db091906145dc565b602060405180830381855afa158015612dcd573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190612df091906142ab565b612dfa91906145ee565b604080516020810182528281529051634890ed4560e11b81529192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91612e5691899190600401614602565b602060405180830381865afa158015612e73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e97919061463d565b612eb4576040516309bde33960e01b815260040160405180910390fd5b612f0e33612ec2858b61431c565b6001600160401b0316612ed3611be9565b612edd919061434f565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906138c3565b50505050505050505050565b60006001600160401b03881615612fae576079546001600160401b039081169089161115612f5b5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088166000908152607860205260409020600281015481549092888116600160401b9092041614612fa857604051632bd2e3e760e01b815260040160405180910390fd5b50613016565b506001600160401b03851660009081526075602052604090205480612fe6576040516324cbdcc360e11b815260040160405180910390fd5b6074546001600160401b03908116908716111561301657604051630f2b74f160e11b815260040160405180910390fd5b6079546001600160401b0390811690881611806130455750876001600160401b0316876001600160401b031611155b8061306657506079546001600160401b03600160401b909104811690881611155b156130845760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260786020526040902054600160401b90048116908616146130c8576040516332a2a77f60e01b815260040160405180910390fd5b60006130d78787878588610a26565b905060006000805160206146868339815191526002836040516130fa91906145dc565b602060405180830381855afa158015613117573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061313a91906142ab565b61314491906145ee565b604080516020810182528281529051634890ed4560e11b81529192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916131a091889190600401614602565b602060405180830381865afa1580156131bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131e1919061463d565b6131fe576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260786020526040902060020154859003612f0e5760405163a47276bd60e01b815260040160405180910390fd5b6079546001600160401b03600160401b909104811690821611158061326d57506079546001600160401b03908116908216115b1561328b5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181166000818152607860209081526040808320805460748054600160401b928390049098166001600160401b03199098168817905560028201548786526075909452938290209290925560798054600160401b600160801b0319169390940292909217909255600182015490516333d6247d60e01b815260048101919091529091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b15801561336457600080fd5b505af1158015613378573d6000803e3d6000fd5b50505050826001600160401b0316816001600160401b03167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e84600201546040516133c591815260200190565b60405180910390a3505050565b6040516001600160a01b038085166024830152831660448201526064810182905261343d9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526138f8565b50505050565b6079546001600160401b03600160401b8204811691161115611a395760795460009061348090600160401b90046001600160401b03166001614171565b905061348b81610e32565b15610fcd576079546000906002906134ad9084906001600160401b031661431c565b6134b7919061465f565b6134c19083614171565b90506134cc81610e32565b156134de576134da8161323a565b5050565b6134da8261323a565b60006134f161201e565b905081600080613501848461431c565b606f546001600160401b039182169250600091613524916101009004164261433c565b90505b846001600160401b0316846001600160401b0316146135a5576001600160401b0380851660009081526072602052604090206001810154909116821015613584576001810154600160401b90046001600160401b0316945061359f565b61358e868661431c565b6001600160401b03169350506135a5565b50613527565b60006135b1848461433c565b90508381101561360857808403600c81116135cc57806135cf565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a60705402816135fe576135fe614366565b0460705550613678565b838103600c8111613619578061361c565b600c5b90506000816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a7640000028161365357613653614366565b04905080607054670de0b6b3a7640000028161367157613671614366565b0460705550505b683635c9adc5dea00000607054111561369d57683635c9adc5dea00000607055611d84565b633b9aca006070541015611d8457633b9aca0060705550505050505050565b336136c5611bda565b6001600160a01b031614611a395760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612172565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156137c857600080fd5b505af11580156137dc573d6000803e3d6000fd5b50505050611a396139ca565b6001600160a01b03163b151590565b600054610100900460ff166138625760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401612172565b611a393361371b565b606f5460ff1661388e57604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6040516001600160a01b0383166024820152604481018290526138f390849063a9059cbb60e01b90606401613406565b505050565b600061394d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613a269092919063ffffffff16565b8051909150156138f3578080602001905181019061396b919061463d565b6138f35760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401612172565b606f5460ff16156139ee57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b6060613a358484600085613a3d565b949350505050565b606082471015613a9e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401612172565b600080866001600160a01b03168587604051613aba91906145dc565b60006040518083038185875af1925050503d8060008114613af7576040519150601f19603f3d011682016040523d82523d6000602084013e613afc565b606091505b5091509150613b0d87838387613b18565b979650505050505050565b60608315613b85578251600003613b7e57613b32856137e8565b613b7e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612172565b5081613a35565b613a358383815115613b9a5781518083602001fd5b8060405162461bcd60e51b81526004016121729190613c18565b6001600160401b0391909116815260200190565b60005b83811015613be3578181015183820152602001613bcb565b50506000910152565b60008151808452613c04816020860160208601613bc8565b601f01601f19169290920160200192915050565b602081526000613c2b6020830184613bec565b9392505050565b600060208284031215613c4457600080fd5b813561ffff81168114613c2b57600080fd5b80356001600160401b038116811461201957600080fd5b600080600080600060a08688031215613c8557600080fd5b613c8e86613c56565b9450613c9c60208701613c56565b94979496505050506040830135926060810135926080909101359150565b6001600160a01b0391909116815260200190565b806103008101831015613ce057600080fd5b92915050565b6000806000806000806103a08789031215613d0057600080fd5b613d0987613c56565b9550613d1760208801613c56565b9450613d2560408801613c56565b93506060870135925060808701359150613d428860a08901613cce565b90509295509295509295565b60008060008060008060006103c0888a031215613d6a57600080fd5b613d7388613c56565b9650613d8160208901613c56565b9550613d8f60408901613c56565b9450613d9d60608901613c56565b93506080880135925060a08801359150613dba8960c08a01613cce565b905092959891949750929550565b600060208284031215613dda57600080fd5b613c2b82613c56565b60008083601f840112613df557600080fd5b5081356001600160401b03811115613e0c57600080fd5b6020830191508360208260051b8501011115613e2757600080fd5b9250929050565b80356001600160a01b038116811461201957600080fd5b600080600060408486031215613e5a57600080fd5b83356001600160401b03811115613e7057600080fd5b613e7c86828701613de3565b9094509250613e8f905060208501613e2e565b90509250925092565b600060208284031215613eaa57600080fd5b613c2b82613e2e565b600060208284031215613ec557600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112613ef357600080fd5b81356001600160401b0380821115613f0d57613f0d613ecc565b604051601f8301601f19908116603f01168101908282118183101715613f3557613f35613ecc565b81604052838152866020858801011115613f4e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215613f8057600080fd5b81356001600160401b03811115613f9657600080fd5b613a3584828501613ee2565b60008083601f840112613fb457600080fd5b5081356001600160401b03811115613fcb57600080fd5b602083019150836020828501011115613e2757600080fd5b600080600080600080868803610120811215613ffe57600080fd5b60a081121561400c57600080fd5b5086955060a0860135945060c08601356001600160401b038082111561403157600080fd5b61403d8a838b01613ee2565b955060e089013591508082111561405357600080fd5b61405f8a838b01613ee2565b945061010089013591508082111561407657600080fd5b5061408389828a01613fa2565b979a9699509497509295939492505050565b600080602083850312156140a857600080fd5b82356001600160401b038111156140be57600080fd5b6140ca85828601613de3565b90969095509350505050565b6000806000604084860312156140eb57600080fd5b83356001600160401b0381111561410157600080fd5b61410d86828701613fa2565b909790965060209590950135949350505050565b600181811c9082168061413557607f821691505b60208210810361415557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b038181168382160190808211156141915761419161415b565b5092915050565b634e487b7160e01b600052603260045260246000fd5b60008235607e198336030181126141c457600080fd5b9190910192915050565b6000608082360312156141e057600080fd5b604051608081016001600160401b03808211838310171561420357614203613ecc565b81604052843591508082111561421857600080fd5b5061422536828601613ee2565b8252506020830135602082015261423e60408401613c56565b604082015261424f60608401613c56565b606082015292915050565b60006001600160401b038281166002600160401b0319810161427e5761427e61415b565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b6000602082840312156142bd57600080fd5b5051919050565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b6000600182016143155761431561415b565b5060010190565b6001600160401b038281168282160390808211156141915761419161415b565b81810381811115613ce057613ce061415b565b8082028115828204841417613ce057613ce061415b565b634e487b7160e01b600052601260045260246000fd5b60008261438b5761438b614366565b500490565b601f8211156138f357600081815260208120601f850160051c810160208610156143b75750805b601f850160051c820191505b818110156143d6578281556001016143c3565b505050505050565b81516001600160401b038111156143f7576143f7613ecc565b61440b816144058454614121565b84614390565b602080601f83116001811461444057600084156144285750858301515b600019600386901b1c1916600185901b1785556143d6565b600085815260208120601f198616915b8281101561446f57888601518255948401946001909101908401614450565b508582101561448d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160401b038581168252841660208201526060604082018190526000906144f3908301848661449d565b9695505050505050565b80820180821115613ce057613ce061415b565b60008235605e198336030181126141c457600080fd5b60006060823603121561453857600080fd5b604051606081016001600160401b03808211838310171561455b5761455b613ecc565b81604052843591508082111561457057600080fd5b5061457d36828601613ee2565b8252506020830135602082015261459660408401613c56565b604082015292915050565b8183823760009101908152919050565b8481526001600160a01b03841660208201526060604082018190526000906144f3908301848661449d565b600082516141c4818460208701613bc8565b6000826145fd576145fd614366565b500690565b61032081016103008085843782018360005b6001811015614633578151835260209283019290910190600101614614565b5050509392505050565b60006020828403121561464f57600080fd5b81518015158114613c2b57600080fd5b60006001600160401b038381168061467957614679614366565b9216919091049291505056fe30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001f94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931a26469706673582212203dd63ac4455709626e53911f693a236c7b43de99bda32c96cb6d6788e4fb0fcd64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMBridge.json b/compiled-contracts/paris/PolygonZkEVMBridge.json index 57fbf6ec3..b2013552c 100644 --- a/compiled-contracts/paris/PolygonZkEVMBridge.json +++ b/compiled-contracts/paris/PolygonZkEVMBridge.json @@ -776,8 +776,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561000f575f80fd5b506145ab8061001d5f395ff3fe60806040526004361062000127575f3560e01c806315064c96146200012b5780632072f6c5146200015b57806322e95f2c1462000174578063240ff37814620001a75780632cffd02e14620001be5780632d2c9d9414620001e25780632dfdf0b51462000206578063318aee3d146200022c57806334ac9cf214620002985780633ae0504714620002b95780633e19704314620002d0578063647c576c14620002f457806379e2cf97146200031857806381b1c174146200032f5780639e34070f1462000367578063aaa13cc214620003aa578063bab161bf14620003ce578063be5831c71462000407578063cd586579146200042c578063d02103ca1462000443578063dbc16976146200046b578063ee25560b1462000482578063fb57083414620004b1575b5f80fd5b34801562000137575f80fd5b50606854620001469060ff1681565b60405190151581526020015b60405180910390f35b34801562000167575f80fd5b5062000172620004d5565b005b34801562000180575f80fd5b50620001986200019236600462002332565b6200050d565b6040516200015291906200236c565b62000172620001b8366004620023d5565b6200055d565b348015620001ca575f80fd5b5062000172620001dc36600462002465565b62000672565b348015620001ee575f80fd5b50620001726200020036600462002465565b62000a45565b34801562000212575f80fd5b506200021d60535481565b60405190815260200162000152565b34801562000238575f80fd5b50620002736200024a36600462002542565b606b6020525f908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b0390911660208301520162000152565b348015620002a4575f80fd5b50606c5462000198906001600160a01b031681565b348015620002c5575f80fd5b506200021d62000b7e565b348015620002dc575f80fd5b506200021d620002ee36600462002576565b62000c65565b34801562000300575f80fd5b506200017262000312366004620025fb565b62000cf1565b34801562000324575f80fd5b506200017262000e6f565b3480156200033b575f80fd5b50620001986200034d36600462002648565b606a6020525f90815260409020546001600160a01b031681565b34801562000373575f80fd5b50620001466200038536600462002648565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b348015620003b6575f80fd5b5062000198620003c836600462002660565b62000e93565b348015620003da575f80fd5b50606854620003f190610100900463ffffffff1681565b60405163ffffffff909116815260200162000152565b34801562000413575f80fd5b50606854620003f190600160c81b900463ffffffff1681565b620001726200043d3660046200270c565b62000fa8565b3480156200044f575f80fd5b506068546200019890600160281b90046001600160a01b031681565b34801562000477575f80fd5b50620001726200132c565b3480156200048e575f80fd5b506200021d620004a036600462002648565b60696020525f908152604090205481565b348015620004bd575f80fd5b5062000146620004cf366004620027a7565b62001362565b606c546001600160a01b03163314620005015760405163e2e8106b60e01b815260040160405180910390fd5b6200050b6200143a565b565b5f606a5f848460405160200162000526929190620027f1565b60408051601f198184030181529181528151602092830120835290820192909252015f20546001600160a01b031690505b92915050565b60685460ff16156200058257604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161480620005a85750600263ffffffff861610155b15620005c7576040516302caf51760e11b815260040160405180910390fd5b5f80516020620045368339815191526001606860019054906101000a900463ffffffff163388883488886053546040516200060b9998979695949392919062002843565b60405180910390a16200065a620006546001606860019054906101000a900463ffffffff1633898934898960405162000646929190620028b1565b604051809103902062000c65565b62001496565b82156200066b576200066b62001591565b5050505050565b60685460ff16156200069757604051630bc011ff60e21b815260040160405180910390fd5b620006ad8b8b8b8b8b8b8b8b8b8b8b5f62001624565b6001600160a01b0386166200075257604080515f808252602082019092526001600160a01b038616908590604051620006e79190620028f8565b5f6040518083038185875af1925050503d805f811462000723576040519150601f19603f3d011682016040523d82523d5f602084013e62000728565b606091505b50509050806200074b57604051630ce8f45160e31b815260040160405180910390fd5b5062000a09565b60685463ffffffff6101009091048116908816036200078757620007816001600160a01b038716858562001787565b62000a09565b5f87876040516020016200079d929190620027f1565b60408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b031680620009a6575f8080620007e486880188620029c9565b9250925092505f85848484604051620007fd90620022f8565b6200080b9392919062002a66565b8190604051809103905ff590508015801562000829573d5f803e3d5ffd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f19906200085d908d908d9060040162002aa2565b5f604051808303815f87803b15801562000875575f80fd5b505af115801562000888573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b6040516200099495949392919062002abb565b60405180910390a15050505062000a06565b6040516340c10f1960e01b81526001600160a01b038216906340c10f1990620009d6908990899060040162002aa2565b5f604051808303815f87803b158015620009ee575f80fd5b505af115801562000a01573d5f803e3d5ffd5b505050505b50505b5f80516020620045568339815191528a8888878760405162000a3095949392919062002af5565b60405180910390a15050505050505050505050565b60685460ff161562000a6a57604051630bc011ff60e21b815260040160405180910390fd5b62000a818b8b8b8b8b8b8b8b8b8b8b600162001624565b5f846001600160a01b031684888a868660405160240162000aa6949392919062002b2c565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162000add9190620028f8565b5f6040518083038185875af1925050503d805f811462000b19576040519150601f19603f3d011682016040523d82523d5f602084013e62000b1e565b606091505b505090508062000b41576040516337e391c360e01b815260040160405180910390fd5b5f80516020620045568339815191528b8989888860405162000b6895949392919062002af5565b60405180910390a1505050505050505050505050565b6053545f90819081805b602081101562000c5c578083901c60011660010362000beb576033816020811062000bb75762000bb762002b68565b01548460405160200162000bcd92919062002b7c565b60405160208183030381529060405280519060200120935062000c19565b838260405160200162000c0092919062002b7c565b6040516020818303038152906040528051906020012093505b818260405160200162000c2e92919062002b7c565b604051602081830303815290604052805190602001209150808062000c539062002b9e565b91505062000b88565b50919392505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b5f54610100900460ff161580801562000d1057505f54600160ff909116105b8062000d34575062000d2230620017e1565b15801562000d3457505f5460ff166001145b62000d9d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801562000dbf575f805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff871602600160281b600160c81b03191617600160281b6001600160a01b038681169190910291909117909155606c80546001600160a01b03191691841691909117905562000e23620017f0565b801562000e69575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854600160c81b900463ffffffff1610156200050b576200050b62001591565b5f80888860405160200162000eaa929190620027f1565b6040516020818303038152906040528051906020012090505f60ff60f81b30836040518060200162000edc90620022f8565b601f1982820381018352601f90910116604081905262000f09908d908d908d908d908d9060200162002bb9565b60408051601f198184030181529082905262000f29929160200162002bf9565b6040516020818303038152906040528051906020012060405160200162000f8294939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b60685460ff161562000fcd57604051630bc011ff60e21b815260040160405180910390fd5b62000fd762001823565b60685463ffffffff88811661010090920416148062000ffd5750600263ffffffff881610155b156200101c576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b0388166200105a57883414620010515760405163b89240f560e01b815260040160405180910390fd5b5f9250620012b1565b34156200107a5760405163798ee6f160e01b815260040160405180910390fd5b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b900490921691810182905290156200113157604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac90620010ef9033908e9060040162002aa2565b5f604051808303815f87803b15801562001107575f80fd5b505af11580156200111a573d5f803e3d5ffd5b5050505080602001519450805f01519350620012af565b8515620011465762001146898b89896200187e565b6040516370a0823160e01b81525f906001600160a01b038b16906370a0823190620011769030906004016200236c565b602060405180830381865afa15801562001192573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620011b8919062002c2b565b9050620011d16001600160a01b038b1633308e62001bd5565b6040516370a0823160e01b81525f906001600160a01b038c16906370a0823190620012019030906004016200236c565b602060405180830381865afa1580156200121d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001243919062002c2b565b905062001251828262002c43565b6068548c9850610100900463ffffffff1696509350620012718762001c0f565b6200127c8c62001cd2565b620012878d62001d8c565b6040516020016200129b9392919062002a66565b604051602081830303815290604052945050505b505b5f80516020620045368339815191525f84868e8e8688605354604051620012e098979695949392919062002c59565b60405180910390a162001304620006545f85878f8f87898051906020012062000c65565b861562001315576200131562001591565b505050506200132360018055565b50505050505050565b606c546001600160a01b03163314620013585760405163e2e8106b60e01b815260040160405180910390fd5b6200050b62001e4f565b5f84815b60208110156200142c57600163ffffffff8616821c81169003620013d05785816020811062001399576200139962002b68565b602002013582604051602001620013b292919062002b7c565b60405160208183030381529060405280519060200120915062001417565b81868260208110620013e657620013e662002b68565b6020020135604051602001620013fe92919062002b7c565b6040516020818303038152906040528051906020012091505b80620014238162002b9e565b91505062001366565b50821490505b949350505050565b60685460ff16156200145f57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b806001620014a76020600262002dbe565b620014b3919062002c43565b60535410620014d5576040516377ae67b360e11b815260040160405180910390fd5b5f60535f8154620014e69062002b9e565b918290555090505f5b602081101562001581578082901c600116600103620015275782603382602081106200151f576200151f62002b68565b015550505050565b603381602081106200153d576200153d62002b68565b0154836040516020016200155392919062002b7c565b6040516020818303038152906040528051906020012092508080620015789062002b9e565b915050620014ef565b506200158c62002dcb565b505050565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d620015da62000b7e565b6040518263ffffffff1660e01b8152600401620015f991815260200190565b5f604051808303815f87803b15801562001611575f80fd5b505af115801562000e69573d5f803e3d5ffd5b620016358b63ffffffff1662001ea7565b6068545f90600160281b90046001600160a01b031663257b36326200165b8d8d62001ef2565b6040518263ffffffff1660e01b81526004016200167a91815260200190565b6020604051808303815f875af115801562001697573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620016bd919062002c2b565b9050805f03620016df57604051622f6fad60e01b815260040160405180910390fd5b60685463ffffffff888116610100909204161462001710576040516302caf51760e11b815260040160405180910390fd5b6068545f90610100900463ffffffff166200172d57508962001730565b508a5b6200175962001750848c8c8c8c8c8c8c60405162000646929190620028b1565b8f8f8462001362565b62001777576040516338105f3b60e21b815260040160405180910390fd5b5050505050505050505050505050565b6200158c8363a9059cbb60e01b8484604051602401620017a992919062002aa2565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262001f26565b6001600160a01b03163b151590565b5f54610100900460ff16620018195760405162461bcd60e51b815260040162000d949062002ddf565b6200050b62001ffe565b600260015403620018775760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000d94565b6002600155565b5f6200188e600482848662002e2a565b620018999162002e53565b9050632afa533160e01b6001600160e01b031982160162001a35575f808080808080620018ca896004818d62002e2a565b810190620018d9919062002e84565b9650965096509650965096509650336001600160a01b0316876001600160a01b0316146200191a5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0386163014620019445760405163750643af60e01b815260040160405180910390fd5b8a851462001965576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e1691620019e59190620028f8565b5f604051808303815f865af19150503d805f811462001a20576040519150601f19603f3d011682016040523d82523d5f602084013e62001a25565b606091505b505050505050505050506200066b565b6001600160e01b031981166323f2ebc360e21b1462001a6757604051637141605d60e11b815260040160405180910390fd5b5f8080808080808062001a7e8a6004818e62002e2a565b81019062001a8d919062002eda565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462001ad05760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038716301462001afa5760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169162001b839190620028f8565b5f604051808303815f865af19150503d805f811462001bbe576040519150601f19603f3d011682016040523d82523d5f602084013e62001bc3565b606091505b50505050505050505050505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905262000e699085906323b872dd60e01b90608401620017a9565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b17905290516060915f9182916001600160a01b0386169162001c579190620028f8565b5f60405180830381855afa9150503d805f811462001c91576040519150601f19603f3d011682016040523d82523d5f602084013e62001c96565b606091505b50915091508162001cc757604051806040016040528060078152602001664e4f5f4e414d4560c81b81525062001432565b620014328162002027565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b17905290516060915f9182916001600160a01b0386169162001d1a9190620028f8565b5f60405180830381855afa9150503d805f811462001d54576040519150601f19603f3d011682016040523d82523d5f602084013e62001d59565b606091505b50915091508162001cc757604051806040016040528060098152602001681393d7d4d6535093d360ba1b81525062001432565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f91829182916001600160a01b0386169162001dd39190620028f8565b5f60405180830381855afa9150503d805f811462001e0d576040519150601f19603f3d011682016040523d82523d5f602084013e62001e12565b606091505b509150915081801562001e26575080516020145b62001e3357601262001432565b8080602001905181019062001432919062002f61565b60018055565b60685460ff1662001e7357604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b918218928390559290919081831690036200066b57604051630c8d9eab60e31b815260040160405180910390fd5b5f828260405160200162001f0892919062002b7c565b60405160208183030381529060405280519060200120905092915050565b5f62001f7c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620021cb9092919063ffffffff16565b8051909150156200158c578080602001905181019062001f9d919062002f7f565b6200158c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000d94565b5f54610100900460ff1662001e495760405162461bcd60e51b815260040162000d949062002ddf565b6060604082511062002049578180602001905181019062000557919062002f9d565b815160200362002198575f5b60208110801562002088575082818151811062002076576200207662002b68565b01602001516001600160f81b03191615155b15620020a357806200209a8162002b9e565b91505062002055565b805f03620020db5750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b5f816001600160401b03811115620020f757620020f7620028c0565b6040519080825280601f01601f19166020018201604052801562002122576020820181803683370190505b5090505f5b82811015620021905784818151811062002145576200214562002b68565b602001015160f81c60f81b82828151811062002165576200216562002b68565b60200101906001600160f81b03191690815f1a90535080620021878162002b9e565b91505062002127565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b60606200143284845f85855f80866001600160a01b03168587604051620021f39190620028f8565b5f6040518083038185875af1925050503d805f81146200222f576040519150601f19603f3d011682016040523d82523d5f602084013e62002234565b606091505b5091509150620022478783838762002252565b979650505050505050565b60608315620022c55782515f03620022bd576200226f85620017e1565b620022bd5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000d94565b508162001432565b620014328383815115620022dc5781518083602001fd5b8060405162461bcd60e51b815260040162000d94919062003017565b61150a806200302c83390190565b803563ffffffff81168114620021c6575f80fd5b6001600160a01b03811681146200232f575f80fd5b50565b5f806040838503121562002344575f80fd5b6200234f8362002306565b9150602083013562002361816200231a565b809150509250929050565b6001600160a01b0391909116815260200190565b80151581146200232f575f80fd5b5f8083601f8401126200239f575f80fd5b5081356001600160401b03811115620023b6575f80fd5b602083019150836020828501011115620023ce575f80fd5b9250929050565b5f805f805f60808688031215620023ea575f80fd5b620023f58662002306565b9450602086013562002407816200231a565b93506040860135620024198162002380565b925060608601356001600160401b0381111562002434575f80fd5b62002442888289016200238e565b969995985093965092949392505050565b80610400810183101562000557575f80fd5b5f805f805f805f805f805f6105208c8e03121562002481575f80fd5b6200248d8d8d62002453565b9a506200249e6104008d0162002306565b99506104208c013598506104408c01359750620024bf6104608d0162002306565b96506104808c0135620024d2816200231a565b9550620024e36104a08d0162002306565b94506104c08c0135620024f6816200231a565b93506104e08c013592506105008c01356001600160401b038111156200251a575f80fd5b620025288e828f016200238e565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562002553575f80fd5b813562002560816200231a565b9392505050565b60ff811681146200232f575f80fd5b5f805f805f805f60e0888a0312156200258d575f80fd5b87356200259a8162002567565b9650620025aa6020890162002306565b95506040880135620025bc816200231a565b9450620025cc6060890162002306565b93506080880135620025de816200231a565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156200260e575f80fd5b620026198462002306565b925060208401356200262b816200231a565b915060408401356200263d816200231a565b809150509250925092565b5f6020828403121562002659575f80fd5b5035919050565b5f805f805f805f60a0888a03121562002677575f80fd5b620026828862002306565b9650602088013562002694816200231a565b955060408801356001600160401b0380821115620026b0575f80fd5b620026be8b838c016200238e565b909750955060608a0135915080821115620026d7575f80fd5b50620026e68a828b016200238e565b9094509250506080880135620026fc8162002567565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562002723575f80fd5b6200272e8862002306565b9650602088013562002740816200231a565b955060408801359450606088013562002759816200231a565b935060808801356200276b8162002380565b925060a08801356001600160401b0381111562002786575f80fd5b620027948a828b016200238e565b989b979a50959850939692959293505050565b5f805f806104608587031215620027bc575f80fd5b84359350620027cf866020870162002453565b9250620027e0610420860162002306565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c083018190525f916200289784830187896200281b565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015620028f0578181015183820152602001620028d6565b50505f910152565b5f82516200290b818460208701620028d4565b9190910192915050565b604051601f8201601f191681016001600160401b0381118282101715620029405762002940620028c0565b604052919050565b5f6001600160401b03821115620029635762002963620028c0565b50601f01601f191660200190565b5f82601f83011262002981575f80fd5b813562002998620029928262002948565b62002915565b818152846020838601011115620029ad575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f60608486031215620029dc575f80fd5b83356001600160401b0380821115620029f3575f80fd5b62002a018783880162002971565b9450602086013591508082111562002a17575f80fd5b5062002a268682870162002971565b92505060408401356200263d8162002567565b5f815180845262002a52816020860160208601620028d4565b601f01601f19169290920160200192915050565b606081525f62002a7a606083018662002a39565b828103602084015262002a8e818662002a39565b91505060ff83166040830152949350505050565b6001600160a01b03929092168252602082015260400190565b63ffffffff861681526001600160a01b038581166020830152841660408201526080606082018190525f906200224790830184866200281b565b63ffffffff95861681529390941660208401526001600160a01b039182166040840152166060820152608081019190915260a00190565b6001600160a01b038516815263ffffffff841660208201526060604082018190525f9062002b5e90830184866200281b565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b918252602082015260400190565b634e487b7160e01b5f52601160045260245ffd5b5f6001820162002bb25762002bb262002b8a565b5060010190565b606081525f62002bce6060830187896200281b565b828103602084015262002be38186886200281b565b91505060ff831660408301529695505050505050565b5f835162002c0c818460208801620028d4565b83519083019062002c22818360208801620028d4565b01949350505050565b5f6020828403121562002c3c575f80fd5b5051919050565b8181038181111562000557576200055762002b8a565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c083018190525f9162002cac8483018762002a39565b925080851660e085015250509998505050505050505050565b600181815b8085111562002d0557815f190482111562002ce95762002ce962002b8a565b8085161562002cf757918102915b93841c939080029062002cca565b509250929050565b5f8262002d1d5750600162000557565b8162002d2b57505f62000557565b816001811462002d44576002811462002d4f5762002d6f565b600191505062000557565b60ff84111562002d635762002d6362002b8a565b50506001821b62000557565b5060208310610133831016604e8410600b841016171562002d94575081810a62000557565b62002da0838362002cc5565b805f190482111562002db65762002db662002b8a565b029392505050565b5f62002560838362002d0d565b634e487b7160e01b5f52600160045260245ffd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f808585111562002e39575f80fd5b8386111562002e46575f80fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101562002e7c5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562002e9b575f80fd5b873562002ea8816200231a565b9650602088013562002eba816200231a565b955060408801359450606088013593506080880135620025de8162002567565b5f805f805f805f80610100898b03121562002ef3575f80fd5b883562002f00816200231a565b9750602089013562002f12816200231a565b96506040890135955060608901359450608089013562002f328162002380565b935060a089013562002f448162002567565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562002f72575f80fd5b8151620025608162002567565b5f6020828403121562002f90575f80fd5b8151620025608162002380565b5f6020828403121562002fae575f80fd5b81516001600160401b0381111562002fc4575f80fd5b8201601f8101841362002fd5575f80fd5b805162002fe6620029928262002948565b81815285602083850101111562002ffb575f80fd5b6200300e826020830160208601620028d4565b95945050505050565b602081525f62002560602083018462002a3956fe61010060405234801562000011575f80fd5b506040516200150a3803806200150a833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161106c6200049e5f395f61019e01525f818161025f0152818161047f01526104ed01525f61043101525f81816102c401526103fb015261106c5ff3fe608060405234801561000f575f80fd5b5060043610610105575f3560e01c806306fdde0314610109578063095ea7b31461012757806318160ddd1461014a57806320606b701461015c57806323b872dd1461017057806330adf81f14610183578063313ce567146101975780633644e515146101c857806339509351146101d057806340c10f19146101e357806370a08231146101f85780637ecebe001461022057806395d89b411461023f5780639dc29fac14610247578063a3c573eb1461025a578063a457c2d714610299578063a9059cbb146102ac578063cd0d0096146102bf578063d505accf146102e6578063dd62ed3e146102f9578063ffa1ad741461030c575b5f80fd5b61011161032c565b60405161011e9190610d8a565b60405180910390f35b61013a610135366004610df0565b6103bc565b604051901515815260200161011e565b6002545b60405190815260200161011e565b61014e5f8051602061101783398151915281565b61013a61017e366004610e18565b6103d5565b61014e5f80516020610ff783398151915281565b60405160ff7f000000000000000000000000000000000000000000000000000000000000000016815260200161011e565b61014e6103f8565b61013a6101de366004610df0565b610453565b6101f66101f1366004610df0565b610474565b005b61014e610206366004610e51565b6001600160a01b03165f9081526020819052604090205490565b61014e61022e366004610e51565b60056020525f908152604090205481565b6101116104d3565b6101f6610255366004610df0565b6104e2565b6102817f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161011e565b61013a6102a7366004610df0565b610534565b61013a6102ba366004610df0565b6105ae565b61014e7f000000000000000000000000000000000000000000000000000000000000000081565b6101f66102f4366004610e71565b6105bb565b61014e610307366004610ede565b6107de565b610111604051806040016040528060018152602001603160f81b81525081565b60606003805461033b90610f0f565b80601f016020809104026020016040519081016040528092919081815260200182805461036790610f0f565b80156103b25780601f10610389576101008083540402835291602001916103b2565b820191905f5260205f20905b81548152906001019060200180831161039557829003601f168201915b5050505050905090565b5f336103c9818585610808565b60019150505b92915050565b5f336103e285828561092c565b6103ed8585856109a4565b506001949350505050565b5f7f0000000000000000000000000000000000000000000000000000000000000000461461042e5761042946610b33565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b5f336103c981858561046583836107de565b61046f9190610f5b565b610808565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104c55760405162461bcd60e51b81526004016104bc90610f6e565b60405180910390fd5b6104cf8282610bcb565b5050565b60606004805461033b90610f0f565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461052a5760405162461bcd60e51b81526004016104bc90610f6e565b6104cf8282610c75565b5f338161054182866107de565b9050838110156105a15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104bc565b6103ed8286868403610808565b5f336103c98185856109a4565b834211156106175760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104bc565b6001600160a01b0387165f90815260056020526040812080545f80516020610ff7833981519152918a918a918a91908661065083610fbe565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6106ad6103f8565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f1981840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610735573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381161580159061076b5750896001600160a01b0316816001600160a01b0316145b6107c75760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104bc565b6107d28a8a8a610808565b50505050505050505050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661086a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104bc565b6001600160a01b0382166108cb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104bc565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b5f61093784846107de565b90505f19811461099e57818110156109915760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104bc565b61099e8484848403610808565b50505050565b6001600160a01b038316610a085760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104bc565b6001600160a01b038216610a6a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104bc565b6001600160a01b0383165f9081526020819052604090205481811015610ae15760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104bc565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290925f80516020610fd7833981519152910160405180910390a361099e565b5f5f80516020611017833981519152610b4a61032c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c215760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104bc565b8060025f828254610c329190610f5b565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481525f80516020610fd7833981519152910160405180910390a35050565b6001600160a01b038216610cd55760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104bc565b6001600160a01b0382165f9081526020819052604090205481811015610d485760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104bc565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192915f80516020610fd7833981519152910161091f565b5f6020808352835180828501525f5b81811015610db557858101830151858201604001528201610d99565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610deb575f80fd5b919050565b5f8060408385031215610e01575f80fd5b610e0a83610dd5565b946020939093013593505050565b5f805f60608486031215610e2a575f80fd5b610e3384610dd5565b9250610e4160208501610dd5565b9150604084013590509250925092565b5f60208284031215610e61575f80fd5b610e6a82610dd5565b9392505050565b5f805f805f805f60e0888a031215610e87575f80fd5b610e9088610dd5565b9650610e9e60208901610dd5565b95506040880135945060608801359350608088013560ff81168114610ec1575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215610eef575f80fd5b610ef883610dd5565b9150610f0660208401610dd5565b90509250929050565b600181811c90821680610f2357607f821691505b602082108103610f4157634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156103cf576103cf610f47565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b5f60018201610fcf57610fcf610f47565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa26469706673582212206c12be332dd873b7cf88c58dfc4762858b63e8ff3bf8563b47828a5a4272643b64736f6c63430008140033501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe27545983a2646970667358221220c9b1840436353a036fc77dd82a0a8f92815c9f865ef8221a65aee798b479fe5464736f6c63430008140033", - "deployedBytecode": "0x60806040526004361062000127575f3560e01c806315064c96146200012b5780632072f6c5146200015b57806322e95f2c1462000174578063240ff37814620001a75780632cffd02e14620001be5780632d2c9d9414620001e25780632dfdf0b51462000206578063318aee3d146200022c57806334ac9cf214620002985780633ae0504714620002b95780633e19704314620002d0578063647c576c14620002f457806379e2cf97146200031857806381b1c174146200032f5780639e34070f1462000367578063aaa13cc214620003aa578063bab161bf14620003ce578063be5831c71462000407578063cd586579146200042c578063d02103ca1462000443578063dbc16976146200046b578063ee25560b1462000482578063fb57083414620004b1575b5f80fd5b34801562000137575f80fd5b50606854620001469060ff1681565b60405190151581526020015b60405180910390f35b34801562000167575f80fd5b5062000172620004d5565b005b34801562000180575f80fd5b50620001986200019236600462002332565b6200050d565b6040516200015291906200236c565b62000172620001b8366004620023d5565b6200055d565b348015620001ca575f80fd5b5062000172620001dc36600462002465565b62000672565b348015620001ee575f80fd5b50620001726200020036600462002465565b62000a45565b34801562000212575f80fd5b506200021d60535481565b60405190815260200162000152565b34801562000238575f80fd5b50620002736200024a36600462002542565b606b6020525f908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b0390911660208301520162000152565b348015620002a4575f80fd5b50606c5462000198906001600160a01b031681565b348015620002c5575f80fd5b506200021d62000b7e565b348015620002dc575f80fd5b506200021d620002ee36600462002576565b62000c65565b34801562000300575f80fd5b506200017262000312366004620025fb565b62000cf1565b34801562000324575f80fd5b506200017262000e6f565b3480156200033b575f80fd5b50620001986200034d36600462002648565b606a6020525f90815260409020546001600160a01b031681565b34801562000373575f80fd5b50620001466200038536600462002648565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b348015620003b6575f80fd5b5062000198620003c836600462002660565b62000e93565b348015620003da575f80fd5b50606854620003f190610100900463ffffffff1681565b60405163ffffffff909116815260200162000152565b34801562000413575f80fd5b50606854620003f190600160c81b900463ffffffff1681565b620001726200043d3660046200270c565b62000fa8565b3480156200044f575f80fd5b506068546200019890600160281b90046001600160a01b031681565b34801562000477575f80fd5b50620001726200132c565b3480156200048e575f80fd5b506200021d620004a036600462002648565b60696020525f908152604090205481565b348015620004bd575f80fd5b5062000146620004cf366004620027a7565b62001362565b606c546001600160a01b03163314620005015760405163e2e8106b60e01b815260040160405180910390fd5b6200050b6200143a565b565b5f606a5f848460405160200162000526929190620027f1565b60408051601f198184030181529181528151602092830120835290820192909252015f20546001600160a01b031690505b92915050565b60685460ff16156200058257604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161480620005a85750600263ffffffff861610155b15620005c7576040516302caf51760e11b815260040160405180910390fd5b5f80516020620045368339815191526001606860019054906101000a900463ffffffff163388883488886053546040516200060b9998979695949392919062002843565b60405180910390a16200065a620006546001606860019054906101000a900463ffffffff1633898934898960405162000646929190620028b1565b604051809103902062000c65565b62001496565b82156200066b576200066b62001591565b5050505050565b60685460ff16156200069757604051630bc011ff60e21b815260040160405180910390fd5b620006ad8b8b8b8b8b8b8b8b8b8b8b5f62001624565b6001600160a01b0386166200075257604080515f808252602082019092526001600160a01b038616908590604051620006e79190620028f8565b5f6040518083038185875af1925050503d805f811462000723576040519150601f19603f3d011682016040523d82523d5f602084013e62000728565b606091505b50509050806200074b57604051630ce8f45160e31b815260040160405180910390fd5b5062000a09565b60685463ffffffff6101009091048116908816036200078757620007816001600160a01b038716858562001787565b62000a09565b5f87876040516020016200079d929190620027f1565b60408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b031680620009a6575f8080620007e486880188620029c9565b9250925092505f85848484604051620007fd90620022f8565b6200080b9392919062002a66565b8190604051809103905ff590508015801562000829573d5f803e3d5ffd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f19906200085d908d908d9060040162002aa2565b5f604051808303815f87803b15801562000875575f80fd5b505af115801562000888573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b6040516200099495949392919062002abb565b60405180910390a15050505062000a06565b6040516340c10f1960e01b81526001600160a01b038216906340c10f1990620009d6908990899060040162002aa2565b5f604051808303815f87803b158015620009ee575f80fd5b505af115801562000a01573d5f803e3d5ffd5b505050505b50505b5f80516020620045568339815191528a8888878760405162000a3095949392919062002af5565b60405180910390a15050505050505050505050565b60685460ff161562000a6a57604051630bc011ff60e21b815260040160405180910390fd5b62000a818b8b8b8b8b8b8b8b8b8b8b600162001624565b5f846001600160a01b031684888a868660405160240162000aa6949392919062002b2c565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162000add9190620028f8565b5f6040518083038185875af1925050503d805f811462000b19576040519150601f19603f3d011682016040523d82523d5f602084013e62000b1e565b606091505b505090508062000b41576040516337e391c360e01b815260040160405180910390fd5b5f80516020620045568339815191528b8989888860405162000b6895949392919062002af5565b60405180910390a1505050505050505050505050565b6053545f90819081805b602081101562000c5c578083901c60011660010362000beb576033816020811062000bb75762000bb762002b68565b01548460405160200162000bcd92919062002b7c565b60405160208183030381529060405280519060200120935062000c19565b838260405160200162000c0092919062002b7c565b6040516020818303038152906040528051906020012093505b818260405160200162000c2e92919062002b7c565b604051602081830303815290604052805190602001209150808062000c539062002b9e565b91505062000b88565b50919392505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b5f54610100900460ff161580801562000d1057505f54600160ff909116105b8062000d34575062000d2230620017e1565b15801562000d3457505f5460ff166001145b62000d9d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801562000dbf575f805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff871602600160281b600160c81b03191617600160281b6001600160a01b038681169190910291909117909155606c80546001600160a01b03191691841691909117905562000e23620017f0565b801562000e69575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854600160c81b900463ffffffff1610156200050b576200050b62001591565b5f80888860405160200162000eaa929190620027f1565b6040516020818303038152906040528051906020012090505f60ff60f81b30836040518060200162000edc90620022f8565b601f1982820381018352601f90910116604081905262000f09908d908d908d908d908d9060200162002bb9565b60408051601f198184030181529082905262000f29929160200162002bf9565b6040516020818303038152906040528051906020012060405160200162000f8294939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b60685460ff161562000fcd57604051630bc011ff60e21b815260040160405180910390fd5b62000fd762001823565b60685463ffffffff88811661010090920416148062000ffd5750600263ffffffff881610155b156200101c576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b0388166200105a57883414620010515760405163b89240f560e01b815260040160405180910390fd5b5f9250620012b1565b34156200107a5760405163798ee6f160e01b815260040160405180910390fd5b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b900490921691810182905290156200113157604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac90620010ef9033908e9060040162002aa2565b5f604051808303815f87803b15801562001107575f80fd5b505af11580156200111a573d5f803e3d5ffd5b5050505080602001519450805f01519350620012af565b8515620011465762001146898b89896200187e565b6040516370a0823160e01b81525f906001600160a01b038b16906370a0823190620011769030906004016200236c565b602060405180830381865afa15801562001192573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620011b8919062002c2b565b9050620011d16001600160a01b038b1633308e62001bd5565b6040516370a0823160e01b81525f906001600160a01b038c16906370a0823190620012019030906004016200236c565b602060405180830381865afa1580156200121d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001243919062002c2b565b905062001251828262002c43565b6068548c9850610100900463ffffffff1696509350620012718762001c0f565b6200127c8c62001cd2565b620012878d62001d8c565b6040516020016200129b9392919062002a66565b604051602081830303815290604052945050505b505b5f80516020620045368339815191525f84868e8e8688605354604051620012e098979695949392919062002c59565b60405180910390a162001304620006545f85878f8f87898051906020012062000c65565b861562001315576200131562001591565b505050506200132360018055565b50505050505050565b606c546001600160a01b03163314620013585760405163e2e8106b60e01b815260040160405180910390fd5b6200050b62001e4f565b5f84815b60208110156200142c57600163ffffffff8616821c81169003620013d05785816020811062001399576200139962002b68565b602002013582604051602001620013b292919062002b7c565b60405160208183030381529060405280519060200120915062001417565b81868260208110620013e657620013e662002b68565b6020020135604051602001620013fe92919062002b7c565b6040516020818303038152906040528051906020012091505b80620014238162002b9e565b91505062001366565b50821490505b949350505050565b60685460ff16156200145f57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b806001620014a76020600262002dbe565b620014b3919062002c43565b60535410620014d5576040516377ae67b360e11b815260040160405180910390fd5b5f60535f8154620014e69062002b9e565b918290555090505f5b602081101562001581578082901c600116600103620015275782603382602081106200151f576200151f62002b68565b015550505050565b603381602081106200153d576200153d62002b68565b0154836040516020016200155392919062002b7c565b6040516020818303038152906040528051906020012092508080620015789062002b9e565b915050620014ef565b506200158c62002dcb565b505050565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d620015da62000b7e565b6040518263ffffffff1660e01b8152600401620015f991815260200190565b5f604051808303815f87803b15801562001611575f80fd5b505af115801562000e69573d5f803e3d5ffd5b620016358b63ffffffff1662001ea7565b6068545f90600160281b90046001600160a01b031663257b36326200165b8d8d62001ef2565b6040518263ffffffff1660e01b81526004016200167a91815260200190565b6020604051808303815f875af115801562001697573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620016bd919062002c2b565b9050805f03620016df57604051622f6fad60e01b815260040160405180910390fd5b60685463ffffffff888116610100909204161462001710576040516302caf51760e11b815260040160405180910390fd5b6068545f90610100900463ffffffff166200172d57508962001730565b508a5b6200175962001750848c8c8c8c8c8c8c60405162000646929190620028b1565b8f8f8462001362565b62001777576040516338105f3b60e21b815260040160405180910390fd5b5050505050505050505050505050565b6200158c8363a9059cbb60e01b8484604051602401620017a992919062002aa2565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262001f26565b6001600160a01b03163b151590565b5f54610100900460ff16620018195760405162461bcd60e51b815260040162000d949062002ddf565b6200050b62001ffe565b600260015403620018775760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000d94565b6002600155565b5f6200188e600482848662002e2a565b620018999162002e53565b9050632afa533160e01b6001600160e01b031982160162001a35575f808080808080620018ca896004818d62002e2a565b810190620018d9919062002e84565b9650965096509650965096509650336001600160a01b0316876001600160a01b0316146200191a5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0386163014620019445760405163750643af60e01b815260040160405180910390fd5b8a851462001965576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e1691620019e59190620028f8565b5f604051808303815f865af19150503d805f811462001a20576040519150601f19603f3d011682016040523d82523d5f602084013e62001a25565b606091505b505050505050505050506200066b565b6001600160e01b031981166323f2ebc360e21b1462001a6757604051637141605d60e11b815260040160405180910390fd5b5f8080808080808062001a7e8a6004818e62002e2a565b81019062001a8d919062002eda565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462001ad05760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038716301462001afa5760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169162001b839190620028f8565b5f604051808303815f865af19150503d805f811462001bbe576040519150601f19603f3d011682016040523d82523d5f602084013e62001bc3565b606091505b50505050505050505050505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905262000e699085906323b872dd60e01b90608401620017a9565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b17905290516060915f9182916001600160a01b0386169162001c579190620028f8565b5f60405180830381855afa9150503d805f811462001c91576040519150601f19603f3d011682016040523d82523d5f602084013e62001c96565b606091505b50915091508162001cc757604051806040016040528060078152602001664e4f5f4e414d4560c81b81525062001432565b620014328162002027565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b17905290516060915f9182916001600160a01b0386169162001d1a9190620028f8565b5f60405180830381855afa9150503d805f811462001d54576040519150601f19603f3d011682016040523d82523d5f602084013e62001d59565b606091505b50915091508162001cc757604051806040016040528060098152602001681393d7d4d6535093d360ba1b81525062001432565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f91829182916001600160a01b0386169162001dd39190620028f8565b5f60405180830381855afa9150503d805f811462001e0d576040519150601f19603f3d011682016040523d82523d5f602084013e62001e12565b606091505b509150915081801562001e26575080516020145b62001e3357601262001432565b8080602001905181019062001432919062002f61565b60018055565b60685460ff1662001e7357604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b918218928390559290919081831690036200066b57604051630c8d9eab60e31b815260040160405180910390fd5b5f828260405160200162001f0892919062002b7c565b60405160208183030381529060405280519060200120905092915050565b5f62001f7c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620021cb9092919063ffffffff16565b8051909150156200158c578080602001905181019062001f9d919062002f7f565b6200158c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000d94565b5f54610100900460ff1662001e495760405162461bcd60e51b815260040162000d949062002ddf565b6060604082511062002049578180602001905181019062000557919062002f9d565b815160200362002198575f5b60208110801562002088575082818151811062002076576200207662002b68565b01602001516001600160f81b03191615155b15620020a357806200209a8162002b9e565b91505062002055565b805f03620020db5750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b5f816001600160401b03811115620020f757620020f7620028c0565b6040519080825280601f01601f19166020018201604052801562002122576020820181803683370190505b5090505f5b82811015620021905784818151811062002145576200214562002b68565b602001015160f81c60f81b82828151811062002165576200216562002b68565b60200101906001600160f81b03191690815f1a90535080620021878162002b9e565b91505062002127565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b60606200143284845f85855f80866001600160a01b03168587604051620021f39190620028f8565b5f6040518083038185875af1925050503d805f81146200222f576040519150601f19603f3d011682016040523d82523d5f602084013e62002234565b606091505b5091509150620022478783838762002252565b979650505050505050565b60608315620022c55782515f03620022bd576200226f85620017e1565b620022bd5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000d94565b508162001432565b620014328383815115620022dc5781518083602001fd5b8060405162461bcd60e51b815260040162000d94919062003017565b61150a806200302c83390190565b803563ffffffff81168114620021c6575f80fd5b6001600160a01b03811681146200232f575f80fd5b50565b5f806040838503121562002344575f80fd5b6200234f8362002306565b9150602083013562002361816200231a565b809150509250929050565b6001600160a01b0391909116815260200190565b80151581146200232f575f80fd5b5f8083601f8401126200239f575f80fd5b5081356001600160401b03811115620023b6575f80fd5b602083019150836020828501011115620023ce575f80fd5b9250929050565b5f805f805f60808688031215620023ea575f80fd5b620023f58662002306565b9450602086013562002407816200231a565b93506040860135620024198162002380565b925060608601356001600160401b0381111562002434575f80fd5b62002442888289016200238e565b969995985093965092949392505050565b80610400810183101562000557575f80fd5b5f805f805f805f805f805f6105208c8e03121562002481575f80fd5b6200248d8d8d62002453565b9a506200249e6104008d0162002306565b99506104208c013598506104408c01359750620024bf6104608d0162002306565b96506104808c0135620024d2816200231a565b9550620024e36104a08d0162002306565b94506104c08c0135620024f6816200231a565b93506104e08c013592506105008c01356001600160401b038111156200251a575f80fd5b620025288e828f016200238e565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562002553575f80fd5b813562002560816200231a565b9392505050565b60ff811681146200232f575f80fd5b5f805f805f805f60e0888a0312156200258d575f80fd5b87356200259a8162002567565b9650620025aa6020890162002306565b95506040880135620025bc816200231a565b9450620025cc6060890162002306565b93506080880135620025de816200231a565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156200260e575f80fd5b620026198462002306565b925060208401356200262b816200231a565b915060408401356200263d816200231a565b809150509250925092565b5f6020828403121562002659575f80fd5b5035919050565b5f805f805f805f60a0888a03121562002677575f80fd5b620026828862002306565b9650602088013562002694816200231a565b955060408801356001600160401b0380821115620026b0575f80fd5b620026be8b838c016200238e565b909750955060608a0135915080821115620026d7575f80fd5b50620026e68a828b016200238e565b9094509250506080880135620026fc8162002567565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562002723575f80fd5b6200272e8862002306565b9650602088013562002740816200231a565b955060408801359450606088013562002759816200231a565b935060808801356200276b8162002380565b925060a08801356001600160401b0381111562002786575f80fd5b620027948a828b016200238e565b989b979a50959850939692959293505050565b5f805f806104608587031215620027bc575f80fd5b84359350620027cf866020870162002453565b9250620027e0610420860162002306565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c083018190525f916200289784830187896200281b565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015620028f0578181015183820152602001620028d6565b50505f910152565b5f82516200290b818460208701620028d4565b9190910192915050565b604051601f8201601f191681016001600160401b0381118282101715620029405762002940620028c0565b604052919050565b5f6001600160401b03821115620029635762002963620028c0565b50601f01601f191660200190565b5f82601f83011262002981575f80fd5b813562002998620029928262002948565b62002915565b818152846020838601011115620029ad575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f60608486031215620029dc575f80fd5b83356001600160401b0380821115620029f3575f80fd5b62002a018783880162002971565b9450602086013591508082111562002a17575f80fd5b5062002a268682870162002971565b92505060408401356200263d8162002567565b5f815180845262002a52816020860160208601620028d4565b601f01601f19169290920160200192915050565b606081525f62002a7a606083018662002a39565b828103602084015262002a8e818662002a39565b91505060ff83166040830152949350505050565b6001600160a01b03929092168252602082015260400190565b63ffffffff861681526001600160a01b038581166020830152841660408201526080606082018190525f906200224790830184866200281b565b63ffffffff95861681529390941660208401526001600160a01b039182166040840152166060820152608081019190915260a00190565b6001600160a01b038516815263ffffffff841660208201526060604082018190525f9062002b5e90830184866200281b565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b918252602082015260400190565b634e487b7160e01b5f52601160045260245ffd5b5f6001820162002bb25762002bb262002b8a565b5060010190565b606081525f62002bce6060830187896200281b565b828103602084015262002be38186886200281b565b91505060ff831660408301529695505050505050565b5f835162002c0c818460208801620028d4565b83519083019062002c22818360208801620028d4565b01949350505050565b5f6020828403121562002c3c575f80fd5b5051919050565b8181038181111562000557576200055762002b8a565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c083018190525f9162002cac8483018762002a39565b925080851660e085015250509998505050505050505050565b600181815b8085111562002d0557815f190482111562002ce95762002ce962002b8a565b8085161562002cf757918102915b93841c939080029062002cca565b509250929050565b5f8262002d1d5750600162000557565b8162002d2b57505f62000557565b816001811462002d44576002811462002d4f5762002d6f565b600191505062000557565b60ff84111562002d635762002d6362002b8a565b50506001821b62000557565b5060208310610133831016604e8410600b841016171562002d94575081810a62000557565b62002da0838362002cc5565b805f190482111562002db65762002db662002b8a565b029392505050565b5f62002560838362002d0d565b634e487b7160e01b5f52600160045260245ffd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f808585111562002e39575f80fd5b8386111562002e46575f80fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101562002e7c5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562002e9b575f80fd5b873562002ea8816200231a565b9650602088013562002eba816200231a565b955060408801359450606088013593506080880135620025de8162002567565b5f805f805f805f80610100898b03121562002ef3575f80fd5b883562002f00816200231a565b9750602089013562002f12816200231a565b96506040890135955060608901359450608089013562002f328162002380565b935060a089013562002f448162002567565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562002f72575f80fd5b8151620025608162002567565b5f6020828403121562002f90575f80fd5b8151620025608162002380565b5f6020828403121562002fae575f80fd5b81516001600160401b0381111562002fc4575f80fd5b8201601f8101841362002fd5575f80fd5b805162002fe6620029928262002948565b81815285602083850101111562002ffb575f80fd5b6200300e826020830160208601620028d4565b95945050505050565b602081525f62002560602083018462002a3956fe61010060405234801562000011575f80fd5b506040516200150a3803806200150a833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161106c6200049e5f395f61019e01525f818161025f0152818161047f01526104ed01525f61043101525f81816102c401526103fb015261106c5ff3fe608060405234801561000f575f80fd5b5060043610610105575f3560e01c806306fdde0314610109578063095ea7b31461012757806318160ddd1461014a57806320606b701461015c57806323b872dd1461017057806330adf81f14610183578063313ce567146101975780633644e515146101c857806339509351146101d057806340c10f19146101e357806370a08231146101f85780637ecebe001461022057806395d89b411461023f5780639dc29fac14610247578063a3c573eb1461025a578063a457c2d714610299578063a9059cbb146102ac578063cd0d0096146102bf578063d505accf146102e6578063dd62ed3e146102f9578063ffa1ad741461030c575b5f80fd5b61011161032c565b60405161011e9190610d8a565b60405180910390f35b61013a610135366004610df0565b6103bc565b604051901515815260200161011e565b6002545b60405190815260200161011e565b61014e5f8051602061101783398151915281565b61013a61017e366004610e18565b6103d5565b61014e5f80516020610ff783398151915281565b60405160ff7f000000000000000000000000000000000000000000000000000000000000000016815260200161011e565b61014e6103f8565b61013a6101de366004610df0565b610453565b6101f66101f1366004610df0565b610474565b005b61014e610206366004610e51565b6001600160a01b03165f9081526020819052604090205490565b61014e61022e366004610e51565b60056020525f908152604090205481565b6101116104d3565b6101f6610255366004610df0565b6104e2565b6102817f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161011e565b61013a6102a7366004610df0565b610534565b61013a6102ba366004610df0565b6105ae565b61014e7f000000000000000000000000000000000000000000000000000000000000000081565b6101f66102f4366004610e71565b6105bb565b61014e610307366004610ede565b6107de565b610111604051806040016040528060018152602001603160f81b81525081565b60606003805461033b90610f0f565b80601f016020809104026020016040519081016040528092919081815260200182805461036790610f0f565b80156103b25780601f10610389576101008083540402835291602001916103b2565b820191905f5260205f20905b81548152906001019060200180831161039557829003601f168201915b5050505050905090565b5f336103c9818585610808565b60019150505b92915050565b5f336103e285828561092c565b6103ed8585856109a4565b506001949350505050565b5f7f0000000000000000000000000000000000000000000000000000000000000000461461042e5761042946610b33565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b5f336103c981858561046583836107de565b61046f9190610f5b565b610808565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104c55760405162461bcd60e51b81526004016104bc90610f6e565b60405180910390fd5b6104cf8282610bcb565b5050565b60606004805461033b90610f0f565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461052a5760405162461bcd60e51b81526004016104bc90610f6e565b6104cf8282610c75565b5f338161054182866107de565b9050838110156105a15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104bc565b6103ed8286868403610808565b5f336103c98185856109a4565b834211156106175760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104bc565b6001600160a01b0387165f90815260056020526040812080545f80516020610ff7833981519152918a918a918a91908661065083610fbe565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6106ad6103f8565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f1981840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610735573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381161580159061076b5750896001600160a01b0316816001600160a01b0316145b6107c75760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104bc565b6107d28a8a8a610808565b50505050505050505050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661086a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104bc565b6001600160a01b0382166108cb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104bc565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b5f61093784846107de565b90505f19811461099e57818110156109915760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104bc565b61099e8484848403610808565b50505050565b6001600160a01b038316610a085760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104bc565b6001600160a01b038216610a6a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104bc565b6001600160a01b0383165f9081526020819052604090205481811015610ae15760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104bc565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290925f80516020610fd7833981519152910160405180910390a361099e565b5f5f80516020611017833981519152610b4a61032c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c215760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104bc565b8060025f828254610c329190610f5b565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481525f80516020610fd7833981519152910160405180910390a35050565b6001600160a01b038216610cd55760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104bc565b6001600160a01b0382165f9081526020819052604090205481811015610d485760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104bc565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192915f80516020610fd7833981519152910161091f565b5f6020808352835180828501525f5b81811015610db557858101830151858201604001528201610d99565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610deb575f80fd5b919050565b5f8060408385031215610e01575f80fd5b610e0a83610dd5565b946020939093013593505050565b5f805f60608486031215610e2a575f80fd5b610e3384610dd5565b9250610e4160208501610dd5565b9150604084013590509250925092565b5f60208284031215610e61575f80fd5b610e6a82610dd5565b9392505050565b5f805f805f805f60e0888a031215610e87575f80fd5b610e9088610dd5565b9650610e9e60208901610dd5565b95506040880135945060608801359350608088013560ff81168114610ec1575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215610eef575f80fd5b610ef883610dd5565b9150610f0660208401610dd5565b90509250929050565b600181811c90821680610f2357607f821691505b602082108103610f4157634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156103cf576103cf610f47565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b5f60018201610fcf57610fcf610f47565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa26469706673582212206c12be332dd873b7cf88c58dfc4762858b63e8ff3bf8563b47828a5a4272643b64736f6c63430008140033501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe27545983a2646970667358221220c9b1840436353a036fc77dd82a0a8f92815c9f865ef8221a65aee798b479fe5464736f6c63430008140033", + "bytecode": "0x608060405234801561001057600080fd5b5061470f806100206000396000f3fe608060405260043610620001285760003560e01c806315064c96146200012d5780632072f6c5146200015e57806322e95f2c1462000178578063240ff37814620001ac5780632cffd02e14620001c35780632d2c9d9414620001e85780632dfdf0b5146200020d578063318aee3d146200023457806334ac9cf214620002a25780633ae0504714620002c45780633e19704314620002dc578063647c576c146200030157806379e2cf97146200032657806381b1c174146200033e5780639e34070f1462000378578063aaa13cc214620003bd578063bab161bf14620003e2578063be5831c7146200041c578063cd5865791462000442578063d02103ca1462000459578063dbc169761462000482578063ee25560b146200049a578063fb57083414620004cb575b600080fd5b3480156200013a57600080fd5b50606854620001499060ff1681565b60405190151581526020015b60405180910390f35b3480156200016b57600080fd5b5062000176620004f0565b005b3480156200018557600080fd5b506200019d62000197366004620023cc565b62000528565b60405162000155919062002408565b62000176620001bd36600462002476565b6200057b565b348015620001d057600080fd5b5062000176620001e23660046200250c565b62000691565b348015620001f557600080fd5b5062000176620002073660046200250c565b62000a84565b3480156200021a57600080fd5b506200022560535481565b60405190815260200162000155565b3480156200024157600080fd5b506200027d62000253366004620025f1565b606b6020526000908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b0390911660208301520162000155565b348015620002af57600080fd5b50606c546200019d906001600160a01b031681565b348015620002d157600080fd5b506200022562000bc2565b348015620002e957600080fd5b5062000225620002fb36600462002628565b62000caa565b3480156200030e57600080fd5b506200017662000320366004620026b2565b62000d37565b3480156200033357600080fd5b506200017662000ebb565b3480156200034b57600080fd5b506200019d6200035d36600462002702565b606a602052600090815260409020546001600160a01b031681565b3480156200038557600080fd5b50620001496200039736600462002702565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b348015620003ca57600080fd5b506200019d620003dc3660046200271c565b62000edf565b348015620003ef57600080fd5b506068546200040690610100900463ffffffff1681565b60405163ffffffff909116815260200162000155565b3480156200042957600080fd5b506068546200040690600160c81b900463ffffffff1681565b6200017662000453366004620027cf565b62000ff6565b3480156200046657600080fd5b506068546200019d90600160281b90046001600160a01b031681565b3480156200048f57600080fd5b50620001766200138c565b348015620004a757600080fd5b5062000225620004b936600462002702565b60696020526000908152604090205481565b348015620004d857600080fd5b5062000149620004ea36600462002870565b620013c2565b606c546001600160a01b031633146200051c5760405163e2e8106b60e01b815260040160405180910390fd5b620005266200149b565b565b6000606a6000848460405160200162000543929190620028bd565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b60685460ff1615620005a057604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161480620005c65750600263ffffffff861610155b15620005e5576040516302caf51760e11b815260040160405180910390fd5b6000805160206200469a8339815191526001606860019054906101000a900463ffffffff163388883488886053546040516200062a9998979695949392919062002910565b60405180910390a162000679620006736001606860019054906101000a900463ffffffff16338989348989604051620006659291906200297f565b604051809103902062000caa565b620014f8565b82156200068a576200068a620015f6565b5050505050565b60685460ff1615620006b657604051630bc011ff60e21b815260040160405180910390fd5b620006cd8b8b8b8b8b8b8b8b8b8b8b60006200168e565b6001600160a01b0386166200077657604080516000808252602082019092526001600160a01b038616908590604051620007089190620029cb565b60006040518083038185875af1925050503d806000811462000747576040519150601f19603f3d011682016040523d82523d6000602084013e6200074c565b606091505b50509050806200076f57604051630ce8f45160e31b815260040160405180910390fd5b5062000a47565b60685463ffffffff610100909104811690881603620007ab57620007a56001600160a01b0387168585620017f7565b62000a47565b60008787604051602001620007c2929190620028bd565b60408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b031680620009df57600080806200080b8688018862002aa2565b925092509250600085848484604051620008259062002390565b620008339392919062002b45565b8190604051809103906000f590508015801562000854573d6000803e3d6000fd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f199062000888908d908d9060040162002b82565b600060405180830381600087803b158015620008a357600080fd5b505af1158015620008b8573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b604051620009cd95949392919062002b9b565b60405180910390a15050505062000a44565b6040516340c10f1960e01b81526001600160a01b038216906340c10f199062000a0f908990899060040162002b82565b600060405180830381600087803b15801562000a2a57600080fd5b505af115801562000a3f573d6000803e3d6000fd5b505050505b50505b600080516020620046ba8339815191528a8888878760405162000a6f95949392919062002bd6565b60405180910390a15050505050505050505050565b60685460ff161562000aa957604051630bc011ff60e21b815260040160405180910390fd5b62000ac08b8b8b8b8b8b8b8b8b8b8b60016200168e565b6000846001600160a01b031684888a868660405160240162000ae6949392919062002c0d565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162000b1d9190620029cb565b60006040518083038185875af1925050503d806000811462000b5c576040519150601f19603f3d011682016040523d82523d6000602084013e62000b61565b606091505b505090508062000b84576040516337e391c360e01b815260040160405180910390fd5b600080516020620046ba8339815191528b8989888860405162000bac95949392919062002bd6565b60405180910390a1505050505050505050505050565b605354600090819081805b602081101562000ca1578083901c60011660010362000c30576033816020811062000bfc5762000bfc62002c4a565b01548460405160200162000c1292919062002c60565b60405160208183030381529060405280519060200120935062000c5e565b838260405160200162000c4592919062002c60565b6040516020818303038152906040528051906020012093505b818260405160200162000c7392919062002c60565b604051602081830303815290604052805190602001209150808062000c989062002c84565b91505062000bcd565b50919392505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b600054610100900460ff161580801562000d585750600054600160ff909116105b8062000d7d575062000d6a3062001851565b15801562000d7d575060005460ff166001145b62000de65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000e0a576000805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff871602600160281b600160c81b03191617600160281b6001600160a01b038681169190910291909117909155606c80546001600160a01b03191691841691909117905562000e6e62001860565b801562000eb5576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854600160c81b900463ffffffff161015620005265762000526620015f6565b600080888860405160200162000ef7929190620028bd565b604051602081830303815290604052805190602001209050600060ff60f81b30836040518060200162000f2a9062002390565b601f1982820381018352601f90910116604081905262000f57908d908d908d908d908d9060200162002ca0565b60408051601f198184030181529082905262000f77929160200162002ce1565b6040516020818303038152906040528051906020012060405160200162000fd094939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b60685460ff16156200101b57604051630bc011ff60e21b815260040160405180910390fd5b6200102562001894565b60685463ffffffff8881166101009092041614806200104b5750600263ffffffff881610155b156200106a576040516302caf51760e11b815260040160405180910390fd5b6000806060876001600160a01b038816620010aa57883414620010a05760405163b89240f560e01b815260040160405180910390fd5b600092506200130e565b3415620010ca5760405163798ee6f160e01b815260040160405180910390fd5b6001600160a01b038089166000908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b900490921691810182905290156200118857604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac90620011409033908e9060040162002b82565b600060405180830381600087803b1580156200115b57600080fd5b505af115801562001170573d6000803e3d6000fd5b5050505080602001519450806000015193506200130c565b85156200119d576200119d898b8989620018ef565b6040516370a0823160e01b81526000906001600160a01b038b16906370a0823190620011ce90309060040162002408565b602060405180830381865afa158015620011ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001212919062002d14565b90506200122b6001600160a01b038b1633308e62001c51565b6040516370a0823160e01b81526000906001600160a01b038c16906370a08231906200125c90309060040162002408565b602060405180830381865afa1580156200127a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012a0919062002d14565b9050620012ae828262002d2e565b6068548c9850610100900463ffffffff1696509350620012ce8762001c8b565b620012d98c62001d52565b620012e48d62001e10565b604051602001620012f89392919062002b45565b604051602081830303815290604052945050505b505b6000805160206200469a833981519152600084868e8e86886053546040516200133f98979695949392919062002d44565b60405180910390a16200136462000673600085878f8f87898051906020012062000caa565b8615620013755762001375620015f6565b505050506200138360018055565b50505050505050565b606c546001600160a01b03163314620013b85760405163e2e8106b60e01b815260040160405180910390fd5b6200052662001ed7565b600084815b60208110156200148d57600163ffffffff8616821c811690036200143157858160208110620013fa57620013fa62002c4a565b6020020135826040516020016200141392919062002c60565b60405160208183030381529060405280519060200120915062001478565b8186826020811062001447576200144762002c4a565b60200201356040516020016200145f92919062002c60565b6040516020818303038152906040528051906020012091505b80620014848162002c84565b915050620013c7565b50821490505b949350505050565b60685460ff1615620014c057604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b806001620015096020600262002eae565b62001515919062002d2e565b6053541062001537576040516377ae67b360e11b815260040160405180910390fd5b60006053600081546200154a9062002c84565b9182905550905060005b6020811015620015e6578082901c6001166001036200158c57826033826020811062001584576200158462002c4a565b015550505050565b60338160208110620015a257620015a262002c4a565b015483604051602001620015b892919062002c60565b6040516020818303038152906040528051906020012092508080620015dd9062002c84565b91505062001554565b50620015f162002ebc565b505050565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d6200163f62000bc2565b6040518263ffffffff1660e01b81526004016200165e91815260200190565b600060405180830381600087803b1580156200167957600080fd5b505af115801562000eb5573d6000803e3d6000fd5b6200169f8b63ffffffff1662001f30565b606854600090600160281b90046001600160a01b031663257b3632620016c68d8d62001f7c565b6040518263ffffffff1660e01b8152600401620016e591815260200190565b6020604051808303816000875af115801562001705573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200172b919062002d14565b9050806000036200174e57604051622f6fad60e01b815260040160405180910390fd5b60685463ffffffff88811661010090920416146200177f576040516302caf51760e11b815260040160405180910390fd5b606854600090610100900463ffffffff166200179d575089620017a0565b508a5b620017c9620017c0848c8c8c8c8c8c8c604051620006659291906200297f565b8f8f84620013c2565b620017e7576040516338105f3b60e21b815260040160405180910390fd5b5050505050505050505050505050565b620015f18363a9059cbb60e01b84846040516024016200181992919062002b82565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262001fb1565b6001600160a01b03163b151590565b600054610100900460ff166200188a5760405162461bcd60e51b815260040162000ddd9062002ed2565b620005266200208a565b600260015403620018e85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000ddd565b6002600155565b600062001900600482848662002f1d565b6200190b9162002f49565b9050632afa533160e01b6001600160e01b031982160162001aac5760008080808080806200193d896004818d62002f1d565b8101906200194c919062002f7a565b9650965096509650965096509650336001600160a01b0316876001600160a01b0316146200198d5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0386163014620019b75760405163750643af60e01b815260040160405180910390fd5b8a8514620019d8576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e169162001a589190620029cb565b6000604051808303816000865af19150503d806000811462001a97576040519150601f19603f3d011682016040523d82523d6000602084013e62001a9c565b606091505b505050505050505050506200068a565b6001600160e01b031981166323f2ebc360e21b1462001ade57604051637141605d60e11b815260040160405180910390fd5b60008080808080808062001af68a6004818e62002f1d565b81019062001b05919062002fd5565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462001b485760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038716301462001b725760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169162001bfb9190620029cb565b6000604051808303816000865af19150503d806000811462001c3a576040519150601f19603f3d011682016040523d82523d6000602084013e62001c3f565b606091505b50505050505050505050505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905262000eb59085906323b872dd60e01b9060840162001819565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009182916001600160a01b0386169162001cd49190620029cb565b600060405180830381855afa9150503d806000811462001d11576040519150601f19603f3d011682016040523d82523d6000602084013e62001d16565b606091505b50915091508162001d4757604051806040016040528060078152602001664e4f5f4e414d4560c81b81525062001493565b6200149381620020b4565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009182916001600160a01b0386169162001d9b9190620029cb565b600060405180830381855afa9150503d806000811462001dd8576040519150601f19603f3d011682016040523d82523d6000602084013e62001ddd565b606091505b50915091508162001d4757604051806040016040528060098152602001681393d7d4d6535093d360ba1b81525062001493565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b0386169162001e589190620029cb565b600060405180830381855afa9150503d806000811462001e95576040519150601f19603f3d011682016040523d82523d6000602084013e62001e9a565b606091505b509150915081801562001eae575080516020145b62001ebb57601262001493565b8080602001905181019062001493919062003061565b60018055565b60685460ff1662001efb57604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600881901c60008181526069602052604081208054600160ff861690811b918218928390559290919081831690036200068a57604051630c8d9eab60e31b815260040160405180910390fd5b6000828260405160200162001f9392919062002c60565b60405160208183030381529060405280519060200120905092915050565b600062002008826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200225d9092919063ffffffff16565b805190915015620015f1578080602001905181019062002029919062003081565b620015f15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000ddd565b600054610100900460ff1662001ed15760405162461bcd60e51b815260040162000ddd9062002ed2565b60606040825110620020d65781806020019051810190620005759190620030a1565b81516020036200222a5760005b60208110801562002116575082818151811062002104576200210462002c4a565b01602001516001600160f81b03191615155b15620021315780620021288162002c84565b915050620020e3565b806000036200216a5750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b6000816001600160401b038111156200218757620021876200298f565b6040519080825280601f01601f191660200182016040528015620021b2576020820181803683370190505b50905060005b828110156200222257848181518110620021d657620021d662002c4a565b602001015160f81c60f81b828281518110620021f657620021f662002c4a565b60200101906001600160f81b031916908160001a90535080620022198162002c84565b915050620021b8565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b606062001493848460008585600080866001600160a01b03168587604051620022879190620029cb565b60006040518083038185875af1925050503d8060008114620022c6576040519150601f19603f3d011682016040523d82523d6000602084013e620022cb565b606091505b5091509150620022de87838387620022e9565b979650505050505050565b606083156200235d5782516000036200235557620023078562001851565b620023555760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000ddd565b508162001493565b620014938383815115620023745781518083602001fd5b8060405162461bcd60e51b815260040162000ddd919062003120565b611564806200313683390190565b803563ffffffff811681146200225857600080fd5b6001600160a01b0381168114620023c957600080fd5b50565b60008060408385031215620023e057600080fd5b620023eb836200239e565b91506020830135620023fd81620023b3565b809150509250929050565b6001600160a01b0391909116815260200190565b8015158114620023c957600080fd5b60008083601f8401126200243e57600080fd5b5081356001600160401b038111156200245657600080fd5b6020830191508360208285010111156200246f57600080fd5b9250929050565b6000806000806000608086880312156200248f57600080fd5b6200249a866200239e565b94506020860135620024ac81620023b3565b93506040860135620024be816200241c565b925060608601356001600160401b03811115620024da57600080fd5b620024e8888289016200242b565b969995985093965092949392505050565b8061040081018310156200057557600080fd5b60008060008060008060008060008060006105208c8e0312156200252f57600080fd5b6200253b8d8d620024f9565b9a506200254c6104008d016200239e565b99506104208c013598506104408c013597506200256d6104608d016200239e565b96506104808c01356200258081620023b3565b9550620025916104a08d016200239e565b94506104c08c0135620025a481620023b3565b93506104e08c013592506105008c01356001600160401b03811115620025c957600080fd5b620025d78e828f016200242b565b915080935050809150509295989b509295989b9093969950565b6000602082840312156200260457600080fd5b81356200261181620023b3565b9392505050565b60ff81168114620023c957600080fd5b600080600080600080600060e0888a0312156200264457600080fd5b8735620026518162002618565b965062002661602089016200239e565b955060408801356200267381620023b3565b945062002683606089016200239e565b935060808801356200269581620023b3565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215620026c857600080fd5b620026d3846200239e565b92506020840135620026e581620023b3565b91506040840135620026f781620023b3565b809150509250925092565b6000602082840312156200271557600080fd5b5035919050565b600080600080600080600060a0888a0312156200273857600080fd5b62002743886200239e565b965060208801356200275581620023b3565b955060408801356001600160401b03808211156200277257600080fd5b620027808b838c016200242b565b909750955060608a01359150808211156200279a57600080fd5b50620027a98a828b016200242b565b9094509250506080880135620027bf8162002618565b8091505092959891949750929550565b600080600080600080600060c0888a031215620027eb57600080fd5b620027f6886200239e565b965060208801356200280881620023b3565b95506040880135945060608801356200282181620023b3565b9350608088013562002833816200241c565b925060a08801356001600160401b038111156200284f57600080fd5b6200285d8a828b016200242b565b989b979a50959850939692959293505050565b60008060008061046085870312156200288857600080fd5b843593506200289b8660208701620024f9565b9250620028ac61042086016200239e565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c08301819052600091620029658483018789620028e7565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620029c2578181015183820152602001620029a8565b50506000910152565b60008251620029df818460208701620029a5565b9190910192915050565b604051601f8201601f191681016001600160401b038111828210171562002a145762002a146200298f565b604052919050565b60006001600160401b0382111562002a385762002a386200298f565b50601f01601f191660200190565b600082601f83011262002a5857600080fd5b813562002a6f62002a698262002a1c565b620029e9565b81815284602083860101111562002a8557600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562002ab857600080fd5b83356001600160401b038082111562002ad057600080fd5b62002ade8783880162002a46565b9450602086013591508082111562002af557600080fd5b5062002b048682870162002a46565b9250506040840135620026f78162002618565b6000815180845262002b31816020860160208601620029a5565b601f01601f19169290920160200192915050565b60608152600062002b5a606083018662002b17565b828103602084015262002b6e818662002b17565b91505060ff83166040830152949350505050565b6001600160a01b03929092168252602082015260400190565b63ffffffff861681526001600160a01b03858116602083015284166040820152608060608201819052600090620022de9083018486620028e7565b63ffffffff95861681529390941660208401526001600160a01b039182166040840152166060820152608081019190915260a00190565b6001600160a01b038516815263ffffffff8416602082015260606040820181905260009062002c409083018486620028e7565b9695505050505050565b634e487b7160e01b600052603260045260246000fd5b918252602082015260400190565b634e487b7160e01b600052601160045260246000fd5b60006001820162002c995762002c9962002c6e565b5060010190565b60608152600062002cb6606083018789620028e7565b828103602084015262002ccb818688620028e7565b91505060ff831660408301529695505050505050565b6000835162002cf5818460208801620029a5565b83519083019062002d0b818360208801620029a5565b01949350505050565b60006020828403121562002d2757600080fd5b5051919050565b8181038181111562000575576200057562002c6e565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c0830181905260009162002d988483018762002b17565b925080851660e085015250509998505050505050505050565b600181815b8085111562002df257816000190482111562002dd65762002dd662002c6e565b8085161562002de457918102915b93841c939080029062002db6565b509250929050565b60008262002e0b5750600162000575565b8162002e1a5750600062000575565b816001811462002e33576002811462002e3e5762002e5e565b600191505062000575565b60ff84111562002e525762002e5262002c6e565b50506001821b62000575565b5060208310610133831016604e8410600b841016171562002e83575081810a62000575565b62002e8f838362002db1565b806000190482111562002ea65762002ea662002c6e565b029392505050565b600062002611838362002dfa565b634e487b7160e01b600052600160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000808585111562002f2e57600080fd5b8386111562002f3c57600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101562002f725780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a03121562002f9657600080fd5b873562002fa381620023b3565b9650602088013562002fb581620023b3565b955060408801359450606088013593506080880135620026958162002618565b600080600080600080600080610100898b03121562002ff357600080fd5b88356200300081620023b3565b975060208901356200301281620023b3565b96506040890135955060608901359450608089013562003032816200241c565b935060a0890135620030448162002618565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200307457600080fd5b8151620026118162002618565b6000602082840312156200309457600080fd5b815162002611816200241c565b600060208284031215620030b457600080fd5b81516001600160401b03811115620030cb57600080fd5b8201601f81018413620030dd57600080fd5b8051620030ee62002a698262002a1c565b8181528560208385010111156200310457600080fd5b62003117826020830160208601620029a5565b95945050505050565b60208152600062002611602083018462002b1756fe6101006040523480156200001257600080fd5b50604051620015643803806200156483398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516110a8620004bc60003960006101a30152600081816102660152818161048c01526104fa0152600061043d0152600081816102cb015261040701526110a86000f3fe608060405234801561001057600080fd5b50600436106101075760003560e01c806306fdde031461010c578063095ea7b31461012a57806318160ddd1461014d57806320606b701461015f57806323b872dd1461017457806330adf81f14610187578063313ce5671461019c5780633644e515146101cd57806339509351146101d557806340c10f19146101e857806370a08231146101fd5780637ecebe001461022657806395d89b41146102465780639dc29fac1461024e578063a3c573eb14610261578063a457c2d7146102a0578063a9059cbb146102b3578063cd0d0096146102c6578063d505accf146102ed578063dd62ed3e14610300578063ffa1ad7414610313575b600080fd5b610114610333565b6040516101219190610dae565b60405180910390f35b61013d610138366004610e18565b6103c5565b6040519015158152602001610121565b6002545b604051908152602001610121565b61015160008051602061105383398151915281565b61013d610182366004610e42565b6103df565b61015160008051602061103383398151915281565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610121565b610151610403565b61013d6101e3366004610e18565b61045f565b6101fb6101f6366004610e18565b610481565b005b61015161020b366004610e7e565b6001600160a01b031660009081526020819052604090205490565b610151610234366004610e7e565b60056020526000908152604090205481565b6101146104e0565b6101fb61025c366004610e18565b6104ef565b6102887f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610121565b61013d6102ae366004610e18565b610541565b61013d6102c1366004610e18565b6105bc565b6101517f000000000000000000000000000000000000000000000000000000000000000081565b6101fb6102fb366004610ea0565b6105ca565b61015161030e366004610f13565b6107f3565b610114604051806040016040528060018152602001603160f81b81525081565b60606003805461034290610f46565b80601f016020809104026020016040519081016040528092919081815260200182805461036e90610f46565b80156103bb5780601f10610390576101008083540402835291602001916103bb565b820191906000526020600020905b81548152906001019060200180831161039e57829003601f168201915b5050505050905090565b6000336103d381858561081e565b60019150505b92915050565b6000336103ed858285610943565b6103f88585856109bd565b506001949350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461461043a5761043546610b4f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000336103d381858561047283836107f3565b61047c9190610f96565b61081e565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104d25760405162461bcd60e51b81526004016104c990610fa9565b60405180910390fd5b6104dc8282610be9565b5050565b60606004805461034290610f46565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105375760405162461bcd60e51b81526004016104c990610fa9565b6104dc8282610c96565b6000338161054f82866107f3565b9050838110156105af5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104c9565b6103f8828686840361081e565b6000336103d38185856109bd565b834211156106265760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104c9565b6001600160a01b03871660009081526005602052604081208054600080516020611033833981519152918a918a918a91908661066183610ff9565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006106bf610403565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa15801561074a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906107805750896001600160a01b0316816001600160a01b0316145b6107dc5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104c9565b6107e78a8a8a61081e565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166108805760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104c9565b6001600160a01b0382166108e15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104c9565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600061094f84846107f3565b905060001981146109b757818110156109aa5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104c9565b6109b7848484840361081e565b50505050565b6001600160a01b038316610a215760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104c9565b6001600160a01b038216610a835760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104c9565b6001600160a01b03831660009081526020819052604090205481811015610afb5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104c9565b6001600160a01b0384811660008181526020818152604080832087870390559387168083529184902080548701905592518581529092600080516020611013833981519152910160405180910390a36109b7565b6000600080516020611053833981519152610b68610333565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c3f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104c9565b8060026000828254610c519190610f96565b90915550506001600160a01b03821660008181526020818152604080832080548601905551848152600080516020611013833981519152910160405180910390a35050565b6001600160a01b038216610cf65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104c9565b6001600160a01b03821660009081526020819052604090205481811015610d6a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104c9565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192916000805160206110138339815191529101610936565b600060208083528351808285015260005b81811015610ddb57858101830151858201604001528201610dbf565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610e1357600080fd5b919050565b60008060408385031215610e2b57600080fd5b610e3483610dfc565b946020939093013593505050565b600080600060608486031215610e5757600080fd5b610e6084610dfc565b9250610e6e60208501610dfc565b9150604084013590509250925092565b600060208284031215610e9057600080fd5b610e9982610dfc565b9392505050565b600080600080600080600060e0888a031215610ebb57600080fd5b610ec488610dfc565b9650610ed260208901610dfc565b95506040880135945060608801359350608088013560ff81168114610ef657600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f2657600080fd5b610f2f83610dfc565b9150610f3d60208401610dfc565b90509250929050565b600181811c90821680610f5a57607f821691505b602082108103610f7a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156103d9576103d9610f80565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b60006001820161100b5761100b610f80565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa26469706673582212203ea4a1224be7b5ef35dc397dfc81433d85cd6fdbf17d8b2e3d528071e7e612b564736f6c63430008140033501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe27545983a2646970667358221220baee82e4ee7f164b3d1e7f66a5c387364d25480bb9d2b43835d64170d591672664736f6c63430008140033", + "deployedBytecode": "0x608060405260043610620001285760003560e01c806315064c96146200012d5780632072f6c5146200015e57806322e95f2c1462000178578063240ff37814620001ac5780632cffd02e14620001c35780632d2c9d9414620001e85780632dfdf0b5146200020d578063318aee3d146200023457806334ac9cf214620002a25780633ae0504714620002c45780633e19704314620002dc578063647c576c146200030157806379e2cf97146200032657806381b1c174146200033e5780639e34070f1462000378578063aaa13cc214620003bd578063bab161bf14620003e2578063be5831c7146200041c578063cd5865791462000442578063d02103ca1462000459578063dbc169761462000482578063ee25560b146200049a578063fb57083414620004cb575b600080fd5b3480156200013a57600080fd5b50606854620001499060ff1681565b60405190151581526020015b60405180910390f35b3480156200016b57600080fd5b5062000176620004f0565b005b3480156200018557600080fd5b506200019d62000197366004620023cc565b62000528565b60405162000155919062002408565b62000176620001bd36600462002476565b6200057b565b348015620001d057600080fd5b5062000176620001e23660046200250c565b62000691565b348015620001f557600080fd5b5062000176620002073660046200250c565b62000a84565b3480156200021a57600080fd5b506200022560535481565b60405190815260200162000155565b3480156200024157600080fd5b506200027d62000253366004620025f1565b606b6020526000908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b0390911660208301520162000155565b348015620002af57600080fd5b50606c546200019d906001600160a01b031681565b348015620002d157600080fd5b506200022562000bc2565b348015620002e957600080fd5b5062000225620002fb36600462002628565b62000caa565b3480156200030e57600080fd5b506200017662000320366004620026b2565b62000d37565b3480156200033357600080fd5b506200017662000ebb565b3480156200034b57600080fd5b506200019d6200035d36600462002702565b606a602052600090815260409020546001600160a01b031681565b3480156200038557600080fd5b50620001496200039736600462002702565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b348015620003ca57600080fd5b506200019d620003dc3660046200271c565b62000edf565b348015620003ef57600080fd5b506068546200040690610100900463ffffffff1681565b60405163ffffffff909116815260200162000155565b3480156200042957600080fd5b506068546200040690600160c81b900463ffffffff1681565b6200017662000453366004620027cf565b62000ff6565b3480156200046657600080fd5b506068546200019d90600160281b90046001600160a01b031681565b3480156200048f57600080fd5b50620001766200138c565b348015620004a757600080fd5b5062000225620004b936600462002702565b60696020526000908152604090205481565b348015620004d857600080fd5b5062000149620004ea36600462002870565b620013c2565b606c546001600160a01b031633146200051c5760405163e2e8106b60e01b815260040160405180910390fd5b620005266200149b565b565b6000606a6000848460405160200162000543929190620028bd565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b60685460ff1615620005a057604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161480620005c65750600263ffffffff861610155b15620005e5576040516302caf51760e11b815260040160405180910390fd5b6000805160206200469a8339815191526001606860019054906101000a900463ffffffff163388883488886053546040516200062a9998979695949392919062002910565b60405180910390a162000679620006736001606860019054906101000a900463ffffffff16338989348989604051620006659291906200297f565b604051809103902062000caa565b620014f8565b82156200068a576200068a620015f6565b5050505050565b60685460ff1615620006b657604051630bc011ff60e21b815260040160405180910390fd5b620006cd8b8b8b8b8b8b8b8b8b8b8b60006200168e565b6001600160a01b0386166200077657604080516000808252602082019092526001600160a01b038616908590604051620007089190620029cb565b60006040518083038185875af1925050503d806000811462000747576040519150601f19603f3d011682016040523d82523d6000602084013e6200074c565b606091505b50509050806200076f57604051630ce8f45160e31b815260040160405180910390fd5b5062000a47565b60685463ffffffff610100909104811690881603620007ab57620007a56001600160a01b0387168585620017f7565b62000a47565b60008787604051602001620007c2929190620028bd565b60408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b031680620009df57600080806200080b8688018862002aa2565b925092509250600085848484604051620008259062002390565b620008339392919062002b45565b8190604051809103906000f590508015801562000854573d6000803e3d6000fd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f199062000888908d908d9060040162002b82565b600060405180830381600087803b158015620008a357600080fd5b505af1158015620008b8573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b604051620009cd95949392919062002b9b565b60405180910390a15050505062000a44565b6040516340c10f1960e01b81526001600160a01b038216906340c10f199062000a0f908990899060040162002b82565b600060405180830381600087803b15801562000a2a57600080fd5b505af115801562000a3f573d6000803e3d6000fd5b505050505b50505b600080516020620046ba8339815191528a8888878760405162000a6f95949392919062002bd6565b60405180910390a15050505050505050505050565b60685460ff161562000aa957604051630bc011ff60e21b815260040160405180910390fd5b62000ac08b8b8b8b8b8b8b8b8b8b8b60016200168e565b6000846001600160a01b031684888a868660405160240162000ae6949392919062002c0d565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162000b1d9190620029cb565b60006040518083038185875af1925050503d806000811462000b5c576040519150601f19603f3d011682016040523d82523d6000602084013e62000b61565b606091505b505090508062000b84576040516337e391c360e01b815260040160405180910390fd5b600080516020620046ba8339815191528b8989888860405162000bac95949392919062002bd6565b60405180910390a1505050505050505050505050565b605354600090819081805b602081101562000ca1578083901c60011660010362000c30576033816020811062000bfc5762000bfc62002c4a565b01548460405160200162000c1292919062002c60565b60405160208183030381529060405280519060200120935062000c5e565b838260405160200162000c4592919062002c60565b6040516020818303038152906040528051906020012093505b818260405160200162000c7392919062002c60565b604051602081830303815290604052805190602001209150808062000c989062002c84565b91505062000bcd565b50919392505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b600054610100900460ff161580801562000d585750600054600160ff909116105b8062000d7d575062000d6a3062001851565b15801562000d7d575060005460ff166001145b62000de65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000e0a576000805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff871602600160281b600160c81b03191617600160281b6001600160a01b038681169190910291909117909155606c80546001600160a01b03191691841691909117905562000e6e62001860565b801562000eb5576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854600160c81b900463ffffffff161015620005265762000526620015f6565b600080888860405160200162000ef7929190620028bd565b604051602081830303815290604052805190602001209050600060ff60f81b30836040518060200162000f2a9062002390565b601f1982820381018352601f90910116604081905262000f57908d908d908d908d908d9060200162002ca0565b60408051601f198184030181529082905262000f77929160200162002ce1565b6040516020818303038152906040528051906020012060405160200162000fd094939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b60685460ff16156200101b57604051630bc011ff60e21b815260040160405180910390fd5b6200102562001894565b60685463ffffffff8881166101009092041614806200104b5750600263ffffffff881610155b156200106a576040516302caf51760e11b815260040160405180910390fd5b6000806060876001600160a01b038816620010aa57883414620010a05760405163b89240f560e01b815260040160405180910390fd5b600092506200130e565b3415620010ca5760405163798ee6f160e01b815260040160405180910390fd5b6001600160a01b038089166000908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b900490921691810182905290156200118857604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac90620011409033908e9060040162002b82565b600060405180830381600087803b1580156200115b57600080fd5b505af115801562001170573d6000803e3d6000fd5b5050505080602001519450806000015193506200130c565b85156200119d576200119d898b8989620018ef565b6040516370a0823160e01b81526000906001600160a01b038b16906370a0823190620011ce90309060040162002408565b602060405180830381865afa158015620011ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001212919062002d14565b90506200122b6001600160a01b038b1633308e62001c51565b6040516370a0823160e01b81526000906001600160a01b038c16906370a08231906200125c90309060040162002408565b602060405180830381865afa1580156200127a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012a0919062002d14565b9050620012ae828262002d2e565b6068548c9850610100900463ffffffff1696509350620012ce8762001c8b565b620012d98c62001d52565b620012e48d62001e10565b604051602001620012f89392919062002b45565b604051602081830303815290604052945050505b505b6000805160206200469a833981519152600084868e8e86886053546040516200133f98979695949392919062002d44565b60405180910390a16200136462000673600085878f8f87898051906020012062000caa565b8615620013755762001375620015f6565b505050506200138360018055565b50505050505050565b606c546001600160a01b03163314620013b85760405163e2e8106b60e01b815260040160405180910390fd5b6200052662001ed7565b600084815b60208110156200148d57600163ffffffff8616821c811690036200143157858160208110620013fa57620013fa62002c4a565b6020020135826040516020016200141392919062002c60565b60405160208183030381529060405280519060200120915062001478565b8186826020811062001447576200144762002c4a565b60200201356040516020016200145f92919062002c60565b6040516020818303038152906040528051906020012091505b80620014848162002c84565b915050620013c7565b50821490505b949350505050565b60685460ff1615620014c057604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b806001620015096020600262002eae565b62001515919062002d2e565b6053541062001537576040516377ae67b360e11b815260040160405180910390fd5b60006053600081546200154a9062002c84565b9182905550905060005b6020811015620015e6578082901c6001166001036200158c57826033826020811062001584576200158462002c4a565b015550505050565b60338160208110620015a257620015a262002c4a565b015483604051602001620015b892919062002c60565b6040516020818303038152906040528051906020012092508080620015dd9062002c84565b91505062001554565b50620015f162002ebc565b505050565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d6200163f62000bc2565b6040518263ffffffff1660e01b81526004016200165e91815260200190565b600060405180830381600087803b1580156200167957600080fd5b505af115801562000eb5573d6000803e3d6000fd5b6200169f8b63ffffffff1662001f30565b606854600090600160281b90046001600160a01b031663257b3632620016c68d8d62001f7c565b6040518263ffffffff1660e01b8152600401620016e591815260200190565b6020604051808303816000875af115801562001705573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200172b919062002d14565b9050806000036200174e57604051622f6fad60e01b815260040160405180910390fd5b60685463ffffffff88811661010090920416146200177f576040516302caf51760e11b815260040160405180910390fd5b606854600090610100900463ffffffff166200179d575089620017a0565b508a5b620017c9620017c0848c8c8c8c8c8c8c604051620006659291906200297f565b8f8f84620013c2565b620017e7576040516338105f3b60e21b815260040160405180910390fd5b5050505050505050505050505050565b620015f18363a9059cbb60e01b84846040516024016200181992919062002b82565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262001fb1565b6001600160a01b03163b151590565b600054610100900460ff166200188a5760405162461bcd60e51b815260040162000ddd9062002ed2565b620005266200208a565b600260015403620018e85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000ddd565b6002600155565b600062001900600482848662002f1d565b6200190b9162002f49565b9050632afa533160e01b6001600160e01b031982160162001aac5760008080808080806200193d896004818d62002f1d565b8101906200194c919062002f7a565b9650965096509650965096509650336001600160a01b0316876001600160a01b0316146200198d5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0386163014620019b75760405163750643af60e01b815260040160405180910390fd5b8a8514620019d8576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e169162001a589190620029cb565b6000604051808303816000865af19150503d806000811462001a97576040519150601f19603f3d011682016040523d82523d6000602084013e62001a9c565b606091505b505050505050505050506200068a565b6001600160e01b031981166323f2ebc360e21b1462001ade57604051637141605d60e11b815260040160405180910390fd5b60008080808080808062001af68a6004818e62002f1d565b81019062001b05919062002fd5565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462001b485760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038716301462001b725760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169162001bfb9190620029cb565b6000604051808303816000865af19150503d806000811462001c3a576040519150601f19603f3d011682016040523d82523d6000602084013e62001c3f565b606091505b50505050505050505050505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905262000eb59085906323b872dd60e01b9060840162001819565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009182916001600160a01b0386169162001cd49190620029cb565b600060405180830381855afa9150503d806000811462001d11576040519150601f19603f3d011682016040523d82523d6000602084013e62001d16565b606091505b50915091508162001d4757604051806040016040528060078152602001664e4f5f4e414d4560c81b81525062001493565b6200149381620020b4565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009182916001600160a01b0386169162001d9b9190620029cb565b600060405180830381855afa9150503d806000811462001dd8576040519150601f19603f3d011682016040523d82523d6000602084013e62001ddd565b606091505b50915091508162001d4757604051806040016040528060098152602001681393d7d4d6535093d360ba1b81525062001493565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b0386169162001e589190620029cb565b600060405180830381855afa9150503d806000811462001e95576040519150601f19603f3d011682016040523d82523d6000602084013e62001e9a565b606091505b509150915081801562001eae575080516020145b62001ebb57601262001493565b8080602001905181019062001493919062003061565b60018055565b60685460ff1662001efb57604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600881901c60008181526069602052604081208054600160ff861690811b918218928390559290919081831690036200068a57604051630c8d9eab60e31b815260040160405180910390fd5b6000828260405160200162001f9392919062002c60565b60405160208183030381529060405280519060200120905092915050565b600062002008826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200225d9092919063ffffffff16565b805190915015620015f1578080602001905181019062002029919062003081565b620015f15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000ddd565b600054610100900460ff1662001ed15760405162461bcd60e51b815260040162000ddd9062002ed2565b60606040825110620020d65781806020019051810190620005759190620030a1565b81516020036200222a5760005b60208110801562002116575082818151811062002104576200210462002c4a565b01602001516001600160f81b03191615155b15620021315780620021288162002c84565b915050620020e3565b806000036200216a5750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b6000816001600160401b038111156200218757620021876200298f565b6040519080825280601f01601f191660200182016040528015620021b2576020820181803683370190505b50905060005b828110156200222257848181518110620021d657620021d662002c4a565b602001015160f81c60f81b828281518110620021f657620021f662002c4a565b60200101906001600160f81b031916908160001a90535080620022198162002c84565b915050620021b8565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b606062001493848460008585600080866001600160a01b03168587604051620022879190620029cb565b60006040518083038185875af1925050503d8060008114620022c6576040519150601f19603f3d011682016040523d82523d6000602084013e620022cb565b606091505b5091509150620022de87838387620022e9565b979650505050505050565b606083156200235d5782516000036200235557620023078562001851565b620023555760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000ddd565b508162001493565b620014938383815115620023745781518083602001fd5b8060405162461bcd60e51b815260040162000ddd919062003120565b611564806200313683390190565b803563ffffffff811681146200225857600080fd5b6001600160a01b0381168114620023c957600080fd5b50565b60008060408385031215620023e057600080fd5b620023eb836200239e565b91506020830135620023fd81620023b3565b809150509250929050565b6001600160a01b0391909116815260200190565b8015158114620023c957600080fd5b60008083601f8401126200243e57600080fd5b5081356001600160401b038111156200245657600080fd5b6020830191508360208285010111156200246f57600080fd5b9250929050565b6000806000806000608086880312156200248f57600080fd5b6200249a866200239e565b94506020860135620024ac81620023b3565b93506040860135620024be816200241c565b925060608601356001600160401b03811115620024da57600080fd5b620024e8888289016200242b565b969995985093965092949392505050565b8061040081018310156200057557600080fd5b60008060008060008060008060008060006105208c8e0312156200252f57600080fd5b6200253b8d8d620024f9565b9a506200254c6104008d016200239e565b99506104208c013598506104408c013597506200256d6104608d016200239e565b96506104808c01356200258081620023b3565b9550620025916104a08d016200239e565b94506104c08c0135620025a481620023b3565b93506104e08c013592506105008c01356001600160401b03811115620025c957600080fd5b620025d78e828f016200242b565b915080935050809150509295989b509295989b9093969950565b6000602082840312156200260457600080fd5b81356200261181620023b3565b9392505050565b60ff81168114620023c957600080fd5b600080600080600080600060e0888a0312156200264457600080fd5b8735620026518162002618565b965062002661602089016200239e565b955060408801356200267381620023b3565b945062002683606089016200239e565b935060808801356200269581620023b3565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215620026c857600080fd5b620026d3846200239e565b92506020840135620026e581620023b3565b91506040840135620026f781620023b3565b809150509250925092565b6000602082840312156200271557600080fd5b5035919050565b600080600080600080600060a0888a0312156200273857600080fd5b62002743886200239e565b965060208801356200275581620023b3565b955060408801356001600160401b03808211156200277257600080fd5b620027808b838c016200242b565b909750955060608a01359150808211156200279a57600080fd5b50620027a98a828b016200242b565b9094509250506080880135620027bf8162002618565b8091505092959891949750929550565b600080600080600080600060c0888a031215620027eb57600080fd5b620027f6886200239e565b965060208801356200280881620023b3565b95506040880135945060608801356200282181620023b3565b9350608088013562002833816200241c565b925060a08801356001600160401b038111156200284f57600080fd5b6200285d8a828b016200242b565b989b979a50959850939692959293505050565b60008060008061046085870312156200288857600080fd5b843593506200289b8660208701620024f9565b9250620028ac61042086016200239e565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c08301819052600091620029658483018789620028e7565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620029c2578181015183820152602001620029a8565b50506000910152565b60008251620029df818460208701620029a5565b9190910192915050565b604051601f8201601f191681016001600160401b038111828210171562002a145762002a146200298f565b604052919050565b60006001600160401b0382111562002a385762002a386200298f565b50601f01601f191660200190565b600082601f83011262002a5857600080fd5b813562002a6f62002a698262002a1c565b620029e9565b81815284602083860101111562002a8557600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562002ab857600080fd5b83356001600160401b038082111562002ad057600080fd5b62002ade8783880162002a46565b9450602086013591508082111562002af557600080fd5b5062002b048682870162002a46565b9250506040840135620026f78162002618565b6000815180845262002b31816020860160208601620029a5565b601f01601f19169290920160200192915050565b60608152600062002b5a606083018662002b17565b828103602084015262002b6e818662002b17565b91505060ff83166040830152949350505050565b6001600160a01b03929092168252602082015260400190565b63ffffffff861681526001600160a01b03858116602083015284166040820152608060608201819052600090620022de9083018486620028e7565b63ffffffff95861681529390941660208401526001600160a01b039182166040840152166060820152608081019190915260a00190565b6001600160a01b038516815263ffffffff8416602082015260606040820181905260009062002c409083018486620028e7565b9695505050505050565b634e487b7160e01b600052603260045260246000fd5b918252602082015260400190565b634e487b7160e01b600052601160045260246000fd5b60006001820162002c995762002c9962002c6e565b5060010190565b60608152600062002cb6606083018789620028e7565b828103602084015262002ccb818688620028e7565b91505060ff831660408301529695505050505050565b6000835162002cf5818460208801620029a5565b83519083019062002d0b818360208801620029a5565b01949350505050565b60006020828403121562002d2757600080fd5b5051919050565b8181038181111562000575576200057562002c6e565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c0830181905260009162002d988483018762002b17565b925080851660e085015250509998505050505050505050565b600181815b8085111562002df257816000190482111562002dd65762002dd662002c6e565b8085161562002de457918102915b93841c939080029062002db6565b509250929050565b60008262002e0b5750600162000575565b8162002e1a5750600062000575565b816001811462002e33576002811462002e3e5762002e5e565b600191505062000575565b60ff84111562002e525762002e5262002c6e565b50506001821b62000575565b5060208310610133831016604e8410600b841016171562002e83575081810a62000575565b62002e8f838362002db1565b806000190482111562002ea65762002ea662002c6e565b029392505050565b600062002611838362002dfa565b634e487b7160e01b600052600160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000808585111562002f2e57600080fd5b8386111562002f3c57600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101562002f725780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a03121562002f9657600080fd5b873562002fa381620023b3565b9650602088013562002fb581620023b3565b955060408801359450606088013593506080880135620026958162002618565b600080600080600080600080610100898b03121562002ff357600080fd5b88356200300081620023b3565b975060208901356200301281620023b3565b96506040890135955060608901359450608089013562003032816200241c565b935060a0890135620030448162002618565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200307457600080fd5b8151620026118162002618565b6000602082840312156200309457600080fd5b815162002611816200241c565b600060208284031215620030b457600080fd5b81516001600160401b03811115620030cb57600080fd5b8201601f81018413620030dd57600080fd5b8051620030ee62002a698262002a1c565b8181528560208385010111156200310457600080fd5b62003117826020830160208601620029a5565b95945050505050565b60208152600062002611602083018462002b1756fe6101006040523480156200001257600080fd5b50604051620015643803806200156483398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516110a8620004bc60003960006101a30152600081816102660152818161048c01526104fa0152600061043d0152600081816102cb015261040701526110a86000f3fe608060405234801561001057600080fd5b50600436106101075760003560e01c806306fdde031461010c578063095ea7b31461012a57806318160ddd1461014d57806320606b701461015f57806323b872dd1461017457806330adf81f14610187578063313ce5671461019c5780633644e515146101cd57806339509351146101d557806340c10f19146101e857806370a08231146101fd5780637ecebe001461022657806395d89b41146102465780639dc29fac1461024e578063a3c573eb14610261578063a457c2d7146102a0578063a9059cbb146102b3578063cd0d0096146102c6578063d505accf146102ed578063dd62ed3e14610300578063ffa1ad7414610313575b600080fd5b610114610333565b6040516101219190610dae565b60405180910390f35b61013d610138366004610e18565b6103c5565b6040519015158152602001610121565b6002545b604051908152602001610121565b61015160008051602061105383398151915281565b61013d610182366004610e42565b6103df565b61015160008051602061103383398151915281565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610121565b610151610403565b61013d6101e3366004610e18565b61045f565b6101fb6101f6366004610e18565b610481565b005b61015161020b366004610e7e565b6001600160a01b031660009081526020819052604090205490565b610151610234366004610e7e565b60056020526000908152604090205481565b6101146104e0565b6101fb61025c366004610e18565b6104ef565b6102887f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610121565b61013d6102ae366004610e18565b610541565b61013d6102c1366004610e18565b6105bc565b6101517f000000000000000000000000000000000000000000000000000000000000000081565b6101fb6102fb366004610ea0565b6105ca565b61015161030e366004610f13565b6107f3565b610114604051806040016040528060018152602001603160f81b81525081565b60606003805461034290610f46565b80601f016020809104026020016040519081016040528092919081815260200182805461036e90610f46565b80156103bb5780601f10610390576101008083540402835291602001916103bb565b820191906000526020600020905b81548152906001019060200180831161039e57829003601f168201915b5050505050905090565b6000336103d381858561081e565b60019150505b92915050565b6000336103ed858285610943565b6103f88585856109bd565b506001949350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461461043a5761043546610b4f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000336103d381858561047283836107f3565b61047c9190610f96565b61081e565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104d25760405162461bcd60e51b81526004016104c990610fa9565b60405180910390fd5b6104dc8282610be9565b5050565b60606004805461034290610f46565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105375760405162461bcd60e51b81526004016104c990610fa9565b6104dc8282610c96565b6000338161054f82866107f3565b9050838110156105af5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104c9565b6103f8828686840361081e565b6000336103d38185856109bd565b834211156106265760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104c9565b6001600160a01b03871660009081526005602052604081208054600080516020611033833981519152918a918a918a91908661066183610ff9565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006106bf610403565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa15801561074a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906107805750896001600160a01b0316816001600160a01b0316145b6107dc5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104c9565b6107e78a8a8a61081e565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166108805760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104c9565b6001600160a01b0382166108e15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104c9565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600061094f84846107f3565b905060001981146109b757818110156109aa5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104c9565b6109b7848484840361081e565b50505050565b6001600160a01b038316610a215760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104c9565b6001600160a01b038216610a835760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104c9565b6001600160a01b03831660009081526020819052604090205481811015610afb5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104c9565b6001600160a01b0384811660008181526020818152604080832087870390559387168083529184902080548701905592518581529092600080516020611013833981519152910160405180910390a36109b7565b6000600080516020611053833981519152610b68610333565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c3f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104c9565b8060026000828254610c519190610f96565b90915550506001600160a01b03821660008181526020818152604080832080548601905551848152600080516020611013833981519152910160405180910390a35050565b6001600160a01b038216610cf65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104c9565b6001600160a01b03821660009081526020819052604090205481811015610d6a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104c9565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192916000805160206110138339815191529101610936565b600060208083528351808285015260005b81811015610ddb57858101830151858201604001528201610dbf565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610e1357600080fd5b919050565b60008060408385031215610e2b57600080fd5b610e3483610dfc565b946020939093013593505050565b600080600060608486031215610e5757600080fd5b610e6084610dfc565b9250610e6e60208501610dfc565b9150604084013590509250925092565b600060208284031215610e9057600080fd5b610e9982610dfc565b9392505050565b600080600080600080600060e0888a031215610ebb57600080fd5b610ec488610dfc565b9650610ed260208901610dfc565b95506040880135945060608801359350608088013560ff81168114610ef657600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f2657600080fd5b610f2f83610dfc565b9150610f3d60208401610dfc565b90509250929050565b600181811c90821680610f5a57607f821691505b602082108103610f7a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156103d9576103d9610f80565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b60006001820161100b5761100b610f80565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa26469706673582212203ea4a1224be7b5ef35dc397dfc81433d85cd6fdbf17d8b2e3d528071e7e612b564736f6c63430008140033501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe27545983a2646970667358221220baee82e4ee7f164b3d1e7f66a5c387364d25480bb9d2b43835d64170d591672664736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMBridgeMock.json b/compiled-contracts/paris/PolygonZkEVMBridgeMock.json index 30c8d7fd9..1ad8182dd 100644 --- a/compiled-contracts/paris/PolygonZkEVMBridgeMock.json +++ b/compiled-contracts/paris/PolygonZkEVMBridgeMock.json @@ -867,8 +867,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561000f575f80fd5b506149238061001d5f395ff3fe6080604052600436106200016f575f3560e01c806315064c9614620001735780632072f6c514620001a357806322e95f2c14620001bc578063240ff37814620001ef5780632b5e42e714620002065780632c3f58cd146200022a5780632cffd02e146200024e5780632d2c9d9414620002725780632dfdf0b51462000296578063318aee3d14620002bc57806334ac9cf214620003285780633ae0504714620003495780633e1970431462000360578063647c576c1462000384578063715018a614620003a857806379e2cf9714620003bf57806381b1c17414620003d65780638da5cb5b146200040e57806391e57e2d14620004255780639e34070f146200043c578063aaa13cc2146200047f578063bab161bf14620004a3578063be5831c714620004dc578063cd5865791462000501578063d02103ca1462000518578063dbc169761462000540578063ee25560b1462000557578063f2fde38b1462000586578063fb57083414620005aa575b5f80fd5b3480156200017f575f80fd5b506068546200018e9060ff1681565b60405190151581526020015b60405180910390f35b348015620001af575f80fd5b50620001ba620005ce565b005b348015620001c8575f80fd5b50620001e0620001da366004620026d9565b62000606565b6040516200019a919062002713565b620001ba620002003660046200277c565b62000656565b34801562000212575f80fd5b50620001ba62000224366004620027fa565b6200076b565b34801562000236575f80fd5b50620001ba6200024836600462002812565b6200077a565b3480156200025a575f80fd5b50620001ba6200026c36600462002847565b620007a6565b3480156200027e575f80fd5b50620001ba6200029036600462002847565b62000b79565b348015620002a2575f80fd5b50620002ad60535481565b6040519081526020016200019a565b348015620002c8575f80fd5b5062000303620002da36600462002924565b606b6020525f908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b039091166020830152016200019a565b34801562000334575f80fd5b50606c54620001e0906001600160a01b031681565b34801562000355575f80fd5b50620002ad62000cb2565b3480156200036c575f80fd5b50620002ad6200037e36600462002951565b62000d99565b34801562000390575f80fd5b50620001ba620003a2366004620029d6565b62000e25565b348015620003b4575f80fd5b50620001ba62000faf565b348015620003cb575f80fd5b50620001ba62000fc4565b348015620003e2575f80fd5b50620001e0620003f4366004620027fa565b606a6020525f90815260409020546001600160a01b031681565b3480156200041a575f80fd5b50620001e062000fe8565b34801562000431575f80fd5b50620002ad60d15481565b34801562000448575f80fd5b506200018e6200045a366004620027fa565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b3480156200048b575f80fd5b50620001e06200049d36600462002a23565b62000ff7565b348015620004af575f80fd5b50606854620004c690610100900463ffffffff1681565b60405163ffffffff90911681526020016200019a565b348015620004e8575f80fd5b50606854620004c690600160c81b900463ffffffff1681565b620001ba6200051236600462002acf565b6200110c565b34801562000524575f80fd5b50606854620001e090600160281b90046001600160a01b031681565b3480156200054c575f80fd5b50620001ba620011b0565b34801562000563575f80fd5b50620002ad62000575366004620027fa565b60696020525f908152604090205481565b34801562000592575f80fd5b50620001ba620005a436600462002924565b620011e6565b348015620005b6575f80fd5b506200018e620005c836600462002b6a565b62001265565b606c546001600160a01b03163314620005fa5760405163e2e8106b60e01b815260040160405180910390fd5b620006046200133d565b565b5f606a5f84846040516020016200061f92919062002bb4565b60408051601f198184030181529181528151602092830120835290820192909252015f20546001600160a01b031690505b92915050565b60685460ff16156200067b57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161480620006a15750600263ffffffff861610155b15620006c0576040516302caf51760e11b815260040160405180910390fd5b5f80516020620048ae8339815191526001606860019054906101000a900463ffffffff16338888348888605354604051620007049998979695949392919062002c06565b60405180910390a1620007536200074d6001606860019054906101000a900463ffffffff163389893489896040516200073f92919062002c74565b604051809103902062000d99565b62001399565b821562000764576200076462001494565b5050505050565b6200077562001527565b60d155565b6200078462001527565b6068805463ffffffff9092166101000264ffffffff0019909216919091179055565b60685460ff1615620007cb57604051630bc011ff60e21b815260040160405180910390fd5b620007e18b8b8b8b8b8b8b8b8b8b8b5f6200158a565b6001600160a01b0386166200088657604080515f808252602082019092526001600160a01b0386169085906040516200081b919062002cbb565b5f6040518083038185875af1925050503d805f811462000857576040519150601f19603f3d011682016040523d82523d5f602084013e6200085c565b606091505b50509050806200087f57604051630ce8f45160e31b815260040160405180910390fd5b5062000b3d565b60685463ffffffff610100909104811690881603620008bb57620008b56001600160a01b0387168585620016ed565b62000b3d565b5f8787604051602001620008d192919062002bb4565b60408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b03168062000ada575f8080620009188688018862002d8c565b9250925092505f858484846040516200093190620026a2565b6200093f9392919062002e29565b8190604051809103905ff59050801580156200095d573d5f803e3d5ffd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f199062000991908d908d9060040162002e65565b5f604051808303815f87803b158015620009a9575f80fd5b505af1158015620009bc573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000ac895949392919062002e7e565b60405180910390a15050505062000b3a565b6040516340c10f1960e01b81526001600160a01b038216906340c10f199062000b0a908990899060040162002e65565b5f604051808303815f87803b15801562000b22575f80fd5b505af115801562000b35573d5f803e3d5ffd5b505050505b50505b5f80516020620048ce8339815191528a8888878760405162000b6495949392919062002eb8565b60405180910390a15050505050505050505050565b60685460ff161562000b9e57604051630bc011ff60e21b815260040160405180910390fd5b62000bb58b8b8b8b8b8b8b8b8b8b8b60016200158a565b5f846001600160a01b031684888a868660405160240162000bda949392919062002eef565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162000c11919062002cbb565b5f6040518083038185875af1925050503d805f811462000c4d576040519150601f19603f3d011682016040523d82523d5f602084013e62000c52565b606091505b505090508062000c75576040516337e391c360e01b815260040160405180910390fd5b5f80516020620048ce8339815191528b8989888860405162000c9c95949392919062002eb8565b60405180910390a1505050505050505050505050565b6053545f90819081805b602081101562000d90578083901c60011660010362000d1f576033816020811062000ceb5762000ceb62002f2b565b01548460405160200162000d0192919062002f3f565b60405160208183030381529060405280519060200120935062000d4d565b838260405160200162000d3492919062002f3f565b6040516020818303038152906040528051906020012093505b818260405160200162000d6292919062002f3f565b604051602081830303815290604052805190602001209150808062000d879062002f61565b91505062000cbc565b50919392505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b5f54610100900460ff161580801562000e4457505f54600160ff909116105b8062000e68575062000e563062001747565b15801562000e6857505f5460ff166001145b62000ed15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801562000ef3575f805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff871602600160281b600160c81b03191617600160281b6001600160a01b038681169190910291909117909155606c80546001600160a01b0319169184169190911790556703782dace9d9000060d15562000f6362001756565b801562000fa9575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b62000fb962001527565b620006045f620017c8565b605354606854600160c81b900463ffffffff16101562000604576200060462001494565b609f546001600160a01b031690565b5f8088886040516020016200100e92919062002bb4565b6040516020818303038152906040528051906020012090505f60ff60f81b3083604051806020016200104090620026a2565b601f1982820381018352601f9091011660408190526200106d908d908d908d908d908d9060200162002f7c565b60408051601f19818403018152908290526200108d929160200162002fbc565b60405160208183030381529060405280519060200120604051602001620010e694939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b60d154341115620011965760405162461bcd60e51b815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d6178457468656064820152667242726964676560c81b608482015260a40162000ec8565b620011a78787878787878762001819565b50505050505050565b606c546001600160a01b03163314620011dc5760405163e2e8106b60e01b815260040160405180910390fd5b6200060462001b94565b620011f062001527565b6001600160a01b038116620012575760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000ec8565b6200126281620017c8565b50565b5f84815b60208110156200132f57600163ffffffff8616821c81169003620012d3578581602081106200129c576200129c62002f2b565b602002013582604051602001620012b592919062002f3f565b6040516020818303038152906040528051906020012091506200131a565b81868260208110620012e957620012e962002f2b565b60200201356040516020016200130192919062002f3f565b6040516020818303038152906040528051906020012091505b80620013268162002f61565b91505062001269565b50821490505b949350505050565b60685460ff16156200136257604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b806001620013aa60206002620030e7565b620013b69190620030f4565b60535410620013d8576040516377ae67b360e11b815260040160405180910390fd5b5f60535f8154620013e99062002f61565b918290555090505f5b602081101562001484578082901c6001166001036200142a57826033826020811062001422576200142262002f2b565b015550505050565b6033816020811062001440576200144062002f2b565b0154836040516020016200145692919062002f3f565b60405160208183030381529060405280519060200120925080806200147b9062002f61565b915050620013f2565b506200148f6200310a565b505050565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d620014dd62000cb2565b6040518263ffffffff1660e01b8152600401620014fc91815260200190565b5f604051808303815f87803b15801562001514575f80fd5b505af115801562000fa9573d5f803e3d5ffd5b336200153262000fe8565b6001600160a01b031614620006045760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000ec8565b6200159b8b63ffffffff1662001bec565b6068545f90600160281b90046001600160a01b031663257b3632620015c18d8d62001c37565b6040518263ffffffff1660e01b8152600401620015e091815260200190565b6020604051808303815f875af1158015620015fd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200162391906200311e565b9050805f036200164557604051622f6fad60e01b815260040160405180910390fd5b60685463ffffffff888116610100909204161462001676576040516302caf51760e11b815260040160405180910390fd5b6068545f90610100900463ffffffff166200169357508962001696565b508a5b620016bf620016b6848c8c8c8c8c8c8c6040516200073f92919062002c74565b8f8f8462001265565b620016dd576040516338105f3b60e21b815260040160405180910390fd5b5050505050505050505050505050565b6200148f8363a9059cbb60e01b84846040516024016200170f92919062002e65565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262001c6b565b6001600160a01b03163b151590565b5f54610100900460ff16620017c25760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000ec8565b62000604335b609f80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60685460ff16156200183e57604051630bc011ff60e21b815260040160405180910390fd5b6200184862001d43565b60685463ffffffff8881166101009092041614806200186e5750600263ffffffff881610155b156200188d576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b038816620018cb57883414620018c25760405163b89240f560e01b815260040160405180910390fd5b5f925062001b22565b3415620018eb5760405163798ee6f160e01b815260040160405180910390fd5b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b90049092169181018290529015620019a257604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac90620019609033908e9060040162002e65565b5f604051808303815f87803b15801562001978575f80fd5b505af11580156200198b573d5f803e3d5ffd5b5050505080602001519450805f0151935062001b20565b8515620019b757620019b7898b898962001d9e565b6040516370a0823160e01b81525f906001600160a01b038b16906370a0823190620019e790309060040162002713565b602060405180830381865afa15801562001a03573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001a2991906200311e565b905062001a426001600160a01b038b1633308e620020f5565b6040516370a0823160e01b81525f906001600160a01b038c16906370a082319062001a7290309060040162002713565b602060405180830381865afa15801562001a8e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001ab491906200311e565b905062001ac28282620030f4565b6068548c9850610100900463ffffffff169650935062001ae2876200212f565b62001aed8c620021f2565b62001af88d620022ac565b60405160200162001b0c9392919062002e29565b604051602081830303815290604052945050505b505b5f80516020620048ae8339815191525f84868e8e868860535460405162001b5198979695949392919062003136565b60405180910390a162001b756200074d5f85878f8f87898051906020012062000d99565b861562001b865762001b8662001494565b50505050620011a760018055565b60685460ff1662001bb857604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b918218928390559290919081831690036200076457604051630c8d9eab60e31b815260040160405180910390fd5b5f828260405160200162001c4d92919062002f3f565b60405160208183030381529060405280519060200120905092915050565b5f62001cc1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620023699092919063ffffffff16565b8051909150156200148f578080602001905181019062001ce29190620031a2565b6200148f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000ec8565b60026001540362001d975760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000ec8565b6002600155565b5f62001dae6004828486620031c0565b62001db991620031e9565b9050632afa533160e01b6001600160e01b031982160162001f55575f80808080808062001dea896004818d620031c0565b81019062001df991906200321a565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161462001e3a5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038616301462001e645760405163750643af60e01b815260040160405180910390fd5b8a851462001e85576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e169162001f05919062002cbb565b5f604051808303815f865af19150503d805f811462001f40576040519150601f19603f3d011682016040523d82523d5f602084013e62001f45565b606091505b5050505050505050505062000764565b6001600160e01b031981166323f2ebc360e21b1462001f8757604051637141605d60e11b815260040160405180910390fd5b5f8080808080808062001f9e8a6004818e620031c0565b81019062001fad919062003270565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462001ff05760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146200201a5760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f1691620020a3919062002cbb565b5f604051808303815f865af19150503d805f8114620020de576040519150601f19603f3d011682016040523d82523d5f602084013e620020e3565b606091505b50505050505050505050505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905262000fa99085906323b872dd60e01b906084016200170f565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b17905290516060915f9182916001600160a01b0386169162002177919062002cbb565b5f60405180830381855afa9150503d805f8114620021b1576040519150601f19603f3d011682016040523d82523d5f602084013e620021b6565b606091505b509150915081620021e757604051806040016040528060078152602001664e4f5f4e414d4560c81b81525062001335565b620013358162002379565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b17905290516060915f9182916001600160a01b038616916200223a919062002cbb565b5f60405180830381855afa9150503d805f811462002274576040519150601f19603f3d011682016040523d82523d5f602084013e62002279565b606091505b509150915081620021e757604051806040016040528060098152602001681393d7d4d6535093d360ba1b81525062001335565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f91829182916001600160a01b03861691620022f3919062002cbb565b5f60405180830381855afa9150503d805f81146200232d576040519150601f19603f3d011682016040523d82523d5f602084013e62002332565b606091505b509150915081801562002346575080516020145b6200235357601262001335565b80806020019051810190620013359190620032f7565b60606200133584845f856200251d565b606060408251106200239b578180602001905181019062000650919062003315565b8151602003620024ea575f5b602081108015620023da5750828181518110620023c857620023c862002f2b565b01602001516001600160f81b03191615155b15620023f55780620023ec8162002f61565b915050620023a7565b805f036200242d5750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b5f816001600160401b0381111562002449576200244962002c83565b6040519080825280601f01601f19166020018201604052801562002474576020820181803683370190505b5090505f5b82811015620024e25784818151811062002497576200249762002f2b565b602001015160f81c60f81b828281518110620024b757620024b762002f2b565b60200101906001600160f81b03191690815f1a90535080620024d98162002f61565b91505062002479565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b606082471015620025805760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000ec8565b5f80866001600160a01b031685876040516200259d919062002cbb565b5f6040518083038185875af1925050503d805f8114620025d9576040519150601f19603f3d011682016040523d82523d5f602084013e620025de565b606091505b5091509150620025f187838387620025fc565b979650505050505050565b606083156200266f5782515f036200266757620026198562001747565b620026675760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000ec8565b508162001335565b620013358383815115620026865781518083602001fd5b8060405162461bcd60e51b815260040162000ec891906200338f565b61150a80620033a483390190565b803563ffffffff8116811462002518575f80fd5b6001600160a01b038116811462001262575f80fd5b5f8060408385031215620026eb575f80fd5b620026f683620026b0565b915060208301356200270881620026c4565b809150509250929050565b6001600160a01b0391909116815260200190565b801515811462001262575f80fd5b5f8083601f84011262002746575f80fd5b5081356001600160401b038111156200275d575f80fd5b60208301915083602082850101111562002775575f80fd5b9250929050565b5f805f805f6080868803121562002791575f80fd5b6200279c86620026b0565b94506020860135620027ae81620026c4565b93506040860135620027c08162002727565b925060608601356001600160401b03811115620027db575f80fd5b620027e98882890162002735565b969995985093965092949392505050565b5f602082840312156200280b575f80fd5b5035919050565b5f6020828403121562002823575f80fd5b6200282e82620026b0565b9392505050565b80610400810183101562000650575f80fd5b5f805f805f805f805f805f6105208c8e03121562002863575f80fd5b6200286f8d8d62002835565b9a50620028806104008d01620026b0565b99506104208c013598506104408c01359750620028a16104608d01620026b0565b96506104808c0135620028b481620026c4565b9550620028c56104a08d01620026b0565b94506104c08c0135620028d881620026c4565b93506104e08c013592506105008c01356001600160401b03811115620028fc575f80fd5b6200290a8e828f0162002735565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562002935575f80fd5b81356200282e81620026c4565b60ff8116811462001262575f80fd5b5f805f805f805f60e0888a03121562002968575f80fd5b8735620029758162002942565b96506200298560208901620026b0565b955060408801356200299781620026c4565b9450620029a760608901620026b0565b93506080880135620029b981620026c4565b9699959850939692959460a0840135945060c09093013592915050565b5f805f60608486031215620029e9575f80fd5b620029f484620026b0565b9250602084013562002a0681620026c4565b9150604084013562002a1881620026c4565b809150509250925092565b5f805f805f805f60a0888a03121562002a3a575f80fd5b62002a4588620026b0565b9650602088013562002a5781620026c4565b955060408801356001600160401b038082111562002a73575f80fd5b62002a818b838c0162002735565b909750955060608a013591508082111562002a9a575f80fd5b5062002aa98a828b0162002735565b909450925050608088013562002abf8162002942565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562002ae6575f80fd5b62002af188620026b0565b9650602088013562002b0381620026c4565b955060408801359450606088013562002b1c81620026c4565b9350608088013562002b2e8162002727565b925060a08801356001600160401b0381111562002b49575f80fd5b62002b578a828b0162002735565b989b979a50959850939692959293505050565b5f805f80610460858703121562002b7f575f80fd5b8435935062002b92866020870162002835565b925062002ba36104208601620026b0565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c083018190525f9162002c5a848301878962002bde565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101562002cb357818101518382015260200162002c99565b50505f910152565b5f825162002cce81846020870162002c97565b9190910192915050565b604051601f8201601f191681016001600160401b038111828210171562002d035762002d0362002c83565b604052919050565b5f6001600160401b0382111562002d265762002d2662002c83565b50601f01601f191660200190565b5f82601f83011262002d44575f80fd5b813562002d5b62002d558262002d0b565b62002cd8565b81815284602083860101111562002d70575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562002d9f575f80fd5b83356001600160401b038082111562002db6575f80fd5b62002dc48783880162002d34565b9450602086013591508082111562002dda575f80fd5b5062002de98682870162002d34565b925050604084013562002a188162002942565b5f815180845262002e1581602086016020860162002c97565b601f01601f19169290920160200192915050565b606081525f62002e3d606083018662002dfc565b828103602084015262002e51818662002dfc565b91505060ff83166040830152949350505050565b6001600160a01b03929092168252602082015260400190565b63ffffffff861681526001600160a01b038581166020830152841660408201526080606082018190525f90620025f1908301848662002bde565b63ffffffff95861681529390941660208401526001600160a01b039182166040840152166060820152608081019190915260a00190565b6001600160a01b038516815263ffffffff841660208201526060604082018190525f9062002f21908301848662002bde565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b918252602082015260400190565b634e487b7160e01b5f52601160045260245ffd5b5f6001820162002f755762002f7562002f4d565b5060010190565b606081525f62002f9160608301878962002bde565b828103602084015262002fa681868862002bde565b91505060ff831660408301529695505050505050565b5f835162002fcf81846020880162002c97565b83519083019062002fe581836020880162002c97565b01949350505050565b600181815b808511156200302e57815f190482111562003012576200301262002f4d565b808516156200302057918102915b93841c939080029062002ff3565b509250929050565b5f82620030465750600162000650565b816200305457505f62000650565b81600181146200306d5760028114620030785762003098565b600191505062000650565b60ff8411156200308c576200308c62002f4d565b50506001821b62000650565b5060208310610133831016604e8410600b8410161715620030bd575081810a62000650565b620030c9838362002fee565b805f1904821115620030df57620030df62002f4d565b029392505050565b5f6200282e838362003036565b8181038181111562000650576200065062002f4d565b634e487b7160e01b5f52600160045260245ffd5b5f602082840312156200312f575f80fd5b5051919050565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c083018190525f91620031898483018762002dfc565b925080851660e085015250509998505050505050505050565b5f60208284031215620031b3575f80fd5b81516200282e8162002727565b5f8085851115620031cf575f80fd5b83861115620031dc575f80fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015620032125780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562003231575f80fd5b87356200323e81620026c4565b965060208801356200325081620026c4565b955060408801359450606088013593506080880135620029b98162002942565b5f805f805f805f80610100898b03121562003289575f80fd5b88356200329681620026c4565b97506020890135620032a881620026c4565b965060408901359550606089013594506080890135620032c88162002727565b935060a0890135620032da8162002942565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562003308575f80fd5b81516200282e8162002942565b5f6020828403121562003326575f80fd5b81516001600160401b038111156200333c575f80fd5b8201601f810184136200334d575f80fd5b80516200335e62002d558262002d0b565b81815285602083850101111562003373575f80fd5b6200338682602083016020860162002c97565b95945050505050565b602081525f6200282e602083018462002dfc56fe61010060405234801562000011575f80fd5b506040516200150a3803806200150a833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161106c6200049e5f395f61019e01525f818161025f0152818161047f01526104ed01525f61043101525f81816102c401526103fb015261106c5ff3fe608060405234801561000f575f80fd5b5060043610610105575f3560e01c806306fdde0314610109578063095ea7b31461012757806318160ddd1461014a57806320606b701461015c57806323b872dd1461017057806330adf81f14610183578063313ce567146101975780633644e515146101c857806339509351146101d057806340c10f19146101e357806370a08231146101f85780637ecebe001461022057806395d89b411461023f5780639dc29fac14610247578063a3c573eb1461025a578063a457c2d714610299578063a9059cbb146102ac578063cd0d0096146102bf578063d505accf146102e6578063dd62ed3e146102f9578063ffa1ad741461030c575b5f80fd5b61011161032c565b60405161011e9190610d8a565b60405180910390f35b61013a610135366004610df0565b6103bc565b604051901515815260200161011e565b6002545b60405190815260200161011e565b61014e5f8051602061101783398151915281565b61013a61017e366004610e18565b6103d5565b61014e5f80516020610ff783398151915281565b60405160ff7f000000000000000000000000000000000000000000000000000000000000000016815260200161011e565b61014e6103f8565b61013a6101de366004610df0565b610453565b6101f66101f1366004610df0565b610474565b005b61014e610206366004610e51565b6001600160a01b03165f9081526020819052604090205490565b61014e61022e366004610e51565b60056020525f908152604090205481565b6101116104d3565b6101f6610255366004610df0565b6104e2565b6102817f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161011e565b61013a6102a7366004610df0565b610534565b61013a6102ba366004610df0565b6105ae565b61014e7f000000000000000000000000000000000000000000000000000000000000000081565b6101f66102f4366004610e71565b6105bb565b61014e610307366004610ede565b6107de565b610111604051806040016040528060018152602001603160f81b81525081565b60606003805461033b90610f0f565b80601f016020809104026020016040519081016040528092919081815260200182805461036790610f0f565b80156103b25780601f10610389576101008083540402835291602001916103b2565b820191905f5260205f20905b81548152906001019060200180831161039557829003601f168201915b5050505050905090565b5f336103c9818585610808565b60019150505b92915050565b5f336103e285828561092c565b6103ed8585856109a4565b506001949350505050565b5f7f0000000000000000000000000000000000000000000000000000000000000000461461042e5761042946610b33565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b5f336103c981858561046583836107de565b61046f9190610f5b565b610808565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104c55760405162461bcd60e51b81526004016104bc90610f6e565b60405180910390fd5b6104cf8282610bcb565b5050565b60606004805461033b90610f0f565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461052a5760405162461bcd60e51b81526004016104bc90610f6e565b6104cf8282610c75565b5f338161054182866107de565b9050838110156105a15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104bc565b6103ed8286868403610808565b5f336103c98185856109a4565b834211156106175760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104bc565b6001600160a01b0387165f90815260056020526040812080545f80516020610ff7833981519152918a918a918a91908661065083610fbe565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6106ad6103f8565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f1981840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610735573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381161580159061076b5750896001600160a01b0316816001600160a01b0316145b6107c75760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104bc565b6107d28a8a8a610808565b50505050505050505050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661086a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104bc565b6001600160a01b0382166108cb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104bc565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b5f61093784846107de565b90505f19811461099e57818110156109915760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104bc565b61099e8484848403610808565b50505050565b6001600160a01b038316610a085760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104bc565b6001600160a01b038216610a6a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104bc565b6001600160a01b0383165f9081526020819052604090205481811015610ae15760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104bc565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290925f80516020610fd7833981519152910160405180910390a361099e565b5f5f80516020611017833981519152610b4a61032c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c215760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104bc565b8060025f828254610c329190610f5b565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481525f80516020610fd7833981519152910160405180910390a35050565b6001600160a01b038216610cd55760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104bc565b6001600160a01b0382165f9081526020819052604090205481811015610d485760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104bc565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192915f80516020610fd7833981519152910161091f565b5f6020808352835180828501525f5b81811015610db557858101830151858201604001528201610d99565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610deb575f80fd5b919050565b5f8060408385031215610e01575f80fd5b610e0a83610dd5565b946020939093013593505050565b5f805f60608486031215610e2a575f80fd5b610e3384610dd5565b9250610e4160208501610dd5565b9150604084013590509250925092565b5f60208284031215610e61575f80fd5b610e6a82610dd5565b9392505050565b5f805f805f805f60e0888a031215610e87575f80fd5b610e9088610dd5565b9650610e9e60208901610dd5565b95506040880135945060608801359350608088013560ff81168114610ec1575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215610eef575f80fd5b610ef883610dd5565b9150610f0660208401610dd5565b90509250929050565b600181811c90821680610f2357607f821691505b602082108103610f4157634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156103cf576103cf610f47565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b5f60018201610fcf57610fcf610f47565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa26469706673582212206c12be332dd873b7cf88c58dfc4762858b63e8ff3bf8563b47828a5a4272643b64736f6c63430008140033501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe27545983a264697066735822122053f0ff7165bbc1149198710f0462239d3d51d7dcf1f5f963d7b1104b715a928964736f6c63430008140033", - "deployedBytecode": "0x6080604052600436106200016f575f3560e01c806315064c9614620001735780632072f6c514620001a357806322e95f2c14620001bc578063240ff37814620001ef5780632b5e42e714620002065780632c3f58cd146200022a5780632cffd02e146200024e5780632d2c9d9414620002725780632dfdf0b51462000296578063318aee3d14620002bc57806334ac9cf214620003285780633ae0504714620003495780633e1970431462000360578063647c576c1462000384578063715018a614620003a857806379e2cf9714620003bf57806381b1c17414620003d65780638da5cb5b146200040e57806391e57e2d14620004255780639e34070f146200043c578063aaa13cc2146200047f578063bab161bf14620004a3578063be5831c714620004dc578063cd5865791462000501578063d02103ca1462000518578063dbc169761462000540578063ee25560b1462000557578063f2fde38b1462000586578063fb57083414620005aa575b5f80fd5b3480156200017f575f80fd5b506068546200018e9060ff1681565b60405190151581526020015b60405180910390f35b348015620001af575f80fd5b50620001ba620005ce565b005b348015620001c8575f80fd5b50620001e0620001da366004620026d9565b62000606565b6040516200019a919062002713565b620001ba620002003660046200277c565b62000656565b34801562000212575f80fd5b50620001ba62000224366004620027fa565b6200076b565b34801562000236575f80fd5b50620001ba6200024836600462002812565b6200077a565b3480156200025a575f80fd5b50620001ba6200026c36600462002847565b620007a6565b3480156200027e575f80fd5b50620001ba6200029036600462002847565b62000b79565b348015620002a2575f80fd5b50620002ad60535481565b6040519081526020016200019a565b348015620002c8575f80fd5b5062000303620002da36600462002924565b606b6020525f908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b039091166020830152016200019a565b34801562000334575f80fd5b50606c54620001e0906001600160a01b031681565b34801562000355575f80fd5b50620002ad62000cb2565b3480156200036c575f80fd5b50620002ad6200037e36600462002951565b62000d99565b34801562000390575f80fd5b50620001ba620003a2366004620029d6565b62000e25565b348015620003b4575f80fd5b50620001ba62000faf565b348015620003cb575f80fd5b50620001ba62000fc4565b348015620003e2575f80fd5b50620001e0620003f4366004620027fa565b606a6020525f90815260409020546001600160a01b031681565b3480156200041a575f80fd5b50620001e062000fe8565b34801562000431575f80fd5b50620002ad60d15481565b34801562000448575f80fd5b506200018e6200045a366004620027fa565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b3480156200048b575f80fd5b50620001e06200049d36600462002a23565b62000ff7565b348015620004af575f80fd5b50606854620004c690610100900463ffffffff1681565b60405163ffffffff90911681526020016200019a565b348015620004e8575f80fd5b50606854620004c690600160c81b900463ffffffff1681565b620001ba6200051236600462002acf565b6200110c565b34801562000524575f80fd5b50606854620001e090600160281b90046001600160a01b031681565b3480156200054c575f80fd5b50620001ba620011b0565b34801562000563575f80fd5b50620002ad62000575366004620027fa565b60696020525f908152604090205481565b34801562000592575f80fd5b50620001ba620005a436600462002924565b620011e6565b348015620005b6575f80fd5b506200018e620005c836600462002b6a565b62001265565b606c546001600160a01b03163314620005fa5760405163e2e8106b60e01b815260040160405180910390fd5b620006046200133d565b565b5f606a5f84846040516020016200061f92919062002bb4565b60408051601f198184030181529181528151602092830120835290820192909252015f20546001600160a01b031690505b92915050565b60685460ff16156200067b57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161480620006a15750600263ffffffff861610155b15620006c0576040516302caf51760e11b815260040160405180910390fd5b5f80516020620048ae8339815191526001606860019054906101000a900463ffffffff16338888348888605354604051620007049998979695949392919062002c06565b60405180910390a1620007536200074d6001606860019054906101000a900463ffffffff163389893489896040516200073f92919062002c74565b604051809103902062000d99565b62001399565b821562000764576200076462001494565b5050505050565b6200077562001527565b60d155565b6200078462001527565b6068805463ffffffff9092166101000264ffffffff0019909216919091179055565b60685460ff1615620007cb57604051630bc011ff60e21b815260040160405180910390fd5b620007e18b8b8b8b8b8b8b8b8b8b8b5f6200158a565b6001600160a01b0386166200088657604080515f808252602082019092526001600160a01b0386169085906040516200081b919062002cbb565b5f6040518083038185875af1925050503d805f811462000857576040519150601f19603f3d011682016040523d82523d5f602084013e6200085c565b606091505b50509050806200087f57604051630ce8f45160e31b815260040160405180910390fd5b5062000b3d565b60685463ffffffff610100909104811690881603620008bb57620008b56001600160a01b0387168585620016ed565b62000b3d565b5f8787604051602001620008d192919062002bb4565b60408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b03168062000ada575f8080620009188688018862002d8c565b9250925092505f858484846040516200093190620026a2565b6200093f9392919062002e29565b8190604051809103905ff59050801580156200095d573d5f803e3d5ffd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f199062000991908d908d9060040162002e65565b5f604051808303815f87803b158015620009a9575f80fd5b505af1158015620009bc573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000ac895949392919062002e7e565b60405180910390a15050505062000b3a565b6040516340c10f1960e01b81526001600160a01b038216906340c10f199062000b0a908990899060040162002e65565b5f604051808303815f87803b15801562000b22575f80fd5b505af115801562000b35573d5f803e3d5ffd5b505050505b50505b5f80516020620048ce8339815191528a8888878760405162000b6495949392919062002eb8565b60405180910390a15050505050505050505050565b60685460ff161562000b9e57604051630bc011ff60e21b815260040160405180910390fd5b62000bb58b8b8b8b8b8b8b8b8b8b8b60016200158a565b5f846001600160a01b031684888a868660405160240162000bda949392919062002eef565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162000c11919062002cbb565b5f6040518083038185875af1925050503d805f811462000c4d576040519150601f19603f3d011682016040523d82523d5f602084013e62000c52565b606091505b505090508062000c75576040516337e391c360e01b815260040160405180910390fd5b5f80516020620048ce8339815191528b8989888860405162000c9c95949392919062002eb8565b60405180910390a1505050505050505050505050565b6053545f90819081805b602081101562000d90578083901c60011660010362000d1f576033816020811062000ceb5762000ceb62002f2b565b01548460405160200162000d0192919062002f3f565b60405160208183030381529060405280519060200120935062000d4d565b838260405160200162000d3492919062002f3f565b6040516020818303038152906040528051906020012093505b818260405160200162000d6292919062002f3f565b604051602081830303815290604052805190602001209150808062000d879062002f61565b91505062000cbc565b50919392505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b5f54610100900460ff161580801562000e4457505f54600160ff909116105b8062000e68575062000e563062001747565b15801562000e6857505f5460ff166001145b62000ed15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801562000ef3575f805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff871602600160281b600160c81b03191617600160281b6001600160a01b038681169190910291909117909155606c80546001600160a01b0319169184169190911790556703782dace9d9000060d15562000f6362001756565b801562000fa9575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b62000fb962001527565b620006045f620017c8565b605354606854600160c81b900463ffffffff16101562000604576200060462001494565b609f546001600160a01b031690565b5f8088886040516020016200100e92919062002bb4565b6040516020818303038152906040528051906020012090505f60ff60f81b3083604051806020016200104090620026a2565b601f1982820381018352601f9091011660408190526200106d908d908d908d908d908d9060200162002f7c565b60408051601f19818403018152908290526200108d929160200162002fbc565b60405160208183030381529060405280519060200120604051602001620010e694939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b60d154341115620011965760405162461bcd60e51b815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d6178457468656064820152667242726964676560c81b608482015260a40162000ec8565b620011a78787878787878762001819565b50505050505050565b606c546001600160a01b03163314620011dc5760405163e2e8106b60e01b815260040160405180910390fd5b6200060462001b94565b620011f062001527565b6001600160a01b038116620012575760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000ec8565b6200126281620017c8565b50565b5f84815b60208110156200132f57600163ffffffff8616821c81169003620012d3578581602081106200129c576200129c62002f2b565b602002013582604051602001620012b592919062002f3f565b6040516020818303038152906040528051906020012091506200131a565b81868260208110620012e957620012e962002f2b565b60200201356040516020016200130192919062002f3f565b6040516020818303038152906040528051906020012091505b80620013268162002f61565b91505062001269565b50821490505b949350505050565b60685460ff16156200136257604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b806001620013aa60206002620030e7565b620013b69190620030f4565b60535410620013d8576040516377ae67b360e11b815260040160405180910390fd5b5f60535f8154620013e99062002f61565b918290555090505f5b602081101562001484578082901c6001166001036200142a57826033826020811062001422576200142262002f2b565b015550505050565b6033816020811062001440576200144062002f2b565b0154836040516020016200145692919062002f3f565b60405160208183030381529060405280519060200120925080806200147b9062002f61565b915050620013f2565b506200148f6200310a565b505050565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d620014dd62000cb2565b6040518263ffffffff1660e01b8152600401620014fc91815260200190565b5f604051808303815f87803b15801562001514575f80fd5b505af115801562000fa9573d5f803e3d5ffd5b336200153262000fe8565b6001600160a01b031614620006045760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000ec8565b6200159b8b63ffffffff1662001bec565b6068545f90600160281b90046001600160a01b031663257b3632620015c18d8d62001c37565b6040518263ffffffff1660e01b8152600401620015e091815260200190565b6020604051808303815f875af1158015620015fd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200162391906200311e565b9050805f036200164557604051622f6fad60e01b815260040160405180910390fd5b60685463ffffffff888116610100909204161462001676576040516302caf51760e11b815260040160405180910390fd5b6068545f90610100900463ffffffff166200169357508962001696565b508a5b620016bf620016b6848c8c8c8c8c8c8c6040516200073f92919062002c74565b8f8f8462001265565b620016dd576040516338105f3b60e21b815260040160405180910390fd5b5050505050505050505050505050565b6200148f8363a9059cbb60e01b84846040516024016200170f92919062002e65565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262001c6b565b6001600160a01b03163b151590565b5f54610100900460ff16620017c25760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000ec8565b62000604335b609f80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60685460ff16156200183e57604051630bc011ff60e21b815260040160405180910390fd5b6200184862001d43565b60685463ffffffff8881166101009092041614806200186e5750600263ffffffff881610155b156200188d576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b038816620018cb57883414620018c25760405163b89240f560e01b815260040160405180910390fd5b5f925062001b22565b3415620018eb5760405163798ee6f160e01b815260040160405180910390fd5b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b90049092169181018290529015620019a257604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac90620019609033908e9060040162002e65565b5f604051808303815f87803b15801562001978575f80fd5b505af11580156200198b573d5f803e3d5ffd5b5050505080602001519450805f0151935062001b20565b8515620019b757620019b7898b898962001d9e565b6040516370a0823160e01b81525f906001600160a01b038b16906370a0823190620019e790309060040162002713565b602060405180830381865afa15801562001a03573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001a2991906200311e565b905062001a426001600160a01b038b1633308e620020f5565b6040516370a0823160e01b81525f906001600160a01b038c16906370a082319062001a7290309060040162002713565b602060405180830381865afa15801562001a8e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001ab491906200311e565b905062001ac28282620030f4565b6068548c9850610100900463ffffffff169650935062001ae2876200212f565b62001aed8c620021f2565b62001af88d620022ac565b60405160200162001b0c9392919062002e29565b604051602081830303815290604052945050505b505b5f80516020620048ae8339815191525f84868e8e868860535460405162001b5198979695949392919062003136565b60405180910390a162001b756200074d5f85878f8f87898051906020012062000d99565b861562001b865762001b8662001494565b50505050620011a760018055565b60685460ff1662001bb857604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b918218928390559290919081831690036200076457604051630c8d9eab60e31b815260040160405180910390fd5b5f828260405160200162001c4d92919062002f3f565b60405160208183030381529060405280519060200120905092915050565b5f62001cc1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620023699092919063ffffffff16565b8051909150156200148f578080602001905181019062001ce29190620031a2565b6200148f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000ec8565b60026001540362001d975760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000ec8565b6002600155565b5f62001dae6004828486620031c0565b62001db991620031e9565b9050632afa533160e01b6001600160e01b031982160162001f55575f80808080808062001dea896004818d620031c0565b81019062001df991906200321a565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161462001e3a5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038616301462001e645760405163750643af60e01b815260040160405180910390fd5b8a851462001e85576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e169162001f05919062002cbb565b5f604051808303815f865af19150503d805f811462001f40576040519150601f19603f3d011682016040523d82523d5f602084013e62001f45565b606091505b5050505050505050505062000764565b6001600160e01b031981166323f2ebc360e21b1462001f8757604051637141605d60e11b815260040160405180910390fd5b5f8080808080808062001f9e8a6004818e620031c0565b81019062001fad919062003270565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462001ff05760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146200201a5760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f1691620020a3919062002cbb565b5f604051808303815f865af19150503d805f8114620020de576040519150601f19603f3d011682016040523d82523d5f602084013e620020e3565b606091505b50505050505050505050505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905262000fa99085906323b872dd60e01b906084016200170f565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b17905290516060915f9182916001600160a01b0386169162002177919062002cbb565b5f60405180830381855afa9150503d805f8114620021b1576040519150601f19603f3d011682016040523d82523d5f602084013e620021b6565b606091505b509150915081620021e757604051806040016040528060078152602001664e4f5f4e414d4560c81b81525062001335565b620013358162002379565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b17905290516060915f9182916001600160a01b038616916200223a919062002cbb565b5f60405180830381855afa9150503d805f811462002274576040519150601f19603f3d011682016040523d82523d5f602084013e62002279565b606091505b509150915081620021e757604051806040016040528060098152602001681393d7d4d6535093d360ba1b81525062001335565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f91829182916001600160a01b03861691620022f3919062002cbb565b5f60405180830381855afa9150503d805f81146200232d576040519150601f19603f3d011682016040523d82523d5f602084013e62002332565b606091505b509150915081801562002346575080516020145b6200235357601262001335565b80806020019051810190620013359190620032f7565b60606200133584845f856200251d565b606060408251106200239b578180602001905181019062000650919062003315565b8151602003620024ea575f5b602081108015620023da5750828181518110620023c857620023c862002f2b565b01602001516001600160f81b03191615155b15620023f55780620023ec8162002f61565b915050620023a7565b805f036200242d5750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b5f816001600160401b0381111562002449576200244962002c83565b6040519080825280601f01601f19166020018201604052801562002474576020820181803683370190505b5090505f5b82811015620024e25784818151811062002497576200249762002f2b565b602001015160f81c60f81b828281518110620024b757620024b762002f2b565b60200101906001600160f81b03191690815f1a90535080620024d98162002f61565b91505062002479565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b606082471015620025805760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000ec8565b5f80866001600160a01b031685876040516200259d919062002cbb565b5f6040518083038185875af1925050503d805f8114620025d9576040519150601f19603f3d011682016040523d82523d5f602084013e620025de565b606091505b5091509150620025f187838387620025fc565b979650505050505050565b606083156200266f5782515f036200266757620026198562001747565b620026675760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000ec8565b508162001335565b620013358383815115620026865781518083602001fd5b8060405162461bcd60e51b815260040162000ec891906200338f565b61150a80620033a483390190565b803563ffffffff8116811462002518575f80fd5b6001600160a01b038116811462001262575f80fd5b5f8060408385031215620026eb575f80fd5b620026f683620026b0565b915060208301356200270881620026c4565b809150509250929050565b6001600160a01b0391909116815260200190565b801515811462001262575f80fd5b5f8083601f84011262002746575f80fd5b5081356001600160401b038111156200275d575f80fd5b60208301915083602082850101111562002775575f80fd5b9250929050565b5f805f805f6080868803121562002791575f80fd5b6200279c86620026b0565b94506020860135620027ae81620026c4565b93506040860135620027c08162002727565b925060608601356001600160401b03811115620027db575f80fd5b620027e98882890162002735565b969995985093965092949392505050565b5f602082840312156200280b575f80fd5b5035919050565b5f6020828403121562002823575f80fd5b6200282e82620026b0565b9392505050565b80610400810183101562000650575f80fd5b5f805f805f805f805f805f6105208c8e03121562002863575f80fd5b6200286f8d8d62002835565b9a50620028806104008d01620026b0565b99506104208c013598506104408c01359750620028a16104608d01620026b0565b96506104808c0135620028b481620026c4565b9550620028c56104a08d01620026b0565b94506104c08c0135620028d881620026c4565b93506104e08c013592506105008c01356001600160401b03811115620028fc575f80fd5b6200290a8e828f0162002735565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562002935575f80fd5b81356200282e81620026c4565b60ff8116811462001262575f80fd5b5f805f805f805f60e0888a03121562002968575f80fd5b8735620029758162002942565b96506200298560208901620026b0565b955060408801356200299781620026c4565b9450620029a760608901620026b0565b93506080880135620029b981620026c4565b9699959850939692959460a0840135945060c09093013592915050565b5f805f60608486031215620029e9575f80fd5b620029f484620026b0565b9250602084013562002a0681620026c4565b9150604084013562002a1881620026c4565b809150509250925092565b5f805f805f805f60a0888a03121562002a3a575f80fd5b62002a4588620026b0565b9650602088013562002a5781620026c4565b955060408801356001600160401b038082111562002a73575f80fd5b62002a818b838c0162002735565b909750955060608a013591508082111562002a9a575f80fd5b5062002aa98a828b0162002735565b909450925050608088013562002abf8162002942565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562002ae6575f80fd5b62002af188620026b0565b9650602088013562002b0381620026c4565b955060408801359450606088013562002b1c81620026c4565b9350608088013562002b2e8162002727565b925060a08801356001600160401b0381111562002b49575f80fd5b62002b578a828b0162002735565b989b979a50959850939692959293505050565b5f805f80610460858703121562002b7f575f80fd5b8435935062002b92866020870162002835565b925062002ba36104208601620026b0565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c083018190525f9162002c5a848301878962002bde565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101562002cb357818101518382015260200162002c99565b50505f910152565b5f825162002cce81846020870162002c97565b9190910192915050565b604051601f8201601f191681016001600160401b038111828210171562002d035762002d0362002c83565b604052919050565b5f6001600160401b0382111562002d265762002d2662002c83565b50601f01601f191660200190565b5f82601f83011262002d44575f80fd5b813562002d5b62002d558262002d0b565b62002cd8565b81815284602083860101111562002d70575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562002d9f575f80fd5b83356001600160401b038082111562002db6575f80fd5b62002dc48783880162002d34565b9450602086013591508082111562002dda575f80fd5b5062002de98682870162002d34565b925050604084013562002a188162002942565b5f815180845262002e1581602086016020860162002c97565b601f01601f19169290920160200192915050565b606081525f62002e3d606083018662002dfc565b828103602084015262002e51818662002dfc565b91505060ff83166040830152949350505050565b6001600160a01b03929092168252602082015260400190565b63ffffffff861681526001600160a01b038581166020830152841660408201526080606082018190525f90620025f1908301848662002bde565b63ffffffff95861681529390941660208401526001600160a01b039182166040840152166060820152608081019190915260a00190565b6001600160a01b038516815263ffffffff841660208201526060604082018190525f9062002f21908301848662002bde565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b918252602082015260400190565b634e487b7160e01b5f52601160045260245ffd5b5f6001820162002f755762002f7562002f4d565b5060010190565b606081525f62002f9160608301878962002bde565b828103602084015262002fa681868862002bde565b91505060ff831660408301529695505050505050565b5f835162002fcf81846020880162002c97565b83519083019062002fe581836020880162002c97565b01949350505050565b600181815b808511156200302e57815f190482111562003012576200301262002f4d565b808516156200302057918102915b93841c939080029062002ff3565b509250929050565b5f82620030465750600162000650565b816200305457505f62000650565b81600181146200306d5760028114620030785762003098565b600191505062000650565b60ff8411156200308c576200308c62002f4d565b50506001821b62000650565b5060208310610133831016604e8410600b8410161715620030bd575081810a62000650565b620030c9838362002fee565b805f1904821115620030df57620030df62002f4d565b029392505050565b5f6200282e838362003036565b8181038181111562000650576200065062002f4d565b634e487b7160e01b5f52600160045260245ffd5b5f602082840312156200312f575f80fd5b5051919050565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c083018190525f91620031898483018762002dfc565b925080851660e085015250509998505050505050505050565b5f60208284031215620031b3575f80fd5b81516200282e8162002727565b5f8085851115620031cf575f80fd5b83861115620031dc575f80fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015620032125780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562003231575f80fd5b87356200323e81620026c4565b965060208801356200325081620026c4565b955060408801359450606088013593506080880135620029b98162002942565b5f805f805f805f80610100898b03121562003289575f80fd5b88356200329681620026c4565b97506020890135620032a881620026c4565b965060408901359550606089013594506080890135620032c88162002727565b935060a0890135620032da8162002942565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562003308575f80fd5b81516200282e8162002942565b5f6020828403121562003326575f80fd5b81516001600160401b038111156200333c575f80fd5b8201601f810184136200334d575f80fd5b80516200335e62002d558262002d0b565b81815285602083850101111562003373575f80fd5b6200338682602083016020860162002c97565b95945050505050565b602081525f6200282e602083018462002dfc56fe61010060405234801562000011575f80fd5b506040516200150a3803806200150a833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161106c6200049e5f395f61019e01525f818161025f0152818161047f01526104ed01525f61043101525f81816102c401526103fb015261106c5ff3fe608060405234801561000f575f80fd5b5060043610610105575f3560e01c806306fdde0314610109578063095ea7b31461012757806318160ddd1461014a57806320606b701461015c57806323b872dd1461017057806330adf81f14610183578063313ce567146101975780633644e515146101c857806339509351146101d057806340c10f19146101e357806370a08231146101f85780637ecebe001461022057806395d89b411461023f5780639dc29fac14610247578063a3c573eb1461025a578063a457c2d714610299578063a9059cbb146102ac578063cd0d0096146102bf578063d505accf146102e6578063dd62ed3e146102f9578063ffa1ad741461030c575b5f80fd5b61011161032c565b60405161011e9190610d8a565b60405180910390f35b61013a610135366004610df0565b6103bc565b604051901515815260200161011e565b6002545b60405190815260200161011e565b61014e5f8051602061101783398151915281565b61013a61017e366004610e18565b6103d5565b61014e5f80516020610ff783398151915281565b60405160ff7f000000000000000000000000000000000000000000000000000000000000000016815260200161011e565b61014e6103f8565b61013a6101de366004610df0565b610453565b6101f66101f1366004610df0565b610474565b005b61014e610206366004610e51565b6001600160a01b03165f9081526020819052604090205490565b61014e61022e366004610e51565b60056020525f908152604090205481565b6101116104d3565b6101f6610255366004610df0565b6104e2565b6102817f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161011e565b61013a6102a7366004610df0565b610534565b61013a6102ba366004610df0565b6105ae565b61014e7f000000000000000000000000000000000000000000000000000000000000000081565b6101f66102f4366004610e71565b6105bb565b61014e610307366004610ede565b6107de565b610111604051806040016040528060018152602001603160f81b81525081565b60606003805461033b90610f0f565b80601f016020809104026020016040519081016040528092919081815260200182805461036790610f0f565b80156103b25780601f10610389576101008083540402835291602001916103b2565b820191905f5260205f20905b81548152906001019060200180831161039557829003601f168201915b5050505050905090565b5f336103c9818585610808565b60019150505b92915050565b5f336103e285828561092c565b6103ed8585856109a4565b506001949350505050565b5f7f0000000000000000000000000000000000000000000000000000000000000000461461042e5761042946610b33565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b5f336103c981858561046583836107de565b61046f9190610f5b565b610808565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104c55760405162461bcd60e51b81526004016104bc90610f6e565b60405180910390fd5b6104cf8282610bcb565b5050565b60606004805461033b90610f0f565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461052a5760405162461bcd60e51b81526004016104bc90610f6e565b6104cf8282610c75565b5f338161054182866107de565b9050838110156105a15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104bc565b6103ed8286868403610808565b5f336103c98185856109a4565b834211156106175760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104bc565b6001600160a01b0387165f90815260056020526040812080545f80516020610ff7833981519152918a918a918a91908661065083610fbe565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6106ad6103f8565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f1981840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610735573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381161580159061076b5750896001600160a01b0316816001600160a01b0316145b6107c75760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104bc565b6107d28a8a8a610808565b50505050505050505050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661086a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104bc565b6001600160a01b0382166108cb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104bc565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b5f61093784846107de565b90505f19811461099e57818110156109915760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104bc565b61099e8484848403610808565b50505050565b6001600160a01b038316610a085760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104bc565b6001600160a01b038216610a6a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104bc565b6001600160a01b0383165f9081526020819052604090205481811015610ae15760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104bc565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290925f80516020610fd7833981519152910160405180910390a361099e565b5f5f80516020611017833981519152610b4a61032c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c215760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104bc565b8060025f828254610c329190610f5b565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481525f80516020610fd7833981519152910160405180910390a35050565b6001600160a01b038216610cd55760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104bc565b6001600160a01b0382165f9081526020819052604090205481811015610d485760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104bc565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192915f80516020610fd7833981519152910161091f565b5f6020808352835180828501525f5b81811015610db557858101830151858201604001528201610d99565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610deb575f80fd5b919050565b5f8060408385031215610e01575f80fd5b610e0a83610dd5565b946020939093013593505050565b5f805f60608486031215610e2a575f80fd5b610e3384610dd5565b9250610e4160208501610dd5565b9150604084013590509250925092565b5f60208284031215610e61575f80fd5b610e6a82610dd5565b9392505050565b5f805f805f805f60e0888a031215610e87575f80fd5b610e9088610dd5565b9650610e9e60208901610dd5565b95506040880135945060608801359350608088013560ff81168114610ec1575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215610eef575f80fd5b610ef883610dd5565b9150610f0660208401610dd5565b90509250929050565b600181811c90821680610f2357607f821691505b602082108103610f4157634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156103cf576103cf610f47565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b5f60018201610fcf57610fcf610f47565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa26469706673582212206c12be332dd873b7cf88c58dfc4762858b63e8ff3bf8563b47828a5a4272643b64736f6c63430008140033501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe27545983a264697066735822122053f0ff7165bbc1149198710f0462239d3d51d7dcf1f5f963d7b1104b715a928964736f6c63430008140033", + "bytecode": "0x608060405234801561001057600080fd5b50614a90806100206000396000f3fe608060405260043610620001705760003560e01c806315064c9614620001755780632072f6c514620001a657806322e95f2c14620001c0578063240ff37814620001f45780632b5e42e7146200020b5780632c3f58cd14620002305780632cffd02e14620002555780632d2c9d94146200027a5780632dfdf0b5146200029f578063318aee3d14620002c657806334ac9cf214620003345780633ae0504714620003565780633e197043146200036e578063647c576c1462000393578063715018a614620003b857806379e2cf9714620003d057806381b1c17414620003e85780638da5cb5b146200042257806391e57e2d146200043a5780639e34070f1462000452578063aaa13cc21462000497578063bab161bf14620004bc578063be5831c714620004f6578063cd586579146200051c578063d02103ca1462000533578063dbc16976146200055c578063ee25560b1462000574578063f2fde38b14620005a5578063fb57083414620005ca575b600080fd5b3480156200018257600080fd5b50606854620001919060ff1681565b60405190151581526020015b60405180910390f35b348015620001b357600080fd5b50620001be620005ef565b005b348015620001cd57600080fd5b50620001e5620001df3660046200277a565b62000627565b6040516200019d9190620027b6565b620001be6200020536600462002824565b6200067a565b3480156200021857600080fd5b50620001be6200022a366004620028a7565b62000790565b3480156200023d57600080fd5b50620001be6200024f366004620028c1565b6200079f565b3480156200026257600080fd5b50620001be62000274366004620028f9565b620007cb565b3480156200028757600080fd5b50620001be62000299366004620028f9565b62000bbe565b348015620002ac57600080fd5b50620002b760535481565b6040519081526020016200019d565b348015620002d357600080fd5b506200030f620002e5366004620029de565b606b6020526000908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b039091166020830152016200019d565b3480156200034157600080fd5b50606c54620001e5906001600160a01b031681565b3480156200036357600080fd5b50620002b762000cfc565b3480156200037b57600080fd5b50620002b76200038d36600462002a0e565b62000de4565b348015620003a057600080fd5b50620001be620003b236600462002a98565b62000e71565b348015620003c557600080fd5b50620001be62001001565b348015620003dd57600080fd5b50620001be62001017565b348015620003f557600080fd5b50620001e562000407366004620028a7565b606a602052600090815260409020546001600160a01b031681565b3480156200042f57600080fd5b50620001e56200103b565b3480156200044757600080fd5b50620002b760d15481565b3480156200045f57600080fd5b506200019162000471366004620028a7565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b348015620004a457600080fd5b50620001e5620004b636600462002ae8565b6200104a565b348015620004c957600080fd5b50606854620004e090610100900463ffffffff1681565b60405163ffffffff90911681526020016200019d565b3480156200050357600080fd5b50606854620004e090600160c81b900463ffffffff1681565b620001be6200052d36600462002b9b565b62001161565b3480156200054057600080fd5b50606854620001e590600160281b90046001600160a01b031681565b3480156200056957600080fd5b50620001be62001205565b3480156200058157600080fd5b50620002b762000593366004620028a7565b60696020526000908152604090205481565b348015620005b257600080fd5b50620001be620005c4366004620029de565b6200123b565b348015620005d757600080fd5b5062000191620005e936600462002c3c565b620012ba565b606c546001600160a01b031633146200061b5760405163e2e8106b60e01b815260040160405180910390fd5b6200062562001393565b565b6000606a600084846040516020016200064292919062002c89565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b60685460ff16156200069f57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161480620006c55750600263ffffffff861610155b15620006e4576040516302caf51760e11b815260040160405180910390fd5b60008051602062004a1b8339815191526001606860019054906101000a900463ffffffff16338888348888605354604051620007299998979695949392919062002cdc565b60405180910390a162000778620007726001606860019054906101000a900463ffffffff163389893489896040516200076492919062002d4b565b604051809103902062000de4565b620013f0565b8215620007895762000789620014ee565b5050505050565b6200079a62001586565b60d155565b620007a962001586565b6068805463ffffffff9092166101000264ffffffff0019909216919091179055565b60685460ff1615620007f057604051630bc011ff60e21b815260040160405180910390fd5b620008078b8b8b8b8b8b8b8b8b8b8b6000620015e9565b6001600160a01b038616620008b057604080516000808252602082019092526001600160a01b03861690859060405162000842919062002d97565b60006040518083038185875af1925050503d806000811462000881576040519150601f19603f3d011682016040523d82523d6000602084013e62000886565b606091505b5050905080620008a957604051630ce8f45160e31b815260040160405180910390fd5b5062000b81565b60685463ffffffff610100909104811690881603620008e557620008df6001600160a01b038716858562001752565b62000b81565b60008787604051602001620008fc92919062002c89565b60408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b03168062000b195760008080620009458688018862002e6e565b9250925092506000858484846040516200095f9062002741565b6200096d9392919062002f11565b8190604051809103906000f59050801580156200098e573d6000803e3d6000fd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f1990620009c2908d908d9060040162002f4e565b600060405180830381600087803b158015620009dd57600080fd5b505af1158015620009f2573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000b0795949392919062002f67565b60405180910390a15050505062000b7e565b6040516340c10f1960e01b81526001600160a01b038216906340c10f199062000b49908990899060040162002f4e565b600060405180830381600087803b15801562000b6457600080fd5b505af115801562000b79573d6000803e3d6000fd5b505050505b50505b60008051602062004a3b8339815191528a8888878760405162000ba995949392919062002fa2565b60405180910390a15050505050505050505050565b60685460ff161562000be357604051630bc011ff60e21b815260040160405180910390fd5b62000bfa8b8b8b8b8b8b8b8b8b8b8b6001620015e9565b6000846001600160a01b031684888a868660405160240162000c20949392919062002fd9565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162000c57919062002d97565b60006040518083038185875af1925050503d806000811462000c96576040519150601f19603f3d011682016040523d82523d6000602084013e62000c9b565b606091505b505090508062000cbe576040516337e391c360e01b815260040160405180910390fd5b60008051602062004a3b8339815191528b8989888860405162000ce695949392919062002fa2565b60405180910390a1505050505050505050505050565b605354600090819081805b602081101562000ddb578083901c60011660010362000d6a576033816020811062000d365762000d3662003016565b01548460405160200162000d4c9291906200302c565b60405160208183030381529060405280519060200120935062000d98565b838260405160200162000d7f9291906200302c565b6040516020818303038152906040528051906020012093505b818260405160200162000dad9291906200302c565b604051602081830303815290604052805190602001209150808062000dd29062003050565b91505062000d07565b50919392505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b600054610100900460ff161580801562000e925750600054600160ff909116105b8062000eb7575062000ea430620017ac565b15801562000eb7575060005460ff166001145b62000f205760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000f44576000805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff871602600160281b600160c81b03191617600160281b6001600160a01b038681169190910291909117909155606c80546001600160a01b0319169184169190911790556703782dace9d9000060d15562000fb4620017bb565b801562000ffb576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6200100b62001586565b6200062560006200182e565b605354606854600160c81b900463ffffffff161015620006255762000625620014ee565b609f546001600160a01b031690565b60008088886040516020016200106292919062002c89565b604051602081830303815290604052805190602001209050600060ff60f81b308360405180602001620010959062002741565b601f1982820381018352601f909101166040819052620010c2908d908d908d908d908d906020016200306c565b60408051601f1981840301815290829052620010e29291602001620030ad565b604051602081830303815290604052805190602001206040516020016200113b94939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b60d154341115620011eb5760405162461bcd60e51b815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d6178457468656064820152667242726964676560c81b608482015260a40162000f17565b620011fc8787878787878762001880565b50505050505050565b606c546001600160a01b03163314620012315760405163e2e8106b60e01b815260040160405180910390fd5b6200062562001c0d565b6200124562001586565b6001600160a01b038116620012ac5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000f17565b620012b7816200182e565b50565b600084815b60208110156200138557600163ffffffff8616821c811690036200132957858160208110620012f257620012f262003016565b6020020135826040516020016200130b9291906200302c565b60405160208183030381529060405280519060200120915062001370565b818682602081106200133f576200133f62003016565b6020020135604051602001620013579291906200302c565b6040516020818303038152906040528051906020012091505b806200137c8162003050565b915050620012bf565b50821490505b949350505050565b60685460ff1615620013b857604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b8060016200140160206002620031dd565b6200140d9190620031eb565b605354106200142f576040516377ae67b360e11b815260040160405180910390fd5b6000605360008154620014429062003050565b9182905550905060005b6020811015620014de578082901c600116600103620014845782603382602081106200147c576200147c62003016565b015550505050565b603381602081106200149a576200149a62003016565b015483604051602001620014b09291906200302c565b6040516020818303038152906040528051906020012092508080620014d59062003050565b9150506200144c565b50620014e962003201565b505050565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d6200153762000cfc565b6040518263ffffffff1660e01b81526004016200155691815260200190565b600060405180830381600087803b1580156200157157600080fd5b505af115801562000ffb573d6000803e3d6000fd5b33620015916200103b565b6001600160a01b031614620006255760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000f17565b620015fa8b63ffffffff1662001c66565b606854600090600160281b90046001600160a01b031663257b3632620016218d8d62001cb2565b6040518263ffffffff1660e01b81526004016200164091815260200190565b6020604051808303816000875af115801562001660573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001686919062003217565b905080600003620016a957604051622f6fad60e01b815260040160405180910390fd5b60685463ffffffff8881166101009092041614620016da576040516302caf51760e11b815260040160405180910390fd5b606854600090610100900463ffffffff16620016f8575089620016fb565b508a5b620017246200171b848c8c8c8c8c8c8c6040516200076492919062002d4b565b8f8f84620012ba565b62001742576040516338105f3b60e21b815260040160405180910390fd5b5050505050505050505050505050565b620014e98363a9059cbb60e01b84846040516024016200177492919062002f4e565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262001ce7565b6001600160a01b03163b151590565b600054610100900460ff16620018285760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000f17565b62000625335b609f80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60685460ff1615620018a557604051630bc011ff60e21b815260040160405180910390fd5b620018af62001dc0565b60685463ffffffff888116610100909204161480620018d55750600263ffffffff881610155b15620018f4576040516302caf51760e11b815260040160405180910390fd5b6000806060876001600160a01b03881662001934578834146200192a5760405163b89240f560e01b815260040160405180910390fd5b6000925062001b98565b3415620019545760405163798ee6f160e01b815260040160405180910390fd5b6001600160a01b038089166000908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b9004909216918101829052901562001a1257604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac90620019ca9033908e9060040162002f4e565b600060405180830381600087803b158015620019e557600080fd5b505af1158015620019fa573d6000803e3d6000fd5b50505050806020015194508060000151935062001b96565b851562001a275762001a27898b898962001e1b565b6040516370a0823160e01b81526000906001600160a01b038b16906370a082319062001a58903090600401620027b6565b602060405180830381865afa15801562001a76573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a9c919062003217565b905062001ab56001600160a01b038b1633308e6200217d565b6040516370a0823160e01b81526000906001600160a01b038c16906370a082319062001ae6903090600401620027b6565b602060405180830381865afa15801562001b04573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001b2a919062003217565b905062001b388282620031eb565b6068548c9850610100900463ffffffff169650935062001b5887620021b7565b62001b638c6200227e565b62001b6e8d6200233c565b60405160200162001b829392919062002f11565b604051602081830303815290604052945050505b505b60008051602062004a1b833981519152600084868e8e868860535460405162001bc998979695949392919062003231565b60405180910390a162001bee62000772600085878f8f87898051906020012062000de4565b861562001bff5762001bff620014ee565b50505050620011fc60018055565b60685460ff1662001c3157604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600881901c60008181526069602052604081208054600160ff861690811b918218928390559290919081831690036200078957604051630c8d9eab60e31b815260040160405180910390fd5b6000828260405160200162001cc99291906200302c565b60405160208183030381529060405280519060200120905092915050565b600062001d3e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620023fd9092919063ffffffff16565b805190915015620014e9578080602001905181019062001d5f91906200329e565b620014e95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000f17565b60026001540362001e145760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000f17565b6002600155565b600062001e2c6004828486620032be565b62001e3791620032ea565b9050632afa533160e01b6001600160e01b031982160162001fd857600080808080808062001e69896004818d620032be565b81019062001e7891906200331b565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161462001eb95760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038616301462001ee35760405163750643af60e01b815260040160405180910390fd5b8a851462001f04576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e169162001f84919062002d97565b6000604051808303816000865af19150503d806000811462001fc3576040519150601f19603f3d011682016040523d82523d6000602084013e62001fc8565b606091505b5050505050505050505062000789565b6001600160e01b031981166323f2ebc360e21b146200200a57604051637141605d60e11b815260040160405180910390fd5b600080808080808080620020228a6004818e620032be565b81019062002031919062003376565b97509750975097509750975097509750336001600160a01b0316886001600160a01b031614620020745760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146200209e5760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169162002127919062002d97565b6000604051808303816000865af19150503d806000811462002166576040519150601f19603f3d011682016040523d82523d6000602084013e6200216b565b606091505b50505050505050505050505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905262000ffb9085906323b872dd60e01b9060840162001774565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009182916001600160a01b0386169162002200919062002d97565b600060405180830381855afa9150503d80600081146200223d576040519150601f19603f3d011682016040523d82523d6000602084013e62002242565b606091505b5091509150816200227357604051806040016040528060078152602001664e4f5f4e414d4560c81b8152506200138b565b6200138b816200240e565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009182916001600160a01b03861691620022c7919062002d97565b600060405180830381855afa9150503d806000811462002304576040519150601f19603f3d011682016040523d82523d6000602084013e62002309565b606091505b5091509150816200227357604051806040016040528060098152602001681393d7d4d6535093d360ba1b8152506200138b565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b0386169162002384919062002d97565b600060405180830381855afa9150503d8060008114620023c1576040519150601f19603f3d011682016040523d82523d6000602084013e620023c6565b606091505b5091509150818015620023da575080516020145b620023e75760126200138b565b808060200190518101906200138b919062003402565b60606200138b8484600085620025b7565b6060604082511062002430578180602001905181019062000674919062003422565b8151602003620025845760005b6020811080156200247057508281815181106200245e576200245e62003016565b01602001516001600160f81b03191615155b156200248b5780620024828162003050565b9150506200243d565b80600003620024c45750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b6000816001600160401b03811115620024e157620024e162002d5b565b6040519080825280601f01601f1916602001820160405280156200250c576020820181803683370190505b50905060005b828110156200257c5784818151811062002530576200253062003016565b602001015160f81c60f81b82828151811062002550576200255062003016565b60200101906001600160f81b031916908160001a90535080620025738162003050565b91505062002512565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b6060824710156200261a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000f17565b600080866001600160a01b0316858760405162002638919062002d97565b60006040518083038185875af1925050503d806000811462002677576040519150601f19603f3d011682016040523d82523d6000602084013e6200267c565b606091505b50915091506200268f878383876200269a565b979650505050505050565b606083156200270e5782516000036200270657620026b885620017ac565b620027065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000f17565b50816200138b565b6200138b8383815115620027255781518083602001fd5b8060405162461bcd60e51b815260040162000f179190620034a1565b61156480620034b783390190565b803563ffffffff81168114620025b257600080fd5b6001600160a01b0381168114620012b757600080fd5b600080604083850312156200278e57600080fd5b62002799836200274f565b91506020830135620027ab8162002764565b809150509250929050565b6001600160a01b0391909116815260200190565b8015158114620012b757600080fd5b60008083601f840112620027ec57600080fd5b5081356001600160401b038111156200280457600080fd5b6020830191508360208285010111156200281d57600080fd5b9250929050565b6000806000806000608086880312156200283d57600080fd5b62002848866200274f565b945060208601356200285a8162002764565b935060408601356200286c81620027ca565b925060608601356001600160401b038111156200288857600080fd5b6200289688828901620027d9565b969995985093965092949392505050565b600060208284031215620028ba57600080fd5b5035919050565b600060208284031215620028d457600080fd5b620028df826200274f565b9392505050565b8061040081018310156200067457600080fd5b60008060008060008060008060008060006105208c8e0312156200291c57600080fd5b620029288d8d620028e6565b9a50620029396104008d016200274f565b99506104208c013598506104408c013597506200295a6104608d016200274f565b96506104808c01356200296d8162002764565b95506200297e6104a08d016200274f565b94506104c08c0135620029918162002764565b93506104e08c013592506105008c01356001600160401b03811115620029b657600080fd5b620029c48e828f01620027d9565b915080935050809150509295989b509295989b9093969950565b600060208284031215620029f157600080fd5b8135620028df8162002764565b60ff81168114620012b757600080fd5b600080600080600080600060e0888a03121562002a2a57600080fd5b873562002a3781620029fe565b965062002a47602089016200274f565b9550604088013562002a598162002764565b945062002a69606089016200274f565b9350608088013562002a7b8162002764565b9699959850939692959460a0840135945060c09093013592915050565b60008060006060848603121562002aae57600080fd5b62002ab9846200274f565b9250602084013562002acb8162002764565b9150604084013562002add8162002764565b809150509250925092565b600080600080600080600060a0888a03121562002b0457600080fd5b62002b0f886200274f565b9650602088013562002b218162002764565b955060408801356001600160401b038082111562002b3e57600080fd5b62002b4c8b838c01620027d9565b909750955060608a013591508082111562002b6657600080fd5b5062002b758a828b01620027d9565b909450925050608088013562002b8b81620029fe565b8091505092959891949750929550565b600080600080600080600060c0888a03121562002bb757600080fd5b62002bc2886200274f565b9650602088013562002bd48162002764565b955060408801359450606088013562002bed8162002764565b9350608088013562002bff81620027ca565b925060a08801356001600160401b0381111562002c1b57600080fd5b62002c298a828b01620027d9565b989b979a50959850939692959293505050565b600080600080610460858703121562002c5457600080fd5b8435935062002c678660208701620028e6565b925062002c7861042086016200274f565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c0830181905260009162002d31848301878962002cb3565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101562002d8e57818101518382015260200162002d74565b50506000910152565b6000825162002dab81846020870162002d71565b9190910192915050565b604051601f8201601f191681016001600160401b038111828210171562002de05762002de062002d5b565b604052919050565b60006001600160401b0382111562002e045762002e0462002d5b565b50601f01601f191660200190565b600082601f83011262002e2457600080fd5b813562002e3b62002e358262002de8565b62002db5565b81815284602083860101111562002e5157600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562002e8457600080fd5b83356001600160401b038082111562002e9c57600080fd5b62002eaa8783880162002e12565b9450602086013591508082111562002ec157600080fd5b5062002ed08682870162002e12565b925050604084013562002add81620029fe565b6000815180845262002efd81602086016020860162002d71565b601f01601f19169290920160200192915050565b60608152600062002f26606083018662002ee3565b828103602084015262002f3a818662002ee3565b91505060ff83166040830152949350505050565b6001600160a01b03929092168252602082015260400190565b63ffffffff861681526001600160a01b038581166020830152841660408201526080606082018190526000906200268f908301848662002cb3565b63ffffffff95861681529390941660208401526001600160a01b039182166040840152166060820152608081019190915260a00190565b6001600160a01b038516815263ffffffff841660208201526060604082018190526000906200300c908301848662002cb3565b9695505050505050565b634e487b7160e01b600052603260045260246000fd5b918252602082015260400190565b634e487b7160e01b600052601160045260246000fd5b6000600182016200306557620030656200303a565b5060010190565b6060815260006200308260608301878962002cb3565b82810360208401526200309781868862002cb3565b91505060ff831660408301529695505050505050565b60008351620030c181846020880162002d71565b835190830190620030d781836020880162002d71565b01949350505050565b600181815b80851115620031215781600019048211156200310557620031056200303a565b808516156200311357918102915b93841c9390800290620030e5565b509250929050565b6000826200313a5750600162000674565b81620031495750600062000674565b81600181146200316257600281146200316d576200318d565b600191505062000674565b60ff8411156200318157620031816200303a565b50506001821b62000674565b5060208310610133831016604e8410600b8410161715620031b2575081810a62000674565b620031be8383620030e0565b8060001904821115620031d557620031d56200303a565b029392505050565b6000620028df838362003129565b818103818111156200067457620006746200303a565b634e487b7160e01b600052600160045260246000fd5b6000602082840312156200322a57600080fd5b5051919050565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c08301819052600091620032858483018762002ee3565b925080851660e085015250509998505050505050505050565b600060208284031215620032b157600080fd5b8151620028df81620027ca565b60008085851115620032cf57600080fd5b83861115620032dd57600080fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015620033135780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a0312156200333757600080fd5b8735620033448162002764565b96506020880135620033568162002764565b95506040880135945060608801359350608088013562002a7b81620029fe565b600080600080600080600080610100898b0312156200339457600080fd5b8835620033a18162002764565b97506020890135620033b38162002764565b965060408901359550606089013594506080890135620033d381620027ca565b935060a0890135620033e581620029fe565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200341557600080fd5b8151620028df81620029fe565b6000602082840312156200343557600080fd5b81516001600160401b038111156200344c57600080fd5b8201601f810184136200345e57600080fd5b80516200346f62002e358262002de8565b8181528560208385010111156200348557600080fd5b6200349882602083016020860162002d71565b95945050505050565b602081526000620028df602083018462002ee356fe6101006040523480156200001257600080fd5b50604051620015643803806200156483398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516110a8620004bc60003960006101a30152600081816102660152818161048c01526104fa0152600061043d0152600081816102cb015261040701526110a86000f3fe608060405234801561001057600080fd5b50600436106101075760003560e01c806306fdde031461010c578063095ea7b31461012a57806318160ddd1461014d57806320606b701461015f57806323b872dd1461017457806330adf81f14610187578063313ce5671461019c5780633644e515146101cd57806339509351146101d557806340c10f19146101e857806370a08231146101fd5780637ecebe001461022657806395d89b41146102465780639dc29fac1461024e578063a3c573eb14610261578063a457c2d7146102a0578063a9059cbb146102b3578063cd0d0096146102c6578063d505accf146102ed578063dd62ed3e14610300578063ffa1ad7414610313575b600080fd5b610114610333565b6040516101219190610dae565b60405180910390f35b61013d610138366004610e18565b6103c5565b6040519015158152602001610121565b6002545b604051908152602001610121565b61015160008051602061105383398151915281565b61013d610182366004610e42565b6103df565b61015160008051602061103383398151915281565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610121565b610151610403565b61013d6101e3366004610e18565b61045f565b6101fb6101f6366004610e18565b610481565b005b61015161020b366004610e7e565b6001600160a01b031660009081526020819052604090205490565b610151610234366004610e7e565b60056020526000908152604090205481565b6101146104e0565b6101fb61025c366004610e18565b6104ef565b6102887f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610121565b61013d6102ae366004610e18565b610541565b61013d6102c1366004610e18565b6105bc565b6101517f000000000000000000000000000000000000000000000000000000000000000081565b6101fb6102fb366004610ea0565b6105ca565b61015161030e366004610f13565b6107f3565b610114604051806040016040528060018152602001603160f81b81525081565b60606003805461034290610f46565b80601f016020809104026020016040519081016040528092919081815260200182805461036e90610f46565b80156103bb5780601f10610390576101008083540402835291602001916103bb565b820191906000526020600020905b81548152906001019060200180831161039e57829003601f168201915b5050505050905090565b6000336103d381858561081e565b60019150505b92915050565b6000336103ed858285610943565b6103f88585856109bd565b506001949350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461461043a5761043546610b4f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000336103d381858561047283836107f3565b61047c9190610f96565b61081e565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104d25760405162461bcd60e51b81526004016104c990610fa9565b60405180910390fd5b6104dc8282610be9565b5050565b60606004805461034290610f46565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105375760405162461bcd60e51b81526004016104c990610fa9565b6104dc8282610c96565b6000338161054f82866107f3565b9050838110156105af5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104c9565b6103f8828686840361081e565b6000336103d38185856109bd565b834211156106265760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104c9565b6001600160a01b03871660009081526005602052604081208054600080516020611033833981519152918a918a918a91908661066183610ff9565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006106bf610403565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa15801561074a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906107805750896001600160a01b0316816001600160a01b0316145b6107dc5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104c9565b6107e78a8a8a61081e565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166108805760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104c9565b6001600160a01b0382166108e15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104c9565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600061094f84846107f3565b905060001981146109b757818110156109aa5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104c9565b6109b7848484840361081e565b50505050565b6001600160a01b038316610a215760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104c9565b6001600160a01b038216610a835760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104c9565b6001600160a01b03831660009081526020819052604090205481811015610afb5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104c9565b6001600160a01b0384811660008181526020818152604080832087870390559387168083529184902080548701905592518581529092600080516020611013833981519152910160405180910390a36109b7565b6000600080516020611053833981519152610b68610333565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c3f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104c9565b8060026000828254610c519190610f96565b90915550506001600160a01b03821660008181526020818152604080832080548601905551848152600080516020611013833981519152910160405180910390a35050565b6001600160a01b038216610cf65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104c9565b6001600160a01b03821660009081526020819052604090205481811015610d6a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104c9565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192916000805160206110138339815191529101610936565b600060208083528351808285015260005b81811015610ddb57858101830151858201604001528201610dbf565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610e1357600080fd5b919050565b60008060408385031215610e2b57600080fd5b610e3483610dfc565b946020939093013593505050565b600080600060608486031215610e5757600080fd5b610e6084610dfc565b9250610e6e60208501610dfc565b9150604084013590509250925092565b600060208284031215610e9057600080fd5b610e9982610dfc565b9392505050565b600080600080600080600060e0888a031215610ebb57600080fd5b610ec488610dfc565b9650610ed260208901610dfc565b95506040880135945060608801359350608088013560ff81168114610ef657600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f2657600080fd5b610f2f83610dfc565b9150610f3d60208401610dfc565b90509250929050565b600181811c90821680610f5a57607f821691505b602082108103610f7a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156103d9576103d9610f80565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b60006001820161100b5761100b610f80565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa26469706673582212203ea4a1224be7b5ef35dc397dfc81433d85cd6fdbf17d8b2e3d528071e7e612b564736f6c63430008140033501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe27545983a26469706673582212209433428555ad2611b778c6d4bd276ba680e0aee0111f4647137d5f0a5836619e64736f6c63430008140033", + "deployedBytecode": "0x608060405260043610620001705760003560e01c806315064c9614620001755780632072f6c514620001a657806322e95f2c14620001c0578063240ff37814620001f45780632b5e42e7146200020b5780632c3f58cd14620002305780632cffd02e14620002555780632d2c9d94146200027a5780632dfdf0b5146200029f578063318aee3d14620002c657806334ac9cf214620003345780633ae0504714620003565780633e197043146200036e578063647c576c1462000393578063715018a614620003b857806379e2cf9714620003d057806381b1c17414620003e85780638da5cb5b146200042257806391e57e2d146200043a5780639e34070f1462000452578063aaa13cc21462000497578063bab161bf14620004bc578063be5831c714620004f6578063cd586579146200051c578063d02103ca1462000533578063dbc16976146200055c578063ee25560b1462000574578063f2fde38b14620005a5578063fb57083414620005ca575b600080fd5b3480156200018257600080fd5b50606854620001919060ff1681565b60405190151581526020015b60405180910390f35b348015620001b357600080fd5b50620001be620005ef565b005b348015620001cd57600080fd5b50620001e5620001df3660046200277a565b62000627565b6040516200019d9190620027b6565b620001be6200020536600462002824565b6200067a565b3480156200021857600080fd5b50620001be6200022a366004620028a7565b62000790565b3480156200023d57600080fd5b50620001be6200024f366004620028c1565b6200079f565b3480156200026257600080fd5b50620001be62000274366004620028f9565b620007cb565b3480156200028757600080fd5b50620001be62000299366004620028f9565b62000bbe565b348015620002ac57600080fd5b50620002b760535481565b6040519081526020016200019d565b348015620002d357600080fd5b506200030f620002e5366004620029de565b606b6020526000908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b039091166020830152016200019d565b3480156200034157600080fd5b50606c54620001e5906001600160a01b031681565b3480156200036357600080fd5b50620002b762000cfc565b3480156200037b57600080fd5b50620002b76200038d36600462002a0e565b62000de4565b348015620003a057600080fd5b50620001be620003b236600462002a98565b62000e71565b348015620003c557600080fd5b50620001be62001001565b348015620003dd57600080fd5b50620001be62001017565b348015620003f557600080fd5b50620001e562000407366004620028a7565b606a602052600090815260409020546001600160a01b031681565b3480156200042f57600080fd5b50620001e56200103b565b3480156200044757600080fd5b50620002b760d15481565b3480156200045f57600080fd5b506200019162000471366004620028a7565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b348015620004a457600080fd5b50620001e5620004b636600462002ae8565b6200104a565b348015620004c957600080fd5b50606854620004e090610100900463ffffffff1681565b60405163ffffffff90911681526020016200019d565b3480156200050357600080fd5b50606854620004e090600160c81b900463ffffffff1681565b620001be6200052d36600462002b9b565b62001161565b3480156200054057600080fd5b50606854620001e590600160281b90046001600160a01b031681565b3480156200056957600080fd5b50620001be62001205565b3480156200058157600080fd5b50620002b762000593366004620028a7565b60696020526000908152604090205481565b348015620005b257600080fd5b50620001be620005c4366004620029de565b6200123b565b348015620005d757600080fd5b5062000191620005e936600462002c3c565b620012ba565b606c546001600160a01b031633146200061b5760405163e2e8106b60e01b815260040160405180910390fd5b6200062562001393565b565b6000606a600084846040516020016200064292919062002c89565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b60685460ff16156200069f57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161480620006c55750600263ffffffff861610155b15620006e4576040516302caf51760e11b815260040160405180910390fd5b60008051602062004a1b8339815191526001606860019054906101000a900463ffffffff16338888348888605354604051620007299998979695949392919062002cdc565b60405180910390a162000778620007726001606860019054906101000a900463ffffffff163389893489896040516200076492919062002d4b565b604051809103902062000de4565b620013f0565b8215620007895762000789620014ee565b5050505050565b6200079a62001586565b60d155565b620007a962001586565b6068805463ffffffff9092166101000264ffffffff0019909216919091179055565b60685460ff1615620007f057604051630bc011ff60e21b815260040160405180910390fd5b620008078b8b8b8b8b8b8b8b8b8b8b6000620015e9565b6001600160a01b038616620008b057604080516000808252602082019092526001600160a01b03861690859060405162000842919062002d97565b60006040518083038185875af1925050503d806000811462000881576040519150601f19603f3d011682016040523d82523d6000602084013e62000886565b606091505b5050905080620008a957604051630ce8f45160e31b815260040160405180910390fd5b5062000b81565b60685463ffffffff610100909104811690881603620008e557620008df6001600160a01b038716858562001752565b62000b81565b60008787604051602001620008fc92919062002c89565b60408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b03168062000b195760008080620009458688018862002e6e565b9250925092506000858484846040516200095f9062002741565b6200096d9392919062002f11565b8190604051809103906000f59050801580156200098e573d6000803e3d6000fd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f1990620009c2908d908d9060040162002f4e565b600060405180830381600087803b158015620009dd57600080fd5b505af1158015620009f2573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000b0795949392919062002f67565b60405180910390a15050505062000b7e565b6040516340c10f1960e01b81526001600160a01b038216906340c10f199062000b49908990899060040162002f4e565b600060405180830381600087803b15801562000b6457600080fd5b505af115801562000b79573d6000803e3d6000fd5b505050505b50505b60008051602062004a3b8339815191528a8888878760405162000ba995949392919062002fa2565b60405180910390a15050505050505050505050565b60685460ff161562000be357604051630bc011ff60e21b815260040160405180910390fd5b62000bfa8b8b8b8b8b8b8b8b8b8b8b6001620015e9565b6000846001600160a01b031684888a868660405160240162000c20949392919062002fd9565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162000c57919062002d97565b60006040518083038185875af1925050503d806000811462000c96576040519150601f19603f3d011682016040523d82523d6000602084013e62000c9b565b606091505b505090508062000cbe576040516337e391c360e01b815260040160405180910390fd5b60008051602062004a3b8339815191528b8989888860405162000ce695949392919062002fa2565b60405180910390a1505050505050505050505050565b605354600090819081805b602081101562000ddb578083901c60011660010362000d6a576033816020811062000d365762000d3662003016565b01548460405160200162000d4c9291906200302c565b60405160208183030381529060405280519060200120935062000d98565b838260405160200162000d7f9291906200302c565b6040516020818303038152906040528051906020012093505b818260405160200162000dad9291906200302c565b604051602081830303815290604052805190602001209150808062000dd29062003050565b91505062000d07565b50919392505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b600054610100900460ff161580801562000e925750600054600160ff909116105b8062000eb7575062000ea430620017ac565b15801562000eb7575060005460ff166001145b62000f205760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000f44576000805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff871602600160281b600160c81b03191617600160281b6001600160a01b038681169190910291909117909155606c80546001600160a01b0319169184169190911790556703782dace9d9000060d15562000fb4620017bb565b801562000ffb576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6200100b62001586565b6200062560006200182e565b605354606854600160c81b900463ffffffff161015620006255762000625620014ee565b609f546001600160a01b031690565b60008088886040516020016200106292919062002c89565b604051602081830303815290604052805190602001209050600060ff60f81b308360405180602001620010959062002741565b601f1982820381018352601f909101166040819052620010c2908d908d908d908d908d906020016200306c565b60408051601f1981840301815290829052620010e29291602001620030ad565b604051602081830303815290604052805190602001206040516020016200113b94939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b60d154341115620011eb5760405162461bcd60e51b815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d6178457468656064820152667242726964676560c81b608482015260a40162000f17565b620011fc8787878787878762001880565b50505050505050565b606c546001600160a01b03163314620012315760405163e2e8106b60e01b815260040160405180910390fd5b6200062562001c0d565b6200124562001586565b6001600160a01b038116620012ac5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000f17565b620012b7816200182e565b50565b600084815b60208110156200138557600163ffffffff8616821c811690036200132957858160208110620012f257620012f262003016565b6020020135826040516020016200130b9291906200302c565b60405160208183030381529060405280519060200120915062001370565b818682602081106200133f576200133f62003016565b6020020135604051602001620013579291906200302c565b6040516020818303038152906040528051906020012091505b806200137c8162003050565b915050620012bf565b50821490505b949350505050565b60685460ff1615620013b857604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b8060016200140160206002620031dd565b6200140d9190620031eb565b605354106200142f576040516377ae67b360e11b815260040160405180910390fd5b6000605360008154620014429062003050565b9182905550905060005b6020811015620014de578082901c600116600103620014845782603382602081106200147c576200147c62003016565b015550505050565b603381602081106200149a576200149a62003016565b015483604051602001620014b09291906200302c565b6040516020818303038152906040528051906020012092508080620014d59062003050565b9150506200144c565b50620014e962003201565b505050565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d6200153762000cfc565b6040518263ffffffff1660e01b81526004016200155691815260200190565b600060405180830381600087803b1580156200157157600080fd5b505af115801562000ffb573d6000803e3d6000fd5b33620015916200103b565b6001600160a01b031614620006255760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000f17565b620015fa8b63ffffffff1662001c66565b606854600090600160281b90046001600160a01b031663257b3632620016218d8d62001cb2565b6040518263ffffffff1660e01b81526004016200164091815260200190565b6020604051808303816000875af115801562001660573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001686919062003217565b905080600003620016a957604051622f6fad60e01b815260040160405180910390fd5b60685463ffffffff8881166101009092041614620016da576040516302caf51760e11b815260040160405180910390fd5b606854600090610100900463ffffffff16620016f8575089620016fb565b508a5b620017246200171b848c8c8c8c8c8c8c6040516200076492919062002d4b565b8f8f84620012ba565b62001742576040516338105f3b60e21b815260040160405180910390fd5b5050505050505050505050505050565b620014e98363a9059cbb60e01b84846040516024016200177492919062002f4e565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262001ce7565b6001600160a01b03163b151590565b600054610100900460ff16620018285760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000f17565b62000625335b609f80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60685460ff1615620018a557604051630bc011ff60e21b815260040160405180910390fd5b620018af62001dc0565b60685463ffffffff888116610100909204161480620018d55750600263ffffffff881610155b15620018f4576040516302caf51760e11b815260040160405180910390fd5b6000806060876001600160a01b03881662001934578834146200192a5760405163b89240f560e01b815260040160405180910390fd5b6000925062001b98565b3415620019545760405163798ee6f160e01b815260040160405180910390fd5b6001600160a01b038089166000908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b9004909216918101829052901562001a1257604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac90620019ca9033908e9060040162002f4e565b600060405180830381600087803b158015620019e557600080fd5b505af1158015620019fa573d6000803e3d6000fd5b50505050806020015194508060000151935062001b96565b851562001a275762001a27898b898962001e1b565b6040516370a0823160e01b81526000906001600160a01b038b16906370a082319062001a58903090600401620027b6565b602060405180830381865afa15801562001a76573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a9c919062003217565b905062001ab56001600160a01b038b1633308e6200217d565b6040516370a0823160e01b81526000906001600160a01b038c16906370a082319062001ae6903090600401620027b6565b602060405180830381865afa15801562001b04573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001b2a919062003217565b905062001b388282620031eb565b6068548c9850610100900463ffffffff169650935062001b5887620021b7565b62001b638c6200227e565b62001b6e8d6200233c565b60405160200162001b829392919062002f11565b604051602081830303815290604052945050505b505b60008051602062004a1b833981519152600084868e8e868860535460405162001bc998979695949392919062003231565b60405180910390a162001bee62000772600085878f8f87898051906020012062000de4565b861562001bff5762001bff620014ee565b50505050620011fc60018055565b60685460ff1662001c3157604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600881901c60008181526069602052604081208054600160ff861690811b918218928390559290919081831690036200078957604051630c8d9eab60e31b815260040160405180910390fd5b6000828260405160200162001cc99291906200302c565b60405160208183030381529060405280519060200120905092915050565b600062001d3e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620023fd9092919063ffffffff16565b805190915015620014e9578080602001905181019062001d5f91906200329e565b620014e95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000f17565b60026001540362001e145760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000f17565b6002600155565b600062001e2c6004828486620032be565b62001e3791620032ea565b9050632afa533160e01b6001600160e01b031982160162001fd857600080808080808062001e69896004818d620032be565b81019062001e7891906200331b565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161462001eb95760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038616301462001ee35760405163750643af60e01b815260040160405180910390fd5b8a851462001f04576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e169162001f84919062002d97565b6000604051808303816000865af19150503d806000811462001fc3576040519150601f19603f3d011682016040523d82523d6000602084013e62001fc8565b606091505b5050505050505050505062000789565b6001600160e01b031981166323f2ebc360e21b146200200a57604051637141605d60e11b815260040160405180910390fd5b600080808080808080620020228a6004818e620032be565b81019062002031919062003376565b97509750975097509750975097509750336001600160a01b0316886001600160a01b031614620020745760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146200209e5760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169162002127919062002d97565b6000604051808303816000865af19150503d806000811462002166576040519150601f19603f3d011682016040523d82523d6000602084013e6200216b565b606091505b50505050505050505050505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905262000ffb9085906323b872dd60e01b9060840162001774565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009182916001600160a01b0386169162002200919062002d97565b600060405180830381855afa9150503d80600081146200223d576040519150601f19603f3d011682016040523d82523d6000602084013e62002242565b606091505b5091509150816200227357604051806040016040528060078152602001664e4f5f4e414d4560c81b8152506200138b565b6200138b816200240e565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009182916001600160a01b03861691620022c7919062002d97565b600060405180830381855afa9150503d806000811462002304576040519150601f19603f3d011682016040523d82523d6000602084013e62002309565b606091505b5091509150816200227357604051806040016040528060098152602001681393d7d4d6535093d360ba1b8152506200138b565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b0386169162002384919062002d97565b600060405180830381855afa9150503d8060008114620023c1576040519150601f19603f3d011682016040523d82523d6000602084013e620023c6565b606091505b5091509150818015620023da575080516020145b620023e75760126200138b565b808060200190518101906200138b919062003402565b60606200138b8484600085620025b7565b6060604082511062002430578180602001905181019062000674919062003422565b8151602003620025845760005b6020811080156200247057508281815181106200245e576200245e62003016565b01602001516001600160f81b03191615155b156200248b5780620024828162003050565b9150506200243d565b80600003620024c45750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b6000816001600160401b03811115620024e157620024e162002d5b565b6040519080825280601f01601f1916602001820160405280156200250c576020820181803683370190505b50905060005b828110156200257c5784818151811062002530576200253062003016565b602001015160f81c60f81b82828151811062002550576200255062003016565b60200101906001600160f81b031916908160001a90535080620025738162003050565b91505062002512565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b6060824710156200261a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000f17565b600080866001600160a01b0316858760405162002638919062002d97565b60006040518083038185875af1925050503d806000811462002677576040519150601f19603f3d011682016040523d82523d6000602084013e6200267c565b606091505b50915091506200268f878383876200269a565b979650505050505050565b606083156200270e5782516000036200270657620026b885620017ac565b620027065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000f17565b50816200138b565b6200138b8383815115620027255781518083602001fd5b8060405162461bcd60e51b815260040162000f179190620034a1565b61156480620034b783390190565b803563ffffffff81168114620025b257600080fd5b6001600160a01b0381168114620012b757600080fd5b600080604083850312156200278e57600080fd5b62002799836200274f565b91506020830135620027ab8162002764565b809150509250929050565b6001600160a01b0391909116815260200190565b8015158114620012b757600080fd5b60008083601f840112620027ec57600080fd5b5081356001600160401b038111156200280457600080fd5b6020830191508360208285010111156200281d57600080fd5b9250929050565b6000806000806000608086880312156200283d57600080fd5b62002848866200274f565b945060208601356200285a8162002764565b935060408601356200286c81620027ca565b925060608601356001600160401b038111156200288857600080fd5b6200289688828901620027d9565b969995985093965092949392505050565b600060208284031215620028ba57600080fd5b5035919050565b600060208284031215620028d457600080fd5b620028df826200274f565b9392505050565b8061040081018310156200067457600080fd5b60008060008060008060008060008060006105208c8e0312156200291c57600080fd5b620029288d8d620028e6565b9a50620029396104008d016200274f565b99506104208c013598506104408c013597506200295a6104608d016200274f565b96506104808c01356200296d8162002764565b95506200297e6104a08d016200274f565b94506104c08c0135620029918162002764565b93506104e08c013592506105008c01356001600160401b03811115620029b657600080fd5b620029c48e828f01620027d9565b915080935050809150509295989b509295989b9093969950565b600060208284031215620029f157600080fd5b8135620028df8162002764565b60ff81168114620012b757600080fd5b600080600080600080600060e0888a03121562002a2a57600080fd5b873562002a3781620029fe565b965062002a47602089016200274f565b9550604088013562002a598162002764565b945062002a69606089016200274f565b9350608088013562002a7b8162002764565b9699959850939692959460a0840135945060c09093013592915050565b60008060006060848603121562002aae57600080fd5b62002ab9846200274f565b9250602084013562002acb8162002764565b9150604084013562002add8162002764565b809150509250925092565b600080600080600080600060a0888a03121562002b0457600080fd5b62002b0f886200274f565b9650602088013562002b218162002764565b955060408801356001600160401b038082111562002b3e57600080fd5b62002b4c8b838c01620027d9565b909750955060608a013591508082111562002b6657600080fd5b5062002b758a828b01620027d9565b909450925050608088013562002b8b81620029fe565b8091505092959891949750929550565b600080600080600080600060c0888a03121562002bb757600080fd5b62002bc2886200274f565b9650602088013562002bd48162002764565b955060408801359450606088013562002bed8162002764565b9350608088013562002bff81620027ca565b925060a08801356001600160401b0381111562002c1b57600080fd5b62002c298a828b01620027d9565b989b979a50959850939692959293505050565b600080600080610460858703121562002c5457600080fd5b8435935062002c678660208701620028e6565b925062002c7861042086016200274f565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c0830181905260009162002d31848301878962002cb3565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101562002d8e57818101518382015260200162002d74565b50506000910152565b6000825162002dab81846020870162002d71565b9190910192915050565b604051601f8201601f191681016001600160401b038111828210171562002de05762002de062002d5b565b604052919050565b60006001600160401b0382111562002e045762002e0462002d5b565b50601f01601f191660200190565b600082601f83011262002e2457600080fd5b813562002e3b62002e358262002de8565b62002db5565b81815284602083860101111562002e5157600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562002e8457600080fd5b83356001600160401b038082111562002e9c57600080fd5b62002eaa8783880162002e12565b9450602086013591508082111562002ec157600080fd5b5062002ed08682870162002e12565b925050604084013562002add81620029fe565b6000815180845262002efd81602086016020860162002d71565b601f01601f19169290920160200192915050565b60608152600062002f26606083018662002ee3565b828103602084015262002f3a818662002ee3565b91505060ff83166040830152949350505050565b6001600160a01b03929092168252602082015260400190565b63ffffffff861681526001600160a01b038581166020830152841660408201526080606082018190526000906200268f908301848662002cb3565b63ffffffff95861681529390941660208401526001600160a01b039182166040840152166060820152608081019190915260a00190565b6001600160a01b038516815263ffffffff841660208201526060604082018190526000906200300c908301848662002cb3565b9695505050505050565b634e487b7160e01b600052603260045260246000fd5b918252602082015260400190565b634e487b7160e01b600052601160045260246000fd5b6000600182016200306557620030656200303a565b5060010190565b6060815260006200308260608301878962002cb3565b82810360208401526200309781868862002cb3565b91505060ff831660408301529695505050505050565b60008351620030c181846020880162002d71565b835190830190620030d781836020880162002d71565b01949350505050565b600181815b80851115620031215781600019048211156200310557620031056200303a565b808516156200311357918102915b93841c9390800290620030e5565b509250929050565b6000826200313a5750600162000674565b81620031495750600062000674565b81600181146200316257600281146200316d576200318d565b600191505062000674565b60ff8411156200318157620031816200303a565b50506001821b62000674565b5060208310610133831016604e8410600b8410161715620031b2575081810a62000674565b620031be8383620030e0565b8060001904821115620031d557620031d56200303a565b029392505050565b6000620028df838362003129565b818103818111156200067457620006746200303a565b634e487b7160e01b600052600160045260246000fd5b6000602082840312156200322a57600080fd5b5051919050565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c08301819052600091620032858483018762002ee3565b925080851660e085015250509998505050505050505050565b600060208284031215620032b157600080fd5b8151620028df81620027ca565b60008085851115620032cf57600080fd5b83861115620032dd57600080fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015620033135780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a0312156200333757600080fd5b8735620033448162002764565b96506020880135620033568162002764565b95506040880135945060608801359350608088013562002a7b81620029fe565b600080600080600080600080610100898b0312156200339457600080fd5b8835620033a18162002764565b97506020890135620033b38162002764565b965060408901359550606089013594506080890135620033d381620027ca565b935060a0890135620033e581620029fe565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200341557600080fd5b8151620028df81620029fe565b6000602082840312156200343557600080fd5b81516001600160401b038111156200344c57600080fd5b8201601f810184136200345e57600080fd5b80516200346f62002e358262002de8565b8181528560208385010111156200348557600080fd5b6200349882602083016020860162002d71565b95945050505050565b602081526000620028df602083018462002ee356fe6101006040523480156200001257600080fd5b50604051620015643803806200156483398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516110a8620004bc60003960006101a30152600081816102660152818161048c01526104fa0152600061043d0152600081816102cb015261040701526110a86000f3fe608060405234801561001057600080fd5b50600436106101075760003560e01c806306fdde031461010c578063095ea7b31461012a57806318160ddd1461014d57806320606b701461015f57806323b872dd1461017457806330adf81f14610187578063313ce5671461019c5780633644e515146101cd57806339509351146101d557806340c10f19146101e857806370a08231146101fd5780637ecebe001461022657806395d89b41146102465780639dc29fac1461024e578063a3c573eb14610261578063a457c2d7146102a0578063a9059cbb146102b3578063cd0d0096146102c6578063d505accf146102ed578063dd62ed3e14610300578063ffa1ad7414610313575b600080fd5b610114610333565b6040516101219190610dae565b60405180910390f35b61013d610138366004610e18565b6103c5565b6040519015158152602001610121565b6002545b604051908152602001610121565b61015160008051602061105383398151915281565b61013d610182366004610e42565b6103df565b61015160008051602061103383398151915281565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610121565b610151610403565b61013d6101e3366004610e18565b61045f565b6101fb6101f6366004610e18565b610481565b005b61015161020b366004610e7e565b6001600160a01b031660009081526020819052604090205490565b610151610234366004610e7e565b60056020526000908152604090205481565b6101146104e0565b6101fb61025c366004610e18565b6104ef565b6102887f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610121565b61013d6102ae366004610e18565b610541565b61013d6102c1366004610e18565b6105bc565b6101517f000000000000000000000000000000000000000000000000000000000000000081565b6101fb6102fb366004610ea0565b6105ca565b61015161030e366004610f13565b6107f3565b610114604051806040016040528060018152602001603160f81b81525081565b60606003805461034290610f46565b80601f016020809104026020016040519081016040528092919081815260200182805461036e90610f46565b80156103bb5780601f10610390576101008083540402835291602001916103bb565b820191906000526020600020905b81548152906001019060200180831161039e57829003601f168201915b5050505050905090565b6000336103d381858561081e565b60019150505b92915050565b6000336103ed858285610943565b6103f88585856109bd565b506001949350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461461043a5761043546610b4f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000336103d381858561047283836107f3565b61047c9190610f96565b61081e565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104d25760405162461bcd60e51b81526004016104c990610fa9565b60405180910390fd5b6104dc8282610be9565b5050565b60606004805461034290610f46565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105375760405162461bcd60e51b81526004016104c990610fa9565b6104dc8282610c96565b6000338161054f82866107f3565b9050838110156105af5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104c9565b6103f8828686840361081e565b6000336103d38185856109bd565b834211156106265760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104c9565b6001600160a01b03871660009081526005602052604081208054600080516020611033833981519152918a918a918a91908661066183610ff9565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006106bf610403565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa15801561074a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906107805750896001600160a01b0316816001600160a01b0316145b6107dc5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104c9565b6107e78a8a8a61081e565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166108805760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104c9565b6001600160a01b0382166108e15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104c9565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600061094f84846107f3565b905060001981146109b757818110156109aa5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104c9565b6109b7848484840361081e565b50505050565b6001600160a01b038316610a215760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104c9565b6001600160a01b038216610a835760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104c9565b6001600160a01b03831660009081526020819052604090205481811015610afb5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104c9565b6001600160a01b0384811660008181526020818152604080832087870390559387168083529184902080548701905592518581529092600080516020611013833981519152910160405180910390a36109b7565b6000600080516020611053833981519152610b68610333565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c3f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104c9565b8060026000828254610c519190610f96565b90915550506001600160a01b03821660008181526020818152604080832080548601905551848152600080516020611013833981519152910160405180910390a35050565b6001600160a01b038216610cf65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104c9565b6001600160a01b03821660009081526020819052604090205481811015610d6a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104c9565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192916000805160206110138339815191529101610936565b600060208083528351808285015260005b81811015610ddb57858101830151858201604001528201610dbf565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610e1357600080fd5b919050565b60008060408385031215610e2b57600080fd5b610e3483610dfc565b946020939093013593505050565b600080600060608486031215610e5757600080fd5b610e6084610dfc565b9250610e6e60208501610dfc565b9150604084013590509250925092565b600060208284031215610e9057600080fd5b610e9982610dfc565b9392505050565b600080600080600080600060e0888a031215610ebb57600080fd5b610ec488610dfc565b9650610ed260208901610dfc565b95506040880135945060608801359350608088013560ff81168114610ef657600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f2657600080fd5b610f2f83610dfc565b9150610f3d60208401610dfc565b90509250929050565b600181811c90821680610f5a57607f821691505b602082108103610f7a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156103d9576103d9610f80565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b60006001820161100b5761100b610f80565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa26469706673582212203ea4a1224be7b5ef35dc397dfc81433d85cd6fdbf17d8b2e3d528071e7e612b564736f6c63430008140033501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe27545983a26469706673582212209433428555ad2611b778c6d4bd276ba680e0aee0111f4647137d5f0a5836619e64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMBridgeV2.json b/compiled-contracts/paris/PolygonZkEVMBridgeV2.json index 37e6e6d3e..38d5e4b29 100644 --- a/compiled-contracts/paris/PolygonZkEVMBridgeV2.json +++ b/compiled-contracts/paris/PolygonZkEVMBridgeV2.json @@ -917,8 +917,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561000f575f80fd5b50614dcf8061001d5f395ff3fe60806040526004361062000163575f3560e01c806315064c9614620001675780632072f6c5146200019757806322e95f2c14620001b0578063240ff37814620001e35780632dfdf0b514620001fa578063318aee3d14620002205780633c351e10146200028c5780633cbc795b14620002ad5780633e19704314620002e85780634b2f336d146200030c5780635ca1e165146200032d57806379e2cf97146200034457806381b1c174146200035b57806383f2440314620003935780638ed7e3f214620003b7578063aaa13cc214620003d8578063b8b284d014620003fc578063bab161bf1462000420578063be5831c71462000443578063cc4616321462000468578063ccaa2d11146200048c578063cd58657914620004b0578063d02103ca14620004c7578063d3476afe14620004ef578063dbc169761462000513578063ee25560b146200052a578063f5efcd791462000559578063fb570834146200057d575b5f80fd5b34801562000173575f80fd5b50606854620001829060ff1681565b60405190151581526020015b60405180910390f35b348015620001a3575f80fd5b50620001ae620005a1565b005b348015620001bc575f80fd5b50620001d4620001ce366004620029be565b620005d9565b6040516200018e9190620029f8565b620001ae620001f436600462002a61565b62000629565b34801562000206575f80fd5b506200021160535481565b6040519081526020016200018e565b3480156200022c575f80fd5b50620002676200023e36600462002adf565b606b6020525f908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b039091166020830152016200018e565b34801562000298575f80fd5b50606d54620001d4906001600160a01b031681565b348015620002b9575f80fd5b50606d54620002d290600160a01b900463ffffffff1681565b60405163ffffffff90911681526020016200018e565b348015620002f4575f80fd5b50620002116200030636600462002b13565b62000679565b34801562000318575f80fd5b50606e54620001d4906001600160a01b031681565b34801562000339575f80fd5b506200021162000705565b34801562000350575f80fd5b50620001ae620007ec565b34801562000367575f80fd5b50620001d46200037936600462002b98565b606a6020525f90815260409020546001600160a01b031681565b3480156200039f575f80fd5b5062000211620003b136600462002bc2565b62000810565b348015620003c3575f80fd5b50606c54620001d4906001600160a01b031681565b348015620003e4575f80fd5b50620001d4620003f636600462002c03565b620008e3565b34801562000408575f80fd5b50620001ae6200041a36600462002caf565b620009f8565b3480156200042c575f80fd5b50606854620002d290610100900463ffffffff1681565b3480156200044f575f80fd5b50606854620002d290600160c81b900463ffffffff1681565b34801562000474575f80fd5b50620001826200048636600462002d36565b62000a9d565b34801562000498575f80fd5b50620001ae620004aa36600462002d6c565b62000b2b565b620001ae620004c136600462002e5f565b62001033565b348015620004d3575f80fd5b50606854620001d490600160281b90046001600160a01b031681565b348015620004fb575f80fd5b50620001ae6200050d36600462002efa565b62001441565b3480156200051f575f80fd5b50620001ae620016c3565b34801562000536575f80fd5b50620002116200054836600462002b98565b60696020525f908152604090205481565b34801562000565575f80fd5b50620001ae6200057736600462002d6c565b620016f9565b34801562000589575f80fd5b50620001826200059b36600462002f6e565b62001990565b606c546001600160a01b03163314620005cd57604051631736745960e31b815260040160405180910390fd5b620005d7620019ab565b565b5f606a5f8484604051602001620005f292919062002fb8565b60408051601f198184030181529181528151602092830120835290820192909252015f20546001600160a01b031690505b92915050565b3415801590620006435750606e546001600160a01b031615155b1562000662576040516301bd897160e61b815260040160405180910390fd5b6200067285853486868662001a07565b5050505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b6053545f90819081805b6020811015620007e3578083901c6001166001036200077257603381602081106200073e576200073e62002fe2565b0154846040516020016200075492919062002ff6565b604051602081830303815290604052805190602001209350620007a0565b83826040516020016200078792919062002ff6565b6040516020818303038152906040528051906020012093505b8182604051602001620007b592919062002ff6565b6040516020818303038152906040528051906020012091508080620007da9062003018565b9150506200070f565b50919392505050565b605354606854600160c81b900463ffffffff161015620005d757620005d762001ac4565b5f83815b6020811015620008da57600163ffffffff8516821c811690036200087e5784816020811062000847576200084762002fe2565b6020020135826040516020016200086092919062002ff6565b604051602081830303815290604052805190602001209150620008c5565b8185826020811062000894576200089462002fe2565b6020020135604051602001620008ac92919062002ff6565b6040516020818303038152906040528051906020012091505b80620008d18162003018565b91505062000814565b50949350505050565b5f808888604051602001620008fa92919062002fb8565b6040516020818303038152906040528051906020012090505f60ff60f81b3083604051806020016200092c9062002984565b601f1982820381018352601f90910116604081905262000959908d908d908d908d908d906020016200305b565b60408051601f1981840301815290829052620009799291602001620030bf565b60405160208183030381529060405280519060200120604051602001620009d294939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b606e546001600160a01b031662000a225760405163dde3cda760e01b815260040160405180910390fd5b606e54604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac9062000a569033908890600401620030f1565b5f604051808303815f87803b15801562000a6e575f80fd5b505af115801562000a81573d5f803e3d5ffd5b5050505062000a9586868686868662001a07565b505050505050565b6068545f908190610100900463ffffffff1615801562000ac3575063ffffffff83166001145b1562000ad7575063ffffffff831662000b02565b62000aed600160201b63ffffffff85166200310a565b62000aff9063ffffffff861662003124565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000b5057604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161462000b81576040516302caf51760e11b815260040160405180910390fd5b62000bba8c8c8c8c8c62000bb45f8e8e8e8e8e8e8e60405162000ba69291906200313a565b604051809103902062000679565b62001b5d565b6001600160a01b03861662000cf757606e546001600160a01b031662000c8e575f6001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000c13576020820181803683370190505b5060405162000c2391906200315d565b5f6040518083038185875af1925050503d805f811462000c5f576040519150601f19603f3d011682016040523d82523d5f602084013e62000c64565b606091505b505090508062000c8757604051630ce8f45160e31b815260040160405180910390fd5b5062000ff6565b606e546040516340c10f1960e01b81526001600160a01b03909116906340c10f199062000cc29087908790600401620030f1565b5f604051808303815f87803b15801562000cda575f80fd5b505af115801562000ced573d5f803e3d5ffd5b5050505062000ff6565b606d546001600160a01b03878116911614801562000d265750606d5463ffffffff888116600160a01b90920416145b1562000d3f575f6001600160a01b038516848262000be8565b60685463ffffffff61010090910481169088160362000d745762000d6e6001600160a01b038716858562001cb5565b62000ff6565b5f878760405160200162000d8a92919062002fb8565b60408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b03168062000f93575f808062000dd1868801886200322e565b9250925092505f8584848460405162000dea9062002984565b62000df893929190620032d6565b8190604051809103905ff590508015801562000e16573d5f803e3d5ffd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f199062000e4a908d908d90600401620030f1565b5f604051808303815f87803b15801562000e62575f80fd5b505af115801562000e75573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000f8195949392919062003312565b60405180910390a15050505062000ff3565b6040516340c10f1960e01b81526001600160a01b038216906340c10f199062000fc39089908990600401620030f1565b5f604051808303815f87803b15801562000fdb575f80fd5b505af115801562000fee573d5f803e3d5ffd5b505050505b50505b5f8051602062004d7a8339815191528a888887876040516200101d9594939291906200334c565b60405180910390a1505050505050505050505050565b60685460ff16156200105857604051630bc011ff60e21b815260040160405180910390fd5b6200106262001d14565b60685463ffffffff61010090910481169088160362001094576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b038816620010ed57883414620010c95760405163b89240f560e01b815260040160405180910390fd5b606d546001600160a01b0381169450600160a01b900463ffffffff169250620013c0565b34156200110d5760405163798ee6f160e01b815260040160405180910390fd5b606e546001600160a01b03908116908916036200118957604051632770a7eb60e21b81526001600160a01b03891690639dc29fac90620011549033908d90600401620030f1565b5f604051808303815f87803b1580156200116c575f80fd5b505af11580156200117f573d5f803e3d5ffd5b50505050620013c0565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b900490921691810182905290156200124057604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac90620011fe9033908e90600401620030f1565b5f604051808303815f87803b15801562001216575f80fd5b505af115801562001229573d5f803e3d5ffd5b5050505080602001519450805f01519350620013be565b8515620012555762001255898b898962001d6f565b6040516370a0823160e01b81525f906001600160a01b038b16906370a082319062001285903090600401620029f8565b602060405180830381865afa158015620012a1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620012c791906200337e565b9050620012e06001600160a01b038b1633308e620020c6565b6040516370a0823160e01b81525f906001600160a01b038c16906370a082319062001310903090600401620029f8565b602060405180830381865afa1580156200132c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200135291906200337e565b905062001360828262003396565b6068548c9850610100900463ffffffff1696509350620013808762002100565b6200138b8c620021c3565b620013968d6200227d565b604051602001620013aa93929190620032d6565b604051602081830303815290604052945050505b505b5f8051602062004d5a8339815191525f84868e8e8688605354604051620013ef989796959493929190620033ac565b60405180910390a162001419620014135f85878f8f87898051906020012062000679565b6200233a565b86156200142a576200142a62001ac4565b505050506200143860018055565b50505050505050565b5f54610100900460ff16158080156200146057505f54600160ff909116105b80620014845750620014723062002436565b1580156200148457505f5460ff166001145b620014ed5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156200150f575f805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff891602600160281b600160c81b03191617600160281b6001600160a01b038681169190910291909117909155606c80546001600160a01b031916848316179055606d5416620015a457606d54600160a01b900463ffffffff16156200159e57604051630d43a60960e11b815260040160405180910390fd5b6200166c565b606d805463ffffffff8616600160a01b026001600160c01b03199091166001600160a01b038816171790556040515f90601290620015e29062002984565b6060808252600d908201526c2bb930b83832b21022ba3432b960991b608082015260a060208201819052600490820152630ae8aa8960e31b60c082015260ff909116604082015260e0018190604051809103905ff59050801580156200164a573d5f803e3d5ffd5b50606e80546001600160a01b0319166001600160a01b03929092169190911790555b6200167662002445565b801562000a95575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b606c546001600160a01b03163314620016ef57604051631736745960e31b815260040160405180910390fd5b620005d762002478565b60685460ff16156200171e57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146200174f576040516302caf51760e11b815260040160405180910390fd5b620017758c8c8c8c8c62000bb460018e8e8e8e8e8e8e60405162000ba69291906200313a565b606e545f906001600160a01b03166200183057846001600160a01b031684888a8686604051602401620017ac949392919062003418565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b17905251620017e391906200315d565b5f6040518083038185875af1925050503d805f81146200181f576040519150601f19603f3d011682016040523d82523d5f602084013e62001824565b606091505b50508091505062001933565b606e546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990620018649088908890600401620030f1565b5f604051808303815f87803b1580156200187c575f80fd5b505af11580156200188f573d5f803e3d5ffd5b50505050846001600160a01b031687898585604051602401620018b6949392919062003418565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b17905251620018ed91906200315d565b5f604051808303815f865af19150503d805f811462001928576040519150601f19603f3d011682016040523d82523d5f602084013e6200192d565b606091505b50909150505b8062001952576040516337e391c360e01b815260040160405180910390fd5b5f8051602062004d7a8339815191528b89898888604051620019799594939291906200334c565b60405180910390a150505050505050505050505050565b5f816200199f86868662000810565b1490505b949350505050565b60685460ff1615620019d057604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff61010090910481169087160362001a39576040516302caf51760e11b815260040160405180910390fd5b5f8051602062004d5a8339815191526001606860019054906101000a900463ffffffff1633898989888860535460405162001a7d9998979695949392919062003454565b60405180910390a162001ab8620014136001606860019054906101000a900463ffffffff16338a8a8a898960405162000ba69291906200313a565b821562000a955762000a955b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d62001b0d62000705565b6040518263ffffffff1660e01b815260040162001b2c91815260200190565b5f604051808303815f87803b15801562001b44575f80fd5b505af115801562001b57573d5f803e3d5ffd5b50505050565b6068545f90600160281b90046001600160a01b031663257b363262001b838686620024d0565b6040518263ffffffff1660e01b815260040162001ba291815260200190565b6020604051808303815f875af115801562001bbf573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001be591906200337e565b9050805f0362001c0757604051622f6fad60e01b815260040160405180910390fd5b5f80600160401b871660010362001c4d5786915062001c29848a848962001990565b62001c47576040516338105f3b60e21b815260040160405180910390fd5b62001c9e565b602087901c62001c5f816001620034c2565b915087925062001c7e62001c75868c8662000810565b8a838962001990565b62001c9c576040516338105f3b60e21b815260040160405180910390fd5b505b62001caa828262002504565b505050505050505050565b62001d0f8363a9059cbb60e01b848460405160240162001cd7929190620030f1565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152620025b2565b505050565b60026001540362001d685760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401620014e4565b6002600155565b5f62001d7f6004828486620034e9565b62001d8a9162003512565b9050632afa533160e01b6001600160e01b031982160162001f26575f80808080808062001dbb896004818d620034e9565b81019062001dca919062003543565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161462001e0b5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038616301462001e355760405163750643af60e01b815260040160405180910390fd5b8a851462001e56576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e169162001ed691906200315d565b5f604051808303815f865af19150503d805f811462001f11576040519150601f19603f3d011682016040523d82523d5f602084013e62001f16565b606091505b5050505050505050505062000672565b6001600160e01b031981166323f2ebc360e21b1462001f5857604051637141605d60e11b815260040160405180910390fd5b5f8080808080808062001f6f8a6004818e620034e9565b81019062001f7e919062003599565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462001fc15760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038716301462001feb5760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f16916200207491906200315d565b5f604051808303815f865af19150503d805f8114620020af576040519150601f19603f3d011682016040523d82523d5f602084013e620020b4565b606091505b50505050505050505050505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905262001b579085906323b872dd60e01b9060840162001cd7565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b17905290516060915f9182916001600160a01b038616916200214891906200315d565b5f60405180830381855afa9150503d805f811462002182576040519150601f19603f3d011682016040523d82523d5f602084013e62002187565b606091505b509150915081620021b857604051806040016040528060078152602001664e4f5f4e414d4560c81b815250620019a3565b620019a3816200268a565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b17905290516060915f9182916001600160a01b038616916200220b91906200315d565b5f60405180830381855afa9150503d805f811462002245576040519150601f19603f3d011682016040523d82523d5f602084013e6200224a565b606091505b509150915081620021b857604051806040016040528060098152602001681393d7d4d6535093d360ba1b815250620019a3565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f91829182916001600160a01b03861691620022c491906200315d565b5f60405180830381855afa9150503d805f8114620022fe576040519150601f19603f3d011682016040523d82523d5f602084013e62002303565b606091505b509150915081801562002317575080516020145b62002324576012620019a3565b80806020019051810190620019a3919062003620565b8060016200234b6020600262003737565b62002357919062003396565b6053541062002379576040516377ae67b360e11b815260040160405180910390fd5b5f60535f81546200238a9062003018565b918290555090505f5b602081101562002425578082901c600116600103620023cb578260338260208110620023c357620023c362002fe2565b015550505050565b60338160208110620023e157620023e162002fe2565b015483604051602001620023f792919062002ff6565b60405160208183030381529060405280519060200120925080806200241c9062003018565b91505062002393565b5062001d0f62003744565b60018055565b6001600160a01b03163b151590565b5f54610100900460ff166200246e5760405162461bcd60e51b8152600401620014e49062003758565b620005d76200282e565b60685460ff166200249c57604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f8282604051602001620024e692919062002ff6565b60405160208183030381529060405280519060200120905092915050565b6068545f90610100900463ffffffff1615801562002528575063ffffffff82166001145b156200253c575063ffffffff821662002567565b62002552600160201b63ffffffff84166200310a565b620025649063ffffffff851662003124565b90505b600881901c5f8181526069602052604081208054600160ff861690811b918218928390559290919081831690036200143857604051630c8d9eab60e31b815260040160405180910390fd5b5f62002608826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620028579092919063ffffffff16565b80519091501562001d0f5780806020019051810190620026299190620037a3565b62001d0f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401620014e4565b60606040825110620026ac5781806020019051810190620006239190620037c1565b8151602003620027fb575f5b602081108015620026eb5750828181518110620026d957620026d962002fe2565b01602001516001600160f81b03191615155b15620027065780620026fd8162003018565b915050620026b8565b805f036200273e5750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b5f816001600160401b038111156200275a576200275a62003149565b6040519080825280601f01601f19166020018201604052801562002785576020820181803683370190505b5090505f5b82811015620027f357848181518110620027a857620027a862002fe2565b602001015160f81c60f81b828281518110620027c857620027c862002fe2565b60200101906001600160f81b03191690815f1a90535080620027ea8162003018565b9150506200278a565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b5f54610100900460ff16620024305760405162461bcd60e51b8152600401620014e49062003758565b6060620019a384845f85855f80866001600160a01b031685876040516200287f91906200315d565b5f6040518083038185875af1925050503d805f8114620028bb576040519150601f19603f3d011682016040523d82523d5f602084013e620028c0565b606091505b5091509150620028d387838387620028de565b979650505050505050565b60608315620029515782515f036200294957620028fb8562002436565b620029495760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620014e4565b5081620019a3565b620019a38383815115620029685781518083602001fd5b8060405162461bcd60e51b8152600401620014e491906200383b565b61150a806200385083390190565b803563ffffffff8116811462002829575f80fd5b6001600160a01b0381168114620029bb575f80fd5b50565b5f8060408385031215620029d0575f80fd5b620029db8362002992565b91506020830135620029ed81620029a6565b809150509250929050565b6001600160a01b0391909116815260200190565b8015158114620029bb575f80fd5b5f8083601f84011262002a2b575f80fd5b5081356001600160401b0381111562002a42575f80fd5b60208301915083602082850101111562002a5a575f80fd5b9250929050565b5f805f805f6080868803121562002a76575f80fd5b62002a818662002992565b9450602086013562002a9381620029a6565b9350604086013562002aa58162002a0c565b925060608601356001600160401b0381111562002ac0575f80fd5b62002ace8882890162002a1a565b969995985093965092949392505050565b5f6020828403121562002af0575f80fd5b813562002afd81620029a6565b9392505050565b60ff81168114620029bb575f80fd5b5f805f805f805f60e0888a03121562002b2a575f80fd5b873562002b378162002b04565b965062002b476020890162002992565b9550604088013562002b5981620029a6565b945062002b696060890162002992565b9350608088013562002b7b81620029a6565b9699959850939692959460a0840135945060c09093013592915050565b5f6020828403121562002ba9575f80fd5b5035919050565b80610400810183101562000623575f80fd5b5f805f610440848603121562002bd6575f80fd5b8335925062002be9856020860162002bb0565b915062002bfa610420850162002992565b90509250925092565b5f805f805f805f60a0888a03121562002c1a575f80fd5b62002c258862002992565b9650602088013562002c3781620029a6565b955060408801356001600160401b038082111562002c53575f80fd5b62002c618b838c0162002a1a565b909750955060608a013591508082111562002c7a575f80fd5b5062002c898a828b0162002a1a565b909450925050608088013562002c9f8162002b04565b8091505092959891949750929550565b5f805f805f8060a0878903121562002cc5575f80fd5b62002cd08762002992565b9550602087013562002ce281620029a6565b945060408701359350606087013562002cfb8162002a0c565b925060808701356001600160401b0381111562002d16575f80fd5b62002d2489828a0162002a1a565b979a9699509497509295939492505050565b5f806040838503121562002d48575f80fd5b62002d538362002992565b915062002d636020840162002992565b90509250929050565b5f805f805f805f805f805f806109208d8f03121562002d89575f80fd5b62002d958e8e62002bb0565b9b5062002da78e6104008f0162002bb0565b9a506108008d013599506108208d013598506108408d0135975062002dd06108608e0162002992565b965062002de26108808e0135620029a6565b6108808d0135955062002df96108a08e0162002992565b945062002e0b6108c08e0135620029a6565b6108c08d013593506108e08d013592506001600160401b036109008e0135111562002e34575f80fd5b62002e478e6109008f01358f0162002a1a565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121562002e76575f80fd5b62002e818862002992565b9650602088013562002e9381620029a6565b955060408801359450606088013562002eac81620029a6565b9350608088013562002ebe8162002a0c565b925060a08801356001600160401b0381111562002ed9575f80fd5b62002ee78a828b0162002a1a565b989b979a50959850939692959293505050565b5f805f805f60a0868803121562002f0f575f80fd5b62002f1a8662002992565b9450602086013562002f2c81620029a6565b935062002f3c6040870162002992565b9250606086013562002f4e81620029a6565b9150608086013562002f6081620029a6565b809150509295509295909350565b5f805f80610460858703121562002f83575f80fd5b8435935062002f96866020870162002bb0565b925062002fa7610420860162002992565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b634e487b7160e01b5f52603260045260245ffd5b918252602082015260400190565b634e487b7160e01b5f52601160045260245ffd5b5f600182016200302c576200302c62003004565b5060010190565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b606081525f6200307060608301878962003033565b82810360208401526200308581868862003033565b91505060ff831660408301529695505050505050565b5f5b83811015620030b75781810151838201526020016200309d565b50505f910152565b5f8351620030d28184602088016200309b565b835190830190620030e88183602088016200309b565b01949350505050565b6001600160a01b03929092168252602082015260400190565b808202811582820484141762000623576200062362003004565b8082018082111562000623576200062362003004565b818382375f9101908152919050565b634e487b7160e01b5f52604160045260245ffd5b5f8251620031708184602087016200309b565b9190910192915050565b604051601f8201601f191681016001600160401b0381118282101715620031a557620031a562003149565b604052919050565b5f6001600160401b03821115620031c857620031c862003149565b50601f01601f191660200190565b5f82601f830112620031e6575f80fd5b8135620031fd620031f782620031ad565b6200317a565b81815284602083860101111562003212575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003241575f80fd5b83356001600160401b038082111562003258575f80fd5b6200326687838801620031d6565b945060208601359150808211156200327c575f80fd5b506200328b86828701620031d6565b92505060408401356200329e8162002b04565b809150509250925092565b5f8151808452620032c28160208601602086016200309b565b601f01601f19169290920160200192915050565b606081525f620032ea6060830186620032a9565b8281036020840152620032fe8186620032a9565b91505060ff83166040830152949350505050565b63ffffffff861681526001600160a01b038581166020830152841660408201526080606082018190525f90620028d3908301848662003033565b94855263ffffffff9390931660208501526001600160a01b039182166040850152166060830152608082015260a00190565b5f602082840312156200338f575f80fd5b5051919050565b8181038181111562000623576200062362003004565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c083018190525f91620033ff84830187620032a9565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff841660208201526060604082018190525f906200344a908301848662003033565b9695505050505050565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c083018190525f91620034a8848301878962003033565b925080851660e085015250509a9950505050505050505050565b63ffffffff818116838216019080821115620034e257620034e262003004565b5092915050565b5f8085851115620034f8575f80fd5b8386111562003505575f80fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156200353b5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a0312156200355a575f80fd5b87356200356781620029a6565b965060208801356200357981620029a6565b95506040880135945060608801359350608088013562002b7b8162002b04565b5f805f805f805f80610100898b031215620035b2575f80fd5b8835620035bf81620029a6565b97506020890135620035d181620029a6565b965060408901359550606089013594506080890135620035f18162002a0c565b935060a0890135620036038162002b04565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562003631575f80fd5b815162002afd8162002b04565b600181815b808511156200367e57815f190482111562003662576200366262003004565b808516156200367057918102915b93841c939080029062003643565b509250929050565b5f82620036965750600162000623565b81620036a457505f62000623565b8160018114620036bd5760028114620036c857620036e8565b600191505062000623565b60ff841115620036dc57620036dc62003004565b50506001821b62000623565b5060208310610133831016604e8410600b84101617156200370d575081810a62000623565b6200371983836200363e565b805f19048211156200372f576200372f62003004565b029392505050565b5f62002afd838362003686565b634e487b7160e01b5f52600160045260245ffd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f60208284031215620037b4575f80fd5b815162002afd8162002a0c565b5f60208284031215620037d2575f80fd5b81516001600160401b03811115620037e8575f80fd5b8201601f81018413620037f9575f80fd5b80516200380a620031f782620031ad565b8181528560208385010111156200381f575f80fd5b620038328260208301602086016200309b565b95945050505050565b602081525f62002afd6020830184620032a956fe61010060405234801562000011575f80fd5b506040516200150a3803806200150a833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161106c6200049e5f395f61019e01525f818161025f0152818161047f01526104ed01525f61043101525f81816102c401526103fb015261106c5ff3fe608060405234801561000f575f80fd5b5060043610610105575f3560e01c806306fdde0314610109578063095ea7b31461012757806318160ddd1461014a57806320606b701461015c57806323b872dd1461017057806330adf81f14610183578063313ce567146101975780633644e515146101c857806339509351146101d057806340c10f19146101e357806370a08231146101f85780637ecebe001461022057806395d89b411461023f5780639dc29fac14610247578063a3c573eb1461025a578063a457c2d714610299578063a9059cbb146102ac578063cd0d0096146102bf578063d505accf146102e6578063dd62ed3e146102f9578063ffa1ad741461030c575b5f80fd5b61011161032c565b60405161011e9190610d8a565b60405180910390f35b61013a610135366004610df0565b6103bc565b604051901515815260200161011e565b6002545b60405190815260200161011e565b61014e5f8051602061101783398151915281565b61013a61017e366004610e18565b6103d5565b61014e5f80516020610ff783398151915281565b60405160ff7f000000000000000000000000000000000000000000000000000000000000000016815260200161011e565b61014e6103f8565b61013a6101de366004610df0565b610453565b6101f66101f1366004610df0565b610474565b005b61014e610206366004610e51565b6001600160a01b03165f9081526020819052604090205490565b61014e61022e366004610e51565b60056020525f908152604090205481565b6101116104d3565b6101f6610255366004610df0565b6104e2565b6102817f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161011e565b61013a6102a7366004610df0565b610534565b61013a6102ba366004610df0565b6105ae565b61014e7f000000000000000000000000000000000000000000000000000000000000000081565b6101f66102f4366004610e71565b6105bb565b61014e610307366004610ede565b6107de565b610111604051806040016040528060018152602001603160f81b81525081565b60606003805461033b90610f0f565b80601f016020809104026020016040519081016040528092919081815260200182805461036790610f0f565b80156103b25780601f10610389576101008083540402835291602001916103b2565b820191905f5260205f20905b81548152906001019060200180831161039557829003601f168201915b5050505050905090565b5f336103c9818585610808565b60019150505b92915050565b5f336103e285828561092c565b6103ed8585856109a4565b506001949350505050565b5f7f0000000000000000000000000000000000000000000000000000000000000000461461042e5761042946610b33565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b5f336103c981858561046583836107de565b61046f9190610f5b565b610808565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104c55760405162461bcd60e51b81526004016104bc90610f6e565b60405180910390fd5b6104cf8282610bcb565b5050565b60606004805461033b90610f0f565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461052a5760405162461bcd60e51b81526004016104bc90610f6e565b6104cf8282610c75565b5f338161054182866107de565b9050838110156105a15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104bc565b6103ed8286868403610808565b5f336103c98185856109a4565b834211156106175760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104bc565b6001600160a01b0387165f90815260056020526040812080545f80516020610ff7833981519152918a918a918a91908661065083610fbe565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6106ad6103f8565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f1981840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610735573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381161580159061076b5750896001600160a01b0316816001600160a01b0316145b6107c75760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104bc565b6107d28a8a8a610808565b50505050505050505050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661086a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104bc565b6001600160a01b0382166108cb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104bc565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b5f61093784846107de565b90505f19811461099e57818110156109915760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104bc565b61099e8484848403610808565b50505050565b6001600160a01b038316610a085760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104bc565b6001600160a01b038216610a6a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104bc565b6001600160a01b0383165f9081526020819052604090205481811015610ae15760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104bc565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290925f80516020610fd7833981519152910160405180910390a361099e565b5f5f80516020611017833981519152610b4a61032c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c215760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104bc565b8060025f828254610c329190610f5b565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481525f80516020610fd7833981519152910160405180910390a35050565b6001600160a01b038216610cd55760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104bc565b6001600160a01b0382165f9081526020819052604090205481811015610d485760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104bc565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192915f80516020610fd7833981519152910161091f565b5f6020808352835180828501525f5b81811015610db557858101830151858201604001528201610d99565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610deb575f80fd5b919050565b5f8060408385031215610e01575f80fd5b610e0a83610dd5565b946020939093013593505050565b5f805f60608486031215610e2a575f80fd5b610e3384610dd5565b9250610e4160208501610dd5565b9150604084013590509250925092565b5f60208284031215610e61575f80fd5b610e6a82610dd5565b9392505050565b5f805f805f805f60e0888a031215610e87575f80fd5b610e9088610dd5565b9650610e9e60208901610dd5565b95506040880135945060608801359350608088013560ff81168114610ec1575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215610eef575f80fd5b610ef883610dd5565b9150610f0660208401610dd5565b90509250929050565b600181811c90821680610f2357607f821691505b602082108103610f4157634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156103cf576103cf610f47565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b5f60018201610fcf57610fcf610f47565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa26469706673582212206c12be332dd873b7cf88c58dfc4762858b63e8ff3bf8563b47828a5a4272643b64736f6c63430008140033501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4da264697066735822122051dba377c61d9aeab1e5350deccb942cf9d53197269f447215de0dba14c9847264736f6c63430008140033", - "deployedBytecode": "0x60806040526004361062000163575f3560e01c806315064c9614620001675780632072f6c5146200019757806322e95f2c14620001b0578063240ff37814620001e35780632dfdf0b514620001fa578063318aee3d14620002205780633c351e10146200028c5780633cbc795b14620002ad5780633e19704314620002e85780634b2f336d146200030c5780635ca1e165146200032d57806379e2cf97146200034457806381b1c174146200035b57806383f2440314620003935780638ed7e3f214620003b7578063aaa13cc214620003d8578063b8b284d014620003fc578063bab161bf1462000420578063be5831c71462000443578063cc4616321462000468578063ccaa2d11146200048c578063cd58657914620004b0578063d02103ca14620004c7578063d3476afe14620004ef578063dbc169761462000513578063ee25560b146200052a578063f5efcd791462000559578063fb570834146200057d575b5f80fd5b34801562000173575f80fd5b50606854620001829060ff1681565b60405190151581526020015b60405180910390f35b348015620001a3575f80fd5b50620001ae620005a1565b005b348015620001bc575f80fd5b50620001d4620001ce366004620029be565b620005d9565b6040516200018e9190620029f8565b620001ae620001f436600462002a61565b62000629565b34801562000206575f80fd5b506200021160535481565b6040519081526020016200018e565b3480156200022c575f80fd5b50620002676200023e36600462002adf565b606b6020525f908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b039091166020830152016200018e565b34801562000298575f80fd5b50606d54620001d4906001600160a01b031681565b348015620002b9575f80fd5b50606d54620002d290600160a01b900463ffffffff1681565b60405163ffffffff90911681526020016200018e565b348015620002f4575f80fd5b50620002116200030636600462002b13565b62000679565b34801562000318575f80fd5b50606e54620001d4906001600160a01b031681565b34801562000339575f80fd5b506200021162000705565b34801562000350575f80fd5b50620001ae620007ec565b34801562000367575f80fd5b50620001d46200037936600462002b98565b606a6020525f90815260409020546001600160a01b031681565b3480156200039f575f80fd5b5062000211620003b136600462002bc2565b62000810565b348015620003c3575f80fd5b50606c54620001d4906001600160a01b031681565b348015620003e4575f80fd5b50620001d4620003f636600462002c03565b620008e3565b34801562000408575f80fd5b50620001ae6200041a36600462002caf565b620009f8565b3480156200042c575f80fd5b50606854620002d290610100900463ffffffff1681565b3480156200044f575f80fd5b50606854620002d290600160c81b900463ffffffff1681565b34801562000474575f80fd5b50620001826200048636600462002d36565b62000a9d565b34801562000498575f80fd5b50620001ae620004aa36600462002d6c565b62000b2b565b620001ae620004c136600462002e5f565b62001033565b348015620004d3575f80fd5b50606854620001d490600160281b90046001600160a01b031681565b348015620004fb575f80fd5b50620001ae6200050d36600462002efa565b62001441565b3480156200051f575f80fd5b50620001ae620016c3565b34801562000536575f80fd5b50620002116200054836600462002b98565b60696020525f908152604090205481565b34801562000565575f80fd5b50620001ae6200057736600462002d6c565b620016f9565b34801562000589575f80fd5b50620001826200059b36600462002f6e565b62001990565b606c546001600160a01b03163314620005cd57604051631736745960e31b815260040160405180910390fd5b620005d7620019ab565b565b5f606a5f8484604051602001620005f292919062002fb8565b60408051601f198184030181529181528151602092830120835290820192909252015f20546001600160a01b031690505b92915050565b3415801590620006435750606e546001600160a01b031615155b1562000662576040516301bd897160e61b815260040160405180910390fd5b6200067285853486868662001a07565b5050505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b6053545f90819081805b6020811015620007e3578083901c6001166001036200077257603381602081106200073e576200073e62002fe2565b0154846040516020016200075492919062002ff6565b604051602081830303815290604052805190602001209350620007a0565b83826040516020016200078792919062002ff6565b6040516020818303038152906040528051906020012093505b8182604051602001620007b592919062002ff6565b6040516020818303038152906040528051906020012091508080620007da9062003018565b9150506200070f565b50919392505050565b605354606854600160c81b900463ffffffff161015620005d757620005d762001ac4565b5f83815b6020811015620008da57600163ffffffff8516821c811690036200087e5784816020811062000847576200084762002fe2565b6020020135826040516020016200086092919062002ff6565b604051602081830303815290604052805190602001209150620008c5565b8185826020811062000894576200089462002fe2565b6020020135604051602001620008ac92919062002ff6565b6040516020818303038152906040528051906020012091505b80620008d18162003018565b91505062000814565b50949350505050565b5f808888604051602001620008fa92919062002fb8565b6040516020818303038152906040528051906020012090505f60ff60f81b3083604051806020016200092c9062002984565b601f1982820381018352601f90910116604081905262000959908d908d908d908d908d906020016200305b565b60408051601f1981840301815290829052620009799291602001620030bf565b60405160208183030381529060405280519060200120604051602001620009d294939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b606e546001600160a01b031662000a225760405163dde3cda760e01b815260040160405180910390fd5b606e54604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac9062000a569033908890600401620030f1565b5f604051808303815f87803b15801562000a6e575f80fd5b505af115801562000a81573d5f803e3d5ffd5b5050505062000a9586868686868662001a07565b505050505050565b6068545f908190610100900463ffffffff1615801562000ac3575063ffffffff83166001145b1562000ad7575063ffffffff831662000b02565b62000aed600160201b63ffffffff85166200310a565b62000aff9063ffffffff861662003124565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000b5057604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161462000b81576040516302caf51760e11b815260040160405180910390fd5b62000bba8c8c8c8c8c62000bb45f8e8e8e8e8e8e8e60405162000ba69291906200313a565b604051809103902062000679565b62001b5d565b6001600160a01b03861662000cf757606e546001600160a01b031662000c8e575f6001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000c13576020820181803683370190505b5060405162000c2391906200315d565b5f6040518083038185875af1925050503d805f811462000c5f576040519150601f19603f3d011682016040523d82523d5f602084013e62000c64565b606091505b505090508062000c8757604051630ce8f45160e31b815260040160405180910390fd5b5062000ff6565b606e546040516340c10f1960e01b81526001600160a01b03909116906340c10f199062000cc29087908790600401620030f1565b5f604051808303815f87803b15801562000cda575f80fd5b505af115801562000ced573d5f803e3d5ffd5b5050505062000ff6565b606d546001600160a01b03878116911614801562000d265750606d5463ffffffff888116600160a01b90920416145b1562000d3f575f6001600160a01b038516848262000be8565b60685463ffffffff61010090910481169088160362000d745762000d6e6001600160a01b038716858562001cb5565b62000ff6565b5f878760405160200162000d8a92919062002fb8565b60408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b03168062000f93575f808062000dd1868801886200322e565b9250925092505f8584848460405162000dea9062002984565b62000df893929190620032d6565b8190604051809103905ff590508015801562000e16573d5f803e3d5ffd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f199062000e4a908d908d90600401620030f1565b5f604051808303815f87803b15801562000e62575f80fd5b505af115801562000e75573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000f8195949392919062003312565b60405180910390a15050505062000ff3565b6040516340c10f1960e01b81526001600160a01b038216906340c10f199062000fc39089908990600401620030f1565b5f604051808303815f87803b15801562000fdb575f80fd5b505af115801562000fee573d5f803e3d5ffd5b505050505b50505b5f8051602062004d7a8339815191528a888887876040516200101d9594939291906200334c565b60405180910390a1505050505050505050505050565b60685460ff16156200105857604051630bc011ff60e21b815260040160405180910390fd5b6200106262001d14565b60685463ffffffff61010090910481169088160362001094576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b038816620010ed57883414620010c95760405163b89240f560e01b815260040160405180910390fd5b606d546001600160a01b0381169450600160a01b900463ffffffff169250620013c0565b34156200110d5760405163798ee6f160e01b815260040160405180910390fd5b606e546001600160a01b03908116908916036200118957604051632770a7eb60e21b81526001600160a01b03891690639dc29fac90620011549033908d90600401620030f1565b5f604051808303815f87803b1580156200116c575f80fd5b505af11580156200117f573d5f803e3d5ffd5b50505050620013c0565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b900490921691810182905290156200124057604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac90620011fe9033908e90600401620030f1565b5f604051808303815f87803b15801562001216575f80fd5b505af115801562001229573d5f803e3d5ffd5b5050505080602001519450805f01519350620013be565b8515620012555762001255898b898962001d6f565b6040516370a0823160e01b81525f906001600160a01b038b16906370a082319062001285903090600401620029f8565b602060405180830381865afa158015620012a1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620012c791906200337e565b9050620012e06001600160a01b038b1633308e620020c6565b6040516370a0823160e01b81525f906001600160a01b038c16906370a082319062001310903090600401620029f8565b602060405180830381865afa1580156200132c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200135291906200337e565b905062001360828262003396565b6068548c9850610100900463ffffffff1696509350620013808762002100565b6200138b8c620021c3565b620013968d6200227d565b604051602001620013aa93929190620032d6565b604051602081830303815290604052945050505b505b5f8051602062004d5a8339815191525f84868e8e8688605354604051620013ef989796959493929190620033ac565b60405180910390a162001419620014135f85878f8f87898051906020012062000679565b6200233a565b86156200142a576200142a62001ac4565b505050506200143860018055565b50505050505050565b5f54610100900460ff16158080156200146057505f54600160ff909116105b80620014845750620014723062002436565b1580156200148457505f5460ff166001145b620014ed5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156200150f575f805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff891602600160281b600160c81b03191617600160281b6001600160a01b038681169190910291909117909155606c80546001600160a01b031916848316179055606d5416620015a457606d54600160a01b900463ffffffff16156200159e57604051630d43a60960e11b815260040160405180910390fd5b6200166c565b606d805463ffffffff8616600160a01b026001600160c01b03199091166001600160a01b038816171790556040515f90601290620015e29062002984565b6060808252600d908201526c2bb930b83832b21022ba3432b960991b608082015260a060208201819052600490820152630ae8aa8960e31b60c082015260ff909116604082015260e0018190604051809103905ff59050801580156200164a573d5f803e3d5ffd5b50606e80546001600160a01b0319166001600160a01b03929092169190911790555b6200167662002445565b801562000a95575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b606c546001600160a01b03163314620016ef57604051631736745960e31b815260040160405180910390fd5b620005d762002478565b60685460ff16156200171e57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146200174f576040516302caf51760e11b815260040160405180910390fd5b620017758c8c8c8c8c62000bb460018e8e8e8e8e8e8e60405162000ba69291906200313a565b606e545f906001600160a01b03166200183057846001600160a01b031684888a8686604051602401620017ac949392919062003418565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b17905251620017e391906200315d565b5f6040518083038185875af1925050503d805f81146200181f576040519150601f19603f3d011682016040523d82523d5f602084013e62001824565b606091505b50508091505062001933565b606e546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990620018649088908890600401620030f1565b5f604051808303815f87803b1580156200187c575f80fd5b505af11580156200188f573d5f803e3d5ffd5b50505050846001600160a01b031687898585604051602401620018b6949392919062003418565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b17905251620018ed91906200315d565b5f604051808303815f865af19150503d805f811462001928576040519150601f19603f3d011682016040523d82523d5f602084013e6200192d565b606091505b50909150505b8062001952576040516337e391c360e01b815260040160405180910390fd5b5f8051602062004d7a8339815191528b89898888604051620019799594939291906200334c565b60405180910390a150505050505050505050505050565b5f816200199f86868662000810565b1490505b949350505050565b60685460ff1615620019d057604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff61010090910481169087160362001a39576040516302caf51760e11b815260040160405180910390fd5b5f8051602062004d5a8339815191526001606860019054906101000a900463ffffffff1633898989888860535460405162001a7d9998979695949392919062003454565b60405180910390a162001ab8620014136001606860019054906101000a900463ffffffff16338a8a8a898960405162000ba69291906200313a565b821562000a955762000a955b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d62001b0d62000705565b6040518263ffffffff1660e01b815260040162001b2c91815260200190565b5f604051808303815f87803b15801562001b44575f80fd5b505af115801562001b57573d5f803e3d5ffd5b50505050565b6068545f90600160281b90046001600160a01b031663257b363262001b838686620024d0565b6040518263ffffffff1660e01b815260040162001ba291815260200190565b6020604051808303815f875af115801562001bbf573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001be591906200337e565b9050805f0362001c0757604051622f6fad60e01b815260040160405180910390fd5b5f80600160401b871660010362001c4d5786915062001c29848a848962001990565b62001c47576040516338105f3b60e21b815260040160405180910390fd5b62001c9e565b602087901c62001c5f816001620034c2565b915087925062001c7e62001c75868c8662000810565b8a838962001990565b62001c9c576040516338105f3b60e21b815260040160405180910390fd5b505b62001caa828262002504565b505050505050505050565b62001d0f8363a9059cbb60e01b848460405160240162001cd7929190620030f1565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152620025b2565b505050565b60026001540362001d685760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401620014e4565b6002600155565b5f62001d7f6004828486620034e9565b62001d8a9162003512565b9050632afa533160e01b6001600160e01b031982160162001f26575f80808080808062001dbb896004818d620034e9565b81019062001dca919062003543565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161462001e0b5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038616301462001e355760405163750643af60e01b815260040160405180910390fd5b8a851462001e56576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e169162001ed691906200315d565b5f604051808303815f865af19150503d805f811462001f11576040519150601f19603f3d011682016040523d82523d5f602084013e62001f16565b606091505b5050505050505050505062000672565b6001600160e01b031981166323f2ebc360e21b1462001f5857604051637141605d60e11b815260040160405180910390fd5b5f8080808080808062001f6f8a6004818e620034e9565b81019062001f7e919062003599565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462001fc15760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038716301462001feb5760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f16916200207491906200315d565b5f604051808303815f865af19150503d805f8114620020af576040519150601f19603f3d011682016040523d82523d5f602084013e620020b4565b606091505b50505050505050505050505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905262001b579085906323b872dd60e01b9060840162001cd7565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b17905290516060915f9182916001600160a01b038616916200214891906200315d565b5f60405180830381855afa9150503d805f811462002182576040519150601f19603f3d011682016040523d82523d5f602084013e62002187565b606091505b509150915081620021b857604051806040016040528060078152602001664e4f5f4e414d4560c81b815250620019a3565b620019a3816200268a565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b17905290516060915f9182916001600160a01b038616916200220b91906200315d565b5f60405180830381855afa9150503d805f811462002245576040519150601f19603f3d011682016040523d82523d5f602084013e6200224a565b606091505b509150915081620021b857604051806040016040528060098152602001681393d7d4d6535093d360ba1b815250620019a3565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f91829182916001600160a01b03861691620022c491906200315d565b5f60405180830381855afa9150503d805f8114620022fe576040519150601f19603f3d011682016040523d82523d5f602084013e62002303565b606091505b509150915081801562002317575080516020145b62002324576012620019a3565b80806020019051810190620019a3919062003620565b8060016200234b6020600262003737565b62002357919062003396565b6053541062002379576040516377ae67b360e11b815260040160405180910390fd5b5f60535f81546200238a9062003018565b918290555090505f5b602081101562002425578082901c600116600103620023cb578260338260208110620023c357620023c362002fe2565b015550505050565b60338160208110620023e157620023e162002fe2565b015483604051602001620023f792919062002ff6565b60405160208183030381529060405280519060200120925080806200241c9062003018565b91505062002393565b5062001d0f62003744565b60018055565b6001600160a01b03163b151590565b5f54610100900460ff166200246e5760405162461bcd60e51b8152600401620014e49062003758565b620005d76200282e565b60685460ff166200249c57604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f8282604051602001620024e692919062002ff6565b60405160208183030381529060405280519060200120905092915050565b6068545f90610100900463ffffffff1615801562002528575063ffffffff82166001145b156200253c575063ffffffff821662002567565b62002552600160201b63ffffffff84166200310a565b620025649063ffffffff851662003124565b90505b600881901c5f8181526069602052604081208054600160ff861690811b918218928390559290919081831690036200143857604051630c8d9eab60e31b815260040160405180910390fd5b5f62002608826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620028579092919063ffffffff16565b80519091501562001d0f5780806020019051810190620026299190620037a3565b62001d0f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401620014e4565b60606040825110620026ac5781806020019051810190620006239190620037c1565b8151602003620027fb575f5b602081108015620026eb5750828181518110620026d957620026d962002fe2565b01602001516001600160f81b03191615155b15620027065780620026fd8162003018565b915050620026b8565b805f036200273e5750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b5f816001600160401b038111156200275a576200275a62003149565b6040519080825280601f01601f19166020018201604052801562002785576020820181803683370190505b5090505f5b82811015620027f357848181518110620027a857620027a862002fe2565b602001015160f81c60f81b828281518110620027c857620027c862002fe2565b60200101906001600160f81b03191690815f1a90535080620027ea8162003018565b9150506200278a565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b5f54610100900460ff16620024305760405162461bcd60e51b8152600401620014e49062003758565b6060620019a384845f85855f80866001600160a01b031685876040516200287f91906200315d565b5f6040518083038185875af1925050503d805f8114620028bb576040519150601f19603f3d011682016040523d82523d5f602084013e620028c0565b606091505b5091509150620028d387838387620028de565b979650505050505050565b60608315620029515782515f036200294957620028fb8562002436565b620029495760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620014e4565b5081620019a3565b620019a38383815115620029685781518083602001fd5b8060405162461bcd60e51b8152600401620014e491906200383b565b61150a806200385083390190565b803563ffffffff8116811462002829575f80fd5b6001600160a01b0381168114620029bb575f80fd5b50565b5f8060408385031215620029d0575f80fd5b620029db8362002992565b91506020830135620029ed81620029a6565b809150509250929050565b6001600160a01b0391909116815260200190565b8015158114620029bb575f80fd5b5f8083601f84011262002a2b575f80fd5b5081356001600160401b0381111562002a42575f80fd5b60208301915083602082850101111562002a5a575f80fd5b9250929050565b5f805f805f6080868803121562002a76575f80fd5b62002a818662002992565b9450602086013562002a9381620029a6565b9350604086013562002aa58162002a0c565b925060608601356001600160401b0381111562002ac0575f80fd5b62002ace8882890162002a1a565b969995985093965092949392505050565b5f6020828403121562002af0575f80fd5b813562002afd81620029a6565b9392505050565b60ff81168114620029bb575f80fd5b5f805f805f805f60e0888a03121562002b2a575f80fd5b873562002b378162002b04565b965062002b476020890162002992565b9550604088013562002b5981620029a6565b945062002b696060890162002992565b9350608088013562002b7b81620029a6565b9699959850939692959460a0840135945060c09093013592915050565b5f6020828403121562002ba9575f80fd5b5035919050565b80610400810183101562000623575f80fd5b5f805f610440848603121562002bd6575f80fd5b8335925062002be9856020860162002bb0565b915062002bfa610420850162002992565b90509250925092565b5f805f805f805f60a0888a03121562002c1a575f80fd5b62002c258862002992565b9650602088013562002c3781620029a6565b955060408801356001600160401b038082111562002c53575f80fd5b62002c618b838c0162002a1a565b909750955060608a013591508082111562002c7a575f80fd5b5062002c898a828b0162002a1a565b909450925050608088013562002c9f8162002b04565b8091505092959891949750929550565b5f805f805f8060a0878903121562002cc5575f80fd5b62002cd08762002992565b9550602087013562002ce281620029a6565b945060408701359350606087013562002cfb8162002a0c565b925060808701356001600160401b0381111562002d16575f80fd5b62002d2489828a0162002a1a565b979a9699509497509295939492505050565b5f806040838503121562002d48575f80fd5b62002d538362002992565b915062002d636020840162002992565b90509250929050565b5f805f805f805f805f805f806109208d8f03121562002d89575f80fd5b62002d958e8e62002bb0565b9b5062002da78e6104008f0162002bb0565b9a506108008d013599506108208d013598506108408d0135975062002dd06108608e0162002992565b965062002de26108808e0135620029a6565b6108808d0135955062002df96108a08e0162002992565b945062002e0b6108c08e0135620029a6565b6108c08d013593506108e08d013592506001600160401b036109008e0135111562002e34575f80fd5b62002e478e6109008f01358f0162002a1a565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121562002e76575f80fd5b62002e818862002992565b9650602088013562002e9381620029a6565b955060408801359450606088013562002eac81620029a6565b9350608088013562002ebe8162002a0c565b925060a08801356001600160401b0381111562002ed9575f80fd5b62002ee78a828b0162002a1a565b989b979a50959850939692959293505050565b5f805f805f60a0868803121562002f0f575f80fd5b62002f1a8662002992565b9450602086013562002f2c81620029a6565b935062002f3c6040870162002992565b9250606086013562002f4e81620029a6565b9150608086013562002f6081620029a6565b809150509295509295909350565b5f805f80610460858703121562002f83575f80fd5b8435935062002f96866020870162002bb0565b925062002fa7610420860162002992565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b634e487b7160e01b5f52603260045260245ffd5b918252602082015260400190565b634e487b7160e01b5f52601160045260245ffd5b5f600182016200302c576200302c62003004565b5060010190565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b606081525f6200307060608301878962003033565b82810360208401526200308581868862003033565b91505060ff831660408301529695505050505050565b5f5b83811015620030b75781810151838201526020016200309d565b50505f910152565b5f8351620030d28184602088016200309b565b835190830190620030e88183602088016200309b565b01949350505050565b6001600160a01b03929092168252602082015260400190565b808202811582820484141762000623576200062362003004565b8082018082111562000623576200062362003004565b818382375f9101908152919050565b634e487b7160e01b5f52604160045260245ffd5b5f8251620031708184602087016200309b565b9190910192915050565b604051601f8201601f191681016001600160401b0381118282101715620031a557620031a562003149565b604052919050565b5f6001600160401b03821115620031c857620031c862003149565b50601f01601f191660200190565b5f82601f830112620031e6575f80fd5b8135620031fd620031f782620031ad565b6200317a565b81815284602083860101111562003212575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003241575f80fd5b83356001600160401b038082111562003258575f80fd5b6200326687838801620031d6565b945060208601359150808211156200327c575f80fd5b506200328b86828701620031d6565b92505060408401356200329e8162002b04565b809150509250925092565b5f8151808452620032c28160208601602086016200309b565b601f01601f19169290920160200192915050565b606081525f620032ea6060830186620032a9565b8281036020840152620032fe8186620032a9565b91505060ff83166040830152949350505050565b63ffffffff861681526001600160a01b038581166020830152841660408201526080606082018190525f90620028d3908301848662003033565b94855263ffffffff9390931660208501526001600160a01b039182166040850152166060830152608082015260a00190565b5f602082840312156200338f575f80fd5b5051919050565b8181038181111562000623576200062362003004565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c083018190525f91620033ff84830187620032a9565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff841660208201526060604082018190525f906200344a908301848662003033565b9695505050505050565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c083018190525f91620034a8848301878962003033565b925080851660e085015250509a9950505050505050505050565b63ffffffff818116838216019080821115620034e257620034e262003004565b5092915050565b5f8085851115620034f8575f80fd5b8386111562003505575f80fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156200353b5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a0312156200355a575f80fd5b87356200356781620029a6565b965060208801356200357981620029a6565b95506040880135945060608801359350608088013562002b7b8162002b04565b5f805f805f805f80610100898b031215620035b2575f80fd5b8835620035bf81620029a6565b97506020890135620035d181620029a6565b965060408901359550606089013594506080890135620035f18162002a0c565b935060a0890135620036038162002b04565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562003631575f80fd5b815162002afd8162002b04565b600181815b808511156200367e57815f190482111562003662576200366262003004565b808516156200367057918102915b93841c939080029062003643565b509250929050565b5f82620036965750600162000623565b81620036a457505f62000623565b8160018114620036bd5760028114620036c857620036e8565b600191505062000623565b60ff841115620036dc57620036dc62003004565b50506001821b62000623565b5060208310610133831016604e8410600b84101617156200370d575081810a62000623565b6200371983836200363e565b805f19048211156200372f576200372f62003004565b029392505050565b5f62002afd838362003686565b634e487b7160e01b5f52600160045260245ffd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f60208284031215620037b4575f80fd5b815162002afd8162002a0c565b5f60208284031215620037d2575f80fd5b81516001600160401b03811115620037e8575f80fd5b8201601f81018413620037f9575f80fd5b80516200380a620031f782620031ad565b8181528560208385010111156200381f575f80fd5b620038328260208301602086016200309b565b95945050505050565b602081525f62002afd6020830184620032a956fe61010060405234801562000011575f80fd5b506040516200150a3803806200150a833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161106c6200049e5f395f61019e01525f818161025f0152818161047f01526104ed01525f61043101525f81816102c401526103fb015261106c5ff3fe608060405234801561000f575f80fd5b5060043610610105575f3560e01c806306fdde0314610109578063095ea7b31461012757806318160ddd1461014a57806320606b701461015c57806323b872dd1461017057806330adf81f14610183578063313ce567146101975780633644e515146101c857806339509351146101d057806340c10f19146101e357806370a08231146101f85780637ecebe001461022057806395d89b411461023f5780639dc29fac14610247578063a3c573eb1461025a578063a457c2d714610299578063a9059cbb146102ac578063cd0d0096146102bf578063d505accf146102e6578063dd62ed3e146102f9578063ffa1ad741461030c575b5f80fd5b61011161032c565b60405161011e9190610d8a565b60405180910390f35b61013a610135366004610df0565b6103bc565b604051901515815260200161011e565b6002545b60405190815260200161011e565b61014e5f8051602061101783398151915281565b61013a61017e366004610e18565b6103d5565b61014e5f80516020610ff783398151915281565b60405160ff7f000000000000000000000000000000000000000000000000000000000000000016815260200161011e565b61014e6103f8565b61013a6101de366004610df0565b610453565b6101f66101f1366004610df0565b610474565b005b61014e610206366004610e51565b6001600160a01b03165f9081526020819052604090205490565b61014e61022e366004610e51565b60056020525f908152604090205481565b6101116104d3565b6101f6610255366004610df0565b6104e2565b6102817f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161011e565b61013a6102a7366004610df0565b610534565b61013a6102ba366004610df0565b6105ae565b61014e7f000000000000000000000000000000000000000000000000000000000000000081565b6101f66102f4366004610e71565b6105bb565b61014e610307366004610ede565b6107de565b610111604051806040016040528060018152602001603160f81b81525081565b60606003805461033b90610f0f565b80601f016020809104026020016040519081016040528092919081815260200182805461036790610f0f565b80156103b25780601f10610389576101008083540402835291602001916103b2565b820191905f5260205f20905b81548152906001019060200180831161039557829003601f168201915b5050505050905090565b5f336103c9818585610808565b60019150505b92915050565b5f336103e285828561092c565b6103ed8585856109a4565b506001949350505050565b5f7f0000000000000000000000000000000000000000000000000000000000000000461461042e5761042946610b33565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b5f336103c981858561046583836107de565b61046f9190610f5b565b610808565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104c55760405162461bcd60e51b81526004016104bc90610f6e565b60405180910390fd5b6104cf8282610bcb565b5050565b60606004805461033b90610f0f565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461052a5760405162461bcd60e51b81526004016104bc90610f6e565b6104cf8282610c75565b5f338161054182866107de565b9050838110156105a15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104bc565b6103ed8286868403610808565b5f336103c98185856109a4565b834211156106175760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104bc565b6001600160a01b0387165f90815260056020526040812080545f80516020610ff7833981519152918a918a918a91908661065083610fbe565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6106ad6103f8565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f1981840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610735573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381161580159061076b5750896001600160a01b0316816001600160a01b0316145b6107c75760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104bc565b6107d28a8a8a610808565b50505050505050505050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661086a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104bc565b6001600160a01b0382166108cb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104bc565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b5f61093784846107de565b90505f19811461099e57818110156109915760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104bc565b61099e8484848403610808565b50505050565b6001600160a01b038316610a085760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104bc565b6001600160a01b038216610a6a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104bc565b6001600160a01b0383165f9081526020819052604090205481811015610ae15760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104bc565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290925f80516020610fd7833981519152910160405180910390a361099e565b5f5f80516020611017833981519152610b4a61032c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c215760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104bc565b8060025f828254610c329190610f5b565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481525f80516020610fd7833981519152910160405180910390a35050565b6001600160a01b038216610cd55760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104bc565b6001600160a01b0382165f9081526020819052604090205481811015610d485760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104bc565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192915f80516020610fd7833981519152910161091f565b5f6020808352835180828501525f5b81811015610db557858101830151858201604001528201610d99565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610deb575f80fd5b919050565b5f8060408385031215610e01575f80fd5b610e0a83610dd5565b946020939093013593505050565b5f805f60608486031215610e2a575f80fd5b610e3384610dd5565b9250610e4160208501610dd5565b9150604084013590509250925092565b5f60208284031215610e61575f80fd5b610e6a82610dd5565b9392505050565b5f805f805f805f60e0888a031215610e87575f80fd5b610e9088610dd5565b9650610e9e60208901610dd5565b95506040880135945060608801359350608088013560ff81168114610ec1575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215610eef575f80fd5b610ef883610dd5565b9150610f0660208401610dd5565b90509250929050565b600181811c90821680610f2357607f821691505b602082108103610f4157634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156103cf576103cf610f47565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b5f60018201610fcf57610fcf610f47565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa26469706673582212206c12be332dd873b7cf88c58dfc4762858b63e8ff3bf8563b47828a5a4272643b64736f6c63430008140033501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4da264697066735822122051dba377c61d9aeab1e5350deccb942cf9d53197269f447215de0dba14c9847264736f6c63430008140033", + "bytecode": "0x608060405234801561001057600080fd5b50614f62806100206000396000f3fe608060405260043610620001645760003560e01c806315064c9614620001695780632072f6c5146200019a57806322e95f2c14620001b4578063240ff37814620001e85780632dfdf0b514620001ff578063318aee3d14620002265780633c351e1014620002945780633cbc795b14620002b65780633e19704314620002f25780634b2f336d14620003175780635ca1e165146200033957806379e2cf97146200035157806381b1c174146200036957806383f2440314620003a35780638ed7e3f214620003c8578063aaa13cc214620003ea578063b8b284d0146200040f578063bab161bf1462000434578063be5831c71462000458578063cc461632146200047e578063ccaa2d1114620004a3578063cd58657914620004c8578063d02103ca14620004df578063d3476afe1462000508578063dbc16976146200052d578063ee25560b1462000545578063f5efcd791462000576578063fb570834146200059b575b600080fd5b3480156200017657600080fd5b50606854620001859060ff1681565b60405190151581526020015b60405180910390f35b348015620001a757600080fd5b50620001b2620005c0565b005b348015620001c157600080fd5b50620001d9620001d336600462002a7c565b620005f8565b60405162000191919062002ab8565b620001b2620001f936600462002b26565b6200064b565b3480156200020c57600080fd5b506200021760535481565b60405190815260200162000191565b3480156200023357600080fd5b506200026f6200024536600462002ba9565b606b6020526000908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b0390911660208301520162000191565b348015620002a157600080fd5b50606d54620001d9906001600160a01b031681565b348015620002c357600080fd5b50606d54620002dc90600160a01b900463ffffffff1681565b60405163ffffffff909116815260200162000191565b348015620002ff57600080fd5b50620002176200031136600462002be0565b6200069b565b3480156200032457600080fd5b50606e54620001d9906001600160a01b031681565b3480156200034657600080fd5b506200021762000728565b3480156200035e57600080fd5b50620001b262000810565b3480156200037657600080fd5b50620001d96200038836600462002c6a565b606a602052600090815260409020546001600160a01b031681565b348015620003b057600080fd5b5062000217620003c236600462002c97565b62000834565b348015620003d557600080fd5b50606c54620001d9906001600160a01b031681565b348015620003f757600080fd5b50620001d96200040936600462002cdb565b62000908565b3480156200041c57600080fd5b50620001b26200042e36600462002d8e565b62000a1f565b3480156200044157600080fd5b50606854620002dc90610100900463ffffffff1681565b3480156200046557600080fd5b50606854620002dc90600160c81b900463ffffffff1681565b3480156200048b57600080fd5b50620001856200049d36600462002e1a565b62000ac9565b348015620004b057600080fd5b50620001b2620004c236600462002e52565b62000b59565b620001b2620004d936600462002f4d565b62001087565b348015620004ec57600080fd5b50606854620001d990600160281b90046001600160a01b031681565b3480156200051557600080fd5b50620001b26200052736600462002fee565b620014ab565b3480156200053a57600080fd5b50620001b262001737565b3480156200055257600080fd5b50620002176200056436600462002c6a565b60696020526000908152604090205481565b3480156200058357600080fd5b50620001b26200059536600462002e52565b6200176d565b348015620005a857600080fd5b5062000185620005ba36600462003066565b62001a12565b606c546001600160a01b03163314620005ec57604051631736745960e31b815260040160405180910390fd5b620005f662001a2e565b565b6000606a6000848460405160200162000613929190620030b3565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b3415801590620006655750606e546001600160a01b031615155b1562000684576040516301bd897160e61b815260040160405180910390fd5b6200069485853486868662001a8b565b5050505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b605354600090819081805b602081101562000807578083901c600116600103620007965760338160208110620007625762000762620030dd565b01548460405160200162000778929190620030f3565b604051602081830303815290604052805190602001209350620007c4565b8382604051602001620007ab929190620030f3565b6040516020818303038152906040528051906020012093505b8182604051602001620007d9929190620030f3565b6040516020818303038152906040528051906020012091508080620007fe9062003117565b91505062000733565b50919392505050565b605354606854600160c81b900463ffffffff161015620005f657620005f662001b49565b600083815b6020811015620008ff57600163ffffffff8516821c81169003620008a3578481602081106200086c576200086c620030dd565b60200201358260405160200162000885929190620030f3565b604051602081830303815290604052805190602001209150620008ea565b81858260208110620008b957620008b9620030dd565b6020020135604051602001620008d1929190620030f3565b6040516020818303038152906040528051906020012091505b80620008f68162003117565b91505062000839565b50949350505050565b600080888860405160200162000920929190620030b3565b604051602081830303815290604052805190602001209050600060ff60f81b308360405180602001620009539062002a40565b601f1982820381018352601f90910116604081905262000980908d908d908d908d908d906020016200315c565b60408051601f1981840301815290829052620009a09291602001620031c3565b60405160208183030381529060405280519060200120604051602001620009f994939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b606e546001600160a01b031662000a495760405163dde3cda760e01b815260040160405180910390fd5b606e54604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac9062000a7d9033908890600401620031f6565b600060405180830381600087803b15801562000a9857600080fd5b505af115801562000aad573d6000803e3d6000fd5b5050505062000ac186868686868662001a8b565b505050505050565b6068546000908190610100900463ffffffff1615801562000af0575063ffffffff83166001145b1562000b04575063ffffffff831662000b2f565b62000b1a600160201b63ffffffff85166200320f565b62000b2c9063ffffffff861662003229565b90505b600881901c600090815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000b7e57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161462000baf576040516302caf51760e11b815260040160405180910390fd5b62000be98c8c8c8c8c62000be360008e8e8e8e8e8e8e60405162000bd59291906200323f565b60405180910390206200069b565b62001be7565b6001600160a01b03861662000d2f57606e546001600160a01b031662000cc15760006001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000c43576020820181803683370190505b5060405162000c53919062003265565b60006040518083038185875af1925050503d806000811462000c92576040519150601f19603f3d011682016040523d82523d6000602084013e62000c97565b606091505b505090508062000cba57604051630ce8f45160e31b815260040160405180910390fd5b5062001049565b606e546040516340c10f1960e01b81526001600160a01b03909116906340c10f199062000cf59087908790600401620031f6565b600060405180830381600087803b15801562000d1057600080fd5b505af115801562000d25573d6000803e3d6000fd5b5050505062001049565b606d546001600160a01b03878116911614801562000d5e5750606d5463ffffffff888116600160a01b90920416145b1562000d785760006001600160a01b038516848262000c18565b60685463ffffffff61010090910481169088160362000dad5762000da76001600160a01b038716858562001d45565b62001049565b6000878760405160200162000dc4929190620030b3565b60408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b03168062000fe1576000808062000e0d868801886200333c565b92509250925060008584848460405162000e279062002a40565b62000e3593929190620033ea565b8190604051809103906000f590508015801562000e56573d6000803e3d6000fd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f199062000e8a908d908d90600401620031f6565b600060405180830381600087803b15801562000ea557600080fd5b505af115801562000eba573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000fcf95949392919062003427565b60405180910390a15050505062001046565b6040516340c10f1960e01b81526001600160a01b038216906340c10f1990620010119089908990600401620031f6565b600060405180830381600087803b1580156200102c57600080fd5b505af115801562001041573d6000803e3d6000fd5b505050505b50505b60008051602062004f0d8339815191528a888887876040516200107195949392919062003462565b60405180910390a1505050505050505050505050565b60685460ff1615620010ac57604051630bc011ff60e21b815260040160405180910390fd5b620010b662001da4565b60685463ffffffff610100909104811690881603620010e8576040516302caf51760e11b815260040160405180910390fd5b6000806060876001600160a01b03881662001142578834146200111e5760405163b89240f560e01b815260040160405180910390fd5b606d546001600160a01b0381169450600160a01b900463ffffffff16925062001427565b3415620011625760405163798ee6f160e01b815260040160405180910390fd5b606e546001600160a01b0390811690891603620011e357604051632770a7eb60e21b81526001600160a01b03891690639dc29fac90620011a99033908d90600401620031f6565b600060405180830381600087803b158015620011c457600080fd5b505af1158015620011d9573d6000803e3d6000fd5b5050505062001427565b6001600160a01b038089166000908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b90049092169181018290529015620012a157604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac90620012599033908e90600401620031f6565b600060405180830381600087803b1580156200127457600080fd5b505af115801562001289573d6000803e3d6000fd5b50505050806020015194508060000151935062001425565b8515620012b657620012b6898b898962001dff565b6040516370a0823160e01b81526000906001600160a01b038b16906370a0823190620012e790309060040162002ab8565b602060405180830381865afa15801562001305573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200132b919062003494565b9050620013446001600160a01b038b1633308e62002161565b6040516370a0823160e01b81526000906001600160a01b038c16906370a08231906200137590309060040162002ab8565b602060405180830381865afa15801562001393573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620013b9919062003494565b9050620013c78282620034ae565b6068548c9850610100900463ffffffff1696509350620013e7876200219b565b620013f28c62002262565b620013fd8d62002320565b6040516020016200141193929190620033ea565b604051602081830303815290604052945050505b505b60008051602062004eed833981519152600084868e8e868860535460405162001458989796959493929190620034c4565b60405180910390a1620014836200147d600085878f8f8789805190602001206200069b565b620023e1565b861562001494576200149462001b49565b50505050620014a260018055565b50505050505050565b600054610100900460ff1615808015620014cc5750600054600160ff909116105b80620014f15750620014de30620024e0565b158015620014f1575060005460ff166001145b6200155a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156200157e576000805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff891602600160281b600160c81b03191617600160281b6001600160a01b038681169190910291909117909155606c80546001600160a01b031916848316179055606d54166200161357606d54600160a01b900463ffffffff16156200160d57604051630d43a60960e11b815260040160405180910390fd5b620016df565b606d805463ffffffff8616600160a01b026001600160c01b03199091166001600160a01b03881617179055604051600090601290620016529062002a40565b6060808252600d908201526c2bb930b83832b21022ba3432b960991b608082015260a060208201819052600490820152630ae8aa8960e31b60c082015260ff909116604082015260e0018190604051809103906000f5905080158015620016bd573d6000803e3d6000fd5b50606e80546001600160a01b0319166001600160a01b03929092169190911790555b620016e9620024ef565b801562000ac1576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b606c546001600160a01b031633146200176357604051631736745960e31b815260040160405180910390fd5b620005f662002523565b60685460ff16156200179257604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614620017c3576040516302caf51760e11b815260040160405180910390fd5b620017e98c8c8c8c8c62000be360018e8e8e8e8e8e8e60405162000bd59291906200323f565b606e546000906001600160a01b0316620018a857846001600160a01b031684888a868660405160240162001821949392919062003531565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162001858919062003265565b60006040518083038185875af1925050503d806000811462001897576040519150601f19603f3d011682016040523d82523d6000602084013e6200189c565b606091505b505080915050620019b4565b606e546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990620018dc9088908890600401620031f6565b600060405180830381600087803b158015620018f757600080fd5b505af11580156200190c573d6000803e3d6000fd5b50505050846001600160a01b03168789858560405160240162001933949392919062003531565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b179052516200196a919062003265565b6000604051808303816000865af19150503d8060008114620019a9576040519150601f19603f3d011682016040523d82523d6000602084013e620019ae565b606091505b50909150505b80620019d3576040516337e391c360e01b815260040160405180910390fd5b60008051602062004f0d8339815191528b89898888604051620019fb95949392919062003462565b60405180910390a150505050505050505050505050565b60008162001a2286868662000834565b1490505b949350505050565b60685460ff161562001a5357604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b60685463ffffffff61010090910481169087160362001abd576040516302caf51760e11b815260040160405180910390fd5b60008051602062004eed8339815191526001606860019054906101000a900463ffffffff1633898989888860535460405162001b02999897969594939291906200356e565b60405180910390a162001b3d6200147d6001606860019054906101000a900463ffffffff16338a8a8a898960405162000bd59291906200323f565b821562000ac15762000ac15b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d62001b9262000728565b6040518263ffffffff1660e01b815260040162001bb191815260200190565b600060405180830381600087803b15801562001bcc57600080fd5b505af115801562001be1573d6000803e3d6000fd5b50505050565b606854600090600160281b90046001600160a01b031663257b363262001c0e86866200257c565b6040518263ffffffff1660e01b815260040162001c2d91815260200190565b6020604051808303816000875af115801562001c4d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001c73919062003494565b90508060000362001c9657604051622f6fad60e01b815260040160405180910390fd5b600080600160401b871660010362001cdd5786915062001cb9848a848962001a12565b62001cd7576040516338105f3b60e21b815260040160405180910390fd5b62001d2e565b602087901c62001cef816001620035dd565b915087925062001d0e62001d05868c8662000834565b8a838962001a12565b62001d2c576040516338105f3b60e21b815260040160405180910390fd5b505b62001d3a8282620025b1565b505050505050505050565b62001d9f8363a9059cbb60e01b848460405160240162001d67929190620031f6565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262002661565b505050565b60026001540362001df85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001551565b6002600155565b600062001e10600482848662003604565b62001e1b9162003630565b9050632afa533160e01b6001600160e01b031982160162001fbc57600080808080808062001e4d896004818d62003604565b81019062001e5c919062003661565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161462001e9d5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038616301462001ec75760405163750643af60e01b815260040160405180910390fd5b8a851462001ee8576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e169162001f68919062003265565b6000604051808303816000865af19150503d806000811462001fa7576040519150601f19603f3d011682016040523d82523d6000602084013e62001fac565b606091505b5050505050505050505062000694565b6001600160e01b031981166323f2ebc360e21b1462001fee57604051637141605d60e11b815260040160405180910390fd5b600080808080808080620020068a6004818e62003604565b810190620020159190620036bc565b97509750975097509750975097509750336001600160a01b0316886001600160a01b031614620020585760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0387163014620020825760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f16916200210b919062003265565b6000604051808303816000865af19150503d80600081146200214a576040519150601f19603f3d011682016040523d82523d6000602084013e6200214f565b606091505b50505050505050505050505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905262001be19085906323b872dd60e01b9060840162001d67565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009182916001600160a01b03861691620021e4919062003265565b600060405180830381855afa9150503d806000811462002221576040519150601f19603f3d011682016040523d82523d6000602084013e62002226565b606091505b5091509150816200225757604051806040016040528060078152602001664e4f5f4e414d4560c81b81525062001a26565b62001a26816200273a565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009182916001600160a01b03861691620022ab919062003265565b600060405180830381855afa9150503d8060008114620022e8576040519150601f19603f3d011682016040523d82523d6000602084013e620022ed565b606091505b5091509150816200225757604051806040016040528060098152602001681393d7d4d6535093d360ba1b81525062001a26565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b0386169162002368919062003265565b600060405180830381855afa9150503d8060008114620023a5576040519150601f19603f3d011682016040523d82523d6000602084013e620023aa565b606091505b5091509150818015620023be575080516020145b620023cb57601262001a26565b8080602001905181019062001a26919062003748565b806001620023f26020600262003865565b620023fe9190620034ae565b6053541062002420576040516377ae67b360e11b815260040160405180910390fd5b6000605360008154620024339062003117565b9182905550905060005b6020811015620024cf578082901c600116600103620024755782603382602081106200246d576200246d620030dd565b015550505050565b603381602081106200248b576200248b620030dd565b015483604051602001620024a1929190620030f3565b6040516020818303038152906040528051906020012092508080620024c69062003117565b9150506200243d565b5062001d9f62003873565b60018055565b6001600160a01b03163b151590565b600054610100900460ff16620025195760405162461bcd60e51b8152600401620015519062003889565b620005f6620028e3565b60685460ff166200254757604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6000828260405160200162002593929190620030f3565b60405160208183030381529060405280519060200120905092915050565b606854600090610100900463ffffffff16158015620025d6575063ffffffff82166001145b15620025ea575063ffffffff821662002615565b62002600600160201b63ffffffff84166200320f565b620026129063ffffffff851662003229565b90505b600881901c60008181526069602052604081208054600160ff861690811b91821892839055929091908183169003620014a257604051630c8d9eab60e31b815260040160405180910390fd5b6000620026b8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200290d9092919063ffffffff16565b80519091501562001d9f5780806020019051810190620026d99190620038d4565b62001d9f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162001551565b606060408251106200275c5781806020019051810190620006459190620038f4565b8151602003620028b05760005b6020811080156200279c57508281815181106200278a576200278a620030dd565b01602001516001600160f81b03191615155b15620027b75780620027ae8162003117565b91505062002769565b80600003620027f05750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b6000816001600160401b038111156200280d576200280d6200324f565b6040519080825280601f01601f19166020018201604052801562002838576020820181803683370190505b50905060005b82811015620028a8578481815181106200285c576200285c620030dd565b602001015160f81c60f81b8282815181106200287c576200287c620030dd565b60200101906001600160f81b031916908160001a905350806200289f8162003117565b9150506200283e565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b600054610100900460ff16620024da5760405162461bcd60e51b8152600401620015519062003889565b606062001a26848460008585600080866001600160a01b0316858760405162002937919062003265565b60006040518083038185875af1925050503d806000811462002976576040519150601f19603f3d011682016040523d82523d6000602084013e6200297b565b606091505b50915091506200298e8783838762002999565b979650505050505050565b6060831562002a0d57825160000362002a0557620029b785620024e0565b62002a055760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001551565b508162001a26565b62001a26838381511562002a245781518083602001fd5b8060405162461bcd60e51b815260040162001551919062003973565b611564806200398983390190565b803563ffffffff81168114620028de57600080fd5b6001600160a01b038116811462002a7957600080fd5b50565b6000806040838503121562002a9057600080fd5b62002a9b8362002a4e565b9150602083013562002aad8162002a63565b809150509250929050565b6001600160a01b0391909116815260200190565b801515811462002a7957600080fd5b60008083601f84011262002aee57600080fd5b5081356001600160401b0381111562002b0657600080fd5b60208301915083602082850101111562002b1f57600080fd5b9250929050565b60008060008060006080868803121562002b3f57600080fd5b62002b4a8662002a4e565b9450602086013562002b5c8162002a63565b9350604086013562002b6e8162002acc565b925060608601356001600160401b0381111562002b8a57600080fd5b62002b988882890162002adb565b969995985093965092949392505050565b60006020828403121562002bbc57600080fd5b813562002bc98162002a63565b9392505050565b60ff8116811462002a7957600080fd5b600080600080600080600060e0888a03121562002bfc57600080fd5b873562002c098162002bd0565b965062002c196020890162002a4e565b9550604088013562002c2b8162002a63565b945062002c3b6060890162002a4e565b9350608088013562002c4d8162002a63565b9699959850939692959460a0840135945060c09093013592915050565b60006020828403121562002c7d57600080fd5b5035919050565b8061040081018310156200064557600080fd5b6000806000610440848603121562002cae57600080fd5b8335925062002cc1856020860162002c84565b915062002cd2610420850162002a4e565b90509250925092565b600080600080600080600060a0888a03121562002cf757600080fd5b62002d028862002a4e565b9650602088013562002d148162002a63565b955060408801356001600160401b038082111562002d3157600080fd5b62002d3f8b838c0162002adb565b909750955060608a013591508082111562002d5957600080fd5b5062002d688a828b0162002adb565b909450925050608088013562002d7e8162002bd0565b8091505092959891949750929550565b60008060008060008060a0878903121562002da857600080fd5b62002db38762002a4e565b9550602087013562002dc58162002a63565b945060408701359350606087013562002dde8162002acc565b925060808701356001600160401b0381111562002dfa57600080fd5b62002e0889828a0162002adb565b979a9699509497509295939492505050565b6000806040838503121562002e2e57600080fd5b62002e398362002a4e565b915062002e496020840162002a4e565b90509250929050565b6000806000806000806000806000806000806109208d8f03121562002e7657600080fd5b62002e828e8e62002c84565b9b5062002e948e6104008f0162002c84565b9a506108008d013599506108208d013598506108408d0135975062002ebd6108608e0162002a4e565b965062002ecf6108808e013562002a63565b6108808d0135955062002ee66108a08e0162002a4e565b945062002ef86108c08e013562002a63565b6108c08d013593506108e08d013592506001600160401b036109008e0135111562002f2257600080fd5b62002f358e6109008f01358f0162002adb565b81935080925050509295989b509295989b509295989b565b600080600080600080600060c0888a03121562002f6957600080fd5b62002f748862002a4e565b9650602088013562002f868162002a63565b955060408801359450606088013562002f9f8162002a63565b9350608088013562002fb18162002acc565b925060a08801356001600160401b0381111562002fcd57600080fd5b62002fdb8a828b0162002adb565b989b979a50959850939692959293505050565b600080600080600060a086880312156200300757600080fd5b620030128662002a4e565b94506020860135620030248162002a63565b9350620030346040870162002a4e565b92506060860135620030468162002a63565b91506080860135620030588162002a63565b809150509295509295909350565b60008060008061046085870312156200307e57600080fd5b8435935062003091866020870162002c84565b9250620030a2610420860162002a4e565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b634e487b7160e01b600052603260045260246000fd5b918252602082015260400190565b634e487b7160e01b600052601160045260246000fd5b6000600182016200312c576200312c62003101565b5060010190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006200317260608301878962003133565b82810360208401526200318781868862003133565b91505060ff831660408301529695505050505050565b60005b83811015620031ba578181015183820152602001620031a0565b50506000910152565b60008351620031d78184602088016200319d565b835190830190620031ed8183602088016200319d565b01949350505050565b6001600160a01b03929092168252602082015260400190565b808202811582820484141762000645576200064562003101565b8082018082111562000645576200064562003101565b8183823760009101908152919050565b634e487b7160e01b600052604160045260246000fd5b60008251620032798184602087016200319d565b9190910192915050565b604051601f8201601f191681016001600160401b0381118282101715620032ae57620032ae6200324f565b604052919050565b60006001600160401b03821115620032d257620032d26200324f565b50601f01601f191660200190565b600082601f830112620032f257600080fd5b8135620033096200330382620032b6565b62003283565b8181528460208386010111156200331f57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156200335257600080fd5b83356001600160401b03808211156200336a57600080fd5b6200337887838801620032e0565b945060208601359150808211156200338f57600080fd5b506200339e86828701620032e0565b9250506040840135620033b18162002bd0565b809150509250925092565b60008151808452620033d68160208601602086016200319d565b601f01601f19169290920160200192915050565b606081526000620033ff6060830186620033bc565b8281036020840152620034138186620033bc565b91505060ff83166040830152949350505050565b63ffffffff861681526001600160a01b038581166020830152841660408201526080606082018190526000906200298e908301848662003133565b94855263ffffffff9390931660208501526001600160a01b039182166040850152166060830152608082015260a00190565b600060208284031215620034a757600080fd5b5051919050565b8181038181111562000645576200064562003101565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c083018190526000916200351884830187620033bc565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff8416602082015260606040820181905260009062003564908301848662003133565b9695505050505050565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c08301819052600091620035c3848301878962003133565b925080851660e085015250509a9950505050505050505050565b63ffffffff818116838216019080821115620035fd57620035fd62003101565b5092915050565b600080858511156200361557600080fd5b838611156200362357600080fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015620036595780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a0312156200367d57600080fd5b87356200368a8162002a63565b965060208801356200369c8162002a63565b95506040880135945060608801359350608088013562002c4d8162002bd0565b600080600080600080600080610100898b031215620036da57600080fd5b8835620036e78162002a63565b97506020890135620036f98162002a63565b965060408901359550606089013594506080890135620037198162002acc565b935060a08901356200372b8162002bd0565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200375b57600080fd5b815162002bc98162002bd0565b600181815b80851115620037a95781600019048211156200378d576200378d62003101565b808516156200379b57918102915b93841c93908002906200376d565b509250929050565b600082620037c25750600162000645565b81620037d15750600062000645565b8160018114620037ea5760028114620037f55762003815565b600191505062000645565b60ff84111562003809576200380962003101565b50506001821b62000645565b5060208310610133831016604e8410600b84101617156200383a575081810a62000645565b62003846838362003768565b80600019048211156200385d576200385d62003101565b029392505050565b600062002bc98383620037b1565b634e487b7160e01b600052600160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600060208284031215620038e757600080fd5b815162002bc98162002acc565b6000602082840312156200390757600080fd5b81516001600160401b038111156200391e57600080fd5b8201601f810184136200393057600080fd5b8051620039416200330382620032b6565b8181528560208385010111156200395757600080fd5b6200396a8260208301602086016200319d565b95945050505050565b60208152600062002bc96020830184620033bc56fe6101006040523480156200001257600080fd5b50604051620015643803806200156483398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516110a8620004bc60003960006101a30152600081816102660152818161048c01526104fa0152600061043d0152600081816102cb015261040701526110a86000f3fe608060405234801561001057600080fd5b50600436106101075760003560e01c806306fdde031461010c578063095ea7b31461012a57806318160ddd1461014d57806320606b701461015f57806323b872dd1461017457806330adf81f14610187578063313ce5671461019c5780633644e515146101cd57806339509351146101d557806340c10f19146101e857806370a08231146101fd5780637ecebe001461022657806395d89b41146102465780639dc29fac1461024e578063a3c573eb14610261578063a457c2d7146102a0578063a9059cbb146102b3578063cd0d0096146102c6578063d505accf146102ed578063dd62ed3e14610300578063ffa1ad7414610313575b600080fd5b610114610333565b6040516101219190610dae565b60405180910390f35b61013d610138366004610e18565b6103c5565b6040519015158152602001610121565b6002545b604051908152602001610121565b61015160008051602061105383398151915281565b61013d610182366004610e42565b6103df565b61015160008051602061103383398151915281565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610121565b610151610403565b61013d6101e3366004610e18565b61045f565b6101fb6101f6366004610e18565b610481565b005b61015161020b366004610e7e565b6001600160a01b031660009081526020819052604090205490565b610151610234366004610e7e565b60056020526000908152604090205481565b6101146104e0565b6101fb61025c366004610e18565b6104ef565b6102887f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610121565b61013d6102ae366004610e18565b610541565b61013d6102c1366004610e18565b6105bc565b6101517f000000000000000000000000000000000000000000000000000000000000000081565b6101fb6102fb366004610ea0565b6105ca565b61015161030e366004610f13565b6107f3565b610114604051806040016040528060018152602001603160f81b81525081565b60606003805461034290610f46565b80601f016020809104026020016040519081016040528092919081815260200182805461036e90610f46565b80156103bb5780601f10610390576101008083540402835291602001916103bb565b820191906000526020600020905b81548152906001019060200180831161039e57829003601f168201915b5050505050905090565b6000336103d381858561081e565b60019150505b92915050565b6000336103ed858285610943565b6103f88585856109bd565b506001949350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461461043a5761043546610b4f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000336103d381858561047283836107f3565b61047c9190610f96565b61081e565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104d25760405162461bcd60e51b81526004016104c990610fa9565b60405180910390fd5b6104dc8282610be9565b5050565b60606004805461034290610f46565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105375760405162461bcd60e51b81526004016104c990610fa9565b6104dc8282610c96565b6000338161054f82866107f3565b9050838110156105af5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104c9565b6103f8828686840361081e565b6000336103d38185856109bd565b834211156106265760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104c9565b6001600160a01b03871660009081526005602052604081208054600080516020611033833981519152918a918a918a91908661066183610ff9565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006106bf610403565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa15801561074a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906107805750896001600160a01b0316816001600160a01b0316145b6107dc5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104c9565b6107e78a8a8a61081e565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166108805760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104c9565b6001600160a01b0382166108e15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104c9565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600061094f84846107f3565b905060001981146109b757818110156109aa5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104c9565b6109b7848484840361081e565b50505050565b6001600160a01b038316610a215760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104c9565b6001600160a01b038216610a835760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104c9565b6001600160a01b03831660009081526020819052604090205481811015610afb5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104c9565b6001600160a01b0384811660008181526020818152604080832087870390559387168083529184902080548701905592518581529092600080516020611013833981519152910160405180910390a36109b7565b6000600080516020611053833981519152610b68610333565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c3f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104c9565b8060026000828254610c519190610f96565b90915550506001600160a01b03821660008181526020818152604080832080548601905551848152600080516020611013833981519152910160405180910390a35050565b6001600160a01b038216610cf65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104c9565b6001600160a01b03821660009081526020819052604090205481811015610d6a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104c9565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192916000805160206110138339815191529101610936565b600060208083528351808285015260005b81811015610ddb57858101830151858201604001528201610dbf565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610e1357600080fd5b919050565b60008060408385031215610e2b57600080fd5b610e3483610dfc565b946020939093013593505050565b600080600060608486031215610e5757600080fd5b610e6084610dfc565b9250610e6e60208501610dfc565b9150604084013590509250925092565b600060208284031215610e9057600080fd5b610e9982610dfc565b9392505050565b600080600080600080600060e0888a031215610ebb57600080fd5b610ec488610dfc565b9650610ed260208901610dfc565b95506040880135945060608801359350608088013560ff81168114610ef657600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f2657600080fd5b610f2f83610dfc565b9150610f3d60208401610dfc565b90509250929050565b600181811c90821680610f5a57607f821691505b602082108103610f7a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156103d9576103d9610f80565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b60006001820161100b5761100b610f80565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa26469706673582212203ea4a1224be7b5ef35dc397dfc81433d85cd6fdbf17d8b2e3d528071e7e612b564736f6c63430008140033501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4da2646970667358221220e5d45347a3bb440414fd70a860f95e13d1411d9be38220533035ce646e8a207b64736f6c63430008140033", + "deployedBytecode": "0x608060405260043610620001645760003560e01c806315064c9614620001695780632072f6c5146200019a57806322e95f2c14620001b4578063240ff37814620001e85780632dfdf0b514620001ff578063318aee3d14620002265780633c351e1014620002945780633cbc795b14620002b65780633e19704314620002f25780634b2f336d14620003175780635ca1e165146200033957806379e2cf97146200035157806381b1c174146200036957806383f2440314620003a35780638ed7e3f214620003c8578063aaa13cc214620003ea578063b8b284d0146200040f578063bab161bf1462000434578063be5831c71462000458578063cc461632146200047e578063ccaa2d1114620004a3578063cd58657914620004c8578063d02103ca14620004df578063d3476afe1462000508578063dbc16976146200052d578063ee25560b1462000545578063f5efcd791462000576578063fb570834146200059b575b600080fd5b3480156200017657600080fd5b50606854620001859060ff1681565b60405190151581526020015b60405180910390f35b348015620001a757600080fd5b50620001b2620005c0565b005b348015620001c157600080fd5b50620001d9620001d336600462002a7c565b620005f8565b60405162000191919062002ab8565b620001b2620001f936600462002b26565b6200064b565b3480156200020c57600080fd5b506200021760535481565b60405190815260200162000191565b3480156200023357600080fd5b506200026f6200024536600462002ba9565b606b6020526000908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b0390911660208301520162000191565b348015620002a157600080fd5b50606d54620001d9906001600160a01b031681565b348015620002c357600080fd5b50606d54620002dc90600160a01b900463ffffffff1681565b60405163ffffffff909116815260200162000191565b348015620002ff57600080fd5b50620002176200031136600462002be0565b6200069b565b3480156200032457600080fd5b50606e54620001d9906001600160a01b031681565b3480156200034657600080fd5b506200021762000728565b3480156200035e57600080fd5b50620001b262000810565b3480156200037657600080fd5b50620001d96200038836600462002c6a565b606a602052600090815260409020546001600160a01b031681565b348015620003b057600080fd5b5062000217620003c236600462002c97565b62000834565b348015620003d557600080fd5b50606c54620001d9906001600160a01b031681565b348015620003f757600080fd5b50620001d96200040936600462002cdb565b62000908565b3480156200041c57600080fd5b50620001b26200042e36600462002d8e565b62000a1f565b3480156200044157600080fd5b50606854620002dc90610100900463ffffffff1681565b3480156200046557600080fd5b50606854620002dc90600160c81b900463ffffffff1681565b3480156200048b57600080fd5b50620001856200049d36600462002e1a565b62000ac9565b348015620004b057600080fd5b50620001b2620004c236600462002e52565b62000b59565b620001b2620004d936600462002f4d565b62001087565b348015620004ec57600080fd5b50606854620001d990600160281b90046001600160a01b031681565b3480156200051557600080fd5b50620001b26200052736600462002fee565b620014ab565b3480156200053a57600080fd5b50620001b262001737565b3480156200055257600080fd5b50620002176200056436600462002c6a565b60696020526000908152604090205481565b3480156200058357600080fd5b50620001b26200059536600462002e52565b6200176d565b348015620005a857600080fd5b5062000185620005ba36600462003066565b62001a12565b606c546001600160a01b03163314620005ec57604051631736745960e31b815260040160405180910390fd5b620005f662001a2e565b565b6000606a6000848460405160200162000613929190620030b3565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b3415801590620006655750606e546001600160a01b031615155b1562000684576040516301bd897160e61b815260040160405180910390fd5b6200069485853486868662001a8b565b5050505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b605354600090819081805b602081101562000807578083901c600116600103620007965760338160208110620007625762000762620030dd565b01548460405160200162000778929190620030f3565b604051602081830303815290604052805190602001209350620007c4565b8382604051602001620007ab929190620030f3565b6040516020818303038152906040528051906020012093505b8182604051602001620007d9929190620030f3565b6040516020818303038152906040528051906020012091508080620007fe9062003117565b91505062000733565b50919392505050565b605354606854600160c81b900463ffffffff161015620005f657620005f662001b49565b600083815b6020811015620008ff57600163ffffffff8516821c81169003620008a3578481602081106200086c576200086c620030dd565b60200201358260405160200162000885929190620030f3565b604051602081830303815290604052805190602001209150620008ea565b81858260208110620008b957620008b9620030dd565b6020020135604051602001620008d1929190620030f3565b6040516020818303038152906040528051906020012091505b80620008f68162003117565b91505062000839565b50949350505050565b600080888860405160200162000920929190620030b3565b604051602081830303815290604052805190602001209050600060ff60f81b308360405180602001620009539062002a40565b601f1982820381018352601f90910116604081905262000980908d908d908d908d908d906020016200315c565b60408051601f1981840301815290829052620009a09291602001620031c3565b60405160208183030381529060405280519060200120604051602001620009f994939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b606e546001600160a01b031662000a495760405163dde3cda760e01b815260040160405180910390fd5b606e54604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac9062000a7d9033908890600401620031f6565b600060405180830381600087803b15801562000a9857600080fd5b505af115801562000aad573d6000803e3d6000fd5b5050505062000ac186868686868662001a8b565b505050505050565b6068546000908190610100900463ffffffff1615801562000af0575063ffffffff83166001145b1562000b04575063ffffffff831662000b2f565b62000b1a600160201b63ffffffff85166200320f565b62000b2c9063ffffffff861662003229565b90505b600881901c600090815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000b7e57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161462000baf576040516302caf51760e11b815260040160405180910390fd5b62000be98c8c8c8c8c62000be360008e8e8e8e8e8e8e60405162000bd59291906200323f565b60405180910390206200069b565b62001be7565b6001600160a01b03861662000d2f57606e546001600160a01b031662000cc15760006001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000c43576020820181803683370190505b5060405162000c53919062003265565b60006040518083038185875af1925050503d806000811462000c92576040519150601f19603f3d011682016040523d82523d6000602084013e62000c97565b606091505b505090508062000cba57604051630ce8f45160e31b815260040160405180910390fd5b5062001049565b606e546040516340c10f1960e01b81526001600160a01b03909116906340c10f199062000cf59087908790600401620031f6565b600060405180830381600087803b15801562000d1057600080fd5b505af115801562000d25573d6000803e3d6000fd5b5050505062001049565b606d546001600160a01b03878116911614801562000d5e5750606d5463ffffffff888116600160a01b90920416145b1562000d785760006001600160a01b038516848262000c18565b60685463ffffffff61010090910481169088160362000dad5762000da76001600160a01b038716858562001d45565b62001049565b6000878760405160200162000dc4929190620030b3565b60408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b03168062000fe1576000808062000e0d868801886200333c565b92509250925060008584848460405162000e279062002a40565b62000e3593929190620033ea565b8190604051809103906000f590508015801562000e56573d6000803e3d6000fd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f199062000e8a908d908d90600401620031f6565b600060405180830381600087803b15801562000ea557600080fd5b505af115801562000eba573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000fcf95949392919062003427565b60405180910390a15050505062001046565b6040516340c10f1960e01b81526001600160a01b038216906340c10f1990620010119089908990600401620031f6565b600060405180830381600087803b1580156200102c57600080fd5b505af115801562001041573d6000803e3d6000fd5b505050505b50505b60008051602062004f0d8339815191528a888887876040516200107195949392919062003462565b60405180910390a1505050505050505050505050565b60685460ff1615620010ac57604051630bc011ff60e21b815260040160405180910390fd5b620010b662001da4565b60685463ffffffff610100909104811690881603620010e8576040516302caf51760e11b815260040160405180910390fd5b6000806060876001600160a01b03881662001142578834146200111e5760405163b89240f560e01b815260040160405180910390fd5b606d546001600160a01b0381169450600160a01b900463ffffffff16925062001427565b3415620011625760405163798ee6f160e01b815260040160405180910390fd5b606e546001600160a01b0390811690891603620011e357604051632770a7eb60e21b81526001600160a01b03891690639dc29fac90620011a99033908d90600401620031f6565b600060405180830381600087803b158015620011c457600080fd5b505af1158015620011d9573d6000803e3d6000fd5b5050505062001427565b6001600160a01b038089166000908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b90049092169181018290529015620012a157604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac90620012599033908e90600401620031f6565b600060405180830381600087803b1580156200127457600080fd5b505af115801562001289573d6000803e3d6000fd5b50505050806020015194508060000151935062001425565b8515620012b657620012b6898b898962001dff565b6040516370a0823160e01b81526000906001600160a01b038b16906370a0823190620012e790309060040162002ab8565b602060405180830381865afa15801562001305573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200132b919062003494565b9050620013446001600160a01b038b1633308e62002161565b6040516370a0823160e01b81526000906001600160a01b038c16906370a08231906200137590309060040162002ab8565b602060405180830381865afa15801562001393573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620013b9919062003494565b9050620013c78282620034ae565b6068548c9850610100900463ffffffff1696509350620013e7876200219b565b620013f28c62002262565b620013fd8d62002320565b6040516020016200141193929190620033ea565b604051602081830303815290604052945050505b505b60008051602062004eed833981519152600084868e8e868860535460405162001458989796959493929190620034c4565b60405180910390a1620014836200147d600085878f8f8789805190602001206200069b565b620023e1565b861562001494576200149462001b49565b50505050620014a260018055565b50505050505050565b600054610100900460ff1615808015620014cc5750600054600160ff909116105b80620014f15750620014de30620024e0565b158015620014f1575060005460ff166001145b6200155a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156200157e576000805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff891602600160281b600160c81b03191617600160281b6001600160a01b038681169190910291909117909155606c80546001600160a01b031916848316179055606d54166200161357606d54600160a01b900463ffffffff16156200160d57604051630d43a60960e11b815260040160405180910390fd5b620016df565b606d805463ffffffff8616600160a01b026001600160c01b03199091166001600160a01b03881617179055604051600090601290620016529062002a40565b6060808252600d908201526c2bb930b83832b21022ba3432b960991b608082015260a060208201819052600490820152630ae8aa8960e31b60c082015260ff909116604082015260e0018190604051809103906000f5905080158015620016bd573d6000803e3d6000fd5b50606e80546001600160a01b0319166001600160a01b03929092169190911790555b620016e9620024ef565b801562000ac1576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b606c546001600160a01b031633146200176357604051631736745960e31b815260040160405180910390fd5b620005f662002523565b60685460ff16156200179257604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614620017c3576040516302caf51760e11b815260040160405180910390fd5b620017e98c8c8c8c8c62000be360018e8e8e8e8e8e8e60405162000bd59291906200323f565b606e546000906001600160a01b0316620018a857846001600160a01b031684888a868660405160240162001821949392919062003531565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162001858919062003265565b60006040518083038185875af1925050503d806000811462001897576040519150601f19603f3d011682016040523d82523d6000602084013e6200189c565b606091505b505080915050620019b4565b606e546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990620018dc9088908890600401620031f6565b600060405180830381600087803b158015620018f757600080fd5b505af11580156200190c573d6000803e3d6000fd5b50505050846001600160a01b03168789858560405160240162001933949392919062003531565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b179052516200196a919062003265565b6000604051808303816000865af19150503d8060008114620019a9576040519150601f19603f3d011682016040523d82523d6000602084013e620019ae565b606091505b50909150505b80620019d3576040516337e391c360e01b815260040160405180910390fd5b60008051602062004f0d8339815191528b89898888604051620019fb95949392919062003462565b60405180910390a150505050505050505050505050565b60008162001a2286868662000834565b1490505b949350505050565b60685460ff161562001a5357604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b60685463ffffffff61010090910481169087160362001abd576040516302caf51760e11b815260040160405180910390fd5b60008051602062004eed8339815191526001606860019054906101000a900463ffffffff1633898989888860535460405162001b02999897969594939291906200356e565b60405180910390a162001b3d6200147d6001606860019054906101000a900463ffffffff16338a8a8a898960405162000bd59291906200323f565b821562000ac15762000ac15b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d62001b9262000728565b6040518263ffffffff1660e01b815260040162001bb191815260200190565b600060405180830381600087803b15801562001bcc57600080fd5b505af115801562001be1573d6000803e3d6000fd5b50505050565b606854600090600160281b90046001600160a01b031663257b363262001c0e86866200257c565b6040518263ffffffff1660e01b815260040162001c2d91815260200190565b6020604051808303816000875af115801562001c4d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001c73919062003494565b90508060000362001c9657604051622f6fad60e01b815260040160405180910390fd5b600080600160401b871660010362001cdd5786915062001cb9848a848962001a12565b62001cd7576040516338105f3b60e21b815260040160405180910390fd5b62001d2e565b602087901c62001cef816001620035dd565b915087925062001d0e62001d05868c8662000834565b8a838962001a12565b62001d2c576040516338105f3b60e21b815260040160405180910390fd5b505b62001d3a8282620025b1565b505050505050505050565b62001d9f8363a9059cbb60e01b848460405160240162001d67929190620031f6565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262002661565b505050565b60026001540362001df85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001551565b6002600155565b600062001e10600482848662003604565b62001e1b9162003630565b9050632afa533160e01b6001600160e01b031982160162001fbc57600080808080808062001e4d896004818d62003604565b81019062001e5c919062003661565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161462001e9d5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038616301462001ec75760405163750643af60e01b815260040160405180910390fd5b8a851462001ee8576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e169162001f68919062003265565b6000604051808303816000865af19150503d806000811462001fa7576040519150601f19603f3d011682016040523d82523d6000602084013e62001fac565b606091505b5050505050505050505062000694565b6001600160e01b031981166323f2ebc360e21b1462001fee57604051637141605d60e11b815260040160405180910390fd5b600080808080808080620020068a6004818e62003604565b810190620020159190620036bc565b97509750975097509750975097509750336001600160a01b0316886001600160a01b031614620020585760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0387163014620020825760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f16916200210b919062003265565b6000604051808303816000865af19150503d80600081146200214a576040519150601f19603f3d011682016040523d82523d6000602084013e6200214f565b606091505b50505050505050505050505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905262001be19085906323b872dd60e01b9060840162001d67565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009182916001600160a01b03861691620021e4919062003265565b600060405180830381855afa9150503d806000811462002221576040519150601f19603f3d011682016040523d82523d6000602084013e62002226565b606091505b5091509150816200225757604051806040016040528060078152602001664e4f5f4e414d4560c81b81525062001a26565b62001a26816200273a565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009182916001600160a01b03861691620022ab919062003265565b600060405180830381855afa9150503d8060008114620022e8576040519150601f19603f3d011682016040523d82523d6000602084013e620022ed565b606091505b5091509150816200225757604051806040016040528060098152602001681393d7d4d6535093d360ba1b81525062001a26565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b0386169162002368919062003265565b600060405180830381855afa9150503d8060008114620023a5576040519150601f19603f3d011682016040523d82523d6000602084013e620023aa565b606091505b5091509150818015620023be575080516020145b620023cb57601262001a26565b8080602001905181019062001a26919062003748565b806001620023f26020600262003865565b620023fe9190620034ae565b6053541062002420576040516377ae67b360e11b815260040160405180910390fd5b6000605360008154620024339062003117565b9182905550905060005b6020811015620024cf578082901c600116600103620024755782603382602081106200246d576200246d620030dd565b015550505050565b603381602081106200248b576200248b620030dd565b015483604051602001620024a1929190620030f3565b6040516020818303038152906040528051906020012092508080620024c69062003117565b9150506200243d565b5062001d9f62003873565b60018055565b6001600160a01b03163b151590565b600054610100900460ff16620025195760405162461bcd60e51b8152600401620015519062003889565b620005f6620028e3565b60685460ff166200254757604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6000828260405160200162002593929190620030f3565b60405160208183030381529060405280519060200120905092915050565b606854600090610100900463ffffffff16158015620025d6575063ffffffff82166001145b15620025ea575063ffffffff821662002615565b62002600600160201b63ffffffff84166200320f565b620026129063ffffffff851662003229565b90505b600881901c60008181526069602052604081208054600160ff861690811b91821892839055929091908183169003620014a257604051630c8d9eab60e31b815260040160405180910390fd5b6000620026b8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200290d9092919063ffffffff16565b80519091501562001d9f5780806020019051810190620026d99190620038d4565b62001d9f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162001551565b606060408251106200275c5781806020019051810190620006459190620038f4565b8151602003620028b05760005b6020811080156200279c57508281815181106200278a576200278a620030dd565b01602001516001600160f81b03191615155b15620027b75780620027ae8162003117565b91505062002769565b80600003620027f05750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b6000816001600160401b038111156200280d576200280d6200324f565b6040519080825280601f01601f19166020018201604052801562002838576020820181803683370190505b50905060005b82811015620028a8578481815181106200285c576200285c620030dd565b602001015160f81c60f81b8282815181106200287c576200287c620030dd565b60200101906001600160f81b031916908160001a905350806200289f8162003117565b9150506200283e565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b600054610100900460ff16620024da5760405162461bcd60e51b8152600401620015519062003889565b606062001a26848460008585600080866001600160a01b0316858760405162002937919062003265565b60006040518083038185875af1925050503d806000811462002976576040519150601f19603f3d011682016040523d82523d6000602084013e6200297b565b606091505b50915091506200298e8783838762002999565b979650505050505050565b6060831562002a0d57825160000362002a0557620029b785620024e0565b62002a055760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001551565b508162001a26565b62001a26838381511562002a245781518083602001fd5b8060405162461bcd60e51b815260040162001551919062003973565b611564806200398983390190565b803563ffffffff81168114620028de57600080fd5b6001600160a01b038116811462002a7957600080fd5b50565b6000806040838503121562002a9057600080fd5b62002a9b8362002a4e565b9150602083013562002aad8162002a63565b809150509250929050565b6001600160a01b0391909116815260200190565b801515811462002a7957600080fd5b60008083601f84011262002aee57600080fd5b5081356001600160401b0381111562002b0657600080fd5b60208301915083602082850101111562002b1f57600080fd5b9250929050565b60008060008060006080868803121562002b3f57600080fd5b62002b4a8662002a4e565b9450602086013562002b5c8162002a63565b9350604086013562002b6e8162002acc565b925060608601356001600160401b0381111562002b8a57600080fd5b62002b988882890162002adb565b969995985093965092949392505050565b60006020828403121562002bbc57600080fd5b813562002bc98162002a63565b9392505050565b60ff8116811462002a7957600080fd5b600080600080600080600060e0888a03121562002bfc57600080fd5b873562002c098162002bd0565b965062002c196020890162002a4e565b9550604088013562002c2b8162002a63565b945062002c3b6060890162002a4e565b9350608088013562002c4d8162002a63565b9699959850939692959460a0840135945060c09093013592915050565b60006020828403121562002c7d57600080fd5b5035919050565b8061040081018310156200064557600080fd5b6000806000610440848603121562002cae57600080fd5b8335925062002cc1856020860162002c84565b915062002cd2610420850162002a4e565b90509250925092565b600080600080600080600060a0888a03121562002cf757600080fd5b62002d028862002a4e565b9650602088013562002d148162002a63565b955060408801356001600160401b038082111562002d3157600080fd5b62002d3f8b838c0162002adb565b909750955060608a013591508082111562002d5957600080fd5b5062002d688a828b0162002adb565b909450925050608088013562002d7e8162002bd0565b8091505092959891949750929550565b60008060008060008060a0878903121562002da857600080fd5b62002db38762002a4e565b9550602087013562002dc58162002a63565b945060408701359350606087013562002dde8162002acc565b925060808701356001600160401b0381111562002dfa57600080fd5b62002e0889828a0162002adb565b979a9699509497509295939492505050565b6000806040838503121562002e2e57600080fd5b62002e398362002a4e565b915062002e496020840162002a4e565b90509250929050565b6000806000806000806000806000806000806109208d8f03121562002e7657600080fd5b62002e828e8e62002c84565b9b5062002e948e6104008f0162002c84565b9a506108008d013599506108208d013598506108408d0135975062002ebd6108608e0162002a4e565b965062002ecf6108808e013562002a63565b6108808d0135955062002ee66108a08e0162002a4e565b945062002ef86108c08e013562002a63565b6108c08d013593506108e08d013592506001600160401b036109008e0135111562002f2257600080fd5b62002f358e6109008f01358f0162002adb565b81935080925050509295989b509295989b509295989b565b600080600080600080600060c0888a03121562002f6957600080fd5b62002f748862002a4e565b9650602088013562002f868162002a63565b955060408801359450606088013562002f9f8162002a63565b9350608088013562002fb18162002acc565b925060a08801356001600160401b0381111562002fcd57600080fd5b62002fdb8a828b0162002adb565b989b979a50959850939692959293505050565b600080600080600060a086880312156200300757600080fd5b620030128662002a4e565b94506020860135620030248162002a63565b9350620030346040870162002a4e565b92506060860135620030468162002a63565b91506080860135620030588162002a63565b809150509295509295909350565b60008060008061046085870312156200307e57600080fd5b8435935062003091866020870162002c84565b9250620030a2610420860162002a4e565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b634e487b7160e01b600052603260045260246000fd5b918252602082015260400190565b634e487b7160e01b600052601160045260246000fd5b6000600182016200312c576200312c62003101565b5060010190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006200317260608301878962003133565b82810360208401526200318781868862003133565b91505060ff831660408301529695505050505050565b60005b83811015620031ba578181015183820152602001620031a0565b50506000910152565b60008351620031d78184602088016200319d565b835190830190620031ed8183602088016200319d565b01949350505050565b6001600160a01b03929092168252602082015260400190565b808202811582820484141762000645576200064562003101565b8082018082111562000645576200064562003101565b8183823760009101908152919050565b634e487b7160e01b600052604160045260246000fd5b60008251620032798184602087016200319d565b9190910192915050565b604051601f8201601f191681016001600160401b0381118282101715620032ae57620032ae6200324f565b604052919050565b60006001600160401b03821115620032d257620032d26200324f565b50601f01601f191660200190565b600082601f830112620032f257600080fd5b8135620033096200330382620032b6565b62003283565b8181528460208386010111156200331f57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156200335257600080fd5b83356001600160401b03808211156200336a57600080fd5b6200337887838801620032e0565b945060208601359150808211156200338f57600080fd5b506200339e86828701620032e0565b9250506040840135620033b18162002bd0565b809150509250925092565b60008151808452620033d68160208601602086016200319d565b601f01601f19169290920160200192915050565b606081526000620033ff6060830186620033bc565b8281036020840152620034138186620033bc565b91505060ff83166040830152949350505050565b63ffffffff861681526001600160a01b038581166020830152841660408201526080606082018190526000906200298e908301848662003133565b94855263ffffffff9390931660208501526001600160a01b039182166040850152166060830152608082015260a00190565b600060208284031215620034a757600080fd5b5051919050565b8181038181111562000645576200064562003101565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c083018190526000916200351884830187620033bc565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff8416602082015260606040820181905260009062003564908301848662003133565b9695505050505050565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c08301819052600091620035c3848301878962003133565b925080851660e085015250509a9950505050505050505050565b63ffffffff818116838216019080821115620035fd57620035fd62003101565b5092915050565b600080858511156200361557600080fd5b838611156200362357600080fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015620036595780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a0312156200367d57600080fd5b87356200368a8162002a63565b965060208801356200369c8162002a63565b95506040880135945060608801359350608088013562002c4d8162002bd0565b600080600080600080600080610100898b031215620036da57600080fd5b8835620036e78162002a63565b97506020890135620036f98162002a63565b965060408901359550606089013594506080890135620037198162002acc565b935060a08901356200372b8162002bd0565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200375b57600080fd5b815162002bc98162002bd0565b600181815b80851115620037a95781600019048211156200378d576200378d62003101565b808516156200379b57918102915b93841c93908002906200376d565b509250929050565b600082620037c25750600162000645565b81620037d15750600062000645565b8160018114620037ea5760028114620037f55762003815565b600191505062000645565b60ff84111562003809576200380962003101565b50506001821b62000645565b5060208310610133831016604e8410600b84101617156200383a575081810a62000645565b62003846838362003768565b80600019048211156200385d576200385d62003101565b029392505050565b600062002bc98383620037b1565b634e487b7160e01b600052600160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600060208284031215620038e757600080fd5b815162002bc98162002acc565b6000602082840312156200390757600080fd5b81516001600160401b038111156200391e57600080fd5b8201601f810184136200393057600080fd5b8051620039416200330382620032b6565b8181528560208385010111156200395757600080fd5b6200396a8260208301602086016200319d565b95945050505050565b60208152600062002bc96020830184620033bc56fe6101006040523480156200001257600080fd5b50604051620015643803806200156483398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516110a8620004bc60003960006101a30152600081816102660152818161048c01526104fa0152600061043d0152600081816102cb015261040701526110a86000f3fe608060405234801561001057600080fd5b50600436106101075760003560e01c806306fdde031461010c578063095ea7b31461012a57806318160ddd1461014d57806320606b701461015f57806323b872dd1461017457806330adf81f14610187578063313ce5671461019c5780633644e515146101cd57806339509351146101d557806340c10f19146101e857806370a08231146101fd5780637ecebe001461022657806395d89b41146102465780639dc29fac1461024e578063a3c573eb14610261578063a457c2d7146102a0578063a9059cbb146102b3578063cd0d0096146102c6578063d505accf146102ed578063dd62ed3e14610300578063ffa1ad7414610313575b600080fd5b610114610333565b6040516101219190610dae565b60405180910390f35b61013d610138366004610e18565b6103c5565b6040519015158152602001610121565b6002545b604051908152602001610121565b61015160008051602061105383398151915281565b61013d610182366004610e42565b6103df565b61015160008051602061103383398151915281565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610121565b610151610403565b61013d6101e3366004610e18565b61045f565b6101fb6101f6366004610e18565b610481565b005b61015161020b366004610e7e565b6001600160a01b031660009081526020819052604090205490565b610151610234366004610e7e565b60056020526000908152604090205481565b6101146104e0565b6101fb61025c366004610e18565b6104ef565b6102887f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610121565b61013d6102ae366004610e18565b610541565b61013d6102c1366004610e18565b6105bc565b6101517f000000000000000000000000000000000000000000000000000000000000000081565b6101fb6102fb366004610ea0565b6105ca565b61015161030e366004610f13565b6107f3565b610114604051806040016040528060018152602001603160f81b81525081565b60606003805461034290610f46565b80601f016020809104026020016040519081016040528092919081815260200182805461036e90610f46565b80156103bb5780601f10610390576101008083540402835291602001916103bb565b820191906000526020600020905b81548152906001019060200180831161039e57829003601f168201915b5050505050905090565b6000336103d381858561081e565b60019150505b92915050565b6000336103ed858285610943565b6103f88585856109bd565b506001949350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461461043a5761043546610b4f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000336103d381858561047283836107f3565b61047c9190610f96565b61081e565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104d25760405162461bcd60e51b81526004016104c990610fa9565b60405180910390fd5b6104dc8282610be9565b5050565b60606004805461034290610f46565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105375760405162461bcd60e51b81526004016104c990610fa9565b6104dc8282610c96565b6000338161054f82866107f3565b9050838110156105af5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104c9565b6103f8828686840361081e565b6000336103d38185856109bd565b834211156106265760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104c9565b6001600160a01b03871660009081526005602052604081208054600080516020611033833981519152918a918a918a91908661066183610ff9565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006106bf610403565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa15801561074a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906107805750896001600160a01b0316816001600160a01b0316145b6107dc5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104c9565b6107e78a8a8a61081e565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166108805760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104c9565b6001600160a01b0382166108e15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104c9565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600061094f84846107f3565b905060001981146109b757818110156109aa5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104c9565b6109b7848484840361081e565b50505050565b6001600160a01b038316610a215760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104c9565b6001600160a01b038216610a835760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104c9565b6001600160a01b03831660009081526020819052604090205481811015610afb5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104c9565b6001600160a01b0384811660008181526020818152604080832087870390559387168083529184902080548701905592518581529092600080516020611013833981519152910160405180910390a36109b7565b6000600080516020611053833981519152610b68610333565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c3f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104c9565b8060026000828254610c519190610f96565b90915550506001600160a01b03821660008181526020818152604080832080548601905551848152600080516020611013833981519152910160405180910390a35050565b6001600160a01b038216610cf65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104c9565b6001600160a01b03821660009081526020819052604090205481811015610d6a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104c9565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192916000805160206110138339815191529101610936565b600060208083528351808285015260005b81811015610ddb57858101830151858201604001528201610dbf565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610e1357600080fd5b919050565b60008060408385031215610e2b57600080fd5b610e3483610dfc565b946020939093013593505050565b600080600060608486031215610e5757600080fd5b610e6084610dfc565b9250610e6e60208501610dfc565b9150604084013590509250925092565b600060208284031215610e9057600080fd5b610e9982610dfc565b9392505050565b600080600080600080600060e0888a031215610ebb57600080fd5b610ec488610dfc565b9650610ed260208901610dfc565b95506040880135945060608801359350608088013560ff81168114610ef657600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f2657600080fd5b610f2f83610dfc565b9150610f3d60208401610dfc565b90509250929050565b600181811c90821680610f5a57607f821691505b602082108103610f7a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156103d9576103d9610f80565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b60006001820161100b5761100b610f80565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa26469706673582212203ea4a1224be7b5ef35dc397dfc81433d85cd6fdbf17d8b2e3d528071e7e612b564736f6c63430008140033501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4da2646970667358221220e5d45347a3bb440414fd70a860f95e13d1411d9be38220533035ce646e8a207b64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMDeployer.json b/compiled-contracts/paris/PolygonZkEVMDeployer.json index d614562ce..fe0571a32 100644 --- a/compiled-contracts/paris/PolygonZkEVMDeployer.json +++ b/compiled-contracts/paris/PolygonZkEVMDeployer.json @@ -184,8 +184,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561000f575f80fd5b50604051610a2d380380610a2d83398101604081905261002e91610095565b61003733610046565b61004081610046565b506100c2565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100a5575f80fd5b81516001600160a01b03811681146100bb575f80fd5b9392505050565b61095e806100cf5f395ff3fe60806040526004361061005f575f3560e01c80632b79805a146100635780634a94d487146100785780636d07dbf81461008b578063715018a6146100c05780638da5cb5b146100d4578063e11ae6cb146100e8578063f2fde38b146100fb575b5f80fd5b6100766100713660046106fa565b61011a565b005b610076610086366004610786565b610166565b348015610096575f80fd5b506100aa6100a53660046107d8565b6101a7565b6040516100b791906107f8565b60405180910390f35b3480156100cb575f80fd5b506100766101b9565b3480156100df575f80fd5b506100aa6101cc565b6100766100f636600461080c565b6101da565b348015610106575f80fd5b50610076610115366004610857565b61021a565b610122610298565b5f61012e8585856102f7565b905061013a81836103f5565b505f805160206108e08339815191528160405161015791906107f8565b60405180910390a15050505050565b61016e610298565b610179838383610438565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b905f90a1505050565b5f6101b28383610466565b9392505050565b6101c1610298565b6101ca5f610472565b565b5f546001600160a01b031690565b6101e2610298565b5f6101ee8484846102f7565b90505f805160206108e08339815191528160405161020c91906107f8565b60405180910390a150505050565b610222610298565b6001600160a01b03811661028c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61029581610472565b50565b336102a16101cc565b6001600160a01b0316146101ca5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610283565b5f834710156103485760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610283565b81515f036103985760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610283565b8282516020840186f590506001600160a01b0381166101b25760405162461bcd60e51b8152602060048201526019602482015278437265617465323a204661696c6564206f6e206465706c6f7960381b6044820152606401610283565b60606101b283835f6040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c656400008152506104c1565b606061045e848484604051806060016040528060298152602001610900602991396104c1565b949350505050565b5f6101b2838330610598565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156105225760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610283565b5f80866001600160a01b0316858760405161053d9190610892565b5f6040518083038185875af1925050503d805f8114610577576040519150601f19603f3d011682016040523d82523d5f602084013e61057c565b606091505b509150915061058d878383876105c1565b979650505050505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6060831561062f5782515f03610628576001600160a01b0385163b6106285760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610283565b508161045e565b61045e83838151156106445781518083602001fd5b8060405162461bcd60e51b815260040161028391906108ad565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112610681575f80fd5b81356001600160401b038082111561069b5761069b61065e565b604051601f8301601f19908116603f011681019082821181831017156106c3576106c361065e565b816040528381528660208588010111156106db575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f806080858703121561070d575f80fd5b843593506020850135925060408501356001600160401b0380821115610731575f80fd5b61073d88838901610672565b93506060870135915080821115610752575f80fd5b5061075f87828801610672565b91505092959194509250565b80356001600160a01b0381168114610781575f80fd5b919050565b5f805f60608486031215610798575f80fd5b6107a18461076b565b925060208401356001600160401b038111156107bb575f80fd5b6107c786828701610672565b925050604084013590509250925092565b5f80604083850312156107e9575f80fd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b5f805f6060848603121561081e575f80fd5b833592506020840135915060408401356001600160401b03811115610841575f80fd5b61084d86828701610672565b9150509250925092565b5f60208284031215610867575f80fd5b6101b28261076b565b5f5b8381101561088a578181015183820152602001610872565b50505f910152565b5f82516108a3818460208701610870565b9190910192915050565b602081525f82518060208401526108cb816040850160208701610870565b601f01601f1916919091016040019291505056feba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a264697066735822122046ca0fbf676689fe3caf41f19380ababfbdb2fd13b798268ec428ddb13b8960064736f6c63430008140033", - "deployedBytecode": "0x60806040526004361061005f575f3560e01c80632b79805a146100635780634a94d487146100785780636d07dbf81461008b578063715018a6146100c05780638da5cb5b146100d4578063e11ae6cb146100e8578063f2fde38b146100fb575b5f80fd5b6100766100713660046106fa565b61011a565b005b610076610086366004610786565b610166565b348015610096575f80fd5b506100aa6100a53660046107d8565b6101a7565b6040516100b791906107f8565b60405180910390f35b3480156100cb575f80fd5b506100766101b9565b3480156100df575f80fd5b506100aa6101cc565b6100766100f636600461080c565b6101da565b348015610106575f80fd5b50610076610115366004610857565b61021a565b610122610298565b5f61012e8585856102f7565b905061013a81836103f5565b505f805160206108e08339815191528160405161015791906107f8565b60405180910390a15050505050565b61016e610298565b610179838383610438565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b905f90a1505050565b5f6101b28383610466565b9392505050565b6101c1610298565b6101ca5f610472565b565b5f546001600160a01b031690565b6101e2610298565b5f6101ee8484846102f7565b90505f805160206108e08339815191528160405161020c91906107f8565b60405180910390a150505050565b610222610298565b6001600160a01b03811661028c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61029581610472565b50565b336102a16101cc565b6001600160a01b0316146101ca5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610283565b5f834710156103485760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610283565b81515f036103985760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610283565b8282516020840186f590506001600160a01b0381166101b25760405162461bcd60e51b8152602060048201526019602482015278437265617465323a204661696c6564206f6e206465706c6f7960381b6044820152606401610283565b60606101b283835f6040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c656400008152506104c1565b606061045e848484604051806060016040528060298152602001610900602991396104c1565b949350505050565b5f6101b2838330610598565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156105225760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610283565b5f80866001600160a01b0316858760405161053d9190610892565b5f6040518083038185875af1925050503d805f8114610577576040519150601f19603f3d011682016040523d82523d5f602084013e61057c565b606091505b509150915061058d878383876105c1565b979650505050505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6060831561062f5782515f03610628576001600160a01b0385163b6106285760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610283565b508161045e565b61045e83838151156106445781518083602001fd5b8060405162461bcd60e51b815260040161028391906108ad565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112610681575f80fd5b81356001600160401b038082111561069b5761069b61065e565b604051601f8301601f19908116603f011681019082821181831017156106c3576106c361065e565b816040528381528660208588010111156106db575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f806080858703121561070d575f80fd5b843593506020850135925060408501356001600160401b0380821115610731575f80fd5b61073d88838901610672565b93506060870135915080821115610752575f80fd5b5061075f87828801610672565b91505092959194509250565b80356001600160a01b0381168114610781575f80fd5b919050565b5f805f60608486031215610798575f80fd5b6107a18461076b565b925060208401356001600160401b038111156107bb575f80fd5b6107c786828701610672565b925050604084013590509250925092565b5f80604083850312156107e9575f80fd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b5f805f6060848603121561081e575f80fd5b833592506020840135915060408401356001600160401b03811115610841575f80fd5b61084d86828701610672565b9150509250925092565b5f60208284031215610867575f80fd5b6101b28261076b565b5f5b8381101561088a578181015183820152602001610872565b50505f910152565b5f82516108a3818460208701610870565b9190910192915050565b602081525f82518060208401526108cb816040850160208701610870565b601f01601f1916919091016040019291505056feba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a264697066735822122046ca0fbf676689fe3caf41f19380ababfbdb2fd13b798268ec428ddb13b8960064736f6c63430008140033", + "bytecode": "0x608060405234801561001057600080fd5b50604051610a69380380610a6983398101604081905261002f91610097565b61003833610047565b61004181610047565b506100c7565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100a957600080fd5b81516001600160a01b03811681146100c057600080fd5b9392505050565b610993806100d66000396000f3fe6080604052600436106100605760003560e01c80632b79805a146100655780634a94d4871461007a5780636d07dbf81461008d578063715018a6146100c35780638da5cb5b146100d8578063e11ae6cb146100ed578063f2fde38b14610100575b600080fd5b610078610073366004610719565b610120565b005b6100786100883660046107ab565b61016e565b34801561009957600080fd5b506100ad6100a8366004610801565b6101b0565b6040516100ba9190610823565b60405180910390f35b3480156100cf57600080fd5b506100786101c3565b3480156100e457600080fd5b506100ad6101d7565b6100786100fb366004610837565b6101e6565b34801561010c57600080fd5b5061007861011b366004610886565b610228565b6101286102a6565b6000610135858585610305565b90506101418183610405565b506000805160206109158339815191528160405161015f9190610823565b60405180910390a15050505050565b6101766102a6565b610181838383610449565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b90600090a1505050565b60006101bc8383610477565b9392505050565b6101cb6102a6565b6101d56000610484565b565b6000546001600160a01b031690565b6101ee6102a6565b60006101fb848484610305565b90506000805160206109158339815191528160405161021a9190610823565b60405180910390a150505050565b6102306102a6565b6001600160a01b03811661029a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6102a381610484565b50565b336102af6101d7565b6001600160a01b0316146101d55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610291565b6000834710156103575760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610291565b81516000036103a85760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610291565b8282516020840186f590506001600160a01b0381166101bc5760405162461bcd60e51b8152602060048201526019602482015278437265617465323a204661696c6564206f6e206465706c6f7960381b6044820152606401610291565b60606101bc838360006040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c656400008152506104d4565b606061046f848484604051806060016040528060298152602001610935602991396104d4565b949350505050565b60006101bc8383306105af565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156105355760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610291565b600080866001600160a01b0316858760405161055191906108c5565b60006040518083038185875af1925050503d806000811461058e576040519150601f19603f3d011682016040523d82523d6000602084013e610593565b606091505b50915091506105a4878383876105d9565b979650505050505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b60608315610648578251600003610641576001600160a01b0385163b6106415760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610291565b508161046f565b61046f838381511561065d5781518083602001fd5b8060405162461bcd60e51b815260040161029191906108e1565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261069e57600080fd5b81356001600160401b03808211156106b8576106b8610677565b604051601f8301601f19908116603f011681019082821181831017156106e0576106e0610677565b816040528381528660208588010111156106f957600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806080858703121561072f57600080fd5b843593506020850135925060408501356001600160401b038082111561075457600080fd5b6107608883890161068d565b9350606087013591508082111561077657600080fd5b506107838782880161068d565b91505092959194509250565b80356001600160a01b03811681146107a657600080fd5b919050565b6000806000606084860312156107c057600080fd5b6107c98461078f565b925060208401356001600160401b038111156107e457600080fd5b6107f08682870161068d565b925050604084013590509250925092565b6000806040838503121561081457600080fd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b60008060006060848603121561084c57600080fd5b833592506020840135915060408401356001600160401b0381111561087057600080fd5b61087c8682870161068d565b9150509250925092565b60006020828403121561089857600080fd5b6101bc8261078f565b60005b838110156108bc5781810151838201526020016108a4565b50506000910152565b600082516108d78184602087016108a1565b9190910192915050565b60208152600082518060208401526109008160408501602087016108a1565b601f01601f1916919091016040019291505056feba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a26469706673582212209681c024553773a6cd2730ece88191934e151912c4edefdf804f50def29c364464736f6c63430008140033", + "deployedBytecode": "0x6080604052600436106100605760003560e01c80632b79805a146100655780634a94d4871461007a5780636d07dbf81461008d578063715018a6146100c35780638da5cb5b146100d8578063e11ae6cb146100ed578063f2fde38b14610100575b600080fd5b610078610073366004610719565b610120565b005b6100786100883660046107ab565b61016e565b34801561009957600080fd5b506100ad6100a8366004610801565b6101b0565b6040516100ba9190610823565b60405180910390f35b3480156100cf57600080fd5b506100786101c3565b3480156100e457600080fd5b506100ad6101d7565b6100786100fb366004610837565b6101e6565b34801561010c57600080fd5b5061007861011b366004610886565b610228565b6101286102a6565b6000610135858585610305565b90506101418183610405565b506000805160206109158339815191528160405161015f9190610823565b60405180910390a15050505050565b6101766102a6565b610181838383610449565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b90600090a1505050565b60006101bc8383610477565b9392505050565b6101cb6102a6565b6101d56000610484565b565b6000546001600160a01b031690565b6101ee6102a6565b60006101fb848484610305565b90506000805160206109158339815191528160405161021a9190610823565b60405180910390a150505050565b6102306102a6565b6001600160a01b03811661029a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6102a381610484565b50565b336102af6101d7565b6001600160a01b0316146101d55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610291565b6000834710156103575760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610291565b81516000036103a85760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610291565b8282516020840186f590506001600160a01b0381166101bc5760405162461bcd60e51b8152602060048201526019602482015278437265617465323a204661696c6564206f6e206465706c6f7960381b6044820152606401610291565b60606101bc838360006040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c656400008152506104d4565b606061046f848484604051806060016040528060298152602001610935602991396104d4565b949350505050565b60006101bc8383306105af565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156105355760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610291565b600080866001600160a01b0316858760405161055191906108c5565b60006040518083038185875af1925050503d806000811461058e576040519150601f19603f3d011682016040523d82523d6000602084013e610593565b606091505b50915091506105a4878383876105d9565b979650505050505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b60608315610648578251600003610641576001600160a01b0385163b6106415760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610291565b508161046f565b61046f838381511561065d5781518083602001fd5b8060405162461bcd60e51b815260040161029191906108e1565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261069e57600080fd5b81356001600160401b03808211156106b8576106b8610677565b604051601f8301601f19908116603f011681019082821181831017156106e0576106e0610677565b816040528381528660208588010111156106f957600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806080858703121561072f57600080fd5b843593506020850135925060408501356001600160401b038082111561075457600080fd5b6107608883890161068d565b9350606087013591508082111561077657600080fd5b506107838782880161068d565b91505092959194509250565b80356001600160a01b03811681146107a657600080fd5b919050565b6000806000606084860312156107c057600080fd5b6107c98461078f565b925060208401356001600160401b038111156107e457600080fd5b6107f08682870161068d565b925050604084013590509250925092565b6000806040838503121561081457600080fd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b60008060006060848603121561084c57600080fd5b833592506020840135915060408401356001600160401b0381111561087057600080fd5b61087c8682870161068d565b9150509250925092565b60006020828403121561089857600080fd5b6101bc8261078f565b60005b838110156108bc5781810151838201526020016108a4565b50506000910152565b600082516108d78184602087016108a1565b9190910192915050565b60208152600082518060208401526109008160408501602087016108a1565b601f01601f1916919091016040019291505056feba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a26469706673582212209681c024553773a6cd2730ece88191934e151912c4edefdf804f50def29c364464736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMGlobalExitRoot.json b/compiled-contracts/paris/PolygonZkEVMGlobalExitRoot.json index 80519f9e9..a575b5ba2 100644 --- a/compiled-contracts/paris/PolygonZkEVMGlobalExitRoot.json +++ b/compiled-contracts/paris/PolygonZkEVMGlobalExitRoot.json @@ -141,8 +141,8 @@ "type": "function" } ], - "bytecode": "0x60c060405234801561000f575f80fd5b5060405161037838038061037883398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a0516102b96100bf5f395f818160d4015261018001525f8181610113015261014401526102b95ff3fe608060405234801561000f575f80fd5b506004361061006b575f3560e01c806301fd90441461006f578063257b36321461008a578063319cf735146100a957806333d6247d146100b25780633ed691ef146100c75780635ec6a8df146100cf578063a3c573eb1461010e575b5f80fd5b6100775f5481565b6040519081526020015b60405180910390f35b61007761009836600461026c565b60026020525f908152604090205481565b61007760015481565b6100c56100c036600461026c565b610135565b005b61007761022d565b6100f67f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610081565b6100f67f000000000000000000000000000000000000000000000000000000000000000081565b5f546001546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361017657506001829055816101cb565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101b2575f8390558291506101cb565b60405163b49365dd60e01b815260040160405180910390fd5b5f6101d68284610240565b5f8181526002602052604081205491925003610227575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f61023b6001545f54610240565b905090565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b5f6020828403121561027c575f80fd5b503591905056fea264697066735822122064d84de7c0da50200ff5c121c5078780ba8d55594c1d83fb5963328e7ce12bcd64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061006b575f3560e01c806301fd90441461006f578063257b36321461008a578063319cf735146100a957806333d6247d146100b25780633ed691ef146100c75780635ec6a8df146100cf578063a3c573eb1461010e575b5f80fd5b6100775f5481565b6040519081526020015b60405180910390f35b61007761009836600461026c565b60026020525f908152604090205481565b61007760015481565b6100c56100c036600461026c565b610135565b005b61007761022d565b6100f67f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610081565b6100f67f000000000000000000000000000000000000000000000000000000000000000081565b5f546001546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361017657506001829055816101cb565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101b2575f8390558291506101cb565b60405163b49365dd60e01b815260040160405180910390fd5b5f6101d68284610240565b5f8181526002602052604081205491925003610227575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f61023b6001545f54610240565b905090565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b5f6020828403121561027c575f80fd5b503591905056fea264697066735822122064d84de7c0da50200ff5c121c5078780ba8d55594c1d83fb5963328e7ce12bcd64736f6c63430008140033", + "bytecode": "0x60c060405234801561001057600080fd5b5060405161038e38038061038e83398101604081905261002f91610062565b6001600160a01b0391821660a05216608052610095565b80516001600160a01b038116811461005d57600080fd5b919050565b6000806040838503121561007557600080fd5b61007e83610046565b915061008c60208401610046565b90509250929050565b60805160a0516102c76100c76000396000818160d90152610186015260008181610118015261014a01526102c76000f3fe608060405234801561001057600080fd5b506004361061006d5760003560e01c806301fd904414610072578063257b36321461008e578063319cf735146100ae57806333d6247d146100b75780633ed691ef146100cc5780635ec6a8df146100d4578063a3c573eb14610113575b600080fd5b61007b60005481565b6040519081526020015b60405180910390f35b61007b61009c366004610278565b60026020526000908152604090205481565b61007b60015481565b6100ca6100c5366004610278565b61013a565b005b61007b610237565b6100fb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610085565b6100fb7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361017c57506001829055816101d2565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101b95760008390558291506101d2565b60405163b49365dd60e01b815260040160405180910390fd5b60006101de828461024c565b600081815260026020526040812054919250036102315760008181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b600061024760015460005461024c565b905090565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b60006020828403121561028a57600080fd5b503591905056fea264697066735822122074a82b096d75a224a07a9aeb1e3e199b1ed86e06078779adc74d1eb40843c1cc64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061006d5760003560e01c806301fd904414610072578063257b36321461008e578063319cf735146100ae57806333d6247d146100b75780633ed691ef146100cc5780635ec6a8df146100d4578063a3c573eb14610113575b600080fd5b61007b60005481565b6040519081526020015b60405180910390f35b61007b61009c366004610278565b60026020526000908152604090205481565b61007b60015481565b6100ca6100c5366004610278565b61013a565b005b61007b610237565b6100fb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610085565b6100fb7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361017c57506001829055816101d2565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101b95760008390558291506101d2565b60405163b49365dd60e01b815260040160405180910390fd5b60006101de828461024c565b600081815260026020526040812054919250036102315760008181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b600061024760015460005461024c565b905090565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b60006020828403121561028a57600080fd5b503591905056fea264697066735822122074a82b096d75a224a07a9aeb1e3e199b1ed86e06078779adc74d1eb40843c1cc64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2.json b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2.json index 3b65fcfcb..52f768bc5 100644 --- a/compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2.json +++ b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2.json @@ -78,8 +78,8 @@ "type": "function" } ], - "bytecode": "0x60a060405234801561000f575f80fd5b5060405161020138038061020183398101604081905261002e9161003f565b6001600160a01b031660805261006c565b5f6020828403121561004f575f80fd5b81516001600160a01b0381168114610065575f80fd5b9392505050565b6080516101786100895f395f818160a3015260e801526101785ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301fd90441461004e578063257b36321461006a57806333d6247d14610089578063a3c573eb1461009e575b5f80fd5b61005760015481565b6040519081526020015b60405180910390f35b61005761007836600461012b565b5f6020819052908152604090205481565b61009c61009736600461012b565b6100dd565b005b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610061565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101265760405163b49365dd60e01b815260040160405180910390fd5b600155565b5f6020828403121561013b575f80fd5b503591905056fea264697066735822122056308b0c5d386c7c2d79206e623f5190b458132b17b5ad50acf8ed30d9a25ee864736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301fd90441461004e578063257b36321461006a57806333d6247d14610089578063a3c573eb1461009e575b5f80fd5b61005760015481565b6040519081526020015b60405180910390f35b61005761007836600461012b565b5f6020819052908152604090205481565b61009c61009736600461012b565b6100dd565b005b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610061565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101265760405163b49365dd60e01b815260040160405180910390fd5b600155565b5f6020828403121561013b575f80fd5b503591905056fea264697066735822122056308b0c5d386c7c2d79206e623f5190b458132b17b5ad50acf8ed30d9a25ee864736f6c63430008140033", + "bytecode": "0x60a060405234801561001057600080fd5b5060405161020e38038061020e83398101604081905261002f91610040565b6001600160a01b0316608052610070565b60006020828403121561005257600080fd5b81516001600160a01b038116811461006957600080fd5b9392505050565b60805161017e6100906000396000818160a7015260ec015261017e6000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806301fd904414610051578063257b36321461006d57806333d6247d1461008d578063a3c573eb146100a2575b600080fd5b61005a60015481565b6040519081526020015b60405180910390f35b61005a61007b36600461012f565b60006020819052908152604090205481565b6100a061009b36600461012f565b6100e1565b005b6100c97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610064565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461012a5760405163b49365dd60e01b815260040160405180910390fd5b600155565b60006020828403121561014157600080fd5b503591905056fea2646970667358221220cb2d185b34b4b56098f61b95c6fc8bc5377da2c37b8c93217bda20bea49f54ee64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806301fd904414610051578063257b36321461006d57806333d6247d1461008d578063a3c573eb146100a2575b600080fd5b61005a60015481565b6040519081526020015b60405180910390f35b61005a61007b36600461012f565b60006020819052908152604090205481565b6100a061009b36600461012f565b6100e1565b005b6100c97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610064565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461012a5760405163b49365dd60e01b815260040160405180910390fd5b600155565b60006020828403121561014157600080fd5b503591905056fea2646970667358221220cb2d185b34b4b56098f61b95c6fc8bc5377da2c37b8c93217bda20bea49f54ee64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2Mock.json b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2Mock.json index 38254afbd..31fa0eb10 100644 --- a/compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2Mock.json +++ b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2Mock.json @@ -109,8 +109,8 @@ "type": "function" } ], - "bytecode": "0x60a060405234801561000f575f80fd5b5060405161026538038061026583398101604081905261002e9161003f565b6001600160a01b031660805261006c565b5f6020828403121561004f575f80fd5b81516001600160a01b0381168114610065575f80fd5b9392505050565b6080516101db61008a5f395f818160eb015261013001526101db5ff3fe608060405234801561000f575f80fd5b5060043610610060575f3560e01c806301fd904414610064578063116c40c314610080578063257b36321461009557806333d6247d146100b457806396e07459146100c7578063a3c573eb146100e6575b5f80fd5b61006d60015481565b6040519081526020015b60405180910390f35b61009361008e36600461016e565b600155565b005b61006d6100a336600461016e565b5f6020819052908152604090205481565b6100936100c236600461016e565b610125565b6100936100d5366004610185565b5f9182526020829052604090912055565b61010d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610077565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461008e5760405163b49365dd60e01b815260040160405180910390fd5b5f6020828403121561017e575f80fd5b5035919050565b5f8060408385031215610196575f80fd5b5050803592602090910135915056fea264697066735822122054c6c745e8f803eb89bbd0aaade77a1d91a25da0cc69dded9bb37e13250b18e164736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610060575f3560e01c806301fd904414610064578063116c40c314610080578063257b36321461009557806333d6247d146100b457806396e07459146100c7578063a3c573eb146100e6575b5f80fd5b61006d60015481565b6040519081526020015b60405180910390f35b61009361008e36600461016e565b600155565b005b61006d6100a336600461016e565b5f6020819052908152604090205481565b6100936100c236600461016e565b610125565b6100936100d5366004610185565b5f9182526020829052604090912055565b61010d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610077565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461008e5760405163b49365dd60e01b815260040160405180910390fd5b5f6020828403121561017e575f80fd5b5035919050565b5f8060408385031215610196575f80fd5b5050803592602090910135915056fea264697066735822122054c6c745e8f803eb89bbd0aaade77a1d91a25da0cc69dded9bb37e13250b18e164736f6c63430008140033", + "bytecode": "0x60a060405234801561001057600080fd5b5060405161027538038061027583398101604081905261002f91610040565b6001600160a01b0316608052610070565b60006020828403121561005257600080fd5b81516001600160a01b038116811461006957600080fd5b9392505050565b6080516101e46100916000396000818160f0015261013501526101e46000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c806301fd904414610067578063116c40c314610083578063257b36321461009857806333d6247d146100b857806396e07459146100cb578063a3c573eb146100eb575b600080fd5b61007060015481565b6040519081526020015b60405180910390f35b610096610091366004610173565b600155565b005b6100706100a6366004610173565b60006020819052908152604090205481565b6100966100c6366004610173565b61012a565b6100966100d936600461018c565b60009182526020829052604090912055565b6101127f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161007a565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146100915760405163b49365dd60e01b815260040160405180910390fd5b60006020828403121561018557600080fd5b5035919050565b6000806040838503121561019f57600080fd5b5050803592602090910135915056fea26469706673582212201bf5b6cc61023657660ebc0be2fe7be0c0d4310dd11fe71962a25dbf22ac229264736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100625760003560e01c806301fd904414610067578063116c40c314610083578063257b36321461009857806333d6247d146100b857806396e07459146100cb578063a3c573eb146100eb575b600080fd5b61007060015481565b6040519081526020015b60405180910390f35b610096610091366004610173565b600155565b005b6100706100a6366004610173565b60006020819052908152604090205481565b6100966100c6366004610173565b61012a565b6100966100d936600461018c565b60009182526020829052604090912055565b6101127f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161007a565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146100915760405163b49365dd60e01b815260040160405180910390fd5b60006020828403121561018557600080fd5b5035919050565b6000806040838503121561019f57600080fd5b5050803592602090910135915056fea26469706673582212201bf5b6cc61023657660ebc0be2fe7be0c0d4310dd11fe71962a25dbf22ac229264736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMGlobalExitRootMock.json b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootMock.json index 40eb76de2..242de3acd 100644 --- a/compiled-contracts/paris/PolygonZkEVMGlobalExitRootMock.json +++ b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootMock.json @@ -172,8 +172,8 @@ "type": "function" } ], - "bytecode": "0x60c060405234801561000f575f80fd5b5060405161040038038061040083398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a0516103406100c05f395f818161011c01526101e701525f818161015b01526101ab01526103405ff3fe608060405234801561000f575f80fd5b5060043610610081575f3560e01c806301fd904414610085578063051a9e28146100a0578063257b3632146100b5578063319cf735146100d457806333d6247d146100dd5780633ed691ef146100f05780635bcef673146100f85780635ec6a8df14610117578063a3c573eb14610156575b5f80fd5b61008d5f5481565b6040519081526020015b60405180910390f35b6100b36100ae3660046102d3565b61017d565b005b61008d6100c33660046102d3565b60026020525f908152604090205481565b61008d60015481565b6100b36100eb3660046102d3565b61019c565b61008d610294565b6100b36101063660046102ea565b5f9182526002602052604090912055565b61013e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610097565b61013e7f000000000000000000000000000000000000000000000000000000000000000081565b8060025f610189610294565b815260208101919091526040015f205550565b5f546001546001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101dd5750600182905581610232565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163303610219575f839055829150610232565b60405163b49365dd60e01b815260040160405180910390fd5b5f61023d82846102a7565b5f818152600260205260408120549192500361028e575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6102a26001545f546102a7565b905090565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b5f602082840312156102e3575f80fd5b5035919050565b5f80604083850312156102fb575f80fd5b5050803592602090910135915056fea2646970667358221220997f187cde3e8a9cccaa90b0ed9595b57003d76b03fffd42bf38b0240b6f034564736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610081575f3560e01c806301fd904414610085578063051a9e28146100a0578063257b3632146100b5578063319cf735146100d457806333d6247d146100dd5780633ed691ef146100f05780635bcef673146100f85780635ec6a8df14610117578063a3c573eb14610156575b5f80fd5b61008d5f5481565b6040519081526020015b60405180910390f35b6100b36100ae3660046102d3565b61017d565b005b61008d6100c33660046102d3565b60026020525f908152604090205481565b61008d60015481565b6100b36100eb3660046102d3565b61019c565b61008d610294565b6100b36101063660046102ea565b5f9182526002602052604090912055565b61013e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610097565b61013e7f000000000000000000000000000000000000000000000000000000000000000081565b8060025f610189610294565b815260208101919091526040015f205550565b5f546001546001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101dd5750600182905581610232565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163303610219575f839055829150610232565b60405163b49365dd60e01b815260040160405180910390fd5b5f61023d82846102a7565b5f818152600260205260408120549192500361028e575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6102a26001545f546102a7565b905090565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b5f602082840312156102e3575f80fd5b5035919050565b5f80604083850312156102fb575f80fd5b5050803592602090910135915056fea2646970667358221220997f187cde3e8a9cccaa90b0ed9595b57003d76b03fffd42bf38b0240b6f034564736f6c63430008140033", + "bytecode": "0x60c060405234801561001057600080fd5b5060405161041b38038061041b83398101604081905261002f91610062565b6001600160a01b0391821660a05216608052610095565b80516001600160a01b038116811461005d57600080fd5b919050565b6000806040838503121561007557600080fd5b61007e83610046565b915061008c60208401610046565b90509250929050565b60805160a0516103536100c86000396000818161012201526101f001526000818161016101526101b401526103536000f3fe608060405234801561001057600080fd5b50600436106100835760003560e01c806301fd904414610088578063051a9e28146100a4578063257b3632146100b9578063319cf735146100d957806333d6247d146100e25780633ed691ef146100f55780635bcef673146100fd5780635ec6a8df1461011d578063a3c573eb1461015c575b600080fd5b61009160005481565b6040519081526020015b60405180910390f35b6100b76100b23660046102e2565b610183565b005b6100916100c73660046102e2565b60026020526000908152604090205481565b61009160015481565b6100b76100f03660046102e2565b6101a4565b6100916102a1565b6100b761010b3660046102fb565b60009182526002602052604090912055565b6101447f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161009b565b6101447f000000000000000000000000000000000000000000000000000000000000000081565b80600260006101906102a1565b815260208101919091526040016000205550565b6000546001546001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101e6575060018290558161023c565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361022357600083905582915061023c565b60405163b49365dd60e01b815260040160405180910390fd5b600061024882846102b6565b6000818152600260205260408120549192500361029b5760008181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b60006102b16001546000546102b6565b905090565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b6000602082840312156102f457600080fd5b5035919050565b6000806040838503121561030e57600080fd5b5050803592602090910135915056fea2646970667358221220e9ad45d8087f75d33072119a7d1b8fe41110bef64d83c4ff200b98a56f8c3e1264736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100835760003560e01c806301fd904414610088578063051a9e28146100a4578063257b3632146100b9578063319cf735146100d957806333d6247d146100e25780633ed691ef146100f55780635bcef673146100fd5780635ec6a8df1461011d578063a3c573eb1461015c575b600080fd5b61009160005481565b6040519081526020015b60405180910390f35b6100b76100b23660046102e2565b610183565b005b6100916100c73660046102e2565b60026020526000908152604090205481565b61009160015481565b6100b76100f03660046102e2565b6101a4565b6100916102a1565b6100b761010b3660046102fb565b60009182526002602052604090912055565b6101447f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161009b565b6101447f000000000000000000000000000000000000000000000000000000000000000081565b80600260006101906102a1565b815260208101919091526040016000205550565b6000546001546001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101e6575060018290558161023c565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361022357600083905582915061023c565b60405163b49365dd60e01b815260040160405180910390fd5b600061024882846102b6565b6000818152600260205260408120549192500361029b5760008181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b60006102b16001546000546102b6565b905090565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b6000602082840312156102f457600080fd5b5035919050565b6000806040838503121561030e57600080fd5b5050803592602090910135915056fea2646970667358221220e9ad45d8087f75d33072119a7d1b8fe41110bef64d83c4ff200b98a56f8c3e1264736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMGlobalExitRootV2.json b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootV2.json index e08ecc5d6..16939bd54 100644 --- a/compiled-contracts/paris/PolygonZkEVMGlobalExitRootV2.json +++ b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootV2.json @@ -141,8 +141,8 @@ "type": "function" } ], - "bytecode": "0x60c060405234801561000f575f80fd5b5060405161037838038061037883398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a0516102b96100bf5f395f818160d4015261018001525f8181610113015261014401526102b95ff3fe608060405234801561000f575f80fd5b506004361061006b575f3560e01c806301fd90441461006f578063257b36321461008a578063319cf735146100a957806333d6247d146100b25780633ed691ef146100c757806349b7b802146100cf578063a3c573eb1461010e575b5f80fd5b6100775f5481565b6040519081526020015b60405180910390f35b61007761009836600461026c565b60026020525f908152604090205481565b61007760015481565b6100c56100c036600461026c565b610135565b005b61007761022d565b6100f67f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610081565b6100f67f000000000000000000000000000000000000000000000000000000000000000081565b5f546001546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361017657506001829055816101cb565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101b2575f8390558291506101cb565b60405163b49365dd60e01b815260040160405180910390fd5b5f6101d68284610240565b5f8181526002602052604081205491925003610227575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f61023b6001545f54610240565b905090565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b5f6020828403121561027c575f80fd5b503591905056fea26469706673582212200945871c1fc5a875ddc6b822f3353c5f34c74491abd97942dc1d761b165557b064736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061006b575f3560e01c806301fd90441461006f578063257b36321461008a578063319cf735146100a957806333d6247d146100b25780633ed691ef146100c757806349b7b802146100cf578063a3c573eb1461010e575b5f80fd5b6100775f5481565b6040519081526020015b60405180910390f35b61007761009836600461026c565b60026020525f908152604090205481565b61007760015481565b6100c56100c036600461026c565b610135565b005b61007761022d565b6100f67f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610081565b6100f67f000000000000000000000000000000000000000000000000000000000000000081565b5f546001546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361017657506001829055816101cb565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101b2575f8390558291506101cb565b60405163b49365dd60e01b815260040160405180910390fd5b5f6101d68284610240565b5f8181526002602052604081205491925003610227575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f61023b6001545f54610240565b905090565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b5f6020828403121561027c575f80fd5b503591905056fea26469706673582212200945871c1fc5a875ddc6b822f3353c5f34c74491abd97942dc1d761b165557b064736f6c63430008140033", + "bytecode": "0x60c060405234801561001057600080fd5b5060405161038e38038061038e83398101604081905261002f91610062565b6001600160a01b0391821660a05216608052610095565b80516001600160a01b038116811461005d57600080fd5b919050565b6000806040838503121561007557600080fd5b61007e83610046565b915061008c60208401610046565b90509250929050565b60805160a0516102c76100c76000396000818160d90152610186015260008181610118015261014a01526102c76000f3fe608060405234801561001057600080fd5b506004361061006d5760003560e01c806301fd904414610072578063257b36321461008e578063319cf735146100ae57806333d6247d146100b75780633ed691ef146100cc57806349b7b802146100d4578063a3c573eb14610113575b600080fd5b61007b60005481565b6040519081526020015b60405180910390f35b61007b61009c366004610278565b60026020526000908152604090205481565b61007b60015481565b6100ca6100c5366004610278565b61013a565b005b61007b610237565b6100fb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610085565b6100fb7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361017c57506001829055816101d2565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101b95760008390558291506101d2565b60405163b49365dd60e01b815260040160405180910390fd5b60006101de828461024c565b600081815260026020526040812054919250036102315760008181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b600061024760015460005461024c565b905090565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b60006020828403121561028a57600080fd5b503591905056fea26469706673582212204b21a3fd5083785616cac881a4e531abc2b9bcd9673f549586e8bcb171a52e7264736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061006d5760003560e01c806301fd904414610072578063257b36321461008e578063319cf735146100ae57806333d6247d146100b75780633ed691ef146100cc57806349b7b802146100d4578063a3c573eb14610113575b600080fd5b61007b60005481565b6040519081526020015b60405180910390f35b61007b61009c366004610278565b60026020526000908152604090205481565b61007b60015481565b6100ca6100c5366004610278565b61013a565b005b61007b610237565b6100fb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610085565b6100fb7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361017c57506001829055816101d2565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101b95760008390558291506101d2565b60405163b49365dd60e01b815260040160405180910390fd5b60006101de828461024c565b600081815260026020526040812054919250036102315760008181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b600061024760015460005461024c565b905090565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b60006020828403121561028a57600080fd5b503591905056fea26469706673582212204b21a3fd5083785616cac881a4e531abc2b9bcd9673f549586e8bcb171a52e7264736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMMock.json b/compiled-contracts/paris/PolygonZkEVMMock.json index e8b79f0fd..135bf1e81 100644 --- a/compiled-contracts/paris/PolygonZkEVMMock.json +++ b/compiled-contracts/paris/PolygonZkEVMMock.json @@ -1935,8 +1935,8 @@ "type": "function" } ], - "bytecode": "0x61014060405234801562000011575f80fd5b506040516200527f3803806200527f8339810160408190526200003491620000a2565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b039182166101005216610120526200012a565b6001600160a01b038116811462000083575f80fd5b50565b80516001600160401b03811681146200009d575f80fd5b919050565b5f805f805f8060c08789031215620000b8575f80fd5b8651620000c5816200006e565b6020880151909650620000d8816200006e565b6040880151909550620000eb816200006e565b6060880151909450620000fe816200006e565b92506200010e6080880162000086565b91506200011e60a0880162000086565b90509295509295509295565b60805160a05160c05160e0516101005161012051615088620001f75f395f81816105ef01528181611034015261296b01525f818161074e015261100a01525f818161071401528181611adc01528181612d9d0152613d4501525f81816108ab01528181610de601528181611131015281816112660152818161181b01528181611d6e01528181612f58015261395f01525f81816109470152818161347601526137b501525f818161080f01528181611aaa0152818161212901528181612f2d015261353b01526150885ff3fe608060405234801561000f575f80fd5b506004361061033a575f3560e01c80638c3d7301116101b85780638c3d7301146106985780638da5cb5b146106a057806396dc3d39146106a857806399f5634e146106bb5780639aa972a3146106c35780639b796760146106d65780639c9f3dfe146106e9578063a066215c146106fc578063a3c573eb1461070f578063ada8f91914610736578063adc879e914610749578063afd23cbe14610770578063b4d63f5814610798578063b4f77ea9146107f7578063b6b0b0971461080a578063ba58ae3914610831578063c0cad30214610844578063c0ed84e014610857578063c754c7ed1461085f578063c89e42df14610879578063cfa8ed471461088c578063d02103ca146108a6578063d2e129f9146108cd578063d8d1091b146108e0578063d939b315146108f3578063dbc169761461090d578063e0d1744114610915578063e7a7ed0214610928578063e8bf92ed14610942578063eaeb077b14610969578063ed6b01041461097c578063f14916d614610990578063f2fde38b146109a3578063f851a440146109b6578063f8b823e4146109c9578063fe16564f146109d2575f80fd5b80630a0d9fbe1461033e5780630eaa86ea1461036c578063107bf28c1461038d57806310a01a72146103a257806315064c96146103b75780631816b7e5146103d457806319d8ac61146103e7578063220d7899146103fa578063267822471461040d578063298789831461042d5780632b0006fa146104475780632c1f816a1461045a578063383b3be81461046d578063394218e914610480578063423fa8561461049357806345605267146104ad578063458c0477146104c75780634a1a89a7146104da5780634a910e6a146104f45780634e487706146105075780635392c5e01461051a578063542028d514610539578063574f649e146105415780635e9145c9146105545780635ec9195814610567578063604691691461056f578063621dd411146105775780636b8616ce1461058a5780636ff512cc146105a9578063715018a6146105bc5780637215541a146105c45780637fcb3653146105d7578063831c7ead146105ea578063837a473814610611578063841b24d71461067e575b5f80fd5b606f546103569061010090046001600160401b031681565b604051610363919061417b565b60405180910390f35b61037f61037a3660046141a5565b6109e5565b604051908152602001610363565b610395610bab565b6040516103639190614243565b6103b56103b0366004614272565b610c37565b005b606f546103c49060ff1681565b6040519015158152602001610363565b6103b56103e23660046142ff565b610e7f565b607354610356906001600160401b031681565b610395610408366004614320565b610f38565b607b54610420906001600160a01b031681565b6040516103639190614369565b60745461042090600160401b90046001600160a01b031681565b6103b561045536600461438e565b611092565b6103b56104683660046143f2565b6111c6565b6103c461047b366004614467565b611324565b6103b561048e366004614467565b61136a565b60735461035690600160401b90046001600160401b031681565b60735461035690600160801b90046001600160401b031681565b607954610356906001600160401b031681565b60795461035690600160401b90046001600160401b031681565b6103b5610502366004614467565b611452565b6103b5610515366004614467565b6114c1565b61037f610528366004614467565b60756020525f908152604090205481565b6103956115ad565b61037f61054f366004614532565b6115ba565b6103b56105623660046145e5565b6115fc565b6103b5611b87565b61037f611c13565b6103b561058536600461438e565b611c28565b61037f610598366004614467565b60716020525f908152604090205481565b6103b56105b7366004614634565b611ebe565b6103b5611f3d565b6103b56105d2366004614467565b611f50565b607454610356906001600160401b031681565b6103567f000000000000000000000000000000000000000000000000000000000000000081565b61065361061f36600461464d565b60786020525f90815260409020805460018201546002909201546001600160401b0380831693600160401b90930416919084565b604080516001600160401b039586168152949093166020850152918301526060820152608001610363565b60795461035690600160c01b90046001600160401b031681565b6103b5612068565b6104206120ec565b6103b56106b6366004614467565b6120fb565b61037f612125565b6103b56106d13660046143f2565b61222c565b6103b56106e4366004614467565b6122c2565b6103b56106f7366004614467565b6122f6565b6103b561070a366004614467565b6123e2565b6104207f000000000000000000000000000000000000000000000000000000000000000081565b6103b5610744366004614634565b61248a565b6103567f000000000000000000000000000000000000000000000000000000000000000081565b606f5461078590600160481b900461ffff1681565b60405161ffff9091168152602001610363565b6107d26107a6366004614467565b60726020525f9081526040902080546001909101546001600160401b0380821691600160401b90041683565b604080519384526001600160401b039283166020850152911690820152606001610363565b6103b5610805366004614467565b612500565b6104207f000000000000000000000000000000000000000000000000000000000000000081565b6103c461083f36600461464d565b612511565b6103b5610852366004614664565b612596565b6103566125ae565b607b5461035690600160a01b90046001600160401b031681565b6103b5610887366004614664565b6125f9565b606f5461042090600160581b90046001600160a01b031681565b6104207f000000000000000000000000000000000000000000000000000000000000000081565b6103b56108db3660046146d2565b612660565b6103b56108ee36600461477c565b6129f1565b60795461035690600160801b90046001600160401b031681565b6103b5612d70565b6103b56109233660046147ba565b612e11565b60735461035690600160c01b90046001600160401b031681565b6104207f000000000000000000000000000000000000000000000000000000000000000081565b6103b5610977366004614804565b612e82565b607b546103c490600160e01b900460ff1681565b6103b561099e366004614634565b613128565b6103b56109b1366004614634565b6131a7565b607a54610420906001600160a01b031681565b61037f60705481565b6103b56109e036600461484b565b61321d565b5f805f6109f06125ae565b90506001600160401b03881615610a8c576079546001600160401b039081169089161115610a395760405162461bcd60e51b8152600401610a3090614875565b60405180910390fd5b6001600160401b038089165f908152607860205260409020600281015481549094509091898116600160401b9092041614610a865760405162461bcd60e51b8152600401610a30906148f3565b50610af5565b6001600160401b0387165f90815260756020526040902054915081610ac35760405162461bcd60e51b8152600401610a3090614952565b806001600160401b0316876001600160401b03161115610af55760405162461bcd60e51b8152600401610a30906149a8565b806001600160401b0316866001600160401b031611610b265760405162461bcd60e51b8152600401610a3090614a18565b5f610b348888888689610f38565b90505f5f80516020614ff3833981519152600283604051610b559190614a95565b602060405180830381855afa158015610b70573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b939190614ab0565b610b9d9190614adb565b9a9950505050505050505050565b60778054610bb890614aee565b80601f0160208091040260200160405190810160405280929190818152602001828054610be490614aee565b8015610c2f5780601f10610c0657610100808354040283529160200191610c2f565b820191905f5260205f20905b815481529060010190602001808311610c1257829003601f168201915b505050505081565b610c3f61323e565b5f80610c496125ae565b90506001600160401b038a1615610cdc576079546001600160401b03908116908b161115610c895760405162461bcd60e51b8152600401610a3090614875565b6001600160401b03808b165f9081526078602052604090206002810154815490945090918b8116600160401b9092041614610cd65760405162461bcd60e51b8152600401610a30906148f3565b50610d45565b6001600160401b0389165f90815260756020526040902054915081610d135760405162461bcd60e51b8152600401610a3090614952565b806001600160401b0316896001600160401b03161115610d455760405162461bcd60e51b8152600401610a30906149a8565b806001600160401b0316886001600160401b031611610d765760405162461bcd60e51b8152600401610a3090614a18565b5f610d848a8a8a868b610f38565b607480546001600160401b0319166001600160401b038c81169182179092555f9081526075602052604090208990556079549192501615610dd057607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018990527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b158015610e2f575f80fd5b505af1158015610e41573d5f803e3d5ffd5b50506040518981523392506001600160401b038c1691505f805160206150138339815191529060200160405180910390a35050505050505050505050565b607a546001600160a01b03163314610eaa57604051634755657960e01b815260040160405180910390fd5b6103e88161ffff161080610ec357506103ff8161ffff16115b15610ee157604051630984a67960e31b815260040160405180910390fd5b606f805461ffff60481b1916600160481b61ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b6001600160401b038086165f818152607260205260408082205493881682529020546060929115801590610f6a575081155b15610f885760405163340c614f60e11b815260040160405180910390fd5b80610fa6576040516366385b5160e01b815260040160405180910390fd5b610faf84612511565b610fcc576040516305dae44f60e21b815260040160405180910390fd5b604080516001600160601b03193360601b166020820152603481019690965260548601929092526001600160c01b031960c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b607454600160401b90046001600160a01b031633146110c45760405163bbcbbc0560e01b815260040160405180910390fd5b6110d286868686868661329d565b607480546001600160401b0319166001600160401b038681169182179092555f908152607560205260409020839055607954161561111b57607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b15801561117a575f80fd5b505af115801561118c573d5f803e3d5ffd5b50506040518481523392506001600160401b03871691505f80516020615013833981519152906020015b60405180910390a3505050505050565b607454600160401b90046001600160a01b031633146111f85760405163bbcbbc0560e01b815260040160405180910390fd5b6112078787878787878761356e565b607480546001600160401b0319166001600160401b038681169182179092555f908152607560205260409020839055607954161561125057607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b1580156112af575f80fd5b505af11580156112c1573d5f803e3d5ffd5b5050607980546001600160c01b031661127560c71b179055505060405182815233906001600160401b038616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b6079546001600160401b038281165f908152607860205260408120549092429261135992600160801b90920481169116614b3a565b6001600160401b0316111592915050565b607a546001600160a01b0316331461139557604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b03821611156113c257604051631d06e87960e01b815260040160405180910390fd5b606f5460ff16611402576079546001600160401b03600160c01b9091048116908216106114025760405163401636df60e01b815260040160405180910390fd5b607980546001600160c01b0316600160c01b6001600160401b038416021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190610f2d90839061417b565b607454600160401b90046001600160a01b031633146114b557606f5460ff161561148f57604051630bc011ff60e21b815260040160405180910390fd5b61149881611324565b6114b557604051630674f25160e11b815260040160405180910390fd5b6114be81613882565b50565b607a546001600160a01b031633146114ec57604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b03821611156115195760405163f5e37f2f60e01b815260040160405180910390fd5b606f5460ff1661155957607b546001600160401b03600160a01b9091048116908216106115595760405163f5e37f2f60e01b815260040160405180910390fd5b607b8054600160a01b600160e01b031916600160a01b6001600160401b038416021790556040517fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90610f2d90839061417b565b60768054610bb890614aee565b5f8585805190602001208585856040516020016115db959493929190614b61565b60405160208183030381529060405280519060200120905095945050505050565b606f5460ff161561162057604051630bc011ff60e21b815260040160405180910390fd5b606f54600160581b90046001600160a01b03163314611652576040516311e7be1560e01b815260040160405180910390fd5b815f8190036116745760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561169757604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160401b820481165f81815260726020526040812054838516949293600160801b909304909216919082905b86811015611976575f8a8a838181106116ea576116ea614ba0565b90506020028101906116fc9190614bb4565b61170590614bc8565b805180516020909101206060820151919250906001600160401b0316156117f1578561173081614c51565b9650505f818360200151846060015160405160200161175193929190614c7e565b60408051601f1981840301815291815281516020928301206001600160401b038a165f908152607190935291205490915081146117a15760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b038088165f9081526071602052604080822091909155606085015190850151908216911610156117eb57604051633fbd5c3960e11b815260040160405180910390fd5b506118d3565b60208201511580159061188f575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303815f875af1158015611869573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061188d9190614ab0565b155b156118ad576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c010156118d3576040516328a69b1f60e21b815260040160405180910390fd5b876001600160401b031682604001516001600160401b0316108061190357504282604001516001600160401b0316115b15611921576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518d604051602001611942959493929190614b61565b604051602081830303815290604052805190602001209450816040015197505050808061196e90614ca1565b9150506116cf565b506119818685614b3a565b6073549094506001600160401b03600160c01b909104811690841611156119bb5760405163c630a00d60e01b815260040160405180910390fd5b5f6119c68285614cb9565b6119d9906001600160401b031688614cd9565b60408051606081018252858152426001600160401b03908116602080840191825260738054600160401b9081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585166001600160801b03199384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611a8d5760738054600160801b600160c01b031916600160801b6001600160401b038716021790555b611ad2333083607054611aa09190614cec565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613a14565b611ada613a85565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611b32575f80fd5b505af1158015611b44573d5f803e3d5ffd5b50506040516001600160401b03881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a546001600160a01b03163314611bb257604051634755657960e01b815260040160405180910390fd5b607b54600160e01b900460ff16611bdc5760405163f6ba91a160e01b815260040160405180910390fd5b607b805460ff60e01b191690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f6070546064611c239190614cec565b905090565b606f5460ff1615611c4c57604051630bc011ff60e21b815260040160405180910390fd5b6079546001600160401b038581165f908152607260205260409020600101544292611c8292600160c01b90910481169116614b3a565b6001600160401b03161115611caa57604051638a0704d360e01b815260040160405180910390fd5b6103e8611cb78686614cb9565b6001600160401b03161115611cdf57604051635acfba9d60e11b815260040160405180910390fd5b611ced86868686868661329d565b611cf684613b23565b607954600160801b90046001600160401b03165f03611dd257607480546001600160401b0319166001600160401b038681169182179092555f9081526075602052604090208390556079541615611d5857607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b158015611db7575f80fd5b505af1158015611dc9573d5f803e3d5ffd5b50505050611e81565b611dda613a85565b607980546001600160401b0316905f611df283614c51565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f9081526078909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b60405182815233906001600160401b038616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966906020016111b6565b607a546001600160a01b03163314611ee957604051634755657960e01b815260040160405180910390fd5b606f8054600160581b600160f81b031916600160581b6001600160a01b038416021790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610f2d908390614369565b611f4561323e565b611f4e5f613cf2565b565b611f586120ec565b6001600160a01b0316336001600160a01b031614612060575f611f796125ae565b9050806001600160401b0316826001600160401b031611611fad5760405163812a372d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b90910481169083161180611feb57506001600160401b038083165f9081526072602052604090206001015416155b1561200957604051632631700560e21b815260040160405180910390fd5b6001600160401b038083165f9081526072602052604090206001015442916120369162093a809116614b3a565b6001600160401b0316111561205e5760405163692baaad60e11b815260040160405180910390fd5b505b6114be613d43565b607b546001600160a01b031633146120935760405163d1ec4b2360e01b815260040160405180910390fd5b607b54607a80546001600160a01b0319166001600160a01b0390921691821790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e916120e291614369565b60405180910390a1565b6033546001600160a01b031690565b61210361323e565b607480546001600160401b0319166001600160401b0392909216919091179055565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016121739190614369565b602060405180830381865afa15801561218e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121b29190614ab0565b90505f6121bd6125ae565b6073546001600160401b03600160401b82048116916121ed91600160801b8204811691600160c01b900416614cb9565b6121f79190614b3a565b6122019190614cb9565b6001600160401b03169050805f0361221b575f9250505090565b6122258183614d03565b9250505090565b606f5460ff161561225057604051630bc011ff60e21b815260040160405180910390fd5b61225f8787878787878761356e565b6001600160401b0384165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16122b9613d43565b50505050505050565b6122ca61323e565b607380546001600160401b03909216600160401b02600160401b600160801b0319909216919091179055565b607a546001600160a01b0316331461232157604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b038216111561234e57604051630cc9650760e41b815260040160405180910390fd5b606f5460ff1661238e576079546001600160401b03600160801b90910481169082161061238e5760405163048a05a960e41b815260040160405180910390fd5b60798054600160801b600160c01b031916600160801b6001600160401b038416021790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590610f2d90839061417b565b607a546001600160a01b0316331461240d57604051634755657960e01b815260040160405180910390fd5b62015180816001600160401b0316111561243a57604051631c0cfbfd60e31b815260040160405180910390fd5b606f8054610100600160481b0319166101006001600160401b038416021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890610f2d90839061417b565b607a546001600160a01b031633146124b557604051634755657960e01b815260040160405180910390fd5b607b80546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610f2d908390614369565b61250861323e565b6114be81613b23565b5f67ffffffff000000016001600160401b038316108015612546575067ffffffff00000001604083901c6001600160401b0316105b8015612566575067ffffffff00000001608083901c6001600160401b0316105b801561257d575067ffffffff0000000160c083901c105b1561258a57506001919050565b505f919050565b919050565b61259e61323e565b60776125aa8282614d63565b5050565b6079545f906001600160401b0316156125e957506079546001600160401b039081165f90815260786020526040902054600160401b90041690565b506074546001600160401b031690565b607a546001600160a01b0316331461262457604051634755657960e01b815260040160405180910390fd5b60766126308282614d63565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610f2d9190614243565b5f54610100900460ff161580801561267e57505f54600160ff909116105b8061269e575061268d30613db9565b15801561269e57505f5460ff166001145b6127015760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610a30565b5f805460ff191660011790558015612722575f805461ff0019166101001790555b61272f6020880188614634565b607a80546001600160a01b0319166001600160a01b039290921691909117905561275f6040880160208901614634565b606f80546001600160a01b0392909216600160581b02600160581b600160f81b031990921691909117905561279a6080880160608901614634565b607480546001600160a01b0392909216600160401b02600160401b600160e01b03199092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad86905560766127fd8682614d63565b50607761280a8582614d63565b5062093a8061281f6060890160408a01614467565b6001600160401b0316111561284757604051630cc9650760e41b815260040160405180910390fd5b6128576060880160408901614467565b607980546001600160401b0392909216600160801b02600160801b600160c01b031990921691909117905562093a8061289660a0890160808a01614467565b6001600160401b031611156128be57604051631d06e87960e01b815260040160405180910390fd5b6128ce60a0880160808901614467565b607980546001600160c01b0316600160c01b6001600160401b03939093169290920291909117905567016345785d8a0000607055606f8054610100600160581b031916620708006101f560491b01179055607b8054600160a01b600160e81b031916670200000000000d2f60a71b179055612947613dc8565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f0000000000000000000000000000000000000000000000000000000000000000858560405161299c9493929190614e46565b60405180910390a180156122b9575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b54600160e01b900460ff1615612a1c576040516324eff8c360e01b815260040160405180910390fd5b606f5460ff1615612a4057604051630bc011ff60e21b815260040160405180910390fd5b805f819003612a625760405163cb591a5f60e01b815260040160405180910390fd5b6103e8811115612a8557604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160c01b8204811691612aad918491600160801b900416614e7c565b1115612acc5760405163c630a00d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b820481165f818152607260205260408120549193600160801b9004909216915b84811015612c7b575f878783818110612b1757612b17614ba0565b9050602002810190612b299190614e8f565b612b3290614ea3565b905083612b3e81614c51565b825180516020918201208185015160408087015190519499509194505f93612b699386939101614c7e565b60408051601f1981840301815291815281516020928301206001600160401b0389165f90815260719093529120549091508114612bb95760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b0386165f90815260716020526040812055612bdc600189614cd9565b8403612c305742607b60149054906101000a90046001600160401b03168460400151612c089190614b3a565b6001600160401b03161115612c305760405163c44a082160e01b815260040160405180910390fd5b848284602001514233604051602001612c4d959493929190614b61565b6040516020818303038152906040528051906020012094505050508080612c7390614ca1565b915050612afc565b50612c868484614b3a565b607380546001600160401b034281166001600160401b03199092168217808455604080516060810182528781526020808201958652600160401b9384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686026001600160801b031990921693871693909317179091558554938916600160801b02600160801b600160c01b031993860293909316600160401b600160c01b031990941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a546001600160a01b03163314612d9b57604051634755657960e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612df3575f80fd5b505af1158015612e05573d5f803e3d5ffd5b50505050611f4e613e3b565b612e1961323e565b604080516060810182529384526001600160401b0392831660208086019182529284168583019081529584165f9081526072909352912092518355516001909201805493518216600160401b026001600160801b03199094169290911691909117919091179055565b607b54600160e01b900460ff1615612ead576040516324eff8c360e01b815260040160405180910390fd5b606f5460ff1615612ed157604051630bc011ff60e21b815260040160405180910390fd5b5f612eda611c13565b905081811115612efd57604051634732fdb560e01b815260040160405180910390fd5b611388831115612f20576040516328a69b1f60e21b815260040160405180910390fd5b612f556001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084613a14565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fb2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fd69190614ab0565b60738054919250600160c01b9091046001600160401b0316906018612ffa83614c51565b91906101000a8154816001600160401b0302191690836001600160401b0316021790555050848460405161302f929190614f1b565b6040519081900381206130489183904290602001614c7e565b60408051808303601f190181529181528151602092830120607354600160c01b90046001600160401b03165f90815260719093529120553233036130d7576073546040805183815233602082015260609181018290525f91810191909152600160c01b9091046001600160401b0316905f805160206150338339815191529060800160405180910390a2613121565b607360189054906101000a90046001600160401b03166001600160401b03165f80516020615033833981519152823388886040516131189493929190614f2a565b60405180910390a25b5050505050565b607a546001600160a01b0316331461315357604051634755657960e01b815260040160405180910390fd5b60748054600160401b600160e01b031916600160401b6001600160a01b038416021790556040517f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90610f2d908390614369565b6131af61323e565b6001600160a01b0381166132145760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a30565b6114be81613cf2565b61322561323e565b6001600160401b03165f90815260756020526040902055565b336132476120ec565b6001600160a01b031614611f4e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a30565b5f806132a76125ae565b90506001600160401b0388161561333c576079546001600160401b0390811690891611156132e85760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b038089165f908152607860205260409020600281015481549094509091898116600160401b909204161461333657604051632bd2e3e760e01b815260040160405180910390fd5b506133a7565b6001600160401b0387165f90815260756020526040902054915081613374576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611156133a757604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316866001600160401b0316116133d95760405163b9b18f5760e01b815260040160405180910390fd5b5f6133e78888888689610f38565b90505f5f80516020614ff38339815191526002836040516134089190614a95565b602060405180830381855afa158015613423573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906134469190614ab0565b6134509190614adb565b604080516020810182528281529051634890ed4560e11b81529192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916134ac91899190600401614f54565b602060405180830381865afa1580156134c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134eb9190614f8e565b613508576040516309bde33960e01b815260040160405180910390fd5b61356233613516858b614cb9565b6001600160401b0316613527612125565b6135319190614cec565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190613e92565b50505050505050505050565b5f6001600160401b03881615613600576079546001600160401b0390811690891611156135ae5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f908152607860205260409020600281015481549092888116600160401b90920416146135fa57604051632bd2e3e760e01b815260040160405180910390fd5b50613667565b506001600160401b0385165f9081526075602052604090205480613637576040516324cbdcc360e11b815260040160405180910390fd5b6074546001600160401b03908116908716111561366757604051630f2b74f160e11b815260040160405180910390fd5b6079546001600160401b0390811690881611806136965750876001600160401b0316876001600160401b031611155b806136b757506079546001600160401b03600160401b909104811690881611155b156136d55760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260786020526040902054600160401b9004811690861614613718576040516332a2a77f60e01b815260040160405180910390fd5b5f6137268787878588610f38565b90505f5f80516020614ff38339815191526002836040516137479190614a95565b602060405180830381855afa158015613762573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137859190614ab0565b61378f9190614adb565b604080516020810182528281529051634890ed4560e11b81529192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916137eb91889190600401614f54565b602060405180830381865afa158015613806573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061382a9190614f8e565b613847576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f908152607860205260409020600201548590036135625760405163a47276bd60e01b815260040160405180910390fd5b6079546001600160401b03600160401b90910481169082161115806138b557506079546001600160401b03908116908216115b156138d35760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f818152607860209081526040808320805460748054600160401b928390049098166001600160401b03199098168817905560028201548786526075909452938290209290925560798054600160401b600160801b0319169390940292909217909255600182015490516333d6247d60e01b815260048101919091529091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b1580156139a8575f80fd5b505af11580156139ba573d5f803e3d5ffd5b50505050826001600160401b0316816001600160401b03167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e8460020154604051613a0791815260200190565b60405180910390a3505050565b6040516001600160a01b0380851660248301528316604482015260648101829052613a7f9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613ec7565b50505050565b6079546001600160401b03600160401b8204811691161115611f4e576079545f90613ac190600160401b90046001600160401b03166001614b3a565b9050613acc81611324565b156114be576079545f90600290613aed9084906001600160401b0316614cb9565b613af79190614fad565b613b019083614b3a565b9050613b0c81611324565b15613b1a576125aa81613882565b6125aa82613882565b5f613b2c6125ae565b9050815f80613b3b8484614cb9565b606f546001600160401b0391821692505f91613b5d9161010090041642614cd9565b90505b846001600160401b0316846001600160401b031614613bdd576001600160401b038085165f9081526072602052604090206001810154909116821015613bbc576001810154600160401b90046001600160401b03169450613bd7565b613bc68686614cb9565b6001600160401b0316935050613bdd565b50613b60565b5f613be88484614cd9565b905083811015613c3f57808403600c8111613c035780613c06565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281613c3557613c35614ac7565b0460705550613cae565b838103600c8111613c505780613c53565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a76400000281613c8957613c89614ac7565b04905080607054670de0b6b3a76400000281613ca757613ca7614ac7565b0460705550505b683635c9adc5dea000006070541115613cd357683635c9adc5dea000006070556122b9565b633b9aca0060705410156122b957633b9aca0060705550505050505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613d9b575f80fd5b505af1158015613dad573d5f803e3d5ffd5b50505050611f4e613f98565b6001600160a01b03163b151590565b5f54610100900460ff16613e325760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610a30565b611f4e33613cf2565b606f5460ff16613e5e57604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b6040516001600160a01b038316602482015260448101829052613ec290849063a9059cbb60e01b90606401613a48565b505050565b5f613f1b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613ff39092919063ffffffff16565b805190915015613ec25780806020019051810190613f399190614f8e565b613ec25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a30565b606f5460ff1615613fbc57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b606061400184845f85614009565b949350505050565b60608247101561406a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610a30565b5f80866001600160a01b031685876040516140859190614a95565b5f6040518083038185875af1925050503d805f81146140bf576040519150601f19603f3d011682016040523d82523d5f602084013e6140c4565b606091505b50915091506140d5878383876140e0565b979650505050505050565b6060831561414c5782515f03614145576140f985613db9565b6141455760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a30565b5081614001565b61400183838151156141615781518083602001fd5b8060405162461bcd60e51b8152600401610a309190614243565b6001600160401b0391909116815260200190565b80356001600160401b0381168114612591575f80fd5b5f805f805f60a086880312156141b9575f80fd5b6141c28661418f565b94506141d06020870161418f565b93506141de6040870161418f565b94979396509394606081013594506080013592915050565b5f5b838110156142105781810151838201526020016141f8565b50505f910152565b5f815180845261422f8160208601602086016141f6565b601f01601f19169290920160200192915050565b602081525f6142556020830184614218565b9392505050565b806040810183101561426c575f80fd5b92915050565b5f805f805f805f806101a0898b03121561428a575f80fd5b6142938961418f565b97506142a160208a0161418f565b96506142af60408a0161418f565b955060608901359450608089013593506142cc8a60a08b0161425c565b925061016089018a8111156142df575f80fd5b60e08a0192506142ef8b8261425c565b9150509295985092959890939650565b5f6020828403121561430f575f80fd5b813561ffff81168114614255575f80fd5b5f805f805f60a08688031215614334575f80fd5b61433d8661418f565b945061434b6020870161418f565b94979496505050506040830135926060810135926080909101359150565b6001600160a01b0391909116815260200190565b80610300810183101561426c575f80fd5b5f805f805f806103a087890312156143a4575f80fd5b6143ad8761418f565b95506143bb6020880161418f565b94506143c96040880161418f565b935060608701359250608087013591506143e68860a0890161437d565b90509295509295509295565b5f805f805f805f6103c0888a031215614409575f80fd5b6144128861418f565b96506144206020890161418f565b955061442e6040890161418f565b945061443c6060890161418f565b93506080880135925060a088013591506144598960c08a0161437d565b905092959891949750929550565b5f60208284031215614477575f80fd5b6142558261418f565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126144a3575f80fd5b81356001600160401b03808211156144bd576144bd614480565b604051601f8301601f19908116603f011681019082821181831017156144e5576144e5614480565b816040528381528660208588010111156144fd575f80fd5b836020870160208301375f602085830101528094505050505092915050565b80356001600160a01b0381168114612591575f80fd5b5f805f805f60a08688031215614546575f80fd5b8535945060208601356001600160401b03811115614562575f80fd5b61456e88828901614494565b945050604086013592506145846060870161418f565b91506145926080870161451c565b90509295509295909350565b5f8083601f8401126145ae575f80fd5b5081356001600160401b038111156145c4575f80fd5b6020830191508360208260051b85010111156145de575f80fd5b9250929050565b5f805f604084860312156145f7575f80fd5b83356001600160401b0381111561460c575f80fd5b6146188682870161459e565b909450925061462b90506020850161451c565b90509250925092565b5f60208284031215614644575f80fd5b6142558261451c565b5f6020828403121561465d575f80fd5b5035919050565b5f60208284031215614674575f80fd5b81356001600160401b03811115614689575f80fd5b61400184828501614494565b5f8083601f8401126146a5575f80fd5b5081356001600160401b038111156146bb575f80fd5b6020830191508360208285010111156145de575f80fd5b5f805f805f808688036101208112156146e9575f80fd5b60a08112156146f6575f80fd5b5086955060a0860135945060c08601356001600160401b038082111561471a575f80fd5b6147268a838b01614494565b955060e089013591508082111561473b575f80fd5b6147478a838b01614494565b945061010089013591508082111561475d575f80fd5b5061476a89828a01614695565b979a9699509497509295939492505050565b5f806020838503121561478d575f80fd5b82356001600160401b038111156147a2575f80fd5b6147ae8582860161459e565b90969095509350505050565b5f805f80608085870312156147cd575f80fd5b6147d68561418f565b9350602085013592506147eb6040860161418f565b91506147f96060860161418f565b905092959194509250565b5f805f60408486031215614816575f80fd5b83356001600160401b0381111561482b575f80fd5b61483786828701614695565b909790965060209590950135949350505050565b5f806040838503121561485c575f80fd5b8235915061486c6020840161418f565b90509250929050565b60208082526058908201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60408201527f64696e6753746174654e756d206d757374206265206c657373206f7220657175606082015277616c207468616e206c61737450656e64696e67537461746560401b608082015260a00190565b6020808252604c908201525f80516020614fd383398151915260408201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760608201526b040e6e8c2e8ca40c4c2e8c6d60a31b608082015260a00190565b60208082526043908201525f80516020614fd383398151915260408201527f744e756d426174636820737461746520726f6f7420646f6573206e6f742065786060820152621a5cdd60ea1b608082015260a00190565b6020808252605d908201525f80516020614fd383398151915260408201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060608201527f7468616e2063757272656e744c61737456657269666965644261746368000000608082015260a00190565b60208082526057908201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60408201527f616c4e65774261746368206d75737420626520626967676572207468616e20636060820152760eae4e4cadce898c2e6e8accae4d2ccd2cac884c2e8c6d604b1b608082015260a00190565b5f8251614aa68184602087016141f6565b9190910192915050565b5f60208284031215614ac0575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82614ae957614ae9614ac7565b500690565b600181811c90821680614b0257607f821691505b602082108103614b2057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03818116838216019080821115614b5a57614b5a614b26565b5092915050565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112614aa6575f80fd5b5f60808236031215614bd8575f80fd5b604051608081016001600160401b038082118383101715614bfb57614bfb614480565b816040528435915080821115614c0f575f80fd5b50614c1c36828601614494565b82525060208301356020820152614c356040840161418f565b6040820152614c466060840161418f565b606082015292915050565b5f6001600160401b038281166002600160401b03198101614c7457614c74614b26565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b5f60018201614cb257614cb2614b26565b5060010190565b6001600160401b03828116828216039080821115614b5a57614b5a614b26565b8181038181111561426c5761426c614b26565b808202811582820484141761426c5761426c614b26565b5f82614d1157614d11614ac7565b500490565b601f821115613ec2575f81815260208120601f850160051c81016020861015614d3c5750805b601f850160051c820191505b81811015614d5b57828155600101614d48565b505050505050565b81516001600160401b03811115614d7c57614d7c614480565b614d9081614d8a8454614aee565b84614d16565b602080601f831160018114614dc3575f8415614dac5750858301515b5f19600386901b1c1916600185901b178555614d5b565b5f85815260208120601f198616915b82811015614df157888601518255948401946001909101908401614dd2565b5085821015614e0e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160401b038581168252841660208201526060604082018190525f90614e729083018486614e1e565b9695505050505050565b8082018082111561426c5761426c614b26565b5f8235605e19833603018112614aa6575f80fd5b5f60608236031215614eb3575f80fd5b604051606081016001600160401b038082118383101715614ed657614ed6614480565b816040528435915080821115614eea575f80fd5b50614ef736828601614494565b82525060208301356020820152614f106040840161418f565b604082015292915050565b818382375f9101908152919050565b8481526001600160a01b03841660208201526060604082018190525f90614e729083018486614e1e565b6103208101610300808584378201835f5b6001811015614f84578151835260209283019290910190600101614f65565b5050509392505050565b5f60208284031215614f9e575f80fd5b81518015158114614255575f80fd5b5f6001600160401b0383811680614fc657614fc6614ac7565b9216919091049291505056fe506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6930644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001cb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fef94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931a2646970667358221220e9d0794f194ac421b9dc493895a874be8a13d701d1033aaa31a3f4a7f895a91464736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061033a575f3560e01c80638c3d7301116101b85780638c3d7301146106985780638da5cb5b146106a057806396dc3d39146106a857806399f5634e146106bb5780639aa972a3146106c35780639b796760146106d65780639c9f3dfe146106e9578063a066215c146106fc578063a3c573eb1461070f578063ada8f91914610736578063adc879e914610749578063afd23cbe14610770578063b4d63f5814610798578063b4f77ea9146107f7578063b6b0b0971461080a578063ba58ae3914610831578063c0cad30214610844578063c0ed84e014610857578063c754c7ed1461085f578063c89e42df14610879578063cfa8ed471461088c578063d02103ca146108a6578063d2e129f9146108cd578063d8d1091b146108e0578063d939b315146108f3578063dbc169761461090d578063e0d1744114610915578063e7a7ed0214610928578063e8bf92ed14610942578063eaeb077b14610969578063ed6b01041461097c578063f14916d614610990578063f2fde38b146109a3578063f851a440146109b6578063f8b823e4146109c9578063fe16564f146109d2575f80fd5b80630a0d9fbe1461033e5780630eaa86ea1461036c578063107bf28c1461038d57806310a01a72146103a257806315064c96146103b75780631816b7e5146103d457806319d8ac61146103e7578063220d7899146103fa578063267822471461040d578063298789831461042d5780632b0006fa146104475780632c1f816a1461045a578063383b3be81461046d578063394218e914610480578063423fa8561461049357806345605267146104ad578063458c0477146104c75780634a1a89a7146104da5780634a910e6a146104f45780634e487706146105075780635392c5e01461051a578063542028d514610539578063574f649e146105415780635e9145c9146105545780635ec9195814610567578063604691691461056f578063621dd411146105775780636b8616ce1461058a5780636ff512cc146105a9578063715018a6146105bc5780637215541a146105c45780637fcb3653146105d7578063831c7ead146105ea578063837a473814610611578063841b24d71461067e575b5f80fd5b606f546103569061010090046001600160401b031681565b604051610363919061417b565b60405180910390f35b61037f61037a3660046141a5565b6109e5565b604051908152602001610363565b610395610bab565b6040516103639190614243565b6103b56103b0366004614272565b610c37565b005b606f546103c49060ff1681565b6040519015158152602001610363565b6103b56103e23660046142ff565b610e7f565b607354610356906001600160401b031681565b610395610408366004614320565b610f38565b607b54610420906001600160a01b031681565b6040516103639190614369565b60745461042090600160401b90046001600160a01b031681565b6103b561045536600461438e565b611092565b6103b56104683660046143f2565b6111c6565b6103c461047b366004614467565b611324565b6103b561048e366004614467565b61136a565b60735461035690600160401b90046001600160401b031681565b60735461035690600160801b90046001600160401b031681565b607954610356906001600160401b031681565b60795461035690600160401b90046001600160401b031681565b6103b5610502366004614467565b611452565b6103b5610515366004614467565b6114c1565b61037f610528366004614467565b60756020525f908152604090205481565b6103956115ad565b61037f61054f366004614532565b6115ba565b6103b56105623660046145e5565b6115fc565b6103b5611b87565b61037f611c13565b6103b561058536600461438e565b611c28565b61037f610598366004614467565b60716020525f908152604090205481565b6103b56105b7366004614634565b611ebe565b6103b5611f3d565b6103b56105d2366004614467565b611f50565b607454610356906001600160401b031681565b6103567f000000000000000000000000000000000000000000000000000000000000000081565b61065361061f36600461464d565b60786020525f90815260409020805460018201546002909201546001600160401b0380831693600160401b90930416919084565b604080516001600160401b039586168152949093166020850152918301526060820152608001610363565b60795461035690600160c01b90046001600160401b031681565b6103b5612068565b6104206120ec565b6103b56106b6366004614467565b6120fb565b61037f612125565b6103b56106d13660046143f2565b61222c565b6103b56106e4366004614467565b6122c2565b6103b56106f7366004614467565b6122f6565b6103b561070a366004614467565b6123e2565b6104207f000000000000000000000000000000000000000000000000000000000000000081565b6103b5610744366004614634565b61248a565b6103567f000000000000000000000000000000000000000000000000000000000000000081565b606f5461078590600160481b900461ffff1681565b60405161ffff9091168152602001610363565b6107d26107a6366004614467565b60726020525f9081526040902080546001909101546001600160401b0380821691600160401b90041683565b604080519384526001600160401b039283166020850152911690820152606001610363565b6103b5610805366004614467565b612500565b6104207f000000000000000000000000000000000000000000000000000000000000000081565b6103c461083f36600461464d565b612511565b6103b5610852366004614664565b612596565b6103566125ae565b607b5461035690600160a01b90046001600160401b031681565b6103b5610887366004614664565b6125f9565b606f5461042090600160581b90046001600160a01b031681565b6104207f000000000000000000000000000000000000000000000000000000000000000081565b6103b56108db3660046146d2565b612660565b6103b56108ee36600461477c565b6129f1565b60795461035690600160801b90046001600160401b031681565b6103b5612d70565b6103b56109233660046147ba565b612e11565b60735461035690600160c01b90046001600160401b031681565b6104207f000000000000000000000000000000000000000000000000000000000000000081565b6103b5610977366004614804565b612e82565b607b546103c490600160e01b900460ff1681565b6103b561099e366004614634565b613128565b6103b56109b1366004614634565b6131a7565b607a54610420906001600160a01b031681565b61037f60705481565b6103b56109e036600461484b565b61321d565b5f805f6109f06125ae565b90506001600160401b03881615610a8c576079546001600160401b039081169089161115610a395760405162461bcd60e51b8152600401610a3090614875565b60405180910390fd5b6001600160401b038089165f908152607860205260409020600281015481549094509091898116600160401b9092041614610a865760405162461bcd60e51b8152600401610a30906148f3565b50610af5565b6001600160401b0387165f90815260756020526040902054915081610ac35760405162461bcd60e51b8152600401610a3090614952565b806001600160401b0316876001600160401b03161115610af55760405162461bcd60e51b8152600401610a30906149a8565b806001600160401b0316866001600160401b031611610b265760405162461bcd60e51b8152600401610a3090614a18565b5f610b348888888689610f38565b90505f5f80516020614ff3833981519152600283604051610b559190614a95565b602060405180830381855afa158015610b70573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b939190614ab0565b610b9d9190614adb565b9a9950505050505050505050565b60778054610bb890614aee565b80601f0160208091040260200160405190810160405280929190818152602001828054610be490614aee565b8015610c2f5780601f10610c0657610100808354040283529160200191610c2f565b820191905f5260205f20905b815481529060010190602001808311610c1257829003601f168201915b505050505081565b610c3f61323e565b5f80610c496125ae565b90506001600160401b038a1615610cdc576079546001600160401b03908116908b161115610c895760405162461bcd60e51b8152600401610a3090614875565b6001600160401b03808b165f9081526078602052604090206002810154815490945090918b8116600160401b9092041614610cd65760405162461bcd60e51b8152600401610a30906148f3565b50610d45565b6001600160401b0389165f90815260756020526040902054915081610d135760405162461bcd60e51b8152600401610a3090614952565b806001600160401b0316896001600160401b03161115610d455760405162461bcd60e51b8152600401610a30906149a8565b806001600160401b0316886001600160401b031611610d765760405162461bcd60e51b8152600401610a3090614a18565b5f610d848a8a8a868b610f38565b607480546001600160401b0319166001600160401b038c81169182179092555f9081526075602052604090208990556079549192501615610dd057607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018990527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b158015610e2f575f80fd5b505af1158015610e41573d5f803e3d5ffd5b50506040518981523392506001600160401b038c1691505f805160206150138339815191529060200160405180910390a35050505050505050505050565b607a546001600160a01b03163314610eaa57604051634755657960e01b815260040160405180910390fd5b6103e88161ffff161080610ec357506103ff8161ffff16115b15610ee157604051630984a67960e31b815260040160405180910390fd5b606f805461ffff60481b1916600160481b61ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b6001600160401b038086165f818152607260205260408082205493881682529020546060929115801590610f6a575081155b15610f885760405163340c614f60e11b815260040160405180910390fd5b80610fa6576040516366385b5160e01b815260040160405180910390fd5b610faf84612511565b610fcc576040516305dae44f60e21b815260040160405180910390fd5b604080516001600160601b03193360601b166020820152603481019690965260548601929092526001600160c01b031960c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b607454600160401b90046001600160a01b031633146110c45760405163bbcbbc0560e01b815260040160405180910390fd5b6110d286868686868661329d565b607480546001600160401b0319166001600160401b038681169182179092555f908152607560205260409020839055607954161561111b57607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b15801561117a575f80fd5b505af115801561118c573d5f803e3d5ffd5b50506040518481523392506001600160401b03871691505f80516020615013833981519152906020015b60405180910390a3505050505050565b607454600160401b90046001600160a01b031633146111f85760405163bbcbbc0560e01b815260040160405180910390fd5b6112078787878787878761356e565b607480546001600160401b0319166001600160401b038681169182179092555f908152607560205260409020839055607954161561125057607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b1580156112af575f80fd5b505af11580156112c1573d5f803e3d5ffd5b5050607980546001600160c01b031661127560c71b179055505060405182815233906001600160401b038616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b6079546001600160401b038281165f908152607860205260408120549092429261135992600160801b90920481169116614b3a565b6001600160401b0316111592915050565b607a546001600160a01b0316331461139557604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b03821611156113c257604051631d06e87960e01b815260040160405180910390fd5b606f5460ff16611402576079546001600160401b03600160c01b9091048116908216106114025760405163401636df60e01b815260040160405180910390fd5b607980546001600160c01b0316600160c01b6001600160401b038416021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190610f2d90839061417b565b607454600160401b90046001600160a01b031633146114b557606f5460ff161561148f57604051630bc011ff60e21b815260040160405180910390fd5b61149881611324565b6114b557604051630674f25160e11b815260040160405180910390fd5b6114be81613882565b50565b607a546001600160a01b031633146114ec57604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b03821611156115195760405163f5e37f2f60e01b815260040160405180910390fd5b606f5460ff1661155957607b546001600160401b03600160a01b9091048116908216106115595760405163f5e37f2f60e01b815260040160405180910390fd5b607b8054600160a01b600160e01b031916600160a01b6001600160401b038416021790556040517fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90610f2d90839061417b565b60768054610bb890614aee565b5f8585805190602001208585856040516020016115db959493929190614b61565b60405160208183030381529060405280519060200120905095945050505050565b606f5460ff161561162057604051630bc011ff60e21b815260040160405180910390fd5b606f54600160581b90046001600160a01b03163314611652576040516311e7be1560e01b815260040160405180910390fd5b815f8190036116745760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561169757604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160401b820481165f81815260726020526040812054838516949293600160801b909304909216919082905b86811015611976575f8a8a838181106116ea576116ea614ba0565b90506020028101906116fc9190614bb4565b61170590614bc8565b805180516020909101206060820151919250906001600160401b0316156117f1578561173081614c51565b9650505f818360200151846060015160405160200161175193929190614c7e565b60408051601f1981840301815291815281516020928301206001600160401b038a165f908152607190935291205490915081146117a15760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b038088165f9081526071602052604080822091909155606085015190850151908216911610156117eb57604051633fbd5c3960e11b815260040160405180910390fd5b506118d3565b60208201511580159061188f575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303815f875af1158015611869573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061188d9190614ab0565b155b156118ad576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c010156118d3576040516328a69b1f60e21b815260040160405180910390fd5b876001600160401b031682604001516001600160401b0316108061190357504282604001516001600160401b0316115b15611921576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518d604051602001611942959493929190614b61565b604051602081830303815290604052805190602001209450816040015197505050808061196e90614ca1565b9150506116cf565b506119818685614b3a565b6073549094506001600160401b03600160c01b909104811690841611156119bb5760405163c630a00d60e01b815260040160405180910390fd5b5f6119c68285614cb9565b6119d9906001600160401b031688614cd9565b60408051606081018252858152426001600160401b03908116602080840191825260738054600160401b9081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585166001600160801b03199384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611a8d5760738054600160801b600160c01b031916600160801b6001600160401b038716021790555b611ad2333083607054611aa09190614cec565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613a14565b611ada613a85565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611b32575f80fd5b505af1158015611b44573d5f803e3d5ffd5b50506040516001600160401b03881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a546001600160a01b03163314611bb257604051634755657960e01b815260040160405180910390fd5b607b54600160e01b900460ff16611bdc5760405163f6ba91a160e01b815260040160405180910390fd5b607b805460ff60e01b191690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f6070546064611c239190614cec565b905090565b606f5460ff1615611c4c57604051630bc011ff60e21b815260040160405180910390fd5b6079546001600160401b038581165f908152607260205260409020600101544292611c8292600160c01b90910481169116614b3a565b6001600160401b03161115611caa57604051638a0704d360e01b815260040160405180910390fd5b6103e8611cb78686614cb9565b6001600160401b03161115611cdf57604051635acfba9d60e11b815260040160405180910390fd5b611ced86868686868661329d565b611cf684613b23565b607954600160801b90046001600160401b03165f03611dd257607480546001600160401b0319166001600160401b038681169182179092555f9081526075602052604090208390556079541615611d5857607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b158015611db7575f80fd5b505af1158015611dc9573d5f803e3d5ffd5b50505050611e81565b611dda613a85565b607980546001600160401b0316905f611df283614c51565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f9081526078909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b60405182815233906001600160401b038616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966906020016111b6565b607a546001600160a01b03163314611ee957604051634755657960e01b815260040160405180910390fd5b606f8054600160581b600160f81b031916600160581b6001600160a01b038416021790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610f2d908390614369565b611f4561323e565b611f4e5f613cf2565b565b611f586120ec565b6001600160a01b0316336001600160a01b031614612060575f611f796125ae565b9050806001600160401b0316826001600160401b031611611fad5760405163812a372d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b90910481169083161180611feb57506001600160401b038083165f9081526072602052604090206001015416155b1561200957604051632631700560e21b815260040160405180910390fd5b6001600160401b038083165f9081526072602052604090206001015442916120369162093a809116614b3a565b6001600160401b0316111561205e5760405163692baaad60e11b815260040160405180910390fd5b505b6114be613d43565b607b546001600160a01b031633146120935760405163d1ec4b2360e01b815260040160405180910390fd5b607b54607a80546001600160a01b0319166001600160a01b0390921691821790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e916120e291614369565b60405180910390a1565b6033546001600160a01b031690565b61210361323e565b607480546001600160401b0319166001600160401b0392909216919091179055565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016121739190614369565b602060405180830381865afa15801561218e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121b29190614ab0565b90505f6121bd6125ae565b6073546001600160401b03600160401b82048116916121ed91600160801b8204811691600160c01b900416614cb9565b6121f79190614b3a565b6122019190614cb9565b6001600160401b03169050805f0361221b575f9250505090565b6122258183614d03565b9250505090565b606f5460ff161561225057604051630bc011ff60e21b815260040160405180910390fd5b61225f8787878787878761356e565b6001600160401b0384165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16122b9613d43565b50505050505050565b6122ca61323e565b607380546001600160401b03909216600160401b02600160401b600160801b0319909216919091179055565b607a546001600160a01b0316331461232157604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b038216111561234e57604051630cc9650760e41b815260040160405180910390fd5b606f5460ff1661238e576079546001600160401b03600160801b90910481169082161061238e5760405163048a05a960e41b815260040160405180910390fd5b60798054600160801b600160c01b031916600160801b6001600160401b038416021790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590610f2d90839061417b565b607a546001600160a01b0316331461240d57604051634755657960e01b815260040160405180910390fd5b62015180816001600160401b0316111561243a57604051631c0cfbfd60e31b815260040160405180910390fd5b606f8054610100600160481b0319166101006001600160401b038416021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890610f2d90839061417b565b607a546001600160a01b031633146124b557604051634755657960e01b815260040160405180910390fd5b607b80546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610f2d908390614369565b61250861323e565b6114be81613b23565b5f67ffffffff000000016001600160401b038316108015612546575067ffffffff00000001604083901c6001600160401b0316105b8015612566575067ffffffff00000001608083901c6001600160401b0316105b801561257d575067ffffffff0000000160c083901c105b1561258a57506001919050565b505f919050565b919050565b61259e61323e565b60776125aa8282614d63565b5050565b6079545f906001600160401b0316156125e957506079546001600160401b039081165f90815260786020526040902054600160401b90041690565b506074546001600160401b031690565b607a546001600160a01b0316331461262457604051634755657960e01b815260040160405180910390fd5b60766126308282614d63565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610f2d9190614243565b5f54610100900460ff161580801561267e57505f54600160ff909116105b8061269e575061268d30613db9565b15801561269e57505f5460ff166001145b6127015760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610a30565b5f805460ff191660011790558015612722575f805461ff0019166101001790555b61272f6020880188614634565b607a80546001600160a01b0319166001600160a01b039290921691909117905561275f6040880160208901614634565b606f80546001600160a01b0392909216600160581b02600160581b600160f81b031990921691909117905561279a6080880160608901614634565b607480546001600160a01b0392909216600160401b02600160401b600160e01b03199092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad86905560766127fd8682614d63565b50607761280a8582614d63565b5062093a8061281f6060890160408a01614467565b6001600160401b0316111561284757604051630cc9650760e41b815260040160405180910390fd5b6128576060880160408901614467565b607980546001600160401b0392909216600160801b02600160801b600160c01b031990921691909117905562093a8061289660a0890160808a01614467565b6001600160401b031611156128be57604051631d06e87960e01b815260040160405180910390fd5b6128ce60a0880160808901614467565b607980546001600160c01b0316600160c01b6001600160401b03939093169290920291909117905567016345785d8a0000607055606f8054610100600160581b031916620708006101f560491b01179055607b8054600160a01b600160e81b031916670200000000000d2f60a71b179055612947613dc8565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f0000000000000000000000000000000000000000000000000000000000000000858560405161299c9493929190614e46565b60405180910390a180156122b9575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b54600160e01b900460ff1615612a1c576040516324eff8c360e01b815260040160405180910390fd5b606f5460ff1615612a4057604051630bc011ff60e21b815260040160405180910390fd5b805f819003612a625760405163cb591a5f60e01b815260040160405180910390fd5b6103e8811115612a8557604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160c01b8204811691612aad918491600160801b900416614e7c565b1115612acc5760405163c630a00d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b820481165f818152607260205260408120549193600160801b9004909216915b84811015612c7b575f878783818110612b1757612b17614ba0565b9050602002810190612b299190614e8f565b612b3290614ea3565b905083612b3e81614c51565b825180516020918201208185015160408087015190519499509194505f93612b699386939101614c7e565b60408051601f1981840301815291815281516020928301206001600160401b0389165f90815260719093529120549091508114612bb95760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b0386165f90815260716020526040812055612bdc600189614cd9565b8403612c305742607b60149054906101000a90046001600160401b03168460400151612c089190614b3a565b6001600160401b03161115612c305760405163c44a082160e01b815260040160405180910390fd5b848284602001514233604051602001612c4d959493929190614b61565b6040516020818303038152906040528051906020012094505050508080612c7390614ca1565b915050612afc565b50612c868484614b3a565b607380546001600160401b034281166001600160401b03199092168217808455604080516060810182528781526020808201958652600160401b9384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686026001600160801b031990921693871693909317179091558554938916600160801b02600160801b600160c01b031993860293909316600160401b600160c01b031990941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a546001600160a01b03163314612d9b57604051634755657960e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612df3575f80fd5b505af1158015612e05573d5f803e3d5ffd5b50505050611f4e613e3b565b612e1961323e565b604080516060810182529384526001600160401b0392831660208086019182529284168583019081529584165f9081526072909352912092518355516001909201805493518216600160401b026001600160801b03199094169290911691909117919091179055565b607b54600160e01b900460ff1615612ead576040516324eff8c360e01b815260040160405180910390fd5b606f5460ff1615612ed157604051630bc011ff60e21b815260040160405180910390fd5b5f612eda611c13565b905081811115612efd57604051634732fdb560e01b815260040160405180910390fd5b611388831115612f20576040516328a69b1f60e21b815260040160405180910390fd5b612f556001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084613a14565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fb2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fd69190614ab0565b60738054919250600160c01b9091046001600160401b0316906018612ffa83614c51565b91906101000a8154816001600160401b0302191690836001600160401b0316021790555050848460405161302f929190614f1b565b6040519081900381206130489183904290602001614c7e565b60408051808303601f190181529181528151602092830120607354600160c01b90046001600160401b03165f90815260719093529120553233036130d7576073546040805183815233602082015260609181018290525f91810191909152600160c01b9091046001600160401b0316905f805160206150338339815191529060800160405180910390a2613121565b607360189054906101000a90046001600160401b03166001600160401b03165f80516020615033833981519152823388886040516131189493929190614f2a565b60405180910390a25b5050505050565b607a546001600160a01b0316331461315357604051634755657960e01b815260040160405180910390fd5b60748054600160401b600160e01b031916600160401b6001600160a01b038416021790556040517f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90610f2d908390614369565b6131af61323e565b6001600160a01b0381166132145760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a30565b6114be81613cf2565b61322561323e565b6001600160401b03165f90815260756020526040902055565b336132476120ec565b6001600160a01b031614611f4e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a30565b5f806132a76125ae565b90506001600160401b0388161561333c576079546001600160401b0390811690891611156132e85760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b038089165f908152607860205260409020600281015481549094509091898116600160401b909204161461333657604051632bd2e3e760e01b815260040160405180910390fd5b506133a7565b6001600160401b0387165f90815260756020526040902054915081613374576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611156133a757604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316866001600160401b0316116133d95760405163b9b18f5760e01b815260040160405180910390fd5b5f6133e78888888689610f38565b90505f5f80516020614ff38339815191526002836040516134089190614a95565b602060405180830381855afa158015613423573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906134469190614ab0565b6134509190614adb565b604080516020810182528281529051634890ed4560e11b81529192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916134ac91899190600401614f54565b602060405180830381865afa1580156134c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134eb9190614f8e565b613508576040516309bde33960e01b815260040160405180910390fd5b61356233613516858b614cb9565b6001600160401b0316613527612125565b6135319190614cec565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190613e92565b50505050505050505050565b5f6001600160401b03881615613600576079546001600160401b0390811690891611156135ae5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f908152607860205260409020600281015481549092888116600160401b90920416146135fa57604051632bd2e3e760e01b815260040160405180910390fd5b50613667565b506001600160401b0385165f9081526075602052604090205480613637576040516324cbdcc360e11b815260040160405180910390fd5b6074546001600160401b03908116908716111561366757604051630f2b74f160e11b815260040160405180910390fd5b6079546001600160401b0390811690881611806136965750876001600160401b0316876001600160401b031611155b806136b757506079546001600160401b03600160401b909104811690881611155b156136d55760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260786020526040902054600160401b9004811690861614613718576040516332a2a77f60e01b815260040160405180910390fd5b5f6137268787878588610f38565b90505f5f80516020614ff38339815191526002836040516137479190614a95565b602060405180830381855afa158015613762573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137859190614ab0565b61378f9190614adb565b604080516020810182528281529051634890ed4560e11b81529192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916137eb91889190600401614f54565b602060405180830381865afa158015613806573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061382a9190614f8e565b613847576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f908152607860205260409020600201548590036135625760405163a47276bd60e01b815260040160405180910390fd5b6079546001600160401b03600160401b90910481169082161115806138b557506079546001600160401b03908116908216115b156138d35760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f818152607860209081526040808320805460748054600160401b928390049098166001600160401b03199098168817905560028201548786526075909452938290209290925560798054600160401b600160801b0319169390940292909217909255600182015490516333d6247d60e01b815260048101919091529091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d906024015f604051808303815f87803b1580156139a8575f80fd5b505af11580156139ba573d5f803e3d5ffd5b50505050826001600160401b0316816001600160401b03167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e8460020154604051613a0791815260200190565b60405180910390a3505050565b6040516001600160a01b0380851660248301528316604482015260648101829052613a7f9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613ec7565b50505050565b6079546001600160401b03600160401b8204811691161115611f4e576079545f90613ac190600160401b90046001600160401b03166001614b3a565b9050613acc81611324565b156114be576079545f90600290613aed9084906001600160401b0316614cb9565b613af79190614fad565b613b019083614b3a565b9050613b0c81611324565b15613b1a576125aa81613882565b6125aa82613882565b5f613b2c6125ae565b9050815f80613b3b8484614cb9565b606f546001600160401b0391821692505f91613b5d9161010090041642614cd9565b90505b846001600160401b0316846001600160401b031614613bdd576001600160401b038085165f9081526072602052604090206001810154909116821015613bbc576001810154600160401b90046001600160401b03169450613bd7565b613bc68686614cb9565b6001600160401b0316935050613bdd565b50613b60565b5f613be88484614cd9565b905083811015613c3f57808403600c8111613c035780613c06565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281613c3557613c35614ac7565b0460705550613cae565b838103600c8111613c505780613c53565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a76400000281613c8957613c89614ac7565b04905080607054670de0b6b3a76400000281613ca757613ca7614ac7565b0460705550505b683635c9adc5dea000006070541115613cd357683635c9adc5dea000006070556122b9565b633b9aca0060705410156122b957633b9aca0060705550505050505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613d9b575f80fd5b505af1158015613dad573d5f803e3d5ffd5b50505050611f4e613f98565b6001600160a01b03163b151590565b5f54610100900460ff16613e325760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610a30565b611f4e33613cf2565b606f5460ff16613e5e57604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b6040516001600160a01b038316602482015260448101829052613ec290849063a9059cbb60e01b90606401613a48565b505050565b5f613f1b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613ff39092919063ffffffff16565b805190915015613ec25780806020019051810190613f399190614f8e565b613ec25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a30565b606f5460ff1615613fbc57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b606061400184845f85614009565b949350505050565b60608247101561406a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610a30565b5f80866001600160a01b031685876040516140859190614a95565b5f6040518083038185875af1925050503d805f81146140bf576040519150601f19603f3d011682016040523d82523d5f602084013e6140c4565b606091505b50915091506140d5878383876140e0565b979650505050505050565b6060831561414c5782515f03614145576140f985613db9565b6141455760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a30565b5081614001565b61400183838151156141615781518083602001fd5b8060405162461bcd60e51b8152600401610a309190614243565b6001600160401b0391909116815260200190565b80356001600160401b0381168114612591575f80fd5b5f805f805f60a086880312156141b9575f80fd5b6141c28661418f565b94506141d06020870161418f565b93506141de6040870161418f565b94979396509394606081013594506080013592915050565b5f5b838110156142105781810151838201526020016141f8565b50505f910152565b5f815180845261422f8160208601602086016141f6565b601f01601f19169290920160200192915050565b602081525f6142556020830184614218565b9392505050565b806040810183101561426c575f80fd5b92915050565b5f805f805f805f806101a0898b03121561428a575f80fd5b6142938961418f565b97506142a160208a0161418f565b96506142af60408a0161418f565b955060608901359450608089013593506142cc8a60a08b0161425c565b925061016089018a8111156142df575f80fd5b60e08a0192506142ef8b8261425c565b9150509295985092959890939650565b5f6020828403121561430f575f80fd5b813561ffff81168114614255575f80fd5b5f805f805f60a08688031215614334575f80fd5b61433d8661418f565b945061434b6020870161418f565b94979496505050506040830135926060810135926080909101359150565b6001600160a01b0391909116815260200190565b80610300810183101561426c575f80fd5b5f805f805f806103a087890312156143a4575f80fd5b6143ad8761418f565b95506143bb6020880161418f565b94506143c96040880161418f565b935060608701359250608087013591506143e68860a0890161437d565b90509295509295509295565b5f805f805f805f6103c0888a031215614409575f80fd5b6144128861418f565b96506144206020890161418f565b955061442e6040890161418f565b945061443c6060890161418f565b93506080880135925060a088013591506144598960c08a0161437d565b905092959891949750929550565b5f60208284031215614477575f80fd5b6142558261418f565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126144a3575f80fd5b81356001600160401b03808211156144bd576144bd614480565b604051601f8301601f19908116603f011681019082821181831017156144e5576144e5614480565b816040528381528660208588010111156144fd575f80fd5b836020870160208301375f602085830101528094505050505092915050565b80356001600160a01b0381168114612591575f80fd5b5f805f805f60a08688031215614546575f80fd5b8535945060208601356001600160401b03811115614562575f80fd5b61456e88828901614494565b945050604086013592506145846060870161418f565b91506145926080870161451c565b90509295509295909350565b5f8083601f8401126145ae575f80fd5b5081356001600160401b038111156145c4575f80fd5b6020830191508360208260051b85010111156145de575f80fd5b9250929050565b5f805f604084860312156145f7575f80fd5b83356001600160401b0381111561460c575f80fd5b6146188682870161459e565b909450925061462b90506020850161451c565b90509250925092565b5f60208284031215614644575f80fd5b6142558261451c565b5f6020828403121561465d575f80fd5b5035919050565b5f60208284031215614674575f80fd5b81356001600160401b03811115614689575f80fd5b61400184828501614494565b5f8083601f8401126146a5575f80fd5b5081356001600160401b038111156146bb575f80fd5b6020830191508360208285010111156145de575f80fd5b5f805f805f808688036101208112156146e9575f80fd5b60a08112156146f6575f80fd5b5086955060a0860135945060c08601356001600160401b038082111561471a575f80fd5b6147268a838b01614494565b955060e089013591508082111561473b575f80fd5b6147478a838b01614494565b945061010089013591508082111561475d575f80fd5b5061476a89828a01614695565b979a9699509497509295939492505050565b5f806020838503121561478d575f80fd5b82356001600160401b038111156147a2575f80fd5b6147ae8582860161459e565b90969095509350505050565b5f805f80608085870312156147cd575f80fd5b6147d68561418f565b9350602085013592506147eb6040860161418f565b91506147f96060860161418f565b905092959194509250565b5f805f60408486031215614816575f80fd5b83356001600160401b0381111561482b575f80fd5b61483786828701614695565b909790965060209590950135949350505050565b5f806040838503121561485c575f80fd5b8235915061486c6020840161418f565b90509250929050565b60208082526058908201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60408201527f64696e6753746174654e756d206d757374206265206c657373206f7220657175606082015277616c207468616e206c61737450656e64696e67537461746560401b608082015260a00190565b6020808252604c908201525f80516020614fd383398151915260408201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760608201526b040e6e8c2e8ca40c4c2e8c6d60a31b608082015260a00190565b60208082526043908201525f80516020614fd383398151915260408201527f744e756d426174636820737461746520726f6f7420646f6573206e6f742065786060820152621a5cdd60ea1b608082015260a00190565b6020808252605d908201525f80516020614fd383398151915260408201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060608201527f7468616e2063757272656e744c61737456657269666965644261746368000000608082015260a00190565b60208082526057908201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60408201527f616c4e65774261746368206d75737420626520626967676572207468616e20636060820152760eae4e4cadce898c2e6e8accae4d2ccd2cac884c2e8c6d604b1b608082015260a00190565b5f8251614aa68184602087016141f6565b9190910192915050565b5f60208284031215614ac0575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82614ae957614ae9614ac7565b500690565b600181811c90821680614b0257607f821691505b602082108103614b2057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03818116838216019080821115614b5a57614b5a614b26565b5092915050565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112614aa6575f80fd5b5f60808236031215614bd8575f80fd5b604051608081016001600160401b038082118383101715614bfb57614bfb614480565b816040528435915080821115614c0f575f80fd5b50614c1c36828601614494565b82525060208301356020820152614c356040840161418f565b6040820152614c466060840161418f565b606082015292915050565b5f6001600160401b038281166002600160401b03198101614c7457614c74614b26565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b5f60018201614cb257614cb2614b26565b5060010190565b6001600160401b03828116828216039080821115614b5a57614b5a614b26565b8181038181111561426c5761426c614b26565b808202811582820484141761426c5761426c614b26565b5f82614d1157614d11614ac7565b500490565b601f821115613ec2575f81815260208120601f850160051c81016020861015614d3c5750805b601f850160051c820191505b81811015614d5b57828155600101614d48565b505050505050565b81516001600160401b03811115614d7c57614d7c614480565b614d9081614d8a8454614aee565b84614d16565b602080601f831160018114614dc3575f8415614dac5750858301515b5f19600386901b1c1916600185901b178555614d5b565b5f85815260208120601f198616915b82811015614df157888601518255948401946001909101908401614dd2565b5085821015614e0e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160401b038581168252841660208201526060604082018190525f90614e729083018486614e1e565b9695505050505050565b8082018082111561426c5761426c614b26565b5f8235605e19833603018112614aa6575f80fd5b5f60608236031215614eb3575f80fd5b604051606081016001600160401b038082118383101715614ed657614ed6614480565b816040528435915080821115614eea575f80fd5b50614ef736828601614494565b82525060208301356020820152614f106040840161418f565b604082015292915050565b818382375f9101908152919050565b8481526001600160a01b03841660208201526060604082018190525f90614e729083018486614e1e565b6103208101610300808584378201835f5b6001811015614f84578151835260209283019290910190600101614f65565b5050509392505050565b5f60208284031215614f9e575f80fd5b81518015158114614255575f80fd5b5f6001600160401b0383811680614fc657614fc6614ac7565b9216919091049291505056fe506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6930644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001cb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fef94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931a2646970667358221220e9d0794f194ac421b9dc493895a874be8a13d701d1033aaa31a3f4a7f895a91464736f6c63430008140033", + "bytecode": "0x6101406040523480156200001257600080fd5b50604051620053ba380380620053ba8339810160408190526200003591620000a5565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b0391821661010052166101205262000131565b6001600160a01b03811681146200008557600080fd5b50565b80516001600160401b0381168114620000a057600080fd5b919050565b60008060008060008060c08789031215620000bf57600080fd5b8651620000cc816200006f565b6020880151909650620000df816200006f565b6040880151909550620000f2816200006f565b606088015190945062000105816200006f565b9250620001156080880162000088565b91506200012560a0880162000088565b90509295509295509295565b60805160a05160c05160e05161010051610120516151b462000206600039600081816105f50152818161105301526129cc015260008181610755015261102901526000818161071b01528181611b1501528181612e060152613de20152600081816108b301528181610dfe015281816111510152818161128d0152818161184f01528181611db201528181612fc901526139ee01526000818161094f015281816134f6015261384001526000818161081701528181611ae30152818161217901528181612f9d01526135bd01526151b46000f3fe608060405234801561001057600080fd5b506004361061033d5760003560e01c80638c3d7301116101bb5780638c3d73011461069f5780638da5cb5b146106a757806396dc3d39146106af57806399f5634e146106c25780639aa972a3146106ca5780639b796760146106dd5780639c9f3dfe146106f0578063a066215c14610703578063a3c573eb14610716578063ada8f9191461073d578063adc879e914610750578063afd23cbe14610777578063b4d63f581461079f578063b4f77ea9146107ff578063b6b0b09714610812578063ba58ae3914610839578063c0cad3021461084c578063c0ed84e01461085f578063c754c7ed14610867578063c89e42df14610881578063cfa8ed4714610894578063d02103ca146108ae578063d2e129f9146108d5578063d8d1091b146108e8578063d939b315146108fb578063dbc1697614610915578063e0d174411461091d578063e7a7ed0214610930578063e8bf92ed1461094a578063eaeb077b14610971578063ed6b010414610984578063f14916d614610998578063f2fde38b146109ab578063f851a440146109be578063f8b823e4146109d1578063fe16564f146109da57600080fd5b80630a0d9fbe146103425780630eaa86ea14610370578063107bf28c1461039157806310a01a72146103a657806315064c96146103bb5780631816b7e5146103d857806319d8ac61146103eb578063220d7899146103fe578063267822471461041157806329878983146104315780632b0006fa1461044b5780632c1f816a1461045e578063383b3be814610471578063394218e914610484578063423fa8561461049757806345605267146104b1578063458c0477146104cb5780634a1a89a7146104de5780634a910e6a146104f85780634e4877061461050b5780635392c5e01461051e578063542028d51461053e578063574f649e146105465780635e9145c9146105595780635ec919581461056c5780636046916914610574578063621dd4111461057c5780636b8616ce1461058f5780636ff512cc146105af578063715018a6146105c25780637215541a146105ca5780637fcb3653146105dd578063831c7ead146105f0578063837a473814610617578063841b24d714610685575b600080fd5b606f5461035a9061010090046001600160401b031681565b6040516103679190614227565b60405180910390f35b61038361037e366004614252565b6109ed565b604051908152602001610367565b610399610bbc565b60405161036791906142f7565b6103b96103b4366004614328565b610c4a565b005b606f546103c89060ff1681565b6040519015158152602001610367565b6103b96103e63660046143bb565b610e9d565b60735461035a906001600160401b031681565b61039961040c3660046143df565b610f56565b607b54610424906001600160a01b031681565b604051610367919061442c565b60745461042490600160401b90046001600160a01b031681565b6103b9610459366004614452565b6110b1565b6103b961046c3660046144ba565b6111ec565b6103c861047f366004614534565b611350565b6103b9610492366004614534565b611397565b60735461035a90600160401b90046001600160401b031681565b60735461035a90600160801b90046001600160401b031681565b60795461035a906001600160401b031681565b60795461035a90600160401b90046001600160401b031681565b6103b9610506366004614534565b61147f565b6103b9610519366004614534565b6114ee565b61038361052c366004614534565b60756020526000908152604090205481565b6103996115da565b610383610554366004614608565b6115e7565b6103b96105673660046146c4565b61162a565b6103b9611bc6565b610383611c53565b6103b961058a366004614452565b611c69565b61038361059d366004614534565b60716020526000908152604090205481565b6103b96105bd366004614717565b611f09565b6103b9611f88565b6103b96105d8366004614534565b611f9c565b60745461035a906001600160401b031681565b61035a7f000000000000000000000000000000000000000000000000000000000000000081565b61065a610625366004614732565b6078602052600090815260409020805460018201546002909201546001600160401b0380831693600160401b90930416919084565b604080516001600160401b039586168152949093166020850152918301526060820152608001610367565b60795461035a90600160c01b90046001600160401b031681565b6103b96120b7565b61042461213b565b6103b96106bd366004614534565b61214a565b610383612174565b6103b96106d83660046144ba565b612281565b6103b96106eb366004614534565b612318565b6103b96106fe366004614534565b61234c565b6103b9610711366004614534565b612438565b6104247f000000000000000000000000000000000000000000000000000000000000000081565b6103b961074b366004614717565b6124e0565b61035a7f000000000000000000000000000000000000000000000000000000000000000081565b606f5461078c90600160481b900461ffff1681565b60405161ffff9091168152602001610367565b6107da6107ad366004614534565b607260205260009081526040902080546001909101546001600160401b0380821691600160401b90041683565b604080519384526001600160401b039283166020850152911690820152606001610367565b6103b961080d366004614534565b612556565b6104247f000000000000000000000000000000000000000000000000000000000000000081565b6103c8610847366004614732565b612567565b6103b961085a36600461474b565b6125ee565b61035a612606565b607b5461035a90600160a01b90046001600160401b031681565b6103b961088f36600461474b565b612653565b606f5461042490600160581b90046001600160a01b031681565b6104247f000000000000000000000000000000000000000000000000000000000000000081565b6103b96108e33660046147c0565b6126ba565b6103b96108f6366004614872565b612a53565b60795461035a90600160801b90046001600160401b031681565b6103b9612dd9565b6103b961092b3660046148b3565b612e7f565b60735461035a90600160c01b90046001600160401b031681565b6104247f000000000000000000000000000000000000000000000000000000000000000081565b6103b961097f366004614900565b612ef1565b607b546103c890600160e01b900460ff1681565b6103b96109a6366004614717565b61319f565b6103b96109b9366004614717565b61321e565b607a54610424906001600160a01b031681565b61038360705481565b6103b96109e836600461494b565b613294565b60008060006109fa612606565b90506001600160401b03881615610a97576079546001600160401b039081169089161115610a435760405162461bcd60e51b8152600401610a3a90614977565b60405180910390fd5b6001600160401b038089166000908152607860205260409020600281015481549094509091898116600160401b9092041614610a915760405162461bcd60e51b8152600401610a3a906149f5565b50610b01565b6001600160401b038716600090815260756020526040902054915081610acf5760405162461bcd60e51b8152600401610a3a90614a55565b806001600160401b0316876001600160401b03161115610b015760405162461bcd60e51b8152600401610a3a90614aac565b806001600160401b0316866001600160401b031611610b325760405162461bcd60e51b8152600401610a3a90614b1d565b6000610b418888888689610f56565b9050600060008051602061511f833981519152600283604051610b649190614b9a565b602060405180830381855afa158015610b81573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610ba49190614bb6565b610bae9190614be5565b9a9950505050505050505050565b60778054610bc990614bf9565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf590614bf9565b8015610c425780601f10610c1757610100808354040283529160200191610c42565b820191906000526020600020905b815481529060010190602001808311610c2557829003601f168201915b505050505081565b610c526132b6565b600080610c5d612606565b90506001600160401b038a1615610cf1576079546001600160401b03908116908b161115610c9d5760405162461bcd60e51b8152600401610a3a90614977565b6001600160401b03808b1660009081526078602052604090206002810154815490945090918b8116600160401b9092041614610ceb5760405162461bcd60e51b8152600401610a3a906149f5565b50610d5b565b6001600160401b038916600090815260756020526040902054915081610d295760405162461bcd60e51b8152600401610a3a90614a55565b806001600160401b0316896001600160401b03161115610d5b5760405162461bcd60e51b8152600401610a3a90614aac565b806001600160401b0316886001600160401b031611610d8c5760405162461bcd60e51b8152600401610a3a90614b1d565b6000610d9b8a8a8a868b610f56565b607480546001600160401b0319166001600160401b038c811691821790925560009081526075602052604090208990556079549192501615610de857607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018990527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b158015610e4a57600080fd5b505af1158015610e5e573d6000803e3d6000fd5b50506040518981523392506001600160401b038c16915060008051602061513f8339815191529060200160405180910390a35050505050505050505050565b607a546001600160a01b03163314610ec857604051634755657960e01b815260040160405180910390fd5b6103e88161ffff161080610ee157506103ff8161ffff16115b15610eff57604051630984a67960e31b815260040160405180910390fd5b606f805461ffff60481b1916600160481b61ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b6001600160401b038086166000818152607260205260408082205493881682529020546060929115801590610f89575081155b15610fa75760405163340c614f60e11b815260040160405180910390fd5b80610fc5576040516366385b5160e01b815260040160405180910390fd5b610fce84612567565b610feb576040516305dae44f60e21b815260040160405180910390fd5b604080516001600160601b03193360601b166020820152603481019690965260548601929092526001600160c01b031960c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b607454600160401b90046001600160a01b031633146110e35760405163bbcbbc0560e01b815260040160405180910390fd5b6110f1868686868686613315565b607480546001600160401b0319166001600160401b038681169182179092556000908152607560205260409020839055607954161561113b57607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b15801561119d57600080fd5b505af11580156111b1573d6000803e3d6000fd5b50506040518481523392506001600160401b038716915060008051602061513f833981519152906020015b60405180910390a3505050505050565b607454600160401b90046001600160a01b0316331461121e5760405163bbcbbc0560e01b815260040160405180910390fd5b61122d878787878787876135f0565b607480546001600160401b0319166001600160401b038681169182179092556000908152607560205260409020839055607954161561127757607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b1580156112d957600080fd5b505af11580156112ed573d6000803e3d6000fd5b5050607980546001600160c01b031661127560c71b179055505060405182815233906001600160401b038616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b6079546001600160401b038281166000908152607860205260408120549092429261138692600160801b90920481169116614c49565b6001600160401b0316111592915050565b607a546001600160a01b031633146113c257604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b03821611156113ef57604051631d06e87960e01b815260040160405180910390fd5b606f5460ff1661142f576079546001600160401b03600160c01b90910481169082161061142f5760405163401636df60e01b815260040160405180910390fd5b607980546001600160c01b0316600160c01b6001600160401b038416021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190610f4b908390614227565b607454600160401b90046001600160a01b031633146114e257606f5460ff16156114bc57604051630bc011ff60e21b815260040160405180910390fd5b6114c581611350565b6114e257604051630674f25160e11b815260040160405180910390fd5b6114eb81613910565b50565b607a546001600160a01b0316331461151957604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b03821611156115465760405163f5e37f2f60e01b815260040160405180910390fd5b606f5460ff1661158657607b546001600160401b03600160a01b9091048116908216106115865760405163f5e37f2f60e01b815260040160405180910390fd5b607b8054600160a01b600160e01b031916600160a01b6001600160401b038416021790556040517fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90610f4b908390614227565b60768054610bc990614bf9565b6000858580519060200120858585604051602001611609959493929190614c70565b60405160208183030381529060405280519060200120905095945050505050565b606f5460ff161561164e57604051630bc011ff60e21b815260040160405180910390fd5b606f54600160581b90046001600160a01b03163314611680576040516311e7be1560e01b815260040160405180910390fd5b8160008190036116a35760405163cb591a5f60e01b815260040160405180910390fd5b6103e88111156116c657604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160401b82048116600081815260726020526040812054838516949293600160801b909304909216919082905b868110156119ad5760008a8a8381811061171b5761171b614caf565b905060200281019061172d9190614cc5565b61173690614cdb565b805180516020909101206060820151919250906001600160401b031615611825578561176181614d67565b9650506000818360200151846060015160405160200161178393929190614d95565b60408051601f1981840301815291815281516020928301206001600160401b038a166000908152607190935291205490915081146117d45760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b03808816600090815260716020526040808220919091556060850151908501519082169116101561181f57604051633fbd5c3960e11b815260040160405180910390fd5b5061190a565b6020820151158015906118c6575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303816000875af11580156118a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c49190614bb6565b155b156118e4576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c0101561190a576040516328a69b1f60e21b815260040160405180910390fd5b876001600160401b031682604001516001600160401b0316108061193a57504282604001516001600160401b0316115b15611958576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518d604051602001611979959493929190614c70565b60405160208183030381529060405280519060200120945081604001519750505080806119a590614db8565b9150506116ff565b506119b88685614c49565b6073549094506001600160401b03600160c01b909104811690841611156119f25760405163c630a00d60e01b815260040160405180910390fd5b60006119fe8285614dd1565b611a11906001600160401b031688614df1565b60408051606081018252858152426001600160401b03908116602080840191825260738054600160401b9081900485168688019081528d861660008181526072909552979093209551865592516001909501805492519585166001600160801b03199384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611ac65760738054600160801b600160c01b031916600160801b6001600160401b038716021790555b611b0b333083607054611ad99190614e04565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613aa8565b611b13613b19565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611b6e57600080fd5b505af1158015611b82573d6000803e3d6000fd5b50506040516001600160401b03881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a250505050505050505050565b607a546001600160a01b03163314611bf157604051634755657960e01b815260040160405180910390fd5b607b54600160e01b900460ff16611c1b5760405163f6ba91a160e01b815260040160405180910390fd5b607b805460ff60e01b191690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60006070546064611c649190614e04565b905090565b606f5460ff1615611c8d57604051630bc011ff60e21b815260040160405180910390fd5b6079546001600160401b038581166000908152607260205260409020600101544292611cc492600160c01b90910481169116614c49565b6001600160401b03161115611cec57604051638a0704d360e01b815260040160405180910390fd5b6103e8611cf98686614dd1565b6001600160401b03161115611d2157604051635acfba9d60e11b815260040160405180910390fd5b611d2f868686868686613315565b611d3884613bb9565b607954600160801b90046001600160401b0316600003611e1b57607480546001600160401b0319166001600160401b0386811691821790925560009081526075602052604090208390556079541615611d9c57607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b158015611dfe57600080fd5b505af1158015611e12573d6000803e3d6000fd5b50505050611ecc565b611e23613b19565b607980546001600160401b0316906000611e3c83614d67565b82546001600160401b039182166101009390930a928302928202191691909117909155604080516080810182524283168152878316602080830191825282840189815260608401898152607954871660009081526078909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b60405182815233906001600160401b038616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966906020016111dc565b607a546001600160a01b03163314611f3457604051634755657960e01b815260040160405180910390fd5b606f8054600160581b600160f81b031916600160581b6001600160a01b038416021790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610f4b90839061442c565b611f906132b6565b611f9a6000613d8e565b565b611fa461213b565b6001600160a01b0316336001600160a01b0316146120af576000611fc6612606565b9050806001600160401b0316826001600160401b031611611ffa5760405163812a372d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b9091048116908316118061203957506001600160401b0380831660009081526072602052604090206001015416155b1561205757604051632631700560e21b815260040160405180910390fd5b6001600160401b0380831660009081526072602052604090206001015442916120859162093a809116614c49565b6001600160401b031611156120ad5760405163692baaad60e11b815260040160405180910390fd5b505b6114eb613de0565b607b546001600160a01b031633146120e25760405163d1ec4b2360e01b815260040160405180910390fd5b607b54607a80546001600160a01b0319166001600160a01b0390921691821790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e916121319161442c565b60405180910390a1565b6033546001600160a01b031690565b6121526132b6565b607480546001600160401b0319166001600160401b0392909216919091179055565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016121c3919061442c565b602060405180830381865afa1580156121e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122049190614bb6565b90506000612210612606565b6073546001600160401b03600160401b820481169161224091600160801b8204811691600160c01b900416614dd1565b61224a9190614c49565b6122549190614dd1565b6001600160401b03169050806000036122705760009250505090565b61227a8183614e1b565b9250505090565b606f5460ff16156122a557604051630bc011ff60e21b815260040160405180910390fd5b6122b4878787878787876135f0565b6001600160401b0384166000908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a161230f613de0565b50505050505050565b6123206132b6565b607380546001600160401b03909216600160401b02600160401b600160801b0319909216919091179055565b607a546001600160a01b0316331461237757604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b03821611156123a457604051630cc9650760e41b815260040160405180910390fd5b606f5460ff166123e4576079546001600160401b03600160801b9091048116908216106123e45760405163048a05a960e41b815260040160405180910390fd5b60798054600160801b600160c01b031916600160801b6001600160401b038416021790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590610f4b908390614227565b607a546001600160a01b0316331461246357604051634755657960e01b815260040160405180910390fd5b62015180816001600160401b0316111561249057604051631c0cfbfd60e31b815260040160405180910390fd5b606f8054610100600160481b0319166101006001600160401b038416021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890610f4b908390614227565b607a546001600160a01b0316331461250b57604051634755657960e01b815260040160405180910390fd5b607b80546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610f4b90839061442c565b61255e6132b6565b6114eb81613bb9565b600067ffffffff000000016001600160401b03831610801561259d575067ffffffff00000001604083901c6001600160401b0316105b80156125bd575067ffffffff00000001608083901c6001600160401b0316105b80156125d4575067ffffffff0000000160c083901c105b156125e157506001919050565b506000919050565b919050565b6125f66132b6565b60776126028282614e7d565b5050565b6079546000906001600160401b03161561264357506079546001600160401b03908116600090815260786020526040902054600160401b90041690565b506074546001600160401b031690565b607a546001600160a01b0316331461267e57604051634755657960e01b815260040160405180910390fd5b607661268a8282614e7d565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610f4b91906142f7565b600054610100900460ff16158080156126da5750600054600160ff909116105b806126fb57506126e930613e5b565b1580156126fb575060005460ff166001145b61275e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610a3a565b6000805460ff191660011790558015612781576000805461ff0019166101001790555b61278e6020880188614717565b607a80546001600160a01b0319166001600160a01b03929092169190911790556127be6040880160208901614717565b606f80546001600160a01b0392909216600160581b02600160581b600160f81b03199092169190911790556127f96080880160608901614717565b607480546001600160a01b0392909216600160401b02600160401b600160e01b03199092169190911790556000805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad869055607661285d8682614e7d565b50607761286a8582614e7d565b5062093a8061287f6060890160408a01614534565b6001600160401b031611156128a757604051630cc9650760e41b815260040160405180910390fd5b6128b76060880160408901614534565b607980546001600160401b0392909216600160801b02600160801b600160c01b031990921691909117905562093a806128f660a0890160808a01614534565b6001600160401b0316111561291e57604051631d06e87960e01b815260040160405180910390fd5b61292e60a0880160808901614534565b607980546001600160c01b0316600160c01b6001600160401b03939093169290920291909117905567016345785d8a0000607055606f8054610100600160581b031916620708006101f560491b01179055607b8054600160a01b600160e81b031916670200000000000d2f60a71b1790556129a7613e6a565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd660007f000000000000000000000000000000000000000000000000000000000000000085856040516129fd9493929190614f65565b60405180910390a1801561230f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b54600160e01b900460ff1615612a7e576040516324eff8c360e01b815260040160405180910390fd5b606f5460ff1615612aa257604051630bc011ff60e21b815260040160405180910390fd5b806000819003612ac55760405163cb591a5f60e01b815260040160405180910390fd5b6103e8811115612ae857604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160c01b8204811691612b10918491600160801b900416614f9c565b1115612b2f5760405163c630a00d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b820481166000818152607260205260408120549193600160801b9004909216915b84811015612ce3576000878783818110612b7c57612b7c614caf565b9050602002810190612b8e9190614faf565b612b9790614fc5565b905083612ba381614d67565b82518051602091820120818501516040808701519051949950919450600093612bcf9386939101614d95565b60408051601f1981840301815291815281516020928301206001600160401b038916600090815260719093529120549091508114612c205760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b038616600090815260716020526040812055612c44600189614df1565b8403612c985742607b60149054906101000a90046001600160401b03168460400151612c709190614c49565b6001600160401b03161115612c985760405163c44a082160e01b815260040160405180910390fd5b848284602001514233604051602001612cb5959493929190614c70565b6040516020818303038152906040528051906020012094505050508080612cdb90614db8565b915050612b60565b50612cee8484614c49565b607380546001600160401b034281166001600160401b03199092168217808455604080516060810182528781526020808201958652600160401b9384900485168284019081528589166000818152607290935284832093518455965160019390930180549151871686026001600160801b031990921693871693909317179091558554938916600160801b02600160801b600160c01b031993860293909316600160401b600160c01b031990941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a546001600160a01b03163314612e0457604051634755657960e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612e5f57600080fd5b505af1158015612e73573d6000803e3d6000fd5b50505050611f9a613ede565b612e876132b6565b604080516060810182529384526001600160401b03928316602080860191825292841685830190815295841660009081526072909352912092518355516001909201805493518216600160401b026001600160801b03199094169290911691909117919091179055565b607b54600160e01b900460ff1615612f1c576040516324eff8c360e01b815260040160405180910390fd5b606f5460ff1615612f4057604051630bc011ff60e21b815260040160405180910390fd5b6000612f4a611c53565b905081811115612f6d57604051634732fdb560e01b815260040160405180910390fd5b611388831115612f90576040516328a69b1f60e21b815260040160405180910390fd5b612fc56001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084613aa8565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613025573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130499190614bb6565b60738054919250600160c01b9091046001600160401b031690601861306d83614d67565b91906101000a8154816001600160401b0302191690836001600160401b031602179055505084846040516130a2929190615040565b6040519081900381206130bb9183904290602001614d95565b60408051808303601f190181529181528151602092830120607354600160c01b90046001600160401b03166000908152607190935291205532330361314d57607354604080518381523360208201526060918101829052600091810191909152600160c01b9091046001600160401b03169060008051602061515f8339815191529060800160405180910390a2613198565b607360189054906101000a90046001600160401b03166001600160401b031660008051602061515f8339815191528233888860405161318f9493929190615050565b60405180910390a25b5050505050565b607a546001600160a01b031633146131ca57604051634755657960e01b815260040160405180910390fd5b60748054600160401b600160e01b031916600160401b6001600160a01b038416021790556040517f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90610f4b90839061442c565b6132266132b6565b6001600160a01b03811661328b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a3a565b6114eb81613d8e565b61329c6132b6565b6001600160401b0316600090815260756020526040902055565b336132bf61213b565b6001600160a01b031614611f9a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a3a565b600080613320612606565b90506001600160401b038816156133b6576079546001600160401b0390811690891611156133615760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b038089166000908152607860205260409020600281015481549094509091898116600160401b90920416146133b057604051632bd2e3e760e01b815260040160405180910390fd5b50613422565b6001600160401b0387166000908152607560205260409020549150816133ef576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316876001600160401b0316111561342257604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316866001600160401b0316116134545760405163b9b18f5760e01b815260040160405180910390fd5b60006134638888888689610f56565b9050600060008051602061511f8339815191526002836040516134869190614b9a565b602060405180830381855afa1580156134a3573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906134c69190614bb6565b6134d09190614be5565b604080516020810182528281529051634890ed4560e11b81529192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161352c9189919060040161507b565b602060405180830381865afa158015613549573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061356d91906150b6565b61358a576040516309bde33960e01b815260040160405180910390fd5b6135e433613598858b614dd1565b6001600160401b03166135a9612174565b6135b39190614e04565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190613f36565b50505050505050505050565b60006001600160401b03881615613684576079546001600160401b0390811690891611156136315760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088166000908152607860205260409020600281015481549092888116600160401b909204161461367e57604051632bd2e3e760e01b815260040160405180910390fd5b506136ec565b506001600160401b038516600090815260756020526040902054806136bc576040516324cbdcc360e11b815260040160405180910390fd5b6074546001600160401b0390811690871611156136ec57604051630f2b74f160e11b815260040160405180910390fd5b6079546001600160401b03908116908816118061371b5750876001600160401b0316876001600160401b031611155b8061373c57506079546001600160401b03600160401b909104811690881611155b1561375a5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260786020526040902054600160401b900481169086161461379e576040516332a2a77f60e01b815260040160405180910390fd5b60006137ad8787878588610f56565b9050600060008051602061511f8339815191526002836040516137d09190614b9a565b602060405180830381855afa1580156137ed573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906138109190614bb6565b61381a9190614be5565b604080516020810182528281529051634890ed4560e11b81529192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916138769188919060040161507b565b602060405180830381865afa158015613893573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138b791906150b6565b6138d4576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389166000908152607860205260409020600201548590036135e45760405163a47276bd60e01b815260040160405180910390fd5b6079546001600160401b03600160401b909104811690821611158061394357506079546001600160401b03908116908216115b156139615760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181166000818152607860209081526040808320805460748054600160401b928390049098166001600160401b03199098168817905560028201548786526075909452938290209290925560798054600160401b600160801b0319169390940292909217909255600182015490516333d6247d60e01b815260048101919091529091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b158015613a3a57600080fd5b505af1158015613a4e573d6000803e3d6000fd5b50505050826001600160401b0316816001600160401b03167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e8460020154604051613a9b91815260200190565b60405180910390a3505050565b6040516001600160a01b0380851660248301528316604482015260648101829052613b139085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613f6b565b50505050565b6079546001600160401b03600160401b8204811691161115611f9a57607954600090613b5690600160401b90046001600160401b03166001614c49565b9050613b6181611350565b156114eb57607954600090600290613b839084906001600160401b0316614dd1565b613b8d91906150d8565b613b979083614c49565b9050613ba281611350565b15613bb05761260281613910565b61260282613910565b6000613bc3612606565b905081600080613bd38484614dd1565b606f546001600160401b039182169250600091613bf69161010090041642614df1565b90505b846001600160401b0316846001600160401b031614613c77576001600160401b0380851660009081526072602052604090206001810154909116821015613c56576001810154600160401b90046001600160401b03169450613c71565b613c608686614dd1565b6001600160401b0316935050613c77565b50613bf9565b6000613c838484614df1565b905083811015613cda57808403600c8111613c9e5780613ca1565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281613cd057613cd0614bcf565b0460705550613d4a565b838103600c8111613ceb5780613cee565b600c5b90506000816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a76400000281613d2557613d25614bcf565b04905080607054670de0b6b3a76400000281613d4357613d43614bcf565b0460705550505b683635c9adc5dea000006070541115613d6f57683635c9adc5dea0000060705561230f565b633b9aca00607054101561230f57633b9aca0060705550505050505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613e3b57600080fd5b505af1158015613e4f573d6000803e3d6000fd5b50505050611f9a61403d565b6001600160a01b03163b151590565b600054610100900460ff16613ed55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610a3a565b611f9a33613d8e565b606f5460ff16613f0157604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6040516001600160a01b038316602482015260448101829052613f6690849063a9059cbb60e01b90606401613adc565b505050565b6000613fc0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166140999092919063ffffffff16565b805190915015613f665780806020019051810190613fde91906150b6565b613f665760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a3a565b606f5460ff161561406157604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b60606140a884846000856140b0565b949350505050565b6060824710156141115760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610a3a565b600080866001600160a01b0316858760405161412d9190614b9a565b60006040518083038185875af1925050503d806000811461416a576040519150601f19603f3d011682016040523d82523d6000602084013e61416f565b606091505b50915091506141808783838761418b565b979650505050505050565b606083156141f85782516000036141f1576141a585613e5b565b6141f15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a3a565b50816140a8565b6140a8838381511561420d5781518083602001fd5b8060405162461bcd60e51b8152600401610a3a91906142f7565b6001600160401b0391909116815260200190565b80356001600160401b03811681146125e957600080fd5b600080600080600060a0868803121561426a57600080fd5b6142738661423b565b94506142816020870161423b565b935061428f6040870161423b565b94979396509394606081013594506080013592915050565b60005b838110156142c25781810151838201526020016142aa565b50506000910152565b600081518084526142e38160208601602086016142a7565b601f01601f19169290920160200192915050565b60208152600061430a60208301846142cb565b9392505050565b806040810183101561432257600080fd5b92915050565b6000806000806000806000806101a0898b03121561434557600080fd5b61434e8961423b565b975061435c60208a0161423b565b965061436a60408a0161423b565b955060608901359450608089013593506143878a60a08b01614311565b925061016089018a81111561439b57600080fd5b60e08a0192506143ab8b82614311565b9150509295985092959890939650565b6000602082840312156143cd57600080fd5b813561ffff8116811461430a57600080fd5b600080600080600060a086880312156143f757600080fd5b6144008661423b565b945061440e6020870161423b565b94979496505050506040830135926060810135926080909101359150565b6001600160a01b0391909116815260200190565b80610300810183101561432257600080fd5b6000806000806000806103a0878903121561446c57600080fd5b6144758761423b565b95506144836020880161423b565b94506144916040880161423b565b935060608701359250608087013591506144ae8860a08901614440565b90509295509295509295565b60008060008060008060006103c0888a0312156144d657600080fd5b6144df8861423b565b96506144ed6020890161423b565b95506144fb6040890161423b565b94506145096060890161423b565b93506080880135925060a088013591506145268960c08a01614440565b905092959891949750929550565b60006020828403121561454657600080fd5b61430a8261423b565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261457657600080fd5b81356001600160401b03808211156145905761459061454f565b604051601f8301601f19908116603f011681019082821181831017156145b8576145b861454f565b816040528381528660208588010111156145d157600080fd5b836020870160208301376000602085830101528094505050505092915050565b80356001600160a01b03811681146125e957600080fd5b600080600080600060a0868803121561462057600080fd5b8535945060208601356001600160401b0381111561463d57600080fd5b61464988828901614565565b9450506040860135925061465f6060870161423b565b915061466d608087016145f1565b90509295509295909350565b60008083601f84011261468b57600080fd5b5081356001600160401b038111156146a257600080fd5b6020830191508360208260051b85010111156146bd57600080fd5b9250929050565b6000806000604084860312156146d957600080fd5b83356001600160401b038111156146ef57600080fd5b6146fb86828701614679565b909450925061470e9050602085016145f1565b90509250925092565b60006020828403121561472957600080fd5b61430a826145f1565b60006020828403121561474457600080fd5b5035919050565b60006020828403121561475d57600080fd5b81356001600160401b0381111561477357600080fd5b6140a884828501614565565b60008083601f84011261479157600080fd5b5081356001600160401b038111156147a857600080fd5b6020830191508360208285010111156146bd57600080fd5b6000806000806000808688036101208112156147db57600080fd5b60a08112156147e957600080fd5b5086955060a0860135945060c08601356001600160401b038082111561480e57600080fd5b61481a8a838b01614565565b955060e089013591508082111561483057600080fd5b61483c8a838b01614565565b945061010089013591508082111561485357600080fd5b5061486089828a0161477f565b979a9699509497509295939492505050565b6000806020838503121561488557600080fd5b82356001600160401b0381111561489b57600080fd5b6148a785828601614679565b90969095509350505050565b600080600080608085870312156148c957600080fd5b6148d28561423b565b9350602085013592506148e76040860161423b565b91506148f56060860161423b565b905092959194509250565b60008060006040848603121561491557600080fd5b83356001600160401b0381111561492b57600080fd5b6149378682870161477f565b909790965060209590950135949350505050565b6000806040838503121561495e57600080fd5b8235915061496e6020840161423b565b90509250929050565b60208082526058908201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60408201527f64696e6753746174654e756d206d757374206265206c657373206f7220657175606082015277616c207468616e206c61737450656e64696e67537461746560401b608082015260a00190565b6020808252604c908201526000805160206150ff83398151915260408201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760608201526b040e6e8c2e8ca40c4c2e8c6d60a31b608082015260a00190565b60208082526043908201526000805160206150ff83398151915260408201527f744e756d426174636820737461746520726f6f7420646f6573206e6f742065786060820152621a5cdd60ea1b608082015260a00190565b6020808252605d908201526000805160206150ff83398151915260408201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060608201527f7468616e2063757272656e744c61737456657269666965644261746368000000608082015260a00190565b60208082526057908201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60408201527f616c4e65774261746368206d75737420626520626967676572207468616e20636060820152760eae4e4cadce898c2e6e8accae4d2ccd2cac884c2e8c6d604b1b608082015260a00190565b60008251614bac8184602087016142a7565b9190910192915050565b600060208284031215614bc857600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082614bf457614bf4614bcf565b500690565b600181811c90821680614c0d57607f821691505b602082108103614c2d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03818116838216019080821115614c6957614c69614c33565b5092915050565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b634e487b7160e01b600052603260045260246000fd5b60008235607e19833603018112614bac57600080fd5b600060808236031215614ced57600080fd5b604051608081016001600160401b038082118383101715614d1057614d1061454f565b816040528435915080821115614d2557600080fd5b50614d3236828601614565565b82525060208301356020820152614d4b6040840161423b565b6040820152614d5c6060840161423b565b606082015292915050565b60006001600160401b038281166002600160401b03198101614d8b57614d8b614c33565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b600060018201614dca57614dca614c33565b5060010190565b6001600160401b03828116828216039080821115614c6957614c69614c33565b8181038181111561432257614322614c33565b808202811582820484141761432257614322614c33565b600082614e2a57614e2a614bcf565b500490565b601f821115613f6657600081815260208120601f850160051c81016020861015614e565750805b601f850160051c820191505b81811015614e7557828155600101614e62565b505050505050565b81516001600160401b03811115614e9657614e9661454f565b614eaa81614ea48454614bf9565b84614e2f565b602080601f831160018114614edf5760008415614ec75750858301515b600019600386901b1c1916600185901b178555614e75565b600085815260208120601f198616915b82811015614f0e57888601518255948401946001909101908401614eef565b5085821015614f2c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160401b03858116825284166020820152606060408201819052600090614f929083018486614f3c565b9695505050505050565b8082018082111561432257614322614c33565b60008235605e19833603018112614bac57600080fd5b600060608236031215614fd757600080fd5b604051606081016001600160401b038082118383101715614ffa57614ffa61454f565b81604052843591508082111561500f57600080fd5b5061501c36828601614565565b825250602083013560208201526150356040840161423b565b604082015292915050565b8183823760009101908152919050565b8481526001600160a01b0384166020820152606060408201819052600090614f929083018486614f3c565b61032081016103008085843782018360005b60018110156150ac57815183526020928301929091019060010161508d565b5050509392505050565b6000602082840312156150c857600080fd5b8151801515811461430a57600080fd5b60006001600160401b03838116806150f2576150f2614bcf565b9216919091049291505056fe506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6930644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001cb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fef94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931a2646970667358221220d209ad76bf8d76862efece6795ae783c6eb84d25d6fc3f86aec0769268c53a2564736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061033d5760003560e01c80638c3d7301116101bb5780638c3d73011461069f5780638da5cb5b146106a757806396dc3d39146106af57806399f5634e146106c25780639aa972a3146106ca5780639b796760146106dd5780639c9f3dfe146106f0578063a066215c14610703578063a3c573eb14610716578063ada8f9191461073d578063adc879e914610750578063afd23cbe14610777578063b4d63f581461079f578063b4f77ea9146107ff578063b6b0b09714610812578063ba58ae3914610839578063c0cad3021461084c578063c0ed84e01461085f578063c754c7ed14610867578063c89e42df14610881578063cfa8ed4714610894578063d02103ca146108ae578063d2e129f9146108d5578063d8d1091b146108e8578063d939b315146108fb578063dbc1697614610915578063e0d174411461091d578063e7a7ed0214610930578063e8bf92ed1461094a578063eaeb077b14610971578063ed6b010414610984578063f14916d614610998578063f2fde38b146109ab578063f851a440146109be578063f8b823e4146109d1578063fe16564f146109da57600080fd5b80630a0d9fbe146103425780630eaa86ea14610370578063107bf28c1461039157806310a01a72146103a657806315064c96146103bb5780631816b7e5146103d857806319d8ac61146103eb578063220d7899146103fe578063267822471461041157806329878983146104315780632b0006fa1461044b5780632c1f816a1461045e578063383b3be814610471578063394218e914610484578063423fa8561461049757806345605267146104b1578063458c0477146104cb5780634a1a89a7146104de5780634a910e6a146104f85780634e4877061461050b5780635392c5e01461051e578063542028d51461053e578063574f649e146105465780635e9145c9146105595780635ec919581461056c5780636046916914610574578063621dd4111461057c5780636b8616ce1461058f5780636ff512cc146105af578063715018a6146105c25780637215541a146105ca5780637fcb3653146105dd578063831c7ead146105f0578063837a473814610617578063841b24d714610685575b600080fd5b606f5461035a9061010090046001600160401b031681565b6040516103679190614227565b60405180910390f35b61038361037e366004614252565b6109ed565b604051908152602001610367565b610399610bbc565b60405161036791906142f7565b6103b96103b4366004614328565b610c4a565b005b606f546103c89060ff1681565b6040519015158152602001610367565b6103b96103e63660046143bb565b610e9d565b60735461035a906001600160401b031681565b61039961040c3660046143df565b610f56565b607b54610424906001600160a01b031681565b604051610367919061442c565b60745461042490600160401b90046001600160a01b031681565b6103b9610459366004614452565b6110b1565b6103b961046c3660046144ba565b6111ec565b6103c861047f366004614534565b611350565b6103b9610492366004614534565b611397565b60735461035a90600160401b90046001600160401b031681565b60735461035a90600160801b90046001600160401b031681565b60795461035a906001600160401b031681565b60795461035a90600160401b90046001600160401b031681565b6103b9610506366004614534565b61147f565b6103b9610519366004614534565b6114ee565b61038361052c366004614534565b60756020526000908152604090205481565b6103996115da565b610383610554366004614608565b6115e7565b6103b96105673660046146c4565b61162a565b6103b9611bc6565b610383611c53565b6103b961058a366004614452565b611c69565b61038361059d366004614534565b60716020526000908152604090205481565b6103b96105bd366004614717565b611f09565b6103b9611f88565b6103b96105d8366004614534565b611f9c565b60745461035a906001600160401b031681565b61035a7f000000000000000000000000000000000000000000000000000000000000000081565b61065a610625366004614732565b6078602052600090815260409020805460018201546002909201546001600160401b0380831693600160401b90930416919084565b604080516001600160401b039586168152949093166020850152918301526060820152608001610367565b60795461035a90600160c01b90046001600160401b031681565b6103b96120b7565b61042461213b565b6103b96106bd366004614534565b61214a565b610383612174565b6103b96106d83660046144ba565b612281565b6103b96106eb366004614534565b612318565b6103b96106fe366004614534565b61234c565b6103b9610711366004614534565b612438565b6104247f000000000000000000000000000000000000000000000000000000000000000081565b6103b961074b366004614717565b6124e0565b61035a7f000000000000000000000000000000000000000000000000000000000000000081565b606f5461078c90600160481b900461ffff1681565b60405161ffff9091168152602001610367565b6107da6107ad366004614534565b607260205260009081526040902080546001909101546001600160401b0380821691600160401b90041683565b604080519384526001600160401b039283166020850152911690820152606001610367565b6103b961080d366004614534565b612556565b6104247f000000000000000000000000000000000000000000000000000000000000000081565b6103c8610847366004614732565b612567565b6103b961085a36600461474b565b6125ee565b61035a612606565b607b5461035a90600160a01b90046001600160401b031681565b6103b961088f36600461474b565b612653565b606f5461042490600160581b90046001600160a01b031681565b6104247f000000000000000000000000000000000000000000000000000000000000000081565b6103b96108e33660046147c0565b6126ba565b6103b96108f6366004614872565b612a53565b60795461035a90600160801b90046001600160401b031681565b6103b9612dd9565b6103b961092b3660046148b3565b612e7f565b60735461035a90600160c01b90046001600160401b031681565b6104247f000000000000000000000000000000000000000000000000000000000000000081565b6103b961097f366004614900565b612ef1565b607b546103c890600160e01b900460ff1681565b6103b96109a6366004614717565b61319f565b6103b96109b9366004614717565b61321e565b607a54610424906001600160a01b031681565b61038360705481565b6103b96109e836600461494b565b613294565b60008060006109fa612606565b90506001600160401b03881615610a97576079546001600160401b039081169089161115610a435760405162461bcd60e51b8152600401610a3a90614977565b60405180910390fd5b6001600160401b038089166000908152607860205260409020600281015481549094509091898116600160401b9092041614610a915760405162461bcd60e51b8152600401610a3a906149f5565b50610b01565b6001600160401b038716600090815260756020526040902054915081610acf5760405162461bcd60e51b8152600401610a3a90614a55565b806001600160401b0316876001600160401b03161115610b015760405162461bcd60e51b8152600401610a3a90614aac565b806001600160401b0316866001600160401b031611610b325760405162461bcd60e51b8152600401610a3a90614b1d565b6000610b418888888689610f56565b9050600060008051602061511f833981519152600283604051610b649190614b9a565b602060405180830381855afa158015610b81573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610ba49190614bb6565b610bae9190614be5565b9a9950505050505050505050565b60778054610bc990614bf9565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf590614bf9565b8015610c425780601f10610c1757610100808354040283529160200191610c42565b820191906000526020600020905b815481529060010190602001808311610c2557829003601f168201915b505050505081565b610c526132b6565b600080610c5d612606565b90506001600160401b038a1615610cf1576079546001600160401b03908116908b161115610c9d5760405162461bcd60e51b8152600401610a3a90614977565b6001600160401b03808b1660009081526078602052604090206002810154815490945090918b8116600160401b9092041614610ceb5760405162461bcd60e51b8152600401610a3a906149f5565b50610d5b565b6001600160401b038916600090815260756020526040902054915081610d295760405162461bcd60e51b8152600401610a3a90614a55565b806001600160401b0316896001600160401b03161115610d5b5760405162461bcd60e51b8152600401610a3a90614aac565b806001600160401b0316886001600160401b031611610d8c5760405162461bcd60e51b8152600401610a3a90614b1d565b6000610d9b8a8a8a868b610f56565b607480546001600160401b0319166001600160401b038c811691821790925560009081526075602052604090208990556079549192501615610de857607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018990527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b158015610e4a57600080fd5b505af1158015610e5e573d6000803e3d6000fd5b50506040518981523392506001600160401b038c16915060008051602061513f8339815191529060200160405180910390a35050505050505050505050565b607a546001600160a01b03163314610ec857604051634755657960e01b815260040160405180910390fd5b6103e88161ffff161080610ee157506103ff8161ffff16115b15610eff57604051630984a67960e31b815260040160405180910390fd5b606f805461ffff60481b1916600160481b61ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b6001600160401b038086166000818152607260205260408082205493881682529020546060929115801590610f89575081155b15610fa75760405163340c614f60e11b815260040160405180910390fd5b80610fc5576040516366385b5160e01b815260040160405180910390fd5b610fce84612567565b610feb576040516305dae44f60e21b815260040160405180910390fd5b604080516001600160601b03193360601b166020820152603481019690965260548601929092526001600160c01b031960c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b607454600160401b90046001600160a01b031633146110e35760405163bbcbbc0560e01b815260040160405180910390fd5b6110f1868686868686613315565b607480546001600160401b0319166001600160401b038681169182179092556000908152607560205260409020839055607954161561113b57607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b15801561119d57600080fd5b505af11580156111b1573d6000803e3d6000fd5b50506040518481523392506001600160401b038716915060008051602061513f833981519152906020015b60405180910390a3505050505050565b607454600160401b90046001600160a01b0316331461121e5760405163bbcbbc0560e01b815260040160405180910390fd5b61122d878787878787876135f0565b607480546001600160401b0319166001600160401b038681169182179092556000908152607560205260409020839055607954161561127757607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b1580156112d957600080fd5b505af11580156112ed573d6000803e3d6000fd5b5050607980546001600160c01b031661127560c71b179055505060405182815233906001600160401b038616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b6079546001600160401b038281166000908152607860205260408120549092429261138692600160801b90920481169116614c49565b6001600160401b0316111592915050565b607a546001600160a01b031633146113c257604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b03821611156113ef57604051631d06e87960e01b815260040160405180910390fd5b606f5460ff1661142f576079546001600160401b03600160c01b90910481169082161061142f5760405163401636df60e01b815260040160405180910390fd5b607980546001600160c01b0316600160c01b6001600160401b038416021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190610f4b908390614227565b607454600160401b90046001600160a01b031633146114e257606f5460ff16156114bc57604051630bc011ff60e21b815260040160405180910390fd5b6114c581611350565b6114e257604051630674f25160e11b815260040160405180910390fd5b6114eb81613910565b50565b607a546001600160a01b0316331461151957604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b03821611156115465760405163f5e37f2f60e01b815260040160405180910390fd5b606f5460ff1661158657607b546001600160401b03600160a01b9091048116908216106115865760405163f5e37f2f60e01b815260040160405180910390fd5b607b8054600160a01b600160e01b031916600160a01b6001600160401b038416021790556040517fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90610f4b908390614227565b60768054610bc990614bf9565b6000858580519060200120858585604051602001611609959493929190614c70565b60405160208183030381529060405280519060200120905095945050505050565b606f5460ff161561164e57604051630bc011ff60e21b815260040160405180910390fd5b606f54600160581b90046001600160a01b03163314611680576040516311e7be1560e01b815260040160405180910390fd5b8160008190036116a35760405163cb591a5f60e01b815260040160405180910390fd5b6103e88111156116c657604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160401b82048116600081815260726020526040812054838516949293600160801b909304909216919082905b868110156119ad5760008a8a8381811061171b5761171b614caf565b905060200281019061172d9190614cc5565b61173690614cdb565b805180516020909101206060820151919250906001600160401b031615611825578561176181614d67565b9650506000818360200151846060015160405160200161178393929190614d95565b60408051601f1981840301815291815281516020928301206001600160401b038a166000908152607190935291205490915081146117d45760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b03808816600090815260716020526040808220919091556060850151908501519082169116101561181f57604051633fbd5c3960e11b815260040160405180910390fd5b5061190a565b6020820151158015906118c6575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303816000875af11580156118a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c49190614bb6565b155b156118e4576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c0101561190a576040516328a69b1f60e21b815260040160405180910390fd5b876001600160401b031682604001516001600160401b0316108061193a57504282604001516001600160401b0316115b15611958576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518d604051602001611979959493929190614c70565b60405160208183030381529060405280519060200120945081604001519750505080806119a590614db8565b9150506116ff565b506119b88685614c49565b6073549094506001600160401b03600160c01b909104811690841611156119f25760405163c630a00d60e01b815260040160405180910390fd5b60006119fe8285614dd1565b611a11906001600160401b031688614df1565b60408051606081018252858152426001600160401b03908116602080840191825260738054600160401b9081900485168688019081528d861660008181526072909552979093209551865592516001909501805492519585166001600160801b03199384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611ac65760738054600160801b600160c01b031916600160801b6001600160401b038716021790555b611b0b333083607054611ad99190614e04565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613aa8565b611b13613b19565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611b6e57600080fd5b505af1158015611b82573d6000803e3d6000fd5b50506040516001600160401b03881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a250505050505050505050565b607a546001600160a01b03163314611bf157604051634755657960e01b815260040160405180910390fd5b607b54600160e01b900460ff16611c1b5760405163f6ba91a160e01b815260040160405180910390fd5b607b805460ff60e01b191690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60006070546064611c649190614e04565b905090565b606f5460ff1615611c8d57604051630bc011ff60e21b815260040160405180910390fd5b6079546001600160401b038581166000908152607260205260409020600101544292611cc492600160c01b90910481169116614c49565b6001600160401b03161115611cec57604051638a0704d360e01b815260040160405180910390fd5b6103e8611cf98686614dd1565b6001600160401b03161115611d2157604051635acfba9d60e11b815260040160405180910390fd5b611d2f868686868686613315565b611d3884613bb9565b607954600160801b90046001600160401b0316600003611e1b57607480546001600160401b0319166001600160401b0386811691821790925560009081526075602052604090208390556079541615611d9c57607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b158015611dfe57600080fd5b505af1158015611e12573d6000803e3d6000fd5b50505050611ecc565b611e23613b19565b607980546001600160401b0316906000611e3c83614d67565b82546001600160401b039182166101009390930a928302928202191691909117909155604080516080810182524283168152878316602080830191825282840189815260608401898152607954871660009081526078909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b60405182815233906001600160401b038616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966906020016111dc565b607a546001600160a01b03163314611f3457604051634755657960e01b815260040160405180910390fd5b606f8054600160581b600160f81b031916600160581b6001600160a01b038416021790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610f4b90839061442c565b611f906132b6565b611f9a6000613d8e565b565b611fa461213b565b6001600160a01b0316336001600160a01b0316146120af576000611fc6612606565b9050806001600160401b0316826001600160401b031611611ffa5760405163812a372d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b9091048116908316118061203957506001600160401b0380831660009081526072602052604090206001015416155b1561205757604051632631700560e21b815260040160405180910390fd5b6001600160401b0380831660009081526072602052604090206001015442916120859162093a809116614c49565b6001600160401b031611156120ad5760405163692baaad60e11b815260040160405180910390fd5b505b6114eb613de0565b607b546001600160a01b031633146120e25760405163d1ec4b2360e01b815260040160405180910390fd5b607b54607a80546001600160a01b0319166001600160a01b0390921691821790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e916121319161442c565b60405180910390a1565b6033546001600160a01b031690565b6121526132b6565b607480546001600160401b0319166001600160401b0392909216919091179055565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016121c3919061442c565b602060405180830381865afa1580156121e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122049190614bb6565b90506000612210612606565b6073546001600160401b03600160401b820481169161224091600160801b8204811691600160c01b900416614dd1565b61224a9190614c49565b6122549190614dd1565b6001600160401b03169050806000036122705760009250505090565b61227a8183614e1b565b9250505090565b606f5460ff16156122a557604051630bc011ff60e21b815260040160405180910390fd5b6122b4878787878787876135f0565b6001600160401b0384166000908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a161230f613de0565b50505050505050565b6123206132b6565b607380546001600160401b03909216600160401b02600160401b600160801b0319909216919091179055565b607a546001600160a01b0316331461237757604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b03821611156123a457604051630cc9650760e41b815260040160405180910390fd5b606f5460ff166123e4576079546001600160401b03600160801b9091048116908216106123e45760405163048a05a960e41b815260040160405180910390fd5b60798054600160801b600160c01b031916600160801b6001600160401b038416021790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590610f4b908390614227565b607a546001600160a01b0316331461246357604051634755657960e01b815260040160405180910390fd5b62015180816001600160401b0316111561249057604051631c0cfbfd60e31b815260040160405180910390fd5b606f8054610100600160481b0319166101006001600160401b038416021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890610f4b908390614227565b607a546001600160a01b0316331461250b57604051634755657960e01b815260040160405180910390fd5b607b80546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610f4b90839061442c565b61255e6132b6565b6114eb81613bb9565b600067ffffffff000000016001600160401b03831610801561259d575067ffffffff00000001604083901c6001600160401b0316105b80156125bd575067ffffffff00000001608083901c6001600160401b0316105b80156125d4575067ffffffff0000000160c083901c105b156125e157506001919050565b506000919050565b919050565b6125f66132b6565b60776126028282614e7d565b5050565b6079546000906001600160401b03161561264357506079546001600160401b03908116600090815260786020526040902054600160401b90041690565b506074546001600160401b031690565b607a546001600160a01b0316331461267e57604051634755657960e01b815260040160405180910390fd5b607661268a8282614e7d565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610f4b91906142f7565b600054610100900460ff16158080156126da5750600054600160ff909116105b806126fb57506126e930613e5b565b1580156126fb575060005460ff166001145b61275e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610a3a565b6000805460ff191660011790558015612781576000805461ff0019166101001790555b61278e6020880188614717565b607a80546001600160a01b0319166001600160a01b03929092169190911790556127be6040880160208901614717565b606f80546001600160a01b0392909216600160581b02600160581b600160f81b03199092169190911790556127f96080880160608901614717565b607480546001600160a01b0392909216600160401b02600160401b600160e01b03199092169190911790556000805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad869055607661285d8682614e7d565b50607761286a8582614e7d565b5062093a8061287f6060890160408a01614534565b6001600160401b031611156128a757604051630cc9650760e41b815260040160405180910390fd5b6128b76060880160408901614534565b607980546001600160401b0392909216600160801b02600160801b600160c01b031990921691909117905562093a806128f660a0890160808a01614534565b6001600160401b0316111561291e57604051631d06e87960e01b815260040160405180910390fd5b61292e60a0880160808901614534565b607980546001600160c01b0316600160c01b6001600160401b03939093169290920291909117905567016345785d8a0000607055606f8054610100600160581b031916620708006101f560491b01179055607b8054600160a01b600160e81b031916670200000000000d2f60a71b1790556129a7613e6a565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd660007f000000000000000000000000000000000000000000000000000000000000000085856040516129fd9493929190614f65565b60405180910390a1801561230f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b54600160e01b900460ff1615612a7e576040516324eff8c360e01b815260040160405180910390fd5b606f5460ff1615612aa257604051630bc011ff60e21b815260040160405180910390fd5b806000819003612ac55760405163cb591a5f60e01b815260040160405180910390fd5b6103e8811115612ae857604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160c01b8204811691612b10918491600160801b900416614f9c565b1115612b2f5760405163c630a00d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b820481166000818152607260205260408120549193600160801b9004909216915b84811015612ce3576000878783818110612b7c57612b7c614caf565b9050602002810190612b8e9190614faf565b612b9790614fc5565b905083612ba381614d67565b82518051602091820120818501516040808701519051949950919450600093612bcf9386939101614d95565b60408051601f1981840301815291815281516020928301206001600160401b038916600090815260719093529120549091508114612c205760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b038616600090815260716020526040812055612c44600189614df1565b8403612c985742607b60149054906101000a90046001600160401b03168460400151612c709190614c49565b6001600160401b03161115612c985760405163c44a082160e01b815260040160405180910390fd5b848284602001514233604051602001612cb5959493929190614c70565b6040516020818303038152906040528051906020012094505050508080612cdb90614db8565b915050612b60565b50612cee8484614c49565b607380546001600160401b034281166001600160401b03199092168217808455604080516060810182528781526020808201958652600160401b9384900485168284019081528589166000818152607290935284832093518455965160019390930180549151871686026001600160801b031990921693871693909317179091558554938916600160801b02600160801b600160c01b031993860293909316600160401b600160c01b031990941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a546001600160a01b03163314612e0457604051634755657960e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612e5f57600080fd5b505af1158015612e73573d6000803e3d6000fd5b50505050611f9a613ede565b612e876132b6565b604080516060810182529384526001600160401b03928316602080860191825292841685830190815295841660009081526072909352912092518355516001909201805493518216600160401b026001600160801b03199094169290911691909117919091179055565b607b54600160e01b900460ff1615612f1c576040516324eff8c360e01b815260040160405180910390fd5b606f5460ff1615612f4057604051630bc011ff60e21b815260040160405180910390fd5b6000612f4a611c53565b905081811115612f6d57604051634732fdb560e01b815260040160405180910390fd5b611388831115612f90576040516328a69b1f60e21b815260040160405180910390fd5b612fc56001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084613aa8565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613025573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130499190614bb6565b60738054919250600160c01b9091046001600160401b031690601861306d83614d67565b91906101000a8154816001600160401b0302191690836001600160401b031602179055505084846040516130a2929190615040565b6040519081900381206130bb9183904290602001614d95565b60408051808303601f190181529181528151602092830120607354600160c01b90046001600160401b03166000908152607190935291205532330361314d57607354604080518381523360208201526060918101829052600091810191909152600160c01b9091046001600160401b03169060008051602061515f8339815191529060800160405180910390a2613198565b607360189054906101000a90046001600160401b03166001600160401b031660008051602061515f8339815191528233888860405161318f9493929190615050565b60405180910390a25b5050505050565b607a546001600160a01b031633146131ca57604051634755657960e01b815260040160405180910390fd5b60748054600160401b600160e01b031916600160401b6001600160a01b038416021790556040517f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90610f4b90839061442c565b6132266132b6565b6001600160a01b03811661328b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a3a565b6114eb81613d8e565b61329c6132b6565b6001600160401b0316600090815260756020526040902055565b336132bf61213b565b6001600160a01b031614611f9a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a3a565b600080613320612606565b90506001600160401b038816156133b6576079546001600160401b0390811690891611156133615760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b038089166000908152607860205260409020600281015481549094509091898116600160401b90920416146133b057604051632bd2e3e760e01b815260040160405180910390fd5b50613422565b6001600160401b0387166000908152607560205260409020549150816133ef576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316876001600160401b0316111561342257604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316866001600160401b0316116134545760405163b9b18f5760e01b815260040160405180910390fd5b60006134638888888689610f56565b9050600060008051602061511f8339815191526002836040516134869190614b9a565b602060405180830381855afa1580156134a3573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906134c69190614bb6565b6134d09190614be5565b604080516020810182528281529051634890ed4560e11b81529192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161352c9189919060040161507b565b602060405180830381865afa158015613549573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061356d91906150b6565b61358a576040516309bde33960e01b815260040160405180910390fd5b6135e433613598858b614dd1565b6001600160401b03166135a9612174565b6135b39190614e04565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190613f36565b50505050505050505050565b60006001600160401b03881615613684576079546001600160401b0390811690891611156136315760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088166000908152607860205260409020600281015481549092888116600160401b909204161461367e57604051632bd2e3e760e01b815260040160405180910390fd5b506136ec565b506001600160401b038516600090815260756020526040902054806136bc576040516324cbdcc360e11b815260040160405180910390fd5b6074546001600160401b0390811690871611156136ec57604051630f2b74f160e11b815260040160405180910390fd5b6079546001600160401b03908116908816118061371b5750876001600160401b0316876001600160401b031611155b8061373c57506079546001600160401b03600160401b909104811690881611155b1561375a5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260786020526040902054600160401b900481169086161461379e576040516332a2a77f60e01b815260040160405180910390fd5b60006137ad8787878588610f56565b9050600060008051602061511f8339815191526002836040516137d09190614b9a565b602060405180830381855afa1580156137ed573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906138109190614bb6565b61381a9190614be5565b604080516020810182528281529051634890ed4560e11b81529192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916138769188919060040161507b565b602060405180830381865afa158015613893573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138b791906150b6565b6138d4576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389166000908152607860205260409020600201548590036135e45760405163a47276bd60e01b815260040160405180910390fd5b6079546001600160401b03600160401b909104811690821611158061394357506079546001600160401b03908116908216115b156139615760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181166000818152607860209081526040808320805460748054600160401b928390049098166001600160401b03199098168817905560028201548786526075909452938290209290925560798054600160401b600160801b0319169390940292909217909255600182015490516333d6247d60e01b815260048101919091529091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b158015613a3a57600080fd5b505af1158015613a4e573d6000803e3d6000fd5b50505050826001600160401b0316816001600160401b03167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e8460020154604051613a9b91815260200190565b60405180910390a3505050565b6040516001600160a01b0380851660248301528316604482015260648101829052613b139085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613f6b565b50505050565b6079546001600160401b03600160401b8204811691161115611f9a57607954600090613b5690600160401b90046001600160401b03166001614c49565b9050613b6181611350565b156114eb57607954600090600290613b839084906001600160401b0316614dd1565b613b8d91906150d8565b613b979083614c49565b9050613ba281611350565b15613bb05761260281613910565b61260282613910565b6000613bc3612606565b905081600080613bd38484614dd1565b606f546001600160401b039182169250600091613bf69161010090041642614df1565b90505b846001600160401b0316846001600160401b031614613c77576001600160401b0380851660009081526072602052604090206001810154909116821015613c56576001810154600160401b90046001600160401b03169450613c71565b613c608686614dd1565b6001600160401b0316935050613c77565b50613bf9565b6000613c838484614df1565b905083811015613cda57808403600c8111613c9e5780613ca1565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281613cd057613cd0614bcf565b0460705550613d4a565b838103600c8111613ceb5780613cee565b600c5b90506000816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a76400000281613d2557613d25614bcf565b04905080607054670de0b6b3a76400000281613d4357613d43614bcf565b0460705550505b683635c9adc5dea000006070541115613d6f57683635c9adc5dea0000060705561230f565b633b9aca00607054101561230f57633b9aca0060705550505050505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613e3b57600080fd5b505af1158015613e4f573d6000803e3d6000fd5b50505050611f9a61403d565b6001600160a01b03163b151590565b600054610100900460ff16613ed55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610a3a565b611f9a33613d8e565b606f5460ff16613f0157604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6040516001600160a01b038316602482015260448101829052613f6690849063a9059cbb60e01b90606401613adc565b505050565b6000613fc0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166140999092919063ffffffff16565b805190915015613f665780806020019051810190613fde91906150b6565b613f665760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a3a565b606f5460ff161561406157604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b60606140a884846000856140b0565b949350505050565b6060824710156141115760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610a3a565b600080866001600160a01b0316858760405161412d9190614b9a565b60006040518083038185875af1925050503d806000811461416a576040519150601f19603f3d011682016040523d82523d6000602084013e61416f565b606091505b50915091506141808783838761418b565b979650505050505050565b606083156141f85782516000036141f1576141a585613e5b565b6141f15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a3a565b50816140a8565b6140a8838381511561420d5781518083602001fd5b8060405162461bcd60e51b8152600401610a3a91906142f7565b6001600160401b0391909116815260200190565b80356001600160401b03811681146125e957600080fd5b600080600080600060a0868803121561426a57600080fd5b6142738661423b565b94506142816020870161423b565b935061428f6040870161423b565b94979396509394606081013594506080013592915050565b60005b838110156142c25781810151838201526020016142aa565b50506000910152565b600081518084526142e38160208601602086016142a7565b601f01601f19169290920160200192915050565b60208152600061430a60208301846142cb565b9392505050565b806040810183101561432257600080fd5b92915050565b6000806000806000806000806101a0898b03121561434557600080fd5b61434e8961423b565b975061435c60208a0161423b565b965061436a60408a0161423b565b955060608901359450608089013593506143878a60a08b01614311565b925061016089018a81111561439b57600080fd5b60e08a0192506143ab8b82614311565b9150509295985092959890939650565b6000602082840312156143cd57600080fd5b813561ffff8116811461430a57600080fd5b600080600080600060a086880312156143f757600080fd5b6144008661423b565b945061440e6020870161423b565b94979496505050506040830135926060810135926080909101359150565b6001600160a01b0391909116815260200190565b80610300810183101561432257600080fd5b6000806000806000806103a0878903121561446c57600080fd5b6144758761423b565b95506144836020880161423b565b94506144916040880161423b565b935060608701359250608087013591506144ae8860a08901614440565b90509295509295509295565b60008060008060008060006103c0888a0312156144d657600080fd5b6144df8861423b565b96506144ed6020890161423b565b95506144fb6040890161423b565b94506145096060890161423b565b93506080880135925060a088013591506145268960c08a01614440565b905092959891949750929550565b60006020828403121561454657600080fd5b61430a8261423b565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261457657600080fd5b81356001600160401b03808211156145905761459061454f565b604051601f8301601f19908116603f011681019082821181831017156145b8576145b861454f565b816040528381528660208588010111156145d157600080fd5b836020870160208301376000602085830101528094505050505092915050565b80356001600160a01b03811681146125e957600080fd5b600080600080600060a0868803121561462057600080fd5b8535945060208601356001600160401b0381111561463d57600080fd5b61464988828901614565565b9450506040860135925061465f6060870161423b565b915061466d608087016145f1565b90509295509295909350565b60008083601f84011261468b57600080fd5b5081356001600160401b038111156146a257600080fd5b6020830191508360208260051b85010111156146bd57600080fd5b9250929050565b6000806000604084860312156146d957600080fd5b83356001600160401b038111156146ef57600080fd5b6146fb86828701614679565b909450925061470e9050602085016145f1565b90509250925092565b60006020828403121561472957600080fd5b61430a826145f1565b60006020828403121561474457600080fd5b5035919050565b60006020828403121561475d57600080fd5b81356001600160401b0381111561477357600080fd5b6140a884828501614565565b60008083601f84011261479157600080fd5b5081356001600160401b038111156147a857600080fd5b6020830191508360208285010111156146bd57600080fd5b6000806000806000808688036101208112156147db57600080fd5b60a08112156147e957600080fd5b5086955060a0860135945060c08601356001600160401b038082111561480e57600080fd5b61481a8a838b01614565565b955060e089013591508082111561483057600080fd5b61483c8a838b01614565565b945061010089013591508082111561485357600080fd5b5061486089828a0161477f565b979a9699509497509295939492505050565b6000806020838503121561488557600080fd5b82356001600160401b0381111561489b57600080fd5b6148a785828601614679565b90969095509350505050565b600080600080608085870312156148c957600080fd5b6148d28561423b565b9350602085013592506148e76040860161423b565b91506148f56060860161423b565b905092959194509250565b60008060006040848603121561491557600080fd5b83356001600160401b0381111561492b57600080fd5b6149378682870161477f565b909790965060209590950135949350505050565b6000806040838503121561495e57600080fd5b8235915061496e6020840161423b565b90509250929050565b60208082526058908201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60408201527f64696e6753746174654e756d206d757374206265206c657373206f7220657175606082015277616c207468616e206c61737450656e64696e67537461746560401b608082015260a00190565b6020808252604c908201526000805160206150ff83398151915260408201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760608201526b040e6e8c2e8ca40c4c2e8c6d60a31b608082015260a00190565b60208082526043908201526000805160206150ff83398151915260408201527f744e756d426174636820737461746520726f6f7420646f6573206e6f742065786060820152621a5cdd60ea1b608082015260a00190565b6020808252605d908201526000805160206150ff83398151915260408201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060608201527f7468616e2063757272656e744c61737456657269666965644261746368000000608082015260a00190565b60208082526057908201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60408201527f616c4e65774261746368206d75737420626520626967676572207468616e20636060820152760eae4e4cadce898c2e6e8accae4d2ccd2cac884c2e8c6d604b1b608082015260a00190565b60008251614bac8184602087016142a7565b9190910192915050565b600060208284031215614bc857600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082614bf457614bf4614bcf565b500690565b600181811c90821680614c0d57607f821691505b602082108103614c2d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03818116838216019080821115614c6957614c69614c33565b5092915050565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b634e487b7160e01b600052603260045260246000fd5b60008235607e19833603018112614bac57600080fd5b600060808236031215614ced57600080fd5b604051608081016001600160401b038082118383101715614d1057614d1061454f565b816040528435915080821115614d2557600080fd5b50614d3236828601614565565b82525060208301356020820152614d4b6040840161423b565b6040820152614d5c6060840161423b565b606082015292915050565b60006001600160401b038281166002600160401b03198101614d8b57614d8b614c33565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b600060018201614dca57614dca614c33565b5060010190565b6001600160401b03828116828216039080821115614c6957614c69614c33565b8181038181111561432257614322614c33565b808202811582820484141761432257614322614c33565b600082614e2a57614e2a614bcf565b500490565b601f821115613f6657600081815260208120601f850160051c81016020861015614e565750805b601f850160051c820191505b81811015614e7557828155600101614e62565b505050505050565b81516001600160401b03811115614e9657614e9661454f565b614eaa81614ea48454614bf9565b84614e2f565b602080601f831160018114614edf5760008415614ec75750858301515b600019600386901b1c1916600185901b178555614e75565b600085815260208120601f198616915b82811015614f0e57888601518255948401946001909101908401614eef565b5085821015614f2c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160401b03858116825284166020820152606060408201819052600090614f929083018486614f3c565b9695505050505050565b8082018082111561432257614322614c33565b60008235605e19833603018112614bac57600080fd5b600060608236031215614fd757600080fd5b604051606081016001600160401b038082118383101715614ffa57614ffa61454f565b81604052843591508082111561500f57600080fd5b5061501c36828601614565565b825250602083013560208201526150356040840161423b565b604082015292915050565b8183823760009101908152919050565b8481526001600160a01b0384166020820152606060408201819052600090614f929083018486614f3c565b61032081016103008085843782018360005b60018110156150ac57815183526020928301929091019060010161508d565b5050509392505050565b6000602082840312156150c857600080fd5b8151801515811461430a57600080fd5b60006001600160401b03838116806150f2576150f2614bcf565b9216919091049291505056fe506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6930644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001cb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fef94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931a2646970667358221220d209ad76bf8d76862efece6795ae783c6eb84d25d6fc3f86aec0769268c53a2564736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMTimelock.json b/compiled-contracts/paris/PolygonZkEVMTimelock.json index 11f93bd43..5c2a52c7e 100644 --- a/compiled-contracts/paris/PolygonZkEVMTimelock.json +++ b/compiled-contracts/paris/PolygonZkEVMTimelock.json @@ -892,8 +892,8 @@ "type": "receive" } ], - "bytecode": "0x60a060405234801562000010575f80fd5b50604051620022ef380380620022ef833981016040819052620000339162000412565b84848484620000515f805160206200226f8339815191528062000232565b620000795f805160206200228f8339815191525f805160206200226f83398151915262000232565b620000a15f80516020620022af8339815191525f805160206200226f83398151915262000232565b620000c95f80516020620022cf8339815191525f805160206200226f83398151915262000232565b620000e35f805160206200226f833981519152306200027c565b6001600160a01b038116156200010d576200010d5f805160206200226f833981519152826200027c565b5f5b83518110156200019057620001555f805160206200228f833981519152858381518110620001415762000141620004ad565b60200260200101516200027c60201b60201c565b6200017d5f80516020620022cf833981519152858381518110620001415762000141620004ad565b6200018881620004c1565b90506200010f565b505f5b8251811015620001d857620001c55f80516020620022af833981519152848381518110620001415762000141620004ad565b620001d081620004c1565b905062000193565b506002849055604080515f8152602081018690527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1505050506001600160a01b031660805250620004e692505050565b5f82815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6200028882826200028c565b5050565b5f828152602081815260408083206001600160a01b038516845290915290205460ff1662000288575f828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620002e63390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b634e487b7160e01b5f52604160045260245ffd5b6001600160a01b038116811462000353575f80fd5b50565b805162000363816200033e565b919050565b5f82601f83011262000378575f80fd5b815160206001600160401b03808311156200039757620003976200032a565b8260051b604051601f19603f83011681018181108482111715620003bf57620003bf6200032a565b604052938452858101830193838101925087851115620003dd575f80fd5b83870191505b848210156200040757620003f78262000356565b83529183019190830190620003e3565b979650505050505050565b5f805f805f60a0868803121562000427575f80fd5b855160208701519095506001600160401b038082111562000446575f80fd5b6200045489838a0162000368565b955060408801519150808211156200046a575f80fd5b50620004798882890162000368565b93505060608601516200048c816200033e565b60808701519092506200049f816200033e565b809150509295509295909350565b634e487b7160e01b5f52603260045260245ffd5b5f60018201620004df57634e487b7160e01b5f52601160045260245ffd5b5060010190565b608051611d626200050d5f395f818161033601528181610c4e0152610c810152611d625ff3fe608060405260043610610154575f3560e01c806301d5062a1461015f57806301ffc9a71461018057806307bd0265146101b45780630d3cf6fc146101e2578063134008d31461021557806313bc9f2014610228578063150b7a0214610247578063248a9ca31461028a5780632ab0f529146102a95780632f2ff15d146102c857806331d50750146102e757806336568abe146103065780633a6aae7214610325578063584b153e1461037057806364d623531461038f5780638065657f146103ae5780638f2a0bb0146103cd5780638f61f4f5146103ec57806391d148541461040c578063a217fddf1461042b578063b08e51c01461043e578063b1c5f4271461045e578063bc197c811461047d578063c4d252f5146104a8578063d45c4435146104c7578063d547741f146104e6578063e38335e514610505578063f23a6e6114610518578063f27a0c9214610543575f80fd5b3661015b57005b5f80fd5b34801561016a575f80fd5b5061017e610179366004611322565b610557565b005b34801561018b575f80fd5b5061019f61019a366004611390565b6105c4565b60405190151581526020015b60405180910390f35b3480156101bf575f80fd5b506101d45f80516020611ccd83398151915281565b6040519081526020016101ab565b3480156101ed575f80fd5b506101d47f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b61017e6102233660046113b7565b6105ee565b348015610233575f80fd5b5061019f61024236600461141d565b61067a565b348015610252575f80fd5b506102716102613660046114e3565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016101ab565b348015610295575f80fd5b506101d46102a436600461141d565b61069e565b3480156102b4575f80fd5b5061019f6102c336600461141d565b6106b2565b3480156102d3575f80fd5b5061017e6102e2366004611546565b6106c5565b3480156102f2575f80fd5b5061019f61030136600461141d565b6106e6565b348015610311575f80fd5b5061017e610320366004611546565b6106f8565b348015610330575f80fd5b506103587f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101ab565b34801561037b575f80fd5b5061019f61038a36600461141d565b61077b565b34801561039a575f80fd5b5061017e6103a936600461141d565b610787565b3480156103b9575f80fd5b506101d46103c83660046113b7565b61082b565b3480156103d8575f80fd5b5061017e6103e73660046115b0565b610869565b3480156103f7575f80fd5b506101d45f80516020611cad83398151915281565b348015610417575f80fd5b5061019f610426366004611546565b610993565b348015610436575f80fd5b506101d45f81565b348015610449575f80fd5b506101d45f80516020611d0d83398151915281565b348015610469575f80fd5b506101d4610478366004611658565b6109bb565b348015610488575f80fd5b50610271610497366004611774565b63bc197c8160e01b95945050505050565b3480156104b3575f80fd5b5061017e6104c236600461141d565b6109ff565b3480156104d2575f80fd5b506101d46104e136600461141d565b610ac0565b3480156104f1575f80fd5b5061017e610500366004611546565b610ad1565b61017e610513366004611658565b610aed565b348015610523575f80fd5b50610271610532366004611816565b63f23a6e6160e01b95945050505050565b34801561054e575f80fd5b506101d4610c4b565b5f80516020611cad83398151915261056e81610d10565b5f61057d89898989898961082b565b90506105898184610d1d565b5f815f80516020611ced8339815191528b8b8b8b8b8a6040516105b19695949392919061189d565b60405180910390a3505050505050505050565b5f6001600160e01b03198216630271189760e51b14806105e857506105e882610e10565b92915050565b5f80516020611ccd833981519152610606815f610993565b610614576106148133610e44565b5f61062388888888888861082b565b905061062f8185610e9d565b61063b88888888610f2e565b5f815f80516020611c8d8339815191528a8a8a8a60405161065f94939291906118d9565b60405180910390a361067081610ffd565b5050505050505050565b5f8061068583610ac0565b90506001811180156106975750428111155b9392505050565b5f9081526020819052604090206001015490565b5f60016106be83610ac0565b1492915050565b6106ce8261069e565b6106d781610d10565b6106e18383611035565b505050565b5f806106f183610ac0565b1192915050565b6001600160a01b038116331461076d5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b61077782826110b8565b5050565b5f60016106f183610ac0565b3330146107ea5760405162461bcd60e51b815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201526a62652074696d656c6f636b60a81b6064820152608401610764565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f8686868686866040516020016108479695949392919061189d565b6040516020818303038152906040528051906020012090509695505050505050565b5f80516020611cad83398151915261088081610d10565b88871461089f5760405162461bcd60e51b81526004016107649061190a565b8885146108be5760405162461bcd60e51b81526004016107649061190a565b5f6108cf8b8b8b8b8b8b8b8b6109bb565b90506108db8184610d1d565b5f5b8a8110156109855780825f80516020611ced8339815191528e8e858181106109075761090761194d565b905060200201602081019061091c9190611961565b8d8d8681811061092e5761092e61194d565b905060200201358c8c878181106109475761094761194d565b9050602002810190610959919061197a565b8c8b60405161096d9695949392919061189d565b60405180910390a361097e816119d0565b90506108dd565b505050505050505050505050565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b5f88888888888888886040516020016109db989796959493929190611a74565b60405160208183030381529060405280519060200120905098975050505050505050565b5f80516020611d0d833981519152610a1681610d10565b610a1f8261077b565b610a855760405162461bcd60e51b815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e2063616044820152701b9b9bdd0818994818d85b98d95b1b1959607a1b6064820152608401610764565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f9081526001602052604090205490565b610ada8261069e565b610ae381610d10565b6106e183836110b8565b5f80516020611ccd833981519152610b05815f610993565b610b1357610b138133610e44565b878614610b325760405162461bcd60e51b81526004016107649061190a565b878414610b515760405162461bcd60e51b81526004016107649061190a565b5f610b628a8a8a8a8a8a8a8a6109bb565b9050610b6e8185610e9d565b5f5b89811015610c35575f8b8b83818110610b8b57610b8b61194d565b9050602002016020810190610ba09190611961565b90505f8a8a84818110610bb557610bb561194d565b905060200201359050365f8a8a86818110610bd257610bd261194d565b9050602002810190610be4919061197a565b91509150610bf484848484610f2e565b84865f80516020611c8d83398151915286868686604051610c1894939291906118d9565b60405180910390a35050505080610c2e906119d0565b9050610b70565b50610c3f81610ffd565b50505050505050505050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615801590610cff57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cdb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cff9190611b13565b15610d0957505f90565b5060025490565b610d1a8133610e44565b50565b610d26826106e6565b15610d8b5760405162461bcd60e51b815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201526e1c9958591e481cd8da19591d5b1959608a1b6064820152608401610764565b610d93610c4b565b811015610df15760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e746044820152652064656c617960d01b6064820152608401610764565b610dfb8142611b32565b5f928352600160205260409092209190915550565b5f6001600160e01b03198216637965db0b60e01b14806105e857506301ffc9a760e01b6001600160e01b03198316146105e8565b610e4e8282610993565b61077757610e5b8161111c565b610e6683602061112e565b604051602001610e77929190611b67565b60408051601f198184030181529082905262461bcd60e51b825261076491600401611bd5565b610ea68261067a565b610ec25760405162461bcd60e51b815260040161076490611c07565b801580610ed35750610ed3816106b2565b6107775760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e6720646570656044820152656e64656e637960d01b6064820152608401610764565b5f846001600160a01b0316848484604051610f4a929190611c51565b5f6040518083038185875af1925050503d805f8114610f84576040519150601f19603f3d011682016040523d82523d5f602084013e610f89565b606091505b5050905080610ff65760405162461bcd60e51b815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e6720746044820152721c985b9cd858dd1a5bdb881c995d995c9d1959606a1b6064820152608401610764565b5050505050565b6110068161067a565b6110225760405162461bcd60e51b815260040161076490611c07565b5f90815260016020819052604090912055565b61103f8282610993565b610777575f828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556110743390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6110c28282610993565b15610777575f828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606105e86001600160a01b03831660145b60605f61113c836002611c60565b611147906002611b32565b6001600160401b0381111561115e5761115e611434565b6040519080825280601f01601f191660200182016040528015611188576020820181803683370190505b509050600360fc1b815f815181106111a2576111a261194d565b60200101906001600160f81b03191690815f1a905350600f60fb1b816001815181106111d0576111d061194d565b60200101906001600160f81b03191690815f1a9053505f6111f2846002611c60565b6111fd906001611b32565b90505b6001811115611274576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106112315761123161194d565b1a60f81b8282815181106112475761124761194d565b60200101906001600160f81b03191690815f1a90535060049490941c9361126d81611c77565b9050611200565b5083156106975760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610764565b80356001600160a01b03811681146112d9575f80fd5b919050565b5f8083601f8401126112ee575f80fd5b5081356001600160401b03811115611304575f80fd5b60208301915083602082850101111561131b575f80fd5b9250929050565b5f805f805f805f60c0888a031215611338575f80fd5b611341886112c3565b96506020880135955060408801356001600160401b03811115611362575f80fd5b61136e8a828b016112de565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f602082840312156113a0575f80fd5b81356001600160e01b031981168114610697575f80fd5b5f805f805f8060a087890312156113cc575f80fd5b6113d5876112c3565b95506020870135945060408701356001600160401b038111156113f6575f80fd5b61140289828a016112de565b979a9699509760608101359660809091013595509350505050565b5f6020828403121561142d575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561147057611470611434565b604052919050565b5f82601f830112611487575f80fd5b81356001600160401b038111156114a0576114a0611434565b6114b3601f8201601f1916602001611448565b8181528460208386010111156114c7575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f80608085870312156114f6575f80fd5b6114ff856112c3565b935061150d602086016112c3565b92506040850135915060608501356001600160401b0381111561152e575f80fd5b61153a87828801611478565b91505092959194509250565b5f8060408385031215611557575f80fd5b82359150611567602084016112c3565b90509250929050565b5f8083601f840112611580575f80fd5b5081356001600160401b03811115611596575f80fd5b6020830191508360208260051b850101111561131b575f80fd5b5f805f805f805f805f60c08a8c0312156115c8575f80fd5b89356001600160401b03808211156115de575f80fd5b6115ea8d838e01611570565b909b50995060208c0135915080821115611602575f80fd5b61160e8d838e01611570565b909950975060408c0135915080821115611626575f80fd5b506116338c828d01611570565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b03121561166f575f80fd5b88356001600160401b0380821115611685575f80fd5b6116918c838d01611570565b909a50985060208b01359150808211156116a9575f80fd5b6116b58c838d01611570565b909850965060408b01359150808211156116cd575f80fd5b506116da8b828c01611570565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112611707575f80fd5b813560206001600160401b0382111561172257611722611434565b8160051b611731828201611448565b928352848101820192828101908785111561174a575f80fd5b83870192505b8483101561176957823582529183019190830190611750565b979650505050505050565b5f805f805f60a08688031215611788575f80fd5b611791866112c3565b945061179f602087016112c3565b935060408601356001600160401b03808211156117ba575f80fd5b6117c689838a016116f8565b945060608801359150808211156117db575f80fd5b6117e789838a016116f8565b935060808801359150808211156117fc575f80fd5b5061180988828901611478565b9150509295509295909350565b5f805f805f60a0868803121561182a575f80fd5b611833866112c3565b9450611841602087016112c3565b9350604086013592506060860135915060808601356001600160401b03811115611869575f80fd5b61180988828901611478565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60018060a01b038716815285602082015260a060408201525f6118c460a083018688611875565b60608301949094525060800152949350505050565b60018060a01b0385168152836020820152606060408201525f611900606083018486611875565b9695505050505050565b60208082526023908201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d616040820152620e8c6d60eb1b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611971575f80fd5b610697826112c3565b5f808335601e1984360301811261198f575f80fd5b8301803591506001600160401b038211156119a8575f80fd5b60200191503681900382131561131b575f80fd5b634e487b7160e01b5f52601160045260245ffd5b5f600182016119e1576119e16119bc565b5060010190565b8183525f6020808501808196508560051b81019150845f5b87811015611a675782840389528135601e19883603018112611a20575f80fd5b870185810190356001600160401b03811115611a3a575f80fd5b803603821315611a48575f80fd5b611a53868284611875565b9a87019a9550505090840190600101611a00565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b811015611ab4576001600160a01b03611a9f846112c3565b16825260209283019290910190600101611a86565b5083810360208501528881526001600160fb1b03891115611ad3575f80fd5b8860051b9150818a60208301370182810360209081016040850152611afb90820187896119e8565b60608401959095525050608001529695505050505050565b5f60208284031215611b23575f80fd5b81518015158114610697575f80fd5b808201808211156105e8576105e86119bc565b5f5b83811015611b5f578181015183820152602001611b47565b50505f910152565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b81525f8351611b98816017850160208801611b45565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611bc9816028840160208801611b45565b01602801949350505050565b602081525f8251806020840152611bf3816040850160208701611b45565b601f01601f19169190910160400192915050565b6020808252602a908201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e206973604082015269206e6f7420726561647960b01b606082015260800190565b818382375f9101908152919050565b80820281158282048414176105e8576105e86119bc565b5f81611c8557611c856119bc565b505f19019056fec2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e634cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dcafd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783a26469706673582212207b46519d3aba8bd92bdea0509201655b38da72321b77e33118fb7e673979bea364736f6c634300081400335f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63fd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783", - "deployedBytecode": "0x608060405260043610610154575f3560e01c806301d5062a1461015f57806301ffc9a71461018057806307bd0265146101b45780630d3cf6fc146101e2578063134008d31461021557806313bc9f2014610228578063150b7a0214610247578063248a9ca31461028a5780632ab0f529146102a95780632f2ff15d146102c857806331d50750146102e757806336568abe146103065780633a6aae7214610325578063584b153e1461037057806364d623531461038f5780638065657f146103ae5780638f2a0bb0146103cd5780638f61f4f5146103ec57806391d148541461040c578063a217fddf1461042b578063b08e51c01461043e578063b1c5f4271461045e578063bc197c811461047d578063c4d252f5146104a8578063d45c4435146104c7578063d547741f146104e6578063e38335e514610505578063f23a6e6114610518578063f27a0c9214610543575f80fd5b3661015b57005b5f80fd5b34801561016a575f80fd5b5061017e610179366004611322565b610557565b005b34801561018b575f80fd5b5061019f61019a366004611390565b6105c4565b60405190151581526020015b60405180910390f35b3480156101bf575f80fd5b506101d45f80516020611ccd83398151915281565b6040519081526020016101ab565b3480156101ed575f80fd5b506101d47f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b61017e6102233660046113b7565b6105ee565b348015610233575f80fd5b5061019f61024236600461141d565b61067a565b348015610252575f80fd5b506102716102613660046114e3565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016101ab565b348015610295575f80fd5b506101d46102a436600461141d565b61069e565b3480156102b4575f80fd5b5061019f6102c336600461141d565b6106b2565b3480156102d3575f80fd5b5061017e6102e2366004611546565b6106c5565b3480156102f2575f80fd5b5061019f61030136600461141d565b6106e6565b348015610311575f80fd5b5061017e610320366004611546565b6106f8565b348015610330575f80fd5b506103587f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101ab565b34801561037b575f80fd5b5061019f61038a36600461141d565b61077b565b34801561039a575f80fd5b5061017e6103a936600461141d565b610787565b3480156103b9575f80fd5b506101d46103c83660046113b7565b61082b565b3480156103d8575f80fd5b5061017e6103e73660046115b0565b610869565b3480156103f7575f80fd5b506101d45f80516020611cad83398151915281565b348015610417575f80fd5b5061019f610426366004611546565b610993565b348015610436575f80fd5b506101d45f81565b348015610449575f80fd5b506101d45f80516020611d0d83398151915281565b348015610469575f80fd5b506101d4610478366004611658565b6109bb565b348015610488575f80fd5b50610271610497366004611774565b63bc197c8160e01b95945050505050565b3480156104b3575f80fd5b5061017e6104c236600461141d565b6109ff565b3480156104d2575f80fd5b506101d46104e136600461141d565b610ac0565b3480156104f1575f80fd5b5061017e610500366004611546565b610ad1565b61017e610513366004611658565b610aed565b348015610523575f80fd5b50610271610532366004611816565b63f23a6e6160e01b95945050505050565b34801561054e575f80fd5b506101d4610c4b565b5f80516020611cad83398151915261056e81610d10565b5f61057d89898989898961082b565b90506105898184610d1d565b5f815f80516020611ced8339815191528b8b8b8b8b8a6040516105b19695949392919061189d565b60405180910390a3505050505050505050565b5f6001600160e01b03198216630271189760e51b14806105e857506105e882610e10565b92915050565b5f80516020611ccd833981519152610606815f610993565b610614576106148133610e44565b5f61062388888888888861082b565b905061062f8185610e9d565b61063b88888888610f2e565b5f815f80516020611c8d8339815191528a8a8a8a60405161065f94939291906118d9565b60405180910390a361067081610ffd565b5050505050505050565b5f8061068583610ac0565b90506001811180156106975750428111155b9392505050565b5f9081526020819052604090206001015490565b5f60016106be83610ac0565b1492915050565b6106ce8261069e565b6106d781610d10565b6106e18383611035565b505050565b5f806106f183610ac0565b1192915050565b6001600160a01b038116331461076d5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b61077782826110b8565b5050565b5f60016106f183610ac0565b3330146107ea5760405162461bcd60e51b815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201526a62652074696d656c6f636b60a81b6064820152608401610764565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f8686868686866040516020016108479695949392919061189d565b6040516020818303038152906040528051906020012090509695505050505050565b5f80516020611cad83398151915261088081610d10565b88871461089f5760405162461bcd60e51b81526004016107649061190a565b8885146108be5760405162461bcd60e51b81526004016107649061190a565b5f6108cf8b8b8b8b8b8b8b8b6109bb565b90506108db8184610d1d565b5f5b8a8110156109855780825f80516020611ced8339815191528e8e858181106109075761090761194d565b905060200201602081019061091c9190611961565b8d8d8681811061092e5761092e61194d565b905060200201358c8c878181106109475761094761194d565b9050602002810190610959919061197a565b8c8b60405161096d9695949392919061189d565b60405180910390a361097e816119d0565b90506108dd565b505050505050505050505050565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b5f88888888888888886040516020016109db989796959493929190611a74565b60405160208183030381529060405280519060200120905098975050505050505050565b5f80516020611d0d833981519152610a1681610d10565b610a1f8261077b565b610a855760405162461bcd60e51b815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e2063616044820152701b9b9bdd0818994818d85b98d95b1b1959607a1b6064820152608401610764565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f9081526001602052604090205490565b610ada8261069e565b610ae381610d10565b6106e183836110b8565b5f80516020611ccd833981519152610b05815f610993565b610b1357610b138133610e44565b878614610b325760405162461bcd60e51b81526004016107649061190a565b878414610b515760405162461bcd60e51b81526004016107649061190a565b5f610b628a8a8a8a8a8a8a8a6109bb565b9050610b6e8185610e9d565b5f5b89811015610c35575f8b8b83818110610b8b57610b8b61194d565b9050602002016020810190610ba09190611961565b90505f8a8a84818110610bb557610bb561194d565b905060200201359050365f8a8a86818110610bd257610bd261194d565b9050602002810190610be4919061197a565b91509150610bf484848484610f2e565b84865f80516020611c8d83398151915286868686604051610c1894939291906118d9565b60405180910390a35050505080610c2e906119d0565b9050610b70565b50610c3f81610ffd565b50505050505050505050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615801590610cff57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cdb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cff9190611b13565b15610d0957505f90565b5060025490565b610d1a8133610e44565b50565b610d26826106e6565b15610d8b5760405162461bcd60e51b815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201526e1c9958591e481cd8da19591d5b1959608a1b6064820152608401610764565b610d93610c4b565b811015610df15760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e746044820152652064656c617960d01b6064820152608401610764565b610dfb8142611b32565b5f928352600160205260409092209190915550565b5f6001600160e01b03198216637965db0b60e01b14806105e857506301ffc9a760e01b6001600160e01b03198316146105e8565b610e4e8282610993565b61077757610e5b8161111c565b610e6683602061112e565b604051602001610e77929190611b67565b60408051601f198184030181529082905262461bcd60e51b825261076491600401611bd5565b610ea68261067a565b610ec25760405162461bcd60e51b815260040161076490611c07565b801580610ed35750610ed3816106b2565b6107775760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e6720646570656044820152656e64656e637960d01b6064820152608401610764565b5f846001600160a01b0316848484604051610f4a929190611c51565b5f6040518083038185875af1925050503d805f8114610f84576040519150601f19603f3d011682016040523d82523d5f602084013e610f89565b606091505b5050905080610ff65760405162461bcd60e51b815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e6720746044820152721c985b9cd858dd1a5bdb881c995d995c9d1959606a1b6064820152608401610764565b5050505050565b6110068161067a565b6110225760405162461bcd60e51b815260040161076490611c07565b5f90815260016020819052604090912055565b61103f8282610993565b610777575f828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556110743390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6110c28282610993565b15610777575f828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606105e86001600160a01b03831660145b60605f61113c836002611c60565b611147906002611b32565b6001600160401b0381111561115e5761115e611434565b6040519080825280601f01601f191660200182016040528015611188576020820181803683370190505b509050600360fc1b815f815181106111a2576111a261194d565b60200101906001600160f81b03191690815f1a905350600f60fb1b816001815181106111d0576111d061194d565b60200101906001600160f81b03191690815f1a9053505f6111f2846002611c60565b6111fd906001611b32565b90505b6001811115611274576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106112315761123161194d565b1a60f81b8282815181106112475761124761194d565b60200101906001600160f81b03191690815f1a90535060049490941c9361126d81611c77565b9050611200565b5083156106975760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610764565b80356001600160a01b03811681146112d9575f80fd5b919050565b5f8083601f8401126112ee575f80fd5b5081356001600160401b03811115611304575f80fd5b60208301915083602082850101111561131b575f80fd5b9250929050565b5f805f805f805f60c0888a031215611338575f80fd5b611341886112c3565b96506020880135955060408801356001600160401b03811115611362575f80fd5b61136e8a828b016112de565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f602082840312156113a0575f80fd5b81356001600160e01b031981168114610697575f80fd5b5f805f805f8060a087890312156113cc575f80fd5b6113d5876112c3565b95506020870135945060408701356001600160401b038111156113f6575f80fd5b61140289828a016112de565b979a9699509760608101359660809091013595509350505050565b5f6020828403121561142d575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561147057611470611434565b604052919050565b5f82601f830112611487575f80fd5b81356001600160401b038111156114a0576114a0611434565b6114b3601f8201601f1916602001611448565b8181528460208386010111156114c7575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f80608085870312156114f6575f80fd5b6114ff856112c3565b935061150d602086016112c3565b92506040850135915060608501356001600160401b0381111561152e575f80fd5b61153a87828801611478565b91505092959194509250565b5f8060408385031215611557575f80fd5b82359150611567602084016112c3565b90509250929050565b5f8083601f840112611580575f80fd5b5081356001600160401b03811115611596575f80fd5b6020830191508360208260051b850101111561131b575f80fd5b5f805f805f805f805f60c08a8c0312156115c8575f80fd5b89356001600160401b03808211156115de575f80fd5b6115ea8d838e01611570565b909b50995060208c0135915080821115611602575f80fd5b61160e8d838e01611570565b909950975060408c0135915080821115611626575f80fd5b506116338c828d01611570565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b03121561166f575f80fd5b88356001600160401b0380821115611685575f80fd5b6116918c838d01611570565b909a50985060208b01359150808211156116a9575f80fd5b6116b58c838d01611570565b909850965060408b01359150808211156116cd575f80fd5b506116da8b828c01611570565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112611707575f80fd5b813560206001600160401b0382111561172257611722611434565b8160051b611731828201611448565b928352848101820192828101908785111561174a575f80fd5b83870192505b8483101561176957823582529183019190830190611750565b979650505050505050565b5f805f805f60a08688031215611788575f80fd5b611791866112c3565b945061179f602087016112c3565b935060408601356001600160401b03808211156117ba575f80fd5b6117c689838a016116f8565b945060608801359150808211156117db575f80fd5b6117e789838a016116f8565b935060808801359150808211156117fc575f80fd5b5061180988828901611478565b9150509295509295909350565b5f805f805f60a0868803121561182a575f80fd5b611833866112c3565b9450611841602087016112c3565b9350604086013592506060860135915060808601356001600160401b03811115611869575f80fd5b61180988828901611478565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60018060a01b038716815285602082015260a060408201525f6118c460a083018688611875565b60608301949094525060800152949350505050565b60018060a01b0385168152836020820152606060408201525f611900606083018486611875565b9695505050505050565b60208082526023908201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d616040820152620e8c6d60eb1b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611971575f80fd5b610697826112c3565b5f808335601e1984360301811261198f575f80fd5b8301803591506001600160401b038211156119a8575f80fd5b60200191503681900382131561131b575f80fd5b634e487b7160e01b5f52601160045260245ffd5b5f600182016119e1576119e16119bc565b5060010190565b8183525f6020808501808196508560051b81019150845f5b87811015611a675782840389528135601e19883603018112611a20575f80fd5b870185810190356001600160401b03811115611a3a575f80fd5b803603821315611a48575f80fd5b611a53868284611875565b9a87019a9550505090840190600101611a00565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b811015611ab4576001600160a01b03611a9f846112c3565b16825260209283019290910190600101611a86565b5083810360208501528881526001600160fb1b03891115611ad3575f80fd5b8860051b9150818a60208301370182810360209081016040850152611afb90820187896119e8565b60608401959095525050608001529695505050505050565b5f60208284031215611b23575f80fd5b81518015158114610697575f80fd5b808201808211156105e8576105e86119bc565b5f5b83811015611b5f578181015183820152602001611b47565b50505f910152565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b81525f8351611b98816017850160208801611b45565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611bc9816028840160208801611b45565b01602801949350505050565b602081525f8251806020840152611bf3816040850160208701611b45565b601f01601f19169190910160400192915050565b6020808252602a908201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e206973604082015269206e6f7420726561647960b01b606082015260800190565b818382375f9101908152919050565b80820281158282048414176105e8576105e86119bc565b5f81611c8557611c856119bc565b505f19019056fec2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e634cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dcafd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783a26469706673582212207b46519d3aba8bd92bdea0509201655b38da72321b77e33118fb7e673979bea364736f6c63430008140033", + "bytecode": "0x60a06040523480156200001157600080fd5b50604051620023d0380380620023d083398101604081905262000034916200042b565b8484848462000053600080516020620023508339815191528062000242565b6200007d600080516020620023708339815191526000805160206200235083398151915262000242565b620000a7600080516020620023908339815191526000805160206200235083398151915262000242565b620000d1600080516020620023b08339815191526000805160206200235083398151915262000242565b620000ec60008051602062002350833981519152306200028d565b6001600160a01b0381161562000117576200011760008051602062002350833981519152826200028d565b60005b83518110156200019d5762000161600080516020620023708339815191528583815181106200014d576200014d620004cc565b60200260200101516200028d60201b60201c565b6200018a600080516020620023b08339815191528583815181106200014d576200014d620004cc565b6200019581620004e2565b90506200011a565b5060005b8251811015620001e757620001d4600080516020620023908339815191528483815181106200014d576200014d620004cc565b620001df81620004e2565b9050620001a1565b5060028490556040805160008152602081018690527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1505050506001600160a01b0316608052506200050a92505050565b600082815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6200029982826200029d565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1662000299576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620002f93390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146200036957600080fd5b50565b8051620003798162000353565b919050565b600082601f8301126200039057600080fd5b815160206001600160401b0380831115620003af57620003af6200033d565b8260051b604051601f19603f83011681018181108482111715620003d757620003d76200033d565b604052938452858101830193838101925087851115620003f657600080fd5b83870191505b84821015620004205762000410826200036c565b83529183019190830190620003fc565b979650505050505050565b600080600080600060a086880312156200044457600080fd5b855160208701519095506001600160401b03808211156200046457600080fd5b6200047289838a016200037e565b955060408801519150808211156200048957600080fd5b5062000498888289016200037e565b9350506060860151620004ab8162000353565b6080870151909250620004be8162000353565b809150509295509295909350565b634e487b7160e01b600052603260045260246000fd5b6000600182016200050357634e487b7160e01b600052601160045260246000fd5b5060010190565b608051611e1c620005346000396000818161034601528181610c920152610cc50152611e1c6000f3fe6080604052600436106101565760003560e01c806301d5062a1461016257806301ffc9a71461018457806307bd0265146101b95780630d3cf6fc146101e9578063134008d31461021d57806313bc9f2014610230578063150b7a0214610250578063248a9ca3146102945780632ab0f529146102b45780632f2ff15d146102d457806331d50750146102f457806336568abe146103145780633a6aae7214610334578063584b153e1461038057806364d62353146103a05780638065657f146103c05780638f2a0bb0146103e05780638f61f4f51461040057806391d1485414610422578063a217fddf14610442578063b08e51c014610457578063b1c5f42714610479578063bc197c8114610499578063c4d252f5146104c5578063d45c4435146104e5578063d547741f14610505578063e38335e514610525578063f23a6e6114610538578063f27a0c921461056457600080fd5b3661015d57005b600080fd5b34801561016e57600080fd5b5061018261017d36600461137d565b610579565b005b34801561019057600080fd5b506101a461019f3660046113f1565b6105ea565b60405190151581526020015b60405180910390f35b3480156101c557600080fd5b506101db600080516020611d8783398151915281565b6040519081526020016101b0565b3480156101f557600080fd5b506101db7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b61018261022b36600461141b565b610615565b34801561023c57600080fd5b506101a461024b366004611486565b6106a6565b34801561025c57600080fd5b5061027b61026b366004611554565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016101b0565b3480156102a057600080fd5b506101db6102af366004611486565b6106cb565b3480156102c057600080fd5b506101a46102cf366004611486565b6106e0565b3480156102e057600080fd5b506101826102ef3660046115bb565b6106f4565b34801561030057600080fd5b506101a461030f366004611486565b610715565b34801561032057600080fd5b5061018261032f3660046115bb565b610728565b34801561034057600080fd5b506103687f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101b0565b34801561038c57600080fd5b506101a461039b366004611486565b6107ab565b3480156103ac57600080fd5b506101826103bb366004611486565b6107b8565b3480156103cc57600080fd5b506101db6103db36600461141b565b61085c565b3480156103ec57600080fd5b506101826103fb36600461162b565b61089b565b34801561040c57600080fd5b506101db600080516020611d6783398151915281565b34801561042e57600080fd5b506101a461043d3660046115bb565b6109c9565b34801561044e57600080fd5b506101db600081565b34801561046357600080fd5b506101db600080516020611dc783398151915281565b34801561048557600080fd5b506101db6104943660046116dc565b6109f2565b3480156104a557600080fd5b5061027b6104b4366004611803565b63bc197c8160e01b95945050505050565b3480156104d157600080fd5b506101826104e0366004611486565b610a37565b3480156104f157600080fd5b506101db610500366004611486565b610afa565b34801561051157600080fd5b506101826105203660046115bb565b610b0c565b6101826105333660046116dc565b610b28565b34801561054457600080fd5b5061027b6105533660046118ac565b63f23a6e6160e01b95945050505050565b34801561057057600080fd5b506101db610c8e565b600080516020611d6783398151915261059181610d57565b60006105a189898989898961085c565b90506105ad8184610d64565b600081600080516020611da78339815191528b8b8b8b8b8a6040516105d796959493929190611939565b60405180910390a3505050505050505050565b60006001600160e01b03198216630271189760e51b148061060f575061060f82610e58565b92915050565b600080516020611d8783398151915261062f8160006109c9565b61063d5761063d8133610e8d565b600061064d88888888888861085c565b90506106598185610ee6565b61066588888888610f77565b600081600080516020611d478339815191528a8a8a8a60405161068b9493929190611976565b60405180910390a361069c8161104a565b5050505050505050565b6000806106b283610afa565b90506001811180156106c45750428111155b9392505050565b60009081526020819052604090206001015490565b600060016106ed83610afa565b1492915050565b6106fd826106cb565b61070681610d57565b6107108383611083565b505050565b60008061072183610afa565b1192915050565b6001600160a01b038116331461079d5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6107a78282611107565b5050565b6000600161072183610afa565b33301461081b5760405162461bcd60e51b815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201526a62652074696d656c6f636b60a81b6064820152608401610794565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b600086868686868660405160200161087996959493929190611939565b6040516020818303038152906040528051906020012090509695505050505050565b600080516020611d678339815191526108b381610d57565b8887146108d25760405162461bcd60e51b8152600401610794906119a8565b8885146108f15760405162461bcd60e51b8152600401610794906119a8565b60006109038b8b8b8b8b8b8b8b6109f2565b905061090f8184610d64565b60005b8a8110156109bb578082600080516020611da78339815191528e8e8581811061093d5761093d6119eb565b90506020020160208101906109529190611a01565b8d8d86818110610964576109646119eb565b905060200201358c8c8781811061097d5761097d6119eb565b905060200281019061098f9190611a1c565b8c8b6040516109a396959493929190611939565b60405180910390a36109b481611a78565b9050610912565b505050505050505050505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60008888888888888888604051602001610a13989796959493929190611b22565b60405160208183030381529060405280519060200120905098975050505050505050565b600080516020611dc7833981519152610a4f81610d57565b610a58826107ab565b610abe5760405162461bcd60e51b815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e2063616044820152701b9b9bdd0818994818d85b98d95b1b1959607a1b6064820152608401610794565b6000828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b60009081526001602052604090205490565b610b15826106cb565b610b1e81610d57565b6107108383611107565b600080516020611d87833981519152610b428160006109c9565b610b5057610b508133610e8d565b878614610b6f5760405162461bcd60e51b8152600401610794906119a8565b878414610b8e5760405162461bcd60e51b8152600401610794906119a8565b6000610ba08a8a8a8a8a8a8a8a6109f2565b9050610bac8185610ee6565b60005b89811015610c785760008b8b83818110610bcb57610bcb6119eb565b9050602002016020810190610be09190611a01565b905060008a8a84818110610bf657610bf66119eb565b9050602002013590503660008a8a86818110610c1457610c146119eb565b9050602002810190610c269190611a1c565b91509150610c3684848484610f77565b8486600080516020611d4783398151915286868686604051610c5b9493929190611976565b60405180910390a35050505080610c7190611a78565b9050610baf565b50610c828161104a565b50505050505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615801590610d4557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d459190611bc3565b15610d505750600090565b5060025490565b610d618133610e8d565b50565b610d6d82610715565b15610dd25760405162461bcd60e51b815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201526e1c9958591e481cd8da19591d5b1959608a1b6064820152608401610794565b610dda610c8e565b811015610e385760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e746044820152652064656c617960d01b6064820152608401610794565b610e428142611be5565b6000928352600160205260409092209190915550565b60006001600160e01b03198216637965db0b60e01b148061060f57506301ffc9a760e01b6001600160e01b031983161461060f565b610e9782826109c9565b6107a757610ea48161116c565b610eaf83602061117e565b604051602001610ec0929190611c1c565b60408051601f198184030181529082905262461bcd60e51b825261079491600401611c8b565b610eef826106a6565b610f0b5760405162461bcd60e51b815260040161079490611cbe565b801580610f1c5750610f1c816106e0565b6107a75760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e6720646570656044820152656e64656e637960d01b6064820152608401610794565b6000846001600160a01b0316848484604051610f94929190611d08565b60006040518083038185875af1925050503d8060008114610fd1576040519150601f19603f3d011682016040523d82523d6000602084013e610fd6565b606091505b50509050806110435760405162461bcd60e51b815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e6720746044820152721c985b9cd858dd1a5bdb881c995d995c9d1959606a1b6064820152608401610794565b5050505050565b611053816106a6565b61106f5760405162461bcd60e51b815260040161079490611cbe565b600090815260016020819052604090912055565b61108d82826109c9565b6107a7576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556110c33390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61111182826109c9565b156107a7576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b606061060f6001600160a01b03831660145b6060600061118d836002611d18565b611198906002611be5565b6001600160401b038111156111af576111af61149f565b6040519080825280601f01601f1916602001820160405280156111d9576020820181803683370190505b509050600360fc1b816000815181106111f4576111f46119eb565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611223576112236119eb565b60200101906001600160f81b031916908160001a9053506000611247846002611d18565b611252906001611be5565b90505b60018111156112ca576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611286576112866119eb565b1a60f81b82828151811061129c5761129c6119eb565b60200101906001600160f81b031916908160001a90535060049490941c936112c381611d2f565b9050611255565b5083156106c45760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610794565b80356001600160a01b038116811461133057600080fd5b919050565b60008083601f84011261134757600080fd5b5081356001600160401b0381111561135e57600080fd5b60208301915083602082850101111561137657600080fd5b9250929050565b600080600080600080600060c0888a03121561139857600080fd5b6113a188611319565b96506020880135955060408801356001600160401b038111156113c357600080fd5b6113cf8a828b01611335565b989b979a50986060810135976080820135975060a09091013595509350505050565b60006020828403121561140357600080fd5b81356001600160e01b0319811681146106c457600080fd5b60008060008060008060a0878903121561143457600080fd5b61143d87611319565b95506020870135945060408701356001600160401b0381111561145f57600080fd5b61146b89828a01611335565b979a9699509760608101359660809091013595509350505050565b60006020828403121561149857600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156114dd576114dd61149f565b604052919050565b600082601f8301126114f657600080fd5b81356001600160401b0381111561150f5761150f61149f565b611522601f8201601f19166020016114b5565b81815284602083860101111561153757600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561156a57600080fd5b61157385611319565b935061158160208601611319565b92506040850135915060608501356001600160401b038111156115a357600080fd5b6115af878288016114e5565b91505092959194509250565b600080604083850312156115ce57600080fd5b823591506115de60208401611319565b90509250929050565b60008083601f8401126115f957600080fd5b5081356001600160401b0381111561161057600080fd5b6020830191508360208260051b850101111561137657600080fd5b600080600080600080600080600060c08a8c03121561164957600080fd5b89356001600160401b038082111561166057600080fd5b61166c8d838e016115e7565b909b50995060208c013591508082111561168557600080fd5b6116918d838e016115e7565b909950975060408c01359150808211156116aa57600080fd5b506116b78c828d016115e7565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b60008060008060008060008060a0898b0312156116f857600080fd5b88356001600160401b038082111561170f57600080fd5b61171b8c838d016115e7565b909a50985060208b013591508082111561173457600080fd5b6117408c838d016115e7565b909850965060408b013591508082111561175957600080fd5b506117668b828c016115e7565b999c989b509699959896976060870135966080013595509350505050565b600082601f83011261179557600080fd5b813560206001600160401b038211156117b0576117b061149f565b8160051b6117bf8282016114b5565b92835284810182019282810190878511156117d957600080fd5b83870192505b848310156117f8578235825291830191908301906117df565b979650505050505050565b600080600080600060a0868803121561181b57600080fd5b61182486611319565b945061183260208701611319565b935060408601356001600160401b038082111561184e57600080fd5b61185a89838a01611784565b9450606088013591508082111561187057600080fd5b61187c89838a01611784565b9350608088013591508082111561189257600080fd5b5061189f888289016114e5565b9150509295509295909350565b600080600080600060a086880312156118c457600080fd5b6118cd86611319565b94506118db60208701611319565b9350604086013592506060860135915060808601356001600160401b0381111561190457600080fd5b61189f888289016114e5565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b038716815285602082015260a06040820152600061196160a083018688611910565b60608301949094525060800152949350505050565b60018060a01b038516815283602082015260606040820152600061199e606083018486611910565b9695505050505050565b60208082526023908201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d616040820152620e8c6d60eb1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600060208284031215611a1357600080fd5b6106c482611319565b6000808335601e19843603018112611a3357600080fd5b8301803591506001600160401b03821115611a4d57600080fd5b60200191503681900382131561137657600080fd5b634e487b7160e01b600052601160045260246000fd5b600060018201611a8a57611a8a611a62565b5060010190565b81835260006020808501808196508560051b810191508460005b87811015611b155782840389528135601e19883603018112611acc57600080fd5b870185810190356001600160401b03811115611ae757600080fd5b803603821315611af657600080fd5b611b01868284611910565b9a87019a9550505090840190600101611aab565b5091979650505050505050565b60a0808252810188905260008960c08301825b8b811015611b63576001600160a01b03611b4e84611319565b16825260209283019290910190600101611b35565b5083810360208501528881526001600160fb1b03891115611b8357600080fd5b8860051b9150818a60208301370182810360209081016040850152611bab9082018789611a91565b60608401959095525050608001529695505050505050565b600060208284031215611bd557600080fd5b815180151581146106c457600080fd5b8082018082111561060f5761060f611a62565b60005b83811015611c13578181015183820152602001611bfb565b50506000910152565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260008351611c4e816017850160208801611bf8565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611c7f816028840160208801611bf8565b01602801949350505050565b6020815260008251806020840152611caa816040850160208701611bf8565b601f01601f19169190910160400192915050565b6020808252602a908201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e206973604082015269206e6f7420726561647960b01b606082015260800190565b8183823760009101908152919050565b808202811582820484141761060f5761060f611a62565b600081611d3e57611d3e611a62565b50600019019056fec2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e634cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dcafd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783a264697066735822122020cb3b2cb68d6bad0a32c6f2ad43d914add21c49d11bde8ed1ea487a91fd270e64736f6c634300081400335f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63fd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783", + "deployedBytecode": "0x6080604052600436106101565760003560e01c806301d5062a1461016257806301ffc9a71461018457806307bd0265146101b95780630d3cf6fc146101e9578063134008d31461021d57806313bc9f2014610230578063150b7a0214610250578063248a9ca3146102945780632ab0f529146102b45780632f2ff15d146102d457806331d50750146102f457806336568abe146103145780633a6aae7214610334578063584b153e1461038057806364d62353146103a05780638065657f146103c05780638f2a0bb0146103e05780638f61f4f51461040057806391d1485414610422578063a217fddf14610442578063b08e51c014610457578063b1c5f42714610479578063bc197c8114610499578063c4d252f5146104c5578063d45c4435146104e5578063d547741f14610505578063e38335e514610525578063f23a6e6114610538578063f27a0c921461056457600080fd5b3661015d57005b600080fd5b34801561016e57600080fd5b5061018261017d36600461137d565b610579565b005b34801561019057600080fd5b506101a461019f3660046113f1565b6105ea565b60405190151581526020015b60405180910390f35b3480156101c557600080fd5b506101db600080516020611d8783398151915281565b6040519081526020016101b0565b3480156101f557600080fd5b506101db7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b61018261022b36600461141b565b610615565b34801561023c57600080fd5b506101a461024b366004611486565b6106a6565b34801561025c57600080fd5b5061027b61026b366004611554565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016101b0565b3480156102a057600080fd5b506101db6102af366004611486565b6106cb565b3480156102c057600080fd5b506101a46102cf366004611486565b6106e0565b3480156102e057600080fd5b506101826102ef3660046115bb565b6106f4565b34801561030057600080fd5b506101a461030f366004611486565b610715565b34801561032057600080fd5b5061018261032f3660046115bb565b610728565b34801561034057600080fd5b506103687f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101b0565b34801561038c57600080fd5b506101a461039b366004611486565b6107ab565b3480156103ac57600080fd5b506101826103bb366004611486565b6107b8565b3480156103cc57600080fd5b506101db6103db36600461141b565b61085c565b3480156103ec57600080fd5b506101826103fb36600461162b565b61089b565b34801561040c57600080fd5b506101db600080516020611d6783398151915281565b34801561042e57600080fd5b506101a461043d3660046115bb565b6109c9565b34801561044e57600080fd5b506101db600081565b34801561046357600080fd5b506101db600080516020611dc783398151915281565b34801561048557600080fd5b506101db6104943660046116dc565b6109f2565b3480156104a557600080fd5b5061027b6104b4366004611803565b63bc197c8160e01b95945050505050565b3480156104d157600080fd5b506101826104e0366004611486565b610a37565b3480156104f157600080fd5b506101db610500366004611486565b610afa565b34801561051157600080fd5b506101826105203660046115bb565b610b0c565b6101826105333660046116dc565b610b28565b34801561054457600080fd5b5061027b6105533660046118ac565b63f23a6e6160e01b95945050505050565b34801561057057600080fd5b506101db610c8e565b600080516020611d6783398151915261059181610d57565b60006105a189898989898961085c565b90506105ad8184610d64565b600081600080516020611da78339815191528b8b8b8b8b8a6040516105d796959493929190611939565b60405180910390a3505050505050505050565b60006001600160e01b03198216630271189760e51b148061060f575061060f82610e58565b92915050565b600080516020611d8783398151915261062f8160006109c9565b61063d5761063d8133610e8d565b600061064d88888888888861085c565b90506106598185610ee6565b61066588888888610f77565b600081600080516020611d478339815191528a8a8a8a60405161068b9493929190611976565b60405180910390a361069c8161104a565b5050505050505050565b6000806106b283610afa565b90506001811180156106c45750428111155b9392505050565b60009081526020819052604090206001015490565b600060016106ed83610afa565b1492915050565b6106fd826106cb565b61070681610d57565b6107108383611083565b505050565b60008061072183610afa565b1192915050565b6001600160a01b038116331461079d5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6107a78282611107565b5050565b6000600161072183610afa565b33301461081b5760405162461bcd60e51b815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201526a62652074696d656c6f636b60a81b6064820152608401610794565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b600086868686868660405160200161087996959493929190611939565b6040516020818303038152906040528051906020012090509695505050505050565b600080516020611d678339815191526108b381610d57565b8887146108d25760405162461bcd60e51b8152600401610794906119a8565b8885146108f15760405162461bcd60e51b8152600401610794906119a8565b60006109038b8b8b8b8b8b8b8b6109f2565b905061090f8184610d64565b60005b8a8110156109bb578082600080516020611da78339815191528e8e8581811061093d5761093d6119eb565b90506020020160208101906109529190611a01565b8d8d86818110610964576109646119eb565b905060200201358c8c8781811061097d5761097d6119eb565b905060200281019061098f9190611a1c565b8c8b6040516109a396959493929190611939565b60405180910390a36109b481611a78565b9050610912565b505050505050505050505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60008888888888888888604051602001610a13989796959493929190611b22565b60405160208183030381529060405280519060200120905098975050505050505050565b600080516020611dc7833981519152610a4f81610d57565b610a58826107ab565b610abe5760405162461bcd60e51b815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e2063616044820152701b9b9bdd0818994818d85b98d95b1b1959607a1b6064820152608401610794565b6000828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b60009081526001602052604090205490565b610b15826106cb565b610b1e81610d57565b6107108383611107565b600080516020611d87833981519152610b428160006109c9565b610b5057610b508133610e8d565b878614610b6f5760405162461bcd60e51b8152600401610794906119a8565b878414610b8e5760405162461bcd60e51b8152600401610794906119a8565b6000610ba08a8a8a8a8a8a8a8a6109f2565b9050610bac8185610ee6565b60005b89811015610c785760008b8b83818110610bcb57610bcb6119eb565b9050602002016020810190610be09190611a01565b905060008a8a84818110610bf657610bf66119eb565b9050602002013590503660008a8a86818110610c1457610c146119eb565b9050602002810190610c269190611a1c565b91509150610c3684848484610f77565b8486600080516020611d4783398151915286868686604051610c5b9493929190611976565b60405180910390a35050505080610c7190611a78565b9050610baf565b50610c828161104a565b50505050505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615801590610d4557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d459190611bc3565b15610d505750600090565b5060025490565b610d618133610e8d565b50565b610d6d82610715565b15610dd25760405162461bcd60e51b815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201526e1c9958591e481cd8da19591d5b1959608a1b6064820152608401610794565b610dda610c8e565b811015610e385760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e746044820152652064656c617960d01b6064820152608401610794565b610e428142611be5565b6000928352600160205260409092209190915550565b60006001600160e01b03198216637965db0b60e01b148061060f57506301ffc9a760e01b6001600160e01b031983161461060f565b610e9782826109c9565b6107a757610ea48161116c565b610eaf83602061117e565b604051602001610ec0929190611c1c565b60408051601f198184030181529082905262461bcd60e51b825261079491600401611c8b565b610eef826106a6565b610f0b5760405162461bcd60e51b815260040161079490611cbe565b801580610f1c5750610f1c816106e0565b6107a75760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e6720646570656044820152656e64656e637960d01b6064820152608401610794565b6000846001600160a01b0316848484604051610f94929190611d08565b60006040518083038185875af1925050503d8060008114610fd1576040519150601f19603f3d011682016040523d82523d6000602084013e610fd6565b606091505b50509050806110435760405162461bcd60e51b815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e6720746044820152721c985b9cd858dd1a5bdb881c995d995c9d1959606a1b6064820152608401610794565b5050505050565b611053816106a6565b61106f5760405162461bcd60e51b815260040161079490611cbe565b600090815260016020819052604090912055565b61108d82826109c9565b6107a7576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556110c33390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61111182826109c9565b156107a7576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b606061060f6001600160a01b03831660145b6060600061118d836002611d18565b611198906002611be5565b6001600160401b038111156111af576111af61149f565b6040519080825280601f01601f1916602001820160405280156111d9576020820181803683370190505b509050600360fc1b816000815181106111f4576111f46119eb565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611223576112236119eb565b60200101906001600160f81b031916908160001a9053506000611247846002611d18565b611252906001611be5565b90505b60018111156112ca576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611286576112866119eb565b1a60f81b82828151811061129c5761129c6119eb565b60200101906001600160f81b031916908160001a90535060049490941c936112c381611d2f565b9050611255565b5083156106c45760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610794565b80356001600160a01b038116811461133057600080fd5b919050565b60008083601f84011261134757600080fd5b5081356001600160401b0381111561135e57600080fd5b60208301915083602082850101111561137657600080fd5b9250929050565b600080600080600080600060c0888a03121561139857600080fd5b6113a188611319565b96506020880135955060408801356001600160401b038111156113c357600080fd5b6113cf8a828b01611335565b989b979a50986060810135976080820135975060a09091013595509350505050565b60006020828403121561140357600080fd5b81356001600160e01b0319811681146106c457600080fd5b60008060008060008060a0878903121561143457600080fd5b61143d87611319565b95506020870135945060408701356001600160401b0381111561145f57600080fd5b61146b89828a01611335565b979a9699509760608101359660809091013595509350505050565b60006020828403121561149857600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156114dd576114dd61149f565b604052919050565b600082601f8301126114f657600080fd5b81356001600160401b0381111561150f5761150f61149f565b611522601f8201601f19166020016114b5565b81815284602083860101111561153757600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561156a57600080fd5b61157385611319565b935061158160208601611319565b92506040850135915060608501356001600160401b038111156115a357600080fd5b6115af878288016114e5565b91505092959194509250565b600080604083850312156115ce57600080fd5b823591506115de60208401611319565b90509250929050565b60008083601f8401126115f957600080fd5b5081356001600160401b0381111561161057600080fd5b6020830191508360208260051b850101111561137657600080fd5b600080600080600080600080600060c08a8c03121561164957600080fd5b89356001600160401b038082111561166057600080fd5b61166c8d838e016115e7565b909b50995060208c013591508082111561168557600080fd5b6116918d838e016115e7565b909950975060408c01359150808211156116aa57600080fd5b506116b78c828d016115e7565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b60008060008060008060008060a0898b0312156116f857600080fd5b88356001600160401b038082111561170f57600080fd5b61171b8c838d016115e7565b909a50985060208b013591508082111561173457600080fd5b6117408c838d016115e7565b909850965060408b013591508082111561175957600080fd5b506117668b828c016115e7565b999c989b509699959896976060870135966080013595509350505050565b600082601f83011261179557600080fd5b813560206001600160401b038211156117b0576117b061149f565b8160051b6117bf8282016114b5565b92835284810182019282810190878511156117d957600080fd5b83870192505b848310156117f8578235825291830191908301906117df565b979650505050505050565b600080600080600060a0868803121561181b57600080fd5b61182486611319565b945061183260208701611319565b935060408601356001600160401b038082111561184e57600080fd5b61185a89838a01611784565b9450606088013591508082111561187057600080fd5b61187c89838a01611784565b9350608088013591508082111561189257600080fd5b5061189f888289016114e5565b9150509295509295909350565b600080600080600060a086880312156118c457600080fd5b6118cd86611319565b94506118db60208701611319565b9350604086013592506060860135915060808601356001600160401b0381111561190457600080fd5b61189f888289016114e5565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b038716815285602082015260a06040820152600061196160a083018688611910565b60608301949094525060800152949350505050565b60018060a01b038516815283602082015260606040820152600061199e606083018486611910565b9695505050505050565b60208082526023908201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d616040820152620e8c6d60eb1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600060208284031215611a1357600080fd5b6106c482611319565b6000808335601e19843603018112611a3357600080fd5b8301803591506001600160401b03821115611a4d57600080fd5b60200191503681900382131561137657600080fd5b634e487b7160e01b600052601160045260246000fd5b600060018201611a8a57611a8a611a62565b5060010190565b81835260006020808501808196508560051b810191508460005b87811015611b155782840389528135601e19883603018112611acc57600080fd5b870185810190356001600160401b03811115611ae757600080fd5b803603821315611af657600080fd5b611b01868284611910565b9a87019a9550505090840190600101611aab565b5091979650505050505050565b60a0808252810188905260008960c08301825b8b811015611b63576001600160a01b03611b4e84611319565b16825260209283019290910190600101611b35565b5083810360208501528881526001600160fb1b03891115611b8357600080fd5b8860051b9150818a60208301370182810360209081016040850152611bab9082018789611a91565b60608401959095525050608001529695505050505050565b600060208284031215611bd557600080fd5b815180151581146106c457600080fd5b8082018082111561060f5761060f611a62565b60005b83811015611c13578181015183820152602001611bfb565b50506000910152565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260008351611c4e816017850160208801611bf8565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611c7f816028840160208801611bf8565b01602801949350505050565b6020815260008251806020840152611caa816040850160208701611bf8565b601f01601f19169190910160400192915050565b6020808252602a908201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e206973604082015269206e6f7420726561647960b01b606082015260800190565b8183823760009101908152919050565b808202811582820484141761060f5761060f611a62565b600081611d3e57611d3e611a62565b50600019019056fec2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e634cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dcafd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783a264697066735822122020cb3b2cb68d6bad0a32c6f2ad43d914add21c49d11bde8ed1ea487a91fd270e64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMV2.json b/compiled-contracts/paris/PolygonZkEVMV2.json index 36a58ea3c..6e454b04e 100644 --- a/compiled-contracts/paris/PolygonZkEVMV2.json +++ b/compiled-contracts/paris/PolygonZkEVMV2.json @@ -1001,8 +1001,8 @@ "type": "function" } ], - "bytecode": "0x61010060405234801562000011575f80fd5b5060405162002b8c38038062002b8c83398101604081905262000034916200006f565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d4565b6001600160a01b03811681146200006c575f80fd5b50565b5f805f806080858703121562000083575f80fd5b8451620000908162000057565b6020860151909450620000a38162000057565b6040860151909350620000b68162000057565b6060860151909250620000c98162000057565b939692955090935050565b60805160a05160c05160e051612a06620001865f395f818161030301528181610696015281816107310152818161099e01528181610af401528181610fe50152818161107d0152818161109f015281816111df015281816118f00152818161196c0152611a4701525f81816103d1015261115b01525f818161045701528181610df90152611b4301525f81816104a4015281816105290152818161102a015281816111310152611b180152612a065ff3fe608060405234801561000f575f80fd5b50600436106101b4575f3560e01c8062d0295d146101b8578063107bf28c146101d357806319d8ac61146101e857806326782247146102135780632b35b3ac1461023357806332c2d153146102505780633c351e10146102655780633cbc795b1461027d57806340b5de6c146102a957806345605267146102d157806347ebf108146102eb57806349b7b802146102fe5780634e48770614610325578063542028d5146103385780635e9145c9146103405780635ec91958146103535780636b8616ce1461035b5780636e05d2cd1461037a5780636ff512cc146103835780638c3d73011461039657806399af03971461039e5780639e001877146103b1578063a3c573eb146103cc578063ada8f919146103f3578063b0afe15414610406578063c754c7ed14610412578063c89e42df1461042c578063cfa8ed471461043f578063d02103ca14610452578063d690be3114610479578063d7bc90ff14610481578063d8d1091b1461048c578063e46761c41461049f578063e7a7ed02146104c6578063eaeb077b146104e0578063f35dda47146104f3578063f851a4401461050d575b5f80fd5b6101c0610525565b6040519081526020015b60405180910390f35b6101db610608565b6040516101ca919061206e565b6007546101fb906001600160401b031681565b6040516001600160401b0390911681526020016101ca565b600154610226906001600160a01b031681565b6040516101ca9190612087565b6008546102409060ff1681565b60405190151581526020016101ca565b61026361025e3660046120cd565b610694565b005b6008546102269061010090046001600160a01b031681565b60085461029490600160a81b900463ffffffff1681565b60405163ffffffff90911681526020016101ca565b6102b86001600160f81b031981565b6040516001600160f81b031990911681526020016101ca565b6007546101fb90600160801b90046001600160401b031681565b6102636102f93660046121b7565b61072f565b6102267f000000000000000000000000000000000000000000000000000000000000000081565b610263610333366004612266565b610a95565b6101db610c09565b61026361034e3660046122c8565b610c16565b610263611286565b6101c0610369366004612266565b60066020525f908152604090205481565b6101c060055481565b61026361039136600461230e565b611311565b61026361138c565b6101db6103ac366004612327565b611418565b61022673a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6102267f000000000000000000000000000000000000000000000000000000000000000081565b61026361040136600461230e565b61159f565b6101c06405ca1ab1e081565b6007546101fb90600160c01b90046001600160401b031681565b61026361043a36600461235e565b61161a565b600254610226906001600160a01b031681565b6102267f000000000000000000000000000000000000000000000000000000000000000081565b6101db611686565b6101c0635ca1ab1e81565b61026361049a36600461238f565b6116a2565b6102267f000000000000000000000000000000000000000000000000000000000000000081565b6007546101fb90600160401b90046001600160401b031681565b6102636104ee3660046123cd565b611a21565b6104fb601b81565b60405160ff90911681526020016101ca565b5f54610226906201000090046001600160a01b031681565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016105739190612087565b602060405180830381865afa15801561058e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105b2919061243d565b6007549091505f906105dd906001600160401b03600160801b8204811691600160401b900416612468565b6001600160401b03169050805f036105f7575f9250505090565b610601818361248f565b9250505090565b60048054610615906124ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610641906124ae565b801561068c5780601f106106635761010080835404028352916020019161068c565b820191905f5260205f20905b81548152906001019060200180831161066f57829003601f168201915b505050505081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146106dd57604051631736745960e31b815260040160405180910390fd5b806001600160a01b0316836001600160401b03167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59668460405161072291815260200190565b60405180910390a3505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461077857604051631736745960e31b815260040160405180910390fd5b5f54610100900460ff161580801561079657505f54600160ff909116105b806107b657506107a530611d13565b1580156107b657505f5460ff166001145b61081e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561083f575f805461ff0019166101001790555b5f805462010000600160b01b031916620100006001600160a01b038b81169190910291909117909155600280546001600160a01b031916918916919091179055600361088b8482612533565b5060046108988382612533565b50600780546001600160c01b0316610d2f60c71b1790556001600160a01b0385166108e25763ffffffff8416156108e257604051630d43a60960e11b815260040160405180910390fd5b60088054610100600160c81b0319166101006001600160a01b0388160263ffffffff60a81b191617600160a81b63ffffffff8716021790555f610926878787611418565b90505f818051906020012090505f4290505f805f1b835f801b848e6040516020016109559594939291906125ee565b60408051808303601f19018152908290528051602090910120600780546001600160401b0319166001600160401b0386161790556005819055639a908e7360e01b825291505f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639a908e73906109de90600190869060040161262d565b6020604051808303815f875af11580156109fa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a1e9190612646565b6040519091506001600160401b038216905f80516020612970833981519152905f90a250505050508015610a8b575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b5f546201000090046001600160a01b03163314610ac557604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610af25760405163f5e37f2f60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b729190612661565b610bac576007546001600160401b03600160c01b909104811690821610610bac5760405163f5e37f2f60e01b815260040160405180910390fd5b600780546001600160c01b0316600160c01b6001600160401b038416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b60038054610615906124ae565b6002546001600160a01b03163314610c41576040516311e7be1560e01b815260040160405180910390fd5b815f819003610c635760405163cb591a5f60e01b815260040160405180910390fd5b6103e8811115610c8657604051635acfba9d60e11b815260040160405180910390fd5b6007546005546001600160401b0380831692600160801b90041690815f5b85811015610f54575f898983818110610cbf57610cbf612680565b9050602002810190610cd19190612694565b610cda906126b2565b805180516020909101206060820151919250906001600160401b031615610dcf5785610d058161273f565b9650505f8183602001518460600151604051602001610d269392919061276c565b60408051601f1981840301815291815281516020928301206001600160401b038a165f90815260069093529120549091508114610d765760405163671ebaaf60e11b815260040160405180910390fd5b82606001516001600160401b031683604001516001600160401b03161015610db157604051633fbd5c3960e11b815260040160405180910390fd5b506001600160401b0386165f90815260066020526040812055610eb1565b602082015115801590610e6d575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303815f875af1158015610e47573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e6b919061243d565b155b15610e8b576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c01015610eb1576040516328a69b1f60e21b815260040160405180910390fd5b866001600160401b031682604001516001600160401b03161080610ee157504282604001516001600160401b0316115b15610eff576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518c604051602001610f209594939291906125ee565b6040516020818303038152906040528051906020012094508160400151965050508080610f4c9061278f565b915050610ca4565b506007546001600160401b03600160401b90910481169084161115610f8c5760405163c630a00d60e01b815260040160405180910390fd5b600780546001600160401b0319166001600160401b03868116919091179091556005839055859082811690851614611077575f610fc98386612468565b9050610fde6001600160401b038216836127a7565b91506110517f0000000000000000000000000000000000000000000000000000000000000000826001600160401b0316611016610525565b61102091906127c0565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190611d22565b5060078054600160801b600160c01b031916600160801b6001600160401b038716021790555b611159337f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061111d919061243d565b61112791906127c0565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190611d8a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156111b1575f80fd5b505af11580156111c3573d5f803e3d5ffd5b5050604051639a908e7360e01b81525f92506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150639a908e7390611217908a90889060040161262d565b6020604051808303815f875af1158015611233573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112579190612646565b6040519091506001600160401b038216905f80516020612970833981519152905f90a250505050505050505050565b5f546201000090046001600160a01b031633146112b657604051634755657960e01b815260040160405180910390fd5b60085460ff16156112da5760405163f6ba91a160e01b815260040160405180910390fd5b6008805460ff191660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f546201000090046001600160a01b0316331461134157604051634755657960e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383161790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610bfe908390612087565b6001546001600160a01b031633146113b75760405163d1ec4b2360e01b815260040160405180910390fd5b6001545f8054620100006001600160a01b0390931692830262010000600160b01b03199091161790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9161140e91612087565b60405180910390a1565b60605f6040518060600160405280602181526020016129b06021913960405163ffffffff80881660248301526001600160a01b03871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa60848201525f60a482015260c40160408051601f19818403018152918152602080830180516001600160e01b03166369a3b57f60e11b17905290516114b6939291016127d7565b60408051601f1981840301815282825280516020808301919091205f80865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015611523573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166115575760405163668b0cb360e11b815260040160405180910390fd5b6040515f906115849084906405ca1ab1e090635ca1ab1e90601b906001600160f81b031990602001612805565b60408051808303601f19018152919052979650505050505050565b5f546201000090046001600160a01b031633146115cf57604051634755657960e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610bfe908390612087565b5f546201000090046001600160a01b0316331461164a57604051634755657960e01b815260040160405180910390fd5b60036116568282612533565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610bfe919061206e565b6040518060600160405280602181526020016129b06021913981565b60085460ff166116c5576040516324eff8c360e01b815260040160405180910390fd5b805f8190036116e75760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561170a57604051635acfba9d60e11b815260040160405180910390fd5b6007546001600160401b03600160401b8204811691611732918491600160801b900416612848565b11156117515760405163c630a00d60e01b815260040160405180910390fd5b600754600554600160801b9091046001600160401b0316905f5b838110156118ea575f86868381811061178657611786612680565b9050602002810190611798919061285b565b6117a19061286f565b9050836117ad8161273f565b825180516020918201208185015160408087015190519499509194505f936117d8938693910161276c565b60408051601f1981840301815291815281516020928301206001600160401b0389165f908152600690935291205490915081146118285760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b0386165f9081526006602052604081205561184b6001886127a7565b840361189f5742600760189054906101000a90046001600160401b0316846040015161187791906128e9565b6001600160401b0316111561189f5760405163c44a082160e01b815260040160405180910390fd5b8482846020015142336040516020016118bc9594939291906125ee565b60405160208183030381529060405280519060200120945050505080806118e29061278f565b91505061176b565b506119187f000000000000000000000000000000000000000000000000000000000000000084611016610525565b6005819055600780546001600160401b03848116600160801b026001600160401b03600160801b03600160c01b0319909216429190911617179055604051639a908e7360e01b81525f906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906119a3908790869060040161262d565b6020604051808303815f875af11580156119bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119e39190612646565b6040519091506001600160401b038216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a2505050505050565b60085460ff16611a44576040516324eff8c360e01b815260040160405180910390fd5b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015611aa1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ac5919061243d565b905081811115611ae857604051632354600f60e01b815260040160405180910390fd5b611388831115611b0b576040516328a69b1f60e21b815260040160405180910390fd5b611b406001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084611d8a565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b9d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc1919061243d565b60078054919250600160401b9091046001600160401b0316906008611be58361273f565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508484604051611c1a929190612909565b604051908190038120611c33918390429060200161276c565b60408051808303601f190181529181528151602092830120600754600160401b90046001600160401b03165f9081526006909352912055323303611cc2576007546040805183815233602082015260609181018290525f91810191909152600160401b9091046001600160401b0316905f805160206129908339815191529060800160405180910390a2611d0c565b600760089054906101000a90046001600160401b03166001600160401b03165f8051602061299083398151915282338888604051611d039493929190612918565b60405180910390a25b5050505050565b6001600160a01b03163b151590565b6040516001600160a01b038316602482015260448101829052611d8590849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611dc8565b505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611dc29085906323b872dd60e01b90608401611d4e565b50505050565b5f611e1c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611e999092919063ffffffff16565b805190915015611d855780806020019051810190611e3a9190612661565b611d855760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610815565b6060611ea784845f85611eaf565b949350505050565b606082471015611f105760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610815565b5f80866001600160a01b03168587604051611f2b919061295e565b5f6040518083038185875af1925050503d805f8114611f65576040519150601f19603f3d011682016040523d82523d5f602084013e611f6a565b606091505b5091509150611f7b87838387611f86565b979650505050505050565b60608315611ff25782515f03611feb57611f9f85611d13565b611feb5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610815565b5081611ea7565b611ea783838151156120075781518083602001fd5b8060405162461bcd60e51b8152600401610815919061206e565b5f5b8381101561203b578181015183820152602001612023565b50505f910152565b5f815180845261205a816020860160208601612021565b601f01601f19169290920160200192915050565b602081525f6120806020830184612043565b9392505050565b6001600160a01b0391909116815260200190565b6001600160401b03811681146120af575f80fd5b50565b80356001600160a01b03811681146120c8575f80fd5b919050565b5f805f606084860312156120df575f80fd5b83356120ea8161209b565b9250602084013591506120ff604085016120b2565b90509250925092565b803563ffffffff811681146120c8575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261213e575f80fd5b81356001600160401b03808211156121585761215861211b565b604051601f8301601f19908116603f011681019082821181831017156121805761218061211b565b81604052838152866020858801011115612198575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a0312156121cd575f80fd5b6121d6886120b2565b96506121e4602089016120b2565b95506121f260408901612108565b9450612200606089016120b2565b935061220e60808901612108565b925060a08801356001600160401b0380821115612229575f80fd5b6122358b838c0161212f565b935060c08a013591508082111561224a575f80fd5b506122578a828b0161212f565b91505092959891949750929550565b5f60208284031215612276575f80fd5b81356120808161209b565b5f8083601f840112612291575f80fd5b5081356001600160401b038111156122a7575f80fd5b6020830191508360208260051b85010111156122c1575f80fd5b9250929050565b5f805f604084860312156122da575f80fd5b83356001600160401b038111156122ef575f80fd5b6122fb86828701612281565b90945092506120ff9050602085016120b2565b5f6020828403121561231e575f80fd5b612080826120b2565b5f805f60608486031215612339575f80fd5b61234284612108565b9250612350602085016120b2565b91506120ff60408501612108565b5f6020828403121561236e575f80fd5b81356001600160401b03811115612383575f80fd5b611ea78482850161212f565b5f80602083850312156123a0575f80fd5b82356001600160401b038111156123b5575f80fd5b6123c185828601612281565b90969095509350505050565b5f805f604084860312156123df575f80fd5b83356001600160401b03808211156123f5575f80fd5b818601915086601f830112612408575f80fd5b813581811115612416575f80fd5b876020828501011115612427575f80fd5b6020928301989097509590910135949350505050565b5f6020828403121561244d575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561248857612488612454565b5092915050565b5f826124a957634e487b7160e01b5f52601260045260245ffd5b500490565b600181811c908216806124c257607f821691505b6020821081036124e057634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115611d85575f81815260208120601f850160051c8101602086101561250c5750805b601f850160051c820191505b8181101561252b57828155600101612518565b505050505050565b81516001600160401b0381111561254c5761254c61211b565b6125608161255a84546124ae565b846124e6565b602080601f831160018114612593575f841561257c5750858301515b5f19600386901b1c1916600185901b17855561252b565b5f85815260208120601f198616915b828110156125c1578886015182559484019460019091019084016125a2565b50858210156125de57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b6001600160401b03929092168252602082015260400190565b5f60208284031215612656575f80fd5b81516120808161209b565b5f60208284031215612671575f80fd5b81518015158114612080575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e198336030181126126a8575f80fd5b9190910192915050565b5f608082360312156126c2575f80fd5b604051608081016001600160401b0380821183831017156126e5576126e561211b565b8160405284359150808211156126f9575f80fd5b506127063682860161212f565b8252506020830135602082015260408301356127218161209b565b604082015260608301356127348161209b565b606082015292915050565b5f6001600160401b038281166002600160401b0319810161276257612762612454565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b5f600182016127a0576127a0612454565b5060010190565b818103818111156127ba576127ba612454565b92915050565b80820281158282048414176127ba576127ba612454565b5f83516127e8818460208801612021565b8351908301906127fc818360208801612021565b01949350505050565b5f8651612816818460208b01612021565b9190910194855250602084019290925260f81b6001600160f81b03199081166040840152166041820152604201919050565b808201808211156127ba576127ba612454565b5f8235605e198336030181126126a8575f80fd5b5f6060823603121561287f575f80fd5b604051606081016001600160401b0380821183831017156128a2576128a261211b565b8160405284359150808211156128b6575f80fd5b506128c33682860161212f565b8252506020830135602082015260408301356128de8161209b565b604082015292915050565b6001600160401b0381811683821601908082111561248857612488612454565b818382375f9101908152919050565b8481526001600160a01b03841660208201526060604082018190528101829052818360808301375f818301608090810191909152601f909201601f191601019392505050565b5f82516126a881846020870161202156fe303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fcef94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931f8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a2646970667358221220f61c4458ce2cc81c093654c64779ca227a96bac01a14a4cc5dc7cfc4f0ae66fd64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106101b4575f3560e01c8062d0295d146101b8578063107bf28c146101d357806319d8ac61146101e857806326782247146102135780632b35b3ac1461023357806332c2d153146102505780633c351e10146102655780633cbc795b1461027d57806340b5de6c146102a957806345605267146102d157806347ebf108146102eb57806349b7b802146102fe5780634e48770614610325578063542028d5146103385780635e9145c9146103405780635ec91958146103535780636b8616ce1461035b5780636e05d2cd1461037a5780636ff512cc146103835780638c3d73011461039657806399af03971461039e5780639e001877146103b1578063a3c573eb146103cc578063ada8f919146103f3578063b0afe15414610406578063c754c7ed14610412578063c89e42df1461042c578063cfa8ed471461043f578063d02103ca14610452578063d690be3114610479578063d7bc90ff14610481578063d8d1091b1461048c578063e46761c41461049f578063e7a7ed02146104c6578063eaeb077b146104e0578063f35dda47146104f3578063f851a4401461050d575b5f80fd5b6101c0610525565b6040519081526020015b60405180910390f35b6101db610608565b6040516101ca919061206e565b6007546101fb906001600160401b031681565b6040516001600160401b0390911681526020016101ca565b600154610226906001600160a01b031681565b6040516101ca9190612087565b6008546102409060ff1681565b60405190151581526020016101ca565b61026361025e3660046120cd565b610694565b005b6008546102269061010090046001600160a01b031681565b60085461029490600160a81b900463ffffffff1681565b60405163ffffffff90911681526020016101ca565b6102b86001600160f81b031981565b6040516001600160f81b031990911681526020016101ca565b6007546101fb90600160801b90046001600160401b031681565b6102636102f93660046121b7565b61072f565b6102267f000000000000000000000000000000000000000000000000000000000000000081565b610263610333366004612266565b610a95565b6101db610c09565b61026361034e3660046122c8565b610c16565b610263611286565b6101c0610369366004612266565b60066020525f908152604090205481565b6101c060055481565b61026361039136600461230e565b611311565b61026361138c565b6101db6103ac366004612327565b611418565b61022673a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6102267f000000000000000000000000000000000000000000000000000000000000000081565b61026361040136600461230e565b61159f565b6101c06405ca1ab1e081565b6007546101fb90600160c01b90046001600160401b031681565b61026361043a36600461235e565b61161a565b600254610226906001600160a01b031681565b6102267f000000000000000000000000000000000000000000000000000000000000000081565b6101db611686565b6101c0635ca1ab1e81565b61026361049a36600461238f565b6116a2565b6102267f000000000000000000000000000000000000000000000000000000000000000081565b6007546101fb90600160401b90046001600160401b031681565b6102636104ee3660046123cd565b611a21565b6104fb601b81565b60405160ff90911681526020016101ca565b5f54610226906201000090046001600160a01b031681565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016105739190612087565b602060405180830381865afa15801561058e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105b2919061243d565b6007549091505f906105dd906001600160401b03600160801b8204811691600160401b900416612468565b6001600160401b03169050805f036105f7575f9250505090565b610601818361248f565b9250505090565b60048054610615906124ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610641906124ae565b801561068c5780601f106106635761010080835404028352916020019161068c565b820191905f5260205f20905b81548152906001019060200180831161066f57829003601f168201915b505050505081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146106dd57604051631736745960e31b815260040160405180910390fd5b806001600160a01b0316836001600160401b03167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59668460405161072291815260200190565b60405180910390a3505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461077857604051631736745960e31b815260040160405180910390fd5b5f54610100900460ff161580801561079657505f54600160ff909116105b806107b657506107a530611d13565b1580156107b657505f5460ff166001145b61081e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561083f575f805461ff0019166101001790555b5f805462010000600160b01b031916620100006001600160a01b038b81169190910291909117909155600280546001600160a01b031916918916919091179055600361088b8482612533565b5060046108988382612533565b50600780546001600160c01b0316610d2f60c71b1790556001600160a01b0385166108e25763ffffffff8416156108e257604051630d43a60960e11b815260040160405180910390fd5b60088054610100600160c81b0319166101006001600160a01b0388160263ffffffff60a81b191617600160a81b63ffffffff8716021790555f610926878787611418565b90505f818051906020012090505f4290505f805f1b835f801b848e6040516020016109559594939291906125ee565b60408051808303601f19018152908290528051602090910120600780546001600160401b0319166001600160401b0386161790556005819055639a908e7360e01b825291505f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639a908e73906109de90600190869060040161262d565b6020604051808303815f875af11580156109fa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a1e9190612646565b6040519091506001600160401b038216905f80516020612970833981519152905f90a250505050508015610a8b575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b5f546201000090046001600160a01b03163314610ac557604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610af25760405163f5e37f2f60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b729190612661565b610bac576007546001600160401b03600160c01b909104811690821610610bac5760405163f5e37f2f60e01b815260040160405180910390fd5b600780546001600160c01b0316600160c01b6001600160401b038416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b60038054610615906124ae565b6002546001600160a01b03163314610c41576040516311e7be1560e01b815260040160405180910390fd5b815f819003610c635760405163cb591a5f60e01b815260040160405180910390fd5b6103e8811115610c8657604051635acfba9d60e11b815260040160405180910390fd5b6007546005546001600160401b0380831692600160801b90041690815f5b85811015610f54575f898983818110610cbf57610cbf612680565b9050602002810190610cd19190612694565b610cda906126b2565b805180516020909101206060820151919250906001600160401b031615610dcf5785610d058161273f565b9650505f8183602001518460600151604051602001610d269392919061276c565b60408051601f1981840301815291815281516020928301206001600160401b038a165f90815260069093529120549091508114610d765760405163671ebaaf60e11b815260040160405180910390fd5b82606001516001600160401b031683604001516001600160401b03161015610db157604051633fbd5c3960e11b815260040160405180910390fd5b506001600160401b0386165f90815260066020526040812055610eb1565b602082015115801590610e6d575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303815f875af1158015610e47573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e6b919061243d565b155b15610e8b576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c01015610eb1576040516328a69b1f60e21b815260040160405180910390fd5b866001600160401b031682604001516001600160401b03161080610ee157504282604001516001600160401b0316115b15610eff576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518c604051602001610f209594939291906125ee565b6040516020818303038152906040528051906020012094508160400151965050508080610f4c9061278f565b915050610ca4565b506007546001600160401b03600160401b90910481169084161115610f8c5760405163c630a00d60e01b815260040160405180910390fd5b600780546001600160401b0319166001600160401b03868116919091179091556005839055859082811690851614611077575f610fc98386612468565b9050610fde6001600160401b038216836127a7565b91506110517f0000000000000000000000000000000000000000000000000000000000000000826001600160401b0316611016610525565b61102091906127c0565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190611d22565b5060078054600160801b600160c01b031916600160801b6001600160401b038716021790555b611159337f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061111d919061243d565b61112791906127c0565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190611d8a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156111b1575f80fd5b505af11580156111c3573d5f803e3d5ffd5b5050604051639a908e7360e01b81525f92506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150639a908e7390611217908a90889060040161262d565b6020604051808303815f875af1158015611233573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112579190612646565b6040519091506001600160401b038216905f80516020612970833981519152905f90a250505050505050505050565b5f546201000090046001600160a01b031633146112b657604051634755657960e01b815260040160405180910390fd5b60085460ff16156112da5760405163f6ba91a160e01b815260040160405180910390fd5b6008805460ff191660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f546201000090046001600160a01b0316331461134157604051634755657960e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383161790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610bfe908390612087565b6001546001600160a01b031633146113b75760405163d1ec4b2360e01b815260040160405180910390fd5b6001545f8054620100006001600160a01b0390931692830262010000600160b01b03199091161790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9161140e91612087565b60405180910390a1565b60605f6040518060600160405280602181526020016129b06021913960405163ffffffff80881660248301526001600160a01b03871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa60848201525f60a482015260c40160408051601f19818403018152918152602080830180516001600160e01b03166369a3b57f60e11b17905290516114b6939291016127d7565b60408051601f1981840301815282825280516020808301919091205f80865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015611523573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166115575760405163668b0cb360e11b815260040160405180910390fd5b6040515f906115849084906405ca1ab1e090635ca1ab1e90601b906001600160f81b031990602001612805565b60408051808303601f19018152919052979650505050505050565b5f546201000090046001600160a01b031633146115cf57604051634755657960e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610bfe908390612087565b5f546201000090046001600160a01b0316331461164a57604051634755657960e01b815260040160405180910390fd5b60036116568282612533565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610bfe919061206e565b6040518060600160405280602181526020016129b06021913981565b60085460ff166116c5576040516324eff8c360e01b815260040160405180910390fd5b805f8190036116e75760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561170a57604051635acfba9d60e11b815260040160405180910390fd5b6007546001600160401b03600160401b8204811691611732918491600160801b900416612848565b11156117515760405163c630a00d60e01b815260040160405180910390fd5b600754600554600160801b9091046001600160401b0316905f5b838110156118ea575f86868381811061178657611786612680565b9050602002810190611798919061285b565b6117a19061286f565b9050836117ad8161273f565b825180516020918201208185015160408087015190519499509194505f936117d8938693910161276c565b60408051601f1981840301815291815281516020928301206001600160401b0389165f908152600690935291205490915081146118285760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b0386165f9081526006602052604081205561184b6001886127a7565b840361189f5742600760189054906101000a90046001600160401b0316846040015161187791906128e9565b6001600160401b0316111561189f5760405163c44a082160e01b815260040160405180910390fd5b8482846020015142336040516020016118bc9594939291906125ee565b60405160208183030381529060405280519060200120945050505080806118e29061278f565b91505061176b565b506119187f000000000000000000000000000000000000000000000000000000000000000084611016610525565b6005819055600780546001600160401b03848116600160801b026001600160401b03600160801b03600160c01b0319909216429190911617179055604051639a908e7360e01b81525f906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906119a3908790869060040161262d565b6020604051808303815f875af11580156119bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119e39190612646565b6040519091506001600160401b038216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a2505050505050565b60085460ff16611a44576040516324eff8c360e01b815260040160405180910390fd5b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015611aa1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ac5919061243d565b905081811115611ae857604051632354600f60e01b815260040160405180910390fd5b611388831115611b0b576040516328a69b1f60e21b815260040160405180910390fd5b611b406001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084611d8a565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b9d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc1919061243d565b60078054919250600160401b9091046001600160401b0316906008611be58361273f565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508484604051611c1a929190612909565b604051908190038120611c33918390429060200161276c565b60408051808303601f190181529181528151602092830120600754600160401b90046001600160401b03165f9081526006909352912055323303611cc2576007546040805183815233602082015260609181018290525f91810191909152600160401b9091046001600160401b0316905f805160206129908339815191529060800160405180910390a2611d0c565b600760089054906101000a90046001600160401b03166001600160401b03165f8051602061299083398151915282338888604051611d039493929190612918565b60405180910390a25b5050505050565b6001600160a01b03163b151590565b6040516001600160a01b038316602482015260448101829052611d8590849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611dc8565b505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611dc29085906323b872dd60e01b90608401611d4e565b50505050565b5f611e1c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611e999092919063ffffffff16565b805190915015611d855780806020019051810190611e3a9190612661565b611d855760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610815565b6060611ea784845f85611eaf565b949350505050565b606082471015611f105760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610815565b5f80866001600160a01b03168587604051611f2b919061295e565b5f6040518083038185875af1925050503d805f8114611f65576040519150601f19603f3d011682016040523d82523d5f602084013e611f6a565b606091505b5091509150611f7b87838387611f86565b979650505050505050565b60608315611ff25782515f03611feb57611f9f85611d13565b611feb5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610815565b5081611ea7565b611ea783838151156120075781518083602001fd5b8060405162461bcd60e51b8152600401610815919061206e565b5f5b8381101561203b578181015183820152602001612023565b50505f910152565b5f815180845261205a816020860160208601612021565b601f01601f19169290920160200192915050565b602081525f6120806020830184612043565b9392505050565b6001600160a01b0391909116815260200190565b6001600160401b03811681146120af575f80fd5b50565b80356001600160a01b03811681146120c8575f80fd5b919050565b5f805f606084860312156120df575f80fd5b83356120ea8161209b565b9250602084013591506120ff604085016120b2565b90509250925092565b803563ffffffff811681146120c8575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261213e575f80fd5b81356001600160401b03808211156121585761215861211b565b604051601f8301601f19908116603f011681019082821181831017156121805761218061211b565b81604052838152866020858801011115612198575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a0312156121cd575f80fd5b6121d6886120b2565b96506121e4602089016120b2565b95506121f260408901612108565b9450612200606089016120b2565b935061220e60808901612108565b925060a08801356001600160401b0380821115612229575f80fd5b6122358b838c0161212f565b935060c08a013591508082111561224a575f80fd5b506122578a828b0161212f565b91505092959891949750929550565b5f60208284031215612276575f80fd5b81356120808161209b565b5f8083601f840112612291575f80fd5b5081356001600160401b038111156122a7575f80fd5b6020830191508360208260051b85010111156122c1575f80fd5b9250929050565b5f805f604084860312156122da575f80fd5b83356001600160401b038111156122ef575f80fd5b6122fb86828701612281565b90945092506120ff9050602085016120b2565b5f6020828403121561231e575f80fd5b612080826120b2565b5f805f60608486031215612339575f80fd5b61234284612108565b9250612350602085016120b2565b91506120ff60408501612108565b5f6020828403121561236e575f80fd5b81356001600160401b03811115612383575f80fd5b611ea78482850161212f565b5f80602083850312156123a0575f80fd5b82356001600160401b038111156123b5575f80fd5b6123c185828601612281565b90969095509350505050565b5f805f604084860312156123df575f80fd5b83356001600160401b03808211156123f5575f80fd5b818601915086601f830112612408575f80fd5b813581811115612416575f80fd5b876020828501011115612427575f80fd5b6020928301989097509590910135949350505050565b5f6020828403121561244d575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561248857612488612454565b5092915050565b5f826124a957634e487b7160e01b5f52601260045260245ffd5b500490565b600181811c908216806124c257607f821691505b6020821081036124e057634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115611d85575f81815260208120601f850160051c8101602086101561250c5750805b601f850160051c820191505b8181101561252b57828155600101612518565b505050505050565b81516001600160401b0381111561254c5761254c61211b565b6125608161255a84546124ae565b846124e6565b602080601f831160018114612593575f841561257c5750858301515b5f19600386901b1c1916600185901b17855561252b565b5f85815260208120601f198616915b828110156125c1578886015182559484019460019091019084016125a2565b50858210156125de57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b6001600160401b03929092168252602082015260400190565b5f60208284031215612656575f80fd5b81516120808161209b565b5f60208284031215612671575f80fd5b81518015158114612080575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e198336030181126126a8575f80fd5b9190910192915050565b5f608082360312156126c2575f80fd5b604051608081016001600160401b0380821183831017156126e5576126e561211b565b8160405284359150808211156126f9575f80fd5b506127063682860161212f565b8252506020830135602082015260408301356127218161209b565b604082015260608301356127348161209b565b606082015292915050565b5f6001600160401b038281166002600160401b0319810161276257612762612454565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b5f600182016127a0576127a0612454565b5060010190565b818103818111156127ba576127ba612454565b92915050565b80820281158282048414176127ba576127ba612454565b5f83516127e8818460208801612021565b8351908301906127fc818360208801612021565b01949350505050565b5f8651612816818460208b01612021565b9190910194855250602084019290925260f81b6001600160f81b03199081166040840152166041820152604201919050565b808201808211156127ba576127ba612454565b5f8235605e198336030181126126a8575f80fd5b5f6060823603121561287f575f80fd5b604051606081016001600160401b0380821183831017156128a2576128a261211b565b8160405284359150808211156128b6575f80fd5b506128c33682860161212f565b8252506020830135602082015260408301356128de8161209b565b604082015292915050565b6001600160401b0381811683821601908082111561248857612488612454565b818382375f9101908152919050565b8481526001600160a01b03841660208201526060604082018190528101829052818360808301375f818301608090810191909152601f909201601f191601019392505050565b5f82516126a881846020870161202156fe303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fcef94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931f8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a2646970667358221220f61c4458ce2cc81c093654c64779ca227a96bac01a14a4cc5dc7cfc4f0ae66fd64736f6c63430008140033", + "bytecode": "0x6101006040523480156200001257600080fd5b5060405162002c5238038062002c52833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e051612ac16200019160003960008181610306015281816106a30152818161073e015281816109b801528181610b1501528181611012015281816110aa015281816110cc015281816112140152818161193c015281816119b90152611a990152600081816103d5015261118a01526000818161045b01528181610e220152611b980152600081816104a80152818161052f01528181611057015281816111600152611b6c0152612ac16000f3fe608060405234801561001057600080fd5b50600436106101b65760003560e01c8062d0295d146101bb578063107bf28c146101d657806319d8ac61146101eb57806326782247146102165780632b35b3ac1461023657806332c2d153146102535780633c351e10146102685780633cbc795b1461028057806340b5de6c146102ac57806345605267146102d457806347ebf108146102ee57806349b7b802146103015780634e48770614610328578063542028d51461033b5780635e9145c9146103435780635ec91958146103565780636b8616ce1461035e5780636e05d2cd1461037e5780636ff512cc146103875780638c3d73011461039a57806399af0397146103a25780639e001877146103b5578063a3c573eb146103d0578063ada8f919146103f7578063b0afe1541461040a578063c754c7ed14610416578063c89e42df14610430578063cfa8ed4714610443578063d02103ca14610456578063d690be311461047d578063d7bc90ff14610485578063d8d1091b14610490578063e46761c4146104a3578063e7a7ed02146104ca578063eaeb077b146104e4578063f35dda47146104f7578063f851a44014610511575b600080fd5b6101c361052a565b6040519081526020015b60405180910390f35b6101de610613565b6040516101cd91906120d3565b6007546101fe906001600160401b031681565b6040516001600160401b0390911681526020016101cd565b600154610229906001600160a01b031681565b6040516101cd91906120ed565b6008546102439060ff1681565b60405190151581526020016101cd565b610266610261366004612135565b6106a1565b005b6008546102299061010090046001600160a01b031681565b60085461029790600160a81b900463ffffffff1681565b60405163ffffffff90911681526020016101cd565b6102bb6001600160f81b031981565b6040516001600160f81b031990911681526020016101cd565b6007546101fe90600160801b90046001600160401b031681565b6102666102fc366004612229565b61073c565b6102297f000000000000000000000000000000000000000000000000000000000000000081565b6102666103363660046122df565b610ab5565b6101de610c2c565b610266610351366004612347565b610c39565b6102666112c0565b6101c361036c3660046122df565b60066020526000908152604090205481565b6101c360055481565b610266610395366004612391565b61134d565b6102666113c9565b6101de6103b03660046123ac565b611456565b61022973a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6102297f000000000000000000000000000000000000000000000000000000000000000081565b610266610405366004612391565b6115e3565b6101c36405ca1ab1e081565b6007546101fe90600160c01b90046001600160401b031681565b61026661043e3660046123e6565b61165f565b600254610229906001600160a01b031681565b6102297f000000000000000000000000000000000000000000000000000000000000000081565b6101de6116cc565b6101c3635ca1ab1e81565b61026661049e36600461241a565b6116e8565b6102297f000000000000000000000000000000000000000000000000000000000000000081565b6007546101fe90600160401b90046001600160401b031681565b6102666104f236600461245b565b611a72565b6104ff601b81565b60405160ff90911681526020016101cd565b600054610229906201000090046001600160a01b031681565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161057991906120ed565b602060405180830381865afa158015610596573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ba91906124d2565b6007549091506000906105e6906001600160401b03600160801b8204811691600160401b900416612501565b6001600160401b03169050806000036106025760009250505090565b61060c8183612528565b9250505090565b600480546106209061254a565b80601f016020809104026020016040519081016040528092919081815260200182805461064c9061254a565b80156106995780601f1061066e57610100808354040283529160200191610699565b820191906000526020600020905b81548152906001019060200180831161067c57829003601f168201915b505050505081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146106ea57604051631736745960e31b815260040160405180910390fd5b806001600160a01b0316836001600160401b03167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59668460405161072f91815260200190565b60405180910390a3505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461078557604051631736745960e31b815260040160405180910390fd5b600054610100900460ff16158080156107a55750600054600160ff909116105b806107c657506107b430611d6e565b1580156107c6575060005460ff166001145b61082e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff191660011790558015610851576000805461ff0019166101001790555b6000805462010000600160b01b031916620100006001600160a01b038b81169190910291909117909155600280546001600160a01b031916918916919091179055600361089e84826125d2565b5060046108ab83826125d2565b50600780546001600160c01b0316610d2f60c71b1790556001600160a01b0385166108f55763ffffffff8416156108f557604051630d43a60960e11b815260040160405180910390fd5b60088054610100600160c81b0319166101006001600160a01b0388160263ffffffff60a81b191617600160a81b63ffffffff871602179055600061093a878787611456565b9050600081805190602001209050600042905060008060001b836000801b848e60405160200161096e959493929190612691565b60408051808303601f19018152908290528051602090910120600780546001600160401b0319166001600160401b0386161790556005819055639a908e7360e01b825291506000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639a908e73906109f89060019086906004016126d0565b6020604051808303816000875af1158015610a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3b91906126e9565b6040519091506001600160401b03821690600080516020612a2b83398151915290600090a250505050508015610aab576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6000546201000090046001600160a01b03163314610ae657604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610b135760405163f5e37f2f60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b959190612706565b610bcf576007546001600160401b03600160c01b909104811690821610610bcf5760405163f5e37f2f60e01b815260040160405180910390fd5b600780546001600160c01b0316600160c01b6001600160401b038416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546106209061254a565b6002546001600160a01b03163314610c64576040516311e7be1560e01b815260040160405180910390fd5b816000819003610c875760405163cb591a5f60e01b815260040160405180910390fd5b6103e8811115610caa57604051635acfba9d60e11b815260040160405180910390fd5b6007546005546001600160401b0380831692600160801b900416908160005b85811015610f80576000898983818110610ce557610ce5612728565b9050602002810190610cf7919061273e565b610d009061275e565b805180516020909101206060820151919250906001600160401b031615610df85785610d2b816127ee565b96505060008183602001518460600151604051602001610d4d9392919061281c565b60408051601f1981840301815291815281516020928301206001600160401b038a16600090815260069093529120549091508114610d9e5760405163671ebaaf60e11b815260040160405180910390fd5b82606001516001600160401b031683604001516001600160401b03161015610dd957604051633fbd5c3960e11b815260040160405180910390fd5b506001600160401b038616600090815260066020526040812055610edd565b602082015115801590610e99575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303816000875af1158015610e73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9791906124d2565b155b15610eb7576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c01015610edd576040516328a69b1f60e21b815260040160405180910390fd5b866001600160401b031682604001516001600160401b03161080610f0d57504282604001516001600160401b0316115b15610f2b576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518c604051602001610f4c959493929190612691565b6040516020818303038152906040528051906020012094508160400151965050508080610f789061283f565b915050610cc9565b506007546001600160401b03600160401b90910481169084161115610fb85760405163c630a00d60e01b815260040160405180910390fd5b600780546001600160401b0319166001600160401b038681169190911790915560058390558590828116908516146110a4576000610ff68386612501565b905061100b6001600160401b03821683612858565b915061107e7f0000000000000000000000000000000000000000000000000000000000000000826001600160401b031661104361052a565b61104d9190612871565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190611d7d565b5060078054600160801b600160c01b031916600160801b6001600160401b038716021790555b611188337f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611128573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114c91906124d2565b6111569190612871565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190611de5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156111e357600080fd5b505af11580156111f7573d6000803e3d6000fd5b5050604051639a908e7360e01b8152600092506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150639a908e739061124c908a9088906004016126d0565b6020604051808303816000875af115801561126b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128f91906126e9565b6040519091506001600160401b03821690600080516020612a2b83398151915290600090a250505050505050505050565b6000546201000090046001600160a01b031633146112f157604051634755657960e01b815260040160405180910390fd5b60085460ff16156113155760405163f6ba91a160e01b815260040160405180910390fd5b6008805460ff191660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b6000546201000090046001600160a01b0316331461137e57604051634755657960e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383161790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610c219083906120ed565b6001546001600160a01b031633146113f45760405163d1ec4b2360e01b815260040160405180910390fd5b60015460008054620100006001600160a01b0390931692830262010000600160b01b03199091161790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9161144c916120ed565b60405180910390a1565b60606000604051806060016040528060218152602001612a6b6021913960405163ffffffff80881660248301526001600160a01b03871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa6084820152600060a482015260c40160408051601f19818403018152918152602080830180516001600160e01b03166369a3b57f60e11b17905290516114f693929101612888565b60408051601f198184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015611566573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661159a5760405163668b0cb360e11b815260040160405180910390fd5b6040516000906115c89084906405ca1ab1e090635ca1ab1e90601b906001600160f81b0319906020016128b7565b60408051808303601f19018152919052979650505050505050565b6000546201000090046001600160a01b0316331461161457604051634755657960e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610c219083906120ed565b6000546201000090046001600160a01b0316331461169057604051634755657960e01b815260040160405180910390fd5b600361169c82826125d2565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c2191906120d3565b604051806060016040528060218152602001612a6b6021913981565b60085460ff1661170b576040516324eff8c360e01b815260040160405180910390fd5b80600081900361172e5760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561175157604051635acfba9d60e11b815260040160405180910390fd5b6007546001600160401b03600160401b8204811691611779918491600160801b9004166128fb565b11156117985760405163c630a00d60e01b815260040160405180910390fd5b600754600554600160801b9091046001600160401b03169060005b838110156119365760008686838181106117cf576117cf612728565b90506020028101906117e1919061290e565b6117ea90612924565b9050836117f6816127ee565b82518051602091820120818501516040808701519051949950919450600093611822938693910161281c565b60408051601f1981840301815291815281516020928301206001600160401b0389166000908152600690935291205490915081146118735760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b038616600090815260066020526040812055611897600188612858565b84036118eb5742600760189054906101000a90046001600160401b031684604001516118c391906129a1565b6001600160401b031611156118eb5760405163c44a082160e01b815260040160405180910390fd5b848284602001514233604051602001611908959493929190612691565b604051602081830303815290604052805190602001209450505050808061192e9061283f565b9150506117b3565b506119647f00000000000000000000000000000000000000000000000000000000000000008461104361052a565b6005819055600780546001600160401b03848116600160801b026001600160401b03600160801b03600160c01b0319909216429190911617179055604051639a908e7360e01b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906119f090879086906004016126d0565b6020604051808303816000875af1158015611a0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3391906126e9565b6040519091506001600160401b038216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16611a95576040516324eff8c360e01b815260040160405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015611af5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1991906124d2565b905081811115611b3c57604051632354600f60e01b815260040160405180910390fd5b611388831115611b5f576040516328a69b1f60e21b815260040160405180910390fd5b611b946001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084611de5565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1891906124d2565b60078054919250600160401b9091046001600160401b0316906008611c3c836127ee565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508484604051611c719291906129c1565b604051908190038120611c8a918390429060200161281c565b60408051808303601f190181529181528151602092830120600754600160401b90046001600160401b031660009081526006909352912055323303611d1c57600754604080518381523360208201526060918101829052600091810191909152600160401b9091046001600160401b031690600080516020612a4b8339815191529060800160405180910390a2611d67565b600760089054906101000a90046001600160401b03166001600160401b0316600080516020612a4b83398151915282338888604051611d5e94939291906129d1565b60405180910390a25b5050505050565b6001600160a01b03163b151590565b6040516001600160a01b038316602482015260448101829052611de090849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611e23565b505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611e1d9085906323b872dd60e01b90608401611da9565b50505050565b6000611e78826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ef59092919063ffffffff16565b805190915015611de05780806020019051810190611e969190612706565b611de05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610825565b6060611f048484600085611f0c565b949350505050565b606082471015611f6d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610825565b600080866001600160a01b03168587604051611f899190612a18565b60006040518083038185875af1925050503d8060008114611fc6576040519150601f19603f3d011682016040523d82523d6000602084013e611fcb565b606091505b5091509150611fdc87838387611fe7565b979650505050505050565b6060831561205457825160000361204d5761200185611d6e565b61204d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610825565b5081611f04565b611f0483838151156120695781518083602001fd5b8060405162461bcd60e51b815260040161082591906120d3565b60005b8381101561209e578181015183820152602001612086565b50506000910152565b600081518084526120bf816020860160208601612083565b601f01601f19169290920160200192915050565b6020815260006120e660208301846120a7565b9392505050565b6001600160a01b0391909116815260200190565b6001600160401b038116811461211657600080fd5b50565b80356001600160a01b038116811461213057600080fd5b919050565b60008060006060848603121561214a57600080fd5b833561215581612101565b92506020840135915061216a60408501612119565b90509250925092565b803563ffffffff8116811461213057600080fd5b634e487b7160e01b600052604160045260246000fd5b600082601f8301126121ae57600080fd5b81356001600160401b03808211156121c8576121c8612187565b604051601f8301601f19908116603f011681019082821181831017156121f0576121f0612187565b8160405283815286602085880101111561220957600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121561224457600080fd5b61224d88612119565b965061225b60208901612119565b955061226960408901612173565b945061227760608901612119565b935061228560808901612173565b925060a08801356001600160401b03808211156122a157600080fd5b6122ad8b838c0161219d565b935060c08a01359150808211156122c357600080fd5b506122d08a828b0161219d565b91505092959891949750929550565b6000602082840312156122f157600080fd5b81356120e681612101565b60008083601f84011261230e57600080fd5b5081356001600160401b0381111561232557600080fd5b6020830191508360208260051b850101111561234057600080fd5b9250929050565b60008060006040848603121561235c57600080fd5b83356001600160401b0381111561237257600080fd5b61237e868287016122fc565b909450925061216a905060208501612119565b6000602082840312156123a357600080fd5b6120e682612119565b6000806000606084860312156123c157600080fd5b6123ca84612173565b92506123d860208501612119565b915061216a60408501612173565b6000602082840312156123f857600080fd5b81356001600160401b0381111561240e57600080fd5b611f048482850161219d565b6000806020838503121561242d57600080fd5b82356001600160401b0381111561244357600080fd5b61244f858286016122fc565b90969095509350505050565b60008060006040848603121561247057600080fd5b83356001600160401b038082111561248757600080fd5b818601915086601f83011261249b57600080fd5b8135818111156124aa57600080fd5b8760208285010111156124bc57600080fd5b6020928301989097509590910135949350505050565b6000602082840312156124e457600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03828116828216039080821115612521576125216124eb565b5092915050565b60008261254557634e487b7160e01b600052601260045260246000fd5b500490565b600181811c9082168061255e57607f821691505b60208210810361257e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115611de057600081815260208120601f850160051c810160208610156125ab5750805b601f850160051c820191505b818110156125ca578281556001016125b7565b505050505050565b81516001600160401b038111156125eb576125eb612187565b6125ff816125f9845461254a565b84612584565b602080601f831160018114612634576000841561261c5750858301515b600019600386901b1c1916600185901b1785556125ca565b600085815260208120601f198616915b8281101561266357888601518255948401946001909101908401612644565b50858210156126815787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b6001600160401b03929092168252602082015260400190565b6000602082840312156126fb57600080fd5b81516120e681612101565b60006020828403121561271857600080fd5b815180151581146120e657600080fd5b634e487b7160e01b600052603260045260246000fd5b60008235607e1983360301811261275457600080fd5b9190910192915050565b60006080823603121561277057600080fd5b604051608081016001600160401b03808211838310171561279357612793612187565b8160405284359150808211156127a857600080fd5b506127b53682860161219d565b8252506020830135602082015260408301356127d081612101565b604082015260608301356127e381612101565b606082015292915050565b60006001600160401b038281166002600160401b03198101612812576128126124eb565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b600060018201612851576128516124eb565b5060010190565b8181038181111561286b5761286b6124eb565b92915050565b808202811582820484141761286b5761286b6124eb565b6000835161289a818460208801612083565b8351908301906128ae818360208801612083565b01949350505050565b600086516128c9818460208b01612083565b9190910194855250602084019290925260f81b6001600160f81b03199081166040840152166041820152604201919050565b8082018082111561286b5761286b6124eb565b60008235605e1983360301811261275457600080fd5b60006060823603121561293657600080fd5b604051606081016001600160401b03808211838310171561295957612959612187565b81604052843591508082111561296e57600080fd5b5061297b3682860161219d565b82525060208301356020820152604083013561299681612101565b604082015292915050565b6001600160401b03818116838216019080821115612521576125216124eb565b8183823760009101908152919050565b8481526001600160a01b03841660208201526060604082018190528101829052818360808301376000818301608090810191909152601f909201601f191601019392505050565b6000825161275481846020870161208356fe303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fcef94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931f8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a2646970667358221220c650ce1567bb7660d93084dd33c284f37641ef24af0ba80a7f5c878ce8807cde64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101b65760003560e01c8062d0295d146101bb578063107bf28c146101d657806319d8ac61146101eb57806326782247146102165780632b35b3ac1461023657806332c2d153146102535780633c351e10146102685780633cbc795b1461028057806340b5de6c146102ac57806345605267146102d457806347ebf108146102ee57806349b7b802146103015780634e48770614610328578063542028d51461033b5780635e9145c9146103435780635ec91958146103565780636b8616ce1461035e5780636e05d2cd1461037e5780636ff512cc146103875780638c3d73011461039a57806399af0397146103a25780639e001877146103b5578063a3c573eb146103d0578063ada8f919146103f7578063b0afe1541461040a578063c754c7ed14610416578063c89e42df14610430578063cfa8ed4714610443578063d02103ca14610456578063d690be311461047d578063d7bc90ff14610485578063d8d1091b14610490578063e46761c4146104a3578063e7a7ed02146104ca578063eaeb077b146104e4578063f35dda47146104f7578063f851a44014610511575b600080fd5b6101c361052a565b6040519081526020015b60405180910390f35b6101de610613565b6040516101cd91906120d3565b6007546101fe906001600160401b031681565b6040516001600160401b0390911681526020016101cd565b600154610229906001600160a01b031681565b6040516101cd91906120ed565b6008546102439060ff1681565b60405190151581526020016101cd565b610266610261366004612135565b6106a1565b005b6008546102299061010090046001600160a01b031681565b60085461029790600160a81b900463ffffffff1681565b60405163ffffffff90911681526020016101cd565b6102bb6001600160f81b031981565b6040516001600160f81b031990911681526020016101cd565b6007546101fe90600160801b90046001600160401b031681565b6102666102fc366004612229565b61073c565b6102297f000000000000000000000000000000000000000000000000000000000000000081565b6102666103363660046122df565b610ab5565b6101de610c2c565b610266610351366004612347565b610c39565b6102666112c0565b6101c361036c3660046122df565b60066020526000908152604090205481565b6101c360055481565b610266610395366004612391565b61134d565b6102666113c9565b6101de6103b03660046123ac565b611456565b61022973a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6102297f000000000000000000000000000000000000000000000000000000000000000081565b610266610405366004612391565b6115e3565b6101c36405ca1ab1e081565b6007546101fe90600160c01b90046001600160401b031681565b61026661043e3660046123e6565b61165f565b600254610229906001600160a01b031681565b6102297f000000000000000000000000000000000000000000000000000000000000000081565b6101de6116cc565b6101c3635ca1ab1e81565b61026661049e36600461241a565b6116e8565b6102297f000000000000000000000000000000000000000000000000000000000000000081565b6007546101fe90600160401b90046001600160401b031681565b6102666104f236600461245b565b611a72565b6104ff601b81565b60405160ff90911681526020016101cd565b600054610229906201000090046001600160a01b031681565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161057991906120ed565b602060405180830381865afa158015610596573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ba91906124d2565b6007549091506000906105e6906001600160401b03600160801b8204811691600160401b900416612501565b6001600160401b03169050806000036106025760009250505090565b61060c8183612528565b9250505090565b600480546106209061254a565b80601f016020809104026020016040519081016040528092919081815260200182805461064c9061254a565b80156106995780601f1061066e57610100808354040283529160200191610699565b820191906000526020600020905b81548152906001019060200180831161067c57829003601f168201915b505050505081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146106ea57604051631736745960e31b815260040160405180910390fd5b806001600160a01b0316836001600160401b03167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59668460405161072f91815260200190565b60405180910390a3505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461078557604051631736745960e31b815260040160405180910390fd5b600054610100900460ff16158080156107a55750600054600160ff909116105b806107c657506107b430611d6e565b1580156107c6575060005460ff166001145b61082e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff191660011790558015610851576000805461ff0019166101001790555b6000805462010000600160b01b031916620100006001600160a01b038b81169190910291909117909155600280546001600160a01b031916918916919091179055600361089e84826125d2565b5060046108ab83826125d2565b50600780546001600160c01b0316610d2f60c71b1790556001600160a01b0385166108f55763ffffffff8416156108f557604051630d43a60960e11b815260040160405180910390fd5b60088054610100600160c81b0319166101006001600160a01b0388160263ffffffff60a81b191617600160a81b63ffffffff871602179055600061093a878787611456565b9050600081805190602001209050600042905060008060001b836000801b848e60405160200161096e959493929190612691565b60408051808303601f19018152908290528051602090910120600780546001600160401b0319166001600160401b0386161790556005819055639a908e7360e01b825291506000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639a908e73906109f89060019086906004016126d0565b6020604051808303816000875af1158015610a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3b91906126e9565b6040519091506001600160401b03821690600080516020612a2b83398151915290600090a250505050508015610aab576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6000546201000090046001600160a01b03163314610ae657604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610b135760405163f5e37f2f60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b959190612706565b610bcf576007546001600160401b03600160c01b909104811690821610610bcf5760405163f5e37f2f60e01b815260040160405180910390fd5b600780546001600160c01b0316600160c01b6001600160401b038416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546106209061254a565b6002546001600160a01b03163314610c64576040516311e7be1560e01b815260040160405180910390fd5b816000819003610c875760405163cb591a5f60e01b815260040160405180910390fd5b6103e8811115610caa57604051635acfba9d60e11b815260040160405180910390fd5b6007546005546001600160401b0380831692600160801b900416908160005b85811015610f80576000898983818110610ce557610ce5612728565b9050602002810190610cf7919061273e565b610d009061275e565b805180516020909101206060820151919250906001600160401b031615610df85785610d2b816127ee565b96505060008183602001518460600151604051602001610d4d9392919061281c565b60408051601f1981840301815291815281516020928301206001600160401b038a16600090815260069093529120549091508114610d9e5760405163671ebaaf60e11b815260040160405180910390fd5b82606001516001600160401b031683604001516001600160401b03161015610dd957604051633fbd5c3960e11b815260040160405180910390fd5b506001600160401b038616600090815260066020526040812055610edd565b602082015115801590610e99575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303816000875af1158015610e73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9791906124d2565b155b15610eb7576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c01015610edd576040516328a69b1f60e21b815260040160405180910390fd5b866001600160401b031682604001516001600160401b03161080610f0d57504282604001516001600160401b0316115b15610f2b576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518c604051602001610f4c959493929190612691565b6040516020818303038152906040528051906020012094508160400151965050508080610f789061283f565b915050610cc9565b506007546001600160401b03600160401b90910481169084161115610fb85760405163c630a00d60e01b815260040160405180910390fd5b600780546001600160401b0319166001600160401b038681169190911790915560058390558590828116908516146110a4576000610ff68386612501565b905061100b6001600160401b03821683612858565b915061107e7f0000000000000000000000000000000000000000000000000000000000000000826001600160401b031661104361052a565b61104d9190612871565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190611d7d565b5060078054600160801b600160c01b031916600160801b6001600160401b038716021790555b611188337f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611128573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114c91906124d2565b6111569190612871565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190611de5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156111e357600080fd5b505af11580156111f7573d6000803e3d6000fd5b5050604051639a908e7360e01b8152600092506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150639a908e739061124c908a9088906004016126d0565b6020604051808303816000875af115801561126b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128f91906126e9565b6040519091506001600160401b03821690600080516020612a2b83398151915290600090a250505050505050505050565b6000546201000090046001600160a01b031633146112f157604051634755657960e01b815260040160405180910390fd5b60085460ff16156113155760405163f6ba91a160e01b815260040160405180910390fd5b6008805460ff191660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b6000546201000090046001600160a01b0316331461137e57604051634755657960e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383161790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610c219083906120ed565b6001546001600160a01b031633146113f45760405163d1ec4b2360e01b815260040160405180910390fd5b60015460008054620100006001600160a01b0390931692830262010000600160b01b03199091161790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9161144c916120ed565b60405180910390a1565b60606000604051806060016040528060218152602001612a6b6021913960405163ffffffff80881660248301526001600160a01b03871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa6084820152600060a482015260c40160408051601f19818403018152918152602080830180516001600160e01b03166369a3b57f60e11b17905290516114f693929101612888565b60408051601f198184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015611566573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661159a5760405163668b0cb360e11b815260040160405180910390fd5b6040516000906115c89084906405ca1ab1e090635ca1ab1e90601b906001600160f81b0319906020016128b7565b60408051808303601f19018152919052979650505050505050565b6000546201000090046001600160a01b0316331461161457604051634755657960e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610c219083906120ed565b6000546201000090046001600160a01b0316331461169057604051634755657960e01b815260040160405180910390fd5b600361169c82826125d2565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c2191906120d3565b604051806060016040528060218152602001612a6b6021913981565b60085460ff1661170b576040516324eff8c360e01b815260040160405180910390fd5b80600081900361172e5760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561175157604051635acfba9d60e11b815260040160405180910390fd5b6007546001600160401b03600160401b8204811691611779918491600160801b9004166128fb565b11156117985760405163c630a00d60e01b815260040160405180910390fd5b600754600554600160801b9091046001600160401b03169060005b838110156119365760008686838181106117cf576117cf612728565b90506020028101906117e1919061290e565b6117ea90612924565b9050836117f6816127ee565b82518051602091820120818501516040808701519051949950919450600093611822938693910161281c565b60408051601f1981840301815291815281516020928301206001600160401b0389166000908152600690935291205490915081146118735760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b038616600090815260066020526040812055611897600188612858565b84036118eb5742600760189054906101000a90046001600160401b031684604001516118c391906129a1565b6001600160401b031611156118eb5760405163c44a082160e01b815260040160405180910390fd5b848284602001514233604051602001611908959493929190612691565b604051602081830303815290604052805190602001209450505050808061192e9061283f565b9150506117b3565b506119647f00000000000000000000000000000000000000000000000000000000000000008461104361052a565b6005819055600780546001600160401b03848116600160801b026001600160401b03600160801b03600160c01b0319909216429190911617179055604051639a908e7360e01b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906119f090879086906004016126d0565b6020604051808303816000875af1158015611a0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3391906126e9565b6040519091506001600160401b038216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16611a95576040516324eff8c360e01b815260040160405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015611af5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1991906124d2565b905081811115611b3c57604051632354600f60e01b815260040160405180910390fd5b611388831115611b5f576040516328a69b1f60e21b815260040160405180910390fd5b611b946001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084611de5565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1891906124d2565b60078054919250600160401b9091046001600160401b0316906008611c3c836127ee565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508484604051611c719291906129c1565b604051908190038120611c8a918390429060200161281c565b60408051808303601f190181529181528151602092830120600754600160401b90046001600160401b031660009081526006909352912055323303611d1c57600754604080518381523360208201526060918101829052600091810191909152600160401b9091046001600160401b031690600080516020612a4b8339815191529060800160405180910390a2611d67565b600760089054906101000a90046001600160401b03166001600160401b0316600080516020612a4b83398151915282338888604051611d5e94939291906129d1565b60405180910390a25b5050505050565b6001600160a01b03163b151590565b6040516001600160a01b038316602482015260448101829052611de090849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611e23565b505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611e1d9085906323b872dd60e01b90608401611da9565b50505050565b6000611e78826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ef59092919063ffffffff16565b805190915015611de05780806020019051810190611e969190612706565b611de05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610825565b6060611f048484600085611f0c565b949350505050565b606082471015611f6d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610825565b600080866001600160a01b03168587604051611f899190612a18565b60006040518083038185875af1925050503d8060008114611fc6576040519150601f19603f3d011682016040523d82523d6000602084013e611fcb565b606091505b5091509150611fdc87838387611fe7565b979650505050505050565b6060831561205457825160000361204d5761200185611d6e565b61204d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610825565b5081611f04565b611f0483838151156120695781518083602001fd5b8060405162461bcd60e51b815260040161082591906120d3565b60005b8381101561209e578181015183820152602001612086565b50506000910152565b600081518084526120bf816020860160208601612083565b601f01601f19169290920160200192915050565b6020815260006120e660208301846120a7565b9392505050565b6001600160a01b0391909116815260200190565b6001600160401b038116811461211657600080fd5b50565b80356001600160a01b038116811461213057600080fd5b919050565b60008060006060848603121561214a57600080fd5b833561215581612101565b92506020840135915061216a60408501612119565b90509250925092565b803563ffffffff8116811461213057600080fd5b634e487b7160e01b600052604160045260246000fd5b600082601f8301126121ae57600080fd5b81356001600160401b03808211156121c8576121c8612187565b604051601f8301601f19908116603f011681019082821181831017156121f0576121f0612187565b8160405283815286602085880101111561220957600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121561224457600080fd5b61224d88612119565b965061225b60208901612119565b955061226960408901612173565b945061227760608901612119565b935061228560808901612173565b925060a08801356001600160401b03808211156122a157600080fd5b6122ad8b838c0161219d565b935060c08a01359150808211156122c357600080fd5b506122d08a828b0161219d565b91505092959891949750929550565b6000602082840312156122f157600080fd5b81356120e681612101565b60008083601f84011261230e57600080fd5b5081356001600160401b0381111561232557600080fd5b6020830191508360208260051b850101111561234057600080fd5b9250929050565b60008060006040848603121561235c57600080fd5b83356001600160401b0381111561237257600080fd5b61237e868287016122fc565b909450925061216a905060208501612119565b6000602082840312156123a357600080fd5b6120e682612119565b6000806000606084860312156123c157600080fd5b6123ca84612173565b92506123d860208501612119565b915061216a60408501612173565b6000602082840312156123f857600080fd5b81356001600160401b0381111561240e57600080fd5b611f048482850161219d565b6000806020838503121561242d57600080fd5b82356001600160401b0381111561244357600080fd5b61244f858286016122fc565b90969095509350505050565b60008060006040848603121561247057600080fd5b83356001600160401b038082111561248757600080fd5b818601915086601f83011261249b57600080fd5b8135818111156124aa57600080fd5b8760208285010111156124bc57600080fd5b6020928301989097509590910135949350505050565b6000602082840312156124e457600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03828116828216039080821115612521576125216124eb565b5092915050565b60008261254557634e487b7160e01b600052601260045260246000fd5b500490565b600181811c9082168061255e57607f821691505b60208210810361257e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115611de057600081815260208120601f850160051c810160208610156125ab5750805b601f850160051c820191505b818110156125ca578281556001016125b7565b505050505050565b81516001600160401b038111156125eb576125eb612187565b6125ff816125f9845461254a565b84612584565b602080601f831160018114612634576000841561261c5750858301515b600019600386901b1c1916600185901b1785556125ca565b600085815260208120601f198616915b8281101561266357888601518255948401946001909101908401612644565b50858210156126815787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b6001600160401b03929092168252602082015260400190565b6000602082840312156126fb57600080fd5b81516120e681612101565b60006020828403121561271857600080fd5b815180151581146120e657600080fd5b634e487b7160e01b600052603260045260246000fd5b60008235607e1983360301811261275457600080fd5b9190910192915050565b60006080823603121561277057600080fd5b604051608081016001600160401b03808211838310171561279357612793612187565b8160405284359150808211156127a857600080fd5b506127b53682860161219d565b8252506020830135602082015260408301356127d081612101565b604082015260608301356127e381612101565b606082015292915050565b60006001600160401b038281166002600160401b03198101612812576128126124eb565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b600060018201612851576128516124eb565b5060010190565b8181038181111561286b5761286b6124eb565b92915050565b808202811582820484141761286b5761286b6124eb565b6000835161289a818460208801612083565b8351908301906128ae818360208801612083565b01949350505050565b600086516128c9818460208b01612083565b9190910194855250602084019290925260f81b6001600160f81b03199081166040840152166041820152604201919050565b8082018082111561286b5761286b6124eb565b60008235605e1983360301811261275457600080fd5b60006060823603121561293657600080fd5b604051606081016001600160401b03808211838310171561295957612959612187565b81604052843591508082111561296e57600080fd5b5061297b3682860161219d565b82525060208301356020820152604083013561299681612101565b604082015292915050565b6001600160401b03818116838216019080821115612521576125216124eb565b8183823760009101908152919050565b8481526001600160a01b03841660208201526060604082018190528101829052818360808301376000818301608090810191909152601f909201601f191601019392505050565b6000825161275481846020870161208356fe303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fcef94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931f8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a2646970667358221220c650ce1567bb7660d93084dd33c284f37641ef24af0ba80a7f5c878ce8807cde64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMV2Existent.json b/compiled-contracts/paris/PolygonZkEVMV2Existent.json index 13b797a25..be4b8adc0 100644 --- a/compiled-contracts/paris/PolygonZkEVMV2Existent.json +++ b/compiled-contracts/paris/PolygonZkEVMV2Existent.json @@ -1039,8 +1039,8 @@ "type": "function" } ], - "bytecode": "0x61010060405234801562000011575f80fd5b5060405162002de838038062002de883398101604081905262000034916200006f565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d4565b6001600160a01b03811681146200006c575f80fd5b50565b5f805f806080858703121562000083575f80fd5b8451620000908162000057565b6020860151909450620000a38162000057565b6040860151909350620000b68162000057565b6060860151909250620000c98162000057565b939692955090935050565b60805160a05160c05160e051612c5b6200018d5f395f818161030e015281816106b40152818161074f0152818161097901528181610abc01528181610fad0152818161104501528181611067015281816111a7015281816115e401528181611a3c01528181611ab80152611b9301525f81816103dc015261112301525f818161047501528181610dc10152611c8f01525f81816104c20152818161054701528181610ff2015281816110f90152611c640152612c5b5ff3fe608060405234801561000f575f80fd5b50600436106101bf575f3560e01c8062d0295d146101c3578063107bf28c146101de57806319d8ac61146101f3578063267822471461021e5780632b35b3ac1461023e57806332c2d1531461025b5780633c351e10146102705780633cbc795b1461028857806340b5de6c146102b457806345605267146102dc57806347ebf108146102f657806349b7b802146103095780634e48770614610330578063542028d5146103435780635e9145c91461034b5780635ec919581461035e5780636b8616ce146103665780636e05d2cd146103855780636ff512cc1461038e5780638c3d7301146103a157806399af0397146103a95780639e001877146103bc578063a3c573eb146103d7578063ada8f919146103fe578063b0afe15414610411578063bb5907081461041d578063c754c7ed14610430578063c89e42df1461044a578063cfa8ed471461045d578063d02103ca14610470578063d690be3114610497578063d7bc90ff1461049f578063d8d1091b146104aa578063e46761c4146104bd578063e7a7ed02146104e4578063eaeb077b146104fe578063f35dda4714610511578063f851a4401461052b575b5f80fd5b6101cb610543565b6040519081526020015b60405180910390f35b6101e6610626565b6040516101d591906121ba565b600754610206906001600160401b031681565b6040516001600160401b0390911681526020016101d5565b600154610231906001600160a01b031681565b6040516101d591906121d3565b60085461024b9060ff1681565b60405190151581526020016101d5565b61026e610269366004612219565b6106b2565b005b6008546102319061010090046001600160a01b031681565b60085461029f90600160a81b900463ffffffff1681565b60405163ffffffff90911681526020016101d5565b6102c36001600160f81b031981565b6040516001600160f81b031990911681526020016101d5565b60075461020690600160801b90046001600160401b031681565b61026e610304366004612303565b61074d565b6102317f000000000000000000000000000000000000000000000000000000000000000081565b61026e61033e3660046123b2565b610a5d565b6101e6610bd1565b61026e610359366004612414565b610bde565b61026e61124e565b6101cb6103743660046123b2565b60066020525f908152604090205481565b6101cb60055481565b61026e61039c36600461245a565b6112d9565b61026e611354565b6101e66103b7366004612473565b6113e0565b61023173a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6102317f000000000000000000000000000000000000000000000000000000000000000081565b61026e61040c36600461245a565b611567565b6101cb6405ca1ab1e081565b61026e61042b3660046124aa565b6115e2565b60075461020690600160c01b90046001600160401b031681565b61026e610458366004612545565b611766565b600254610231906001600160a01b031681565b6102317f000000000000000000000000000000000000000000000000000000000000000081565b6101e66117d2565b6101cb635ca1ab1e81565b61026e6104b8366004612576565b6117ee565b6102317f000000000000000000000000000000000000000000000000000000000000000081565b60075461020690600160401b90046001600160401b031681565b61026e61050c3660046125b4565b611b6d565b610519601b81565b60405160ff90911681526020016101d5565b5f54610231906201000090046001600160a01b031681565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161059191906121d3565b602060405180830381865afa1580156105ac573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105d09190612624565b6007549091505f906105fb906001600160401b03600160801b8204811691600160401b90041661264f565b6001600160401b03169050805f03610615575f9250505090565b61061f8183612676565b9250505090565b6004805461063390612695565b80601f016020809104026020016040519081016040528092919081815260200182805461065f90612695565b80156106aa5780601f10610681576101008083540402835291602001916106aa565b820191905f5260205f20905b81548152906001019060200180831161068d57829003601f168201915b505050505081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146106fb57604051631736745960e31b815260040160405180910390fd5b806001600160a01b0316836001600160401b03167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59668460405161074091815260200190565b60405180910390a3505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461079657604051631736745960e31b815260040160405180910390fd5b5f54610100900460ff16158080156107b457505f54600160ff909116105b806107d457506107c330611e5f565b1580156107d457505f5460ff166001145b6107f95760405162461bcd60e51b81526004016107f0906126cd565b60405180910390fd5b5f805460ff19166001179055801561081a575f805461ff0019166101001790555b5f805462010000600160b01b031916620100006001600160a01b038b81169190910291909117909155600280546001600160a01b03191691891691909117905560036108668482612768565b5060046108738382612768565b50600780546001600160c01b0316610d2f60c71b1790556001600160a01b0385166108bd5763ffffffff8416156108bd57604051630d43a60960e11b815260040160405180910390fd5b60088054610100600160c81b0319166101006001600160a01b0388160263ffffffff60a81b191617600160a81b63ffffffff8716021790555f6109018787876113e0565b90505f818051906020012090505f4290505f805f1b835f801b848e604051602001610930959493929190612823565b60408051808303601f19018152908290528051602090910120600780546001600160401b0319166001600160401b0386161790556005819055639a908e7360e01b825291505f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639a908e73906109b9906001908690600401612862565b6020604051808303815f875af11580156109d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109f9919061287b565b6040519091506001600160401b038216905f80516020612ba5833981519152905f90a250505050508015610a53575f805461ff0019169055604051600181525f80516020612bc58339815191529060200160405180910390a15b5050505050505050565b5f546201000090046001600160a01b03163314610a8d57604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610aba5760405163f5e37f2f60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b16573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3a9190612896565b610b74576007546001600160401b03600160c01b909104811690821610610b745760405163f5e37f2f60e01b815260040160405180910390fd5b600780546001600160c01b0316600160c01b6001600160401b038416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461063390612695565b6002546001600160a01b03163314610c09576040516311e7be1560e01b815260040160405180910390fd5b815f819003610c2b5760405163cb591a5f60e01b815260040160405180910390fd5b6103e8811115610c4e57604051635acfba9d60e11b815260040160405180910390fd5b6007546005546001600160401b0380831692600160801b90041690815f5b85811015610f1c575f898983818110610c8757610c876128b5565b9050602002810190610c9991906128c9565b610ca2906128e7565b805180516020909101206060820151919250906001600160401b031615610d975785610ccd81612974565b9650505f8183602001518460600151604051602001610cee939291906129a1565b60408051601f1981840301815291815281516020928301206001600160401b038a165f90815260069093529120549091508114610d3e5760405163671ebaaf60e11b815260040160405180910390fd5b82606001516001600160401b031683604001516001600160401b03161015610d7957604051633fbd5c3960e11b815260040160405180910390fd5b506001600160401b0386165f90815260066020526040812055610e79565b602082015115801590610e35575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303815f875af1158015610e0f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e339190612624565b155b15610e53576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c01015610e79576040516328a69b1f60e21b815260040160405180910390fd5b866001600160401b031682604001516001600160401b03161080610ea957504282604001516001600160401b0316115b15610ec7576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518c604051602001610ee8959493929190612823565b6040516020818303038152906040528051906020012094508160400151965050508080610f14906129c4565b915050610c6c565b506007546001600160401b03600160401b90910481169084161115610f545760405163c630a00d60e01b815260040160405180910390fd5b600780546001600160401b0319166001600160401b0386811691909117909155600583905585908281169085161461103f575f610f91838661264f565b9050610fa66001600160401b038216836129dc565b91506110197f0000000000000000000000000000000000000000000000000000000000000000826001600160401b0316610fde610543565b610fe891906129f5565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190611e6e565b5060078054600160801b600160c01b031916600160801b6001600160401b038716021790555b611121337f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110e59190612624565b6110ef91906129f5565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190611ed6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611179575f80fd5b505af115801561118b573d5f803e3d5ffd5b5050604051639a908e7360e01b81525f92506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150639a908e73906111df908a908890600401612862565b6020604051808303815f875af11580156111fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061121f919061287b565b6040519091506001600160401b038216905f80516020612ba5833981519152905f90a250505050505050505050565b5f546201000090046001600160a01b0316331461127e57604051634755657960e01b815260040160405180910390fd5b60085460ff16156112a25760405163f6ba91a160e01b815260040160405180910390fd5b6008805460ff191660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f546201000090046001600160a01b0316331461130957604051634755657960e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383161790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610bc69083906121d3565b6001546001600160a01b0316331461137f5760405163d1ec4b2360e01b815260040160405180910390fd5b6001545f8054620100006001600160a01b0390931692830262010000600160b01b03199091161790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e916113d6916121d3565b60405180910390a1565b60605f604051806060016040528060218152602001612c056021913960405163ffffffff80881660248301526001600160a01b03871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa60848201525f60a482015260c40160408051601f19818403018152918152602080830180516001600160e01b03166369a3b57f60e11b179052905161147e93929101612a0c565b60408051601f1981840301815282825280516020808301919091205f80865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa1580156114eb573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661151f5760405163668b0cb360e11b815260040160405180910390fd5b6040515f9061154c9084906405ca1ab1e090635ca1ab1e90601b906001600160f81b031990602001612a3a565b60408051808303601f19018152919052979650505050505050565b5f546201000090046001600160a01b0316331461159757604051634755657960e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610bc69083906121d3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461162b57604051631736745960e31b815260040160405180910390fd5b5f54610100900460ff161580801561164957505f54600160ff909116105b80611669575061165830611e5f565b15801561166957505f5460ff166001145b6116855760405162461bcd60e51b81526004016107f0906126cd565b5f805460ff1916600117905580156116a6575f805461ff0019166101001790555b5f805462010000600160b01b031916620100006001600160a01b038a81169190910291909117909155600280546001600160a01b03191691881691909117905560036116f28682612768565b5060046116ff8582612768565b50600583905560078054610d2f60c71b600160401b600160c01b039091166001600160401b03851617179055801561175d575f805461ff0019169055604051600181525f80516020612bc58339815191529060200160405180910390a15b50505050505050565b5f546201000090046001600160a01b0316331461179657604051634755657960e01b815260040160405180910390fd5b60036117a28282612768565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610bc691906121ba565b604051806060016040528060218152602001612c056021913981565b60085460ff16611811576040516324eff8c360e01b815260040160405180910390fd5b805f8190036118335760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561185657604051635acfba9d60e11b815260040160405180910390fd5b6007546001600160401b03600160401b820481169161187e918491600160801b900416612a7d565b111561189d5760405163c630a00d60e01b815260040160405180910390fd5b600754600554600160801b9091046001600160401b0316905f5b83811015611a36575f8686838181106118d2576118d26128b5565b90506020028101906118e49190612a90565b6118ed90612aa4565b9050836118f981612974565b825180516020918201208185015160408087015190519499509194505f9361192493869391016129a1565b60408051601f1981840301815291815281516020928301206001600160401b0389165f908152600690935291205490915081146119745760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b0386165f908152600660205260408120556119976001886129dc565b84036119eb5742600760189054906101000a90046001600160401b031684604001516119c39190612b1e565b6001600160401b031611156119eb5760405163c44a082160e01b815260040160405180910390fd5b848284602001514233604051602001611a08959493929190612823565b6040516020818303038152906040528051906020012094505050508080611a2e906129c4565b9150506118b7565b50611a647f000000000000000000000000000000000000000000000000000000000000000084610fde610543565b6005819055600780546001600160401b03848116600160801b026001600160401b03600160801b03600160c01b0319909216429190911617179055604051639a908e7360e01b81525f906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611aef9087908690600401612862565b6020604051808303815f875af1158015611b0b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b2f919061287b565b6040519091506001600160401b038216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a2505050505050565b60085460ff16611b90576040516324eff8c360e01b815260040160405180910390fd5b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c119190612624565b905081811115611c3457604051632354600f60e01b815260040160405180910390fd5b611388831115611c57576040516328a69b1f60e21b815260040160405180910390fd5b611c8c6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084611ed6565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ce9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d0d9190612624565b60078054919250600160401b9091046001600160401b0316906008611d3183612974565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508484604051611d66929190612b3e565b604051908190038120611d7f91839042906020016129a1565b60408051808303601f190181529181528151602092830120600754600160401b90046001600160401b03165f9081526006909352912055323303611e0e576007546040805183815233602082015260609181018290525f91810191909152600160401b9091046001600160401b0316905f80516020612be58339815191529060800160405180910390a2611e58565b600760089054906101000a90046001600160401b03166001600160401b03165f80516020612be583398151915282338888604051611e4f9493929190612b4d565b60405180910390a25b5050505050565b6001600160a01b03163b151590565b6040516001600160a01b038316602482015260448101829052611ed190849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611f14565b505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611f0e9085906323b872dd60e01b90608401611e9a565b50505050565b5f611f68826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611fe59092919063ffffffff16565b805190915015611ed15780806020019051810190611f869190612896565b611ed15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107f0565b6060611ff384845f85611ffb565b949350505050565b60608247101561205c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016107f0565b5f80866001600160a01b031685876040516120779190612b93565b5f6040518083038185875af1925050503d805f81146120b1576040519150601f19603f3d011682016040523d82523d5f602084013e6120b6565b606091505b50915091506120c7878383876120d2565b979650505050505050565b6060831561213e5782515f03612137576120eb85611e5f565b6121375760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107f0565b5081611ff3565b611ff383838151156121535781518083602001fd5b8060405162461bcd60e51b81526004016107f091906121ba565b5f5b8381101561218757818101518382015260200161216f565b50505f910152565b5f81518084526121a681602086016020860161216d565b601f01601f19169290920160200192915050565b602081525f6121cc602083018461218f565b9392505050565b6001600160a01b0391909116815260200190565b6001600160401b03811681146121fb575f80fd5b50565b80356001600160a01b0381168114612214575f80fd5b919050565b5f805f6060848603121561222b575f80fd5b8335612236816121e7565b92506020840135915061224b604085016121fe565b90509250925092565b803563ffffffff81168114612214575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261228a575f80fd5b81356001600160401b03808211156122a4576122a4612267565b604051601f8301601f19908116603f011681019082821181831017156122cc576122cc612267565b816040528381528660208588010111156122e4575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a031215612319575f80fd5b612322886121fe565b9650612330602089016121fe565b955061233e60408901612254565b945061234c606089016121fe565b935061235a60808901612254565b925060a08801356001600160401b0380821115612375575f80fd5b6123818b838c0161227b565b935060c08a0135915080821115612396575f80fd5b506123a38a828b0161227b565b91505092959891949750929550565b5f602082840312156123c2575f80fd5b81356121cc816121e7565b5f8083601f8401126123dd575f80fd5b5081356001600160401b038111156123f3575f80fd5b6020830191508360208260051b850101111561240d575f80fd5b9250929050565b5f805f60408486031215612426575f80fd5b83356001600160401b0381111561243b575f80fd5b612447868287016123cd565b909450925061224b9050602085016121fe565b5f6020828403121561246a575f80fd5b6121cc826121fe565b5f805f60608486031215612485575f80fd5b61248e84612254565b925061249c602085016121fe565b915061224b60408501612254565b5f805f805f8060c087890312156124bf575f80fd5b6124c8876121fe565b95506124d6602088016121fe565b945060408701356001600160401b03808211156124f1575f80fd5b6124fd8a838b0161227b565b95506060890135915080821115612512575f80fd5b5061251f89828a0161227b565b9350506080870135915060a0870135612537816121e7565b809150509295509295509295565b5f60208284031215612555575f80fd5b81356001600160401b0381111561256a575f80fd5b611ff38482850161227b565b5f8060208385031215612587575f80fd5b82356001600160401b0381111561259c575f80fd5b6125a8858286016123cd565b90969095509350505050565b5f805f604084860312156125c6575f80fd5b83356001600160401b03808211156125dc575f80fd5b818601915086601f8301126125ef575f80fd5b8135818111156125fd575f80fd5b87602082850101111561260e575f80fd5b6020928301989097509590910135949350505050565b5f60208284031215612634575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561266f5761266f61263b565b5092915050565b5f8261269057634e487b7160e01b5f52601260045260245ffd5b500490565b600181811c908216806126a957607f821691505b6020821081036126c757634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b601f821115611ed1575f81815260208120601f850160051c810160208610156127415750805b601f850160051c820191505b818110156127605782815560010161274d565b505050505050565b81516001600160401b0381111561278157612781612267565b6127958161278f8454612695565b8461271b565b602080601f8311600181146127c8575f84156127b15750858301515b5f19600386901b1c1916600185901b178555612760565b5f85815260208120601f198616915b828110156127f6578886015182559484019460019091019084016127d7565b508582101561281357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b6001600160401b03929092168252602082015260400190565b5f6020828403121561288b575f80fd5b81516121cc816121e7565b5f602082840312156128a6575f80fd5b815180151581146121cc575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e198336030181126128dd575f80fd5b9190910192915050565b5f608082360312156128f7575f80fd5b604051608081016001600160401b03808211838310171561291a5761291a612267565b81604052843591508082111561292e575f80fd5b5061293b3682860161227b565b825250602083013560208201526040830135612956816121e7565b60408201526060830135612969816121e7565b606082015292915050565b5f6001600160401b038281166002600160401b031981016129975761299761263b565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b5f600182016129d5576129d561263b565b5060010190565b818103818111156129ef576129ef61263b565b92915050565b80820281158282048414176129ef576129ef61263b565b5f8351612a1d81846020880161216d565b835190830190612a3181836020880161216d565b01949350505050565b5f8651612a4b818460208b0161216d565b9190910194855250602084019290925260f81b6001600160f81b03199081166040840152166041820152604201919050565b808201808211156129ef576129ef61263b565b5f8235605e198336030181126128dd575f80fd5b5f60608236031215612ab4575f80fd5b604051606081016001600160401b038082118383101715612ad757612ad7612267565b816040528435915080821115612aeb575f80fd5b50612af83682860161227b565b825250602083013560208201526040830135612b13816121e7565b604082015292915050565b6001600160401b0381811683821601908082111561266f5761266f61263b565b818382375f9101908152919050565b8481526001600160a01b03841660208201526060604082018190528101829052818360808301375f818301608090810191909152601f909201601f191601019392505050565b5f82516128dd81846020870161216d56fe303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498f94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931f8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a26469706673582212209b216003212743484fff6c6b25161a61690fc600987c4c294267f06f37deddd264736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106101bf575f3560e01c8062d0295d146101c3578063107bf28c146101de57806319d8ac61146101f3578063267822471461021e5780632b35b3ac1461023e57806332c2d1531461025b5780633c351e10146102705780633cbc795b1461028857806340b5de6c146102b457806345605267146102dc57806347ebf108146102f657806349b7b802146103095780634e48770614610330578063542028d5146103435780635e9145c91461034b5780635ec919581461035e5780636b8616ce146103665780636e05d2cd146103855780636ff512cc1461038e5780638c3d7301146103a157806399af0397146103a95780639e001877146103bc578063a3c573eb146103d7578063ada8f919146103fe578063b0afe15414610411578063bb5907081461041d578063c754c7ed14610430578063c89e42df1461044a578063cfa8ed471461045d578063d02103ca14610470578063d690be3114610497578063d7bc90ff1461049f578063d8d1091b146104aa578063e46761c4146104bd578063e7a7ed02146104e4578063eaeb077b146104fe578063f35dda4714610511578063f851a4401461052b575b5f80fd5b6101cb610543565b6040519081526020015b60405180910390f35b6101e6610626565b6040516101d591906121ba565b600754610206906001600160401b031681565b6040516001600160401b0390911681526020016101d5565b600154610231906001600160a01b031681565b6040516101d591906121d3565b60085461024b9060ff1681565b60405190151581526020016101d5565b61026e610269366004612219565b6106b2565b005b6008546102319061010090046001600160a01b031681565b60085461029f90600160a81b900463ffffffff1681565b60405163ffffffff90911681526020016101d5565b6102c36001600160f81b031981565b6040516001600160f81b031990911681526020016101d5565b60075461020690600160801b90046001600160401b031681565b61026e610304366004612303565b61074d565b6102317f000000000000000000000000000000000000000000000000000000000000000081565b61026e61033e3660046123b2565b610a5d565b6101e6610bd1565b61026e610359366004612414565b610bde565b61026e61124e565b6101cb6103743660046123b2565b60066020525f908152604090205481565b6101cb60055481565b61026e61039c36600461245a565b6112d9565b61026e611354565b6101e66103b7366004612473565b6113e0565b61023173a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6102317f000000000000000000000000000000000000000000000000000000000000000081565b61026e61040c36600461245a565b611567565b6101cb6405ca1ab1e081565b61026e61042b3660046124aa565b6115e2565b60075461020690600160c01b90046001600160401b031681565b61026e610458366004612545565b611766565b600254610231906001600160a01b031681565b6102317f000000000000000000000000000000000000000000000000000000000000000081565b6101e66117d2565b6101cb635ca1ab1e81565b61026e6104b8366004612576565b6117ee565b6102317f000000000000000000000000000000000000000000000000000000000000000081565b60075461020690600160401b90046001600160401b031681565b61026e61050c3660046125b4565b611b6d565b610519601b81565b60405160ff90911681526020016101d5565b5f54610231906201000090046001600160a01b031681565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161059191906121d3565b602060405180830381865afa1580156105ac573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105d09190612624565b6007549091505f906105fb906001600160401b03600160801b8204811691600160401b90041661264f565b6001600160401b03169050805f03610615575f9250505090565b61061f8183612676565b9250505090565b6004805461063390612695565b80601f016020809104026020016040519081016040528092919081815260200182805461065f90612695565b80156106aa5780601f10610681576101008083540402835291602001916106aa565b820191905f5260205f20905b81548152906001019060200180831161068d57829003601f168201915b505050505081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146106fb57604051631736745960e31b815260040160405180910390fd5b806001600160a01b0316836001600160401b03167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59668460405161074091815260200190565b60405180910390a3505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461079657604051631736745960e31b815260040160405180910390fd5b5f54610100900460ff16158080156107b457505f54600160ff909116105b806107d457506107c330611e5f565b1580156107d457505f5460ff166001145b6107f95760405162461bcd60e51b81526004016107f0906126cd565b60405180910390fd5b5f805460ff19166001179055801561081a575f805461ff0019166101001790555b5f805462010000600160b01b031916620100006001600160a01b038b81169190910291909117909155600280546001600160a01b03191691891691909117905560036108668482612768565b5060046108738382612768565b50600780546001600160c01b0316610d2f60c71b1790556001600160a01b0385166108bd5763ffffffff8416156108bd57604051630d43a60960e11b815260040160405180910390fd5b60088054610100600160c81b0319166101006001600160a01b0388160263ffffffff60a81b191617600160a81b63ffffffff8716021790555f6109018787876113e0565b90505f818051906020012090505f4290505f805f1b835f801b848e604051602001610930959493929190612823565b60408051808303601f19018152908290528051602090910120600780546001600160401b0319166001600160401b0386161790556005819055639a908e7360e01b825291505f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639a908e73906109b9906001908690600401612862565b6020604051808303815f875af11580156109d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109f9919061287b565b6040519091506001600160401b038216905f80516020612ba5833981519152905f90a250505050508015610a53575f805461ff0019169055604051600181525f80516020612bc58339815191529060200160405180910390a15b5050505050505050565b5f546201000090046001600160a01b03163314610a8d57604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610aba5760405163f5e37f2f60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b16573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3a9190612896565b610b74576007546001600160401b03600160c01b909104811690821610610b745760405163f5e37f2f60e01b815260040160405180910390fd5b600780546001600160c01b0316600160c01b6001600160401b038416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461063390612695565b6002546001600160a01b03163314610c09576040516311e7be1560e01b815260040160405180910390fd5b815f819003610c2b5760405163cb591a5f60e01b815260040160405180910390fd5b6103e8811115610c4e57604051635acfba9d60e11b815260040160405180910390fd5b6007546005546001600160401b0380831692600160801b90041690815f5b85811015610f1c575f898983818110610c8757610c876128b5565b9050602002810190610c9991906128c9565b610ca2906128e7565b805180516020909101206060820151919250906001600160401b031615610d975785610ccd81612974565b9650505f8183602001518460600151604051602001610cee939291906129a1565b60408051601f1981840301815291815281516020928301206001600160401b038a165f90815260069093529120549091508114610d3e5760405163671ebaaf60e11b815260040160405180910390fd5b82606001516001600160401b031683604001516001600160401b03161015610d7957604051633fbd5c3960e11b815260040160405180910390fd5b506001600160401b0386165f90815260066020526040812055610e79565b602082015115801590610e35575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303815f875af1158015610e0f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e339190612624565b155b15610e53576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c01015610e79576040516328a69b1f60e21b815260040160405180910390fd5b866001600160401b031682604001516001600160401b03161080610ea957504282604001516001600160401b0316115b15610ec7576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518c604051602001610ee8959493929190612823565b6040516020818303038152906040528051906020012094508160400151965050508080610f14906129c4565b915050610c6c565b506007546001600160401b03600160401b90910481169084161115610f545760405163c630a00d60e01b815260040160405180910390fd5b600780546001600160401b0319166001600160401b0386811691909117909155600583905585908281169085161461103f575f610f91838661264f565b9050610fa66001600160401b038216836129dc565b91506110197f0000000000000000000000000000000000000000000000000000000000000000826001600160401b0316610fde610543565b610fe891906129f5565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190611e6e565b5060078054600160801b600160c01b031916600160801b6001600160401b038716021790555b611121337f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110e59190612624565b6110ef91906129f5565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190611ed6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611179575f80fd5b505af115801561118b573d5f803e3d5ffd5b5050604051639a908e7360e01b81525f92506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150639a908e73906111df908a908890600401612862565b6020604051808303815f875af11580156111fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061121f919061287b565b6040519091506001600160401b038216905f80516020612ba5833981519152905f90a250505050505050505050565b5f546201000090046001600160a01b0316331461127e57604051634755657960e01b815260040160405180910390fd5b60085460ff16156112a25760405163f6ba91a160e01b815260040160405180910390fd5b6008805460ff191660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f546201000090046001600160a01b0316331461130957604051634755657960e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383161790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610bc69083906121d3565b6001546001600160a01b0316331461137f5760405163d1ec4b2360e01b815260040160405180910390fd5b6001545f8054620100006001600160a01b0390931692830262010000600160b01b03199091161790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e916113d6916121d3565b60405180910390a1565b60605f604051806060016040528060218152602001612c056021913960405163ffffffff80881660248301526001600160a01b03871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa60848201525f60a482015260c40160408051601f19818403018152918152602080830180516001600160e01b03166369a3b57f60e11b179052905161147e93929101612a0c565b60408051601f1981840301815282825280516020808301919091205f80865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa1580156114eb573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661151f5760405163668b0cb360e11b815260040160405180910390fd5b6040515f9061154c9084906405ca1ab1e090635ca1ab1e90601b906001600160f81b031990602001612a3a565b60408051808303601f19018152919052979650505050505050565b5f546201000090046001600160a01b0316331461159757604051634755657960e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610bc69083906121d3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461162b57604051631736745960e31b815260040160405180910390fd5b5f54610100900460ff161580801561164957505f54600160ff909116105b80611669575061165830611e5f565b15801561166957505f5460ff166001145b6116855760405162461bcd60e51b81526004016107f0906126cd565b5f805460ff1916600117905580156116a6575f805461ff0019166101001790555b5f805462010000600160b01b031916620100006001600160a01b038a81169190910291909117909155600280546001600160a01b03191691881691909117905560036116f28682612768565b5060046116ff8582612768565b50600583905560078054610d2f60c71b600160401b600160c01b039091166001600160401b03851617179055801561175d575f805461ff0019169055604051600181525f80516020612bc58339815191529060200160405180910390a15b50505050505050565b5f546201000090046001600160a01b0316331461179657604051634755657960e01b815260040160405180910390fd5b60036117a28282612768565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610bc691906121ba565b604051806060016040528060218152602001612c056021913981565b60085460ff16611811576040516324eff8c360e01b815260040160405180910390fd5b805f8190036118335760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561185657604051635acfba9d60e11b815260040160405180910390fd5b6007546001600160401b03600160401b820481169161187e918491600160801b900416612a7d565b111561189d5760405163c630a00d60e01b815260040160405180910390fd5b600754600554600160801b9091046001600160401b0316905f5b83811015611a36575f8686838181106118d2576118d26128b5565b90506020028101906118e49190612a90565b6118ed90612aa4565b9050836118f981612974565b825180516020918201208185015160408087015190519499509194505f9361192493869391016129a1565b60408051601f1981840301815291815281516020928301206001600160401b0389165f908152600690935291205490915081146119745760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b0386165f908152600660205260408120556119976001886129dc565b84036119eb5742600760189054906101000a90046001600160401b031684604001516119c39190612b1e565b6001600160401b031611156119eb5760405163c44a082160e01b815260040160405180910390fd5b848284602001514233604051602001611a08959493929190612823565b6040516020818303038152906040528051906020012094505050508080611a2e906129c4565b9150506118b7565b50611a647f000000000000000000000000000000000000000000000000000000000000000084610fde610543565b6005819055600780546001600160401b03848116600160801b026001600160401b03600160801b03600160c01b0319909216429190911617179055604051639a908e7360e01b81525f906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611aef9087908690600401612862565b6020604051808303815f875af1158015611b0b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b2f919061287b565b6040519091506001600160401b038216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a2505050505050565b60085460ff16611b90576040516324eff8c360e01b815260040160405180910390fd5b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c119190612624565b905081811115611c3457604051632354600f60e01b815260040160405180910390fd5b611388831115611c57576040516328a69b1f60e21b815260040160405180910390fd5b611c8c6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084611ed6565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ce9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d0d9190612624565b60078054919250600160401b9091046001600160401b0316906008611d3183612974565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508484604051611d66929190612b3e565b604051908190038120611d7f91839042906020016129a1565b60408051808303601f190181529181528151602092830120600754600160401b90046001600160401b03165f9081526006909352912055323303611e0e576007546040805183815233602082015260609181018290525f91810191909152600160401b9091046001600160401b0316905f80516020612be58339815191529060800160405180910390a2611e58565b600760089054906101000a90046001600160401b03166001600160401b03165f80516020612be583398151915282338888604051611e4f9493929190612b4d565b60405180910390a25b5050505050565b6001600160a01b03163b151590565b6040516001600160a01b038316602482015260448101829052611ed190849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611f14565b505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611f0e9085906323b872dd60e01b90608401611e9a565b50505050565b5f611f68826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611fe59092919063ffffffff16565b805190915015611ed15780806020019051810190611f869190612896565b611ed15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107f0565b6060611ff384845f85611ffb565b949350505050565b60608247101561205c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016107f0565b5f80866001600160a01b031685876040516120779190612b93565b5f6040518083038185875af1925050503d805f81146120b1576040519150601f19603f3d011682016040523d82523d5f602084013e6120b6565b606091505b50915091506120c7878383876120d2565b979650505050505050565b6060831561213e5782515f03612137576120eb85611e5f565b6121375760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107f0565b5081611ff3565b611ff383838151156121535781518083602001fd5b8060405162461bcd60e51b81526004016107f091906121ba565b5f5b8381101561218757818101518382015260200161216f565b50505f910152565b5f81518084526121a681602086016020860161216d565b601f01601f19169290920160200192915050565b602081525f6121cc602083018461218f565b9392505050565b6001600160a01b0391909116815260200190565b6001600160401b03811681146121fb575f80fd5b50565b80356001600160a01b0381168114612214575f80fd5b919050565b5f805f6060848603121561222b575f80fd5b8335612236816121e7565b92506020840135915061224b604085016121fe565b90509250925092565b803563ffffffff81168114612214575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261228a575f80fd5b81356001600160401b03808211156122a4576122a4612267565b604051601f8301601f19908116603f011681019082821181831017156122cc576122cc612267565b816040528381528660208588010111156122e4575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a031215612319575f80fd5b612322886121fe565b9650612330602089016121fe565b955061233e60408901612254565b945061234c606089016121fe565b935061235a60808901612254565b925060a08801356001600160401b0380821115612375575f80fd5b6123818b838c0161227b565b935060c08a0135915080821115612396575f80fd5b506123a38a828b0161227b565b91505092959891949750929550565b5f602082840312156123c2575f80fd5b81356121cc816121e7565b5f8083601f8401126123dd575f80fd5b5081356001600160401b038111156123f3575f80fd5b6020830191508360208260051b850101111561240d575f80fd5b9250929050565b5f805f60408486031215612426575f80fd5b83356001600160401b0381111561243b575f80fd5b612447868287016123cd565b909450925061224b9050602085016121fe565b5f6020828403121561246a575f80fd5b6121cc826121fe565b5f805f60608486031215612485575f80fd5b61248e84612254565b925061249c602085016121fe565b915061224b60408501612254565b5f805f805f8060c087890312156124bf575f80fd5b6124c8876121fe565b95506124d6602088016121fe565b945060408701356001600160401b03808211156124f1575f80fd5b6124fd8a838b0161227b565b95506060890135915080821115612512575f80fd5b5061251f89828a0161227b565b9350506080870135915060a0870135612537816121e7565b809150509295509295509295565b5f60208284031215612555575f80fd5b81356001600160401b0381111561256a575f80fd5b611ff38482850161227b565b5f8060208385031215612587575f80fd5b82356001600160401b0381111561259c575f80fd5b6125a8858286016123cd565b90969095509350505050565b5f805f604084860312156125c6575f80fd5b83356001600160401b03808211156125dc575f80fd5b818601915086601f8301126125ef575f80fd5b8135818111156125fd575f80fd5b87602082850101111561260e575f80fd5b6020928301989097509590910135949350505050565b5f60208284031215612634575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561266f5761266f61263b565b5092915050565b5f8261269057634e487b7160e01b5f52601260045260245ffd5b500490565b600181811c908216806126a957607f821691505b6020821081036126c757634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b601f821115611ed1575f81815260208120601f850160051c810160208610156127415750805b601f850160051c820191505b818110156127605782815560010161274d565b505050505050565b81516001600160401b0381111561278157612781612267565b6127958161278f8454612695565b8461271b565b602080601f8311600181146127c8575f84156127b15750858301515b5f19600386901b1c1916600185901b178555612760565b5f85815260208120601f198616915b828110156127f6578886015182559484019460019091019084016127d7565b508582101561281357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b6001600160401b03929092168252602082015260400190565b5f6020828403121561288b575f80fd5b81516121cc816121e7565b5f602082840312156128a6575f80fd5b815180151581146121cc575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e198336030181126128dd575f80fd5b9190910192915050565b5f608082360312156128f7575f80fd5b604051608081016001600160401b03808211838310171561291a5761291a612267565b81604052843591508082111561292e575f80fd5b5061293b3682860161227b565b825250602083013560208201526040830135612956816121e7565b60408201526060830135612969816121e7565b606082015292915050565b5f6001600160401b038281166002600160401b031981016129975761299761263b565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b5f600182016129d5576129d561263b565b5060010190565b818103818111156129ef576129ef61263b565b92915050565b80820281158282048414176129ef576129ef61263b565b5f8351612a1d81846020880161216d565b835190830190612a3181836020880161216d565b01949350505050565b5f8651612a4b818460208b0161216d565b9190910194855250602084019290925260f81b6001600160f81b03199081166040840152166041820152604201919050565b808201808211156129ef576129ef61263b565b5f8235605e198336030181126128dd575f80fd5b5f60608236031215612ab4575f80fd5b604051606081016001600160401b038082118383101715612ad757612ad7612267565b816040528435915080821115612aeb575f80fd5b50612af83682860161227b565b825250602083013560208201526040830135612b13816121e7565b604082015292915050565b6001600160401b0381811683821601908082111561266f5761266f61263b565b818382375f9101908152919050565b8481526001600160a01b03841660208201526060604082018190528101829052818360808301375f818301608090810191909152601f909201601f191601019392505050565b5f82516128dd81846020870161216d56fe303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498f94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931f8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a26469706673582212209b216003212743484fff6c6b25161a61690fc600987c4c294267f06f37deddd264736f6c63430008140033", + "bytecode": "0x6101006040523480156200001257600080fd5b5060405162002ebd38038062002ebd833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e051612d256200019860003960008181610311015281816106c10152818161075c0152818161099301528181610ade01528181610fdb0152818161107301528181611095015281816111dd0152818161162a01528181611a9101528181611b0e0152611bee0152600081816103e0015261115301526000818161047901528181610deb0152611ced0152600081816104c60152818161054d01528181611020015281816111290152611cc10152612d256000f3fe608060405234801561001057600080fd5b50600436106101c15760003560e01c8062d0295d146101c6578063107bf28c146101e157806319d8ac61146101f657806326782247146102215780632b35b3ac1461024157806332c2d1531461025e5780633c351e10146102735780633cbc795b1461028b57806340b5de6c146102b757806345605267146102df57806347ebf108146102f957806349b7b8021461030c5780634e48770614610333578063542028d5146103465780635e9145c91461034e5780635ec91958146103615780636b8616ce146103695780636e05d2cd146103895780636ff512cc146103925780638c3d7301146103a557806399af0397146103ad5780639e001877146103c0578063a3c573eb146103db578063ada8f91914610402578063b0afe15414610415578063bb59070814610421578063c754c7ed14610434578063c89e42df1461044e578063cfa8ed4714610461578063d02103ca14610474578063d690be311461049b578063d7bc90ff146104a3578063d8d1091b146104ae578063e46761c4146104c1578063e7a7ed02146104e8578063eaeb077b14610502578063f35dda4714610515578063f851a4401461052f575b600080fd5b6101ce610548565b6040519081526020015b60405180910390f35b6101e9610631565b6040516101d89190612228565b600754610209906001600160401b031681565b6040516001600160401b0390911681526020016101d8565b600154610234906001600160a01b031681565b6040516101d89190612242565b60085461024e9060ff1681565b60405190151581526020016101d8565b61027161026c36600461228a565b6106bf565b005b6008546102349061010090046001600160a01b031681565b6008546102a290600160a81b900463ffffffff1681565b60405163ffffffff90911681526020016101d8565b6102c66001600160f81b031981565b6040516001600160f81b031990911681526020016101d8565b60075461020990600160801b90046001600160401b031681565b61027161030736600461237e565b61075a565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b610271610341366004612434565b610a7e565b6101e9610bf5565b61027161035c36600461249c565b610c02565b610271611289565b6101ce610377366004612434565b60066020526000908152604090205481565b6101ce60055481565b6102716103a03660046124e6565b611316565b610271611392565b6101e96103bb366004612501565b61141f565b61023473a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b6102716104103660046124e6565b6115ac565b6101ce6405ca1ab1e081565b61027161042f36600461253b565b611628565b60075461020990600160c01b90046001600160401b031681565b61027161045c3660046125dc565b6117b4565b600254610234906001600160a01b031681565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b6101e9611821565b6101ce635ca1ab1e81565b6102716104bc366004612610565b61183d565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b60075461020990600160401b90046001600160401b031681565b610271610510366004612651565b611bc7565b61051d601b81565b60405160ff90911681526020016101d8565b600054610234906201000090046001600160a01b031681565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016105979190612242565b602060405180830381865afa1580156105b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d891906126c8565b600754909150600090610604906001600160401b03600160801b8204811691600160401b9004166126f7565b6001600160401b03169050806000036106205760009250505090565b61062a818361271e565b9250505090565b6004805461063e90612740565b80601f016020809104026020016040519081016040528092919081815260200182805461066a90612740565b80156106b75780601f1061068c576101008083540402835291602001916106b7565b820191906000526020600020905b81548152906001019060200180831161069a57829003601f168201915b505050505081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461070857604051631736745960e31b815260040160405180910390fd5b806001600160a01b0316836001600160401b03167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59668460405161074d91815260200190565b60405180910390a3505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146107a357604051631736745960e31b815260040160405180910390fd5b600054610100900460ff16158080156107c35750600054600160ff909116105b806107e457506107d230611ec3565b1580156107e4575060005460ff166001145b6108095760405162461bcd60e51b81526004016108009061277a565b60405180910390fd5b6000805460ff19166001179055801561082c576000805461ff0019166101001790555b6000805462010000600160b01b031916620100006001600160a01b038b81169190910291909117909155600280546001600160a01b03191691891691909117905560036108798482612816565b5060046108868382612816565b50600780546001600160c01b0316610d2f60c71b1790556001600160a01b0385166108d05763ffffffff8416156108d057604051630d43a60960e11b815260040160405180910390fd5b60088054610100600160c81b0319166101006001600160a01b0388160263ffffffff60a81b191617600160a81b63ffffffff871602179055600061091587878761141f565b9050600081805190602001209050600042905060008060001b836000801b848e6040516020016109499594939291906128d5565b60408051808303601f19018152908290528051602090910120600780546001600160401b0319166001600160401b0386161790556005819055639a908e7360e01b825291506000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639a908e73906109d3906001908690600401612914565b6020604051808303816000875af11580156109f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a16919061292d565b6040519091506001600160401b03821690600080516020612c6f83398151915290600090a250505050508015610a74576000805461ff001916905560405160018152600080516020612c8f8339815191529060200160405180910390a15b5050505050505050565b6000546201000090046001600160a01b03163314610aaf57604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610adc5760405163f5e37f2f60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5e919061294a565b610b98576007546001600160401b03600160c01b909104811690821610610b985760405163f5e37f2f60e01b815260040160405180910390fd5b600780546001600160c01b0316600160c01b6001600160401b038416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461063e90612740565b6002546001600160a01b03163314610c2d576040516311e7be1560e01b815260040160405180910390fd5b816000819003610c505760405163cb591a5f60e01b815260040160405180910390fd5b6103e8811115610c7357604051635acfba9d60e11b815260040160405180910390fd5b6007546005546001600160401b0380831692600160801b900416908160005b85811015610f49576000898983818110610cae57610cae61296c565b9050602002810190610cc09190612982565b610cc9906129a2565b805180516020909101206060820151919250906001600160401b031615610dc15785610cf481612a32565b96505060008183602001518460600151604051602001610d1693929190612a60565b60408051601f1981840301815291815281516020928301206001600160401b038a16600090815260069093529120549091508114610d675760405163671ebaaf60e11b815260040160405180910390fd5b82606001516001600160401b031683604001516001600160401b03161015610da257604051633fbd5c3960e11b815260040160405180910390fd5b506001600160401b038616600090815260066020526040812055610ea6565b602082015115801590610e62575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303816000875af1158015610e3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6091906126c8565b155b15610e80576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c01015610ea6576040516328a69b1f60e21b815260040160405180910390fd5b866001600160401b031682604001516001600160401b03161080610ed657504282604001516001600160401b0316115b15610ef4576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518c604051602001610f159594939291906128d5565b6040516020818303038152906040528051906020012094508160400151965050508080610f4190612a83565b915050610c92565b506007546001600160401b03600160401b90910481169084161115610f815760405163c630a00d60e01b815260040160405180910390fd5b600780546001600160401b0319166001600160401b0386811691909117909155600583905585908281169085161461106d576000610fbf83866126f7565b9050610fd46001600160401b03821683612a9c565b91506110477f0000000000000000000000000000000000000000000000000000000000000000826001600160401b031661100c610548565b6110169190612ab5565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190611ed2565b5060078054600160801b600160c01b031916600160801b6001600160401b038716021790555b611151337f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111591906126c8565b61111f9190612ab5565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190611f3a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156111ac57600080fd5b505af11580156111c0573d6000803e3d6000fd5b5050604051639a908e7360e01b8152600092506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150639a908e7390611215908a908890600401612914565b6020604051808303816000875af1158015611234573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611258919061292d565b6040519091506001600160401b03821690600080516020612c6f83398151915290600090a250505050505050505050565b6000546201000090046001600160a01b031633146112ba57604051634755657960e01b815260040160405180910390fd5b60085460ff16156112de5760405163f6ba91a160e01b815260040160405180910390fd5b6008805460ff191660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b6000546201000090046001600160a01b0316331461134757604051634755657960e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383161790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610bea908390612242565b6001546001600160a01b031633146113bd5760405163d1ec4b2360e01b815260040160405180910390fd5b60015460008054620100006001600160a01b0390931692830262010000600160b01b03199091161790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9161141591612242565b60405180910390a1565b60606000604051806060016040528060218152602001612ccf6021913960405163ffffffff80881660248301526001600160a01b03871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa6084820152600060a482015260c40160408051601f19818403018152918152602080830180516001600160e01b03166369a3b57f60e11b17905290516114bf93929101612acc565b60408051601f198184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa15801561152f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166115635760405163668b0cb360e11b815260040160405180910390fd5b6040516000906115919084906405ca1ab1e090635ca1ab1e90601b906001600160f81b031990602001612afb565b60408051808303601f19018152919052979650505050505050565b6000546201000090046001600160a01b031633146115dd57604051634755657960e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610bea908390612242565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461167157604051631736745960e31b815260040160405180910390fd5b600054610100900460ff16158080156116915750600054600160ff909116105b806116b257506116a030611ec3565b1580156116b2575060005460ff166001145b6116ce5760405162461bcd60e51b81526004016108009061277a565b6000805460ff1916600117905580156116f1576000805461ff0019166101001790555b6000805462010000600160b01b031916620100006001600160a01b038a81169190910291909117909155600280546001600160a01b031916918816919091179055600361173e8682612816565b50600461174b8582612816565b50600583905560078054610d2f60c71b600160401b600160c01b039091166001600160401b0385161717905580156117ab576000805461ff001916905560405160018152600080516020612c8f8339815191529060200160405180910390a15b50505050505050565b6000546201000090046001600160a01b031633146117e557604051634755657960e01b815260040160405180910390fd5b60036117f18282612816565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610bea9190612228565b604051806060016040528060218152602001612ccf6021913981565b60085460ff16611860576040516324eff8c360e01b815260040160405180910390fd5b8060008190036118835760405163cb591a5f60e01b815260040160405180910390fd5b6103e88111156118a657604051635acfba9d60e11b815260040160405180910390fd5b6007546001600160401b03600160401b82048116916118ce918491600160801b900416612b3f565b11156118ed5760405163c630a00d60e01b815260040160405180910390fd5b600754600554600160801b9091046001600160401b03169060005b83811015611a8b5760008686838181106119245761192461296c565b90506020028101906119369190612b52565b61193f90612b68565b90508361194b81612a32565b825180516020918201208185015160408087015190519499509194506000936119779386939101612a60565b60408051601f1981840301815291815281516020928301206001600160401b0389166000908152600690935291205490915081146119c85760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b0386166000908152600660205260408120556119ec600188612a9c565b8403611a405742600760189054906101000a90046001600160401b03168460400151611a189190612be5565b6001600160401b03161115611a405760405163c44a082160e01b815260040160405180910390fd5b848284602001514233604051602001611a5d9594939291906128d5565b6040516020818303038152906040528051906020012094505050508080611a8390612a83565b915050611908565b50611ab97f00000000000000000000000000000000000000000000000000000000000000008461100c610548565b6005819055600780546001600160401b03848116600160801b026001600160401b03600160801b03600160c01b0319909216429190911617179055604051639a908e7360e01b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611b459087908690600401612914565b6020604051808303816000875af1158015611b64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b88919061292d565b6040519091506001600160401b038216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16611bea576040516324eff8c360e01b815260040160405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6e91906126c8565b905081811115611c9157604051632354600f60e01b815260040160405180910390fd5b611388831115611cb4576040516328a69b1f60e21b815260040160405180910390fd5b611ce96001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084611f3a565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6d91906126c8565b60078054919250600160401b9091046001600160401b0316906008611d9183612a32565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508484604051611dc6929190612c05565b604051908190038120611ddf9183904290602001612a60565b60408051808303601f190181529181528151602092830120600754600160401b90046001600160401b031660009081526006909352912055323303611e7157600754604080518381523360208201526060918101829052600091810191909152600160401b9091046001600160401b031690600080516020612caf8339815191529060800160405180910390a2611ebc565b600760089054906101000a90046001600160401b03166001600160401b0316600080516020612caf83398151915282338888604051611eb39493929190612c15565b60405180910390a25b5050505050565b6001600160a01b03163b151590565b6040516001600160a01b038316602482015260448101829052611f3590849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611f78565b505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611f729085906323b872dd60e01b90608401611efe565b50505050565b6000611fcd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661204a9092919063ffffffff16565b805190915015611f355780806020019051810190611feb919061294a565b611f355760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610800565b60606120598484600085612061565b949350505050565b6060824710156120c25760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610800565b600080866001600160a01b031685876040516120de9190612c5c565b60006040518083038185875af1925050503d806000811461211b576040519150601f19603f3d011682016040523d82523d6000602084013e612120565b606091505b50915091506121318783838761213c565b979650505050505050565b606083156121a95782516000036121a25761215685611ec3565b6121a25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610800565b5081612059565b61205983838151156121be5781518083602001fd5b8060405162461bcd60e51b81526004016108009190612228565b60005b838110156121f35781810151838201526020016121db565b50506000910152565b600081518084526122148160208601602086016121d8565b601f01601f19169290920160200192915050565b60208152600061223b60208301846121fc565b9392505050565b6001600160a01b0391909116815260200190565b6001600160401b038116811461226b57600080fd5b50565b80356001600160a01b038116811461228557600080fd5b919050565b60008060006060848603121561229f57600080fd5b83356122aa81612256565b9250602084013591506122bf6040850161226e565b90509250925092565b803563ffffffff8116811461228557600080fd5b634e487b7160e01b600052604160045260246000fd5b600082601f83011261230357600080fd5b81356001600160401b038082111561231d5761231d6122dc565b604051601f8301601f19908116603f01168101908282118183101715612345576123456122dc565b8160405283815286602085880101111561235e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121561239957600080fd5b6123a28861226e565b96506123b06020890161226e565b95506123be604089016122c8565b94506123cc6060890161226e565b93506123da608089016122c8565b925060a08801356001600160401b03808211156123f657600080fd5b6124028b838c016122f2565b935060c08a013591508082111561241857600080fd5b506124258a828b016122f2565b91505092959891949750929550565b60006020828403121561244657600080fd5b813561223b81612256565b60008083601f84011261246357600080fd5b5081356001600160401b0381111561247a57600080fd5b6020830191508360208260051b850101111561249557600080fd5b9250929050565b6000806000604084860312156124b157600080fd5b83356001600160401b038111156124c757600080fd5b6124d386828701612451565b90945092506122bf90506020850161226e565b6000602082840312156124f857600080fd5b61223b8261226e565b60008060006060848603121561251657600080fd5b61251f846122c8565b925061252d6020850161226e565b91506122bf604085016122c8565b60008060008060008060c0878903121561255457600080fd5b61255d8761226e565b955061256b6020880161226e565b945060408701356001600160401b038082111561258757600080fd5b6125938a838b016122f2565b955060608901359150808211156125a957600080fd5b506125b689828a016122f2565b9350506080870135915060a08701356125ce81612256565b809150509295509295509295565b6000602082840312156125ee57600080fd5b81356001600160401b0381111561260457600080fd5b612059848285016122f2565b6000806020838503121561262357600080fd5b82356001600160401b0381111561263957600080fd5b61264585828601612451565b90969095509350505050565b60008060006040848603121561266657600080fd5b83356001600160401b038082111561267d57600080fd5b818601915086601f83011261269157600080fd5b8135818111156126a057600080fd5b8760208285010111156126b257600080fd5b6020928301989097509590910135949350505050565b6000602082840312156126da57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03828116828216039080821115612717576127176126e1565b5092915050565b60008261273b57634e487b7160e01b600052601260045260246000fd5b500490565b600181811c9082168061275457607f821691505b60208210810361277457634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b601f821115611f3557600081815260208120601f850160051c810160208610156127ef5750805b601f850160051c820191505b8181101561280e578281556001016127fb565b505050505050565b81516001600160401b0381111561282f5761282f6122dc565b6128438161283d8454612740565b846127c8565b602080601f83116001811461287857600084156128605750858301515b600019600386901b1c1916600185901b17855561280e565b600085815260208120601f198616915b828110156128a757888601518255948401946001909101908401612888565b50858210156128c55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b6001600160401b03929092168252602082015260400190565b60006020828403121561293f57600080fd5b815161223b81612256565b60006020828403121561295c57600080fd5b8151801515811461223b57600080fd5b634e487b7160e01b600052603260045260246000fd5b60008235607e1983360301811261299857600080fd5b9190910192915050565b6000608082360312156129b457600080fd5b604051608081016001600160401b0380821183831017156129d7576129d76122dc565b8160405284359150808211156129ec57600080fd5b506129f9368286016122f2565b825250602083013560208201526040830135612a1481612256565b60408201526060830135612a2781612256565b606082015292915050565b60006001600160401b038281166002600160401b03198101612a5657612a566126e1565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b600060018201612a9557612a956126e1565b5060010190565b81810381811115612aaf57612aaf6126e1565b92915050565b8082028115828204841417612aaf57612aaf6126e1565b60008351612ade8184602088016121d8565b835190830190612af28183602088016121d8565b01949350505050565b60008651612b0d818460208b016121d8565b9190910194855250602084019290925260f81b6001600160f81b03199081166040840152166041820152604201919050565b80820180821115612aaf57612aaf6126e1565b60008235605e1983360301811261299857600080fd5b600060608236031215612b7a57600080fd5b604051606081016001600160401b038082118383101715612b9d57612b9d6122dc565b816040528435915080821115612bb257600080fd5b50612bbf368286016122f2565b825250602083013560208201526040830135612bda81612256565b604082015292915050565b6001600160401b03818116838216019080821115612717576127176126e1565b8183823760009101908152919050565b8481526001600160a01b03841660208201526060604082018190528101829052818360808301376000818301608090810191909152601f909201601f191601019392505050565b600082516129988184602087016121d856fe303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498f94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931f8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a26469706673582212204710e7881df2a623dab8b587e3c8f0acd5809db9326b5ffd88b9639d777bbdfd64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101c15760003560e01c8062d0295d146101c6578063107bf28c146101e157806319d8ac61146101f657806326782247146102215780632b35b3ac1461024157806332c2d1531461025e5780633c351e10146102735780633cbc795b1461028b57806340b5de6c146102b757806345605267146102df57806347ebf108146102f957806349b7b8021461030c5780634e48770614610333578063542028d5146103465780635e9145c91461034e5780635ec91958146103615780636b8616ce146103695780636e05d2cd146103895780636ff512cc146103925780638c3d7301146103a557806399af0397146103ad5780639e001877146103c0578063a3c573eb146103db578063ada8f91914610402578063b0afe15414610415578063bb59070814610421578063c754c7ed14610434578063c89e42df1461044e578063cfa8ed4714610461578063d02103ca14610474578063d690be311461049b578063d7bc90ff146104a3578063d8d1091b146104ae578063e46761c4146104c1578063e7a7ed02146104e8578063eaeb077b14610502578063f35dda4714610515578063f851a4401461052f575b600080fd5b6101ce610548565b6040519081526020015b60405180910390f35b6101e9610631565b6040516101d89190612228565b600754610209906001600160401b031681565b6040516001600160401b0390911681526020016101d8565b600154610234906001600160a01b031681565b6040516101d89190612242565b60085461024e9060ff1681565b60405190151581526020016101d8565b61027161026c36600461228a565b6106bf565b005b6008546102349061010090046001600160a01b031681565b6008546102a290600160a81b900463ffffffff1681565b60405163ffffffff90911681526020016101d8565b6102c66001600160f81b031981565b6040516001600160f81b031990911681526020016101d8565b60075461020990600160801b90046001600160401b031681565b61027161030736600461237e565b61075a565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b610271610341366004612434565b610a7e565b6101e9610bf5565b61027161035c36600461249c565b610c02565b610271611289565b6101ce610377366004612434565b60066020526000908152604090205481565b6101ce60055481565b6102716103a03660046124e6565b611316565b610271611392565b6101e96103bb366004612501565b61141f565b61023473a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b6102716104103660046124e6565b6115ac565b6101ce6405ca1ab1e081565b61027161042f36600461253b565b611628565b60075461020990600160c01b90046001600160401b031681565b61027161045c3660046125dc565b6117b4565b600254610234906001600160a01b031681565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b6101e9611821565b6101ce635ca1ab1e81565b6102716104bc366004612610565b61183d565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b60075461020990600160401b90046001600160401b031681565b610271610510366004612651565b611bc7565b61051d601b81565b60405160ff90911681526020016101d8565b600054610234906201000090046001600160a01b031681565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016105979190612242565b602060405180830381865afa1580156105b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d891906126c8565b600754909150600090610604906001600160401b03600160801b8204811691600160401b9004166126f7565b6001600160401b03169050806000036106205760009250505090565b61062a818361271e565b9250505090565b6004805461063e90612740565b80601f016020809104026020016040519081016040528092919081815260200182805461066a90612740565b80156106b75780601f1061068c576101008083540402835291602001916106b7565b820191906000526020600020905b81548152906001019060200180831161069a57829003601f168201915b505050505081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461070857604051631736745960e31b815260040160405180910390fd5b806001600160a01b0316836001600160401b03167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59668460405161074d91815260200190565b60405180910390a3505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146107a357604051631736745960e31b815260040160405180910390fd5b600054610100900460ff16158080156107c35750600054600160ff909116105b806107e457506107d230611ec3565b1580156107e4575060005460ff166001145b6108095760405162461bcd60e51b81526004016108009061277a565b60405180910390fd5b6000805460ff19166001179055801561082c576000805461ff0019166101001790555b6000805462010000600160b01b031916620100006001600160a01b038b81169190910291909117909155600280546001600160a01b03191691891691909117905560036108798482612816565b5060046108868382612816565b50600780546001600160c01b0316610d2f60c71b1790556001600160a01b0385166108d05763ffffffff8416156108d057604051630d43a60960e11b815260040160405180910390fd5b60088054610100600160c81b0319166101006001600160a01b0388160263ffffffff60a81b191617600160a81b63ffffffff871602179055600061091587878761141f565b9050600081805190602001209050600042905060008060001b836000801b848e6040516020016109499594939291906128d5565b60408051808303601f19018152908290528051602090910120600780546001600160401b0319166001600160401b0386161790556005819055639a908e7360e01b825291506000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639a908e73906109d3906001908690600401612914565b6020604051808303816000875af11580156109f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a16919061292d565b6040519091506001600160401b03821690600080516020612c6f83398151915290600090a250505050508015610a74576000805461ff001916905560405160018152600080516020612c8f8339815191529060200160405180910390a15b5050505050505050565b6000546201000090046001600160a01b03163314610aaf57604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610adc5760405163f5e37f2f60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5e919061294a565b610b98576007546001600160401b03600160c01b909104811690821610610b985760405163f5e37f2f60e01b815260040160405180910390fd5b600780546001600160c01b0316600160c01b6001600160401b038416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461063e90612740565b6002546001600160a01b03163314610c2d576040516311e7be1560e01b815260040160405180910390fd5b816000819003610c505760405163cb591a5f60e01b815260040160405180910390fd5b6103e8811115610c7357604051635acfba9d60e11b815260040160405180910390fd5b6007546005546001600160401b0380831692600160801b900416908160005b85811015610f49576000898983818110610cae57610cae61296c565b9050602002810190610cc09190612982565b610cc9906129a2565b805180516020909101206060820151919250906001600160401b031615610dc15785610cf481612a32565b96505060008183602001518460600151604051602001610d1693929190612a60565b60408051601f1981840301815291815281516020928301206001600160401b038a16600090815260069093529120549091508114610d675760405163671ebaaf60e11b815260040160405180910390fd5b82606001516001600160401b031683604001516001600160401b03161015610da257604051633fbd5c3960e11b815260040160405180910390fd5b506001600160401b038616600090815260066020526040812055610ea6565b602082015115801590610e62575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303816000875af1158015610e3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6091906126c8565b155b15610e80576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c01015610ea6576040516328a69b1f60e21b815260040160405180910390fd5b866001600160401b031682604001516001600160401b03161080610ed657504282604001516001600160401b0316115b15610ef4576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518c604051602001610f159594939291906128d5565b6040516020818303038152906040528051906020012094508160400151965050508080610f4190612a83565b915050610c92565b506007546001600160401b03600160401b90910481169084161115610f815760405163c630a00d60e01b815260040160405180910390fd5b600780546001600160401b0319166001600160401b0386811691909117909155600583905585908281169085161461106d576000610fbf83866126f7565b9050610fd46001600160401b03821683612a9c565b91506110477f0000000000000000000000000000000000000000000000000000000000000000826001600160401b031661100c610548565b6110169190612ab5565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190611ed2565b5060078054600160801b600160c01b031916600160801b6001600160401b038716021790555b611151337f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111591906126c8565b61111f9190612ab5565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190611f3a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156111ac57600080fd5b505af11580156111c0573d6000803e3d6000fd5b5050604051639a908e7360e01b8152600092506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150639a908e7390611215908a908890600401612914565b6020604051808303816000875af1158015611234573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611258919061292d565b6040519091506001600160401b03821690600080516020612c6f83398151915290600090a250505050505050505050565b6000546201000090046001600160a01b031633146112ba57604051634755657960e01b815260040160405180910390fd5b60085460ff16156112de5760405163f6ba91a160e01b815260040160405180910390fd5b6008805460ff191660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b6000546201000090046001600160a01b0316331461134757604051634755657960e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383161790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610bea908390612242565b6001546001600160a01b031633146113bd5760405163d1ec4b2360e01b815260040160405180910390fd5b60015460008054620100006001600160a01b0390931692830262010000600160b01b03199091161790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9161141591612242565b60405180910390a1565b60606000604051806060016040528060218152602001612ccf6021913960405163ffffffff80881660248301526001600160a01b03871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa6084820152600060a482015260c40160408051601f19818403018152918152602080830180516001600160e01b03166369a3b57f60e11b17905290516114bf93929101612acc565b60408051601f198184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa15801561152f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166115635760405163668b0cb360e11b815260040160405180910390fd5b6040516000906115919084906405ca1ab1e090635ca1ab1e90601b906001600160f81b031990602001612afb565b60408051808303601f19018152919052979650505050505050565b6000546201000090046001600160a01b031633146115dd57604051634755657960e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610bea908390612242565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461167157604051631736745960e31b815260040160405180910390fd5b600054610100900460ff16158080156116915750600054600160ff909116105b806116b257506116a030611ec3565b1580156116b2575060005460ff166001145b6116ce5760405162461bcd60e51b81526004016108009061277a565b6000805460ff1916600117905580156116f1576000805461ff0019166101001790555b6000805462010000600160b01b031916620100006001600160a01b038a81169190910291909117909155600280546001600160a01b031916918816919091179055600361173e8682612816565b50600461174b8582612816565b50600583905560078054610d2f60c71b600160401b600160c01b039091166001600160401b0385161717905580156117ab576000805461ff001916905560405160018152600080516020612c8f8339815191529060200160405180910390a15b50505050505050565b6000546201000090046001600160a01b031633146117e557604051634755657960e01b815260040160405180910390fd5b60036117f18282612816565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610bea9190612228565b604051806060016040528060218152602001612ccf6021913981565b60085460ff16611860576040516324eff8c360e01b815260040160405180910390fd5b8060008190036118835760405163cb591a5f60e01b815260040160405180910390fd5b6103e88111156118a657604051635acfba9d60e11b815260040160405180910390fd5b6007546001600160401b03600160401b82048116916118ce918491600160801b900416612b3f565b11156118ed5760405163c630a00d60e01b815260040160405180910390fd5b600754600554600160801b9091046001600160401b03169060005b83811015611a8b5760008686838181106119245761192461296c565b90506020028101906119369190612b52565b61193f90612b68565b90508361194b81612a32565b825180516020918201208185015160408087015190519499509194506000936119779386939101612a60565b60408051601f1981840301815291815281516020928301206001600160401b0389166000908152600690935291205490915081146119c85760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b0386166000908152600660205260408120556119ec600188612a9c565b8403611a405742600760189054906101000a90046001600160401b03168460400151611a189190612be5565b6001600160401b03161115611a405760405163c44a082160e01b815260040160405180910390fd5b848284602001514233604051602001611a5d9594939291906128d5565b6040516020818303038152906040528051906020012094505050508080611a8390612a83565b915050611908565b50611ab97f00000000000000000000000000000000000000000000000000000000000000008461100c610548565b6005819055600780546001600160401b03848116600160801b026001600160401b03600160801b03600160c01b0319909216429190911617179055604051639a908e7360e01b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611b459087908690600401612914565b6020604051808303816000875af1158015611b64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b88919061292d565b6040519091506001600160401b038216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16611bea576040516324eff8c360e01b815260040160405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6e91906126c8565b905081811115611c9157604051632354600f60e01b815260040160405180910390fd5b611388831115611cb4576040516328a69b1f60e21b815260040160405180910390fd5b611ce96001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084611f3a565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6d91906126c8565b60078054919250600160401b9091046001600160401b0316906008611d9183612a32565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508484604051611dc6929190612c05565b604051908190038120611ddf9183904290602001612a60565b60408051808303601f190181529181528151602092830120600754600160401b90046001600160401b031660009081526006909352912055323303611e7157600754604080518381523360208201526060918101829052600091810191909152600160401b9091046001600160401b031690600080516020612caf8339815191529060800160405180910390a2611ebc565b600760089054906101000a90046001600160401b03166001600160401b0316600080516020612caf83398151915282338888604051611eb39493929190612c15565b60405180910390a25b5050505050565b6001600160a01b03163b151590565b6040516001600160a01b038316602482015260448101829052611f3590849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611f78565b505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611f729085906323b872dd60e01b90608401611efe565b50505050565b6000611fcd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661204a9092919063ffffffff16565b805190915015611f355780806020019051810190611feb919061294a565b611f355760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610800565b60606120598484600085612061565b949350505050565b6060824710156120c25760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610800565b600080866001600160a01b031685876040516120de9190612c5c565b60006040518083038185875af1925050503d806000811461211b576040519150601f19603f3d011682016040523d82523d6000602084013e612120565b606091505b50915091506121318783838761213c565b979650505050505050565b606083156121a95782516000036121a25761215685611ec3565b6121a25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610800565b5081612059565b61205983838151156121be5781518083602001fd5b8060405162461bcd60e51b81526004016108009190612228565b60005b838110156121f35781810151838201526020016121db565b50506000910152565b600081518084526122148160208601602086016121d8565b601f01601f19169290920160200192915050565b60208152600061223b60208301846121fc565b9392505050565b6001600160a01b0391909116815260200190565b6001600160401b038116811461226b57600080fd5b50565b80356001600160a01b038116811461228557600080fd5b919050565b60008060006060848603121561229f57600080fd5b83356122aa81612256565b9250602084013591506122bf6040850161226e565b90509250925092565b803563ffffffff8116811461228557600080fd5b634e487b7160e01b600052604160045260246000fd5b600082601f83011261230357600080fd5b81356001600160401b038082111561231d5761231d6122dc565b604051601f8301601f19908116603f01168101908282118183101715612345576123456122dc565b8160405283815286602085880101111561235e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121561239957600080fd5b6123a28861226e565b96506123b06020890161226e565b95506123be604089016122c8565b94506123cc6060890161226e565b93506123da608089016122c8565b925060a08801356001600160401b03808211156123f657600080fd5b6124028b838c016122f2565b935060c08a013591508082111561241857600080fd5b506124258a828b016122f2565b91505092959891949750929550565b60006020828403121561244657600080fd5b813561223b81612256565b60008083601f84011261246357600080fd5b5081356001600160401b0381111561247a57600080fd5b6020830191508360208260051b850101111561249557600080fd5b9250929050565b6000806000604084860312156124b157600080fd5b83356001600160401b038111156124c757600080fd5b6124d386828701612451565b90945092506122bf90506020850161226e565b6000602082840312156124f857600080fd5b61223b8261226e565b60008060006060848603121561251657600080fd5b61251f846122c8565b925061252d6020850161226e565b91506122bf604085016122c8565b60008060008060008060c0878903121561255457600080fd5b61255d8761226e565b955061256b6020880161226e565b945060408701356001600160401b038082111561258757600080fd5b6125938a838b016122f2565b955060608901359150808211156125a957600080fd5b506125b689828a016122f2565b9350506080870135915060a08701356125ce81612256565b809150509295509295509295565b6000602082840312156125ee57600080fd5b81356001600160401b0381111561260457600080fd5b612059848285016122f2565b6000806020838503121561262357600080fd5b82356001600160401b0381111561263957600080fd5b61264585828601612451565b90969095509350505050565b60008060006040848603121561266657600080fd5b83356001600160401b038082111561267d57600080fd5b818601915086601f83011261269157600080fd5b8135818111156126a057600080fd5b8760208285010111156126b257600080fd5b6020928301989097509590910135949350505050565b6000602082840312156126da57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03828116828216039080821115612717576127176126e1565b5092915050565b60008261273b57634e487b7160e01b600052601260045260246000fd5b500490565b600181811c9082168061275457607f821691505b60208210810361277457634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b601f821115611f3557600081815260208120601f850160051c810160208610156127ef5750805b601f850160051c820191505b8181101561280e578281556001016127fb565b505050505050565b81516001600160401b0381111561282f5761282f6122dc565b6128438161283d8454612740565b846127c8565b602080601f83116001811461287857600084156128605750858301515b600019600386901b1c1916600185901b17855561280e565b600085815260208120601f198616915b828110156128a757888601518255948401946001909101908401612888565b50858210156128c55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b6001600160401b03929092168252602082015260400190565b60006020828403121561293f57600080fd5b815161223b81612256565b60006020828403121561295c57600080fd5b8151801515811461223b57600080fd5b634e487b7160e01b600052603260045260246000fd5b60008235607e1983360301811261299857600080fd5b9190910192915050565b6000608082360312156129b457600080fd5b604051608081016001600160401b0380821183831017156129d7576129d76122dc565b8160405284359150808211156129ec57600080fd5b506129f9368286016122f2565b825250602083013560208201526040830135612a1481612256565b60408201526060830135612a2781612256565b606082015292915050565b60006001600160401b038281166002600160401b03198101612a5657612a566126e1565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b600060018201612a9557612a956126e1565b5060010190565b81810381811115612aaf57612aaf6126e1565b92915050565b8082028115828204841417612aaf57612aaf6126e1565b60008351612ade8184602088016121d8565b835190830190612af28183602088016121d8565b01949350505050565b60008651612b0d818460208b016121d8565b9190910194855250602084019290925260f81b6001600160f81b03199081166040840152166041820152604201919050565b80820180821115612aaf57612aaf6126e1565b60008235605e1983360301811261299857600080fd5b600060608236031215612b7a57600080fd5b604051606081016001600160401b038082118383101715612b9d57612b9d6122dc565b816040528435915080821115612bb257600080fd5b50612bbf368286016122f2565b825250602083013560208201526040830135612bda81612256565b604082015292915050565b6001600160401b03818116838216019080821115612717576127176126e1565b8183823760009101908152919050565b8481526001600160a01b03841660208201526060604082018190528101829052818360808301376000818301608090810191909152601f909201601f191601019392505050565b600082516129988184602087016121d856fe303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498f94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931f8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a26469706673582212204710e7881df2a623dab8b587e3c8f0acd5809db9326b5ffd88b9639d777bbdfd64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/ProxyAdmin.json b/compiled-contracts/paris/ProxyAdmin.json index 23b280968..372cdc4c7 100644 --- a/compiled-contracts/paris/ProxyAdmin.json +++ b/compiled-contracts/paris/ProxyAdmin.json @@ -153,8 +153,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561000f575f80fd5b506100193361001e565b61006d565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61066b8061007a5f395ff3fe60806040526004361061006a575f3560e01c8063204e1c7a1461006e578063715018a6146100a35780637eff275e146100b95780638da5cb5b146100d85780639623609d146100ec57806399a88ec4146100ff578063f2fde38b1461011e578063f3b7dead1461013d575b5f80fd5b348015610079575f80fd5b5061008d610088366004610470565b61015c565b60405161009a9190610492565b60405180910390f35b3480156100ae575f80fd5b506100b76101e7565b005b3480156100c4575f80fd5b506100b76100d33660046104a6565b6101fa565b3480156100e3575f80fd5b5061008d61025f565b6100b76100fa3660046104f1565b61026d565b34801561010a575f80fd5b506100b76101193660046104a6565b6102d8565b348015610129575f80fd5b506100b7610138366004610470565b61030c565b348015610148575f80fd5b5061008d610157366004610470565b61038a565b5f805f836001600160a01b031660405161018090635c60da1b60e01b815260040190565b5f60405180830381855afa9150503d805f81146101b8576040519150601f19603f3d011682016040523d82523d5f602084013e6101bd565b606091505b5091509150816101cb575f80fd5b808060200190518101906101df91906105bf565b949350505050565b6101ef6103ae565b6101f85f61040d565b565b6102026103ae565b6040516308f2839760e41b81526001600160a01b03831690638f2839709061022e908490600401610492565b5f604051808303815f87803b158015610245575f80fd5b505af1158015610257573d5f803e3d5ffd5b505050505050565b5f546001600160a01b031690565b6102756103ae565b60405163278f794360e11b81526001600160a01b03841690634f1ef2869034906102a590869086906004016105da565b5f604051808303818588803b1580156102bc575f80fd5b505af11580156102ce573d5f803e3d5ffd5b5050505050505050565b6102e06103ae565b604051631b2ce7f360e11b81526001600160a01b03831690633659cfe69061022e908490600401610492565b6103146103ae565b6001600160a01b03811661037e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6103878161040d565b50565b5f805f836001600160a01b0316604051610180906303e1469160e61b815260040190565b336103b761025f565b6001600160a01b0316146101f85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610375565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610387575f80fd5b5f60208284031215610480575f80fd5b813561048b8161045c565b9392505050565b6001600160a01b0391909116815260200190565b5f80604083850312156104b7575f80fd5b82356104c28161045c565b915060208301356104d28161045c565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610503575f80fd5b833561050e8161045c565b9250602084013561051e8161045c565b915060408401356001600160401b0380821115610539575f80fd5b818601915086601f83011261054c575f80fd5b81358181111561055e5761055e6104dd565b604051601f8201601f19908116603f01168101908382118183101715610586576105866104dd565b8160405282815289602084870101111561059e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f602082840312156105cf575f80fd5b815161048b8161045c565b60018060a01b03831681525f602060408184015283518060408501525f5b81811015610614578581018301518582016060015282016105f8565b505f606082860101526060601f19601f83011685010192505050939250505056fea26469706673582212202fc04582b7c2b48c495ce0d90b114cc8562292a55b43c17cc68bfc1381aa1d3464736f6c63430008140033", - "deployedBytecode": "0x60806040526004361061006a575f3560e01c8063204e1c7a1461006e578063715018a6146100a35780637eff275e146100b95780638da5cb5b146100d85780639623609d146100ec57806399a88ec4146100ff578063f2fde38b1461011e578063f3b7dead1461013d575b5f80fd5b348015610079575f80fd5b5061008d610088366004610470565b61015c565b60405161009a9190610492565b60405180910390f35b3480156100ae575f80fd5b506100b76101e7565b005b3480156100c4575f80fd5b506100b76100d33660046104a6565b6101fa565b3480156100e3575f80fd5b5061008d61025f565b6100b76100fa3660046104f1565b61026d565b34801561010a575f80fd5b506100b76101193660046104a6565b6102d8565b348015610129575f80fd5b506100b7610138366004610470565b61030c565b348015610148575f80fd5b5061008d610157366004610470565b61038a565b5f805f836001600160a01b031660405161018090635c60da1b60e01b815260040190565b5f60405180830381855afa9150503d805f81146101b8576040519150601f19603f3d011682016040523d82523d5f602084013e6101bd565b606091505b5091509150816101cb575f80fd5b808060200190518101906101df91906105bf565b949350505050565b6101ef6103ae565b6101f85f61040d565b565b6102026103ae565b6040516308f2839760e41b81526001600160a01b03831690638f2839709061022e908490600401610492565b5f604051808303815f87803b158015610245575f80fd5b505af1158015610257573d5f803e3d5ffd5b505050505050565b5f546001600160a01b031690565b6102756103ae565b60405163278f794360e11b81526001600160a01b03841690634f1ef2869034906102a590869086906004016105da565b5f604051808303818588803b1580156102bc575f80fd5b505af11580156102ce573d5f803e3d5ffd5b5050505050505050565b6102e06103ae565b604051631b2ce7f360e11b81526001600160a01b03831690633659cfe69061022e908490600401610492565b6103146103ae565b6001600160a01b03811661037e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6103878161040d565b50565b5f805f836001600160a01b0316604051610180906303e1469160e61b815260040190565b336103b761025f565b6001600160a01b0316146101f85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610375565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610387575f80fd5b5f60208284031215610480575f80fd5b813561048b8161045c565b9392505050565b6001600160a01b0391909116815260200190565b5f80604083850312156104b7575f80fd5b82356104c28161045c565b915060208301356104d28161045c565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610503575f80fd5b833561050e8161045c565b9250602084013561051e8161045c565b915060408401356001600160401b0380821115610539575f80fd5b818601915086601f83011261054c575f80fd5b81358181111561055e5761055e6104dd565b604051601f8201601f19908116603f01168101908382118183101715610586576105866104dd565b8160405282815289602084870101111561059e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f602082840312156105cf575f80fd5b815161048b8161045c565b60018060a01b03831681525f602060408184015283518060408501525f5b81811015610614578581018301518582016060015282016105f8565b505f606082860101526060601f19601f83011685010192505050939250505056fea26469706673582212202fc04582b7c2b48c495ce0d90b114cc8562292a55b43c17cc68bfc1381aa1d3464736f6c63430008140033", + "bytecode": "0x608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61069b8061007e6000396000f3fe60806040526004361061006b5760003560e01c8063204e1c7a14610070578063715018a6146100a65780637eff275e146100bd5780638da5cb5b146100dd5780639623609d146100f257806399a88ec414610105578063f2fde38b14610125578063f3b7dead14610145575b600080fd5b34801561007c57600080fd5b5061009061008b36600461048e565b610165565b60405161009d91906104b2565b60405180910390f35b3480156100b257600080fd5b506100bb6101f6565b005b3480156100c957600080fd5b506100bb6100d83660046104c6565b61020a565b3480156100e957600080fd5b50610090610274565b6100bb610100366004610515565b610283565b34801561011157600080fd5b506100bb6101203660046104c6565b6102f2565b34801561013157600080fd5b506100bb61014036600461048e565b610326565b34801561015157600080fd5b5061009061016036600461048e565b6103a4565b6000806000836001600160a01b031660405161018b90635c60da1b60e01b815260040190565b600060405180830381855afa9150503d80600081146101c6576040519150601f19603f3d011682016040523d82523d6000602084013e6101cb565b606091505b5091509150816101da57600080fd5b808060200190518101906101ee91906105ea565b949350505050565b6101fe6103ca565b6102086000610429565b565b6102126103ca565b6040516308f2839760e41b81526001600160a01b03831690638f2839709061023e9084906004016104b2565b600060405180830381600087803b15801561025857600080fd5b505af115801561026c573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031690565b61028b6103ca565b60405163278f794360e11b81526001600160a01b03841690634f1ef2869034906102bb9086908690600401610607565b6000604051808303818588803b1580156102d457600080fd5b505af11580156102e8573d6000803e3d6000fd5b5050505050505050565b6102fa6103ca565b604051631b2ce7f360e11b81526001600160a01b03831690633659cfe69061023e9084906004016104b2565b61032e6103ca565b6001600160a01b0381166103985760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6103a181610429565b50565b6000806000836001600160a01b031660405161018b906303e1469160e61b815260040190565b336103d3610274565b6001600160a01b0316146102085760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161038f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146103a157600080fd5b6000602082840312156104a057600080fd5b81356104ab81610479565b9392505050565b6001600160a01b0391909116815260200190565b600080604083850312156104d957600080fd5b82356104e481610479565b915060208301356104f481610479565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060006060848603121561052a57600080fd5b833561053581610479565b9250602084013561054581610479565b915060408401356001600160401b038082111561056157600080fd5b818601915086601f83011261057557600080fd5b813581811115610587576105876104ff565b604051601f8201601f19908116603f011681019083821181831017156105af576105af6104ff565b816040528281528960208487010111156105c857600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b6000602082840312156105fc57600080fd5b81516104ab81610479565b60018060a01b038316815260006020604081840152835180604085015260005b8181101561064357858101830151858201606001528201610627565b506000606082860101526060601f19601f83011685010192505050939250505056fea2646970667358221220c1ccd6dc28a6e60391ab78391e5fb83072848700fa839419a7c4fe7a09edd22364736f6c63430008140033", + "deployedBytecode": "0x60806040526004361061006b5760003560e01c8063204e1c7a14610070578063715018a6146100a65780637eff275e146100bd5780638da5cb5b146100dd5780639623609d146100f257806399a88ec414610105578063f2fde38b14610125578063f3b7dead14610145575b600080fd5b34801561007c57600080fd5b5061009061008b36600461048e565b610165565b60405161009d91906104b2565b60405180910390f35b3480156100b257600080fd5b506100bb6101f6565b005b3480156100c957600080fd5b506100bb6100d83660046104c6565b61020a565b3480156100e957600080fd5b50610090610274565b6100bb610100366004610515565b610283565b34801561011157600080fd5b506100bb6101203660046104c6565b6102f2565b34801561013157600080fd5b506100bb61014036600461048e565b610326565b34801561015157600080fd5b5061009061016036600461048e565b6103a4565b6000806000836001600160a01b031660405161018b90635c60da1b60e01b815260040190565b600060405180830381855afa9150503d80600081146101c6576040519150601f19603f3d011682016040523d82523d6000602084013e6101cb565b606091505b5091509150816101da57600080fd5b808060200190518101906101ee91906105ea565b949350505050565b6101fe6103ca565b6102086000610429565b565b6102126103ca565b6040516308f2839760e41b81526001600160a01b03831690638f2839709061023e9084906004016104b2565b600060405180830381600087803b15801561025857600080fd5b505af115801561026c573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031690565b61028b6103ca565b60405163278f794360e11b81526001600160a01b03841690634f1ef2869034906102bb9086908690600401610607565b6000604051808303818588803b1580156102d457600080fd5b505af11580156102e8573d6000803e3d6000fd5b5050505050505050565b6102fa6103ca565b604051631b2ce7f360e11b81526001600160a01b03831690633659cfe69061023e9084906004016104b2565b61032e6103ca565b6001600160a01b0381166103985760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6103a181610429565b50565b6000806000836001600160a01b031660405161018b906303e1469160e61b815260040190565b336103d3610274565b6001600160a01b0316146102085760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161038f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146103a157600080fd5b6000602082840312156104a057600080fd5b81356104ab81610479565b9392505050565b6001600160a01b0391909116815260200190565b600080604083850312156104d957600080fd5b82356104e481610479565b915060208301356104f481610479565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060006060848603121561052a57600080fd5b833561053581610479565b9250602084013561054581610479565b915060408401356001600160401b038082111561056157600080fd5b818601915086601f83011261057557600080fd5b813581811115610587576105876104ff565b604051601f8201601f19908116603f011681019083821181831017156105af576105af6104ff565b816040528281528960208487010111156105c857600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b6000602082840312156105fc57600080fd5b81516104ab81610479565b60018060a01b038316815260006020604081840152835180604085015260005b8181101561064357858101830151858201606001528201610627565b506000606082860101526060601f19601f83011685010192505050939250505056fea2646970667358221220c1ccd6dc28a6e60391ab78391e5fb83072848700fa839419a7c4fe7a09edd22364736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/TokenWrapped.json b/compiled-contracts/paris/TokenWrapped.json index 2915000a5..1546ab5cf 100644 --- a/compiled-contracts/paris/TokenWrapped.json +++ b/compiled-contracts/paris/TokenWrapped.json @@ -471,8 +471,8 @@ "type": "function" } ], - "bytecode": "0x61010060405234801562000011575f80fd5b506040516200150a3803806200150a833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161106c6200049e5f395f61019e01525f818161025f0152818161047f01526104ed01525f61043101525f81816102c401526103fb015261106c5ff3fe608060405234801561000f575f80fd5b5060043610610105575f3560e01c806306fdde0314610109578063095ea7b31461012757806318160ddd1461014a57806320606b701461015c57806323b872dd1461017057806330adf81f14610183578063313ce567146101975780633644e515146101c857806339509351146101d057806340c10f19146101e357806370a08231146101f85780637ecebe001461022057806395d89b411461023f5780639dc29fac14610247578063a3c573eb1461025a578063a457c2d714610299578063a9059cbb146102ac578063cd0d0096146102bf578063d505accf146102e6578063dd62ed3e146102f9578063ffa1ad741461030c575b5f80fd5b61011161032c565b60405161011e9190610d8a565b60405180910390f35b61013a610135366004610df0565b6103bc565b604051901515815260200161011e565b6002545b60405190815260200161011e565b61014e5f8051602061101783398151915281565b61013a61017e366004610e18565b6103d5565b61014e5f80516020610ff783398151915281565b60405160ff7f000000000000000000000000000000000000000000000000000000000000000016815260200161011e565b61014e6103f8565b61013a6101de366004610df0565b610453565b6101f66101f1366004610df0565b610474565b005b61014e610206366004610e51565b6001600160a01b03165f9081526020819052604090205490565b61014e61022e366004610e51565b60056020525f908152604090205481565b6101116104d3565b6101f6610255366004610df0565b6104e2565b6102817f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161011e565b61013a6102a7366004610df0565b610534565b61013a6102ba366004610df0565b6105ae565b61014e7f000000000000000000000000000000000000000000000000000000000000000081565b6101f66102f4366004610e71565b6105bb565b61014e610307366004610ede565b6107de565b610111604051806040016040528060018152602001603160f81b81525081565b60606003805461033b90610f0f565b80601f016020809104026020016040519081016040528092919081815260200182805461036790610f0f565b80156103b25780601f10610389576101008083540402835291602001916103b2565b820191905f5260205f20905b81548152906001019060200180831161039557829003601f168201915b5050505050905090565b5f336103c9818585610808565b60019150505b92915050565b5f336103e285828561092c565b6103ed8585856109a4565b506001949350505050565b5f7f0000000000000000000000000000000000000000000000000000000000000000461461042e5761042946610b33565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b5f336103c981858561046583836107de565b61046f9190610f5b565b610808565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104c55760405162461bcd60e51b81526004016104bc90610f6e565b60405180910390fd5b6104cf8282610bcb565b5050565b60606004805461033b90610f0f565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461052a5760405162461bcd60e51b81526004016104bc90610f6e565b6104cf8282610c75565b5f338161054182866107de565b9050838110156105a15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104bc565b6103ed8286868403610808565b5f336103c98185856109a4565b834211156106175760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104bc565b6001600160a01b0387165f90815260056020526040812080545f80516020610ff7833981519152918a918a918a91908661065083610fbe565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6106ad6103f8565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f1981840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610735573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381161580159061076b5750896001600160a01b0316816001600160a01b0316145b6107c75760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104bc565b6107d28a8a8a610808565b50505050505050505050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661086a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104bc565b6001600160a01b0382166108cb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104bc565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b5f61093784846107de565b90505f19811461099e57818110156109915760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104bc565b61099e8484848403610808565b50505050565b6001600160a01b038316610a085760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104bc565b6001600160a01b038216610a6a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104bc565b6001600160a01b0383165f9081526020819052604090205481811015610ae15760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104bc565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290925f80516020610fd7833981519152910160405180910390a361099e565b5f5f80516020611017833981519152610b4a61032c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c215760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104bc565b8060025f828254610c329190610f5b565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481525f80516020610fd7833981519152910160405180910390a35050565b6001600160a01b038216610cd55760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104bc565b6001600160a01b0382165f9081526020819052604090205481811015610d485760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104bc565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192915f80516020610fd7833981519152910161091f565b5f6020808352835180828501525f5b81811015610db557858101830151858201604001528201610d99565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610deb575f80fd5b919050565b5f8060408385031215610e01575f80fd5b610e0a83610dd5565b946020939093013593505050565b5f805f60608486031215610e2a575f80fd5b610e3384610dd5565b9250610e4160208501610dd5565b9150604084013590509250925092565b5f60208284031215610e61575f80fd5b610e6a82610dd5565b9392505050565b5f805f805f805f60e0888a031215610e87575f80fd5b610e9088610dd5565b9650610e9e60208901610dd5565b95506040880135945060608801359350608088013560ff81168114610ec1575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215610eef575f80fd5b610ef883610dd5565b9150610f0660208401610dd5565b90509250929050565b600181811c90821680610f2357607f821691505b602082108103610f4157634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156103cf576103cf610f47565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b5f60018201610fcf57610fcf610f47565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa26469706673582212206c12be332dd873b7cf88c58dfc4762858b63e8ff3bf8563b47828a5a4272643b64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610105575f3560e01c806306fdde0314610109578063095ea7b31461012757806318160ddd1461014a57806320606b701461015c57806323b872dd1461017057806330adf81f14610183578063313ce567146101975780633644e515146101c857806339509351146101d057806340c10f19146101e357806370a08231146101f85780637ecebe001461022057806395d89b411461023f5780639dc29fac14610247578063a3c573eb1461025a578063a457c2d714610299578063a9059cbb146102ac578063cd0d0096146102bf578063d505accf146102e6578063dd62ed3e146102f9578063ffa1ad741461030c575b5f80fd5b61011161032c565b60405161011e9190610d8a565b60405180910390f35b61013a610135366004610df0565b6103bc565b604051901515815260200161011e565b6002545b60405190815260200161011e565b61014e5f8051602061101783398151915281565b61013a61017e366004610e18565b6103d5565b61014e5f80516020610ff783398151915281565b60405160ff7f000000000000000000000000000000000000000000000000000000000000000016815260200161011e565b61014e6103f8565b61013a6101de366004610df0565b610453565b6101f66101f1366004610df0565b610474565b005b61014e610206366004610e51565b6001600160a01b03165f9081526020819052604090205490565b61014e61022e366004610e51565b60056020525f908152604090205481565b6101116104d3565b6101f6610255366004610df0565b6104e2565b6102817f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161011e565b61013a6102a7366004610df0565b610534565b61013a6102ba366004610df0565b6105ae565b61014e7f000000000000000000000000000000000000000000000000000000000000000081565b6101f66102f4366004610e71565b6105bb565b61014e610307366004610ede565b6107de565b610111604051806040016040528060018152602001603160f81b81525081565b60606003805461033b90610f0f565b80601f016020809104026020016040519081016040528092919081815260200182805461036790610f0f565b80156103b25780601f10610389576101008083540402835291602001916103b2565b820191905f5260205f20905b81548152906001019060200180831161039557829003601f168201915b5050505050905090565b5f336103c9818585610808565b60019150505b92915050565b5f336103e285828561092c565b6103ed8585856109a4565b506001949350505050565b5f7f0000000000000000000000000000000000000000000000000000000000000000461461042e5761042946610b33565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b5f336103c981858561046583836107de565b61046f9190610f5b565b610808565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104c55760405162461bcd60e51b81526004016104bc90610f6e565b60405180910390fd5b6104cf8282610bcb565b5050565b60606004805461033b90610f0f565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461052a5760405162461bcd60e51b81526004016104bc90610f6e565b6104cf8282610c75565b5f338161054182866107de565b9050838110156105a15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104bc565b6103ed8286868403610808565b5f336103c98185856109a4565b834211156106175760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104bc565b6001600160a01b0387165f90815260056020526040812080545f80516020610ff7833981519152918a918a918a91908661065083610fbe565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6106ad6103f8565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f1981840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610735573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381161580159061076b5750896001600160a01b0316816001600160a01b0316145b6107c75760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104bc565b6107d28a8a8a610808565b50505050505050505050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661086a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104bc565b6001600160a01b0382166108cb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104bc565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b5f61093784846107de565b90505f19811461099e57818110156109915760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104bc565b61099e8484848403610808565b50505050565b6001600160a01b038316610a085760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104bc565b6001600160a01b038216610a6a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104bc565b6001600160a01b0383165f9081526020819052604090205481811015610ae15760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104bc565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290925f80516020610fd7833981519152910160405180910390a361099e565b5f5f80516020611017833981519152610b4a61032c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c215760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104bc565b8060025f828254610c329190610f5b565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481525f80516020610fd7833981519152910160405180910390a35050565b6001600160a01b038216610cd55760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104bc565b6001600160a01b0382165f9081526020819052604090205481811015610d485760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104bc565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192915f80516020610fd7833981519152910161091f565b5f6020808352835180828501525f5b81811015610db557858101830151858201604001528201610d99565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610deb575f80fd5b919050565b5f8060408385031215610e01575f80fd5b610e0a83610dd5565b946020939093013593505050565b5f805f60608486031215610e2a575f80fd5b610e3384610dd5565b9250610e4160208501610dd5565b9150604084013590509250925092565b5f60208284031215610e61575f80fd5b610e6a82610dd5565b9392505050565b5f805f805f805f60e0888a031215610e87575f80fd5b610e9088610dd5565b9650610e9e60208901610dd5565b95506040880135945060608801359350608088013560ff81168114610ec1575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215610eef575f80fd5b610ef883610dd5565b9150610f0660208401610dd5565b90509250929050565b600181811c90821680610f2357607f821691505b602082108103610f4157634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156103cf576103cf610f47565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b5f60018201610fcf57610fcf610f47565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa26469706673582212206c12be332dd873b7cf88c58dfc4762858b63e8ff3bf8563b47828a5a4272643b64736f6c63430008140033", + "bytecode": "0x6101006040523480156200001257600080fd5b50604051620015643803806200156483398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516110a8620004bc60003960006101a30152600081816102660152818161048c01526104fa0152600061043d0152600081816102cb015261040701526110a86000f3fe608060405234801561001057600080fd5b50600436106101075760003560e01c806306fdde031461010c578063095ea7b31461012a57806318160ddd1461014d57806320606b701461015f57806323b872dd1461017457806330adf81f14610187578063313ce5671461019c5780633644e515146101cd57806339509351146101d557806340c10f19146101e857806370a08231146101fd5780637ecebe001461022657806395d89b41146102465780639dc29fac1461024e578063a3c573eb14610261578063a457c2d7146102a0578063a9059cbb146102b3578063cd0d0096146102c6578063d505accf146102ed578063dd62ed3e14610300578063ffa1ad7414610313575b600080fd5b610114610333565b6040516101219190610dae565b60405180910390f35b61013d610138366004610e18565b6103c5565b6040519015158152602001610121565b6002545b604051908152602001610121565b61015160008051602061105383398151915281565b61013d610182366004610e42565b6103df565b61015160008051602061103383398151915281565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610121565b610151610403565b61013d6101e3366004610e18565b61045f565b6101fb6101f6366004610e18565b610481565b005b61015161020b366004610e7e565b6001600160a01b031660009081526020819052604090205490565b610151610234366004610e7e565b60056020526000908152604090205481565b6101146104e0565b6101fb61025c366004610e18565b6104ef565b6102887f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610121565b61013d6102ae366004610e18565b610541565b61013d6102c1366004610e18565b6105bc565b6101517f000000000000000000000000000000000000000000000000000000000000000081565b6101fb6102fb366004610ea0565b6105ca565b61015161030e366004610f13565b6107f3565b610114604051806040016040528060018152602001603160f81b81525081565b60606003805461034290610f46565b80601f016020809104026020016040519081016040528092919081815260200182805461036e90610f46565b80156103bb5780601f10610390576101008083540402835291602001916103bb565b820191906000526020600020905b81548152906001019060200180831161039e57829003601f168201915b5050505050905090565b6000336103d381858561081e565b60019150505b92915050565b6000336103ed858285610943565b6103f88585856109bd565b506001949350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461461043a5761043546610b4f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000336103d381858561047283836107f3565b61047c9190610f96565b61081e565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104d25760405162461bcd60e51b81526004016104c990610fa9565b60405180910390fd5b6104dc8282610be9565b5050565b60606004805461034290610f46565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105375760405162461bcd60e51b81526004016104c990610fa9565b6104dc8282610c96565b6000338161054f82866107f3565b9050838110156105af5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104c9565b6103f8828686840361081e565b6000336103d38185856109bd565b834211156106265760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104c9565b6001600160a01b03871660009081526005602052604081208054600080516020611033833981519152918a918a918a91908661066183610ff9565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006106bf610403565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa15801561074a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906107805750896001600160a01b0316816001600160a01b0316145b6107dc5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104c9565b6107e78a8a8a61081e565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166108805760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104c9565b6001600160a01b0382166108e15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104c9565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600061094f84846107f3565b905060001981146109b757818110156109aa5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104c9565b6109b7848484840361081e565b50505050565b6001600160a01b038316610a215760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104c9565b6001600160a01b038216610a835760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104c9565b6001600160a01b03831660009081526020819052604090205481811015610afb5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104c9565b6001600160a01b0384811660008181526020818152604080832087870390559387168083529184902080548701905592518581529092600080516020611013833981519152910160405180910390a36109b7565b6000600080516020611053833981519152610b68610333565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c3f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104c9565b8060026000828254610c519190610f96565b90915550506001600160a01b03821660008181526020818152604080832080548601905551848152600080516020611013833981519152910160405180910390a35050565b6001600160a01b038216610cf65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104c9565b6001600160a01b03821660009081526020819052604090205481811015610d6a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104c9565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192916000805160206110138339815191529101610936565b600060208083528351808285015260005b81811015610ddb57858101830151858201604001528201610dbf565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610e1357600080fd5b919050565b60008060408385031215610e2b57600080fd5b610e3483610dfc565b946020939093013593505050565b600080600060608486031215610e5757600080fd5b610e6084610dfc565b9250610e6e60208501610dfc565b9150604084013590509250925092565b600060208284031215610e9057600080fd5b610e9982610dfc565b9392505050565b600080600080600080600060e0888a031215610ebb57600080fd5b610ec488610dfc565b9650610ed260208901610dfc565b95506040880135945060608801359350608088013560ff81168114610ef657600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f2657600080fd5b610f2f83610dfc565b9150610f3d60208401610dfc565b90509250929050565b600181811c90821680610f5a57607f821691505b602082108103610f7a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156103d9576103d9610f80565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b60006001820161100b5761100b610f80565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa26469706673582212203ea4a1224be7b5ef35dc397dfc81433d85cd6fdbf17d8b2e3d528071e7e612b564736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101075760003560e01c806306fdde031461010c578063095ea7b31461012a57806318160ddd1461014d57806320606b701461015f57806323b872dd1461017457806330adf81f14610187578063313ce5671461019c5780633644e515146101cd57806339509351146101d557806340c10f19146101e857806370a08231146101fd5780637ecebe001461022657806395d89b41146102465780639dc29fac1461024e578063a3c573eb14610261578063a457c2d7146102a0578063a9059cbb146102b3578063cd0d0096146102c6578063d505accf146102ed578063dd62ed3e14610300578063ffa1ad7414610313575b600080fd5b610114610333565b6040516101219190610dae565b60405180910390f35b61013d610138366004610e18565b6103c5565b6040519015158152602001610121565b6002545b604051908152602001610121565b61015160008051602061105383398151915281565b61013d610182366004610e42565b6103df565b61015160008051602061103383398151915281565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610121565b610151610403565b61013d6101e3366004610e18565b61045f565b6101fb6101f6366004610e18565b610481565b005b61015161020b366004610e7e565b6001600160a01b031660009081526020819052604090205490565b610151610234366004610e7e565b60056020526000908152604090205481565b6101146104e0565b6101fb61025c366004610e18565b6104ef565b6102887f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610121565b61013d6102ae366004610e18565b610541565b61013d6102c1366004610e18565b6105bc565b6101517f000000000000000000000000000000000000000000000000000000000000000081565b6101fb6102fb366004610ea0565b6105ca565b61015161030e366004610f13565b6107f3565b610114604051806040016040528060018152602001603160f81b81525081565b60606003805461034290610f46565b80601f016020809104026020016040519081016040528092919081815260200182805461036e90610f46565b80156103bb5780601f10610390576101008083540402835291602001916103bb565b820191906000526020600020905b81548152906001019060200180831161039e57829003601f168201915b5050505050905090565b6000336103d381858561081e565b60019150505b92915050565b6000336103ed858285610943565b6103f88585856109bd565b506001949350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461461043a5761043546610b4f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000336103d381858561047283836107f3565b61047c9190610f96565b61081e565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104d25760405162461bcd60e51b81526004016104c990610fa9565b60405180910390fd5b6104dc8282610be9565b5050565b60606004805461034290610f46565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105375760405162461bcd60e51b81526004016104c990610fa9565b6104dc8282610c96565b6000338161054f82866107f3565b9050838110156105af5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104c9565b6103f8828686840361081e565b6000336103d38185856109bd565b834211156106265760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104c9565b6001600160a01b03871660009081526005602052604081208054600080516020611033833981519152918a918a918a91908661066183610ff9565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006106bf610403565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa15801561074a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906107805750896001600160a01b0316816001600160a01b0316145b6107dc5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104c9565b6107e78a8a8a61081e565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166108805760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104c9565b6001600160a01b0382166108e15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104c9565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600061094f84846107f3565b905060001981146109b757818110156109aa5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104c9565b6109b7848484840361081e565b50505050565b6001600160a01b038316610a215760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104c9565b6001600160a01b038216610a835760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104c9565b6001600160a01b03831660009081526020819052604090205481811015610afb5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104c9565b6001600160a01b0384811660008181526020818152604080832087870390559387168083529184902080548701905592518581529092600080516020611013833981519152910160405180910390a36109b7565b6000600080516020611053833981519152610b68610333565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c3f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104c9565b8060026000828254610c519190610f96565b90915550506001600160a01b03821660008181526020818152604080832080548601905551848152600080516020611013833981519152910160405180910390a35050565b6001600160a01b038216610cf65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104c9565b6001600160a01b03821660009081526020819052604090205481811015610d6a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104c9565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192916000805160206110138339815191529101610936565b600060208083528351808285015260005b81811015610ddb57858101830151858201604001528201610dbf565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610e1357600080fd5b919050565b60008060408385031215610e2b57600080fd5b610e3483610dfc565b946020939093013593505050565b600080600060608486031215610e5757600080fd5b610e6084610dfc565b9250610e6e60208501610dfc565b9150604084013590509250925092565b600060208284031215610e9057600080fd5b610e9982610dfc565b9392505050565b600080600080600080600060e0888a031215610ebb57600080fd5b610ec488610dfc565b9650610ed260208901610dfc565b95506040880135945060608801359350608088013560ff81168114610ef657600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f2657600080fd5b610f2f83610dfc565b9150610f3d60208401610dfc565b90509250929050565b600181811c90821680610f5a57607f821691505b602082108103610f7a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156103d9576103d9610f80565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b60006001820161100b5761100b610f80565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa26469706673582212203ea4a1224be7b5ef35dc397dfc81433d85cd6fdbf17d8b2e3d528071e7e612b564736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/TransparentUpgradeableProxy.json b/compiled-contracts/paris/TransparentUpgradeableProxy.json index 4947597b4..39efac44d 100644 --- a/compiled-contracts/paris/TransparentUpgradeableProxy.json +++ b/compiled-contracts/paris/TransparentUpgradeableProxy.json @@ -148,8 +148,8 @@ "type": "receive" } ], - "bytecode": "0x608060405260405162000d8c38038062000d8c833981016040819052620000269162000415565b82816200003582825f6200004c565b50620000439050826200007d565b50505062000540565b6200005783620000ee565b5f82511180620000645750805b1562000078576200007683836200012f565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620000be5f8051602062000d45833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620000eb816200015e565b50565b620000f981620001fb565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b606062000157838360405180606001604052806027815260200162000d656027913962000292565b9392505050565b6001600160a01b038116620001c95760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b805f8051602062000d458339815191525b80546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b0381163b6200026a5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401620001c0565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc620001da565b60605f80856001600160a01b031685604051620002b09190620004ef565b5f60405180830381855af49150503d805f8114620002ea576040519150601f19603f3d011682016040523d82523d5f602084013e620002ef565b606091505b50909250905062000303868383876200030d565b9695505050505050565b60608315620003805782515f0362000378576001600160a01b0385163b620003785760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620001c0565b50816200038c565b6200038c838362000394565b949350505050565b815115620003a55781518083602001fd5b8060405162461bcd60e51b8152600401620001c091906200050c565b80516001600160a01b0381168114620003d8575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b838110156200040d578181015183820152602001620003f3565b50505f910152565b5f805f6060848603121562000428575f80fd5b6200043384620003c1565b92506200044360208501620003c1565b60408501519092506001600160401b038082111562000460575f80fd5b818601915086601f83011262000474575f80fd5b815181811115620004895762000489620003dd565b604051601f8201601f19908116603f01168101908382118183101715620004b457620004b4620003dd565b81604052828152896020848701011115620004cd575f80fd5b620004e0836020830160208801620003f1565b80955050505050509250925092565b5f825162000502818460208701620003f1565b9190910192915050565b602081525f82518060208401526200052c816040850160208701620003f1565b601f01601f19169190910160400192915050565b6107f7806200054e5f395ff3fe60806040526004361061004d575f3560e01c80633659cfe6146100645780634f1ef286146100835780635c60da1b146100965780638f283970146100c6578063f851a440146100e55761005c565b3661005c5761005a6100f9565b005b61005a6100f9565b34801561006f575f80fd5b5061005a61007e366004610657565b610113565b61005a610091366004610670565b61014e565b3480156100a1575f80fd5b506100aa6101b4565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d1575f80fd5b5061005a6100e0366004610657565b6101e4565b3480156100f0575f80fd5b506100aa610204565b610101610224565b61011161010c6102b9565b6102c2565b565b61011b6102e0565b6001600160a01b03163303610146576101438160405180602001604052805f8152505f6102ff565b50565b6101436100f9565b6101566102e0565b6001600160a01b031633036101ac576101a78383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250600192506102ff915050565b505050565b6101a76100f9565b5f6101bd6102e0565b6001600160a01b031633036101d9576101d46102b9565b905090565b6101e16100f9565b90565b6101ec6102e0565b6001600160a01b031633036101465761014381610329565b5f61020d6102e0565b6001600160a01b031633036101d9576101d46102e0565b61022c6102e0565b6001600160a01b031633036101115760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b5f6101d461037d565b365f80375f80365f845af43d5f803e8080156102dc573d5ff35b3d5ffd5b5f5f8051602061075b8339815191525b546001600160a01b0316919050565b61030883610391565b5f825111806103145750805b156101a75761032383836103d0565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103526102e0565b604080516001600160a01b03928316815291841660208301520160405180910390a1610143816103fc565b5f5f8051602061077b8339815191526102f0565b61039a81610492565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606103f5838360405180606001604052806027815260200161079b60279139610511565b9392505050565b6001600160a01b0381166104615760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084016102b0565b805f8051602061075b8339815191525b80546001600160a01b0319166001600160a01b039290921691909117905550565b61049b81610585565b6104fd5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016102b0565b805f8051602061077b833981519152610471565b60605f80856001600160a01b03168560405161052d919061070d565b5f60405180830381855af49150503d805f8114610565576040519150601f19603f3d011682016040523d82523d5f602084013e61056a565b606091505b509150915061057b86838387610594565b9695505050505050565b6001600160a01b03163b151590565b606083156106005782515f036105f9576105ad85610585565b6105f95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102b0565b508161060a565b61060a8383610612565b949350505050565b8151156106225781518083602001fd5b8060405162461bcd60e51b81526004016102b09190610728565b80356001600160a01b0381168114610652575f80fd5b919050565b5f60208284031215610667575f80fd5b6103f58261063c565b5f805f60408486031215610682575f80fd5b61068b8461063c565b925060208401356001600160401b03808211156106a6575f80fd5b818601915086601f8301126106b9575f80fd5b8135818111156106c7575f80fd5b8760208285010111156106d8575f80fd5b6020830194508093505050509250925092565b5f5b838110156107055781810151838201526020016106ed565b50505f910152565b5f825161071e8184602087016106eb565b9190910192915050565b602081525f82518060208401526107468160408501602087016106eb565b601f01601f1916919091016040019291505056feb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220858d5e7a5b708b0c65136243a37bf0ca32473b7a684fc9d907aa577e829d236e64736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", - "deployedBytecode": "0x60806040526004361061004d575f3560e01c80633659cfe6146100645780634f1ef286146100835780635c60da1b146100965780638f283970146100c6578063f851a440146100e55761005c565b3661005c5761005a6100f9565b005b61005a6100f9565b34801561006f575f80fd5b5061005a61007e366004610657565b610113565b61005a610091366004610670565b61014e565b3480156100a1575f80fd5b506100aa6101b4565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d1575f80fd5b5061005a6100e0366004610657565b6101e4565b3480156100f0575f80fd5b506100aa610204565b610101610224565b61011161010c6102b9565b6102c2565b565b61011b6102e0565b6001600160a01b03163303610146576101438160405180602001604052805f8152505f6102ff565b50565b6101436100f9565b6101566102e0565b6001600160a01b031633036101ac576101a78383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250600192506102ff915050565b505050565b6101a76100f9565b5f6101bd6102e0565b6001600160a01b031633036101d9576101d46102b9565b905090565b6101e16100f9565b90565b6101ec6102e0565b6001600160a01b031633036101465761014381610329565b5f61020d6102e0565b6001600160a01b031633036101d9576101d46102e0565b61022c6102e0565b6001600160a01b031633036101115760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b5f6101d461037d565b365f80375f80365f845af43d5f803e8080156102dc573d5ff35b3d5ffd5b5f5f8051602061075b8339815191525b546001600160a01b0316919050565b61030883610391565b5f825111806103145750805b156101a75761032383836103d0565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103526102e0565b604080516001600160a01b03928316815291841660208301520160405180910390a1610143816103fc565b5f5f8051602061077b8339815191526102f0565b61039a81610492565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606103f5838360405180606001604052806027815260200161079b60279139610511565b9392505050565b6001600160a01b0381166104615760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084016102b0565b805f8051602061075b8339815191525b80546001600160a01b0319166001600160a01b039290921691909117905550565b61049b81610585565b6104fd5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016102b0565b805f8051602061077b833981519152610471565b60605f80856001600160a01b03168560405161052d919061070d565b5f60405180830381855af49150503d805f8114610565576040519150601f19603f3d011682016040523d82523d5f602084013e61056a565b606091505b509150915061057b86838387610594565b9695505050505050565b6001600160a01b03163b151590565b606083156106005782515f036105f9576105ad85610585565b6105f95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102b0565b508161060a565b61060a8383610612565b949350505050565b8151156106225781518083602001fd5b8060405162461bcd60e51b81526004016102b09190610728565b80356001600160a01b0381168114610652575f80fd5b919050565b5f60208284031215610667575f80fd5b6103f58261063c565b5f805f60408486031215610682575f80fd5b61068b8461063c565b925060208401356001600160401b03808211156106a6575f80fd5b818601915086601f8301126106b9575f80fd5b8135818111156106c7575f80fd5b8760208285010111156106d8575f80fd5b6020830194508093505050509250925092565b5f5b838110156107055781810151838201526020016106ed565b50505f910152565b5f825161071e8184602087016106eb565b9190910192915050565b602081525f82518060208401526107468160408501602087016106eb565b601f01601f1916919091016040019291505056feb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220858d5e7a5b708b0c65136243a37bf0ca32473b7a684fc9d907aa577e829d236e64736f6c63430008140033", + "bytecode": "0x608060405260405162000dd138038062000dd1833981016040819052620000269162000424565b828162000036828260006200004d565b50620000449050826200007f565b50505062000557565b6200005883620000f1565b600082511180620000665750805b156200007a5762000078838362000133565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620000c160008051602062000d8a833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620000ee8162000162565b50565b620000fc8162000200565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200015b838360405180606001604052806027815260200162000daa6027913962000297565b9392505050565b6001600160a01b038116620001cd5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b8060008051602062000d8a8339815191525b80546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b0381163b6200026f5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401620001c4565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc620001df565b6060600080856001600160a01b031685604051620002b6919062000504565b600060405180830381855af49150503d8060008114620002f3576040519150601f19603f3d011682016040523d82523d6000602084013e620002f8565b606091505b5090925090506200030c8683838762000316565b9695505050505050565b606083156200038a57825160000362000382576001600160a01b0385163b620003825760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620001c4565b508162000396565b6200039683836200039e565b949350505050565b815115620003af5781518083602001fd5b8060405162461bcd60e51b8152600401620001c4919062000522565b80516001600160a01b0381168114620003e357600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200041b57818101518382015260200162000401565b50506000910152565b6000806000606084860312156200043a57600080fd5b6200044584620003cb565b92506200045560208501620003cb565b60408501519092506001600160401b03808211156200047357600080fd5b818601915086601f8301126200048857600080fd5b8151818111156200049d576200049d620003e8565b604051601f8201601f19908116603f01168101908382118183101715620004c857620004c8620003e8565b81604052828152896020848701011115620004e257600080fd5b620004f5836020830160208801620003fe565b80955050505050509250925092565b6000825162000518818460208701620003fe565b9190910192915050565b602081526000825180602084015262000543816040850160208701620003fe565b601f01601f19169190910160400192915050565b61082380620005676000396000f3fe60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b610080366004610676565b610118565b61005b610093366004610691565b610155565b3480156100a457600080fd5b506100ad6101bc565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e4366004610676565b6101ed565b3480156100f557600080fd5b506100ad61020d565b61010661022e565b6101166101116102c3565b6102cd565b565b6101206102f1565b6001600160a01b0316330361014d5761014a81604051806020016040528060008152506000610312565b50565b61014a6100fe565b61015d6102f1565b6001600160a01b031633036101b4576101af8383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250610312915050565b505050565b6101af6100fe565b60006101c66102f1565b6001600160a01b031633036101e2576101dd6102c3565b905090565b6101ea6100fe565b90565b6101f56102f1565b6001600160a01b0316330361014d5761014a8161033d565b60006102176102f1565b6001600160a01b031633036101e2576101dd6102f1565b6102366102f1565b6001600160a01b031633036101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101dd610391565b3660008037600080366000845af43d6000803e8080156102ec573d6000f35b3d6000fd5b60006000805160206107878339815191525b546001600160a01b0316919050565b61031b836103a7565b6000825111806103285750805b156101af5761033783836103e7565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103666102f1565b604080516001600160a01b03928316815291841660208301520160405180910390a161014a81610413565b60006000805160206107a7833981519152610303565b6103b0816104aa565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606061040c83836040518060600160405280602781526020016107c76027913961052a565b9392505050565b6001600160a01b0381166104785760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084016102ba565b806000805160206107878339815191525b80546001600160a01b0319166001600160a01b039290921691909117905550565b6104b3816105a2565b6105155760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016102ba565b806000805160206107a7833981519152610489565b6060600080856001600160a01b0316856040516105479190610737565b600060405180830381855af49150503d8060008114610582576040519150601f19603f3d011682016040523d82523d6000602084013e610587565b606091505b5091509150610598868383876105b1565b9695505050505050565b6001600160a01b03163b151590565b6060831561061e578251600003610617576105cb856105a2565b6106175760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102ba565b5081610628565b6106288383610630565b949350505050565b8151156106405781518083602001fd5b8060405162461bcd60e51b81526004016102ba9190610753565b80356001600160a01b038116811461067157600080fd5b919050565b60006020828403121561068857600080fd5b61040c8261065a565b6000806000604084860312156106a657600080fd5b6106af8461065a565b925060208401356001600160401b03808211156106cb57600080fd5b818601915086601f8301126106df57600080fd5b8135818111156106ee57600080fd5b87602082850101111561070057600080fd5b6020830194508093505050509250925092565b60005b8381101561072e578181015183820152602001610716565b50506000910152565b60008251610749818460208701610713565b9190910192915050565b6020815260008251806020840152610772816040850160208701610713565b601f01601f1916919091016040019291505056feb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212204611e4661d0b7e6d19a32536f89d63b6655727e934603a4010d4fad7be26919b64736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "deployedBytecode": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b610080366004610676565b610118565b61005b610093366004610691565b610155565b3480156100a457600080fd5b506100ad6101bc565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e4366004610676565b6101ed565b3480156100f557600080fd5b506100ad61020d565b61010661022e565b6101166101116102c3565b6102cd565b565b6101206102f1565b6001600160a01b0316330361014d5761014a81604051806020016040528060008152506000610312565b50565b61014a6100fe565b61015d6102f1565b6001600160a01b031633036101b4576101af8383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250610312915050565b505050565b6101af6100fe565b60006101c66102f1565b6001600160a01b031633036101e2576101dd6102c3565b905090565b6101ea6100fe565b90565b6101f56102f1565b6001600160a01b0316330361014d5761014a8161033d565b60006102176102f1565b6001600160a01b031633036101e2576101dd6102f1565b6102366102f1565b6001600160a01b031633036101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101dd610391565b3660008037600080366000845af43d6000803e8080156102ec573d6000f35b3d6000fd5b60006000805160206107878339815191525b546001600160a01b0316919050565b61031b836103a7565b6000825111806103285750805b156101af5761033783836103e7565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103666102f1565b604080516001600160a01b03928316815291841660208301520160405180910390a161014a81610413565b60006000805160206107a7833981519152610303565b6103b0816104aa565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606061040c83836040518060600160405280602781526020016107c76027913961052a565b9392505050565b6001600160a01b0381166104785760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084016102ba565b806000805160206107878339815191525b80546001600160a01b0319166001600160a01b039290921691909117905550565b6104b3816105a2565b6105155760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016102ba565b806000805160206107a7833981519152610489565b6060600080856001600160a01b0316856040516105479190610737565b600060405180830381855af49150503d8060008114610582576040519150601f19603f3d011682016040523d82523d6000602084013e610587565b606091505b5091509150610598868383876105b1565b9695505050505050565b6001600160a01b03163b151590565b6060831561061e578251600003610617576105cb856105a2565b6106175760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102ba565b5081610628565b6106288383610630565b949350505050565b8151156106405781518083602001fd5b8060405162461bcd60e51b81526004016102ba9190610753565b80356001600160a01b038116811461067157600080fd5b919050565b60006020828403121561068857600080fd5b61040c8261065a565b6000806000604084860312156106a657600080fd5b6106af8461065a565b925060208401356001600160401b03808211156106cb57600080fd5b818601915086601f8301126106df57600080fd5b8135818111156106ee57600080fd5b87602082850101111561070057600080fd5b6020830194508093505050509250925092565b60005b8381101561072e578181015183820152602001610716565b50506000910152565b60008251610749818460208701610713565b9190910192915050565b6020815260008251806020840152610772816040850160208701610713565b601f01601f1916919091016040019291505056feb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212204611e4661d0b7e6d19a32536f89d63b6655727e934603a4010d4fad7be26919b64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/VerifierRollupHelperMock.json b/compiled-contracts/paris/VerifierRollupHelperMock.json index 64b38070b..a1fb7d9d9 100644 --- a/compiled-contracts/paris/VerifierRollupHelperMock.json +++ b/compiled-contracts/paris/VerifierRollupHelperMock.json @@ -28,8 +28,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561000f575f80fd5b506101258061001d5f395ff3fe6080604052348015600e575f80fd5b50600436106026575f3560e01c80639121da8a14602a575b5f80fd5b603d60353660046065565b600192915050565b604051901515815260200160405180910390f35b634e487b7160e01b5f52604160045260245ffd5b5f806103208084860312156077575f80fd5b6103008401858111156087575f80fd5b8493508561031f8601126098575f80fd5b60405160208082016001600160401b038111838210171560b85760b86051565b60405292860192818885111560cb575f80fd5b5b8484101560e1578335815292810192810160cc565b50949790965094505050505056fea2646970667358221220619aeb02f8f540d5e45b1463521ffa47f214050fd4290a99f2fe93e7be61c73164736f6c63430008140033", - "deployedBytecode": "0x6080604052348015600e575f80fd5b50600436106026575f3560e01c80639121da8a14602a575b5f80fd5b603d60353660046065565b600192915050565b604051901515815260200160405180910390f35b634e487b7160e01b5f52604160045260245ffd5b5f806103208084860312156077575f80fd5b6103008401858111156087575f80fd5b8493508561031f8601126098575f80fd5b60405160208082016001600160401b038111838210171560b85760b86051565b60405292860192818885111560cb575f80fd5b5b8484101560e1578335815292810192810160cc565b50949790965094505050505056fea2646970667358221220619aeb02f8f540d5e45b1463521ffa47f214050fd4290a99f2fe93e7be61c73164736f6c63430008140033", + "bytecode": "0x608060405234801561001057600080fd5b5061012f806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80639121da8a14602d575b600080fd5b60406038366004606a565b600192915050565b604051901515815260200160405180910390f35b634e487b7160e01b600052604160045260246000fd5b600080610320808486031215607e57600080fd5b610300840185811115608f57600080fd5b8493508561031f86011260a157600080fd5b60405160208082016001600160401b038111838210171560c15760c16054565b60405292860192818885111560d557600080fd5b5b8484101560eb578335815292810192810160d6565b50949790965094505050505056fea2646970667358221220eae069d9292a35e5648287b4bd0bd5158ca024d1280777f564829b21961eda4664736f6c63430008140033", + "deployedBytecode": "0x6080604052348015600f57600080fd5b506004361060285760003560e01c80639121da8a14602d575b600080fd5b60406038366004606a565b600192915050565b604051901515815260200160405180910390f35b634e487b7160e01b600052604160045260246000fd5b600080610320808486031215607e57600080fd5b610300840185811115608f57600080fd5b8493508561031f86011260a157600080fd5b60405160208082016001600160401b038111838210171560c15760c16054565b60405292860192818885111560d557600080fd5b5b8484101560eb578335815292810192810160d6565b50949790965094505050505056fea2646970667358221220eae069d9292a35e5648287b4bd0bd5158ca024d1280777f564829b21961eda4664736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } From 563588c40b87d6fdadd1c4482259cfd25cf40270 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 18 Oct 2023 12:20:50 +0200 Subject: [PATCH 075/230] update scripts --- .vscode/settings.json | 2 +- .../v2/mocks/PolygonRollupManagerMock.sol | 3 + deployment/3_deployContracts copy.ts | 578 ------------------ deployment/genesis.json | 95 --- deployment/helpers/utils.ts | 6 + deployment/testnet/prepareGasToken.js | 78 --- deployment/testnet/prepareTestnet.js | 116 ---- deployment/testnet/prepareTestnet.ts | 132 ++++ deployment/{ => v2}/1_createGenesis.ts | 38 +- .../{ => v2}/2_deployPolygonZKEVMDeployer.ts | 5 +- deployment/{ => v2}/3_deployContracts.ts | 112 ++-- deployment/v2/4_createRollup.ts | 188 ++++++ deployment/{ => v2}/README.md | 0 .../{ => v2}/deploy_parameters.json.example | 27 +- deployment/v2/genesis.json | 92 +++ deployment/{ => v2}/verifyContracts.js | 52 +- deployment/{ => v2}/verifyzkEVMDeployer.js | 0 docker/scripts/v2/deploy-docker.sh | 17 + docker/scripts/v2/deploy-dockerv2.sh | 16 + hardhat.config.ts | 10 + package.json | 14 +- 21 files changed, 609 insertions(+), 972 deletions(-) delete mode 100644 deployment/3_deployContracts copy.ts delete mode 100644 deployment/genesis.json create mode 100644 deployment/helpers/utils.ts delete mode 100644 deployment/testnet/prepareGasToken.js delete mode 100644 deployment/testnet/prepareTestnet.js create mode 100644 deployment/testnet/prepareTestnet.ts rename deployment/{ => v2}/1_createGenesis.ts (94%) rename deployment/{ => v2}/2_deployPolygonZKEVMDeployer.ts (95%) rename deployment/{ => v2}/3_deployContracts.ts (85%) create mode 100644 deployment/v2/4_createRollup.ts rename deployment/{ => v2}/README.md (100%) rename deployment/{ => v2}/deploy_parameters.json.example (69%) create mode 100644 deployment/v2/genesis.json rename deployment/{ => v2}/verifyContracts.js (71%) rename deployment/{ => v2}/verifyzkEVMDeployer.js (100%) create mode 100755 docker/scripts/v2/deploy-docker.sh create mode 100644 docker/scripts/v2/deploy-dockerv2.sh diff --git a/.vscode/settings.json b/.vscode/settings.json index 822a36ad4..bafbc376b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,7 +1,7 @@ { "editor.formatOnSave": true, "solidity.linter": "solhint", - "solidity.compileUsingRemoteVersion": "v0.8.20+commit.e14f2714", + "solidity.compileUsingRemoteVersion": "v0.8.20+commit.a1b79de6", "solidity.remappings": [ "@openzeppelin/=node_modules/@openzeppelin" ], diff --git a/contracts/v2/mocks/PolygonRollupManagerMock.sol b/contracts/v2/mocks/PolygonRollupManagerMock.sol index 7b4378695..3cde233aa 100644 --- a/contracts/v2/mocks/PolygonRollupManagerMock.sol +++ b/contracts/v2/mocks/PolygonRollupManagerMock.sol @@ -66,6 +66,9 @@ contract PolygonRollupManagerMock is PolygonRollupManager { _setRoleAdmin(_EMERGENCY_COUNCIL_ROLE, _EMERGENCY_COUNCIL_ADMIN); _setupRole(_EMERGENCY_COUNCIL_ROLE, emergencyCouncil); _setupRole(_EMERGENCY_COUNCIL_ADMIN, emergencyCouncil); + + // Since it's mock, use admin for everything + _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); } function prepareMockCalculateRoot(bytes32[] memory localExitRoots) public { diff --git a/deployment/3_deployContracts copy.ts b/deployment/3_deployContracts copy.ts deleted file mode 100644 index dd9ea7d39..000000000 --- a/deployment/3_deployContracts copy.ts +++ /dev/null @@ -1,578 +0,0 @@ -/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if */ -/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */ -import {expect} from "chai"; -import path = require("path"); -import fs = require("fs"); - -import * as dotenv from "dotenv"; -dotenv.config({path: path.resolve(__dirname, "../.env")}); -import {ethers, upgrades} from "hardhat"; -import {HardhatEthersSigner} from "@nomicfoundation/hardhat-ethers/signers"; - -const {create2Deployment} = require("./helpers/deployment-helpers"); - -const pathOutputJson = path.join(__dirname, "./deploy_output.json"); -const pathOngoingDeploymentJson = path.join(__dirname, "./deploy_ongoing.json"); - -const deployParameters = require("./deploy_parameters.json"); -const genesis = require("./genesis.json"); - -const pathOZUpgradability = path.join(__dirname, `../.openzeppelin/${process.env.HARDHAT_NETWORK}.json`); - -import { - VerifierRollupHelperMock, - ERC20PermitMock, - PolygonRollupManagerMock, - PolygonZkEVMGlobalExitRoot, - PolygonZkEVMBridgeV2, - PolygonZkEVMV2, - PolygonRollupBase, - TokenWrapped, - Address, - PolygonZkEVM, - PolygonZkEVMV2Existent, - PolygonZkEVMDeployer, - PolygonZkEVMGlobalExitRootV2, -} from "../typechain-types"; - -async function main() { - // Check that there's no previous OZ deployment - if (fs.existsSync(pathOZUpgradability)) { - throw new Error( - `There's upgradability information from previous deployments, it's mandatory to erase them before start a new one, path: ${pathOZUpgradability}` - ); - } - - // Check if there's an ongoing deployment - let ongoingDeployment = {} as any; - if (fs.existsSync(pathOngoingDeploymentJson)) { - console.log("WARNING: using ongoing deployment"); - ongoingDeployment = require(pathOngoingDeploymentJson); - } - - // Constant variables - const networkIDMainnet = 0; - - // Gas token variables are 0 in mainnet, since native token it's ether - const gasTokenAddressMainnet = ethers.ZeroAddress; - const gasTokenNetworkMainnet = 0n; - const attemptsDeployProxy = 20; - - /* - * Check deploy parameters - * Check that every necessary parameter is fullfilled - */ - const mandatoryDeploymentParameters = [ - "realVerifier", - "trustedSequencerURL", - "networkName", - "version", - "trustedSequencer", - "chainID", - "admin", - "trustedAggregator", - "trustedAggregatorTimeout", - "pendingStateTimeout", - "forkID", - "zkEVMOwner", - "timelockAddress", - "minDelayTimelock", - "salt", - "zkEVMDeployerAddress", - "polTokenAddress", - ]; - - for (const parameterName of mandatoryDeploymentParameters) { - if (deployParameters[parameterName] === undefined || deployParameters[parameterName] === "") { - throw new Error(`Missing parameter: ${parameterName}`); - } - } - - const { - realVerifier, - trustedSequencerURL, - networkName, - version, - trustedSequencer, - chainID, - admin, - trustedAggregator, - trustedAggregatorTimeout, - pendingStateTimeout, - forkID, - zkEVMOwner, - timelockAddress, - minDelayTimelock, - salt, - zkEVMDeployerAddress, - polTokenAddress, - } = deployParameters; - - // Load provider - let currentProvider = ethers.provider; - if (deployParameters.multiplierGas || deployParameters.maxFeePerGas) { - if (process.env.HARDHAT_NETWORK !== "hardhat") { - currentProvider = ethers.getDefaultProvider( - `https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}` - ) as any; - if (deployParameters.maxPriorityFeePerGas && deployParameters.maxFeePerGas) { - console.log( - `Hardcoded gas used: MaxPriority${deployParameters.maxPriorityFeePerGas} gwei, MaxFee${deployParameters.maxFeePerGas} gwei` - ); - const FEE_DATA = new ethers.FeeData( - null, - ethers.parseUnits(deployParameters.maxFeePerGas, "gwei"), - ethers.parseUnits(deployParameters.maxPriorityFeePerGas, "gwei") - ); - - currentProvider.getFeeData = async () => FEE_DATA; - } else { - console.log("Multiplier gas used: ", deployParameters.multiplierGas); - async function overrideFeeData() { - const feedata = await ethers.provider.getFeeData(); - return new ethers.FeeData( - null, - ((feedata.maxFeePerGas as bigint) * BigInt(deployParameters.multiplierGas)) / 1000n, - ((feedata.maxPriorityFeePerGas as bigint) * BigInt(deployParameters.multiplierGas)) / 1000n - ); - } - currentProvider.getFeeData = overrideFeeData; - } - } - } - - // Load deployer - let deployer; - if (deployParameters.deployerPvtKey) { - deployer = new ethers.Wallet(deployParameters.deployerPvtKey, currentProvider); - } else if (process.env.MNEMONIC) { - deployer = ethers.HDNodeWallet.fromMnemonic( - ethers.Mnemonic.fromPhrase(process.env.MNEMONIC), - "m/44'/60'/0'/0/0" - ).connect(currentProvider); - } else { - [deployer] = await ethers.getSigners(); - } - - // Load zkEVM deployer - const PolgonZKEVMDeployerFactory = await ethers.getContractFactory("PolygonZkEVMDeployer", deployer); - const zkEVMDeployerContract = PolgonZKEVMDeployerFactory.attach(zkEVMDeployerAddress) as PolygonZkEVMDeployer; - - // check deployer is the owner of the deployer - if ((await deployer.provider?.getCode(zkEVMDeployerContract.target)) === "0x") { - throw new Error("zkEVM deployer contract is not deployed"); - } - expect(deployer.address).to.be.equal(await zkEVMDeployerContract.owner()); - - let verifierContract; - if (!ongoingDeployment.verifierContract) { - if (realVerifier === true) { - const VerifierRollup = await ethers.getContractFactory("FflonkVerifier", deployer); - verifierContract = await VerifierRollup.deploy(); - await verifierContract.waitForDeployment(); - } else { - const VerifierRollupHelperFactory = await ethers.getContractFactory("VerifierRollupHelperMock", deployer); - verifierContract = await VerifierRollupHelperFactory.deploy(); - await verifierContract.waitForDeployment(); - } - console.log("#######################\n"); - console.log("Verifier deployed to:", verifierContract.target); - - // save an ongoing deployment - ongoingDeployment.verifierContract = verifierContract.target; - fs.writeFileSync(pathOngoingDeploymentJson, JSON.stringify(ongoingDeployment, null, 1)); - } else { - console.log("Verifier already deployed on: ", ongoingDeployment.verifierContract); - const VerifierRollupFactory = await ethers.getContractFactory("FflonkVerifier", deployer); - verifierContract = VerifierRollupFactory.attach(ongoingDeployment.verifierContract); - } - - /* - * Deploy Bridge - * Deploy admin --> implementation --> proxy - */ - - // Deploy proxy admin: - const proxyAdminFactory = await ethers.getContractFactory("ProxyAdmin", deployer); - const deployTransactionAdmin = (await proxyAdminFactory.getDeployTransaction()).data; - const dataCallAdmin = proxyAdminFactory.interface.encodeFunctionData("transferOwnership", [deployer.address]); - const [proxyAdminAddress, isProxyAdminDeployed] = await create2Deployment( - zkEVMDeployerContract, - salt, - deployTransactionAdmin, - dataCallAdmin, - deployer - ); - - if (isProxyAdminDeployed) { - console.log("#######################\n"); - console.log("Proxy admin deployed to:", proxyAdminAddress); - } else { - console.log("#######################\n"); - console.log("Proxy admin was already deployed to:", proxyAdminAddress); - } - - // Deploy implementation PolygonZkEVMBridge - const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2", deployer); - const deployTransactionBridge = (await polygonZkEVMBridgeFactory.getDeployTransaction()).data; - const dataCallNull = null; - // Mandatory to override the gasLimit since the estimation with create are mess up D: - const overrideGasLimit = 5500000n; - const [bridgeImplementationAddress, isBridgeImplDeployed] = await create2Deployment( - zkEVMDeployerContract, - salt, - deployTransactionBridge, - dataCallNull, - deployer, - overrideGasLimit - ); - - if (isBridgeImplDeployed) { - console.log("#######################\n"); - console.log("bridge impl deployed to:", bridgeImplementationAddress); - } else { - console.log("#######################\n"); - console.log("bridge impl was already deployed to:", bridgeImplementationAddress); - } - - /* - * deploy proxy - * Do not initialize directly the proxy since we want to deploy the same code on L2 and this will alter the bytecode deployed of the proxy - */ - const transparentProxyFactory = await ethers.getContractFactory("TransparentUpgradeableProxy", deployer); - const initializeEmptyDataProxy = "0x"; - const deployTransactionProxy = ( - await transparentProxyFactory.getDeployTransaction( - bridgeImplementationAddress, - proxyAdminAddress, - initializeEmptyDataProxy - ) - ).data; - - // Nonce globalExitRoot: currentNonce + 1 (deploy bridge proxy) + 1(impl globalExitRoot) = +2 - const nonceProxyGlobalExitRoot = Number(await ethers.provider.getTransactionCount(deployer.address)) + 2; - // nonceProxyRollupManager :Nonce globalExitRoot + 1 (proxy globalExitRoot) + 1 (impl rollupManager) = +2 - const nonceProxyRollupManager = nonceProxyGlobalExitRoot + 2; - - let precalculateGlobalExitRootAddress; - let precalculateRollupManager; - - // Check if the contract is already deployed - if (ongoingDeployment.polygonZkEVMGlobalExitRoot && ongoingDeployment.polygonZkEVMContract) { - precalculateGlobalExitRootAddress = ongoingDeployment.polygonZkEVMGlobalExitRoot; - precalculateRollupManager = ongoingDeployment.polygonZkEVMContract; - } else { - // If both are not deployed, it's better to deploy them both again - delete ongoingDeployment.polygonZkEVMGlobalExitRoot; - delete ongoingDeployment.polygonZkEVMContract; - fs.writeFileSync(pathOngoingDeploymentJson, JSON.stringify(ongoingDeployment, null, 1)); - - // Contracts are not deployed, normal deployment - precalculateGlobalExitRootAddress = ethers.getCreateAddress({ - from: deployer.address, - nonce: nonceProxyGlobalExitRoot, - }); - precalculateRollupManager = ethers.getCreateAddress({from: deployer.address, nonce: nonceProxyRollupManager}); - } - - const dataCallProxy = polygonZkEVMBridgeFactory.interface.encodeFunctionData("initialize", [ - networkIDMainnet, - gasTokenAddressMainnet, - gasTokenNetworkMainnet, - precalculateGlobalExitRootAddress, - precalculateRollupManager, - ]); - - const [proxyBridgeAddress, isBridgeProxyDeployed] = await create2Deployment( - zkEVMDeployerContract, - salt, - deployTransactionProxy, - dataCallProxy, - deployer - ); - const polygonZkEVMBridgeContract = polygonZkEVMBridgeFactory.attach(proxyBridgeAddress) as PolygonZkEVMBridgeV2; - - if (isBridgeProxyDeployed) { - console.log("#######################\n"); - console.log("PolygonZkEVMBridge deployed to:", polygonZkEVMBridgeContract.target); - } else { - console.log("#######################\n"); - console.log("PolygonZkEVMBridge was already deployed to:", polygonZkEVMBridgeContract.target); - - // If it was already deployed, check that the initialized calldata matches the actual deployment - expect(precalculateGlobalExitRootAddress).to.be.equal(await polygonZkEVMBridgeContract.globalExitRootManager()); - expect(precalculateRollupManager).to.be.equal(await polygonZkEVMBridgeContract.polygonRollupManager()); - } - - console.log("\n#######################"); - console.log("##### Checks PolygonZkEVMBridge #####"); - console.log("#######################"); - console.log("PolygonZkEVMGlobalExitRootAddress:", await polygonZkEVMBridgeContract.globalExitRootManager()); - console.log("networkID:", await polygonZkEVMBridgeContract.networkID()); - console.log("zkEVMaddress:", await polygonZkEVMBridgeContract.polygonRollupManager()); - - // Import OZ manifest the deployed contracts, its enough to import just the proxy, the rest are imported automatically (admin/impl) - await upgrades.forceImport(proxyBridgeAddress, polygonZkEVMBridgeFactory, "transparent" as any); - - /* - *Deployment Global exit root manager - */ - let polygonZkEVMGlobalExitRoot; - // TODO review should use V2?¿ - const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRootV2", deployer); - if (!ongoingDeployment.polygonZkEVMGlobalExitRoot) { - for (let i = 0; i < attemptsDeployProxy; i++) { - try { - polygonZkEVMGlobalExitRoot = await upgrades.deployProxy(PolygonZkEVMGlobalExitRootFactory, [], { - initializer: false, - constructorArgs: [precalculateRollupManager, proxyBridgeAddress], - unsafeAllow: ["constructor", "state-variable-immutable"], - }); - break; - } catch (error: any) { - console.log(`attempt ${i}`); - console.log("upgrades.deployProxy of polygonZkEVMGlobalExitRoot ", error.message); - } - - // reach limits of attempts - if (i + 1 === attemptsDeployProxy) { - throw new Error("polygonZkEVMGlobalExitRoot contract has not been deployed"); - } - } - - expect(precalculateGlobalExitRootAddress).to.be.equal(polygonZkEVMGlobalExitRoot?.target); - - console.log("#######################\n"); - console.log("polygonZkEVMGlobalExitRoot deployed to:", polygonZkEVMGlobalExitRoot?.target); - - // save an ongoing deployment - ongoingDeployment.polygonZkEVMGlobalExitRoot = polygonZkEVMGlobalExitRoot?.target; - fs.writeFileSync(pathOngoingDeploymentJson, JSON.stringify(ongoingDeployment, null, 1)); - } else { - // sanity check - expect(precalculateGlobalExitRootAddress).to.be.equal(ongoingDeployment.polygonZkEVMGlobalExitRoot); - - // Expect the precalculate address matches de onogin deployment - polygonZkEVMGlobalExitRoot = PolygonZkEVMGlobalExitRootFactory.attach( - ongoingDeployment.polygonZkEVMGlobalExitRoot - ) as PolygonZkEVMGlobalExitRootV2; - - console.log("#######################\n"); - console.log("polygonZkEVMGlobalExitRoot already deployed on: ", ongoingDeployment.polygonZkEVMGlobalExitRoot); - - // Import OZ manifest the deployed contracts, its enough to import just the proyx, the rest are imported automatically (admin/impl) - await upgrades.forceImport( - ongoingDeployment.polygonZkEVMGlobalExitRoot, - PolygonZkEVMGlobalExitRootFactory, - "transparent" as any - ); - - // Check against current deployment - expect(polygonZkEVMBridgeContract.target).to.be.equal(await polygonZkEVMGlobalExitRoot.bridgeAddress()); - expect(precalculateRollupManager).to.be.equal(await polygonZkEVMGlobalExitRoot.rollupManager()); - } - - // deploy PolygonZkEVMM - const genesisRootHex = genesis.root; - - console.log("\n#######################"); - console.log("##### Deployment Polygon ZK-EVM #####"); - console.log("#######################"); - console.log("deployer:", deployer.address); - console.log("PolygonZkEVMGlobalExitRootAddress:", polygonZkEVMGlobalExitRoot?.target); - console.log("polTokenAddress:", polTokenAddress); - console.log("polygonZkEVMBridgeContract:", polygonZkEVMBridgeContract.target); - - console.log("trustedAggregator:", trustedAggregator); - console.log("pendingStateTimeout:", pendingStateTimeout); - console.log("trustedAggregatorTimeout:", trustedAggregatorTimeout); - console.log("admin:", admin); - - console.log("chainID:", chainID); - console.log("trustedSequencer:", trustedSequencer); - - console.log("genesisRoot:", genesisRootHex); - console.log("verifierAddress:", verifierContract.target); - console.log("trustedSequencerURL:", trustedSequencerURL); - console.log("networkName:", networkName); - console.log("forkID:", forkID); - - const PolygonZkEVMFactory = await ethers.getContractFactory("PolygonRollupManagerMock", deployer); - - let polygonZkEVMContract; - let deploymentBlockNumber; - if (!ongoingDeployment.polygonZkEVMContract) { - for (let i = 0; i < attemptsDeployProxy; i++) { - try { - polygonZkEVMContract = await upgrades.deployProxy( - PolygonZkEVMFactory, - [ - trustedAggregator, - pendingStateTimeout, - trustedAggregatorTimeout, - admin, - timelock.address, - emergencyCouncil.address, - ], - { - constructorArgs: [ - polygonZkEVMGlobalExitRoot?.target, - polTokenAddress, - polygonZkEVMBridgeContract.target, - ], - unsafeAllow: ["constructor", "state-variable-immutable"], - } - ); - - break; - } catch (error) { - console.log(`attempt ${i}`); - console.log("upgrades.deployProxy of polygonZkEVMContract ", error.message); - } - - // reach limits of attempts - if (i + 1 === attemptsDeployProxy) { - throw new Error("PolygonZkEVM contract has not been deployed"); - } - } - - expect(precalculateRollupManager).to.be.equal(polygonZkEVMContract.address); - - console.log("#######################\n"); - console.log("polygonZkEVMContract deployed to:", polygonZkEVMContract.address); - - // save an ongoing deployment - ongoingDeployment.polygonZkEVMContract = polygonZkEVMContract.address; - fs.writeFileSync(pathOngoingDeploymentJson, JSON.stringify(ongoingDeployment, null, 1)); - - // Transfer ownership of polygonZkEVMContract - if (zkEVMOwner !== deployer.address) { - await (await polygonZkEVMContract.transferOwnership(zkEVMOwner)).wait(); - } - - deploymentBlockNumber = (await polygonZkEVMContract.deployTransaction.wait()).blockNumber; - } else { - // Expect the precalculate address matches de onogin deployment, sanity check - expect(precalculateRollupManager).to.be.equal(ongoingDeployment.polygonZkEVMContract); - polygonZkEVMContract = PolygonZkEVMFactory.attach(ongoingDeployment.polygonZkEVMContract); - - console.log("#######################\n"); - console.log("polygonZkEVMContract already deployed on: ", ongoingDeployment.polygonZkEVMContract); - - // Import OZ manifest the deployed contracts, its enough to import just the proyx, the rest are imported automatically ( admin/impl) - await upgrades.forceImport(ongoingDeployment.polygonZkEVMContract, PolygonZkEVMFactory, "transparent"); - - const zkEVMOwnerContract = await polygonZkEVMContract.owner(); - if (zkEVMOwnerContract === deployer.address) { - // Transfer ownership of polygonZkEVMContract - if (zkEVMOwner !== deployer.address) { - await (await polygonZkEVMContract.transferOwnership(zkEVMOwner)).wait(); - } - } else { - expect(zkEVMOwner).to.be.equal(zkEVMOwnerContract); - } - deploymentBlockNumber = 0; - } - - console.log("\n#######################"); - console.log("##### Checks PolygonZkEVM #####"); - console.log("#######################"); - console.log("PolygonZkEVMGlobalExitRootAddress:", await polygonZkEVMContract.globalExitRootManager()); - console.log("polTokenAddress:", await polygonZkEVMContract.matic()); - console.log("verifierAddress:", await polygonZkEVMContract.rollupVerifier()); - console.log("polygonZkEVMBridgeContract:", await polygonZkEVMContract.bridgeAddress()); - - console.log("admin:", await polygonZkEVMContract.admin()); - console.log("chainID:", await polygonZkEVMContract.chainID()); - console.log("trustedSequencer:", await polygonZkEVMContract.trustedSequencer()); - console.log("pendingStateTimeout:", await polygonZkEVMContract.pendingStateTimeout()); - console.log("trustedAggregator:", await polygonZkEVMContract.trustedAggregator()); - console.log("trustedAggregatorTimeout:", await polygonZkEVMContract.trustedAggregatorTimeout()); - - console.log("genesiRoot:", await polygonZkEVMContract.batchNumToStateRoot(0)); - console.log("trustedSequencerURL:", await polygonZkEVMContract.trustedSequencerURL()); - console.log("networkName:", await polygonZkEVMContract.networkName()); - console.log("owner:", await polygonZkEVMContract.owner()); - console.log("forkID:", await polygonZkEVMContract.forkID()); - - // Assert admin address - expect(await upgrades.erc1967.getAdminAddress(precalculateRollupManager)).to.be.equal(proxyAdminAddress); - expect(await upgrades.erc1967.getAdminAddress(precalculateGlobalExitRootAddress)).to.be.equal(proxyAdminAddress); - expect(await upgrades.erc1967.getAdminAddress(proxyBridgeAddress)).to.be.equal(proxyAdminAddress); - - const proxyAdminInstance = proxyAdminFactory.attach(proxyAdminAddress); - const proxyAdminOwner = await proxyAdminInstance.owner(); - const timelockContractFactory = await ethers.getContractFactory("PolygonZkEVMTimelock", deployer); - - // TODO test stop here - - let timelockContract; - if (proxyAdminOwner !== deployer.address) { - // Check if there's a timelock deployed there that match the current deployment - timelockContract = timelockContractFactory.attach(proxyAdminOwner); - expect(precalculateRollupManager).to.be.equal(await timelockContract.polygonZkEVM()); - - console.log("#######################\n"); - console.log("Polygon timelockContract already deployed to:", timelockContract.address); - } else { - // deploy timelock - console.log("\n#######################"); - console.log("##### Deployment TimelockContract #####"); - console.log("#######################"); - console.log("minDelayTimelock:", minDelayTimelock); - console.log("timelockAddress:", timelockAddress); - console.log("zkEVMAddress:", polygonZkEVMContract.address); - timelockContract = await timelockContractFactory.deploy( - minDelayTimelock, - [timelockAddress], - [timelockAddress], - timelockAddress, - polygonZkEVMContract.address - ); - await timelockContract.deployed(); - console.log("#######################\n"); - console.log("Polygon timelockContract deployed to:", timelockContract.address); - - // Transfer ownership of the proxyAdmin to timelock - const proxyAdminContract = proxyAdminFactory.attach(proxyAdminAddress); - await (await proxyAdminContract.transferOwnership(timelockContract.address)).wait(); - } - - console.log("\n#######################"); - console.log("##### Checks TimelockContract #####"); - console.log("#######################"); - console.log("minDelayTimelock:", await timelockContract.getMinDelay()); - console.log("polygonZkEVM:", await timelockContract.polygonZkEVM()); - - const outputJson = { - polygonZkEVMAddress: polygonZkEVMContract.address, - polygonZkEVMBridgeAddress: polygonZkEVMBridgeContract.address, - polygonZkEVMGlobalExitRootAddress: polygonZkEVMGlobalExitRoot.address, - polTokenAddress, - verifierAddress: verifierContract.address, - zkEVMDeployerContract: zkEVMDeployerContract.address, - deployerAddress: deployer.address, - timelockContractAddress: timelockContract.address, - deploymentBlockNumber, - genesisRoot: genesisRootHex, - trustedSequencer, - trustedSequencerURL, - chainID, - networkName, - admin, - trustedAggregator, - proxyAdminAddress, - forkID, - salt, - version, - }; - fs.writeFileSync(pathOutputJson, JSON.stringify(outputJson, null, 1)); - - // Remove ongoing deployment - fs.unlinkSync(pathOngoingDeploymentJson); -} - -main().catch((e) => { - console.error(e); - process.exit(1); -}); diff --git a/deployment/genesis.json b/deployment/genesis.json deleted file mode 100644 index 24a6ff953..000000000 --- a/deployment/genesis.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "root": "0x3f86b09b43e3e49a41fc20a07579b79eba044253367817d5c241d23c0e2bc5c9", - "genesis": [ - { - "contractName": "PolygonZkEVMDeployer", - "balance": "0", - "nonce": "4", - "address": "0xCB19eDdE626906eB1EE52357a27F62dd519608C2", - "bytecode": "0x6080604052600436106100705760003560e01c8063715018a61161004e578063715018a6146100e65780638da5cb5b146100fb578063e11ae6cb14610126578063f2fde38b1461013957600080fd5b80632b79805a146100755780634a94d4871461008a5780636d07dbf81461009d575b600080fd5b610088610083366004610927565b610159565b005b6100886100983660046109c7565b6101cb565b3480156100a957600080fd5b506100bd6100b8366004610a1e565b61020d565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b50610088610220565b34801561010757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166100bd565b610088610134366004610a40565b610234565b34801561014557600080fd5b50610088610154366004610a90565b61029b565b610161610357565b600061016e8585856103d8565b905061017a8183610537565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a15050505050565b6101d3610357565b6101de83838361057b565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b90600090a1505050565b600061021983836105a9565b9392505050565b610228610357565b61023260006105b6565b565b61023c610357565b60006102498484846103d8565b60405173ffffffffffffffffffffffffffffffffffffffff821681529091507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a150505050565b6102a3610357565b73ffffffffffffffffffffffffffffffffffffffff811661034b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610354816105b6565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610232576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610342565b600083471015610444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610342565b81516000036104af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610342565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116610219576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610342565b6060610219838360006040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c6564000081525061062b565b60606105a1848484604051806060016040528060298152602001610b3d6029913961062b565b949350505050565b6000610219838330610744565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156106bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610342565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516106e69190610acf565b60006040518083038185875af1925050503d8060008114610723576040519150601f19603f3d011682016040523d82523d6000602084013e610728565b606091505b50915091506107398783838761076e565b979650505050505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b606083156108045782516000036107fd5773ffffffffffffffffffffffffffffffffffffffff85163b6107fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610342565b50816105a1565b6105a183838151156108195781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103429190610aeb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261088d57600080fd5b813567ffffffffffffffff808211156108a8576108a861084d565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156108ee576108ee61084d565b8160405283815286602085880101111561090757600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806080858703121561093d57600080fd5b8435935060208501359250604085013567ffffffffffffffff8082111561096357600080fd5b61096f8883890161087c565b9350606087013591508082111561098557600080fd5b506109928782880161087c565b91505092959194509250565b803573ffffffffffffffffffffffffffffffffffffffff811681146109c257600080fd5b919050565b6000806000606084860312156109dc57600080fd5b6109e58461099e565b9250602084013567ffffffffffffffff811115610a0157600080fd5b610a0d8682870161087c565b925050604084013590509250925092565b60008060408385031215610a3157600080fd5b50508035926020909101359150565b600080600060608486031215610a5557600080fd5b8335925060208401359150604084013567ffffffffffffffff811115610a7a57600080fd5b610a868682870161087c565b9150509250925092565b600060208284031215610aa257600080fd5b6102198261099e565b60005b83811015610ac6578181015183820152602001610aae565b50506000910152565b60008251610ae1818460208701610aab565b9190910192915050565b6020815260008251806020840152610b0a816040850160208701610aab565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a26469706673582212203e70ce334e8ec9d8d03e87415afd36dce4e82633bd277b08937095a6bd66367764736f6c63430008110033", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000004c1665d6651ecefa59b9b3041951608468b18891" - } - }, - { - "contractName": "ProxyAdmin", - "balance": "0", - "nonce": "1", - "address": "0x0F99738B2Fc14D77308337f3e2596b63aE7BCC4A", - "bytecode": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461012b57806399a88ec41461013e578063f2fde38b1461015e578063f3b7dead1461017e57600080fd5b8063204e1c7a14610080578063715018a6146100c95780637eff275e146100e05780638da5cb5b14610100575b600080fd5b34801561008c57600080fd5b506100a061009b366004610608565b61019e565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100d557600080fd5b506100de610255565b005b3480156100ec57600080fd5b506100de6100fb36600461062c565b610269565b34801561010c57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166100a0565b6100de610139366004610694565b6102f7565b34801561014a57600080fd5b506100de61015936600461062c565b61038c565b34801561016a57600080fd5b506100de610179366004610608565b6103e8565b34801561018a57600080fd5b506100a0610199366004610608565b6104a4565b60008060008373ffffffffffffffffffffffffffffffffffffffff166040516101ea907f5c60da1b00000000000000000000000000000000000000000000000000000000815260040190565b600060405180830381855afa9150503d8060008114610225576040519150601f19603f3d011682016040523d82523d6000602084013e61022a565b606091505b50915091508161023957600080fd5b8080602001905181019061024d9190610788565b949350505050565b61025d6104f0565b6102676000610571565b565b6102716104f0565b6040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690638f283970906024015b600060405180830381600087803b1580156102db57600080fd5b505af11580156102ef573d6000803e3d6000fd5b505050505050565b6102ff6104f0565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef28690349061035590869086906004016107a5565b6000604051808303818588803b15801561036e57600080fd5b505af1158015610382573d6000803e3d6000fd5b5050505050505050565b6103946104f0565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690633659cfe6906024016102c1565b6103f06104f0565b73ffffffffffffffffffffffffffffffffffffffff8116610498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6104a181610571565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff166040516101ea907ff851a44000000000000000000000000000000000000000000000000000000000815260040190565b60005473ffffffffffffffffffffffffffffffffffffffff163314610267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161048f565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff811681146104a157600080fd5b60006020828403121561061a57600080fd5b8135610625816105e6565b9392505050565b6000806040838503121561063f57600080fd5b823561064a816105e6565b9150602083013561065a816105e6565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156106a957600080fd5b83356106b4816105e6565b925060208401356106c4816105e6565b9150604084013567ffffffffffffffff808211156106e157600080fd5b818601915086601f8301126106f557600080fd5b81358181111561070757610707610665565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561074d5761074d610665565b8160405282815289602084870101111561076657600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b60006020828403121561079a57600080fd5b8151610625816105e6565b73ffffffffffffffffffffffffffffffffffffffff8316815260006020604081840152835180604085015260005b818110156107ef578581018301518582016060015282016107d3565b5060006060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050939250505056fea2646970667358221220372a0e10eebea1b7fa43ae4c976994e6ed01d85eedc3637b83f01d3f06be442064736f6c63430008110033", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000bba0935fa93eb23de7990b47f0d96a8f75766d13" - } - }, - { - "contractName": "PolygonZkEVMBridge implementation", - "balance": "0", - "nonce": "1", - "address": "0x5ac4182A1dd41AeEf465E40B82fd326BF66AB82C", - "bytecode": "0x6080604052600436106200019f5760003560e01c8063647c576c11620000e7578063be5831c71162000089578063dbc169761162000060578063dbc169761462000639578063ee25560b1462000651578063fb570834146200068257600080fd5b8063be5831c714620005ae578063cd58657914620005ea578063d02103ca146200060157600080fd5b80639e34070f11620000be5780639e34070f146200050a578063aaa13cc2146200054f578063bab161bf146200057457600080fd5b8063647c576c146200048657806379e2cf9714620004ab57806381b1c17414620004c357600080fd5b80632d2c9d94116200015157806334ac9cf2116200012857806334ac9cf2146200034b5780633ae05047146200037a5780633e197043146200039257600080fd5b80632d2c9d9414620002765780632dfdf0b5146200029b578063318aee3d14620002c257600080fd5b806322e95f2c116200018657806322e95f2c14620001ef578063240ff378146200023a5780632cffd02e146200025157600080fd5b806315064c9614620001a45780632072f6c514620001d5575b600080fd5b348015620001b157600080fd5b50606854620001c09060ff1681565b60405190151581526020015b60405180910390f35b348015620001e257600080fd5b50620001ed620006a7565b005b348015620001fc57600080fd5b50620002146200020e366004620032db565b62000705565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001cc565b620001ed6200024b36600462003372565b620007a8565b3480156200025e57600080fd5b50620001ed6200027036600462003409565b620009d0565b3480156200028357600080fd5b50620001ed6200029536600462003409565b62000f74565b348015620002a857600080fd5b50620002b360535481565b604051908152602001620001cc565b348015620002cf57600080fd5b5062000319620002e1366004620034ef565b606b6020526000908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001cc565b3480156200035857600080fd5b50606c54620002149073ffffffffffffffffffffffffffffffffffffffff1681565b3480156200038757600080fd5b50620002b362001178565b3480156200039f57600080fd5b50620002b3620003b136600462003526565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200049357600080fd5b50620001ed620004a5366004620035b0565b6200125e565b348015620004b857600080fd5b50620001ed620014ad565b348015620004d057600080fd5b5062000214620004e236600462003600565b606a6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200051757600080fd5b50620001c06200052936600462003600565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b3480156200055c57600080fd5b50620002146200056e3660046200361a565b620014e7565b3480156200058157600080fd5b506068546200059890610100900463ffffffff1681565b60405163ffffffff9091168152602001620001cc565b348015620005bb57600080fd5b506068546200059890790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001ed620005fb366004620036ce565b620016d3565b3480156200060e57600080fd5b50606854620002149065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200064657600080fd5b50620001ed62001c37565b3480156200065e57600080fd5b50620002b36200067036600462003600565b60696020526000908152604090205481565b3480156200068f57600080fd5b50620001c0620006a136600462003770565b62001c93565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006f9576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200070362001d7c565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091206000908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007e6576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8681166101009092041614806200080c5750600263ffffffff861610155b1562000844576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff163388883488886053546040516200089a9998979695949392919062003806565b60405180910390a1620009b8620009b26001606860019054906101000a900463ffffffff16338989348989604051620008d592919062003881565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b62001e10565b8215620009c957620009c962001f27565b5050505050565b60685460ff161562000a0e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000a258b8b8b8b8b8b8b8b8b8b8b600062001ffc565b73ffffffffffffffffffffffffffffffffffffffff861662000b01576040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a7a9190620038e6565b60006040518083038185875af1925050503d806000811462000ab9576040519150601f19603f3d011682016040523d82523d6000602084013e62000abe565b606091505b505090508062000afa576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000efc565b60685463ffffffff61010090910481169088160362000b435762000b3d73ffffffffffffffffffffffffffffffffffffffff87168585620021ed565b62000efc565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b166024820152600090603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e6e576000808062000c1886880188620039fb565b92509250925060008584848460405162000c329062003292565b62000c409392919062003abd565b8190604051809103906000f590508015801562000c61573d6000803e3d6000fd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f1990604401600060405180830381600087803b15801562000cd757600080fd5b505af115801562000cec573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e5c95949392919062003afa565b60405180910390a15050505062000ef9565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f1990604401600060405180830381600087803b15801562000edf57600080fd5b505af115801562000ef4573d6000803e3d6000fd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000fb2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000fc98b8b8b8b8b8b8b8b8b8b8b600162001ffc565b60008473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000ffc949392919062003b42565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200107f9190620038e6565b60006040518083038185875af1925050503d8060008114620010be576040519150601f19603f3d011682016040523d82523d6000602084013e620010c3565b606091505b5050905080620010ff576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b605354600090819081805b602081101562001255578083901c600116600103620011e65760338160208110620011b257620011b262003b8a565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062001213565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806200124c9062003be8565b91505062001183565b50919392505050565b600054610100900460ff16158080156200127f5750600054600160ff909116105b806200129b5750303b1580156200129b575060005460ff166001145b6200132d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200138c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001691841691909117905562001443620022c3565b8015620014a757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000703576200070362001f27565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201526000908190603801604051602081830303815290604052805190602001209050600060ff60f81b3083604051806020016200157d9062003292565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620015c8908d908d908d908d908d9060200162003c23565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001606929160200162003c64565b604051602081830303815290604052805190602001206040516020016200168f94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff161562001711576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200171b62002366565b60685463ffffffff888116610100909204161480620017415750600263ffffffff881610155b1562001779576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060608773ffffffffffffffffffffffffffffffffffffffff8816620017df57883414620017d5576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000925062001ad9565b341562001818576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089166000908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901562001908576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac90604401600060405180830381600087803b158015620018db57600080fd5b505af1158015620018f0573d6000803e3d6000fd5b50505050806020015194508060000151935062001ad7565b85156200191d576200191d898b8989620023db565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200198b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620019b1919062003c97565b9050620019d773ffffffffffffffffffffffffffffffffffffffff8b1633308e620028f9565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa15801562001a45573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a6b919062003c97565b905062001a79828262003cb1565b6068548c9850610100900463ffffffff169650935062001a998762002959565b62001aa48c62002a71565b62001aaf8d62002b7e565b60405160200162001ac39392919062003abd565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e868860535460405162001b1b98979695949392919062003cc7565b60405180910390a162001c0f620009b2600085878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b861562001c205762001c2062001f27565b5050505062001c2e60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c89576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200070362002c80565b600084815b602081101562001d6e57600163ffffffff8616821c8116900362001d0a5785816020811062001ccb5762001ccb62003b8a565b60200201358260405160200162001cec929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001d59565b8186826020811062001d205762001d2062003b8a565b602002013560405160200162001d40929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d658162003be8565b91505062001c98565b50821490505b949350505050565b60685460ff161562001dba576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b80600162001e216020600262003e79565b62001e2d919062003cb1565b6053541062001e68576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060536000815462001e7b9062003be8565b9182905550905060005b602081101562001f17578082901c60011660010362001ebd57826033826020811062001eb55762001eb562003b8a565b015550505050565b6033816020811062001ed35762001ed362003b8a565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001f0e9062003be8565b91505062001e85565b5062001f2262003e87565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001fad62001178565b6040518263ffffffff1660e01b815260040162001fcc91815260200190565b600060405180830381600087803b15801562001fe757600080fd5b505af1158015620014a7573d6000803e3d6000fd5b6200200d8b63ffffffff1662002d10565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b363200000000000000000000000000000000000000000000000000000000909252606481019190915260009165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303816000875af1158015620020b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620020d6919062003c97565b90508060000362002112576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff88811661010090920416146200215c576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606854600090610100900463ffffffff166200217a5750896200217d565b508a5b620021a66200219d848c8c8c8c8c8c8c604051620008d592919062003881565b8f8f8462001c93565b620021dd576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001f229084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002d75565b600054610100900460ff166200235c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001324565b6200070362002e88565b600260015403620023d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001324565b6002600155565b6000620023ec600482848662003eb6565b620023f79162003ee2565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620026765760008080808080806200245a896004818d62003eb6565b81019062002469919062003f2b565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614620024dd576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff861630146200252d576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002567576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620026229190620038e6565b6000604051808303816000865af19150503d806000811462002661576040519150601f19603f3d011682016040523d82523d6000602084013e62002666565b606091505b50505050505050505050620009c9565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c0000000000000000000000000000000000000000000000000000000014620026f2576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808080808080806200270a8a6004818e62003eb6565b81019062002719919062003f86565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146200278f576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87163014620027df576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f1691620028a39190620038e6565b6000604051808303816000865af19150503d8060008114620028e2576040519150601f19603f3d011682016040523d82523d6000602084013e620028e7565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014a79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002240565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691620029dd9190620038e6565b600060405180830381855afa9150503d806000811462002a1a576040519150601f19603f3d011682016040523d82523d6000602084013e62002a1f565b606091505b50915091508162002a66576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d74565b62001d748162002f21565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162002af59190620038e6565b600060405180830381855afa9150503d806000811462002b32576040519150601f19603f3d011682016040523d82523d6000602084013e62002b37565b606091505b50915091508162002a66576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d74565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169162002c019190620038e6565b600060405180830381855afa9150503d806000811462002c3e576040519150601f19603f3d011682016040523d82523d6000602084013e62002c43565b606091505b509150915081801562002c57575080516020145b62002c6457601262001d74565b8080602001905181019062001d74919062004012565b60018055565b60685460ff1662002cbd576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600881901c60008181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009c9576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600062002dd9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031119092919063ffffffff16565b80519091501562001f22578080602001905181019062002dfa919062004032565b62001f22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001324565b600054610100900460ff1662002c7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001324565b6060604082511062002f435781806020019051810190620007a2919062004052565b8151602003620030d35760005b60208110801562002f9b575082818151811062002f715762002f7162003b8a565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002fb6578062002fad8162003be8565b91505062002f50565b8060000362002ffa57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111562003018576200301862003891565b6040519080825280601f01601f19166020018201604052801562003043576020820181803683370190505b50905060005b82811015620030cb5784818151811062003067576200306762003b8a565b602001015160f81c60f81b82828151811062003087576200308762003b8a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080620030c28162003be8565b91505062003049565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d748484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051620031489190620038e6565b60006040518083038185875af1925050503d806000811462003187576040519150601f19603f3d011682016040523d82523d6000602084013e6200318c565b606091505b50915091506200319f87838387620031aa565b979650505050505050565b60608315620032455782516000036200323d5773ffffffffffffffffffffffffffffffffffffffff85163b6200323d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001324565b508162001d74565b62001d7483838151156200325c5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620013249190620040d2565b611b6680620040e883390190565b803563ffffffff811681146200310c57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620032d857600080fd5b50565b60008060408385031215620032ef57600080fd5b620032fa83620032a0565b915060208301356200330c81620032b5565b809150509250929050565b8015158114620032d857600080fd5b60008083601f8401126200333957600080fd5b50813567ffffffffffffffff8111156200335257600080fd5b6020830191508360208285010111156200336b57600080fd5b9250929050565b6000806000806000608086880312156200338b57600080fd5b6200339686620032a0565b94506020860135620033a881620032b5565b93506040860135620033ba8162003317565b9250606086013567ffffffffffffffff811115620033d757600080fd5b620033e58882890162003326565b969995985093965092949392505050565b806104008101831015620007a257600080fd5b60008060008060008060008060008060006105208c8e0312156200342c57600080fd5b620034388d8d620033f6565b9a50620034496104008d01620032a0565b99506104208c013598506104408c013597506200346a6104608d01620032a0565b96506104808c01356200347d81620032b5565b95506200348e6104a08d01620032a0565b94506104c08c0135620034a181620032b5565b93506104e08c013592506105008c013567ffffffffffffffff811115620034c757600080fd5b620034d58e828f0162003326565b915080935050809150509295989b509295989b9093969950565b6000602082840312156200350257600080fd5b81356200350f81620032b5565b9392505050565b60ff81168114620032d857600080fd5b600080600080600080600060e0888a0312156200354257600080fd5b87356200354f8162003516565b96506200355f60208901620032a0565b955060408801356200357181620032b5565b94506200358160608901620032a0565b935060808801356200359381620032b5565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215620035c657600080fd5b620035d184620032a0565b92506020840135620035e381620032b5565b91506040840135620035f581620032b5565b809150509250925092565b6000602082840312156200361357600080fd5b5035919050565b600080600080600080600060a0888a0312156200363657600080fd5b6200364188620032a0565b965060208801356200365381620032b5565b9550604088013567ffffffffffffffff808211156200367157600080fd5b6200367f8b838c0162003326565b909750955060608a01359150808211156200369957600080fd5b50620036a88a828b0162003326565b9094509250506080880135620036be8162003516565b8091505092959891949750929550565b600080600080600080600060c0888a031215620036ea57600080fd5b620036f588620032a0565b965060208801356200370781620032b5565b95506040880135945060608801356200372081620032b5565b93506080880135620037328162003317565b925060a088013567ffffffffffffffff8111156200374f57600080fd5b6200375d8a828b0162003326565b989b979a50959850939692959293505050565b60008060008061046085870312156200378857600080fd5b843593506200379b8660208701620033f6565b9250620037ac6104208601620032a0565b939692955092936104400135925050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600061010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620038678285018789620037bd565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b83811015620038dd578181015183820152602001620038c3565b50506000910152565b60008251620038fa818460208701620038c0565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156200394e576200394e62003891565b604052919050565b600067ffffffffffffffff82111562003973576200397362003891565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112620039b157600080fd5b8135620039c8620039c28262003956565b62003904565b818152846020838601011115620039de57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562003a1157600080fd5b833567ffffffffffffffff8082111562003a2a57600080fd5b62003a38878388016200399f565b9450602086013591508082111562003a4f57600080fd5b5062003a5e868287016200399f565b9250506040840135620035f58162003516565b6000815180845262003a8b816020860160208601620038c0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60608152600062003ad2606083018662003a71565b828103602084015262003ae6818662003a71565b91505060ff83166040830152949350505050565b63ffffffff86168152600073ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200319f608083018486620037bd565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff8416602082015260606040820152600062003b80606083018486620037bd565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003c1c5762003c1c62003bb9565b5060010190565b60608152600062003c39606083018789620037bd565b828103602084015262003c4e818688620037bd565b91505060ff831660408301529695505050505050565b6000835162003c78818460208801620038c0565b83519083019062003c8e818360208801620038c0565b01949350505050565b60006020828403121562003caa57600080fd5b5051919050565b81810381811115620007a257620007a262003bb9565b600061010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003d278285018762003a71565b925080851660e085015250509998505050505050505050565b600181815b8085111562003d9f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d835762003d8362003bb9565b8085161562003d9157918102915b93841c939080029062003d45565b509250929050565b60008262003db857506001620007a2565b8162003dc757506000620007a2565b816001811462003de0576002811462003deb5762003e0b565b6001915050620007a2565b60ff84111562003dff5762003dff62003bb9565b50506001821b620007a2565b5060208310610133831016604e8410600b841016171562003e30575081810a620007a2565b62003e3c838362003d40565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003e715762003e7162003bb9565b029392505050565b60006200350f838362003da7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000808585111562003ec757600080fd5b8386111562003ed557600080fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003f235780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a03121562003f4757600080fd5b873562003f5481620032b5565b9650602088013562003f6681620032b5565b955060408801359450606088013593506080880135620035938162003516565b600080600080600080600080610100898b03121562003fa457600080fd5b883562003fb181620032b5565b9750602089013562003fc381620032b5565b96506040890135955060608901359450608089013562003fe38162003317565b935060a089013562003ff58162003516565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200402557600080fd5b81516200350f8162003516565b6000602082840312156200404557600080fd5b81516200350f8162003317565b6000602082840312156200406557600080fd5b815167ffffffffffffffff8111156200407d57600080fd5b8201601f810184136200408f57600080fd5b8051620040a0620039c28262003956565b818152856020838501011115620040b657600080fd5b620040c9826020830160208601620038c0565b95945050505050565b6020815260006200350f602083018462003a7156fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a2646970667358221220d9b3ca7b13ec80ac58634ddf0ecebe71e209a71f532614949b9e720413f50c8364736f6c63430008110033" - }, - { - "contractName": "PolygonZkEVMBridge proxy", - "balance": "200000000000000000000000000", - "nonce": "1", - "address": "0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe", - "bytecode": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100a85780638f283970146100e6578063f851a440146101065761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61011b565b005b61006b61011b565b34801561008157600080fd5b5061006b61009036600461088b565b610135565b61006b6100a33660046108a6565b61017f565b3480156100b457600080fd5b506100bd6101f3565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b5061006b61010136600461088b565b610231565b34801561011257600080fd5b506100bd61025e565b6101236102d4565b61013361012e6103ab565b6103b5565b565b61013d6103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481604051806020016040528060008152506000610419565b50565b61017461011b565b6101876103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101eb576101e68383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250610419915050565b505050565b6101e661011b565b60006101fd6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103ab565b905090565b61022e61011b565b90565b6102396103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481610444565b60006102686103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103d9565b60606102b183836040518060600160405280602781526020016109bb602791396104a5565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6102dc6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600061022161052a565b3660008037600080366000845af43d6000803e8080156103d4573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b61042283610552565b60008251118061042f5750805b156101e65761043e838361028c565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61046d6103d9565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a16101748161059f565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516104cf919061094d565b600060405180830381855af49150503d806000811461050a576040519150601f19603f3d011682016040523d82523d6000602084013e61050f565b606091505b5091509150610520868383876106ab565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103fd565b61055b81610753565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b73ffffffffffffffffffffffffffffffffffffffff8116610642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103a2565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b6060831561074157825160000361073a5773ffffffffffffffffffffffffffffffffffffffff85163b61073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103a2565b508161074b565b61074b838361081e565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff81163b6107f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e74726163740000000000000000000000000000000000000060648201526084016103a2565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610665565b81511561082e5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a29190610969565b803573ffffffffffffffffffffffffffffffffffffffff8116811461088657600080fd5b919050565b60006020828403121561089d57600080fd5b6102b182610862565b6000806000604084860312156108bb57600080fd5b6108c484610862565b9250602084013567ffffffffffffffff808211156108e157600080fd5b818601915086601f8301126108f557600080fd5b81358181111561090457600080fd5b87602082850101111561091657600080fd5b6020830194508093505050509250925092565b60005b8381101561094457818101518382015260200161092c565b50506000910152565b6000825161095f818460208701610929565b9190910192915050565b6020815260008251806020840152610988816040850160208701610929565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220a1af0d6cb4f1e31496a4c5c1448913bce4bd6ad3a39e47c6f7190c114d6f9bf464736f6c63430008110033", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000068": "0x00000000000000a40d5f56745a118d0906a34e69aec8c0db1cb8fa0000000100", - "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x0000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000005ac4182a1dd41aeef465e40b82fd326bf66ab82c" - } - }, - { - "contractName": "PolygonZkEVMGlobalExitRootL2 implementation", - "balance": "0", - "nonce": "1", - "address": "0x0200143Fa295EE4dffEF22eE2616c2E008D81688", - "bytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806301fd904414610051578063257b36321461006d57806333d6247d1461008d578063a3c573eb146100a2575b600080fd5b61005a60015481565b6040519081526020015b60405180910390f35b61005a61007b366004610162565b60006020819052908152604090205481565b6100a061009b366004610162565b6100ee565b005b6100c97f0000000000000000000000002a3dd3eb832af982ec71669e178424b10dca2ede81565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610064565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000002a3dd3eb832af982ec71669e178424b10dca2ede161461015d576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b60006020828403121561017457600080fd5b503591905056fea2646970667358221220a187fc278346c1b61c449ea3641002b6eac2bda3351a122a12c35099f933696864736f6c63430008110033" - }, - { - "contractName": "PolygonZkEVMGlobalExitRootL2 proxy", - "balance": "0", - "nonce": "1", - "address": "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa", - "bytecode": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106ca565b610118565b61005b6100933660046106e5565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106ca565b61020b565b3480156100f557600080fd5b506100ad610235565b610106610292565b610116610111610331565b61033b565b565b61012061035f565b6001600160a01b0316336001600160a01b031614156101575761015481604051806020016040528060008152506000610392565b50565b6101546100fe565b61016761035f565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250610392915050565b505050565b6101c36100fe565b60006101da61035f565b6001600160a01b0316336001600160a01b03161415610200576101fb610331565b905090565b6102086100fe565b90565b61021361035f565b6001600160a01b0316336001600160a01b0316141561015757610154816103f1565b600061023f61035f565b6001600160a01b0316336001600160a01b03161415610200576101fb61035f565b606061028583836040518060600160405280602781526020016107e460279139610445565b9392505050565b3b151590565b61029a61035f565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb610519565b3660008037600080366000845af43d6000803e80801561035a573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b61039b83610541565b6040516001600160a01b038416907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a26000825111806103dc5750805b156101c3576103eb8383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61041a61035f565b604080516001600160a01b03928316815291841660208301520160405180910390a1610154816105e9565b6060833b6104a45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610328565b600080856001600160a01b0316856040516104bf9190610794565b600060405180830381855af49150503d80600081146104fa576040519150601f19603f3d011682016040523d82523d6000602084013e6104ff565b606091505b509150915061050f828286610675565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610383565b803b6105a55760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610328565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b03811661064e5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610328565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61036105c8565b60608315610684575081610285565b8251156106945782518084602001fd5b8160405162461bcd60e51b815260040161032891906107b0565b80356001600160a01b03811681146106c557600080fd5b919050565b6000602082840312156106dc57600080fd5b610285826106ae565b6000806000604084860312156106fa57600080fd5b610703846106ae565b9250602084013567ffffffffffffffff8082111561072057600080fd5b818601915086601f83011261073457600080fd5b81358181111561074357600080fd5b87602082850101111561075557600080fd5b6020830194508093505050509250925092565b60005b8381101561078357818101518382015260200161076b565b838111156103eb5750506000910152565b600082516107a6818460208701610768565b9190910192915050565b60208152600082518060208401526107cf816040850160208701610768565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212204675187caf3a43285d9a2c1844a981e977bd52a85ff073e7fc649f73847d70a464736f6c63430008090033", - "storage": { - "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x0000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000000200143fa295ee4dffef22ee2616c2e008d81688" - } - }, - { - "contractName": "PolygonZkEVMTimelock", - "balance": "0", - "nonce": "1", - "address": "0xBBa0935Fa93Eb23de7990b47F0D96a8f75766d13", - "bytecode": "0x6080604052600436106101c65760003560e01c806364d62353116100f7578063b1c5f42711610095578063d547741f11610064578063d547741f14610661578063e38335e514610681578063f23a6e6114610694578063f27a0c92146106d957600080fd5b8063b1c5f427146105af578063bc197c81146105cf578063c4d252f514610614578063d45c44351461063457600080fd5b80638f61f4f5116100d15780638f61f4f5146104e157806391d1485414610515578063a217fddf14610566578063b08e51c01461057b57600080fd5b806364d62353146104815780638065657f146104a15780638f2a0bb0146104c157600080fd5b8063248a9ca31161016457806331d507501161013e57806331d50750146103c857806336568abe146103e85780633a6aae7214610408578063584b153e1461046157600080fd5b8063248a9ca3146103475780632ab0f529146103775780632f2ff15d146103a857600080fd5b80630d3cf6fc116101a05780630d3cf6fc1461026b578063134008d31461029f57806313bc9f20146102b2578063150b7a02146102d257600080fd5b806301d5062a146101d257806301ffc9a7146101f457806307bd02651461022957600080fd5b366101cd57005b600080fd5b3480156101de57600080fd5b506101f26101ed366004611c52565b6106ee565b005b34801561020057600080fd5b5061021461020f366004611cc7565b610783565b60405190151581526020015b60405180910390f35b34801561023557600080fd5b5061025d7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610220565b34801561027757600080fd5b5061025d7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101f26102ad366004611d09565b6107df565b3480156102be57600080fd5b506102146102cd366004611d75565b6108d7565b3480156102de57600080fd5b506103166102ed366004611e9a565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610220565b34801561035357600080fd5b5061025d610362366004611d75565b60009081526020819052604090206001015490565b34801561038357600080fd5b50610214610392366004611d75565b6000908152600160208190526040909120541490565b3480156103b457600080fd5b506101f26103c3366004611f02565b6108fd565b3480156103d457600080fd5b506102146103e3366004611d75565b610927565b3480156103f457600080fd5b506101f2610403366004611f02565b610940565b34801561041457600080fd5b5061043c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610220565b34801561046d57600080fd5b5061021461047c366004611d75565b6109f8565b34801561048d57600080fd5b506101f261049c366004611d75565b610a0e565b3480156104ad57600080fd5b5061025d6104bc366004611d09565b610ade565b3480156104cd57600080fd5b506101f26104dc366004611f73565b610b1d565b3480156104ed57600080fd5b5061025d7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b34801561052157600080fd5b50610214610530366004611f02565b60009182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b34801561057257600080fd5b5061025d600081565b34801561058757600080fd5b5061025d7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b3480156105bb57600080fd5b5061025d6105ca366004612025565b610d4f565b3480156105db57600080fd5b506103166105ea36600461214e565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b34801561062057600080fd5b506101f261062f366004611d75565b610d94565b34801561064057600080fd5b5061025d61064f366004611d75565b60009081526001602052604090205490565b34801561066d57600080fd5b506101f261067c366004611f02565b610e8f565b6101f261068f366004612025565b610eb4565b3480156106a057600080fd5b506103166106af3660046121f8565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106e557600080fd5b5061025d611161565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161071881611244565b6000610728898989898989610ade565b90506107348184611251565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a604051610770969594939291906122a6565b60405180910390a3505050505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107d957506107d98261139e565b92915050565b600080527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661085c5761085c8133611435565b600061086c888888888888610ade565b905061087881856114ed565b6108848888888861162a565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a6040516108bc94939291906122f1565b60405180910390a36108cd8161172e565b5050505050505050565b6000818152600160205260408120546001811180156108f65750428111155b9392505050565b60008281526020819052604090206001015461091881611244565b61092283836117d7565b505050565b60008181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109f482826118c7565b5050565b6000818152600160208190526040822054610939565b333014610a9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109e1565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b6000868686868686604051602001610afb969594939291906122a6565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b4781611244565b888714610bd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b888514610c65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b6000610c778b8b8b8b8b8b8b8b610d4f565b9050610c838184611251565b60005b8a811015610d415780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610cc357610cc3612331565b9050602002016020810190610cd89190612360565b8d8d86818110610cea57610cea612331565b905060200201358c8c87818110610d0357610d03612331565b9050602002810190610d15919061237b565b8c8b604051610d29969594939291906122a6565b60405180910390a3610d3a8161240f565b9050610c86565b505050505050505050505050565b60008888888888888888604051602001610d709897969594939291906124f7565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610dbe81611244565b610dc7826109f8565b610e53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109e1565b6000828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b600082815260208190526040902060010154610eaa81611244565b61092283836118c7565b600080527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610f3157610f318133611435565b878614610fc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b87841461104f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b60006110618a8a8a8a8a8a8a8a610d4f565b905061106d81856114ed565b60005b8981101561114b5760008b8b8381811061108c5761108c612331565b90506020020160208101906110a19190612360565b905060008a8a848181106110b7576110b7612331565b9050602002013590503660008a8a868181106110d5576110d5612331565b90506020028101906110e7919061237b565b915091506110f78484848461162a565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588686868660405161112e94939291906122f1565b60405180910390a350505050806111449061240f565b9050611070565b506111558161172e565b50505050505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161580159061123257507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123291906125be565b1561123d5750600090565b5060025490565b61124e8133611435565b50565b61125a82610927565b156112e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109e1565b6112ef611161565b81101561137e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109e1565b61138881426125e0565b6000928352600160205260409092209190915550565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107d957507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107d9565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109f4576114738161197e565b61147e83602061199d565b60405160200161148f929190612617565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109e191600401612698565b6114f6826108d7565b611582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109e1565b80158061159e5750600081815260016020819052604090912054145b6109f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109e1565b60008473ffffffffffffffffffffffffffffffffffffffff168484846040516116549291906126e9565b60006040518083038185875af1925050503d8060008114611691576040519150601f19603f3d011682016040523d82523d6000602084013e611696565b606091505b5050905080611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109e1565b5050505050565b611737816108d7565b6117c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109e1565b600090815260016020819052604090912055565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109f45760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556118693390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109f45760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107d973ffffffffffffffffffffffffffffffffffffffff831660145b606060006119ac8360026126f9565b6119b79060026125e0565b67ffffffffffffffff8111156119cf576119cf611d8e565b6040519080825280601f01601f1916602001820160405280156119f9576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611a3057611a30612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a9357611a93612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000611acf8460026126f9565b611ada9060016125e0565b90505b6001811115611b77577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611b1b57611b1b612331565b1a60f81b828281518110611b3157611b31612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c93611b7081612710565b9050611add565b5083156108f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109e1565b803573ffffffffffffffffffffffffffffffffffffffff81168114611c0457600080fd5b919050565b60008083601f840112611c1b57600080fd5b50813567ffffffffffffffff811115611c3357600080fd5b602083019150836020828501011115611c4b57600080fd5b9250929050565b600080600080600080600060c0888a031215611c6d57600080fd5b611c7688611be0565b965060208801359550604088013567ffffffffffffffff811115611c9957600080fd5b611ca58a828b01611c09565b989b979a50986060810135976080820135975060a09091013595509350505050565b600060208284031215611cd957600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108f657600080fd5b60008060008060008060a08789031215611d2257600080fd5b611d2b87611be0565b955060208701359450604087013567ffffffffffffffff811115611d4e57600080fd5b611d5a89828a01611c09565b979a9699509760608101359660809091013595509350505050565b600060208284031215611d8757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611e0457611e04611d8e565b604052919050565b600082601f830112611e1d57600080fd5b813567ffffffffffffffff811115611e3757611e37611d8e565b611e6860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611dbd565b818152846020838601011115611e7d57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611eb057600080fd5b611eb985611be0565b9350611ec760208601611be0565b925060408501359150606085013567ffffffffffffffff811115611eea57600080fd5b611ef687828801611e0c565b91505092959194509250565b60008060408385031215611f1557600080fd5b82359150611f2560208401611be0565b90509250929050565b60008083601f840112611f4057600080fd5b50813567ffffffffffffffff811115611f5857600080fd5b6020830191508360208260051b8501011115611c4b57600080fd5b600080600080600080600080600060c08a8c031215611f9157600080fd5b893567ffffffffffffffff80821115611fa957600080fd5b611fb58d838e01611f2e565b909b50995060208c0135915080821115611fce57600080fd5b611fda8d838e01611f2e565b909950975060408c0135915080821115611ff357600080fd5b506120008c828d01611f2e565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b60008060008060008060008060a0898b03121561204157600080fd5b883567ffffffffffffffff8082111561205957600080fd5b6120658c838d01611f2e565b909a50985060208b013591508082111561207e57600080fd5b61208a8c838d01611f2e565b909850965060408b01359150808211156120a357600080fd5b506120b08b828c01611f2e565b999c989b509699959896976060870135966080013595509350505050565b600082601f8301126120df57600080fd5b8135602067ffffffffffffffff8211156120fb576120fb611d8e565b8160051b61210a828201611dbd565b928352848101820192828101908785111561212457600080fd5b83870192505b848310156121435782358252918301919083019061212a565b979650505050505050565b600080600080600060a0868803121561216657600080fd5b61216f86611be0565b945061217d60208701611be0565b9350604086013567ffffffffffffffff8082111561219a57600080fd5b6121a689838a016120ce565b945060608801359150808211156121bc57600080fd5b6121c889838a016120ce565b935060808801359150808211156121de57600080fd5b506121eb88828901611e0c565b9150509295509295909350565b600080600080600060a0868803121561221057600080fd5b61221986611be0565b945061222760208701611be0565b93506040860135925060608601359150608086013567ffffffffffffffff81111561225157600080fd5b6121eb88828901611e0c565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a0604082015260006122dc60a08301868861225d565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260606040820152600061232760608301848661225d565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561237257600080fd5b6108f682611be0565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126123b057600080fd5b83018035915067ffffffffffffffff8211156123cb57600080fd5b602001915036819003821315611c4b57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612440576124406123e0565b5060010190565b81835260006020808501808196508560051b810191508460005b878110156124ea57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126124a057600080fd5b8701858101903567ffffffffffffffff8111156124bc57600080fd5b8036038213156124cb57600080fd5b6124d686828461225d565b9a87019a9550505090840190600101612461565b5091979650505050505050565b60a0808252810188905260008960c08301825b8b8110156125455773ffffffffffffffffffffffffffffffffffffffff61253084611be0565b1682526020928301929091019060010161250a565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff89111561257e57600080fd5b8860051b9150818a602083013701828103602090810160408501526125a69082018789612447565b60608401959095525050608001529695505050505050565b6000602082840312156125d057600080fd5b815180151581146108f657600080fd5b808201808211156107d9576107d96123e0565b60005b8381101561260e5781810151838201526020016125f6565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161264f8160178501602088016125f3565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000601791840191820152835161268c8160288401602088016125f3565b01602801949350505050565b60208152600082518060208401526126b78160408501602087016125f3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b8183823760009101908152919050565b80820281158282048414176107d9576107d96123e0565b60008161271f5761271f6123e0565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea26469706673582212206416c4e08f97752b4bb06159524dac058d3dccd8775e57ef1b01505751ebf7af64736f6c63430008110033", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000002": "0x00000000000000000000000000000000000000000000000000000000000d2f00", - "0x33d4aa03df3f12c4f615b40676f67fdafecd3edb5a9c0ca2a47a923dae33a023": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x9fa2d8034dbcb437bee38d61fbd100910e1342ffc07f128aa1b8e6790b7f3f68": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x64494413541ff93b31aa309254e3fed72a7456e9845988b915b4c7a7ceba8814": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", - "0x531a7c25761aa4b0f2310edca9bb25e1e3ceb49ad4b0422aec866b3ce7567c87": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x3412d5605ac6cd444957cedb533e5dacad6378b4bc819ebe3652188a665066d6": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", - "0xedbedc78c4240c7613622a35de050b48bd6c6d9a31b3d485b68fbbed54a4802d": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0xdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d706a": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", - "0x76616448da8d124a07383c26a6b2433b3259de946aa40f51524ec96ee05e871a": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0xc3ad33e20b0c56a223ad5104fff154aa010f8715b9c981fd38fdc60a4d1a52fc": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5" - } - }, - { - "accountName": "keyless Deployer", - "balance": "0", - "nonce": "1", - "address": "0x9d90066e7478496e2284E54c3548106bb4F90E50" - }, - { - "accountName": "deployer", - "balance": "0", - "nonce": "8", - "address": "0x4c1665d6651ecEfa59B9B3041951608468b18891" - } - ] -} \ No newline at end of file diff --git a/deployment/helpers/utils.ts b/deployment/helpers/utils.ts new file mode 100644 index 000000000..83b86a51c --- /dev/null +++ b/deployment/helpers/utils.ts @@ -0,0 +1,6 @@ +Object.defineProperty(BigInt.prototype, "toJSON", { + get() { + "use strict"; + return () => String(this); + }, +}); diff --git a/deployment/testnet/prepareGasToken.js b/deployment/testnet/prepareGasToken.js deleted file mode 100644 index aa8626134..000000000 --- a/deployment/testnet/prepareGasToken.js +++ /dev/null @@ -1,78 +0,0 @@ -/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if, no-restricted-syntax */ -/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */ -const { ethers } = require('hardhat'); -const path = require('path'); -const fs = require('fs'); -require('dotenv').config({ path: path.resolve(__dirname, '../../.env') }); - -const pathDeployParameters = path.join(__dirname, '../deploy_parameters.json'); -const deployParameters = require('../deploy_parameters.json'); - -async function main() { - // Load provider - let currentProvider = ethers.provider; - if (deployParameters.multiplierGas || deployParameters.maxFeePerGas) { - if (process.env.HARDHAT_NETWORK !== 'hardhat') { - currentProvider = new ethers.providers.JsonRpcProvider(`https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}`); - if (deployParameters.maxPriorityFeePerGas && deployParameters.maxFeePerGas) { - console.log(`Hardcoded gas used: MaxPriority${deployParameters.maxPriorityFeePerGas} gwei, MaxFee${deployParameters.maxFeePerGas} gwei`); - const FEE_DATA = { - maxFeePerGas: ethers.parseUnits(deployParameters.maxFeePerGas, 'gwei'), - maxPriorityFeePerGas: ethers.parseUnits(deployParameters.maxPriorityFeePerGas, 'gwei'), - }; - currentProvider.getFeeData = async () => FEE_DATA; - } else { - console.log('Multiplier gas used: ', deployParameters.multiplierGas); - async function overrideFeeData() { - const feedata = await ethers.provider.getFeeData(); - return { - maxFeePerGas: feedata.maxFeePerGas.mul(deployParameters.multiplierGas), - maxPriorityFeePerGas: feedata.maxPriorityFeePerGas.mul(deployParameters.multiplierGas), - }; - } - currentProvider.getFeeData = overrideFeeData; - } - } - } - - // Load deployer - let deployer; - if (deployParameters.deployerPvtKey) { - deployer = new ethers.Wallet(deployParameters.deployerPvtKey, currentProvider); - console.log('Using pvtKey deployer with address: ', deployer.address); - } else if (process.env.MNEMONIC) { - deployer = ethers.Wallet.fromMnemonic(process.env.MNEMONIC, 'm/44\'/60\'/0\'/0/0').connect(currentProvider); - console.log('Using MNEMONIC deployer with address: ', deployer.address); - } else { - [deployer] = (await ethers.getSigners()); - } - - /* - *Deployment MATIC - */ - const gasTokenName = 'Gas Token'; - const gasTokenSymbol = 'GT'; - const gasTokenInitialBalance = ethers.parseEther('20000000'); - - const gasTokenFactory = await ethers.getContractFactory('ERC20PermitMock', deployer); - const gasTokenContract = await gasTokenFactory.deploy( - gasTokenName, - gasTokenSymbol, - deployer.address, - gasTokenInitialBalance, - ); - await gasTokenContract.deployed(); - - console.log('#######################\n'); - console.log('Gas Token deployed to:', gasTokenContract.address); - - deployParameters.gasTokenAddress = gasTokenContract.address; - deployParameters.gasTokenNetwork = 0; - - fs.writeFileSync(pathDeployParameters, JSON.stringify(deployParameters, null, 1)); -} - -main().catch((e) => { - console.error(e); - process.exit(1); -}); diff --git a/deployment/testnet/prepareTestnet.js b/deployment/testnet/prepareTestnet.js deleted file mode 100644 index e1c4cec49..000000000 --- a/deployment/testnet/prepareTestnet.js +++ /dev/null @@ -1,116 +0,0 @@ -/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if, no-restricted-syntax */ -/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */ -const { ethers } = require('hardhat'); -const path = require('path'); -const fs = require('fs'); -require('dotenv').config({ path: path.resolve(__dirname, '../../.env') }); - -const pathDeployParameters = path.join(__dirname, '../deploy_parameters.json'); -const deployParameters = require('../deploy_parameters.json'); - -async function main() { - // Load provider - let currentProvider = ethers.provider; - if (deployParameters.multiplierGas || deployParameters.maxFeePerGas) { - if (process.env.HARDHAT_NETWORK !== 'hardhat') { - currentProvider = new ethers.providers.JsonRpcProvider(`https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}`); - if (deployParameters.maxPriorityFeePerGas && deployParameters.maxFeePerGas) { - console.log(`Hardcoded gas used: MaxPriority${deployParameters.maxPriorityFeePerGas} gwei, MaxFee${deployParameters.maxFeePerGas} gwei`); - const FEE_DATA = { - maxFeePerGas: ethers.parseUnits(deployParameters.maxFeePerGas, 'gwei'), - maxPriorityFeePerGas: ethers.parseUnits(deployParameters.maxPriorityFeePerGas, 'gwei'), - }; - currentProvider.getFeeData = async () => FEE_DATA; - } else { - console.log('Multiplier gas used: ', deployParameters.multiplierGas); - async function overrideFeeData() { - const feedata = await ethers.provider.getFeeData(); - return { - maxFeePerGas: feedata.maxFeePerGas.mul(deployParameters.multiplierGas), - maxPriorityFeePerGas: feedata.maxPriorityFeePerGas.mul(deployParameters.multiplierGas), - }; - } - currentProvider.getFeeData = overrideFeeData; - } - } - } - - // Load deployer - let deployer; - if (deployParameters.deployerPvtKey) { - deployer = new ethers.Wallet(deployParameters.deployerPvtKey, currentProvider); - console.log('Using pvtKey deployer with address: ', deployer.address); - } else if (process.env.MNEMONIC) { - deployer = ethers.Wallet.fromMnemonic(process.env.MNEMONIC, 'm/44\'/60\'/0\'/0/0').connect(currentProvider); - console.log('Using MNEMONIC deployer with address: ', deployer.address); - } else { - [deployer] = (await ethers.getSigners()); - } - - // Check trusted address from deploy parameters - const mandatoryDeploymentParameters = [ - 'trustedAggregator', - 'trustedSequencer', - ]; - - for (const parameterName of mandatoryDeploymentParameters) { - if (deployParameters[parameterName] === undefined || deployParameters[parameterName] === '') { - throw new Error(`Missing parameter: ${parameterName}`); - } - } - - const { - trustedAggregator, - trustedSequencer, - } = deployParameters; - - /* - *Deployment MATIC - */ - const maticTokenName = 'Matic Token'; - const maticTokenSymbol = 'MATIC'; - const maticTokenInitialBalance = ethers.parseEther('20000000'); - - const maticTokenFactory = await ethers.getContractFactory('ERC20PermitMock', deployer); - const maticTokenContract = await maticTokenFactory.deploy( - maticTokenName, - maticTokenSymbol, - deployer.address, - maticTokenInitialBalance, - ); - await maticTokenContract.deployed(); - - console.log('#######################\n'); - console.log('Matic deployed to:', maticTokenContract.address); - - // fund sequencer account with tokens and ether if it have less than 0.1 ether. - const balanceEther = await ethers.provider.getBalance(trustedSequencer); - const minEtherBalance = ethers.parseEther('0.1'); - if (balanceEther < minEtherBalance) { - const params = { - to: trustedSequencer, - value: minEtherBalance, - }; - await deployer.sendTransaction(params); - } - const tokensBalance = ethers.parseEther('100000'); - await (await maticTokenContract.transfer(trustedSequencer, tokensBalance)).wait(); - - // fund aggregator account with ether if it have less than 0.1 ether. - const balanceEtherAggr = await ethers.provider.getBalance(trustedAggregator); - if (balanceEtherAggr < minEtherBalance) { - const params = { - to: trustedAggregator, - value: minEtherBalance, - }; - await deployer.sendTransaction(params); - } - - deployParameters.maticTokenAddress = maticTokenContract.address; - fs.writeFileSync(pathDeployParameters, JSON.stringify(deployParameters, null, 1)); -} - -main().catch((e) => { - console.error(e); - process.exit(1); -}); diff --git a/deployment/testnet/prepareTestnet.ts b/deployment/testnet/prepareTestnet.ts new file mode 100644 index 000000000..24bf71331 --- /dev/null +++ b/deployment/testnet/prepareTestnet.ts @@ -0,0 +1,132 @@ +/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if, no-restricted-syntax */ +/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */ + +/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if */ +/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */ +import {expect} from "chai"; +import path = require("path"); +import fs = require("fs"); + +import * as dotenv from "dotenv"; +dotenv.config({path: path.resolve(__dirname, "../.env")}); +import {ethers} from "hardhat"; + +import yargs from "yargs/yargs"; + +const argv = yargs(process.argv.slice(2)) + .options({ + input: {type: "string", default: "../v2/deploy_parameters.json"}, + }) + .parse() as any; + +const pathDeployParameters = path.join(__dirname, argv.input); +const deployParameters = require(argv.input); + +async function main() { + // Load provider + let currentProvider = ethers.provider; + if (deployParameters.multiplierGas || deployParameters.maxFeePerGas) { + if (process.env.HARDHAT_NETWORK !== "hardhat") { + currentProvider = ethers.getDefaultProvider( + `https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}` + ) as any; + if (deployParameters.maxPriorityFeePerGas && deployParameters.maxFeePerGas) { + console.log( + `Hardcoded gas used: MaxPriority${deployParameters.maxPriorityFeePerGas} gwei, MaxFee${deployParameters.maxFeePerGas} gwei` + ); + const FEE_DATA = new ethers.FeeData( + null, + ethers.parseUnits(deployParameters.maxFeePerGas, "gwei"), + ethers.parseUnits(deployParameters.maxPriorityFeePerGas, "gwei") + ); + + currentProvider.getFeeData = async () => FEE_DATA; + } else { + console.log("Multiplier gas used: ", deployParameters.multiplierGas); + async function overrideFeeData() { + const feedata = await ethers.provider.getFeeData(); + return new ethers.FeeData( + null, + ((feedata.maxFeePerGas as bigint) * BigInt(deployParameters.multiplierGas)) / 1000n, + ((feedata.maxPriorityFeePerGas as bigint) * BigInt(deployParameters.multiplierGas)) / 1000n + ); + } + currentProvider.getFeeData = overrideFeeData; + } + } + } + + // Load deployer + let deployer; + if (deployParameters.deployerPvtKey) { + deployer = new ethers.Wallet(deployParameters.deployerPvtKey, currentProvider); + } else if (process.env.MNEMONIC) { + deployer = ethers.HDNodeWallet.fromMnemonic( + ethers.Mnemonic.fromPhrase(process.env.MNEMONIC), + "m/44'/60'/0'/0/0" + ).connect(currentProvider); + } else { + [deployer] = await ethers.getSigners(); + } + + // Check trusted address from deploy parameters + const mandatoryDeploymentParameters = ["trustedAggregator", "trustedSequencer"]; + + for (const parameterName of mandatoryDeploymentParameters) { + if (deployParameters[parameterName] === undefined || deployParameters[parameterName] === "") { + throw new Error(`Missing parameter: ${parameterName}`); + } + } + + const {trustedAggregator, trustedSequencer} = deployParameters; + + /* + *Deployment pol + */ + const polTokenName = "Pol Token"; + const polTokenSymbol = "POL"; + const polTokenInitialBalance = ethers.parseEther("20000000"); + + const polTokenFactory = await ethers.getContractFactory("ERC20PermitMock", deployer); + const polTokenContract = await polTokenFactory.deploy( + polTokenName, + polTokenSymbol, + deployer.address, + polTokenInitialBalance + ); + await polTokenContract.waitForDeployment(); + + console.log("#######################\n"); + console.log("pol deployed to:", polTokenContract.target); + + // fund sequencer account with tokens and ether if it have less than 0.1 ether. + const balanceEther = await ethers.provider.getBalance(trustedSequencer); + const minEtherBalance = ethers.parseEther("0.1"); + if (balanceEther < minEtherBalance) { + const params = { + to: trustedSequencer, + value: minEtherBalance, + }; + await deployer.sendTransaction(params); + } + const tokensBalance = ethers.parseEther("100000"); + await (await polTokenContract.transfer(trustedSequencer, tokensBalance)).wait(); + + // fund aggregator account with ether if it have less than 0.1 ether. + const balanceEtherAggr = await ethers.provider.getBalance(trustedAggregator); + if (balanceEtherAggr < minEtherBalance) { + const params = { + to: trustedAggregator, + value: minEtherBalance, + }; + await deployer.sendTransaction(params); + } + + deployParameters.polTokenAddress = polTokenContract.target; + fs.writeFileSync(pathDeployParameters, JSON.stringify(deployParameters, null, 1)); +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/deployment/1_createGenesis.ts b/deployment/v2/1_createGenesis.ts similarity index 94% rename from deployment/1_createGenesis.ts rename to deployment/v2/1_createGenesis.ts index 3e3839689..8668b626c 100644 --- a/deployment/1_createGenesis.ts +++ b/deployment/v2/1_createGenesis.ts @@ -5,7 +5,7 @@ import path = require("path"); import fs = require("fs"); import * as dotenv from "dotenv"; -dotenv.config({path: path.resolve(__dirname, "../.env")}); +dotenv.config({path: path.resolve(__dirname, "../../.env")}); import yargs from "yargs/yargs"; const argv = yargs(process.argv.slice(2)) @@ -14,7 +14,7 @@ const argv = yargs(process.argv.slice(2)) input: {type: "string", default: "./deploy_parameters.json"}, out: {type: "string", default: "./genesis.json"}, }) - .parseSync(); + .parse() as any; const DEFAULT_MNEMONIC = "test test test test test test test test test test test junk"; process.env.HARDHAT_NETWORK = "hardhat"; @@ -22,10 +22,12 @@ process.env.MNEMONIC = argv.test ? DEFAULT_MNEMONIC : process.env.MNEMONIC; import {ethers, upgrades} from "hardhat"; import {MemDB, ZkEVMDB, getPoseidon, smtUtils} from "@0xpolygonhermez/zkevm-commonjs"; -import {deployPolygonZkEVMDeployer, create2Deployment, getCreate2Address} from "./helpers/deployment-helpers"; -import {ProxyAdmin} from "../typechain-types"; +import {deployPolygonZkEVMDeployer, create2Deployment, getCreate2Address} from "../helpers/deployment-helpers"; +import {ProxyAdmin} from "../../typechain-types"; import {Addressable} from "ethers"; +import "../helpers/utils"; + const deployParameters = require(argv.input); const pathOutputJson = path.join(__dirname, argv.out); @@ -59,7 +61,7 @@ async function main() { const attemptsDeployProxy = 20; const balanceBrige = BigInt("0xffffffffffffffffffffffffffffffff"); // 128 bits - let timelockAddress; + let timelockAdminAddress; let initialZkEVMDeployerOwner; let salt; let minDelayTimelock; @@ -90,7 +92,7 @@ async function main() { const isMainnet = deployParameters["isMainnet"] === true ? true : false; if (isMainnet === true) { - timelockAddress = mainnetMultisig; + timelockAdminAddress = mainnetMultisig; minDelayTimelock = mainnetMinDelayTimelock; salt = "0x0000000000000000000000000000000000000000000000000000000000000000"; // salt mock initialZkEVMDeployerOwner = mainnetInitialZkEVMDeployerOwner; @@ -106,7 +108,7 @@ async function main() { } else { // load deploy parameters const mandatoryDeploymentParameters = [ - "timelockAddress", + "timelockAdminAddress", "minDelayTimelock", "salt", "initialZkEVMDeployerOwner", @@ -117,7 +119,7 @@ async function main() { throw new Error(`Missing parameter: ${parameterName}`); } } - ({timelockAddress, minDelayTimelock, salt, initialZkEVMDeployerOwner} = deployParameters); + ({timelockAdminAddress, minDelayTimelock, salt, initialZkEVMDeployerOwner} = deployParameters); } // Load deployer @@ -141,7 +143,10 @@ async function main() { */ // Deploy proxy admin: - const proxyAdminFactory = await ethers.getContractFactory("ProxyAdmin", deployer); + const proxyAdminFactory = await ethers.getContractFactory( + "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol:ProxyAdmin", + deployer + ); const deployTransactionAdmin = (await proxyAdminFactory.getDeployTransaction()).data; const dataCallAdmin = proxyAdminFactory.interface.encodeFunctionData("transferOwnership", [deployer.address]); [proxyAdminAddress] = await create2Deployment( @@ -180,7 +185,10 @@ async function main() { * deploy proxy * Do not initialize directly the proxy since we want to deploy the same code on L2 and this will alter the bytecode deployed of the proxy */ - const transparentProxyFactory = await ethers.getContractFactory("TransparentUpgradeableProxy", deployer); + const transparentProxyFactory = await ethers.getContractFactory( + "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol:TransparentUpgradeableProxy", + deployer + ); const initializeEmptyDataProxy = "0x"; const deployTransactionProxy = ( await transparentProxyFactory.getDeployTransaction( @@ -242,9 +250,9 @@ async function main() { const timelockContractFactory = await ethers.getContractFactory("PolygonZkEVMTimelock", deployer); const timelockContract = await timelockContractFactory.deploy( minDelayTimelock, - [timelockAddress], - [timelockAddress], - timelockAddress, + [timelockAdminAddress], + [timelockAdminAddress], + timelockAdminAddress, zkevmAddressL2 ); await timelockContract.waitForDeployment(); @@ -368,7 +376,7 @@ async function main() { ); // check timelock address manager, and timelock address itself - const addressArray = [timelockAddress, timelockContract.target]; + const addressArray = [timelockAdminAddress, timelockContract.target]; for (let j = 0; j < addressArray.length; j++) { const storagePositionRole = ethers.solidityPackedKeccak256( ["uint256", "uint256"], @@ -467,7 +475,7 @@ async function getAddressInfo(address: string | Addressable) { for (let i = 0; i < 200; i++) { const storageValue = await ethers.provider.getStorage(address, i); if (storageValue !== "0x0000000000000000000000000000000000000000000000000000000000000000") { - storage[ethers.zeroPadValue(ethers.toQuantity(i), 32)] = storageValue; + storage[ethers.toBeHex(i, 32)] = storageValue; } } diff --git a/deployment/2_deployPolygonZKEVMDeployer.ts b/deployment/v2/2_deployPolygonZKEVMDeployer.ts similarity index 95% rename from deployment/2_deployPolygonZKEVMDeployer.ts rename to deployment/v2/2_deployPolygonZKEVMDeployer.ts index aa471ae34..620f82b71 100644 --- a/deployment/2_deployPolygonZKEVMDeployer.ts +++ b/deployment/v2/2_deployPolygonZKEVMDeployer.ts @@ -5,11 +5,12 @@ import path = require("path"); import fs = require("fs"); import * as dotenv from "dotenv"; -dotenv.config({path: path.resolve(__dirname, "../.env")}); +dotenv.config({path: path.resolve(__dirname, "../../.env")}); import {ethers, upgrades} from "hardhat"; import {HardhatEthersSigner} from "@nomicfoundation/hardhat-ethers/signers"; -import {deployPolygonZkEVMDeployer} from "./helpers/deployment-helpers"; +import {deployPolygonZkEVMDeployer} from "../helpers/deployment-helpers"; +import "../helpers/utils"; const pathDeployParameters = path.join(__dirname, "./deploy_parameters.json"); const deployParameters = require("./deploy_parameters.json"); diff --git a/deployment/3_deployContracts.ts b/deployment/v2/3_deployContracts.ts similarity index 85% rename from deployment/3_deployContracts.ts rename to deployment/v2/3_deployContracts.ts index 2a4283e08..30f18674b 100644 --- a/deployment/3_deployContracts.ts +++ b/deployment/v2/3_deployContracts.ts @@ -5,37 +5,40 @@ import path = require("path"); import fs = require("fs"); import * as dotenv from "dotenv"; -dotenv.config({path: path.resolve(__dirname, "../.env")}); +dotenv.config({path: path.resolve(__dirname, "../../.env")}); import {ethers, upgrades} from "hardhat"; -import {HardhatEthersSigner} from "@nomicfoundation/hardhat-ethers/signers"; -const {create2Deployment} = require("./helpers/deployment-helpers"); +const {create2Deployment} = require("../helpers/deployment-helpers"); const pathOutputJson = path.join(__dirname, "./deploy_output.json"); const pathOngoingDeploymentJson = path.join(__dirname, "./deploy_ongoing.json"); const deployParameters = require("./deploy_parameters.json"); -const pathOZUpgradability = path.join(__dirname, `../.openzeppelin/${process.env.HARDHAT_NETWORK}.json`); +const pathOZUpgradability = path.join(__dirname, `../../.openzeppelin/${process.env.HARDHAT_NETWORK}.json`); import { - VerifierRollupHelperMock, - ERC20PermitMock, - PolygonRollupManagerMock, - PolygonZkEVMGlobalExitRoot, PolygonZkEVMBridgeV2, - PolygonZkEVMV2, - PolygonRollupBase, - TokenWrapped, - Address, - PolygonZkEVM, - PolygonZkEVMV2Existent, PolygonZkEVMDeployer, PolygonZkEVMGlobalExitRootV2, PolygonZkEVMTimelock, -} from "../typechain-types"; -import {ProxyAdmin} from "../typechain-types/@openzeppelin/contracts5/proxy/transparent"; -import {Contract} from "hardhat/internal/hardhat-network/stack-traces/model"; + ProxyAdmin, +} from "../../typechain-types"; +import "../helpers/utils"; + +const DEFAULT_ADMIN_ROLE = ethers.ZeroHash; +const ADD_ROLLUP_TYPE_ROLE = ethers.id("ADD_ROLLUP_TYPE_ROLE"); +const OBSOLETE_ROLLUP_TYPE_ROLE = ethers.id("OBSOLETE_ROLLUP_TYPE_ROLE"); +const CREATE_ROLLUP_ROLE = ethers.id("CREATE_ROLLUP_ROLE"); +const ADD_EXISTING_ROLLUP_ROLE = ethers.id("ADD_EXISTING_ROLLUP_ROLE"); +const UPDATE_ROLLUP_ROLE = ethers.id("UPDATE_ROLLUP_ROLE"); +const TRUSTED_AGGREGATOR_ROLE = ethers.id("TRUSTED_AGGREGATOR_ROLE"); +const TRUSTED_AGGREGATOR_ROLE_ADMIN = ethers.id("TRUSTED_AGGREGATOR_ROLE_ADMIN"); +const TWEAK_PARAMETERS_ROLE = ethers.id("TWEAK_PARAMETERS_ROLE"); +const SET_FEE_ROLE = ethers.id("SET_FEE_ROLE"); +const STOP_EMERGENCY_ROLE = ethers.id("STOP_EMERGENCY_ROLE"); +const EMERGENCY_COUNCIL_ROLE = ethers.id("EMERGENCY_COUNCIL_ROLE"); +const EMERGENCY_COUNCIL_ADMIN = ethers.id("EMERGENCY_COUNCIL_ADMIN"); async function main() { // Check that there's no previous OZ deployment @@ -65,14 +68,14 @@ async function main() { * Check that every necessary parameter is fullfilled */ const mandatoryDeploymentParameters = [ + "timelockAdminAddress", + "minDelayTimelock", + "salt", "admin", "trustedAggregator", "trustedAggregatorTimeout", "pendingStateTimeout", "emergencyCouncilAddress", - "timelockAdminAddress", - "minDelayTimelock", - "salt", "zkEVMDeployerAddress", "polTokenAddress", ]; @@ -158,7 +161,10 @@ async function main() { */ // Deploy proxy admin: - const proxyAdminFactory = await ethers.getContractFactory("ProxyAdmin", deployer); + const proxyAdminFactory = await ethers.getContractFactory( + "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol:ProxyAdmin", + deployer + ); const deployTransactionAdmin = (await proxyAdminFactory.getDeployTransaction()).data; const dataCallAdmin = proxyAdminFactory.interface.encodeFunctionData("transferOwnership", [deployer.address]); const [proxyAdminAddress, isProxyAdminDeployed] = await create2Deployment( @@ -266,14 +272,17 @@ async function main() { console.log("\n#######################"); console.log("##### Checks TimelockContract #####"); console.log("#######################"); - console.log("minDelayTimelock:", await timelockContract.getMinDelay()); + //console.log("minDelayTimelock:", await timelockContract.getMinDelay()); console.log("polygonZkEVM:", await timelockContract.polygonZkEVM()); /* * deploy proxy * Do not initialize directly the proxy since we want to deploy the same code on L2 and this will alter the bytecode deployed of the proxy */ - const transparentProxyFactory = await ethers.getContractFactory("TransparentUpgradeableProxy", deployer); + const transparentProxyFactory = await ethers.getContractFactory( + "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol:TransparentUpgradeableProxy", + deployer + ); const initializeEmptyDataProxy = "0x"; const deployTransactionProxy = ( await transparentProxyFactory.getDeployTransaction( @@ -414,6 +423,7 @@ async function main() { emergencyCouncilAddress, ], { + initializer: "initializeMock", constructorArgs: [ polygonZkEVMGlobalExitRoot?.target, polTokenAddress, @@ -443,8 +453,8 @@ async function main() { // save an ongoing deployment ongoingDeployment.polygonRollupManagerContract = polygonRollupManagerContract?.target; fs.writeFileSync(pathOngoingDeploymentJson, JSON.stringify(ongoingDeployment, null, 1)); - - deploymentBlockNumber = (await polygonRollupManagerContract.deployTransaction.wait()).blockNumber; + console.log(polygonRollupManagerContract.deploymentTransaction()); + deploymentBlockNumber = (await polygonRollupManagerContract?.deploymentTransaction().wait()).blockNumber; } else { // Expect the precalculate address matches de onogin deployment, sanity check expect(precalculateRollupManager).to.be.equal(ongoingDeployment.polygonRollupManagerContract); @@ -472,22 +482,34 @@ async function main() { console.log("##### Checks PolygonZkEVM #####"); console.log("#######################"); console.log("PolygonZkEVMGlobalExitRootAddress:", await polygonRollupManagerContract.globalExitRootManager()); - console.log("polTokenAddress:", await polygonRollupManagerContract.matic()); - console.log("verifierAddress:", await polygonRollupManagerContract.rollupVerifier()); + console.log("polTokenAddress:", await polygonRollupManagerContract.pol()); console.log("polygonZkEVMBridgeContract:", await polygonRollupManagerContract.bridgeAddress()); - console.log("admin:", await polygonRollupManagerContract.admin()); - console.log("chainID:", await polygonRollupManagerContract.chainID()); - console.log("trustedSequencer:", await polygonRollupManagerContract.trustedSequencer()); console.log("pendingStateTimeout:", await polygonRollupManagerContract.pendingStateTimeout()); - console.log("trustedAggregator:", await polygonRollupManagerContract.trustedAggregator()); console.log("trustedAggregatorTimeout:", await polygonRollupManagerContract.trustedAggregatorTimeout()); - console.log("genesiRoot:", await polygonRollupManagerContract.batchNumToStateRoot(0)); - console.log("trustedSequencerURL:", await polygonRollupManagerContract.trustedSequencerURL()); - console.log("networkName:", await polygonRollupManagerContract.networkName()); - console.log("owner:", await polygonRollupManagerContract.owner()); - console.log("forkID:", await polygonRollupManagerContract.forkID()); + // Check roles + expect(await polygonRollupManagerContract.hasRole(DEFAULT_ADMIN_ROLE, timelockContract.target)).to.be.equal(true); + expect(await polygonRollupManagerContract.hasRole(ADD_ROLLUP_TYPE_ROLE, timelockContract.target)).to.be.equal(true); + expect(await polygonRollupManagerContract.hasRole(UPDATE_ROLLUP_ROLE, timelockContract.target)).to.be.equal(true); + expect(await polygonRollupManagerContract.hasRole(ADD_EXISTING_ROLLUP_ROLE, timelockContract.target)).to.be.equal( + true + ); + expect(await polygonRollupManagerContract.hasRole(TRUSTED_AGGREGATOR_ROLE, trustedAggregator)).to.be.equal(true); + + expect(await polygonRollupManagerContract.hasRole(OBSOLETE_ROLLUP_TYPE_ROLE, admin)).to.be.equal(true); + expect(await polygonRollupManagerContract.hasRole(CREATE_ROLLUP_ROLE, admin)).to.be.equal(true); + expect(await polygonRollupManagerContract.hasRole(TRUSTED_AGGREGATOR_ROLE_ADMIN, admin)).to.be.equal(true); + expect(await polygonRollupManagerContract.hasRole(TWEAK_PARAMETERS_ROLE, admin)).to.be.equal(true); + expect(await polygonRollupManagerContract.hasRole(SET_FEE_ROLE, admin)).to.be.equal(true); + expect(await polygonRollupManagerContract.hasRole(STOP_EMERGENCY_ROLE, admin)).to.be.equal(true); + + expect(await polygonRollupManagerContract.hasRole(EMERGENCY_COUNCIL_ROLE, emergencyCouncilAddress)).to.be.equal( + true + ); + expect(await polygonRollupManagerContract.hasRole(EMERGENCY_COUNCIL_ADMIN, emergencyCouncilAddress)).to.be.equal( + true + ); // Assert admin address expect(await upgrades.erc1967.getAdminAddress(precalculateRollupManager)).to.be.equal(proxyAdminAddress); @@ -495,26 +517,18 @@ async function main() { expect(await upgrades.erc1967.getAdminAddress(proxyBridgeAddress)).to.be.equal(proxyAdminAddress); const outputJson = { - polygonZkEVMAddress: polygonRollupManagerContract.address, - polygonZkEVMBridgeAddress: polygonZkEVMBridgeContract.address, - polygonZkEVMGlobalExitRootAddress: polygonZkEVMGlobalExitRoot.address, + polygonRollupManager: polygonRollupManagerContract.target, + polygonZkEVMBridgeAddress: polygonZkEVMBridgeContract.target, + polygonZkEVMGlobalExitRootAddress: polygonZkEVMGlobalExitRoot?.target, polTokenAddress, - verifierAddress: verifierContract.address, - zkEVMDeployerContract: zkEVMDeployerContract.address, + zkEVMDeployerContract: zkEVMDeployerContract.target, deployerAddress: deployer.address, - timelockContractAddress: timelockContract.address, + timelockContractAddress: timelockContract.target, deploymentBlockNumber, - genesisRoot: genesisRootHex, - trustedSequencer, - trustedSequencerURL, - chainID, - networkName, admin, trustedAggregator, proxyAdminAddress, - forkID, salt, - version, }; fs.writeFileSync(pathOutputJson, JSON.stringify(outputJson, null, 1)); diff --git a/deployment/v2/4_createRollup.ts b/deployment/v2/4_createRollup.ts new file mode 100644 index 000000000..b151202ef --- /dev/null +++ b/deployment/v2/4_createRollup.ts @@ -0,0 +1,188 @@ +/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if */ +/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */ +import {expect} from "chai"; +import path = require("path"); +import fs = require("fs"); + +import * as dotenv from "dotenv"; +dotenv.config({path: path.resolve(__dirname, "../../.env")}); +import {ethers, upgrades} from "hardhat"; +import {HardhatEthersSigner} from "@nomicfoundation/hardhat-ethers/signers"; + +const {create2Deployment} = require("../helpers/deployment-helpers"); + +const pathOutputJson = path.join(__dirname, "./deploy_output.json"); + +const deployParameters = require("./deploy_parameters.json"); +const genesis = require("./genesis.json"); +const deployOutput = require("./deploy_output.json"); +import "../helpers/utils"; + +import {PolygonRollupManager} from "../../typechain-types"; + +async function main() { + /* + * Check deploy parameters + * Check that every necessary parameter is fullfilled + */ + const mandatoryDeploymentParameters = [ + "realVerifier", + "trustedSequencerURL", + "networkName", + "description", + "trustedSequencer", + "chainID", + "adminZkEVM", + "forkID", + ]; + + for (const parameterName of mandatoryDeploymentParameters) { + if (deployParameters[parameterName] === undefined || deployParameters[parameterName] === "") { + throw new Error(`Missing parameter: ${parameterName}`); + } + } + + const {realVerifier, trustedSequencerURL, networkName, description, trustedSequencer, chainID, adminZkEVM, forkID} = + deployParameters; + + // Load provider + let currentProvider = ethers.provider; + if (deployParameters.multiplierGas || deployParameters.maxFeePerGas) { + if (process.env.HARDHAT_NETWORK !== "hardhat") { + currentProvider = ethers.getDefaultProvider( + `https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}` + ) as any; + if (deployParameters.maxPriorityFeePerGas && deployParameters.maxFeePerGas) { + console.log( + `Hardcoded gas used: MaxPriority${deployParameters.maxPriorityFeePerGas} gwei, MaxFee${deployParameters.maxFeePerGas} gwei` + ); + const FEE_DATA = new ethers.FeeData( + null, + ethers.parseUnits(deployParameters.maxFeePerGas, "gwei"), + ethers.parseUnits(deployParameters.maxPriorityFeePerGas, "gwei") + ); + + currentProvider.getFeeData = async () => FEE_DATA; + } else { + console.log("Multiplier gas used: ", deployParameters.multiplierGas); + async function overrideFeeData() { + const feedata = await ethers.provider.getFeeData(); + return new ethers.FeeData( + null, + ((feedata.maxFeePerGas as bigint) * BigInt(deployParameters.multiplierGas)) / 1000n, + ((feedata.maxPriorityFeePerGas as bigint) * BigInt(deployParameters.multiplierGas)) / 1000n + ); + } + currentProvider.getFeeData = overrideFeeData; + } + } + } + + // Load deployer + let deployer; + if (deployParameters.deployerPvtKey) { + deployer = new ethers.Wallet(deployParameters.deployerPvtKey, currentProvider); + } else if (process.env.MNEMONIC) { + deployer = ethers.HDNodeWallet.fromMnemonic( + ethers.Mnemonic.fromPhrase(process.env.MNEMONIC), + "m/44'/60'/0'/0/0" + ).connect(currentProvider); + } else { + [deployer] = await ethers.getSigners(); + } + + // Load Rollup manager + const PolgonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager", deployer); + const rollupManagerContract = PolgonRollupManagerFactory.attach( + deployOutput.polygonRollupManager + ) as PolygonRollupManager; + + let verifierContract; + if (realVerifier === true) { + const VerifierRollup = await ethers.getContractFactory("FflonkVerifier", deployer); + verifierContract = await VerifierRollup.deploy(); + await verifierContract.waitForDeployment(); + } else { + const VerifierRollupHelperFactory = await ethers.getContractFactory("VerifierRollupHelperMock", deployer); + verifierContract = await VerifierRollupHelperFactory.deploy(); + await verifierContract.waitForDeployment(); + } + console.log("#######################\n"); + console.log("Verifier deployed to:", verifierContract.target); + + // Since it's a mock deployment deployer has all the rights + const ADD_ROLLUP_TYPE_ROLE = ethers.id("ADD_ROLLUP_TYPE_ROLE"); + const CREATE_ROLLUP_ROLE = ethers.id("CREATE_ROLLUP_ROLE"); + + await rollupManagerContract.grantRole(ADD_ROLLUP_TYPE_ROLE, deployer.address); + await rollupManagerContract.grantRole(CREATE_ROLLUP_ROLE, deployer.address); + + // Create zkEVM implementation + const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMV2"); + const PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy( + deployOutput.polygonZkEVMGlobalExitRootAddress, + deployOutput.polTokenAddress, + deployOutput.polygonZkEVMBridgeAddress, + deployOutput.polygonRollupManager + ); + await PolygonZKEVMV2Contract.waitForDeployment(); + + // Add a new rollup type with timelock + const newRollupTypeID = 1; + const rollupCompatibilityID = 0; + await rollupManagerContract.addNewRollupType( + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + genesis.root, + description + ); + + console.log("#######################\n"); + console.log("Added new Rollup Type deployed"); + + let gasTokenAddress, gasTokenNetwork; + + if (deployParameters.gasTokenAddress && deployParameters.gasTokenAddress != "") { + gasTokenAddress = deployParameters.gasTokenAddress; + gasTokenNetwork = deployParameters.gasTokenNetwork; + } else { + gasTokenAddress = ethers.ZeroAddress; + gasTokenNetwork = 0; + } + + const newZKEVMAddress = ethers.getCreateAddress({ + from: rollupManagerContract.target as string, + nonce: await currentProvider.getTransactionCount(rollupManagerContract.target), + }); + + // Create new rollup + const txDeployRollup = await rollupManagerContract.createNewRollup( + newRollupTypeID, + chainID, + adminZkEVM, + trustedSequencer, + gasTokenAddress, + gasTokenNetwork, + trustedSequencerURL, + networkName + ); + await txDeployRollup.wait(); + console.log("#######################\n"); + console.log("Created new Rollup:", newZKEVMAddress); + + // Assert admin address + expect(await upgrades.erc1967.getAdminAddress(newZKEVMAddress)).to.be.equal(rollupManagerContract.target); + expect(await upgrades.erc1967.getImplementationAddress(newZKEVMAddress)).to.be.equal(PolygonZKEVMV2Contract.target); + + deployOutput.genesis = genesis.root; + deployOutput.newZKEVMAddress = newZKEVMAddress; + + fs.writeFileSync(pathOutputJson, JSON.stringify(deployOutput, null, 1)); +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/deployment/README.md b/deployment/v2/README.md similarity index 100% rename from deployment/README.md rename to deployment/v2/README.md diff --git a/deployment/deploy_parameters.json.example b/deployment/v2/deploy_parameters.json.example similarity index 69% rename from deployment/deploy_parameters.json.example rename to deployment/v2/deploy_parameters.json.example index d482d43d2..522ff3b2e 100644 --- a/deployment/deploy_parameters.json.example +++ b/deployment/v2/deploy_parameters.json.example @@ -1,26 +1,27 @@ { + "timelockAdminAddress": "0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", + "minDelayTimelock": 3600, + "salt": "0x0000000000000000000000000000000000000000000000000000000000000000", + "initialZkEVMDeployerOwner" :"0xaddress", + "admin":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", + "trustedAggregator":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", + "trustedAggregatorTimeout": 604799, + "pendingStateTimeout": 604799, + "emergencyCouncilAddress": "0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", "realVerifier": false, "trustedSequencerURL": "http://zkevm-json-rpc:8123", "networkName": "zkevm", - "version":"0.0.1", + "description":"0.0.1", "trustedSequencer":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", "chainID": 1001, - "trustedAggregator":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", - "trustedAggregatorTimeout": 604799, - "pendingStateTimeout": 604799, + "adminZkEVM":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", "forkID": 1, - "admin":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", - "zkEVMOwner": "0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", - "timelockAddress": "0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", - "minDelayTimelock": 3600, - "salt": "0x0000000000000000000000000000000000000000000000000000000000000000", - "initialZkEVMDeployerOwner" :"0xaddress", - "maticTokenAddress":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", + "polTokenAddress":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", "zkEVMDeployerAddress":"", - "gasTokenAddress":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", + "gasTokenAddress":"", "gasTokenNetwork":0, "deployerPvtKey": "", "maxFeePerGas":"", "maxPriorityFeePerGas":"", "multiplierGas": "" -} \ No newline at end of file +} diff --git a/deployment/v2/genesis.json b/deployment/v2/genesis.json new file mode 100644 index 000000000..b838d3934 --- /dev/null +++ b/deployment/v2/genesis.json @@ -0,0 +1,92 @@ +{ + "root": "0xc9cb1d9b6eb09926da6984beda72b94dcca2e42adb83c6fc90c81607a9452a0d", + "genesis": [ + { + "contractName": "PolygonZkEVMDeployer", + "balance": "0", + "nonce": "4", + "address": "0x363330f6aF9C702AE90E2319A59d5200Ac9d7246", + "bytecode": "0x60806040526004361061006e575f3560e01c8063715018a61161004c578063715018a6146100e25780638da5cb5b146100f6578063e11ae6cb1461011f578063f2fde38b14610132575f80fd5b80632b79805a146100725780634a94d487146100875780636d07dbf81461009a575b5f80fd5b610085610080366004610908565b610151565b005b6100856100953660046109a2565b6101c2565b3480156100a5575f80fd5b506100b96100b43660046109f5565b610203565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ed575f80fd5b50610085610215565b348015610101575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff166100b9565b61008561012d366004610a15565b610228565b34801561013d575f80fd5b5061008561014c366004610a61565b61028e565b61015961034a565b5f6101658585856103ca565b90506101718183610527565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a15050505050565b6101ca61034a565b6101d583838361056a565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b905f90a1505050565b5f61020e8383610598565b9392505050565b61021d61034a565b6102265f6105a4565b565b61023061034a565b5f61023c8484846103ca565b60405173ffffffffffffffffffffffffffffffffffffffff821681529091507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a150505050565b61029661034a565b73ffffffffffffffffffffffffffffffffffffffff811661033e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610347816105a4565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610335565b5f83471015610435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610335565b81515f0361049f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610335565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff811661020e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610335565b606061020e83835f6040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c65640000815250610618565b6060610590848484604051806060016040528060298152602001610b0860299139610618565b949350505050565b5f61020e83833061072d565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156106aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610335565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516106d29190610a9c565b5f6040518083038185875af1925050503d805f811461070c576040519150601f19603f3d011682016040523d82523d5f602084013e610711565b606091505b509150915061072287838387610756565b979650505050505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b606083156107eb5782515f036107e45773ffffffffffffffffffffffffffffffffffffffff85163b6107e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610335565b5081610590565b61059083838151156108005781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103359190610ab7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112610870575f80fd5b813567ffffffffffffffff8082111561088b5761088b610834565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156108d1576108d1610834565b816040528381528660208588010111156108e9575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f806080858703121561091b575f80fd5b8435935060208501359250604085013567ffffffffffffffff80821115610940575f80fd5b61094c88838901610861565b93506060870135915080821115610961575f80fd5b5061096e87828801610861565b91505092959194509250565b803573ffffffffffffffffffffffffffffffffffffffff8116811461099d575f80fd5b919050565b5f805f606084860312156109b4575f80fd5b6109bd8461097a565b9250602084013567ffffffffffffffff8111156109d8575f80fd5b6109e486828701610861565b925050604084013590509250925092565b5f8060408385031215610a06575f80fd5b50508035926020909101359150565b5f805f60608486031215610a27575f80fd5b8335925060208401359150604084013567ffffffffffffffff811115610a4b575f80fd5b610a5786828701610861565b9150509250925092565b5f60208284031215610a71575f80fd5b61020e8261097a565b5f5b83811015610a94578181015183820152602001610a7c565b50505f910152565b5f8251610aad818460208701610a7a565b9190910192915050565b602081525f8251806020840152610ad5816040850160208701610a7a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220330b94dc698c4d290bf55c23f13b473cde6a6bae0030cb902de18af54e35839f64736f6c63430008140033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000cae25c8623761783fe4ce241c9b428126a7612a" + } + }, + { + "contractName": "ProxyAdmin", + "balance": "0", + "nonce": "1", + "address": "0xeEd3E59b4cbE530F20e1ac79fA877ce33D8Cf805", + "bytecode": "0x608060405260043610610079575f3560e01c80639623609d1161004c5780639623609d1461012357806399a88ec414610136578063f2fde38b14610155578063f3b7dead14610174575f80fd5b8063204e1c7a1461007d578063715018a6146100c55780637eff275e146100db5780638da5cb5b146100fa575b5f80fd5b348015610088575f80fd5b5061009c6100973660046105e8565b610193565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100d0575f80fd5b506100d9610244565b005b3480156100e6575f80fd5b506100d96100f536600461060a565b610257565b348015610105575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff1661009c565b6100d961013136600461066e565b6102e0565b348015610141575f80fd5b506100d961015036600461060a565b610371565b348015610160575f80fd5b506100d961016f3660046105e8565b6103cd565b34801561017f575f80fd5b5061009c61018e3660046105e8565b610489565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907f5c60da1b00000000000000000000000000000000000000000000000000000000815260040190565b5f60405180830381855afa9150503d805f8114610215576040519150601f19603f3d011682016040523d82523d5f602084013e61021a565b606091505b509150915081610228575f80fd5b8080602001905181019061023c919061075b565b949350505050565b61024c6104d3565b6102555f610553565b565b61025f6104d3565b6040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690638f283970906024015b5f604051808303815f87803b1580156102c6575f80fd5b505af11580156102d8573d5f803e3d5ffd5b505050505050565b6102e86104d3565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef28690349061033e9086908690600401610776565b5f604051808303818588803b158015610355575f80fd5b505af1158015610367573d5f803e3d5ffd5b5050505050505050565b6103796104d3565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690633659cfe6906024016102af565b6103d56104d3565b73ffffffffffffffffffffffffffffffffffffffff811661047d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61048681610553565b50565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907ff851a44000000000000000000000000000000000000000000000000000000000815260040190565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610474565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610486575f80fd5b5f602082840312156105f8575f80fd5b8135610603816105c7565b9392505050565b5f806040838503121561061b575f80fd5b8235610626816105c7565b91506020830135610636816105c7565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f805f60608486031215610680575f80fd5b833561068b816105c7565b9250602084013561069b816105c7565b9150604084013567ffffffffffffffff808211156106b7575f80fd5b818601915086601f8301126106ca575f80fd5b8135818111156106dc576106dc610641565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561072257610722610641565b8160405282815289602084870101111561073a575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f6020828403121561076b575f80fd5b8151610603816105c7565b73ffffffffffffffffffffffffffffffffffffffff831681525f602060408184015283518060408501525f5b818110156107be578581018301518582016060015282016107a2565b505f6060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050939250505056fea26469706673582212203083a4ccc2e42eed60bd19037f2efa77ed086dc7a5403f75bebb995dcba2221c64736f6c63430008140033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000dead72fd97a579e98aef2f9eb190066e1858d15a" + } + }, + { + "contractName": "PolygonZkEVMBridge implementation", + "balance": "0", + "nonce": "1", + "address": "0x2b4d7418689C91b81A8d7114F8F4BfeB5f96CF4E", + "bytecode": "0x608060405260043610620001d3575f3560e01c80638ed7e3f211620000fa578063cd5865791162000092578063dbc16976116200006a578063dbc169761462000685578063ee25560b146200069c578063f5efcd7914620006cb578063fb57083414620006ef575f80fd5b8063cd5865791462000620578063d02103ca1462000637578063d3476afe1462000661575f80fd5b8063bab161bf11620000d2578063bab161bf146200057a578063be5831c7146200059d578063cc46163214620005d8578063ccaa2d1114620005fc575f80fd5b80638ed7e3f21462000511578063aaa13cc21462000532578063b8b284d01462000556575f80fd5b80633cbc795b116200016e5780635ca1e16511620001465780635ca1e165146200048757806379e2cf97146200049e57806381b1c17414620004b557806383f2440314620004ed575f80fd5b80633cbc795b14620003285780633e19704314620003745780634b2f336d1462000466575f80fd5b8063240ff37811620001ae578063240ff378146200025d5780632dfdf0b51462000274578063318aee3d146200029a5780633c351e101462000307575f80fd5b806315064c9614620001d75780632072f6c5146200020757806322e95f2c1462000220575b5f80fd5b348015620001e3575f80fd5b50606854620001f29060ff1681565b60405190151581526020015b60405180910390f35b34801562000213575f80fd5b506200021e62000713565b005b3480156200022c575f80fd5b50620002446200023e36600462003723565b62000764565b6040516001600160a01b039091168152602001620001fe565b6200021e6200026e366004620037b3565b620007f9565b34801562000280575f80fd5b506200028b60535481565b604051908152602001620001fe565b348015620002a6575f80fd5b50620002e2620002b836600462003832565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201620001fe565b34801562000313575f80fd5b50606d5462000244906001600160a01b031681565b34801562000334575f80fd5b50606d546200035e9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001620001fe565b34801562000380575f80fd5b506200028b6200039236600462003866565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b34801562000472575f80fd5b50606e5462000244906001600160a01b031681565b34801562000493575f80fd5b506200028b62000862565b348015620004aa575f80fd5b506200021e62000947565b348015620004c1575f80fd5b5062000244620004d3366004620038eb565b606a6020525f90815260409020546001600160a01b031681565b348015620004f9575f80fd5b506200028b6200050b36600462003915565b62000981565b3480156200051d575f80fd5b50606c5462000244906001600160a01b031681565b3480156200053e575f80fd5b50620002446200055036600462003956565b62000a64565b34801562000562575f80fd5b506200021e6200057436600462003a03565b62000bf4565b34801562000586575f80fd5b506068546200035e90610100900463ffffffff1681565b348015620005a9575f80fd5b506068546200035e90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b348015620005e4575f80fd5b50620001f2620005f636600462003a8b565b62000cc9565b34801562000608575f80fd5b506200021e6200061a36600462003ac1565b62000d58565b6200021e6200063136600462003bb5565b6200144d565b34801562000643575f80fd5b5060685462000244906501000000000090046001600160a01b031681565b3480156200066d575f80fd5b506200021e6200067f36600462003c51565b62001a03565b34801562000691575f80fd5b506200021e62001dd7565b348015620006a8575f80fd5b506200028b620006ba366004620038eb565b60696020525f908152604090205481565b348015620006d7575f80fd5b506200021e620006e936600462003ac1565b62001e26565b348015620006fb575f80fd5b50620001f26200070d36600462003cc5565b620021aa565b606c546001600160a01b0316331462000758576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000762620021c5565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b3415801590620008135750606e546001600160a01b031615155b156200084b576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200085b85853486868662002258565b5050505050565b6053545f90819081805b60208110156200093e578083901c600116600103620008cf57603381602081106200089b576200089b62003d0f565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620008fc565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620009359062003d69565b9150506200086c565b50919392505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000762576200076262002340565b5f83815b602081101562000a5b57600163ffffffff8516821c81169003620009f757848160208110620009b857620009b862003d0f565b602002013582604051602001620009d9929190918252602082015260400190565b60405160208183030381529060405280519060200120915062000a46565b8185826020811062000a0d5762000a0d62003d0f565b602002013560405160200162000a2d929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062000a528162003d69565b91505062000985565b50949350505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b30836040518060200162000af890620036e9565b601f1982820381018352601f90910116604081905262000b25908d908d908d908d908d9060200162003dcc565b60408051601f198184030181529082905262000b45929160200162003e30565b6040516020818303038152906040528051906020012060405160200162000bce94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b606e546001600160a01b031662000c37576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606e546040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018690526001600160a01b0390911690639dc29fac906044015f604051808303815f87803b15801562000c9a575f80fd5b505af115801562000cad573d5f803e3d5ffd5b5050505062000cc186868686868662002258565b505050505050565b6068545f908190610100900463ffffffff1615801562000cef575063ffffffff83166001145b1562000d03575063ffffffff831662000d2f565b62000d1a64010000000063ffffffff851662003e62565b62000d2c9063ffffffff861662003e7c565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000d96576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161462000de0576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000ee78c8c8c8c8c62000ee15f8e8e8e8e8e8e8e60405162000e0592919062003e92565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62002409565b6001600160a01b0386166200105657606e546001600160a01b031662000fd4575f6001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000f40576020820181803683370190505b5060405162000f50919062003ece565b5f6040518083038185875af1925050503d805f811462000f8c576040519150601f19603f3d011682016040523d82523d5f602084013e62000f91565b606091505b505090508062000fcd576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50620013e3565b606e546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015260248201869052909116906340c10f19906044015f604051808303815f87803b15801562001039575f80fd5b505af11580156200104c573d5f803e3d5ffd5b50505050620013e3565b606d546001600160a01b038781169116148015620010965750606d5463ffffffff8881167401000000000000000000000000000000000000000090920416145b15620010af575f6001600160a01b038516848262000f15565b60685463ffffffff610100909104811690881603620010e457620010de6001600160a01b0387168585620025e1565b620013e3565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b03168062001367575f80806200118b8688018862003fa1565b9250925092505f85848484604051620011a490620036e9565b620011b2939291906200404a565b8190604051809103905ff5905080158015620011d0573d5f803e3d5ffd5b506040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562001236575f80fd5b505af115801562001249573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b6040516200135595949392919062004086565b60405180910390a150505050620013e0565b6040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b158015620013c8575f80fd5b505af1158015620013db573d5f803e3d5ffd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156200148b576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200149562002691565b60685463ffffffff610100909104811690881603620014e0576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f806060876001600160a01b03881662001563578834146200152e576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d546001600160a01b038116945074010000000000000000000000000000000000000000900463ffffffff169250620018a2565b34156200159c576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606e546001600160a01b03908116908916036200162f576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018a90526001600160a01b03891690639dc29fac906044015f604051808303815f87803b15801562001612575f80fd5b505af115801562001625573d5f803e3d5ffd5b50505050620018a2565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620016fe576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b90526001600160a01b038a1690639dc29fac906044015f604051808303815f87803b158015620016d4575f80fd5b505af1158015620016e7573d5f803e3d5ffd5b5050505080602001519450805f01519350620018a0565b8515620017135762001713898b898962002706565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa15801562001771573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620017979190620040c0565b9050620017b06001600160a01b038b1633308e62002bb1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa1580156200180e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620018349190620040c0565b9050620018428282620040d8565b6068548c9850610100900463ffffffff1696509350620018628762002c04565b6200186d8c62002d0b565b620018788d62002e07565b6040516020016200188c939291906200404a565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620018e3989796959493929190620040ee565b60405180910390a1620019db620019d55f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62002ef2565b8615620019ec57620019ec62002340565b50505050620019fa60018055565b50505050505050565b5f54610100900460ff161580801562001a2257505f54600160ff909116105b8062001a3d5750303b15801562001a3d57505f5460ff166001145b62001acf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801562001b2c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8916027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016848316179055606d541662001c3157606d5474010000000000000000000000000000000000000000900463ffffffff161562001c2b576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001d63565b606d805463ffffffff861674010000000000000000000000000000000000000000027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b038816171790556040515f9060129062001c9890620036e9565b6060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff909116604082015260e0018190604051809103905ff590508015801562001d29573d5f803e3d5ffd5b50606e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790555b62001d6d62003007565b801562000cc1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b606c546001600160a01b0316331462001e1c576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000762620030a9565b60685460ff161562001e64576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161462001eae576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001ed48c8c8c8c8c62000ee160018e8e8e8e8e8e8e60405162000e0592919062003e92565b606e545f906001600160a01b031662001fbd57846001600160a01b031684888a868660405160240162001f0b949392919062004159565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f2000000000000000000000000000000000000000000000000000000001790525162001f70919062003ece565b5f6040518083038185875af1925050503d805f811462001fac576040519150601f19603f3d011682016040523d82523d5f602084013e62001fb1565b606091505b50508091505062002107565b606e546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260248201879052909116906340c10f19906044015f604051808303815f87803b15801562002022575f80fd5b505af115801562002035573d5f803e3d5ffd5b50505050846001600160a01b0316878985856040516024016200205c949392919062004159565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f20000000000000000000000000000000000000000000000000000000017905251620020c1919062003ece565b5f604051808303815f865af19150503d805f8114620020fc576040519150601f19603f3d011682016040523d82523d5f602084013e62002101565b606091505b50909150505b806200213f576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f81620021b986868662000981565b1490505b949350505050565b60685460ff161562002203576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff610100909104811690871603620022a3576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051620022f99998979695949392919062004193565b60405180910390a162002334620019d56001606860019054906101000a900463ffffffff16338a8a8a898960405162000e0592919062003e92565b821562000cc15762000cc15b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d620023b962000862565b6040518263ffffffff1660e01b8152600401620023d891815260200190565b5f604051808303815f87803b158015620023f0575f80fd5b505af115801562002403573d5f803e3d5ffd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af11580156200249b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620024c19190620040c0565b9050805f03620024fc576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80680100000000000000008716600103620025605786915062002523848a8489620021aa565b6200255a576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620025ca565b602087901c6200257281600162004200565b91508792506200259162002588868c8662000981565b8a8389620021aa565b620025c8576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b620025d6828262003138565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526200268c9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262003200565b505050565b600260015403620026ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001ac6565b6002600155565b5f62002716600482848662004227565b620027219162004250565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002967575f80808080808062002783896004818d62004227565b81019062002792919062004299565b9650965096509650965096509650336001600160a01b0316876001600160a01b031614620027ec576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03861630146200282f576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002869576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002917919062003ece565b5f604051808303815f865af19150503d805f811462002952576040519150601f19603f3d011682016040523d82523d5f602084013e62002957565b606091505b505050505050505050506200085b565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c0000000000000000000000000000000000000000000000000000000014620029e3576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80808080808080620029fa8a6004818e62004227565b81019062002a099190620042ef565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462002a65576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038716301462002aa8576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002b5f919062003ece565b5f604051808303815f865af19150503d805f811462002b9a576040519150601f19603f3d011682016040523d82523d5f602084013e62002b9f565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052620024039085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002627565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b0386169162002c7a919062003ece565b5f60405180830381855afa9150503d805f811462002cb4576040519150601f19603f3d011682016040523d82523d5f602084013e62002cb9565b606091505b50915091508162002d00576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250620021bd565b620021bd8162003305565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b0386169162002d81919062003ece565b5f60405180830381855afa9150503d805f811462002dbb576040519150601f19603f3d011682016040523d82523d5f602084013e62002dc0565b606091505b50915091508162002d00576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250620021bd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b0386169162002e7c919062003ece565b5f60405180830381855afa9150503d805f811462002eb6576040519150601f19603f3d011682016040523d82523d5f602084013e62002ebb565b606091505b509150915081801562002ecf575080516020145b62002edc576012620021bd565b80806020019051810190620021bd919062004376565b80600162002f0360206002620044cb565b62002f0f9190620040d8565b6053541062002f4a576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462002f5b9062003d69565b918290555090505f5b602081101562002ff6578082901c60011660010362002f9c57826033826020811062002f945762002f9462003d0f565b015550505050565b6033816020811062002fb25762002fb262003d0f565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062002fed9062003d69565b91505062002f64565b506200268c620044d8565b60018055565b5f54610100900460ff166200309f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001ac6565b62000762620034f0565b60685460ff16620030e6576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b6068545f90610100900463ffffffff161580156200315c575063ffffffff82166001145b1562003170575063ffffffff82166200319c565b6200318764010000000063ffffffff841662003e62565b620031999063ffffffff851662003e7c565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620019fa576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62003256826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620035889092919063ffffffff16565b8051909150156200268c578080602001905181019062003277919062004505565b6200268c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001ac6565b60606040825110620033275781806020019051810190620007f3919062004523565b8151602003620034b2575f5b6020811080156200337e575082818151811062003354576200335462003d0f565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620033995780620033908162003d69565b91505062003333565b805f03620033dc57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115620033f957620033f962003ea1565b6040519080825280601f01601f19166020018201604052801562003424576020820181803683370190505b5090505f5b82811015620034aa5784818151811062003447576200344762003d0f565b602001015160f81c60f81b82828151811062003467576200346762003d0f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620034a18162003d69565b91505062003429565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b5f54610100900460ff1662003001576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001ac6565b6060620021bd84845f85855f80866001600160a01b03168587604051620035b0919062003ece565b5f6040518083038185875af1925050503d805f8114620035ec576040519150601f19603f3d011682016040523d82523d5f602084013e620035f1565b606091505b509150915062003604878383876200360f565b979650505050505050565b606083156200369c5782515f0362003694576001600160a01b0385163b62003694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001ac6565b5081620021bd565b620021bd8383815115620036b35781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001ac691906200459e565b6119a180620045b383390190565b803563ffffffff81168114620034eb575f80fd5b6001600160a01b038116811462003720575f80fd5b50565b5f806040838503121562003735575f80fd5b6200374083620036f7565b9150602083013562003752816200370b565b809150509250929050565b801515811462003720575f80fd5b5f8083601f8401126200377c575f80fd5b50813567ffffffffffffffff81111562003794575f80fd5b602083019150836020828501011115620037ac575f80fd5b9250929050565b5f805f805f60808688031215620037c8575f80fd5b620037d386620036f7565b94506020860135620037e5816200370b565b93506040860135620037f7816200375d565b9250606086013567ffffffffffffffff81111562003813575f80fd5b62003821888289016200376b565b969995985093965092949392505050565b5f6020828403121562003843575f80fd5b813562003850816200370b565b9392505050565b60ff8116811462003720575f80fd5b5f805f805f805f60e0888a0312156200387d575f80fd5b87356200388a8162003857565b96506200389a60208901620036f7565b95506040880135620038ac816200370b565b9450620038bc60608901620036f7565b93506080880135620038ce816200370b565b9699959850939692959460a0840135945060c09093013592915050565b5f60208284031215620038fc575f80fd5b5035919050565b806104008101831015620007f3575f80fd5b5f805f610440848603121562003929575f80fd5b833592506200393c856020860162003903565b91506200394d6104208501620036f7565b90509250925092565b5f805f805f805f60a0888a0312156200396d575f80fd5b6200397888620036f7565b965060208801356200398a816200370b565b9550604088013567ffffffffffffffff80821115620039a7575f80fd5b620039b58b838c016200376b565b909750955060608a0135915080821115620039ce575f80fd5b50620039dd8a828b016200376b565b9094509250506080880135620039f38162003857565b8091505092959891949750929550565b5f805f805f8060a0878903121562003a19575f80fd5b62003a2487620036f7565b9550602087013562003a36816200370b565b945060408701359350606087013562003a4f816200375d565b9250608087013567ffffffffffffffff81111562003a6b575f80fd5b62003a7989828a016200376b565b979a9699509497509295939492505050565b5f806040838503121562003a9d575f80fd5b62003aa883620036f7565b915062003ab860208401620036f7565b90509250929050565b5f805f805f805f805f805f806109208d8f03121562003ade575f80fd5b62003aea8e8e62003903565b9b5062003afc8e6104008f0162003903565b9a506108008d013599506108208d013598506108408d0135975062003b256108608e01620036f7565b965062003b376108808e01356200370b565b6108808d0135955062003b4e6108a08e01620036f7565b945062003b606108c08e01356200370b565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111562003b8a575f80fd5b62003b9d8e6109008f01358f016200376b565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121562003bcc575f80fd5b62003bd788620036f7565b9650602088013562003be9816200370b565b955060408801359450606088013562003c02816200370b565b9350608088013562003c14816200375d565b925060a088013567ffffffffffffffff81111562003c30575f80fd5b62003c3e8a828b016200376b565b989b979a50959850939692959293505050565b5f805f805f60a0868803121562003c66575f80fd5b62003c7186620036f7565b9450602086013562003c83816200370b565b935062003c9360408701620036f7565b9250606086013562003ca5816200370b565b9150608086013562003cb7816200370b565b809150509295509295909350565b5f805f80610460858703121562003cda575f80fd5b8435935062003ced866020870162003903565b925062003cfe6104208601620036f7565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003d9c5762003d9c62003d3c565b5060010190565b81835281816020850137505f602082840101525f6020601f19601f840116840101905092915050565b606081525f62003de160608301878962003da3565b828103602084015262003df681868862003da3565b91505060ff831660408301529695505050505050565b5f5b8381101562003e2857818101518382015260200162003e0e565b50505f910152565b5f835162003e4381846020880162003e0c565b83519083019062003e5981836020880162003e0c565b01949350505050565b8082028115828204841417620007f357620007f362003d3c565b80820180821115620007f357620007f362003d3c565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f825162003ee181846020870162003e0c565b9190910192915050565b604051601f8201601f1916810167ffffffffffffffff8111828210171562003f175762003f1762003ea1565b604052919050565b5f67ffffffffffffffff82111562003f3b5762003f3b62003ea1565b50601f01601f191660200190565b5f82601f83011262003f59575f80fd5b813562003f7062003f6a8262003f1f565b62003eeb565b81815284602083860101111562003f85575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003fb4575f80fd5b833567ffffffffffffffff8082111562003fcc575f80fd5b62003fda8783880162003f49565b9450602086013591508082111562003ff0575f80fd5b5062003fff8682870162003f49565b9250506040840135620040128162003857565b809150509250925092565b5f81518084526200403681602086016020860162003e0c565b601f01601f19169290920160200192915050565b606081525f6200405e60608301866200401d565b82810360208401526200407281866200401d565b91505060ff83166040830152949350505050565b63ffffffff861681525f6001600160a01b038087166020840152808616604084015250608060608301526200360460808301848662003da3565b5f60208284031215620040d1575f80fd5b5051919050565b81810381811115620007f357620007f362003d3c565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c085015262004140828501876200401d565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f6200418960608301848662003da3565b9695505050505050565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620041e6828501878962003da3565b925080851660e085015250509a9950505050505050505050565b63ffffffff81811683821601908082111562004220576200422062003d3c565b5092915050565b5f808585111562004236575f80fd5b8386111562004243575f80fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620042915780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215620042b0575f80fd5b8735620042bd816200370b565b96506020880135620042cf816200370b565b955060408801359450606088013593506080880135620038ce8162003857565b5f805f805f805f80610100898b03121562004308575f80fd5b883562004315816200370b565b9750602089013562004327816200370b565b96506040890135955060608901359450608089013562004347816200375d565b935060a0890135620043598162003857565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004387575f80fd5b8151620038508162003857565b600181815b80851115620043f357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620043d757620043d762003d3c565b80851615620043e557918102915b93841c939080029062004399565b509250929050565b5f826200440b57506001620007f3565b816200441957505f620007f3565b81600181146200443257600281146200443d576200445d565b6001915050620007f3565b60ff84111562004451576200445162003d3c565b50506001821b620007f3565b5060208310610133831016604e8410600b841016171562004482575081810a620007f3565b6200448e838362004394565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620044c357620044c362003d3c565b029392505050565b5f620038508383620043fb565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6020828403121562004516575f80fd5b815162003850816200375d565b5f6020828403121562004534575f80fd5b815167ffffffffffffffff8111156200454b575f80fd5b8201601f810184136200455c575f80fd5b80516200456d62003f6a8262003f1f565b81815285602083850101111562004582575f80fd5b6200459582602083016020860162003e0c565b95945050505050565b602081525f6200385060208301846200401d56fe61010060405234801562000011575f80fd5b50604051620019a1380380620019a1833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516115036200049e5f395f61022d01525f81816102fb015281816105ad015261067a01525f61052801525f818161036d01526104f201526115035ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b6040516101879190611255565b60405180910390f35b6101a361019e3660046112e6565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461130e565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d3660046112e6565b61054a565b6102856102803660046112e6565b610595565b005b6101b7610295366004611347565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca366004611347565b60056020525f908152604090205481565b61017a610653565b6102856102f13660046112e6565b610662565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a36103503660046112e6565b610717565b6101a36103633660046112e6565b6107cd565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d366004611367565b6107da565b6101b76103b03660046113d4565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611405565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611405565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610ad7565b60019150505b92915050565b5f336104d9858285610c56565b6104e4858585610d12565b506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146105255761052046610f31565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c09082908690610590908790611483565b610ad7565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106455760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61064f8282610ff8565b5050565b60606004805461043290611405565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461070d5760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d42726964676500000000000000000000000000000000606482015260840161063c565b61064f82826110cf565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107c05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161063c565b6104e48286868403610ad7565b5f336104c0818585610d12565b8342111561084f5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d697400000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866108a883611496565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6109126104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156109d3573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610a4e57508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610ac05760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e617475726500000000000000000000000000000000000000000000000000606482015260840161063c565b610acb8a8a8a610ad7565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610b5f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610be85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d0c5781811015610cff5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161063c565b610d0c8484848403610ad7565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610d9b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610e245760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610ebf5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610d0c565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610f5b610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff821661105b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161063c565b8060025f82825461106c9190611483565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166111585760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260208190526040902054818110156111f35760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610c49565b5f6020808352835180828501525f5b8181101561128057858101830151858201604001528201611264565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146112e1575f80fd5b919050565b5f80604083850312156112f7575f80fd5b611300836112be565b946020939093013593505050565b5f805f60608486031215611320575f80fd5b611329846112be565b9250611337602085016112be565b9150604084013590509250925092565b5f60208284031215611357575f80fd5b611360826112be565b9392505050565b5f805f805f805f60e0888a03121561137d575f80fd5b611386886112be565b9650611394602089016112be565b95506040880135945060608801359350608088013560ff811681146113b7575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f80604083850312156113e5575f80fd5b6113ee836112be565b91506113fc602084016112be565b90509250929050565b600181811c9082168061141957607f821691505b602082108103611450577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c6611456565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036114c6576114c6611456565b506001019056fea2646970667358221220176a1a9cf4a702d3853b858873fff4a6370c4e5d7d72d68593ec0ebe64fcc26964736f6c63430008140033a26469706673582212209002ffc0c7cb9056d22d47ac65cf05714a8ae8ce0af7e882f7e68b9fdede830e64736f6c63430008140033" + }, + { + "contractName": "PolygonZkEVMBridge proxy", + "balance": "340282366920938463463374607431768211455", + "nonce": "1", + "address": "0xc9510b46d0D59b7A5E6CdE2cF2C0Bfa7Fa25fFD4", + "bytecode": "0x60806040526004361061005d575f3560e01c80635c60da1b116100425780635c60da1b146100a65780638f283970146100e3578063f851a440146101025761006c565b80633659cfe6146100745780634f1ef286146100935761006c565b3661006c5761006a610116565b005b61006a610116565b34801561007f575f80fd5b5061006a61008e366004610854565b610130565b61006a6100a136600461086d565b610178565b3480156100b1575f80fd5b506100ba6101eb565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee575f80fd5b5061006a6100fd366004610854565b610228565b34801561010d575f80fd5b506100ba610255565b61011e610282565b61012e610129610359565b610362565b565b610138610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d8160405180602001604052805f8152505f6103bf565b50565b61016d610116565b610180610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101e3576101de8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250600192506103bf915050565b505050565b6101de610116565b5f6101f4610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610359565b905090565b610225610116565b90565b610230610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d816103e9565b5f61025e610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610380565b61028a610380565b73ffffffffffffffffffffffffffffffffffffffff16330361012e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b5f61021861044a565b365f80375f80365f845af43d5f803e80801561037c573d5ff35b3d5ffd5b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b6103c883610471565b5f825111806103d45750805b156101de576103e383836104bd565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f610412610380565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a161016d816104e9565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103a3565b61047a816105f5565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606104e28383604051806060016040528060278152602001610977602791396106c0565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811661058c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610350565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b73ffffffffffffffffffffffffffffffffffffffff81163b610699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610350565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105af565b60605f808573ffffffffffffffffffffffffffffffffffffffff16856040516106e9919061090b565b5f60405180830381855af49150503d805f8114610721576040519150601f19603f3d011682016040523d82523d5f602084013e610726565b606091505b509150915061073786838387610741565b9695505050505050565b606083156107d65782515f036107cf5773ffffffffffffffffffffffffffffffffffffffff85163b6107cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610350565b50816107e0565b6107e083836107e8565b949350505050565b8151156107f85781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103509190610926565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f575f80fd5b919050565b5f60208284031215610864575f80fd5b6104e28261082c565b5f805f6040848603121561087f575f80fd5b6108888461082c565b9250602084013567ffffffffffffffff808211156108a4575f80fd5b818601915086601f8301126108b7575f80fd5b8135818111156108c5575f80fd5b8760208285010111156108d6575f80fd5b6020830194508093505050509250925092565b5f5b838110156109035781810151838201526020016108eb565b50505f910152565b5f825161091c8184602087016108e9565b9190910192915050565b602081525f82518060208401526109448160408501602087016108e9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212202ac98acbfbb3d3ac1b74050e18c4e76db25a3ff2801ec69bf85d0c61414d502b64736f6c63430008140033", + "storage": { + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000eed3e59b4cbe530f20e1ac79fa877ce33d8cf805", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000002b4d7418689c91b81a8d7114f8f4bfeb5f96cf4e" + } + }, + { + "contractName": "PolygonZkEVMGlobalExitRootL2 implementation", + "balance": "0", + "nonce": "1", + "address": "0xE641334b752d435a5133f64c6DBAB34431A9B9DC", + "bytecode": "0x608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301fd90441461004e578063257b36321461006a57806333d6247d14610089578063a3c573eb1461009e575b5f80fd5b61005760015481565b6040519081526020015b60405180910390f35b61005761007836600461015e565b5f6020819052908152604090205481565b61009c61009736600461015e565b6100ea565b005b6100c57f000000000000000000000000c9510b46d0d59b7a5e6cde2cf2c0bfa7fa25ffd481565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610061565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c9510b46d0d59b7a5e6cde2cf2c0bfa7fa25ffd41614610159576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b5f6020828403121561016e575f80fd5b503591905056fea26469706673582212205108c6c4f924146b736832a1bdf696e20d900450207b7452462368d150f2c71c64736f6c63430008140033" + }, + { + "contractName": "PolygonZkEVMGlobalExitRootL2 proxy", + "balance": "0", + "nonce": "1", + "address": "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa", + "bytecode": "0x60806040523661001357610011610017565b005b6100115b61001f6101b7565b6001600160a01b0316336001600160a01b0316141561016f5760606001600160e01b031960003516631b2ce7f360e11b8114156100655761005e6101ea565b9150610167565b6001600160e01b0319811663278f794360e11b14156100865761005e610241565b6001600160e01b031981166308f2839760e41b14156100a75761005e610287565b6001600160e01b031981166303e1469160e61b14156100c85761005e6102b8565b6001600160e01b03198116635c60da1b60e01b14156100e95761005e6102f8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b61017761030c565b565b606061019e83836040518060600160405280602781526020016108576027913961031c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101f4610394565b600061020336600481846106a2565b81019061021091906106e8565b905061022d8160405180602001604052806000815250600061039f565b505060408051602081019091526000815290565b606060008061025336600481846106a2565b8101906102609190610719565b915091506102708282600161039f565b604051806020016040528060008152509250505090565b6060610291610394565b60006102a036600481846106a2565b8101906102ad91906106e8565b905061022d816103cb565b60606102c2610394565b60006102cc6101b7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b6060610302610394565b60006102cc610422565b610177610317610422565b610431565b6060600080856001600160a01b0316856040516103399190610807565b600060405180830381855af49150503d8060008114610374576040519150601f19603f3d011682016040523d82523d6000602084013e610379565b606091505b509150915061038a86838387610455565b9695505050505050565b341561017757600080fd5b6103a8836104d3565b6000825111806103b55750805b156103c6576103c48383610179565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103f46101b7565b604080516001600160a01b03928316815291841660208301520160405180910390a161041f81610513565b50565b600061042c6105bc565b905090565b3660008037600080366000845af43d6000803e808015610450573d6000f35b3d6000fd5b606083156104c15782516104ba576001600160a01b0385163b6104ba5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161015e565b50816104cb565b6104cb83836105e4565b949350505050565b6104dc8161060e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105785760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161015e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101db565b8151156105f45781518083602001fd5b8060405162461bcd60e51b815260040161015e9190610823565b6001600160a01b0381163b61067b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161015e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61059b565b600080858511156106b257600080fd5b838611156106bf57600080fd5b5050820193919092039150565b80356001600160a01b03811681146106e357600080fd5b919050565b6000602082840312156106fa57600080fd5b61019e826106cc565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561072c57600080fd5b610735836106cc565b9150602083013567ffffffffffffffff8082111561075257600080fd5b818501915085601f83011261076657600080fd5b81358181111561077857610778610703565b604051601f8201601f19908116603f011681019083821181831017156107a0576107a0610703565b816040528281528860208487010111156107b957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107f65781810151838201526020016107de565b838111156103c45750506000910152565b600082516108198184602087016107db565b9190910192915050565b60208152600082518060208401526108428160408501602087016107db565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122012bb4f564f73959a03513dc74fc3c6e40e8386e6f02c16b78d6db00ce0aa16af64736f6c63430008090033", + "storage": { + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000eed3e59b4cbe530f20e1ac79fa877ce33d8cf805", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x000000000000000000000000e641334b752d435a5133f64c6dbab34431a9b9dc" + } + }, + { + "contractName": "PolygonZkEVMTimelock", + "balance": "0", + "nonce": "1", + "address": "0xDEAd72Fd97a579E98AEF2F9EB190066E1858D15a", + "bytecode": "0x6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220d904e0b10230579952f8427a107aa4349f9a1f5799108d399b11e28b578463e464736f6c63430008140033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000e10", + "0xa35b5405ab15b96b03cc591647476727d852994a412b5030df6fc27d6663ae98": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x3068bd570ea4e7d974748b6421609a672ffc2752a61ba3a01cab0651ae1ac36d": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x64494413541ff93b31aa309254e3fed72a7456e9845988b915b4c7a7ceba8814": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x555ccfd2adedd3617807cc741088518e69e1b40eeadcc863c31e3de2eeb454dd": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x3412d5605ac6cd444957cedb533e5dacad6378b4bc819ebe3652188a665066d6": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0xba259d66f4dd33fbb3dec88075da2b4d0684440fd415c1f24df79a0258ca9e62": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d706a": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0xd449b9dacab93eed6e33b971a4f75b09702709f5b92088a7d361838e246a3556": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xc3ad33e20b0c56a223ad5104fff154aa010f8715b9c981fd38fdc60a4d1a52fc": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5" + } + }, + { + "accountName": "keyless Deployer", + "balance": "0", + "nonce": "1", + "address": "0x6c989E3859D248fEF40669B95a7d1dd45DAC1848" + }, + { + "accountName": "deployer", + "balance": "0", + "nonce": "8", + "address": "0x0cae25c8623761783Fe4CE241C9b428126A7612A" + } + ] +} \ No newline at end of file diff --git a/deployment/verifyContracts.js b/deployment/v2/verifyContracts.js similarity index 71% rename from deployment/verifyContracts.js rename to deployment/v2/verifyContracts.js index 017866a63..b5428112a 100644 --- a/deployment/verifyContracts.js +++ b/deployment/v2/verifyContracts.js @@ -17,9 +17,12 @@ async function main() { } // verify maticToken - const maticTokenName = 'Matic Token'; - const maticTokenSymbol = 'MATIC'; - const maticTokenInitialBalance = ethers.parseEther('20000000'); + const polTokenName = "Pol Token"; + const polTokenSymbol = "POL"; + const polTokenInitialBalance = ethers.parseEther("20000000"); + + const polTokenFactory = await ethers.getContractFactory("ERC20PermitMock", deployer); + try { // verify governance await hre.run( @@ -27,10 +30,10 @@ async function main() { { address: deployOutputParameters.maticTokenAddress, constructorArguments: [ - maticTokenName, - maticTokenSymbol, + polTokenName, + polTokenSymbol, deployOutputParameters.deployerAddress, - maticTokenInitialBalance, + polTokenInitialBalance, ], }, ); @@ -51,7 +54,7 @@ async function main() { } const { minDelayTimelock } = deployParameters; - const { timelockAddress } = deployParameters; + const { timelockAdminAddress } = deployParameters; try { await hre.run( 'verify:verify', @@ -59,10 +62,10 @@ async function main() { address: deployOutputParameters.timelockContractAddress, constructorArguments: [ minDelayTimelock, - [timelockAddress], - [timelockAddress], - timelockAddress, - deployOutputParameters.polygonZkEVMAddress, + [timelockAdminAddress], + [timelockAdminAddress], + timelockAdminAddress, + deployOutputParameters.polygonRollupManager, ], }, ); @@ -87,14 +90,11 @@ async function main() { await hre.run( 'verify:verify', { - address: deployOutputParameters.polygonZkEVMAddress, + address: deployOutputParameters.polygonRollupManager, constructorArguments: [ deployOutputParameters.polygonZkEVMGlobalExitRootAddress, - deployOutputParameters.maticTokenAddress, - deployOutputParameters.verifierAddress, + deployOutputParameters.polTokenAddress, deployOutputParameters.polygonZkEVMBridgeAddress, - deployOutputParameters.chainID, - deployOutputParameters.forkID, ], }, ); @@ -109,7 +109,7 @@ async function main() { { address: deployOutputParameters.polygonZkEVMGlobalExitRootAddress, constructorArguments: [ - deployOutputParameters.polygonZkEVMAddress, + deployOutputParameters.polygonRollupManager, deployOutputParameters.polygonZkEVMBridgeAddress, ], }, @@ -128,6 +128,24 @@ async function main() { } catch (error) { expect(error.message.toLowerCase().includes('proxyadmin')).to.be.equal(true); } + + // verify zkEVM address + try { + await hre.run( + 'verify:verify', + { + address: deployOutputParameters.newZKEVMAddress, + constructorArguments: [ + deployOutputParameters.polygonZkEVMGlobalExitRootAddress, + deployOutputParameters.polTokenAddress, + deployOutputParameters.polygonZkEVMBridgeAddress, + deployOutputParameters.polygonRollupManager + ], + }, + ); + } catch (error) { + expect(error.message.toLowerCase().includes('proxyadmin')).to.be.equal(true); + } } main() diff --git a/deployment/verifyzkEVMDeployer.js b/deployment/v2/verifyzkEVMDeployer.js similarity index 100% rename from deployment/verifyzkEVMDeployer.js rename to deployment/v2/verifyzkEVMDeployer.js diff --git a/docker/scripts/v2/deploy-docker.sh b/docker/scripts/v2/deploy-docker.sh new file mode 100755 index 000000000..a2001bfe8 --- /dev/null +++ b/docker/scripts/v2/deploy-docker.sh @@ -0,0 +1,17 @@ +#!/bin/bash +sudo rm -rf docker/gethData/geth_data +rm deployment/deploy_ongoing.json +DEV_PERIOD=1 docker-compose -f docker/docker-compose.geth.yml up -d geth +sleep 5 +node docker/scripts/fund-accounts.js +cp docker/scripts/deploy_parameters_docker.json deployment/deploy_parameters.json +cp docker/scripts/genesis_docker.json deployment/genesis.json +npx hardhat run deployment/testnet/prepareTestnet.js --network localhost +npx hardhat run deployment/2_deployPolygonZKEVMDeployer.js --network localhost +npx hardhat run deployment/3_deployContracts.js --network localhost +mkdir docker/deploymentOutput +mv deployment/deploy_output.json docker/deploymentOutput +docker-compose -f docker/docker-compose.geth.yml down +sudo docker build -t hermeznetwork/geth-zkevm-contracts -f docker/Dockerfile.geth . +# Let it readable for the multiplatform build coming later! +sudo chmod -R go+rxw docker/gethData diff --git a/docker/scripts/v2/deploy-dockerv2.sh b/docker/scripts/v2/deploy-dockerv2.sh new file mode 100644 index 000000000..aae943c2c --- /dev/null +++ b/docker/scripts/v2/deploy-dockerv2.sh @@ -0,0 +1,16 @@ +#!/bin/bash +sudo rm -rf docker/gethData/geth_data +DEV_PERIOD=1 docker compose -f docker/docker-compose.geth.yml up -d geth +sleep 5 +node docker/scripts/fund-accounts.js +cp docker/scripts/deploy_parameters_docker.json deployment/deploy_parameters.json +cp docker/scripts/genesis_docker.json deployment/genesis.json +npx hardhat run deployment/testnet/prepareTestnet.js --network localhost +npx hardhat run deployment/2_deployPolygonZKEVMDeployer.js --network localhost +npx hardhat run deployment/3_deployContracts.js --network localhost +mkdir docker/deploymentOutput +mv deployment/deploy_output.json docker/deploymentOutput +docker compose -f docker/docker-compose.geth.yml down +sudo docker build -t hermeznetwork/geth-zkevm-contracts -f docker/Dockerfile.geth . +# Let it readable for the multiplatform build coming later! +sudo chmod -R go+rxw docker/gethData \ No newline at end of file diff --git a/hardhat.config.ts b/hardhat.config.ts index 272c6c0cf..cd2011147 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -105,6 +105,16 @@ const config: HardhatUserConfig = { evmVersion: "shanghai", }, }, + "contracts/v2/mocks/PolygonRollupManagerMock.sol": { + version: "0.8.20", + settings: { + optimizer: { + enabled: true, + runs: 10, + }, + evmVersion: "shanghai", + }, // try yul optimizer + }, }, }, networks: { diff --git a/package.json b/package.json index 8b6eaef39..348a38610 100644 --- a/package.json +++ b/package.json @@ -56,10 +56,10 @@ "saveDeployment:mainnet": "mkdir -p deployments/mainnet_$(date +%s) && cp -r deployment/deploy_*.json deployments/mainnet_$(date +%s) && cp .openzeppelin/mainnet.json deployments/mainnet_$(date +%s) && cp deployment/genesis.json deployments/mainnet_$(date +%s)", "test": "npx hardhat test test/contracts/**.test.js", "docgen": "npx solidity-docgen --solc-module solc-0.8 -t ./docs/templates -e ./contracts/verifiers,./contracts/mocks", - "prepare:testnet:ZkEVM:localhost": "npx hardhat run deployment/testnet/prepareTestnet.js --network localhost", + "prepare:testnet:ZkEVM:localhost": "npx hardhat run deployment/testnet/prepareTestnet.ts --network localhost", "deploy:ZkEVM:localhost": "rm -f .openzeppelin/unknown-31337.json && node deployment/1_createGenesis.js && npx hardhat run deployment/2_deployPolygonZKEVMDeployer.js --network localhost && npx hardhat run deployment/3_deployContracts.js --network localhost", "deploy:testnet:ZkEVM:localhost": "npm run prepare:testnet:ZkEVM:localhost && npm run deploy:ZkEVM:localhost", - "prepare:testnet:ZkEVM:goerli": "npx hardhat run deployment/testnet/prepareTestnet.js --network goerli", + "prepare:testnet:ZkEVM:goerli": "npx hardhat run deployment/testnet/prepareTestnet.ts --network goerli", "deploy:ZkEVM:goerli": "node deployment/1_createGenesis.js && npx hardhat run deployment/3_deployContracts.js --network goerli && npm run saveDeployment:goerli", "deploy:deployer:ZkEVM:goerli": "npx hardhat run deployment/2_deployPolygonZKEVMDeployer.js --network goerli", "verify:deployer:ZkEVM:goerli": "npx hardhat run deployment/verifyzkEVMDeployer.js --network goerli", @@ -81,11 +81,9 @@ "coverage": "npx hardhat coverage", "gas:report": "REPORT_GAS=true npx hardhat test", "gas:report:file": "rm -f .openzeppelin/unknown-31337.json && REPORT_GAS=true REPORT_GAS_FILE=true npx hardhat test", - "deploy:testnet:ZkEVM:test:goerli": "npm run prepare:testnet:ZkEVM:goerli && npm run deploy:ZkEVM:test:goerli", - "deploy:ZkEVM:test:goerli": "node deployment/1_createGenesis.js --test && npx hardhat run deployment/3_deployContracts.js --network goerli && npm run saveDeployment:goerli", - "prepare:testnet:gasToken:ZkEVM:localhost": "npx hardhat run deployment/testnet/prepareTestnet.js --network localhost && npx hardhat run deployment/testnet/prepareGasToken.js --network localhost", - "deploy:testnet:gasToken:ZkEVM:localhost": "npm run prepare:testnet:gasToken:ZkEVM:localhost && npm run deploy:ZkEVM:localhost", - "prepare:testnet:gasToken:ZkEVM:goerli": "npx hardhat run deployment/testnet/prepareTestnet.js --network goerli && npx hardhat run deployment/testnet/prepareGasToken.js --network goerli", - "deploy:testnet:gasToken:ZkEVM:goerli": "npm run prepare:testnet:gasToken:ZkEVM:goerli && npm run deploy:ZkEVM:goerli" + "deploy:v2:localhost": "rm -f .openzeppelin/unknown-31337.json && npx ts-node deployment/v2/1_createGenesis.ts --test && npx hardhat run deployment/v2/2_deployPolygonZKEVMDeployer.ts --network localhost && npx hardhat run deployment/v2/3_deployContracts.ts --network localhost && npx hardhat run deployment/v2/4_createRollup.ts --network localhost", + "deploy:testnet:v2:localhost": "rm -f deployment/v2/deploy_ongoing.json && npm run prepare:testnet:ZkEVM:localhost && npm run deploy:v2:localhost", + "deploy:v2:goerli": "npx ts-node deployment/v2/1_createGenesis.ts && npx hardhat run deployment/v2/2_deployPolygonZKEVMDeployer.ts --network goerli && npx hardhat run deployment/v2/3_deployContracts.ts --network goerli && npx hardhat run deployment/v2/4_createRollup.ts --network goerli", + "deploy:testnet:v2:goerli": "rm -f deployment/v2/deploy_ongoing.json && npm run prepare:testnet:ZkEVM:goerli && npm run deploy:v2:goerli" } } From 7907eb93dcce63e4d69e83678c057fe506b801fd Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 18 Oct 2023 14:12:42 +0200 Subject: [PATCH 076/230] add paris mock artifact --- .../paris/PolygonRollupManagerMock.json | 2085 +++++++++++++++++ 1 file changed, 2085 insertions(+) create mode 100644 compiled-contracts/paris/PolygonRollupManagerMock.json diff --git a/compiled-contracts/paris/PolygonRollupManagerMock.json b/compiled-contracts/paris/PolygonRollupManagerMock.json new file mode 100644 index 000000000..6ad4be8b4 --- /dev/null +++ b/compiled-contracts/paris/PolygonRollupManagerMock.json @@ -0,0 +1,2085 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonRollupManagerMock", + "sourceName": "contracts/v2/mocks/PolygonRollupManagerMock.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": [ + { + "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" + } + ], + "name": "initializeMock", + "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": "bytes32[]", + "name": "localExitRoots", + "type": "bytes32[]" + } + ], + "name": "prepareMockCalculateRoot", + "outputs": [], + "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": "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": "uint32", + "name": "rollupTypeID", + "type": "uint32" + } + ], + "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": "0x60e034620000e257601f620059d738819003918201601f19168301916001600160401b03831184841017620000e757808492606094604052833981010312620000e25780516001600160a01b0391908281168103620000e2576020820151918383168303620000e257604001519283168303620000e25760805260c05260a0526040516158d99081620000fe8239608051818181610e7c01528181611a1801528181612fe20152818161313701526144f2015260a051818181610c76015281816112b60152614856015260c0518181816105d5015281816140480152614c350152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe60808060405260043610156200001457600080fd5b600090813560e01c908163066ec01214620039e857508063080b311114620039985780630a0d9fbe146200396b5780630e36f582146200327957806311f6b287146200322d57806312b86e1914620030aa5780631489ed101462002f5357806315064c961462002f2e5780631608859c1462002e885780631796a1ae1462002e625780631816b7e51462002db55780632072f6c51462002d15578063248a9ca31462002ce6578063252801691462002c315780632f2ff15d1462002b8857806336568abe1462002b39578063394218e91462002a84578063477fa2701462002a645780634d4d33381462001f7e57806355a71ee01462001f22578063604691691462001ed857806365c0504d1462001e535780637222020f1462001d7c5780637975fcfe1462001d035780637fb6e76a1462001cbf578063841b24d71462001c9c57806387c20c0114620017ef5780638bd4f07114620017595780638f698ec5146200165057806391d14854146200160057806399f5634e14620015e15780639a908e7314620014775780639c9f3dfe14620013cc578063a066215c146200132a578063a217fddf146200130c578063a2967d9914620012e5578063a3c573eb146200129e578063afd23cbe1462001277578063b99d0ad714620011ae578063c1acbc34146200117f578063c4c928c21462000eef578063ceee281d1462000eab578063d02103ca1462000e64578063d5073f6f1462000da9578063d547741f1462000d60578063d939b3151462000d35578063dbc169761462000c28578063dde0ff771462000bfb578063e0bfd3d21462000a5b578063e136edf71462000604578063e46761c414620005bd578063f34eb8eb14620003a0578063f4e92675146200037a5763f9c4c2ae14620002aa57600080fd5b3462000377576020366003190112620003775760406101809163ffffffff620002d262003a0f565b16815260816020522060ff815491600181015460058201549160076006820154910154926040519560018060a01b0393848216885260018060401b039485809360a01c1660208a01528116604089015260a01c166060870152608086015281811660a0860152818160401c1660c0860152818160801c1660e086015260c01c6101008501528082166101208501528160401c1661014084015260801c16610160820152f35b80fd5b50346200037757806003193601126200037757602063ffffffff60805416604051908152f35b5034620003775760c03660031901126200037757620003be62003a68565b620003c862003ac4565b90620003d362003a3a565b906064359160ff8316809303620005b8576001600160401b03926084359060a435858111620005b4576200040c90369060040162003cdb565b3360009081527fb3124b64d0942b276d75ea451f4dd8b83bf9442b427f9eb873ac771c92e65f02602052604090205490939060ff1615620005a257607e549663ffffffff6200045d818a1662003db5565b16809863ffffffff191617607e556040519060c0820190828210898311176200058c5789916040528a600160a01b6001900380991698898552806020860193169a8b84528060408701971696878152606087019289845280608089019580875260a08a01988d8a528152607f6020526040902098511690600160a01b600190031991828a54161789556001890196511690865416178555511662000502908462003dcb565b519082549060ff60e81b9051151560e81b169160ff60e01b9060e01b169061ffff60e01b1916171790555190600201556040519586958652602086015260408501526060840152608083015260a0820160c0905260c08201620005659162003bf4565b037fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5291a280f35b634e487b7160e01b600052604160045260246000fd5b604051637615be1f60e11b8152600490fd5b8780fd5b600080fd5b503462000377578060031936011262000377576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5034620003775761010036600319011262000377576200062362003a0f565b906200062e62003a23565b916044356001600160a01b0381168103620005b8576200064d62003a7f565b6200065762003a96565b9060a4359063ffffffff82168203620005b85760c4356001600160401b03811162000a57576200068c90369060040162003cdb565b916001600160401b0360e4351162000a5757620006af3660e43560040162003cdb565b3360009081527f41902c3bd358ff4b85ee46864bd81ee453a1b3cfd703a58950be8d28ae030661602052604090205490959060ff1615620005a25763ffffffff871615801562000a3f575b62000a2d5763ffffffff87168852607f6020526040882093600160ff8187015460e81c1615151462000a1b576001600160401b038a1689526083602052604089205463ffffffff1662000a09576080549563ffffffff6200075d81891662003db5565b1663ffffffff1997909716871760805585546040519b906001600160a01b0316620007888d62003c67565b8b8d52604051906001600160401b03610618830190811190831117620009f557620007d88d9e83926106186200502c85396106188401908152306020820152606060408201819052019062003bf4565b03908cf0968715620009ea5788927f9a84992ead4481f37097c7663e97ed883b31f216fae5685c6ee576a656483cd992620008e48d8f600160a096620008d78f600763ffffffff9160ff968e878060401b038c16825260836020526040822081861982541617905587808f1b038316825260826020526040822081861982541617905581526081602052604081209187808f1b031990888f81901b03168184541617835587870154906200089b898501928a8060401b039060a01c168362003dcb565b888f81901b03898901541690825416179055620008b98b8362003dcb565b60406002870154918080526002840160205220550195168562003d8c565b015460e01c169062003df4565b63ffffffff6040519d168d528c6020600180861b038c1691015260018060401b031660408d0152600180831b03169a8b606082015263ffffffff87166080820152a26001600160a01b0385163b15620009e657889662000999620009ac9263ffffffff8a966040519c8d9b8c9a8b996308fd7e2160e31b8b5260018060a01b031660048b015260018060a01b031660248a01526044890152606488015216608486015260e060a486015260e485019062003bf4565b8381036003190160c48501529062003bf4565b03926001600160a01b03165af18015620009db57620009c85750f35b620009d39062003c1b565b620003775780f35b6040513d84823e3d90fd5b8880fd5b6040513d8d823e3d90fd5b634e487b7160e01b8d52604160045260248dfd5b6040516337c8fe0960e11b8152600490fd5b604051633b8d3d9960e01b8152600490fd5b604051637512e5cb60e01b8152600490fd5b5063ffffffff607e541663ffffffff881611620006fa565b8680fd5b5034620003775760c036600319011262000377576004356001600160a01b038181169182900362000bf75762000a9062003ac4565b62000a9a62003a3a565b606435936001600160401b039081861690818703620005b85760a4359260ff841693848103620005b8573360009081527ff444741efd45fa05f38650e87f3d8ca01816575bed45a01e78186ae5f3bc8355602090815260409091205490999060ff1615620005a257848b5260838a5263ffffffff978860408d20541662000a09576080549862000b2c818b1662003db5565b16988963ffffffff19809216176080558660005260838c5260406000208a828254161790558560005260828c52896040600020918254161790558860005260818b52604060002099600160a01b60019003199086828d5416178c5560018c019262000b988b8562003dcb565b169082541617905562000bac908962003dcb565b62000bbb906007890162003df4565b6040519416845286840152604083015260608201526080600080516020620057a483398151915291a28280526002019052608435604082205580f35b8280fd5b503462000377578060031936011262000377576084546040805191901c6001600160401b03168152602090f35b503462000377578060031936011262000377573360009081527f307dd781c86f141a460373e0117a8033afea21c02f6121aff0f5b5553df24f4a602052604090205460ff1615620005a257807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1562000d3257818091600460405180948193636de0b4bb60e11b83525af18015620009db5762000d1a575b5050606f5460ff81161562000d085760ff1916606f557f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b38180a180f35b604051635386698160e01b8152600490fd5b62000d259062003c1b565b6200037757803862000ccb565b50fd5b503462000377578060031936011262000377576085546040516001600160401b039091168152602090f35b503462000377576040366003190112620003775762000da660043562000d8562003ac4565b90808452603460205262000da0600160408620015462004ef3565b62004fb4565b80f35b50346200037757602036600319011262000377573360009081527fe0205af17734f857fb538b40523c7cc189a1ab8f1ec33be516761c6b465766b660205260409020546004359060ff1615620005a257683635c9adc5dea000008111801562000e56575b62000e44576020817ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b292608655604051908152a180f35b604051638586952560e01b8152600490fd5b50633b9aca00811062000e0d565b503462000377578060031936011262000377576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503462000377576020366003190112620003775760209063ffffffff906040906001600160a01b0362000edd62003a68565b16815260828452205416604051908152f35b50346200037757606036600319011262000377576004356001600160a01b038181169182900362000bf75760243563ffffffff808216809203620005b8576001600160401b039260443584811162000a57573660238201121562000a5757806004013590858211620005b4573660248383010111620005b4573360009081527ff14f5a8ad59d90593602e905b358229bff5ceea677d5bf0f5a1701793550a9a6602090815260409091205490949060ff1615620005a2578515801562001171575b62000a2d57878952608285526040892054169687156200115f57878952608185526040892093600785019788549088818360401c16146200114d57888c52607f885260408c20916001830190815490600160ff8360e81c1615151462000a1b5760ff808360e01c169160801c16036200113b57600190980180546001600160a01b031916988516989098178855548c97620010519160a01c83169062003dcb565b6200105d898b62003d8c565b8a875260818852620010726040882062004ba9565b8a546001600160401b0319169116908117909955541690803b1562001137578492836064602494876040519889978896879463278f794360e11b8652600486015260408286015282604486015201848401378181018301849052601f01601f191681010301925af18015620009db576200111b575b5050907ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d926040928351928352820152a280f35b620011299093929362003c1b565b6200113757908438620010e7565b8480fd5b604051635aa0d5f160e11b8152600490fd5b604051634f61d51960e01b8152600490fd5b6040516374a086a360e01b8152600490fd5b5080607e5416861162000fb0565b5034620003775780600319360112620003775760845460405160809190911c6001600160401b03168152602090f35b50346200037757604036600319011262000377576080906040620011d162003a0f565b9163ffffffff620011e162003a23565b938260608551620011f28162003c4b565b828152826020820152828782015201521681526081602052600482822001600180841b03809416825260205220604051906200122e8262003c4b565b8054928084169384845281602085019160401c16815260606002600185015494604087019586520154940193845260405194855251166020840152516040830152516060820152f35b50346200037757806003193601126200037757602061ffff60855460801c16604051908152f35b503462000377578060031936011262000377576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5034620003775780600319360112620003775760206200130462004970565b604051908152f35b50346200037757806003193601126200037757602090604051908152f35b50346200037757602036600319011262000377576200134862003a51565b6200135262004eb9565b6001600160401b03811690620151808211620013ba5760858054600160401b600160801b031916604092831b600160401b600160801b0316179055519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602090a180f35b604051631c0cfbfd60e31b8152600490fd5b5034620003775760203660031901126200037757620013ea62003a51565b620013f462004eb9565b60ff606f5416156200144e575b608580546001600160401b0319166001600160401b0390921691821790556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602090a180f35b6085546001600160401b0390811690821610620014015760405163048a05a960e41b8152600490fd5b50346200037757604036600319011262000377576200149562003a51565b60ff606f5416620015cf573382526020916082835263ffffffff604082205416908115620015bd576001600160401b0383811615620015ab5762001574604083856200157a95526081885220916084549080620014f58882851662003e11565b169660018060401b0319978880941617608455600685018054836200151e818316948562003e11565b16998a911617905560405192620015358462003c2f565b60243584528260018b8601958242168752604081019485528b600052600389018d52604060002090518155019451169084541617835551169062003d8c565b620043a0565b7f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a2583604051848152a2604051908152f35b604051632590ccf960e01b8152600490fd5b6040516371653c1560e01b8152600490fd5b604051630bc011ff60e21b8152600490fd5b5034620003775780600319360112620003775760206200130462004c1a565b503462000377576040366003190112620003775760406200162062003ac4565b9160043581526034602052209060018060a01b0316600052602052602060ff604060002054166040519015158152f35b5034620003775760208060031936011262001755576004356001600160401b03811162000bf7573660238201121562000bf7578060040135620016938162003ca7565b92620016a3604051948562003c83565b8184528084019260249384600594851b83010191368311620005b45785849101915b83831062001744575050505063ffffffff8085511663ffffffff196080541617608055855b8551811015620017405762001700818762004945565b51600182018083116200172d57831688526081845260408820850155620017279062004935565b620016ea565b634e487b7160e01b895260116004528689fd5b8680f35b8235815291810191849101620016c5565b5080fd5b503462000377576200176b3662003adb565b60ff606f9895929698979493975416620015cf578560409784620017c6947f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a70109b8b8e63ffffffff60029c1681526081602052209889620045eb565b600180861b03166000520160205281600020549082519182526020820152a162000da662004854565b50346200037757620018013662003b51565b9060ff606f99989799969395965416620015cf5763ffffffff871688526081602052604088209860018060401b03871660005260038a016020526200185d60018060401b036001604060002001541660845460c01c9062003e11565b426001600160401b039091161162001c8a576103e86001600160401b0362001886868a62003e2b565b161162001c785784876200189d9588938d62003eb8565b620018a88662004ba9565b92958693866001600160401b03620018c1838862003e2b565b6085549391169190620018e2604085901c6001600160401b03164262004825565b9a5b6001600160401b038181169083161462001c61576001600160401b038181166000908152600388016020526040902060010154919082168d101562001936575060401c6001600160401b0316620018e4565b9250506200196392939495969798999a506200195a9060018060401b039262003e2b565b16809262004825565b918183101562001c05575003600c81111562001bfa57506200199d600c5b6086548161ffff60855460801c160a02906103e80a9062004833565b6086555b608654683635c9adc5dea00000908181111562001bd957506086555b6085546001600160401b031662001add578160056006830192620019e2878562003d8c565b60018060401b03871660005260028101602052856040600020550155805460018060401b038160801c1662001aca575b508590507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031662001a4a62004970565b813b1562000bf75782916024839260405194859384926333d6247d60e01b845260048401525af18015620009db5762001ab2575b5050600080516020620057e4833981519152915b62001aac60405192839263ffffffff339816968462003e45565b0390a380f35b62001abd9062003c1b565b6200113757843862001a7e565b6001600160801b03169055388062001a12565b62001aeb81939293620043a0565b6006810180546001600160401b03608082901c811690811462001bc557600160801b600160c01b0319909116600190910160801b600160801b600160c01b03161790819055604051600080516020620057e4833981519152949392909160029162001b568462003c4b565b426001600160401b039081168552888116602080870191825260408781018a8152606089018a815260809790971c85168f526004959095019091528c20955186546001600160401b0319169083161786555162001bb591168562003d8c565b5160018401555191015562001a92565b634e487b7160e01b89526011600452602489fd5b9050633b9aca0080911062001bf0575b50620019bd565b6086553862001be9565b6200199d9062001981565b9062001c4c9203600c811160001462001c55575062001c41600c915b670de0b6b3a76400009261ffff816103e80a9260801c160a830262004833565b906086540262004833565b608655620019a1565b62001c41909162001c21565b505080929394959697989950620019639162004825565b604051635acfba9d60e11b8152600490fd5b604051638a0704d360e01b8152600490fd5b50346200037757806003193601126200037757602060845460c01c604051908152f35b503462000377576020366003190112620003775760209063ffffffff906040906001600160401b0362001cf162003a51565b16815260838452205416604051908152f35b5034620003775760c0366003190112620003775762001d6362001d789162001d2a62003a0f565b9062001d3562003a23565b9063ffffffff62001d4562003a3a565b93168152608160205260a43592608435926040606435932062004ceb565b60405191829160208352602083019062003bf4565b0390f35b503462000377576020366003190112620003775762001d9a62003a0f565b3360009081527fd26c1f3d72948c9f5ca2b28d010847694e18f81d42613c046515d0839b64354c602052604090205460ff1615620005a25763ffffffff80911690811590811562001e44575b5062000a2d57808252607f602052600160408320018054600160ff8260e81c1615151462000a1b5760ff60e81b1916600160e81b1790557f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e448280a280f35b9050607e541681113862001de6565b5034620003775760203660031901126200037757604060c09163ffffffff62001e7b62003a0f565b168152607f6020522060018060a01b0360ff818354169260026001820154910154926040519485528116602085015260018060401b038160a01c166040850152818160e01c16606085015260e81c161515608083015260a0820152f35b503462000377578060031936011262000377576086549060648202918083046064149015171562001f0e57602082604051908152f35b634e487b7160e01b81526011600452602490fd5b50346200037757604036600319011262000377576002604062001f4462003a0f565b9263ffffffff62001f5462003a23565b94168152608160205220019060018060401b03166000526020526020604060002054604051908152f35b50346200037757610100366003190112620003775762001f9d62003a68565b9062001fa862003a23565b9162001fb362003a3a565b62001fbd62003a7f565b9362001fc862003a96565b9162001fd362003aad565b6001600160a01b039360c43585811694929190859003620005b45760e43598868a16809a03620005b8576101029389549060ff958287809460081c16158062002a57575b620020229062003d28565b61ffff191617808c5560858054608480546001600160c01b031660c09b909b1b6001600160c01b0319169a909a1790995567016345785d8a00006086556001600160801b03199098166001600160401b039283161760e160431b1761ffff60801b19166101f560811b179097559560081c1615620029fe576000805160206200588483398151915291828a52603492602099848b528960408d20911690816000528b52866040600020541615620029c1575b50508980528289528760408b2091169081600052895284604060002054161562002985575b60008051602062005724833981519152808b52838a5260408b20826000528a5285604060002054161562002948575b50600080516020620057c4833981519152808b52838a5260408b20826000528a528560406000205416156200290b575b50600080516020620056a483398151915290818b52838a5260408b20816000528a52856040600020541615620028ce575b505060008051602062005704833981519152808a528289528760408b2092169182600052895284604060002054161562002891575b5060008051602062005864833981519152808a5282895260408a2082600052895284604060002054161562002854575b5060008051602062005744833981519152808a5282895260408a2082600052895284604060002054161562002817575b5060008051602062005804833981519152808a5282895260408a20826000528952846040600020541615620027da575b506200225962004f18565b60008051602062005664833981519152808a5282895260408a208260005289528460406000205416156200279d575b50600080516020620056e483398151915290818a5282895260408a2081600052895284604060002054161562002760575b5050620022c562004f66565b600080516020620058448339815191528089528188528660408a2093169283600052885283604060002054161562002723575b506000805160206200582483398151915292838952818852604089208360005288526040600020541615620026e6575b5050506080549063ffffffff6200234181841662003db5565b16918263ffffffff198092161760805561044d90816000526083875260406000208482825416179055846000526082875283604060002091825416179055826000526081865260406000209283548560019a8b870163ffffffff60e01b91600560a01b90838354161717905561044d60a01b921617178455600080516020620057a48339815191526080600786019360ff821b1985541685556040519060058252888b830152604082015260006060820152a28160735460401c1692826074541690818503620026d457600690828a526075895260408a205483600052600282018a52604060002055858a526072895260408a2086600052600382018a52604060002090868d8284036200269f575b505050500180546001600160401b031990811686178255906200247590839062003d8c565b82541617905583607a541693606f5460581c16918652607285526040862054906073541691833b1562000a57576040519463176b20e160e31b86526004860152602485015260c0604485015260009660765480821c90828116801562002694575b888310811462002680578260c489015290816000146200266157506001146200261f575b506003198589030160648601526000976077549182811c92818116801562002614575b89851081146200260057848452908115620025e25750600114620025a4575b505050918386818199819583999a97608484015260a483015203925af18015620009db576200258c575b50600080516020620057848339815191528261ff0019835416835560405160028152a180f35b620025979062003c1b565b6200175557813862002566565b92985090607760005286600020926000935b828510620025ce57505050018401958386816200253c565b80548486018a0152938801938101620025b6565b60ff1916838a0152505090151560051b01850196508386816200253c565b634e487b7160e01b8c52602260045260248cfd5b93607f16936200251d565b90975060766000528560002086896000925b8484106200264b5750505060e491508501019638620024fa565b805460e4858b0101520191019089889162002631565b905060e492995060ff191682870152151560051b8501019638620024fa565b634e487b7160e01b8b52602260045260248bfd5b91607f1691620024d6565b80620026ca94845481550192018181541660018060401b03198454161783555460401c169062003d8c565b3880868d62002450565b604051632e4cc54360e11b8152600490fd5b8288528652604087208160005286526040600020600160ff198254161790553391600080516020620056448339815191528880a438808062002328565b808952818852604089208360005288526040600020600160ff19825416179055823391600080516020620056448339815191528b80a438620022f8565b818a5282895260408a208160005289526040600020600160ff198254161790553391600080516020620056448339815191528b80a43880620022b9565b808a5282895260408a208260005289526040600020600160ff19825416179055813391600080516020620056448339815191528c80a43862002288565b808a5282895260408a208260005289526040600020600160ff19825416179055813391600080516020620056448339815191528c80a4386200224e565b808a5282895260408a208260005289526040600020600160ff19825416179055813391600080516020620056448339815191528c80a4386200221e565b808a5282895260408a208260005289526040600020600160ff19825416179055813391600080516020620056448339815191528c80a438620021ee565b808a5282895260408a208260005289526040600020600160ff19825416179055813391600080516020620056448339815191528c80a438620021be565b818b52838a5260408b20816000528a526040600020600160ff198254161790553391600080516020620056448339815191528c80a4388062002189565b808b52838a5260408b20826000528a526040600020600160ff19825416179055813391600080516020620056448339815191528d80a43862002158565b808b52838a5260408b20826000528a526040600020600160ff19825416179055813391600080516020620056448339815191528d80a43862002128565b89805282895260408a208160005289526040600020600160ff1982541617905533818b600080516020620056448339815191528180a4620020f9565b818c52848b5260408c20816000528b526040600020600160ff198254161790553391600080516020620056448339815191528d80a43880620020d4565b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b5060028185161062002017565b503462000377578060031936011262000377576020608654604051908152f35b503462000377576020366003190112620003775762002aa262003a51565b62002aac62004eb9565b60ff606f54161562002b11575b608480546001600160c01b031660c083901b6001600160c01b0319161790556040516001600160401b0390911681527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602090a180f35b60845460c01c6001600160401b0382161062002ab95760405163401636df60e01b8152600490fd5b503462000377576040366003190112620003775762002b5762003ac4565b336001600160a01b0382160362002b765762000da69060043562004fb4565b604051630b4ad1cd60e31b8152600490fd5b503462000377576040366003190112620003775760043562002ba962003ac4565b818352603460205262002bc3600160408520015462004ef3565b8183526034602052604083209060018060a01b0316908160005260205260ff604060002054161562002bf3578280f35b818352603460205260408320816000526020526040600020600160ff198254161790553391600080516020620056448339815191528480a438808280f35b50346200037757604036600319011262000377576060906003604062002c5662003a0f565b9263ffffffff62002c6662003a23565b948284805162002c768162003c2f565b82815282602082015201521681526081602052200160018060401b0380921660005260205260406000209060405162002caf8162003c2f565b81600184549485845201549181604060208301928286168452019360401c1683526040519485525116602084015251166040820152f35b503462000377576020366003190112620003775760016040602092600435815260348452200154604051908152f35b503462000377578060031936011262000377576000805160206200584483398151915281526034602052604081203360005260205260ff604060002054161562002d64575b62000da662004854565b60845460801c6001600160401b0390811662093a80019080821162002d9f57429116111562002d5a5760405163692baaad60e11b8152600490fd5b634e487b7160e01b600052601160045260246000fd5b503462000377576020366003190112620003775760043561ffff81169081810362000bf75762002de462004eb9565b6103e88210801562002e56575b62002e44576085805461ffff60801b191660809290921b61ffff60801b169190911790556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c590602090a180f35b604051630984a67960e31b8152600490fd5b506103ff821162002df1565b50346200037757806003193601126200037757602063ffffffff607e5416604051908152f35b503462000377576040366003190112620003775762002ea662003a0f565b63ffffffff62002eb562003a23565b91168252608160205260408220906000805160206200588483398151915283526034602052604083203360005260205260ff604060002054161562002f00575b62000da6916200444d565b60ff606f5416620015cf5762002f17818362004be6565b62002ef557604051630674f25160e11b8152600490fd5b50346200037757806003193601126200037757602060ff606f54166040519015158152f35b5034620003775762002f9c63ffffffff62002f6e3662003b51565b928481979699849962002f869c979c95949562004e7f565b16998a8d52608160205260408d20978862003eb8565b600681019062002fad868362003d8c565b82600560018060401b0392838916600052600281016020528660406000205501558154908160801c1662003097575b508590507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166200301462004970565b813b1562000bf75782916024839260405194859384926333d6247d60e01b845260048401525af18015620009db576200307f575b50507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39162001aac60405192839233978462003e45565b6200308a9062003c1b565b6200113757843862003048565b6001600160801b03169055388062002fdc565b50346200037757620030f263ffffffff620030c53662003adb565b92809599948297998499620030dc95949562004e7f565b169a8b8d52608160205260408d209a8b620045eb565b600684019062003103818362003d8c565b83600560018060401b0380931696878a52600281016020528560408b205501558154908160801c166200321a575b508590507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166200316962004970565b90803b1562000bf7576024839260405194859384926333d6247d60e01b845260048401525af180156200320f57620031e3575b50608480546001600160c01b031661127560c71b179055604080519384526020840191909152820152336060820152600080516020620056c483398151915290608090a280f35b91600080516020620056c48339815191529391956200320460809462003c1b565b95919350916200319c565b6040513d88823e3d90fd5b6001600160801b03169055388062003131565b503462000377576020366003190112620003775762003267604060209263ffffffff6200325962003a0f565b168152608184522062004ba9565b6040516001600160401b039091168152f35b5034620003775760c036600319011262000377576200329762003a68565b620032a162003a23565b620032ab62003a3a565b90610102620032b962003a7f565b92620032c462003a96565b92620032cf62003aad565b9187549160ff948386809560081c1615806200395e575b620032f19062003d28565b61ffff191617808a5560858054608480546001600160c01b031660c09690961b6001600160c01b0319169590951790945567016345785d8a00006086556001600160801b03199093166001600160401b039092169190911760e160431b1761ffff60801b19166101f560811b1790915560081c1615620029fe576000805160206200578483398151915294600080516020620058848339815191529485885260349460209686885260408a2060018060a01b0380951690818c5289528660408c2054161562003924575b50508880528587528260408a20911690818a5287528460408a20541615620038eb575b60008051602062005724833981519152808a5286885260408a20828b5288528560408b20541615620038b0575b50600080516020620057c4833981519152808a5286885260408a20828b5288528560408b2054161562003875575b50600080516020620056a483398151915290818a5286885260408a20818b5288528560408b205416156200383b575b5050600080516020620057048339815191528089528587528260408a20921691828a5287528460408a2054161562003800575b506000805160206200586483398151915280895285875260408920828a5287528460408a20541615620037c5575b506000805160206200574483398151915280895285875260408920828a5287528460408a205416156200378a575b506000805160206200580483398151915280895285875260408920828a5287528460408a205416156200374f575b506200353062004f18565b6000805160206200566483398151915280895285875260408920828a5287528460408a2054161562003714575b50600080516020620056e48339815191529081895285875260408920818a5287528460408a20541615620036da575b50506200359862004f66565b600080516020620058448339815191529081885284865260408820921691828852855282604088205416156200369f575b506000805160206200582483398151915290818752838552604087208188528552826040882054161562003665575b5050848052818352604085203386528352604085205416156200362b575b50825461ff001916835560405160028152a180f35b838052815260408320338452815260408320600160ff19825416179055333384600080516020620056448339815191528180a43862003616565b818752838552604080882082895286528720805460ff191660011790553391600080516020620056448339815191528880a43880620035f8565b80875283855260408720828852855260408720600160ff19825416179055813391600080516020620056448339815191528980a438620035c9565b8189528587526040808a20828b5288528920805460ff191660011790553391600080516020620056448339815191528a80a438806200358c565b80895285875260408920828a52875260408920600160ff19825416179055813391600080516020620056448339815191528b80a4386200355d565b80895285875260408920828a52875260408920600160ff19825416179055813391600080516020620056448339815191528b80a43862003525565b80895285875260408920828a52875260408920600160ff19825416179055813391600080516020620056448339815191528b80a438620034f7565b80895285875260408920828a52875260408920600160ff19825416179055813391600080516020620056448339815191528b80a438620034c9565b80895285875260408920828a52875260408920600160ff19825416179055813391600080516020620056448339815191528b80a4386200349b565b818a528688526040808b20828c5289528a20805460ff191660011790553391600080516020620056448339815191528b80a4388062003468565b808a5286885260408a20828b52885260408a20600160ff19825416179055813391600080516020620056448339815191528c80a43862003439565b808a5286885260408a20828b52885260408a20600160ff19825416179055813391600080516020620056448339815191528c80a4386200340b565b8880528587526040808a20828b5288528920805460ff1916600117905533818a600080516020620056448339815191528180a4620033de565b818b528789526040808c20828d528a528b20805460ff191660011790553391600080516020620056448339815191528c80a43880620033bb565b50600281861610620032e6565b503462000377578060031936011262000377576085546040805191901c6001600160401b03168152602090f35b5034620003775760403660031901126200037757620039de6020916040620039bf62003a0f565b9163ffffffff620039cf62003a23565b93168152608185522062004be6565b6040519015158152f35b90503462001755578160031936011262001755576084546001600160401b03168152602090f35b6004359063ffffffff82168203620005b857565b602435906001600160401b0382168203620005b857565b604435906001600160401b0382168203620005b857565b600435906001600160401b0382168203620005b857565b600435906001600160a01b0382168203620005b857565b606435906001600160a01b0382168203620005b857565b608435906001600160a01b0382168203620005b857565b60a435906001600160a01b0382168203620005b857565b602435906001600160a01b0382168203620005b857565b6103e0600319820112620005b85760043563ffffffff81168103620005b857916001600160401b036024358181168103620005b857926044358281168103620005b857926064358381168103620005b857926084359081168103620005b8579160a4359160c435916103e411620005b85760e490565b6103e0600319820112620005b85760043563ffffffff81168103620005b857916001600160401b03906024358281168103620005b857926044358381168103620005b857926064359081168103620005b857916084359160a4359160c4356001600160a01b0381168103620005b857916103e411620005b85760e490565b60005b83811062003be35750506000910152565b818101518382015260200162003bd2565b9060209162003c0f8151809281855285808601910162003bcf565b601f01601f1916010190565b6001600160401b0381116200058c57604052565b606081019081106001600160401b038211176200058c57604052565b608081019081106001600160401b038211176200058c57604052565b602081019081106001600160401b038211176200058c57604052565b601f909101601f19168101906001600160401b038211908210176200058c57604052565b6001600160401b0381116200058c5760051b60200190565b6001600160401b0381116200058c57601f01601f191660200190565b81601f82011215620005b85780359062003cf58262003cbf565b9262003d05604051948562003c83565b82845260208383010111620005b857816000926020809301838601378301015290565b1562003d3057565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b8054600160401b600160801b03191660409290921b600160401b600160801b0316919091179055565b63ffffffff80911690811462002d9f5760010190565b8054600160a01b600160e01b03191660a09290921b600160a01b600160e01b0316919091179055565b805460ff60801b191660809290921b60ff60801b16919091179055565b6001600160401b03918216908216019190821162002d9f57565b6001600160401b03918216908216039190821162002d9f57565b6040919493926060820195600180851b0316825260208201520152565b90816020910312620005b857518015158103620005b85790565b9291906103208401936103008092823701906000915b6001831062003ea057505050565b60019082518152602080910192019201919062003e92565b929591969390949660009162003ece8562004ba9565b60078601546001600160401b038085169990959294929186168a10620042eb578516908115620042a5575084600688015460801c1681116200429357600052600486016020526040600020978460028a0154995460401c160362004281575b838916978484168911156200426f5762003f4b928a8c938962004ceb565b9060409788519260008480835162003f6a816020998a80980162003bcf565b8101039060025afa15620042645760005160018701548a516001600160a01b039962003fd19387938c16919060008051602062005764833981519152900662003fb38462003c67565b83528d51809581948293634890ed4560e11b84526004840162003e7c565b03915afa908115620042595760009162004225575b501562004214579062003ff99162003e2b565b926200400462004c1a565b8385169081810291818304149015171562002d9f57885190878483019363a9059cbb60e01b8552166024830152604482015260448152620040458162003c4b565b867f0000000000000000000000000000000000000000000000000000000000000000168951918a8301838110878211176200058c578b528483527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648386015251620040e593600091829182855af13d156200420b573d91620040c78362003cbf565b92620040d68d51948562003c83565b83523d60008785013e620042fd565b8051908162004195575b505060845492600160401b600160801b039262004111925084891c1662003e11565b600160401b600160c01b031990921691861b16174260801b600160801b600160c01b031617608455541692833b15620005b857606460009283855196879485936332c2d15360e01b8552600485015260248401523360448401525af19081156200418b57506200417e5750565b620041899062003c1b565b565b513d6000823e3d90fd5b8280620041a793830101910162003e62565b15620041b5578080620040ef565b60849087519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152fd5b606091620042fd565b88516309bde33960e01b8152600490fd5b6200424a9150843d861162004251575b62004241818362003c83565b81019062003e62565b3862003fe6565b503d62004235565b8a513d6000823e3d90fd5b88513d6000823e3d90fd5b60405163b9b18f5760e01b8152600490fd5b604051632bd2e3e760e01b8152600490fd5b60405163bb14c20560e01b8152600490fd5b60409150898152600288016020522054978815620042d957848416101562003f2d57604051630f2b74f160e11b8152600490fd5b6040516324cbdcc360e11b8152600490fd5b60405163ead1340b60e01b8152600490fd5b9192901562004362575081511562004313575090565b3b156200431d5790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b825190915015620043765750805190602001fd5b60405162461bcd60e51b8152602060048201529081906200439c90602483019062003bf4565b0390fd5b60068101546001600160401b0390608081901c82169060c01c808211620043c8575b50505050565b60010191821162002d9f57620043df828462004be6565b620043ec575b80620043c2565b620044129060016001603f1b03906200440790849062003e2b565b60011c168262003e11565b906200441f828462004be6565b156200443a575062004431916200444d565b388080620043e5565b905062004447916200444d565b62004431565b6006810180546001600160401b03939192848316929160009060c081901c85118015918891620045db575b5050620045c95783815260048201602052604091828220968754841c1695620044a2878262003d8c565b60028881018054898652918401602052858520919091556001989098018054600584015581546001600160c01b031660c09690961b6001600160c01b0319169590951790556001600160a01b03907f000000000000000000000000000000000000000000000000000000000000000082166200451d62004970565b813b156200113757849160248392885194859384926333d6247d60e01b845260048401525af18015620045bf5793859363ffffffff9360809997937f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b9b9997620045a9575b505416815260826020522054169654915491815194855260208501528301526060820152a2565b620045b79093919362003c1b565b913862004582565b85513d86823e3d90fd5b60405163d086b70b60e01b8152600490fd5b60801c1685119050863862004478565b91929394969060009760018060401b039889600786015416928a8816938410620042eb578a16908115620047eb575089600686015460801c168111620042935780600052600485016020526040600020928a6002850154945460401c160362004281575b8960068601549616958a8160801c168711918215620047df575b508115620047d0575b50620047be5760048401968560005260209688885260409a808c600020548d1c1690831603620047ad57898894600094620046c694620046b3948a62004ceb565b838b519282848094519384920162003bcf565b8101039060025afa15620047a25760005160019092015487516200472e93869391926001600160a01b03169190600080516020620057648339815191529006620047108462003c67565b83528951809581948293634890ed4560e11b84526004840162003e7c565b03915afa908115620047a25760009162004780575b50156200476f57600052526002826000200154146200475f5750565b5163a47276bd60e01b8152600490fd5b84516309bde33960e01b8152600490fd5b6200479b9150833d8511620042515762004241818362003c83565b3862004743565b86513d6000823e3d90fd5b8a516332a2a77f60e01b8152600490fd5b60405163bfa7079f60e01b8152600490fd5b905060c01c8511153862004672565b87111591503862004669565b808460409252600287016020522054928315620042d9578a600687015460401c1610156200464f57604051630f2b74f160e11b8152600490fd5b9190820391821162002d9f57565b81156200483e570490565b634e487b7160e01b600052601260045260246000fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15620005b8576040518091632072f6c560e01b82528160046000948580945af18015620009db57620048eb575b50606f549060ff8216620015cf5760017f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a54979260ff191617606f5580a1565b620048f69062003c1b565b38620048ad565b90620049098262003ca7565b62004918604051918262003c83565b82815280926200492b601f199162003ca7565b0190602036910137565b600019811462002d9f5760010190565b80518210156200495a5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b63ffffffff8060805416801562004ba2576200498c81620048fd565b9160005b82811062004b6b5750509060006020915b60019081851462004af3578185811c95169182860180961162002d9f57620049c986620048fd565b9160009160001994858901898111945b8a811062004a1c5750505050505093916040805190602082019280845281830152815262004a078162003c2f565b51902092801562002d9f5701919092620049a1565b8562002d9f578181148062004ae9575b1562004a905780841b908082046002148115171562002d9f5762004a5562004a8a928762004945565b516040805190602082019283528c81830152815262004a748162003c2f565b51902062004a83828a62004945565b5262004935565b620049d9565b80841b908082046002148115171562002d9f5762004aaf828762004945565b5185830180931162002d9f5762004acb62004a8a938862004945565b5160408051916020830193845281830152815262004a748162003c2f565b5083831462004a2c565b919350508051156200495a5760200151916000905b82821062004b165750505090565b62004b6490604094855160208101918252828782015286815262004b3a8162003c2f565b51902094805190602082019280845281830152815262004b5a8162003c2f565b5190209162004935565b9062004b08565b600181019081811162002d9f578262004b9c9216600052608160205260056040600020015462004a83828762004945565b62004990565b5050600090565b60068101546001600160401b0391608082901c8316801562004bdd57600492506000520160205260406000205460401c1690565b505060401c1690565b60049060018060401b038093166000520160205262004c12816040600020541682608554169062003e11565b429116111590565b6040516370a0823160e01b81523060048201526020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811562004cdf5760009162004ca8575b506084546001600160401b039062004c9290604081901c831690831662003e2b565b16801562004ba25762004ca59162004833565b90565b906020823d821162004cd6575b8162004cc46020938362003c83565b81010312620003775750513862004c70565b3d915062004cb5565b6040513d6000823e3d90fd5b929390949160018060401b03948587166000948186526003870160205260409687872054998986168852888820549315158062004e05575b62004df457831562004de35762004d3a8362004e0e565b1562004dd2579060749160018254920154918a519c8d993360601b60208c015260348b015260548a015260018060c01b031998899485809460c01b1691015260201b16607c8c015260201b1660848a0152608c89015260ac88015260cc87015260c01b1660ec85015260d484526101008401928484109084111762004dbe57505290565b634e487b7160e01b81526041600452602490fd5b88516305dae44f60e21b8152600490fd5b88516366385b5160e01b8152600490fd5b885163340c614f60e11b8152600490fd5b508a1562004d23565b67ffffffff000000016001600160401b03828116821192908362004e6e575b8362004e5c575b508262004e4e575b50501562004e4957600190565b600090565b60c01c109050388062004e3c565b818392945060801c1610913862004e34565b925081838260401c16109262004e2d565b3360009081527fc17b14a573f65366cdad721c7c0a0f76536bb4a86b935cdac44610e4f010b52a602052604090205460ff1615620005a257565b3360009081527f3b72b60ab7bcf7b6e5f79e30b28eb2a39d66a2a278905c2bfcfdd4e1c0a1907b602052604090205460ff1615620005a257565b600052603460205260406000203360005260205260ff6040600020541615620005a257565b600080516020620058848339815191528060005260346020526001604060002001908154906000805160206200566483398151915280935560008051602062005684833981519152600080a4565b600080516020620058448339815191528060005260346020526001604060002001908154906000805160206200582483398151915280935560008051602062005684833981519152600080a4565b906000918083526034602052604083209160018060a01b03169182845260205260ff60408420541662004fe657505050565b8083526034602052604083208284526020526040832060ff1981541690557ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b339380a456fe604060a08152610618803803806100158161023b565b92833981016060828203126102365761002d82610276565b9060209161003c838501610276565b8585015190946001600160401b038211610236570182601f820112156102365780519061007061006b8361028a565b61023b565b9382855285838301011161023657849060005b83811061022257505060009184010152803b15610201577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b03199081166001600160a01b038481169182179093558751929691948794929390917fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a28151156101e0575090600080838861014695519101845af43d156101d8573d9161013761006b8461028a565b9283523d60008985013e6102a5565b505b8060805216917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f857fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103958587549483519286168352820152a182156101c057161790555161030f9081610309823960805181600f0152f35b8451633173bdd160e11b815260006004820152602490fd5b6060916102a5565b9293505050346101f257508390610148565b63b398979f60e01b8152600490fd5b8451634c9c8ce360e01b81526001600160a01b039091166004820152602490fd5b818101830151868201840152869201610083565b600080fd5b6040519190601f01601f191682016001600160401b0381118382101761026057604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b038216820361023657565b6001600160401b03811161026057601f01601f191660200190565b906102cc57508051156102ba57805190602001fd5b604051630a12f52160e11b8152600490fd5b815115806102ff575b6102dd575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b156102d556fe60806040526001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216036100df5760009081356001600160e01b03191663278f794360e11b141582036100df57366004116100db5760403660031901126100db576004359081168091036100db57602435906001600160401b0382116100d757366023830112156100d75781600401356100a86100a382610159565b61012f565b9281845236602483830101116100d357816100d195926024602093018387013784010152610174565b005b8480fd5b8280fd5b5080fd5b6000805160206102ba83398151915254600090819081906001600160a01b0316368280378136915af43d82803e15610115573d90f35b3d90fd5b634e487b7160e01b600052604160045260246000fd5b6040519190601f01601f191682016001600160401b0381118382101761015457604052565b610119565b6001600160401b03811161015457601f01601f191660200190565b90813b156101fa576000805160206102ba83398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a28051156101df576101dc9161021b565b50565b5050346101e857565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60008061024f93602081519101845af43d15610252573d9161023f6100a384610159565b9283523d6000602085013e610256565b90565b6060915b9061027d575080511561026b57805190602001fd5b604051630a12f52160e11b8152600490fd5b815115806102b0575b61028e575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b1561028656fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca264697066735822122066cbe29d5f5d924e31dcec6cf36e6701a714177c1368e4ed6d1bf766b15eb2a464736f6c634300081400332f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f0bd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024981c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68eaac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b4a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220a3c1fae9e6cb0e6566da09e533a165ecacaf5e202a1a2482f89015ba8d94194b64736f6c63430008140033", + "deployedBytecode": "0x60808060405260043610156200001457600080fd5b600090813560e01c908163066ec01214620039e857508063080b311114620039985780630a0d9fbe146200396b5780630e36f582146200327957806311f6b287146200322d57806312b86e1914620030aa5780631489ed101462002f5357806315064c961462002f2e5780631608859c1462002e885780631796a1ae1462002e625780631816b7e51462002db55780632072f6c51462002d15578063248a9ca31462002ce6578063252801691462002c315780632f2ff15d1462002b8857806336568abe1462002b39578063394218e91462002a84578063477fa2701462002a645780634d4d33381462001f7e57806355a71ee01462001f22578063604691691462001ed857806365c0504d1462001e535780637222020f1462001d7c5780637975fcfe1462001d035780637fb6e76a1462001cbf578063841b24d71462001c9c57806387c20c0114620017ef5780638bd4f07114620017595780638f698ec5146200165057806391d14854146200160057806399f5634e14620015e15780639a908e7314620014775780639c9f3dfe14620013cc578063a066215c146200132a578063a217fddf146200130c578063a2967d9914620012e5578063a3c573eb146200129e578063afd23cbe1462001277578063b99d0ad714620011ae578063c1acbc34146200117f578063c4c928c21462000eef578063ceee281d1462000eab578063d02103ca1462000e64578063d5073f6f1462000da9578063d547741f1462000d60578063d939b3151462000d35578063dbc169761462000c28578063dde0ff771462000bfb578063e0bfd3d21462000a5b578063e136edf71462000604578063e46761c414620005bd578063f34eb8eb14620003a0578063f4e92675146200037a5763f9c4c2ae14620002aa57600080fd5b3462000377576020366003190112620003775760406101809163ffffffff620002d262003a0f565b16815260816020522060ff815491600181015460058201549160076006820154910154926040519560018060a01b0393848216885260018060401b039485809360a01c1660208a01528116604089015260a01c166060870152608086015281811660a0860152818160401c1660c0860152818160801c1660e086015260c01c6101008501528082166101208501528160401c1661014084015260801c16610160820152f35b80fd5b50346200037757806003193601126200037757602063ffffffff60805416604051908152f35b5034620003775760c03660031901126200037757620003be62003a68565b620003c862003ac4565b90620003d362003a3a565b906064359160ff8316809303620005b8576001600160401b03926084359060a435858111620005b4576200040c90369060040162003cdb565b3360009081527fb3124b64d0942b276d75ea451f4dd8b83bf9442b427f9eb873ac771c92e65f02602052604090205490939060ff1615620005a257607e549663ffffffff6200045d818a1662003db5565b16809863ffffffff191617607e556040519060c0820190828210898311176200058c5789916040528a600160a01b6001900380991698898552806020860193169a8b84528060408701971696878152606087019289845280608089019580875260a08a01988d8a528152607f6020526040902098511690600160a01b600190031991828a54161789556001890196511690865416178555511662000502908462003dcb565b519082549060ff60e81b9051151560e81b169160ff60e01b9060e01b169061ffff60e01b1916171790555190600201556040519586958652602086015260408501526060840152608083015260a0820160c0905260c08201620005659162003bf4565b037fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5291a280f35b634e487b7160e01b600052604160045260246000fd5b604051637615be1f60e11b8152600490fd5b8780fd5b600080fd5b503462000377578060031936011262000377576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5034620003775761010036600319011262000377576200062362003a0f565b906200062e62003a23565b916044356001600160a01b0381168103620005b8576200064d62003a7f565b6200065762003a96565b9060a4359063ffffffff82168203620005b85760c4356001600160401b03811162000a57576200068c90369060040162003cdb565b916001600160401b0360e4351162000a5757620006af3660e43560040162003cdb565b3360009081527f41902c3bd358ff4b85ee46864bd81ee453a1b3cfd703a58950be8d28ae030661602052604090205490959060ff1615620005a25763ffffffff871615801562000a3f575b62000a2d5763ffffffff87168852607f6020526040882093600160ff8187015460e81c1615151462000a1b576001600160401b038a1689526083602052604089205463ffffffff1662000a09576080549563ffffffff6200075d81891662003db5565b1663ffffffff1997909716871760805585546040519b906001600160a01b0316620007888d62003c67565b8b8d52604051906001600160401b03610618830190811190831117620009f557620007d88d9e83926106186200502c85396106188401908152306020820152606060408201819052019062003bf4565b03908cf0968715620009ea5788927f9a84992ead4481f37097c7663e97ed883b31f216fae5685c6ee576a656483cd992620008e48d8f600160a096620008d78f600763ffffffff9160ff968e878060401b038c16825260836020526040822081861982541617905587808f1b038316825260826020526040822081861982541617905581526081602052604081209187808f1b031990888f81901b03168184541617835587870154906200089b898501928a8060401b039060a01c168362003dcb565b888f81901b03898901541690825416179055620008b98b8362003dcb565b60406002870154918080526002840160205220550195168562003d8c565b015460e01c169062003df4565b63ffffffff6040519d168d528c6020600180861b038c1691015260018060401b031660408d0152600180831b03169a8b606082015263ffffffff87166080820152a26001600160a01b0385163b15620009e657889662000999620009ac9263ffffffff8a966040519c8d9b8c9a8b996308fd7e2160e31b8b5260018060a01b031660048b015260018060a01b031660248a01526044890152606488015216608486015260e060a486015260e485019062003bf4565b8381036003190160c48501529062003bf4565b03926001600160a01b03165af18015620009db57620009c85750f35b620009d39062003c1b565b620003775780f35b6040513d84823e3d90fd5b8880fd5b6040513d8d823e3d90fd5b634e487b7160e01b8d52604160045260248dfd5b6040516337c8fe0960e11b8152600490fd5b604051633b8d3d9960e01b8152600490fd5b604051637512e5cb60e01b8152600490fd5b5063ffffffff607e541663ffffffff881611620006fa565b8680fd5b5034620003775760c036600319011262000377576004356001600160a01b038181169182900362000bf75762000a9062003ac4565b62000a9a62003a3a565b606435936001600160401b039081861690818703620005b85760a4359260ff841693848103620005b8573360009081527ff444741efd45fa05f38650e87f3d8ca01816575bed45a01e78186ae5f3bc8355602090815260409091205490999060ff1615620005a257848b5260838a5263ffffffff978860408d20541662000a09576080549862000b2c818b1662003db5565b16988963ffffffff19809216176080558660005260838c5260406000208a828254161790558560005260828c52896040600020918254161790558860005260818b52604060002099600160a01b60019003199086828d5416178c5560018c019262000b988b8562003dcb565b169082541617905562000bac908962003dcb565b62000bbb906007890162003df4565b6040519416845286840152604083015260608201526080600080516020620057a483398151915291a28280526002019052608435604082205580f35b8280fd5b503462000377578060031936011262000377576084546040805191901c6001600160401b03168152602090f35b503462000377578060031936011262000377573360009081527f307dd781c86f141a460373e0117a8033afea21c02f6121aff0f5b5553df24f4a602052604090205460ff1615620005a257807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1562000d3257818091600460405180948193636de0b4bb60e11b83525af18015620009db5762000d1a575b5050606f5460ff81161562000d085760ff1916606f557f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b38180a180f35b604051635386698160e01b8152600490fd5b62000d259062003c1b565b6200037757803862000ccb565b50fd5b503462000377578060031936011262000377576085546040516001600160401b039091168152602090f35b503462000377576040366003190112620003775762000da660043562000d8562003ac4565b90808452603460205262000da0600160408620015462004ef3565b62004fb4565b80f35b50346200037757602036600319011262000377573360009081527fe0205af17734f857fb538b40523c7cc189a1ab8f1ec33be516761c6b465766b660205260409020546004359060ff1615620005a257683635c9adc5dea000008111801562000e56575b62000e44576020817ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b292608655604051908152a180f35b604051638586952560e01b8152600490fd5b50633b9aca00811062000e0d565b503462000377578060031936011262000377576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503462000377576020366003190112620003775760209063ffffffff906040906001600160a01b0362000edd62003a68565b16815260828452205416604051908152f35b50346200037757606036600319011262000377576004356001600160a01b038181169182900362000bf75760243563ffffffff808216809203620005b8576001600160401b039260443584811162000a57573660238201121562000a5757806004013590858211620005b4573660248383010111620005b4573360009081527ff14f5a8ad59d90593602e905b358229bff5ceea677d5bf0f5a1701793550a9a6602090815260409091205490949060ff1615620005a2578515801562001171575b62000a2d57878952608285526040892054169687156200115f57878952608185526040892093600785019788549088818360401c16146200114d57888c52607f885260408c20916001830190815490600160ff8360e81c1615151462000a1b5760ff808360e01c169160801c16036200113b57600190980180546001600160a01b031916988516989098178855548c97620010519160a01c83169062003dcb565b6200105d898b62003d8c565b8a875260818852620010726040882062004ba9565b8a546001600160401b0319169116908117909955541690803b1562001137578492836064602494876040519889978896879463278f794360e11b8652600486015260408286015282604486015201848401378181018301849052601f01601f191681010301925af18015620009db576200111b575b5050907ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d926040928351928352820152a280f35b620011299093929362003c1b565b6200113757908438620010e7565b8480fd5b604051635aa0d5f160e11b8152600490fd5b604051634f61d51960e01b8152600490fd5b6040516374a086a360e01b8152600490fd5b5080607e5416861162000fb0565b5034620003775780600319360112620003775760845460405160809190911c6001600160401b03168152602090f35b50346200037757604036600319011262000377576080906040620011d162003a0f565b9163ffffffff620011e162003a23565b938260608551620011f28162003c4b565b828152826020820152828782015201521681526081602052600482822001600180841b03809416825260205220604051906200122e8262003c4b565b8054928084169384845281602085019160401c16815260606002600185015494604087019586520154940193845260405194855251166020840152516040830152516060820152f35b50346200037757806003193601126200037757602061ffff60855460801c16604051908152f35b503462000377578060031936011262000377576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5034620003775780600319360112620003775760206200130462004970565b604051908152f35b50346200037757806003193601126200037757602090604051908152f35b50346200037757602036600319011262000377576200134862003a51565b6200135262004eb9565b6001600160401b03811690620151808211620013ba5760858054600160401b600160801b031916604092831b600160401b600160801b0316179055519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602090a180f35b604051631c0cfbfd60e31b8152600490fd5b5034620003775760203660031901126200037757620013ea62003a51565b620013f462004eb9565b60ff606f5416156200144e575b608580546001600160401b0319166001600160401b0390921691821790556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602090a180f35b6085546001600160401b0390811690821610620014015760405163048a05a960e41b8152600490fd5b50346200037757604036600319011262000377576200149562003a51565b60ff606f5416620015cf573382526020916082835263ffffffff604082205416908115620015bd576001600160401b0383811615620015ab5762001574604083856200157a95526081885220916084549080620014f58882851662003e11565b169660018060401b0319978880941617608455600685018054836200151e818316948562003e11565b16998a911617905560405192620015358462003c2f565b60243584528260018b8601958242168752604081019485528b600052600389018d52604060002090518155019451169084541617835551169062003d8c565b620043a0565b7f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a2583604051848152a2604051908152f35b604051632590ccf960e01b8152600490fd5b6040516371653c1560e01b8152600490fd5b604051630bc011ff60e21b8152600490fd5b5034620003775780600319360112620003775760206200130462004c1a565b503462000377576040366003190112620003775760406200162062003ac4565b9160043581526034602052209060018060a01b0316600052602052602060ff604060002054166040519015158152f35b5034620003775760208060031936011262001755576004356001600160401b03811162000bf7573660238201121562000bf7578060040135620016938162003ca7565b92620016a3604051948562003c83565b8184528084019260249384600594851b83010191368311620005b45785849101915b83831062001744575050505063ffffffff8085511663ffffffff196080541617608055855b8551811015620017405762001700818762004945565b51600182018083116200172d57831688526081845260408820850155620017279062004935565b620016ea565b634e487b7160e01b895260116004528689fd5b8680f35b8235815291810191849101620016c5565b5080fd5b503462000377576200176b3662003adb565b60ff606f9895929698979493975416620015cf578560409784620017c6947f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a70109b8b8e63ffffffff60029c1681526081602052209889620045eb565b600180861b03166000520160205281600020549082519182526020820152a162000da662004854565b50346200037757620018013662003b51565b9060ff606f99989799969395965416620015cf5763ffffffff871688526081602052604088209860018060401b03871660005260038a016020526200185d60018060401b036001604060002001541660845460c01c9062003e11565b426001600160401b039091161162001c8a576103e86001600160401b0362001886868a62003e2b565b161162001c785784876200189d9588938d62003eb8565b620018a88662004ba9565b92958693866001600160401b03620018c1838862003e2b565b6085549391169190620018e2604085901c6001600160401b03164262004825565b9a5b6001600160401b038181169083161462001c61576001600160401b038181166000908152600388016020526040902060010154919082168d101562001936575060401c6001600160401b0316620018e4565b9250506200196392939495969798999a506200195a9060018060401b039262003e2b565b16809262004825565b918183101562001c05575003600c81111562001bfa57506200199d600c5b6086548161ffff60855460801c160a02906103e80a9062004833565b6086555b608654683635c9adc5dea00000908181111562001bd957506086555b6085546001600160401b031662001add578160056006830192620019e2878562003d8c565b60018060401b03871660005260028101602052856040600020550155805460018060401b038160801c1662001aca575b508590507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031662001a4a62004970565b813b1562000bf75782916024839260405194859384926333d6247d60e01b845260048401525af18015620009db5762001ab2575b5050600080516020620057e4833981519152915b62001aac60405192839263ffffffff339816968462003e45565b0390a380f35b62001abd9062003c1b565b6200113757843862001a7e565b6001600160801b03169055388062001a12565b62001aeb81939293620043a0565b6006810180546001600160401b03608082901c811690811462001bc557600160801b600160c01b0319909116600190910160801b600160801b600160c01b03161790819055604051600080516020620057e4833981519152949392909160029162001b568462003c4b565b426001600160401b039081168552888116602080870191825260408781018a8152606089018a815260809790971c85168f526004959095019091528c20955186546001600160401b0319169083161786555162001bb591168562003d8c565b5160018401555191015562001a92565b634e487b7160e01b89526011600452602489fd5b9050633b9aca0080911062001bf0575b50620019bd565b6086553862001be9565b6200199d9062001981565b9062001c4c9203600c811160001462001c55575062001c41600c915b670de0b6b3a76400009261ffff816103e80a9260801c160a830262004833565b906086540262004833565b608655620019a1565b62001c41909162001c21565b505080929394959697989950620019639162004825565b604051635acfba9d60e11b8152600490fd5b604051638a0704d360e01b8152600490fd5b50346200037757806003193601126200037757602060845460c01c604051908152f35b503462000377576020366003190112620003775760209063ffffffff906040906001600160401b0362001cf162003a51565b16815260838452205416604051908152f35b5034620003775760c0366003190112620003775762001d6362001d789162001d2a62003a0f565b9062001d3562003a23565b9063ffffffff62001d4562003a3a565b93168152608160205260a43592608435926040606435932062004ceb565b60405191829160208352602083019062003bf4565b0390f35b503462000377576020366003190112620003775762001d9a62003a0f565b3360009081527fd26c1f3d72948c9f5ca2b28d010847694e18f81d42613c046515d0839b64354c602052604090205460ff1615620005a25763ffffffff80911690811590811562001e44575b5062000a2d57808252607f602052600160408320018054600160ff8260e81c1615151462000a1b5760ff60e81b1916600160e81b1790557f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e448280a280f35b9050607e541681113862001de6565b5034620003775760203660031901126200037757604060c09163ffffffff62001e7b62003a0f565b168152607f6020522060018060a01b0360ff818354169260026001820154910154926040519485528116602085015260018060401b038160a01c166040850152818160e01c16606085015260e81c161515608083015260a0820152f35b503462000377578060031936011262000377576086549060648202918083046064149015171562001f0e57602082604051908152f35b634e487b7160e01b81526011600452602490fd5b50346200037757604036600319011262000377576002604062001f4462003a0f565b9263ffffffff62001f5462003a23565b94168152608160205220019060018060401b03166000526020526020604060002054604051908152f35b50346200037757610100366003190112620003775762001f9d62003a68565b9062001fa862003a23565b9162001fb362003a3a565b62001fbd62003a7f565b9362001fc862003a96565b9162001fd362003aad565b6001600160a01b039360c43585811694929190859003620005b45760e43598868a16809a03620005b8576101029389549060ff958287809460081c16158062002a57575b620020229062003d28565b61ffff191617808c5560858054608480546001600160c01b031660c09b909b1b6001600160c01b0319169a909a1790995567016345785d8a00006086556001600160801b03199098166001600160401b039283161760e160431b1761ffff60801b19166101f560811b179097559560081c1615620029fe576000805160206200588483398151915291828a52603492602099848b528960408d20911690816000528b52866040600020541615620029c1575b50508980528289528760408b2091169081600052895284604060002054161562002985575b60008051602062005724833981519152808b52838a5260408b20826000528a5285604060002054161562002948575b50600080516020620057c4833981519152808b52838a5260408b20826000528a528560406000205416156200290b575b50600080516020620056a483398151915290818b52838a5260408b20816000528a52856040600020541615620028ce575b505060008051602062005704833981519152808a528289528760408b2092169182600052895284604060002054161562002891575b5060008051602062005864833981519152808a5282895260408a2082600052895284604060002054161562002854575b5060008051602062005744833981519152808a5282895260408a2082600052895284604060002054161562002817575b5060008051602062005804833981519152808a5282895260408a20826000528952846040600020541615620027da575b506200225962004f18565b60008051602062005664833981519152808a5282895260408a208260005289528460406000205416156200279d575b50600080516020620056e483398151915290818a5282895260408a2081600052895284604060002054161562002760575b5050620022c562004f66565b600080516020620058448339815191528089528188528660408a2093169283600052885283604060002054161562002723575b506000805160206200582483398151915292838952818852604089208360005288526040600020541615620026e6575b5050506080549063ffffffff6200234181841662003db5565b16918263ffffffff198092161760805561044d90816000526083875260406000208482825416179055846000526082875283604060002091825416179055826000526081865260406000209283548560019a8b870163ffffffff60e01b91600560a01b90838354161717905561044d60a01b921617178455600080516020620057a48339815191526080600786019360ff821b1985541685556040519060058252888b830152604082015260006060820152a28160735460401c1692826074541690818503620026d457600690828a526075895260408a205483600052600282018a52604060002055858a526072895260408a2086600052600382018a52604060002090868d8284036200269f575b505050500180546001600160401b031990811686178255906200247590839062003d8c565b82541617905583607a541693606f5460581c16918652607285526040862054906073541691833b1562000a57576040519463176b20e160e31b86526004860152602485015260c0604485015260009660765480821c90828116801562002694575b888310811462002680578260c489015290816000146200266157506001146200261f575b506003198589030160648601526000976077549182811c92818116801562002614575b89851081146200260057848452908115620025e25750600114620025a4575b505050918386818199819583999a97608484015260a483015203925af18015620009db576200258c575b50600080516020620057848339815191528261ff0019835416835560405160028152a180f35b620025979062003c1b565b6200175557813862002566565b92985090607760005286600020926000935b828510620025ce57505050018401958386816200253c565b80548486018a0152938801938101620025b6565b60ff1916838a0152505090151560051b01850196508386816200253c565b634e487b7160e01b8c52602260045260248cfd5b93607f16936200251d565b90975060766000528560002086896000925b8484106200264b5750505060e491508501019638620024fa565b805460e4858b0101520191019089889162002631565b905060e492995060ff191682870152151560051b8501019638620024fa565b634e487b7160e01b8b52602260045260248bfd5b91607f1691620024d6565b80620026ca94845481550192018181541660018060401b03198454161783555460401c169062003d8c565b3880868d62002450565b604051632e4cc54360e11b8152600490fd5b8288528652604087208160005286526040600020600160ff198254161790553391600080516020620056448339815191528880a438808062002328565b808952818852604089208360005288526040600020600160ff19825416179055823391600080516020620056448339815191528b80a438620022f8565b818a5282895260408a208160005289526040600020600160ff198254161790553391600080516020620056448339815191528b80a43880620022b9565b808a5282895260408a208260005289526040600020600160ff19825416179055813391600080516020620056448339815191528c80a43862002288565b808a5282895260408a208260005289526040600020600160ff19825416179055813391600080516020620056448339815191528c80a4386200224e565b808a5282895260408a208260005289526040600020600160ff19825416179055813391600080516020620056448339815191528c80a4386200221e565b808a5282895260408a208260005289526040600020600160ff19825416179055813391600080516020620056448339815191528c80a438620021ee565b808a5282895260408a208260005289526040600020600160ff19825416179055813391600080516020620056448339815191528c80a438620021be565b818b52838a5260408b20816000528a526040600020600160ff198254161790553391600080516020620056448339815191528c80a4388062002189565b808b52838a5260408b20826000528a526040600020600160ff19825416179055813391600080516020620056448339815191528d80a43862002158565b808b52838a5260408b20826000528a526040600020600160ff19825416179055813391600080516020620056448339815191528d80a43862002128565b89805282895260408a208160005289526040600020600160ff1982541617905533818b600080516020620056448339815191528180a4620020f9565b818c52848b5260408c20816000528b526040600020600160ff198254161790553391600080516020620056448339815191528d80a43880620020d4565b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b5060028185161062002017565b503462000377578060031936011262000377576020608654604051908152f35b503462000377576020366003190112620003775762002aa262003a51565b62002aac62004eb9565b60ff606f54161562002b11575b608480546001600160c01b031660c083901b6001600160c01b0319161790556040516001600160401b0390911681527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602090a180f35b60845460c01c6001600160401b0382161062002ab95760405163401636df60e01b8152600490fd5b503462000377576040366003190112620003775762002b5762003ac4565b336001600160a01b0382160362002b765762000da69060043562004fb4565b604051630b4ad1cd60e31b8152600490fd5b503462000377576040366003190112620003775760043562002ba962003ac4565b818352603460205262002bc3600160408520015462004ef3565b8183526034602052604083209060018060a01b0316908160005260205260ff604060002054161562002bf3578280f35b818352603460205260408320816000526020526040600020600160ff198254161790553391600080516020620056448339815191528480a438808280f35b50346200037757604036600319011262000377576060906003604062002c5662003a0f565b9263ffffffff62002c6662003a23565b948284805162002c768162003c2f565b82815282602082015201521681526081602052200160018060401b0380921660005260205260406000209060405162002caf8162003c2f565b81600184549485845201549181604060208301928286168452019360401c1683526040519485525116602084015251166040820152f35b503462000377576020366003190112620003775760016040602092600435815260348452200154604051908152f35b503462000377578060031936011262000377576000805160206200584483398151915281526034602052604081203360005260205260ff604060002054161562002d64575b62000da662004854565b60845460801c6001600160401b0390811662093a80019080821162002d9f57429116111562002d5a5760405163692baaad60e11b8152600490fd5b634e487b7160e01b600052601160045260246000fd5b503462000377576020366003190112620003775760043561ffff81169081810362000bf75762002de462004eb9565b6103e88210801562002e56575b62002e44576085805461ffff60801b191660809290921b61ffff60801b169190911790556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c590602090a180f35b604051630984a67960e31b8152600490fd5b506103ff821162002df1565b50346200037757806003193601126200037757602063ffffffff607e5416604051908152f35b503462000377576040366003190112620003775762002ea662003a0f565b63ffffffff62002eb562003a23565b91168252608160205260408220906000805160206200588483398151915283526034602052604083203360005260205260ff604060002054161562002f00575b62000da6916200444d565b60ff606f5416620015cf5762002f17818362004be6565b62002ef557604051630674f25160e11b8152600490fd5b50346200037757806003193601126200037757602060ff606f54166040519015158152f35b5034620003775762002f9c63ffffffff62002f6e3662003b51565b928481979699849962002f869c979c95949562004e7f565b16998a8d52608160205260408d20978862003eb8565b600681019062002fad868362003d8c565b82600560018060401b0392838916600052600281016020528660406000205501558154908160801c1662003097575b508590507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166200301462004970565b813b1562000bf75782916024839260405194859384926333d6247d60e01b845260048401525af18015620009db576200307f575b50507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39162001aac60405192839233978462003e45565b6200308a9062003c1b565b6200113757843862003048565b6001600160801b03169055388062002fdc565b50346200037757620030f263ffffffff620030c53662003adb565b92809599948297998499620030dc95949562004e7f565b169a8b8d52608160205260408d209a8b620045eb565b600684019062003103818362003d8c565b83600560018060401b0380931696878a52600281016020528560408b205501558154908160801c166200321a575b508590507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166200316962004970565b90803b1562000bf7576024839260405194859384926333d6247d60e01b845260048401525af180156200320f57620031e3575b50608480546001600160c01b031661127560c71b179055604080519384526020840191909152820152336060820152600080516020620056c483398151915290608090a280f35b91600080516020620056c48339815191529391956200320460809462003c1b565b95919350916200319c565b6040513d88823e3d90fd5b6001600160801b03169055388062003131565b503462000377576020366003190112620003775762003267604060209263ffffffff6200325962003a0f565b168152608184522062004ba9565b6040516001600160401b039091168152f35b5034620003775760c036600319011262000377576200329762003a68565b620032a162003a23565b620032ab62003a3a565b90610102620032b962003a7f565b92620032c462003a96565b92620032cf62003aad565b9187549160ff948386809560081c1615806200395e575b620032f19062003d28565b61ffff191617808a5560858054608480546001600160c01b031660c09690961b6001600160c01b0319169590951790945567016345785d8a00006086556001600160801b03199093166001600160401b039092169190911760e160431b1761ffff60801b19166101f560811b1790915560081c1615620029fe576000805160206200578483398151915294600080516020620058848339815191529485885260349460209686885260408a2060018060a01b0380951690818c5289528660408c2054161562003924575b50508880528587528260408a20911690818a5287528460408a20541615620038eb575b60008051602062005724833981519152808a5286885260408a20828b5288528560408b20541615620038b0575b50600080516020620057c4833981519152808a5286885260408a20828b5288528560408b2054161562003875575b50600080516020620056a483398151915290818a5286885260408a20818b5288528560408b205416156200383b575b5050600080516020620057048339815191528089528587528260408a20921691828a5287528460408a2054161562003800575b506000805160206200586483398151915280895285875260408920828a5287528460408a20541615620037c5575b506000805160206200574483398151915280895285875260408920828a5287528460408a205416156200378a575b506000805160206200580483398151915280895285875260408920828a5287528460408a205416156200374f575b506200353062004f18565b6000805160206200566483398151915280895285875260408920828a5287528460408a2054161562003714575b50600080516020620056e48339815191529081895285875260408920818a5287528460408a20541615620036da575b50506200359862004f66565b600080516020620058448339815191529081885284865260408820921691828852855282604088205416156200369f575b506000805160206200582483398151915290818752838552604087208188528552826040882054161562003665575b5050848052818352604085203386528352604085205416156200362b575b50825461ff001916835560405160028152a180f35b838052815260408320338452815260408320600160ff19825416179055333384600080516020620056448339815191528180a43862003616565b818752838552604080882082895286528720805460ff191660011790553391600080516020620056448339815191528880a43880620035f8565b80875283855260408720828852855260408720600160ff19825416179055813391600080516020620056448339815191528980a438620035c9565b8189528587526040808a20828b5288528920805460ff191660011790553391600080516020620056448339815191528a80a438806200358c565b80895285875260408920828a52875260408920600160ff19825416179055813391600080516020620056448339815191528b80a4386200355d565b80895285875260408920828a52875260408920600160ff19825416179055813391600080516020620056448339815191528b80a43862003525565b80895285875260408920828a52875260408920600160ff19825416179055813391600080516020620056448339815191528b80a438620034f7565b80895285875260408920828a52875260408920600160ff19825416179055813391600080516020620056448339815191528b80a438620034c9565b80895285875260408920828a52875260408920600160ff19825416179055813391600080516020620056448339815191528b80a4386200349b565b818a528688526040808b20828c5289528a20805460ff191660011790553391600080516020620056448339815191528b80a4388062003468565b808a5286885260408a20828b52885260408a20600160ff19825416179055813391600080516020620056448339815191528c80a43862003439565b808a5286885260408a20828b52885260408a20600160ff19825416179055813391600080516020620056448339815191528c80a4386200340b565b8880528587526040808a20828b5288528920805460ff1916600117905533818a600080516020620056448339815191528180a4620033de565b818b528789526040808c20828d528a528b20805460ff191660011790553391600080516020620056448339815191528c80a43880620033bb565b50600281861610620032e6565b503462000377578060031936011262000377576085546040805191901c6001600160401b03168152602090f35b5034620003775760403660031901126200037757620039de6020916040620039bf62003a0f565b9163ffffffff620039cf62003a23565b93168152608185522062004be6565b6040519015158152f35b90503462001755578160031936011262001755576084546001600160401b03168152602090f35b6004359063ffffffff82168203620005b857565b602435906001600160401b0382168203620005b857565b604435906001600160401b0382168203620005b857565b600435906001600160401b0382168203620005b857565b600435906001600160a01b0382168203620005b857565b606435906001600160a01b0382168203620005b857565b608435906001600160a01b0382168203620005b857565b60a435906001600160a01b0382168203620005b857565b602435906001600160a01b0382168203620005b857565b6103e0600319820112620005b85760043563ffffffff81168103620005b857916001600160401b036024358181168103620005b857926044358281168103620005b857926064358381168103620005b857926084359081168103620005b8579160a4359160c435916103e411620005b85760e490565b6103e0600319820112620005b85760043563ffffffff81168103620005b857916001600160401b03906024358281168103620005b857926044358381168103620005b857926064359081168103620005b857916084359160a4359160c4356001600160a01b0381168103620005b857916103e411620005b85760e490565b60005b83811062003be35750506000910152565b818101518382015260200162003bd2565b9060209162003c0f8151809281855285808601910162003bcf565b601f01601f1916010190565b6001600160401b0381116200058c57604052565b606081019081106001600160401b038211176200058c57604052565b608081019081106001600160401b038211176200058c57604052565b602081019081106001600160401b038211176200058c57604052565b601f909101601f19168101906001600160401b038211908210176200058c57604052565b6001600160401b0381116200058c5760051b60200190565b6001600160401b0381116200058c57601f01601f191660200190565b81601f82011215620005b85780359062003cf58262003cbf565b9262003d05604051948562003c83565b82845260208383010111620005b857816000926020809301838601378301015290565b1562003d3057565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b8054600160401b600160801b03191660409290921b600160401b600160801b0316919091179055565b63ffffffff80911690811462002d9f5760010190565b8054600160a01b600160e01b03191660a09290921b600160a01b600160e01b0316919091179055565b805460ff60801b191660809290921b60ff60801b16919091179055565b6001600160401b03918216908216019190821162002d9f57565b6001600160401b03918216908216039190821162002d9f57565b6040919493926060820195600180851b0316825260208201520152565b90816020910312620005b857518015158103620005b85790565b9291906103208401936103008092823701906000915b6001831062003ea057505050565b60019082518152602080910192019201919062003e92565b929591969390949660009162003ece8562004ba9565b60078601546001600160401b038085169990959294929186168a10620042eb578516908115620042a5575084600688015460801c1681116200429357600052600486016020526040600020978460028a0154995460401c160362004281575b838916978484168911156200426f5762003f4b928a8c938962004ceb565b9060409788519260008480835162003f6a816020998a80980162003bcf565b8101039060025afa15620042645760005160018701548a516001600160a01b039962003fd19387938c16919060008051602062005764833981519152900662003fb38462003c67565b83528d51809581948293634890ed4560e11b84526004840162003e7c565b03915afa908115620042595760009162004225575b501562004214579062003ff99162003e2b565b926200400462004c1a565b8385169081810291818304149015171562002d9f57885190878483019363a9059cbb60e01b8552166024830152604482015260448152620040458162003c4b565b867f0000000000000000000000000000000000000000000000000000000000000000168951918a8301838110878211176200058c578b528483527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648386015251620040e593600091829182855af13d156200420b573d91620040c78362003cbf565b92620040d68d51948562003c83565b83523d60008785013e620042fd565b8051908162004195575b505060845492600160401b600160801b039262004111925084891c1662003e11565b600160401b600160c01b031990921691861b16174260801b600160801b600160c01b031617608455541692833b15620005b857606460009283855196879485936332c2d15360e01b8552600485015260248401523360448401525af19081156200418b57506200417e5750565b620041899062003c1b565b565b513d6000823e3d90fd5b8280620041a793830101910162003e62565b15620041b5578080620040ef565b60849087519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152fd5b606091620042fd565b88516309bde33960e01b8152600490fd5b6200424a9150843d861162004251575b62004241818362003c83565b81019062003e62565b3862003fe6565b503d62004235565b8a513d6000823e3d90fd5b88513d6000823e3d90fd5b60405163b9b18f5760e01b8152600490fd5b604051632bd2e3e760e01b8152600490fd5b60405163bb14c20560e01b8152600490fd5b60409150898152600288016020522054978815620042d957848416101562003f2d57604051630f2b74f160e11b8152600490fd5b6040516324cbdcc360e11b8152600490fd5b60405163ead1340b60e01b8152600490fd5b9192901562004362575081511562004313575090565b3b156200431d5790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b825190915015620043765750805190602001fd5b60405162461bcd60e51b8152602060048201529081906200439c90602483019062003bf4565b0390fd5b60068101546001600160401b0390608081901c82169060c01c808211620043c8575b50505050565b60010191821162002d9f57620043df828462004be6565b620043ec575b80620043c2565b620044129060016001603f1b03906200440790849062003e2b565b60011c168262003e11565b906200441f828462004be6565b156200443a575062004431916200444d565b388080620043e5565b905062004447916200444d565b62004431565b6006810180546001600160401b03939192848316929160009060c081901c85118015918891620045db575b5050620045c95783815260048201602052604091828220968754841c1695620044a2878262003d8c565b60028881018054898652918401602052858520919091556001989098018054600584015581546001600160c01b031660c09690961b6001600160c01b0319169590951790556001600160a01b03907f000000000000000000000000000000000000000000000000000000000000000082166200451d62004970565b813b156200113757849160248392885194859384926333d6247d60e01b845260048401525af18015620045bf5793859363ffffffff9360809997937f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b9b9997620045a9575b505416815260826020522054169654915491815194855260208501528301526060820152a2565b620045b79093919362003c1b565b913862004582565b85513d86823e3d90fd5b60405163d086b70b60e01b8152600490fd5b60801c1685119050863862004478565b91929394969060009760018060401b039889600786015416928a8816938410620042eb578a16908115620047eb575089600686015460801c168111620042935780600052600485016020526040600020928a6002850154945460401c160362004281575b8960068601549616958a8160801c168711918215620047df575b508115620047d0575b50620047be5760048401968560005260209688885260409a808c600020548d1c1690831603620047ad57898894600094620046c694620046b3948a62004ceb565b838b519282848094519384920162003bcf565b8101039060025afa15620047a25760005160019092015487516200472e93869391926001600160a01b03169190600080516020620057648339815191529006620047108462003c67565b83528951809581948293634890ed4560e11b84526004840162003e7c565b03915afa908115620047a25760009162004780575b50156200476f57600052526002826000200154146200475f5750565b5163a47276bd60e01b8152600490fd5b84516309bde33960e01b8152600490fd5b6200479b9150833d8511620042515762004241818362003c83565b3862004743565b86513d6000823e3d90fd5b8a516332a2a77f60e01b8152600490fd5b60405163bfa7079f60e01b8152600490fd5b905060c01c8511153862004672565b87111591503862004669565b808460409252600287016020522054928315620042d9578a600687015460401c1610156200464f57604051630f2b74f160e11b8152600490fd5b9190820391821162002d9f57565b81156200483e570490565b634e487b7160e01b600052601260045260246000fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15620005b8576040518091632072f6c560e01b82528160046000948580945af18015620009db57620048eb575b50606f549060ff8216620015cf5760017f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a54979260ff191617606f5580a1565b620048f69062003c1b565b38620048ad565b90620049098262003ca7565b62004918604051918262003c83565b82815280926200492b601f199162003ca7565b0190602036910137565b600019811462002d9f5760010190565b80518210156200495a5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b63ffffffff8060805416801562004ba2576200498c81620048fd565b9160005b82811062004b6b5750509060006020915b60019081851462004af3578185811c95169182860180961162002d9f57620049c986620048fd565b9160009160001994858901898111945b8a811062004a1c5750505050505093916040805190602082019280845281830152815262004a078162003c2f565b51902092801562002d9f5701919092620049a1565b8562002d9f578181148062004ae9575b1562004a905780841b908082046002148115171562002d9f5762004a5562004a8a928762004945565b516040805190602082019283528c81830152815262004a748162003c2f565b51902062004a83828a62004945565b5262004935565b620049d9565b80841b908082046002148115171562002d9f5762004aaf828762004945565b5185830180931162002d9f5762004acb62004a8a938862004945565b5160408051916020830193845281830152815262004a748162003c2f565b5083831462004a2c565b919350508051156200495a5760200151916000905b82821062004b165750505090565b62004b6490604094855160208101918252828782015286815262004b3a8162003c2f565b51902094805190602082019280845281830152815262004b5a8162003c2f565b5190209162004935565b9062004b08565b600181019081811162002d9f578262004b9c9216600052608160205260056040600020015462004a83828762004945565b62004990565b5050600090565b60068101546001600160401b0391608082901c8316801562004bdd57600492506000520160205260406000205460401c1690565b505060401c1690565b60049060018060401b038093166000520160205262004c12816040600020541682608554169062003e11565b429116111590565b6040516370a0823160e01b81523060048201526020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811562004cdf5760009162004ca8575b506084546001600160401b039062004c9290604081901c831690831662003e2b565b16801562004ba25762004ca59162004833565b90565b906020823d821162004cd6575b8162004cc46020938362003c83565b81010312620003775750513862004c70565b3d915062004cb5565b6040513d6000823e3d90fd5b929390949160018060401b03948587166000948186526003870160205260409687872054998986168852888820549315158062004e05575b62004df457831562004de35762004d3a8362004e0e565b1562004dd2579060749160018254920154918a519c8d993360601b60208c015260348b015260548a015260018060c01b031998899485809460c01b1691015260201b16607c8c015260201b1660848a0152608c89015260ac88015260cc87015260c01b1660ec85015260d484526101008401928484109084111762004dbe57505290565b634e487b7160e01b81526041600452602490fd5b88516305dae44f60e21b8152600490fd5b88516366385b5160e01b8152600490fd5b885163340c614f60e11b8152600490fd5b508a1562004d23565b67ffffffff000000016001600160401b03828116821192908362004e6e575b8362004e5c575b508262004e4e575b50501562004e4957600190565b600090565b60c01c109050388062004e3c565b818392945060801c1610913862004e34565b925081838260401c16109262004e2d565b3360009081527fc17b14a573f65366cdad721c7c0a0f76536bb4a86b935cdac44610e4f010b52a602052604090205460ff1615620005a257565b3360009081527f3b72b60ab7bcf7b6e5f79e30b28eb2a39d66a2a278905c2bfcfdd4e1c0a1907b602052604090205460ff1615620005a257565b600052603460205260406000203360005260205260ff6040600020541615620005a257565b600080516020620058848339815191528060005260346020526001604060002001908154906000805160206200566483398151915280935560008051602062005684833981519152600080a4565b600080516020620058448339815191528060005260346020526001604060002001908154906000805160206200582483398151915280935560008051602062005684833981519152600080a4565b906000918083526034602052604083209160018060a01b03169182845260205260ff60408420541662004fe657505050565b8083526034602052604083208284526020526040832060ff1981541690557ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b339380a456fe604060a08152610618803803806100158161023b565b92833981016060828203126102365761002d82610276565b9060209161003c838501610276565b8585015190946001600160401b038211610236570182601f820112156102365780519061007061006b8361028a565b61023b565b9382855285838301011161023657849060005b83811061022257505060009184010152803b15610201577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b03199081166001600160a01b038481169182179093558751929691948794929390917fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a28151156101e0575090600080838861014695519101845af43d156101d8573d9161013761006b8461028a565b9283523d60008985013e6102a5565b505b8060805216917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f857fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103958587549483519286168352820152a182156101c057161790555161030f9081610309823960805181600f0152f35b8451633173bdd160e11b815260006004820152602490fd5b6060916102a5565b9293505050346101f257508390610148565b63b398979f60e01b8152600490fd5b8451634c9c8ce360e01b81526001600160a01b039091166004820152602490fd5b818101830151868201840152869201610083565b600080fd5b6040519190601f01601f191682016001600160401b0381118382101761026057604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b038216820361023657565b6001600160401b03811161026057601f01601f191660200190565b906102cc57508051156102ba57805190602001fd5b604051630a12f52160e11b8152600490fd5b815115806102ff575b6102dd575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b156102d556fe60806040526001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216036100df5760009081356001600160e01b03191663278f794360e11b141582036100df57366004116100db5760403660031901126100db576004359081168091036100db57602435906001600160401b0382116100d757366023830112156100d75781600401356100a86100a382610159565b61012f565b9281845236602483830101116100d357816100d195926024602093018387013784010152610174565b005b8480fd5b8280fd5b5080fd5b6000805160206102ba83398151915254600090819081906001600160a01b0316368280378136915af43d82803e15610115573d90f35b3d90fd5b634e487b7160e01b600052604160045260246000fd5b6040519190601f01601f191682016001600160401b0381118382101761015457604052565b610119565b6001600160401b03811161015457601f01601f191660200190565b90813b156101fa576000805160206102ba83398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a28051156101df576101dc9161021b565b50565b5050346101e857565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60008061024f93602081519101845af43d15610252573d9161023f6100a384610159565b9283523d6000602085013e610256565b90565b6060915b9061027d575080511561026b57805190602001fd5b604051630a12f52160e11b8152600490fd5b815115806102b0575b61028e575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b1561028656fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca264697066735822122066cbe29d5f5d924e31dcec6cf36e6701a714177c1368e4ed6d1bf766b15eb2a464736f6c634300081400332f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f0bd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024981c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68eaac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b4a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220a3c1fae9e6cb0e6566da09e533a165ecacaf5e202a1a2482f89015ba8d94194b64736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} From 95a7b0c09b891ca4d015156e27b39b430ea41bfa Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 18 Oct 2023 14:58:26 +0200 Subject: [PATCH 077/230] first deployment done --- deployment/v2/4_createRollup.ts | 1 + deployment/v2/verifyContracts.js | 49 +++++++++++++++++++++++++++----- hardhat.config.ts | 11 +++++++ package.json | 3 +- 4 files changed, 56 insertions(+), 8 deletions(-) diff --git a/deployment/v2/4_createRollup.ts b/deployment/v2/4_createRollup.ts index b151202ef..9a7e32e52 100644 --- a/deployment/v2/4_createRollup.ts +++ b/deployment/v2/4_createRollup.ts @@ -178,6 +178,7 @@ async function main() { deployOutput.genesis = genesis.root; deployOutput.newZKEVMAddress = newZKEVMAddress; + deployOutput.verifierAddress = verifierContract.target; fs.writeFileSync(pathOutputJson, JSON.stringify(deployOutput, null, 1)); } diff --git a/deployment/v2/verifyContracts.js b/deployment/v2/verifyContracts.js index b5428112a..57367a6d8 100644 --- a/deployment/v2/verifyContracts.js +++ b/deployment/v2/verifyContracts.js @@ -21,14 +21,12 @@ async function main() { const polTokenSymbol = "POL"; const polTokenInitialBalance = ethers.parseEther("20000000"); - const polTokenFactory = await ethers.getContractFactory("ERC20PermitMock", deployer); - try { // verify governance await hre.run( 'verify:verify', { - address: deployOutputParameters.maticTokenAddress, + address: deployOutputParameters.polTokenAddress, constructorArguments: [ polTokenName, polTokenSymbol, @@ -122,18 +120,55 @@ async function main() { await hre.run( 'verify:verify', { + contract: "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol:TransparentUpgradeableProxy", address: deployOutputParameters.polygonZkEVMBridgeAddress, + constructorArguments: [ + await upgrades.erc1967.getImplementationAddress(deployOutputParameters.polygonZkEVMBridgeAddress), + await upgrades.erc1967.getAdminAddress(deployOutputParameters.polygonZkEVMBridgeAddress), + "0x" + ] }, ); } catch (error) { - expect(error.message.toLowerCase().includes('proxyadmin')).to.be.equal(true); + //expect(error.message.toLowerCase().includes('proxyadmin')).to.be.equal(true); } - // verify zkEVM address - try { + + try { + await hre.run( + 'verify:verify', + { + address: deployOutputParameters.polygonZkEVMBridgeAddress, + }, + ); + } catch (error) { + //expect(error.message.toLowerCase().includes('proxyadmin')).to.be.equal(true); + } + + try { await hre.run( 'verify:verify', { + contract: "contracts/v2/lib/PolygonTransparentProxy.sol:PolygonTransparentProxy", + address: deployOutputParameters.newZKEVMAddress, + constructorArguments: [ + await upgrades.erc1967.getImplementationAddress(deployOutputParameters.newZKEVMAddress), + await upgrades.erc1967.getAdminAddress(deployOutputParameters.newZKEVMAddress), + "0x" + ] + }, + ); + } catch (error) { + //expect(error.message.toLowerCase().includes('proxyadmin')).to.be.equal(true); + } + + + // verify zkEVM address + try { + await hre.run( + 'verify:verify', + { + contract: "contracts/v2/consensus/zkEVM/PolygonZkEVMV2.sol:PolygonZkEVMV2", address: deployOutputParameters.newZKEVMAddress, constructorArguments: [ deployOutputParameters.polygonZkEVMGlobalExitRootAddress, @@ -144,7 +179,7 @@ async function main() { }, ); } catch (error) { - expect(error.message.toLowerCase().includes('proxyadmin')).to.be.equal(true); + //expect(error.message.toLowerCase().includes('proxyadmin')).to.be.equal(true); } } diff --git a/hardhat.config.ts b/hardhat.config.ts index cd2011147..b96b9293d 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -115,6 +115,17 @@ const config: HardhatUserConfig = { evmVersion: "shanghai", }, // try yul optimizer }, + // Should have the same optimizations than the RollupManager to verify + "contracts/v2/lib/PolygonTransparentProxy.sol": { + version: "0.8.20", + settings: { + optimizer: { + enabled: true, + runs: 10, + }, + evmVersion: "shanghai", + }, // try yul optimizer + }, }, }, networks: { diff --git a/package.json b/package.json index 348a38610..a7cf93486 100644 --- a/package.json +++ b/package.json @@ -84,6 +84,7 @@ "deploy:v2:localhost": "rm -f .openzeppelin/unknown-31337.json && npx ts-node deployment/v2/1_createGenesis.ts --test && npx hardhat run deployment/v2/2_deployPolygonZKEVMDeployer.ts --network localhost && npx hardhat run deployment/v2/3_deployContracts.ts --network localhost && npx hardhat run deployment/v2/4_createRollup.ts --network localhost", "deploy:testnet:v2:localhost": "rm -f deployment/v2/deploy_ongoing.json && npm run prepare:testnet:ZkEVM:localhost && npm run deploy:v2:localhost", "deploy:v2:goerli": "npx ts-node deployment/v2/1_createGenesis.ts && npx hardhat run deployment/v2/2_deployPolygonZKEVMDeployer.ts --network goerli && npx hardhat run deployment/v2/3_deployContracts.ts --network goerli && npx hardhat run deployment/v2/4_createRollup.ts --network goerli", - "deploy:testnet:v2:goerli": "rm -f deployment/v2/deploy_ongoing.json && npm run prepare:testnet:ZkEVM:goerli && npm run deploy:v2:goerli" + "deploy:testnet:v2:goerli": "rm -f deployment/v2/deploy_ongoing.json && npm run prepare:testnet:ZkEVM:goerli && npm run deploy:v2:goerli", + "verify:v2:goerli": "npx hardhat run deployment/v2/verifyContracts.js --network goerli" } } From daaaaacdd333210620d1405f24b43199aa123a72 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 18 Oct 2023 15:40:44 +0200 Subject: [PATCH 078/230] docker works --- deployment/v2/3_deployContracts.ts | 1 - deployment/v2/genesis.json | 44 ++++----- docker/scripts/deploy-docker.sh | 17 ---- docker/scripts/deploy-dockerv2.sh | 16 ---- docker/scripts/deploy_parameters_docker.json | 20 ---- docker/scripts/fund-accounts.js | 8 +- docker/scripts/genesis_docker.json | 95 ------------------- docker/scripts/v2/deploy-docker.sh | 12 +-- docker/scripts/v2/deploy-dockerv2.sh | 11 +-- .../scripts/v2/deploy_parameters_docker.json | 27 ++++++ docker/scripts/v2/genesis.json | 92 ++++++++++++++++++ package.json | 10 +- 12 files changed, 160 insertions(+), 193 deletions(-) delete mode 100755 docker/scripts/deploy-docker.sh delete mode 100644 docker/scripts/deploy-dockerv2.sh delete mode 100644 docker/scripts/deploy_parameters_docker.json delete mode 100644 docker/scripts/genesis_docker.json mode change 100644 => 100755 docker/scripts/v2/deploy-dockerv2.sh create mode 100644 docker/scripts/v2/deploy_parameters_docker.json create mode 100644 docker/scripts/v2/genesis.json diff --git a/deployment/v2/3_deployContracts.ts b/deployment/v2/3_deployContracts.ts index 30f18674b..124a66a01 100644 --- a/deployment/v2/3_deployContracts.ts +++ b/deployment/v2/3_deployContracts.ts @@ -453,7 +453,6 @@ async function main() { // save an ongoing deployment ongoingDeployment.polygonRollupManagerContract = polygonRollupManagerContract?.target; fs.writeFileSync(pathOngoingDeploymentJson, JSON.stringify(ongoingDeployment, null, 1)); - console.log(polygonRollupManagerContract.deploymentTransaction()); deploymentBlockNumber = (await polygonRollupManagerContract?.deploymentTransaction().wait()).blockNumber; } else { // Expect the precalculate address matches de onogin deployment, sanity check diff --git a/deployment/v2/genesis.json b/deployment/v2/genesis.json index b838d3934..1d91982a7 100644 --- a/deployment/v2/genesis.json +++ b/deployment/v2/genesis.json @@ -1,50 +1,50 @@ { - "root": "0xc9cb1d9b6eb09926da6984beda72b94dcca2e42adb83c6fc90c81607a9452a0d", + "root": "0x40bdab77c40f497be8a427027b336f7a51a0692c3fb20ff36519bc5a79dc60fd", "genesis": [ { "contractName": "PolygonZkEVMDeployer", "balance": "0", "nonce": "4", - "address": "0x363330f6aF9C702AE90E2319A59d5200Ac9d7246", + "address": "0xFbD07134824dDEa24E4ae414c18ecbFa98169A24", "bytecode": "0x60806040526004361061006e575f3560e01c8063715018a61161004c578063715018a6146100e25780638da5cb5b146100f6578063e11ae6cb1461011f578063f2fde38b14610132575f80fd5b80632b79805a146100725780634a94d487146100875780636d07dbf81461009a575b5f80fd5b610085610080366004610908565b610151565b005b6100856100953660046109a2565b6101c2565b3480156100a5575f80fd5b506100b96100b43660046109f5565b610203565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ed575f80fd5b50610085610215565b348015610101575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff166100b9565b61008561012d366004610a15565b610228565b34801561013d575f80fd5b5061008561014c366004610a61565b61028e565b61015961034a565b5f6101658585856103ca565b90506101718183610527565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a15050505050565b6101ca61034a565b6101d583838361056a565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b905f90a1505050565b5f61020e8383610598565b9392505050565b61021d61034a565b6102265f6105a4565b565b61023061034a565b5f61023c8484846103ca565b60405173ffffffffffffffffffffffffffffffffffffffff821681529091507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a150505050565b61029661034a565b73ffffffffffffffffffffffffffffffffffffffff811661033e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610347816105a4565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610335565b5f83471015610435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610335565b81515f0361049f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610335565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff811661020e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610335565b606061020e83835f6040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c65640000815250610618565b6060610590848484604051806060016040528060298152602001610b0860299139610618565b949350505050565b5f61020e83833061072d565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156106aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610335565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516106d29190610a9c565b5f6040518083038185875af1925050503d805f811461070c576040519150601f19603f3d011682016040523d82523d5f602084013e610711565b606091505b509150915061072287838387610756565b979650505050505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b606083156107eb5782515f036107e45773ffffffffffffffffffffffffffffffffffffffff85163b6107e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610335565b5081610590565b61059083838151156108005781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103359190610ab7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112610870575f80fd5b813567ffffffffffffffff8082111561088b5761088b610834565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156108d1576108d1610834565b816040528381528660208588010111156108e9575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f806080858703121561091b575f80fd5b8435935060208501359250604085013567ffffffffffffffff80821115610940575f80fd5b61094c88838901610861565b93506060870135915080821115610961575f80fd5b5061096e87828801610861565b91505092959194509250565b803573ffffffffffffffffffffffffffffffffffffffff8116811461099d575f80fd5b919050565b5f805f606084860312156109b4575f80fd5b6109bd8461097a565b9250602084013567ffffffffffffffff8111156109d8575f80fd5b6109e486828701610861565b925050604084013590509250925092565b5f8060408385031215610a06575f80fd5b50508035926020909101359150565b5f805f60608486031215610a27575f80fd5b8335925060208401359150604084013567ffffffffffffffff811115610a4b575f80fd5b610a5786828701610861565b9150509250925092565b5f60208284031215610a71575f80fd5b61020e8261097a565b5f5b83811015610a94578181015183820152602001610a7c565b50505f910152565b5f8251610aad818460208701610a7a565b9190910192915050565b602081525f8251806020840152610ad5816040850160208701610a7a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220330b94dc698c4d290bf55c23f13b473cde6a6bae0030cb902de18af54e35839f64736f6c63430008140033", "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000cae25c8623761783fe4ce241c9b428126a7612a" + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" } }, { "contractName": "ProxyAdmin", "balance": "0", "nonce": "1", - "address": "0xeEd3E59b4cbE530F20e1ac79fA877ce33D8Cf805", + "address": "0xfADB60b5059e31614e02083fF6C021a24C31c891", "bytecode": "0x608060405260043610610079575f3560e01c80639623609d1161004c5780639623609d1461012357806399a88ec414610136578063f2fde38b14610155578063f3b7dead14610174575f80fd5b8063204e1c7a1461007d578063715018a6146100c55780637eff275e146100db5780638da5cb5b146100fa575b5f80fd5b348015610088575f80fd5b5061009c6100973660046105e8565b610193565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100d0575f80fd5b506100d9610244565b005b3480156100e6575f80fd5b506100d96100f536600461060a565b610257565b348015610105575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff1661009c565b6100d961013136600461066e565b6102e0565b348015610141575f80fd5b506100d961015036600461060a565b610371565b348015610160575f80fd5b506100d961016f3660046105e8565b6103cd565b34801561017f575f80fd5b5061009c61018e3660046105e8565b610489565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907f5c60da1b00000000000000000000000000000000000000000000000000000000815260040190565b5f60405180830381855afa9150503d805f8114610215576040519150601f19603f3d011682016040523d82523d5f602084013e61021a565b606091505b509150915081610228575f80fd5b8080602001905181019061023c919061075b565b949350505050565b61024c6104d3565b6102555f610553565b565b61025f6104d3565b6040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690638f283970906024015b5f604051808303815f87803b1580156102c6575f80fd5b505af11580156102d8573d5f803e3d5ffd5b505050505050565b6102e86104d3565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef28690349061033e9086908690600401610776565b5f604051808303818588803b158015610355575f80fd5b505af1158015610367573d5f803e3d5ffd5b5050505050505050565b6103796104d3565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690633659cfe6906024016102af565b6103d56104d3565b73ffffffffffffffffffffffffffffffffffffffff811661047d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61048681610553565b50565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907ff851a44000000000000000000000000000000000000000000000000000000000815260040190565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610474565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610486575f80fd5b5f602082840312156105f8575f80fd5b8135610603816105c7565b9392505050565b5f806040838503121561061b575f80fd5b8235610626816105c7565b91506020830135610636816105c7565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f805f60608486031215610680575f80fd5b833561068b816105c7565b9250602084013561069b816105c7565b9150604084013567ffffffffffffffff808211156106b7575f80fd5b818601915086601f8301126106ca575f80fd5b8135818111156106dc576106dc610641565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561072257610722610641565b8160405282815289602084870101111561073a575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f6020828403121561076b575f80fd5b8151610603816105c7565b73ffffffffffffffffffffffffffffffffffffffff831681525f602060408184015283518060408501525f5b818110156107be578581018301518582016060015282016107a2565b505f6060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050939250505056fea26469706673582212203083a4ccc2e42eed60bd19037f2efa77ed086dc7a5403f75bebb995dcba2221c64736f6c63430008140033", "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000dead72fd97a579e98aef2f9eb190066e1858d15a" + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f" } }, { "contractName": "PolygonZkEVMBridge implementation", "balance": "0", "nonce": "1", - "address": "0x2b4d7418689C91b81A8d7114F8F4BfeB5f96CF4E", + "address": "0x7Cd6d5063c7782d34E2b1b03ED89ecf4A1412148", "bytecode": "0x608060405260043610620001d3575f3560e01c80638ed7e3f211620000fa578063cd5865791162000092578063dbc16976116200006a578063dbc169761462000685578063ee25560b146200069c578063f5efcd7914620006cb578063fb57083414620006ef575f80fd5b8063cd5865791462000620578063d02103ca1462000637578063d3476afe1462000661575f80fd5b8063bab161bf11620000d2578063bab161bf146200057a578063be5831c7146200059d578063cc46163214620005d8578063ccaa2d1114620005fc575f80fd5b80638ed7e3f21462000511578063aaa13cc21462000532578063b8b284d01462000556575f80fd5b80633cbc795b116200016e5780635ca1e16511620001465780635ca1e165146200048757806379e2cf97146200049e57806381b1c17414620004b557806383f2440314620004ed575f80fd5b80633cbc795b14620003285780633e19704314620003745780634b2f336d1462000466575f80fd5b8063240ff37811620001ae578063240ff378146200025d5780632dfdf0b51462000274578063318aee3d146200029a5780633c351e101462000307575f80fd5b806315064c9614620001d75780632072f6c5146200020757806322e95f2c1462000220575b5f80fd5b348015620001e3575f80fd5b50606854620001f29060ff1681565b60405190151581526020015b60405180910390f35b34801562000213575f80fd5b506200021e62000713565b005b3480156200022c575f80fd5b50620002446200023e36600462003723565b62000764565b6040516001600160a01b039091168152602001620001fe565b6200021e6200026e366004620037b3565b620007f9565b34801562000280575f80fd5b506200028b60535481565b604051908152602001620001fe565b348015620002a6575f80fd5b50620002e2620002b836600462003832565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201620001fe565b34801562000313575f80fd5b50606d5462000244906001600160a01b031681565b34801562000334575f80fd5b50606d546200035e9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001620001fe565b34801562000380575f80fd5b506200028b6200039236600462003866565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b34801562000472575f80fd5b50606e5462000244906001600160a01b031681565b34801562000493575f80fd5b506200028b62000862565b348015620004aa575f80fd5b506200021e62000947565b348015620004c1575f80fd5b5062000244620004d3366004620038eb565b606a6020525f90815260409020546001600160a01b031681565b348015620004f9575f80fd5b506200028b6200050b36600462003915565b62000981565b3480156200051d575f80fd5b50606c5462000244906001600160a01b031681565b3480156200053e575f80fd5b50620002446200055036600462003956565b62000a64565b34801562000562575f80fd5b506200021e6200057436600462003a03565b62000bf4565b34801562000586575f80fd5b506068546200035e90610100900463ffffffff1681565b348015620005a9575f80fd5b506068546200035e90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b348015620005e4575f80fd5b50620001f2620005f636600462003a8b565b62000cc9565b34801562000608575f80fd5b506200021e6200061a36600462003ac1565b62000d58565b6200021e6200063136600462003bb5565b6200144d565b34801562000643575f80fd5b5060685462000244906501000000000090046001600160a01b031681565b3480156200066d575f80fd5b506200021e6200067f36600462003c51565b62001a03565b34801562000691575f80fd5b506200021e62001dd7565b348015620006a8575f80fd5b506200028b620006ba366004620038eb565b60696020525f908152604090205481565b348015620006d7575f80fd5b506200021e620006e936600462003ac1565b62001e26565b348015620006fb575f80fd5b50620001f26200070d36600462003cc5565b620021aa565b606c546001600160a01b0316331462000758576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000762620021c5565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b3415801590620008135750606e546001600160a01b031615155b156200084b576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200085b85853486868662002258565b5050505050565b6053545f90819081805b60208110156200093e578083901c600116600103620008cf57603381602081106200089b576200089b62003d0f565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620008fc565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620009359062003d69565b9150506200086c565b50919392505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000762576200076262002340565b5f83815b602081101562000a5b57600163ffffffff8516821c81169003620009f757848160208110620009b857620009b862003d0f565b602002013582604051602001620009d9929190918252602082015260400190565b60405160208183030381529060405280519060200120915062000a46565b8185826020811062000a0d5762000a0d62003d0f565b602002013560405160200162000a2d929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062000a528162003d69565b91505062000985565b50949350505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b30836040518060200162000af890620036e9565b601f1982820381018352601f90910116604081905262000b25908d908d908d908d908d9060200162003dcc565b60408051601f198184030181529082905262000b45929160200162003e30565b6040516020818303038152906040528051906020012060405160200162000bce94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b606e546001600160a01b031662000c37576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606e546040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018690526001600160a01b0390911690639dc29fac906044015f604051808303815f87803b15801562000c9a575f80fd5b505af115801562000cad573d5f803e3d5ffd5b5050505062000cc186868686868662002258565b505050505050565b6068545f908190610100900463ffffffff1615801562000cef575063ffffffff83166001145b1562000d03575063ffffffff831662000d2f565b62000d1a64010000000063ffffffff851662003e62565b62000d2c9063ffffffff861662003e7c565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000d96576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161462000de0576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000ee78c8c8c8c8c62000ee15f8e8e8e8e8e8e8e60405162000e0592919062003e92565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62002409565b6001600160a01b0386166200105657606e546001600160a01b031662000fd4575f6001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000f40576020820181803683370190505b5060405162000f50919062003ece565b5f6040518083038185875af1925050503d805f811462000f8c576040519150601f19603f3d011682016040523d82523d5f602084013e62000f91565b606091505b505090508062000fcd576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50620013e3565b606e546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015260248201869052909116906340c10f19906044015f604051808303815f87803b15801562001039575f80fd5b505af11580156200104c573d5f803e3d5ffd5b50505050620013e3565b606d546001600160a01b038781169116148015620010965750606d5463ffffffff8881167401000000000000000000000000000000000000000090920416145b15620010af575f6001600160a01b038516848262000f15565b60685463ffffffff610100909104811690881603620010e457620010de6001600160a01b0387168585620025e1565b620013e3565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b03168062001367575f80806200118b8688018862003fa1565b9250925092505f85848484604051620011a490620036e9565b620011b2939291906200404a565b8190604051809103905ff5905080158015620011d0573d5f803e3d5ffd5b506040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562001236575f80fd5b505af115801562001249573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b6040516200135595949392919062004086565b60405180910390a150505050620013e0565b6040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b158015620013c8575f80fd5b505af1158015620013db573d5f803e3d5ffd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156200148b576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200149562002691565b60685463ffffffff610100909104811690881603620014e0576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f806060876001600160a01b03881662001563578834146200152e576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d546001600160a01b038116945074010000000000000000000000000000000000000000900463ffffffff169250620018a2565b34156200159c576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606e546001600160a01b03908116908916036200162f576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018a90526001600160a01b03891690639dc29fac906044015f604051808303815f87803b15801562001612575f80fd5b505af115801562001625573d5f803e3d5ffd5b50505050620018a2565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620016fe576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b90526001600160a01b038a1690639dc29fac906044015f604051808303815f87803b158015620016d4575f80fd5b505af1158015620016e7573d5f803e3d5ffd5b5050505080602001519450805f01519350620018a0565b8515620017135762001713898b898962002706565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa15801562001771573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620017979190620040c0565b9050620017b06001600160a01b038b1633308e62002bb1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa1580156200180e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620018349190620040c0565b9050620018428282620040d8565b6068548c9850610100900463ffffffff1696509350620018628762002c04565b6200186d8c62002d0b565b620018788d62002e07565b6040516020016200188c939291906200404a565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620018e3989796959493929190620040ee565b60405180910390a1620019db620019d55f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62002ef2565b8615620019ec57620019ec62002340565b50505050620019fa60018055565b50505050505050565b5f54610100900460ff161580801562001a2257505f54600160ff909116105b8062001a3d5750303b15801562001a3d57505f5460ff166001145b62001acf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801562001b2c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8916027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016848316179055606d541662001c3157606d5474010000000000000000000000000000000000000000900463ffffffff161562001c2b576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001d63565b606d805463ffffffff861674010000000000000000000000000000000000000000027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b038816171790556040515f9060129062001c9890620036e9565b6060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff909116604082015260e0018190604051809103905ff590508015801562001d29573d5f803e3d5ffd5b50606e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790555b62001d6d62003007565b801562000cc1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b606c546001600160a01b0316331462001e1c576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000762620030a9565b60685460ff161562001e64576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161462001eae576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001ed48c8c8c8c8c62000ee160018e8e8e8e8e8e8e60405162000e0592919062003e92565b606e545f906001600160a01b031662001fbd57846001600160a01b031684888a868660405160240162001f0b949392919062004159565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f2000000000000000000000000000000000000000000000000000000001790525162001f70919062003ece565b5f6040518083038185875af1925050503d805f811462001fac576040519150601f19603f3d011682016040523d82523d5f602084013e62001fb1565b606091505b50508091505062002107565b606e546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260248201879052909116906340c10f19906044015f604051808303815f87803b15801562002022575f80fd5b505af115801562002035573d5f803e3d5ffd5b50505050846001600160a01b0316878985856040516024016200205c949392919062004159565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f20000000000000000000000000000000000000000000000000000000017905251620020c1919062003ece565b5f604051808303815f865af19150503d805f8114620020fc576040519150601f19603f3d011682016040523d82523d5f602084013e62002101565b606091505b50909150505b806200213f576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f81620021b986868662000981565b1490505b949350505050565b60685460ff161562002203576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff610100909104811690871603620022a3576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051620022f99998979695949392919062004193565b60405180910390a162002334620019d56001606860019054906101000a900463ffffffff16338a8a8a898960405162000e0592919062003e92565b821562000cc15762000cc15b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d620023b962000862565b6040518263ffffffff1660e01b8152600401620023d891815260200190565b5f604051808303815f87803b158015620023f0575f80fd5b505af115801562002403573d5f803e3d5ffd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af11580156200249b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620024c19190620040c0565b9050805f03620024fc576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80680100000000000000008716600103620025605786915062002523848a8489620021aa565b6200255a576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620025ca565b602087901c6200257281600162004200565b91508792506200259162002588868c8662000981565b8a8389620021aa565b620025c8576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b620025d6828262003138565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526200268c9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262003200565b505050565b600260015403620026ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001ac6565b6002600155565b5f62002716600482848662004227565b620027219162004250565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002967575f80808080808062002783896004818d62004227565b81019062002792919062004299565b9650965096509650965096509650336001600160a01b0316876001600160a01b031614620027ec576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03861630146200282f576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002869576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002917919062003ece565b5f604051808303815f865af19150503d805f811462002952576040519150601f19603f3d011682016040523d82523d5f602084013e62002957565b606091505b505050505050505050506200085b565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c0000000000000000000000000000000000000000000000000000000014620029e3576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80808080808080620029fa8a6004818e62004227565b81019062002a099190620042ef565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462002a65576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038716301462002aa8576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002b5f919062003ece565b5f604051808303815f865af19150503d805f811462002b9a576040519150601f19603f3d011682016040523d82523d5f602084013e62002b9f565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052620024039085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002627565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b0386169162002c7a919062003ece565b5f60405180830381855afa9150503d805f811462002cb4576040519150601f19603f3d011682016040523d82523d5f602084013e62002cb9565b606091505b50915091508162002d00576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250620021bd565b620021bd8162003305565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b0386169162002d81919062003ece565b5f60405180830381855afa9150503d805f811462002dbb576040519150601f19603f3d011682016040523d82523d5f602084013e62002dc0565b606091505b50915091508162002d00576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250620021bd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b0386169162002e7c919062003ece565b5f60405180830381855afa9150503d805f811462002eb6576040519150601f19603f3d011682016040523d82523d5f602084013e62002ebb565b606091505b509150915081801562002ecf575080516020145b62002edc576012620021bd565b80806020019051810190620021bd919062004376565b80600162002f0360206002620044cb565b62002f0f9190620040d8565b6053541062002f4a576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462002f5b9062003d69565b918290555090505f5b602081101562002ff6578082901c60011660010362002f9c57826033826020811062002f945762002f9462003d0f565b015550505050565b6033816020811062002fb25762002fb262003d0f565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062002fed9062003d69565b91505062002f64565b506200268c620044d8565b60018055565b5f54610100900460ff166200309f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001ac6565b62000762620034f0565b60685460ff16620030e6576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b6068545f90610100900463ffffffff161580156200315c575063ffffffff82166001145b1562003170575063ffffffff82166200319c565b6200318764010000000063ffffffff841662003e62565b620031999063ffffffff851662003e7c565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620019fa576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62003256826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620035889092919063ffffffff16565b8051909150156200268c578080602001905181019062003277919062004505565b6200268c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001ac6565b60606040825110620033275781806020019051810190620007f3919062004523565b8151602003620034b2575f5b6020811080156200337e575082818151811062003354576200335462003d0f565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620033995780620033908162003d69565b91505062003333565b805f03620033dc57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115620033f957620033f962003ea1565b6040519080825280601f01601f19166020018201604052801562003424576020820181803683370190505b5090505f5b82811015620034aa5784818151811062003447576200344762003d0f565b602001015160f81c60f81b82828151811062003467576200346762003d0f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620034a18162003d69565b91505062003429565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b5f54610100900460ff1662003001576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001ac6565b6060620021bd84845f85855f80866001600160a01b03168587604051620035b0919062003ece565b5f6040518083038185875af1925050503d805f8114620035ec576040519150601f19603f3d011682016040523d82523d5f602084013e620035f1565b606091505b509150915062003604878383876200360f565b979650505050505050565b606083156200369c5782515f0362003694576001600160a01b0385163b62003694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001ac6565b5081620021bd565b620021bd8383815115620036b35781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001ac691906200459e565b6119a180620045b383390190565b803563ffffffff81168114620034eb575f80fd5b6001600160a01b038116811462003720575f80fd5b50565b5f806040838503121562003735575f80fd5b6200374083620036f7565b9150602083013562003752816200370b565b809150509250929050565b801515811462003720575f80fd5b5f8083601f8401126200377c575f80fd5b50813567ffffffffffffffff81111562003794575f80fd5b602083019150836020828501011115620037ac575f80fd5b9250929050565b5f805f805f60808688031215620037c8575f80fd5b620037d386620036f7565b94506020860135620037e5816200370b565b93506040860135620037f7816200375d565b9250606086013567ffffffffffffffff81111562003813575f80fd5b62003821888289016200376b565b969995985093965092949392505050565b5f6020828403121562003843575f80fd5b813562003850816200370b565b9392505050565b60ff8116811462003720575f80fd5b5f805f805f805f60e0888a0312156200387d575f80fd5b87356200388a8162003857565b96506200389a60208901620036f7565b95506040880135620038ac816200370b565b9450620038bc60608901620036f7565b93506080880135620038ce816200370b565b9699959850939692959460a0840135945060c09093013592915050565b5f60208284031215620038fc575f80fd5b5035919050565b806104008101831015620007f3575f80fd5b5f805f610440848603121562003929575f80fd5b833592506200393c856020860162003903565b91506200394d6104208501620036f7565b90509250925092565b5f805f805f805f60a0888a0312156200396d575f80fd5b6200397888620036f7565b965060208801356200398a816200370b565b9550604088013567ffffffffffffffff80821115620039a7575f80fd5b620039b58b838c016200376b565b909750955060608a0135915080821115620039ce575f80fd5b50620039dd8a828b016200376b565b9094509250506080880135620039f38162003857565b8091505092959891949750929550565b5f805f805f8060a0878903121562003a19575f80fd5b62003a2487620036f7565b9550602087013562003a36816200370b565b945060408701359350606087013562003a4f816200375d565b9250608087013567ffffffffffffffff81111562003a6b575f80fd5b62003a7989828a016200376b565b979a9699509497509295939492505050565b5f806040838503121562003a9d575f80fd5b62003aa883620036f7565b915062003ab860208401620036f7565b90509250929050565b5f805f805f805f805f805f806109208d8f03121562003ade575f80fd5b62003aea8e8e62003903565b9b5062003afc8e6104008f0162003903565b9a506108008d013599506108208d013598506108408d0135975062003b256108608e01620036f7565b965062003b376108808e01356200370b565b6108808d0135955062003b4e6108a08e01620036f7565b945062003b606108c08e01356200370b565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111562003b8a575f80fd5b62003b9d8e6109008f01358f016200376b565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121562003bcc575f80fd5b62003bd788620036f7565b9650602088013562003be9816200370b565b955060408801359450606088013562003c02816200370b565b9350608088013562003c14816200375d565b925060a088013567ffffffffffffffff81111562003c30575f80fd5b62003c3e8a828b016200376b565b989b979a50959850939692959293505050565b5f805f805f60a0868803121562003c66575f80fd5b62003c7186620036f7565b9450602086013562003c83816200370b565b935062003c9360408701620036f7565b9250606086013562003ca5816200370b565b9150608086013562003cb7816200370b565b809150509295509295909350565b5f805f80610460858703121562003cda575f80fd5b8435935062003ced866020870162003903565b925062003cfe6104208601620036f7565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003d9c5762003d9c62003d3c565b5060010190565b81835281816020850137505f602082840101525f6020601f19601f840116840101905092915050565b606081525f62003de160608301878962003da3565b828103602084015262003df681868862003da3565b91505060ff831660408301529695505050505050565b5f5b8381101562003e2857818101518382015260200162003e0e565b50505f910152565b5f835162003e4381846020880162003e0c565b83519083019062003e5981836020880162003e0c565b01949350505050565b8082028115828204841417620007f357620007f362003d3c565b80820180821115620007f357620007f362003d3c565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f825162003ee181846020870162003e0c565b9190910192915050565b604051601f8201601f1916810167ffffffffffffffff8111828210171562003f175762003f1762003ea1565b604052919050565b5f67ffffffffffffffff82111562003f3b5762003f3b62003ea1565b50601f01601f191660200190565b5f82601f83011262003f59575f80fd5b813562003f7062003f6a8262003f1f565b62003eeb565b81815284602083860101111562003f85575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003fb4575f80fd5b833567ffffffffffffffff8082111562003fcc575f80fd5b62003fda8783880162003f49565b9450602086013591508082111562003ff0575f80fd5b5062003fff8682870162003f49565b9250506040840135620040128162003857565b809150509250925092565b5f81518084526200403681602086016020860162003e0c565b601f01601f19169290920160200192915050565b606081525f6200405e60608301866200401d565b82810360208401526200407281866200401d565b91505060ff83166040830152949350505050565b63ffffffff861681525f6001600160a01b038087166020840152808616604084015250608060608301526200360460808301848662003da3565b5f60208284031215620040d1575f80fd5b5051919050565b81810381811115620007f357620007f362003d3c565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c085015262004140828501876200401d565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f6200418960608301848662003da3565b9695505050505050565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620041e6828501878962003da3565b925080851660e085015250509a9950505050505050505050565b63ffffffff81811683821601908082111562004220576200422062003d3c565b5092915050565b5f808585111562004236575f80fd5b8386111562004243575f80fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620042915780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215620042b0575f80fd5b8735620042bd816200370b565b96506020880135620042cf816200370b565b955060408801359450606088013593506080880135620038ce8162003857565b5f805f805f805f80610100898b03121562004308575f80fd5b883562004315816200370b565b9750602089013562004327816200370b565b96506040890135955060608901359450608089013562004347816200375d565b935060a0890135620043598162003857565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004387575f80fd5b8151620038508162003857565b600181815b80851115620043f357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620043d757620043d762003d3c565b80851615620043e557918102915b93841c939080029062004399565b509250929050565b5f826200440b57506001620007f3565b816200441957505f620007f3565b81600181146200443257600281146200443d576200445d565b6001915050620007f3565b60ff84111562004451576200445162003d3c565b50506001821b620007f3565b5060208310610133831016604e8410600b841016171562004482575081810a620007f3565b6200448e838362004394565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620044c357620044c362003d3c565b029392505050565b5f620038508383620043fb565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6020828403121562004516575f80fd5b815162003850816200375d565b5f6020828403121562004534575f80fd5b815167ffffffffffffffff8111156200454b575f80fd5b8201601f810184136200455c575f80fd5b80516200456d62003f6a8262003f1f565b81815285602083850101111562004582575f80fd5b6200459582602083016020860162003e0c565b95945050505050565b602081525f6200385060208301846200401d56fe61010060405234801562000011575f80fd5b50604051620019a1380380620019a1833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516115036200049e5f395f61022d01525f81816102fb015281816105ad015261067a01525f61052801525f818161036d01526104f201526115035ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b6040516101879190611255565b60405180910390f35b6101a361019e3660046112e6565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461130e565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d3660046112e6565b61054a565b6102856102803660046112e6565b610595565b005b6101b7610295366004611347565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca366004611347565b60056020525f908152604090205481565b61017a610653565b6102856102f13660046112e6565b610662565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a36103503660046112e6565b610717565b6101a36103633660046112e6565b6107cd565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d366004611367565b6107da565b6101b76103b03660046113d4565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611405565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611405565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610ad7565b60019150505b92915050565b5f336104d9858285610c56565b6104e4858585610d12565b506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146105255761052046610f31565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c09082908690610590908790611483565b610ad7565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106455760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61064f8282610ff8565b5050565b60606004805461043290611405565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461070d5760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d42726964676500000000000000000000000000000000606482015260840161063c565b61064f82826110cf565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107c05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161063c565b6104e48286868403610ad7565b5f336104c0818585610d12565b8342111561084f5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d697400000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866108a883611496565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6109126104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156109d3573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610a4e57508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610ac05760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e617475726500000000000000000000000000000000000000000000000000606482015260840161063c565b610acb8a8a8a610ad7565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610b5f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610be85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d0c5781811015610cff5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161063c565b610d0c8484848403610ad7565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610d9b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610e245760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610ebf5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610d0c565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610f5b610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff821661105b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161063c565b8060025f82825461106c9190611483565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166111585760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260208190526040902054818110156111f35760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610c49565b5f6020808352835180828501525f5b8181101561128057858101830151858201604001528201611264565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146112e1575f80fd5b919050565b5f80604083850312156112f7575f80fd5b611300836112be565b946020939093013593505050565b5f805f60608486031215611320575f80fd5b611329846112be565b9250611337602085016112be565b9150604084013590509250925092565b5f60208284031215611357575f80fd5b611360826112be565b9392505050565b5f805f805f805f60e0888a03121561137d575f80fd5b611386886112be565b9650611394602089016112be565b95506040880135945060608801359350608088013560ff811681146113b7575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f80604083850312156113e5575f80fd5b6113ee836112be565b91506113fc602084016112be565b90509250929050565b600181811c9082168061141957607f821691505b602082108103611450577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c6611456565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036114c6576114c6611456565b506001019056fea2646970667358221220176a1a9cf4a702d3853b858873fff4a6370c4e5d7d72d68593ec0ebe64fcc26964736f6c63430008140033a26469706673582212209002ffc0c7cb9056d22d47ac65cf05714a8ae8ce0af7e882f7e68b9fdede830e64736f6c63430008140033" }, { "contractName": "PolygonZkEVMBridge proxy", "balance": "340282366920938463463374607431768211455", "nonce": "1", - "address": "0xc9510b46d0D59b7A5E6CdE2cF2C0Bfa7Fa25fFD4", + "address": "0x40E0576c0A7dff9dc460B29ba73e79aBf73dD2a9", "bytecode": "0x60806040526004361061005d575f3560e01c80635c60da1b116100425780635c60da1b146100a65780638f283970146100e3578063f851a440146101025761006c565b80633659cfe6146100745780634f1ef286146100935761006c565b3661006c5761006a610116565b005b61006a610116565b34801561007f575f80fd5b5061006a61008e366004610854565b610130565b61006a6100a136600461086d565b610178565b3480156100b1575f80fd5b506100ba6101eb565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee575f80fd5b5061006a6100fd366004610854565b610228565b34801561010d575f80fd5b506100ba610255565b61011e610282565b61012e610129610359565b610362565b565b610138610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d8160405180602001604052805f8152505f6103bf565b50565b61016d610116565b610180610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101e3576101de8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250600192506103bf915050565b505050565b6101de610116565b5f6101f4610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610359565b905090565b610225610116565b90565b610230610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d816103e9565b5f61025e610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610380565b61028a610380565b73ffffffffffffffffffffffffffffffffffffffff16330361012e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b5f61021861044a565b365f80375f80365f845af43d5f803e80801561037c573d5ff35b3d5ffd5b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b6103c883610471565b5f825111806103d45750805b156101de576103e383836104bd565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f610412610380565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a161016d816104e9565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103a3565b61047a816105f5565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606104e28383604051806060016040528060278152602001610977602791396106c0565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811661058c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610350565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b73ffffffffffffffffffffffffffffffffffffffff81163b610699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610350565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105af565b60605f808573ffffffffffffffffffffffffffffffffffffffff16856040516106e9919061090b565b5f60405180830381855af49150503d805f8114610721576040519150601f19603f3d011682016040523d82523d5f602084013e610726565b606091505b509150915061073786838387610741565b9695505050505050565b606083156107d65782515f036107cf5773ffffffffffffffffffffffffffffffffffffffff85163b6107cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610350565b50816107e0565b6107e083836107e8565b949350505050565b8151156107f85781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103509190610926565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f575f80fd5b919050565b5f60208284031215610864575f80fd5b6104e28261082c565b5f805f6040848603121561087f575f80fd5b6108888461082c565b9250602084013567ffffffffffffffff808211156108a4575f80fd5b818601915086601f8301126108b7575f80fd5b8135818111156108c5575f80fd5b8760208285010111156108d6575f80fd5b6020830194508093505050509250925092565b5f5b838110156109035781810151838201526020016108eb565b50505f910152565b5f825161091c8184602087016108e9565b9190910192915050565b602081525f82518060208401526109448160408501602087016108e9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212202ac98acbfbb3d3ac1b74050e18c4e76db25a3ff2801ec69bf85d0c61414d502b64736f6c63430008140033", "storage": { - "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000eed3e59b4cbe530f20e1ac79fa877ce33d8cf805", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000002b4d7418689c91b81a8d7114f8f4bfeb5f96cf4e" + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000fadb60b5059e31614e02083ff6c021a24c31c891", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000007cd6d5063c7782d34e2b1b03ed89ecf4a1412148" } }, { "contractName": "PolygonZkEVMGlobalExitRootL2 implementation", "balance": "0", "nonce": "1", - "address": "0xE641334b752d435a5133f64c6DBAB34431A9B9DC", - "bytecode": "0x608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301fd90441461004e578063257b36321461006a57806333d6247d14610089578063a3c573eb1461009e575b5f80fd5b61005760015481565b6040519081526020015b60405180910390f35b61005761007836600461015e565b5f6020819052908152604090205481565b61009c61009736600461015e565b6100ea565b005b6100c57f000000000000000000000000c9510b46d0d59b7a5e6cde2cf2c0bfa7fa25ffd481565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610061565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c9510b46d0d59b7a5e6cde2cf2c0bfa7fa25ffd41614610159576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b5f6020828403121561016e575f80fd5b503591905056fea26469706673582212205108c6c4f924146b736832a1bdf696e20d900450207b7452462368d150f2c71c64736f6c63430008140033" + "address": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9", + "bytecode": "0x608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301fd90441461004e578063257b36321461006a57806333d6247d14610089578063a3c573eb1461009e575b5f80fd5b61005760015481565b6040519081526020015b60405180910390f35b61005761007836600461015e565b5f6020819052908152604090205481565b61009c61009736600461015e565b6100ea565b005b6100c57f00000000000000000000000040e0576c0a7dff9dc460b29ba73e79abf73dd2a981565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610061565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000040e0576c0a7dff9dc460b29ba73e79abf73dd2a91614610159576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b5f6020828403121561016e575f80fd5b503591905056fea26469706673582212205108c6c4f924146b736832a1bdf696e20d900450207b7452462368d150f2c71c64736f6c63430008140033" }, { "contractName": "PolygonZkEVMGlobalExitRootL2 proxy", @@ -53,26 +53,26 @@ "address": "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa", "bytecode": "0x60806040523661001357610011610017565b005b6100115b61001f6101b7565b6001600160a01b0316336001600160a01b0316141561016f5760606001600160e01b031960003516631b2ce7f360e11b8114156100655761005e6101ea565b9150610167565b6001600160e01b0319811663278f794360e11b14156100865761005e610241565b6001600160e01b031981166308f2839760e41b14156100a75761005e610287565b6001600160e01b031981166303e1469160e61b14156100c85761005e6102b8565b6001600160e01b03198116635c60da1b60e01b14156100e95761005e6102f8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b61017761030c565b565b606061019e83836040518060600160405280602781526020016108576027913961031c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101f4610394565b600061020336600481846106a2565b81019061021091906106e8565b905061022d8160405180602001604052806000815250600061039f565b505060408051602081019091526000815290565b606060008061025336600481846106a2565b8101906102609190610719565b915091506102708282600161039f565b604051806020016040528060008152509250505090565b6060610291610394565b60006102a036600481846106a2565b8101906102ad91906106e8565b905061022d816103cb565b60606102c2610394565b60006102cc6101b7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b6060610302610394565b60006102cc610422565b610177610317610422565b610431565b6060600080856001600160a01b0316856040516103399190610807565b600060405180830381855af49150503d8060008114610374576040519150601f19603f3d011682016040523d82523d6000602084013e610379565b606091505b509150915061038a86838387610455565b9695505050505050565b341561017757600080fd5b6103a8836104d3565b6000825111806103b55750805b156103c6576103c48383610179565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103f46101b7565b604080516001600160a01b03928316815291841660208301520160405180910390a161041f81610513565b50565b600061042c6105bc565b905090565b3660008037600080366000845af43d6000803e808015610450573d6000f35b3d6000fd5b606083156104c15782516104ba576001600160a01b0385163b6104ba5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161015e565b50816104cb565b6104cb83836105e4565b949350505050565b6104dc8161060e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105785760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161015e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101db565b8151156105f45781518083602001fd5b8060405162461bcd60e51b815260040161015e9190610823565b6001600160a01b0381163b61067b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161015e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61059b565b600080858511156106b257600080fd5b838611156106bf57600080fd5b5050820193919092039150565b80356001600160a01b03811681146106e357600080fd5b919050565b6000602082840312156106fa57600080fd5b61019e826106cc565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561072c57600080fd5b610735836106cc565b9150602083013567ffffffffffffffff8082111561075257600080fd5b818501915085601f83011261076657600080fd5b81358181111561077857610778610703565b604051601f8201601f19908116603f011681019083821181831017156107a0576107a0610703565b816040528281528860208487010111156107b957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107f65781810151838201526020016107de565b838111156103c45750506000910152565b600082516108198184602087016107db565b9190910192915050565b60208152600082518060208401526108428160408501602087016107db565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122012bb4f564f73959a03513dc74fc3c6e40e8386e6f02c16b78d6db00ce0aa16af64736f6c63430008090033", "storage": { - "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000eed3e59b4cbe530f20e1ac79fa877ce33d8cf805", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x000000000000000000000000e641334b752d435a5133f64c6dbab34431a9b9dc" + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000fadb60b5059e31614e02083ff6c021a24c31c891", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9" } }, { "contractName": "PolygonZkEVMTimelock", "balance": "0", "nonce": "1", - "address": "0xDEAd72Fd97a579E98AEF2F9EB190066E1858D15a", + "address": "0x0165878A594ca255338adfa4d48449f69242Eb8F", "bytecode": "0x6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220d904e0b10230579952f8427a107aa4349f9a1f5799108d399b11e28b578463e464736f6c63430008140033", "storage": { "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000e10", - "0xa35b5405ab15b96b03cc591647476727d852994a412b5030df6fc27d6663ae98": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x3068bd570ea4e7d974748b6421609a672ffc2752a61ba3a01cab0651ae1ac36d": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xaedcc9e7897c0d335bdc5d92fe3a8b4f23727fe558cd1c19f332b28716a30559": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xf5e61edb9c9cc6bfbae4463e9a2b1dd6ac3b44ddef38f18016e56ba0363910d9": "0x0000000000000000000000000000000000000000000000000000000000000001", "0x64494413541ff93b31aa309254e3fed72a7456e9845988b915b4c7a7ceba8814": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", - "0x555ccfd2adedd3617807cc741088518e69e1b40eeadcc863c31e3de2eeb454dd": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x60b9d94c75b7b3f721925089391e4644cd890cb5e6466f9596dfbd2c54e0b280": "0x0000000000000000000000000000000000000000000000000000000000000001", "0x3412d5605ac6cd444957cedb533e5dacad6378b4bc819ebe3652188a665066d6": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", - "0xba259d66f4dd33fbb3dec88075da2b4d0684440fd415c1f24df79a0258ca9e62": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x4b63b79f1e338a49559dcd3193ac9eecc50d0f275d24e97cc8c319e5a31a8bd0": "0x0000000000000000000000000000000000000000000000000000000000000001", "0xdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d706a": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", - "0xd449b9dacab93eed6e33b971a4f75b09702709f5b92088a7d361838e246a3556": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x800d5dfe4bba53eedee06cd4546a27da8de00f12db83f56062976d4493fda899": "0x0000000000000000000000000000000000000000000000000000000000000001", "0xc3ad33e20b0c56a223ad5104fff154aa010f8715b9c981fd38fdc60a4d1a52fc": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5" } }, @@ -80,13 +80,13 @@ "accountName": "keyless Deployer", "balance": "0", "nonce": "1", - "address": "0x6c989E3859D248fEF40669B95a7d1dd45DAC1848" + "address": "0x694AB5383a002a4796f95530c14Cf0C25ec3EA03" }, { "accountName": "deployer", - "balance": "0", + "balance": "100000000000000000000000", "nonce": "8", - "address": "0x0cae25c8623761783Fe4CE241C9b428126A7612A" + "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" } ] } \ No newline at end of file diff --git a/docker/scripts/deploy-docker.sh b/docker/scripts/deploy-docker.sh deleted file mode 100755 index a2001bfe8..000000000 --- a/docker/scripts/deploy-docker.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -sudo rm -rf docker/gethData/geth_data -rm deployment/deploy_ongoing.json -DEV_PERIOD=1 docker-compose -f docker/docker-compose.geth.yml up -d geth -sleep 5 -node docker/scripts/fund-accounts.js -cp docker/scripts/deploy_parameters_docker.json deployment/deploy_parameters.json -cp docker/scripts/genesis_docker.json deployment/genesis.json -npx hardhat run deployment/testnet/prepareTestnet.js --network localhost -npx hardhat run deployment/2_deployPolygonZKEVMDeployer.js --network localhost -npx hardhat run deployment/3_deployContracts.js --network localhost -mkdir docker/deploymentOutput -mv deployment/deploy_output.json docker/deploymentOutput -docker-compose -f docker/docker-compose.geth.yml down -sudo docker build -t hermeznetwork/geth-zkevm-contracts -f docker/Dockerfile.geth . -# Let it readable for the multiplatform build coming later! -sudo chmod -R go+rxw docker/gethData diff --git a/docker/scripts/deploy-dockerv2.sh b/docker/scripts/deploy-dockerv2.sh deleted file mode 100644 index aae943c2c..000000000 --- a/docker/scripts/deploy-dockerv2.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -sudo rm -rf docker/gethData/geth_data -DEV_PERIOD=1 docker compose -f docker/docker-compose.geth.yml up -d geth -sleep 5 -node docker/scripts/fund-accounts.js -cp docker/scripts/deploy_parameters_docker.json deployment/deploy_parameters.json -cp docker/scripts/genesis_docker.json deployment/genesis.json -npx hardhat run deployment/testnet/prepareTestnet.js --network localhost -npx hardhat run deployment/2_deployPolygonZKEVMDeployer.js --network localhost -npx hardhat run deployment/3_deployContracts.js --network localhost -mkdir docker/deploymentOutput -mv deployment/deploy_output.json docker/deploymentOutput -docker compose -f docker/docker-compose.geth.yml down -sudo docker build -t hermeznetwork/geth-zkevm-contracts -f docker/Dockerfile.geth . -# Let it readable for the multiplatform build coming later! -sudo chmod -R go+rxw docker/gethData \ No newline at end of file diff --git a/docker/scripts/deploy_parameters_docker.json b/docker/scripts/deploy_parameters_docker.json deleted file mode 100644 index a07b4df0d..000000000 --- a/docker/scripts/deploy_parameters_docker.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "realVerifier": false, - "trustedSequencerURL": "http://zkevm-json-rpc:8123", - "networkName": "zkevm", - "version":"0.0.1", - "trustedSequencer":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "chainID": 1001, - "trustedAggregator":"0x70997970C51812dc3A010C7d01b50e0d17dc79C8", - "trustedAggregatorTimeout": 604799, - "pendingStateTimeout": 604799, - "forkID": 1, - "admin":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "zkEVMOwner": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "timelockAddress": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "minDelayTimelock": 10, - "salt": "0x0000000000000000000000000000000000000000000000000000000000000000", - "zkEVMDeployerAddress":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "initialZkEVMDeployerOwner" :"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "maticTokenAddress":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266" -} \ No newline at end of file diff --git a/docker/scripts/fund-accounts.js b/docker/scripts/fund-accounts.js index 2ef00f700..adce4d2d0 100644 --- a/docker/scripts/fund-accounts.js +++ b/docker/scripts/fund-accounts.js @@ -8,13 +8,17 @@ const DEFAULT_NUM_ACCOUNTS = 20; async function main() { const MNEMONIC = process.env.MNEMONIC || DEFAULT_MNEMONIC; - const currentProvider = new ethers.providers.JsonRpcProvider('http://localhost:8545'); + const currentProvider = ethers.getDefaultProvider('http://localhost:8545'); const signerNode = await currentProvider.getSigner(); const numAccountsToFund = process.env.NUM_ACCOUNTS || DEFAULT_NUM_ACCOUNTS; for (let i = 0; i < numAccountsToFund; i++) { const pathWallet = `m/44'/60'/0'/0/${i}`; - const accountWallet = ethers.Wallet.fromMnemonic(MNEMONIC, pathWallet); + const accountWallet = ethers.HDNodeWallet.fromMnemonic( + ethers.Mnemonic.fromPhrase(MNEMONIC), + pathWallet + ) + const params = [{ from: await signerNode.getAddress(), to: accountWallet.address, diff --git a/docker/scripts/genesis_docker.json b/docker/scripts/genesis_docker.json deleted file mode 100644 index a3699f5c4..000000000 --- a/docker/scripts/genesis_docker.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "root": "0xd88680f1b151dd67518f9aca85161424c0cac61df2f5424a3ddc04ea25adecc7", - "genesis": [ - { - "contractName": "PolygonZkEVMDeployer", - "balance": "0", - "nonce": "4", - "address": "0x4b2700570f8426A24EA85e0324611E527BdD55B8", - "bytecode": "0x6080604052600436106100705760003560e01c8063715018a61161004e578063715018a6146100e65780638da5cb5b146100fb578063e11ae6cb14610126578063f2fde38b1461013957600080fd5b80632b79805a146100755780634a94d4871461008a5780636d07dbf81461009d575b600080fd5b610088610083366004610927565b610159565b005b6100886100983660046109c7565b6101cb565b3480156100a957600080fd5b506100bd6100b8366004610a1e565b61020d565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b50610088610220565b34801561010757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166100bd565b610088610134366004610a40565b610234565b34801561014557600080fd5b50610088610154366004610a90565b61029b565b610161610357565b600061016e8585856103d8565b905061017a8183610537565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a15050505050565b6101d3610357565b6101de83838361057b565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b90600090a1505050565b600061021983836105a9565b9392505050565b610228610357565b61023260006105b6565b565b61023c610357565b60006102498484846103d8565b60405173ffffffffffffffffffffffffffffffffffffffff821681529091507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a150505050565b6102a3610357565b73ffffffffffffffffffffffffffffffffffffffff811661034b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610354816105b6565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610232576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610342565b600083471015610444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610342565b81516000036104af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610342565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116610219576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610342565b6060610219838360006040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c6564000081525061062b565b60606105a1848484604051806060016040528060298152602001610b3d6029913961062b565b949350505050565b6000610219838330610744565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156106bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610342565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516106e69190610acf565b60006040518083038185875af1925050503d8060008114610723576040519150601f19603f3d011682016040523d82523d6000602084013e610728565b606091505b50915091506107398783838761076e565b979650505050505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b606083156108045782516000036107fd5773ffffffffffffffffffffffffffffffffffffffff85163b6107fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610342565b50816105a1565b6105a183838151156108195781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103429190610aeb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261088d57600080fd5b813567ffffffffffffffff808211156108a8576108a861084d565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156108ee576108ee61084d565b8160405283815286602085880101111561090757600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806080858703121561093d57600080fd5b8435935060208501359250604085013567ffffffffffffffff8082111561096357600080fd5b61096f8883890161087c565b9350606087013591508082111561098557600080fd5b506109928782880161087c565b91505092959194509250565b803573ffffffffffffffffffffffffffffffffffffffff811681146109c257600080fd5b919050565b6000806000606084860312156109dc57600080fd5b6109e58461099e565b9250602084013567ffffffffffffffff811115610a0157600080fd5b610a0d8682870161087c565b925050604084013590509250925092565b60008060408385031215610a3157600080fd5b50508035926020909101359150565b600080600060608486031215610a5557600080fd5b8335925060208401359150604084013567ffffffffffffffff811115610a7a57600080fd5b610a868682870161087c565b9150509250925092565b600060208284031215610aa257600080fd5b6102198261099e565b60005b83811015610ac6578181015183820152602001610aae565b50506000910152565b60008251610ae1818460208701610aab565b9190910192915050565b6020815260008251806020840152610b0a816040850160208701610aab565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a26469706673582212203e70ce334e8ec9d8d03e87415afd36dce4e82633bd277b08937095a6bd66367764736f6c63430008110033", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" - } - }, - { - "contractName": "ProxyAdmin", - "balance": "0", - "nonce": "1", - "address": "0xf065BaE7C019ff5627E09ed48D4EeA317D211956", - "bytecode": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461012b57806399a88ec41461013e578063f2fde38b1461015e578063f3b7dead1461017e57600080fd5b8063204e1c7a14610080578063715018a6146100c95780637eff275e146100e05780638da5cb5b14610100575b600080fd5b34801561008c57600080fd5b506100a061009b366004610608565b61019e565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100d557600080fd5b506100de610255565b005b3480156100ec57600080fd5b506100de6100fb36600461062c565b610269565b34801561010c57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166100a0565b6100de610139366004610694565b6102f7565b34801561014a57600080fd5b506100de61015936600461062c565b61038c565b34801561016a57600080fd5b506100de610179366004610608565b6103e8565b34801561018a57600080fd5b506100a0610199366004610608565b6104a4565b60008060008373ffffffffffffffffffffffffffffffffffffffff166040516101ea907f5c60da1b00000000000000000000000000000000000000000000000000000000815260040190565b600060405180830381855afa9150503d8060008114610225576040519150601f19603f3d011682016040523d82523d6000602084013e61022a565b606091505b50915091508161023957600080fd5b8080602001905181019061024d9190610788565b949350505050565b61025d6104f0565b6102676000610571565b565b6102716104f0565b6040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690638f283970906024015b600060405180830381600087803b1580156102db57600080fd5b505af11580156102ef573d6000803e3d6000fd5b505050505050565b6102ff6104f0565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef28690349061035590869086906004016107a5565b6000604051808303818588803b15801561036e57600080fd5b505af1158015610382573d6000803e3d6000fd5b5050505050505050565b6103946104f0565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690633659cfe6906024016102c1565b6103f06104f0565b73ffffffffffffffffffffffffffffffffffffffff8116610498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6104a181610571565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff166040516101ea907ff851a44000000000000000000000000000000000000000000000000000000000815260040190565b60005473ffffffffffffffffffffffffffffffffffffffff163314610267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161048f565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff811681146104a157600080fd5b60006020828403121561061a57600080fd5b8135610625816105e6565b9392505050565b6000806040838503121561063f57600080fd5b823561064a816105e6565b9150602083013561065a816105e6565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156106a957600080fd5b83356106b4816105e6565b925060208401356106c4816105e6565b9150604084013567ffffffffffffffff808211156106e157600080fd5b818601915086601f8301126106f557600080fd5b81358181111561070757610707610665565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561074d5761074d610665565b8160405282815289602084870101111561076657600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b60006020828403121561079a57600080fd5b8151610625816105e6565b73ffffffffffffffffffffffffffffffffffffffff8316815260006020604081840152835180604085015260005b818110156107ef578581018301518582016060015282016107d3565b5060006060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050939250505056fea2646970667358221220372a0e10eebea1b7fa43ae4c976994e6ed01d85eedc3637b83f01d3f06be442064736f6c63430008110033", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f" - } - }, - { - "contractName": "PolygonZkEVMBridge implementation", - "balance": "0", - "nonce": "1", - "address": "0xf23919bb44BCa81aeAb4586BE71Ee3fd4E99B951", - "bytecode": "0x6080604052600436106200019f5760003560e01c8063647c576c11620000e7578063be5831c71162000089578063dbc169761162000060578063dbc169761462000639578063ee25560b1462000651578063fb570834146200068257600080fd5b8063be5831c714620005ae578063cd58657914620005ea578063d02103ca146200060157600080fd5b80639e34070f11620000be5780639e34070f146200050a578063aaa13cc2146200054f578063bab161bf146200057457600080fd5b8063647c576c146200048657806379e2cf9714620004ab57806381b1c17414620004c357600080fd5b80632d2c9d94116200015157806334ac9cf2116200012857806334ac9cf2146200034b5780633ae05047146200037a5780633e197043146200039257600080fd5b80632d2c9d9414620002765780632dfdf0b5146200029b578063318aee3d14620002c257600080fd5b806322e95f2c116200018657806322e95f2c14620001ef578063240ff378146200023a5780632cffd02e146200025157600080fd5b806315064c9614620001a45780632072f6c514620001d5575b600080fd5b348015620001b157600080fd5b50606854620001c09060ff1681565b60405190151581526020015b60405180910390f35b348015620001e257600080fd5b50620001ed620006a7565b005b348015620001fc57600080fd5b50620002146200020e366004620032db565b62000705565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001cc565b620001ed6200024b36600462003372565b620007a8565b3480156200025e57600080fd5b50620001ed6200027036600462003409565b620009d0565b3480156200028357600080fd5b50620001ed6200029536600462003409565b62000f74565b348015620002a857600080fd5b50620002b360535481565b604051908152602001620001cc565b348015620002cf57600080fd5b5062000319620002e1366004620034ef565b606b6020526000908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001cc565b3480156200035857600080fd5b50606c54620002149073ffffffffffffffffffffffffffffffffffffffff1681565b3480156200038757600080fd5b50620002b362001178565b3480156200039f57600080fd5b50620002b3620003b136600462003526565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200049357600080fd5b50620001ed620004a5366004620035b0565b6200125e565b348015620004b857600080fd5b50620001ed620014ad565b348015620004d057600080fd5b5062000214620004e236600462003600565b606a6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200051757600080fd5b50620001c06200052936600462003600565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b3480156200055c57600080fd5b50620002146200056e3660046200361a565b620014e7565b3480156200058157600080fd5b506068546200059890610100900463ffffffff1681565b60405163ffffffff9091168152602001620001cc565b348015620005bb57600080fd5b506068546200059890790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001ed620005fb366004620036ce565b620016d3565b3480156200060e57600080fd5b50606854620002149065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200064657600080fd5b50620001ed62001c37565b3480156200065e57600080fd5b50620002b36200067036600462003600565b60696020526000908152604090205481565b3480156200068f57600080fd5b50620001c0620006a136600462003770565b62001c93565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006f9576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200070362001d7c565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091206000908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007e6576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8681166101009092041614806200080c5750600263ffffffff861610155b1562000844576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff163388883488886053546040516200089a9998979695949392919062003806565b60405180910390a1620009b8620009b26001606860019054906101000a900463ffffffff16338989348989604051620008d592919062003881565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b62001e10565b8215620009c957620009c962001f27565b5050505050565b60685460ff161562000a0e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000a258b8b8b8b8b8b8b8b8b8b8b600062001ffc565b73ffffffffffffffffffffffffffffffffffffffff861662000b01576040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a7a9190620038e6565b60006040518083038185875af1925050503d806000811462000ab9576040519150601f19603f3d011682016040523d82523d6000602084013e62000abe565b606091505b505090508062000afa576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000efc565b60685463ffffffff61010090910481169088160362000b435762000b3d73ffffffffffffffffffffffffffffffffffffffff87168585620021ed565b62000efc565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b166024820152600090603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e6e576000808062000c1886880188620039fb565b92509250925060008584848460405162000c329062003292565b62000c409392919062003abd565b8190604051809103906000f590508015801562000c61573d6000803e3d6000fd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f1990604401600060405180830381600087803b15801562000cd757600080fd5b505af115801562000cec573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e5c95949392919062003afa565b60405180910390a15050505062000ef9565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f1990604401600060405180830381600087803b15801562000edf57600080fd5b505af115801562000ef4573d6000803e3d6000fd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000fb2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000fc98b8b8b8b8b8b8b8b8b8b8b600162001ffc565b60008473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000ffc949392919062003b42565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200107f9190620038e6565b60006040518083038185875af1925050503d8060008114620010be576040519150601f19603f3d011682016040523d82523d6000602084013e620010c3565b606091505b5050905080620010ff576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b605354600090819081805b602081101562001255578083901c600116600103620011e65760338160208110620011b257620011b262003b8a565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062001213565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806200124c9062003be8565b91505062001183565b50919392505050565b600054610100900460ff16158080156200127f5750600054600160ff909116105b806200129b5750303b1580156200129b575060005460ff166001145b6200132d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200138c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001691841691909117905562001443620022c3565b8015620014a757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000703576200070362001f27565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201526000908190603801604051602081830303815290604052805190602001209050600060ff60f81b3083604051806020016200157d9062003292565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620015c8908d908d908d908d908d9060200162003c23565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001606929160200162003c64565b604051602081830303815290604052805190602001206040516020016200168f94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff161562001711576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200171b62002366565b60685463ffffffff888116610100909204161480620017415750600263ffffffff881610155b1562001779576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060608773ffffffffffffffffffffffffffffffffffffffff8816620017df57883414620017d5576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000925062001ad9565b341562001818576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089166000908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901562001908576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac90604401600060405180830381600087803b158015620018db57600080fd5b505af1158015620018f0573d6000803e3d6000fd5b50505050806020015194508060000151935062001ad7565b85156200191d576200191d898b8989620023db565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200198b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620019b1919062003c97565b9050620019d773ffffffffffffffffffffffffffffffffffffffff8b1633308e620028f9565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa15801562001a45573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a6b919062003c97565b905062001a79828262003cb1565b6068548c9850610100900463ffffffff169650935062001a998762002959565b62001aa48c62002a71565b62001aaf8d62002b7e565b60405160200162001ac39392919062003abd565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e868860535460405162001b1b98979695949392919062003cc7565b60405180910390a162001c0f620009b2600085878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b861562001c205762001c2062001f27565b5050505062001c2e60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c89576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200070362002c80565b600084815b602081101562001d6e57600163ffffffff8616821c8116900362001d0a5785816020811062001ccb5762001ccb62003b8a565b60200201358260405160200162001cec929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001d59565b8186826020811062001d205762001d2062003b8a565b602002013560405160200162001d40929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d658162003be8565b91505062001c98565b50821490505b949350505050565b60685460ff161562001dba576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b80600162001e216020600262003e79565b62001e2d919062003cb1565b6053541062001e68576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060536000815462001e7b9062003be8565b9182905550905060005b602081101562001f17578082901c60011660010362001ebd57826033826020811062001eb55762001eb562003b8a565b015550505050565b6033816020811062001ed35762001ed362003b8a565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001f0e9062003be8565b91505062001e85565b5062001f2262003e87565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001fad62001178565b6040518263ffffffff1660e01b815260040162001fcc91815260200190565b600060405180830381600087803b15801562001fe757600080fd5b505af1158015620014a7573d6000803e3d6000fd5b6200200d8b63ffffffff1662002d10565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b363200000000000000000000000000000000000000000000000000000000909252606481019190915260009165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303816000875af1158015620020b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620020d6919062003c97565b90508060000362002112576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff88811661010090920416146200215c576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606854600090610100900463ffffffff166200217a5750896200217d565b508a5b620021a66200219d848c8c8c8c8c8c8c604051620008d592919062003881565b8f8f8462001c93565b620021dd576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001f229084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002d75565b600054610100900460ff166200235c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001324565b6200070362002e88565b600260015403620023d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001324565b6002600155565b6000620023ec600482848662003eb6565b620023f79162003ee2565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620026765760008080808080806200245a896004818d62003eb6565b81019062002469919062003f2b565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614620024dd576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff861630146200252d576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002567576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620026229190620038e6565b6000604051808303816000865af19150503d806000811462002661576040519150601f19603f3d011682016040523d82523d6000602084013e62002666565b606091505b50505050505050505050620009c9565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c0000000000000000000000000000000000000000000000000000000014620026f2576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808080808080806200270a8a6004818e62003eb6565b81019062002719919062003f86565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146200278f576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87163014620027df576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f1691620028a39190620038e6565b6000604051808303816000865af19150503d8060008114620028e2576040519150601f19603f3d011682016040523d82523d6000602084013e620028e7565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014a79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002240565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691620029dd9190620038e6565b600060405180830381855afa9150503d806000811462002a1a576040519150601f19603f3d011682016040523d82523d6000602084013e62002a1f565b606091505b50915091508162002a66576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d74565b62001d748162002f21565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162002af59190620038e6565b600060405180830381855afa9150503d806000811462002b32576040519150601f19603f3d011682016040523d82523d6000602084013e62002b37565b606091505b50915091508162002a66576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d74565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169162002c019190620038e6565b600060405180830381855afa9150503d806000811462002c3e576040519150601f19603f3d011682016040523d82523d6000602084013e62002c43565b606091505b509150915081801562002c57575080516020145b62002c6457601262001d74565b8080602001905181019062001d74919062004012565b60018055565b60685460ff1662002cbd576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600881901c60008181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009c9576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600062002dd9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031119092919063ffffffff16565b80519091501562001f22578080602001905181019062002dfa919062004032565b62001f22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001324565b600054610100900460ff1662002c7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001324565b6060604082511062002f435781806020019051810190620007a2919062004052565b8151602003620030d35760005b60208110801562002f9b575082818151811062002f715762002f7162003b8a565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002fb6578062002fad8162003be8565b91505062002f50565b8060000362002ffa57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111562003018576200301862003891565b6040519080825280601f01601f19166020018201604052801562003043576020820181803683370190505b50905060005b82811015620030cb5784818151811062003067576200306762003b8a565b602001015160f81c60f81b82828151811062003087576200308762003b8a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080620030c28162003be8565b91505062003049565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d748484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051620031489190620038e6565b60006040518083038185875af1925050503d806000811462003187576040519150601f19603f3d011682016040523d82523d6000602084013e6200318c565b606091505b50915091506200319f87838387620031aa565b979650505050505050565b60608315620032455782516000036200323d5773ffffffffffffffffffffffffffffffffffffffff85163b6200323d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001324565b508162001d74565b62001d7483838151156200325c5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620013249190620040d2565b611b6680620040e883390190565b803563ffffffff811681146200310c57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620032d857600080fd5b50565b60008060408385031215620032ef57600080fd5b620032fa83620032a0565b915060208301356200330c81620032b5565b809150509250929050565b8015158114620032d857600080fd5b60008083601f8401126200333957600080fd5b50813567ffffffffffffffff8111156200335257600080fd5b6020830191508360208285010111156200336b57600080fd5b9250929050565b6000806000806000608086880312156200338b57600080fd5b6200339686620032a0565b94506020860135620033a881620032b5565b93506040860135620033ba8162003317565b9250606086013567ffffffffffffffff811115620033d757600080fd5b620033e58882890162003326565b969995985093965092949392505050565b806104008101831015620007a257600080fd5b60008060008060008060008060008060006105208c8e0312156200342c57600080fd5b620034388d8d620033f6565b9a50620034496104008d01620032a0565b99506104208c013598506104408c013597506200346a6104608d01620032a0565b96506104808c01356200347d81620032b5565b95506200348e6104a08d01620032a0565b94506104c08c0135620034a181620032b5565b93506104e08c013592506105008c013567ffffffffffffffff811115620034c757600080fd5b620034d58e828f0162003326565b915080935050809150509295989b509295989b9093969950565b6000602082840312156200350257600080fd5b81356200350f81620032b5565b9392505050565b60ff81168114620032d857600080fd5b600080600080600080600060e0888a0312156200354257600080fd5b87356200354f8162003516565b96506200355f60208901620032a0565b955060408801356200357181620032b5565b94506200358160608901620032a0565b935060808801356200359381620032b5565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215620035c657600080fd5b620035d184620032a0565b92506020840135620035e381620032b5565b91506040840135620035f581620032b5565b809150509250925092565b6000602082840312156200361357600080fd5b5035919050565b600080600080600080600060a0888a0312156200363657600080fd5b6200364188620032a0565b965060208801356200365381620032b5565b9550604088013567ffffffffffffffff808211156200367157600080fd5b6200367f8b838c0162003326565b909750955060608a01359150808211156200369957600080fd5b50620036a88a828b0162003326565b9094509250506080880135620036be8162003516565b8091505092959891949750929550565b600080600080600080600060c0888a031215620036ea57600080fd5b620036f588620032a0565b965060208801356200370781620032b5565b95506040880135945060608801356200372081620032b5565b93506080880135620037328162003317565b925060a088013567ffffffffffffffff8111156200374f57600080fd5b6200375d8a828b0162003326565b989b979a50959850939692959293505050565b60008060008061046085870312156200378857600080fd5b843593506200379b8660208701620033f6565b9250620037ac6104208601620032a0565b939692955092936104400135925050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600061010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620038678285018789620037bd565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b83811015620038dd578181015183820152602001620038c3565b50506000910152565b60008251620038fa818460208701620038c0565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156200394e576200394e62003891565b604052919050565b600067ffffffffffffffff82111562003973576200397362003891565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112620039b157600080fd5b8135620039c8620039c28262003956565b62003904565b818152846020838601011115620039de57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562003a1157600080fd5b833567ffffffffffffffff8082111562003a2a57600080fd5b62003a38878388016200399f565b9450602086013591508082111562003a4f57600080fd5b5062003a5e868287016200399f565b9250506040840135620035f58162003516565b6000815180845262003a8b816020860160208601620038c0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60608152600062003ad2606083018662003a71565b828103602084015262003ae6818662003a71565b91505060ff83166040830152949350505050565b63ffffffff86168152600073ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200319f608083018486620037bd565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff8416602082015260606040820152600062003b80606083018486620037bd565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003c1c5762003c1c62003bb9565b5060010190565b60608152600062003c39606083018789620037bd565b828103602084015262003c4e818688620037bd565b91505060ff831660408301529695505050505050565b6000835162003c78818460208801620038c0565b83519083019062003c8e818360208801620038c0565b01949350505050565b60006020828403121562003caa57600080fd5b5051919050565b81810381811115620007a257620007a262003bb9565b600061010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003d278285018762003a71565b925080851660e085015250509998505050505050505050565b600181815b8085111562003d9f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d835762003d8362003bb9565b8085161562003d9157918102915b93841c939080029062003d45565b509250929050565b60008262003db857506001620007a2565b8162003dc757506000620007a2565b816001811462003de0576002811462003deb5762003e0b565b6001915050620007a2565b60ff84111562003dff5762003dff62003bb9565b50506001821b620007a2565b5060208310610133831016604e8410600b841016171562003e30575081810a620007a2565b62003e3c838362003d40565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003e715762003e7162003bb9565b029392505050565b60006200350f838362003da7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000808585111562003ec757600080fd5b8386111562003ed557600080fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003f235780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a03121562003f4757600080fd5b873562003f5481620032b5565b9650602088013562003f6681620032b5565b955060408801359450606088013593506080880135620035938162003516565b600080600080600080600080610100898b03121562003fa457600080fd5b883562003fb181620032b5565b9750602089013562003fc381620032b5565b96506040890135955060608901359450608089013562003fe38162003317565b935060a089013562003ff58162003516565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200402557600080fd5b81516200350f8162003516565b6000602082840312156200404557600080fd5b81516200350f8162003317565b6000602082840312156200406557600080fd5b815167ffffffffffffffff8111156200407d57600080fd5b8201601f810184136200408f57600080fd5b8051620040a0620039c28262003956565b818152856020838501011115620040b657600080fd5b620040c9826020830160208601620038c0565b95945050505050565b6020815260006200350f602083018462003a7156fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a2646970667358221220d9b3ca7b13ec80ac58634ddf0ecebe71e209a71f532614949b9e720413f50c8364736f6c63430008110033" - }, - { - "contractName": "PolygonZkEVMBridge proxy", - "balance": "200000000000000000000000000", - "nonce": "1", - "address": "0xff0EE8ea08cEf5cb4322777F5CC3E8A584B8A4A0", - "bytecode": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100a85780638f283970146100e6578063f851a440146101065761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61011b565b005b61006b61011b565b34801561008157600080fd5b5061006b61009036600461088b565b610135565b61006b6100a33660046108a6565b61017f565b3480156100b457600080fd5b506100bd6101f3565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b5061006b61010136600461088b565b610231565b34801561011257600080fd5b506100bd61025e565b6101236102d4565b61013361012e6103ab565b6103b5565b565b61013d6103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481604051806020016040528060008152506000610419565b50565b61017461011b565b6101876103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101eb576101e68383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250610419915050565b505050565b6101e661011b565b60006101fd6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103ab565b905090565b61022e61011b565b90565b6102396103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481610444565b60006102686103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103d9565b60606102b183836040518060600160405280602781526020016109bb602791396104a5565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6102dc6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600061022161052a565b3660008037600080366000845af43d6000803e8080156103d4573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b61042283610552565b60008251118061042f5750805b156101e65761043e838361028c565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61046d6103d9565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a16101748161059f565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516104cf919061094d565b600060405180830381855af49150503d806000811461050a576040519150601f19603f3d011682016040523d82523d6000602084013e61050f565b606091505b5091509150610520868383876106ab565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103fd565b61055b81610753565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b73ffffffffffffffffffffffffffffffffffffffff8116610642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103a2565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b6060831561074157825160000361073a5773ffffffffffffffffffffffffffffffffffffffff85163b61073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103a2565b508161074b565b61074b838361081e565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff81163b6107f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e74726163740000000000000000000000000000000000000060648201526084016103a2565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610665565b81511561082e5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a29190610969565b803573ffffffffffffffffffffffffffffffffffffffff8116811461088657600080fd5b919050565b60006020828403121561089d57600080fd5b6102b182610862565b6000806000604084860312156108bb57600080fd5b6108c484610862565b9250602084013567ffffffffffffffff808211156108e157600080fd5b818601915086601f8301126108f557600080fd5b81358181111561090457600080fd5b87602082850101111561091657600080fd5b6020830194508093505050509250925092565b60005b8381101561094457818101518382015260200161092c565b50506000910152565b6000825161095f818460208701610929565b9190910192915050565b6020815260008251806020840152610988816040850160208701610929565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220a1af0d6cb4f1e31496a4c5c1448913bce4bd6ad3a39e47c6f7190c114d6f9bf464736f6c63430008110033", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000068": "0x00000000000000a40d5f56745a118d0906a34e69aec8c0db1cb8fa0000000100", - "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000f065bae7c019ff5627e09ed48d4eea317d211956", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x000000000000000000000000f23919bb44bca81aeab4586be71ee3fd4e99b951" - } - }, - { - "contractName": "PolygonZkEVMGlobalExitRootL2 implementation", - "balance": "0", - "nonce": "1", - "address": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9", - "bytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806301fd904414610051578063257b36321461006d57806333d6247d1461008d578063a3c573eb146100a2575b600080fd5b61005a60015481565b6040519081526020015b60405180910390f35b61005a61007b366004610162565b60006020819052908152604090205481565b6100a061009b366004610162565b6100ee565b005b6100c97f000000000000000000000000ff0ee8ea08cef5cb4322777f5cc3e8a584b8a4a081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610064565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ff0ee8ea08cef5cb4322777f5cc3e8a584b8a4a0161461015d576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b60006020828403121561017457600080fd5b503591905056fea2646970667358221220a187fc278346c1b61c449ea3641002b6eac2bda3351a122a12c35099f933696864736f6c63430008110033" - }, - { - "contractName": "PolygonZkEVMGlobalExitRootL2 proxy", - "balance": "0", - "nonce": "1", - "address": "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa", - "bytecode": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106ca565b610118565b61005b6100933660046106e5565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106ca565b61020b565b3480156100f557600080fd5b506100ad610235565b610106610292565b610116610111610331565b61033b565b565b61012061035f565b6001600160a01b0316336001600160a01b031614156101575761015481604051806020016040528060008152506000610392565b50565b6101546100fe565b61016761035f565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250610392915050565b505050565b6101c36100fe565b60006101da61035f565b6001600160a01b0316336001600160a01b03161415610200576101fb610331565b905090565b6102086100fe565b90565b61021361035f565b6001600160a01b0316336001600160a01b0316141561015757610154816103f1565b600061023f61035f565b6001600160a01b0316336001600160a01b03161415610200576101fb61035f565b606061028583836040518060600160405280602781526020016107e460279139610445565b9392505050565b3b151590565b61029a61035f565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb610519565b3660008037600080366000845af43d6000803e80801561035a573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b61039b83610541565b6040516001600160a01b038416907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a26000825111806103dc5750805b156101c3576103eb8383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61041a61035f565b604080516001600160a01b03928316815291841660208301520160405180910390a1610154816105e9565b6060833b6104a45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610328565b600080856001600160a01b0316856040516104bf9190610794565b600060405180830381855af49150503d80600081146104fa576040519150601f19603f3d011682016040523d82523d6000602084013e6104ff565b606091505b509150915061050f828286610675565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610383565b803b6105a55760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610328565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b03811661064e5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610328565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61036105c8565b60608315610684575081610285565b8251156106945782518084602001fd5b8160405162461bcd60e51b815260040161032891906107b0565b80356001600160a01b03811681146106c557600080fd5b919050565b6000602082840312156106dc57600080fd5b610285826106ae565b6000806000604084860312156106fa57600080fd5b610703846106ae565b9250602084013567ffffffffffffffff8082111561072057600080fd5b818601915086601f83011261073457600080fd5b81358181111561074357600080fd5b87602082850101111561075557600080fd5b6020830194508093505050509250925092565b60005b8381101561078357818101518382015260200161076b565b838111156103eb5750506000910152565b600082516107a6818460208701610768565b9190910192915050565b60208152600082518060208401526107cf816040850160208701610768565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212204675187caf3a43285d9a2c1844a981e977bd52a85ff073e7fc649f73847d70a464736f6c63430008090033", - "storage": { - "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000f065bae7c019ff5627e09ed48d4eea317d211956", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9" - } - }, - { - "contractName": "PolygonZkEVMTimelock", - "balance": "0", - "nonce": "1", - "address": "0x0165878A594ca255338adfa4d48449f69242Eb8F", - "bytecode": "0x6080604052600436106101c65760003560e01c806364d62353116100f7578063b1c5f42711610095578063d547741f11610064578063d547741f14610661578063e38335e514610681578063f23a6e6114610694578063f27a0c92146106d957600080fd5b8063b1c5f427146105af578063bc197c81146105cf578063c4d252f514610614578063d45c44351461063457600080fd5b80638f61f4f5116100d15780638f61f4f5146104e157806391d1485414610515578063a217fddf14610566578063b08e51c01461057b57600080fd5b806364d62353146104815780638065657f146104a15780638f2a0bb0146104c157600080fd5b8063248a9ca31161016457806331d507501161013e57806331d50750146103c857806336568abe146103e85780633a6aae7214610408578063584b153e1461046157600080fd5b8063248a9ca3146103475780632ab0f529146103775780632f2ff15d146103a857600080fd5b80630d3cf6fc116101a05780630d3cf6fc1461026b578063134008d31461029f57806313bc9f20146102b2578063150b7a02146102d257600080fd5b806301d5062a146101d257806301ffc9a7146101f457806307bd02651461022957600080fd5b366101cd57005b600080fd5b3480156101de57600080fd5b506101f26101ed366004611c52565b6106ee565b005b34801561020057600080fd5b5061021461020f366004611cc7565b610783565b60405190151581526020015b60405180910390f35b34801561023557600080fd5b5061025d7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610220565b34801561027757600080fd5b5061025d7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101f26102ad366004611d09565b6107df565b3480156102be57600080fd5b506102146102cd366004611d75565b6108d7565b3480156102de57600080fd5b506103166102ed366004611e9a565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610220565b34801561035357600080fd5b5061025d610362366004611d75565b60009081526020819052604090206001015490565b34801561038357600080fd5b50610214610392366004611d75565b6000908152600160208190526040909120541490565b3480156103b457600080fd5b506101f26103c3366004611f02565b6108fd565b3480156103d457600080fd5b506102146103e3366004611d75565b610927565b3480156103f457600080fd5b506101f2610403366004611f02565b610940565b34801561041457600080fd5b5061043c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610220565b34801561046d57600080fd5b5061021461047c366004611d75565b6109f8565b34801561048d57600080fd5b506101f261049c366004611d75565b610a0e565b3480156104ad57600080fd5b5061025d6104bc366004611d09565b610ade565b3480156104cd57600080fd5b506101f26104dc366004611f73565b610b1d565b3480156104ed57600080fd5b5061025d7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b34801561052157600080fd5b50610214610530366004611f02565b60009182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b34801561057257600080fd5b5061025d600081565b34801561058757600080fd5b5061025d7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b3480156105bb57600080fd5b5061025d6105ca366004612025565b610d4f565b3480156105db57600080fd5b506103166105ea36600461214e565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b34801561062057600080fd5b506101f261062f366004611d75565b610d94565b34801561064057600080fd5b5061025d61064f366004611d75565b60009081526001602052604090205490565b34801561066d57600080fd5b506101f261067c366004611f02565b610e8f565b6101f261068f366004612025565b610eb4565b3480156106a057600080fd5b506103166106af3660046121f8565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106e557600080fd5b5061025d611161565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161071881611244565b6000610728898989898989610ade565b90506107348184611251565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a604051610770969594939291906122a6565b60405180910390a3505050505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107d957506107d98261139e565b92915050565b600080527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661085c5761085c8133611435565b600061086c888888888888610ade565b905061087881856114ed565b6108848888888861162a565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a6040516108bc94939291906122f1565b60405180910390a36108cd8161172e565b5050505050505050565b6000818152600160205260408120546001811180156108f65750428111155b9392505050565b60008281526020819052604090206001015461091881611244565b61092283836117d7565b505050565b60008181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109f482826118c7565b5050565b6000818152600160208190526040822054610939565b333014610a9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109e1565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b6000868686868686604051602001610afb969594939291906122a6565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b4781611244565b888714610bd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b888514610c65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b6000610c778b8b8b8b8b8b8b8b610d4f565b9050610c838184611251565b60005b8a811015610d415780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610cc357610cc3612331565b9050602002016020810190610cd89190612360565b8d8d86818110610cea57610cea612331565b905060200201358c8c87818110610d0357610d03612331565b9050602002810190610d15919061237b565b8c8b604051610d29969594939291906122a6565b60405180910390a3610d3a8161240f565b9050610c86565b505050505050505050505050565b60008888888888888888604051602001610d709897969594939291906124f7565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610dbe81611244565b610dc7826109f8565b610e53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109e1565b6000828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b600082815260208190526040902060010154610eaa81611244565b61092283836118c7565b600080527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610f3157610f318133611435565b878614610fc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b87841461104f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b60006110618a8a8a8a8a8a8a8a610d4f565b905061106d81856114ed565b60005b8981101561114b5760008b8b8381811061108c5761108c612331565b90506020020160208101906110a19190612360565b905060008a8a848181106110b7576110b7612331565b9050602002013590503660008a8a868181106110d5576110d5612331565b90506020028101906110e7919061237b565b915091506110f78484848461162a565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588686868660405161112e94939291906122f1565b60405180910390a350505050806111449061240f565b9050611070565b506111558161172e565b50505050505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161580159061123257507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123291906125be565b1561123d5750600090565b5060025490565b61124e8133611435565b50565b61125a82610927565b156112e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109e1565b6112ef611161565b81101561137e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109e1565b61138881426125e0565b6000928352600160205260409092209190915550565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107d957507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107d9565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109f4576114738161197e565b61147e83602061199d565b60405160200161148f929190612617565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109e191600401612698565b6114f6826108d7565b611582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109e1565b80158061159e5750600081815260016020819052604090912054145b6109f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109e1565b60008473ffffffffffffffffffffffffffffffffffffffff168484846040516116549291906126e9565b60006040518083038185875af1925050503d8060008114611691576040519150601f19603f3d011682016040523d82523d6000602084013e611696565b606091505b5050905080611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109e1565b5050505050565b611737816108d7565b6117c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109e1565b600090815260016020819052604090912055565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109f45760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556118693390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109f45760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107d973ffffffffffffffffffffffffffffffffffffffff831660145b606060006119ac8360026126f9565b6119b79060026125e0565b67ffffffffffffffff8111156119cf576119cf611d8e565b6040519080825280601f01601f1916602001820160405280156119f9576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611a3057611a30612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a9357611a93612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000611acf8460026126f9565b611ada9060016125e0565b90505b6001811115611b77577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611b1b57611b1b612331565b1a60f81b828281518110611b3157611b31612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c93611b7081612710565b9050611add565b5083156108f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109e1565b803573ffffffffffffffffffffffffffffffffffffffff81168114611c0457600080fd5b919050565b60008083601f840112611c1b57600080fd5b50813567ffffffffffffffff811115611c3357600080fd5b602083019150836020828501011115611c4b57600080fd5b9250929050565b600080600080600080600060c0888a031215611c6d57600080fd5b611c7688611be0565b965060208801359550604088013567ffffffffffffffff811115611c9957600080fd5b611ca58a828b01611c09565b989b979a50986060810135976080820135975060a09091013595509350505050565b600060208284031215611cd957600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108f657600080fd5b60008060008060008060a08789031215611d2257600080fd5b611d2b87611be0565b955060208701359450604087013567ffffffffffffffff811115611d4e57600080fd5b611d5a89828a01611c09565b979a9699509760608101359660809091013595509350505050565b600060208284031215611d8757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611e0457611e04611d8e565b604052919050565b600082601f830112611e1d57600080fd5b813567ffffffffffffffff811115611e3757611e37611d8e565b611e6860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611dbd565b818152846020838601011115611e7d57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611eb057600080fd5b611eb985611be0565b9350611ec760208601611be0565b925060408501359150606085013567ffffffffffffffff811115611eea57600080fd5b611ef687828801611e0c565b91505092959194509250565b60008060408385031215611f1557600080fd5b82359150611f2560208401611be0565b90509250929050565b60008083601f840112611f4057600080fd5b50813567ffffffffffffffff811115611f5857600080fd5b6020830191508360208260051b8501011115611c4b57600080fd5b600080600080600080600080600060c08a8c031215611f9157600080fd5b893567ffffffffffffffff80821115611fa957600080fd5b611fb58d838e01611f2e565b909b50995060208c0135915080821115611fce57600080fd5b611fda8d838e01611f2e565b909950975060408c0135915080821115611ff357600080fd5b506120008c828d01611f2e565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b60008060008060008060008060a0898b03121561204157600080fd5b883567ffffffffffffffff8082111561205957600080fd5b6120658c838d01611f2e565b909a50985060208b013591508082111561207e57600080fd5b61208a8c838d01611f2e565b909850965060408b01359150808211156120a357600080fd5b506120b08b828c01611f2e565b999c989b509699959896976060870135966080013595509350505050565b600082601f8301126120df57600080fd5b8135602067ffffffffffffffff8211156120fb576120fb611d8e565b8160051b61210a828201611dbd565b928352848101820192828101908785111561212457600080fd5b83870192505b848310156121435782358252918301919083019061212a565b979650505050505050565b600080600080600060a0868803121561216657600080fd5b61216f86611be0565b945061217d60208701611be0565b9350604086013567ffffffffffffffff8082111561219a57600080fd5b6121a689838a016120ce565b945060608801359150808211156121bc57600080fd5b6121c889838a016120ce565b935060808801359150808211156121de57600080fd5b506121eb88828901611e0c565b9150509295509295909350565b600080600080600060a0868803121561221057600080fd5b61221986611be0565b945061222760208701611be0565b93506040860135925060608601359150608086013567ffffffffffffffff81111561225157600080fd5b6121eb88828901611e0c565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a0604082015260006122dc60a08301868861225d565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260606040820152600061232760608301848661225d565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561237257600080fd5b6108f682611be0565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126123b057600080fd5b83018035915067ffffffffffffffff8211156123cb57600080fd5b602001915036819003821315611c4b57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612440576124406123e0565b5060010190565b81835260006020808501808196508560051b810191508460005b878110156124ea57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126124a057600080fd5b8701858101903567ffffffffffffffff8111156124bc57600080fd5b8036038213156124cb57600080fd5b6124d686828461225d565b9a87019a9550505090840190600101612461565b5091979650505050505050565b60a0808252810188905260008960c08301825b8b8110156125455773ffffffffffffffffffffffffffffffffffffffff61253084611be0565b1682526020928301929091019060010161250a565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff89111561257e57600080fd5b8860051b9150818a602083013701828103602090810160408501526125a69082018789612447565b60608401959095525050608001529695505050505050565b6000602082840312156125d057600080fd5b815180151581146108f657600080fd5b808201808211156107d9576107d96123e0565b60005b8381101561260e5781810151838201526020016125f6565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161264f8160178501602088016125f3565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000601791840191820152835161268c8160288401602088016125f3565b01602801949350505050565b60208152600082518060208401526126b78160408501602087016125f3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b8183823760009101908152919050565b80820281158282048414176107d9576107d96123e0565b60008161271f5761271f6123e0565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea26469706673582212206416c4e08f97752b4bb06159524dac058d3dccd8775e57ef1b01505751ebf7af64736f6c63430008110033", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000002": "0x000000000000000000000000000000000000000000000000000000000000000a", - "0xaedcc9e7897c0d335bdc5d92fe3a8b4f23727fe558cd1c19f332b28716a30559": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0xf5e61edb9c9cc6bfbae4463e9a2b1dd6ac3b44ddef38f18016e56ba0363910d9": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x64494413541ff93b31aa309254e3fed72a7456e9845988b915b4c7a7ceba8814": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", - "0x60b9d94c75b7b3f721925089391e4644cd890cb5e6466f9596dfbd2c54e0b280": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x3412d5605ac6cd444957cedb533e5dacad6378b4bc819ebe3652188a665066d6": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", - "0x4b63b79f1e338a49559dcd3193ac9eecc50d0f275d24e97cc8c319e5a31a8bd0": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0xdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d706a": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", - "0x800d5dfe4bba53eedee06cd4546a27da8de00f12db83f56062976d4493fda899": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0xc3ad33e20b0c56a223ad5104fff154aa010f8715b9c981fd38fdc60a4d1a52fc": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5" - } - }, - { - "accountName": "keyless Deployer", - "balance": "0", - "nonce": "1", - "address": "0x20E7077d25fe79C5F6c2D3ae4905E96aA7C89c13" - }, - { - "accountName": "deployer", - "balance": "100000000000000000000000", - "nonce": "8", - "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" - } - ] -} \ No newline at end of file diff --git a/docker/scripts/v2/deploy-docker.sh b/docker/scripts/v2/deploy-docker.sh index a2001bfe8..fe478c0c1 100755 --- a/docker/scripts/v2/deploy-docker.sh +++ b/docker/scripts/v2/deploy-docker.sh @@ -1,17 +1,13 @@ #!/bin/bash sudo rm -rf docker/gethData/geth_data -rm deployment/deploy_ongoing.json DEV_PERIOD=1 docker-compose -f docker/docker-compose.geth.yml up -d geth sleep 5 node docker/scripts/fund-accounts.js -cp docker/scripts/deploy_parameters_docker.json deployment/deploy_parameters.json -cp docker/scripts/genesis_docker.json deployment/genesis.json -npx hardhat run deployment/testnet/prepareTestnet.js --network localhost -npx hardhat run deployment/2_deployPolygonZKEVMDeployer.js --network localhost -npx hardhat run deployment/3_deployContracts.js --network localhost +cp docker/scripts/v2/deploy_parameters_docker.json deployment/v2/deploy_parameters.json +npm run deploy:testnet:v2:localhost mkdir docker/deploymentOutput -mv deployment/deploy_output.json docker/deploymentOutput -docker-compose -f docker/docker-compose.geth.yml down +mv deployment/v2/deploy_output.json docker/deploymentOutput +DEV_PERIOD=1 docker-compose -f docker/docker-compose.geth.yml down sudo docker build -t hermeznetwork/geth-zkevm-contracts -f docker/Dockerfile.geth . # Let it readable for the multiplatform build coming later! sudo chmod -R go+rxw docker/gethData diff --git a/docker/scripts/v2/deploy-dockerv2.sh b/docker/scripts/v2/deploy-dockerv2.sh old mode 100644 new mode 100755 index aae943c2c..df3c37951 --- a/docker/scripts/v2/deploy-dockerv2.sh +++ b/docker/scripts/v2/deploy-dockerv2.sh @@ -3,14 +3,11 @@ sudo rm -rf docker/gethData/geth_data DEV_PERIOD=1 docker compose -f docker/docker-compose.geth.yml up -d geth sleep 5 node docker/scripts/fund-accounts.js -cp docker/scripts/deploy_parameters_docker.json deployment/deploy_parameters.json -cp docker/scripts/genesis_docker.json deployment/genesis.json -npx hardhat run deployment/testnet/prepareTestnet.js --network localhost -npx hardhat run deployment/2_deployPolygonZKEVMDeployer.js --network localhost -npx hardhat run deployment/3_deployContracts.js --network localhost +cp docker/scripts/v2/deploy_parameters_docker.json deployment/v2/deploy_parameters.json +npm run deploy:testnet:v2:localhost mkdir docker/deploymentOutput -mv deployment/deploy_output.json docker/deploymentOutput -docker compose -f docker/docker-compose.geth.yml down +mv deployment/v2/deploy_output.json docker/deploymentOutput +DEV_PERIOD=1 docker compose -f docker/docker-compose.geth.yml down sudo docker build -t hermeznetwork/geth-zkevm-contracts -f docker/Dockerfile.geth . # Let it readable for the multiplatform build coming later! sudo chmod -R go+rxw docker/gethData \ No newline at end of file diff --git a/docker/scripts/v2/deploy_parameters_docker.json b/docker/scripts/v2/deploy_parameters_docker.json new file mode 100644 index 000000000..0eff58791 --- /dev/null +++ b/docker/scripts/v2/deploy_parameters_docker.json @@ -0,0 +1,27 @@ +{ + "timelockAdminAddress": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "minDelayTimelock": 3600, + "salt": "0x0000000000000000000000000000000000000000000000000000000000000000", + "initialZkEVMDeployerOwner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "admin": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "trustedAggregator": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + "trustedAggregatorTimeout": 604799, + "pendingStateTimeout": 604799, + "emergencyCouncilAddress": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "realVerifier": false, + "trustedSequencerURL": "http://zkevm-json-rpc:8123", + "networkName": "zkevm", + "description": "0.0.1", + "trustedSequencer": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "chainID": 1001, + "adminZkEVM": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "forkID": 5, + "polTokenAddress": "", + "zkEVMDeployerAddress": "", + "gasTokenAddress": "", + "gasTokenNetwork": 0, + "deployerPvtKey": "", + "maxFeePerGas": "", + "maxPriorityFeePerGas": "", + "multiplierGas": "" +} \ No newline at end of file diff --git a/docker/scripts/v2/genesis.json b/docker/scripts/v2/genesis.json new file mode 100644 index 000000000..1d91982a7 --- /dev/null +++ b/docker/scripts/v2/genesis.json @@ -0,0 +1,92 @@ +{ + "root": "0x40bdab77c40f497be8a427027b336f7a51a0692c3fb20ff36519bc5a79dc60fd", + "genesis": [ + { + "contractName": "PolygonZkEVMDeployer", + "balance": "0", + "nonce": "4", + "address": "0xFbD07134824dDEa24E4ae414c18ecbFa98169A24", + "bytecode": "0x60806040526004361061006e575f3560e01c8063715018a61161004c578063715018a6146100e25780638da5cb5b146100f6578063e11ae6cb1461011f578063f2fde38b14610132575f80fd5b80632b79805a146100725780634a94d487146100875780636d07dbf81461009a575b5f80fd5b610085610080366004610908565b610151565b005b6100856100953660046109a2565b6101c2565b3480156100a5575f80fd5b506100b96100b43660046109f5565b610203565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ed575f80fd5b50610085610215565b348015610101575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff166100b9565b61008561012d366004610a15565b610228565b34801561013d575f80fd5b5061008561014c366004610a61565b61028e565b61015961034a565b5f6101658585856103ca565b90506101718183610527565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a15050505050565b6101ca61034a565b6101d583838361056a565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b905f90a1505050565b5f61020e8383610598565b9392505050565b61021d61034a565b6102265f6105a4565b565b61023061034a565b5f61023c8484846103ca565b60405173ffffffffffffffffffffffffffffffffffffffff821681529091507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a150505050565b61029661034a565b73ffffffffffffffffffffffffffffffffffffffff811661033e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610347816105a4565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610335565b5f83471015610435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610335565b81515f0361049f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610335565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff811661020e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610335565b606061020e83835f6040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c65640000815250610618565b6060610590848484604051806060016040528060298152602001610b0860299139610618565b949350505050565b5f61020e83833061072d565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156106aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610335565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516106d29190610a9c565b5f6040518083038185875af1925050503d805f811461070c576040519150601f19603f3d011682016040523d82523d5f602084013e610711565b606091505b509150915061072287838387610756565b979650505050505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b606083156107eb5782515f036107e45773ffffffffffffffffffffffffffffffffffffffff85163b6107e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610335565b5081610590565b61059083838151156108005781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103359190610ab7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112610870575f80fd5b813567ffffffffffffffff8082111561088b5761088b610834565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156108d1576108d1610834565b816040528381528660208588010111156108e9575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f806080858703121561091b575f80fd5b8435935060208501359250604085013567ffffffffffffffff80821115610940575f80fd5b61094c88838901610861565b93506060870135915080821115610961575f80fd5b5061096e87828801610861565b91505092959194509250565b803573ffffffffffffffffffffffffffffffffffffffff8116811461099d575f80fd5b919050565b5f805f606084860312156109b4575f80fd5b6109bd8461097a565b9250602084013567ffffffffffffffff8111156109d8575f80fd5b6109e486828701610861565b925050604084013590509250925092565b5f8060408385031215610a06575f80fd5b50508035926020909101359150565b5f805f60608486031215610a27575f80fd5b8335925060208401359150604084013567ffffffffffffffff811115610a4b575f80fd5b610a5786828701610861565b9150509250925092565b5f60208284031215610a71575f80fd5b61020e8261097a565b5f5b83811015610a94578181015183820152602001610a7c565b50505f910152565b5f8251610aad818460208701610a7a565b9190910192915050565b602081525f8251806020840152610ad5816040850160208701610a7a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220330b94dc698c4d290bf55c23f13b473cde6a6bae0030cb902de18af54e35839f64736f6c63430008140033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" + } + }, + { + "contractName": "ProxyAdmin", + "balance": "0", + "nonce": "1", + "address": "0xfADB60b5059e31614e02083fF6C021a24C31c891", + "bytecode": "0x608060405260043610610079575f3560e01c80639623609d1161004c5780639623609d1461012357806399a88ec414610136578063f2fde38b14610155578063f3b7dead14610174575f80fd5b8063204e1c7a1461007d578063715018a6146100c55780637eff275e146100db5780638da5cb5b146100fa575b5f80fd5b348015610088575f80fd5b5061009c6100973660046105e8565b610193565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100d0575f80fd5b506100d9610244565b005b3480156100e6575f80fd5b506100d96100f536600461060a565b610257565b348015610105575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff1661009c565b6100d961013136600461066e565b6102e0565b348015610141575f80fd5b506100d961015036600461060a565b610371565b348015610160575f80fd5b506100d961016f3660046105e8565b6103cd565b34801561017f575f80fd5b5061009c61018e3660046105e8565b610489565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907f5c60da1b00000000000000000000000000000000000000000000000000000000815260040190565b5f60405180830381855afa9150503d805f8114610215576040519150601f19603f3d011682016040523d82523d5f602084013e61021a565b606091505b509150915081610228575f80fd5b8080602001905181019061023c919061075b565b949350505050565b61024c6104d3565b6102555f610553565b565b61025f6104d3565b6040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690638f283970906024015b5f604051808303815f87803b1580156102c6575f80fd5b505af11580156102d8573d5f803e3d5ffd5b505050505050565b6102e86104d3565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef28690349061033e9086908690600401610776565b5f604051808303818588803b158015610355575f80fd5b505af1158015610367573d5f803e3d5ffd5b5050505050505050565b6103796104d3565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690633659cfe6906024016102af565b6103d56104d3565b73ffffffffffffffffffffffffffffffffffffffff811661047d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61048681610553565b50565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907ff851a44000000000000000000000000000000000000000000000000000000000815260040190565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610474565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610486575f80fd5b5f602082840312156105f8575f80fd5b8135610603816105c7565b9392505050565b5f806040838503121561061b575f80fd5b8235610626816105c7565b91506020830135610636816105c7565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f805f60608486031215610680575f80fd5b833561068b816105c7565b9250602084013561069b816105c7565b9150604084013567ffffffffffffffff808211156106b7575f80fd5b818601915086601f8301126106ca575f80fd5b8135818111156106dc576106dc610641565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561072257610722610641565b8160405282815289602084870101111561073a575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f6020828403121561076b575f80fd5b8151610603816105c7565b73ffffffffffffffffffffffffffffffffffffffff831681525f602060408184015283518060408501525f5b818110156107be578581018301518582016060015282016107a2565b505f6060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050939250505056fea26469706673582212203083a4ccc2e42eed60bd19037f2efa77ed086dc7a5403f75bebb995dcba2221c64736f6c63430008140033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f" + } + }, + { + "contractName": "PolygonZkEVMBridge implementation", + "balance": "0", + "nonce": "1", + "address": "0x7Cd6d5063c7782d34E2b1b03ED89ecf4A1412148", + "bytecode": "0x608060405260043610620001d3575f3560e01c80638ed7e3f211620000fa578063cd5865791162000092578063dbc16976116200006a578063dbc169761462000685578063ee25560b146200069c578063f5efcd7914620006cb578063fb57083414620006ef575f80fd5b8063cd5865791462000620578063d02103ca1462000637578063d3476afe1462000661575f80fd5b8063bab161bf11620000d2578063bab161bf146200057a578063be5831c7146200059d578063cc46163214620005d8578063ccaa2d1114620005fc575f80fd5b80638ed7e3f21462000511578063aaa13cc21462000532578063b8b284d01462000556575f80fd5b80633cbc795b116200016e5780635ca1e16511620001465780635ca1e165146200048757806379e2cf97146200049e57806381b1c17414620004b557806383f2440314620004ed575f80fd5b80633cbc795b14620003285780633e19704314620003745780634b2f336d1462000466575f80fd5b8063240ff37811620001ae578063240ff378146200025d5780632dfdf0b51462000274578063318aee3d146200029a5780633c351e101462000307575f80fd5b806315064c9614620001d75780632072f6c5146200020757806322e95f2c1462000220575b5f80fd5b348015620001e3575f80fd5b50606854620001f29060ff1681565b60405190151581526020015b60405180910390f35b34801562000213575f80fd5b506200021e62000713565b005b3480156200022c575f80fd5b50620002446200023e36600462003723565b62000764565b6040516001600160a01b039091168152602001620001fe565b6200021e6200026e366004620037b3565b620007f9565b34801562000280575f80fd5b506200028b60535481565b604051908152602001620001fe565b348015620002a6575f80fd5b50620002e2620002b836600462003832565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201620001fe565b34801562000313575f80fd5b50606d5462000244906001600160a01b031681565b34801562000334575f80fd5b50606d546200035e9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001620001fe565b34801562000380575f80fd5b506200028b6200039236600462003866565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b34801562000472575f80fd5b50606e5462000244906001600160a01b031681565b34801562000493575f80fd5b506200028b62000862565b348015620004aa575f80fd5b506200021e62000947565b348015620004c1575f80fd5b5062000244620004d3366004620038eb565b606a6020525f90815260409020546001600160a01b031681565b348015620004f9575f80fd5b506200028b6200050b36600462003915565b62000981565b3480156200051d575f80fd5b50606c5462000244906001600160a01b031681565b3480156200053e575f80fd5b50620002446200055036600462003956565b62000a64565b34801562000562575f80fd5b506200021e6200057436600462003a03565b62000bf4565b34801562000586575f80fd5b506068546200035e90610100900463ffffffff1681565b348015620005a9575f80fd5b506068546200035e90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b348015620005e4575f80fd5b50620001f2620005f636600462003a8b565b62000cc9565b34801562000608575f80fd5b506200021e6200061a36600462003ac1565b62000d58565b6200021e6200063136600462003bb5565b6200144d565b34801562000643575f80fd5b5060685462000244906501000000000090046001600160a01b031681565b3480156200066d575f80fd5b506200021e6200067f36600462003c51565b62001a03565b34801562000691575f80fd5b506200021e62001dd7565b348015620006a8575f80fd5b506200028b620006ba366004620038eb565b60696020525f908152604090205481565b348015620006d7575f80fd5b506200021e620006e936600462003ac1565b62001e26565b348015620006fb575f80fd5b50620001f26200070d36600462003cc5565b620021aa565b606c546001600160a01b0316331462000758576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000762620021c5565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b3415801590620008135750606e546001600160a01b031615155b156200084b576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200085b85853486868662002258565b5050505050565b6053545f90819081805b60208110156200093e578083901c600116600103620008cf57603381602081106200089b576200089b62003d0f565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620008fc565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620009359062003d69565b9150506200086c565b50919392505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000762576200076262002340565b5f83815b602081101562000a5b57600163ffffffff8516821c81169003620009f757848160208110620009b857620009b862003d0f565b602002013582604051602001620009d9929190918252602082015260400190565b60405160208183030381529060405280519060200120915062000a46565b8185826020811062000a0d5762000a0d62003d0f565b602002013560405160200162000a2d929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062000a528162003d69565b91505062000985565b50949350505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b30836040518060200162000af890620036e9565b601f1982820381018352601f90910116604081905262000b25908d908d908d908d908d9060200162003dcc565b60408051601f198184030181529082905262000b45929160200162003e30565b6040516020818303038152906040528051906020012060405160200162000bce94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b606e546001600160a01b031662000c37576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606e546040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018690526001600160a01b0390911690639dc29fac906044015f604051808303815f87803b15801562000c9a575f80fd5b505af115801562000cad573d5f803e3d5ffd5b5050505062000cc186868686868662002258565b505050505050565b6068545f908190610100900463ffffffff1615801562000cef575063ffffffff83166001145b1562000d03575063ffffffff831662000d2f565b62000d1a64010000000063ffffffff851662003e62565b62000d2c9063ffffffff861662003e7c565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000d96576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161462000de0576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000ee78c8c8c8c8c62000ee15f8e8e8e8e8e8e8e60405162000e0592919062003e92565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62002409565b6001600160a01b0386166200105657606e546001600160a01b031662000fd4575f6001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000f40576020820181803683370190505b5060405162000f50919062003ece565b5f6040518083038185875af1925050503d805f811462000f8c576040519150601f19603f3d011682016040523d82523d5f602084013e62000f91565b606091505b505090508062000fcd576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50620013e3565b606e546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015260248201869052909116906340c10f19906044015f604051808303815f87803b15801562001039575f80fd5b505af11580156200104c573d5f803e3d5ffd5b50505050620013e3565b606d546001600160a01b038781169116148015620010965750606d5463ffffffff8881167401000000000000000000000000000000000000000090920416145b15620010af575f6001600160a01b038516848262000f15565b60685463ffffffff610100909104811690881603620010e457620010de6001600160a01b0387168585620025e1565b620013e3565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b03168062001367575f80806200118b8688018862003fa1565b9250925092505f85848484604051620011a490620036e9565b620011b2939291906200404a565b8190604051809103905ff5905080158015620011d0573d5f803e3d5ffd5b506040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562001236575f80fd5b505af115801562001249573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b6040516200135595949392919062004086565b60405180910390a150505050620013e0565b6040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b158015620013c8575f80fd5b505af1158015620013db573d5f803e3d5ffd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156200148b576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200149562002691565b60685463ffffffff610100909104811690881603620014e0576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f806060876001600160a01b03881662001563578834146200152e576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d546001600160a01b038116945074010000000000000000000000000000000000000000900463ffffffff169250620018a2565b34156200159c576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606e546001600160a01b03908116908916036200162f576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018a90526001600160a01b03891690639dc29fac906044015f604051808303815f87803b15801562001612575f80fd5b505af115801562001625573d5f803e3d5ffd5b50505050620018a2565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620016fe576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b90526001600160a01b038a1690639dc29fac906044015f604051808303815f87803b158015620016d4575f80fd5b505af1158015620016e7573d5f803e3d5ffd5b5050505080602001519450805f01519350620018a0565b8515620017135762001713898b898962002706565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa15801562001771573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620017979190620040c0565b9050620017b06001600160a01b038b1633308e62002bb1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa1580156200180e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620018349190620040c0565b9050620018428282620040d8565b6068548c9850610100900463ffffffff1696509350620018628762002c04565b6200186d8c62002d0b565b620018788d62002e07565b6040516020016200188c939291906200404a565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620018e3989796959493929190620040ee565b60405180910390a1620019db620019d55f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62002ef2565b8615620019ec57620019ec62002340565b50505050620019fa60018055565b50505050505050565b5f54610100900460ff161580801562001a2257505f54600160ff909116105b8062001a3d5750303b15801562001a3d57505f5460ff166001145b62001acf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801562001b2c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8916027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016848316179055606d541662001c3157606d5474010000000000000000000000000000000000000000900463ffffffff161562001c2b576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001d63565b606d805463ffffffff861674010000000000000000000000000000000000000000027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b038816171790556040515f9060129062001c9890620036e9565b6060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff909116604082015260e0018190604051809103905ff590508015801562001d29573d5f803e3d5ffd5b50606e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790555b62001d6d62003007565b801562000cc1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b606c546001600160a01b0316331462001e1c576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000762620030a9565b60685460ff161562001e64576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161462001eae576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001ed48c8c8c8c8c62000ee160018e8e8e8e8e8e8e60405162000e0592919062003e92565b606e545f906001600160a01b031662001fbd57846001600160a01b031684888a868660405160240162001f0b949392919062004159565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f2000000000000000000000000000000000000000000000000000000001790525162001f70919062003ece565b5f6040518083038185875af1925050503d805f811462001fac576040519150601f19603f3d011682016040523d82523d5f602084013e62001fb1565b606091505b50508091505062002107565b606e546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260248201879052909116906340c10f19906044015f604051808303815f87803b15801562002022575f80fd5b505af115801562002035573d5f803e3d5ffd5b50505050846001600160a01b0316878985856040516024016200205c949392919062004159565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f20000000000000000000000000000000000000000000000000000000017905251620020c1919062003ece565b5f604051808303815f865af19150503d805f8114620020fc576040519150601f19603f3d011682016040523d82523d5f602084013e62002101565b606091505b50909150505b806200213f576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f81620021b986868662000981565b1490505b949350505050565b60685460ff161562002203576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff610100909104811690871603620022a3576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051620022f99998979695949392919062004193565b60405180910390a162002334620019d56001606860019054906101000a900463ffffffff16338a8a8a898960405162000e0592919062003e92565b821562000cc15762000cc15b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d620023b962000862565b6040518263ffffffff1660e01b8152600401620023d891815260200190565b5f604051808303815f87803b158015620023f0575f80fd5b505af115801562002403573d5f803e3d5ffd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af11580156200249b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620024c19190620040c0565b9050805f03620024fc576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80680100000000000000008716600103620025605786915062002523848a8489620021aa565b6200255a576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620025ca565b602087901c6200257281600162004200565b91508792506200259162002588868c8662000981565b8a8389620021aa565b620025c8576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b620025d6828262003138565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526200268c9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262003200565b505050565b600260015403620026ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001ac6565b6002600155565b5f62002716600482848662004227565b620027219162004250565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002967575f80808080808062002783896004818d62004227565b81019062002792919062004299565b9650965096509650965096509650336001600160a01b0316876001600160a01b031614620027ec576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03861630146200282f576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002869576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002917919062003ece565b5f604051808303815f865af19150503d805f811462002952576040519150601f19603f3d011682016040523d82523d5f602084013e62002957565b606091505b505050505050505050506200085b565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c0000000000000000000000000000000000000000000000000000000014620029e3576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80808080808080620029fa8a6004818e62004227565b81019062002a099190620042ef565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462002a65576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038716301462002aa8576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002b5f919062003ece565b5f604051808303815f865af19150503d805f811462002b9a576040519150601f19603f3d011682016040523d82523d5f602084013e62002b9f565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052620024039085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002627565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b0386169162002c7a919062003ece565b5f60405180830381855afa9150503d805f811462002cb4576040519150601f19603f3d011682016040523d82523d5f602084013e62002cb9565b606091505b50915091508162002d00576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250620021bd565b620021bd8162003305565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b0386169162002d81919062003ece565b5f60405180830381855afa9150503d805f811462002dbb576040519150601f19603f3d011682016040523d82523d5f602084013e62002dc0565b606091505b50915091508162002d00576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250620021bd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b0386169162002e7c919062003ece565b5f60405180830381855afa9150503d805f811462002eb6576040519150601f19603f3d011682016040523d82523d5f602084013e62002ebb565b606091505b509150915081801562002ecf575080516020145b62002edc576012620021bd565b80806020019051810190620021bd919062004376565b80600162002f0360206002620044cb565b62002f0f9190620040d8565b6053541062002f4a576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462002f5b9062003d69565b918290555090505f5b602081101562002ff6578082901c60011660010362002f9c57826033826020811062002f945762002f9462003d0f565b015550505050565b6033816020811062002fb25762002fb262003d0f565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062002fed9062003d69565b91505062002f64565b506200268c620044d8565b60018055565b5f54610100900460ff166200309f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001ac6565b62000762620034f0565b60685460ff16620030e6576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b6068545f90610100900463ffffffff161580156200315c575063ffffffff82166001145b1562003170575063ffffffff82166200319c565b6200318764010000000063ffffffff841662003e62565b620031999063ffffffff851662003e7c565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620019fa576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62003256826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620035889092919063ffffffff16565b8051909150156200268c578080602001905181019062003277919062004505565b6200268c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001ac6565b60606040825110620033275781806020019051810190620007f3919062004523565b8151602003620034b2575f5b6020811080156200337e575082818151811062003354576200335462003d0f565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620033995780620033908162003d69565b91505062003333565b805f03620033dc57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115620033f957620033f962003ea1565b6040519080825280601f01601f19166020018201604052801562003424576020820181803683370190505b5090505f5b82811015620034aa5784818151811062003447576200344762003d0f565b602001015160f81c60f81b82828151811062003467576200346762003d0f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620034a18162003d69565b91505062003429565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b5f54610100900460ff1662003001576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001ac6565b6060620021bd84845f85855f80866001600160a01b03168587604051620035b0919062003ece565b5f6040518083038185875af1925050503d805f8114620035ec576040519150601f19603f3d011682016040523d82523d5f602084013e620035f1565b606091505b509150915062003604878383876200360f565b979650505050505050565b606083156200369c5782515f0362003694576001600160a01b0385163b62003694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001ac6565b5081620021bd565b620021bd8383815115620036b35781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001ac691906200459e565b6119a180620045b383390190565b803563ffffffff81168114620034eb575f80fd5b6001600160a01b038116811462003720575f80fd5b50565b5f806040838503121562003735575f80fd5b6200374083620036f7565b9150602083013562003752816200370b565b809150509250929050565b801515811462003720575f80fd5b5f8083601f8401126200377c575f80fd5b50813567ffffffffffffffff81111562003794575f80fd5b602083019150836020828501011115620037ac575f80fd5b9250929050565b5f805f805f60808688031215620037c8575f80fd5b620037d386620036f7565b94506020860135620037e5816200370b565b93506040860135620037f7816200375d565b9250606086013567ffffffffffffffff81111562003813575f80fd5b62003821888289016200376b565b969995985093965092949392505050565b5f6020828403121562003843575f80fd5b813562003850816200370b565b9392505050565b60ff8116811462003720575f80fd5b5f805f805f805f60e0888a0312156200387d575f80fd5b87356200388a8162003857565b96506200389a60208901620036f7565b95506040880135620038ac816200370b565b9450620038bc60608901620036f7565b93506080880135620038ce816200370b565b9699959850939692959460a0840135945060c09093013592915050565b5f60208284031215620038fc575f80fd5b5035919050565b806104008101831015620007f3575f80fd5b5f805f610440848603121562003929575f80fd5b833592506200393c856020860162003903565b91506200394d6104208501620036f7565b90509250925092565b5f805f805f805f60a0888a0312156200396d575f80fd5b6200397888620036f7565b965060208801356200398a816200370b565b9550604088013567ffffffffffffffff80821115620039a7575f80fd5b620039b58b838c016200376b565b909750955060608a0135915080821115620039ce575f80fd5b50620039dd8a828b016200376b565b9094509250506080880135620039f38162003857565b8091505092959891949750929550565b5f805f805f8060a0878903121562003a19575f80fd5b62003a2487620036f7565b9550602087013562003a36816200370b565b945060408701359350606087013562003a4f816200375d565b9250608087013567ffffffffffffffff81111562003a6b575f80fd5b62003a7989828a016200376b565b979a9699509497509295939492505050565b5f806040838503121562003a9d575f80fd5b62003aa883620036f7565b915062003ab860208401620036f7565b90509250929050565b5f805f805f805f805f805f806109208d8f03121562003ade575f80fd5b62003aea8e8e62003903565b9b5062003afc8e6104008f0162003903565b9a506108008d013599506108208d013598506108408d0135975062003b256108608e01620036f7565b965062003b376108808e01356200370b565b6108808d0135955062003b4e6108a08e01620036f7565b945062003b606108c08e01356200370b565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111562003b8a575f80fd5b62003b9d8e6109008f01358f016200376b565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121562003bcc575f80fd5b62003bd788620036f7565b9650602088013562003be9816200370b565b955060408801359450606088013562003c02816200370b565b9350608088013562003c14816200375d565b925060a088013567ffffffffffffffff81111562003c30575f80fd5b62003c3e8a828b016200376b565b989b979a50959850939692959293505050565b5f805f805f60a0868803121562003c66575f80fd5b62003c7186620036f7565b9450602086013562003c83816200370b565b935062003c9360408701620036f7565b9250606086013562003ca5816200370b565b9150608086013562003cb7816200370b565b809150509295509295909350565b5f805f80610460858703121562003cda575f80fd5b8435935062003ced866020870162003903565b925062003cfe6104208601620036f7565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003d9c5762003d9c62003d3c565b5060010190565b81835281816020850137505f602082840101525f6020601f19601f840116840101905092915050565b606081525f62003de160608301878962003da3565b828103602084015262003df681868862003da3565b91505060ff831660408301529695505050505050565b5f5b8381101562003e2857818101518382015260200162003e0e565b50505f910152565b5f835162003e4381846020880162003e0c565b83519083019062003e5981836020880162003e0c565b01949350505050565b8082028115828204841417620007f357620007f362003d3c565b80820180821115620007f357620007f362003d3c565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f825162003ee181846020870162003e0c565b9190910192915050565b604051601f8201601f1916810167ffffffffffffffff8111828210171562003f175762003f1762003ea1565b604052919050565b5f67ffffffffffffffff82111562003f3b5762003f3b62003ea1565b50601f01601f191660200190565b5f82601f83011262003f59575f80fd5b813562003f7062003f6a8262003f1f565b62003eeb565b81815284602083860101111562003f85575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003fb4575f80fd5b833567ffffffffffffffff8082111562003fcc575f80fd5b62003fda8783880162003f49565b9450602086013591508082111562003ff0575f80fd5b5062003fff8682870162003f49565b9250506040840135620040128162003857565b809150509250925092565b5f81518084526200403681602086016020860162003e0c565b601f01601f19169290920160200192915050565b606081525f6200405e60608301866200401d565b82810360208401526200407281866200401d565b91505060ff83166040830152949350505050565b63ffffffff861681525f6001600160a01b038087166020840152808616604084015250608060608301526200360460808301848662003da3565b5f60208284031215620040d1575f80fd5b5051919050565b81810381811115620007f357620007f362003d3c565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c085015262004140828501876200401d565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f6200418960608301848662003da3565b9695505050505050565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620041e6828501878962003da3565b925080851660e085015250509a9950505050505050505050565b63ffffffff81811683821601908082111562004220576200422062003d3c565b5092915050565b5f808585111562004236575f80fd5b8386111562004243575f80fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620042915780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215620042b0575f80fd5b8735620042bd816200370b565b96506020880135620042cf816200370b565b955060408801359450606088013593506080880135620038ce8162003857565b5f805f805f805f80610100898b03121562004308575f80fd5b883562004315816200370b565b9750602089013562004327816200370b565b96506040890135955060608901359450608089013562004347816200375d565b935060a0890135620043598162003857565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004387575f80fd5b8151620038508162003857565b600181815b80851115620043f357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620043d757620043d762003d3c565b80851615620043e557918102915b93841c939080029062004399565b509250929050565b5f826200440b57506001620007f3565b816200441957505f620007f3565b81600181146200443257600281146200443d576200445d565b6001915050620007f3565b60ff84111562004451576200445162003d3c565b50506001821b620007f3565b5060208310610133831016604e8410600b841016171562004482575081810a620007f3565b6200448e838362004394565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620044c357620044c362003d3c565b029392505050565b5f620038508383620043fb565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6020828403121562004516575f80fd5b815162003850816200375d565b5f6020828403121562004534575f80fd5b815167ffffffffffffffff8111156200454b575f80fd5b8201601f810184136200455c575f80fd5b80516200456d62003f6a8262003f1f565b81815285602083850101111562004582575f80fd5b6200459582602083016020860162003e0c565b95945050505050565b602081525f6200385060208301846200401d56fe61010060405234801562000011575f80fd5b50604051620019a1380380620019a1833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516115036200049e5f395f61022d01525f81816102fb015281816105ad015261067a01525f61052801525f818161036d01526104f201526115035ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b6040516101879190611255565b60405180910390f35b6101a361019e3660046112e6565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461130e565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d3660046112e6565b61054a565b6102856102803660046112e6565b610595565b005b6101b7610295366004611347565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca366004611347565b60056020525f908152604090205481565b61017a610653565b6102856102f13660046112e6565b610662565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a36103503660046112e6565b610717565b6101a36103633660046112e6565b6107cd565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d366004611367565b6107da565b6101b76103b03660046113d4565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611405565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611405565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610ad7565b60019150505b92915050565b5f336104d9858285610c56565b6104e4858585610d12565b506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146105255761052046610f31565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c09082908690610590908790611483565b610ad7565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106455760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61064f8282610ff8565b5050565b60606004805461043290611405565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461070d5760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d42726964676500000000000000000000000000000000606482015260840161063c565b61064f82826110cf565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107c05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161063c565b6104e48286868403610ad7565b5f336104c0818585610d12565b8342111561084f5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d697400000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866108a883611496565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6109126104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156109d3573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610a4e57508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610ac05760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e617475726500000000000000000000000000000000000000000000000000606482015260840161063c565b610acb8a8a8a610ad7565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610b5f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610be85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d0c5781811015610cff5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161063c565b610d0c8484848403610ad7565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610d9b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610e245760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610ebf5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610d0c565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610f5b610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff821661105b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161063c565b8060025f82825461106c9190611483565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166111585760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260208190526040902054818110156111f35760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610c49565b5f6020808352835180828501525f5b8181101561128057858101830151858201604001528201611264565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146112e1575f80fd5b919050565b5f80604083850312156112f7575f80fd5b611300836112be565b946020939093013593505050565b5f805f60608486031215611320575f80fd5b611329846112be565b9250611337602085016112be565b9150604084013590509250925092565b5f60208284031215611357575f80fd5b611360826112be565b9392505050565b5f805f805f805f60e0888a03121561137d575f80fd5b611386886112be565b9650611394602089016112be565b95506040880135945060608801359350608088013560ff811681146113b7575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f80604083850312156113e5575f80fd5b6113ee836112be565b91506113fc602084016112be565b90509250929050565b600181811c9082168061141957607f821691505b602082108103611450577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c6611456565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036114c6576114c6611456565b506001019056fea2646970667358221220176a1a9cf4a702d3853b858873fff4a6370c4e5d7d72d68593ec0ebe64fcc26964736f6c63430008140033a26469706673582212209002ffc0c7cb9056d22d47ac65cf05714a8ae8ce0af7e882f7e68b9fdede830e64736f6c63430008140033" + }, + { + "contractName": "PolygonZkEVMBridge proxy", + "balance": "340282366920938463463374607431768211455", + "nonce": "1", + "address": "0x40E0576c0A7dff9dc460B29ba73e79aBf73dD2a9", + "bytecode": "0x60806040526004361061005d575f3560e01c80635c60da1b116100425780635c60da1b146100a65780638f283970146100e3578063f851a440146101025761006c565b80633659cfe6146100745780634f1ef286146100935761006c565b3661006c5761006a610116565b005b61006a610116565b34801561007f575f80fd5b5061006a61008e366004610854565b610130565b61006a6100a136600461086d565b610178565b3480156100b1575f80fd5b506100ba6101eb565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee575f80fd5b5061006a6100fd366004610854565b610228565b34801561010d575f80fd5b506100ba610255565b61011e610282565b61012e610129610359565b610362565b565b610138610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d8160405180602001604052805f8152505f6103bf565b50565b61016d610116565b610180610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101e3576101de8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250600192506103bf915050565b505050565b6101de610116565b5f6101f4610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610359565b905090565b610225610116565b90565b610230610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d816103e9565b5f61025e610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610380565b61028a610380565b73ffffffffffffffffffffffffffffffffffffffff16330361012e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b5f61021861044a565b365f80375f80365f845af43d5f803e80801561037c573d5ff35b3d5ffd5b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b6103c883610471565b5f825111806103d45750805b156101de576103e383836104bd565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f610412610380565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a161016d816104e9565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103a3565b61047a816105f5565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606104e28383604051806060016040528060278152602001610977602791396106c0565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811661058c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610350565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b73ffffffffffffffffffffffffffffffffffffffff81163b610699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610350565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105af565b60605f808573ffffffffffffffffffffffffffffffffffffffff16856040516106e9919061090b565b5f60405180830381855af49150503d805f8114610721576040519150601f19603f3d011682016040523d82523d5f602084013e610726565b606091505b509150915061073786838387610741565b9695505050505050565b606083156107d65782515f036107cf5773ffffffffffffffffffffffffffffffffffffffff85163b6107cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610350565b50816107e0565b6107e083836107e8565b949350505050565b8151156107f85781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103509190610926565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f575f80fd5b919050565b5f60208284031215610864575f80fd5b6104e28261082c565b5f805f6040848603121561087f575f80fd5b6108888461082c565b9250602084013567ffffffffffffffff808211156108a4575f80fd5b818601915086601f8301126108b7575f80fd5b8135818111156108c5575f80fd5b8760208285010111156108d6575f80fd5b6020830194508093505050509250925092565b5f5b838110156109035781810151838201526020016108eb565b50505f910152565b5f825161091c8184602087016108e9565b9190910192915050565b602081525f82518060208401526109448160408501602087016108e9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212202ac98acbfbb3d3ac1b74050e18c4e76db25a3ff2801ec69bf85d0c61414d502b64736f6c63430008140033", + "storage": { + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000fadb60b5059e31614e02083ff6c021a24c31c891", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000007cd6d5063c7782d34e2b1b03ed89ecf4a1412148" + } + }, + { + "contractName": "PolygonZkEVMGlobalExitRootL2 implementation", + "balance": "0", + "nonce": "1", + "address": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9", + "bytecode": "0x608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301fd90441461004e578063257b36321461006a57806333d6247d14610089578063a3c573eb1461009e575b5f80fd5b61005760015481565b6040519081526020015b60405180910390f35b61005761007836600461015e565b5f6020819052908152604090205481565b61009c61009736600461015e565b6100ea565b005b6100c57f00000000000000000000000040e0576c0a7dff9dc460b29ba73e79abf73dd2a981565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610061565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000040e0576c0a7dff9dc460b29ba73e79abf73dd2a91614610159576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b5f6020828403121561016e575f80fd5b503591905056fea26469706673582212205108c6c4f924146b736832a1bdf696e20d900450207b7452462368d150f2c71c64736f6c63430008140033" + }, + { + "contractName": "PolygonZkEVMGlobalExitRootL2 proxy", + "balance": "0", + "nonce": "1", + "address": "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa", + "bytecode": "0x60806040523661001357610011610017565b005b6100115b61001f6101b7565b6001600160a01b0316336001600160a01b0316141561016f5760606001600160e01b031960003516631b2ce7f360e11b8114156100655761005e6101ea565b9150610167565b6001600160e01b0319811663278f794360e11b14156100865761005e610241565b6001600160e01b031981166308f2839760e41b14156100a75761005e610287565b6001600160e01b031981166303e1469160e61b14156100c85761005e6102b8565b6001600160e01b03198116635c60da1b60e01b14156100e95761005e6102f8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b61017761030c565b565b606061019e83836040518060600160405280602781526020016108576027913961031c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101f4610394565b600061020336600481846106a2565b81019061021091906106e8565b905061022d8160405180602001604052806000815250600061039f565b505060408051602081019091526000815290565b606060008061025336600481846106a2565b8101906102609190610719565b915091506102708282600161039f565b604051806020016040528060008152509250505090565b6060610291610394565b60006102a036600481846106a2565b8101906102ad91906106e8565b905061022d816103cb565b60606102c2610394565b60006102cc6101b7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b6060610302610394565b60006102cc610422565b610177610317610422565b610431565b6060600080856001600160a01b0316856040516103399190610807565b600060405180830381855af49150503d8060008114610374576040519150601f19603f3d011682016040523d82523d6000602084013e610379565b606091505b509150915061038a86838387610455565b9695505050505050565b341561017757600080fd5b6103a8836104d3565b6000825111806103b55750805b156103c6576103c48383610179565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103f46101b7565b604080516001600160a01b03928316815291841660208301520160405180910390a161041f81610513565b50565b600061042c6105bc565b905090565b3660008037600080366000845af43d6000803e808015610450573d6000f35b3d6000fd5b606083156104c15782516104ba576001600160a01b0385163b6104ba5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161015e565b50816104cb565b6104cb83836105e4565b949350505050565b6104dc8161060e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105785760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161015e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101db565b8151156105f45781518083602001fd5b8060405162461bcd60e51b815260040161015e9190610823565b6001600160a01b0381163b61067b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161015e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61059b565b600080858511156106b257600080fd5b838611156106bf57600080fd5b5050820193919092039150565b80356001600160a01b03811681146106e357600080fd5b919050565b6000602082840312156106fa57600080fd5b61019e826106cc565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561072c57600080fd5b610735836106cc565b9150602083013567ffffffffffffffff8082111561075257600080fd5b818501915085601f83011261076657600080fd5b81358181111561077857610778610703565b604051601f8201601f19908116603f011681019083821181831017156107a0576107a0610703565b816040528281528860208487010111156107b957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107f65781810151838201526020016107de565b838111156103c45750506000910152565b600082516108198184602087016107db565b9190910192915050565b60208152600082518060208401526108428160408501602087016107db565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122012bb4f564f73959a03513dc74fc3c6e40e8386e6f02c16b78d6db00ce0aa16af64736f6c63430008090033", + "storage": { + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000fadb60b5059e31614e02083ff6c021a24c31c891", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9" + } + }, + { + "contractName": "PolygonZkEVMTimelock", + "balance": "0", + "nonce": "1", + "address": "0x0165878A594ca255338adfa4d48449f69242Eb8F", + "bytecode": "0x6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220d904e0b10230579952f8427a107aa4349f9a1f5799108d399b11e28b578463e464736f6c63430008140033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000e10", + "0xaedcc9e7897c0d335bdc5d92fe3a8b4f23727fe558cd1c19f332b28716a30559": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xf5e61edb9c9cc6bfbae4463e9a2b1dd6ac3b44ddef38f18016e56ba0363910d9": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x64494413541ff93b31aa309254e3fed72a7456e9845988b915b4c7a7ceba8814": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x60b9d94c75b7b3f721925089391e4644cd890cb5e6466f9596dfbd2c54e0b280": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x3412d5605ac6cd444957cedb533e5dacad6378b4bc819ebe3652188a665066d6": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x4b63b79f1e338a49559dcd3193ac9eecc50d0f275d24e97cc8c319e5a31a8bd0": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d706a": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x800d5dfe4bba53eedee06cd4546a27da8de00f12db83f56062976d4493fda899": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xc3ad33e20b0c56a223ad5104fff154aa010f8715b9c981fd38fdc60a4d1a52fc": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5" + } + }, + { + "accountName": "keyless Deployer", + "balance": "0", + "nonce": "1", + "address": "0x694AB5383a002a4796f95530c14Cf0C25ec3EA03" + }, + { + "accountName": "deployer", + "balance": "100000000000000000000000", + "nonce": "8", + "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + } + ] +} \ No newline at end of file diff --git a/package.json b/package.json index a7cf93486..52846cf88 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ "solidity-docgen": "^0.5.17" }, "scripts": { - "saveDeployment:goerli": "mkdir -p deployments/goerli_$(date +%s) && cp -r deployment/deploy_*.json deployments/goerli_$(date +%s) && cp .openzeppelin/goerli.json deployments/goerli_$(date +%s) && cp deployment/genesis.json deployments/goerli_$(date +%s)", - "saveDeployment:mainnet": "mkdir -p deployments/mainnet_$(date +%s) && cp -r deployment/deploy_*.json deployments/mainnet_$(date +%s) && cp .openzeppelin/mainnet.json deployments/mainnet_$(date +%s) && cp deployment/genesis.json deployments/mainnet_$(date +%s)", + "saveDeployment:goerli": "mkdir -p deployments/goerli_$(date +%s) && cp -r deployment/v2/deploy_*.json deployments/goerli_$(date +%s) && cp .openzeppelin/goerli.json deployments/goerli_$(date +%s) && cp deployment/v2/genesis.json deployments/goerli_$(date +%s)", + "saveDeployment:mainnet": "mkdir -p deployments/mainnet_$(date +%s) && cp -r deployment/v2/deploy_*.json deployments/mainnet_$(date +%s) && cp .openzeppelin/mainnet.json deployments/mainnet_$(date +%s) && cp deployment/v2/genesis.json deployments/mainnet_$(date +%s)", "test": "npx hardhat test test/contracts/**.test.js", "docgen": "npx solidity-docgen --solc-module solc-0.8 -t ./docs/templates -e ./contracts/verifiers,./contracts/mocks", "prepare:testnet:ZkEVM:localhost": "npx hardhat run deployment/testnet/prepareTestnet.ts --network localhost", @@ -74,8 +74,8 @@ "lint": "npx eslint ./test && npx eslint ./docker/scripts && npx eslint ./deployment && npx eslint ./src", "lint:fix": "npx eslint ./test --fix && npx eslint ./docker/scripts --fix && npx eslint ./deployment --fix && npx eslint ./src --fix", "compile": "npx hardhat compile", - "docker:contracts": "./docker/scripts/deploy-docker.sh", - "dockerv2:contracts": "./docker/scripts/deploy-dockerv2.sh", + "docker:contracts": "./docker/scripts/v2/deploy-docker.sh", + "dockerv2:contracts": "sudo ./docker/scripts/v2/deploy-dockerv2.sh", "push:docker:contracts": "docker push hermeznetwork/geth-zkevm-contracts", "update:genesis": "node deployment/1_createGenesis.js && node deployment/1_createGenesis.js --test --input ../docker/scripts/deploy_parameters_docker.json --out ../docker/scripts/genesis_docker.json", "coverage": "npx hardhat coverage", @@ -83,7 +83,7 @@ "gas:report:file": "rm -f .openzeppelin/unknown-31337.json && REPORT_GAS=true REPORT_GAS_FILE=true npx hardhat test", "deploy:v2:localhost": "rm -f .openzeppelin/unknown-31337.json && npx ts-node deployment/v2/1_createGenesis.ts --test && npx hardhat run deployment/v2/2_deployPolygonZKEVMDeployer.ts --network localhost && npx hardhat run deployment/v2/3_deployContracts.ts --network localhost && npx hardhat run deployment/v2/4_createRollup.ts --network localhost", "deploy:testnet:v2:localhost": "rm -f deployment/v2/deploy_ongoing.json && npm run prepare:testnet:ZkEVM:localhost && npm run deploy:v2:localhost", - "deploy:v2:goerli": "npx ts-node deployment/v2/1_createGenesis.ts && npx hardhat run deployment/v2/2_deployPolygonZKEVMDeployer.ts --network goerli && npx hardhat run deployment/v2/3_deployContracts.ts --network goerli && npx hardhat run deployment/v2/4_createRollup.ts --network goerli", + "deploy:v2:goerli": "npx ts-node deployment/v2/1_createGenesis.ts && npx hardhat run deployment/v2/2_deployPolygonZKEVMDeployer.ts --network goerli && npx hardhat run deployment/v2/3_deployContracts.ts --network goerli && npx hardhat run deployment/v2/4_createRollup.ts --network goerli && npm run saveDeployment:goerli", "deploy:testnet:v2:goerli": "rm -f deployment/v2/deploy_ongoing.json && npm run prepare:testnet:ZkEVM:goerli && npm run deploy:v2:goerli", "verify:v2:goerli": "npx hardhat run deployment/v2/verifyContracts.js --network goerli" } From 5cc26713c09460744afe140b2afa196555b52cce Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 18 Oct 2023 16:55:31 +0200 Subject: [PATCH 079/230] update genesis --- deployment/v2/4_createRollup.ts | 18 ++- deployment/v2/genesis.json | 8 +- docker/scripts/v2/genesis.json | 188 ++++++++++++++++---------------- 3 files changed, 120 insertions(+), 94 deletions(-) diff --git a/deployment/v2/4_createRollup.ts b/deployment/v2/4_createRollup.ts index 9a7e32e52..50f90c9e6 100644 --- a/deployment/v2/4_createRollup.ts +++ b/deployment/v2/4_createRollup.ts @@ -12,13 +12,14 @@ import {HardhatEthersSigner} from "@nomicfoundation/hardhat-ethers/signers"; const {create2Deployment} = require("../helpers/deployment-helpers"); const pathOutputJson = path.join(__dirname, "./deploy_output.json"); +const pathGenesis = path.join(__dirname, "./genesis.json"); const deployParameters = require("./deploy_parameters.json"); const genesis = require("./genesis.json"); const deployOutput = require("./deploy_output.json"); import "../helpers/utils"; -import {PolygonRollupManager} from "../../typechain-types"; +import {PolygonRollupManager, PolygonZkEVMV2} from "../../typechain-types"; async function main() { /* @@ -168,7 +169,9 @@ async function main() { trustedSequencerURL, networkName ); - await txDeployRollup.wait(); + const receipt = await txDeployRollup.wait(); + const timestampReceipt = (await receipt?.getBlock())?.timestamp; + const rollupID = await rollupManagerContract.chainIDToRollupID(chainID); console.log("#######################\n"); console.log("Created new Rollup:", newZKEVMAddress); @@ -180,7 +183,18 @@ async function main() { deployOutput.newZKEVMAddress = newZKEVMAddress; deployOutput.verifierAddress = verifierContract.target; + // Add the first batch of the created rollup + const newZKEVMContract = (await PolygonZKEVMV2Factory.attach(newZKEVMAddress)) as PolygonZkEVMV2; + const batchData = { + transactions: await newZKEVMContract.generateInitializeTransaction(rollupID, gasTokenAddress, gasTokenNetwork), + globalExitRoot: ethers.ZeroHash, + timestamp: timestampReceipt, + sequencer: trustedSequencer, + }; + genesis.firstBatchData = batchData; + fs.writeFileSync(pathOutputJson, JSON.stringify(deployOutput, null, 1)); + fs.writeFileSync(pathGenesis, JSON.stringify(genesis, null, 1)); } main().catch((e) => { diff --git a/deployment/v2/genesis.json b/deployment/v2/genesis.json index 1d91982a7..f563ec296 100644 --- a/deployment/v2/genesis.json +++ b/deployment/v2/genesis.json @@ -88,5 +88,11 @@ "nonce": "8", "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" } - ] + ], + "firstBatchData": { + "transactions": "0xf8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4d3476afe000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a40d5f56745a118d0906a34e69aec8c0db1cb8fa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ca1ab1e0000000000000000000000000000000000000000000000000000000005ca1ab1e1bff", + "globalExitRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1697640780, + "sequencer": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + } } \ No newline at end of file diff --git a/docker/scripts/v2/genesis.json b/docker/scripts/v2/genesis.json index 1d91982a7..959cd157b 100644 --- a/docker/scripts/v2/genesis.json +++ b/docker/scripts/v2/genesis.json @@ -1,92 +1,98 @@ { - "root": "0x40bdab77c40f497be8a427027b336f7a51a0692c3fb20ff36519bc5a79dc60fd", - "genesis": [ - { - "contractName": "PolygonZkEVMDeployer", - "balance": "0", - "nonce": "4", - "address": "0xFbD07134824dDEa24E4ae414c18ecbFa98169A24", - "bytecode": "0x60806040526004361061006e575f3560e01c8063715018a61161004c578063715018a6146100e25780638da5cb5b146100f6578063e11ae6cb1461011f578063f2fde38b14610132575f80fd5b80632b79805a146100725780634a94d487146100875780636d07dbf81461009a575b5f80fd5b610085610080366004610908565b610151565b005b6100856100953660046109a2565b6101c2565b3480156100a5575f80fd5b506100b96100b43660046109f5565b610203565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ed575f80fd5b50610085610215565b348015610101575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff166100b9565b61008561012d366004610a15565b610228565b34801561013d575f80fd5b5061008561014c366004610a61565b61028e565b61015961034a565b5f6101658585856103ca565b90506101718183610527565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a15050505050565b6101ca61034a565b6101d583838361056a565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b905f90a1505050565b5f61020e8383610598565b9392505050565b61021d61034a565b6102265f6105a4565b565b61023061034a565b5f61023c8484846103ca565b60405173ffffffffffffffffffffffffffffffffffffffff821681529091507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a150505050565b61029661034a565b73ffffffffffffffffffffffffffffffffffffffff811661033e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610347816105a4565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610335565b5f83471015610435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610335565b81515f0361049f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610335565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff811661020e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610335565b606061020e83835f6040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c65640000815250610618565b6060610590848484604051806060016040528060298152602001610b0860299139610618565b949350505050565b5f61020e83833061072d565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156106aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610335565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516106d29190610a9c565b5f6040518083038185875af1925050503d805f811461070c576040519150601f19603f3d011682016040523d82523d5f602084013e610711565b606091505b509150915061072287838387610756565b979650505050505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b606083156107eb5782515f036107e45773ffffffffffffffffffffffffffffffffffffffff85163b6107e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610335565b5081610590565b61059083838151156108005781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103359190610ab7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112610870575f80fd5b813567ffffffffffffffff8082111561088b5761088b610834565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156108d1576108d1610834565b816040528381528660208588010111156108e9575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f806080858703121561091b575f80fd5b8435935060208501359250604085013567ffffffffffffffff80821115610940575f80fd5b61094c88838901610861565b93506060870135915080821115610961575f80fd5b5061096e87828801610861565b91505092959194509250565b803573ffffffffffffffffffffffffffffffffffffffff8116811461099d575f80fd5b919050565b5f805f606084860312156109b4575f80fd5b6109bd8461097a565b9250602084013567ffffffffffffffff8111156109d8575f80fd5b6109e486828701610861565b925050604084013590509250925092565b5f8060408385031215610a06575f80fd5b50508035926020909101359150565b5f805f60608486031215610a27575f80fd5b8335925060208401359150604084013567ffffffffffffffff811115610a4b575f80fd5b610a5786828701610861565b9150509250925092565b5f60208284031215610a71575f80fd5b61020e8261097a565b5f5b83811015610a94578181015183820152602001610a7c565b50505f910152565b5f8251610aad818460208701610a7a565b9190910192915050565b602081525f8251806020840152610ad5816040850160208701610a7a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220330b94dc698c4d290bf55c23f13b473cde6a6bae0030cb902de18af54e35839f64736f6c63430008140033", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" - } - }, - { - "contractName": "ProxyAdmin", - "balance": "0", - "nonce": "1", - "address": "0xfADB60b5059e31614e02083fF6C021a24C31c891", - "bytecode": "0x608060405260043610610079575f3560e01c80639623609d1161004c5780639623609d1461012357806399a88ec414610136578063f2fde38b14610155578063f3b7dead14610174575f80fd5b8063204e1c7a1461007d578063715018a6146100c55780637eff275e146100db5780638da5cb5b146100fa575b5f80fd5b348015610088575f80fd5b5061009c6100973660046105e8565b610193565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100d0575f80fd5b506100d9610244565b005b3480156100e6575f80fd5b506100d96100f536600461060a565b610257565b348015610105575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff1661009c565b6100d961013136600461066e565b6102e0565b348015610141575f80fd5b506100d961015036600461060a565b610371565b348015610160575f80fd5b506100d961016f3660046105e8565b6103cd565b34801561017f575f80fd5b5061009c61018e3660046105e8565b610489565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907f5c60da1b00000000000000000000000000000000000000000000000000000000815260040190565b5f60405180830381855afa9150503d805f8114610215576040519150601f19603f3d011682016040523d82523d5f602084013e61021a565b606091505b509150915081610228575f80fd5b8080602001905181019061023c919061075b565b949350505050565b61024c6104d3565b6102555f610553565b565b61025f6104d3565b6040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690638f283970906024015b5f604051808303815f87803b1580156102c6575f80fd5b505af11580156102d8573d5f803e3d5ffd5b505050505050565b6102e86104d3565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef28690349061033e9086908690600401610776565b5f604051808303818588803b158015610355575f80fd5b505af1158015610367573d5f803e3d5ffd5b5050505050505050565b6103796104d3565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690633659cfe6906024016102af565b6103d56104d3565b73ffffffffffffffffffffffffffffffffffffffff811661047d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61048681610553565b50565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907ff851a44000000000000000000000000000000000000000000000000000000000815260040190565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610474565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610486575f80fd5b5f602082840312156105f8575f80fd5b8135610603816105c7565b9392505050565b5f806040838503121561061b575f80fd5b8235610626816105c7565b91506020830135610636816105c7565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f805f60608486031215610680575f80fd5b833561068b816105c7565b9250602084013561069b816105c7565b9150604084013567ffffffffffffffff808211156106b7575f80fd5b818601915086601f8301126106ca575f80fd5b8135818111156106dc576106dc610641565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561072257610722610641565b8160405282815289602084870101111561073a575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f6020828403121561076b575f80fd5b8151610603816105c7565b73ffffffffffffffffffffffffffffffffffffffff831681525f602060408184015283518060408501525f5b818110156107be578581018301518582016060015282016107a2565b505f6060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050939250505056fea26469706673582212203083a4ccc2e42eed60bd19037f2efa77ed086dc7a5403f75bebb995dcba2221c64736f6c63430008140033", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f" - } - }, - { - "contractName": "PolygonZkEVMBridge implementation", - "balance": "0", - "nonce": "1", - "address": "0x7Cd6d5063c7782d34E2b1b03ED89ecf4A1412148", - "bytecode": "0x608060405260043610620001d3575f3560e01c80638ed7e3f211620000fa578063cd5865791162000092578063dbc16976116200006a578063dbc169761462000685578063ee25560b146200069c578063f5efcd7914620006cb578063fb57083414620006ef575f80fd5b8063cd5865791462000620578063d02103ca1462000637578063d3476afe1462000661575f80fd5b8063bab161bf11620000d2578063bab161bf146200057a578063be5831c7146200059d578063cc46163214620005d8578063ccaa2d1114620005fc575f80fd5b80638ed7e3f21462000511578063aaa13cc21462000532578063b8b284d01462000556575f80fd5b80633cbc795b116200016e5780635ca1e16511620001465780635ca1e165146200048757806379e2cf97146200049e57806381b1c17414620004b557806383f2440314620004ed575f80fd5b80633cbc795b14620003285780633e19704314620003745780634b2f336d1462000466575f80fd5b8063240ff37811620001ae578063240ff378146200025d5780632dfdf0b51462000274578063318aee3d146200029a5780633c351e101462000307575f80fd5b806315064c9614620001d75780632072f6c5146200020757806322e95f2c1462000220575b5f80fd5b348015620001e3575f80fd5b50606854620001f29060ff1681565b60405190151581526020015b60405180910390f35b34801562000213575f80fd5b506200021e62000713565b005b3480156200022c575f80fd5b50620002446200023e36600462003723565b62000764565b6040516001600160a01b039091168152602001620001fe565b6200021e6200026e366004620037b3565b620007f9565b34801562000280575f80fd5b506200028b60535481565b604051908152602001620001fe565b348015620002a6575f80fd5b50620002e2620002b836600462003832565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201620001fe565b34801562000313575f80fd5b50606d5462000244906001600160a01b031681565b34801562000334575f80fd5b50606d546200035e9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001620001fe565b34801562000380575f80fd5b506200028b6200039236600462003866565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b34801562000472575f80fd5b50606e5462000244906001600160a01b031681565b34801562000493575f80fd5b506200028b62000862565b348015620004aa575f80fd5b506200021e62000947565b348015620004c1575f80fd5b5062000244620004d3366004620038eb565b606a6020525f90815260409020546001600160a01b031681565b348015620004f9575f80fd5b506200028b6200050b36600462003915565b62000981565b3480156200051d575f80fd5b50606c5462000244906001600160a01b031681565b3480156200053e575f80fd5b50620002446200055036600462003956565b62000a64565b34801562000562575f80fd5b506200021e6200057436600462003a03565b62000bf4565b34801562000586575f80fd5b506068546200035e90610100900463ffffffff1681565b348015620005a9575f80fd5b506068546200035e90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b348015620005e4575f80fd5b50620001f2620005f636600462003a8b565b62000cc9565b34801562000608575f80fd5b506200021e6200061a36600462003ac1565b62000d58565b6200021e6200063136600462003bb5565b6200144d565b34801562000643575f80fd5b5060685462000244906501000000000090046001600160a01b031681565b3480156200066d575f80fd5b506200021e6200067f36600462003c51565b62001a03565b34801562000691575f80fd5b506200021e62001dd7565b348015620006a8575f80fd5b506200028b620006ba366004620038eb565b60696020525f908152604090205481565b348015620006d7575f80fd5b506200021e620006e936600462003ac1565b62001e26565b348015620006fb575f80fd5b50620001f26200070d36600462003cc5565b620021aa565b606c546001600160a01b0316331462000758576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000762620021c5565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b3415801590620008135750606e546001600160a01b031615155b156200084b576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200085b85853486868662002258565b5050505050565b6053545f90819081805b60208110156200093e578083901c600116600103620008cf57603381602081106200089b576200089b62003d0f565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620008fc565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620009359062003d69565b9150506200086c565b50919392505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000762576200076262002340565b5f83815b602081101562000a5b57600163ffffffff8516821c81169003620009f757848160208110620009b857620009b862003d0f565b602002013582604051602001620009d9929190918252602082015260400190565b60405160208183030381529060405280519060200120915062000a46565b8185826020811062000a0d5762000a0d62003d0f565b602002013560405160200162000a2d929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062000a528162003d69565b91505062000985565b50949350505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b30836040518060200162000af890620036e9565b601f1982820381018352601f90910116604081905262000b25908d908d908d908d908d9060200162003dcc565b60408051601f198184030181529082905262000b45929160200162003e30565b6040516020818303038152906040528051906020012060405160200162000bce94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b606e546001600160a01b031662000c37576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606e546040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018690526001600160a01b0390911690639dc29fac906044015f604051808303815f87803b15801562000c9a575f80fd5b505af115801562000cad573d5f803e3d5ffd5b5050505062000cc186868686868662002258565b505050505050565b6068545f908190610100900463ffffffff1615801562000cef575063ffffffff83166001145b1562000d03575063ffffffff831662000d2f565b62000d1a64010000000063ffffffff851662003e62565b62000d2c9063ffffffff861662003e7c565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000d96576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161462000de0576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000ee78c8c8c8c8c62000ee15f8e8e8e8e8e8e8e60405162000e0592919062003e92565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62002409565b6001600160a01b0386166200105657606e546001600160a01b031662000fd4575f6001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000f40576020820181803683370190505b5060405162000f50919062003ece565b5f6040518083038185875af1925050503d805f811462000f8c576040519150601f19603f3d011682016040523d82523d5f602084013e62000f91565b606091505b505090508062000fcd576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50620013e3565b606e546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015260248201869052909116906340c10f19906044015f604051808303815f87803b15801562001039575f80fd5b505af11580156200104c573d5f803e3d5ffd5b50505050620013e3565b606d546001600160a01b038781169116148015620010965750606d5463ffffffff8881167401000000000000000000000000000000000000000090920416145b15620010af575f6001600160a01b038516848262000f15565b60685463ffffffff610100909104811690881603620010e457620010de6001600160a01b0387168585620025e1565b620013e3565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b03168062001367575f80806200118b8688018862003fa1565b9250925092505f85848484604051620011a490620036e9565b620011b2939291906200404a565b8190604051809103905ff5905080158015620011d0573d5f803e3d5ffd5b506040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562001236575f80fd5b505af115801562001249573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b6040516200135595949392919062004086565b60405180910390a150505050620013e0565b6040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b158015620013c8575f80fd5b505af1158015620013db573d5f803e3d5ffd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156200148b576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200149562002691565b60685463ffffffff610100909104811690881603620014e0576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f806060876001600160a01b03881662001563578834146200152e576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d546001600160a01b038116945074010000000000000000000000000000000000000000900463ffffffff169250620018a2565b34156200159c576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606e546001600160a01b03908116908916036200162f576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018a90526001600160a01b03891690639dc29fac906044015f604051808303815f87803b15801562001612575f80fd5b505af115801562001625573d5f803e3d5ffd5b50505050620018a2565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620016fe576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b90526001600160a01b038a1690639dc29fac906044015f604051808303815f87803b158015620016d4575f80fd5b505af1158015620016e7573d5f803e3d5ffd5b5050505080602001519450805f01519350620018a0565b8515620017135762001713898b898962002706565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa15801562001771573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620017979190620040c0565b9050620017b06001600160a01b038b1633308e62002bb1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa1580156200180e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620018349190620040c0565b9050620018428282620040d8565b6068548c9850610100900463ffffffff1696509350620018628762002c04565b6200186d8c62002d0b565b620018788d62002e07565b6040516020016200188c939291906200404a565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620018e3989796959493929190620040ee565b60405180910390a1620019db620019d55f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62002ef2565b8615620019ec57620019ec62002340565b50505050620019fa60018055565b50505050505050565b5f54610100900460ff161580801562001a2257505f54600160ff909116105b8062001a3d5750303b15801562001a3d57505f5460ff166001145b62001acf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801562001b2c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8916027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016848316179055606d541662001c3157606d5474010000000000000000000000000000000000000000900463ffffffff161562001c2b576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001d63565b606d805463ffffffff861674010000000000000000000000000000000000000000027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b038816171790556040515f9060129062001c9890620036e9565b6060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff909116604082015260e0018190604051809103905ff590508015801562001d29573d5f803e3d5ffd5b50606e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790555b62001d6d62003007565b801562000cc1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b606c546001600160a01b0316331462001e1c576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000762620030a9565b60685460ff161562001e64576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161462001eae576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001ed48c8c8c8c8c62000ee160018e8e8e8e8e8e8e60405162000e0592919062003e92565b606e545f906001600160a01b031662001fbd57846001600160a01b031684888a868660405160240162001f0b949392919062004159565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f2000000000000000000000000000000000000000000000000000000001790525162001f70919062003ece565b5f6040518083038185875af1925050503d805f811462001fac576040519150601f19603f3d011682016040523d82523d5f602084013e62001fb1565b606091505b50508091505062002107565b606e546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260248201879052909116906340c10f19906044015f604051808303815f87803b15801562002022575f80fd5b505af115801562002035573d5f803e3d5ffd5b50505050846001600160a01b0316878985856040516024016200205c949392919062004159565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f20000000000000000000000000000000000000000000000000000000017905251620020c1919062003ece565b5f604051808303815f865af19150503d805f8114620020fc576040519150601f19603f3d011682016040523d82523d5f602084013e62002101565b606091505b50909150505b806200213f576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f81620021b986868662000981565b1490505b949350505050565b60685460ff161562002203576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff610100909104811690871603620022a3576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051620022f99998979695949392919062004193565b60405180910390a162002334620019d56001606860019054906101000a900463ffffffff16338a8a8a898960405162000e0592919062003e92565b821562000cc15762000cc15b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d620023b962000862565b6040518263ffffffff1660e01b8152600401620023d891815260200190565b5f604051808303815f87803b158015620023f0575f80fd5b505af115801562002403573d5f803e3d5ffd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af11580156200249b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620024c19190620040c0565b9050805f03620024fc576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80680100000000000000008716600103620025605786915062002523848a8489620021aa565b6200255a576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620025ca565b602087901c6200257281600162004200565b91508792506200259162002588868c8662000981565b8a8389620021aa565b620025c8576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b620025d6828262003138565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526200268c9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262003200565b505050565b600260015403620026ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001ac6565b6002600155565b5f62002716600482848662004227565b620027219162004250565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002967575f80808080808062002783896004818d62004227565b81019062002792919062004299565b9650965096509650965096509650336001600160a01b0316876001600160a01b031614620027ec576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03861630146200282f576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002869576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002917919062003ece565b5f604051808303815f865af19150503d805f811462002952576040519150601f19603f3d011682016040523d82523d5f602084013e62002957565b606091505b505050505050505050506200085b565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c0000000000000000000000000000000000000000000000000000000014620029e3576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80808080808080620029fa8a6004818e62004227565b81019062002a099190620042ef565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462002a65576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038716301462002aa8576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002b5f919062003ece565b5f604051808303815f865af19150503d805f811462002b9a576040519150601f19603f3d011682016040523d82523d5f602084013e62002b9f565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052620024039085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002627565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b0386169162002c7a919062003ece565b5f60405180830381855afa9150503d805f811462002cb4576040519150601f19603f3d011682016040523d82523d5f602084013e62002cb9565b606091505b50915091508162002d00576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250620021bd565b620021bd8162003305565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b0386169162002d81919062003ece565b5f60405180830381855afa9150503d805f811462002dbb576040519150601f19603f3d011682016040523d82523d5f602084013e62002dc0565b606091505b50915091508162002d00576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250620021bd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b0386169162002e7c919062003ece565b5f60405180830381855afa9150503d805f811462002eb6576040519150601f19603f3d011682016040523d82523d5f602084013e62002ebb565b606091505b509150915081801562002ecf575080516020145b62002edc576012620021bd565b80806020019051810190620021bd919062004376565b80600162002f0360206002620044cb565b62002f0f9190620040d8565b6053541062002f4a576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462002f5b9062003d69565b918290555090505f5b602081101562002ff6578082901c60011660010362002f9c57826033826020811062002f945762002f9462003d0f565b015550505050565b6033816020811062002fb25762002fb262003d0f565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062002fed9062003d69565b91505062002f64565b506200268c620044d8565b60018055565b5f54610100900460ff166200309f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001ac6565b62000762620034f0565b60685460ff16620030e6576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b6068545f90610100900463ffffffff161580156200315c575063ffffffff82166001145b1562003170575063ffffffff82166200319c565b6200318764010000000063ffffffff841662003e62565b620031999063ffffffff851662003e7c565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620019fa576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62003256826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620035889092919063ffffffff16565b8051909150156200268c578080602001905181019062003277919062004505565b6200268c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001ac6565b60606040825110620033275781806020019051810190620007f3919062004523565b8151602003620034b2575f5b6020811080156200337e575082818151811062003354576200335462003d0f565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620033995780620033908162003d69565b91505062003333565b805f03620033dc57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115620033f957620033f962003ea1565b6040519080825280601f01601f19166020018201604052801562003424576020820181803683370190505b5090505f5b82811015620034aa5784818151811062003447576200344762003d0f565b602001015160f81c60f81b82828151811062003467576200346762003d0f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620034a18162003d69565b91505062003429565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b5f54610100900460ff1662003001576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001ac6565b6060620021bd84845f85855f80866001600160a01b03168587604051620035b0919062003ece565b5f6040518083038185875af1925050503d805f8114620035ec576040519150601f19603f3d011682016040523d82523d5f602084013e620035f1565b606091505b509150915062003604878383876200360f565b979650505050505050565b606083156200369c5782515f0362003694576001600160a01b0385163b62003694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001ac6565b5081620021bd565b620021bd8383815115620036b35781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001ac691906200459e565b6119a180620045b383390190565b803563ffffffff81168114620034eb575f80fd5b6001600160a01b038116811462003720575f80fd5b50565b5f806040838503121562003735575f80fd5b6200374083620036f7565b9150602083013562003752816200370b565b809150509250929050565b801515811462003720575f80fd5b5f8083601f8401126200377c575f80fd5b50813567ffffffffffffffff81111562003794575f80fd5b602083019150836020828501011115620037ac575f80fd5b9250929050565b5f805f805f60808688031215620037c8575f80fd5b620037d386620036f7565b94506020860135620037e5816200370b565b93506040860135620037f7816200375d565b9250606086013567ffffffffffffffff81111562003813575f80fd5b62003821888289016200376b565b969995985093965092949392505050565b5f6020828403121562003843575f80fd5b813562003850816200370b565b9392505050565b60ff8116811462003720575f80fd5b5f805f805f805f60e0888a0312156200387d575f80fd5b87356200388a8162003857565b96506200389a60208901620036f7565b95506040880135620038ac816200370b565b9450620038bc60608901620036f7565b93506080880135620038ce816200370b565b9699959850939692959460a0840135945060c09093013592915050565b5f60208284031215620038fc575f80fd5b5035919050565b806104008101831015620007f3575f80fd5b5f805f610440848603121562003929575f80fd5b833592506200393c856020860162003903565b91506200394d6104208501620036f7565b90509250925092565b5f805f805f805f60a0888a0312156200396d575f80fd5b6200397888620036f7565b965060208801356200398a816200370b565b9550604088013567ffffffffffffffff80821115620039a7575f80fd5b620039b58b838c016200376b565b909750955060608a0135915080821115620039ce575f80fd5b50620039dd8a828b016200376b565b9094509250506080880135620039f38162003857565b8091505092959891949750929550565b5f805f805f8060a0878903121562003a19575f80fd5b62003a2487620036f7565b9550602087013562003a36816200370b565b945060408701359350606087013562003a4f816200375d565b9250608087013567ffffffffffffffff81111562003a6b575f80fd5b62003a7989828a016200376b565b979a9699509497509295939492505050565b5f806040838503121562003a9d575f80fd5b62003aa883620036f7565b915062003ab860208401620036f7565b90509250929050565b5f805f805f805f805f805f806109208d8f03121562003ade575f80fd5b62003aea8e8e62003903565b9b5062003afc8e6104008f0162003903565b9a506108008d013599506108208d013598506108408d0135975062003b256108608e01620036f7565b965062003b376108808e01356200370b565b6108808d0135955062003b4e6108a08e01620036f7565b945062003b606108c08e01356200370b565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111562003b8a575f80fd5b62003b9d8e6109008f01358f016200376b565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121562003bcc575f80fd5b62003bd788620036f7565b9650602088013562003be9816200370b565b955060408801359450606088013562003c02816200370b565b9350608088013562003c14816200375d565b925060a088013567ffffffffffffffff81111562003c30575f80fd5b62003c3e8a828b016200376b565b989b979a50959850939692959293505050565b5f805f805f60a0868803121562003c66575f80fd5b62003c7186620036f7565b9450602086013562003c83816200370b565b935062003c9360408701620036f7565b9250606086013562003ca5816200370b565b9150608086013562003cb7816200370b565b809150509295509295909350565b5f805f80610460858703121562003cda575f80fd5b8435935062003ced866020870162003903565b925062003cfe6104208601620036f7565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003d9c5762003d9c62003d3c565b5060010190565b81835281816020850137505f602082840101525f6020601f19601f840116840101905092915050565b606081525f62003de160608301878962003da3565b828103602084015262003df681868862003da3565b91505060ff831660408301529695505050505050565b5f5b8381101562003e2857818101518382015260200162003e0e565b50505f910152565b5f835162003e4381846020880162003e0c565b83519083019062003e5981836020880162003e0c565b01949350505050565b8082028115828204841417620007f357620007f362003d3c565b80820180821115620007f357620007f362003d3c565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f825162003ee181846020870162003e0c565b9190910192915050565b604051601f8201601f1916810167ffffffffffffffff8111828210171562003f175762003f1762003ea1565b604052919050565b5f67ffffffffffffffff82111562003f3b5762003f3b62003ea1565b50601f01601f191660200190565b5f82601f83011262003f59575f80fd5b813562003f7062003f6a8262003f1f565b62003eeb565b81815284602083860101111562003f85575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003fb4575f80fd5b833567ffffffffffffffff8082111562003fcc575f80fd5b62003fda8783880162003f49565b9450602086013591508082111562003ff0575f80fd5b5062003fff8682870162003f49565b9250506040840135620040128162003857565b809150509250925092565b5f81518084526200403681602086016020860162003e0c565b601f01601f19169290920160200192915050565b606081525f6200405e60608301866200401d565b82810360208401526200407281866200401d565b91505060ff83166040830152949350505050565b63ffffffff861681525f6001600160a01b038087166020840152808616604084015250608060608301526200360460808301848662003da3565b5f60208284031215620040d1575f80fd5b5051919050565b81810381811115620007f357620007f362003d3c565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c085015262004140828501876200401d565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f6200418960608301848662003da3565b9695505050505050565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620041e6828501878962003da3565b925080851660e085015250509a9950505050505050505050565b63ffffffff81811683821601908082111562004220576200422062003d3c565b5092915050565b5f808585111562004236575f80fd5b8386111562004243575f80fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620042915780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215620042b0575f80fd5b8735620042bd816200370b565b96506020880135620042cf816200370b565b955060408801359450606088013593506080880135620038ce8162003857565b5f805f805f805f80610100898b03121562004308575f80fd5b883562004315816200370b565b9750602089013562004327816200370b565b96506040890135955060608901359450608089013562004347816200375d565b935060a0890135620043598162003857565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004387575f80fd5b8151620038508162003857565b600181815b80851115620043f357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620043d757620043d762003d3c565b80851615620043e557918102915b93841c939080029062004399565b509250929050565b5f826200440b57506001620007f3565b816200441957505f620007f3565b81600181146200443257600281146200443d576200445d565b6001915050620007f3565b60ff84111562004451576200445162003d3c565b50506001821b620007f3565b5060208310610133831016604e8410600b841016171562004482575081810a620007f3565b6200448e838362004394565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620044c357620044c362003d3c565b029392505050565b5f620038508383620043fb565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6020828403121562004516575f80fd5b815162003850816200375d565b5f6020828403121562004534575f80fd5b815167ffffffffffffffff8111156200454b575f80fd5b8201601f810184136200455c575f80fd5b80516200456d62003f6a8262003f1f565b81815285602083850101111562004582575f80fd5b6200459582602083016020860162003e0c565b95945050505050565b602081525f6200385060208301846200401d56fe61010060405234801562000011575f80fd5b50604051620019a1380380620019a1833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516115036200049e5f395f61022d01525f81816102fb015281816105ad015261067a01525f61052801525f818161036d01526104f201526115035ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b6040516101879190611255565b60405180910390f35b6101a361019e3660046112e6565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461130e565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d3660046112e6565b61054a565b6102856102803660046112e6565b610595565b005b6101b7610295366004611347565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca366004611347565b60056020525f908152604090205481565b61017a610653565b6102856102f13660046112e6565b610662565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a36103503660046112e6565b610717565b6101a36103633660046112e6565b6107cd565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d366004611367565b6107da565b6101b76103b03660046113d4565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611405565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611405565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610ad7565b60019150505b92915050565b5f336104d9858285610c56565b6104e4858585610d12565b506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146105255761052046610f31565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c09082908690610590908790611483565b610ad7565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106455760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61064f8282610ff8565b5050565b60606004805461043290611405565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461070d5760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d42726964676500000000000000000000000000000000606482015260840161063c565b61064f82826110cf565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107c05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161063c565b6104e48286868403610ad7565b5f336104c0818585610d12565b8342111561084f5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d697400000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866108a883611496565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6109126104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156109d3573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610a4e57508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610ac05760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e617475726500000000000000000000000000000000000000000000000000606482015260840161063c565b610acb8a8a8a610ad7565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610b5f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610be85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d0c5781811015610cff5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161063c565b610d0c8484848403610ad7565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610d9b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610e245760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610ebf5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610d0c565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610f5b610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff821661105b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161063c565b8060025f82825461106c9190611483565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166111585760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260208190526040902054818110156111f35760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610c49565b5f6020808352835180828501525f5b8181101561128057858101830151858201604001528201611264565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146112e1575f80fd5b919050565b5f80604083850312156112f7575f80fd5b611300836112be565b946020939093013593505050565b5f805f60608486031215611320575f80fd5b611329846112be565b9250611337602085016112be565b9150604084013590509250925092565b5f60208284031215611357575f80fd5b611360826112be565b9392505050565b5f805f805f805f60e0888a03121561137d575f80fd5b611386886112be565b9650611394602089016112be565b95506040880135945060608801359350608088013560ff811681146113b7575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f80604083850312156113e5575f80fd5b6113ee836112be565b91506113fc602084016112be565b90509250929050565b600181811c9082168061141957607f821691505b602082108103611450577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c6611456565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036114c6576114c6611456565b506001019056fea2646970667358221220176a1a9cf4a702d3853b858873fff4a6370c4e5d7d72d68593ec0ebe64fcc26964736f6c63430008140033a26469706673582212209002ffc0c7cb9056d22d47ac65cf05714a8ae8ce0af7e882f7e68b9fdede830e64736f6c63430008140033" - }, - { - "contractName": "PolygonZkEVMBridge proxy", - "balance": "340282366920938463463374607431768211455", - "nonce": "1", - "address": "0x40E0576c0A7dff9dc460B29ba73e79aBf73dD2a9", - "bytecode": "0x60806040526004361061005d575f3560e01c80635c60da1b116100425780635c60da1b146100a65780638f283970146100e3578063f851a440146101025761006c565b80633659cfe6146100745780634f1ef286146100935761006c565b3661006c5761006a610116565b005b61006a610116565b34801561007f575f80fd5b5061006a61008e366004610854565b610130565b61006a6100a136600461086d565b610178565b3480156100b1575f80fd5b506100ba6101eb565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee575f80fd5b5061006a6100fd366004610854565b610228565b34801561010d575f80fd5b506100ba610255565b61011e610282565b61012e610129610359565b610362565b565b610138610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d8160405180602001604052805f8152505f6103bf565b50565b61016d610116565b610180610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101e3576101de8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250600192506103bf915050565b505050565b6101de610116565b5f6101f4610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610359565b905090565b610225610116565b90565b610230610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d816103e9565b5f61025e610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610380565b61028a610380565b73ffffffffffffffffffffffffffffffffffffffff16330361012e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b5f61021861044a565b365f80375f80365f845af43d5f803e80801561037c573d5ff35b3d5ffd5b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b6103c883610471565b5f825111806103d45750805b156101de576103e383836104bd565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f610412610380565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a161016d816104e9565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103a3565b61047a816105f5565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606104e28383604051806060016040528060278152602001610977602791396106c0565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811661058c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610350565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b73ffffffffffffffffffffffffffffffffffffffff81163b610699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610350565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105af565b60605f808573ffffffffffffffffffffffffffffffffffffffff16856040516106e9919061090b565b5f60405180830381855af49150503d805f8114610721576040519150601f19603f3d011682016040523d82523d5f602084013e610726565b606091505b509150915061073786838387610741565b9695505050505050565b606083156107d65782515f036107cf5773ffffffffffffffffffffffffffffffffffffffff85163b6107cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610350565b50816107e0565b6107e083836107e8565b949350505050565b8151156107f85781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103509190610926565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f575f80fd5b919050565b5f60208284031215610864575f80fd5b6104e28261082c565b5f805f6040848603121561087f575f80fd5b6108888461082c565b9250602084013567ffffffffffffffff808211156108a4575f80fd5b818601915086601f8301126108b7575f80fd5b8135818111156108c5575f80fd5b8760208285010111156108d6575f80fd5b6020830194508093505050509250925092565b5f5b838110156109035781810151838201526020016108eb565b50505f910152565b5f825161091c8184602087016108e9565b9190910192915050565b602081525f82518060208401526109448160408501602087016108e9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212202ac98acbfbb3d3ac1b74050e18c4e76db25a3ff2801ec69bf85d0c61414d502b64736f6c63430008140033", - "storage": { - "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000fadb60b5059e31614e02083ff6c021a24c31c891", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000007cd6d5063c7782d34e2b1b03ed89ecf4a1412148" - } - }, - { - "contractName": "PolygonZkEVMGlobalExitRootL2 implementation", - "balance": "0", - "nonce": "1", - "address": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9", - "bytecode": "0x608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301fd90441461004e578063257b36321461006a57806333d6247d14610089578063a3c573eb1461009e575b5f80fd5b61005760015481565b6040519081526020015b60405180910390f35b61005761007836600461015e565b5f6020819052908152604090205481565b61009c61009736600461015e565b6100ea565b005b6100c57f00000000000000000000000040e0576c0a7dff9dc460b29ba73e79abf73dd2a981565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610061565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000040e0576c0a7dff9dc460b29ba73e79abf73dd2a91614610159576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b5f6020828403121561016e575f80fd5b503591905056fea26469706673582212205108c6c4f924146b736832a1bdf696e20d900450207b7452462368d150f2c71c64736f6c63430008140033" - }, - { - "contractName": "PolygonZkEVMGlobalExitRootL2 proxy", - "balance": "0", - "nonce": "1", - "address": "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa", - "bytecode": "0x60806040523661001357610011610017565b005b6100115b61001f6101b7565b6001600160a01b0316336001600160a01b0316141561016f5760606001600160e01b031960003516631b2ce7f360e11b8114156100655761005e6101ea565b9150610167565b6001600160e01b0319811663278f794360e11b14156100865761005e610241565b6001600160e01b031981166308f2839760e41b14156100a75761005e610287565b6001600160e01b031981166303e1469160e61b14156100c85761005e6102b8565b6001600160e01b03198116635c60da1b60e01b14156100e95761005e6102f8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b61017761030c565b565b606061019e83836040518060600160405280602781526020016108576027913961031c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101f4610394565b600061020336600481846106a2565b81019061021091906106e8565b905061022d8160405180602001604052806000815250600061039f565b505060408051602081019091526000815290565b606060008061025336600481846106a2565b8101906102609190610719565b915091506102708282600161039f565b604051806020016040528060008152509250505090565b6060610291610394565b60006102a036600481846106a2565b8101906102ad91906106e8565b905061022d816103cb565b60606102c2610394565b60006102cc6101b7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b6060610302610394565b60006102cc610422565b610177610317610422565b610431565b6060600080856001600160a01b0316856040516103399190610807565b600060405180830381855af49150503d8060008114610374576040519150601f19603f3d011682016040523d82523d6000602084013e610379565b606091505b509150915061038a86838387610455565b9695505050505050565b341561017757600080fd5b6103a8836104d3565b6000825111806103b55750805b156103c6576103c48383610179565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103f46101b7565b604080516001600160a01b03928316815291841660208301520160405180910390a161041f81610513565b50565b600061042c6105bc565b905090565b3660008037600080366000845af43d6000803e808015610450573d6000f35b3d6000fd5b606083156104c15782516104ba576001600160a01b0385163b6104ba5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161015e565b50816104cb565b6104cb83836105e4565b949350505050565b6104dc8161060e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105785760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161015e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101db565b8151156105f45781518083602001fd5b8060405162461bcd60e51b815260040161015e9190610823565b6001600160a01b0381163b61067b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161015e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61059b565b600080858511156106b257600080fd5b838611156106bf57600080fd5b5050820193919092039150565b80356001600160a01b03811681146106e357600080fd5b919050565b6000602082840312156106fa57600080fd5b61019e826106cc565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561072c57600080fd5b610735836106cc565b9150602083013567ffffffffffffffff8082111561075257600080fd5b818501915085601f83011261076657600080fd5b81358181111561077857610778610703565b604051601f8201601f19908116603f011681019083821181831017156107a0576107a0610703565b816040528281528860208487010111156107b957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107f65781810151838201526020016107de565b838111156103c45750506000910152565b600082516108198184602087016107db565b9190910192915050565b60208152600082518060208401526108428160408501602087016107db565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122012bb4f564f73959a03513dc74fc3c6e40e8386e6f02c16b78d6db00ce0aa16af64736f6c63430008090033", - "storage": { - "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000fadb60b5059e31614e02083ff6c021a24c31c891", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9" - } - }, - { - "contractName": "PolygonZkEVMTimelock", - "balance": "0", - "nonce": "1", - "address": "0x0165878A594ca255338adfa4d48449f69242Eb8F", - "bytecode": "0x6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220d904e0b10230579952f8427a107aa4349f9a1f5799108d399b11e28b578463e464736f6c63430008140033", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000e10", - "0xaedcc9e7897c0d335bdc5d92fe3a8b4f23727fe558cd1c19f332b28716a30559": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0xf5e61edb9c9cc6bfbae4463e9a2b1dd6ac3b44ddef38f18016e56ba0363910d9": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x64494413541ff93b31aa309254e3fed72a7456e9845988b915b4c7a7ceba8814": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", - "0x60b9d94c75b7b3f721925089391e4644cd890cb5e6466f9596dfbd2c54e0b280": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x3412d5605ac6cd444957cedb533e5dacad6378b4bc819ebe3652188a665066d6": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", - "0x4b63b79f1e338a49559dcd3193ac9eecc50d0f275d24e97cc8c319e5a31a8bd0": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0xdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d706a": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", - "0x800d5dfe4bba53eedee06cd4546a27da8de00f12db83f56062976d4493fda899": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0xc3ad33e20b0c56a223ad5104fff154aa010f8715b9c981fd38fdc60a4d1a52fc": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5" - } - }, - { - "accountName": "keyless Deployer", - "balance": "0", - "nonce": "1", - "address": "0x694AB5383a002a4796f95530c14Cf0C25ec3EA03" - }, - { - "accountName": "deployer", - "balance": "100000000000000000000000", - "nonce": "8", - "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" - } - ] -} \ No newline at end of file + "root": "0x40bdab77c40f497be8a427027b336f7a51a0692c3fb20ff36519bc5a79dc60fd", + "genesis": [ + { + "contractName": "PolygonZkEVMDeployer", + "balance": "0", + "nonce": "4", + "address": "0xFbD07134824dDEa24E4ae414c18ecbFa98169A24", + "bytecode": "0x60806040526004361061006e575f3560e01c8063715018a61161004c578063715018a6146100e25780638da5cb5b146100f6578063e11ae6cb1461011f578063f2fde38b14610132575f80fd5b80632b79805a146100725780634a94d487146100875780636d07dbf81461009a575b5f80fd5b610085610080366004610908565b610151565b005b6100856100953660046109a2565b6101c2565b3480156100a5575f80fd5b506100b96100b43660046109f5565b610203565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ed575f80fd5b50610085610215565b348015610101575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff166100b9565b61008561012d366004610a15565b610228565b34801561013d575f80fd5b5061008561014c366004610a61565b61028e565b61015961034a565b5f6101658585856103ca565b90506101718183610527565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a15050505050565b6101ca61034a565b6101d583838361056a565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b905f90a1505050565b5f61020e8383610598565b9392505050565b61021d61034a565b6102265f6105a4565b565b61023061034a565b5f61023c8484846103ca565b60405173ffffffffffffffffffffffffffffffffffffffff821681529091507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a150505050565b61029661034a565b73ffffffffffffffffffffffffffffffffffffffff811661033e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610347816105a4565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610335565b5f83471015610435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610335565b81515f0361049f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610335565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff811661020e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610335565b606061020e83835f6040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c65640000815250610618565b6060610590848484604051806060016040528060298152602001610b0860299139610618565b949350505050565b5f61020e83833061072d565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156106aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610335565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516106d29190610a9c565b5f6040518083038185875af1925050503d805f811461070c576040519150601f19603f3d011682016040523d82523d5f602084013e610711565b606091505b509150915061072287838387610756565b979650505050505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b606083156107eb5782515f036107e45773ffffffffffffffffffffffffffffffffffffffff85163b6107e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610335565b5081610590565b61059083838151156108005781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103359190610ab7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112610870575f80fd5b813567ffffffffffffffff8082111561088b5761088b610834565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156108d1576108d1610834565b816040528381528660208588010111156108e9575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f806080858703121561091b575f80fd5b8435935060208501359250604085013567ffffffffffffffff80821115610940575f80fd5b61094c88838901610861565b93506060870135915080821115610961575f80fd5b5061096e87828801610861565b91505092959194509250565b803573ffffffffffffffffffffffffffffffffffffffff8116811461099d575f80fd5b919050565b5f805f606084860312156109b4575f80fd5b6109bd8461097a565b9250602084013567ffffffffffffffff8111156109d8575f80fd5b6109e486828701610861565b925050604084013590509250925092565b5f8060408385031215610a06575f80fd5b50508035926020909101359150565b5f805f60608486031215610a27575f80fd5b8335925060208401359150604084013567ffffffffffffffff811115610a4b575f80fd5b610a5786828701610861565b9150509250925092565b5f60208284031215610a71575f80fd5b61020e8261097a565b5f5b83811015610a94578181015183820152602001610a7c565b50505f910152565b5f8251610aad818460208701610a7a565b9190910192915050565b602081525f8251806020840152610ad5816040850160208701610a7a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220330b94dc698c4d290bf55c23f13b473cde6a6bae0030cb902de18af54e35839f64736f6c63430008140033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" + } + }, + { + "contractName": "ProxyAdmin", + "balance": "0", + "nonce": "1", + "address": "0xfADB60b5059e31614e02083fF6C021a24C31c891", + "bytecode": "0x608060405260043610610079575f3560e01c80639623609d1161004c5780639623609d1461012357806399a88ec414610136578063f2fde38b14610155578063f3b7dead14610174575f80fd5b8063204e1c7a1461007d578063715018a6146100c55780637eff275e146100db5780638da5cb5b146100fa575b5f80fd5b348015610088575f80fd5b5061009c6100973660046105e8565b610193565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100d0575f80fd5b506100d9610244565b005b3480156100e6575f80fd5b506100d96100f536600461060a565b610257565b348015610105575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff1661009c565b6100d961013136600461066e565b6102e0565b348015610141575f80fd5b506100d961015036600461060a565b610371565b348015610160575f80fd5b506100d961016f3660046105e8565b6103cd565b34801561017f575f80fd5b5061009c61018e3660046105e8565b610489565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907f5c60da1b00000000000000000000000000000000000000000000000000000000815260040190565b5f60405180830381855afa9150503d805f8114610215576040519150601f19603f3d011682016040523d82523d5f602084013e61021a565b606091505b509150915081610228575f80fd5b8080602001905181019061023c919061075b565b949350505050565b61024c6104d3565b6102555f610553565b565b61025f6104d3565b6040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690638f283970906024015b5f604051808303815f87803b1580156102c6575f80fd5b505af11580156102d8573d5f803e3d5ffd5b505050505050565b6102e86104d3565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef28690349061033e9086908690600401610776565b5f604051808303818588803b158015610355575f80fd5b505af1158015610367573d5f803e3d5ffd5b5050505050505050565b6103796104d3565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690633659cfe6906024016102af565b6103d56104d3565b73ffffffffffffffffffffffffffffffffffffffff811661047d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61048681610553565b50565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907ff851a44000000000000000000000000000000000000000000000000000000000815260040190565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610474565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610486575f80fd5b5f602082840312156105f8575f80fd5b8135610603816105c7565b9392505050565b5f806040838503121561061b575f80fd5b8235610626816105c7565b91506020830135610636816105c7565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f805f60608486031215610680575f80fd5b833561068b816105c7565b9250602084013561069b816105c7565b9150604084013567ffffffffffffffff808211156106b7575f80fd5b818601915086601f8301126106ca575f80fd5b8135818111156106dc576106dc610641565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561072257610722610641565b8160405282815289602084870101111561073a575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f6020828403121561076b575f80fd5b8151610603816105c7565b73ffffffffffffffffffffffffffffffffffffffff831681525f602060408184015283518060408501525f5b818110156107be578581018301518582016060015282016107a2565b505f6060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050939250505056fea26469706673582212203083a4ccc2e42eed60bd19037f2efa77ed086dc7a5403f75bebb995dcba2221c64736f6c63430008140033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f" + } + }, + { + "contractName": "PolygonZkEVMBridge implementation", + "balance": "0", + "nonce": "1", + "address": "0x7Cd6d5063c7782d34E2b1b03ED89ecf4A1412148", + "bytecode": "0x608060405260043610620001d3575f3560e01c80638ed7e3f211620000fa578063cd5865791162000092578063dbc16976116200006a578063dbc169761462000685578063ee25560b146200069c578063f5efcd7914620006cb578063fb57083414620006ef575f80fd5b8063cd5865791462000620578063d02103ca1462000637578063d3476afe1462000661575f80fd5b8063bab161bf11620000d2578063bab161bf146200057a578063be5831c7146200059d578063cc46163214620005d8578063ccaa2d1114620005fc575f80fd5b80638ed7e3f21462000511578063aaa13cc21462000532578063b8b284d01462000556575f80fd5b80633cbc795b116200016e5780635ca1e16511620001465780635ca1e165146200048757806379e2cf97146200049e57806381b1c17414620004b557806383f2440314620004ed575f80fd5b80633cbc795b14620003285780633e19704314620003745780634b2f336d1462000466575f80fd5b8063240ff37811620001ae578063240ff378146200025d5780632dfdf0b51462000274578063318aee3d146200029a5780633c351e101462000307575f80fd5b806315064c9614620001d75780632072f6c5146200020757806322e95f2c1462000220575b5f80fd5b348015620001e3575f80fd5b50606854620001f29060ff1681565b60405190151581526020015b60405180910390f35b34801562000213575f80fd5b506200021e62000713565b005b3480156200022c575f80fd5b50620002446200023e36600462003723565b62000764565b6040516001600160a01b039091168152602001620001fe565b6200021e6200026e366004620037b3565b620007f9565b34801562000280575f80fd5b506200028b60535481565b604051908152602001620001fe565b348015620002a6575f80fd5b50620002e2620002b836600462003832565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201620001fe565b34801562000313575f80fd5b50606d5462000244906001600160a01b031681565b34801562000334575f80fd5b50606d546200035e9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001620001fe565b34801562000380575f80fd5b506200028b6200039236600462003866565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b34801562000472575f80fd5b50606e5462000244906001600160a01b031681565b34801562000493575f80fd5b506200028b62000862565b348015620004aa575f80fd5b506200021e62000947565b348015620004c1575f80fd5b5062000244620004d3366004620038eb565b606a6020525f90815260409020546001600160a01b031681565b348015620004f9575f80fd5b506200028b6200050b36600462003915565b62000981565b3480156200051d575f80fd5b50606c5462000244906001600160a01b031681565b3480156200053e575f80fd5b50620002446200055036600462003956565b62000a64565b34801562000562575f80fd5b506200021e6200057436600462003a03565b62000bf4565b34801562000586575f80fd5b506068546200035e90610100900463ffffffff1681565b348015620005a9575f80fd5b506068546200035e90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b348015620005e4575f80fd5b50620001f2620005f636600462003a8b565b62000cc9565b34801562000608575f80fd5b506200021e6200061a36600462003ac1565b62000d58565b6200021e6200063136600462003bb5565b6200144d565b34801562000643575f80fd5b5060685462000244906501000000000090046001600160a01b031681565b3480156200066d575f80fd5b506200021e6200067f36600462003c51565b62001a03565b34801562000691575f80fd5b506200021e62001dd7565b348015620006a8575f80fd5b506200028b620006ba366004620038eb565b60696020525f908152604090205481565b348015620006d7575f80fd5b506200021e620006e936600462003ac1565b62001e26565b348015620006fb575f80fd5b50620001f26200070d36600462003cc5565b620021aa565b606c546001600160a01b0316331462000758576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000762620021c5565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b3415801590620008135750606e546001600160a01b031615155b156200084b576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200085b85853486868662002258565b5050505050565b6053545f90819081805b60208110156200093e578083901c600116600103620008cf57603381602081106200089b576200089b62003d0f565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620008fc565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620009359062003d69565b9150506200086c565b50919392505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000762576200076262002340565b5f83815b602081101562000a5b57600163ffffffff8516821c81169003620009f757848160208110620009b857620009b862003d0f565b602002013582604051602001620009d9929190918252602082015260400190565b60405160208183030381529060405280519060200120915062000a46565b8185826020811062000a0d5762000a0d62003d0f565b602002013560405160200162000a2d929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062000a528162003d69565b91505062000985565b50949350505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b30836040518060200162000af890620036e9565b601f1982820381018352601f90910116604081905262000b25908d908d908d908d908d9060200162003dcc565b60408051601f198184030181529082905262000b45929160200162003e30565b6040516020818303038152906040528051906020012060405160200162000bce94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b606e546001600160a01b031662000c37576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606e546040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018690526001600160a01b0390911690639dc29fac906044015f604051808303815f87803b15801562000c9a575f80fd5b505af115801562000cad573d5f803e3d5ffd5b5050505062000cc186868686868662002258565b505050505050565b6068545f908190610100900463ffffffff1615801562000cef575063ffffffff83166001145b1562000d03575063ffffffff831662000d2f565b62000d1a64010000000063ffffffff851662003e62565b62000d2c9063ffffffff861662003e7c565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000d96576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161462000de0576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000ee78c8c8c8c8c62000ee15f8e8e8e8e8e8e8e60405162000e0592919062003e92565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62002409565b6001600160a01b0386166200105657606e546001600160a01b031662000fd4575f6001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000f40576020820181803683370190505b5060405162000f50919062003ece565b5f6040518083038185875af1925050503d805f811462000f8c576040519150601f19603f3d011682016040523d82523d5f602084013e62000f91565b606091505b505090508062000fcd576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50620013e3565b606e546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015260248201869052909116906340c10f19906044015f604051808303815f87803b15801562001039575f80fd5b505af11580156200104c573d5f803e3d5ffd5b50505050620013e3565b606d546001600160a01b038781169116148015620010965750606d5463ffffffff8881167401000000000000000000000000000000000000000090920416145b15620010af575f6001600160a01b038516848262000f15565b60685463ffffffff610100909104811690881603620010e457620010de6001600160a01b0387168585620025e1565b620013e3565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b03168062001367575f80806200118b8688018862003fa1565b9250925092505f85848484604051620011a490620036e9565b620011b2939291906200404a565b8190604051809103905ff5905080158015620011d0573d5f803e3d5ffd5b506040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562001236575f80fd5b505af115801562001249573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b6040516200135595949392919062004086565b60405180910390a150505050620013e0565b6040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b158015620013c8575f80fd5b505af1158015620013db573d5f803e3d5ffd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156200148b576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200149562002691565b60685463ffffffff610100909104811690881603620014e0576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f806060876001600160a01b03881662001563578834146200152e576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d546001600160a01b038116945074010000000000000000000000000000000000000000900463ffffffff169250620018a2565b34156200159c576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606e546001600160a01b03908116908916036200162f576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018a90526001600160a01b03891690639dc29fac906044015f604051808303815f87803b15801562001612575f80fd5b505af115801562001625573d5f803e3d5ffd5b50505050620018a2565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620016fe576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b90526001600160a01b038a1690639dc29fac906044015f604051808303815f87803b158015620016d4575f80fd5b505af1158015620016e7573d5f803e3d5ffd5b5050505080602001519450805f01519350620018a0565b8515620017135762001713898b898962002706565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa15801562001771573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620017979190620040c0565b9050620017b06001600160a01b038b1633308e62002bb1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa1580156200180e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620018349190620040c0565b9050620018428282620040d8565b6068548c9850610100900463ffffffff1696509350620018628762002c04565b6200186d8c62002d0b565b620018788d62002e07565b6040516020016200188c939291906200404a565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620018e3989796959493929190620040ee565b60405180910390a1620019db620019d55f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62002ef2565b8615620019ec57620019ec62002340565b50505050620019fa60018055565b50505050505050565b5f54610100900460ff161580801562001a2257505f54600160ff909116105b8062001a3d5750303b15801562001a3d57505f5460ff166001145b62001acf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801562001b2c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8916027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016848316179055606d541662001c3157606d5474010000000000000000000000000000000000000000900463ffffffff161562001c2b576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001d63565b606d805463ffffffff861674010000000000000000000000000000000000000000027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b038816171790556040515f9060129062001c9890620036e9565b6060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff909116604082015260e0018190604051809103905ff590508015801562001d29573d5f803e3d5ffd5b50606e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790555b62001d6d62003007565b801562000cc1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b606c546001600160a01b0316331462001e1c576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000762620030a9565b60685460ff161562001e64576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161462001eae576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001ed48c8c8c8c8c62000ee160018e8e8e8e8e8e8e60405162000e0592919062003e92565b606e545f906001600160a01b031662001fbd57846001600160a01b031684888a868660405160240162001f0b949392919062004159565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f2000000000000000000000000000000000000000000000000000000001790525162001f70919062003ece565b5f6040518083038185875af1925050503d805f811462001fac576040519150601f19603f3d011682016040523d82523d5f602084013e62001fb1565b606091505b50508091505062002107565b606e546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260248201879052909116906340c10f19906044015f604051808303815f87803b15801562002022575f80fd5b505af115801562002035573d5f803e3d5ffd5b50505050846001600160a01b0316878985856040516024016200205c949392919062004159565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f20000000000000000000000000000000000000000000000000000000017905251620020c1919062003ece565b5f604051808303815f865af19150503d805f8114620020fc576040519150601f19603f3d011682016040523d82523d5f602084013e62002101565b606091505b50909150505b806200213f576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f81620021b986868662000981565b1490505b949350505050565b60685460ff161562002203576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff610100909104811690871603620022a3576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051620022f99998979695949392919062004193565b60405180910390a162002334620019d56001606860019054906101000a900463ffffffff16338a8a8a898960405162000e0592919062003e92565b821562000cc15762000cc15b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d620023b962000862565b6040518263ffffffff1660e01b8152600401620023d891815260200190565b5f604051808303815f87803b158015620023f0575f80fd5b505af115801562002403573d5f803e3d5ffd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af11580156200249b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620024c19190620040c0565b9050805f03620024fc576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80680100000000000000008716600103620025605786915062002523848a8489620021aa565b6200255a576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620025ca565b602087901c6200257281600162004200565b91508792506200259162002588868c8662000981565b8a8389620021aa565b620025c8576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b620025d6828262003138565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526200268c9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262003200565b505050565b600260015403620026ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001ac6565b6002600155565b5f62002716600482848662004227565b620027219162004250565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002967575f80808080808062002783896004818d62004227565b81019062002792919062004299565b9650965096509650965096509650336001600160a01b0316876001600160a01b031614620027ec576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03861630146200282f576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002869576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002917919062003ece565b5f604051808303815f865af19150503d805f811462002952576040519150601f19603f3d011682016040523d82523d5f602084013e62002957565b606091505b505050505050505050506200085b565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c0000000000000000000000000000000000000000000000000000000014620029e3576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80808080808080620029fa8a6004818e62004227565b81019062002a099190620042ef565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462002a65576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038716301462002aa8576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002b5f919062003ece565b5f604051808303815f865af19150503d805f811462002b9a576040519150601f19603f3d011682016040523d82523d5f602084013e62002b9f565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052620024039085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002627565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b0386169162002c7a919062003ece565b5f60405180830381855afa9150503d805f811462002cb4576040519150601f19603f3d011682016040523d82523d5f602084013e62002cb9565b606091505b50915091508162002d00576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250620021bd565b620021bd8162003305565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b0386169162002d81919062003ece565b5f60405180830381855afa9150503d805f811462002dbb576040519150601f19603f3d011682016040523d82523d5f602084013e62002dc0565b606091505b50915091508162002d00576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250620021bd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b0386169162002e7c919062003ece565b5f60405180830381855afa9150503d805f811462002eb6576040519150601f19603f3d011682016040523d82523d5f602084013e62002ebb565b606091505b509150915081801562002ecf575080516020145b62002edc576012620021bd565b80806020019051810190620021bd919062004376565b80600162002f0360206002620044cb565b62002f0f9190620040d8565b6053541062002f4a576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462002f5b9062003d69565b918290555090505f5b602081101562002ff6578082901c60011660010362002f9c57826033826020811062002f945762002f9462003d0f565b015550505050565b6033816020811062002fb25762002fb262003d0f565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062002fed9062003d69565b91505062002f64565b506200268c620044d8565b60018055565b5f54610100900460ff166200309f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001ac6565b62000762620034f0565b60685460ff16620030e6576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b6068545f90610100900463ffffffff161580156200315c575063ffffffff82166001145b1562003170575063ffffffff82166200319c565b6200318764010000000063ffffffff841662003e62565b620031999063ffffffff851662003e7c565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620019fa576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62003256826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620035889092919063ffffffff16565b8051909150156200268c578080602001905181019062003277919062004505565b6200268c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001ac6565b60606040825110620033275781806020019051810190620007f3919062004523565b8151602003620034b2575f5b6020811080156200337e575082818151811062003354576200335462003d0f565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620033995780620033908162003d69565b91505062003333565b805f03620033dc57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115620033f957620033f962003ea1565b6040519080825280601f01601f19166020018201604052801562003424576020820181803683370190505b5090505f5b82811015620034aa5784818151811062003447576200344762003d0f565b602001015160f81c60f81b82828151811062003467576200346762003d0f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620034a18162003d69565b91505062003429565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b5f54610100900460ff1662003001576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001ac6565b6060620021bd84845f85855f80866001600160a01b03168587604051620035b0919062003ece565b5f6040518083038185875af1925050503d805f8114620035ec576040519150601f19603f3d011682016040523d82523d5f602084013e620035f1565b606091505b509150915062003604878383876200360f565b979650505050505050565b606083156200369c5782515f0362003694576001600160a01b0385163b62003694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001ac6565b5081620021bd565b620021bd8383815115620036b35781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001ac691906200459e565b6119a180620045b383390190565b803563ffffffff81168114620034eb575f80fd5b6001600160a01b038116811462003720575f80fd5b50565b5f806040838503121562003735575f80fd5b6200374083620036f7565b9150602083013562003752816200370b565b809150509250929050565b801515811462003720575f80fd5b5f8083601f8401126200377c575f80fd5b50813567ffffffffffffffff81111562003794575f80fd5b602083019150836020828501011115620037ac575f80fd5b9250929050565b5f805f805f60808688031215620037c8575f80fd5b620037d386620036f7565b94506020860135620037e5816200370b565b93506040860135620037f7816200375d565b9250606086013567ffffffffffffffff81111562003813575f80fd5b62003821888289016200376b565b969995985093965092949392505050565b5f6020828403121562003843575f80fd5b813562003850816200370b565b9392505050565b60ff8116811462003720575f80fd5b5f805f805f805f60e0888a0312156200387d575f80fd5b87356200388a8162003857565b96506200389a60208901620036f7565b95506040880135620038ac816200370b565b9450620038bc60608901620036f7565b93506080880135620038ce816200370b565b9699959850939692959460a0840135945060c09093013592915050565b5f60208284031215620038fc575f80fd5b5035919050565b806104008101831015620007f3575f80fd5b5f805f610440848603121562003929575f80fd5b833592506200393c856020860162003903565b91506200394d6104208501620036f7565b90509250925092565b5f805f805f805f60a0888a0312156200396d575f80fd5b6200397888620036f7565b965060208801356200398a816200370b565b9550604088013567ffffffffffffffff80821115620039a7575f80fd5b620039b58b838c016200376b565b909750955060608a0135915080821115620039ce575f80fd5b50620039dd8a828b016200376b565b9094509250506080880135620039f38162003857565b8091505092959891949750929550565b5f805f805f8060a0878903121562003a19575f80fd5b62003a2487620036f7565b9550602087013562003a36816200370b565b945060408701359350606087013562003a4f816200375d565b9250608087013567ffffffffffffffff81111562003a6b575f80fd5b62003a7989828a016200376b565b979a9699509497509295939492505050565b5f806040838503121562003a9d575f80fd5b62003aa883620036f7565b915062003ab860208401620036f7565b90509250929050565b5f805f805f805f805f805f806109208d8f03121562003ade575f80fd5b62003aea8e8e62003903565b9b5062003afc8e6104008f0162003903565b9a506108008d013599506108208d013598506108408d0135975062003b256108608e01620036f7565b965062003b376108808e01356200370b565b6108808d0135955062003b4e6108a08e01620036f7565b945062003b606108c08e01356200370b565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111562003b8a575f80fd5b62003b9d8e6109008f01358f016200376b565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121562003bcc575f80fd5b62003bd788620036f7565b9650602088013562003be9816200370b565b955060408801359450606088013562003c02816200370b565b9350608088013562003c14816200375d565b925060a088013567ffffffffffffffff81111562003c30575f80fd5b62003c3e8a828b016200376b565b989b979a50959850939692959293505050565b5f805f805f60a0868803121562003c66575f80fd5b62003c7186620036f7565b9450602086013562003c83816200370b565b935062003c9360408701620036f7565b9250606086013562003ca5816200370b565b9150608086013562003cb7816200370b565b809150509295509295909350565b5f805f80610460858703121562003cda575f80fd5b8435935062003ced866020870162003903565b925062003cfe6104208601620036f7565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003d9c5762003d9c62003d3c565b5060010190565b81835281816020850137505f602082840101525f6020601f19601f840116840101905092915050565b606081525f62003de160608301878962003da3565b828103602084015262003df681868862003da3565b91505060ff831660408301529695505050505050565b5f5b8381101562003e2857818101518382015260200162003e0e565b50505f910152565b5f835162003e4381846020880162003e0c565b83519083019062003e5981836020880162003e0c565b01949350505050565b8082028115828204841417620007f357620007f362003d3c565b80820180821115620007f357620007f362003d3c565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f825162003ee181846020870162003e0c565b9190910192915050565b604051601f8201601f1916810167ffffffffffffffff8111828210171562003f175762003f1762003ea1565b604052919050565b5f67ffffffffffffffff82111562003f3b5762003f3b62003ea1565b50601f01601f191660200190565b5f82601f83011262003f59575f80fd5b813562003f7062003f6a8262003f1f565b62003eeb565b81815284602083860101111562003f85575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003fb4575f80fd5b833567ffffffffffffffff8082111562003fcc575f80fd5b62003fda8783880162003f49565b9450602086013591508082111562003ff0575f80fd5b5062003fff8682870162003f49565b9250506040840135620040128162003857565b809150509250925092565b5f81518084526200403681602086016020860162003e0c565b601f01601f19169290920160200192915050565b606081525f6200405e60608301866200401d565b82810360208401526200407281866200401d565b91505060ff83166040830152949350505050565b63ffffffff861681525f6001600160a01b038087166020840152808616604084015250608060608301526200360460808301848662003da3565b5f60208284031215620040d1575f80fd5b5051919050565b81810381811115620007f357620007f362003d3c565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c085015262004140828501876200401d565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f6200418960608301848662003da3565b9695505050505050565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620041e6828501878962003da3565b925080851660e085015250509a9950505050505050505050565b63ffffffff81811683821601908082111562004220576200422062003d3c565b5092915050565b5f808585111562004236575f80fd5b8386111562004243575f80fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620042915780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215620042b0575f80fd5b8735620042bd816200370b565b96506020880135620042cf816200370b565b955060408801359450606088013593506080880135620038ce8162003857565b5f805f805f805f80610100898b03121562004308575f80fd5b883562004315816200370b565b9750602089013562004327816200370b565b96506040890135955060608901359450608089013562004347816200375d565b935060a0890135620043598162003857565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004387575f80fd5b8151620038508162003857565b600181815b80851115620043f357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620043d757620043d762003d3c565b80851615620043e557918102915b93841c939080029062004399565b509250929050565b5f826200440b57506001620007f3565b816200441957505f620007f3565b81600181146200443257600281146200443d576200445d565b6001915050620007f3565b60ff84111562004451576200445162003d3c565b50506001821b620007f3565b5060208310610133831016604e8410600b841016171562004482575081810a620007f3565b6200448e838362004394565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620044c357620044c362003d3c565b029392505050565b5f620038508383620043fb565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6020828403121562004516575f80fd5b815162003850816200375d565b5f6020828403121562004534575f80fd5b815167ffffffffffffffff8111156200454b575f80fd5b8201601f810184136200455c575f80fd5b80516200456d62003f6a8262003f1f565b81815285602083850101111562004582575f80fd5b6200459582602083016020860162003e0c565b95945050505050565b602081525f6200385060208301846200401d56fe61010060405234801562000011575f80fd5b50604051620019a1380380620019a1833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516115036200049e5f395f61022d01525f81816102fb015281816105ad015261067a01525f61052801525f818161036d01526104f201526115035ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b6040516101879190611255565b60405180910390f35b6101a361019e3660046112e6565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461130e565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d3660046112e6565b61054a565b6102856102803660046112e6565b610595565b005b6101b7610295366004611347565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca366004611347565b60056020525f908152604090205481565b61017a610653565b6102856102f13660046112e6565b610662565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a36103503660046112e6565b610717565b6101a36103633660046112e6565b6107cd565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d366004611367565b6107da565b6101b76103b03660046113d4565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611405565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611405565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610ad7565b60019150505b92915050565b5f336104d9858285610c56565b6104e4858585610d12565b506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146105255761052046610f31565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c09082908690610590908790611483565b610ad7565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106455760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61064f8282610ff8565b5050565b60606004805461043290611405565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461070d5760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d42726964676500000000000000000000000000000000606482015260840161063c565b61064f82826110cf565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107c05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161063c565b6104e48286868403610ad7565b5f336104c0818585610d12565b8342111561084f5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d697400000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866108a883611496565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6109126104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156109d3573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610a4e57508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610ac05760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e617475726500000000000000000000000000000000000000000000000000606482015260840161063c565b610acb8a8a8a610ad7565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610b5f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610be85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d0c5781811015610cff5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161063c565b610d0c8484848403610ad7565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610d9b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610e245760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610ebf5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610d0c565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610f5b610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff821661105b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161063c565b8060025f82825461106c9190611483565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166111585760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260208190526040902054818110156111f35760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610c49565b5f6020808352835180828501525f5b8181101561128057858101830151858201604001528201611264565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146112e1575f80fd5b919050565b5f80604083850312156112f7575f80fd5b611300836112be565b946020939093013593505050565b5f805f60608486031215611320575f80fd5b611329846112be565b9250611337602085016112be565b9150604084013590509250925092565b5f60208284031215611357575f80fd5b611360826112be565b9392505050565b5f805f805f805f60e0888a03121561137d575f80fd5b611386886112be565b9650611394602089016112be565b95506040880135945060608801359350608088013560ff811681146113b7575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f80604083850312156113e5575f80fd5b6113ee836112be565b91506113fc602084016112be565b90509250929050565b600181811c9082168061141957607f821691505b602082108103611450577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c6611456565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036114c6576114c6611456565b506001019056fea2646970667358221220176a1a9cf4a702d3853b858873fff4a6370c4e5d7d72d68593ec0ebe64fcc26964736f6c63430008140033a26469706673582212209002ffc0c7cb9056d22d47ac65cf05714a8ae8ce0af7e882f7e68b9fdede830e64736f6c63430008140033" + }, + { + "contractName": "PolygonZkEVMBridge proxy", + "balance": "340282366920938463463374607431768211455", + "nonce": "1", + "address": "0x40E0576c0A7dff9dc460B29ba73e79aBf73dD2a9", + "bytecode": "0x60806040526004361061005d575f3560e01c80635c60da1b116100425780635c60da1b146100a65780638f283970146100e3578063f851a440146101025761006c565b80633659cfe6146100745780634f1ef286146100935761006c565b3661006c5761006a610116565b005b61006a610116565b34801561007f575f80fd5b5061006a61008e366004610854565b610130565b61006a6100a136600461086d565b610178565b3480156100b1575f80fd5b506100ba6101eb565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee575f80fd5b5061006a6100fd366004610854565b610228565b34801561010d575f80fd5b506100ba610255565b61011e610282565b61012e610129610359565b610362565b565b610138610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d8160405180602001604052805f8152505f6103bf565b50565b61016d610116565b610180610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101e3576101de8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250600192506103bf915050565b505050565b6101de610116565b5f6101f4610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610359565b905090565b610225610116565b90565b610230610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d816103e9565b5f61025e610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610380565b61028a610380565b73ffffffffffffffffffffffffffffffffffffffff16330361012e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b5f61021861044a565b365f80375f80365f845af43d5f803e80801561037c573d5ff35b3d5ffd5b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b6103c883610471565b5f825111806103d45750805b156101de576103e383836104bd565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f610412610380565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a161016d816104e9565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103a3565b61047a816105f5565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606104e28383604051806060016040528060278152602001610977602791396106c0565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811661058c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610350565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b73ffffffffffffffffffffffffffffffffffffffff81163b610699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610350565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105af565b60605f808573ffffffffffffffffffffffffffffffffffffffff16856040516106e9919061090b565b5f60405180830381855af49150503d805f8114610721576040519150601f19603f3d011682016040523d82523d5f602084013e610726565b606091505b509150915061073786838387610741565b9695505050505050565b606083156107d65782515f036107cf5773ffffffffffffffffffffffffffffffffffffffff85163b6107cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610350565b50816107e0565b6107e083836107e8565b949350505050565b8151156107f85781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103509190610926565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f575f80fd5b919050565b5f60208284031215610864575f80fd5b6104e28261082c565b5f805f6040848603121561087f575f80fd5b6108888461082c565b9250602084013567ffffffffffffffff808211156108a4575f80fd5b818601915086601f8301126108b7575f80fd5b8135818111156108c5575f80fd5b8760208285010111156108d6575f80fd5b6020830194508093505050509250925092565b5f5b838110156109035781810151838201526020016108eb565b50505f910152565b5f825161091c8184602087016108e9565b9190910192915050565b602081525f82518060208401526109448160408501602087016108e9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212202ac98acbfbb3d3ac1b74050e18c4e76db25a3ff2801ec69bf85d0c61414d502b64736f6c63430008140033", + "storage": { + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000fadb60b5059e31614e02083ff6c021a24c31c891", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000007cd6d5063c7782d34e2b1b03ed89ecf4a1412148" + } + }, + { + "contractName": "PolygonZkEVMGlobalExitRootL2 implementation", + "balance": "0", + "nonce": "1", + "address": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9", + "bytecode": "0x608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301fd90441461004e578063257b36321461006a57806333d6247d14610089578063a3c573eb1461009e575b5f80fd5b61005760015481565b6040519081526020015b60405180910390f35b61005761007836600461015e565b5f6020819052908152604090205481565b61009c61009736600461015e565b6100ea565b005b6100c57f00000000000000000000000040e0576c0a7dff9dc460b29ba73e79abf73dd2a981565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610061565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000040e0576c0a7dff9dc460b29ba73e79abf73dd2a91614610159576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b5f6020828403121561016e575f80fd5b503591905056fea26469706673582212205108c6c4f924146b736832a1bdf696e20d900450207b7452462368d150f2c71c64736f6c63430008140033" + }, + { + "contractName": "PolygonZkEVMGlobalExitRootL2 proxy", + "balance": "0", + "nonce": "1", + "address": "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa", + "bytecode": "0x60806040523661001357610011610017565b005b6100115b61001f6101b7565b6001600160a01b0316336001600160a01b0316141561016f5760606001600160e01b031960003516631b2ce7f360e11b8114156100655761005e6101ea565b9150610167565b6001600160e01b0319811663278f794360e11b14156100865761005e610241565b6001600160e01b031981166308f2839760e41b14156100a75761005e610287565b6001600160e01b031981166303e1469160e61b14156100c85761005e6102b8565b6001600160e01b03198116635c60da1b60e01b14156100e95761005e6102f8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b61017761030c565b565b606061019e83836040518060600160405280602781526020016108576027913961031c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101f4610394565b600061020336600481846106a2565b81019061021091906106e8565b905061022d8160405180602001604052806000815250600061039f565b505060408051602081019091526000815290565b606060008061025336600481846106a2565b8101906102609190610719565b915091506102708282600161039f565b604051806020016040528060008152509250505090565b6060610291610394565b60006102a036600481846106a2565b8101906102ad91906106e8565b905061022d816103cb565b60606102c2610394565b60006102cc6101b7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b6060610302610394565b60006102cc610422565b610177610317610422565b610431565b6060600080856001600160a01b0316856040516103399190610807565b600060405180830381855af49150503d8060008114610374576040519150601f19603f3d011682016040523d82523d6000602084013e610379565b606091505b509150915061038a86838387610455565b9695505050505050565b341561017757600080fd5b6103a8836104d3565b6000825111806103b55750805b156103c6576103c48383610179565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103f46101b7565b604080516001600160a01b03928316815291841660208301520160405180910390a161041f81610513565b50565b600061042c6105bc565b905090565b3660008037600080366000845af43d6000803e808015610450573d6000f35b3d6000fd5b606083156104c15782516104ba576001600160a01b0385163b6104ba5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161015e565b50816104cb565b6104cb83836105e4565b949350505050565b6104dc8161060e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105785760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161015e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101db565b8151156105f45781518083602001fd5b8060405162461bcd60e51b815260040161015e9190610823565b6001600160a01b0381163b61067b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161015e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61059b565b600080858511156106b257600080fd5b838611156106bf57600080fd5b5050820193919092039150565b80356001600160a01b03811681146106e357600080fd5b919050565b6000602082840312156106fa57600080fd5b61019e826106cc565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561072c57600080fd5b610735836106cc565b9150602083013567ffffffffffffffff8082111561075257600080fd5b818501915085601f83011261076657600080fd5b81358181111561077857610778610703565b604051601f8201601f19908116603f011681019083821181831017156107a0576107a0610703565b816040528281528860208487010111156107b957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107f65781810151838201526020016107de565b838111156103c45750506000910152565b600082516108198184602087016107db565b9190910192915050565b60208152600082518060208401526108428160408501602087016107db565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122012bb4f564f73959a03513dc74fc3c6e40e8386e6f02c16b78d6db00ce0aa16af64736f6c63430008090033", + "storage": { + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000fadb60b5059e31614e02083ff6c021a24c31c891", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9" + } + }, + { + "contractName": "PolygonZkEVMTimelock", + "balance": "0", + "nonce": "1", + "address": "0x0165878A594ca255338adfa4d48449f69242Eb8F", + "bytecode": "0x6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220d904e0b10230579952f8427a107aa4349f9a1f5799108d399b11e28b578463e464736f6c63430008140033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000e10", + "0xaedcc9e7897c0d335bdc5d92fe3a8b4f23727fe558cd1c19f332b28716a30559": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xf5e61edb9c9cc6bfbae4463e9a2b1dd6ac3b44ddef38f18016e56ba0363910d9": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x64494413541ff93b31aa309254e3fed72a7456e9845988b915b4c7a7ceba8814": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x60b9d94c75b7b3f721925089391e4644cd890cb5e6466f9596dfbd2c54e0b280": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x3412d5605ac6cd444957cedb533e5dacad6378b4bc819ebe3652188a665066d6": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x4b63b79f1e338a49559dcd3193ac9eecc50d0f275d24e97cc8c319e5a31a8bd0": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d706a": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x800d5dfe4bba53eedee06cd4546a27da8de00f12db83f56062976d4493fda899": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xc3ad33e20b0c56a223ad5104fff154aa010f8715b9c981fd38fdc60a4d1a52fc": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5" + } + }, + { + "accountName": "keyless Deployer", + "balance": "0", + "nonce": "1", + "address": "0x694AB5383a002a4796f95530c14Cf0C25ec3EA03" + }, + { + "accountName": "deployer", + "balance": "100000000000000000000000", + "nonce": "8", + "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + } + ], + "firstBatchData": { + "transactions": "0xf8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4d3476afe000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a40d5f56745a118d0906a34e69aec8c0db1cb8fa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ca1ab1e0000000000000000000000000000000000000000000000000000000005ca1ab1e1bff", + "globalExitRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1697640780, + "sequencer": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + } + } \ No newline at end of file From 092adecc37c532d786b2c02eb22611059807fe75 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Thu, 19 Oct 2023 12:02:24 +0200 Subject: [PATCH 080/230] update scripts --- contracts/v2/lib/PolygonRollupBase.sol | 4 ++-- docker/scripts/v2/deploy-docker.sh | 1 + docker/scripts/v2/deploy-dockerv2.sh | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/contracts/v2/lib/PolygonRollupBase.sol b/contracts/v2/lib/PolygonRollupBase.sol index c2defe610..e2a9d6ea4 100644 --- a/contracts/v2/lib/PolygonRollupBase.sol +++ b/contracts/v2/lib/PolygonRollupBase.sol @@ -34,8 +34,8 @@ contract PolygonRollupBase is /** * @notice Struct which will be used to call sequenceBatches * @param transactions L2 ethereum transactions EIP-155 or pre-EIP-155 with signature: - * EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data, chainid, 0, 0,) || v || r || s - * pre-EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data) || v || r || s + * EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data, chainid, 0, 0,) || v || r || s || effectiveGasPrice + * pre-EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data) || v || r || s || effectiveGasPrice * @param globalExitRoot Global exit root of the batch * @param timestamp Sequenced timestamp of the batch * @param minForcedTimestamp Minimum timestamp of the force batch data, empty when non forced batch diff --git a/docker/scripts/v2/deploy-docker.sh b/docker/scripts/v2/deploy-docker.sh index fe478c0c1..63a8586f3 100755 --- a/docker/scripts/v2/deploy-docker.sh +++ b/docker/scripts/v2/deploy-docker.sh @@ -7,6 +7,7 @@ cp docker/scripts/v2/deploy_parameters_docker.json deployment/v2/deploy_paramete npm run deploy:testnet:v2:localhost mkdir docker/deploymentOutput mv deployment/v2/deploy_output.json docker/deploymentOutput +mv deployment/v2/genesis.json docker/deploymentOutput DEV_PERIOD=1 docker-compose -f docker/docker-compose.geth.yml down sudo docker build -t hermeznetwork/geth-zkevm-contracts -f docker/Dockerfile.geth . # Let it readable for the multiplatform build coming later! diff --git a/docker/scripts/v2/deploy-dockerv2.sh b/docker/scripts/v2/deploy-dockerv2.sh index df3c37951..07ee5b052 100755 --- a/docker/scripts/v2/deploy-dockerv2.sh +++ b/docker/scripts/v2/deploy-dockerv2.sh @@ -7,6 +7,7 @@ cp docker/scripts/v2/deploy_parameters_docker.json deployment/v2/deploy_paramete npm run deploy:testnet:v2:localhost mkdir docker/deploymentOutput mv deployment/v2/deploy_output.json docker/deploymentOutput +mv deployment/v2/genesis.json docker/deploymentOutput DEV_PERIOD=1 docker compose -f docker/docker-compose.geth.yml down sudo docker build -t hermeznetwork/geth-zkevm-contracts -f docker/Dockerfile.geth . # Let it readable for the multiplatform build coming later! From 9b6eda43c1ed4c7098c1e9c050f887cff487db9d Mon Sep 17 00:00:00 2001 From: invocamanman Date: Fri, 20 Oct 2023 11:03:33 +0200 Subject: [PATCH 081/230] fix --- deployment/v2/4_createRollup.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/v2/4_createRollup.ts b/deployment/v2/4_createRollup.ts index 50f90c9e6..3897c4c01 100644 --- a/deployment/v2/4_createRollup.ts +++ b/deployment/v2/4_createRollup.ts @@ -129,7 +129,6 @@ async function main() { await PolygonZKEVMV2Contract.waitForDeployment(); // Add a new rollup type with timelock - const newRollupTypeID = 1; const rollupCompatibilityID = 0; await rollupManagerContract.addNewRollupType( PolygonZKEVMV2Contract.target, @@ -142,6 +141,7 @@ async function main() { console.log("#######################\n"); console.log("Added new Rollup Type deployed"); + const newRollupTypeID = await rollupManagerContract.rollupTypeCount(); let gasTokenAddress, gasTokenNetwork; From 34752b0f144b3b98845a12242b0f600504000988 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 23 Oct 2023 04:23:29 +0200 Subject: [PATCH 082/230] start clean interfaces --- .../v2/interfaces/IPolygonRollupManager.sol | 85 ------------------- 1 file changed, 85 deletions(-) diff --git a/contracts/v2/interfaces/IPolygonRollupManager.sol b/contracts/v2/interfaces/IPolygonRollupManager.sol index 8571ac77e..fa665c085 100644 --- a/contracts/v2/interfaces/IPolygonRollupManager.sol +++ b/contracts/v2/interfaces/IPolygonRollupManager.sol @@ -3,41 +3,6 @@ pragma solidity 0.8.20; interface IPolygonRollupManager { - /** - * @dev Thrown when the pending state timeout exceeds the _HALT_AGGREGATION_TIMEOUT - */ - error PendingStateTimeoutExceedHaltAggregationTimeout(); - - /** - * @dev Thrown when the trusted aggregator timeout exceeds the _HALT_AGGREGATION_TIMEOUT - */ - error TrustedAggregatorTimeoutExceedHaltAggregationTimeout(); - - /** - * @dev Thrown when sender is not the PolygonZkEVM address - */ - error OnlyTrustedAggregator(); - - /** - * @dev Thrown when sender is not the PolygonZkEVM address - */ - error ConsensusAlreadyExist(); - - /** - * @dev Thrown when sender is not the PolygonZkEVM address - */ - error VerifierAlreadyExist(); - - /** - * @dev Thrown when sender is not the PolygonZkEVM address - */ - error ConsensusDoesNotExist(); - - /** - * @dev Thrown when sender is not the PolygonZkEVM address - */ - error VerifierDoesNotExist(); - /** * @dev Thrown when sender is not the PolygonZkEVM address */ @@ -48,21 +13,11 @@ interface IPolygonRollupManager { */ error RollupMustExist(); - /** - * @dev Thrown when sender is not the PolygonZkEVM address - */ - error VerifierMustBeDifferent(); - /** * @dev Thrown when sender is not the PolygonZkEVM address */ error SenderMustBeRollup(); - /** - * @dev Thrown when sender is not the PolygonZkEVM address - */ - error NewSequencedBatchMustBeBigger(); - /** * @dev Thrown when sender is not the PolygonZkEVM address */ @@ -123,21 +78,6 @@ interface IPolygonRollupManager { */ error NewStateRootNotInsidePrime(); - /** - * @dev Thrown when force batch is not allowed - */ - error ForceBatchNotAllowed(); - - /** - * @dev Thrown when try to activate force batches when they are already active - */ - error ForceBatchesAlreadyActive(); - - /** - * @dev Thrown when try to activate force batches when they are already active - */ - error NotSupportedCurrently(); - /** * @dev Thrown when the final pending state num is not in a valid range */ @@ -153,16 +93,6 @@ interface IPolygonRollupManager { */ error StoredRootMustBeDifferentThanNewRoot(); - /** - * @dev Thrown when the batch is already verified when attempting to activate the emergency state - */ - error BatchAlreadyVerified(); - - /** - * @dev Thrown when the batch is not sequenced or not at the end of a sequence when attempting to activate the emergency state - */ - error BatchNotSequencedOrNotSequenceEnd(); - /** * @dev Thrown when the halt timeout is not expired when attempting to activate the emergency state */ @@ -193,26 +123,11 @@ interface IPolygonRollupManager { */ error InvalidRangeBatchTimeTarget(); - /** - * @dev Thrown when attempting to set a force batch timeout in an invalid range of values - */ - error InvalidRangeForceBatchTimeout(); - - /** - * @dev Thrown when the caller is not the pending admin - */ - error OnlyPendingGovernance(); - /** * @dev Thrown when the caller is not the pending admin */ error ChainIDAlreadyExist(); - /** - * @dev Thrown when the caller is not the pending admin - */ - error VerifiersMustHaveSameGenesis(); - /** * @dev Thrown when the caller is not the pending admin */ From 90ffa4a6f84865a6d1c78a687b845dc7682c93ce Mon Sep 17 00:00:00 2001 From: invocamanman Date: Thu, 26 Oct 2023 12:17:40 +0200 Subject: [PATCH 083/230] add comments --- contracts/v2/PolygonRollupManager.sol | 36 ++++++++++++++------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index 67224b47c..a77831dcb 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -43,7 +43,6 @@ contract PolygonRollupManager is bytes32 genesis; } - // review POssible optimization rto reduce bytecode, put maps on another struct or double mapping /** * @notice Struct which to store the rollup data of each chain * @param rollupContract Rollup consensus contract, which manages everything @@ -85,7 +84,7 @@ contract PolygonRollupManager is uint256 internal constant _RFIELD = 21888242871839275222246405745257275088548364400416034343698204186575808495617; - // If a sequenced batch exceeds this timeout without being verified, the contract enters in emergency mode + // If the system a does not verify a batch inside this time window, the contract enters in emergency mode uint64 internal constant _HALT_AGGREGATION_TIMEOUT = 1 weeks; // Maximum batches that can be verified in one call. It depends on our current metrics @@ -116,51 +115,57 @@ contract PolygonRollupManager is // zkEVM FORK ID uint64 internal constant _ZKEVM_FORKID = 5; - // Existing roles on rollup manager + // Roles - // Trusted aggregator will be able to verify batches without extra delau + // Be able to add a new rollup type bytes32 internal constant _ADD_ROLLUP_TYPE_ROLE = keccak256("ADD_ROLLUP_TYPE_ROLE"); - // Trusted aggregator will be able to verify batches without extra delau + // Be able to obsolete a rollup type, which means that new rollups cannot use this type bytes32 internal constant _OBSOLETE_ROLLUP_TYPE_ROLE = keccak256("OBSOLETE_ROLLUP_TYPE_ROLE"); + // Be able to create a new rollup using a rollup type bytes32 internal constant _CREATE_ROLLUP_ROLE = keccak256("CREATE_ROLLUP_ROLE"); + // Be able to create a new rollup which does not have to follow any rollup type. + // Also is able to set a genesis block bytes32 internal constant _ADD_EXISTING_ROLLUP_ROLE = keccak256("ADD_EXISTING_ROLLUP_ROLE"); + // Be able to update a rollup to a new rollup type that it's compatible bytes32 internal constant _UPDATE_ROLLUP_ROLE = keccak256("UPDATE_ROLLUP_ROLE"); - // Role that has priority to verify batches, also consolidates the state instantly + // Be able to that has priority to verify batches and consolidates the state instantly bytes32 internal constant _TRUSTED_AGGREGATOR_ROLE = keccak256("TRUSTED_AGGREGATOR_ROLE"); - // Role to Set the Trusted aggregator + // Be able to set the Trusted aggregator address bytes32 internal constant _TRUSTED_AGGREGATOR_ROLE_ADMIN = keccak256("TRUSTED_AGGREGATOR_ROLE_ADMIN"); + // Be able to tweak parameters bytes32 internal constant _TWEAK_PARAMETERS_ROLE = keccak256("TWEAK_PARAMETERS_ROLE"); - // Will be able to set the current batch fee + // Be able to set the current batch fee bytes32 internal constant _SET_FEE_ROLE = keccak256("SET_FEE_ROLE"); + // Be able to stop the emergency state bytes32 internal constant _STOP_EMERGENCY_ROLE = keccak256("STOP_EMERGENCY_ROLE"); - // Trusted aggregator will be able to verify batches without extra delau + // Be able to activate the emergency state without any further condition bytes32 internal constant _EMERGENCY_COUNCIL_ROLE = keccak256("EMERGENCY_COUNCIL_ROLE"); - // Will be able to update the emergency council + // Be able to set the emergency council address bytes32 internal constant _EMERGENCY_COUNCIL_ADMIN = keccak256("EMERGENCY_COUNCIL_ADMIN"); - // Global Exit Root interface + // Global Exit Root address IPolygonZkEVMGlobalExitRoot public immutable globalExitRootManager; // PolygonZkEVM Bridge Address @@ -169,13 +174,13 @@ contract PolygonRollupManager is // POL token address IERC20Upgradeable public immutable pol; - // Number of rollup types added, every new consensus will be assigned sequencially a new ID + // Number of rollup types added, every new type will be assigned sequencially a new ID uint32 public rollupTypeCount; // Consensus mapping mapping(uint32 rollupTypeID => RollupType) public rollupTypeMap; - // Rollup Count + // Number of rollups added, every new rollup will be assigned sequencially a new ID uint32 public rollupCount; // Rollups mapping @@ -185,7 +190,6 @@ contract PolygonRollupManager is mapping(address rollupAddress => uint32 rollupID) public rollupAddressToID; // Rollups mapping - // review, should we reserve some ChainIDs? mapping(uint64 chainID => uint32 rollupID) public chainIDToRollupID; // Total sequenced batches between all rollups @@ -194,7 +198,7 @@ contract PolygonRollupManager is // Total verified batches between all rollups uint64 public totalVerifiedBatches; - // Last timestamp where an aggregation happen + // Last timestamp when an aggregation happen uint64 public lastAggregationTimestamp; // Trusted aggregator timeout, if a sequence is not verified in this time frame, @@ -410,7 +414,6 @@ contract PolygonRollupManager is // Even this role can only update to an already added verifier/consensus // Could break the compatibility of them, changing the virtual state - // review _setupRole(_UPDATE_ROLLUP_ROLE, timelock); // Admin roles @@ -495,7 +498,6 @@ contract PolygonRollupManager is bytes32 genesis, string memory description ) external onlyRole(_ADD_ROLLUP_TYPE_ROLE) { - // nullify rollup type?¿ review hash(verifier, implementation, genesis) uint32 rollupTypeID = ++rollupTypeCount; rollupTypeMap[rollupTypeID] = RollupType({ From 21e926d52130d8fcf9cbc1a9640610cf14d3fee8 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Thu, 26 Oct 2023 18:58:33 +0200 Subject: [PATCH 084/230] fix comments and interfaces --- contracts/v2/PolygonRollupManager.sol | 147 +++++++++--------- contracts/v2/PolygonZkEVMBridgeV2.sol | 35 +++-- .../v2/interfaces/IPolygonZkEVMBaseBridge.sol | 111 ------------- .../v2/interfaces/IPolygonZkEVMBridgeV2.sol | 126 ++++++++++++++- .../v2/interfaces/IPolygonZkEVMV2Errors.sol | 3 +- contracts/v2/lib/DepositContractBase.sol | 4 +- contracts/v2/lib/DepositContractV2.sol | 4 +- contracts/v2/lib/PolygonRollupBase.sol | 8 +- 8 files changed, 216 insertions(+), 222 deletions(-) delete mode 100644 contracts/v2/interfaces/IPolygonZkEVMBaseBridge.sol diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index a77831dcb..7dacbe366 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -130,7 +130,7 @@ contract PolygonRollupManager is keccak256("CREATE_ROLLUP_ROLE"); // Be able to create a new rollup which does not have to follow any rollup type. - // Also is able to set a genesis block + // Also sets the genesis block for that network bytes32 internal constant _ADD_EXISTING_ROLLUP_ROLE = keccak256("ADD_EXISTING_ROLLUP_ROLE"); @@ -142,7 +142,7 @@ contract PolygonRollupManager is bytes32 internal constant _TRUSTED_AGGREGATOR_ROLE = keccak256("TRUSTED_AGGREGATOR_ROLE"); - // Be able to set the Trusted aggregator address + // Be able to set the trusted aggregator address bytes32 internal constant _TRUSTED_AGGREGATOR_ROLE_ADMIN = keccak256("TRUSTED_AGGREGATOR_ROLE_ADMIN"); @@ -177,25 +177,26 @@ contract PolygonRollupManager is // Number of rollup types added, every new type will be assigned sequencially a new ID uint32 public rollupTypeCount; - // Consensus mapping + // Rollup type mapping mapping(uint32 rollupTypeID => RollupType) public rollupTypeMap; // Number of rollups added, every new rollup will be assigned sequencially a new ID uint32 public rollupCount; - // Rollups mapping + // Rollups ID mapping mapping(uint32 rollupID => RollupData) public rollupIDToRollupData; - // Rollups mapping + // Rollups address mapping mapping(address rollupAddress => uint32 rollupID) public rollupAddressToID; - // Rollups mapping + // Chain ID mapping for nullifying + // note we will take care to avoid that current known chainIDs are not reused in our networks (example: 1) mapping(uint64 chainID => uint32 rollupID) public chainIDToRollupID; - // Total sequenced batches between all rollups + // Total sequenced batches across all rollups uint64 public totalSequencedBatches; - // Total verified batches between all rollups + // Total verified batches across all rollups uint64 public totalVerifiedBatches; // Last timestamp when an aggregation happen @@ -215,7 +216,7 @@ contract PolygonRollupManager is // Batch fee multiplier with 3 decimals that goes from 1000 - 1023 uint16 public multiplierBatchFee; - // Current matic fee per batch sequenced + // Current POL fee per batch sequenced // note This variable is internal, since the view function getBatchFee is likely to be ugpraded uint256 internal _batchFee; @@ -233,7 +234,7 @@ contract PolygonRollupManager is ); /** - * @dev Emitted when a a rolup type is deleted + * @dev Emitted when a a rolup type is obsoleted */ event ObsoleteRollupType(uint32 indexed rollupTypeID); @@ -275,7 +276,7 @@ contract PolygonRollupManager is event OnSequenceBatches(uint32 indexed rollupID, uint64 lastBatchSequenced); /** - * @dev Emitted when a aggregator verifies batches + * @dev Emitted when an aggregator verifies batches */ event VerifyBatches( uint32 indexed rollupID, @@ -286,7 +287,7 @@ contract PolygonRollupManager is ); /** - * @dev Emitted when a aggregator verifies batches + * @dev Emitted when the trusted aggregator verifies batches */ event VerifyBatchesTrustedAggregator( uint32 indexed rollupID, @@ -327,38 +328,38 @@ contract PolygonRollupManager is ); /** - * @dev Emitted when the admin updates the trusted aggregator timeout + * @dev Emitted when is updated the trusted aggregator timeout */ event SetTrustedAggregatorTimeout(uint64 newTrustedAggregatorTimeout); /** - * @dev Emitted when the admin updates the pending state timeout + * @dev Emitted when is updated the pending state timeout */ event SetPendingStateTimeout(uint64 newPendingStateTimeout); /** - * @dev Emitted when the admin updates the multiplier batch fee + * @dev Emitted when is updated the multiplier batch fee */ event SetMultiplierBatchFee(uint16 newMultiplierBatchFee); /** - * @dev Emitted when the admin updates the verify batch timeout + * @dev Emitted when is updated the verify batch timeout */ event SetVerifyBatchTimeTarget(uint64 newVerifyBatchTimeTarget); /** - * @dev Emitted when the admin updates the trusted aggregator address + * @dev Emitted when is updated the trusted aggregator address */ event SetTrustedAggregator(address newTrustedAggregator); /** - * @dev Emitted when the batch fee is set + * @dev Emitted when is updated the batch fee */ event SetBatchFee(uint256 newBatchFee); /** * @param _globalExitRootManager Global exit root manager address - * @param _pol MATIC token address + * @param _pol POL token address * @param _bridgeAddress Bridge address */ constructor( @@ -395,7 +396,7 @@ contract PolygonRollupManager is trustedAggregatorTimeout = _trustedAggregatorTimeout; // Constant deployment variables - _batchFee = 0.1 ether; // 0.1 Matic + _batchFee = 0.1 ether; // 0.1 POL verifyBatchTimeTarget = 30 minutes; multiplierBatchFee = 1002; @@ -412,21 +413,19 @@ contract PolygonRollupManager is _setupRole(_ADD_ROLLUP_TYPE_ROLE, timelock); _setupRole(_ADD_EXISTING_ROLLUP_ROLE, timelock); - // Even this role can only update to an already added verifier/consensus + // note even this role can only update to an already added verifier/consensus // Could break the compatibility of them, changing the virtual state _setupRole(_UPDATE_ROLLUP_ROLE, timelock); - // Admin roles + // admin roles _setupRole(_OBSOLETE_ROLLUP_TYPE_ROLE, admin); _setupRole(_CREATE_ROLLUP_ROLE, admin); _setupRole(_STOP_EMERGENCY_ROLE, admin); _setupRole(_TWEAK_PARAMETERS_ROLE, admin); - // admin should be able to update the timelock address + // admin should be able to update the trsuted aggregator address _setRoleAdmin(_TRUSTED_AGGREGATOR_ROLE, _TRUSTED_AGGREGATOR_ROLE_ADMIN); _setupRole(_TRUSTED_AGGREGATOR_ROLE_ADMIN, admin); - - // review Could be another address?¿ _setupRole(_SET_FEE_ROLE, admin); // Emergency council roles @@ -484,11 +483,11 @@ contract PolygonRollupManager is /** * @notice Add a new rollup type - * @param consensusImplementation consensus implementation - * @param verifier verifier address - * @param forkID forkID of the verifier - * @param genesis genesis block of the rollup - * @param description description of the rollup type + * @param consensusImplementation Consensus implementation + * @param verifier Verifier address + * @param forkID ForkID of the verifier + * @param genesis Genesis block of the rollup + * @param description Description of the rollup type */ function addNewRollupType( address consensusImplementation, @@ -546,13 +545,13 @@ contract PolygonRollupManager is /** * @notice Create a new rollup * @param rollupTypeID Rollup type to deploy - * @param chainID chainID of the rollup, must be a new one - * @param admin admin of the new created rollup - * @param sequencer sequencer of the new created rollup + * @param chainID ChainID of the rollup, must be a new one + * @param admin Admin of the new created rollup + * @param sequencer Sequencer of the new created rollup * @param gasTokenAddress Indicates the token address that will be used to pay gas fees in the new rollup * @param gasTokenNetwork Indicates the native network of the token address - * @param sequencerURL sequencer URL of the new created rollup - * @param networkName network name of the new created rollup + * @param sequencerURL Sequencer URL of the new created rollup + * @param networkName Network name of the new created rollup */ function createNewRollup( uint32 rollupTypeID, @@ -631,12 +630,12 @@ contract PolygonRollupManager is /** * @notice Add an already deployed rollup * note that this rollup does not follow any rollupType - * @param rollupAddress rollup address - * @param verifier verifier address, must be added before - * @param forkID fork id of the added rollup - * @param chainID chain id of the added rollup - * @param genesis genesis block for this rollup - * @param rollupCompatibilityID compatibility ID for the added rollup + * @param rollupAddress Rollup address + * @param verifier Verifier address, must be added before + * @param forkID Fork id of the added rollup + * @param chainID Chain id of the added rollup + * @param genesis Genesis block for this rollup + * @param rollupCompatibilityID Compatibility ID for the added rollup */ function addExistingRollup( IPolygonRollupBase rollupAddress, @@ -664,11 +663,11 @@ contract PolygonRollupManager is /** * @notice Add an already deployed rollup * note that this rollup does not follow any rollupType - * @param rollupAddress rollup address - * @param verifier verifier address, must be added before - * @param forkID fork id of the added rollup - * @param chainID chain id of the added rollup - * @param rollupCompatibilityID compatibility ID for the added rollup + * @param rollupAddress Rollup address + * @param verifier Verifier address, must be added before + * @param forkID Fork id of the added rollup + * @param chainID Chain id of the added rollup + * @param rollupCompatibilityID Compatibility ID for the added rollup */ function _addExistingRollup( IPolygonRollupBase rollupAddress, @@ -702,11 +701,6 @@ contract PolygonRollupManager is ); } - //review, should check that there are not sequenced batches pending to be verified?¿? - // this way no one can break the virtual state, ( but maybe is worth to break it) - // Also upgrade address can send `upgradeData` to the proxy, being able to call `onVerifyBathes` maliciously - // To avoid attacks, should data be empty, or should check that does not call `onVerifyBatches` - /** * @notice Upgrade an existing rollup * @param rollupContract Rollup consensus proxy address @@ -723,7 +717,7 @@ contract PolygonRollupManager is revert RollupTypeDoesNotExist(); } - // check the rollup exists + // Check the rollup exists uint32 rollupID = rollupAddressToID[address(rollupContract)]; if (rollupID == 0) { revert RollupMustExist(); @@ -743,14 +737,14 @@ contract PolygonRollupManager is revert RollupTypeObsolete(); } - // check compatibility of the rollups + // Check compatibility of the rollups if ( rollup.rollupCompatibilityID != newRollupType.rollupCompatibilityID ) { revert UpdateNotCompatible(); } - // update rollup parameters + // Update rollup parameters rollup.verifier = newRollupType.verifier; rollup.forkID = newRollupType.forkID; rollup.rollupTypeID = newRollupTypeID; @@ -759,7 +753,6 @@ contract PolygonRollupManager is rollup.lastVerifiedBatchBeforeUpgrade = lastVerifiedBatch; // Upgrade rollup - // review could check previous implementation through rollup prev type and avoid upgrade rollupContract.upgradeToAndCall( newRollupType.consensusImplementation, upgradeData @@ -774,8 +767,8 @@ contract PolygonRollupManager is /** * @notice Sequence batches, callback called by one of the consensus managed by this contract - * @param newSequencedBatches how many sequenced batches were sequenced - * @param newAccInputHash new accumualted input hash + * @param newSequencedBatches Number of batches sequenced + * @param newAccInputHash New accumulate input hash */ function onSequenceBatches( uint64 newSequencedBatches, @@ -823,10 +816,10 @@ contract PolygonRollupManager is * @param pendingStateNum Init pending state, 0 if consolidated state is used * @param initNumBatch Batch which the aggregator starts the verification * @param finalNewBatch Last batch aggregator intends to verify - * @param newLocalExitRoot New local exit root once the batch is processed + * @param newLocalExitRoot New local exit root once the batch is processed * @param newStateRoot New State root once the batch is processed * @param beneficiary Address that will receive the verification reward - * @param proof fflonk proof + * @param proof Fflonk proof */ function verifyBatches( uint32 rollupID, @@ -913,10 +906,10 @@ contract PolygonRollupManager is * @param pendingStateNum Init pending state, 0 if consolidated state is used * @param initNumBatch Batch which the aggregator starts the verification * @param finalNewBatch Last batch aggregator intends to verify - * @param newLocalExitRoot New local exit root once the batch is processed + * @param newLocalExitRoot New local exit root once the batch is processed * @param newStateRoot New State root once the batch is processed * @param beneficiary Address that will receive the verification reward - * @param proof fflonk proof + * @param proof Fflonk proof */ function verifyBatchesTrustedAggregator( uint32 rollupID, @@ -970,9 +963,9 @@ contract PolygonRollupManager is * @param pendingStateNum Init pending state, 0 if consolidated state is used * @param initNumBatch Batch which the aggregator starts the verification * @param finalNewBatch Last batch aggregator intends to verify - * @param newLocalExitRoot New local exit root once the batch is processed + * @param newLocalExitRoot New local exit root once the batch is processed * @param newStateRoot New State root once the batch is processed - * @param proof fflonk proof + * @param proof Fflonk proof */ function _verifyAndRewardBatches( RollupData storage rollup, @@ -1047,7 +1040,7 @@ contract PolygonRollupManager is revert InvalidProof(); } - // Pay MATIC rewards + // Pay POL rewards uint64 newVerifiedBatches = finalNewBatch - currentLastVerifiedBatch; pol.safeTransfer( @@ -1173,7 +1166,7 @@ contract PolygonRollupManager is * @param finalNewBatch Last batch aggregator intends to verify * @param newLocalExitRoot New local exit root once the batch is processed * @param newStateRoot New State root once the batch is processed - * @param proof fflonk proof + * @param proof Fflonk proof */ function overridePendingState( uint32 rollupID, @@ -1233,7 +1226,7 @@ contract PolygonRollupManager is * @param finalNewBatch Last batch aggregator intends to verify * @param newLocalExitRoot New local exit root once the batch is processed * @param newStateRoot New State root once the batch is processed - * @param proof fflonk proof + * @param proof Fflonk proof */ function proveNonDeterministicPendingState( uint32 rollupID, @@ -1276,7 +1269,7 @@ contract PolygonRollupManager is * @param finalNewBatch Last batch aggregator intends to verify * @param newLocalExitRoot New local exit root once the batch is processed * @param newStateRoot New State root once the batch is processed - * @param proof fflonk proof + * @param proof Fflonk proof */ function _proveDistinctPendingState( RollupData storage rollup, @@ -1514,11 +1507,11 @@ contract PolygonRollupManager is } ////////////////// - // admin functions + // Setter functions ////////////////// /** - * @notice Allow the admin to set a new pending state timeout + * @notice Set a new pending state timeout * The timeout can only be lowered, except if emergency state is active * @param newTrustedAggregatorTimeout Trusted aggregator timeout */ @@ -1536,7 +1529,7 @@ contract PolygonRollupManager is } /** - * @notice Allow the admin to set a new trusted aggregator timeout + * @notice Set a new trusted aggregator timeout * The timeout can only be lowered, except if emergency state is active * @param newPendingStateTimeout Trusted aggregator timeout */ @@ -1554,7 +1547,7 @@ contract PolygonRollupManager is } /** - * @notice Allow the admin to set a new multiplier batch fee + * @notice Set a new multiplier batch fee * @param newMultiplierBatchFee multiplier batch fee */ function setMultiplierBatchFee( @@ -1569,7 +1562,7 @@ contract PolygonRollupManager is } /** - * @notice Allow the admin to set a new verify batch time target + * @notice 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 * @param newVerifyBatchTimeTarget Verify batch time target @@ -1585,7 +1578,7 @@ contract PolygonRollupManager is } /** - * @notice Allow to corresponding role to set the current batch fee + * @notice Set the current batch fee * @param newBatchFee new batch fee */ function setBatchFee(uint256 newBatchFee) external onlyRole(_SET_FEE_ROLE) { @@ -1611,7 +1604,7 @@ contract PolygonRollupManager is function getRollupExitRoot() public view returns (bytes32) { uint256 currentNodes = rollupCount; - // if there are no nodes return 0 + // If there are no nodes return 0 if (currentNodes == 0) { return bytes32(0); } @@ -1648,7 +1641,7 @@ contract PolygonRollupManager is } } - // update tree variables + // Update tree variables tmpTree = nextTmpTree; currentNodes = nextIterationNodes; currentZeroHashHeight = keccak256( @@ -1797,7 +1790,7 @@ contract PolygonRollupManager is bytes32 oldStateRoot, bytes32 newStateRoot ) internal view returns (bytes memory) { - // sanity checks + // Sanity check bytes32 oldAccInputHash = rollup .sequencedBatches[initNumBatch] .accInputHash; @@ -1806,7 +1799,7 @@ contract PolygonRollupManager is .sequencedBatches[finalNewBatch] .accInputHash; - // sanity checks + // Sanity check if (initNumBatch != 0 && oldAccInputHash == bytes32(0)) { revert OldAccInputHashDoesNotExist(); } diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index 8cb420dcf..32909054f 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -106,11 +106,11 @@ contract PolygonZkEVMBridgeV2 is // Set gas token if (gasTokenAddress == address(0)) { - // gas token will be ether + // Gas token will be ether if (gasTokenNetwork != 0) { revert GasTokenNetworkMustBeZeroOnEther(); } - //WETHToken, gasTokenAddress and gasTokenNetwork will be 0 + // WETHToken, gasTokenAddress and gasTokenNetwork will be 0 } else { // Gas token will be an erc20 gasTokenAddress = _gasTokenAddress; @@ -174,6 +174,7 @@ contract PolygonZkEVMBridgeV2 is * 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 + * note User/UI must be aware of the existing/available networks when choosing the destination network * @param destinationNetwork Network destination * @param destinationAddress Address destination * @param amount Amount of tokens @@ -189,7 +190,6 @@ contract PolygonZkEVMBridgeV2 is bool forceUpdateGlobalExitRoot, bytes calldata permitData ) public payable virtual ifNotEmergencyState nonReentrant { - // User/UI must be aware of the existing/available networks if (destinationNetwork == networkID) { revert DestinationNetworkInvalid(); } @@ -300,6 +300,7 @@ contract PolygonZkEVMBridgeV2 is /** * @notice Bridge message and send ETH value + * note User/UI must be aware of the existing/available networks when choosing the destination network * @param destinationNetwork Network destination * @param destinationAddress Address destination * @param forceUpdateGlobalExitRoot Indicates if the new global exit root is updated or not @@ -311,7 +312,7 @@ contract PolygonZkEVMBridgeV2 is bool forceUpdateGlobalExitRoot, bytes calldata metadata ) external payable { - // If exist a gas token, only let call this function without value + // If exist a gas token, only allow call this function without value if (msg.value != 0 && address(WETHToken) != address(0)) { revert NoValueInMessagesOnGasTokenNetworks(); } @@ -327,6 +328,7 @@ contract PolygonZkEVMBridgeV2 is /** * @notice Bridge message and send ETH value + * note User/UI must be aware of the existing/available networks when choosing the destination network * @param destinationNetwork Network destination * @param destinationAddress Address destination * @param amountWETH Amount of WETH tokens @@ -340,7 +342,7 @@ contract PolygonZkEVMBridgeV2 is bool forceUpdateGlobalExitRoot, bytes calldata metadata ) external { - // if native token is ether, disable this function + // If native token is ether, disable this function if (address(WETHToken) == address(0)) { revert NativeTokenIsEther(); } @@ -372,7 +374,6 @@ contract PolygonZkEVMBridgeV2 is bool forceUpdateGlobalExitRoot, bytes calldata metadata ) internal { - // User/UI must be aware of the existing/available networks if (destinationNetwork == networkID) { revert DestinationNetworkInvalid(); } @@ -415,7 +416,7 @@ contract PolygonZkEVMBridgeV2 is * 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 + * to avoid possible synch attacks * @param mainnetExitRoot Mainnet exit root * @param rollupExitRoot Rollup exit root * @param originNetwork Origin network @@ -571,7 +572,7 @@ contract PolygonZkEVMBridgeV2 is * 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 + * to avoid possible synch attacks * @param mainnetExitRoot Mainnet exit root * @param rollupExitRoot Rollup exit root * @param originNetwork Origin network @@ -630,7 +631,7 @@ contract PolygonZkEVMBridgeV2 is ) ); } else { - // mint wETH tokens + // Mint wETH tokens WETHToken.mint(destinationAddress, amount); // Execute message @@ -692,7 +693,7 @@ contract PolygonZkEVMBridgeV2 is ) ); - // last 20 bytes of hash to address + // Last 20 bytes of hash to address return address(uint160(uint256(hashCreate2))); } @@ -763,9 +764,9 @@ contract PolygonZkEVMBridgeV2 is // Get origin network from global index if (globalIndex & _GLOBAL_INDEX_MAINNET_FLAG == 1) { - // It's mainnet, therefore sourceBridgeNetwork is 0 + // the network is mainnet, therefore sourceBridgeNetwork is 0 - // last 32 bits are leafIndex + // Last 32 bits are leafIndex leafIndex = uint32(globalIndex); if ( @@ -779,14 +780,14 @@ contract PolygonZkEVMBridgeV2 is revert InvalidSmtProof(); } } else { - // it's a rollup, therefore we have to get the origin network + // the network is a rollup, therefore sourceBridgeNetwork must be decoded uint32 indexRollup = uint32(globalIndex >> 32); sourceBridgeNetwork = indexRollup + 1; - // last 32 bits are leafIndex + // Last 32 bits are leafIndex leafIndex = uint32(globalIndex); - // verify merkle proof agains rollup exit root + // Verify merkle proof agains rollup exit root if ( !verifyMerkleProof( calculateRoot(leafValue, smtProofLocalExitRoot, leafIndex), @@ -806,7 +807,7 @@ contract PolygonZkEVMBridgeV2 is /** * @notice Function to check if an index is claimed or not * @param leafIndex Index - * @param sourceBridgeNetwork origin network + * @param sourceBridgeNetwork Origin network */ function isClaimed( uint32 leafIndex, @@ -834,7 +835,7 @@ contract PolygonZkEVMBridgeV2 is /** * @notice Function to check that an index is not claimed and set it as claimed * @param leafIndex Index - * @param sourceBridgeNetwork origin network + * @param sourceBridgeNetwork Origin network */ function _setAndCheckClaimed( uint32 leafIndex, diff --git a/contracts/v2/interfaces/IPolygonZkEVMBaseBridge.sol b/contracts/v2/interfaces/IPolygonZkEVMBaseBridge.sol deleted file mode 100644 index c7f9bc36c..000000000 --- a/contracts/v2/interfaces/IPolygonZkEVMBaseBridge.sol +++ /dev/null @@ -1,111 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 - -pragma solidity ^0.8.20; - -interface IPolygonZkEVMBaseBridge { - /** - * @dev Thrown when the destination network is invalid - */ - error DestinationNetworkInvalid(); - - /** - * @dev Thrown when the amount does not match msg.value - */ - error AmountDoesNotMatchMsgValue(); - - /** - * @dev Thrown when user is bridging tokens and is also sending a value - */ - error MsgValueNotZero(); - - /** - * @dev Thrown when the Ether transfer on claimAsset fails - */ - error EtherTransferFailed(); - - /** - * @dev Thrown when the message transaction on claimMessage fails - */ - error MessageFailed(); - - /** - * @dev Thrown when the global exit root does not exist - */ - error GlobalExitRootInvalid(); - - /** - * @dev Thrown when the smt proof does not match - */ - error InvalidSmtProof(); - - /** - * @dev Thrown when an index is already claimed - */ - error AlreadyClaimed(); - - /** - * @dev Thrown when the owner of permit does not match the sender - */ - error NotValidOwner(); - - /** - * @dev Thrown when the spender of the permit does not match this contract address - */ - error NotValidSpender(); - - /** - * @dev Thrown when the amount of the permit does not match - */ - error NotValidAmount(); - - /** - * @dev Thrown when the permit data contains an invalid signature - */ - error NotValidSignature(); - - function bridgeAsset( - uint32 destinationNetwork, - address destinationAddress, - uint256 amount, - address token, - bool forceUpdateGlobalExitRoot, - bytes calldata permitData - ) external payable; - - function bridgeMessage( - uint32 destinationNetwork, - address destinationAddress, - bool forceUpdateGlobalExitRoot, - bytes calldata metadata - ) external payable; - - function claimAsset( - bytes32[32] calldata smtProofLocalExitRoot, - bytes32[32] calldata smtProofRollupExitRoot, - uint256 globalIndex, - bytes32 mainnetExitRoot, - bytes32 rollupExitRoot, - uint32 originNetwork, - address originTokenAddress, - uint32 destinationNetwork, - address destinationAddress, - uint256 amount, - bytes calldata metadata - ) external; - - function claimMessage( - bytes32[32] calldata smtProofLocalExitRoot, - bytes32[32] calldata smtProofRollupExitRoot, - uint256 globalIndex, - bytes32 mainnetExitRoot, - bytes32 rollupExitRoot, - uint32 originNetwork, - address originAddress, - uint32 destinationNetwork, - address destinationAddress, - uint256 amount, - bytes calldata metadata - ) external; - - function updateGlobalExitRoot() external; -} diff --git a/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol b/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol index 279089ec5..31923c738 100644 --- a/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol +++ b/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol @@ -1,17 +1,73 @@ // SPDX-License-Identifier: AGPL-3.0 pragma solidity ^0.8.20; -import "./IPolygonZkEVMBaseBridge.sol"; +import "../../interfaces/IBasePolygonZkEVMGlobalExitRoot.sol"; -interface IPolygonZkEVMBridgeV2 is IPolygonZkEVMBaseBridge { +interface IPolygonZkEVMBridgeV2 { /** - * @dev Thrown when sender is not the rollup manager + * @dev Thrown when the destination network is invalid */ - error OnlyRollupManager(); + error DestinationNetworkInvalid(); - function activateEmergencyState() external; + /** + * @dev Thrown when the amount does not match msg.value + */ + error AmountDoesNotMatchMsgValue(); - function deactivateEmergencyState() external; + /** + * @dev Thrown when user is bridging tokens and is also sending a value + */ + error MsgValueNotZero(); + + /** + * @dev Thrown when the Ether transfer on claimAsset fails + */ + error EtherTransferFailed(); + + /** + * @dev Thrown when the message transaction on claimMessage fails + */ + error MessageFailed(); + + /** + * @dev Thrown when the global exit root does not exist + */ + error GlobalExitRootInvalid(); + + /** + * @dev Thrown when the smt proof does not match + */ + error InvalidSmtProof(); + + /** + * @dev Thrown when an index is already claimed + */ + error AlreadyClaimed(); + + /** + * @dev Thrown when the owner of permit does not match the sender + */ + error NotValidOwner(); + + /** + * @dev Thrown when the spender of the permit does not match this contract address + */ + error NotValidSpender(); + + /** + * @dev Thrown when the amount of the permit does not match + */ + error NotValidAmount(); + + /** + * @dev Thrown when the permit data contains an invalid signature + */ + error NotValidSignature(); + + /** + * @dev Thrown when sender is not the rollup manager + */ + error OnlyRollupManager(); /** * @dev Thrown when the permit data contains an invalid signature @@ -28,6 +84,28 @@ interface IPolygonZkEVMBridgeV2 is IPolygonZkEVMBaseBridge { */ error GasTokenNetworkMustBeZeroOnEther(); + function updateGlobalExitRoot() external; + + function activateEmergencyState() external; + + function deactivateEmergencyState() external; + + function bridgeAsset( + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + address token, + bool forceUpdateGlobalExitRoot, + bytes calldata permitData + ) external payable; + + function bridgeMessage( + uint32 destinationNetwork, + address destinationAddress, + bool forceUpdateGlobalExitRoot, + bytes calldata metadata + ) external payable; + function bridgeMessageWETH( uint32 destinationNetwork, address destinationAddress, @@ -35,4 +113,40 @@ interface IPolygonZkEVMBridgeV2 is IPolygonZkEVMBaseBridge { bool forceUpdateGlobalExitRoot, bytes calldata metadata ) external; + + function claimAsset( + bytes32[32] calldata smtProofLocalExitRoot, + bytes32[32] calldata smtProofRollupExitRoot, + uint256 globalIndex, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + uint32 originNetwork, + address originTokenAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes calldata metadata + ) external; + + function claimMessage( + bytes32[32] calldata smtProofLocalExitRoot, + bytes32[32] calldata smtProofRollupExitRoot, + uint256 globalIndex, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + uint32 originNetwork, + address originAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes calldata metadata + ) external; + + function initialize( + uint32 _networkID, + address _gasTokenAddress, + uint32 _gasTokenNetwork, + IBasePolygonZkEVMGlobalExitRoot _globalExitRootManager, + address _polygonRollupManager + ) external; } diff --git a/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol b/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol index 191510c18..56c2d8dfd 100644 --- a/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol +++ b/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol @@ -1,8 +1,9 @@ // SPDX-License-Identifier: AGPL-3.0 pragma solidity ^0.8.20; +import "../../interfaces/IPolygonZkEVMErrors.sol"; -interface IPolygonZkEVMV2Errors { +interface IPolygonZkEVMV2Errors is IPolygonZkEVMErrors { /** * @dev Thrown when the caller is not the trusted sequencer */ diff --git a/contracts/v2/lib/DepositContractBase.sol b/contracts/v2/lib/DepositContractBase.sol index c4636e19e..a93f0a90f 100644 --- a/contracts/v2/lib/DepositContractBase.sol +++ b/contracts/v2/lib/DepositContractBase.sol @@ -103,7 +103,7 @@ contract DepositContractBase { } /** - * @notice calcualte root from merkle proof + * @notice Calculate root from merkle proof * @param leafHash Leaf hash * @param smtProof Smt proof * @param index Index of the leaf @@ -115,7 +115,7 @@ contract DepositContractBase { ) public pure returns (bytes32) { bytes32 node = leafHash; - // Check merkle proof + // Compute root for ( uint256 height = 0; height < _DEPOSIT_CONTRACT_TREE_DEPTH; diff --git a/contracts/v2/lib/DepositContractV2.sol b/contracts/v2/lib/DepositContractV2.sol index 494783589..57995dfb4 100644 --- a/contracts/v2/lib/DepositContractV2.sol +++ b/contracts/v2/lib/DepositContractV2.sol @@ -5,8 +5,8 @@ import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable. import "./DepositContractBase.sol"; /** - * 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 + * This contract will be used in the PolygonZkEVMBridge contract, it inherits the DepositContractBase and adds the logic + * to calculate the leaf of the tree */ contract DepositContractV2 is ReentrancyGuardUpgradeable, DepositContractBase { /** diff --git a/contracts/v2/lib/PolygonRollupBase.sol b/contracts/v2/lib/PolygonRollupBase.sol index e2a9d6ea4..c1b1acbb1 100644 --- a/contracts/v2/lib/PolygonRollupBase.sol +++ b/contracts/v2/lib/PolygonRollupBase.sol @@ -2,17 +2,14 @@ pragma solidity ^0.8.20; import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; -import "../../interfaces/IVerifierRollup.sol"; import "../../interfaces/IPolygonZkEVMGlobalExitRoot.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "../../interfaces/IPolygonZkEVMBridge.sol"; -import "../../lib/EmergencyManager.sol"; import "../../interfaces/IPolygonZkEVMErrors.sol"; import "../interfaces/IPolygonZkEVMV2Errors.sol"; import "../PolygonRollupManager.sol"; import "../interfaces/IPolygonRollupBase.sol"; -import "../PolygonZkEVMBridgeV2.sol"; -import "../../interfaces/IBasePolygonZkEVMGlobalExitRoot.sol"; +import "../interfaces/IPolygonZkEVMBridgeV2.sol"; /** * Contract responsible for managing the states and the updates of L2 network. @@ -24,7 +21,6 @@ import "../../interfaces/IBasePolygonZkEVMGlobalExitRoot.sol"; */ contract PolygonRollupBase is Initializable, - IPolygonZkEVMErrors, IPolygonZkEVMV2Errors, IPolygonRollupBase { @@ -808,7 +804,7 @@ contract PolygonRollupBase is bytes memory bytesToSign = abi.encodePacked( BASE_INITIALIZE_TX_BRIDGE, abi.encodeCall( - PolygonZkEVMBridgeV2.initialize, + IPolygonZkEVMBridgeV2.initialize, ( networkID, _gasTokenAddress, From 436841134c189ae573d9a31f8448f905105cae24 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 14 Nov 2023 10:31:47 +0300 Subject: [PATCH 085/230] fix hexxens audit --- .solcover.js | 3 +- contracts/v2/PolygonRollupManager.sol | 3 +- contracts/v2/PolygonZkEVMBridgeV2.sol | 8 +- contracts/v2/PolygonZkEVMGlobalExitRootV2.sol | 2 + contracts/v2/lib/PolygonRollupBase.sol | 1 + package.json | 2 +- test/contractsv2/BridgeV2.test.ts | 134 ++++++++++++++++++ 7 files changed, 147 insertions(+), 6 deletions(-) diff --git a/.solcover.js b/.solcover.js index 5b58dbf29..cb307ecb0 100644 --- a/.solcover.js +++ b/.solcover.js @@ -1,3 +1,4 @@ module.exports = { - skipFiles: ['mocks', 'interfaces'] + skipFiles: ['mocks/', 'interfaces/'], + configureYulOptimizer: true, }; \ No newline at end of file diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index 7dacbe366..06c4ca5a3 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -14,10 +14,11 @@ import "./lib/PolygonAccessControlUpgradeable.sol"; import "./lib/LegacyZKEVMStateVariables.sol"; import "./consensus/zkEVM/PolygonZkEVMV2Existent.sol"; +// PolygonL2Manager, ?¿ TODO /** * Contract responsible for managing the exit roots across multiple Rollups */ -contract PolygonRollupManager is +contract PolygonRollupManager is PolygonAccessControlUpgradeable, EmergencyManager, LegacyZKEVMStateVariables, diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index 32909054f..c7c713e1a 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -12,6 +12,8 @@ import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20Metadat import "../lib/EmergencyManager.sol"; import "../lib/GlobalExitRootLib.sol"; +// contract PolygonBridge is DepositContractV2, EmergencyManager, IPolygonBridge { +// TODO /** * PolygonZkEVMBridge that will be deployed on both networks Ethereum and Polygon zkEVM * Contract responsible to manage the token interactions with other networks @@ -105,9 +107,9 @@ contract PolygonZkEVMBridgeV2 is polygonRollupManager = _polygonRollupManager; // Set gas token - if (gasTokenAddress == address(0)) { + if (_gasTokenAddress == address(0)) { // Gas token will be ether - if (gasTokenNetwork != 0) { + if (_gasTokenNetwork != 0) { revert GasTokenNetworkMustBeZeroOnEther(); } // WETHToken, gasTokenAddress and gasTokenNetwork will be 0 @@ -763,7 +765,7 @@ contract PolygonZkEVMBridgeV2 is uint32 sourceBridgeNetwork; // Get origin network from global index - if (globalIndex & _GLOBAL_INDEX_MAINNET_FLAG == 1) { + if (globalIndex & _GLOBAL_INDEX_MAINNET_FLAG != 0) { // the network is mainnet, therefore sourceBridgeNetwork is 0 // Last 32 bits are leafIndex diff --git a/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol b/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol index a40061d3a..83008c1da 100644 --- a/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol +++ b/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol @@ -5,6 +5,8 @@ pragma solidity 0.8.20; import "../interfaces/IPolygonZkEVMGlobalExitRoot.sol"; import "../lib/GlobalExitRootLib.sol"; +// TODO contract PolygonGlobalExitRootManager is IPolygonGlobalExitRootManager { + /** * Contract responsible for managing the exit roots across multiple networks */ diff --git a/contracts/v2/lib/PolygonRollupBase.sol b/contracts/v2/lib/PolygonRollupBase.sol index c1b1acbb1..4f4d04874 100644 --- a/contracts/v2/lib/PolygonRollupBase.sol +++ b/contracts/v2/lib/PolygonRollupBase.sol @@ -19,6 +19,7 @@ import "../interfaces/IPolygonZkEVMBridgeV2.sol"; * 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. */ +// PolygonL2Base rename TODO contract PolygonRollupBase is Initializable, IPolygonZkEVMV2Errors, diff --git a/package.json b/package.json index 52846cf88..3be883b78 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "dockerv2:contracts": "sudo ./docker/scripts/v2/deploy-dockerv2.sh", "push:docker:contracts": "docker push hermeznetwork/geth-zkevm-contracts", "update:genesis": "node deployment/1_createGenesis.js && node deployment/1_createGenesis.js --test --input ../docker/scripts/deploy_parameters_docker.json --out ../docker/scripts/genesis_docker.json", - "coverage": "npx hardhat coverage", + "coverage": "npx hardhat coverage --testfiles \"test/contractsv2/*.ts\"", "gas:report": "REPORT_GAS=true npx hardhat test", "gas:report:file": "rm -f .openzeppelin/unknown-31337.json && REPORT_GAS=true REPORT_GAS_FILE=true npx hardhat test", "deploy:v2:localhost": "rm -f .openzeppelin/unknown-31337.json && npx ts-node deployment/v2/1_createGenesis.ts --test && npx hardhat run deployment/v2/2_deployPolygonZKEVMDeployer.ts --network localhost && npx hardhat run deployment/v2/3_deployContracts.ts --network localhost && npx hardhat run deployment/v2/4_createRollup.ts --network localhost", diff --git a/test/contractsv2/BridgeV2.test.ts b/test/contractsv2/BridgeV2.test.ts index e138575c2..19fcba5e4 100644 --- a/test/contractsv2/BridgeV2.test.ts +++ b/test/contractsv2/BridgeV2.test.ts @@ -375,6 +375,140 @@ describe("PolygonZkEVMBridge Contract", () => { ); }); + it("should claim tokens from Mainnet to Mainnet", async () => { + const originNetwork = networkIDMainnet; + const tokenAddress = polTokenContract.target; + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDMainnet; + const destinationAddress = acc1.address; + + const metadata = metadataToken; + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + const rollupExitRoot = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + + // compute root merkle tree in Js + const height = 32; + const merkleTreeLocal = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + merkleTreeLocal.add(leafValue); + + const mainnetExitRoot = merkleTreeLocal.getRoot(); + const indexRollup = 0; + + // check only rollup account with update rollup exit root + await expect(polygonZkEVMGlobalExitRoot.updateExitRoot(mainnetExitRoot)).to.be.revertedWithCustomError( + polygonZkEVMGlobalExitRoot, + "OnlyAllowedContracts" + ); + + // add rollup Merkle root + await ethers.provider.send("hardhat_impersonateAccount", [polygonZkEVMBridgeContract.target]); + const bridgemoCK = await ethers.getSigner(polygonZkEVMBridgeContract.target as any); + + // await deployer.sendTransaction({ + // to: bridgemoCK.address, + // value: ethers.parseEther("1"), + // }); + + await expect(polygonZkEVMGlobalExitRoot.connect(bridgemoCK).updateExitRoot(mainnetExitRoot, {gasPrice: 0})) + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .withArgs(mainnetExitRoot, rollupExitRoot); + + // check roots + const rollupExitRootSC = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + expect(rollupExitRootSC).to.be.equal(rollupExitRoot); + const mainnetExitRootSC = await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot(); + expect(mainnetExitRootSC).to.be.equal(mainnetExitRoot); + + const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC); + expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + + // check merkle proof + + // Merkle proof local + const indexLocal = 0; + const proofLocal = merkleTreeLocal.getProofTreeByIndex(indexLocal); + + // verify merkle proof + expect(verifyMerkleProof(leafValue, proofLocal, indexLocal, mainnetExitRoot)).to.be.equal(true); + + const globalIndex = computeGlobalIndex(indexLocal, indexRollup, true); + + /* + * claim + * Can't claim without tokens + */ + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofLocal, + proofLocal, + globalIndex, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWith("ERC20: transfer amount exceeds balance"); + + // transfer tokens, then claim + await expect(polTokenContract.transfer(polygonZkEVMBridgeContract.target, amount)) + .to.emit(polTokenContract, "Transfer") + .withArgs(deployer.address, polygonZkEVMBridgeContract.target, amount); + + expect(false).to.be.equal(await polygonZkEVMBridgeContract.isClaimed(indexLocal, indexRollup + 1)); + + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofLocal, + proofLocal, + globalIndex, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ) + .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") + .withArgs(globalIndex, originNetwork, tokenAddress, destinationAddress, amount) + .to.emit(polTokenContract, "Transfer") + .withArgs(polygonZkEVMBridgeContract.target, acc1.address, amount); + + // Can't claim because nullifier + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofLocal, + proofLocal, + globalIndex, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AlreadyClaimed"); + expect(true).to.be.equal(await polygonZkEVMBridgeContract.isClaimed(indexLocal, indexRollup + 1)); + }); + it("should claim tokens from Mainnet to Mainnet", async () => { const originNetwork = networkIDMainnet; const tokenAddress = polTokenContract.target; From 2d405fb03b7b096c7456e1fb15345f406535159d Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 14 Nov 2023 10:56:26 +0300 Subject: [PATCH 086/230] fix docker and dynamic initialize tx bridge --- contracts/v2/PolygonZkEVMGlobalExitRootV2.sol | 1 - contracts/v2/lib/PolygonRollupBase.sol | 14 +++++++++----- deployment/v2/4_createRollup.ts | 18 ++++++++++-------- test/contractsv2/PolygonRollupManager.test.ts | 3 +-- .../PolygonRollupManagerUpgrade.test.ts | 6 ++---- 5 files changed, 22 insertions(+), 20 deletions(-) diff --git a/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol b/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol index 83008c1da..cf1adcc40 100644 --- a/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol +++ b/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol @@ -1,5 +1,4 @@ // SPDX-License-Identifier: AGPL-3.0 - pragma solidity 0.8.20; import "../interfaces/IPolygonZkEVMGlobalExitRoot.sol"; diff --git a/contracts/v2/lib/PolygonRollupBase.sol b/contracts/v2/lib/PolygonRollupBase.sol index 4f4d04874..d096416bd 100644 --- a/contracts/v2/lib/PolygonRollupBase.sol +++ b/contracts/v2/lib/PolygonRollupBase.sol @@ -97,10 +97,12 @@ contract PolygonRollupBase is uint64 internal constant _MAX_VERIFY_BATCHES = 1000; // List rlp: 1 listLenLen "0xf8" (0xf7 + 1), + listLen 1 "0xc3" - // 1 nonce "0x80" + 1 gasPrice "0x80" + 5 gasLimit "0x8401c9c380" + 21 to "0x942a3dd3eb832af982ec71669e178424b10dca2ede" + // 1 nonce "0x80" + 1 gasPrice "0x80" + 5 gasLimit "0x8401c9c380" + 21 to ("0x94" + bridgeAddress") // + 1 value "0x80" + 1 stringLenLen "0xb8" (0xb7 + 1) + stringLen 1 "0xa4" + 164 bytes data ( signature 4 bytes + 5parameters*32bytes) = 195 bytes (0xc3) - bytes public constant BASE_INITIALIZE_TX_BRIDGE = - hex"f8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4"; + bytes public constant FIRST_BASE_INITIALIZE_TX_BRIDGE = + hex"f8c380808401c9c38094"; + + bytes public constant SECOND_BASE_INITIALIZE_TX_BRIDGE = hex"80b8a4"; // Signature used to initialize the bridge @@ -800,10 +802,12 @@ contract PolygonRollupBase is uint32 networkID, address _gasTokenAddress, uint32 _gasTokenNetwork - ) public pure returns (bytes memory) { + ) public view returns (bytes memory) { // Check the ecrecover, as a sanity check, to not allow invalid transactions bytes memory bytesToSign = abi.encodePacked( - BASE_INITIALIZE_TX_BRIDGE, + FIRST_BASE_INITIALIZE_TX_BRIDGE, + bridgeAddress, + SECOND_BASE_INITIALIZE_TX_BRIDGE, abi.encodeCall( IPolygonZkEVMBridgeV2.initialize, ( diff --git a/deployment/v2/4_createRollup.ts b/deployment/v2/4_createRollup.ts index 3897c4c01..bb04d4608 100644 --- a/deployment/v2/4_createRollup.ts +++ b/deployment/v2/4_createRollup.ts @@ -130,14 +130,16 @@ async function main() { // Add a new rollup type with timelock const rollupCompatibilityID = 0; - await rollupManagerContract.addNewRollupType( - PolygonZKEVMV2Contract.target, - verifierContract.target, - forkID, - rollupCompatibilityID, - genesis.root, - description - ); + await ( + await rollupManagerContract.addNewRollupType( + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + genesis.root, + description + ) + ).wait(); console.log("#######################\n"); console.log("Added new Rollup Type deployed"); diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index c8e102a3f..079e440b8 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -416,7 +416,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { gasTokenAddress, gasTokenNetwork ); - const txBase = await newZkEVMContract.BASE_INITIALIZE_TX_BRIDGE(); // Check transaction const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); @@ -430,7 +429,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { const rawTx = processorUtils.customRawTxToRawTx(transaction); const tx = ethers.Transaction.from(rawTx); - expect(tx.to).to.be.equal("0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe"); + expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); expect(tx.value).to.be.equal(0); expect(tx.data).to.be.equal(encodedData); expect(tx.gasPrice).to.be.equal(0); diff --git a/test/contractsv2/PolygonRollupManagerUpgrade.test.ts b/test/contractsv2/PolygonRollupManagerUpgrade.test.ts index 9bd827096..3de8e49e2 100644 --- a/test/contractsv2/PolygonRollupManagerUpgrade.test.ts +++ b/test/contractsv2/PolygonRollupManagerUpgrade.test.ts @@ -481,7 +481,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { gasTokenAddress, gasTokenNetwork ); - const txBase = await newZkEVMContract.BASE_INITIALIZE_TX_BRIDGE(); // Check transaction const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); @@ -495,7 +494,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { const rawTx = processorUtils.customRawTxToRawTx(transaction); const tx = ethers.Transaction.from(rawTx); - expect(tx.to).to.be.equal("0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe"); + expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); expect(tx.value).to.be.equal(0); expect(tx.data).to.be.equal(encodedData); expect(tx.gasPrice).to.be.equal(0); @@ -1015,7 +1014,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { gasTokenAddress, gasTokenNetwork ); - const txBase = await newZkEVMContract.BASE_INITIALIZE_TX_BRIDGE(); // Check transaction const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); @@ -1029,7 +1027,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { const rawTx = processorUtils.customRawTxToRawTx(transaction); const tx = ethers.Transaction.from(rawTx); - expect(tx.to).to.be.equal("0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe"); + expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); expect(tx.value).to.be.equal(0); expect(tx.data).to.be.equal(encodedData); expect(tx.gasPrice).to.be.equal(0); From 231e6dd9875f8d55b1b40927c121644a560272a0 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 14 Nov 2023 11:28:45 +0300 Subject: [PATCH 087/230] fix docker --- .../PolygonRollupManagerMockInternalTest.sol | 73 +++++ deployment/v2/3_deployContracts.ts | 5 +- docker/Dockerfile.geth | 2 +- docker/docker-compose.geth.yml | 38 +-- docker/scripts/v2/hardhat.example.paris | 258 ++++++++++++++++++ 5 files changed, 355 insertions(+), 21 deletions(-) create mode 100644 contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol create mode 100644 docker/scripts/v2/hardhat.example.paris diff --git a/contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol b/contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol new file mode 100644 index 000000000..3f4ff93fa --- /dev/null +++ b/contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.20; +import "../PolygonRollupManager.sol"; + +/** + * PolygonRollupManager Test + */ +contract PolygonRollupManagerMockInternalTest is PolygonRollupManager { + /** + * @param _globalExitRootManager Global exit root manager address + * @param _pol MATIC token address + * @param _bridgeAddress Bridge address + */ + constructor( + IPolygonZkEVMGlobalExitRoot _globalExitRootManager, + IERC20Upgradeable _pol, + IPolygonZkEVMBridge _bridgeAddress + ) PolygonRollupManager(_globalExitRootManager, _pol, _bridgeAddress) {} + + function initializeMock( + address trustedAggregator, + uint64 _pendingStateTimeout, + uint64 _trustedAggregatorTimeout, + address admin, + address timelock, + address emergencyCouncil + ) external reinitializer(2) { + pendingStateTimeout = _pendingStateTimeout; + trustedAggregatorTimeout = _trustedAggregatorTimeout; + + // Constant deployment variables + _batchFee = 0.1 ether; // 0.1 Matic + verifyBatchTimeTarget = 30 minutes; + multiplierBatchFee = 1002; + + // Initialize OZ contracts + __AccessControl_init(); + + // setup roles + + // trusted aggregator role + _setupRole(_TRUSTED_AGGREGATOR_ROLE, trustedAggregator); + + // Timelock roles + _setupRole(DEFAULT_ADMIN_ROLE, timelock); + _setupRole(_ADD_ROLLUP_TYPE_ROLE, timelock); + _setupRole(_ADD_EXISTING_ROLLUP_ROLE, timelock); + + // Even this role can only update to an already added verifier/consensus + // Could break the compatibility of them, changing the virtual state + // review + _setupRole(_UPDATE_ROLLUP_ROLE, timelock); + + // Admin roles + _setupRole(_OBSOLETE_ROLLUP_TYPE_ROLE, admin); + _setupRole(_CREATE_ROLLUP_ROLE, admin); + _setupRole(_STOP_EMERGENCY_ROLE, admin); + _setupRole(_TWEAK_PARAMETERS_ROLE, admin); + _setRoleAdmin(_TRUSTED_AGGREGATOR_ROLE, _TRUSTED_AGGREGATOR_ROLE_ADMIN); + _setupRole(_TRUSTED_AGGREGATOR_ROLE_ADMIN, admin); + + // review Could be another address?¿ + _setupRole(_SET_FEE_ROLE, admin); + + // Emergency council roles + _setRoleAdmin(_EMERGENCY_COUNCIL_ROLE, _EMERGENCY_COUNCIL_ADMIN); + _setupRole(_EMERGENCY_COUNCIL_ROLE, emergencyCouncil); + _setupRole(_EMERGENCY_COUNCIL_ADMIN, emergencyCouncil); + + // Since it's mock, use admin for everything + _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); + } +} diff --git a/deployment/v2/3_deployContracts.ts b/deployment/v2/3_deployContracts.ts index 124a66a01..281af296e 100644 --- a/deployment/v2/3_deployContracts.ts +++ b/deployment/v2/3_deployContracts.ts @@ -405,7 +405,10 @@ async function main() { console.log("timelockContract:", timelockContract.target); console.log("emergencyCouncilAddress:", emergencyCouncilAddress); - const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManagerMock", deployer); + const PolygonRollupManagerFactory = await ethers.getContractFactory( + "PolygonRollupManagerMockInternalTest", + deployer + ); let polygonRollupManagerContract: any; let deploymentBlockNumber; diff --git a/docker/Dockerfile.geth b/docker/Dockerfile.geth index b56e960ec..4788debaa 100644 --- a/docker/Dockerfile.geth +++ b/docker/Dockerfile.geth @@ -1,4 +1,4 @@ -FROM ethereum/client-go +FROM ethereum/client-go:v1.12.0 EXPOSE 8545 diff --git a/docker/docker-compose.geth.yml b/docker/docker-compose.geth.yml index 04d7c33f7..53c3bd8a1 100644 --- a/docker/docker-compose.geth.yml +++ b/docker/docker-compose.geth.yml @@ -1,21 +1,21 @@ version: "3.3" services: - geth: - image: ethereum/client-go - environment: - - DEV_PERIOD - ports: - - "8545:8545" - volumes: - - ./gethData/geth_data:/geth_data - entrypoint: - - geth - - --rpc.allow-unprotected-txs - - --http - - --http.addr - - "0.0.0.0" - - --dev - - --dev.period - - $DEV_PERIOD - - --datadir - - /geth_data + geth: + image: ethereum/client-go:v1.12.0 + environment: + - DEV_PERIOD + ports: + - "8545:8545" + volumes: + - ./gethData/geth_data:/geth_data + entrypoint: + - geth + - --rpc.allow-unprotected-txs + - --http + - --http.addr + - "0.0.0.0" + - --dev + - --dev.period + - $DEV_PERIOD + - --datadir + - /geth_data diff --git a/docker/scripts/v2/hardhat.example.paris b/docker/scripts/v2/hardhat.example.paris new file mode 100644 index 000000000..41037f816 --- /dev/null +++ b/docker/scripts/v2/hardhat.example.paris @@ -0,0 +1,258 @@ +import "dotenv/config"; +import "@nomicfoundation/hardhat-toolbox"; +import "@openzeppelin/hardhat-upgrades"; +import "hardhat-dependency-compiler"; + +import {HardhatUserConfig} from "hardhat/config"; + +const DEFAULT_MNEMONIC = "test test test test test test test test test test test junk"; + +/* + * You need to export an object to set up your config + * Go to https://hardhat.org/config/ to learn more + */ + +/** + * @type import('hardhat/config').HardhatUserConfig + */ + +const config: HardhatUserConfig = { + dependencyCompiler: { + paths: [ + "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol", + "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol", + "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol", + ], // , + // keep: true + }, + solidity: { + compilers: [ + { + version: "0.8.17", + settings: { + optimizer: { + enabled: true, + runs: 999999, + }, + }, + }, + { + version: "0.8.20", + settings: { + optimizer: { + enabled: true, + runs: 999999, + }, + evmVersion: "paris", + }, + }, + { + version: "0.6.11", + settings: { + optimizer: { + enabled: true, + runs: 999999, + }, + }, + }, + { + version: "0.5.12", + settings: { + optimizer: { + enabled: true, + runs: 999999, + }, + }, + }, + { + version: "0.5.16", + settings: { + optimizer: { + enabled: true, + runs: 999999, + }, + }, + }, + ], + overrides: { + "contracts/v2/PolygonRollupManager.sol": { + version: "0.8.20", + settings: { + optimizer: { + enabled: true, + runs: 99, + }, + evmVersion: "paris", + }, // try yul optimizer + }, + "contracts/v2/PolygonZkEVMBridgeV2.sol": { + version: "0.8.20", + settings: { + optimizer: { + enabled: true, + runs: 99, + }, + evmVersion: "paris", + }, + }, + "contracts/lib/TokenWrapped.sol": { + version: "0.8.20", + settings: { + optimizer: { + enabled: true, + runs: 9999, // must be the same as bridge, for testing porpuses + }, + evmVersion: "paris", + }, + }, + "contracts/v2/mocks/PolygonRollupManagerMock.sol": { + version: "0.8.20", + settings: { + optimizer: { + enabled: true, + runs: 10, + }, + evmVersion: "paris", + }, // try yul optimizer + }, + // Should have the same optimizations than the RollupManager to verify + "contracts/v2/lib/PolygonTransparentProxy.sol": { + version: "0.8.20", + settings: { + optimizer: { + enabled: true, + runs: 10, + }, + evmVersion: "paris", + }, // try yul optimizer + }, + "contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol": { + version: "0.8.20", + settings: { + optimizer: { + enabled: true, + runs: 10, + }, + evmVersion: "paris", + }, // try yul optimizer + }, + }, + }, + networks: { + mainnet: { + url: process.env.MAINNET_PROVIDER + ? process.env.MAINNET_PROVIDER + : `https://mainnet.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, + }, + ropsten: { + url: process.env.ROPSTEN_PROVIDER + ? process.env.ROPSTEN_PROVIDER + : `https://ropsten.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, + }, + goerli: { + url: process.env.GOERLI_PROVIDER + ? process.env.GOERLI_PROVIDER + : `https://goerli.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, + }, + rinkeby: { + url: process.env.RINKEBY_PROVIDER + ? process.env.RINKEBY_PROVIDER + : `https://rinkeby.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, + }, + localhost: { + url: "http://127.0.0.1:8545", + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, + }, + hardhat: { + initialDate: "0", + //allowUnlimitedContractSize: true, + initialBaseFeePerGas: 0, + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, + }, + polygonZKEVMTestnet: { + url: "https://rpc.public.zkevm-test.net", + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, + }, + polygonZKEVMMainnet: { + url: "https://zkevm-rpc.com", + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, + }, + }, + gasReporter: { + enabled: !!process.env.REPORT_GAS, + outputFile: process.env.REPORT_GAS_FILE ? "./gas_report.md" : undefined, + noColors: !!process.env.REPORT_GAS_FILE, + }, + etherscan: { + apiKey: { + polygonZKEVMTestnet: `${process.env.ETHERSCAN_ZKEVM_API_KEY}`, + polygonZKEVMMainnet: `${process.env.ETHERSCAN_ZKEVM_API_KEY}`, + goerli: `${process.env.ETHERSCAN_API_KEY}`, + mainnet: `${process.env.ETHERSCAN_API_KEY}`, + }, + customChains: [ + { + network: "polygonZKEVMMainnet", + chainId: 1101, + urls: { + apiURL: "https://api-zkevm.polygonscan.com/api", + browserURL: "https://zkevm.polygonscan.com/", + }, + }, + { + network: "polygonZKEVMTestnet", + chainId: 1442, + urls: { + apiURL: "https://api-testnet-zkevm.polygonscan.com/api", + browserURL: "https://testnet-zkevm.polygonscan.com/", + }, + }, + ], + }, +}; + +export default config; From f7acb59afb69be035b3b81d520924ed4736b5e54 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Fri, 17 Nov 2023 11:05:40 +0300 Subject: [PATCH 088/230] fix metadata --- contracts/v2/PolygonRollupManager.sol | 14 +- contracts/v2/PolygonZkEVMBridgeV2.sol | 27 ++- contracts/v2/PolygonZkEVMGlobalExitRootV2.sol | 2 +- .../dataComittee/PolygonDataComittee.sol | 2 +- .../v2/consensus/zkEVM/PolygonZkEVMV2.sol | 2 +- .../zkEVM/PolygonZkEVMV2Existent.sol | 2 +- .../v2/interfaces/IPolygonRollupBase.sol | 1 - .../v2/interfaces/IPolygonZkEVMBridgeV2.sol | 7 +- contracts/v2/lib/PolygonRollupBase.sol | 194 ++++++++++++++---- deployment/v2/3_deployContracts.ts | 1 - hardhat.config.ts | 4 +- test/contractsv2/BridgeV2.test.ts | 6 +- test/contractsv2/PolygonRollupManager.test.ts | 14 +- 13 files changed, 199 insertions(+), 77 deletions(-) diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index 06c4ca5a3..11db707f4 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -14,11 +14,11 @@ import "./lib/PolygonAccessControlUpgradeable.sol"; import "./lib/LegacyZKEVMStateVariables.sol"; import "./consensus/zkEVM/PolygonZkEVMV2Existent.sol"; -// PolygonL2Manager, ?¿ TODO +// review Possible renaming to PolygonL2Manager /** * Contract responsible for managing the exit roots across multiple Rollups */ -contract PolygonRollupManager is +contract PolygonRollupManager is PolygonAccessControlUpgradeable, EmergencyManager, LegacyZKEVMStateVariables, @@ -247,8 +247,7 @@ contract PolygonRollupManager is uint32 rollupTypeID, address rollupAddress, uint64 chainID, - address gasTokenAddress, - uint32 gasTokenNetwork + address gasTokenAddress ); /** @@ -550,7 +549,7 @@ contract PolygonRollupManager is * @param admin Admin of the new created rollup * @param sequencer Sequencer of the new created rollup * @param gasTokenAddress Indicates the token address that will be used to pay gas fees in the new rollup - * @param gasTokenNetwork Indicates the native network of the token address + * Note if a wrapped token of the bridge is used, the original network and address of this wrapped will be used instead * @param sequencerURL Sequencer URL of the new created rollup * @param networkName Network name of the new created rollup */ @@ -560,7 +559,6 @@ contract PolygonRollupManager is address admin, address sequencer, address gasTokenAddress, - uint32 gasTokenNetwork, string memory sequencerURL, string memory networkName ) external onlyRole(_CREATE_ROLLUP_ROLE) { @@ -612,8 +610,7 @@ contract PolygonRollupManager is rollupTypeID, rollupAddress, chainID, - gasTokenAddress, - gasTokenNetwork + gasTokenAddress ); // Initialize new rollup @@ -622,7 +619,6 @@ contract PolygonRollupManager is sequencer, rollupID, gasTokenAddress, - gasTokenNetwork, sequencerURL, networkName ); diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index c7c713e1a..b3bf7319b 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -12,8 +12,7 @@ import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20Metadat import "../lib/EmergencyManager.sol"; import "../lib/GlobalExitRootLib.sol"; -// contract PolygonBridge is DepositContractV2, EmergencyManager, IPolygonBridge { -// TODO +// review Possible renaming to PolygonBridge /** * PolygonZkEVMBridge that will be deployed on both networks Ethereum and Polygon zkEVM * Contract responsible to manage the token interactions with other networks @@ -83,6 +82,9 @@ contract PolygonZkEVMBridgeV2 is // Native address uint32 public gasTokenNetwork; + // Gas token metadata + bytes public gasTokenMetadata; + // WETH address TokenWrapped public WETHToken; @@ -100,7 +102,8 @@ contract PolygonZkEVMBridgeV2 is address _gasTokenAddress, uint32 _gasTokenNetwork, IBasePolygonZkEVMGlobalExitRoot _globalExitRootManager, - address _polygonRollupManager + address _polygonRollupManager, + bytes memory _gasTokenMetadata ) external virtual initializer { networkID = _networkID; globalExitRootManager = _globalExitRootManager; @@ -113,10 +116,13 @@ contract PolygonZkEVMBridgeV2 is revert GasTokenNetworkMustBeZeroOnEther(); } // WETHToken, gasTokenAddress and gasTokenNetwork will be 0 + // gasTokenMetadata will be empty } else { // Gas token will be an erc20 gasTokenAddress = _gasTokenAddress; gasTokenNetwork = _gasTokenNetwork; + gasTokenMetadata = _gasTokenMetadata; + WETHToken = (new TokenWrapped){salt: bytes32(0)}( "Wrapped Ether", "WETH", @@ -210,6 +216,7 @@ contract PolygonZkEVMBridgeV2 is // Set gas token parameters originNetwork = gasTokenNetwork; originTokenAddress = gasTokenAddress; + metadata = gasTokenMetadata; } else { // Check msg.value is 0 if tokens are bridged if (msg.value != 0) { @@ -223,6 +230,7 @@ contract PolygonZkEVMBridgeV2 is TokenWrapped(token).burn(msg.sender, amount); // Both origin network and originTokenAddress will be 0 + // Metadata will be empty } else { TokenInformation memory tokenInfo = wrappedTokenToTokenInfo[ token @@ -260,14 +268,13 @@ contract PolygonZkEVMBridgeV2 is originTokenAddress = token; originNetwork = networkID; - - // Encode metadata - metadata = abi.encode( - _safeName(token), - _safeSymbol(token), - _safeDecimals(token) - ); } + // Encode metadata + metadata = abi.encode( + _safeName(token), + _safeSymbol(token), + _safeDecimals(token) + ); } } diff --git a/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol b/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol index cf1adcc40..6977f8949 100644 --- a/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol +++ b/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol @@ -4,7 +4,7 @@ pragma solidity 0.8.20; import "../interfaces/IPolygonZkEVMGlobalExitRoot.sol"; import "../lib/GlobalExitRootLib.sol"; -// TODO contract PolygonGlobalExitRootManager is IPolygonGlobalExitRootManager { +/// review Possible renaming to PolygonGlobalExitRootManager /** * Contract responsible for managing the exit roots across multiple networks diff --git a/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol b/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol index fa739e8a3..95ddf98f0 100644 --- a/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol +++ b/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol @@ -53,7 +53,7 @@ contract PolygonDataComittee is PolygonRollupBase, IPolygonDataComittee { constructor( IPolygonZkEVMGlobalExitRoot _globalExitRootManager, IERC20Upgradeable _pol, - IPolygonZkEVMBridge _bridgeAddress, + IPolygonZkEVMBridgeV2 _bridgeAddress, PolygonRollupManager _rollupManager, ICDKDataCommittee _dataCommittee ) diff --git a/contracts/v2/consensus/zkEVM/PolygonZkEVMV2.sol b/contracts/v2/consensus/zkEVM/PolygonZkEVMV2.sol index aa095d347..f026514ec 100644 --- a/contracts/v2/consensus/zkEVM/PolygonZkEVMV2.sol +++ b/contracts/v2/consensus/zkEVM/PolygonZkEVMV2.sol @@ -21,7 +21,7 @@ contract PolygonZkEVMV2 is PolygonRollupBase { constructor( IPolygonZkEVMGlobalExitRoot _globalExitRootManager, IERC20Upgradeable _pol, - IPolygonZkEVMBridge _bridgeAddress, + IPolygonZkEVMBridgeV2 _bridgeAddress, PolygonRollupManager _rollupManager ) PolygonRollupBase( diff --git a/contracts/v2/consensus/zkEVM/PolygonZkEVMV2Existent.sol b/contracts/v2/consensus/zkEVM/PolygonZkEVMV2Existent.sol index 412465f86..adb2be166 100644 --- a/contracts/v2/consensus/zkEVM/PolygonZkEVMV2Existent.sol +++ b/contracts/v2/consensus/zkEVM/PolygonZkEVMV2Existent.sol @@ -21,7 +21,7 @@ contract PolygonZkEVMV2Existent is PolygonRollupBase { constructor( IPolygonZkEVMGlobalExitRoot _globalExitRootManager, IERC20Upgradeable _pol, - IPolygonZkEVMBridge _bridgeAddress, + IPolygonZkEVMBridgeV2 _bridgeAddress, PolygonRollupManager _rollupManager ) PolygonRollupBase( diff --git a/contracts/v2/interfaces/IPolygonRollupBase.sol b/contracts/v2/interfaces/IPolygonRollupBase.sol index 612688ffb..cd95f9a9b 100644 --- a/contracts/v2/interfaces/IPolygonRollupBase.sol +++ b/contracts/v2/interfaces/IPolygonRollupBase.sol @@ -8,7 +8,6 @@ interface IPolygonRollupBase { address sequencer, uint32 networkID, address gasTokenAddress, - uint32 gasTokenNetwork, string memory sequencerURL, string memory _networkName ) external; diff --git a/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol b/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol index 31923c738..95ddb2316 100644 --- a/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol +++ b/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol @@ -84,6 +84,10 @@ interface IPolygonZkEVMBridgeV2 { */ error GasTokenNetworkMustBeZeroOnEther(); + function wrappedTokenToTokenInfo( + address destinationAddress + ) external returns (uint32, address); + function updateGlobalExitRoot() external; function activateEmergencyState() external; @@ -147,6 +151,7 @@ interface IPolygonZkEVMBridgeV2 { address _gasTokenAddress, uint32 _gasTokenNetwork, IBasePolygonZkEVMGlobalExitRoot _globalExitRootManager, - address _polygonRollupManager + address _polygonRollupManager, + bytes memory _gasTokenMetadata ) external; } diff --git a/contracts/v2/lib/PolygonRollupBase.sol b/contracts/v2/lib/PolygonRollupBase.sol index d096416bd..736c111d1 100644 --- a/contracts/v2/lib/PolygonRollupBase.sol +++ b/contracts/v2/lib/PolygonRollupBase.sol @@ -4,12 +4,14 @@ pragma solidity ^0.8.20; import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; import "../../interfaces/IPolygonZkEVMGlobalExitRoot.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; -import "../../interfaces/IPolygonZkEVMBridge.sol"; import "../../interfaces/IPolygonZkEVMErrors.sol"; import "../interfaces/IPolygonZkEVMV2Errors.sol"; import "../PolygonRollupManager.sol"; import "../interfaces/IPolygonRollupBase.sol"; import "../interfaces/IPolygonZkEVMBridgeV2.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol"; + +// review Possible renaming to PolygonL2Base /** * Contract responsible for managing the states and the updates of L2 network. @@ -19,7 +21,6 @@ import "../interfaces/IPolygonZkEVMBridgeV2.sol"; * 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. */ -// PolygonL2Base rename TODO contract PolygonRollupBase is Initializable, IPolygonZkEVMV2Errors, @@ -96,13 +97,33 @@ contract PolygonRollupBase is // This should be a protection against someone that tries to generate huge chunk of invalid batches, and we can't prove otherwise before the pending timeout expires uint64 internal constant _MAX_VERIFY_BATCHES = 1000; - // List rlp: 1 listLenLen "0xf8" (0xf7 + 1), + listLen 1 "0xc3" - // 1 nonce "0x80" + 1 gasPrice "0x80" + 5 gasLimit "0x8401c9c380" + 21 to ("0x94" + bridgeAddress") - // + 1 value "0x80" + 1 stringLenLen "0xb8" (0xb7 + 1) + stringLen 1 "0xa4" + 164 bytes data ( signature 4 bytes + 5parameters*32bytes) = 195 bytes (0xc3) - bytes public constant FIRST_BASE_INITIALIZE_TX_BRIDGE = - hex"f8c380808401c9c38094"; + // In order to encode the initialize transaction of the bridge there's have a constant part and the metadata which is variable + // Note the total transaction will be constrained to 65535 to avoid attacks and simplify the implementation + + // List rlp: 1 listLenLen "0xf9" (0xf7 + 2), + listLen 2 (32 bytes + txData bytes) (do not accept more than 65535 bytes) + + // TxData bytes: 164 bytes data ( signature 4 bytes + 5 parameters*32bytes + + // (abi encoded metadata: 32 bytes position + 32 bytes len + 32 bytes position name + 32 bytes length name + 32 bytes position Symbol + 32 bytes length Symbol + //+ 32 bytes decimal )) min 7*32 bytes = + // = 164 bytes + 224 bytes = 388 (0x0184) minimum + // Extra data: nameLen padded to 32 bytes + symbol len padded to 32 bytes + + // Constant bytes: 1 nonce "0x80" + 1 gasPrice "0x80" + 5 gasLimit "0x8401c9c380" (30M gas) + // + 21 to ("0x94" + bridgeAddress") + 1 value "0x80" + 1 stringLenLen "0xb9" (0xb7 + 2) + + // stringLen (0x0184 + nameLen padded to 32 bytes + symbol len padded to 32 bytes) + txData bytes = 32 bytes + txData bytes + uint16 public constant INITIALIZE_TX_CONSTANT_BYTES = 32; - bytes public constant SECOND_BASE_INITIALIZE_TX_BRIDGE = hex"80b8a4"; + // First byte of the initialize bridge tx, indicates a list with a lengt of 2 bytes + // Since the minimum constant bytes will be: 388 (tx data min) + 32 (tx parameters) = 420 (0x1a4) will always take 2 bytes to express the lenght of the rlp + // Note that more than 2 bytes of list len is not supported, since it's constrained to 65535 + uint8 public constant INITIALIZE_TX_BRIDGE_LIST_LEN_LEN = 0xf9; + + // Tx parameters until the bridge address + bytes public constant INITIALIZE_TX_BRIDGE_PARAMS = hex"80808401c9c38094"; + + // Tx parameters after the bridge address + bytes public constant INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS = + hex"80b9"; // Signature used to initialize the bridge @@ -117,7 +138,7 @@ contract PolygonRollupBase is bytes32 public constant SIGNATURE_INITIALIZE_TX_S = 0x000000000000000000000000000000000000000000000000000000005ca1ab1e; - // S parameter of the initialize signature + // Effective percentage of the initalize transaction bytes1 public constant INITIALIZE_TX_EFFECTIVE_PERCENTAGE = 0xFF; // Global Exit Root address L2 @@ -134,7 +155,7 @@ contract PolygonRollupBase is IPolygonZkEVMGlobalExitRoot public immutable globalExitRootManager; // PolygonZkEVM Bridge Address - IPolygonZkEVMBridge public immutable bridgeAddress; + IPolygonZkEVMBridgeV2 public immutable bridgeAddress; // Rollup manager PolygonRollupManager public immutable rollupManager; @@ -254,7 +275,7 @@ contract PolygonRollupBase is constructor( IPolygonZkEVMGlobalExitRoot _globalExitRootManager, IERC20Upgradeable _pol, - IPolygonZkEVMBridge _bridgeAddress, + IPolygonZkEVMBridgeV2 _bridgeAddress, PolygonRollupManager _rollupManager ) { globalExitRootManager = _globalExitRootManager; @@ -267,8 +288,8 @@ contract PolygonRollupBase is * @param _admin Admin address * @param sequencer Trusted sequencer address * @param networkID Indicates the network identifier that will be used in the bridge - * @param _gasTokenAddress Indicates the token address that will be used to pay gas fees in the new rollup - * @param _gasTokenNetwork Indicates the native network of the token address + * @param _gasTokenAddress Indicates the token address in mainnet that will be used as a gas token + * Note if a wrapped token of the bridge is used, the original network and address of this wrapped are used instead * @param sequencerURL Trusted sequencer URL * @param _networkName L2 network name */ @@ -277,7 +298,6 @@ contract PolygonRollupBase is address sequencer, uint32 networkID, address _gasTokenAddress, - uint32 _gasTokenNetwork, string memory sequencerURL, string memory _networkName ) external virtual onlyRollupManager initializer { @@ -290,24 +310,40 @@ contract PolygonRollupBase is // Constant deployment variables forceBatchTimeout = 5 days; - if (_gasTokenAddress == address(0)) { - // gas token will be ether - if (_gasTokenNetwork != 0) { - revert GasTokenNetworkMustBeZeroOnEther(); - } - } + bytes memory gasTokenMetadata; + + if (_gasTokenAddress != address(0)) { + // Ask for token metadata, the same way is enconded in the bridge + // Note that this funciton will revert if the token is not in this network + gasTokenMetadata = abi.encode( + _safeName(_gasTokenAddress), + _safeSymbol(_gasTokenAddress), + _safeDecimals(_gasTokenAddress) + ); - // set gas token variables - gasTokenAddress = _gasTokenAddress; - gasTokenNetwork = _gasTokenNetwork; + // Check gas token address on the bridge + ( + uint32 originWrappedNetwork, + address originWrappedAddress + ) = bridgeAddress.wrappedTokenToTokenInfo(_gasTokenAddress); + if (originWrappedNetwork != 0) { + // It's a wrapped token, get the wrapped parameters + gasTokenAddress = originWrappedAddress; + gasTokenNetwork = originWrappedNetwork; + } else { + // gasTokenNetwork will be mainnet, for instance 0 + gasTokenAddress = _gasTokenAddress; + } + } // Sequence transaction to initilize the bridge // Calculate transaction to initialize the bridge bytes memory transaction = generateInitializeTransaction( networkID, - _gasTokenAddress, - _gasTokenNetwork + gasTokenAddress, + gasTokenNetwork, + gasTokenMetadata ); bytes32 currentTransactionsHash = keccak256(transaction); @@ -801,23 +837,37 @@ contract PolygonRollupBase is function generateInitializeTransaction( uint32 networkID, address _gasTokenAddress, - uint32 _gasTokenNetwork + uint32 _gasTokenNetwork, + bytes memory _gasTokenMetadata ) public view returns (bytes memory) { // Check the ecrecover, as a sanity check, to not allow invalid transactions + + bytes memory initializeBrigeData = abi.encodeCall( + IPolygonZkEVMBridgeV2.initialize, + ( + networkID, + _gasTokenAddress, + _gasTokenNetwork, + GLOBAL_EXIT_ROOT_MANAGER_L2, + address(0), // Rollup manager on L2 does not exist + _gasTokenMetadata + ) + ); + + // Do not support more than 65535 bytes + if (initializeBrigeData.length >= type(uint16).max) { + revert(); + } + uint16 initializeBrigeDataLen = uint16(initializeBrigeData.length); + bytes memory bytesToSign = abi.encodePacked( - FIRST_BASE_INITIALIZE_TX_BRIDGE, + INITIALIZE_TX_BRIDGE_LIST_LEN_LEN, + uint16(initializeBrigeData.length) + INITIALIZE_TX_CONSTANT_BYTES, // do not support more than 65535 bytes + INITIALIZE_TX_BRIDGE_PARAMS, bridgeAddress, - SECOND_BASE_INITIALIZE_TX_BRIDGE, - abi.encodeCall( - IPolygonZkEVMBridgeV2.initialize, - ( - networkID, - _gasTokenAddress, - _gasTokenNetwork, - GLOBAL_EXIT_ROOT_MANAGER_L2, - address(0) // Rollup manager on L2 does not exist - ) - ) + INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS, + initializeBrigeDataLen, + initializeBrigeData ); // Sanity check that the ecrecover will work @@ -843,4 +893,72 @@ contract PolygonRollupBase is return transaction; } + + // Helpers to safely get the metadata from a token, inspired by https://github.com/traderjoe-xyz/joe-core/blob/main/contracts/MasterChefJoeV3.sol#L55-L95 + + /** + * @notice Provides a safe ERC20.symbol version which returns 'NO_SYMBOL' as fallback string + * @param token The address of the ERC-20 token contract + */ + function _safeSymbol(address token) internal view returns (string memory) { + (bool success, bytes memory data) = address(token).staticcall( + abi.encodeCall(IERC20MetadataUpgradeable.symbol, ()) + ); + return success ? _returnDataToString(data) : "NO_SYMBOL"; + } + + /** + * @notice Provides a safe ERC20.name version which returns 'NO_NAME' as fallback string. + * @param token The address of the ERC-20 token contract. + */ + function _safeName(address token) internal view returns (string memory) { + (bool success, bytes memory data) = address(token).staticcall( + abi.encodeCall(IERC20MetadataUpgradeable.name, ()) + ); + return success ? _returnDataToString(data) : "NO_NAME"; + } + + /** + * @notice Provides a safe ERC20.decimals version which returns '18' as fallback value. + * Note Tokens with (decimals > 255) are not supported + * @param token The address of the ERC-20 token contract + */ + function _safeDecimals(address token) internal view returns (uint8) { + (bool success, bytes memory data) = address(token).staticcall( + abi.encodeCall(IERC20MetadataUpgradeable.decimals, ()) + ); + return success && data.length == 32 ? abi.decode(data, (uint8)) : 18; + } + + /** + * @notice Function to convert returned data to string + * returns 'NOT_VALID_ENCODING' as fallback value. + * @param data returned data + */ + function _returnDataToString( + bytes memory data + ) internal pure returns (string memory) { + if (data.length >= 64) { + return abi.decode(data, (string)); + } else if (data.length == 32) { + // Since the strings on bytes32 are encoded left-right, check the first zero in the data + uint256 nonZeroBytes; + while (nonZeroBytes < 32 && data[nonZeroBytes] != 0) { + nonZeroBytes++; + } + + // If the first one is 0, we do not handle the encoding + if (nonZeroBytes == 0) { + return "NOT_VALID_ENCODING"; + } + // Create a byte array with nonZeroBytes length + bytes memory bytesArray = new bytes(nonZeroBytes); + for (uint256 i = 0; i < nonZeroBytes; i++) { + bytesArray[i] = data[i]; + } + return string(bytesArray); + } else { + return "NOT_VALID_ENCODING"; + } + } } diff --git a/deployment/v2/3_deployContracts.ts b/deployment/v2/3_deployContracts.ts index 281af296e..17f04bb97 100644 --- a/deployment/v2/3_deployContracts.ts +++ b/deployment/v2/3_deployContracts.ts @@ -335,7 +335,6 @@ async function main() { *Deployment Global exit root manager */ let polygonZkEVMGlobalExitRoot; - // TODO review should use V2?¿ const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRootV2", deployer); if (!ongoingDeployment.polygonZkEVMGlobalExitRoot) { for (let i = 0; i < attemptsDeployProxy; i++) { diff --git a/hardhat.config.ts b/hardhat.config.ts index b96b9293d..01386d93c 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -90,7 +90,7 @@ const config: HardhatUserConfig = { settings: { optimizer: { enabled: true, - runs: 9999, + runs: 999, }, evmVersion: "shanghai", }, @@ -100,7 +100,7 @@ const config: HardhatUserConfig = { settings: { optimizer: { enabled: true, - runs: 9999, // must be the same as bridge, for testing porpuses + runs: 999, // must be the same as bridge, for testing porpuses }, evmVersion: "shanghai", }, diff --git a/test/contractsv2/BridgeV2.test.ts b/test/contractsv2/BridgeV2.test.ts index 19fcba5e4..ceb490d39 100644 --- a/test/contractsv2/BridgeV2.test.ts +++ b/test/contractsv2/BridgeV2.test.ts @@ -46,7 +46,6 @@ describe("PolygonZkEVMBridge Contract", () => { ["string", "string", "uint8"], [tokenName, tokenSymbol, decimals] ); - const networkIDMainnet = 0; const networkIDRollup = 1; @@ -77,7 +76,8 @@ describe("PolygonZkEVMBridge Contract", () => { ethers.ZeroAddress, // zero for ether ethers.ZeroAddress, // zero for ether polygonZkEVMGlobalExitRoot.target, - rollupManager.address + rollupManager.address, + "0x" ); // deploy token @@ -855,7 +855,7 @@ describe("PolygonZkEVMBridge Contract", () => { const merkleTreeMainnet = new MerkleTreeBridge(height); // Imporant calcualte leaf with origin token address no wrapped token address const originTokenAddress = tokenAddress; - const metadataMainnet = "0x"; // since the token does not belong to this network + const metadataMainnet = metadata; // since the token does not belong to this network const metadataHashMainnet = ethers.solidityPackedKeccak256(["bytes"], [metadataMainnet]); const leafValueMainnet = getLeafValue( diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index 079e440b8..ca36f8c0f 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -154,7 +154,8 @@ describe("Polygon ZK-EVM TestnetV2", () => { ethers.ZeroAddress, // zero for ether ethers.ZeroAddress, // zero for ether polygonZkEVMGlobalExitRoot.target, - rollupManagerContract.target + rollupManagerContract.target, + "0x" ); // Initialize Mock @@ -312,7 +313,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { admin.address, trustedSequencer.address, gasTokenAddress, - gasTokenNetwork, urlSequencer, networkName ) @@ -328,7 +328,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { admin.address, trustedSequencer.address, gasTokenAddress, - gasTokenNetwork, urlSequencer, networkName ) @@ -349,7 +348,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { admin.address, trustedSequencer.address, gasTokenAddress, - gasTokenNetwork, urlSequencer, networkName ) @@ -374,13 +372,12 @@ describe("Polygon ZK-EVM TestnetV2", () => { admin.address, trustedSequencer.address, gasTokenAddress, - gasTokenNetwork, urlSequencer, networkName ) ) .to.emit(rollupManagerContract, "CreateNewRollup") - .withArgs(newCreatedRollupID, newRollupTypeID, newZKEVMAddress, chainID, gasTokenAddress, gasTokenNetwork) + .withArgs(newCreatedRollupID, newRollupTypeID, newZKEVMAddress, chainID, gasTokenAddress) .to.emit(newZkEVMContract, "SequenceBatches") .withArgs(newSequencedBatch) .to.emit(rollupManagerContract, "OnSequenceBatches") @@ -405,7 +402,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { admin.address, trustedSequencer.address, gasTokenAddress, - gasTokenNetwork, urlSequencer, networkName ) @@ -414,7 +410,8 @@ describe("Polygon ZK-EVM TestnetV2", () => { const transaction = await newZkEVMContract.generateInitializeTransaction( newCreatedRollupID, gasTokenAddress, - gasTokenNetwork + gasTokenNetwork, + "0x" // empty metadata ); // Check transaction @@ -425,6 +422,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { gasTokenNetwork, globalExitRootL2Address, ethers.ZeroAddress, + "0x", // empty metadata ]); const rawTx = processorUtils.customRawTxToRawTx(transaction); From 0b8906e3c2f73741ac53d75bc7afcad6f8980e90 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Fri, 17 Nov 2023 11:49:52 +0300 Subject: [PATCH 089/230] test --- test/contractsv2/PolygonRollupManager.test.ts | 547 ++++++++++++++++++ 1 file changed, 547 insertions(+) diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index ca36f8c0f..32e85fd78 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -733,6 +733,553 @@ describe("Polygon ZK-EVM TestnetV2", () => { expect(await newWrappedToken.totalSupply()).to.be.equal(amount); }); + it("should check full flow with gas Token", async () => { + const urlSequencer = "http://zkevm-json-rpc:8123"; + const chainID = 1000; + const networkName = "zkevm"; + const forkID = 0; + const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001"; + const rollupCompatibilityID = 0; + const descirption = "zkevm test"; + // Native token will be ether + + // deploy pol + const gasTokenName = "GAS Token"; + const gasTokenSymbol = "GTOKEN"; + const gasTokenDecimals = 18; + + const gasTokenInitialBalance = ethers.parseEther("20000000"); + + const gasMetadataToken = ethers.AbiCoder.defaultAbiCoder().encode( + ["string", "string", "uint8"], + [gasTokenName, gasTokenSymbol, gasTokenDecimals] + ); + const tokenFactory = await ethers.getContractFactory("ERC20PermitMock"); + const gasTokenContract = await tokenFactory.deploy( + gasTokenName, + gasTokenSymbol, + deployer.address, + gasTokenInitialBalance + ); + + const gasTokenAddress = gasTokenContract.target; + const gasTokenNetwork = 0; + + // In order to create a new rollup type, create an implementation of the contract + + // Create zkEVM implementation + const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMV2"); + const PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy( + polygonZkEVMGlobalExitRoot.target, + polTokenContract.target, + polygonZkEVMBridgeContract.target, + rollupManagerContract.target + ); + await PolygonZKEVMV2Contract.waitForDeployment(); + + // Try to add a new rollup type + await expect( + rollupManagerContract.addNewRollupType( + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + genesisRandom, + descirption + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); + + // Add a new rollup type with timelock + const newRollupTypeID = 1; + await expect( + rollupManagerContract + .connect(timelock) + .addNewRollupType( + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + genesisRandom, + descirption + ) + ) + .to.emit(rollupManagerContract, "AddNewRollupType") + .withArgs( + newRollupTypeID, + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + genesisRandom, + descirption + ); + + // assert new rollup type + const createdRollupType = await rollupManagerContract.rollupTypeMap(newRollupTypeID); + + const expectedRollupType = [ + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + false, + genesisRandom, + ]; + expect(createdRollupType).to.be.deep.equal(expectedRollupType); + + // obsoleteRollupType, take snapshot for it + const snapshot = await takeSnapshot(); + + await expect(rollupManagerContract.obsoleteRollupType(newRollupTypeID)).to.be.revertedWithCustomError( + rollupManagerContract, + "AddressDoNotHaveRequiredRole" + ); + + await expect(rollupManagerContract.connect(admin).obsoleteRollupType(newRollupTypeID)) + .to.emit(rollupManagerContract, "ObsoleteRollupType") + .withArgs(newRollupTypeID); + + expect([ + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + true, + genesisRandom, + ]).to.be.deep.equal(await rollupManagerContract.rollupTypeMap(newRollupTypeID)); + await snapshot.restore(); + + expect(expectedRollupType).to.be.deep.equal(await rollupManagerContract.rollupTypeMap(newRollupTypeID)); + // Create a + + // Only admin can create new zkEVMs + await expect( + rollupManagerContract.createNewRollup( + newRollupTypeID, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + urlSequencer, + networkName + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); + + // UNexisting rollupType + await expect( + rollupManagerContract + .connect(admin) + .createNewRollup( + 0, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + urlSequencer, + networkName + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeDoesNotExist"); + + // Obsolete rollup type and test that fails + const snapshot2 = await takeSnapshot(); + await expect(rollupManagerContract.connect(admin).obsoleteRollupType(newRollupTypeID)) + .to.emit(rollupManagerContract, "ObsoleteRollupType") + .withArgs(newRollupTypeID); + + await expect( + rollupManagerContract + .connect(admin) + .createNewRollup( + newRollupTypeID, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + urlSequencer, + networkName + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeObsolete"); + await snapshot2.restore(); + + const newCreatedRollupID = 1; + const newZKEVMAddress = ethers.getCreateAddress({ + from: rollupManagerContract.target as string, + nonce: 1, + }); + + const newZkEVMContract = PolygonZKEVMV2Factory.attach(newZKEVMAddress) as PolygonZkEVMV2; + const newSequencedBatch = 1; + + await expect( + rollupManagerContract + .connect(admin) + .createNewRollup( + newRollupTypeID, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + urlSequencer, + networkName + ) + ) + .to.emit(rollupManagerContract, "CreateNewRollup") + .withArgs(newCreatedRollupID, newRollupTypeID, newZKEVMAddress, chainID, gasTokenAddress) + .to.emit(newZkEVMContract, "SequenceBatches") + .withArgs(newSequencedBatch) + .to.emit(rollupManagerContract, "OnSequenceBatches") + .withArgs(newCreatedRollupID, newSequencedBatch); + + // Assert new rollup created + const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; + expect(await newZkEVMContract.admin()).to.be.equal(admin.address); + expect(await newZkEVMContract.trustedSequencer()).to.be.equal(trustedSequencer.address); + expect(await newZkEVMContract.trustedSequencerURL()).to.be.equal(urlSequencer); + expect(await newZkEVMContract.networkName()).to.be.equal(networkName); + expect(await newZkEVMContract.forceBatchTimeout()).to.be.equal(FORCE_BATCH_TIMEOUT); + expect(await newZkEVMContract.lastTimestamp()).to.be.equal(timestampCreatedRollup); + + // Cannot create 2 chains with the same chainID + await expect( + rollupManagerContract + .connect(admin) + .createNewRollup( + newRollupTypeID, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + urlSequencer, + networkName + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "ChainIDAlreadyExist"); + + const transaction = await newZkEVMContract.generateInitializeTransaction( + newCreatedRollupID, + gasTokenAddress, + gasTokenNetwork, + gasMetadataToken // empty metadata + ); + + // Check transaction + const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + const encodedData = bridgeL2Factory.interface.encodeFunctionData("initialize", [ + newCreatedRollupID, + gasTokenAddress, + gasTokenNetwork, + globalExitRootL2Address, + ethers.ZeroAddress, + gasMetadataToken, // empty metadata + ]); + + const rawTx = processorUtils.customRawTxToRawTx(transaction); + const tx = ethers.Transaction.from(rawTx); + expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); + expect(tx.value).to.be.equal(0); + expect(tx.data).to.be.equal(encodedData); + expect(tx.gasPrice).to.be.equal(0); + expect(tx.gasLimit).to.be.equal(30000000); + expect(tx.nonce).to.be.equal(0); + expect(tx.chainId).to.be.equal(0); + + const expectedAccInputHash = calculateAccInputHash( + ethers.ZeroHash, + ethers.keccak256(transaction), + ethers.ZeroHash, + timestampCreatedRollup, + trustedSequencer.address + ); + // calcualte accINputHash + expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash); + + // Check mapping on rollup Manager + const rollupData = await rollupManagerContract.rollupIDToRollupData(newCreatedRollupID); + expect(rollupData.rollupContract).to.be.equal(newZKEVMAddress); + expect(rollupData.chainID).to.be.equal(chainID); + expect(rollupData.verifier).to.be.equal(verifierContract.target); + expect(rollupData.forkID).to.be.equal(forkID); + expect(rollupData.lastLocalExitRoot).to.be.equal(ethers.ZeroHash); + expect(rollupData.lastBatchSequenced).to.be.equal(newSequencedBatch); + expect(rollupData.lastVerifiedBatch).to.be.equal(0); + expect(rollupData.lastPendingState).to.be.equal(0); + expect(rollupData.lastPendingStateConsolidated).to.be.equal(0); + expect(rollupData.lastVerifiedBatchBeforeUpgrade).to.be.equal(0); + expect(rollupData.rollupTypeID).to.be.equal(1); + expect(rollupData.rollupCompatibilityID).to.be.equal(0); + + const sequencedBatchData = await rollupManagerContract.getRollupSequencedBatches( + newCreatedRollupID, + newSequencedBatch + ); + + expect(sequencedBatchData.accInputHash).to.be.equal(expectedAccInputHash); + expect(sequencedBatchData.sequencedTimestamp).to.be.equal(timestampCreatedRollup); + expect(sequencedBatchData.previousLastBatchSequenced).to.be.equal(0); + + // try verify batches + const l2txData = "0x123456"; + const maticAmount = await rollupManagerContract.getBatchFee(); + const currentTimestamp = (await ethers.provider.getBlock("latest"))?.timestamp; + + const sequence = { + transactions: l2txData, + globalExitRoot: ethers.ZeroHash, + timestamp: currentTimestamp, + minForcedTimestamp: 0, + } as BatchDataStruct; + + // Approve tokens + await expect(polTokenContract.connect(trustedSequencer).approve(newZkEVMContract.target, maticAmount)).to.emit( + polTokenContract, + "Approval" + ); + + // Sequence Batches + await expect(newZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address)) + .to.emit(newZkEVMContract, "SequenceBatches") + .withArgs(newSequencedBatch + 1); + + const expectedAccInputHash2 = calculateAccInputHash( + expectedAccInputHash, + ethers.keccak256(l2txData), + ethers.ZeroHash, + currentTimestamp, + trustedSequencer.address + ); + // calcualte accINputHash + expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash2); + + // Create a new local exit root mocking some bridge + const tokenName = "Matic Token"; + const tokenSymbol = "MATIC"; + const decimals = 18; + const metadataToken = ethers.AbiCoder.defaultAbiCoder().encode( + ["string", "string", "uint8"], + [tokenName, tokenSymbol, decimals] + ); + + const originNetwork = networkIDRollup; + const tokenAddress = ethers.getAddress(ethers.hexlify(ethers.randomBytes(20))); + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDMainnet; + const destinationAddress = beneficiary.address; + const metadata = metadataToken; // since we are inserting in the exit root can be anything + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + // compute root merkle tree in Js + const height = 32; + const merkleTreezkEVM = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + + // Add 2 leafs + merkleTreezkEVM.add(leafValue); + merkleTreezkEVM.add(leafValue); + + // check merkle root with SC + const rootzkEVM = merkleTreezkEVM.getRoot(); + + // trustedAggregator forge the batch + const pendingState = 0; + const newLocalExitRoot = rootzkEVM; + const newStateRoot = "0x0000000000000000000000000000000000000000000000000000000000000123"; + const newVerifiedBatch = newSequencedBatch + 1; + const zkProofFFlonk = new Array(24).fill(ethers.ZeroHash); + const currentVerifiedBatch = 0; + + const initialAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); + await expect( + rollupManagerContract + .connect(deployer) + .verifyBatchesTrustedAggregator( + newCreatedRollupID, + pendingState, + currentVerifiedBatch, + newVerifiedBatch, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); + + await expect( + rollupManagerContract + .connect(trustedAggregator) + .verifyBatchesTrustedAggregator( + newCreatedRollupID, + pendingState, + currentVerifiedBatch, + currentVerifiedBatch, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "FinalNumBatchBelowLastVerifiedBatch"); + + await expect( + rollupManagerContract + .connect(trustedAggregator) + .verifyBatchesTrustedAggregator( + newCreatedRollupID, + pendingState, + currentVerifiedBatch, + 3, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "NewAccInputHashDoesNotExist"); + + // Calcualte new globalExitroot + const merkleTreeRollups = new MerkleTreeBridge(height); + merkleTreeRollups.add(newLocalExitRoot); + const rootRollups = merkleTreeRollups.getRoot(); + + // Verify batch + await expect( + rollupManagerContract + .connect(trustedAggregator) + .verifyBatchesTrustedAggregator( + newCreatedRollupID, + pendingState, + currentVerifiedBatch, + newVerifiedBatch, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ) + .to.emit(rollupManagerContract, "VerifyBatchesTrustedAggregator") + .withArgs(newCreatedRollupID, newVerifiedBatch, newStateRoot, newLocalExitRoot, trustedAggregator.address) + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .withArgs(ethers.ZeroHash, rootRollups); + + const finalAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); + + expect(finalAggregatorMatic).to.equal(initialAggregatorMatic + maticAmount); + + // Assert global exit root + expect(await polygonZkEVMGlobalExitRoot.lastRollupExitRoot()).to.be.equal(rootRollups); + expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(ethers.ZeroHash); + + expect(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()).to.be.equal( + calculateGlobalExitRoot(ethers.ZeroHash, rootRollups) + ); + + const indexLeaf = 0; + const proofZkEVM = merkleTreezkEVM.getProofTreeByIndex(indexLeaf); + const proofRollups = merkleTreeRollups.getProofTreeByIndex(indexLeaf); + + // verify merkle proof + expect(verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM)).to.be.equal(true); + expect(verifyMerkleProof(rootzkEVM, proofRollups, indexLeaf, rootRollups)).to.be.equal(true); + + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM) + ).to.be.equal(true); + + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(newLocalExitRoot, proofRollups, indexLeaf, rootRollups) + ).to.be.equal(true); + + // claim + const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); + // create2 parameters + const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]); + const minimalBytecodeProxy = tokenWrappedFactory.bytecode; + const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]); + const precalculateWrappedErc20 = await ethers.getCreate2Address( + polygonZkEVMBridgeContract.target as string, + salt, + hashInitCode + ); + const newWrappedToken = tokenWrappedFactory.attach(precalculateWrappedErc20) as TokenWrapped; + + // Use precalculatedWrapperAddress and check if matches + expect( + await polygonZkEVMBridgeContract.precalculatedWrapperAddress( + networkIDRollup, + tokenAddress, + tokenName, + tokenSymbol, + decimals + ) + ).to.be.equal(precalculateWrappedErc20); + + // index leaf is 0 bc, does not have mainnet flag, and it's rollup 0 on leaf 0 + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofZkEVM, + proofRollups, + indexLeaf, + ethers.ZeroHash, + rootRollups, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ) + .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") + .withArgs(indexLeaf, originNetwork, tokenAddress, destinationAddress, amount) + .to.emit(polygonZkEVMBridgeContract, "NewWrappedToken") + .withArgs(originNetwork, tokenAddress, precalculateWrappedErc20, metadata) + .to.emit(newWrappedToken, "Transfer") + .withArgs(ethers.ZeroAddress, beneficiary.address, amount); + + // Assert maps created + const newTokenInfo = await polygonZkEVMBridgeContract.wrappedTokenToTokenInfo(precalculateWrappedErc20); + + expect(newTokenInfo.originNetwork).to.be.equal(networkIDRollup); + expect(newTokenInfo.originTokenAddress).to.be.equal(tokenAddress); + expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( + precalculateWrappedErc20 + ); + expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( + precalculateWrappedErc20 + ); + + expect(await polygonZkEVMBridgeContract.tokenInfoToWrappedToken(salt)).to.be.equal(precalculateWrappedErc20); + + // Check the wrapper info + expect(await newWrappedToken.name()).to.be.equal(tokenName); + expect(await newWrappedToken.symbol()).to.be.equal(tokenSymbol); + expect(await newWrappedToken.decimals()).to.be.equal(decimals); + + // Can't claim because nullifier + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofZkEVM, + proofRollups, + indexLeaf, + ethers.ZeroHash, + rootRollups, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AlreadyClaimed"); + + // Check new token + expect(await newWrappedToken.totalSupply()).to.be.equal(amount); + }); + it("Should test obsolete rollup", async () => { const forkID = 0; const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001"; From 7d0db689b2ee61965eb01087d743805a2e01f002 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Fri, 17 Nov 2023 16:59:19 +0300 Subject: [PATCH 090/230] add etrog support --- contracts/v2/PolygonZkEVMBridgeV2.sol | 7 +- contracts/v2/PolygonZkEVMGlobalExitRootV2.sol | 50 +- .../dataComittee/PolygonDataComitteeEtrog.sol | 239 +++++ .../v2/consensus/zkEVM/PolygonZkEVMVEtrog.sol | 34 + .../IPolygonZkEVMGlobalExitRootV2.sol | 10 + contracts/v2/lib/PolygonRollupBase.sol | 6 +- contracts/v2/lib/PolygonRollupBaseEtrog.sol | 944 ++++++++++++++++++ .../PolygonZkEVMGlobalExitRootBaseStorage.sol | 21 + .../PolygonRollupManagerUpgrade.test.ts | 25 +- 9 files changed, 1301 insertions(+), 35 deletions(-) create mode 100644 contracts/v2/consensus/dataComittee/PolygonDataComitteeEtrog.sol create mode 100644 contracts/v2/consensus/zkEVM/PolygonZkEVMVEtrog.sol create mode 100644 contracts/v2/interfaces/IPolygonZkEVMGlobalExitRootV2.sol create mode 100644 contracts/v2/lib/PolygonRollupBaseEtrog.sol create mode 100644 contracts/v2/lib/PolygonZkEVMGlobalExitRootBaseStorage.sol diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index b3bf7319b..0d20ad9c3 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -754,8 +754,9 @@ contract PolygonZkEVMBridgeV2 is bytes32 rollupExitRoot, bytes32 leafValue ) internal { - // Check timestamp where the global exit root was set - uint256 timestampGlobalExitRoot = globalExitRootManager + // Check blockhash where the global exit root was set + // Note that previusly timestamps were setted, since in only checked if != 0 it's ok + uint256 blockHashGlobalExitRoot = globalExitRootManager .globalExitRootMap( GlobalExitRootLib.calculateGlobalExitRoot( mainnetExitRoot, @@ -764,7 +765,7 @@ contract PolygonZkEVMBridgeV2 is ); // check that this global exit root exist - if (timestampGlobalExitRoot == 0) { + if (blockHashGlobalExitRoot == 0) { revert GlobalExitRootInvalid(); } diff --git a/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol b/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol index 6977f8949..a7f3dc601 100644 --- a/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol +++ b/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol @@ -1,30 +1,27 @@ // SPDX-License-Identifier: AGPL-3.0 + pragma solidity 0.8.20; -import "../interfaces/IPolygonZkEVMGlobalExitRoot.sol"; +import "./interfaces/IPolygonZkEVMGlobalExitRootV2.sol"; +import "./lib/PolygonZkEVMGlobalExitRootBaseStorage.sol"; import "../lib/GlobalExitRootLib.sol"; +import "./lib/DepositContractBase.sol"; /// review Possible renaming to PolygonGlobalExitRootManager - +// TODO tests /** * Contract responsible for managing the exit roots across multiple networks */ -contract PolygonZkEVMGlobalExitRootV2 is IPolygonZkEVMGlobalExitRoot { +contract PolygonZkEVMGlobalExitRootV2 is + PolygonZkEVMGlobalExitRootBaseStorage, + DepositContractBase +{ // PolygonZkEVMBridge address address public immutable bridgeAddress; // Rollup manager contract address address public immutable rollupManager; - // Rollup root, contains all exit roots of all rollups - bytes32 public lastRollupExitRoot; - - // Mainnet exit root, this will be updated every time a deposit is made in mainnet - bytes32 public lastMainnetExitRoot; - - // Store every global exit root: Root --> timestamp - mapping(bytes32 => uint256) public globalExitRootMap; - /** * @dev Emitted when the global exit root is updated */ @@ -66,9 +63,22 @@ contract PolygonZkEVMGlobalExitRootV2 is IPolygonZkEVMGlobalExitRoot { cacheLastRollupExitRoot ); - // If it already exists, do not modify the timestamp + // If it already exists, do not modify the blockhash if (globalExitRootMap[newGlobalExitRoot] == 0) { - globalExitRootMap[newGlobalExitRoot] = block.timestamp; + uint256 lastBlockHash = uint256(blockhash(block.number - 1)); + globalExitRootMap[newGlobalExitRoot] = lastBlockHash; + + // save new leaf in L1InfoTree + _addLeaf( + keccak256( + abi.encodePacked( + newGlobalExitRoot, + lastBlockHash, + uint64(block.timestamp) + ) + ) + ); + emit UpdateGlobalExitRoot( cacheLastMainnetExitRoot, cacheLastRollupExitRoot @@ -86,4 +96,16 @@ contract PolygonZkEVMGlobalExitRootV2 is IPolygonZkEVMGlobalExitRoot { lastRollupExitRoot ); } + + /** + * @notice Computes and returns the merkle root of the L1InfoTree + */ + function getRoot() + public + view + override(DepositContractBase, IPolygonZkEVMGlobalExitRootV2) + returns (bytes32) + { + return super.getRoot(); + } } diff --git a/contracts/v2/consensus/dataComittee/PolygonDataComitteeEtrog.sol b/contracts/v2/consensus/dataComittee/PolygonDataComitteeEtrog.sol new file mode 100644 index 000000000..b940218cd --- /dev/null +++ b/contracts/v2/consensus/dataComittee/PolygonDataComitteeEtrog.sol @@ -0,0 +1,239 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity ^0.8.20; + +import "../../lib/PolygonRollupBaseEtrog.sol"; +import "../../interfaces/ICDKDataCommittee.sol"; +import "../../interfaces/IPolygonDataComittee.sol"; + +/** + * 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. + */ +contract PolygonDataComitteeEtrog is + PolygonRollupBaseEtrog, + IPolygonDataComittee +{ + using SafeERC20Upgradeable for IERC20Upgradeable; + + /** + * @notice Struct which will be used to call sequenceBatches + * @param transactionsHash keccak256 hash of the L2 ethereum transactions EIP-155 or pre-EIP-155 with signature: + * EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data, chainid, 0, 0,) || v || r || s + * pre-EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data) || v || r || s + * @param forcedGlobalExitRoot Global exit root, empty when sequencing a non forced batch + * @param forcedTimestamp Minimum timestamp of the force batch data, empty when sequencing a non forced batch + * @param forcedBlockHashL1 blockHash snapshot of the force batch data, empty when sequencing a non forced batch + */ + struct ValidiumBatchData { + bytes32 transactionsHash; + bytes32 forcedGlobalExitRoot; + uint64 forcedTimestamp; + uint64 forcedBlockHashL1; + } + + // CDK Data Committee Address + ICDKDataCommittee public immutable dataCommittee; + + // Indicates if sequence with data avialability is allowed + // This allow the sequencer to post the data and skip the Data comittee + bool public isSequenceWithDataAvailabilityAllowed; + + /** + * @dev Emitted when switch the ability to sequence with data availability + */ + event SwitchSequenceWithDataAvailability(); + + /** + * @param _globalExitRootManager Global exit root manager address + * @param _pol POL token address + * @param _bridgeAddress Bridge address + * @param _rollupManager Global exit root manager address + */ + constructor( + IPolygonZkEVMGlobalExitRootV2 _globalExitRootManager, + IERC20Upgradeable _pol, + IPolygonZkEVMBridgeV2 _bridgeAddress, + PolygonRollupManager _rollupManager, + ICDKDataCommittee _dataCommittee + ) + PolygonRollupBaseEtrog( + _globalExitRootManager, + _pol, + _bridgeAddress, + _rollupManager + ) + { + dataCommittee = _dataCommittee; + } + + ///////////////////////////////////// + // Sequence/Verify batches functions + //////////////////////////////////// + + function sequenceBatches( + BatchData[] calldata batches, + address l2Coinbase + ) public override { + if (!isSequenceWithDataAvailabilityAllowed) { + revert SequenceWithDataAvailabilityNotAllowed(); + } + super.sequenceBatches(batches, l2Coinbase); + } + + /** + * @notice Allows a sequencer to send multiple batches + * @param batches Struct array which holds the necessary data to append new batches to the sequence + * @param l2Coinbase Address that will receive the fees from L2 + * @param dataAvailabilityMessage 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 + */ + function sequenceBatchesDataCommittee( + ValidiumBatchData[] calldata batches, + address l2Coinbase, + bytes calldata dataAvailabilityMessage + ) external onlyTrustedSequencer { + uint256 batchesNum = batches.length; + if (batchesNum == 0) { + revert SequenceZeroBatches(); + } + + if (batchesNum > _MAX_VERIFY_BATCHES) { + revert ExceedMaxVerifyBatches(); + } + + // Update global exit root if there are new deposits + bridgeAddress.updateGlobalExitRoot(); + + // Get global batch variables + bytes32 l1InfoRoot = globalExitRootManager.getRoot(); + uint64 currentTimestamp = uint64(block.timestamp); + + // Store storage variables in memory, to save gas, because will be overrided multiple times + uint64 currentLastForceBatchSequenced = lastForceBatchSequenced; + bytes32 currentAccInputHash = lastAccInputHash; + + // Store in a temporal variable, for avoid access again the storage slot + uint64 initLastForceBatchSequenced = currentLastForceBatchSequenced; + + for (uint256 i = 0; i < batchesNum; i++) { + // Load current sequence + ValidiumBatchData memory currentBatch = batches[i]; + + // Check if it's a forced batch + if (currentBatch.forcedTimestamp > 0) { + currentLastForceBatchSequenced++; + + // Check forced data matches + bytes32 hashedForcedBatchData = keccak256( + abi.encodePacked( + currentBatch.transactionsHash, + currentBatch.forcedGlobalExitRoot, + currentBatch.forcedTimestamp, + currentBatch.forcedBlockHashL1 + ) + ); + + if ( + hashedForcedBatchData != + forcedBatches[currentLastForceBatchSequenced] + ) { + revert ForcedDataDoesNotMatch(); + } + + // Calculate next accumulated input hash + currentAccInputHash = keccak256( + abi.encodePacked( + currentAccInputHash, + currentBatch.transactionsHash, + currentBatch.forcedGlobalExitRoot, + currentBatch.forcedTimestamp, + l2Coinbase, + currentBatch.forcedBlockHashL1 + ) + ); + + // Delete forceBatch data since won't be used anymore + delete forcedBatches[currentLastForceBatchSequenced]; + } else { + // Note that forcedGlobalExitRoot and forcedBlockHashL1 remain unused and unchecked in this path + // The synchronizer should be aware of that + + // Calculate next accumulated input hash + currentAccInputHash = keccak256( + abi.encodePacked( + currentAccInputHash, + currentBatch.transactionsHash, + l1InfoRoot, + currentTimestamp, + l2Coinbase, + bytes32(0) + ) + ); + } + } + + // Sanity check, should be unreachable + if (currentLastForceBatchSequenced > lastForceBatch) { + revert ForceBatchesOverflow(); + } + + // Store back the storage variables + lastAccInputHash = currentAccInputHash; + + uint256 nonForcedBatchesSequenced = batchesNum; + + // Validate that the data committee has signed the accInputHash for this sequence + dataCommittee.verifySignatures( + currentAccInputHash, + dataAvailabilityMessage + ); + + // Check if there has been forced batches + if (currentLastForceBatchSequenced != initLastForceBatchSequenced) { + uint64 forcedBatchesSequenced = currentLastForceBatchSequenced - + initLastForceBatchSequenced; + // substract forced batches + nonForcedBatchesSequenced -= forcedBatchesSequenced; + + pol.safeTransfer( // Transfer pol for every forced batch submitted + address(rollupManager), + calculatePolPerForceBatch() * (forcedBatchesSequenced) + ); + + // Store new last force batch sequenced + lastForceBatchSequenced = currentLastForceBatchSequenced; + } + + // Pay collateral for every non-forced batch submitted + pol.safeTransferFrom( + msg.sender, + address(rollupManager), + rollupManager.getBatchFee() * nonForcedBatchesSequenced + ); + + uint64 currentBatchSequenced = rollupManager.onSequenceBatches( + uint64(batchesNum), + currentAccInputHash + ); + + emit SequenceBatches(currentBatchSequenced); + } + + ////////////////// + // admin functions + ////////////////// + + /** + * @notice Allow the admin to turn on the force batches + * This action is not reversible + */ + function switchSequenceWithDataAvailability() external onlyAdmin { + isSequenceWithDataAvailabilityAllowed = !isSequenceWithDataAvailabilityAllowed; + emit SwitchSequenceWithDataAvailability(); + } +} diff --git a/contracts/v2/consensus/zkEVM/PolygonZkEVMVEtrog.sol b/contracts/v2/consensus/zkEVM/PolygonZkEVMVEtrog.sol new file mode 100644 index 000000000..a477873da --- /dev/null +++ b/contracts/v2/consensus/zkEVM/PolygonZkEVMVEtrog.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity ^0.8.20; + +import "../../lib/PolygonRollupBaseEtrog.sol"; + +/** + * 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. + */ +contract PolygonZkEVMVEtrog is PolygonRollupBaseEtrog { + /** + * @param _globalExitRootManager Global exit root manager address + * @param _pol POL token address + * @param _bridgeAddress Bridge address + * @param _rollupManager Global exit root manager address + */ + constructor( + IPolygonZkEVMGlobalExitRootV2 _globalExitRootManager, + IERC20Upgradeable _pol, + IPolygonZkEVMBridgeV2 _bridgeAddress, + PolygonRollupManager _rollupManager + ) + PolygonRollupBaseEtrog( + _globalExitRootManager, + _pol, + _bridgeAddress, + _rollupManager + ) + {} +} diff --git a/contracts/v2/interfaces/IPolygonZkEVMGlobalExitRootV2.sol b/contracts/v2/interfaces/IPolygonZkEVMGlobalExitRootV2.sol new file mode 100644 index 000000000..3c7b69683 --- /dev/null +++ b/contracts/v2/interfaces/IPolygonZkEVMGlobalExitRootV2.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: AGPL-3.0 + +pragma solidity ^0.8.20; +import "../../interfaces/IBasePolygonZkEVMGlobalExitRoot.sol"; + +interface IPolygonZkEVMGlobalExitRootV2 is IBasePolygonZkEVMGlobalExitRoot { + function getLastGlobalExitRoot() external view returns (bytes32); + + function getRoot() external view returns (bytes32); +} diff --git a/contracts/v2/lib/PolygonRollupBase.sol b/contracts/v2/lib/PolygonRollupBase.sol index 736c111d1..2f2afafde 100644 --- a/contracts/v2/lib/PolygonRollupBase.sol +++ b/contracts/v2/lib/PolygonRollupBase.sol @@ -855,14 +855,14 @@ contract PolygonRollupBase is ); // Do not support more than 65535 bytes - if (initializeBrigeData.length >= type(uint16).max) { + if (initializeBrigeData.length > type(uint16).max) { revert(); } uint16 initializeBrigeDataLen = uint16(initializeBrigeData.length); bytes memory bytesToSign = abi.encodePacked( INITIALIZE_TX_BRIDGE_LIST_LEN_LEN, - uint16(initializeBrigeData.length) + INITIALIZE_TX_CONSTANT_BYTES, // do not support more than 65535 bytes + uint16(initializeBrigeData.length) + INITIALIZE_TX_CONSTANT_BYTES, // do not support more than 2 bytes of length, intended to revert on overflow INITIALIZE_TX_BRIDGE_PARAMS, bridgeAddress, INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS, @@ -871,7 +871,7 @@ contract PolygonRollupBase is ); // Sanity check that the ecrecover will work - // should never happen giving a valid signature, "break" ecrecover + // Should never happen that giving a valid signature, ecrecover "breaks" address signer = ecrecover( keccak256(bytesToSign), SIGNATURE_INITIALIZE_TX_V, diff --git a/contracts/v2/lib/PolygonRollupBaseEtrog.sol b/contracts/v2/lib/PolygonRollupBaseEtrog.sol new file mode 100644 index 000000000..211860571 --- /dev/null +++ b/contracts/v2/lib/PolygonRollupBaseEtrog.sol @@ -0,0 +1,944 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; +import "../interfaces/IPolygonZkEVMGlobalExitRootV2.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "../../interfaces/IPolygonZkEVMErrors.sol"; +import "../interfaces/IPolygonZkEVMV2Errors.sol"; +import "../PolygonRollupManager.sol"; +import "../interfaces/IPolygonRollupBase.sol"; +import "../interfaces/IPolygonZkEVMBridgeV2.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol"; + +// review Possible renaming to PolygonL2BaseEtrog + +/** + * 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. + */ +contract PolygonRollupBaseEtrog is + Initializable, + IPolygonZkEVMV2Errors, + IPolygonRollupBase +{ + // Interface cehcks renaming + using SafeERC20Upgradeable for IERC20Upgradeable; + + /** + * @notice Struct which will be used to call sequenceBatches + * @param transactions L2 ethereum transactions EIP-155 or pre-EIP-155 with signature: + * EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data, chainid, 0, 0,) || v || r || s + * pre-EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data) || v || r || s + * @param forcedGlobalExitRoot Global exit root, empty when sequencing a non forced batch + * @param forcedTimestamp Minimum timestamp of the force batch data, empty when sequencing a non forced batch + * @param forcedBlockHashL1 blockHash snapshot of the force batch data, empty when sequencing a non forced batch + */ + struct BatchData { + bytes transactions; + bytes32 forcedGlobalExitRoot; + uint64 forcedTimestamp; + bytes32 forcedBlockHashL1; + } + + /** + * @notice Struct which will be stored for every batch sequence + * @param accInputHash Hash chain that contains all the information to process a batch: + * keccak256(bytes32 oldAccInputHash, keccak256(bytes transactions), bytes32 globalExitRoot, uint64 timestamp, address seqAddress) + * @param sequencedTimestamp Sequenced timestamp + * @param previousLastBatchSequenced Previous last batch sequenced before the current one, this is used to properly calculate the fees + */ + struct SequencedBatchData { + bytes32 accInputHash; + uint64 sequencedTimestamp; + uint64 previousLastBatchSequenced; + } + + // Max transactions bytes that can be added in a single batch + // Max keccaks circuit = (2**23 / 155286) * 44 = 2376 + // Bytes per keccak = 136 + // Minimum Static keccaks batch = 2 + // Max bytes allowed = (2376 - 2) * 136 = 322864 bytes - 1 byte padding + // Rounded to 300000 bytes + // In order to process the transaction, the data is approximately hashed twice for ecrecover: + // 300000 bytes / 2 = 150000 bytes + // Since geth pool currently only accepts at maximum 128kb transactions: + // https://github.com/ethereum/go-ethereum/blob/master/core/txpool/txpool.go#L54 + // We will limit this length to be compliant with the geth restrictions since our node will use it + // We let 8kb as a sanity margin + uint256 internal constant _MAX_TRANSACTIONS_BYTE_LENGTH = 120000; + + // Max force batch transaction length + // This is used to avoid huge calldata attacks, where the attacker call force batches from another contract + uint256 internal constant _MAX_FORCE_BATCH_BYTE_LENGTH = 5000; + + // If a sequenced batch exceeds this timeout without being verified, the contract enters in emergency mode + uint64 internal constant _HALT_AGGREGATION_TIMEOUT = 1 weeks; + + // Maximum batches that can be verified in one call. It depends on our current metrics + // This should be a protection against someone that tries to generate huge chunk of invalid batches, and we can't prove otherwise before the pending timeout expires + uint64 internal constant _MAX_VERIFY_BATCHES = 1000; + + // In order to encode the initialize transaction of the bridge there's have a constant part and the metadata which is variable + // Note the total transaction will be constrained to 65535 to avoid attacks and simplify the implementation + + // List rlp: 1 listLenLen "0xf9" (0xf7 + 2), + listLen 2 (32 bytes + txData bytes) (do not accept more than 65535 bytes) + + // TxData bytes: 164 bytes data ( signature 4 bytes + 5 parameters*32bytes + + // (abi encoded metadata: 32 bytes position + 32 bytes len + 32 bytes position name + 32 bytes length name + 32 bytes position Symbol + 32 bytes length Symbol + //+ 32 bytes decimal )) min 7*32 bytes = + // = 164 bytes + 224 bytes = 388 (0x0184) minimum + // Extra data: nameLen padded to 32 bytes + symbol len padded to 32 bytes + + // Constant bytes: 1 nonce "0x80" + 1 gasPrice "0x80" + 5 gasLimit "0x8401c9c380" (30M gas) + // + 21 to ("0x94" + bridgeAddress") + 1 value "0x80" + 1 stringLenLen "0xb9" (0xb7 + 2) + + // stringLen (0x0184 + nameLen padded to 32 bytes + symbol len padded to 32 bytes) + txData bytes = 32 bytes + txData bytes + uint16 public constant INITIALIZE_TX_CONSTANT_BYTES = 32; + + // First byte of the initialize bridge tx, indicates a list with a lengt of 2 bytes + // Since the minimum constant bytes will be: 388 (tx data min) + 32 (tx parameters) = 420 (0x1a4) will always take 2 bytes to express the lenght of the rlp + // Note that more than 2 bytes of list len is not supported, since it's constrained to 65535 + uint8 public constant INITIALIZE_TX_BRIDGE_LIST_LEN_LEN = 0xf9; + + // Tx parameters until the bridge address + bytes public constant INITIALIZE_TX_BRIDGE_PARAMS = hex"80808401c9c38094"; + + // Tx parameters after the bridge address + bytes public constant INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS = + hex"80b9"; + + // Signature used to initialize the bridge + + // V parameter of the initialize signature + uint8 public constant SIGNATURE_INITIALIZE_TX_V = 27; + + // R parameter of the initialize signature + bytes32 public constant SIGNATURE_INITIALIZE_TX_R = + 0x00000000000000000000000000000000000000000000000000000005ca1ab1e0; + + // S parameter of the initialize signature + bytes32 public constant SIGNATURE_INITIALIZE_TX_S = + 0x000000000000000000000000000000000000000000000000000000005ca1ab1e; + + // Effective percentage of the initalize transaction + bytes1 public constant INITIALIZE_TX_EFFECTIVE_PERCENTAGE = 0xFF; + + // Global Exit Root address L2 + IBasePolygonZkEVMGlobalExitRoot + public constant GLOBAL_EXIT_ROOT_MANAGER_L2 = + IBasePolygonZkEVMGlobalExitRoot( + 0xa40D5f56745a118D0906a34E69aeC8C0Db1cB8fA + ); + + // POL token address + IERC20Upgradeable public immutable pol; + + // Global Exit Root interface + IPolygonZkEVMGlobalExitRootV2 public immutable globalExitRootManager; + + // PolygonZkEVM Bridge Address + IPolygonZkEVMBridgeV2 public immutable bridgeAddress; + + // Rollup manager + PolygonRollupManager public immutable rollupManager; + + // Address that will be able to adjust contract parameters or stop the emergency state + address public admin; + + // This account will be able to accept the admin role + address public pendingAdmin; + + // Trusted sequencer address + address public trustedSequencer; + + // Trusted sequencer URL + string public trustedSequencerURL; + + // L2 network name + string public networkName; + + // Current accumulate input hash + bytes32 public lastAccInputHash; + + // Queue of forced batches with their associated data + // ForceBatchNum --> hashedForcedBatchData + // hashedForcedBatchData: hash containing the necessary information to force a batch: + // keccak256(keccak256(bytes transactions), bytes32 globalExitRoot, unint64 minForcedTimestamp) + mapping(uint64 => bytes32) public forcedBatches; + + // Last sequenced timestamp gap, since this contract could be an upgrade from a non etrog contract + // review if not incaberry contracts are deployed, this might be erased + /// @custom:oz-renamed-from lastTimestamp + uint64 public gapLastTimestamp; + + // Last forced batch + uint64 public lastForceBatch; + + // Last forced batch included in the sequence + uint64 public lastForceBatchSequenced; + + // Force batch timeout + uint64 public forceBatchTimeout; + + // Indicates if forced batches are allowed + bool public isForcedBatchAllowed; + + // Token address that will be used to pay gas fees in this rollup. This variable it's just for read purposes + address public gasTokenAddress; + + // Native network of the token address of the gas tokena address. This variable it's just for read purposes + uint32 public gasTokenNetwork; + + /** + * @dev Emitted when the trusted sequencer sends a new batch of transactions + */ + event SequenceBatches(uint64 indexed numBatch); + + /** + * @dev Emitted when a batch is forced + */ + event ForceBatch( + uint64 indexed forceBatchNum, + bytes32 lastGlobalExitRoot, + address sequencer, + bytes transactions + ); + + /** + * @dev Emitted when forced batches are sequenced by not the trusted sequencer + */ + event SequenceForceBatches(uint64 indexed numBatch); + + /** + * @dev Emitted when a aggregator verifies batches + */ + event VerifyBatches( + uint64 indexed numBatch, + bytes32 stateRoot, + address indexed aggregator + ); + + /** + * @dev Emitted when the admin updates the trusted sequencer address + */ + event SetTrustedSequencer(address newTrustedSequencer); + + /** + * @dev Emitted when the admin updates the sequencer URL + */ + event SetTrustedSequencerURL(string newTrustedSequencerURL); + + /** + * @dev Emitted when the admin update the force batch timeout + */ + event SetForceBatchTimeout(uint64 newforceBatchTimeout); + + /** + * @dev Emitted when activate force batches + */ + event ActivateForceBatches(); + + /** + * @dev Emitted when the admin starts the two-step transfer role setting a new pending admin + */ + event TransferAdminRole(address newPendingAdmin); + + /** + * @dev Emitted when the pending admin accepts the admin role + */ + event AcceptAdminRole(address newAdmin); + + // General parameters that will have in common all networks that deploys rollup manager + + /** + * @param _globalExitRootManager Global exit root manager address + * @param _pol POL token address + * @param _bridgeAddress Bridge address + * @param _rollupManager Global exit root manager address + */ + constructor( + IPolygonZkEVMGlobalExitRootV2 _globalExitRootManager, + IERC20Upgradeable _pol, + IPolygonZkEVMBridgeV2 _bridgeAddress, + PolygonRollupManager _rollupManager + ) { + globalExitRootManager = _globalExitRootManager; + pol = _pol; + bridgeAddress = _bridgeAddress; + rollupManager = _rollupManager; + } + + /** + * @param _admin Admin address + * @param sequencer Trusted sequencer address + * @param networkID Indicates the network identifier that will be used in the bridge + * @param _gasTokenAddress Indicates the token address in mainnet that will be used as a gas token + * Note if a wrapped token of the bridge is used, the original network and address of this wrapped are used instead + * @param sequencerURL Trusted sequencer URL + * @param _networkName L2 network name + */ + function initialize( + address _admin, + address sequencer, + uint32 networkID, + address _gasTokenAddress, + string memory sequencerURL, + string memory _networkName + ) external virtual onlyRollupManager initializer { + admin = _admin; + trustedSequencer = sequencer; + + trustedSequencerURL = sequencerURL; + networkName = _networkName; + + // Constant deployment variables + forceBatchTimeout = 5 days; + + bytes memory gasTokenMetadata; + + if (_gasTokenAddress != address(0)) { + // Ask for token metadata, the same way is enconded in the bridge + // Note that this funciton will revert if the token is not in this network + gasTokenMetadata = abi.encode( + _safeName(_gasTokenAddress), + _safeSymbol(_gasTokenAddress), + _safeDecimals(_gasTokenAddress) + ); + + // Check gas token address on the bridge + ( + uint32 originWrappedNetwork, + address originWrappedAddress + ) = bridgeAddress.wrappedTokenToTokenInfo(_gasTokenAddress); + + if (originWrappedNetwork != 0) { + // It's a wrapped token, get the wrapped parameters + gasTokenAddress = originWrappedAddress; + gasTokenNetwork = originWrappedNetwork; + } else { + // gasTokenNetwork will be mainnet, for instance 0 + gasTokenAddress = _gasTokenAddress; + } + } + // Sequence transaction to initilize the bridge + + // Calculate transaction to initialize the bridge + bytes memory transaction = generateInitializeTransaction( + networkID, + gasTokenAddress, + gasTokenNetwork, + gasTokenMetadata + ); + + bytes32 currentTransactionsHash = keccak256(transaction); + + // should be deterministic for easier deployment + uint64 currentTimestamp = uint64(block.timestamp); + + bytes32 newAccInputHash = keccak256( + abi.encodePacked( + bytes32(0), // Current acc Input hash + currentTransactionsHash, + bytes32(0), // Global exit root + currentTimestamp, + sequencer + ) + ); + lastAccInputHash = newAccInputHash; + + uint64 currentBatchSequenced = rollupManager.onSequenceBatches( + uint64(1), // num total batches + newAccInputHash + ); + + emit SequenceBatches(currentBatchSequenced); + } + + modifier onlyAdmin() { + if (admin != msg.sender) { + revert OnlyAdmin(); + } + _; + } + + modifier onlyTrustedSequencer() { + if (trustedSequencer != msg.sender) { + revert OnlyTrustedSequencer(); + } + _; + } + + modifier isForceBatchActive() { + if (!isForcedBatchAllowed) { + revert ForceBatchNotAllowed(); + } + _; + } + + modifier onlyRollupManager() { + if (address(rollupManager) != msg.sender) { + revert OnlyRollupManager(); + } + _; + } + + ///////////////////////////////////// + // Sequence/Verify batches functions + //////////////////////////////////// + + /** + * @notice Allows a sequencer to send multiple batches + * @param batches Struct array which holds the necessary data to append new batches to the sequence + * @param l2Coinbase Address that will receive the fees from L2 + */ + function sequenceBatches( + BatchData[] calldata batches, + address l2Coinbase + ) public virtual onlyTrustedSequencer { + uint256 batchesNum = batches.length; + if (batchesNum == 0) { + revert SequenceZeroBatches(); + } + + if (batchesNum > _MAX_VERIFY_BATCHES) { + revert ExceedMaxVerifyBatches(); + } + + // Update global exit root if there are new deposits + bridgeAddress.updateGlobalExitRoot(); + + // Get global batch variables + bytes32 l1InfoRoot = globalExitRootManager.getRoot(); + uint64 currentTimestamp = uint64(block.timestamp); + + // Store storage variables in memory, to save gas, because will be overrided multiple times + uint64 currentLastForceBatchSequenced = lastForceBatchSequenced; + bytes32 currentAccInputHash = lastAccInputHash; + + // Store in a temporal variable, for avoid access again the storage slot + uint64 initLastForceBatchSequenced = currentLastForceBatchSequenced; + + for (uint256 i = 0; i < batchesNum; i++) { + // Load current sequence + BatchData memory currentBatch = batches[i]; + + // Store the current transactions hash since can be used more than once for gas saving + bytes32 currentTransactionsHash = keccak256( + currentBatch.transactions + ); + + // Check if it's a forced batch + if (currentBatch.forcedTimestamp > 0) { + currentLastForceBatchSequenced++; + + // Check forced data matches + bytes32 hashedForcedBatchData = keccak256( + abi.encodePacked( + currentTransactionsHash, + currentBatch.forcedGlobalExitRoot, + currentBatch.forcedTimestamp, + currentBatch.forcedBlockHashL1 + ) + ); + + if ( + hashedForcedBatchData != + forcedBatches[currentLastForceBatchSequenced] + ) { + revert ForcedDataDoesNotMatch(); + } + + // Calculate next accumulated input hash + currentAccInputHash = keccak256( + abi.encodePacked( + currentAccInputHash, + currentTransactionsHash, + currentBatch.forcedGlobalExitRoot, + currentBatch.forcedTimestamp, + l2Coinbase, + currentBatch.forcedBlockHashL1 + ) + ); + + // Delete forceBatch data since won't be used anymore + delete forcedBatches[currentLastForceBatchSequenced]; + } else { + // Note that forcedGlobalExitRoot and forcedBlockHashL1 remain unused and unchecked in this path + // The synchronizer should be aware of that + if ( + currentBatch.transactions.length > + _MAX_TRANSACTIONS_BYTE_LENGTH + ) { + revert TransactionsLengthAboveMax(); + } + + // Calculate next accumulated input hash + currentAccInputHash = keccak256( + abi.encodePacked( + currentAccInputHash, + currentTransactionsHash, + l1InfoRoot, + currentTimestamp, + l2Coinbase, + bytes32(0) + ) + ); + } + } + + // Sanity check, should be unreachable + if (currentLastForceBatchSequenced > lastForceBatch) { + revert ForceBatchesOverflow(); + } + + // Store back the storage variables + lastAccInputHash = currentAccInputHash; + + uint256 nonForcedBatchesSequenced = batchesNum; + + // Check if there has been forced batches + if (currentLastForceBatchSequenced != initLastForceBatchSequenced) { + uint64 forcedBatchesSequenced = currentLastForceBatchSequenced - + initLastForceBatchSequenced; + // substract forced batches + nonForcedBatchesSequenced -= forcedBatchesSequenced; + + // Transfer pol for every forced batch submitted + pol.safeTransfer( + address(rollupManager), + calculatePolPerForceBatch() * (forcedBatchesSequenced) + ); + + // Store new last force batch sequenced + lastForceBatchSequenced = currentLastForceBatchSequenced; + } + + // Pay collateral for every non-forced batch submitted + pol.safeTransferFrom( + msg.sender, + address(rollupManager), + rollupManager.getBatchFee() * nonForcedBatchesSequenced + ); + + uint64 currentBatchSequenced = rollupManager.onSequenceBatches( + uint64(batchesNum), + currentAccInputHash + ); + + emit SequenceBatches(currentBatchSequenced); + } + + /** + * @notice Callback on verify batches, can only be called by the rollup manager + * @param lastVerifiedBatch Last verified batch + * @param newStateRoot new state root + * @param aggregator Aggregator address + */ + function onVerifyBatches( + uint64 lastVerifiedBatch, + bytes32 newStateRoot, + address aggregator + ) public virtual override onlyRollupManager { + emit VerifyBatches(lastVerifiedBatch, newStateRoot, aggregator); + } + + //////////////////////////// + // Force batches functions + //////////////////////////// + + /** + * @notice 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 + * @param transactions L2 ethereum transactions EIP-155 or pre-EIP-155 with signature: + * @param polAmount Max amount of pol tokens that the sender is willing to pay + */ + function forceBatch( + bytes calldata transactions, + uint256 polAmount + ) public virtual isForceBatchActive { + // Calculate pol collateral + uint256 polFee = rollupManager.getForcedBatchFee(); + + if (polFee > polAmount) { + revert NotEnoughPOLAmount(); + } + + if (transactions.length > _MAX_FORCE_BATCH_BYTE_LENGTH) { + revert TransactionsLengthAboveMax(); + } + + // keep the pol fees on this contract until forced it's sequenced + pol.safeTransferFrom(msg.sender, address(this), polFee); + + // Get globalExitRoot global exit root + bytes32 lastGlobalExitRoot = globalExitRootManager + .getLastGlobalExitRoot(); + + // Update forcedBatches mapping + lastForceBatch++; + + forcedBatches[lastForceBatch] = keccak256( + abi.encodePacked( + keccak256(transactions), + lastGlobalExitRoot, + uint64(block.timestamp), + blockhash(block.number - 1) + ) + ); + + if (msg.sender == tx.origin) { + // Getting the calldata from an EOA is easy so no need to put the `transactions` in the event + emit ForceBatch(lastForceBatch, lastGlobalExitRoot, msg.sender, ""); + } else { + // Getting internal transaction calldata is complicated (because it requires an archive node) + // Therefore it's worth it to put the `transactions` in the event, which is easy to query + emit ForceBatch( + lastForceBatch, + lastGlobalExitRoot, + msg.sender, + transactions + ); + } + } + + /** + * @notice Allows anyone to sequence forced Batches if the trusted sequencer has not done so in the timeout period + * @param batches Struct array which holds the necessary data to append force batches + */ + function sequenceForceBatches( + BatchData[] calldata batches + ) external virtual isForceBatchActive { + uint256 batchesNum = batches.length; + + if (batchesNum == 0) { + revert SequenceZeroBatches(); + } + + if (batchesNum > _MAX_VERIFY_BATCHES) { + revert ExceedMaxVerifyBatches(); + } + + if ( + uint256(lastForceBatchSequenced) + batchesNum > + uint256(lastForceBatch) + ) { + revert ForceBatchesOverflow(); + } + + // Store storage variables in memory, to save gas, because will be overrided multiple times + uint64 currentLastForceBatchSequenced = lastForceBatchSequenced; + bytes32 currentAccInputHash = lastAccInputHash; + + // Sequence force batches + for (uint256 i = 0; i < batchesNum; i++) { + // Load current sequence + BatchData memory currentBatch = batches[i]; + currentLastForceBatchSequenced++; + + // Store the current transactions hash since it's used more than once for gas saving + bytes32 currentTransactionsHash = keccak256( + currentBatch.transactions + ); + + // Check forced data matches + bytes32 hashedForcedBatchData = keccak256( + abi.encodePacked( + currentTransactionsHash, + currentBatch.forcedGlobalExitRoot, + currentBatch.forcedTimestamp, + currentBatch.forcedBlockHashL1 + ) + ); + + if ( + hashedForcedBatchData != + forcedBatches[currentLastForceBatchSequenced] + ) { + revert ForcedDataDoesNotMatch(); + } + + // Delete forceBatch data since won't be used anymore + delete forcedBatches[currentLastForceBatchSequenced]; + + if (i == (batchesNum - 1)) { + // The last batch will have the most restrictive timestamp + if ( + currentBatch.forcedTimestamp + forceBatchTimeout > + block.timestamp + ) { + revert ForceBatchTimeoutNotExpired(); + } + } + // Calculate next acc input hash + currentAccInputHash = keccak256( + abi.encodePacked( + currentAccInputHash, + currentTransactionsHash, + currentBatch.forcedGlobalExitRoot, + currentBatch.forcedTimestamp, + msg.sender, + currentBatch.forcedBlockHashL1 + ) + ); + } + + // Transfer pol for every forced batch submitted + pol.safeTransfer( + address(rollupManager), + calculatePolPerForceBatch() * (batchesNum) + ); + + // Store back the storage variables + lastAccInputHash = currentAccInputHash; + lastForceBatchSequenced = currentLastForceBatchSequenced; + + uint64 currentBatchSequenced = rollupManager.onSequenceBatches( + uint64(batchesNum), + currentAccInputHash + ); + + emit SequenceForceBatches(currentBatchSequenced); + } + + ////////////////// + // admin functions + ////////////////// + + /** + * @notice Allow the admin to set a new trusted sequencer + * @param newTrustedSequencer Address of the new trusted sequencer + */ + function setTrustedSequencer( + address newTrustedSequencer + ) external onlyAdmin { + trustedSequencer = newTrustedSequencer; + + emit SetTrustedSequencer(newTrustedSequencer); + } + + /** + * @notice Allow the admin to set the trusted sequencer URL + * @param newTrustedSequencerURL URL of trusted sequencer + */ + function setTrustedSequencerURL( + string memory newTrustedSequencerURL + ) external onlyAdmin { + trustedSequencerURL = newTrustedSequencerURL; + + emit SetTrustedSequencerURL(newTrustedSequencerURL); + } + + /** + * @notice Allow the admin to set the forcedBatchTimeout + * The new value can only be lower, except if emergency state is active + * @param newforceBatchTimeout New force batch timeout + */ + function setForceBatchTimeout( + uint64 newforceBatchTimeout + ) external onlyAdmin { + if (newforceBatchTimeout > _HALT_AGGREGATION_TIMEOUT) { + revert InvalidRangeForceBatchTimeout(); + } + + if (!rollupManager.isEmergencyState()) { + if (newforceBatchTimeout >= forceBatchTimeout) { + revert InvalidRangeForceBatchTimeout(); + } + } + + forceBatchTimeout = newforceBatchTimeout; + emit SetForceBatchTimeout(newforceBatchTimeout); + } + + /** + * @notice Allow the admin to turn on the force batches + * This action is not reversible + */ + function activateForceBatches() external onlyAdmin { + if (isForcedBatchAllowed) { + revert ForceBatchesAlreadyActive(); + } + isForcedBatchAllowed = true; + emit ActivateForceBatches(); + } + + /** + * @notice Starts the admin role transfer + * This is a two step process, the pending admin must accepted to finalize the process + * @param newPendingAdmin Address of the new pending admin + */ + function transferAdminRole(address newPendingAdmin) external onlyAdmin { + pendingAdmin = newPendingAdmin; + emit TransferAdminRole(newPendingAdmin); + } + + /** + * @notice Allow the current pending admin to accept the admin role + */ + function acceptAdminRole() external { + if (pendingAdmin != msg.sender) { + revert OnlyPendingAdmin(); + } + + admin = pendingAdmin; + emit AcceptAdminRole(pendingAdmin); + } + + ////////////////// + // view/pure functions + ////////////////// + + /** + * @notice Function to calculate the reward for a forced batch + */ + function calculatePolPerForceBatch() public view returns (uint256) { + uint256 currentBalance = pol.balanceOf(address(this)); + + // Pending forced Batches = last forced batch added - last forced batch sequenced + uint256 pendingForcedBatches = lastForceBatch - lastForceBatchSequenced; + + if (pendingForcedBatches == 0) return 0; + return currentBalance / pendingForcedBatches; + } + + /** + * @notice Generate Initialize transaction for hte bridge on L2 + * @param networkID Indicates the network identifier that will be used in the bridge + * @param _gasTokenAddress Indicates the token address that will be used to pay gas fees in the new rollup + * @param _gasTokenNetwork Indicates the native network of the token address + */ + function generateInitializeTransaction( + uint32 networkID, + address _gasTokenAddress, + uint32 _gasTokenNetwork, + bytes memory _gasTokenMetadata + ) public view returns (bytes memory) { + // Check the ecrecover, as a sanity check, to not allow invalid transactions + + bytes memory initializeBrigeData = abi.encodeCall( + IPolygonZkEVMBridgeV2.initialize, + ( + networkID, + _gasTokenAddress, + _gasTokenNetwork, + GLOBAL_EXIT_ROOT_MANAGER_L2, + address(0), // Rollup manager on L2 does not exist + _gasTokenMetadata + ) + ); + + // Do not support more than 65535 bytes + if (initializeBrigeData.length > type(uint16).max) { + revert(); + } + uint16 initializeBrigeDataLen = uint16(initializeBrigeData.length); + + bytes memory bytesToSign = abi.encodePacked( + INITIALIZE_TX_BRIDGE_LIST_LEN_LEN, + uint16(initializeBrigeData.length) + INITIALIZE_TX_CONSTANT_BYTES, // do not support more than 2 bytes of length, intended to revert on overflow + INITIALIZE_TX_BRIDGE_PARAMS, + bridgeAddress, + INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS, + initializeBrigeDataLen, + initializeBrigeData + ); + + // Sanity check that the ecrecover will work + // Should never happen that giving a valid signature, ecrecover "breaks" + address signer = ecrecover( + keccak256(bytesToSign), + SIGNATURE_INITIALIZE_TX_V, + SIGNATURE_INITIALIZE_TX_R, + SIGNATURE_INITIALIZE_TX_S + ); + + if (signer == address(0)) { + revert InvalidInitializeTransaction(); + } + + bytes memory transaction = abi.encodePacked( + bytesToSign, + SIGNATURE_INITIALIZE_TX_R, + SIGNATURE_INITIALIZE_TX_S, + SIGNATURE_INITIALIZE_TX_V, + INITIALIZE_TX_EFFECTIVE_PERCENTAGE + ); + + return transaction; + } + + // Helpers to safely get the metadata from a token, inspired by https://github.com/traderjoe-xyz/joe-core/blob/main/contracts/MasterChefJoeV3.sol#L55-L95 + + /** + * @notice Provides a safe ERC20.symbol version which returns 'NO_SYMBOL' as fallback string + * @param token The address of the ERC-20 token contract + */ + function _safeSymbol(address token) internal view returns (string memory) { + (bool success, bytes memory data) = address(token).staticcall( + abi.encodeCall(IERC20MetadataUpgradeable.symbol, ()) + ); + return success ? _returnDataToString(data) : "NO_SYMBOL"; + } + + /** + * @notice Provides a safe ERC20.name version which returns 'NO_NAME' as fallback string. + * @param token The address of the ERC-20 token contract. + */ + function _safeName(address token) internal view returns (string memory) { + (bool success, bytes memory data) = address(token).staticcall( + abi.encodeCall(IERC20MetadataUpgradeable.name, ()) + ); + return success ? _returnDataToString(data) : "NO_NAME"; + } + + /** + * @notice Provides a safe ERC20.decimals version which returns '18' as fallback value. + * Note Tokens with (decimals > 255) are not supported + * @param token The address of the ERC-20 token contract + */ + function _safeDecimals(address token) internal view returns (uint8) { + (bool success, bytes memory data) = address(token).staticcall( + abi.encodeCall(IERC20MetadataUpgradeable.decimals, ()) + ); + return success && data.length == 32 ? abi.decode(data, (uint8)) : 18; + } + + /** + * @notice Function to convert returned data to string + * returns 'NOT_VALID_ENCODING' as fallback value. + * @param data returned data + */ + function _returnDataToString( + bytes memory data + ) internal pure returns (string memory) { + if (data.length >= 64) { + return abi.decode(data, (string)); + } else if (data.length == 32) { + // Since the strings on bytes32 are encoded left-right, check the first zero in the data + uint256 nonZeroBytes; + while (nonZeroBytes < 32 && data[nonZeroBytes] != 0) { + nonZeroBytes++; + } + + // If the first one is 0, we do not handle the encoding + if (nonZeroBytes == 0) { + return "NOT_VALID_ENCODING"; + } + // Create a byte array with nonZeroBytes length + bytes memory bytesArray = new bytes(nonZeroBytes); + for (uint256 i = 0; i < nonZeroBytes; i++) { + bytesArray[i] = data[i]; + } + return string(bytesArray); + } else { + return "NOT_VALID_ENCODING"; + } + } +} diff --git a/contracts/v2/lib/PolygonZkEVMGlobalExitRootBaseStorage.sol b/contracts/v2/lib/PolygonZkEVMGlobalExitRootBaseStorage.sol new file mode 100644 index 000000000..cb73169d8 --- /dev/null +++ b/contracts/v2/lib/PolygonZkEVMGlobalExitRootBaseStorage.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: AGPL-3.0 + +pragma solidity 0.8.20; +import "../interfaces/IPolygonZkEVMGlobalExitRootV2.sol"; + +/** + * Since the current contract of PolygonZkEVMGlobalExitRoot will be upgraded to a PolygonZkEVMGlobalExitRootV2, and it will implement + * the DepositContractBase, this base is needed to preserve the previous storage slots + */ +abstract contract PolygonZkEVMGlobalExitRootBaseStorage is + IPolygonZkEVMGlobalExitRootV2 +{ + // Rollup root, contains all exit roots of all rollups + bytes32 public lastRollupExitRoot; + + // Mainnet exit root, this will be updated every time a deposit is made in mainnet + bytes32 public lastMainnetExitRoot; + + // Store every global exit root: Root --> blockhash + mapping(bytes32 => uint256) public globalExitRootMap; +} diff --git a/test/contractsv2/PolygonRollupManagerUpgrade.test.ts b/test/contractsv2/PolygonRollupManagerUpgrade.test.ts index 3de8e49e2..decb401f8 100644 --- a/test/contractsv2/PolygonRollupManagerUpgrade.test.ts +++ b/test/contractsv2/PolygonRollupManagerUpgrade.test.ts @@ -191,7 +191,8 @@ describe("Polygon ZK-EVM TestnetV2", () => { ethers.ZeroAddress, // zero for ether ethers.ZeroAddress, // zero for ether polygonZkEVMGlobalExitRoot.target, - rollupManagerContract.target + rollupManagerContract.target, + "0x" ); // fund sequencer address with Matic tokens @@ -377,7 +378,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { admin.address, trustedSequencer.address, gasTokenAddress, - gasTokenNetwork, urlSequencer, networkName ) @@ -393,7 +393,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { admin.address, trustedSequencer.address, gasTokenAddress, - gasTokenNetwork, urlSequencer, networkName ) @@ -414,7 +413,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { admin.address, trustedSequencer.address, gasTokenAddress, - gasTokenNetwork, urlSequencer, networkName ) @@ -439,13 +437,12 @@ describe("Polygon ZK-EVM TestnetV2", () => { admin.address, trustedSequencer.address, gasTokenAddress, - gasTokenNetwork, urlSequencer, networkName ) ) .to.emit(rollupManagerContract, "CreateNewRollup") - .withArgs(newCreatedRollupID, newRollupTypeID, newZKEVMAddress, chainID, gasTokenAddress, gasTokenNetwork) + .withArgs(newCreatedRollupID, newRollupTypeID, newZKEVMAddress, chainID, gasTokenAddress) .to.emit(newZkEVMContract, "SequenceBatches") .withArgs(newSequencedBatch) .to.emit(rollupManagerContract, "OnSequenceBatches") @@ -470,7 +467,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { admin.address, trustedSequencer.address, gasTokenAddress, - gasTokenNetwork, urlSequencer, networkName ) @@ -479,7 +475,8 @@ describe("Polygon ZK-EVM TestnetV2", () => { const transaction = await newZkEVMContract.generateInitializeTransaction( newCreatedRollupID, gasTokenAddress, - gasTokenNetwork + gasTokenNetwork, + "0x" // empty metadata ); // Check transaction @@ -490,6 +487,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { gasTokenNetwork, globalExitRootL2Address, ethers.ZeroAddress, + "0x", // empty metadata ]); const rawTx = processorUtils.customRawTxToRawTx(transaction); @@ -910,7 +908,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { admin.address, trustedSequencer.address, gasTokenAddress, - gasTokenNetwork, urlSequencer, networkName ) @@ -926,7 +923,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { admin.address, trustedSequencer.address, gasTokenAddress, - gasTokenNetwork, urlSequencer, networkName ) @@ -947,7 +943,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { admin.address, trustedSequencer.address, gasTokenAddress, - gasTokenNetwork, urlSequencer, networkName ) @@ -972,13 +967,12 @@ describe("Polygon ZK-EVM TestnetV2", () => { admin.address, trustedSequencer.address, gasTokenAddress, - gasTokenNetwork, urlSequencer, networkName ) ) .to.emit(rollupManagerContract, "CreateNewRollup") - .withArgs(newCreatedRollupID, newRollupTypeID, newZKEVMAddress, chainID, gasTokenAddress, gasTokenNetwork) + .withArgs(newCreatedRollupID, newRollupTypeID, newZKEVMAddress, chainID, gasTokenAddress) .to.emit(newZkEVMContract, "SequenceBatches") .withArgs(newSequencedBatch) .to.emit(rollupManagerContract, "OnSequenceBatches") @@ -1003,7 +997,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { admin.address, trustedSequencer.address, gasTokenAddress, - gasTokenNetwork, urlSequencer, networkName ) @@ -1012,7 +1005,8 @@ describe("Polygon ZK-EVM TestnetV2", () => { const transaction = await newZkEVMContract.generateInitializeTransaction( newCreatedRollupID, gasTokenAddress, - gasTokenNetwork + gasTokenNetwork, + "0x" // empty metadata ); // Check transaction @@ -1023,6 +1017,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { gasTokenNetwork, globalExitRootL2Address, ethers.ZeroAddress, + "0x", ]); const rawTx = processorUtils.customRawTxToRawTx(transaction); From 097986a51d687eab13570e425c99f758aa9f17c9 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Sat, 18 Nov 2023 10:53:23 +0300 Subject: [PATCH 091/230] update edrog contracts --- contracts/mocks/DAI.sol | 478 +++++++++--------- contracts/v2/PolygonZkEVMBridgeV2.sol | 52 +- .../dataComittee/PolygonDataComitteeEtrog.sol | 2 +- contracts/v2/lib/PolygonRollupBase.sol | 23 +- contracts/v2/lib/PolygonRollupBaseEtrog.sol | 32 +- 5 files changed, 316 insertions(+), 271 deletions(-) diff --git a/contracts/mocks/DAI.sol b/contracts/mocks/DAI.sol index 73e531174..c57899c2c 100644 --- a/contracts/mocks/DAI.sol +++ b/contracts/mocks/DAI.sol @@ -1,239 +1,239 @@ -/** - *Submitted for verification at Etherscan.io on 2019-11-14 - */ - -// hevm: flattened sources of /nix/store/8xb41r4qd0cjb63wcrxf1qmfg88p0961-dss-6fd7de0/src/dai.sol -pragma solidity =0.5.12; - -////// /nix/store/8xb41r4qd0cjb63wcrxf1qmfg88p0961-dss-6fd7de0/src/lib.sol -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -/* pragma solidity 0.5.12; */ - -contract LibNote { - event LogNote( - bytes4 indexed sig, - address indexed usr, - bytes32 indexed arg1, - bytes32 indexed arg2, - bytes data - ) anonymous; - - modifier note() { - _; - assembly { - // log an 'anonymous' event with a constant 6 words of calldata - // and four indexed topics: selector, caller, arg1 and arg2 - let mark := msize // end of memory ensures zero - mstore(0x40, add(mark, 288)) // update free memory pointer - mstore(mark, 0x20) // bytes type data offset - mstore(add(mark, 0x20), 224) // bytes size (padded) - calldatacopy(add(mark, 0x40), 0, 224) // bytes payload - log4( - mark, - 288, // calldata - shl(224, shr(224, calldataload(0))), // msg.sig - caller, // msg.sender - calldataload(4), // arg1 - calldataload(36) // arg2 - ) - } - } -} - -////// /nix/store/8xb41r4qd0cjb63wcrxf1qmfg88p0961-dss-6fd7de0/src/dai.sol -// Copyright (C) 2017, 2018, 2019 dbrock, rain, mrchico - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -/* pragma solidity 0.5.12; */ - -/* import "./lib.sol"; */ - -contract Dai is LibNote { - // --- Auth --- - mapping(address => uint256) public wards; - - function rely(address guy) external note auth { - wards[guy] = 1; - } - - function deny(address guy) external note auth { - wards[guy] = 0; - } - - modifier auth() { - require(wards[msg.sender] == 1, "Dai/not-authorized"); - _; - } - - // --- ERC20 Data --- - string public constant name = "Dai Stablecoin"; - string public constant symbol = "DAI"; - string public constant version = "1"; - uint8 public constant decimals = 18; - uint256 public totalSupply; - - mapping(address => uint256) public balanceOf; - mapping(address => mapping(address => uint256)) public allowance; - mapping(address => uint256) public nonces; - - event Approval(address indexed src, address indexed guy, uint256 wad); - event Transfer(address indexed src, address indexed dst, uint256 wad); - - // --- Math --- - function add(uint256 x, uint256 y) internal pure returns (uint256 z) { - require((z = x + y) >= x); - } - - function sub(uint256 x, uint256 y) internal pure returns (uint256 z) { - require((z = x - y) <= x); - } - - // --- EIP712 niceties --- - bytes32 public DOMAIN_SEPARATOR; - // bytes32 public constant PERMIT_TYPEHASH = keccak256("Permit(address holder,address spender,uint256 nonce,uint256 expiry,bool allowed)"); - bytes32 public constant PERMIT_TYPEHASH = - 0xea2aa0a1be11a07ed86d755c93467f4f82362b452371d1ba94d1715123511acb; - - constructor(uint256 chainId_) public { - wards[msg.sender] = 1; - DOMAIN_SEPARATOR = keccak256( - abi.encode( - keccak256( - "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" - ), - keccak256(bytes(name)), - keccak256(bytes(version)), - chainId_, - address(this) - ) - ); - } - - // --- Token --- - function transfer(address dst, uint256 wad) external returns (bool) { - return transferFrom(msg.sender, dst, wad); - } - - function transferFrom( - address src, - address dst, - uint256 wad - ) public returns (bool) { - require(balanceOf[src] >= wad, "Dai/insufficient-balance"); - if (src != msg.sender && allowance[src][msg.sender] != uint256(-1)) { - require( - allowance[src][msg.sender] >= wad, - "Dai/insufficient-allowance" - ); - allowance[src][msg.sender] = sub(allowance[src][msg.sender], wad); - } - balanceOf[src] = sub(balanceOf[src], wad); - balanceOf[dst] = add(balanceOf[dst], wad); - emit Transfer(src, dst, wad); - return true; - } - - function mint(address usr, uint256 wad) external auth { - balanceOf[usr] = add(balanceOf[usr], wad); - totalSupply = add(totalSupply, wad); - emit Transfer(address(0), usr, wad); - } - - function burn(address usr, uint256 wad) external { - require(balanceOf[usr] >= wad, "Dai/insufficient-balance"); - if (usr != msg.sender && allowance[usr][msg.sender] != uint256(-1)) { - require( - allowance[usr][msg.sender] >= wad, - "Dai/insufficient-allowance" - ); - allowance[usr][msg.sender] = sub(allowance[usr][msg.sender], wad); - } - balanceOf[usr] = sub(balanceOf[usr], wad); - totalSupply = sub(totalSupply, wad); - emit Transfer(usr, address(0), wad); - } - - function approve(address usr, uint256 wad) external returns (bool) { - allowance[msg.sender][usr] = wad; - emit Approval(msg.sender, usr, wad); - return true; - } - - // --- Alias --- - function push(address usr, uint256 wad) external { - transferFrom(msg.sender, usr, wad); - } - - function pull(address usr, uint256 wad) external { - transferFrom(usr, msg.sender, wad); - } - - function move( - address src, - address dst, - uint256 wad - ) external { - transferFrom(src, dst, wad); - } - - // --- Approve by signature --- - function permit( - address holder, - address spender, - uint256 nonce, - uint256 expiry, - bool allowed, - uint8 v, - bytes32 r, - bytes32 s - ) external { - bytes32 digest = keccak256( - abi.encodePacked( - "\x19\x01", - DOMAIN_SEPARATOR, - keccak256( - abi.encode( - PERMIT_TYPEHASH, - holder, - spender, - nonce, - expiry, - allowed - ) - ) - ) - ); - - require(holder != address(0), "Dai/invalid-address-0"); - require(holder == ecrecover(digest, v, r, s), "Dai/invalid-permit"); - require(expiry == 0 || now <= expiry, "Dai/permit-expired"); - require(nonce == nonces[holder]++, "Dai/invalid-nonce"); - uint256 wad = allowed ? uint256(-1) : 0; - allowance[holder][spender] = wad; - emit Approval(holder, spender, wad); - } -} +// /** +// *Submitted for verification at Etherscan.io on 2019-11-14 +// */ + +// // hevm: flattened sources of /nix/store/8xb41r4qd0cjb63wcrxf1qmfg88p0961-dss-6fd7de0/src/dai.sol +// pragma solidity =0.5.12; + +// ////// /nix/store/8xb41r4qd0cjb63wcrxf1qmfg88p0961-dss-6fd7de0/src/lib.sol +// // This program is free software: you can redistribute it and/or modify +// // it under the terms of the GNU General Public License as published by +// // the Free Software Foundation, either version 3 of the License, or +// // (at your option) any later version. + +// // This program is distributed in the hope that it will be useful, +// // but WITHOUT ANY WARRANTY; without even the implied warranty of +// // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// // GNU General Public License for more details. + +// // You should have received a copy of the GNU General Public License +// // along with this program. If not, see . + +// /* pragma solidity 0.5.12; */ + +// contract LibNote { +// event LogNote( +// bytes4 indexed sig, +// address indexed usr, +// bytes32 indexed arg1, +// bytes32 indexed arg2, +// bytes data +// ) anonymous; + +// modifier note() { +// _; +// assembly { +// // log an 'anonymous' event with a constant 6 words of calldata +// // and four indexed topics: selector, caller, arg1 and arg2 +// let mark := msize // end of memory ensures zero +// mstore(0x40, add(mark, 288)) // update free memory pointer +// mstore(mark, 0x20) // bytes type data offset +// mstore(add(mark, 0x20), 224) // bytes size (padded) +// calldatacopy(add(mark, 0x40), 0, 224) // bytes payload +// log4( +// mark, +// 288, // calldata +// shl(224, shr(224, calldataload(0))), // msg.sig +// caller, // msg.sender +// calldataload(4), // arg1 +// calldataload(36) // arg2 +// ) +// } +// } +// } + +// ////// /nix/store/8xb41r4qd0cjb63wcrxf1qmfg88p0961-dss-6fd7de0/src/dai.sol +// // Copyright (C) 2017, 2018, 2019 dbrock, rain, mrchico + +// // This program is free software: you can redistribute it and/or modify +// // it under the terms of the GNU Affero General Public License as published by +// // the Free Software Foundation, either version 3 of the License, or +// // (at your option) any later version. +// // +// // This program is distributed in the hope that it will be useful, +// // but WITHOUT ANY WARRANTY; without even the implied warranty of +// // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// // GNU Affero General Public License for more details. +// // +// // You should have received a copy of the GNU Affero General Public License +// // along with this program. If not, see . + +// /* pragma solidity 0.5.12; */ + +// /* import "./lib.sol"; */ + +// contract Dai is LibNote { +// // --- Auth --- +// mapping(address => uint256) public wards; + +// function rely(address guy) external note auth { +// wards[guy] = 1; +// } + +// function deny(address guy) external note auth { +// wards[guy] = 0; +// } + +// modifier auth() { +// require(wards[msg.sender] == 1, "Dai/not-authorized"); +// _; +// } + +// // --- ERC20 Data --- +// string public constant name = "Dai Stablecoin"; +// string public constant symbol = "DAI"; +// string public constant version = "1"; +// uint8 public constant decimals = 18; +// uint256 public totalSupply; + +// mapping(address => uint256) public balanceOf; +// mapping(address => mapping(address => uint256)) public allowance; +// mapping(address => uint256) public nonces; + +// event Approval(address indexed src, address indexed guy, uint256 wad); +// event Transfer(address indexed src, address indexed dst, uint256 wad); + +// // --- Math --- +// function add(uint256 x, uint256 y) internal pure returns (uint256 z) { +// require((z = x + y) >= x); +// } + +// function sub(uint256 x, uint256 y) internal pure returns (uint256 z) { +// require((z = x - y) <= x); +// } + +// // --- EIP712 niceties --- +// bytes32 public DOMAIN_SEPARATOR; +// // bytes32 public constant PERMIT_TYPEHASH = keccak256("Permit(address holder,address spender,uint256 nonce,uint256 expiry,bool allowed)"); +// bytes32 public constant PERMIT_TYPEHASH = +// 0xea2aa0a1be11a07ed86d755c93467f4f82362b452371d1ba94d1715123511acb; + +// constructor(uint256 chainId_) public { +// wards[msg.sender] = 1; +// DOMAIN_SEPARATOR = keccak256( +// abi.encode( +// keccak256( +// "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" +// ), +// keccak256(bytes(name)), +// keccak256(bytes(version)), +// chainId_, +// address(this) +// ) +// ); +// } + +// // --- Token --- +// function transfer(address dst, uint256 wad) external returns (bool) { +// return transferFrom(msg.sender, dst, wad); +// } + +// function transferFrom( +// address src, +// address dst, +// uint256 wad +// ) public returns (bool) { +// require(balanceOf[src] >= wad, "Dai/insufficient-balance"); +// if (src != msg.sender && allowance[src][msg.sender] != uint256(-1)) { +// require( +// allowance[src][msg.sender] >= wad, +// "Dai/insufficient-allowance" +// ); +// allowance[src][msg.sender] = sub(allowance[src][msg.sender], wad); +// } +// balanceOf[src] = sub(balanceOf[src], wad); +// balanceOf[dst] = add(balanceOf[dst], wad); +// emit Transfer(src, dst, wad); +// return true; +// } + +// function mint(address usr, uint256 wad) external auth { +// balanceOf[usr] = add(balanceOf[usr], wad); +// totalSupply = add(totalSupply, wad); +// emit Transfer(address(0), usr, wad); +// } + +// function burn(address usr, uint256 wad) external { +// require(balanceOf[usr] >= wad, "Dai/insufficient-balance"); +// if (usr != msg.sender && allowance[usr][msg.sender] != uint256(-1)) { +// require( +// allowance[usr][msg.sender] >= wad, +// "Dai/insufficient-allowance" +// ); +// allowance[usr][msg.sender] = sub(allowance[usr][msg.sender], wad); +// } +// balanceOf[usr] = sub(balanceOf[usr], wad); +// totalSupply = sub(totalSupply, wad); +// emit Transfer(usr, address(0), wad); +// } + +// function approve(address usr, uint256 wad) external returns (bool) { +// allowance[msg.sender][usr] = wad; +// emit Approval(msg.sender, usr, wad); +// return true; +// } + +// // --- Alias --- +// function push(address usr, uint256 wad) external { +// transferFrom(msg.sender, usr, wad); +// } + +// function pull(address usr, uint256 wad) external { +// transferFrom(usr, msg.sender, wad); +// } + +// function move( +// address src, +// address dst, +// uint256 wad +// ) external { +// transferFrom(src, dst, wad); +// } + +// // --- Approve by signature --- +// function permit( +// address holder, +// address spender, +// uint256 nonce, +// uint256 expiry, +// bool allowed, +// uint8 v, +// bytes32 r, +// bytes32 s +// ) external { +// bytes32 digest = keccak256( +// abi.encodePacked( +// "\x19\x01", +// DOMAIN_SEPARATOR, +// keccak256( +// abi.encode( +// PERMIT_TYPEHASH, +// holder, +// spender, +// nonce, +// expiry, +// allowed +// ) +// ) +// ) +// ); + +// require(holder != address(0), "Dai/invalid-address-0"); +// require(holder == ecrecover(digest, v, r, s), "Dai/invalid-permit"); +// require(expiry == 0 || now <= expiry, "Dai/permit-expired"); +// require(nonce == nonces[holder]++, "Dai/invalid-nonce"); +// uint256 wad = allowed ? uint256(-1) : 0; +// allowance[holder][spender] = wad; +// emit Approval(holder, spender, wad); +// } +// } diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index 0d20ad9c3..5668ff6b5 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -270,11 +270,7 @@ contract PolygonZkEVMBridgeV2 is originNetwork = networkID; } // Encode metadata - metadata = abi.encode( - _safeName(token), - _safeSymbol(token), - _safeDecimals(token) - ); + metadata = getTokenMetadata(token); } } @@ -680,10 +676,10 @@ contract PolygonZkEVMBridgeV2 is function precalculatedWrapperAddress( uint32 originNetwork, address originTokenAddress, - string calldata name, - string calldata symbol, + string memory name, + string memory symbol, uint8 decimals - ) external view returns (address) { + ) public view returns (address) { bytes32 salt = keccak256( abi.encodePacked(originNetwork, originTokenAddress) ); @@ -1084,4 +1080,44 @@ contract PolygonZkEVMBridgeV2 is return "NOT_VALID_ENCODING"; } } + + /** + * @notice Returns the encoded token metadata + * @param token Address of the token + */ + + function getTokenMetadata( + address token + ) public view returns (bytes memory) { + return + abi.encode( + _safeName(token), + _safeSymbol(token), + _safeDecimals(token) + ); + } + + /** + * @notice Returns the precalculated address of a wrapper using the token address + * Note Updating the metadata of a token is not supported. + * Since the metadata has relevance in the address deployed, this function will not return a valid + * wrapped address if the metadata provided is not the original one. + * @param originNetwork Origin network + * @param originTokenAddress Origin token address, 0 address is reserved for ether + * @param token Address of the token to calculate the wrapper address + */ + function calculateTokenWrapperAddress( + uint32 originNetwork, + address originTokenAddress, + address token + ) external view returns (address) { + return + precalculatedWrapperAddress( + originNetwork, + originTokenAddress, + _safeName(token), + _safeSymbol(token), + _safeDecimals(token) + ); + } } diff --git a/contracts/v2/consensus/dataComittee/PolygonDataComitteeEtrog.sol b/contracts/v2/consensus/dataComittee/PolygonDataComitteeEtrog.sol index b940218cd..54d0d0d1b 100644 --- a/contracts/v2/consensus/dataComittee/PolygonDataComitteeEtrog.sol +++ b/contracts/v2/consensus/dataComittee/PolygonDataComitteeEtrog.sol @@ -221,7 +221,7 @@ contract PolygonDataComitteeEtrog is currentAccInputHash ); - emit SequenceBatches(currentBatchSequenced); + emit SequenceBatches(currentBatchSequenced, l1InfoRoot); } ////////////////// diff --git a/contracts/v2/lib/PolygonRollupBase.sol b/contracts/v2/lib/PolygonRollupBase.sol index 2f2afafde..5b3995d99 100644 --- a/contracts/v2/lib/PolygonRollupBase.sol +++ b/contracts/v2/lib/PolygonRollupBase.sol @@ -301,20 +301,12 @@ contract PolygonRollupBase is string memory sequencerURL, string memory _networkName ) external virtual onlyRollupManager initializer { - admin = _admin; - trustedSequencer = sequencer; - - trustedSequencerURL = sequencerURL; - networkName = _networkName; - - // Constant deployment variables - forceBatchTimeout = 5 days; - bytes memory gasTokenMetadata; if (_gasTokenAddress != address(0)) { // Ask for token metadata, the same way is enconded in the bridge // Note that this funciton will revert if the token is not in this network + // Note that this could be a possible reentrant call, but cannot make changes on the state since are static call gasTokenMetadata = abi.encode( _safeName(_gasTokenAddress), _safeSymbol(_gasTokenAddress), @@ -368,6 +360,16 @@ contract PolygonRollupBase is newAccInputHash ); + // Set initialize variables + admin = _admin; + trustedSequencer = sequencer; + + trustedSequencerURL = sequencerURL; + networkName = _networkName; + + // Constant deployment variables + forceBatchTimeout = 5 days; + emit SequenceBatches(currentBatchSequenced); } @@ -527,7 +529,8 @@ contract PolygonRollupBase is // substract forced batches nonForcedBatchesSequenced -= forcedBatchesSequenced; - pol.safeTransfer( // Transfer pol for every forced batch submitted + // Transfer pol for every forced batch submitted + pol.safeTransfer( address(rollupManager), calculatePolPerForceBatch() * (forcedBatchesSequenced) ); diff --git a/contracts/v2/lib/PolygonRollupBaseEtrog.sol b/contracts/v2/lib/PolygonRollupBaseEtrog.sol index 211860571..436e54d4a 100644 --- a/contracts/v2/lib/PolygonRollupBaseEtrog.sol +++ b/contracts/v2/lib/PolygonRollupBaseEtrog.sol @@ -196,7 +196,7 @@ contract PolygonRollupBaseEtrog is /** * @dev Emitted when the trusted sequencer sends a new batch of transactions */ - event SequenceBatches(uint64 indexed numBatch); + event SequenceBatches(uint64 indexed numBatch, bytes32 l1InfoRoot); /** * @dev Emitted when a batch is forced @@ -289,20 +289,12 @@ contract PolygonRollupBaseEtrog is string memory sequencerURL, string memory _networkName ) external virtual onlyRollupManager initializer { - admin = _admin; - trustedSequencer = sequencer; - - trustedSequencerURL = sequencerURL; - networkName = _networkName; - - // Constant deployment variables - forceBatchTimeout = 5 days; - bytes memory gasTokenMetadata; if (_gasTokenAddress != address(0)) { // Ask for token metadata, the same way is enconded in the bridge // Note that this funciton will revert if the token is not in this network + // Note that this could be a possible reentrant call, but cannot make changes on the state since are static call gasTokenMetadata = abi.encode( _safeName(_gasTokenAddress), _safeSymbol(_gasTokenAddress), @@ -339,15 +331,19 @@ contract PolygonRollupBaseEtrog is // should be deterministic for easier deployment uint64 currentTimestamp = uint64(block.timestamp); + // Add the transaction to the sequence as if it was a force transaction + // review add acutal global exit root, need different event bytes32 newAccInputHash = keccak256( abi.encodePacked( bytes32(0), // Current acc Input hash currentTransactionsHash, bytes32(0), // Global exit root currentTimestamp, - sequencer + sequencer, + blockhash(block.number - 1) ) ); + lastAccInputHash = newAccInputHash; uint64 currentBatchSequenced = rollupManager.onSequenceBatches( @@ -355,7 +351,17 @@ contract PolygonRollupBaseEtrog is newAccInputHash ); - emit SequenceBatches(currentBatchSequenced); + // Set initialize variables + admin = _admin; + trustedSequencer = sequencer; + + trustedSequencerURL = sequencerURL; + networkName = _networkName; + + // Constant deployment variables + forceBatchTimeout = 5 days; + + emit SequenceBatches(currentBatchSequenced, bytes32(0)); } modifier onlyAdmin() { @@ -529,7 +535,7 @@ contract PolygonRollupBaseEtrog is currentAccInputHash ); - emit SequenceBatches(currentBatchSequenced); + emit SequenceBatches(currentBatchSequenced, l1InfoRoot); } /** From f77aa86b8e10ec630c50d5d7d29d5005c6f25c00 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Sat, 18 Nov 2023 11:28:23 +0300 Subject: [PATCH 092/230] add tests ugprade --- test/contractsv2/PolygonRollupManager.test.ts | 628 ++++++++++++++++++ 1 file changed, 628 insertions(+) diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index 32e85fd78..16f04569a 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -1280,6 +1280,634 @@ describe("Polygon ZK-EVM TestnetV2", () => { expect(await newWrappedToken.totalSupply()).to.be.equal(amount); }); + it("should check full flow upgrading rollup", async () => { + const urlSequencer = "http://zkevm-json-rpc:8123"; + const chainID = 1000; + const networkName = "zkevm"; + const forkID = 0; + const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001"; + const rollupCompatibilityID = 0; + const descirption = "zkevm test"; + // Native token will be ether + + // deploy pol + const gasTokenName = "GAS Token"; + const gasTokenSymbol = "GTOKEN"; + const gasTokenDecimals = 18; + + const gasTokenInitialBalance = ethers.parseEther("20000000"); + + const gasMetadataToken = ethers.AbiCoder.defaultAbiCoder().encode( + ["string", "string", "uint8"], + [gasTokenName, gasTokenSymbol, gasTokenDecimals] + ); + const tokenFactory = await ethers.getContractFactory("ERC20PermitMock"); + const gasTokenContract = await tokenFactory.deploy( + gasTokenName, + gasTokenSymbol, + deployer.address, + gasTokenInitialBalance + ); + + const gasTokenAddress = gasTokenContract.target; + const gasTokenNetwork = 0; + + // In order to create a new rollup type, create an implementation of the contract + + // Create zkEVM implementation + const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMV2"); + const PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy( + polygonZkEVMGlobalExitRoot.target, + polTokenContract.target, + polygonZkEVMBridgeContract.target, + rollupManagerContract.target + ); + await PolygonZKEVMV2Contract.waitForDeployment(); + + // Try to add a new rollup type + await expect( + rollupManagerContract.addNewRollupType( + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + genesisRandom, + descirption + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); + + // Add a new rollup type with timelock + const newRollupTypeID = 1; + await expect( + rollupManagerContract + .connect(timelock) + .addNewRollupType( + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + genesisRandom, + descirption + ) + ) + .to.emit(rollupManagerContract, "AddNewRollupType") + .withArgs( + newRollupTypeID, + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + genesisRandom, + descirption + ); + + // assert new rollup type + const createdRollupType = await rollupManagerContract.rollupTypeMap(newRollupTypeID); + + const expectedRollupType = [ + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + false, + genesisRandom, + ]; + expect(createdRollupType).to.be.deep.equal(expectedRollupType); + + // obsoleteRollupType, take snapshot for it + const snapshot = await takeSnapshot(); + + await expect(rollupManagerContract.obsoleteRollupType(newRollupTypeID)).to.be.revertedWithCustomError( + rollupManagerContract, + "AddressDoNotHaveRequiredRole" + ); + + await expect(rollupManagerContract.connect(admin).obsoleteRollupType(newRollupTypeID)) + .to.emit(rollupManagerContract, "ObsoleteRollupType") + .withArgs(newRollupTypeID); + + expect([ + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + true, + genesisRandom, + ]).to.be.deep.equal(await rollupManagerContract.rollupTypeMap(newRollupTypeID)); + await snapshot.restore(); + + expect(expectedRollupType).to.be.deep.equal(await rollupManagerContract.rollupTypeMap(newRollupTypeID)); + // Create a + + // Only admin can create new zkEVMs + await expect( + rollupManagerContract.createNewRollup( + newRollupTypeID, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + urlSequencer, + networkName + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); + + // UNexisting rollupType + await expect( + rollupManagerContract + .connect(admin) + .createNewRollup( + 0, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + urlSequencer, + networkName + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeDoesNotExist"); + + // Obsolete rollup type and test that fails + const snapshot2 = await takeSnapshot(); + await expect(rollupManagerContract.connect(admin).obsoleteRollupType(newRollupTypeID)) + .to.emit(rollupManagerContract, "ObsoleteRollupType") + .withArgs(newRollupTypeID); + + await expect( + rollupManagerContract + .connect(admin) + .createNewRollup( + newRollupTypeID, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + urlSequencer, + networkName + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeObsolete"); + await snapshot2.restore(); + + const newCreatedRollupID = 1; + const newZKEVMAddress = ethers.getCreateAddress({ + from: rollupManagerContract.target as string, + nonce: 1, + }); + + const newZkEVMContract = PolygonZKEVMV2Factory.attach(newZKEVMAddress) as PolygonZkEVMV2; + const newSequencedBatch = 1; + + await expect( + rollupManagerContract + .connect(admin) + .createNewRollup( + newRollupTypeID, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + urlSequencer, + networkName + ) + ) + .to.emit(rollupManagerContract, "CreateNewRollup") + .withArgs(newCreatedRollupID, newRollupTypeID, newZKEVMAddress, chainID, gasTokenAddress) + .to.emit(newZkEVMContract, "SequenceBatches") + .withArgs(newSequencedBatch) + .to.emit(rollupManagerContract, "OnSequenceBatches") + .withArgs(newCreatedRollupID, newSequencedBatch); + + // Assert new rollup created + const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; + expect(await newZkEVMContract.admin()).to.be.equal(admin.address); + expect(await newZkEVMContract.trustedSequencer()).to.be.equal(trustedSequencer.address); + expect(await newZkEVMContract.trustedSequencerURL()).to.be.equal(urlSequencer); + expect(await newZkEVMContract.networkName()).to.be.equal(networkName); + expect(await newZkEVMContract.forceBatchTimeout()).to.be.equal(FORCE_BATCH_TIMEOUT); + expect(await newZkEVMContract.lastTimestamp()).to.be.equal(timestampCreatedRollup); + + // Cannot create 2 chains with the same chainID + await expect( + rollupManagerContract + .connect(admin) + .createNewRollup( + newRollupTypeID, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + urlSequencer, + networkName + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "ChainIDAlreadyExist"); + + const transaction = await newZkEVMContract.generateInitializeTransaction( + newCreatedRollupID, + gasTokenAddress, + gasTokenNetwork, + gasMetadataToken // empty metadata + ); + + // Check transaction + const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + const encodedData = bridgeL2Factory.interface.encodeFunctionData("initialize", [ + newCreatedRollupID, + gasTokenAddress, + gasTokenNetwork, + globalExitRootL2Address, + ethers.ZeroAddress, + gasMetadataToken, // empty metadata + ]); + + const rawTx = processorUtils.customRawTxToRawTx(transaction); + const tx = ethers.Transaction.from(rawTx); + expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); + expect(tx.value).to.be.equal(0); + expect(tx.data).to.be.equal(encodedData); + expect(tx.gasPrice).to.be.equal(0); + expect(tx.gasLimit).to.be.equal(30000000); + expect(tx.nonce).to.be.equal(0); + expect(tx.chainId).to.be.equal(0); + + const expectedAccInputHash = calculateAccInputHash( + ethers.ZeroHash, + ethers.keccak256(transaction), + ethers.ZeroHash, + timestampCreatedRollup, + trustedSequencer.address + ); + // calcualte accINputHash + expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash); + + // Check mapping on rollup Manager + const rollupData = await rollupManagerContract.rollupIDToRollupData(newCreatedRollupID); + expect(rollupData.rollupContract).to.be.equal(newZKEVMAddress); + expect(rollupData.chainID).to.be.equal(chainID); + expect(rollupData.verifier).to.be.equal(verifierContract.target); + expect(rollupData.forkID).to.be.equal(forkID); + expect(rollupData.lastLocalExitRoot).to.be.equal(ethers.ZeroHash); + expect(rollupData.lastBatchSequenced).to.be.equal(newSequencedBatch); + expect(rollupData.lastVerifiedBatch).to.be.equal(0); + expect(rollupData.lastPendingState).to.be.equal(0); + expect(rollupData.lastPendingStateConsolidated).to.be.equal(0); + expect(rollupData.lastVerifiedBatchBeforeUpgrade).to.be.equal(0); + expect(rollupData.rollupTypeID).to.be.equal(1); + expect(rollupData.rollupCompatibilityID).to.be.equal(0); + + const sequencedBatchData = await rollupManagerContract.getRollupSequencedBatches( + newCreatedRollupID, + newSequencedBatch + ); + + expect(sequencedBatchData.accInputHash).to.be.equal(expectedAccInputHash); + expect(sequencedBatchData.sequencedTimestamp).to.be.equal(timestampCreatedRollup); + expect(sequencedBatchData.previousLastBatchSequenced).to.be.equal(0); + + // try verify batches + const l2txData = "0x123456"; + const maticAmount = await rollupManagerContract.getBatchFee(); + const currentTimestamp = (await ethers.provider.getBlock("latest"))?.timestamp; + + const sequence = { + transactions: l2txData, + globalExitRoot: ethers.ZeroHash, + timestamp: currentTimestamp, + minForcedTimestamp: 0, + } as BatchDataStruct; + + // Approve tokens + await expect(polTokenContract.connect(trustedSequencer).approve(newZkEVMContract.target, maticAmount)).to.emit( + polTokenContract, + "Approval" + ); + + // Sequence Batches + await expect(newZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address)) + .to.emit(newZkEVMContract, "SequenceBatches") + .withArgs(newSequencedBatch + 1); + + const expectedAccInputHash2 = calculateAccInputHash( + expectedAccInputHash, + ethers.keccak256(l2txData), + ethers.ZeroHash, + currentTimestamp, + trustedSequencer.address + ); + // calcualte accINputHash + expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash2); + + // Create a new local exit root mocking some bridge + const tokenName = "Matic Token"; + const tokenSymbol = "MATIC"; + const decimals = 18; + const metadataToken = ethers.AbiCoder.defaultAbiCoder().encode( + ["string", "string", "uint8"], + [tokenName, tokenSymbol, decimals] + ); + + const originNetwork = networkIDRollup; + const tokenAddress = ethers.getAddress(ethers.hexlify(ethers.randomBytes(20))); + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDMainnet; + const destinationAddress = beneficiary.address; + const metadata = metadataToken; // since we are inserting in the exit root can be anything + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + // compute root merkle tree in Js + const height = 32; + const merkleTreezkEVM = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + + // Add 2 leafs + merkleTreezkEVM.add(leafValue); + merkleTreezkEVM.add(leafValue); + + // check merkle root with SC + const rootzkEVM = merkleTreezkEVM.getRoot(); + + // trustedAggregator forge the batch + const pendingState = 0; + const newLocalExitRoot = rootzkEVM; + const newStateRoot = "0x0000000000000000000000000000000000000000000000000000000000000123"; + const newVerifiedBatch = newSequencedBatch + 1; + const zkProofFFlonk = new Array(24).fill(ethers.ZeroHash); + const currentVerifiedBatch = 0; + + const initialAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); + await expect( + rollupManagerContract + .connect(deployer) + .verifyBatchesTrustedAggregator( + newCreatedRollupID, + pendingState, + currentVerifiedBatch, + newVerifiedBatch, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); + + await expect( + rollupManagerContract + .connect(trustedAggregator) + .verifyBatchesTrustedAggregator( + newCreatedRollupID, + pendingState, + currentVerifiedBatch, + currentVerifiedBatch, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "FinalNumBatchBelowLastVerifiedBatch"); + + await expect( + rollupManagerContract + .connect(trustedAggregator) + .verifyBatchesTrustedAggregator( + newCreatedRollupID, + pendingState, + currentVerifiedBatch, + 3, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "NewAccInputHashDoesNotExist"); + + // Calcualte new globalExitroot + const merkleTreeRollups = new MerkleTreeBridge(height); + merkleTreeRollups.add(newLocalExitRoot); + const rootRollups = merkleTreeRollups.getRoot(); + + // Verify batch + await expect( + rollupManagerContract + .connect(trustedAggregator) + .verifyBatchesTrustedAggregator( + newCreatedRollupID, + pendingState, + currentVerifiedBatch, + newVerifiedBatch, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ) + .to.emit(rollupManagerContract, "VerifyBatchesTrustedAggregator") + .withArgs(newCreatedRollupID, newVerifiedBatch, newStateRoot, newLocalExitRoot, trustedAggregator.address) + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .withArgs(ethers.ZeroHash, rootRollups); + + const finalAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); + + expect(finalAggregatorMatic).to.equal(initialAggregatorMatic + maticAmount); + + // Assert global exit root + expect(await polygonZkEVMGlobalExitRoot.lastRollupExitRoot()).to.be.equal(rootRollups); + expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(ethers.ZeroHash); + + expect(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()).to.be.equal( + calculateGlobalExitRoot(ethers.ZeroHash, rootRollups) + ); + + const indexLeaf = 0; + const proofZkEVM = merkleTreezkEVM.getProofTreeByIndex(indexLeaf); + const proofRollups = merkleTreeRollups.getProofTreeByIndex(indexLeaf); + + // verify merkle proof + expect(verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM)).to.be.equal(true); + expect(verifyMerkleProof(rootzkEVM, proofRollups, indexLeaf, rootRollups)).to.be.equal(true); + + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM) + ).to.be.equal(true); + + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(newLocalExitRoot, proofRollups, indexLeaf, rootRollups) + ).to.be.equal(true); + + // claim + const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); + // create2 parameters + const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]); + const minimalBytecodeProxy = tokenWrappedFactory.bytecode; + const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]); + const precalculateWrappedErc20 = await ethers.getCreate2Address( + polygonZkEVMBridgeContract.target as string, + salt, + hashInitCode + ); + const newWrappedToken = tokenWrappedFactory.attach(precalculateWrappedErc20) as TokenWrapped; + + // Use precalculatedWrapperAddress and check if matches + expect( + await polygonZkEVMBridgeContract.precalculatedWrapperAddress( + networkIDRollup, + tokenAddress, + tokenName, + tokenSymbol, + decimals + ) + ).to.be.equal(precalculateWrappedErc20); + + // index leaf is 0 bc, does not have mainnet flag, and it's rollup 0 on leaf 0 + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofZkEVM, + proofRollups, + indexLeaf, + ethers.ZeroHash, + rootRollups, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ) + .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") + .withArgs(indexLeaf, originNetwork, tokenAddress, destinationAddress, amount) + .to.emit(polygonZkEVMBridgeContract, "NewWrappedToken") + .withArgs(originNetwork, tokenAddress, precalculateWrappedErc20, metadata) + .to.emit(newWrappedToken, "Transfer") + .withArgs(ethers.ZeroAddress, beneficiary.address, amount); + + // Assert maps created + const newTokenInfo = await polygonZkEVMBridgeContract.wrappedTokenToTokenInfo(precalculateWrappedErc20); + + expect(newTokenInfo.originNetwork).to.be.equal(networkIDRollup); + expect(newTokenInfo.originTokenAddress).to.be.equal(tokenAddress); + expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( + precalculateWrappedErc20 + ); + expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( + precalculateWrappedErc20 + ); + + expect(await polygonZkEVMBridgeContract.tokenInfoToWrappedToken(salt)).to.be.equal(precalculateWrappedErc20); + + // Check the wrapper info + expect(await newWrappedToken.name()).to.be.equal(tokenName); + expect(await newWrappedToken.symbol()).to.be.equal(tokenSymbol); + expect(await newWrappedToken.decimals()).to.be.equal(decimals); + + // Can't claim because nullifier + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofZkEVM, + proofRollups, + indexLeaf, + ethers.ZeroHash, + rootRollups, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AlreadyClaimed"); + + // Check new token + expect(await newWrappedToken.totalSupply()).to.be.equal(amount); + + // Upgrade rollup + // In order to update a new rollup type, create an implementation of the contract + + // Create zkEVM implementation + const PolygonZKEVMEtrogFactory = await ethers.getContractFactory("PolygonZkEVMVEtrog"); + const PolygonZKEVMEtrogContract = await PolygonZKEVMEtrogFactory.deploy( + polygonZkEVMGlobalExitRoot.target, + polTokenContract.target, + polygonZkEVMBridgeContract.target, + rollupManagerContract.target + ); + await PolygonZKEVMEtrogContract.waitForDeployment(); + + // Add a new rollup type with timelock + const etrogRollupType = 2; + await expect( + rollupManagerContract + .connect(timelock) + .addNewRollupType( + PolygonZKEVMEtrogContract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + genesisRandom, + descirption + ) + ) + .to.emit(rollupManagerContract, "AddNewRollupType") + .withArgs( + etrogRollupType, + PolygonZKEVMEtrogContract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + genesisRandom, + descirption + ); + + // assert new rollup type + const createdEtrogRollupType = await rollupManagerContract.rollupTypeMap(etrogRollupType); + + const expectedEtrogRollupType = [ + PolygonZKEVMEtrogContract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + false, + genesisRandom, + ]; + expect(createdEtrogRollupType).to.be.deep.equal(expectedEtrogRollupType); + + // Validate upgrade OZ + await upgrades.validateUpgrade(PolygonZKEVMV2Factory, PolygonZKEVMEtrogFactory, { + constructorArgs: [ + polygonZkEVMGlobalExitRoot.target, + polTokenContract.target, + polygonZkEVMBridgeContract.target, + rollupManagerContract.target, + ], + unsafeAllow: ["constructor", "state-variable-immutable"], + } as any); + + await expect(rollupManagerContract.connect(timelock).updateRollup(newZKEVMAddress, etrogRollupType, "0x")) + .to.emit(rollupManagerContract, "UpdateRollup") + .withArgs(newRollupTypeID, etrogRollupType, newVerifiedBatch); + + // Check mapping on rollup Manager + const rollupDataFinal = await rollupManagerContract.rollupIDToRollupData(newCreatedRollupID); + expect(rollupDataFinal.rollupContract).to.be.equal(newZKEVMAddress); + expect(rollupDataFinal.chainID).to.be.equal(chainID); + expect(rollupDataFinal.verifier).to.be.equal(verifierContract.target); + expect(rollupDataFinal.forkID).to.be.equal(forkID); + expect(rollupDataFinal.lastLocalExitRoot).to.be.equal(newLocalExitRoot); + expect(rollupDataFinal.lastBatchSequenced).to.be.equal(newVerifiedBatch); + expect(rollupDataFinal.lastVerifiedBatch).to.be.equal(newVerifiedBatch); + expect(rollupDataFinal.lastPendingState).to.be.equal(0); + expect(rollupDataFinal.lastPendingStateConsolidated).to.be.equal(0); + expect(rollupDataFinal.lastVerifiedBatchBeforeUpgrade).to.be.equal(newVerifiedBatch); + expect(rollupDataFinal.rollupTypeID).to.be.equal(etrogRollupType); + expect(rollupDataFinal.rollupCompatibilityID).to.be.equal(0); + }); + it("Should test obsolete rollup", async () => { const forkID = 0; const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001"; From 5605ec9f41548b8bea15a3b5a7d098471f7cc645 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Sat, 18 Nov 2023 14:26:13 +0300 Subject: [PATCH 093/230] moar tests --- contracts/v2/PolygonZkEVMGlobalExitRootV2.sol | 28 +- test/contractsv2/BridgeV2GasTokens.test.ts | 1573 +++++++++++++++++ .../PolygonGlobalExitRootV2.test.ts | 158 ++ test/contractsv2/PolygonRollupManager.test.ts | 372 ++++ 4 files changed, 2124 insertions(+), 7 deletions(-) create mode 100644 test/contractsv2/BridgeV2GasTokens.test.ts create mode 100644 test/contractsv2/PolygonGlobalExitRootV2.test.ts diff --git a/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol b/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol index a7f3dc601..5a918de78 100644 --- a/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol +++ b/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol @@ -8,7 +8,6 @@ import "../lib/GlobalExitRootLib.sol"; import "./lib/DepositContractBase.sol"; /// review Possible renaming to PolygonGlobalExitRootManager -// TODO tests /** * Contract responsible for managing the exit roots across multiple networks */ @@ -70,12 +69,10 @@ contract PolygonZkEVMGlobalExitRootV2 is // save new leaf in L1InfoTree _addLeaf( - keccak256( - abi.encodePacked( - newGlobalExitRoot, - lastBlockHash, - uint64(block.timestamp) - ) + getLeafValue( + newGlobalExitRoot, + lastBlockHash, + uint64(block.timestamp) ) ); @@ -108,4 +105,21 @@ contract PolygonZkEVMGlobalExitRootV2 is { return super.getRoot(); } + + /** + * @notice Given the leaf data returns the leaf hash + * @param newGlobalExitRoot Last global exit root + * @param lastBlockHash Last accesible block hash + * @param timestamp Ethereum timestamp in seconds + */ + function getLeafValue( + bytes32 newGlobalExitRoot, + uint256 lastBlockHash, + uint64 timestamp + ) public pure returns (bytes32) { + return + keccak256( + abi.encodePacked(newGlobalExitRoot, lastBlockHash, timestamp) + ); + } } diff --git a/test/contractsv2/BridgeV2GasTokens.test.ts b/test/contractsv2/BridgeV2GasTokens.test.ts new file mode 100644 index 000000000..a635cb343 --- /dev/null +++ b/test/contractsv2/BridgeV2GasTokens.test.ts @@ -0,0 +1,1573 @@ +import {expect} from "chai"; +import {ethers, upgrades} from "hardhat"; +import { + VerifierRollupHelperMock, + ERC20PermitMock, + PolygonRollupManagerMock, + PolygonZkEVMGlobalExitRoot, + PolygonZkEVMBridgeV2, + PolygonZkEVMV2, + PolygonRollupBase, + TokenWrapped, +} from "../../typechain-types"; +import {takeSnapshot, time} from "@nomicfoundation/hardhat-network-helpers"; +import {processorUtils, contractUtils, MTBridge, mtBridgeUtils} from "@0xpolygonhermez/zkevm-commonjs"; +const {calculateSnarkInput, calculateAccInputHash, calculateBatchHashData} = contractUtils; +const MerkleTreeBridge = MTBridge; +const {verifyMerkleProof, getLeafValue} = mtBridgeUtils; +import {setBalance} from "@nomicfoundation/hardhat-network-helpers"; + +function calculateGlobalExitRoot(mainnetExitRoot: any, rollupExitRoot: any) { + return ethers.solidityPackedKeccak256(["bytes32", "bytes32"], [mainnetExitRoot, rollupExitRoot]); +} +const _GLOBAL_INDEX_MAINNET_FLAG = 2n ** 64n; + +function computeGlobalIndex(indexLocal: any, indexRollup: any, isMainnet: Boolean) { + if (isMainnet === true) { + return BigInt(indexLocal) + _GLOBAL_INDEX_MAINNET_FLAG; + } else { + return BigInt(indexLocal) + BigInt(indexRollup) * 2n ** 32n; + } +} + +describe("PolygonZkEVMBridge Gas tokens tests", () => { + let polygonZkEVMBridgeContract: PolygonZkEVMBridgeV2; + let polTokenContract: ERC20PermitMock; + let polygonZkEVMGlobalExitRoot: PolygonZkEVMGlobalExitRoot; + + let deployer: any; + let rollupManager: any; + let acc1: any; + + const tokenName = "Matic Token"; + const tokenSymbol = "MATIC"; + const decimals = 18; + const tokenInitialBalance = ethers.parseEther("20000000"); + const metadataToken = ethers.AbiCoder.defaultAbiCoder().encode( + ["string", "string", "uint8"], + [tokenName, tokenSymbol, decimals] + ); + const networkIDMainnet = 0; + const networkIDRollup = 1; + + const LEAF_TYPE_ASSET = 0; + const LEAF_TYPE_MESSAGE = 1; + + const polygonZkEVMAddress = ethers.ZeroAddress; + + let gasTokenAddress: any; + let gasTokenNetwork: any; + let gasTokenMetadata: any; + let WETHToken: TokenWrapped; + + beforeEach("Deploy contracts", async () => { + // load signers + [deployer, rollupManager, acc1] = await ethers.getSigners(); + + // deploy PolygonZkEVMBridge + const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + polygonZkEVMBridgeContract = (await upgrades.deployProxy(polygonZkEVMBridgeFactory, [], { + initializer: false, + })) as unknown as PolygonZkEVMBridgeV2; + + // deploy global exit root manager + const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRoot"); + polygonZkEVMGlobalExitRoot = await PolygonZkEVMGlobalExitRootFactory.deploy( + rollupManager.address, + polygonZkEVMBridgeContract.target + ); + + // deploy token + const maticTokenFactory = await ethers.getContractFactory("ERC20PermitMock"); + polTokenContract = await maticTokenFactory.deploy( + tokenName, + tokenSymbol, + deployer.address, + tokenInitialBalance + ); + + gasTokenAddress = polTokenContract.target; + gasTokenNetwork = 0; + gasTokenMetadata = metadataToken; + + await polygonZkEVMBridgeContract.initialize( + networkIDMainnet, + polTokenContract.target, // zero for ether + 0, // zero for ether + polygonZkEVMGlobalExitRoot.target, + rollupManager.address, + metadataToken + ); + + // calculate the weth address: + const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); + // create2 parameters + const minimalBytecodeProxy = tokenWrappedFactory.bytecode; + const WETHName = "Wrapped Ether"; + const WETHSymbol = "WETH"; + const WETHDecimals = 18; + const metadataWETH = ethers.AbiCoder.defaultAbiCoder().encode( + ["string", "string", "uint8"], + [WETHName, WETHSymbol, WETHDecimals] + ); + + const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataWETH]); + const precalculatedWeth = await ethers.getCreate2Address( + polygonZkEVMBridgeContract.target as string, + ethers.ZeroHash, // zero only for weth + hashInitCode + ); + WETHToken = tokenWrappedFactory.attach(precalculatedWeth) as TokenWrapped; + + expect(await polygonZkEVMBridgeContract.WETHToken()).to.be.equal(WETHToken.target); + }); + + it("should check the constructor parameters", async () => { + expect(await polygonZkEVMBridgeContract.globalExitRootManager()).to.be.equal(polygonZkEVMGlobalExitRoot.target); + expect(await polygonZkEVMBridgeContract.networkID()).to.be.equal(networkIDMainnet); + expect(await polygonZkEVMBridgeContract.polygonRollupManager()).to.be.equal(rollupManager.address); + + expect(await polygonZkEVMBridgeContract.gasTokenAddress()).to.be.equal(gasTokenAddress); + expect(await polygonZkEVMBridgeContract.gasTokenNetwork()).to.be.equal(gasTokenNetwork); + expect(await polygonZkEVMBridgeContract.gasTokenMetadata()).to.be.equal(gasTokenMetadata); + }); + + it("should PolygonZkEVM bridge asset and verify merkle proof", async () => { + const depositCount = await polygonZkEVMBridgeContract.depositCount(); + const originNetwork = networkIDMainnet; + const tokenAddress = polTokenContract.target; + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDRollup; + const destinationAddress = deployer.address; + + const metadata = metadataToken; + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + const balanceDeployer = await polTokenContract.balanceOf(deployer.address); + const balanceBridge = await polTokenContract.balanceOf(polygonZkEVMBridgeContract.target); + + const rollupExitRoot = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + + // create a new deposit + await expect(polTokenContract.approve(polygonZkEVMBridgeContract.target, amount)) + .to.emit(polTokenContract, "Approval") + .withArgs(deployer.address, polygonZkEVMBridgeContract.target, amount); + + // pre compute root merkle tree in Js + const height = 32; + const merkleTree = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + merkleTree.add(leafValue); + const rootJSMainnet = merkleTree.getRoot(); + + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount, + tokenAddress, + true, + "0x", + {value: 1} + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "MsgValueNotZero"); + + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount, + tokenAddress, + true, + "0x" + ) + ) + .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .withArgs( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata, + depositCount + ) + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .withArgs(rootJSMainnet, rollupExitRoot); + + expect(await polTokenContract.balanceOf(deployer.address)).to.be.equal(balanceDeployer - amount); + expect(await polTokenContract.balanceOf(polygonZkEVMBridgeContract.target)).to.be.equal(balanceBridge + amount); + expect(await polygonZkEVMBridgeContract.lastUpdatedDepositCount()).to.be.equal(1); + + // check merkle root with SC + const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); + expect(rootSCMainnet).to.be.equal(rootJSMainnet); + + // check merkle proof + const proof = merkleTree.getProofTreeByIndex(0); + const index = 0; + + // verify merkle proof + expect(verifyMerkleProof(leafValue, proof, index, rootSCMainnet)).to.be.equal(true); + expect(await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proof, index, rootSCMainnet)).to.be.equal( + true + ); + + const computedGlobalExitRoot = calculateGlobalExitRoot(rootJSMainnet, rollupExitRoot); + expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + }); + + it("should PolygonZkEVMBridge message and verify merkle proof", async () => { + const depositCount = await polygonZkEVMBridgeContract.depositCount(); + const originNetwork = networkIDMainnet; + const originAddress = deployer.address; + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDRollup; + const destinationAddress = deployer.address; + + const metadata = metadataToken; + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + const rollupExitRoot = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + + // pre compute root merkle tree in Js + const height = 32; + const merkleTree = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_MESSAGE, + originNetwork, + originAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + merkleTree.add(leafValue); + const rootJSMainnet = merkleTree.getRoot(); + + // using gas TOkens cannot use bridge message with etther + await expect( + polygonZkEVMBridgeContract.bridgeMessage(destinationNetwork, destinationAddress, true, metadata, { + value: amount, + }) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "NoValueInMessagesOnGasTokenNetworks"); + + // Use bridgeMessageWETH instead! + + // cannot use value + await expect( + polygonZkEVMBridgeContract.bridgeMessageWETH( + destinationNetwork, + destinationAddress, + amount, + true, + metadata, + { + value: amount, + } + ) + ).to.be.reverted; + + // Use bridgeMessageWETH instead! + await expect( + polygonZkEVMBridgeContract.bridgeMessageWETH(destinationNetwork, destinationAddress, amount, true, metadata) + ).to.be.revertedWith("ERC20: burn amount exceeds balance"); + + // Mock mint weth + await ethers.provider.send("hardhat_impersonateAccount", [polygonZkEVMBridgeContract.target]); + const bridgeMock = await ethers.getSigner(polygonZkEVMBridgeContract.target as any); + + await WETHToken.connect(bridgeMock).mint(deployer.address, amount, {gasPrice: 0}); + + await expect( + polygonZkEVMBridgeContract.bridgeMessageWETH(destinationNetwork, destinationAddress, amount, true, metadata) + ) + .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .withArgs( + LEAF_TYPE_MESSAGE, + originNetwork, + originAddress, + destinationNetwork, + destinationAddress, + amount, + metadata, + depositCount + ); + + // check merkle root with SC + const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); + expect(rootSCMainnet).to.be.equal(rootJSMainnet); + + // check merkle proof + const proof = merkleTree.getProofTreeByIndex(0); + const index = 0; + + // verify merkle proof + expect(verifyMerkleProof(leafValue, proof, index, rootSCMainnet)).to.be.equal(true); + expect(await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proof, index, rootSCMainnet)).to.be.equal( + true + ); + + const computedGlobalExitRoot = calculateGlobalExitRoot(rootJSMainnet, rollupExitRoot); + expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + + // bridge message without value is fine + await expect( + polygonZkEVMBridgeContract.bridgeMessage(destinationNetwork, destinationAddress, true, metadata, {}) + ) + .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .withArgs( + LEAF_TYPE_MESSAGE, + originNetwork, + originAddress, + destinationNetwork, + destinationAddress, + 0, + metadata, + depositCount + 1n + ); + }); + + it("should PolygonZkEVM bridge asset and message to check global exit root updates", async () => { + const depositCount = await polygonZkEVMBridgeContract.depositCount(); + const originNetwork = networkIDMainnet; + const tokenAddress = polTokenContract.target; + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDRollup; + const destinationAddress = deployer.address; + + const metadata = metadataToken; + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + const balanceDeployer = await polTokenContract.balanceOf(deployer.address); + const balanceBridge = await polTokenContract.balanceOf(polygonZkEVMBridgeContract.target); + + const rollupExitRoot = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + + // create a new deposit + await expect(polTokenContract.approve(polygonZkEVMBridgeContract.target, amount)) + .to.emit(polTokenContract, "Approval") + .withArgs(deployer.address, polygonZkEVMBridgeContract.target, amount); + + // pre compute root merkle tree in Js + const height = 32; + const merkleTree = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + merkleTree.add(leafValue); + const rootJSMainnet = merkleTree.getRoot(); + + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount, + tokenAddress, + false, + "0x" + ) + ) + .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .withArgs( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata, + depositCount + ); + + expect(await polTokenContract.balanceOf(deployer.address)).to.be.equal(balanceDeployer - amount); + expect(await polTokenContract.balanceOf(polygonZkEVMBridgeContract.target)).to.be.equal(balanceBridge + amount); + expect(await polygonZkEVMBridgeContract.lastUpdatedDepositCount()).to.be.equal(0); + expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(ethers.ZeroHash); + + // check merkle root with SC + const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); + expect(rootSCMainnet).to.be.equal(rootJSMainnet); + + // Update global exit root + await expect(polygonZkEVMBridgeContract.updateGlobalExitRoot()) + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .withArgs(rootJSMainnet, rollupExitRoot); + + // no state changes since there are not any deposit pending to be updated + await polygonZkEVMBridgeContract.updateGlobalExitRoot(); + expect(await polygonZkEVMBridgeContract.lastUpdatedDepositCount()).to.be.equal(1); + expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(rootJSMainnet); + + const computedGlobalExitRoot = calculateGlobalExitRoot(rootJSMainnet, rollupExitRoot); + expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + + // bridge message + await expect( + polygonZkEVMBridgeContract.bridgeMessage(destinationNetwork, destinationAddress, false, metadata, { + value: amount, + }) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "NoValueInMessagesOnGasTokenNetworks"); + + // Mock mint weth + await ethers.provider.send("hardhat_impersonateAccount", [polygonZkEVMBridgeContract.target]); + const bridgeMock = await ethers.getSigner(polygonZkEVMBridgeContract.target as any); + await WETHToken.connect(bridgeMock).mint(deployer.address, amount, {gasPrice: 0}); + + await expect( + polygonZkEVMBridgeContract.bridgeMessageWETH( + destinationNetwork, + destinationAddress, + amount, + false, + metadata + ) + ) + .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .withArgs( + LEAF_TYPE_MESSAGE, + originNetwork, + deployer.address, + destinationNetwork, + destinationAddress, + amount, + metadata, + 1 + ); + expect(await polygonZkEVMBridgeContract.lastUpdatedDepositCount()).to.be.equal(1); + expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(rootJSMainnet); + + // Update global exit root + await expect(polygonZkEVMBridgeContract.updateGlobalExitRoot()).to.emit( + polygonZkEVMGlobalExitRoot, + "UpdateGlobalExitRoot" + ); + + expect(await polygonZkEVMBridgeContract.lastUpdatedDepositCount()).to.be.equal(2); + expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.not.be.equal(rootJSMainnet); + + // Just to have the metric of a low cost bridge Asset + const tokenAddress2 = WETHToken.target; // Ether + const amount2 = ethers.parseEther("10"); + await WETHToken.connect(bridgeMock).mint(deployer.address, amount2, {gasPrice: 0}); + + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount2, + tokenAddress2, + false, + "0x" + ) + ) + .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .withArgs( + LEAF_TYPE_ASSET, + originNetwork, + ethers.ZeroAddress, + destinationNetwork, + destinationAddress, + amount2, + "0x", + 2 + ) + .to.emit(WETHToken, "Transfer") + .withArgs(deployer.address, ethers.ZeroAddress, amount2); + }); + + it("should claim Gas tokens from Mainnet to Mainnet", async () => { + const originNetwork = networkIDMainnet; + const tokenAddress = polTokenContract.target; + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDMainnet; + const destinationAddress = acc1.address; + + const metadata = metadataToken; + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + const rollupExitRoot = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + + // compute root merkle tree in Js + const height = 32; + const merkleTreeLocal = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + merkleTreeLocal.add(leafValue); + + const mainnetExitRoot = merkleTreeLocal.getRoot(); + const indexRollup = 0; + + // check only rollup account with update rollup exit root + await expect(polygonZkEVMGlobalExitRoot.updateExitRoot(mainnetExitRoot)).to.be.revertedWithCustomError( + polygonZkEVMGlobalExitRoot, + "OnlyAllowedContracts" + ); + + // add rollup Merkle root + await ethers.provider.send("hardhat_impersonateAccount", [polygonZkEVMBridgeContract.target]); + const bridgemoCK = await ethers.getSigner(polygonZkEVMBridgeContract.target as any); + + // await deployer.sendTransaction({ + // to: bridgemoCK.address, + // value: ethers.parseEther("1"), + // }); + + await expect(polygonZkEVMGlobalExitRoot.connect(bridgemoCK).updateExitRoot(mainnetExitRoot, {gasPrice: 0})) + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .withArgs(mainnetExitRoot, rollupExitRoot); + + // check roots + const rollupExitRootSC = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + expect(rollupExitRootSC).to.be.equal(rollupExitRoot); + const mainnetExitRootSC = await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot(); + expect(mainnetExitRootSC).to.be.equal(mainnetExitRoot); + + const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC); + expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + + // check merkle proof + + // Merkle proof local + const indexLocal = 0; + const proofLocal = merkleTreeLocal.getProofTreeByIndex(indexLocal); + + // verify merkle proof + expect(verifyMerkleProof(leafValue, proofLocal, indexLocal, mainnetExitRoot)).to.be.equal(true); + + const globalIndex = computeGlobalIndex(indexLocal, indexRollup, true); + + /* + * claim + * Can't claim without native (ether) + */ + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofLocal, + proofLocal, + globalIndex, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.reverted; + + await setBalance(polygonZkEVMBridgeContract.target as any, amount); + + expect(false).to.be.equal(await polygonZkEVMBridgeContract.isClaimed(indexLocal, indexRollup + 1)); + + const initialBalance = await ethers.provider.getBalance(polygonZkEVMBridgeContract.target); + + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofLocal, + proofLocal, + globalIndex, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata, + { + gasPrice: 0, + } + ) + ) + .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") + .withArgs(globalIndex, originNetwork, tokenAddress, destinationAddress, amount); + + // Can't claim because nullifier + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofLocal, + proofLocal, + globalIndex, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AlreadyClaimed"); + expect(true).to.be.equal(await polygonZkEVMBridgeContract.isClaimed(indexLocal, indexRollup + 1)); + + expect(initialBalance - amount).to.be.equal( + await ethers.provider.getBalance(polygonZkEVMBridgeContract.target) + ); + }); + + it("should claim tokens Gas tokens from Mainnet to Mainnet", async () => { + const originNetwork = networkIDMainnet; + const tokenAddress = polTokenContract.target; + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDMainnet; + const destinationAddress = acc1.address; + + const metadata = metadataToken; + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + const mainnetExitRoot = await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot(); + + // compute root merkle tree in Js + const height = 32; + const merkleTreeLocal = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + merkleTreeLocal.add(leafValue); + + const rootLocalRollup = merkleTreeLocal.getRoot(); + const indexRollup = 5; + + // Try claim with 10 rollup leafs + const merkleTreeRollup = new MerkleTreeBridge(height); + for (let i = 0; i < 10; i++) { + if (i == indexRollup) { + merkleTreeRollup.add(rootLocalRollup); + } else { + merkleTreeRollup.add(ethers.toBeHex(ethers.toQuantity(ethers.randomBytes(32)), 32)); + } + } + + const rootRollup = merkleTreeRollup.getRoot(); + + // check only rollup account with update rollup exit root + await expect(polygonZkEVMGlobalExitRoot.updateExitRoot(rootRollup)).to.be.revertedWithCustomError( + polygonZkEVMGlobalExitRoot, + "OnlyAllowedContracts" + ); + + // add rollup Merkle root + await expect(polygonZkEVMGlobalExitRoot.connect(rollupManager).updateExitRoot(rootRollup)) + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .withArgs(mainnetExitRoot, rootRollup); + + // check roots + const rollupExitRootSC = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + expect(rollupExitRootSC).to.be.equal(rootRollup); + + const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC); + expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + + // check merkle proof + + // Merkle proof local + const indexLocal = 0; + const proofLocal = merkleTreeLocal.getProofTreeByIndex(indexLocal); + + // Merkle proof local + const proofRollup = merkleTreeRollup.getProofTreeByIndex(indexRollup); + + // verify merkle proof + expect(verifyMerkleProof(rootLocalRollup, proofRollup, indexRollup, rootRollup)).to.be.equal(true); + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(rootLocalRollup, proofRollup, indexRollup, rootRollup) + ).to.be.equal(true); + const globalIndex = computeGlobalIndex(indexLocal, indexRollup, false); + /* + * claim + * Can't claim without tokens + */ + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofLocal, + proofRollup, + Number(globalIndex), + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.reverted; + + await setBalance(polygonZkEVMBridgeContract.target as any, amount); + + expect(false).to.be.equal(await polygonZkEVMBridgeContract.isClaimed(indexLocal, indexRollup + 1)); + + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofLocal, + proofRollup, + globalIndex, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ) + .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") + .withArgs(globalIndex, originNetwork, tokenAddress, destinationAddress, amount); + + // Can't claim because nullifier + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofLocal, + proofRollup, + globalIndex, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AlreadyClaimed"); + expect(true).to.be.equal(await polygonZkEVMBridgeContract.isClaimed(indexLocal, indexRollup + 1)); + }); + + it("should claim tokens from Rollup to Mainnet", async () => { + const originNetwork = networkIDRollup; + const tokenAddress = polTokenContract.target; + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDMainnet; + const destinationAddress = deployer.address; + + const metadata = metadataToken; + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + const mainnetExitRoot = await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot(); + + // compute root merkle tree in Js + const height = 32; + const merkleTreeLocal = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + merkleTreeLocal.add(leafValue); + merkleTreeLocal.add(leafValue); + + const rootLocalRollup = merkleTreeLocal.getRoot(); + + // Try claim with 10 rollup leafs + const merkleTreeRollup = new MerkleTreeBridge(height); + for (let i = 0; i < 10; i++) { + merkleTreeRollup.add(rootLocalRollup); + } + + const rootRollup = merkleTreeRollup.getRoot(); + + // check only rollup account with update rollup exit root + await expect(polygonZkEVMGlobalExitRoot.updateExitRoot(rootRollup)).to.be.revertedWithCustomError( + polygonZkEVMGlobalExitRoot, + "OnlyAllowedContracts" + ); + + // add rollup Merkle root + await expect(polygonZkEVMGlobalExitRoot.connect(rollupManager).updateExitRoot(rootRollup)) + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .withArgs(mainnetExitRoot, rootRollup); + + // check roots + const rollupExitRootSC = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + expect(rollupExitRootSC).to.be.equal(rootRollup); + + const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC); + expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + + // check merkle proof + + // Merkle proof local + const indexLocal = 0; + const proofLocal = merkleTreeLocal.getProofTreeByIndex(indexLocal); + + // Merkle proof local + const indexRollup = 5; + const proofRollup = merkleTreeRollup.getProofTreeByIndex(indexRollup); + + // verify merkle proof + expect(verifyMerkleProof(leafValue, proofLocal, indexLocal, rootLocalRollup)).to.be.equal(true); + expect(verifyMerkleProof(rootLocalRollup, proofRollup, indexRollup, rootRollup)).to.be.equal(true); + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(rootLocalRollup, proofRollup, indexRollup, rootRollup) + ).to.be.equal(true); + const globalIndex = computeGlobalIndex(indexLocal, indexRollup, false); + + expect(false).to.be.equal(await polygonZkEVMBridgeContract.isClaimed(indexLocal, indexRollup + 1)); + + // claim + const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); + // create2 parameters + const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]); + const minimalBytecodeProxy = tokenWrappedFactory.bytecode; + const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]); + const precalculateWrappedErc20 = await ethers.getCreate2Address( + polygonZkEVMBridgeContract.target as string, + salt, + hashInitCode + ); + const newWrappedToken = tokenWrappedFactory.attach(precalculateWrappedErc20) as TokenWrapped; + + // Use precalculatedWrapperAddress and check if matches + expect( + await polygonZkEVMBridgeContract.precalculatedWrapperAddress( + networkIDRollup, + tokenAddress, + tokenName, + tokenSymbol, + decimals + ) + ).to.be.equal(precalculateWrappedErc20); + + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofLocal, + proofRollup, + globalIndex, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ) + .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") + .withArgs(globalIndex, originNetwork, tokenAddress, destinationAddress, amount) + .to.emit(polygonZkEVMBridgeContract, "NewWrappedToken") + .withArgs(originNetwork, tokenAddress, precalculateWrappedErc20, metadata) + .to.emit(newWrappedToken, "Transfer") + .withArgs(ethers.ZeroAddress, destinationAddress, amount); + + const newTokenInfo = await polygonZkEVMBridgeContract.wrappedTokenToTokenInfo(precalculateWrappedErc20); + + expect(newTokenInfo.originNetwork).to.be.equal(networkIDRollup); + expect(newTokenInfo.originTokenAddress).to.be.equal(tokenAddress); + expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( + precalculateWrappedErc20 + ); + expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( + precalculateWrappedErc20 + ); + + expect(await polygonZkEVMBridgeContract.tokenInfoToWrappedToken(salt)).to.be.equal(precalculateWrappedErc20); + + // Check the wrapper info + expect(await newWrappedToken.name()).to.be.equal(tokenName); + expect(await newWrappedToken.symbol()).to.be.equal(tokenSymbol); + expect(await newWrappedToken.decimals()).to.be.equal(decimals); + + // Can't claim because nullifier + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofLocal, + proofRollup, + globalIndex, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AlreadyClaimed"); + expect(true).to.be.equal(await polygonZkEVMBridgeContract.isClaimed(indexLocal, indexRollup + 1)); + + expect(await newWrappedToken.totalSupply()).to.be.equal(amount); + + // Claim again the other leaf to mint tokens + const index2 = 1; + const proof2 = merkleTreeLocal.getProofTreeByIndex(index2); + + expect(verifyMerkleProof(leafValue, proof2, index2, rootLocalRollup)).to.be.equal(true); + expect(verifyMerkleProof(rootLocalRollup, proofRollup, indexRollup, rollupExitRootSC)).to.be.equal(true); + + const globalIndex2 = computeGlobalIndex(index2, indexRollup, false); + await expect( + polygonZkEVMBridgeContract.claimAsset( + proof2, + proofRollup, + globalIndex2, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ) + .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") + .withArgs(globalIndex2, originNetwork, tokenAddress, destinationAddress, amount) + .to.emit(newWrappedToken, "Transfer") + .withArgs(ethers.ZeroAddress, destinationAddress, amount); + + // Burn Tokens + const depositCount = await polygonZkEVMBridgeContract.depositCount(); + const wrappedTokenAddress = newWrappedToken.target; + const newDestinationNetwork = networkIDRollup; + + const rollupExitRoot = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + + // create a new deposit + await expect(newWrappedToken.approve(polygonZkEVMBridgeContract.target, amount)) + .to.emit(newWrappedToken, "Approval") + .withArgs(deployer.address, polygonZkEVMBridgeContract.target, amount); + + /* + * pre compute root merkle tree in Js + * const height = 32; + */ + const merkleTreeMainnet = new MerkleTreeBridge(height); + // Imporant calcualte leaf with origin token address no wrapped token address + const originTokenAddress = tokenAddress; + const metadataMainnet = metadata; // since the token does not belong to this network + const metadataHashMainnet = ethers.solidityPackedKeccak256(["bytes"], [metadataMainnet]); + + const leafValueMainnet = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + originTokenAddress, + newDestinationNetwork, + destinationAddress, + amount, + metadataHashMainnet + ); + const leafValueMainnetSC = await polygonZkEVMBridgeContract.getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + originTokenAddress, + newDestinationNetwork, + destinationAddress, + amount, + metadataHashMainnet + ); + + expect(leafValueMainnet).to.be.equal(leafValueMainnetSC); + merkleTreeMainnet.add(leafValueMainnet); + const rootJSMainnet = merkleTreeMainnet.getRoot(); + + // Tokens are burnt + expect(await newWrappedToken.totalSupply()).to.be.equal(amount * 2n); + expect(await newWrappedToken.balanceOf(destinationAddress)).to.be.equal(amount * 2n); + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + newDestinationNetwork, + destinationAddress, + amount, + wrappedTokenAddress, + true, + "0x" + ) + ) + .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .withArgs( + LEAF_TYPE_ASSET, + originNetwork, + originTokenAddress, + newDestinationNetwork, + destinationAddress, + amount, + metadataMainnet, + depositCount + ) + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .withArgs(rootJSMainnet, rollupExitRoot) + .to.emit(newWrappedToken, "Transfer") + .withArgs(deployer.address, ethers.ZeroAddress, amount); + + expect(await newWrappedToken.totalSupply()).to.be.equal(amount); + expect(await newWrappedToken.balanceOf(deployer.address)).to.be.equal(amount); + expect(await newWrappedToken.balanceOf(polygonZkEVMBridgeContract.target)).to.be.equal(0); + + // check merkle root with SC + const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); + expect(rootSCMainnet).to.be.equal(rootJSMainnet); + + // check merkle proof + const proofMainnet = merkleTreeMainnet.getProofTreeByIndex(0); + const indexMainnet = 0; + + // verify merkle proof + expect(verifyMerkleProof(leafValueMainnet, proofMainnet, indexMainnet, rootSCMainnet)).to.be.equal(true); + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof( + leafValueMainnet, + proofMainnet, + indexMainnet, + rootSCMainnet + ) + ).to.be.equal(true); + + const computedGlobalExitRoot2 = calculateGlobalExitRoot(rootJSMainnet, rollupExitRoot); + expect(computedGlobalExitRoot2).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + }); + + it("should PolygonZkEVMBridge and sync the current root with events", async () => { + const depositCount = await polygonZkEVMBridgeContract.depositCount(); + const originNetwork = networkIDMainnet; + const tokenAddress = ethers.ZeroAddress; // gasToken + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDRollup; + const destinationAddress = deployer.address; + + const metadata = "0x"; // since is ether does not have metadata + + // create 3 new deposit + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount, + tokenAddress, + true, + "0x", + {value: amount} + ) + ) + .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .withArgs( + LEAF_TYPE_ASSET, + originNetwork, + gasTokenAddress, + destinationNetwork, + destinationAddress, + amount, + gasTokenMetadata, + depositCount + ); + + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount, + tokenAddress, + true, + "0x", + {value: amount} + ) + ) + .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .withArgs( + LEAF_TYPE_ASSET, + originNetwork, + gasTokenAddress, + destinationNetwork, + destinationAddress, + amount, + gasTokenMetadata, + depositCount + 1n + ); + + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount, + tokenAddress, + true, + "0x", + {value: amount} + ) + ) + .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .withArgs( + LEAF_TYPE_ASSET, + originNetwork, + gasTokenAddress, + destinationNetwork, + destinationAddress, + amount, + gasTokenMetadata, + depositCount + 2n + ); + + // Prepare merkle tree + const height = 32; + const merkleTree = new MerkleTreeBridge(height); + + // Get the deposit's events + const filter = polygonZkEVMBridgeContract.filters.BridgeEvent( + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined + ); + const events = await polygonZkEVMBridgeContract.queryFilter(filter, 0, "latest"); + events.forEach((e) => { + const {args} = e; + const leafValue = getLeafValue( + args.leafType, + args.originNetwork, + args.originAddress, + args.destinationNetwork, + args.destinationAddress, + args.amount, + ethers.solidityPackedKeccak256(["bytes"], [args.metadata]) + ); + merkleTree.add(leafValue); + }); + + // Check merkle root with SC + const rootSC = await polygonZkEVMBridgeContract.getRoot(); + const rootJS = merkleTree.getRoot(); + + expect(rootSC).to.be.equal(rootJS); + }); + + it("should claim testing all the asserts", async () => { + // Add a claim leaf to rollup exit tree + const originNetwork = networkIDMainnet; + const tokenAddress = polTokenContract.target; + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDMainnet; + const destinationAddress = deployer.address; + + const metadata = metadataToken; + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + const mainnetExitRoot = await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot(); + + // compute root merkle tree in Js + const height = 32; + const merkleTree = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + merkleTree.add(leafValue); + + // check merkle root with SC + const rootJSRollup = merkleTree.getRoot(); + + // Try claim with 10 rollup leafs + const merkleTreeRollup = new MerkleTreeBridge(height); + merkleTreeRollup.add(rootJSRollup); + const rollupRoot = merkleTreeRollup.getRoot(); + + // add rollup Merkle root + await expect(polygonZkEVMGlobalExitRoot.connect(rollupManager).updateExitRoot(rollupRoot)) + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .withArgs(mainnetExitRoot, rollupRoot); + + // check roots + const rollupExitRootSC = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + expect(rollupExitRootSC).to.be.equal(rollupRoot); + + const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC); + expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + + // check merkle proof + const index = 0; + const proofLocal = merkleTree.getProofTreeByIndex(0); + const proofRollup = merkleTreeRollup.getProofTreeByIndex(0); + + // verify merkle proof + expect(verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)).to.be.equal(true); + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup) + ).to.be.equal(true); + + const globalIndex = computeGlobalIndex(index, index, false); + // Can't claim without tokens + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofLocal, + proofRollup, + globalIndex, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.reverted; + + await setBalance(polygonZkEVMBridgeContract.target as any, amount); + + // Check Destination network does not match assert + // await expect( + // polygonZkEVMBridgeContract.claimAsset( + // proofLocal, + // proofRollup, + // globalIndex, + // mainnetExitRoot, + // rollupExitRootSC, + // originNetwork, + // tokenAddress, + // destinationNetwork, + // destinationAddress, + // amount, + // metadata + // ) + // ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "DestinationNetworkInvalid"); + + // Check GlobalExitRoot invalid assert + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofLocal, + proofRollup, + globalIndex, + mainnetExitRoot, + mainnetExitRoot, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "GlobalExitRootInvalid"); + + // Check Invalid smt proof assert + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofLocal, + proofRollup, + globalIndex + 1n, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "InvalidSmtProof"); + + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofLocal, + proofRollup, + globalIndex, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ) + .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") + .withArgs(index, originNetwork, tokenAddress, destinationAddress, amount); + + // Check Already claimed_claim + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofLocal, + proofRollup, + globalIndex, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AlreadyClaimed"); + }); + + it("should claim ether", async () => { + // Add a claim leaf to rollup exit tree + const originNetwork = networkIDMainnet; + const tokenAddress = ethers.ZeroAddress; // ether + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDMainnet; + const destinationAddress = deployer.address; + + const metadata = "0x"; // since is ether does not have metadata + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + const mainnetExitRoot = await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot(); + + // compute root merkle tree in Js + const height = 32; + const merkleTree = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + merkleTree.add(leafValue); + + // check merkle root with SC + const rootJSRollup = merkleTree.getRoot(); + const merkleTreeRollup = new MerkleTreeBridge(height); + merkleTreeRollup.add(rootJSRollup); + const rollupRoot = merkleTreeRollup.getRoot(); + + // add rollup Merkle root + await expect(polygonZkEVMGlobalExitRoot.connect(rollupManager).updateExitRoot(rollupRoot)) + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .withArgs(mainnetExitRoot, rollupRoot); + + // check roots + const rollupExitRootSC = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + expect(rollupExitRootSC).to.be.equal(rollupRoot); + + const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC); + expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + + // check merkle proof + const index = 0; + const proofLocal = merkleTree.getProofTreeByIndex(0); + const proofRollup = merkleTreeRollup.getProofTreeByIndex(0); + const globalIndex = computeGlobalIndex(index, index, false); + + // verify merkle proof + expect(verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)).to.be.equal(true); + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup) + ).to.be.equal(true); + + // claim weth + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofLocal, + proofRollup, + globalIndex, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ) + .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") + .withArgs(index, originNetwork, tokenAddress, destinationAddress, amount) + .to.emit(WETHToken, "Transfer") + .withArgs(ethers.ZeroAddress, deployer.address, amount); + + // Check balances after claim + expect(await WETHToken.balanceOf(deployer.address)).to.be.equal(amount); + expect(await WETHToken.totalSupply()).to.be.equal(amount); + + // Can't claim because nullifier + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofLocal, + proofRollup, + globalIndex, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AlreadyClaimed"); + }); + + it("should claim message", async () => { + // Add a claim leaf to rollup exit tree + const originNetwork = networkIDMainnet; + const tokenAddress = ethers.ZeroAddress; // ether + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDMainnet; + const destinationAddress = deployer.address; + + const metadata = "0x176923791298713271763697869132"; // since is ether does not have metadata + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + const mainnetExitRoot = await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot(); + + // compute root merkle tree in Js + const height = 32; + const merkleTree = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_MESSAGE, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + merkleTree.add(leafValue); + + // check merkle root with SC + const rootJSRollup = merkleTree.getRoot(); + const merkleTreeRollup = new MerkleTreeBridge(height); + merkleTreeRollup.add(rootJSRollup); + const rollupRoot = merkleTreeRollup.getRoot(); + + // add rollup Merkle root + await expect(polygonZkEVMGlobalExitRoot.connect(rollupManager).updateExitRoot(rollupRoot)) + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .withArgs(mainnetExitRoot, rollupRoot); + + // check roots + const rollupExitRootSC = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + expect(rollupExitRootSC).to.be.equal(rollupRoot); + + const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC); + expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + + // check merkle proof + const index = 0; + const proofLocal = merkleTree.getProofTreeByIndex(0); + const proofRollup = merkleTreeRollup.getProofTreeByIndex(0); + const globalIndex = computeGlobalIndex(index, index, false); + + // verify merkle proof + expect(verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)).to.be.equal(true); + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup) + ).to.be.equal(true); + + /* + * claim + * Can't claim a message as an assets + */ + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofLocal, + proofRollup, + globalIndex, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "InvalidSmtProof"); + + const balanceDeployer = await ethers.provider.getBalance(deployer.address); + + // Check mainnet destination assert + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofLocal, + proofRollup, + globalIndex, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "InvalidSmtProof"); + + await expect( + polygonZkEVMBridgeContract.claimMessage( + proofLocal, + proofRollup, + globalIndex, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ) + .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") + .withArgs(index, originNetwork, tokenAddress, destinationAddress, amount) + .to.emit(WETHToken, "Transfer") + .withArgs(ethers.ZeroAddress, deployer.address, amount); + + // Check balances after claim + expect(await WETHToken.balanceOf(deployer.address)).to.be.equal(amount); + expect(await WETHToken.totalSupply()).to.be.equal(amount); + + // Can't claim because nullifier + await expect( + polygonZkEVMBridgeContract.claimMessage( + proofLocal, + proofRollup, + globalIndex, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AlreadyClaimed"); + }); +}); diff --git a/test/contractsv2/PolygonGlobalExitRootV2.test.ts b/test/contractsv2/PolygonGlobalExitRootV2.test.ts new file mode 100644 index 000000000..eb774efc0 --- /dev/null +++ b/test/contractsv2/PolygonGlobalExitRootV2.test.ts @@ -0,0 +1,158 @@ +/* eslint-disable no-plusplus, no-await-in-loop */ +import {expect} from "chai"; +import {ethers, upgrades} from "hardhat"; +import { + VerifierRollupHelperMock, + ERC20PermitMock, + PolygonRollupManagerMock, + PolygonZkEVMGlobalExitRoot, + PolygonZkEVMGlobalExitRootV2, + PolygonZkEVMBridgeV2, + PolygonZkEVMV2, + PolygonRollupBase, + TokenWrapped, + Address, + PolygonZkEVM, + PolygonZkEVMV2Existent, +} from "../../typechain-types"; +import {takeSnapshot, time} from "@nomicfoundation/hardhat-network-helpers"; +import {processorUtils, contractUtils, MTBridge, mtBridgeUtils} from "@0xpolygonhermez/zkevm-commonjs"; +const {calculateSnarkInput, calculateAccInputHash, calculateBatchHashData} = contractUtils; + +type BatchDataStruct = PolygonRollupBase.BatchDataStruct; + +const MerkleTreeBridge = MTBridge; +const {verifyMerkleProof, getLeafValue} = mtBridgeUtils; + +function calculateGlobalExitRoot(mainnetExitRoot: any, rollupExitRoot: any) { + return ethers.solidityPackedKeccak256(["bytes32", "bytes32"], [mainnetExitRoot, rollupExitRoot]); +} +const _GLOBAL_INDEX_MAINNET_FLAG = 2n ** 64n; + +function computeGlobalIndex(indexLocal: any, indexRollup: any, isMainnet: Boolean) { + if (isMainnet === true) { + return BigInt(indexLocal) + _GLOBAL_INDEX_MAINNET_FLAG; + } else { + return BigInt(indexLocal) + BigInt(indexRollup) * 2n ** 32n; + } +} + +function calculateGlobalExitRootLeaf(newGlobalExitRoot: any, lastBlockHash: any, timestamp: any) { + return ethers.solidityPackedKeccak256( + ["bytes32", "bytes32", "uint64"], + [newGlobalExitRoot, lastBlockHash, timestamp] + ); +} +describe("Polygon ZK-EVM TestnetV2", () => { + let deployer: any; + let rollupManager: any; + let bridge: any; + + let polygonZkEVMGlobalExitRoot: PolygonZkEVMGlobalExitRoot; + let polygonZkEVMGlobalExitRootV2: PolygonZkEVMGlobalExitRootV2; + + beforeEach("Deploy contract", async () => { + upgrades.silenceWarnings(); + + // load signers + [deployer, bridge, rollupManager] = await ethers.getSigners(); + + // deploy globalExitRoot + const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRoot"); + polygonZkEVMGlobalExitRoot = (await upgrades.deployProxy(PolygonZkEVMGlobalExitRootFactory, [], { + initializer: false, + constructorArgs: [rollupManager.address, bridge.address], + unsafeAllow: ["constructor", "state-variable-immutable"], + })) as any; + + expect(await polygonZkEVMGlobalExitRoot.rollupAddress()).to.be.equal(rollupManager.address); + + const PolygonZkEVMGlobalExitRootV2Factory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRootV2"); + await upgrades.upgradeProxy(polygonZkEVMGlobalExitRoot.target, PolygonZkEVMGlobalExitRootV2Factory, { + constructorArgs: [rollupManager.address, bridge.address], + unsafeAllow: ["constructor", "state-variable-immutable"], + }); + + polygonZkEVMGlobalExitRootV2 = (await PolygonZkEVMGlobalExitRootV2Factory.attach( + polygonZkEVMGlobalExitRoot.target + )) as PolygonZkEVMGlobalExitRootV2; + }); + + it("should check the initalized parameters", async () => { + expect(await polygonZkEVMGlobalExitRootV2.bridgeAddress()).to.be.equal(bridge.address); + expect(await polygonZkEVMGlobalExitRootV2.rollupManager()).to.be.equal(rollupManager.address); + expect(polygonZkEVMGlobalExitRoot.rollupAddress()).to.be.reverted; + + expect(await polygonZkEVMGlobalExitRootV2.lastRollupExitRoot()).to.be.equal(ethers.ZeroHash); + expect(await polygonZkEVMGlobalExitRootV2.lastMainnetExitRoot()).to.be.equal(ethers.ZeroHash); + }); + + it("should update root and check global exit root", async () => { + const newRootRollup = ethers.hexlify(ethers.randomBytes(32)); + await expect(polygonZkEVMGlobalExitRootV2.updateExitRoot(newRootRollup)).to.be.revertedWithCustomError( + polygonZkEVMGlobalExitRootV2, + "OnlyAllowedContracts" + ); + const blockUpdates = []; + + // Update root from the rollup + await expect(polygonZkEVMGlobalExitRootV2.connect(rollupManager).updateExitRoot(newRootRollup)) + .to.emit(polygonZkEVMGlobalExitRootV2, "UpdateGlobalExitRoot") + .withArgs(ethers.ZeroHash, newRootRollup); + + blockUpdates.push({ + block: await ethers.provider.getBlock("latest"), + globalExitRoot: calculateGlobalExitRoot(ethers.ZeroHash, newRootRollup), + }); + + expect(await polygonZkEVMGlobalExitRootV2.getLastGlobalExitRoot()).to.be.equal( + calculateGlobalExitRoot(ethers.ZeroHash, newRootRollup) + ); + + // Update root from the PolygonZkEVMBridge + const newRootBridge = ethers.hexlify(ethers.randomBytes(32)); + await expect(polygonZkEVMGlobalExitRootV2.connect(bridge).updateExitRoot(newRootBridge)) + .to.emit(polygonZkEVMGlobalExitRootV2, "UpdateGlobalExitRoot") + .withArgs(newRootBridge, newRootRollup); + + const newGlobalExitRoot = calculateGlobalExitRoot(newRootBridge, newRootRollup); + blockUpdates.push({ + block: await ethers.provider.getBlock("latest"), + globalExitRoot: newGlobalExitRoot, + }); + + expect(await polygonZkEVMGlobalExitRootV2.lastMainnetExitRoot()).to.be.equal(newRootBridge); + + expect(await polygonZkEVMGlobalExitRootV2.getLastGlobalExitRoot()).to.be.equal(newGlobalExitRoot); + + // Check the leaf created + // compute root merkle tree in Js + const height = 32; + const merkleTree = new MerkleTreeBridge(height); + + for (const blockStruct of blockUpdates) { + const {block, globalExitRoot} = blockStruct as any; + const currentBlockNumber = block?.number; + const previousBlock = await ethers.provider.getBlock((currentBlockNumber as number) - 1); + const leafValueJs = calculateGlobalExitRootLeaf(globalExitRoot, previousBlock?.hash, block?.timestamp); + const leafValueSC = await polygonZkEVMGlobalExitRootV2.getLeafValue( + globalExitRoot, + previousBlock?.hash as any, + block?.timestamp as any + ); + + expect(leafValueJs).to.be.equal(leafValueSC); + merkleTree.add(leafValueJs); + } + + const rootSC = await polygonZkEVMGlobalExitRootV2.getRoot(); + const rootJS = merkleTree.getRoot(); + + expect(rootSC).to.be.equal(rootJS); + + // check merkle proof + const index = 0; + const proof = merkleTree.getProofTreeByIndex(index); + }); + it("should synch every root through events", async () => {}); +}); diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index 16f04569a..a380959c3 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -1908,6 +1908,378 @@ describe("Polygon ZK-EVM TestnetV2", () => { expect(rollupDataFinal.rollupCompatibilityID).to.be.equal(0); }); + it("should add existing rollup and test full flow", async () => { + const urlSequencer = "http://zkevm-json-rpc:8123"; + const chainID = 1000; + const networkName = "zkevm"; + const forkID = 0; + const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001"; + const rollupCompatibilityID = 0; + const descirption = "zkevm test"; + // Native token will be ether + const gasTokenAddress = ethers.ZeroAddress; + const gasTokenNetwork = 0; + + // In order to create a new rollup type, create an implementation of the contract + + // Create zkEVM implementation + const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMV2Existent"); + const PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy( + polygonZkEVMGlobalExitRoot.target, + polTokenContract.target, + polygonZkEVMBridgeContract.target, + rollupManagerContract.target + ); + await PolygonZKEVMV2Contract.waitForDeployment(); + + // Add a new rollup type with timelock + const RollupID = 1; + + const intializeTimestmap = (await ethers.provider.getBlock("latest"))?.timestamp as any; + const initializeAccInputHash = ethers.hexlify(ethers.randomBytes(32)); + + // Initialize: + await expect( + PolygonZKEVMV2Contract.initializeUpgrade( + admin.address, + trustedSequencer.address, + urlSequencer, + networkName, + initializeAccInputHash, // last acc input hash + intializeTimestmap // timestmap + ) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "OnlyRollupManager"); + await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); + + const RollupManagerMock = await ethers.getSigner(rollupManagerContract.target as any); + + await PolygonZKEVMV2Contract.connect(RollupManagerMock).initializeUpgrade( + admin.address, + trustedSequencer.address, + urlSequencer, + networkName, + initializeAccInputHash, // last acc input hash + intializeTimestmap, // timestmap + { + gasPrice: 0, + } + ); + + // Only admin can create new zkEVMs + await expect( + rollupManagerContract.addExistingRollup( + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + chainID, + genesisRandom, + rollupCompatibilityID + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); + + await expect( + rollupManagerContract + .connect(timelock) + .addExistingRollup( + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + chainID, + genesisRandom, + rollupCompatibilityID + ) + ) + .to.emit(rollupManagerContract, "AddExistingRollup") + .withArgs(RollupID, forkID, PolygonZKEVMV2Contract.target, chainID, rollupCompatibilityID); + + await expect( + rollupManagerContract + .connect(timelock) + .addExistingRollup( + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + chainID, + genesisRandom, + rollupCompatibilityID + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "ChainIDAlreadyExist"); + + // Assert new rollup created + const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; + expect(await PolygonZKEVMV2Contract.admin()).to.be.equal(admin.address); + expect(await PolygonZKEVMV2Contract.trustedSequencer()).to.be.equal(trustedSequencer.address); + expect(await PolygonZKEVMV2Contract.trustedSequencerURL()).to.be.equal(urlSequencer); + expect(await PolygonZKEVMV2Contract.networkName()).to.be.equal(networkName); + expect(await PolygonZKEVMV2Contract.forceBatchTimeout()).to.be.equal(FORCE_BATCH_TIMEOUT); + expect(await PolygonZKEVMV2Contract.lastTimestamp()).to.be.equal(intializeTimestmap); + expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(initializeAccInputHash); + + // try verify batches + const l2txData = "0x123456"; + const maticAmount = await rollupManagerContract.getBatchFee(); + const currentTimestamp = (await ethers.provider.getBlock("latest"))?.timestamp; + + const sequence = { + transactions: l2txData, + globalExitRoot: ethers.ZeroHash, + timestamp: currentTimestamp, + minForcedTimestamp: 0, + } as BatchDataStruct; + + // Approve tokens + await expect( + polTokenContract.connect(trustedSequencer).approve(PolygonZKEVMV2Contract.target, maticAmount) + ).to.emit(polTokenContract, "Approval"); + + // Sequence Batches + await expect( + PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address) + ) + .to.emit(PolygonZKEVMV2Contract, "SequenceBatches") + .withArgs(1); + + const expectedAccInputHash2 = calculateAccInputHash( + initializeAccInputHash, + ethers.keccak256(l2txData), + ethers.ZeroHash, + currentTimestamp, + trustedSequencer.address + ); + // calcualte accINputHash + expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash2); + + // Create a new local exit root mocking some bridge + const tokenName = "Matic Token"; + const tokenSymbol = "MATIC"; + const decimals = 18; + const metadataToken = ethers.AbiCoder.defaultAbiCoder().encode( + ["string", "string", "uint8"], + [tokenName, tokenSymbol, decimals] + ); + + const originNetwork = networkIDRollup; + const tokenAddress = ethers.getAddress(ethers.hexlify(ethers.randomBytes(20))); + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDMainnet; + const destinationAddress = beneficiary.address; + const metadata = metadataToken; // since we are inserting in the exit root can be anything + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + // compute root merkle tree in Js + const height = 32; + const merkleTreezkEVM = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + + // Add 2 leafs + merkleTreezkEVM.add(leafValue); + merkleTreezkEVM.add(leafValue); + + // check merkle root with SC + const rootzkEVM = merkleTreezkEVM.getRoot(); + + // trustedAggregator forge the batch + const pendingState = 0; + const newLocalExitRoot = rootzkEVM; + const newStateRoot = "0x0000000000000000000000000000000000000000000000000000000000000123"; + const newVerifiedBatch = 1; + const zkProofFFlonk = new Array(24).fill(ethers.ZeroHash); + const currentVerifiedBatch = 0; + + const initialAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); + await expect( + rollupManagerContract + .connect(deployer) + .verifyBatchesTrustedAggregator( + RollupID, + pendingState, + currentVerifiedBatch, + newVerifiedBatch, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); + + await expect( + rollupManagerContract + .connect(trustedAggregator) + .verifyBatchesTrustedAggregator( + RollupID, + pendingState, + currentVerifiedBatch, + currentVerifiedBatch, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "FinalNumBatchBelowLastVerifiedBatch"); + + await expect( + rollupManagerContract + .connect(trustedAggregator) + .verifyBatchesTrustedAggregator( + RollupID, + pendingState, + currentVerifiedBatch, + 3, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "NewAccInputHashDoesNotExist"); + + // Calcualte new globalExitroot + const merkleTreeRollups = new MerkleTreeBridge(height); + merkleTreeRollups.add(newLocalExitRoot); + const rootRollups = merkleTreeRollups.getRoot(); + + // Verify batch + await expect( + rollupManagerContract + .connect(trustedAggregator) + .verifyBatchesTrustedAggregator( + RollupID, + pendingState, + currentVerifiedBatch, + newVerifiedBatch, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ) + .to.emit(rollupManagerContract, "VerifyBatchesTrustedAggregator") + .withArgs(RollupID, newVerifiedBatch, newStateRoot, newLocalExitRoot, trustedAggregator.address) + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .withArgs(ethers.ZeroHash, rootRollups); + + const finalAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); + + expect(finalAggregatorMatic).to.equal(initialAggregatorMatic + maticAmount); + + // Assert global exit root + expect(await polygonZkEVMGlobalExitRoot.lastRollupExitRoot()).to.be.equal(rootRollups); + expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(ethers.ZeroHash); + + expect(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()).to.be.equal( + calculateGlobalExitRoot(ethers.ZeroHash, rootRollups) + ); + + const indexLeaf = 0; + const proofZkEVM = merkleTreezkEVM.getProofTreeByIndex(indexLeaf); + const proofRollups = merkleTreeRollups.getProofTreeByIndex(indexLeaf); + + // verify merkle proof + expect(verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM)).to.be.equal(true); + expect(verifyMerkleProof(rootzkEVM, proofRollups, indexLeaf, rootRollups)).to.be.equal(true); + + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM) + ).to.be.equal(true); + + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(newLocalExitRoot, proofRollups, indexLeaf, rootRollups) + ).to.be.equal(true); + + // claim + const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); + // create2 parameters + const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]); + const minimalBytecodeProxy = tokenWrappedFactory.bytecode; + const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]); + const precalculateWrappedErc20 = await ethers.getCreate2Address( + polygonZkEVMBridgeContract.target as string, + salt, + hashInitCode + ); + const newWrappedToken = tokenWrappedFactory.attach(precalculateWrappedErc20) as TokenWrapped; + + // Use precalculatedWrapperAddress and check if matches + expect( + await polygonZkEVMBridgeContract.precalculatedWrapperAddress( + networkIDRollup, + tokenAddress, + tokenName, + tokenSymbol, + decimals + ) + ).to.be.equal(precalculateWrappedErc20); + + // index leaf is 0 bc, does not have mainnet flag, and it's rollup 0 on leaf 0 + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofZkEVM, + proofRollups, + indexLeaf, + ethers.ZeroHash, + rootRollups, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ) + .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") + .withArgs(indexLeaf, originNetwork, tokenAddress, destinationAddress, amount) + .to.emit(polygonZkEVMBridgeContract, "NewWrappedToken") + .withArgs(originNetwork, tokenAddress, precalculateWrappedErc20, metadata) + .to.emit(newWrappedToken, "Transfer") + .withArgs(ethers.ZeroAddress, beneficiary.address, amount); + + // Assert maps created + const newTokenInfo = await polygonZkEVMBridgeContract.wrappedTokenToTokenInfo(precalculateWrappedErc20); + + expect(newTokenInfo.originNetwork).to.be.equal(networkIDRollup); + expect(newTokenInfo.originTokenAddress).to.be.equal(tokenAddress); + expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( + precalculateWrappedErc20 + ); + expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( + precalculateWrappedErc20 + ); + + expect(await polygonZkEVMBridgeContract.tokenInfoToWrappedToken(salt)).to.be.equal(precalculateWrappedErc20); + + // Check the wrapper info + expect(await newWrappedToken.name()).to.be.equal(tokenName); + expect(await newWrappedToken.symbol()).to.be.equal(tokenSymbol); + expect(await newWrappedToken.decimals()).to.be.equal(decimals); + + // Can't claim because nullifier + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofZkEVM, + proofRollups, + indexLeaf, + ethers.ZeroHash, + rootRollups, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AlreadyClaimed"); + + // Check new token + expect(await newWrappedToken.totalSupply()).to.be.equal(amount); + }); + it("Should test obsolete rollup", async () => { const forkID = 0; const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001"; From 9b8320e2fda6a2e98c624a20ac370e1bdf415dfe Mon Sep 17 00:00:00 2001 From: invocamanman Date: Sat, 18 Nov 2023 20:56:28 +0300 Subject: [PATCH 094/230] moar tests --- contracts/v2/PolygonRollupManager.sol | 1 + .../v2/interfaces/IPolygonZkEVMV2Errors.sol | 5 + contracts/v2/lib/PolygonRollupBase.sol | 23 +- contracts/v2/lib/PolygonRollupBaseEtrog.sol | 24 +- test/contractsv2/PolygonRollupManager.test.ts | 821 +++++++++++++++++- .../PolygonRollupManagerUpgrade.test.ts | 10 +- 6 files changed, 836 insertions(+), 48 deletions(-) diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index 11db707f4..f87a22c9f 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -1469,6 +1469,7 @@ contract PolygonRollupManager is function activateEmergencyState() external { if (!hasRole(_EMERGENCY_COUNCIL_ROLE, msg.sender)) { if ( + lastAggregationTimestamp == 0 || lastAggregationTimestamp + _HALT_AGGREGATION_TIMEOUT > block.timestamp ) { diff --git a/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol b/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol index 56c2d8dfd..1a6783040 100644 --- a/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol +++ b/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol @@ -23,4 +23,9 @@ interface IPolygonZkEVMV2Errors is IPolygonZkEVMErrors { * @dev Thrown when the caller is not the trusted sequencer */ error GasTokenNetworkMustBeZeroOnEther(); + + /** + * @dev Thrown when the try to initialize with a gas token with huge metadata + */ + error HugeTokenMetadataNotSupported(); } diff --git a/contracts/v2/lib/PolygonRollupBase.sol b/contracts/v2/lib/PolygonRollupBase.sol index 5b3995d99..8ca0bf3de 100644 --- a/contracts/v2/lib/PolygonRollupBase.sol +++ b/contracts/v2/lib/PolygonRollupBase.sol @@ -225,6 +225,15 @@ contract PolygonRollupBase is */ event SequenceForceBatches(uint64 indexed numBatch); + /** + * @dev Emitted when the contract is initialized, contain the first sequenced transaction + */ + event InitialSequenceBatches( + bytes transactions, + bytes32 lastGlobalExitRoot, + address sequencer + ); + /** * @dev Emitted when a aggregator verifies batches */ @@ -305,7 +314,7 @@ contract PolygonRollupBase is if (_gasTokenAddress != address(0)) { // Ask for token metadata, the same way is enconded in the bridge - // Note that this funciton will revert if the token is not in this network + // Note that this function will revert if the token is not in this network // Note that this could be a possible reentrant call, but cannot make changes on the state since are static call gasTokenMetadata = abi.encode( _safeName(_gasTokenAddress), @@ -340,14 +349,16 @@ contract PolygonRollupBase is bytes32 currentTransactionsHash = keccak256(transaction); - // should be deterministic for easier deployment + // Get current timestamp and global exit root uint64 currentTimestamp = uint64(block.timestamp); + bytes32 lastGlobalExitRoot = globalExitRootManager + .getLastGlobalExitRoot(); bytes32 newAccInputHash = keccak256( abi.encodePacked( bytes32(0), // Current acc Input hash currentTransactionsHash, - bytes32(0), // Global exit root + lastGlobalExitRoot, // Global exit root currentTimestamp, sequencer ) @@ -355,7 +366,7 @@ contract PolygonRollupBase is lastTimestamp = currentTimestamp; lastAccInputHash = newAccInputHash; - uint64 currentBatchSequenced = rollupManager.onSequenceBatches( + rollupManager.onSequenceBatches( uint64(1), // num total batches newAccInputHash ); @@ -370,7 +381,7 @@ contract PolygonRollupBase is // Constant deployment variables forceBatchTimeout = 5 days; - emit SequenceBatches(currentBatchSequenced); + emit InitialSequenceBatches(transaction, lastGlobalExitRoot, sequencer); } modifier onlyAdmin() { @@ -859,7 +870,7 @@ contract PolygonRollupBase is // Do not support more than 65535 bytes if (initializeBrigeData.length > type(uint16).max) { - revert(); + revert HugeTokenMetadataNotSupported(); } uint16 initializeBrigeDataLen = uint16(initializeBrigeData.length); diff --git a/contracts/v2/lib/PolygonRollupBaseEtrog.sol b/contracts/v2/lib/PolygonRollupBaseEtrog.sol index 436e54d4a..d72389e23 100644 --- a/contracts/v2/lib/PolygonRollupBaseEtrog.sol +++ b/contracts/v2/lib/PolygonRollupBaseEtrog.sol @@ -213,6 +213,15 @@ contract PolygonRollupBaseEtrog is */ event SequenceForceBatches(uint64 indexed numBatch); + /** + * @dev Emitted when the contract is initialized, contain the first sequenced transaction + */ + event InitialSequenceBatches( + bytes transactions, + bytes32 lastGlobalExitRoot, + address sequencer + ); + /** * @dev Emitted when a aggregator verifies batches */ @@ -293,7 +302,7 @@ contract PolygonRollupBaseEtrog is if (_gasTokenAddress != address(0)) { // Ask for token metadata, the same way is enconded in the bridge - // Note that this funciton will revert if the token is not in this network + // Note that this function will revert if the token is not in this network // Note that this could be a possible reentrant call, but cannot make changes on the state since are static call gasTokenMetadata = abi.encode( _safeName(_gasTokenAddress), @@ -328,16 +337,17 @@ contract PolygonRollupBaseEtrog is bytes32 currentTransactionsHash = keccak256(transaction); - // should be deterministic for easier deployment + // Get current timestamp and global exit root uint64 currentTimestamp = uint64(block.timestamp); + bytes32 lastGlobalExitRoot = globalExitRootManager + .getLastGlobalExitRoot(); // Add the transaction to the sequence as if it was a force transaction - // review add acutal global exit root, need different event bytes32 newAccInputHash = keccak256( abi.encodePacked( bytes32(0), // Current acc Input hash currentTransactionsHash, - bytes32(0), // Global exit root + lastGlobalExitRoot, // Global exit root currentTimestamp, sequencer, blockhash(block.number - 1) @@ -346,7 +356,7 @@ contract PolygonRollupBaseEtrog is lastAccInputHash = newAccInputHash; - uint64 currentBatchSequenced = rollupManager.onSequenceBatches( + rollupManager.onSequenceBatches( uint64(1), // num total batches newAccInputHash ); @@ -361,7 +371,7 @@ contract PolygonRollupBaseEtrog is // Constant deployment variables forceBatchTimeout = 5 days; - emit SequenceBatches(currentBatchSequenced, bytes32(0)); + emit InitialSequenceBatches(transaction, lastGlobalExitRoot, sequencer); } modifier onlyAdmin() { @@ -842,7 +852,7 @@ contract PolygonRollupBaseEtrog is // Do not support more than 65535 bytes if (initializeBrigeData.length > type(uint16).max) { - revert(); + revert HugeTokenMetadataNotSupported(); } uint16 initializeBrigeDataLen = uint16(initializeBrigeData.length); diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index a380959c3..050fcc4e8 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -5,10 +5,12 @@ import { VerifierRollupHelperMock, ERC20PermitMock, PolygonRollupManagerMock, - PolygonZkEVMGlobalExitRoot, + PolygonZkEVMGlobalExitRootV2, PolygonZkEVMBridgeV2, PolygonZkEVMV2, + PolygonZkEVMVEtrog, PolygonRollupBase, + PolygonRollupBaseEtrog, TokenWrapped, Address, } from "../../typechain-types"; @@ -17,6 +19,8 @@ import {processorUtils, contractUtils, MTBridge, mtBridgeUtils} from "@0xpolygon const {calculateSnarkInput, calculateAccInputHash, calculateBatchHashData} = contractUtils; type BatchDataStruct = PolygonRollupBase.BatchDataStruct; +type ForcedBatchDataStruct = PolygonRollupBase.ForcedBatchDataStruct; +type BatchDataStructEtrog = PolygonRollupBaseEtrog.BatchDataStruct; const MerkleTreeBridge = MTBridge; const {verifyMerkleProof, getLeafValue} = mtBridgeUtils; @@ -37,7 +41,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { let verifierContract: VerifierRollupHelperMock; let polygonZkEVMBridgeContract: PolygonZkEVMBridgeV2; let polTokenContract: ERC20PermitMock; - let polygonZkEVMGlobalExitRoot: PolygonZkEVMGlobalExitRoot; + let polygonZkEVMGlobalExitRoot: PolygonZkEVMGlobalExitRootV2; let rollupManagerContract: PolygonRollupManagerMock; const polTokenName = "POL Token"; @@ -119,7 +123,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { firstDeployment = false; // deploy globalExitRoot - const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRoot"); + const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRootV2"); polygonZkEVMGlobalExitRoot = await upgrades.deployProxy(PolygonZkEVMGlobalExitRootFactory, [], { initializer: false, constructorArgs: [precalculateRollupManagerAddress, precalculateBridgeAddress], @@ -206,6 +210,32 @@ describe("Polygon ZK-EVM TestnetV2", () => { ); }); + it("should check the emergency state", async () => { + expect(await rollupManagerContract.isEmergencyState()).to.be.equal(false); + expect(await polygonZkEVMBridgeContract.isEmergencyState()).to.be.equal(false); + + await expect(rollupManagerContract.activateEmergencyState()).to.be.revertedWithCustomError( + rollupManagerContract, + "HaltTimeoutNotExpired" + ); + await expect(rollupManagerContract.connect(emergencyCouncil).activateEmergencyState()) + .to.emit(rollupManagerContract, "EmergencyStateActivated") + .to.emit(polygonZkEVMBridgeContract, "EmergencyStateActivated"); + + expect(await rollupManagerContract.isEmergencyState()).to.be.equal(true); + expect(await polygonZkEVMBridgeContract.isEmergencyState()).to.be.equal(true); + + await expect( + rollupManagerContract.connect(emergencyCouncil).deactivateEmergencyState() + ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); + + await expect(rollupManagerContract.connect(admin).deactivateEmergencyState()) + .to.emit(rollupManagerContract, "EmergencyStateDeactivated") + .to.emit(polygonZkEVMBridgeContract, "EmergencyStateDeactivated"); + + expect(await rollupManagerContract.isEmergencyState()).to.be.equal(false); + expect(await polygonZkEVMBridgeContract.isEmergencyState()).to.be.equal(false); + }); it("should check full flow", async () => { const urlSequencer = "http://zkevm-json-rpc:8123"; const chainID = 1000; @@ -221,7 +251,616 @@ describe("Polygon ZK-EVM TestnetV2", () => { // In order to create a new rollup type, create an implementation of the contract // Create zkEVM implementation - const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMV2"); + const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMV2"); + const PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy( + polygonZkEVMGlobalExitRoot.target, + polTokenContract.target, + polygonZkEVMBridgeContract.target, + rollupManagerContract.target + ); + await PolygonZKEVMV2Contract.waitForDeployment(); + + // Try to add a new rollup type + await expect( + rollupManagerContract.addNewRollupType( + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + genesisRandom, + descirption + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); + + // Add a new rollup type with timelock + const newRollupTypeID = 1; + await expect( + rollupManagerContract + .connect(timelock) + .addNewRollupType( + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + genesisRandom, + descirption + ) + ) + .to.emit(rollupManagerContract, "AddNewRollupType") + .withArgs( + newRollupTypeID, + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + genesisRandom, + descirption + ); + + // assert new rollup type + const createdRollupType = await rollupManagerContract.rollupTypeMap(newRollupTypeID); + + const expectedRollupType = [ + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + false, + genesisRandom, + ]; + expect(createdRollupType).to.be.deep.equal(expectedRollupType); + + // obsoleteRollupType, take snapshot for it + const snapshot = await takeSnapshot(); + + await expect(rollupManagerContract.obsoleteRollupType(newRollupTypeID)).to.be.revertedWithCustomError( + rollupManagerContract, + "AddressDoNotHaveRequiredRole" + ); + + await expect(rollupManagerContract.connect(admin).obsoleteRollupType(newRollupTypeID)) + .to.emit(rollupManagerContract, "ObsoleteRollupType") + .withArgs(newRollupTypeID); + + expect([ + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + true, + genesisRandom, + ]).to.be.deep.equal(await rollupManagerContract.rollupTypeMap(newRollupTypeID)); + await snapshot.restore(); + + expect(expectedRollupType).to.be.deep.equal(await rollupManagerContract.rollupTypeMap(newRollupTypeID)); + // Create a + + // Only admin can create new zkEVMs + await expect( + rollupManagerContract.createNewRollup( + newRollupTypeID, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + urlSequencer, + networkName + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); + + // UNexisting rollupType + await expect( + rollupManagerContract + .connect(admin) + .createNewRollup( + 0, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + urlSequencer, + networkName + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeDoesNotExist"); + + // Obsolete rollup type and test that fails + const snapshot2 = await takeSnapshot(); + await expect(rollupManagerContract.connect(admin).obsoleteRollupType(newRollupTypeID)) + .to.emit(rollupManagerContract, "ObsoleteRollupType") + .withArgs(newRollupTypeID); + + await expect( + rollupManagerContract + .connect(admin) + .createNewRollup( + newRollupTypeID, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + urlSequencer, + networkName + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeObsolete"); + await snapshot2.restore(); + + const newCreatedRollupID = 1; + const newZKEVMAddress = ethers.getCreateAddress({ + from: rollupManagerContract.target as string, + nonce: 1, + }); + + const newZkEVMContract = PolygonZKEVMV2Factory.attach(newZKEVMAddress) as PolygonZkEVMV2; + const newSequencedBatch = 1; + + await expect( + rollupManagerContract + .connect(admin) + .createNewRollup( + newRollupTypeID, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + urlSequencer, + networkName + ) + ) + .to.emit(rollupManagerContract, "CreateNewRollup") + .withArgs(newCreatedRollupID, newRollupTypeID, newZKEVMAddress, chainID, gasTokenAddress) + .to.emit(newZkEVMContract, "InitialSequenceBatches") + .to.emit(rollupManagerContract, "OnSequenceBatches") + .withArgs(newCreatedRollupID, newSequencedBatch); + + // Assert new rollup created + const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; + expect(await newZkEVMContract.admin()).to.be.equal(admin.address); + expect(await newZkEVMContract.trustedSequencer()).to.be.equal(trustedSequencer.address); + expect(await newZkEVMContract.trustedSequencerURL()).to.be.equal(urlSequencer); + expect(await newZkEVMContract.networkName()).to.be.equal(networkName); + expect(await newZkEVMContract.forceBatchTimeout()).to.be.equal(FORCE_BATCH_TIMEOUT); + expect(await newZkEVMContract.lastTimestamp()).to.be.equal(timestampCreatedRollup); + + // Cannot create 2 chains with the same chainID + await expect( + rollupManagerContract + .connect(admin) + .createNewRollup( + newRollupTypeID, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + urlSequencer, + networkName + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "ChainIDAlreadyExist"); + + const transaction = await newZkEVMContract.generateInitializeTransaction( + newCreatedRollupID, + gasTokenAddress, + gasTokenNetwork, + "0x" // empty metadata + ); + + // Check transaction + const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + const encodedData = bridgeL2Factory.interface.encodeFunctionData("initialize", [ + newCreatedRollupID, + gasTokenAddress, + gasTokenNetwork, + globalExitRootL2Address, + ethers.ZeroAddress, + "0x", // empty metadata + ]); + + const rawTx = processorUtils.customRawTxToRawTx(transaction); + const tx = ethers.Transaction.from(rawTx); + expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); + expect(tx.value).to.be.equal(0); + expect(tx.data).to.be.equal(encodedData); + expect(tx.gasPrice).to.be.equal(0); + expect(tx.gasLimit).to.be.equal(30000000); + expect(tx.nonce).to.be.equal(0); + expect(tx.chainId).to.be.equal(0); + + const expectedAccInputHash = calculateAccInputHash( + ethers.ZeroHash, + ethers.keccak256(transaction), + await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), + timestampCreatedRollup, + trustedSequencer.address + ); + // calcualte accINputHash + expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash); + + // Check mapping on rollup Manager + const rollupData = await rollupManagerContract.rollupIDToRollupData(newCreatedRollupID); + expect(rollupData.rollupContract).to.be.equal(newZKEVMAddress); + expect(rollupData.chainID).to.be.equal(chainID); + expect(rollupData.verifier).to.be.equal(verifierContract.target); + expect(rollupData.forkID).to.be.equal(forkID); + expect(rollupData.lastLocalExitRoot).to.be.equal(ethers.ZeroHash); + expect(rollupData.lastBatchSequenced).to.be.equal(newSequencedBatch); + expect(rollupData.lastVerifiedBatch).to.be.equal(0); + expect(rollupData.lastPendingState).to.be.equal(0); + expect(rollupData.lastPendingStateConsolidated).to.be.equal(0); + expect(rollupData.lastVerifiedBatchBeforeUpgrade).to.be.equal(0); + expect(rollupData.rollupTypeID).to.be.equal(1); + expect(rollupData.rollupCompatibilityID).to.be.equal(0); + + const sequencedBatchData = await rollupManagerContract.getRollupSequencedBatches( + newCreatedRollupID, + newSequencedBatch + ); + + expect(sequencedBatchData.accInputHash).to.be.equal(expectedAccInputHash); + expect(sequencedBatchData.sequencedTimestamp).to.be.equal(timestampCreatedRollup); + expect(sequencedBatchData.previousLastBatchSequenced).to.be.equal(0); + + // try verify batches + const l2txData = "0x123456"; + const maticAmount = await rollupManagerContract.getBatchFee(); + const currentTimestamp = (await ethers.provider.getBlock("latest"))?.timestamp; + + const sequence = { + transactions: l2txData, + globalExitRoot: ethers.ZeroHash, + timestamp: currentTimestamp, + minForcedTimestamp: 0, + } as BatchDataStruct; + + // Approve tokens + await expect(polTokenContract.connect(trustedSequencer).approve(newZkEVMContract.target, maticAmount)).to.emit( + polTokenContract, + "Approval" + ); + + // Sequence Batches + await expect(newZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address)) + .to.emit(newZkEVMContract, "SequenceBatches") + .withArgs(newSequencedBatch + 1); + + const expectedAccInputHash2 = calculateAccInputHash( + expectedAccInputHash, + ethers.keccak256(l2txData), + ethers.ZeroHash, + currentTimestamp, + trustedSequencer.address + ); + // calcualte accINputHash + expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash2); + + // Create a new local exit root mocking some bridge + const tokenName = "Matic Token"; + const tokenSymbol = "MATIC"; + const decimals = 18; + const metadataToken = ethers.AbiCoder.defaultAbiCoder().encode( + ["string", "string", "uint8"], + [tokenName, tokenSymbol, decimals] + ); + + const originNetwork = networkIDRollup; + const tokenAddress = ethers.getAddress(ethers.hexlify(ethers.randomBytes(20))); + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDMainnet; + const destinationAddress = beneficiary.address; + const metadata = metadataToken; // since we are inserting in the exit root can be anything + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + // compute root merkle tree in Js + const height = 32; + const merkleTreezkEVM = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + + // Add 2 leafs + merkleTreezkEVM.add(leafValue); + merkleTreezkEVM.add(leafValue); + + // check merkle root with SC + const rootzkEVM = merkleTreezkEVM.getRoot(); + + // trustedAggregator forge the batch + const pendingState = 0; + const newLocalExitRoot = rootzkEVM; + const newStateRoot = "0x0000000000000000000000000000000000000000000000000000000000000123"; + const newVerifiedBatch = newSequencedBatch + 1; + const zkProofFFlonk = new Array(24).fill(ethers.ZeroHash); + const currentVerifiedBatch = 0; + + const initialAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); + await expect( + rollupManagerContract + .connect(deployer) + .verifyBatchesTrustedAggregator( + newCreatedRollupID, + pendingState, + currentVerifiedBatch, + newVerifiedBatch, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); + + await expect( + rollupManagerContract + .connect(trustedAggregator) + .verifyBatchesTrustedAggregator( + newCreatedRollupID, + pendingState, + currentVerifiedBatch, + currentVerifiedBatch, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "FinalNumBatchBelowLastVerifiedBatch"); + + await expect( + rollupManagerContract + .connect(trustedAggregator) + .verifyBatchesTrustedAggregator( + newCreatedRollupID, + pendingState, + currentVerifiedBatch, + 3, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "NewAccInputHashDoesNotExist"); + + // Calcualte new globalExitroot + const merkleTreeRollups = new MerkleTreeBridge(height); + merkleTreeRollups.add(newLocalExitRoot); + const rootRollups = merkleTreeRollups.getRoot(); + + // Verify batch + await expect( + rollupManagerContract + .connect(trustedAggregator) + .verifyBatchesTrustedAggregator( + newCreatedRollupID, + pendingState, + currentVerifiedBatch, + newVerifiedBatch, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ) + .to.emit(rollupManagerContract, "VerifyBatchesTrustedAggregator") + .withArgs(newCreatedRollupID, newVerifiedBatch, newStateRoot, newLocalExitRoot, trustedAggregator.address) + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .withArgs(ethers.ZeroHash, rootRollups); + + const finalAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); + + expect(finalAggregatorMatic).to.equal(initialAggregatorMatic + maticAmount); + + // Assert global exit root + expect(await polygonZkEVMGlobalExitRoot.lastRollupExitRoot()).to.be.equal(rootRollups); + expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(ethers.ZeroHash); + + expect(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()).to.be.equal( + calculateGlobalExitRoot(ethers.ZeroHash, rootRollups) + ); + + const indexLeaf = 0; + const proofZkEVM = merkleTreezkEVM.getProofTreeByIndex(indexLeaf); + const proofRollups = merkleTreeRollups.getProofTreeByIndex(indexLeaf); + + // verify merkle proof + expect(verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM)).to.be.equal(true); + expect(verifyMerkleProof(rootzkEVM, proofRollups, indexLeaf, rootRollups)).to.be.equal(true); + + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM) + ).to.be.equal(true); + + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(newLocalExitRoot, proofRollups, indexLeaf, rootRollups) + ).to.be.equal(true); + + // claim + const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); + // create2 parameters + const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]); + const minimalBytecodeProxy = tokenWrappedFactory.bytecode; + const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]); + const precalculateWrappedErc20 = await ethers.getCreate2Address( + polygonZkEVMBridgeContract.target as string, + salt, + hashInitCode + ); + const newWrappedToken = tokenWrappedFactory.attach(precalculateWrappedErc20) as TokenWrapped; + + // Use precalculatedWrapperAddress and check if matches + expect( + await polygonZkEVMBridgeContract.precalculatedWrapperAddress( + networkIDRollup, + tokenAddress, + tokenName, + tokenSymbol, + decimals + ) + ).to.be.equal(precalculateWrappedErc20); + + // index leaf is 0 bc, does not have mainnet flag, and it's rollup 0 on leaf 0 + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofZkEVM, + proofRollups, + indexLeaf, + ethers.ZeroHash, + rootRollups, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ) + .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") + .withArgs(indexLeaf, originNetwork, tokenAddress, destinationAddress, amount) + .to.emit(polygonZkEVMBridgeContract, "NewWrappedToken") + .withArgs(originNetwork, tokenAddress, precalculateWrappedErc20, metadata) + .to.emit(newWrappedToken, "Transfer") + .withArgs(ethers.ZeroAddress, beneficiary.address, amount); + + // Assert maps created + const newTokenInfo = await polygonZkEVMBridgeContract.wrappedTokenToTokenInfo(precalculateWrappedErc20); + + expect(newTokenInfo.originNetwork).to.be.equal(networkIDRollup); + expect(newTokenInfo.originTokenAddress).to.be.equal(tokenAddress); + expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( + precalculateWrappedErc20 + ); + expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( + precalculateWrappedErc20 + ); + + expect(await polygonZkEVMBridgeContract.tokenInfoToWrappedToken(salt)).to.be.equal(precalculateWrappedErc20); + + // Check the wrapper info + expect(await newWrappedToken.name()).to.be.equal(tokenName); + expect(await newWrappedToken.symbol()).to.be.equal(tokenSymbol); + expect(await newWrappedToken.decimals()).to.be.equal(decimals); + + // Can't claim because nullifier + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofZkEVM, + proofRollups, + indexLeaf, + ethers.ZeroHash, + rootRollups, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AlreadyClaimed"); + + // Check new token + expect(await newWrappedToken.totalSupply()).to.be.equal(amount); + + // Force batches + + // Check force batches are unactive + await expect(newZkEVMContract.forceBatch("0x", 0)).to.be.revertedWithCustomError( + newZkEVMContract, + "ForceBatchNotAllowed" + ); + await expect(newZkEVMContract.sequenceForceBatches([])).to.be.revertedWithCustomError( + newZkEVMContract, + "ForceBatchNotAllowed" + ); + + await expect(newZkEVMContract.connect(admin).activateForceBatches()).to.emit( + newZkEVMContract, + "ActivateForceBatches" + ); + await expect(newZkEVMContract.connect(admin).activateForceBatches()).to.be.revertedWithCustomError( + newZkEVMContract, + "ForceBatchesAlreadyActive" + ); + + const l2txDataForceBatch = "0x123456"; + const maticAmountForced = await rollupManagerContract.getForcedBatchFee(); + const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); + + // Approve tokens + await expect(polTokenContract.approve(newZkEVMContract.target, maticAmountForced)).to.emit( + polTokenContract, + "Approval" + ); + + const lastForcedBatch = (await newZkEVMContract.lastForceBatch()) + 1n; + + // Force batch + await expect(newZkEVMContract.forceBatch(l2txDataForceBatch, maticAmountForced)) + .to.emit(newZkEVMContract, "ForceBatch") + .withArgs(lastForcedBatch, lastGlobalExitRoot, deployer.address, "0x"); + + const currentTimestamp2 = (await ethers.provider.getBlock("latest"))?.timestamp; + + const sequenceForced = { + transactions: l2txDataForceBatch, + globalExitRoot: lastGlobalExitRoot, + timestamp: currentTimestamp2, + minForcedTimestamp: currentTimestamp2, + } as BatchDataStruct; + + const snapshot3 = await takeSnapshot(); + // Sequence Batches + await expect( + newZkEVMContract.connect(trustedSequencer).sequenceBatches([sequenceForced], trustedSequencer.address) + ) + .to.emit(newZkEVMContract, "SequenceBatches") + .withArgs(3); + + const expectedAccInputHash3 = calculateAccInputHash( + expectedAccInputHash2, + ethers.keccak256(l2txDataForceBatch), + lastGlobalExitRoot, + currentTimestamp2, + trustedSequencer.address + ); + // calcualte accINputHash + expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash3); + + await snapshot3.restore(); + // sequence force batches + + const timestampForceBatch = (await ethers.provider.getBlock("latest"))?.timestamp as any; + // Increment timestamp + await ethers.provider.send("evm_setNextBlockTimestamp", [timestampForceBatch + FORCE_BATCH_TIMEOUT]); + + const forceBatchStruct = { + transactions: l2txDataForceBatch, + globalExitRoot: lastGlobalExitRoot, + minForcedTimestamp: currentTimestamp2, + } as ForcedBatchDataStruct; + + // sequence force batch + await expect(newZkEVMContract.sequenceForceBatches([forceBatchStruct])) + .to.emit(newZkEVMContract, "SequenceForceBatches") + .withArgs(3); + }); + + it("should check full flow etrog", async () => { + const urlSequencer = "http://zkevm-json-rpc:8123"; + const chainID = 1000; + const networkName = "zkevm"; + const forkID = 0; + const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001"; + const rollupCompatibilityID = 0; + const descirption = "zkevm test"; + // Native token will be ether + const gasTokenAddress = ethers.ZeroAddress; + const gasTokenNetwork = 0; + + // In order to create a new rollup type, create an implementation of the contract + + // Create zkEVM implementation + const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMVEtrog"); const PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy( polygonZkEVMGlobalExitRoot.target, polTokenContract.target, @@ -360,7 +999,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { nonce: 1, }); - const newZkEVMContract = PolygonZKEVMV2Factory.attach(newZKEVMAddress) as PolygonZkEVMV2; + const newZkEVMContract = PolygonZKEVMV2Factory.attach(newZKEVMAddress) as PolygonZkEVMVEtrog; const newSequencedBatch = 1; await expect( @@ -378,11 +1017,12 @@ describe("Polygon ZK-EVM TestnetV2", () => { ) .to.emit(rollupManagerContract, "CreateNewRollup") .withArgs(newCreatedRollupID, newRollupTypeID, newZKEVMAddress, chainID, gasTokenAddress) - .to.emit(newZkEVMContract, "SequenceBatches") - .withArgs(newSequencedBatch) + .to.emit(newZkEVMContract, "InitialSequenceBatches") .to.emit(rollupManagerContract, "OnSequenceBatches") .withArgs(newCreatedRollupID, newSequencedBatch); + const blockCreatedRollup = await ethers.provider.getBlock("latest"); + // Assert new rollup created const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; expect(await newZkEVMContract.admin()).to.be.equal(admin.address); @@ -390,7 +1030,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { expect(await newZkEVMContract.trustedSequencerURL()).to.be.equal(urlSequencer); expect(await newZkEVMContract.networkName()).to.be.equal(networkName); expect(await newZkEVMContract.forceBatchTimeout()).to.be.equal(FORCE_BATCH_TIMEOUT); - expect(await newZkEVMContract.lastTimestamp()).to.be.equal(timestampCreatedRollup); // Cannot create 2 chains with the same chainID await expect( @@ -435,13 +1074,15 @@ describe("Polygon ZK-EVM TestnetV2", () => { expect(tx.nonce).to.be.equal(0); expect(tx.chainId).to.be.equal(0); - const expectedAccInputHash = calculateAccInputHash( + const expectedAccInputHash = calculateAccInputHashetrog( ethers.ZeroHash, ethers.keccak256(transaction), - ethers.ZeroHash, + await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), timestampCreatedRollup, - trustedSequencer.address + trustedSequencer.address, + blockCreatedRollup?.parentHash ); + // calcualte accINputHash expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash); @@ -476,10 +1117,10 @@ describe("Polygon ZK-EVM TestnetV2", () => { const sequence = { transactions: l2txData, - globalExitRoot: ethers.ZeroHash, - timestamp: currentTimestamp, - minForcedTimestamp: 0, - } as BatchDataStruct; + forcedGlobalExitRoot: ethers.ZeroHash, + forcedTimestamp: 0, + forcedBlockHashL1: ethers.ZeroHash, + } as BatchDataStructEtrog; // Approve tokens await expect(polTokenContract.connect(trustedSequencer).approve(newZkEVMContract.target, maticAmount)).to.emit( @@ -488,16 +1129,32 @@ describe("Polygon ZK-EVM TestnetV2", () => { ); // Sequence Batches - await expect(newZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address)) - .to.emit(newZkEVMContract, "SequenceBatches") - .withArgs(newSequencedBatch + 1); + await expect( + newZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address) + ).to.emit(newZkEVMContract, "SequenceBatches"); - const expectedAccInputHash2 = calculateAccInputHash( + const lastBlock = await ethers.provider.getBlock("latest"); + const lastBlockHash = lastBlock?.parentHash; + const lastGlobalExitRootS = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); + + // TODO + const height = 32; + const merkleTreeGLobalExitRoot = new MerkleTreeBridge(height); + const leafValueJs = calculateGlobalExitRootLeaf(lastGlobalExitRootS, lastBlockHash, lastBlock?.timestamp); + //merkleTreeGLobalExitRoot.add(leafValueJs); + + const rootSC = await polygonZkEVMGlobalExitRoot.getRoot(); + const rootJS = merkleTreeGLobalExitRoot.getRoot(); + + expect(rootSC).to.be.equal(rootJS); + + const expectedAccInputHash2 = calculateAccInputHashetrog( expectedAccInputHash, ethers.keccak256(l2txData), - ethers.ZeroHash, - currentTimestamp, - trustedSequencer.address + rootSC, + lastBlock?.timestamp, + trustedSequencer.address, + ethers.ZeroHash ); // calcualte accINputHash expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash2); @@ -520,7 +1177,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); // compute root merkle tree in Js - const height = 32; const merkleTreezkEVM = new MerkleTreeBridge(height); const leafValue = getLeafValue( LEAF_TYPE_ASSET, @@ -731,6 +1387,83 @@ describe("Polygon ZK-EVM TestnetV2", () => { // Check new token expect(await newWrappedToken.totalSupply()).to.be.equal(amount); + + // Force batches + + // Check force batches are unactive + await expect(newZkEVMContract.forceBatch("0x", 0)).to.be.revertedWithCustomError( + newZkEVMContract, + "ForceBatchNotAllowed" + ); + await expect(newZkEVMContract.sequenceForceBatches([])).to.be.revertedWithCustomError( + newZkEVMContract, + "ForceBatchNotAllowed" + ); + + await expect(newZkEVMContract.connect(admin).activateForceBatches()).to.emit( + newZkEVMContract, + "ActivateForceBatches" + ); + await expect(newZkEVMContract.connect(admin).activateForceBatches()).to.be.revertedWithCustomError( + newZkEVMContract, + "ForceBatchesAlreadyActive" + ); + + const l2txDataForceBatch = "0x123456"; + const maticAmountForced = await rollupManagerContract.getForcedBatchFee(); + const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); + + // Approve tokens + await expect(polTokenContract.approve(newZkEVMContract.target, maticAmountForced)).to.emit( + polTokenContract, + "Approval" + ); + + const lastForcedBatch = (await newZkEVMContract.lastForceBatch()) + 1n; + + // Force batch + await expect(newZkEVMContract.forceBatch(l2txDataForceBatch, maticAmountForced)) + .to.emit(newZkEVMContract, "ForceBatch") + .withArgs(lastForcedBatch, lastGlobalExitRoot, deployer.address, "0x"); + + const forcedBlock = await ethers.provider.getBlock("latest"); + const currentTimestamp2 = forcedBlock?.timestamp; + + const sequenceForced = { + transactions: l2txDataForceBatch, + forcedGlobalExitRoot: lastGlobalExitRoot, + forcedTimestamp: currentTimestamp2, + forcedBlockHashL1: forcedBlock?.parentHash, + } as BatchDataStructEtrog; + + const snapshot3 = await takeSnapshot(); + // Sequence Batches + await expect( + newZkEVMContract.connect(trustedSequencer).sequenceBatches([sequenceForced], trustedSequencer.address) + ).to.emit(newZkEVMContract, "SequenceBatches"); + + const expectedAccInputHash3 = calculateAccInputHashetrog( + expectedAccInputHash2, + ethers.keccak256(l2txDataForceBatch), + lastGlobalExitRoot, + currentTimestamp2, + trustedSequencer.address, + forcedBlock?.parentHash + ); + // calcualte accINputHash + expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash3); + + await snapshot3.restore(); + // sequence force batches + + const timestampForceBatch = (await ethers.provider.getBlock("latest"))?.timestamp as any; + // Increment timestamp + await ethers.provider.send("evm_setNextBlockTimestamp", [timestampForceBatch + FORCE_BATCH_TIMEOUT]); + + // sequence force batch + await expect(newZkEVMContract.sequenceForceBatches([sequenceForced])) + .to.emit(newZkEVMContract, "SequenceForceBatches") + .withArgs(3); }); it("should check full flow with gas Token", async () => { @@ -925,8 +1658,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { ) .to.emit(rollupManagerContract, "CreateNewRollup") .withArgs(newCreatedRollupID, newRollupTypeID, newZKEVMAddress, chainID, gasTokenAddress) - .to.emit(newZkEVMContract, "SequenceBatches") - .withArgs(newSequencedBatch) + .to.emit(newZkEVMContract, "InitialSequenceBatches") .to.emit(rollupManagerContract, "OnSequenceBatches") .withArgs(newCreatedRollupID, newSequencedBatch); @@ -985,7 +1717,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { const expectedAccInputHash = calculateAccInputHash( ethers.ZeroHash, ethers.keccak256(transaction), - ethers.ZeroHash, + await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), timestampCreatedRollup, trustedSequencer.address ); @@ -1472,8 +2204,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { ) .to.emit(rollupManagerContract, "CreateNewRollup") .withArgs(newCreatedRollupID, newRollupTypeID, newZKEVMAddress, chainID, gasTokenAddress) - .to.emit(newZkEVMContract, "SequenceBatches") - .withArgs(newSequencedBatch) + .to.emit(newZkEVMContract, "InitialSequenceBatches") .to.emit(rollupManagerContract, "OnSequenceBatches") .withArgs(newCreatedRollupID, newSequencedBatch); @@ -1532,7 +2263,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { const expectedAccInputHash = calculateAccInputHash( ethers.ZeroHash, ethers.keccak256(transaction), - ethers.ZeroHash, + await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), timestampCreatedRollup, trustedSequencer.address ); @@ -2389,3 +3120,35 @@ describe("Polygon ZK-EVM TestnetV2", () => { } }); }); + +/** + * Compute accumulateInputHash = Keccak256(oldAccInputHash, batchHashData, globalExitRoot, timestamp, seqAddress) + * @param {String} oldAccInputHash - old accumulateInputHash + * @param {String} batchHashData - Batch hash data + * @param {String} globalExitRoot - Global Exit Root + * @param {Number} timestamp - Block timestamp + * @param {String} sequencerAddress - Sequencer address + * @returns {String} - accumulateInputHash in hex encoding + */ +function calculateAccInputHashetrog( + oldAccInputHash: any, + batchHashData: any, + globalExitRoot: any, + timestamp: any, + sequencerAddress: any, + forcedBlockHash: any +) { + const hashKeccak = ethers.solidityPackedKeccak256( + ["bytes32", "bytes32", "bytes32", "uint64", "address", "bytes32"], + [oldAccInputHash, batchHashData, globalExitRoot, timestamp, sequencerAddress, forcedBlockHash] + ); + + return hashKeccak; +} + +function calculateGlobalExitRootLeaf(newGlobalExitRoot: any, lastBlockHash: any, timestamp: any) { + return ethers.solidityPackedKeccak256( + ["bytes32", "bytes32", "uint64"], + [newGlobalExitRoot, lastBlockHash, timestamp] + ); +} diff --git a/test/contractsv2/PolygonRollupManagerUpgrade.test.ts b/test/contractsv2/PolygonRollupManagerUpgrade.test.ts index decb401f8..bf769cb71 100644 --- a/test/contractsv2/PolygonRollupManagerUpgrade.test.ts +++ b/test/contractsv2/PolygonRollupManagerUpgrade.test.ts @@ -443,8 +443,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { ) .to.emit(rollupManagerContract, "CreateNewRollup") .withArgs(newCreatedRollupID, newRollupTypeID, newZKEVMAddress, chainID, gasTokenAddress) - .to.emit(newZkEVMContract, "SequenceBatches") - .withArgs(newSequencedBatch) + .to.emit(newZkEVMContract, "InitialSequenceBatches") .to.emit(rollupManagerContract, "OnSequenceBatches") .withArgs(newCreatedRollupID, newSequencedBatch); @@ -503,7 +502,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { const expectedAccInputHash = calculateAccInputHash( ethers.ZeroHash, ethers.keccak256(transaction), - ethers.ZeroHash, + await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), timestampCreatedRollup, trustedSequencer.address ); @@ -973,8 +972,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { ) .to.emit(rollupManagerContract, "CreateNewRollup") .withArgs(newCreatedRollupID, newRollupTypeID, newZKEVMAddress, chainID, gasTokenAddress) - .to.emit(newZkEVMContract, "SequenceBatches") - .withArgs(newSequencedBatch) + .to.emit(newZkEVMContract, "InitialSequenceBatches") .to.emit(rollupManagerContract, "OnSequenceBatches") .withArgs(newCreatedRollupID, newSequencedBatch); @@ -1033,7 +1031,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { const expectedAccInputHash = calculateAccInputHash( ethers.ZeroHash, ethers.keccak256(transaction), - ethers.ZeroHash, + await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), timestampCreatedRollup, trustedSequencer.address ); From 66ad84212cf6a40357d99dabdffaba5279f6f987 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Sat, 18 Nov 2023 21:31:30 +0300 Subject: [PATCH 095/230] moar tests --- .../dataComittee/PolygonDataComittee.sol | 3 +- .../dataComittee/PolygonDataComitteeEtrog.sol | 3 +- .../v2/mocks/PolygonRollupManagerMock.sol | 2 - .../PolygonRollupManagerMockInternalTest.sol | 2 - test/contractsv2/BridgeV2GasTokens.test.ts | 43 ++++++++ test/contractsv2/PolygonRollupManager.test.ts | 98 +++++++++++++++++++ 6 files changed, 145 insertions(+), 6 deletions(-) diff --git a/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol b/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol index 95ddf98f0..bab7adc8c 100644 --- a/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol +++ b/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol @@ -206,7 +206,8 @@ contract PolygonDataComittee is PolygonRollupBase, IPolygonDataComittee { // substract forced batches nonForcedBatchesSequenced -= forcedBatchesSequenced; - pol.safeTransfer( // Transfer pol for every forced batch submitted + // Transfer pol for every forced batch submitted + pol.safeTransfer( address(rollupManager), calculatePolPerForceBatch() * (forcedBatchesSequenced) ); diff --git a/contracts/v2/consensus/dataComittee/PolygonDataComitteeEtrog.sol b/contracts/v2/consensus/dataComittee/PolygonDataComitteeEtrog.sol index 54d0d0d1b..fd0ce3085 100644 --- a/contracts/v2/consensus/dataComittee/PolygonDataComitteeEtrog.sol +++ b/contracts/v2/consensus/dataComittee/PolygonDataComitteeEtrog.sol @@ -200,7 +200,8 @@ contract PolygonDataComitteeEtrog is // substract forced batches nonForcedBatchesSequenced -= forcedBatchesSequenced; - pol.safeTransfer( // Transfer pol for every forced batch submitted + // Transfer pol for every forced batch submitted + pol.safeTransfer( address(rollupManager), calculatePolPerForceBatch() * (forcedBatchesSequenced) ); diff --git a/contracts/v2/mocks/PolygonRollupManagerMock.sol b/contracts/v2/mocks/PolygonRollupManagerMock.sol index 3cde233aa..4067f98fb 100644 --- a/contracts/v2/mocks/PolygonRollupManagerMock.sol +++ b/contracts/v2/mocks/PolygonRollupManagerMock.sol @@ -48,7 +48,6 @@ contract PolygonRollupManagerMock is PolygonRollupManager { // Even this role can only update to an already added verifier/consensus // Could break the compatibility of them, changing the virtual state - // review _setupRole(_UPDATE_ROLLUP_ROLE, timelock); // Admin roles @@ -59,7 +58,6 @@ contract PolygonRollupManagerMock is PolygonRollupManager { _setRoleAdmin(_TRUSTED_AGGREGATOR_ROLE, _TRUSTED_AGGREGATOR_ROLE_ADMIN); _setupRole(_TRUSTED_AGGREGATOR_ROLE_ADMIN, admin); - // review Could be another address?¿ _setupRole(_SET_FEE_ROLE, admin); // Emergency council roles diff --git a/contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol b/contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol index 3f4ff93fa..7047f8e94 100644 --- a/contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol +++ b/contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol @@ -48,7 +48,6 @@ contract PolygonRollupManagerMockInternalTest is PolygonRollupManager { // Even this role can only update to an already added verifier/consensus // Could break the compatibility of them, changing the virtual state - // review _setupRole(_UPDATE_ROLLUP_ROLE, timelock); // Admin roles @@ -59,7 +58,6 @@ contract PolygonRollupManagerMockInternalTest is PolygonRollupManager { _setRoleAdmin(_TRUSTED_AGGREGATOR_ROLE, _TRUSTED_AGGREGATOR_ROLE_ADMIN); _setupRole(_TRUSTED_AGGREGATOR_ROLE_ADMIN, admin); - // review Could be another address?¿ _setupRole(_SET_FEE_ROLE, admin); // Emergency council roles diff --git a/test/contractsv2/BridgeV2GasTokens.test.ts b/test/contractsv2/BridgeV2GasTokens.test.ts index a635cb343..679ed9165 100644 --- a/test/contractsv2/BridgeV2GasTokens.test.ts +++ b/test/contractsv2/BridgeV2GasTokens.test.ts @@ -132,6 +132,49 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { expect(await polygonZkEVMBridgeContract.gasTokenMetadata()).to.be.equal(gasTokenMetadata); }); + it("should check the initalized function", async () => { + // deploy PolygonZkEVMBridge + const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + const bridge = await upgrades.deployProxy(polygonZkEVMBridgeFactory, [], {initializer: false}); + + await expect( + bridge.initialize( + networkIDMainnet, + ethers.ZeroAddress, // zero for ether + 1, // zero for ether + polygonZkEVMGlobalExitRoot.target, + rollupManager.address, + "0x" + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "GasTokenNetworkMustBeZeroOnEther"); + }); + + it("should check the emergency state", async () => { + expect(await polygonZkEVMBridgeContract.isEmergencyState()).to.be.equal(false); + + await expect(polygonZkEVMBridgeContract.activateEmergencyState()).to.be.revertedWithCustomError( + polygonZkEVMBridgeContract, + "OnlyRollupManager" + ); + await expect(polygonZkEVMBridgeContract.connect(rollupManager).activateEmergencyState()).to.emit( + polygonZkEVMBridgeContract, + "EmergencyStateActivated" + ); + + expect(await polygonZkEVMBridgeContract.isEmergencyState()).to.be.equal(true); + + await expect( + polygonZkEVMBridgeContract.connect(deployer).deactivateEmergencyState() + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "OnlyRollupManager"); + + await expect(polygonZkEVMBridgeContract.connect(rollupManager).deactivateEmergencyState()).to.emit( + polygonZkEVMBridgeContract, + "EmergencyStateDeactivated" + ); + + expect(await polygonZkEVMBridgeContract.isEmergencyState()).to.be.equal(false); + }); + it("should PolygonZkEVM bridge asset and verify merkle proof", async () => { const depositCount = await polygonZkEVMBridgeContract.depositCount(); const originNetwork = networkIDMainnet; diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index 050fcc4e8..d94613706 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -843,6 +843,55 @@ describe("Polygon ZK-EVM TestnetV2", () => { await expect(newZkEVMContract.sequenceForceBatches([forceBatchStruct])) .to.emit(newZkEVMContract, "SequenceForceBatches") .withArgs(3); + + // Check admin functions + await expect(newZkEVMContract.setTrustedSequencer(deployer.address)).to.be.revertedWithCustomError( + newZkEVMContract, + "OnlyAdmin" + ); + + await expect(newZkEVMContract.connect(admin).setTrustedSequencer(deployer.address)) + .to.emit(newZkEVMContract, "SetTrustedSequencer") + .withArgs(deployer.address); + + await expect(newZkEVMContract.setTrustedSequencerURL("0x1253")).to.be.revertedWithCustomError( + newZkEVMContract, + "OnlyAdmin" + ); + await expect(newZkEVMContract.connect(admin).setTrustedSequencerURL("0x1253")) + .to.emit(newZkEVMContract, "SetTrustedSequencerURL") + .withArgs("0x1253"); + + await expect(newZkEVMContract.setForceBatchTimeout(0)).to.be.revertedWithCustomError( + newZkEVMContract, + "OnlyAdmin" + ); + + await expect( + newZkEVMContract.connect(admin).setForceBatchTimeout(FORCE_BATCH_TIMEOUT) + ).to.be.revertedWithCustomError(newZkEVMContract, "InvalidRangeForceBatchTimeout"); + + await expect(newZkEVMContract.connect(admin).setForceBatchTimeout(0)) + .to.emit(newZkEVMContract, "SetForceBatchTimeout") + .withArgs(0); + + await expect(newZkEVMContract.transferAdminRole(deployer.address)).to.be.revertedWithCustomError( + newZkEVMContract, + "OnlyAdmin" + ); + + await expect(newZkEVMContract.connect(admin).transferAdminRole(deployer.address)) + .to.emit(newZkEVMContract, "TransferAdminRole") + .withArgs(deployer.address); + + await expect(newZkEVMContract.connect(admin).acceptAdminRole()).to.be.revertedWithCustomError( + newZkEVMContract, + "OnlyPendingAdmin" + ); + + await expect(newZkEVMContract.connect(deployer).acceptAdminRole()) + .to.emit(newZkEVMContract, "AcceptAdminRole") + .withArgs(deployer.address); }); it("should check full flow etrog", async () => { @@ -1464,6 +1513,55 @@ describe("Polygon ZK-EVM TestnetV2", () => { await expect(newZkEVMContract.sequenceForceBatches([sequenceForced])) .to.emit(newZkEVMContract, "SequenceForceBatches") .withArgs(3); + + // Check admin functions + await expect(newZkEVMContract.setTrustedSequencer(deployer.address)).to.be.revertedWithCustomError( + newZkEVMContract, + "OnlyAdmin" + ); + + await expect(newZkEVMContract.connect(admin).setTrustedSequencer(deployer.address)) + .to.emit(newZkEVMContract, "SetTrustedSequencer") + .withArgs(deployer.address); + + await expect(newZkEVMContract.setTrustedSequencerURL("0x1253")).to.be.revertedWithCustomError( + newZkEVMContract, + "OnlyAdmin" + ); + await expect(newZkEVMContract.connect(admin).setTrustedSequencerURL("0x1253")) + .to.emit(newZkEVMContract, "SetTrustedSequencerURL") + .withArgs("0x1253"); + + await expect(newZkEVMContract.setForceBatchTimeout(0)).to.be.revertedWithCustomError( + newZkEVMContract, + "OnlyAdmin" + ); + + await expect( + newZkEVMContract.connect(admin).setForceBatchTimeout(FORCE_BATCH_TIMEOUT) + ).to.be.revertedWithCustomError(newZkEVMContract, "InvalidRangeForceBatchTimeout"); + + await expect(newZkEVMContract.connect(admin).setForceBatchTimeout(0)) + .to.emit(newZkEVMContract, "SetForceBatchTimeout") + .withArgs(0); + + await expect(newZkEVMContract.transferAdminRole(deployer.address)).to.be.revertedWithCustomError( + newZkEVMContract, + "OnlyAdmin" + ); + + await expect(newZkEVMContract.connect(admin).transferAdminRole(deployer.address)) + .to.emit(newZkEVMContract, "TransferAdminRole") + .withArgs(deployer.address); + + await expect(newZkEVMContract.connect(admin).acceptAdminRole()).to.be.revertedWithCustomError( + newZkEVMContract, + "OnlyPendingAdmin" + ); + + await expect(newZkEVMContract.connect(deployer).acceptAdminRole()) + .to.emit(newZkEVMContract, "AcceptAdminRole") + .withArgs(deployer.address); }); it("should check full flow with gas Token", async () => { From 5f6c1d4130555793c105c14c042710d82574c053 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 21 Nov 2023 11:47:41 +0100 Subject: [PATCH 096/230] update paris compiled contracts --- compiled-contracts/paris/ERC20PermitMock.json | 4 +- compiled-contracts/paris/FflonkVerifier.json | 4 +- .../paris/PolygonDataComittee.json | 97 +++++++++++-- .../paris/PolygonRollupManager.json | 100 +------------- compiled-contracts/paris/PolygonZkEVM.json | 4 +- .../paris/PolygonZkEVMBridge.json | 4 +- .../paris/PolygonZkEVMBridgeMock.json | 4 +- .../paris/PolygonZkEVMBridgeV2.json | 70 +++++++++- .../paris/PolygonZkEVMDeployer.json | 4 +- .../paris/PolygonZkEVMGlobalExitRoot.json | 4 +- .../paris/PolygonZkEVMGlobalExitRootL2.json | 4 +- .../PolygonZkEVMGlobalExitRootL2Mock.json | 4 +- .../paris/PolygonZkEVMGlobalExitRootMock.json | 4 +- .../paris/PolygonZkEVMGlobalExitRootV2.json | 127 +++++++++++++++++- .../paris/PolygonZkEVMMock.json | 4 +- .../paris/PolygonZkEVMTimelock.json | 4 +- compiled-contracts/paris/PolygonZkEVMV2.json | 97 +++++++++++-- .../paris/PolygonZkEVMV2Existent.json | 97 +++++++++++-- compiled-contracts/paris/ProxyAdmin.json | 4 +- compiled-contracts/paris/TokenWrapped.json | 4 +- .../paris/TransparentUpgradeableProxy.json | 4 +- .../paris/VerifierRollupHelperMock.json | 4 +- deployment/v2/verifyContracts.js | 34 +++-- docker/scripts/fund-accounts.js | 4 +- package.json | 2 +- 25 files changed, 495 insertions(+), 197 deletions(-) diff --git a/compiled-contracts/paris/ERC20PermitMock.json b/compiled-contracts/paris/ERC20PermitMock.json index 2fe791c2e..98f93ab81 100644 --- a/compiled-contracts/paris/ERC20PermitMock.json +++ b/compiled-contracts/paris/ERC20PermitMock.json @@ -517,8 +517,8 @@ "type": "function" } ], - "bytecode": "0x6080604052604051620013d9380380620013d9833981016040819052620000269162000201565b8383600362000036838262000322565b50600462000045828262000322565b5050506200005a82826200007160201b60201c565b505081516020909201919091206006555062000416565b6001600160a01b038216620000cc5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060026000828254620000e09190620003ee565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200016457600080fd5b81516001600160401b03808211156200018157620001816200013c565b604051601f8301601f19908116603f01168101908282118183101715620001ac57620001ac6200013c565b81604052838152602092508683858801011115620001c957600080fd5b600091505b83821015620001ed5785820183015181830184015290820190620001ce565b600093810190920192909252949350505050565b600080600080608085870312156200021857600080fd5b84516001600160401b03808211156200023057600080fd5b6200023e8883890162000152565b955060208701519150808211156200025557600080fd5b50620002648782880162000152565b604087015190945090506001600160a01b03811681146200028457600080fd5b6060959095015193969295505050565b600181811c90821680620002a957607f821691505b602082108103620002ca57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200013757600081815260208120601f850160051c81016020861015620002f95750805b601f850160051c820191505b818110156200031a5782815560010162000305565b505050505050565b81516001600160401b038111156200033e576200033e6200013c565b62000356816200034f845462000294565b84620002d0565b602080601f8311600181146200038e5760008415620003755750858301515b600019600386901b1c1916600185901b1785556200031a565b600085815260208120601f198616915b82811015620003bf578886015182559484019460019091019084016200039e565b5085821015620003de5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156200041057634e487b7160e01b600052601160045260246000fd5b92915050565b610fb380620004266000396000f3fe608060405234801561001057600080fd5b506004361061011d5760003560e01c806304622c2e1461012257806306fdde031461013e578063095ea7b31461015357806318160ddd14610176578063222f5be01461017e57806323b872dd1461019357806330adf81f146101a6578063313ce567146101bb5780633408e470146101ca5780633644e515146101d057806339509351146101d857806340c10f19146101eb57806342966c68146101fe57806356189cb41461021157806370a08231146102245780637ecebe001461024d57806395d89b411461026d5780639e4e731814610275578063a457c2d71461028a578063a9059cbb1461029d578063c473af33146102b0578063d505accf146102c5578063dd62ed3e146102d8575b600080fd5b61012b60065481565b6040519081526020015b60405180910390f35b6101466102eb565b6040516101359190610ca4565b610166610161366004610d0e565b61037d565b6040519015158152602001610135565b60025461012b565b61019161018c366004610d38565b610397565b005b6101666101a1366004610d38565b6103a7565b61012b600080516020610f3e83398151915281565b60405160128152602001610135565b4661012b565b61012b6103cb565b6101666101e6366004610d0e565b610420565b6101916101f9366004610d0e565b610442565b61019161020c366004610d74565b610450565b61019161021f366004610d38565b61045d565b61012b610232366004610d8d565b6001600160a01b031660009081526020819052604090205490565b61012b61025b366004610d8d565b60056020526000908152604090205481565b610146610468565b61012b600080516020610efe83398151915281565b610166610298366004610d0e565b610477565b6101666102ab366004610d0e565b6104f7565b61012b600080516020610f5e83398151915281565b6101916102d3366004610daf565b610505565b61012b6102e6366004610e22565b610602565b6060600380546102fa90610e55565b80601f016020809104026020016040519081016040528092919081815260200182805461032690610e55565b80156103735780601f1061034857610100808354040283529160200191610373565b820191906000526020600020905b81548152906001019060200180831161035657829003601f168201915b5050505050905090565b60003361038b81858561062d565b60019150505b92915050565b6103a2838383610751565b505050565b6000336103b58582856108e5565b6103c0858585610751565b506001949350505050565b60065460405160009161040591600080516020610f5e8339815191529190600080516020610efe8339815191529046903090602001610e8f565b60405160208183030381529060405280519060200120905090565b60003361038b8185856104338383610602565b61043d9190610ed1565b61062d565b61044c8282610959565b5050565b61045a3382610a06565b50565b6103a283838361062d565b6060600480546102fa90610e55565b600033816104858286610602565b9050838110156104ea5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b6103c0828686840361062d565b60003361038b818585610751565b428410156105515760405162461bcd60e51b81526020600482015260196024820152781211568e8e9c195c9b5a5d0e881055551217d1561412549151603a1b60448201526064016104e1565b6001600160a01b03871660009081526005602052604081208054600080516020610f3e833981519152918a918a918a91908661058c83610ee4565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506105ed8882868686610b26565b6105f888888861062d565b5050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661068f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104e1565b6001600160a01b0382166106f05760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104e1565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166107b55760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104e1565b6001600160a01b0382166108175760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104e1565b6001600160a01b0383166000908152602081905260409020548181101561088f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104e1565b6001600160a01b0384811660008181526020818152604080832087870390559387168083529184902080548701905592518581529092600080516020610f1e833981519152910160405180910390a35b50505050565b60006108f18484610602565b905060001981146108df578181101561094c5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104e1565b6108df848484840361062d565b6001600160a01b0382166109af5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104e1565b80600260008282546109c19190610ed1565b90915550506001600160a01b03821660008181526020818152604080832080548601905551848152600080516020610f1e833981519152910160405180910390a35050565b6001600160a01b038216610a665760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104e1565b6001600160a01b03821660009081526020819052604090205481811015610ada5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104e1565b6001600160a01b038316600081815260208181526040808320868603905560028054879003905551858152919291600080516020610f1e833981519152910160405180910390a3505050565b600654604051600091610b6091600080516020610f5e8339815191529190600080516020610efe8339815191529046903090602001610e8f565b60405160208183030381529060405280519060200120905060008186604051602001610ba392919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610c0e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590610c445750876001600160a01b0316816001600160a01b0316145b6105f85760405162461bcd60e51b815260206004820152602b60248201527f48455a3a3a5f76616c69646174655369676e6564446174613a20494e56414c4960448201526a445f5349474e415455524560a81b60648201526084016104e1565b600060208083528351808285015260005b81811015610cd157858101830151858201604001528201610cb5565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610d0957600080fd5b919050565b60008060408385031215610d2157600080fd5b610d2a83610cf2565b946020939093013593505050565b600080600060608486031215610d4d57600080fd5b610d5684610cf2565b9250610d6460208501610cf2565b9150604084013590509250925092565b600060208284031215610d8657600080fd5b5035919050565b600060208284031215610d9f57600080fd5b610da882610cf2565b9392505050565b600080600080600080600060e0888a031215610dca57600080fd5b610dd388610cf2565b9650610de160208901610cf2565b95506040880135945060608801359350608088013560ff81168114610e0557600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610e3557600080fd5b610e3e83610cf2565b9150610e4c60208401610cf2565b90509250929050565b600181811c90821680610e6957607f821691505b602082108103610e8957634e487b7160e01b600052602260045260246000fd5b50919050565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561039157610391610ebb565b600060018201610ef657610ef6610ebb565b506001019056fec89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa264697066735822122041a6dcdc4cb18d6e1d492dee93c2f0a0cc6012cce6793b641662a6378ea999a464736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061011d5760003560e01c806304622c2e1461012257806306fdde031461013e578063095ea7b31461015357806318160ddd14610176578063222f5be01461017e57806323b872dd1461019357806330adf81f146101a6578063313ce567146101bb5780633408e470146101ca5780633644e515146101d057806339509351146101d857806340c10f19146101eb57806342966c68146101fe57806356189cb41461021157806370a08231146102245780637ecebe001461024d57806395d89b411461026d5780639e4e731814610275578063a457c2d71461028a578063a9059cbb1461029d578063c473af33146102b0578063d505accf146102c5578063dd62ed3e146102d8575b600080fd5b61012b60065481565b6040519081526020015b60405180910390f35b6101466102eb565b6040516101359190610ca4565b610166610161366004610d0e565b61037d565b6040519015158152602001610135565b60025461012b565b61019161018c366004610d38565b610397565b005b6101666101a1366004610d38565b6103a7565b61012b600080516020610f3e83398151915281565b60405160128152602001610135565b4661012b565b61012b6103cb565b6101666101e6366004610d0e565b610420565b6101916101f9366004610d0e565b610442565b61019161020c366004610d74565b610450565b61019161021f366004610d38565b61045d565b61012b610232366004610d8d565b6001600160a01b031660009081526020819052604090205490565b61012b61025b366004610d8d565b60056020526000908152604090205481565b610146610468565b61012b600080516020610efe83398151915281565b610166610298366004610d0e565b610477565b6101666102ab366004610d0e565b6104f7565b61012b600080516020610f5e83398151915281565b6101916102d3366004610daf565b610505565b61012b6102e6366004610e22565b610602565b6060600380546102fa90610e55565b80601f016020809104026020016040519081016040528092919081815260200182805461032690610e55565b80156103735780601f1061034857610100808354040283529160200191610373565b820191906000526020600020905b81548152906001019060200180831161035657829003601f168201915b5050505050905090565b60003361038b81858561062d565b60019150505b92915050565b6103a2838383610751565b505050565b6000336103b58582856108e5565b6103c0858585610751565b506001949350505050565b60065460405160009161040591600080516020610f5e8339815191529190600080516020610efe8339815191529046903090602001610e8f565b60405160208183030381529060405280519060200120905090565b60003361038b8185856104338383610602565b61043d9190610ed1565b61062d565b61044c8282610959565b5050565b61045a3382610a06565b50565b6103a283838361062d565b6060600480546102fa90610e55565b600033816104858286610602565b9050838110156104ea5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b6103c0828686840361062d565b60003361038b818585610751565b428410156105515760405162461bcd60e51b81526020600482015260196024820152781211568e8e9c195c9b5a5d0e881055551217d1561412549151603a1b60448201526064016104e1565b6001600160a01b03871660009081526005602052604081208054600080516020610f3e833981519152918a918a918a91908661058c83610ee4565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506105ed8882868686610b26565b6105f888888861062d565b5050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661068f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104e1565b6001600160a01b0382166106f05760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104e1565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166107b55760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104e1565b6001600160a01b0382166108175760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104e1565b6001600160a01b0383166000908152602081905260409020548181101561088f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104e1565b6001600160a01b0384811660008181526020818152604080832087870390559387168083529184902080548701905592518581529092600080516020610f1e833981519152910160405180910390a35b50505050565b60006108f18484610602565b905060001981146108df578181101561094c5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104e1565b6108df848484840361062d565b6001600160a01b0382166109af5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104e1565b80600260008282546109c19190610ed1565b90915550506001600160a01b03821660008181526020818152604080832080548601905551848152600080516020610f1e833981519152910160405180910390a35050565b6001600160a01b038216610a665760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104e1565b6001600160a01b03821660009081526020819052604090205481811015610ada5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104e1565b6001600160a01b038316600081815260208181526040808320868603905560028054879003905551858152919291600080516020610f1e833981519152910160405180910390a3505050565b600654604051600091610b6091600080516020610f5e8339815191529190600080516020610efe8339815191529046903090602001610e8f565b60405160208183030381529060405280519060200120905060008186604051602001610ba392919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610c0e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590610c445750876001600160a01b0316816001600160a01b0316145b6105f85760405162461bcd60e51b815260206004820152602b60248201527f48455a3a3a5f76616c69646174655369676e6564446174613a20494e56414c4960448201526a445f5349474e415455524560a81b60648201526084016104e1565b600060208083528351808285015260005b81811015610cd157858101830151858201604001528201610cb5565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610d0957600080fd5b919050565b60008060408385031215610d2157600080fd5b610d2a83610cf2565b946020939093013593505050565b600080600060608486031215610d4d57600080fd5b610d5684610cf2565b9250610d6460208501610cf2565b9150604084013590509250925092565b600060208284031215610d8657600080fd5b5035919050565b600060208284031215610d9f57600080fd5b610da882610cf2565b9392505050565b600080600080600080600060e0888a031215610dca57600080fd5b610dd388610cf2565b9650610de160208901610cf2565b95506040880135945060608801359350608088013560ff81168114610e0557600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610e3557600080fd5b610e3e83610cf2565b9150610e4c60208401610cf2565b90509250929050565b600181811c90821680610e6957607f821691505b602082108103610e8957634e487b7160e01b600052602260045260246000fd5b50919050565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561039157610391610ebb565b600060018201610ef657610ef6610ebb565b506001019056fec89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa264697066735822122041a6dcdc4cb18d6e1d492dee93c2f0a0cc6012cce6793b641662a6378ea999a464736f6c63430008140033", + "bytecode": "0x6080604052604051620018e6380380620018e6833981016040819052620000269162000201565b8383600362000036838262000322565b50600462000045828262000322565b5050506200005a82826200007160201b60201c565b505081516020909201919091206006555062000416565b6001600160a01b038216620000cc5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060026000828254620000e09190620003ee565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200016457600080fd5b81516001600160401b03808211156200018157620001816200013c565b604051601f8301601f19908116603f01168101908282118183101715620001ac57620001ac6200013c565b81604052838152602092508683858801011115620001c957600080fd5b600091505b83821015620001ed5785820183015181830184015290820190620001ce565b600093810190920192909252949350505050565b600080600080608085870312156200021857600080fd5b84516001600160401b03808211156200023057600080fd5b6200023e8883890162000152565b955060208701519150808211156200025557600080fd5b50620002648782880162000152565b604087015190945090506001600160a01b03811681146200028457600080fd5b6060959095015193969295505050565b600181811c90821680620002a957607f821691505b602082108103620002ca57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200013757600081815260208120601f850160051c81016020861015620002f95750805b601f850160051c820191505b818110156200031a5782815560010162000305565b505050505050565b81516001600160401b038111156200033e576200033e6200013c565b62000356816200034f845462000294565b84620002d0565b602080601f8311600181146200038e5760008415620003755750858301515b600019600386901b1c1916600185901b1785556200031a565b600085815260208120601f198616915b82811015620003bf578886015182559484019460019091019084016200039e565b5085821015620003de5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156200041057634e487b7160e01b600052601160045260246000fd5b92915050565b6114c080620004266000396000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c806340c10f19116100e35780639e4e73181161008c578063c473af3311610066578063c473af33146103d6578063d505accf146103fd578063dd62ed3e1461041057600080fd5b80639e4e731814610389578063a457c2d7146103b0578063a9059cbb146103c357600080fd5b806370a08231116100bd57806370a082311461032b5780637ecebe001461036157806395d89b411461038157600080fd5b806340c10f19146102f257806342966c681461030557806356189cb41461031857600080fd5b806323b872dd116101455780633408e4701161011f5780633408e4701461024c5780633644e5151461025257806339509351146102df57600080fd5b806323b872dd1461020357806330adf81f14610216578063313ce5671461023d57600080fd5b8063095ea7b311610176578063095ea7b3146101c357806318160ddd146101e6578063222f5be0146101ee57600080fd5b806304622c2e1461019257806306fdde03146101ae575b600080fd5b61019b60065481565b6040519081526020015b60405180910390f35b6101b6610456565b6040516101a591906111e1565b6101d66101d1366004611276565b6104e8565b60405190151581526020016101a5565b60025461019b565b6102016101fc3660046112a0565b610502565b005b6101d66102113660046112a0565b610512565b61019b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b604051601281526020016101a5565b4661019b565b61019b6006546000907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f907fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646604080516020810195909552840192909252606083015260808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6101d66102ed366004611276565b610536565b610201610300366004611276565b610582565b6102016103133660046112dc565b610590565b6102016103263660046112a0565b61059d565b61019b6103393660046112f5565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61019b61036f3660046112f5565b60056020526000908152604090205481565b6101b66105a8565b61019b7fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc681565b6101d66103be366004611276565b6105b7565b6101d66103d1366004611276565b61068d565b61019b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b61020161040b366004611317565b61069b565b61019b61041e36600461138a565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b606060038054610465906113bd565b80601f0160208091040260200160405190810160405280929190818152602001828054610491906113bd565b80156104de5780601f106104b3576101008083540402835291602001916104de565b820191906000526020600020905b8154815290600101906020018083116104c157829003601f168201915b5050505050905090565b6000336104f68185856107e2565b60019150505b92915050565b61050d838383610995565b505050565b600033610520858285610c06565b61052b858585610995565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104f6908290869061057d90879061143f565b6107e2565b61058c8282610cd7565b5050565b61059a3382610dca565b50565b61050d8383836107e2565b606060048054610465906113bd565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61052b82868684036107e2565b6000336104f6818585610995565b42841015610705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f48455a3a3a7065726d69743a20415554485f45585049524544000000000000006044820152606401610677565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661075f83611452565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506107cd8882868686610f8e565b6107d88888886107e2565b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610884576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff8216610927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316610a38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff8216610adb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610b91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35b50505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610c005781811015610cca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610677565b610c0084848484036107e2565b73ffffffffffffffffffffffffffffffffffffffff8216610d54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610677565b8060026000828254610d66919061143f565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216610e6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015610f23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b600654604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f602080830191909152818301939093527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528251808303909101815260c08201909252815191909201207f190100000000000000000000000000000000000000000000000000000000000060e083015260e2820181905261010282018690529060009061012201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156110da573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81161580159061115557508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b6107d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f48455a3a3a5f76616c69646174655369676e6564446174613a20494e56414c4960448201527f445f5349474e41545552450000000000000000000000000000000000000000006064820152608401610677565b600060208083528351808285015260005b8181101561120e578581018301518582016040015282016111f2565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461127157600080fd5b919050565b6000806040838503121561128957600080fd5b6112928361124d565b946020939093013593505050565b6000806000606084860312156112b557600080fd5b6112be8461124d565b92506112cc6020850161124d565b9150604084013590509250925092565b6000602082840312156112ee57600080fd5b5035919050565b60006020828403121561130757600080fd5b6113108261124d565b9392505050565b600080600080600080600060e0888a03121561133257600080fd5b61133b8861124d565b96506113496020890161124d565b95506040880135945060608801359350608088013560ff8116811461136d57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561139d57600080fd5b6113a68361124d565b91506113b46020840161124d565b90509250929050565b600181811c908216806113d157607f821691505b60208210810361140a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104fc576104fc611410565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361148357611483611410565b506001019056fea26469706673582212208b36599ef550f0c194373b0c511974c888d8ed7226087368a04dca3579711bcd64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061018d5760003560e01c806340c10f19116100e35780639e4e73181161008c578063c473af3311610066578063c473af33146103d6578063d505accf146103fd578063dd62ed3e1461041057600080fd5b80639e4e731814610389578063a457c2d7146103b0578063a9059cbb146103c357600080fd5b806370a08231116100bd57806370a082311461032b5780637ecebe001461036157806395d89b411461038157600080fd5b806340c10f19146102f257806342966c681461030557806356189cb41461031857600080fd5b806323b872dd116101455780633408e4701161011f5780633408e4701461024c5780633644e5151461025257806339509351146102df57600080fd5b806323b872dd1461020357806330adf81f14610216578063313ce5671461023d57600080fd5b8063095ea7b311610176578063095ea7b3146101c357806318160ddd146101e6578063222f5be0146101ee57600080fd5b806304622c2e1461019257806306fdde03146101ae575b600080fd5b61019b60065481565b6040519081526020015b60405180910390f35b6101b6610456565b6040516101a591906111e1565b6101d66101d1366004611276565b6104e8565b60405190151581526020016101a5565b60025461019b565b6102016101fc3660046112a0565b610502565b005b6101d66102113660046112a0565b610512565b61019b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b604051601281526020016101a5565b4661019b565b61019b6006546000907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f907fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646604080516020810195909552840192909252606083015260808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6101d66102ed366004611276565b610536565b610201610300366004611276565b610582565b6102016103133660046112dc565b610590565b6102016103263660046112a0565b61059d565b61019b6103393660046112f5565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61019b61036f3660046112f5565b60056020526000908152604090205481565b6101b66105a8565b61019b7fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc681565b6101d66103be366004611276565b6105b7565b6101d66103d1366004611276565b61068d565b61019b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b61020161040b366004611317565b61069b565b61019b61041e36600461138a565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b606060038054610465906113bd565b80601f0160208091040260200160405190810160405280929190818152602001828054610491906113bd565b80156104de5780601f106104b3576101008083540402835291602001916104de565b820191906000526020600020905b8154815290600101906020018083116104c157829003601f168201915b5050505050905090565b6000336104f68185856107e2565b60019150505b92915050565b61050d838383610995565b505050565b600033610520858285610c06565b61052b858585610995565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104f6908290869061057d90879061143f565b6107e2565b61058c8282610cd7565b5050565b61059a3382610dca565b50565b61050d8383836107e2565b606060048054610465906113bd565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61052b82868684036107e2565b6000336104f6818585610995565b42841015610705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f48455a3a3a7065726d69743a20415554485f45585049524544000000000000006044820152606401610677565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661075f83611452565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506107cd8882868686610f8e565b6107d88888886107e2565b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610884576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff8216610927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316610a38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff8216610adb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610b91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35b50505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610c005781811015610cca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610677565b610c0084848484036107e2565b73ffffffffffffffffffffffffffffffffffffffff8216610d54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610677565b8060026000828254610d66919061143f565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216610e6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015610f23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610677565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b600654604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f602080830191909152818301939093527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528251808303909101815260c08201909252815191909201207f190100000000000000000000000000000000000000000000000000000000000060e083015260e2820181905261010282018690529060009061012201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156110da573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81161580159061115557508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b6107d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f48455a3a3a5f76616c69646174655369676e6564446174613a20494e56414c4960448201527f445f5349474e41545552450000000000000000000000000000000000000000006064820152608401610677565b600060208083528351808285015260005b8181101561120e578581018301518582016040015282016111f2565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461127157600080fd5b919050565b6000806040838503121561128957600080fd5b6112928361124d565b946020939093013593505050565b6000806000606084860312156112b557600080fd5b6112be8461124d565b92506112cc6020850161124d565b9150604084013590509250925092565b6000602082840312156112ee57600080fd5b5035919050565b60006020828403121561130757600080fd5b6113108261124d565b9392505050565b600080600080600080600060e0888a03121561133257600080fd5b61133b8861124d565b96506113496020890161124d565b95506040880135945060608801359350608088013560ff8116811461136d57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561139d57600080fd5b6113a68361124d565b91506113b46020840161124d565b90509250929050565b600181811c908216806113d157607f821691505b60208210810361140a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104fc576104fc611410565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361148357611483611410565b506001019056fea26469706673582212208b36599ef550f0c194373b0c511974c888d8ed7226087368a04dca3579711bcd64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/FflonkVerifier.json b/compiled-contracts/paris/FflonkVerifier.json index 59e13bada..b1c7ce830 100644 --- a/compiled-contracts/paris/FflonkVerifier.json +++ b/compiled-contracts/paris/FflonkVerifier.json @@ -28,8 +28,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b5061389e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80639121da8a14610030575b600080fd5b61004361003e366004613723565b610057565b604051901515815260200160405180910390f35b60006136b1565b6040516104c08201518082526020820191506000805160206137e98339815191526104e0840151820990508082526020820191506000805160206137e9833981519152610500840151820990508082526020820191506000805160206137e9833981519152610520840151820990508082526020820191506000805160206137e9833981519152602061052001840151820990508082526020820191506000805160206137e9833981519152604061052001840151820990508082526020820191506000805160206137e9833981519152606061052001840151820990508082526020820191506000805160206137e9833981519152608061052001840151820990508082526020820191506000805160206137e983398151915260a061052001840151820990508082526020820191506000805160206137e983398151915260c061052001840151820990508082526020820191506000805160206137e983398151915260e061052001840151820990508082526020820191506000805160206137e9833981519152610620840151820990508082526020820191506000805160206137e9833981519152602061062001840151820990508082526020820191506000805160206137e9833981519152604061062001840151820990508082526020820191506000805160206137e9833981519152606061062001840151820990508082526020820191506000805160206137e98339815191526106a0840151820990508082526020820191506000805160206137e983398151915260206106a001840151820990508082526020820191506000805160206137e983398151915260406106a001840151820990508082526020820191506000805160206137e983398151915260606106a001840151820990508082526020820191506000805160206137e983398151915260806106a001840151820990508082526020820191506000805160206137e983398151915260a06106a001840151820990508082526020820191506000805160206137e9833981519152610760840151820990508082526102e4356000805160206137e9833981519152818309600114610388576000805260206000f35b8091506020830392506000805160206137e98339815191528351830990506000805160206137e983398151915261076085015183099150806107608501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260a06106a001850151830991508060a06106a0018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260806106a001850151830991508060806106a0018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260606106a001850151830991508060606106a0018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260406106a001850151830991508060406106a0018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260206106a001850151830991508060206106a0018501526020830392506000805160206137e98339815191528351830990506000805160206137e98339815191526106a085015183099150806106a08501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260606106200185015183099150806060610620018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260406106200185015183099150806040610620018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260206106200185015183099150806020610620018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915261062085015183099150806106208501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260e061052001850151830991508060e0610520018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260c061052001850151830991508060c0610520018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260a061052001850151830991508060a0610520018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260806105200185015183099150806080610520018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260606105200185015183099150806060610520018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260406105200185015183099150806040610520018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260206105200185015183099150806020610520018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915261052085015183099150806105208501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915261050085015183099150806105008501526020830392506000805160206137e98339815191528351830990506000805160206137e98339815191526104e085015183099150806104e085015250806104c0840152505050565b6000805160206137e983398151915281106108e8576000805260206000f35b50565b8035602082013560008051602061376983398151915260036000805160206137698339815191528085860985090891506000805160206137698339815191528182099050808214610940576000805260206000f35b505050565b61094f60046108eb565b61095960446108eb565b61096360846108eb565b61096d60c46108eb565b610979610104356108c9565b610985610124356108c9565b610991610144356108c9565b61099d610164356108c9565b6109a9610184356108c9565b6109b56101a4356108c9565b6109c16101c4356108c9565b6109cd6101e4356108c9565b6109d9610204356108c9565b6109e5610224356108c9565b6109f1610244356108c9565b6109fd610264356108c9565b610a09610284356108c9565b610a156102a4356108c9565b610a216102c4356108c9565b610a2d6102e4356108c9565b565b60008051602061384983398151915261078082019081526000805160206138298339815191526107a0830190815283356107c084019081526004356107e085015260243561080085015260a083206000805160206137e9833981519152908190066020808701918252902081900660408601819052845260443590925260643590526060909120819006608083018190529081800960a0830181905260808301516000805160206137e9833981519152910960e08301526000805160206137e98339815191527f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8060e0840151096101008301526000805160206137e98339815191526000805160206137a983398151915260e0840151096101208301526000805160206137e98339815191527f1d59376149b959ccbd157ac850893a6f07c2d99b3852513ab8d01be8e846a56660e0840151096101408301526000805160206137e983398151915260008051602061380983398151915260e0840151096101608301526000805160206137e98339815191527f0530d09118705106cbb4a786ead16926d5d174e181a26686af5448492e42a18160e0840151096101808301526000805160206137e983398151915277b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb60e0840151096101a08301526000805160206137e98339815191527f130b17119778465cfb3acaee30f81dee20710ead41671f568b11d9ab07b95a9b60e0840151096101c083015260e08201516000805160206137e98339815191529080096101e08301526000805160206137e98339815191526000805160206137a98339815191526101e0840151096102008301526000805160206137e98339815191526000805160206138098339815191526101e0840151096102208301526000805160206137e983398151915277b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb6101e0840151096102408301526000805160206137e983398151915260a08301516101e0840151096102608301526000805160206137e9833981519152600080516020613789833981519152610260840151096102808301526000805160206137e983398151915277b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd610260840151096102a08301526000805160206137e98339815191527f283ce45a2e5b8e4e78f9fbaf5f6a348bfcfaf76dd28e5ca7121b74ef68fdec2e610260840151096102c08301526000805160206137e98339815191526000805160206137898339815191526102c0840151096102e08301526000805160206137e983398151915277b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd6102c0840151096103008301526102608201516000805160206137e98339815191529081818009098060c08401526000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e98339815191528182096000805160206137e9833981519152600080516020613809833981519152909101066104a084018190526104c0840152506107808201526101e06101046107a083013761020061078082019081206000805160206137e98339815191529081900680845282526084356107a084015260a4356107c08401526060918290200691015250565b60e0810151606082015160016000805160206137e983398151915283820990506000805160206137e983398151915283820990506000805160206137e983398151915283820990506000805160206137e983398151915283820990506000805160206137e983398151915283820990506000805160206137e983398151915283820990506000805160206137e98339815191528160080960e0850151935090506000805160206137e983398151915283810381900683086000805160206137e98339815191528082860983096105208601526101c08501516101008601519094506000805160206137e9833981519152908103819006840890506000805160206137e98339815191528082860983096105408601526101a08501516101208601519094506000805160206137e9833981519152908103819006840890506000805160206137e98339815191528082860983096105608601526101808501516101408601519094506000805160206137e9833981519152908103819006840890506000805160206137e983398151915280828609830961058086015261016085015193506000805160206137e9833981519152848103819006840890506000805160206137e98339815191528082860983096105a08601526101408501516101808601519094506000805160206137e9833981519152908103819006840890506000805160206137e98339815191528082860983096105c08601526101208501516101a08601519094506000805160206137e9833981519152908103819006840890506000805160206137e98339815191528082860983096105e08601526101008501516101c08601519094506000805160206137e9833981519152908103819006840890506000805160206137e983398151915280828609830960e0610520018601525050505050565b6101e0810151606082015160016000805160206137e983398151915283820990506000805160206137e983398151915283820990506000805160206137e9833981519152816004096101e0850151935090506000805160206137e983398151915283810381900683086000805160206137e98339815191528082860983096106208601526102408501516102008601519094506000805160206137e9833981519152908103819006840890506000805160206137e983398151915280828609830961064086015261022085015193506000805160206137e9833981519152848103819006840890506000805160206137e98339815191528082860983096106608601526102008501516102408601519094506000805160206137e9833981519152908103819006840890506000805160206137e98339815191528082860983096060610620018601525050505050565b60608101516000805160206137e9833981519152806000805160206137e9833981519152806000805160206137c983398151915260c0870151096000805160206137e9833981519152030660c0850151086000805160206137e9833981519152610260850151600309096102608301516000805160206137e983398151915281810381900684086000805160206137e98339815191528082840984096106a08601526102a08501516102808601519092506000805160206137e9833981519152908103819006850890506000805160206137e98339815191528082840984096106c08601526102808501516102a08601519092506000805160206137e9833981519152908103819006850890506000805160206137e983398151915280828409840960406106a0018601526000805160206137e9833981519152806000805160206137e983398151915260c08801516000805160206137e983398151915203066000805160206137e98339815191526000805160206137c983398151915260c08a015109086000805160206137e98339815191526102c0880151600309096102c086015190935091506000805160206137e9833981519152828103819006850890506000805160206137e98339815191528082840984096107008601526103008501516102e08601519092506000805160206137e9833981519152908103819006850890506000805160206137e98339815191528082840984096107208601526102e08501516103008601519092506000805160206137e9833981519152908103819006850890506000805160206137e983398151915280828409840960a06106a0018601525050505050565b60608101516000805160206137e9833981519152806101e08401516000805160206137e9833981519152030682086000805160206137e9833981519152806000805160206137e98339815191526102008601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526102208601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526102408601516000805160206137e98339815191520306840882099050806104e08401526000805160206137e9833981519152806102608501516000805160206137e98339815191520306830890506000805160206137e9833981519152806000805160206137e98339815191526102808601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526102a08601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526102c08601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526102e08601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526103008601516000805160206137e983398151915203068408820990508061050084015261195f836110a8565b61196883611352565b611971836114a2565b505060c081015160016000805160206137e9833981519152600080516020613809833981519152830181900663010000000961076084015250506108e88161005e565b6104a08101516000805160206137e983398151915281610760840151096107608301525050565b60006000805160206137e9833981519152806000805160206137e983398151915285356107608601510983030106905080610320830152505050565b600160608201516000805160206137e983398151915281830991506000805160206137e983398151915281830991506000805160206137e983398151915281830991506000805160206137e983398151915281830991506000805160206137e983398151915281830991506000805160206137e983398151915281830991506000805160206137e983398151915281830991506000805160206137e98339815191528183099150506000805160206137e98339815191528060c08401516000805160206137e98339815191520306820860e083015190915060009081806000805160206137e983398151915280846101243509610104350891506000805160206137e983398151915283840990506000805160206137e983398151915280826101643509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101443509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101843509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101a43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101c43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101e43509830891506000805160206137e9833981519152806000805160206137e9833981519152600061052001890151880984098508935061010086015192506000805160206137e983398151915280846101243509610104350891506000805160206137e983398151915283840990506000805160206137e983398151915280826101643509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101443509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101843509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101a43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101c43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101e43509830891506000805160206137e9833981519152806000805160206137e9833981519152602061052001890151880984098508935061012086015192506000805160206137e983398151915280846101243509610104350891506000805160206137e983398151915283840990506000805160206137e983398151915280826101643509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101443509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101843509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101a43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101c43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101e43509830891506000805160206137e9833981519152806000805160206137e9833981519152604061052001890151880984098508935061014086015192506000805160206137e983398151915280846101243509610104350891506000805160206137e983398151915283840990506000805160206137e983398151915280826101643509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101443509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101843509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101a43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101c43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101e43509830891506000805160206137e9833981519152806000805160206137e9833981519152606061052001890151880984098508935061016086015192506000805160206137e983398151915280846101243509610104350891506000805160206137e983398151915283840990506000805160206137e983398151915280826101643509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101443509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101843509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101a43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101c43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101e43509830891506000805160206137e9833981519152806000805160206137e9833981519152608061052001890151880984098508935061018086015192506000805160206137e983398151915280846101243509610104350891506000805160206137e983398151915283840990506000805160206137e983398151915280826101643509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101443509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101843509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101a43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101c43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101e43509830891506000805160206137e9833981519152806000805160206137e983398151915260a06105200189015188098409850893506101a086015192506000805160206137e983398151915280846101243509610104350891506000805160206137e983398151915283840990506000805160206137e983398151915280826101643509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101443509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101843509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101a43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101c43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101e43509830891506000805160206137e9833981519152806000805160206137e983398151915260c06105200189015188098409850893506101c086015192506000805160206137e983398151915280846101243509610104350891506000805160206137e983398151915283840990506000805160206137e983398151915280826101643509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101443509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101843509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101a43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101c43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101e4350983089150506000805160206137e9833981519152806000805160206137e983398151915260e0610520018801518709830984089250505080610340840152505050565b600160608201516000805160206137e983398151915281830991506000805160206137e983398151915281830991506000805160206137e983398151915281830991506000805160206137e98339815191528183099150506000805160206137e98339815191528060c08401516000805160206137e983398151915203068208905060006102043561022435610244356000805160206137e983398151915283610104350993506000805160206137e983398151915280836101243509850893506000805160206137e9833981519152806000805160206137e98339815191528486096101443509850893506000805160206137e983398151915280826101643509850893506000805160206137e983398151915261018435850893506000805160206137e9833981519152610320870151850893506000805160206137e98339815191526104c087015185096101e08701519094506000908490826000805160206137e983398151915280878409840892506000805160206137e983398151915282830990506000805160206137e983398151915280868309840892506000805160206137e983398151915280896000805160206137e983398151915285850909840892506000805160206137e9833981519152806000805160206137e98339815191526020600002610620018d01518c098509850893508692506102008a015191506000805160206137e983398151915280878409840892506000805160206137e983398151915282830990506000805160206137e983398151915280868309840892506000805160206137e983398151915280896000805160206137e983398151915285850909840892506000805160206137e9833981519152806000805160206137e98339815191526020600102610620018d01518c098509850893508692506102208a015191506000805160206137e983398151915280878409840892506000805160206137e983398151915282830990506000805160206137e983398151915280868309840892506000805160206137e983398151915280896000805160206137e983398151915285850909840892506000805160206137e9833981519152806000805160206137e98339815191526020600202610620018d01518c098509850893508692506102408a015191506000805160206137e983398151915280878409840892506000805160206137e983398151915282830990506000805160206137e983398151915280868309840892506000805160206137e983398151915280896000805160206137e9833981519152858509098408925050506000805160206137e9833981519152806000805160206137e98339815191526020600302610620018b01518a09830983089150508061036088015250505050505050565b606081015160016000805160206137e983398151915281830990506000805160206137e983398151915281830990506000805160206137e983398151915281830990506000805160206137e983398151915281830990506000805160206137e983398151915281830990506000805160206137e9833981519152818309905060016000805160206137e983398151915281840990506000805160206137e983398151915281840990506000805160206137e983398151915281840990506000805160206137e98339815191528060c08601516000805160206137e98339815191526000805160206137c983398151915260c08901510908820990506000805160206137e983398151915280826000805160206137e98339815191520306830860c08501519092506000805160206137e983398151915290816000805160206137c983398151915282090990506000805160206137e98339815191528183089150506000915060006000805160206137e983398151915260c085015160208601510960408501516000805160206137e983398151915280828408610204350892506000805160206137e9833981519152806000805160206137e9833981519152836000805160206137e983398151915260028709086102243508840992506000805160206137e9833981519152806000805160206137e9833981519152836000805160206137e983398151915260038709086102443508840992506000805160206137e983398151915261026435840992506000805160206137e983398151915280826000805160206137e98339815191526101a43560208b01510908610204350894506000805160206137e9833981519152806000805160206137e9833981519152836000805160206137e98339815191526101c43560208c015109086102243508860994506000805160206137e9833981519152806000805160206137e9833981519152836000805160206137e98339815191526101e43560208c015109086102443508860994506000805160206137e983398151915261028435860994506000805160206137e983398151915280866000805160206137e98339815191520306840892506000805160206137e98339815191526104c0870151840992506001610264350394506000805160206137e9833981519152610760870151860994506000805160206137e98339815191526104c08701518609610260870151909550915060009050806000805160206137e983398151915280878509610264350890506000805160206137e983398151915280856000805160206137e983398151915286870909820890506000805160206137e9833981519152806000805160206137e983398151915260206000026106a0018a0151880983098308915061028087015192506000805160206137e983398151915280878509610264350890506000805160206137e983398151915280856000805160206137e983398151915286870909820890506000805160206137e9833981519152806000805160206137e983398151915260206001026106a0018a015188098309830891506102a087015192506000805160206137e983398151915280878509610264350890506000805160206137e983398151915280856000805160206137e983398151915286870909820890506000805160206137e9833981519152806000805160206137e983398151915260206002026106a0018a015188098309830891506102c087015192506000805160206137e9833981519152806102a4358509610284350890506000805160206137e9833981519152806102c4356000805160206137e983398151915286870909820890506000805160206137e9833981519152806000805160206137e983398151915260206003026106a0018a015188098309830891506102e087015192506000805160206137e9833981519152806102a4358509610284350890506000805160206137e9833981519152806102c4356000805160206137e983398151915286870909820890506000805160206137e9833981519152806000805160206137e983398151915260206004026106a0018a0151880983098308915061030087015192506000805160206137e9833981519152806102a4358509610284350890506000805160206137e9833981519152806102c4356000805160206137e983398151915286870909820890506000805160206137e9833981519152806000805160206137e983398151915260206005026106a0018a015188098309830891505080610380870152505050505050565b6040518151815260208201516020820152825160408201526020830151606082015260408260808360066107d05a03fa905080610940576000805260206000f35b6000604051833581526020840135602082015284604082015260408160608360076107d05a03fa915081613150576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa91505080613181576000805260206000f35b50505050565b600060405183815284602082015285604082015260408160608360076107d05a03fa9150816131ba576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa915050806131eb576000805260206000f35b5050505050565b60608101516000805160206137e98339815191528060e08401516000805160206137e9833981519152030682086000805160206137e9833981519152806000805160206137e98339815191526101008601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526101208601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526101408601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526101608601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526101808601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526101a08601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526101c08601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806104e0850151830984510991506000805160206137e983398151915280610500850151830984516000805160206137e9833981519152908009096000805160206138498339815191526103a085015260008051602061382983398151915260206103a00185015261344a8360046103a08701613118565b61345a8160446103a08701613118565b6134b16000805160206137e9833981519152806000805160206137e983398151915261038088015185096000805160206137e983398151915261036089015188090861034087015108600260016103e08801613187565b506109408160846104208601613118565b604051610400820180516000805160206137698339815191529081038190069091526104408301805182039190910690526000906135086103e084016103a085016130d7565b61351a61042084016103a085016130d7565b61352e606084015160c46103a08601613118565b6103a083015181526103c08301516020808301919091527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a083015260c43560c083015260008051602061376983398151915260e43581030660e08301527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6101008301527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6101208301527f1970ea81dd6992adfbc571effb03503adbbb6a857f578403c6c40e22d65b3c026101408301527f054793348f12c0cf5622c340573cb277586319de359ab9389778f689786b1e48610160830152816101808160086107d05a03fa90511692915050565b60405161078081016040526136c4610945565b6136ce8382610a2f565b6136d78161170f565b6136e0816119b4565b6136ea83826119db565b6136f381611a17565b6136fc81612643565b61370581612a47565b61370e816131f2565b613717816134c2565b90508060005260206000f35b60008061032080848603121561373857600080fd5b61030084018581111561374a57600080fd5b84935085828601111561375c57600080fd5b8092505050925092905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4730644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f2330644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f7036360c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000130644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000001f7e1d70965392e542392cab2e10e88c03912b89107ae96c3a6b13f31f3a4cd016d70f6937b88ea2890451712281f2073db9ac923d49d38d833cbbcbc2b281c8a2646970667358221220a785078cc5f6bc3fb1266f5d292fb6f9064dc37f0d490c579022dad84b830b3164736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80639121da8a14610030575b600080fd5b61004361003e366004613723565b610057565b604051901515815260200160405180910390f35b60006136b1565b6040516104c08201518082526020820191506000805160206137e98339815191526104e0840151820990508082526020820191506000805160206137e9833981519152610500840151820990508082526020820191506000805160206137e9833981519152610520840151820990508082526020820191506000805160206137e9833981519152602061052001840151820990508082526020820191506000805160206137e9833981519152604061052001840151820990508082526020820191506000805160206137e9833981519152606061052001840151820990508082526020820191506000805160206137e9833981519152608061052001840151820990508082526020820191506000805160206137e983398151915260a061052001840151820990508082526020820191506000805160206137e983398151915260c061052001840151820990508082526020820191506000805160206137e983398151915260e061052001840151820990508082526020820191506000805160206137e9833981519152610620840151820990508082526020820191506000805160206137e9833981519152602061062001840151820990508082526020820191506000805160206137e9833981519152604061062001840151820990508082526020820191506000805160206137e9833981519152606061062001840151820990508082526020820191506000805160206137e98339815191526106a0840151820990508082526020820191506000805160206137e983398151915260206106a001840151820990508082526020820191506000805160206137e983398151915260406106a001840151820990508082526020820191506000805160206137e983398151915260606106a001840151820990508082526020820191506000805160206137e983398151915260806106a001840151820990508082526020820191506000805160206137e983398151915260a06106a001840151820990508082526020820191506000805160206137e9833981519152610760840151820990508082526102e4356000805160206137e9833981519152818309600114610388576000805260206000f35b8091506020830392506000805160206137e98339815191528351830990506000805160206137e983398151915261076085015183099150806107608501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260a06106a001850151830991508060a06106a0018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260806106a001850151830991508060806106a0018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260606106a001850151830991508060606106a0018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260406106a001850151830991508060406106a0018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260206106a001850151830991508060206106a0018501526020830392506000805160206137e98339815191528351830990506000805160206137e98339815191526106a085015183099150806106a08501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260606106200185015183099150806060610620018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260406106200185015183099150806040610620018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260206106200185015183099150806020610620018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915261062085015183099150806106208501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260e061052001850151830991508060e0610520018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260c061052001850151830991508060c0610520018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260a061052001850151830991508060a0610520018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260806105200185015183099150806080610520018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260606105200185015183099150806060610520018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260406105200185015183099150806040610520018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915260206105200185015183099150806020610520018501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915261052085015183099150806105208501526020830392506000805160206137e98339815191528351830990506000805160206137e983398151915261050085015183099150806105008501526020830392506000805160206137e98339815191528351830990506000805160206137e98339815191526104e085015183099150806104e085015250806104c0840152505050565b6000805160206137e983398151915281106108e8576000805260206000f35b50565b8035602082013560008051602061376983398151915260036000805160206137698339815191528085860985090891506000805160206137698339815191528182099050808214610940576000805260206000f35b505050565b61094f60046108eb565b61095960446108eb565b61096360846108eb565b61096d60c46108eb565b610979610104356108c9565b610985610124356108c9565b610991610144356108c9565b61099d610164356108c9565b6109a9610184356108c9565b6109b56101a4356108c9565b6109c16101c4356108c9565b6109cd6101e4356108c9565b6109d9610204356108c9565b6109e5610224356108c9565b6109f1610244356108c9565b6109fd610264356108c9565b610a09610284356108c9565b610a156102a4356108c9565b610a216102c4356108c9565b610a2d6102e4356108c9565b565b60008051602061384983398151915261078082019081526000805160206138298339815191526107a0830190815283356107c084019081526004356107e085015260243561080085015260a083206000805160206137e9833981519152908190066020808701918252902081900660408601819052845260443590925260643590526060909120819006608083018190529081800960a0830181905260808301516000805160206137e9833981519152910960e08301526000805160206137e98339815191527f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8060e0840151096101008301526000805160206137e98339815191526000805160206137a983398151915260e0840151096101208301526000805160206137e98339815191527f1d59376149b959ccbd157ac850893a6f07c2d99b3852513ab8d01be8e846a56660e0840151096101408301526000805160206137e983398151915260008051602061380983398151915260e0840151096101608301526000805160206137e98339815191527f0530d09118705106cbb4a786ead16926d5d174e181a26686af5448492e42a18160e0840151096101808301526000805160206137e983398151915277b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb60e0840151096101a08301526000805160206137e98339815191527f130b17119778465cfb3acaee30f81dee20710ead41671f568b11d9ab07b95a9b60e0840151096101c083015260e08201516000805160206137e98339815191529080096101e08301526000805160206137e98339815191526000805160206137a98339815191526101e0840151096102008301526000805160206137e98339815191526000805160206138098339815191526101e0840151096102208301526000805160206137e983398151915277b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb6101e0840151096102408301526000805160206137e983398151915260a08301516101e0840151096102608301526000805160206137e9833981519152600080516020613789833981519152610260840151096102808301526000805160206137e983398151915277b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd610260840151096102a08301526000805160206137e98339815191527f283ce45a2e5b8e4e78f9fbaf5f6a348bfcfaf76dd28e5ca7121b74ef68fdec2e610260840151096102c08301526000805160206137e98339815191526000805160206137898339815191526102c0840151096102e08301526000805160206137e983398151915277b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd6102c0840151096103008301526102608201516000805160206137e98339815191529081818009098060c08401526000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e983398151915281820990506000805160206137e98339815191528182096000805160206137e9833981519152600080516020613809833981519152909101066104a084018190526104c0840152506107808201526101e06101046107a083013761020061078082019081206000805160206137e98339815191529081900680845282526084356107a084015260a4356107c08401526060918290200691015250565b60e0810151606082015160016000805160206137e983398151915283820990506000805160206137e983398151915283820990506000805160206137e983398151915283820990506000805160206137e983398151915283820990506000805160206137e983398151915283820990506000805160206137e983398151915283820990506000805160206137e98339815191528160080960e0850151935090506000805160206137e983398151915283810381900683086000805160206137e98339815191528082860983096105208601526101c08501516101008601519094506000805160206137e9833981519152908103819006840890506000805160206137e98339815191528082860983096105408601526101a08501516101208601519094506000805160206137e9833981519152908103819006840890506000805160206137e98339815191528082860983096105608601526101808501516101408601519094506000805160206137e9833981519152908103819006840890506000805160206137e983398151915280828609830961058086015261016085015193506000805160206137e9833981519152848103819006840890506000805160206137e98339815191528082860983096105a08601526101408501516101808601519094506000805160206137e9833981519152908103819006840890506000805160206137e98339815191528082860983096105c08601526101208501516101a08601519094506000805160206137e9833981519152908103819006840890506000805160206137e98339815191528082860983096105e08601526101008501516101c08601519094506000805160206137e9833981519152908103819006840890506000805160206137e983398151915280828609830960e0610520018601525050505050565b6101e0810151606082015160016000805160206137e983398151915283820990506000805160206137e983398151915283820990506000805160206137e9833981519152816004096101e0850151935090506000805160206137e983398151915283810381900683086000805160206137e98339815191528082860983096106208601526102408501516102008601519094506000805160206137e9833981519152908103819006840890506000805160206137e983398151915280828609830961064086015261022085015193506000805160206137e9833981519152848103819006840890506000805160206137e98339815191528082860983096106608601526102008501516102408601519094506000805160206137e9833981519152908103819006840890506000805160206137e98339815191528082860983096060610620018601525050505050565b60608101516000805160206137e9833981519152806000805160206137e9833981519152806000805160206137c983398151915260c0870151096000805160206137e9833981519152030660c0850151086000805160206137e9833981519152610260850151600309096102608301516000805160206137e983398151915281810381900684086000805160206137e98339815191528082840984096106a08601526102a08501516102808601519092506000805160206137e9833981519152908103819006850890506000805160206137e98339815191528082840984096106c08601526102808501516102a08601519092506000805160206137e9833981519152908103819006850890506000805160206137e983398151915280828409840960406106a0018601526000805160206137e9833981519152806000805160206137e983398151915260c08801516000805160206137e983398151915203066000805160206137e98339815191526000805160206137c983398151915260c08a015109086000805160206137e98339815191526102c0880151600309096102c086015190935091506000805160206137e9833981519152828103819006850890506000805160206137e98339815191528082840984096107008601526103008501516102e08601519092506000805160206137e9833981519152908103819006850890506000805160206137e98339815191528082840984096107208601526102e08501516103008601519092506000805160206137e9833981519152908103819006850890506000805160206137e983398151915280828409840960a06106a0018601525050505050565b60608101516000805160206137e9833981519152806101e08401516000805160206137e9833981519152030682086000805160206137e9833981519152806000805160206137e98339815191526102008601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526102208601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526102408601516000805160206137e98339815191520306840882099050806104e08401526000805160206137e9833981519152806102608501516000805160206137e98339815191520306830890506000805160206137e9833981519152806000805160206137e98339815191526102808601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526102a08601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526102c08601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526102e08601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526103008601516000805160206137e983398151915203068408820990508061050084015261195f836110a8565b61196883611352565b611971836114a2565b505060c081015160016000805160206137e9833981519152600080516020613809833981519152830181900663010000000961076084015250506108e88161005e565b6104a08101516000805160206137e983398151915281610760840151096107608301525050565b60006000805160206137e9833981519152806000805160206137e983398151915285356107608601510983030106905080610320830152505050565b600160608201516000805160206137e983398151915281830991506000805160206137e983398151915281830991506000805160206137e983398151915281830991506000805160206137e983398151915281830991506000805160206137e983398151915281830991506000805160206137e983398151915281830991506000805160206137e983398151915281830991506000805160206137e98339815191528183099150506000805160206137e98339815191528060c08401516000805160206137e98339815191520306820860e083015190915060009081806000805160206137e983398151915280846101243509610104350891506000805160206137e983398151915283840990506000805160206137e983398151915280826101643509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101443509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101843509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101a43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101c43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101e43509830891506000805160206137e9833981519152806000805160206137e9833981519152600061052001890151880984098508935061010086015192506000805160206137e983398151915280846101243509610104350891506000805160206137e983398151915283840990506000805160206137e983398151915280826101643509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101443509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101843509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101a43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101c43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101e43509830891506000805160206137e9833981519152806000805160206137e9833981519152602061052001890151880984098508935061012086015192506000805160206137e983398151915280846101243509610104350891506000805160206137e983398151915283840990506000805160206137e983398151915280826101643509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101443509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101843509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101a43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101c43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101e43509830891506000805160206137e9833981519152806000805160206137e9833981519152604061052001890151880984098508935061014086015192506000805160206137e983398151915280846101243509610104350891506000805160206137e983398151915283840990506000805160206137e983398151915280826101643509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101443509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101843509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101a43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101c43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101e43509830891506000805160206137e9833981519152806000805160206137e9833981519152606061052001890151880984098508935061016086015192506000805160206137e983398151915280846101243509610104350891506000805160206137e983398151915283840990506000805160206137e983398151915280826101643509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101443509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101843509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101a43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101c43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101e43509830891506000805160206137e9833981519152806000805160206137e9833981519152608061052001890151880984098508935061018086015192506000805160206137e983398151915280846101243509610104350891506000805160206137e983398151915283840990506000805160206137e983398151915280826101643509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101443509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101843509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101a43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101c43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101e43509830891506000805160206137e9833981519152806000805160206137e983398151915260a06105200189015188098409850893506101a086015192506000805160206137e983398151915280846101243509610104350891506000805160206137e983398151915283840990506000805160206137e983398151915280826101643509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101443509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101843509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101a43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101c43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101e43509830891506000805160206137e9833981519152806000805160206137e983398151915260c06105200189015188098409850893506101c086015192506000805160206137e983398151915280846101243509610104350891506000805160206137e983398151915283840990506000805160206137e983398151915280826101643509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101443509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101843509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101a43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101c43509830891506000805160206137e983398151915283820990506000805160206137e983398151915280826101e4350983089150506000805160206137e9833981519152806000805160206137e983398151915260e0610520018801518709830984089250505080610340840152505050565b600160608201516000805160206137e983398151915281830991506000805160206137e983398151915281830991506000805160206137e983398151915281830991506000805160206137e98339815191528183099150506000805160206137e98339815191528060c08401516000805160206137e983398151915203068208905060006102043561022435610244356000805160206137e983398151915283610104350993506000805160206137e983398151915280836101243509850893506000805160206137e9833981519152806000805160206137e98339815191528486096101443509850893506000805160206137e983398151915280826101643509850893506000805160206137e983398151915261018435850893506000805160206137e9833981519152610320870151850893506000805160206137e98339815191526104c087015185096101e08701519094506000908490826000805160206137e983398151915280878409840892506000805160206137e983398151915282830990506000805160206137e983398151915280868309840892506000805160206137e983398151915280896000805160206137e983398151915285850909840892506000805160206137e9833981519152806000805160206137e98339815191526020600002610620018d01518c098509850893508692506102008a015191506000805160206137e983398151915280878409840892506000805160206137e983398151915282830990506000805160206137e983398151915280868309840892506000805160206137e983398151915280896000805160206137e983398151915285850909840892506000805160206137e9833981519152806000805160206137e98339815191526020600102610620018d01518c098509850893508692506102208a015191506000805160206137e983398151915280878409840892506000805160206137e983398151915282830990506000805160206137e983398151915280868309840892506000805160206137e983398151915280896000805160206137e983398151915285850909840892506000805160206137e9833981519152806000805160206137e98339815191526020600202610620018d01518c098509850893508692506102408a015191506000805160206137e983398151915280878409840892506000805160206137e983398151915282830990506000805160206137e983398151915280868309840892506000805160206137e983398151915280896000805160206137e9833981519152858509098408925050506000805160206137e9833981519152806000805160206137e98339815191526020600302610620018b01518a09830983089150508061036088015250505050505050565b606081015160016000805160206137e983398151915281830990506000805160206137e983398151915281830990506000805160206137e983398151915281830990506000805160206137e983398151915281830990506000805160206137e983398151915281830990506000805160206137e9833981519152818309905060016000805160206137e983398151915281840990506000805160206137e983398151915281840990506000805160206137e983398151915281840990506000805160206137e98339815191528060c08601516000805160206137e98339815191526000805160206137c983398151915260c08901510908820990506000805160206137e983398151915280826000805160206137e98339815191520306830860c08501519092506000805160206137e983398151915290816000805160206137c983398151915282090990506000805160206137e98339815191528183089150506000915060006000805160206137e983398151915260c085015160208601510960408501516000805160206137e983398151915280828408610204350892506000805160206137e9833981519152806000805160206137e9833981519152836000805160206137e983398151915260028709086102243508840992506000805160206137e9833981519152806000805160206137e9833981519152836000805160206137e983398151915260038709086102443508840992506000805160206137e983398151915261026435840992506000805160206137e983398151915280826000805160206137e98339815191526101a43560208b01510908610204350894506000805160206137e9833981519152806000805160206137e9833981519152836000805160206137e98339815191526101c43560208c015109086102243508860994506000805160206137e9833981519152806000805160206137e9833981519152836000805160206137e98339815191526101e43560208c015109086102443508860994506000805160206137e983398151915261028435860994506000805160206137e983398151915280866000805160206137e98339815191520306840892506000805160206137e98339815191526104c0870151840992506001610264350394506000805160206137e9833981519152610760870151860994506000805160206137e98339815191526104c08701518609610260870151909550915060009050806000805160206137e983398151915280878509610264350890506000805160206137e983398151915280856000805160206137e983398151915286870909820890506000805160206137e9833981519152806000805160206137e983398151915260206000026106a0018a0151880983098308915061028087015192506000805160206137e983398151915280878509610264350890506000805160206137e983398151915280856000805160206137e983398151915286870909820890506000805160206137e9833981519152806000805160206137e983398151915260206001026106a0018a015188098309830891506102a087015192506000805160206137e983398151915280878509610264350890506000805160206137e983398151915280856000805160206137e983398151915286870909820890506000805160206137e9833981519152806000805160206137e983398151915260206002026106a0018a015188098309830891506102c087015192506000805160206137e9833981519152806102a4358509610284350890506000805160206137e9833981519152806102c4356000805160206137e983398151915286870909820890506000805160206137e9833981519152806000805160206137e983398151915260206003026106a0018a015188098309830891506102e087015192506000805160206137e9833981519152806102a4358509610284350890506000805160206137e9833981519152806102c4356000805160206137e983398151915286870909820890506000805160206137e9833981519152806000805160206137e983398151915260206004026106a0018a0151880983098308915061030087015192506000805160206137e9833981519152806102a4358509610284350890506000805160206137e9833981519152806102c4356000805160206137e983398151915286870909820890506000805160206137e9833981519152806000805160206137e983398151915260206005026106a0018a015188098309830891505080610380870152505050505050565b6040518151815260208201516020820152825160408201526020830151606082015260408260808360066107d05a03fa905080610940576000805260206000f35b6000604051833581526020840135602082015284604082015260408160608360076107d05a03fa915081613150576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa91505080613181576000805260206000f35b50505050565b600060405183815284602082015285604082015260408160608360076107d05a03fa9150816131ba576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa915050806131eb576000805260206000f35b5050505050565b60608101516000805160206137e98339815191528060e08401516000805160206137e9833981519152030682086000805160206137e9833981519152806000805160206137e98339815191526101008601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526101208601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526101408601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526101608601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526101808601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526101a08601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806000805160206137e98339815191526101c08601516000805160206137e983398151915203068408820990506000805160206137e9833981519152806104e0850151830984510991506000805160206137e983398151915280610500850151830984516000805160206137e9833981519152908009096000805160206138498339815191526103a085015260008051602061382983398151915260206103a00185015261344a8360046103a08701613118565b61345a8160446103a08701613118565b6134b16000805160206137e9833981519152806000805160206137e983398151915261038088015185096000805160206137e983398151915261036089015188090861034087015108600260016103e08801613187565b506109408160846104208601613118565b604051610400820180516000805160206137698339815191529081038190069091526104408301805182039190910690526000906135086103e084016103a085016130d7565b61351a61042084016103a085016130d7565b61352e606084015160c46103a08601613118565b6103a083015181526103c08301516020808301919091527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a083015260c43560c083015260008051602061376983398151915260e43581030660e08301527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6101008301527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6101208301527f1970ea81dd6992adfbc571effb03503adbbb6a857f578403c6c40e22d65b3c026101408301527f054793348f12c0cf5622c340573cb277586319de359ab9389778f689786b1e48610160830152816101808160086107d05a03fa90511692915050565b60405161078081016040526136c4610945565b6136ce8382610a2f565b6136d78161170f565b6136e0816119b4565b6136ea83826119db565b6136f381611a17565b6136fc81612643565b61370581612a47565b61370e816131f2565b613717816134c2565b90508060005260206000f35b60008061032080848603121561373857600080fd5b61030084018581111561374a57600080fd5b84935085828601111561375c57600080fd5b8092505050925092905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4730644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f2330644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f7036360c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000130644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000001f7e1d70965392e542392cab2e10e88c03912b89107ae96c3a6b13f31f3a4cd016d70f6937b88ea2890451712281f2073db9ac923d49d38d833cbbcbc2b281c8a2646970667358221220a785078cc5f6bc3fb1266f5d292fb6f9064dc37f0d490c579022dad84b830b3164736f6c63430008140033", + "bytecode": "0x608060405234801561001057600080fd5b506159ee80620000216000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80639121da8a14610030575b600080fd5b61004361003e366004615973565b610057565b604051901515815260200160405180910390f35b6000615901565b6040516104c08201518082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610500840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610520840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610620840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760840151820990508082526102e4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309600114610514576000805260206000f35b8091506020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161076085015183099150806107608501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001850151830991508060a06106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001850151830991508060806106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001850151830991508060606106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001850151830991508060406106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001850151830991508060206106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a085015183099150806106a08501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106200185015183099150806060610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106200185015183099150806040610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106200185015183099150806020610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161062085015183099150806106208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001850151830991508060e0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001850151830991508060c0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001850151830991508060a0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806105200185015183099150806080610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606105200185015183099150806060610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406105200185015183099150806040610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206105200185015183099150806020610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161052085015183099150806105208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161050085015183099150806105008501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e085015183099150806104e085015250806104c0840152505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110610d7a576000805260206000f35b50565b803560208201357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760037f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478085860985090891507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478182099050808214610e08576000805260206000f35b505050565b610e176004610d7d565b610e216044610d7d565b610e2b6084610d7d565b610e3560c4610d7d565b610e4161010435610d49565b610e4d61012435610d49565b610e5961014435610d49565b610e6561016435610d49565b610e7161018435610d49565b610e7d6101a435610d49565b610e896101c435610d49565b610e956101e435610d49565b610ea161020435610d49565b610ead61022435610d49565b610eb961024435610d49565b610ec561026435610d49565b610ed161028435610d49565b610edd6102a435610d49565b610ee96102c435610d49565b610ef56102e435610d49565b565b7f10711a639fed66ba6cd6001188b8fe7285cb9bd01afc1f90598223550aa57e3661078082019081527f28c937a4cb758326763015d30fff3568f5cbed932cdc7c411a435d3de04549ef6107a0830190815283356107c084019081526004356107e085015260243561080085015260a083207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908190066020808701918252902081900660408601819052845260443590925260643590526060909120819006608083018190529081800960a0830181905260808301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001910960e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8060e0840151096101008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f70363660e0840151096101208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f1d59376149b959ccbd157ac850893a6f07c2d99b3852513ab8d01be8e846a56660e0840151096101408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000060e0840151096101608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0530d09118705106cbb4a786ead16926d5d174e181a26686af5448492e42a18160e0840151096101808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb60e0840151096101a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f130b17119778465cfb3acaee30f81dee20710ead41671f568b11d9ab07b95a9b60e0840151096101c083015260e08201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019080096101e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f7036366101e0840151096102008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006101e0840151096102208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb6101e0840151096102408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a08301516101e0840151096102608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f23610260840151096102808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd610260840151096102a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f283ce45a2e5b8e4e78f9fbaf5f6a348bfcfaf76dd28e5ca7121b74ef68fdec2e610260840151096102c08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f236102c0840151096102e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd6102c0840151096103008301526102608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081818009098060c08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018182097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000909101066104a084018190526104c0840152506107808201526101e06101046107a083013761020061078082019081207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081900680845282526084356107a084015260a4356107c08401526060918290200691015250565b60e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018160080960e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105208601526101c08501516101008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105408601526101a08501516101208601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105608601526101808501516101408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961058086015261016085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105a08601526101408501516101808601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105c08601526101208501516101a08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105e08601526101008501516101c08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830960e0610520018601525050505050565b6101e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001816004096101e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106208601526102408501516102008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961064086015261022085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106608601526102008501516102408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096060610620018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c0870151097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030660c0850151087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610260850151600309096102608301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181810381900684087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106a08601526102a08501516102808601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106c08601526102808501516102a08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960406106a0018601527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c08801517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103067f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08a015109087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c0880151600309096102c086015190935091507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001828103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107008601526103008501516102e08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107208601526102e08501516103008601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960a06106a0018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806101e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806104e08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102608501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102e08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016103008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806105008401526127ff8361194e565b61280883611d96565b61281183611fac565b505060c081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000083018190066301000000096107608401525050610d7a8161005e565b6104a08101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181610760840151096107608301525050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185356107608601510983030106905080610320830152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820860e083015190915060009081807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600061052001890151880984098508935061010086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001890151880984098508935061012086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001890151880984098508935061014086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001890151880984098508935061016086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001890151880984098508935061018086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06105200189015188098409850893506101a086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c06105200189015188098409850893506101c086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e4350983089150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e0610520018801518709830984089250505080610340840152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068208905060006102043561022435610244357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183610104350993507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180836101243509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018486096101443509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161018435850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610320870151850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c087015185096101e08701519094506000908490827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600002610620018d01518c098509850893508692506102008a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600102610620018d01518c098509850893508692506102208a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600202610620018d01518c098509850893508692506102408a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001858509098408925050507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600302610620018b01518a09830983089150508061036088015250505050505050565b606081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309905060017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08901510908820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830860c08501519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190817f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b82090990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183089150506000915060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c085015160208601510960408501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828408610204350892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028709086102243508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160038709086102443508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161026435840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a43560208b01510908610204350894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c43560208c015109086102243508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101e43560208c015109086102443508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161028435860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151840992506001610264350394507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760870151860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c08701518609610260870151909550915060009050807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206000026106a0018a0151880983098308915061028087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206001026106a0018a015188098309830891506102a087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206002026106a0018a015188098309830891506102c087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206003026106a0018a015188098309830891506102e087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206004026106a0018a0151880983098308915061030087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206005026106a0018a015188098309830891505080610380870152505050505050565b6040518151815260208201516020820152825160408201526020830151606082015260408260808360066107d05a03fa905080610e08576000805260206000f35b6000604051833581526020840135602082015284604082015260408160608360076107d05a03fa91508161514e576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa9150508061517f576000805260206000f35b50505050565b600060405183815284602082015285604082015260408160608360076107d05a03fa9150816151b8576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa915050806151e9576000805260206000f35b5050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101608601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806104e0850151830984510991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180610500850151830984517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908009097f10711a639fed66ba6cd6001188b8fe7285cb9bd01afc1f90598223550aa57e366103a08501527f28c937a4cb758326763015d30fff3568f5cbed932cdc7c411a435d3de04549ef60206103a0018501526156408360046103a08701615116565b6156508160446103a08701615116565b6156dd7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161038088015185097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161036089015188090861034087015108600260016103e08801615185565b50610e088160846104208601615116565b604051610400820180517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd479081038190069091526104408301805182039190910690526000906157466103e084016103a085016150d5565b61575861042084016103a085016150d5565b61576c606084015160c46103a08601615116565b6103a083015181526103c08301516020808301919091527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a083015260c43560c08301527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760e43581030660e08301527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6101008301527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6101208301527f1970ea81dd6992adfbc571effb03503adbbb6a857f578403c6c40e22d65b3c026101408301527f054793348f12c0cf5622c340573cb277586319de359ab9389778f689786b1e48610160830152816101808160086107d05a03fa90511692915050565b6040516107808101604052615914610e0d565b61591e8382610ef7565b615927816123b7565b61593081612878565b61593a83826128b1565b61594381612911565b61594c81613e61565b61595581614559565b61595e816151f0565b615967816156ee565b90508060005260206000f35b60008061032080848603121561598857600080fd5b61030084018581111561599a57600080fd5b8493508582860111156159ac57600080fd5b8092505050925092905056fea2646970667358221220a7ce4ff15918cfa18c62f216a918f83379870551bb7d6de9b7e59e19931b9ada64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80639121da8a14610030575b600080fd5b61004361003e366004615973565b610057565b604051901515815260200160405180910390f35b6000615901565b6040516104c08201518082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610500840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610520840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610620840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760840151820990508082526102e4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309600114610514576000805260206000f35b8091506020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161076085015183099150806107608501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001850151830991508060a06106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001850151830991508060806106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001850151830991508060606106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001850151830991508060406106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001850151830991508060206106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a085015183099150806106a08501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106200185015183099150806060610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106200185015183099150806040610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106200185015183099150806020610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161062085015183099150806106208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001850151830991508060e0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001850151830991508060c0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001850151830991508060a0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806105200185015183099150806080610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606105200185015183099150806060610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406105200185015183099150806040610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206105200185015183099150806020610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161052085015183099150806105208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161050085015183099150806105008501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e085015183099150806104e085015250806104c0840152505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110610d7a576000805260206000f35b50565b803560208201357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760037f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478085860985090891507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478182099050808214610e08576000805260206000f35b505050565b610e176004610d7d565b610e216044610d7d565b610e2b6084610d7d565b610e3560c4610d7d565b610e4161010435610d49565b610e4d61012435610d49565b610e5961014435610d49565b610e6561016435610d49565b610e7161018435610d49565b610e7d6101a435610d49565b610e896101c435610d49565b610e956101e435610d49565b610ea161020435610d49565b610ead61022435610d49565b610eb961024435610d49565b610ec561026435610d49565b610ed161028435610d49565b610edd6102a435610d49565b610ee96102c435610d49565b610ef56102e435610d49565b565b7f10711a639fed66ba6cd6001188b8fe7285cb9bd01afc1f90598223550aa57e3661078082019081527f28c937a4cb758326763015d30fff3568f5cbed932cdc7c411a435d3de04549ef6107a0830190815283356107c084019081526004356107e085015260243561080085015260a083207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908190066020808701918252902081900660408601819052845260443590925260643590526060909120819006608083018190529081800960a0830181905260808301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001910960e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8060e0840151096101008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f70363660e0840151096101208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f1d59376149b959ccbd157ac850893a6f07c2d99b3852513ab8d01be8e846a56660e0840151096101408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000060e0840151096101608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0530d09118705106cbb4a786ead16926d5d174e181a26686af5448492e42a18160e0840151096101808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb60e0840151096101a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f130b17119778465cfb3acaee30f81dee20710ead41671f568b11d9ab07b95a9b60e0840151096101c083015260e08201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019080096101e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f7036366101e0840151096102008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006101e0840151096102208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb6101e0840151096102408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a08301516101e0840151096102608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f23610260840151096102808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd610260840151096102a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f283ce45a2e5b8e4e78f9fbaf5f6a348bfcfaf76dd28e5ca7121b74ef68fdec2e610260840151096102c08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f236102c0840151096102e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd6102c0840151096103008301526102608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081818009098060c08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018182097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000909101066104a084018190526104c0840152506107808201526101e06101046107a083013761020061078082019081207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081900680845282526084356107a084015260a4356107c08401526060918290200691015250565b60e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018160080960e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105208601526101c08501516101008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105408601526101a08501516101208601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105608601526101808501516101408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961058086015261016085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105a08601526101408501516101808601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105c08601526101208501516101a08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105e08601526101008501516101c08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830960e0610520018601525050505050565b6101e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001816004096101e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106208601526102408501516102008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961064086015261022085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106608601526102008501516102408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096060610620018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c0870151097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030660c0850151087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610260850151600309096102608301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181810381900684087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106a08601526102a08501516102808601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106c08601526102808501516102a08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960406106a0018601527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c08801517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103067f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08a015109087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c0880151600309096102c086015190935091507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001828103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107008601526103008501516102e08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107208601526102e08501516103008601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960a06106a0018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806101e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806104e08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102608501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102e08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016103008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806105008401526127ff8361194e565b61280883611d96565b61281183611fac565b505060c081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000083018190066301000000096107608401525050610d7a8161005e565b6104a08101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181610760840151096107608301525050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185356107608601510983030106905080610320830152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820860e083015190915060009081807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600061052001890151880984098508935061010086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001890151880984098508935061012086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001890151880984098508935061014086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001890151880984098508935061016086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001890151880984098508935061018086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06105200189015188098409850893506101a086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c06105200189015188098409850893506101c086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e4350983089150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e0610520018801518709830984089250505080610340840152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068208905060006102043561022435610244357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183610104350993507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180836101243509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018486096101443509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161018435850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610320870151850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c087015185096101e08701519094506000908490827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600002610620018d01518c098509850893508692506102008a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600102610620018d01518c098509850893508692506102208a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600202610620018d01518c098509850893508692506102408a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001858509098408925050507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600302610620018b01518a09830983089150508061036088015250505050505050565b606081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309905060017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08901510908820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830860c08501519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190817f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b82090990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183089150506000915060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c085015160208601510960408501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828408610204350892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028709086102243508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160038709086102443508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161026435840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a43560208b01510908610204350894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c43560208c015109086102243508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101e43560208c015109086102443508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161028435860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151840992506001610264350394507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760870151860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c08701518609610260870151909550915060009050807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206000026106a0018a0151880983098308915061028087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206001026106a0018a015188098309830891506102a087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206002026106a0018a015188098309830891506102c087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206003026106a0018a015188098309830891506102e087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206004026106a0018a0151880983098308915061030087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206005026106a0018a015188098309830891505080610380870152505050505050565b6040518151815260208201516020820152825160408201526020830151606082015260408260808360066107d05a03fa905080610e08576000805260206000f35b6000604051833581526020840135602082015284604082015260408160608360076107d05a03fa91508161514e576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa9150508061517f576000805260206000f35b50505050565b600060405183815284602082015285604082015260408160608360076107d05a03fa9150816151b8576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa915050806151e9576000805260206000f35b5050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101608601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806104e0850151830984510991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180610500850151830984517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908009097f10711a639fed66ba6cd6001188b8fe7285cb9bd01afc1f90598223550aa57e366103a08501527f28c937a4cb758326763015d30fff3568f5cbed932cdc7c411a435d3de04549ef60206103a0018501526156408360046103a08701615116565b6156508160446103a08701615116565b6156dd7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161038088015185097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161036089015188090861034087015108600260016103e08801615185565b50610e088160846104208601615116565b604051610400820180517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd479081038190069091526104408301805182039190910690526000906157466103e084016103a085016150d5565b61575861042084016103a085016150d5565b61576c606084015160c46103a08601615116565b6103a083015181526103c08301516020808301919091527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a083015260c43560c08301527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760e43581030660e08301527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6101008301527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6101208301527f1970ea81dd6992adfbc571effb03503adbbb6a857f578403c6c40e22d65b3c026101408301527f054793348f12c0cf5622c340573cb277586319de359ab9389778f689786b1e48610160830152816101808160086107d05a03fa90511692915050565b6040516107808101604052615914610e0d565b61591e8382610ef7565b615927816123b7565b61593081612878565b61593a83826128b1565b61594381612911565b61594c81613e61565b61595581614559565b61595e816151f0565b615967816156ee565b90508060005260206000f35b60008061032080848603121561598857600080fd5b61030084018581111561599a57600080fd5b8493508582860111156159ac57600080fd5b8092505050925092905056fea2646970667358221220a7ce4ff15918cfa18c62f216a918f83379870551bb7d6de9b7e59e19931b9ada64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonDataComittee.json b/compiled-contracts/paris/PolygonDataComittee.json index 4c3b04f89..91f6a49ba 100644 --- a/compiled-contracts/paris/PolygonDataComittee.json +++ b/compiled-contracts/paris/PolygonDataComittee.json @@ -16,7 +16,7 @@ "type": "address" }, { - "internalType": "contract IPolygonZkEVMBridge", + "internalType": "contract IPolygonZkEVMBridgeV2", "name": "_bridgeAddress", "type": "address" }, @@ -104,6 +104,11 @@ "name": "HaltTimeoutNotExpired", "type": "error" }, + { + "inputs": [], + "name": "HugeTokenMetadataNotSupported", + "type": "error" + }, { "inputs": [], "name": "InitNumBatchAboveLastVerifiedBatch", @@ -314,6 +319,31 @@ "name": "ForceBatch", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "lastGlobalExitRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "sequencer", + "type": "address" + } + ], + "name": "InitialSequenceBatches", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -438,7 +468,33 @@ }, { "inputs": [], - "name": "BASE_INITIALIZE_TX_BRIDGE", + "name": "GLOBAL_EXIT_ROOT_MANAGER_L2", + "outputs": [ + { + "internalType": "contract IBasePolygonZkEVMGlobalExitRoot", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_LIST_LEN_LEN", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS", "outputs": [ { "internalType": "bytes", @@ -451,12 +507,25 @@ }, { "inputs": [], - "name": "GLOBAL_EXIT_ROOT_MANAGER_L2", + "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS", "outputs": [ { - "internalType": "contract IBasePolygonZkEVMGlobalExitRoot", + "internalType": "bytes", "name": "", - "type": "address" + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_CONSTANT_BYTES", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" } ], "stateMutability": "view", @@ -546,7 +615,7 @@ "name": "bridgeAddress", "outputs": [ { - "internalType": "contract IPolygonZkEVMBridge", + "internalType": "contract IPolygonZkEVMBridgeV2", "name": "", "type": "address" } @@ -672,6 +741,11 @@ "internalType": "uint32", "name": "_gasTokenNetwork", "type": "uint32" + }, + { + "internalType": "bytes", + "name": "_gasTokenMetadata", + "type": "bytes" } ], "name": "generateInitializeTransaction", @@ -682,7 +756,7 @@ "type": "bytes" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { @@ -720,11 +794,6 @@ "name": "_gasTokenAddress", "type": "address" }, - { - "internalType": "uint32", - "name": "_gasTokenNetwork", - "type": "uint32" - }, { "internalType": "string", "name": "sequencerURL", @@ -1095,8 +1164,8 @@ "type": "function" } ], - "bytecode": "0x6101206040523480156200001257600080fd5b506040516200358538038062003585833981016040819052620000359162000078565b6001600160a01b0394851660a05292841660805290831660c052821660e0521661010052620000f8565b6001600160a01b03811681146200007557600080fd5b50565b600080600080600060a086880312156200009157600080fd5b85516200009e816200005f565b6020870151909550620000b1816200005f565b6040870151909450620000c4816200005f565b6060870151909350620000d7816200005f565b6080870151909250620000ea816200005f565b809150509295509295909350565b60805160a05160c05160e05161010051613399620001ec60003960008181610388015261148c01526000818161033201528181610725015281816107c001528181610a3a01528181610b970152818161153e015281816115d6015281816115f80152818161174001528181611acb01528181611b4801528181611c28015281816122e50152818161234201528181612364015261244c01526000818161043c015281816116b601526123c20152600081816104dd015281816112eb01528181611d2701526120f501526000818161052a015281816105b1015281816115830152818161168c0152611cfb01526133996000f3fe608060405234801561001057600080fd5b50600436106101e25760003560e01c8062d0295d146101e7578063107bf28c1461020257806319d8ac611461021757806326782247146102425780632b35b3ac1461026257806332c2d1531461027f5780633c351e10146102945780633cbc795b146102ac57806340b5de6c146102d8578063456052671461030057806347ebf1081461031a57806349b7b8021461032d5780634c21fef3146103545780634e48770614610368578063542028d51461037b57806356e29435146103835780635e9145c9146103aa5780635ec91958146103bd5780636b8616ce146103c55780636e05d2cd146103e55780636ff512cc146103ee5780638c3d73011461040157806399af0397146104095780639e0018771461041c578063a3c573eb14610437578063aa3587d31461045e578063ada8f91914610466578063b0afe15414610479578063b81fcafd14610485578063c754c7ed14610498578063c89e42df146104b2578063cfa8ed47146104c5578063d02103ca146104d8578063d690be31146104ff578063d7bc90ff14610507578063d8d1091b14610512578063e46761c414610525578063e7a7ed021461054c578063eaeb077b14610566578063f35dda4714610579578063f851a44014610593575b600080fd5b6101ef6105ac565b6040519081526020015b60405180910390f35b61020a610695565b6040516101f99190612849565b60075461022a906001600160401b031681565b6040516001600160401b0390911681526020016101f9565b600154610255906001600160a01b031681565b6040516101f99190612863565b60085461026f9060ff1681565b60405190151581526020016101f9565b61029261028d3660046128ab565b610723565b005b6008546102559061010090046001600160a01b031681565b6008546102c390600160a81b900463ffffffff1681565b60405163ffffffff90911681526020016101f9565b6102e76001600160f81b031981565b6040516001600160f81b031990911681526020016101f9565b60075461022a90600160801b90046001600160401b031681565b6102926103283660046129c7565b6107be565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b60085461026f90600160c81b900460ff1681565b610292610376366004612a7d565b610b37565b61020a610cae565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b6102926103b8366004612ae5565b610cbb565b610292610cf5565b6101ef6103d3366004612a7d565b60066020526000908152604090205481565b6101ef60055481565b6102926103fc366004612b2f565b610d82565b610292610dfe565b61020a610417366004612b4a565b610e8b565b61025573a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b610292611018565b610292610474366004612b2f565b611093565b6101ef6405ca1ab1e081565b610292610493366004612bc5565b61110f565b60075461022a90600160c01b90046001600160401b031681565b6102926104c0366004612c76565b6117ee565b600254610255906001600160a01b031681565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b61020a61185b565b6101ef635ca1ab1e81565b610292610520366004612caa565b611877565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b60075461022a90600160401b90046001600160401b031681565b610292610574366004612ceb565b611c01565b610581601b81565b60405160ff90911681526020016101f9565b600054610255906201000090046001600160a01b031681565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016105fb9190612863565b602060405180830381865afa158015610618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063c9190612d36565b600754909150600090610668906001600160401b03600160801b8204811691600160401b900416612d65565b6001600160401b03169050806000036106845760009250505090565b61068e8183612d8c565b9250505090565b600480546106a290612dae565b80601f01602080910402602001604051908101604052809291908181526020018280546106ce90612dae565b801561071b5780601f106106f05761010080835404028352916020019161071b565b820191906000526020600020905b8154815290600101906020018083116106fe57829003601f168201915b505050505081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461076c57604051631736745960e31b815260040160405180910390fd5b806001600160a01b0316836001600160401b03167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966846040516107b191815260200190565b60405180910390a3505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461080757604051631736745960e31b815260040160405180910390fd5b600054610100900460ff16158080156108275750600054600160ff909116105b80610848575061083630611efd565b158015610848575060005460ff166001145b6108b05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156108d3576000805461ff0019166101001790555b6000805462010000600160b01b031916620100006001600160a01b038b81169190910291909117909155600280546001600160a01b03191691891691909117905560036109208482612e36565b50600461092d8382612e36565b50600780546001600160c01b0316610d2f60c71b1790556001600160a01b0385166109775763ffffffff84161561097757604051630d43a60960e11b815260040160405180910390fd5b60088054610100600160c81b0319166101006001600160a01b0388160263ffffffff60a81b191617600160a81b63ffffffff87160217905560006109bc878787610e8b565b9050600081805190602001209050600042905060008060001b836000801b848e6040516020016109f0959493929190612ef5565b60408051808303601f19018152908290528051602090910120600780546001600160401b0319166001600160401b0386161790556005819055639a908e7360e01b825291506000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639a908e7390610a7a906001908690600401612f34565b6020604051808303816000875af1158015610a99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abd9190612f4d565b6040519091506001600160401b0382169060008051602061330383398151915290600090a250505050508015610b2d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6000546201000090046001600160a01b03163314610b6857604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610b955760405163f5e37f2f60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bf3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c179190612f6a565b610c51576007546001600160401b03600160c01b909104811690821610610c515760405163f5e37f2f60e01b815260040160405180910390fd5b600780546001600160c01b0316600160c01b6001600160401b038416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546106a290612dae565b600854600160c81b900460ff16610ce5576040516320864d6d60e21b815260040160405180910390fd5b610cf0838383611f0c565b505050565b6000546201000090046001600160a01b03163314610d2657604051634755657960e01b815260040160405180910390fd5b60085460ff1615610d4a5760405163f6ba91a160e01b815260040160405180910390fd5b6008805460ff191660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b6000546201000090046001600160a01b03163314610db357604051634755657960e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383161790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610ca3908390612863565b6001546001600160a01b03163314610e295760405163d1ec4b2360e01b815260040160405180910390fd5b60015460008054620100006001600160a01b0390931692830262010000600160b01b03199091161790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e91610e8191612863565b60405180910390a1565b606060006040518060600160405280602181526020016133436021913960405163ffffffff80881660248301526001600160a01b03871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa6084820152600060a482015260c40160408051601f19818403018152918152602080830180516001600160e01b03166369a3b57f60e11b1790529051610f2b93929101612f8c565b60408051601f198184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015610f9b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610fcf5760405163668b0cb360e11b815260040160405180910390fd5b604051600090610ffd9084906405ca1ab1e090635ca1ab1e90601b906001600160f81b031990602001612fbb565b60408051808303601f19018152919052979650505050505050565b6000546201000090046001600160a01b0316331461104957604051634755657960e01b815260040160405180910390fd5b6008805460ff60c81b198116600160c81b9182900460ff16159091021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f4190600090a1565b6000546201000090046001600160a01b031633146110c457604051634755657960e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610ca3908390612863565b6002546001600160a01b0316331461113a576040516311e7be1560e01b815260040160405180910390fd5b83600081900361115d5760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561118057604051635acfba9d60e11b815260040160405180910390fd5b6007546005546001600160401b0380831692600160801b900416908160005b858110156114235760008b8b838181106111bb576111bb612fff565b9050608002018036038101906111d19190613015565b80516060820151919250906001600160401b0316156112c157856111f48161306a565b9650506000818360200151846060015160405160200161121693929190613098565b60408051601f1981840301815291815281516020928301206001600160401b038a166000908152600690935291205490915081146112675760405163671ebaaf60e11b815260040160405180910390fd5b82606001516001600160401b031683604001516001600160401b031610156112a257604051633fbd5c3960e11b815260040160405180910390fd5b506001600160401b038616600090815260066020526040812055611380565b602082015115801590611362575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303816000875af115801561133c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113609190612d36565b155b15611380576040516373bd668d60e01b815260040160405180910390fd5b866001600160401b031682604001516001600160401b031610806113b057504282604001516001600160401b0316115b156113ce576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518e6040516020016113ef959493929190612ef5565b604051602081830303815290604052805190602001209450816040015196505050808061141b906130bb565b91505061119f565b506007546001600160401b03600160401b9091048116908416111561145b5760405163c630a00d60e01b815260040160405180910390fd5b600780546001600160401b0319166001600160401b038616179055600582905560405163063d411f60e51b815285907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063c7a823e0906114cd9086908c908c906004016130fd565b60006040518083038186803b1580156114e557600080fd5b505afa1580156114f9573d6000803e3d6000fd5b50505050816001600160401b0316846001600160401b0316146115d05760006115228386612d65565b90506115376001600160401b03821683613120565b91506115aa7f0000000000000000000000000000000000000000000000000000000000000000826001600160401b031661156f6105ac565b6115799190613139565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906124f8565b5060078054600160801b600160c01b031916600160801b6001600160401b038716021790555b6116b4337f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611654573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116789190612d36565b6116829190613139565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001692919061255b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561170f57600080fd5b505af1158015611723573d6000803e3d6000fd5b5050604051639a908e7360e01b8152600092506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150639a908e7390611778908a908890600401612f34565b6020604051808303816000875af1158015611797573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117bb9190612f4d565b6040519091506001600160401b0382169060008051602061330383398151915290600090a2505050505050505050505050565b6000546201000090046001600160a01b0316331461181f57604051634755657960e01b815260040160405180910390fd5b600361182b8282612e36565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610ca39190612849565b6040518060600160405280602181526020016133436021913981565b60085460ff1661189a576040516324eff8c360e01b815260040160405180910390fd5b8060008190036118bd5760405163cb591a5f60e01b815260040160405180910390fd5b6103e88111156118e057604051635acfba9d60e11b815260040160405180910390fd5b6007546001600160401b03600160401b8204811691611908918491600160801b900416613150565b11156119275760405163c630a00d60e01b815260040160405180910390fd5b600754600554600160801b9091046001600160401b03169060005b83811015611ac557600086868381811061195e5761195e612fff565b90506020028101906119709190613163565b61197990613183565b9050836119858161306a565b825180516020918201208185015160408087015190519499509194506000936119b19386939101613098565b60408051601f1981840301815291815281516020928301206001600160401b038916600090815260069093529120549091508114611a025760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b038616600090815260066020526040812055611a26600188613120565b8403611a7a5742600760189054906101000a90046001600160401b03168460400151611a529190613200565b6001600160401b03161115611a7a5760405163c44a082160e01b815260040160405180910390fd5b848284602001514233604051602001611a97959493929190612ef5565b6040516020818303038152906040528051906020012094505050508080611abd906130bb565b915050611942565b50611af37f00000000000000000000000000000000000000000000000000000000000000008461156f6105ac565b6005819055600780546001600160401b03848116600160801b026001600160401b03600160801b03600160c01b0319909216429190911617179055604051639a908e7360e01b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611b7f9087908690600401612f34565b6020604051808303816000875af1158015611b9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc29190612f4d565b6040519091506001600160401b038216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16611c24576040516324eff8c360e01b815260040160405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca89190612d36565b905081811115611ccb57604051632354600f60e01b815260040160405180910390fd5b611388831115611cee576040516328a69b1f60e21b815260040160405180910390fd5b611d236001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633308461255b565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da79190612d36565b60078054919250600160401b9091046001600160401b0316906008611dcb8361306a565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508484604051611e00929190613220565b604051908190038120611e199183904290602001613098565b60408051808303601f190181529181528151602092830120600754600160401b90046001600160401b031660009081526006909352912055323303611eab57600754604080518381523360208201526060918101829052600091810191909152600160401b9091046001600160401b0316906000805160206133238339815191529060800160405180910390a2611ef6565b600760089054906101000a90046001600160401b03166001600160401b031660008051602061332383398151915282338888604051611eed9493929190613230565b60405180910390a25b5050505050565b6001600160a01b03163b151590565b6002546001600160a01b03163314611f37576040516311e7be1560e01b815260040160405180910390fd5b816000819003611f5a5760405163cb591a5f60e01b815260040160405180910390fd5b6103e8811115611f7d57604051635acfba9d60e11b815260040160405180910390fd5b6007546005546001600160401b0380831692600160801b900416908160005b85811015612253576000898983818110611fb857611fb8612fff565b9050602002810190611fca9190613265565b611fd39061327b565b805180516020909101206060820151919250906001600160401b0316156120cb5785611ffe8161306a565b9650506000818360200151846060015160405160200161202093929190613098565b60408051601f1981840301815291815281516020928301206001600160401b038a166000908152600690935291205490915081146120715760405163671ebaaf60e11b815260040160405180910390fd5b82606001516001600160401b031683604001516001600160401b031610156120ac57604051633fbd5c3960e11b815260040160405180910390fd5b506001600160401b0386166000908152600660205260408120556121b0565b60208201511580159061216c575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303816000875af1158015612146573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061216a9190612d36565b155b1561218a576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c010156121b0576040516328a69b1f60e21b815260040160405180910390fd5b866001600160401b031682604001516001600160401b031610806121e057504282604001516001600160401b0316115b156121fe576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518c60405160200161221f959493929190612ef5565b604051602081830303815290604052805190602001209450816040015196505050808061224b906130bb565b915050611f9c565b506007546001600160401b03600160401b9091048116908416111561228b5760405163c630a00d60e01b815260040160405180910390fd5b600780546001600160401b0319166001600160401b0386811691909117909155600583905585908281169085161461233c5760006122c98386612d65565b90506122de6001600160401b03821683613120565b91506123167f0000000000000000000000000000000000000000000000000000000000000000826001600160401b031661156f6105ac565b5060078054600160801b600160c01b031916600160801b6001600160401b038716021790555b6123c0337f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611654573d6000803e3d6000fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561241b57600080fd5b505af115801561242f573d6000803e3d6000fd5b5050604051639a908e7360e01b8152600092506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150639a908e7390612484908a908890600401612f34565b6020604051808303816000875af11580156124a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124c79190612f4d565b6040519091506001600160401b0382169060008051602061330383398151915290600090a250505050505050505050565b6040516001600160a01b038316602482015260448101829052610cf090849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612599565b6040516001600160a01b03808516602483015283166044820152606481018290526125939085906323b872dd60e01b90608401612524565b50505050565b60006125ee826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661266b9092919063ffffffff16565b805190915015610cf0578080602001905181019061260c9190612f6a565b610cf05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016108a7565b606061267a8484600085612682565b949350505050565b6060824710156126e35760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016108a7565b600080866001600160a01b031685876040516126ff91906132f0565b60006040518083038185875af1925050503d806000811461273c576040519150601f19603f3d011682016040523d82523d6000602084013e612741565b606091505b50915091506127528783838761275d565b979650505050505050565b606083156127ca5782516000036127c35761277785611efd565b6127c35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108a7565b508161267a565b61267a83838151156127df5781518083602001fd5b8060405162461bcd60e51b81526004016108a79190612849565b60005b838110156128145781810151838201526020016127fc565b50506000910152565b600081518084526128358160208601602086016127f9565b601f01601f19169290920160200192915050565b60208152600061285c602083018461281d565b9392505050565b6001600160a01b0391909116815260200190565b6001600160401b038116811461288c57600080fd5b50565b80356001600160a01b03811681146128a657600080fd5b919050565b6000806000606084860312156128c057600080fd5b83356128cb81612877565b9250602084013591506128e06040850161288f565b90509250925092565b803563ffffffff811681146128a657600080fd5b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715612935576129356128fd565b60405290565b600082601f83011261294c57600080fd5b81356001600160401b0380821115612966576129666128fd565b604051601f8301601f19908116603f0116810190828211818310171561298e5761298e6128fd565b816040528381528660208588010111156129a757600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a0312156129e257600080fd5b6129eb8861288f565b96506129f96020890161288f565b9550612a07604089016128e9565b9450612a156060890161288f565b9350612a23608089016128e9565b925060a08801356001600160401b0380821115612a3f57600080fd5b612a4b8b838c0161293b565b935060c08a0135915080821115612a6157600080fd5b50612a6e8a828b0161293b565b91505092959891949750929550565b600060208284031215612a8f57600080fd5b813561285c81612877565b60008083601f840112612aac57600080fd5b5081356001600160401b03811115612ac357600080fd5b6020830191508360208260051b8501011115612ade57600080fd5b9250929050565b600080600060408486031215612afa57600080fd5b83356001600160401b03811115612b1057600080fd5b612b1c86828701612a9a565b90945092506128e090506020850161288f565b600060208284031215612b4157600080fd5b61285c8261288f565b600080600060608486031215612b5f57600080fd5b612b68846128e9565b9250612b766020850161288f565b91506128e0604085016128e9565b60008083601f840112612b9657600080fd5b5081356001600160401b03811115612bad57600080fd5b602083019150836020828501011115612ade57600080fd5b600080600080600060608688031215612bdd57600080fd5b85356001600160401b0380821115612bf457600080fd5b818801915088601f830112612c0857600080fd5b813581811115612c1757600080fd5b8960208260071b8501011115612c2c57600080fd5b60208301975080965050612c426020890161288f565b94506040880135915080821115612c5857600080fd5b50612c6588828901612b84565b969995985093965092949392505050565b600060208284031215612c8857600080fd5b81356001600160401b03811115612c9e57600080fd5b61267a8482850161293b565b60008060208385031215612cbd57600080fd5b82356001600160401b03811115612cd357600080fd5b612cdf85828601612a9a565b90969095509350505050565b600080600060408486031215612d0057600080fd5b83356001600160401b03811115612d1657600080fd5b612d2286828701612b84565b909790965060209590950135949350505050565b600060208284031215612d4857600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03828116828216039080821115612d8557612d85612d4f565b5092915050565b600082612da957634e487b7160e01b600052601260045260246000fd5b500490565b600181811c90821680612dc257607f821691505b602082108103612de257634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610cf057600081815260208120601f850160051c81016020861015612e0f5750805b601f850160051c820191505b81811015612e2e57828155600101612e1b565b505050505050565b81516001600160401b03811115612e4f57612e4f6128fd565b612e6381612e5d8454612dae565b84612de8565b602080601f831160018114612e985760008415612e805750858301515b600019600386901b1c1916600185901b178555612e2e565b600085815260208120601f198616915b82811015612ec757888601518255948401946001909101908401612ea8565b5085821015612ee55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b6001600160401b03929092168252602082015260400190565b600060208284031215612f5f57600080fd5b815161285c81612877565b600060208284031215612f7c57600080fd5b8151801515811461285c57600080fd5b60008351612f9e8184602088016127f9565b835190830190612fb28183602088016127f9565b01949350505050565b60008651612fcd818460208b016127f9565b9190910194855250602084019290925260f81b6001600160f81b03199081166040840152166041820152604201919050565b634e487b7160e01b600052603260045260246000fd5b60006080828403121561302757600080fd5b61302f612913565b8235815260208301356020820152604083013561304b81612877565b6040820152606083013561305e81612877565b60608201529392505050565b60006001600160401b038281166002600160401b0319810161308e5761308e612d4f565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b6000600182016130cd576130cd612d4f565b5060010190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006131176040830184866130d4565b95945050505050565b8181038181111561313357613133612d4f565b92915050565b808202811582820484141761313357613133612d4f565b8082018082111561313357613133612d4f565b60008235605e1983360301811261317957600080fd5b9190910192915050565b60006060823603121561319557600080fd5b604051606081016001600160401b0380821183831017156131b8576131b86128fd565b8160405284359150808211156131cd57600080fd5b506131da3682860161293b565b8252506020830135602082015260408301356131f581612877565b604082015292915050565b6001600160401b03818116838216019080821115612d8557612d85612d4f565b8183823760009101908152919050565b8481526001600160a01b038416602082015260606040820181905260009061325b90830184866130d4565b9695505050505050565b60008235607e1983360301811261317957600080fd5b60006080823603121561328d57600080fd5b613295612913565b82356001600160401b038111156132ab57600080fd5b6132b73682860161293b565b8252506020830135602082015260408301356132d281612877565b604082015260608301356132e581612877565b606082015292915050565b600082516131798184602087016127f956fe303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fcef94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931f8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a2646970667358221220c4cd20d4038afe6dd468e6522f499aeecec4d8f2447a2a8bcae66bdc4c0a96ac64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101e25760003560e01c8062d0295d146101e7578063107bf28c1461020257806319d8ac611461021757806326782247146102425780632b35b3ac1461026257806332c2d1531461027f5780633c351e10146102945780633cbc795b146102ac57806340b5de6c146102d8578063456052671461030057806347ebf1081461031a57806349b7b8021461032d5780634c21fef3146103545780634e48770614610368578063542028d51461037b57806356e29435146103835780635e9145c9146103aa5780635ec91958146103bd5780636b8616ce146103c55780636e05d2cd146103e55780636ff512cc146103ee5780638c3d73011461040157806399af0397146104095780639e0018771461041c578063a3c573eb14610437578063aa3587d31461045e578063ada8f91914610466578063b0afe15414610479578063b81fcafd14610485578063c754c7ed14610498578063c89e42df146104b2578063cfa8ed47146104c5578063d02103ca146104d8578063d690be31146104ff578063d7bc90ff14610507578063d8d1091b14610512578063e46761c414610525578063e7a7ed021461054c578063eaeb077b14610566578063f35dda4714610579578063f851a44014610593575b600080fd5b6101ef6105ac565b6040519081526020015b60405180910390f35b61020a610695565b6040516101f99190612849565b60075461022a906001600160401b031681565b6040516001600160401b0390911681526020016101f9565b600154610255906001600160a01b031681565b6040516101f99190612863565b60085461026f9060ff1681565b60405190151581526020016101f9565b61029261028d3660046128ab565b610723565b005b6008546102559061010090046001600160a01b031681565b6008546102c390600160a81b900463ffffffff1681565b60405163ffffffff90911681526020016101f9565b6102e76001600160f81b031981565b6040516001600160f81b031990911681526020016101f9565b60075461022a90600160801b90046001600160401b031681565b6102926103283660046129c7565b6107be565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b60085461026f90600160c81b900460ff1681565b610292610376366004612a7d565b610b37565b61020a610cae565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b6102926103b8366004612ae5565b610cbb565b610292610cf5565b6101ef6103d3366004612a7d565b60066020526000908152604090205481565b6101ef60055481565b6102926103fc366004612b2f565b610d82565b610292610dfe565b61020a610417366004612b4a565b610e8b565b61025573a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b610292611018565b610292610474366004612b2f565b611093565b6101ef6405ca1ab1e081565b610292610493366004612bc5565b61110f565b60075461022a90600160c01b90046001600160401b031681565b6102926104c0366004612c76565b6117ee565b600254610255906001600160a01b031681565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b61020a61185b565b6101ef635ca1ab1e81565b610292610520366004612caa565b611877565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b60075461022a90600160401b90046001600160401b031681565b610292610574366004612ceb565b611c01565b610581601b81565b60405160ff90911681526020016101f9565b600054610255906201000090046001600160a01b031681565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016105fb9190612863565b602060405180830381865afa158015610618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063c9190612d36565b600754909150600090610668906001600160401b03600160801b8204811691600160401b900416612d65565b6001600160401b03169050806000036106845760009250505090565b61068e8183612d8c565b9250505090565b600480546106a290612dae565b80601f01602080910402602001604051908101604052809291908181526020018280546106ce90612dae565b801561071b5780601f106106f05761010080835404028352916020019161071b565b820191906000526020600020905b8154815290600101906020018083116106fe57829003601f168201915b505050505081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461076c57604051631736745960e31b815260040160405180910390fd5b806001600160a01b0316836001600160401b03167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966846040516107b191815260200190565b60405180910390a3505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461080757604051631736745960e31b815260040160405180910390fd5b600054610100900460ff16158080156108275750600054600160ff909116105b80610848575061083630611efd565b158015610848575060005460ff166001145b6108b05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156108d3576000805461ff0019166101001790555b6000805462010000600160b01b031916620100006001600160a01b038b81169190910291909117909155600280546001600160a01b03191691891691909117905560036109208482612e36565b50600461092d8382612e36565b50600780546001600160c01b0316610d2f60c71b1790556001600160a01b0385166109775763ffffffff84161561097757604051630d43a60960e11b815260040160405180910390fd5b60088054610100600160c81b0319166101006001600160a01b0388160263ffffffff60a81b191617600160a81b63ffffffff87160217905560006109bc878787610e8b565b9050600081805190602001209050600042905060008060001b836000801b848e6040516020016109f0959493929190612ef5565b60408051808303601f19018152908290528051602090910120600780546001600160401b0319166001600160401b0386161790556005819055639a908e7360e01b825291506000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639a908e7390610a7a906001908690600401612f34565b6020604051808303816000875af1158015610a99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abd9190612f4d565b6040519091506001600160401b0382169060008051602061330383398151915290600090a250505050508015610b2d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6000546201000090046001600160a01b03163314610b6857604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610b955760405163f5e37f2f60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bf3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c179190612f6a565b610c51576007546001600160401b03600160c01b909104811690821610610c515760405163f5e37f2f60e01b815260040160405180910390fd5b600780546001600160c01b0316600160c01b6001600160401b038416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546106a290612dae565b600854600160c81b900460ff16610ce5576040516320864d6d60e21b815260040160405180910390fd5b610cf0838383611f0c565b505050565b6000546201000090046001600160a01b03163314610d2657604051634755657960e01b815260040160405180910390fd5b60085460ff1615610d4a5760405163f6ba91a160e01b815260040160405180910390fd5b6008805460ff191660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b6000546201000090046001600160a01b03163314610db357604051634755657960e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383161790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610ca3908390612863565b6001546001600160a01b03163314610e295760405163d1ec4b2360e01b815260040160405180910390fd5b60015460008054620100006001600160a01b0390931692830262010000600160b01b03199091161790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e91610e8191612863565b60405180910390a1565b606060006040518060600160405280602181526020016133436021913960405163ffffffff80881660248301526001600160a01b03871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa6084820152600060a482015260c40160408051601f19818403018152918152602080830180516001600160e01b03166369a3b57f60e11b1790529051610f2b93929101612f8c565b60408051601f198184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015610f9b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610fcf5760405163668b0cb360e11b815260040160405180910390fd5b604051600090610ffd9084906405ca1ab1e090635ca1ab1e90601b906001600160f81b031990602001612fbb565b60408051808303601f19018152919052979650505050505050565b6000546201000090046001600160a01b0316331461104957604051634755657960e01b815260040160405180910390fd5b6008805460ff60c81b198116600160c81b9182900460ff16159091021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f4190600090a1565b6000546201000090046001600160a01b031633146110c457604051634755657960e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610ca3908390612863565b6002546001600160a01b0316331461113a576040516311e7be1560e01b815260040160405180910390fd5b83600081900361115d5760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561118057604051635acfba9d60e11b815260040160405180910390fd5b6007546005546001600160401b0380831692600160801b900416908160005b858110156114235760008b8b838181106111bb576111bb612fff565b9050608002018036038101906111d19190613015565b80516060820151919250906001600160401b0316156112c157856111f48161306a565b9650506000818360200151846060015160405160200161121693929190613098565b60408051601f1981840301815291815281516020928301206001600160401b038a166000908152600690935291205490915081146112675760405163671ebaaf60e11b815260040160405180910390fd5b82606001516001600160401b031683604001516001600160401b031610156112a257604051633fbd5c3960e11b815260040160405180910390fd5b506001600160401b038616600090815260066020526040812055611380565b602082015115801590611362575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303816000875af115801561133c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113609190612d36565b155b15611380576040516373bd668d60e01b815260040160405180910390fd5b866001600160401b031682604001516001600160401b031610806113b057504282604001516001600160401b0316115b156113ce576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518e6040516020016113ef959493929190612ef5565b604051602081830303815290604052805190602001209450816040015196505050808061141b906130bb565b91505061119f565b506007546001600160401b03600160401b9091048116908416111561145b5760405163c630a00d60e01b815260040160405180910390fd5b600780546001600160401b0319166001600160401b038616179055600582905560405163063d411f60e51b815285907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063c7a823e0906114cd9086908c908c906004016130fd565b60006040518083038186803b1580156114e557600080fd5b505afa1580156114f9573d6000803e3d6000fd5b50505050816001600160401b0316846001600160401b0316146115d05760006115228386612d65565b90506115376001600160401b03821683613120565b91506115aa7f0000000000000000000000000000000000000000000000000000000000000000826001600160401b031661156f6105ac565b6115799190613139565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906124f8565b5060078054600160801b600160c01b031916600160801b6001600160401b038716021790555b6116b4337f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611654573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116789190612d36565b6116829190613139565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001692919061255b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561170f57600080fd5b505af1158015611723573d6000803e3d6000fd5b5050604051639a908e7360e01b8152600092506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150639a908e7390611778908a908890600401612f34565b6020604051808303816000875af1158015611797573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117bb9190612f4d565b6040519091506001600160401b0382169060008051602061330383398151915290600090a2505050505050505050505050565b6000546201000090046001600160a01b0316331461181f57604051634755657960e01b815260040160405180910390fd5b600361182b8282612e36565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610ca39190612849565b6040518060600160405280602181526020016133436021913981565b60085460ff1661189a576040516324eff8c360e01b815260040160405180910390fd5b8060008190036118bd5760405163cb591a5f60e01b815260040160405180910390fd5b6103e88111156118e057604051635acfba9d60e11b815260040160405180910390fd5b6007546001600160401b03600160401b8204811691611908918491600160801b900416613150565b11156119275760405163c630a00d60e01b815260040160405180910390fd5b600754600554600160801b9091046001600160401b03169060005b83811015611ac557600086868381811061195e5761195e612fff565b90506020028101906119709190613163565b61197990613183565b9050836119858161306a565b825180516020918201208185015160408087015190519499509194506000936119b19386939101613098565b60408051601f1981840301815291815281516020928301206001600160401b038916600090815260069093529120549091508114611a025760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b038616600090815260066020526040812055611a26600188613120565b8403611a7a5742600760189054906101000a90046001600160401b03168460400151611a529190613200565b6001600160401b03161115611a7a5760405163c44a082160e01b815260040160405180910390fd5b848284602001514233604051602001611a97959493929190612ef5565b6040516020818303038152906040528051906020012094505050508080611abd906130bb565b915050611942565b50611af37f00000000000000000000000000000000000000000000000000000000000000008461156f6105ac565b6005819055600780546001600160401b03848116600160801b026001600160401b03600160801b03600160c01b0319909216429190911617179055604051639a908e7360e01b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611b7f9087908690600401612f34565b6020604051808303816000875af1158015611b9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc29190612f4d565b6040519091506001600160401b038216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16611c24576040516324eff8c360e01b815260040160405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca89190612d36565b905081811115611ccb57604051632354600f60e01b815260040160405180910390fd5b611388831115611cee576040516328a69b1f60e21b815260040160405180910390fd5b611d236001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633308461255b565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da79190612d36565b60078054919250600160401b9091046001600160401b0316906008611dcb8361306a565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508484604051611e00929190613220565b604051908190038120611e199183904290602001613098565b60408051808303601f190181529181528151602092830120600754600160401b90046001600160401b031660009081526006909352912055323303611eab57600754604080518381523360208201526060918101829052600091810191909152600160401b9091046001600160401b0316906000805160206133238339815191529060800160405180910390a2611ef6565b600760089054906101000a90046001600160401b03166001600160401b031660008051602061332383398151915282338888604051611eed9493929190613230565b60405180910390a25b5050505050565b6001600160a01b03163b151590565b6002546001600160a01b03163314611f37576040516311e7be1560e01b815260040160405180910390fd5b816000819003611f5a5760405163cb591a5f60e01b815260040160405180910390fd5b6103e8811115611f7d57604051635acfba9d60e11b815260040160405180910390fd5b6007546005546001600160401b0380831692600160801b900416908160005b85811015612253576000898983818110611fb857611fb8612fff565b9050602002810190611fca9190613265565b611fd39061327b565b805180516020909101206060820151919250906001600160401b0316156120cb5785611ffe8161306a565b9650506000818360200151846060015160405160200161202093929190613098565b60408051601f1981840301815291815281516020928301206001600160401b038a166000908152600690935291205490915081146120715760405163671ebaaf60e11b815260040160405180910390fd5b82606001516001600160401b031683604001516001600160401b031610156120ac57604051633fbd5c3960e11b815260040160405180910390fd5b506001600160401b0386166000908152600660205260408120556121b0565b60208201511580159061216c575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303816000875af1158015612146573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061216a9190612d36565b155b1561218a576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c010156121b0576040516328a69b1f60e21b815260040160405180910390fd5b866001600160401b031682604001516001600160401b031610806121e057504282604001516001600160401b0316115b156121fe576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518c60405160200161221f959493929190612ef5565b604051602081830303815290604052805190602001209450816040015196505050808061224b906130bb565b915050611f9c565b506007546001600160401b03600160401b9091048116908416111561228b5760405163c630a00d60e01b815260040160405180910390fd5b600780546001600160401b0319166001600160401b0386811691909117909155600583905585908281169085161461233c5760006122c98386612d65565b90506122de6001600160401b03821683613120565b91506123167f0000000000000000000000000000000000000000000000000000000000000000826001600160401b031661156f6105ac565b5060078054600160801b600160c01b031916600160801b6001600160401b038716021790555b6123c0337f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611654573d6000803e3d6000fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561241b57600080fd5b505af115801561242f573d6000803e3d6000fd5b5050604051639a908e7360e01b8152600092506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150639a908e7390612484908a908890600401612f34565b6020604051808303816000875af11580156124a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124c79190612f4d565b6040519091506001600160401b0382169060008051602061330383398151915290600090a250505050505050505050565b6040516001600160a01b038316602482015260448101829052610cf090849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612599565b6040516001600160a01b03808516602483015283166044820152606481018290526125939085906323b872dd60e01b90608401612524565b50505050565b60006125ee826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661266b9092919063ffffffff16565b805190915015610cf0578080602001905181019061260c9190612f6a565b610cf05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016108a7565b606061267a8484600085612682565b949350505050565b6060824710156126e35760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016108a7565b600080866001600160a01b031685876040516126ff91906132f0565b60006040518083038185875af1925050503d806000811461273c576040519150601f19603f3d011682016040523d82523d6000602084013e612741565b606091505b50915091506127528783838761275d565b979650505050505050565b606083156127ca5782516000036127c35761277785611efd565b6127c35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108a7565b508161267a565b61267a83838151156127df5781518083602001fd5b8060405162461bcd60e51b81526004016108a79190612849565b60005b838110156128145781810151838201526020016127fc565b50506000910152565b600081518084526128358160208601602086016127f9565b601f01601f19169290920160200192915050565b60208152600061285c602083018461281d565b9392505050565b6001600160a01b0391909116815260200190565b6001600160401b038116811461288c57600080fd5b50565b80356001600160a01b03811681146128a657600080fd5b919050565b6000806000606084860312156128c057600080fd5b83356128cb81612877565b9250602084013591506128e06040850161288f565b90509250925092565b803563ffffffff811681146128a657600080fd5b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715612935576129356128fd565b60405290565b600082601f83011261294c57600080fd5b81356001600160401b0380821115612966576129666128fd565b604051601f8301601f19908116603f0116810190828211818310171561298e5761298e6128fd565b816040528381528660208588010111156129a757600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a0312156129e257600080fd5b6129eb8861288f565b96506129f96020890161288f565b9550612a07604089016128e9565b9450612a156060890161288f565b9350612a23608089016128e9565b925060a08801356001600160401b0380821115612a3f57600080fd5b612a4b8b838c0161293b565b935060c08a0135915080821115612a6157600080fd5b50612a6e8a828b0161293b565b91505092959891949750929550565b600060208284031215612a8f57600080fd5b813561285c81612877565b60008083601f840112612aac57600080fd5b5081356001600160401b03811115612ac357600080fd5b6020830191508360208260051b8501011115612ade57600080fd5b9250929050565b600080600060408486031215612afa57600080fd5b83356001600160401b03811115612b1057600080fd5b612b1c86828701612a9a565b90945092506128e090506020850161288f565b600060208284031215612b4157600080fd5b61285c8261288f565b600080600060608486031215612b5f57600080fd5b612b68846128e9565b9250612b766020850161288f565b91506128e0604085016128e9565b60008083601f840112612b9657600080fd5b5081356001600160401b03811115612bad57600080fd5b602083019150836020828501011115612ade57600080fd5b600080600080600060608688031215612bdd57600080fd5b85356001600160401b0380821115612bf457600080fd5b818801915088601f830112612c0857600080fd5b813581811115612c1757600080fd5b8960208260071b8501011115612c2c57600080fd5b60208301975080965050612c426020890161288f565b94506040880135915080821115612c5857600080fd5b50612c6588828901612b84565b969995985093965092949392505050565b600060208284031215612c8857600080fd5b81356001600160401b03811115612c9e57600080fd5b61267a8482850161293b565b60008060208385031215612cbd57600080fd5b82356001600160401b03811115612cd357600080fd5b612cdf85828601612a9a565b90969095509350505050565b600080600060408486031215612d0057600080fd5b83356001600160401b03811115612d1657600080fd5b612d2286828701612b84565b909790965060209590950135949350505050565b600060208284031215612d4857600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03828116828216039080821115612d8557612d85612d4f565b5092915050565b600082612da957634e487b7160e01b600052601260045260246000fd5b500490565b600181811c90821680612dc257607f821691505b602082108103612de257634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610cf057600081815260208120601f850160051c81016020861015612e0f5750805b601f850160051c820191505b81811015612e2e57828155600101612e1b565b505050505050565b81516001600160401b03811115612e4f57612e4f6128fd565b612e6381612e5d8454612dae565b84612de8565b602080601f831160018114612e985760008415612e805750858301515b600019600386901b1c1916600185901b178555612e2e565b600085815260208120601f198616915b82811015612ec757888601518255948401946001909101908401612ea8565b5085821015612ee55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b6001600160401b03929092168252602082015260400190565b600060208284031215612f5f57600080fd5b815161285c81612877565b600060208284031215612f7c57600080fd5b8151801515811461285c57600080fd5b60008351612f9e8184602088016127f9565b835190830190612fb28183602088016127f9565b01949350505050565b60008651612fcd818460208b016127f9565b9190910194855250602084019290925260f81b6001600160f81b03199081166040840152166041820152604201919050565b634e487b7160e01b600052603260045260246000fd5b60006080828403121561302757600080fd5b61302f612913565b8235815260208301356020820152604083013561304b81612877565b6040820152606083013561305e81612877565b60608201529392505050565b60006001600160401b038281166002600160401b0319810161308e5761308e612d4f565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b6000600182016130cd576130cd612d4f565b5060010190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006131176040830184866130d4565b95945050505050565b8181038181111561313357613133612d4f565b92915050565b808202811582820484141761313357613133612d4f565b8082018082111561313357613133612d4f565b60008235605e1983360301811261317957600080fd5b9190910192915050565b60006060823603121561319557600080fd5b604051606081016001600160401b0380821183831017156131b8576131b86128fd565b8160405284359150808211156131cd57600080fd5b506131da3682860161293b565b8252506020830135602082015260408301356131f581612877565b604082015292915050565b6001600160401b03818116838216019080821115612d8557612d85612d4f565b8183823760009101908152919050565b8481526001600160a01b038416602082015260606040820181905260009061325b90830184866130d4565b9695505050505050565b60008235607e1983360301811261317957600080fd5b60006080823603121561328d57600080fd5b613295612913565b82356001600160401b038111156132ab57600080fd5b6132b73682860161293b565b8252506020830135602082015260408301356132d281612877565b604082015260608301356132e581612877565b606082015292915050565b600082516131798184602087016127f956fe303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fcef94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931f8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a2646970667358221220c4cd20d4038afe6dd468e6522f499aeecec4d8f2447a2a8bcae66bdc4c0a96ac64736f6c63430008140033", + "bytecode": "0x6101206040523480156200001257600080fd5b50604051620051c8380380620051c8833981016040819052620000359162000078565b6001600160a01b0394851660a05292841660805290831660c052821660e0521661010052620000f8565b6001600160a01b03811681146200007557600080fd5b50565b600080600080600060a086880312156200009157600080fd5b85516200009e816200005f565b6020870151909550620000b1816200005f565b6040870151909450620000c4816200005f565b6060870151909350620000d7816200005f565b6080870151909250620000ea816200005f565b809150509295509295909350565b60805160a05160c05160e05161010051614fc7620002016000396000818161059101526121a3015260008181610525015281816109d001528181610b3d01528181610ee30152818161149c015281816122650152818161232e01528181612350015281816124e7015281816129ff01528181612acd01528181612bba01528181613539015281816135ba015281816135dc01526137060152600081816106810152818161113d0152818161189d015281816124280152613647015260008181610758015281816112f201528181611f1601528181612d05015261325c01526000818161079d01528181610868015281816122b8015281816123fe0152612cd90152614fc76000f3fe608060405234801561001057600080fd5b50600436106102f35760003560e01c80636ff512cc11610191578063c754c7ed116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b146107df578063f35dda47146107f2578063f851a440146107fa57600080fd5b8063d8d1091b14610785578063e46761c414610798578063e7a7ed02146107bf57600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610733578063d02103ca14610753578063d7bc90ff1461077a57600080fd5b8063c754c7ed146106f0578063c89e42df1461072057600080fd5b8063a3c573eb11610145578063ada8f9191161011f578063ada8f919146106be578063b0afe154146106d1578063b81fcafd146106dd57600080fd5b8063a3c573eb1461067c578063a652f26c146106a3578063aa3587d3146106b657600080fd5b80637a5460c5116101765780637a5460c51461061d5780638c3d7301146106595780639e0018771461066157600080fd5b80636ff512cc146105f7578063712570221461060a57600080fd5b806340b5de6c1161024a578063542028d5116101fe5780635ec91958116101d85780635ec91958146105c65780636b8616ce146105ce5780636e05d2cd146105ee57600080fd5b8063542028d51461058457806356e294351461058c5780635e9145c9146105b357600080fd5b806349b7b8021161022f57806349b7b802146105205780634c21fef3146105475780634e4877061461057157600080fd5b806340b5de6c146104a057806345605267146104f857600080fd5b806319d8ac61116102ac57806332c2d1531161028657806332c2d153146104285780633c351e101461043d5780633cbc795b1461046257600080fd5b806319d8ac611461039957806326782247146103c65780632b35b3ac1461040b57600080fd5b806305835f37116102dd57806305835f371461032e578063107bf28c1461037757806311e892d41461037f57600080fd5b8062d0295d146102f85780630350896314610313575b600080fd5b610300610820565b6040519081526020015b60405180910390f35b61031b602081565b60405161ffff909116815260200161030a565b61036a6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161030a91906140d5565b61036a610940565b61038760f981565b60405160ff909116815260200161030a565b6007546103ad9067ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161030a565b6001546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161030a565b6008546104189060ff1681565b604051901515815260200161030a565b61043b610436366004614135565b6109ce565b005b6008546103e690610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60085461048b907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161030a565b6104c77fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161030a565b6007546103ad90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b60085461041890790100000000000000000000000000000000000000000000000000900460ff1681565b61043b61057f366004614177565b610a9d565b61036a610cb7565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b61043b6105c13660046141e0565b610cc4565b61043b610d2d565b6103006105dc366004614177565b60066020526000908152604090205481565b61030060055481565b61043b61060536600461422c565b610e17565b61043b61061836600461439e565b610ee1565b61036a6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61043b611697565b6103e673a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b61036a6106b136600461444b565b61176a565b61043b611a94565b61043b6106cc36600461422c565b611b66565b6103006405ca1ab1e081565b61043b6106eb366004614502565b611c30565b6007546103ad907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61043b61072e3660046145b4565b6125b0565b6002546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b610300635ca1ab1e81565b61043b6107933660046145e9565b612643565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b6007546103ad9068010000000000000000900467ffffffffffffffff1681565b61043b6107ed36600461462b565b612b7a565b610387601b81565b6000546103e69062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156108af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d39190614677565b6007549091506000906109129067ffffffffffffffff7001000000000000000000000000000000008204811691680100000000000000009004166146bf565b67ffffffffffffffff1690508060000361092f5760009250505090565b61093981836146e7565b9250505090565b6004805461094d90614722565b80601f016020809104026020016040519081016040528092919081815260200182805461097990614722565b80156109c65780601f1061099b576101008083540402835291602001916109c6565b820191906000526020600020905b8154815290600101906020018083116109a957829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a3d576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a9091815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610af4576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b3b576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ba6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bca9190614775565b610c335760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c33576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461094d90614722565b600854790100000000000000000000000000000000000000000000000000900460ff16610d1d576040517f821935b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d28838383612f69565b505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610d84576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615610dc1576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610e6e576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610cac565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610f50576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610f705750600054600160ff909116105b80610f8a5750303b158015610f8a575060005460ff166001145b61101b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561107957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff85161561128e576110a0856137cd565b6110a9866138dd565b6110b2876139e4565b6040516020016110c493929190614797565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611185573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a991906147d0565b915091508163ffffffff1660001461124657600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff85160217905561128b565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b6008546000906112db908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff168561176a565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561135b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137f9190614677565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af11580156114fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151e919061480a565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600390816115b09190614875565b5060046115bd8982614875565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e60405161161d9392919061498f565b60405180910390a1505050505050801561168e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146116e8576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa60008760405160240161179e969594939291906149ce565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff700000000000000000000000000000000000000000000000000000000179052805190915061ffff1015611854576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600060f9611865602084614a31565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b9000000000000000000000000000000000000000000000000000000000000815250868860405160200161190a9796959493929190614a4c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015611998573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611a10576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051600090611a569084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614b2f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052955050505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611aeb576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff81167901000000000000000000000000000000000000000000000000009182900460ff16159091021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f4190600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611bbd576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610cac565b60025473ffffffffffffffffffffffffffffffffffffffff163314611c81576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836000819003611cbd576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611cf9576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156120e95760008b8b83818110611d4257611d42614b8b565b905060800201803603810190611d589190614bba565b805160608201519192509067ffffffffffffffff1615611ed35785611d7c81614c0f565b96505060008183602001518460600151604051602001611dd493929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114611e5d576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015611eb3576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055611fd1565b602082015115801590611f9a575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015611f74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f989190614677565b155b15611fd1576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff161080612004575042826040015167ffffffffffffffff16115b1561203b576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519650505080806120e190614c36565b915050611d26565b5060075467ffffffffffffffff6801000000000000000090910481169084161115612140576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861617905560058290556040517fc7a823e000000000000000000000000000000000000000000000000000000000815285907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063c7a823e0906121f19086908c908c90600401614cb7565b60006040518083038186803b15801561220957600080fd5b505afa15801561221d573d6000803e3d6000fd5b505050508167ffffffffffffffff168467ffffffffffffffff161461232857600061224883866146bf565b905061225e67ffffffffffffffff821683614cda565b91506122df7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16612297610820565b6122a19190614ced565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613ad7565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b612426337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123dd9190614677565b6123e79190614ced565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613bab565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561248e57600080fd5b505af11580156124a2573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af1158015612546573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256a919061480a565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a2505050505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612607576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036126138282614875565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610cac91906140d5565b60085460ff1661267f576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036126bb576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156126f7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612732918491700100000000000000000000000000000000900416614d04565b111561276a576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b838110156129f95760008686838181106127af576127af614b8b565b90506020028101906127c19190614d17565b6127ca90614d55565b9050836127d681614c0f565b825180516020918201208185015160408087015190519499509194506000936128389386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89166000908152600690935291205490915081146128c1576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86166000908152600660205260408120556128e6600188614cda565b84036129555742600760189054906101000a900467ffffffffffffffff1684604001516129139190614dd3565b67ffffffffffffffff161115612955576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806129f190614c36565b915050612793565b50612a277f000000000000000000000000000000000000000000000000000000000000000084612297610820565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612b16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3a919061480a565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612bb6576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c479190614677565b905081811115612c83576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612cbf576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d0173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613bab565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d929190614677565b600780549192506801000000000000000090910467ffffffffffffffff16906008612dbc83614c0f565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612df3929190614df4565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612f03576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612f62565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612f599493929190614e04565b60405180910390a25b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612fba576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003612ff6576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115613032576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b8581101561346e57600089898381811061307b5761307b614b8b565b905060200281019061308d9190614e44565b61309690614e78565b8051805160209091012060608201519192509067ffffffffffffffff161561321957856130c281614c0f565b9650506000818360200151846060015160405160200161311a93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a166000908152600690935291205490915081146131a3576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff1610156131f9576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055613356565b6020820151158015906132e0575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af11580156132ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132de9190614677565b155b15613317576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015613356576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff161080613389575042826040015167ffffffffffffffff16115b156133c0576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061346690614c36565b91505061305f565b5060075467ffffffffffffffff68010000000000000000909104811690841611156134c5576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146135b457600061351c83866146bf565b905061353267ffffffffffffffff821683614cda565b915061356b7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16612297610820565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b613645337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123b9573d6000803e3d6000fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156136ad57600080fd5b505af11580156136c1573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af1158015613765573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613789919061480a565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161384f9190614eee565b600060405180830381855afa9150503d806000811461388a576040519150601f19603f3d011682016040523d82523d6000602084013e61388f565b606091505b5091509150816138d4576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250611a8c565b611a8c81613c0f565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161395f9190614eee565b600060405180830381855afa9150503d806000811461399a576040519150601f19603f3d011682016040523d82523d6000602084013e61399f565b606091505b5091509150816138d4576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250611a8c565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff861691613a659190614eee565b600060405180830381855afa9150503d8060008114613aa0576040519150601f19603f3d011682016040523d82523d6000602084013e613aa5565b606091505b5091509150818015613ab8575080516020145b613ac3576012611a8c565b80806020019051810190611a8c9190614f00565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610d289084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613dea565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052613c099085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613b29565b50505050565b60606040825110613c345781806020019051810190613c2e9190614f23565b92915050565b8151602003613dac5760005b602081108015613c875750828181518110613c5d57613c5d614b8b565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613c9e5780613c9681614c36565b915050613c40565b80600003613ce157505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115613cfc57613cfc61425b565b6040519080825280601f01601f191660200182016040528015613d26576020820181803683370190505b50905060005b82811015613da457848181518110613d4657613d46614b8b565b602001015160f81c60f81b828281518110613d6357613d63614b8b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080613d9c81614c36565b915050613d2c565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b6000613e4c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613ef69092919063ffffffff16565b805190915015610d285780806020019051810190613e6a9190614775565b610d28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611012565b6060611a8c8484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051613f2a9190614eee565b60006040518083038185875af1925050503d8060008114613f67576040519150601f19603f3d011682016040523d82523d6000602084013e613f6c565b606091505b5091509150613f7d87838387613f88565b979650505050505050565b6060831561401e5782516000036140175773ffffffffffffffffffffffffffffffffffffffff85163b614017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611012565b5081611a8c565b611a8c83838151156140335781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101291906140d5565b60005b8381101561408257818101518382015260200161406a565b50506000910152565b600081518084526140a3816020860160208601614067565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006140e8602083018461408b565b9392505050565b67ffffffffffffffff8116811461410557600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461410557600080fd5b8035613de581614108565b60008060006060848603121561414a57600080fd5b8335614155816140ef565b925060208401359150604084013561416c81614108565b809150509250925092565b60006020828403121561418957600080fd5b81356140e8816140ef565b60008083601f8401126141a657600080fd5b50813567ffffffffffffffff8111156141be57600080fd5b6020830191508360208260051b85010111156141d957600080fd5b9250929050565b6000806000604084860312156141f557600080fd5b833567ffffffffffffffff81111561420c57600080fd5b61421886828701614194565b909450925050602084013561416c81614108565b60006020828403121561423e57600080fd5b81356140e881614108565b63ffffffff8116811461410557600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516080810167ffffffffffffffff811182821017156142ad576142ad61425b565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156142fa576142fa61425b565b604052919050565b600067ffffffffffffffff82111561431c5761431c61425b565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261435957600080fd5b813561436c61436782614302565b6142b3565b81815284602083860101111561438157600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c087890312156143b757600080fd5b86356143c281614108565b955060208701356143d281614108565b945060408701356143e281614249565b935060608701356143f281614108565b9250608087013567ffffffffffffffff8082111561440f57600080fd5b61441b8a838b01614348565b935060a089013591508082111561443157600080fd5b5061443e89828a01614348565b9150509295509295509295565b6000806000806080858703121561446157600080fd5b843561446c81614249565b9350602085013561447c81614108565b9250604085013561448c81614249565b9150606085013567ffffffffffffffff8111156144a857600080fd5b6144b487828801614348565b91505092959194509250565b60008083601f8401126144d257600080fd5b50813567ffffffffffffffff8111156144ea57600080fd5b6020830191508360208285010111156141d957600080fd5b60008060008060006060868803121561451a57600080fd5b853567ffffffffffffffff8082111561453257600080fd5b818801915088601f83011261454657600080fd5b81358181111561455557600080fd5b8960208260071b850101111561456a57600080fd5b602083019750809650506145806020890161412a565b9450604088013591508082111561459657600080fd5b506145a3888289016144c0565b969995985093965092949392505050565b6000602082840312156145c657600080fd5b813567ffffffffffffffff8111156145dd57600080fd5b611a8c84828501614348565b600080602083850312156145fc57600080fd5b823567ffffffffffffffff81111561461357600080fd5b61461f85828601614194565b90969095509350505050565b60008060006040848603121561464057600080fd5b833567ffffffffffffffff81111561465757600080fd5b614663868287016144c0565b909790965060209590950135949350505050565b60006020828403121561468957600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8281168282160390808211156146e0576146e0614690565b5092915050565b60008261471d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061473657607f821691505b60208210810361476f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561478757600080fd5b815180151581146140e857600080fd5b6060815260006147aa606083018661408b565b82810360208401526147bc818661408b565b91505060ff83166040830152949350505050565b600080604083850312156147e357600080fd5b82516147ee81614249565b60208401519092506147ff81614108565b809150509250929050565b60006020828403121561481c57600080fd5b81516140e8816140ef565b601f821115610d2857600081815260208120601f850160051c8101602086101561484e5750805b601f850160051c820191505b8181101561486d5782815560010161485a565b505050505050565b815167ffffffffffffffff81111561488f5761488f61425b565b6148a38161489d8454614722565b84614827565b602080601f8311600181146148f657600084156148c05750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561486d565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561494357888601518255948401946001909101908401614924565b508582101561497f57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006149a2606083018661408b565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152614a2560c083018461408b565b98975050505050505050565b61ffff8181168382160190808211156146e0576146e0614690565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614ab5816003860160208c01614067565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614af8816017840160208b01614067565b808201915050818660f01b16601782015284519150614b1e826019830160208801614067565b016019019998505050505050505050565b60008651614b41818460208b01614067565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060808284031215614bcc57600080fd5b614bd461428a565b82358152602083013560208201526040830135614bf0816140ef565b60408201526060830135614c03816140ef565b60608201529392505050565b600067ffffffffffffffff808316818103614c2c57614c2c614690565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614c6757614c67614690565b5060010190565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201526000614cd1604083018486614c6e565b95945050505050565b81810381811115613c2e57613c2e614690565b8082028115828204841417613c2e57613c2e614690565b80820180821115613c2e57613c2e614690565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112614d4b57600080fd5b9190910192915050565b600060608236031215614d6757600080fd5b6040516060810167ffffffffffffffff8282108183111715614d8b57614d8b61425b565b816040528435915080821115614da057600080fd5b50614dad36828601614348565b825250602083013560208201526040830135614dc8816140ef565b604082015292915050565b67ffffffffffffffff8181168382160190808211156146e0576146e0614690565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000614e3a606083018486614c6e565b9695505050505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112614d4b57600080fd5b600060808236031215614e8a57600080fd5b614e9261428a565b823567ffffffffffffffff811115614ea957600080fd5b614eb536828601614348565b825250602083013560208201526040830135614ed0816140ef565b60408201526060830135614ee3816140ef565b606082015292915050565b60008251614d4b818460208701614067565b600060208284031215614f1257600080fd5b815160ff811681146140e857600080fd5b600060208284031215614f3557600080fd5b815167ffffffffffffffff811115614f4c57600080fd5b8201601f81018413614f5d57600080fd5b8051614f6b61436782614302565b818152856020838501011115614f8057600080fd5b614cd182602083016020860161406756fea26469706673582212200d9a80d90b20d904d67c14143f500a701874514e1fc69c24fccb9b73d8f2486e64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102f35760003560e01c80636ff512cc11610191578063c754c7ed116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b146107df578063f35dda47146107f2578063f851a440146107fa57600080fd5b8063d8d1091b14610785578063e46761c414610798578063e7a7ed02146107bf57600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610733578063d02103ca14610753578063d7bc90ff1461077a57600080fd5b8063c754c7ed146106f0578063c89e42df1461072057600080fd5b8063a3c573eb11610145578063ada8f9191161011f578063ada8f919146106be578063b0afe154146106d1578063b81fcafd146106dd57600080fd5b8063a3c573eb1461067c578063a652f26c146106a3578063aa3587d3146106b657600080fd5b80637a5460c5116101765780637a5460c51461061d5780638c3d7301146106595780639e0018771461066157600080fd5b80636ff512cc146105f7578063712570221461060a57600080fd5b806340b5de6c1161024a578063542028d5116101fe5780635ec91958116101d85780635ec91958146105c65780636b8616ce146105ce5780636e05d2cd146105ee57600080fd5b8063542028d51461058457806356e294351461058c5780635e9145c9146105b357600080fd5b806349b7b8021161022f57806349b7b802146105205780634c21fef3146105475780634e4877061461057157600080fd5b806340b5de6c146104a057806345605267146104f857600080fd5b806319d8ac61116102ac57806332c2d1531161028657806332c2d153146104285780633c351e101461043d5780633cbc795b1461046257600080fd5b806319d8ac611461039957806326782247146103c65780632b35b3ac1461040b57600080fd5b806305835f37116102dd57806305835f371461032e578063107bf28c1461037757806311e892d41461037f57600080fd5b8062d0295d146102f85780630350896314610313575b600080fd5b610300610820565b6040519081526020015b60405180910390f35b61031b602081565b60405161ffff909116815260200161030a565b61036a6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161030a91906140d5565b61036a610940565b61038760f981565b60405160ff909116815260200161030a565b6007546103ad9067ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161030a565b6001546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161030a565b6008546104189060ff1681565b604051901515815260200161030a565b61043b610436366004614135565b6109ce565b005b6008546103e690610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60085461048b907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161030a565b6104c77fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161030a565b6007546103ad90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b60085461041890790100000000000000000000000000000000000000000000000000900460ff1681565b61043b61057f366004614177565b610a9d565b61036a610cb7565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b61043b6105c13660046141e0565b610cc4565b61043b610d2d565b6103006105dc366004614177565b60066020526000908152604090205481565b61030060055481565b61043b61060536600461422c565b610e17565b61043b61061836600461439e565b610ee1565b61036a6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61043b611697565b6103e673a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b61036a6106b136600461444b565b61176a565b61043b611a94565b61043b6106cc36600461422c565b611b66565b6103006405ca1ab1e081565b61043b6106eb366004614502565b611c30565b6007546103ad907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61043b61072e3660046145b4565b6125b0565b6002546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b610300635ca1ab1e81565b61043b6107933660046145e9565b612643565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b6007546103ad9068010000000000000000900467ffffffffffffffff1681565b61043b6107ed36600461462b565b612b7a565b610387601b81565b6000546103e69062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156108af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d39190614677565b6007549091506000906109129067ffffffffffffffff7001000000000000000000000000000000008204811691680100000000000000009004166146bf565b67ffffffffffffffff1690508060000361092f5760009250505090565b61093981836146e7565b9250505090565b6004805461094d90614722565b80601f016020809104026020016040519081016040528092919081815260200182805461097990614722565b80156109c65780601f1061099b576101008083540402835291602001916109c6565b820191906000526020600020905b8154815290600101906020018083116109a957829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a3d576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a9091815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610af4576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b3b576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ba6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bca9190614775565b610c335760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c33576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461094d90614722565b600854790100000000000000000000000000000000000000000000000000900460ff16610d1d576040517f821935b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d28838383612f69565b505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610d84576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615610dc1576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610e6e576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610cac565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610f50576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610f705750600054600160ff909116105b80610f8a5750303b158015610f8a575060005460ff166001145b61101b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561107957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff85161561128e576110a0856137cd565b6110a9866138dd565b6110b2876139e4565b6040516020016110c493929190614797565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611185573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a991906147d0565b915091508163ffffffff1660001461124657600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff85160217905561128b565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b6008546000906112db908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff168561176a565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561135b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137f9190614677565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af11580156114fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151e919061480a565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600390816115b09190614875565b5060046115bd8982614875565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e60405161161d9392919061498f565b60405180910390a1505050505050801561168e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146116e8576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa60008760405160240161179e969594939291906149ce565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff700000000000000000000000000000000000000000000000000000000179052805190915061ffff1015611854576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600060f9611865602084614a31565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b9000000000000000000000000000000000000000000000000000000000000815250868860405160200161190a9796959493929190614a4c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015611998573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611a10576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051600090611a569084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614b2f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052955050505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611aeb576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff81167901000000000000000000000000000000000000000000000000009182900460ff16159091021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f4190600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611bbd576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610cac565b60025473ffffffffffffffffffffffffffffffffffffffff163314611c81576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836000819003611cbd576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611cf9576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156120e95760008b8b83818110611d4257611d42614b8b565b905060800201803603810190611d589190614bba565b805160608201519192509067ffffffffffffffff1615611ed35785611d7c81614c0f565b96505060008183602001518460600151604051602001611dd493929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114611e5d576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015611eb3576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055611fd1565b602082015115801590611f9a575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015611f74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f989190614677565b155b15611fd1576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff161080612004575042826040015167ffffffffffffffff16115b1561203b576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519650505080806120e190614c36565b915050611d26565b5060075467ffffffffffffffff6801000000000000000090910481169084161115612140576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861617905560058290556040517fc7a823e000000000000000000000000000000000000000000000000000000000815285907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063c7a823e0906121f19086908c908c90600401614cb7565b60006040518083038186803b15801561220957600080fd5b505afa15801561221d573d6000803e3d6000fd5b505050508167ffffffffffffffff168467ffffffffffffffff161461232857600061224883866146bf565b905061225e67ffffffffffffffff821683614cda565b91506122df7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16612297610820565b6122a19190614ced565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613ad7565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b612426337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123dd9190614677565b6123e79190614ced565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613bab565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561248e57600080fd5b505af11580156124a2573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af1158015612546573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256a919061480a565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a2505050505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612607576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036126138282614875565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610cac91906140d5565b60085460ff1661267f576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036126bb576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156126f7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612732918491700100000000000000000000000000000000900416614d04565b111561276a576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b838110156129f95760008686838181106127af576127af614b8b565b90506020028101906127c19190614d17565b6127ca90614d55565b9050836127d681614c0f565b825180516020918201208185015160408087015190519499509194506000936128389386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89166000908152600690935291205490915081146128c1576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86166000908152600660205260408120556128e6600188614cda565b84036129555742600760189054906101000a900467ffffffffffffffff1684604001516129139190614dd3565b67ffffffffffffffff161115612955576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806129f190614c36565b915050612793565b50612a277f000000000000000000000000000000000000000000000000000000000000000084612297610820565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612b16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3a919061480a565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612bb6576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c479190614677565b905081811115612c83576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612cbf576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d0173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613bab565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d929190614677565b600780549192506801000000000000000090910467ffffffffffffffff16906008612dbc83614c0f565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612df3929190614df4565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612f03576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612f62565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612f599493929190614e04565b60405180910390a25b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612fba576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003612ff6576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115613032576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b8581101561346e57600089898381811061307b5761307b614b8b565b905060200281019061308d9190614e44565b61309690614e78565b8051805160209091012060608201519192509067ffffffffffffffff161561321957856130c281614c0f565b9650506000818360200151846060015160405160200161311a93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a166000908152600690935291205490915081146131a3576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff1610156131f9576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055613356565b6020820151158015906132e0575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af11580156132ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132de9190614677565b155b15613317576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015613356576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff161080613389575042826040015167ffffffffffffffff16115b156133c0576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061346690614c36565b91505061305f565b5060075467ffffffffffffffff68010000000000000000909104811690841611156134c5576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146135b457600061351c83866146bf565b905061353267ffffffffffffffff821683614cda565b915061356b7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16612297610820565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b613645337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123b9573d6000803e3d6000fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156136ad57600080fd5b505af11580156136c1573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af1158015613765573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613789919061480a565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161384f9190614eee565b600060405180830381855afa9150503d806000811461388a576040519150601f19603f3d011682016040523d82523d6000602084013e61388f565b606091505b5091509150816138d4576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250611a8c565b611a8c81613c0f565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161395f9190614eee565b600060405180830381855afa9150503d806000811461399a576040519150601f19603f3d011682016040523d82523d6000602084013e61399f565b606091505b5091509150816138d4576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250611a8c565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff861691613a659190614eee565b600060405180830381855afa9150503d8060008114613aa0576040519150601f19603f3d011682016040523d82523d6000602084013e613aa5565b606091505b5091509150818015613ab8575080516020145b613ac3576012611a8c565b80806020019051810190611a8c9190614f00565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610d289084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613dea565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052613c099085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613b29565b50505050565b60606040825110613c345781806020019051810190613c2e9190614f23565b92915050565b8151602003613dac5760005b602081108015613c875750828181518110613c5d57613c5d614b8b565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613c9e5780613c9681614c36565b915050613c40565b80600003613ce157505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115613cfc57613cfc61425b565b6040519080825280601f01601f191660200182016040528015613d26576020820181803683370190505b50905060005b82811015613da457848181518110613d4657613d46614b8b565b602001015160f81c60f81b828281518110613d6357613d63614b8b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080613d9c81614c36565b915050613d2c565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b6000613e4c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613ef69092919063ffffffff16565b805190915015610d285780806020019051810190613e6a9190614775565b610d28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611012565b6060611a8c8484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051613f2a9190614eee565b60006040518083038185875af1925050503d8060008114613f67576040519150601f19603f3d011682016040523d82523d6000602084013e613f6c565b606091505b5091509150613f7d87838387613f88565b979650505050505050565b6060831561401e5782516000036140175773ffffffffffffffffffffffffffffffffffffffff85163b614017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611012565b5081611a8c565b611a8c83838151156140335781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101291906140d5565b60005b8381101561408257818101518382015260200161406a565b50506000910152565b600081518084526140a3816020860160208601614067565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006140e8602083018461408b565b9392505050565b67ffffffffffffffff8116811461410557600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461410557600080fd5b8035613de581614108565b60008060006060848603121561414a57600080fd5b8335614155816140ef565b925060208401359150604084013561416c81614108565b809150509250925092565b60006020828403121561418957600080fd5b81356140e8816140ef565b60008083601f8401126141a657600080fd5b50813567ffffffffffffffff8111156141be57600080fd5b6020830191508360208260051b85010111156141d957600080fd5b9250929050565b6000806000604084860312156141f557600080fd5b833567ffffffffffffffff81111561420c57600080fd5b61421886828701614194565b909450925050602084013561416c81614108565b60006020828403121561423e57600080fd5b81356140e881614108565b63ffffffff8116811461410557600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516080810167ffffffffffffffff811182821017156142ad576142ad61425b565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156142fa576142fa61425b565b604052919050565b600067ffffffffffffffff82111561431c5761431c61425b565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261435957600080fd5b813561436c61436782614302565b6142b3565b81815284602083860101111561438157600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c087890312156143b757600080fd5b86356143c281614108565b955060208701356143d281614108565b945060408701356143e281614249565b935060608701356143f281614108565b9250608087013567ffffffffffffffff8082111561440f57600080fd5b61441b8a838b01614348565b935060a089013591508082111561443157600080fd5b5061443e89828a01614348565b9150509295509295509295565b6000806000806080858703121561446157600080fd5b843561446c81614249565b9350602085013561447c81614108565b9250604085013561448c81614249565b9150606085013567ffffffffffffffff8111156144a857600080fd5b6144b487828801614348565b91505092959194509250565b60008083601f8401126144d257600080fd5b50813567ffffffffffffffff8111156144ea57600080fd5b6020830191508360208285010111156141d957600080fd5b60008060008060006060868803121561451a57600080fd5b853567ffffffffffffffff8082111561453257600080fd5b818801915088601f83011261454657600080fd5b81358181111561455557600080fd5b8960208260071b850101111561456a57600080fd5b602083019750809650506145806020890161412a565b9450604088013591508082111561459657600080fd5b506145a3888289016144c0565b969995985093965092949392505050565b6000602082840312156145c657600080fd5b813567ffffffffffffffff8111156145dd57600080fd5b611a8c84828501614348565b600080602083850312156145fc57600080fd5b823567ffffffffffffffff81111561461357600080fd5b61461f85828601614194565b90969095509350505050565b60008060006040848603121561464057600080fd5b833567ffffffffffffffff81111561465757600080fd5b614663868287016144c0565b909790965060209590950135949350505050565b60006020828403121561468957600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8281168282160390808211156146e0576146e0614690565b5092915050565b60008261471d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061473657607f821691505b60208210810361476f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561478757600080fd5b815180151581146140e857600080fd5b6060815260006147aa606083018661408b565b82810360208401526147bc818661408b565b91505060ff83166040830152949350505050565b600080604083850312156147e357600080fd5b82516147ee81614249565b60208401519092506147ff81614108565b809150509250929050565b60006020828403121561481c57600080fd5b81516140e8816140ef565b601f821115610d2857600081815260208120601f850160051c8101602086101561484e5750805b601f850160051c820191505b8181101561486d5782815560010161485a565b505050505050565b815167ffffffffffffffff81111561488f5761488f61425b565b6148a38161489d8454614722565b84614827565b602080601f8311600181146148f657600084156148c05750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561486d565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561494357888601518255948401946001909101908401614924565b508582101561497f57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006149a2606083018661408b565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152614a2560c083018461408b565b98975050505050505050565b61ffff8181168382160190808211156146e0576146e0614690565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614ab5816003860160208c01614067565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614af8816017840160208b01614067565b808201915050818660f01b16601782015284519150614b1e826019830160208801614067565b016019019998505050505050505050565b60008651614b41818460208b01614067565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060808284031215614bcc57600080fd5b614bd461428a565b82358152602083013560208201526040830135614bf0816140ef565b60408201526060830135614c03816140ef565b60608201529392505050565b600067ffffffffffffffff808316818103614c2c57614c2c614690565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614c6757614c67614690565b5060010190565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201526000614cd1604083018486614c6e565b95945050505050565b81810381811115613c2e57613c2e614690565b8082028115828204841417613c2e57613c2e614690565b80820180821115613c2e57613c2e614690565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112614d4b57600080fd5b9190910192915050565b600060608236031215614d6757600080fd5b6040516060810167ffffffffffffffff8282108183111715614d8b57614d8b61425b565b816040528435915080821115614da057600080fd5b50614dad36828601614348565b825250602083013560208201526040830135614dc8816140ef565b604082015292915050565b67ffffffffffffffff8181168382160190808211156146e0576146e0614690565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000614e3a606083018486614c6e565b9695505050505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112614d4b57600080fd5b600060808236031215614e8a57600080fd5b614e9261428a565b823567ffffffffffffffff811115614ea957600080fd5b614eb536828601614348565b825250602083013560208201526040830135614ed0816140ef565b60408201526060830135614ee3816140ef565b606082015292915050565b60008251614d4b818460208701614067565b600060208284031215614f1257600080fd5b815160ff811681146140e857600080fd5b600060208284031215614f3557600080fd5b815167ffffffffffffffff811115614f4c57600080fd5b8201601f81018413614f5d57600080fd5b8051614f6b61436782614302565b818152856020838501011115614f8057600080fd5b614cd182602083016020860161406756fea26469706673582212200d9a80d90b20d904d67c14143f500a701874514e1fc69c24fccb9b73d8f2486e64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonRollupManager.json b/compiled-contracts/paris/PolygonRollupManager.json index 40b620b66..4b69d10c9 100644 --- a/compiled-contracts/paris/PolygonRollupManager.json +++ b/compiled-contracts/paris/PolygonRollupManager.json @@ -39,36 +39,16 @@ "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", @@ -89,16 +69,6 @@ "name": "FinalPendingStateNumInvalid", "type": "error" }, - { - "inputs": [], - "name": "ForceBatchNotAllowed", - "type": "error" - }, - { - "inputs": [], - "name": "ForceBatchesAlreadyActive", - "type": "error" - }, { "inputs": [], "name": "HaltTimeoutNotExpired", @@ -129,11 +99,6 @@ "name": "InvalidRangeBatchTimeTarget", "type": "error" }, - { - "inputs": [], - "name": "InvalidRangeForceBatchTimeout", - "type": "error" - }, { "inputs": [], "name": "InvalidRangeMultiplierBatchFee", @@ -154,11 +119,6 @@ "name": "NewPendingStateTimeoutMustBeLower", "type": "error" }, - { - "inputs": [], - "name": "NewSequencedBatchMustBeBigger", - "type": "error" - }, { "inputs": [], "name": "NewStateRootNotInsidePrime", @@ -169,11 +129,6 @@ "name": "NewTrustedAggregatorTimeoutMustBeLower", "type": "error" }, - { - "inputs": [], - "name": "NotSupportedCurrently", - "type": "error" - }, { "inputs": [], "name": "OldAccInputHashDoesNotExist", @@ -194,16 +149,6 @@ "name": "OnlyNotEmergencyState", "type": "error" }, - { - "inputs": [], - "name": "OnlyPendingGovernance", - "type": "error" - }, - { - "inputs": [], - "name": "OnlyTrustedAggregator", - "type": "error" - }, { "inputs": [], "name": "PendingStateDoesNotExist", @@ -219,11 +164,6 @@ "name": "PendingStateNotConsolidable", "type": "error" }, - { - "inputs": [], - "name": "PendingStateTimeoutExceedHaltAggregationTimeout", - "type": "error" - }, { "inputs": [], "name": "RollupMustExist", @@ -249,11 +189,6 @@ "name": "StoredRootMustBeDifferentThanNewRoot", "type": "error" }, - { - "inputs": [], - "name": "TrustedAggregatorTimeoutExceedHaltAggregationTimeout", - "type": "error" - }, { "inputs": [], "name": "TrustedAggregatorTimeoutNotExpired", @@ -269,26 +204,6 @@ "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": [ @@ -444,12 +359,6 @@ "internalType": "address", "name": "gasTokenAddress", "type": "address" - }, - { - "indexed": false, - "internalType": "uint32", - "name": "gasTokenNetwork", - "type": "uint32" } ], "name": "CreateNewRollup", @@ -1006,11 +915,6 @@ "name": "gasTokenAddress", "type": "address" }, - { - "internalType": "uint32", - "name": "gasTokenNetwork", - "type": "uint32" - }, { "internalType": "string", "name": "sequencerURL", @@ -2027,8 +1931,8 @@ "type": "function" } ], - "bytecode": "0x60e06040523480156200001157600080fd5b5060405162005c9a38038062005c9a83398101604081905262000034916200006b565b6001600160a01b0392831660805290821660c0521660a052620000bf565b6001600160a01b03811681146200006857600080fd5b50565b6000806000606084860312156200008157600080fd5b83516200008e8162000052565b6020850151909350620000a18162000052565b6040850151909250620000b48162000052565b809150509250925092565b60805160a05160c051615b73620001276000396000818161097601528181611b0d01526135030152600081816107250152818161265c01526137c00152600081816108b901528181610bcd01528181610d7d0152818161187401526136af0152615b736000f3fe60806040523480156200001157600080fd5b5060043610620002925760003560e01c8063066ec0121462000297578063080b311114620002c35780630a0d9fbe14620002eb57806311f6b287146200030657806312b86e19146200031d5780631489ed10146200033657806315064c96146200034d5780631608859c146200035b5780631796a1ae14620003725780631816b7e514620003995780632072f6c514620003b0578063248a9ca314620003ba5780632528016914620003e05780632f2ff15d146200049557806336568abe14620004ac578063394218e914620004c3578063477fa27014620004da5780634d4d333814620004e357806355a71ee014620004fa57806360469169146200053e57806365c0504d14620005485780637222020f14620005f75780637975fcfe146200060e5780637fb6e76a1462000634578063841b24d7146200065d57806387c20c0114620006785780638bd4f071146200068f57806391d1485414620006a657806399f5634e14620006bd5780639a908e7314620006c75780639c9f3dfe14620006de578063a066215c14620006f5578063a217fddf146200070c578063a2967d991462000715578063a3c573eb146200071f578063afd23cbe1462000756578063b99d0ad71462000780578063c1acbc341462000858578063c4c928c21462000873578063ceee281d146200088a578063d02103ca14620008b3578063d5073f6f14620008db578063d547741f14620008f2578063d939b3151462000909578063dbc16976146200091d578063dde0ff771462000927578063e0bfd3d21462000942578063e136edf71462000959578063e46761c41462000970578063f34eb8eb1462000998578063f4e9267514620009af578063f9c4c2ae14620009c0575b600080fd5b608454620002ab906001600160401b031681565b604051620002ba91906200443c565b60405180910390f35b620002da620002d43660046200447d565b62000ad7565b6040519015158152602001620002ba565b608554620002ab90600160401b90046001600160401b031681565b620002ab62000317366004620044b5565b62000b01565b620003346200032e366004620044e6565b62000b21565b005b620003346200034736600462004593565b62000cd1565b606f54620002da9060ff1681565b620003346200036c3660046200447d565b62000e61565b607e54620003839063ffffffff1681565b60405163ffffffff9091168152602001620002ba565b62000334620003aa3660046200461d565b62000ef6565b6200033462000fa2565b620003d1620003cb3660046200464a565b6200101c565b604051908152602001620002ba565b62000461620003f13660046200447d565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002ba565b62000334620004a636600462004664565b62001031565b62000334620004bd36600462004664565b62001053565b62000334620004d436600462004697565b6200108d565b608654620003d1565b62000334620004f4366004620046b5565b6200113c565b620003d16200050b3660046200447d565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620003d1620015cd565b620005ad62000559366004620044b5565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002ba565b6200033462000608366004620044b5565b620015e5565b620006256200061f3660046200476b565b620016d0565b604051620002ba919062004825565b620003836200064536600462004697565b60836020526000908152604090205463ffffffff1681565b608454620002ab90600160c01b90046001600160401b031681565b620003346200068936600462004593565b62001703565b62000334620006a0366004620044e6565b62001a27565b620002da620006b736600462004664565b62001add565b620003d162001b08565b620002ab620006d83660046200483a565b62001bf4565b62000334620006ef36600462004697565b62001dc1565b620003346200070636600462004697565b62001e64565b620003d1600081565b620003d162001f03565b620007477f000000000000000000000000000000000000000000000000000000000000000081565b604051620002ba919062004867565b6085546200076c90600160801b900461ffff1681565b60405161ffff9091168152602001620002ba565b62000816620007913660046200447d565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002ba919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002ab90600160801b90046001600160401b031681565b62000334620008843660046200487b565b620022c5565b620003836200089b36600462004913565b60826020526000908152604090205463ffffffff1681565b620007477f000000000000000000000000000000000000000000000000000000000000000081565b62000334620008ec3660046200464a565b62002592565b620003346200090336600462004664565b6200261d565b608554620002ab906001600160401b031681565b620003346200263f565b608454620002ab90600160401b90046001600160401b031681565b620003346200095336600462004945565b620026dc565b620003346200096a36600462004a6b565b62002764565b620007477f000000000000000000000000000000000000000000000000000000000000000081565b62000334620009a936600462004b4b565b62002bd8565b608054620003839063ffffffff1681565b62000a57620009d1366004620044b5565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002ba565b63ffffffff8216600090815260816020526040812062000af8908362002dc3565b90505b92915050565b63ffffffff8116600090815260816020526040812062000afb9062002e08565b60008051602062005b1e83398151915262000b3c8162002e79565b63ffffffff8916600090815260816020526040902062000b63818a8a8a8a8a8a8a62002e85565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000bcb576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000c0462001f03565b6040518263ffffffff1660e01b815260040162000c2391815260200190565b600060405180830381600087803b15801562000c3e57600080fd5b505af115801562000c53573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005b1e83398151915262000cec8162002e79565b63ffffffff8916600090815260816020526040902062000d13818a8a8a8a8a8a8a6200320d565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562000d7b576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000db462001f03565b6040518263ffffffff1660e01b815260040162000dd391815260200190565b600060405180830381600087803b15801562000dee57600080fd5b505af115801562000e03573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a60405162000e4d9392919062004be2565b60405180910390a350505050505050505050565b63ffffffff8216600090815260816020526040902062000e9160008051602062005b1e8339815191523362001add565b62000ee557606f5460ff161562000ebb57604051630bc011ff60e21b815260040160405180910390fd5b62000ec7818362002dc3565b62000ee557604051630674f25160e11b815260040160405180910390fd5b62000ef18183620035cc565b505050565b60008051602062005a9e83398151915262000f118162002e79565b6103e88261ffff16108062000f2b57506103ff8261ffff16115b1562000f4a57604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b62000fbd60008051602062005ade8339815191523362001add565b6200101057608454429062000fe79062093a8090600160801b90046001600160401b031662004c19565b6001600160401b03161115620010105760405163692baaad60e11b815260040160405180910390fd5b6200101a620037be565b565b60009081526034602052604090206001015490565b6200103c826200101c565b620010478162002e79565b62000ef183836200383d565b6001600160a01b03811633146200107d57604051630b4ad1cd60e31b815260040160405180910390fd5b620010898282620038a9565b5050565b60008051602062005a9e833981519152620010a88162002e79565b606f5460ff16620010ea576084546001600160401b03600160c01b909104811690831610620010ea5760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19062000f969084906200443c565b600054600290610100900460ff161580156200115f575060005460ff8083169116105b620011c85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200124962003913565b6200126460008051602062005b1e8339815191528a62003980565b6200127160008662003980565b6200128c60008051602062005a1e8339815191528662003980565b620012a760008051602062005a7e8339815191528662003980565b620012c2600080516020620059be8339815191528662003980565b620012dd600080516020620059fe8339815191528762003980565b620012f860008051602062005afe8339815191528762003980565b6200131360008051602062005a3e8339815191528762003980565b6200132e60008051602062005a9e8339815191528762003980565b6200135860008051602062005b1e8339815191526000805160206200599e8339815191526200398c565b620013736000805160206200599e8339815191528762003980565b6200138e600080516020620059de8339815191528762003980565b620013b860008051602062005ade83398151915260008051602062005abe8339815191526200398c565b620013d360008051602062005ade8339815191528562003980565b620013ee60008051602062005abe8339815191528562003980565b6000620014038484600561044d6000620039e1565b6073546074549192506001600160401b03600160401b909104811691168082146200144157604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b0381811660008181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620015429695831695600160581b909104909216936076936077939192919091169060040162004cef565b600060405180830381600087803b1580156200155d57600080fd5b505af115801562001572573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620015ba9050565b60405180910390a1505050505050505050565b60006086546064620015e0919062004d55565b905090565b600080516020620059fe833981519152620016008162002e79565b63ffffffff821615806200161f5750607e5463ffffffff908116908316115b156200163e57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200168557604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b63ffffffff86166000908152608160205260409020606090620016f890878787878762003c06565b979650505050505050565b606f5460ff16156200172857604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a8116865260038301909452919093206001015442926200177792600160c01b90048116911662004c19565b6001600160401b03161115620017a057604051638a0704d360e01b815260040160405180910390fd5b6103e8620017af888862004d6f565b6001600160401b03161115620017d857604051635acfba9d60e11b815260040160405180910390fd5b620017ea81898989898989896200320d565b620017f6818762003d41565b6085546001600160401b03166000036200190457600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001872576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620018ab62001f03565b6040518263ffffffff1660e01b8152600401620018ca91815260200190565b600060405180830381600087803b158015620018e557600080fd5b505af1158015620018fa573d6000803e3d6000fd5b50505050620019ce565b6200190f8162003f3e565b600681018054600160801b90046001600160401b0316906010620019338362004d92565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b488878960405162001a149392919062004be2565b60405180910390a3505050505050505050565b606f5460ff161562001a4c57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff8816600090815260816020526040902062001a73818989898989898962002e85565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a162001ad2620037be565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162001b59919062004867565b602060405180830381865afa15801562001b77573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001b9d919062004dc3565b60845490915060009062001bc4906001600160401b03600160401b82048116911662004d6f565b6001600160401b031690508060000362001be15760009250505090565b62001bed818362004df3565b9250505090565b606f5460009060ff161562001c1c57604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362001c54576040516371653c1560e01b815260040160405180910390fd5b836001600160401b031660000362001c7f57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81166000908152608160205260408120608480549192879262001cb29084906001600160401b031662004c19565b82546101009290920a6001600160401b038181021990931691831602179091556006830154169050600062001ce8878362004c19565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b03199092169290931691909117179055905062001d778362003f3e565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a258260405162001daf91906200443c565b60405180910390a29695505050505050565b60008051602062005a9e83398151915262001ddc8162002e79565b606f5460ff1662001e17576085546001600160401b039081169083161062001e175760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759062000f969084906200443c565b60008051602062005a9e83398151915262001e7f8162002e79565b62015180826001600160401b0316111562001ead57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289062000f969084906200443c565b60805460009063ffffffff1680820362001f1f57506000919050565b6000816001600160401b0381111562001f3c5762001f3c620049c1565b60405190808252806020026020018201604052801562001f66578160200160208202803683370190505b50905060005b8281101562001fd9576081600062001f8683600162004e0a565b63ffffffff1663ffffffff1681526020019081526020016000206005015482828151811062001fb95762001fb962004e20565b60209081029190910101528062001fd08162004e36565b91505062001f6c565b50600060205b836001146200221d57600062001ff760028662004e52565b6200200460028762004df3565b62002010919062004e0a565b90506000816001600160401b038111156200202f576200202f620049c1565b60405190808252806020026020018201604052801562002059578160200160208202803683370190505b50905060005b82811015620021d1576200207560018462004e69565b811480156200209057506200208c60028862004e52565b6001145b15620021105785620020a482600262004d55565b81518110620020b757620020b762004e20565b602002602001015185604051602001620020d392919062004e7f565b60405160208183030381529060405280519060200120828281518110620020fe57620020fe62004e20565b602002602001018181525050620021bc565b856200211e82600262004d55565b8151811062002131576200213162004e20565b60200260200101518682600262002149919062004d55565b6200215690600162004e0a565b8151811062002169576200216962004e20565b60200260200101516040516020016200218492919062004e7f565b60405160208183030381529060405280519060200120828281518110620021af57620021af62004e20565b6020026020010181815250505b80620021c88162004e36565b9150506200205f565b508094508195508384604051602001620021ed92919062004e7f565b6040516020818303038152906040528051906020012093508280620022129062004e8d565b935050505062001fdf565b60008360008151811062002235576200223562004e20565b6020026020010151905060005b82811015620022bb5781846040516020016200226092919062004e7f565b60405160208183030381529060405280519060200120915083846040516020016200228d92919062004e7f565b6040516020818303038152906040528051906020012093508080620022b29062004e36565b91505062002242565b5095945050505050565b600080516020620059be833981519152620022e08162002e79565b63ffffffff84161580620022ff5750607e5463ffffffff908116908516115b156200231e57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff16908190036200235f576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b031603620023ae57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff1615159003620023f557604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b90920416146200243357604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790556000620024b38462000b01565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef28692620025089216908b908b9060040162004ea7565b600060405180830381600087803b1580156200252357600080fd5b505af115801562002538573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b600080516020620059de833981519152620025ad8162002e79565b683635c9adc5dea00000821180620025c85750633b9aca0082105b15620025e757604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162000f96565b62002628826200101c565b620026338162002e79565b62000ef18383620038a9565b60008051602062005a3e8339815191526200265a8162002e79565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620026b657600080fd5b505af1158015620026cb573d6000803e3d6000fd5b50505050620026d962004009565b50565b60008051602062005a7e833981519152620026f78162002e79565b6001600160401b03841660009081526083602052604090205463ffffffff161562002735576040516337c8fe0960e11b815260040160405180910390fd5b6000620027468888888887620039e1565b60008080526002909101602052604090209390935550505050505050565b60008051602062005afe8339815191526200277f8162002e79565b63ffffffff891615806200279e5750607e5463ffffffff908116908a16115b15620027bd57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff89166000908152607f60205260409020600180820154600160e81b900460ff16151590036200280457604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03891660009081526083602052604090205463ffffffff161562002842576040516337c8fe0960e11b815260040160405180910390fd5b608080546000919082906200285d9063ffffffff1662004ee7565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b03909216913091620028ab906200442e565b620028b99392919062004f03565b604051809103906000f080158015620028d6573d6000803e3d6000fd5b50905081608360008d6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508b8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508c63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f9a84992ead4481f37097c7663e97ed883b31f216fae5685c6ee576a656483cd98e848f8d8d60405162002b5395949392919063ffffffff95861681526001600160a01b0394851660208201526001600160401b03939093166040840152921660608201529116608082015260a00190565b60405180910390a26040516308fd7e2160e31b81526001600160a01b038316906347ebf1089062002b95908e908e9088908f908f908f908f9060040162004f3a565b600060405180830381600087803b15801562002bb057600080fd5b505af115801562002bc5573d6000803e3d6000fd5b5050505050505050505050505050505050565b60008051602062005a1e83398151915262002bf38162002e79565b607e805460009190829062002c0e9063ffffffff1662004ee7565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002db19695949392919062004fa7565b60405180910390a25050505050505050565b6085546001600160401b0382811660009081526004850160205260408120549092429262002df692918116911662004c19565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b03161562002e5c575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b620026d9813362004062565b60078801546000906001600160401b03908116908716101562002ebb5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b0388161562002f5c5760068901546001600160401b03600160801b9091048116908916111562002f055760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b909204161462002f5557604051632bd2e3e760e01b815260040160405180910390fd5b5062002fd1565b506001600160401b03851660009081526002890160205260409020548062002f97576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b9091048116908716111562002fd157604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b909104811690881611806200300a5750876001600160401b0316876001600160401b031611155b806200302e575060068901546001600160401b03600160c01b909104811690881611155b156200304d5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b900481169086161462003094576040516332a2a77f60e01b815260040160405180910390fd5b6000620030a68a888888868962003c06565b9050600060008051602062005a5e833981519152600283604051620030cc919062005000565b602060405180830381855afa158015620030ea573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200310f919062004dc3565b6200311b919062004e52565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200315f918891906004016200501e565b602060405180830381865afa1580156200317d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620031a391906200505b565b620031c1576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620032005760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b6000806200321b8a62002e08565b60078b01549091506001600160401b039081169089161015620032515760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620032f45760068a01546001600160401b03600160801b9091048116908a1611156200329b5760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620032ed57604051632bd2e3e760e01b815260040160405180910390fd5b5062003364565b6001600160401b038816600090815260028b01602052604090205491508162003330576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200336457604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620033975760405163b9b18f5760e01b815260040160405180910390fd5b6000620033a98b8a8a8a878b62003c06565b9050600060008051602062005a5e833981519152600283604051620033cf919062005000565b602060405180830381855afa158015620033ed573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003412919062004dc3565b6200341e919062004e52565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003462918991906004016200501e565b602060405180830381865afa15801562003480573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620034a691906200505b565b620034c4576040516309bde33960e01b815260040160405180910390fd5b6000620034d2848b62004d6f565b90506200352b87826001600160401b0316620034ed62001b08565b620034f9919062004d55565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906200408c565b80608460088282829054906101000a90046001600160401b031662003551919062004c19565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d1539060640162002b95565b60068201546001600160401b03600160c01b90910481169082161115806200360b575060068201546001600160401b03600160801b9091048116908216115b156200362a5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620036e662001f03565b6040518263ffffffff1660e01b81526004016200370591815260200190565b600060405180830381600087803b1580156200372057600080fd5b505af115801562003735573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200381a57600080fd5b505af11580156200382f573d6000803e3d6000fd5b505050506200101a620040e0565b62003849828262001add565b620010895760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b620038b5828262001add565b15620010895760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600054610100900460ff166200101a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620011bf565b6200108982826200383d565b600062003999836200101c565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6080805460009182918290620039fd9063ffffffff1662004ee7565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000866001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508060826000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150868260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550858260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550838260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003bf494939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003c3c575081155b1562003c5b5760405163340c614f60e11b815260040160405180910390fd5b8062003c7a576040516366385b5160e01b815260040160405180910390fd5b62003c85846200413d565b62003ca3576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b600062003d4e8362002e08565b90508160008062003d60848462004d6f565b6085546001600160401b03918216925060009162003d8791600160401b9004164262004e69565b90505b846001600160401b0316846001600160401b03161462003e11576001600160401b0380851660009081526003890160205260409020600181015490911682101562003dec576001810154600160401b90046001600160401b0316945062003e0a565b62003df8868662004d6f565b6001600160401b031693505062003e11565b5062003d8a565b600062003e1f848462004e69565b90508381101562003e7d57808403600c811162003e3d578062003e40565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a608654028162003e725762003e7262004ddd565b046086555062003ef5565b838103600c811162003e90578062003e93565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162003ecd5762003ecd62004ddd565b04905080608654670de0b6b3a7640000028162003eee5762003eee62004ddd565b0460865550505b683635c9adc5dea00000608654111562003f1c57683635c9adc5dea0000060865562003f34565b633b9aca00608654101562003f3457633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b909204161115620026d957600681015460009062003f8990600160c01b90046001600160401b0316600162004c19565b905062003f97828262002dc3565b156200108957600682015460009060029062003fc5908490600160801b90046001600160401b031662004d6f565b62003fd191906200507f565b62003fdd908362004c19565b905062003feb838262002dc3565b1562003ffd5762000ef18382620035cc565b62000ef18383620035cc565b606f5460ff166200402d57604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6200406e828262001add565b6200108957604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905262000ef1908490620041c3565b606f5460ff16156200410557604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b03831610801562004174575067ffffffff00000001604083901c6001600160401b0316105b801562004195575067ffffffff00000001608083901c6001600160401b0316105b8015620041ad575067ffffffff0000000160c083901c105b15620041bb57506001919050565b506000919050565b60006200421a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200429c9092919063ffffffff16565b80519091501562000ef157808060200190518101906200423b91906200505b565b62000ef15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401620011bf565b6060620042ad8484600085620042b5565b949350505050565b606082471015620043185760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401620011bf565b600080866001600160a01b0316858760405162004336919062005000565b60006040518083038185875af1925050503d806000811462004375576040519150601f19603f3d011682016040523d82523d6000602084013e6200437a565b606091505b5091509150620016f88783838760608315620043fb578251600003620043f3576001600160a01b0385163b620043f35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620011bf565b5081620042ad565b620042ad8383815115620044125781518083602001fd5b8060405162461bcd60e51b8152600401620011bf919062004825565b6108f580620050a983390190565b6001600160401b0391909116815260200190565b803563ffffffff8116811462002e7457600080fd5b80356001600160401b038116811462002e7457600080fd5b600080604083850312156200449157600080fd5b6200449c8362004450565b9150620044ac6020840162004465565b90509250929050565b600060208284031215620044c857600080fd5b62000af88262004450565b80610300810183101562000afb57600080fd5b6000806000806000806000806103e0898b0312156200450457600080fd5b6200450f8962004450565b97506200451f60208a0162004465565b96506200452f60408a0162004465565b95506200453f60608a0162004465565b94506200454f60808a0162004465565b935060a0890135925060c089013591506200456e8a60e08b01620044d3565b90509295985092959890939650565b6001600160a01b0381168114620026d957600080fd5b6000806000806000806000806103e0898b031215620045b157600080fd5b620045bc8962004450565b9750620045cc60208a0162004465565b9650620045dc60408a0162004465565b9550620045ec60608a0162004465565b94506080890135935060a0890135925060c08901356200460c816200457d565b91506200456e8a60e08b01620044d3565b6000602082840312156200463057600080fd5b813561ffff811681146200464357600080fd5b9392505050565b6000602082840312156200465d57600080fd5b5035919050565b600080604083850312156200467857600080fd5b8235915060208301356200468c816200457d565b809150509250929050565b600060208284031215620046aa57600080fd5b62000af88262004465565b600080600080600080600080610100898b031215620046d357600080fd5b8835620046e0816200457d565b9750620046f060208a0162004465565b96506200470060408a0162004465565b9550606089013562004712816200457d565b9450608089013562004724816200457d565b935060a089013562004736816200457d565b925060c089013562004748816200457d565b915060e08901356200475a816200457d565b809150509295985092959890939650565b60008060008060008060c087890312156200478557600080fd5b620047908762004450565b9550620047a06020880162004465565b9450620047b06040880162004465565b9350606087013592506080870135915060a087013590509295509295509295565b60005b83811015620047ee578181015183820152602001620047d4565b50506000910152565b6000815180845262004811816020860160208601620047d1565b601f01601f19169290920160200192915050565b60208152600062000af86020830184620047f7565b600080604083850312156200484e57600080fd5b620048598362004465565b946020939093013593505050565b6001600160a01b0391909116815260200190565b600080600080606085870312156200489257600080fd5b84356200489f816200457d565b9350620048af6020860162004450565b925060408501356001600160401b0380821115620048cc57600080fd5b818701915087601f830112620048e157600080fd5b813581811115620048f157600080fd5b8860208285010111156200490457600080fd5b95989497505060200194505050565b6000602082840312156200492657600080fd5b813562004643816200457d565b803560ff8116811462002e7457600080fd5b60008060008060008060c087890312156200495f57600080fd5b86356200496c816200457d565b955060208701356200497e816200457d565b94506200498e6040880162004465565b93506200499e6060880162004465565b925060808701359150620049b560a0880162004933565b90509295509295509295565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620049e957600080fd5b81356001600160401b038082111562004a065762004a06620049c1565b604051601f8301601f19908116603f0116810190828211818310171562004a315762004a31620049c1565b8160405283815286602085880101111562004a4b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600080610100898b03121562004a8957600080fd5b62004a948962004450565b975062004aa460208a0162004465565b9650604089013562004ab6816200457d565b9550606089013562004ac8816200457d565b9450608089013562004ada816200457d565b935062004aea60a08a0162004450565b925060c08901356001600160401b038082111562004b0757600080fd5b62004b158c838d01620049d7565b935060e08b013591508082111562004b2c57600080fd5b5062004b3b8b828c01620049d7565b9150509295985092959890939650565b60008060008060008060c0878903121562004b6557600080fd5b863562004b72816200457d565b9550602087013562004b84816200457d565b945062004b946040880162004465565b935062004ba46060880162004933565b92506080870135915060a08701356001600160401b0381111562004bc757600080fd5b62004bd589828a01620049d7565b9150509295509295509295565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004c3c5762004c3c62004c03565b5092915050565b8054600090600181811c908083168062004c5e57607f831692505b6020808410820362004c8057634e487b7160e01b600052602260045260246000fd5b8388526020880182801562004c9e576001811462004cb55762004ce2565b60ff198716825285151560051b8201975062004ce2565b60008981526020902060005b8781101562004cdc5781548482015290860190840162004cc1565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c06040820181905260009062004d1d9083018762004c43565b828103606084015262004d31818762004c43565b608084019590955250506001600160401b039190911660a090910152949350505050565b808202811582820484141762000afb5762000afb62004c03565b6001600160401b0382811682821603908082111562004c3c5762004c3c62004c03565b60006001600160401b038281166002600160401b0319810162004db95762004db962004c03565b6001019392505050565b60006020828403121562004dd657600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b60008262004e055762004e0562004ddd565b500490565b8082018082111562000afb5762000afb62004c03565b634e487b7160e01b600052603260045260246000fd5b60006001820162004e4b5762004e4b62004c03565b5060010190565b60008262004e645762004e6462004ddd565b500690565b8181038181111562000afb5762000afb62004c03565b918252602082015260400190565b60008162004e9f5762004e9f62004c03565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b600063ffffffff80831681810362004db95762004db962004c03565b6001600160a01b0384811682528316602082015260606040820181905260009062004f3190830184620047f7565b95945050505050565b6001600160a01b038881168252878116602083015263ffffffff878116604084015290861660608301528416608082015260e060a0820181905260009062004f8590830185620047f7565b82810360c084015262004f998185620047f7565b9a9950505050505050505050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a0820181905260009062004ff490830184620047f7565b98975050505050505050565b6000825162005014818460208701620047d1565b9190910192915050565b61032081016103008085843782018360005b60018110156200505157815183526020928301929091019060010162005030565b5050509392505050565b6000602082840312156200506e57600080fd5b815180151581146200464357600080fd5b60006001600160401b03838116806200509c576200509c62004ddd565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220a19e7a72432195d9a35c7ce8fa5f1284415aac66bb1ad08a4c2e1c252fd8690864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000013dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220e590b2a38db493225a75f9b9c00741c324f43d46574bb7d4aa692081fd7493f164736f6c63430008140033", - "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620002925760003560e01c8063066ec0121462000297578063080b311114620002c35780630a0d9fbe14620002eb57806311f6b287146200030657806312b86e19146200031d5780631489ed10146200033657806315064c96146200034d5780631608859c146200035b5780631796a1ae14620003725780631816b7e514620003995780632072f6c514620003b0578063248a9ca314620003ba5780632528016914620003e05780632f2ff15d146200049557806336568abe14620004ac578063394218e914620004c3578063477fa27014620004da5780634d4d333814620004e357806355a71ee014620004fa57806360469169146200053e57806365c0504d14620005485780637222020f14620005f75780637975fcfe146200060e5780637fb6e76a1462000634578063841b24d7146200065d57806387c20c0114620006785780638bd4f071146200068f57806391d1485414620006a657806399f5634e14620006bd5780639a908e7314620006c75780639c9f3dfe14620006de578063a066215c14620006f5578063a217fddf146200070c578063a2967d991462000715578063a3c573eb146200071f578063afd23cbe1462000756578063b99d0ad71462000780578063c1acbc341462000858578063c4c928c21462000873578063ceee281d146200088a578063d02103ca14620008b3578063d5073f6f14620008db578063d547741f14620008f2578063d939b3151462000909578063dbc16976146200091d578063dde0ff771462000927578063e0bfd3d21462000942578063e136edf71462000959578063e46761c41462000970578063f34eb8eb1462000998578063f4e9267514620009af578063f9c4c2ae14620009c0575b600080fd5b608454620002ab906001600160401b031681565b604051620002ba91906200443c565b60405180910390f35b620002da620002d43660046200447d565b62000ad7565b6040519015158152602001620002ba565b608554620002ab90600160401b90046001600160401b031681565b620002ab62000317366004620044b5565b62000b01565b620003346200032e366004620044e6565b62000b21565b005b620003346200034736600462004593565b62000cd1565b606f54620002da9060ff1681565b620003346200036c3660046200447d565b62000e61565b607e54620003839063ffffffff1681565b60405163ffffffff9091168152602001620002ba565b62000334620003aa3660046200461d565b62000ef6565b6200033462000fa2565b620003d1620003cb3660046200464a565b6200101c565b604051908152602001620002ba565b62000461620003f13660046200447d565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002ba565b62000334620004a636600462004664565b62001031565b62000334620004bd36600462004664565b62001053565b62000334620004d436600462004697565b6200108d565b608654620003d1565b62000334620004f4366004620046b5565b6200113c565b620003d16200050b3660046200447d565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620003d1620015cd565b620005ad62000559366004620044b5565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002ba565b6200033462000608366004620044b5565b620015e5565b620006256200061f3660046200476b565b620016d0565b604051620002ba919062004825565b620003836200064536600462004697565b60836020526000908152604090205463ffffffff1681565b608454620002ab90600160c01b90046001600160401b031681565b620003346200068936600462004593565b62001703565b62000334620006a0366004620044e6565b62001a27565b620002da620006b736600462004664565b62001add565b620003d162001b08565b620002ab620006d83660046200483a565b62001bf4565b62000334620006ef36600462004697565b62001dc1565b620003346200070636600462004697565b62001e64565b620003d1600081565b620003d162001f03565b620007477f000000000000000000000000000000000000000000000000000000000000000081565b604051620002ba919062004867565b6085546200076c90600160801b900461ffff1681565b60405161ffff9091168152602001620002ba565b62000816620007913660046200447d565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002ba919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002ab90600160801b90046001600160401b031681565b62000334620008843660046200487b565b620022c5565b620003836200089b36600462004913565b60826020526000908152604090205463ffffffff1681565b620007477f000000000000000000000000000000000000000000000000000000000000000081565b62000334620008ec3660046200464a565b62002592565b620003346200090336600462004664565b6200261d565b608554620002ab906001600160401b031681565b620003346200263f565b608454620002ab90600160401b90046001600160401b031681565b620003346200095336600462004945565b620026dc565b620003346200096a36600462004a6b565b62002764565b620007477f000000000000000000000000000000000000000000000000000000000000000081565b62000334620009a936600462004b4b565b62002bd8565b608054620003839063ffffffff1681565b62000a57620009d1366004620044b5565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002ba565b63ffffffff8216600090815260816020526040812062000af8908362002dc3565b90505b92915050565b63ffffffff8116600090815260816020526040812062000afb9062002e08565b60008051602062005b1e83398151915262000b3c8162002e79565b63ffffffff8916600090815260816020526040902062000b63818a8a8a8a8a8a8a62002e85565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000bcb576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000c0462001f03565b6040518263ffffffff1660e01b815260040162000c2391815260200190565b600060405180830381600087803b15801562000c3e57600080fd5b505af115801562000c53573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005b1e83398151915262000cec8162002e79565b63ffffffff8916600090815260816020526040902062000d13818a8a8a8a8a8a8a6200320d565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562000d7b576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000db462001f03565b6040518263ffffffff1660e01b815260040162000dd391815260200190565b600060405180830381600087803b15801562000dee57600080fd5b505af115801562000e03573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a60405162000e4d9392919062004be2565b60405180910390a350505050505050505050565b63ffffffff8216600090815260816020526040902062000e9160008051602062005b1e8339815191523362001add565b62000ee557606f5460ff161562000ebb57604051630bc011ff60e21b815260040160405180910390fd5b62000ec7818362002dc3565b62000ee557604051630674f25160e11b815260040160405180910390fd5b62000ef18183620035cc565b505050565b60008051602062005a9e83398151915262000f118162002e79565b6103e88261ffff16108062000f2b57506103ff8261ffff16115b1562000f4a57604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b62000fbd60008051602062005ade8339815191523362001add565b6200101057608454429062000fe79062093a8090600160801b90046001600160401b031662004c19565b6001600160401b03161115620010105760405163692baaad60e11b815260040160405180910390fd5b6200101a620037be565b565b60009081526034602052604090206001015490565b6200103c826200101c565b620010478162002e79565b62000ef183836200383d565b6001600160a01b03811633146200107d57604051630b4ad1cd60e31b815260040160405180910390fd5b620010898282620038a9565b5050565b60008051602062005a9e833981519152620010a88162002e79565b606f5460ff16620010ea576084546001600160401b03600160c01b909104811690831610620010ea5760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19062000f969084906200443c565b600054600290610100900460ff161580156200115f575060005460ff8083169116105b620011c85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200124962003913565b6200126460008051602062005b1e8339815191528a62003980565b6200127160008662003980565b6200128c60008051602062005a1e8339815191528662003980565b620012a760008051602062005a7e8339815191528662003980565b620012c2600080516020620059be8339815191528662003980565b620012dd600080516020620059fe8339815191528762003980565b620012f860008051602062005afe8339815191528762003980565b6200131360008051602062005a3e8339815191528762003980565b6200132e60008051602062005a9e8339815191528762003980565b6200135860008051602062005b1e8339815191526000805160206200599e8339815191526200398c565b620013736000805160206200599e8339815191528762003980565b6200138e600080516020620059de8339815191528762003980565b620013b860008051602062005ade83398151915260008051602062005abe8339815191526200398c565b620013d360008051602062005ade8339815191528562003980565b620013ee60008051602062005abe8339815191528562003980565b6000620014038484600561044d6000620039e1565b6073546074549192506001600160401b03600160401b909104811691168082146200144157604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b0381811660008181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620015429695831695600160581b909104909216936076936077939192919091169060040162004cef565b600060405180830381600087803b1580156200155d57600080fd5b505af115801562001572573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620015ba9050565b60405180910390a1505050505050505050565b60006086546064620015e0919062004d55565b905090565b600080516020620059fe833981519152620016008162002e79565b63ffffffff821615806200161f5750607e5463ffffffff908116908316115b156200163e57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200168557604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b63ffffffff86166000908152608160205260409020606090620016f890878787878762003c06565b979650505050505050565b606f5460ff16156200172857604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a8116865260038301909452919093206001015442926200177792600160c01b90048116911662004c19565b6001600160401b03161115620017a057604051638a0704d360e01b815260040160405180910390fd5b6103e8620017af888862004d6f565b6001600160401b03161115620017d857604051635acfba9d60e11b815260040160405180910390fd5b620017ea81898989898989896200320d565b620017f6818762003d41565b6085546001600160401b03166000036200190457600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001872576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620018ab62001f03565b6040518263ffffffff1660e01b8152600401620018ca91815260200190565b600060405180830381600087803b158015620018e557600080fd5b505af1158015620018fa573d6000803e3d6000fd5b50505050620019ce565b6200190f8162003f3e565b600681018054600160801b90046001600160401b0316906010620019338362004d92565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b488878960405162001a149392919062004be2565b60405180910390a3505050505050505050565b606f5460ff161562001a4c57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff8816600090815260816020526040902062001a73818989898989898962002e85565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a162001ad2620037be565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162001b59919062004867565b602060405180830381865afa15801562001b77573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001b9d919062004dc3565b60845490915060009062001bc4906001600160401b03600160401b82048116911662004d6f565b6001600160401b031690508060000362001be15760009250505090565b62001bed818362004df3565b9250505090565b606f5460009060ff161562001c1c57604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362001c54576040516371653c1560e01b815260040160405180910390fd5b836001600160401b031660000362001c7f57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81166000908152608160205260408120608480549192879262001cb29084906001600160401b031662004c19565b82546101009290920a6001600160401b038181021990931691831602179091556006830154169050600062001ce8878362004c19565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b03199092169290931691909117179055905062001d778362003f3e565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a258260405162001daf91906200443c565b60405180910390a29695505050505050565b60008051602062005a9e83398151915262001ddc8162002e79565b606f5460ff1662001e17576085546001600160401b039081169083161062001e175760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759062000f969084906200443c565b60008051602062005a9e83398151915262001e7f8162002e79565b62015180826001600160401b0316111562001ead57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289062000f969084906200443c565b60805460009063ffffffff1680820362001f1f57506000919050565b6000816001600160401b0381111562001f3c5762001f3c620049c1565b60405190808252806020026020018201604052801562001f66578160200160208202803683370190505b50905060005b8281101562001fd9576081600062001f8683600162004e0a565b63ffffffff1663ffffffff1681526020019081526020016000206005015482828151811062001fb95762001fb962004e20565b60209081029190910101528062001fd08162004e36565b91505062001f6c565b50600060205b836001146200221d57600062001ff760028662004e52565b6200200460028762004df3565b62002010919062004e0a565b90506000816001600160401b038111156200202f576200202f620049c1565b60405190808252806020026020018201604052801562002059578160200160208202803683370190505b50905060005b82811015620021d1576200207560018462004e69565b811480156200209057506200208c60028862004e52565b6001145b15620021105785620020a482600262004d55565b81518110620020b757620020b762004e20565b602002602001015185604051602001620020d392919062004e7f565b60405160208183030381529060405280519060200120828281518110620020fe57620020fe62004e20565b602002602001018181525050620021bc565b856200211e82600262004d55565b8151811062002131576200213162004e20565b60200260200101518682600262002149919062004d55565b6200215690600162004e0a565b8151811062002169576200216962004e20565b60200260200101516040516020016200218492919062004e7f565b60405160208183030381529060405280519060200120828281518110620021af57620021af62004e20565b6020026020010181815250505b80620021c88162004e36565b9150506200205f565b508094508195508384604051602001620021ed92919062004e7f565b6040516020818303038152906040528051906020012093508280620022129062004e8d565b935050505062001fdf565b60008360008151811062002235576200223562004e20565b6020026020010151905060005b82811015620022bb5781846040516020016200226092919062004e7f565b60405160208183030381529060405280519060200120915083846040516020016200228d92919062004e7f565b6040516020818303038152906040528051906020012093508080620022b29062004e36565b91505062002242565b5095945050505050565b600080516020620059be833981519152620022e08162002e79565b63ffffffff84161580620022ff5750607e5463ffffffff908116908516115b156200231e57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff16908190036200235f576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b031603620023ae57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff1615159003620023f557604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b90920416146200243357604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790556000620024b38462000b01565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef28692620025089216908b908b9060040162004ea7565b600060405180830381600087803b1580156200252357600080fd5b505af115801562002538573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b600080516020620059de833981519152620025ad8162002e79565b683635c9adc5dea00000821180620025c85750633b9aca0082105b15620025e757604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162000f96565b62002628826200101c565b620026338162002e79565b62000ef18383620038a9565b60008051602062005a3e8339815191526200265a8162002e79565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620026b657600080fd5b505af1158015620026cb573d6000803e3d6000fd5b50505050620026d962004009565b50565b60008051602062005a7e833981519152620026f78162002e79565b6001600160401b03841660009081526083602052604090205463ffffffff161562002735576040516337c8fe0960e11b815260040160405180910390fd5b6000620027468888888887620039e1565b60008080526002909101602052604090209390935550505050505050565b60008051602062005afe8339815191526200277f8162002e79565b63ffffffff891615806200279e5750607e5463ffffffff908116908a16115b15620027bd57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff89166000908152607f60205260409020600180820154600160e81b900460ff16151590036200280457604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03891660009081526083602052604090205463ffffffff161562002842576040516337c8fe0960e11b815260040160405180910390fd5b608080546000919082906200285d9063ffffffff1662004ee7565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b03909216913091620028ab906200442e565b620028b99392919062004f03565b604051809103906000f080158015620028d6573d6000803e3d6000fd5b50905081608360008d6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508b8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508c63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f9a84992ead4481f37097c7663e97ed883b31f216fae5685c6ee576a656483cd98e848f8d8d60405162002b5395949392919063ffffffff95861681526001600160a01b0394851660208201526001600160401b03939093166040840152921660608201529116608082015260a00190565b60405180910390a26040516308fd7e2160e31b81526001600160a01b038316906347ebf1089062002b95908e908e9088908f908f908f908f9060040162004f3a565b600060405180830381600087803b15801562002bb057600080fd5b505af115801562002bc5573d6000803e3d6000fd5b5050505050505050505050505050505050565b60008051602062005a1e83398151915262002bf38162002e79565b607e805460009190829062002c0e9063ffffffff1662004ee7565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002db19695949392919062004fa7565b60405180910390a25050505050505050565b6085546001600160401b0382811660009081526004850160205260408120549092429262002df692918116911662004c19565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b03161562002e5c575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b620026d9813362004062565b60078801546000906001600160401b03908116908716101562002ebb5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b0388161562002f5c5760068901546001600160401b03600160801b9091048116908916111562002f055760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b909204161462002f5557604051632bd2e3e760e01b815260040160405180910390fd5b5062002fd1565b506001600160401b03851660009081526002890160205260409020548062002f97576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b9091048116908716111562002fd157604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b909104811690881611806200300a5750876001600160401b0316876001600160401b031611155b806200302e575060068901546001600160401b03600160c01b909104811690881611155b156200304d5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b900481169086161462003094576040516332a2a77f60e01b815260040160405180910390fd5b6000620030a68a888888868962003c06565b9050600060008051602062005a5e833981519152600283604051620030cc919062005000565b602060405180830381855afa158015620030ea573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200310f919062004dc3565b6200311b919062004e52565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200315f918891906004016200501e565b602060405180830381865afa1580156200317d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620031a391906200505b565b620031c1576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620032005760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b6000806200321b8a62002e08565b60078b01549091506001600160401b039081169089161015620032515760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620032f45760068a01546001600160401b03600160801b9091048116908a1611156200329b5760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620032ed57604051632bd2e3e760e01b815260040160405180910390fd5b5062003364565b6001600160401b038816600090815260028b01602052604090205491508162003330576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200336457604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620033975760405163b9b18f5760e01b815260040160405180910390fd5b6000620033a98b8a8a8a878b62003c06565b9050600060008051602062005a5e833981519152600283604051620033cf919062005000565b602060405180830381855afa158015620033ed573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003412919062004dc3565b6200341e919062004e52565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003462918991906004016200501e565b602060405180830381865afa15801562003480573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620034a691906200505b565b620034c4576040516309bde33960e01b815260040160405180910390fd5b6000620034d2848b62004d6f565b90506200352b87826001600160401b0316620034ed62001b08565b620034f9919062004d55565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906200408c565b80608460088282829054906101000a90046001600160401b031662003551919062004c19565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d1539060640162002b95565b60068201546001600160401b03600160c01b90910481169082161115806200360b575060068201546001600160401b03600160801b9091048116908216115b156200362a5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620036e662001f03565b6040518263ffffffff1660e01b81526004016200370591815260200190565b600060405180830381600087803b1580156200372057600080fd5b505af115801562003735573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200381a57600080fd5b505af11580156200382f573d6000803e3d6000fd5b505050506200101a620040e0565b62003849828262001add565b620010895760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b620038b5828262001add565b15620010895760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600054610100900460ff166200101a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620011bf565b6200108982826200383d565b600062003999836200101c565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6080805460009182918290620039fd9063ffffffff1662004ee7565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000866001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508060826000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150868260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550858260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550838260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003bf494939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003c3c575081155b1562003c5b5760405163340c614f60e11b815260040160405180910390fd5b8062003c7a576040516366385b5160e01b815260040160405180910390fd5b62003c85846200413d565b62003ca3576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b600062003d4e8362002e08565b90508160008062003d60848462004d6f565b6085546001600160401b03918216925060009162003d8791600160401b9004164262004e69565b90505b846001600160401b0316846001600160401b03161462003e11576001600160401b0380851660009081526003890160205260409020600181015490911682101562003dec576001810154600160401b90046001600160401b0316945062003e0a565b62003df8868662004d6f565b6001600160401b031693505062003e11565b5062003d8a565b600062003e1f848462004e69565b90508381101562003e7d57808403600c811162003e3d578062003e40565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a608654028162003e725762003e7262004ddd565b046086555062003ef5565b838103600c811162003e90578062003e93565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162003ecd5762003ecd62004ddd565b04905080608654670de0b6b3a7640000028162003eee5762003eee62004ddd565b0460865550505b683635c9adc5dea00000608654111562003f1c57683635c9adc5dea0000060865562003f34565b633b9aca00608654101562003f3457633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b909204161115620026d957600681015460009062003f8990600160c01b90046001600160401b0316600162004c19565b905062003f97828262002dc3565b156200108957600682015460009060029062003fc5908490600160801b90046001600160401b031662004d6f565b62003fd191906200507f565b62003fdd908362004c19565b905062003feb838262002dc3565b1562003ffd5762000ef18382620035cc565b62000ef18383620035cc565b606f5460ff166200402d57604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6200406e828262001add565b6200108957604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905262000ef1908490620041c3565b606f5460ff16156200410557604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b03831610801562004174575067ffffffff00000001604083901c6001600160401b0316105b801562004195575067ffffffff00000001608083901c6001600160401b0316105b8015620041ad575067ffffffff0000000160c083901c105b15620041bb57506001919050565b506000919050565b60006200421a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200429c9092919063ffffffff16565b80519091501562000ef157808060200190518101906200423b91906200505b565b62000ef15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401620011bf565b6060620042ad8484600085620042b5565b949350505050565b606082471015620043185760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401620011bf565b600080866001600160a01b0316858760405162004336919062005000565b60006040518083038185875af1925050503d806000811462004375576040519150601f19603f3d011682016040523d82523d6000602084013e6200437a565b606091505b5091509150620016f88783838760608315620043fb578251600003620043f3576001600160a01b0385163b620043f35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620011bf565b5081620042ad565b620042ad8383815115620044125781518083602001fd5b8060405162461bcd60e51b8152600401620011bf919062004825565b6108f580620050a983390190565b6001600160401b0391909116815260200190565b803563ffffffff8116811462002e7457600080fd5b80356001600160401b038116811462002e7457600080fd5b600080604083850312156200449157600080fd5b6200449c8362004450565b9150620044ac6020840162004465565b90509250929050565b600060208284031215620044c857600080fd5b62000af88262004450565b80610300810183101562000afb57600080fd5b6000806000806000806000806103e0898b0312156200450457600080fd5b6200450f8962004450565b97506200451f60208a0162004465565b96506200452f60408a0162004465565b95506200453f60608a0162004465565b94506200454f60808a0162004465565b935060a0890135925060c089013591506200456e8a60e08b01620044d3565b90509295985092959890939650565b6001600160a01b0381168114620026d957600080fd5b6000806000806000806000806103e0898b031215620045b157600080fd5b620045bc8962004450565b9750620045cc60208a0162004465565b9650620045dc60408a0162004465565b9550620045ec60608a0162004465565b94506080890135935060a0890135925060c08901356200460c816200457d565b91506200456e8a60e08b01620044d3565b6000602082840312156200463057600080fd5b813561ffff811681146200464357600080fd5b9392505050565b6000602082840312156200465d57600080fd5b5035919050565b600080604083850312156200467857600080fd5b8235915060208301356200468c816200457d565b809150509250929050565b600060208284031215620046aa57600080fd5b62000af88262004465565b600080600080600080600080610100898b031215620046d357600080fd5b8835620046e0816200457d565b9750620046f060208a0162004465565b96506200470060408a0162004465565b9550606089013562004712816200457d565b9450608089013562004724816200457d565b935060a089013562004736816200457d565b925060c089013562004748816200457d565b915060e08901356200475a816200457d565b809150509295985092959890939650565b60008060008060008060c087890312156200478557600080fd5b620047908762004450565b9550620047a06020880162004465565b9450620047b06040880162004465565b9350606087013592506080870135915060a087013590509295509295509295565b60005b83811015620047ee578181015183820152602001620047d4565b50506000910152565b6000815180845262004811816020860160208601620047d1565b601f01601f19169290920160200192915050565b60208152600062000af86020830184620047f7565b600080604083850312156200484e57600080fd5b620048598362004465565b946020939093013593505050565b6001600160a01b0391909116815260200190565b600080600080606085870312156200489257600080fd5b84356200489f816200457d565b9350620048af6020860162004450565b925060408501356001600160401b0380821115620048cc57600080fd5b818701915087601f830112620048e157600080fd5b813581811115620048f157600080fd5b8860208285010111156200490457600080fd5b95989497505060200194505050565b6000602082840312156200492657600080fd5b813562004643816200457d565b803560ff8116811462002e7457600080fd5b60008060008060008060c087890312156200495f57600080fd5b86356200496c816200457d565b955060208701356200497e816200457d565b94506200498e6040880162004465565b93506200499e6060880162004465565b925060808701359150620049b560a0880162004933565b90509295509295509295565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620049e957600080fd5b81356001600160401b038082111562004a065762004a06620049c1565b604051601f8301601f19908116603f0116810190828211818310171562004a315762004a31620049c1565b8160405283815286602085880101111562004a4b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600080610100898b03121562004a8957600080fd5b62004a948962004450565b975062004aa460208a0162004465565b9650604089013562004ab6816200457d565b9550606089013562004ac8816200457d565b9450608089013562004ada816200457d565b935062004aea60a08a0162004450565b925060c08901356001600160401b038082111562004b0757600080fd5b62004b158c838d01620049d7565b935060e08b013591508082111562004b2c57600080fd5b5062004b3b8b828c01620049d7565b9150509295985092959890939650565b60008060008060008060c0878903121562004b6557600080fd5b863562004b72816200457d565b9550602087013562004b84816200457d565b945062004b946040880162004465565b935062004ba46060880162004933565b92506080870135915060a08701356001600160401b0381111562004bc757600080fd5b62004bd589828a01620049d7565b9150509295509295509295565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004c3c5762004c3c62004c03565b5092915050565b8054600090600181811c908083168062004c5e57607f831692505b6020808410820362004c8057634e487b7160e01b600052602260045260246000fd5b8388526020880182801562004c9e576001811462004cb55762004ce2565b60ff198716825285151560051b8201975062004ce2565b60008981526020902060005b8781101562004cdc5781548482015290860190840162004cc1565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c06040820181905260009062004d1d9083018762004c43565b828103606084015262004d31818762004c43565b608084019590955250506001600160401b039190911660a090910152949350505050565b808202811582820484141762000afb5762000afb62004c03565b6001600160401b0382811682821603908082111562004c3c5762004c3c62004c03565b60006001600160401b038281166002600160401b0319810162004db95762004db962004c03565b6001019392505050565b60006020828403121562004dd657600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b60008262004e055762004e0562004ddd565b500490565b8082018082111562000afb5762000afb62004c03565b634e487b7160e01b600052603260045260246000fd5b60006001820162004e4b5762004e4b62004c03565b5060010190565b60008262004e645762004e6462004ddd565b500690565b8181038181111562000afb5762000afb62004c03565b918252602082015260400190565b60008162004e9f5762004e9f62004c03565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b600063ffffffff80831681810362004db95762004db962004c03565b6001600160a01b0384811682528316602082015260606040820181905260009062004f3190830184620047f7565b95945050505050565b6001600160a01b038881168252878116602083015263ffffffff878116604084015290861660608301528416608082015260e060a0820181905260009062004f8590830185620047f7565b82810360c084015262004f998185620047f7565b9a9950505050505050505050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a0820181905260009062004ff490830184620047f7565b98975050505050505050565b6000825162005014818460208701620047d1565b9190910192915050565b61032081016103008085843782018360005b60018110156200505157815183526020928301929091019060010162005030565b5050509392505050565b6000602082840312156200506e57600080fd5b815180151581146200464357600080fd5b60006001600160401b03838116806200509c576200509c62004ddd565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220a19e7a72432195d9a35c7ce8fa5f1284415aac66bb1ad08a4c2e1c252fd8690864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000013dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220e590b2a38db493225a75f9b9c00741c324f43d46574bb7d4aa692081fd7493f164736f6c63430008140033", + "bytecode": "0x60e06040523480156200001157600080fd5b5060405162005d7338038062005d7383398101604081905262000034916200006b565b6001600160a01b0392831660805290821660c0521660a052620000bf565b6001600160a01b03811681146200006857600080fd5b50565b6000806000606084860312156200008157600080fd5b83516200008e8162000052565b6020850151909350620000a18162000052565b6040850151909250620000b48162000052565b809150509250925092565b60805160a05160c051615c4c6200012760003960008181610a0f0152818161212801526137270152600081816107c701528181612cb00152613a2201526000818161096901528181610c6601528181610e1601528181611e6c01526139110152615c4c6000f3fe60806040523480156200001157600080fd5b5060043610620003095760003560e01c806387c20c01116200019d578063c4c928c211620000eb578063dbc16976116200009e578063dbc1697614620009cd578063dde0ff7714620009d7578063e0bfd3d214620009f2578063e46761c41462000a09578063f34eb8eb1462000a31578063f4e926751462000a48578063f9c4c2ae1462000a5957600080fd5b8063c4c928c21462000923578063ceee281d146200093a578063d02103ca1462000963578063d5073f6f146200098b578063d547741f14620009a2578063d939b31514620009b957600080fd5b8063a066215c1162000150578063a066215c1462000797578063a217fddf14620007ae578063a2967d9914620007b7578063a3c573eb14620007c1578063afd23cbe1462000802578063b99d0ad7146200082c578063c1acbc34146200090857600080fd5b806387c20c01146200071a5780638bd4f071146200073157806391d14854146200074857806399f5634e146200075f5780639a908e7314620007695780639c9f3dfe146200078057600080fd5b80632f2ff15d116200025b57806360469169116200020e5780636046916914620005c957806365c0504d14620005d35780637222020f1462000682578063727885e914620006995780637975fcfe14620006b05780637fb6e76a14620006d6578063841b24d714620006ff57600080fd5b80632f2ff15d146200052057806336568abe1462000537578063394218e9146200054e578063477fa27014620005655780634d4d3338146200056e57806355a71ee0146200058557600080fd5b806315064c9611620002c057806315064c9614620003c95780631608859c14620003d75780631796a1ae14620003ee5780631816b7e514620004155780632072f6c5146200042c578063248a9ca3146200043657806325280169146200046b57600080fd5b8063066ec012146200030e578063080b3111146200033f5780630a0d9fbe146200036757806311f6b287146200038257806312b86e1914620003995780631489ed1014620003b2575b600080fd5b60845462000322906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b6200035662000350366004620046c6565b62000b70565b604051901515815260200162000336565b6085546200032290600160401b90046001600160401b031681565b6200032262000393366004620046fe565b62000b9a565b620003b0620003aa3660046200472f565b62000bba565b005b620003b0620003c3366004620047dc565b62000d6a565b606f54620003569060ff1681565b620003b0620003e8366004620046c6565b62000f00565b607e54620003ff9063ffffffff1681565b60405163ffffffff909116815260200162000336565b620003b06200042636600462004866565b62000f95565b620003b062001041565b6200045c6200044736600462004893565b60009081526034602052604090206001015490565b60405190815260200162000336565b620004ec6200047c366004620046c6565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b0390811691830191909152928201519092169082015260600162000336565b620003b062000531366004620048ad565b620010d7565b620003b062000548366004620048ad565b62001100565b620003b06200055f366004620048e0565b6200113a565b6086546200045c565b620003b06200057f366004620048fe565b620011ee565b6200045c62000596366004620046c6565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b6200045c6200173b565b62000638620005e4366004620046fe565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c00162000336565b620003b062000693366004620046fe565b62001753565b620003b0620006aa36600462004a5e565b6200184f565b620006c7620006c136600462004b2b565b62001cc8565b60405162000336919062004be5565b620003ff620006e7366004620048e0565b60836020526000908152604090205463ffffffff1681565b6084546200032290600160c01b90046001600160401b031681565b620003b06200072b366004620047dc565b62001cfb565b620003b0620007423660046200472f565b62002025565b6200035662000759366004620048ad565b620020db565b6200045c62002106565b620003226200077a36600462004bfa565b620021ed565b620003b062000791366004620048e0565b620023bf565b620003b0620007a8366004620048e0565b62002465565b6200045c600081565b6200045c62002509565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200162000336565b6085546200081890600160801b900461ffff1681565b60405161ffff909116815260200162000336565b620008c26200083d366004620046c6565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b60405162000336919060006080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200032290600160801b90046001600160401b031681565b620003b06200093436600462004c27565b620028de565b620003ff6200094b36600462004cbf565b60826020526000908152604090205463ffffffff1681565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b620003b06200099c36600462004893565b62002bbd565b620003b0620009b3366004620048ad565b62002c59565b60855462000322906001600160401b031681565b620003b062002c82565b6084546200032290600160401b90046001600160401b031681565b620003b062000a0336600462004cf1565b62002d30565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b620003b062000a4236600462004d6d565b62002dc9565b608054620003ff9063ffffffff1681565b62000af062000a6a366004620046fe565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff166101608201526101800162000336565b63ffffffff8216600090815260816020526040812062000b91908362002fc5565b90505b92915050565b63ffffffff8116600090815260816020526040812062000b94906200300a565b60008051602062005bf783398151915262000bd5816200307b565b63ffffffff8916600090815260816020526040902062000bfc818a8a8a8a8a8a8a62003087565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000c64576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000c9d62002509565b6040518263ffffffff1660e01b815260040162000cbc91815260200190565b600060405180830381600087803b15801562000cd757600080fd5b505af115801562000cec573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005bf783398151915262000d85816200307b565b63ffffffff8916600090815260816020526040902062000dac818a8a8a8a8a8a8a62003420565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562000e14576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000e4d62002509565b6040518263ffffffff1660e01b815260040162000e6c91815260200190565b600060405180830381600087803b15801562000e8757600080fd5b505af115801562000e9c573d6000803e3d6000fd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff8216600090815260816020526040902062000f3060008051602062005bf783398151915233620020db565b62000f8457606f5460ff161562000f5a57604051630bc011ff60e21b815260040160405180910390fd5b62000f66818362002fc5565b62000f8457604051630674f25160e11b815260040160405180910390fd5b62000f9081836200382e565b505050565b60008051602062005bb783398151915262000fb0816200307b565b6103e88261ffff16108062000fca57506103ff8261ffff16115b1562000fe957604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200105c60008051602062005bd783398151915233620020db565b620010cb57608454600160801b90046001600160401b03161580620010ac57506084544290620010a19062093a8090600160801b90046001600160401b031662004e1a565b6001600160401b0316115b15620010cb5760405163692baaad60e11b815260040160405180910390fd5b620010d562003a20565b565b600082815260346020526040902060010154620010f4816200307b565b62000f90838362003a9f565b6001600160a01b03811633146200112a57604051630b4ad1cd60e31b815260040160405180910390fd5b62001136828262003b0b565b5050565b60008051602062005bb783398151915262001155816200307b565b606f5460ff1662001197576084546001600160401b03600160c01b909104811690831610620011975760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19060200162001035565b600054600290610100900460ff1615801562001211575060005460ff8083169116105b6200127a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b179055620012fb62003b75565b6200131660008051602062005bf78339815191528a62003be2565b6200132360008662003be2565b6200134f7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908662003be2565b6200137b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8662003be2565b620013a77f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8662003be2565b620013d37fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8762003be2565b620013ff7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088762003be2565b6200142b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48762003be2565b6200144660008051602062005bb78339815191528762003be2565b6200148160008051602062005bf78339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062003bee565b620014ad7f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08762003be2565b620014d97f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8762003be2565b6200151460008051602062005bd78339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162003bee565b6200152f60008051602062005bd78339815191528562003be2565b6200155b7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518562003be2565b6000620015708484600561044d600062003c39565b6073546074549192506001600160401b03600160401b90910481169116808214620015ae57604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b0381811660008181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620016b09695831695600160581b909104909216936076936077939192919091169060040162004ef0565b600060405180830381600087803b158015620016cb57600080fd5b505af1158015620016e0573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620017289050565b60405180910390a1505050505050505050565b600060865460646200174e919062004f55565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd6200177f816200307b565b63ffffffff821615806200179e5750607e5463ffffffff908116908316115b15620017bd57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200180457604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd086200187b816200307b565b63ffffffff881615806200189a5750607e5463ffffffff908116908916115b15620018b957604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff16151590036200190057604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff16156200193e576040516337c8fe0960e11b815260040160405180910390fd5b60808054600091908290620019599063ffffffff1662004f6f565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b03909216913091620019a7906200468b565b620019b59392919062004f95565b604051809103906000f080158015620019d2573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001c46949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001c86908d908d9088908e908e908e9060040162004fcc565b600060405180830381600087803b15801562001ca157600080fd5b505af115801562001cb6573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001cf090878787878762003e5e565b979650505050505050565b606f5460ff161562001d2057604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001d6f92600160c01b90048116911662004e1a565b6001600160401b0316111562001d9857604051638a0704d360e01b815260040160405180910390fd5b6103e862001da788886200502f565b6001600160401b0316111562001dd057604051635acfba9d60e11b815260040160405180910390fd5b62001de2818989898989898962003420565b62001dee818762003f9e565b6085546001600160401b031660000362001efc57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001e6a576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001ea362002509565b6040518263ffffffff1660e01b815260040162001ec291815260200190565b600060405180830381600087803b15801562001edd57600080fd5b505af115801562001ef2573d6000803e3d6000fd5b5050505062001fc6565b62001f07816200419b565b600681018054600160801b90046001600160401b031690601062001f2b8362005052565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff16156200204a57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff8816600090815260816020526040902062002071818989898989898962003087565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620020d062003a20565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b815230600482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562002170573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002196919062005071565b608454909150600090620021bd906001600160401b03600160401b8204811691166200502f565b6001600160401b0316905080600003620021da5760009250505090565b620021e68183620050a1565b9250505090565b606f5460009060ff16156200221557604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff16908190036200224d576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200227857604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620022ab9084906001600160401b031662004e1a565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620022e1878362004e1a565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b03199092169290931691909117179055905062002371836200419b565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b60008051602062005bb7833981519152620023da816200307b565b606f5460ff1662002415576085546001600160401b0390811690831610620024155760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759060200162001035565b60008051602062005bb783398151915262002480816200307b565b62015180826001600160401b03161115620024ae57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289060200162001035565b60805460009063ffffffff168082036200252557506000919050565b6000816001600160401b03811115620025425762002542620049b4565b6040519080825280602002602001820160405280156200256c578160200160208202803683370190505b50905060005b82811015620025df57608160006200258c836001620050b8565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620025bf57620025bf620050ce565b602090810291909101015280620025d681620050e4565b91505062002572565b50600060205b836001146200283b576000620025fd60028662005100565b6200260a600287620050a1565b620026169190620050b8565b90506000816001600160401b03811115620026355762002635620049b4565b6040519080825280602002602001820160405280156200265f578160200160208202803683370190505b50905060005b82811015620027e7576200267b60018462005117565b811480156200269657506200269260028862005100565b6001145b156200271e5785620026aa82600262004f55565b81518110620026bd57620026bd620050ce565b602002602001015185604051602001620026e1929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106200270c576200270c620050ce565b602002602001018181525050620027d2565b856200272c82600262004f55565b815181106200273f576200273f620050ce565b60200260200101518682600262002757919062004f55565b62002764906001620050b8565b81518110620027775762002777620050ce565b60200260200101516040516020016200279a929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620027c557620027c5620050ce565b6020026020010181815250505b80620027de81620050e4565b91505062002665565b5080945081955083846040516020016200280b929190918252602082015260400190565b604051602081830303815290604052805190602001209350828062002830906200512d565b9350505050620025e5565b600083600081518110620028535762002853620050ce565b6020026020010151905060005b82811015620028d457604080516020810184905290810185905260600160408051601f19818403018152828252805160209182012090830187905290820186905292506060016040516020818303038152906040528051906020012093508080620028cb90620050e4565b91505062002860565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac6200290a816200307b565b63ffffffff84161580620029295750607e5463ffffffff908116908516115b156200294857604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002989576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b031603620029d857604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002a1f57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002a5d57604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002add8462000b9a565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002b339216908b908b9060040162005147565b600060405180830381600087803b15801562002b4e57600080fd5b505af115801562002b63573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002be9816200307b565b683635c9adc5dea0000082118062002c045750633b9aca0082105b1562002c2357604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001035565b60008281526034602052604090206001015462002c76816200307b565b62000f90838362003b0b565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002cae816200307b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002d0a57600080fd5b505af115801562002d1f573d6000803e3d6000fd5b5050505062002d2d62004266565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62002d5c816200307b565b6001600160401b03841660009081526083602052604090205463ffffffff161562002d9a576040516337c8fe0960e11b815260040160405180910390fd5b600062002dab888888888762003c39565b60008080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002df5816200307b565b607e805460009190829062002e109063ffffffff1662004f6f565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002fb39695949392919062005187565b60405180910390a25050505050505050565b6085546001600160401b0382811660009081526004850160205260408120549092429262002ff892918116911662004e1a565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b0316156200305e575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002d2d8133620042bf565b60078801546000906001600160401b039081169087161015620030bd5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038816156200315e5760068901546001600160401b03600160801b90910481169089161115620031075760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200315757604051632bd2e3e760e01b815260040160405180910390fd5b50620031d3565b506001600160401b03851660009081526002890160205260409020548062003199576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620031d357604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b909104811690881611806200320c5750876001600160401b0316876001600160401b031611155b8062003230575060068901546001600160401b03600160c01b909104811690881611155b156200324f5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b900481169086161462003296576040516332a2a77f60e01b815260040160405180910390fd5b6000620032a88a888888868962003e5e565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620032df9190620051e0565b602060405180830381855afa158015620032fd573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003322919062005071565b6200332e919062005100565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200337291889190600401620051fe565b602060405180830381865afa15801562003390573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620033b691906200523b565b620033d4576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620034135760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b6000806200342e8a6200300a565b60078b01549091506001600160401b039081169089161015620034645760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620035075760068a01546001600160401b03600160801b9091048116908a161115620034ae5760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200350057604051632bd2e3e760e01b815260040160405180910390fd5b5062003577565b6001600160401b038816600090815260028b01602052604090205491508162003543576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200357757604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620035aa5760405163b9b18f5760e01b815260040160405180910390fd5b6000620035bc8b8a8a8a878b62003e5e565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620035f39190620051e0565b602060405180830381855afa15801562003611573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003636919062005071565b62003642919062005100565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200368691899190600401620051fe565b602060405180830381865afa158015620036a4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620036ca91906200523b565b620036e8576040516309bde33960e01b815260040160405180910390fd5b6000620036f6848b6200502f565b90506200374f87826001600160401b03166200371162002106565b6200371d919062004f55565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620042e9565b80608460088282829054906101000a90046001600160401b031662003775919062004e1a565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b1580156200380657600080fd5b505af11580156200381b573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b90910481169082161115806200386d575060068201546001600160401b03600160801b9091048116908216115b156200388c5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200394862002509565b6040518263ffffffff1660e01b81526004016200396791815260200190565b600060405180830381600087803b1580156200398257600080fd5b505af115801562003997573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003a7c57600080fd5b505af115801562003a91573d6000803e3d6000fd5b50505050620010d56200433d565b62003aab8282620020db565b620011365760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003b178282620020db565b15620011365760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600054610100900460ff16620010d55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162001271565b62001136828262003a9f565b600082815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080546000918291829062003c559063ffffffff1662004f6f565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000866001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508060826000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150868260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550858260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550838260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003e4c94939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003e94575081155b1562003eb35760405163340c614f60e11b815260040160405180910390fd5b8062003ed2576040516366385b5160e01b815260040160405180910390fd5b62003edd846200439a565b62003efb576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b600062003fab836200300a565b90508160008062003fbd84846200502f565b6085546001600160401b03918216925060009162003fe491600160401b9004164262005117565b90505b846001600160401b0316846001600160401b0316146200406e576001600160401b0380851660009081526003890160205260409020600181015490911682101562004049576001810154600160401b90046001600160401b0316945062004067565b6200405586866200502f565b6001600160401b03169350506200406e565b5062003fe7565b60006200407c848462005117565b905083811015620040da57808403600c81116200409a57806200409d565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620040cf57620040cf6200508b565b046086555062004152565b838103600c8111620040ed5780620040f0565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a764000002816200412a576200412a6200508b565b04905080608654670de0b6b3a764000002816200414b576200414b6200508b565b0460865550505b683635c9adc5dea0000060865411156200417957683635c9adc5dea0000060865562004191565b633b9aca0060865410156200419157633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002d2d576006810154600090620041e690600160c01b90046001600160401b0316600162004e1a565b9050620041f4828262002fc5565b156200113657600682015460009060029062004222908490600160801b90046001600160401b03166200502f565b6200422e91906200525f565b6200423a908362004e1a565b905062004248838262002fc5565b156200425a5762000f9083826200382e565b62000f9083836200382e565b606f5460ff166200428a57604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b620042cb8282620020db565b6200113657604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905262000f9090849062004420565b606f5460ff16156200436257604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b038316108015620043d1575067ffffffff00000001604083901c6001600160401b0316105b8015620043f2575067ffffffff00000001608083901c6001600160401b0316105b80156200440a575067ffffffff0000000160c083901c105b156200441857506001919050565b506000919050565b600062004477826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620044f99092919063ffffffff16565b80519091501562000f9057808060200190518101906200449891906200523b565b62000f905760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162001271565b60606200450a848460008562004512565b949350505050565b606082471015620045755760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162001271565b600080866001600160a01b03168587604051620045939190620051e0565b60006040518083038185875af1925050503d8060008114620045d2576040519150601f19603f3d011682016040523d82523d6000602084013e620045d7565b606091505b509150915062001cf087838387606083156200465857825160000362004650576001600160a01b0385163b620046505760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001271565b50816200450a565b6200450a83838151156200466f5781518083602001fd5b8060405162461bcd60e51b815260040162001271919062004be5565b61092e806200528983390190565b803563ffffffff811681146200307657600080fd5b80356001600160401b03811681146200307657600080fd5b60008060408385031215620046da57600080fd5b620046e58362004699565b9150620046f560208401620046ae565b90509250929050565b6000602082840312156200471157600080fd5b62000b918262004699565b80610300810183101562000b9457600080fd5b6000806000806000806000806103e0898b0312156200474d57600080fd5b620047588962004699565b97506200476860208a01620046ae565b96506200477860408a01620046ae565b95506200478860608a01620046ae565b94506200479860808a01620046ae565b935060a0890135925060c08901359150620047b78a60e08b016200471c565b90509295985092959890939650565b6001600160a01b038116811462002d2d57600080fd5b6000806000806000806000806103e0898b031215620047fa57600080fd5b620048058962004699565b97506200481560208a01620046ae565b96506200482560408a01620046ae565b95506200483560608a01620046ae565b94506080890135935060a0890135925060c08901356200485581620047c6565b9150620047b78a60e08b016200471c565b6000602082840312156200487957600080fd5b813561ffff811681146200488c57600080fd5b9392505050565b600060208284031215620048a657600080fd5b5035919050565b60008060408385031215620048c157600080fd5b823591506020830135620048d581620047c6565b809150509250929050565b600060208284031215620048f357600080fd5b62000b9182620046ae565b600080600080600080600080610100898b0312156200491c57600080fd5b88356200492981620047c6565b97506200493960208a01620046ae565b96506200494960408a01620046ae565b955060608901356200495b81620047c6565b945060808901356200496d81620047c6565b935060a08901356200497f81620047c6565b925060c08901356200499181620047c6565b915060e0890135620049a381620047c6565b809150509295985092959890939650565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620049dc57600080fd5b81356001600160401b0380821115620049f957620049f9620049b4565b604051601f8301601f19908116603f0116810190828211818310171562004a245762004a24620049b4565b8160405283815286602085880101111562004a3e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121562004a7a57600080fd5b62004a858862004699565b965062004a9560208901620046ae565b9550604088013562004aa781620047c6565b9450606088013562004ab981620047c6565b9350608088013562004acb81620047c6565b925060a08801356001600160401b038082111562004ae857600080fd5b62004af68b838c01620049ca565b935060c08a013591508082111562004b0d57600080fd5b5062004b1c8a828b01620049ca565b91505092959891949750929550565b60008060008060008060c0878903121562004b4557600080fd5b62004b508762004699565b955062004b6060208801620046ae565b945062004b7060408801620046ae565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004bae57818101518382015260200162004b94565b50506000910152565b6000815180845262004bd181602086016020860162004b91565b601f01601f19169290920160200192915050565b60208152600062000b91602083018462004bb7565b6000806040838503121562004c0e57600080fd5b62004c1983620046ae565b946020939093013593505050565b6000806000806060858703121562004c3e57600080fd5b843562004c4b81620047c6565b935062004c5b6020860162004699565b925060408501356001600160401b038082111562004c7857600080fd5b818701915087601f83011262004c8d57600080fd5b81358181111562004c9d57600080fd5b88602082850101111562004cb057600080fd5b95989497505060200194505050565b60006020828403121562004cd257600080fd5b81356200488c81620047c6565b803560ff811681146200307657600080fd5b60008060008060008060c0878903121562004d0b57600080fd5b863562004d1881620047c6565b9550602087013562004d2a81620047c6565b945062004d3a60408801620046ae565b935062004d4a60608801620046ae565b92506080870135915062004d6160a0880162004cdf565b90509295509295509295565b60008060008060008060c0878903121562004d8757600080fd5b863562004d9481620047c6565b9550602087013562004da681620047c6565b945062004db660408801620046ae565b935062004dc66060880162004cdf565b92506080870135915060a08701356001600160401b0381111562004de957600080fd5b62004df789828a01620049ca565b9150509295509295509295565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004e3d5762004e3d62004e04565b5092915050565b8054600090600181811c908083168062004e5f57607f831692505b6020808410820362004e8157634e487b7160e01b600052602260045260246000fd5b8388526020880182801562004e9f576001811462004eb65762004ee3565b60ff198716825285151560051b8201975062004ee3565b60008981526020902060005b8781101562004edd5781548482015290860190840162004ec2565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c06040820181905260009062004f1e9083018762004e44565b828103606084015262004f32818762004e44565b9150508360808301526001600160401b03831660a0830152979650505050505050565b808202811582820484141762000b945762000b9462004e04565b600063ffffffff80831681810362004f8b5762004f8b62004e04565b6001019392505050565b6001600160a01b0384811682528316602082015260606040820181905260009062004fc39083018462004bb7565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190526000906200500e9083018562004bb7565b82810360a084015262005022818562004bb7565b9998505050505050505050565b6001600160401b0382811682821603908082111562004e3d5762004e3d62004e04565b60006001600160401b0380831681810362004f8b5762004f8b62004e04565b6000602082840312156200508457600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082620050b357620050b36200508b565b500490565b8082018082111562000b945762000b9462004e04565b634e487b7160e01b600052603260045260246000fd5b600060018201620050f957620050f962004e04565b5060010190565b6000826200511257620051126200508b565b500690565b8181038181111562000b945762000b9462004e04565b6000816200513f576200513f62004e04565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a08201819052600090620051d49083018462004bb7565b98975050505050505050565b60008251620051f481846020870162004b91565b9190910192915050565b61032081016103008085843782018360005b60018110156200523157815183526020928301929091019060010162005210565b5050509392505050565b6000602082840312156200524e57600080fd5b815180151581146200488c57600080fd5b60006001600160401b03808416806200527c576200527c6200508b565b9216919091049291505056fe60a06040526040516200092e3803806200092e833981016040819052620000269162000383565b828162000034828262000060565b50506001600160a01b038216608052620000576200005160805190565b620000c6565b50505062000481565b6200006b8262000138565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115620000b857620000b38282620001b8565b505050565b620000c262000235565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620001086000805160206200090e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001358162000257565b50565b806001600160a01b03163b6000036200017457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b031684604051620001d7919062000463565b600060405180830381855af49150503d806000811462000214576040519150601f19603f3d011682016040523d82523d6000602084013e62000219565b606091505b5090925090506200022c8583836200029a565b95945050505050565b3415620002555760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166200028357604051633173bdd160e11b8152600060048201526024016200016b565b806000805160206200090e83398151915262000197565b606082620002b357620002ad8262000300565b620002f9565b8151158015620002cb57506001600160a01b0384163b155b15620002f657604051639996b31560e01b81526001600160a01b03851660048201526024016200016b565b50805b9392505050565b805115620003115780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b03811681146200034257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200037a57818101518382015260200162000360565b50506000910152565b6000806000606084860312156200039957600080fd5b620003a4846200032a565b9250620003b4602085016200032a565b60408501519092506001600160401b0380821115620003d257600080fd5b818601915086601f830112620003e757600080fd5b815181811115620003fc57620003fc62000347565b604051601f8201601f19908116603f0116810190838211818310171562000427576200042762000347565b816040528281528960208487010111156200044157600080fd5b620004548360208301602088016200035d565b80955050505050509250925092565b60008251620004778184602087016200035d565b9190910192915050565b6080516104726200049c6000396000601001526104726000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100e5565b60008061008e36600481846102fd565b81019061009b919061033d565b915091506100a98282610109565b5050565b60006100e07f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610104573d6000f35b3d6000fd5b61011282610164565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561015c5761015782826101e0565b505050565b6100a9610256565b806001600160a01b03163b60000361019f57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101fd919061040d565b600060405180830381855af49150503d8060008114610238576040519150601f19603f3d011682016040523d82523d6000602084013e61023d565b606091505b509150915061024d858383610275565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b60608261028a57610285826102d4565b6102cd565b81511580156102a157506001600160a01b0384163b155b156102ca57604051639996b31560e01b81526001600160a01b0385166004820152602401610196565b50805b9392505050565b8051156102e45780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6000808585111561030d57600080fd5b8386111561031a57600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035057600080fd5b82356001600160a01b038116811461036757600080fd5b9150602083013567ffffffffffffffff8082111561038457600080fd5b818501915085601f83011261039857600080fd5b8135818111156103aa576103aa610327565b604051601f8201601f19908116603f011681019083821181831017156103d2576103d2610327565b816040528281528860208487010111156103eb57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000825160005b8181101561042e5760208186018101518583015201610414565b50600092019182525091905056fea2646970667358221220d51c6fc430c553d1da2391464fd71dbfa43dc91a9531c4d842a3289bb581301664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220cfc55e650a90a9c7f2d1285a3990a984338b9c03e45202d25f457662a867b58c64736f6c63430008140033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620003095760003560e01c806387c20c01116200019d578063c4c928c211620000eb578063dbc16976116200009e578063dbc1697614620009cd578063dde0ff7714620009d7578063e0bfd3d214620009f2578063e46761c41462000a09578063f34eb8eb1462000a31578063f4e926751462000a48578063f9c4c2ae1462000a5957600080fd5b8063c4c928c21462000923578063ceee281d146200093a578063d02103ca1462000963578063d5073f6f146200098b578063d547741f14620009a2578063d939b31514620009b957600080fd5b8063a066215c1162000150578063a066215c1462000797578063a217fddf14620007ae578063a2967d9914620007b7578063a3c573eb14620007c1578063afd23cbe1462000802578063b99d0ad7146200082c578063c1acbc34146200090857600080fd5b806387c20c01146200071a5780638bd4f071146200073157806391d14854146200074857806399f5634e146200075f5780639a908e7314620007695780639c9f3dfe146200078057600080fd5b80632f2ff15d116200025b57806360469169116200020e5780636046916914620005c957806365c0504d14620005d35780637222020f1462000682578063727885e914620006995780637975fcfe14620006b05780637fb6e76a14620006d6578063841b24d714620006ff57600080fd5b80632f2ff15d146200052057806336568abe1462000537578063394218e9146200054e578063477fa27014620005655780634d4d3338146200056e57806355a71ee0146200058557600080fd5b806315064c9611620002c057806315064c9614620003c95780631608859c14620003d75780631796a1ae14620003ee5780631816b7e514620004155780632072f6c5146200042c578063248a9ca3146200043657806325280169146200046b57600080fd5b8063066ec012146200030e578063080b3111146200033f5780630a0d9fbe146200036757806311f6b287146200038257806312b86e1914620003995780631489ed1014620003b2575b600080fd5b60845462000322906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b6200035662000350366004620046c6565b62000b70565b604051901515815260200162000336565b6085546200032290600160401b90046001600160401b031681565b6200032262000393366004620046fe565b62000b9a565b620003b0620003aa3660046200472f565b62000bba565b005b620003b0620003c3366004620047dc565b62000d6a565b606f54620003569060ff1681565b620003b0620003e8366004620046c6565b62000f00565b607e54620003ff9063ffffffff1681565b60405163ffffffff909116815260200162000336565b620003b06200042636600462004866565b62000f95565b620003b062001041565b6200045c6200044736600462004893565b60009081526034602052604090206001015490565b60405190815260200162000336565b620004ec6200047c366004620046c6565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b0390811691830191909152928201519092169082015260600162000336565b620003b062000531366004620048ad565b620010d7565b620003b062000548366004620048ad565b62001100565b620003b06200055f366004620048e0565b6200113a565b6086546200045c565b620003b06200057f366004620048fe565b620011ee565b6200045c62000596366004620046c6565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b6200045c6200173b565b62000638620005e4366004620046fe565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c00162000336565b620003b062000693366004620046fe565b62001753565b620003b0620006aa36600462004a5e565b6200184f565b620006c7620006c136600462004b2b565b62001cc8565b60405162000336919062004be5565b620003ff620006e7366004620048e0565b60836020526000908152604090205463ffffffff1681565b6084546200032290600160c01b90046001600160401b031681565b620003b06200072b366004620047dc565b62001cfb565b620003b0620007423660046200472f565b62002025565b6200035662000759366004620048ad565b620020db565b6200045c62002106565b620003226200077a36600462004bfa565b620021ed565b620003b062000791366004620048e0565b620023bf565b620003b0620007a8366004620048e0565b62002465565b6200045c600081565b6200045c62002509565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200162000336565b6085546200081890600160801b900461ffff1681565b60405161ffff909116815260200162000336565b620008c26200083d366004620046c6565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b60405162000336919060006080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200032290600160801b90046001600160401b031681565b620003b06200093436600462004c27565b620028de565b620003ff6200094b36600462004cbf565b60826020526000908152604090205463ffffffff1681565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b620003b06200099c36600462004893565b62002bbd565b620003b0620009b3366004620048ad565b62002c59565b60855462000322906001600160401b031681565b620003b062002c82565b6084546200032290600160401b90046001600160401b031681565b620003b062000a0336600462004cf1565b62002d30565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b620003b062000a4236600462004d6d565b62002dc9565b608054620003ff9063ffffffff1681565b62000af062000a6a366004620046fe565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff166101608201526101800162000336565b63ffffffff8216600090815260816020526040812062000b91908362002fc5565b90505b92915050565b63ffffffff8116600090815260816020526040812062000b94906200300a565b60008051602062005bf783398151915262000bd5816200307b565b63ffffffff8916600090815260816020526040902062000bfc818a8a8a8a8a8a8a62003087565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000c64576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000c9d62002509565b6040518263ffffffff1660e01b815260040162000cbc91815260200190565b600060405180830381600087803b15801562000cd757600080fd5b505af115801562000cec573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005bf783398151915262000d85816200307b565b63ffffffff8916600090815260816020526040902062000dac818a8a8a8a8a8a8a62003420565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562000e14576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000e4d62002509565b6040518263ffffffff1660e01b815260040162000e6c91815260200190565b600060405180830381600087803b15801562000e8757600080fd5b505af115801562000e9c573d6000803e3d6000fd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff8216600090815260816020526040902062000f3060008051602062005bf783398151915233620020db565b62000f8457606f5460ff161562000f5a57604051630bc011ff60e21b815260040160405180910390fd5b62000f66818362002fc5565b62000f8457604051630674f25160e11b815260040160405180910390fd5b62000f9081836200382e565b505050565b60008051602062005bb783398151915262000fb0816200307b565b6103e88261ffff16108062000fca57506103ff8261ffff16115b1562000fe957604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200105c60008051602062005bd783398151915233620020db565b620010cb57608454600160801b90046001600160401b03161580620010ac57506084544290620010a19062093a8090600160801b90046001600160401b031662004e1a565b6001600160401b0316115b15620010cb5760405163692baaad60e11b815260040160405180910390fd5b620010d562003a20565b565b600082815260346020526040902060010154620010f4816200307b565b62000f90838362003a9f565b6001600160a01b03811633146200112a57604051630b4ad1cd60e31b815260040160405180910390fd5b62001136828262003b0b565b5050565b60008051602062005bb783398151915262001155816200307b565b606f5460ff1662001197576084546001600160401b03600160c01b909104811690831610620011975760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19060200162001035565b600054600290610100900460ff1615801562001211575060005460ff8083169116105b6200127a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b179055620012fb62003b75565b6200131660008051602062005bf78339815191528a62003be2565b6200132360008662003be2565b6200134f7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908662003be2565b6200137b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8662003be2565b620013a77f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8662003be2565b620013d37fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8762003be2565b620013ff7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088762003be2565b6200142b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48762003be2565b6200144660008051602062005bb78339815191528762003be2565b6200148160008051602062005bf78339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062003bee565b620014ad7f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08762003be2565b620014d97f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8762003be2565b6200151460008051602062005bd78339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162003bee565b6200152f60008051602062005bd78339815191528562003be2565b6200155b7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518562003be2565b6000620015708484600561044d600062003c39565b6073546074549192506001600160401b03600160401b90910481169116808214620015ae57604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b0381811660008181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620016b09695831695600160581b909104909216936076936077939192919091169060040162004ef0565b600060405180830381600087803b158015620016cb57600080fd5b505af1158015620016e0573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620017289050565b60405180910390a1505050505050505050565b600060865460646200174e919062004f55565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd6200177f816200307b565b63ffffffff821615806200179e5750607e5463ffffffff908116908316115b15620017bd57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200180457604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd086200187b816200307b565b63ffffffff881615806200189a5750607e5463ffffffff908116908916115b15620018b957604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff16151590036200190057604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff16156200193e576040516337c8fe0960e11b815260040160405180910390fd5b60808054600091908290620019599063ffffffff1662004f6f565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b03909216913091620019a7906200468b565b620019b59392919062004f95565b604051809103906000f080158015620019d2573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001c46949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001c86908d908d9088908e908e908e9060040162004fcc565b600060405180830381600087803b15801562001ca157600080fd5b505af115801562001cb6573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001cf090878787878762003e5e565b979650505050505050565b606f5460ff161562001d2057604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001d6f92600160c01b90048116911662004e1a565b6001600160401b0316111562001d9857604051638a0704d360e01b815260040160405180910390fd5b6103e862001da788886200502f565b6001600160401b0316111562001dd057604051635acfba9d60e11b815260040160405180910390fd5b62001de2818989898989898962003420565b62001dee818762003f9e565b6085546001600160401b031660000362001efc57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001e6a576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001ea362002509565b6040518263ffffffff1660e01b815260040162001ec291815260200190565b600060405180830381600087803b15801562001edd57600080fd5b505af115801562001ef2573d6000803e3d6000fd5b5050505062001fc6565b62001f07816200419b565b600681018054600160801b90046001600160401b031690601062001f2b8362005052565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff16156200204a57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff8816600090815260816020526040902062002071818989898989898962003087565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620020d062003a20565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b815230600482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562002170573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002196919062005071565b608454909150600090620021bd906001600160401b03600160401b8204811691166200502f565b6001600160401b0316905080600003620021da5760009250505090565b620021e68183620050a1565b9250505090565b606f5460009060ff16156200221557604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff16908190036200224d576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200227857604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620022ab9084906001600160401b031662004e1a565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620022e1878362004e1a565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b03199092169290931691909117179055905062002371836200419b565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b60008051602062005bb7833981519152620023da816200307b565b606f5460ff1662002415576085546001600160401b0390811690831610620024155760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759060200162001035565b60008051602062005bb783398151915262002480816200307b565b62015180826001600160401b03161115620024ae57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289060200162001035565b60805460009063ffffffff168082036200252557506000919050565b6000816001600160401b03811115620025425762002542620049b4565b6040519080825280602002602001820160405280156200256c578160200160208202803683370190505b50905060005b82811015620025df57608160006200258c836001620050b8565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620025bf57620025bf620050ce565b602090810291909101015280620025d681620050e4565b91505062002572565b50600060205b836001146200283b576000620025fd60028662005100565b6200260a600287620050a1565b620026169190620050b8565b90506000816001600160401b03811115620026355762002635620049b4565b6040519080825280602002602001820160405280156200265f578160200160208202803683370190505b50905060005b82811015620027e7576200267b60018462005117565b811480156200269657506200269260028862005100565b6001145b156200271e5785620026aa82600262004f55565b81518110620026bd57620026bd620050ce565b602002602001015185604051602001620026e1929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106200270c576200270c620050ce565b602002602001018181525050620027d2565b856200272c82600262004f55565b815181106200273f576200273f620050ce565b60200260200101518682600262002757919062004f55565b62002764906001620050b8565b81518110620027775762002777620050ce565b60200260200101516040516020016200279a929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620027c557620027c5620050ce565b6020026020010181815250505b80620027de81620050e4565b91505062002665565b5080945081955083846040516020016200280b929190918252602082015260400190565b604051602081830303815290604052805190602001209350828062002830906200512d565b9350505050620025e5565b600083600081518110620028535762002853620050ce565b6020026020010151905060005b82811015620028d457604080516020810184905290810185905260600160408051601f19818403018152828252805160209182012090830187905290820186905292506060016040516020818303038152906040528051906020012093508080620028cb90620050e4565b91505062002860565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac6200290a816200307b565b63ffffffff84161580620029295750607e5463ffffffff908116908516115b156200294857604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002989576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b031603620029d857604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002a1f57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002a5d57604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002add8462000b9a565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002b339216908b908b9060040162005147565b600060405180830381600087803b15801562002b4e57600080fd5b505af115801562002b63573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002be9816200307b565b683635c9adc5dea0000082118062002c045750633b9aca0082105b1562002c2357604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001035565b60008281526034602052604090206001015462002c76816200307b565b62000f90838362003b0b565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002cae816200307b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002d0a57600080fd5b505af115801562002d1f573d6000803e3d6000fd5b5050505062002d2d62004266565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62002d5c816200307b565b6001600160401b03841660009081526083602052604090205463ffffffff161562002d9a576040516337c8fe0960e11b815260040160405180910390fd5b600062002dab888888888762003c39565b60008080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002df5816200307b565b607e805460009190829062002e109063ffffffff1662004f6f565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002fb39695949392919062005187565b60405180910390a25050505050505050565b6085546001600160401b0382811660009081526004850160205260408120549092429262002ff892918116911662004e1a565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b0316156200305e575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002d2d8133620042bf565b60078801546000906001600160401b039081169087161015620030bd5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038816156200315e5760068901546001600160401b03600160801b90910481169089161115620031075760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200315757604051632bd2e3e760e01b815260040160405180910390fd5b50620031d3565b506001600160401b03851660009081526002890160205260409020548062003199576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620031d357604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b909104811690881611806200320c5750876001600160401b0316876001600160401b031611155b8062003230575060068901546001600160401b03600160c01b909104811690881611155b156200324f5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b900481169086161462003296576040516332a2a77f60e01b815260040160405180910390fd5b6000620032a88a888888868962003e5e565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620032df9190620051e0565b602060405180830381855afa158015620032fd573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003322919062005071565b6200332e919062005100565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200337291889190600401620051fe565b602060405180830381865afa15801562003390573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620033b691906200523b565b620033d4576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620034135760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b6000806200342e8a6200300a565b60078b01549091506001600160401b039081169089161015620034645760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620035075760068a01546001600160401b03600160801b9091048116908a161115620034ae5760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200350057604051632bd2e3e760e01b815260040160405180910390fd5b5062003577565b6001600160401b038816600090815260028b01602052604090205491508162003543576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200357757604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620035aa5760405163b9b18f5760e01b815260040160405180910390fd5b6000620035bc8b8a8a8a878b62003e5e565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620035f39190620051e0565b602060405180830381855afa15801562003611573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003636919062005071565b62003642919062005100565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200368691899190600401620051fe565b602060405180830381865afa158015620036a4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620036ca91906200523b565b620036e8576040516309bde33960e01b815260040160405180910390fd5b6000620036f6848b6200502f565b90506200374f87826001600160401b03166200371162002106565b6200371d919062004f55565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620042e9565b80608460088282829054906101000a90046001600160401b031662003775919062004e1a565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b1580156200380657600080fd5b505af11580156200381b573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b90910481169082161115806200386d575060068201546001600160401b03600160801b9091048116908216115b156200388c5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200394862002509565b6040518263ffffffff1660e01b81526004016200396791815260200190565b600060405180830381600087803b1580156200398257600080fd5b505af115801562003997573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003a7c57600080fd5b505af115801562003a91573d6000803e3d6000fd5b50505050620010d56200433d565b62003aab8282620020db565b620011365760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003b178282620020db565b15620011365760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600054610100900460ff16620010d55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162001271565b62001136828262003a9f565b600082815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080546000918291829062003c559063ffffffff1662004f6f565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000866001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508060826000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150868260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550858260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550838260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003e4c94939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003e94575081155b1562003eb35760405163340c614f60e11b815260040160405180910390fd5b8062003ed2576040516366385b5160e01b815260040160405180910390fd5b62003edd846200439a565b62003efb576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b600062003fab836200300a565b90508160008062003fbd84846200502f565b6085546001600160401b03918216925060009162003fe491600160401b9004164262005117565b90505b846001600160401b0316846001600160401b0316146200406e576001600160401b0380851660009081526003890160205260409020600181015490911682101562004049576001810154600160401b90046001600160401b0316945062004067565b6200405586866200502f565b6001600160401b03169350506200406e565b5062003fe7565b60006200407c848462005117565b905083811015620040da57808403600c81116200409a57806200409d565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620040cf57620040cf6200508b565b046086555062004152565b838103600c8111620040ed5780620040f0565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a764000002816200412a576200412a6200508b565b04905080608654670de0b6b3a764000002816200414b576200414b6200508b565b0460865550505b683635c9adc5dea0000060865411156200417957683635c9adc5dea0000060865562004191565b633b9aca0060865410156200419157633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002d2d576006810154600090620041e690600160c01b90046001600160401b0316600162004e1a565b9050620041f4828262002fc5565b156200113657600682015460009060029062004222908490600160801b90046001600160401b03166200502f565b6200422e91906200525f565b6200423a908362004e1a565b905062004248838262002fc5565b156200425a5762000f9083826200382e565b62000f9083836200382e565b606f5460ff166200428a57604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b620042cb8282620020db565b6200113657604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905262000f9090849062004420565b606f5460ff16156200436257604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b038316108015620043d1575067ffffffff00000001604083901c6001600160401b0316105b8015620043f2575067ffffffff00000001608083901c6001600160401b0316105b80156200440a575067ffffffff0000000160c083901c105b156200441857506001919050565b506000919050565b600062004477826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620044f99092919063ffffffff16565b80519091501562000f9057808060200190518101906200449891906200523b565b62000f905760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162001271565b60606200450a848460008562004512565b949350505050565b606082471015620045755760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162001271565b600080866001600160a01b03168587604051620045939190620051e0565b60006040518083038185875af1925050503d8060008114620045d2576040519150601f19603f3d011682016040523d82523d6000602084013e620045d7565b606091505b509150915062001cf087838387606083156200465857825160000362004650576001600160a01b0385163b620046505760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001271565b50816200450a565b6200450a83838151156200466f5781518083602001fd5b8060405162461bcd60e51b815260040162001271919062004be5565b61092e806200528983390190565b803563ffffffff811681146200307657600080fd5b80356001600160401b03811681146200307657600080fd5b60008060408385031215620046da57600080fd5b620046e58362004699565b9150620046f560208401620046ae565b90509250929050565b6000602082840312156200471157600080fd5b62000b918262004699565b80610300810183101562000b9457600080fd5b6000806000806000806000806103e0898b0312156200474d57600080fd5b620047588962004699565b97506200476860208a01620046ae565b96506200477860408a01620046ae565b95506200478860608a01620046ae565b94506200479860808a01620046ae565b935060a0890135925060c08901359150620047b78a60e08b016200471c565b90509295985092959890939650565b6001600160a01b038116811462002d2d57600080fd5b6000806000806000806000806103e0898b031215620047fa57600080fd5b620048058962004699565b97506200481560208a01620046ae565b96506200482560408a01620046ae565b95506200483560608a01620046ae565b94506080890135935060a0890135925060c08901356200485581620047c6565b9150620047b78a60e08b016200471c565b6000602082840312156200487957600080fd5b813561ffff811681146200488c57600080fd5b9392505050565b600060208284031215620048a657600080fd5b5035919050565b60008060408385031215620048c157600080fd5b823591506020830135620048d581620047c6565b809150509250929050565b600060208284031215620048f357600080fd5b62000b9182620046ae565b600080600080600080600080610100898b0312156200491c57600080fd5b88356200492981620047c6565b97506200493960208a01620046ae565b96506200494960408a01620046ae565b955060608901356200495b81620047c6565b945060808901356200496d81620047c6565b935060a08901356200497f81620047c6565b925060c08901356200499181620047c6565b915060e0890135620049a381620047c6565b809150509295985092959890939650565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620049dc57600080fd5b81356001600160401b0380821115620049f957620049f9620049b4565b604051601f8301601f19908116603f0116810190828211818310171562004a245762004a24620049b4565b8160405283815286602085880101111562004a3e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121562004a7a57600080fd5b62004a858862004699565b965062004a9560208901620046ae565b9550604088013562004aa781620047c6565b9450606088013562004ab981620047c6565b9350608088013562004acb81620047c6565b925060a08801356001600160401b038082111562004ae857600080fd5b62004af68b838c01620049ca565b935060c08a013591508082111562004b0d57600080fd5b5062004b1c8a828b01620049ca565b91505092959891949750929550565b60008060008060008060c0878903121562004b4557600080fd5b62004b508762004699565b955062004b6060208801620046ae565b945062004b7060408801620046ae565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004bae57818101518382015260200162004b94565b50506000910152565b6000815180845262004bd181602086016020860162004b91565b601f01601f19169290920160200192915050565b60208152600062000b91602083018462004bb7565b6000806040838503121562004c0e57600080fd5b62004c1983620046ae565b946020939093013593505050565b6000806000806060858703121562004c3e57600080fd5b843562004c4b81620047c6565b935062004c5b6020860162004699565b925060408501356001600160401b038082111562004c7857600080fd5b818701915087601f83011262004c8d57600080fd5b81358181111562004c9d57600080fd5b88602082850101111562004cb057600080fd5b95989497505060200194505050565b60006020828403121562004cd257600080fd5b81356200488c81620047c6565b803560ff811681146200307657600080fd5b60008060008060008060c0878903121562004d0b57600080fd5b863562004d1881620047c6565b9550602087013562004d2a81620047c6565b945062004d3a60408801620046ae565b935062004d4a60608801620046ae565b92506080870135915062004d6160a0880162004cdf565b90509295509295509295565b60008060008060008060c0878903121562004d8757600080fd5b863562004d9481620047c6565b9550602087013562004da681620047c6565b945062004db660408801620046ae565b935062004dc66060880162004cdf565b92506080870135915060a08701356001600160401b0381111562004de957600080fd5b62004df789828a01620049ca565b9150509295509295509295565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004e3d5762004e3d62004e04565b5092915050565b8054600090600181811c908083168062004e5f57607f831692505b6020808410820362004e8157634e487b7160e01b600052602260045260246000fd5b8388526020880182801562004e9f576001811462004eb65762004ee3565b60ff198716825285151560051b8201975062004ee3565b60008981526020902060005b8781101562004edd5781548482015290860190840162004ec2565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c06040820181905260009062004f1e9083018762004e44565b828103606084015262004f32818762004e44565b9150508360808301526001600160401b03831660a0830152979650505050505050565b808202811582820484141762000b945762000b9462004e04565b600063ffffffff80831681810362004f8b5762004f8b62004e04565b6001019392505050565b6001600160a01b0384811682528316602082015260606040820181905260009062004fc39083018462004bb7565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190526000906200500e9083018562004bb7565b82810360a084015262005022818562004bb7565b9998505050505050505050565b6001600160401b0382811682821603908082111562004e3d5762004e3d62004e04565b60006001600160401b0380831681810362004f8b5762004f8b62004e04565b6000602082840312156200508457600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082620050b357620050b36200508b565b500490565b8082018082111562000b945762000b9462004e04565b634e487b7160e01b600052603260045260246000fd5b600060018201620050f957620050f962004e04565b5060010190565b6000826200511257620051126200508b565b500690565b8181038181111562000b945762000b9462004e04565b6000816200513f576200513f62004e04565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a08201819052600090620051d49083018462004bb7565b98975050505050505050565b60008251620051f481846020870162004b91565b9190910192915050565b61032081016103008085843782018360005b60018110156200523157815183526020928301929091019060010162005210565b5050509392505050565b6000602082840312156200524e57600080fd5b815180151581146200488c57600080fd5b60006001600160401b03808416806200527c576200527c6200508b565b9216919091049291505056fe60a06040526040516200092e3803806200092e833981016040819052620000269162000383565b828162000034828262000060565b50506001600160a01b038216608052620000576200005160805190565b620000c6565b50505062000481565b6200006b8262000138565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115620000b857620000b38282620001b8565b505050565b620000c262000235565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620001086000805160206200090e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001358162000257565b50565b806001600160a01b03163b6000036200017457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b031684604051620001d7919062000463565b600060405180830381855af49150503d806000811462000214576040519150601f19603f3d011682016040523d82523d6000602084013e62000219565b606091505b5090925090506200022c8583836200029a565b95945050505050565b3415620002555760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166200028357604051633173bdd160e11b8152600060048201526024016200016b565b806000805160206200090e83398151915262000197565b606082620002b357620002ad8262000300565b620002f9565b8151158015620002cb57506001600160a01b0384163b155b15620002f657604051639996b31560e01b81526001600160a01b03851660048201526024016200016b565b50805b9392505050565b805115620003115780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b03811681146200034257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200037a57818101518382015260200162000360565b50506000910152565b6000806000606084860312156200039957600080fd5b620003a4846200032a565b9250620003b4602085016200032a565b60408501519092506001600160401b0380821115620003d257600080fd5b818601915086601f830112620003e757600080fd5b815181811115620003fc57620003fc62000347565b604051601f8201601f19908116603f0116810190838211818310171562000427576200042762000347565b816040528281528960208487010111156200044157600080fd5b620004548360208301602088016200035d565b80955050505050509250925092565b60008251620004778184602087016200035d565b9190910192915050565b6080516104726200049c6000396000601001526104726000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100e5565b60008061008e36600481846102fd565b81019061009b919061033d565b915091506100a98282610109565b5050565b60006100e07f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610104573d6000f35b3d6000fd5b61011282610164565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561015c5761015782826101e0565b505050565b6100a9610256565b806001600160a01b03163b60000361019f57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101fd919061040d565b600060405180830381855af49150503d8060008114610238576040519150601f19603f3d011682016040523d82523d6000602084013e61023d565b606091505b509150915061024d858383610275565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b60608261028a57610285826102d4565b6102cd565b81511580156102a157506001600160a01b0384163b155b156102ca57604051639996b31560e01b81526001600160a01b0385166004820152602401610196565b50805b9392505050565b8051156102e45780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6000808585111561030d57600080fd5b8386111561031a57600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035057600080fd5b82356001600160a01b038116811461036757600080fd5b9150602083013567ffffffffffffffff8082111561038457600080fd5b818501915085601f83011261039857600080fd5b8135818111156103aa576103aa610327565b604051601f8201601f19908116603f011681019083821181831017156103d2576103d2610327565b816040528281528860208487010111156103eb57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000825160005b8181101561042e5760208186018101518583015201610414565b50600092019182525091905056fea2646970667358221220d51c6fc430c553d1da2391464fd71dbfa43dc91a9531c4d842a3289bb581301664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220cfc55e650a90a9c7f2d1285a3990a984338b9c03e45202d25f457662a867b58c64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVM.json b/compiled-contracts/paris/PolygonZkEVM.json index 11e07d74d..98e418fb3 100644 --- a/compiled-contracts/paris/PolygonZkEVM.json +++ b/compiled-contracts/paris/PolygonZkEVM.json @@ -1711,8 +1711,8 @@ "type": "function" } ], - "bytecode": "0x6101406040523480156200001257600080fd5b50604051620048fa380380620048fa8339810160408190526200003591620000a5565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b0391821661010052166101205262000131565b6001600160a01b03811681146200008557600080fd5b50565b80516001600160401b0381168114620000a057600080fd5b919050565b60008060008060008060c08789031215620000bf57600080fd5b8651620000cc816200006f565b6020880151909650620000df816200006f565b6040880151909550620000f2816200006f565b606088015190945062000105816200006f565b9250620001156080880162000088565b91506200012560a0880162000088565b90509295509295509295565b60805160a05160c05160e05161010051610120516146fb620001ff6000396000818161055901528181610b2301526123e90152600081816106930152610af9015260008181610659015281816115b401528181612823015261376f0152600081816107cb01528181610c2101528181610d6f015281816112ee0152818161185101528181612974015261331801526000818161085401528181612e20015261316a0152600081816107420152818161158201528181611bee015281816129480152612ee701526146fb6000f3fe608060405234801561001057600080fd5b50600436106102da5760003560e01c8063841b24d711610184578063841b24d7146105e95780638c3d7301146106035780638da5cb5b1461060b57806399f5634e146106135780639aa972a31461061b5780639c9f3dfe1461062e578063a066215c14610641578063a3c573eb14610654578063ada8f9191461067b578063adc879e91461068e578063afd23cbe146106b5578063b4d63f58146106dd578063b6b0b0971461073d578063ba58ae3914610764578063c0ed84e014610777578063c754c7ed1461077f578063c89e42df14610799578063cfa8ed47146107ac578063d02103ca146107c6578063d2e129f9146107ed578063d8d1091b14610800578063d939b31514610813578063dbc169761461082d578063e7a7ed0214610835578063e8bf92ed1461084f578063eaeb077b14610876578063ed6b010414610889578063f14916d61461089d578063f2fde38b146108b0578063f851a440146108c3578063f8b823e4146108d657600080fd5b80630a0d9fbe146102df578063107bf28c1461030d57806315064c96146103225780631816b7e51461033f57806319d8ac6114610354578063220d789914610367578063267822471461037a578063298789831461039a5780632b0006fa146103b45780632c1f816a146103c7578063383b3be8146103da578063394218e9146103ed578063423fa85614610400578063456052671461041a578063458c0477146104345780634a1a89a7146104475780634a910e6a146104615780634e487706146104745780635392c5e014610487578063542028d5146104b55780635e9145c9146104bd5780635ec91958146104d057806360469169146104d8578063621dd411146104e05780636b8616ce146104f35780636ff512cc14610513578063715018a6146105265780637215541a1461052e5780637fcb365314610541578063831c7ead14610554578063837a47381461057b575b600080fd5b606f546102f79061010090046001600160401b031681565b6040516103049190613bb4565b60405180910390f35b6103156108df565b6040516103049190613c18565b606f5461032f9060ff1681565b6040519015158152602001610304565b61035261034d366004613c32565b61096d565b005b6073546102f7906001600160401b031681565b610315610375366004613c6d565b610a26565b607b5461038d906001600160a01b031681565b6040516103049190613cba565b60745461038d90600160401b90046001600160a01b031681565b6103526103c2366004613ce6565b610b81565b6103526103d5366004613d4e565b610cce565b61032f6103e8366004613dc8565b610e32565b6103526103fb366004613dc8565b610e79565b6073546102f790600160401b90046001600160401b031681565b6073546102f790600160801b90046001600160401b031681565b6079546102f7906001600160401b031681565b6079546102f790600160401b90046001600160401b031681565b61035261046f366004613dc8565b610f61565b610352610482366004613dc8565b610fd0565b6104a7610495366004613dc8565b60756020526000908152604090205481565b604051908152602001610304565b6103156110bc565b6103526104cb366004613e45565b6110c9565b610352611665565b6104a76116f2565b6103526104ee366004613ce6565b611708565b6104a7610501366004613dc8565b60716020526000908152604090205481565b610352610521366004613e98565b6119a8565b610352611a27565b61035261053c366004613dc8565b611a3b565b6074546102f7906001600160401b031681565b6102f77f000000000000000000000000000000000000000000000000000000000000000081565b6105be610589366004613eb3565b6078602052600090815260409020805460018201546002909201546001600160401b0380831693600160401b90930416919084565b604080516001600160401b039586168152949093166020850152918301526060820152608001610304565b6079546102f790600160c01b90046001600160401b031681565b610352611b56565b61038d611bda565b6104a7611be9565b610352610629366004613d4e565b611cf6565b61035261063c366004613dc8565b611d8d565b61035261064f366004613dc8565b611e79565b61038d7f000000000000000000000000000000000000000000000000000000000000000081565b610352610689366004613e98565b611f21565b6102f77f000000000000000000000000000000000000000000000000000000000000000081565b606f546106ca90600160481b900461ffff1681565b60405161ffff9091168152602001610304565b6107186106eb366004613dc8565b607260205260009081526040902080546001909101546001600160401b0380821691600160401b90041683565b604080519384526001600160401b039283166020850152911690820152606001610304565b61038d7f000000000000000000000000000000000000000000000000000000000000000081565b61032f610772366004613eb3565b611f97565b6102f761201e565b607b546102f790600160a01b90046001600160401b031681565b6103526107a7366004613f6e565b61206b565b606f5461038d90600160581b90046001600160a01b031681565b61038d7f000000000000000000000000000000000000000000000000000000000000000081565b6103526107fb366004613fe3565b6120d2565b61035261080e366004614095565b612470565b6079546102f790600160801b90046001600160401b031681565b6103526127f6565b6073546102f790600160c01b90046001600160401b031681565b61038d7f000000000000000000000000000000000000000000000000000000000000000081565b6103526108843660046140d6565b61289c565b607b5461032f90600160e01b900460ff1681565b6103526108ab366004613e98565b612b4a565b6103526108be366004613e98565b612bc9565b607a5461038d906001600160a01b031681565b6104a760705481565b607780546108ec90614121565b80601f016020809104026020016040519081016040528092919081815260200182805461091890614121565b80156109655780601f1061093a57610100808354040283529160200191610965565b820191906000526020600020905b81548152906001019060200180831161094857829003601f168201915b505050505081565b607a546001600160a01b0316331461099857604051634755657960e01b815260040160405180910390fd5b6103e88161ffff1610806109b157506103ff8161ffff16115b156109cf57604051630984a67960e31b815260040160405180910390fd5b606f805461ffff60481b1916600160481b61ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b6001600160401b038086166000818152607260205260408082205493881682529020546060929115801590610a59575081155b15610a775760405163340c614f60e11b815260040160405180910390fd5b80610a95576040516366385b5160e01b815260040160405180910390fd5b610a9e84611f97565b610abb576040516305dae44f60e21b815260040160405180910390fd5b604080516001600160601b03193360601b166020820152603481019690965260548601929092526001600160c01b031960c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b607454600160401b90046001600160a01b03163314610bb35760405163bbcbbc0560e01b815260040160405180910390fd5b610bc1868686868686612c3f565b607480546001600160401b0319166001600160401b0386811691821790925560009081526075602052604090208390556079541615610c0b57607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b158015610c6d57600080fd5b505af1158015610c81573d6000803e3d6000fd5b50506040518481523392506001600160401b03871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b607454600160401b90046001600160a01b03163314610d005760405163bbcbbc0560e01b815260040160405180910390fd5b610d0f87878787878787612f1a565b607480546001600160401b0319166001600160401b0386811691821790925560009081526075602052604090208390556079541615610d5957607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b158015610dbb57600080fd5b505af1158015610dcf573d6000803e3d6000fd5b5050607980546001600160c01b031661127560c71b179055505060405182815233906001600160401b038616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b6079546001600160401b0382811660009081526078602052604081205490924292610e6892600160801b90920481169116614171565b6001600160401b0316111592915050565b607a546001600160a01b03163314610ea457604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610ed157604051631d06e87960e01b815260040160405180910390fd5b606f5460ff16610f11576079546001600160401b03600160c01b909104811690821610610f115760405163401636df60e01b815260040160405180910390fd5b607980546001600160c01b0316600160c01b6001600160401b038416021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190610a1b908390613bb4565b607454600160401b90046001600160a01b03163314610fc457606f5460ff1615610f9e57604051630bc011ff60e21b815260040160405180910390fd5b610fa781610e32565b610fc457604051630674f25160e11b815260040160405180910390fd5b610fcd8161323a565b50565b607a546001600160a01b03163314610ffb57604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b03821611156110285760405163f5e37f2f60e01b815260040160405180910390fd5b606f5460ff1661106857607b546001600160401b03600160a01b9091048116908216106110685760405163f5e37f2f60e01b815260040160405180910390fd5b607b8054600160a01b600160e01b031916600160a01b6001600160401b038416021790556040517fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90610a1b908390613bb4565b607680546108ec90614121565b606f5460ff16156110ed57604051630bc011ff60e21b815260040160405180910390fd5b606f54600160581b90046001600160a01b0316331461111f576040516311e7be1560e01b815260040160405180910390fd5b8160008190036111425760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561116557604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160401b82048116600081815260726020526040812054838516949293600160801b909304909216919082905b8681101561144c5760008a8a838181106111ba576111ba614198565b90506020028101906111cc91906141ae565b6111d5906141ce565b805180516020909101206060820151919250906001600160401b0316156112c457856112008161425a565b9650506000818360200151846060015160405160200161122293929190614288565b60408051601f1981840301815291815281516020928301206001600160401b038a166000908152607190935291205490915081146112735760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b0380881660009081526071602052604080822091909155606085015190850151908216911610156112be57604051633fbd5c3960e11b815260040160405180910390fd5b506113a9565b602082015115801590611365575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303816000875af115801561133f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136391906142ab565b155b15611383576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c010156113a9576040516328a69b1f60e21b815260040160405180910390fd5b876001600160401b031682604001516001600160401b031610806113d957504282604001516001600160401b0316115b156113f7576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518d6040516020016114189594939291906142c4565b604051602081830303815290604052805190602001209450816040015197505050808061144490614303565b91505061119e565b506114578685614171565b6073549094506001600160401b03600160c01b909104811690841611156114915760405163c630a00d60e01b815260040160405180910390fd5b600061149d828561431c565b6114b0906001600160401b03168861433c565b60408051606081018252858152426001600160401b03908116602080840191825260738054600160401b9081900485168688019081528d861660008181526072909552979093209551865592516001909501805492519585166001600160801b03199384161795851684029590951790945583548c84169116179302929092179055909150828116908516146115655760738054600160801b600160c01b031916600160801b6001600160401b038716021790555b6115aa333083607054611578919061434f565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169291906133d2565b6115b2613443565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561160d57600080fd5b505af1158015611621573d6000803e3d6000fd5b50506040516001600160401b03881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a250505050505050505050565b607a546001600160a01b0316331461169057604051634755657960e01b815260040160405180910390fd5b607b54600160e01b900460ff166116ba5760405163f6ba91a160e01b815260040160405180910390fd5b607b805460ff60e01b191690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60006070546064611703919061434f565b905090565b606f5460ff161561172c57604051630bc011ff60e21b815260040160405180910390fd5b6079546001600160401b03858116600090815260726020526040902060010154429261176392600160c01b90910481169116614171565b6001600160401b0316111561178b57604051638a0704d360e01b815260040160405180910390fd5b6103e8611798868661431c565b6001600160401b031611156117c057604051635acfba9d60e11b815260040160405180910390fd5b6117ce868686868686612c3f565b6117d7846134e7565b607954600160801b90046001600160401b03166000036118ba57607480546001600160401b0319166001600160401b038681169182179092556000908152607560205260409020839055607954161561183b57607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b15801561189d57600080fd5b505af11580156118b1573d6000803e3d6000fd5b5050505061196b565b6118c2613443565b607980546001600160401b03169060006118db8361425a565b82546001600160401b039182166101009390930a928302928202191691909117909155604080516080810182524283168152878316602080830191825282840189815260608401898152607954871660009081526078909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b60405182815233906001600160401b038616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001610cbe565b607a546001600160a01b031633146119d357604051634755657960e01b815260040160405180910390fd5b606f8054600160581b600160f81b031916600160581b6001600160a01b038416021790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610a1b908390613cba565b611a2f6136bc565b611a39600061371b565b565b611a43611bda565b6001600160a01b0316336001600160a01b031614611b4e576000611a6561201e565b9050806001600160401b0316826001600160401b031611611a995760405163812a372d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b90910481169083161180611ad857506001600160401b0380831660009081526072602052604090206001015416155b15611af657604051632631700560e21b815260040160405180910390fd5b6001600160401b038083166000908152607260205260409020600101544291611b249162093a809116614171565b6001600160401b03161115611b4c5760405163692baaad60e11b815260040160405180910390fd5b505b610fcd61376d565b607b546001600160a01b03163314611b815760405163d1ec4b2360e01b815260040160405180910390fd5b607b54607a80546001600160a01b0319166001600160a01b0390921691821790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e91611bd091613cba565b60405180910390a1565b6033546001600160a01b031690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401611c389190613cba565b602060405180830381865afa158015611c55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7991906142ab565b90506000611c8561201e565b6073546001600160401b03600160401b8204811691611cb591600160801b8204811691600160c01b90041661431c565b611cbf9190614171565b611cc9919061431c565b6001600160401b0316905080600003611ce55760009250505090565b611cef818361437c565b9250505090565b606f5460ff1615611d1a57604051630bc011ff60e21b815260040160405180910390fd5b611d2987878787878787612f1a565b6001600160401b0384166000908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1611d8461376d565b50505050505050565b607a546001600160a01b03163314611db857604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115611de557604051630cc9650760e41b815260040160405180910390fd5b606f5460ff16611e25576079546001600160401b03600160801b909104811690821610611e255760405163048a05a960e41b815260040160405180910390fd5b60798054600160801b600160c01b031916600160801b6001600160401b038416021790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590610a1b908390613bb4565b607a546001600160a01b03163314611ea457604051634755657960e01b815260040160405180910390fd5b62015180816001600160401b03161115611ed157604051631c0cfbfd60e31b815260040160405180910390fd5b606f8054610100600160481b0319166101006001600160401b038416021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890610a1b908390613bb4565b607a546001600160a01b03163314611f4c57604051634755657960e01b815260040160405180910390fd5b607b80546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610a1b908390613cba565b600067ffffffff000000016001600160401b038316108015611fcd575067ffffffff00000001604083901c6001600160401b0316105b8015611fed575067ffffffff00000001608083901c6001600160401b0316105b8015612004575067ffffffff0000000160c083901c105b1561201157506001919050565b506000919050565b919050565b6079546000906001600160401b03161561205b57506079546001600160401b03908116600090815260786020526040902054600160401b90041690565b506074546001600160401b031690565b607a546001600160a01b0316331461209657604051634755657960e01b815260040160405180910390fd5b60766120a282826143de565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610a1b9190613c18565b600054610100900460ff16158080156120f25750600054600160ff909116105b806121135750612101306137e8565b158015612113575060005460ff166001145b61217b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801561219e576000805461ff0019166101001790555b6121ab6020880188613e98565b607a80546001600160a01b0319166001600160a01b03929092169190911790556121db6040880160208901613e98565b606f80546001600160a01b0392909216600160581b02600160581b600160f81b03199092169190911790556122166080880160608901613e98565b607480546001600160a01b0392909216600160401b02600160401b600160e01b03199092169190911790556000805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad869055607661227a86826143de565b50607761228785826143de565b5062093a8061229c6060890160408a01613dc8565b6001600160401b031611156122c457604051630cc9650760e41b815260040160405180910390fd5b6122d46060880160408901613dc8565b607980546001600160401b0392909216600160801b02600160801b600160c01b031990921691909117905562093a8061231360a0890160808a01613dc8565b6001600160401b0316111561233b57604051631d06e87960e01b815260040160405180910390fd5b61234b60a0880160808901613dc8565b607980546001600160c01b0316600160c01b6001600160401b03939093169290920291909117905567016345785d8a0000607055606f8054610100600160581b031916620708006101f560491b01179055607b8054600160a01b600160e81b031916670200000000000d2f60a71b1790556123c46137f7565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd660007f0000000000000000000000000000000000000000000000000000000000000000858560405161241a94939291906144c6565b60405180910390a18015611d84576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b54600160e01b900460ff161561249b576040516324eff8c360e01b815260040160405180910390fd5b606f5460ff16156124bf57604051630bc011ff60e21b815260040160405180910390fd5b8060008190036124e25760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561250557604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160c01b820481169161252d918491600160801b9004166144fd565b111561254c5760405163c630a00d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b820481166000818152607260205260408120549193600160801b9004909216915b8481101561270057600087878381811061259957612599614198565b90506020028101906125ab9190614510565b6125b490614526565b9050836125c08161425a565b825180516020918201208185015160408087015190519499509194506000936125ec9386939101614288565b60408051601f1981840301815291815281516020928301206001600160401b03891660009081526071909352912054909150811461263d5760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b03861660009081526071602052604081205561266160018961433c565b84036126b55742607b60149054906101000a90046001600160401b0316846040015161268d9190614171565b6001600160401b031611156126b55760405163c44a082160e01b815260040160405180910390fd5b8482846020015142336040516020016126d29594939291906142c4565b60405160208183030381529060405280519060200120945050505080806126f890614303565b91505061257d565b5061270b8484614171565b607380546001600160401b034281166001600160401b03199092168217808455604080516060810182528781526020808201958652600160401b9384900485168284019081528589166000818152607290935284832093518455965160019390930180549151871686026001600160801b031990921693871693909317179091558554938916600160801b02600160801b600160c01b031993860293909316600160401b600160c01b031990941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a546001600160a01b0316331461282157604051634755657960e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561287c57600080fd5b505af1158015612890573d6000803e3d6000fd5b50505050611a3961386b565b607b54600160e01b900460ff16156128c7576040516324eff8c360e01b815260040160405180910390fd5b606f5460ff16156128eb57604051630bc011ff60e21b815260040160405180910390fd5b60006128f56116f2565b90508181111561291857604051634732fdb560e01b815260040160405180910390fd5b61138883111561293b576040516328a69b1f60e21b815260040160405180910390fd5b6129706001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163330846133d2565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129f491906142ab565b60738054919250600160c01b9091046001600160401b0316906018612a188361425a565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508484604051612a4d9291906145a1565b604051908190038120612a669183904290602001614288565b60408051808303601f190181529181528151602092830120607354600160c01b90046001600160401b031660009081526071909352912055323303612af857607354604080518381523360208201526060918101829052600091810191909152600160c01b9091046001600160401b0316906000805160206146a68339815191529060800160405180910390a2612b43565b607360189054906101000a90046001600160401b03166001600160401b03166000805160206146a683398151915282338888604051612b3a94939291906145b1565b60405180910390a25b5050505050565b607a546001600160a01b03163314612b7557604051634755657960e01b815260040160405180910390fd5b60748054600160401b600160e01b031916600160401b6001600160a01b038416021790556040517f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90610a1b908390613cba565b612bd16136bc565b6001600160a01b038116612c365760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401612172565b610fcd8161371b565b600080612c4a61201e565b90506001600160401b03881615612ce0576079546001600160401b039081169089161115612c8b5760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b038089166000908152607860205260409020600281015481549094509091898116600160401b9092041614612cda57604051632bd2e3e760e01b815260040160405180910390fd5b50612d4c565b6001600160401b038716600090815260756020526040902054915081612d19576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316876001600160401b03161115612d4c57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316866001600160401b031611612d7e5760405163b9b18f5760e01b815260040160405180910390fd5b6000612d8d8888888689610a26565b90506000600080516020614686833981519152600283604051612db091906145dc565b602060405180830381855afa158015612dcd573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190612df091906142ab565b612dfa91906145ee565b604080516020810182528281529051634890ed4560e11b81529192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91612e5691899190600401614602565b602060405180830381865afa158015612e73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e97919061463d565b612eb4576040516309bde33960e01b815260040160405180910390fd5b612f0e33612ec2858b61431c565b6001600160401b0316612ed3611be9565b612edd919061434f565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906138c3565b50505050505050505050565b60006001600160401b03881615612fae576079546001600160401b039081169089161115612f5b5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088166000908152607860205260409020600281015481549092888116600160401b9092041614612fa857604051632bd2e3e760e01b815260040160405180910390fd5b50613016565b506001600160401b03851660009081526075602052604090205480612fe6576040516324cbdcc360e11b815260040160405180910390fd5b6074546001600160401b03908116908716111561301657604051630f2b74f160e11b815260040160405180910390fd5b6079546001600160401b0390811690881611806130455750876001600160401b0316876001600160401b031611155b8061306657506079546001600160401b03600160401b909104811690881611155b156130845760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260786020526040902054600160401b90048116908616146130c8576040516332a2a77f60e01b815260040160405180910390fd5b60006130d78787878588610a26565b905060006000805160206146868339815191526002836040516130fa91906145dc565b602060405180830381855afa158015613117573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061313a91906142ab565b61314491906145ee565b604080516020810182528281529051634890ed4560e11b81529192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916131a091889190600401614602565b602060405180830381865afa1580156131bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131e1919061463d565b6131fe576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260786020526040902060020154859003612f0e5760405163a47276bd60e01b815260040160405180910390fd5b6079546001600160401b03600160401b909104811690821611158061326d57506079546001600160401b03908116908216115b1561328b5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181166000818152607860209081526040808320805460748054600160401b928390049098166001600160401b03199098168817905560028201548786526075909452938290209290925560798054600160401b600160801b0319169390940292909217909255600182015490516333d6247d60e01b815260048101919091529091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b15801561336457600080fd5b505af1158015613378573d6000803e3d6000fd5b50505050826001600160401b0316816001600160401b03167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e84600201546040516133c591815260200190565b60405180910390a3505050565b6040516001600160a01b038085166024830152831660448201526064810182905261343d9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526138f8565b50505050565b6079546001600160401b03600160401b8204811691161115611a395760795460009061348090600160401b90046001600160401b03166001614171565b905061348b81610e32565b15610fcd576079546000906002906134ad9084906001600160401b031661431c565b6134b7919061465f565b6134c19083614171565b90506134cc81610e32565b156134de576134da8161323a565b5050565b6134da8261323a565b60006134f161201e565b905081600080613501848461431c565b606f546001600160401b039182169250600091613524916101009004164261433c565b90505b846001600160401b0316846001600160401b0316146135a5576001600160401b0380851660009081526072602052604090206001810154909116821015613584576001810154600160401b90046001600160401b0316945061359f565b61358e868661431c565b6001600160401b03169350506135a5565b50613527565b60006135b1848461433c565b90508381101561360857808403600c81116135cc57806135cf565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a60705402816135fe576135fe614366565b0460705550613678565b838103600c8111613619578061361c565b600c5b90506000816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a7640000028161365357613653614366565b04905080607054670de0b6b3a7640000028161367157613671614366565b0460705550505b683635c9adc5dea00000607054111561369d57683635c9adc5dea00000607055611d84565b633b9aca006070541015611d8457633b9aca0060705550505050505050565b336136c5611bda565b6001600160a01b031614611a395760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612172565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156137c857600080fd5b505af11580156137dc573d6000803e3d6000fd5b50505050611a396139ca565b6001600160a01b03163b151590565b600054610100900460ff166138625760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401612172565b611a393361371b565b606f5460ff1661388e57604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6040516001600160a01b0383166024820152604481018290526138f390849063a9059cbb60e01b90606401613406565b505050565b600061394d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613a269092919063ffffffff16565b8051909150156138f3578080602001905181019061396b919061463d565b6138f35760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401612172565b606f5460ff16156139ee57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b6060613a358484600085613a3d565b949350505050565b606082471015613a9e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401612172565b600080866001600160a01b03168587604051613aba91906145dc565b60006040518083038185875af1925050503d8060008114613af7576040519150601f19603f3d011682016040523d82523d6000602084013e613afc565b606091505b5091509150613b0d87838387613b18565b979650505050505050565b60608315613b85578251600003613b7e57613b32856137e8565b613b7e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612172565b5081613a35565b613a358383815115613b9a5781518083602001fd5b8060405162461bcd60e51b81526004016121729190613c18565b6001600160401b0391909116815260200190565b60005b83811015613be3578181015183820152602001613bcb565b50506000910152565b60008151808452613c04816020860160208601613bc8565b601f01601f19169290920160200192915050565b602081526000613c2b6020830184613bec565b9392505050565b600060208284031215613c4457600080fd5b813561ffff81168114613c2b57600080fd5b80356001600160401b038116811461201957600080fd5b600080600080600060a08688031215613c8557600080fd5b613c8e86613c56565b9450613c9c60208701613c56565b94979496505050506040830135926060810135926080909101359150565b6001600160a01b0391909116815260200190565b806103008101831015613ce057600080fd5b92915050565b6000806000806000806103a08789031215613d0057600080fd5b613d0987613c56565b9550613d1760208801613c56565b9450613d2560408801613c56565b93506060870135925060808701359150613d428860a08901613cce565b90509295509295509295565b60008060008060008060006103c0888a031215613d6a57600080fd5b613d7388613c56565b9650613d8160208901613c56565b9550613d8f60408901613c56565b9450613d9d60608901613c56565b93506080880135925060a08801359150613dba8960c08a01613cce565b905092959891949750929550565b600060208284031215613dda57600080fd5b613c2b82613c56565b60008083601f840112613df557600080fd5b5081356001600160401b03811115613e0c57600080fd5b6020830191508360208260051b8501011115613e2757600080fd5b9250929050565b80356001600160a01b038116811461201957600080fd5b600080600060408486031215613e5a57600080fd5b83356001600160401b03811115613e7057600080fd5b613e7c86828701613de3565b9094509250613e8f905060208501613e2e565b90509250925092565b600060208284031215613eaa57600080fd5b613c2b82613e2e565b600060208284031215613ec557600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112613ef357600080fd5b81356001600160401b0380821115613f0d57613f0d613ecc565b604051601f8301601f19908116603f01168101908282118183101715613f3557613f35613ecc565b81604052838152866020858801011115613f4e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215613f8057600080fd5b81356001600160401b03811115613f9657600080fd5b613a3584828501613ee2565b60008083601f840112613fb457600080fd5b5081356001600160401b03811115613fcb57600080fd5b602083019150836020828501011115613e2757600080fd5b600080600080600080868803610120811215613ffe57600080fd5b60a081121561400c57600080fd5b5086955060a0860135945060c08601356001600160401b038082111561403157600080fd5b61403d8a838b01613ee2565b955060e089013591508082111561405357600080fd5b61405f8a838b01613ee2565b945061010089013591508082111561407657600080fd5b5061408389828a01613fa2565b979a9699509497509295939492505050565b600080602083850312156140a857600080fd5b82356001600160401b038111156140be57600080fd5b6140ca85828601613de3565b90969095509350505050565b6000806000604084860312156140eb57600080fd5b83356001600160401b0381111561410157600080fd5b61410d86828701613fa2565b909790965060209590950135949350505050565b600181811c9082168061413557607f821691505b60208210810361415557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b038181168382160190808211156141915761419161415b565b5092915050565b634e487b7160e01b600052603260045260246000fd5b60008235607e198336030181126141c457600080fd5b9190910192915050565b6000608082360312156141e057600080fd5b604051608081016001600160401b03808211838310171561420357614203613ecc565b81604052843591508082111561421857600080fd5b5061422536828601613ee2565b8252506020830135602082015261423e60408401613c56565b604082015261424f60608401613c56565b606082015292915050565b60006001600160401b038281166002600160401b0319810161427e5761427e61415b565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b6000602082840312156142bd57600080fd5b5051919050565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b6000600182016143155761431561415b565b5060010190565b6001600160401b038281168282160390808211156141915761419161415b565b81810381811115613ce057613ce061415b565b8082028115828204841417613ce057613ce061415b565b634e487b7160e01b600052601260045260246000fd5b60008261438b5761438b614366565b500490565b601f8211156138f357600081815260208120601f850160051c810160208610156143b75750805b601f850160051c820191505b818110156143d6578281556001016143c3565b505050505050565b81516001600160401b038111156143f7576143f7613ecc565b61440b816144058454614121565b84614390565b602080601f83116001811461444057600084156144285750858301515b600019600386901b1c1916600185901b1785556143d6565b600085815260208120601f198616915b8281101561446f57888601518255948401946001909101908401614450565b508582101561448d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160401b038581168252841660208201526060604082018190526000906144f3908301848661449d565b9695505050505050565b80820180821115613ce057613ce061415b565b60008235605e198336030181126141c457600080fd5b60006060823603121561453857600080fd5b604051606081016001600160401b03808211838310171561455b5761455b613ecc565b81604052843591508082111561457057600080fd5b5061457d36828601613ee2565b8252506020830135602082015261459660408401613c56565b604082015292915050565b8183823760009101908152919050565b8481526001600160a01b03841660208201526060604082018190526000906144f3908301848661449d565b600082516141c4818460208701613bc8565b6000826145fd576145fd614366565b500690565b61032081016103008085843782018360005b6001811015614633578151835260209283019290910190600101614614565b5050509392505050565b60006020828403121561464f57600080fd5b81518015158114613c2b57600080fd5b60006001600160401b038381168061467957614679614366565b9216919091049291505056fe30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001f94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931a26469706673582212203dd63ac4455709626e53911f693a236c7b43de99bda32c96cb6d6788e4fb0fcd64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102da5760003560e01c8063841b24d711610184578063841b24d7146105e95780638c3d7301146106035780638da5cb5b1461060b57806399f5634e146106135780639aa972a31461061b5780639c9f3dfe1461062e578063a066215c14610641578063a3c573eb14610654578063ada8f9191461067b578063adc879e91461068e578063afd23cbe146106b5578063b4d63f58146106dd578063b6b0b0971461073d578063ba58ae3914610764578063c0ed84e014610777578063c754c7ed1461077f578063c89e42df14610799578063cfa8ed47146107ac578063d02103ca146107c6578063d2e129f9146107ed578063d8d1091b14610800578063d939b31514610813578063dbc169761461082d578063e7a7ed0214610835578063e8bf92ed1461084f578063eaeb077b14610876578063ed6b010414610889578063f14916d61461089d578063f2fde38b146108b0578063f851a440146108c3578063f8b823e4146108d657600080fd5b80630a0d9fbe146102df578063107bf28c1461030d57806315064c96146103225780631816b7e51461033f57806319d8ac6114610354578063220d789914610367578063267822471461037a578063298789831461039a5780632b0006fa146103b45780632c1f816a146103c7578063383b3be8146103da578063394218e9146103ed578063423fa85614610400578063456052671461041a578063458c0477146104345780634a1a89a7146104475780634a910e6a146104615780634e487706146104745780635392c5e014610487578063542028d5146104b55780635e9145c9146104bd5780635ec91958146104d057806360469169146104d8578063621dd411146104e05780636b8616ce146104f35780636ff512cc14610513578063715018a6146105265780637215541a1461052e5780637fcb365314610541578063831c7ead14610554578063837a47381461057b575b600080fd5b606f546102f79061010090046001600160401b031681565b6040516103049190613bb4565b60405180910390f35b6103156108df565b6040516103049190613c18565b606f5461032f9060ff1681565b6040519015158152602001610304565b61035261034d366004613c32565b61096d565b005b6073546102f7906001600160401b031681565b610315610375366004613c6d565b610a26565b607b5461038d906001600160a01b031681565b6040516103049190613cba565b60745461038d90600160401b90046001600160a01b031681565b6103526103c2366004613ce6565b610b81565b6103526103d5366004613d4e565b610cce565b61032f6103e8366004613dc8565b610e32565b6103526103fb366004613dc8565b610e79565b6073546102f790600160401b90046001600160401b031681565b6073546102f790600160801b90046001600160401b031681565b6079546102f7906001600160401b031681565b6079546102f790600160401b90046001600160401b031681565b61035261046f366004613dc8565b610f61565b610352610482366004613dc8565b610fd0565b6104a7610495366004613dc8565b60756020526000908152604090205481565b604051908152602001610304565b6103156110bc565b6103526104cb366004613e45565b6110c9565b610352611665565b6104a76116f2565b6103526104ee366004613ce6565b611708565b6104a7610501366004613dc8565b60716020526000908152604090205481565b610352610521366004613e98565b6119a8565b610352611a27565b61035261053c366004613dc8565b611a3b565b6074546102f7906001600160401b031681565b6102f77f000000000000000000000000000000000000000000000000000000000000000081565b6105be610589366004613eb3565b6078602052600090815260409020805460018201546002909201546001600160401b0380831693600160401b90930416919084565b604080516001600160401b039586168152949093166020850152918301526060820152608001610304565b6079546102f790600160c01b90046001600160401b031681565b610352611b56565b61038d611bda565b6104a7611be9565b610352610629366004613d4e565b611cf6565b61035261063c366004613dc8565b611d8d565b61035261064f366004613dc8565b611e79565b61038d7f000000000000000000000000000000000000000000000000000000000000000081565b610352610689366004613e98565b611f21565b6102f77f000000000000000000000000000000000000000000000000000000000000000081565b606f546106ca90600160481b900461ffff1681565b60405161ffff9091168152602001610304565b6107186106eb366004613dc8565b607260205260009081526040902080546001909101546001600160401b0380821691600160401b90041683565b604080519384526001600160401b039283166020850152911690820152606001610304565b61038d7f000000000000000000000000000000000000000000000000000000000000000081565b61032f610772366004613eb3565b611f97565b6102f761201e565b607b546102f790600160a01b90046001600160401b031681565b6103526107a7366004613f6e565b61206b565b606f5461038d90600160581b90046001600160a01b031681565b61038d7f000000000000000000000000000000000000000000000000000000000000000081565b6103526107fb366004613fe3565b6120d2565b61035261080e366004614095565b612470565b6079546102f790600160801b90046001600160401b031681565b6103526127f6565b6073546102f790600160c01b90046001600160401b031681565b61038d7f000000000000000000000000000000000000000000000000000000000000000081565b6103526108843660046140d6565b61289c565b607b5461032f90600160e01b900460ff1681565b6103526108ab366004613e98565b612b4a565b6103526108be366004613e98565b612bc9565b607a5461038d906001600160a01b031681565b6104a760705481565b607780546108ec90614121565b80601f016020809104026020016040519081016040528092919081815260200182805461091890614121565b80156109655780601f1061093a57610100808354040283529160200191610965565b820191906000526020600020905b81548152906001019060200180831161094857829003601f168201915b505050505081565b607a546001600160a01b0316331461099857604051634755657960e01b815260040160405180910390fd5b6103e88161ffff1610806109b157506103ff8161ffff16115b156109cf57604051630984a67960e31b815260040160405180910390fd5b606f805461ffff60481b1916600160481b61ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b6001600160401b038086166000818152607260205260408082205493881682529020546060929115801590610a59575081155b15610a775760405163340c614f60e11b815260040160405180910390fd5b80610a95576040516366385b5160e01b815260040160405180910390fd5b610a9e84611f97565b610abb576040516305dae44f60e21b815260040160405180910390fd5b604080516001600160601b03193360601b166020820152603481019690965260548601929092526001600160c01b031960c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b607454600160401b90046001600160a01b03163314610bb35760405163bbcbbc0560e01b815260040160405180910390fd5b610bc1868686868686612c3f565b607480546001600160401b0319166001600160401b0386811691821790925560009081526075602052604090208390556079541615610c0b57607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b158015610c6d57600080fd5b505af1158015610c81573d6000803e3d6000fd5b50506040518481523392506001600160401b03871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b607454600160401b90046001600160a01b03163314610d005760405163bbcbbc0560e01b815260040160405180910390fd5b610d0f87878787878787612f1a565b607480546001600160401b0319166001600160401b0386811691821790925560009081526075602052604090208390556079541615610d5957607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b158015610dbb57600080fd5b505af1158015610dcf573d6000803e3d6000fd5b5050607980546001600160c01b031661127560c71b179055505060405182815233906001600160401b038616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b6079546001600160401b0382811660009081526078602052604081205490924292610e6892600160801b90920481169116614171565b6001600160401b0316111592915050565b607a546001600160a01b03163314610ea457604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610ed157604051631d06e87960e01b815260040160405180910390fd5b606f5460ff16610f11576079546001600160401b03600160c01b909104811690821610610f115760405163401636df60e01b815260040160405180910390fd5b607980546001600160c01b0316600160c01b6001600160401b038416021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190610a1b908390613bb4565b607454600160401b90046001600160a01b03163314610fc457606f5460ff1615610f9e57604051630bc011ff60e21b815260040160405180910390fd5b610fa781610e32565b610fc457604051630674f25160e11b815260040160405180910390fd5b610fcd8161323a565b50565b607a546001600160a01b03163314610ffb57604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b03821611156110285760405163f5e37f2f60e01b815260040160405180910390fd5b606f5460ff1661106857607b546001600160401b03600160a01b9091048116908216106110685760405163f5e37f2f60e01b815260040160405180910390fd5b607b8054600160a01b600160e01b031916600160a01b6001600160401b038416021790556040517fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90610a1b908390613bb4565b607680546108ec90614121565b606f5460ff16156110ed57604051630bc011ff60e21b815260040160405180910390fd5b606f54600160581b90046001600160a01b0316331461111f576040516311e7be1560e01b815260040160405180910390fd5b8160008190036111425760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561116557604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160401b82048116600081815260726020526040812054838516949293600160801b909304909216919082905b8681101561144c5760008a8a838181106111ba576111ba614198565b90506020028101906111cc91906141ae565b6111d5906141ce565b805180516020909101206060820151919250906001600160401b0316156112c457856112008161425a565b9650506000818360200151846060015160405160200161122293929190614288565b60408051601f1981840301815291815281516020928301206001600160401b038a166000908152607190935291205490915081146112735760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b0380881660009081526071602052604080822091909155606085015190850151908216911610156112be57604051633fbd5c3960e11b815260040160405180910390fd5b506113a9565b602082015115801590611365575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303816000875af115801561133f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136391906142ab565b155b15611383576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c010156113a9576040516328a69b1f60e21b815260040160405180910390fd5b876001600160401b031682604001516001600160401b031610806113d957504282604001516001600160401b0316115b156113f7576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518d6040516020016114189594939291906142c4565b604051602081830303815290604052805190602001209450816040015197505050808061144490614303565b91505061119e565b506114578685614171565b6073549094506001600160401b03600160c01b909104811690841611156114915760405163c630a00d60e01b815260040160405180910390fd5b600061149d828561431c565b6114b0906001600160401b03168861433c565b60408051606081018252858152426001600160401b03908116602080840191825260738054600160401b9081900485168688019081528d861660008181526072909552979093209551865592516001909501805492519585166001600160801b03199384161795851684029590951790945583548c84169116179302929092179055909150828116908516146115655760738054600160801b600160c01b031916600160801b6001600160401b038716021790555b6115aa333083607054611578919061434f565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169291906133d2565b6115b2613443565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561160d57600080fd5b505af1158015611621573d6000803e3d6000fd5b50506040516001600160401b03881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a250505050505050505050565b607a546001600160a01b0316331461169057604051634755657960e01b815260040160405180910390fd5b607b54600160e01b900460ff166116ba5760405163f6ba91a160e01b815260040160405180910390fd5b607b805460ff60e01b191690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60006070546064611703919061434f565b905090565b606f5460ff161561172c57604051630bc011ff60e21b815260040160405180910390fd5b6079546001600160401b03858116600090815260726020526040902060010154429261176392600160c01b90910481169116614171565b6001600160401b0316111561178b57604051638a0704d360e01b815260040160405180910390fd5b6103e8611798868661431c565b6001600160401b031611156117c057604051635acfba9d60e11b815260040160405180910390fd5b6117ce868686868686612c3f565b6117d7846134e7565b607954600160801b90046001600160401b03166000036118ba57607480546001600160401b0319166001600160401b038681169182179092556000908152607560205260409020839055607954161561183b57607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b15801561189d57600080fd5b505af11580156118b1573d6000803e3d6000fd5b5050505061196b565b6118c2613443565b607980546001600160401b03169060006118db8361425a565b82546001600160401b039182166101009390930a928302928202191691909117909155604080516080810182524283168152878316602080830191825282840189815260608401898152607954871660009081526078909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b60405182815233906001600160401b038616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001610cbe565b607a546001600160a01b031633146119d357604051634755657960e01b815260040160405180910390fd5b606f8054600160581b600160f81b031916600160581b6001600160a01b038416021790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610a1b908390613cba565b611a2f6136bc565b611a39600061371b565b565b611a43611bda565b6001600160a01b0316336001600160a01b031614611b4e576000611a6561201e565b9050806001600160401b0316826001600160401b031611611a995760405163812a372d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b90910481169083161180611ad857506001600160401b0380831660009081526072602052604090206001015416155b15611af657604051632631700560e21b815260040160405180910390fd5b6001600160401b038083166000908152607260205260409020600101544291611b249162093a809116614171565b6001600160401b03161115611b4c5760405163692baaad60e11b815260040160405180910390fd5b505b610fcd61376d565b607b546001600160a01b03163314611b815760405163d1ec4b2360e01b815260040160405180910390fd5b607b54607a80546001600160a01b0319166001600160a01b0390921691821790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e91611bd091613cba565b60405180910390a1565b6033546001600160a01b031690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401611c389190613cba565b602060405180830381865afa158015611c55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7991906142ab565b90506000611c8561201e565b6073546001600160401b03600160401b8204811691611cb591600160801b8204811691600160c01b90041661431c565b611cbf9190614171565b611cc9919061431c565b6001600160401b0316905080600003611ce55760009250505090565b611cef818361437c565b9250505090565b606f5460ff1615611d1a57604051630bc011ff60e21b815260040160405180910390fd5b611d2987878787878787612f1a565b6001600160401b0384166000908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1611d8461376d565b50505050505050565b607a546001600160a01b03163314611db857604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115611de557604051630cc9650760e41b815260040160405180910390fd5b606f5460ff16611e25576079546001600160401b03600160801b909104811690821610611e255760405163048a05a960e41b815260040160405180910390fd5b60798054600160801b600160c01b031916600160801b6001600160401b038416021790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590610a1b908390613bb4565b607a546001600160a01b03163314611ea457604051634755657960e01b815260040160405180910390fd5b62015180816001600160401b03161115611ed157604051631c0cfbfd60e31b815260040160405180910390fd5b606f8054610100600160481b0319166101006001600160401b038416021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890610a1b908390613bb4565b607a546001600160a01b03163314611f4c57604051634755657960e01b815260040160405180910390fd5b607b80546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610a1b908390613cba565b600067ffffffff000000016001600160401b038316108015611fcd575067ffffffff00000001604083901c6001600160401b0316105b8015611fed575067ffffffff00000001608083901c6001600160401b0316105b8015612004575067ffffffff0000000160c083901c105b1561201157506001919050565b506000919050565b919050565b6079546000906001600160401b03161561205b57506079546001600160401b03908116600090815260786020526040902054600160401b90041690565b506074546001600160401b031690565b607a546001600160a01b0316331461209657604051634755657960e01b815260040160405180910390fd5b60766120a282826143de565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610a1b9190613c18565b600054610100900460ff16158080156120f25750600054600160ff909116105b806121135750612101306137e8565b158015612113575060005460ff166001145b61217b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801561219e576000805461ff0019166101001790555b6121ab6020880188613e98565b607a80546001600160a01b0319166001600160a01b03929092169190911790556121db6040880160208901613e98565b606f80546001600160a01b0392909216600160581b02600160581b600160f81b03199092169190911790556122166080880160608901613e98565b607480546001600160a01b0392909216600160401b02600160401b600160e01b03199092169190911790556000805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad869055607661227a86826143de565b50607761228785826143de565b5062093a8061229c6060890160408a01613dc8565b6001600160401b031611156122c457604051630cc9650760e41b815260040160405180910390fd5b6122d46060880160408901613dc8565b607980546001600160401b0392909216600160801b02600160801b600160c01b031990921691909117905562093a8061231360a0890160808a01613dc8565b6001600160401b0316111561233b57604051631d06e87960e01b815260040160405180910390fd5b61234b60a0880160808901613dc8565b607980546001600160c01b0316600160c01b6001600160401b03939093169290920291909117905567016345785d8a0000607055606f8054610100600160581b031916620708006101f560491b01179055607b8054600160a01b600160e81b031916670200000000000d2f60a71b1790556123c46137f7565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd660007f0000000000000000000000000000000000000000000000000000000000000000858560405161241a94939291906144c6565b60405180910390a18015611d84576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b54600160e01b900460ff161561249b576040516324eff8c360e01b815260040160405180910390fd5b606f5460ff16156124bf57604051630bc011ff60e21b815260040160405180910390fd5b8060008190036124e25760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561250557604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160c01b820481169161252d918491600160801b9004166144fd565b111561254c5760405163c630a00d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b820481166000818152607260205260408120549193600160801b9004909216915b8481101561270057600087878381811061259957612599614198565b90506020028101906125ab9190614510565b6125b490614526565b9050836125c08161425a565b825180516020918201208185015160408087015190519499509194506000936125ec9386939101614288565b60408051601f1981840301815291815281516020928301206001600160401b03891660009081526071909352912054909150811461263d5760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b03861660009081526071602052604081205561266160018961433c565b84036126b55742607b60149054906101000a90046001600160401b0316846040015161268d9190614171565b6001600160401b031611156126b55760405163c44a082160e01b815260040160405180910390fd5b8482846020015142336040516020016126d29594939291906142c4565b60405160208183030381529060405280519060200120945050505080806126f890614303565b91505061257d565b5061270b8484614171565b607380546001600160401b034281166001600160401b03199092168217808455604080516060810182528781526020808201958652600160401b9384900485168284019081528589166000818152607290935284832093518455965160019390930180549151871686026001600160801b031990921693871693909317179091558554938916600160801b02600160801b600160c01b031993860293909316600160401b600160c01b031990941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a546001600160a01b0316331461282157604051634755657960e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561287c57600080fd5b505af1158015612890573d6000803e3d6000fd5b50505050611a3961386b565b607b54600160e01b900460ff16156128c7576040516324eff8c360e01b815260040160405180910390fd5b606f5460ff16156128eb57604051630bc011ff60e21b815260040160405180910390fd5b60006128f56116f2565b90508181111561291857604051634732fdb560e01b815260040160405180910390fd5b61138883111561293b576040516328a69b1f60e21b815260040160405180910390fd5b6129706001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163330846133d2565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129f491906142ab565b60738054919250600160c01b9091046001600160401b0316906018612a188361425a565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508484604051612a4d9291906145a1565b604051908190038120612a669183904290602001614288565b60408051808303601f190181529181528151602092830120607354600160c01b90046001600160401b031660009081526071909352912055323303612af857607354604080518381523360208201526060918101829052600091810191909152600160c01b9091046001600160401b0316906000805160206146a68339815191529060800160405180910390a2612b43565b607360189054906101000a90046001600160401b03166001600160401b03166000805160206146a683398151915282338888604051612b3a94939291906145b1565b60405180910390a25b5050505050565b607a546001600160a01b03163314612b7557604051634755657960e01b815260040160405180910390fd5b60748054600160401b600160e01b031916600160401b6001600160a01b038416021790556040517f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90610a1b908390613cba565b612bd16136bc565b6001600160a01b038116612c365760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401612172565b610fcd8161371b565b600080612c4a61201e565b90506001600160401b03881615612ce0576079546001600160401b039081169089161115612c8b5760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b038089166000908152607860205260409020600281015481549094509091898116600160401b9092041614612cda57604051632bd2e3e760e01b815260040160405180910390fd5b50612d4c565b6001600160401b038716600090815260756020526040902054915081612d19576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316876001600160401b03161115612d4c57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316866001600160401b031611612d7e5760405163b9b18f5760e01b815260040160405180910390fd5b6000612d8d8888888689610a26565b90506000600080516020614686833981519152600283604051612db091906145dc565b602060405180830381855afa158015612dcd573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190612df091906142ab565b612dfa91906145ee565b604080516020810182528281529051634890ed4560e11b81529192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91612e5691899190600401614602565b602060405180830381865afa158015612e73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e97919061463d565b612eb4576040516309bde33960e01b815260040160405180910390fd5b612f0e33612ec2858b61431c565b6001600160401b0316612ed3611be9565b612edd919061434f565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906138c3565b50505050505050505050565b60006001600160401b03881615612fae576079546001600160401b039081169089161115612f5b5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088166000908152607860205260409020600281015481549092888116600160401b9092041614612fa857604051632bd2e3e760e01b815260040160405180910390fd5b50613016565b506001600160401b03851660009081526075602052604090205480612fe6576040516324cbdcc360e11b815260040160405180910390fd5b6074546001600160401b03908116908716111561301657604051630f2b74f160e11b815260040160405180910390fd5b6079546001600160401b0390811690881611806130455750876001600160401b0316876001600160401b031611155b8061306657506079546001600160401b03600160401b909104811690881611155b156130845760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260786020526040902054600160401b90048116908616146130c8576040516332a2a77f60e01b815260040160405180910390fd5b60006130d78787878588610a26565b905060006000805160206146868339815191526002836040516130fa91906145dc565b602060405180830381855afa158015613117573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061313a91906142ab565b61314491906145ee565b604080516020810182528281529051634890ed4560e11b81529192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916131a091889190600401614602565b602060405180830381865afa1580156131bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131e1919061463d565b6131fe576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260786020526040902060020154859003612f0e5760405163a47276bd60e01b815260040160405180910390fd5b6079546001600160401b03600160401b909104811690821611158061326d57506079546001600160401b03908116908216115b1561328b5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181166000818152607860209081526040808320805460748054600160401b928390049098166001600160401b03199098168817905560028201548786526075909452938290209290925560798054600160401b600160801b0319169390940292909217909255600182015490516333d6247d60e01b815260048101919091529091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b15801561336457600080fd5b505af1158015613378573d6000803e3d6000fd5b50505050826001600160401b0316816001600160401b03167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e84600201546040516133c591815260200190565b60405180910390a3505050565b6040516001600160a01b038085166024830152831660448201526064810182905261343d9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526138f8565b50505050565b6079546001600160401b03600160401b8204811691161115611a395760795460009061348090600160401b90046001600160401b03166001614171565b905061348b81610e32565b15610fcd576079546000906002906134ad9084906001600160401b031661431c565b6134b7919061465f565b6134c19083614171565b90506134cc81610e32565b156134de576134da8161323a565b5050565b6134da8261323a565b60006134f161201e565b905081600080613501848461431c565b606f546001600160401b039182169250600091613524916101009004164261433c565b90505b846001600160401b0316846001600160401b0316146135a5576001600160401b0380851660009081526072602052604090206001810154909116821015613584576001810154600160401b90046001600160401b0316945061359f565b61358e868661431c565b6001600160401b03169350506135a5565b50613527565b60006135b1848461433c565b90508381101561360857808403600c81116135cc57806135cf565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a60705402816135fe576135fe614366565b0460705550613678565b838103600c8111613619578061361c565b600c5b90506000816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a7640000028161365357613653614366565b04905080607054670de0b6b3a7640000028161367157613671614366565b0460705550505b683635c9adc5dea00000607054111561369d57683635c9adc5dea00000607055611d84565b633b9aca006070541015611d8457633b9aca0060705550505050505050565b336136c5611bda565b6001600160a01b031614611a395760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612172565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156137c857600080fd5b505af11580156137dc573d6000803e3d6000fd5b50505050611a396139ca565b6001600160a01b03163b151590565b600054610100900460ff166138625760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401612172565b611a393361371b565b606f5460ff1661388e57604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6040516001600160a01b0383166024820152604481018290526138f390849063a9059cbb60e01b90606401613406565b505050565b600061394d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613a269092919063ffffffff16565b8051909150156138f3578080602001905181019061396b919061463d565b6138f35760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401612172565b606f5460ff16156139ee57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b6060613a358484600085613a3d565b949350505050565b606082471015613a9e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401612172565b600080866001600160a01b03168587604051613aba91906145dc565b60006040518083038185875af1925050503d8060008114613af7576040519150601f19603f3d011682016040523d82523d6000602084013e613afc565b606091505b5091509150613b0d87838387613b18565b979650505050505050565b60608315613b85578251600003613b7e57613b32856137e8565b613b7e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612172565b5081613a35565b613a358383815115613b9a5781518083602001fd5b8060405162461bcd60e51b81526004016121729190613c18565b6001600160401b0391909116815260200190565b60005b83811015613be3578181015183820152602001613bcb565b50506000910152565b60008151808452613c04816020860160208601613bc8565b601f01601f19169290920160200192915050565b602081526000613c2b6020830184613bec565b9392505050565b600060208284031215613c4457600080fd5b813561ffff81168114613c2b57600080fd5b80356001600160401b038116811461201957600080fd5b600080600080600060a08688031215613c8557600080fd5b613c8e86613c56565b9450613c9c60208701613c56565b94979496505050506040830135926060810135926080909101359150565b6001600160a01b0391909116815260200190565b806103008101831015613ce057600080fd5b92915050565b6000806000806000806103a08789031215613d0057600080fd5b613d0987613c56565b9550613d1760208801613c56565b9450613d2560408801613c56565b93506060870135925060808701359150613d428860a08901613cce565b90509295509295509295565b60008060008060008060006103c0888a031215613d6a57600080fd5b613d7388613c56565b9650613d8160208901613c56565b9550613d8f60408901613c56565b9450613d9d60608901613c56565b93506080880135925060a08801359150613dba8960c08a01613cce565b905092959891949750929550565b600060208284031215613dda57600080fd5b613c2b82613c56565b60008083601f840112613df557600080fd5b5081356001600160401b03811115613e0c57600080fd5b6020830191508360208260051b8501011115613e2757600080fd5b9250929050565b80356001600160a01b038116811461201957600080fd5b600080600060408486031215613e5a57600080fd5b83356001600160401b03811115613e7057600080fd5b613e7c86828701613de3565b9094509250613e8f905060208501613e2e565b90509250925092565b600060208284031215613eaa57600080fd5b613c2b82613e2e565b600060208284031215613ec557600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112613ef357600080fd5b81356001600160401b0380821115613f0d57613f0d613ecc565b604051601f8301601f19908116603f01168101908282118183101715613f3557613f35613ecc565b81604052838152866020858801011115613f4e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215613f8057600080fd5b81356001600160401b03811115613f9657600080fd5b613a3584828501613ee2565b60008083601f840112613fb457600080fd5b5081356001600160401b03811115613fcb57600080fd5b602083019150836020828501011115613e2757600080fd5b600080600080600080868803610120811215613ffe57600080fd5b60a081121561400c57600080fd5b5086955060a0860135945060c08601356001600160401b038082111561403157600080fd5b61403d8a838b01613ee2565b955060e089013591508082111561405357600080fd5b61405f8a838b01613ee2565b945061010089013591508082111561407657600080fd5b5061408389828a01613fa2565b979a9699509497509295939492505050565b600080602083850312156140a857600080fd5b82356001600160401b038111156140be57600080fd5b6140ca85828601613de3565b90969095509350505050565b6000806000604084860312156140eb57600080fd5b83356001600160401b0381111561410157600080fd5b61410d86828701613fa2565b909790965060209590950135949350505050565b600181811c9082168061413557607f821691505b60208210810361415557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b038181168382160190808211156141915761419161415b565b5092915050565b634e487b7160e01b600052603260045260246000fd5b60008235607e198336030181126141c457600080fd5b9190910192915050565b6000608082360312156141e057600080fd5b604051608081016001600160401b03808211838310171561420357614203613ecc565b81604052843591508082111561421857600080fd5b5061422536828601613ee2565b8252506020830135602082015261423e60408401613c56565b604082015261424f60608401613c56565b606082015292915050565b60006001600160401b038281166002600160401b0319810161427e5761427e61415b565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b6000602082840312156142bd57600080fd5b5051919050565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b6000600182016143155761431561415b565b5060010190565b6001600160401b038281168282160390808211156141915761419161415b565b81810381811115613ce057613ce061415b565b8082028115828204841417613ce057613ce061415b565b634e487b7160e01b600052601260045260246000fd5b60008261438b5761438b614366565b500490565b601f8211156138f357600081815260208120601f850160051c810160208610156143b75750805b601f850160051c820191505b818110156143d6578281556001016143c3565b505050505050565b81516001600160401b038111156143f7576143f7613ecc565b61440b816144058454614121565b84614390565b602080601f83116001811461444057600084156144285750858301515b600019600386901b1c1916600185901b1785556143d6565b600085815260208120601f198616915b8281101561446f57888601518255948401946001909101908401614450565b508582101561448d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160401b038581168252841660208201526060604082018190526000906144f3908301848661449d565b9695505050505050565b80820180821115613ce057613ce061415b565b60008235605e198336030181126141c457600080fd5b60006060823603121561453857600080fd5b604051606081016001600160401b03808211838310171561455b5761455b613ecc565b81604052843591508082111561457057600080fd5b5061457d36828601613ee2565b8252506020830135602082015261459660408401613c56565b604082015292915050565b8183823760009101908152919050565b8481526001600160a01b03841660208201526060604082018190526000906144f3908301848661449d565b600082516141c4818460208701613bc8565b6000826145fd576145fd614366565b500690565b61032081016103008085843782018360005b6001811015614633578151835260209283019290910190600101614614565b5050509392505050565b60006020828403121561464f57600080fd5b81518015158114613c2b57600080fd5b60006001600160401b038381168061467957614679614366565b9216919091049291505056fe30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001f94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931a26469706673582212203dd63ac4455709626e53911f693a236c7b43de99bda32c96cb6d6788e4fb0fcd64736f6c63430008140033", + "bytecode": "0x6101406040523480156200001257600080fd5b5060405162006078380380620060788339810160408190526200003591620000a5565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b0391821661010052166101205262000131565b6001600160a01b03811681146200008557600080fd5b50565b80516001600160401b0381168114620000a057600080fd5b919050565b60008060008060008060c08789031215620000bf57600080fd5b8651620000cc816200006f565b6020880151909650620000df816200006f565b6040880151909550620000f2816200006f565b606088015190945062000105816200006f565b9250620001156080880162000088565b91506200012560a0880162000088565b90509295509295509295565b60805160a05160c05160e0516101005161012051615e79620001ff6000396000818161069601528181610dec01526131760152600081816108030152610dc20152600081816107c901528181611d910152818161380f0152614c8f01526000818161096f01528181610f5f01528181611130015281816119990152818161216a015281816139f70152614759015260008181610a1c015281816140b4015261450c0152600081816108bf01528181611d5f0152818161265b015281816139cb01526141a20152615e796000f3fe608060405234801561001057600080fd5b50600436106103ba5760003560e01c8063841b24d7116101f4578063c754c7ed1161011a578063e7a7ed02116100ad578063f14916d61161007c578063f14916d614610a7e578063f2fde38b14610a91578063f851a44014610aa4578063f8b823e414610ac457600080fd5b8063e7a7ed02146109e7578063e8bf92ed14610a17578063eaeb077b14610a3e578063ed6b010414610a5157600080fd5b8063d2e129f9116100e9578063d2e129f914610991578063d8d1091b146109a4578063d939b315146109b7578063dbc16976146109df57600080fd5b8063c754c7ed146108fc578063c89e42df14610928578063cfa8ed471461093b578063d02103ca1461096a57600080fd5b8063a3c573eb11610192578063b4d63f5811610161578063b4d63f5814610853578063b6b0b097146108ba578063ba58ae39146108e1578063c0ed84e0146108f457600080fd5b8063a3c573eb146107c4578063ada8f919146107eb578063adc879e9146107fe578063afd23cbe1461082557600080fd5b806399f5634e116101ce57806399f5634e146107835780639aa972a31461078b5780639c9f3dfe1461079e578063a066215c146107b157600080fd5b8063841b24d71461072d5780638c3d73011461075d5780638da5cb5b1461076557600080fd5b80634a1a89a7116102e4578063621dd411116102775780637215541a116102465780637215541a1461066a5780637fcb36531461067d578063831c7ead14610691578063837a4738146106b857600080fd5b8063621dd4111461061c5780636b8616ce1461062f5780636ff512cc1461064f578063715018a61461066257600080fd5b8063542028d5116102b3578063542028d5146105f15780635e9145c9146105f95780635ec919581461060c578063604691691461061457600080fd5b80634a1a89a71461057d5780634a910e6a1461059d5780634e487706146105b05780635392c5e0146105c357600080fd5b8063298789831161035c578063394218e91161032b578063394218e91461050e578063423fa856146105215780634560526714610541578063458c04771461056957600080fd5b806329878983146104a95780632b0006fa146104d55780632c1f816a146104e8578063383b3be8146104fb57600080fd5b80631816b7e5116103985780631816b7e51461042857806319d8ac611461043d578063220d789914610451578063267822471461046457600080fd5b80630a0d9fbe146103bf578063107bf28c146103f657806315064c961461040b575b600080fd5b606f546103d890610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6103fe610acd565b6040516103ed91906152bb565b606f546104189060ff1681565b60405190151581526020016103ed565b61043b6104363660046152d5565b610b5b565b005b6073546103d89067ffffffffffffffff1681565b6103fe61045f366004615311565b610c73565b607b546104849073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103ed565b6074546104849068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61043b6104e3366004615376565b610e4a565b61043b6104f63660046153de565b61101a565b610418610509366004615458565b611228565b61043b61051c366004615458565b61127e565b6073546103d89068010000000000000000900467ffffffffffffffff1681565b6073546103d890700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546103d89067ffffffffffffffff1681565b6079546103d89068010000000000000000900467ffffffffffffffff1681565b61043b6105ab366004615458565b611402565b61043b6105be366004615458565b6114b5565b6105e36105d1366004615458565b60756020526000908152604090205481565b6040519081526020016103ed565b6103fe611639565b61043b6106073660046154e3565b611646565b61043b611e50565b6105e3611f50565b61043b61062a366004615376565b611f66565b6105e361063d366004615458565b60716020526000908152604090205481565b61043b61065d366004615537565b6122ee565b61043b6123c3565b61043b610678366004615458565b6123d7565b6074546103d89067ffffffffffffffff1681565b6103d87f000000000000000000000000000000000000000000000000000000000000000081565b6107016106c6366004615552565b60786020526000908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016103ed565b6079546103d8907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61043b612547565b60335473ffffffffffffffffffffffffffffffffffffffff16610484565b6105e3612613565b61043b6107993660046153de565b61276c565b61043b6107ac366004615458565b61281d565b61043b6107bf366004615458565b612999565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b61043b6107f9366004615537565b612a9f565b6103d87f000000000000000000000000000000000000000000000000000000000000000081565b606f54610840906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103ed565b610894610861366004615458565b6072602052600090815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016103ed565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b6104186108ef366004615552565b612b63565b6103d8612bed565b607b546103d89074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b61043b610936366004615645565b612c42565b606f54610484906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b61043b61099f3660046156bc565b612ccf565b61043b6109b236600461576f565b61321a565b6079546103d890700100000000000000000000000000000000900467ffffffffffffffff1681565b61043b6137bc565b6073546103d8907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b61043b610a4c3660046157b1565b613895565b607b54610418907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b61043b610a8c366004615537565b613c8b565b61043b610a9f366004615537565b613d5d565b607a546104849073ffffffffffffffffffffffffffffffffffffffff1681565b6105e360705481565b60778054610ada906157fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610b06906157fd565b8015610b535780601f10610b2857610100808354040283529160200191610b53565b820191906000526020600020905b815481529060010190602001808311610b3657829003601f168201915b505050505081565b607a5473ffffffffffffffffffffffffffffffffffffffff163314610bac576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff161080610bc557506103ff8161ffff16115b15610bfc576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086166000818152607260205260408082205493881682529020546060929115801590610ca7575081155b15610cde576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610d15576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d1e84612b63565b610d54576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610ea7576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610eb5868686868686613e11565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615610f3057607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015610fb857600080fd5b505af1158015610fcc573d6000803e3d6000fd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611077576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611086878787878787876141d5565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092556000908152607560205260409020839055607954161561110157607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b15801561118957600080fd5b505af115801561119d573d6000803e3d6000fd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281166000908152607860205260408120549092429261126c927001000000000000000000000000000000009092048116911661587f565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146112cf576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611316576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166113855760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611385576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610c68565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146114a957606f5460ff161561146a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61147381611228565b6114a9576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114b28161460f565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611506576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561154d576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166115b857607b5467ffffffffffffffff740100000000000000000000000000000000000000009091048116908216106115b8576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001610c68565b60768054610ada906157fd565b606f5460ff1615611683576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146116e3576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600081900361171f576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561175b576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000082048116600081815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b86811015611bab5760008a8a838181106117c3576117c36158a7565b90506020028101906117d591906158d6565b6117de90615914565b8051805160209091012060608201519192509067ffffffffffffffff1615611956578561180a816159a1565b9650506000818360200151846060015160405160200161186293929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a166000908152607190935291205490915081146118eb576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088166000908152607160205260408082209190915560608501519085015190821691161015611950576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611a93565b602082015115801590611a1d575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af11580156119f7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1b91906159c8565b155b15611a54576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611a93576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080611ac6575042826040015167ffffffffffffffff16115b15611afd576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151975050508080611ba3906159e1565b9150506117a7565b50611bb6868561587f565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115611c1f576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611c2b8285615a19565b611c3f9067ffffffffffffffff1688615a3a565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d861660008181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611d3557607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611d87333083607054611d489190615a4d565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190614822565b611d8f614904565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611df757600080fd5b505af1158015611e0b573d6000803e3d6000fd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611ea1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16611efd576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60006070546064611f619190615a4d565b905090565b606f5460ff1615611fa3576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581166000908152607260205260409020600101544292611ff09278010000000000000000000000000000000000000000000000009091048116911661587f565b67ffffffffffffffff161115612032576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e861203f8686615a19565b67ffffffffffffffff161115612081576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61208f868686868686613e11565b612098846149b5565b607954700100000000000000000000000000000000900467ffffffffffffffff166000036121e057607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092556000908152607560205260409020839055607954161561213b57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b1580156121c357600080fd5b505af11580156121d7573d6000803e3d6000fd5b505050506122b0565b6121e8614904565b6079805467ffffffffffffffff16906000612202836159a1565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487166000908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59669060200161100a565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461233f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c68565b6123cb614b95565b6123d56000614c16565b565b60335473ffffffffffffffffffffffffffffffffffffffff16331461253f576000612400612bed565b90508067ffffffffffffffff168267ffffffffffffffff161161244f576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000090910481169083161180612495575067ffffffffffffffff80831660009081526072602052604090206001015416155b156124cc576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff80831660009081526072602052604090206001015442916124fb9162093a80911661587f565b67ffffffffffffffff16111561253d576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6114b2614c8d565b607b5473ffffffffffffffffffffffffffffffffffffffff163314612598576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156126a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c691906159c8565b905060006126d2612bed565b60735467ffffffffffffffff68010000000000000000820481169161272a9170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416615a19565b612734919061587f565b61273e9190615a19565b67ffffffffffffffff1690508060000361275b5760009250505090565b6127658183615a93565b9250505090565b606f5460ff16156127a9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127b8878787878787876141d5565b67ffffffffffffffff84166000908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1612814614c8d565b50505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461286e576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156128b5576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661291c5760795467ffffffffffffffff70010000000000000000000000000000000090910481169082161061291c576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610c68565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146129ea576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff161115612a31576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001610c68565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612af0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c68565b600067ffffffff0000000167ffffffffffffffff8316108015612b9b575067ffffffff00000001604083901c67ffffffffffffffff16105b8015612bbc575067ffffffff00000001608083901c67ffffffffffffffff16105b8015612bd3575067ffffffff0000000160c083901c105b15612be057506001919050565b506000919050565b919050565b60795460009067ffffffffffffffff1615612c31575060795467ffffffffffffffff9081166000908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612c93576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6076612c9f8282615af5565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c6891906152bb565b600054610100900460ff1615808015612cef5750600054600160ff909116105b80612d095750303b158015612d09575060005460ff166001145b612d9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612df857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b612e056020880188615537565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612e5a6040880160208901615537565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055612ebf6080880160608901615537565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790556000805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076612f4a8682615af5565b506077612f578582615af5565b5062093a80612f6c6060890160408a01615458565b67ffffffffffffffff161115612fae576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fbe6060880160408901615458565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a8061302060a0890160808a01615458565b67ffffffffffffffff161115613062576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61307260a0880160808901615458565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613151614d15565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd660007f000000000000000000000000000000000000000000000000000000000000000085856040516131a79493929190615c58565b60405180910390a1801561281457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613277576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16156132b4576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036132f0576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561332c576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff78010000000000000000000000000000000000000000000000008204811691613377918491700100000000000000000000000000000000900416615c90565b11156133af576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000008204811660008181526072602052604081205491937001000000000000000000000000000000009004909216915b8481101561365957600087878381811061340f5761340f6158a7565b90506020028101906134219190615ca3565b61342a90615cd7565b905083613436816159a1565b825180516020918201208185015160408087015190519499509194506000936134989386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260719093529120549091508114613521576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260716020526040812055613546600189615a3a565b84036135b55742607b60149054906101000a900467ffffffffffffffff168460400151613573919061587f565b67ffffffffffffffff1611156135b5576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080613651906159e1565b9150506133f3565b50613664848461587f565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589166000818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461380d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561387557600080fd5b505af1158015613889573d6000803e3d6000fd5b505050506123d5614db5565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16156138f2576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff161561392f576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613939611f50565b905081811115613975576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113888311156139b1576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6139f373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084614822565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a8491906159c8565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16906018613abe836159a1565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051613af5929190615d53565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1660009081526071909352912055323303613c2557607354604080518381523360208201526060918101829052600091810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613c84565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613c7b9493929190615d63565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613cdc576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610c68565b613d65614b95565b73ffffffffffffffffffffffffffffffffffffffff8116613e08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401612d91565b6114b281614c16565b600080613e1c612bed565b905067ffffffffffffffff881615613eec5760795467ffffffffffffffff9081169089161115613e78576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089166000908152607860205260409020600281015481549094509091898116680100000000000000009092041614613ee6576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50613f8d565b67ffffffffffffffff8716600090815260756020526040902054915081613f3f576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115613f8d576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611613fda576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613fe98888888689610c73565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161401e9190615d99565b602060405180830381855afa15801561403b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061405e91906159c8565b6140689190615dab565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916140ea91899190600401615dbf565b602060405180830381865afa158015614107573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061412b9190615dfa565b614161576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6141c93361416f858b615a19565b67ffffffffffffffff16614181612613565b61418b9190615a4d565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190614e44565b50505050505050505050565b600067ffffffffffffffff8816156142a35760795467ffffffffffffffff9081169089161115614231576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff808816600090815260786020526040902060028101548154909288811668010000000000000000909204161461429d576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061433f565b5067ffffffffffffffff8516600090815260756020526040902054806142f5576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff908116908716111561433f576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff908116908816118061437157508767ffffffffffffffff168767ffffffffffffffff1611155b80614398575060795467ffffffffffffffff68010000000000000000909104811690881611155b156143cf576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff878116600090815260786020526040902054680100000000000000009004811690861614614432576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006144418787878588610c73565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516144769190615d99565b602060405180830381855afa158015614493573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906144b691906159c8565b6144c09190615dab565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161454291889190600401615dbf565b602060405180830381865afa15801561455f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145839190615dfa565b6145b9576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89166000908152607860205260409020600201548590036141c9576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff680100000000000000009091048116908216111580614649575060795467ffffffffffffffff908116908216115b15614680576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff818116600081815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b1580156147b257600080fd5b505af11580156147c6573d6000803e3d6000fd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161481591815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526148fe9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614e9f565b50505050565b60795467ffffffffffffffff6801000000000000000082048116911611156123d55760795460009061494d9068010000000000000000900467ffffffffffffffff16600161587f565b905061495881611228565b156114b25760795460009060029061497b90849067ffffffffffffffff16615a19565b6149859190615e1c565b61498f908361587f565b905061499a81611228565b156149ac576149a88161460f565b5050565b6149a88261460f565b60006149bf612bed565b9050816000806149cf8484615a19565b606f5467ffffffffffffffff91821692506000916149f39161010090041642615a3a565b90505b8467ffffffffffffffff168467ffffffffffffffff1614614a7e5767ffffffffffffffff80851660009081526072602052604090206001810154909116821015614a5c57600181015468010000000000000000900467ffffffffffffffff169450614a78565b614a668686615a19565b67ffffffffffffffff16935050614a7e565b506149f6565b6000614a8a8484615a3a565b905083811015614ae157808403600c8111614aa55780614aa8565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281614ad757614ad7615a64565b0460705550614b51565b838103600c8111614af25780614af5565b600c5b90506000816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a76400000281614b2c57614b2c615a64565b04905080607054670de0b6b3a76400000281614b4a57614b4a615a64565b0460705550505b683635c9adc5dea000006070541115614b7657683635c9adc5dea00000607055612814565b633b9aca00607054101561281457633b9aca0060705550505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146123d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612d91565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b158015614cf557600080fd5b505af1158015614d09573d6000803e3d6000fd5b505050506123d5614fab565b600054610100900460ff16614dac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401612d91565b6123d533614c16565b606f5460ff16614df1576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052614e9a9084907fa9059cbb000000000000000000000000000000000000000000000000000000009060640161487c565b505050565b6000614f01826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661503e9092919063ffffffff16565b805190915015614e9a5780806020019051810190614f1f9190615dfa565b614e9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401612d91565b606f5460ff1615614fe8576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b606061504d8484600085615055565b949350505050565b6060824710156150e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401612d91565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516151109190615d99565b60006040518083038185875af1925050503d806000811461514d576040519150601f19603f3d011682016040523d82523d6000602084013e615152565b606091505b50915091506151638783838761516e565b979650505050505050565b606083156152045782516000036151fd5773ffffffffffffffffffffffffffffffffffffffff85163b6151fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612d91565b508161504d565b61504d83838151156152195781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9191906152bb565b60005b83811015615268578181015183820152602001615250565b50506000910152565b6000815180845261528981602086016020860161524d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006152ce6020830184615271565b9392505050565b6000602082840312156152e757600080fd5b813561ffff811681146152ce57600080fd5b803567ffffffffffffffff81168114612be857600080fd5b600080600080600060a0868803121561532957600080fd5b615332866152f9565b9450615340602087016152f9565b94979496505050506040830135926060810135926080909101359150565b80610300810183101561537057600080fd5b92915050565b6000806000806000806103a0878903121561539057600080fd5b615399876152f9565b95506153a7602088016152f9565b94506153b5604088016152f9565b935060608701359250608087013591506153d28860a0890161535e565b90509295509295509295565b60008060008060008060006103c0888a0312156153fa57600080fd5b615403886152f9565b9650615411602089016152f9565b955061541f604089016152f9565b945061542d606089016152f9565b93506080880135925060a0880135915061544a8960c08a0161535e565b905092959891949750929550565b60006020828403121561546a57600080fd5b6152ce826152f9565b60008083601f84011261548557600080fd5b50813567ffffffffffffffff81111561549d57600080fd5b6020830191508360208260051b85010111156154b857600080fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612be857600080fd5b6000806000604084860312156154f857600080fd5b833567ffffffffffffffff81111561550f57600080fd5b61551b86828701615473565b909450925061552e9050602085016154bf565b90509250925092565b60006020828403121561554957600080fd5b6152ce826154bf565b60006020828403121561556457600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126155ab57600080fd5b813567ffffffffffffffff808211156155c6576155c661556b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561560c5761560c61556b565b8160405283815286602085880101111561562557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561565757600080fd5b813567ffffffffffffffff81111561566e57600080fd5b61504d8482850161559a565b60008083601f84011261568c57600080fd5b50813567ffffffffffffffff8111156156a457600080fd5b6020830191508360208285010111156154b857600080fd5b6000806000806000808688036101208112156156d757600080fd5b60a08112156156e557600080fd5b5086955060a0870135945060c087013567ffffffffffffffff8082111561570b57600080fd5b6157178a838b0161559a565b955060e089013591508082111561572d57600080fd5b6157398a838b0161559a565b945061010089013591508082111561575057600080fd5b5061575d89828a0161567a565b979a9699509497509295939492505050565b6000806020838503121561578257600080fd5b823567ffffffffffffffff81111561579957600080fd5b6157a585828601615473565b90969095509350505050565b6000806000604084860312156157c657600080fd5b833567ffffffffffffffff8111156157dd57600080fd5b6157e98682870161567a565b909790965060209590950135949350505050565b600181811c9082168061581157607f821691505b60208210810361584a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8181168382160190808211156158a0576158a0615850565b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261590a57600080fd5b9190910192915050565b60006080823603121561592657600080fd5b6040516080810167ffffffffffffffff828210818311171561594a5761594a61556b565b81604052843591508082111561595f57600080fd5b5061596c3682860161559a565b82525060208301356020820152615985604084016152f9565b6040820152615996606084016152f9565b606082015292915050565b600067ffffffffffffffff8083168181036159be576159be615850565b6001019392505050565b6000602082840312156159da57600080fd5b5051919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a1257615a12615850565b5060010190565b67ffffffffffffffff8281168282160390808211156158a0576158a0615850565b8181038181111561537057615370615850565b808202811582820484141761537057615370615850565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615aa257615aa2615a64565b500490565b601f821115614e9a57600081815260208120601f850160051c81016020861015615ace5750805b601f850160051c820191505b81811015615aed57828155600101615ada565b505050505050565b815167ffffffffffffffff811115615b0f57615b0f61556b565b615b2381615b1d84546157fd565b84615aa7565b602080601f831160018114615b765760008415615b405750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555615aed565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615bc357888601518255948401946001909101908401615ba4565b5085821015615bff57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600067ffffffffffffffff808716835280861660208401525060606040830152615c86606083018486615c0f565b9695505050505050565b8082018082111561537057615370615850565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261590a57600080fd5b600060608236031215615ce957600080fd5b6040516060810167ffffffffffffffff8282108183111715615d0d57615d0d61556b565b816040528435915080821115615d2257600080fd5b50615d2f3682860161559a565b82525060208301356020820152615d48604084016152f9565b604082015292915050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000615c86606083018486615c0f565b6000825161590a81846020870161524d565b600082615dba57615dba615a64565b500690565b61032081016103008085843782018360005b6001811015615df0578151835260209283019290910190600101615dd1565b5050509392505050565b600060208284031215615e0c57600080fd5b815180151581146152ce57600080fd5b600067ffffffffffffffff80841680615e3757615e37615a64565b9216919091049291505056fea26469706673582212207c65fe318a797352428af5d61503d4af269ad89de3f139b6d4f4cab38b830bc864736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106103ba5760003560e01c8063841b24d7116101f4578063c754c7ed1161011a578063e7a7ed02116100ad578063f14916d61161007c578063f14916d614610a7e578063f2fde38b14610a91578063f851a44014610aa4578063f8b823e414610ac457600080fd5b8063e7a7ed02146109e7578063e8bf92ed14610a17578063eaeb077b14610a3e578063ed6b010414610a5157600080fd5b8063d2e129f9116100e9578063d2e129f914610991578063d8d1091b146109a4578063d939b315146109b7578063dbc16976146109df57600080fd5b8063c754c7ed146108fc578063c89e42df14610928578063cfa8ed471461093b578063d02103ca1461096a57600080fd5b8063a3c573eb11610192578063b4d63f5811610161578063b4d63f5814610853578063b6b0b097146108ba578063ba58ae39146108e1578063c0ed84e0146108f457600080fd5b8063a3c573eb146107c4578063ada8f919146107eb578063adc879e9146107fe578063afd23cbe1461082557600080fd5b806399f5634e116101ce57806399f5634e146107835780639aa972a31461078b5780639c9f3dfe1461079e578063a066215c146107b157600080fd5b8063841b24d71461072d5780638c3d73011461075d5780638da5cb5b1461076557600080fd5b80634a1a89a7116102e4578063621dd411116102775780637215541a116102465780637215541a1461066a5780637fcb36531461067d578063831c7ead14610691578063837a4738146106b857600080fd5b8063621dd4111461061c5780636b8616ce1461062f5780636ff512cc1461064f578063715018a61461066257600080fd5b8063542028d5116102b3578063542028d5146105f15780635e9145c9146105f95780635ec919581461060c578063604691691461061457600080fd5b80634a1a89a71461057d5780634a910e6a1461059d5780634e487706146105b05780635392c5e0146105c357600080fd5b8063298789831161035c578063394218e91161032b578063394218e91461050e578063423fa856146105215780634560526714610541578063458c04771461056957600080fd5b806329878983146104a95780632b0006fa146104d55780632c1f816a146104e8578063383b3be8146104fb57600080fd5b80631816b7e5116103985780631816b7e51461042857806319d8ac611461043d578063220d789914610451578063267822471461046457600080fd5b80630a0d9fbe146103bf578063107bf28c146103f657806315064c961461040b575b600080fd5b606f546103d890610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6103fe610acd565b6040516103ed91906152bb565b606f546104189060ff1681565b60405190151581526020016103ed565b61043b6104363660046152d5565b610b5b565b005b6073546103d89067ffffffffffffffff1681565b6103fe61045f366004615311565b610c73565b607b546104849073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103ed565b6074546104849068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61043b6104e3366004615376565b610e4a565b61043b6104f63660046153de565b61101a565b610418610509366004615458565b611228565b61043b61051c366004615458565b61127e565b6073546103d89068010000000000000000900467ffffffffffffffff1681565b6073546103d890700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546103d89067ffffffffffffffff1681565b6079546103d89068010000000000000000900467ffffffffffffffff1681565b61043b6105ab366004615458565b611402565b61043b6105be366004615458565b6114b5565b6105e36105d1366004615458565b60756020526000908152604090205481565b6040519081526020016103ed565b6103fe611639565b61043b6106073660046154e3565b611646565b61043b611e50565b6105e3611f50565b61043b61062a366004615376565b611f66565b6105e361063d366004615458565b60716020526000908152604090205481565b61043b61065d366004615537565b6122ee565b61043b6123c3565b61043b610678366004615458565b6123d7565b6074546103d89067ffffffffffffffff1681565b6103d87f000000000000000000000000000000000000000000000000000000000000000081565b6107016106c6366004615552565b60786020526000908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016103ed565b6079546103d8907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61043b612547565b60335473ffffffffffffffffffffffffffffffffffffffff16610484565b6105e3612613565b61043b6107993660046153de565b61276c565b61043b6107ac366004615458565b61281d565b61043b6107bf366004615458565b612999565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b61043b6107f9366004615537565b612a9f565b6103d87f000000000000000000000000000000000000000000000000000000000000000081565b606f54610840906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103ed565b610894610861366004615458565b6072602052600090815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016103ed565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b6104186108ef366004615552565b612b63565b6103d8612bed565b607b546103d89074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b61043b610936366004615645565b612c42565b606f54610484906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b61043b61099f3660046156bc565b612ccf565b61043b6109b236600461576f565b61321a565b6079546103d890700100000000000000000000000000000000900467ffffffffffffffff1681565b61043b6137bc565b6073546103d8907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b61043b610a4c3660046157b1565b613895565b607b54610418907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b61043b610a8c366004615537565b613c8b565b61043b610a9f366004615537565b613d5d565b607a546104849073ffffffffffffffffffffffffffffffffffffffff1681565b6105e360705481565b60778054610ada906157fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610b06906157fd565b8015610b535780601f10610b2857610100808354040283529160200191610b53565b820191906000526020600020905b815481529060010190602001808311610b3657829003601f168201915b505050505081565b607a5473ffffffffffffffffffffffffffffffffffffffff163314610bac576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff161080610bc557506103ff8161ffff16115b15610bfc576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086166000818152607260205260408082205493881682529020546060929115801590610ca7575081155b15610cde576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610d15576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d1e84612b63565b610d54576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610ea7576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610eb5868686868686613e11565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615610f3057607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015610fb857600080fd5b505af1158015610fcc573d6000803e3d6000fd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611077576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611086878787878787876141d5565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092556000908152607560205260409020839055607954161561110157607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b15801561118957600080fd5b505af115801561119d573d6000803e3d6000fd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281166000908152607860205260408120549092429261126c927001000000000000000000000000000000009092048116911661587f565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146112cf576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611316576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166113855760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611385576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610c68565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146114a957606f5460ff161561146a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61147381611228565b6114a9576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114b28161460f565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611506576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561154d576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166115b857607b5467ffffffffffffffff740100000000000000000000000000000000000000009091048116908216106115b8576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001610c68565b60768054610ada906157fd565b606f5460ff1615611683576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146116e3576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600081900361171f576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561175b576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000082048116600081815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b86811015611bab5760008a8a838181106117c3576117c36158a7565b90506020028101906117d591906158d6565b6117de90615914565b8051805160209091012060608201519192509067ffffffffffffffff1615611956578561180a816159a1565b9650506000818360200151846060015160405160200161186293929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a166000908152607190935291205490915081146118eb576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088166000908152607160205260408082209190915560608501519085015190821691161015611950576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611a93565b602082015115801590611a1d575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af11580156119f7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1b91906159c8565b155b15611a54576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611a93576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080611ac6575042826040015167ffffffffffffffff16115b15611afd576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151975050508080611ba3906159e1565b9150506117a7565b50611bb6868561587f565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115611c1f576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611c2b8285615a19565b611c3f9067ffffffffffffffff1688615a3a565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d861660008181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611d3557607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611d87333083607054611d489190615a4d565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190614822565b611d8f614904565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611df757600080fd5b505af1158015611e0b573d6000803e3d6000fd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611ea1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16611efd576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60006070546064611f619190615a4d565b905090565b606f5460ff1615611fa3576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581166000908152607260205260409020600101544292611ff09278010000000000000000000000000000000000000000000000009091048116911661587f565b67ffffffffffffffff161115612032576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e861203f8686615a19565b67ffffffffffffffff161115612081576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61208f868686868686613e11565b612098846149b5565b607954700100000000000000000000000000000000900467ffffffffffffffff166000036121e057607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092556000908152607560205260409020839055607954161561213b57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b1580156121c357600080fd5b505af11580156121d7573d6000803e3d6000fd5b505050506122b0565b6121e8614904565b6079805467ffffffffffffffff16906000612202836159a1565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487166000908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59669060200161100a565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461233f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c68565b6123cb614b95565b6123d56000614c16565b565b60335473ffffffffffffffffffffffffffffffffffffffff16331461253f576000612400612bed565b90508067ffffffffffffffff168267ffffffffffffffff161161244f576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000090910481169083161180612495575067ffffffffffffffff80831660009081526072602052604090206001015416155b156124cc576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff80831660009081526072602052604090206001015442916124fb9162093a80911661587f565b67ffffffffffffffff16111561253d576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6114b2614c8d565b607b5473ffffffffffffffffffffffffffffffffffffffff163314612598576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156126a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c691906159c8565b905060006126d2612bed565b60735467ffffffffffffffff68010000000000000000820481169161272a9170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416615a19565b612734919061587f565b61273e9190615a19565b67ffffffffffffffff1690508060000361275b5760009250505090565b6127658183615a93565b9250505090565b606f5460ff16156127a9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127b8878787878787876141d5565b67ffffffffffffffff84166000908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1612814614c8d565b50505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461286e576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156128b5576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661291c5760795467ffffffffffffffff70010000000000000000000000000000000090910481169082161061291c576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610c68565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146129ea576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff161115612a31576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001610c68565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612af0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c68565b600067ffffffff0000000167ffffffffffffffff8316108015612b9b575067ffffffff00000001604083901c67ffffffffffffffff16105b8015612bbc575067ffffffff00000001608083901c67ffffffffffffffff16105b8015612bd3575067ffffffff0000000160c083901c105b15612be057506001919050565b506000919050565b919050565b60795460009067ffffffffffffffff1615612c31575060795467ffffffffffffffff9081166000908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612c93576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6076612c9f8282615af5565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c6891906152bb565b600054610100900460ff1615808015612cef5750600054600160ff909116105b80612d095750303b158015612d09575060005460ff166001145b612d9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612df857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b612e056020880188615537565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612e5a6040880160208901615537565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055612ebf6080880160608901615537565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790556000805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076612f4a8682615af5565b506077612f578582615af5565b5062093a80612f6c6060890160408a01615458565b67ffffffffffffffff161115612fae576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fbe6060880160408901615458565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a8061302060a0890160808a01615458565b67ffffffffffffffff161115613062576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61307260a0880160808901615458565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613151614d15565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd660007f000000000000000000000000000000000000000000000000000000000000000085856040516131a79493929190615c58565b60405180910390a1801561281457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613277576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16156132b4576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036132f0576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561332c576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff78010000000000000000000000000000000000000000000000008204811691613377918491700100000000000000000000000000000000900416615c90565b11156133af576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000008204811660008181526072602052604081205491937001000000000000000000000000000000009004909216915b8481101561365957600087878381811061340f5761340f6158a7565b90506020028101906134219190615ca3565b61342a90615cd7565b905083613436816159a1565b825180516020918201208185015160408087015190519499509194506000936134989386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260719093529120549091508114613521576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260716020526040812055613546600189615a3a565b84036135b55742607b60149054906101000a900467ffffffffffffffff168460400151613573919061587f565b67ffffffffffffffff1611156135b5576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080613651906159e1565b9150506133f3565b50613664848461587f565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589166000818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461380d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561387557600080fd5b505af1158015613889573d6000803e3d6000fd5b505050506123d5614db5565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16156138f2576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff161561392f576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613939611f50565b905081811115613975576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113888311156139b1576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6139f373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084614822565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a8491906159c8565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16906018613abe836159a1565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051613af5929190615d53565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1660009081526071909352912055323303613c2557607354604080518381523360208201526060918101829052600091810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613c84565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613c7b9493929190615d63565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613cdc576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610c68565b613d65614b95565b73ffffffffffffffffffffffffffffffffffffffff8116613e08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401612d91565b6114b281614c16565b600080613e1c612bed565b905067ffffffffffffffff881615613eec5760795467ffffffffffffffff9081169089161115613e78576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089166000908152607860205260409020600281015481549094509091898116680100000000000000009092041614613ee6576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50613f8d565b67ffffffffffffffff8716600090815260756020526040902054915081613f3f576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115613f8d576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611613fda576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613fe98888888689610c73565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161401e9190615d99565b602060405180830381855afa15801561403b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061405e91906159c8565b6140689190615dab565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916140ea91899190600401615dbf565b602060405180830381865afa158015614107573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061412b9190615dfa565b614161576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6141c93361416f858b615a19565b67ffffffffffffffff16614181612613565b61418b9190615a4d565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190614e44565b50505050505050505050565b600067ffffffffffffffff8816156142a35760795467ffffffffffffffff9081169089161115614231576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff808816600090815260786020526040902060028101548154909288811668010000000000000000909204161461429d576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061433f565b5067ffffffffffffffff8516600090815260756020526040902054806142f5576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff908116908716111561433f576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff908116908816118061437157508767ffffffffffffffff168767ffffffffffffffff1611155b80614398575060795467ffffffffffffffff68010000000000000000909104811690881611155b156143cf576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff878116600090815260786020526040902054680100000000000000009004811690861614614432576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006144418787878588610c73565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516144769190615d99565b602060405180830381855afa158015614493573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906144b691906159c8565b6144c09190615dab565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161454291889190600401615dbf565b602060405180830381865afa15801561455f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145839190615dfa565b6145b9576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89166000908152607860205260409020600201548590036141c9576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff680100000000000000009091048116908216111580614649575060795467ffffffffffffffff908116908216115b15614680576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff818116600081815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b1580156147b257600080fd5b505af11580156147c6573d6000803e3d6000fd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161481591815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526148fe9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614e9f565b50505050565b60795467ffffffffffffffff6801000000000000000082048116911611156123d55760795460009061494d9068010000000000000000900467ffffffffffffffff16600161587f565b905061495881611228565b156114b25760795460009060029061497b90849067ffffffffffffffff16615a19565b6149859190615e1c565b61498f908361587f565b905061499a81611228565b156149ac576149a88161460f565b5050565b6149a88261460f565b60006149bf612bed565b9050816000806149cf8484615a19565b606f5467ffffffffffffffff91821692506000916149f39161010090041642615a3a565b90505b8467ffffffffffffffff168467ffffffffffffffff1614614a7e5767ffffffffffffffff80851660009081526072602052604090206001810154909116821015614a5c57600181015468010000000000000000900467ffffffffffffffff169450614a78565b614a668686615a19565b67ffffffffffffffff16935050614a7e565b506149f6565b6000614a8a8484615a3a565b905083811015614ae157808403600c8111614aa55780614aa8565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281614ad757614ad7615a64565b0460705550614b51565b838103600c8111614af25780614af5565b600c5b90506000816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a76400000281614b2c57614b2c615a64565b04905080607054670de0b6b3a76400000281614b4a57614b4a615a64565b0460705550505b683635c9adc5dea000006070541115614b7657683635c9adc5dea00000607055612814565b633b9aca00607054101561281457633b9aca0060705550505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146123d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612d91565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b158015614cf557600080fd5b505af1158015614d09573d6000803e3d6000fd5b505050506123d5614fab565b600054610100900460ff16614dac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401612d91565b6123d533614c16565b606f5460ff16614df1576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052614e9a9084907fa9059cbb000000000000000000000000000000000000000000000000000000009060640161487c565b505050565b6000614f01826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661503e9092919063ffffffff16565b805190915015614e9a5780806020019051810190614f1f9190615dfa565b614e9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401612d91565b606f5460ff1615614fe8576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b606061504d8484600085615055565b949350505050565b6060824710156150e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401612d91565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516151109190615d99565b60006040518083038185875af1925050503d806000811461514d576040519150601f19603f3d011682016040523d82523d6000602084013e615152565b606091505b50915091506151638783838761516e565b979650505050505050565b606083156152045782516000036151fd5773ffffffffffffffffffffffffffffffffffffffff85163b6151fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612d91565b508161504d565b61504d83838151156152195781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9191906152bb565b60005b83811015615268578181015183820152602001615250565b50506000910152565b6000815180845261528981602086016020860161524d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006152ce6020830184615271565b9392505050565b6000602082840312156152e757600080fd5b813561ffff811681146152ce57600080fd5b803567ffffffffffffffff81168114612be857600080fd5b600080600080600060a0868803121561532957600080fd5b615332866152f9565b9450615340602087016152f9565b94979496505050506040830135926060810135926080909101359150565b80610300810183101561537057600080fd5b92915050565b6000806000806000806103a0878903121561539057600080fd5b615399876152f9565b95506153a7602088016152f9565b94506153b5604088016152f9565b935060608701359250608087013591506153d28860a0890161535e565b90509295509295509295565b60008060008060008060006103c0888a0312156153fa57600080fd5b615403886152f9565b9650615411602089016152f9565b955061541f604089016152f9565b945061542d606089016152f9565b93506080880135925060a0880135915061544a8960c08a0161535e565b905092959891949750929550565b60006020828403121561546a57600080fd5b6152ce826152f9565b60008083601f84011261548557600080fd5b50813567ffffffffffffffff81111561549d57600080fd5b6020830191508360208260051b85010111156154b857600080fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612be857600080fd5b6000806000604084860312156154f857600080fd5b833567ffffffffffffffff81111561550f57600080fd5b61551b86828701615473565b909450925061552e9050602085016154bf565b90509250925092565b60006020828403121561554957600080fd5b6152ce826154bf565b60006020828403121561556457600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126155ab57600080fd5b813567ffffffffffffffff808211156155c6576155c661556b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561560c5761560c61556b565b8160405283815286602085880101111561562557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561565757600080fd5b813567ffffffffffffffff81111561566e57600080fd5b61504d8482850161559a565b60008083601f84011261568c57600080fd5b50813567ffffffffffffffff8111156156a457600080fd5b6020830191508360208285010111156154b857600080fd5b6000806000806000808688036101208112156156d757600080fd5b60a08112156156e557600080fd5b5086955060a0870135945060c087013567ffffffffffffffff8082111561570b57600080fd5b6157178a838b0161559a565b955060e089013591508082111561572d57600080fd5b6157398a838b0161559a565b945061010089013591508082111561575057600080fd5b5061575d89828a0161567a565b979a9699509497509295939492505050565b6000806020838503121561578257600080fd5b823567ffffffffffffffff81111561579957600080fd5b6157a585828601615473565b90969095509350505050565b6000806000604084860312156157c657600080fd5b833567ffffffffffffffff8111156157dd57600080fd5b6157e98682870161567a565b909790965060209590950135949350505050565b600181811c9082168061581157607f821691505b60208210810361584a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8181168382160190808211156158a0576158a0615850565b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261590a57600080fd5b9190910192915050565b60006080823603121561592657600080fd5b6040516080810167ffffffffffffffff828210818311171561594a5761594a61556b565b81604052843591508082111561595f57600080fd5b5061596c3682860161559a565b82525060208301356020820152615985604084016152f9565b6040820152615996606084016152f9565b606082015292915050565b600067ffffffffffffffff8083168181036159be576159be615850565b6001019392505050565b6000602082840312156159da57600080fd5b5051919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a1257615a12615850565b5060010190565b67ffffffffffffffff8281168282160390808211156158a0576158a0615850565b8181038181111561537057615370615850565b808202811582820484141761537057615370615850565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615aa257615aa2615a64565b500490565b601f821115614e9a57600081815260208120601f850160051c81016020861015615ace5750805b601f850160051c820191505b81811015615aed57828155600101615ada565b505050505050565b815167ffffffffffffffff811115615b0f57615b0f61556b565b615b2381615b1d84546157fd565b84615aa7565b602080601f831160018114615b765760008415615b405750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555615aed565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615bc357888601518255948401946001909101908401615ba4565b5085821015615bff57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600067ffffffffffffffff808716835280861660208401525060606040830152615c86606083018486615c0f565b9695505050505050565b8082018082111561537057615370615850565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261590a57600080fd5b600060608236031215615ce957600080fd5b6040516060810167ffffffffffffffff8282108183111715615d0d57615d0d61556b565b816040528435915080821115615d2257600080fd5b50615d2f3682860161559a565b82525060208301356020820152615d48604084016152f9565b604082015292915050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000615c86606083018486615c0f565b6000825161590a81846020870161524d565b600082615dba57615dba615a64565b500690565b61032081016103008085843782018360005b6001811015615df0578151835260209283019290910190600101615dd1565b5050509392505050565b600060208284031215615e0c57600080fd5b815180151581146152ce57600080fd5b600067ffffffffffffffff80841680615e3757615e37615a64565b9216919091049291505056fea26469706673582212207c65fe318a797352428af5d61503d4af269ad89de3f139b6d4f4cab38b830bc864736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMBridge.json b/compiled-contracts/paris/PolygonZkEVMBridge.json index b2013552c..b10a58ab2 100644 --- a/compiled-contracts/paris/PolygonZkEVMBridge.json +++ b/compiled-contracts/paris/PolygonZkEVMBridge.json @@ -776,8 +776,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b5061470f806100206000396000f3fe608060405260043610620001285760003560e01c806315064c96146200012d5780632072f6c5146200015e57806322e95f2c1462000178578063240ff37814620001ac5780632cffd02e14620001c35780632d2c9d9414620001e85780632dfdf0b5146200020d578063318aee3d146200023457806334ac9cf214620002a25780633ae0504714620002c45780633e19704314620002dc578063647c576c146200030157806379e2cf97146200032657806381b1c174146200033e5780639e34070f1462000378578063aaa13cc214620003bd578063bab161bf14620003e2578063be5831c7146200041c578063cd5865791462000442578063d02103ca1462000459578063dbc169761462000482578063ee25560b146200049a578063fb57083414620004cb575b600080fd5b3480156200013a57600080fd5b50606854620001499060ff1681565b60405190151581526020015b60405180910390f35b3480156200016b57600080fd5b5062000176620004f0565b005b3480156200018557600080fd5b506200019d62000197366004620023cc565b62000528565b60405162000155919062002408565b62000176620001bd36600462002476565b6200057b565b348015620001d057600080fd5b5062000176620001e23660046200250c565b62000691565b348015620001f557600080fd5b5062000176620002073660046200250c565b62000a84565b3480156200021a57600080fd5b506200022560535481565b60405190815260200162000155565b3480156200024157600080fd5b506200027d62000253366004620025f1565b606b6020526000908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b0390911660208301520162000155565b348015620002af57600080fd5b50606c546200019d906001600160a01b031681565b348015620002d157600080fd5b506200022562000bc2565b348015620002e957600080fd5b5062000225620002fb36600462002628565b62000caa565b3480156200030e57600080fd5b506200017662000320366004620026b2565b62000d37565b3480156200033357600080fd5b506200017662000ebb565b3480156200034b57600080fd5b506200019d6200035d36600462002702565b606a602052600090815260409020546001600160a01b031681565b3480156200038557600080fd5b50620001496200039736600462002702565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b348015620003ca57600080fd5b506200019d620003dc3660046200271c565b62000edf565b348015620003ef57600080fd5b506068546200040690610100900463ffffffff1681565b60405163ffffffff909116815260200162000155565b3480156200042957600080fd5b506068546200040690600160c81b900463ffffffff1681565b6200017662000453366004620027cf565b62000ff6565b3480156200046657600080fd5b506068546200019d90600160281b90046001600160a01b031681565b3480156200048f57600080fd5b50620001766200138c565b348015620004a757600080fd5b5062000225620004b936600462002702565b60696020526000908152604090205481565b348015620004d857600080fd5b5062000149620004ea36600462002870565b620013c2565b606c546001600160a01b031633146200051c5760405163e2e8106b60e01b815260040160405180910390fd5b620005266200149b565b565b6000606a6000848460405160200162000543929190620028bd565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b60685460ff1615620005a057604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161480620005c65750600263ffffffff861610155b15620005e5576040516302caf51760e11b815260040160405180910390fd5b6000805160206200469a8339815191526001606860019054906101000a900463ffffffff163388883488886053546040516200062a9998979695949392919062002910565b60405180910390a162000679620006736001606860019054906101000a900463ffffffff16338989348989604051620006659291906200297f565b604051809103902062000caa565b620014f8565b82156200068a576200068a620015f6565b5050505050565b60685460ff1615620006b657604051630bc011ff60e21b815260040160405180910390fd5b620006cd8b8b8b8b8b8b8b8b8b8b8b60006200168e565b6001600160a01b0386166200077657604080516000808252602082019092526001600160a01b038616908590604051620007089190620029cb565b60006040518083038185875af1925050503d806000811462000747576040519150601f19603f3d011682016040523d82523d6000602084013e6200074c565b606091505b50509050806200076f57604051630ce8f45160e31b815260040160405180910390fd5b5062000a47565b60685463ffffffff610100909104811690881603620007ab57620007a56001600160a01b0387168585620017f7565b62000a47565b60008787604051602001620007c2929190620028bd565b60408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b031680620009df57600080806200080b8688018862002aa2565b925092509250600085848484604051620008259062002390565b620008339392919062002b45565b8190604051809103906000f590508015801562000854573d6000803e3d6000fd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f199062000888908d908d9060040162002b82565b600060405180830381600087803b158015620008a357600080fd5b505af1158015620008b8573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b604051620009cd95949392919062002b9b565b60405180910390a15050505062000a44565b6040516340c10f1960e01b81526001600160a01b038216906340c10f199062000a0f908990899060040162002b82565b600060405180830381600087803b15801562000a2a57600080fd5b505af115801562000a3f573d6000803e3d6000fd5b505050505b50505b600080516020620046ba8339815191528a8888878760405162000a6f95949392919062002bd6565b60405180910390a15050505050505050505050565b60685460ff161562000aa957604051630bc011ff60e21b815260040160405180910390fd5b62000ac08b8b8b8b8b8b8b8b8b8b8b60016200168e565b6000846001600160a01b031684888a868660405160240162000ae6949392919062002c0d565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162000b1d9190620029cb565b60006040518083038185875af1925050503d806000811462000b5c576040519150601f19603f3d011682016040523d82523d6000602084013e62000b61565b606091505b505090508062000b84576040516337e391c360e01b815260040160405180910390fd5b600080516020620046ba8339815191528b8989888860405162000bac95949392919062002bd6565b60405180910390a1505050505050505050505050565b605354600090819081805b602081101562000ca1578083901c60011660010362000c30576033816020811062000bfc5762000bfc62002c4a565b01548460405160200162000c1292919062002c60565b60405160208183030381529060405280519060200120935062000c5e565b838260405160200162000c4592919062002c60565b6040516020818303038152906040528051906020012093505b818260405160200162000c7392919062002c60565b604051602081830303815290604052805190602001209150808062000c989062002c84565b91505062000bcd565b50919392505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b600054610100900460ff161580801562000d585750600054600160ff909116105b8062000d7d575062000d6a3062001851565b15801562000d7d575060005460ff166001145b62000de65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000e0a576000805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff871602600160281b600160c81b03191617600160281b6001600160a01b038681169190910291909117909155606c80546001600160a01b03191691841691909117905562000e6e62001860565b801562000eb5576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854600160c81b900463ffffffff161015620005265762000526620015f6565b600080888860405160200162000ef7929190620028bd565b604051602081830303815290604052805190602001209050600060ff60f81b30836040518060200162000f2a9062002390565b601f1982820381018352601f90910116604081905262000f57908d908d908d908d908d9060200162002ca0565b60408051601f198184030181529082905262000f77929160200162002ce1565b6040516020818303038152906040528051906020012060405160200162000fd094939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b60685460ff16156200101b57604051630bc011ff60e21b815260040160405180910390fd5b6200102562001894565b60685463ffffffff8881166101009092041614806200104b5750600263ffffffff881610155b156200106a576040516302caf51760e11b815260040160405180910390fd5b6000806060876001600160a01b038816620010aa57883414620010a05760405163b89240f560e01b815260040160405180910390fd5b600092506200130e565b3415620010ca5760405163798ee6f160e01b815260040160405180910390fd5b6001600160a01b038089166000908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b900490921691810182905290156200118857604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac90620011409033908e9060040162002b82565b600060405180830381600087803b1580156200115b57600080fd5b505af115801562001170573d6000803e3d6000fd5b5050505080602001519450806000015193506200130c565b85156200119d576200119d898b8989620018ef565b6040516370a0823160e01b81526000906001600160a01b038b16906370a0823190620011ce90309060040162002408565b602060405180830381865afa158015620011ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001212919062002d14565b90506200122b6001600160a01b038b1633308e62001c51565b6040516370a0823160e01b81526000906001600160a01b038c16906370a08231906200125c90309060040162002408565b602060405180830381865afa1580156200127a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012a0919062002d14565b9050620012ae828262002d2e565b6068548c9850610100900463ffffffff1696509350620012ce8762001c8b565b620012d98c62001d52565b620012e48d62001e10565b604051602001620012f89392919062002b45565b604051602081830303815290604052945050505b505b6000805160206200469a833981519152600084868e8e86886053546040516200133f98979695949392919062002d44565b60405180910390a16200136462000673600085878f8f87898051906020012062000caa565b8615620013755762001375620015f6565b505050506200138360018055565b50505050505050565b606c546001600160a01b03163314620013b85760405163e2e8106b60e01b815260040160405180910390fd5b6200052662001ed7565b600084815b60208110156200148d57600163ffffffff8616821c811690036200143157858160208110620013fa57620013fa62002c4a565b6020020135826040516020016200141392919062002c60565b60405160208183030381529060405280519060200120915062001478565b8186826020811062001447576200144762002c4a565b60200201356040516020016200145f92919062002c60565b6040516020818303038152906040528051906020012091505b80620014848162002c84565b915050620013c7565b50821490505b949350505050565b60685460ff1615620014c057604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b806001620015096020600262002eae565b62001515919062002d2e565b6053541062001537576040516377ae67b360e11b815260040160405180910390fd5b60006053600081546200154a9062002c84565b9182905550905060005b6020811015620015e6578082901c6001166001036200158c57826033826020811062001584576200158462002c4a565b015550505050565b60338160208110620015a257620015a262002c4a565b015483604051602001620015b892919062002c60565b6040516020818303038152906040528051906020012092508080620015dd9062002c84565b91505062001554565b50620015f162002ebc565b505050565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d6200163f62000bc2565b6040518263ffffffff1660e01b81526004016200165e91815260200190565b600060405180830381600087803b1580156200167957600080fd5b505af115801562000eb5573d6000803e3d6000fd5b6200169f8b63ffffffff1662001f30565b606854600090600160281b90046001600160a01b031663257b3632620016c68d8d62001f7c565b6040518263ffffffff1660e01b8152600401620016e591815260200190565b6020604051808303816000875af115801562001705573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200172b919062002d14565b9050806000036200174e57604051622f6fad60e01b815260040160405180910390fd5b60685463ffffffff88811661010090920416146200177f576040516302caf51760e11b815260040160405180910390fd5b606854600090610100900463ffffffff166200179d575089620017a0565b508a5b620017c9620017c0848c8c8c8c8c8c8c604051620006659291906200297f565b8f8f84620013c2565b620017e7576040516338105f3b60e21b815260040160405180910390fd5b5050505050505050505050505050565b620015f18363a9059cbb60e01b84846040516024016200181992919062002b82565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262001fb1565b6001600160a01b03163b151590565b600054610100900460ff166200188a5760405162461bcd60e51b815260040162000ddd9062002ed2565b620005266200208a565b600260015403620018e85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000ddd565b6002600155565b600062001900600482848662002f1d565b6200190b9162002f49565b9050632afa533160e01b6001600160e01b031982160162001aac5760008080808080806200193d896004818d62002f1d565b8101906200194c919062002f7a565b9650965096509650965096509650336001600160a01b0316876001600160a01b0316146200198d5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0386163014620019b75760405163750643af60e01b815260040160405180910390fd5b8a8514620019d8576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e169162001a589190620029cb565b6000604051808303816000865af19150503d806000811462001a97576040519150601f19603f3d011682016040523d82523d6000602084013e62001a9c565b606091505b505050505050505050506200068a565b6001600160e01b031981166323f2ebc360e21b1462001ade57604051637141605d60e11b815260040160405180910390fd5b60008080808080808062001af68a6004818e62002f1d565b81019062001b05919062002fd5565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462001b485760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038716301462001b725760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169162001bfb9190620029cb565b6000604051808303816000865af19150503d806000811462001c3a576040519150601f19603f3d011682016040523d82523d6000602084013e62001c3f565b606091505b50505050505050505050505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905262000eb59085906323b872dd60e01b9060840162001819565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009182916001600160a01b0386169162001cd49190620029cb565b600060405180830381855afa9150503d806000811462001d11576040519150601f19603f3d011682016040523d82523d6000602084013e62001d16565b606091505b50915091508162001d4757604051806040016040528060078152602001664e4f5f4e414d4560c81b81525062001493565b6200149381620020b4565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009182916001600160a01b0386169162001d9b9190620029cb565b600060405180830381855afa9150503d806000811462001dd8576040519150601f19603f3d011682016040523d82523d6000602084013e62001ddd565b606091505b50915091508162001d4757604051806040016040528060098152602001681393d7d4d6535093d360ba1b81525062001493565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b0386169162001e589190620029cb565b600060405180830381855afa9150503d806000811462001e95576040519150601f19603f3d011682016040523d82523d6000602084013e62001e9a565b606091505b509150915081801562001eae575080516020145b62001ebb57601262001493565b8080602001905181019062001493919062003061565b60018055565b60685460ff1662001efb57604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600881901c60008181526069602052604081208054600160ff861690811b918218928390559290919081831690036200068a57604051630c8d9eab60e31b815260040160405180910390fd5b6000828260405160200162001f9392919062002c60565b60405160208183030381529060405280519060200120905092915050565b600062002008826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200225d9092919063ffffffff16565b805190915015620015f1578080602001905181019062002029919062003081565b620015f15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000ddd565b600054610100900460ff1662001ed15760405162461bcd60e51b815260040162000ddd9062002ed2565b60606040825110620020d65781806020019051810190620005759190620030a1565b81516020036200222a5760005b60208110801562002116575082818151811062002104576200210462002c4a565b01602001516001600160f81b03191615155b15620021315780620021288162002c84565b915050620020e3565b806000036200216a5750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b6000816001600160401b038111156200218757620021876200298f565b6040519080825280601f01601f191660200182016040528015620021b2576020820181803683370190505b50905060005b828110156200222257848181518110620021d657620021d662002c4a565b602001015160f81c60f81b828281518110620021f657620021f662002c4a565b60200101906001600160f81b031916908160001a90535080620022198162002c84565b915050620021b8565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b606062001493848460008585600080866001600160a01b03168587604051620022879190620029cb565b60006040518083038185875af1925050503d8060008114620022c6576040519150601f19603f3d011682016040523d82523d6000602084013e620022cb565b606091505b5091509150620022de87838387620022e9565b979650505050505050565b606083156200235d5782516000036200235557620023078562001851565b620023555760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000ddd565b508162001493565b620014938383815115620023745781518083602001fd5b8060405162461bcd60e51b815260040162000ddd919062003120565b611564806200313683390190565b803563ffffffff811681146200225857600080fd5b6001600160a01b0381168114620023c957600080fd5b50565b60008060408385031215620023e057600080fd5b620023eb836200239e565b91506020830135620023fd81620023b3565b809150509250929050565b6001600160a01b0391909116815260200190565b8015158114620023c957600080fd5b60008083601f8401126200243e57600080fd5b5081356001600160401b038111156200245657600080fd5b6020830191508360208285010111156200246f57600080fd5b9250929050565b6000806000806000608086880312156200248f57600080fd5b6200249a866200239e565b94506020860135620024ac81620023b3565b93506040860135620024be816200241c565b925060608601356001600160401b03811115620024da57600080fd5b620024e8888289016200242b565b969995985093965092949392505050565b8061040081018310156200057557600080fd5b60008060008060008060008060008060006105208c8e0312156200252f57600080fd5b6200253b8d8d620024f9565b9a506200254c6104008d016200239e565b99506104208c013598506104408c013597506200256d6104608d016200239e565b96506104808c01356200258081620023b3565b9550620025916104a08d016200239e565b94506104c08c0135620025a481620023b3565b93506104e08c013592506105008c01356001600160401b03811115620025c957600080fd5b620025d78e828f016200242b565b915080935050809150509295989b509295989b9093969950565b6000602082840312156200260457600080fd5b81356200261181620023b3565b9392505050565b60ff81168114620023c957600080fd5b600080600080600080600060e0888a0312156200264457600080fd5b8735620026518162002618565b965062002661602089016200239e565b955060408801356200267381620023b3565b945062002683606089016200239e565b935060808801356200269581620023b3565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215620026c857600080fd5b620026d3846200239e565b92506020840135620026e581620023b3565b91506040840135620026f781620023b3565b809150509250925092565b6000602082840312156200271557600080fd5b5035919050565b600080600080600080600060a0888a0312156200273857600080fd5b62002743886200239e565b965060208801356200275581620023b3565b955060408801356001600160401b03808211156200277257600080fd5b620027808b838c016200242b565b909750955060608a01359150808211156200279a57600080fd5b50620027a98a828b016200242b565b9094509250506080880135620027bf8162002618565b8091505092959891949750929550565b600080600080600080600060c0888a031215620027eb57600080fd5b620027f6886200239e565b965060208801356200280881620023b3565b95506040880135945060608801356200282181620023b3565b9350608088013562002833816200241c565b925060a08801356001600160401b038111156200284f57600080fd5b6200285d8a828b016200242b565b989b979a50959850939692959293505050565b60008060008061046085870312156200288857600080fd5b843593506200289b8660208701620024f9565b9250620028ac61042086016200239e565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c08301819052600091620029658483018789620028e7565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620029c2578181015183820152602001620029a8565b50506000910152565b60008251620029df818460208701620029a5565b9190910192915050565b604051601f8201601f191681016001600160401b038111828210171562002a145762002a146200298f565b604052919050565b60006001600160401b0382111562002a385762002a386200298f565b50601f01601f191660200190565b600082601f83011262002a5857600080fd5b813562002a6f62002a698262002a1c565b620029e9565b81815284602083860101111562002a8557600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562002ab857600080fd5b83356001600160401b038082111562002ad057600080fd5b62002ade8783880162002a46565b9450602086013591508082111562002af557600080fd5b5062002b048682870162002a46565b9250506040840135620026f78162002618565b6000815180845262002b31816020860160208601620029a5565b601f01601f19169290920160200192915050565b60608152600062002b5a606083018662002b17565b828103602084015262002b6e818662002b17565b91505060ff83166040830152949350505050565b6001600160a01b03929092168252602082015260400190565b63ffffffff861681526001600160a01b03858116602083015284166040820152608060608201819052600090620022de9083018486620028e7565b63ffffffff95861681529390941660208401526001600160a01b039182166040840152166060820152608081019190915260a00190565b6001600160a01b038516815263ffffffff8416602082015260606040820181905260009062002c409083018486620028e7565b9695505050505050565b634e487b7160e01b600052603260045260246000fd5b918252602082015260400190565b634e487b7160e01b600052601160045260246000fd5b60006001820162002c995762002c9962002c6e565b5060010190565b60608152600062002cb6606083018789620028e7565b828103602084015262002ccb818688620028e7565b91505060ff831660408301529695505050505050565b6000835162002cf5818460208801620029a5565b83519083019062002d0b818360208801620029a5565b01949350505050565b60006020828403121562002d2757600080fd5b5051919050565b8181038181111562000575576200057562002c6e565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c0830181905260009162002d988483018762002b17565b925080851660e085015250509998505050505050505050565b600181815b8085111562002df257816000190482111562002dd65762002dd662002c6e565b8085161562002de457918102915b93841c939080029062002db6565b509250929050565b60008262002e0b5750600162000575565b8162002e1a5750600062000575565b816001811462002e33576002811462002e3e5762002e5e565b600191505062000575565b60ff84111562002e525762002e5262002c6e565b50506001821b62000575565b5060208310610133831016604e8410600b841016171562002e83575081810a62000575565b62002e8f838362002db1565b806000190482111562002ea65762002ea662002c6e565b029392505050565b600062002611838362002dfa565b634e487b7160e01b600052600160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000808585111562002f2e57600080fd5b8386111562002f3c57600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101562002f725780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a03121562002f9657600080fd5b873562002fa381620023b3565b9650602088013562002fb581620023b3565b955060408801359450606088013593506080880135620026958162002618565b600080600080600080600080610100898b03121562002ff357600080fd5b88356200300081620023b3565b975060208901356200301281620023b3565b96506040890135955060608901359450608089013562003032816200241c565b935060a0890135620030448162002618565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200307457600080fd5b8151620026118162002618565b6000602082840312156200309457600080fd5b815162002611816200241c565b600060208284031215620030b457600080fd5b81516001600160401b03811115620030cb57600080fd5b8201601f81018413620030dd57600080fd5b8051620030ee62002a698262002a1c565b8181528560208385010111156200310457600080fd5b62003117826020830160208601620029a5565b95945050505050565b60208152600062002611602083018462002b1756fe6101006040523480156200001257600080fd5b50604051620015643803806200156483398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516110a8620004bc60003960006101a30152600081816102660152818161048c01526104fa0152600061043d0152600081816102cb015261040701526110a86000f3fe608060405234801561001057600080fd5b50600436106101075760003560e01c806306fdde031461010c578063095ea7b31461012a57806318160ddd1461014d57806320606b701461015f57806323b872dd1461017457806330adf81f14610187578063313ce5671461019c5780633644e515146101cd57806339509351146101d557806340c10f19146101e857806370a08231146101fd5780637ecebe001461022657806395d89b41146102465780639dc29fac1461024e578063a3c573eb14610261578063a457c2d7146102a0578063a9059cbb146102b3578063cd0d0096146102c6578063d505accf146102ed578063dd62ed3e14610300578063ffa1ad7414610313575b600080fd5b610114610333565b6040516101219190610dae565b60405180910390f35b61013d610138366004610e18565b6103c5565b6040519015158152602001610121565b6002545b604051908152602001610121565b61015160008051602061105383398151915281565b61013d610182366004610e42565b6103df565b61015160008051602061103383398151915281565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610121565b610151610403565b61013d6101e3366004610e18565b61045f565b6101fb6101f6366004610e18565b610481565b005b61015161020b366004610e7e565b6001600160a01b031660009081526020819052604090205490565b610151610234366004610e7e565b60056020526000908152604090205481565b6101146104e0565b6101fb61025c366004610e18565b6104ef565b6102887f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610121565b61013d6102ae366004610e18565b610541565b61013d6102c1366004610e18565b6105bc565b6101517f000000000000000000000000000000000000000000000000000000000000000081565b6101fb6102fb366004610ea0565b6105ca565b61015161030e366004610f13565b6107f3565b610114604051806040016040528060018152602001603160f81b81525081565b60606003805461034290610f46565b80601f016020809104026020016040519081016040528092919081815260200182805461036e90610f46565b80156103bb5780601f10610390576101008083540402835291602001916103bb565b820191906000526020600020905b81548152906001019060200180831161039e57829003601f168201915b5050505050905090565b6000336103d381858561081e565b60019150505b92915050565b6000336103ed858285610943565b6103f88585856109bd565b506001949350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461461043a5761043546610b4f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000336103d381858561047283836107f3565b61047c9190610f96565b61081e565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104d25760405162461bcd60e51b81526004016104c990610fa9565b60405180910390fd5b6104dc8282610be9565b5050565b60606004805461034290610f46565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105375760405162461bcd60e51b81526004016104c990610fa9565b6104dc8282610c96565b6000338161054f82866107f3565b9050838110156105af5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104c9565b6103f8828686840361081e565b6000336103d38185856109bd565b834211156106265760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104c9565b6001600160a01b03871660009081526005602052604081208054600080516020611033833981519152918a918a918a91908661066183610ff9565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006106bf610403565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa15801561074a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906107805750896001600160a01b0316816001600160a01b0316145b6107dc5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104c9565b6107e78a8a8a61081e565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166108805760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104c9565b6001600160a01b0382166108e15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104c9565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600061094f84846107f3565b905060001981146109b757818110156109aa5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104c9565b6109b7848484840361081e565b50505050565b6001600160a01b038316610a215760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104c9565b6001600160a01b038216610a835760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104c9565b6001600160a01b03831660009081526020819052604090205481811015610afb5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104c9565b6001600160a01b0384811660008181526020818152604080832087870390559387168083529184902080548701905592518581529092600080516020611013833981519152910160405180910390a36109b7565b6000600080516020611053833981519152610b68610333565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c3f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104c9565b8060026000828254610c519190610f96565b90915550506001600160a01b03821660008181526020818152604080832080548601905551848152600080516020611013833981519152910160405180910390a35050565b6001600160a01b038216610cf65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104c9565b6001600160a01b03821660009081526020819052604090205481811015610d6a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104c9565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192916000805160206110138339815191529101610936565b600060208083528351808285015260005b81811015610ddb57858101830151858201604001528201610dbf565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610e1357600080fd5b919050565b60008060408385031215610e2b57600080fd5b610e3483610dfc565b946020939093013593505050565b600080600060608486031215610e5757600080fd5b610e6084610dfc565b9250610e6e60208501610dfc565b9150604084013590509250925092565b600060208284031215610e9057600080fd5b610e9982610dfc565b9392505050565b600080600080600080600060e0888a031215610ebb57600080fd5b610ec488610dfc565b9650610ed260208901610dfc565b95506040880135945060608801359350608088013560ff81168114610ef657600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f2657600080fd5b610f2f83610dfc565b9150610f3d60208401610dfc565b90509250929050565b600181811c90821680610f5a57607f821691505b602082108103610f7a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156103d9576103d9610f80565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b60006001820161100b5761100b610f80565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa26469706673582212203ea4a1224be7b5ef35dc397dfc81433d85cd6fdbf17d8b2e3d528071e7e612b564736f6c63430008140033501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe27545983a2646970667358221220baee82e4ee7f164b3d1e7f66a5c387364d25480bb9d2b43835d64170d591672664736f6c63430008140033", - "deployedBytecode": "0x608060405260043610620001285760003560e01c806315064c96146200012d5780632072f6c5146200015e57806322e95f2c1462000178578063240ff37814620001ac5780632cffd02e14620001c35780632d2c9d9414620001e85780632dfdf0b5146200020d578063318aee3d146200023457806334ac9cf214620002a25780633ae0504714620002c45780633e19704314620002dc578063647c576c146200030157806379e2cf97146200032657806381b1c174146200033e5780639e34070f1462000378578063aaa13cc214620003bd578063bab161bf14620003e2578063be5831c7146200041c578063cd5865791462000442578063d02103ca1462000459578063dbc169761462000482578063ee25560b146200049a578063fb57083414620004cb575b600080fd5b3480156200013a57600080fd5b50606854620001499060ff1681565b60405190151581526020015b60405180910390f35b3480156200016b57600080fd5b5062000176620004f0565b005b3480156200018557600080fd5b506200019d62000197366004620023cc565b62000528565b60405162000155919062002408565b62000176620001bd36600462002476565b6200057b565b348015620001d057600080fd5b5062000176620001e23660046200250c565b62000691565b348015620001f557600080fd5b5062000176620002073660046200250c565b62000a84565b3480156200021a57600080fd5b506200022560535481565b60405190815260200162000155565b3480156200024157600080fd5b506200027d62000253366004620025f1565b606b6020526000908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b0390911660208301520162000155565b348015620002af57600080fd5b50606c546200019d906001600160a01b031681565b348015620002d157600080fd5b506200022562000bc2565b348015620002e957600080fd5b5062000225620002fb36600462002628565b62000caa565b3480156200030e57600080fd5b506200017662000320366004620026b2565b62000d37565b3480156200033357600080fd5b506200017662000ebb565b3480156200034b57600080fd5b506200019d6200035d36600462002702565b606a602052600090815260409020546001600160a01b031681565b3480156200038557600080fd5b50620001496200039736600462002702565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b348015620003ca57600080fd5b506200019d620003dc3660046200271c565b62000edf565b348015620003ef57600080fd5b506068546200040690610100900463ffffffff1681565b60405163ffffffff909116815260200162000155565b3480156200042957600080fd5b506068546200040690600160c81b900463ffffffff1681565b6200017662000453366004620027cf565b62000ff6565b3480156200046657600080fd5b506068546200019d90600160281b90046001600160a01b031681565b3480156200048f57600080fd5b50620001766200138c565b348015620004a757600080fd5b5062000225620004b936600462002702565b60696020526000908152604090205481565b348015620004d857600080fd5b5062000149620004ea36600462002870565b620013c2565b606c546001600160a01b031633146200051c5760405163e2e8106b60e01b815260040160405180910390fd5b620005266200149b565b565b6000606a6000848460405160200162000543929190620028bd565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b60685460ff1615620005a057604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161480620005c65750600263ffffffff861610155b15620005e5576040516302caf51760e11b815260040160405180910390fd5b6000805160206200469a8339815191526001606860019054906101000a900463ffffffff163388883488886053546040516200062a9998979695949392919062002910565b60405180910390a162000679620006736001606860019054906101000a900463ffffffff16338989348989604051620006659291906200297f565b604051809103902062000caa565b620014f8565b82156200068a576200068a620015f6565b5050505050565b60685460ff1615620006b657604051630bc011ff60e21b815260040160405180910390fd5b620006cd8b8b8b8b8b8b8b8b8b8b8b60006200168e565b6001600160a01b0386166200077657604080516000808252602082019092526001600160a01b038616908590604051620007089190620029cb565b60006040518083038185875af1925050503d806000811462000747576040519150601f19603f3d011682016040523d82523d6000602084013e6200074c565b606091505b50509050806200076f57604051630ce8f45160e31b815260040160405180910390fd5b5062000a47565b60685463ffffffff610100909104811690881603620007ab57620007a56001600160a01b0387168585620017f7565b62000a47565b60008787604051602001620007c2929190620028bd565b60408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b031680620009df57600080806200080b8688018862002aa2565b925092509250600085848484604051620008259062002390565b620008339392919062002b45565b8190604051809103906000f590508015801562000854573d6000803e3d6000fd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f199062000888908d908d9060040162002b82565b600060405180830381600087803b158015620008a357600080fd5b505af1158015620008b8573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b604051620009cd95949392919062002b9b565b60405180910390a15050505062000a44565b6040516340c10f1960e01b81526001600160a01b038216906340c10f199062000a0f908990899060040162002b82565b600060405180830381600087803b15801562000a2a57600080fd5b505af115801562000a3f573d6000803e3d6000fd5b505050505b50505b600080516020620046ba8339815191528a8888878760405162000a6f95949392919062002bd6565b60405180910390a15050505050505050505050565b60685460ff161562000aa957604051630bc011ff60e21b815260040160405180910390fd5b62000ac08b8b8b8b8b8b8b8b8b8b8b60016200168e565b6000846001600160a01b031684888a868660405160240162000ae6949392919062002c0d565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162000b1d9190620029cb565b60006040518083038185875af1925050503d806000811462000b5c576040519150601f19603f3d011682016040523d82523d6000602084013e62000b61565b606091505b505090508062000b84576040516337e391c360e01b815260040160405180910390fd5b600080516020620046ba8339815191528b8989888860405162000bac95949392919062002bd6565b60405180910390a1505050505050505050505050565b605354600090819081805b602081101562000ca1578083901c60011660010362000c30576033816020811062000bfc5762000bfc62002c4a565b01548460405160200162000c1292919062002c60565b60405160208183030381529060405280519060200120935062000c5e565b838260405160200162000c4592919062002c60565b6040516020818303038152906040528051906020012093505b818260405160200162000c7392919062002c60565b604051602081830303815290604052805190602001209150808062000c989062002c84565b91505062000bcd565b50919392505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b600054610100900460ff161580801562000d585750600054600160ff909116105b8062000d7d575062000d6a3062001851565b15801562000d7d575060005460ff166001145b62000de65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000e0a576000805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff871602600160281b600160c81b03191617600160281b6001600160a01b038681169190910291909117909155606c80546001600160a01b03191691841691909117905562000e6e62001860565b801562000eb5576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854600160c81b900463ffffffff161015620005265762000526620015f6565b600080888860405160200162000ef7929190620028bd565b604051602081830303815290604052805190602001209050600060ff60f81b30836040518060200162000f2a9062002390565b601f1982820381018352601f90910116604081905262000f57908d908d908d908d908d9060200162002ca0565b60408051601f198184030181529082905262000f77929160200162002ce1565b6040516020818303038152906040528051906020012060405160200162000fd094939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b60685460ff16156200101b57604051630bc011ff60e21b815260040160405180910390fd5b6200102562001894565b60685463ffffffff8881166101009092041614806200104b5750600263ffffffff881610155b156200106a576040516302caf51760e11b815260040160405180910390fd5b6000806060876001600160a01b038816620010aa57883414620010a05760405163b89240f560e01b815260040160405180910390fd5b600092506200130e565b3415620010ca5760405163798ee6f160e01b815260040160405180910390fd5b6001600160a01b038089166000908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b900490921691810182905290156200118857604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac90620011409033908e9060040162002b82565b600060405180830381600087803b1580156200115b57600080fd5b505af115801562001170573d6000803e3d6000fd5b5050505080602001519450806000015193506200130c565b85156200119d576200119d898b8989620018ef565b6040516370a0823160e01b81526000906001600160a01b038b16906370a0823190620011ce90309060040162002408565b602060405180830381865afa158015620011ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001212919062002d14565b90506200122b6001600160a01b038b1633308e62001c51565b6040516370a0823160e01b81526000906001600160a01b038c16906370a08231906200125c90309060040162002408565b602060405180830381865afa1580156200127a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012a0919062002d14565b9050620012ae828262002d2e565b6068548c9850610100900463ffffffff1696509350620012ce8762001c8b565b620012d98c62001d52565b620012e48d62001e10565b604051602001620012f89392919062002b45565b604051602081830303815290604052945050505b505b6000805160206200469a833981519152600084868e8e86886053546040516200133f98979695949392919062002d44565b60405180910390a16200136462000673600085878f8f87898051906020012062000caa565b8615620013755762001375620015f6565b505050506200138360018055565b50505050505050565b606c546001600160a01b03163314620013b85760405163e2e8106b60e01b815260040160405180910390fd5b6200052662001ed7565b600084815b60208110156200148d57600163ffffffff8616821c811690036200143157858160208110620013fa57620013fa62002c4a565b6020020135826040516020016200141392919062002c60565b60405160208183030381529060405280519060200120915062001478565b8186826020811062001447576200144762002c4a565b60200201356040516020016200145f92919062002c60565b6040516020818303038152906040528051906020012091505b80620014848162002c84565b915050620013c7565b50821490505b949350505050565b60685460ff1615620014c057604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b806001620015096020600262002eae565b62001515919062002d2e565b6053541062001537576040516377ae67b360e11b815260040160405180910390fd5b60006053600081546200154a9062002c84565b9182905550905060005b6020811015620015e6578082901c6001166001036200158c57826033826020811062001584576200158462002c4a565b015550505050565b60338160208110620015a257620015a262002c4a565b015483604051602001620015b892919062002c60565b6040516020818303038152906040528051906020012092508080620015dd9062002c84565b91505062001554565b50620015f162002ebc565b505050565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d6200163f62000bc2565b6040518263ffffffff1660e01b81526004016200165e91815260200190565b600060405180830381600087803b1580156200167957600080fd5b505af115801562000eb5573d6000803e3d6000fd5b6200169f8b63ffffffff1662001f30565b606854600090600160281b90046001600160a01b031663257b3632620016c68d8d62001f7c565b6040518263ffffffff1660e01b8152600401620016e591815260200190565b6020604051808303816000875af115801562001705573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200172b919062002d14565b9050806000036200174e57604051622f6fad60e01b815260040160405180910390fd5b60685463ffffffff88811661010090920416146200177f576040516302caf51760e11b815260040160405180910390fd5b606854600090610100900463ffffffff166200179d575089620017a0565b508a5b620017c9620017c0848c8c8c8c8c8c8c604051620006659291906200297f565b8f8f84620013c2565b620017e7576040516338105f3b60e21b815260040160405180910390fd5b5050505050505050505050505050565b620015f18363a9059cbb60e01b84846040516024016200181992919062002b82565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262001fb1565b6001600160a01b03163b151590565b600054610100900460ff166200188a5760405162461bcd60e51b815260040162000ddd9062002ed2565b620005266200208a565b600260015403620018e85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000ddd565b6002600155565b600062001900600482848662002f1d565b6200190b9162002f49565b9050632afa533160e01b6001600160e01b031982160162001aac5760008080808080806200193d896004818d62002f1d565b8101906200194c919062002f7a565b9650965096509650965096509650336001600160a01b0316876001600160a01b0316146200198d5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0386163014620019b75760405163750643af60e01b815260040160405180910390fd5b8a8514620019d8576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e169162001a589190620029cb565b6000604051808303816000865af19150503d806000811462001a97576040519150601f19603f3d011682016040523d82523d6000602084013e62001a9c565b606091505b505050505050505050506200068a565b6001600160e01b031981166323f2ebc360e21b1462001ade57604051637141605d60e11b815260040160405180910390fd5b60008080808080808062001af68a6004818e62002f1d565b81019062001b05919062002fd5565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462001b485760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038716301462001b725760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169162001bfb9190620029cb565b6000604051808303816000865af19150503d806000811462001c3a576040519150601f19603f3d011682016040523d82523d6000602084013e62001c3f565b606091505b50505050505050505050505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905262000eb59085906323b872dd60e01b9060840162001819565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009182916001600160a01b0386169162001cd49190620029cb565b600060405180830381855afa9150503d806000811462001d11576040519150601f19603f3d011682016040523d82523d6000602084013e62001d16565b606091505b50915091508162001d4757604051806040016040528060078152602001664e4f5f4e414d4560c81b81525062001493565b6200149381620020b4565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009182916001600160a01b0386169162001d9b9190620029cb565b600060405180830381855afa9150503d806000811462001dd8576040519150601f19603f3d011682016040523d82523d6000602084013e62001ddd565b606091505b50915091508162001d4757604051806040016040528060098152602001681393d7d4d6535093d360ba1b81525062001493565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b0386169162001e589190620029cb565b600060405180830381855afa9150503d806000811462001e95576040519150601f19603f3d011682016040523d82523d6000602084013e62001e9a565b606091505b509150915081801562001eae575080516020145b62001ebb57601262001493565b8080602001905181019062001493919062003061565b60018055565b60685460ff1662001efb57604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600881901c60008181526069602052604081208054600160ff861690811b918218928390559290919081831690036200068a57604051630c8d9eab60e31b815260040160405180910390fd5b6000828260405160200162001f9392919062002c60565b60405160208183030381529060405280519060200120905092915050565b600062002008826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200225d9092919063ffffffff16565b805190915015620015f1578080602001905181019062002029919062003081565b620015f15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000ddd565b600054610100900460ff1662001ed15760405162461bcd60e51b815260040162000ddd9062002ed2565b60606040825110620020d65781806020019051810190620005759190620030a1565b81516020036200222a5760005b60208110801562002116575082818151811062002104576200210462002c4a565b01602001516001600160f81b03191615155b15620021315780620021288162002c84565b915050620020e3565b806000036200216a5750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b6000816001600160401b038111156200218757620021876200298f565b6040519080825280601f01601f191660200182016040528015620021b2576020820181803683370190505b50905060005b828110156200222257848181518110620021d657620021d662002c4a565b602001015160f81c60f81b828281518110620021f657620021f662002c4a565b60200101906001600160f81b031916908160001a90535080620022198162002c84565b915050620021b8565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b606062001493848460008585600080866001600160a01b03168587604051620022879190620029cb565b60006040518083038185875af1925050503d8060008114620022c6576040519150601f19603f3d011682016040523d82523d6000602084013e620022cb565b606091505b5091509150620022de87838387620022e9565b979650505050505050565b606083156200235d5782516000036200235557620023078562001851565b620023555760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000ddd565b508162001493565b620014938383815115620023745781518083602001fd5b8060405162461bcd60e51b815260040162000ddd919062003120565b611564806200313683390190565b803563ffffffff811681146200225857600080fd5b6001600160a01b0381168114620023c957600080fd5b50565b60008060408385031215620023e057600080fd5b620023eb836200239e565b91506020830135620023fd81620023b3565b809150509250929050565b6001600160a01b0391909116815260200190565b8015158114620023c957600080fd5b60008083601f8401126200243e57600080fd5b5081356001600160401b038111156200245657600080fd5b6020830191508360208285010111156200246f57600080fd5b9250929050565b6000806000806000608086880312156200248f57600080fd5b6200249a866200239e565b94506020860135620024ac81620023b3565b93506040860135620024be816200241c565b925060608601356001600160401b03811115620024da57600080fd5b620024e8888289016200242b565b969995985093965092949392505050565b8061040081018310156200057557600080fd5b60008060008060008060008060008060006105208c8e0312156200252f57600080fd5b6200253b8d8d620024f9565b9a506200254c6104008d016200239e565b99506104208c013598506104408c013597506200256d6104608d016200239e565b96506104808c01356200258081620023b3565b9550620025916104a08d016200239e565b94506104c08c0135620025a481620023b3565b93506104e08c013592506105008c01356001600160401b03811115620025c957600080fd5b620025d78e828f016200242b565b915080935050809150509295989b509295989b9093969950565b6000602082840312156200260457600080fd5b81356200261181620023b3565b9392505050565b60ff81168114620023c957600080fd5b600080600080600080600060e0888a0312156200264457600080fd5b8735620026518162002618565b965062002661602089016200239e565b955060408801356200267381620023b3565b945062002683606089016200239e565b935060808801356200269581620023b3565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215620026c857600080fd5b620026d3846200239e565b92506020840135620026e581620023b3565b91506040840135620026f781620023b3565b809150509250925092565b6000602082840312156200271557600080fd5b5035919050565b600080600080600080600060a0888a0312156200273857600080fd5b62002743886200239e565b965060208801356200275581620023b3565b955060408801356001600160401b03808211156200277257600080fd5b620027808b838c016200242b565b909750955060608a01359150808211156200279a57600080fd5b50620027a98a828b016200242b565b9094509250506080880135620027bf8162002618565b8091505092959891949750929550565b600080600080600080600060c0888a031215620027eb57600080fd5b620027f6886200239e565b965060208801356200280881620023b3565b95506040880135945060608801356200282181620023b3565b9350608088013562002833816200241c565b925060a08801356001600160401b038111156200284f57600080fd5b6200285d8a828b016200242b565b989b979a50959850939692959293505050565b60008060008061046085870312156200288857600080fd5b843593506200289b8660208701620024f9565b9250620028ac61042086016200239e565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c08301819052600091620029658483018789620028e7565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620029c2578181015183820152602001620029a8565b50506000910152565b60008251620029df818460208701620029a5565b9190910192915050565b604051601f8201601f191681016001600160401b038111828210171562002a145762002a146200298f565b604052919050565b60006001600160401b0382111562002a385762002a386200298f565b50601f01601f191660200190565b600082601f83011262002a5857600080fd5b813562002a6f62002a698262002a1c565b620029e9565b81815284602083860101111562002a8557600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562002ab857600080fd5b83356001600160401b038082111562002ad057600080fd5b62002ade8783880162002a46565b9450602086013591508082111562002af557600080fd5b5062002b048682870162002a46565b9250506040840135620026f78162002618565b6000815180845262002b31816020860160208601620029a5565b601f01601f19169290920160200192915050565b60608152600062002b5a606083018662002b17565b828103602084015262002b6e818662002b17565b91505060ff83166040830152949350505050565b6001600160a01b03929092168252602082015260400190565b63ffffffff861681526001600160a01b03858116602083015284166040820152608060608201819052600090620022de9083018486620028e7565b63ffffffff95861681529390941660208401526001600160a01b039182166040840152166060820152608081019190915260a00190565b6001600160a01b038516815263ffffffff8416602082015260606040820181905260009062002c409083018486620028e7565b9695505050505050565b634e487b7160e01b600052603260045260246000fd5b918252602082015260400190565b634e487b7160e01b600052601160045260246000fd5b60006001820162002c995762002c9962002c6e565b5060010190565b60608152600062002cb6606083018789620028e7565b828103602084015262002ccb818688620028e7565b91505060ff831660408301529695505050505050565b6000835162002cf5818460208801620029a5565b83519083019062002d0b818360208801620029a5565b01949350505050565b60006020828403121562002d2757600080fd5b5051919050565b8181038181111562000575576200057562002c6e565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c0830181905260009162002d988483018762002b17565b925080851660e085015250509998505050505050505050565b600181815b8085111562002df257816000190482111562002dd65762002dd662002c6e565b8085161562002de457918102915b93841c939080029062002db6565b509250929050565b60008262002e0b5750600162000575565b8162002e1a5750600062000575565b816001811462002e33576002811462002e3e5762002e5e565b600191505062000575565b60ff84111562002e525762002e5262002c6e565b50506001821b62000575565b5060208310610133831016604e8410600b841016171562002e83575081810a62000575565b62002e8f838362002db1565b806000190482111562002ea65762002ea662002c6e565b029392505050565b600062002611838362002dfa565b634e487b7160e01b600052600160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000808585111562002f2e57600080fd5b8386111562002f3c57600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101562002f725780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a03121562002f9657600080fd5b873562002fa381620023b3565b9650602088013562002fb581620023b3565b955060408801359450606088013593506080880135620026958162002618565b600080600080600080600080610100898b03121562002ff357600080fd5b88356200300081620023b3565b975060208901356200301281620023b3565b96506040890135955060608901359450608089013562003032816200241c565b935060a0890135620030448162002618565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200307457600080fd5b8151620026118162002618565b6000602082840312156200309457600080fd5b815162002611816200241c565b600060208284031215620030b457600080fd5b81516001600160401b03811115620030cb57600080fd5b8201601f81018413620030dd57600080fd5b8051620030ee62002a698262002a1c565b8181528560208385010111156200310457600080fd5b62003117826020830160208601620029a5565b95945050505050565b60208152600062002611602083018462002b1756fe6101006040523480156200001257600080fd5b50604051620015643803806200156483398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516110a8620004bc60003960006101a30152600081816102660152818161048c01526104fa0152600061043d0152600081816102cb015261040701526110a86000f3fe608060405234801561001057600080fd5b50600436106101075760003560e01c806306fdde031461010c578063095ea7b31461012a57806318160ddd1461014d57806320606b701461015f57806323b872dd1461017457806330adf81f14610187578063313ce5671461019c5780633644e515146101cd57806339509351146101d557806340c10f19146101e857806370a08231146101fd5780637ecebe001461022657806395d89b41146102465780639dc29fac1461024e578063a3c573eb14610261578063a457c2d7146102a0578063a9059cbb146102b3578063cd0d0096146102c6578063d505accf146102ed578063dd62ed3e14610300578063ffa1ad7414610313575b600080fd5b610114610333565b6040516101219190610dae565b60405180910390f35b61013d610138366004610e18565b6103c5565b6040519015158152602001610121565b6002545b604051908152602001610121565b61015160008051602061105383398151915281565b61013d610182366004610e42565b6103df565b61015160008051602061103383398151915281565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610121565b610151610403565b61013d6101e3366004610e18565b61045f565b6101fb6101f6366004610e18565b610481565b005b61015161020b366004610e7e565b6001600160a01b031660009081526020819052604090205490565b610151610234366004610e7e565b60056020526000908152604090205481565b6101146104e0565b6101fb61025c366004610e18565b6104ef565b6102887f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610121565b61013d6102ae366004610e18565b610541565b61013d6102c1366004610e18565b6105bc565b6101517f000000000000000000000000000000000000000000000000000000000000000081565b6101fb6102fb366004610ea0565b6105ca565b61015161030e366004610f13565b6107f3565b610114604051806040016040528060018152602001603160f81b81525081565b60606003805461034290610f46565b80601f016020809104026020016040519081016040528092919081815260200182805461036e90610f46565b80156103bb5780601f10610390576101008083540402835291602001916103bb565b820191906000526020600020905b81548152906001019060200180831161039e57829003601f168201915b5050505050905090565b6000336103d381858561081e565b60019150505b92915050565b6000336103ed858285610943565b6103f88585856109bd565b506001949350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461461043a5761043546610b4f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000336103d381858561047283836107f3565b61047c9190610f96565b61081e565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104d25760405162461bcd60e51b81526004016104c990610fa9565b60405180910390fd5b6104dc8282610be9565b5050565b60606004805461034290610f46565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105375760405162461bcd60e51b81526004016104c990610fa9565b6104dc8282610c96565b6000338161054f82866107f3565b9050838110156105af5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104c9565b6103f8828686840361081e565b6000336103d38185856109bd565b834211156106265760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104c9565b6001600160a01b03871660009081526005602052604081208054600080516020611033833981519152918a918a918a91908661066183610ff9565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006106bf610403565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa15801561074a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906107805750896001600160a01b0316816001600160a01b0316145b6107dc5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104c9565b6107e78a8a8a61081e565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166108805760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104c9565b6001600160a01b0382166108e15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104c9565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600061094f84846107f3565b905060001981146109b757818110156109aa5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104c9565b6109b7848484840361081e565b50505050565b6001600160a01b038316610a215760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104c9565b6001600160a01b038216610a835760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104c9565b6001600160a01b03831660009081526020819052604090205481811015610afb5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104c9565b6001600160a01b0384811660008181526020818152604080832087870390559387168083529184902080548701905592518581529092600080516020611013833981519152910160405180910390a36109b7565b6000600080516020611053833981519152610b68610333565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c3f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104c9565b8060026000828254610c519190610f96565b90915550506001600160a01b03821660008181526020818152604080832080548601905551848152600080516020611013833981519152910160405180910390a35050565b6001600160a01b038216610cf65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104c9565b6001600160a01b03821660009081526020819052604090205481811015610d6a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104c9565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192916000805160206110138339815191529101610936565b600060208083528351808285015260005b81811015610ddb57858101830151858201604001528201610dbf565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610e1357600080fd5b919050565b60008060408385031215610e2b57600080fd5b610e3483610dfc565b946020939093013593505050565b600080600060608486031215610e5757600080fd5b610e6084610dfc565b9250610e6e60208501610dfc565b9150604084013590509250925092565b600060208284031215610e9057600080fd5b610e9982610dfc565b9392505050565b600080600080600080600060e0888a031215610ebb57600080fd5b610ec488610dfc565b9650610ed260208901610dfc565b95506040880135945060608801359350608088013560ff81168114610ef657600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f2657600080fd5b610f2f83610dfc565b9150610f3d60208401610dfc565b90509250929050565b600181811c90821680610f5a57607f821691505b602082108103610f7a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156103d9576103d9610f80565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b60006001820161100b5761100b610f80565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa26469706673582212203ea4a1224be7b5ef35dc397dfc81433d85cd6fdbf17d8b2e3d528071e7e612b564736f6c63430008140033501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe27545983a2646970667358221220baee82e4ee7f164b3d1e7f66a5c387364d25480bb9d2b43835d64170d591672664736f6c63430008140033", + "bytecode": "0x608060405234801561001057600080fd5b50615c83806100206000396000f3fe6080604052600436106200019f5760003560e01c8063647c576c11620000e7578063be5831c71162000089578063dbc169761162000060578063dbc169761462000639578063ee25560b1462000651578063fb570834146200068257600080fd5b8063be5831c714620005ae578063cd58657914620005ea578063d02103ca146200060157600080fd5b80639e34070f11620000be5780639e34070f146200050a578063aaa13cc2146200054f578063bab161bf146200057457600080fd5b8063647c576c146200048657806379e2cf9714620004ab57806381b1c17414620004c357600080fd5b80632d2c9d94116200015157806334ac9cf2116200012857806334ac9cf2146200034b5780633ae05047146200037a5780633e197043146200039257600080fd5b80632d2c9d9414620002765780632dfdf0b5146200029b578063318aee3d14620002c257600080fd5b806322e95f2c116200018657806322e95f2c14620001ef578063240ff378146200023a5780632cffd02e146200025157600080fd5b806315064c9614620001a45780632072f6c514620001d5575b600080fd5b348015620001b157600080fd5b50606854620001c09060ff1681565b60405190151581526020015b60405180910390f35b348015620001e257600080fd5b50620001ed620006a7565b005b348015620001fc57600080fd5b50620002146200020e366004620032db565b62000705565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001cc565b620001ed6200024b36600462003372565b620007a8565b3480156200025e57600080fd5b50620001ed6200027036600462003409565b620009d0565b3480156200028357600080fd5b50620001ed6200029536600462003409565b62000f74565b348015620002a857600080fd5b50620002b360535481565b604051908152602001620001cc565b348015620002cf57600080fd5b5062000319620002e1366004620034ef565b606b6020526000908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001cc565b3480156200035857600080fd5b50606c54620002149073ffffffffffffffffffffffffffffffffffffffff1681565b3480156200038757600080fd5b50620002b362001178565b3480156200039f57600080fd5b50620002b3620003b136600462003526565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200049357600080fd5b50620001ed620004a5366004620035b0565b6200125e565b348015620004b857600080fd5b50620001ed620014ad565b348015620004d057600080fd5b5062000214620004e236600462003600565b606a6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200051757600080fd5b50620001c06200052936600462003600565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b3480156200055c57600080fd5b50620002146200056e3660046200361a565b620014e7565b3480156200058157600080fd5b506068546200059890610100900463ffffffff1681565b60405163ffffffff9091168152602001620001cc565b348015620005bb57600080fd5b506068546200059890790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001ed620005fb366004620036ce565b620016d3565b3480156200060e57600080fd5b50606854620002149065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200064657600080fd5b50620001ed62001c37565b3480156200065e57600080fd5b50620002b36200067036600462003600565b60696020526000908152604090205481565b3480156200068f57600080fd5b50620001c0620006a136600462003770565b62001c93565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006f9576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200070362001d7c565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091206000908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007e6576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8681166101009092041614806200080c5750600263ffffffff861610155b1562000844576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff163388883488886053546040516200089a9998979695949392919062003806565b60405180910390a1620009b8620009b26001606860019054906101000a900463ffffffff16338989348989604051620008d592919062003881565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b62001e10565b8215620009c957620009c962001f27565b5050505050565b60685460ff161562000a0e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000a258b8b8b8b8b8b8b8b8b8b8b600062001ffc565b73ffffffffffffffffffffffffffffffffffffffff861662000b01576040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a7a9190620038e6565b60006040518083038185875af1925050503d806000811462000ab9576040519150601f19603f3d011682016040523d82523d6000602084013e62000abe565b606091505b505090508062000afa576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000efc565b60685463ffffffff61010090910481169088160362000b435762000b3d73ffffffffffffffffffffffffffffffffffffffff87168585620021ed565b62000efc565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b166024820152600090603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e6e576000808062000c1886880188620039fb565b92509250925060008584848460405162000c329062003292565b62000c409392919062003abd565b8190604051809103906000f590508015801562000c61573d6000803e3d6000fd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f1990604401600060405180830381600087803b15801562000cd757600080fd5b505af115801562000cec573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e5c95949392919062003afa565b60405180910390a15050505062000ef9565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f1990604401600060405180830381600087803b15801562000edf57600080fd5b505af115801562000ef4573d6000803e3d6000fd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000fb2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000fc98b8b8b8b8b8b8b8b8b8b8b600162001ffc565b60008473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000ffc949392919062003b42565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200107f9190620038e6565b60006040518083038185875af1925050503d8060008114620010be576040519150601f19603f3d011682016040523d82523d6000602084013e620010c3565b606091505b5050905080620010ff576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b605354600090819081805b602081101562001255578083901c600116600103620011e65760338160208110620011b257620011b262003b8a565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062001213565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806200124c9062003be8565b91505062001183565b50919392505050565b600054610100900460ff16158080156200127f5750600054600160ff909116105b806200129b5750303b1580156200129b575060005460ff166001145b6200132d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200138c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001691841691909117905562001443620022c3565b8015620014a757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000703576200070362001f27565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201526000908190603801604051602081830303815290604052805190602001209050600060ff60f81b3083604051806020016200157d9062003292565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620015c8908d908d908d908d908d9060200162003c23565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001606929160200162003c64565b604051602081830303815290604052805190602001206040516020016200168f94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff161562001711576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200171b62002366565b60685463ffffffff888116610100909204161480620017415750600263ffffffff881610155b1562001779576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060608773ffffffffffffffffffffffffffffffffffffffff8816620017df57883414620017d5576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000925062001ad9565b341562001818576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089166000908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901562001908576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac90604401600060405180830381600087803b158015620018db57600080fd5b505af1158015620018f0573d6000803e3d6000fd5b50505050806020015194508060000151935062001ad7565b85156200191d576200191d898b8989620023db565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200198b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620019b1919062003c97565b9050620019d773ffffffffffffffffffffffffffffffffffffffff8b1633308e620028f9565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa15801562001a45573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a6b919062003c97565b905062001a79828262003cb1565b6068548c9850610100900463ffffffff169650935062001a998762002959565b62001aa48c62002a71565b62001aaf8d62002b7e565b60405160200162001ac39392919062003abd565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e868860535460405162001b1b98979695949392919062003cc7565b60405180910390a162001c0f620009b2600085878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b861562001c205762001c2062001f27565b5050505062001c2e60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c89576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200070362002c80565b600084815b602081101562001d6e57600163ffffffff8616821c8116900362001d0a5785816020811062001ccb5762001ccb62003b8a565b60200201358260405160200162001cec929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001d59565b8186826020811062001d205762001d2062003b8a565b602002013560405160200162001d40929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d658162003be8565b91505062001c98565b50821490505b949350505050565b60685460ff161562001dba576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b80600162001e216020600262003e79565b62001e2d919062003cb1565b6053541062001e68576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060536000815462001e7b9062003be8565b9182905550905060005b602081101562001f17578082901c60011660010362001ebd57826033826020811062001eb55762001eb562003b8a565b015550505050565b6033816020811062001ed35762001ed362003b8a565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001f0e9062003be8565b91505062001e85565b5062001f2262003e87565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001fad62001178565b6040518263ffffffff1660e01b815260040162001fcc91815260200190565b600060405180830381600087803b15801562001fe757600080fd5b505af1158015620014a7573d6000803e3d6000fd5b6200200d8b63ffffffff1662002d10565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b363200000000000000000000000000000000000000000000000000000000909252606481019190915260009165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303816000875af1158015620020b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620020d6919062003c97565b90508060000362002112576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff88811661010090920416146200215c576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606854600090610100900463ffffffff166200217a5750896200217d565b508a5b620021a66200219d848c8c8c8c8c8c8c604051620008d592919062003881565b8f8f8462001c93565b620021dd576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001f229084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002d75565b600054610100900460ff166200235c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001324565b6200070362002e88565b600260015403620023d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001324565b6002600155565b6000620023ec600482848662003eb6565b620023f79162003ee2565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620026765760008080808080806200245a896004818d62003eb6565b81019062002469919062003f2b565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614620024dd576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff861630146200252d576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002567576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620026229190620038e6565b6000604051808303816000865af19150503d806000811462002661576040519150601f19603f3d011682016040523d82523d6000602084013e62002666565b606091505b50505050505050505050620009c9565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c0000000000000000000000000000000000000000000000000000000014620026f2576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808080808080806200270a8a6004818e62003eb6565b81019062002719919062003f86565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146200278f576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87163014620027df576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f1691620028a39190620038e6565b6000604051808303816000865af19150503d8060008114620028e2576040519150601f19603f3d011682016040523d82523d6000602084013e620028e7565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014a79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002240565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691620029dd9190620038e6565b600060405180830381855afa9150503d806000811462002a1a576040519150601f19603f3d011682016040523d82523d6000602084013e62002a1f565b606091505b50915091508162002a66576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d74565b62001d748162002f21565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162002af59190620038e6565b600060405180830381855afa9150503d806000811462002b32576040519150601f19603f3d011682016040523d82523d6000602084013e62002b37565b606091505b50915091508162002a66576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d74565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169162002c019190620038e6565b600060405180830381855afa9150503d806000811462002c3e576040519150601f19603f3d011682016040523d82523d6000602084013e62002c43565b606091505b509150915081801562002c57575080516020145b62002c6457601262001d74565b8080602001905181019062001d74919062004012565b60018055565b60685460ff1662002cbd576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600881901c60008181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009c9576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600062002dd9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031119092919063ffffffff16565b80519091501562001f22578080602001905181019062002dfa919062004032565b62001f22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001324565b600054610100900460ff1662002c7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001324565b6060604082511062002f435781806020019051810190620007a2919062004052565b8151602003620030d35760005b60208110801562002f9b575082818151811062002f715762002f7162003b8a565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002fb6578062002fad8162003be8565b91505062002f50565b8060000362002ffa57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111562003018576200301862003891565b6040519080825280601f01601f19166020018201604052801562003043576020820181803683370190505b50905060005b82811015620030cb5784818151811062003067576200306762003b8a565b602001015160f81c60f81b82828151811062003087576200308762003b8a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080620030c28162003be8565b91505062003049565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d748484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051620031489190620038e6565b60006040518083038185875af1925050503d806000811462003187576040519150601f19603f3d011682016040523d82523d6000602084013e6200318c565b606091505b50915091506200319f87838387620031aa565b979650505050505050565b60608315620032455782516000036200323d5773ffffffffffffffffffffffffffffffffffffffff85163b6200323d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001324565b508162001d74565b62001d7483838151156200325c5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620013249190620040d2565b611b6680620040e883390190565b803563ffffffff811681146200310c57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620032d857600080fd5b50565b60008060408385031215620032ef57600080fd5b620032fa83620032a0565b915060208301356200330c81620032b5565b809150509250929050565b8015158114620032d857600080fd5b60008083601f8401126200333957600080fd5b50813567ffffffffffffffff8111156200335257600080fd5b6020830191508360208285010111156200336b57600080fd5b9250929050565b6000806000806000608086880312156200338b57600080fd5b6200339686620032a0565b94506020860135620033a881620032b5565b93506040860135620033ba8162003317565b9250606086013567ffffffffffffffff811115620033d757600080fd5b620033e58882890162003326565b969995985093965092949392505050565b806104008101831015620007a257600080fd5b60008060008060008060008060008060006105208c8e0312156200342c57600080fd5b620034388d8d620033f6565b9a50620034496104008d01620032a0565b99506104208c013598506104408c013597506200346a6104608d01620032a0565b96506104808c01356200347d81620032b5565b95506200348e6104a08d01620032a0565b94506104c08c0135620034a181620032b5565b93506104e08c013592506105008c013567ffffffffffffffff811115620034c757600080fd5b620034d58e828f0162003326565b915080935050809150509295989b509295989b9093969950565b6000602082840312156200350257600080fd5b81356200350f81620032b5565b9392505050565b60ff81168114620032d857600080fd5b600080600080600080600060e0888a0312156200354257600080fd5b87356200354f8162003516565b96506200355f60208901620032a0565b955060408801356200357181620032b5565b94506200358160608901620032a0565b935060808801356200359381620032b5565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215620035c657600080fd5b620035d184620032a0565b92506020840135620035e381620032b5565b91506040840135620035f581620032b5565b809150509250925092565b6000602082840312156200361357600080fd5b5035919050565b600080600080600080600060a0888a0312156200363657600080fd5b6200364188620032a0565b965060208801356200365381620032b5565b9550604088013567ffffffffffffffff808211156200367157600080fd5b6200367f8b838c0162003326565b909750955060608a01359150808211156200369957600080fd5b50620036a88a828b0162003326565b9094509250506080880135620036be8162003516565b8091505092959891949750929550565b600080600080600080600060c0888a031215620036ea57600080fd5b620036f588620032a0565b965060208801356200370781620032b5565b95506040880135945060608801356200372081620032b5565b93506080880135620037328162003317565b925060a088013567ffffffffffffffff8111156200374f57600080fd5b6200375d8a828b0162003326565b989b979a50959850939692959293505050565b60008060008061046085870312156200378857600080fd5b843593506200379b8660208701620033f6565b9250620037ac6104208601620032a0565b939692955092936104400135925050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600061010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620038678285018789620037bd565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b83811015620038dd578181015183820152602001620038c3565b50506000910152565b60008251620038fa818460208701620038c0565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156200394e576200394e62003891565b604052919050565b600067ffffffffffffffff82111562003973576200397362003891565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112620039b157600080fd5b8135620039c8620039c28262003956565b62003904565b818152846020838601011115620039de57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562003a1157600080fd5b833567ffffffffffffffff8082111562003a2a57600080fd5b62003a38878388016200399f565b9450602086013591508082111562003a4f57600080fd5b5062003a5e868287016200399f565b9250506040840135620035f58162003516565b6000815180845262003a8b816020860160208601620038c0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60608152600062003ad2606083018662003a71565b828103602084015262003ae6818662003a71565b91505060ff83166040830152949350505050565b63ffffffff86168152600073ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200319f608083018486620037bd565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff8416602082015260606040820152600062003b80606083018486620037bd565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003c1c5762003c1c62003bb9565b5060010190565b60608152600062003c39606083018789620037bd565b828103602084015262003c4e818688620037bd565b91505060ff831660408301529695505050505050565b6000835162003c78818460208801620038c0565b83519083019062003c8e818360208801620038c0565b01949350505050565b60006020828403121562003caa57600080fd5b5051919050565b81810381811115620007a257620007a262003bb9565b600061010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003d278285018762003a71565b925080851660e085015250509998505050505050505050565b600181815b8085111562003d9f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d835762003d8362003bb9565b8085161562003d9157918102915b93841c939080029062003d45565b509250929050565b60008262003db857506001620007a2565b8162003dc757506000620007a2565b816001811462003de0576002811462003deb5762003e0b565b6001915050620007a2565b60ff84111562003dff5762003dff62003bb9565b50506001821b620007a2565b5060208310610133831016604e8410600b841016171562003e30575081810a620007a2565b62003e3c838362003d40565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003e715762003e7162003bb9565b029392505050565b60006200350f838362003da7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000808585111562003ec757600080fd5b8386111562003ed557600080fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003f235780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a03121562003f4757600080fd5b873562003f5481620032b5565b9650602088013562003f6681620032b5565b955060408801359450606088013593506080880135620035938162003516565b600080600080600080600080610100898b03121562003fa457600080fd5b883562003fb181620032b5565b9750602089013562003fc381620032b5565b96506040890135955060608901359450608089013562003fe38162003317565b935060a089013562003ff58162003516565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200402557600080fd5b81516200350f8162003516565b6000602082840312156200404557600080fd5b81516200350f8162003317565b6000602082840312156200406557600080fd5b815167ffffffffffffffff8111156200407d57600080fd5b8201601f810184136200408f57600080fd5b8051620040a0620039c28262003956565b818152856020838501011115620040b657600080fd5b620040c9826020830160208601620038c0565b95945050505050565b6020815260006200350f602083018462003a7156fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212206fe049be388a1d04319b9913fe6d100c4c8e272fe0f5748eb056bd0622beabcc64736f6c63430008140033a2646970667358221220ef4412c515d53043ca441d4b33288d9aa2b101bc9853f859467ab1a42f16139c64736f6c63430008140033", + "deployedBytecode": "0x6080604052600436106200019f5760003560e01c8063647c576c11620000e7578063be5831c71162000089578063dbc169761162000060578063dbc169761462000639578063ee25560b1462000651578063fb570834146200068257600080fd5b8063be5831c714620005ae578063cd58657914620005ea578063d02103ca146200060157600080fd5b80639e34070f11620000be5780639e34070f146200050a578063aaa13cc2146200054f578063bab161bf146200057457600080fd5b8063647c576c146200048657806379e2cf9714620004ab57806381b1c17414620004c357600080fd5b80632d2c9d94116200015157806334ac9cf2116200012857806334ac9cf2146200034b5780633ae05047146200037a5780633e197043146200039257600080fd5b80632d2c9d9414620002765780632dfdf0b5146200029b578063318aee3d14620002c257600080fd5b806322e95f2c116200018657806322e95f2c14620001ef578063240ff378146200023a5780632cffd02e146200025157600080fd5b806315064c9614620001a45780632072f6c514620001d5575b600080fd5b348015620001b157600080fd5b50606854620001c09060ff1681565b60405190151581526020015b60405180910390f35b348015620001e257600080fd5b50620001ed620006a7565b005b348015620001fc57600080fd5b50620002146200020e366004620032db565b62000705565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001cc565b620001ed6200024b36600462003372565b620007a8565b3480156200025e57600080fd5b50620001ed6200027036600462003409565b620009d0565b3480156200028357600080fd5b50620001ed6200029536600462003409565b62000f74565b348015620002a857600080fd5b50620002b360535481565b604051908152602001620001cc565b348015620002cf57600080fd5b5062000319620002e1366004620034ef565b606b6020526000908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001cc565b3480156200035857600080fd5b50606c54620002149073ffffffffffffffffffffffffffffffffffffffff1681565b3480156200038757600080fd5b50620002b362001178565b3480156200039f57600080fd5b50620002b3620003b136600462003526565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200049357600080fd5b50620001ed620004a5366004620035b0565b6200125e565b348015620004b857600080fd5b50620001ed620014ad565b348015620004d057600080fd5b5062000214620004e236600462003600565b606a6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200051757600080fd5b50620001c06200052936600462003600565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b3480156200055c57600080fd5b50620002146200056e3660046200361a565b620014e7565b3480156200058157600080fd5b506068546200059890610100900463ffffffff1681565b60405163ffffffff9091168152602001620001cc565b348015620005bb57600080fd5b506068546200059890790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001ed620005fb366004620036ce565b620016d3565b3480156200060e57600080fd5b50606854620002149065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200064657600080fd5b50620001ed62001c37565b3480156200065e57600080fd5b50620002b36200067036600462003600565b60696020526000908152604090205481565b3480156200068f57600080fd5b50620001c0620006a136600462003770565b62001c93565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006f9576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200070362001d7c565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091206000908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007e6576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8681166101009092041614806200080c5750600263ffffffff861610155b1562000844576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff163388883488886053546040516200089a9998979695949392919062003806565b60405180910390a1620009b8620009b26001606860019054906101000a900463ffffffff16338989348989604051620008d592919062003881565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b62001e10565b8215620009c957620009c962001f27565b5050505050565b60685460ff161562000a0e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000a258b8b8b8b8b8b8b8b8b8b8b600062001ffc565b73ffffffffffffffffffffffffffffffffffffffff861662000b01576040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a7a9190620038e6565b60006040518083038185875af1925050503d806000811462000ab9576040519150601f19603f3d011682016040523d82523d6000602084013e62000abe565b606091505b505090508062000afa576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000efc565b60685463ffffffff61010090910481169088160362000b435762000b3d73ffffffffffffffffffffffffffffffffffffffff87168585620021ed565b62000efc565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b166024820152600090603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e6e576000808062000c1886880188620039fb565b92509250925060008584848460405162000c329062003292565b62000c409392919062003abd565b8190604051809103906000f590508015801562000c61573d6000803e3d6000fd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f1990604401600060405180830381600087803b15801562000cd757600080fd5b505af115801562000cec573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e5c95949392919062003afa565b60405180910390a15050505062000ef9565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f1990604401600060405180830381600087803b15801562000edf57600080fd5b505af115801562000ef4573d6000803e3d6000fd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000fb2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000fc98b8b8b8b8b8b8b8b8b8b8b600162001ffc565b60008473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000ffc949392919062003b42565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200107f9190620038e6565b60006040518083038185875af1925050503d8060008114620010be576040519150601f19603f3d011682016040523d82523d6000602084013e620010c3565b606091505b5050905080620010ff576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b605354600090819081805b602081101562001255578083901c600116600103620011e65760338160208110620011b257620011b262003b8a565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062001213565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806200124c9062003be8565b91505062001183565b50919392505050565b600054610100900460ff16158080156200127f5750600054600160ff909116105b806200129b5750303b1580156200129b575060005460ff166001145b6200132d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200138c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001691841691909117905562001443620022c3565b8015620014a757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000703576200070362001f27565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201526000908190603801604051602081830303815290604052805190602001209050600060ff60f81b3083604051806020016200157d9062003292565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620015c8908d908d908d908d908d9060200162003c23565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001606929160200162003c64565b604051602081830303815290604052805190602001206040516020016200168f94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff161562001711576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200171b62002366565b60685463ffffffff888116610100909204161480620017415750600263ffffffff881610155b1562001779576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060608773ffffffffffffffffffffffffffffffffffffffff8816620017df57883414620017d5576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000925062001ad9565b341562001818576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089166000908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901562001908576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac90604401600060405180830381600087803b158015620018db57600080fd5b505af1158015620018f0573d6000803e3d6000fd5b50505050806020015194508060000151935062001ad7565b85156200191d576200191d898b8989620023db565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200198b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620019b1919062003c97565b9050620019d773ffffffffffffffffffffffffffffffffffffffff8b1633308e620028f9565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa15801562001a45573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a6b919062003c97565b905062001a79828262003cb1565b6068548c9850610100900463ffffffff169650935062001a998762002959565b62001aa48c62002a71565b62001aaf8d62002b7e565b60405160200162001ac39392919062003abd565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e868860535460405162001b1b98979695949392919062003cc7565b60405180910390a162001c0f620009b2600085878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b861562001c205762001c2062001f27565b5050505062001c2e60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c89576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200070362002c80565b600084815b602081101562001d6e57600163ffffffff8616821c8116900362001d0a5785816020811062001ccb5762001ccb62003b8a565b60200201358260405160200162001cec929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001d59565b8186826020811062001d205762001d2062003b8a565b602002013560405160200162001d40929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d658162003be8565b91505062001c98565b50821490505b949350505050565b60685460ff161562001dba576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b80600162001e216020600262003e79565b62001e2d919062003cb1565b6053541062001e68576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060536000815462001e7b9062003be8565b9182905550905060005b602081101562001f17578082901c60011660010362001ebd57826033826020811062001eb55762001eb562003b8a565b015550505050565b6033816020811062001ed35762001ed362003b8a565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001f0e9062003be8565b91505062001e85565b5062001f2262003e87565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001fad62001178565b6040518263ffffffff1660e01b815260040162001fcc91815260200190565b600060405180830381600087803b15801562001fe757600080fd5b505af1158015620014a7573d6000803e3d6000fd5b6200200d8b63ffffffff1662002d10565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b363200000000000000000000000000000000000000000000000000000000909252606481019190915260009165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303816000875af1158015620020b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620020d6919062003c97565b90508060000362002112576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff88811661010090920416146200215c576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606854600090610100900463ffffffff166200217a5750896200217d565b508a5b620021a66200219d848c8c8c8c8c8c8c604051620008d592919062003881565b8f8f8462001c93565b620021dd576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001f229084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002d75565b600054610100900460ff166200235c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001324565b6200070362002e88565b600260015403620023d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001324565b6002600155565b6000620023ec600482848662003eb6565b620023f79162003ee2565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620026765760008080808080806200245a896004818d62003eb6565b81019062002469919062003f2b565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614620024dd576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff861630146200252d576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002567576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620026229190620038e6565b6000604051808303816000865af19150503d806000811462002661576040519150601f19603f3d011682016040523d82523d6000602084013e62002666565b606091505b50505050505050505050620009c9565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c0000000000000000000000000000000000000000000000000000000014620026f2576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808080808080806200270a8a6004818e62003eb6565b81019062002719919062003f86565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146200278f576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87163014620027df576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f1691620028a39190620038e6565b6000604051808303816000865af19150503d8060008114620028e2576040519150601f19603f3d011682016040523d82523d6000602084013e620028e7565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014a79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002240565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691620029dd9190620038e6565b600060405180830381855afa9150503d806000811462002a1a576040519150601f19603f3d011682016040523d82523d6000602084013e62002a1f565b606091505b50915091508162002a66576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d74565b62001d748162002f21565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162002af59190620038e6565b600060405180830381855afa9150503d806000811462002b32576040519150601f19603f3d011682016040523d82523d6000602084013e62002b37565b606091505b50915091508162002a66576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d74565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169162002c019190620038e6565b600060405180830381855afa9150503d806000811462002c3e576040519150601f19603f3d011682016040523d82523d6000602084013e62002c43565b606091505b509150915081801562002c57575080516020145b62002c6457601262001d74565b8080602001905181019062001d74919062004012565b60018055565b60685460ff1662002cbd576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600881901c60008181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009c9576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600062002dd9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031119092919063ffffffff16565b80519091501562001f22578080602001905181019062002dfa919062004032565b62001f22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001324565b600054610100900460ff1662002c7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001324565b6060604082511062002f435781806020019051810190620007a2919062004052565b8151602003620030d35760005b60208110801562002f9b575082818151811062002f715762002f7162003b8a565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002fb6578062002fad8162003be8565b91505062002f50565b8060000362002ffa57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111562003018576200301862003891565b6040519080825280601f01601f19166020018201604052801562003043576020820181803683370190505b50905060005b82811015620030cb5784818151811062003067576200306762003b8a565b602001015160f81c60f81b82828151811062003087576200308762003b8a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080620030c28162003be8565b91505062003049565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d748484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051620031489190620038e6565b60006040518083038185875af1925050503d806000811462003187576040519150601f19603f3d011682016040523d82523d6000602084013e6200318c565b606091505b50915091506200319f87838387620031aa565b979650505050505050565b60608315620032455782516000036200323d5773ffffffffffffffffffffffffffffffffffffffff85163b6200323d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001324565b508162001d74565b62001d7483838151156200325c5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620013249190620040d2565b611b6680620040e883390190565b803563ffffffff811681146200310c57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620032d857600080fd5b50565b60008060408385031215620032ef57600080fd5b620032fa83620032a0565b915060208301356200330c81620032b5565b809150509250929050565b8015158114620032d857600080fd5b60008083601f8401126200333957600080fd5b50813567ffffffffffffffff8111156200335257600080fd5b6020830191508360208285010111156200336b57600080fd5b9250929050565b6000806000806000608086880312156200338b57600080fd5b6200339686620032a0565b94506020860135620033a881620032b5565b93506040860135620033ba8162003317565b9250606086013567ffffffffffffffff811115620033d757600080fd5b620033e58882890162003326565b969995985093965092949392505050565b806104008101831015620007a257600080fd5b60008060008060008060008060008060006105208c8e0312156200342c57600080fd5b620034388d8d620033f6565b9a50620034496104008d01620032a0565b99506104208c013598506104408c013597506200346a6104608d01620032a0565b96506104808c01356200347d81620032b5565b95506200348e6104a08d01620032a0565b94506104c08c0135620034a181620032b5565b93506104e08c013592506105008c013567ffffffffffffffff811115620034c757600080fd5b620034d58e828f0162003326565b915080935050809150509295989b509295989b9093969950565b6000602082840312156200350257600080fd5b81356200350f81620032b5565b9392505050565b60ff81168114620032d857600080fd5b600080600080600080600060e0888a0312156200354257600080fd5b87356200354f8162003516565b96506200355f60208901620032a0565b955060408801356200357181620032b5565b94506200358160608901620032a0565b935060808801356200359381620032b5565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215620035c657600080fd5b620035d184620032a0565b92506020840135620035e381620032b5565b91506040840135620035f581620032b5565b809150509250925092565b6000602082840312156200361357600080fd5b5035919050565b600080600080600080600060a0888a0312156200363657600080fd5b6200364188620032a0565b965060208801356200365381620032b5565b9550604088013567ffffffffffffffff808211156200367157600080fd5b6200367f8b838c0162003326565b909750955060608a01359150808211156200369957600080fd5b50620036a88a828b0162003326565b9094509250506080880135620036be8162003516565b8091505092959891949750929550565b600080600080600080600060c0888a031215620036ea57600080fd5b620036f588620032a0565b965060208801356200370781620032b5565b95506040880135945060608801356200372081620032b5565b93506080880135620037328162003317565b925060a088013567ffffffffffffffff8111156200374f57600080fd5b6200375d8a828b0162003326565b989b979a50959850939692959293505050565b60008060008061046085870312156200378857600080fd5b843593506200379b8660208701620033f6565b9250620037ac6104208601620032a0565b939692955092936104400135925050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600061010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620038678285018789620037bd565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b83811015620038dd578181015183820152602001620038c3565b50506000910152565b60008251620038fa818460208701620038c0565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156200394e576200394e62003891565b604052919050565b600067ffffffffffffffff82111562003973576200397362003891565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112620039b157600080fd5b8135620039c8620039c28262003956565b62003904565b818152846020838601011115620039de57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562003a1157600080fd5b833567ffffffffffffffff8082111562003a2a57600080fd5b62003a38878388016200399f565b9450602086013591508082111562003a4f57600080fd5b5062003a5e868287016200399f565b9250506040840135620035f58162003516565b6000815180845262003a8b816020860160208601620038c0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60608152600062003ad2606083018662003a71565b828103602084015262003ae6818662003a71565b91505060ff83166040830152949350505050565b63ffffffff86168152600073ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200319f608083018486620037bd565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff8416602082015260606040820152600062003b80606083018486620037bd565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003c1c5762003c1c62003bb9565b5060010190565b60608152600062003c39606083018789620037bd565b828103602084015262003c4e818688620037bd565b91505060ff831660408301529695505050505050565b6000835162003c78818460208801620038c0565b83519083019062003c8e818360208801620038c0565b01949350505050565b60006020828403121562003caa57600080fd5b5051919050565b81810381811115620007a257620007a262003bb9565b600061010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003d278285018762003a71565b925080851660e085015250509998505050505050505050565b600181815b8085111562003d9f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d835762003d8362003bb9565b8085161562003d9157918102915b93841c939080029062003d45565b509250929050565b60008262003db857506001620007a2565b8162003dc757506000620007a2565b816001811462003de0576002811462003deb5762003e0b565b6001915050620007a2565b60ff84111562003dff5762003dff62003bb9565b50506001821b620007a2565b5060208310610133831016604e8410600b841016171562003e30575081810a620007a2565b62003e3c838362003d40565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003e715762003e7162003bb9565b029392505050565b60006200350f838362003da7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000808585111562003ec757600080fd5b8386111562003ed557600080fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003f235780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a03121562003f4757600080fd5b873562003f5481620032b5565b9650602088013562003f6681620032b5565b955060408801359450606088013593506080880135620035938162003516565b600080600080600080600080610100898b03121562003fa457600080fd5b883562003fb181620032b5565b9750602089013562003fc381620032b5565b96506040890135955060608901359450608089013562003fe38162003317565b935060a089013562003ff58162003516565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200402557600080fd5b81516200350f8162003516565b6000602082840312156200404557600080fd5b81516200350f8162003317565b6000602082840312156200406557600080fd5b815167ffffffffffffffff8111156200407d57600080fd5b8201601f810184136200408f57600080fd5b8051620040a0620039c28262003956565b818152856020838501011115620040b657600080fd5b620040c9826020830160208601620038c0565b95945050505050565b6020815260006200350f602083018462003a7156fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212206fe049be388a1d04319b9913fe6d100c4c8e272fe0f5748eb056bd0622beabcc64736f6c63430008140033a2646970667358221220ef4412c515d53043ca441d4b33288d9aa2b101bc9853f859467ab1a42f16139c64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMBridgeMock.json b/compiled-contracts/paris/PolygonZkEVMBridgeMock.json index 1ad8182dd..8bcc271f0 100644 --- a/compiled-contracts/paris/PolygonZkEVMBridgeMock.json +++ b/compiled-contracts/paris/PolygonZkEVMBridgeMock.json @@ -867,8 +867,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50614a90806100206000396000f3fe608060405260043610620001705760003560e01c806315064c9614620001755780632072f6c514620001a657806322e95f2c14620001c0578063240ff37814620001f45780632b5e42e7146200020b5780632c3f58cd14620002305780632cffd02e14620002555780632d2c9d94146200027a5780632dfdf0b5146200029f578063318aee3d14620002c657806334ac9cf214620003345780633ae0504714620003565780633e197043146200036e578063647c576c1462000393578063715018a614620003b857806379e2cf9714620003d057806381b1c17414620003e85780638da5cb5b146200042257806391e57e2d146200043a5780639e34070f1462000452578063aaa13cc21462000497578063bab161bf14620004bc578063be5831c714620004f6578063cd586579146200051c578063d02103ca1462000533578063dbc16976146200055c578063ee25560b1462000574578063f2fde38b14620005a5578063fb57083414620005ca575b600080fd5b3480156200018257600080fd5b50606854620001919060ff1681565b60405190151581526020015b60405180910390f35b348015620001b357600080fd5b50620001be620005ef565b005b348015620001cd57600080fd5b50620001e5620001df3660046200277a565b62000627565b6040516200019d9190620027b6565b620001be6200020536600462002824565b6200067a565b3480156200021857600080fd5b50620001be6200022a366004620028a7565b62000790565b3480156200023d57600080fd5b50620001be6200024f366004620028c1565b6200079f565b3480156200026257600080fd5b50620001be62000274366004620028f9565b620007cb565b3480156200028757600080fd5b50620001be62000299366004620028f9565b62000bbe565b348015620002ac57600080fd5b50620002b760535481565b6040519081526020016200019d565b348015620002d357600080fd5b506200030f620002e5366004620029de565b606b6020526000908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b039091166020830152016200019d565b3480156200034157600080fd5b50606c54620001e5906001600160a01b031681565b3480156200036357600080fd5b50620002b762000cfc565b3480156200037b57600080fd5b50620002b76200038d36600462002a0e565b62000de4565b348015620003a057600080fd5b50620001be620003b236600462002a98565b62000e71565b348015620003c557600080fd5b50620001be62001001565b348015620003dd57600080fd5b50620001be62001017565b348015620003f557600080fd5b50620001e562000407366004620028a7565b606a602052600090815260409020546001600160a01b031681565b3480156200042f57600080fd5b50620001e56200103b565b3480156200044757600080fd5b50620002b760d15481565b3480156200045f57600080fd5b506200019162000471366004620028a7565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b348015620004a457600080fd5b50620001e5620004b636600462002ae8565b6200104a565b348015620004c957600080fd5b50606854620004e090610100900463ffffffff1681565b60405163ffffffff90911681526020016200019d565b3480156200050357600080fd5b50606854620004e090600160c81b900463ffffffff1681565b620001be6200052d36600462002b9b565b62001161565b3480156200054057600080fd5b50606854620001e590600160281b90046001600160a01b031681565b3480156200056957600080fd5b50620001be62001205565b3480156200058157600080fd5b50620002b762000593366004620028a7565b60696020526000908152604090205481565b348015620005b257600080fd5b50620001be620005c4366004620029de565b6200123b565b348015620005d757600080fd5b5062000191620005e936600462002c3c565b620012ba565b606c546001600160a01b031633146200061b5760405163e2e8106b60e01b815260040160405180910390fd5b6200062562001393565b565b6000606a600084846040516020016200064292919062002c89565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b60685460ff16156200069f57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161480620006c55750600263ffffffff861610155b15620006e4576040516302caf51760e11b815260040160405180910390fd5b60008051602062004a1b8339815191526001606860019054906101000a900463ffffffff16338888348888605354604051620007299998979695949392919062002cdc565b60405180910390a162000778620007726001606860019054906101000a900463ffffffff163389893489896040516200076492919062002d4b565b604051809103902062000de4565b620013f0565b8215620007895762000789620014ee565b5050505050565b6200079a62001586565b60d155565b620007a962001586565b6068805463ffffffff9092166101000264ffffffff0019909216919091179055565b60685460ff1615620007f057604051630bc011ff60e21b815260040160405180910390fd5b620008078b8b8b8b8b8b8b8b8b8b8b6000620015e9565b6001600160a01b038616620008b057604080516000808252602082019092526001600160a01b03861690859060405162000842919062002d97565b60006040518083038185875af1925050503d806000811462000881576040519150601f19603f3d011682016040523d82523d6000602084013e62000886565b606091505b5050905080620008a957604051630ce8f45160e31b815260040160405180910390fd5b5062000b81565b60685463ffffffff610100909104811690881603620008e557620008df6001600160a01b038716858562001752565b62000b81565b60008787604051602001620008fc92919062002c89565b60408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b03168062000b195760008080620009458688018862002e6e565b9250925092506000858484846040516200095f9062002741565b6200096d9392919062002f11565b8190604051809103906000f59050801580156200098e573d6000803e3d6000fd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f1990620009c2908d908d9060040162002f4e565b600060405180830381600087803b158015620009dd57600080fd5b505af1158015620009f2573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000b0795949392919062002f67565b60405180910390a15050505062000b7e565b6040516340c10f1960e01b81526001600160a01b038216906340c10f199062000b49908990899060040162002f4e565b600060405180830381600087803b15801562000b6457600080fd5b505af115801562000b79573d6000803e3d6000fd5b505050505b50505b60008051602062004a3b8339815191528a8888878760405162000ba995949392919062002fa2565b60405180910390a15050505050505050505050565b60685460ff161562000be357604051630bc011ff60e21b815260040160405180910390fd5b62000bfa8b8b8b8b8b8b8b8b8b8b8b6001620015e9565b6000846001600160a01b031684888a868660405160240162000c20949392919062002fd9565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162000c57919062002d97565b60006040518083038185875af1925050503d806000811462000c96576040519150601f19603f3d011682016040523d82523d6000602084013e62000c9b565b606091505b505090508062000cbe576040516337e391c360e01b815260040160405180910390fd5b60008051602062004a3b8339815191528b8989888860405162000ce695949392919062002fa2565b60405180910390a1505050505050505050505050565b605354600090819081805b602081101562000ddb578083901c60011660010362000d6a576033816020811062000d365762000d3662003016565b01548460405160200162000d4c9291906200302c565b60405160208183030381529060405280519060200120935062000d98565b838260405160200162000d7f9291906200302c565b6040516020818303038152906040528051906020012093505b818260405160200162000dad9291906200302c565b604051602081830303815290604052805190602001209150808062000dd29062003050565b91505062000d07565b50919392505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b600054610100900460ff161580801562000e925750600054600160ff909116105b8062000eb7575062000ea430620017ac565b15801562000eb7575060005460ff166001145b62000f205760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000f44576000805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff871602600160281b600160c81b03191617600160281b6001600160a01b038681169190910291909117909155606c80546001600160a01b0319169184169190911790556703782dace9d9000060d15562000fb4620017bb565b801562000ffb576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6200100b62001586565b6200062560006200182e565b605354606854600160c81b900463ffffffff161015620006255762000625620014ee565b609f546001600160a01b031690565b60008088886040516020016200106292919062002c89565b604051602081830303815290604052805190602001209050600060ff60f81b308360405180602001620010959062002741565b601f1982820381018352601f909101166040819052620010c2908d908d908d908d908d906020016200306c565b60408051601f1981840301815290829052620010e29291602001620030ad565b604051602081830303815290604052805190602001206040516020016200113b94939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b60d154341115620011eb5760405162461bcd60e51b815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d6178457468656064820152667242726964676560c81b608482015260a40162000f17565b620011fc8787878787878762001880565b50505050505050565b606c546001600160a01b03163314620012315760405163e2e8106b60e01b815260040160405180910390fd5b6200062562001c0d565b6200124562001586565b6001600160a01b038116620012ac5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000f17565b620012b7816200182e565b50565b600084815b60208110156200138557600163ffffffff8616821c811690036200132957858160208110620012f257620012f262003016565b6020020135826040516020016200130b9291906200302c565b60405160208183030381529060405280519060200120915062001370565b818682602081106200133f576200133f62003016565b6020020135604051602001620013579291906200302c565b6040516020818303038152906040528051906020012091505b806200137c8162003050565b915050620012bf565b50821490505b949350505050565b60685460ff1615620013b857604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b8060016200140160206002620031dd565b6200140d9190620031eb565b605354106200142f576040516377ae67b360e11b815260040160405180910390fd5b6000605360008154620014429062003050565b9182905550905060005b6020811015620014de578082901c600116600103620014845782603382602081106200147c576200147c62003016565b015550505050565b603381602081106200149a576200149a62003016565b015483604051602001620014b09291906200302c565b6040516020818303038152906040528051906020012092508080620014d59062003050565b9150506200144c565b50620014e962003201565b505050565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d6200153762000cfc565b6040518263ffffffff1660e01b81526004016200155691815260200190565b600060405180830381600087803b1580156200157157600080fd5b505af115801562000ffb573d6000803e3d6000fd5b33620015916200103b565b6001600160a01b031614620006255760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000f17565b620015fa8b63ffffffff1662001c66565b606854600090600160281b90046001600160a01b031663257b3632620016218d8d62001cb2565b6040518263ffffffff1660e01b81526004016200164091815260200190565b6020604051808303816000875af115801562001660573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001686919062003217565b905080600003620016a957604051622f6fad60e01b815260040160405180910390fd5b60685463ffffffff8881166101009092041614620016da576040516302caf51760e11b815260040160405180910390fd5b606854600090610100900463ffffffff16620016f8575089620016fb565b508a5b620017246200171b848c8c8c8c8c8c8c6040516200076492919062002d4b565b8f8f84620012ba565b62001742576040516338105f3b60e21b815260040160405180910390fd5b5050505050505050505050505050565b620014e98363a9059cbb60e01b84846040516024016200177492919062002f4e565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262001ce7565b6001600160a01b03163b151590565b600054610100900460ff16620018285760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000f17565b62000625335b609f80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60685460ff1615620018a557604051630bc011ff60e21b815260040160405180910390fd5b620018af62001dc0565b60685463ffffffff888116610100909204161480620018d55750600263ffffffff881610155b15620018f4576040516302caf51760e11b815260040160405180910390fd5b6000806060876001600160a01b03881662001934578834146200192a5760405163b89240f560e01b815260040160405180910390fd5b6000925062001b98565b3415620019545760405163798ee6f160e01b815260040160405180910390fd5b6001600160a01b038089166000908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b9004909216918101829052901562001a1257604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac90620019ca9033908e9060040162002f4e565b600060405180830381600087803b158015620019e557600080fd5b505af1158015620019fa573d6000803e3d6000fd5b50505050806020015194508060000151935062001b96565b851562001a275762001a27898b898962001e1b565b6040516370a0823160e01b81526000906001600160a01b038b16906370a082319062001a58903090600401620027b6565b602060405180830381865afa15801562001a76573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a9c919062003217565b905062001ab56001600160a01b038b1633308e6200217d565b6040516370a0823160e01b81526000906001600160a01b038c16906370a082319062001ae6903090600401620027b6565b602060405180830381865afa15801562001b04573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001b2a919062003217565b905062001b388282620031eb565b6068548c9850610100900463ffffffff169650935062001b5887620021b7565b62001b638c6200227e565b62001b6e8d6200233c565b60405160200162001b829392919062002f11565b604051602081830303815290604052945050505b505b60008051602062004a1b833981519152600084868e8e868860535460405162001bc998979695949392919062003231565b60405180910390a162001bee62000772600085878f8f87898051906020012062000de4565b861562001bff5762001bff620014ee565b50505050620011fc60018055565b60685460ff1662001c3157604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600881901c60008181526069602052604081208054600160ff861690811b918218928390559290919081831690036200078957604051630c8d9eab60e31b815260040160405180910390fd5b6000828260405160200162001cc99291906200302c565b60405160208183030381529060405280519060200120905092915050565b600062001d3e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620023fd9092919063ffffffff16565b805190915015620014e9578080602001905181019062001d5f91906200329e565b620014e95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000f17565b60026001540362001e145760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000f17565b6002600155565b600062001e2c6004828486620032be565b62001e3791620032ea565b9050632afa533160e01b6001600160e01b031982160162001fd857600080808080808062001e69896004818d620032be565b81019062001e7891906200331b565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161462001eb95760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038616301462001ee35760405163750643af60e01b815260040160405180910390fd5b8a851462001f04576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e169162001f84919062002d97565b6000604051808303816000865af19150503d806000811462001fc3576040519150601f19603f3d011682016040523d82523d6000602084013e62001fc8565b606091505b5050505050505050505062000789565b6001600160e01b031981166323f2ebc360e21b146200200a57604051637141605d60e11b815260040160405180910390fd5b600080808080808080620020228a6004818e620032be565b81019062002031919062003376565b97509750975097509750975097509750336001600160a01b0316886001600160a01b031614620020745760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146200209e5760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169162002127919062002d97565b6000604051808303816000865af19150503d806000811462002166576040519150601f19603f3d011682016040523d82523d6000602084013e6200216b565b606091505b50505050505050505050505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905262000ffb9085906323b872dd60e01b9060840162001774565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009182916001600160a01b0386169162002200919062002d97565b600060405180830381855afa9150503d80600081146200223d576040519150601f19603f3d011682016040523d82523d6000602084013e62002242565b606091505b5091509150816200227357604051806040016040528060078152602001664e4f5f4e414d4560c81b8152506200138b565b6200138b816200240e565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009182916001600160a01b03861691620022c7919062002d97565b600060405180830381855afa9150503d806000811462002304576040519150601f19603f3d011682016040523d82523d6000602084013e62002309565b606091505b5091509150816200227357604051806040016040528060098152602001681393d7d4d6535093d360ba1b8152506200138b565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b0386169162002384919062002d97565b600060405180830381855afa9150503d8060008114620023c1576040519150601f19603f3d011682016040523d82523d6000602084013e620023c6565b606091505b5091509150818015620023da575080516020145b620023e75760126200138b565b808060200190518101906200138b919062003402565b60606200138b8484600085620025b7565b6060604082511062002430578180602001905181019062000674919062003422565b8151602003620025845760005b6020811080156200247057508281815181106200245e576200245e62003016565b01602001516001600160f81b03191615155b156200248b5780620024828162003050565b9150506200243d565b80600003620024c45750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b6000816001600160401b03811115620024e157620024e162002d5b565b6040519080825280601f01601f1916602001820160405280156200250c576020820181803683370190505b50905060005b828110156200257c5784818151811062002530576200253062003016565b602001015160f81c60f81b82828151811062002550576200255062003016565b60200101906001600160f81b031916908160001a90535080620025738162003050565b91505062002512565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b6060824710156200261a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000f17565b600080866001600160a01b0316858760405162002638919062002d97565b60006040518083038185875af1925050503d806000811462002677576040519150601f19603f3d011682016040523d82523d6000602084013e6200267c565b606091505b50915091506200268f878383876200269a565b979650505050505050565b606083156200270e5782516000036200270657620026b885620017ac565b620027065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000f17565b50816200138b565b6200138b8383815115620027255781518083602001fd5b8060405162461bcd60e51b815260040162000f179190620034a1565b61156480620034b783390190565b803563ffffffff81168114620025b257600080fd5b6001600160a01b0381168114620012b757600080fd5b600080604083850312156200278e57600080fd5b62002799836200274f565b91506020830135620027ab8162002764565b809150509250929050565b6001600160a01b0391909116815260200190565b8015158114620012b757600080fd5b60008083601f840112620027ec57600080fd5b5081356001600160401b038111156200280457600080fd5b6020830191508360208285010111156200281d57600080fd5b9250929050565b6000806000806000608086880312156200283d57600080fd5b62002848866200274f565b945060208601356200285a8162002764565b935060408601356200286c81620027ca565b925060608601356001600160401b038111156200288857600080fd5b6200289688828901620027d9565b969995985093965092949392505050565b600060208284031215620028ba57600080fd5b5035919050565b600060208284031215620028d457600080fd5b620028df826200274f565b9392505050565b8061040081018310156200067457600080fd5b60008060008060008060008060008060006105208c8e0312156200291c57600080fd5b620029288d8d620028e6565b9a50620029396104008d016200274f565b99506104208c013598506104408c013597506200295a6104608d016200274f565b96506104808c01356200296d8162002764565b95506200297e6104a08d016200274f565b94506104c08c0135620029918162002764565b93506104e08c013592506105008c01356001600160401b03811115620029b657600080fd5b620029c48e828f01620027d9565b915080935050809150509295989b509295989b9093969950565b600060208284031215620029f157600080fd5b8135620028df8162002764565b60ff81168114620012b757600080fd5b600080600080600080600060e0888a03121562002a2a57600080fd5b873562002a3781620029fe565b965062002a47602089016200274f565b9550604088013562002a598162002764565b945062002a69606089016200274f565b9350608088013562002a7b8162002764565b9699959850939692959460a0840135945060c09093013592915050565b60008060006060848603121562002aae57600080fd5b62002ab9846200274f565b9250602084013562002acb8162002764565b9150604084013562002add8162002764565b809150509250925092565b600080600080600080600060a0888a03121562002b0457600080fd5b62002b0f886200274f565b9650602088013562002b218162002764565b955060408801356001600160401b038082111562002b3e57600080fd5b62002b4c8b838c01620027d9565b909750955060608a013591508082111562002b6657600080fd5b5062002b758a828b01620027d9565b909450925050608088013562002b8b81620029fe565b8091505092959891949750929550565b600080600080600080600060c0888a03121562002bb757600080fd5b62002bc2886200274f565b9650602088013562002bd48162002764565b955060408801359450606088013562002bed8162002764565b9350608088013562002bff81620027ca565b925060a08801356001600160401b0381111562002c1b57600080fd5b62002c298a828b01620027d9565b989b979a50959850939692959293505050565b600080600080610460858703121562002c5457600080fd5b8435935062002c678660208701620028e6565b925062002c7861042086016200274f565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c0830181905260009162002d31848301878962002cb3565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101562002d8e57818101518382015260200162002d74565b50506000910152565b6000825162002dab81846020870162002d71565b9190910192915050565b604051601f8201601f191681016001600160401b038111828210171562002de05762002de062002d5b565b604052919050565b60006001600160401b0382111562002e045762002e0462002d5b565b50601f01601f191660200190565b600082601f83011262002e2457600080fd5b813562002e3b62002e358262002de8565b62002db5565b81815284602083860101111562002e5157600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562002e8457600080fd5b83356001600160401b038082111562002e9c57600080fd5b62002eaa8783880162002e12565b9450602086013591508082111562002ec157600080fd5b5062002ed08682870162002e12565b925050604084013562002add81620029fe565b6000815180845262002efd81602086016020860162002d71565b601f01601f19169290920160200192915050565b60608152600062002f26606083018662002ee3565b828103602084015262002f3a818662002ee3565b91505060ff83166040830152949350505050565b6001600160a01b03929092168252602082015260400190565b63ffffffff861681526001600160a01b038581166020830152841660408201526080606082018190526000906200268f908301848662002cb3565b63ffffffff95861681529390941660208401526001600160a01b039182166040840152166060820152608081019190915260a00190565b6001600160a01b038516815263ffffffff841660208201526060604082018190526000906200300c908301848662002cb3565b9695505050505050565b634e487b7160e01b600052603260045260246000fd5b918252602082015260400190565b634e487b7160e01b600052601160045260246000fd5b6000600182016200306557620030656200303a565b5060010190565b6060815260006200308260608301878962002cb3565b82810360208401526200309781868862002cb3565b91505060ff831660408301529695505050505050565b60008351620030c181846020880162002d71565b835190830190620030d781836020880162002d71565b01949350505050565b600181815b80851115620031215781600019048211156200310557620031056200303a565b808516156200311357918102915b93841c9390800290620030e5565b509250929050565b6000826200313a5750600162000674565b81620031495750600062000674565b81600181146200316257600281146200316d576200318d565b600191505062000674565b60ff8411156200318157620031816200303a565b50506001821b62000674565b5060208310610133831016604e8410600b8410161715620031b2575081810a62000674565b620031be8383620030e0565b8060001904821115620031d557620031d56200303a565b029392505050565b6000620028df838362003129565b818103818111156200067457620006746200303a565b634e487b7160e01b600052600160045260246000fd5b6000602082840312156200322a57600080fd5b5051919050565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c08301819052600091620032858483018762002ee3565b925080851660e085015250509998505050505050505050565b600060208284031215620032b157600080fd5b8151620028df81620027ca565b60008085851115620032cf57600080fd5b83861115620032dd57600080fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015620033135780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a0312156200333757600080fd5b8735620033448162002764565b96506020880135620033568162002764565b95506040880135945060608801359350608088013562002a7b81620029fe565b600080600080600080600080610100898b0312156200339457600080fd5b8835620033a18162002764565b97506020890135620033b38162002764565b965060408901359550606089013594506080890135620033d381620027ca565b935060a0890135620033e581620029fe565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200341557600080fd5b8151620028df81620029fe565b6000602082840312156200343557600080fd5b81516001600160401b038111156200344c57600080fd5b8201601f810184136200345e57600080fd5b80516200346f62002e358262002de8565b8181528560208385010111156200348557600080fd5b6200349882602083016020860162002d71565b95945050505050565b602081526000620028df602083018462002ee356fe6101006040523480156200001257600080fd5b50604051620015643803806200156483398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516110a8620004bc60003960006101a30152600081816102660152818161048c01526104fa0152600061043d0152600081816102cb015261040701526110a86000f3fe608060405234801561001057600080fd5b50600436106101075760003560e01c806306fdde031461010c578063095ea7b31461012a57806318160ddd1461014d57806320606b701461015f57806323b872dd1461017457806330adf81f14610187578063313ce5671461019c5780633644e515146101cd57806339509351146101d557806340c10f19146101e857806370a08231146101fd5780637ecebe001461022657806395d89b41146102465780639dc29fac1461024e578063a3c573eb14610261578063a457c2d7146102a0578063a9059cbb146102b3578063cd0d0096146102c6578063d505accf146102ed578063dd62ed3e14610300578063ffa1ad7414610313575b600080fd5b610114610333565b6040516101219190610dae565b60405180910390f35b61013d610138366004610e18565b6103c5565b6040519015158152602001610121565b6002545b604051908152602001610121565b61015160008051602061105383398151915281565b61013d610182366004610e42565b6103df565b61015160008051602061103383398151915281565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610121565b610151610403565b61013d6101e3366004610e18565b61045f565b6101fb6101f6366004610e18565b610481565b005b61015161020b366004610e7e565b6001600160a01b031660009081526020819052604090205490565b610151610234366004610e7e565b60056020526000908152604090205481565b6101146104e0565b6101fb61025c366004610e18565b6104ef565b6102887f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610121565b61013d6102ae366004610e18565b610541565b61013d6102c1366004610e18565b6105bc565b6101517f000000000000000000000000000000000000000000000000000000000000000081565b6101fb6102fb366004610ea0565b6105ca565b61015161030e366004610f13565b6107f3565b610114604051806040016040528060018152602001603160f81b81525081565b60606003805461034290610f46565b80601f016020809104026020016040519081016040528092919081815260200182805461036e90610f46565b80156103bb5780601f10610390576101008083540402835291602001916103bb565b820191906000526020600020905b81548152906001019060200180831161039e57829003601f168201915b5050505050905090565b6000336103d381858561081e565b60019150505b92915050565b6000336103ed858285610943565b6103f88585856109bd565b506001949350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461461043a5761043546610b4f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000336103d381858561047283836107f3565b61047c9190610f96565b61081e565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104d25760405162461bcd60e51b81526004016104c990610fa9565b60405180910390fd5b6104dc8282610be9565b5050565b60606004805461034290610f46565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105375760405162461bcd60e51b81526004016104c990610fa9565b6104dc8282610c96565b6000338161054f82866107f3565b9050838110156105af5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104c9565b6103f8828686840361081e565b6000336103d38185856109bd565b834211156106265760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104c9565b6001600160a01b03871660009081526005602052604081208054600080516020611033833981519152918a918a918a91908661066183610ff9565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006106bf610403565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa15801561074a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906107805750896001600160a01b0316816001600160a01b0316145b6107dc5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104c9565b6107e78a8a8a61081e565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166108805760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104c9565b6001600160a01b0382166108e15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104c9565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600061094f84846107f3565b905060001981146109b757818110156109aa5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104c9565b6109b7848484840361081e565b50505050565b6001600160a01b038316610a215760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104c9565b6001600160a01b038216610a835760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104c9565b6001600160a01b03831660009081526020819052604090205481811015610afb5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104c9565b6001600160a01b0384811660008181526020818152604080832087870390559387168083529184902080548701905592518581529092600080516020611013833981519152910160405180910390a36109b7565b6000600080516020611053833981519152610b68610333565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c3f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104c9565b8060026000828254610c519190610f96565b90915550506001600160a01b03821660008181526020818152604080832080548601905551848152600080516020611013833981519152910160405180910390a35050565b6001600160a01b038216610cf65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104c9565b6001600160a01b03821660009081526020819052604090205481811015610d6a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104c9565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192916000805160206110138339815191529101610936565b600060208083528351808285015260005b81811015610ddb57858101830151858201604001528201610dbf565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610e1357600080fd5b919050565b60008060408385031215610e2b57600080fd5b610e3483610dfc565b946020939093013593505050565b600080600060608486031215610e5757600080fd5b610e6084610dfc565b9250610e6e60208501610dfc565b9150604084013590509250925092565b600060208284031215610e9057600080fd5b610e9982610dfc565b9392505050565b600080600080600080600060e0888a031215610ebb57600080fd5b610ec488610dfc565b9650610ed260208901610dfc565b95506040880135945060608801359350608088013560ff81168114610ef657600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f2657600080fd5b610f2f83610dfc565b9150610f3d60208401610dfc565b90509250929050565b600181811c90821680610f5a57607f821691505b602082108103610f7a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156103d9576103d9610f80565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b60006001820161100b5761100b610f80565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa26469706673582212203ea4a1224be7b5ef35dc397dfc81433d85cd6fdbf17d8b2e3d528071e7e612b564736f6c63430008140033501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe27545983a26469706673582212209433428555ad2611b778c6d4bd276ba680e0aee0111f4647137d5f0a5836619e64736f6c63430008140033", - "deployedBytecode": "0x608060405260043610620001705760003560e01c806315064c9614620001755780632072f6c514620001a657806322e95f2c14620001c0578063240ff37814620001f45780632b5e42e7146200020b5780632c3f58cd14620002305780632cffd02e14620002555780632d2c9d94146200027a5780632dfdf0b5146200029f578063318aee3d14620002c657806334ac9cf214620003345780633ae0504714620003565780633e197043146200036e578063647c576c1462000393578063715018a614620003b857806379e2cf9714620003d057806381b1c17414620003e85780638da5cb5b146200042257806391e57e2d146200043a5780639e34070f1462000452578063aaa13cc21462000497578063bab161bf14620004bc578063be5831c714620004f6578063cd586579146200051c578063d02103ca1462000533578063dbc16976146200055c578063ee25560b1462000574578063f2fde38b14620005a5578063fb57083414620005ca575b600080fd5b3480156200018257600080fd5b50606854620001919060ff1681565b60405190151581526020015b60405180910390f35b348015620001b357600080fd5b50620001be620005ef565b005b348015620001cd57600080fd5b50620001e5620001df3660046200277a565b62000627565b6040516200019d9190620027b6565b620001be6200020536600462002824565b6200067a565b3480156200021857600080fd5b50620001be6200022a366004620028a7565b62000790565b3480156200023d57600080fd5b50620001be6200024f366004620028c1565b6200079f565b3480156200026257600080fd5b50620001be62000274366004620028f9565b620007cb565b3480156200028757600080fd5b50620001be62000299366004620028f9565b62000bbe565b348015620002ac57600080fd5b50620002b760535481565b6040519081526020016200019d565b348015620002d357600080fd5b506200030f620002e5366004620029de565b606b6020526000908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b039091166020830152016200019d565b3480156200034157600080fd5b50606c54620001e5906001600160a01b031681565b3480156200036357600080fd5b50620002b762000cfc565b3480156200037b57600080fd5b50620002b76200038d36600462002a0e565b62000de4565b348015620003a057600080fd5b50620001be620003b236600462002a98565b62000e71565b348015620003c557600080fd5b50620001be62001001565b348015620003dd57600080fd5b50620001be62001017565b348015620003f557600080fd5b50620001e562000407366004620028a7565b606a602052600090815260409020546001600160a01b031681565b3480156200042f57600080fd5b50620001e56200103b565b3480156200044757600080fd5b50620002b760d15481565b3480156200045f57600080fd5b506200019162000471366004620028a7565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b348015620004a457600080fd5b50620001e5620004b636600462002ae8565b6200104a565b348015620004c957600080fd5b50606854620004e090610100900463ffffffff1681565b60405163ffffffff90911681526020016200019d565b3480156200050357600080fd5b50606854620004e090600160c81b900463ffffffff1681565b620001be6200052d36600462002b9b565b62001161565b3480156200054057600080fd5b50606854620001e590600160281b90046001600160a01b031681565b3480156200056957600080fd5b50620001be62001205565b3480156200058157600080fd5b50620002b762000593366004620028a7565b60696020526000908152604090205481565b348015620005b257600080fd5b50620001be620005c4366004620029de565b6200123b565b348015620005d757600080fd5b5062000191620005e936600462002c3c565b620012ba565b606c546001600160a01b031633146200061b5760405163e2e8106b60e01b815260040160405180910390fd5b6200062562001393565b565b6000606a600084846040516020016200064292919062002c89565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b60685460ff16156200069f57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161480620006c55750600263ffffffff861610155b15620006e4576040516302caf51760e11b815260040160405180910390fd5b60008051602062004a1b8339815191526001606860019054906101000a900463ffffffff16338888348888605354604051620007299998979695949392919062002cdc565b60405180910390a162000778620007726001606860019054906101000a900463ffffffff163389893489896040516200076492919062002d4b565b604051809103902062000de4565b620013f0565b8215620007895762000789620014ee565b5050505050565b6200079a62001586565b60d155565b620007a962001586565b6068805463ffffffff9092166101000264ffffffff0019909216919091179055565b60685460ff1615620007f057604051630bc011ff60e21b815260040160405180910390fd5b620008078b8b8b8b8b8b8b8b8b8b8b6000620015e9565b6001600160a01b038616620008b057604080516000808252602082019092526001600160a01b03861690859060405162000842919062002d97565b60006040518083038185875af1925050503d806000811462000881576040519150601f19603f3d011682016040523d82523d6000602084013e62000886565b606091505b5050905080620008a957604051630ce8f45160e31b815260040160405180910390fd5b5062000b81565b60685463ffffffff610100909104811690881603620008e557620008df6001600160a01b038716858562001752565b62000b81565b60008787604051602001620008fc92919062002c89565b60408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b03168062000b195760008080620009458688018862002e6e565b9250925092506000858484846040516200095f9062002741565b6200096d9392919062002f11565b8190604051809103906000f59050801580156200098e573d6000803e3d6000fd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f1990620009c2908d908d9060040162002f4e565b600060405180830381600087803b158015620009dd57600080fd5b505af1158015620009f2573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000b0795949392919062002f67565b60405180910390a15050505062000b7e565b6040516340c10f1960e01b81526001600160a01b038216906340c10f199062000b49908990899060040162002f4e565b600060405180830381600087803b15801562000b6457600080fd5b505af115801562000b79573d6000803e3d6000fd5b505050505b50505b60008051602062004a3b8339815191528a8888878760405162000ba995949392919062002fa2565b60405180910390a15050505050505050505050565b60685460ff161562000be357604051630bc011ff60e21b815260040160405180910390fd5b62000bfa8b8b8b8b8b8b8b8b8b8b8b6001620015e9565b6000846001600160a01b031684888a868660405160240162000c20949392919062002fd9565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162000c57919062002d97565b60006040518083038185875af1925050503d806000811462000c96576040519150601f19603f3d011682016040523d82523d6000602084013e62000c9b565b606091505b505090508062000cbe576040516337e391c360e01b815260040160405180910390fd5b60008051602062004a3b8339815191528b8989888860405162000ce695949392919062002fa2565b60405180910390a1505050505050505050505050565b605354600090819081805b602081101562000ddb578083901c60011660010362000d6a576033816020811062000d365762000d3662003016565b01548460405160200162000d4c9291906200302c565b60405160208183030381529060405280519060200120935062000d98565b838260405160200162000d7f9291906200302c565b6040516020818303038152906040528051906020012093505b818260405160200162000dad9291906200302c565b604051602081830303815290604052805190602001209150808062000dd29062003050565b91505062000d07565b50919392505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b600054610100900460ff161580801562000e925750600054600160ff909116105b8062000eb7575062000ea430620017ac565b15801562000eb7575060005460ff166001145b62000f205760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000f44576000805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff871602600160281b600160c81b03191617600160281b6001600160a01b038681169190910291909117909155606c80546001600160a01b0319169184169190911790556703782dace9d9000060d15562000fb4620017bb565b801562000ffb576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6200100b62001586565b6200062560006200182e565b605354606854600160c81b900463ffffffff161015620006255762000625620014ee565b609f546001600160a01b031690565b60008088886040516020016200106292919062002c89565b604051602081830303815290604052805190602001209050600060ff60f81b308360405180602001620010959062002741565b601f1982820381018352601f909101166040819052620010c2908d908d908d908d908d906020016200306c565b60408051601f1981840301815290829052620010e29291602001620030ad565b604051602081830303815290604052805190602001206040516020016200113b94939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b60d154341115620011eb5760405162461bcd60e51b815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d6178457468656064820152667242726964676560c81b608482015260a40162000f17565b620011fc8787878787878762001880565b50505050505050565b606c546001600160a01b03163314620012315760405163e2e8106b60e01b815260040160405180910390fd5b6200062562001c0d565b6200124562001586565b6001600160a01b038116620012ac5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000f17565b620012b7816200182e565b50565b600084815b60208110156200138557600163ffffffff8616821c811690036200132957858160208110620012f257620012f262003016565b6020020135826040516020016200130b9291906200302c565b60405160208183030381529060405280519060200120915062001370565b818682602081106200133f576200133f62003016565b6020020135604051602001620013579291906200302c565b6040516020818303038152906040528051906020012091505b806200137c8162003050565b915050620012bf565b50821490505b949350505050565b60685460ff1615620013b857604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b8060016200140160206002620031dd565b6200140d9190620031eb565b605354106200142f576040516377ae67b360e11b815260040160405180910390fd5b6000605360008154620014429062003050565b9182905550905060005b6020811015620014de578082901c600116600103620014845782603382602081106200147c576200147c62003016565b015550505050565b603381602081106200149a576200149a62003016565b015483604051602001620014b09291906200302c565b6040516020818303038152906040528051906020012092508080620014d59062003050565b9150506200144c565b50620014e962003201565b505050565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d6200153762000cfc565b6040518263ffffffff1660e01b81526004016200155691815260200190565b600060405180830381600087803b1580156200157157600080fd5b505af115801562000ffb573d6000803e3d6000fd5b33620015916200103b565b6001600160a01b031614620006255760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000f17565b620015fa8b63ffffffff1662001c66565b606854600090600160281b90046001600160a01b031663257b3632620016218d8d62001cb2565b6040518263ffffffff1660e01b81526004016200164091815260200190565b6020604051808303816000875af115801562001660573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001686919062003217565b905080600003620016a957604051622f6fad60e01b815260040160405180910390fd5b60685463ffffffff8881166101009092041614620016da576040516302caf51760e11b815260040160405180910390fd5b606854600090610100900463ffffffff16620016f8575089620016fb565b508a5b620017246200171b848c8c8c8c8c8c8c6040516200076492919062002d4b565b8f8f84620012ba565b62001742576040516338105f3b60e21b815260040160405180910390fd5b5050505050505050505050505050565b620014e98363a9059cbb60e01b84846040516024016200177492919062002f4e565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262001ce7565b6001600160a01b03163b151590565b600054610100900460ff16620018285760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000f17565b62000625335b609f80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60685460ff1615620018a557604051630bc011ff60e21b815260040160405180910390fd5b620018af62001dc0565b60685463ffffffff888116610100909204161480620018d55750600263ffffffff881610155b15620018f4576040516302caf51760e11b815260040160405180910390fd5b6000806060876001600160a01b03881662001934578834146200192a5760405163b89240f560e01b815260040160405180910390fd5b6000925062001b98565b3415620019545760405163798ee6f160e01b815260040160405180910390fd5b6001600160a01b038089166000908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b9004909216918101829052901562001a1257604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac90620019ca9033908e9060040162002f4e565b600060405180830381600087803b158015620019e557600080fd5b505af1158015620019fa573d6000803e3d6000fd5b50505050806020015194508060000151935062001b96565b851562001a275762001a27898b898962001e1b565b6040516370a0823160e01b81526000906001600160a01b038b16906370a082319062001a58903090600401620027b6565b602060405180830381865afa15801562001a76573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a9c919062003217565b905062001ab56001600160a01b038b1633308e6200217d565b6040516370a0823160e01b81526000906001600160a01b038c16906370a082319062001ae6903090600401620027b6565b602060405180830381865afa15801562001b04573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001b2a919062003217565b905062001b388282620031eb565b6068548c9850610100900463ffffffff169650935062001b5887620021b7565b62001b638c6200227e565b62001b6e8d6200233c565b60405160200162001b829392919062002f11565b604051602081830303815290604052945050505b505b60008051602062004a1b833981519152600084868e8e868860535460405162001bc998979695949392919062003231565b60405180910390a162001bee62000772600085878f8f87898051906020012062000de4565b861562001bff5762001bff620014ee565b50505050620011fc60018055565b60685460ff1662001c3157604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600881901c60008181526069602052604081208054600160ff861690811b918218928390559290919081831690036200078957604051630c8d9eab60e31b815260040160405180910390fd5b6000828260405160200162001cc99291906200302c565b60405160208183030381529060405280519060200120905092915050565b600062001d3e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620023fd9092919063ffffffff16565b805190915015620014e9578080602001905181019062001d5f91906200329e565b620014e95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000f17565b60026001540362001e145760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000f17565b6002600155565b600062001e2c6004828486620032be565b62001e3791620032ea565b9050632afa533160e01b6001600160e01b031982160162001fd857600080808080808062001e69896004818d620032be565b81019062001e7891906200331b565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161462001eb95760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038616301462001ee35760405163750643af60e01b815260040160405180910390fd5b8a851462001f04576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e169162001f84919062002d97565b6000604051808303816000865af19150503d806000811462001fc3576040519150601f19603f3d011682016040523d82523d6000602084013e62001fc8565b606091505b5050505050505050505062000789565b6001600160e01b031981166323f2ebc360e21b146200200a57604051637141605d60e11b815260040160405180910390fd5b600080808080808080620020228a6004818e620032be565b81019062002031919062003376565b97509750975097509750975097509750336001600160a01b0316886001600160a01b031614620020745760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146200209e5760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169162002127919062002d97565b6000604051808303816000865af19150503d806000811462002166576040519150601f19603f3d011682016040523d82523d6000602084013e6200216b565b606091505b50505050505050505050505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905262000ffb9085906323b872dd60e01b9060840162001774565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009182916001600160a01b0386169162002200919062002d97565b600060405180830381855afa9150503d80600081146200223d576040519150601f19603f3d011682016040523d82523d6000602084013e62002242565b606091505b5091509150816200227357604051806040016040528060078152602001664e4f5f4e414d4560c81b8152506200138b565b6200138b816200240e565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009182916001600160a01b03861691620022c7919062002d97565b600060405180830381855afa9150503d806000811462002304576040519150601f19603f3d011682016040523d82523d6000602084013e62002309565b606091505b5091509150816200227357604051806040016040528060098152602001681393d7d4d6535093d360ba1b8152506200138b565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b0386169162002384919062002d97565b600060405180830381855afa9150503d8060008114620023c1576040519150601f19603f3d011682016040523d82523d6000602084013e620023c6565b606091505b5091509150818015620023da575080516020145b620023e75760126200138b565b808060200190518101906200138b919062003402565b60606200138b8484600085620025b7565b6060604082511062002430578180602001905181019062000674919062003422565b8151602003620025845760005b6020811080156200247057508281815181106200245e576200245e62003016565b01602001516001600160f81b03191615155b156200248b5780620024828162003050565b9150506200243d565b80600003620024c45750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b6000816001600160401b03811115620024e157620024e162002d5b565b6040519080825280601f01601f1916602001820160405280156200250c576020820181803683370190505b50905060005b828110156200257c5784818151811062002530576200253062003016565b602001015160f81c60f81b82828151811062002550576200255062003016565b60200101906001600160f81b031916908160001a90535080620025738162003050565b91505062002512565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b6060824710156200261a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000f17565b600080866001600160a01b0316858760405162002638919062002d97565b60006040518083038185875af1925050503d806000811462002677576040519150601f19603f3d011682016040523d82523d6000602084013e6200267c565b606091505b50915091506200268f878383876200269a565b979650505050505050565b606083156200270e5782516000036200270657620026b885620017ac565b620027065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000f17565b50816200138b565b6200138b8383815115620027255781518083602001fd5b8060405162461bcd60e51b815260040162000f179190620034a1565b61156480620034b783390190565b803563ffffffff81168114620025b257600080fd5b6001600160a01b0381168114620012b757600080fd5b600080604083850312156200278e57600080fd5b62002799836200274f565b91506020830135620027ab8162002764565b809150509250929050565b6001600160a01b0391909116815260200190565b8015158114620012b757600080fd5b60008083601f840112620027ec57600080fd5b5081356001600160401b038111156200280457600080fd5b6020830191508360208285010111156200281d57600080fd5b9250929050565b6000806000806000608086880312156200283d57600080fd5b62002848866200274f565b945060208601356200285a8162002764565b935060408601356200286c81620027ca565b925060608601356001600160401b038111156200288857600080fd5b6200289688828901620027d9565b969995985093965092949392505050565b600060208284031215620028ba57600080fd5b5035919050565b600060208284031215620028d457600080fd5b620028df826200274f565b9392505050565b8061040081018310156200067457600080fd5b60008060008060008060008060008060006105208c8e0312156200291c57600080fd5b620029288d8d620028e6565b9a50620029396104008d016200274f565b99506104208c013598506104408c013597506200295a6104608d016200274f565b96506104808c01356200296d8162002764565b95506200297e6104a08d016200274f565b94506104c08c0135620029918162002764565b93506104e08c013592506105008c01356001600160401b03811115620029b657600080fd5b620029c48e828f01620027d9565b915080935050809150509295989b509295989b9093969950565b600060208284031215620029f157600080fd5b8135620028df8162002764565b60ff81168114620012b757600080fd5b600080600080600080600060e0888a03121562002a2a57600080fd5b873562002a3781620029fe565b965062002a47602089016200274f565b9550604088013562002a598162002764565b945062002a69606089016200274f565b9350608088013562002a7b8162002764565b9699959850939692959460a0840135945060c09093013592915050565b60008060006060848603121562002aae57600080fd5b62002ab9846200274f565b9250602084013562002acb8162002764565b9150604084013562002add8162002764565b809150509250925092565b600080600080600080600060a0888a03121562002b0457600080fd5b62002b0f886200274f565b9650602088013562002b218162002764565b955060408801356001600160401b038082111562002b3e57600080fd5b62002b4c8b838c01620027d9565b909750955060608a013591508082111562002b6657600080fd5b5062002b758a828b01620027d9565b909450925050608088013562002b8b81620029fe565b8091505092959891949750929550565b600080600080600080600060c0888a03121562002bb757600080fd5b62002bc2886200274f565b9650602088013562002bd48162002764565b955060408801359450606088013562002bed8162002764565b9350608088013562002bff81620027ca565b925060a08801356001600160401b0381111562002c1b57600080fd5b62002c298a828b01620027d9565b989b979a50959850939692959293505050565b600080600080610460858703121562002c5457600080fd5b8435935062002c678660208701620028e6565b925062002c7861042086016200274f565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c0830181905260009162002d31848301878962002cb3565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101562002d8e57818101518382015260200162002d74565b50506000910152565b6000825162002dab81846020870162002d71565b9190910192915050565b604051601f8201601f191681016001600160401b038111828210171562002de05762002de062002d5b565b604052919050565b60006001600160401b0382111562002e045762002e0462002d5b565b50601f01601f191660200190565b600082601f83011262002e2457600080fd5b813562002e3b62002e358262002de8565b62002db5565b81815284602083860101111562002e5157600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562002e8457600080fd5b83356001600160401b038082111562002e9c57600080fd5b62002eaa8783880162002e12565b9450602086013591508082111562002ec157600080fd5b5062002ed08682870162002e12565b925050604084013562002add81620029fe565b6000815180845262002efd81602086016020860162002d71565b601f01601f19169290920160200192915050565b60608152600062002f26606083018662002ee3565b828103602084015262002f3a818662002ee3565b91505060ff83166040830152949350505050565b6001600160a01b03929092168252602082015260400190565b63ffffffff861681526001600160a01b038581166020830152841660408201526080606082018190526000906200268f908301848662002cb3565b63ffffffff95861681529390941660208401526001600160a01b039182166040840152166060820152608081019190915260a00190565b6001600160a01b038516815263ffffffff841660208201526060604082018190526000906200300c908301848662002cb3565b9695505050505050565b634e487b7160e01b600052603260045260246000fd5b918252602082015260400190565b634e487b7160e01b600052601160045260246000fd5b6000600182016200306557620030656200303a565b5060010190565b6060815260006200308260608301878962002cb3565b82810360208401526200309781868862002cb3565b91505060ff831660408301529695505050505050565b60008351620030c181846020880162002d71565b835190830190620030d781836020880162002d71565b01949350505050565b600181815b80851115620031215781600019048211156200310557620031056200303a565b808516156200311357918102915b93841c9390800290620030e5565b509250929050565b6000826200313a5750600162000674565b81620031495750600062000674565b81600181146200316257600281146200316d576200318d565b600191505062000674565b60ff8411156200318157620031816200303a565b50506001821b62000674565b5060208310610133831016604e8410600b8410161715620031b2575081810a62000674565b620031be8383620030e0565b8060001904821115620031d557620031d56200303a565b029392505050565b6000620028df838362003129565b818103818111156200067457620006746200303a565b634e487b7160e01b600052600160045260246000fd5b6000602082840312156200322a57600080fd5b5051919050565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c08301819052600091620032858483018762002ee3565b925080851660e085015250509998505050505050505050565b600060208284031215620032b157600080fd5b8151620028df81620027ca565b60008085851115620032cf57600080fd5b83861115620032dd57600080fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015620033135780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a0312156200333757600080fd5b8735620033448162002764565b96506020880135620033568162002764565b95506040880135945060608801359350608088013562002a7b81620029fe565b600080600080600080600080610100898b0312156200339457600080fd5b8835620033a18162002764565b97506020890135620033b38162002764565b965060408901359550606089013594506080890135620033d381620027ca565b935060a0890135620033e581620029fe565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200341557600080fd5b8151620028df81620029fe565b6000602082840312156200343557600080fd5b81516001600160401b038111156200344c57600080fd5b8201601f810184136200345e57600080fd5b80516200346f62002e358262002de8565b8181528560208385010111156200348557600080fd5b6200349882602083016020860162002d71565b95945050505050565b602081526000620028df602083018462002ee356fe6101006040523480156200001257600080fd5b50604051620015643803806200156483398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516110a8620004bc60003960006101a30152600081816102660152818161048c01526104fa0152600061043d0152600081816102cb015261040701526110a86000f3fe608060405234801561001057600080fd5b50600436106101075760003560e01c806306fdde031461010c578063095ea7b31461012a57806318160ddd1461014d57806320606b701461015f57806323b872dd1461017457806330adf81f14610187578063313ce5671461019c5780633644e515146101cd57806339509351146101d557806340c10f19146101e857806370a08231146101fd5780637ecebe001461022657806395d89b41146102465780639dc29fac1461024e578063a3c573eb14610261578063a457c2d7146102a0578063a9059cbb146102b3578063cd0d0096146102c6578063d505accf146102ed578063dd62ed3e14610300578063ffa1ad7414610313575b600080fd5b610114610333565b6040516101219190610dae565b60405180910390f35b61013d610138366004610e18565b6103c5565b6040519015158152602001610121565b6002545b604051908152602001610121565b61015160008051602061105383398151915281565b61013d610182366004610e42565b6103df565b61015160008051602061103383398151915281565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610121565b610151610403565b61013d6101e3366004610e18565b61045f565b6101fb6101f6366004610e18565b610481565b005b61015161020b366004610e7e565b6001600160a01b031660009081526020819052604090205490565b610151610234366004610e7e565b60056020526000908152604090205481565b6101146104e0565b6101fb61025c366004610e18565b6104ef565b6102887f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610121565b61013d6102ae366004610e18565b610541565b61013d6102c1366004610e18565b6105bc565b6101517f000000000000000000000000000000000000000000000000000000000000000081565b6101fb6102fb366004610ea0565b6105ca565b61015161030e366004610f13565b6107f3565b610114604051806040016040528060018152602001603160f81b81525081565b60606003805461034290610f46565b80601f016020809104026020016040519081016040528092919081815260200182805461036e90610f46565b80156103bb5780601f10610390576101008083540402835291602001916103bb565b820191906000526020600020905b81548152906001019060200180831161039e57829003601f168201915b5050505050905090565b6000336103d381858561081e565b60019150505b92915050565b6000336103ed858285610943565b6103f88585856109bd565b506001949350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461461043a5761043546610b4f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000336103d381858561047283836107f3565b61047c9190610f96565b61081e565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104d25760405162461bcd60e51b81526004016104c990610fa9565b60405180910390fd5b6104dc8282610be9565b5050565b60606004805461034290610f46565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105375760405162461bcd60e51b81526004016104c990610fa9565b6104dc8282610c96565b6000338161054f82866107f3565b9050838110156105af5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104c9565b6103f8828686840361081e565b6000336103d38185856109bd565b834211156106265760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104c9565b6001600160a01b03871660009081526005602052604081208054600080516020611033833981519152918a918a918a91908661066183610ff9565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006106bf610403565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa15801561074a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906107805750896001600160a01b0316816001600160a01b0316145b6107dc5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104c9565b6107e78a8a8a61081e565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166108805760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104c9565b6001600160a01b0382166108e15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104c9565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600061094f84846107f3565b905060001981146109b757818110156109aa5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104c9565b6109b7848484840361081e565b50505050565b6001600160a01b038316610a215760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104c9565b6001600160a01b038216610a835760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104c9565b6001600160a01b03831660009081526020819052604090205481811015610afb5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104c9565b6001600160a01b0384811660008181526020818152604080832087870390559387168083529184902080548701905592518581529092600080516020611013833981519152910160405180910390a36109b7565b6000600080516020611053833981519152610b68610333565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c3f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104c9565b8060026000828254610c519190610f96565b90915550506001600160a01b03821660008181526020818152604080832080548601905551848152600080516020611013833981519152910160405180910390a35050565b6001600160a01b038216610cf65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104c9565b6001600160a01b03821660009081526020819052604090205481811015610d6a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104c9565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192916000805160206110138339815191529101610936565b600060208083528351808285015260005b81811015610ddb57858101830151858201604001528201610dbf565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610e1357600080fd5b919050565b60008060408385031215610e2b57600080fd5b610e3483610dfc565b946020939093013593505050565b600080600060608486031215610e5757600080fd5b610e6084610dfc565b9250610e6e60208501610dfc565b9150604084013590509250925092565b600060208284031215610e9057600080fd5b610e9982610dfc565b9392505050565b600080600080600080600060e0888a031215610ebb57600080fd5b610ec488610dfc565b9650610ed260208901610dfc565b95506040880135945060608801359350608088013560ff81168114610ef657600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f2657600080fd5b610f2f83610dfc565b9150610f3d60208401610dfc565b90509250929050565b600181811c90821680610f5a57607f821691505b602082108103610f7a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156103d9576103d9610f80565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b60006001820161100b5761100b610f80565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa26469706673582212203ea4a1224be7b5ef35dc397dfc81433d85cd6fdbf17d8b2e3d528071e7e612b564736f6c63430008140033501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe27545983a26469706673582212209433428555ad2611b778c6d4bd276ba680e0aee0111f4647137d5f0a5836619e64736f6c63430008140033", + "bytecode": "0x608060405234801561001057600080fd5b506160a1806100206000396000f3fe608060405260043610620001e75760003560e01c8063715018a6116200010b578063bab161bf11620000a1578063dbc16976116200006c578063dbc169761462000728578063ee25560b1462000740578063f2fde38b1462000771578063fb570834146200079657600080fd5b8063bab161bf1462000663578063be5831c7146200069d578063cd58657914620006d9578063d02103ca14620006f057600080fd5b80638da5cb5b11620000e25780638da5cb5b14620005b457806391e57e2d14620005e15780639e34070f14620005f9578063aaa13cc2146200063e57600080fd5b8063715018a6146200053d57806379e2cf97146200055557806381b1c174146200056d57600080fd5b80632d2c9d94116200018157806334ac9cf2116200015857806334ac9cf214620003dd5780633ae05047146200040c5780633e1970431462000424578063647c576c146200051857600080fd5b80632d2c9d9414620003085780632dfdf0b5146200032d578063318aee3d146200035457600080fd5b8063240ff37811620001c2578063240ff37814620002825780632b5e42e714620002995780632c3f58cd14620002be5780632cffd02e14620002e357600080fd5b806315064c9614620001ec5780632072f6c5146200021d57806322e95f2c1462000237575b600080fd5b348015620001f957600080fd5b50606854620002089060ff1681565b60405190151581526020015b60405180910390f35b3480156200022a57600080fd5b5062000235620007bb565b005b3480156200024457600080fd5b506200025c62000256366004620036db565b62000819565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200162000214565b620002356200029336600462003772565b620008bc565b348015620002a657600080fd5b5062000235620002b8366004620037f6565b62000ae4565b348015620002cb57600080fd5b5062000235620002dd36600462003810565b62000af3565b348015620002f057600080fd5b50620002356200030236600462003848565b62000b39565b3480156200031557600080fd5b50620002356200032736600462003848565b620010dd565b3480156200033a57600080fd5b506200034560535481565b60405190815260200162000214565b3480156200036157600080fd5b50620003ab620003733660046200392e565b606b6020526000908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff90911660208301520162000214565b348015620003ea57600080fd5b50606c546200025c9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156200041957600080fd5b5062000345620012e1565b3480156200043157600080fd5b5062000345620004433660046200395e565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200052557600080fd5b506200023562000537366004620039e8565b620013c7565b3480156200054a57600080fd5b506200023562001622565b3480156200056257600080fd5b506200023562001638565b3480156200057a57600080fd5b506200025c6200058c366004620037f6565b606a6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005c157600080fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff166200025c565b348015620005ee57600080fd5b506200034560d15481565b3480156200060657600080fd5b506200020862000618366004620037f6565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b3480156200064b57600080fd5b506200025c6200065d36600462003a38565b62001672565b3480156200067057600080fd5b506068546200068790610100900463ffffffff1681565b60405163ffffffff909116815260200162000214565b348015620006aa57600080fd5b506068546200068790790100000000000000000000000000000000000000000000000000900463ffffffff1681565b62000235620006ea36600462003aec565b6200185e565b348015620006fd57600080fd5b506068546200025c9065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200073557600080fd5b506200023562001932565b3480156200074d57600080fd5b50620003456200075f366004620037f6565b60696020526000908152604090205481565b3480156200077e57600080fd5b5062000235620007903660046200392e565b6200198e565b348015620007a357600080fd5b5062000208620007b536600462003b8e565b62001a4b565b606c5473ffffffffffffffffffffffffffffffffffffffff1633146200080d576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200081762001b34565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091206000908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620008fa576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620009205750600263ffffffff861610155b1562000958576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009ae9998979695949392919062003c24565b60405180910390a162000acc62000ac66001606860019054906101000a900463ffffffff16338989348989604051620009e992919062003c9f565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b62001bc8565b821562000add5762000add62001cdf565b5050505050565b62000aee62001db4565b60d155565b62000afd62001db4565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b77576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b8e8b8b8b8b8b8b8b8b8b8b8b600062001e37565b73ffffffffffffffffffffffffffffffffffffffff861662000c6a576040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000be3919062003d04565b60006040518083038185875af1925050503d806000811462000c22576040519150601f19603f3d011682016040523d82523d6000602084013e62000c27565b606091505b505090508062000c63576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062001065565b60685463ffffffff61010090910481169088160362000cac5762000ca673ffffffffffffffffffffffffffffffffffffffff8716858562002028565b62001065565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b166024820152600090603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000fd7576000808062000d818688018862003e19565b92509250925060008584848460405162000d9b9062003695565b62000da99392919062003edb565b8190604051809103906000f590508015801562000dca573d6000803e3d6000fd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f1990604401600060405180830381600087803b15801562000e4057600080fd5b505af115801562000e55573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000fc595949392919062003f18565b60405180910390a15050505062001062565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f1990604401600060405180830381600087803b1580156200104857600080fd5b505af11580156200105d573d6000803e3d6000fd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff16156200111b576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620011328b8b8b8b8b8b8b8b8b8b8b600162001e37565b60008473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162001165949392919062003f60565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f20000000000000000000000000000000000000000000000000000000017905251620011e8919062003d04565b60006040518083038185875af1925050503d806000811462001227576040519150601f19603f3d011682016040523d82523d6000602084013e6200122c565b606091505b505090508062001268576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b605354600090819081805b6020811015620013be578083901c6001166001036200134f57603381602081106200131b576200131b62003fa8565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200137c565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013b59062004006565b915050620012ec565b50919392505050565b600054610100900460ff1615808015620013e85750600054600160ff909116105b80620014045750303b15801562001404575060005460ff166001145b62001496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014f557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d155620015b8620020fe565b80156200161c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6200162c62001db4565b6200081760006200219d565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000817576200081762001cdf565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201526000908190603801604051602081830303815290604052805190602001209050600060ff60f81b308360405180602001620017089062003695565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905262001753908d908d908d908d908d9060200162004041565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001791929160200162004082565b604051602081830303815290604052805190602001206040516020016200181a94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d15434111562001918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200148d565b620019298787878787878762002214565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001984576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620008176200276f565b6200199862001db4565b73ffffffffffffffffffffffffffffffffffffffff811662001a3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200148d565b62001a48816200219d565b50565b600084815b602081101562001b2657600163ffffffff8616821c8116900362001ac25785816020811062001a835762001a8362003fa8565b60200201358260405160200162001aa4929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001b11565b8186826020811062001ad85762001ad862003fa8565b602002013560405160200162001af8929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001b1d8162004006565b91505062001a50565b50821490505b949350505050565b60685460ff161562001b72576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b80600162001bd960206002620041ee565b62001be59190620041fc565b6053541062001c20576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060536000815462001c339062004006565b9182905550905060005b602081101562001ccf578082901c60011660010362001c7557826033826020811062001c6d5762001c6d62003fa8565b015550505050565b6033816020811062001c8b5762001c8b62003fa8565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001cc69062004006565b91505062001c3d565b5062001cda62004212565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001d65620012e1565b6040518263ffffffff1660e01b815260040162001d8491815260200190565b600060405180830381600087803b15801562001d9f57600080fd5b505af11580156200161c573d6000803e3d6000fd5b609f5473ffffffffffffffffffffffffffffffffffffffff16331462000817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200148d565b62001e488b63ffffffff16620027ff565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b363200000000000000000000000000000000000000000000000000000000909252606481019190915260009165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303816000875af115801562001eeb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001f11919062004241565b90508060000362001f4d576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462001f97576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606854600090610100900463ffffffff1662001fb557508962001fb8565b508a5b62001fe162001fd8848c8c8c8c8c8c8c604051620009e992919062003c9f565b8f8f8462001a4b565b62002018576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001cda9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002864565b600054610100900460ff1662002197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200148d565b62000817335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60685460ff161562002252576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200225c62002977565b60685463ffffffff888116610100909204161480620022825750600263ffffffff881610155b15620022ba576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060608773ffffffffffffffffffffffffffffffffffffffff8816620023205788341462002316576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600092506200261a565b341562002359576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089166000908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901562002449576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac90604401600060405180830381600087803b1580156200241c57600080fd5b505af115801562002431573d6000803e3d6000fd5b50505050806020015194508060000151935062002618565b85156200245e576200245e898b8989620029ec565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa158015620024cc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620024f2919062004241565b90506200251873ffffffffffffffffffffffffffffffffffffffff8b1633308e62002f0a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa15801562002586573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620025ac919062004241565b9050620025ba8282620041fc565b6068548c9850610100900463ffffffff1696509350620025da8762002f6a565b620025e58c62003082565b620025f08d6200318f565b604051602001620026049392919062003edb565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e86886053546040516200265c9897969594939291906200425b565b60405180910390a16200275062000ac6600085878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b861562002761576200276162001cdf565b505050506200192960018055565b60685460ff16620027ac576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600881901c60008181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000add576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000620028c8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200328b9092919063ffffffff16565b80519091501562001cda5780806020019051810190620028e99190620042d4565b62001cda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200148d565b600260015403620029e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200148d565b6002600155565b6000620029fd6004828486620042f4565b62002a089162004320565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002c8757600080808080808062002a6b896004818d620042f4565b81019062002a7a919062004369565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002aee576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002b3e576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002b78576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002c33919062003d04565b6000604051808303816000865af19150503d806000811462002c72576040519150601f19603f3d011682016040523d82523d6000602084013e62002c77565b606091505b5050505050505050505062000add565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002d03576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008080808080808062002d1b8a6004818e620042f4565b81019062002d2a9190620043c4565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002da0576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002df0576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002eb4919062003d04565b6000604051808303816000865af19150503d806000811462002ef3576040519150601f19603f3d011682016040523d82523d6000602084013e62002ef8565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526200161c9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016200207b565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162002fee919062003d04565b600060405180830381855afa9150503d80600081146200302b576040519150601f19603f3d011682016040523d82523d6000602084013e62003030565b606091505b50915091508162003077576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001b2c565b62001b2c816200329c565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162003106919062003d04565b600060405180830381855afa9150503d806000811462003143576040519150601f19603f3d011682016040523d82523d6000602084013e62003148565b606091505b50915091508162003077576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001b2c565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169162003212919062003d04565b600060405180830381855afa9150503d80600081146200324f576040519150601f19603f3d011682016040523d82523d6000602084013e62003254565b606091505b509150915081801562003268575080516020145b6200327557601262001b2c565b8080602001905181019062001b2c919062004450565b606062001b2c84846000856200348c565b60606040825110620032be5781806020019051810190620008b6919062004470565b81516020036200344e5760005b602081108015620033165750828181518110620032ec57620032ec62003fa8565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620033315780620033288162004006565b915050620032cb565b806000036200337557505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111562003393576200339362003caf565b6040519080825280601f01601f191660200182016040528015620033be576020820181803683370190505b50905060005b828110156200344657848181518110620033e257620033e262003fa8565b602001015160f81c60f81b82828151811062003402576200340262003fa8565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806200343d8162004006565b915050620033c4565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200148d565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516200354b919062003d04565b60006040518083038185875af1925050503d80600081146200358a576040519150601f19603f3d011682016040523d82523d6000602084013e6200358f565b606091505b5091509150620035a287838387620035ad565b979650505050505050565b6060831562003648578251600003620036405773ffffffffffffffffffffffffffffffffffffffff85163b62003640576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200148d565b508162001b2c565b62001b2c83838151156200365f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200148d9190620044f0565b611b66806200450683390190565b803563ffffffff811681146200348757600080fd5b73ffffffffffffffffffffffffffffffffffffffff8116811462001a4857600080fd5b60008060408385031215620036ef57600080fd5b620036fa83620036a3565b915060208301356200370c81620036b8565b809150509250929050565b801515811462001a4857600080fd5b60008083601f8401126200373957600080fd5b50813567ffffffffffffffff8111156200375257600080fd5b6020830191508360208285010111156200376b57600080fd5b9250929050565b6000806000806000608086880312156200378b57600080fd5b6200379686620036a3565b94506020860135620037a881620036b8565b93506040860135620037ba8162003717565b9250606086013567ffffffffffffffff811115620037d757600080fd5b620037e58882890162003726565b969995985093965092949392505050565b6000602082840312156200380957600080fd5b5035919050565b6000602082840312156200382357600080fd5b6200382e82620036a3565b9392505050565b806104008101831015620008b657600080fd5b60008060008060008060008060008060006105208c8e0312156200386b57600080fd5b620038778d8d62003835565b9a50620038886104008d01620036a3565b99506104208c013598506104408c01359750620038a96104608d01620036a3565b96506104808c0135620038bc81620036b8565b9550620038cd6104a08d01620036a3565b94506104c08c0135620038e081620036b8565b93506104e08c013592506105008c013567ffffffffffffffff8111156200390657600080fd5b620039148e828f0162003726565b915080935050809150509295989b509295989b9093969950565b6000602082840312156200394157600080fd5b81356200382e81620036b8565b60ff8116811462001a4857600080fd5b600080600080600080600060e0888a0312156200397a57600080fd5b873562003987816200394e565b96506200399760208901620036a3565b95506040880135620039a981620036b8565b9450620039b960608901620036a3565b93506080880135620039cb81620036b8565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215620039fe57600080fd5b62003a0984620036a3565b9250602084013562003a1b81620036b8565b9150604084013562003a2d81620036b8565b809150509250925092565b600080600080600080600060a0888a03121562003a5457600080fd5b62003a5f88620036a3565b9650602088013562003a7181620036b8565b9550604088013567ffffffffffffffff8082111562003a8f57600080fd5b62003a9d8b838c0162003726565b909750955060608a013591508082111562003ab757600080fd5b5062003ac68a828b0162003726565b909450925050608088013562003adc816200394e565b8091505092959891949750929550565b600080600080600080600060c0888a03121562003b0857600080fd5b62003b1388620036a3565b9650602088013562003b2581620036b8565b955060408801359450606088013562003b3e81620036b8565b9350608088013562003b508162003717565b925060a088013567ffffffffffffffff81111562003b6d57600080fd5b62003b7b8a828b0162003726565b989b979a50959850939692959293505050565b600080600080610460858703121562003ba657600080fd5b8435935062003bb9866020870162003835565b925062003bca6104208601620036a3565b939692955092936104400135925050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600061010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003c85828501878962003bdb565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b8381101562003cfb57818101518382015260200162003ce1565b50506000910152565b6000825162003d1881846020870162003cde565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003d6c5762003d6c62003caf565b604052919050565b600067ffffffffffffffff82111562003d915762003d9162003caf565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011262003dcf57600080fd5b813562003de662003de08262003d74565b62003d22565b81815284602083860101111562003dfc57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562003e2f57600080fd5b833567ffffffffffffffff8082111562003e4857600080fd5b62003e568783880162003dbd565b9450602086013591508082111562003e6d57600080fd5b5062003e7c8682870162003dbd565b925050604084013562003a2d816200394e565b6000815180845262003ea981602086016020860162003cde565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60608152600062003ef0606083018662003e8f565b828103602084015262003f04818662003e8f565b91505060ff83166040830152949350505050565b63ffffffff86168152600073ffffffffffffffffffffffffffffffffffffffff808716602084015280861660408401525060806060830152620035a260808301848662003bdb565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff8416602082015260606040820152600062003f9e60608301848662003bdb565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036200403a576200403a62003fd7565b5060010190565b6060815260006200405760608301878962003bdb565b82810360208401526200406c81868862003bdb565b91505060ff831660408301529695505050505050565b600083516200409681846020880162003cde565b835190830190620040ac81836020880162003cde565b01949350505050565b600181815b808511156200411457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620040f857620040f862003fd7565b808516156200410657918102915b93841c9390800290620040ba565b509250929050565b6000826200412d57506001620008b6565b816200413c57506000620008b6565b8160018114620041555760028114620041605762004180565b6001915050620008b6565b60ff84111562004174576200417462003fd7565b50506001821b620008b6565b5060208310610133831016604e8410600b8410161715620041a5575081810a620008b6565b620041b18383620040b5565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620041e657620041e662003fd7565b029392505050565b60006200382e83836200411c565b81810381811115620008b657620008b662003fd7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000602082840312156200425457600080fd5b5051919050565b600061010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620042bb8285018762003e8f565b925080851660e085015250509998505050505050505050565b600060208284031215620042e757600080fd5b81516200382e8162003717565b600080858511156200430557600080fd5b838611156200431357600080fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620043615780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a0312156200438557600080fd5b87356200439281620036b8565b96506020880135620043a481620036b8565b955060408801359450606088013593506080880135620039cb816200394e565b600080600080600080600080610100898b031215620043e257600080fd5b8835620043ef81620036b8565b975060208901356200440181620036b8565b965060408901359550606089013594506080890135620044218162003717565b935060a089013562004433816200394e565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200446357600080fd5b81516200382e816200394e565b6000602082840312156200448357600080fd5b815167ffffffffffffffff8111156200449b57600080fd5b8201601f81018413620044ad57600080fd5b8051620044be62003de08262003d74565b818152856020838501011115620044d457600080fd5b620044e782602083016020860162003cde565b95945050505050565b6020815260006200382e602083018462003e8f56fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212206fe049be388a1d04319b9913fe6d100c4c8e272fe0f5748eb056bd0622beabcc64736f6c63430008140033a2646970667358221220b14509f55d59293305a5dbe90fdf3a7b7ae9417e96c0bbfe4ba0150ddd7bb7a064736f6c63430008140033", + "deployedBytecode": "0x608060405260043610620001e75760003560e01c8063715018a6116200010b578063bab161bf11620000a1578063dbc16976116200006c578063dbc169761462000728578063ee25560b1462000740578063f2fde38b1462000771578063fb570834146200079657600080fd5b8063bab161bf1462000663578063be5831c7146200069d578063cd58657914620006d9578063d02103ca14620006f057600080fd5b80638da5cb5b11620000e25780638da5cb5b14620005b457806391e57e2d14620005e15780639e34070f14620005f9578063aaa13cc2146200063e57600080fd5b8063715018a6146200053d57806379e2cf97146200055557806381b1c174146200056d57600080fd5b80632d2c9d94116200018157806334ac9cf2116200015857806334ac9cf214620003dd5780633ae05047146200040c5780633e1970431462000424578063647c576c146200051857600080fd5b80632d2c9d9414620003085780632dfdf0b5146200032d578063318aee3d146200035457600080fd5b8063240ff37811620001c2578063240ff37814620002825780632b5e42e714620002995780632c3f58cd14620002be5780632cffd02e14620002e357600080fd5b806315064c9614620001ec5780632072f6c5146200021d57806322e95f2c1462000237575b600080fd5b348015620001f957600080fd5b50606854620002089060ff1681565b60405190151581526020015b60405180910390f35b3480156200022a57600080fd5b5062000235620007bb565b005b3480156200024457600080fd5b506200025c62000256366004620036db565b62000819565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200162000214565b620002356200029336600462003772565b620008bc565b348015620002a657600080fd5b5062000235620002b8366004620037f6565b62000ae4565b348015620002cb57600080fd5b5062000235620002dd36600462003810565b62000af3565b348015620002f057600080fd5b50620002356200030236600462003848565b62000b39565b3480156200031557600080fd5b50620002356200032736600462003848565b620010dd565b3480156200033a57600080fd5b506200034560535481565b60405190815260200162000214565b3480156200036157600080fd5b50620003ab620003733660046200392e565b606b6020526000908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff90911660208301520162000214565b348015620003ea57600080fd5b50606c546200025c9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156200041957600080fd5b5062000345620012e1565b3480156200043157600080fd5b5062000345620004433660046200395e565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200052557600080fd5b506200023562000537366004620039e8565b620013c7565b3480156200054a57600080fd5b506200023562001622565b3480156200056257600080fd5b506200023562001638565b3480156200057a57600080fd5b506200025c6200058c366004620037f6565b606a6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005c157600080fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff166200025c565b348015620005ee57600080fd5b506200034560d15481565b3480156200060657600080fd5b506200020862000618366004620037f6565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b3480156200064b57600080fd5b506200025c6200065d36600462003a38565b62001672565b3480156200067057600080fd5b506068546200068790610100900463ffffffff1681565b60405163ffffffff909116815260200162000214565b348015620006aa57600080fd5b506068546200068790790100000000000000000000000000000000000000000000000000900463ffffffff1681565b62000235620006ea36600462003aec565b6200185e565b348015620006fd57600080fd5b506068546200025c9065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200073557600080fd5b506200023562001932565b3480156200074d57600080fd5b50620003456200075f366004620037f6565b60696020526000908152604090205481565b3480156200077e57600080fd5b5062000235620007903660046200392e565b6200198e565b348015620007a357600080fd5b5062000208620007b536600462003b8e565b62001a4b565b606c5473ffffffffffffffffffffffffffffffffffffffff1633146200080d576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200081762001b34565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091206000908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620008fa576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620009205750600263ffffffff861610155b1562000958576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009ae9998979695949392919062003c24565b60405180910390a162000acc62000ac66001606860019054906101000a900463ffffffff16338989348989604051620009e992919062003c9f565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b62001bc8565b821562000add5762000add62001cdf565b5050505050565b62000aee62001db4565b60d155565b62000afd62001db4565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b77576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b8e8b8b8b8b8b8b8b8b8b8b8b600062001e37565b73ffffffffffffffffffffffffffffffffffffffff861662000c6a576040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000be3919062003d04565b60006040518083038185875af1925050503d806000811462000c22576040519150601f19603f3d011682016040523d82523d6000602084013e62000c27565b606091505b505090508062000c63576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062001065565b60685463ffffffff61010090910481169088160362000cac5762000ca673ffffffffffffffffffffffffffffffffffffffff8716858562002028565b62001065565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b166024820152600090603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000fd7576000808062000d818688018862003e19565b92509250925060008584848460405162000d9b9062003695565b62000da99392919062003edb565b8190604051809103906000f590508015801562000dca573d6000803e3d6000fd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f1990604401600060405180830381600087803b15801562000e4057600080fd5b505af115801562000e55573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000fc595949392919062003f18565b60405180910390a15050505062001062565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f1990604401600060405180830381600087803b1580156200104857600080fd5b505af11580156200105d573d6000803e3d6000fd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff16156200111b576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620011328b8b8b8b8b8b8b8b8b8b8b600162001e37565b60008473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162001165949392919062003f60565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f20000000000000000000000000000000000000000000000000000000017905251620011e8919062003d04565b60006040518083038185875af1925050503d806000811462001227576040519150601f19603f3d011682016040523d82523d6000602084013e6200122c565b606091505b505090508062001268576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b605354600090819081805b6020811015620013be578083901c6001166001036200134f57603381602081106200131b576200131b62003fa8565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200137c565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013b59062004006565b915050620012ec565b50919392505050565b600054610100900460ff1615808015620013e85750600054600160ff909116105b80620014045750303b15801562001404575060005460ff166001145b62001496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014f557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d155620015b8620020fe565b80156200161c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6200162c62001db4565b6200081760006200219d565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000817576200081762001cdf565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201526000908190603801604051602081830303815290604052805190602001209050600060ff60f81b308360405180602001620017089062003695565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905262001753908d908d908d908d908d9060200162004041565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001791929160200162004082565b604051602081830303815290604052805190602001206040516020016200181a94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d15434111562001918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200148d565b620019298787878787878762002214565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001984576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620008176200276f565b6200199862001db4565b73ffffffffffffffffffffffffffffffffffffffff811662001a3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200148d565b62001a48816200219d565b50565b600084815b602081101562001b2657600163ffffffff8616821c8116900362001ac25785816020811062001a835762001a8362003fa8565b60200201358260405160200162001aa4929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001b11565b8186826020811062001ad85762001ad862003fa8565b602002013560405160200162001af8929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001b1d8162004006565b91505062001a50565b50821490505b949350505050565b60685460ff161562001b72576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b80600162001bd960206002620041ee565b62001be59190620041fc565b6053541062001c20576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060536000815462001c339062004006565b9182905550905060005b602081101562001ccf578082901c60011660010362001c7557826033826020811062001c6d5762001c6d62003fa8565b015550505050565b6033816020811062001c8b5762001c8b62003fa8565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001cc69062004006565b91505062001c3d565b5062001cda62004212565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001d65620012e1565b6040518263ffffffff1660e01b815260040162001d8491815260200190565b600060405180830381600087803b15801562001d9f57600080fd5b505af11580156200161c573d6000803e3d6000fd5b609f5473ffffffffffffffffffffffffffffffffffffffff16331462000817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200148d565b62001e488b63ffffffff16620027ff565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b363200000000000000000000000000000000000000000000000000000000909252606481019190915260009165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303816000875af115801562001eeb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001f11919062004241565b90508060000362001f4d576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462001f97576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606854600090610100900463ffffffff1662001fb557508962001fb8565b508a5b62001fe162001fd8848c8c8c8c8c8c8c604051620009e992919062003c9f565b8f8f8462001a4b565b62002018576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001cda9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002864565b600054610100900460ff1662002197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200148d565b62000817335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60685460ff161562002252576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200225c62002977565b60685463ffffffff888116610100909204161480620022825750600263ffffffff881610155b15620022ba576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060608773ffffffffffffffffffffffffffffffffffffffff8816620023205788341462002316576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600092506200261a565b341562002359576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089166000908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901562002449576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac90604401600060405180830381600087803b1580156200241c57600080fd5b505af115801562002431573d6000803e3d6000fd5b50505050806020015194508060000151935062002618565b85156200245e576200245e898b8989620029ec565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa158015620024cc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620024f2919062004241565b90506200251873ffffffffffffffffffffffffffffffffffffffff8b1633308e62002f0a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa15801562002586573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620025ac919062004241565b9050620025ba8282620041fc565b6068548c9850610100900463ffffffff1696509350620025da8762002f6a565b620025e58c62003082565b620025f08d6200318f565b604051602001620026049392919062003edb565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e86886053546040516200265c9897969594939291906200425b565b60405180910390a16200275062000ac6600085878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b861562002761576200276162001cdf565b505050506200192960018055565b60685460ff16620027ac576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600881901c60008181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000add576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000620028c8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200328b9092919063ffffffff16565b80519091501562001cda5780806020019051810190620028e99190620042d4565b62001cda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200148d565b600260015403620029e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200148d565b6002600155565b6000620029fd6004828486620042f4565b62002a089162004320565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002c8757600080808080808062002a6b896004818d620042f4565b81019062002a7a919062004369565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002aee576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002b3e576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002b78576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002c33919062003d04565b6000604051808303816000865af19150503d806000811462002c72576040519150601f19603f3d011682016040523d82523d6000602084013e62002c77565b606091505b5050505050505050505062000add565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002d03576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008080808080808062002d1b8a6004818e620042f4565b81019062002d2a9190620043c4565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002da0576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002df0576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002eb4919062003d04565b6000604051808303816000865af19150503d806000811462002ef3576040519150601f19603f3d011682016040523d82523d6000602084013e62002ef8565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526200161c9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016200207b565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162002fee919062003d04565b600060405180830381855afa9150503d80600081146200302b576040519150601f19603f3d011682016040523d82523d6000602084013e62003030565b606091505b50915091508162003077576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001b2c565b62001b2c816200329c565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162003106919062003d04565b600060405180830381855afa9150503d806000811462003143576040519150601f19603f3d011682016040523d82523d6000602084013e62003148565b606091505b50915091508162003077576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001b2c565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169162003212919062003d04565b600060405180830381855afa9150503d80600081146200324f576040519150601f19603f3d011682016040523d82523d6000602084013e62003254565b606091505b509150915081801562003268575080516020145b6200327557601262001b2c565b8080602001905181019062001b2c919062004450565b606062001b2c84846000856200348c565b60606040825110620032be5781806020019051810190620008b6919062004470565b81516020036200344e5760005b602081108015620033165750828181518110620032ec57620032ec62003fa8565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620033315780620033288162004006565b915050620032cb565b806000036200337557505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111562003393576200339362003caf565b6040519080825280601f01601f191660200182016040528015620033be576020820181803683370190505b50905060005b828110156200344657848181518110620033e257620033e262003fa8565b602001015160f81c60f81b82828151811062003402576200340262003fa8565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806200343d8162004006565b915050620033c4565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200148d565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516200354b919062003d04565b60006040518083038185875af1925050503d80600081146200358a576040519150601f19603f3d011682016040523d82523d6000602084013e6200358f565b606091505b5091509150620035a287838387620035ad565b979650505050505050565b6060831562003648578251600003620036405773ffffffffffffffffffffffffffffffffffffffff85163b62003640576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200148d565b508162001b2c565b62001b2c83838151156200365f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200148d9190620044f0565b611b66806200450683390190565b803563ffffffff811681146200348757600080fd5b73ffffffffffffffffffffffffffffffffffffffff8116811462001a4857600080fd5b60008060408385031215620036ef57600080fd5b620036fa83620036a3565b915060208301356200370c81620036b8565b809150509250929050565b801515811462001a4857600080fd5b60008083601f8401126200373957600080fd5b50813567ffffffffffffffff8111156200375257600080fd5b6020830191508360208285010111156200376b57600080fd5b9250929050565b6000806000806000608086880312156200378b57600080fd5b6200379686620036a3565b94506020860135620037a881620036b8565b93506040860135620037ba8162003717565b9250606086013567ffffffffffffffff811115620037d757600080fd5b620037e58882890162003726565b969995985093965092949392505050565b6000602082840312156200380957600080fd5b5035919050565b6000602082840312156200382357600080fd5b6200382e82620036a3565b9392505050565b806104008101831015620008b657600080fd5b60008060008060008060008060008060006105208c8e0312156200386b57600080fd5b620038778d8d62003835565b9a50620038886104008d01620036a3565b99506104208c013598506104408c01359750620038a96104608d01620036a3565b96506104808c0135620038bc81620036b8565b9550620038cd6104a08d01620036a3565b94506104c08c0135620038e081620036b8565b93506104e08c013592506105008c013567ffffffffffffffff8111156200390657600080fd5b620039148e828f0162003726565b915080935050809150509295989b509295989b9093969950565b6000602082840312156200394157600080fd5b81356200382e81620036b8565b60ff8116811462001a4857600080fd5b600080600080600080600060e0888a0312156200397a57600080fd5b873562003987816200394e565b96506200399760208901620036a3565b95506040880135620039a981620036b8565b9450620039b960608901620036a3565b93506080880135620039cb81620036b8565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215620039fe57600080fd5b62003a0984620036a3565b9250602084013562003a1b81620036b8565b9150604084013562003a2d81620036b8565b809150509250925092565b600080600080600080600060a0888a03121562003a5457600080fd5b62003a5f88620036a3565b9650602088013562003a7181620036b8565b9550604088013567ffffffffffffffff8082111562003a8f57600080fd5b62003a9d8b838c0162003726565b909750955060608a013591508082111562003ab757600080fd5b5062003ac68a828b0162003726565b909450925050608088013562003adc816200394e565b8091505092959891949750929550565b600080600080600080600060c0888a03121562003b0857600080fd5b62003b1388620036a3565b9650602088013562003b2581620036b8565b955060408801359450606088013562003b3e81620036b8565b9350608088013562003b508162003717565b925060a088013567ffffffffffffffff81111562003b6d57600080fd5b62003b7b8a828b0162003726565b989b979a50959850939692959293505050565b600080600080610460858703121562003ba657600080fd5b8435935062003bb9866020870162003835565b925062003bca6104208601620036a3565b939692955092936104400135925050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600061010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003c85828501878962003bdb565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b8381101562003cfb57818101518382015260200162003ce1565b50506000910152565b6000825162003d1881846020870162003cde565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003d6c5762003d6c62003caf565b604052919050565b600067ffffffffffffffff82111562003d915762003d9162003caf565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011262003dcf57600080fd5b813562003de662003de08262003d74565b62003d22565b81815284602083860101111562003dfc57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562003e2f57600080fd5b833567ffffffffffffffff8082111562003e4857600080fd5b62003e568783880162003dbd565b9450602086013591508082111562003e6d57600080fd5b5062003e7c8682870162003dbd565b925050604084013562003a2d816200394e565b6000815180845262003ea981602086016020860162003cde565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60608152600062003ef0606083018662003e8f565b828103602084015262003f04818662003e8f565b91505060ff83166040830152949350505050565b63ffffffff86168152600073ffffffffffffffffffffffffffffffffffffffff808716602084015280861660408401525060806060830152620035a260808301848662003bdb565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff8416602082015260606040820152600062003f9e60608301848662003bdb565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036200403a576200403a62003fd7565b5060010190565b6060815260006200405760608301878962003bdb565b82810360208401526200406c81868862003bdb565b91505060ff831660408301529695505050505050565b600083516200409681846020880162003cde565b835190830190620040ac81836020880162003cde565b01949350505050565b600181815b808511156200411457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620040f857620040f862003fd7565b808516156200410657918102915b93841c9390800290620040ba565b509250929050565b6000826200412d57506001620008b6565b816200413c57506000620008b6565b8160018114620041555760028114620041605762004180565b6001915050620008b6565b60ff84111562004174576200417462003fd7565b50506001821b620008b6565b5060208310610133831016604e8410600b8410161715620041a5575081810a620008b6565b620041b18383620040b5565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620041e657620041e662003fd7565b029392505050565b60006200382e83836200411c565b81810381811115620008b657620008b662003fd7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000602082840312156200425457600080fd5b5051919050565b600061010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620042bb8285018762003e8f565b925080851660e085015250509998505050505050505050565b600060208284031215620042e757600080fd5b81516200382e8162003717565b600080858511156200430557600080fd5b838611156200431357600080fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620043615780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a0312156200438557600080fd5b87356200439281620036b8565b96506020880135620043a481620036b8565b955060408801359450606088013593506080880135620039cb816200394e565b600080600080600080600080610100898b031215620043e257600080fd5b8835620043ef81620036b8565b975060208901356200440181620036b8565b965060408901359550606089013594506080890135620044218162003717565b935060a089013562004433816200394e565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200446357600080fd5b81516200382e816200394e565b6000602082840312156200448357600080fd5b815167ffffffffffffffff8111156200449b57600080fd5b8201601f81018413620044ad57600080fd5b8051620044be62003de08262003d74565b818152856020838501011115620044d457600080fd5b620044e782602083016020860162003cde565b95945050505050565b6020815260006200382e602083018462003e8f56fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212206fe049be388a1d04319b9913fe6d100c4c8e272fe0f5748eb056bd0622beabcc64736f6c63430008140033a2646970667358221220b14509f55d59293305a5dbe90fdf3a7b7ae9417e96c0bbfe4ba0150ddd7bb7a064736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMBridgeV2.json b/compiled-contracts/paris/PolygonZkEVMBridgeV2.json index 38d5e4b29..f9061ef0c 100644 --- a/compiled-contracts/paris/PolygonZkEVMBridgeV2.json +++ b/compiled-contracts/paris/PolygonZkEVMBridgeV2.json @@ -394,6 +394,35 @@ "stateMutability": "pure", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "originNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "originTokenAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "calculateTokenWrapperAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -572,6 +601,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "gasTokenMetadata", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "gasTokenNetwork", @@ -647,6 +689,25 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "getTokenMetadata", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -710,6 +771,11 @@ "internalType": "address", "name": "_polygonRollupManager", "type": "address" + }, + { + "internalType": "bytes", + "name": "_gasTokenMetadata", + "type": "bytes" } ], "name": "initialize", @@ -917,8 +983,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50614f62806100206000396000f3fe608060405260043610620001645760003560e01c806315064c9614620001695780632072f6c5146200019a57806322e95f2c14620001b4578063240ff37814620001e85780632dfdf0b514620001ff578063318aee3d14620002265780633c351e1014620002945780633cbc795b14620002b65780633e19704314620002f25780634b2f336d14620003175780635ca1e165146200033957806379e2cf97146200035157806381b1c174146200036957806383f2440314620003a35780638ed7e3f214620003c8578063aaa13cc214620003ea578063b8b284d0146200040f578063bab161bf1462000434578063be5831c71462000458578063cc461632146200047e578063ccaa2d1114620004a3578063cd58657914620004c8578063d02103ca14620004df578063d3476afe1462000508578063dbc16976146200052d578063ee25560b1462000545578063f5efcd791462000576578063fb570834146200059b575b600080fd5b3480156200017657600080fd5b50606854620001859060ff1681565b60405190151581526020015b60405180910390f35b348015620001a757600080fd5b50620001b2620005c0565b005b348015620001c157600080fd5b50620001d9620001d336600462002a7c565b620005f8565b60405162000191919062002ab8565b620001b2620001f936600462002b26565b6200064b565b3480156200020c57600080fd5b506200021760535481565b60405190815260200162000191565b3480156200023357600080fd5b506200026f6200024536600462002ba9565b606b6020526000908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b0390911660208301520162000191565b348015620002a157600080fd5b50606d54620001d9906001600160a01b031681565b348015620002c357600080fd5b50606d54620002dc90600160a01b900463ffffffff1681565b60405163ffffffff909116815260200162000191565b348015620002ff57600080fd5b50620002176200031136600462002be0565b6200069b565b3480156200032457600080fd5b50606e54620001d9906001600160a01b031681565b3480156200034657600080fd5b506200021762000728565b3480156200035e57600080fd5b50620001b262000810565b3480156200037657600080fd5b50620001d96200038836600462002c6a565b606a602052600090815260409020546001600160a01b031681565b348015620003b057600080fd5b5062000217620003c236600462002c97565b62000834565b348015620003d557600080fd5b50606c54620001d9906001600160a01b031681565b348015620003f757600080fd5b50620001d96200040936600462002cdb565b62000908565b3480156200041c57600080fd5b50620001b26200042e36600462002d8e565b62000a1f565b3480156200044157600080fd5b50606854620002dc90610100900463ffffffff1681565b3480156200046557600080fd5b50606854620002dc90600160c81b900463ffffffff1681565b3480156200048b57600080fd5b50620001856200049d36600462002e1a565b62000ac9565b348015620004b057600080fd5b50620001b2620004c236600462002e52565b62000b59565b620001b2620004d936600462002f4d565b62001087565b348015620004ec57600080fd5b50606854620001d990600160281b90046001600160a01b031681565b3480156200051557600080fd5b50620001b26200052736600462002fee565b620014ab565b3480156200053a57600080fd5b50620001b262001737565b3480156200055257600080fd5b50620002176200056436600462002c6a565b60696020526000908152604090205481565b3480156200058357600080fd5b50620001b26200059536600462002e52565b6200176d565b348015620005a857600080fd5b5062000185620005ba36600462003066565b62001a12565b606c546001600160a01b03163314620005ec57604051631736745960e31b815260040160405180910390fd5b620005f662001a2e565b565b6000606a6000848460405160200162000613929190620030b3565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b3415801590620006655750606e546001600160a01b031615155b1562000684576040516301bd897160e61b815260040160405180910390fd5b6200069485853486868662001a8b565b5050505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b605354600090819081805b602081101562000807578083901c600116600103620007965760338160208110620007625762000762620030dd565b01548460405160200162000778929190620030f3565b604051602081830303815290604052805190602001209350620007c4565b8382604051602001620007ab929190620030f3565b6040516020818303038152906040528051906020012093505b8182604051602001620007d9929190620030f3565b6040516020818303038152906040528051906020012091508080620007fe9062003117565b91505062000733565b50919392505050565b605354606854600160c81b900463ffffffff161015620005f657620005f662001b49565b600083815b6020811015620008ff57600163ffffffff8516821c81169003620008a3578481602081106200086c576200086c620030dd565b60200201358260405160200162000885929190620030f3565b604051602081830303815290604052805190602001209150620008ea565b81858260208110620008b957620008b9620030dd565b6020020135604051602001620008d1929190620030f3565b6040516020818303038152906040528051906020012091505b80620008f68162003117565b91505062000839565b50949350505050565b600080888860405160200162000920929190620030b3565b604051602081830303815290604052805190602001209050600060ff60f81b308360405180602001620009539062002a40565b601f1982820381018352601f90910116604081905262000980908d908d908d908d908d906020016200315c565b60408051601f1981840301815290829052620009a09291602001620031c3565b60405160208183030381529060405280519060200120604051602001620009f994939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b606e546001600160a01b031662000a495760405163dde3cda760e01b815260040160405180910390fd5b606e54604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac9062000a7d9033908890600401620031f6565b600060405180830381600087803b15801562000a9857600080fd5b505af115801562000aad573d6000803e3d6000fd5b5050505062000ac186868686868662001a8b565b505050505050565b6068546000908190610100900463ffffffff1615801562000af0575063ffffffff83166001145b1562000b04575063ffffffff831662000b2f565b62000b1a600160201b63ffffffff85166200320f565b62000b2c9063ffffffff861662003229565b90505b600881901c600090815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000b7e57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161462000baf576040516302caf51760e11b815260040160405180910390fd5b62000be98c8c8c8c8c62000be360008e8e8e8e8e8e8e60405162000bd59291906200323f565b60405180910390206200069b565b62001be7565b6001600160a01b03861662000d2f57606e546001600160a01b031662000cc15760006001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000c43576020820181803683370190505b5060405162000c53919062003265565b60006040518083038185875af1925050503d806000811462000c92576040519150601f19603f3d011682016040523d82523d6000602084013e62000c97565b606091505b505090508062000cba57604051630ce8f45160e31b815260040160405180910390fd5b5062001049565b606e546040516340c10f1960e01b81526001600160a01b03909116906340c10f199062000cf59087908790600401620031f6565b600060405180830381600087803b15801562000d1057600080fd5b505af115801562000d25573d6000803e3d6000fd5b5050505062001049565b606d546001600160a01b03878116911614801562000d5e5750606d5463ffffffff888116600160a01b90920416145b1562000d785760006001600160a01b038516848262000c18565b60685463ffffffff61010090910481169088160362000dad5762000da76001600160a01b038716858562001d45565b62001049565b6000878760405160200162000dc4929190620030b3565b60408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b03168062000fe1576000808062000e0d868801886200333c565b92509250925060008584848460405162000e279062002a40565b62000e3593929190620033ea565b8190604051809103906000f590508015801562000e56573d6000803e3d6000fd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f199062000e8a908d908d90600401620031f6565b600060405180830381600087803b15801562000ea557600080fd5b505af115801562000eba573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000fcf95949392919062003427565b60405180910390a15050505062001046565b6040516340c10f1960e01b81526001600160a01b038216906340c10f1990620010119089908990600401620031f6565b600060405180830381600087803b1580156200102c57600080fd5b505af115801562001041573d6000803e3d6000fd5b505050505b50505b60008051602062004f0d8339815191528a888887876040516200107195949392919062003462565b60405180910390a1505050505050505050505050565b60685460ff1615620010ac57604051630bc011ff60e21b815260040160405180910390fd5b620010b662001da4565b60685463ffffffff610100909104811690881603620010e8576040516302caf51760e11b815260040160405180910390fd5b6000806060876001600160a01b03881662001142578834146200111e5760405163b89240f560e01b815260040160405180910390fd5b606d546001600160a01b0381169450600160a01b900463ffffffff16925062001427565b3415620011625760405163798ee6f160e01b815260040160405180910390fd5b606e546001600160a01b0390811690891603620011e357604051632770a7eb60e21b81526001600160a01b03891690639dc29fac90620011a99033908d90600401620031f6565b600060405180830381600087803b158015620011c457600080fd5b505af1158015620011d9573d6000803e3d6000fd5b5050505062001427565b6001600160a01b038089166000908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b90049092169181018290529015620012a157604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac90620012599033908e90600401620031f6565b600060405180830381600087803b1580156200127457600080fd5b505af115801562001289573d6000803e3d6000fd5b50505050806020015194508060000151935062001425565b8515620012b657620012b6898b898962001dff565b6040516370a0823160e01b81526000906001600160a01b038b16906370a0823190620012e790309060040162002ab8565b602060405180830381865afa15801562001305573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200132b919062003494565b9050620013446001600160a01b038b1633308e62002161565b6040516370a0823160e01b81526000906001600160a01b038c16906370a08231906200137590309060040162002ab8565b602060405180830381865afa15801562001393573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620013b9919062003494565b9050620013c78282620034ae565b6068548c9850610100900463ffffffff1696509350620013e7876200219b565b620013f28c62002262565b620013fd8d62002320565b6040516020016200141193929190620033ea565b604051602081830303815290604052945050505b505b60008051602062004eed833981519152600084868e8e868860535460405162001458989796959493929190620034c4565b60405180910390a1620014836200147d600085878f8f8789805190602001206200069b565b620023e1565b861562001494576200149462001b49565b50505050620014a260018055565b50505050505050565b600054610100900460ff1615808015620014cc5750600054600160ff909116105b80620014f15750620014de30620024e0565b158015620014f1575060005460ff166001145b6200155a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156200157e576000805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff891602600160281b600160c81b03191617600160281b6001600160a01b038681169190910291909117909155606c80546001600160a01b031916848316179055606d54166200161357606d54600160a01b900463ffffffff16156200160d57604051630d43a60960e11b815260040160405180910390fd5b620016df565b606d805463ffffffff8616600160a01b026001600160c01b03199091166001600160a01b03881617179055604051600090601290620016529062002a40565b6060808252600d908201526c2bb930b83832b21022ba3432b960991b608082015260a060208201819052600490820152630ae8aa8960e31b60c082015260ff909116604082015260e0018190604051809103906000f5905080158015620016bd573d6000803e3d6000fd5b50606e80546001600160a01b0319166001600160a01b03929092169190911790555b620016e9620024ef565b801562000ac1576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b606c546001600160a01b031633146200176357604051631736745960e31b815260040160405180910390fd5b620005f662002523565b60685460ff16156200179257604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614620017c3576040516302caf51760e11b815260040160405180910390fd5b620017e98c8c8c8c8c62000be360018e8e8e8e8e8e8e60405162000bd59291906200323f565b606e546000906001600160a01b0316620018a857846001600160a01b031684888a868660405160240162001821949392919062003531565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162001858919062003265565b60006040518083038185875af1925050503d806000811462001897576040519150601f19603f3d011682016040523d82523d6000602084013e6200189c565b606091505b505080915050620019b4565b606e546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990620018dc9088908890600401620031f6565b600060405180830381600087803b158015620018f757600080fd5b505af11580156200190c573d6000803e3d6000fd5b50505050846001600160a01b03168789858560405160240162001933949392919062003531565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b179052516200196a919062003265565b6000604051808303816000865af19150503d8060008114620019a9576040519150601f19603f3d011682016040523d82523d6000602084013e620019ae565b606091505b50909150505b80620019d3576040516337e391c360e01b815260040160405180910390fd5b60008051602062004f0d8339815191528b89898888604051620019fb95949392919062003462565b60405180910390a150505050505050505050505050565b60008162001a2286868662000834565b1490505b949350505050565b60685460ff161562001a5357604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b60685463ffffffff61010090910481169087160362001abd576040516302caf51760e11b815260040160405180910390fd5b60008051602062004eed8339815191526001606860019054906101000a900463ffffffff1633898989888860535460405162001b02999897969594939291906200356e565b60405180910390a162001b3d6200147d6001606860019054906101000a900463ffffffff16338a8a8a898960405162000bd59291906200323f565b821562000ac15762000ac15b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d62001b9262000728565b6040518263ffffffff1660e01b815260040162001bb191815260200190565b600060405180830381600087803b15801562001bcc57600080fd5b505af115801562001be1573d6000803e3d6000fd5b50505050565b606854600090600160281b90046001600160a01b031663257b363262001c0e86866200257c565b6040518263ffffffff1660e01b815260040162001c2d91815260200190565b6020604051808303816000875af115801562001c4d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001c73919062003494565b90508060000362001c9657604051622f6fad60e01b815260040160405180910390fd5b600080600160401b871660010362001cdd5786915062001cb9848a848962001a12565b62001cd7576040516338105f3b60e21b815260040160405180910390fd5b62001d2e565b602087901c62001cef816001620035dd565b915087925062001d0e62001d05868c8662000834565b8a838962001a12565b62001d2c576040516338105f3b60e21b815260040160405180910390fd5b505b62001d3a8282620025b1565b505050505050505050565b62001d9f8363a9059cbb60e01b848460405160240162001d67929190620031f6565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262002661565b505050565b60026001540362001df85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001551565b6002600155565b600062001e10600482848662003604565b62001e1b9162003630565b9050632afa533160e01b6001600160e01b031982160162001fbc57600080808080808062001e4d896004818d62003604565b81019062001e5c919062003661565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161462001e9d5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038616301462001ec75760405163750643af60e01b815260040160405180910390fd5b8a851462001ee8576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e169162001f68919062003265565b6000604051808303816000865af19150503d806000811462001fa7576040519150601f19603f3d011682016040523d82523d6000602084013e62001fac565b606091505b5050505050505050505062000694565b6001600160e01b031981166323f2ebc360e21b1462001fee57604051637141605d60e11b815260040160405180910390fd5b600080808080808080620020068a6004818e62003604565b810190620020159190620036bc565b97509750975097509750975097509750336001600160a01b0316886001600160a01b031614620020585760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0387163014620020825760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f16916200210b919062003265565b6000604051808303816000865af19150503d80600081146200214a576040519150601f19603f3d011682016040523d82523d6000602084013e6200214f565b606091505b50505050505050505050505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905262001be19085906323b872dd60e01b9060840162001d67565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009182916001600160a01b03861691620021e4919062003265565b600060405180830381855afa9150503d806000811462002221576040519150601f19603f3d011682016040523d82523d6000602084013e62002226565b606091505b5091509150816200225757604051806040016040528060078152602001664e4f5f4e414d4560c81b81525062001a26565b62001a26816200273a565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009182916001600160a01b03861691620022ab919062003265565b600060405180830381855afa9150503d8060008114620022e8576040519150601f19603f3d011682016040523d82523d6000602084013e620022ed565b606091505b5091509150816200225757604051806040016040528060098152602001681393d7d4d6535093d360ba1b81525062001a26565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b0386169162002368919062003265565b600060405180830381855afa9150503d8060008114620023a5576040519150601f19603f3d011682016040523d82523d6000602084013e620023aa565b606091505b5091509150818015620023be575080516020145b620023cb57601262001a26565b8080602001905181019062001a26919062003748565b806001620023f26020600262003865565b620023fe9190620034ae565b6053541062002420576040516377ae67b360e11b815260040160405180910390fd5b6000605360008154620024339062003117565b9182905550905060005b6020811015620024cf578082901c600116600103620024755782603382602081106200246d576200246d620030dd565b015550505050565b603381602081106200248b576200248b620030dd565b015483604051602001620024a1929190620030f3565b6040516020818303038152906040528051906020012092508080620024c69062003117565b9150506200243d565b5062001d9f62003873565b60018055565b6001600160a01b03163b151590565b600054610100900460ff16620025195760405162461bcd60e51b8152600401620015519062003889565b620005f6620028e3565b60685460ff166200254757604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6000828260405160200162002593929190620030f3565b60405160208183030381529060405280519060200120905092915050565b606854600090610100900463ffffffff16158015620025d6575063ffffffff82166001145b15620025ea575063ffffffff821662002615565b62002600600160201b63ffffffff84166200320f565b620026129063ffffffff851662003229565b90505b600881901c60008181526069602052604081208054600160ff861690811b91821892839055929091908183169003620014a257604051630c8d9eab60e31b815260040160405180910390fd5b6000620026b8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200290d9092919063ffffffff16565b80519091501562001d9f5780806020019051810190620026d99190620038d4565b62001d9f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162001551565b606060408251106200275c5781806020019051810190620006459190620038f4565b8151602003620028b05760005b6020811080156200279c57508281815181106200278a576200278a620030dd565b01602001516001600160f81b03191615155b15620027b75780620027ae8162003117565b91505062002769565b80600003620027f05750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b6000816001600160401b038111156200280d576200280d6200324f565b6040519080825280601f01601f19166020018201604052801562002838576020820181803683370190505b50905060005b82811015620028a8578481815181106200285c576200285c620030dd565b602001015160f81c60f81b8282815181106200287c576200287c620030dd565b60200101906001600160f81b031916908160001a905350806200289f8162003117565b9150506200283e565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b600054610100900460ff16620024da5760405162461bcd60e51b8152600401620015519062003889565b606062001a26848460008585600080866001600160a01b0316858760405162002937919062003265565b60006040518083038185875af1925050503d806000811462002976576040519150601f19603f3d011682016040523d82523d6000602084013e6200297b565b606091505b50915091506200298e8783838762002999565b979650505050505050565b6060831562002a0d57825160000362002a0557620029b785620024e0565b62002a055760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001551565b508162001a26565b62001a26838381511562002a245781518083602001fd5b8060405162461bcd60e51b815260040162001551919062003973565b611564806200398983390190565b803563ffffffff81168114620028de57600080fd5b6001600160a01b038116811462002a7957600080fd5b50565b6000806040838503121562002a9057600080fd5b62002a9b8362002a4e565b9150602083013562002aad8162002a63565b809150509250929050565b6001600160a01b0391909116815260200190565b801515811462002a7957600080fd5b60008083601f84011262002aee57600080fd5b5081356001600160401b0381111562002b0657600080fd5b60208301915083602082850101111562002b1f57600080fd5b9250929050565b60008060008060006080868803121562002b3f57600080fd5b62002b4a8662002a4e565b9450602086013562002b5c8162002a63565b9350604086013562002b6e8162002acc565b925060608601356001600160401b0381111562002b8a57600080fd5b62002b988882890162002adb565b969995985093965092949392505050565b60006020828403121562002bbc57600080fd5b813562002bc98162002a63565b9392505050565b60ff8116811462002a7957600080fd5b600080600080600080600060e0888a03121562002bfc57600080fd5b873562002c098162002bd0565b965062002c196020890162002a4e565b9550604088013562002c2b8162002a63565b945062002c3b6060890162002a4e565b9350608088013562002c4d8162002a63565b9699959850939692959460a0840135945060c09093013592915050565b60006020828403121562002c7d57600080fd5b5035919050565b8061040081018310156200064557600080fd5b6000806000610440848603121562002cae57600080fd5b8335925062002cc1856020860162002c84565b915062002cd2610420850162002a4e565b90509250925092565b600080600080600080600060a0888a03121562002cf757600080fd5b62002d028862002a4e565b9650602088013562002d148162002a63565b955060408801356001600160401b038082111562002d3157600080fd5b62002d3f8b838c0162002adb565b909750955060608a013591508082111562002d5957600080fd5b5062002d688a828b0162002adb565b909450925050608088013562002d7e8162002bd0565b8091505092959891949750929550565b60008060008060008060a0878903121562002da857600080fd5b62002db38762002a4e565b9550602087013562002dc58162002a63565b945060408701359350606087013562002dde8162002acc565b925060808701356001600160401b0381111562002dfa57600080fd5b62002e0889828a0162002adb565b979a9699509497509295939492505050565b6000806040838503121562002e2e57600080fd5b62002e398362002a4e565b915062002e496020840162002a4e565b90509250929050565b6000806000806000806000806000806000806109208d8f03121562002e7657600080fd5b62002e828e8e62002c84565b9b5062002e948e6104008f0162002c84565b9a506108008d013599506108208d013598506108408d0135975062002ebd6108608e0162002a4e565b965062002ecf6108808e013562002a63565b6108808d0135955062002ee66108a08e0162002a4e565b945062002ef86108c08e013562002a63565b6108c08d013593506108e08d013592506001600160401b036109008e0135111562002f2257600080fd5b62002f358e6109008f01358f0162002adb565b81935080925050509295989b509295989b509295989b565b600080600080600080600060c0888a03121562002f6957600080fd5b62002f748862002a4e565b9650602088013562002f868162002a63565b955060408801359450606088013562002f9f8162002a63565b9350608088013562002fb18162002acc565b925060a08801356001600160401b0381111562002fcd57600080fd5b62002fdb8a828b0162002adb565b989b979a50959850939692959293505050565b600080600080600060a086880312156200300757600080fd5b620030128662002a4e565b94506020860135620030248162002a63565b9350620030346040870162002a4e565b92506060860135620030468162002a63565b91506080860135620030588162002a63565b809150509295509295909350565b60008060008061046085870312156200307e57600080fd5b8435935062003091866020870162002c84565b9250620030a2610420860162002a4e565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b634e487b7160e01b600052603260045260246000fd5b918252602082015260400190565b634e487b7160e01b600052601160045260246000fd5b6000600182016200312c576200312c62003101565b5060010190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006200317260608301878962003133565b82810360208401526200318781868862003133565b91505060ff831660408301529695505050505050565b60005b83811015620031ba578181015183820152602001620031a0565b50506000910152565b60008351620031d78184602088016200319d565b835190830190620031ed8183602088016200319d565b01949350505050565b6001600160a01b03929092168252602082015260400190565b808202811582820484141762000645576200064562003101565b8082018082111562000645576200064562003101565b8183823760009101908152919050565b634e487b7160e01b600052604160045260246000fd5b60008251620032798184602087016200319d565b9190910192915050565b604051601f8201601f191681016001600160401b0381118282101715620032ae57620032ae6200324f565b604052919050565b60006001600160401b03821115620032d257620032d26200324f565b50601f01601f191660200190565b600082601f830112620032f257600080fd5b8135620033096200330382620032b6565b62003283565b8181528460208386010111156200331f57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156200335257600080fd5b83356001600160401b03808211156200336a57600080fd5b6200337887838801620032e0565b945060208601359150808211156200338f57600080fd5b506200339e86828701620032e0565b9250506040840135620033b18162002bd0565b809150509250925092565b60008151808452620033d68160208601602086016200319d565b601f01601f19169290920160200192915050565b606081526000620033ff6060830186620033bc565b8281036020840152620034138186620033bc565b91505060ff83166040830152949350505050565b63ffffffff861681526001600160a01b038581166020830152841660408201526080606082018190526000906200298e908301848662003133565b94855263ffffffff9390931660208501526001600160a01b039182166040850152166060830152608082015260a00190565b600060208284031215620034a757600080fd5b5051919050565b8181038181111562000645576200064562003101565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c083018190526000916200351884830187620033bc565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff8416602082015260606040820181905260009062003564908301848662003133565b9695505050505050565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c08301819052600091620035c3848301878962003133565b925080851660e085015250509a9950505050505050505050565b63ffffffff818116838216019080821115620035fd57620035fd62003101565b5092915050565b600080858511156200361557600080fd5b838611156200362357600080fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015620036595780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a0312156200367d57600080fd5b87356200368a8162002a63565b965060208801356200369c8162002a63565b95506040880135945060608801359350608088013562002c4d8162002bd0565b600080600080600080600080610100898b031215620036da57600080fd5b8835620036e78162002a63565b97506020890135620036f98162002a63565b965060408901359550606089013594506080890135620037198162002acc565b935060a08901356200372b8162002bd0565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200375b57600080fd5b815162002bc98162002bd0565b600181815b80851115620037a95781600019048211156200378d576200378d62003101565b808516156200379b57918102915b93841c93908002906200376d565b509250929050565b600082620037c25750600162000645565b81620037d15750600062000645565b8160018114620037ea5760028114620037f55762003815565b600191505062000645565b60ff84111562003809576200380962003101565b50506001821b62000645565b5060208310610133831016604e8410600b84101617156200383a575081810a62000645565b62003846838362003768565b80600019048211156200385d576200385d62003101565b029392505050565b600062002bc98383620037b1565b634e487b7160e01b600052600160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600060208284031215620038e757600080fd5b815162002bc98162002acc565b6000602082840312156200390757600080fd5b81516001600160401b038111156200391e57600080fd5b8201601f810184136200393057600080fd5b8051620039416200330382620032b6565b8181528560208385010111156200395757600080fd5b6200396a8260208301602086016200319d565b95945050505050565b60208152600062002bc96020830184620033bc56fe6101006040523480156200001257600080fd5b50604051620015643803806200156483398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516110a8620004bc60003960006101a30152600081816102660152818161048c01526104fa0152600061043d0152600081816102cb015261040701526110a86000f3fe608060405234801561001057600080fd5b50600436106101075760003560e01c806306fdde031461010c578063095ea7b31461012a57806318160ddd1461014d57806320606b701461015f57806323b872dd1461017457806330adf81f14610187578063313ce5671461019c5780633644e515146101cd57806339509351146101d557806340c10f19146101e857806370a08231146101fd5780637ecebe001461022657806395d89b41146102465780639dc29fac1461024e578063a3c573eb14610261578063a457c2d7146102a0578063a9059cbb146102b3578063cd0d0096146102c6578063d505accf146102ed578063dd62ed3e14610300578063ffa1ad7414610313575b600080fd5b610114610333565b6040516101219190610dae565b60405180910390f35b61013d610138366004610e18565b6103c5565b6040519015158152602001610121565b6002545b604051908152602001610121565b61015160008051602061105383398151915281565b61013d610182366004610e42565b6103df565b61015160008051602061103383398151915281565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610121565b610151610403565b61013d6101e3366004610e18565b61045f565b6101fb6101f6366004610e18565b610481565b005b61015161020b366004610e7e565b6001600160a01b031660009081526020819052604090205490565b610151610234366004610e7e565b60056020526000908152604090205481565b6101146104e0565b6101fb61025c366004610e18565b6104ef565b6102887f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610121565b61013d6102ae366004610e18565b610541565b61013d6102c1366004610e18565b6105bc565b6101517f000000000000000000000000000000000000000000000000000000000000000081565b6101fb6102fb366004610ea0565b6105ca565b61015161030e366004610f13565b6107f3565b610114604051806040016040528060018152602001603160f81b81525081565b60606003805461034290610f46565b80601f016020809104026020016040519081016040528092919081815260200182805461036e90610f46565b80156103bb5780601f10610390576101008083540402835291602001916103bb565b820191906000526020600020905b81548152906001019060200180831161039e57829003601f168201915b5050505050905090565b6000336103d381858561081e565b60019150505b92915050565b6000336103ed858285610943565b6103f88585856109bd565b506001949350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461461043a5761043546610b4f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000336103d381858561047283836107f3565b61047c9190610f96565b61081e565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104d25760405162461bcd60e51b81526004016104c990610fa9565b60405180910390fd5b6104dc8282610be9565b5050565b60606004805461034290610f46565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105375760405162461bcd60e51b81526004016104c990610fa9565b6104dc8282610c96565b6000338161054f82866107f3565b9050838110156105af5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104c9565b6103f8828686840361081e565b6000336103d38185856109bd565b834211156106265760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104c9565b6001600160a01b03871660009081526005602052604081208054600080516020611033833981519152918a918a918a91908661066183610ff9565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006106bf610403565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa15801561074a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906107805750896001600160a01b0316816001600160a01b0316145b6107dc5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104c9565b6107e78a8a8a61081e565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166108805760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104c9565b6001600160a01b0382166108e15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104c9565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600061094f84846107f3565b905060001981146109b757818110156109aa5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104c9565b6109b7848484840361081e565b50505050565b6001600160a01b038316610a215760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104c9565b6001600160a01b038216610a835760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104c9565b6001600160a01b03831660009081526020819052604090205481811015610afb5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104c9565b6001600160a01b0384811660008181526020818152604080832087870390559387168083529184902080548701905592518581529092600080516020611013833981519152910160405180910390a36109b7565b6000600080516020611053833981519152610b68610333565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c3f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104c9565b8060026000828254610c519190610f96565b90915550506001600160a01b03821660008181526020818152604080832080548601905551848152600080516020611013833981519152910160405180910390a35050565b6001600160a01b038216610cf65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104c9565b6001600160a01b03821660009081526020819052604090205481811015610d6a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104c9565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192916000805160206110138339815191529101610936565b600060208083528351808285015260005b81811015610ddb57858101830151858201604001528201610dbf565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610e1357600080fd5b919050565b60008060408385031215610e2b57600080fd5b610e3483610dfc565b946020939093013593505050565b600080600060608486031215610e5757600080fd5b610e6084610dfc565b9250610e6e60208501610dfc565b9150604084013590509250925092565b600060208284031215610e9057600080fd5b610e9982610dfc565b9392505050565b600080600080600080600060e0888a031215610ebb57600080fd5b610ec488610dfc565b9650610ed260208901610dfc565b95506040880135945060608801359350608088013560ff81168114610ef657600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f2657600080fd5b610f2f83610dfc565b9150610f3d60208401610dfc565b90509250929050565b600181811c90821680610f5a57607f821691505b602082108103610f7a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156103d9576103d9610f80565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b60006001820161100b5761100b610f80565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa26469706673582212203ea4a1224be7b5ef35dc397dfc81433d85cd6fdbf17d8b2e3d528071e7e612b564736f6c63430008140033501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4da2646970667358221220e5d45347a3bb440414fd70a860f95e13d1411d9be38220533035ce646e8a207b64736f6c63430008140033", - "deployedBytecode": "0x608060405260043610620001645760003560e01c806315064c9614620001695780632072f6c5146200019a57806322e95f2c14620001b4578063240ff37814620001e85780632dfdf0b514620001ff578063318aee3d14620002265780633c351e1014620002945780633cbc795b14620002b65780633e19704314620002f25780634b2f336d14620003175780635ca1e165146200033957806379e2cf97146200035157806381b1c174146200036957806383f2440314620003a35780638ed7e3f214620003c8578063aaa13cc214620003ea578063b8b284d0146200040f578063bab161bf1462000434578063be5831c71462000458578063cc461632146200047e578063ccaa2d1114620004a3578063cd58657914620004c8578063d02103ca14620004df578063d3476afe1462000508578063dbc16976146200052d578063ee25560b1462000545578063f5efcd791462000576578063fb570834146200059b575b600080fd5b3480156200017657600080fd5b50606854620001859060ff1681565b60405190151581526020015b60405180910390f35b348015620001a757600080fd5b50620001b2620005c0565b005b348015620001c157600080fd5b50620001d9620001d336600462002a7c565b620005f8565b60405162000191919062002ab8565b620001b2620001f936600462002b26565b6200064b565b3480156200020c57600080fd5b506200021760535481565b60405190815260200162000191565b3480156200023357600080fd5b506200026f6200024536600462002ba9565b606b6020526000908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b0390911660208301520162000191565b348015620002a157600080fd5b50606d54620001d9906001600160a01b031681565b348015620002c357600080fd5b50606d54620002dc90600160a01b900463ffffffff1681565b60405163ffffffff909116815260200162000191565b348015620002ff57600080fd5b50620002176200031136600462002be0565b6200069b565b3480156200032457600080fd5b50606e54620001d9906001600160a01b031681565b3480156200034657600080fd5b506200021762000728565b3480156200035e57600080fd5b50620001b262000810565b3480156200037657600080fd5b50620001d96200038836600462002c6a565b606a602052600090815260409020546001600160a01b031681565b348015620003b057600080fd5b5062000217620003c236600462002c97565b62000834565b348015620003d557600080fd5b50606c54620001d9906001600160a01b031681565b348015620003f757600080fd5b50620001d96200040936600462002cdb565b62000908565b3480156200041c57600080fd5b50620001b26200042e36600462002d8e565b62000a1f565b3480156200044157600080fd5b50606854620002dc90610100900463ffffffff1681565b3480156200046557600080fd5b50606854620002dc90600160c81b900463ffffffff1681565b3480156200048b57600080fd5b50620001856200049d36600462002e1a565b62000ac9565b348015620004b057600080fd5b50620001b2620004c236600462002e52565b62000b59565b620001b2620004d936600462002f4d565b62001087565b348015620004ec57600080fd5b50606854620001d990600160281b90046001600160a01b031681565b3480156200051557600080fd5b50620001b26200052736600462002fee565b620014ab565b3480156200053a57600080fd5b50620001b262001737565b3480156200055257600080fd5b50620002176200056436600462002c6a565b60696020526000908152604090205481565b3480156200058357600080fd5b50620001b26200059536600462002e52565b6200176d565b348015620005a857600080fd5b5062000185620005ba36600462003066565b62001a12565b606c546001600160a01b03163314620005ec57604051631736745960e31b815260040160405180910390fd5b620005f662001a2e565b565b6000606a6000848460405160200162000613929190620030b3565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b3415801590620006655750606e546001600160a01b031615155b1562000684576040516301bd897160e61b815260040160405180910390fd5b6200069485853486868662001a8b565b5050505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b605354600090819081805b602081101562000807578083901c600116600103620007965760338160208110620007625762000762620030dd565b01548460405160200162000778929190620030f3565b604051602081830303815290604052805190602001209350620007c4565b8382604051602001620007ab929190620030f3565b6040516020818303038152906040528051906020012093505b8182604051602001620007d9929190620030f3565b6040516020818303038152906040528051906020012091508080620007fe9062003117565b91505062000733565b50919392505050565b605354606854600160c81b900463ffffffff161015620005f657620005f662001b49565b600083815b6020811015620008ff57600163ffffffff8516821c81169003620008a3578481602081106200086c576200086c620030dd565b60200201358260405160200162000885929190620030f3565b604051602081830303815290604052805190602001209150620008ea565b81858260208110620008b957620008b9620030dd565b6020020135604051602001620008d1929190620030f3565b6040516020818303038152906040528051906020012091505b80620008f68162003117565b91505062000839565b50949350505050565b600080888860405160200162000920929190620030b3565b604051602081830303815290604052805190602001209050600060ff60f81b308360405180602001620009539062002a40565b601f1982820381018352601f90910116604081905262000980908d908d908d908d908d906020016200315c565b60408051601f1981840301815290829052620009a09291602001620031c3565b60405160208183030381529060405280519060200120604051602001620009f994939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b606e546001600160a01b031662000a495760405163dde3cda760e01b815260040160405180910390fd5b606e54604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac9062000a7d9033908890600401620031f6565b600060405180830381600087803b15801562000a9857600080fd5b505af115801562000aad573d6000803e3d6000fd5b5050505062000ac186868686868662001a8b565b505050505050565b6068546000908190610100900463ffffffff1615801562000af0575063ffffffff83166001145b1562000b04575063ffffffff831662000b2f565b62000b1a600160201b63ffffffff85166200320f565b62000b2c9063ffffffff861662003229565b90505b600881901c600090815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000b7e57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161462000baf576040516302caf51760e11b815260040160405180910390fd5b62000be98c8c8c8c8c62000be360008e8e8e8e8e8e8e60405162000bd59291906200323f565b60405180910390206200069b565b62001be7565b6001600160a01b03861662000d2f57606e546001600160a01b031662000cc15760006001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000c43576020820181803683370190505b5060405162000c53919062003265565b60006040518083038185875af1925050503d806000811462000c92576040519150601f19603f3d011682016040523d82523d6000602084013e62000c97565b606091505b505090508062000cba57604051630ce8f45160e31b815260040160405180910390fd5b5062001049565b606e546040516340c10f1960e01b81526001600160a01b03909116906340c10f199062000cf59087908790600401620031f6565b600060405180830381600087803b15801562000d1057600080fd5b505af115801562000d25573d6000803e3d6000fd5b5050505062001049565b606d546001600160a01b03878116911614801562000d5e5750606d5463ffffffff888116600160a01b90920416145b1562000d785760006001600160a01b038516848262000c18565b60685463ffffffff61010090910481169088160362000dad5762000da76001600160a01b038716858562001d45565b62001049565b6000878760405160200162000dc4929190620030b3565b60408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b03168062000fe1576000808062000e0d868801886200333c565b92509250925060008584848460405162000e279062002a40565b62000e3593929190620033ea565b8190604051809103906000f590508015801562000e56573d6000803e3d6000fd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f199062000e8a908d908d90600401620031f6565b600060405180830381600087803b15801562000ea557600080fd5b505af115801562000eba573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000fcf95949392919062003427565b60405180910390a15050505062001046565b6040516340c10f1960e01b81526001600160a01b038216906340c10f1990620010119089908990600401620031f6565b600060405180830381600087803b1580156200102c57600080fd5b505af115801562001041573d6000803e3d6000fd5b505050505b50505b60008051602062004f0d8339815191528a888887876040516200107195949392919062003462565b60405180910390a1505050505050505050505050565b60685460ff1615620010ac57604051630bc011ff60e21b815260040160405180910390fd5b620010b662001da4565b60685463ffffffff610100909104811690881603620010e8576040516302caf51760e11b815260040160405180910390fd5b6000806060876001600160a01b03881662001142578834146200111e5760405163b89240f560e01b815260040160405180910390fd5b606d546001600160a01b0381169450600160a01b900463ffffffff16925062001427565b3415620011625760405163798ee6f160e01b815260040160405180910390fd5b606e546001600160a01b0390811690891603620011e357604051632770a7eb60e21b81526001600160a01b03891690639dc29fac90620011a99033908d90600401620031f6565b600060405180830381600087803b158015620011c457600080fd5b505af1158015620011d9573d6000803e3d6000fd5b5050505062001427565b6001600160a01b038089166000908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b90049092169181018290529015620012a157604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac90620012599033908e90600401620031f6565b600060405180830381600087803b1580156200127457600080fd5b505af115801562001289573d6000803e3d6000fd5b50505050806020015194508060000151935062001425565b8515620012b657620012b6898b898962001dff565b6040516370a0823160e01b81526000906001600160a01b038b16906370a0823190620012e790309060040162002ab8565b602060405180830381865afa15801562001305573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200132b919062003494565b9050620013446001600160a01b038b1633308e62002161565b6040516370a0823160e01b81526000906001600160a01b038c16906370a08231906200137590309060040162002ab8565b602060405180830381865afa15801562001393573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620013b9919062003494565b9050620013c78282620034ae565b6068548c9850610100900463ffffffff1696509350620013e7876200219b565b620013f28c62002262565b620013fd8d62002320565b6040516020016200141193929190620033ea565b604051602081830303815290604052945050505b505b60008051602062004eed833981519152600084868e8e868860535460405162001458989796959493929190620034c4565b60405180910390a1620014836200147d600085878f8f8789805190602001206200069b565b620023e1565b861562001494576200149462001b49565b50505050620014a260018055565b50505050505050565b600054610100900460ff1615808015620014cc5750600054600160ff909116105b80620014f15750620014de30620024e0565b158015620014f1575060005460ff166001145b6200155a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156200157e576000805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff891602600160281b600160c81b03191617600160281b6001600160a01b038681169190910291909117909155606c80546001600160a01b031916848316179055606d54166200161357606d54600160a01b900463ffffffff16156200160d57604051630d43a60960e11b815260040160405180910390fd5b620016df565b606d805463ffffffff8616600160a01b026001600160c01b03199091166001600160a01b03881617179055604051600090601290620016529062002a40565b6060808252600d908201526c2bb930b83832b21022ba3432b960991b608082015260a060208201819052600490820152630ae8aa8960e31b60c082015260ff909116604082015260e0018190604051809103906000f5905080158015620016bd573d6000803e3d6000fd5b50606e80546001600160a01b0319166001600160a01b03929092169190911790555b620016e9620024ef565b801562000ac1576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b606c546001600160a01b031633146200176357604051631736745960e31b815260040160405180910390fd5b620005f662002523565b60685460ff16156200179257604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614620017c3576040516302caf51760e11b815260040160405180910390fd5b620017e98c8c8c8c8c62000be360018e8e8e8e8e8e8e60405162000bd59291906200323f565b606e546000906001600160a01b0316620018a857846001600160a01b031684888a868660405160240162001821949392919062003531565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162001858919062003265565b60006040518083038185875af1925050503d806000811462001897576040519150601f19603f3d011682016040523d82523d6000602084013e6200189c565b606091505b505080915050620019b4565b606e546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990620018dc9088908890600401620031f6565b600060405180830381600087803b158015620018f757600080fd5b505af11580156200190c573d6000803e3d6000fd5b50505050846001600160a01b03168789858560405160240162001933949392919062003531565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b179052516200196a919062003265565b6000604051808303816000865af19150503d8060008114620019a9576040519150601f19603f3d011682016040523d82523d6000602084013e620019ae565b606091505b50909150505b80620019d3576040516337e391c360e01b815260040160405180910390fd5b60008051602062004f0d8339815191528b89898888604051620019fb95949392919062003462565b60405180910390a150505050505050505050505050565b60008162001a2286868662000834565b1490505b949350505050565b60685460ff161562001a5357604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b60685463ffffffff61010090910481169087160362001abd576040516302caf51760e11b815260040160405180910390fd5b60008051602062004eed8339815191526001606860019054906101000a900463ffffffff1633898989888860535460405162001b02999897969594939291906200356e565b60405180910390a162001b3d6200147d6001606860019054906101000a900463ffffffff16338a8a8a898960405162000bd59291906200323f565b821562000ac15762000ac15b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d62001b9262000728565b6040518263ffffffff1660e01b815260040162001bb191815260200190565b600060405180830381600087803b15801562001bcc57600080fd5b505af115801562001be1573d6000803e3d6000fd5b50505050565b606854600090600160281b90046001600160a01b031663257b363262001c0e86866200257c565b6040518263ffffffff1660e01b815260040162001c2d91815260200190565b6020604051808303816000875af115801562001c4d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001c73919062003494565b90508060000362001c9657604051622f6fad60e01b815260040160405180910390fd5b600080600160401b871660010362001cdd5786915062001cb9848a848962001a12565b62001cd7576040516338105f3b60e21b815260040160405180910390fd5b62001d2e565b602087901c62001cef816001620035dd565b915087925062001d0e62001d05868c8662000834565b8a838962001a12565b62001d2c576040516338105f3b60e21b815260040160405180910390fd5b505b62001d3a8282620025b1565b505050505050505050565b62001d9f8363a9059cbb60e01b848460405160240162001d67929190620031f6565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262002661565b505050565b60026001540362001df85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001551565b6002600155565b600062001e10600482848662003604565b62001e1b9162003630565b9050632afa533160e01b6001600160e01b031982160162001fbc57600080808080808062001e4d896004818d62003604565b81019062001e5c919062003661565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161462001e9d5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038616301462001ec75760405163750643af60e01b815260040160405180910390fd5b8a851462001ee8576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e169162001f68919062003265565b6000604051808303816000865af19150503d806000811462001fa7576040519150601f19603f3d011682016040523d82523d6000602084013e62001fac565b606091505b5050505050505050505062000694565b6001600160e01b031981166323f2ebc360e21b1462001fee57604051637141605d60e11b815260040160405180910390fd5b600080808080808080620020068a6004818e62003604565b810190620020159190620036bc565b97509750975097509750975097509750336001600160a01b0316886001600160a01b031614620020585760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0387163014620020825760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f16916200210b919062003265565b6000604051808303816000865af19150503d80600081146200214a576040519150601f19603f3d011682016040523d82523d6000602084013e6200214f565b606091505b50505050505050505050505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905262001be19085906323b872dd60e01b9060840162001d67565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009182916001600160a01b03861691620021e4919062003265565b600060405180830381855afa9150503d806000811462002221576040519150601f19603f3d011682016040523d82523d6000602084013e62002226565b606091505b5091509150816200225757604051806040016040528060078152602001664e4f5f4e414d4560c81b81525062001a26565b62001a26816200273a565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009182916001600160a01b03861691620022ab919062003265565b600060405180830381855afa9150503d8060008114620022e8576040519150601f19603f3d011682016040523d82523d6000602084013e620022ed565b606091505b5091509150816200225757604051806040016040528060098152602001681393d7d4d6535093d360ba1b81525062001a26565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b0386169162002368919062003265565b600060405180830381855afa9150503d8060008114620023a5576040519150601f19603f3d011682016040523d82523d6000602084013e620023aa565b606091505b5091509150818015620023be575080516020145b620023cb57601262001a26565b8080602001905181019062001a26919062003748565b806001620023f26020600262003865565b620023fe9190620034ae565b6053541062002420576040516377ae67b360e11b815260040160405180910390fd5b6000605360008154620024339062003117565b9182905550905060005b6020811015620024cf578082901c600116600103620024755782603382602081106200246d576200246d620030dd565b015550505050565b603381602081106200248b576200248b620030dd565b015483604051602001620024a1929190620030f3565b6040516020818303038152906040528051906020012092508080620024c69062003117565b9150506200243d565b5062001d9f62003873565b60018055565b6001600160a01b03163b151590565b600054610100900460ff16620025195760405162461bcd60e51b8152600401620015519062003889565b620005f6620028e3565b60685460ff166200254757604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6000828260405160200162002593929190620030f3565b60405160208183030381529060405280519060200120905092915050565b606854600090610100900463ffffffff16158015620025d6575063ffffffff82166001145b15620025ea575063ffffffff821662002615565b62002600600160201b63ffffffff84166200320f565b620026129063ffffffff851662003229565b90505b600881901c60008181526069602052604081208054600160ff861690811b91821892839055929091908183169003620014a257604051630c8d9eab60e31b815260040160405180910390fd5b6000620026b8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200290d9092919063ffffffff16565b80519091501562001d9f5780806020019051810190620026d99190620038d4565b62001d9f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162001551565b606060408251106200275c5781806020019051810190620006459190620038f4565b8151602003620028b05760005b6020811080156200279c57508281815181106200278a576200278a620030dd565b01602001516001600160f81b03191615155b15620027b75780620027ae8162003117565b91505062002769565b80600003620027f05750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b6000816001600160401b038111156200280d576200280d6200324f565b6040519080825280601f01601f19166020018201604052801562002838576020820181803683370190505b50905060005b82811015620028a8578481815181106200285c576200285c620030dd565b602001015160f81c60f81b8282815181106200287c576200287c620030dd565b60200101906001600160f81b031916908160001a905350806200289f8162003117565b9150506200283e565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b600054610100900460ff16620024da5760405162461bcd60e51b8152600401620015519062003889565b606062001a26848460008585600080866001600160a01b0316858760405162002937919062003265565b60006040518083038185875af1925050503d806000811462002976576040519150601f19603f3d011682016040523d82523d6000602084013e6200297b565b606091505b50915091506200298e8783838762002999565b979650505050505050565b6060831562002a0d57825160000362002a0557620029b785620024e0565b62002a055760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001551565b508162001a26565b62001a26838381511562002a245781518083602001fd5b8060405162461bcd60e51b815260040162001551919062003973565b611564806200398983390190565b803563ffffffff81168114620028de57600080fd5b6001600160a01b038116811462002a7957600080fd5b50565b6000806040838503121562002a9057600080fd5b62002a9b8362002a4e565b9150602083013562002aad8162002a63565b809150509250929050565b6001600160a01b0391909116815260200190565b801515811462002a7957600080fd5b60008083601f84011262002aee57600080fd5b5081356001600160401b0381111562002b0657600080fd5b60208301915083602082850101111562002b1f57600080fd5b9250929050565b60008060008060006080868803121562002b3f57600080fd5b62002b4a8662002a4e565b9450602086013562002b5c8162002a63565b9350604086013562002b6e8162002acc565b925060608601356001600160401b0381111562002b8a57600080fd5b62002b988882890162002adb565b969995985093965092949392505050565b60006020828403121562002bbc57600080fd5b813562002bc98162002a63565b9392505050565b60ff8116811462002a7957600080fd5b600080600080600080600060e0888a03121562002bfc57600080fd5b873562002c098162002bd0565b965062002c196020890162002a4e565b9550604088013562002c2b8162002a63565b945062002c3b6060890162002a4e565b9350608088013562002c4d8162002a63565b9699959850939692959460a0840135945060c09093013592915050565b60006020828403121562002c7d57600080fd5b5035919050565b8061040081018310156200064557600080fd5b6000806000610440848603121562002cae57600080fd5b8335925062002cc1856020860162002c84565b915062002cd2610420850162002a4e565b90509250925092565b600080600080600080600060a0888a03121562002cf757600080fd5b62002d028862002a4e565b9650602088013562002d148162002a63565b955060408801356001600160401b038082111562002d3157600080fd5b62002d3f8b838c0162002adb565b909750955060608a013591508082111562002d5957600080fd5b5062002d688a828b0162002adb565b909450925050608088013562002d7e8162002bd0565b8091505092959891949750929550565b60008060008060008060a0878903121562002da857600080fd5b62002db38762002a4e565b9550602087013562002dc58162002a63565b945060408701359350606087013562002dde8162002acc565b925060808701356001600160401b0381111562002dfa57600080fd5b62002e0889828a0162002adb565b979a9699509497509295939492505050565b6000806040838503121562002e2e57600080fd5b62002e398362002a4e565b915062002e496020840162002a4e565b90509250929050565b6000806000806000806000806000806000806109208d8f03121562002e7657600080fd5b62002e828e8e62002c84565b9b5062002e948e6104008f0162002c84565b9a506108008d013599506108208d013598506108408d0135975062002ebd6108608e0162002a4e565b965062002ecf6108808e013562002a63565b6108808d0135955062002ee66108a08e0162002a4e565b945062002ef86108c08e013562002a63565b6108c08d013593506108e08d013592506001600160401b036109008e0135111562002f2257600080fd5b62002f358e6109008f01358f0162002adb565b81935080925050509295989b509295989b509295989b565b600080600080600080600060c0888a03121562002f6957600080fd5b62002f748862002a4e565b9650602088013562002f868162002a63565b955060408801359450606088013562002f9f8162002a63565b9350608088013562002fb18162002acc565b925060a08801356001600160401b0381111562002fcd57600080fd5b62002fdb8a828b0162002adb565b989b979a50959850939692959293505050565b600080600080600060a086880312156200300757600080fd5b620030128662002a4e565b94506020860135620030248162002a63565b9350620030346040870162002a4e565b92506060860135620030468162002a63565b91506080860135620030588162002a63565b809150509295509295909350565b60008060008061046085870312156200307e57600080fd5b8435935062003091866020870162002c84565b9250620030a2610420860162002a4e565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b634e487b7160e01b600052603260045260246000fd5b918252602082015260400190565b634e487b7160e01b600052601160045260246000fd5b6000600182016200312c576200312c62003101565b5060010190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006200317260608301878962003133565b82810360208401526200318781868862003133565b91505060ff831660408301529695505050505050565b60005b83811015620031ba578181015183820152602001620031a0565b50506000910152565b60008351620031d78184602088016200319d565b835190830190620031ed8183602088016200319d565b01949350505050565b6001600160a01b03929092168252602082015260400190565b808202811582820484141762000645576200064562003101565b8082018082111562000645576200064562003101565b8183823760009101908152919050565b634e487b7160e01b600052604160045260246000fd5b60008251620032798184602087016200319d565b9190910192915050565b604051601f8201601f191681016001600160401b0381118282101715620032ae57620032ae6200324f565b604052919050565b60006001600160401b03821115620032d257620032d26200324f565b50601f01601f191660200190565b600082601f830112620032f257600080fd5b8135620033096200330382620032b6565b62003283565b8181528460208386010111156200331f57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156200335257600080fd5b83356001600160401b03808211156200336a57600080fd5b6200337887838801620032e0565b945060208601359150808211156200338f57600080fd5b506200339e86828701620032e0565b9250506040840135620033b18162002bd0565b809150509250925092565b60008151808452620033d68160208601602086016200319d565b601f01601f19169290920160200192915050565b606081526000620033ff6060830186620033bc565b8281036020840152620034138186620033bc565b91505060ff83166040830152949350505050565b63ffffffff861681526001600160a01b038581166020830152841660408201526080606082018190526000906200298e908301848662003133565b94855263ffffffff9390931660208501526001600160a01b039182166040850152166060830152608082015260a00190565b600060208284031215620034a757600080fd5b5051919050565b8181038181111562000645576200064562003101565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c083018190526000916200351884830187620033bc565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff8416602082015260606040820181905260009062003564908301848662003133565b9695505050505050565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c08301819052600091620035c3848301878962003133565b925080851660e085015250509a9950505050505050505050565b63ffffffff818116838216019080821115620035fd57620035fd62003101565b5092915050565b600080858511156200361557600080fd5b838611156200362357600080fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015620036595780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a0312156200367d57600080fd5b87356200368a8162002a63565b965060208801356200369c8162002a63565b95506040880135945060608801359350608088013562002c4d8162002bd0565b600080600080600080600080610100898b031215620036da57600080fd5b8835620036e78162002a63565b97506020890135620036f98162002a63565b965060408901359550606089013594506080890135620037198162002acc565b935060a08901356200372b8162002bd0565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200375b57600080fd5b815162002bc98162002bd0565b600181815b80851115620037a95781600019048211156200378d576200378d62003101565b808516156200379b57918102915b93841c93908002906200376d565b509250929050565b600082620037c25750600162000645565b81620037d15750600062000645565b8160018114620037ea5760028114620037f55762003815565b600191505062000645565b60ff84111562003809576200380962003101565b50506001821b62000645565b5060208310610133831016604e8410600b84101617156200383a575081810a62000645565b62003846838362003768565b80600019048211156200385d576200385d62003101565b029392505050565b600062002bc98383620037b1565b634e487b7160e01b600052600160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600060208284031215620038e757600080fd5b815162002bc98162002acc565b6000602082840312156200390757600080fd5b81516001600160401b038111156200391e57600080fd5b8201601f810184136200393057600080fd5b8051620039416200330382620032b6565b8181528560208385010111156200395757600080fd5b6200396a8260208301602086016200319d565b95945050505050565b60208152600062002bc96020830184620033bc56fe6101006040523480156200001257600080fd5b50604051620015643803806200156483398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516110a8620004bc60003960006101a30152600081816102660152818161048c01526104fa0152600061043d0152600081816102cb015261040701526110a86000f3fe608060405234801561001057600080fd5b50600436106101075760003560e01c806306fdde031461010c578063095ea7b31461012a57806318160ddd1461014d57806320606b701461015f57806323b872dd1461017457806330adf81f14610187578063313ce5671461019c5780633644e515146101cd57806339509351146101d557806340c10f19146101e857806370a08231146101fd5780637ecebe001461022657806395d89b41146102465780639dc29fac1461024e578063a3c573eb14610261578063a457c2d7146102a0578063a9059cbb146102b3578063cd0d0096146102c6578063d505accf146102ed578063dd62ed3e14610300578063ffa1ad7414610313575b600080fd5b610114610333565b6040516101219190610dae565b60405180910390f35b61013d610138366004610e18565b6103c5565b6040519015158152602001610121565b6002545b604051908152602001610121565b61015160008051602061105383398151915281565b61013d610182366004610e42565b6103df565b61015160008051602061103383398151915281565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610121565b610151610403565b61013d6101e3366004610e18565b61045f565b6101fb6101f6366004610e18565b610481565b005b61015161020b366004610e7e565b6001600160a01b031660009081526020819052604090205490565b610151610234366004610e7e565b60056020526000908152604090205481565b6101146104e0565b6101fb61025c366004610e18565b6104ef565b6102887f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610121565b61013d6102ae366004610e18565b610541565b61013d6102c1366004610e18565b6105bc565b6101517f000000000000000000000000000000000000000000000000000000000000000081565b6101fb6102fb366004610ea0565b6105ca565b61015161030e366004610f13565b6107f3565b610114604051806040016040528060018152602001603160f81b81525081565b60606003805461034290610f46565b80601f016020809104026020016040519081016040528092919081815260200182805461036e90610f46565b80156103bb5780601f10610390576101008083540402835291602001916103bb565b820191906000526020600020905b81548152906001019060200180831161039e57829003601f168201915b5050505050905090565b6000336103d381858561081e565b60019150505b92915050565b6000336103ed858285610943565b6103f88585856109bd565b506001949350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461461043a5761043546610b4f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000336103d381858561047283836107f3565b61047c9190610f96565b61081e565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104d25760405162461bcd60e51b81526004016104c990610fa9565b60405180910390fd5b6104dc8282610be9565b5050565b60606004805461034290610f46565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105375760405162461bcd60e51b81526004016104c990610fa9565b6104dc8282610c96565b6000338161054f82866107f3565b9050838110156105af5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104c9565b6103f8828686840361081e565b6000336103d38185856109bd565b834211156106265760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104c9565b6001600160a01b03871660009081526005602052604081208054600080516020611033833981519152918a918a918a91908661066183610ff9565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006106bf610403565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa15801561074a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906107805750896001600160a01b0316816001600160a01b0316145b6107dc5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104c9565b6107e78a8a8a61081e565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166108805760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104c9565b6001600160a01b0382166108e15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104c9565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600061094f84846107f3565b905060001981146109b757818110156109aa5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104c9565b6109b7848484840361081e565b50505050565b6001600160a01b038316610a215760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104c9565b6001600160a01b038216610a835760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104c9565b6001600160a01b03831660009081526020819052604090205481811015610afb5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104c9565b6001600160a01b0384811660008181526020818152604080832087870390559387168083529184902080548701905592518581529092600080516020611013833981519152910160405180910390a36109b7565b6000600080516020611053833981519152610b68610333565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c3f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104c9565b8060026000828254610c519190610f96565b90915550506001600160a01b03821660008181526020818152604080832080548601905551848152600080516020611013833981519152910160405180910390a35050565b6001600160a01b038216610cf65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104c9565b6001600160a01b03821660009081526020819052604090205481811015610d6a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104c9565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192916000805160206110138339815191529101610936565b600060208083528351808285015260005b81811015610ddb57858101830151858201604001528201610dbf565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610e1357600080fd5b919050565b60008060408385031215610e2b57600080fd5b610e3483610dfc565b946020939093013593505050565b600080600060608486031215610e5757600080fd5b610e6084610dfc565b9250610e6e60208501610dfc565b9150604084013590509250925092565b600060208284031215610e9057600080fd5b610e9982610dfc565b9392505050565b600080600080600080600060e0888a031215610ebb57600080fd5b610ec488610dfc565b9650610ed260208901610dfc565b95506040880135945060608801359350608088013560ff81168114610ef657600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f2657600080fd5b610f2f83610dfc565b9150610f3d60208401610dfc565b90509250929050565b600181811c90821680610f5a57607f821691505b602082108103610f7a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156103d9576103d9610f80565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b60006001820161100b5761100b610f80565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa26469706673582212203ea4a1224be7b5ef35dc397dfc81433d85cd6fdbf17d8b2e3d528071e7e612b564736f6c63430008140033501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4da2646970667358221220e5d45347a3bb440414fd70a860f95e13d1411d9be38220533035ce646e8a207b64736f6c63430008140033", + "bytecode": "0x608060405234801561001057600080fd5b50615336806100206000396000f3fe608060405260043610620001bb5760003560e01c806383f2440311620000f5578063ccaa2d111162000090578063ccaa2d11146200056b578063cd5865791462000590578063d02103ca14620005a7578063dbc1697614620005d0578063ee25560b14620005e8578063f5efcd791462000619578063f811bff7146200063e578063fb570834146200066357600080fd5b806383f2440314620004465780638ed7e3f2146200046b578063aaa13cc2146200048d578063b8b284d014620004b2578063bab161bf14620004d7578063be5831c714620004fb578063c00f14ab1462000521578063cc461632146200054657600080fd5b80633c351e1011620001665780633c351e1014620003125780633cbc795b14620003345780633e19704314620003705780634b2f336d14620003955780635ca1e16514620003b75780637843298b14620003cf57806379e2cf9714620003f457806381b1c174146200040c57600080fd5b806315064c9614620001c05780632072f6c514620001f157806322e95f2c146200020b578063240ff378146200023f57806327aef4e814620002565780632dfdf0b5146200027d578063318aee3d14620002a4575b600080fd5b348015620001cd57600080fd5b50606854620001dc9060ff1681565b60405190151581526020015b60405180910390f35b348015620001fe57600080fd5b506200020962000688565b005b3480156200021857600080fd5b50620002306200022a36600462002cd2565b620006c0565b604051620001e8919062002d0e565b620002096200025036600462002d7c565b62000713565b3480156200026357600080fd5b506200026e62000763565b604051620001e8919062002e53565b3480156200028a57600080fd5b506200029560535481565b604051908152602001620001e8565b348015620002b157600080fd5b50620002ed620002c336600462002e6f565b606b6020526000908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201620001e8565b3480156200031f57600080fd5b50606d5462000230906001600160a01b031681565b3480156200034157600080fd5b50606d546200035a90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001620001e8565b3480156200037d57600080fd5b50620002956200038f36600462002e9f565b620007f9565b348015620003a257600080fd5b50606f5462000230906001600160a01b031681565b348015620003c457600080fd5b506200029562000886565b348015620003dc57600080fd5b5062000230620003ee36600462002f29565b6200096c565b3480156200040157600080fd5b50620002096200099d565b3480156200041957600080fd5b50620002306200042b36600462002f79565b606a602052600090815260409020546001600160a01b031681565b3480156200045357600080fd5b50620002956200046536600462002fa6565b620009c1565b3480156200047857600080fd5b50606c5462000230906001600160a01b031681565b3480156200049a57600080fd5b5062000230620004ac366004620030c3565b62000aa5565b348015620004bf57600080fd5b5062000209620004d13660046200316b565b62000bb6565b348015620004e457600080fd5b506068546200035a90610100900463ffffffff1681565b3480156200050857600080fd5b506068546200035a90600160c81b900463ffffffff1681565b3480156200052e57600080fd5b506200026e6200054036600462002e6f565b62000c60565b3480156200055357600080fd5b50620001dc62000565366004620031f7565b62000cad565b3480156200057857600080fd5b50620002096200058a3660046200322f565b62000d3d565b62000209620005a13660046200332a565b6200127c565b348015620005b457600080fd5b506068546200023090600160281b90046001600160a01b031681565b348015620005dd57600080fd5b50620002096200170f565b348015620005f557600080fd5b50620002956200060736600462002f79565b60696020526000908152604090205481565b3480156200062657600080fd5b5062000209620006383660046200322f565b62001745565b3480156200064b57600080fd5b50620002096200065d366004620033cb565b620019fb565b3480156200067057600080fd5b50620001dc6200068236600462003482565b62001c85565b606c546001600160a01b03163314620006b457604051631736745960e31b815260040160405180910390fd5b620006be62001c9f565b565b6000606a60008484604051602001620006db929190620034cf565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b34158015906200072d5750606f546001600160a01b031615155b156200074c576040516301bd897160e61b815260040160405180910390fd5b6200075c85853486868662001cfc565b5050505050565b606e80546200077290620034f9565b80601f0160208091040260200160405190810160405280929190818152602001828054620007a090620034f9565b8015620007f15780601f10620007c557610100808354040283529160200191620007f1565b820191906000526020600020905b815481529060010190602001808311620007d357829003601f168201915b505050505081565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b605354600090819081805b602081101562000963578083901c600116600103620008f45760338160208110620008c057620008c062003535565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062000921565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806200095a9062003561565b91505062000891565b50919392505050565b60006200099584846200097f8562001dd0565b6200098a8662001e97565b620004ac8762001f55565b949350505050565b605354606854600160c81b900463ffffffff161015620006be57620006be62002016565b600083815b602081101562000a9c57600163ffffffff8516821c8116900362000a3857848160208110620009f957620009f962003535565b60200201358260405160200162000a1a929190918252602082015260400190565b60405160208183030381529060405280519060200120915062000a87565b8185826020811062000a4e5762000a4e62003535565b602002013560405160200162000a6e929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062000a938162003561565b915050620009c6565b50949350505050565b600080868660405160200162000abd929190620034cf565b604051602081830303815290604052805190602001209050600060ff60f81b30836040518060200162000af09062002c96565b601f1982820381018352601f90910116604081905262000b19908b908b908b906020016200357d565b60408051601f198184030181529082905262000b399291602001620035ba565b6040516020818303038152906040528051906020012060405160200162000b9294939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b606f546001600160a01b031662000be05760405163dde3cda760e01b815260040160405180910390fd5b606f54604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac9062000c149033908890600401620035ed565b600060405180830381600087803b15801562000c2f57600080fd5b505af115801562000c44573d6000803e3d6000fd5b5050505062000c5886868686868662001cfc565b505050505050565b606062000c6d8262001dd0565b62000c788362001e97565b62000c838462001f55565b60405160200162000c97939291906200357d565b6040516020818303038152906040529050919050565b6068546000908190610100900463ffffffff1615801562000cd4575063ffffffff83166001145b1562000ce8575063ffffffff831662000d13565b62000cfe600160201b63ffffffff851662003606565b62000d109063ffffffff861662003620565b90505b600881901c600090815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000d6257604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161462000d93576040516302caf51760e11b815260040160405180910390fd5b62000dcd8c8c8c8c8c62000dc760008e8e8e8e8e8e8e60405162000db992919062003636565b6040518091039020620007f9565b620020b4565b6001600160a01b03861662000f1357606f546001600160a01b031662000ea55760006001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000e27576020820181803683370190505b5060405162000e37919062003646565b60006040518083038185875af1925050503d806000811462000e76576040519150601f19603f3d011682016040523d82523d6000602084013e62000e7b565b606091505b505090508062000e9e57604051630ce8f45160e31b815260040160405180910390fd5b506200122d565b606f546040516340c10f1960e01b81526001600160a01b03909116906340c10f199062000ed99087908790600401620035ed565b600060405180830381600087803b15801562000ef457600080fd5b505af115801562000f09573d6000803e3d6000fd5b505050506200122d565b606d546001600160a01b03878116911614801562000f425750606d5463ffffffff888116600160a01b90920416145b1562000f5c5760006001600160a01b038516848262000dfc565b60685463ffffffff61010090910481169088160362000f915762000f8b6001600160a01b038716858562002225565b6200122d565b6000878760405160200162000fa8929190620034cf565b60408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b031680620011c5576000808062000ff18688018862003664565b9250925092506000858484846040516200100b9062002c96565b62001019939291906200357d565b8190604051809103906000f59050801580156200103a573d6000803e3d6000fd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f19906200106e908d908d90600401620035ed565b600060405180830381600087803b1580156200108957600080fd5b505af11580156200109e573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b604051620011b395949392919062003702565b60405180910390a1505050506200122a565b6040516340c10f1960e01b81526001600160a01b038216906340c10f1990620011f59089908990600401620035ed565b600060405180830381600087803b1580156200121057600080fd5b505af115801562001225573d6000803e3d6000fd5b505050505b50505b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8a88888787604051620012669594939291906200373d565b60405180910390a1505050505050505050505050565b60685460ff1615620012a157604051630bc011ff60e21b815260040160405180910390fd5b620012ab62002284565b60685463ffffffff610100909104811690881603620012dd576040516302caf51760e11b815260040160405180910390fd5b6000806060876001600160a01b038816620013ce57883414620013135760405163b89240f560e01b815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff169450906200134290620034f9565b80601f01602080910402602001604051908101604052809291908181526020018280546200137090620034f9565b8015620013c15780601f106200139557610100808354040283529160200191620013c1565b820191906000526020600020905b815481529060010190602001808311620013a357829003601f168201915b505050505091506200167a565b3415620013ee5760405163798ee6f160e01b815260040160405180910390fd5b606f546001600160a01b03908116908916036200146f57604051632770a7eb60e21b81526001600160a01b03891690639dc29fac90620014359033908d90600401620035ed565b600060405180830381600087803b1580156200145057600080fd5b505af115801562001465573d6000803e3d6000fd5b505050506200167a565b6001600160a01b038089166000908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b900490921691810182905290156200152d57604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac90620014e59033908e90600401620035ed565b600060405180830381600087803b1580156200150057600080fd5b505af115801562001515573d6000803e3d6000fd5b5050505080602001519450806000015193506200166b565b8515620015425762001542898b8989620022df565b6040516370a0823160e01b81526000906001600160a01b038b16906370a08231906200157390309060040162002d0e565b602060405180830381865afa15801562001591573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620015b791906200376f565b9050620015d06001600160a01b038b1633308e62002641565b6040516370a0823160e01b81526000906001600160a01b038c16906370a08231906200160190309060040162002d0e565b602060405180830381865afa1580156200161f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200164591906200376f565b905062001653828262003789565b6068548c9850610100900463ffffffff169650935050505b620016768962000c60565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e8688605354604051620016bc9897969594939291906200379f565b60405180910390a1620016e7620016e1600085878f8f878980519060200120620007f9565b6200267b565b8615620016f857620016f862002016565b505050506200170660018055565b50505050505050565b606c546001600160a01b031633146200173b57604051631736745960e31b815260040160405180910390fd5b620006be6200277a565b60685460ff16156200176a57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146200179b576040516302caf51760e11b815260040160405180910390fd5b620017c18c8c8c8c8c62000dc760018e8e8e8e8e8e8e60405162000db992919062003636565b606f546000906001600160a01b03166200188057846001600160a01b031684888a8686604051602401620017f994939291906200380c565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162001830919062003646565b60006040518083038185875af1925050503d80600081146200186f576040519150601f19603f3d011682016040523d82523d6000602084013e62001874565b606091505b5050809150506200198c565b606f546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990620018b49088908890600401620035ed565b600060405180830381600087803b158015620018cf57600080fd5b505af1158015620018e4573d6000803e3d6000fd5b50505050846001600160a01b0316878985856040516024016200190b94939291906200380c565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162001942919062003646565b6000604051808303816000865af19150503d806000811462001981576040519150601f19603f3d011682016040523d82523d6000602084013e62001986565b606091505b50909150505b80620019ab576040516337e391c360e01b815260040160405180910390fd5b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8b89898888604051620019e49594939291906200373d565b60405180910390a150505050505050505050505050565b600054610100900460ff161580801562001a1c5750600054600160ff909116105b8062001a385750303b15801562001a38575060005460ff166001145b62001aa15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562001ac5576000805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff8a160265010000000000600160c81b03191617600160281b6001600160a01b038781169190910291909117909155606c80546001600160a01b031916858316179055861662001b515763ffffffff85161562001b4b57604051630d43a60960e11b815260040160405180910390fd5b62001c2c565b606d805463ffffffff8716600160a01b026001600160c01b03199091166001600160a01b03891617179055606e62001b8a838262003893565b506000801b601260405162001b9f9062002c96565b6060808252600d908201526c2bb930b83832b21022ba3432b960991b608082015260a060208201819052600490820152630ae8aa8960e31b60c082015260ff909116604082015260e0018190604051809103906000f590508015801562001c0a573d6000803e3d6000fd5b50606f80546001600160a01b0319166001600160a01b03929092169190911790555b62001c36620027d3565b801562001706576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b60008162001c95868686620009c1565b1495945050505050565b60685460ff161562001cc457604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b60685463ffffffff61010090910481169087160362001d2e576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff1633898989888860535460405162001d84999897969594939291906200395f565b60405180910390a162001dbf620016e16001606860019054906101000a900463ffffffff16338a8a8a898960405162000db992919062003636565b821562000c585762000c5862002016565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009182916001600160a01b0386169162001e19919062003646565b600060405180830381855afa9150503d806000811462001e56576040519150601f19603f3d011682016040523d82523d6000602084013e62001e5b565b606091505b50915091508162001e8c57604051806040016040528060078152602001664e4f5f4e414d4560c81b81525062000995565b620009958162002807565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009182916001600160a01b0386169162001ee0919062003646565b600060405180830381855afa9150503d806000811462001f1d576040519150601f19603f3d011682016040523d82523d6000602084013e62001f22565b606091505b50915091508162001e8c57604051806040016040528060098152602001681393d7d4d6535093d360ba1b81525062000995565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b0386169162001f9d919062003646565b600060405180830381855afa9150503d806000811462001fda576040519150601f19603f3d011682016040523d82523d6000602084013e62001fdf565b606091505b509150915081801562001ff3575080516020145b6200200057601262000995565b80806020019051810190620009959190620039ce565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d6200205f62000886565b6040518263ffffffff1660e01b81526004016200207e91815260200190565b600060405180830381600087803b1580156200209957600080fd5b505af1158015620020ae573d6000803e3d6000fd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101206312bd9b1960e11b9092526064810191909152600091600160281b90046001600160a01b03169063257b3632906084016020604051808303816000875af11580156200212f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200215591906200376f565b9050806000036200217857604051622f6fad60e01b815260040160405180910390fd5b600080600160401b871615620021bd5786915062002199848a848962001c85565b620021b7576040516338105f3b60e21b815260040160405180910390fd5b6200220e565b602087901c620021cf816001620039ee565b9150879250620021ee620021e5868c86620009c1565b8a838962001c85565b6200220c576040516338105f3b60e21b815260040160405180910390fd5b505b6200221a8282620029b0565b505050505050505050565b6200227f8363a9059cbb60e01b848460405160240162002247929190620035ed565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262002a60565b505050565b600260015403620022d85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001a98565b6002600155565b6000620022f0600482848662003a15565b620022fb9162003a41565b9050632afa533160e01b6001600160e01b03198216016200249c5760008080808080806200232d896004818d62003a15565b8101906200233c919062003a72565b9650965096509650965096509650336001600160a01b0316876001600160a01b0316146200237d5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0386163014620023a75760405163750643af60e01b815260040160405180910390fd5b8a8514620023c8576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e169162002448919062003646565b6000604051808303816000865af19150503d806000811462002487576040519150601f19603f3d011682016040523d82523d6000602084013e6200248c565b606091505b505050505050505050506200075c565b6001600160e01b031981166323f2ebc360e21b14620024ce57604051637141605d60e11b815260040160405180910390fd5b600080808080808080620024e68a6004818e62003a15565b810190620024f5919062003acd565b97509750975097509750975097509750336001600160a01b0316886001600160a01b031614620025385760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0387163014620025625760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f1691620025eb919062003646565b6000604051808303816000865af19150503d80600081146200262a576040519150601f19603f3d011682016040523d82523d6000602084013e6200262f565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052620020ae9085906323b872dd60e01b9060840162002247565b8060016200268c6020600262003c56565b62002698919062003789565b60535410620026ba576040516377ae67b360e11b815260040160405180910390fd5b6000605360008154620026cd9062003561565b9182905550905060005b602081101562002769578082901c6001166001036200270f57826033826020811062002707576200270762003535565b015550505050565b6033816020811062002725576200272562003535565b015460408051602081019290925281018490526060016040516020818303038152906040528051906020012092508080620027609062003561565b915050620026d7565b506200227f62003c64565b60018055565b60685460ff166200279e57604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600054610100900460ff16620027fd5760405162461bcd60e51b815260040162001a989062003c7a565b620006be62002b39565b606060408251106200282957818060200190518101906200070d919062003cc5565b81516020036200297d5760005b60208110801562002869575082818151811062002857576200285762003535565b01602001516001600160f81b03191615155b156200288457806200287b8162003561565b91505062002836565b80600003620028bd5750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b6000816001600160401b03811115620028da57620028da62002fea565b6040519080825280601f01601f19166020018201604052801562002905576020820181803683370190505b50905060005b82811015620029755784818151811062002929576200292962003535565b602001015160f81c60f81b82828151811062002949576200294962003535565b60200101906001600160f81b031916908160001a905350806200296c8162003561565b9150506200290b565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b606854600090610100900463ffffffff16158015620029d5575063ffffffff82166001145b15620029e9575063ffffffff821662002a14565b620029ff600160201b63ffffffff841662003606565b62002a119063ffffffff851662003620565b90505b600881901c60008181526069602052604081208054600160ff861690811b918218928390559290919081831690036200170657604051630c8d9eab60e31b815260040160405180910390fd5b600062002ab7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031662002b639092919063ffffffff16565b8051909150156200227f578080602001905181019062002ad8919062003d44565b6200227f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162001a98565b600054610100900460ff16620027745760405162461bcd60e51b815260040162001a989062003c7a565b606062000995848460008585600080866001600160a01b0316858760405162002b8d919062003646565b60006040518083038185875af1925050503d806000811462002bcc576040519150601f19603f3d011682016040523d82523d6000602084013e62002bd1565b606091505b509150915062002be48783838762002bef565b979650505050505050565b6060831562002c6357825160000362002c5b576001600160a01b0385163b62002c5b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001a98565b508162000995565b62000995838381511562002c7a5781518083602001fd5b8060405162461bcd60e51b815260040162001a98919062002e53565b61159c8062003d6583390190565b803563ffffffff81168114620029ab57600080fd5b6001600160a01b038116811462002ccf57600080fd5b50565b6000806040838503121562002ce657600080fd5b62002cf18362002ca4565b9150602083013562002d038162002cb9565b809150509250929050565b6001600160a01b0391909116815260200190565b801515811462002ccf57600080fd5b60008083601f84011262002d4457600080fd5b5081356001600160401b0381111562002d5c57600080fd5b60208301915083602082850101111562002d7557600080fd5b9250929050565b60008060008060006080868803121562002d9557600080fd5b62002da08662002ca4565b9450602086013562002db28162002cb9565b9350604086013562002dc48162002d22565b925060608601356001600160401b0381111562002de057600080fd5b62002dee8882890162002d31565b969995985093965092949392505050565b60005b8381101562002e1c57818101518382015260200162002e02565b50506000910152565b6000815180845262002e3f81602086016020860162002dff565b601f01601f19169290920160200192915050565b60208152600062002e68602083018462002e25565b9392505050565b60006020828403121562002e8257600080fd5b813562002e688162002cb9565b60ff8116811462002ccf57600080fd5b600080600080600080600060e0888a03121562002ebb57600080fd5b873562002ec88162002e8f565b965062002ed86020890162002ca4565b9550604088013562002eea8162002cb9565b945062002efa6060890162002ca4565b9350608088013562002f0c8162002cb9565b9699959850939692959460a0840135945060c09093013592915050565b60008060006060848603121562002f3f57600080fd5b62002f4a8462002ca4565b9250602084013562002f5c8162002cb9565b9150604084013562002f6e8162002cb9565b809150509250925092565b60006020828403121562002f8c57600080fd5b5035919050565b8061040081018310156200070d57600080fd5b6000806000610440848603121562002fbd57600080fd5b8335925062002fd0856020860162002f93565b915062002fe1610420850162002ca4565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156200302b576200302b62002fea565b604052919050565b60006001600160401b038211156200304f576200304f62002fea565b50601f01601f191660200190565b6000620030746200306e8462003033565b62003000565b90508281528383830111156200308957600080fd5b828260208301376000602084830101529392505050565b600082601f830112620030b257600080fd5b62002e68838335602085016200305d565b600080600080600060a08688031215620030dc57600080fd5b620030e78662002ca4565b94506020860135620030f98162002cb9565b935060408601356001600160401b03808211156200311657600080fd5b6200312489838a01620030a0565b945060608801359150808211156200313b57600080fd5b506200314a88828901620030a0565b92505060808601356200315d8162002e8f565b809150509295509295909350565b60008060008060008060a087890312156200318557600080fd5b620031908762002ca4565b95506020870135620031a28162002cb9565b9450604087013593506060870135620031bb8162002d22565b925060808701356001600160401b03811115620031d757600080fd5b620031e589828a0162002d31565b979a9699509497509295939492505050565b600080604083850312156200320b57600080fd5b620032168362002ca4565b9150620032266020840162002ca4565b90509250929050565b6000806000806000806000806000806000806109208d8f0312156200325357600080fd5b6200325f8e8e62002f93565b9b50620032718e6104008f0162002f93565b9a506108008d013599506108208d013598506108408d013597506200329a6108608e0162002ca4565b9650620032ac6108808e013562002cb9565b6108808d01359550620032c36108a08e0162002ca4565b9450620032d56108c08e013562002cb9565b6108c08d013593506108e08d013592506001600160401b036109008e01351115620032ff57600080fd5b620033128e6109008f01358f0162002d31565b81935080925050509295989b509295989b509295989b565b600080600080600080600060c0888a0312156200334657600080fd5b620033518862002ca4565b96506020880135620033638162002cb9565b95506040880135945060608801356200337c8162002cb9565b935060808801356200338e8162002d22565b925060a08801356001600160401b03811115620033aa57600080fd5b620033b88a828b0162002d31565b989b979a50959850939692959293505050565b60008060008060008060c08789031215620033e557600080fd5b620033f08762002ca4565b95506020870135620034028162002cb9565b9450620034126040880162002ca4565b93506060870135620034248162002cb9565b92506080870135620034368162002cb9565b915060a08701356001600160401b038111156200345257600080fd5b8701601f810189136200346457600080fd5b62003475898235602084016200305d565b9150509295509295509295565b60008060008061046085870312156200349a57600080fd5b84359350620034ad866020870162002f93565b9250620034be610420860162002ca4565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b600181811c908216806200350e57607f821691505b6020821081036200352f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016200357657620035766200354b565b5060010190565b60608152600062003592606083018662002e25565b8281036020840152620035a6818662002e25565b91505060ff83166040830152949350505050565b60008351620035ce81846020880162002dff565b835190830190620035e481836020880162002dff565b01949350505050565b6001600160a01b03929092168252602082015260400190565b80820281158282048414176200070d576200070d6200354b565b808201808211156200070d576200070d6200354b565b8183823760009101908152919050565b600082516200365a81846020870162002dff565b9190910192915050565b6000806000606084860312156200367a57600080fd5b83356001600160401b03808211156200369257600080fd5b620036a087838801620030a0565b94506020860135915080821115620036b757600080fd5b50620036c686828701620030a0565b925050604084013562002f6e8162002e8f565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b63ffffffff861681526001600160a01b0385811660208301528416604082015260806060820181905260009062002be49083018486620036d9565b94855263ffffffff9390931660208501526001600160a01b039182166040850152166060830152608082015260a00190565b6000602082840312156200378257600080fd5b5051919050565b818103818111156200070d576200070d6200354b565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c08301819052600091620037f38483018762002e25565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff841660208201526060604082018190526000906200383f9083018486620036d9565b9695505050505050565b601f8211156200227f57600081815260208120601f850160051c81016020861015620038725750805b601f850160051c820191505b8181101562000c58578281556001016200387e565b81516001600160401b03811115620038af57620038af62002fea565b620038c781620038c08454620034f9565b8462003849565b602080601f831160018114620038ff5760008415620038e65750858301515b600019600386901b1c1916600185901b17855562000c58565b600085815260208120601f198616915b8281101562003930578886015182559484019460019091019084016200390f565b50858210156200394f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c08301819052600091620039b48483018789620036d9565b925080851660e085015250509a9950505050505050505050565b600060208284031215620039e157600080fd5b815162002e688162002e8f565b63ffffffff81811683821601908082111562003a0e5762003a0e6200354b565b5092915050565b6000808585111562003a2657600080fd5b8386111562003a3457600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101562003a6a5780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a03121562003a8e57600080fd5b873562003a9b8162002cb9565b9650602088013562003aad8162002cb9565b95506040880135945060608801359350608088013562002f0c8162002e8f565b600080600080600080600080610100898b03121562003aeb57600080fd5b883562003af88162002cb9565b9750602089013562003b0a8162002cb9565b96506040890135955060608901359450608089013562003b2a8162002d22565b935060a089013562003b3c8162002e8f565b979a969950949793969295929450505060c08201359160e0013590565b600181815b8085111562003b9a57816000190482111562003b7e5762003b7e6200354b565b8085161562003b8c57918102915b93841c939080029062003b5e565b509250929050565b60008262003bb3575060016200070d565b8162003bc2575060006200070d565b816001811462003bdb576002811462003be65762003c06565b60019150506200070d565b60ff84111562003bfa5762003bfa6200354b565b50506001821b6200070d565b5060208310610133831016604e8410600b841016171562003c2b575081810a6200070d565b62003c37838362003b59565b806000190482111562003c4e5762003c4e6200354b565b029392505050565b600062002e68838362003ba2565b634e487b7160e01b600052600160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60006020828403121562003cd857600080fd5b81516001600160401b0381111562003cef57600080fd5b8201601f8101841362003d0157600080fd5b805162003d126200306e8262003033565b81815285602083850101111562003d2857600080fd5b62003d3b82602083016020860162002dff565b95945050505050565b60006020828403121562003d5757600080fd5b815162002e688162002d2256fe6101006040523480156200001257600080fd5b506040516200159c3803806200159c83398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516110e0620004bc60003960006101f70152600081816102ba015281816104e0015261054e0152600061049101526000818161031f015261045b01526110e06000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063a457c2d71161007c578063a457c2d7146102f4578063a9059cbb14610307578063cd0d00961461031a578063d505accf14610341578063dd62ed3e14610354578063ffa1ad741461036757600080fd5b806370a08231146102515780637ecebe001461027a57806395d89b411461029a5780639dc29fac146102a2578063a3c573eb146102b557600080fd5b806330adf81f116100ff57806330adf81f146101c9578063313ce567146101f05780633644e51514610221578063395093511461022957806340c10f191461023c57600080fd5b806306fdde031461013c578063095ea7b31461015a57806318160ddd1461017d57806320606b701461018f57806323b872dd146101b6575b600080fd5b610144610387565b6040516101519190610e26565b60405180910390f35b61016d610168366004610e90565b610419565b6040519015158152602001610151565b6002545b604051908152602001610151565b6101817f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b61016d6101c4366004610eba565b610433565b6101817f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610151565b610181610457565b61016d610237366004610e90565b6104b3565b61024f61024a366004610e90565b6104d5565b005b61018161025f366004610ef6565b6001600160a01b031660009081526020819052604090205490565b610181610288366004610ef6565b60056020526000908152604090205481565b610144610534565b61024f6102b0366004610e90565b610543565b6102dc7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610151565b61016d610302366004610e90565b610595565b61016d610315366004610e90565b610610565b6101817f000000000000000000000000000000000000000000000000000000000000000081565b61024f61034f366004610f18565b61061e565b610181610362366004610f8b565b610859565b610144604051806040016040528060018152602001603160f81b81525081565b60606003805461039690610fbe565b80601f01602080910402602001604051908101604052809291908181526020018280546103c290610fbe565b801561040f5780601f106103e45761010080835404028352916020019161040f565b820191906000526020600020905b8154815290600101906020018083116103f257829003601f168201915b5050505050905090565b600033610427818585610884565b60019150505b92915050565b6000336104418582856109a9565b61044c858585610a23565b506001949350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461461048e5761048946610bb5565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000336104278185856104c68383610859565b6104d0919061100e565b610884565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105265760405162461bcd60e51b815260040161051d90611021565b60405180910390fd5b6105308282610c61565b5050565b60606004805461039690610fbe565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461058b5760405162461bcd60e51b815260040161051d90611021565b6105308282610d0e565b600033816105a38286610859565b9050838110156106035760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161051d565b61044c8286868403610884565b600033610427818585610a23565b8342111561067a5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b606482015260840161051d565b6001600160a01b038716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866106c783611071565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610725610457565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156107b0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906107e65750896001600160a01b0316816001600160a01b0316145b6108425760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b606482015260840161051d565b61084d8a8a8a610884565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166108e65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161051d565b6001600160a01b0382166109475760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161051d565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006109b58484610859565b90506000198114610a1d5781811015610a105760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161051d565b610a1d8484848403610884565b50505050565b6001600160a01b038316610a875760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161051d565b6001600160a01b038216610ae95760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161051d565b6001600160a01b03831660009081526020819052604090205481811015610b615760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161051d565b6001600160a01b038481166000818152602081815260408083208787039055938716808352918490208054870190559251858152909260008051602061108b833981519152910160405180910390a3610a1d565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610be0610387565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610cb75760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161051d565b8060026000828254610cc9919061100e565b90915550506001600160a01b0382166000818152602081815260408083208054860190555184815260008051602061108b833981519152910160405180910390a35050565b6001600160a01b038216610d6e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161051d565b6001600160a01b03821660009081526020819052604090205481811015610de25760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161051d565b6001600160a01b03831660008181526020818152604080832086860390556002805487900390555185815291929160008051602061108b833981519152910161099c565b600060208083528351808285015260005b81811015610e5357858101830151858201604001528201610e37565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610e8b57600080fd5b919050565b60008060408385031215610ea357600080fd5b610eac83610e74565b946020939093013593505050565b600080600060608486031215610ecf57600080fd5b610ed884610e74565b9250610ee660208501610e74565b9150604084013590509250925092565b600060208284031215610f0857600080fd5b610f1182610e74565b9392505050565b600080600080600080600060e0888a031215610f3357600080fd5b610f3c88610e74565b9650610f4a60208901610e74565b95506040880135945060608801359350608088013560ff81168114610f6e57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f9e57600080fd5b610fa783610e74565b9150610fb560208401610e74565b90509250929050565b600181811c90821680610fd257607f821691505b602082108103610ff257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561042d5761042d610ff8565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b60006001820161108357611083610ff8565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122041a613df402940120c0c7421c7d02599c9a28987dd403c01cd013411ae6d388964736f6c63430008140033a2646970667358221220057cd6dd4071fe6d2141a3112622ff43f32081877651a41339de10801839d29064736f6c63430008140033", + "deployedBytecode": "0x608060405260043610620001bb5760003560e01c806383f2440311620000f5578063ccaa2d111162000090578063ccaa2d11146200056b578063cd5865791462000590578063d02103ca14620005a7578063dbc1697614620005d0578063ee25560b14620005e8578063f5efcd791462000619578063f811bff7146200063e578063fb570834146200066357600080fd5b806383f2440314620004465780638ed7e3f2146200046b578063aaa13cc2146200048d578063b8b284d014620004b2578063bab161bf14620004d7578063be5831c714620004fb578063c00f14ab1462000521578063cc461632146200054657600080fd5b80633c351e1011620001665780633c351e1014620003125780633cbc795b14620003345780633e19704314620003705780634b2f336d14620003955780635ca1e16514620003b75780637843298b14620003cf57806379e2cf9714620003f457806381b1c174146200040c57600080fd5b806315064c9614620001c05780632072f6c514620001f157806322e95f2c146200020b578063240ff378146200023f57806327aef4e814620002565780632dfdf0b5146200027d578063318aee3d14620002a4575b600080fd5b348015620001cd57600080fd5b50606854620001dc9060ff1681565b60405190151581526020015b60405180910390f35b348015620001fe57600080fd5b506200020962000688565b005b3480156200021857600080fd5b50620002306200022a36600462002cd2565b620006c0565b604051620001e8919062002d0e565b620002096200025036600462002d7c565b62000713565b3480156200026357600080fd5b506200026e62000763565b604051620001e8919062002e53565b3480156200028a57600080fd5b506200029560535481565b604051908152602001620001e8565b348015620002b157600080fd5b50620002ed620002c336600462002e6f565b606b6020526000908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201620001e8565b3480156200031f57600080fd5b50606d5462000230906001600160a01b031681565b3480156200034157600080fd5b50606d546200035a90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001620001e8565b3480156200037d57600080fd5b50620002956200038f36600462002e9f565b620007f9565b348015620003a257600080fd5b50606f5462000230906001600160a01b031681565b348015620003c457600080fd5b506200029562000886565b348015620003dc57600080fd5b5062000230620003ee36600462002f29565b6200096c565b3480156200040157600080fd5b50620002096200099d565b3480156200041957600080fd5b50620002306200042b36600462002f79565b606a602052600090815260409020546001600160a01b031681565b3480156200045357600080fd5b50620002956200046536600462002fa6565b620009c1565b3480156200047857600080fd5b50606c5462000230906001600160a01b031681565b3480156200049a57600080fd5b5062000230620004ac366004620030c3565b62000aa5565b348015620004bf57600080fd5b5062000209620004d13660046200316b565b62000bb6565b348015620004e457600080fd5b506068546200035a90610100900463ffffffff1681565b3480156200050857600080fd5b506068546200035a90600160c81b900463ffffffff1681565b3480156200052e57600080fd5b506200026e6200054036600462002e6f565b62000c60565b3480156200055357600080fd5b50620001dc62000565366004620031f7565b62000cad565b3480156200057857600080fd5b50620002096200058a3660046200322f565b62000d3d565b62000209620005a13660046200332a565b6200127c565b348015620005b457600080fd5b506068546200023090600160281b90046001600160a01b031681565b348015620005dd57600080fd5b50620002096200170f565b348015620005f557600080fd5b50620002956200060736600462002f79565b60696020526000908152604090205481565b3480156200062657600080fd5b5062000209620006383660046200322f565b62001745565b3480156200064b57600080fd5b50620002096200065d366004620033cb565b620019fb565b3480156200067057600080fd5b50620001dc6200068236600462003482565b62001c85565b606c546001600160a01b03163314620006b457604051631736745960e31b815260040160405180910390fd5b620006be62001c9f565b565b6000606a60008484604051602001620006db929190620034cf565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b34158015906200072d5750606f546001600160a01b031615155b156200074c576040516301bd897160e61b815260040160405180910390fd5b6200075c85853486868662001cfc565b5050505050565b606e80546200077290620034f9565b80601f0160208091040260200160405190810160405280929190818152602001828054620007a090620034f9565b8015620007f15780601f10620007c557610100808354040283529160200191620007f1565b820191906000526020600020905b815481529060010190602001808311620007d357829003601f168201915b505050505081565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b605354600090819081805b602081101562000963578083901c600116600103620008f45760338160208110620008c057620008c062003535565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062000921565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806200095a9062003561565b91505062000891565b50919392505050565b60006200099584846200097f8562001dd0565b6200098a8662001e97565b620004ac8762001f55565b949350505050565b605354606854600160c81b900463ffffffff161015620006be57620006be62002016565b600083815b602081101562000a9c57600163ffffffff8516821c8116900362000a3857848160208110620009f957620009f962003535565b60200201358260405160200162000a1a929190918252602082015260400190565b60405160208183030381529060405280519060200120915062000a87565b8185826020811062000a4e5762000a4e62003535565b602002013560405160200162000a6e929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062000a938162003561565b915050620009c6565b50949350505050565b600080868660405160200162000abd929190620034cf565b604051602081830303815290604052805190602001209050600060ff60f81b30836040518060200162000af09062002c96565b601f1982820381018352601f90910116604081905262000b19908b908b908b906020016200357d565b60408051601f198184030181529082905262000b399291602001620035ba565b6040516020818303038152906040528051906020012060405160200162000b9294939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b606f546001600160a01b031662000be05760405163dde3cda760e01b815260040160405180910390fd5b606f54604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac9062000c149033908890600401620035ed565b600060405180830381600087803b15801562000c2f57600080fd5b505af115801562000c44573d6000803e3d6000fd5b5050505062000c5886868686868662001cfc565b505050505050565b606062000c6d8262001dd0565b62000c788362001e97565b62000c838462001f55565b60405160200162000c97939291906200357d565b6040516020818303038152906040529050919050565b6068546000908190610100900463ffffffff1615801562000cd4575063ffffffff83166001145b1562000ce8575063ffffffff831662000d13565b62000cfe600160201b63ffffffff851662003606565b62000d109063ffffffff861662003620565b90505b600881901c600090815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000d6257604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161462000d93576040516302caf51760e11b815260040160405180910390fd5b62000dcd8c8c8c8c8c62000dc760008e8e8e8e8e8e8e60405162000db992919062003636565b6040518091039020620007f9565b620020b4565b6001600160a01b03861662000f1357606f546001600160a01b031662000ea55760006001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000e27576020820181803683370190505b5060405162000e37919062003646565b60006040518083038185875af1925050503d806000811462000e76576040519150601f19603f3d011682016040523d82523d6000602084013e62000e7b565b606091505b505090508062000e9e57604051630ce8f45160e31b815260040160405180910390fd5b506200122d565b606f546040516340c10f1960e01b81526001600160a01b03909116906340c10f199062000ed99087908790600401620035ed565b600060405180830381600087803b15801562000ef457600080fd5b505af115801562000f09573d6000803e3d6000fd5b505050506200122d565b606d546001600160a01b03878116911614801562000f425750606d5463ffffffff888116600160a01b90920416145b1562000f5c5760006001600160a01b038516848262000dfc565b60685463ffffffff61010090910481169088160362000f915762000f8b6001600160a01b038716858562002225565b6200122d565b6000878760405160200162000fa8929190620034cf565b60408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b031680620011c5576000808062000ff18688018862003664565b9250925092506000858484846040516200100b9062002c96565b62001019939291906200357d565b8190604051809103906000f59050801580156200103a573d6000803e3d6000fd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f19906200106e908d908d90600401620035ed565b600060405180830381600087803b1580156200108957600080fd5b505af11580156200109e573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b604051620011b395949392919062003702565b60405180910390a1505050506200122a565b6040516340c10f1960e01b81526001600160a01b038216906340c10f1990620011f59089908990600401620035ed565b600060405180830381600087803b1580156200121057600080fd5b505af115801562001225573d6000803e3d6000fd5b505050505b50505b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8a88888787604051620012669594939291906200373d565b60405180910390a1505050505050505050505050565b60685460ff1615620012a157604051630bc011ff60e21b815260040160405180910390fd5b620012ab62002284565b60685463ffffffff610100909104811690881603620012dd576040516302caf51760e11b815260040160405180910390fd5b6000806060876001600160a01b038816620013ce57883414620013135760405163b89240f560e01b815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff169450906200134290620034f9565b80601f01602080910402602001604051908101604052809291908181526020018280546200137090620034f9565b8015620013c15780601f106200139557610100808354040283529160200191620013c1565b820191906000526020600020905b815481529060010190602001808311620013a357829003601f168201915b505050505091506200167a565b3415620013ee5760405163798ee6f160e01b815260040160405180910390fd5b606f546001600160a01b03908116908916036200146f57604051632770a7eb60e21b81526001600160a01b03891690639dc29fac90620014359033908d90600401620035ed565b600060405180830381600087803b1580156200145057600080fd5b505af115801562001465573d6000803e3d6000fd5b505050506200167a565b6001600160a01b038089166000908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b900490921691810182905290156200152d57604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac90620014e59033908e90600401620035ed565b600060405180830381600087803b1580156200150057600080fd5b505af115801562001515573d6000803e3d6000fd5b5050505080602001519450806000015193506200166b565b8515620015425762001542898b8989620022df565b6040516370a0823160e01b81526000906001600160a01b038b16906370a08231906200157390309060040162002d0e565b602060405180830381865afa15801562001591573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620015b791906200376f565b9050620015d06001600160a01b038b1633308e62002641565b6040516370a0823160e01b81526000906001600160a01b038c16906370a08231906200160190309060040162002d0e565b602060405180830381865afa1580156200161f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200164591906200376f565b905062001653828262003789565b6068548c9850610100900463ffffffff169650935050505b620016768962000c60565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e8688605354604051620016bc9897969594939291906200379f565b60405180910390a1620016e7620016e1600085878f8f878980519060200120620007f9565b6200267b565b8615620016f857620016f862002016565b505050506200170660018055565b50505050505050565b606c546001600160a01b031633146200173b57604051631736745960e31b815260040160405180910390fd5b620006be6200277a565b60685460ff16156200176a57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146200179b576040516302caf51760e11b815260040160405180910390fd5b620017c18c8c8c8c8c62000dc760018e8e8e8e8e8e8e60405162000db992919062003636565b606f546000906001600160a01b03166200188057846001600160a01b031684888a8686604051602401620017f994939291906200380c565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162001830919062003646565b60006040518083038185875af1925050503d80600081146200186f576040519150601f19603f3d011682016040523d82523d6000602084013e62001874565b606091505b5050809150506200198c565b606f546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990620018b49088908890600401620035ed565b600060405180830381600087803b158015620018cf57600080fd5b505af1158015620018e4573d6000803e3d6000fd5b50505050846001600160a01b0316878985856040516024016200190b94939291906200380c565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162001942919062003646565b6000604051808303816000865af19150503d806000811462001981576040519150601f19603f3d011682016040523d82523d6000602084013e62001986565b606091505b50909150505b80620019ab576040516337e391c360e01b815260040160405180910390fd5b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8b89898888604051620019e49594939291906200373d565b60405180910390a150505050505050505050505050565b600054610100900460ff161580801562001a1c5750600054600160ff909116105b8062001a385750303b15801562001a38575060005460ff166001145b62001aa15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562001ac5576000805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff8a160265010000000000600160c81b03191617600160281b6001600160a01b038781169190910291909117909155606c80546001600160a01b031916858316179055861662001b515763ffffffff85161562001b4b57604051630d43a60960e11b815260040160405180910390fd5b62001c2c565b606d805463ffffffff8716600160a01b026001600160c01b03199091166001600160a01b03891617179055606e62001b8a838262003893565b506000801b601260405162001b9f9062002c96565b6060808252600d908201526c2bb930b83832b21022ba3432b960991b608082015260a060208201819052600490820152630ae8aa8960e31b60c082015260ff909116604082015260e0018190604051809103906000f590508015801562001c0a573d6000803e3d6000fd5b50606f80546001600160a01b0319166001600160a01b03929092169190911790555b62001c36620027d3565b801562001706576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b60008162001c95868686620009c1565b1495945050505050565b60685460ff161562001cc457604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b60685463ffffffff61010090910481169087160362001d2e576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff1633898989888860535460405162001d84999897969594939291906200395f565b60405180910390a162001dbf620016e16001606860019054906101000a900463ffffffff16338a8a8a898960405162000db992919062003636565b821562000c585762000c5862002016565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009182916001600160a01b0386169162001e19919062003646565b600060405180830381855afa9150503d806000811462001e56576040519150601f19603f3d011682016040523d82523d6000602084013e62001e5b565b606091505b50915091508162001e8c57604051806040016040528060078152602001664e4f5f4e414d4560c81b81525062000995565b620009958162002807565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009182916001600160a01b0386169162001ee0919062003646565b600060405180830381855afa9150503d806000811462001f1d576040519150601f19603f3d011682016040523d82523d6000602084013e62001f22565b606091505b50915091508162001e8c57604051806040016040528060098152602001681393d7d4d6535093d360ba1b81525062000995565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b0386169162001f9d919062003646565b600060405180830381855afa9150503d806000811462001fda576040519150601f19603f3d011682016040523d82523d6000602084013e62001fdf565b606091505b509150915081801562001ff3575080516020145b6200200057601262000995565b80806020019051810190620009959190620039ce565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d6200205f62000886565b6040518263ffffffff1660e01b81526004016200207e91815260200190565b600060405180830381600087803b1580156200209957600080fd5b505af1158015620020ae573d6000803e3d6000fd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101206312bd9b1960e11b9092526064810191909152600091600160281b90046001600160a01b03169063257b3632906084016020604051808303816000875af11580156200212f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200215591906200376f565b9050806000036200217857604051622f6fad60e01b815260040160405180910390fd5b600080600160401b871615620021bd5786915062002199848a848962001c85565b620021b7576040516338105f3b60e21b815260040160405180910390fd5b6200220e565b602087901c620021cf816001620039ee565b9150879250620021ee620021e5868c86620009c1565b8a838962001c85565b6200220c576040516338105f3b60e21b815260040160405180910390fd5b505b6200221a8282620029b0565b505050505050505050565b6200227f8363a9059cbb60e01b848460405160240162002247929190620035ed565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262002a60565b505050565b600260015403620022d85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001a98565b6002600155565b6000620022f0600482848662003a15565b620022fb9162003a41565b9050632afa533160e01b6001600160e01b03198216016200249c5760008080808080806200232d896004818d62003a15565b8101906200233c919062003a72565b9650965096509650965096509650336001600160a01b0316876001600160a01b0316146200237d5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0386163014620023a75760405163750643af60e01b815260040160405180910390fd5b8a8514620023c8576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e169162002448919062003646565b6000604051808303816000865af19150503d806000811462002487576040519150601f19603f3d011682016040523d82523d6000602084013e6200248c565b606091505b505050505050505050506200075c565b6001600160e01b031981166323f2ebc360e21b14620024ce57604051637141605d60e11b815260040160405180910390fd5b600080808080808080620024e68a6004818e62003a15565b810190620024f5919062003acd565b97509750975097509750975097509750336001600160a01b0316886001600160a01b031614620025385760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0387163014620025625760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f1691620025eb919062003646565b6000604051808303816000865af19150503d80600081146200262a576040519150601f19603f3d011682016040523d82523d6000602084013e6200262f565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052620020ae9085906323b872dd60e01b9060840162002247565b8060016200268c6020600262003c56565b62002698919062003789565b60535410620026ba576040516377ae67b360e11b815260040160405180910390fd5b6000605360008154620026cd9062003561565b9182905550905060005b602081101562002769578082901c6001166001036200270f57826033826020811062002707576200270762003535565b015550505050565b6033816020811062002725576200272562003535565b015460408051602081019290925281018490526060016040516020818303038152906040528051906020012092508080620027609062003561565b915050620026d7565b506200227f62003c64565b60018055565b60685460ff166200279e57604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600054610100900460ff16620027fd5760405162461bcd60e51b815260040162001a989062003c7a565b620006be62002b39565b606060408251106200282957818060200190518101906200070d919062003cc5565b81516020036200297d5760005b60208110801562002869575082818151811062002857576200285762003535565b01602001516001600160f81b03191615155b156200288457806200287b8162003561565b91505062002836565b80600003620028bd5750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b6000816001600160401b03811115620028da57620028da62002fea565b6040519080825280601f01601f19166020018201604052801562002905576020820181803683370190505b50905060005b82811015620029755784818151811062002929576200292962003535565b602001015160f81c60f81b82828151811062002949576200294962003535565b60200101906001600160f81b031916908160001a905350806200296c8162003561565b9150506200290b565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b606854600090610100900463ffffffff16158015620029d5575063ffffffff82166001145b15620029e9575063ffffffff821662002a14565b620029ff600160201b63ffffffff841662003606565b62002a119063ffffffff851662003620565b90505b600881901c60008181526069602052604081208054600160ff861690811b918218928390559290919081831690036200170657604051630c8d9eab60e31b815260040160405180910390fd5b600062002ab7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031662002b639092919063ffffffff16565b8051909150156200227f578080602001905181019062002ad8919062003d44565b6200227f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162001a98565b600054610100900460ff16620027745760405162461bcd60e51b815260040162001a989062003c7a565b606062000995848460008585600080866001600160a01b0316858760405162002b8d919062003646565b60006040518083038185875af1925050503d806000811462002bcc576040519150601f19603f3d011682016040523d82523d6000602084013e62002bd1565b606091505b509150915062002be48783838762002bef565b979650505050505050565b6060831562002c6357825160000362002c5b576001600160a01b0385163b62002c5b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001a98565b508162000995565b62000995838381511562002c7a5781518083602001fd5b8060405162461bcd60e51b815260040162001a98919062002e53565b61159c8062003d6583390190565b803563ffffffff81168114620029ab57600080fd5b6001600160a01b038116811462002ccf57600080fd5b50565b6000806040838503121562002ce657600080fd5b62002cf18362002ca4565b9150602083013562002d038162002cb9565b809150509250929050565b6001600160a01b0391909116815260200190565b801515811462002ccf57600080fd5b60008083601f84011262002d4457600080fd5b5081356001600160401b0381111562002d5c57600080fd5b60208301915083602082850101111562002d7557600080fd5b9250929050565b60008060008060006080868803121562002d9557600080fd5b62002da08662002ca4565b9450602086013562002db28162002cb9565b9350604086013562002dc48162002d22565b925060608601356001600160401b0381111562002de057600080fd5b62002dee8882890162002d31565b969995985093965092949392505050565b60005b8381101562002e1c57818101518382015260200162002e02565b50506000910152565b6000815180845262002e3f81602086016020860162002dff565b601f01601f19169290920160200192915050565b60208152600062002e68602083018462002e25565b9392505050565b60006020828403121562002e8257600080fd5b813562002e688162002cb9565b60ff8116811462002ccf57600080fd5b600080600080600080600060e0888a03121562002ebb57600080fd5b873562002ec88162002e8f565b965062002ed86020890162002ca4565b9550604088013562002eea8162002cb9565b945062002efa6060890162002ca4565b9350608088013562002f0c8162002cb9565b9699959850939692959460a0840135945060c09093013592915050565b60008060006060848603121562002f3f57600080fd5b62002f4a8462002ca4565b9250602084013562002f5c8162002cb9565b9150604084013562002f6e8162002cb9565b809150509250925092565b60006020828403121562002f8c57600080fd5b5035919050565b8061040081018310156200070d57600080fd5b6000806000610440848603121562002fbd57600080fd5b8335925062002fd0856020860162002f93565b915062002fe1610420850162002ca4565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156200302b576200302b62002fea565b604052919050565b60006001600160401b038211156200304f576200304f62002fea565b50601f01601f191660200190565b6000620030746200306e8462003033565b62003000565b90508281528383830111156200308957600080fd5b828260208301376000602084830101529392505050565b600082601f830112620030b257600080fd5b62002e68838335602085016200305d565b600080600080600060a08688031215620030dc57600080fd5b620030e78662002ca4565b94506020860135620030f98162002cb9565b935060408601356001600160401b03808211156200311657600080fd5b6200312489838a01620030a0565b945060608801359150808211156200313b57600080fd5b506200314a88828901620030a0565b92505060808601356200315d8162002e8f565b809150509295509295909350565b60008060008060008060a087890312156200318557600080fd5b620031908762002ca4565b95506020870135620031a28162002cb9565b9450604087013593506060870135620031bb8162002d22565b925060808701356001600160401b03811115620031d757600080fd5b620031e589828a0162002d31565b979a9699509497509295939492505050565b600080604083850312156200320b57600080fd5b620032168362002ca4565b9150620032266020840162002ca4565b90509250929050565b6000806000806000806000806000806000806109208d8f0312156200325357600080fd5b6200325f8e8e62002f93565b9b50620032718e6104008f0162002f93565b9a506108008d013599506108208d013598506108408d013597506200329a6108608e0162002ca4565b9650620032ac6108808e013562002cb9565b6108808d01359550620032c36108a08e0162002ca4565b9450620032d56108c08e013562002cb9565b6108c08d013593506108e08d013592506001600160401b036109008e01351115620032ff57600080fd5b620033128e6109008f01358f0162002d31565b81935080925050509295989b509295989b509295989b565b600080600080600080600060c0888a0312156200334657600080fd5b620033518862002ca4565b96506020880135620033638162002cb9565b95506040880135945060608801356200337c8162002cb9565b935060808801356200338e8162002d22565b925060a08801356001600160401b03811115620033aa57600080fd5b620033b88a828b0162002d31565b989b979a50959850939692959293505050565b60008060008060008060c08789031215620033e557600080fd5b620033f08762002ca4565b95506020870135620034028162002cb9565b9450620034126040880162002ca4565b93506060870135620034248162002cb9565b92506080870135620034368162002cb9565b915060a08701356001600160401b038111156200345257600080fd5b8701601f810189136200346457600080fd5b62003475898235602084016200305d565b9150509295509295509295565b60008060008061046085870312156200349a57600080fd5b84359350620034ad866020870162002f93565b9250620034be610420860162002ca4565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b600181811c908216806200350e57607f821691505b6020821081036200352f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016200357657620035766200354b565b5060010190565b60608152600062003592606083018662002e25565b8281036020840152620035a6818662002e25565b91505060ff83166040830152949350505050565b60008351620035ce81846020880162002dff565b835190830190620035e481836020880162002dff565b01949350505050565b6001600160a01b03929092168252602082015260400190565b80820281158282048414176200070d576200070d6200354b565b808201808211156200070d576200070d6200354b565b8183823760009101908152919050565b600082516200365a81846020870162002dff565b9190910192915050565b6000806000606084860312156200367a57600080fd5b83356001600160401b03808211156200369257600080fd5b620036a087838801620030a0565b94506020860135915080821115620036b757600080fd5b50620036c686828701620030a0565b925050604084013562002f6e8162002e8f565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b63ffffffff861681526001600160a01b0385811660208301528416604082015260806060820181905260009062002be49083018486620036d9565b94855263ffffffff9390931660208501526001600160a01b039182166040850152166060830152608082015260a00190565b6000602082840312156200378257600080fd5b5051919050565b818103818111156200070d576200070d6200354b565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c08301819052600091620037f38483018762002e25565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff841660208201526060604082018190526000906200383f9083018486620036d9565b9695505050505050565b601f8211156200227f57600081815260208120601f850160051c81016020861015620038725750805b601f850160051c820191505b8181101562000c58578281556001016200387e565b81516001600160401b03811115620038af57620038af62002fea565b620038c781620038c08454620034f9565b8462003849565b602080601f831160018114620038ff5760008415620038e65750858301515b600019600386901b1c1916600185901b17855562000c58565b600085815260208120601f198616915b8281101562003930578886015182559484019460019091019084016200390f565b50858210156200394f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c08301819052600091620039b48483018789620036d9565b925080851660e085015250509a9950505050505050505050565b600060208284031215620039e157600080fd5b815162002e688162002e8f565b63ffffffff81811683821601908082111562003a0e5762003a0e6200354b565b5092915050565b6000808585111562003a2657600080fd5b8386111562003a3457600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101562003a6a5780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a03121562003a8e57600080fd5b873562003a9b8162002cb9565b9650602088013562003aad8162002cb9565b95506040880135945060608801359350608088013562002f0c8162002e8f565b600080600080600080600080610100898b03121562003aeb57600080fd5b883562003af88162002cb9565b9750602089013562003b0a8162002cb9565b96506040890135955060608901359450608089013562003b2a8162002d22565b935060a089013562003b3c8162002e8f565b979a969950949793969295929450505060c08201359160e0013590565b600181815b8085111562003b9a57816000190482111562003b7e5762003b7e6200354b565b8085161562003b8c57918102915b93841c939080029062003b5e565b509250929050565b60008262003bb3575060016200070d565b8162003bc2575060006200070d565b816001811462003bdb576002811462003be65762003c06565b60019150506200070d565b60ff84111562003bfa5762003bfa6200354b565b50506001821b6200070d565b5060208310610133831016604e8410600b841016171562003c2b575081810a6200070d565b62003c37838362003b59565b806000190482111562003c4e5762003c4e6200354b565b029392505050565b600062002e68838362003ba2565b634e487b7160e01b600052600160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60006020828403121562003cd857600080fd5b81516001600160401b0381111562003cef57600080fd5b8201601f8101841362003d0157600080fd5b805162003d126200306e8262003033565b81815285602083850101111562003d2857600080fd5b62003d3b82602083016020860162002dff565b95945050505050565b60006020828403121562003d5757600080fd5b815162002e688162002d2256fe6101006040523480156200001257600080fd5b506040516200159c3803806200159c83398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516110e0620004bc60003960006101f70152600081816102ba015281816104e0015261054e0152600061049101526000818161031f015261045b01526110e06000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063a457c2d71161007c578063a457c2d7146102f4578063a9059cbb14610307578063cd0d00961461031a578063d505accf14610341578063dd62ed3e14610354578063ffa1ad741461036757600080fd5b806370a08231146102515780637ecebe001461027a57806395d89b411461029a5780639dc29fac146102a2578063a3c573eb146102b557600080fd5b806330adf81f116100ff57806330adf81f146101c9578063313ce567146101f05780633644e51514610221578063395093511461022957806340c10f191461023c57600080fd5b806306fdde031461013c578063095ea7b31461015a57806318160ddd1461017d57806320606b701461018f57806323b872dd146101b6575b600080fd5b610144610387565b6040516101519190610e26565b60405180910390f35b61016d610168366004610e90565b610419565b6040519015158152602001610151565b6002545b604051908152602001610151565b6101817f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b61016d6101c4366004610eba565b610433565b6101817f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610151565b610181610457565b61016d610237366004610e90565b6104b3565b61024f61024a366004610e90565b6104d5565b005b61018161025f366004610ef6565b6001600160a01b031660009081526020819052604090205490565b610181610288366004610ef6565b60056020526000908152604090205481565b610144610534565b61024f6102b0366004610e90565b610543565b6102dc7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610151565b61016d610302366004610e90565b610595565b61016d610315366004610e90565b610610565b6101817f000000000000000000000000000000000000000000000000000000000000000081565b61024f61034f366004610f18565b61061e565b610181610362366004610f8b565b610859565b610144604051806040016040528060018152602001603160f81b81525081565b60606003805461039690610fbe565b80601f01602080910402602001604051908101604052809291908181526020018280546103c290610fbe565b801561040f5780601f106103e45761010080835404028352916020019161040f565b820191906000526020600020905b8154815290600101906020018083116103f257829003601f168201915b5050505050905090565b600033610427818585610884565b60019150505b92915050565b6000336104418582856109a9565b61044c858585610a23565b506001949350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461461048e5761048946610bb5565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000336104278185856104c68383610859565b6104d0919061100e565b610884565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105265760405162461bcd60e51b815260040161051d90611021565b60405180910390fd5b6105308282610c61565b5050565b60606004805461039690610fbe565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461058b5760405162461bcd60e51b815260040161051d90611021565b6105308282610d0e565b600033816105a38286610859565b9050838110156106035760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161051d565b61044c8286868403610884565b600033610427818585610a23565b8342111561067a5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b606482015260840161051d565b6001600160a01b038716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866106c783611071565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610725610457565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156107b0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906107e65750896001600160a01b0316816001600160a01b0316145b6108425760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b606482015260840161051d565b61084d8a8a8a610884565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166108e65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161051d565b6001600160a01b0382166109475760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161051d565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006109b58484610859565b90506000198114610a1d5781811015610a105760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161051d565b610a1d8484848403610884565b50505050565b6001600160a01b038316610a875760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161051d565b6001600160a01b038216610ae95760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161051d565b6001600160a01b03831660009081526020819052604090205481811015610b615760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161051d565b6001600160a01b038481166000818152602081815260408083208787039055938716808352918490208054870190559251858152909260008051602061108b833981519152910160405180910390a3610a1d565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610be0610387565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610cb75760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161051d565b8060026000828254610cc9919061100e565b90915550506001600160a01b0382166000818152602081815260408083208054860190555184815260008051602061108b833981519152910160405180910390a35050565b6001600160a01b038216610d6e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161051d565b6001600160a01b03821660009081526020819052604090205481811015610de25760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161051d565b6001600160a01b03831660008181526020818152604080832086860390556002805487900390555185815291929160008051602061108b833981519152910161099c565b600060208083528351808285015260005b81811015610e5357858101830151858201604001528201610e37565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610e8b57600080fd5b919050565b60008060408385031215610ea357600080fd5b610eac83610e74565b946020939093013593505050565b600080600060608486031215610ecf57600080fd5b610ed884610e74565b9250610ee660208501610e74565b9150604084013590509250925092565b600060208284031215610f0857600080fd5b610f1182610e74565b9392505050565b600080600080600080600060e0888a031215610f3357600080fd5b610f3c88610e74565b9650610f4a60208901610e74565b95506040880135945060608801359350608088013560ff81168114610f6e57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f9e57600080fd5b610fa783610e74565b9150610fb560208401610e74565b90509250929050565b600181811c90821680610fd257607f821691505b602082108103610ff257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561042d5761042d610ff8565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b60006001820161108357611083610ff8565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122041a613df402940120c0c7421c7d02599c9a28987dd403c01cd013411ae6d388964736f6c63430008140033a2646970667358221220057cd6dd4071fe6d2141a3112622ff43f32081877651a41339de10801839d29064736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMDeployer.json b/compiled-contracts/paris/PolygonZkEVMDeployer.json index fe0571a32..6d250a4ff 100644 --- a/compiled-contracts/paris/PolygonZkEVMDeployer.json +++ b/compiled-contracts/paris/PolygonZkEVMDeployer.json @@ -184,8 +184,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50604051610a69380380610a6983398101604081905261002f91610097565b61003833610047565b61004181610047565b506100c7565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100a957600080fd5b81516001600160a01b03811681146100c057600080fd5b9392505050565b610993806100d66000396000f3fe6080604052600436106100605760003560e01c80632b79805a146100655780634a94d4871461007a5780636d07dbf81461008d578063715018a6146100c35780638da5cb5b146100d8578063e11ae6cb146100ed578063f2fde38b14610100575b600080fd5b610078610073366004610719565b610120565b005b6100786100883660046107ab565b61016e565b34801561009957600080fd5b506100ad6100a8366004610801565b6101b0565b6040516100ba9190610823565b60405180910390f35b3480156100cf57600080fd5b506100786101c3565b3480156100e457600080fd5b506100ad6101d7565b6100786100fb366004610837565b6101e6565b34801561010c57600080fd5b5061007861011b366004610886565b610228565b6101286102a6565b6000610135858585610305565b90506101418183610405565b506000805160206109158339815191528160405161015f9190610823565b60405180910390a15050505050565b6101766102a6565b610181838383610449565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b90600090a1505050565b60006101bc8383610477565b9392505050565b6101cb6102a6565b6101d56000610484565b565b6000546001600160a01b031690565b6101ee6102a6565b60006101fb848484610305565b90506000805160206109158339815191528160405161021a9190610823565b60405180910390a150505050565b6102306102a6565b6001600160a01b03811661029a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6102a381610484565b50565b336102af6101d7565b6001600160a01b0316146101d55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610291565b6000834710156103575760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610291565b81516000036103a85760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610291565b8282516020840186f590506001600160a01b0381166101bc5760405162461bcd60e51b8152602060048201526019602482015278437265617465323a204661696c6564206f6e206465706c6f7960381b6044820152606401610291565b60606101bc838360006040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c656400008152506104d4565b606061046f848484604051806060016040528060298152602001610935602991396104d4565b949350505050565b60006101bc8383306105af565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156105355760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610291565b600080866001600160a01b0316858760405161055191906108c5565b60006040518083038185875af1925050503d806000811461058e576040519150601f19603f3d011682016040523d82523d6000602084013e610593565b606091505b50915091506105a4878383876105d9565b979650505050505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b60608315610648578251600003610641576001600160a01b0385163b6106415760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610291565b508161046f565b61046f838381511561065d5781518083602001fd5b8060405162461bcd60e51b815260040161029191906108e1565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261069e57600080fd5b81356001600160401b03808211156106b8576106b8610677565b604051601f8301601f19908116603f011681019082821181831017156106e0576106e0610677565b816040528381528660208588010111156106f957600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806080858703121561072f57600080fd5b843593506020850135925060408501356001600160401b038082111561075457600080fd5b6107608883890161068d565b9350606087013591508082111561077657600080fd5b506107838782880161068d565b91505092959194509250565b80356001600160a01b03811681146107a657600080fd5b919050565b6000806000606084860312156107c057600080fd5b6107c98461078f565b925060208401356001600160401b038111156107e457600080fd5b6107f08682870161068d565b925050604084013590509250925092565b6000806040838503121561081457600080fd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b60008060006060848603121561084c57600080fd5b833592506020840135915060408401356001600160401b0381111561087057600080fd5b61087c8682870161068d565b9150509250925092565b60006020828403121561089857600080fd5b6101bc8261078f565b60005b838110156108bc5781810151838201526020016108a4565b50506000910152565b600082516108d78184602087016108a1565b9190910192915050565b60208152600082518060208401526109008160408501602087016108a1565b601f01601f1916919091016040019291505056feba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a26469706673582212209681c024553773a6cd2730ece88191934e151912c4edefdf804f50def29c364464736f6c63430008140033", - "deployedBytecode": "0x6080604052600436106100605760003560e01c80632b79805a146100655780634a94d4871461007a5780636d07dbf81461008d578063715018a6146100c35780638da5cb5b146100d8578063e11ae6cb146100ed578063f2fde38b14610100575b600080fd5b610078610073366004610719565b610120565b005b6100786100883660046107ab565b61016e565b34801561009957600080fd5b506100ad6100a8366004610801565b6101b0565b6040516100ba9190610823565b60405180910390f35b3480156100cf57600080fd5b506100786101c3565b3480156100e457600080fd5b506100ad6101d7565b6100786100fb366004610837565b6101e6565b34801561010c57600080fd5b5061007861011b366004610886565b610228565b6101286102a6565b6000610135858585610305565b90506101418183610405565b506000805160206109158339815191528160405161015f9190610823565b60405180910390a15050505050565b6101766102a6565b610181838383610449565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b90600090a1505050565b60006101bc8383610477565b9392505050565b6101cb6102a6565b6101d56000610484565b565b6000546001600160a01b031690565b6101ee6102a6565b60006101fb848484610305565b90506000805160206109158339815191528160405161021a9190610823565b60405180910390a150505050565b6102306102a6565b6001600160a01b03811661029a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6102a381610484565b50565b336102af6101d7565b6001600160a01b0316146101d55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610291565b6000834710156103575760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610291565b81516000036103a85760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610291565b8282516020840186f590506001600160a01b0381166101bc5760405162461bcd60e51b8152602060048201526019602482015278437265617465323a204661696c6564206f6e206465706c6f7960381b6044820152606401610291565b60606101bc838360006040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c656400008152506104d4565b606061046f848484604051806060016040528060298152602001610935602991396104d4565b949350505050565b60006101bc8383306105af565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156105355760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610291565b600080866001600160a01b0316858760405161055191906108c5565b60006040518083038185875af1925050503d806000811461058e576040519150601f19603f3d011682016040523d82523d6000602084013e610593565b606091505b50915091506105a4878383876105d9565b979650505050505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b60608315610648578251600003610641576001600160a01b0385163b6106415760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610291565b508161046f565b61046f838381511561065d5781518083602001fd5b8060405162461bcd60e51b815260040161029191906108e1565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261069e57600080fd5b81356001600160401b03808211156106b8576106b8610677565b604051601f8301601f19908116603f011681019082821181831017156106e0576106e0610677565b816040528381528660208588010111156106f957600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806080858703121561072f57600080fd5b843593506020850135925060408501356001600160401b038082111561075457600080fd5b6107608883890161068d565b9350606087013591508082111561077657600080fd5b506107838782880161068d565b91505092959194509250565b80356001600160a01b03811681146107a657600080fd5b919050565b6000806000606084860312156107c057600080fd5b6107c98461078f565b925060208401356001600160401b038111156107e457600080fd5b6107f08682870161068d565b925050604084013590509250925092565b6000806040838503121561081457600080fd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b60008060006060848603121561084c57600080fd5b833592506020840135915060408401356001600160401b0381111561087057600080fd5b61087c8682870161068d565b9150509250925092565b60006020828403121561089857600080fd5b6101bc8261078f565b60005b838110156108bc5781810151838201526020016108a4565b50506000910152565b600082516108d78184602087016108a1565b9190910192915050565b60208152600082518060208401526109008160408501602087016108a1565b601f01601f1916919091016040019291505056feba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a26469706673582212209681c024553773a6cd2730ece88191934e151912c4edefdf804f50def29c364464736f6c63430008140033", + "bytecode": "0x608060405234801561001057600080fd5b50604051610c71380380610c7183398101604081905261002f91610097565b61003833610047565b61004181610047565b506100c7565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100a957600080fd5b81516001600160a01b03811681146100c057600080fd5b9392505050565b610b9b806100d66000396000f3fe6080604052600436106100705760003560e01c8063715018a61161004e578063715018a6146100e65780638da5cb5b146100fb578063e11ae6cb14610126578063f2fde38b1461013957600080fd5b80632b79805a146100755780634a94d4871461008a5780636d07dbf81461009d575b600080fd5b610088610083366004610927565b610159565b005b6100886100983660046109c7565b6101cb565b3480156100a957600080fd5b506100bd6100b8366004610a1e565b61020d565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b50610088610220565b34801561010757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166100bd565b610088610134366004610a40565b610234565b34801561014557600080fd5b50610088610154366004610a90565b61029b565b610161610357565b600061016e8585856103d8565b905061017a8183610537565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a15050505050565b6101d3610357565b6101de83838361057b565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b90600090a1505050565b600061021983836105a9565b9392505050565b610228610357565b61023260006105b6565b565b61023c610357565b60006102498484846103d8565b60405173ffffffffffffffffffffffffffffffffffffffff821681529091507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a150505050565b6102a3610357565b73ffffffffffffffffffffffffffffffffffffffff811661034b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610354816105b6565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610232576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610342565b600083471015610444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610342565b81516000036104af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610342565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116610219576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610342565b6060610219838360006040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c6564000081525061062b565b60606105a1848484604051806060016040528060298152602001610b3d6029913961062b565b949350505050565b6000610219838330610744565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156106bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610342565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516106e69190610acf565b60006040518083038185875af1925050503d8060008114610723576040519150601f19603f3d011682016040523d82523d6000602084013e610728565b606091505b50915091506107398783838761076e565b979650505050505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b606083156108045782516000036107fd5773ffffffffffffffffffffffffffffffffffffffff85163b6107fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610342565b50816105a1565b6105a183838151156108195781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103429190610aeb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261088d57600080fd5b813567ffffffffffffffff808211156108a8576108a861084d565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156108ee576108ee61084d565b8160405283815286602085880101111561090757600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806080858703121561093d57600080fd5b8435935060208501359250604085013567ffffffffffffffff8082111561096357600080fd5b61096f8883890161087c565b9350606087013591508082111561098557600080fd5b506109928782880161087c565b91505092959194509250565b803573ffffffffffffffffffffffffffffffffffffffff811681146109c257600080fd5b919050565b6000806000606084860312156109dc57600080fd5b6109e58461099e565b9250602084013567ffffffffffffffff811115610a0157600080fd5b610a0d8682870161087c565b925050604084013590509250925092565b60008060408385031215610a3157600080fd5b50508035926020909101359150565b600080600060608486031215610a5557600080fd5b8335925060208401359150604084013567ffffffffffffffff811115610a7a57600080fd5b610a868682870161087c565b9150509250925092565b600060208284031215610aa257600080fd5b6102198261099e565b60005b83811015610ac6578181015183820152602001610aae565b50506000910152565b60008251610ae1818460208701610aab565b9190910192915050565b6020815260008251806020840152610b0a816040850160208701610aab565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220964619cee0e0baf94c6f8763f013be157da5d54c89e5cff4a8caf4266e13f13a64736f6c63430008140033", + "deployedBytecode": "0x6080604052600436106100705760003560e01c8063715018a61161004e578063715018a6146100e65780638da5cb5b146100fb578063e11ae6cb14610126578063f2fde38b1461013957600080fd5b80632b79805a146100755780634a94d4871461008a5780636d07dbf81461009d575b600080fd5b610088610083366004610927565b610159565b005b6100886100983660046109c7565b6101cb565b3480156100a957600080fd5b506100bd6100b8366004610a1e565b61020d565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b50610088610220565b34801561010757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166100bd565b610088610134366004610a40565b610234565b34801561014557600080fd5b50610088610154366004610a90565b61029b565b610161610357565b600061016e8585856103d8565b905061017a8183610537565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a15050505050565b6101d3610357565b6101de83838361057b565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b90600090a1505050565b600061021983836105a9565b9392505050565b610228610357565b61023260006105b6565b565b61023c610357565b60006102498484846103d8565b60405173ffffffffffffffffffffffffffffffffffffffff821681529091507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a150505050565b6102a3610357565b73ffffffffffffffffffffffffffffffffffffffff811661034b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610354816105b6565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610232576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610342565b600083471015610444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610342565b81516000036104af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610342565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116610219576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610342565b6060610219838360006040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c6564000081525061062b565b60606105a1848484604051806060016040528060298152602001610b3d6029913961062b565b949350505050565b6000610219838330610744565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156106bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610342565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516106e69190610acf565b60006040518083038185875af1925050503d8060008114610723576040519150601f19603f3d011682016040523d82523d6000602084013e610728565b606091505b50915091506107398783838761076e565b979650505050505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b606083156108045782516000036107fd5773ffffffffffffffffffffffffffffffffffffffff85163b6107fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610342565b50816105a1565b6105a183838151156108195781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103429190610aeb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261088d57600080fd5b813567ffffffffffffffff808211156108a8576108a861084d565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156108ee576108ee61084d565b8160405283815286602085880101111561090757600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806080858703121561093d57600080fd5b8435935060208501359250604085013567ffffffffffffffff8082111561096357600080fd5b61096f8883890161087c565b9350606087013591508082111561098557600080fd5b506109928782880161087c565b91505092959194509250565b803573ffffffffffffffffffffffffffffffffffffffff811681146109c257600080fd5b919050565b6000806000606084860312156109dc57600080fd5b6109e58461099e565b9250602084013567ffffffffffffffff811115610a0157600080fd5b610a0d8682870161087c565b925050604084013590509250925092565b60008060408385031215610a3157600080fd5b50508035926020909101359150565b600080600060608486031215610a5557600080fd5b8335925060208401359150604084013567ffffffffffffffff811115610a7a57600080fd5b610a868682870161087c565b9150509250925092565b600060208284031215610aa257600080fd5b6102198261099e565b60005b83811015610ac6578181015183820152602001610aae565b50506000910152565b60008251610ae1818460208701610aab565b9190910192915050565b6020815260008251806020840152610b0a816040850160208701610aab565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220964619cee0e0baf94c6f8763f013be157da5d54c89e5cff4a8caf4266e13f13a64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMGlobalExitRoot.json b/compiled-contracts/paris/PolygonZkEVMGlobalExitRoot.json index a575b5ba2..7990be894 100644 --- a/compiled-contracts/paris/PolygonZkEVMGlobalExitRoot.json +++ b/compiled-contracts/paris/PolygonZkEVMGlobalExitRoot.json @@ -141,8 +141,8 @@ "type": "function" } ], - "bytecode": "0x60c060405234801561001057600080fd5b5060405161038e38038061038e83398101604081905261002f91610062565b6001600160a01b0391821660a05216608052610095565b80516001600160a01b038116811461005d57600080fd5b919050565b6000806040838503121561007557600080fd5b61007e83610046565b915061008c60208401610046565b90509250929050565b60805160a0516102c76100c76000396000818160d90152610186015260008181610118015261014a01526102c76000f3fe608060405234801561001057600080fd5b506004361061006d5760003560e01c806301fd904414610072578063257b36321461008e578063319cf735146100ae57806333d6247d146100b75780633ed691ef146100cc5780635ec6a8df146100d4578063a3c573eb14610113575b600080fd5b61007b60005481565b6040519081526020015b60405180910390f35b61007b61009c366004610278565b60026020526000908152604090205481565b61007b60015481565b6100ca6100c5366004610278565b61013a565b005b61007b610237565b6100fb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610085565b6100fb7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361017c57506001829055816101d2565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101b95760008390558291506101d2565b60405163b49365dd60e01b815260040160405180910390fd5b60006101de828461024c565b600081815260026020526040812054919250036102315760008181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b600061024760015460005461024c565b905090565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b60006020828403121561028a57600080fd5b503591905056fea264697066735822122074a82b096d75a224a07a9aeb1e3e199b1ed86e06078779adc74d1eb40843c1cc64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061006d5760003560e01c806301fd904414610072578063257b36321461008e578063319cf735146100ae57806333d6247d146100b75780633ed691ef146100cc5780635ec6a8df146100d4578063a3c573eb14610113575b600080fd5b61007b60005481565b6040519081526020015b60405180910390f35b61007b61009c366004610278565b60026020526000908152604090205481565b61007b60015481565b6100ca6100c5366004610278565b61013a565b005b61007b610237565b6100fb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610085565b6100fb7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361017c57506001829055816101d2565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101b95760008390558291506101d2565b60405163b49365dd60e01b815260040160405180910390fd5b60006101de828461024c565b600081815260026020526040812054919250036102315760008181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b600061024760015460005461024c565b905090565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b60006020828403121561028a57600080fd5b503591905056fea264697066735822122074a82b096d75a224a07a9aeb1e3e199b1ed86e06078779adc74d1eb40843c1cc64736f6c63430008140033", + "bytecode": "0x60c060405234801561001057600080fd5b506040516103f83803806103f883398101604081905261002f91610062565b6001600160a01b0391821660a05216608052610095565b80516001600160a01b038116811461005d57600080fd5b919050565b6000806040838503121561007557600080fd5b61007e83610046565b915061008c60208401610046565b90509250929050565b60805160a0516103316100c76000396000818160e901526101bd015260008181610135015261017401526103316000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c806333d6247d1161005b57806333d6247d146100c75780633ed691ef146100dc5780635ec6a8df146100e4578063a3c573eb1461013057600080fd5b806301fd904414610082578063257b36321461009e578063319cf735146100be575b600080fd5b61008b60005481565b6040519081526020015b60405180910390f35b61008b6100ac3660046102e2565b60026020526000908152604090205481565b61008b60015481565b6100da6100d53660046102e2565b610157565b005b61008b6102a6565b61010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610095565b61010b7f000000000000000000000000000000000000000000000000000000000000000081565b60005460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101a65750600182905581610222565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101f0576000839055829150610222565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051602080820184905281830185905282518083038401815260609092019092528051910120600090600081815260026020526040812054919250036102a05760008181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b60006102dd600154600054604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b6000602082840312156102f457600080fd5b503591905056fea264697066735822122066368a84a416778eb0d212b7acdeed4f6b4a8b676fc470e5579fc4c25caed2f364736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c806333d6247d1161005b57806333d6247d146100c75780633ed691ef146100dc5780635ec6a8df146100e4578063a3c573eb1461013057600080fd5b806301fd904414610082578063257b36321461009e578063319cf735146100be575b600080fd5b61008b60005481565b6040519081526020015b60405180910390f35b61008b6100ac3660046102e2565b60026020526000908152604090205481565b61008b60015481565b6100da6100d53660046102e2565b610157565b005b61008b6102a6565b61010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610095565b61010b7f000000000000000000000000000000000000000000000000000000000000000081565b60005460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101a65750600182905581610222565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101f0576000839055829150610222565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051602080820184905281830185905282518083038401815260609092019092528051910120600090600081815260026020526040812054919250036102a05760008181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b60006102dd600154600054604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b6000602082840312156102f457600080fd5b503591905056fea264697066735822122066368a84a416778eb0d212b7acdeed4f6b4a8b676fc470e5579fc4c25caed2f364736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2.json b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2.json index 52f768bc5..6c5ff823e 100644 --- a/compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2.json +++ b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2.json @@ -78,8 +78,8 @@ "type": "function" } ], - "bytecode": "0x60a060405234801561001057600080fd5b5060405161020e38038061020e83398101604081905261002f91610040565b6001600160a01b0316608052610070565b60006020828403121561005257600080fd5b81516001600160a01b038116811461006957600080fd5b9392505050565b60805161017e6100906000396000818160a7015260ec015261017e6000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806301fd904414610051578063257b36321461006d57806333d6247d1461008d578063a3c573eb146100a2575b600080fd5b61005a60015481565b6040519081526020015b60405180910390f35b61005a61007b36600461012f565b60006020819052908152604090205481565b6100a061009b36600461012f565b6100e1565b005b6100c97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610064565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461012a5760405163b49365dd60e01b815260040160405180910390fd5b600155565b60006020828403121561014157600080fd5b503591905056fea2646970667358221220cb2d185b34b4b56098f61b95c6fc8bc5377da2c37b8c93217bda20bea49f54ee64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806301fd904414610051578063257b36321461006d57806333d6247d1461008d578063a3c573eb146100a2575b600080fd5b61005a60015481565b6040519081526020015b60405180910390f35b61005a61007b36600461012f565b60006020819052908152604090205481565b6100a061009b36600461012f565b6100e1565b005b6100c97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610064565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461012a5760405163b49365dd60e01b815260040160405180910390fd5b600155565b60006020828403121561014157600080fd5b503591905056fea2646970667358221220cb2d185b34b4b56098f61b95c6fc8bc5377da2c37b8c93217bda20bea49f54ee64736f6c63430008140033", + "bytecode": "0x60a060405234801561001057600080fd5b5060405161024238038061024283398101604081905261002f91610040565b6001600160a01b0316608052610070565b60006020828403121561005257600080fd5b81516001600160a01b038116811461006957600080fd5b9392505050565b6080516101b16100916000396000818160a7015261010601526101b16000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806301fd904414610051578063257b36321461006d57806333d6247d1461008d578063a3c573eb146100a2575b600080fd5b61005a60015481565b6040519081526020015b60405180910390f35b61005a61007b366004610162565b60006020819052908152604090205481565b6100a061009b366004610162565b6100ee565b005b6100c97f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610064565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461015d576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b60006020828403121561017457600080fd5b503591905056fea2646970667358221220ea2171e2c85c8bff947affc409ef6fc6a8fe82fb8c174ddeda988651e595d66564736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806301fd904414610051578063257b36321461006d57806333d6247d1461008d578063a3c573eb146100a2575b600080fd5b61005a60015481565b6040519081526020015b60405180910390f35b61005a61007b366004610162565b60006020819052908152604090205481565b6100a061009b366004610162565b6100ee565b005b6100c97f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610064565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461015d576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b60006020828403121561017457600080fd5b503591905056fea2646970667358221220ea2171e2c85c8bff947affc409ef6fc6a8fe82fb8c174ddeda988651e595d66564736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2Mock.json b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2Mock.json index 31fa0eb10..5b5d7d1a5 100644 --- a/compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2Mock.json +++ b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootL2Mock.json @@ -109,8 +109,8 @@ "type": "function" } ], - "bytecode": "0x60a060405234801561001057600080fd5b5060405161027538038061027583398101604081905261002f91610040565b6001600160a01b0316608052610070565b60006020828403121561005257600080fd5b81516001600160a01b038116811461006957600080fd5b9392505050565b6080516101e46100916000396000818160f0015261013501526101e46000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c806301fd904414610067578063116c40c314610083578063257b36321461009857806333d6247d146100b857806396e07459146100cb578063a3c573eb146100eb575b600080fd5b61007060015481565b6040519081526020015b60405180910390f35b610096610091366004610173565b600155565b005b6100706100a6366004610173565b60006020819052908152604090205481565b6100966100c6366004610173565b61012a565b6100966100d936600461018c565b60009182526020829052604090912055565b6101127f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161007a565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146100915760405163b49365dd60e01b815260040160405180910390fd5b60006020828403121561018557600080fd5b5035919050565b6000806040838503121561019f57600080fd5b5050803592602090910135915056fea26469706673582212201bf5b6cc61023657660ebc0be2fe7be0c0d4310dd11fe71962a25dbf22ac229264736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100625760003560e01c806301fd904414610067578063116c40c314610083578063257b36321461009857806333d6247d146100b857806396e07459146100cb578063a3c573eb146100eb575b600080fd5b61007060015481565b6040519081526020015b60405180910390f35b610096610091366004610173565b600155565b005b6100706100a6366004610173565b60006020819052908152604090205481565b6100966100c6366004610173565b61012a565b6100966100d936600461018c565b60009182526020829052604090912055565b6101127f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161007a565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146100915760405163b49365dd60e01b815260040160405180910390fd5b60006020828403121561018557600080fd5b5035919050565b6000806040838503121561019f57600080fd5b5050803592602090910135915056fea26469706673582212201bf5b6cc61023657660ebc0be2fe7be0c0d4310dd11fe71962a25dbf22ac229264736f6c63430008140033", + "bytecode": "0x60a060405234801561001057600080fd5b506040516102b93803806102b983398101604081905261002f91610040565b6001600160a01b0316608052610070565b60006020828403121561005257600080fd5b81516001600160a01b038116811461006957600080fd5b9392505050565b60805161022761009260003960008181610100015261015f01526102276000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c806333d6247d1161005057806333d6247d146100c857806396e07459146100db578063a3c573eb146100fb57600080fd5b806301fd904414610077578063116c40c314610093578063257b3632146100a8575b600080fd5b61008060015481565b6040519081526020015b60405180910390f35b6100a66100a13660046101b6565b600155565b005b6100806100b63660046101b6565b60006020819052908152604090205481565b6100a66100d63660046101b6565b610147565b6100a66100e93660046101cf565b60009182526020829052604090912055565b6101227f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161008a565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146100a1576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602082840312156101c857600080fd5b5035919050565b600080604083850312156101e257600080fd5b5050803592602090910135915056fea26469706673582212203dc131ea7b3c9a0e0d9f97c222b405f0086fc9beecf67bf79956cd48dcb6461d64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100725760003560e01c806333d6247d1161005057806333d6247d146100c857806396e07459146100db578063a3c573eb146100fb57600080fd5b806301fd904414610077578063116c40c314610093578063257b3632146100a8575b600080fd5b61008060015481565b6040519081526020015b60405180910390f35b6100a66100a13660046101b6565b600155565b005b6100806100b63660046101b6565b60006020819052908152604090205481565b6100a66100d63660046101b6565b610147565b6100a66100e93660046101cf565b60009182526020829052604090912055565b6101227f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161008a565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146100a1576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602082840312156101c857600080fd5b5035919050565b600080604083850312156101e257600080fd5b5050803592602090910135915056fea26469706673582212203dc131ea7b3c9a0e0d9f97c222b405f0086fc9beecf67bf79956cd48dcb6461d64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMGlobalExitRootMock.json b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootMock.json index 242de3acd..d3d496f00 100644 --- a/compiled-contracts/paris/PolygonZkEVMGlobalExitRootMock.json +++ b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootMock.json @@ -172,8 +172,8 @@ "type": "function" } ], - "bytecode": "0x60c060405234801561001057600080fd5b5060405161041b38038061041b83398101604081905261002f91610062565b6001600160a01b0391821660a05216608052610095565b80516001600160a01b038116811461005d57600080fd5b919050565b6000806040838503121561007557600080fd5b61007e83610046565b915061008c60208401610046565b90509250929050565b60805160a0516103536100c86000396000818161012201526101f001526000818161016101526101b401526103536000f3fe608060405234801561001057600080fd5b50600436106100835760003560e01c806301fd904414610088578063051a9e28146100a4578063257b3632146100b9578063319cf735146100d957806333d6247d146100e25780633ed691ef146100f55780635bcef673146100fd5780635ec6a8df1461011d578063a3c573eb1461015c575b600080fd5b61009160005481565b6040519081526020015b60405180910390f35b6100b76100b23660046102e2565b610183565b005b6100916100c73660046102e2565b60026020526000908152604090205481565b61009160015481565b6100b76100f03660046102e2565b6101a4565b6100916102a1565b6100b761010b3660046102fb565b60009182526002602052604090912055565b6101447f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161009b565b6101447f000000000000000000000000000000000000000000000000000000000000000081565b80600260006101906102a1565b815260208101919091526040016000205550565b6000546001546001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101e6575060018290558161023c565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361022357600083905582915061023c565b60405163b49365dd60e01b815260040160405180910390fd5b600061024882846102b6565b6000818152600260205260408120549192500361029b5760008181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b60006102b16001546000546102b6565b905090565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b6000602082840312156102f457600080fd5b5035919050565b6000806040838503121561030e57600080fd5b5050803592602090910135915056fea2646970667358221220e9ad45d8087f75d33072119a7d1b8fe41110bef64d83c4ff200b98a56f8c3e1264736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100835760003560e01c806301fd904414610088578063051a9e28146100a4578063257b3632146100b9578063319cf735146100d957806333d6247d146100e25780633ed691ef146100f55780635bcef673146100fd5780635ec6a8df1461011d578063a3c573eb1461015c575b600080fd5b61009160005481565b6040519081526020015b60405180910390f35b6100b76100b23660046102e2565b610183565b005b6100916100c73660046102e2565b60026020526000908152604090205481565b61009160015481565b6100b76100f03660046102e2565b6101a4565b6100916102a1565b6100b761010b3660046102fb565b60009182526002602052604090912055565b6101447f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161009b565b6101447f000000000000000000000000000000000000000000000000000000000000000081565b80600260006101906102a1565b815260208101919091526040016000205550565b6000546001546001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101e6575060018290558161023c565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361022357600083905582915061023c565b60405163b49365dd60e01b815260040160405180910390fd5b600061024882846102b6565b6000818152600260205260408120549192500361029b5760008181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b60006102b16001546000546102b6565b905090565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b6000602082840312156102f457600080fd5b5035919050565b6000806040838503121561030e57600080fd5b5050803592602090910135915056fea2646970667358221220e9ad45d8087f75d33072119a7d1b8fe41110bef64d83c4ff200b98a56f8c3e1264736f6c63430008140033", + "bytecode": "0x60c060405234801561001057600080fd5b5060405161049538038061049583398101604081905261002f91610062565b6001600160a01b0391821660a05216608052610095565b80516001600160a01b038116811461005d57600080fd5b919050565b6000806040838503121561007557600080fd5b61007e83610046565b915061008c60208401610046565b90509250929050565b60805160a0516103cd6100c860003960008181610142015261023701526000818161018e01526101ee01526103cd6000f3fe608060405234801561001057600080fd5b50600436106100a35760003560e01c806333d6247d116100765780635bcef6731161005b5780635bcef6731461011d5780635ec6a8df1461013d578063a3c573eb1461018957600080fd5b806333d6247d146101025780633ed691ef1461011557600080fd5b806301fd9044146100a8578063051a9e28146100c4578063257b3632146100d9578063319cf735146100f9575b600080fd5b6100b160005481565b6040519081526020015b60405180910390f35b6100d76100d236600461035c565b6101b0565b005b6100b16100e736600461035c565b60026020526000908152604090205481565b6100b160015481565b6100d761011036600461035c565b6101d1565b6100b1610320565b6100d761012b366004610375565b60009182526002602052604090912055565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100bb565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b80600260006101bd610320565b815260208101919091526040016000205550565b60005460015473ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163303610220575060018290558161029c565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361026a57600083905582915061029c565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101206000906000818152600260205260408120549192500361031a5760008181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b6000610357600154600054604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b60006020828403121561036e57600080fd5b5035919050565b6000806040838503121561038857600080fd5b5050803592602090910135915056fea2646970667358221220eeb4ec189dc407e366db39253f2dd748a5e379bc3232254e15b86d12d0001bc064736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a35760003560e01c806333d6247d116100765780635bcef6731161005b5780635bcef6731461011d5780635ec6a8df1461013d578063a3c573eb1461018957600080fd5b806333d6247d146101025780633ed691ef1461011557600080fd5b806301fd9044146100a8578063051a9e28146100c4578063257b3632146100d9578063319cf735146100f9575b600080fd5b6100b160005481565b6040519081526020015b60405180910390f35b6100d76100d236600461035c565b6101b0565b005b6100b16100e736600461035c565b60026020526000908152604090205481565b6100b160015481565b6100d761011036600461035c565b6101d1565b6100b1610320565b6100d761012b366004610375565b60009182526002602052604090912055565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100bb565b6101647f000000000000000000000000000000000000000000000000000000000000000081565b80600260006101bd610320565b815260208101919091526040016000205550565b60005460015473ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163303610220575060018290558161029c565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361026a57600083905582915061029c565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101206000906000818152600260205260408120549192500361031a5760008181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b6000610357600154600054604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b60006020828403121561036e57600080fd5b5035919050565b6000806040838503121561038857600080fd5b5050803592602090910135915056fea2646970667358221220eeb4ec189dc407e366db39253f2dd748a5e379bc3232254e15b86d12d0001bc064736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMGlobalExitRootV2.json b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootV2.json index 16939bd54..70537899a 100644 --- a/compiled-contracts/paris/PolygonZkEVMGlobalExitRootV2.json +++ b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootV2.json @@ -19,6 +19,11 @@ "stateMutability": "nonpayable", "type": "constructor" }, + { + "inputs": [], + "name": "MerkleTreeFull", + "type": "error" + }, { "inputs": [], "name": "OnlyAllowedContracts", @@ -56,6 +61,48 @@ "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", @@ -69,6 +116,48 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "newGlobalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "lastBlockHash", + "type": "uint256" + }, + { + "internalType": "uint64", + "name": "timestamp", + "type": "uint64" + } + ], + "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": [ { @@ -139,10 +228,44 @@ "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": "0x60c060405234801561001057600080fd5b5060405161038e38038061038e83398101604081905261002f91610062565b6001600160a01b0391821660a05216608052610095565b80516001600160a01b038116811461005d57600080fd5b919050565b6000806040838503121561007557600080fd5b61007e83610046565b915061008c60208401610046565b90509250929050565b60805160a0516102c76100c76000396000818160d90152610186015260008181610118015261014a01526102c76000f3fe608060405234801561001057600080fd5b506004361061006d5760003560e01c806301fd904414610072578063257b36321461008e578063319cf735146100ae57806333d6247d146100b75780633ed691ef146100cc57806349b7b802146100d4578063a3c573eb14610113575b600080fd5b61007b60005481565b6040519081526020015b60405180910390f35b61007b61009c366004610278565b60026020526000908152604090205481565b61007b60015481565b6100ca6100c5366004610278565b61013a565b005b61007b610237565b6100fb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610085565b6100fb7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361017c57506001829055816101d2565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101b95760008390558291506101d2565b60405163b49365dd60e01b815260040160405180910390fd5b60006101de828461024c565b600081815260026020526040812054919250036102315760008181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b600061024760015460005461024c565b905090565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b60006020828403121561028a57600080fd5b503591905056fea26469706673582212204b21a3fd5083785616cac881a4e531abc2b9bcd9673f549586e8bcb171a52e7264736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061006d5760003560e01c806301fd904414610072578063257b36321461008e578063319cf735146100ae57806333d6247d146100b75780633ed691ef146100cc57806349b7b802146100d4578063a3c573eb14610113575b600080fd5b61007b60005481565b6040519081526020015b60405180910390f35b61007b61009c366004610278565b60026020526000908152604090205481565b61007b60015481565b6100ca6100c5366004610278565b61013a565b005b61007b610237565b6100fb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610085565b6100fb7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361017c57506001829055816101d2565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036101b95760008390558291506101d2565b60405163b49365dd60e01b815260040160405180910390fd5b60006101de828461024c565b600081815260026020526040812054919250036102315760008181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b600061024760015460005461024c565b905090565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b60006020828403121561028a57600080fd5b503591905056fea26469706673582212204b21a3fd5083785616cac881a4e531abc2b9bcd9673f549586e8bcb171a52e7264736f6c63430008140033", + "bytecode": "0x60c060405234801561001057600080fd5b50604051610b37380380610b3783398101604081905261002f91610062565b6001600160a01b0391821660a05216608052610095565b80516001600160a01b038116811461005d57600080fd5b919050565b6000806040838503121561007557600080fd5b61007e83610046565b915061008c60208401610046565b90509250929050565b60805160a051610a6f6100c86000396000818161014901526102c3015260008181610218015261027a0152610a6f6000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c806349b7b8021161008157806383f244031161005b57806383f2440314610200578063a3c573eb14610213578063fb5708341461023a57600080fd5b806349b7b802146101445780635ca1e165146101905780635d8105011461019857600080fd5b8063319cf735116100b2578063319cf7351461011e57806333d6247d146101275780633ed691ef1461013c57600080fd5b806301fd9044146100d9578063257b3632146100f55780632dfdf0b514610115575b600080fd5b6100e260005481565b6040519081526020015b60405180910390f35b6100e261010336600461071d565b60026020526000908152604090205481565b6100e260235481565b6100e260015481565b61013a61013536600461071d565b61025d565b005b6100e2610401565b61016b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ec565b6100e2610416565b6100e26101a6366004610736565b604080516020808201959095528082019390935260c09190911b7fffffffffffffffff0000000000000000000000000000000000000000000000001660608301528051604881840301815260689092019052805191012090565b6100e261020e3660046107a7565b610420565b61016b7f000000000000000000000000000000000000000000000000000000000000000081565b61024d6102483660046107e6565b6104f6565b60405190151581526020016100ec565b60005460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102ac5750600182905581610328565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102f6576000839055829150610328565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610334828461050e565b600081815260026020526040812054919250036103fb57600061035860014361085d565b60008381526002602090815260409182902092409283905581518082018690528083018490527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b16606082015282518082036048018152606890910190925281519101209091506103cc9061053d565b604051849084907f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce390600090a3505b50505050565b600061041160015460005461050e565b905090565b6000610411610640565b600083815b60208110156104ed57600163ffffffff8516821c811690036104905784816020811061045357610453610870565b602002013582604051602001610473929190918252602082015260400190565b6040516020818303038152906040528051906020012091506104db565b818582602081106104a3576104a3610870565b60200201356040516020016104c2929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806104e58161089f565b915050610425565b50949350505050565b600081610504868686610420565b1495945050505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b80600161054c602060026109f7565b610556919061085d565b60235410610590576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006023600081546105a19061089f565b9182905550905060005b6020811015610632578082901c6001166001036105de5782600382602081106105d6576105d6610870565b015550505050565b600381602081106105f1576105f1610870565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061062a9061089f565b9150506105ab565b5061063b610a0a565b505050565b602354600090819081805b6020811015610714578083901c6001166001036106a8576003816020811061067557610675610870565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506106d5565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b6040805160208101849052908101839052606001604051602081830303815290604052805190602001209150808061070c9061089f565b91505061064b565b50919392505050565b60006020828403121561072f57600080fd5b5035919050565b60008060006060848603121561074b57600080fd5b8335925060208401359150604084013567ffffffffffffffff8116811461077157600080fd5b809150509250925092565b80610400810183101561053757600080fd5b803563ffffffff811681146107a257600080fd5b919050565b600080600061044084860312156107bd57600080fd5b833592506107ce856020860161077c565b91506107dd610420850161078e565b90509250925092565b60008060008061046085870312156107fd57600080fd5b8435935061080e866020870161077c565b925061081d610420860161078e565b939692955092936104400135925050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156105375761053761082e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036108d0576108d061082e565b5060010190565b600181815b8085111561093057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109165761091661082e565b8085161561092357918102915b93841c93908002906108dc565b509250929050565b60008261094757506001610537565b8161095457506000610537565b816001811461096a576002811461097457610990565b6001915050610537565b60ff8411156109855761098561082e565b50506001821b610537565b5060208310610133831016604e8410600b84101617156109b3575081810a610537565b6109bd83836108d7565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109ef576109ef61082e565b029392505050565b6000610a038383610938565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea2646970667358221220f03e29cac1092312a36b9402019fbb0207a83327631502bd03c8b858247c9c1e64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100d45760003560e01c806349b7b8021161008157806383f244031161005b57806383f2440314610200578063a3c573eb14610213578063fb5708341461023a57600080fd5b806349b7b802146101445780635ca1e165146101905780635d8105011461019857600080fd5b8063319cf735116100b2578063319cf7351461011e57806333d6247d146101275780633ed691ef1461013c57600080fd5b806301fd9044146100d9578063257b3632146100f55780632dfdf0b514610115575b600080fd5b6100e260005481565b6040519081526020015b60405180910390f35b6100e261010336600461071d565b60026020526000908152604090205481565b6100e260235481565b6100e260015481565b61013a61013536600461071d565b61025d565b005b6100e2610401565b61016b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ec565b6100e2610416565b6100e26101a6366004610736565b604080516020808201959095528082019390935260c09190911b7fffffffffffffffff0000000000000000000000000000000000000000000000001660608301528051604881840301815260689092019052805191012090565b6100e261020e3660046107a7565b610420565b61016b7f000000000000000000000000000000000000000000000000000000000000000081565b61024d6102483660046107e6565b6104f6565b60405190151581526020016100ec565b60005460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102ac5750600182905581610328565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102f6576000839055829150610328565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610334828461050e565b600081815260026020526040812054919250036103fb57600061035860014361085d565b60008381526002602090815260409182902092409283905581518082018690528083018490527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b16606082015282518082036048018152606890910190925281519101209091506103cc9061053d565b604051849084907f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce390600090a3505b50505050565b600061041160015460005461050e565b905090565b6000610411610640565b600083815b60208110156104ed57600163ffffffff8516821c811690036104905784816020811061045357610453610870565b602002013582604051602001610473929190918252602082015260400190565b6040516020818303038152906040528051906020012091506104db565b818582602081106104a3576104a3610870565b60200201356040516020016104c2929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806104e58161089f565b915050610425565b50949350505050565b600081610504868686610420565b1495945050505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b80600161054c602060026109f7565b610556919061085d565b60235410610590576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006023600081546105a19061089f565b9182905550905060005b6020811015610632578082901c6001166001036105de5782600382602081106105d6576105d6610870565b015550505050565b600381602081106105f1576105f1610870565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061062a9061089f565b9150506105ab565b5061063b610a0a565b505050565b602354600090819081805b6020811015610714578083901c6001166001036106a8576003816020811061067557610675610870565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506106d5565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b6040805160208101849052908101839052606001604051602081830303815290604052805190602001209150808061070c9061089f565b91505061064b565b50919392505050565b60006020828403121561072f57600080fd5b5035919050565b60008060006060848603121561074b57600080fd5b8335925060208401359150604084013567ffffffffffffffff8116811461077157600080fd5b809150509250925092565b80610400810183101561053757600080fd5b803563ffffffff811681146107a257600080fd5b919050565b600080600061044084860312156107bd57600080fd5b833592506107ce856020860161077c565b91506107dd610420850161078e565b90509250925092565b60008060008061046085870312156107fd57600080fd5b8435935061080e866020870161077c565b925061081d610420860161078e565b939692955092936104400135925050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156105375761053761082e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036108d0576108d061082e565b5060010190565b600181815b8085111561093057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109165761091661082e565b8085161561092357918102915b93841c93908002906108dc565b509250929050565b60008261094757506001610537565b8161095457506000610537565b816001811461096a576002811461097457610990565b6001915050610537565b60ff8411156109855761098561082e565b50506001821b610537565b5060208310610133831016604e8410600b84101617156109b3575081810a610537565b6109bd83836108d7565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109ef576109ef61082e565b029392505050565b6000610a038383610938565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea2646970667358221220f03e29cac1092312a36b9402019fbb0207a83327631502bd03c8b858247c9c1e64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMMock.json b/compiled-contracts/paris/PolygonZkEVMMock.json index 135bf1e81..652ee5fb6 100644 --- a/compiled-contracts/paris/PolygonZkEVMMock.json +++ b/compiled-contracts/paris/PolygonZkEVMMock.json @@ -1935,8 +1935,8 @@ "type": "function" } ], - "bytecode": "0x6101406040523480156200001257600080fd5b50604051620053ba380380620053ba8339810160408190526200003591620000a5565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b0391821661010052166101205262000131565b6001600160a01b03811681146200008557600080fd5b50565b80516001600160401b0381168114620000a057600080fd5b919050565b60008060008060008060c08789031215620000bf57600080fd5b8651620000cc816200006f565b6020880151909650620000df816200006f565b6040880151909550620000f2816200006f565b606088015190945062000105816200006f565b9250620001156080880162000088565b91506200012560a0880162000088565b90509295509295509295565b60805160a05160c05160e05161010051610120516151b462000206600039600081816105f50152818161105301526129cc015260008181610755015261102901526000818161071b01528181611b1501528181612e060152613de20152600081816108b301528181610dfe015281816111510152818161128d0152818161184f01528181611db201528181612fc901526139ee01526000818161094f015281816134f6015261384001526000818161081701528181611ae30152818161217901528181612f9d01526135bd01526151b46000f3fe608060405234801561001057600080fd5b506004361061033d5760003560e01c80638c3d7301116101bb5780638c3d73011461069f5780638da5cb5b146106a757806396dc3d39146106af57806399f5634e146106c25780639aa972a3146106ca5780639b796760146106dd5780639c9f3dfe146106f0578063a066215c14610703578063a3c573eb14610716578063ada8f9191461073d578063adc879e914610750578063afd23cbe14610777578063b4d63f581461079f578063b4f77ea9146107ff578063b6b0b09714610812578063ba58ae3914610839578063c0cad3021461084c578063c0ed84e01461085f578063c754c7ed14610867578063c89e42df14610881578063cfa8ed4714610894578063d02103ca146108ae578063d2e129f9146108d5578063d8d1091b146108e8578063d939b315146108fb578063dbc1697614610915578063e0d174411461091d578063e7a7ed0214610930578063e8bf92ed1461094a578063eaeb077b14610971578063ed6b010414610984578063f14916d614610998578063f2fde38b146109ab578063f851a440146109be578063f8b823e4146109d1578063fe16564f146109da57600080fd5b80630a0d9fbe146103425780630eaa86ea14610370578063107bf28c1461039157806310a01a72146103a657806315064c96146103bb5780631816b7e5146103d857806319d8ac61146103eb578063220d7899146103fe578063267822471461041157806329878983146104315780632b0006fa1461044b5780632c1f816a1461045e578063383b3be814610471578063394218e914610484578063423fa8561461049757806345605267146104b1578063458c0477146104cb5780634a1a89a7146104de5780634a910e6a146104f85780634e4877061461050b5780635392c5e01461051e578063542028d51461053e578063574f649e146105465780635e9145c9146105595780635ec919581461056c5780636046916914610574578063621dd4111461057c5780636b8616ce1461058f5780636ff512cc146105af578063715018a6146105c25780637215541a146105ca5780637fcb3653146105dd578063831c7ead146105f0578063837a473814610617578063841b24d714610685575b600080fd5b606f5461035a9061010090046001600160401b031681565b6040516103679190614227565b60405180910390f35b61038361037e366004614252565b6109ed565b604051908152602001610367565b610399610bbc565b60405161036791906142f7565b6103b96103b4366004614328565b610c4a565b005b606f546103c89060ff1681565b6040519015158152602001610367565b6103b96103e63660046143bb565b610e9d565b60735461035a906001600160401b031681565b61039961040c3660046143df565b610f56565b607b54610424906001600160a01b031681565b604051610367919061442c565b60745461042490600160401b90046001600160a01b031681565b6103b9610459366004614452565b6110b1565b6103b961046c3660046144ba565b6111ec565b6103c861047f366004614534565b611350565b6103b9610492366004614534565b611397565b60735461035a90600160401b90046001600160401b031681565b60735461035a90600160801b90046001600160401b031681565b60795461035a906001600160401b031681565b60795461035a90600160401b90046001600160401b031681565b6103b9610506366004614534565b61147f565b6103b9610519366004614534565b6114ee565b61038361052c366004614534565b60756020526000908152604090205481565b6103996115da565b610383610554366004614608565b6115e7565b6103b96105673660046146c4565b61162a565b6103b9611bc6565b610383611c53565b6103b961058a366004614452565b611c69565b61038361059d366004614534565b60716020526000908152604090205481565b6103b96105bd366004614717565b611f09565b6103b9611f88565b6103b96105d8366004614534565b611f9c565b60745461035a906001600160401b031681565b61035a7f000000000000000000000000000000000000000000000000000000000000000081565b61065a610625366004614732565b6078602052600090815260409020805460018201546002909201546001600160401b0380831693600160401b90930416919084565b604080516001600160401b039586168152949093166020850152918301526060820152608001610367565b60795461035a90600160c01b90046001600160401b031681565b6103b96120b7565b61042461213b565b6103b96106bd366004614534565b61214a565b610383612174565b6103b96106d83660046144ba565b612281565b6103b96106eb366004614534565b612318565b6103b96106fe366004614534565b61234c565b6103b9610711366004614534565b612438565b6104247f000000000000000000000000000000000000000000000000000000000000000081565b6103b961074b366004614717565b6124e0565b61035a7f000000000000000000000000000000000000000000000000000000000000000081565b606f5461078c90600160481b900461ffff1681565b60405161ffff9091168152602001610367565b6107da6107ad366004614534565b607260205260009081526040902080546001909101546001600160401b0380821691600160401b90041683565b604080519384526001600160401b039283166020850152911690820152606001610367565b6103b961080d366004614534565b612556565b6104247f000000000000000000000000000000000000000000000000000000000000000081565b6103c8610847366004614732565b612567565b6103b961085a36600461474b565b6125ee565b61035a612606565b607b5461035a90600160a01b90046001600160401b031681565b6103b961088f36600461474b565b612653565b606f5461042490600160581b90046001600160a01b031681565b6104247f000000000000000000000000000000000000000000000000000000000000000081565b6103b96108e33660046147c0565b6126ba565b6103b96108f6366004614872565b612a53565b60795461035a90600160801b90046001600160401b031681565b6103b9612dd9565b6103b961092b3660046148b3565b612e7f565b60735461035a90600160c01b90046001600160401b031681565b6104247f000000000000000000000000000000000000000000000000000000000000000081565b6103b961097f366004614900565b612ef1565b607b546103c890600160e01b900460ff1681565b6103b96109a6366004614717565b61319f565b6103b96109b9366004614717565b61321e565b607a54610424906001600160a01b031681565b61038360705481565b6103b96109e836600461494b565b613294565b60008060006109fa612606565b90506001600160401b03881615610a97576079546001600160401b039081169089161115610a435760405162461bcd60e51b8152600401610a3a90614977565b60405180910390fd5b6001600160401b038089166000908152607860205260409020600281015481549094509091898116600160401b9092041614610a915760405162461bcd60e51b8152600401610a3a906149f5565b50610b01565b6001600160401b038716600090815260756020526040902054915081610acf5760405162461bcd60e51b8152600401610a3a90614a55565b806001600160401b0316876001600160401b03161115610b015760405162461bcd60e51b8152600401610a3a90614aac565b806001600160401b0316866001600160401b031611610b325760405162461bcd60e51b8152600401610a3a90614b1d565b6000610b418888888689610f56565b9050600060008051602061511f833981519152600283604051610b649190614b9a565b602060405180830381855afa158015610b81573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610ba49190614bb6565b610bae9190614be5565b9a9950505050505050505050565b60778054610bc990614bf9565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf590614bf9565b8015610c425780601f10610c1757610100808354040283529160200191610c42565b820191906000526020600020905b815481529060010190602001808311610c2557829003601f168201915b505050505081565b610c526132b6565b600080610c5d612606565b90506001600160401b038a1615610cf1576079546001600160401b03908116908b161115610c9d5760405162461bcd60e51b8152600401610a3a90614977565b6001600160401b03808b1660009081526078602052604090206002810154815490945090918b8116600160401b9092041614610ceb5760405162461bcd60e51b8152600401610a3a906149f5565b50610d5b565b6001600160401b038916600090815260756020526040902054915081610d295760405162461bcd60e51b8152600401610a3a90614a55565b806001600160401b0316896001600160401b03161115610d5b5760405162461bcd60e51b8152600401610a3a90614aac565b806001600160401b0316886001600160401b031611610d8c5760405162461bcd60e51b8152600401610a3a90614b1d565b6000610d9b8a8a8a868b610f56565b607480546001600160401b0319166001600160401b038c811691821790925560009081526075602052604090208990556079549192501615610de857607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018990527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b158015610e4a57600080fd5b505af1158015610e5e573d6000803e3d6000fd5b50506040518981523392506001600160401b038c16915060008051602061513f8339815191529060200160405180910390a35050505050505050505050565b607a546001600160a01b03163314610ec857604051634755657960e01b815260040160405180910390fd5b6103e88161ffff161080610ee157506103ff8161ffff16115b15610eff57604051630984a67960e31b815260040160405180910390fd5b606f805461ffff60481b1916600160481b61ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b6001600160401b038086166000818152607260205260408082205493881682529020546060929115801590610f89575081155b15610fa75760405163340c614f60e11b815260040160405180910390fd5b80610fc5576040516366385b5160e01b815260040160405180910390fd5b610fce84612567565b610feb576040516305dae44f60e21b815260040160405180910390fd5b604080516001600160601b03193360601b166020820152603481019690965260548601929092526001600160c01b031960c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b607454600160401b90046001600160a01b031633146110e35760405163bbcbbc0560e01b815260040160405180910390fd5b6110f1868686868686613315565b607480546001600160401b0319166001600160401b038681169182179092556000908152607560205260409020839055607954161561113b57607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b15801561119d57600080fd5b505af11580156111b1573d6000803e3d6000fd5b50506040518481523392506001600160401b038716915060008051602061513f833981519152906020015b60405180910390a3505050505050565b607454600160401b90046001600160a01b0316331461121e5760405163bbcbbc0560e01b815260040160405180910390fd5b61122d878787878787876135f0565b607480546001600160401b0319166001600160401b038681169182179092556000908152607560205260409020839055607954161561127757607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b1580156112d957600080fd5b505af11580156112ed573d6000803e3d6000fd5b5050607980546001600160c01b031661127560c71b179055505060405182815233906001600160401b038616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b6079546001600160401b038281166000908152607860205260408120549092429261138692600160801b90920481169116614c49565b6001600160401b0316111592915050565b607a546001600160a01b031633146113c257604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b03821611156113ef57604051631d06e87960e01b815260040160405180910390fd5b606f5460ff1661142f576079546001600160401b03600160c01b90910481169082161061142f5760405163401636df60e01b815260040160405180910390fd5b607980546001600160c01b0316600160c01b6001600160401b038416021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190610f4b908390614227565b607454600160401b90046001600160a01b031633146114e257606f5460ff16156114bc57604051630bc011ff60e21b815260040160405180910390fd5b6114c581611350565b6114e257604051630674f25160e11b815260040160405180910390fd5b6114eb81613910565b50565b607a546001600160a01b0316331461151957604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b03821611156115465760405163f5e37f2f60e01b815260040160405180910390fd5b606f5460ff1661158657607b546001600160401b03600160a01b9091048116908216106115865760405163f5e37f2f60e01b815260040160405180910390fd5b607b8054600160a01b600160e01b031916600160a01b6001600160401b038416021790556040517fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90610f4b908390614227565b60768054610bc990614bf9565b6000858580519060200120858585604051602001611609959493929190614c70565b60405160208183030381529060405280519060200120905095945050505050565b606f5460ff161561164e57604051630bc011ff60e21b815260040160405180910390fd5b606f54600160581b90046001600160a01b03163314611680576040516311e7be1560e01b815260040160405180910390fd5b8160008190036116a35760405163cb591a5f60e01b815260040160405180910390fd5b6103e88111156116c657604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160401b82048116600081815260726020526040812054838516949293600160801b909304909216919082905b868110156119ad5760008a8a8381811061171b5761171b614caf565b905060200281019061172d9190614cc5565b61173690614cdb565b805180516020909101206060820151919250906001600160401b031615611825578561176181614d67565b9650506000818360200151846060015160405160200161178393929190614d95565b60408051601f1981840301815291815281516020928301206001600160401b038a166000908152607190935291205490915081146117d45760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b03808816600090815260716020526040808220919091556060850151908501519082169116101561181f57604051633fbd5c3960e11b815260040160405180910390fd5b5061190a565b6020820151158015906118c6575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303816000875af11580156118a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c49190614bb6565b155b156118e4576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c0101561190a576040516328a69b1f60e21b815260040160405180910390fd5b876001600160401b031682604001516001600160401b0316108061193a57504282604001516001600160401b0316115b15611958576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518d604051602001611979959493929190614c70565b60405160208183030381529060405280519060200120945081604001519750505080806119a590614db8565b9150506116ff565b506119b88685614c49565b6073549094506001600160401b03600160c01b909104811690841611156119f25760405163c630a00d60e01b815260040160405180910390fd5b60006119fe8285614dd1565b611a11906001600160401b031688614df1565b60408051606081018252858152426001600160401b03908116602080840191825260738054600160401b9081900485168688019081528d861660008181526072909552979093209551865592516001909501805492519585166001600160801b03199384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611ac65760738054600160801b600160c01b031916600160801b6001600160401b038716021790555b611b0b333083607054611ad99190614e04565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613aa8565b611b13613b19565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611b6e57600080fd5b505af1158015611b82573d6000803e3d6000fd5b50506040516001600160401b03881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a250505050505050505050565b607a546001600160a01b03163314611bf157604051634755657960e01b815260040160405180910390fd5b607b54600160e01b900460ff16611c1b5760405163f6ba91a160e01b815260040160405180910390fd5b607b805460ff60e01b191690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60006070546064611c649190614e04565b905090565b606f5460ff1615611c8d57604051630bc011ff60e21b815260040160405180910390fd5b6079546001600160401b038581166000908152607260205260409020600101544292611cc492600160c01b90910481169116614c49565b6001600160401b03161115611cec57604051638a0704d360e01b815260040160405180910390fd5b6103e8611cf98686614dd1565b6001600160401b03161115611d2157604051635acfba9d60e11b815260040160405180910390fd5b611d2f868686868686613315565b611d3884613bb9565b607954600160801b90046001600160401b0316600003611e1b57607480546001600160401b0319166001600160401b0386811691821790925560009081526075602052604090208390556079541615611d9c57607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b158015611dfe57600080fd5b505af1158015611e12573d6000803e3d6000fd5b50505050611ecc565b611e23613b19565b607980546001600160401b0316906000611e3c83614d67565b82546001600160401b039182166101009390930a928302928202191691909117909155604080516080810182524283168152878316602080830191825282840189815260608401898152607954871660009081526078909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b60405182815233906001600160401b038616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966906020016111dc565b607a546001600160a01b03163314611f3457604051634755657960e01b815260040160405180910390fd5b606f8054600160581b600160f81b031916600160581b6001600160a01b038416021790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610f4b90839061442c565b611f906132b6565b611f9a6000613d8e565b565b611fa461213b565b6001600160a01b0316336001600160a01b0316146120af576000611fc6612606565b9050806001600160401b0316826001600160401b031611611ffa5760405163812a372d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b9091048116908316118061203957506001600160401b0380831660009081526072602052604090206001015416155b1561205757604051632631700560e21b815260040160405180910390fd5b6001600160401b0380831660009081526072602052604090206001015442916120859162093a809116614c49565b6001600160401b031611156120ad5760405163692baaad60e11b815260040160405180910390fd5b505b6114eb613de0565b607b546001600160a01b031633146120e25760405163d1ec4b2360e01b815260040160405180910390fd5b607b54607a80546001600160a01b0319166001600160a01b0390921691821790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e916121319161442c565b60405180910390a1565b6033546001600160a01b031690565b6121526132b6565b607480546001600160401b0319166001600160401b0392909216919091179055565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016121c3919061442c565b602060405180830381865afa1580156121e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122049190614bb6565b90506000612210612606565b6073546001600160401b03600160401b820481169161224091600160801b8204811691600160c01b900416614dd1565b61224a9190614c49565b6122549190614dd1565b6001600160401b03169050806000036122705760009250505090565b61227a8183614e1b565b9250505090565b606f5460ff16156122a557604051630bc011ff60e21b815260040160405180910390fd5b6122b4878787878787876135f0565b6001600160401b0384166000908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a161230f613de0565b50505050505050565b6123206132b6565b607380546001600160401b03909216600160401b02600160401b600160801b0319909216919091179055565b607a546001600160a01b0316331461237757604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b03821611156123a457604051630cc9650760e41b815260040160405180910390fd5b606f5460ff166123e4576079546001600160401b03600160801b9091048116908216106123e45760405163048a05a960e41b815260040160405180910390fd5b60798054600160801b600160c01b031916600160801b6001600160401b038416021790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590610f4b908390614227565b607a546001600160a01b0316331461246357604051634755657960e01b815260040160405180910390fd5b62015180816001600160401b0316111561249057604051631c0cfbfd60e31b815260040160405180910390fd5b606f8054610100600160481b0319166101006001600160401b038416021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890610f4b908390614227565b607a546001600160a01b0316331461250b57604051634755657960e01b815260040160405180910390fd5b607b80546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610f4b90839061442c565b61255e6132b6565b6114eb81613bb9565b600067ffffffff000000016001600160401b03831610801561259d575067ffffffff00000001604083901c6001600160401b0316105b80156125bd575067ffffffff00000001608083901c6001600160401b0316105b80156125d4575067ffffffff0000000160c083901c105b156125e157506001919050565b506000919050565b919050565b6125f66132b6565b60776126028282614e7d565b5050565b6079546000906001600160401b03161561264357506079546001600160401b03908116600090815260786020526040902054600160401b90041690565b506074546001600160401b031690565b607a546001600160a01b0316331461267e57604051634755657960e01b815260040160405180910390fd5b607661268a8282614e7d565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610f4b91906142f7565b600054610100900460ff16158080156126da5750600054600160ff909116105b806126fb57506126e930613e5b565b1580156126fb575060005460ff166001145b61275e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610a3a565b6000805460ff191660011790558015612781576000805461ff0019166101001790555b61278e6020880188614717565b607a80546001600160a01b0319166001600160a01b03929092169190911790556127be6040880160208901614717565b606f80546001600160a01b0392909216600160581b02600160581b600160f81b03199092169190911790556127f96080880160608901614717565b607480546001600160a01b0392909216600160401b02600160401b600160e01b03199092169190911790556000805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad869055607661285d8682614e7d565b50607761286a8582614e7d565b5062093a8061287f6060890160408a01614534565b6001600160401b031611156128a757604051630cc9650760e41b815260040160405180910390fd5b6128b76060880160408901614534565b607980546001600160401b0392909216600160801b02600160801b600160c01b031990921691909117905562093a806128f660a0890160808a01614534565b6001600160401b0316111561291e57604051631d06e87960e01b815260040160405180910390fd5b61292e60a0880160808901614534565b607980546001600160c01b0316600160c01b6001600160401b03939093169290920291909117905567016345785d8a0000607055606f8054610100600160581b031916620708006101f560491b01179055607b8054600160a01b600160e81b031916670200000000000d2f60a71b1790556129a7613e6a565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd660007f000000000000000000000000000000000000000000000000000000000000000085856040516129fd9493929190614f65565b60405180910390a1801561230f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b54600160e01b900460ff1615612a7e576040516324eff8c360e01b815260040160405180910390fd5b606f5460ff1615612aa257604051630bc011ff60e21b815260040160405180910390fd5b806000819003612ac55760405163cb591a5f60e01b815260040160405180910390fd5b6103e8811115612ae857604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160c01b8204811691612b10918491600160801b900416614f9c565b1115612b2f5760405163c630a00d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b820481166000818152607260205260408120549193600160801b9004909216915b84811015612ce3576000878783818110612b7c57612b7c614caf565b9050602002810190612b8e9190614faf565b612b9790614fc5565b905083612ba381614d67565b82518051602091820120818501516040808701519051949950919450600093612bcf9386939101614d95565b60408051601f1981840301815291815281516020928301206001600160401b038916600090815260719093529120549091508114612c205760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b038616600090815260716020526040812055612c44600189614df1565b8403612c985742607b60149054906101000a90046001600160401b03168460400151612c709190614c49565b6001600160401b03161115612c985760405163c44a082160e01b815260040160405180910390fd5b848284602001514233604051602001612cb5959493929190614c70565b6040516020818303038152906040528051906020012094505050508080612cdb90614db8565b915050612b60565b50612cee8484614c49565b607380546001600160401b034281166001600160401b03199092168217808455604080516060810182528781526020808201958652600160401b9384900485168284019081528589166000818152607290935284832093518455965160019390930180549151871686026001600160801b031990921693871693909317179091558554938916600160801b02600160801b600160c01b031993860293909316600160401b600160c01b031990941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a546001600160a01b03163314612e0457604051634755657960e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612e5f57600080fd5b505af1158015612e73573d6000803e3d6000fd5b50505050611f9a613ede565b612e876132b6565b604080516060810182529384526001600160401b03928316602080860191825292841685830190815295841660009081526072909352912092518355516001909201805493518216600160401b026001600160801b03199094169290911691909117919091179055565b607b54600160e01b900460ff1615612f1c576040516324eff8c360e01b815260040160405180910390fd5b606f5460ff1615612f4057604051630bc011ff60e21b815260040160405180910390fd5b6000612f4a611c53565b905081811115612f6d57604051634732fdb560e01b815260040160405180910390fd5b611388831115612f90576040516328a69b1f60e21b815260040160405180910390fd5b612fc56001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084613aa8565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613025573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130499190614bb6565b60738054919250600160c01b9091046001600160401b031690601861306d83614d67565b91906101000a8154816001600160401b0302191690836001600160401b031602179055505084846040516130a2929190615040565b6040519081900381206130bb9183904290602001614d95565b60408051808303601f190181529181528151602092830120607354600160c01b90046001600160401b03166000908152607190935291205532330361314d57607354604080518381523360208201526060918101829052600091810191909152600160c01b9091046001600160401b03169060008051602061515f8339815191529060800160405180910390a2613198565b607360189054906101000a90046001600160401b03166001600160401b031660008051602061515f8339815191528233888860405161318f9493929190615050565b60405180910390a25b5050505050565b607a546001600160a01b031633146131ca57604051634755657960e01b815260040160405180910390fd5b60748054600160401b600160e01b031916600160401b6001600160a01b038416021790556040517f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90610f4b90839061442c565b6132266132b6565b6001600160a01b03811661328b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a3a565b6114eb81613d8e565b61329c6132b6565b6001600160401b0316600090815260756020526040902055565b336132bf61213b565b6001600160a01b031614611f9a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a3a565b600080613320612606565b90506001600160401b038816156133b6576079546001600160401b0390811690891611156133615760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b038089166000908152607860205260409020600281015481549094509091898116600160401b90920416146133b057604051632bd2e3e760e01b815260040160405180910390fd5b50613422565b6001600160401b0387166000908152607560205260409020549150816133ef576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316876001600160401b0316111561342257604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316866001600160401b0316116134545760405163b9b18f5760e01b815260040160405180910390fd5b60006134638888888689610f56565b9050600060008051602061511f8339815191526002836040516134869190614b9a565b602060405180830381855afa1580156134a3573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906134c69190614bb6565b6134d09190614be5565b604080516020810182528281529051634890ed4560e11b81529192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161352c9189919060040161507b565b602060405180830381865afa158015613549573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061356d91906150b6565b61358a576040516309bde33960e01b815260040160405180910390fd5b6135e433613598858b614dd1565b6001600160401b03166135a9612174565b6135b39190614e04565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190613f36565b50505050505050505050565b60006001600160401b03881615613684576079546001600160401b0390811690891611156136315760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088166000908152607860205260409020600281015481549092888116600160401b909204161461367e57604051632bd2e3e760e01b815260040160405180910390fd5b506136ec565b506001600160401b038516600090815260756020526040902054806136bc576040516324cbdcc360e11b815260040160405180910390fd5b6074546001600160401b0390811690871611156136ec57604051630f2b74f160e11b815260040160405180910390fd5b6079546001600160401b03908116908816118061371b5750876001600160401b0316876001600160401b031611155b8061373c57506079546001600160401b03600160401b909104811690881611155b1561375a5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260786020526040902054600160401b900481169086161461379e576040516332a2a77f60e01b815260040160405180910390fd5b60006137ad8787878588610f56565b9050600060008051602061511f8339815191526002836040516137d09190614b9a565b602060405180830381855afa1580156137ed573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906138109190614bb6565b61381a9190614be5565b604080516020810182528281529051634890ed4560e11b81529192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916138769188919060040161507b565b602060405180830381865afa158015613893573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138b791906150b6565b6138d4576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389166000908152607860205260409020600201548590036135e45760405163a47276bd60e01b815260040160405180910390fd5b6079546001600160401b03600160401b909104811690821611158061394357506079546001600160401b03908116908216115b156139615760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181166000818152607860209081526040808320805460748054600160401b928390049098166001600160401b03199098168817905560028201548786526075909452938290209290925560798054600160401b600160801b0319169390940292909217909255600182015490516333d6247d60e01b815260048101919091529091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b158015613a3a57600080fd5b505af1158015613a4e573d6000803e3d6000fd5b50505050826001600160401b0316816001600160401b03167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e8460020154604051613a9b91815260200190565b60405180910390a3505050565b6040516001600160a01b0380851660248301528316604482015260648101829052613b139085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613f6b565b50505050565b6079546001600160401b03600160401b8204811691161115611f9a57607954600090613b5690600160401b90046001600160401b03166001614c49565b9050613b6181611350565b156114eb57607954600090600290613b839084906001600160401b0316614dd1565b613b8d91906150d8565b613b979083614c49565b9050613ba281611350565b15613bb05761260281613910565b61260282613910565b6000613bc3612606565b905081600080613bd38484614dd1565b606f546001600160401b039182169250600091613bf69161010090041642614df1565b90505b846001600160401b0316846001600160401b031614613c77576001600160401b0380851660009081526072602052604090206001810154909116821015613c56576001810154600160401b90046001600160401b03169450613c71565b613c608686614dd1565b6001600160401b0316935050613c77565b50613bf9565b6000613c838484614df1565b905083811015613cda57808403600c8111613c9e5780613ca1565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281613cd057613cd0614bcf565b0460705550613d4a565b838103600c8111613ceb5780613cee565b600c5b90506000816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a76400000281613d2557613d25614bcf565b04905080607054670de0b6b3a76400000281613d4357613d43614bcf565b0460705550505b683635c9adc5dea000006070541115613d6f57683635c9adc5dea0000060705561230f565b633b9aca00607054101561230f57633b9aca0060705550505050505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613e3b57600080fd5b505af1158015613e4f573d6000803e3d6000fd5b50505050611f9a61403d565b6001600160a01b03163b151590565b600054610100900460ff16613ed55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610a3a565b611f9a33613d8e565b606f5460ff16613f0157604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6040516001600160a01b038316602482015260448101829052613f6690849063a9059cbb60e01b90606401613adc565b505050565b6000613fc0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166140999092919063ffffffff16565b805190915015613f665780806020019051810190613fde91906150b6565b613f665760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a3a565b606f5460ff161561406157604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b60606140a884846000856140b0565b949350505050565b6060824710156141115760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610a3a565b600080866001600160a01b0316858760405161412d9190614b9a565b60006040518083038185875af1925050503d806000811461416a576040519150601f19603f3d011682016040523d82523d6000602084013e61416f565b606091505b50915091506141808783838761418b565b979650505050505050565b606083156141f85782516000036141f1576141a585613e5b565b6141f15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a3a565b50816140a8565b6140a8838381511561420d5781518083602001fd5b8060405162461bcd60e51b8152600401610a3a91906142f7565b6001600160401b0391909116815260200190565b80356001600160401b03811681146125e957600080fd5b600080600080600060a0868803121561426a57600080fd5b6142738661423b565b94506142816020870161423b565b935061428f6040870161423b565b94979396509394606081013594506080013592915050565b60005b838110156142c25781810151838201526020016142aa565b50506000910152565b600081518084526142e38160208601602086016142a7565b601f01601f19169290920160200192915050565b60208152600061430a60208301846142cb565b9392505050565b806040810183101561432257600080fd5b92915050565b6000806000806000806000806101a0898b03121561434557600080fd5b61434e8961423b565b975061435c60208a0161423b565b965061436a60408a0161423b565b955060608901359450608089013593506143878a60a08b01614311565b925061016089018a81111561439b57600080fd5b60e08a0192506143ab8b82614311565b9150509295985092959890939650565b6000602082840312156143cd57600080fd5b813561ffff8116811461430a57600080fd5b600080600080600060a086880312156143f757600080fd5b6144008661423b565b945061440e6020870161423b565b94979496505050506040830135926060810135926080909101359150565b6001600160a01b0391909116815260200190565b80610300810183101561432257600080fd5b6000806000806000806103a0878903121561446c57600080fd5b6144758761423b565b95506144836020880161423b565b94506144916040880161423b565b935060608701359250608087013591506144ae8860a08901614440565b90509295509295509295565b60008060008060008060006103c0888a0312156144d657600080fd5b6144df8861423b565b96506144ed6020890161423b565b95506144fb6040890161423b565b94506145096060890161423b565b93506080880135925060a088013591506145268960c08a01614440565b905092959891949750929550565b60006020828403121561454657600080fd5b61430a8261423b565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261457657600080fd5b81356001600160401b03808211156145905761459061454f565b604051601f8301601f19908116603f011681019082821181831017156145b8576145b861454f565b816040528381528660208588010111156145d157600080fd5b836020870160208301376000602085830101528094505050505092915050565b80356001600160a01b03811681146125e957600080fd5b600080600080600060a0868803121561462057600080fd5b8535945060208601356001600160401b0381111561463d57600080fd5b61464988828901614565565b9450506040860135925061465f6060870161423b565b915061466d608087016145f1565b90509295509295909350565b60008083601f84011261468b57600080fd5b5081356001600160401b038111156146a257600080fd5b6020830191508360208260051b85010111156146bd57600080fd5b9250929050565b6000806000604084860312156146d957600080fd5b83356001600160401b038111156146ef57600080fd5b6146fb86828701614679565b909450925061470e9050602085016145f1565b90509250925092565b60006020828403121561472957600080fd5b61430a826145f1565b60006020828403121561474457600080fd5b5035919050565b60006020828403121561475d57600080fd5b81356001600160401b0381111561477357600080fd5b6140a884828501614565565b60008083601f84011261479157600080fd5b5081356001600160401b038111156147a857600080fd5b6020830191508360208285010111156146bd57600080fd5b6000806000806000808688036101208112156147db57600080fd5b60a08112156147e957600080fd5b5086955060a0860135945060c08601356001600160401b038082111561480e57600080fd5b61481a8a838b01614565565b955060e089013591508082111561483057600080fd5b61483c8a838b01614565565b945061010089013591508082111561485357600080fd5b5061486089828a0161477f565b979a9699509497509295939492505050565b6000806020838503121561488557600080fd5b82356001600160401b0381111561489b57600080fd5b6148a785828601614679565b90969095509350505050565b600080600080608085870312156148c957600080fd5b6148d28561423b565b9350602085013592506148e76040860161423b565b91506148f56060860161423b565b905092959194509250565b60008060006040848603121561491557600080fd5b83356001600160401b0381111561492b57600080fd5b6149378682870161477f565b909790965060209590950135949350505050565b6000806040838503121561495e57600080fd5b8235915061496e6020840161423b565b90509250929050565b60208082526058908201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60408201527f64696e6753746174654e756d206d757374206265206c657373206f7220657175606082015277616c207468616e206c61737450656e64696e67537461746560401b608082015260a00190565b6020808252604c908201526000805160206150ff83398151915260408201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760608201526b040e6e8c2e8ca40c4c2e8c6d60a31b608082015260a00190565b60208082526043908201526000805160206150ff83398151915260408201527f744e756d426174636820737461746520726f6f7420646f6573206e6f742065786060820152621a5cdd60ea1b608082015260a00190565b6020808252605d908201526000805160206150ff83398151915260408201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060608201527f7468616e2063757272656e744c61737456657269666965644261746368000000608082015260a00190565b60208082526057908201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60408201527f616c4e65774261746368206d75737420626520626967676572207468616e20636060820152760eae4e4cadce898c2e6e8accae4d2ccd2cac884c2e8c6d604b1b608082015260a00190565b60008251614bac8184602087016142a7565b9190910192915050565b600060208284031215614bc857600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082614bf457614bf4614bcf565b500690565b600181811c90821680614c0d57607f821691505b602082108103614c2d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03818116838216019080821115614c6957614c69614c33565b5092915050565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b634e487b7160e01b600052603260045260246000fd5b60008235607e19833603018112614bac57600080fd5b600060808236031215614ced57600080fd5b604051608081016001600160401b038082118383101715614d1057614d1061454f565b816040528435915080821115614d2557600080fd5b50614d3236828601614565565b82525060208301356020820152614d4b6040840161423b565b6040820152614d5c6060840161423b565b606082015292915050565b60006001600160401b038281166002600160401b03198101614d8b57614d8b614c33565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b600060018201614dca57614dca614c33565b5060010190565b6001600160401b03828116828216039080821115614c6957614c69614c33565b8181038181111561432257614322614c33565b808202811582820484141761432257614322614c33565b600082614e2a57614e2a614bcf565b500490565b601f821115613f6657600081815260208120601f850160051c81016020861015614e565750805b601f850160051c820191505b81811015614e7557828155600101614e62565b505050505050565b81516001600160401b03811115614e9657614e9661454f565b614eaa81614ea48454614bf9565b84614e2f565b602080601f831160018114614edf5760008415614ec75750858301515b600019600386901b1c1916600185901b178555614e75565b600085815260208120601f198616915b82811015614f0e57888601518255948401946001909101908401614eef565b5085821015614f2c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160401b03858116825284166020820152606060408201819052600090614f929083018486614f3c565b9695505050505050565b8082018082111561432257614322614c33565b60008235605e19833603018112614bac57600080fd5b600060608236031215614fd757600080fd5b604051606081016001600160401b038082118383101715614ffa57614ffa61454f565b81604052843591508082111561500f57600080fd5b5061501c36828601614565565b825250602083013560208201526150356040840161423b565b604082015292915050565b8183823760009101908152919050565b8481526001600160a01b0384166020820152606060408201819052600090614f929083018486614f3c565b61032081016103008085843782018360005b60018110156150ac57815183526020928301929091019060010161508d565b5050509392505050565b6000602082840312156150c857600080fd5b8151801515811461430a57600080fd5b60006001600160401b03838116806150f2576150f2614bcf565b9216919091049291505056fe506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6930644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001cb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fef94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931a2646970667358221220d209ad76bf8d76862efece6795ae783c6eb84d25d6fc3f86aec0769268c53a2564736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061033d5760003560e01c80638c3d7301116101bb5780638c3d73011461069f5780638da5cb5b146106a757806396dc3d39146106af57806399f5634e146106c25780639aa972a3146106ca5780639b796760146106dd5780639c9f3dfe146106f0578063a066215c14610703578063a3c573eb14610716578063ada8f9191461073d578063adc879e914610750578063afd23cbe14610777578063b4d63f581461079f578063b4f77ea9146107ff578063b6b0b09714610812578063ba58ae3914610839578063c0cad3021461084c578063c0ed84e01461085f578063c754c7ed14610867578063c89e42df14610881578063cfa8ed4714610894578063d02103ca146108ae578063d2e129f9146108d5578063d8d1091b146108e8578063d939b315146108fb578063dbc1697614610915578063e0d174411461091d578063e7a7ed0214610930578063e8bf92ed1461094a578063eaeb077b14610971578063ed6b010414610984578063f14916d614610998578063f2fde38b146109ab578063f851a440146109be578063f8b823e4146109d1578063fe16564f146109da57600080fd5b80630a0d9fbe146103425780630eaa86ea14610370578063107bf28c1461039157806310a01a72146103a657806315064c96146103bb5780631816b7e5146103d857806319d8ac61146103eb578063220d7899146103fe578063267822471461041157806329878983146104315780632b0006fa1461044b5780632c1f816a1461045e578063383b3be814610471578063394218e914610484578063423fa8561461049757806345605267146104b1578063458c0477146104cb5780634a1a89a7146104de5780634a910e6a146104f85780634e4877061461050b5780635392c5e01461051e578063542028d51461053e578063574f649e146105465780635e9145c9146105595780635ec919581461056c5780636046916914610574578063621dd4111461057c5780636b8616ce1461058f5780636ff512cc146105af578063715018a6146105c25780637215541a146105ca5780637fcb3653146105dd578063831c7ead146105f0578063837a473814610617578063841b24d714610685575b600080fd5b606f5461035a9061010090046001600160401b031681565b6040516103679190614227565b60405180910390f35b61038361037e366004614252565b6109ed565b604051908152602001610367565b610399610bbc565b60405161036791906142f7565b6103b96103b4366004614328565b610c4a565b005b606f546103c89060ff1681565b6040519015158152602001610367565b6103b96103e63660046143bb565b610e9d565b60735461035a906001600160401b031681565b61039961040c3660046143df565b610f56565b607b54610424906001600160a01b031681565b604051610367919061442c565b60745461042490600160401b90046001600160a01b031681565b6103b9610459366004614452565b6110b1565b6103b961046c3660046144ba565b6111ec565b6103c861047f366004614534565b611350565b6103b9610492366004614534565b611397565b60735461035a90600160401b90046001600160401b031681565b60735461035a90600160801b90046001600160401b031681565b60795461035a906001600160401b031681565b60795461035a90600160401b90046001600160401b031681565b6103b9610506366004614534565b61147f565b6103b9610519366004614534565b6114ee565b61038361052c366004614534565b60756020526000908152604090205481565b6103996115da565b610383610554366004614608565b6115e7565b6103b96105673660046146c4565b61162a565b6103b9611bc6565b610383611c53565b6103b961058a366004614452565b611c69565b61038361059d366004614534565b60716020526000908152604090205481565b6103b96105bd366004614717565b611f09565b6103b9611f88565b6103b96105d8366004614534565b611f9c565b60745461035a906001600160401b031681565b61035a7f000000000000000000000000000000000000000000000000000000000000000081565b61065a610625366004614732565b6078602052600090815260409020805460018201546002909201546001600160401b0380831693600160401b90930416919084565b604080516001600160401b039586168152949093166020850152918301526060820152608001610367565b60795461035a90600160c01b90046001600160401b031681565b6103b96120b7565b61042461213b565b6103b96106bd366004614534565b61214a565b610383612174565b6103b96106d83660046144ba565b612281565b6103b96106eb366004614534565b612318565b6103b96106fe366004614534565b61234c565b6103b9610711366004614534565b612438565b6104247f000000000000000000000000000000000000000000000000000000000000000081565b6103b961074b366004614717565b6124e0565b61035a7f000000000000000000000000000000000000000000000000000000000000000081565b606f5461078c90600160481b900461ffff1681565b60405161ffff9091168152602001610367565b6107da6107ad366004614534565b607260205260009081526040902080546001909101546001600160401b0380821691600160401b90041683565b604080519384526001600160401b039283166020850152911690820152606001610367565b6103b961080d366004614534565b612556565b6104247f000000000000000000000000000000000000000000000000000000000000000081565b6103c8610847366004614732565b612567565b6103b961085a36600461474b565b6125ee565b61035a612606565b607b5461035a90600160a01b90046001600160401b031681565b6103b961088f36600461474b565b612653565b606f5461042490600160581b90046001600160a01b031681565b6104247f000000000000000000000000000000000000000000000000000000000000000081565b6103b96108e33660046147c0565b6126ba565b6103b96108f6366004614872565b612a53565b60795461035a90600160801b90046001600160401b031681565b6103b9612dd9565b6103b961092b3660046148b3565b612e7f565b60735461035a90600160c01b90046001600160401b031681565b6104247f000000000000000000000000000000000000000000000000000000000000000081565b6103b961097f366004614900565b612ef1565b607b546103c890600160e01b900460ff1681565b6103b96109a6366004614717565b61319f565b6103b96109b9366004614717565b61321e565b607a54610424906001600160a01b031681565b61038360705481565b6103b96109e836600461494b565b613294565b60008060006109fa612606565b90506001600160401b03881615610a97576079546001600160401b039081169089161115610a435760405162461bcd60e51b8152600401610a3a90614977565b60405180910390fd5b6001600160401b038089166000908152607860205260409020600281015481549094509091898116600160401b9092041614610a915760405162461bcd60e51b8152600401610a3a906149f5565b50610b01565b6001600160401b038716600090815260756020526040902054915081610acf5760405162461bcd60e51b8152600401610a3a90614a55565b806001600160401b0316876001600160401b03161115610b015760405162461bcd60e51b8152600401610a3a90614aac565b806001600160401b0316866001600160401b031611610b325760405162461bcd60e51b8152600401610a3a90614b1d565b6000610b418888888689610f56565b9050600060008051602061511f833981519152600283604051610b649190614b9a565b602060405180830381855afa158015610b81573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610ba49190614bb6565b610bae9190614be5565b9a9950505050505050505050565b60778054610bc990614bf9565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf590614bf9565b8015610c425780601f10610c1757610100808354040283529160200191610c42565b820191906000526020600020905b815481529060010190602001808311610c2557829003601f168201915b505050505081565b610c526132b6565b600080610c5d612606565b90506001600160401b038a1615610cf1576079546001600160401b03908116908b161115610c9d5760405162461bcd60e51b8152600401610a3a90614977565b6001600160401b03808b1660009081526078602052604090206002810154815490945090918b8116600160401b9092041614610ceb5760405162461bcd60e51b8152600401610a3a906149f5565b50610d5b565b6001600160401b038916600090815260756020526040902054915081610d295760405162461bcd60e51b8152600401610a3a90614a55565b806001600160401b0316896001600160401b03161115610d5b5760405162461bcd60e51b8152600401610a3a90614aac565b806001600160401b0316886001600160401b031611610d8c5760405162461bcd60e51b8152600401610a3a90614b1d565b6000610d9b8a8a8a868b610f56565b607480546001600160401b0319166001600160401b038c811691821790925560009081526075602052604090208990556079549192501615610de857607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018990527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b158015610e4a57600080fd5b505af1158015610e5e573d6000803e3d6000fd5b50506040518981523392506001600160401b038c16915060008051602061513f8339815191529060200160405180910390a35050505050505050505050565b607a546001600160a01b03163314610ec857604051634755657960e01b815260040160405180910390fd5b6103e88161ffff161080610ee157506103ff8161ffff16115b15610eff57604051630984a67960e31b815260040160405180910390fd5b606f805461ffff60481b1916600160481b61ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b6001600160401b038086166000818152607260205260408082205493881682529020546060929115801590610f89575081155b15610fa75760405163340c614f60e11b815260040160405180910390fd5b80610fc5576040516366385b5160e01b815260040160405180910390fd5b610fce84612567565b610feb576040516305dae44f60e21b815260040160405180910390fd5b604080516001600160601b03193360601b166020820152603481019690965260548601929092526001600160c01b031960c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b607454600160401b90046001600160a01b031633146110e35760405163bbcbbc0560e01b815260040160405180910390fd5b6110f1868686868686613315565b607480546001600160401b0319166001600160401b038681169182179092556000908152607560205260409020839055607954161561113b57607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b15801561119d57600080fd5b505af11580156111b1573d6000803e3d6000fd5b50506040518481523392506001600160401b038716915060008051602061513f833981519152906020015b60405180910390a3505050505050565b607454600160401b90046001600160a01b0316331461121e5760405163bbcbbc0560e01b815260040160405180910390fd5b61122d878787878787876135f0565b607480546001600160401b0319166001600160401b038681169182179092556000908152607560205260409020839055607954161561127757607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b1580156112d957600080fd5b505af11580156112ed573d6000803e3d6000fd5b5050607980546001600160c01b031661127560c71b179055505060405182815233906001600160401b038616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b6079546001600160401b038281166000908152607860205260408120549092429261138692600160801b90920481169116614c49565b6001600160401b0316111592915050565b607a546001600160a01b031633146113c257604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b03821611156113ef57604051631d06e87960e01b815260040160405180910390fd5b606f5460ff1661142f576079546001600160401b03600160c01b90910481169082161061142f5760405163401636df60e01b815260040160405180910390fd5b607980546001600160c01b0316600160c01b6001600160401b038416021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190610f4b908390614227565b607454600160401b90046001600160a01b031633146114e257606f5460ff16156114bc57604051630bc011ff60e21b815260040160405180910390fd5b6114c581611350565b6114e257604051630674f25160e11b815260040160405180910390fd5b6114eb81613910565b50565b607a546001600160a01b0316331461151957604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b03821611156115465760405163f5e37f2f60e01b815260040160405180910390fd5b606f5460ff1661158657607b546001600160401b03600160a01b9091048116908216106115865760405163f5e37f2f60e01b815260040160405180910390fd5b607b8054600160a01b600160e01b031916600160a01b6001600160401b038416021790556040517fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90610f4b908390614227565b60768054610bc990614bf9565b6000858580519060200120858585604051602001611609959493929190614c70565b60405160208183030381529060405280519060200120905095945050505050565b606f5460ff161561164e57604051630bc011ff60e21b815260040160405180910390fd5b606f54600160581b90046001600160a01b03163314611680576040516311e7be1560e01b815260040160405180910390fd5b8160008190036116a35760405163cb591a5f60e01b815260040160405180910390fd5b6103e88111156116c657604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160401b82048116600081815260726020526040812054838516949293600160801b909304909216919082905b868110156119ad5760008a8a8381811061171b5761171b614caf565b905060200281019061172d9190614cc5565b61173690614cdb565b805180516020909101206060820151919250906001600160401b031615611825578561176181614d67565b9650506000818360200151846060015160405160200161178393929190614d95565b60408051601f1981840301815291815281516020928301206001600160401b038a166000908152607190935291205490915081146117d45760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b03808816600090815260716020526040808220919091556060850151908501519082169116101561181f57604051633fbd5c3960e11b815260040160405180910390fd5b5061190a565b6020820151158015906118c6575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303816000875af11580156118a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c49190614bb6565b155b156118e4576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c0101561190a576040516328a69b1f60e21b815260040160405180910390fd5b876001600160401b031682604001516001600160401b0316108061193a57504282604001516001600160401b0316115b15611958576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518d604051602001611979959493929190614c70565b60405160208183030381529060405280519060200120945081604001519750505080806119a590614db8565b9150506116ff565b506119b88685614c49565b6073549094506001600160401b03600160c01b909104811690841611156119f25760405163c630a00d60e01b815260040160405180910390fd5b60006119fe8285614dd1565b611a11906001600160401b031688614df1565b60408051606081018252858152426001600160401b03908116602080840191825260738054600160401b9081900485168688019081528d861660008181526072909552979093209551865592516001909501805492519585166001600160801b03199384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611ac65760738054600160801b600160c01b031916600160801b6001600160401b038716021790555b611b0b333083607054611ad99190614e04565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613aa8565b611b13613b19565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611b6e57600080fd5b505af1158015611b82573d6000803e3d6000fd5b50506040516001600160401b03881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a250505050505050505050565b607a546001600160a01b03163314611bf157604051634755657960e01b815260040160405180910390fd5b607b54600160e01b900460ff16611c1b5760405163f6ba91a160e01b815260040160405180910390fd5b607b805460ff60e01b191690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60006070546064611c649190614e04565b905090565b606f5460ff1615611c8d57604051630bc011ff60e21b815260040160405180910390fd5b6079546001600160401b038581166000908152607260205260409020600101544292611cc492600160c01b90910481169116614c49565b6001600160401b03161115611cec57604051638a0704d360e01b815260040160405180910390fd5b6103e8611cf98686614dd1565b6001600160401b03161115611d2157604051635acfba9d60e11b815260040160405180910390fd5b611d2f868686868686613315565b611d3884613bb9565b607954600160801b90046001600160401b0316600003611e1b57607480546001600160401b0319166001600160401b0386811691821790925560009081526075602052604090208390556079541615611d9c57607980546001600160801b03191690555b6040516333d6247d60e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b158015611dfe57600080fd5b505af1158015611e12573d6000803e3d6000fd5b50505050611ecc565b611e23613b19565b607980546001600160401b0316906000611e3c83614d67565b82546001600160401b039182166101009390930a928302928202191691909117909155604080516080810182524283168152878316602080830191825282840189815260608401898152607954871660009081526078909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b60405182815233906001600160401b038616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966906020016111dc565b607a546001600160a01b03163314611f3457604051634755657960e01b815260040160405180910390fd5b606f8054600160581b600160f81b031916600160581b6001600160a01b038416021790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610f4b90839061442c565b611f906132b6565b611f9a6000613d8e565b565b611fa461213b565b6001600160a01b0316336001600160a01b0316146120af576000611fc6612606565b9050806001600160401b0316826001600160401b031611611ffa5760405163812a372d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b9091048116908316118061203957506001600160401b0380831660009081526072602052604090206001015416155b1561205757604051632631700560e21b815260040160405180910390fd5b6001600160401b0380831660009081526072602052604090206001015442916120859162093a809116614c49565b6001600160401b031611156120ad5760405163692baaad60e11b815260040160405180910390fd5b505b6114eb613de0565b607b546001600160a01b031633146120e25760405163d1ec4b2360e01b815260040160405180910390fd5b607b54607a80546001600160a01b0319166001600160a01b0390921691821790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e916121319161442c565b60405180910390a1565b6033546001600160a01b031690565b6121526132b6565b607480546001600160401b0319166001600160401b0392909216919091179055565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016121c3919061442c565b602060405180830381865afa1580156121e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122049190614bb6565b90506000612210612606565b6073546001600160401b03600160401b820481169161224091600160801b8204811691600160c01b900416614dd1565b61224a9190614c49565b6122549190614dd1565b6001600160401b03169050806000036122705760009250505090565b61227a8183614e1b565b9250505090565b606f5460ff16156122a557604051630bc011ff60e21b815260040160405180910390fd5b6122b4878787878787876135f0565b6001600160401b0384166000908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a161230f613de0565b50505050505050565b6123206132b6565b607380546001600160401b03909216600160401b02600160401b600160801b0319909216919091179055565b607a546001600160a01b0316331461237757604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b03821611156123a457604051630cc9650760e41b815260040160405180910390fd5b606f5460ff166123e4576079546001600160401b03600160801b9091048116908216106123e45760405163048a05a960e41b815260040160405180910390fd5b60798054600160801b600160c01b031916600160801b6001600160401b038416021790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590610f4b908390614227565b607a546001600160a01b0316331461246357604051634755657960e01b815260040160405180910390fd5b62015180816001600160401b0316111561249057604051631c0cfbfd60e31b815260040160405180910390fd5b606f8054610100600160481b0319166101006001600160401b038416021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890610f4b908390614227565b607a546001600160a01b0316331461250b57604051634755657960e01b815260040160405180910390fd5b607b80546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610f4b90839061442c565b61255e6132b6565b6114eb81613bb9565b600067ffffffff000000016001600160401b03831610801561259d575067ffffffff00000001604083901c6001600160401b0316105b80156125bd575067ffffffff00000001608083901c6001600160401b0316105b80156125d4575067ffffffff0000000160c083901c105b156125e157506001919050565b506000919050565b919050565b6125f66132b6565b60776126028282614e7d565b5050565b6079546000906001600160401b03161561264357506079546001600160401b03908116600090815260786020526040902054600160401b90041690565b506074546001600160401b031690565b607a546001600160a01b0316331461267e57604051634755657960e01b815260040160405180910390fd5b607661268a8282614e7d565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610f4b91906142f7565b600054610100900460ff16158080156126da5750600054600160ff909116105b806126fb57506126e930613e5b565b1580156126fb575060005460ff166001145b61275e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610a3a565b6000805460ff191660011790558015612781576000805461ff0019166101001790555b61278e6020880188614717565b607a80546001600160a01b0319166001600160a01b03929092169190911790556127be6040880160208901614717565b606f80546001600160a01b0392909216600160581b02600160581b600160f81b03199092169190911790556127f96080880160608901614717565b607480546001600160a01b0392909216600160401b02600160401b600160e01b03199092169190911790556000805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad869055607661285d8682614e7d565b50607761286a8582614e7d565b5062093a8061287f6060890160408a01614534565b6001600160401b031611156128a757604051630cc9650760e41b815260040160405180910390fd5b6128b76060880160408901614534565b607980546001600160401b0392909216600160801b02600160801b600160c01b031990921691909117905562093a806128f660a0890160808a01614534565b6001600160401b0316111561291e57604051631d06e87960e01b815260040160405180910390fd5b61292e60a0880160808901614534565b607980546001600160c01b0316600160c01b6001600160401b03939093169290920291909117905567016345785d8a0000607055606f8054610100600160581b031916620708006101f560491b01179055607b8054600160a01b600160e81b031916670200000000000d2f60a71b1790556129a7613e6a565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd660007f000000000000000000000000000000000000000000000000000000000000000085856040516129fd9493929190614f65565b60405180910390a1801561230f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b54600160e01b900460ff1615612a7e576040516324eff8c360e01b815260040160405180910390fd5b606f5460ff1615612aa257604051630bc011ff60e21b815260040160405180910390fd5b806000819003612ac55760405163cb591a5f60e01b815260040160405180910390fd5b6103e8811115612ae857604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160c01b8204811691612b10918491600160801b900416614f9c565b1115612b2f5760405163c630a00d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b820481166000818152607260205260408120549193600160801b9004909216915b84811015612ce3576000878783818110612b7c57612b7c614caf565b9050602002810190612b8e9190614faf565b612b9790614fc5565b905083612ba381614d67565b82518051602091820120818501516040808701519051949950919450600093612bcf9386939101614d95565b60408051601f1981840301815291815281516020928301206001600160401b038916600090815260719093529120549091508114612c205760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b038616600090815260716020526040812055612c44600189614df1565b8403612c985742607b60149054906101000a90046001600160401b03168460400151612c709190614c49565b6001600160401b03161115612c985760405163c44a082160e01b815260040160405180910390fd5b848284602001514233604051602001612cb5959493929190614c70565b6040516020818303038152906040528051906020012094505050508080612cdb90614db8565b915050612b60565b50612cee8484614c49565b607380546001600160401b034281166001600160401b03199092168217808455604080516060810182528781526020808201958652600160401b9384900485168284019081528589166000818152607290935284832093518455965160019390930180549151871686026001600160801b031990921693871693909317179091558554938916600160801b02600160801b600160c01b031993860293909316600160401b600160c01b031990941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a546001600160a01b03163314612e0457604051634755657960e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612e5f57600080fd5b505af1158015612e73573d6000803e3d6000fd5b50505050611f9a613ede565b612e876132b6565b604080516060810182529384526001600160401b03928316602080860191825292841685830190815295841660009081526072909352912092518355516001909201805493518216600160401b026001600160801b03199094169290911691909117919091179055565b607b54600160e01b900460ff1615612f1c576040516324eff8c360e01b815260040160405180910390fd5b606f5460ff1615612f4057604051630bc011ff60e21b815260040160405180910390fd5b6000612f4a611c53565b905081811115612f6d57604051634732fdb560e01b815260040160405180910390fd5b611388831115612f90576040516328a69b1f60e21b815260040160405180910390fd5b612fc56001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084613aa8565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613025573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130499190614bb6565b60738054919250600160c01b9091046001600160401b031690601861306d83614d67565b91906101000a8154816001600160401b0302191690836001600160401b031602179055505084846040516130a2929190615040565b6040519081900381206130bb9183904290602001614d95565b60408051808303601f190181529181528151602092830120607354600160c01b90046001600160401b03166000908152607190935291205532330361314d57607354604080518381523360208201526060918101829052600091810191909152600160c01b9091046001600160401b03169060008051602061515f8339815191529060800160405180910390a2613198565b607360189054906101000a90046001600160401b03166001600160401b031660008051602061515f8339815191528233888860405161318f9493929190615050565b60405180910390a25b5050505050565b607a546001600160a01b031633146131ca57604051634755657960e01b815260040160405180910390fd5b60748054600160401b600160e01b031916600160401b6001600160a01b038416021790556040517f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90610f4b90839061442c565b6132266132b6565b6001600160a01b03811661328b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a3a565b6114eb81613d8e565b61329c6132b6565b6001600160401b0316600090815260756020526040902055565b336132bf61213b565b6001600160a01b031614611f9a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a3a565b600080613320612606565b90506001600160401b038816156133b6576079546001600160401b0390811690891611156133615760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b038089166000908152607860205260409020600281015481549094509091898116600160401b90920416146133b057604051632bd2e3e760e01b815260040160405180910390fd5b50613422565b6001600160401b0387166000908152607560205260409020549150816133ef576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316876001600160401b0316111561342257604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316866001600160401b0316116134545760405163b9b18f5760e01b815260040160405180910390fd5b60006134638888888689610f56565b9050600060008051602061511f8339815191526002836040516134869190614b9a565b602060405180830381855afa1580156134a3573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906134c69190614bb6565b6134d09190614be5565b604080516020810182528281529051634890ed4560e11b81529192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161352c9189919060040161507b565b602060405180830381865afa158015613549573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061356d91906150b6565b61358a576040516309bde33960e01b815260040160405180910390fd5b6135e433613598858b614dd1565b6001600160401b03166135a9612174565b6135b39190614e04565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190613f36565b50505050505050505050565b60006001600160401b03881615613684576079546001600160401b0390811690891611156136315760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088166000908152607860205260409020600281015481549092888116600160401b909204161461367e57604051632bd2e3e760e01b815260040160405180910390fd5b506136ec565b506001600160401b038516600090815260756020526040902054806136bc576040516324cbdcc360e11b815260040160405180910390fd5b6074546001600160401b0390811690871611156136ec57604051630f2b74f160e11b815260040160405180910390fd5b6079546001600160401b03908116908816118061371b5750876001600160401b0316876001600160401b031611155b8061373c57506079546001600160401b03600160401b909104811690881611155b1561375a5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260786020526040902054600160401b900481169086161461379e576040516332a2a77f60e01b815260040160405180910390fd5b60006137ad8787878588610f56565b9050600060008051602061511f8339815191526002836040516137d09190614b9a565b602060405180830381855afa1580156137ed573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906138109190614bb6565b61381a9190614be5565b604080516020810182528281529051634890ed4560e11b81529192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916138769188919060040161507b565b602060405180830381865afa158015613893573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138b791906150b6565b6138d4576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389166000908152607860205260409020600201548590036135e45760405163a47276bd60e01b815260040160405180910390fd5b6079546001600160401b03600160401b909104811690821611158061394357506079546001600160401b03908116908216115b156139615760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181166000818152607860209081526040808320805460748054600160401b928390049098166001600160401b03199098168817905560028201548786526075909452938290209290925560798054600160401b600160801b0319169390940292909217909255600182015490516333d6247d60e01b815260048101919091529091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b158015613a3a57600080fd5b505af1158015613a4e573d6000803e3d6000fd5b50505050826001600160401b0316816001600160401b03167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e8460020154604051613a9b91815260200190565b60405180910390a3505050565b6040516001600160a01b0380851660248301528316604482015260648101829052613b139085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613f6b565b50505050565b6079546001600160401b03600160401b8204811691161115611f9a57607954600090613b5690600160401b90046001600160401b03166001614c49565b9050613b6181611350565b156114eb57607954600090600290613b839084906001600160401b0316614dd1565b613b8d91906150d8565b613b979083614c49565b9050613ba281611350565b15613bb05761260281613910565b61260282613910565b6000613bc3612606565b905081600080613bd38484614dd1565b606f546001600160401b039182169250600091613bf69161010090041642614df1565b90505b846001600160401b0316846001600160401b031614613c77576001600160401b0380851660009081526072602052604090206001810154909116821015613c56576001810154600160401b90046001600160401b03169450613c71565b613c608686614dd1565b6001600160401b0316935050613c77565b50613bf9565b6000613c838484614df1565b905083811015613cda57808403600c8111613c9e5780613ca1565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281613cd057613cd0614bcf565b0460705550613d4a565b838103600c8111613ceb5780613cee565b600c5b90506000816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a76400000281613d2557613d25614bcf565b04905080607054670de0b6b3a76400000281613d4357613d43614bcf565b0460705550505b683635c9adc5dea000006070541115613d6f57683635c9adc5dea0000060705561230f565b633b9aca00607054101561230f57633b9aca0060705550505050505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613e3b57600080fd5b505af1158015613e4f573d6000803e3d6000fd5b50505050611f9a61403d565b6001600160a01b03163b151590565b600054610100900460ff16613ed55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610a3a565b611f9a33613d8e565b606f5460ff16613f0157604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6040516001600160a01b038316602482015260448101829052613f6690849063a9059cbb60e01b90606401613adc565b505050565b6000613fc0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166140999092919063ffffffff16565b805190915015613f665780806020019051810190613fde91906150b6565b613f665760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a3a565b606f5460ff161561406157604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b60606140a884846000856140b0565b949350505050565b6060824710156141115760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610a3a565b600080866001600160a01b0316858760405161412d9190614b9a565b60006040518083038185875af1925050503d806000811461416a576040519150601f19603f3d011682016040523d82523d6000602084013e61416f565b606091505b50915091506141808783838761418b565b979650505050505050565b606083156141f85782516000036141f1576141a585613e5b565b6141f15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a3a565b50816140a8565b6140a8838381511561420d5781518083602001fd5b8060405162461bcd60e51b8152600401610a3a91906142f7565b6001600160401b0391909116815260200190565b80356001600160401b03811681146125e957600080fd5b600080600080600060a0868803121561426a57600080fd5b6142738661423b565b94506142816020870161423b565b935061428f6040870161423b565b94979396509394606081013594506080013592915050565b60005b838110156142c25781810151838201526020016142aa565b50506000910152565b600081518084526142e38160208601602086016142a7565b601f01601f19169290920160200192915050565b60208152600061430a60208301846142cb565b9392505050565b806040810183101561432257600080fd5b92915050565b6000806000806000806000806101a0898b03121561434557600080fd5b61434e8961423b565b975061435c60208a0161423b565b965061436a60408a0161423b565b955060608901359450608089013593506143878a60a08b01614311565b925061016089018a81111561439b57600080fd5b60e08a0192506143ab8b82614311565b9150509295985092959890939650565b6000602082840312156143cd57600080fd5b813561ffff8116811461430a57600080fd5b600080600080600060a086880312156143f757600080fd5b6144008661423b565b945061440e6020870161423b565b94979496505050506040830135926060810135926080909101359150565b6001600160a01b0391909116815260200190565b80610300810183101561432257600080fd5b6000806000806000806103a0878903121561446c57600080fd5b6144758761423b565b95506144836020880161423b565b94506144916040880161423b565b935060608701359250608087013591506144ae8860a08901614440565b90509295509295509295565b60008060008060008060006103c0888a0312156144d657600080fd5b6144df8861423b565b96506144ed6020890161423b565b95506144fb6040890161423b565b94506145096060890161423b565b93506080880135925060a088013591506145268960c08a01614440565b905092959891949750929550565b60006020828403121561454657600080fd5b61430a8261423b565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261457657600080fd5b81356001600160401b03808211156145905761459061454f565b604051601f8301601f19908116603f011681019082821181831017156145b8576145b861454f565b816040528381528660208588010111156145d157600080fd5b836020870160208301376000602085830101528094505050505092915050565b80356001600160a01b03811681146125e957600080fd5b600080600080600060a0868803121561462057600080fd5b8535945060208601356001600160401b0381111561463d57600080fd5b61464988828901614565565b9450506040860135925061465f6060870161423b565b915061466d608087016145f1565b90509295509295909350565b60008083601f84011261468b57600080fd5b5081356001600160401b038111156146a257600080fd5b6020830191508360208260051b85010111156146bd57600080fd5b9250929050565b6000806000604084860312156146d957600080fd5b83356001600160401b038111156146ef57600080fd5b6146fb86828701614679565b909450925061470e9050602085016145f1565b90509250925092565b60006020828403121561472957600080fd5b61430a826145f1565b60006020828403121561474457600080fd5b5035919050565b60006020828403121561475d57600080fd5b81356001600160401b0381111561477357600080fd5b6140a884828501614565565b60008083601f84011261479157600080fd5b5081356001600160401b038111156147a857600080fd5b6020830191508360208285010111156146bd57600080fd5b6000806000806000808688036101208112156147db57600080fd5b60a08112156147e957600080fd5b5086955060a0860135945060c08601356001600160401b038082111561480e57600080fd5b61481a8a838b01614565565b955060e089013591508082111561483057600080fd5b61483c8a838b01614565565b945061010089013591508082111561485357600080fd5b5061486089828a0161477f565b979a9699509497509295939492505050565b6000806020838503121561488557600080fd5b82356001600160401b0381111561489b57600080fd5b6148a785828601614679565b90969095509350505050565b600080600080608085870312156148c957600080fd5b6148d28561423b565b9350602085013592506148e76040860161423b565b91506148f56060860161423b565b905092959194509250565b60008060006040848603121561491557600080fd5b83356001600160401b0381111561492b57600080fd5b6149378682870161477f565b909790965060209590950135949350505050565b6000806040838503121561495e57600080fd5b8235915061496e6020840161423b565b90509250929050565b60208082526058908201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60408201527f64696e6753746174654e756d206d757374206265206c657373206f7220657175606082015277616c207468616e206c61737450656e64696e67537461746560401b608082015260a00190565b6020808252604c908201526000805160206150ff83398151915260408201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760608201526b040e6e8c2e8ca40c4c2e8c6d60a31b608082015260a00190565b60208082526043908201526000805160206150ff83398151915260408201527f744e756d426174636820737461746520726f6f7420646f6573206e6f742065786060820152621a5cdd60ea1b608082015260a00190565b6020808252605d908201526000805160206150ff83398151915260408201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060608201527f7468616e2063757272656e744c61737456657269666965644261746368000000608082015260a00190565b60208082526057908201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60408201527f616c4e65774261746368206d75737420626520626967676572207468616e20636060820152760eae4e4cadce898c2e6e8accae4d2ccd2cac884c2e8c6d604b1b608082015260a00190565b60008251614bac8184602087016142a7565b9190910192915050565b600060208284031215614bc857600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082614bf457614bf4614bcf565b500690565b600181811c90821680614c0d57607f821691505b602082108103614c2d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03818116838216019080821115614c6957614c69614c33565b5092915050565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b634e487b7160e01b600052603260045260246000fd5b60008235607e19833603018112614bac57600080fd5b600060808236031215614ced57600080fd5b604051608081016001600160401b038082118383101715614d1057614d1061454f565b816040528435915080821115614d2557600080fd5b50614d3236828601614565565b82525060208301356020820152614d4b6040840161423b565b6040820152614d5c6060840161423b565b606082015292915050565b60006001600160401b038281166002600160401b03198101614d8b57614d8b614c33565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b600060018201614dca57614dca614c33565b5060010190565b6001600160401b03828116828216039080821115614c6957614c69614c33565b8181038181111561432257614322614c33565b808202811582820484141761432257614322614c33565b600082614e2a57614e2a614bcf565b500490565b601f821115613f6657600081815260208120601f850160051c81016020861015614e565750805b601f850160051c820191505b81811015614e7557828155600101614e62565b505050505050565b81516001600160401b03811115614e9657614e9661454f565b614eaa81614ea48454614bf9565b84614e2f565b602080601f831160018114614edf5760008415614ec75750858301515b600019600386901b1c1916600185901b178555614e75565b600085815260208120601f198616915b82811015614f0e57888601518255948401946001909101908401614eef565b5085821015614f2c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160401b03858116825284166020820152606060408201819052600090614f929083018486614f3c565b9695505050505050565b8082018082111561432257614322614c33565b60008235605e19833603018112614bac57600080fd5b600060608236031215614fd757600080fd5b604051606081016001600160401b038082118383101715614ffa57614ffa61454f565b81604052843591508082111561500f57600080fd5b5061501c36828601614565565b825250602083013560208201526150356040840161423b565b604082015292915050565b8183823760009101908152919050565b8481526001600160a01b0384166020820152606060408201819052600090614f929083018486614f3c565b61032081016103008085843782018360005b60018110156150ac57815183526020928301929091019060010161508d565b5050509392505050565b6000602082840312156150c857600080fd5b8151801515811461430a57600080fd5b60006001600160401b03838116806150f2576150f2614bcf565b9216919091049291505056fe506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6930644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001cb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fef94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931a2646970667358221220d209ad76bf8d76862efece6795ae783c6eb84d25d6fc3f86aec0769268c53a2564736f6c63430008140033", + "bytecode": "0x6101406040523480156200001257600080fd5b5060405162007064380380620070648339810160408190526200003591620000a5565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b0391821661010052166101205262000131565b6001600160a01b03811681146200008557600080fd5b50565b80516001600160401b0381168114620000a057600080fd5b919050565b60008060008060008060c08789031215620000bf57600080fd5b8651620000cc816200006f565b6020880151909650620000df816200006f565b6040880151909550620000f2816200006f565b606088015190945062000105816200006f565b9250620001156080880162000088565b91506200012560a0880162000088565b90509295509295509295565b60805160a05160c05160e0516101005161012051616e5e620002066000396000818161083001528181611a880152613ec80152600081816109c30152611a5e01526000818161098901528181612a2d015281816145610152615a90015260008181610b550152818161173801528181611bfb01528181611dcc0152818161263501528181612e06015281816147d901526155df015260008181610c1501528181614f3a0152615392015260008181610a92015281816129fb0152818161333a015281816147ad01526150280152616e5e6000f3fe608060405234801561001057600080fd5b506004361061048d5760003560e01c80638c3d73011161026b578063c754c7ed11610150578063e7a7ed02116100c8578063f14916d611610097578063f851a4401161007c578063f851a44014610c9d578063f8b823e414610cbd578063fe16564f14610cc657600080fd5b8063f14916d614610c77578063f2fde38b14610c8a57600080fd5b8063e7a7ed0214610be0578063e8bf92ed14610c10578063eaeb077b14610c37578063ed6b010414610c4a57600080fd5b8063d2e129f91161011f578063d939b31511610104578063d939b31514610b9d578063dbc1697614610bc5578063e0d1744114610bcd57600080fd5b8063d2e129f914610b77578063d8d1091b14610b8a57600080fd5b8063c754c7ed14610ae2578063c89e42df14610b0e578063cfa8ed4714610b21578063d02103ca14610b5057600080fd5b8063ada8f919116101e3578063b4f77ea9116101b2578063ba58ae3911610197578063ba58ae3914610ab4578063c0cad30214610ac7578063c0ed84e014610ada57600080fd5b8063b4f77ea914610a7a578063b6b0b09714610a8d57600080fd5b8063ada8f919146109ab578063adc879e9146109be578063afd23cbe146109e5578063b4d63f5814610a1357600080fd5b80639aa972a31161023a5780639c9f3dfe1161021f5780639c9f3dfe1461095e578063a066215c14610971578063a3c573eb1461098457600080fd5b80639aa972a3146109385780639b7967601461094b57600080fd5b80638c3d7301146108f75780638da5cb5b146108ff57806396dc3d391461091d57806399f5634e1461093057600080fd5b80634a1a89a711610391578063621dd411116103095780637215541a116102d8578063831c7ead116102bd578063831c7ead1461082b578063837a473814610852578063841b24d7146108c757600080fd5b80637215541a146108045780637fcb36531461081757600080fd5b8063621dd411146107b65780636b8616ce146107c95780636ff512cc146107e9578063715018a6146107fc57600080fd5b8063542028d5116103605780635e9145c9116103455780635e9145c9146107935780635ec91958146107a657806360469169146107ae57600080fd5b8063542028d5146106ea578063574f649e146106f257600080fd5b80634a1a89a7146106845780634a910e6a146106a45780634e487706146106b75780635392c5e0146106ca57600080fd5b80632678224711610424578063383b3be8116103f3578063423fa856116103d8578063423fa856146106285780634560526714610648578063458c04771461067057600080fd5b8063383b3be814610602578063394218e91461061557600080fd5b8063267822471461056b57806329878983146105b05780632b0006fa146105dc5780632c1f816a146105ef57600080fd5b806315064c961161046057806315064c96146105145780631816b7e51461053157806319d8ac6114610544578063220d78991461055857600080fd5b80630a0d9fbe146104925780630eaa86ea146104c9578063107bf28c146104ea57806310a01a72146104ff575b600080fd5b606f546104ab90610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6104dc6104d7366004616066565b610cd9565b6040519081526020016104c0565b6104f26111b1565b6040516104c09190616129565b61051261050d36600461615a565b61123f565b005b606f546105219060ff1681565b60405190151581526020016104c0565b61051261053f3660046161ed565b6117f7565b6073546104ab9067ffffffffffffffff1681565b6104f2610566366004616211565b61190f565b607b5461058b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104c0565b60745461058b9068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6105126105ea366004616270565b611ae6565b6105126105fd3660046162d8565b611cb6565b610521610610366004616352565b611ec4565b610512610623366004616352565b611f1a565b6073546104ab9068010000000000000000900467ffffffffffffffff1681565b6073546104ab90700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546104ab9067ffffffffffffffff1681565b6079546104ab9068010000000000000000900467ffffffffffffffff1681565b6105126106b2366004616352565b61209e565b6105126106c5366004616352565b612151565b6104dc6106d8366004616352565b60756020526000908152604090205481565b6104f26122d5565b6104dc61070036600461646b565b835160209485012060408051808701979097528681019190915260608087019490945260c09290921b7fffffffffffffffff00000000000000000000000000000000000000000000000016608086015290911b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888401528051808403607c018152609c9093019052815191012090565b6105126107a1366004616529565b6122e2565b610512612aec565b6104dc612bec565b6105126107c4366004616270565b612c02565b6104dc6107d7366004616352565b60716020526000908152604090205481565b6105126107f736600461657d565b612f8a565b61051261305f565b610512610812366004616352565b613073565b6074546104ab9067ffffffffffffffff1681565b6104ab7f000000000000000000000000000000000000000000000000000000000000000081565b61089b610860366004616598565b60786020526000908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016104c0565b6079546104ab907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6105126131e3565b60335473ffffffffffffffffffffffffffffffffffffffff1661058b565b61051261092b366004616352565b6132af565b6104dc6132f2565b6105126109463660046162d8565b61344b565b610512610959366004616352565b6134fc565b61051261096c366004616352565b61354b565b61051261097f366004616352565b6136c7565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b6105126109b936600461657d565b6137cd565b6104ab7f000000000000000000000000000000000000000000000000000000000000000081565b606f54610a00906901000000000000000000900461ffff1681565b60405161ffff90911681526020016104c0565b610a54610a21366004616352565b6072602052600090815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016104c0565b610512610a88366004616352565b613891565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b610521610ac2366004616598565b6138a2565b610512610ad53660046165b1565b61392c565b6104ab613944565b607b546104ab9074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b610512610b1c3660046165b1565b613999565b606f5461058b906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b610512610b85366004616628565b613a26565b610512610b983660046166db565b613f6c565b6079546104ab90700100000000000000000000000000000000900467ffffffffffffffff1681565b61051261450e565b610512610bdb36600461671d565b6145e7565b6073546104ab907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b610512610c4536600461676a565b614677565b607b54610521907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b610512610c8536600461657d565b614a6d565b610512610c9836600461657d565b614b3f565b607a5461058b9073ffffffffffffffffffffffffffffffffffffffff1681565b6104dc60705481565b610512610cd43660046167b6565b614bf3565b6000806000610ce6613944565b905067ffffffffffffffff881615610eb35760795467ffffffffffffffff9081169089161115610dc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a4015b60405180910390fd5b67ffffffffffffffff8089166000908152607860205260409020600281015481549094509091898116680100000000000000009092041614610ead576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610dba565b5061104c565b67ffffffffffffffff8716600090815260756020526040902054915081610f82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610dba565b8067ffffffffffffffff168767ffffffffffffffff16111561104c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610dba565b8067ffffffffffffffff168667ffffffffffffffff1611611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610dba565b6000611124888888868961190f565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161115991906167e2565b602060405180830381855afa158015611176573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061119991906167fe565b6111a39190616846565b9a9950505050505050505050565b607780546111be9061685a565b80601f01602080910402602001604051908101604052809291908181526020018280546111ea9061685a565b80156112375780601f1061120c57610100808354040283529160200191611237565b820191906000526020600020905b81548152906001019060200180831161121a57829003601f168201915b505050505081565b611247614c16565b600080611252613944565b905067ffffffffffffffff8a161561141a5760795467ffffffffffffffff908116908b16111561132a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a401610dba565b67ffffffffffffffff808b1660009081526078602052604090206002810154815490945090918b8116680100000000000000009092041614611414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610dba565b506115b3565b67ffffffffffffffff89166000908152607560205260409020549150816114e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610dba565b8067ffffffffffffffff168967ffffffffffffffff1611156115b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610dba565b8067ffffffffffffffff168867ffffffffffffffff161161167c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610dba565b600061168b8a8a8a868b61190f565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8c81169182179092556000908152607560205260409020899055607954919250161561170957607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018990527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b15801561179157600080fd5b505af11580156117a5573d6000803e3d6000fd5b505060405189815233925067ffffffffffffffff8c1691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe9060200160405180910390a35050505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611848576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff16108061186157506103ff8161ffff16115b15611898576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086166000818152607260205260408082205493881682529020546060929115801590611943575081155b1561197a576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806119b1576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119ba846138a2565b6119f0576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611b43576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b51868686868686614c97565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615611bcc57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015611c5457600080fd5b505af1158015611c68573d6000803e3d6000fd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611d13576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d228787878787878761505b565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615611d9d57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015611e2557600080fd5b505af1158015611e39573d6000803e3d6000fd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff82811660009081526078602052604081205490924292611f0892700100000000000000000000000000000000909204811691166168dc565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611f6b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611fb2576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166120215760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610612021576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001611904565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461214557606f5460ff1615612106576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61210f81611ec4565b612145576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61214e81615495565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146121a2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156121e9576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661225457607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610612254576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001611904565b607680546111be9061685a565b606f5460ff161561231f576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461237f576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160008190036123bb576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156123f7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000082048116600081815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b868110156128475760008a8a8381811061245f5761245f616904565b90506020028101906124719190616933565b61247a90616967565b8051805160209091012060608201519192509067ffffffffffffffff16156125f257856124a6816169f4565b965050600081836020015184606001516040516020016124fe93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260719093529120549091508114612587576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff80881660009081526071602052604080822091909155606085015190850151908216911610156125ec576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061272f565b6020820151158015906126b9575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015612693573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b791906167fe565b155b156126f0576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c0101561272f576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080612762575042826040015167ffffffffffffffff16115b15612799576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015197505050808061283f90616a1b565b915050612443565b5061285286856168dc565b60735490945067ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690841611156128bb576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006128c78285616a53565b6128db9067ffffffffffffffff1688616a74565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d861660008181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c84169116179302929092179055909150828116908516146129d157607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b612a233330836070546129e49190616a87565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906156a8565b612a2b61578a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612a9357600080fd5b505af1158015612aa7573d6000803e3d6000fd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612b3d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16612b99576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60006070546064612bfd9190616a87565b905090565b606f5460ff1615612c3f576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581166000908152607260205260409020600101544292612c8c927801000000000000000000000000000000000000000000000000909104811691166168dc565b67ffffffffffffffff161115612cce576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612cdb8686616a53565b67ffffffffffffffff161115612d1d576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d2b868686868686614c97565b612d3484615837565b607954700100000000000000000000000000000000900467ffffffffffffffff16600003612e7c57607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615612dd757607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015612e5f57600080fd5b505af1158015612e73573d6000803e3d6000fd5b50505050612f4c565b612e8461578a565b6079805467ffffffffffffffff16906000612e9e836169f4565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487166000908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001611ca6565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612fdb576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001611904565b613067614c16565b6130716000615a17565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146131db57600061309c613944565b90508067ffffffffffffffff168267ffffffffffffffff16116130eb576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000090910481169083161180613131575067ffffffffffffffff80831660009081526072602052604090206001015416155b15613168576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff80831660009081526072602052604090206001015442916131979162093a8091166168dc565b67ffffffffffffffff1611156131d9576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61214e615a8e565b607b5473ffffffffffffffffffffffffffffffffffffffff163314613234576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6132b7614c16565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015613381573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133a591906167fe565b905060006133b1613944565b60735467ffffffffffffffff6801000000000000000082048116916134099170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416616a53565b61341391906168dc565b61341d9190616a53565b67ffffffffffffffff1690508060000361343a5760009250505090565b6134448183616a9e565b9250505090565b606f5460ff1615613488576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134978787878787878761505b565b67ffffffffffffffff84166000908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16134f3615a8e565b50505050505050565b613504614c16565b6073805467ffffffffffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461359c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156135e3576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661364a5760795467ffffffffffffffff70010000000000000000000000000000000090910481169082161061364a576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001611904565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613718576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff16111561375f576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001611904565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461381e576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001611904565b613899614c16565b61214e81615837565b600067ffffffff0000000167ffffffffffffffff83161080156138da575067ffffffff00000001604083901c67ffffffffffffffff16105b80156138fb575067ffffffff00000001608083901c67ffffffffffffffff16105b8015613912575067ffffffff0000000160c083901c105b1561391f57506001919050565b506000919050565b919050565b613934614c16565b60776139408282616b00565b5050565b60795460009067ffffffffffffffff1615613988575060795467ffffffffffffffff9081166000908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146139ea576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60766139f68282616b00565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516119049190616129565b600054610100900460ff1615808015613a465750600054600160ff909116105b80613a605750303b158015613a60575060005460ff166001145b613aec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610dba565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015613b4a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b613b57602088018861657d565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055613bac604088016020890161657d565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055613c11608088016060890161657d565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790556000805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076613c9c8682616b00565b506077613ca98582616b00565b5062093a80613cbe6060890160408a01616352565b67ffffffffffffffff161115613d00576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d106060880160408901616352565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80613d7260a0890160808a01616352565b67ffffffffffffffff161115613db4576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613dc460a0880160808901616352565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613ea3615b16565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd660007f00000000000000000000000000000000000000000000000000000000000000008585604051613ef99493929190616c63565b60405180910390a180156134f357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613fc9576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614006576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003614042576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561407e576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff780100000000000000000000000000000000000000000000000082048116916140c9918491700100000000000000000000000000000000900416616c9b565b1115614101576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000008204811660008181526072602052604081205491937001000000000000000000000000000000009004909216915b848110156143ab57600087878381811061416157614161616904565b90506020028101906141739190616cae565b61417c90616ce2565b905083614188816169f4565b825180516020918201208185015160408087015190519499509194506000936141ea9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260719093529120549091508114614273576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260716020526040812055614298600189616a74565b84036143075742607b60149054906101000a900467ffffffffffffffff1684604001516142c591906168dc565b67ffffffffffffffff161115614307576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806143a390616a1b565b915050614145565b506143b684846168dc565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589166000818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461455f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156145c757600080fd5b505af11580156145db573d6000803e3d6000fd5b50505050613071615bb6565b6145ef614c16565b6040805160608101825293845267ffffffffffffffff92831660208086019182529284168583019081529584166000908152607290935291209251835551600190920180549351821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169290911691909117919091179055565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16156146d4576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614711576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061471b612bec565b905081811115614757576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115614793576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6147d573ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846156a8565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614842573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061486691906167fe565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff169060186148a0836169f4565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505084846040516148d7929190616d5e565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1660009081526071909352912055323303614a0757607354604080518381523360208201526060918101829052600091810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2614a66565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051614a5d9493929190616d6e565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314614abe576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001611904565b614b47614c16565b73ffffffffffffffffffffffffffffffffffffffff8116614bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610dba565b61214e81615a17565b614bfb614c16565b67ffffffffffffffff16600090815260756020526040902055565b60335473ffffffffffffffffffffffffffffffffffffffff163314613071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dba565b600080614ca2613944565b905067ffffffffffffffff881615614d725760795467ffffffffffffffff9081169089161115614cfe576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089166000908152607860205260409020600281015481549094509091898116680100000000000000009092041614614d6c576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614e13565b67ffffffffffffffff8716600090815260756020526040902054915081614dc5576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115614e13576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611614e60576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000614e6f888888868961190f565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051614ea491906167e2565b602060405180830381855afa158015614ec1573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190614ee491906167fe565b614eee9190616846565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91614f7091899190600401616da4565b602060405180830381865afa158015614f8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614fb19190616ddf565b614fe7576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61504f33614ff5858b616a53565b67ffffffffffffffff166150076132f2565b6150119190616a87565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190615c45565b50505050505050505050565b600067ffffffffffffffff8816156151295760795467ffffffffffffffff90811690891611156150b7576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088166000908152607860205260409020600281015481549092888116680100000000000000009092041614615123576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506151c5565b5067ffffffffffffffff85166000908152607560205260409020548061517b576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff90811690871611156151c5576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff90811690881611806151f757508767ffffffffffffffff168767ffffffffffffffff1611155b8061521e575060795467ffffffffffffffff68010000000000000000909104811690881611155b15615255576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781166000908152607860205260409020546801000000000000000090048116908616146152b8576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006152c7878787858861190f565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516152fc91906167e2565b602060405180830381855afa158015615319573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061533c91906167fe565b6153469190616846565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916153c891889190600401616da4565b602060405180830381865afa1580156153e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906154099190616ddf565b61543f576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff891660009081526078602052604090206002015485900361504f576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff6801000000000000000090910481169082161115806154cf575060795467ffffffffffffffff908116908216115b15615506576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff818116600081815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b15801561563857600080fd5b505af115801561564c573d6000803e3d6000fd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161569b91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526157849085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152615ca0565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115613071576079546000906157d39068010000000000000000900467ffffffffffffffff1660016168dc565b90506157de81611ec4565b1561214e5760795460009060029061580190849067ffffffffffffffff16616a53565b61580b9190616e01565b61581590836168dc565b905061582081611ec4565b1561582e5761394081615495565b61394082615495565b6000615841613944565b9050816000806158518484616a53565b606f5467ffffffffffffffff91821692506000916158759161010090041642616a74565b90505b8467ffffffffffffffff168467ffffffffffffffff16146159005767ffffffffffffffff808516600090815260726020526040902060018101549091168210156158de57600181015468010000000000000000900467ffffffffffffffff1694506158fa565b6158e88686616a53565b67ffffffffffffffff16935050615900565b50615878565b600061590c8484616a74565b90508381101561596357808403600c8111615927578061592a565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a607054028161595957615959616817565b04607055506159d3565b838103600c81116159745780615977565b600c5b90506000816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a764000002816159ae576159ae616817565b04905080607054670de0b6b3a764000002816159cc576159cc616817565b0460705550505b683635c9adc5dea0000060705411156159f857683635c9adc5dea000006070556134f3565b633b9aca0060705410156134f357633b9aca0060705550505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b158015615af657600080fd5b505af1158015615b0a573d6000803e3d6000fd5b50505050613071615dac565b600054610100900460ff16615bad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610dba565b61307133615a17565b606f5460ff16615bf2576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052615c9b9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401615702565b505050565b6000615d02826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615e3f9092919063ffffffff16565b805190915015615c9b5780806020019051810190615d209190616ddf565b615c9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610dba565b606f5460ff1615615de9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b6060615e4e8484600085615e56565b949350505050565b606082471015615ee8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610dba565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051615f1191906167e2565b60006040518083038185875af1925050503d8060008114615f4e576040519150601f19603f3d011682016040523d82523d6000602084013e615f53565b606091505b5091509150615f6487838387615f6f565b979650505050505050565b60608315616005578251600003615ffe5773ffffffffffffffffffffffffffffffffffffffff85163b615ffe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610dba565b5081615e4e565b615e4e838381511561601a5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dba9190616129565b803567ffffffffffffffff8116811461392757600080fd5b600080600080600060a0868803121561607e57600080fd5b6160878661604e565b94506160956020870161604e565b93506160a36040870161604e565b94979396509394606081013594506080013592915050565b60005b838110156160d65781810151838201526020016160be565b50506000910152565b600081518084526160f78160208601602086016160bb565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061613c60208301846160df565b9392505050565b806040810183101561615457600080fd5b92915050565b6000806000806000806000806101a0898b03121561617757600080fd5b6161808961604e565b975061618e60208a0161604e565b965061619c60408a0161604e565b955060608901359450608089013593506161b98a60a08b01616143565b925061016089018a8111156161cd57600080fd5b60e08a0192506161dd8b82616143565b9150509295985092959890939650565b6000602082840312156161ff57600080fd5b813561ffff8116811461613c57600080fd5b600080600080600060a0868803121561622957600080fd5b6162328661604e565b94506162406020870161604e565b94979496505050506040830135926060810135926080909101359150565b80610300810183101561615457600080fd5b6000806000806000806103a0878903121561628a57600080fd5b6162938761604e565b95506162a16020880161604e565b94506162af6040880161604e565b935060608701359250608087013591506162cc8860a0890161625e565b90509295509295509295565b60008060008060008060006103c0888a0312156162f457600080fd5b6162fd8861604e565b965061630b6020890161604e565b95506163196040890161604e565b94506163276060890161604e565b93506080880135925060a088013591506163448960c08a0161625e565b905092959891949750929550565b60006020828403121561636457600080fd5b61613c8261604e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126163ad57600080fd5b813567ffffffffffffffff808211156163c8576163c861636d565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561640e5761640e61636d565b8160405283815286602085880101111561642757600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461392757600080fd5b600080600080600060a0868803121561648357600080fd5b85359450602086013567ffffffffffffffff8111156164a157600080fd5b6164ad8882890161639c565b945050604086013592506164c36060870161604e565b91506164d160808701616447565b90509295509295909350565b60008083601f8401126164ef57600080fd5b50813567ffffffffffffffff81111561650757600080fd5b6020830191508360208260051b850101111561652257600080fd5b9250929050565b60008060006040848603121561653e57600080fd5b833567ffffffffffffffff81111561655557600080fd5b616561868287016164dd565b9094509250616574905060208501616447565b90509250925092565b60006020828403121561658f57600080fd5b61613c82616447565b6000602082840312156165aa57600080fd5b5035919050565b6000602082840312156165c357600080fd5b813567ffffffffffffffff8111156165da57600080fd5b615e4e8482850161639c565b60008083601f8401126165f857600080fd5b50813567ffffffffffffffff81111561661057600080fd5b60208301915083602082850101111561652257600080fd5b60008060008060008086880361012081121561664357600080fd5b60a081121561665157600080fd5b5086955060a0870135945060c087013567ffffffffffffffff8082111561667757600080fd5b6166838a838b0161639c565b955060e089013591508082111561669957600080fd5b6166a58a838b0161639c565b94506101008901359150808211156166bc57600080fd5b506166c989828a016165e6565b979a9699509497509295939492505050565b600080602083850312156166ee57600080fd5b823567ffffffffffffffff81111561670557600080fd5b616711858286016164dd565b90969095509350505050565b6000806000806080858703121561673357600080fd5b61673c8561604e565b9350602085013592506167516040860161604e565b915061675f6060860161604e565b905092959194509250565b60008060006040848603121561677f57600080fd5b833567ffffffffffffffff81111561679657600080fd5b6167a2868287016165e6565b909790965060209590950135949350505050565b600080604083850312156167c957600080fd5b823591506167d96020840161604e565b90509250929050565b600082516167f48184602087016160bb565b9190910192915050565b60006020828403121561681057600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261685557616855616817565b500690565b600181811c9082168061686e57607f821691505b6020821081036168a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8181168382160190808211156168fd576168fd6168ad565b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126167f457600080fd5b60006080823603121561697957600080fd5b6040516080810167ffffffffffffffff828210818311171561699d5761699d61636d565b8160405284359150808211156169b257600080fd5b506169bf3682860161639c565b825250602083013560208201526169d86040840161604e565b60408201526169e96060840161604e565b606082015292915050565b600067ffffffffffffffff808316818103616a1157616a116168ad565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203616a4c57616a4c6168ad565b5060010190565b67ffffffffffffffff8281168282160390808211156168fd576168fd6168ad565b81810381811115616154576161546168ad565b8082028115828204841417616154576161546168ad565b600082616aad57616aad616817565b500490565b601f821115615c9b57600081815260208120601f850160051c81016020861015616ad95750805b601f850160051c820191505b81811015616af857828155600101616ae5565b505050505050565b815167ffffffffffffffff811115616b1a57616b1a61636d565b616b2e81616b28845461685a565b84616ab2565b602080601f831160018114616b815760008415616b4b5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555616af8565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015616bce57888601518255948401946001909101908401616baf565b5085821015616c0a57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600067ffffffffffffffff808716835280861660208401525060606040830152616c91606083018486616c1a565b9695505050505050565b80820180821115616154576161546168ad565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126167f457600080fd5b600060608236031215616cf457600080fd5b6040516060810167ffffffffffffffff8282108183111715616d1857616d1861636d565b816040528435915080821115616d2d57600080fd5b50616d3a3682860161639c565b82525060208301356020820152616d536040840161604e565b604082015292915050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000616c91606083018486616c1a565b61032081016103008085843782018360005b6001811015616dd5578151835260209283019290910190600101616db6565b5050509392505050565b600060208284031215616df157600080fd5b8151801515811461613c57600080fd5b600067ffffffffffffffff80841680616e1c57616e1c616817565b9216919091049291505056fea26469706673582212200d16bdfde0b321a22abe6c2d141b1b0579321cd6fce8fe87dd8ebcb5f5c5aaca64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061048d5760003560e01c80638c3d73011161026b578063c754c7ed11610150578063e7a7ed02116100c8578063f14916d611610097578063f851a4401161007c578063f851a44014610c9d578063f8b823e414610cbd578063fe16564f14610cc657600080fd5b8063f14916d614610c77578063f2fde38b14610c8a57600080fd5b8063e7a7ed0214610be0578063e8bf92ed14610c10578063eaeb077b14610c37578063ed6b010414610c4a57600080fd5b8063d2e129f91161011f578063d939b31511610104578063d939b31514610b9d578063dbc1697614610bc5578063e0d1744114610bcd57600080fd5b8063d2e129f914610b77578063d8d1091b14610b8a57600080fd5b8063c754c7ed14610ae2578063c89e42df14610b0e578063cfa8ed4714610b21578063d02103ca14610b5057600080fd5b8063ada8f919116101e3578063b4f77ea9116101b2578063ba58ae3911610197578063ba58ae3914610ab4578063c0cad30214610ac7578063c0ed84e014610ada57600080fd5b8063b4f77ea914610a7a578063b6b0b09714610a8d57600080fd5b8063ada8f919146109ab578063adc879e9146109be578063afd23cbe146109e5578063b4d63f5814610a1357600080fd5b80639aa972a31161023a5780639c9f3dfe1161021f5780639c9f3dfe1461095e578063a066215c14610971578063a3c573eb1461098457600080fd5b80639aa972a3146109385780639b7967601461094b57600080fd5b80638c3d7301146108f75780638da5cb5b146108ff57806396dc3d391461091d57806399f5634e1461093057600080fd5b80634a1a89a711610391578063621dd411116103095780637215541a116102d8578063831c7ead116102bd578063831c7ead1461082b578063837a473814610852578063841b24d7146108c757600080fd5b80637215541a146108045780637fcb36531461081757600080fd5b8063621dd411146107b65780636b8616ce146107c95780636ff512cc146107e9578063715018a6146107fc57600080fd5b8063542028d5116103605780635e9145c9116103455780635e9145c9146107935780635ec91958146107a657806360469169146107ae57600080fd5b8063542028d5146106ea578063574f649e146106f257600080fd5b80634a1a89a7146106845780634a910e6a146106a45780634e487706146106b75780635392c5e0146106ca57600080fd5b80632678224711610424578063383b3be8116103f3578063423fa856116103d8578063423fa856146106285780634560526714610648578063458c04771461067057600080fd5b8063383b3be814610602578063394218e91461061557600080fd5b8063267822471461056b57806329878983146105b05780632b0006fa146105dc5780632c1f816a146105ef57600080fd5b806315064c961161046057806315064c96146105145780631816b7e51461053157806319d8ac6114610544578063220d78991461055857600080fd5b80630a0d9fbe146104925780630eaa86ea146104c9578063107bf28c146104ea57806310a01a72146104ff575b600080fd5b606f546104ab90610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6104dc6104d7366004616066565b610cd9565b6040519081526020016104c0565b6104f26111b1565b6040516104c09190616129565b61051261050d36600461615a565b61123f565b005b606f546105219060ff1681565b60405190151581526020016104c0565b61051261053f3660046161ed565b6117f7565b6073546104ab9067ffffffffffffffff1681565b6104f2610566366004616211565b61190f565b607b5461058b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104c0565b60745461058b9068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6105126105ea366004616270565b611ae6565b6105126105fd3660046162d8565b611cb6565b610521610610366004616352565b611ec4565b610512610623366004616352565b611f1a565b6073546104ab9068010000000000000000900467ffffffffffffffff1681565b6073546104ab90700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546104ab9067ffffffffffffffff1681565b6079546104ab9068010000000000000000900467ffffffffffffffff1681565b6105126106b2366004616352565b61209e565b6105126106c5366004616352565b612151565b6104dc6106d8366004616352565b60756020526000908152604090205481565b6104f26122d5565b6104dc61070036600461646b565b835160209485012060408051808701979097528681019190915260608087019490945260c09290921b7fffffffffffffffff00000000000000000000000000000000000000000000000016608086015290911b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888401528051808403607c018152609c9093019052815191012090565b6105126107a1366004616529565b6122e2565b610512612aec565b6104dc612bec565b6105126107c4366004616270565b612c02565b6104dc6107d7366004616352565b60716020526000908152604090205481565b6105126107f736600461657d565b612f8a565b61051261305f565b610512610812366004616352565b613073565b6074546104ab9067ffffffffffffffff1681565b6104ab7f000000000000000000000000000000000000000000000000000000000000000081565b61089b610860366004616598565b60786020526000908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016104c0565b6079546104ab907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6105126131e3565b60335473ffffffffffffffffffffffffffffffffffffffff1661058b565b61051261092b366004616352565b6132af565b6104dc6132f2565b6105126109463660046162d8565b61344b565b610512610959366004616352565b6134fc565b61051261096c366004616352565b61354b565b61051261097f366004616352565b6136c7565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b6105126109b936600461657d565b6137cd565b6104ab7f000000000000000000000000000000000000000000000000000000000000000081565b606f54610a00906901000000000000000000900461ffff1681565b60405161ffff90911681526020016104c0565b610a54610a21366004616352565b6072602052600090815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016104c0565b610512610a88366004616352565b613891565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b610521610ac2366004616598565b6138a2565b610512610ad53660046165b1565b61392c565b6104ab613944565b607b546104ab9074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b610512610b1c3660046165b1565b613999565b606f5461058b906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b610512610b85366004616628565b613a26565b610512610b983660046166db565b613f6c565b6079546104ab90700100000000000000000000000000000000900467ffffffffffffffff1681565b61051261450e565b610512610bdb36600461671d565b6145e7565b6073546104ab907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b610512610c4536600461676a565b614677565b607b54610521907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b610512610c8536600461657d565b614a6d565b610512610c9836600461657d565b614b3f565b607a5461058b9073ffffffffffffffffffffffffffffffffffffffff1681565b6104dc60705481565b610512610cd43660046167b6565b614bf3565b6000806000610ce6613944565b905067ffffffffffffffff881615610eb35760795467ffffffffffffffff9081169089161115610dc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a4015b60405180910390fd5b67ffffffffffffffff8089166000908152607860205260409020600281015481549094509091898116680100000000000000009092041614610ead576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610dba565b5061104c565b67ffffffffffffffff8716600090815260756020526040902054915081610f82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610dba565b8067ffffffffffffffff168767ffffffffffffffff16111561104c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610dba565b8067ffffffffffffffff168667ffffffffffffffff1611611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610dba565b6000611124888888868961190f565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161115991906167e2565b602060405180830381855afa158015611176573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061119991906167fe565b6111a39190616846565b9a9950505050505050505050565b607780546111be9061685a565b80601f01602080910402602001604051908101604052809291908181526020018280546111ea9061685a565b80156112375780601f1061120c57610100808354040283529160200191611237565b820191906000526020600020905b81548152906001019060200180831161121a57829003601f168201915b505050505081565b611247614c16565b600080611252613944565b905067ffffffffffffffff8a161561141a5760795467ffffffffffffffff908116908b16111561132a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a401610dba565b67ffffffffffffffff808b1660009081526078602052604090206002810154815490945090918b8116680100000000000000009092041614611414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610dba565b506115b3565b67ffffffffffffffff89166000908152607560205260409020549150816114e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610dba565b8067ffffffffffffffff168967ffffffffffffffff1611156115b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610dba565b8067ffffffffffffffff168867ffffffffffffffff161161167c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610dba565b600061168b8a8a8a868b61190f565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8c81169182179092556000908152607560205260409020899055607954919250161561170957607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018990527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b15801561179157600080fd5b505af11580156117a5573d6000803e3d6000fd5b505060405189815233925067ffffffffffffffff8c1691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe9060200160405180910390a35050505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611848576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff16108061186157506103ff8161ffff16115b15611898576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086166000818152607260205260408082205493881682529020546060929115801590611943575081155b1561197a576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806119b1576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119ba846138a2565b6119f0576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611b43576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b51868686868686614c97565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615611bcc57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015611c5457600080fd5b505af1158015611c68573d6000803e3d6000fd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611d13576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d228787878787878761505b565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615611d9d57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015611e2557600080fd5b505af1158015611e39573d6000803e3d6000fd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff82811660009081526078602052604081205490924292611f0892700100000000000000000000000000000000909204811691166168dc565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611f6b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611fb2576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166120215760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610612021576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001611904565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461214557606f5460ff1615612106576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61210f81611ec4565b612145576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61214e81615495565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146121a2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156121e9576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661225457607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610612254576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001611904565b607680546111be9061685a565b606f5460ff161561231f576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461237f576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160008190036123bb576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156123f7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000082048116600081815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b868110156128475760008a8a8381811061245f5761245f616904565b90506020028101906124719190616933565b61247a90616967565b8051805160209091012060608201519192509067ffffffffffffffff16156125f257856124a6816169f4565b965050600081836020015184606001516040516020016124fe93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260719093529120549091508114612587576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff80881660009081526071602052604080822091909155606085015190850151908216911610156125ec576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061272f565b6020820151158015906126b9575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015612693573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b791906167fe565b155b156126f0576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c0101561272f576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080612762575042826040015167ffffffffffffffff16115b15612799576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015197505050808061283f90616a1b565b915050612443565b5061285286856168dc565b60735490945067ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690841611156128bb576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006128c78285616a53565b6128db9067ffffffffffffffff1688616a74565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d861660008181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c84169116179302929092179055909150828116908516146129d157607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b612a233330836070546129e49190616a87565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906156a8565b612a2b61578a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612a9357600080fd5b505af1158015612aa7573d6000803e3d6000fd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612b3d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16612b99576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60006070546064612bfd9190616a87565b905090565b606f5460ff1615612c3f576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581166000908152607260205260409020600101544292612c8c927801000000000000000000000000000000000000000000000000909104811691166168dc565b67ffffffffffffffff161115612cce576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612cdb8686616a53565b67ffffffffffffffff161115612d1d576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d2b868686868686614c97565b612d3484615837565b607954700100000000000000000000000000000000900467ffffffffffffffff16600003612e7c57607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615612dd757607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015612e5f57600080fd5b505af1158015612e73573d6000803e3d6000fd5b50505050612f4c565b612e8461578a565b6079805467ffffffffffffffff16906000612e9e836169f4565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487166000908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001611ca6565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612fdb576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001611904565b613067614c16565b6130716000615a17565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146131db57600061309c613944565b90508067ffffffffffffffff168267ffffffffffffffff16116130eb576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000090910481169083161180613131575067ffffffffffffffff80831660009081526072602052604090206001015416155b15613168576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff80831660009081526072602052604090206001015442916131979162093a8091166168dc565b67ffffffffffffffff1611156131d9576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61214e615a8e565b607b5473ffffffffffffffffffffffffffffffffffffffff163314613234576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6132b7614c16565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015613381573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133a591906167fe565b905060006133b1613944565b60735467ffffffffffffffff6801000000000000000082048116916134099170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416616a53565b61341391906168dc565b61341d9190616a53565b67ffffffffffffffff1690508060000361343a5760009250505090565b6134448183616a9e565b9250505090565b606f5460ff1615613488576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134978787878787878761505b565b67ffffffffffffffff84166000908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16134f3615a8e565b50505050505050565b613504614c16565b6073805467ffffffffffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461359c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156135e3576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661364a5760795467ffffffffffffffff70010000000000000000000000000000000090910481169082161061364a576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001611904565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613718576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff16111561375f576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001611904565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461381e576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001611904565b613899614c16565b61214e81615837565b600067ffffffff0000000167ffffffffffffffff83161080156138da575067ffffffff00000001604083901c67ffffffffffffffff16105b80156138fb575067ffffffff00000001608083901c67ffffffffffffffff16105b8015613912575067ffffffff0000000160c083901c105b1561391f57506001919050565b506000919050565b919050565b613934614c16565b60776139408282616b00565b5050565b60795460009067ffffffffffffffff1615613988575060795467ffffffffffffffff9081166000908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146139ea576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60766139f68282616b00565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516119049190616129565b600054610100900460ff1615808015613a465750600054600160ff909116105b80613a605750303b158015613a60575060005460ff166001145b613aec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610dba565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015613b4a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b613b57602088018861657d565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055613bac604088016020890161657d565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055613c11608088016060890161657d565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790556000805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076613c9c8682616b00565b506077613ca98582616b00565b5062093a80613cbe6060890160408a01616352565b67ffffffffffffffff161115613d00576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d106060880160408901616352565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80613d7260a0890160808a01616352565b67ffffffffffffffff161115613db4576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613dc460a0880160808901616352565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613ea3615b16565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd660007f00000000000000000000000000000000000000000000000000000000000000008585604051613ef99493929190616c63565b60405180910390a180156134f357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613fc9576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614006576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003614042576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561407e576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff780100000000000000000000000000000000000000000000000082048116916140c9918491700100000000000000000000000000000000900416616c9b565b1115614101576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000008204811660008181526072602052604081205491937001000000000000000000000000000000009004909216915b848110156143ab57600087878381811061416157614161616904565b90506020028101906141739190616cae565b61417c90616ce2565b905083614188816169f4565b825180516020918201208185015160408087015190519499509194506000936141ea9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260719093529120549091508114614273576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260716020526040812055614298600189616a74565b84036143075742607b60149054906101000a900467ffffffffffffffff1684604001516142c591906168dc565b67ffffffffffffffff161115614307576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806143a390616a1b565b915050614145565b506143b684846168dc565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589166000818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461455f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156145c757600080fd5b505af11580156145db573d6000803e3d6000fd5b50505050613071615bb6565b6145ef614c16565b6040805160608101825293845267ffffffffffffffff92831660208086019182529284168583019081529584166000908152607290935291209251835551600190920180549351821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169290911691909117919091179055565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16156146d4576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614711576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061471b612bec565b905081811115614757576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115614793576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6147d573ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846156a8565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614842573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061486691906167fe565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff169060186148a0836169f4565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505084846040516148d7929190616d5e565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1660009081526071909352912055323303614a0757607354604080518381523360208201526060918101829052600091810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2614a66565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051614a5d9493929190616d6e565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314614abe576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001611904565b614b47614c16565b73ffffffffffffffffffffffffffffffffffffffff8116614bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610dba565b61214e81615a17565b614bfb614c16565b67ffffffffffffffff16600090815260756020526040902055565b60335473ffffffffffffffffffffffffffffffffffffffff163314613071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dba565b600080614ca2613944565b905067ffffffffffffffff881615614d725760795467ffffffffffffffff9081169089161115614cfe576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089166000908152607860205260409020600281015481549094509091898116680100000000000000009092041614614d6c576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614e13565b67ffffffffffffffff8716600090815260756020526040902054915081614dc5576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115614e13576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611614e60576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000614e6f888888868961190f565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051614ea491906167e2565b602060405180830381855afa158015614ec1573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190614ee491906167fe565b614eee9190616846565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91614f7091899190600401616da4565b602060405180830381865afa158015614f8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614fb19190616ddf565b614fe7576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61504f33614ff5858b616a53565b67ffffffffffffffff166150076132f2565b6150119190616a87565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190615c45565b50505050505050505050565b600067ffffffffffffffff8816156151295760795467ffffffffffffffff90811690891611156150b7576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088166000908152607860205260409020600281015481549092888116680100000000000000009092041614615123576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506151c5565b5067ffffffffffffffff85166000908152607560205260409020548061517b576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff90811690871611156151c5576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff90811690881611806151f757508767ffffffffffffffff168767ffffffffffffffff1611155b8061521e575060795467ffffffffffffffff68010000000000000000909104811690881611155b15615255576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781166000908152607860205260409020546801000000000000000090048116908616146152b8576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006152c7878787858861190f565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516152fc91906167e2565b602060405180830381855afa158015615319573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061533c91906167fe565b6153469190616846565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916153c891889190600401616da4565b602060405180830381865afa1580156153e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906154099190616ddf565b61543f576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff891660009081526078602052604090206002015485900361504f576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff6801000000000000000090910481169082161115806154cf575060795467ffffffffffffffff908116908216115b15615506576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff818116600081815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b15801561563857600080fd5b505af115801561564c573d6000803e3d6000fd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161569b91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526157849085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152615ca0565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115613071576079546000906157d39068010000000000000000900467ffffffffffffffff1660016168dc565b90506157de81611ec4565b1561214e5760795460009060029061580190849067ffffffffffffffff16616a53565b61580b9190616e01565b61581590836168dc565b905061582081611ec4565b1561582e5761394081615495565b61394082615495565b6000615841613944565b9050816000806158518484616a53565b606f5467ffffffffffffffff91821692506000916158759161010090041642616a74565b90505b8467ffffffffffffffff168467ffffffffffffffff16146159005767ffffffffffffffff808516600090815260726020526040902060018101549091168210156158de57600181015468010000000000000000900467ffffffffffffffff1694506158fa565b6158e88686616a53565b67ffffffffffffffff16935050615900565b50615878565b600061590c8484616a74565b90508381101561596357808403600c8111615927578061592a565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a607054028161595957615959616817565b04607055506159d3565b838103600c81116159745780615977565b600c5b90506000816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a764000002816159ae576159ae616817565b04905080607054670de0b6b3a764000002816159cc576159cc616817565b0460705550505b683635c9adc5dea0000060705411156159f857683635c9adc5dea000006070556134f3565b633b9aca0060705410156134f357633b9aca0060705550505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b158015615af657600080fd5b505af1158015615b0a573d6000803e3d6000fd5b50505050613071615dac565b600054610100900460ff16615bad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610dba565b61307133615a17565b606f5460ff16615bf2576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052615c9b9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401615702565b505050565b6000615d02826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615e3f9092919063ffffffff16565b805190915015615c9b5780806020019051810190615d209190616ddf565b615c9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610dba565b606f5460ff1615615de9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b6060615e4e8484600085615e56565b949350505050565b606082471015615ee8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610dba565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051615f1191906167e2565b60006040518083038185875af1925050503d8060008114615f4e576040519150601f19603f3d011682016040523d82523d6000602084013e615f53565b606091505b5091509150615f6487838387615f6f565b979650505050505050565b60608315616005578251600003615ffe5773ffffffffffffffffffffffffffffffffffffffff85163b615ffe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610dba565b5081615e4e565b615e4e838381511561601a5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dba9190616129565b803567ffffffffffffffff8116811461392757600080fd5b600080600080600060a0868803121561607e57600080fd5b6160878661604e565b94506160956020870161604e565b93506160a36040870161604e565b94979396509394606081013594506080013592915050565b60005b838110156160d65781810151838201526020016160be565b50506000910152565b600081518084526160f78160208601602086016160bb565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061613c60208301846160df565b9392505050565b806040810183101561615457600080fd5b92915050565b6000806000806000806000806101a0898b03121561617757600080fd5b6161808961604e565b975061618e60208a0161604e565b965061619c60408a0161604e565b955060608901359450608089013593506161b98a60a08b01616143565b925061016089018a8111156161cd57600080fd5b60e08a0192506161dd8b82616143565b9150509295985092959890939650565b6000602082840312156161ff57600080fd5b813561ffff8116811461613c57600080fd5b600080600080600060a0868803121561622957600080fd5b6162328661604e565b94506162406020870161604e565b94979496505050506040830135926060810135926080909101359150565b80610300810183101561615457600080fd5b6000806000806000806103a0878903121561628a57600080fd5b6162938761604e565b95506162a16020880161604e565b94506162af6040880161604e565b935060608701359250608087013591506162cc8860a0890161625e565b90509295509295509295565b60008060008060008060006103c0888a0312156162f457600080fd5b6162fd8861604e565b965061630b6020890161604e565b95506163196040890161604e565b94506163276060890161604e565b93506080880135925060a088013591506163448960c08a0161625e565b905092959891949750929550565b60006020828403121561636457600080fd5b61613c8261604e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126163ad57600080fd5b813567ffffffffffffffff808211156163c8576163c861636d565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561640e5761640e61636d565b8160405283815286602085880101111561642757600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461392757600080fd5b600080600080600060a0868803121561648357600080fd5b85359450602086013567ffffffffffffffff8111156164a157600080fd5b6164ad8882890161639c565b945050604086013592506164c36060870161604e565b91506164d160808701616447565b90509295509295909350565b60008083601f8401126164ef57600080fd5b50813567ffffffffffffffff81111561650757600080fd5b6020830191508360208260051b850101111561652257600080fd5b9250929050565b60008060006040848603121561653e57600080fd5b833567ffffffffffffffff81111561655557600080fd5b616561868287016164dd565b9094509250616574905060208501616447565b90509250925092565b60006020828403121561658f57600080fd5b61613c82616447565b6000602082840312156165aa57600080fd5b5035919050565b6000602082840312156165c357600080fd5b813567ffffffffffffffff8111156165da57600080fd5b615e4e8482850161639c565b60008083601f8401126165f857600080fd5b50813567ffffffffffffffff81111561661057600080fd5b60208301915083602082850101111561652257600080fd5b60008060008060008086880361012081121561664357600080fd5b60a081121561665157600080fd5b5086955060a0870135945060c087013567ffffffffffffffff8082111561667757600080fd5b6166838a838b0161639c565b955060e089013591508082111561669957600080fd5b6166a58a838b0161639c565b94506101008901359150808211156166bc57600080fd5b506166c989828a016165e6565b979a9699509497509295939492505050565b600080602083850312156166ee57600080fd5b823567ffffffffffffffff81111561670557600080fd5b616711858286016164dd565b90969095509350505050565b6000806000806080858703121561673357600080fd5b61673c8561604e565b9350602085013592506167516040860161604e565b915061675f6060860161604e565b905092959194509250565b60008060006040848603121561677f57600080fd5b833567ffffffffffffffff81111561679657600080fd5b6167a2868287016165e6565b909790965060209590950135949350505050565b600080604083850312156167c957600080fd5b823591506167d96020840161604e565b90509250929050565b600082516167f48184602087016160bb565b9190910192915050565b60006020828403121561681057600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261685557616855616817565b500690565b600181811c9082168061686e57607f821691505b6020821081036168a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8181168382160190808211156168fd576168fd6168ad565b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126167f457600080fd5b60006080823603121561697957600080fd5b6040516080810167ffffffffffffffff828210818311171561699d5761699d61636d565b8160405284359150808211156169b257600080fd5b506169bf3682860161639c565b825250602083013560208201526169d86040840161604e565b60408201526169e96060840161604e565b606082015292915050565b600067ffffffffffffffff808316818103616a1157616a116168ad565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203616a4c57616a4c6168ad565b5060010190565b67ffffffffffffffff8281168282160390808211156168fd576168fd6168ad565b81810381811115616154576161546168ad565b8082028115828204841417616154576161546168ad565b600082616aad57616aad616817565b500490565b601f821115615c9b57600081815260208120601f850160051c81016020861015616ad95750805b601f850160051c820191505b81811015616af857828155600101616ae5565b505050505050565b815167ffffffffffffffff811115616b1a57616b1a61636d565b616b2e81616b28845461685a565b84616ab2565b602080601f831160018114616b815760008415616b4b5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555616af8565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015616bce57888601518255948401946001909101908401616baf565b5085821015616c0a57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600067ffffffffffffffff808716835280861660208401525060606040830152616c91606083018486616c1a565b9695505050505050565b80820180821115616154576161546168ad565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126167f457600080fd5b600060608236031215616cf457600080fd5b6040516060810167ffffffffffffffff8282108183111715616d1857616d1861636d565b816040528435915080821115616d2d57600080fd5b50616d3a3682860161639c565b82525060208301356020820152616d536040840161604e565b604082015292915050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000616c91606083018486616c1a565b61032081016103008085843782018360005b6001811015616dd5578151835260209283019290910190600101616db6565b5050509392505050565b600060208284031215616df157600080fd5b8151801515811461613c57600080fd5b600067ffffffffffffffff80841680616e1c57616e1c616817565b9216919091049291505056fea26469706673582212200d16bdfde0b321a22abe6c2d141b1b0579321cd6fce8fe87dd8ebcb5f5c5aaca64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMTimelock.json b/compiled-contracts/paris/PolygonZkEVMTimelock.json index 5c2a52c7e..81068dc6d 100644 --- a/compiled-contracts/paris/PolygonZkEVMTimelock.json +++ b/compiled-contracts/paris/PolygonZkEVMTimelock.json @@ -892,8 +892,8 @@ "type": "receive" } ], - "bytecode": "0x60a06040523480156200001157600080fd5b50604051620023d0380380620023d083398101604081905262000034916200042b565b8484848462000053600080516020620023508339815191528062000242565b6200007d600080516020620023708339815191526000805160206200235083398151915262000242565b620000a7600080516020620023908339815191526000805160206200235083398151915262000242565b620000d1600080516020620023b08339815191526000805160206200235083398151915262000242565b620000ec60008051602062002350833981519152306200028d565b6001600160a01b0381161562000117576200011760008051602062002350833981519152826200028d565b60005b83518110156200019d5762000161600080516020620023708339815191528583815181106200014d576200014d620004cc565b60200260200101516200028d60201b60201c565b6200018a600080516020620023b08339815191528583815181106200014d576200014d620004cc565b6200019581620004e2565b90506200011a565b5060005b8251811015620001e757620001d4600080516020620023908339815191528483815181106200014d576200014d620004cc565b620001df81620004e2565b9050620001a1565b5060028490556040805160008152602081018690527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1505050506001600160a01b0316608052506200050a92505050565b600082815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6200029982826200029d565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1662000299576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620002f93390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146200036957600080fd5b50565b8051620003798162000353565b919050565b600082601f8301126200039057600080fd5b815160206001600160401b0380831115620003af57620003af6200033d565b8260051b604051601f19603f83011681018181108482111715620003d757620003d76200033d565b604052938452858101830193838101925087851115620003f657600080fd5b83870191505b84821015620004205762000410826200036c565b83529183019190830190620003fc565b979650505050505050565b600080600080600060a086880312156200044457600080fd5b855160208701519095506001600160401b03808211156200046457600080fd5b6200047289838a016200037e565b955060408801519150808211156200048957600080fd5b5062000498888289016200037e565b9350506060860151620004ab8162000353565b6080870151909250620004be8162000353565b809150509295509295909350565b634e487b7160e01b600052603260045260246000fd5b6000600182016200050357634e487b7160e01b600052601160045260246000fd5b5060010190565b608051611e1c620005346000396000818161034601528181610c920152610cc50152611e1c6000f3fe6080604052600436106101565760003560e01c806301d5062a1461016257806301ffc9a71461018457806307bd0265146101b95780630d3cf6fc146101e9578063134008d31461021d57806313bc9f2014610230578063150b7a0214610250578063248a9ca3146102945780632ab0f529146102b45780632f2ff15d146102d457806331d50750146102f457806336568abe146103145780633a6aae7214610334578063584b153e1461038057806364d62353146103a05780638065657f146103c05780638f2a0bb0146103e05780638f61f4f51461040057806391d1485414610422578063a217fddf14610442578063b08e51c014610457578063b1c5f42714610479578063bc197c8114610499578063c4d252f5146104c5578063d45c4435146104e5578063d547741f14610505578063e38335e514610525578063f23a6e6114610538578063f27a0c921461056457600080fd5b3661015d57005b600080fd5b34801561016e57600080fd5b5061018261017d36600461137d565b610579565b005b34801561019057600080fd5b506101a461019f3660046113f1565b6105ea565b60405190151581526020015b60405180910390f35b3480156101c557600080fd5b506101db600080516020611d8783398151915281565b6040519081526020016101b0565b3480156101f557600080fd5b506101db7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b61018261022b36600461141b565b610615565b34801561023c57600080fd5b506101a461024b366004611486565b6106a6565b34801561025c57600080fd5b5061027b61026b366004611554565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016101b0565b3480156102a057600080fd5b506101db6102af366004611486565b6106cb565b3480156102c057600080fd5b506101a46102cf366004611486565b6106e0565b3480156102e057600080fd5b506101826102ef3660046115bb565b6106f4565b34801561030057600080fd5b506101a461030f366004611486565b610715565b34801561032057600080fd5b5061018261032f3660046115bb565b610728565b34801561034057600080fd5b506103687f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101b0565b34801561038c57600080fd5b506101a461039b366004611486565b6107ab565b3480156103ac57600080fd5b506101826103bb366004611486565b6107b8565b3480156103cc57600080fd5b506101db6103db36600461141b565b61085c565b3480156103ec57600080fd5b506101826103fb36600461162b565b61089b565b34801561040c57600080fd5b506101db600080516020611d6783398151915281565b34801561042e57600080fd5b506101a461043d3660046115bb565b6109c9565b34801561044e57600080fd5b506101db600081565b34801561046357600080fd5b506101db600080516020611dc783398151915281565b34801561048557600080fd5b506101db6104943660046116dc565b6109f2565b3480156104a557600080fd5b5061027b6104b4366004611803565b63bc197c8160e01b95945050505050565b3480156104d157600080fd5b506101826104e0366004611486565b610a37565b3480156104f157600080fd5b506101db610500366004611486565b610afa565b34801561051157600080fd5b506101826105203660046115bb565b610b0c565b6101826105333660046116dc565b610b28565b34801561054457600080fd5b5061027b6105533660046118ac565b63f23a6e6160e01b95945050505050565b34801561057057600080fd5b506101db610c8e565b600080516020611d6783398151915261059181610d57565b60006105a189898989898961085c565b90506105ad8184610d64565b600081600080516020611da78339815191528b8b8b8b8b8a6040516105d796959493929190611939565b60405180910390a3505050505050505050565b60006001600160e01b03198216630271189760e51b148061060f575061060f82610e58565b92915050565b600080516020611d8783398151915261062f8160006109c9565b61063d5761063d8133610e8d565b600061064d88888888888861085c565b90506106598185610ee6565b61066588888888610f77565b600081600080516020611d478339815191528a8a8a8a60405161068b9493929190611976565b60405180910390a361069c8161104a565b5050505050505050565b6000806106b283610afa565b90506001811180156106c45750428111155b9392505050565b60009081526020819052604090206001015490565b600060016106ed83610afa565b1492915050565b6106fd826106cb565b61070681610d57565b6107108383611083565b505050565b60008061072183610afa565b1192915050565b6001600160a01b038116331461079d5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6107a78282611107565b5050565b6000600161072183610afa565b33301461081b5760405162461bcd60e51b815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201526a62652074696d656c6f636b60a81b6064820152608401610794565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b600086868686868660405160200161087996959493929190611939565b6040516020818303038152906040528051906020012090509695505050505050565b600080516020611d678339815191526108b381610d57565b8887146108d25760405162461bcd60e51b8152600401610794906119a8565b8885146108f15760405162461bcd60e51b8152600401610794906119a8565b60006109038b8b8b8b8b8b8b8b6109f2565b905061090f8184610d64565b60005b8a8110156109bb578082600080516020611da78339815191528e8e8581811061093d5761093d6119eb565b90506020020160208101906109529190611a01565b8d8d86818110610964576109646119eb565b905060200201358c8c8781811061097d5761097d6119eb565b905060200281019061098f9190611a1c565b8c8b6040516109a396959493929190611939565b60405180910390a36109b481611a78565b9050610912565b505050505050505050505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60008888888888888888604051602001610a13989796959493929190611b22565b60405160208183030381529060405280519060200120905098975050505050505050565b600080516020611dc7833981519152610a4f81610d57565b610a58826107ab565b610abe5760405162461bcd60e51b815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e2063616044820152701b9b9bdd0818994818d85b98d95b1b1959607a1b6064820152608401610794565b6000828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b60009081526001602052604090205490565b610b15826106cb565b610b1e81610d57565b6107108383611107565b600080516020611d87833981519152610b428160006109c9565b610b5057610b508133610e8d565b878614610b6f5760405162461bcd60e51b8152600401610794906119a8565b878414610b8e5760405162461bcd60e51b8152600401610794906119a8565b6000610ba08a8a8a8a8a8a8a8a6109f2565b9050610bac8185610ee6565b60005b89811015610c785760008b8b83818110610bcb57610bcb6119eb565b9050602002016020810190610be09190611a01565b905060008a8a84818110610bf657610bf66119eb565b9050602002013590503660008a8a86818110610c1457610c146119eb565b9050602002810190610c269190611a1c565b91509150610c3684848484610f77565b8486600080516020611d4783398151915286868686604051610c5b9493929190611976565b60405180910390a35050505080610c7190611a78565b9050610baf565b50610c828161104a565b50505050505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615801590610d4557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d459190611bc3565b15610d505750600090565b5060025490565b610d618133610e8d565b50565b610d6d82610715565b15610dd25760405162461bcd60e51b815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201526e1c9958591e481cd8da19591d5b1959608a1b6064820152608401610794565b610dda610c8e565b811015610e385760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e746044820152652064656c617960d01b6064820152608401610794565b610e428142611be5565b6000928352600160205260409092209190915550565b60006001600160e01b03198216637965db0b60e01b148061060f57506301ffc9a760e01b6001600160e01b031983161461060f565b610e9782826109c9565b6107a757610ea48161116c565b610eaf83602061117e565b604051602001610ec0929190611c1c565b60408051601f198184030181529082905262461bcd60e51b825261079491600401611c8b565b610eef826106a6565b610f0b5760405162461bcd60e51b815260040161079490611cbe565b801580610f1c5750610f1c816106e0565b6107a75760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e6720646570656044820152656e64656e637960d01b6064820152608401610794565b6000846001600160a01b0316848484604051610f94929190611d08565b60006040518083038185875af1925050503d8060008114610fd1576040519150601f19603f3d011682016040523d82523d6000602084013e610fd6565b606091505b50509050806110435760405162461bcd60e51b815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e6720746044820152721c985b9cd858dd1a5bdb881c995d995c9d1959606a1b6064820152608401610794565b5050505050565b611053816106a6565b61106f5760405162461bcd60e51b815260040161079490611cbe565b600090815260016020819052604090912055565b61108d82826109c9565b6107a7576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556110c33390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61111182826109c9565b156107a7576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b606061060f6001600160a01b03831660145b6060600061118d836002611d18565b611198906002611be5565b6001600160401b038111156111af576111af61149f565b6040519080825280601f01601f1916602001820160405280156111d9576020820181803683370190505b509050600360fc1b816000815181106111f4576111f46119eb565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611223576112236119eb565b60200101906001600160f81b031916908160001a9053506000611247846002611d18565b611252906001611be5565b90505b60018111156112ca576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611286576112866119eb565b1a60f81b82828151811061129c5761129c6119eb565b60200101906001600160f81b031916908160001a90535060049490941c936112c381611d2f565b9050611255565b5083156106c45760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610794565b80356001600160a01b038116811461133057600080fd5b919050565b60008083601f84011261134757600080fd5b5081356001600160401b0381111561135e57600080fd5b60208301915083602082850101111561137657600080fd5b9250929050565b600080600080600080600060c0888a03121561139857600080fd5b6113a188611319565b96506020880135955060408801356001600160401b038111156113c357600080fd5b6113cf8a828b01611335565b989b979a50986060810135976080820135975060a09091013595509350505050565b60006020828403121561140357600080fd5b81356001600160e01b0319811681146106c457600080fd5b60008060008060008060a0878903121561143457600080fd5b61143d87611319565b95506020870135945060408701356001600160401b0381111561145f57600080fd5b61146b89828a01611335565b979a9699509760608101359660809091013595509350505050565b60006020828403121561149857600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156114dd576114dd61149f565b604052919050565b600082601f8301126114f657600080fd5b81356001600160401b0381111561150f5761150f61149f565b611522601f8201601f19166020016114b5565b81815284602083860101111561153757600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561156a57600080fd5b61157385611319565b935061158160208601611319565b92506040850135915060608501356001600160401b038111156115a357600080fd5b6115af878288016114e5565b91505092959194509250565b600080604083850312156115ce57600080fd5b823591506115de60208401611319565b90509250929050565b60008083601f8401126115f957600080fd5b5081356001600160401b0381111561161057600080fd5b6020830191508360208260051b850101111561137657600080fd5b600080600080600080600080600060c08a8c03121561164957600080fd5b89356001600160401b038082111561166057600080fd5b61166c8d838e016115e7565b909b50995060208c013591508082111561168557600080fd5b6116918d838e016115e7565b909950975060408c01359150808211156116aa57600080fd5b506116b78c828d016115e7565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b60008060008060008060008060a0898b0312156116f857600080fd5b88356001600160401b038082111561170f57600080fd5b61171b8c838d016115e7565b909a50985060208b013591508082111561173457600080fd5b6117408c838d016115e7565b909850965060408b013591508082111561175957600080fd5b506117668b828c016115e7565b999c989b509699959896976060870135966080013595509350505050565b600082601f83011261179557600080fd5b813560206001600160401b038211156117b0576117b061149f565b8160051b6117bf8282016114b5565b92835284810182019282810190878511156117d957600080fd5b83870192505b848310156117f8578235825291830191908301906117df565b979650505050505050565b600080600080600060a0868803121561181b57600080fd5b61182486611319565b945061183260208701611319565b935060408601356001600160401b038082111561184e57600080fd5b61185a89838a01611784565b9450606088013591508082111561187057600080fd5b61187c89838a01611784565b9350608088013591508082111561189257600080fd5b5061189f888289016114e5565b9150509295509295909350565b600080600080600060a086880312156118c457600080fd5b6118cd86611319565b94506118db60208701611319565b9350604086013592506060860135915060808601356001600160401b0381111561190457600080fd5b61189f888289016114e5565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b038716815285602082015260a06040820152600061196160a083018688611910565b60608301949094525060800152949350505050565b60018060a01b038516815283602082015260606040820152600061199e606083018486611910565b9695505050505050565b60208082526023908201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d616040820152620e8c6d60eb1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600060208284031215611a1357600080fd5b6106c482611319565b6000808335601e19843603018112611a3357600080fd5b8301803591506001600160401b03821115611a4d57600080fd5b60200191503681900382131561137657600080fd5b634e487b7160e01b600052601160045260246000fd5b600060018201611a8a57611a8a611a62565b5060010190565b81835260006020808501808196508560051b810191508460005b87811015611b155782840389528135601e19883603018112611acc57600080fd5b870185810190356001600160401b03811115611ae757600080fd5b803603821315611af657600080fd5b611b01868284611910565b9a87019a9550505090840190600101611aab565b5091979650505050505050565b60a0808252810188905260008960c08301825b8b811015611b63576001600160a01b03611b4e84611319565b16825260209283019290910190600101611b35565b5083810360208501528881526001600160fb1b03891115611b8357600080fd5b8860051b9150818a60208301370182810360209081016040850152611bab9082018789611a91565b60608401959095525050608001529695505050505050565b600060208284031215611bd557600080fd5b815180151581146106c457600080fd5b8082018082111561060f5761060f611a62565b60005b83811015611c13578181015183820152602001611bfb565b50506000910152565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260008351611c4e816017850160208801611bf8565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611c7f816028840160208801611bf8565b01602801949350505050565b6020815260008251806020840152611caa816040850160208701611bf8565b601f01601f19169190910160400192915050565b6020808252602a908201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e206973604082015269206e6f7420726561647960b01b606082015260800190565b8183823760009101908152919050565b808202811582820484141761060f5761060f611a62565b600081611d3e57611d3e611a62565b50600019019056fec2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e634cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dcafd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783a264697066735822122020cb3b2cb68d6bad0a32c6f2ad43d914add21c49d11bde8ed1ea487a91fd270e64736f6c634300081400335f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63fd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783", - "deployedBytecode": "0x6080604052600436106101565760003560e01c806301d5062a1461016257806301ffc9a71461018457806307bd0265146101b95780630d3cf6fc146101e9578063134008d31461021d57806313bc9f2014610230578063150b7a0214610250578063248a9ca3146102945780632ab0f529146102b45780632f2ff15d146102d457806331d50750146102f457806336568abe146103145780633a6aae7214610334578063584b153e1461038057806364d62353146103a05780638065657f146103c05780638f2a0bb0146103e05780638f61f4f51461040057806391d1485414610422578063a217fddf14610442578063b08e51c014610457578063b1c5f42714610479578063bc197c8114610499578063c4d252f5146104c5578063d45c4435146104e5578063d547741f14610505578063e38335e514610525578063f23a6e6114610538578063f27a0c921461056457600080fd5b3661015d57005b600080fd5b34801561016e57600080fd5b5061018261017d36600461137d565b610579565b005b34801561019057600080fd5b506101a461019f3660046113f1565b6105ea565b60405190151581526020015b60405180910390f35b3480156101c557600080fd5b506101db600080516020611d8783398151915281565b6040519081526020016101b0565b3480156101f557600080fd5b506101db7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b61018261022b36600461141b565b610615565b34801561023c57600080fd5b506101a461024b366004611486565b6106a6565b34801561025c57600080fd5b5061027b61026b366004611554565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016101b0565b3480156102a057600080fd5b506101db6102af366004611486565b6106cb565b3480156102c057600080fd5b506101a46102cf366004611486565b6106e0565b3480156102e057600080fd5b506101826102ef3660046115bb565b6106f4565b34801561030057600080fd5b506101a461030f366004611486565b610715565b34801561032057600080fd5b5061018261032f3660046115bb565b610728565b34801561034057600080fd5b506103687f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101b0565b34801561038c57600080fd5b506101a461039b366004611486565b6107ab565b3480156103ac57600080fd5b506101826103bb366004611486565b6107b8565b3480156103cc57600080fd5b506101db6103db36600461141b565b61085c565b3480156103ec57600080fd5b506101826103fb36600461162b565b61089b565b34801561040c57600080fd5b506101db600080516020611d6783398151915281565b34801561042e57600080fd5b506101a461043d3660046115bb565b6109c9565b34801561044e57600080fd5b506101db600081565b34801561046357600080fd5b506101db600080516020611dc783398151915281565b34801561048557600080fd5b506101db6104943660046116dc565b6109f2565b3480156104a557600080fd5b5061027b6104b4366004611803565b63bc197c8160e01b95945050505050565b3480156104d157600080fd5b506101826104e0366004611486565b610a37565b3480156104f157600080fd5b506101db610500366004611486565b610afa565b34801561051157600080fd5b506101826105203660046115bb565b610b0c565b6101826105333660046116dc565b610b28565b34801561054457600080fd5b5061027b6105533660046118ac565b63f23a6e6160e01b95945050505050565b34801561057057600080fd5b506101db610c8e565b600080516020611d6783398151915261059181610d57565b60006105a189898989898961085c565b90506105ad8184610d64565b600081600080516020611da78339815191528b8b8b8b8b8a6040516105d796959493929190611939565b60405180910390a3505050505050505050565b60006001600160e01b03198216630271189760e51b148061060f575061060f82610e58565b92915050565b600080516020611d8783398151915261062f8160006109c9565b61063d5761063d8133610e8d565b600061064d88888888888861085c565b90506106598185610ee6565b61066588888888610f77565b600081600080516020611d478339815191528a8a8a8a60405161068b9493929190611976565b60405180910390a361069c8161104a565b5050505050505050565b6000806106b283610afa565b90506001811180156106c45750428111155b9392505050565b60009081526020819052604090206001015490565b600060016106ed83610afa565b1492915050565b6106fd826106cb565b61070681610d57565b6107108383611083565b505050565b60008061072183610afa565b1192915050565b6001600160a01b038116331461079d5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6107a78282611107565b5050565b6000600161072183610afa565b33301461081b5760405162461bcd60e51b815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201526a62652074696d656c6f636b60a81b6064820152608401610794565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b600086868686868660405160200161087996959493929190611939565b6040516020818303038152906040528051906020012090509695505050505050565b600080516020611d678339815191526108b381610d57565b8887146108d25760405162461bcd60e51b8152600401610794906119a8565b8885146108f15760405162461bcd60e51b8152600401610794906119a8565b60006109038b8b8b8b8b8b8b8b6109f2565b905061090f8184610d64565b60005b8a8110156109bb578082600080516020611da78339815191528e8e8581811061093d5761093d6119eb565b90506020020160208101906109529190611a01565b8d8d86818110610964576109646119eb565b905060200201358c8c8781811061097d5761097d6119eb565b905060200281019061098f9190611a1c565b8c8b6040516109a396959493929190611939565b60405180910390a36109b481611a78565b9050610912565b505050505050505050505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60008888888888888888604051602001610a13989796959493929190611b22565b60405160208183030381529060405280519060200120905098975050505050505050565b600080516020611dc7833981519152610a4f81610d57565b610a58826107ab565b610abe5760405162461bcd60e51b815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e2063616044820152701b9b9bdd0818994818d85b98d95b1b1959607a1b6064820152608401610794565b6000828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b60009081526001602052604090205490565b610b15826106cb565b610b1e81610d57565b6107108383611107565b600080516020611d87833981519152610b428160006109c9565b610b5057610b508133610e8d565b878614610b6f5760405162461bcd60e51b8152600401610794906119a8565b878414610b8e5760405162461bcd60e51b8152600401610794906119a8565b6000610ba08a8a8a8a8a8a8a8a6109f2565b9050610bac8185610ee6565b60005b89811015610c785760008b8b83818110610bcb57610bcb6119eb565b9050602002016020810190610be09190611a01565b905060008a8a84818110610bf657610bf66119eb565b9050602002013590503660008a8a86818110610c1457610c146119eb565b9050602002810190610c269190611a1c565b91509150610c3684848484610f77565b8486600080516020611d4783398151915286868686604051610c5b9493929190611976565b60405180910390a35050505080610c7190611a78565b9050610baf565b50610c828161104a565b50505050505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615801590610d4557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d459190611bc3565b15610d505750600090565b5060025490565b610d618133610e8d565b50565b610d6d82610715565b15610dd25760405162461bcd60e51b815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201526e1c9958591e481cd8da19591d5b1959608a1b6064820152608401610794565b610dda610c8e565b811015610e385760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e746044820152652064656c617960d01b6064820152608401610794565b610e428142611be5565b6000928352600160205260409092209190915550565b60006001600160e01b03198216637965db0b60e01b148061060f57506301ffc9a760e01b6001600160e01b031983161461060f565b610e9782826109c9565b6107a757610ea48161116c565b610eaf83602061117e565b604051602001610ec0929190611c1c565b60408051601f198184030181529082905262461bcd60e51b825261079491600401611c8b565b610eef826106a6565b610f0b5760405162461bcd60e51b815260040161079490611cbe565b801580610f1c5750610f1c816106e0565b6107a75760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e6720646570656044820152656e64656e637960d01b6064820152608401610794565b6000846001600160a01b0316848484604051610f94929190611d08565b60006040518083038185875af1925050503d8060008114610fd1576040519150601f19603f3d011682016040523d82523d6000602084013e610fd6565b606091505b50509050806110435760405162461bcd60e51b815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e6720746044820152721c985b9cd858dd1a5bdb881c995d995c9d1959606a1b6064820152608401610794565b5050505050565b611053816106a6565b61106f5760405162461bcd60e51b815260040161079490611cbe565b600090815260016020819052604090912055565b61108d82826109c9565b6107a7576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556110c33390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61111182826109c9565b156107a7576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b606061060f6001600160a01b03831660145b6060600061118d836002611d18565b611198906002611be5565b6001600160401b038111156111af576111af61149f565b6040519080825280601f01601f1916602001820160405280156111d9576020820181803683370190505b509050600360fc1b816000815181106111f4576111f46119eb565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611223576112236119eb565b60200101906001600160f81b031916908160001a9053506000611247846002611d18565b611252906001611be5565b90505b60018111156112ca576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611286576112866119eb565b1a60f81b82828151811061129c5761129c6119eb565b60200101906001600160f81b031916908160001a90535060049490941c936112c381611d2f565b9050611255565b5083156106c45760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610794565b80356001600160a01b038116811461133057600080fd5b919050565b60008083601f84011261134757600080fd5b5081356001600160401b0381111561135e57600080fd5b60208301915083602082850101111561137657600080fd5b9250929050565b600080600080600080600060c0888a03121561139857600080fd5b6113a188611319565b96506020880135955060408801356001600160401b038111156113c357600080fd5b6113cf8a828b01611335565b989b979a50986060810135976080820135975060a09091013595509350505050565b60006020828403121561140357600080fd5b81356001600160e01b0319811681146106c457600080fd5b60008060008060008060a0878903121561143457600080fd5b61143d87611319565b95506020870135945060408701356001600160401b0381111561145f57600080fd5b61146b89828a01611335565b979a9699509760608101359660809091013595509350505050565b60006020828403121561149857600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156114dd576114dd61149f565b604052919050565b600082601f8301126114f657600080fd5b81356001600160401b0381111561150f5761150f61149f565b611522601f8201601f19166020016114b5565b81815284602083860101111561153757600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561156a57600080fd5b61157385611319565b935061158160208601611319565b92506040850135915060608501356001600160401b038111156115a357600080fd5b6115af878288016114e5565b91505092959194509250565b600080604083850312156115ce57600080fd5b823591506115de60208401611319565b90509250929050565b60008083601f8401126115f957600080fd5b5081356001600160401b0381111561161057600080fd5b6020830191508360208260051b850101111561137657600080fd5b600080600080600080600080600060c08a8c03121561164957600080fd5b89356001600160401b038082111561166057600080fd5b61166c8d838e016115e7565b909b50995060208c013591508082111561168557600080fd5b6116918d838e016115e7565b909950975060408c01359150808211156116aa57600080fd5b506116b78c828d016115e7565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b60008060008060008060008060a0898b0312156116f857600080fd5b88356001600160401b038082111561170f57600080fd5b61171b8c838d016115e7565b909a50985060208b013591508082111561173457600080fd5b6117408c838d016115e7565b909850965060408b013591508082111561175957600080fd5b506117668b828c016115e7565b999c989b509699959896976060870135966080013595509350505050565b600082601f83011261179557600080fd5b813560206001600160401b038211156117b0576117b061149f565b8160051b6117bf8282016114b5565b92835284810182019282810190878511156117d957600080fd5b83870192505b848310156117f8578235825291830191908301906117df565b979650505050505050565b600080600080600060a0868803121561181b57600080fd5b61182486611319565b945061183260208701611319565b935060408601356001600160401b038082111561184e57600080fd5b61185a89838a01611784565b9450606088013591508082111561187057600080fd5b61187c89838a01611784565b9350608088013591508082111561189257600080fd5b5061189f888289016114e5565b9150509295509295909350565b600080600080600060a086880312156118c457600080fd5b6118cd86611319565b94506118db60208701611319565b9350604086013592506060860135915060808601356001600160401b0381111561190457600080fd5b61189f888289016114e5565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b038716815285602082015260a06040820152600061196160a083018688611910565b60608301949094525060800152949350505050565b60018060a01b038516815283602082015260606040820152600061199e606083018486611910565b9695505050505050565b60208082526023908201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d616040820152620e8c6d60eb1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600060208284031215611a1357600080fd5b6106c482611319565b6000808335601e19843603018112611a3357600080fd5b8301803591506001600160401b03821115611a4d57600080fd5b60200191503681900382131561137657600080fd5b634e487b7160e01b600052601160045260246000fd5b600060018201611a8a57611a8a611a62565b5060010190565b81835260006020808501808196508560051b810191508460005b87811015611b155782840389528135601e19883603018112611acc57600080fd5b870185810190356001600160401b03811115611ae757600080fd5b803603821315611af657600080fd5b611b01868284611910565b9a87019a9550505090840190600101611aab565b5091979650505050505050565b60a0808252810188905260008960c08301825b8b811015611b63576001600160a01b03611b4e84611319565b16825260209283019290910190600101611b35565b5083810360208501528881526001600160fb1b03891115611b8357600080fd5b8860051b9150818a60208301370182810360209081016040850152611bab9082018789611a91565b60608401959095525050608001529695505050505050565b600060208284031215611bd557600080fd5b815180151581146106c457600080fd5b8082018082111561060f5761060f611a62565b60005b83811015611c13578181015183820152602001611bfb565b50506000910152565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260008351611c4e816017850160208801611bf8565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611c7f816028840160208801611bf8565b01602801949350505050565b6020815260008251806020840152611caa816040850160208701611bf8565b601f01601f19169190910160400192915050565b6020808252602a908201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e206973604082015269206e6f7420726561647960b01b606082015260800190565b8183823760009101908152919050565b808202811582820484141761060f5761060f611a62565b600081611d3e57611d3e611a62565b50600019019056fec2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e634cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dcafd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783a264697066735822122020cb3b2cb68d6bad0a32c6f2ad43d914add21c49d11bde8ed1ea487a91fd270e64736f6c63430008140033", + "bytecode": "0x60a06040523480156200001157600080fd5b5060405162002d2f38038062002d2f83398101604081905262000034916200042b565b848484846200005360008051602062002caf8339815191528062000242565b6200007d60008051602062002ccf83398151915260008051602062002caf83398151915262000242565b620000a760008051602062002cef83398151915260008051602062002caf83398151915262000242565b620000d160008051602062002d0f83398151915260008051602062002caf83398151915262000242565b620000ec60008051602062002caf833981519152306200028d565b6001600160a01b0381161562000117576200011760008051602062002caf833981519152826200028d565b60005b83518110156200019d576200016160008051602062002ccf8339815191528583815181106200014d576200014d620004cc565b60200260200101516200028d60201b60201c565b6200018a60008051602062002d0f8339815191528583815181106200014d576200014d620004cc565b6200019581620004e2565b90506200011a565b5060005b8251811015620001e757620001d460008051602062002cef8339815191528483815181106200014d576200014d620004cc565b620001df81620004e2565b9050620001a1565b5060028490556040805160008152602081018690527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1505050506001600160a01b0316608052506200050a92505050565b600082815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6200029982826200029d565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1662000299576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620002f93390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146200036957600080fd5b50565b8051620003798162000353565b919050565b600082601f8301126200039057600080fd5b815160206001600160401b0380831115620003af57620003af6200033d565b8260051b604051601f19603f83011681018181108482111715620003d757620003d76200033d565b604052938452858101830193838101925087851115620003f657600080fd5b83870191505b84821015620004205762000410826200036c565b83529183019190830190620003fc565b979650505050505050565b600080600080600060a086880312156200044457600080fd5b855160208701519095506001600160401b03808211156200046457600080fd5b6200047289838a016200037e565b955060408801519150808211156200048957600080fd5b5062000498888289016200037e565b9350506060860151620004ab8162000353565b6080870151909250620004be8162000353565b809150509295509295909350565b634e487b7160e01b600052603260045260246000fd5b6000600182016200050357634e487b7160e01b600052601160045260246000fd5b5060010190565b60805161277b620005346000396000818161041a0152818161116501526111a5015261277b6000f3fe6080604052600436106101c65760003560e01c806364d62353116100f7578063b1c5f42711610095578063d547741f11610064578063d547741f14610661578063e38335e514610681578063f23a6e6114610694578063f27a0c92146106d957600080fd5b8063b1c5f427146105af578063bc197c81146105cf578063c4d252f514610614578063d45c44351461063457600080fd5b80638f61f4f5116100d15780638f61f4f5146104e157806391d1485414610515578063a217fddf14610566578063b08e51c01461057b57600080fd5b806364d62353146104815780638065657f146104a15780638f2a0bb0146104c157600080fd5b8063248a9ca31161016457806331d507501161013e57806331d50750146103c857806336568abe146103e85780633a6aae7214610408578063584b153e1461046157600080fd5b8063248a9ca3146103475780632ab0f529146103775780632f2ff15d146103a857600080fd5b80630d3cf6fc116101a05780630d3cf6fc1461026b578063134008d31461029f57806313bc9f20146102b2578063150b7a02146102d257600080fd5b806301d5062a146101d257806301ffc9a7146101f457806307bd02651461022957600080fd5b366101cd57005b600080fd5b3480156101de57600080fd5b506101f26101ed366004611c52565b6106ee565b005b34801561020057600080fd5b5061021461020f366004611cc7565b610783565b60405190151581526020015b60405180910390f35b34801561023557600080fd5b5061025d7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610220565b34801561027757600080fd5b5061025d7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101f26102ad366004611d09565b6107df565b3480156102be57600080fd5b506102146102cd366004611d75565b6108d7565b3480156102de57600080fd5b506103166102ed366004611e9a565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610220565b34801561035357600080fd5b5061025d610362366004611d75565b60009081526020819052604090206001015490565b34801561038357600080fd5b50610214610392366004611d75565b6000908152600160208190526040909120541490565b3480156103b457600080fd5b506101f26103c3366004611f02565b6108fd565b3480156103d457600080fd5b506102146103e3366004611d75565b610927565b3480156103f457600080fd5b506101f2610403366004611f02565b610940565b34801561041457600080fd5b5061043c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610220565b34801561046d57600080fd5b5061021461047c366004611d75565b6109f8565b34801561048d57600080fd5b506101f261049c366004611d75565b610a0e565b3480156104ad57600080fd5b5061025d6104bc366004611d09565b610ade565b3480156104cd57600080fd5b506101f26104dc366004611f73565b610b1d565b3480156104ed57600080fd5b5061025d7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b34801561052157600080fd5b50610214610530366004611f02565b60009182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b34801561057257600080fd5b5061025d600081565b34801561058757600080fd5b5061025d7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b3480156105bb57600080fd5b5061025d6105ca366004612025565b610d4f565b3480156105db57600080fd5b506103166105ea36600461214e565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b34801561062057600080fd5b506101f261062f366004611d75565b610d94565b34801561064057600080fd5b5061025d61064f366004611d75565b60009081526001602052604090205490565b34801561066d57600080fd5b506101f261067c366004611f02565b610e8f565b6101f261068f366004612025565b610eb4565b3480156106a057600080fd5b506103166106af3660046121f8565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106e557600080fd5b5061025d611161565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161071881611244565b6000610728898989898989610ade565b90506107348184611251565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a604051610770969594939291906122a6565b60405180910390a3505050505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107d957506107d98261139e565b92915050565b600080527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661085c5761085c8133611435565b600061086c888888888888610ade565b905061087881856114ed565b6108848888888861162a565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a6040516108bc94939291906122f1565b60405180910390a36108cd8161172e565b5050505050505050565b6000818152600160205260408120546001811180156108f65750428111155b9392505050565b60008281526020819052604090206001015461091881611244565b61092283836117d7565b505050565b60008181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109f482826118c7565b5050565b6000818152600160208190526040822054610939565b333014610a9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109e1565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b6000868686868686604051602001610afb969594939291906122a6565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b4781611244565b888714610bd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b888514610c65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b6000610c778b8b8b8b8b8b8b8b610d4f565b9050610c838184611251565b60005b8a811015610d415780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610cc357610cc3612331565b9050602002016020810190610cd89190612360565b8d8d86818110610cea57610cea612331565b905060200201358c8c87818110610d0357610d03612331565b9050602002810190610d15919061237b565b8c8b604051610d29969594939291906122a6565b60405180910390a3610d3a8161240f565b9050610c86565b505050505050505050505050565b60008888888888888888604051602001610d709897969594939291906124f7565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610dbe81611244565b610dc7826109f8565b610e53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109e1565b6000828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b600082815260208190526040902060010154610eaa81611244565b61092283836118c7565b600080527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610f3157610f318133611435565b878614610fc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b87841461104f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b60006110618a8a8a8a8a8a8a8a610d4f565b905061106d81856114ed565b60005b8981101561114b5760008b8b8381811061108c5761108c612331565b90506020020160208101906110a19190612360565b905060008a8a848181106110b7576110b7612331565b9050602002013590503660008a8a868181106110d5576110d5612331565b90506020028101906110e7919061237b565b915091506110f78484848461162a565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588686868660405161112e94939291906122f1565b60405180910390a350505050806111449061240f565b9050611070565b506111558161172e565b50505050505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161580159061123257507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123291906125be565b1561123d5750600090565b5060025490565b61124e8133611435565b50565b61125a82610927565b156112e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109e1565b6112ef611161565b81101561137e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109e1565b61138881426125e0565b6000928352600160205260409092209190915550565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107d957507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107d9565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109f4576114738161197e565b61147e83602061199d565b60405160200161148f929190612617565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109e191600401612698565b6114f6826108d7565b611582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109e1565b80158061159e5750600081815260016020819052604090912054145b6109f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109e1565b60008473ffffffffffffffffffffffffffffffffffffffff168484846040516116549291906126e9565b60006040518083038185875af1925050503d8060008114611691576040519150601f19603f3d011682016040523d82523d6000602084013e611696565b606091505b5050905080611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109e1565b5050505050565b611737816108d7565b6117c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109e1565b600090815260016020819052604090912055565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109f45760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556118693390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109f45760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107d973ffffffffffffffffffffffffffffffffffffffff831660145b606060006119ac8360026126f9565b6119b79060026125e0565b67ffffffffffffffff8111156119cf576119cf611d8e565b6040519080825280601f01601f1916602001820160405280156119f9576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611a3057611a30612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a9357611a93612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000611acf8460026126f9565b611ada9060016125e0565b90505b6001811115611b77577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611b1b57611b1b612331565b1a60f81b828281518110611b3157611b31612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c93611b7081612710565b9050611add565b5083156108f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109e1565b803573ffffffffffffffffffffffffffffffffffffffff81168114611c0457600080fd5b919050565b60008083601f840112611c1b57600080fd5b50813567ffffffffffffffff811115611c3357600080fd5b602083019150836020828501011115611c4b57600080fd5b9250929050565b600080600080600080600060c0888a031215611c6d57600080fd5b611c7688611be0565b965060208801359550604088013567ffffffffffffffff811115611c9957600080fd5b611ca58a828b01611c09565b989b979a50986060810135976080820135975060a09091013595509350505050565b600060208284031215611cd957600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108f657600080fd5b60008060008060008060a08789031215611d2257600080fd5b611d2b87611be0565b955060208701359450604087013567ffffffffffffffff811115611d4e57600080fd5b611d5a89828a01611c09565b979a9699509760608101359660809091013595509350505050565b600060208284031215611d8757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611e0457611e04611d8e565b604052919050565b600082601f830112611e1d57600080fd5b813567ffffffffffffffff811115611e3757611e37611d8e565b611e6860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611dbd565b818152846020838601011115611e7d57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611eb057600080fd5b611eb985611be0565b9350611ec760208601611be0565b925060408501359150606085013567ffffffffffffffff811115611eea57600080fd5b611ef687828801611e0c565b91505092959194509250565b60008060408385031215611f1557600080fd5b82359150611f2560208401611be0565b90509250929050565b60008083601f840112611f4057600080fd5b50813567ffffffffffffffff811115611f5857600080fd5b6020830191508360208260051b8501011115611c4b57600080fd5b600080600080600080600080600060c08a8c031215611f9157600080fd5b893567ffffffffffffffff80821115611fa957600080fd5b611fb58d838e01611f2e565b909b50995060208c0135915080821115611fce57600080fd5b611fda8d838e01611f2e565b909950975060408c0135915080821115611ff357600080fd5b506120008c828d01611f2e565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b60008060008060008060008060a0898b03121561204157600080fd5b883567ffffffffffffffff8082111561205957600080fd5b6120658c838d01611f2e565b909a50985060208b013591508082111561207e57600080fd5b61208a8c838d01611f2e565b909850965060408b01359150808211156120a357600080fd5b506120b08b828c01611f2e565b999c989b509699959896976060870135966080013595509350505050565b600082601f8301126120df57600080fd5b8135602067ffffffffffffffff8211156120fb576120fb611d8e565b8160051b61210a828201611dbd565b928352848101820192828101908785111561212457600080fd5b83870192505b848310156121435782358252918301919083019061212a565b979650505050505050565b600080600080600060a0868803121561216657600080fd5b61216f86611be0565b945061217d60208701611be0565b9350604086013567ffffffffffffffff8082111561219a57600080fd5b6121a689838a016120ce565b945060608801359150808211156121bc57600080fd5b6121c889838a016120ce565b935060808801359150808211156121de57600080fd5b506121eb88828901611e0c565b9150509295509295909350565b600080600080600060a0868803121561221057600080fd5b61221986611be0565b945061222760208701611be0565b93506040860135925060608601359150608086013567ffffffffffffffff81111561225157600080fd5b6121eb88828901611e0c565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a0604082015260006122dc60a08301868861225d565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260606040820152600061232760608301848661225d565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561237257600080fd5b6108f682611be0565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126123b057600080fd5b83018035915067ffffffffffffffff8211156123cb57600080fd5b602001915036819003821315611c4b57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612440576124406123e0565b5060010190565b81835260006020808501808196508560051b810191508460005b878110156124ea57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126124a057600080fd5b8701858101903567ffffffffffffffff8111156124bc57600080fd5b8036038213156124cb57600080fd5b6124d686828461225d565b9a87019a9550505090840190600101612461565b5091979650505050505050565b60a0808252810188905260008960c08301825b8b8110156125455773ffffffffffffffffffffffffffffffffffffffff61253084611be0565b1682526020928301929091019060010161250a565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff89111561257e57600080fd5b8860051b9150818a602083013701828103602090810160408501526125a69082018789612447565b60608401959095525050608001529695505050505050565b6000602082840312156125d057600080fd5b815180151581146108f657600080fd5b808201808211156107d9576107d96123e0565b60005b8381101561260e5781810151838201526020016125f6565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161264f8160178501602088016125f3565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000601791840191820152835161268c8160288401602088016125f3565b01602801949350505050565b60208152600082518060208401526126b78160408501602087016125f3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b8183823760009101908152919050565b80820281158282048414176107d9576107d96123e0565b60008161271f5761271f6123e0565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea264697066735822122048ac459f9165e9eaa91bead23625fe941931ad2332a61820c2a6d1dcd92c218164736f6c634300081400335f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63fd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783", + "deployedBytecode": "0x6080604052600436106101c65760003560e01c806364d62353116100f7578063b1c5f42711610095578063d547741f11610064578063d547741f14610661578063e38335e514610681578063f23a6e6114610694578063f27a0c92146106d957600080fd5b8063b1c5f427146105af578063bc197c81146105cf578063c4d252f514610614578063d45c44351461063457600080fd5b80638f61f4f5116100d15780638f61f4f5146104e157806391d1485414610515578063a217fddf14610566578063b08e51c01461057b57600080fd5b806364d62353146104815780638065657f146104a15780638f2a0bb0146104c157600080fd5b8063248a9ca31161016457806331d507501161013e57806331d50750146103c857806336568abe146103e85780633a6aae7214610408578063584b153e1461046157600080fd5b8063248a9ca3146103475780632ab0f529146103775780632f2ff15d146103a857600080fd5b80630d3cf6fc116101a05780630d3cf6fc1461026b578063134008d31461029f57806313bc9f20146102b2578063150b7a02146102d257600080fd5b806301d5062a146101d257806301ffc9a7146101f457806307bd02651461022957600080fd5b366101cd57005b600080fd5b3480156101de57600080fd5b506101f26101ed366004611c52565b6106ee565b005b34801561020057600080fd5b5061021461020f366004611cc7565b610783565b60405190151581526020015b60405180910390f35b34801561023557600080fd5b5061025d7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610220565b34801561027757600080fd5b5061025d7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101f26102ad366004611d09565b6107df565b3480156102be57600080fd5b506102146102cd366004611d75565b6108d7565b3480156102de57600080fd5b506103166102ed366004611e9a565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610220565b34801561035357600080fd5b5061025d610362366004611d75565b60009081526020819052604090206001015490565b34801561038357600080fd5b50610214610392366004611d75565b6000908152600160208190526040909120541490565b3480156103b457600080fd5b506101f26103c3366004611f02565b6108fd565b3480156103d457600080fd5b506102146103e3366004611d75565b610927565b3480156103f457600080fd5b506101f2610403366004611f02565b610940565b34801561041457600080fd5b5061043c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610220565b34801561046d57600080fd5b5061021461047c366004611d75565b6109f8565b34801561048d57600080fd5b506101f261049c366004611d75565b610a0e565b3480156104ad57600080fd5b5061025d6104bc366004611d09565b610ade565b3480156104cd57600080fd5b506101f26104dc366004611f73565b610b1d565b3480156104ed57600080fd5b5061025d7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b34801561052157600080fd5b50610214610530366004611f02565b60009182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b34801561057257600080fd5b5061025d600081565b34801561058757600080fd5b5061025d7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b3480156105bb57600080fd5b5061025d6105ca366004612025565b610d4f565b3480156105db57600080fd5b506103166105ea36600461214e565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b34801561062057600080fd5b506101f261062f366004611d75565b610d94565b34801561064057600080fd5b5061025d61064f366004611d75565b60009081526001602052604090205490565b34801561066d57600080fd5b506101f261067c366004611f02565b610e8f565b6101f261068f366004612025565b610eb4565b3480156106a057600080fd5b506103166106af3660046121f8565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106e557600080fd5b5061025d611161565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161071881611244565b6000610728898989898989610ade565b90506107348184611251565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a604051610770969594939291906122a6565b60405180910390a3505050505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107d957506107d98261139e565b92915050565b600080527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661085c5761085c8133611435565b600061086c888888888888610ade565b905061087881856114ed565b6108848888888861162a565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a6040516108bc94939291906122f1565b60405180910390a36108cd8161172e565b5050505050505050565b6000818152600160205260408120546001811180156108f65750428111155b9392505050565b60008281526020819052604090206001015461091881611244565b61092283836117d7565b505050565b60008181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109f482826118c7565b5050565b6000818152600160208190526040822054610939565b333014610a9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109e1565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b6000868686868686604051602001610afb969594939291906122a6565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b4781611244565b888714610bd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b888514610c65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b6000610c778b8b8b8b8b8b8b8b610d4f565b9050610c838184611251565b60005b8a811015610d415780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610cc357610cc3612331565b9050602002016020810190610cd89190612360565b8d8d86818110610cea57610cea612331565b905060200201358c8c87818110610d0357610d03612331565b9050602002810190610d15919061237b565b8c8b604051610d29969594939291906122a6565b60405180910390a3610d3a8161240f565b9050610c86565b505050505050505050505050565b60008888888888888888604051602001610d709897969594939291906124f7565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610dbe81611244565b610dc7826109f8565b610e53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109e1565b6000828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b600082815260208190526040902060010154610eaa81611244565b61092283836118c7565b600080527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610f3157610f318133611435565b878614610fc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b87841461104f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b60006110618a8a8a8a8a8a8a8a610d4f565b905061106d81856114ed565b60005b8981101561114b5760008b8b8381811061108c5761108c612331565b90506020020160208101906110a19190612360565b905060008a8a848181106110b7576110b7612331565b9050602002013590503660008a8a868181106110d5576110d5612331565b90506020028101906110e7919061237b565b915091506110f78484848461162a565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588686868660405161112e94939291906122f1565b60405180910390a350505050806111449061240f565b9050611070565b506111558161172e565b50505050505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161580159061123257507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123291906125be565b1561123d5750600090565b5060025490565b61124e8133611435565b50565b61125a82610927565b156112e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109e1565b6112ef611161565b81101561137e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109e1565b61138881426125e0565b6000928352600160205260409092209190915550565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107d957507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107d9565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109f4576114738161197e565b61147e83602061199d565b60405160200161148f929190612617565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109e191600401612698565b6114f6826108d7565b611582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109e1565b80158061159e5750600081815260016020819052604090912054145b6109f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109e1565b60008473ffffffffffffffffffffffffffffffffffffffff168484846040516116549291906126e9565b60006040518083038185875af1925050503d8060008114611691576040519150601f19603f3d011682016040523d82523d6000602084013e611696565b606091505b5050905080611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109e1565b5050505050565b611737816108d7565b6117c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109e1565b600090815260016020819052604090912055565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109f45760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556118693390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109f45760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107d973ffffffffffffffffffffffffffffffffffffffff831660145b606060006119ac8360026126f9565b6119b79060026125e0565b67ffffffffffffffff8111156119cf576119cf611d8e565b6040519080825280601f01601f1916602001820160405280156119f9576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611a3057611a30612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a9357611a93612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000611acf8460026126f9565b611ada9060016125e0565b90505b6001811115611b77577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611b1b57611b1b612331565b1a60f81b828281518110611b3157611b31612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c93611b7081612710565b9050611add565b5083156108f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109e1565b803573ffffffffffffffffffffffffffffffffffffffff81168114611c0457600080fd5b919050565b60008083601f840112611c1b57600080fd5b50813567ffffffffffffffff811115611c3357600080fd5b602083019150836020828501011115611c4b57600080fd5b9250929050565b600080600080600080600060c0888a031215611c6d57600080fd5b611c7688611be0565b965060208801359550604088013567ffffffffffffffff811115611c9957600080fd5b611ca58a828b01611c09565b989b979a50986060810135976080820135975060a09091013595509350505050565b600060208284031215611cd957600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108f657600080fd5b60008060008060008060a08789031215611d2257600080fd5b611d2b87611be0565b955060208701359450604087013567ffffffffffffffff811115611d4e57600080fd5b611d5a89828a01611c09565b979a9699509760608101359660809091013595509350505050565b600060208284031215611d8757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611e0457611e04611d8e565b604052919050565b600082601f830112611e1d57600080fd5b813567ffffffffffffffff811115611e3757611e37611d8e565b611e6860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611dbd565b818152846020838601011115611e7d57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611eb057600080fd5b611eb985611be0565b9350611ec760208601611be0565b925060408501359150606085013567ffffffffffffffff811115611eea57600080fd5b611ef687828801611e0c565b91505092959194509250565b60008060408385031215611f1557600080fd5b82359150611f2560208401611be0565b90509250929050565b60008083601f840112611f4057600080fd5b50813567ffffffffffffffff811115611f5857600080fd5b6020830191508360208260051b8501011115611c4b57600080fd5b600080600080600080600080600060c08a8c031215611f9157600080fd5b893567ffffffffffffffff80821115611fa957600080fd5b611fb58d838e01611f2e565b909b50995060208c0135915080821115611fce57600080fd5b611fda8d838e01611f2e565b909950975060408c0135915080821115611ff357600080fd5b506120008c828d01611f2e565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b60008060008060008060008060a0898b03121561204157600080fd5b883567ffffffffffffffff8082111561205957600080fd5b6120658c838d01611f2e565b909a50985060208b013591508082111561207e57600080fd5b61208a8c838d01611f2e565b909850965060408b01359150808211156120a357600080fd5b506120b08b828c01611f2e565b999c989b509699959896976060870135966080013595509350505050565b600082601f8301126120df57600080fd5b8135602067ffffffffffffffff8211156120fb576120fb611d8e565b8160051b61210a828201611dbd565b928352848101820192828101908785111561212457600080fd5b83870192505b848310156121435782358252918301919083019061212a565b979650505050505050565b600080600080600060a0868803121561216657600080fd5b61216f86611be0565b945061217d60208701611be0565b9350604086013567ffffffffffffffff8082111561219a57600080fd5b6121a689838a016120ce565b945060608801359150808211156121bc57600080fd5b6121c889838a016120ce565b935060808801359150808211156121de57600080fd5b506121eb88828901611e0c565b9150509295509295909350565b600080600080600060a0868803121561221057600080fd5b61221986611be0565b945061222760208701611be0565b93506040860135925060608601359150608086013567ffffffffffffffff81111561225157600080fd5b6121eb88828901611e0c565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a0604082015260006122dc60a08301868861225d565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260606040820152600061232760608301848661225d565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561237257600080fd5b6108f682611be0565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126123b057600080fd5b83018035915067ffffffffffffffff8211156123cb57600080fd5b602001915036819003821315611c4b57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612440576124406123e0565b5060010190565b81835260006020808501808196508560051b810191508460005b878110156124ea57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126124a057600080fd5b8701858101903567ffffffffffffffff8111156124bc57600080fd5b8036038213156124cb57600080fd5b6124d686828461225d565b9a87019a9550505090840190600101612461565b5091979650505050505050565b60a0808252810188905260008960c08301825b8b8110156125455773ffffffffffffffffffffffffffffffffffffffff61253084611be0565b1682526020928301929091019060010161250a565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff89111561257e57600080fd5b8860051b9150818a602083013701828103602090810160408501526125a69082018789612447565b60608401959095525050608001529695505050505050565b6000602082840312156125d057600080fd5b815180151581146108f657600080fd5b808201808211156107d9576107d96123e0565b60005b8381101561260e5781810151838201526020016125f6565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161264f8160178501602088016125f3565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000601791840191820152835161268c8160288401602088016125f3565b01602801949350505050565b60208152600082518060208401526126b78160408501602087016125f3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b8183823760009101908152919050565b80820281158282048414176107d9576107d96123e0565b60008161271f5761271f6123e0565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea264697066735822122048ac459f9165e9eaa91bead23625fe941931ad2332a61820c2a6d1dcd92c218164736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMV2.json b/compiled-contracts/paris/PolygonZkEVMV2.json index 6e454b04e..e07801a3d 100644 --- a/compiled-contracts/paris/PolygonZkEVMV2.json +++ b/compiled-contracts/paris/PolygonZkEVMV2.json @@ -16,7 +16,7 @@ "type": "address" }, { - "internalType": "contract IPolygonZkEVMBridge", + "internalType": "contract IPolygonZkEVMBridgeV2", "name": "_bridgeAddress", "type": "address" }, @@ -99,6 +99,11 @@ "name": "HaltTimeoutNotExpired", "type": "error" }, + { + "inputs": [], + "name": "HugeTokenMetadataNotSupported", + "type": "error" + }, { "inputs": [], "name": "InitNumBatchAboveLastVerifiedBatch", @@ -304,6 +309,31 @@ "name": "ForceBatch", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "lastGlobalExitRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "sequencer", + "type": "address" + } + ], + "name": "InitialSequenceBatches", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -422,7 +452,33 @@ }, { "inputs": [], - "name": "BASE_INITIALIZE_TX_BRIDGE", + "name": "GLOBAL_EXIT_ROOT_MANAGER_L2", + "outputs": [ + { + "internalType": "contract IBasePolygonZkEVMGlobalExitRoot", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_LIST_LEN_LEN", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS", "outputs": [ { "internalType": "bytes", @@ -435,12 +491,25 @@ }, { "inputs": [], - "name": "GLOBAL_EXIT_ROOT_MANAGER_L2", + "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS", "outputs": [ { - "internalType": "contract IBasePolygonZkEVMGlobalExitRoot", + "internalType": "bytes", "name": "", - "type": "address" + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_CONSTANT_BYTES", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" } ], "stateMutability": "view", @@ -530,7 +599,7 @@ "name": "bridgeAddress", "outputs": [ { - "internalType": "contract IPolygonZkEVMBridge", + "internalType": "contract IPolygonZkEVMBridgeV2", "name": "", "type": "address" } @@ -643,6 +712,11 @@ "internalType": "uint32", "name": "_gasTokenNetwork", "type": "uint32" + }, + { + "internalType": "bytes", + "name": "_gasTokenMetadata", + "type": "bytes" } ], "name": "generateInitializeTransaction", @@ -653,7 +727,7 @@ "type": "bytes" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { @@ -691,11 +765,6 @@ "name": "_gasTokenAddress", "type": "address" }, - { - "internalType": "uint32", - "name": "_gasTokenNetwork", - "type": "uint32" - }, { "internalType": "string", "name": "sequencerURL", @@ -1001,8 +1070,8 @@ "type": "function" } ], - "bytecode": "0x6101006040523480156200001257600080fd5b5060405162002c5238038062002c52833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e051612ac16200019160003960008181610306015281816106a30152818161073e015281816109b801528181610b1501528181611012015281816110aa015281816110cc015281816112140152818161193c015281816119b90152611a990152600081816103d5015261118a01526000818161045b01528181610e220152611b980152600081816104a80152818161052f01528181611057015281816111600152611b6c0152612ac16000f3fe608060405234801561001057600080fd5b50600436106101b65760003560e01c8062d0295d146101bb578063107bf28c146101d657806319d8ac61146101eb57806326782247146102165780632b35b3ac1461023657806332c2d153146102535780633c351e10146102685780633cbc795b1461028057806340b5de6c146102ac57806345605267146102d457806347ebf108146102ee57806349b7b802146103015780634e48770614610328578063542028d51461033b5780635e9145c9146103435780635ec91958146103565780636b8616ce1461035e5780636e05d2cd1461037e5780636ff512cc146103875780638c3d73011461039a57806399af0397146103a25780639e001877146103b5578063a3c573eb146103d0578063ada8f919146103f7578063b0afe1541461040a578063c754c7ed14610416578063c89e42df14610430578063cfa8ed4714610443578063d02103ca14610456578063d690be311461047d578063d7bc90ff14610485578063d8d1091b14610490578063e46761c4146104a3578063e7a7ed02146104ca578063eaeb077b146104e4578063f35dda47146104f7578063f851a44014610511575b600080fd5b6101c361052a565b6040519081526020015b60405180910390f35b6101de610613565b6040516101cd91906120d3565b6007546101fe906001600160401b031681565b6040516001600160401b0390911681526020016101cd565b600154610229906001600160a01b031681565b6040516101cd91906120ed565b6008546102439060ff1681565b60405190151581526020016101cd565b610266610261366004612135565b6106a1565b005b6008546102299061010090046001600160a01b031681565b60085461029790600160a81b900463ffffffff1681565b60405163ffffffff90911681526020016101cd565b6102bb6001600160f81b031981565b6040516001600160f81b031990911681526020016101cd565b6007546101fe90600160801b90046001600160401b031681565b6102666102fc366004612229565b61073c565b6102297f000000000000000000000000000000000000000000000000000000000000000081565b6102666103363660046122df565b610ab5565b6101de610c2c565b610266610351366004612347565b610c39565b6102666112c0565b6101c361036c3660046122df565b60066020526000908152604090205481565b6101c360055481565b610266610395366004612391565b61134d565b6102666113c9565b6101de6103b03660046123ac565b611456565b61022973a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6102297f000000000000000000000000000000000000000000000000000000000000000081565b610266610405366004612391565b6115e3565b6101c36405ca1ab1e081565b6007546101fe90600160c01b90046001600160401b031681565b61026661043e3660046123e6565b61165f565b600254610229906001600160a01b031681565b6102297f000000000000000000000000000000000000000000000000000000000000000081565b6101de6116cc565b6101c3635ca1ab1e81565b61026661049e36600461241a565b6116e8565b6102297f000000000000000000000000000000000000000000000000000000000000000081565b6007546101fe90600160401b90046001600160401b031681565b6102666104f236600461245b565b611a72565b6104ff601b81565b60405160ff90911681526020016101cd565b600054610229906201000090046001600160a01b031681565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161057991906120ed565b602060405180830381865afa158015610596573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ba91906124d2565b6007549091506000906105e6906001600160401b03600160801b8204811691600160401b900416612501565b6001600160401b03169050806000036106025760009250505090565b61060c8183612528565b9250505090565b600480546106209061254a565b80601f016020809104026020016040519081016040528092919081815260200182805461064c9061254a565b80156106995780601f1061066e57610100808354040283529160200191610699565b820191906000526020600020905b81548152906001019060200180831161067c57829003601f168201915b505050505081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146106ea57604051631736745960e31b815260040160405180910390fd5b806001600160a01b0316836001600160401b03167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59668460405161072f91815260200190565b60405180910390a3505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461078557604051631736745960e31b815260040160405180910390fd5b600054610100900460ff16158080156107a55750600054600160ff909116105b806107c657506107b430611d6e565b1580156107c6575060005460ff166001145b61082e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff191660011790558015610851576000805461ff0019166101001790555b6000805462010000600160b01b031916620100006001600160a01b038b81169190910291909117909155600280546001600160a01b031916918916919091179055600361089e84826125d2565b5060046108ab83826125d2565b50600780546001600160c01b0316610d2f60c71b1790556001600160a01b0385166108f55763ffffffff8416156108f557604051630d43a60960e11b815260040160405180910390fd5b60088054610100600160c81b0319166101006001600160a01b0388160263ffffffff60a81b191617600160a81b63ffffffff871602179055600061093a878787611456565b9050600081805190602001209050600042905060008060001b836000801b848e60405160200161096e959493929190612691565b60408051808303601f19018152908290528051602090910120600780546001600160401b0319166001600160401b0386161790556005819055639a908e7360e01b825291506000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639a908e73906109f89060019086906004016126d0565b6020604051808303816000875af1158015610a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3b91906126e9565b6040519091506001600160401b03821690600080516020612a2b83398151915290600090a250505050508015610aab576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6000546201000090046001600160a01b03163314610ae657604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610b135760405163f5e37f2f60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b959190612706565b610bcf576007546001600160401b03600160c01b909104811690821610610bcf5760405163f5e37f2f60e01b815260040160405180910390fd5b600780546001600160c01b0316600160c01b6001600160401b038416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546106209061254a565b6002546001600160a01b03163314610c64576040516311e7be1560e01b815260040160405180910390fd5b816000819003610c875760405163cb591a5f60e01b815260040160405180910390fd5b6103e8811115610caa57604051635acfba9d60e11b815260040160405180910390fd5b6007546005546001600160401b0380831692600160801b900416908160005b85811015610f80576000898983818110610ce557610ce5612728565b9050602002810190610cf7919061273e565b610d009061275e565b805180516020909101206060820151919250906001600160401b031615610df85785610d2b816127ee565b96505060008183602001518460600151604051602001610d4d9392919061281c565b60408051601f1981840301815291815281516020928301206001600160401b038a16600090815260069093529120549091508114610d9e5760405163671ebaaf60e11b815260040160405180910390fd5b82606001516001600160401b031683604001516001600160401b03161015610dd957604051633fbd5c3960e11b815260040160405180910390fd5b506001600160401b038616600090815260066020526040812055610edd565b602082015115801590610e99575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303816000875af1158015610e73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9791906124d2565b155b15610eb7576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c01015610edd576040516328a69b1f60e21b815260040160405180910390fd5b866001600160401b031682604001516001600160401b03161080610f0d57504282604001516001600160401b0316115b15610f2b576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518c604051602001610f4c959493929190612691565b6040516020818303038152906040528051906020012094508160400151965050508080610f789061283f565b915050610cc9565b506007546001600160401b03600160401b90910481169084161115610fb85760405163c630a00d60e01b815260040160405180910390fd5b600780546001600160401b0319166001600160401b038681169190911790915560058390558590828116908516146110a4576000610ff68386612501565b905061100b6001600160401b03821683612858565b915061107e7f0000000000000000000000000000000000000000000000000000000000000000826001600160401b031661104361052a565b61104d9190612871565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190611d7d565b5060078054600160801b600160c01b031916600160801b6001600160401b038716021790555b611188337f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611128573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114c91906124d2565b6111569190612871565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190611de5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156111e357600080fd5b505af11580156111f7573d6000803e3d6000fd5b5050604051639a908e7360e01b8152600092506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150639a908e739061124c908a9088906004016126d0565b6020604051808303816000875af115801561126b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128f91906126e9565b6040519091506001600160401b03821690600080516020612a2b83398151915290600090a250505050505050505050565b6000546201000090046001600160a01b031633146112f157604051634755657960e01b815260040160405180910390fd5b60085460ff16156113155760405163f6ba91a160e01b815260040160405180910390fd5b6008805460ff191660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b6000546201000090046001600160a01b0316331461137e57604051634755657960e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383161790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610c219083906120ed565b6001546001600160a01b031633146113f45760405163d1ec4b2360e01b815260040160405180910390fd5b60015460008054620100006001600160a01b0390931692830262010000600160b01b03199091161790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9161144c916120ed565b60405180910390a1565b60606000604051806060016040528060218152602001612a6b6021913960405163ffffffff80881660248301526001600160a01b03871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa6084820152600060a482015260c40160408051601f19818403018152918152602080830180516001600160e01b03166369a3b57f60e11b17905290516114f693929101612888565b60408051601f198184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015611566573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661159a5760405163668b0cb360e11b815260040160405180910390fd5b6040516000906115c89084906405ca1ab1e090635ca1ab1e90601b906001600160f81b0319906020016128b7565b60408051808303601f19018152919052979650505050505050565b6000546201000090046001600160a01b0316331461161457604051634755657960e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610c219083906120ed565b6000546201000090046001600160a01b0316331461169057604051634755657960e01b815260040160405180910390fd5b600361169c82826125d2565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c2191906120d3565b604051806060016040528060218152602001612a6b6021913981565b60085460ff1661170b576040516324eff8c360e01b815260040160405180910390fd5b80600081900361172e5760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561175157604051635acfba9d60e11b815260040160405180910390fd5b6007546001600160401b03600160401b8204811691611779918491600160801b9004166128fb565b11156117985760405163c630a00d60e01b815260040160405180910390fd5b600754600554600160801b9091046001600160401b03169060005b838110156119365760008686838181106117cf576117cf612728565b90506020028101906117e1919061290e565b6117ea90612924565b9050836117f6816127ee565b82518051602091820120818501516040808701519051949950919450600093611822938693910161281c565b60408051601f1981840301815291815281516020928301206001600160401b0389166000908152600690935291205490915081146118735760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b038616600090815260066020526040812055611897600188612858565b84036118eb5742600760189054906101000a90046001600160401b031684604001516118c391906129a1565b6001600160401b031611156118eb5760405163c44a082160e01b815260040160405180910390fd5b848284602001514233604051602001611908959493929190612691565b604051602081830303815290604052805190602001209450505050808061192e9061283f565b9150506117b3565b506119647f00000000000000000000000000000000000000000000000000000000000000008461104361052a565b6005819055600780546001600160401b03848116600160801b026001600160401b03600160801b03600160c01b0319909216429190911617179055604051639a908e7360e01b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906119f090879086906004016126d0565b6020604051808303816000875af1158015611a0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3391906126e9565b6040519091506001600160401b038216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16611a95576040516324eff8c360e01b815260040160405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015611af5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1991906124d2565b905081811115611b3c57604051632354600f60e01b815260040160405180910390fd5b611388831115611b5f576040516328a69b1f60e21b815260040160405180910390fd5b611b946001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084611de5565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1891906124d2565b60078054919250600160401b9091046001600160401b0316906008611c3c836127ee565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508484604051611c719291906129c1565b604051908190038120611c8a918390429060200161281c565b60408051808303601f190181529181528151602092830120600754600160401b90046001600160401b031660009081526006909352912055323303611d1c57600754604080518381523360208201526060918101829052600091810191909152600160401b9091046001600160401b031690600080516020612a4b8339815191529060800160405180910390a2611d67565b600760089054906101000a90046001600160401b03166001600160401b0316600080516020612a4b83398151915282338888604051611d5e94939291906129d1565b60405180910390a25b5050505050565b6001600160a01b03163b151590565b6040516001600160a01b038316602482015260448101829052611de090849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611e23565b505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611e1d9085906323b872dd60e01b90608401611da9565b50505050565b6000611e78826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ef59092919063ffffffff16565b805190915015611de05780806020019051810190611e969190612706565b611de05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610825565b6060611f048484600085611f0c565b949350505050565b606082471015611f6d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610825565b600080866001600160a01b03168587604051611f899190612a18565b60006040518083038185875af1925050503d8060008114611fc6576040519150601f19603f3d011682016040523d82523d6000602084013e611fcb565b606091505b5091509150611fdc87838387611fe7565b979650505050505050565b6060831561205457825160000361204d5761200185611d6e565b61204d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610825565b5081611f04565b611f0483838151156120695781518083602001fd5b8060405162461bcd60e51b815260040161082591906120d3565b60005b8381101561209e578181015183820152602001612086565b50506000910152565b600081518084526120bf816020860160208601612083565b601f01601f19169290920160200192915050565b6020815260006120e660208301846120a7565b9392505050565b6001600160a01b0391909116815260200190565b6001600160401b038116811461211657600080fd5b50565b80356001600160a01b038116811461213057600080fd5b919050565b60008060006060848603121561214a57600080fd5b833561215581612101565b92506020840135915061216a60408501612119565b90509250925092565b803563ffffffff8116811461213057600080fd5b634e487b7160e01b600052604160045260246000fd5b600082601f8301126121ae57600080fd5b81356001600160401b03808211156121c8576121c8612187565b604051601f8301601f19908116603f011681019082821181831017156121f0576121f0612187565b8160405283815286602085880101111561220957600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121561224457600080fd5b61224d88612119565b965061225b60208901612119565b955061226960408901612173565b945061227760608901612119565b935061228560808901612173565b925060a08801356001600160401b03808211156122a157600080fd5b6122ad8b838c0161219d565b935060c08a01359150808211156122c357600080fd5b506122d08a828b0161219d565b91505092959891949750929550565b6000602082840312156122f157600080fd5b81356120e681612101565b60008083601f84011261230e57600080fd5b5081356001600160401b0381111561232557600080fd5b6020830191508360208260051b850101111561234057600080fd5b9250929050565b60008060006040848603121561235c57600080fd5b83356001600160401b0381111561237257600080fd5b61237e868287016122fc565b909450925061216a905060208501612119565b6000602082840312156123a357600080fd5b6120e682612119565b6000806000606084860312156123c157600080fd5b6123ca84612173565b92506123d860208501612119565b915061216a60408501612173565b6000602082840312156123f857600080fd5b81356001600160401b0381111561240e57600080fd5b611f048482850161219d565b6000806020838503121561242d57600080fd5b82356001600160401b0381111561244357600080fd5b61244f858286016122fc565b90969095509350505050565b60008060006040848603121561247057600080fd5b83356001600160401b038082111561248757600080fd5b818601915086601f83011261249b57600080fd5b8135818111156124aa57600080fd5b8760208285010111156124bc57600080fd5b6020928301989097509590910135949350505050565b6000602082840312156124e457600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03828116828216039080821115612521576125216124eb565b5092915050565b60008261254557634e487b7160e01b600052601260045260246000fd5b500490565b600181811c9082168061255e57607f821691505b60208210810361257e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115611de057600081815260208120601f850160051c810160208610156125ab5750805b601f850160051c820191505b818110156125ca578281556001016125b7565b505050505050565b81516001600160401b038111156125eb576125eb612187565b6125ff816125f9845461254a565b84612584565b602080601f831160018114612634576000841561261c5750858301515b600019600386901b1c1916600185901b1785556125ca565b600085815260208120601f198616915b8281101561266357888601518255948401946001909101908401612644565b50858210156126815787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b6001600160401b03929092168252602082015260400190565b6000602082840312156126fb57600080fd5b81516120e681612101565b60006020828403121561271857600080fd5b815180151581146120e657600080fd5b634e487b7160e01b600052603260045260246000fd5b60008235607e1983360301811261275457600080fd5b9190910192915050565b60006080823603121561277057600080fd5b604051608081016001600160401b03808211838310171561279357612793612187565b8160405284359150808211156127a857600080fd5b506127b53682860161219d565b8252506020830135602082015260408301356127d081612101565b604082015260608301356127e381612101565b606082015292915050565b60006001600160401b038281166002600160401b03198101612812576128126124eb565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b600060018201612851576128516124eb565b5060010190565b8181038181111561286b5761286b6124eb565b92915050565b808202811582820484141761286b5761286b6124eb565b6000835161289a818460208801612083565b8351908301906128ae818360208801612083565b01949350505050565b600086516128c9818460208b01612083565b9190910194855250602084019290925260f81b6001600160f81b03199081166040840152166041820152604201919050565b8082018082111561286b5761286b6124eb565b60008235605e1983360301811261275457600080fd5b60006060823603121561293657600080fd5b604051606081016001600160401b03808211838310171561295957612959612187565b81604052843591508082111561296e57600080fd5b5061297b3682860161219d565b82525060208301356020820152604083013561299681612101565b604082015292915050565b6001600160401b03818116838216019080821115612521576125216124eb565b8183823760009101908152919050565b8481526001600160a01b03841660208201526060604082018190528101829052818360808301376000818301608090810191909152601f909201601f191601019392505050565b6000825161275481846020870161208356fe303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fcef94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931f8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a2646970667358221220c650ce1567bb7660d93084dd33c284f37641ef24af0ba80a7f5c878ce8807cde64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101b65760003560e01c8062d0295d146101bb578063107bf28c146101d657806319d8ac61146101eb57806326782247146102165780632b35b3ac1461023657806332c2d153146102535780633c351e10146102685780633cbc795b1461028057806340b5de6c146102ac57806345605267146102d457806347ebf108146102ee57806349b7b802146103015780634e48770614610328578063542028d51461033b5780635e9145c9146103435780635ec91958146103565780636b8616ce1461035e5780636e05d2cd1461037e5780636ff512cc146103875780638c3d73011461039a57806399af0397146103a25780639e001877146103b5578063a3c573eb146103d0578063ada8f919146103f7578063b0afe1541461040a578063c754c7ed14610416578063c89e42df14610430578063cfa8ed4714610443578063d02103ca14610456578063d690be311461047d578063d7bc90ff14610485578063d8d1091b14610490578063e46761c4146104a3578063e7a7ed02146104ca578063eaeb077b146104e4578063f35dda47146104f7578063f851a44014610511575b600080fd5b6101c361052a565b6040519081526020015b60405180910390f35b6101de610613565b6040516101cd91906120d3565b6007546101fe906001600160401b031681565b6040516001600160401b0390911681526020016101cd565b600154610229906001600160a01b031681565b6040516101cd91906120ed565b6008546102439060ff1681565b60405190151581526020016101cd565b610266610261366004612135565b6106a1565b005b6008546102299061010090046001600160a01b031681565b60085461029790600160a81b900463ffffffff1681565b60405163ffffffff90911681526020016101cd565b6102bb6001600160f81b031981565b6040516001600160f81b031990911681526020016101cd565b6007546101fe90600160801b90046001600160401b031681565b6102666102fc366004612229565b61073c565b6102297f000000000000000000000000000000000000000000000000000000000000000081565b6102666103363660046122df565b610ab5565b6101de610c2c565b610266610351366004612347565b610c39565b6102666112c0565b6101c361036c3660046122df565b60066020526000908152604090205481565b6101c360055481565b610266610395366004612391565b61134d565b6102666113c9565b6101de6103b03660046123ac565b611456565b61022973a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6102297f000000000000000000000000000000000000000000000000000000000000000081565b610266610405366004612391565b6115e3565b6101c36405ca1ab1e081565b6007546101fe90600160c01b90046001600160401b031681565b61026661043e3660046123e6565b61165f565b600254610229906001600160a01b031681565b6102297f000000000000000000000000000000000000000000000000000000000000000081565b6101de6116cc565b6101c3635ca1ab1e81565b61026661049e36600461241a565b6116e8565b6102297f000000000000000000000000000000000000000000000000000000000000000081565b6007546101fe90600160401b90046001600160401b031681565b6102666104f236600461245b565b611a72565b6104ff601b81565b60405160ff90911681526020016101cd565b600054610229906201000090046001600160a01b031681565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161057991906120ed565b602060405180830381865afa158015610596573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ba91906124d2565b6007549091506000906105e6906001600160401b03600160801b8204811691600160401b900416612501565b6001600160401b03169050806000036106025760009250505090565b61060c8183612528565b9250505090565b600480546106209061254a565b80601f016020809104026020016040519081016040528092919081815260200182805461064c9061254a565b80156106995780601f1061066e57610100808354040283529160200191610699565b820191906000526020600020905b81548152906001019060200180831161067c57829003601f168201915b505050505081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146106ea57604051631736745960e31b815260040160405180910390fd5b806001600160a01b0316836001600160401b03167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59668460405161072f91815260200190565b60405180910390a3505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461078557604051631736745960e31b815260040160405180910390fd5b600054610100900460ff16158080156107a55750600054600160ff909116105b806107c657506107b430611d6e565b1580156107c6575060005460ff166001145b61082e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff191660011790558015610851576000805461ff0019166101001790555b6000805462010000600160b01b031916620100006001600160a01b038b81169190910291909117909155600280546001600160a01b031916918916919091179055600361089e84826125d2565b5060046108ab83826125d2565b50600780546001600160c01b0316610d2f60c71b1790556001600160a01b0385166108f55763ffffffff8416156108f557604051630d43a60960e11b815260040160405180910390fd5b60088054610100600160c81b0319166101006001600160a01b0388160263ffffffff60a81b191617600160a81b63ffffffff871602179055600061093a878787611456565b9050600081805190602001209050600042905060008060001b836000801b848e60405160200161096e959493929190612691565b60408051808303601f19018152908290528051602090910120600780546001600160401b0319166001600160401b0386161790556005819055639a908e7360e01b825291506000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639a908e73906109f89060019086906004016126d0565b6020604051808303816000875af1158015610a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3b91906126e9565b6040519091506001600160401b03821690600080516020612a2b83398151915290600090a250505050508015610aab576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6000546201000090046001600160a01b03163314610ae657604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610b135760405163f5e37f2f60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b959190612706565b610bcf576007546001600160401b03600160c01b909104811690821610610bcf5760405163f5e37f2f60e01b815260040160405180910390fd5b600780546001600160c01b0316600160c01b6001600160401b038416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546106209061254a565b6002546001600160a01b03163314610c64576040516311e7be1560e01b815260040160405180910390fd5b816000819003610c875760405163cb591a5f60e01b815260040160405180910390fd5b6103e8811115610caa57604051635acfba9d60e11b815260040160405180910390fd5b6007546005546001600160401b0380831692600160801b900416908160005b85811015610f80576000898983818110610ce557610ce5612728565b9050602002810190610cf7919061273e565b610d009061275e565b805180516020909101206060820151919250906001600160401b031615610df85785610d2b816127ee565b96505060008183602001518460600151604051602001610d4d9392919061281c565b60408051601f1981840301815291815281516020928301206001600160401b038a16600090815260069093529120549091508114610d9e5760405163671ebaaf60e11b815260040160405180910390fd5b82606001516001600160401b031683604001516001600160401b03161015610dd957604051633fbd5c3960e11b815260040160405180910390fd5b506001600160401b038616600090815260066020526040812055610edd565b602082015115801590610e99575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303816000875af1158015610e73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9791906124d2565b155b15610eb7576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c01015610edd576040516328a69b1f60e21b815260040160405180910390fd5b866001600160401b031682604001516001600160401b03161080610f0d57504282604001516001600160401b0316115b15610f2b576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518c604051602001610f4c959493929190612691565b6040516020818303038152906040528051906020012094508160400151965050508080610f789061283f565b915050610cc9565b506007546001600160401b03600160401b90910481169084161115610fb85760405163c630a00d60e01b815260040160405180910390fd5b600780546001600160401b0319166001600160401b038681169190911790915560058390558590828116908516146110a4576000610ff68386612501565b905061100b6001600160401b03821683612858565b915061107e7f0000000000000000000000000000000000000000000000000000000000000000826001600160401b031661104361052a565b61104d9190612871565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190611d7d565b5060078054600160801b600160c01b031916600160801b6001600160401b038716021790555b611188337f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611128573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114c91906124d2565b6111569190612871565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190611de5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156111e357600080fd5b505af11580156111f7573d6000803e3d6000fd5b5050604051639a908e7360e01b8152600092506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150639a908e739061124c908a9088906004016126d0565b6020604051808303816000875af115801561126b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128f91906126e9565b6040519091506001600160401b03821690600080516020612a2b83398151915290600090a250505050505050505050565b6000546201000090046001600160a01b031633146112f157604051634755657960e01b815260040160405180910390fd5b60085460ff16156113155760405163f6ba91a160e01b815260040160405180910390fd5b6008805460ff191660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b6000546201000090046001600160a01b0316331461137e57604051634755657960e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383161790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610c219083906120ed565b6001546001600160a01b031633146113f45760405163d1ec4b2360e01b815260040160405180910390fd5b60015460008054620100006001600160a01b0390931692830262010000600160b01b03199091161790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9161144c916120ed565b60405180910390a1565b60606000604051806060016040528060218152602001612a6b6021913960405163ffffffff80881660248301526001600160a01b03871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa6084820152600060a482015260c40160408051601f19818403018152918152602080830180516001600160e01b03166369a3b57f60e11b17905290516114f693929101612888565b60408051601f198184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015611566573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661159a5760405163668b0cb360e11b815260040160405180910390fd5b6040516000906115c89084906405ca1ab1e090635ca1ab1e90601b906001600160f81b0319906020016128b7565b60408051808303601f19018152919052979650505050505050565b6000546201000090046001600160a01b0316331461161457604051634755657960e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610c219083906120ed565b6000546201000090046001600160a01b0316331461169057604051634755657960e01b815260040160405180910390fd5b600361169c82826125d2565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c2191906120d3565b604051806060016040528060218152602001612a6b6021913981565b60085460ff1661170b576040516324eff8c360e01b815260040160405180910390fd5b80600081900361172e5760405163cb591a5f60e01b815260040160405180910390fd5b6103e881111561175157604051635acfba9d60e11b815260040160405180910390fd5b6007546001600160401b03600160401b8204811691611779918491600160801b9004166128fb565b11156117985760405163c630a00d60e01b815260040160405180910390fd5b600754600554600160801b9091046001600160401b03169060005b838110156119365760008686838181106117cf576117cf612728565b90506020028101906117e1919061290e565b6117ea90612924565b9050836117f6816127ee565b82518051602091820120818501516040808701519051949950919450600093611822938693910161281c565b60408051601f1981840301815291815281516020928301206001600160401b0389166000908152600690935291205490915081146118735760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b038616600090815260066020526040812055611897600188612858565b84036118eb5742600760189054906101000a90046001600160401b031684604001516118c391906129a1565b6001600160401b031611156118eb5760405163c44a082160e01b815260040160405180910390fd5b848284602001514233604051602001611908959493929190612691565b604051602081830303815290604052805190602001209450505050808061192e9061283f565b9150506117b3565b506119647f00000000000000000000000000000000000000000000000000000000000000008461104361052a565b6005819055600780546001600160401b03848116600160801b026001600160401b03600160801b03600160c01b0319909216429190911617179055604051639a908e7360e01b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906119f090879086906004016126d0565b6020604051808303816000875af1158015611a0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3391906126e9565b6040519091506001600160401b038216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16611a95576040516324eff8c360e01b815260040160405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015611af5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1991906124d2565b905081811115611b3c57604051632354600f60e01b815260040160405180910390fd5b611388831115611b5f576040516328a69b1f60e21b815260040160405180910390fd5b611b946001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084611de5565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1891906124d2565b60078054919250600160401b9091046001600160401b0316906008611c3c836127ee565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508484604051611c719291906129c1565b604051908190038120611c8a918390429060200161281c565b60408051808303601f190181529181528151602092830120600754600160401b90046001600160401b031660009081526006909352912055323303611d1c57600754604080518381523360208201526060918101829052600091810191909152600160401b9091046001600160401b031690600080516020612a4b8339815191529060800160405180910390a2611d67565b600760089054906101000a90046001600160401b03166001600160401b0316600080516020612a4b83398151915282338888604051611d5e94939291906129d1565b60405180910390a25b5050505050565b6001600160a01b03163b151590565b6040516001600160a01b038316602482015260448101829052611de090849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611e23565b505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611e1d9085906323b872dd60e01b90608401611da9565b50505050565b6000611e78826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ef59092919063ffffffff16565b805190915015611de05780806020019051810190611e969190612706565b611de05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610825565b6060611f048484600085611f0c565b949350505050565b606082471015611f6d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610825565b600080866001600160a01b03168587604051611f899190612a18565b60006040518083038185875af1925050503d8060008114611fc6576040519150601f19603f3d011682016040523d82523d6000602084013e611fcb565b606091505b5091509150611fdc87838387611fe7565b979650505050505050565b6060831561205457825160000361204d5761200185611d6e565b61204d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610825565b5081611f04565b611f0483838151156120695781518083602001fd5b8060405162461bcd60e51b815260040161082591906120d3565b60005b8381101561209e578181015183820152602001612086565b50506000910152565b600081518084526120bf816020860160208601612083565b601f01601f19169290920160200192915050565b6020815260006120e660208301846120a7565b9392505050565b6001600160a01b0391909116815260200190565b6001600160401b038116811461211657600080fd5b50565b80356001600160a01b038116811461213057600080fd5b919050565b60008060006060848603121561214a57600080fd5b833561215581612101565b92506020840135915061216a60408501612119565b90509250925092565b803563ffffffff8116811461213057600080fd5b634e487b7160e01b600052604160045260246000fd5b600082601f8301126121ae57600080fd5b81356001600160401b03808211156121c8576121c8612187565b604051601f8301601f19908116603f011681019082821181831017156121f0576121f0612187565b8160405283815286602085880101111561220957600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121561224457600080fd5b61224d88612119565b965061225b60208901612119565b955061226960408901612173565b945061227760608901612119565b935061228560808901612173565b925060a08801356001600160401b03808211156122a157600080fd5b6122ad8b838c0161219d565b935060c08a01359150808211156122c357600080fd5b506122d08a828b0161219d565b91505092959891949750929550565b6000602082840312156122f157600080fd5b81356120e681612101565b60008083601f84011261230e57600080fd5b5081356001600160401b0381111561232557600080fd5b6020830191508360208260051b850101111561234057600080fd5b9250929050565b60008060006040848603121561235c57600080fd5b83356001600160401b0381111561237257600080fd5b61237e868287016122fc565b909450925061216a905060208501612119565b6000602082840312156123a357600080fd5b6120e682612119565b6000806000606084860312156123c157600080fd5b6123ca84612173565b92506123d860208501612119565b915061216a60408501612173565b6000602082840312156123f857600080fd5b81356001600160401b0381111561240e57600080fd5b611f048482850161219d565b6000806020838503121561242d57600080fd5b82356001600160401b0381111561244357600080fd5b61244f858286016122fc565b90969095509350505050565b60008060006040848603121561247057600080fd5b83356001600160401b038082111561248757600080fd5b818601915086601f83011261249b57600080fd5b8135818111156124aa57600080fd5b8760208285010111156124bc57600080fd5b6020928301989097509590910135949350505050565b6000602082840312156124e457600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03828116828216039080821115612521576125216124eb565b5092915050565b60008261254557634e487b7160e01b600052601260045260246000fd5b500490565b600181811c9082168061255e57607f821691505b60208210810361257e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115611de057600081815260208120601f850160051c810160208610156125ab5750805b601f850160051c820191505b818110156125ca578281556001016125b7565b505050505050565b81516001600160401b038111156125eb576125eb612187565b6125ff816125f9845461254a565b84612584565b602080601f831160018114612634576000841561261c5750858301515b600019600386901b1c1916600185901b1785556125ca565b600085815260208120601f198616915b8281101561266357888601518255948401946001909101908401612644565b50858210156126815787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b6001600160401b03929092168252602082015260400190565b6000602082840312156126fb57600080fd5b81516120e681612101565b60006020828403121561271857600080fd5b815180151581146120e657600080fd5b634e487b7160e01b600052603260045260246000fd5b60008235607e1983360301811261275457600080fd5b9190910192915050565b60006080823603121561277057600080fd5b604051608081016001600160401b03808211838310171561279357612793612187565b8160405284359150808211156127a857600080fd5b506127b53682860161219d565b8252506020830135602082015260408301356127d081612101565b604082015260608301356127e381612101565b606082015292915050565b60006001600160401b038281166002600160401b03198101612812576128126124eb565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b600060018201612851576128516124eb565b5060010190565b8181038181111561286b5761286b6124eb565b92915050565b808202811582820484141761286b5761286b6124eb565b6000835161289a818460208801612083565b8351908301906128ae818360208801612083565b01949350505050565b600086516128c9818460208b01612083565b9190910194855250602084019290925260f81b6001600160f81b03199081166040840152166041820152604201919050565b8082018082111561286b5761286b6124eb565b60008235605e1983360301811261275457600080fd5b60006060823603121561293657600080fd5b604051606081016001600160401b03808211838310171561295957612959612187565b81604052843591508082111561296e57600080fd5b5061297b3682860161219d565b82525060208301356020820152604083013561299681612101565b604082015292915050565b6001600160401b03818116838216019080821115612521576125216124eb565b8183823760009101908152919050565b8481526001600160a01b03841660208201526060604082018190528101829052818360808301376000818301608090810191909152601f909201601f191601019392505050565b6000825161275481846020870161208356fe303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fcef94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931f8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a2646970667358221220c650ce1567bb7660d93084dd33c284f37641ef24af0ba80a7f5c878ce8807cde64736f6c63430008140033", + "bytecode": "0x6101006040523480156200001257600080fd5b506040516200456738038062004567833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e0516143c1620001a6600039600081816104f90152818161093801528181610aa5015281816111fc015281816112c5015281816112e70152818161147e015281816116fb01528181611cb4015281816127c5015281816128930152612980015260008181610604015281816113bf0152818161195501526120b50152600081816106c001528181610f1f01528181611b0a0152612acb015260008181610705015281816107d00152818161124f015281816113950152612a9f01526143c16000f3fe608060405234801561001057600080fd5b50600436106102c75760003560e01c80636ff512cc1161017b578063c89e42df116100d8578063e46761c41161008c578063eaeb077b11610071578063eaeb077b14610747578063f35dda471461075a578063f851a4401461076257600080fd5b8063e46761c414610700578063e7a7ed021461072757600080fd5b8063d02103ca116100bd578063d02103ca146106bb578063d7bc90ff146106e2578063d8d1091b146106ed57600080fd5b8063c89e42df14610688578063cfa8ed471461069b57600080fd5b8063a3c573eb1161012f578063ada8f91911610114578063ada8f91914610639578063b0afe1541461064c578063c754c7ed1461065857600080fd5b8063a3c573eb146105ff578063a652f26c1461062657600080fd5b80637a5460c5116101605780637a5460c5146105a05780638c3d7301146105dc5780639e001877146105e457600080fd5b80636ff512cc1461057a578063712570221461058d57600080fd5b80633cbc795b11610229578063542028d5116101dd5780635ec91958116101c25780635ec91958146105495780636b8616ce146105515780636e05d2cd1461057157600080fd5b8063542028d51461052e5780635e9145c91461053657600080fd5b8063456052671161020e57806345605267146104cc57806349b7b802146104f45780634e4877061461051b57600080fd5b80633cbc795b1461043657806340b5de6c1461047457600080fd5b806319d8ac61116102805780632b35b3ac116102655780632b35b3ac146103df57806332c2d153146103fc5780633c351e101461041157600080fd5b806319d8ac611461036d578063267822471461039a57600080fd5b806305835f37116102b157806305835f3714610302578063107bf28c1461034b57806311e892d41461035357600080fd5b8062d0295d146102cc57806303508963146102e7575b600080fd5b6102d4610788565b6040519081526020015b60405180910390f35b6102ef602081565b60405161ffff90911681526020016102de565b61033e6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102de9190613637565b61033e6108a8565b61035b60f981565b60405160ff90911681526020016102de565b6007546103819067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102de565b6001546103ba9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102de565b6008546103ec9060ff1681565b60405190151581526020016102de565b61040f61040a36600461368c565b610936565b005b6008546103ba90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60085461045f907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102de565b61049b7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102de565b60075461038190700100000000000000000000000000000000900467ffffffffffffffff1681565b6103ba7f000000000000000000000000000000000000000000000000000000000000000081565b61040f6105293660046136ce565b610a05565b61033e610c1f565b61040f610544366004613737565b610c2c565b61040f611545565b6102d461055f3660046136ce565b60066020526000908152604090205481565b6102d460055481565b61040f610588366004613783565b61162f565b61040f61059b3660046138cc565b6116f9565b61033e6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61040f611eaf565b6103ba73a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103ba7f000000000000000000000000000000000000000000000000000000000000000081565b61033e610634366004613979565b611f82565b61040f610647366004613783565b6122ac565b6102d46405ca1ab1e081565b600754610381907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61040f6106963660046139ee565b612376565b6002546103ba9073ffffffffffffffffffffffffffffffffffffffff1681565b6103ba7f000000000000000000000000000000000000000000000000000000000000000081565b6102d4635ca1ab1e81565b61040f6106fb366004613a23565b612409565b6103ba7f000000000000000000000000000000000000000000000000000000000000000081565b6007546103819068010000000000000000900467ffffffffffffffff1681565b61040f610755366004613a65565b612940565b61035b601b81565b6000546103ba9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610817573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083b9190613add565b60075490915060009061087a9067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613b25565b67ffffffffffffffff169050806000036108975760009250505090565b6108a18183613b4d565b9250505090565b600480546108b590613b88565b80601f01602080910402602001604051908101604052809291908181526020018280546108e190613b88565b801561092e5780601f106109035761010080835404028352916020019161092e565b820191906000526020600020905b81548152906001019060200180831161091157829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109a5576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966846040516109f891815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a5c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610aa3576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b329190613bdb565b610b9b5760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610b9b576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546108b590613b88565b60025473ffffffffffffffffffffffffffffffffffffffff163314610c7d576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003610cb9576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610cf5576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b85811015611131576000898983818110610d3e57610d3e613bfd565b9050602002810190610d509190613c2c565b610d5990613c6a565b8051805160209091012060608201519192509067ffffffffffffffff1615610edc5785610d8581613cfb565b96505060008183602001518460600151604051602001610ddd93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114610e66576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015610ebc576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055611019565b602082015115801590610fa3575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015610f7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa19190613add565b155b15610fda576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611019576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff16108061104c575042826040015167ffffffffffffffff16115b15611083576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061112990613d22565b915050610d22565b5060075467ffffffffffffffff6801000000000000000090910481169084161115611188576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146112bf5760006111df8386613b25565b90506111f567ffffffffffffffff821683613d5a565b91506112767f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661122e610788565b6112389190613d6d565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190612d2f565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6113bd337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611350573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113749190613add565b61137e9190613d6d565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190612e08565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561142557600080fd5b505af1158015611439573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af11580156114dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115019190613d84565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461159c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff16156115d9576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611686576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c14565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611768576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156117885750600054600160ff909116105b806117a25750303b1580156117a2575060005460ff166001145b611833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561189157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611aa6576118b885612e6c565b6118c186612f7c565b6118ca87613083565b6040516020016118dc93929190613da1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af115801561199d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c19190613dda565b915091508163ffffffff16600014611a5e57600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff851602179055611aa3565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b600854600090611af3908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff1685611f82565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b979190613add565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611d12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d369190613d84565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611dc89190613e62565b506004611dd58982613e62565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611e3593929190613f7c565b60405180910390a15050505050508015611ea657600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611f00576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa600087604051602401611fb696959493929190613fbb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff700000000000000000000000000000000000000000000000000000000179052805190915061ffff101561206c576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600060f961207d60208461401e565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525086886040516020016121229796959493929190614039565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa1580156121b0573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612228576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405160009061226e9084906405ca1ab1e090635ca1ab1e90601b907fff000000000000000000000000000000000000000000000000000000000000009060200161411c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052955050505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612303576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c14565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146123cd576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036123d98282613e62565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c149190613637565b60085460ff16612445576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003612481576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156124bd576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff6801000000000000000082048116916124f8918491700100000000000000000000000000000000900416614178565b1115612530576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b838110156127bf57600086868381811061257557612575613bfd565b9050602002810190612587919061418b565b612590906141bf565b90508361259c81613cfb565b825180516020918201208185015160408087015190519499509194506000936125fe9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612687576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86166000908152600660205260408120556126ac600188613d5a565b840361271b5742600760189054906101000a900467ffffffffffffffff1684604001516126d9919061423d565b67ffffffffffffffff16111561271b576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806127b790613d22565b915050612559565b506127ed7f00000000000000000000000000000000000000000000000000000000000000008461122e610788565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af11580156128dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129009190613d84565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff1661297c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129e9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0d9190613add565b905081811115612a49576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612a85576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ac773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084612e08565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b589190613add565b600780549192506801000000000000000090910467ffffffffffffffff16906008612b8283613cfb565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612bb992919061425e565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612cc9576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612d28565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612d1f949392919061426e565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052612e039084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613176565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612e669085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612d81565b50505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691612eee91906142df565b600060405180830381855afa9150503d8060008114612f29576040519150601f19603f3d011682016040523d82523d6000602084013e612f2e565b606091505b509150915081612f73576040518060400160405280600781526020017f4e4f5f4e414d45000000000000000000000000000000000000000000000000008152506122a4565b6122a481613282565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691612ffe91906142df565b600060405180830381855afa9150503d8060008114613039576040519150601f19603f3d011682016040523d82523d6000602084013e61303e565b606091505b509150915081612f73576040518060400160405280600981526020017f4e4f5f53594d424f4c00000000000000000000000000000000000000000000008152506122a4565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169161310491906142df565b600060405180830381855afa9150503d806000811461313f576040519150601f19603f3d011682016040523d82523d6000602084013e613144565b606091505b5091509150818015613157575080516020145b6131625760126122a4565b808060200190518101906122a491906142f1565b60006131d8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166134589092919063ffffffff16565b805190915015612e0357808060200190518101906131f69190613bdb565b612e03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161182a565b606060408251106132a757818060200190518101906132a19190614314565b92915050565b815160200361341f5760005b6020811080156132fa57508281815181106132d0576132d0613bfd565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613311578061330981613d22565b9150506132b3565b8060000361335457505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111561336f5761336f6137b2565b6040519080825280601f01601f191660200182016040528015613399576020820181803683370190505b50905060005b82811015613417578481815181106133b9576133b9613bfd565b602001015160f81c60f81b8282815181106133d6576133d6613bfd565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061340f81613d22565b91505061339f565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60606122a48484600085856000808673ffffffffffffffffffffffffffffffffffffffff16858760405161348c91906142df565b60006040518083038185875af1925050503d80600081146134c9576040519150601f19603f3d011682016040523d82523d6000602084013e6134ce565b606091505b50915091506134df878383876134ea565b979650505050505050565b606083156135805782516000036135795773ffffffffffffffffffffffffffffffffffffffff85163b613579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161182a565b50816122a4565b6122a483838151156135955781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182a9190613637565b60005b838110156135e45781810151838201526020016135cc565b50506000910152565b600081518084526136058160208601602086016135c9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061364a60208301846135ed565b9392505050565b67ffffffffffffffff8116811461366757600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461366757600080fd5b6000806000606084860312156136a157600080fd5b83356136ac81613651565b92506020840135915060408401356136c38161366a565b809150509250925092565b6000602082840312156136e057600080fd5b813561364a81613651565b60008083601f8401126136fd57600080fd5b50813567ffffffffffffffff81111561371557600080fd5b6020830191508360208260051b850101111561373057600080fd5b9250929050565b60008060006040848603121561374c57600080fd5b833567ffffffffffffffff81111561376357600080fd5b61376f868287016136eb565b90945092505060208401356136c38161366a565b60006020828403121561379557600080fd5b813561364a8161366a565b63ffffffff8116811461366757600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613828576138286137b2565b604052919050565b600067ffffffffffffffff82111561384a5761384a6137b2565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261388757600080fd5b813561389a61389582613830565b6137e1565b8181528460208386010111156138af57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c087890312156138e557600080fd5b86356138f08161366a565b955060208701356139008161366a565b94506040870135613910816137a0565b935060608701356139208161366a565b9250608087013567ffffffffffffffff8082111561393d57600080fd5b6139498a838b01613876565b935060a089013591508082111561395f57600080fd5b5061396c89828a01613876565b9150509295509295509295565b6000806000806080858703121561398f57600080fd5b843561399a816137a0565b935060208501356139aa8161366a565b925060408501356139ba816137a0565b9150606085013567ffffffffffffffff8111156139d657600080fd5b6139e287828801613876565b91505092959194509250565b600060208284031215613a0057600080fd5b813567ffffffffffffffff811115613a1757600080fd5b6122a484828501613876565b60008060208385031215613a3657600080fd5b823567ffffffffffffffff811115613a4d57600080fd5b613a59858286016136eb565b90969095509350505050565b600080600060408486031215613a7a57600080fd5b833567ffffffffffffffff80821115613a9257600080fd5b818601915086601f830112613aa657600080fd5b813581811115613ab557600080fd5b876020828501011115613ac757600080fd5b6020928301989097509590910135949350505050565b600060208284031215613aef57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613b4657613b46613af6565b5092915050565b600082613b83577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613b9c57607f821691505b602082108103613bd5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215613bed57600080fd5b8151801515811461364a57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613c6057600080fd5b9190910192915050565b600060808236031215613c7c57600080fd5b6040516080810167ffffffffffffffff8282108183111715613ca057613ca06137b2565b816040528435915080821115613cb557600080fd5b50613cc236828601613876565b825250602083013560208201526040830135613cdd81613651565b60408201526060830135613cf081613651565b606082015292915050565b600067ffffffffffffffff808316818103613d1857613d18613af6565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d5357613d53613af6565b5060010190565b818103818111156132a1576132a1613af6565b80820281158282048414176132a1576132a1613af6565b600060208284031215613d9657600080fd5b815161364a81613651565b606081526000613db460608301866135ed565b8281036020840152613dc681866135ed565b91505060ff83166040830152949350505050565b60008060408385031215613ded57600080fd5b8251613df8816137a0565b6020840151909250613e098161366a565b809150509250929050565b601f821115612e0357600081815260208120601f850160051c81016020861015613e3b5750805b601f850160051c820191505b81811015613e5a57828155600101613e47565b505050505050565b815167ffffffffffffffff811115613e7c57613e7c6137b2565b613e9081613e8a8454613b88565b84613e14565b602080601f831160018114613ee35760008415613ead5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613e5a565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613f3057888601518255948401946001909101908401613f11565b5085821015613f6c57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081526000613f8f60608301866135ed565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261401260c08301846135ed565b98975050505050505050565b61ffff818116838216019080821115613b4657613b46613af6565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b16600184015287516140a2816003860160208c016135c9565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516140e5816017840160208b016135c9565b808201915050818660f01b1660178201528451915061410b8260198301602088016135c9565b016019019998505050505050505050565b6000865161412e818460208b016135c9565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b808201808211156132a1576132a1613af6565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112613c6057600080fd5b6000606082360312156141d157600080fd5b6040516060810167ffffffffffffffff82821081831117156141f5576141f56137b2565b81604052843591508082111561420a57600080fd5b5061421736828601613876565b82525060208301356020820152604083013561423281613651565b604082015292915050565b67ffffffffffffffff818116838216019080821115613b4657613b46613af6565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b60008251613c608184602087016135c9565b60006020828403121561430357600080fd5b815160ff8116811461364a57600080fd5b60006020828403121561432657600080fd5b815167ffffffffffffffff81111561433d57600080fd5b8201601f8101841361434e57600080fd5b805161435c61389582613830565b81815285602083850101111561437157600080fd5b6143828260208301602086016135c9565b9594505050505056fea26469706673582212204d4a296dccd84396793e05827383751e30ca858be4e44232f191c2b76670a8c364736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102c75760003560e01c80636ff512cc1161017b578063c89e42df116100d8578063e46761c41161008c578063eaeb077b11610071578063eaeb077b14610747578063f35dda471461075a578063f851a4401461076257600080fd5b8063e46761c414610700578063e7a7ed021461072757600080fd5b8063d02103ca116100bd578063d02103ca146106bb578063d7bc90ff146106e2578063d8d1091b146106ed57600080fd5b8063c89e42df14610688578063cfa8ed471461069b57600080fd5b8063a3c573eb1161012f578063ada8f91911610114578063ada8f91914610639578063b0afe1541461064c578063c754c7ed1461065857600080fd5b8063a3c573eb146105ff578063a652f26c1461062657600080fd5b80637a5460c5116101605780637a5460c5146105a05780638c3d7301146105dc5780639e001877146105e457600080fd5b80636ff512cc1461057a578063712570221461058d57600080fd5b80633cbc795b11610229578063542028d5116101dd5780635ec91958116101c25780635ec91958146105495780636b8616ce146105515780636e05d2cd1461057157600080fd5b8063542028d51461052e5780635e9145c91461053657600080fd5b8063456052671161020e57806345605267146104cc57806349b7b802146104f45780634e4877061461051b57600080fd5b80633cbc795b1461043657806340b5de6c1461047457600080fd5b806319d8ac61116102805780632b35b3ac116102655780632b35b3ac146103df57806332c2d153146103fc5780633c351e101461041157600080fd5b806319d8ac611461036d578063267822471461039a57600080fd5b806305835f37116102b157806305835f3714610302578063107bf28c1461034b57806311e892d41461035357600080fd5b8062d0295d146102cc57806303508963146102e7575b600080fd5b6102d4610788565b6040519081526020015b60405180910390f35b6102ef602081565b60405161ffff90911681526020016102de565b61033e6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102de9190613637565b61033e6108a8565b61035b60f981565b60405160ff90911681526020016102de565b6007546103819067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102de565b6001546103ba9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102de565b6008546103ec9060ff1681565b60405190151581526020016102de565b61040f61040a36600461368c565b610936565b005b6008546103ba90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60085461045f907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102de565b61049b7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102de565b60075461038190700100000000000000000000000000000000900467ffffffffffffffff1681565b6103ba7f000000000000000000000000000000000000000000000000000000000000000081565b61040f6105293660046136ce565b610a05565b61033e610c1f565b61040f610544366004613737565b610c2c565b61040f611545565b6102d461055f3660046136ce565b60066020526000908152604090205481565b6102d460055481565b61040f610588366004613783565b61162f565b61040f61059b3660046138cc565b6116f9565b61033e6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61040f611eaf565b6103ba73a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103ba7f000000000000000000000000000000000000000000000000000000000000000081565b61033e610634366004613979565b611f82565b61040f610647366004613783565b6122ac565b6102d46405ca1ab1e081565b600754610381907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61040f6106963660046139ee565b612376565b6002546103ba9073ffffffffffffffffffffffffffffffffffffffff1681565b6103ba7f000000000000000000000000000000000000000000000000000000000000000081565b6102d4635ca1ab1e81565b61040f6106fb366004613a23565b612409565b6103ba7f000000000000000000000000000000000000000000000000000000000000000081565b6007546103819068010000000000000000900467ffffffffffffffff1681565b61040f610755366004613a65565b612940565b61035b601b81565b6000546103ba9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610817573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083b9190613add565b60075490915060009061087a9067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613b25565b67ffffffffffffffff169050806000036108975760009250505090565b6108a18183613b4d565b9250505090565b600480546108b590613b88565b80601f01602080910402602001604051908101604052809291908181526020018280546108e190613b88565b801561092e5780601f106109035761010080835404028352916020019161092e565b820191906000526020600020905b81548152906001019060200180831161091157829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109a5576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966846040516109f891815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a5c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610aa3576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b329190613bdb565b610b9b5760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610b9b576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546108b590613b88565b60025473ffffffffffffffffffffffffffffffffffffffff163314610c7d576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003610cb9576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610cf5576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b85811015611131576000898983818110610d3e57610d3e613bfd565b9050602002810190610d509190613c2c565b610d5990613c6a565b8051805160209091012060608201519192509067ffffffffffffffff1615610edc5785610d8581613cfb565b96505060008183602001518460600151604051602001610ddd93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114610e66576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015610ebc576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055611019565b602082015115801590610fa3575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015610f7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa19190613add565b155b15610fda576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611019576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff16108061104c575042826040015167ffffffffffffffff16115b15611083576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061112990613d22565b915050610d22565b5060075467ffffffffffffffff6801000000000000000090910481169084161115611188576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146112bf5760006111df8386613b25565b90506111f567ffffffffffffffff821683613d5a565b91506112767f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661122e610788565b6112389190613d6d565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190612d2f565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6113bd337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611350573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113749190613add565b61137e9190613d6d565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190612e08565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561142557600080fd5b505af1158015611439573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af11580156114dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115019190613d84565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461159c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff16156115d9576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611686576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c14565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611768576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156117885750600054600160ff909116105b806117a25750303b1580156117a2575060005460ff166001145b611833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561189157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611aa6576118b885612e6c565b6118c186612f7c565b6118ca87613083565b6040516020016118dc93929190613da1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af115801561199d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c19190613dda565b915091508163ffffffff16600014611a5e57600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff851602179055611aa3565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b600854600090611af3908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff1685611f82565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b979190613add565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611d12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d369190613d84565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611dc89190613e62565b506004611dd58982613e62565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611e3593929190613f7c565b60405180910390a15050505050508015611ea657600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611f00576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa600087604051602401611fb696959493929190613fbb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff700000000000000000000000000000000000000000000000000000000179052805190915061ffff101561206c576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600060f961207d60208461401e565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525086886040516020016121229796959493929190614039565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa1580156121b0573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612228576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405160009061226e9084906405ca1ab1e090635ca1ab1e90601b907fff000000000000000000000000000000000000000000000000000000000000009060200161411c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052955050505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612303576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c14565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146123cd576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036123d98282613e62565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c149190613637565b60085460ff16612445576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003612481576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156124bd576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff6801000000000000000082048116916124f8918491700100000000000000000000000000000000900416614178565b1115612530576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b838110156127bf57600086868381811061257557612575613bfd565b9050602002810190612587919061418b565b612590906141bf565b90508361259c81613cfb565b825180516020918201208185015160408087015190519499509194506000936125fe9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612687576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86166000908152600660205260408120556126ac600188613d5a565b840361271b5742600760189054906101000a900467ffffffffffffffff1684604001516126d9919061423d565b67ffffffffffffffff16111561271b576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806127b790613d22565b915050612559565b506127ed7f00000000000000000000000000000000000000000000000000000000000000008461122e610788565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af11580156128dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129009190613d84565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff1661297c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129e9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0d9190613add565b905081811115612a49576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612a85576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ac773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084612e08565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b589190613add565b600780549192506801000000000000000090910467ffffffffffffffff16906008612b8283613cfb565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612bb992919061425e565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612cc9576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612d28565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612d1f949392919061426e565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052612e039084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613176565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612e669085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612d81565b50505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691612eee91906142df565b600060405180830381855afa9150503d8060008114612f29576040519150601f19603f3d011682016040523d82523d6000602084013e612f2e565b606091505b509150915081612f73576040518060400160405280600781526020017f4e4f5f4e414d45000000000000000000000000000000000000000000000000008152506122a4565b6122a481613282565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691612ffe91906142df565b600060405180830381855afa9150503d8060008114613039576040519150601f19603f3d011682016040523d82523d6000602084013e61303e565b606091505b509150915081612f73576040518060400160405280600981526020017f4e4f5f53594d424f4c00000000000000000000000000000000000000000000008152506122a4565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169161310491906142df565b600060405180830381855afa9150503d806000811461313f576040519150601f19603f3d011682016040523d82523d6000602084013e613144565b606091505b5091509150818015613157575080516020145b6131625760126122a4565b808060200190518101906122a491906142f1565b60006131d8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166134589092919063ffffffff16565b805190915015612e0357808060200190518101906131f69190613bdb565b612e03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161182a565b606060408251106132a757818060200190518101906132a19190614314565b92915050565b815160200361341f5760005b6020811080156132fa57508281815181106132d0576132d0613bfd565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613311578061330981613d22565b9150506132b3565b8060000361335457505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111561336f5761336f6137b2565b6040519080825280601f01601f191660200182016040528015613399576020820181803683370190505b50905060005b82811015613417578481815181106133b9576133b9613bfd565b602001015160f81c60f81b8282815181106133d6576133d6613bfd565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061340f81613d22565b91505061339f565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60606122a48484600085856000808673ffffffffffffffffffffffffffffffffffffffff16858760405161348c91906142df565b60006040518083038185875af1925050503d80600081146134c9576040519150601f19603f3d011682016040523d82523d6000602084013e6134ce565b606091505b50915091506134df878383876134ea565b979650505050505050565b606083156135805782516000036135795773ffffffffffffffffffffffffffffffffffffffff85163b613579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161182a565b50816122a4565b6122a483838151156135955781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182a9190613637565b60005b838110156135e45781810151838201526020016135cc565b50506000910152565b600081518084526136058160208601602086016135c9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061364a60208301846135ed565b9392505050565b67ffffffffffffffff8116811461366757600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461366757600080fd5b6000806000606084860312156136a157600080fd5b83356136ac81613651565b92506020840135915060408401356136c38161366a565b809150509250925092565b6000602082840312156136e057600080fd5b813561364a81613651565b60008083601f8401126136fd57600080fd5b50813567ffffffffffffffff81111561371557600080fd5b6020830191508360208260051b850101111561373057600080fd5b9250929050565b60008060006040848603121561374c57600080fd5b833567ffffffffffffffff81111561376357600080fd5b61376f868287016136eb565b90945092505060208401356136c38161366a565b60006020828403121561379557600080fd5b813561364a8161366a565b63ffffffff8116811461366757600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613828576138286137b2565b604052919050565b600067ffffffffffffffff82111561384a5761384a6137b2565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261388757600080fd5b813561389a61389582613830565b6137e1565b8181528460208386010111156138af57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c087890312156138e557600080fd5b86356138f08161366a565b955060208701356139008161366a565b94506040870135613910816137a0565b935060608701356139208161366a565b9250608087013567ffffffffffffffff8082111561393d57600080fd5b6139498a838b01613876565b935060a089013591508082111561395f57600080fd5b5061396c89828a01613876565b9150509295509295509295565b6000806000806080858703121561398f57600080fd5b843561399a816137a0565b935060208501356139aa8161366a565b925060408501356139ba816137a0565b9150606085013567ffffffffffffffff8111156139d657600080fd5b6139e287828801613876565b91505092959194509250565b600060208284031215613a0057600080fd5b813567ffffffffffffffff811115613a1757600080fd5b6122a484828501613876565b60008060208385031215613a3657600080fd5b823567ffffffffffffffff811115613a4d57600080fd5b613a59858286016136eb565b90969095509350505050565b600080600060408486031215613a7a57600080fd5b833567ffffffffffffffff80821115613a9257600080fd5b818601915086601f830112613aa657600080fd5b813581811115613ab557600080fd5b876020828501011115613ac757600080fd5b6020928301989097509590910135949350505050565b600060208284031215613aef57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613b4657613b46613af6565b5092915050565b600082613b83577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613b9c57607f821691505b602082108103613bd5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215613bed57600080fd5b8151801515811461364a57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613c6057600080fd5b9190910192915050565b600060808236031215613c7c57600080fd5b6040516080810167ffffffffffffffff8282108183111715613ca057613ca06137b2565b816040528435915080821115613cb557600080fd5b50613cc236828601613876565b825250602083013560208201526040830135613cdd81613651565b60408201526060830135613cf081613651565b606082015292915050565b600067ffffffffffffffff808316818103613d1857613d18613af6565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d5357613d53613af6565b5060010190565b818103818111156132a1576132a1613af6565b80820281158282048414176132a1576132a1613af6565b600060208284031215613d9657600080fd5b815161364a81613651565b606081526000613db460608301866135ed565b8281036020840152613dc681866135ed565b91505060ff83166040830152949350505050565b60008060408385031215613ded57600080fd5b8251613df8816137a0565b6020840151909250613e098161366a565b809150509250929050565b601f821115612e0357600081815260208120601f850160051c81016020861015613e3b5750805b601f850160051c820191505b81811015613e5a57828155600101613e47565b505050505050565b815167ffffffffffffffff811115613e7c57613e7c6137b2565b613e9081613e8a8454613b88565b84613e14565b602080601f831160018114613ee35760008415613ead5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613e5a565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613f3057888601518255948401946001909101908401613f11565b5085821015613f6c57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081526000613f8f60608301866135ed565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261401260c08301846135ed565b98975050505050505050565b61ffff818116838216019080821115613b4657613b46613af6565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b16600184015287516140a2816003860160208c016135c9565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516140e5816017840160208b016135c9565b808201915050818660f01b1660178201528451915061410b8260198301602088016135c9565b016019019998505050505050505050565b6000865161412e818460208b016135c9565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b808201808211156132a1576132a1613af6565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112613c6057600080fd5b6000606082360312156141d157600080fd5b6040516060810167ffffffffffffffff82821081831117156141f5576141f56137b2565b81604052843591508082111561420a57600080fd5b5061421736828601613876565b82525060208301356020820152604083013561423281613651565b604082015292915050565b67ffffffffffffffff818116838216019080821115613b4657613b46613af6565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b60008251613c608184602087016135c9565b60006020828403121561430357600080fd5b815160ff8116811461364a57600080fd5b60006020828403121561432657600080fd5b815167ffffffffffffffff81111561433d57600080fd5b8201601f8101841361434e57600080fd5b805161435c61389582613830565b81815285602083850101111561437157600080fd5b6143828260208301602086016135c9565b9594505050505056fea26469706673582212204d4a296dccd84396793e05827383751e30ca858be4e44232f191c2b76670a8c364736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMV2Existent.json b/compiled-contracts/paris/PolygonZkEVMV2Existent.json index be4b8adc0..42cfb7ee5 100644 --- a/compiled-contracts/paris/PolygonZkEVMV2Existent.json +++ b/compiled-contracts/paris/PolygonZkEVMV2Existent.json @@ -16,7 +16,7 @@ "type": "address" }, { - "internalType": "contract IPolygonZkEVMBridge", + "internalType": "contract IPolygonZkEVMBridgeV2", "name": "_bridgeAddress", "type": "address" }, @@ -99,6 +99,11 @@ "name": "HaltTimeoutNotExpired", "type": "error" }, + { + "inputs": [], + "name": "HugeTokenMetadataNotSupported", + "type": "error" + }, { "inputs": [], "name": "InitNumBatchAboveLastVerifiedBatch", @@ -304,6 +309,31 @@ "name": "ForceBatch", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "lastGlobalExitRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "sequencer", + "type": "address" + } + ], + "name": "InitialSequenceBatches", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -422,7 +452,33 @@ }, { "inputs": [], - "name": "BASE_INITIALIZE_TX_BRIDGE", + "name": "GLOBAL_EXIT_ROOT_MANAGER_L2", + "outputs": [ + { + "internalType": "contract IBasePolygonZkEVMGlobalExitRoot", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_LIST_LEN_LEN", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS", "outputs": [ { "internalType": "bytes", @@ -435,12 +491,25 @@ }, { "inputs": [], - "name": "GLOBAL_EXIT_ROOT_MANAGER_L2", + "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS", "outputs": [ { - "internalType": "contract IBasePolygonZkEVMGlobalExitRoot", + "internalType": "bytes", "name": "", - "type": "address" + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_CONSTANT_BYTES", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" } ], "stateMutability": "view", @@ -530,7 +599,7 @@ "name": "bridgeAddress", "outputs": [ { - "internalType": "contract IPolygonZkEVMBridge", + "internalType": "contract IPolygonZkEVMBridgeV2", "name": "", "type": "address" } @@ -643,6 +712,11 @@ "internalType": "uint32", "name": "_gasTokenNetwork", "type": "uint32" + }, + { + "internalType": "bytes", + "name": "_gasTokenMetadata", + "type": "bytes" } ], "name": "generateInitializeTransaction", @@ -653,7 +727,7 @@ "type": "bytes" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { @@ -691,11 +765,6 @@ "name": "_gasTokenAddress", "type": "address" }, - { - "internalType": "uint32", - "name": "_gasTokenNetwork", - "type": "uint32" - }, { "internalType": "string", "name": "sequencerURL", @@ -1039,8 +1108,8 @@ "type": "function" } ], - "bytecode": "0x6101006040523480156200001257600080fd5b5060405162002ebd38038062002ebd833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e051612d256200019860003960008181610311015281816106c10152818161075c0152818161099301528181610ade01528181610fdb0152818161107301528181611095015281816111dd0152818161162a01528181611a9101528181611b0e0152611bee0152600081816103e0015261115301526000818161047901528181610deb0152611ced0152600081816104c60152818161054d01528181611020015281816111290152611cc10152612d256000f3fe608060405234801561001057600080fd5b50600436106101c15760003560e01c8062d0295d146101c6578063107bf28c146101e157806319d8ac61146101f657806326782247146102215780632b35b3ac1461024157806332c2d1531461025e5780633c351e10146102735780633cbc795b1461028b57806340b5de6c146102b757806345605267146102df57806347ebf108146102f957806349b7b8021461030c5780634e48770614610333578063542028d5146103465780635e9145c91461034e5780635ec91958146103615780636b8616ce146103695780636e05d2cd146103895780636ff512cc146103925780638c3d7301146103a557806399af0397146103ad5780639e001877146103c0578063a3c573eb146103db578063ada8f91914610402578063b0afe15414610415578063bb59070814610421578063c754c7ed14610434578063c89e42df1461044e578063cfa8ed4714610461578063d02103ca14610474578063d690be311461049b578063d7bc90ff146104a3578063d8d1091b146104ae578063e46761c4146104c1578063e7a7ed02146104e8578063eaeb077b14610502578063f35dda4714610515578063f851a4401461052f575b600080fd5b6101ce610548565b6040519081526020015b60405180910390f35b6101e9610631565b6040516101d89190612228565b600754610209906001600160401b031681565b6040516001600160401b0390911681526020016101d8565b600154610234906001600160a01b031681565b6040516101d89190612242565b60085461024e9060ff1681565b60405190151581526020016101d8565b61027161026c36600461228a565b6106bf565b005b6008546102349061010090046001600160a01b031681565b6008546102a290600160a81b900463ffffffff1681565b60405163ffffffff90911681526020016101d8565b6102c66001600160f81b031981565b6040516001600160f81b031990911681526020016101d8565b60075461020990600160801b90046001600160401b031681565b61027161030736600461237e565b61075a565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b610271610341366004612434565b610a7e565b6101e9610bf5565b61027161035c36600461249c565b610c02565b610271611289565b6101ce610377366004612434565b60066020526000908152604090205481565b6101ce60055481565b6102716103a03660046124e6565b611316565b610271611392565b6101e96103bb366004612501565b61141f565b61023473a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b6102716104103660046124e6565b6115ac565b6101ce6405ca1ab1e081565b61027161042f36600461253b565b611628565b60075461020990600160c01b90046001600160401b031681565b61027161045c3660046125dc565b6117b4565b600254610234906001600160a01b031681565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b6101e9611821565b6101ce635ca1ab1e81565b6102716104bc366004612610565b61183d565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b60075461020990600160401b90046001600160401b031681565b610271610510366004612651565b611bc7565b61051d601b81565b60405160ff90911681526020016101d8565b600054610234906201000090046001600160a01b031681565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016105979190612242565b602060405180830381865afa1580156105b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d891906126c8565b600754909150600090610604906001600160401b03600160801b8204811691600160401b9004166126f7565b6001600160401b03169050806000036106205760009250505090565b61062a818361271e565b9250505090565b6004805461063e90612740565b80601f016020809104026020016040519081016040528092919081815260200182805461066a90612740565b80156106b75780601f1061068c576101008083540402835291602001916106b7565b820191906000526020600020905b81548152906001019060200180831161069a57829003601f168201915b505050505081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461070857604051631736745960e31b815260040160405180910390fd5b806001600160a01b0316836001600160401b03167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59668460405161074d91815260200190565b60405180910390a3505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146107a357604051631736745960e31b815260040160405180910390fd5b600054610100900460ff16158080156107c35750600054600160ff909116105b806107e457506107d230611ec3565b1580156107e4575060005460ff166001145b6108095760405162461bcd60e51b81526004016108009061277a565b60405180910390fd5b6000805460ff19166001179055801561082c576000805461ff0019166101001790555b6000805462010000600160b01b031916620100006001600160a01b038b81169190910291909117909155600280546001600160a01b03191691891691909117905560036108798482612816565b5060046108868382612816565b50600780546001600160c01b0316610d2f60c71b1790556001600160a01b0385166108d05763ffffffff8416156108d057604051630d43a60960e11b815260040160405180910390fd5b60088054610100600160c81b0319166101006001600160a01b0388160263ffffffff60a81b191617600160a81b63ffffffff871602179055600061091587878761141f565b9050600081805190602001209050600042905060008060001b836000801b848e6040516020016109499594939291906128d5565b60408051808303601f19018152908290528051602090910120600780546001600160401b0319166001600160401b0386161790556005819055639a908e7360e01b825291506000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639a908e73906109d3906001908690600401612914565b6020604051808303816000875af11580156109f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a16919061292d565b6040519091506001600160401b03821690600080516020612c6f83398151915290600090a250505050508015610a74576000805461ff001916905560405160018152600080516020612c8f8339815191529060200160405180910390a15b5050505050505050565b6000546201000090046001600160a01b03163314610aaf57604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610adc5760405163f5e37f2f60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5e919061294a565b610b98576007546001600160401b03600160c01b909104811690821610610b985760405163f5e37f2f60e01b815260040160405180910390fd5b600780546001600160c01b0316600160c01b6001600160401b038416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461063e90612740565b6002546001600160a01b03163314610c2d576040516311e7be1560e01b815260040160405180910390fd5b816000819003610c505760405163cb591a5f60e01b815260040160405180910390fd5b6103e8811115610c7357604051635acfba9d60e11b815260040160405180910390fd5b6007546005546001600160401b0380831692600160801b900416908160005b85811015610f49576000898983818110610cae57610cae61296c565b9050602002810190610cc09190612982565b610cc9906129a2565b805180516020909101206060820151919250906001600160401b031615610dc15785610cf481612a32565b96505060008183602001518460600151604051602001610d1693929190612a60565b60408051601f1981840301815291815281516020928301206001600160401b038a16600090815260069093529120549091508114610d675760405163671ebaaf60e11b815260040160405180910390fd5b82606001516001600160401b031683604001516001600160401b03161015610da257604051633fbd5c3960e11b815260040160405180910390fd5b506001600160401b038616600090815260066020526040812055610ea6565b602082015115801590610e62575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303816000875af1158015610e3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6091906126c8565b155b15610e80576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c01015610ea6576040516328a69b1f60e21b815260040160405180910390fd5b866001600160401b031682604001516001600160401b03161080610ed657504282604001516001600160401b0316115b15610ef4576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518c604051602001610f159594939291906128d5565b6040516020818303038152906040528051906020012094508160400151965050508080610f4190612a83565b915050610c92565b506007546001600160401b03600160401b90910481169084161115610f815760405163c630a00d60e01b815260040160405180910390fd5b600780546001600160401b0319166001600160401b0386811691909117909155600583905585908281169085161461106d576000610fbf83866126f7565b9050610fd46001600160401b03821683612a9c565b91506110477f0000000000000000000000000000000000000000000000000000000000000000826001600160401b031661100c610548565b6110169190612ab5565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190611ed2565b5060078054600160801b600160c01b031916600160801b6001600160401b038716021790555b611151337f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111591906126c8565b61111f9190612ab5565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190611f3a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156111ac57600080fd5b505af11580156111c0573d6000803e3d6000fd5b5050604051639a908e7360e01b8152600092506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150639a908e7390611215908a908890600401612914565b6020604051808303816000875af1158015611234573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611258919061292d565b6040519091506001600160401b03821690600080516020612c6f83398151915290600090a250505050505050505050565b6000546201000090046001600160a01b031633146112ba57604051634755657960e01b815260040160405180910390fd5b60085460ff16156112de5760405163f6ba91a160e01b815260040160405180910390fd5b6008805460ff191660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b6000546201000090046001600160a01b0316331461134757604051634755657960e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383161790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610bea908390612242565b6001546001600160a01b031633146113bd5760405163d1ec4b2360e01b815260040160405180910390fd5b60015460008054620100006001600160a01b0390931692830262010000600160b01b03199091161790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9161141591612242565b60405180910390a1565b60606000604051806060016040528060218152602001612ccf6021913960405163ffffffff80881660248301526001600160a01b03871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa6084820152600060a482015260c40160408051601f19818403018152918152602080830180516001600160e01b03166369a3b57f60e11b17905290516114bf93929101612acc565b60408051601f198184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa15801561152f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166115635760405163668b0cb360e11b815260040160405180910390fd5b6040516000906115919084906405ca1ab1e090635ca1ab1e90601b906001600160f81b031990602001612afb565b60408051808303601f19018152919052979650505050505050565b6000546201000090046001600160a01b031633146115dd57604051634755657960e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610bea908390612242565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461167157604051631736745960e31b815260040160405180910390fd5b600054610100900460ff16158080156116915750600054600160ff909116105b806116b257506116a030611ec3565b1580156116b2575060005460ff166001145b6116ce5760405162461bcd60e51b81526004016108009061277a565b6000805460ff1916600117905580156116f1576000805461ff0019166101001790555b6000805462010000600160b01b031916620100006001600160a01b038a81169190910291909117909155600280546001600160a01b031916918816919091179055600361173e8682612816565b50600461174b8582612816565b50600583905560078054610d2f60c71b600160401b600160c01b039091166001600160401b0385161717905580156117ab576000805461ff001916905560405160018152600080516020612c8f8339815191529060200160405180910390a15b50505050505050565b6000546201000090046001600160a01b031633146117e557604051634755657960e01b815260040160405180910390fd5b60036117f18282612816565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610bea9190612228565b604051806060016040528060218152602001612ccf6021913981565b60085460ff16611860576040516324eff8c360e01b815260040160405180910390fd5b8060008190036118835760405163cb591a5f60e01b815260040160405180910390fd5b6103e88111156118a657604051635acfba9d60e11b815260040160405180910390fd5b6007546001600160401b03600160401b82048116916118ce918491600160801b900416612b3f565b11156118ed5760405163c630a00d60e01b815260040160405180910390fd5b600754600554600160801b9091046001600160401b03169060005b83811015611a8b5760008686838181106119245761192461296c565b90506020028101906119369190612b52565b61193f90612b68565b90508361194b81612a32565b825180516020918201208185015160408087015190519499509194506000936119779386939101612a60565b60408051601f1981840301815291815281516020928301206001600160401b0389166000908152600690935291205490915081146119c85760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b0386166000908152600660205260408120556119ec600188612a9c565b8403611a405742600760189054906101000a90046001600160401b03168460400151611a189190612be5565b6001600160401b03161115611a405760405163c44a082160e01b815260040160405180910390fd5b848284602001514233604051602001611a5d9594939291906128d5565b6040516020818303038152906040528051906020012094505050508080611a8390612a83565b915050611908565b50611ab97f00000000000000000000000000000000000000000000000000000000000000008461100c610548565b6005819055600780546001600160401b03848116600160801b026001600160401b03600160801b03600160c01b0319909216429190911617179055604051639a908e7360e01b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611b459087908690600401612914565b6020604051808303816000875af1158015611b64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b88919061292d565b6040519091506001600160401b038216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16611bea576040516324eff8c360e01b815260040160405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6e91906126c8565b905081811115611c9157604051632354600f60e01b815260040160405180910390fd5b611388831115611cb4576040516328a69b1f60e21b815260040160405180910390fd5b611ce96001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084611f3a565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6d91906126c8565b60078054919250600160401b9091046001600160401b0316906008611d9183612a32565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508484604051611dc6929190612c05565b604051908190038120611ddf9183904290602001612a60565b60408051808303601f190181529181528151602092830120600754600160401b90046001600160401b031660009081526006909352912055323303611e7157600754604080518381523360208201526060918101829052600091810191909152600160401b9091046001600160401b031690600080516020612caf8339815191529060800160405180910390a2611ebc565b600760089054906101000a90046001600160401b03166001600160401b0316600080516020612caf83398151915282338888604051611eb39493929190612c15565b60405180910390a25b5050505050565b6001600160a01b03163b151590565b6040516001600160a01b038316602482015260448101829052611f3590849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611f78565b505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611f729085906323b872dd60e01b90608401611efe565b50505050565b6000611fcd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661204a9092919063ffffffff16565b805190915015611f355780806020019051810190611feb919061294a565b611f355760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610800565b60606120598484600085612061565b949350505050565b6060824710156120c25760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610800565b600080866001600160a01b031685876040516120de9190612c5c565b60006040518083038185875af1925050503d806000811461211b576040519150601f19603f3d011682016040523d82523d6000602084013e612120565b606091505b50915091506121318783838761213c565b979650505050505050565b606083156121a95782516000036121a25761215685611ec3565b6121a25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610800565b5081612059565b61205983838151156121be5781518083602001fd5b8060405162461bcd60e51b81526004016108009190612228565b60005b838110156121f35781810151838201526020016121db565b50506000910152565b600081518084526122148160208601602086016121d8565b601f01601f19169290920160200192915050565b60208152600061223b60208301846121fc565b9392505050565b6001600160a01b0391909116815260200190565b6001600160401b038116811461226b57600080fd5b50565b80356001600160a01b038116811461228557600080fd5b919050565b60008060006060848603121561229f57600080fd5b83356122aa81612256565b9250602084013591506122bf6040850161226e565b90509250925092565b803563ffffffff8116811461228557600080fd5b634e487b7160e01b600052604160045260246000fd5b600082601f83011261230357600080fd5b81356001600160401b038082111561231d5761231d6122dc565b604051601f8301601f19908116603f01168101908282118183101715612345576123456122dc565b8160405283815286602085880101111561235e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121561239957600080fd5b6123a28861226e565b96506123b06020890161226e565b95506123be604089016122c8565b94506123cc6060890161226e565b93506123da608089016122c8565b925060a08801356001600160401b03808211156123f657600080fd5b6124028b838c016122f2565b935060c08a013591508082111561241857600080fd5b506124258a828b016122f2565b91505092959891949750929550565b60006020828403121561244657600080fd5b813561223b81612256565b60008083601f84011261246357600080fd5b5081356001600160401b0381111561247a57600080fd5b6020830191508360208260051b850101111561249557600080fd5b9250929050565b6000806000604084860312156124b157600080fd5b83356001600160401b038111156124c757600080fd5b6124d386828701612451565b90945092506122bf90506020850161226e565b6000602082840312156124f857600080fd5b61223b8261226e565b60008060006060848603121561251657600080fd5b61251f846122c8565b925061252d6020850161226e565b91506122bf604085016122c8565b60008060008060008060c0878903121561255457600080fd5b61255d8761226e565b955061256b6020880161226e565b945060408701356001600160401b038082111561258757600080fd5b6125938a838b016122f2565b955060608901359150808211156125a957600080fd5b506125b689828a016122f2565b9350506080870135915060a08701356125ce81612256565b809150509295509295509295565b6000602082840312156125ee57600080fd5b81356001600160401b0381111561260457600080fd5b612059848285016122f2565b6000806020838503121561262357600080fd5b82356001600160401b0381111561263957600080fd5b61264585828601612451565b90969095509350505050565b60008060006040848603121561266657600080fd5b83356001600160401b038082111561267d57600080fd5b818601915086601f83011261269157600080fd5b8135818111156126a057600080fd5b8760208285010111156126b257600080fd5b6020928301989097509590910135949350505050565b6000602082840312156126da57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03828116828216039080821115612717576127176126e1565b5092915050565b60008261273b57634e487b7160e01b600052601260045260246000fd5b500490565b600181811c9082168061275457607f821691505b60208210810361277457634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b601f821115611f3557600081815260208120601f850160051c810160208610156127ef5750805b601f850160051c820191505b8181101561280e578281556001016127fb565b505050505050565b81516001600160401b0381111561282f5761282f6122dc565b6128438161283d8454612740565b846127c8565b602080601f83116001811461287857600084156128605750858301515b600019600386901b1c1916600185901b17855561280e565b600085815260208120601f198616915b828110156128a757888601518255948401946001909101908401612888565b50858210156128c55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b6001600160401b03929092168252602082015260400190565b60006020828403121561293f57600080fd5b815161223b81612256565b60006020828403121561295c57600080fd5b8151801515811461223b57600080fd5b634e487b7160e01b600052603260045260246000fd5b60008235607e1983360301811261299857600080fd5b9190910192915050565b6000608082360312156129b457600080fd5b604051608081016001600160401b0380821183831017156129d7576129d76122dc565b8160405284359150808211156129ec57600080fd5b506129f9368286016122f2565b825250602083013560208201526040830135612a1481612256565b60408201526060830135612a2781612256565b606082015292915050565b60006001600160401b038281166002600160401b03198101612a5657612a566126e1565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b600060018201612a9557612a956126e1565b5060010190565b81810381811115612aaf57612aaf6126e1565b92915050565b8082028115828204841417612aaf57612aaf6126e1565b60008351612ade8184602088016121d8565b835190830190612af28183602088016121d8565b01949350505050565b60008651612b0d818460208b016121d8565b9190910194855250602084019290925260f81b6001600160f81b03199081166040840152166041820152604201919050565b80820180821115612aaf57612aaf6126e1565b60008235605e1983360301811261299857600080fd5b600060608236031215612b7a57600080fd5b604051606081016001600160401b038082118383101715612b9d57612b9d6122dc565b816040528435915080821115612bb257600080fd5b50612bbf368286016122f2565b825250602083013560208201526040830135612bda81612256565b604082015292915050565b6001600160401b03818116838216019080821115612717576127176126e1565b8183823760009101908152919050565b8481526001600160a01b03841660208201526060604082018190528101829052818360808301376000818301608090810191909152601f909201601f191601019392505050565b600082516129988184602087016121d856fe303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498f94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931f8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a26469706673582212204710e7881df2a623dab8b587e3c8f0acd5809db9326b5ffd88b9639d777bbdfd64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101c15760003560e01c8062d0295d146101c6578063107bf28c146101e157806319d8ac61146101f657806326782247146102215780632b35b3ac1461024157806332c2d1531461025e5780633c351e10146102735780633cbc795b1461028b57806340b5de6c146102b757806345605267146102df57806347ebf108146102f957806349b7b8021461030c5780634e48770614610333578063542028d5146103465780635e9145c91461034e5780635ec91958146103615780636b8616ce146103695780636e05d2cd146103895780636ff512cc146103925780638c3d7301146103a557806399af0397146103ad5780639e001877146103c0578063a3c573eb146103db578063ada8f91914610402578063b0afe15414610415578063bb59070814610421578063c754c7ed14610434578063c89e42df1461044e578063cfa8ed4714610461578063d02103ca14610474578063d690be311461049b578063d7bc90ff146104a3578063d8d1091b146104ae578063e46761c4146104c1578063e7a7ed02146104e8578063eaeb077b14610502578063f35dda4714610515578063f851a4401461052f575b600080fd5b6101ce610548565b6040519081526020015b60405180910390f35b6101e9610631565b6040516101d89190612228565b600754610209906001600160401b031681565b6040516001600160401b0390911681526020016101d8565b600154610234906001600160a01b031681565b6040516101d89190612242565b60085461024e9060ff1681565b60405190151581526020016101d8565b61027161026c36600461228a565b6106bf565b005b6008546102349061010090046001600160a01b031681565b6008546102a290600160a81b900463ffffffff1681565b60405163ffffffff90911681526020016101d8565b6102c66001600160f81b031981565b6040516001600160f81b031990911681526020016101d8565b60075461020990600160801b90046001600160401b031681565b61027161030736600461237e565b61075a565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b610271610341366004612434565b610a7e565b6101e9610bf5565b61027161035c36600461249c565b610c02565b610271611289565b6101ce610377366004612434565b60066020526000908152604090205481565b6101ce60055481565b6102716103a03660046124e6565b611316565b610271611392565b6101e96103bb366004612501565b61141f565b61023473a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b6102716104103660046124e6565b6115ac565b6101ce6405ca1ab1e081565b61027161042f36600461253b565b611628565b60075461020990600160c01b90046001600160401b031681565b61027161045c3660046125dc565b6117b4565b600254610234906001600160a01b031681565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b6101e9611821565b6101ce635ca1ab1e81565b6102716104bc366004612610565b61183d565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b60075461020990600160401b90046001600160401b031681565b610271610510366004612651565b611bc7565b61051d601b81565b60405160ff90911681526020016101d8565b600054610234906201000090046001600160a01b031681565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016105979190612242565b602060405180830381865afa1580156105b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d891906126c8565b600754909150600090610604906001600160401b03600160801b8204811691600160401b9004166126f7565b6001600160401b03169050806000036106205760009250505090565b61062a818361271e565b9250505090565b6004805461063e90612740565b80601f016020809104026020016040519081016040528092919081815260200182805461066a90612740565b80156106b75780601f1061068c576101008083540402835291602001916106b7565b820191906000526020600020905b81548152906001019060200180831161069a57829003601f168201915b505050505081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461070857604051631736745960e31b815260040160405180910390fd5b806001600160a01b0316836001600160401b03167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59668460405161074d91815260200190565b60405180910390a3505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146107a357604051631736745960e31b815260040160405180910390fd5b600054610100900460ff16158080156107c35750600054600160ff909116105b806107e457506107d230611ec3565b1580156107e4575060005460ff166001145b6108095760405162461bcd60e51b81526004016108009061277a565b60405180910390fd5b6000805460ff19166001179055801561082c576000805461ff0019166101001790555b6000805462010000600160b01b031916620100006001600160a01b038b81169190910291909117909155600280546001600160a01b03191691891691909117905560036108798482612816565b5060046108868382612816565b50600780546001600160c01b0316610d2f60c71b1790556001600160a01b0385166108d05763ffffffff8416156108d057604051630d43a60960e11b815260040160405180910390fd5b60088054610100600160c81b0319166101006001600160a01b0388160263ffffffff60a81b191617600160a81b63ffffffff871602179055600061091587878761141f565b9050600081805190602001209050600042905060008060001b836000801b848e6040516020016109499594939291906128d5565b60408051808303601f19018152908290528051602090910120600780546001600160401b0319166001600160401b0386161790556005819055639a908e7360e01b825291506000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639a908e73906109d3906001908690600401612914565b6020604051808303816000875af11580156109f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a16919061292d565b6040519091506001600160401b03821690600080516020612c6f83398151915290600090a250505050508015610a74576000805461ff001916905560405160018152600080516020612c8f8339815191529060200160405180910390a15b5050505050505050565b6000546201000090046001600160a01b03163314610aaf57604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610adc5760405163f5e37f2f60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5e919061294a565b610b98576007546001600160401b03600160c01b909104811690821610610b985760405163f5e37f2f60e01b815260040160405180910390fd5b600780546001600160c01b0316600160c01b6001600160401b038416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461063e90612740565b6002546001600160a01b03163314610c2d576040516311e7be1560e01b815260040160405180910390fd5b816000819003610c505760405163cb591a5f60e01b815260040160405180910390fd5b6103e8811115610c7357604051635acfba9d60e11b815260040160405180910390fd5b6007546005546001600160401b0380831692600160801b900416908160005b85811015610f49576000898983818110610cae57610cae61296c565b9050602002810190610cc09190612982565b610cc9906129a2565b805180516020909101206060820151919250906001600160401b031615610dc15785610cf481612a32565b96505060008183602001518460600151604051602001610d1693929190612a60565b60408051601f1981840301815291815281516020928301206001600160401b038a16600090815260069093529120549091508114610d675760405163671ebaaf60e11b815260040160405180910390fd5b82606001516001600160401b031683604001516001600160401b03161015610da257604051633fbd5c3960e11b815260040160405180910390fd5b506001600160401b038616600090815260066020526040812055610ea6565b602082015115801590610e62575060208201516040516312bd9b1960e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303816000875af1158015610e3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6091906126c8565b155b15610e80576040516373bd668d60e01b815260040160405180910390fd5b8151516201d4c01015610ea6576040516328a69b1f60e21b815260040160405180910390fd5b866001600160401b031682604001516001600160401b03161080610ed657504282604001516001600160401b0316115b15610ef4576040516375413c8b60e11b815260040160405180910390fd5b8481836020015184604001518c604051602001610f159594939291906128d5565b6040516020818303038152906040528051906020012094508160400151965050508080610f4190612a83565b915050610c92565b506007546001600160401b03600160401b90910481169084161115610f815760405163c630a00d60e01b815260040160405180910390fd5b600780546001600160401b0319166001600160401b0386811691909117909155600583905585908281169085161461106d576000610fbf83866126f7565b9050610fd46001600160401b03821683612a9c565b91506110477f0000000000000000000000000000000000000000000000000000000000000000826001600160401b031661100c610548565b6110169190612ab5565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190611ed2565b5060078054600160801b600160c01b031916600160801b6001600160401b038716021790555b611151337f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111591906126c8565b61111f9190612ab5565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190611f3a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156111ac57600080fd5b505af11580156111c0573d6000803e3d6000fd5b5050604051639a908e7360e01b8152600092506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150639a908e7390611215908a908890600401612914565b6020604051808303816000875af1158015611234573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611258919061292d565b6040519091506001600160401b03821690600080516020612c6f83398151915290600090a250505050505050505050565b6000546201000090046001600160a01b031633146112ba57604051634755657960e01b815260040160405180910390fd5b60085460ff16156112de5760405163f6ba91a160e01b815260040160405180910390fd5b6008805460ff191660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b6000546201000090046001600160a01b0316331461134757604051634755657960e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383161790556040517ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090610bea908390612242565b6001546001600160a01b031633146113bd5760405163d1ec4b2360e01b815260040160405180910390fd5b60015460008054620100006001600160a01b0390931692830262010000600160b01b03199091161790556040517f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9161141591612242565b60405180910390a1565b60606000604051806060016040528060218152602001612ccf6021913960405163ffffffff80881660248301526001600160a01b03871660448301528516606482015273a40d5f56745a118d0906a34e69aec8c0db1cb8fa6084820152600060a482015260c40160408051601f19818403018152918152602080830180516001600160e01b03166369a3b57f60e11b17905290516114bf93929101612acc565b60408051601f198184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa15801561152f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166115635760405163668b0cb360e11b815260040160405180910390fd5b6040516000906115919084906405ca1ab1e090635ca1ab1e90601b906001600160f81b031990602001612afb565b60408051808303601f19018152919052979650505050505050565b6000546201000090046001600160a01b031633146115dd57604051634755657960e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383161790556040517fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690610bea908390612242565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316331461167157604051631736745960e31b815260040160405180910390fd5b600054610100900460ff16158080156116915750600054600160ff909116105b806116b257506116a030611ec3565b1580156116b2575060005460ff166001145b6116ce5760405162461bcd60e51b81526004016108009061277a565b6000805460ff1916600117905580156116f1576000805461ff0019166101001790555b6000805462010000600160b01b031916620100006001600160a01b038a81169190910291909117909155600280546001600160a01b031916918816919091179055600361173e8682612816565b50600461174b8582612816565b50600583905560078054610d2f60c71b600160401b600160c01b039091166001600160401b0385161717905580156117ab576000805461ff001916905560405160018152600080516020612c8f8339815191529060200160405180910390a15b50505050505050565b6000546201000090046001600160a01b031633146117e557604051634755657960e01b815260040160405180910390fd5b60036117f18282612816565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610bea9190612228565b604051806060016040528060218152602001612ccf6021913981565b60085460ff16611860576040516324eff8c360e01b815260040160405180910390fd5b8060008190036118835760405163cb591a5f60e01b815260040160405180910390fd5b6103e88111156118a657604051635acfba9d60e11b815260040160405180910390fd5b6007546001600160401b03600160401b82048116916118ce918491600160801b900416612b3f565b11156118ed5760405163c630a00d60e01b815260040160405180910390fd5b600754600554600160801b9091046001600160401b03169060005b83811015611a8b5760008686838181106119245761192461296c565b90506020028101906119369190612b52565b61193f90612b68565b90508361194b81612a32565b825180516020918201208185015160408087015190519499509194506000936119779386939101612a60565b60408051601f1981840301815291815281516020928301206001600160401b0389166000908152600690935291205490915081146119c85760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b0386166000908152600660205260408120556119ec600188612a9c565b8403611a405742600760189054906101000a90046001600160401b03168460400151611a189190612be5565b6001600160401b03161115611a405760405163c44a082160e01b815260040160405180910390fd5b848284602001514233604051602001611a5d9594939291906128d5565b6040516020818303038152906040528051906020012094505050508080611a8390612a83565b915050611908565b50611ab97f00000000000000000000000000000000000000000000000000000000000000008461100c610548565b6005819055600780546001600160401b03848116600160801b026001600160401b03600160801b03600160c01b0319909216429190911617179055604051639a908e7360e01b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611b459087908690600401612914565b6020604051808303816000875af1158015611b64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b88919061292d565b6040519091506001600160401b038216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16611bea576040516324eff8c360e01b815260040160405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6e91906126c8565b905081811115611c9157604051632354600f60e01b815260040160405180910390fd5b611388831115611cb4576040516328a69b1f60e21b815260040160405180910390fd5b611ce96001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084611f3a565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6d91906126c8565b60078054919250600160401b9091046001600160401b0316906008611d9183612a32565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508484604051611dc6929190612c05565b604051908190038120611ddf9183904290602001612a60565b60408051808303601f190181529181528151602092830120600754600160401b90046001600160401b031660009081526006909352912055323303611e7157600754604080518381523360208201526060918101829052600091810191909152600160401b9091046001600160401b031690600080516020612caf8339815191529060800160405180910390a2611ebc565b600760089054906101000a90046001600160401b03166001600160401b0316600080516020612caf83398151915282338888604051611eb39493929190612c15565b60405180910390a25b5050505050565b6001600160a01b03163b151590565b6040516001600160a01b038316602482015260448101829052611f3590849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611f78565b505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611f729085906323b872dd60e01b90608401611efe565b50505050565b6000611fcd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661204a9092919063ffffffff16565b805190915015611f355780806020019051810190611feb919061294a565b611f355760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610800565b60606120598484600085612061565b949350505050565b6060824710156120c25760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610800565b600080866001600160a01b031685876040516120de9190612c5c565b60006040518083038185875af1925050503d806000811461211b576040519150601f19603f3d011682016040523d82523d6000602084013e612120565b606091505b50915091506121318783838761213c565b979650505050505050565b606083156121a95782516000036121a25761215685611ec3565b6121a25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610800565b5081612059565b61205983838151156121be5781518083602001fd5b8060405162461bcd60e51b81526004016108009190612228565b60005b838110156121f35781810151838201526020016121db565b50506000910152565b600081518084526122148160208601602086016121d8565b601f01601f19169290920160200192915050565b60208152600061223b60208301846121fc565b9392505050565b6001600160a01b0391909116815260200190565b6001600160401b038116811461226b57600080fd5b50565b80356001600160a01b038116811461228557600080fd5b919050565b60008060006060848603121561229f57600080fd5b83356122aa81612256565b9250602084013591506122bf6040850161226e565b90509250925092565b803563ffffffff8116811461228557600080fd5b634e487b7160e01b600052604160045260246000fd5b600082601f83011261230357600080fd5b81356001600160401b038082111561231d5761231d6122dc565b604051601f8301601f19908116603f01168101908282118183101715612345576123456122dc565b8160405283815286602085880101111561235e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121561239957600080fd5b6123a28861226e565b96506123b06020890161226e565b95506123be604089016122c8565b94506123cc6060890161226e565b93506123da608089016122c8565b925060a08801356001600160401b03808211156123f657600080fd5b6124028b838c016122f2565b935060c08a013591508082111561241857600080fd5b506124258a828b016122f2565b91505092959891949750929550565b60006020828403121561244657600080fd5b813561223b81612256565b60008083601f84011261246357600080fd5b5081356001600160401b0381111561247a57600080fd5b6020830191508360208260051b850101111561249557600080fd5b9250929050565b6000806000604084860312156124b157600080fd5b83356001600160401b038111156124c757600080fd5b6124d386828701612451565b90945092506122bf90506020850161226e565b6000602082840312156124f857600080fd5b61223b8261226e565b60008060006060848603121561251657600080fd5b61251f846122c8565b925061252d6020850161226e565b91506122bf604085016122c8565b60008060008060008060c0878903121561255457600080fd5b61255d8761226e565b955061256b6020880161226e565b945060408701356001600160401b038082111561258757600080fd5b6125938a838b016122f2565b955060608901359150808211156125a957600080fd5b506125b689828a016122f2565b9350506080870135915060a08701356125ce81612256565b809150509295509295509295565b6000602082840312156125ee57600080fd5b81356001600160401b0381111561260457600080fd5b612059848285016122f2565b6000806020838503121561262357600080fd5b82356001600160401b0381111561263957600080fd5b61264585828601612451565b90969095509350505050565b60008060006040848603121561266657600080fd5b83356001600160401b038082111561267d57600080fd5b818601915086601f83011261269157600080fd5b8135818111156126a057600080fd5b8760208285010111156126b257600080fd5b6020928301989097509590910135949350505050565b6000602082840312156126da57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03828116828216039080821115612717576127176126e1565b5092915050565b60008261273b57634e487b7160e01b600052601260045260246000fd5b500490565b600181811c9082168061275457607f821691505b60208210810361277457634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b601f821115611f3557600081815260208120601f850160051c810160208610156127ef5750805b601f850160051c820191505b8181101561280e578281556001016127fb565b505050505050565b81516001600160401b0381111561282f5761282f6122dc565b6128438161283d8454612740565b846127c8565b602080601f83116001811461287857600084156128605750858301515b600019600386901b1c1916600185901b17855561280e565b600085815260208120601f198616915b828110156128a757888601518255948401946001909101908401612888565b50858210156128c55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b9485526020850193909352604084019190915260c01b6001600160c01b0319166060808401919091521b6001600160601b0319166068820152607c0190565b6001600160401b03929092168252602082015260400190565b60006020828403121561293f57600080fd5b815161223b81612256565b60006020828403121561295c57600080fd5b8151801515811461223b57600080fd5b634e487b7160e01b600052603260045260246000fd5b60008235607e1983360301811261299857600080fd5b9190910192915050565b6000608082360312156129b457600080fd5b604051608081016001600160401b0380821183831017156129d7576129d76122dc565b8160405284359150808211156129ec57600080fd5b506129f9368286016122f2565b825250602083013560208201526040830135612a1481612256565b60408201526060830135612a2781612256565b606082015292915050565b60006001600160401b038281166002600160401b03198101612a5657612a566126e1565b6001019392505050565b928352602083019190915260c01b6001600160c01b031916604082015260480190565b600060018201612a9557612a956126e1565b5060010190565b81810381811115612aaf57612aaf6126e1565b92915050565b8082028115828204841417612aaf57612aaf6126e1565b60008351612ade8184602088016121d8565b835190830190612af28183602088016121d8565b01949350505050565b60008651612b0d818460208b016121d8565b9190910194855250602084019290925260f81b6001600160f81b03199081166040840152166041820152604201919050565b80820180821115612aaf57612aaf6126e1565b60008235605e1983360301811261299857600080fd5b600060608236031215612b7a57600080fd5b604051606081016001600160401b038082118383101715612b9d57612b9d6122dc565b816040528435915080821115612bb257600080fd5b50612bbf368286016122f2565b825250602083013560208201526040830135612bda81612256565b604082015292915050565b6001600160401b03818116838216019080821115612717576127176126e1565b8183823760009101908152919050565b8481526001600160a01b03841660208201526060604082018190528101829052818360808301376000818301608090810191909152601f909201601f191601019392505050565b600082516129988184602087016121d856fe303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498f94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931f8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4a26469706673582212204710e7881df2a623dab8b587e3c8f0acd5809db9326b5ffd88b9639d777bbdfd64736f6c63430008140033", + "bytecode": "0x6101006040523480156200001257600080fd5b506040516200490b3803806200490b833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e05161475e620001ad600039600081816105040152818161095601528181610ac30152818161121a015281816112e3015281816113050152818161149c0152818161171901528181611cd20152818161239701528181612abc01528181612b8a0152612c7701526000818161060f015281816113dd0152818161197301526120d40152600081816106de01528181610f3d01528181611b280152612dc2015260008181610723015281816107ee0152818161126d015281816113b30152612d96015261475e6000f3fe608060405234801561001057600080fd5b50600436106102d25760003560e01c80636ff512cc11610186578063c754c7ed116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b14610765578063f35dda4714610778578063f851a4401461078057600080fd5b8063d8d1091b1461070b578063e46761c41461071e578063e7a7ed021461074557600080fd5b8063cfa8ed47116100c8578063cfa8ed47146106b9578063d02103ca146106d9578063d7bc90ff1461070057600080fd5b8063c754c7ed14610676578063c89e42df146106a657600080fd5b8063a3c573eb1161013a578063ada8f9191161011f578063ada8f91914610644578063b0afe15414610657578063bb5907081461066357600080fd5b8063a3c573eb1461060a578063a652f26c1461063157600080fd5b80637a5460c51161016b5780637a5460c5146105ab5780638c3d7301146105e75780639e001877146105ef57600080fd5b80636ff512cc14610585578063712570221461059857600080fd5b80633cbc795b11610234578063542028d5116101e85780635ec91958116101cd5780635ec91958146105545780636b8616ce1461055c5780636e05d2cd1461057c57600080fd5b8063542028d5146105395780635e9145c91461054157600080fd5b8063456052671161021957806345605267146104d757806349b7b802146104ff5780634e4877061461052657600080fd5b80633cbc795b1461044157806340b5de6c1461047f57600080fd5b806319d8ac611161028b5780632b35b3ac116102705780632b35b3ac146103ea57806332c2d153146104075780633c351e101461041c57600080fd5b806319d8ac611461037857806326782247146103a557600080fd5b806305835f37116102bc57806305835f371461030d578063107bf28c1461035657806311e892d41461035e57600080fd5b8062d0295d146102d757806303508963146102f2575b600080fd5b6102df6107a6565b6040519081526020015b60405180910390f35b6102fa602081565b60405161ffff90911681526020016102e9565b6103496040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102e9919061392e565b6103496108c6565b61036660f981565b60405160ff90911681526020016102e9565b60075461038c9067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102e9565b6001546103c59073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102e9565b6008546103f79060ff1681565b60405190151581526020016102e9565b61041a610415366004613983565b610954565b005b6008546103c590610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60085461046a907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102e9565b6104a67fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102e9565b60075461038c90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103c57f000000000000000000000000000000000000000000000000000000000000000081565b61041a6105343660046139c5565b610a23565b610349610c3d565b61041a61054f366004613a2e565b610c4a565b61041a611563565b6102df61056a3660046139c5565b60066020526000908152604090205481565b6102df60055481565b61041a610593366004613a7a565b61164d565b61041a6105a6366004613bc3565b611717565b6103496040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61041a611ece565b6103c573a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103c57f000000000000000000000000000000000000000000000000000000000000000081565b61034961063f366004613c70565b611fa1565b61041a610652366004613a7a565b6122cb565b6102df6405ca1ab1e081565b61041a610671366004613ce5565b612395565b60075461038c907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61041a6106b4366004613d8b565b61266d565b6002546103c59073ffffffffffffffffffffffffffffffffffffffff1681565b6103c57f000000000000000000000000000000000000000000000000000000000000000081565b6102df635ca1ab1e81565b61041a610719366004613dc0565b612700565b6103c57f000000000000000000000000000000000000000000000000000000000000000081565b60075461038c9068010000000000000000900467ffffffffffffffff1681565b61041a610773366004613e02565b612c37565b610366601b81565b6000546103c59062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610835573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108599190613e7a565b6007549091506000906108989067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613ec2565b67ffffffffffffffff169050806000036108b55760009250505090565b6108bf8183613eea565b9250505090565b600480546108d390613f25565b80601f01602080910402602001604051908101604052809291908181526020018280546108ff90613f25565b801561094c5780601f106109215761010080835404028352916020019161094c565b820191906000526020600020905b81548152906001019060200180831161092f57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109c3576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a1691815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a7a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610ac1576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b509190613f78565b610bb95760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610bb9576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546108d390613f25565b60025473ffffffffffffffffffffffffffffffffffffffff163314610c9b576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003610cd7576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610d13576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b8581101561114f576000898983818110610d5c57610d5c613f9a565b9050602002810190610d6e9190613fc9565b610d7790614007565b8051805160209091012060608201519192509067ffffffffffffffff1615610efa5785610da381614098565b96505060008183602001518460600151604051602001610dfb93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114610e84576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015610eda576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055611037565b602082015115801590610fc1575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015610f9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbf9190613e7a565b155b15610ff8576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611037576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff16108061106a575042826040015167ffffffffffffffff16115b156110a1576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151965050508080611147906140bf565b915050610d40565b5060075467ffffffffffffffff68010000000000000000909104811690841611156111a6576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146112dd5760006111fd8386613ec2565b905061121367ffffffffffffffff8216836140f7565b91506112947f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661124c6107a6565b611256919061410a565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613026565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6113db337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa15801561136e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113929190613e7a565b61139c919061410a565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906130ff565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561144357600080fd5b505af1158015611457573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af11580156114fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151f9190614121565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146115ba576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff16156115f7576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146116a4576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c32565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611786576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156117a65750600054600160ff909116105b806117c05750303b1580156117c0575060005460ff166001145b611851576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156118af57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611ac4576118d685613163565b6118df86613273565b6118e88761337a565b6040516020016118fa9392919061413e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af11580156119bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119df9190614177565b915091508163ffffffff16600014611a7c57600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff851602179055611ac1565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b600854600090611b11908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff1685611fa1565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb59190613e7a565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611d30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d549190614121565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611de691906141ff565b506004611df389826141ff565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611e5393929190614319565b60405180910390a15050505050508015611ec557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611f1f576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa600087604051602401611fd596959493929190614358565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff700000000000000000000000000000000000000000000000000000000179052805190915061ffff101561208b576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600060f961209c6020846143bb565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b9000000000000000000000000000000000000000000000000000000000000815250868860405160200161214197969594939291906143d6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa1580156121cf573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612247576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405160009061228d9084906405ca1ab1e090635ca1ab1e90601b907fff00000000000000000000000000000000000000000000000000000000000000906020016144b9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052955050505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612322576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c32565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314612404576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156124245750600054600160ff909116105b8061243e5750303b15801561243e575060005460ff166001145b6124ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401611848565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561252857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8a81169190910291909117909155600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001691881691909117905560036125b086826141ff565b5060046125bd85826141ff565b506005839055600780547a06978000000000000000000000000000000000000000000000000077ffffffffffffffffffffffffffffffff000000000000000090911667ffffffffffffffff8516171790558015611ec557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611ebc565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146126c4576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036126d082826141ff565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c32919061392e565b60085460ff1661273c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003612778576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156127b4576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff6801000000000000000082048116916127ef918491700100000000000000000000000000000000900416614515565b1115612827576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015612ab657600086868381811061286c5761286c613f9a565b905060200281019061287e9190614528565b6128879061455c565b90508361289381614098565b825180516020918201208185015160408087015190519499509194506000936128f59386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff891660009081526006909352912054909150811461297e576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86166000908152600660205260408120556129a36001886140f7565b8403612a125742600760189054906101000a900467ffffffffffffffff1684604001516129d091906145da565b67ffffffffffffffff161115612a12576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080612aae906140bf565b915050612850565b50612ae47f00000000000000000000000000000000000000000000000000000000000000008461124c6107a6565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612bd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf79190614121565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612c73576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ce0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d049190613e7a565b905081811115612d40576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612d7c576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612dbe73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846130ff565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e4f9190613e7a565b600780549192506801000000000000000090910467ffffffffffffffff16906008612e7983614098565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612eb09291906145fb565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612fc0576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a261301f565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613016949392919061460b565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526130fa9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261346d565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261315d9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613078565b50505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916131e5919061467c565b600060405180830381855afa9150503d8060008114613220576040519150601f19603f3d011682016040523d82523d6000602084013e613225565b606091505b50915091508161326a576040518060400160405280600781526020017f4e4f5f4e414d45000000000000000000000000000000000000000000000000008152506122c3565b6122c381613579565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916132f5919061467c565b600060405180830381855afa9150503d8060008114613330576040519150601f19603f3d011682016040523d82523d6000602084013e613335565b606091505b50915091508161326a576040518060400160405280600981526020017f4e4f5f53594d424f4c00000000000000000000000000000000000000000000008152506122c3565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8616916133fb919061467c565b600060405180830381855afa9150503d8060008114613436576040519150601f19603f3d011682016040523d82523d6000602084013e61343b565b606091505b509150915081801561344e575080516020145b6134595760126122c3565b808060200190518101906122c3919061468e565b60006134cf826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661374f9092919063ffffffff16565b8051909150156130fa57808060200190518101906134ed9190613f78565b6130fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611848565b6060604082511061359e578180602001905181019061359891906146b1565b92915050565b81516020036137165760005b6020811080156135f157508281815181106135c7576135c7613f9a565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b156136085780613600816140bf565b9150506135aa565b8060000361364b57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111561366657613666613aa9565b6040519080825280601f01601f191660200182016040528015613690576020820181803683370190505b50905060005b8281101561370e578481815181106136b0576136b0613f9a565b602001015160f81c60f81b8282815181106136cd576136cd613f9a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080613706816140bf565b915050613696565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60606122c38484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051613783919061467c565b60006040518083038185875af1925050503d80600081146137c0576040519150601f19603f3d011682016040523d82523d6000602084013e6137c5565b606091505b50915091506137d6878383876137e1565b979650505050505050565b606083156138775782516000036138705773ffffffffffffffffffffffffffffffffffffffff85163b613870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611848565b50816122c3565b6122c3838381511561388c5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611848919061392e565b60005b838110156138db5781810151838201526020016138c3565b50506000910152565b600081518084526138fc8160208601602086016138c0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061394160208301846138e4565b9392505050565b67ffffffffffffffff8116811461395e57600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461395e57600080fd5b60008060006060848603121561399857600080fd5b83356139a381613948565b92506020840135915060408401356139ba81613961565b809150509250925092565b6000602082840312156139d757600080fd5b813561394181613948565b60008083601f8401126139f457600080fd5b50813567ffffffffffffffff811115613a0c57600080fd5b6020830191508360208260051b8501011115613a2757600080fd5b9250929050565b600080600060408486031215613a4357600080fd5b833567ffffffffffffffff811115613a5a57600080fd5b613a66868287016139e2565b90945092505060208401356139ba81613961565b600060208284031215613a8c57600080fd5b813561394181613961565b63ffffffff8116811461395e57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613b1f57613b1f613aa9565b604052919050565b600067ffffffffffffffff821115613b4157613b41613aa9565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613b7e57600080fd5b8135613b91613b8c82613b27565b613ad8565b818152846020838601011115613ba657600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613bdc57600080fd5b8635613be781613961565b95506020870135613bf781613961565b94506040870135613c0781613a97565b93506060870135613c1781613961565b9250608087013567ffffffffffffffff80821115613c3457600080fd5b613c408a838b01613b6d565b935060a0890135915080821115613c5657600080fd5b50613c6389828a01613b6d565b9150509295509295509295565b60008060008060808587031215613c8657600080fd5b8435613c9181613a97565b93506020850135613ca181613961565b92506040850135613cb181613a97565b9150606085013567ffffffffffffffff811115613ccd57600080fd5b613cd987828801613b6d565b91505092959194509250565b60008060008060008060c08789031215613cfe57600080fd5b8635613d0981613961565b95506020870135613d1981613961565b9450604087013567ffffffffffffffff80821115613d3657600080fd5b613d428a838b01613b6d565b95506060890135915080821115613d5857600080fd5b50613d6589828a01613b6d565b9350506080870135915060a0870135613d7d81613948565b809150509295509295509295565b600060208284031215613d9d57600080fd5b813567ffffffffffffffff811115613db457600080fd5b6122c384828501613b6d565b60008060208385031215613dd357600080fd5b823567ffffffffffffffff811115613dea57600080fd5b613df6858286016139e2565b90969095509350505050565b600080600060408486031215613e1757600080fd5b833567ffffffffffffffff80821115613e2f57600080fd5b818601915086601f830112613e4357600080fd5b813581811115613e5257600080fd5b876020828501011115613e6457600080fd5b6020928301989097509590910135949350505050565b600060208284031215613e8c57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613ee357613ee3613e93565b5092915050565b600082613f20577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613f3957607f821691505b602082108103613f72577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215613f8a57600080fd5b8151801515811461394157600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613ffd57600080fd5b9190910192915050565b60006080823603121561401957600080fd5b6040516080810167ffffffffffffffff828210818311171561403d5761403d613aa9565b81604052843591508082111561405257600080fd5b5061405f36828601613b6d565b82525060208301356020820152604083013561407a81613948565b6040820152606083013561408d81613948565b606082015292915050565b600067ffffffffffffffff8083168181036140b5576140b5613e93565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036140f0576140f0613e93565b5060010190565b8181038181111561359857613598613e93565b808202811582820484141761359857613598613e93565b60006020828403121561413357600080fd5b815161394181613948565b60608152600061415160608301866138e4565b828103602084015261416381866138e4565b91505060ff83166040830152949350505050565b6000806040838503121561418a57600080fd5b825161419581613a97565b60208401519092506141a681613961565b809150509250929050565b601f8211156130fa57600081815260208120601f850160051c810160208610156141d85750805b601f850160051c820191505b818110156141f7578281556001016141e4565b505050505050565b815167ffffffffffffffff81111561421957614219613aa9565b61422d816142278454613f25565b846141b1565b602080601f831160018114614280576000841561424a5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556141f7565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156142cd578886015182559484019460019091019084016142ae565b508582101561430957878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60608152600061432c60608301866138e4565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a08301526143af60c08301846138e4565b98975050505050505050565b61ffff818116838216019080821115613ee357613ee3613e93565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b166001840152875161443f816003860160208c016138c0565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614482816017840160208b016138c0565b808201915050818660f01b166017820152845191506144a88260198301602088016138c0565b016019019998505050505050505050565b600086516144cb818460208b016138c0565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b8082018082111561359857613598613e93565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112613ffd57600080fd5b60006060823603121561456e57600080fd5b6040516060810167ffffffffffffffff828210818311171561459257614592613aa9565b8160405284359150808211156145a757600080fd5b506145b436828601613b6d565b8252506020830135602082015260408301356145cf81613948565b604082015292915050565b67ffffffffffffffff818116838216019080821115613ee357613ee3613e93565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b60008251613ffd8184602087016138c0565b6000602082840312156146a057600080fd5b815160ff8116811461394157600080fd5b6000602082840312156146c357600080fd5b815167ffffffffffffffff8111156146da57600080fd5b8201601f810184136146eb57600080fd5b80516146f9613b8c82613b27565b81815285602083850101111561470e57600080fd5b61471f8260208301602086016138c0565b9594505050505056fea264697066735822122085e954b3c03db9fc33602edbb8bc952dc84d1ba702b087333a891f41f926636964736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102d25760003560e01c80636ff512cc11610186578063c754c7ed116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b14610765578063f35dda4714610778578063f851a4401461078057600080fd5b8063d8d1091b1461070b578063e46761c41461071e578063e7a7ed021461074557600080fd5b8063cfa8ed47116100c8578063cfa8ed47146106b9578063d02103ca146106d9578063d7bc90ff1461070057600080fd5b8063c754c7ed14610676578063c89e42df146106a657600080fd5b8063a3c573eb1161013a578063ada8f9191161011f578063ada8f91914610644578063b0afe15414610657578063bb5907081461066357600080fd5b8063a3c573eb1461060a578063a652f26c1461063157600080fd5b80637a5460c51161016b5780637a5460c5146105ab5780638c3d7301146105e75780639e001877146105ef57600080fd5b80636ff512cc14610585578063712570221461059857600080fd5b80633cbc795b11610234578063542028d5116101e85780635ec91958116101cd5780635ec91958146105545780636b8616ce1461055c5780636e05d2cd1461057c57600080fd5b8063542028d5146105395780635e9145c91461054157600080fd5b8063456052671161021957806345605267146104d757806349b7b802146104ff5780634e4877061461052657600080fd5b80633cbc795b1461044157806340b5de6c1461047f57600080fd5b806319d8ac611161028b5780632b35b3ac116102705780632b35b3ac146103ea57806332c2d153146104075780633c351e101461041c57600080fd5b806319d8ac611461037857806326782247146103a557600080fd5b806305835f37116102bc57806305835f371461030d578063107bf28c1461035657806311e892d41461035e57600080fd5b8062d0295d146102d757806303508963146102f2575b600080fd5b6102df6107a6565b6040519081526020015b60405180910390f35b6102fa602081565b60405161ffff90911681526020016102e9565b6103496040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102e9919061392e565b6103496108c6565b61036660f981565b60405160ff90911681526020016102e9565b60075461038c9067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102e9565b6001546103c59073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102e9565b6008546103f79060ff1681565b60405190151581526020016102e9565b61041a610415366004613983565b610954565b005b6008546103c590610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60085461046a907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102e9565b6104a67fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102e9565b60075461038c90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103c57f000000000000000000000000000000000000000000000000000000000000000081565b61041a6105343660046139c5565b610a23565b610349610c3d565b61041a61054f366004613a2e565b610c4a565b61041a611563565b6102df61056a3660046139c5565b60066020526000908152604090205481565b6102df60055481565b61041a610593366004613a7a565b61164d565b61041a6105a6366004613bc3565b611717565b6103496040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61041a611ece565b6103c573a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103c57f000000000000000000000000000000000000000000000000000000000000000081565b61034961063f366004613c70565b611fa1565b61041a610652366004613a7a565b6122cb565b6102df6405ca1ab1e081565b61041a610671366004613ce5565b612395565b60075461038c907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61041a6106b4366004613d8b565b61266d565b6002546103c59073ffffffffffffffffffffffffffffffffffffffff1681565b6103c57f000000000000000000000000000000000000000000000000000000000000000081565b6102df635ca1ab1e81565b61041a610719366004613dc0565b612700565b6103c57f000000000000000000000000000000000000000000000000000000000000000081565b60075461038c9068010000000000000000900467ffffffffffffffff1681565b61041a610773366004613e02565b612c37565b610366601b81565b6000546103c59062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610835573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108599190613e7a565b6007549091506000906108989067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613ec2565b67ffffffffffffffff169050806000036108b55760009250505090565b6108bf8183613eea565b9250505090565b600480546108d390613f25565b80601f01602080910402602001604051908101604052809291908181526020018280546108ff90613f25565b801561094c5780601f106109215761010080835404028352916020019161094c565b820191906000526020600020905b81548152906001019060200180831161092f57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109c3576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a1691815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a7a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610ac1576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b509190613f78565b610bb95760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610bb9576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546108d390613f25565b60025473ffffffffffffffffffffffffffffffffffffffff163314610c9b576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003610cd7576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610d13576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b8581101561114f576000898983818110610d5c57610d5c613f9a565b9050602002810190610d6e9190613fc9565b610d7790614007565b8051805160209091012060608201519192509067ffffffffffffffff1615610efa5785610da381614098565b96505060008183602001518460600151604051602001610dfb93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114610e84576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015610eda576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055611037565b602082015115801590610fc1575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015610f9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbf9190613e7a565b155b15610ff8576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611037576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff16108061106a575042826040015167ffffffffffffffff16115b156110a1576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151965050508080611147906140bf565b915050610d40565b5060075467ffffffffffffffff68010000000000000000909104811690841611156111a6576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146112dd5760006111fd8386613ec2565b905061121367ffffffffffffffff8216836140f7565b91506112947f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661124c6107a6565b611256919061410a565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613026565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6113db337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa15801561136e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113929190613e7a565b61139c919061410a565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906130ff565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561144357600080fd5b505af1158015611457573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af11580156114fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151f9190614121565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146115ba576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff16156115f7576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146116a4576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c32565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611786576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156117a65750600054600160ff909116105b806117c05750303b1580156117c0575060005460ff166001145b611851576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156118af57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611ac4576118d685613163565b6118df86613273565b6118e88761337a565b6040516020016118fa9392919061413e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af11580156119bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119df9190614177565b915091508163ffffffff16600014611a7c57600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff851602179055611ac1565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b600854600090611b11908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff1685611fa1565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb59190613e7a565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611d30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d549190614121565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611de691906141ff565b506004611df389826141ff565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611e5393929190614319565b60405180910390a15050505050508015611ec557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611f1f576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa600087604051602401611fd596959493929190614358565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff700000000000000000000000000000000000000000000000000000000179052805190915061ffff101561208b576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600060f961209c6020846143bb565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b9000000000000000000000000000000000000000000000000000000000000815250868860405160200161214197969594939291906143d6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa1580156121cf573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612247576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405160009061228d9084906405ca1ab1e090635ca1ab1e90601b907fff00000000000000000000000000000000000000000000000000000000000000906020016144b9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052955050505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612322576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c32565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314612404576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156124245750600054600160ff909116105b8061243e5750303b15801561243e575060005460ff166001145b6124ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401611848565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561252857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8a81169190910291909117909155600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001691881691909117905560036125b086826141ff565b5060046125bd85826141ff565b506005839055600780547a06978000000000000000000000000000000000000000000000000077ffffffffffffffffffffffffffffffff000000000000000090911667ffffffffffffffff8516171790558015611ec557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611ebc565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146126c4576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036126d082826141ff565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c32919061392e565b60085460ff1661273c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003612778576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156127b4576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff6801000000000000000082048116916127ef918491700100000000000000000000000000000000900416614515565b1115612827576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015612ab657600086868381811061286c5761286c613f9a565b905060200281019061287e9190614528565b6128879061455c565b90508361289381614098565b825180516020918201208185015160408087015190519499509194506000936128f59386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff891660009081526006909352912054909150811461297e576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86166000908152600660205260408120556129a36001886140f7565b8403612a125742600760189054906101000a900467ffffffffffffffff1684604001516129d091906145da565b67ffffffffffffffff161115612a12576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080612aae906140bf565b915050612850565b50612ae47f00000000000000000000000000000000000000000000000000000000000000008461124c6107a6565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612bd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf79190614121565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612c73576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ce0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d049190613e7a565b905081811115612d40576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612d7c576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612dbe73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846130ff565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e4f9190613e7a565b600780549192506801000000000000000090910467ffffffffffffffff16906008612e7983614098565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612eb09291906145fb565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612fc0576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a261301f565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613016949392919061460b565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526130fa9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261346d565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261315d9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613078565b50505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916131e5919061467c565b600060405180830381855afa9150503d8060008114613220576040519150601f19603f3d011682016040523d82523d6000602084013e613225565b606091505b50915091508161326a576040518060400160405280600781526020017f4e4f5f4e414d45000000000000000000000000000000000000000000000000008152506122c3565b6122c381613579565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916132f5919061467c565b600060405180830381855afa9150503d8060008114613330576040519150601f19603f3d011682016040523d82523d6000602084013e613335565b606091505b50915091508161326a576040518060400160405280600981526020017f4e4f5f53594d424f4c00000000000000000000000000000000000000000000008152506122c3565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8616916133fb919061467c565b600060405180830381855afa9150503d8060008114613436576040519150601f19603f3d011682016040523d82523d6000602084013e61343b565b606091505b509150915081801561344e575080516020145b6134595760126122c3565b808060200190518101906122c3919061468e565b60006134cf826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661374f9092919063ffffffff16565b8051909150156130fa57808060200190518101906134ed9190613f78565b6130fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611848565b6060604082511061359e578180602001905181019061359891906146b1565b92915050565b81516020036137165760005b6020811080156135f157508281815181106135c7576135c7613f9a565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b156136085780613600816140bf565b9150506135aa565b8060000361364b57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111561366657613666613aa9565b6040519080825280601f01601f191660200182016040528015613690576020820181803683370190505b50905060005b8281101561370e578481815181106136b0576136b0613f9a565b602001015160f81c60f81b8282815181106136cd576136cd613f9a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080613706816140bf565b915050613696565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60606122c38484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051613783919061467c565b60006040518083038185875af1925050503d80600081146137c0576040519150601f19603f3d011682016040523d82523d6000602084013e6137c5565b606091505b50915091506137d6878383876137e1565b979650505050505050565b606083156138775782516000036138705773ffffffffffffffffffffffffffffffffffffffff85163b613870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611848565b50816122c3565b6122c3838381511561388c5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611848919061392e565b60005b838110156138db5781810151838201526020016138c3565b50506000910152565b600081518084526138fc8160208601602086016138c0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061394160208301846138e4565b9392505050565b67ffffffffffffffff8116811461395e57600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461395e57600080fd5b60008060006060848603121561399857600080fd5b83356139a381613948565b92506020840135915060408401356139ba81613961565b809150509250925092565b6000602082840312156139d757600080fd5b813561394181613948565b60008083601f8401126139f457600080fd5b50813567ffffffffffffffff811115613a0c57600080fd5b6020830191508360208260051b8501011115613a2757600080fd5b9250929050565b600080600060408486031215613a4357600080fd5b833567ffffffffffffffff811115613a5a57600080fd5b613a66868287016139e2565b90945092505060208401356139ba81613961565b600060208284031215613a8c57600080fd5b813561394181613961565b63ffffffff8116811461395e57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613b1f57613b1f613aa9565b604052919050565b600067ffffffffffffffff821115613b4157613b41613aa9565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613b7e57600080fd5b8135613b91613b8c82613b27565b613ad8565b818152846020838601011115613ba657600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613bdc57600080fd5b8635613be781613961565b95506020870135613bf781613961565b94506040870135613c0781613a97565b93506060870135613c1781613961565b9250608087013567ffffffffffffffff80821115613c3457600080fd5b613c408a838b01613b6d565b935060a0890135915080821115613c5657600080fd5b50613c6389828a01613b6d565b9150509295509295509295565b60008060008060808587031215613c8657600080fd5b8435613c9181613a97565b93506020850135613ca181613961565b92506040850135613cb181613a97565b9150606085013567ffffffffffffffff811115613ccd57600080fd5b613cd987828801613b6d565b91505092959194509250565b60008060008060008060c08789031215613cfe57600080fd5b8635613d0981613961565b95506020870135613d1981613961565b9450604087013567ffffffffffffffff80821115613d3657600080fd5b613d428a838b01613b6d565b95506060890135915080821115613d5857600080fd5b50613d6589828a01613b6d565b9350506080870135915060a0870135613d7d81613948565b809150509295509295509295565b600060208284031215613d9d57600080fd5b813567ffffffffffffffff811115613db457600080fd5b6122c384828501613b6d565b60008060208385031215613dd357600080fd5b823567ffffffffffffffff811115613dea57600080fd5b613df6858286016139e2565b90969095509350505050565b600080600060408486031215613e1757600080fd5b833567ffffffffffffffff80821115613e2f57600080fd5b818601915086601f830112613e4357600080fd5b813581811115613e5257600080fd5b876020828501011115613e6457600080fd5b6020928301989097509590910135949350505050565b600060208284031215613e8c57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613ee357613ee3613e93565b5092915050565b600082613f20577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613f3957607f821691505b602082108103613f72577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215613f8a57600080fd5b8151801515811461394157600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613ffd57600080fd5b9190910192915050565b60006080823603121561401957600080fd5b6040516080810167ffffffffffffffff828210818311171561403d5761403d613aa9565b81604052843591508082111561405257600080fd5b5061405f36828601613b6d565b82525060208301356020820152604083013561407a81613948565b6040820152606083013561408d81613948565b606082015292915050565b600067ffffffffffffffff8083168181036140b5576140b5613e93565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036140f0576140f0613e93565b5060010190565b8181038181111561359857613598613e93565b808202811582820484141761359857613598613e93565b60006020828403121561413357600080fd5b815161394181613948565b60608152600061415160608301866138e4565b828103602084015261416381866138e4565b91505060ff83166040830152949350505050565b6000806040838503121561418a57600080fd5b825161419581613a97565b60208401519092506141a681613961565b809150509250929050565b601f8211156130fa57600081815260208120601f850160051c810160208610156141d85750805b601f850160051c820191505b818110156141f7578281556001016141e4565b505050505050565b815167ffffffffffffffff81111561421957614219613aa9565b61422d816142278454613f25565b846141b1565b602080601f831160018114614280576000841561424a5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556141f7565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156142cd578886015182559484019460019091019084016142ae565b508582101561430957878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60608152600061432c60608301866138e4565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a08301526143af60c08301846138e4565b98975050505050505050565b61ffff818116838216019080821115613ee357613ee3613e93565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b166001840152875161443f816003860160208c016138c0565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614482816017840160208b016138c0565b808201915050818660f01b166017820152845191506144a88260198301602088016138c0565b016019019998505050505050505050565b600086516144cb818460208b016138c0565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b8082018082111561359857613598613e93565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112613ffd57600080fd5b60006060823603121561456e57600080fd5b6040516060810167ffffffffffffffff828210818311171561459257614592613aa9565b8160405284359150808211156145a757600080fd5b506145b436828601613b6d565b8252506020830135602082015260408301356145cf81613948565b604082015292915050565b67ffffffffffffffff818116838216019080821115613ee357613ee3613e93565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b60008251613ffd8184602087016138c0565b6000602082840312156146a057600080fd5b815160ff8116811461394157600080fd5b6000602082840312156146c357600080fd5b815167ffffffffffffffff8111156146da57600080fd5b8201601f810184136146eb57600080fd5b80516146f9613b8c82613b27565b81815285602083850101111561470e57600080fd5b61471f8260208301602086016138c0565b9594505050505056fea264697066735822122085e954b3c03db9fc33602edbb8bc952dc84d1ba702b087333a891f41f926636964736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/ProxyAdmin.json b/compiled-contracts/paris/ProxyAdmin.json index 372cdc4c7..50bdd2b68 100644 --- a/compiled-contracts/paris/ProxyAdmin.json +++ b/compiled-contracts/paris/ProxyAdmin.json @@ -153,8 +153,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61069b8061007e6000396000f3fe60806040526004361061006b5760003560e01c8063204e1c7a14610070578063715018a6146100a65780637eff275e146100bd5780638da5cb5b146100dd5780639623609d146100f257806399a88ec414610105578063f2fde38b14610125578063f3b7dead14610145575b600080fd5b34801561007c57600080fd5b5061009061008b36600461048e565b610165565b60405161009d91906104b2565b60405180910390f35b3480156100b257600080fd5b506100bb6101f6565b005b3480156100c957600080fd5b506100bb6100d83660046104c6565b61020a565b3480156100e957600080fd5b50610090610274565b6100bb610100366004610515565b610283565b34801561011157600080fd5b506100bb6101203660046104c6565b6102f2565b34801561013157600080fd5b506100bb61014036600461048e565b610326565b34801561015157600080fd5b5061009061016036600461048e565b6103a4565b6000806000836001600160a01b031660405161018b90635c60da1b60e01b815260040190565b600060405180830381855afa9150503d80600081146101c6576040519150601f19603f3d011682016040523d82523d6000602084013e6101cb565b606091505b5091509150816101da57600080fd5b808060200190518101906101ee91906105ea565b949350505050565b6101fe6103ca565b6102086000610429565b565b6102126103ca565b6040516308f2839760e41b81526001600160a01b03831690638f2839709061023e9084906004016104b2565b600060405180830381600087803b15801561025857600080fd5b505af115801561026c573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031690565b61028b6103ca565b60405163278f794360e11b81526001600160a01b03841690634f1ef2869034906102bb9086908690600401610607565b6000604051808303818588803b1580156102d457600080fd5b505af11580156102e8573d6000803e3d6000fd5b5050505050505050565b6102fa6103ca565b604051631b2ce7f360e11b81526001600160a01b03831690633659cfe69061023e9084906004016104b2565b61032e6103ca565b6001600160a01b0381166103985760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6103a181610429565b50565b6000806000836001600160a01b031660405161018b906303e1469160e61b815260040190565b336103d3610274565b6001600160a01b0316146102085760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161038f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146103a157600080fd5b6000602082840312156104a057600080fd5b81356104ab81610479565b9392505050565b6001600160a01b0391909116815260200190565b600080604083850312156104d957600080fd5b82356104e481610479565b915060208301356104f481610479565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060006060848603121561052a57600080fd5b833561053581610479565b9250602084013561054581610479565b915060408401356001600160401b038082111561056157600080fd5b818601915086601f83011261057557600080fd5b813581811115610587576105876104ff565b604051601f8201601f19908116603f011681019083821181831017156105af576105af6104ff565b816040528281528960208487010111156105c857600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b6000602082840312156105fc57600080fd5b81516104ab81610479565b60018060a01b038316815260006020604081840152835180604085015260005b8181101561064357858101830151858201606001528201610627565b506000606082860101526060601f19601f83011685010192505050939250505056fea2646970667358221220c1ccd6dc28a6e60391ab78391e5fb83072848700fa839419a7c4fe7a09edd22364736f6c63430008140033", - "deployedBytecode": "0x60806040526004361061006b5760003560e01c8063204e1c7a14610070578063715018a6146100a65780637eff275e146100bd5780638da5cb5b146100dd5780639623609d146100f257806399a88ec414610105578063f2fde38b14610125578063f3b7dead14610145575b600080fd5b34801561007c57600080fd5b5061009061008b36600461048e565b610165565b60405161009d91906104b2565b60405180910390f35b3480156100b257600080fd5b506100bb6101f6565b005b3480156100c957600080fd5b506100bb6100d83660046104c6565b61020a565b3480156100e957600080fd5b50610090610274565b6100bb610100366004610515565b610283565b34801561011157600080fd5b506100bb6101203660046104c6565b6102f2565b34801561013157600080fd5b506100bb61014036600461048e565b610326565b34801561015157600080fd5b5061009061016036600461048e565b6103a4565b6000806000836001600160a01b031660405161018b90635c60da1b60e01b815260040190565b600060405180830381855afa9150503d80600081146101c6576040519150601f19603f3d011682016040523d82523d6000602084013e6101cb565b606091505b5091509150816101da57600080fd5b808060200190518101906101ee91906105ea565b949350505050565b6101fe6103ca565b6102086000610429565b565b6102126103ca565b6040516308f2839760e41b81526001600160a01b03831690638f2839709061023e9084906004016104b2565b600060405180830381600087803b15801561025857600080fd5b505af115801561026c573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031690565b61028b6103ca565b60405163278f794360e11b81526001600160a01b03841690634f1ef2869034906102bb9086908690600401610607565b6000604051808303818588803b1580156102d457600080fd5b505af11580156102e8573d6000803e3d6000fd5b5050505050505050565b6102fa6103ca565b604051631b2ce7f360e11b81526001600160a01b03831690633659cfe69061023e9084906004016104b2565b61032e6103ca565b6001600160a01b0381166103985760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6103a181610429565b50565b6000806000836001600160a01b031660405161018b906303e1469160e61b815260040190565b336103d3610274565b6001600160a01b0316146102085760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161038f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146103a157600080fd5b6000602082840312156104a057600080fd5b81356104ab81610479565b9392505050565b6001600160a01b0391909116815260200190565b600080604083850312156104d957600080fd5b82356104e481610479565b915060208301356104f481610479565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060006060848603121561052a57600080fd5b833561053581610479565b9250602084013561054581610479565b915060408401356001600160401b038082111561056157600080fd5b818601915086601f83011261057557600080fd5b813581811115610587576105876104ff565b604051601f8201601f19908116603f011681019083821181831017156105af576105af6104ff565b816040528281528960208487010111156105c857600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b6000602082840312156105fc57600080fd5b81516104ab81610479565b60018060a01b038316815260006020604081840152835180604085015260005b8181101561064357858101830151858201606001528201610627565b506000606082860101526060601f19601f83011685010192505050939250505056fea2646970667358221220c1ccd6dc28a6e60391ab78391e5fb83072848700fa839419a7c4fe7a09edd22364736f6c63430008140033", + "bytecode": "0x608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6108658061007e6000396000f3fe60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461012b57806399a88ec41461013e578063f2fde38b1461015e578063f3b7dead1461017e57600080fd5b8063204e1c7a14610080578063715018a6146100c95780637eff275e146100e05780638da5cb5b14610100575b600080fd5b34801561008c57600080fd5b506100a061009b366004610608565b61019e565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100d557600080fd5b506100de610255565b005b3480156100ec57600080fd5b506100de6100fb36600461062c565b610269565b34801561010c57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166100a0565b6100de610139366004610694565b6102f7565b34801561014a57600080fd5b506100de61015936600461062c565b61038c565b34801561016a57600080fd5b506100de610179366004610608565b6103e8565b34801561018a57600080fd5b506100a0610199366004610608565b6104a4565b60008060008373ffffffffffffffffffffffffffffffffffffffff166040516101ea907f5c60da1b00000000000000000000000000000000000000000000000000000000815260040190565b600060405180830381855afa9150503d8060008114610225576040519150601f19603f3d011682016040523d82523d6000602084013e61022a565b606091505b50915091508161023957600080fd5b8080602001905181019061024d9190610788565b949350505050565b61025d6104f0565b6102676000610571565b565b6102716104f0565b6040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690638f283970906024015b600060405180830381600087803b1580156102db57600080fd5b505af11580156102ef573d6000803e3d6000fd5b505050505050565b6102ff6104f0565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef28690349061035590869086906004016107a5565b6000604051808303818588803b15801561036e57600080fd5b505af1158015610382573d6000803e3d6000fd5b5050505050505050565b6103946104f0565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690633659cfe6906024016102c1565b6103f06104f0565b73ffffffffffffffffffffffffffffffffffffffff8116610498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6104a181610571565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff166040516101ea907ff851a44000000000000000000000000000000000000000000000000000000000815260040190565b60005473ffffffffffffffffffffffffffffffffffffffff163314610267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161048f565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff811681146104a157600080fd5b60006020828403121561061a57600080fd5b8135610625816105e6565b9392505050565b6000806040838503121561063f57600080fd5b823561064a816105e6565b9150602083013561065a816105e6565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156106a957600080fd5b83356106b4816105e6565b925060208401356106c4816105e6565b9150604084013567ffffffffffffffff808211156106e157600080fd5b818601915086601f8301126106f557600080fd5b81358181111561070757610707610665565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561074d5761074d610665565b8160405282815289602084870101111561076657600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b60006020828403121561079a57600080fd5b8151610625816105e6565b73ffffffffffffffffffffffffffffffffffffffff8316815260006020604081840152835180604085015260005b818110156107ef578581018301518582016060015282016107d3565b5060006060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050939250505056fea2646970667358221220c9867ffac53151bdb1305d8f5e3e883cd83e5270c7ec09cdc24e837b2e65239064736f6c63430008140033", + "deployedBytecode": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461012b57806399a88ec41461013e578063f2fde38b1461015e578063f3b7dead1461017e57600080fd5b8063204e1c7a14610080578063715018a6146100c95780637eff275e146100e05780638da5cb5b14610100575b600080fd5b34801561008c57600080fd5b506100a061009b366004610608565b61019e565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100d557600080fd5b506100de610255565b005b3480156100ec57600080fd5b506100de6100fb36600461062c565b610269565b34801561010c57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166100a0565b6100de610139366004610694565b6102f7565b34801561014a57600080fd5b506100de61015936600461062c565b61038c565b34801561016a57600080fd5b506100de610179366004610608565b6103e8565b34801561018a57600080fd5b506100a0610199366004610608565b6104a4565b60008060008373ffffffffffffffffffffffffffffffffffffffff166040516101ea907f5c60da1b00000000000000000000000000000000000000000000000000000000815260040190565b600060405180830381855afa9150503d8060008114610225576040519150601f19603f3d011682016040523d82523d6000602084013e61022a565b606091505b50915091508161023957600080fd5b8080602001905181019061024d9190610788565b949350505050565b61025d6104f0565b6102676000610571565b565b6102716104f0565b6040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690638f283970906024015b600060405180830381600087803b1580156102db57600080fd5b505af11580156102ef573d6000803e3d6000fd5b505050505050565b6102ff6104f0565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef28690349061035590869086906004016107a5565b6000604051808303818588803b15801561036e57600080fd5b505af1158015610382573d6000803e3d6000fd5b5050505050505050565b6103946104f0565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690633659cfe6906024016102c1565b6103f06104f0565b73ffffffffffffffffffffffffffffffffffffffff8116610498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6104a181610571565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff166040516101ea907ff851a44000000000000000000000000000000000000000000000000000000000815260040190565b60005473ffffffffffffffffffffffffffffffffffffffff163314610267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161048f565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff811681146104a157600080fd5b60006020828403121561061a57600080fd5b8135610625816105e6565b9392505050565b6000806040838503121561063f57600080fd5b823561064a816105e6565b9150602083013561065a816105e6565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156106a957600080fd5b83356106b4816105e6565b925060208401356106c4816105e6565b9150604084013567ffffffffffffffff808211156106e157600080fd5b818601915086601f8301126106f557600080fd5b81358181111561070757610707610665565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561074d5761074d610665565b8160405282815289602084870101111561076657600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b60006020828403121561079a57600080fd5b8151610625816105e6565b73ffffffffffffffffffffffffffffffffffffffff8316815260006020604081840152835180604085015260005b818110156107ef578581018301518582016060015282016107d3565b5060006060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050939250505056fea2646970667358221220c9867ffac53151bdb1305d8f5e3e883cd83e5270c7ec09cdc24e837b2e65239064736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/TokenWrapped.json b/compiled-contracts/paris/TokenWrapped.json index 1546ab5cf..a21f1b423 100644 --- a/compiled-contracts/paris/TokenWrapped.json +++ b/compiled-contracts/paris/TokenWrapped.json @@ -471,8 +471,8 @@ "type": "function" } ], - "bytecode": "0x6101006040523480156200001257600080fd5b50604051620015643803806200156483398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516110a8620004bc60003960006101a30152600081816102660152818161048c01526104fa0152600061043d0152600081816102cb015261040701526110a86000f3fe608060405234801561001057600080fd5b50600436106101075760003560e01c806306fdde031461010c578063095ea7b31461012a57806318160ddd1461014d57806320606b701461015f57806323b872dd1461017457806330adf81f14610187578063313ce5671461019c5780633644e515146101cd57806339509351146101d557806340c10f19146101e857806370a08231146101fd5780637ecebe001461022657806395d89b41146102465780639dc29fac1461024e578063a3c573eb14610261578063a457c2d7146102a0578063a9059cbb146102b3578063cd0d0096146102c6578063d505accf146102ed578063dd62ed3e14610300578063ffa1ad7414610313575b600080fd5b610114610333565b6040516101219190610dae565b60405180910390f35b61013d610138366004610e18565b6103c5565b6040519015158152602001610121565b6002545b604051908152602001610121565b61015160008051602061105383398151915281565b61013d610182366004610e42565b6103df565b61015160008051602061103383398151915281565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610121565b610151610403565b61013d6101e3366004610e18565b61045f565b6101fb6101f6366004610e18565b610481565b005b61015161020b366004610e7e565b6001600160a01b031660009081526020819052604090205490565b610151610234366004610e7e565b60056020526000908152604090205481565b6101146104e0565b6101fb61025c366004610e18565b6104ef565b6102887f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610121565b61013d6102ae366004610e18565b610541565b61013d6102c1366004610e18565b6105bc565b6101517f000000000000000000000000000000000000000000000000000000000000000081565b6101fb6102fb366004610ea0565b6105ca565b61015161030e366004610f13565b6107f3565b610114604051806040016040528060018152602001603160f81b81525081565b60606003805461034290610f46565b80601f016020809104026020016040519081016040528092919081815260200182805461036e90610f46565b80156103bb5780601f10610390576101008083540402835291602001916103bb565b820191906000526020600020905b81548152906001019060200180831161039e57829003601f168201915b5050505050905090565b6000336103d381858561081e565b60019150505b92915050565b6000336103ed858285610943565b6103f88585856109bd565b506001949350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461461043a5761043546610b4f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000336103d381858561047283836107f3565b61047c9190610f96565b61081e565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104d25760405162461bcd60e51b81526004016104c990610fa9565b60405180910390fd5b6104dc8282610be9565b5050565b60606004805461034290610f46565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105375760405162461bcd60e51b81526004016104c990610fa9565b6104dc8282610c96565b6000338161054f82866107f3565b9050838110156105af5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104c9565b6103f8828686840361081e565b6000336103d38185856109bd565b834211156106265760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104c9565b6001600160a01b03871660009081526005602052604081208054600080516020611033833981519152918a918a918a91908661066183610ff9565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006106bf610403565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa15801561074a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906107805750896001600160a01b0316816001600160a01b0316145b6107dc5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104c9565b6107e78a8a8a61081e565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166108805760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104c9565b6001600160a01b0382166108e15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104c9565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600061094f84846107f3565b905060001981146109b757818110156109aa5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104c9565b6109b7848484840361081e565b50505050565b6001600160a01b038316610a215760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104c9565b6001600160a01b038216610a835760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104c9565b6001600160a01b03831660009081526020819052604090205481811015610afb5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104c9565b6001600160a01b0384811660008181526020818152604080832087870390559387168083529184902080548701905592518581529092600080516020611013833981519152910160405180910390a36109b7565b6000600080516020611053833981519152610b68610333565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c3f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104c9565b8060026000828254610c519190610f96565b90915550506001600160a01b03821660008181526020818152604080832080548601905551848152600080516020611013833981519152910160405180910390a35050565b6001600160a01b038216610cf65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104c9565b6001600160a01b03821660009081526020819052604090205481811015610d6a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104c9565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192916000805160206110138339815191529101610936565b600060208083528351808285015260005b81811015610ddb57858101830151858201604001528201610dbf565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610e1357600080fd5b919050565b60008060408385031215610e2b57600080fd5b610e3483610dfc565b946020939093013593505050565b600080600060608486031215610e5757600080fd5b610e6084610dfc565b9250610e6e60208501610dfc565b9150604084013590509250925092565b600060208284031215610e9057600080fd5b610e9982610dfc565b9392505050565b600080600080600080600060e0888a031215610ebb57600080fd5b610ec488610dfc565b9650610ed260208901610dfc565b95506040880135945060608801359350608088013560ff81168114610ef657600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f2657600080fd5b610f2f83610dfc565b9150610f3d60208401610dfc565b90509250929050565b600181811c90821680610f5a57607f821691505b602082108103610f7a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156103d9576103d9610f80565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b60006001820161100b5761100b610f80565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa26469706673582212203ea4a1224be7b5ef35dc397dfc81433d85cd6fdbf17d8b2e3d528071e7e612b564736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101075760003560e01c806306fdde031461010c578063095ea7b31461012a57806318160ddd1461014d57806320606b701461015f57806323b872dd1461017457806330adf81f14610187578063313ce5671461019c5780633644e515146101cd57806339509351146101d557806340c10f19146101e857806370a08231146101fd5780637ecebe001461022657806395d89b41146102465780639dc29fac1461024e578063a3c573eb14610261578063a457c2d7146102a0578063a9059cbb146102b3578063cd0d0096146102c6578063d505accf146102ed578063dd62ed3e14610300578063ffa1ad7414610313575b600080fd5b610114610333565b6040516101219190610dae565b60405180910390f35b61013d610138366004610e18565b6103c5565b6040519015158152602001610121565b6002545b604051908152602001610121565b61015160008051602061105383398151915281565b61013d610182366004610e42565b6103df565b61015160008051602061103383398151915281565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610121565b610151610403565b61013d6101e3366004610e18565b61045f565b6101fb6101f6366004610e18565b610481565b005b61015161020b366004610e7e565b6001600160a01b031660009081526020819052604090205490565b610151610234366004610e7e565b60056020526000908152604090205481565b6101146104e0565b6101fb61025c366004610e18565b6104ef565b6102887f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610121565b61013d6102ae366004610e18565b610541565b61013d6102c1366004610e18565b6105bc565b6101517f000000000000000000000000000000000000000000000000000000000000000081565b6101fb6102fb366004610ea0565b6105ca565b61015161030e366004610f13565b6107f3565b610114604051806040016040528060018152602001603160f81b81525081565b60606003805461034290610f46565b80601f016020809104026020016040519081016040528092919081815260200182805461036e90610f46565b80156103bb5780601f10610390576101008083540402835291602001916103bb565b820191906000526020600020905b81548152906001019060200180831161039e57829003601f168201915b5050505050905090565b6000336103d381858561081e565b60019150505b92915050565b6000336103ed858285610943565b6103f88585856109bd565b506001949350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461461043a5761043546610b4f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000336103d381858561047283836107f3565b61047c9190610f96565b61081e565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104d25760405162461bcd60e51b81526004016104c990610fa9565b60405180910390fd5b6104dc8282610be9565b5050565b60606004805461034290610f46565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105375760405162461bcd60e51b81526004016104c990610fa9565b6104dc8282610c96565b6000338161054f82866107f3565b9050838110156105af5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104c9565b6103f8828686840361081e565b6000336103d38185856109bd565b834211156106265760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104c9565b6001600160a01b03871660009081526005602052604081208054600080516020611033833981519152918a918a918a91908661066183610ff9565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006106bf610403565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa15801561074a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906107805750896001600160a01b0316816001600160a01b0316145b6107dc5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104c9565b6107e78a8a8a61081e565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166108805760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104c9565b6001600160a01b0382166108e15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104c9565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600061094f84846107f3565b905060001981146109b757818110156109aa5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104c9565b6109b7848484840361081e565b50505050565b6001600160a01b038316610a215760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104c9565b6001600160a01b038216610a835760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104c9565b6001600160a01b03831660009081526020819052604090205481811015610afb5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104c9565b6001600160a01b0384811660008181526020818152604080832087870390559387168083529184902080548701905592518581529092600080516020611013833981519152910160405180910390a36109b7565b6000600080516020611053833981519152610b68610333565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c3f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104c9565b8060026000828254610c519190610f96565b90915550506001600160a01b03821660008181526020818152604080832080548601905551848152600080516020611013833981519152910160405180910390a35050565b6001600160a01b038216610cf65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104c9565b6001600160a01b03821660009081526020819052604090205481811015610d6a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104c9565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192916000805160206110138339815191529101610936565b600060208083528351808285015260005b81811015610ddb57858101830151858201604001528201610dbf565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610e1357600080fd5b919050565b60008060408385031215610e2b57600080fd5b610e3483610dfc565b946020939093013593505050565b600080600060608486031215610e5757600080fd5b610e6084610dfc565b9250610e6e60208501610dfc565b9150604084013590509250925092565b600060208284031215610e9057600080fd5b610e9982610dfc565b9392505050565b600080600080600080600060e0888a031215610ebb57600080fd5b610ec488610dfc565b9650610ed260208901610dfc565b95506040880135945060608801359350608088013560ff81168114610ef657600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f2657600080fd5b610f2f83610dfc565b9150610f3d60208401610dfc565b90509250929050565b600181811c90821680610f5a57607f821691505b602082108103610f7a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156103d9576103d9610f80565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b60006001820161100b5761100b610f80565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa26469706673582212203ea4a1224be7b5ef35dc397dfc81433d85cd6fdbf17d8b2e3d528071e7e612b564736f6c63430008140033", + "bytecode": "0x6101006040523480156200001257600080fd5b50604051620019fa380380620019fa83398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161153e620004bc6000396000610237015260008181610307015281816105c0015261068d0152600061053a0152600081816103790152610504015261153e6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b6040516101919190611278565b60405180910390f35b6101ad6101a836600461130d565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad610204366004611337565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad61027736600461130d565b61055c565b61028f61028a36600461130d565b6105a8565b005b6101c161029f366004611373565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d5366004611373565b60056020526000908152604090205481565b610184610666565b61028f6102fd36600461130d565b610675565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c36600461130d565b61072a565b6101ad61036f36600461130d565b6107e1565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611395565b6107ef565b6101c16103bc366004611408565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f9061143b565b80601f016020809104026020016040519081016040528092919081815260200182805461046b9061143b565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610af1565b60019150505b92915050565b6000336104ea858285610c71565b6104f5858585610d2e565b506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146105375761053246610f4f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a39087906114bd565b610af1565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106585760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106628282611017565b5050565b60606004805461043f9061143b565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146107205760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d42726964676500000000000000000000000000000000606482015260840161064f565b61066282826110f0565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107d45760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161064f565b6104f58286868403610af1565b6000336104d0818585610d2e565b834211156108645760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d697400000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866108be836114d0565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610929610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156109ed573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610a6857508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610ada5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e617475726500000000000000000000000000000000000000000000000000606482015260840161064f565b610ae58a8a8a610af1565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610b795760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8216610c025760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d285781811015610d1b5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161064f565b610d288484848403610af1565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610db75760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8216610e405760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610edc5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610d28565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610f7a610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff821661107a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161064f565b806002600082825461108c91906114bd565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166111795760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156112155760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610c64565b600060208083528351808285015260005b818110156112a557858101830151858201604001528201611289565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461130857600080fd5b919050565b6000806040838503121561132057600080fd5b611329836112e4565b946020939093013593505050565b60008060006060848603121561134c57600080fd5b611355846112e4565b9250611363602085016112e4565b9150604084013590509250925092565b60006020828403121561138557600080fd5b61138e826112e4565b9392505050565b600080600080600080600060e0888a0312156113b057600080fd5b6113b9886112e4565b96506113c7602089016112e4565b95506040880135945060608801359350608088013560ff811681146113eb57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561141b57600080fd5b611424836112e4565b9150611432602084016112e4565b90509250929050565b600181811c9082168061144f57607f821691505b602082108103611488577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d661148e565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036115015761150161148e565b506001019056fea2646970667358221220b49a146f369750b7055c494881ee723d063a73d92e8391e12d74eceb27ca91ef64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b6040516101919190611278565b60405180910390f35b6101ad6101a836600461130d565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad610204366004611337565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad61027736600461130d565b61055c565b61028f61028a36600461130d565b6105a8565b005b6101c161029f366004611373565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d5366004611373565b60056020526000908152604090205481565b610184610666565b61028f6102fd36600461130d565b610675565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c36600461130d565b61072a565b6101ad61036f36600461130d565b6107e1565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611395565b6107ef565b6101c16103bc366004611408565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f9061143b565b80601f016020809104026020016040519081016040528092919081815260200182805461046b9061143b565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610af1565b60019150505b92915050565b6000336104ea858285610c71565b6104f5858585610d2e565b506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146105375761053246610f4f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a39087906114bd565b610af1565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106585760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106628282611017565b5050565b60606004805461043f9061143b565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146107205760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d42726964676500000000000000000000000000000000606482015260840161064f565b61066282826110f0565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107d45760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161064f565b6104f58286868403610af1565b6000336104d0818585610d2e565b834211156108645760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d697400000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866108be836114d0565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610929610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156109ed573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610a6857508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610ada5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e617475726500000000000000000000000000000000000000000000000000606482015260840161064f565b610ae58a8a8a610af1565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610b795760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8216610c025760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d285781811015610d1b5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161064f565b610d288484848403610af1565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610db75760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8216610e405760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610edc5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610d28565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610f7a610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff821661107a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161064f565b806002600082825461108c91906114bd565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166111795760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156112155760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161064f565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610c64565b600060208083528351808285015260005b818110156112a557858101830151858201604001528201611289565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461130857600080fd5b919050565b6000806040838503121561132057600080fd5b611329836112e4565b946020939093013593505050565b60008060006060848603121561134c57600080fd5b611355846112e4565b9250611363602085016112e4565b9150604084013590509250925092565b60006020828403121561138557600080fd5b61138e826112e4565b9392505050565b600080600080600080600060e0888a0312156113b057600080fd5b6113b9886112e4565b96506113c7602089016112e4565b95506040880135945060608801359350608088013560ff811681146113eb57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561141b57600080fd5b611424836112e4565b9150611432602084016112e4565b90509250929050565b600181811c9082168061144f57607f821691505b602082108103611488577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d661148e565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036115015761150161148e565b506001019056fea2646970667358221220b49a146f369750b7055c494881ee723d063a73d92e8391e12d74eceb27ca91ef64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/TransparentUpgradeableProxy.json b/compiled-contracts/paris/TransparentUpgradeableProxy.json index 39efac44d..e65330111 100644 --- a/compiled-contracts/paris/TransparentUpgradeableProxy.json +++ b/compiled-contracts/paris/TransparentUpgradeableProxy.json @@ -148,8 +148,8 @@ "type": "receive" } ], - "bytecode": "0x608060405260405162000dd138038062000dd1833981016040819052620000269162000424565b828162000036828260006200004d565b50620000449050826200007f565b50505062000557565b6200005883620000f1565b600082511180620000665750805b156200007a5762000078838362000133565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620000c160008051602062000d8a833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620000ee8162000162565b50565b620000fc8162000200565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200015b838360405180606001604052806027815260200162000daa6027913962000297565b9392505050565b6001600160a01b038116620001cd5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b8060008051602062000d8a8339815191525b80546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b0381163b6200026f5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401620001c4565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc620001df565b6060600080856001600160a01b031685604051620002b6919062000504565b600060405180830381855af49150503d8060008114620002f3576040519150601f19603f3d011682016040523d82523d6000602084013e620002f8565b606091505b5090925090506200030c8683838762000316565b9695505050505050565b606083156200038a57825160000362000382576001600160a01b0385163b620003825760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620001c4565b508162000396565b6200039683836200039e565b949350505050565b815115620003af5781518083602001fd5b8060405162461bcd60e51b8152600401620001c4919062000522565b80516001600160a01b0381168114620003e357600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200041b57818101518382015260200162000401565b50506000910152565b6000806000606084860312156200043a57600080fd5b6200044584620003cb565b92506200045560208501620003cb565b60408501519092506001600160401b03808211156200047357600080fd5b818601915086601f8301126200048857600080fd5b8151818111156200049d576200049d620003e8565b604051601f8201601f19908116603f01168101908382118183101715620004c857620004c8620003e8565b81604052828152896020848701011115620004e257600080fd5b620004f5836020830160208801620003fe565b80955050505050509250925092565b6000825162000518818460208701620003fe565b9190910192915050565b602081526000825180602084015262000543816040850160208701620003fe565b601f01601f19169190910160400192915050565b61082380620005676000396000f3fe60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b610080366004610676565b610118565b61005b610093366004610691565b610155565b3480156100a457600080fd5b506100ad6101bc565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e4366004610676565b6101ed565b3480156100f557600080fd5b506100ad61020d565b61010661022e565b6101166101116102c3565b6102cd565b565b6101206102f1565b6001600160a01b0316330361014d5761014a81604051806020016040528060008152506000610312565b50565b61014a6100fe565b61015d6102f1565b6001600160a01b031633036101b4576101af8383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250610312915050565b505050565b6101af6100fe565b60006101c66102f1565b6001600160a01b031633036101e2576101dd6102c3565b905090565b6101ea6100fe565b90565b6101f56102f1565b6001600160a01b0316330361014d5761014a8161033d565b60006102176102f1565b6001600160a01b031633036101e2576101dd6102f1565b6102366102f1565b6001600160a01b031633036101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101dd610391565b3660008037600080366000845af43d6000803e8080156102ec573d6000f35b3d6000fd5b60006000805160206107878339815191525b546001600160a01b0316919050565b61031b836103a7565b6000825111806103285750805b156101af5761033783836103e7565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103666102f1565b604080516001600160a01b03928316815291841660208301520160405180910390a161014a81610413565b60006000805160206107a7833981519152610303565b6103b0816104aa565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606061040c83836040518060600160405280602781526020016107c76027913961052a565b9392505050565b6001600160a01b0381166104785760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084016102ba565b806000805160206107878339815191525b80546001600160a01b0319166001600160a01b039290921691909117905550565b6104b3816105a2565b6105155760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016102ba565b806000805160206107a7833981519152610489565b6060600080856001600160a01b0316856040516105479190610737565b600060405180830381855af49150503d8060008114610582576040519150601f19603f3d011682016040523d82523d6000602084013e610587565b606091505b5091509150610598868383876105b1565b9695505050505050565b6001600160a01b03163b151590565b6060831561061e578251600003610617576105cb856105a2565b6106175760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102ba565b5081610628565b6106288383610630565b949350505050565b8151156106405781518083602001fd5b8060405162461bcd60e51b81526004016102ba9190610753565b80356001600160a01b038116811461067157600080fd5b919050565b60006020828403121561068857600080fd5b61040c8261065a565b6000806000604084860312156106a657600080fd5b6106af8461065a565b925060208401356001600160401b03808211156106cb57600080fd5b818601915086601f8301126106df57600080fd5b8135818111156106ee57600080fd5b87602082850101111561070057600080fd5b6020830194508093505050509250925092565b60005b8381101561072e578181015183820152602001610716565b50506000910152565b60008251610749818460208701610713565b9190910192915050565b6020815260008251806020840152610772816040850160208701610713565b601f01601f1916919091016040019291505056feb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212204611e4661d0b7e6d19a32536f89d63b6655727e934603a4010d4fad7be26919b64736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", - "deployedBytecode": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b610080366004610676565b610118565b61005b610093366004610691565b610155565b3480156100a457600080fd5b506100ad6101bc565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e4366004610676565b6101ed565b3480156100f557600080fd5b506100ad61020d565b61010661022e565b6101166101116102c3565b6102cd565b565b6101206102f1565b6001600160a01b0316330361014d5761014a81604051806020016040528060008152506000610312565b50565b61014a6100fe565b61015d6102f1565b6001600160a01b031633036101b4576101af8383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250610312915050565b505050565b6101af6100fe565b60006101c66102f1565b6001600160a01b031633036101e2576101dd6102c3565b905090565b6101ea6100fe565b90565b6101f56102f1565b6001600160a01b0316330361014d5761014a8161033d565b60006102176102f1565b6001600160a01b031633036101e2576101dd6102f1565b6102366102f1565b6001600160a01b031633036101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101dd610391565b3660008037600080366000845af43d6000803e8080156102ec573d6000f35b3d6000fd5b60006000805160206107878339815191525b546001600160a01b0316919050565b61031b836103a7565b6000825111806103285750805b156101af5761033783836103e7565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103666102f1565b604080516001600160a01b03928316815291841660208301520160405180910390a161014a81610413565b60006000805160206107a7833981519152610303565b6103b0816104aa565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606061040c83836040518060600160405280602781526020016107c76027913961052a565b9392505050565b6001600160a01b0381166104785760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084016102ba565b806000805160206107878339815191525b80546001600160a01b0319166001600160a01b039290921691909117905550565b6104b3816105a2565b6105155760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016102ba565b806000805160206107a7833981519152610489565b6060600080856001600160a01b0316856040516105479190610737565b600060405180830381855af49150503d8060008114610582576040519150601f19603f3d011682016040523d82523d6000602084013e610587565b606091505b5091509150610598868383876105b1565b9695505050505050565b6001600160a01b03163b151590565b6060831561061e578251600003610617576105cb856105a2565b6106175760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102ba565b5081610628565b6106288383610630565b949350505050565b8151156106405781518083602001fd5b8060405162461bcd60e51b81526004016102ba9190610753565b80356001600160a01b038116811461067157600080fd5b919050565b60006020828403121561068857600080fd5b61040c8261065a565b6000806000604084860312156106a657600080fd5b6106af8461065a565b925060208401356001600160401b03808211156106cb57600080fd5b818601915086601f8301126106df57600080fd5b8135818111156106ee57600080fd5b87602082850101111561070057600080fd5b6020830194508093505050509250925092565b60005b8381101561072e578181015183820152602001610716565b50506000910152565b60008251610749818460208701610713565b9190910192915050565b6020815260008251806020840152610772816040850160208701610713565b601f01601f1916919091016040019291505056feb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212204611e4661d0b7e6d19a32536f89d63b6655727e934603a4010d4fad7be26919b64736f6c63430008140033", + "bytecode": "0x608060405260405162000fa938038062000fa9833981016040819052620000269162000424565b828162000036828260006200004d565b50620000449050826200007f565b50505062000557565b6200005883620000f1565b600082511180620000665750805b156200007a5762000078838362000133565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620000c160008051602062000f62833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620000ee8162000162565b50565b620000fc8162000200565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200015b838360405180606001604052806027815260200162000f826027913962000297565b9392505050565b6001600160a01b038116620001cd5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b8060008051602062000f628339815191525b80546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b0381163b6200026f5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401620001c4565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc620001df565b6060600080856001600160a01b031685604051620002b6919062000504565b600060405180830381855af49150503d8060008114620002f3576040519150601f19603f3d011682016040523d82523d6000602084013e620002f8565b606091505b5090925090506200030c8683838762000316565b9695505050505050565b606083156200038a57825160000362000382576001600160a01b0385163b620003825760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620001c4565b508162000396565b6200039683836200039e565b949350505050565b815115620003af5781518083602001fd5b8060405162461bcd60e51b8152600401620001c4919062000522565b80516001600160a01b0381168114620003e357600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200041b57818101518382015260200162000401565b50506000910152565b6000806000606084860312156200043a57600080fd5b6200044584620003cb565b92506200045560208501620003cb565b60408501519092506001600160401b03808211156200047357600080fd5b818601915086601f8301126200048857600080fd5b8151818111156200049d576200049d620003e8565b604051601f8201601f19908116603f01168101908382118183101715620004c857620004c8620003e8565b81604052828152896020848701011115620004e257600080fd5b620004f5836020830160208801620003fe565b80955050505050509250925092565b6000825162000518818460208701620003fe565b9190910192915050565b602081526000825180602084015262000543816040850160208701620003fe565b601f01601f19169190910160400192915050565b6109fb80620005676000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100a85780638f283970146100e6578063f851a440146101065761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61011b565b005b61006b61011b565b34801561008157600080fd5b5061006b61009036600461086f565b610135565b61006b6100a336600461088a565b61017f565b3480156100b457600080fd5b506100bd6101f3565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b5061006b61010136600461086f565b610231565b34801561011257600080fd5b506100bd61025e565b61012361028c565b61013361012e610363565b61036d565b565b61013d610391565b73ffffffffffffffffffffffffffffffffffffffff16330361017757610174816040518060200160405280600081525060006103d1565b50565b61017461011b565b610187610391565b73ffffffffffffffffffffffffffffffffffffffff1633036101eb576101e68383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250600192506103d1915050565b505050565b6101e661011b565b60006101fd610391565b73ffffffffffffffffffffffffffffffffffffffff16330361022657610221610363565b905090565b61022e61011b565b90565b610239610391565b73ffffffffffffffffffffffffffffffffffffffff16330361017757610174816103fc565b6000610268610391565b73ffffffffffffffffffffffffffffffffffffffff16330361022657610221610391565b610294610391565b73ffffffffffffffffffffffffffffffffffffffff163303610133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600061022161045d565b3660008037600080366000845af43d6000803e80801561038c573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b6103da83610485565b6000825111806103e75750805b156101e6576103f683836104d2565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f610425610391565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a1610174816104fe565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103b5565b61048e8161060a565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606104f7838360405180606001604052806027815260200161099f602791396106d5565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81166105a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035a565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b73ffffffffffffffffffffffffffffffffffffffff81163b6106ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e747261637400000000000000000000000000000000000000606482015260840161035a565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105c4565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516106ff9190610931565b600060405180830381855af49150503d806000811461073a576040519150601f19603f3d011682016040523d82523d6000602084013e61073f565b606091505b50915091506107508683838761075a565b9695505050505050565b606083156107f05782516000036107e95773ffffffffffffffffffffffffffffffffffffffff85163b6107e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161035a565b50816107fa565b6107fa8383610802565b949350505050565b8151156108125781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035a919061094d565b803573ffffffffffffffffffffffffffffffffffffffff8116811461086a57600080fd5b919050565b60006020828403121561088157600080fd5b6104f782610846565b60008060006040848603121561089f57600080fd5b6108a884610846565b9250602084013567ffffffffffffffff808211156108c557600080fd5b818601915086601f8301126108d957600080fd5b8135818111156108e857600080fd5b8760208285010111156108fa57600080fd5b6020830194508093505050509250925092565b60005b83811015610928578181015183820152602001610910565b50506000910152565b6000825161094381846020870161090d565b9190910192915050565b602081526000825180602084015261096c81604085016020870161090d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220701a0c26bdd76686e63fc3c65e4f28a20ba3ecc8a60246733c0627e679c9804e64736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "deployedBytecode": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100a85780638f283970146100e6578063f851a440146101065761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61011b565b005b61006b61011b565b34801561008157600080fd5b5061006b61009036600461086f565b610135565b61006b6100a336600461088a565b61017f565b3480156100b457600080fd5b506100bd6101f3565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b5061006b61010136600461086f565b610231565b34801561011257600080fd5b506100bd61025e565b61012361028c565b61013361012e610363565b61036d565b565b61013d610391565b73ffffffffffffffffffffffffffffffffffffffff16330361017757610174816040518060200160405280600081525060006103d1565b50565b61017461011b565b610187610391565b73ffffffffffffffffffffffffffffffffffffffff1633036101eb576101e68383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250600192506103d1915050565b505050565b6101e661011b565b60006101fd610391565b73ffffffffffffffffffffffffffffffffffffffff16330361022657610221610363565b905090565b61022e61011b565b90565b610239610391565b73ffffffffffffffffffffffffffffffffffffffff16330361017757610174816103fc565b6000610268610391565b73ffffffffffffffffffffffffffffffffffffffff16330361022657610221610391565b610294610391565b73ffffffffffffffffffffffffffffffffffffffff163303610133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600061022161045d565b3660008037600080366000845af43d6000803e80801561038c573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b6103da83610485565b6000825111806103e75750805b156101e6576103f683836104d2565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f610425610391565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a1610174816104fe565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103b5565b61048e8161060a565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606104f7838360405180606001604052806027815260200161099f602791396106d5565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81166105a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035a565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b73ffffffffffffffffffffffffffffffffffffffff81163b6106ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e747261637400000000000000000000000000000000000000606482015260840161035a565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105c4565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516106ff9190610931565b600060405180830381855af49150503d806000811461073a576040519150601f19603f3d011682016040523d82523d6000602084013e61073f565b606091505b50915091506107508683838761075a565b9695505050505050565b606083156107f05782516000036107e95773ffffffffffffffffffffffffffffffffffffffff85163b6107e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161035a565b50816107fa565b6107fa8383610802565b949350505050565b8151156108125781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035a919061094d565b803573ffffffffffffffffffffffffffffffffffffffff8116811461086a57600080fd5b919050565b60006020828403121561088157600080fd5b6104f782610846565b60008060006040848603121561089f57600080fd5b6108a884610846565b9250602084013567ffffffffffffffff808211156108c557600080fd5b818601915086601f8301126108d957600080fd5b8135818111156108e857600080fd5b8760208285010111156108fa57600080fd5b6020830194508093505050509250925092565b60005b83811015610928578181015183820152602001610910565b50506000910152565b6000825161094381846020870161090d565b9190910192915050565b602081526000825180602084015261096c81604085016020870161090d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220701a0c26bdd76686e63fc3c65e4f28a20ba3ecc8a60246733c0627e679c9804e64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/VerifierRollupHelperMock.json b/compiled-contracts/paris/VerifierRollupHelperMock.json index a1fb7d9d9..b2751e2b5 100644 --- a/compiled-contracts/paris/VerifierRollupHelperMock.json +++ b/compiled-contracts/paris/VerifierRollupHelperMock.json @@ -28,8 +28,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b5061012f806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80639121da8a14602d575b600080fd5b60406038366004606a565b600192915050565b604051901515815260200160405180910390f35b634e487b7160e01b600052604160045260246000fd5b600080610320808486031215607e57600080fd5b610300840185811115608f57600080fd5b8493508561031f86011260a157600080fd5b60405160208082016001600160401b038111838210171560c15760c16054565b60405292860192818885111560d557600080fd5b5b8484101560eb578335815292810192810160d6565b50949790965094505050505056fea2646970667358221220eae069d9292a35e5648287b4bd0bd5158ca024d1280777f564829b21961eda4664736f6c63430008140033", - "deployedBytecode": "0x6080604052348015600f57600080fd5b506004361060285760003560e01c80639121da8a14602d575b600080fd5b60406038366004606a565b600192915050565b604051901515815260200160405180910390f35b634e487b7160e01b600052604160045260246000fd5b600080610320808486031215607e57600080fd5b610300840185811115608f57600080fd5b8493508561031f86011260a157600080fd5b60405160208082016001600160401b038111838210171560c15760c16054565b60405292860192818885111560d557600080fd5b5b8484101560eb578335815292810192810160d6565b50949790965094505050505056fea2646970667358221220eae069d9292a35e5648287b4bd0bd5158ca024d1280777f564829b21961eda4664736f6c63430008140033", + "bytecode": "0x608060405234801561001057600080fd5b50610158806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80639121da8a14610030575b600080fd5b61004661003e366004610089565b600192915050565b604051901515815260200160405180910390f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008061032080848603121561009e57600080fd5b6103008401858111156100b057600080fd5b8493508561031f8601126100c357600080fd5b604051602080820182811067ffffffffffffffff821117156100e7576100e761005a565b6040529286019281888511156100fc57600080fd5b5b8484101561011457833581529281019281016100fd565b50949790965094505050505056fea264697066735822122061fd8311ce6da82f24c0874a992ea14a8aaf711e353693cae56066e3223abc5a64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80639121da8a14610030575b600080fd5b61004661003e366004610089565b600192915050565b604051901515815260200160405180910390f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008061032080848603121561009e57600080fd5b6103008401858111156100b057600080fd5b8493508561031f8601126100c357600080fd5b604051602080820182811067ffffffffffffffff821117156100e7576100e761005a565b6040529286019281888511156100fc57600080fd5b5b8484101561011457833581529281019281016100fd565b50949790965094505050505056fea264697066735822122061fd8311ce6da82f24c0874a992ea14a8aaf711e353693cae56066e3223abc5a64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/deployment/v2/verifyContracts.js b/deployment/v2/verifyContracts.js index 57367a6d8..2112c6454 100644 --- a/deployment/v2/verifyContracts.js +++ b/deployment/v2/verifyContracts.js @@ -3,7 +3,7 @@ require('dotenv').config(); const path = require('path'); const hre = require('hardhat'); const { expect } = require('chai'); -const { ethers } = require('hardhat'); +const { ethers, upgrades } = require('hardhat'); const pathDeployOutputParameters = path.join(__dirname, './deploy_output.json'); const pathDeployParameters = path.join(__dirname, './deploy_parameters.json'); @@ -17,9 +17,9 @@ async function main() { } // verify maticToken - const polTokenName = "Pol Token"; - const polTokenSymbol = "POL"; - const polTokenInitialBalance = ethers.parseEther("20000000"); + const polTokenName = 'Pol Token'; + const polTokenSymbol = 'POL'; + const polTokenInitialBalance = ethers.parseEther('20000000'); try { // verify governance @@ -120,20 +120,19 @@ async function main() { await hre.run( 'verify:verify', { - contract: "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol:TransparentUpgradeableProxy", + contract: '@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol:TransparentUpgradeableProxy', address: deployOutputParameters.polygonZkEVMBridgeAddress, constructorArguments: [ await upgrades.erc1967.getImplementationAddress(deployOutputParameters.polygonZkEVMBridgeAddress), await upgrades.erc1967.getAdminAddress(deployOutputParameters.polygonZkEVMBridgeAddress), - "0x" - ] + '0x', + ], }, ); } catch (error) { - //expect(error.message.toLowerCase().includes('proxyadmin')).to.be.equal(true); + // expect(error.message.toLowerCase().includes('proxyadmin')).to.be.equal(true); } - try { await hre.run( 'verify:verify', @@ -142,44 +141,43 @@ async function main() { }, ); } catch (error) { - //expect(error.message.toLowerCase().includes('proxyadmin')).to.be.equal(true); + // expect(error.message.toLowerCase().includes('proxyadmin')).to.be.equal(true); } try { await hre.run( 'verify:verify', { - contract: "contracts/v2/lib/PolygonTransparentProxy.sol:PolygonTransparentProxy", + contract: 'contracts/v2/lib/PolygonTransparentProxy.sol:PolygonTransparentProxy', address: deployOutputParameters.newZKEVMAddress, constructorArguments: [ await upgrades.erc1967.getImplementationAddress(deployOutputParameters.newZKEVMAddress), await upgrades.erc1967.getAdminAddress(deployOutputParameters.newZKEVMAddress), - "0x" - ] + '0x', + ], }, ); } catch (error) { - //expect(error.message.toLowerCase().includes('proxyadmin')).to.be.equal(true); + // expect(error.message.toLowerCase().includes('proxyadmin')).to.be.equal(true); } - // verify zkEVM address try { await hre.run( 'verify:verify', { - contract: "contracts/v2/consensus/zkEVM/PolygonZkEVMV2.sol:PolygonZkEVMV2", + contract: 'contracts/v2/consensus/zkEVM/PolygonZkEVMV2.sol:PolygonZkEVMV2', address: deployOutputParameters.newZKEVMAddress, constructorArguments: [ deployOutputParameters.polygonZkEVMGlobalExitRootAddress, deployOutputParameters.polTokenAddress, deployOutputParameters.polygonZkEVMBridgeAddress, - deployOutputParameters.polygonRollupManager + deployOutputParameters.polygonRollupManager, ], }, ); } catch (error) { - //expect(error.message.toLowerCase().includes('proxyadmin')).to.be.equal(true); + // expect(error.message.toLowerCase().includes('proxyadmin')).to.be.equal(true); } } diff --git a/docker/scripts/fund-accounts.js b/docker/scripts/fund-accounts.js index adce4d2d0..5c361bdcb 100644 --- a/docker/scripts/fund-accounts.js +++ b/docker/scripts/fund-accounts.js @@ -16,8 +16,8 @@ async function main() { const pathWallet = `m/44'/60'/0'/0/${i}`; const accountWallet = ethers.HDNodeWallet.fromMnemonic( ethers.Mnemonic.fromPhrase(MNEMONIC), - pathWallet - ) + pathWallet, + ); const params = [{ from: await signerNode.getAddress(), diff --git a/package.json b/package.json index 3be883b78..d76039bf8 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "scripts": { "saveDeployment:goerli": "mkdir -p deployments/goerli_$(date +%s) && cp -r deployment/v2/deploy_*.json deployments/goerli_$(date +%s) && cp .openzeppelin/goerli.json deployments/goerli_$(date +%s) && cp deployment/v2/genesis.json deployments/goerli_$(date +%s)", "saveDeployment:mainnet": "mkdir -p deployments/mainnet_$(date +%s) && cp -r deployment/v2/deploy_*.json deployments/mainnet_$(date +%s) && cp .openzeppelin/mainnet.json deployments/mainnet_$(date +%s) && cp deployment/v2/genesis.json deployments/mainnet_$(date +%s)", - "test": "npx hardhat test test/contracts/**.test.js", + "test": "npx hardhat test test/contractsv2/*ts", "docgen": "npx solidity-docgen --solc-module solc-0.8 -t ./docs/templates -e ./contracts/verifiers,./contracts/mocks", "prepare:testnet:ZkEVM:localhost": "npx hardhat run deployment/testnet/prepareTestnet.ts --network localhost", "deploy:ZkEVM:localhost": "rm -f .openzeppelin/unknown-31337.json && node deployment/1_createGenesis.js && npx hardhat run deployment/2_deployPolygonZKEVMDeployer.js --network localhost && npx hardhat run deployment/3_deployContracts.js --network localhost", From 4065b306449ad222f44f32f6faa7b0b2941fe780 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 21 Nov 2023 14:27:44 +0100 Subject: [PATCH 097/230] update l1infotree event --- .../paris/PolygonZkEVMGlobalExitRootV2.json | 6 +++--- contracts/v2/PolygonZkEVMGlobalExitRootV2.sol | 4 ++-- deployment/v2/3_deployContracts.ts | 2 ++ deployment/v2/4_createRollup.ts | 12 +++++++++--- test/contractsv2/PolygonGlobalExitRootV2.test.ts | 4 ++-- test/contractsv2/PolygonRollupManager.test.ts | 10 +++++----- test/contractsv2/PolygonRollupManagerUpgrade.test.ts | 4 ++-- 7 files changed, 25 insertions(+), 17 deletions(-) diff --git a/compiled-contracts/paris/PolygonZkEVMGlobalExitRootV2.json b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootV2.json index 70537899a..e434c1983 100644 --- a/compiled-contracts/paris/PolygonZkEVMGlobalExitRootV2.json +++ b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootV2.json @@ -45,7 +45,7 @@ "type": "bytes32" } ], - "name": "UpdateGlobalExitRoot", + "name": "UpdateL1InfoTree", "type": "event" }, { @@ -264,8 +264,8 @@ "type": "function" } ], - "bytecode": "0x60c060405234801561001057600080fd5b50604051610b37380380610b3783398101604081905261002f91610062565b6001600160a01b0391821660a05216608052610095565b80516001600160a01b038116811461005d57600080fd5b919050565b6000806040838503121561007557600080fd5b61007e83610046565b915061008c60208401610046565b90509250929050565b60805160a051610a6f6100c86000396000818161014901526102c3015260008181610218015261027a0152610a6f6000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c806349b7b8021161008157806383f244031161005b57806383f2440314610200578063a3c573eb14610213578063fb5708341461023a57600080fd5b806349b7b802146101445780635ca1e165146101905780635d8105011461019857600080fd5b8063319cf735116100b2578063319cf7351461011e57806333d6247d146101275780633ed691ef1461013c57600080fd5b806301fd9044146100d9578063257b3632146100f55780632dfdf0b514610115575b600080fd5b6100e260005481565b6040519081526020015b60405180910390f35b6100e261010336600461071d565b60026020526000908152604090205481565b6100e260235481565b6100e260015481565b61013a61013536600461071d565b61025d565b005b6100e2610401565b61016b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ec565b6100e2610416565b6100e26101a6366004610736565b604080516020808201959095528082019390935260c09190911b7fffffffffffffffff0000000000000000000000000000000000000000000000001660608301528051604881840301815260689092019052805191012090565b6100e261020e3660046107a7565b610420565b61016b7f000000000000000000000000000000000000000000000000000000000000000081565b61024d6102483660046107e6565b6104f6565b60405190151581526020016100ec565b60005460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102ac5750600182905581610328565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102f6576000839055829150610328565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610334828461050e565b600081815260026020526040812054919250036103fb57600061035860014361085d565b60008381526002602090815260409182902092409283905581518082018690528083018490527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b16606082015282518082036048018152606890910190925281519101209091506103cc9061053d565b604051849084907f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce390600090a3505b50505050565b600061041160015460005461050e565b905090565b6000610411610640565b600083815b60208110156104ed57600163ffffffff8516821c811690036104905784816020811061045357610453610870565b602002013582604051602001610473929190918252602082015260400190565b6040516020818303038152906040528051906020012091506104db565b818582602081106104a3576104a3610870565b60200201356040516020016104c2929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806104e58161089f565b915050610425565b50949350505050565b600081610504868686610420565b1495945050505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b80600161054c602060026109f7565b610556919061085d565b60235410610590576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006023600081546105a19061089f565b9182905550905060005b6020811015610632578082901c6001166001036105de5782600382602081106105d6576105d6610870565b015550505050565b600381602081106105f1576105f1610870565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061062a9061089f565b9150506105ab565b5061063b610a0a565b505050565b602354600090819081805b6020811015610714578083901c6001166001036106a8576003816020811061067557610675610870565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506106d5565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b6040805160208101849052908101839052606001604051602081830303815290604052805190602001209150808061070c9061089f565b91505061064b565b50919392505050565b60006020828403121561072f57600080fd5b5035919050565b60008060006060848603121561074b57600080fd5b8335925060208401359150604084013567ffffffffffffffff8116811461077157600080fd5b809150509250925092565b80610400810183101561053757600080fd5b803563ffffffff811681146107a257600080fd5b919050565b600080600061044084860312156107bd57600080fd5b833592506107ce856020860161077c565b91506107dd610420850161078e565b90509250925092565b60008060008061046085870312156107fd57600080fd5b8435935061080e866020870161077c565b925061081d610420860161078e565b939692955092936104400135925050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156105375761053761082e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036108d0576108d061082e565b5060010190565b600181815b8085111561093057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109165761091661082e565b8085161561092357918102915b93841c93908002906108dc565b509250929050565b60008261094757506001610537565b8161095457506000610537565b816001811461096a576002811461097457610990565b6001915050610537565b60ff8411156109855761098561082e565b50506001821b610537565b5060208310610133831016604e8410600b84101617156109b3575081810a610537565b6109bd83836108d7565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109ef576109ef61082e565b029392505050565b6000610a038383610938565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea2646970667358221220f03e29cac1092312a36b9402019fbb0207a83327631502bd03c8b858247c9c1e64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100d45760003560e01c806349b7b8021161008157806383f244031161005b57806383f2440314610200578063a3c573eb14610213578063fb5708341461023a57600080fd5b806349b7b802146101445780635ca1e165146101905780635d8105011461019857600080fd5b8063319cf735116100b2578063319cf7351461011e57806333d6247d146101275780633ed691ef1461013c57600080fd5b806301fd9044146100d9578063257b3632146100f55780632dfdf0b514610115575b600080fd5b6100e260005481565b6040519081526020015b60405180910390f35b6100e261010336600461071d565b60026020526000908152604090205481565b6100e260235481565b6100e260015481565b61013a61013536600461071d565b61025d565b005b6100e2610401565b61016b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ec565b6100e2610416565b6100e26101a6366004610736565b604080516020808201959095528082019390935260c09190911b7fffffffffffffffff0000000000000000000000000000000000000000000000001660608301528051604881840301815260689092019052805191012090565b6100e261020e3660046107a7565b610420565b61016b7f000000000000000000000000000000000000000000000000000000000000000081565b61024d6102483660046107e6565b6104f6565b60405190151581526020016100ec565b60005460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102ac5750600182905581610328565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102f6576000839055829150610328565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610334828461050e565b600081815260026020526040812054919250036103fb57600061035860014361085d565b60008381526002602090815260409182902092409283905581518082018690528083018490527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b16606082015282518082036048018152606890910190925281519101209091506103cc9061053d565b604051849084907f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce390600090a3505b50505050565b600061041160015460005461050e565b905090565b6000610411610640565b600083815b60208110156104ed57600163ffffffff8516821c811690036104905784816020811061045357610453610870565b602002013582604051602001610473929190918252602082015260400190565b6040516020818303038152906040528051906020012091506104db565b818582602081106104a3576104a3610870565b60200201356040516020016104c2929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806104e58161089f565b915050610425565b50949350505050565b600081610504868686610420565b1495945050505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b80600161054c602060026109f7565b610556919061085d565b60235410610590576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006023600081546105a19061089f565b9182905550905060005b6020811015610632578082901c6001166001036105de5782600382602081106105d6576105d6610870565b015550505050565b600381602081106105f1576105f1610870565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061062a9061089f565b9150506105ab565b5061063b610a0a565b505050565b602354600090819081805b6020811015610714578083901c6001166001036106a8576003816020811061067557610675610870565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506106d5565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b6040805160208101849052908101839052606001604051602081830303815290604052805190602001209150808061070c9061089f565b91505061064b565b50919392505050565b60006020828403121561072f57600080fd5b5035919050565b60008060006060848603121561074b57600080fd5b8335925060208401359150604084013567ffffffffffffffff8116811461077157600080fd5b809150509250925092565b80610400810183101561053757600080fd5b803563ffffffff811681146107a257600080fd5b919050565b600080600061044084860312156107bd57600080fd5b833592506107ce856020860161077c565b91506107dd610420850161078e565b90509250925092565b60008060008061046085870312156107fd57600080fd5b8435935061080e866020870161077c565b925061081d610420860161078e565b939692955092936104400135925050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156105375761053761082e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036108d0576108d061082e565b5060010190565b600181815b8085111561093057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109165761091661082e565b8085161561092357918102915b93841c93908002906108dc565b509250929050565b60008261094757506001610537565b8161095457506000610537565b816001811461096a576002811461097457610990565b6001915050610537565b60ff8411156109855761098561082e565b50506001821b610537565b5060208310610133831016604e8410600b84101617156109b3575081810a610537565b6109bd83836108d7565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109ef576109ef61082e565b029392505050565b6000610a038383610938565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea2646970667358221220f03e29cac1092312a36b9402019fbb0207a83327631502bd03c8b858247c9c1e64736f6c63430008140033", + "bytecode": "0x60c060405234801561001057600080fd5b50604051610b37380380610b3783398101604081905261002f91610062565b6001600160a01b0391821660a05216608052610095565b80516001600160a01b038116811461005d57600080fd5b919050565b6000806040838503121561007557600080fd5b61007e83610046565b915061008c60208401610046565b90509250929050565b60805160a051610a6f6100c86000396000818161014901526102c3015260008181610218015261027a0152610a6f6000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c806349b7b8021161008157806383f244031161005b57806383f2440314610200578063a3c573eb14610213578063fb5708341461023a57600080fd5b806349b7b802146101445780635ca1e165146101905780635d8105011461019857600080fd5b8063319cf735116100b2578063319cf7351461011e57806333d6247d146101275780633ed691ef1461013c57600080fd5b806301fd9044146100d9578063257b3632146100f55780632dfdf0b514610115575b600080fd5b6100e260005481565b6040519081526020015b60405180910390f35b6100e261010336600461071d565b60026020526000908152604090205481565b6100e260235481565b6100e260015481565b61013a61013536600461071d565b61025d565b005b6100e2610401565b61016b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ec565b6100e2610416565b6100e26101a6366004610736565b604080516020808201959095528082019390935260c09190911b7fffffffffffffffff0000000000000000000000000000000000000000000000001660608301528051604881840301815260689092019052805191012090565b6100e261020e3660046107a7565b610420565b61016b7f000000000000000000000000000000000000000000000000000000000000000081565b61024d6102483660046107e6565b6104f6565b60405190151581526020016100ec565b60005460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102ac5750600182905581610328565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102f6576000839055829150610328565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610334828461050e565b600081815260026020526040812054919250036103fb57600061035860014361085d565b60008381526002602090815260409182902092409283905581518082018690528083018490527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b16606082015282518082036048018152606890910190925281519101209091506103cc9061053d565b604051849084907fda61aa7823fcd807e37b95aabcbe17f03a6f3efd514176444dae191d27fd66b390600090a3505b50505050565b600061041160015460005461050e565b905090565b6000610411610640565b600083815b60208110156104ed57600163ffffffff8516821c811690036104905784816020811061045357610453610870565b602002013582604051602001610473929190918252602082015260400190565b6040516020818303038152906040528051906020012091506104db565b818582602081106104a3576104a3610870565b60200201356040516020016104c2929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806104e58161089f565b915050610425565b50949350505050565b600081610504868686610420565b1495945050505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b80600161054c602060026109f7565b610556919061085d565b60235410610590576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006023600081546105a19061089f565b9182905550905060005b6020811015610632578082901c6001166001036105de5782600382602081106105d6576105d6610870565b015550505050565b600381602081106105f1576105f1610870565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061062a9061089f565b9150506105ab565b5061063b610a0a565b505050565b602354600090819081805b6020811015610714578083901c6001166001036106a8576003816020811061067557610675610870565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506106d5565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b6040805160208101849052908101839052606001604051602081830303815290604052805190602001209150808061070c9061089f565b91505061064b565b50919392505050565b60006020828403121561072f57600080fd5b5035919050565b60008060006060848603121561074b57600080fd5b8335925060208401359150604084013567ffffffffffffffff8116811461077157600080fd5b809150509250925092565b80610400810183101561053757600080fd5b803563ffffffff811681146107a257600080fd5b919050565b600080600061044084860312156107bd57600080fd5b833592506107ce856020860161077c565b91506107dd610420850161078e565b90509250925092565b60008060008061046085870312156107fd57600080fd5b8435935061080e866020870161077c565b925061081d610420860161078e565b939692955092936104400135925050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156105375761053761082e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036108d0576108d061082e565b5060010190565b600181815b8085111561093057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109165761091661082e565b8085161561092357918102915b93841c93908002906108dc565b509250929050565b60008261094757506001610537565b8161095457506000610537565b816001811461096a576002811461097457610990565b6001915050610537565b60ff8411156109855761098561082e565b50506001821b610537565b5060208310610133831016604e8410600b84101617156109b3575081810a610537565b6109bd83836108d7565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109ef576109ef61082e565b029392505050565b6000610a038383610938565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea2646970667358221220085253bac61681748496caf7cd5c09a387c4551b2b1cabbc8ff512cdeb63bfcc64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100d45760003560e01c806349b7b8021161008157806383f244031161005b57806383f2440314610200578063a3c573eb14610213578063fb5708341461023a57600080fd5b806349b7b802146101445780635ca1e165146101905780635d8105011461019857600080fd5b8063319cf735116100b2578063319cf7351461011e57806333d6247d146101275780633ed691ef1461013c57600080fd5b806301fd9044146100d9578063257b3632146100f55780632dfdf0b514610115575b600080fd5b6100e260005481565b6040519081526020015b60405180910390f35b6100e261010336600461071d565b60026020526000908152604090205481565b6100e260235481565b6100e260015481565b61013a61013536600461071d565b61025d565b005b6100e2610401565b61016b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ec565b6100e2610416565b6100e26101a6366004610736565b604080516020808201959095528082019390935260c09190911b7fffffffffffffffff0000000000000000000000000000000000000000000000001660608301528051604881840301815260689092019052805191012090565b6100e261020e3660046107a7565b610420565b61016b7f000000000000000000000000000000000000000000000000000000000000000081565b61024d6102483660046107e6565b6104f6565b60405190151581526020016100ec565b60005460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102ac5750600182905581610328565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102f6576000839055829150610328565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610334828461050e565b600081815260026020526040812054919250036103fb57600061035860014361085d565b60008381526002602090815260409182902092409283905581518082018690528083018490527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b16606082015282518082036048018152606890910190925281519101209091506103cc9061053d565b604051849084907fda61aa7823fcd807e37b95aabcbe17f03a6f3efd514176444dae191d27fd66b390600090a3505b50505050565b600061041160015460005461050e565b905090565b6000610411610640565b600083815b60208110156104ed57600163ffffffff8516821c811690036104905784816020811061045357610453610870565b602002013582604051602001610473929190918252602082015260400190565b6040516020818303038152906040528051906020012091506104db565b818582602081106104a3576104a3610870565b60200201356040516020016104c2929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806104e58161089f565b915050610425565b50949350505050565b600081610504868686610420565b1495945050505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b80600161054c602060026109f7565b610556919061085d565b60235410610590576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006023600081546105a19061089f565b9182905550905060005b6020811015610632578082901c6001166001036105de5782600382602081106105d6576105d6610870565b015550505050565b600381602081106105f1576105f1610870565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061062a9061089f565b9150506105ab565b5061063b610a0a565b505050565b602354600090819081805b6020811015610714578083901c6001166001036106a8576003816020811061067557610675610870565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506106d5565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b6040805160208101849052908101839052606001604051602081830303815290604052805190602001209150808061070c9061089f565b91505061064b565b50919392505050565b60006020828403121561072f57600080fd5b5035919050565b60008060006060848603121561074b57600080fd5b8335925060208401359150604084013567ffffffffffffffff8116811461077157600080fd5b809150509250925092565b80610400810183101561053757600080fd5b803563ffffffff811681146107a257600080fd5b919050565b600080600061044084860312156107bd57600080fd5b833592506107ce856020860161077c565b91506107dd610420850161078e565b90509250925092565b60008060008061046085870312156107fd57600080fd5b8435935061080e866020870161077c565b925061081d610420860161078e565b939692955092936104400135925050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156105375761053761082e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036108d0576108d061082e565b5060010190565b600181815b8085111561093057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109165761091661082e565b8085161561092357918102915b93841c93908002906108dc565b509250929050565b60008261094757506001610537565b8161095457506000610537565b816001811461096a576002811461097457610990565b6001915050610537565b60ff8411156109855761098561082e565b50506001821b610537565b5060208310610133831016604e8410600b84101617156109b3575081810a610537565b6109bd83836108d7565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109ef576109ef61082e565b029392505050565b6000610a038383610938565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea2646970667358221220085253bac61681748496caf7cd5c09a387c4551b2b1cabbc8ff512cdeb63bfcc64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol b/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol index 5a918de78..e487ba870 100644 --- a/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol +++ b/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol @@ -24,7 +24,7 @@ contract PolygonZkEVMGlobalExitRootV2 is /** * @dev Emitted when the global exit root is updated */ - event UpdateGlobalExitRoot( + event UpdateL1InfoTree( bytes32 indexed mainnetExitRoot, bytes32 indexed rollupExitRoot ); @@ -76,7 +76,7 @@ contract PolygonZkEVMGlobalExitRootV2 is ) ); - emit UpdateGlobalExitRoot( + emit UpdateL1InfoTree( cacheLastMainnetExitRoot, cacheLastRollupExitRoot ); diff --git a/deployment/v2/3_deployContracts.ts b/deployment/v2/3_deployContracts.ts index 17f04bb97..320871119 100644 --- a/deployment/v2/3_deployContracts.ts +++ b/deployment/v2/3_deployContracts.ts @@ -62,6 +62,7 @@ async function main() { const gasTokenAddressMainnet = ethers.ZeroAddress; const gasTokenNetworkMainnet = 0n; const attemptsDeployProxy = 20; + const gasTokenMetadata = "0x"; /* * Check deploy parameters @@ -298,6 +299,7 @@ async function main() { gasTokenNetworkMainnet, precalculateGlobalExitRootAddress, precalculateRollupManager, + gasTokenMetadata, ]); const [proxyBridgeAddress, isBridgeProxyDeployed] = await create2Deployment( diff --git a/deployment/v2/4_createRollup.ts b/deployment/v2/4_createRollup.ts index bb04d4608..b1f372c4e 100644 --- a/deployment/v2/4_createRollup.ts +++ b/deployment/v2/4_createRollup.ts @@ -145,7 +145,7 @@ async function main() { console.log("Added new Rollup Type deployed"); const newRollupTypeID = await rollupManagerContract.rollupTypeCount(); - let gasTokenAddress, gasTokenNetwork; + let gasTokenAddress, gasTokenNetwork, gasTokenMetadata; if (deployParameters.gasTokenAddress && deployParameters.gasTokenAddress != "") { gasTokenAddress = deployParameters.gasTokenAddress; @@ -153,6 +153,7 @@ async function main() { } else { gasTokenAddress = ethers.ZeroAddress; gasTokenNetwork = 0; + gasTokenMetadata = "0x"; } const newZKEVMAddress = ethers.getCreateAddress({ @@ -167,10 +168,10 @@ async function main() { adminZkEVM, trustedSequencer, gasTokenAddress, - gasTokenNetwork, trustedSequencerURL, networkName ); + const receipt = await txDeployRollup.wait(); const timestampReceipt = (await receipt?.getBlock())?.timestamp; const rollupID = await rollupManagerContract.chainIDToRollupID(chainID); @@ -188,7 +189,12 @@ async function main() { // Add the first batch of the created rollup const newZKEVMContract = (await PolygonZKEVMV2Factory.attach(newZKEVMAddress)) as PolygonZkEVMV2; const batchData = { - transactions: await newZKEVMContract.generateInitializeTransaction(rollupID, gasTokenAddress, gasTokenNetwork), + transactions: await newZKEVMContract.generateInitializeTransaction( + rollupID, + gasTokenAddress, + gasTokenNetwork, + gasTokenMetadata as any + ), globalExitRoot: ethers.ZeroHash, timestamp: timestampReceipt, sequencer: trustedSequencer, diff --git a/test/contractsv2/PolygonGlobalExitRootV2.test.ts b/test/contractsv2/PolygonGlobalExitRootV2.test.ts index eb774efc0..f7be0d41f 100644 --- a/test/contractsv2/PolygonGlobalExitRootV2.test.ts +++ b/test/contractsv2/PolygonGlobalExitRootV2.test.ts @@ -97,7 +97,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { // Update root from the rollup await expect(polygonZkEVMGlobalExitRootV2.connect(rollupManager).updateExitRoot(newRootRollup)) - .to.emit(polygonZkEVMGlobalExitRootV2, "UpdateGlobalExitRoot") + .to.emit(polygonZkEVMGlobalExitRootV2, "UpdateL1InfoTree") .withArgs(ethers.ZeroHash, newRootRollup); blockUpdates.push({ @@ -112,7 +112,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { // Update root from the PolygonZkEVMBridge const newRootBridge = ethers.hexlify(ethers.randomBytes(32)); await expect(polygonZkEVMGlobalExitRootV2.connect(bridge).updateExitRoot(newRootBridge)) - .to.emit(polygonZkEVMGlobalExitRootV2, "UpdateGlobalExitRoot") + .to.emit(polygonZkEVMGlobalExitRootV2, "UpdateL1InfoTree") .withArgs(newRootBridge, newRootRollup); const newGlobalExitRoot = calculateGlobalExitRoot(newRootBridge, newRootRollup); diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index d94613706..abdb8e50a 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -644,7 +644,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { ) .to.emit(rollupManagerContract, "VerifyBatchesTrustedAggregator") .withArgs(newCreatedRollupID, newVerifiedBatch, newStateRoot, newLocalExitRoot, trustedAggregator.address) - .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateL1InfoTree") .withArgs(ethers.ZeroHash, rootRollups); const finalAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); @@ -1320,7 +1320,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { ) .to.emit(rollupManagerContract, "VerifyBatchesTrustedAggregator") .withArgs(newCreatedRollupID, newVerifiedBatch, newStateRoot, newLocalExitRoot, trustedAggregator.address) - .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateL1InfoTree") .withArgs(ethers.ZeroHash, rootRollups); const finalAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); @@ -1992,7 +1992,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { ) .to.emit(rollupManagerContract, "VerifyBatchesTrustedAggregator") .withArgs(newCreatedRollupID, newVerifiedBatch, newStateRoot, newLocalExitRoot, trustedAggregator.address) - .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateL1InfoTree") .withArgs(ethers.ZeroHash, rootRollups); const finalAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); @@ -2538,7 +2538,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { ) .to.emit(rollupManagerContract, "VerifyBatchesTrustedAggregator") .withArgs(newCreatedRollupID, newVerifiedBatch, newStateRoot, newLocalExitRoot, trustedAggregator.address) - .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateL1InfoTree") .withArgs(ethers.ZeroHash, rootRollups); const finalAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); @@ -2991,7 +2991,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { ) .to.emit(rollupManagerContract, "VerifyBatchesTrustedAggregator") .withArgs(RollupID, newVerifiedBatch, newStateRoot, newLocalExitRoot, trustedAggregator.address) - .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateL1InfoTree") .withArgs(ethers.ZeroHash, rootRollups); const finalAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); diff --git a/test/contractsv2/PolygonRollupManagerUpgrade.test.ts b/test/contractsv2/PolygonRollupManagerUpgrade.test.ts index bf769cb71..31660ae56 100644 --- a/test/contractsv2/PolygonRollupManagerUpgrade.test.ts +++ b/test/contractsv2/PolygonRollupManagerUpgrade.test.ts @@ -138,7 +138,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { firstDeployment = false; // deploy globalExitRoot - const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRoot"); + const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRootV2"); polygonZkEVMGlobalExitRoot = (await upgrades.deployProxy(PolygonZkEVMGlobalExitRootFactory, [], { initializer: false, constructorArgs: [precalculatezkEVM, precalculateBridgeAddress], @@ -680,7 +680,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { ) .to.emit(rollupManagerContract, "VerifyBatchesTrustedAggregator") .withArgs(newCreatedRollupID, newVerifiedBatch, newStateRoot, newLocalExitRoot, trustedAggregator.address) - .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateL1InfoTree") .withArgs(ethers.ZeroHash, rootRollups); const finalAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); From ab91271c116af0e505fc86437f926d8ac733ac3a Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 22 Nov 2023 10:34:30 +0100 Subject: [PATCH 098/230] update paris compiled ocntracts --- .githooks/pre-commit | 3 + .../paris/PolygonRollupManagerMock.json | 100 +- .../PolygonRollupManagerMockInternalTest.json | 1976 +++++++++++++++++ 3 files changed, 1981 insertions(+), 98 deletions(-) create mode 100644 compiled-contracts/paris/PolygonRollupManagerMockInternalTest.json diff --git a/.githooks/pre-commit b/.githooks/pre-commit index 862adad31..12d696325 100755 --- a/.githooks/pre-commit +++ b/.githooks/pre-commit @@ -24,6 +24,9 @@ if npm run lint; then cp artifacts/contracts/PolygonZkEVMTimelock.sol/PolygonZkEVMTimelock.json compiled-contracts/ cp artifacts/contracts/v2/PolygonRollupManager.sol/PolygonRollupManager.json compiled-contracts/ + cp artifacts/contracts/v2/mocks/PolygonRollupManagerMock.sol/PolygonRollupManagerMock.json compiled-contracts/ + cp artifacts/contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol/PolygonRollupManagerMockInternalTest.json compiled-contracts/ + cp artifacts/contracts/v2/PolygonZkEVMBridgeV2.sol/PolygonZkEVMBridgeV2.json compiled-contracts/ cp artifacts/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol/PolygonZkEVMGlobalExitRootV2.json compiled-contracts/ diff --git a/compiled-contracts/paris/PolygonRollupManagerMock.json b/compiled-contracts/paris/PolygonRollupManagerMock.json index 6ad4be8b4..9bf4d2791 100644 --- a/compiled-contracts/paris/PolygonRollupManagerMock.json +++ b/compiled-contracts/paris/PolygonRollupManagerMock.json @@ -39,36 +39,16 @@ "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", @@ -89,16 +69,6 @@ "name": "FinalPendingStateNumInvalid", "type": "error" }, - { - "inputs": [], - "name": "ForceBatchNotAllowed", - "type": "error" - }, - { - "inputs": [], - "name": "ForceBatchesAlreadyActive", - "type": "error" - }, { "inputs": [], "name": "HaltTimeoutNotExpired", @@ -129,11 +99,6 @@ "name": "InvalidRangeBatchTimeTarget", "type": "error" }, - { - "inputs": [], - "name": "InvalidRangeForceBatchTimeout", - "type": "error" - }, { "inputs": [], "name": "InvalidRangeMultiplierBatchFee", @@ -154,11 +119,6 @@ "name": "NewPendingStateTimeoutMustBeLower", "type": "error" }, - { - "inputs": [], - "name": "NewSequencedBatchMustBeBigger", - "type": "error" - }, { "inputs": [], "name": "NewStateRootNotInsidePrime", @@ -169,11 +129,6 @@ "name": "NewTrustedAggregatorTimeoutMustBeLower", "type": "error" }, - { - "inputs": [], - "name": "NotSupportedCurrently", - "type": "error" - }, { "inputs": [], "name": "OldAccInputHashDoesNotExist", @@ -194,16 +149,6 @@ "name": "OnlyNotEmergencyState", "type": "error" }, - { - "inputs": [], - "name": "OnlyPendingGovernance", - "type": "error" - }, - { - "inputs": [], - "name": "OnlyTrustedAggregator", - "type": "error" - }, { "inputs": [], "name": "PendingStateDoesNotExist", @@ -219,11 +164,6 @@ "name": "PendingStateNotConsolidable", "type": "error" }, - { - "inputs": [], - "name": "PendingStateTimeoutExceedHaltAggregationTimeout", - "type": "error" - }, { "inputs": [], "name": "RollupMustExist", @@ -249,11 +189,6 @@ "name": "StoredRootMustBeDifferentThanNewRoot", "type": "error" }, - { - "inputs": [], - "name": "TrustedAggregatorTimeoutExceedHaltAggregationTimeout", - "type": "error" - }, { "inputs": [], "name": "TrustedAggregatorTimeoutNotExpired", @@ -269,26 +204,6 @@ "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": [ @@ -444,12 +359,6 @@ "internalType": "address", "name": "gasTokenAddress", "type": "address" - }, - { - "indexed": false, - "internalType": "uint32", - "name": "gasTokenNetwork", - "type": "uint32" } ], "name": "CreateNewRollup", @@ -1006,11 +915,6 @@ "name": "gasTokenAddress", "type": "address" }, - { - "internalType": "uint32", - "name": "gasTokenNetwork", - "type": "uint32" - }, { "internalType": "string", "name": "sequencerURL", @@ -2078,8 +1982,8 @@ "type": "function" } ], - "bytecode": "0x60e034620000e257601f620059d738819003918201601f19168301916001600160401b03831184841017620000e757808492606094604052833981010312620000e25780516001600160a01b0391908281168103620000e2576020820151918383168303620000e257604001519283168303620000e25760805260c05260a0526040516158d99081620000fe8239608051818181610e7c01528181611a1801528181612fe20152818161313701526144f2015260a051818181610c76015281816112b60152614856015260c0518181816105d5015281816140480152614c350152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe60808060405260043610156200001457600080fd5b600090813560e01c908163066ec01214620039e857508063080b311114620039985780630a0d9fbe146200396b5780630e36f582146200327957806311f6b287146200322d57806312b86e1914620030aa5780631489ed101462002f5357806315064c961462002f2e5780631608859c1462002e885780631796a1ae1462002e625780631816b7e51462002db55780632072f6c51462002d15578063248a9ca31462002ce6578063252801691462002c315780632f2ff15d1462002b8857806336568abe1462002b39578063394218e91462002a84578063477fa2701462002a645780634d4d33381462001f7e57806355a71ee01462001f22578063604691691462001ed857806365c0504d1462001e535780637222020f1462001d7c5780637975fcfe1462001d035780637fb6e76a1462001cbf578063841b24d71462001c9c57806387c20c0114620017ef5780638bd4f07114620017595780638f698ec5146200165057806391d14854146200160057806399f5634e14620015e15780639a908e7314620014775780639c9f3dfe14620013cc578063a066215c146200132a578063a217fddf146200130c578063a2967d9914620012e5578063a3c573eb146200129e578063afd23cbe1462001277578063b99d0ad714620011ae578063c1acbc34146200117f578063c4c928c21462000eef578063ceee281d1462000eab578063d02103ca1462000e64578063d5073f6f1462000da9578063d547741f1462000d60578063d939b3151462000d35578063dbc169761462000c28578063dde0ff771462000bfb578063e0bfd3d21462000a5b578063e136edf71462000604578063e46761c414620005bd578063f34eb8eb14620003a0578063f4e92675146200037a5763f9c4c2ae14620002aa57600080fd5b3462000377576020366003190112620003775760406101809163ffffffff620002d262003a0f565b16815260816020522060ff815491600181015460058201549160076006820154910154926040519560018060a01b0393848216885260018060401b039485809360a01c1660208a01528116604089015260a01c166060870152608086015281811660a0860152818160401c1660c0860152818160801c1660e086015260c01c6101008501528082166101208501528160401c1661014084015260801c16610160820152f35b80fd5b50346200037757806003193601126200037757602063ffffffff60805416604051908152f35b5034620003775760c03660031901126200037757620003be62003a68565b620003c862003ac4565b90620003d362003a3a565b906064359160ff8316809303620005b8576001600160401b03926084359060a435858111620005b4576200040c90369060040162003cdb565b3360009081527fb3124b64d0942b276d75ea451f4dd8b83bf9442b427f9eb873ac771c92e65f02602052604090205490939060ff1615620005a257607e549663ffffffff6200045d818a1662003db5565b16809863ffffffff191617607e556040519060c0820190828210898311176200058c5789916040528a600160a01b6001900380991698898552806020860193169a8b84528060408701971696878152606087019289845280608089019580875260a08a01988d8a528152607f6020526040902098511690600160a01b600190031991828a54161789556001890196511690865416178555511662000502908462003dcb565b519082549060ff60e81b9051151560e81b169160ff60e01b9060e01b169061ffff60e01b1916171790555190600201556040519586958652602086015260408501526060840152608083015260a0820160c0905260c08201620005659162003bf4565b037fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5291a280f35b634e487b7160e01b600052604160045260246000fd5b604051637615be1f60e11b8152600490fd5b8780fd5b600080fd5b503462000377578060031936011262000377576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5034620003775761010036600319011262000377576200062362003a0f565b906200062e62003a23565b916044356001600160a01b0381168103620005b8576200064d62003a7f565b6200065762003a96565b9060a4359063ffffffff82168203620005b85760c4356001600160401b03811162000a57576200068c90369060040162003cdb565b916001600160401b0360e4351162000a5757620006af3660e43560040162003cdb565b3360009081527f41902c3bd358ff4b85ee46864bd81ee453a1b3cfd703a58950be8d28ae030661602052604090205490959060ff1615620005a25763ffffffff871615801562000a3f575b62000a2d5763ffffffff87168852607f6020526040882093600160ff8187015460e81c1615151462000a1b576001600160401b038a1689526083602052604089205463ffffffff1662000a09576080549563ffffffff6200075d81891662003db5565b1663ffffffff1997909716871760805585546040519b906001600160a01b0316620007888d62003c67565b8b8d52604051906001600160401b03610618830190811190831117620009f557620007d88d9e83926106186200502c85396106188401908152306020820152606060408201819052019062003bf4565b03908cf0968715620009ea5788927f9a84992ead4481f37097c7663e97ed883b31f216fae5685c6ee576a656483cd992620008e48d8f600160a096620008d78f600763ffffffff9160ff968e878060401b038c16825260836020526040822081861982541617905587808f1b038316825260826020526040822081861982541617905581526081602052604081209187808f1b031990888f81901b03168184541617835587870154906200089b898501928a8060401b039060a01c168362003dcb565b888f81901b03898901541690825416179055620008b98b8362003dcb565b60406002870154918080526002840160205220550195168562003d8c565b015460e01c169062003df4565b63ffffffff6040519d168d528c6020600180861b038c1691015260018060401b031660408d0152600180831b03169a8b606082015263ffffffff87166080820152a26001600160a01b0385163b15620009e657889662000999620009ac9263ffffffff8a966040519c8d9b8c9a8b996308fd7e2160e31b8b5260018060a01b031660048b015260018060a01b031660248a01526044890152606488015216608486015260e060a486015260e485019062003bf4565b8381036003190160c48501529062003bf4565b03926001600160a01b03165af18015620009db57620009c85750f35b620009d39062003c1b565b620003775780f35b6040513d84823e3d90fd5b8880fd5b6040513d8d823e3d90fd5b634e487b7160e01b8d52604160045260248dfd5b6040516337c8fe0960e11b8152600490fd5b604051633b8d3d9960e01b8152600490fd5b604051637512e5cb60e01b8152600490fd5b5063ffffffff607e541663ffffffff881611620006fa565b8680fd5b5034620003775760c036600319011262000377576004356001600160a01b038181169182900362000bf75762000a9062003ac4565b62000a9a62003a3a565b606435936001600160401b039081861690818703620005b85760a4359260ff841693848103620005b8573360009081527ff444741efd45fa05f38650e87f3d8ca01816575bed45a01e78186ae5f3bc8355602090815260409091205490999060ff1615620005a257848b5260838a5263ffffffff978860408d20541662000a09576080549862000b2c818b1662003db5565b16988963ffffffff19809216176080558660005260838c5260406000208a828254161790558560005260828c52896040600020918254161790558860005260818b52604060002099600160a01b60019003199086828d5416178c5560018c019262000b988b8562003dcb565b169082541617905562000bac908962003dcb565b62000bbb906007890162003df4565b6040519416845286840152604083015260608201526080600080516020620057a483398151915291a28280526002019052608435604082205580f35b8280fd5b503462000377578060031936011262000377576084546040805191901c6001600160401b03168152602090f35b503462000377578060031936011262000377573360009081527f307dd781c86f141a460373e0117a8033afea21c02f6121aff0f5b5553df24f4a602052604090205460ff1615620005a257807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1562000d3257818091600460405180948193636de0b4bb60e11b83525af18015620009db5762000d1a575b5050606f5460ff81161562000d085760ff1916606f557f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b38180a180f35b604051635386698160e01b8152600490fd5b62000d259062003c1b565b6200037757803862000ccb565b50fd5b503462000377578060031936011262000377576085546040516001600160401b039091168152602090f35b503462000377576040366003190112620003775762000da660043562000d8562003ac4565b90808452603460205262000da0600160408620015462004ef3565b62004fb4565b80f35b50346200037757602036600319011262000377573360009081527fe0205af17734f857fb538b40523c7cc189a1ab8f1ec33be516761c6b465766b660205260409020546004359060ff1615620005a257683635c9adc5dea000008111801562000e56575b62000e44576020817ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b292608655604051908152a180f35b604051638586952560e01b8152600490fd5b50633b9aca00811062000e0d565b503462000377578060031936011262000377576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503462000377576020366003190112620003775760209063ffffffff906040906001600160a01b0362000edd62003a68565b16815260828452205416604051908152f35b50346200037757606036600319011262000377576004356001600160a01b038181169182900362000bf75760243563ffffffff808216809203620005b8576001600160401b039260443584811162000a57573660238201121562000a5757806004013590858211620005b4573660248383010111620005b4573360009081527ff14f5a8ad59d90593602e905b358229bff5ceea677d5bf0f5a1701793550a9a6602090815260409091205490949060ff1615620005a2578515801562001171575b62000a2d57878952608285526040892054169687156200115f57878952608185526040892093600785019788549088818360401c16146200114d57888c52607f885260408c20916001830190815490600160ff8360e81c1615151462000a1b5760ff808360e01c169160801c16036200113b57600190980180546001600160a01b031916988516989098178855548c97620010519160a01c83169062003dcb565b6200105d898b62003d8c565b8a875260818852620010726040882062004ba9565b8a546001600160401b0319169116908117909955541690803b1562001137578492836064602494876040519889978896879463278f794360e11b8652600486015260408286015282604486015201848401378181018301849052601f01601f191681010301925af18015620009db576200111b575b5050907ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d926040928351928352820152a280f35b620011299093929362003c1b565b6200113757908438620010e7565b8480fd5b604051635aa0d5f160e11b8152600490fd5b604051634f61d51960e01b8152600490fd5b6040516374a086a360e01b8152600490fd5b5080607e5416861162000fb0565b5034620003775780600319360112620003775760845460405160809190911c6001600160401b03168152602090f35b50346200037757604036600319011262000377576080906040620011d162003a0f565b9163ffffffff620011e162003a23565b938260608551620011f28162003c4b565b828152826020820152828782015201521681526081602052600482822001600180841b03809416825260205220604051906200122e8262003c4b565b8054928084169384845281602085019160401c16815260606002600185015494604087019586520154940193845260405194855251166020840152516040830152516060820152f35b50346200037757806003193601126200037757602061ffff60855460801c16604051908152f35b503462000377578060031936011262000377576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5034620003775780600319360112620003775760206200130462004970565b604051908152f35b50346200037757806003193601126200037757602090604051908152f35b50346200037757602036600319011262000377576200134862003a51565b6200135262004eb9565b6001600160401b03811690620151808211620013ba5760858054600160401b600160801b031916604092831b600160401b600160801b0316179055519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602090a180f35b604051631c0cfbfd60e31b8152600490fd5b5034620003775760203660031901126200037757620013ea62003a51565b620013f462004eb9565b60ff606f5416156200144e575b608580546001600160401b0319166001600160401b0390921691821790556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602090a180f35b6085546001600160401b0390811690821610620014015760405163048a05a960e41b8152600490fd5b50346200037757604036600319011262000377576200149562003a51565b60ff606f5416620015cf573382526020916082835263ffffffff604082205416908115620015bd576001600160401b0383811615620015ab5762001574604083856200157a95526081885220916084549080620014f58882851662003e11565b169660018060401b0319978880941617608455600685018054836200151e818316948562003e11565b16998a911617905560405192620015358462003c2f565b60243584528260018b8601958242168752604081019485528b600052600389018d52604060002090518155019451169084541617835551169062003d8c565b620043a0565b7f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a2583604051848152a2604051908152f35b604051632590ccf960e01b8152600490fd5b6040516371653c1560e01b8152600490fd5b604051630bc011ff60e21b8152600490fd5b5034620003775780600319360112620003775760206200130462004c1a565b503462000377576040366003190112620003775760406200162062003ac4565b9160043581526034602052209060018060a01b0316600052602052602060ff604060002054166040519015158152f35b5034620003775760208060031936011262001755576004356001600160401b03811162000bf7573660238201121562000bf7578060040135620016938162003ca7565b92620016a3604051948562003c83565b8184528084019260249384600594851b83010191368311620005b45785849101915b83831062001744575050505063ffffffff8085511663ffffffff196080541617608055855b8551811015620017405762001700818762004945565b51600182018083116200172d57831688526081845260408820850155620017279062004935565b620016ea565b634e487b7160e01b895260116004528689fd5b8680f35b8235815291810191849101620016c5565b5080fd5b503462000377576200176b3662003adb565b60ff606f9895929698979493975416620015cf578560409784620017c6947f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a70109b8b8e63ffffffff60029c1681526081602052209889620045eb565b600180861b03166000520160205281600020549082519182526020820152a162000da662004854565b50346200037757620018013662003b51565b9060ff606f99989799969395965416620015cf5763ffffffff871688526081602052604088209860018060401b03871660005260038a016020526200185d60018060401b036001604060002001541660845460c01c9062003e11565b426001600160401b039091161162001c8a576103e86001600160401b0362001886868a62003e2b565b161162001c785784876200189d9588938d62003eb8565b620018a88662004ba9565b92958693866001600160401b03620018c1838862003e2b565b6085549391169190620018e2604085901c6001600160401b03164262004825565b9a5b6001600160401b038181169083161462001c61576001600160401b038181166000908152600388016020526040902060010154919082168d101562001936575060401c6001600160401b0316620018e4565b9250506200196392939495969798999a506200195a9060018060401b039262003e2b565b16809262004825565b918183101562001c05575003600c81111562001bfa57506200199d600c5b6086548161ffff60855460801c160a02906103e80a9062004833565b6086555b608654683635c9adc5dea00000908181111562001bd957506086555b6085546001600160401b031662001add578160056006830192620019e2878562003d8c565b60018060401b03871660005260028101602052856040600020550155805460018060401b038160801c1662001aca575b508590507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031662001a4a62004970565b813b1562000bf75782916024839260405194859384926333d6247d60e01b845260048401525af18015620009db5762001ab2575b5050600080516020620057e4833981519152915b62001aac60405192839263ffffffff339816968462003e45565b0390a380f35b62001abd9062003c1b565b6200113757843862001a7e565b6001600160801b03169055388062001a12565b62001aeb81939293620043a0565b6006810180546001600160401b03608082901c811690811462001bc557600160801b600160c01b0319909116600190910160801b600160801b600160c01b03161790819055604051600080516020620057e4833981519152949392909160029162001b568462003c4b565b426001600160401b039081168552888116602080870191825260408781018a8152606089018a815260809790971c85168f526004959095019091528c20955186546001600160401b0319169083161786555162001bb591168562003d8c565b5160018401555191015562001a92565b634e487b7160e01b89526011600452602489fd5b9050633b9aca0080911062001bf0575b50620019bd565b6086553862001be9565b6200199d9062001981565b9062001c4c9203600c811160001462001c55575062001c41600c915b670de0b6b3a76400009261ffff816103e80a9260801c160a830262004833565b906086540262004833565b608655620019a1565b62001c41909162001c21565b505080929394959697989950620019639162004825565b604051635acfba9d60e11b8152600490fd5b604051638a0704d360e01b8152600490fd5b50346200037757806003193601126200037757602060845460c01c604051908152f35b503462000377576020366003190112620003775760209063ffffffff906040906001600160401b0362001cf162003a51565b16815260838452205416604051908152f35b5034620003775760c0366003190112620003775762001d6362001d789162001d2a62003a0f565b9062001d3562003a23565b9063ffffffff62001d4562003a3a565b93168152608160205260a43592608435926040606435932062004ceb565b60405191829160208352602083019062003bf4565b0390f35b503462000377576020366003190112620003775762001d9a62003a0f565b3360009081527fd26c1f3d72948c9f5ca2b28d010847694e18f81d42613c046515d0839b64354c602052604090205460ff1615620005a25763ffffffff80911690811590811562001e44575b5062000a2d57808252607f602052600160408320018054600160ff8260e81c1615151462000a1b5760ff60e81b1916600160e81b1790557f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e448280a280f35b9050607e541681113862001de6565b5034620003775760203660031901126200037757604060c09163ffffffff62001e7b62003a0f565b168152607f6020522060018060a01b0360ff818354169260026001820154910154926040519485528116602085015260018060401b038160a01c166040850152818160e01c16606085015260e81c161515608083015260a0820152f35b503462000377578060031936011262000377576086549060648202918083046064149015171562001f0e57602082604051908152f35b634e487b7160e01b81526011600452602490fd5b50346200037757604036600319011262000377576002604062001f4462003a0f565b9263ffffffff62001f5462003a23565b94168152608160205220019060018060401b03166000526020526020604060002054604051908152f35b50346200037757610100366003190112620003775762001f9d62003a68565b9062001fa862003a23565b9162001fb362003a3a565b62001fbd62003a7f565b9362001fc862003a96565b9162001fd362003aad565b6001600160a01b039360c43585811694929190859003620005b45760e43598868a16809a03620005b8576101029389549060ff958287809460081c16158062002a57575b620020229062003d28565b61ffff191617808c5560858054608480546001600160c01b031660c09b909b1b6001600160c01b0319169a909a1790995567016345785d8a00006086556001600160801b03199098166001600160401b039283161760e160431b1761ffff60801b19166101f560811b179097559560081c1615620029fe576000805160206200588483398151915291828a52603492602099848b528960408d20911690816000528b52866040600020541615620029c1575b50508980528289528760408b2091169081600052895284604060002054161562002985575b60008051602062005724833981519152808b52838a5260408b20826000528a5285604060002054161562002948575b50600080516020620057c4833981519152808b52838a5260408b20826000528a528560406000205416156200290b575b50600080516020620056a483398151915290818b52838a5260408b20816000528a52856040600020541615620028ce575b505060008051602062005704833981519152808a528289528760408b2092169182600052895284604060002054161562002891575b5060008051602062005864833981519152808a5282895260408a2082600052895284604060002054161562002854575b5060008051602062005744833981519152808a5282895260408a2082600052895284604060002054161562002817575b5060008051602062005804833981519152808a5282895260408a20826000528952846040600020541615620027da575b506200225962004f18565b60008051602062005664833981519152808a5282895260408a208260005289528460406000205416156200279d575b50600080516020620056e483398151915290818a5282895260408a2081600052895284604060002054161562002760575b5050620022c562004f66565b600080516020620058448339815191528089528188528660408a2093169283600052885283604060002054161562002723575b506000805160206200582483398151915292838952818852604089208360005288526040600020541615620026e6575b5050506080549063ffffffff6200234181841662003db5565b16918263ffffffff198092161760805561044d90816000526083875260406000208482825416179055846000526082875283604060002091825416179055826000526081865260406000209283548560019a8b870163ffffffff60e01b91600560a01b90838354161717905561044d60a01b921617178455600080516020620057a48339815191526080600786019360ff821b1985541685556040519060058252888b830152604082015260006060820152a28160735460401c1692826074541690818503620026d457600690828a526075895260408a205483600052600282018a52604060002055858a526072895260408a2086600052600382018a52604060002090868d8284036200269f575b505050500180546001600160401b031990811686178255906200247590839062003d8c565b82541617905583607a541693606f5460581c16918652607285526040862054906073541691833b1562000a57576040519463176b20e160e31b86526004860152602485015260c0604485015260009660765480821c90828116801562002694575b888310811462002680578260c489015290816000146200266157506001146200261f575b506003198589030160648601526000976077549182811c92818116801562002614575b89851081146200260057848452908115620025e25750600114620025a4575b505050918386818199819583999a97608484015260a483015203925af18015620009db576200258c575b50600080516020620057848339815191528261ff0019835416835560405160028152a180f35b620025979062003c1b565b6200175557813862002566565b92985090607760005286600020926000935b828510620025ce57505050018401958386816200253c565b80548486018a0152938801938101620025b6565b60ff1916838a0152505090151560051b01850196508386816200253c565b634e487b7160e01b8c52602260045260248cfd5b93607f16936200251d565b90975060766000528560002086896000925b8484106200264b5750505060e491508501019638620024fa565b805460e4858b0101520191019089889162002631565b905060e492995060ff191682870152151560051b8501019638620024fa565b634e487b7160e01b8b52602260045260248bfd5b91607f1691620024d6565b80620026ca94845481550192018181541660018060401b03198454161783555460401c169062003d8c565b3880868d62002450565b604051632e4cc54360e11b8152600490fd5b8288528652604087208160005286526040600020600160ff198254161790553391600080516020620056448339815191528880a438808062002328565b808952818852604089208360005288526040600020600160ff19825416179055823391600080516020620056448339815191528b80a438620022f8565b818a5282895260408a208160005289526040600020600160ff198254161790553391600080516020620056448339815191528b80a43880620022b9565b808a5282895260408a208260005289526040600020600160ff19825416179055813391600080516020620056448339815191528c80a43862002288565b808a5282895260408a208260005289526040600020600160ff19825416179055813391600080516020620056448339815191528c80a4386200224e565b808a5282895260408a208260005289526040600020600160ff19825416179055813391600080516020620056448339815191528c80a4386200221e565b808a5282895260408a208260005289526040600020600160ff19825416179055813391600080516020620056448339815191528c80a438620021ee565b808a5282895260408a208260005289526040600020600160ff19825416179055813391600080516020620056448339815191528c80a438620021be565b818b52838a5260408b20816000528a526040600020600160ff198254161790553391600080516020620056448339815191528c80a4388062002189565b808b52838a5260408b20826000528a526040600020600160ff19825416179055813391600080516020620056448339815191528d80a43862002158565b808b52838a5260408b20826000528a526040600020600160ff19825416179055813391600080516020620056448339815191528d80a43862002128565b89805282895260408a208160005289526040600020600160ff1982541617905533818b600080516020620056448339815191528180a4620020f9565b818c52848b5260408c20816000528b526040600020600160ff198254161790553391600080516020620056448339815191528d80a43880620020d4565b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b5060028185161062002017565b503462000377578060031936011262000377576020608654604051908152f35b503462000377576020366003190112620003775762002aa262003a51565b62002aac62004eb9565b60ff606f54161562002b11575b608480546001600160c01b031660c083901b6001600160c01b0319161790556040516001600160401b0390911681527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602090a180f35b60845460c01c6001600160401b0382161062002ab95760405163401636df60e01b8152600490fd5b503462000377576040366003190112620003775762002b5762003ac4565b336001600160a01b0382160362002b765762000da69060043562004fb4565b604051630b4ad1cd60e31b8152600490fd5b503462000377576040366003190112620003775760043562002ba962003ac4565b818352603460205262002bc3600160408520015462004ef3565b8183526034602052604083209060018060a01b0316908160005260205260ff604060002054161562002bf3578280f35b818352603460205260408320816000526020526040600020600160ff198254161790553391600080516020620056448339815191528480a438808280f35b50346200037757604036600319011262000377576060906003604062002c5662003a0f565b9263ffffffff62002c6662003a23565b948284805162002c768162003c2f565b82815282602082015201521681526081602052200160018060401b0380921660005260205260406000209060405162002caf8162003c2f565b81600184549485845201549181604060208301928286168452019360401c1683526040519485525116602084015251166040820152f35b503462000377576020366003190112620003775760016040602092600435815260348452200154604051908152f35b503462000377578060031936011262000377576000805160206200584483398151915281526034602052604081203360005260205260ff604060002054161562002d64575b62000da662004854565b60845460801c6001600160401b0390811662093a80019080821162002d9f57429116111562002d5a5760405163692baaad60e11b8152600490fd5b634e487b7160e01b600052601160045260246000fd5b503462000377576020366003190112620003775760043561ffff81169081810362000bf75762002de462004eb9565b6103e88210801562002e56575b62002e44576085805461ffff60801b191660809290921b61ffff60801b169190911790556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c590602090a180f35b604051630984a67960e31b8152600490fd5b506103ff821162002df1565b50346200037757806003193601126200037757602063ffffffff607e5416604051908152f35b503462000377576040366003190112620003775762002ea662003a0f565b63ffffffff62002eb562003a23565b91168252608160205260408220906000805160206200588483398151915283526034602052604083203360005260205260ff604060002054161562002f00575b62000da6916200444d565b60ff606f5416620015cf5762002f17818362004be6565b62002ef557604051630674f25160e11b8152600490fd5b50346200037757806003193601126200037757602060ff606f54166040519015158152f35b5034620003775762002f9c63ffffffff62002f6e3662003b51565b928481979699849962002f869c979c95949562004e7f565b16998a8d52608160205260408d20978862003eb8565b600681019062002fad868362003d8c565b82600560018060401b0392838916600052600281016020528660406000205501558154908160801c1662003097575b508590507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166200301462004970565b813b1562000bf75782916024839260405194859384926333d6247d60e01b845260048401525af18015620009db576200307f575b50507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39162001aac60405192839233978462003e45565b6200308a9062003c1b565b6200113757843862003048565b6001600160801b03169055388062002fdc565b50346200037757620030f263ffffffff620030c53662003adb565b92809599948297998499620030dc95949562004e7f565b169a8b8d52608160205260408d209a8b620045eb565b600684019062003103818362003d8c565b83600560018060401b0380931696878a52600281016020528560408b205501558154908160801c166200321a575b508590507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166200316962004970565b90803b1562000bf7576024839260405194859384926333d6247d60e01b845260048401525af180156200320f57620031e3575b50608480546001600160c01b031661127560c71b179055604080519384526020840191909152820152336060820152600080516020620056c483398151915290608090a280f35b91600080516020620056c48339815191529391956200320460809462003c1b565b95919350916200319c565b6040513d88823e3d90fd5b6001600160801b03169055388062003131565b503462000377576020366003190112620003775762003267604060209263ffffffff6200325962003a0f565b168152608184522062004ba9565b6040516001600160401b039091168152f35b5034620003775760c036600319011262000377576200329762003a68565b620032a162003a23565b620032ab62003a3a565b90610102620032b962003a7f565b92620032c462003a96565b92620032cf62003aad565b9187549160ff948386809560081c1615806200395e575b620032f19062003d28565b61ffff191617808a5560858054608480546001600160c01b031660c09690961b6001600160c01b0319169590951790945567016345785d8a00006086556001600160801b03199093166001600160401b039092169190911760e160431b1761ffff60801b19166101f560811b1790915560081c1615620029fe576000805160206200578483398151915294600080516020620058848339815191529485885260349460209686885260408a2060018060a01b0380951690818c5289528660408c2054161562003924575b50508880528587528260408a20911690818a5287528460408a20541615620038eb575b60008051602062005724833981519152808a5286885260408a20828b5288528560408b20541615620038b0575b50600080516020620057c4833981519152808a5286885260408a20828b5288528560408b2054161562003875575b50600080516020620056a483398151915290818a5286885260408a20818b5288528560408b205416156200383b575b5050600080516020620057048339815191528089528587528260408a20921691828a5287528460408a2054161562003800575b506000805160206200586483398151915280895285875260408920828a5287528460408a20541615620037c5575b506000805160206200574483398151915280895285875260408920828a5287528460408a205416156200378a575b506000805160206200580483398151915280895285875260408920828a5287528460408a205416156200374f575b506200353062004f18565b6000805160206200566483398151915280895285875260408920828a5287528460408a2054161562003714575b50600080516020620056e48339815191529081895285875260408920818a5287528460408a20541615620036da575b50506200359862004f66565b600080516020620058448339815191529081885284865260408820921691828852855282604088205416156200369f575b506000805160206200582483398151915290818752838552604087208188528552826040882054161562003665575b5050848052818352604085203386528352604085205416156200362b575b50825461ff001916835560405160028152a180f35b838052815260408320338452815260408320600160ff19825416179055333384600080516020620056448339815191528180a43862003616565b818752838552604080882082895286528720805460ff191660011790553391600080516020620056448339815191528880a43880620035f8565b80875283855260408720828852855260408720600160ff19825416179055813391600080516020620056448339815191528980a438620035c9565b8189528587526040808a20828b5288528920805460ff191660011790553391600080516020620056448339815191528a80a438806200358c565b80895285875260408920828a52875260408920600160ff19825416179055813391600080516020620056448339815191528b80a4386200355d565b80895285875260408920828a52875260408920600160ff19825416179055813391600080516020620056448339815191528b80a43862003525565b80895285875260408920828a52875260408920600160ff19825416179055813391600080516020620056448339815191528b80a438620034f7565b80895285875260408920828a52875260408920600160ff19825416179055813391600080516020620056448339815191528b80a438620034c9565b80895285875260408920828a52875260408920600160ff19825416179055813391600080516020620056448339815191528b80a4386200349b565b818a528688526040808b20828c5289528a20805460ff191660011790553391600080516020620056448339815191528b80a4388062003468565b808a5286885260408a20828b52885260408a20600160ff19825416179055813391600080516020620056448339815191528c80a43862003439565b808a5286885260408a20828b52885260408a20600160ff19825416179055813391600080516020620056448339815191528c80a4386200340b565b8880528587526040808a20828b5288528920805460ff1916600117905533818a600080516020620056448339815191528180a4620033de565b818b528789526040808c20828d528a528b20805460ff191660011790553391600080516020620056448339815191528c80a43880620033bb565b50600281861610620032e6565b503462000377578060031936011262000377576085546040805191901c6001600160401b03168152602090f35b5034620003775760403660031901126200037757620039de6020916040620039bf62003a0f565b9163ffffffff620039cf62003a23565b93168152608185522062004be6565b6040519015158152f35b90503462001755578160031936011262001755576084546001600160401b03168152602090f35b6004359063ffffffff82168203620005b857565b602435906001600160401b0382168203620005b857565b604435906001600160401b0382168203620005b857565b600435906001600160401b0382168203620005b857565b600435906001600160a01b0382168203620005b857565b606435906001600160a01b0382168203620005b857565b608435906001600160a01b0382168203620005b857565b60a435906001600160a01b0382168203620005b857565b602435906001600160a01b0382168203620005b857565b6103e0600319820112620005b85760043563ffffffff81168103620005b857916001600160401b036024358181168103620005b857926044358281168103620005b857926064358381168103620005b857926084359081168103620005b8579160a4359160c435916103e411620005b85760e490565b6103e0600319820112620005b85760043563ffffffff81168103620005b857916001600160401b03906024358281168103620005b857926044358381168103620005b857926064359081168103620005b857916084359160a4359160c4356001600160a01b0381168103620005b857916103e411620005b85760e490565b60005b83811062003be35750506000910152565b818101518382015260200162003bd2565b9060209162003c0f8151809281855285808601910162003bcf565b601f01601f1916010190565b6001600160401b0381116200058c57604052565b606081019081106001600160401b038211176200058c57604052565b608081019081106001600160401b038211176200058c57604052565b602081019081106001600160401b038211176200058c57604052565b601f909101601f19168101906001600160401b038211908210176200058c57604052565b6001600160401b0381116200058c5760051b60200190565b6001600160401b0381116200058c57601f01601f191660200190565b81601f82011215620005b85780359062003cf58262003cbf565b9262003d05604051948562003c83565b82845260208383010111620005b857816000926020809301838601378301015290565b1562003d3057565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b8054600160401b600160801b03191660409290921b600160401b600160801b0316919091179055565b63ffffffff80911690811462002d9f5760010190565b8054600160a01b600160e01b03191660a09290921b600160a01b600160e01b0316919091179055565b805460ff60801b191660809290921b60ff60801b16919091179055565b6001600160401b03918216908216019190821162002d9f57565b6001600160401b03918216908216039190821162002d9f57565b6040919493926060820195600180851b0316825260208201520152565b90816020910312620005b857518015158103620005b85790565b9291906103208401936103008092823701906000915b6001831062003ea057505050565b60019082518152602080910192019201919062003e92565b929591969390949660009162003ece8562004ba9565b60078601546001600160401b038085169990959294929186168a10620042eb578516908115620042a5575084600688015460801c1681116200429357600052600486016020526040600020978460028a0154995460401c160362004281575b838916978484168911156200426f5762003f4b928a8c938962004ceb565b9060409788519260008480835162003f6a816020998a80980162003bcf565b8101039060025afa15620042645760005160018701548a516001600160a01b039962003fd19387938c16919060008051602062005764833981519152900662003fb38462003c67565b83528d51809581948293634890ed4560e11b84526004840162003e7c565b03915afa908115620042595760009162004225575b501562004214579062003ff99162003e2b565b926200400462004c1a565b8385169081810291818304149015171562002d9f57885190878483019363a9059cbb60e01b8552166024830152604482015260448152620040458162003c4b565b867f0000000000000000000000000000000000000000000000000000000000000000168951918a8301838110878211176200058c578b528483527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648386015251620040e593600091829182855af13d156200420b573d91620040c78362003cbf565b92620040d68d51948562003c83565b83523d60008785013e620042fd565b8051908162004195575b505060845492600160401b600160801b039262004111925084891c1662003e11565b600160401b600160c01b031990921691861b16174260801b600160801b600160c01b031617608455541692833b15620005b857606460009283855196879485936332c2d15360e01b8552600485015260248401523360448401525af19081156200418b57506200417e5750565b620041899062003c1b565b565b513d6000823e3d90fd5b8280620041a793830101910162003e62565b15620041b5578080620040ef565b60849087519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152fd5b606091620042fd565b88516309bde33960e01b8152600490fd5b6200424a9150843d861162004251575b62004241818362003c83565b81019062003e62565b3862003fe6565b503d62004235565b8a513d6000823e3d90fd5b88513d6000823e3d90fd5b60405163b9b18f5760e01b8152600490fd5b604051632bd2e3e760e01b8152600490fd5b60405163bb14c20560e01b8152600490fd5b60409150898152600288016020522054978815620042d957848416101562003f2d57604051630f2b74f160e11b8152600490fd5b6040516324cbdcc360e11b8152600490fd5b60405163ead1340b60e01b8152600490fd5b9192901562004362575081511562004313575090565b3b156200431d5790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b825190915015620043765750805190602001fd5b60405162461bcd60e51b8152602060048201529081906200439c90602483019062003bf4565b0390fd5b60068101546001600160401b0390608081901c82169060c01c808211620043c8575b50505050565b60010191821162002d9f57620043df828462004be6565b620043ec575b80620043c2565b620044129060016001603f1b03906200440790849062003e2b565b60011c168262003e11565b906200441f828462004be6565b156200443a575062004431916200444d565b388080620043e5565b905062004447916200444d565b62004431565b6006810180546001600160401b03939192848316929160009060c081901c85118015918891620045db575b5050620045c95783815260048201602052604091828220968754841c1695620044a2878262003d8c565b60028881018054898652918401602052858520919091556001989098018054600584015581546001600160c01b031660c09690961b6001600160c01b0319169590951790556001600160a01b03907f000000000000000000000000000000000000000000000000000000000000000082166200451d62004970565b813b156200113757849160248392885194859384926333d6247d60e01b845260048401525af18015620045bf5793859363ffffffff9360809997937f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b9b9997620045a9575b505416815260826020522054169654915491815194855260208501528301526060820152a2565b620045b79093919362003c1b565b913862004582565b85513d86823e3d90fd5b60405163d086b70b60e01b8152600490fd5b60801c1685119050863862004478565b91929394969060009760018060401b039889600786015416928a8816938410620042eb578a16908115620047eb575089600686015460801c168111620042935780600052600485016020526040600020928a6002850154945460401c160362004281575b8960068601549616958a8160801c168711918215620047df575b508115620047d0575b50620047be5760048401968560005260209688885260409a808c600020548d1c1690831603620047ad57898894600094620046c694620046b3948a62004ceb565b838b519282848094519384920162003bcf565b8101039060025afa15620047a25760005160019092015487516200472e93869391926001600160a01b03169190600080516020620057648339815191529006620047108462003c67565b83528951809581948293634890ed4560e11b84526004840162003e7c565b03915afa908115620047a25760009162004780575b50156200476f57600052526002826000200154146200475f5750565b5163a47276bd60e01b8152600490fd5b84516309bde33960e01b8152600490fd5b6200479b9150833d8511620042515762004241818362003c83565b3862004743565b86513d6000823e3d90fd5b8a516332a2a77f60e01b8152600490fd5b60405163bfa7079f60e01b8152600490fd5b905060c01c8511153862004672565b87111591503862004669565b808460409252600287016020522054928315620042d9578a600687015460401c1610156200464f57604051630f2b74f160e11b8152600490fd5b9190820391821162002d9f57565b81156200483e570490565b634e487b7160e01b600052601260045260246000fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15620005b8576040518091632072f6c560e01b82528160046000948580945af18015620009db57620048eb575b50606f549060ff8216620015cf5760017f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a54979260ff191617606f5580a1565b620048f69062003c1b565b38620048ad565b90620049098262003ca7565b62004918604051918262003c83565b82815280926200492b601f199162003ca7565b0190602036910137565b600019811462002d9f5760010190565b80518210156200495a5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b63ffffffff8060805416801562004ba2576200498c81620048fd565b9160005b82811062004b6b5750509060006020915b60019081851462004af3578185811c95169182860180961162002d9f57620049c986620048fd565b9160009160001994858901898111945b8a811062004a1c5750505050505093916040805190602082019280845281830152815262004a078162003c2f565b51902092801562002d9f5701919092620049a1565b8562002d9f578181148062004ae9575b1562004a905780841b908082046002148115171562002d9f5762004a5562004a8a928762004945565b516040805190602082019283528c81830152815262004a748162003c2f565b51902062004a83828a62004945565b5262004935565b620049d9565b80841b908082046002148115171562002d9f5762004aaf828762004945565b5185830180931162002d9f5762004acb62004a8a938862004945565b5160408051916020830193845281830152815262004a748162003c2f565b5083831462004a2c565b919350508051156200495a5760200151916000905b82821062004b165750505090565b62004b6490604094855160208101918252828782015286815262004b3a8162003c2f565b51902094805190602082019280845281830152815262004b5a8162003c2f565b5190209162004935565b9062004b08565b600181019081811162002d9f578262004b9c9216600052608160205260056040600020015462004a83828762004945565b62004990565b5050600090565b60068101546001600160401b0391608082901c8316801562004bdd57600492506000520160205260406000205460401c1690565b505060401c1690565b60049060018060401b038093166000520160205262004c12816040600020541682608554169062003e11565b429116111590565b6040516370a0823160e01b81523060048201526020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811562004cdf5760009162004ca8575b506084546001600160401b039062004c9290604081901c831690831662003e2b565b16801562004ba25762004ca59162004833565b90565b906020823d821162004cd6575b8162004cc46020938362003c83565b81010312620003775750513862004c70565b3d915062004cb5565b6040513d6000823e3d90fd5b929390949160018060401b03948587166000948186526003870160205260409687872054998986168852888820549315158062004e05575b62004df457831562004de35762004d3a8362004e0e565b1562004dd2579060749160018254920154918a519c8d993360601b60208c015260348b015260548a015260018060c01b031998899485809460c01b1691015260201b16607c8c015260201b1660848a0152608c89015260ac88015260cc87015260c01b1660ec85015260d484526101008401928484109084111762004dbe57505290565b634e487b7160e01b81526041600452602490fd5b88516305dae44f60e21b8152600490fd5b88516366385b5160e01b8152600490fd5b885163340c614f60e11b8152600490fd5b508a1562004d23565b67ffffffff000000016001600160401b03828116821192908362004e6e575b8362004e5c575b508262004e4e575b50501562004e4957600190565b600090565b60c01c109050388062004e3c565b818392945060801c1610913862004e34565b925081838260401c16109262004e2d565b3360009081527fc17b14a573f65366cdad721c7c0a0f76536bb4a86b935cdac44610e4f010b52a602052604090205460ff1615620005a257565b3360009081527f3b72b60ab7bcf7b6e5f79e30b28eb2a39d66a2a278905c2bfcfdd4e1c0a1907b602052604090205460ff1615620005a257565b600052603460205260406000203360005260205260ff6040600020541615620005a257565b600080516020620058848339815191528060005260346020526001604060002001908154906000805160206200566483398151915280935560008051602062005684833981519152600080a4565b600080516020620058448339815191528060005260346020526001604060002001908154906000805160206200582483398151915280935560008051602062005684833981519152600080a4565b906000918083526034602052604083209160018060a01b03169182845260205260ff60408420541662004fe657505050565b8083526034602052604083208284526020526040832060ff1981541690557ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b339380a456fe604060a08152610618803803806100158161023b565b92833981016060828203126102365761002d82610276565b9060209161003c838501610276565b8585015190946001600160401b038211610236570182601f820112156102365780519061007061006b8361028a565b61023b565b9382855285838301011161023657849060005b83811061022257505060009184010152803b15610201577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b03199081166001600160a01b038481169182179093558751929691948794929390917fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a28151156101e0575090600080838861014695519101845af43d156101d8573d9161013761006b8461028a565b9283523d60008985013e6102a5565b505b8060805216917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f857fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103958587549483519286168352820152a182156101c057161790555161030f9081610309823960805181600f0152f35b8451633173bdd160e11b815260006004820152602490fd5b6060916102a5565b9293505050346101f257508390610148565b63b398979f60e01b8152600490fd5b8451634c9c8ce360e01b81526001600160a01b039091166004820152602490fd5b818101830151868201840152869201610083565b600080fd5b6040519190601f01601f191682016001600160401b0381118382101761026057604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b038216820361023657565b6001600160401b03811161026057601f01601f191660200190565b906102cc57508051156102ba57805190602001fd5b604051630a12f52160e11b8152600490fd5b815115806102ff575b6102dd575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b156102d556fe60806040526001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216036100df5760009081356001600160e01b03191663278f794360e11b141582036100df57366004116100db5760403660031901126100db576004359081168091036100db57602435906001600160401b0382116100d757366023830112156100d75781600401356100a86100a382610159565b61012f565b9281845236602483830101116100d357816100d195926024602093018387013784010152610174565b005b8480fd5b8280fd5b5080fd5b6000805160206102ba83398151915254600090819081906001600160a01b0316368280378136915af43d82803e15610115573d90f35b3d90fd5b634e487b7160e01b600052604160045260246000fd5b6040519190601f01601f191682016001600160401b0381118382101761015457604052565b610119565b6001600160401b03811161015457601f01601f191660200190565b90813b156101fa576000805160206102ba83398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a28051156101df576101dc9161021b565b50565b5050346101e857565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60008061024f93602081519101845af43d15610252573d9161023f6100a384610159565b9283523d6000602085013e610256565b90565b6060915b9061027d575080511561026b57805190602001fd5b604051630a12f52160e11b8152600490fd5b815115806102b0575b61028e575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b1561028656fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca264697066735822122066cbe29d5f5d924e31dcec6cf36e6701a714177c1368e4ed6d1bf766b15eb2a464736f6c634300081400332f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f0bd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024981c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68eaac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b4a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220a3c1fae9e6cb0e6566da09e533a165ecacaf5e202a1a2482f89015ba8d94194b64736f6c63430008140033", - "deployedBytecode": "0x60808060405260043610156200001457600080fd5b600090813560e01c908163066ec01214620039e857508063080b311114620039985780630a0d9fbe146200396b5780630e36f582146200327957806311f6b287146200322d57806312b86e1914620030aa5780631489ed101462002f5357806315064c961462002f2e5780631608859c1462002e885780631796a1ae1462002e625780631816b7e51462002db55780632072f6c51462002d15578063248a9ca31462002ce6578063252801691462002c315780632f2ff15d1462002b8857806336568abe1462002b39578063394218e91462002a84578063477fa2701462002a645780634d4d33381462001f7e57806355a71ee01462001f22578063604691691462001ed857806365c0504d1462001e535780637222020f1462001d7c5780637975fcfe1462001d035780637fb6e76a1462001cbf578063841b24d71462001c9c57806387c20c0114620017ef5780638bd4f07114620017595780638f698ec5146200165057806391d14854146200160057806399f5634e14620015e15780639a908e7314620014775780639c9f3dfe14620013cc578063a066215c146200132a578063a217fddf146200130c578063a2967d9914620012e5578063a3c573eb146200129e578063afd23cbe1462001277578063b99d0ad714620011ae578063c1acbc34146200117f578063c4c928c21462000eef578063ceee281d1462000eab578063d02103ca1462000e64578063d5073f6f1462000da9578063d547741f1462000d60578063d939b3151462000d35578063dbc169761462000c28578063dde0ff771462000bfb578063e0bfd3d21462000a5b578063e136edf71462000604578063e46761c414620005bd578063f34eb8eb14620003a0578063f4e92675146200037a5763f9c4c2ae14620002aa57600080fd5b3462000377576020366003190112620003775760406101809163ffffffff620002d262003a0f565b16815260816020522060ff815491600181015460058201549160076006820154910154926040519560018060a01b0393848216885260018060401b039485809360a01c1660208a01528116604089015260a01c166060870152608086015281811660a0860152818160401c1660c0860152818160801c1660e086015260c01c6101008501528082166101208501528160401c1661014084015260801c16610160820152f35b80fd5b50346200037757806003193601126200037757602063ffffffff60805416604051908152f35b5034620003775760c03660031901126200037757620003be62003a68565b620003c862003ac4565b90620003d362003a3a565b906064359160ff8316809303620005b8576001600160401b03926084359060a435858111620005b4576200040c90369060040162003cdb565b3360009081527fb3124b64d0942b276d75ea451f4dd8b83bf9442b427f9eb873ac771c92e65f02602052604090205490939060ff1615620005a257607e549663ffffffff6200045d818a1662003db5565b16809863ffffffff191617607e556040519060c0820190828210898311176200058c5789916040528a600160a01b6001900380991698898552806020860193169a8b84528060408701971696878152606087019289845280608089019580875260a08a01988d8a528152607f6020526040902098511690600160a01b600190031991828a54161789556001890196511690865416178555511662000502908462003dcb565b519082549060ff60e81b9051151560e81b169160ff60e01b9060e01b169061ffff60e01b1916171790555190600201556040519586958652602086015260408501526060840152608083015260a0820160c0905260c08201620005659162003bf4565b037fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5291a280f35b634e487b7160e01b600052604160045260246000fd5b604051637615be1f60e11b8152600490fd5b8780fd5b600080fd5b503462000377578060031936011262000377576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5034620003775761010036600319011262000377576200062362003a0f565b906200062e62003a23565b916044356001600160a01b0381168103620005b8576200064d62003a7f565b6200065762003a96565b9060a4359063ffffffff82168203620005b85760c4356001600160401b03811162000a57576200068c90369060040162003cdb565b916001600160401b0360e4351162000a5757620006af3660e43560040162003cdb565b3360009081527f41902c3bd358ff4b85ee46864bd81ee453a1b3cfd703a58950be8d28ae030661602052604090205490959060ff1615620005a25763ffffffff871615801562000a3f575b62000a2d5763ffffffff87168852607f6020526040882093600160ff8187015460e81c1615151462000a1b576001600160401b038a1689526083602052604089205463ffffffff1662000a09576080549563ffffffff6200075d81891662003db5565b1663ffffffff1997909716871760805585546040519b906001600160a01b0316620007888d62003c67565b8b8d52604051906001600160401b03610618830190811190831117620009f557620007d88d9e83926106186200502c85396106188401908152306020820152606060408201819052019062003bf4565b03908cf0968715620009ea5788927f9a84992ead4481f37097c7663e97ed883b31f216fae5685c6ee576a656483cd992620008e48d8f600160a096620008d78f600763ffffffff9160ff968e878060401b038c16825260836020526040822081861982541617905587808f1b038316825260826020526040822081861982541617905581526081602052604081209187808f1b031990888f81901b03168184541617835587870154906200089b898501928a8060401b039060a01c168362003dcb565b888f81901b03898901541690825416179055620008b98b8362003dcb565b60406002870154918080526002840160205220550195168562003d8c565b015460e01c169062003df4565b63ffffffff6040519d168d528c6020600180861b038c1691015260018060401b031660408d0152600180831b03169a8b606082015263ffffffff87166080820152a26001600160a01b0385163b15620009e657889662000999620009ac9263ffffffff8a966040519c8d9b8c9a8b996308fd7e2160e31b8b5260018060a01b031660048b015260018060a01b031660248a01526044890152606488015216608486015260e060a486015260e485019062003bf4565b8381036003190160c48501529062003bf4565b03926001600160a01b03165af18015620009db57620009c85750f35b620009d39062003c1b565b620003775780f35b6040513d84823e3d90fd5b8880fd5b6040513d8d823e3d90fd5b634e487b7160e01b8d52604160045260248dfd5b6040516337c8fe0960e11b8152600490fd5b604051633b8d3d9960e01b8152600490fd5b604051637512e5cb60e01b8152600490fd5b5063ffffffff607e541663ffffffff881611620006fa565b8680fd5b5034620003775760c036600319011262000377576004356001600160a01b038181169182900362000bf75762000a9062003ac4565b62000a9a62003a3a565b606435936001600160401b039081861690818703620005b85760a4359260ff841693848103620005b8573360009081527ff444741efd45fa05f38650e87f3d8ca01816575bed45a01e78186ae5f3bc8355602090815260409091205490999060ff1615620005a257848b5260838a5263ffffffff978860408d20541662000a09576080549862000b2c818b1662003db5565b16988963ffffffff19809216176080558660005260838c5260406000208a828254161790558560005260828c52896040600020918254161790558860005260818b52604060002099600160a01b60019003199086828d5416178c5560018c019262000b988b8562003dcb565b169082541617905562000bac908962003dcb565b62000bbb906007890162003df4565b6040519416845286840152604083015260608201526080600080516020620057a483398151915291a28280526002019052608435604082205580f35b8280fd5b503462000377578060031936011262000377576084546040805191901c6001600160401b03168152602090f35b503462000377578060031936011262000377573360009081527f307dd781c86f141a460373e0117a8033afea21c02f6121aff0f5b5553df24f4a602052604090205460ff1615620005a257807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1562000d3257818091600460405180948193636de0b4bb60e11b83525af18015620009db5762000d1a575b5050606f5460ff81161562000d085760ff1916606f557f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b38180a180f35b604051635386698160e01b8152600490fd5b62000d259062003c1b565b6200037757803862000ccb565b50fd5b503462000377578060031936011262000377576085546040516001600160401b039091168152602090f35b503462000377576040366003190112620003775762000da660043562000d8562003ac4565b90808452603460205262000da0600160408620015462004ef3565b62004fb4565b80f35b50346200037757602036600319011262000377573360009081527fe0205af17734f857fb538b40523c7cc189a1ab8f1ec33be516761c6b465766b660205260409020546004359060ff1615620005a257683635c9adc5dea000008111801562000e56575b62000e44576020817ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b292608655604051908152a180f35b604051638586952560e01b8152600490fd5b50633b9aca00811062000e0d565b503462000377578060031936011262000377576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503462000377576020366003190112620003775760209063ffffffff906040906001600160a01b0362000edd62003a68565b16815260828452205416604051908152f35b50346200037757606036600319011262000377576004356001600160a01b038181169182900362000bf75760243563ffffffff808216809203620005b8576001600160401b039260443584811162000a57573660238201121562000a5757806004013590858211620005b4573660248383010111620005b4573360009081527ff14f5a8ad59d90593602e905b358229bff5ceea677d5bf0f5a1701793550a9a6602090815260409091205490949060ff1615620005a2578515801562001171575b62000a2d57878952608285526040892054169687156200115f57878952608185526040892093600785019788549088818360401c16146200114d57888c52607f885260408c20916001830190815490600160ff8360e81c1615151462000a1b5760ff808360e01c169160801c16036200113b57600190980180546001600160a01b031916988516989098178855548c97620010519160a01c83169062003dcb565b6200105d898b62003d8c565b8a875260818852620010726040882062004ba9565b8a546001600160401b0319169116908117909955541690803b1562001137578492836064602494876040519889978896879463278f794360e11b8652600486015260408286015282604486015201848401378181018301849052601f01601f191681010301925af18015620009db576200111b575b5050907ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d926040928351928352820152a280f35b620011299093929362003c1b565b6200113757908438620010e7565b8480fd5b604051635aa0d5f160e11b8152600490fd5b604051634f61d51960e01b8152600490fd5b6040516374a086a360e01b8152600490fd5b5080607e5416861162000fb0565b5034620003775780600319360112620003775760845460405160809190911c6001600160401b03168152602090f35b50346200037757604036600319011262000377576080906040620011d162003a0f565b9163ffffffff620011e162003a23565b938260608551620011f28162003c4b565b828152826020820152828782015201521681526081602052600482822001600180841b03809416825260205220604051906200122e8262003c4b565b8054928084169384845281602085019160401c16815260606002600185015494604087019586520154940193845260405194855251166020840152516040830152516060820152f35b50346200037757806003193601126200037757602061ffff60855460801c16604051908152f35b503462000377578060031936011262000377576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5034620003775780600319360112620003775760206200130462004970565b604051908152f35b50346200037757806003193601126200037757602090604051908152f35b50346200037757602036600319011262000377576200134862003a51565b6200135262004eb9565b6001600160401b03811690620151808211620013ba5760858054600160401b600160801b031916604092831b600160401b600160801b0316179055519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602090a180f35b604051631c0cfbfd60e31b8152600490fd5b5034620003775760203660031901126200037757620013ea62003a51565b620013f462004eb9565b60ff606f5416156200144e575b608580546001600160401b0319166001600160401b0390921691821790556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602090a180f35b6085546001600160401b0390811690821610620014015760405163048a05a960e41b8152600490fd5b50346200037757604036600319011262000377576200149562003a51565b60ff606f5416620015cf573382526020916082835263ffffffff604082205416908115620015bd576001600160401b0383811615620015ab5762001574604083856200157a95526081885220916084549080620014f58882851662003e11565b169660018060401b0319978880941617608455600685018054836200151e818316948562003e11565b16998a911617905560405192620015358462003c2f565b60243584528260018b8601958242168752604081019485528b600052600389018d52604060002090518155019451169084541617835551169062003d8c565b620043a0565b7f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a2583604051848152a2604051908152f35b604051632590ccf960e01b8152600490fd5b6040516371653c1560e01b8152600490fd5b604051630bc011ff60e21b8152600490fd5b5034620003775780600319360112620003775760206200130462004c1a565b503462000377576040366003190112620003775760406200162062003ac4565b9160043581526034602052209060018060a01b0316600052602052602060ff604060002054166040519015158152f35b5034620003775760208060031936011262001755576004356001600160401b03811162000bf7573660238201121562000bf7578060040135620016938162003ca7565b92620016a3604051948562003c83565b8184528084019260249384600594851b83010191368311620005b45785849101915b83831062001744575050505063ffffffff8085511663ffffffff196080541617608055855b8551811015620017405762001700818762004945565b51600182018083116200172d57831688526081845260408820850155620017279062004935565b620016ea565b634e487b7160e01b895260116004528689fd5b8680f35b8235815291810191849101620016c5565b5080fd5b503462000377576200176b3662003adb565b60ff606f9895929698979493975416620015cf578560409784620017c6947f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a70109b8b8e63ffffffff60029c1681526081602052209889620045eb565b600180861b03166000520160205281600020549082519182526020820152a162000da662004854565b50346200037757620018013662003b51565b9060ff606f99989799969395965416620015cf5763ffffffff871688526081602052604088209860018060401b03871660005260038a016020526200185d60018060401b036001604060002001541660845460c01c9062003e11565b426001600160401b039091161162001c8a576103e86001600160401b0362001886868a62003e2b565b161162001c785784876200189d9588938d62003eb8565b620018a88662004ba9565b92958693866001600160401b03620018c1838862003e2b565b6085549391169190620018e2604085901c6001600160401b03164262004825565b9a5b6001600160401b038181169083161462001c61576001600160401b038181166000908152600388016020526040902060010154919082168d101562001936575060401c6001600160401b0316620018e4565b9250506200196392939495969798999a506200195a9060018060401b039262003e2b565b16809262004825565b918183101562001c05575003600c81111562001bfa57506200199d600c5b6086548161ffff60855460801c160a02906103e80a9062004833565b6086555b608654683635c9adc5dea00000908181111562001bd957506086555b6085546001600160401b031662001add578160056006830192620019e2878562003d8c565b60018060401b03871660005260028101602052856040600020550155805460018060401b038160801c1662001aca575b508590507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031662001a4a62004970565b813b1562000bf75782916024839260405194859384926333d6247d60e01b845260048401525af18015620009db5762001ab2575b5050600080516020620057e4833981519152915b62001aac60405192839263ffffffff339816968462003e45565b0390a380f35b62001abd9062003c1b565b6200113757843862001a7e565b6001600160801b03169055388062001a12565b62001aeb81939293620043a0565b6006810180546001600160401b03608082901c811690811462001bc557600160801b600160c01b0319909116600190910160801b600160801b600160c01b03161790819055604051600080516020620057e4833981519152949392909160029162001b568462003c4b565b426001600160401b039081168552888116602080870191825260408781018a8152606089018a815260809790971c85168f526004959095019091528c20955186546001600160401b0319169083161786555162001bb591168562003d8c565b5160018401555191015562001a92565b634e487b7160e01b89526011600452602489fd5b9050633b9aca0080911062001bf0575b50620019bd565b6086553862001be9565b6200199d9062001981565b9062001c4c9203600c811160001462001c55575062001c41600c915b670de0b6b3a76400009261ffff816103e80a9260801c160a830262004833565b906086540262004833565b608655620019a1565b62001c41909162001c21565b505080929394959697989950620019639162004825565b604051635acfba9d60e11b8152600490fd5b604051638a0704d360e01b8152600490fd5b50346200037757806003193601126200037757602060845460c01c604051908152f35b503462000377576020366003190112620003775760209063ffffffff906040906001600160401b0362001cf162003a51565b16815260838452205416604051908152f35b5034620003775760c0366003190112620003775762001d6362001d789162001d2a62003a0f565b9062001d3562003a23565b9063ffffffff62001d4562003a3a565b93168152608160205260a43592608435926040606435932062004ceb565b60405191829160208352602083019062003bf4565b0390f35b503462000377576020366003190112620003775762001d9a62003a0f565b3360009081527fd26c1f3d72948c9f5ca2b28d010847694e18f81d42613c046515d0839b64354c602052604090205460ff1615620005a25763ffffffff80911690811590811562001e44575b5062000a2d57808252607f602052600160408320018054600160ff8260e81c1615151462000a1b5760ff60e81b1916600160e81b1790557f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e448280a280f35b9050607e541681113862001de6565b5034620003775760203660031901126200037757604060c09163ffffffff62001e7b62003a0f565b168152607f6020522060018060a01b0360ff818354169260026001820154910154926040519485528116602085015260018060401b038160a01c166040850152818160e01c16606085015260e81c161515608083015260a0820152f35b503462000377578060031936011262000377576086549060648202918083046064149015171562001f0e57602082604051908152f35b634e487b7160e01b81526011600452602490fd5b50346200037757604036600319011262000377576002604062001f4462003a0f565b9263ffffffff62001f5462003a23565b94168152608160205220019060018060401b03166000526020526020604060002054604051908152f35b50346200037757610100366003190112620003775762001f9d62003a68565b9062001fa862003a23565b9162001fb362003a3a565b62001fbd62003a7f565b9362001fc862003a96565b9162001fd362003aad565b6001600160a01b039360c43585811694929190859003620005b45760e43598868a16809a03620005b8576101029389549060ff958287809460081c16158062002a57575b620020229062003d28565b61ffff191617808c5560858054608480546001600160c01b031660c09b909b1b6001600160c01b0319169a909a1790995567016345785d8a00006086556001600160801b03199098166001600160401b039283161760e160431b1761ffff60801b19166101f560811b179097559560081c1615620029fe576000805160206200588483398151915291828a52603492602099848b528960408d20911690816000528b52866040600020541615620029c1575b50508980528289528760408b2091169081600052895284604060002054161562002985575b60008051602062005724833981519152808b52838a5260408b20826000528a5285604060002054161562002948575b50600080516020620057c4833981519152808b52838a5260408b20826000528a528560406000205416156200290b575b50600080516020620056a483398151915290818b52838a5260408b20816000528a52856040600020541615620028ce575b505060008051602062005704833981519152808a528289528760408b2092169182600052895284604060002054161562002891575b5060008051602062005864833981519152808a5282895260408a2082600052895284604060002054161562002854575b5060008051602062005744833981519152808a5282895260408a2082600052895284604060002054161562002817575b5060008051602062005804833981519152808a5282895260408a20826000528952846040600020541615620027da575b506200225962004f18565b60008051602062005664833981519152808a5282895260408a208260005289528460406000205416156200279d575b50600080516020620056e483398151915290818a5282895260408a2081600052895284604060002054161562002760575b5050620022c562004f66565b600080516020620058448339815191528089528188528660408a2093169283600052885283604060002054161562002723575b506000805160206200582483398151915292838952818852604089208360005288526040600020541615620026e6575b5050506080549063ffffffff6200234181841662003db5565b16918263ffffffff198092161760805561044d90816000526083875260406000208482825416179055846000526082875283604060002091825416179055826000526081865260406000209283548560019a8b870163ffffffff60e01b91600560a01b90838354161717905561044d60a01b921617178455600080516020620057a48339815191526080600786019360ff821b1985541685556040519060058252888b830152604082015260006060820152a28160735460401c1692826074541690818503620026d457600690828a526075895260408a205483600052600282018a52604060002055858a526072895260408a2086600052600382018a52604060002090868d8284036200269f575b505050500180546001600160401b031990811686178255906200247590839062003d8c565b82541617905583607a541693606f5460581c16918652607285526040862054906073541691833b1562000a57576040519463176b20e160e31b86526004860152602485015260c0604485015260009660765480821c90828116801562002694575b888310811462002680578260c489015290816000146200266157506001146200261f575b506003198589030160648601526000976077549182811c92818116801562002614575b89851081146200260057848452908115620025e25750600114620025a4575b505050918386818199819583999a97608484015260a483015203925af18015620009db576200258c575b50600080516020620057848339815191528261ff0019835416835560405160028152a180f35b620025979062003c1b565b6200175557813862002566565b92985090607760005286600020926000935b828510620025ce57505050018401958386816200253c565b80548486018a0152938801938101620025b6565b60ff1916838a0152505090151560051b01850196508386816200253c565b634e487b7160e01b8c52602260045260248cfd5b93607f16936200251d565b90975060766000528560002086896000925b8484106200264b5750505060e491508501019638620024fa565b805460e4858b0101520191019089889162002631565b905060e492995060ff191682870152151560051b8501019638620024fa565b634e487b7160e01b8b52602260045260248bfd5b91607f1691620024d6565b80620026ca94845481550192018181541660018060401b03198454161783555460401c169062003d8c565b3880868d62002450565b604051632e4cc54360e11b8152600490fd5b8288528652604087208160005286526040600020600160ff198254161790553391600080516020620056448339815191528880a438808062002328565b808952818852604089208360005288526040600020600160ff19825416179055823391600080516020620056448339815191528b80a438620022f8565b818a5282895260408a208160005289526040600020600160ff198254161790553391600080516020620056448339815191528b80a43880620022b9565b808a5282895260408a208260005289526040600020600160ff19825416179055813391600080516020620056448339815191528c80a43862002288565b808a5282895260408a208260005289526040600020600160ff19825416179055813391600080516020620056448339815191528c80a4386200224e565b808a5282895260408a208260005289526040600020600160ff19825416179055813391600080516020620056448339815191528c80a4386200221e565b808a5282895260408a208260005289526040600020600160ff19825416179055813391600080516020620056448339815191528c80a438620021ee565b808a5282895260408a208260005289526040600020600160ff19825416179055813391600080516020620056448339815191528c80a438620021be565b818b52838a5260408b20816000528a526040600020600160ff198254161790553391600080516020620056448339815191528c80a4388062002189565b808b52838a5260408b20826000528a526040600020600160ff19825416179055813391600080516020620056448339815191528d80a43862002158565b808b52838a5260408b20826000528a526040600020600160ff19825416179055813391600080516020620056448339815191528d80a43862002128565b89805282895260408a208160005289526040600020600160ff1982541617905533818b600080516020620056448339815191528180a4620020f9565b818c52848b5260408c20816000528b526040600020600160ff198254161790553391600080516020620056448339815191528d80a43880620020d4565b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b5060028185161062002017565b503462000377578060031936011262000377576020608654604051908152f35b503462000377576020366003190112620003775762002aa262003a51565b62002aac62004eb9565b60ff606f54161562002b11575b608480546001600160c01b031660c083901b6001600160c01b0319161790556040516001600160401b0390911681527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602090a180f35b60845460c01c6001600160401b0382161062002ab95760405163401636df60e01b8152600490fd5b503462000377576040366003190112620003775762002b5762003ac4565b336001600160a01b0382160362002b765762000da69060043562004fb4565b604051630b4ad1cd60e31b8152600490fd5b503462000377576040366003190112620003775760043562002ba962003ac4565b818352603460205262002bc3600160408520015462004ef3565b8183526034602052604083209060018060a01b0316908160005260205260ff604060002054161562002bf3578280f35b818352603460205260408320816000526020526040600020600160ff198254161790553391600080516020620056448339815191528480a438808280f35b50346200037757604036600319011262000377576060906003604062002c5662003a0f565b9263ffffffff62002c6662003a23565b948284805162002c768162003c2f565b82815282602082015201521681526081602052200160018060401b0380921660005260205260406000209060405162002caf8162003c2f565b81600184549485845201549181604060208301928286168452019360401c1683526040519485525116602084015251166040820152f35b503462000377576020366003190112620003775760016040602092600435815260348452200154604051908152f35b503462000377578060031936011262000377576000805160206200584483398151915281526034602052604081203360005260205260ff604060002054161562002d64575b62000da662004854565b60845460801c6001600160401b0390811662093a80019080821162002d9f57429116111562002d5a5760405163692baaad60e11b8152600490fd5b634e487b7160e01b600052601160045260246000fd5b503462000377576020366003190112620003775760043561ffff81169081810362000bf75762002de462004eb9565b6103e88210801562002e56575b62002e44576085805461ffff60801b191660809290921b61ffff60801b169190911790556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c590602090a180f35b604051630984a67960e31b8152600490fd5b506103ff821162002df1565b50346200037757806003193601126200037757602063ffffffff607e5416604051908152f35b503462000377576040366003190112620003775762002ea662003a0f565b63ffffffff62002eb562003a23565b91168252608160205260408220906000805160206200588483398151915283526034602052604083203360005260205260ff604060002054161562002f00575b62000da6916200444d565b60ff606f5416620015cf5762002f17818362004be6565b62002ef557604051630674f25160e11b8152600490fd5b50346200037757806003193601126200037757602060ff606f54166040519015158152f35b5034620003775762002f9c63ffffffff62002f6e3662003b51565b928481979699849962002f869c979c95949562004e7f565b16998a8d52608160205260408d20978862003eb8565b600681019062002fad868362003d8c565b82600560018060401b0392838916600052600281016020528660406000205501558154908160801c1662003097575b508590507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166200301462004970565b813b1562000bf75782916024839260405194859384926333d6247d60e01b845260048401525af18015620009db576200307f575b50507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39162001aac60405192839233978462003e45565b6200308a9062003c1b565b6200113757843862003048565b6001600160801b03169055388062002fdc565b50346200037757620030f263ffffffff620030c53662003adb565b92809599948297998499620030dc95949562004e7f565b169a8b8d52608160205260408d209a8b620045eb565b600684019062003103818362003d8c565b83600560018060401b0380931696878a52600281016020528560408b205501558154908160801c166200321a575b508590507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166200316962004970565b90803b1562000bf7576024839260405194859384926333d6247d60e01b845260048401525af180156200320f57620031e3575b50608480546001600160c01b031661127560c71b179055604080519384526020840191909152820152336060820152600080516020620056c483398151915290608090a280f35b91600080516020620056c48339815191529391956200320460809462003c1b565b95919350916200319c565b6040513d88823e3d90fd5b6001600160801b03169055388062003131565b503462000377576020366003190112620003775762003267604060209263ffffffff6200325962003a0f565b168152608184522062004ba9565b6040516001600160401b039091168152f35b5034620003775760c036600319011262000377576200329762003a68565b620032a162003a23565b620032ab62003a3a565b90610102620032b962003a7f565b92620032c462003a96565b92620032cf62003aad565b9187549160ff948386809560081c1615806200395e575b620032f19062003d28565b61ffff191617808a5560858054608480546001600160c01b031660c09690961b6001600160c01b0319169590951790945567016345785d8a00006086556001600160801b03199093166001600160401b039092169190911760e160431b1761ffff60801b19166101f560811b1790915560081c1615620029fe576000805160206200578483398151915294600080516020620058848339815191529485885260349460209686885260408a2060018060a01b0380951690818c5289528660408c2054161562003924575b50508880528587528260408a20911690818a5287528460408a20541615620038eb575b60008051602062005724833981519152808a5286885260408a20828b5288528560408b20541615620038b0575b50600080516020620057c4833981519152808a5286885260408a20828b5288528560408b2054161562003875575b50600080516020620056a483398151915290818a5286885260408a20818b5288528560408b205416156200383b575b5050600080516020620057048339815191528089528587528260408a20921691828a5287528460408a2054161562003800575b506000805160206200586483398151915280895285875260408920828a5287528460408a20541615620037c5575b506000805160206200574483398151915280895285875260408920828a5287528460408a205416156200378a575b506000805160206200580483398151915280895285875260408920828a5287528460408a205416156200374f575b506200353062004f18565b6000805160206200566483398151915280895285875260408920828a5287528460408a2054161562003714575b50600080516020620056e48339815191529081895285875260408920818a5287528460408a20541615620036da575b50506200359862004f66565b600080516020620058448339815191529081885284865260408820921691828852855282604088205416156200369f575b506000805160206200582483398151915290818752838552604087208188528552826040882054161562003665575b5050848052818352604085203386528352604085205416156200362b575b50825461ff001916835560405160028152a180f35b838052815260408320338452815260408320600160ff19825416179055333384600080516020620056448339815191528180a43862003616565b818752838552604080882082895286528720805460ff191660011790553391600080516020620056448339815191528880a43880620035f8565b80875283855260408720828852855260408720600160ff19825416179055813391600080516020620056448339815191528980a438620035c9565b8189528587526040808a20828b5288528920805460ff191660011790553391600080516020620056448339815191528a80a438806200358c565b80895285875260408920828a52875260408920600160ff19825416179055813391600080516020620056448339815191528b80a4386200355d565b80895285875260408920828a52875260408920600160ff19825416179055813391600080516020620056448339815191528b80a43862003525565b80895285875260408920828a52875260408920600160ff19825416179055813391600080516020620056448339815191528b80a438620034f7565b80895285875260408920828a52875260408920600160ff19825416179055813391600080516020620056448339815191528b80a438620034c9565b80895285875260408920828a52875260408920600160ff19825416179055813391600080516020620056448339815191528b80a4386200349b565b818a528688526040808b20828c5289528a20805460ff191660011790553391600080516020620056448339815191528b80a4388062003468565b808a5286885260408a20828b52885260408a20600160ff19825416179055813391600080516020620056448339815191528c80a43862003439565b808a5286885260408a20828b52885260408a20600160ff19825416179055813391600080516020620056448339815191528c80a4386200340b565b8880528587526040808a20828b5288528920805460ff1916600117905533818a600080516020620056448339815191528180a4620033de565b818b528789526040808c20828d528a528b20805460ff191660011790553391600080516020620056448339815191528c80a43880620033bb565b50600281861610620032e6565b503462000377578060031936011262000377576085546040805191901c6001600160401b03168152602090f35b5034620003775760403660031901126200037757620039de6020916040620039bf62003a0f565b9163ffffffff620039cf62003a23565b93168152608185522062004be6565b6040519015158152f35b90503462001755578160031936011262001755576084546001600160401b03168152602090f35b6004359063ffffffff82168203620005b857565b602435906001600160401b0382168203620005b857565b604435906001600160401b0382168203620005b857565b600435906001600160401b0382168203620005b857565b600435906001600160a01b0382168203620005b857565b606435906001600160a01b0382168203620005b857565b608435906001600160a01b0382168203620005b857565b60a435906001600160a01b0382168203620005b857565b602435906001600160a01b0382168203620005b857565b6103e0600319820112620005b85760043563ffffffff81168103620005b857916001600160401b036024358181168103620005b857926044358281168103620005b857926064358381168103620005b857926084359081168103620005b8579160a4359160c435916103e411620005b85760e490565b6103e0600319820112620005b85760043563ffffffff81168103620005b857916001600160401b03906024358281168103620005b857926044358381168103620005b857926064359081168103620005b857916084359160a4359160c4356001600160a01b0381168103620005b857916103e411620005b85760e490565b60005b83811062003be35750506000910152565b818101518382015260200162003bd2565b9060209162003c0f8151809281855285808601910162003bcf565b601f01601f1916010190565b6001600160401b0381116200058c57604052565b606081019081106001600160401b038211176200058c57604052565b608081019081106001600160401b038211176200058c57604052565b602081019081106001600160401b038211176200058c57604052565b601f909101601f19168101906001600160401b038211908210176200058c57604052565b6001600160401b0381116200058c5760051b60200190565b6001600160401b0381116200058c57601f01601f191660200190565b81601f82011215620005b85780359062003cf58262003cbf565b9262003d05604051948562003c83565b82845260208383010111620005b857816000926020809301838601378301015290565b1562003d3057565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b8054600160401b600160801b03191660409290921b600160401b600160801b0316919091179055565b63ffffffff80911690811462002d9f5760010190565b8054600160a01b600160e01b03191660a09290921b600160a01b600160e01b0316919091179055565b805460ff60801b191660809290921b60ff60801b16919091179055565b6001600160401b03918216908216019190821162002d9f57565b6001600160401b03918216908216039190821162002d9f57565b6040919493926060820195600180851b0316825260208201520152565b90816020910312620005b857518015158103620005b85790565b9291906103208401936103008092823701906000915b6001831062003ea057505050565b60019082518152602080910192019201919062003e92565b929591969390949660009162003ece8562004ba9565b60078601546001600160401b038085169990959294929186168a10620042eb578516908115620042a5575084600688015460801c1681116200429357600052600486016020526040600020978460028a0154995460401c160362004281575b838916978484168911156200426f5762003f4b928a8c938962004ceb565b9060409788519260008480835162003f6a816020998a80980162003bcf565b8101039060025afa15620042645760005160018701548a516001600160a01b039962003fd19387938c16919060008051602062005764833981519152900662003fb38462003c67565b83528d51809581948293634890ed4560e11b84526004840162003e7c565b03915afa908115620042595760009162004225575b501562004214579062003ff99162003e2b565b926200400462004c1a565b8385169081810291818304149015171562002d9f57885190878483019363a9059cbb60e01b8552166024830152604482015260448152620040458162003c4b565b867f0000000000000000000000000000000000000000000000000000000000000000168951918a8301838110878211176200058c578b528483527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648386015251620040e593600091829182855af13d156200420b573d91620040c78362003cbf565b92620040d68d51948562003c83565b83523d60008785013e620042fd565b8051908162004195575b505060845492600160401b600160801b039262004111925084891c1662003e11565b600160401b600160c01b031990921691861b16174260801b600160801b600160c01b031617608455541692833b15620005b857606460009283855196879485936332c2d15360e01b8552600485015260248401523360448401525af19081156200418b57506200417e5750565b620041899062003c1b565b565b513d6000823e3d90fd5b8280620041a793830101910162003e62565b15620041b5578080620040ef565b60849087519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152fd5b606091620042fd565b88516309bde33960e01b8152600490fd5b6200424a9150843d861162004251575b62004241818362003c83565b81019062003e62565b3862003fe6565b503d62004235565b8a513d6000823e3d90fd5b88513d6000823e3d90fd5b60405163b9b18f5760e01b8152600490fd5b604051632bd2e3e760e01b8152600490fd5b60405163bb14c20560e01b8152600490fd5b60409150898152600288016020522054978815620042d957848416101562003f2d57604051630f2b74f160e11b8152600490fd5b6040516324cbdcc360e11b8152600490fd5b60405163ead1340b60e01b8152600490fd5b9192901562004362575081511562004313575090565b3b156200431d5790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b825190915015620043765750805190602001fd5b60405162461bcd60e51b8152602060048201529081906200439c90602483019062003bf4565b0390fd5b60068101546001600160401b0390608081901c82169060c01c808211620043c8575b50505050565b60010191821162002d9f57620043df828462004be6565b620043ec575b80620043c2565b620044129060016001603f1b03906200440790849062003e2b565b60011c168262003e11565b906200441f828462004be6565b156200443a575062004431916200444d565b388080620043e5565b905062004447916200444d565b62004431565b6006810180546001600160401b03939192848316929160009060c081901c85118015918891620045db575b5050620045c95783815260048201602052604091828220968754841c1695620044a2878262003d8c565b60028881018054898652918401602052858520919091556001989098018054600584015581546001600160c01b031660c09690961b6001600160c01b0319169590951790556001600160a01b03907f000000000000000000000000000000000000000000000000000000000000000082166200451d62004970565b813b156200113757849160248392885194859384926333d6247d60e01b845260048401525af18015620045bf5793859363ffffffff9360809997937f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b9b9997620045a9575b505416815260826020522054169654915491815194855260208501528301526060820152a2565b620045b79093919362003c1b565b913862004582565b85513d86823e3d90fd5b60405163d086b70b60e01b8152600490fd5b60801c1685119050863862004478565b91929394969060009760018060401b039889600786015416928a8816938410620042eb578a16908115620047eb575089600686015460801c168111620042935780600052600485016020526040600020928a6002850154945460401c160362004281575b8960068601549616958a8160801c168711918215620047df575b508115620047d0575b50620047be5760048401968560005260209688885260409a808c600020548d1c1690831603620047ad57898894600094620046c694620046b3948a62004ceb565b838b519282848094519384920162003bcf565b8101039060025afa15620047a25760005160019092015487516200472e93869391926001600160a01b03169190600080516020620057648339815191529006620047108462003c67565b83528951809581948293634890ed4560e11b84526004840162003e7c565b03915afa908115620047a25760009162004780575b50156200476f57600052526002826000200154146200475f5750565b5163a47276bd60e01b8152600490fd5b84516309bde33960e01b8152600490fd5b6200479b9150833d8511620042515762004241818362003c83565b3862004743565b86513d6000823e3d90fd5b8a516332a2a77f60e01b8152600490fd5b60405163bfa7079f60e01b8152600490fd5b905060c01c8511153862004672565b87111591503862004669565b808460409252600287016020522054928315620042d9578a600687015460401c1610156200464f57604051630f2b74f160e11b8152600490fd5b9190820391821162002d9f57565b81156200483e570490565b634e487b7160e01b600052601260045260246000fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15620005b8576040518091632072f6c560e01b82528160046000948580945af18015620009db57620048eb575b50606f549060ff8216620015cf5760017f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a54979260ff191617606f5580a1565b620048f69062003c1b565b38620048ad565b90620049098262003ca7565b62004918604051918262003c83565b82815280926200492b601f199162003ca7565b0190602036910137565b600019811462002d9f5760010190565b80518210156200495a5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b63ffffffff8060805416801562004ba2576200498c81620048fd565b9160005b82811062004b6b5750509060006020915b60019081851462004af3578185811c95169182860180961162002d9f57620049c986620048fd565b9160009160001994858901898111945b8a811062004a1c5750505050505093916040805190602082019280845281830152815262004a078162003c2f565b51902092801562002d9f5701919092620049a1565b8562002d9f578181148062004ae9575b1562004a905780841b908082046002148115171562002d9f5762004a5562004a8a928762004945565b516040805190602082019283528c81830152815262004a748162003c2f565b51902062004a83828a62004945565b5262004935565b620049d9565b80841b908082046002148115171562002d9f5762004aaf828762004945565b5185830180931162002d9f5762004acb62004a8a938862004945565b5160408051916020830193845281830152815262004a748162003c2f565b5083831462004a2c565b919350508051156200495a5760200151916000905b82821062004b165750505090565b62004b6490604094855160208101918252828782015286815262004b3a8162003c2f565b51902094805190602082019280845281830152815262004b5a8162003c2f565b5190209162004935565b9062004b08565b600181019081811162002d9f578262004b9c9216600052608160205260056040600020015462004a83828762004945565b62004990565b5050600090565b60068101546001600160401b0391608082901c8316801562004bdd57600492506000520160205260406000205460401c1690565b505060401c1690565b60049060018060401b038093166000520160205262004c12816040600020541682608554169062003e11565b429116111590565b6040516370a0823160e01b81523060048201526020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811562004cdf5760009162004ca8575b506084546001600160401b039062004c9290604081901c831690831662003e2b565b16801562004ba25762004ca59162004833565b90565b906020823d821162004cd6575b8162004cc46020938362003c83565b81010312620003775750513862004c70565b3d915062004cb5565b6040513d6000823e3d90fd5b929390949160018060401b03948587166000948186526003870160205260409687872054998986168852888820549315158062004e05575b62004df457831562004de35762004d3a8362004e0e565b1562004dd2579060749160018254920154918a519c8d993360601b60208c015260348b015260548a015260018060c01b031998899485809460c01b1691015260201b16607c8c015260201b1660848a0152608c89015260ac88015260cc87015260c01b1660ec85015260d484526101008401928484109084111762004dbe57505290565b634e487b7160e01b81526041600452602490fd5b88516305dae44f60e21b8152600490fd5b88516366385b5160e01b8152600490fd5b885163340c614f60e11b8152600490fd5b508a1562004d23565b67ffffffff000000016001600160401b03828116821192908362004e6e575b8362004e5c575b508262004e4e575b50501562004e4957600190565b600090565b60c01c109050388062004e3c565b818392945060801c1610913862004e34565b925081838260401c16109262004e2d565b3360009081527fc17b14a573f65366cdad721c7c0a0f76536bb4a86b935cdac44610e4f010b52a602052604090205460ff1615620005a257565b3360009081527f3b72b60ab7bcf7b6e5f79e30b28eb2a39d66a2a278905c2bfcfdd4e1c0a1907b602052604090205460ff1615620005a257565b600052603460205260406000203360005260205260ff6040600020541615620005a257565b600080516020620058848339815191528060005260346020526001604060002001908154906000805160206200566483398151915280935560008051602062005684833981519152600080a4565b600080516020620058448339815191528060005260346020526001604060002001908154906000805160206200582483398151915280935560008051602062005684833981519152600080a4565b906000918083526034602052604083209160018060a01b03169182845260205260ff60408420541662004fe657505050565b8083526034602052604083208284526020526040832060ff1981541690557ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b339380a456fe604060a08152610618803803806100158161023b565b92833981016060828203126102365761002d82610276565b9060209161003c838501610276565b8585015190946001600160401b038211610236570182601f820112156102365780519061007061006b8361028a565b61023b565b9382855285838301011161023657849060005b83811061022257505060009184010152803b15610201577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b03199081166001600160a01b038481169182179093558751929691948794929390917fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a28151156101e0575090600080838861014695519101845af43d156101d8573d9161013761006b8461028a565b9283523d60008985013e6102a5565b505b8060805216917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f857fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103958587549483519286168352820152a182156101c057161790555161030f9081610309823960805181600f0152f35b8451633173bdd160e11b815260006004820152602490fd5b6060916102a5565b9293505050346101f257508390610148565b63b398979f60e01b8152600490fd5b8451634c9c8ce360e01b81526001600160a01b039091166004820152602490fd5b818101830151868201840152869201610083565b600080fd5b6040519190601f01601f191682016001600160401b0381118382101761026057604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b038216820361023657565b6001600160401b03811161026057601f01601f191660200190565b906102cc57508051156102ba57805190602001fd5b604051630a12f52160e11b8152600490fd5b815115806102ff575b6102dd575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b156102d556fe60806040526001600160a01b03337f00000000000000000000000000000000000000000000000000000000000000008216036100df5760009081356001600160e01b03191663278f794360e11b141582036100df57366004116100db5760403660031901126100db576004359081168091036100db57602435906001600160401b0382116100d757366023830112156100d75781600401356100a86100a382610159565b61012f565b9281845236602483830101116100d357816100d195926024602093018387013784010152610174565b005b8480fd5b8280fd5b5080fd5b6000805160206102ba83398151915254600090819081906001600160a01b0316368280378136915af43d82803e15610115573d90f35b3d90fd5b634e487b7160e01b600052604160045260246000fd5b6040519190601f01601f191682016001600160401b0381118382101761015457604052565b610119565b6001600160401b03811161015457601f01601f191660200190565b90813b156101fa576000805160206102ba83398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a28051156101df576101dc9161021b565b50565b5050346101e857565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60008061024f93602081519101845af43d15610252573d9161023f6100a384610159565b9283523d6000602085013e610256565b90565b6060915b9061027d575080511561026b57805190602001fd5b604051630a12f52160e11b8152600490fd5b815115806102b0575b61028e575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b1561028656fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca264697066735822122066cbe29d5f5d924e31dcec6cf36e6701a714177c1368e4ed6d1bf766b15eb2a464736f6c634300081400332f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f0bd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024981c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68eaac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b4a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220a3c1fae9e6cb0e6566da09e533a165ecacaf5e202a1a2482f89015ba8d94194b64736f6c63430008140033", + "bytecode": "0x60e06040523480156200001157600080fd5b50604051620061a5380380620061a583398101604081905262000034916200006b565b6001600160a01b0392831660805290821660c0521660a052620000bf565b6001600160a01b03811681146200006857600080fd5b50565b6000806000606084860312156200008157600080fd5b83516200008e8162000052565b6020850151909350620000a18162000052565b6040850151909250620000b48162000052565b809150509250925092565b60805160a05160c05161607e62000127600039600081816109bc015281816122ba015261390a01526000818161078201528181612e090152613c0401526000818161091601528181610eca0152818161107a01528181611f9a0152613af3015261607e6000f3fe60806040523480156200001157600080fd5b5060043610620002aa5760003560e01c8063066ec01214620002af578063080b311114620002db5780630a0d9fbe14620003035780630e36f582146200031e57806311f6b287146200033757806312b86e19146200034e5780631489ed10146200036557806315064c96146200037c5780631608859c146200038a5780631796a1ae14620003a15780631816b7e514620003c85780632072f6c514620003df578063248a9ca314620003e957806325280169146200040f5780632f2ff15d14620004c457806336568abe14620004db578063394218e914620004f2578063477fa27014620005095780634d4d3338146200051257806355a71ee0146200052957806360469169146200056d57806365c0504d14620005775780637222020f1462000626578063727885e9146200063d5780637975fcfe14620006545780637fb6e76a146200067a578063841b24d714620006a357806387c20c0114620006be5780638bd4f07114620006d55780638f698ec514620006ec57806391d14854146200070357806399f5634e146200071a5780639a908e7314620007245780639c9f3dfe146200073b578063a066215c1462000752578063a217fddf1462000769578063a2967d991462000772578063a3c573eb146200077c578063afd23cbe14620007b3578063b99d0ad714620007dd578063c1acbc3414620008b5578063c4c928c214620008d0578063ceee281d14620008e7578063d02103ca1462000910578063d5073f6f1462000938578063d547741f146200094f578063d939b3151462000966578063dbc16976146200097a578063dde0ff771462000984578063e0bfd3d2146200099f578063e46761c414620009b6578063f34eb8eb14620009de578063f4e9267514620009f5578063f9c4c2ae1462000a06575b600080fd5b608454620002c3906001600160401b031681565b604051620002d29190620047b2565b60405180910390f35b620002f2620002ec366004620047f3565b62000b1d565b6040519015158152602001620002d2565b608554620002c390600160401b90046001600160401b031681565b620003356200032f36600462004841565b62000b47565b005b620002c362000348366004620048cc565b62000dfe565b620003356200035f366004620048fd565b62000e1e565b620003356200037636600462004994565b62000fce565b606f54620002f29060ff1681565b620003356200039b366004620047f3565b6200115e565b607e54620003b29063ffffffff1681565b60405163ffffffff9091168152602001620002d2565b62000335620003d936600462004a1e565b620011f3565b620003356200129f565b62000400620003fa36600462004a4b565b62001335565b604051908152602001620002d2565b6200049062000420366004620047f3565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002d2565b62000335620004d536600462004a65565b6200134a565b62000335620004ec36600462004a65565b6200136c565b620003356200050336600462004a98565b620013a6565b60865462000400565b620003356200052336600462004ab6565b62001455565b620004006200053a366004620047f3565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620004006200188b565b620005dc62000588366004620048cc565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002d2565b6200033562000637366004620048cc565b620018a3565b620003356200064e36600462004c2b565b6200198e565b6200066b6200066536600462004cf8565b62001df6565b604051620002d2919062004db2565b620003b26200068b36600462004a98565b60836020526000908152604090205463ffffffff1681565b608454620002c390600160c01b90046001600160401b031681565b62000335620006cf36600462004994565b62001e29565b62000335620006e6366004620048fd565b6200214d565b62000335620006fd36600462004dc7565b62002203565b620002f26200071436600462004a65565b6200228a565b62000400620022b5565b620002c36200073536600462004e77565b620023a1565b620003356200074c36600462004a98565b6200256e565b620003356200076336600462004a98565b62002611565b62000400600081565b62000400620026b0565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b604051620002d2919062004ea4565b608554620007c990600160801b900461ffff1681565b60405161ffff9091168152602001620002d2565b62000873620007ee366004620047f3565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002d2919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002c390600160801b90046001600160401b031681565b62000335620008e136600462004eb8565b62002a72565b620003b2620008f836600462004f50565b60826020526000908152604090205463ffffffff1681565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b620003356200094936600462004a4b565b62002d3f565b620003356200096036600462004a65565b62002dca565b608554620002c3906001600160401b031681565b6200033562002dec565b608454620002c390600160401b90046001600160401b031681565b62000335620009b036600462004f82565b62002e89565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b62000335620009ef36600462004ffe565b62002f11565b608054620003b29063ffffffff1681565b62000a9d62000a17366004620048cc565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002d2565b63ffffffff8216600090815260816020526040812062000b3e9083620030fc565b90505b92915050565b600054600290610100900460ff1615801562000b6a575060005460ff8083169116105b62000b925760405162461bcd60e51b815260040162000b899062005095565b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c1362003141565b62000c2e6000805160206200602983398151915288620031ae565b62000c3b600084620031ae565b62000c5660008051602062005f0983398151915284620031ae565b62000c7160008051602062005f8983398151915284620031ae565b62000c8c60008051602062005ea983398151915284620031ae565b62000ca760008051602062005ee983398151915285620031ae565b62000cc26000805160206200600983398151915285620031ae565b62000cdd60008051602062005f2983398151915285620031ae565b62000cf860008051602062005fa983398151915285620031ae565b62000d226000805160206200602983398151915260008051602062005e89833981519152620031ba565b62000d3d60008051602062005e8983398151915285620031ae565b62000d5860008051602062005ec983398151915285620031ae565b62000d8260008051602062005fe983398151915260008051602062005fc9833981519152620031ba565b62000d9d60008051602062005fe983398151915283620031ae565b62000db860008051602062005fc983398151915283620031ae565b62000dc5600033620031ae565b6000805461ff001916905560405160ff8216815260008051602062005f698339815191529060200160405180910390a150505050505050565b63ffffffff8116600090815260816020526040812062000b41906200320f565b6000805160206200602983398151915262000e398162003280565b63ffffffff8916600090815260816020526040902062000e60818a8a8a8a8a8a8a6200328c565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000ec8576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000f01620026b0565b6040518263ffffffff1660e01b815260040162000f2091815260200190565b600060405180830381600087803b15801562000f3b57600080fd5b505af115801562000f50573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b6000805160206200602983398151915262000fe98162003280565b63ffffffff8916600090815260816020526040902062001010818a8a8a8a8a8a8a62003614565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562001078576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620010b1620026b0565b6040518263ffffffff1660e01b8152600401620010d091815260200190565b600060405180830381600087803b158015620010eb57600080fd5b505af115801562001100573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a6040516200114a93929190620050e3565b60405180910390a350505050505050505050565b63ffffffff821660009081526081602052604090206200118e60008051602062006029833981519152336200228a565b620011e257606f5460ff1615620011b857604051630bc011ff60e21b815260040160405180910390fd5b620011c48183620030fc565b620011e257604051630674f25160e11b815260040160405180910390fd5b620011ee818362003a10565b505050565b60008051602062005fa98339815191526200120e8162003280565b6103e88261ffff1610806200122857506103ff8261ffff16115b156200124757604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620012ba60008051602062005fe9833981519152336200228a565b6200132957608454600160801b90046001600160401b031615806200130a57506084544290620012ff9062093a8090600160801b90046001600160401b03166200511a565b6001600160401b0316115b15620013295760405163692baaad60e11b815260040160405180910390fd5b6200133362003c02565b565b60009081526034602052604090206001015490565b620013558262001335565b620013608162003280565b620011ee838362003c81565b6001600160a01b03811633146200139657604051630b4ad1cd60e31b815260040160405180910390fd5b620013a2828262003ced565b5050565b60008051602062005fa9833981519152620013c18162003280565b606f5460ff1662001403576084546001600160401b03600160c01b909104811690831610620014035760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19062001293908490620047b2565b600054600290610100900460ff1615801562001478575060005460ff8083169116105b620014975760405162461bcd60e51b815260040162000b899062005095565b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200151862003141565b62001533600080516020620060298339815191528a620031ae565b62001540600086620031ae565b6200155b60008051602062005f0983398151915286620031ae565b6200157660008051602062005f8983398151915286620031ae565b6200159160008051602062005ea983398151915286620031ae565b620015ac60008051602062005ee983398151915287620031ae565b620015c76000805160206200600983398151915287620031ae565b620015e260008051602062005f2983398151915287620031ae565b620015fd60008051602062005fa983398151915287620031ae565b620016276000805160206200602983398151915260008051602062005e89833981519152620031ba565b6200164260008051602062005e8983398151915287620031ae565b6200165d60008051602062005ec983398151915287620031ae565b6200168760008051602062005fe983398151915260008051602062005fc9833981519152620031ba565b620016a260008051602062005fe983398151915285620031ae565b620016bd60008051602062005fc983398151915285620031ae565b6000620016d28484600561044d600062003d57565b6073546074549192506001600160401b03600160401b909104811691168082146200171057604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b0381811660008181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620018119695831695600160581b9091049092169360769360779391929190911690600401620051f0565b600060405180830381600087803b1580156200182c57600080fd5b505af115801562001841573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff8516815260008051602062005f6983398151915293506020019150620018789050565b60405180910390a1505050505050505050565b600060865460646200189e919062005256565b905090565b60008051602062005ee9833981519152620018be8162003280565b63ffffffff82161580620018dd5750607e5463ffffffff908116908316115b15620018fc57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200194357604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b60008051602062006009833981519152620019a98162003280565b63ffffffff88161580620019c85750607e5463ffffffff908116908916115b15620019e757604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff161515900362001a2e57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001a6c576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062001a879063ffffffff1662005270565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001ad590620047a4565b62001ae39392919062005296565b604051809103906000f08015801562001b00573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001d74949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001db4908d908d9088908e908e908e90600401620052cd565b600060405180830381600087803b15801562001dcf57600080fd5b505af115801562001de4573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001e1e90878787878762003f7c565b979650505050505050565b606f5460ff161562001e4e57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001e9d92600160c01b9004811691166200511a565b6001600160401b0316111562001ec657604051638a0704d360e01b815260040160405180910390fd5b6103e862001ed5888862005330565b6001600160401b0316111562001efe57604051635acfba9d60e11b815260040160405180910390fd5b62001f10818989898989898962003614565b62001f1c8187620040b7565b6085546001600160401b03166000036200202a57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001f98576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001fd1620026b0565b6040518263ffffffff1660e01b815260040162001ff091815260200190565b600060405180830381600087803b1580156200200b57600080fd5b505af115801562002020573d6000803e3d6000fd5b50505050620020f4565b6200203581620042b4565b600681018054600160801b90046001600160401b0316906010620020598362005353565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b48887896040516200213a93929190620050e3565b60405180910390a3505050505050505050565b606f5460ff16156200217257604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602052604090206200219981898989898989896200328c565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620021f862003c02565b505050505050505050565b80516080805463ffffffff191663ffffffff90921691909117905560005b8151811015620013a2578181815181106200224057620022406200537a565b6020026020010151608160008360016200225b919062005390565b63ffffffff168152602081019190915260400160002060050155806200228181620053a6565b91505062002221565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162002306919062004ea4565b602060405180830381865afa15801562002324573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200234a9190620053c2565b60845490915060009062002371906001600160401b03600160401b82048116911662005330565b6001600160401b03169050806000036200238e5760009250505090565b6200239a8183620053f2565b9250505090565b606f5460009060ff1615620023c957604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362002401576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200242c57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff8116600090815260816020526040812060848054919287926200245f9084906001600160401b03166200511a565b82546101009290920a6001600160401b03818102199093169183160217909155600683015416905060006200249587836200511a565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200252483620042b4565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a25826040516200255c9190620047b2565b60405180910390a29695505050505050565b60008051602062005fa9833981519152620025898162003280565b606f5460ff16620025c4576085546001600160401b0390811690831610620025c45760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759062001293908490620047b2565b60008051602062005fa98339815191526200262c8162003280565b62015180826001600160401b031611156200265a57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289062001293908490620047b2565b60805460009063ffffffff16808203620026cc57506000919050565b6000816001600160401b03811115620026e957620026e962004b6c565b60405190808252806020026020018201604052801562002713578160200160208202803683370190505b50905060005b828110156200278657608160006200273383600162005390565b63ffffffff1663ffffffff168152602001908152602001600020600501548282815181106200276657620027666200537a565b6020908102919091010152806200277d81620053a6565b91505062002719565b50600060205b83600114620029ca576000620027a460028662005409565b620027b1600287620053f2565b620027bd919062005390565b90506000816001600160401b03811115620027dc57620027dc62004b6c565b60405190808252806020026020018201604052801562002806578160200160208202803683370190505b50905060005b828110156200297e576200282260018462005420565b811480156200283d57506200283960028862005409565b6001145b15620028bd57856200285182600262005256565b815181106200286457620028646200537a565b6020026020010151856040516020016200288092919062005436565b60405160208183030381529060405280519060200120828281518110620028ab57620028ab6200537a565b60200260200101818152505062002969565b85620028cb82600262005256565b81518110620028de57620028de6200537a565b602002602001015186826002620028f6919062005256565b6200290390600162005390565b815181106200291657620029166200537a565b60200260200101516040516020016200293192919062005436565b604051602081830303815290604052805190602001208282815181106200295c576200295c6200537a565b6020026020010181815250505b806200297581620053a6565b9150506200280c565b5080945081955083846040516020016200299a92919062005436565b6040516020818303038152906040528051906020012093508280620029bf9062005444565b93505050506200278c565b600083600081518110620029e257620029e26200537a565b6020026020010151905060005b8281101562002a6857818460405160200162002a0d92919062005436565b604051602081830303815290604052805190602001209150838460405160200162002a3a92919062005436565b604051602081830303815290604052805190602001209350808062002a5f90620053a6565b915050620029ef565b5095945050505050565b60008051602062005ea983398151915262002a8d8162003280565b63ffffffff8416158062002aac5750607e5463ffffffff908116908516115b1562002acb57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002b0c576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002b5b57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002ba257604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002be057604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002c608462000dfe565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002cb59216908b908b906004016200545e565b600060405180830381600087803b15801562002cd057600080fd5b505af115801562002ce5573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005ec983398151915262002d5a8162003280565b683635c9adc5dea0000082118062002d755750633b9aca0082105b1562002d9457604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001293565b62002dd58262001335565b62002de08162003280565b620011ee838362003ced565b60008051602062005f2983398151915262002e078162003280565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002e6357600080fd5b505af115801562002e78573d6000803e3d6000fd5b5050505062002e866200437f565b50565b60008051602062005f8983398151915262002ea48162003280565b6001600160401b03841660009081526083602052604090205463ffffffff161562002ee2576040516337c8fe0960e11b815260040160405180910390fd5b600062002ef3888888888762003d57565b60008080526002909101602052604090209390935550505050505050565b60008051602062005f0983398151915262002f2c8162003280565b607e805460009190829062002f479063ffffffff1662005270565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620030ea969594939291906200549e565b60405180910390a25050505050505050565b6085546001600160401b038281166000908152600485016020526040812054909242926200312f9291811691166200511a565b6001600160401b031611159392505050565b600054610100900460ff16620013335760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b89565b620013a2828262003c81565b6000620031c78362001335565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6006810154600090600160801b90046001600160401b03161562003263575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002e868133620043d8565b60078801546000906001600160401b039081169087161015620032c25760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620033635760068901546001600160401b03600160801b909104811690891611156200330c5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200335c57604051632bd2e3e760e01b815260040160405180910390fd5b50620033d8565b506001600160401b0385166000908152600289016020526040902054806200339e576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620033d857604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620034115750876001600160401b0316876001600160401b031611155b8062003435575060068901546001600160401b03600160c01b909104811690881611155b15620034545760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b90048116908616146200349b576040516332a2a77f60e01b815260040160405180910390fd5b6000620034ad8a888888868962003f7c565b9050600060008051602062005f49833981519152600283604051620034d39190620054eb565b602060405180830381855afa158015620034f1573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620035169190620053c2565b62003522919062005409565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620035669188919060040162005509565b602060405180830381865afa15801562003584573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620035aa919062005546565b620035c8576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620036075760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620036228a6200320f565b60078b01549091506001600160401b039081169089161015620036585760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620036fb5760068a01546001600160401b03600160801b9091048116908a161115620036a25760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620036f457604051632bd2e3e760e01b815260040160405180910390fd5b506200376b565b6001600160401b038816600090815260028b01602052604090205491508162003737576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200376b57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b0316116200379e5760405163b9b18f5760e01b815260040160405180910390fd5b6000620037b08b8a8a8a878b62003f7c565b9050600060008051602062005f49833981519152600283604051620037d69190620054eb565b602060405180830381855afa158015620037f4573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620038199190620053c2565b62003825919062005409565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620038699189919060040162005509565b602060405180830381865afa15801562003887573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620038ad919062005546565b620038cb576040516309bde33960e01b815260040160405180910390fd5b6000620038d9848b62005330565b90506200393287826001600160401b0316620038f4620022b5565b62003900919062005256565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004402565b80608460088282829054906101000a90046001600160401b03166200395891906200511a565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b158015620039e857600080fd5b505af1158015620039fd573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003a4f575060068201546001600160401b03600160801b9091048116908216115b1562003a6e5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003b2a620026b0565b6040518263ffffffff1660e01b815260040162003b4991815260200190565b600060405180830381600087803b15801562003b6457600080fd5b505af115801562003b79573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003c5e57600080fd5b505af115801562003c73573d6000803e3d6000fd5b505050506200133362004456565b62003c8d82826200228a565b620013a25760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003cf982826200228a565b15620013a25760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b608080546000918291829062003d739063ffffffff1662005270565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000866001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508060826000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150868260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550858260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550838260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003f6a94939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003fb2575081155b1562003fd15760405163340c614f60e11b815260040160405180910390fd5b8062003ff0576040516366385b5160e01b815260040160405180910390fd5b62003ffb84620044b3565b62004019576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b6000620040c4836200320f565b905081600080620040d6848462005330565b6085546001600160401b039182169250600091620040fd91600160401b9004164262005420565b90505b846001600160401b0316846001600160401b03161462004187576001600160401b0380851660009081526003890160205260409020600181015490911682101562004162576001810154600160401b90046001600160401b0316945062004180565b6200416e868662005330565b6001600160401b031693505062004187565b5062004100565b600062004195848462005420565b905083811015620041f357808403600c8111620041b35780620041b6565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620041e857620041e8620053dc565b04608655506200426b565b838103600c811162004206578062004209565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a76400000281620042435762004243620053dc565b04905080608654670de0b6b3a76400000281620042645762004264620053dc565b0460865550505b683635c9adc5dea0000060865411156200429257683635c9adc5dea00000608655620042aa565b633b9aca006086541015620042aa57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002e86576006810154600090620042ff90600160c01b90046001600160401b031660016200511a565b90506200430d8282620030fc565b15620013a25760068201546000906002906200433b908490600160801b90046001600160401b031662005330565b6200434791906200556a565b6200435390836200511a565b9050620043618382620030fc565b156200437357620011ee838262003a10565b620011ee838362003a10565b606f5460ff16620043a357604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b620043e482826200228a565b620013a257604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620011ee90849062004539565b606f5460ff16156200447b57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b038316108015620044ea575067ffffffff00000001604083901c6001600160401b0316105b80156200450b575067ffffffff00000001608083901c6001600160401b0316105b801562004523575067ffffffff0000000160c083901c105b156200453157506001919050565b506000919050565b600062004590826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620046129092919063ffffffff16565b805190915015620011ee5780806020019051810190620045b1919062005546565b620011ee5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b89565b60606200462384846000856200462b565b949350505050565b6060824710156200468e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b89565b600080866001600160a01b03168587604051620046ac9190620054eb565b60006040518083038185875af1925050503d8060008114620046eb576040519150601f19603f3d011682016040523d82523d6000602084013e620046f0565b606091505b509150915062001e1e87838387606083156200477157825160000362004769576001600160a01b0385163b620047695760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b89565b508162004623565b620046238383815115620047885781518083602001fd5b8060405162461bcd60e51b815260040162000b89919062004db2565b6108f5806200559483390190565b6001600160401b0391909116815260200190565b803563ffffffff811681146200327b57600080fd5b80356001600160401b03811681146200327b57600080fd5b600080604083850312156200480757600080fd5b6200481283620047c6565b91506200482260208401620047db565b90509250929050565b6001600160a01b038116811462002e8657600080fd5b60008060008060008060c087890312156200485b57600080fd5b863562004868816200482b565b95506200487860208801620047db565b94506200488860408801620047db565b935060608701356200489a816200482b565b92506080870135620048ac816200482b565b915060a0870135620048be816200482b565b809150509295509295509295565b600060208284031215620048df57600080fd5b62000b3e82620047c6565b80610300810183101562000b4157600080fd5b6000806000806000806000806103e0898b0312156200491b57600080fd5b6200492689620047c6565b97506200493660208a01620047db565b96506200494660408a01620047db565b95506200495660608a01620047db565b94506200496660808a01620047db565b935060a0890135925060c08901359150620049858a60e08b01620048ea565b90509295985092959890939650565b6000806000806000806000806103e0898b031215620049b257600080fd5b620049bd89620047c6565b9750620049cd60208a01620047db565b9650620049dd60408a01620047db565b9550620049ed60608a01620047db565b94506080890135935060a0890135925060c089013562004a0d816200482b565b9150620049858a60e08b01620048ea565b60006020828403121562004a3157600080fd5b813561ffff8116811462004a4457600080fd5b9392505050565b60006020828403121562004a5e57600080fd5b5035919050565b6000806040838503121562004a7957600080fd5b82359150602083013562004a8d816200482b565b809150509250929050565b60006020828403121562004aab57600080fd5b62000b3e82620047db565b600080600080600080600080610100898b03121562004ad457600080fd5b883562004ae1816200482b565b975062004af160208a01620047db565b965062004b0160408a01620047db565b9550606089013562004b13816200482b565b9450608089013562004b25816200482b565b935060a089013562004b37816200482b565b925060c089013562004b49816200482b565b915060e089013562004b5b816200482b565b809150509295985092959890939650565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562004bad5762004bad62004b6c565b604052919050565b600082601f83011262004bc757600080fd5b81356001600160401b0381111562004be35762004be362004b6c565b62004bf8601f8201601f191660200162004b82565b81815284602083860101111562004c0e57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600080600060e0888a03121562004c4757600080fd5b62004c5288620047c6565b965062004c6260208901620047db565b9550604088013562004c74816200482b565b9450606088013562004c86816200482b565b9350608088013562004c98816200482b565b925060a08801356001600160401b038082111562004cb557600080fd5b62004cc38b838c0162004bb5565b935060c08a013591508082111562004cda57600080fd5b5062004ce98a828b0162004bb5565b91505092959891949750929550565b60008060008060008060c0878903121562004d1257600080fd5b62004d1d87620047c6565b955062004d2d60208801620047db565b945062004d3d60408801620047db565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004d7b57818101518382015260200162004d61565b50506000910152565b6000815180845262004d9e81602086016020860162004d5e565b601f01601f19169290920160200192915050565b60208152600062000b3e602083018462004d84565b6000602080838503121562004ddb57600080fd5b82356001600160401b038082111562004df357600080fd5b818501915085601f83011262004e0857600080fd5b81358181111562004e1d5762004e1d62004b6c565b8060051b915062004e3084830162004b82565b818152918301840191848101908884111562004e4b57600080fd5b938501935b8385101562004e6b5784358252938501939085019062004e50565b98975050505050505050565b6000806040838503121562004e8b57600080fd5b62004e9683620047db565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000806000806060858703121562004ecf57600080fd5b843562004edc816200482b565b935062004eec60208601620047c6565b925060408501356001600160401b038082111562004f0957600080fd5b818701915087601f83011262004f1e57600080fd5b81358181111562004f2e57600080fd5b88602082850101111562004f4157600080fd5b95989497505060200194505050565b60006020828403121562004f6357600080fd5b813562004a44816200482b565b803560ff811681146200327b57600080fd5b60008060008060008060c0878903121562004f9c57600080fd5b863562004fa9816200482b565b9550602087013562004fbb816200482b565b945062004fcb60408801620047db565b935062004fdb60608801620047db565b92506080870135915062004ff260a0880162004f70565b90509295509295509295565b60008060008060008060c087890312156200501857600080fd5b863562005025816200482b565b9550602087013562005037816200482b565b94506200504760408801620047db565b9350620050576060880162004f70565b92506080870135915060a08701356001600160401b038111156200507a57600080fd5b6200508889828a0162004bb5565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b038181168382160190808211156200513d576200513d62005104565b5092915050565b8054600090600181811c90808316806200515f57607f831692505b602080841082036200518157634e487b7160e01b600052602260045260246000fd5b838852602088018280156200519f5760018114620051b657620051e3565b60ff198716825285151560051b82019750620051e3565b60008981526020902060005b87811015620051dd57815484820152908601908401620051c2565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c0604082018190526000906200521e9083018762005144565b828103606084015262005232818762005144565b608084019590955250506001600160401b039190911660a090910152949350505050565b808202811582820484141762000b415762000b4162005104565b600063ffffffff8083168181036200528c576200528c62005104565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620052c49083018462004d84565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190526000906200530f9083018562004d84565b82810360a084015262005323818562004d84565b9998505050505050505050565b6001600160401b038281168282160390808211156200513d576200513d62005104565b60006001600160401b038281166002600160401b031981016200528c576200528c62005104565b634e487b7160e01b600052603260045260246000fd5b8082018082111562000b415762000b4162005104565b600060018201620053bb57620053bb62005104565b5060010190565b600060208284031215620053d557600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082620054045762005404620053dc565b500490565b6000826200541b576200541b620053dc565b500690565b8181038181111562000b415762000b4162005104565b918252602082015260400190565b60008162005456576200545662005104565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a0820181905260009062004e6b9083018462004d84565b60008251620054ff81846020870162004d5e565b9190910192915050565b61032081016103008085843782018360005b60018110156200553c5781518352602092830192909101906001016200551b565b5050509392505050565b6000602082840312156200555957600080fd5b8151801515811462004a4457600080fd5b60006001600160401b0383811680620055875762005587620053dc565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220a19e7a72432195d9a35c7ce8fa5f1284415aac66bb1ad08a4c2e1c252fd8690864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a26469706673582212205852eeda437f498b0bdbc880c7dfb3fe1d0947053ae208222c7088b67edf595964736f6c63430008140033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620002aa5760003560e01c8063066ec01214620002af578063080b311114620002db5780630a0d9fbe14620003035780630e36f582146200031e57806311f6b287146200033757806312b86e19146200034e5780631489ed10146200036557806315064c96146200037c5780631608859c146200038a5780631796a1ae14620003a15780631816b7e514620003c85780632072f6c514620003df578063248a9ca314620003e957806325280169146200040f5780632f2ff15d14620004c457806336568abe14620004db578063394218e914620004f2578063477fa27014620005095780634d4d3338146200051257806355a71ee0146200052957806360469169146200056d57806365c0504d14620005775780637222020f1462000626578063727885e9146200063d5780637975fcfe14620006545780637fb6e76a146200067a578063841b24d714620006a357806387c20c0114620006be5780638bd4f07114620006d55780638f698ec514620006ec57806391d14854146200070357806399f5634e146200071a5780639a908e7314620007245780639c9f3dfe146200073b578063a066215c1462000752578063a217fddf1462000769578063a2967d991462000772578063a3c573eb146200077c578063afd23cbe14620007b3578063b99d0ad714620007dd578063c1acbc3414620008b5578063c4c928c214620008d0578063ceee281d14620008e7578063d02103ca1462000910578063d5073f6f1462000938578063d547741f146200094f578063d939b3151462000966578063dbc16976146200097a578063dde0ff771462000984578063e0bfd3d2146200099f578063e46761c414620009b6578063f34eb8eb14620009de578063f4e9267514620009f5578063f9c4c2ae1462000a06575b600080fd5b608454620002c3906001600160401b031681565b604051620002d29190620047b2565b60405180910390f35b620002f2620002ec366004620047f3565b62000b1d565b6040519015158152602001620002d2565b608554620002c390600160401b90046001600160401b031681565b620003356200032f36600462004841565b62000b47565b005b620002c362000348366004620048cc565b62000dfe565b620003356200035f366004620048fd565b62000e1e565b620003356200037636600462004994565b62000fce565b606f54620002f29060ff1681565b620003356200039b366004620047f3565b6200115e565b607e54620003b29063ffffffff1681565b60405163ffffffff9091168152602001620002d2565b62000335620003d936600462004a1e565b620011f3565b620003356200129f565b62000400620003fa36600462004a4b565b62001335565b604051908152602001620002d2565b6200049062000420366004620047f3565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002d2565b62000335620004d536600462004a65565b6200134a565b62000335620004ec36600462004a65565b6200136c565b620003356200050336600462004a98565b620013a6565b60865462000400565b620003356200052336600462004ab6565b62001455565b620004006200053a366004620047f3565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620004006200188b565b620005dc62000588366004620048cc565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002d2565b6200033562000637366004620048cc565b620018a3565b620003356200064e36600462004c2b565b6200198e565b6200066b6200066536600462004cf8565b62001df6565b604051620002d2919062004db2565b620003b26200068b36600462004a98565b60836020526000908152604090205463ffffffff1681565b608454620002c390600160c01b90046001600160401b031681565b62000335620006cf36600462004994565b62001e29565b62000335620006e6366004620048fd565b6200214d565b62000335620006fd36600462004dc7565b62002203565b620002f26200071436600462004a65565b6200228a565b62000400620022b5565b620002c36200073536600462004e77565b620023a1565b620003356200074c36600462004a98565b6200256e565b620003356200076336600462004a98565b62002611565b62000400600081565b62000400620026b0565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b604051620002d2919062004ea4565b608554620007c990600160801b900461ffff1681565b60405161ffff9091168152602001620002d2565b62000873620007ee366004620047f3565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002d2919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002c390600160801b90046001600160401b031681565b62000335620008e136600462004eb8565b62002a72565b620003b2620008f836600462004f50565b60826020526000908152604090205463ffffffff1681565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b620003356200094936600462004a4b565b62002d3f565b620003356200096036600462004a65565b62002dca565b608554620002c3906001600160401b031681565b6200033562002dec565b608454620002c390600160401b90046001600160401b031681565b62000335620009b036600462004f82565b62002e89565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b62000335620009ef36600462004ffe565b62002f11565b608054620003b29063ffffffff1681565b62000a9d62000a17366004620048cc565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002d2565b63ffffffff8216600090815260816020526040812062000b3e9083620030fc565b90505b92915050565b600054600290610100900460ff1615801562000b6a575060005460ff8083169116105b62000b925760405162461bcd60e51b815260040162000b899062005095565b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c1362003141565b62000c2e6000805160206200602983398151915288620031ae565b62000c3b600084620031ae565b62000c5660008051602062005f0983398151915284620031ae565b62000c7160008051602062005f8983398151915284620031ae565b62000c8c60008051602062005ea983398151915284620031ae565b62000ca760008051602062005ee983398151915285620031ae565b62000cc26000805160206200600983398151915285620031ae565b62000cdd60008051602062005f2983398151915285620031ae565b62000cf860008051602062005fa983398151915285620031ae565b62000d226000805160206200602983398151915260008051602062005e89833981519152620031ba565b62000d3d60008051602062005e8983398151915285620031ae565b62000d5860008051602062005ec983398151915285620031ae565b62000d8260008051602062005fe983398151915260008051602062005fc9833981519152620031ba565b62000d9d60008051602062005fe983398151915283620031ae565b62000db860008051602062005fc983398151915283620031ae565b62000dc5600033620031ae565b6000805461ff001916905560405160ff8216815260008051602062005f698339815191529060200160405180910390a150505050505050565b63ffffffff8116600090815260816020526040812062000b41906200320f565b6000805160206200602983398151915262000e398162003280565b63ffffffff8916600090815260816020526040902062000e60818a8a8a8a8a8a8a6200328c565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000ec8576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000f01620026b0565b6040518263ffffffff1660e01b815260040162000f2091815260200190565b600060405180830381600087803b15801562000f3b57600080fd5b505af115801562000f50573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b6000805160206200602983398151915262000fe98162003280565b63ffffffff8916600090815260816020526040902062001010818a8a8a8a8a8a8a62003614565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562001078576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620010b1620026b0565b6040518263ffffffff1660e01b8152600401620010d091815260200190565b600060405180830381600087803b158015620010eb57600080fd5b505af115801562001100573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a6040516200114a93929190620050e3565b60405180910390a350505050505050505050565b63ffffffff821660009081526081602052604090206200118e60008051602062006029833981519152336200228a565b620011e257606f5460ff1615620011b857604051630bc011ff60e21b815260040160405180910390fd5b620011c48183620030fc565b620011e257604051630674f25160e11b815260040160405180910390fd5b620011ee818362003a10565b505050565b60008051602062005fa98339815191526200120e8162003280565b6103e88261ffff1610806200122857506103ff8261ffff16115b156200124757604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620012ba60008051602062005fe9833981519152336200228a565b6200132957608454600160801b90046001600160401b031615806200130a57506084544290620012ff9062093a8090600160801b90046001600160401b03166200511a565b6001600160401b0316115b15620013295760405163692baaad60e11b815260040160405180910390fd5b6200133362003c02565b565b60009081526034602052604090206001015490565b620013558262001335565b620013608162003280565b620011ee838362003c81565b6001600160a01b03811633146200139657604051630b4ad1cd60e31b815260040160405180910390fd5b620013a2828262003ced565b5050565b60008051602062005fa9833981519152620013c18162003280565b606f5460ff1662001403576084546001600160401b03600160c01b909104811690831610620014035760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19062001293908490620047b2565b600054600290610100900460ff1615801562001478575060005460ff8083169116105b620014975760405162461bcd60e51b815260040162000b899062005095565b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200151862003141565b62001533600080516020620060298339815191528a620031ae565b62001540600086620031ae565b6200155b60008051602062005f0983398151915286620031ae565b6200157660008051602062005f8983398151915286620031ae565b6200159160008051602062005ea983398151915286620031ae565b620015ac60008051602062005ee983398151915287620031ae565b620015c76000805160206200600983398151915287620031ae565b620015e260008051602062005f2983398151915287620031ae565b620015fd60008051602062005fa983398151915287620031ae565b620016276000805160206200602983398151915260008051602062005e89833981519152620031ba565b6200164260008051602062005e8983398151915287620031ae565b6200165d60008051602062005ec983398151915287620031ae565b6200168760008051602062005fe983398151915260008051602062005fc9833981519152620031ba565b620016a260008051602062005fe983398151915285620031ae565b620016bd60008051602062005fc983398151915285620031ae565b6000620016d28484600561044d600062003d57565b6073546074549192506001600160401b03600160401b909104811691168082146200171057604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b0381811660008181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620018119695831695600160581b9091049092169360769360779391929190911690600401620051f0565b600060405180830381600087803b1580156200182c57600080fd5b505af115801562001841573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff8516815260008051602062005f6983398151915293506020019150620018789050565b60405180910390a1505050505050505050565b600060865460646200189e919062005256565b905090565b60008051602062005ee9833981519152620018be8162003280565b63ffffffff82161580620018dd5750607e5463ffffffff908116908316115b15620018fc57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200194357604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b60008051602062006009833981519152620019a98162003280565b63ffffffff88161580620019c85750607e5463ffffffff908116908916115b15620019e757604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff161515900362001a2e57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001a6c576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062001a879063ffffffff1662005270565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001ad590620047a4565b62001ae39392919062005296565b604051809103906000f08015801562001b00573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001d74949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001db4908d908d9088908e908e908e90600401620052cd565b600060405180830381600087803b15801562001dcf57600080fd5b505af115801562001de4573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001e1e90878787878762003f7c565b979650505050505050565b606f5460ff161562001e4e57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001e9d92600160c01b9004811691166200511a565b6001600160401b0316111562001ec657604051638a0704d360e01b815260040160405180910390fd5b6103e862001ed5888862005330565b6001600160401b0316111562001efe57604051635acfba9d60e11b815260040160405180910390fd5b62001f10818989898989898962003614565b62001f1c8187620040b7565b6085546001600160401b03166000036200202a57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001f98576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001fd1620026b0565b6040518263ffffffff1660e01b815260040162001ff091815260200190565b600060405180830381600087803b1580156200200b57600080fd5b505af115801562002020573d6000803e3d6000fd5b50505050620020f4565b6200203581620042b4565b600681018054600160801b90046001600160401b0316906010620020598362005353565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b48887896040516200213a93929190620050e3565b60405180910390a3505050505050505050565b606f5460ff16156200217257604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602052604090206200219981898989898989896200328c565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620021f862003c02565b505050505050505050565b80516080805463ffffffff191663ffffffff90921691909117905560005b8151811015620013a2578181815181106200224057620022406200537a565b6020026020010151608160008360016200225b919062005390565b63ffffffff168152602081019190915260400160002060050155806200228181620053a6565b91505062002221565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162002306919062004ea4565b602060405180830381865afa15801562002324573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200234a9190620053c2565b60845490915060009062002371906001600160401b03600160401b82048116911662005330565b6001600160401b03169050806000036200238e5760009250505090565b6200239a8183620053f2565b9250505090565b606f5460009060ff1615620023c957604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362002401576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200242c57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff8116600090815260816020526040812060848054919287926200245f9084906001600160401b03166200511a565b82546101009290920a6001600160401b03818102199093169183160217909155600683015416905060006200249587836200511a565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200252483620042b4565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a25826040516200255c9190620047b2565b60405180910390a29695505050505050565b60008051602062005fa9833981519152620025898162003280565b606f5460ff16620025c4576085546001600160401b0390811690831610620025c45760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759062001293908490620047b2565b60008051602062005fa98339815191526200262c8162003280565b62015180826001600160401b031611156200265a57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289062001293908490620047b2565b60805460009063ffffffff16808203620026cc57506000919050565b6000816001600160401b03811115620026e957620026e962004b6c565b60405190808252806020026020018201604052801562002713578160200160208202803683370190505b50905060005b828110156200278657608160006200273383600162005390565b63ffffffff1663ffffffff168152602001908152602001600020600501548282815181106200276657620027666200537a565b6020908102919091010152806200277d81620053a6565b91505062002719565b50600060205b83600114620029ca576000620027a460028662005409565b620027b1600287620053f2565b620027bd919062005390565b90506000816001600160401b03811115620027dc57620027dc62004b6c565b60405190808252806020026020018201604052801562002806578160200160208202803683370190505b50905060005b828110156200297e576200282260018462005420565b811480156200283d57506200283960028862005409565b6001145b15620028bd57856200285182600262005256565b815181106200286457620028646200537a565b6020026020010151856040516020016200288092919062005436565b60405160208183030381529060405280519060200120828281518110620028ab57620028ab6200537a565b60200260200101818152505062002969565b85620028cb82600262005256565b81518110620028de57620028de6200537a565b602002602001015186826002620028f6919062005256565b6200290390600162005390565b815181106200291657620029166200537a565b60200260200101516040516020016200293192919062005436565b604051602081830303815290604052805190602001208282815181106200295c576200295c6200537a565b6020026020010181815250505b806200297581620053a6565b9150506200280c565b5080945081955083846040516020016200299a92919062005436565b6040516020818303038152906040528051906020012093508280620029bf9062005444565b93505050506200278c565b600083600081518110620029e257620029e26200537a565b6020026020010151905060005b8281101562002a6857818460405160200162002a0d92919062005436565b604051602081830303815290604052805190602001209150838460405160200162002a3a92919062005436565b604051602081830303815290604052805190602001209350808062002a5f90620053a6565b915050620029ef565b5095945050505050565b60008051602062005ea983398151915262002a8d8162003280565b63ffffffff8416158062002aac5750607e5463ffffffff908116908516115b1562002acb57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002b0c576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002b5b57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002ba257604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002be057604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002c608462000dfe565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002cb59216908b908b906004016200545e565b600060405180830381600087803b15801562002cd057600080fd5b505af115801562002ce5573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005ec983398151915262002d5a8162003280565b683635c9adc5dea0000082118062002d755750633b9aca0082105b1562002d9457604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001293565b62002dd58262001335565b62002de08162003280565b620011ee838362003ced565b60008051602062005f2983398151915262002e078162003280565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002e6357600080fd5b505af115801562002e78573d6000803e3d6000fd5b5050505062002e866200437f565b50565b60008051602062005f8983398151915262002ea48162003280565b6001600160401b03841660009081526083602052604090205463ffffffff161562002ee2576040516337c8fe0960e11b815260040160405180910390fd5b600062002ef3888888888762003d57565b60008080526002909101602052604090209390935550505050505050565b60008051602062005f0983398151915262002f2c8162003280565b607e805460009190829062002f479063ffffffff1662005270565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620030ea969594939291906200549e565b60405180910390a25050505050505050565b6085546001600160401b038281166000908152600485016020526040812054909242926200312f9291811691166200511a565b6001600160401b031611159392505050565b600054610100900460ff16620013335760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b89565b620013a2828262003c81565b6000620031c78362001335565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6006810154600090600160801b90046001600160401b03161562003263575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002e868133620043d8565b60078801546000906001600160401b039081169087161015620032c25760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620033635760068901546001600160401b03600160801b909104811690891611156200330c5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200335c57604051632bd2e3e760e01b815260040160405180910390fd5b50620033d8565b506001600160401b0385166000908152600289016020526040902054806200339e576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620033d857604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620034115750876001600160401b0316876001600160401b031611155b8062003435575060068901546001600160401b03600160c01b909104811690881611155b15620034545760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b90048116908616146200349b576040516332a2a77f60e01b815260040160405180910390fd5b6000620034ad8a888888868962003f7c565b9050600060008051602062005f49833981519152600283604051620034d39190620054eb565b602060405180830381855afa158015620034f1573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620035169190620053c2565b62003522919062005409565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620035669188919060040162005509565b602060405180830381865afa15801562003584573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620035aa919062005546565b620035c8576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620036075760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620036228a6200320f565b60078b01549091506001600160401b039081169089161015620036585760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620036fb5760068a01546001600160401b03600160801b9091048116908a161115620036a25760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620036f457604051632bd2e3e760e01b815260040160405180910390fd5b506200376b565b6001600160401b038816600090815260028b01602052604090205491508162003737576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200376b57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b0316116200379e5760405163b9b18f5760e01b815260040160405180910390fd5b6000620037b08b8a8a8a878b62003f7c565b9050600060008051602062005f49833981519152600283604051620037d69190620054eb565b602060405180830381855afa158015620037f4573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620038199190620053c2565b62003825919062005409565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620038699189919060040162005509565b602060405180830381865afa15801562003887573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620038ad919062005546565b620038cb576040516309bde33960e01b815260040160405180910390fd5b6000620038d9848b62005330565b90506200393287826001600160401b0316620038f4620022b5565b62003900919062005256565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004402565b80608460088282829054906101000a90046001600160401b03166200395891906200511a565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b158015620039e857600080fd5b505af1158015620039fd573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003a4f575060068201546001600160401b03600160801b9091048116908216115b1562003a6e5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003b2a620026b0565b6040518263ffffffff1660e01b815260040162003b4991815260200190565b600060405180830381600087803b15801562003b6457600080fd5b505af115801562003b79573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003c5e57600080fd5b505af115801562003c73573d6000803e3d6000fd5b505050506200133362004456565b62003c8d82826200228a565b620013a25760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003cf982826200228a565b15620013a25760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b608080546000918291829062003d739063ffffffff1662005270565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000866001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508060826000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150868260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550858260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550838260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003f6a94939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003fb2575081155b1562003fd15760405163340c614f60e11b815260040160405180910390fd5b8062003ff0576040516366385b5160e01b815260040160405180910390fd5b62003ffb84620044b3565b62004019576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b6000620040c4836200320f565b905081600080620040d6848462005330565b6085546001600160401b039182169250600091620040fd91600160401b9004164262005420565b90505b846001600160401b0316846001600160401b03161462004187576001600160401b0380851660009081526003890160205260409020600181015490911682101562004162576001810154600160401b90046001600160401b0316945062004180565b6200416e868662005330565b6001600160401b031693505062004187565b5062004100565b600062004195848462005420565b905083811015620041f357808403600c8111620041b35780620041b6565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620041e857620041e8620053dc565b04608655506200426b565b838103600c811162004206578062004209565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a76400000281620042435762004243620053dc565b04905080608654670de0b6b3a76400000281620042645762004264620053dc565b0460865550505b683635c9adc5dea0000060865411156200429257683635c9adc5dea00000608655620042aa565b633b9aca006086541015620042aa57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002e86576006810154600090620042ff90600160c01b90046001600160401b031660016200511a565b90506200430d8282620030fc565b15620013a25760068201546000906002906200433b908490600160801b90046001600160401b031662005330565b6200434791906200556a565b6200435390836200511a565b9050620043618382620030fc565b156200437357620011ee838262003a10565b620011ee838362003a10565b606f5460ff16620043a357604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b620043e482826200228a565b620013a257604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620011ee90849062004539565b606f5460ff16156200447b57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b038316108015620044ea575067ffffffff00000001604083901c6001600160401b0316105b80156200450b575067ffffffff00000001608083901c6001600160401b0316105b801562004523575067ffffffff0000000160c083901c105b156200453157506001919050565b506000919050565b600062004590826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620046129092919063ffffffff16565b805190915015620011ee5780806020019051810190620045b1919062005546565b620011ee5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b89565b60606200462384846000856200462b565b949350505050565b6060824710156200468e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b89565b600080866001600160a01b03168587604051620046ac9190620054eb565b60006040518083038185875af1925050503d8060008114620046eb576040519150601f19603f3d011682016040523d82523d6000602084013e620046f0565b606091505b509150915062001e1e87838387606083156200477157825160000362004769576001600160a01b0385163b620047695760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b89565b508162004623565b620046238383815115620047885781518083602001fd5b8060405162461bcd60e51b815260040162000b89919062004db2565b6108f5806200559483390190565b6001600160401b0391909116815260200190565b803563ffffffff811681146200327b57600080fd5b80356001600160401b03811681146200327b57600080fd5b600080604083850312156200480757600080fd5b6200481283620047c6565b91506200482260208401620047db565b90509250929050565b6001600160a01b038116811462002e8657600080fd5b60008060008060008060c087890312156200485b57600080fd5b863562004868816200482b565b95506200487860208801620047db565b94506200488860408801620047db565b935060608701356200489a816200482b565b92506080870135620048ac816200482b565b915060a0870135620048be816200482b565b809150509295509295509295565b600060208284031215620048df57600080fd5b62000b3e82620047c6565b80610300810183101562000b4157600080fd5b6000806000806000806000806103e0898b0312156200491b57600080fd5b6200492689620047c6565b97506200493660208a01620047db565b96506200494660408a01620047db565b95506200495660608a01620047db565b94506200496660808a01620047db565b935060a0890135925060c08901359150620049858a60e08b01620048ea565b90509295985092959890939650565b6000806000806000806000806103e0898b031215620049b257600080fd5b620049bd89620047c6565b9750620049cd60208a01620047db565b9650620049dd60408a01620047db565b9550620049ed60608a01620047db565b94506080890135935060a0890135925060c089013562004a0d816200482b565b9150620049858a60e08b01620048ea565b60006020828403121562004a3157600080fd5b813561ffff8116811462004a4457600080fd5b9392505050565b60006020828403121562004a5e57600080fd5b5035919050565b6000806040838503121562004a7957600080fd5b82359150602083013562004a8d816200482b565b809150509250929050565b60006020828403121562004aab57600080fd5b62000b3e82620047db565b600080600080600080600080610100898b03121562004ad457600080fd5b883562004ae1816200482b565b975062004af160208a01620047db565b965062004b0160408a01620047db565b9550606089013562004b13816200482b565b9450608089013562004b25816200482b565b935060a089013562004b37816200482b565b925060c089013562004b49816200482b565b915060e089013562004b5b816200482b565b809150509295985092959890939650565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562004bad5762004bad62004b6c565b604052919050565b600082601f83011262004bc757600080fd5b81356001600160401b0381111562004be35762004be362004b6c565b62004bf8601f8201601f191660200162004b82565b81815284602083860101111562004c0e57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600080600060e0888a03121562004c4757600080fd5b62004c5288620047c6565b965062004c6260208901620047db565b9550604088013562004c74816200482b565b9450606088013562004c86816200482b565b9350608088013562004c98816200482b565b925060a08801356001600160401b038082111562004cb557600080fd5b62004cc38b838c0162004bb5565b935060c08a013591508082111562004cda57600080fd5b5062004ce98a828b0162004bb5565b91505092959891949750929550565b60008060008060008060c0878903121562004d1257600080fd5b62004d1d87620047c6565b955062004d2d60208801620047db565b945062004d3d60408801620047db565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004d7b57818101518382015260200162004d61565b50506000910152565b6000815180845262004d9e81602086016020860162004d5e565b601f01601f19169290920160200192915050565b60208152600062000b3e602083018462004d84565b6000602080838503121562004ddb57600080fd5b82356001600160401b038082111562004df357600080fd5b818501915085601f83011262004e0857600080fd5b81358181111562004e1d5762004e1d62004b6c565b8060051b915062004e3084830162004b82565b818152918301840191848101908884111562004e4b57600080fd5b938501935b8385101562004e6b5784358252938501939085019062004e50565b98975050505050505050565b6000806040838503121562004e8b57600080fd5b62004e9683620047db565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000806000806060858703121562004ecf57600080fd5b843562004edc816200482b565b935062004eec60208601620047c6565b925060408501356001600160401b038082111562004f0957600080fd5b818701915087601f83011262004f1e57600080fd5b81358181111562004f2e57600080fd5b88602082850101111562004f4157600080fd5b95989497505060200194505050565b60006020828403121562004f6357600080fd5b813562004a44816200482b565b803560ff811681146200327b57600080fd5b60008060008060008060c0878903121562004f9c57600080fd5b863562004fa9816200482b565b9550602087013562004fbb816200482b565b945062004fcb60408801620047db565b935062004fdb60608801620047db565b92506080870135915062004ff260a0880162004f70565b90509295509295509295565b60008060008060008060c087890312156200501857600080fd5b863562005025816200482b565b9550602087013562005037816200482b565b94506200504760408801620047db565b9350620050576060880162004f70565b92506080870135915060a08701356001600160401b038111156200507a57600080fd5b6200508889828a0162004bb5565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b038181168382160190808211156200513d576200513d62005104565b5092915050565b8054600090600181811c90808316806200515f57607f831692505b602080841082036200518157634e487b7160e01b600052602260045260246000fd5b838852602088018280156200519f5760018114620051b657620051e3565b60ff198716825285151560051b82019750620051e3565b60008981526020902060005b87811015620051dd57815484820152908601908401620051c2565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c0604082018190526000906200521e9083018762005144565b828103606084015262005232818762005144565b608084019590955250506001600160401b039190911660a090910152949350505050565b808202811582820484141762000b415762000b4162005104565b600063ffffffff8083168181036200528c576200528c62005104565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620052c49083018462004d84565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190526000906200530f9083018562004d84565b82810360a084015262005323818562004d84565b9998505050505050505050565b6001600160401b038281168282160390808211156200513d576200513d62005104565b60006001600160401b038281166002600160401b031981016200528c576200528c62005104565b634e487b7160e01b600052603260045260246000fd5b8082018082111562000b415762000b4162005104565b600060018201620053bb57620053bb62005104565b5060010190565b600060208284031215620053d557600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082620054045762005404620053dc565b500490565b6000826200541b576200541b620053dc565b500690565b8181038181111562000b415762000b4162005104565b918252602082015260400190565b60008162005456576200545662005104565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a0820181905260009062004e6b9083018462004d84565b60008251620054ff81846020870162004d5e565b9190910192915050565b61032081016103008085843782018360005b60018110156200553c5781518352602092830192909101906001016200551b565b5050509392505050565b6000602082840312156200555957600080fd5b8151801515811462004a4457600080fd5b60006001600160401b0383811680620055875762005587620053dc565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220a19e7a72432195d9a35c7ce8fa5f1284415aac66bb1ad08a4c2e1c252fd8690864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a26469706673582212205852eeda437f498b0bdbc880c7dfb3fe1d0947053ae208222c7088b67edf595964736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonRollupManagerMockInternalTest.json b/compiled-contracts/paris/PolygonRollupManagerMockInternalTest.json new file mode 100644 index 000000000..a21ebcfe4 --- /dev/null +++ b/compiled-contracts/paris/PolygonRollupManagerMockInternalTest.json @@ -0,0 +1,1976 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonRollupManagerMockInternalTest", + "sourceName": "contracts/v2/mocks/PolygonRollupManagerMockInternalTest.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": "BatchFeeOutOfRange", + "type": "error" + }, + { + "inputs": [], + "name": "ChainIDAlreadyExist", + "type": "error" + }, + { + "inputs": [], + "name": "ExceedMaxVerifyBatches", + "type": "error" + }, + { + "inputs": [], + "name": "FinalNumBatchBelowLastVerifiedBatch", + "type": "error" + }, + { + "inputs": [], + "name": "FinalNumBatchDoesNotMatchPendingState", + "type": "error" + }, + { + "inputs": [], + "name": "FinalPendingStateNumInvalid", + "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": "InvalidRangeMultiplierBatchFee", + "type": "error" + }, + { + "inputs": [], + "name": "MustSequenceSomeBatch", + "type": "error" + }, + { + "inputs": [], + "name": "NewAccInputHashDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "NewPendingStateTimeoutMustBeLower", + "type": "error" + }, + { + "inputs": [], + "name": "NewStateRootNotInsidePrime", + "type": "error" + }, + { + "inputs": [], + "name": "NewTrustedAggregatorTimeoutMustBeLower", + "type": "error" + }, + { + "inputs": [], + "name": "OldAccInputHashDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "OldStateRootDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyEmergencyState", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyNotEmergencyState", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateInvalid", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateNotConsolidable", + "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": "TrustedAggregatorTimeoutNotExpired", + "type": "error" + }, + { + "inputs": [], + "name": "UpdateNotCompatible", + "type": "error" + }, + { + "inputs": [], + "name": "UpdateToSameRollupTypeID", + "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" + } + ], + "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": "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": [ + { + "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" + } + ], + "name": "initializeMock", + "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": "uint32", + "name": "rollupTypeID", + "type": "uint32" + } + ], + "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": "0x60e06040523480156200001157600080fd5b50604051620060423803806200604283398101604081905262000034916200006b565b6001600160a01b0392831660805290821660c0521660a052620000bf565b6001600160a01b03811681146200006857600080fd5b50565b6000806000606084860312156200008157600080fd5b83516200008e8162000052565b6020850151909350620000a18162000052565b6040850151909250620000b48162000052565b809150509250925092565b60805160a05160c051615f1b620001276000396000818161099901528181612210015261386001526000818161075f01528181612d5f0152613b5a0152600081816108f301528181610ea70152818161105701528181611f770152613a490152615f1b6000f3fe60806040523480156200001157600080fd5b50600436106200029e5760003560e01c8063066ec01214620002a3578063080b311114620002cf5780630a0d9fbe14620002f75780630e36f582146200031257806311f6b287146200032b57806312b86e1914620003425780631489ed10146200035957806315064c9614620003705780631608859c146200037e5780631796a1ae14620003955780631816b7e514620003bc5780632072f6c514620003d3578063248a9ca314620003dd5780632528016914620004035780632f2ff15d14620004b857806336568abe14620004cf578063394218e914620004e6578063477fa27014620004fd5780634d4d3338146200050657806355a71ee0146200051d57806360469169146200056157806365c0504d146200056b5780637222020f146200061a578063727885e914620006315780637975fcfe14620006485780637fb6e76a146200066e578063841b24d7146200069757806387c20c0114620006b25780638bd4f07114620006c957806391d1485414620006e057806399f5634e14620006f75780639a908e7314620007015780639c9f3dfe1462000718578063a066215c146200072f578063a217fddf1462000746578063a2967d99146200074f578063a3c573eb1462000759578063afd23cbe1462000790578063b99d0ad714620007ba578063c1acbc341462000892578063c4c928c214620008ad578063ceee281d14620008c4578063d02103ca14620008ed578063d5073f6f1462000915578063d547741f146200092c578063d939b3151462000943578063dbc169761462000957578063dde0ff771462000961578063e0bfd3d2146200097c578063e46761c41462000993578063f34eb8eb14620009bb578063f4e9267514620009d2578063f9c4c2ae14620009e3575b600080fd5b608454620002b7906001600160401b031681565b604051620002c6919062004708565b60405180910390f35b620002e6620002e036600462004749565b62000afa565b6040519015158152602001620002c6565b608554620002b790600160401b90046001600160401b031681565b620003296200032336600462004797565b62000b24565b005b620002b76200033c36600462004822565b62000ddb565b620003296200035336600462004853565b62000dfb565b620003296200036a366004620048ea565b62000fab565b606f54620002e69060ff1681565b620003296200038f36600462004749565b6200113b565b607e54620003a69063ffffffff1681565b60405163ffffffff9091168152602001620002c6565b62000329620003cd36600462004974565b620011d0565b620003296200127c565b620003f4620003ee366004620049a1565b62001312565b604051908152602001620002c6565b620004846200041436600462004749565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002c6565b62000329620004c9366004620049bb565b62001327565b62000329620004e0366004620049bb565b62001349565b62000329620004f7366004620049ee565b62001383565b608654620003f4565b620003296200051736600462004a0c565b62001432565b620003f46200052e36600462004749565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620003f462001868565b620005d06200057c36600462004822565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002c6565b620003296200062b36600462004822565b62001880565b620003296200064236600462004b6c565b6200196b565b6200065f6200065936600462004c39565b62001dd3565b604051620002c6919062004cf3565b620003a66200067f366004620049ee565b60836020526000908152604090205463ffffffff1681565b608454620002b790600160c01b90046001600160401b031681565b62000329620006c3366004620048ea565b62001e06565b62000329620006da36600462004853565b6200212a565b620002e6620006f1366004620049bb565b620021e0565b620003f46200220b565b620002b76200071236600462004d08565b620022f7565b6200032962000729366004620049ee565b620024c4565b6200032962000740366004620049ee565b62002567565b620003f4600081565b620003f462002606565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b604051620002c6919062004d35565b608554620007a690600160801b900461ffff1681565b60405161ffff9091168152602001620002c6565b62000850620007cb36600462004749565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002c6919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002b790600160801b90046001600160401b031681565b62000329620008be36600462004d49565b620029c8565b620003a6620008d536600462004de1565b60826020526000908152604090205463ffffffff1681565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b6200032962000926366004620049a1565b62002c95565b620003296200093d366004620049bb565b62002d20565b608554620002b7906001600160401b031681565b6200032962002d42565b608454620002b790600160401b90046001600160401b031681565b620003296200098d36600462004e13565b62002ddf565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b62000329620009cc36600462004e8f565b62002e67565b608054620003a69063ffffffff1681565b62000a7a620009f436600462004822565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002c6565b63ffffffff8216600090815260816020526040812062000b1b908362003052565b90505b92915050565b600054600290610100900460ff1615801562000b47575060005460ff8083169116105b62000b6f5760405162461bcd60e51b815260040162000b669062004f26565b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000bf062003097565b62000c0b60008051602062005ec68339815191528862003104565b62000c1860008462003104565b62000c3360008051602062005da68339815191528462003104565b62000c4e60008051602062005e268339815191528462003104565b62000c6960008051602062005d468339815191528462003104565b62000c8460008051602062005d868339815191528562003104565b62000c9f60008051602062005ea68339815191528562003104565b62000cba60008051602062005dc68339815191528562003104565b62000cd560008051602062005e468339815191528562003104565b62000cff60008051602062005ec683398151915260008051602062005d2683398151915262003110565b62000d1a60008051602062005d268339815191528562003104565b62000d3560008051602062005d668339815191528562003104565b62000d5f60008051602062005e8683398151915260008051602062005e6683398151915262003110565b62000d7a60008051602062005e868339815191528362003104565b62000d9560008051602062005e668339815191528362003104565b62000da260003362003104565b6000805461ff001916905560405160ff8216815260008051602062005e068339815191529060200160405180910390a150505050505050565b63ffffffff8116600090815260816020526040812062000b1e9062003165565b60008051602062005ec683398151915262000e1681620031d6565b63ffffffff8916600090815260816020526040902062000e3d818a8a8a8a8a8a8a620031e2565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000ea5576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000ede62002606565b6040518263ffffffff1660e01b815260040162000efd91815260200190565b600060405180830381600087803b15801562000f1857600080fd5b505af115801562000f2d573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005ec683398151915262000fc681620031d6565b63ffffffff8916600090815260816020526040902062000fed818a8a8a8a8a8a8a6200356a565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562001055576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200108e62002606565b6040518263ffffffff1660e01b8152600401620010ad91815260200190565b600060405180830381600087803b158015620010c857600080fd5b505af1158015620010dd573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a604051620011279392919062004f74565b60405180910390a350505050505050505050565b63ffffffff821660009081526081602052604090206200116b60008051602062005ec683398151915233620021e0565b620011bf57606f5460ff16156200119557604051630bc011ff60e21b815260040160405180910390fd5b620011a1818362003052565b620011bf57604051630674f25160e11b815260040160405180910390fd5b620011cb818362003966565b505050565b60008051602062005e46833981519152620011eb81620031d6565b6103e88261ffff1610806200120557506103ff8261ffff16115b156200122457604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200129760008051602062005e8683398151915233620021e0565b6200130657608454600160801b90046001600160401b03161580620012e757506084544290620012dc9062093a8090600160801b90046001600160401b031662004fab565b6001600160401b0316115b15620013065760405163692baaad60e11b815260040160405180910390fd5b6200131062003b58565b565b60009081526034602052604090206001015490565b620013328262001312565b6200133d81620031d6565b620011cb838362003bd7565b6001600160a01b03811633146200137357604051630b4ad1cd60e31b815260040160405180910390fd5b6200137f828262003c43565b5050565b60008051602062005e468339815191526200139e81620031d6565b606f5460ff16620013e0576084546001600160401b03600160c01b909104811690831610620013e05760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1906200127090849062004708565b600054600290610100900460ff1615801562001455575060005460ff8083169116105b620014745760405162461bcd60e51b815260040162000b669062004f26565b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b179055620014f562003097565b6200151060008051602062005ec68339815191528a62003104565b6200151d60008662003104565b6200153860008051602062005da68339815191528662003104565b6200155360008051602062005e268339815191528662003104565b6200156e60008051602062005d468339815191528662003104565b6200158960008051602062005d868339815191528762003104565b620015a460008051602062005ea68339815191528762003104565b620015bf60008051602062005dc68339815191528762003104565b620015da60008051602062005e468339815191528762003104565b6200160460008051602062005ec683398151915260008051602062005d2683398151915262003110565b6200161f60008051602062005d268339815191528762003104565b6200163a60008051602062005d668339815191528762003104565b6200166460008051602062005e8683398151915260008051602062005e6683398151915262003110565b6200167f60008051602062005e868339815191528562003104565b6200169a60008051602062005e668339815191528562003104565b6000620016af8484600561044d600062003cad565b6073546074549192506001600160401b03600160401b90910481169116808214620016ed57604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b0381811660008181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620017ee9695831695600160581b909104909216936076936077939192919091169060040162005081565b600060405180830381600087803b1580156200180957600080fd5b505af11580156200181e573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff8516815260008051602062005e0683398151915293506020019150620018559050565b60405180910390a1505050505050505050565b600060865460646200187b9190620050e7565b905090565b60008051602062005d868339815191526200189b81620031d6565b63ffffffff82161580620018ba5750607e5463ffffffff908116908316115b15620018d957604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200192057604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b60008051602062005ea68339815191526200198681620031d6565b63ffffffff88161580620019a55750607e5463ffffffff908116908916115b15620019c457604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff161515900362001a0b57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001a49576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062001a649063ffffffff1662005101565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001ab290620046fa565b62001ac09392919062005127565b604051809103906000f08015801562001add573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001d51949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001d91908d908d9088908e908e908e906004016200515e565b600060405180830381600087803b15801562001dac57600080fd5b505af115801562001dc1573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001dfb90878787878762003ed2565b979650505050505050565b606f5460ff161562001e2b57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001e7a92600160c01b90048116911662004fab565b6001600160401b0316111562001ea357604051638a0704d360e01b815260040160405180910390fd5b6103e862001eb28888620051c1565b6001600160401b0316111562001edb57604051635acfba9d60e11b815260040160405180910390fd5b62001eed81898989898989896200356a565b62001ef981876200400d565b6085546001600160401b03166000036200200757600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001f75576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001fae62002606565b6040518263ffffffff1660e01b815260040162001fcd91815260200190565b600060405180830381600087803b15801562001fe857600080fd5b505af115801562001ffd573d6000803e3d6000fd5b50505050620020d1565b62002012816200420a565b600681018054600160801b90046001600160401b03169060106200203683620051e4565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b4888789604051620021179392919062004f74565b60405180910390a3505050505050505050565b606f5460ff16156200214f57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88166000908152608160205260409020620021768189898989898989620031e2565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620021d562003b58565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016200225c919062004d35565b602060405180830381865afa1580156200227a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620022a091906200520b565b608454909150600090620022c7906001600160401b03600160401b820481169116620051c1565b6001600160401b0316905080600003620022e45760009250505090565b620022f081836200523b565b9250505090565b606f5460009060ff16156200231f57604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362002357576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200238257604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620023b59084906001600160401b031662004fab565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620023eb878362004fab565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200247a836200420a565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a2582604051620024b2919062004708565b60405180910390a29695505050505050565b60008051602062005e46833981519152620024df81620031d6565b606f5460ff166200251a576085546001600160401b03908116908316106200251a5760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75906200127090849062004708565b60008051602062005e468339815191526200258281620031d6565b62015180826001600160401b03161115620025b057604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28906200127090849062004708565b60805460009063ffffffff168082036200262257506000919050565b6000816001600160401b038111156200263f576200263f62004ac2565b60405190808252806020026020018201604052801562002669578160200160208202803683370190505b50905060005b82811015620026dc57608160006200268983600162005252565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620026bc57620026bc62005268565b602090810291909101015280620026d3816200527e565b9150506200266f565b50600060205b8360011462002920576000620026fa6002866200529a565b620027076002876200523b565b62002713919062005252565b90506000816001600160401b0381111562002732576200273262004ac2565b6040519080825280602002602001820160405280156200275c578160200160208202803683370190505b50905060005b82811015620028d45762002778600184620052b1565b811480156200279357506200278f6002886200529a565b6001145b15620028135785620027a7826002620050e7565b81518110620027ba57620027ba62005268565b602002602001015185604051602001620027d6929190620052c7565b6040516020818303038152906040528051906020012082828151811062002801576200280162005268565b602002602001018181525050620028bf565b8562002821826002620050e7565b8151811062002834576200283462005268565b6020026020010151868260026200284c9190620050e7565b6200285990600162005252565b815181106200286c576200286c62005268565b602002602001015160405160200162002887929190620052c7565b60405160208183030381529060405280519060200120828281518110620028b257620028b262005268565b6020026020010181815250505b80620028cb816200527e565b91505062002762565b508094508195508384604051602001620028f0929190620052c7565b60405160208183030381529060405280519060200120935082806200291590620052d5565b9350505050620026e2565b60008360008151811062002938576200293862005268565b6020026020010151905060005b82811015620029be57818460405160200162002963929190620052c7565b604051602081830303815290604052805190602001209150838460405160200162002990929190620052c7565b6040516020818303038152906040528051906020012093508080620029b5906200527e565b91505062002945565b5095945050505050565b60008051602062005d46833981519152620029e381620031d6565b63ffffffff8416158062002a025750607e5463ffffffff908116908516115b1562002a2157604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002a62576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002ab157604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002af857604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002b3657604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002bb68462000ddb565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002c0b9216908b908b90600401620052ef565b600060405180830381600087803b15801562002c2657600080fd5b505af115801562002c3b573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005d6683398151915262002cb081620031d6565b683635c9adc5dea0000082118062002ccb5750633b9aca0082105b1562002cea57604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001270565b62002d2b8262001312565b62002d3681620031d6565b620011cb838362003c43565b60008051602062005dc683398151915262002d5d81620031d6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002db957600080fd5b505af115801562002dce573d6000803e3d6000fd5b5050505062002ddc620042d5565b50565b60008051602062005e2683398151915262002dfa81620031d6565b6001600160401b03841660009081526083602052604090205463ffffffff161562002e38576040516337c8fe0960e11b815260040160405180910390fd5b600062002e49888888888762003cad565b60008080526002909101602052604090209390935550505050505050565b60008051602062005da683398151915262002e8281620031d6565b607e805460009190829062002e9d9063ffffffff1662005101565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162003040969594939291906200532f565b60405180910390a25050505050505050565b6085546001600160401b038281166000908152600485016020526040812054909242926200308592918116911662004fab565b6001600160401b031611159392505050565b600054610100900460ff16620013105760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b66565b6200137f828262003bd7565b60006200311d8362001312565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6006810154600090600160801b90046001600160401b031615620031b9575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002ddc81336200432e565b60078801546000906001600160401b039081169087161015620032185760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620032b95760068901546001600160401b03600160801b90910481169089161115620032625760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b9092041614620032b257604051632bd2e3e760e01b815260040160405180910390fd5b506200332e565b506001600160401b038516600090815260028901602052604090205480620032f4576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b909104811690871611156200332e57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620033675750876001600160401b0316876001600160401b031611155b806200338b575060068901546001600160401b03600160c01b909104811690881611155b15620033aa5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b9004811690861614620033f1576040516332a2a77f60e01b815260040160405180910390fd5b6000620034038a888888868962003ed2565b9050600060008051602062005de683398151915260028360405162003429919062005388565b602060405180830381855afa15801562003447573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200346c91906200520b565b6200347891906200529a565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620034bc91889190600401620053a6565b602060405180830381865afa158015620034da573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620035009190620053e3565b6200351e576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c0160205260409020600201548590036200355d5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620035788a62003165565b60078b01549091506001600160401b039081169089161015620035ae5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620036515760068a01546001600160401b03600160801b9091048116908a161115620035f85760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200364a57604051632bd2e3e760e01b815260040160405180910390fd5b50620036c1565b6001600160401b038816600090815260028b0160205260409020549150816200368d576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b03161115620036c157604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620036f45760405163b9b18f5760e01b815260040160405180910390fd5b6000620037068b8a8a8a878b62003ed2565b9050600060008051602062005de68339815191526002836040516200372c919062005388565b602060405180830381855afa1580156200374a573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200376f91906200520b565b6200377b91906200529a565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620037bf91899190600401620053a6565b602060405180830381865afa158015620037dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620038039190620053e3565b62003821576040516309bde33960e01b815260040160405180910390fd5b60006200382f848b620051c1565b90506200388887826001600160401b03166200384a6200220b565b620038569190620050e7565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004358565b80608460088282829054906101000a90046001600160401b0316620038ae919062004fab565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b1580156200393e57600080fd5b505af115801562003953573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b9091048116908216111580620039a5575060068201546001600160401b03600160801b9091048116908216115b15620039c45760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003a8062002606565b6040518263ffffffff1660e01b815260040162003a9f91815260200190565b600060405180830381600087803b15801562003aba57600080fd5b505af115801562003acf573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003bb457600080fd5b505af115801562003bc9573d6000803e3d6000fd5b5050505062001310620043ac565b62003be38282620021e0565b6200137f5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003c4f8282620021e0565b156200137f5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b608080546000918291829062003cc99063ffffffff1662005101565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000866001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508060826000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150868260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550858260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550838260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003ec094939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003f08575081155b1562003f275760405163340c614f60e11b815260040160405180910390fd5b8062003f46576040516366385b5160e01b815260040160405180910390fd5b62003f518462004409565b62003f6f576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b60006200401a8362003165565b9050816000806200402c8484620051c1565b6085546001600160401b0391821692506000916200405391600160401b90041642620052b1565b90505b846001600160401b0316846001600160401b031614620040dd576001600160401b03808516600090815260038901602052604090206001810154909116821015620040b8576001810154600160401b90046001600160401b03169450620040d6565b620040c48686620051c1565b6001600160401b0316935050620040dd565b5062004056565b6000620040eb8484620052b1565b9050838110156200414957808403600c81116200410957806200410c565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a60865402816200413e576200413e62005225565b0460865550620041c1565b838103600c81116200415c57806200415f565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162004199576200419962005225565b04905080608654670de0b6b3a76400000281620041ba57620041ba62005225565b0460865550505b683635c9adc5dea000006086541115620041e857683635c9adc5dea0000060865562004200565b633b9aca0060865410156200420057633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002ddc5760068101546000906200425590600160c01b90046001600160401b0316600162004fab565b905062004263828262003052565b156200137f57600682015460009060029062004291908490600160801b90046001600160401b0316620051c1565b6200429d919062005407565b620042a9908362004fab565b9050620042b7838262003052565b15620042c957620011cb838262003966565b620011cb838362003966565b606f5460ff16620042f957604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6200433a8282620021e0565b6200137f57604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620011cb9084906200448f565b606f5460ff1615620043d157604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b03831610801562004440575067ffffffff00000001604083901c6001600160401b0316105b801562004461575067ffffffff00000001608083901c6001600160401b0316105b801562004479575067ffffffff0000000160c083901c105b156200448757506001919050565b506000919050565b6000620044e6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620045689092919063ffffffff16565b805190915015620011cb5780806020019051810190620045079190620053e3565b620011cb5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b66565b606062004579848460008562004581565b949350505050565b606082471015620045e45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b66565b600080866001600160a01b0316858760405162004602919062005388565b60006040518083038185875af1925050503d806000811462004641576040519150601f19603f3d011682016040523d82523d6000602084013e62004646565b606091505b509150915062001dfb8783838760608315620046c7578251600003620046bf576001600160a01b0385163b620046bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b66565b508162004579565b620045798383815115620046de5781518083602001fd5b8060405162461bcd60e51b815260040162000b66919062004cf3565b6108f5806200543183390190565b6001600160401b0391909116815260200190565b803563ffffffff81168114620031d157600080fd5b80356001600160401b0381168114620031d157600080fd5b600080604083850312156200475d57600080fd5b62004768836200471c565b9150620047786020840162004731565b90509250929050565b6001600160a01b038116811462002ddc57600080fd5b60008060008060008060c08789031215620047b157600080fd5b8635620047be8162004781565b9550620047ce6020880162004731565b9450620047de6040880162004731565b93506060870135620047f08162004781565b92506080870135620048028162004781565b915060a0870135620048148162004781565b809150509295509295509295565b6000602082840312156200483557600080fd5b62000b1b826200471c565b80610300810183101562000b1e57600080fd5b6000806000806000806000806103e0898b0312156200487157600080fd5b6200487c896200471c565b97506200488c60208a0162004731565b96506200489c60408a0162004731565b9550620048ac60608a0162004731565b9450620048bc60808a0162004731565b935060a0890135925060c08901359150620048db8a60e08b0162004840565b90509295985092959890939650565b6000806000806000806000806103e0898b0312156200490857600080fd5b62004913896200471c565b97506200492360208a0162004731565b96506200493360408a0162004731565b95506200494360608a0162004731565b94506080890135935060a0890135925060c0890135620049638162004781565b9150620048db8a60e08b0162004840565b6000602082840312156200498757600080fd5b813561ffff811681146200499a57600080fd5b9392505050565b600060208284031215620049b457600080fd5b5035919050565b60008060408385031215620049cf57600080fd5b823591506020830135620049e38162004781565b809150509250929050565b60006020828403121562004a0157600080fd5b62000b1b8262004731565b600080600080600080600080610100898b03121562004a2a57600080fd5b883562004a378162004781565b975062004a4760208a0162004731565b965062004a5760408a0162004731565b9550606089013562004a698162004781565b9450608089013562004a7b8162004781565b935060a089013562004a8d8162004781565b925060c089013562004a9f8162004781565b915060e089013562004ab18162004781565b809150509295985092959890939650565b634e487b7160e01b600052604160045260246000fd5b600082601f83011262004aea57600080fd5b81356001600160401b038082111562004b075762004b0762004ac2565b604051601f8301601f19908116603f0116810190828211818310171562004b325762004b3262004ac2565b8160405283815286602085880101111562004b4c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121562004b8857600080fd5b62004b93886200471c565b965062004ba36020890162004731565b9550604088013562004bb58162004781565b9450606088013562004bc78162004781565b9350608088013562004bd98162004781565b925060a08801356001600160401b038082111562004bf657600080fd5b62004c048b838c0162004ad8565b935060c08a013591508082111562004c1b57600080fd5b5062004c2a8a828b0162004ad8565b91505092959891949750929550565b60008060008060008060c0878903121562004c5357600080fd5b62004c5e876200471c565b955062004c6e6020880162004731565b945062004c7e6040880162004731565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004cbc57818101518382015260200162004ca2565b50506000910152565b6000815180845262004cdf81602086016020860162004c9f565b601f01601f19169290920160200192915050565b60208152600062000b1b602083018462004cc5565b6000806040838503121562004d1c57600080fd5b62004d278362004731565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000806000806060858703121562004d6057600080fd5b843562004d6d8162004781565b935062004d7d602086016200471c565b925060408501356001600160401b038082111562004d9a57600080fd5b818701915087601f83011262004daf57600080fd5b81358181111562004dbf57600080fd5b88602082850101111562004dd257600080fd5b95989497505060200194505050565b60006020828403121562004df457600080fd5b81356200499a8162004781565b803560ff81168114620031d157600080fd5b60008060008060008060c0878903121562004e2d57600080fd5b863562004e3a8162004781565b9550602087013562004e4c8162004781565b945062004e5c6040880162004731565b935062004e6c6060880162004731565b92506080870135915062004e8360a0880162004e01565b90509295509295509295565b60008060008060008060c0878903121562004ea957600080fd5b863562004eb68162004781565b9550602087013562004ec88162004781565b945062004ed86040880162004731565b935062004ee86060880162004e01565b92506080870135915060a08701356001600160401b0381111562004f0b57600080fd5b62004f1989828a0162004ad8565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004fce5762004fce62004f95565b5092915050565b8054600090600181811c908083168062004ff057607f831692505b602080841082036200501257634e487b7160e01b600052602260045260246000fd5b83885260208801828015620050305760018114620050475762005074565b60ff198716825285151560051b8201975062005074565b60008981526020902060005b878110156200506e5781548482015290860190840162005053565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c060408201819052600090620050af9083018762004fd5565b8281036060840152620050c3818762004fd5565b608084019590955250506001600160401b039190911660a090910152949350505050565b808202811582820484141762000b1e5762000b1e62004f95565b600063ffffffff8083168181036200511d576200511d62004f95565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620051559083018462004cc5565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c060808201819052600090620051a09083018562004cc5565b82810360a0840152620051b4818562004cc5565b9998505050505050505050565b6001600160401b0382811682821603908082111562004fce5762004fce62004f95565b60006001600160401b038281166002600160401b031981016200511d576200511d62004f95565b6000602082840312156200521e57600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b6000826200524d576200524d62005225565b500490565b8082018082111562000b1e5762000b1e62004f95565b634e487b7160e01b600052603260045260246000fd5b60006001820162005293576200529362004f95565b5060010190565b600082620052ac57620052ac62005225565b500690565b8181038181111562000b1e5762000b1e62004f95565b918252602082015260400190565b600081620052e757620052e762004f95565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190526000906200537c9083018462004cc5565b98975050505050505050565b600082516200539c81846020870162004c9f565b9190910192915050565b61032081016103008085843782018360005b6001811015620053d9578151835260209283019290910190600101620053b8565b5050509392505050565b600060208284031215620053f657600080fd5b815180151581146200499a57600080fd5b60006001600160401b038381168062005424576200542462005225565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220a19e7a72432195d9a35c7ce8fa5f1284415aac66bb1ad08a4c2e1c252fd8690864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220dd69b4fbcb587c5752b040baae00cd409fddf9ace44ff04b8c6ce19483951df464736f6c63430008140033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b50600436106200029e5760003560e01c8063066ec01214620002a3578063080b311114620002cf5780630a0d9fbe14620002f75780630e36f582146200031257806311f6b287146200032b57806312b86e1914620003425780631489ed10146200035957806315064c9614620003705780631608859c146200037e5780631796a1ae14620003955780631816b7e514620003bc5780632072f6c514620003d3578063248a9ca314620003dd5780632528016914620004035780632f2ff15d14620004b857806336568abe14620004cf578063394218e914620004e6578063477fa27014620004fd5780634d4d3338146200050657806355a71ee0146200051d57806360469169146200056157806365c0504d146200056b5780637222020f146200061a578063727885e914620006315780637975fcfe14620006485780637fb6e76a146200066e578063841b24d7146200069757806387c20c0114620006b25780638bd4f07114620006c957806391d1485414620006e057806399f5634e14620006f75780639a908e7314620007015780639c9f3dfe1462000718578063a066215c146200072f578063a217fddf1462000746578063a2967d99146200074f578063a3c573eb1462000759578063afd23cbe1462000790578063b99d0ad714620007ba578063c1acbc341462000892578063c4c928c214620008ad578063ceee281d14620008c4578063d02103ca14620008ed578063d5073f6f1462000915578063d547741f146200092c578063d939b3151462000943578063dbc169761462000957578063dde0ff771462000961578063e0bfd3d2146200097c578063e46761c41462000993578063f34eb8eb14620009bb578063f4e9267514620009d2578063f9c4c2ae14620009e3575b600080fd5b608454620002b7906001600160401b031681565b604051620002c6919062004708565b60405180910390f35b620002e6620002e036600462004749565b62000afa565b6040519015158152602001620002c6565b608554620002b790600160401b90046001600160401b031681565b620003296200032336600462004797565b62000b24565b005b620002b76200033c36600462004822565b62000ddb565b620003296200035336600462004853565b62000dfb565b620003296200036a366004620048ea565b62000fab565b606f54620002e69060ff1681565b620003296200038f36600462004749565b6200113b565b607e54620003a69063ffffffff1681565b60405163ffffffff9091168152602001620002c6565b62000329620003cd36600462004974565b620011d0565b620003296200127c565b620003f4620003ee366004620049a1565b62001312565b604051908152602001620002c6565b620004846200041436600462004749565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002c6565b62000329620004c9366004620049bb565b62001327565b62000329620004e0366004620049bb565b62001349565b62000329620004f7366004620049ee565b62001383565b608654620003f4565b620003296200051736600462004a0c565b62001432565b620003f46200052e36600462004749565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620003f462001868565b620005d06200057c36600462004822565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002c6565b620003296200062b36600462004822565b62001880565b620003296200064236600462004b6c565b6200196b565b6200065f6200065936600462004c39565b62001dd3565b604051620002c6919062004cf3565b620003a66200067f366004620049ee565b60836020526000908152604090205463ffffffff1681565b608454620002b790600160c01b90046001600160401b031681565b62000329620006c3366004620048ea565b62001e06565b62000329620006da36600462004853565b6200212a565b620002e6620006f1366004620049bb565b620021e0565b620003f46200220b565b620002b76200071236600462004d08565b620022f7565b6200032962000729366004620049ee565b620024c4565b6200032962000740366004620049ee565b62002567565b620003f4600081565b620003f462002606565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b604051620002c6919062004d35565b608554620007a690600160801b900461ffff1681565b60405161ffff9091168152602001620002c6565b62000850620007cb36600462004749565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002c6919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002b790600160801b90046001600160401b031681565b62000329620008be36600462004d49565b620029c8565b620003a6620008d536600462004de1565b60826020526000908152604090205463ffffffff1681565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b6200032962000926366004620049a1565b62002c95565b620003296200093d366004620049bb565b62002d20565b608554620002b7906001600160401b031681565b6200032962002d42565b608454620002b790600160401b90046001600160401b031681565b620003296200098d36600462004e13565b62002ddf565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b62000329620009cc36600462004e8f565b62002e67565b608054620003a69063ffffffff1681565b62000a7a620009f436600462004822565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002c6565b63ffffffff8216600090815260816020526040812062000b1b908362003052565b90505b92915050565b600054600290610100900460ff1615801562000b47575060005460ff8083169116105b62000b6f5760405162461bcd60e51b815260040162000b669062004f26565b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000bf062003097565b62000c0b60008051602062005ec68339815191528862003104565b62000c1860008462003104565b62000c3360008051602062005da68339815191528462003104565b62000c4e60008051602062005e268339815191528462003104565b62000c6960008051602062005d468339815191528462003104565b62000c8460008051602062005d868339815191528562003104565b62000c9f60008051602062005ea68339815191528562003104565b62000cba60008051602062005dc68339815191528562003104565b62000cd560008051602062005e468339815191528562003104565b62000cff60008051602062005ec683398151915260008051602062005d2683398151915262003110565b62000d1a60008051602062005d268339815191528562003104565b62000d3560008051602062005d668339815191528562003104565b62000d5f60008051602062005e8683398151915260008051602062005e6683398151915262003110565b62000d7a60008051602062005e868339815191528362003104565b62000d9560008051602062005e668339815191528362003104565b62000da260003362003104565b6000805461ff001916905560405160ff8216815260008051602062005e068339815191529060200160405180910390a150505050505050565b63ffffffff8116600090815260816020526040812062000b1e9062003165565b60008051602062005ec683398151915262000e1681620031d6565b63ffffffff8916600090815260816020526040902062000e3d818a8a8a8a8a8a8a620031e2565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000ea5576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000ede62002606565b6040518263ffffffff1660e01b815260040162000efd91815260200190565b600060405180830381600087803b15801562000f1857600080fd5b505af115801562000f2d573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005ec683398151915262000fc681620031d6565b63ffffffff8916600090815260816020526040902062000fed818a8a8a8a8a8a8a6200356a565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562001055576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200108e62002606565b6040518263ffffffff1660e01b8152600401620010ad91815260200190565b600060405180830381600087803b158015620010c857600080fd5b505af1158015620010dd573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a604051620011279392919062004f74565b60405180910390a350505050505050505050565b63ffffffff821660009081526081602052604090206200116b60008051602062005ec683398151915233620021e0565b620011bf57606f5460ff16156200119557604051630bc011ff60e21b815260040160405180910390fd5b620011a1818362003052565b620011bf57604051630674f25160e11b815260040160405180910390fd5b620011cb818362003966565b505050565b60008051602062005e46833981519152620011eb81620031d6565b6103e88261ffff1610806200120557506103ff8261ffff16115b156200122457604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200129760008051602062005e8683398151915233620021e0565b6200130657608454600160801b90046001600160401b03161580620012e757506084544290620012dc9062093a8090600160801b90046001600160401b031662004fab565b6001600160401b0316115b15620013065760405163692baaad60e11b815260040160405180910390fd5b6200131062003b58565b565b60009081526034602052604090206001015490565b620013328262001312565b6200133d81620031d6565b620011cb838362003bd7565b6001600160a01b03811633146200137357604051630b4ad1cd60e31b815260040160405180910390fd5b6200137f828262003c43565b5050565b60008051602062005e468339815191526200139e81620031d6565b606f5460ff16620013e0576084546001600160401b03600160c01b909104811690831610620013e05760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1906200127090849062004708565b600054600290610100900460ff1615801562001455575060005460ff8083169116105b620014745760405162461bcd60e51b815260040162000b669062004f26565b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b179055620014f562003097565b6200151060008051602062005ec68339815191528a62003104565b6200151d60008662003104565b6200153860008051602062005da68339815191528662003104565b6200155360008051602062005e268339815191528662003104565b6200156e60008051602062005d468339815191528662003104565b6200158960008051602062005d868339815191528762003104565b620015a460008051602062005ea68339815191528762003104565b620015bf60008051602062005dc68339815191528762003104565b620015da60008051602062005e468339815191528762003104565b6200160460008051602062005ec683398151915260008051602062005d2683398151915262003110565b6200161f60008051602062005d268339815191528762003104565b6200163a60008051602062005d668339815191528762003104565b6200166460008051602062005e8683398151915260008051602062005e6683398151915262003110565b6200167f60008051602062005e868339815191528562003104565b6200169a60008051602062005e668339815191528562003104565b6000620016af8484600561044d600062003cad565b6073546074549192506001600160401b03600160401b90910481169116808214620016ed57604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b0381811660008181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620017ee9695831695600160581b909104909216936076936077939192919091169060040162005081565b600060405180830381600087803b1580156200180957600080fd5b505af11580156200181e573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff8516815260008051602062005e0683398151915293506020019150620018559050565b60405180910390a1505050505050505050565b600060865460646200187b9190620050e7565b905090565b60008051602062005d868339815191526200189b81620031d6565b63ffffffff82161580620018ba5750607e5463ffffffff908116908316115b15620018d957604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200192057604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b60008051602062005ea68339815191526200198681620031d6565b63ffffffff88161580620019a55750607e5463ffffffff908116908916115b15620019c457604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff161515900362001a0b57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001a49576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062001a649063ffffffff1662005101565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001ab290620046fa565b62001ac09392919062005127565b604051809103906000f08015801562001add573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001d51949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001d91908d908d9088908e908e908e906004016200515e565b600060405180830381600087803b15801562001dac57600080fd5b505af115801562001dc1573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001dfb90878787878762003ed2565b979650505050505050565b606f5460ff161562001e2b57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001e7a92600160c01b90048116911662004fab565b6001600160401b0316111562001ea357604051638a0704d360e01b815260040160405180910390fd5b6103e862001eb28888620051c1565b6001600160401b0316111562001edb57604051635acfba9d60e11b815260040160405180910390fd5b62001eed81898989898989896200356a565b62001ef981876200400d565b6085546001600160401b03166000036200200757600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001f75576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001fae62002606565b6040518263ffffffff1660e01b815260040162001fcd91815260200190565b600060405180830381600087803b15801562001fe857600080fd5b505af115801562001ffd573d6000803e3d6000fd5b50505050620020d1565b62002012816200420a565b600681018054600160801b90046001600160401b03169060106200203683620051e4565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b4888789604051620021179392919062004f74565b60405180910390a3505050505050505050565b606f5460ff16156200214f57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88166000908152608160205260409020620021768189898989898989620031e2565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620021d562003b58565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016200225c919062004d35565b602060405180830381865afa1580156200227a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620022a091906200520b565b608454909150600090620022c7906001600160401b03600160401b820481169116620051c1565b6001600160401b0316905080600003620022e45760009250505090565b620022f081836200523b565b9250505090565b606f5460009060ff16156200231f57604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362002357576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200238257604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620023b59084906001600160401b031662004fab565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620023eb878362004fab565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200247a836200420a565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a2582604051620024b2919062004708565b60405180910390a29695505050505050565b60008051602062005e46833981519152620024df81620031d6565b606f5460ff166200251a576085546001600160401b03908116908316106200251a5760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75906200127090849062004708565b60008051602062005e468339815191526200258281620031d6565b62015180826001600160401b03161115620025b057604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28906200127090849062004708565b60805460009063ffffffff168082036200262257506000919050565b6000816001600160401b038111156200263f576200263f62004ac2565b60405190808252806020026020018201604052801562002669578160200160208202803683370190505b50905060005b82811015620026dc57608160006200268983600162005252565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620026bc57620026bc62005268565b602090810291909101015280620026d3816200527e565b9150506200266f565b50600060205b8360011462002920576000620026fa6002866200529a565b620027076002876200523b565b62002713919062005252565b90506000816001600160401b0381111562002732576200273262004ac2565b6040519080825280602002602001820160405280156200275c578160200160208202803683370190505b50905060005b82811015620028d45762002778600184620052b1565b811480156200279357506200278f6002886200529a565b6001145b15620028135785620027a7826002620050e7565b81518110620027ba57620027ba62005268565b602002602001015185604051602001620027d6929190620052c7565b6040516020818303038152906040528051906020012082828151811062002801576200280162005268565b602002602001018181525050620028bf565b8562002821826002620050e7565b8151811062002834576200283462005268565b6020026020010151868260026200284c9190620050e7565b6200285990600162005252565b815181106200286c576200286c62005268565b602002602001015160405160200162002887929190620052c7565b60405160208183030381529060405280519060200120828281518110620028b257620028b262005268565b6020026020010181815250505b80620028cb816200527e565b91505062002762565b508094508195508384604051602001620028f0929190620052c7565b60405160208183030381529060405280519060200120935082806200291590620052d5565b9350505050620026e2565b60008360008151811062002938576200293862005268565b6020026020010151905060005b82811015620029be57818460405160200162002963929190620052c7565b604051602081830303815290604052805190602001209150838460405160200162002990929190620052c7565b6040516020818303038152906040528051906020012093508080620029b5906200527e565b91505062002945565b5095945050505050565b60008051602062005d46833981519152620029e381620031d6565b63ffffffff8416158062002a025750607e5463ffffffff908116908516115b1562002a2157604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002a62576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002ab157604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002af857604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002b3657604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002bb68462000ddb565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002c0b9216908b908b90600401620052ef565b600060405180830381600087803b15801562002c2657600080fd5b505af115801562002c3b573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005d6683398151915262002cb081620031d6565b683635c9adc5dea0000082118062002ccb5750633b9aca0082105b1562002cea57604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001270565b62002d2b8262001312565b62002d3681620031d6565b620011cb838362003c43565b60008051602062005dc683398151915262002d5d81620031d6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002db957600080fd5b505af115801562002dce573d6000803e3d6000fd5b5050505062002ddc620042d5565b50565b60008051602062005e2683398151915262002dfa81620031d6565b6001600160401b03841660009081526083602052604090205463ffffffff161562002e38576040516337c8fe0960e11b815260040160405180910390fd5b600062002e49888888888762003cad565b60008080526002909101602052604090209390935550505050505050565b60008051602062005da683398151915262002e8281620031d6565b607e805460009190829062002e9d9063ffffffff1662005101565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162003040969594939291906200532f565b60405180910390a25050505050505050565b6085546001600160401b038281166000908152600485016020526040812054909242926200308592918116911662004fab565b6001600160401b031611159392505050565b600054610100900460ff16620013105760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b66565b6200137f828262003bd7565b60006200311d8362001312565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6006810154600090600160801b90046001600160401b031615620031b9575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002ddc81336200432e565b60078801546000906001600160401b039081169087161015620032185760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620032b95760068901546001600160401b03600160801b90910481169089161115620032625760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b9092041614620032b257604051632bd2e3e760e01b815260040160405180910390fd5b506200332e565b506001600160401b038516600090815260028901602052604090205480620032f4576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b909104811690871611156200332e57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620033675750876001600160401b0316876001600160401b031611155b806200338b575060068901546001600160401b03600160c01b909104811690881611155b15620033aa5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b9004811690861614620033f1576040516332a2a77f60e01b815260040160405180910390fd5b6000620034038a888888868962003ed2565b9050600060008051602062005de683398151915260028360405162003429919062005388565b602060405180830381855afa15801562003447573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200346c91906200520b565b6200347891906200529a565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620034bc91889190600401620053a6565b602060405180830381865afa158015620034da573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620035009190620053e3565b6200351e576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c0160205260409020600201548590036200355d5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620035788a62003165565b60078b01549091506001600160401b039081169089161015620035ae5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620036515760068a01546001600160401b03600160801b9091048116908a161115620035f85760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200364a57604051632bd2e3e760e01b815260040160405180910390fd5b50620036c1565b6001600160401b038816600090815260028b0160205260409020549150816200368d576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b03161115620036c157604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620036f45760405163b9b18f5760e01b815260040160405180910390fd5b6000620037068b8a8a8a878b62003ed2565b9050600060008051602062005de68339815191526002836040516200372c919062005388565b602060405180830381855afa1580156200374a573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200376f91906200520b565b6200377b91906200529a565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620037bf91899190600401620053a6565b602060405180830381865afa158015620037dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620038039190620053e3565b62003821576040516309bde33960e01b815260040160405180910390fd5b60006200382f848b620051c1565b90506200388887826001600160401b03166200384a6200220b565b620038569190620050e7565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004358565b80608460088282829054906101000a90046001600160401b0316620038ae919062004fab565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b1580156200393e57600080fd5b505af115801562003953573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b9091048116908216111580620039a5575060068201546001600160401b03600160801b9091048116908216115b15620039c45760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003a8062002606565b6040518263ffffffff1660e01b815260040162003a9f91815260200190565b600060405180830381600087803b15801562003aba57600080fd5b505af115801562003acf573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003bb457600080fd5b505af115801562003bc9573d6000803e3d6000fd5b5050505062001310620043ac565b62003be38282620021e0565b6200137f5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003c4f8282620021e0565b156200137f5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b608080546000918291829062003cc99063ffffffff1662005101565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000866001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508060826000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150868260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550858260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550838260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003ec094939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003f08575081155b1562003f275760405163340c614f60e11b815260040160405180910390fd5b8062003f46576040516366385b5160e01b815260040160405180910390fd5b62003f518462004409565b62003f6f576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b60006200401a8362003165565b9050816000806200402c8484620051c1565b6085546001600160401b0391821692506000916200405391600160401b90041642620052b1565b90505b846001600160401b0316846001600160401b031614620040dd576001600160401b03808516600090815260038901602052604090206001810154909116821015620040b8576001810154600160401b90046001600160401b03169450620040d6565b620040c48686620051c1565b6001600160401b0316935050620040dd565b5062004056565b6000620040eb8484620052b1565b9050838110156200414957808403600c81116200410957806200410c565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a60865402816200413e576200413e62005225565b0460865550620041c1565b838103600c81116200415c57806200415f565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162004199576200419962005225565b04905080608654670de0b6b3a76400000281620041ba57620041ba62005225565b0460865550505b683635c9adc5dea000006086541115620041e857683635c9adc5dea0000060865562004200565b633b9aca0060865410156200420057633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002ddc5760068101546000906200425590600160c01b90046001600160401b0316600162004fab565b905062004263828262003052565b156200137f57600682015460009060029062004291908490600160801b90046001600160401b0316620051c1565b6200429d919062005407565b620042a9908362004fab565b9050620042b7838262003052565b15620042c957620011cb838262003966565b620011cb838362003966565b606f5460ff16620042f957604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6200433a8282620021e0565b6200137f57604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620011cb9084906200448f565b606f5460ff1615620043d157604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b03831610801562004440575067ffffffff00000001604083901c6001600160401b0316105b801562004461575067ffffffff00000001608083901c6001600160401b0316105b801562004479575067ffffffff0000000160c083901c105b156200448757506001919050565b506000919050565b6000620044e6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620045689092919063ffffffff16565b805190915015620011cb5780806020019051810190620045079190620053e3565b620011cb5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b66565b606062004579848460008562004581565b949350505050565b606082471015620045e45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b66565b600080866001600160a01b0316858760405162004602919062005388565b60006040518083038185875af1925050503d806000811462004641576040519150601f19603f3d011682016040523d82523d6000602084013e62004646565b606091505b509150915062001dfb8783838760608315620046c7578251600003620046bf576001600160a01b0385163b620046bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b66565b508162004579565b620045798383815115620046de5781518083602001fd5b8060405162461bcd60e51b815260040162000b66919062004cf3565b6108f5806200543183390190565b6001600160401b0391909116815260200190565b803563ffffffff81168114620031d157600080fd5b80356001600160401b0381168114620031d157600080fd5b600080604083850312156200475d57600080fd5b62004768836200471c565b9150620047786020840162004731565b90509250929050565b6001600160a01b038116811462002ddc57600080fd5b60008060008060008060c08789031215620047b157600080fd5b8635620047be8162004781565b9550620047ce6020880162004731565b9450620047de6040880162004731565b93506060870135620047f08162004781565b92506080870135620048028162004781565b915060a0870135620048148162004781565b809150509295509295509295565b6000602082840312156200483557600080fd5b62000b1b826200471c565b80610300810183101562000b1e57600080fd5b6000806000806000806000806103e0898b0312156200487157600080fd5b6200487c896200471c565b97506200488c60208a0162004731565b96506200489c60408a0162004731565b9550620048ac60608a0162004731565b9450620048bc60808a0162004731565b935060a0890135925060c08901359150620048db8a60e08b0162004840565b90509295985092959890939650565b6000806000806000806000806103e0898b0312156200490857600080fd5b62004913896200471c565b97506200492360208a0162004731565b96506200493360408a0162004731565b95506200494360608a0162004731565b94506080890135935060a0890135925060c0890135620049638162004781565b9150620048db8a60e08b0162004840565b6000602082840312156200498757600080fd5b813561ffff811681146200499a57600080fd5b9392505050565b600060208284031215620049b457600080fd5b5035919050565b60008060408385031215620049cf57600080fd5b823591506020830135620049e38162004781565b809150509250929050565b60006020828403121562004a0157600080fd5b62000b1b8262004731565b600080600080600080600080610100898b03121562004a2a57600080fd5b883562004a378162004781565b975062004a4760208a0162004731565b965062004a5760408a0162004731565b9550606089013562004a698162004781565b9450608089013562004a7b8162004781565b935060a089013562004a8d8162004781565b925060c089013562004a9f8162004781565b915060e089013562004ab18162004781565b809150509295985092959890939650565b634e487b7160e01b600052604160045260246000fd5b600082601f83011262004aea57600080fd5b81356001600160401b038082111562004b075762004b0762004ac2565b604051601f8301601f19908116603f0116810190828211818310171562004b325762004b3262004ac2565b8160405283815286602085880101111562004b4c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121562004b8857600080fd5b62004b93886200471c565b965062004ba36020890162004731565b9550604088013562004bb58162004781565b9450606088013562004bc78162004781565b9350608088013562004bd98162004781565b925060a08801356001600160401b038082111562004bf657600080fd5b62004c048b838c0162004ad8565b935060c08a013591508082111562004c1b57600080fd5b5062004c2a8a828b0162004ad8565b91505092959891949750929550565b60008060008060008060c0878903121562004c5357600080fd5b62004c5e876200471c565b955062004c6e6020880162004731565b945062004c7e6040880162004731565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004cbc57818101518382015260200162004ca2565b50506000910152565b6000815180845262004cdf81602086016020860162004c9f565b601f01601f19169290920160200192915050565b60208152600062000b1b602083018462004cc5565b6000806040838503121562004d1c57600080fd5b62004d278362004731565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000806000806060858703121562004d6057600080fd5b843562004d6d8162004781565b935062004d7d602086016200471c565b925060408501356001600160401b038082111562004d9a57600080fd5b818701915087601f83011262004daf57600080fd5b81358181111562004dbf57600080fd5b88602082850101111562004dd257600080fd5b95989497505060200194505050565b60006020828403121562004df457600080fd5b81356200499a8162004781565b803560ff81168114620031d157600080fd5b60008060008060008060c0878903121562004e2d57600080fd5b863562004e3a8162004781565b9550602087013562004e4c8162004781565b945062004e5c6040880162004731565b935062004e6c6060880162004731565b92506080870135915062004e8360a0880162004e01565b90509295509295509295565b60008060008060008060c0878903121562004ea957600080fd5b863562004eb68162004781565b9550602087013562004ec88162004781565b945062004ed86040880162004731565b935062004ee86060880162004e01565b92506080870135915060a08701356001600160401b0381111562004f0b57600080fd5b62004f1989828a0162004ad8565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004fce5762004fce62004f95565b5092915050565b8054600090600181811c908083168062004ff057607f831692505b602080841082036200501257634e487b7160e01b600052602260045260246000fd5b83885260208801828015620050305760018114620050475762005074565b60ff198716825285151560051b8201975062005074565b60008981526020902060005b878110156200506e5781548482015290860190840162005053565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c060408201819052600090620050af9083018762004fd5565b8281036060840152620050c3818762004fd5565b608084019590955250506001600160401b039190911660a090910152949350505050565b808202811582820484141762000b1e5762000b1e62004f95565b600063ffffffff8083168181036200511d576200511d62004f95565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620051559083018462004cc5565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c060808201819052600090620051a09083018562004cc5565b82810360a0840152620051b4818562004cc5565b9998505050505050505050565b6001600160401b0382811682821603908082111562004fce5762004fce62004f95565b60006001600160401b038281166002600160401b031981016200511d576200511d62004f95565b6000602082840312156200521e57600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b6000826200524d576200524d62005225565b500490565b8082018082111562000b1e5762000b1e62004f95565b634e487b7160e01b600052603260045260246000fd5b60006001820162005293576200529362004f95565b5060010190565b600082620052ac57620052ac62005225565b500690565b8181038181111562000b1e5762000b1e62004f95565b918252602082015260400190565b600081620052e757620052e762004f95565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190526000906200537c9083018462004cc5565b98975050505050505050565b600082516200539c81846020870162004c9f565b9190910192915050565b61032081016103008085843782018360005b6001811015620053d9578151835260209283019290910190600101620053b8565b5050509392505050565b600060208284031215620053f657600080fd5b815180151581146200499a57600080fd5b60006001600160401b038381168062005424576200542462005225565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220a19e7a72432195d9a35c7ce8fa5f1284415aac66bb1ad08a4c2e1c252fd8690864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220dd69b4fbcb587c5752b040baae00cd409fddf9ace44ff04b8c6ce19483951df464736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} From 1d9f1f20cf726a13ca29ee9516cc30d4486870e5 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 22 Nov 2023 15:17:19 +0100 Subject: [PATCH 099/230] generate tx in canonical mode always --- .../paris/PolygonDataComittee.json | 43 +++++++++- .../paris/PolygonRollupManager.json | 4 +- .../paris/PolygonRollupManagerMock.json | 4 +- .../PolygonRollupManagerMockInternalTest.json | 4 +- compiled-contracts/paris/PolygonZkEVMV2.json | 43 +++++++++- .../paris/PolygonZkEVMV2Existent.json | 43 +++++++++- contracts/v2/lib/PolygonRollupBase.sol | 80 ++++++++++++++----- contracts/v2/lib/PolygonRollupBaseEtrog.sol | 80 ++++++++++++++----- test/contractsv2/PolygonRollupManager.test.ts | 19 +++++ 9 files changed, 264 insertions(+), 56 deletions(-) diff --git a/compiled-contracts/paris/PolygonDataComittee.json b/compiled-contracts/paris/PolygonDataComittee.json index 91f6a49ba..1a9dc0614 100644 --- a/compiled-contracts/paris/PolygonDataComittee.json +++ b/compiled-contracts/paris/PolygonDataComittee.json @@ -518,6 +518,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS_EMPTY_METADATA", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "INITIALIZE_TX_CONSTANT_BYTES", @@ -531,6 +544,32 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "INITIALIZE_TX_CONSTANT_BYTES_EMPTY_METADATA", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_DATA_LEN_EMPTY_METADATA", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "INITIALIZE_TX_EFFECTIVE_PERCENTAGE", @@ -1164,8 +1203,8 @@ "type": "function" } ], - "bytecode": "0x6101206040523480156200001257600080fd5b50604051620051c8380380620051c8833981016040819052620000359162000078565b6001600160a01b0394851660a05292841660805290831660c052821660e0521661010052620000f8565b6001600160a01b03811681146200007557600080fd5b50565b600080600080600060a086880312156200009157600080fd5b85516200009e816200005f565b6020870151909550620000b1816200005f565b6040870151909450620000c4816200005f565b6060870151909350620000d7816200005f565b6080870151909250620000ea816200005f565b809150509295509295909350565b60805160a05160c05160e05161010051614fc7620002016000396000818161059101526121a3015260008181610525015281816109d001528181610b3d01528181610ee30152818161149c015281816122650152818161232e01528181612350015281816124e7015281816129ff01528181612acd01528181612bba01528181613539015281816135ba015281816135dc01526137060152600081816106810152818161113d0152818161189d015281816124280152613647015260008181610758015281816112f201528181611f1601528181612d05015261325c01526000818161079d01528181610868015281816122b8015281816123fe0152612cd90152614fc76000f3fe608060405234801561001057600080fd5b50600436106102f35760003560e01c80636ff512cc11610191578063c754c7ed116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b146107df578063f35dda47146107f2578063f851a440146107fa57600080fd5b8063d8d1091b14610785578063e46761c414610798578063e7a7ed02146107bf57600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610733578063d02103ca14610753578063d7bc90ff1461077a57600080fd5b8063c754c7ed146106f0578063c89e42df1461072057600080fd5b8063a3c573eb11610145578063ada8f9191161011f578063ada8f919146106be578063b0afe154146106d1578063b81fcafd146106dd57600080fd5b8063a3c573eb1461067c578063a652f26c146106a3578063aa3587d3146106b657600080fd5b80637a5460c5116101765780637a5460c51461061d5780638c3d7301146106595780639e0018771461066157600080fd5b80636ff512cc146105f7578063712570221461060a57600080fd5b806340b5de6c1161024a578063542028d5116101fe5780635ec91958116101d85780635ec91958146105c65780636b8616ce146105ce5780636e05d2cd146105ee57600080fd5b8063542028d51461058457806356e294351461058c5780635e9145c9146105b357600080fd5b806349b7b8021161022f57806349b7b802146105205780634c21fef3146105475780634e4877061461057157600080fd5b806340b5de6c146104a057806345605267146104f857600080fd5b806319d8ac61116102ac57806332c2d1531161028657806332c2d153146104285780633c351e101461043d5780633cbc795b1461046257600080fd5b806319d8ac611461039957806326782247146103c65780632b35b3ac1461040b57600080fd5b806305835f37116102dd57806305835f371461032e578063107bf28c1461037757806311e892d41461037f57600080fd5b8062d0295d146102f85780630350896314610313575b600080fd5b610300610820565b6040519081526020015b60405180910390f35b61031b602081565b60405161ffff909116815260200161030a565b61036a6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161030a91906140d5565b61036a610940565b61038760f981565b60405160ff909116815260200161030a565b6007546103ad9067ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161030a565b6001546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161030a565b6008546104189060ff1681565b604051901515815260200161030a565b61043b610436366004614135565b6109ce565b005b6008546103e690610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60085461048b907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161030a565b6104c77fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161030a565b6007546103ad90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b60085461041890790100000000000000000000000000000000000000000000000000900460ff1681565b61043b61057f366004614177565b610a9d565b61036a610cb7565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b61043b6105c13660046141e0565b610cc4565b61043b610d2d565b6103006105dc366004614177565b60066020526000908152604090205481565b61030060055481565b61043b61060536600461422c565b610e17565b61043b61061836600461439e565b610ee1565b61036a6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61043b611697565b6103e673a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b61036a6106b136600461444b565b61176a565b61043b611a94565b61043b6106cc36600461422c565b611b66565b6103006405ca1ab1e081565b61043b6106eb366004614502565b611c30565b6007546103ad907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61043b61072e3660046145b4565b6125b0565b6002546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b610300635ca1ab1e81565b61043b6107933660046145e9565b612643565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b6007546103ad9068010000000000000000900467ffffffffffffffff1681565b61043b6107ed36600461462b565b612b7a565b610387601b81565b6000546103e69062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156108af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d39190614677565b6007549091506000906109129067ffffffffffffffff7001000000000000000000000000000000008204811691680100000000000000009004166146bf565b67ffffffffffffffff1690508060000361092f5760009250505090565b61093981836146e7565b9250505090565b6004805461094d90614722565b80601f016020809104026020016040519081016040528092919081815260200182805461097990614722565b80156109c65780601f1061099b576101008083540402835291602001916109c6565b820191906000526020600020905b8154815290600101906020018083116109a957829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a3d576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a9091815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610af4576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b3b576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ba6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bca9190614775565b610c335760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c33576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461094d90614722565b600854790100000000000000000000000000000000000000000000000000900460ff16610d1d576040517f821935b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d28838383612f69565b505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610d84576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615610dc1576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610e6e576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610cac565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610f50576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610f705750600054600160ff909116105b80610f8a5750303b158015610f8a575060005460ff166001145b61101b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561107957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff85161561128e576110a0856137cd565b6110a9866138dd565b6110b2876139e4565b6040516020016110c493929190614797565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611185573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a991906147d0565b915091508163ffffffff1660001461124657600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff85160217905561128b565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b6008546000906112db908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff168561176a565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561135b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137f9190614677565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af11580156114fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151e919061480a565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600390816115b09190614875565b5060046115bd8982614875565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e60405161161d9392919061498f565b60405180910390a1505050505050801561168e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146116e8576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa60008760405160240161179e969594939291906149ce565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff700000000000000000000000000000000000000000000000000000000179052805190915061ffff1015611854576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600060f9611865602084614a31565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b9000000000000000000000000000000000000000000000000000000000000815250868860405160200161190a9796959493929190614a4c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015611998573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611a10576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051600090611a569084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614b2f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052955050505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611aeb576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff81167901000000000000000000000000000000000000000000000000009182900460ff16159091021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f4190600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611bbd576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610cac565b60025473ffffffffffffffffffffffffffffffffffffffff163314611c81576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836000819003611cbd576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611cf9576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156120e95760008b8b83818110611d4257611d42614b8b565b905060800201803603810190611d589190614bba565b805160608201519192509067ffffffffffffffff1615611ed35785611d7c81614c0f565b96505060008183602001518460600151604051602001611dd493929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114611e5d576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015611eb3576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055611fd1565b602082015115801590611f9a575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015611f74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f989190614677565b155b15611fd1576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff161080612004575042826040015167ffffffffffffffff16115b1561203b576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519650505080806120e190614c36565b915050611d26565b5060075467ffffffffffffffff6801000000000000000090910481169084161115612140576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861617905560058290556040517fc7a823e000000000000000000000000000000000000000000000000000000000815285907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063c7a823e0906121f19086908c908c90600401614cb7565b60006040518083038186803b15801561220957600080fd5b505afa15801561221d573d6000803e3d6000fd5b505050508167ffffffffffffffff168467ffffffffffffffff161461232857600061224883866146bf565b905061225e67ffffffffffffffff821683614cda565b91506122df7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16612297610820565b6122a19190614ced565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613ad7565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b612426337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123dd9190614677565b6123e79190614ced565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613bab565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561248e57600080fd5b505af11580156124a2573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af1158015612546573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256a919061480a565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a2505050505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612607576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036126138282614875565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610cac91906140d5565b60085460ff1661267f576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036126bb576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156126f7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612732918491700100000000000000000000000000000000900416614d04565b111561276a576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b838110156129f95760008686838181106127af576127af614b8b565b90506020028101906127c19190614d17565b6127ca90614d55565b9050836127d681614c0f565b825180516020918201208185015160408087015190519499509194506000936128389386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89166000908152600690935291205490915081146128c1576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86166000908152600660205260408120556128e6600188614cda565b84036129555742600760189054906101000a900467ffffffffffffffff1684604001516129139190614dd3565b67ffffffffffffffff161115612955576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806129f190614c36565b915050612793565b50612a277f000000000000000000000000000000000000000000000000000000000000000084612297610820565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612b16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3a919061480a565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612bb6576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c479190614677565b905081811115612c83576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612cbf576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d0173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613bab565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d929190614677565b600780549192506801000000000000000090910467ffffffffffffffff16906008612dbc83614c0f565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612df3929190614df4565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612f03576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612f62565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612f599493929190614e04565b60405180910390a25b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612fba576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003612ff6576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115613032576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b8581101561346e57600089898381811061307b5761307b614b8b565b905060200281019061308d9190614e44565b61309690614e78565b8051805160209091012060608201519192509067ffffffffffffffff161561321957856130c281614c0f565b9650506000818360200151846060015160405160200161311a93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a166000908152600690935291205490915081146131a3576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff1610156131f9576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055613356565b6020820151158015906132e0575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af11580156132ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132de9190614677565b155b15613317576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015613356576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff161080613389575042826040015167ffffffffffffffff16115b156133c0576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061346690614c36565b91505061305f565b5060075467ffffffffffffffff68010000000000000000909104811690841611156134c5576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146135b457600061351c83866146bf565b905061353267ffffffffffffffff821683614cda565b915061356b7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16612297610820565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b613645337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123b9573d6000803e3d6000fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156136ad57600080fd5b505af11580156136c1573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af1158015613765573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613789919061480a565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161384f9190614eee565b600060405180830381855afa9150503d806000811461388a576040519150601f19603f3d011682016040523d82523d6000602084013e61388f565b606091505b5091509150816138d4576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250611a8c565b611a8c81613c0f565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161395f9190614eee565b600060405180830381855afa9150503d806000811461399a576040519150601f19603f3d011682016040523d82523d6000602084013e61399f565b606091505b5091509150816138d4576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250611a8c565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff861691613a659190614eee565b600060405180830381855afa9150503d8060008114613aa0576040519150601f19603f3d011682016040523d82523d6000602084013e613aa5565b606091505b5091509150818015613ab8575080516020145b613ac3576012611a8c565b80806020019051810190611a8c9190614f00565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610d289084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613dea565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052613c099085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613b29565b50505050565b60606040825110613c345781806020019051810190613c2e9190614f23565b92915050565b8151602003613dac5760005b602081108015613c875750828181518110613c5d57613c5d614b8b565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613c9e5780613c9681614c36565b915050613c40565b80600003613ce157505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115613cfc57613cfc61425b565b6040519080825280601f01601f191660200182016040528015613d26576020820181803683370190505b50905060005b82811015613da457848181518110613d4657613d46614b8b565b602001015160f81c60f81b828281518110613d6357613d63614b8b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080613d9c81614c36565b915050613d2c565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b6000613e4c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613ef69092919063ffffffff16565b805190915015610d285780806020019051810190613e6a9190614775565b610d28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611012565b6060611a8c8484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051613f2a9190614eee565b60006040518083038185875af1925050503d8060008114613f67576040519150601f19603f3d011682016040523d82523d6000602084013e613f6c565b606091505b5091509150613f7d87838387613f88565b979650505050505050565b6060831561401e5782516000036140175773ffffffffffffffffffffffffffffffffffffffff85163b614017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611012565b5081611a8c565b611a8c83838151156140335781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101291906140d5565b60005b8381101561408257818101518382015260200161406a565b50506000910152565b600081518084526140a3816020860160208601614067565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006140e8602083018461408b565b9392505050565b67ffffffffffffffff8116811461410557600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461410557600080fd5b8035613de581614108565b60008060006060848603121561414a57600080fd5b8335614155816140ef565b925060208401359150604084013561416c81614108565b809150509250925092565b60006020828403121561418957600080fd5b81356140e8816140ef565b60008083601f8401126141a657600080fd5b50813567ffffffffffffffff8111156141be57600080fd5b6020830191508360208260051b85010111156141d957600080fd5b9250929050565b6000806000604084860312156141f557600080fd5b833567ffffffffffffffff81111561420c57600080fd5b61421886828701614194565b909450925050602084013561416c81614108565b60006020828403121561423e57600080fd5b81356140e881614108565b63ffffffff8116811461410557600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516080810167ffffffffffffffff811182821017156142ad576142ad61425b565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156142fa576142fa61425b565b604052919050565b600067ffffffffffffffff82111561431c5761431c61425b565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261435957600080fd5b813561436c61436782614302565b6142b3565b81815284602083860101111561438157600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c087890312156143b757600080fd5b86356143c281614108565b955060208701356143d281614108565b945060408701356143e281614249565b935060608701356143f281614108565b9250608087013567ffffffffffffffff8082111561440f57600080fd5b61441b8a838b01614348565b935060a089013591508082111561443157600080fd5b5061443e89828a01614348565b9150509295509295509295565b6000806000806080858703121561446157600080fd5b843561446c81614249565b9350602085013561447c81614108565b9250604085013561448c81614249565b9150606085013567ffffffffffffffff8111156144a857600080fd5b6144b487828801614348565b91505092959194509250565b60008083601f8401126144d257600080fd5b50813567ffffffffffffffff8111156144ea57600080fd5b6020830191508360208285010111156141d957600080fd5b60008060008060006060868803121561451a57600080fd5b853567ffffffffffffffff8082111561453257600080fd5b818801915088601f83011261454657600080fd5b81358181111561455557600080fd5b8960208260071b850101111561456a57600080fd5b602083019750809650506145806020890161412a565b9450604088013591508082111561459657600080fd5b506145a3888289016144c0565b969995985093965092949392505050565b6000602082840312156145c657600080fd5b813567ffffffffffffffff8111156145dd57600080fd5b611a8c84828501614348565b600080602083850312156145fc57600080fd5b823567ffffffffffffffff81111561461357600080fd5b61461f85828601614194565b90969095509350505050565b60008060006040848603121561464057600080fd5b833567ffffffffffffffff81111561465757600080fd5b614663868287016144c0565b909790965060209590950135949350505050565b60006020828403121561468957600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8281168282160390808211156146e0576146e0614690565b5092915050565b60008261471d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061473657607f821691505b60208210810361476f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561478757600080fd5b815180151581146140e857600080fd5b6060815260006147aa606083018661408b565b82810360208401526147bc818661408b565b91505060ff83166040830152949350505050565b600080604083850312156147e357600080fd5b82516147ee81614249565b60208401519092506147ff81614108565b809150509250929050565b60006020828403121561481c57600080fd5b81516140e8816140ef565b601f821115610d2857600081815260208120601f850160051c8101602086101561484e5750805b601f850160051c820191505b8181101561486d5782815560010161485a565b505050505050565b815167ffffffffffffffff81111561488f5761488f61425b565b6148a38161489d8454614722565b84614827565b602080601f8311600181146148f657600084156148c05750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561486d565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561494357888601518255948401946001909101908401614924565b508582101561497f57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006149a2606083018661408b565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152614a2560c083018461408b565b98975050505050505050565b61ffff8181168382160190808211156146e0576146e0614690565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614ab5816003860160208c01614067565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614af8816017840160208b01614067565b808201915050818660f01b16601782015284519150614b1e826019830160208801614067565b016019019998505050505050505050565b60008651614b41818460208b01614067565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060808284031215614bcc57600080fd5b614bd461428a565b82358152602083013560208201526040830135614bf0816140ef565b60408201526060830135614c03816140ef565b60608201529392505050565b600067ffffffffffffffff808316818103614c2c57614c2c614690565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614c6757614c67614690565b5060010190565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201526000614cd1604083018486614c6e565b95945050505050565b81810381811115613c2e57613c2e614690565b8082028115828204841417613c2e57613c2e614690565b80820180821115613c2e57613c2e614690565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112614d4b57600080fd5b9190910192915050565b600060608236031215614d6757600080fd5b6040516060810167ffffffffffffffff8282108183111715614d8b57614d8b61425b565b816040528435915080821115614da057600080fd5b50614dad36828601614348565b825250602083013560208201526040830135614dc8816140ef565b604082015292915050565b67ffffffffffffffff8181168382160190808211156146e0576146e0614690565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000614e3a606083018486614c6e565b9695505050505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112614d4b57600080fd5b600060808236031215614e8a57600080fd5b614e9261428a565b823567ffffffffffffffff811115614ea957600080fd5b614eb536828601614348565b825250602083013560208201526040830135614ed0816140ef565b60408201526060830135614ee3816140ef565b606082015292915050565b60008251614d4b818460208701614067565b600060208284031215614f1257600080fd5b815160ff811681146140e857600080fd5b600060208284031215614f3557600080fd5b815167ffffffffffffffff811115614f4c57600080fd5b8201601f81018413614f5d57600080fd5b8051614f6b61436782614302565b818152856020838501011115614f8057600080fd5b614cd182602083016020860161406756fea26469706673582212200d9a80d90b20d904d67c14143f500a701874514e1fc69c24fccb9b73d8f2486e64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102f35760003560e01c80636ff512cc11610191578063c754c7ed116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b146107df578063f35dda47146107f2578063f851a440146107fa57600080fd5b8063d8d1091b14610785578063e46761c414610798578063e7a7ed02146107bf57600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610733578063d02103ca14610753578063d7bc90ff1461077a57600080fd5b8063c754c7ed146106f0578063c89e42df1461072057600080fd5b8063a3c573eb11610145578063ada8f9191161011f578063ada8f919146106be578063b0afe154146106d1578063b81fcafd146106dd57600080fd5b8063a3c573eb1461067c578063a652f26c146106a3578063aa3587d3146106b657600080fd5b80637a5460c5116101765780637a5460c51461061d5780638c3d7301146106595780639e0018771461066157600080fd5b80636ff512cc146105f7578063712570221461060a57600080fd5b806340b5de6c1161024a578063542028d5116101fe5780635ec91958116101d85780635ec91958146105c65780636b8616ce146105ce5780636e05d2cd146105ee57600080fd5b8063542028d51461058457806356e294351461058c5780635e9145c9146105b357600080fd5b806349b7b8021161022f57806349b7b802146105205780634c21fef3146105475780634e4877061461057157600080fd5b806340b5de6c146104a057806345605267146104f857600080fd5b806319d8ac61116102ac57806332c2d1531161028657806332c2d153146104285780633c351e101461043d5780633cbc795b1461046257600080fd5b806319d8ac611461039957806326782247146103c65780632b35b3ac1461040b57600080fd5b806305835f37116102dd57806305835f371461032e578063107bf28c1461037757806311e892d41461037f57600080fd5b8062d0295d146102f85780630350896314610313575b600080fd5b610300610820565b6040519081526020015b60405180910390f35b61031b602081565b60405161ffff909116815260200161030a565b61036a6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161030a91906140d5565b61036a610940565b61038760f981565b60405160ff909116815260200161030a565b6007546103ad9067ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161030a565b6001546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161030a565b6008546104189060ff1681565b604051901515815260200161030a565b61043b610436366004614135565b6109ce565b005b6008546103e690610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60085461048b907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161030a565b6104c77fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161030a565b6007546103ad90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b60085461041890790100000000000000000000000000000000000000000000000000900460ff1681565b61043b61057f366004614177565b610a9d565b61036a610cb7565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b61043b6105c13660046141e0565b610cc4565b61043b610d2d565b6103006105dc366004614177565b60066020526000908152604090205481565b61030060055481565b61043b61060536600461422c565b610e17565b61043b61061836600461439e565b610ee1565b61036a6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61043b611697565b6103e673a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b61036a6106b136600461444b565b61176a565b61043b611a94565b61043b6106cc36600461422c565b611b66565b6103006405ca1ab1e081565b61043b6106eb366004614502565b611c30565b6007546103ad907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61043b61072e3660046145b4565b6125b0565b6002546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b610300635ca1ab1e81565b61043b6107933660046145e9565b612643565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b6007546103ad9068010000000000000000900467ffffffffffffffff1681565b61043b6107ed36600461462b565b612b7a565b610387601b81565b6000546103e69062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156108af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d39190614677565b6007549091506000906109129067ffffffffffffffff7001000000000000000000000000000000008204811691680100000000000000009004166146bf565b67ffffffffffffffff1690508060000361092f5760009250505090565b61093981836146e7565b9250505090565b6004805461094d90614722565b80601f016020809104026020016040519081016040528092919081815260200182805461097990614722565b80156109c65780601f1061099b576101008083540402835291602001916109c6565b820191906000526020600020905b8154815290600101906020018083116109a957829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a3d576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a9091815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610af4576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b3b576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ba6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bca9190614775565b610c335760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c33576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461094d90614722565b600854790100000000000000000000000000000000000000000000000000900460ff16610d1d576040517f821935b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d28838383612f69565b505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610d84576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615610dc1576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610e6e576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610cac565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610f50576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610f705750600054600160ff909116105b80610f8a5750303b158015610f8a575060005460ff166001145b61101b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561107957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff85161561128e576110a0856137cd565b6110a9866138dd565b6110b2876139e4565b6040516020016110c493929190614797565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611185573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a991906147d0565b915091508163ffffffff1660001461124657600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff85160217905561128b565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b6008546000906112db908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff168561176a565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561135b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137f9190614677565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af11580156114fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151e919061480a565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600390816115b09190614875565b5060046115bd8982614875565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e60405161161d9392919061498f565b60405180910390a1505050505050801561168e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146116e8576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa60008760405160240161179e969594939291906149ce565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff700000000000000000000000000000000000000000000000000000000179052805190915061ffff1015611854576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600060f9611865602084614a31565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b9000000000000000000000000000000000000000000000000000000000000815250868860405160200161190a9796959493929190614a4c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa158015611998573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611a10576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051600090611a569084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614b2f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052955050505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611aeb576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff81167901000000000000000000000000000000000000000000000000009182900460ff16159091021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f4190600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611bbd576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610cac565b60025473ffffffffffffffffffffffffffffffffffffffff163314611c81576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836000819003611cbd576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611cf9576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156120e95760008b8b83818110611d4257611d42614b8b565b905060800201803603810190611d589190614bba565b805160608201519192509067ffffffffffffffff1615611ed35785611d7c81614c0f565b96505060008183602001518460600151604051602001611dd493929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114611e5d576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015611eb3576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055611fd1565b602082015115801590611f9a575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015611f74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f989190614677565b155b15611fd1576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff161080612004575042826040015167ffffffffffffffff16115b1561203b576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519650505080806120e190614c36565b915050611d26565b5060075467ffffffffffffffff6801000000000000000090910481169084161115612140576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861617905560058290556040517fc7a823e000000000000000000000000000000000000000000000000000000000815285907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063c7a823e0906121f19086908c908c90600401614cb7565b60006040518083038186803b15801561220957600080fd5b505afa15801561221d573d6000803e3d6000fd5b505050508167ffffffffffffffff168467ffffffffffffffff161461232857600061224883866146bf565b905061225e67ffffffffffffffff821683614cda565b91506122df7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16612297610820565b6122a19190614ced565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613ad7565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b612426337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123dd9190614677565b6123e79190614ced565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613bab565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561248e57600080fd5b505af11580156124a2573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af1158015612546573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256a919061480a565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a2505050505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612607576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036126138282614875565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610cac91906140d5565b60085460ff1661267f576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036126bb576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156126f7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612732918491700100000000000000000000000000000000900416614d04565b111561276a576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b838110156129f95760008686838181106127af576127af614b8b565b90506020028101906127c19190614d17565b6127ca90614d55565b9050836127d681614c0f565b825180516020918201208185015160408087015190519499509194506000936128389386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89166000908152600690935291205490915081146128c1576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86166000908152600660205260408120556128e6600188614cda565b84036129555742600760189054906101000a900467ffffffffffffffff1684604001516129139190614dd3565b67ffffffffffffffff161115612955576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806129f190614c36565b915050612793565b50612a277f000000000000000000000000000000000000000000000000000000000000000084612297610820565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612b16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3a919061480a565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612bb6576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c479190614677565b905081811115612c83576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612cbf576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d0173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613bab565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d929190614677565b600780549192506801000000000000000090910467ffffffffffffffff16906008612dbc83614c0f565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612df3929190614df4565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612f03576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612f62565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612f599493929190614e04565b60405180910390a25b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612fba576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003612ff6576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115613032576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b8581101561346e57600089898381811061307b5761307b614b8b565b905060200281019061308d9190614e44565b61309690614e78565b8051805160209091012060608201519192509067ffffffffffffffff161561321957856130c281614c0f565b9650506000818360200151846060015160405160200161311a93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a166000908152600690935291205490915081146131a3576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff1610156131f9576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055613356565b6020820151158015906132e0575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af11580156132ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132de9190614677565b155b15613317576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015613356576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff161080613389575042826040015167ffffffffffffffff16115b156133c0576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061346690614c36565b91505061305f565b5060075467ffffffffffffffff68010000000000000000909104811690841611156134c5576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146135b457600061351c83866146bf565b905061353267ffffffffffffffff821683614cda565b915061356b7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16612297610820565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b613645337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123b9573d6000803e3d6000fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156136ad57600080fd5b505af11580156136c1573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af1158015613765573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613789919061480a565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161384f9190614eee565b600060405180830381855afa9150503d806000811461388a576040519150601f19603f3d011682016040523d82523d6000602084013e61388f565b606091505b5091509150816138d4576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250611a8c565b611a8c81613c0f565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161395f9190614eee565b600060405180830381855afa9150503d806000811461399a576040519150601f19603f3d011682016040523d82523d6000602084013e61399f565b606091505b5091509150816138d4576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250611a8c565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff861691613a659190614eee565b600060405180830381855afa9150503d8060008114613aa0576040519150601f19603f3d011682016040523d82523d6000602084013e613aa5565b606091505b5091509150818015613ab8575080516020145b613ac3576012611a8c565b80806020019051810190611a8c9190614f00565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610d289084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613dea565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052613c099085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613b29565b50505050565b60606040825110613c345781806020019051810190613c2e9190614f23565b92915050565b8151602003613dac5760005b602081108015613c875750828181518110613c5d57613c5d614b8b565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613c9e5780613c9681614c36565b915050613c40565b80600003613ce157505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115613cfc57613cfc61425b565b6040519080825280601f01601f191660200182016040528015613d26576020820181803683370190505b50905060005b82811015613da457848181518110613d4657613d46614b8b565b602001015160f81c60f81b828281518110613d6357613d63614b8b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080613d9c81614c36565b915050613d2c565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b6000613e4c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613ef69092919063ffffffff16565b805190915015610d285780806020019051810190613e6a9190614775565b610d28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611012565b6060611a8c8484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051613f2a9190614eee565b60006040518083038185875af1925050503d8060008114613f67576040519150601f19603f3d011682016040523d82523d6000602084013e613f6c565b606091505b5091509150613f7d87838387613f88565b979650505050505050565b6060831561401e5782516000036140175773ffffffffffffffffffffffffffffffffffffffff85163b614017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611012565b5081611a8c565b611a8c83838151156140335781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101291906140d5565b60005b8381101561408257818101518382015260200161406a565b50506000910152565b600081518084526140a3816020860160208601614067565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006140e8602083018461408b565b9392505050565b67ffffffffffffffff8116811461410557600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461410557600080fd5b8035613de581614108565b60008060006060848603121561414a57600080fd5b8335614155816140ef565b925060208401359150604084013561416c81614108565b809150509250925092565b60006020828403121561418957600080fd5b81356140e8816140ef565b60008083601f8401126141a657600080fd5b50813567ffffffffffffffff8111156141be57600080fd5b6020830191508360208260051b85010111156141d957600080fd5b9250929050565b6000806000604084860312156141f557600080fd5b833567ffffffffffffffff81111561420c57600080fd5b61421886828701614194565b909450925050602084013561416c81614108565b60006020828403121561423e57600080fd5b81356140e881614108565b63ffffffff8116811461410557600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516080810167ffffffffffffffff811182821017156142ad576142ad61425b565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156142fa576142fa61425b565b604052919050565b600067ffffffffffffffff82111561431c5761431c61425b565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261435957600080fd5b813561436c61436782614302565b6142b3565b81815284602083860101111561438157600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c087890312156143b757600080fd5b86356143c281614108565b955060208701356143d281614108565b945060408701356143e281614249565b935060608701356143f281614108565b9250608087013567ffffffffffffffff8082111561440f57600080fd5b61441b8a838b01614348565b935060a089013591508082111561443157600080fd5b5061443e89828a01614348565b9150509295509295509295565b6000806000806080858703121561446157600080fd5b843561446c81614249565b9350602085013561447c81614108565b9250604085013561448c81614249565b9150606085013567ffffffffffffffff8111156144a857600080fd5b6144b487828801614348565b91505092959194509250565b60008083601f8401126144d257600080fd5b50813567ffffffffffffffff8111156144ea57600080fd5b6020830191508360208285010111156141d957600080fd5b60008060008060006060868803121561451a57600080fd5b853567ffffffffffffffff8082111561453257600080fd5b818801915088601f83011261454657600080fd5b81358181111561455557600080fd5b8960208260071b850101111561456a57600080fd5b602083019750809650506145806020890161412a565b9450604088013591508082111561459657600080fd5b506145a3888289016144c0565b969995985093965092949392505050565b6000602082840312156145c657600080fd5b813567ffffffffffffffff8111156145dd57600080fd5b611a8c84828501614348565b600080602083850312156145fc57600080fd5b823567ffffffffffffffff81111561461357600080fd5b61461f85828601614194565b90969095509350505050565b60008060006040848603121561464057600080fd5b833567ffffffffffffffff81111561465757600080fd5b614663868287016144c0565b909790965060209590950135949350505050565b60006020828403121561468957600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8281168282160390808211156146e0576146e0614690565b5092915050565b60008261471d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061473657607f821691505b60208210810361476f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561478757600080fd5b815180151581146140e857600080fd5b6060815260006147aa606083018661408b565b82810360208401526147bc818661408b565b91505060ff83166040830152949350505050565b600080604083850312156147e357600080fd5b82516147ee81614249565b60208401519092506147ff81614108565b809150509250929050565b60006020828403121561481c57600080fd5b81516140e8816140ef565b601f821115610d2857600081815260208120601f850160051c8101602086101561484e5750805b601f850160051c820191505b8181101561486d5782815560010161485a565b505050505050565b815167ffffffffffffffff81111561488f5761488f61425b565b6148a38161489d8454614722565b84614827565b602080601f8311600181146148f657600084156148c05750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561486d565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561494357888601518255948401946001909101908401614924565b508582101561497f57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006149a2606083018661408b565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152614a2560c083018461408b565b98975050505050505050565b61ffff8181168382160190808211156146e0576146e0614690565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614ab5816003860160208c01614067565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614af8816017840160208b01614067565b808201915050818660f01b16601782015284519150614b1e826019830160208801614067565b016019019998505050505050505050565b60008651614b41818460208b01614067565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060808284031215614bcc57600080fd5b614bd461428a565b82358152602083013560208201526040830135614bf0816140ef565b60408201526060830135614c03816140ef565b60608201529392505050565b600067ffffffffffffffff808316818103614c2c57614c2c614690565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614c6757614c67614690565b5060010190565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201526000614cd1604083018486614c6e565b95945050505050565b81810381811115613c2e57613c2e614690565b8082028115828204841417613c2e57613c2e614690565b80820180821115613c2e57613c2e614690565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112614d4b57600080fd5b9190910192915050565b600060608236031215614d6757600080fd5b6040516060810167ffffffffffffffff8282108183111715614d8b57614d8b61425b565b816040528435915080821115614da057600080fd5b50614dad36828601614348565b825250602083013560208201526040830135614dc8816140ef565b604082015292915050565b67ffffffffffffffff8181168382160190808211156146e0576146e0614690565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000614e3a606083018486614c6e565b9695505050505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112614d4b57600080fd5b600060808236031215614e8a57600080fd5b614e9261428a565b823567ffffffffffffffff811115614ea957600080fd5b614eb536828601614348565b825250602083013560208201526040830135614ed0816140ef565b60408201526060830135614ee3816140ef565b606082015292915050565b60008251614d4b818460208701614067565b600060208284031215614f1257600080fd5b815160ff811681146140e857600080fd5b600060208284031215614f3557600080fd5b815167ffffffffffffffff811115614f4c57600080fd5b8201601f81018413614f5d57600080fd5b8051614f6b61436782614302565b818152856020838501011115614f8057600080fd5b614cd182602083016020860161406756fea26469706673582212200d9a80d90b20d904d67c14143f500a701874514e1fc69c24fccb9b73d8f2486e64736f6c63430008140033", + "bytecode": "0x6101206040523480156200001257600080fd5b50604051620053da380380620053da833981016040819052620000359162000078565b6001600160a01b0394851660a05292841660805290831660c052821660e0521661010052620000f8565b6001600160a01b03811681146200007557600080fd5b50565b600080600080600060a086880312156200009157600080fd5b85516200009e816200005f565b6020870151909550620000b1816200005f565b6040870151909450620000c4816200005f565b6060870151909350620000d7816200005f565b6080870151909250620000ea816200005f565b809150509295509295909350565b60805160a05160c05160e051610100516151d262000208600039600081816105ee01526122cb01526000818161054601528181610a3d01528181610baa01528181610f50015281816115090152818161238d01528181612456015281816124780152818161260f01528181612b2701528181612bf501528181612ce201528181613661015281816136e201528181613704015261382e0152600081816106e6015281816111aa015281816118d8015281816119e001528181612550015261376f0152600081816107c50152818161135f0152818161203e01528181612e2d015261338401526000818161080a015281816108d5015281816123e0015281816125260152612e0101526151d26000f3fe608060405234801561001057600080fd5b50600436106103145760003560e01c80636e05d2cd116101a7578063c754c7ed116100ee578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b1461084c578063f35dda471461085f578063f851a4401461086757600080fd5b8063d8d1091b146107f2578063e46761c414610805578063e7a7ed021461082c57600080fd5b8063cfa8ed47116100c8578063cfa8ed47146107a0578063d02103ca146107c0578063d7bc90ff146107e757600080fd5b8063c754c7ed14610755578063c7fffd4b14610785578063c89e42df1461078d57600080fd5b8063a3c573eb11610150578063ada8f9191161012a578063ada8f91914610723578063b0afe15414610736578063b81fcafd1461074257600080fd5b8063a3c573eb146106e1578063a652f26c14610708578063aa3587d31461071b57600080fd5b80637a5460c5116101815780637a5460c5146106825780638c3d7301146106be5780639e001877146106c657600080fd5b80636e05d2cd146106535780636ff512cc1461065c578063712570221461066f57600080fd5b806340b5de6c1161026b578063542028d5116102145780635ec91958116101ee5780635ec9195814610623578063676870d21461062b5780636b8616ce1461063357600080fd5b8063542028d5146105e157806356e29435146105e95780635e9145c91461061057600080fd5b80634c21fef3116102455780634c21fef3146105685780634e4877061461059257806352bdeb6d146105a557600080fd5b806340b5de6c146104c1578063456052671461051957806349b7b8021461054157600080fd5b806319d8ac61116102cd57806332c2d153116102a757806332c2d153146104495780633c351e101461045e5780633cbc795b1461048357600080fd5b806319d8ac61146103ba57806326782247146103e75780632b35b3ac1461042c57600080fd5b806305835f37116102fe57806305835f371461034f578063107bf28c1461039857806311e892d4146103a057600080fd5b8062d0295d146103195780630350896314610334575b600080fd5b61032161088d565b6040519081526020015b60405180910390f35b61033c602081565b60405161ffff909116815260200161032b565b61038b6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161032b91906141fd565b61038b6109ad565b6103a860f981565b60405160ff909116815260200161032b565b6007546103ce9067ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161032b565b6001546104079073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161032b565b6008546104399060ff1681565b604051901515815260200161032b565b61045c61045736600461425d565b610a3b565b005b60085461040790610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6008546104ac907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161032b565b6104e87fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161032b565b6007546103ce90700100000000000000000000000000000000900467ffffffffffffffff1681565b6104077f000000000000000000000000000000000000000000000000000000000000000081565b60085461043990790100000000000000000000000000000000000000000000000000900460ff1681565b61045c6105a036600461429f565b610b0a565b61038b6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61038b610d24565b6104077f000000000000000000000000000000000000000000000000000000000000000081565b61045c61061e366004614308565b610d31565b61045c610d9a565b61033c601f81565b61032161064136600461429f565b60066020526000908152604090205481565b61032160055481565b61045c61066a366004614354565b610e84565b61045c61067d3660046144c6565b610f4e565b61038b6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61045c611704565b61040773a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6104077f000000000000000000000000000000000000000000000000000000000000000081565b61038b610716366004614573565b6117d7565b61045c611bbc565b61045c610731366004614354565b611c8e565b6103216405ca1ab1e081565b61045c61075036600461462a565b611d58565b6007546103ce907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6103a860e481565b61045c61079b3660046146dc565b6126d8565b6002546104079073ffffffffffffffffffffffffffffffffffffffff1681565b6104077f000000000000000000000000000000000000000000000000000000000000000081565b610321635ca1ab1e81565b61045c610800366004614711565b61276b565b6104077f000000000000000000000000000000000000000000000000000000000000000081565b6007546103ce9068010000000000000000900467ffffffffffffffff1681565b61045c61085a366004614753565b612ca2565b6103a8601b81565b6000546104079062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561091c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610940919061479f565b60075490915060009061097f9067ffffffffffffffff7001000000000000000000000000000000008204811691680100000000000000009004166147e7565b67ffffffffffffffff1690508060000361099c5760009250505090565b6109a6818361480f565b9250505090565b600480546109ba9061484a565b80601f01602080910402602001604051908101604052809291908181526020018280546109e69061484a565b8015610a335780601f10610a0857610100808354040283529160200191610a33565b820191906000526020600020905b815481529060010190602001808311610a1657829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610aaa576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610afd91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610b61576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610ba8576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c37919061489d565b610ca05760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610ca0576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546109ba9061484a565b600854790100000000000000000000000000000000000000000000000000900460ff16610d8a576040517f821935b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d95838383613091565b505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610df1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615610e2e576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610edb576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610d19565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610fbd576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610fdd5750600054600160ff909116105b80610ff75750303b158015610ff7575060005460ff166001145b611088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156110e657600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff8516156112fb5761110d856138f5565b61111686613a05565b61111f87613b0c565b604051602001611131939291906148bf565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af11580156111f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121691906148f8565b915091508163ffffffff166000146112b357600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff8516021790556112f8565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b600854600090611348908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff16856117d7565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ec919061479f565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611567573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158b9190614932565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550886003908161161d919061499d565b50600461162a898261499d565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e60405161168a93929190614ab7565b60405180910390a150505050505080156116fb57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611755576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa60008760405160240161180b96959493929190614af6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff700000000000000000000000000000000000000000000000000000000179052835190915060609060000361195c5760f9601f83516118a09190614b59565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e4876040516020016119469796959493929190614b74565b6040516020818303038152906040529050611a60565b815161ffff1015611999576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96119a8602083614b59565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001611a4d9796959493929190614c57565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015611ac1573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611b39576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051600090611b7f9084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614d3a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611c13576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff81167901000000000000000000000000000000000000000000000000009182900460ff16159091021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f4190600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611ce5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610d19565b60025473ffffffffffffffffffffffffffffffffffffffff163314611da9576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836000819003611de5576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611e21576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156122115760008b8b83818110611e6a57611e6a614d96565b905060800201803603810190611e809190614dc5565b805160608201519192509067ffffffffffffffff1615611ffb5785611ea481614e1a565b96505060008183602001518460600151604051602001611efc93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114611f85576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015611fdb576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86166000908152600660205260408120556120f9565b6020820151158015906120c2575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af115801561209c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c0919061479f565b155b156120f9576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff16108061212c575042826040015167ffffffffffffffff16115b15612163576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061220990614e41565b915050611e4e565b5060075467ffffffffffffffff6801000000000000000090910481169084161115612268576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861617905560058290556040517fc7a823e000000000000000000000000000000000000000000000000000000000815285907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063c7a823e0906123199086908c908c90600401614ec2565b60006040518083038186803b15801561233157600080fd5b505afa158015612345573d6000803e3d6000fd5b505050508167ffffffffffffffff168467ffffffffffffffff161461245057600061237083866147e7565b905061238667ffffffffffffffff821683614ee5565b91506124077f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166123bf61088d565b6123c99190614ef8565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613bff565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b61254e337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612505919061479f565b61250f9190614ef8565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613cd3565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156125b657600080fd5b505af11580156125ca573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af115801561266e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126929190614932565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a2505050505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461272f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361273b828261499d565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610d1991906141fd565b60085460ff166127a7576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036127e3576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561281f576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff68010000000000000000820481169161285a918491700100000000000000000000000000000000900416614f0f565b1115612892576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015612b215760008686838181106128d7576128d7614d96565b90506020028101906128e99190614f22565b6128f290614f60565b9050836128fe81614e1a565b825180516020918201208185015160408087015190519499509194506000936129609386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89166000908152600690935291205490915081146129e9576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055612a0e600188614ee5565b8403612a7d5742600760189054906101000a900467ffffffffffffffff168460400151612a3b9190614fde565b67ffffffffffffffff161115612a7d576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080612b1990614e41565b9150506128bb565b50612b4f7f0000000000000000000000000000000000000000000000000000000000000000846123bf61088d565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612c3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c629190614932565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612cde576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d6f919061479f565b905081811115612dab576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612de7576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e2973ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613cd3565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eba919061479f565b600780549192506801000000000000000090910467ffffffffffffffff16906008612ee483614e1a565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612f1b929190614fff565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff166000908152600690935291205532330361302b576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a261308a565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613081949392919061500f565b60405180910390a25b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146130e2576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600081900361311e576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561315a576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156135965760008989838181106131a3576131a3614d96565b90506020028101906131b5919061504f565b6131be90615083565b8051805160209091012060608201519192509067ffffffffffffffff161561334157856131ea81614e1a565b9650506000818360200151846060015160405160200161324293929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a166000908152600690935291205490915081146132cb576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015613321576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff861660009081526006602052604081205561347e565b602082015115801590613408575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af11580156133e2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613406919061479f565b155b1561343f576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c0101561347e576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806134b1575042826040015167ffffffffffffffff16115b156134e8576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061358e90614e41565b915050613187565b5060075467ffffffffffffffff68010000000000000000909104811690841611156135ed576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146136dc57600061364483866147e7565b905061365a67ffffffffffffffff821683614ee5565b91506136937f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166123bf61088d565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b61376d337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124e1573d6000803e3d6000fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156137d557600080fd5b505af11580156137e9573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af115801561388d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138b19190614932565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161397791906150f9565b600060405180830381855afa9150503d80600081146139b2576040519150601f19603f3d011682016040523d82523d6000602084013e6139b7565b606091505b5091509150816139fc576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250611bb4565b611bb481613d37565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691613a8791906150f9565b600060405180830381855afa9150503d8060008114613ac2576040519150601f19603f3d011682016040523d82523d6000602084013e613ac7565b606091505b5091509150816139fc576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250611bb4565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff861691613b8d91906150f9565b600060405180830381855afa9150503d8060008114613bc8576040519150601f19603f3d011682016040523d82523d6000602084013e613bcd565b606091505b5091509150818015613be0575080516020145b613beb576012611bb4565b80806020019051810190611bb4919061510b565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610d959084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613f12565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052613d319085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613c51565b50505050565b60606040825110613d5c5781806020019051810190613d56919061512e565b92915050565b8151602003613ed45760005b602081108015613daf5750828181518110613d8557613d85614d96565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613dc65780613dbe81614e41565b915050613d68565b80600003613e0957505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115613e2457613e24614383565b6040519080825280601f01601f191660200182016040528015613e4e576020820181803683370190505b50905060005b82811015613ecc57848181518110613e6e57613e6e614d96565b602001015160f81c60f81b828281518110613e8b57613e8b614d96565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080613ec481614e41565b915050613e54565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b6000613f74826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661401e9092919063ffffffff16565b805190915015610d955780806020019051810190613f92919061489d565b610d95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161107f565b6060611bb48484600085856000808673ffffffffffffffffffffffffffffffffffffffff16858760405161405291906150f9565b60006040518083038185875af1925050503d806000811461408f576040519150601f19603f3d011682016040523d82523d6000602084013e614094565b606091505b50915091506140a5878383876140b0565b979650505050505050565b6060831561414657825160000361413f5773ffffffffffffffffffffffffffffffffffffffff85163b61413f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161107f565b5081611bb4565b611bb4838381511561415b5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107f91906141fd565b60005b838110156141aa578181015183820152602001614192565b50506000910152565b600081518084526141cb81602086016020860161418f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061421060208301846141b3565b9392505050565b67ffffffffffffffff8116811461422d57600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461422d57600080fd5b8035613f0d81614230565b60008060006060848603121561427257600080fd5b833561427d81614217565b925060208401359150604084013561429481614230565b809150509250925092565b6000602082840312156142b157600080fd5b813561421081614217565b60008083601f8401126142ce57600080fd5b50813567ffffffffffffffff8111156142e657600080fd5b6020830191508360208260051b850101111561430157600080fd5b9250929050565b60008060006040848603121561431d57600080fd5b833567ffffffffffffffff81111561433457600080fd5b614340868287016142bc565b909450925050602084013561429481614230565b60006020828403121561436657600080fd5b813561421081614230565b63ffffffff8116811461422d57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516080810167ffffffffffffffff811182821017156143d5576143d5614383565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561442257614422614383565b604052919050565b600067ffffffffffffffff82111561444457614444614383565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261448157600080fd5b813561449461448f8261442a565b6143db565b8181528460208386010111156144a957600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c087890312156144df57600080fd5b86356144ea81614230565b955060208701356144fa81614230565b9450604087013561450a81614371565b9350606087013561451a81614230565b9250608087013567ffffffffffffffff8082111561453757600080fd5b6145438a838b01614470565b935060a089013591508082111561455957600080fd5b5061456689828a01614470565b9150509295509295509295565b6000806000806080858703121561458957600080fd5b843561459481614371565b935060208501356145a481614230565b925060408501356145b481614371565b9150606085013567ffffffffffffffff8111156145d057600080fd5b6145dc87828801614470565b91505092959194509250565b60008083601f8401126145fa57600080fd5b50813567ffffffffffffffff81111561461257600080fd5b60208301915083602082850101111561430157600080fd5b60008060008060006060868803121561464257600080fd5b853567ffffffffffffffff8082111561465a57600080fd5b818801915088601f83011261466e57600080fd5b81358181111561467d57600080fd5b8960208260071b850101111561469257600080fd5b602083019750809650506146a860208901614252565b945060408801359150808211156146be57600080fd5b506146cb888289016145e8565b969995985093965092949392505050565b6000602082840312156146ee57600080fd5b813567ffffffffffffffff81111561470557600080fd5b611bb484828501614470565b6000806020838503121561472457600080fd5b823567ffffffffffffffff81111561473b57600080fd5b614747858286016142bc565b90969095509350505050565b60008060006040848603121561476857600080fd5b833567ffffffffffffffff81111561477f57600080fd5b61478b868287016145e8565b909790965060209590950135949350505050565b6000602082840312156147b157600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115614808576148086147b8565b5092915050565b600082614845577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061485e57607f821691505b602082108103614897577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000602082840312156148af57600080fd5b8151801515811461421057600080fd5b6060815260006148d260608301866141b3565b82810360208401526148e481866141b3565b91505060ff83166040830152949350505050565b6000806040838503121561490b57600080fd5b825161491681614371565b602084015190925061492781614230565b809150509250929050565b60006020828403121561494457600080fd5b815161421081614217565b601f821115610d9557600081815260208120601f850160051c810160208610156149765750805b601f850160051c820191505b8181101561499557828155600101614982565b505050505050565b815167ffffffffffffffff8111156149b7576149b7614383565b6149cb816149c5845461484a565b8461494f565b602080601f831160018114614a1e57600084156149e85750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555614995565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015614a6b57888601518255948401946001909101908401614a4c565b5085821015614aa757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081526000614aca60608301866141b3565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152614b4d60c08301846141b3565b98975050505050505050565b61ffff818116838216019080821115614808576148086147b8565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614bdd816003860160208c0161418f565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614c20816017840160208b0161418f565b808201915050818660f81b16601782015284519150614c4682601883016020880161418f565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614cc0816003860160208c0161418f565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614d03816017840160208b0161418f565b808201915050818660f01b16601782015284519150614d2982601983016020880161418f565b016019019998505050505050505050565b60008651614d4c818460208b0161418f565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060808284031215614dd757600080fd5b614ddf6143b2565b82358152602083013560208201526040830135614dfb81614217565b60408201526060830135614e0e81614217565b60608201529392505050565b600067ffffffffffffffff808316818103614e3757614e376147b8565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e7257614e726147b8565b5060010190565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201526000614edc604083018486614e79565b95945050505050565b81810381811115613d5657613d566147b8565b8082028115828204841417613d5657613d566147b8565b80820180821115613d5657613d566147b8565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112614f5657600080fd5b9190910192915050565b600060608236031215614f7257600080fd5b6040516060810167ffffffffffffffff8282108183111715614f9657614f96614383565b816040528435915080821115614fab57600080fd5b50614fb836828601614470565b825250602083013560208201526040830135614fd381614217565b604082015292915050565b67ffffffffffffffff818116838216019080821115614808576148086147b8565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000615045606083018486614e79565b9695505050505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112614f5657600080fd5b60006080823603121561509557600080fd5b61509d6143b2565b823567ffffffffffffffff8111156150b457600080fd5b6150c036828601614470565b8252506020830135602082015260408301356150db81614217565b604082015260608301356150ee81614217565b606082015292915050565b60008251614f5681846020870161418f565b60006020828403121561511d57600080fd5b815160ff8116811461421057600080fd5b60006020828403121561514057600080fd5b815167ffffffffffffffff81111561515757600080fd5b8201601f8101841361516857600080fd5b805161517661448f8261442a565b81815285602083850101111561518b57600080fd5b614edc82602083016020860161418f56fea26469706673582212204dc04565b6e3d21f6916e9dd89d1e8fa91fdeee776dc3af2a63fe8c50301199d64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106103145760003560e01c80636e05d2cd116101a7578063c754c7ed116100ee578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b1461084c578063f35dda471461085f578063f851a4401461086757600080fd5b8063d8d1091b146107f2578063e46761c414610805578063e7a7ed021461082c57600080fd5b8063cfa8ed47116100c8578063cfa8ed47146107a0578063d02103ca146107c0578063d7bc90ff146107e757600080fd5b8063c754c7ed14610755578063c7fffd4b14610785578063c89e42df1461078d57600080fd5b8063a3c573eb11610150578063ada8f9191161012a578063ada8f91914610723578063b0afe15414610736578063b81fcafd1461074257600080fd5b8063a3c573eb146106e1578063a652f26c14610708578063aa3587d31461071b57600080fd5b80637a5460c5116101815780637a5460c5146106825780638c3d7301146106be5780639e001877146106c657600080fd5b80636e05d2cd146106535780636ff512cc1461065c578063712570221461066f57600080fd5b806340b5de6c1161026b578063542028d5116102145780635ec91958116101ee5780635ec9195814610623578063676870d21461062b5780636b8616ce1461063357600080fd5b8063542028d5146105e157806356e29435146105e95780635e9145c91461061057600080fd5b80634c21fef3116102455780634c21fef3146105685780634e4877061461059257806352bdeb6d146105a557600080fd5b806340b5de6c146104c1578063456052671461051957806349b7b8021461054157600080fd5b806319d8ac61116102cd57806332c2d153116102a757806332c2d153146104495780633c351e101461045e5780633cbc795b1461048357600080fd5b806319d8ac61146103ba57806326782247146103e75780632b35b3ac1461042c57600080fd5b806305835f37116102fe57806305835f371461034f578063107bf28c1461039857806311e892d4146103a057600080fd5b8062d0295d146103195780630350896314610334575b600080fd5b61032161088d565b6040519081526020015b60405180910390f35b61033c602081565b60405161ffff909116815260200161032b565b61038b6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161032b91906141fd565b61038b6109ad565b6103a860f981565b60405160ff909116815260200161032b565b6007546103ce9067ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161032b565b6001546104079073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161032b565b6008546104399060ff1681565b604051901515815260200161032b565b61045c61045736600461425d565b610a3b565b005b60085461040790610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6008546104ac907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161032b565b6104e87fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161032b565b6007546103ce90700100000000000000000000000000000000900467ffffffffffffffff1681565b6104077f000000000000000000000000000000000000000000000000000000000000000081565b60085461043990790100000000000000000000000000000000000000000000000000900460ff1681565b61045c6105a036600461429f565b610b0a565b61038b6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61038b610d24565b6104077f000000000000000000000000000000000000000000000000000000000000000081565b61045c61061e366004614308565b610d31565b61045c610d9a565b61033c601f81565b61032161064136600461429f565b60066020526000908152604090205481565b61032160055481565b61045c61066a366004614354565b610e84565b61045c61067d3660046144c6565b610f4e565b61038b6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61045c611704565b61040773a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6104077f000000000000000000000000000000000000000000000000000000000000000081565b61038b610716366004614573565b6117d7565b61045c611bbc565b61045c610731366004614354565b611c8e565b6103216405ca1ab1e081565b61045c61075036600461462a565b611d58565b6007546103ce907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6103a860e481565b61045c61079b3660046146dc565b6126d8565b6002546104079073ffffffffffffffffffffffffffffffffffffffff1681565b6104077f000000000000000000000000000000000000000000000000000000000000000081565b610321635ca1ab1e81565b61045c610800366004614711565b61276b565b6104077f000000000000000000000000000000000000000000000000000000000000000081565b6007546103ce9068010000000000000000900467ffffffffffffffff1681565b61045c61085a366004614753565b612ca2565b6103a8601b81565b6000546104079062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561091c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610940919061479f565b60075490915060009061097f9067ffffffffffffffff7001000000000000000000000000000000008204811691680100000000000000009004166147e7565b67ffffffffffffffff1690508060000361099c5760009250505090565b6109a6818361480f565b9250505090565b600480546109ba9061484a565b80601f01602080910402602001604051908101604052809291908181526020018280546109e69061484a565b8015610a335780601f10610a0857610100808354040283529160200191610a33565b820191906000526020600020905b815481529060010190602001808311610a1657829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610aaa576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610afd91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610b61576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610ba8576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c37919061489d565b610ca05760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610ca0576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546109ba9061484a565b600854790100000000000000000000000000000000000000000000000000900460ff16610d8a576040517f821935b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d95838383613091565b505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610df1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615610e2e576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610edb576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610d19565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610fbd576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610fdd5750600054600160ff909116105b80610ff75750303b158015610ff7575060005460ff166001145b611088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156110e657600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff8516156112fb5761110d856138f5565b61111686613a05565b61111f87613b0c565b604051602001611131939291906148bf565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af11580156111f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121691906148f8565b915091508163ffffffff166000146112b357600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff8516021790556112f8565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b600854600090611348908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff16856117d7565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ec919061479f565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611567573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158b9190614932565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550886003908161161d919061499d565b50600461162a898261499d565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e60405161168a93929190614ab7565b60405180910390a150505050505080156116fb57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611755576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa60008760405160240161180b96959493929190614af6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff700000000000000000000000000000000000000000000000000000000179052835190915060609060000361195c5760f9601f83516118a09190614b59565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e4876040516020016119469796959493929190614b74565b6040516020818303038152906040529050611a60565b815161ffff1015611999576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96119a8602083614b59565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001611a4d9796959493929190614c57565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015611ac1573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611b39576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051600090611b7f9084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614d3a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611c13576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff81167901000000000000000000000000000000000000000000000000009182900460ff16159091021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f4190600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611ce5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610d19565b60025473ffffffffffffffffffffffffffffffffffffffff163314611da9576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836000819003611de5576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611e21576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156122115760008b8b83818110611e6a57611e6a614d96565b905060800201803603810190611e809190614dc5565b805160608201519192509067ffffffffffffffff1615611ffb5785611ea481614e1a565b96505060008183602001518460600151604051602001611efc93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114611f85576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015611fdb576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86166000908152600660205260408120556120f9565b6020820151158015906120c2575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af115801561209c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c0919061479f565b155b156120f9576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff16108061212c575042826040015167ffffffffffffffff16115b15612163576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061220990614e41565b915050611e4e565b5060075467ffffffffffffffff6801000000000000000090910481169084161115612268576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861617905560058290556040517fc7a823e000000000000000000000000000000000000000000000000000000000815285907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063c7a823e0906123199086908c908c90600401614ec2565b60006040518083038186803b15801561233157600080fd5b505afa158015612345573d6000803e3d6000fd5b505050508167ffffffffffffffff168467ffffffffffffffff161461245057600061237083866147e7565b905061238667ffffffffffffffff821683614ee5565b91506124077f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166123bf61088d565b6123c99190614ef8565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613bff565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b61254e337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612505919061479f565b61250f9190614ef8565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613cd3565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156125b657600080fd5b505af11580156125ca573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af115801561266e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126929190614932565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a2505050505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461272f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361273b828261499d565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610d1991906141fd565b60085460ff166127a7576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036127e3576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561281f576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff68010000000000000000820481169161285a918491700100000000000000000000000000000000900416614f0f565b1115612892576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015612b215760008686838181106128d7576128d7614d96565b90506020028101906128e99190614f22565b6128f290614f60565b9050836128fe81614e1a565b825180516020918201208185015160408087015190519499509194506000936129609386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89166000908152600690935291205490915081146129e9576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055612a0e600188614ee5565b8403612a7d5742600760189054906101000a900467ffffffffffffffff168460400151612a3b9190614fde565b67ffffffffffffffff161115612a7d576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080612b1990614e41565b9150506128bb565b50612b4f7f0000000000000000000000000000000000000000000000000000000000000000846123bf61088d565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612c3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c629190614932565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612cde576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d6f919061479f565b905081811115612dab576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612de7576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e2973ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613cd3565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eba919061479f565b600780549192506801000000000000000090910467ffffffffffffffff16906008612ee483614e1a565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612f1b929190614fff565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff166000908152600690935291205532330361302b576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a261308a565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613081949392919061500f565b60405180910390a25b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146130e2576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600081900361311e576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561315a576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156135965760008989838181106131a3576131a3614d96565b90506020028101906131b5919061504f565b6131be90615083565b8051805160209091012060608201519192509067ffffffffffffffff161561334157856131ea81614e1a565b9650506000818360200151846060015160405160200161324293929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a166000908152600690935291205490915081146132cb576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015613321576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff861660009081526006602052604081205561347e565b602082015115801590613408575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af11580156133e2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613406919061479f565b155b1561343f576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c0101561347e576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806134b1575042826040015167ffffffffffffffff16115b156134e8576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061358e90614e41565b915050613187565b5060075467ffffffffffffffff68010000000000000000909104811690841611156135ed576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146136dc57600061364483866147e7565b905061365a67ffffffffffffffff821683614ee5565b91506136937f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166123bf61088d565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b61376d337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124e1573d6000803e3d6000fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156137d557600080fd5b505af11580156137e9573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af115801561388d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138b19190614932565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161397791906150f9565b600060405180830381855afa9150503d80600081146139b2576040519150601f19603f3d011682016040523d82523d6000602084013e6139b7565b606091505b5091509150816139fc576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250611bb4565b611bb481613d37565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691613a8791906150f9565b600060405180830381855afa9150503d8060008114613ac2576040519150601f19603f3d011682016040523d82523d6000602084013e613ac7565b606091505b5091509150816139fc576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250611bb4565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff861691613b8d91906150f9565b600060405180830381855afa9150503d8060008114613bc8576040519150601f19603f3d011682016040523d82523d6000602084013e613bcd565b606091505b5091509150818015613be0575080516020145b613beb576012611bb4565b80806020019051810190611bb4919061510b565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610d959084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613f12565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052613d319085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613c51565b50505050565b60606040825110613d5c5781806020019051810190613d56919061512e565b92915050565b8151602003613ed45760005b602081108015613daf5750828181518110613d8557613d85614d96565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613dc65780613dbe81614e41565b915050613d68565b80600003613e0957505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115613e2457613e24614383565b6040519080825280601f01601f191660200182016040528015613e4e576020820181803683370190505b50905060005b82811015613ecc57848181518110613e6e57613e6e614d96565b602001015160f81c60f81b828281518110613e8b57613e8b614d96565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080613ec481614e41565b915050613e54565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b6000613f74826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661401e9092919063ffffffff16565b805190915015610d955780806020019051810190613f92919061489d565b610d95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161107f565b6060611bb48484600085856000808673ffffffffffffffffffffffffffffffffffffffff16858760405161405291906150f9565b60006040518083038185875af1925050503d806000811461408f576040519150601f19603f3d011682016040523d82523d6000602084013e614094565b606091505b50915091506140a5878383876140b0565b979650505050505050565b6060831561414657825160000361413f5773ffffffffffffffffffffffffffffffffffffffff85163b61413f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161107f565b5081611bb4565b611bb4838381511561415b5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107f91906141fd565b60005b838110156141aa578181015183820152602001614192565b50506000910152565b600081518084526141cb81602086016020860161418f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061421060208301846141b3565b9392505050565b67ffffffffffffffff8116811461422d57600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461422d57600080fd5b8035613f0d81614230565b60008060006060848603121561427257600080fd5b833561427d81614217565b925060208401359150604084013561429481614230565b809150509250925092565b6000602082840312156142b157600080fd5b813561421081614217565b60008083601f8401126142ce57600080fd5b50813567ffffffffffffffff8111156142e657600080fd5b6020830191508360208260051b850101111561430157600080fd5b9250929050565b60008060006040848603121561431d57600080fd5b833567ffffffffffffffff81111561433457600080fd5b614340868287016142bc565b909450925050602084013561429481614230565b60006020828403121561436657600080fd5b813561421081614230565b63ffffffff8116811461422d57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516080810167ffffffffffffffff811182821017156143d5576143d5614383565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561442257614422614383565b604052919050565b600067ffffffffffffffff82111561444457614444614383565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261448157600080fd5b813561449461448f8261442a565b6143db565b8181528460208386010111156144a957600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c087890312156144df57600080fd5b86356144ea81614230565b955060208701356144fa81614230565b9450604087013561450a81614371565b9350606087013561451a81614230565b9250608087013567ffffffffffffffff8082111561453757600080fd5b6145438a838b01614470565b935060a089013591508082111561455957600080fd5b5061456689828a01614470565b9150509295509295509295565b6000806000806080858703121561458957600080fd5b843561459481614371565b935060208501356145a481614230565b925060408501356145b481614371565b9150606085013567ffffffffffffffff8111156145d057600080fd5b6145dc87828801614470565b91505092959194509250565b60008083601f8401126145fa57600080fd5b50813567ffffffffffffffff81111561461257600080fd5b60208301915083602082850101111561430157600080fd5b60008060008060006060868803121561464257600080fd5b853567ffffffffffffffff8082111561465a57600080fd5b818801915088601f83011261466e57600080fd5b81358181111561467d57600080fd5b8960208260071b850101111561469257600080fd5b602083019750809650506146a860208901614252565b945060408801359150808211156146be57600080fd5b506146cb888289016145e8565b969995985093965092949392505050565b6000602082840312156146ee57600080fd5b813567ffffffffffffffff81111561470557600080fd5b611bb484828501614470565b6000806020838503121561472457600080fd5b823567ffffffffffffffff81111561473b57600080fd5b614747858286016142bc565b90969095509350505050565b60008060006040848603121561476857600080fd5b833567ffffffffffffffff81111561477f57600080fd5b61478b868287016145e8565b909790965060209590950135949350505050565b6000602082840312156147b157600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115614808576148086147b8565b5092915050565b600082614845577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061485e57607f821691505b602082108103614897577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000602082840312156148af57600080fd5b8151801515811461421057600080fd5b6060815260006148d260608301866141b3565b82810360208401526148e481866141b3565b91505060ff83166040830152949350505050565b6000806040838503121561490b57600080fd5b825161491681614371565b602084015190925061492781614230565b809150509250929050565b60006020828403121561494457600080fd5b815161421081614217565b601f821115610d9557600081815260208120601f850160051c810160208610156149765750805b601f850160051c820191505b8181101561499557828155600101614982565b505050505050565b815167ffffffffffffffff8111156149b7576149b7614383565b6149cb816149c5845461484a565b8461494f565b602080601f831160018114614a1e57600084156149e85750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555614995565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015614a6b57888601518255948401946001909101908401614a4c565b5085821015614aa757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081526000614aca60608301866141b3565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152614b4d60c08301846141b3565b98975050505050505050565b61ffff818116838216019080821115614808576148086147b8565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614bdd816003860160208c0161418f565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614c20816017840160208b0161418f565b808201915050818660f81b16601782015284519150614c4682601883016020880161418f565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614cc0816003860160208c0161418f565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614d03816017840160208b0161418f565b808201915050818660f01b16601782015284519150614d2982601983016020880161418f565b016019019998505050505050505050565b60008651614d4c818460208b0161418f565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060808284031215614dd757600080fd5b614ddf6143b2565b82358152602083013560208201526040830135614dfb81614217565b60408201526060830135614e0e81614217565b60608201529392505050565b600067ffffffffffffffff808316818103614e3757614e376147b8565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e7257614e726147b8565b5060010190565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201526000614edc604083018486614e79565b95945050505050565b81810381811115613d5657613d566147b8565b8082028115828204841417613d5657613d566147b8565b80820180821115613d5657613d566147b8565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112614f5657600080fd5b9190910192915050565b600060608236031215614f7257600080fd5b6040516060810167ffffffffffffffff8282108183111715614f9657614f96614383565b816040528435915080821115614fab57600080fd5b50614fb836828601614470565b825250602083013560208201526040830135614fd381614217565b604082015292915050565b67ffffffffffffffff818116838216019080821115614808576148086147b8565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000615045606083018486614e79565b9695505050505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112614f5657600080fd5b60006080823603121561509557600080fd5b61509d6143b2565b823567ffffffffffffffff8111156150b457600080fd5b6150c036828601614470565b8252506020830135602082015260408301356150db81614217565b604082015260608301356150ee81614217565b606082015292915050565b60008251614f5681846020870161418f565b60006020828403121561511d57600080fd5b815160ff8116811461421057600080fd5b60006020828403121561514057600080fd5b815167ffffffffffffffff81111561515757600080fd5b8201601f8101841361516857600080fd5b805161517661448f8261442a565b81815285602083850101111561518b57600080fd5b614edc82602083016020860161418f56fea26469706673582212204dc04565b6e3d21f6916e9dd89d1e8fa91fdeee776dc3af2a63fe8c50301199d64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonRollupManager.json b/compiled-contracts/paris/PolygonRollupManager.json index 4b69d10c9..f0aab1bd3 100644 --- a/compiled-contracts/paris/PolygonRollupManager.json +++ b/compiled-contracts/paris/PolygonRollupManager.json @@ -1931,8 +1931,8 @@ "type": "function" } ], - "bytecode": "0x60e06040523480156200001157600080fd5b5060405162005d7338038062005d7383398101604081905262000034916200006b565b6001600160a01b0392831660805290821660c0521660a052620000bf565b6001600160a01b03811681146200006857600080fd5b50565b6000806000606084860312156200008157600080fd5b83516200008e8162000052565b6020850151909350620000a18162000052565b6040850151909250620000b48162000052565b809150509250925092565b60805160a05160c051615c4c6200012760003960008181610a0f0152818161212801526137270152600081816107c701528181612cb00152613a2201526000818161096901528181610c6601528181610e1601528181611e6c01526139110152615c4c6000f3fe60806040523480156200001157600080fd5b5060043610620003095760003560e01c806387c20c01116200019d578063c4c928c211620000eb578063dbc16976116200009e578063dbc1697614620009cd578063dde0ff7714620009d7578063e0bfd3d214620009f2578063e46761c41462000a09578063f34eb8eb1462000a31578063f4e926751462000a48578063f9c4c2ae1462000a5957600080fd5b8063c4c928c21462000923578063ceee281d146200093a578063d02103ca1462000963578063d5073f6f146200098b578063d547741f14620009a2578063d939b31514620009b957600080fd5b8063a066215c1162000150578063a066215c1462000797578063a217fddf14620007ae578063a2967d9914620007b7578063a3c573eb14620007c1578063afd23cbe1462000802578063b99d0ad7146200082c578063c1acbc34146200090857600080fd5b806387c20c01146200071a5780638bd4f071146200073157806391d14854146200074857806399f5634e146200075f5780639a908e7314620007695780639c9f3dfe146200078057600080fd5b80632f2ff15d116200025b57806360469169116200020e5780636046916914620005c957806365c0504d14620005d35780637222020f1462000682578063727885e914620006995780637975fcfe14620006b05780637fb6e76a14620006d6578063841b24d714620006ff57600080fd5b80632f2ff15d146200052057806336568abe1462000537578063394218e9146200054e578063477fa27014620005655780634d4d3338146200056e57806355a71ee0146200058557600080fd5b806315064c9611620002c057806315064c9614620003c95780631608859c14620003d75780631796a1ae14620003ee5780631816b7e514620004155780632072f6c5146200042c578063248a9ca3146200043657806325280169146200046b57600080fd5b8063066ec012146200030e578063080b3111146200033f5780630a0d9fbe146200036757806311f6b287146200038257806312b86e1914620003995780631489ed1014620003b2575b600080fd5b60845462000322906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b6200035662000350366004620046c6565b62000b70565b604051901515815260200162000336565b6085546200032290600160401b90046001600160401b031681565b6200032262000393366004620046fe565b62000b9a565b620003b0620003aa3660046200472f565b62000bba565b005b620003b0620003c3366004620047dc565b62000d6a565b606f54620003569060ff1681565b620003b0620003e8366004620046c6565b62000f00565b607e54620003ff9063ffffffff1681565b60405163ffffffff909116815260200162000336565b620003b06200042636600462004866565b62000f95565b620003b062001041565b6200045c6200044736600462004893565b60009081526034602052604090206001015490565b60405190815260200162000336565b620004ec6200047c366004620046c6565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b0390811691830191909152928201519092169082015260600162000336565b620003b062000531366004620048ad565b620010d7565b620003b062000548366004620048ad565b62001100565b620003b06200055f366004620048e0565b6200113a565b6086546200045c565b620003b06200057f366004620048fe565b620011ee565b6200045c62000596366004620046c6565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b6200045c6200173b565b62000638620005e4366004620046fe565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c00162000336565b620003b062000693366004620046fe565b62001753565b620003b0620006aa36600462004a5e565b6200184f565b620006c7620006c136600462004b2b565b62001cc8565b60405162000336919062004be5565b620003ff620006e7366004620048e0565b60836020526000908152604090205463ffffffff1681565b6084546200032290600160c01b90046001600160401b031681565b620003b06200072b366004620047dc565b62001cfb565b620003b0620007423660046200472f565b62002025565b6200035662000759366004620048ad565b620020db565b6200045c62002106565b620003226200077a36600462004bfa565b620021ed565b620003b062000791366004620048e0565b620023bf565b620003b0620007a8366004620048e0565b62002465565b6200045c600081565b6200045c62002509565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200162000336565b6085546200081890600160801b900461ffff1681565b60405161ffff909116815260200162000336565b620008c26200083d366004620046c6565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b60405162000336919060006080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200032290600160801b90046001600160401b031681565b620003b06200093436600462004c27565b620028de565b620003ff6200094b36600462004cbf565b60826020526000908152604090205463ffffffff1681565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b620003b06200099c36600462004893565b62002bbd565b620003b0620009b3366004620048ad565b62002c59565b60855462000322906001600160401b031681565b620003b062002c82565b6084546200032290600160401b90046001600160401b031681565b620003b062000a0336600462004cf1565b62002d30565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b620003b062000a4236600462004d6d565b62002dc9565b608054620003ff9063ffffffff1681565b62000af062000a6a366004620046fe565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff166101608201526101800162000336565b63ffffffff8216600090815260816020526040812062000b91908362002fc5565b90505b92915050565b63ffffffff8116600090815260816020526040812062000b94906200300a565b60008051602062005bf783398151915262000bd5816200307b565b63ffffffff8916600090815260816020526040902062000bfc818a8a8a8a8a8a8a62003087565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000c64576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000c9d62002509565b6040518263ffffffff1660e01b815260040162000cbc91815260200190565b600060405180830381600087803b15801562000cd757600080fd5b505af115801562000cec573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005bf783398151915262000d85816200307b565b63ffffffff8916600090815260816020526040902062000dac818a8a8a8a8a8a8a62003420565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562000e14576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000e4d62002509565b6040518263ffffffff1660e01b815260040162000e6c91815260200190565b600060405180830381600087803b15801562000e8757600080fd5b505af115801562000e9c573d6000803e3d6000fd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff8216600090815260816020526040902062000f3060008051602062005bf783398151915233620020db565b62000f8457606f5460ff161562000f5a57604051630bc011ff60e21b815260040160405180910390fd5b62000f66818362002fc5565b62000f8457604051630674f25160e11b815260040160405180910390fd5b62000f9081836200382e565b505050565b60008051602062005bb783398151915262000fb0816200307b565b6103e88261ffff16108062000fca57506103ff8261ffff16115b1562000fe957604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200105c60008051602062005bd783398151915233620020db565b620010cb57608454600160801b90046001600160401b03161580620010ac57506084544290620010a19062093a8090600160801b90046001600160401b031662004e1a565b6001600160401b0316115b15620010cb5760405163692baaad60e11b815260040160405180910390fd5b620010d562003a20565b565b600082815260346020526040902060010154620010f4816200307b565b62000f90838362003a9f565b6001600160a01b03811633146200112a57604051630b4ad1cd60e31b815260040160405180910390fd5b62001136828262003b0b565b5050565b60008051602062005bb783398151915262001155816200307b565b606f5460ff1662001197576084546001600160401b03600160c01b909104811690831610620011975760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19060200162001035565b600054600290610100900460ff1615801562001211575060005460ff8083169116105b6200127a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b179055620012fb62003b75565b6200131660008051602062005bf78339815191528a62003be2565b6200132360008662003be2565b6200134f7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908662003be2565b6200137b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8662003be2565b620013a77f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8662003be2565b620013d37fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8762003be2565b620013ff7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088762003be2565b6200142b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48762003be2565b6200144660008051602062005bb78339815191528762003be2565b6200148160008051602062005bf78339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062003bee565b620014ad7f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08762003be2565b620014d97f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8762003be2565b6200151460008051602062005bd78339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162003bee565b6200152f60008051602062005bd78339815191528562003be2565b6200155b7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518562003be2565b6000620015708484600561044d600062003c39565b6073546074549192506001600160401b03600160401b90910481169116808214620015ae57604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b0381811660008181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620016b09695831695600160581b909104909216936076936077939192919091169060040162004ef0565b600060405180830381600087803b158015620016cb57600080fd5b505af1158015620016e0573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620017289050565b60405180910390a1505050505050505050565b600060865460646200174e919062004f55565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd6200177f816200307b565b63ffffffff821615806200179e5750607e5463ffffffff908116908316115b15620017bd57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200180457604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd086200187b816200307b565b63ffffffff881615806200189a5750607e5463ffffffff908116908916115b15620018b957604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff16151590036200190057604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff16156200193e576040516337c8fe0960e11b815260040160405180910390fd5b60808054600091908290620019599063ffffffff1662004f6f565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b03909216913091620019a7906200468b565b620019b59392919062004f95565b604051809103906000f080158015620019d2573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001c46949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001c86908d908d9088908e908e908e9060040162004fcc565b600060405180830381600087803b15801562001ca157600080fd5b505af115801562001cb6573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001cf090878787878762003e5e565b979650505050505050565b606f5460ff161562001d2057604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001d6f92600160c01b90048116911662004e1a565b6001600160401b0316111562001d9857604051638a0704d360e01b815260040160405180910390fd5b6103e862001da788886200502f565b6001600160401b0316111562001dd057604051635acfba9d60e11b815260040160405180910390fd5b62001de2818989898989898962003420565b62001dee818762003f9e565b6085546001600160401b031660000362001efc57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001e6a576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001ea362002509565b6040518263ffffffff1660e01b815260040162001ec291815260200190565b600060405180830381600087803b15801562001edd57600080fd5b505af115801562001ef2573d6000803e3d6000fd5b5050505062001fc6565b62001f07816200419b565b600681018054600160801b90046001600160401b031690601062001f2b8362005052565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff16156200204a57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff8816600090815260816020526040902062002071818989898989898962003087565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620020d062003a20565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b815230600482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562002170573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002196919062005071565b608454909150600090620021bd906001600160401b03600160401b8204811691166200502f565b6001600160401b0316905080600003620021da5760009250505090565b620021e68183620050a1565b9250505090565b606f5460009060ff16156200221557604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff16908190036200224d576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200227857604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620022ab9084906001600160401b031662004e1a565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620022e1878362004e1a565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b03199092169290931691909117179055905062002371836200419b565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b60008051602062005bb7833981519152620023da816200307b565b606f5460ff1662002415576085546001600160401b0390811690831610620024155760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759060200162001035565b60008051602062005bb783398151915262002480816200307b565b62015180826001600160401b03161115620024ae57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289060200162001035565b60805460009063ffffffff168082036200252557506000919050565b6000816001600160401b03811115620025425762002542620049b4565b6040519080825280602002602001820160405280156200256c578160200160208202803683370190505b50905060005b82811015620025df57608160006200258c836001620050b8565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620025bf57620025bf620050ce565b602090810291909101015280620025d681620050e4565b91505062002572565b50600060205b836001146200283b576000620025fd60028662005100565b6200260a600287620050a1565b620026169190620050b8565b90506000816001600160401b03811115620026355762002635620049b4565b6040519080825280602002602001820160405280156200265f578160200160208202803683370190505b50905060005b82811015620027e7576200267b60018462005117565b811480156200269657506200269260028862005100565b6001145b156200271e5785620026aa82600262004f55565b81518110620026bd57620026bd620050ce565b602002602001015185604051602001620026e1929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106200270c576200270c620050ce565b602002602001018181525050620027d2565b856200272c82600262004f55565b815181106200273f576200273f620050ce565b60200260200101518682600262002757919062004f55565b62002764906001620050b8565b81518110620027775762002777620050ce565b60200260200101516040516020016200279a929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620027c557620027c5620050ce565b6020026020010181815250505b80620027de81620050e4565b91505062002665565b5080945081955083846040516020016200280b929190918252602082015260400190565b604051602081830303815290604052805190602001209350828062002830906200512d565b9350505050620025e5565b600083600081518110620028535762002853620050ce565b6020026020010151905060005b82811015620028d457604080516020810184905290810185905260600160408051601f19818403018152828252805160209182012090830187905290820186905292506060016040516020818303038152906040528051906020012093508080620028cb90620050e4565b91505062002860565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac6200290a816200307b565b63ffffffff84161580620029295750607e5463ffffffff908116908516115b156200294857604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002989576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b031603620029d857604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002a1f57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002a5d57604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002add8462000b9a565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002b339216908b908b9060040162005147565b600060405180830381600087803b15801562002b4e57600080fd5b505af115801562002b63573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002be9816200307b565b683635c9adc5dea0000082118062002c045750633b9aca0082105b1562002c2357604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001035565b60008281526034602052604090206001015462002c76816200307b565b62000f90838362003b0b565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002cae816200307b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002d0a57600080fd5b505af115801562002d1f573d6000803e3d6000fd5b5050505062002d2d62004266565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62002d5c816200307b565b6001600160401b03841660009081526083602052604090205463ffffffff161562002d9a576040516337c8fe0960e11b815260040160405180910390fd5b600062002dab888888888762003c39565b60008080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002df5816200307b565b607e805460009190829062002e109063ffffffff1662004f6f565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002fb39695949392919062005187565b60405180910390a25050505050505050565b6085546001600160401b0382811660009081526004850160205260408120549092429262002ff892918116911662004e1a565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b0316156200305e575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002d2d8133620042bf565b60078801546000906001600160401b039081169087161015620030bd5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038816156200315e5760068901546001600160401b03600160801b90910481169089161115620031075760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200315757604051632bd2e3e760e01b815260040160405180910390fd5b50620031d3565b506001600160401b03851660009081526002890160205260409020548062003199576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620031d357604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b909104811690881611806200320c5750876001600160401b0316876001600160401b031611155b8062003230575060068901546001600160401b03600160c01b909104811690881611155b156200324f5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b900481169086161462003296576040516332a2a77f60e01b815260040160405180910390fd5b6000620032a88a888888868962003e5e565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620032df9190620051e0565b602060405180830381855afa158015620032fd573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003322919062005071565b6200332e919062005100565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200337291889190600401620051fe565b602060405180830381865afa15801562003390573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620033b691906200523b565b620033d4576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620034135760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b6000806200342e8a6200300a565b60078b01549091506001600160401b039081169089161015620034645760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620035075760068a01546001600160401b03600160801b9091048116908a161115620034ae5760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200350057604051632bd2e3e760e01b815260040160405180910390fd5b5062003577565b6001600160401b038816600090815260028b01602052604090205491508162003543576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200357757604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620035aa5760405163b9b18f5760e01b815260040160405180910390fd5b6000620035bc8b8a8a8a878b62003e5e565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620035f39190620051e0565b602060405180830381855afa15801562003611573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003636919062005071565b62003642919062005100565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200368691899190600401620051fe565b602060405180830381865afa158015620036a4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620036ca91906200523b565b620036e8576040516309bde33960e01b815260040160405180910390fd5b6000620036f6848b6200502f565b90506200374f87826001600160401b03166200371162002106565b6200371d919062004f55565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620042e9565b80608460088282829054906101000a90046001600160401b031662003775919062004e1a565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b1580156200380657600080fd5b505af11580156200381b573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b90910481169082161115806200386d575060068201546001600160401b03600160801b9091048116908216115b156200388c5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200394862002509565b6040518263ffffffff1660e01b81526004016200396791815260200190565b600060405180830381600087803b1580156200398257600080fd5b505af115801562003997573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003a7c57600080fd5b505af115801562003a91573d6000803e3d6000fd5b50505050620010d56200433d565b62003aab8282620020db565b620011365760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003b178282620020db565b15620011365760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600054610100900460ff16620010d55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162001271565b62001136828262003a9f565b600082815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080546000918291829062003c559063ffffffff1662004f6f565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000866001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508060826000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150868260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550858260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550838260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003e4c94939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003e94575081155b1562003eb35760405163340c614f60e11b815260040160405180910390fd5b8062003ed2576040516366385b5160e01b815260040160405180910390fd5b62003edd846200439a565b62003efb576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b600062003fab836200300a565b90508160008062003fbd84846200502f565b6085546001600160401b03918216925060009162003fe491600160401b9004164262005117565b90505b846001600160401b0316846001600160401b0316146200406e576001600160401b0380851660009081526003890160205260409020600181015490911682101562004049576001810154600160401b90046001600160401b0316945062004067565b6200405586866200502f565b6001600160401b03169350506200406e565b5062003fe7565b60006200407c848462005117565b905083811015620040da57808403600c81116200409a57806200409d565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620040cf57620040cf6200508b565b046086555062004152565b838103600c8111620040ed5780620040f0565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a764000002816200412a576200412a6200508b565b04905080608654670de0b6b3a764000002816200414b576200414b6200508b565b0460865550505b683635c9adc5dea0000060865411156200417957683635c9adc5dea0000060865562004191565b633b9aca0060865410156200419157633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002d2d576006810154600090620041e690600160c01b90046001600160401b0316600162004e1a565b9050620041f4828262002fc5565b156200113657600682015460009060029062004222908490600160801b90046001600160401b03166200502f565b6200422e91906200525f565b6200423a908362004e1a565b905062004248838262002fc5565b156200425a5762000f9083826200382e565b62000f9083836200382e565b606f5460ff166200428a57604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b620042cb8282620020db565b6200113657604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905262000f9090849062004420565b606f5460ff16156200436257604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b038316108015620043d1575067ffffffff00000001604083901c6001600160401b0316105b8015620043f2575067ffffffff00000001608083901c6001600160401b0316105b80156200440a575067ffffffff0000000160c083901c105b156200441857506001919050565b506000919050565b600062004477826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620044f99092919063ffffffff16565b80519091501562000f9057808060200190518101906200449891906200523b565b62000f905760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162001271565b60606200450a848460008562004512565b949350505050565b606082471015620045755760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162001271565b600080866001600160a01b03168587604051620045939190620051e0565b60006040518083038185875af1925050503d8060008114620045d2576040519150601f19603f3d011682016040523d82523d6000602084013e620045d7565b606091505b509150915062001cf087838387606083156200465857825160000362004650576001600160a01b0385163b620046505760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001271565b50816200450a565b6200450a83838151156200466f5781518083602001fd5b8060405162461bcd60e51b815260040162001271919062004be5565b61092e806200528983390190565b803563ffffffff811681146200307657600080fd5b80356001600160401b03811681146200307657600080fd5b60008060408385031215620046da57600080fd5b620046e58362004699565b9150620046f560208401620046ae565b90509250929050565b6000602082840312156200471157600080fd5b62000b918262004699565b80610300810183101562000b9457600080fd5b6000806000806000806000806103e0898b0312156200474d57600080fd5b620047588962004699565b97506200476860208a01620046ae565b96506200477860408a01620046ae565b95506200478860608a01620046ae565b94506200479860808a01620046ae565b935060a0890135925060c08901359150620047b78a60e08b016200471c565b90509295985092959890939650565b6001600160a01b038116811462002d2d57600080fd5b6000806000806000806000806103e0898b031215620047fa57600080fd5b620048058962004699565b97506200481560208a01620046ae565b96506200482560408a01620046ae565b95506200483560608a01620046ae565b94506080890135935060a0890135925060c08901356200485581620047c6565b9150620047b78a60e08b016200471c565b6000602082840312156200487957600080fd5b813561ffff811681146200488c57600080fd5b9392505050565b600060208284031215620048a657600080fd5b5035919050565b60008060408385031215620048c157600080fd5b823591506020830135620048d581620047c6565b809150509250929050565b600060208284031215620048f357600080fd5b62000b9182620046ae565b600080600080600080600080610100898b0312156200491c57600080fd5b88356200492981620047c6565b97506200493960208a01620046ae565b96506200494960408a01620046ae565b955060608901356200495b81620047c6565b945060808901356200496d81620047c6565b935060a08901356200497f81620047c6565b925060c08901356200499181620047c6565b915060e0890135620049a381620047c6565b809150509295985092959890939650565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620049dc57600080fd5b81356001600160401b0380821115620049f957620049f9620049b4565b604051601f8301601f19908116603f0116810190828211818310171562004a245762004a24620049b4565b8160405283815286602085880101111562004a3e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121562004a7a57600080fd5b62004a858862004699565b965062004a9560208901620046ae565b9550604088013562004aa781620047c6565b9450606088013562004ab981620047c6565b9350608088013562004acb81620047c6565b925060a08801356001600160401b038082111562004ae857600080fd5b62004af68b838c01620049ca565b935060c08a013591508082111562004b0d57600080fd5b5062004b1c8a828b01620049ca565b91505092959891949750929550565b60008060008060008060c0878903121562004b4557600080fd5b62004b508762004699565b955062004b6060208801620046ae565b945062004b7060408801620046ae565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004bae57818101518382015260200162004b94565b50506000910152565b6000815180845262004bd181602086016020860162004b91565b601f01601f19169290920160200192915050565b60208152600062000b91602083018462004bb7565b6000806040838503121562004c0e57600080fd5b62004c1983620046ae565b946020939093013593505050565b6000806000806060858703121562004c3e57600080fd5b843562004c4b81620047c6565b935062004c5b6020860162004699565b925060408501356001600160401b038082111562004c7857600080fd5b818701915087601f83011262004c8d57600080fd5b81358181111562004c9d57600080fd5b88602082850101111562004cb057600080fd5b95989497505060200194505050565b60006020828403121562004cd257600080fd5b81356200488c81620047c6565b803560ff811681146200307657600080fd5b60008060008060008060c0878903121562004d0b57600080fd5b863562004d1881620047c6565b9550602087013562004d2a81620047c6565b945062004d3a60408801620046ae565b935062004d4a60608801620046ae565b92506080870135915062004d6160a0880162004cdf565b90509295509295509295565b60008060008060008060c0878903121562004d8757600080fd5b863562004d9481620047c6565b9550602087013562004da681620047c6565b945062004db660408801620046ae565b935062004dc66060880162004cdf565b92506080870135915060a08701356001600160401b0381111562004de957600080fd5b62004df789828a01620049ca565b9150509295509295509295565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004e3d5762004e3d62004e04565b5092915050565b8054600090600181811c908083168062004e5f57607f831692505b6020808410820362004e8157634e487b7160e01b600052602260045260246000fd5b8388526020880182801562004e9f576001811462004eb65762004ee3565b60ff198716825285151560051b8201975062004ee3565b60008981526020902060005b8781101562004edd5781548482015290860190840162004ec2565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c06040820181905260009062004f1e9083018762004e44565b828103606084015262004f32818762004e44565b9150508360808301526001600160401b03831660a0830152979650505050505050565b808202811582820484141762000b945762000b9462004e04565b600063ffffffff80831681810362004f8b5762004f8b62004e04565b6001019392505050565b6001600160a01b0384811682528316602082015260606040820181905260009062004fc39083018462004bb7565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190526000906200500e9083018562004bb7565b82810360a084015262005022818562004bb7565b9998505050505050505050565b6001600160401b0382811682821603908082111562004e3d5762004e3d62004e04565b60006001600160401b0380831681810362004f8b5762004f8b62004e04565b6000602082840312156200508457600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082620050b357620050b36200508b565b500490565b8082018082111562000b945762000b9462004e04565b634e487b7160e01b600052603260045260246000fd5b600060018201620050f957620050f962004e04565b5060010190565b6000826200511257620051126200508b565b500690565b8181038181111562000b945762000b9462004e04565b6000816200513f576200513f62004e04565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a08201819052600090620051d49083018462004bb7565b98975050505050505050565b60008251620051f481846020870162004b91565b9190910192915050565b61032081016103008085843782018360005b60018110156200523157815183526020928301929091019060010162005210565b5050509392505050565b6000602082840312156200524e57600080fd5b815180151581146200488c57600080fd5b60006001600160401b03808416806200527c576200527c6200508b565b9216919091049291505056fe60a06040526040516200092e3803806200092e833981016040819052620000269162000383565b828162000034828262000060565b50506001600160a01b038216608052620000576200005160805190565b620000c6565b50505062000481565b6200006b8262000138565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115620000b857620000b38282620001b8565b505050565b620000c262000235565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620001086000805160206200090e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001358162000257565b50565b806001600160a01b03163b6000036200017457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b031684604051620001d7919062000463565b600060405180830381855af49150503d806000811462000214576040519150601f19603f3d011682016040523d82523d6000602084013e62000219565b606091505b5090925090506200022c8583836200029a565b95945050505050565b3415620002555760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166200028357604051633173bdd160e11b8152600060048201526024016200016b565b806000805160206200090e83398151915262000197565b606082620002b357620002ad8262000300565b620002f9565b8151158015620002cb57506001600160a01b0384163b155b15620002f657604051639996b31560e01b81526001600160a01b03851660048201526024016200016b565b50805b9392505050565b805115620003115780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b03811681146200034257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200037a57818101518382015260200162000360565b50506000910152565b6000806000606084860312156200039957600080fd5b620003a4846200032a565b9250620003b4602085016200032a565b60408501519092506001600160401b0380821115620003d257600080fd5b818601915086601f830112620003e757600080fd5b815181811115620003fc57620003fc62000347565b604051601f8201601f19908116603f0116810190838211818310171562000427576200042762000347565b816040528281528960208487010111156200044157600080fd5b620004548360208301602088016200035d565b80955050505050509250925092565b60008251620004778184602087016200035d565b9190910192915050565b6080516104726200049c6000396000601001526104726000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100e5565b60008061008e36600481846102fd565b81019061009b919061033d565b915091506100a98282610109565b5050565b60006100e07f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610104573d6000f35b3d6000fd5b61011282610164565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561015c5761015782826101e0565b505050565b6100a9610256565b806001600160a01b03163b60000361019f57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101fd919061040d565b600060405180830381855af49150503d8060008114610238576040519150601f19603f3d011682016040523d82523d6000602084013e61023d565b606091505b509150915061024d858383610275565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b60608261028a57610285826102d4565b6102cd565b81511580156102a157506001600160a01b0384163b155b156102ca57604051639996b31560e01b81526001600160a01b0385166004820152602401610196565b50805b9392505050565b8051156102e45780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6000808585111561030d57600080fd5b8386111561031a57600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035057600080fd5b82356001600160a01b038116811461036757600080fd5b9150602083013567ffffffffffffffff8082111561038457600080fd5b818501915085601f83011261039857600080fd5b8135818111156103aa576103aa610327565b604051601f8201601f19908116603f011681019083821181831017156103d2576103d2610327565b816040528281528860208487010111156103eb57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000825160005b8181101561042e5760208186018101518583015201610414565b50600092019182525091905056fea2646970667358221220d51c6fc430c553d1da2391464fd71dbfa43dc91a9531c4d842a3289bb581301664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220cfc55e650a90a9c7f2d1285a3990a984338b9c03e45202d25f457662a867b58c64736f6c63430008140033", - "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620003095760003560e01c806387c20c01116200019d578063c4c928c211620000eb578063dbc16976116200009e578063dbc1697614620009cd578063dde0ff7714620009d7578063e0bfd3d214620009f2578063e46761c41462000a09578063f34eb8eb1462000a31578063f4e926751462000a48578063f9c4c2ae1462000a5957600080fd5b8063c4c928c21462000923578063ceee281d146200093a578063d02103ca1462000963578063d5073f6f146200098b578063d547741f14620009a2578063d939b31514620009b957600080fd5b8063a066215c1162000150578063a066215c1462000797578063a217fddf14620007ae578063a2967d9914620007b7578063a3c573eb14620007c1578063afd23cbe1462000802578063b99d0ad7146200082c578063c1acbc34146200090857600080fd5b806387c20c01146200071a5780638bd4f071146200073157806391d14854146200074857806399f5634e146200075f5780639a908e7314620007695780639c9f3dfe146200078057600080fd5b80632f2ff15d116200025b57806360469169116200020e5780636046916914620005c957806365c0504d14620005d35780637222020f1462000682578063727885e914620006995780637975fcfe14620006b05780637fb6e76a14620006d6578063841b24d714620006ff57600080fd5b80632f2ff15d146200052057806336568abe1462000537578063394218e9146200054e578063477fa27014620005655780634d4d3338146200056e57806355a71ee0146200058557600080fd5b806315064c9611620002c057806315064c9614620003c95780631608859c14620003d75780631796a1ae14620003ee5780631816b7e514620004155780632072f6c5146200042c578063248a9ca3146200043657806325280169146200046b57600080fd5b8063066ec012146200030e578063080b3111146200033f5780630a0d9fbe146200036757806311f6b287146200038257806312b86e1914620003995780631489ed1014620003b2575b600080fd5b60845462000322906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b6200035662000350366004620046c6565b62000b70565b604051901515815260200162000336565b6085546200032290600160401b90046001600160401b031681565b6200032262000393366004620046fe565b62000b9a565b620003b0620003aa3660046200472f565b62000bba565b005b620003b0620003c3366004620047dc565b62000d6a565b606f54620003569060ff1681565b620003b0620003e8366004620046c6565b62000f00565b607e54620003ff9063ffffffff1681565b60405163ffffffff909116815260200162000336565b620003b06200042636600462004866565b62000f95565b620003b062001041565b6200045c6200044736600462004893565b60009081526034602052604090206001015490565b60405190815260200162000336565b620004ec6200047c366004620046c6565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b0390811691830191909152928201519092169082015260600162000336565b620003b062000531366004620048ad565b620010d7565b620003b062000548366004620048ad565b62001100565b620003b06200055f366004620048e0565b6200113a565b6086546200045c565b620003b06200057f366004620048fe565b620011ee565b6200045c62000596366004620046c6565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b6200045c6200173b565b62000638620005e4366004620046fe565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c00162000336565b620003b062000693366004620046fe565b62001753565b620003b0620006aa36600462004a5e565b6200184f565b620006c7620006c136600462004b2b565b62001cc8565b60405162000336919062004be5565b620003ff620006e7366004620048e0565b60836020526000908152604090205463ffffffff1681565b6084546200032290600160c01b90046001600160401b031681565b620003b06200072b366004620047dc565b62001cfb565b620003b0620007423660046200472f565b62002025565b6200035662000759366004620048ad565b620020db565b6200045c62002106565b620003226200077a36600462004bfa565b620021ed565b620003b062000791366004620048e0565b620023bf565b620003b0620007a8366004620048e0565b62002465565b6200045c600081565b6200045c62002509565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200162000336565b6085546200081890600160801b900461ffff1681565b60405161ffff909116815260200162000336565b620008c26200083d366004620046c6565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b60405162000336919060006080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200032290600160801b90046001600160401b031681565b620003b06200093436600462004c27565b620028de565b620003ff6200094b36600462004cbf565b60826020526000908152604090205463ffffffff1681565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b620003b06200099c36600462004893565b62002bbd565b620003b0620009b3366004620048ad565b62002c59565b60855462000322906001600160401b031681565b620003b062002c82565b6084546200032290600160401b90046001600160401b031681565b620003b062000a0336600462004cf1565b62002d30565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b620003b062000a4236600462004d6d565b62002dc9565b608054620003ff9063ffffffff1681565b62000af062000a6a366004620046fe565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff166101608201526101800162000336565b63ffffffff8216600090815260816020526040812062000b91908362002fc5565b90505b92915050565b63ffffffff8116600090815260816020526040812062000b94906200300a565b60008051602062005bf783398151915262000bd5816200307b565b63ffffffff8916600090815260816020526040902062000bfc818a8a8a8a8a8a8a62003087565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000c64576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000c9d62002509565b6040518263ffffffff1660e01b815260040162000cbc91815260200190565b600060405180830381600087803b15801562000cd757600080fd5b505af115801562000cec573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005bf783398151915262000d85816200307b565b63ffffffff8916600090815260816020526040902062000dac818a8a8a8a8a8a8a62003420565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562000e14576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000e4d62002509565b6040518263ffffffff1660e01b815260040162000e6c91815260200190565b600060405180830381600087803b15801562000e8757600080fd5b505af115801562000e9c573d6000803e3d6000fd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff8216600090815260816020526040902062000f3060008051602062005bf783398151915233620020db565b62000f8457606f5460ff161562000f5a57604051630bc011ff60e21b815260040160405180910390fd5b62000f66818362002fc5565b62000f8457604051630674f25160e11b815260040160405180910390fd5b62000f9081836200382e565b505050565b60008051602062005bb783398151915262000fb0816200307b565b6103e88261ffff16108062000fca57506103ff8261ffff16115b1562000fe957604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200105c60008051602062005bd783398151915233620020db565b620010cb57608454600160801b90046001600160401b03161580620010ac57506084544290620010a19062093a8090600160801b90046001600160401b031662004e1a565b6001600160401b0316115b15620010cb5760405163692baaad60e11b815260040160405180910390fd5b620010d562003a20565b565b600082815260346020526040902060010154620010f4816200307b565b62000f90838362003a9f565b6001600160a01b03811633146200112a57604051630b4ad1cd60e31b815260040160405180910390fd5b62001136828262003b0b565b5050565b60008051602062005bb783398151915262001155816200307b565b606f5460ff1662001197576084546001600160401b03600160c01b909104811690831610620011975760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19060200162001035565b600054600290610100900460ff1615801562001211575060005460ff8083169116105b6200127a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b179055620012fb62003b75565b6200131660008051602062005bf78339815191528a62003be2565b6200132360008662003be2565b6200134f7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908662003be2565b6200137b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8662003be2565b620013a77f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8662003be2565b620013d37fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8762003be2565b620013ff7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088762003be2565b6200142b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48762003be2565b6200144660008051602062005bb78339815191528762003be2565b6200148160008051602062005bf78339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062003bee565b620014ad7f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08762003be2565b620014d97f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8762003be2565b6200151460008051602062005bd78339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162003bee565b6200152f60008051602062005bd78339815191528562003be2565b6200155b7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518562003be2565b6000620015708484600561044d600062003c39565b6073546074549192506001600160401b03600160401b90910481169116808214620015ae57604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b0381811660008181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620016b09695831695600160581b909104909216936076936077939192919091169060040162004ef0565b600060405180830381600087803b158015620016cb57600080fd5b505af1158015620016e0573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620017289050565b60405180910390a1505050505050505050565b600060865460646200174e919062004f55565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd6200177f816200307b565b63ffffffff821615806200179e5750607e5463ffffffff908116908316115b15620017bd57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200180457604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd086200187b816200307b565b63ffffffff881615806200189a5750607e5463ffffffff908116908916115b15620018b957604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff16151590036200190057604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff16156200193e576040516337c8fe0960e11b815260040160405180910390fd5b60808054600091908290620019599063ffffffff1662004f6f565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b03909216913091620019a7906200468b565b620019b59392919062004f95565b604051809103906000f080158015620019d2573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001c46949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001c86908d908d9088908e908e908e9060040162004fcc565b600060405180830381600087803b15801562001ca157600080fd5b505af115801562001cb6573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001cf090878787878762003e5e565b979650505050505050565b606f5460ff161562001d2057604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001d6f92600160c01b90048116911662004e1a565b6001600160401b0316111562001d9857604051638a0704d360e01b815260040160405180910390fd5b6103e862001da788886200502f565b6001600160401b0316111562001dd057604051635acfba9d60e11b815260040160405180910390fd5b62001de2818989898989898962003420565b62001dee818762003f9e565b6085546001600160401b031660000362001efc57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001e6a576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001ea362002509565b6040518263ffffffff1660e01b815260040162001ec291815260200190565b600060405180830381600087803b15801562001edd57600080fd5b505af115801562001ef2573d6000803e3d6000fd5b5050505062001fc6565b62001f07816200419b565b600681018054600160801b90046001600160401b031690601062001f2b8362005052565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff16156200204a57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff8816600090815260816020526040902062002071818989898989898962003087565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620020d062003a20565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b815230600482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562002170573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002196919062005071565b608454909150600090620021bd906001600160401b03600160401b8204811691166200502f565b6001600160401b0316905080600003620021da5760009250505090565b620021e68183620050a1565b9250505090565b606f5460009060ff16156200221557604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff16908190036200224d576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200227857604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620022ab9084906001600160401b031662004e1a565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620022e1878362004e1a565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b03199092169290931691909117179055905062002371836200419b565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b60008051602062005bb7833981519152620023da816200307b565b606f5460ff1662002415576085546001600160401b0390811690831610620024155760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759060200162001035565b60008051602062005bb783398151915262002480816200307b565b62015180826001600160401b03161115620024ae57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289060200162001035565b60805460009063ffffffff168082036200252557506000919050565b6000816001600160401b03811115620025425762002542620049b4565b6040519080825280602002602001820160405280156200256c578160200160208202803683370190505b50905060005b82811015620025df57608160006200258c836001620050b8565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620025bf57620025bf620050ce565b602090810291909101015280620025d681620050e4565b91505062002572565b50600060205b836001146200283b576000620025fd60028662005100565b6200260a600287620050a1565b620026169190620050b8565b90506000816001600160401b03811115620026355762002635620049b4565b6040519080825280602002602001820160405280156200265f578160200160208202803683370190505b50905060005b82811015620027e7576200267b60018462005117565b811480156200269657506200269260028862005100565b6001145b156200271e5785620026aa82600262004f55565b81518110620026bd57620026bd620050ce565b602002602001015185604051602001620026e1929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106200270c576200270c620050ce565b602002602001018181525050620027d2565b856200272c82600262004f55565b815181106200273f576200273f620050ce565b60200260200101518682600262002757919062004f55565b62002764906001620050b8565b81518110620027775762002777620050ce565b60200260200101516040516020016200279a929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620027c557620027c5620050ce565b6020026020010181815250505b80620027de81620050e4565b91505062002665565b5080945081955083846040516020016200280b929190918252602082015260400190565b604051602081830303815290604052805190602001209350828062002830906200512d565b9350505050620025e5565b600083600081518110620028535762002853620050ce565b6020026020010151905060005b82811015620028d457604080516020810184905290810185905260600160408051601f19818403018152828252805160209182012090830187905290820186905292506060016040516020818303038152906040528051906020012093508080620028cb90620050e4565b91505062002860565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac6200290a816200307b565b63ffffffff84161580620029295750607e5463ffffffff908116908516115b156200294857604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002989576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b031603620029d857604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002a1f57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002a5d57604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002add8462000b9a565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002b339216908b908b9060040162005147565b600060405180830381600087803b15801562002b4e57600080fd5b505af115801562002b63573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002be9816200307b565b683635c9adc5dea0000082118062002c045750633b9aca0082105b1562002c2357604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001035565b60008281526034602052604090206001015462002c76816200307b565b62000f90838362003b0b565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002cae816200307b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002d0a57600080fd5b505af115801562002d1f573d6000803e3d6000fd5b5050505062002d2d62004266565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62002d5c816200307b565b6001600160401b03841660009081526083602052604090205463ffffffff161562002d9a576040516337c8fe0960e11b815260040160405180910390fd5b600062002dab888888888762003c39565b60008080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002df5816200307b565b607e805460009190829062002e109063ffffffff1662004f6f565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002fb39695949392919062005187565b60405180910390a25050505050505050565b6085546001600160401b0382811660009081526004850160205260408120549092429262002ff892918116911662004e1a565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b0316156200305e575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002d2d8133620042bf565b60078801546000906001600160401b039081169087161015620030bd5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038816156200315e5760068901546001600160401b03600160801b90910481169089161115620031075760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200315757604051632bd2e3e760e01b815260040160405180910390fd5b50620031d3565b506001600160401b03851660009081526002890160205260409020548062003199576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620031d357604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b909104811690881611806200320c5750876001600160401b0316876001600160401b031611155b8062003230575060068901546001600160401b03600160c01b909104811690881611155b156200324f5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b900481169086161462003296576040516332a2a77f60e01b815260040160405180910390fd5b6000620032a88a888888868962003e5e565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620032df9190620051e0565b602060405180830381855afa158015620032fd573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003322919062005071565b6200332e919062005100565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200337291889190600401620051fe565b602060405180830381865afa15801562003390573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620033b691906200523b565b620033d4576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620034135760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b6000806200342e8a6200300a565b60078b01549091506001600160401b039081169089161015620034645760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620035075760068a01546001600160401b03600160801b9091048116908a161115620034ae5760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200350057604051632bd2e3e760e01b815260040160405180910390fd5b5062003577565b6001600160401b038816600090815260028b01602052604090205491508162003543576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200357757604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620035aa5760405163b9b18f5760e01b815260040160405180910390fd5b6000620035bc8b8a8a8a878b62003e5e565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620035f39190620051e0565b602060405180830381855afa15801562003611573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003636919062005071565b62003642919062005100565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200368691899190600401620051fe565b602060405180830381865afa158015620036a4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620036ca91906200523b565b620036e8576040516309bde33960e01b815260040160405180910390fd5b6000620036f6848b6200502f565b90506200374f87826001600160401b03166200371162002106565b6200371d919062004f55565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620042e9565b80608460088282829054906101000a90046001600160401b031662003775919062004e1a565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b1580156200380657600080fd5b505af11580156200381b573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b90910481169082161115806200386d575060068201546001600160401b03600160801b9091048116908216115b156200388c5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200394862002509565b6040518263ffffffff1660e01b81526004016200396791815260200190565b600060405180830381600087803b1580156200398257600080fd5b505af115801562003997573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003a7c57600080fd5b505af115801562003a91573d6000803e3d6000fd5b50505050620010d56200433d565b62003aab8282620020db565b620011365760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003b178282620020db565b15620011365760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600054610100900460ff16620010d55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162001271565b62001136828262003a9f565b600082815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080546000918291829062003c559063ffffffff1662004f6f565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000866001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508060826000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150868260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550858260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550838260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003e4c94939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003e94575081155b1562003eb35760405163340c614f60e11b815260040160405180910390fd5b8062003ed2576040516366385b5160e01b815260040160405180910390fd5b62003edd846200439a565b62003efb576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b600062003fab836200300a565b90508160008062003fbd84846200502f565b6085546001600160401b03918216925060009162003fe491600160401b9004164262005117565b90505b846001600160401b0316846001600160401b0316146200406e576001600160401b0380851660009081526003890160205260409020600181015490911682101562004049576001810154600160401b90046001600160401b0316945062004067565b6200405586866200502f565b6001600160401b03169350506200406e565b5062003fe7565b60006200407c848462005117565b905083811015620040da57808403600c81116200409a57806200409d565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620040cf57620040cf6200508b565b046086555062004152565b838103600c8111620040ed5780620040f0565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a764000002816200412a576200412a6200508b565b04905080608654670de0b6b3a764000002816200414b576200414b6200508b565b0460865550505b683635c9adc5dea0000060865411156200417957683635c9adc5dea0000060865562004191565b633b9aca0060865410156200419157633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002d2d576006810154600090620041e690600160c01b90046001600160401b0316600162004e1a565b9050620041f4828262002fc5565b156200113657600682015460009060029062004222908490600160801b90046001600160401b03166200502f565b6200422e91906200525f565b6200423a908362004e1a565b905062004248838262002fc5565b156200425a5762000f9083826200382e565b62000f9083836200382e565b606f5460ff166200428a57604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b620042cb8282620020db565b6200113657604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905262000f9090849062004420565b606f5460ff16156200436257604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b038316108015620043d1575067ffffffff00000001604083901c6001600160401b0316105b8015620043f2575067ffffffff00000001608083901c6001600160401b0316105b80156200440a575067ffffffff0000000160c083901c105b156200441857506001919050565b506000919050565b600062004477826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620044f99092919063ffffffff16565b80519091501562000f9057808060200190518101906200449891906200523b565b62000f905760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162001271565b60606200450a848460008562004512565b949350505050565b606082471015620045755760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162001271565b600080866001600160a01b03168587604051620045939190620051e0565b60006040518083038185875af1925050503d8060008114620045d2576040519150601f19603f3d011682016040523d82523d6000602084013e620045d7565b606091505b509150915062001cf087838387606083156200465857825160000362004650576001600160a01b0385163b620046505760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001271565b50816200450a565b6200450a83838151156200466f5781518083602001fd5b8060405162461bcd60e51b815260040162001271919062004be5565b61092e806200528983390190565b803563ffffffff811681146200307657600080fd5b80356001600160401b03811681146200307657600080fd5b60008060408385031215620046da57600080fd5b620046e58362004699565b9150620046f560208401620046ae565b90509250929050565b6000602082840312156200471157600080fd5b62000b918262004699565b80610300810183101562000b9457600080fd5b6000806000806000806000806103e0898b0312156200474d57600080fd5b620047588962004699565b97506200476860208a01620046ae565b96506200477860408a01620046ae565b95506200478860608a01620046ae565b94506200479860808a01620046ae565b935060a0890135925060c08901359150620047b78a60e08b016200471c565b90509295985092959890939650565b6001600160a01b038116811462002d2d57600080fd5b6000806000806000806000806103e0898b031215620047fa57600080fd5b620048058962004699565b97506200481560208a01620046ae565b96506200482560408a01620046ae565b95506200483560608a01620046ae565b94506080890135935060a0890135925060c08901356200485581620047c6565b9150620047b78a60e08b016200471c565b6000602082840312156200487957600080fd5b813561ffff811681146200488c57600080fd5b9392505050565b600060208284031215620048a657600080fd5b5035919050565b60008060408385031215620048c157600080fd5b823591506020830135620048d581620047c6565b809150509250929050565b600060208284031215620048f357600080fd5b62000b9182620046ae565b600080600080600080600080610100898b0312156200491c57600080fd5b88356200492981620047c6565b97506200493960208a01620046ae565b96506200494960408a01620046ae565b955060608901356200495b81620047c6565b945060808901356200496d81620047c6565b935060a08901356200497f81620047c6565b925060c08901356200499181620047c6565b915060e0890135620049a381620047c6565b809150509295985092959890939650565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620049dc57600080fd5b81356001600160401b0380821115620049f957620049f9620049b4565b604051601f8301601f19908116603f0116810190828211818310171562004a245762004a24620049b4565b8160405283815286602085880101111562004a3e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121562004a7a57600080fd5b62004a858862004699565b965062004a9560208901620046ae565b9550604088013562004aa781620047c6565b9450606088013562004ab981620047c6565b9350608088013562004acb81620047c6565b925060a08801356001600160401b038082111562004ae857600080fd5b62004af68b838c01620049ca565b935060c08a013591508082111562004b0d57600080fd5b5062004b1c8a828b01620049ca565b91505092959891949750929550565b60008060008060008060c0878903121562004b4557600080fd5b62004b508762004699565b955062004b6060208801620046ae565b945062004b7060408801620046ae565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004bae57818101518382015260200162004b94565b50506000910152565b6000815180845262004bd181602086016020860162004b91565b601f01601f19169290920160200192915050565b60208152600062000b91602083018462004bb7565b6000806040838503121562004c0e57600080fd5b62004c1983620046ae565b946020939093013593505050565b6000806000806060858703121562004c3e57600080fd5b843562004c4b81620047c6565b935062004c5b6020860162004699565b925060408501356001600160401b038082111562004c7857600080fd5b818701915087601f83011262004c8d57600080fd5b81358181111562004c9d57600080fd5b88602082850101111562004cb057600080fd5b95989497505060200194505050565b60006020828403121562004cd257600080fd5b81356200488c81620047c6565b803560ff811681146200307657600080fd5b60008060008060008060c0878903121562004d0b57600080fd5b863562004d1881620047c6565b9550602087013562004d2a81620047c6565b945062004d3a60408801620046ae565b935062004d4a60608801620046ae565b92506080870135915062004d6160a0880162004cdf565b90509295509295509295565b60008060008060008060c0878903121562004d8757600080fd5b863562004d9481620047c6565b9550602087013562004da681620047c6565b945062004db660408801620046ae565b935062004dc66060880162004cdf565b92506080870135915060a08701356001600160401b0381111562004de957600080fd5b62004df789828a01620049ca565b9150509295509295509295565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004e3d5762004e3d62004e04565b5092915050565b8054600090600181811c908083168062004e5f57607f831692505b6020808410820362004e8157634e487b7160e01b600052602260045260246000fd5b8388526020880182801562004e9f576001811462004eb65762004ee3565b60ff198716825285151560051b8201975062004ee3565b60008981526020902060005b8781101562004edd5781548482015290860190840162004ec2565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c06040820181905260009062004f1e9083018762004e44565b828103606084015262004f32818762004e44565b9150508360808301526001600160401b03831660a0830152979650505050505050565b808202811582820484141762000b945762000b9462004e04565b600063ffffffff80831681810362004f8b5762004f8b62004e04565b6001019392505050565b6001600160a01b0384811682528316602082015260606040820181905260009062004fc39083018462004bb7565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190526000906200500e9083018562004bb7565b82810360a084015262005022818562004bb7565b9998505050505050505050565b6001600160401b0382811682821603908082111562004e3d5762004e3d62004e04565b60006001600160401b0380831681810362004f8b5762004f8b62004e04565b6000602082840312156200508457600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082620050b357620050b36200508b565b500490565b8082018082111562000b945762000b9462004e04565b634e487b7160e01b600052603260045260246000fd5b600060018201620050f957620050f962004e04565b5060010190565b6000826200511257620051126200508b565b500690565b8181038181111562000b945762000b9462004e04565b6000816200513f576200513f62004e04565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a08201819052600090620051d49083018462004bb7565b98975050505050505050565b60008251620051f481846020870162004b91565b9190910192915050565b61032081016103008085843782018360005b60018110156200523157815183526020928301929091019060010162005210565b5050509392505050565b6000602082840312156200524e57600080fd5b815180151581146200488c57600080fd5b60006001600160401b03808416806200527c576200527c6200508b565b9216919091049291505056fe60a06040526040516200092e3803806200092e833981016040819052620000269162000383565b828162000034828262000060565b50506001600160a01b038216608052620000576200005160805190565b620000c6565b50505062000481565b6200006b8262000138565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115620000b857620000b38282620001b8565b505050565b620000c262000235565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620001086000805160206200090e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001358162000257565b50565b806001600160a01b03163b6000036200017457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b031684604051620001d7919062000463565b600060405180830381855af49150503d806000811462000214576040519150601f19603f3d011682016040523d82523d6000602084013e62000219565b606091505b5090925090506200022c8583836200029a565b95945050505050565b3415620002555760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166200028357604051633173bdd160e11b8152600060048201526024016200016b565b806000805160206200090e83398151915262000197565b606082620002b357620002ad8262000300565b620002f9565b8151158015620002cb57506001600160a01b0384163b155b15620002f657604051639996b31560e01b81526001600160a01b03851660048201526024016200016b565b50805b9392505050565b805115620003115780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b03811681146200034257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200037a57818101518382015260200162000360565b50506000910152565b6000806000606084860312156200039957600080fd5b620003a4846200032a565b9250620003b4602085016200032a565b60408501519092506001600160401b0380821115620003d257600080fd5b818601915086601f830112620003e757600080fd5b815181811115620003fc57620003fc62000347565b604051601f8201601f19908116603f0116810190838211818310171562000427576200042762000347565b816040528281528960208487010111156200044157600080fd5b620004548360208301602088016200035d565b80955050505050509250925092565b60008251620004778184602087016200035d565b9190910192915050565b6080516104726200049c6000396000601001526104726000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100e5565b60008061008e36600481846102fd565b81019061009b919061033d565b915091506100a98282610109565b5050565b60006100e07f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610104573d6000f35b3d6000fd5b61011282610164565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561015c5761015782826101e0565b505050565b6100a9610256565b806001600160a01b03163b60000361019f57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101fd919061040d565b600060405180830381855af49150503d8060008114610238576040519150601f19603f3d011682016040523d82523d6000602084013e61023d565b606091505b509150915061024d858383610275565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b60608261028a57610285826102d4565b6102cd565b81511580156102a157506001600160a01b0384163b155b156102ca57604051639996b31560e01b81526001600160a01b0385166004820152602401610196565b50805b9392505050565b8051156102e45780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6000808585111561030d57600080fd5b8386111561031a57600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035057600080fd5b82356001600160a01b038116811461036757600080fd5b9150602083013567ffffffffffffffff8082111561038457600080fd5b818501915085601f83011261039857600080fd5b8135818111156103aa576103aa610327565b604051601f8201601f19908116603f011681019083821181831017156103d2576103d2610327565b816040528281528860208487010111156103eb57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000825160005b8181101561042e5760208186018101518583015201610414565b50600092019182525091905056fea2646970667358221220d51c6fc430c553d1da2391464fd71dbfa43dc91a9531c4d842a3289bb581301664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220cfc55e650a90a9c7f2d1285a3990a984338b9c03e45202d25f457662a867b58c64736f6c63430008140033", + "bytecode": "0x60e06040523480156200001157600080fd5b5060405162005d7338038062005d7383398101604081905262000034916200006b565b6001600160a01b0392831660805290821660c0521660a052620000bf565b6001600160a01b03811681146200006857600080fd5b50565b6000806000606084860312156200008157600080fd5b83516200008e8162000052565b6020850151909350620000a18162000052565b6040850151909250620000b48162000052565b809150509250925092565b60805160a05160c051615c4c6200012760003960008181610a0f0152818161212801526137270152600081816107c701528181612cb00152613a2201526000818161096901528181610c6601528181610e1601528181611e6c01526139110152615c4c6000f3fe60806040523480156200001157600080fd5b5060043610620003095760003560e01c806387c20c01116200019d578063c4c928c211620000eb578063dbc16976116200009e578063dbc1697614620009cd578063dde0ff7714620009d7578063e0bfd3d214620009f2578063e46761c41462000a09578063f34eb8eb1462000a31578063f4e926751462000a48578063f9c4c2ae1462000a5957600080fd5b8063c4c928c21462000923578063ceee281d146200093a578063d02103ca1462000963578063d5073f6f146200098b578063d547741f14620009a2578063d939b31514620009b957600080fd5b8063a066215c1162000150578063a066215c1462000797578063a217fddf14620007ae578063a2967d9914620007b7578063a3c573eb14620007c1578063afd23cbe1462000802578063b99d0ad7146200082c578063c1acbc34146200090857600080fd5b806387c20c01146200071a5780638bd4f071146200073157806391d14854146200074857806399f5634e146200075f5780639a908e7314620007695780639c9f3dfe146200078057600080fd5b80632f2ff15d116200025b57806360469169116200020e5780636046916914620005c957806365c0504d14620005d35780637222020f1462000682578063727885e914620006995780637975fcfe14620006b05780637fb6e76a14620006d6578063841b24d714620006ff57600080fd5b80632f2ff15d146200052057806336568abe1462000537578063394218e9146200054e578063477fa27014620005655780634d4d3338146200056e57806355a71ee0146200058557600080fd5b806315064c9611620002c057806315064c9614620003c95780631608859c14620003d75780631796a1ae14620003ee5780631816b7e514620004155780632072f6c5146200042c578063248a9ca3146200043657806325280169146200046b57600080fd5b8063066ec012146200030e578063080b3111146200033f5780630a0d9fbe146200036757806311f6b287146200038257806312b86e1914620003995780631489ed1014620003b2575b600080fd5b60845462000322906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b6200035662000350366004620046c6565b62000b70565b604051901515815260200162000336565b6085546200032290600160401b90046001600160401b031681565b6200032262000393366004620046fe565b62000b9a565b620003b0620003aa3660046200472f565b62000bba565b005b620003b0620003c3366004620047dc565b62000d6a565b606f54620003569060ff1681565b620003b0620003e8366004620046c6565b62000f00565b607e54620003ff9063ffffffff1681565b60405163ffffffff909116815260200162000336565b620003b06200042636600462004866565b62000f95565b620003b062001041565b6200045c6200044736600462004893565b60009081526034602052604090206001015490565b60405190815260200162000336565b620004ec6200047c366004620046c6565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b0390811691830191909152928201519092169082015260600162000336565b620003b062000531366004620048ad565b620010d7565b620003b062000548366004620048ad565b62001100565b620003b06200055f366004620048e0565b6200113a565b6086546200045c565b620003b06200057f366004620048fe565b620011ee565b6200045c62000596366004620046c6565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b6200045c6200173b565b62000638620005e4366004620046fe565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c00162000336565b620003b062000693366004620046fe565b62001753565b620003b0620006aa36600462004a5e565b6200184f565b620006c7620006c136600462004b2b565b62001cc8565b60405162000336919062004be5565b620003ff620006e7366004620048e0565b60836020526000908152604090205463ffffffff1681565b6084546200032290600160c01b90046001600160401b031681565b620003b06200072b366004620047dc565b62001cfb565b620003b0620007423660046200472f565b62002025565b6200035662000759366004620048ad565b620020db565b6200045c62002106565b620003226200077a36600462004bfa565b620021ed565b620003b062000791366004620048e0565b620023bf565b620003b0620007a8366004620048e0565b62002465565b6200045c600081565b6200045c62002509565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200162000336565b6085546200081890600160801b900461ffff1681565b60405161ffff909116815260200162000336565b620008c26200083d366004620046c6565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b60405162000336919060006080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200032290600160801b90046001600160401b031681565b620003b06200093436600462004c27565b620028de565b620003ff6200094b36600462004cbf565b60826020526000908152604090205463ffffffff1681565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b620003b06200099c36600462004893565b62002bbd565b620003b0620009b3366004620048ad565b62002c59565b60855462000322906001600160401b031681565b620003b062002c82565b6084546200032290600160401b90046001600160401b031681565b620003b062000a0336600462004cf1565b62002d30565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b620003b062000a4236600462004d6d565b62002dc9565b608054620003ff9063ffffffff1681565b62000af062000a6a366004620046fe565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff166101608201526101800162000336565b63ffffffff8216600090815260816020526040812062000b91908362002fc5565b90505b92915050565b63ffffffff8116600090815260816020526040812062000b94906200300a565b60008051602062005bf783398151915262000bd5816200307b565b63ffffffff8916600090815260816020526040902062000bfc818a8a8a8a8a8a8a62003087565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000c64576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000c9d62002509565b6040518263ffffffff1660e01b815260040162000cbc91815260200190565b600060405180830381600087803b15801562000cd757600080fd5b505af115801562000cec573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005bf783398151915262000d85816200307b565b63ffffffff8916600090815260816020526040902062000dac818a8a8a8a8a8a8a62003420565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562000e14576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000e4d62002509565b6040518263ffffffff1660e01b815260040162000e6c91815260200190565b600060405180830381600087803b15801562000e8757600080fd5b505af115801562000e9c573d6000803e3d6000fd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff8216600090815260816020526040902062000f3060008051602062005bf783398151915233620020db565b62000f8457606f5460ff161562000f5a57604051630bc011ff60e21b815260040160405180910390fd5b62000f66818362002fc5565b62000f8457604051630674f25160e11b815260040160405180910390fd5b62000f9081836200382e565b505050565b60008051602062005bb783398151915262000fb0816200307b565b6103e88261ffff16108062000fca57506103ff8261ffff16115b1562000fe957604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200105c60008051602062005bd783398151915233620020db565b620010cb57608454600160801b90046001600160401b03161580620010ac57506084544290620010a19062093a8090600160801b90046001600160401b031662004e1a565b6001600160401b0316115b15620010cb5760405163692baaad60e11b815260040160405180910390fd5b620010d562003a20565b565b600082815260346020526040902060010154620010f4816200307b565b62000f90838362003a9f565b6001600160a01b03811633146200112a57604051630b4ad1cd60e31b815260040160405180910390fd5b62001136828262003b0b565b5050565b60008051602062005bb783398151915262001155816200307b565b606f5460ff1662001197576084546001600160401b03600160c01b909104811690831610620011975760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19060200162001035565b600054600290610100900460ff1615801562001211575060005460ff8083169116105b6200127a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b179055620012fb62003b75565b6200131660008051602062005bf78339815191528a62003be2565b6200132360008662003be2565b6200134f7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908662003be2565b6200137b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8662003be2565b620013a77f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8662003be2565b620013d37fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8762003be2565b620013ff7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088762003be2565b6200142b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48762003be2565b6200144660008051602062005bb78339815191528762003be2565b6200148160008051602062005bf78339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062003bee565b620014ad7f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08762003be2565b620014d97f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8762003be2565b6200151460008051602062005bd78339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162003bee565b6200152f60008051602062005bd78339815191528562003be2565b6200155b7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518562003be2565b6000620015708484600561044d600062003c39565b6073546074549192506001600160401b03600160401b90910481169116808214620015ae57604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b0381811660008181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620016b09695831695600160581b909104909216936076936077939192919091169060040162004ef0565b600060405180830381600087803b158015620016cb57600080fd5b505af1158015620016e0573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620017289050565b60405180910390a1505050505050505050565b600060865460646200174e919062004f55565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd6200177f816200307b565b63ffffffff821615806200179e5750607e5463ffffffff908116908316115b15620017bd57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200180457604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd086200187b816200307b565b63ffffffff881615806200189a5750607e5463ffffffff908116908916115b15620018b957604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff16151590036200190057604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff16156200193e576040516337c8fe0960e11b815260040160405180910390fd5b60808054600091908290620019599063ffffffff1662004f6f565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b03909216913091620019a7906200468b565b620019b59392919062004f95565b604051809103906000f080158015620019d2573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001c46949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001c86908d908d9088908e908e908e9060040162004fcc565b600060405180830381600087803b15801562001ca157600080fd5b505af115801562001cb6573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001cf090878787878762003e5e565b979650505050505050565b606f5460ff161562001d2057604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001d6f92600160c01b90048116911662004e1a565b6001600160401b0316111562001d9857604051638a0704d360e01b815260040160405180910390fd5b6103e862001da788886200502f565b6001600160401b0316111562001dd057604051635acfba9d60e11b815260040160405180910390fd5b62001de2818989898989898962003420565b62001dee818762003f9e565b6085546001600160401b031660000362001efc57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001e6a576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001ea362002509565b6040518263ffffffff1660e01b815260040162001ec291815260200190565b600060405180830381600087803b15801562001edd57600080fd5b505af115801562001ef2573d6000803e3d6000fd5b5050505062001fc6565b62001f07816200419b565b600681018054600160801b90046001600160401b031690601062001f2b8362005052565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff16156200204a57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff8816600090815260816020526040902062002071818989898989898962003087565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620020d062003a20565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b815230600482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562002170573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002196919062005071565b608454909150600090620021bd906001600160401b03600160401b8204811691166200502f565b6001600160401b0316905080600003620021da5760009250505090565b620021e68183620050a1565b9250505090565b606f5460009060ff16156200221557604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff16908190036200224d576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200227857604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620022ab9084906001600160401b031662004e1a565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620022e1878362004e1a565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b03199092169290931691909117179055905062002371836200419b565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b60008051602062005bb7833981519152620023da816200307b565b606f5460ff1662002415576085546001600160401b0390811690831610620024155760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759060200162001035565b60008051602062005bb783398151915262002480816200307b565b62015180826001600160401b03161115620024ae57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289060200162001035565b60805460009063ffffffff168082036200252557506000919050565b6000816001600160401b03811115620025425762002542620049b4565b6040519080825280602002602001820160405280156200256c578160200160208202803683370190505b50905060005b82811015620025df57608160006200258c836001620050b8565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620025bf57620025bf620050ce565b602090810291909101015280620025d681620050e4565b91505062002572565b50600060205b836001146200283b576000620025fd60028662005100565b6200260a600287620050a1565b620026169190620050b8565b90506000816001600160401b03811115620026355762002635620049b4565b6040519080825280602002602001820160405280156200265f578160200160208202803683370190505b50905060005b82811015620027e7576200267b60018462005117565b811480156200269657506200269260028862005100565b6001145b156200271e5785620026aa82600262004f55565b81518110620026bd57620026bd620050ce565b602002602001015185604051602001620026e1929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106200270c576200270c620050ce565b602002602001018181525050620027d2565b856200272c82600262004f55565b815181106200273f576200273f620050ce565b60200260200101518682600262002757919062004f55565b62002764906001620050b8565b81518110620027775762002777620050ce565b60200260200101516040516020016200279a929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620027c557620027c5620050ce565b6020026020010181815250505b80620027de81620050e4565b91505062002665565b5080945081955083846040516020016200280b929190918252602082015260400190565b604051602081830303815290604052805190602001209350828062002830906200512d565b9350505050620025e5565b600083600081518110620028535762002853620050ce565b6020026020010151905060005b82811015620028d457604080516020810184905290810185905260600160408051601f19818403018152828252805160209182012090830187905290820186905292506060016040516020818303038152906040528051906020012093508080620028cb90620050e4565b91505062002860565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac6200290a816200307b565b63ffffffff84161580620029295750607e5463ffffffff908116908516115b156200294857604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002989576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b031603620029d857604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002a1f57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002a5d57604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002add8462000b9a565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002b339216908b908b9060040162005147565b600060405180830381600087803b15801562002b4e57600080fd5b505af115801562002b63573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002be9816200307b565b683635c9adc5dea0000082118062002c045750633b9aca0082105b1562002c2357604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001035565b60008281526034602052604090206001015462002c76816200307b565b62000f90838362003b0b565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002cae816200307b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002d0a57600080fd5b505af115801562002d1f573d6000803e3d6000fd5b5050505062002d2d62004266565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62002d5c816200307b565b6001600160401b03841660009081526083602052604090205463ffffffff161562002d9a576040516337c8fe0960e11b815260040160405180910390fd5b600062002dab888888888762003c39565b60008080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002df5816200307b565b607e805460009190829062002e109063ffffffff1662004f6f565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002fb39695949392919062005187565b60405180910390a25050505050505050565b6085546001600160401b0382811660009081526004850160205260408120549092429262002ff892918116911662004e1a565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b0316156200305e575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002d2d8133620042bf565b60078801546000906001600160401b039081169087161015620030bd5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038816156200315e5760068901546001600160401b03600160801b90910481169089161115620031075760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200315757604051632bd2e3e760e01b815260040160405180910390fd5b50620031d3565b506001600160401b03851660009081526002890160205260409020548062003199576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620031d357604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b909104811690881611806200320c5750876001600160401b0316876001600160401b031611155b8062003230575060068901546001600160401b03600160c01b909104811690881611155b156200324f5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b900481169086161462003296576040516332a2a77f60e01b815260040160405180910390fd5b6000620032a88a888888868962003e5e565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620032df9190620051e0565b602060405180830381855afa158015620032fd573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003322919062005071565b6200332e919062005100565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200337291889190600401620051fe565b602060405180830381865afa15801562003390573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620033b691906200523b565b620033d4576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620034135760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b6000806200342e8a6200300a565b60078b01549091506001600160401b039081169089161015620034645760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620035075760068a01546001600160401b03600160801b9091048116908a161115620034ae5760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200350057604051632bd2e3e760e01b815260040160405180910390fd5b5062003577565b6001600160401b038816600090815260028b01602052604090205491508162003543576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200357757604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620035aa5760405163b9b18f5760e01b815260040160405180910390fd5b6000620035bc8b8a8a8a878b62003e5e565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620035f39190620051e0565b602060405180830381855afa15801562003611573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003636919062005071565b62003642919062005100565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200368691899190600401620051fe565b602060405180830381865afa158015620036a4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620036ca91906200523b565b620036e8576040516309bde33960e01b815260040160405180910390fd5b6000620036f6848b6200502f565b90506200374f87826001600160401b03166200371162002106565b6200371d919062004f55565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620042e9565b80608460088282829054906101000a90046001600160401b031662003775919062004e1a565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b1580156200380657600080fd5b505af11580156200381b573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b90910481169082161115806200386d575060068201546001600160401b03600160801b9091048116908216115b156200388c5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200394862002509565b6040518263ffffffff1660e01b81526004016200396791815260200190565b600060405180830381600087803b1580156200398257600080fd5b505af115801562003997573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003a7c57600080fd5b505af115801562003a91573d6000803e3d6000fd5b50505050620010d56200433d565b62003aab8282620020db565b620011365760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003b178282620020db565b15620011365760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600054610100900460ff16620010d55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162001271565b62001136828262003a9f565b600082815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080546000918291829062003c559063ffffffff1662004f6f565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000866001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508060826000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150868260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550858260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550838260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003e4c94939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003e94575081155b1562003eb35760405163340c614f60e11b815260040160405180910390fd5b8062003ed2576040516366385b5160e01b815260040160405180910390fd5b62003edd846200439a565b62003efb576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b600062003fab836200300a565b90508160008062003fbd84846200502f565b6085546001600160401b03918216925060009162003fe491600160401b9004164262005117565b90505b846001600160401b0316846001600160401b0316146200406e576001600160401b0380851660009081526003890160205260409020600181015490911682101562004049576001810154600160401b90046001600160401b0316945062004067565b6200405586866200502f565b6001600160401b03169350506200406e565b5062003fe7565b60006200407c848462005117565b905083811015620040da57808403600c81116200409a57806200409d565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620040cf57620040cf6200508b565b046086555062004152565b838103600c8111620040ed5780620040f0565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a764000002816200412a576200412a6200508b565b04905080608654670de0b6b3a764000002816200414b576200414b6200508b565b0460865550505b683635c9adc5dea0000060865411156200417957683635c9adc5dea0000060865562004191565b633b9aca0060865410156200419157633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002d2d576006810154600090620041e690600160c01b90046001600160401b0316600162004e1a565b9050620041f4828262002fc5565b156200113657600682015460009060029062004222908490600160801b90046001600160401b03166200502f565b6200422e91906200525f565b6200423a908362004e1a565b905062004248838262002fc5565b156200425a5762000f9083826200382e565b62000f9083836200382e565b606f5460ff166200428a57604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b620042cb8282620020db565b6200113657604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905262000f9090849062004420565b606f5460ff16156200436257604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b038316108015620043d1575067ffffffff00000001604083901c6001600160401b0316105b8015620043f2575067ffffffff00000001608083901c6001600160401b0316105b80156200440a575067ffffffff0000000160c083901c105b156200441857506001919050565b506000919050565b600062004477826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620044f99092919063ffffffff16565b80519091501562000f9057808060200190518101906200449891906200523b565b62000f905760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162001271565b60606200450a848460008562004512565b949350505050565b606082471015620045755760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162001271565b600080866001600160a01b03168587604051620045939190620051e0565b60006040518083038185875af1925050503d8060008114620045d2576040519150601f19603f3d011682016040523d82523d6000602084013e620045d7565b606091505b509150915062001cf087838387606083156200465857825160000362004650576001600160a01b0385163b620046505760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001271565b50816200450a565b6200450a83838151156200466f5781518083602001fd5b8060405162461bcd60e51b815260040162001271919062004be5565b61092e806200528983390190565b803563ffffffff811681146200307657600080fd5b80356001600160401b03811681146200307657600080fd5b60008060408385031215620046da57600080fd5b620046e58362004699565b9150620046f560208401620046ae565b90509250929050565b6000602082840312156200471157600080fd5b62000b918262004699565b80610300810183101562000b9457600080fd5b6000806000806000806000806103e0898b0312156200474d57600080fd5b620047588962004699565b97506200476860208a01620046ae565b96506200477860408a01620046ae565b95506200478860608a01620046ae565b94506200479860808a01620046ae565b935060a0890135925060c08901359150620047b78a60e08b016200471c565b90509295985092959890939650565b6001600160a01b038116811462002d2d57600080fd5b6000806000806000806000806103e0898b031215620047fa57600080fd5b620048058962004699565b97506200481560208a01620046ae565b96506200482560408a01620046ae565b95506200483560608a01620046ae565b94506080890135935060a0890135925060c08901356200485581620047c6565b9150620047b78a60e08b016200471c565b6000602082840312156200487957600080fd5b813561ffff811681146200488c57600080fd5b9392505050565b600060208284031215620048a657600080fd5b5035919050565b60008060408385031215620048c157600080fd5b823591506020830135620048d581620047c6565b809150509250929050565b600060208284031215620048f357600080fd5b62000b9182620046ae565b600080600080600080600080610100898b0312156200491c57600080fd5b88356200492981620047c6565b97506200493960208a01620046ae565b96506200494960408a01620046ae565b955060608901356200495b81620047c6565b945060808901356200496d81620047c6565b935060a08901356200497f81620047c6565b925060c08901356200499181620047c6565b915060e0890135620049a381620047c6565b809150509295985092959890939650565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620049dc57600080fd5b81356001600160401b0380821115620049f957620049f9620049b4565b604051601f8301601f19908116603f0116810190828211818310171562004a245762004a24620049b4565b8160405283815286602085880101111562004a3e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121562004a7a57600080fd5b62004a858862004699565b965062004a9560208901620046ae565b9550604088013562004aa781620047c6565b9450606088013562004ab981620047c6565b9350608088013562004acb81620047c6565b925060a08801356001600160401b038082111562004ae857600080fd5b62004af68b838c01620049ca565b935060c08a013591508082111562004b0d57600080fd5b5062004b1c8a828b01620049ca565b91505092959891949750929550565b60008060008060008060c0878903121562004b4557600080fd5b62004b508762004699565b955062004b6060208801620046ae565b945062004b7060408801620046ae565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004bae57818101518382015260200162004b94565b50506000910152565b6000815180845262004bd181602086016020860162004b91565b601f01601f19169290920160200192915050565b60208152600062000b91602083018462004bb7565b6000806040838503121562004c0e57600080fd5b62004c1983620046ae565b946020939093013593505050565b6000806000806060858703121562004c3e57600080fd5b843562004c4b81620047c6565b935062004c5b6020860162004699565b925060408501356001600160401b038082111562004c7857600080fd5b818701915087601f83011262004c8d57600080fd5b81358181111562004c9d57600080fd5b88602082850101111562004cb057600080fd5b95989497505060200194505050565b60006020828403121562004cd257600080fd5b81356200488c81620047c6565b803560ff811681146200307657600080fd5b60008060008060008060c0878903121562004d0b57600080fd5b863562004d1881620047c6565b9550602087013562004d2a81620047c6565b945062004d3a60408801620046ae565b935062004d4a60608801620046ae565b92506080870135915062004d6160a0880162004cdf565b90509295509295509295565b60008060008060008060c0878903121562004d8757600080fd5b863562004d9481620047c6565b9550602087013562004da681620047c6565b945062004db660408801620046ae565b935062004dc66060880162004cdf565b92506080870135915060a08701356001600160401b0381111562004de957600080fd5b62004df789828a01620049ca565b9150509295509295509295565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004e3d5762004e3d62004e04565b5092915050565b8054600090600181811c908083168062004e5f57607f831692505b6020808410820362004e8157634e487b7160e01b600052602260045260246000fd5b8388526020880182801562004e9f576001811462004eb65762004ee3565b60ff198716825285151560051b8201975062004ee3565b60008981526020902060005b8781101562004edd5781548482015290860190840162004ec2565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c06040820181905260009062004f1e9083018762004e44565b828103606084015262004f32818762004e44565b9150508360808301526001600160401b03831660a0830152979650505050505050565b808202811582820484141762000b945762000b9462004e04565b600063ffffffff80831681810362004f8b5762004f8b62004e04565b6001019392505050565b6001600160a01b0384811682528316602082015260606040820181905260009062004fc39083018462004bb7565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190526000906200500e9083018562004bb7565b82810360a084015262005022818562004bb7565b9998505050505050505050565b6001600160401b0382811682821603908082111562004e3d5762004e3d62004e04565b60006001600160401b0380831681810362004f8b5762004f8b62004e04565b6000602082840312156200508457600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082620050b357620050b36200508b565b500490565b8082018082111562000b945762000b9462004e04565b634e487b7160e01b600052603260045260246000fd5b600060018201620050f957620050f962004e04565b5060010190565b6000826200511257620051126200508b565b500690565b8181038181111562000b945762000b9462004e04565b6000816200513f576200513f62004e04565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a08201819052600090620051d49083018462004bb7565b98975050505050505050565b60008251620051f481846020870162004b91565b9190910192915050565b61032081016103008085843782018360005b60018110156200523157815183526020928301929091019060010162005210565b5050509392505050565b6000602082840312156200524e57600080fd5b815180151581146200488c57600080fd5b60006001600160401b03808416806200527c576200527c6200508b565b9216919091049291505056fe60a06040526040516200092e3803806200092e833981016040819052620000269162000383565b828162000034828262000060565b50506001600160a01b038216608052620000576200005160805190565b620000c6565b50505062000481565b6200006b8262000138565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115620000b857620000b38282620001b8565b505050565b620000c262000235565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620001086000805160206200090e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001358162000257565b50565b806001600160a01b03163b6000036200017457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b031684604051620001d7919062000463565b600060405180830381855af49150503d806000811462000214576040519150601f19603f3d011682016040523d82523d6000602084013e62000219565b606091505b5090925090506200022c8583836200029a565b95945050505050565b3415620002555760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166200028357604051633173bdd160e11b8152600060048201526024016200016b565b806000805160206200090e83398151915262000197565b606082620002b357620002ad8262000300565b620002f9565b8151158015620002cb57506001600160a01b0384163b155b15620002f657604051639996b31560e01b81526001600160a01b03851660048201526024016200016b565b50805b9392505050565b805115620003115780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b03811681146200034257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200037a57818101518382015260200162000360565b50506000910152565b6000806000606084860312156200039957600080fd5b620003a4846200032a565b9250620003b4602085016200032a565b60408501519092506001600160401b0380821115620003d257600080fd5b818601915086601f830112620003e757600080fd5b815181811115620003fc57620003fc62000347565b604051601f8201601f19908116603f0116810190838211818310171562000427576200042762000347565b816040528281528960208487010111156200044157600080fd5b620004548360208301602088016200035d565b80955050505050509250925092565b60008251620004778184602087016200035d565b9190910192915050565b6080516104726200049c6000396000601001526104726000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100e5565b60008061008e36600481846102fd565b81019061009b919061033d565b915091506100a98282610109565b5050565b60006100e07f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610104573d6000f35b3d6000fd5b61011282610164565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561015c5761015782826101e0565b505050565b6100a9610256565b806001600160a01b03163b60000361019f57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101fd919061040d565b600060405180830381855af49150503d8060008114610238576040519150601f19603f3d011682016040523d82523d6000602084013e61023d565b606091505b509150915061024d858383610275565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b60608261028a57610285826102d4565b6102cd565b81511580156102a157506001600160a01b0384163b155b156102ca57604051639996b31560e01b81526001600160a01b0385166004820152602401610196565b50805b9392505050565b8051156102e45780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6000808585111561030d57600080fd5b8386111561031a57600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035057600080fd5b82356001600160a01b038116811461036757600080fd5b9150602083013567ffffffffffffffff8082111561038457600080fd5b818501915085601f83011261039857600080fd5b8135818111156103aa576103aa610327565b604051601f8201601f19908116603f011681019083821181831017156103d2576103d2610327565b816040528281528860208487010111156103eb57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000825160005b8181101561042e5760208186018101518583015201610414565b50600092019182525091905056fea2646970667358221220d51c6fc430c553d1da2391464fd71dbfa43dc91a9531c4d842a3289bb581301664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220940fd7fb8f2b0b558c758ec81586b1381069bcd4c57c3af55969d22a9a6d9c3b64736f6c63430008140033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620003095760003560e01c806387c20c01116200019d578063c4c928c211620000eb578063dbc16976116200009e578063dbc1697614620009cd578063dde0ff7714620009d7578063e0bfd3d214620009f2578063e46761c41462000a09578063f34eb8eb1462000a31578063f4e926751462000a48578063f9c4c2ae1462000a5957600080fd5b8063c4c928c21462000923578063ceee281d146200093a578063d02103ca1462000963578063d5073f6f146200098b578063d547741f14620009a2578063d939b31514620009b957600080fd5b8063a066215c1162000150578063a066215c1462000797578063a217fddf14620007ae578063a2967d9914620007b7578063a3c573eb14620007c1578063afd23cbe1462000802578063b99d0ad7146200082c578063c1acbc34146200090857600080fd5b806387c20c01146200071a5780638bd4f071146200073157806391d14854146200074857806399f5634e146200075f5780639a908e7314620007695780639c9f3dfe146200078057600080fd5b80632f2ff15d116200025b57806360469169116200020e5780636046916914620005c957806365c0504d14620005d35780637222020f1462000682578063727885e914620006995780637975fcfe14620006b05780637fb6e76a14620006d6578063841b24d714620006ff57600080fd5b80632f2ff15d146200052057806336568abe1462000537578063394218e9146200054e578063477fa27014620005655780634d4d3338146200056e57806355a71ee0146200058557600080fd5b806315064c9611620002c057806315064c9614620003c95780631608859c14620003d75780631796a1ae14620003ee5780631816b7e514620004155780632072f6c5146200042c578063248a9ca3146200043657806325280169146200046b57600080fd5b8063066ec012146200030e578063080b3111146200033f5780630a0d9fbe146200036757806311f6b287146200038257806312b86e1914620003995780631489ed1014620003b2575b600080fd5b60845462000322906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b6200035662000350366004620046c6565b62000b70565b604051901515815260200162000336565b6085546200032290600160401b90046001600160401b031681565b6200032262000393366004620046fe565b62000b9a565b620003b0620003aa3660046200472f565b62000bba565b005b620003b0620003c3366004620047dc565b62000d6a565b606f54620003569060ff1681565b620003b0620003e8366004620046c6565b62000f00565b607e54620003ff9063ffffffff1681565b60405163ffffffff909116815260200162000336565b620003b06200042636600462004866565b62000f95565b620003b062001041565b6200045c6200044736600462004893565b60009081526034602052604090206001015490565b60405190815260200162000336565b620004ec6200047c366004620046c6565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b0390811691830191909152928201519092169082015260600162000336565b620003b062000531366004620048ad565b620010d7565b620003b062000548366004620048ad565b62001100565b620003b06200055f366004620048e0565b6200113a565b6086546200045c565b620003b06200057f366004620048fe565b620011ee565b6200045c62000596366004620046c6565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b6200045c6200173b565b62000638620005e4366004620046fe565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c00162000336565b620003b062000693366004620046fe565b62001753565b620003b0620006aa36600462004a5e565b6200184f565b620006c7620006c136600462004b2b565b62001cc8565b60405162000336919062004be5565b620003ff620006e7366004620048e0565b60836020526000908152604090205463ffffffff1681565b6084546200032290600160c01b90046001600160401b031681565b620003b06200072b366004620047dc565b62001cfb565b620003b0620007423660046200472f565b62002025565b6200035662000759366004620048ad565b620020db565b6200045c62002106565b620003226200077a36600462004bfa565b620021ed565b620003b062000791366004620048e0565b620023bf565b620003b0620007a8366004620048e0565b62002465565b6200045c600081565b6200045c62002509565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200162000336565b6085546200081890600160801b900461ffff1681565b60405161ffff909116815260200162000336565b620008c26200083d366004620046c6565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b60405162000336919060006080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200032290600160801b90046001600160401b031681565b620003b06200093436600462004c27565b620028de565b620003ff6200094b36600462004cbf565b60826020526000908152604090205463ffffffff1681565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b620003b06200099c36600462004893565b62002bbd565b620003b0620009b3366004620048ad565b62002c59565b60855462000322906001600160401b031681565b620003b062002c82565b6084546200032290600160401b90046001600160401b031681565b620003b062000a0336600462004cf1565b62002d30565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b620003b062000a4236600462004d6d565b62002dc9565b608054620003ff9063ffffffff1681565b62000af062000a6a366004620046fe565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff166101608201526101800162000336565b63ffffffff8216600090815260816020526040812062000b91908362002fc5565b90505b92915050565b63ffffffff8116600090815260816020526040812062000b94906200300a565b60008051602062005bf783398151915262000bd5816200307b565b63ffffffff8916600090815260816020526040902062000bfc818a8a8a8a8a8a8a62003087565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000c64576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000c9d62002509565b6040518263ffffffff1660e01b815260040162000cbc91815260200190565b600060405180830381600087803b15801562000cd757600080fd5b505af115801562000cec573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005bf783398151915262000d85816200307b565b63ffffffff8916600090815260816020526040902062000dac818a8a8a8a8a8a8a62003420565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562000e14576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000e4d62002509565b6040518263ffffffff1660e01b815260040162000e6c91815260200190565b600060405180830381600087803b15801562000e8757600080fd5b505af115801562000e9c573d6000803e3d6000fd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff8216600090815260816020526040902062000f3060008051602062005bf783398151915233620020db565b62000f8457606f5460ff161562000f5a57604051630bc011ff60e21b815260040160405180910390fd5b62000f66818362002fc5565b62000f8457604051630674f25160e11b815260040160405180910390fd5b62000f9081836200382e565b505050565b60008051602062005bb783398151915262000fb0816200307b565b6103e88261ffff16108062000fca57506103ff8261ffff16115b1562000fe957604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200105c60008051602062005bd783398151915233620020db565b620010cb57608454600160801b90046001600160401b03161580620010ac57506084544290620010a19062093a8090600160801b90046001600160401b031662004e1a565b6001600160401b0316115b15620010cb5760405163692baaad60e11b815260040160405180910390fd5b620010d562003a20565b565b600082815260346020526040902060010154620010f4816200307b565b62000f90838362003a9f565b6001600160a01b03811633146200112a57604051630b4ad1cd60e31b815260040160405180910390fd5b62001136828262003b0b565b5050565b60008051602062005bb783398151915262001155816200307b565b606f5460ff1662001197576084546001600160401b03600160c01b909104811690831610620011975760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19060200162001035565b600054600290610100900460ff1615801562001211575060005460ff8083169116105b6200127a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b179055620012fb62003b75565b6200131660008051602062005bf78339815191528a62003be2565b6200132360008662003be2565b6200134f7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908662003be2565b6200137b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8662003be2565b620013a77f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8662003be2565b620013d37fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8762003be2565b620013ff7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088762003be2565b6200142b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48762003be2565b6200144660008051602062005bb78339815191528762003be2565b6200148160008051602062005bf78339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062003bee565b620014ad7f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08762003be2565b620014d97f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8762003be2565b6200151460008051602062005bd78339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162003bee565b6200152f60008051602062005bd78339815191528562003be2565b6200155b7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518562003be2565b6000620015708484600561044d600062003c39565b6073546074549192506001600160401b03600160401b90910481169116808214620015ae57604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b0381811660008181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620016b09695831695600160581b909104909216936076936077939192919091169060040162004ef0565b600060405180830381600087803b158015620016cb57600080fd5b505af1158015620016e0573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620017289050565b60405180910390a1505050505050505050565b600060865460646200174e919062004f55565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd6200177f816200307b565b63ffffffff821615806200179e5750607e5463ffffffff908116908316115b15620017bd57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200180457604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd086200187b816200307b565b63ffffffff881615806200189a5750607e5463ffffffff908116908916115b15620018b957604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff16151590036200190057604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff16156200193e576040516337c8fe0960e11b815260040160405180910390fd5b60808054600091908290620019599063ffffffff1662004f6f565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b03909216913091620019a7906200468b565b620019b59392919062004f95565b604051809103906000f080158015620019d2573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001c46949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001c86908d908d9088908e908e908e9060040162004fcc565b600060405180830381600087803b15801562001ca157600080fd5b505af115801562001cb6573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001cf090878787878762003e5e565b979650505050505050565b606f5460ff161562001d2057604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001d6f92600160c01b90048116911662004e1a565b6001600160401b0316111562001d9857604051638a0704d360e01b815260040160405180910390fd5b6103e862001da788886200502f565b6001600160401b0316111562001dd057604051635acfba9d60e11b815260040160405180910390fd5b62001de2818989898989898962003420565b62001dee818762003f9e565b6085546001600160401b031660000362001efc57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001e6a576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001ea362002509565b6040518263ffffffff1660e01b815260040162001ec291815260200190565b600060405180830381600087803b15801562001edd57600080fd5b505af115801562001ef2573d6000803e3d6000fd5b5050505062001fc6565b62001f07816200419b565b600681018054600160801b90046001600160401b031690601062001f2b8362005052565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff16156200204a57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff8816600090815260816020526040902062002071818989898989898962003087565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620020d062003a20565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b815230600482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562002170573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002196919062005071565b608454909150600090620021bd906001600160401b03600160401b8204811691166200502f565b6001600160401b0316905080600003620021da5760009250505090565b620021e68183620050a1565b9250505090565b606f5460009060ff16156200221557604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff16908190036200224d576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200227857604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620022ab9084906001600160401b031662004e1a565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620022e1878362004e1a565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b03199092169290931691909117179055905062002371836200419b565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b60008051602062005bb7833981519152620023da816200307b565b606f5460ff1662002415576085546001600160401b0390811690831610620024155760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759060200162001035565b60008051602062005bb783398151915262002480816200307b565b62015180826001600160401b03161115620024ae57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289060200162001035565b60805460009063ffffffff168082036200252557506000919050565b6000816001600160401b03811115620025425762002542620049b4565b6040519080825280602002602001820160405280156200256c578160200160208202803683370190505b50905060005b82811015620025df57608160006200258c836001620050b8565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620025bf57620025bf620050ce565b602090810291909101015280620025d681620050e4565b91505062002572565b50600060205b836001146200283b576000620025fd60028662005100565b6200260a600287620050a1565b620026169190620050b8565b90506000816001600160401b03811115620026355762002635620049b4565b6040519080825280602002602001820160405280156200265f578160200160208202803683370190505b50905060005b82811015620027e7576200267b60018462005117565b811480156200269657506200269260028862005100565b6001145b156200271e5785620026aa82600262004f55565b81518110620026bd57620026bd620050ce565b602002602001015185604051602001620026e1929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106200270c576200270c620050ce565b602002602001018181525050620027d2565b856200272c82600262004f55565b815181106200273f576200273f620050ce565b60200260200101518682600262002757919062004f55565b62002764906001620050b8565b81518110620027775762002777620050ce565b60200260200101516040516020016200279a929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620027c557620027c5620050ce565b6020026020010181815250505b80620027de81620050e4565b91505062002665565b5080945081955083846040516020016200280b929190918252602082015260400190565b604051602081830303815290604052805190602001209350828062002830906200512d565b9350505050620025e5565b600083600081518110620028535762002853620050ce565b6020026020010151905060005b82811015620028d457604080516020810184905290810185905260600160408051601f19818403018152828252805160209182012090830187905290820186905292506060016040516020818303038152906040528051906020012093508080620028cb90620050e4565b91505062002860565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac6200290a816200307b565b63ffffffff84161580620029295750607e5463ffffffff908116908516115b156200294857604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002989576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b031603620029d857604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002a1f57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002a5d57604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002add8462000b9a565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002b339216908b908b9060040162005147565b600060405180830381600087803b15801562002b4e57600080fd5b505af115801562002b63573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002be9816200307b565b683635c9adc5dea0000082118062002c045750633b9aca0082105b1562002c2357604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001035565b60008281526034602052604090206001015462002c76816200307b565b62000f90838362003b0b565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002cae816200307b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002d0a57600080fd5b505af115801562002d1f573d6000803e3d6000fd5b5050505062002d2d62004266565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62002d5c816200307b565b6001600160401b03841660009081526083602052604090205463ffffffff161562002d9a576040516337c8fe0960e11b815260040160405180910390fd5b600062002dab888888888762003c39565b60008080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002df5816200307b565b607e805460009190829062002e109063ffffffff1662004f6f565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002fb39695949392919062005187565b60405180910390a25050505050505050565b6085546001600160401b0382811660009081526004850160205260408120549092429262002ff892918116911662004e1a565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b0316156200305e575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002d2d8133620042bf565b60078801546000906001600160401b039081169087161015620030bd5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038816156200315e5760068901546001600160401b03600160801b90910481169089161115620031075760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200315757604051632bd2e3e760e01b815260040160405180910390fd5b50620031d3565b506001600160401b03851660009081526002890160205260409020548062003199576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620031d357604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b909104811690881611806200320c5750876001600160401b0316876001600160401b031611155b8062003230575060068901546001600160401b03600160c01b909104811690881611155b156200324f5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b900481169086161462003296576040516332a2a77f60e01b815260040160405180910390fd5b6000620032a88a888888868962003e5e565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620032df9190620051e0565b602060405180830381855afa158015620032fd573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003322919062005071565b6200332e919062005100565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200337291889190600401620051fe565b602060405180830381865afa15801562003390573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620033b691906200523b565b620033d4576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620034135760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b6000806200342e8a6200300a565b60078b01549091506001600160401b039081169089161015620034645760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620035075760068a01546001600160401b03600160801b9091048116908a161115620034ae5760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200350057604051632bd2e3e760e01b815260040160405180910390fd5b5062003577565b6001600160401b038816600090815260028b01602052604090205491508162003543576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200357757604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620035aa5760405163b9b18f5760e01b815260040160405180910390fd5b6000620035bc8b8a8a8a878b62003e5e565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620035f39190620051e0565b602060405180830381855afa15801562003611573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003636919062005071565b62003642919062005100565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200368691899190600401620051fe565b602060405180830381865afa158015620036a4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620036ca91906200523b565b620036e8576040516309bde33960e01b815260040160405180910390fd5b6000620036f6848b6200502f565b90506200374f87826001600160401b03166200371162002106565b6200371d919062004f55565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620042e9565b80608460088282829054906101000a90046001600160401b031662003775919062004e1a565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b1580156200380657600080fd5b505af11580156200381b573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b90910481169082161115806200386d575060068201546001600160401b03600160801b9091048116908216115b156200388c5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200394862002509565b6040518263ffffffff1660e01b81526004016200396791815260200190565b600060405180830381600087803b1580156200398257600080fd5b505af115801562003997573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003a7c57600080fd5b505af115801562003a91573d6000803e3d6000fd5b50505050620010d56200433d565b62003aab8282620020db565b620011365760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003b178282620020db565b15620011365760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600054610100900460ff16620010d55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162001271565b62001136828262003a9f565b600082815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080546000918291829062003c559063ffffffff1662004f6f565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000866001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508060826000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150868260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550858260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550838260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003e4c94939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003e94575081155b1562003eb35760405163340c614f60e11b815260040160405180910390fd5b8062003ed2576040516366385b5160e01b815260040160405180910390fd5b62003edd846200439a565b62003efb576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b600062003fab836200300a565b90508160008062003fbd84846200502f565b6085546001600160401b03918216925060009162003fe491600160401b9004164262005117565b90505b846001600160401b0316846001600160401b0316146200406e576001600160401b0380851660009081526003890160205260409020600181015490911682101562004049576001810154600160401b90046001600160401b0316945062004067565b6200405586866200502f565b6001600160401b03169350506200406e565b5062003fe7565b60006200407c848462005117565b905083811015620040da57808403600c81116200409a57806200409d565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620040cf57620040cf6200508b565b046086555062004152565b838103600c8111620040ed5780620040f0565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a764000002816200412a576200412a6200508b565b04905080608654670de0b6b3a764000002816200414b576200414b6200508b565b0460865550505b683635c9adc5dea0000060865411156200417957683635c9adc5dea0000060865562004191565b633b9aca0060865410156200419157633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002d2d576006810154600090620041e690600160c01b90046001600160401b0316600162004e1a565b9050620041f4828262002fc5565b156200113657600682015460009060029062004222908490600160801b90046001600160401b03166200502f565b6200422e91906200525f565b6200423a908362004e1a565b905062004248838262002fc5565b156200425a5762000f9083826200382e565b62000f9083836200382e565b606f5460ff166200428a57604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b620042cb8282620020db565b6200113657604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905262000f9090849062004420565b606f5460ff16156200436257604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b038316108015620043d1575067ffffffff00000001604083901c6001600160401b0316105b8015620043f2575067ffffffff00000001608083901c6001600160401b0316105b80156200440a575067ffffffff0000000160c083901c105b156200441857506001919050565b506000919050565b600062004477826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620044f99092919063ffffffff16565b80519091501562000f9057808060200190518101906200449891906200523b565b62000f905760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162001271565b60606200450a848460008562004512565b949350505050565b606082471015620045755760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162001271565b600080866001600160a01b03168587604051620045939190620051e0565b60006040518083038185875af1925050503d8060008114620045d2576040519150601f19603f3d011682016040523d82523d6000602084013e620045d7565b606091505b509150915062001cf087838387606083156200465857825160000362004650576001600160a01b0385163b620046505760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001271565b50816200450a565b6200450a83838151156200466f5781518083602001fd5b8060405162461bcd60e51b815260040162001271919062004be5565b61092e806200528983390190565b803563ffffffff811681146200307657600080fd5b80356001600160401b03811681146200307657600080fd5b60008060408385031215620046da57600080fd5b620046e58362004699565b9150620046f560208401620046ae565b90509250929050565b6000602082840312156200471157600080fd5b62000b918262004699565b80610300810183101562000b9457600080fd5b6000806000806000806000806103e0898b0312156200474d57600080fd5b620047588962004699565b97506200476860208a01620046ae565b96506200477860408a01620046ae565b95506200478860608a01620046ae565b94506200479860808a01620046ae565b935060a0890135925060c08901359150620047b78a60e08b016200471c565b90509295985092959890939650565b6001600160a01b038116811462002d2d57600080fd5b6000806000806000806000806103e0898b031215620047fa57600080fd5b620048058962004699565b97506200481560208a01620046ae565b96506200482560408a01620046ae565b95506200483560608a01620046ae565b94506080890135935060a0890135925060c08901356200485581620047c6565b9150620047b78a60e08b016200471c565b6000602082840312156200487957600080fd5b813561ffff811681146200488c57600080fd5b9392505050565b600060208284031215620048a657600080fd5b5035919050565b60008060408385031215620048c157600080fd5b823591506020830135620048d581620047c6565b809150509250929050565b600060208284031215620048f357600080fd5b62000b9182620046ae565b600080600080600080600080610100898b0312156200491c57600080fd5b88356200492981620047c6565b97506200493960208a01620046ae565b96506200494960408a01620046ae565b955060608901356200495b81620047c6565b945060808901356200496d81620047c6565b935060a08901356200497f81620047c6565b925060c08901356200499181620047c6565b915060e0890135620049a381620047c6565b809150509295985092959890939650565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620049dc57600080fd5b81356001600160401b0380821115620049f957620049f9620049b4565b604051601f8301601f19908116603f0116810190828211818310171562004a245762004a24620049b4565b8160405283815286602085880101111562004a3e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121562004a7a57600080fd5b62004a858862004699565b965062004a9560208901620046ae565b9550604088013562004aa781620047c6565b9450606088013562004ab981620047c6565b9350608088013562004acb81620047c6565b925060a08801356001600160401b038082111562004ae857600080fd5b62004af68b838c01620049ca565b935060c08a013591508082111562004b0d57600080fd5b5062004b1c8a828b01620049ca565b91505092959891949750929550565b60008060008060008060c0878903121562004b4557600080fd5b62004b508762004699565b955062004b6060208801620046ae565b945062004b7060408801620046ae565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004bae57818101518382015260200162004b94565b50506000910152565b6000815180845262004bd181602086016020860162004b91565b601f01601f19169290920160200192915050565b60208152600062000b91602083018462004bb7565b6000806040838503121562004c0e57600080fd5b62004c1983620046ae565b946020939093013593505050565b6000806000806060858703121562004c3e57600080fd5b843562004c4b81620047c6565b935062004c5b6020860162004699565b925060408501356001600160401b038082111562004c7857600080fd5b818701915087601f83011262004c8d57600080fd5b81358181111562004c9d57600080fd5b88602082850101111562004cb057600080fd5b95989497505060200194505050565b60006020828403121562004cd257600080fd5b81356200488c81620047c6565b803560ff811681146200307657600080fd5b60008060008060008060c0878903121562004d0b57600080fd5b863562004d1881620047c6565b9550602087013562004d2a81620047c6565b945062004d3a60408801620046ae565b935062004d4a60608801620046ae565b92506080870135915062004d6160a0880162004cdf565b90509295509295509295565b60008060008060008060c0878903121562004d8757600080fd5b863562004d9481620047c6565b9550602087013562004da681620047c6565b945062004db660408801620046ae565b935062004dc66060880162004cdf565b92506080870135915060a08701356001600160401b0381111562004de957600080fd5b62004df789828a01620049ca565b9150509295509295509295565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004e3d5762004e3d62004e04565b5092915050565b8054600090600181811c908083168062004e5f57607f831692505b6020808410820362004e8157634e487b7160e01b600052602260045260246000fd5b8388526020880182801562004e9f576001811462004eb65762004ee3565b60ff198716825285151560051b8201975062004ee3565b60008981526020902060005b8781101562004edd5781548482015290860190840162004ec2565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c06040820181905260009062004f1e9083018762004e44565b828103606084015262004f32818762004e44565b9150508360808301526001600160401b03831660a0830152979650505050505050565b808202811582820484141762000b945762000b9462004e04565b600063ffffffff80831681810362004f8b5762004f8b62004e04565b6001019392505050565b6001600160a01b0384811682528316602082015260606040820181905260009062004fc39083018462004bb7565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190526000906200500e9083018562004bb7565b82810360a084015262005022818562004bb7565b9998505050505050505050565b6001600160401b0382811682821603908082111562004e3d5762004e3d62004e04565b60006001600160401b0380831681810362004f8b5762004f8b62004e04565b6000602082840312156200508457600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082620050b357620050b36200508b565b500490565b8082018082111562000b945762000b9462004e04565b634e487b7160e01b600052603260045260246000fd5b600060018201620050f957620050f962004e04565b5060010190565b6000826200511257620051126200508b565b500690565b8181038181111562000b945762000b9462004e04565b6000816200513f576200513f62004e04565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a08201819052600090620051d49083018462004bb7565b98975050505050505050565b60008251620051f481846020870162004b91565b9190910192915050565b61032081016103008085843782018360005b60018110156200523157815183526020928301929091019060010162005210565b5050509392505050565b6000602082840312156200524e57600080fd5b815180151581146200488c57600080fd5b60006001600160401b03808416806200527c576200527c6200508b565b9216919091049291505056fe60a06040526040516200092e3803806200092e833981016040819052620000269162000383565b828162000034828262000060565b50506001600160a01b038216608052620000576200005160805190565b620000c6565b50505062000481565b6200006b8262000138565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115620000b857620000b38282620001b8565b505050565b620000c262000235565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620001086000805160206200090e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001358162000257565b50565b806001600160a01b03163b6000036200017457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b031684604051620001d7919062000463565b600060405180830381855af49150503d806000811462000214576040519150601f19603f3d011682016040523d82523d6000602084013e62000219565b606091505b5090925090506200022c8583836200029a565b95945050505050565b3415620002555760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166200028357604051633173bdd160e11b8152600060048201526024016200016b565b806000805160206200090e83398151915262000197565b606082620002b357620002ad8262000300565b620002f9565b8151158015620002cb57506001600160a01b0384163b155b15620002f657604051639996b31560e01b81526001600160a01b03851660048201526024016200016b565b50805b9392505050565b805115620003115780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b03811681146200034257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200037a57818101518382015260200162000360565b50506000910152565b6000806000606084860312156200039957600080fd5b620003a4846200032a565b9250620003b4602085016200032a565b60408501519092506001600160401b0380821115620003d257600080fd5b818601915086601f830112620003e757600080fd5b815181811115620003fc57620003fc62000347565b604051601f8201601f19908116603f0116810190838211818310171562000427576200042762000347565b816040528281528960208487010111156200044157600080fd5b620004548360208301602088016200035d565b80955050505050509250925092565b60008251620004778184602087016200035d565b9190910192915050565b6080516104726200049c6000396000601001526104726000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100e5565b60008061008e36600481846102fd565b81019061009b919061033d565b915091506100a98282610109565b5050565b60006100e07f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610104573d6000f35b3d6000fd5b61011282610164565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561015c5761015782826101e0565b505050565b6100a9610256565b806001600160a01b03163b60000361019f57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101fd919061040d565b600060405180830381855af49150503d8060008114610238576040519150601f19603f3d011682016040523d82523d6000602084013e61023d565b606091505b509150915061024d858383610275565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b60608261028a57610285826102d4565b6102cd565b81511580156102a157506001600160a01b0384163b155b156102ca57604051639996b31560e01b81526001600160a01b0385166004820152602401610196565b50805b9392505050565b8051156102e45780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6000808585111561030d57600080fd5b8386111561031a57600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035057600080fd5b82356001600160a01b038116811461036757600080fd5b9150602083013567ffffffffffffffff8082111561038457600080fd5b818501915085601f83011261039857600080fd5b8135818111156103aa576103aa610327565b604051601f8201601f19908116603f011681019083821181831017156103d2576103d2610327565b816040528281528860208487010111156103eb57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000825160005b8181101561042e5760208186018101518583015201610414565b50600092019182525091905056fea2646970667358221220d51c6fc430c553d1da2391464fd71dbfa43dc91a9531c4d842a3289bb581301664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220940fd7fb8f2b0b558c758ec81586b1381069bcd4c57c3af55969d22a9a6d9c3b64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonRollupManagerMock.json b/compiled-contracts/paris/PolygonRollupManagerMock.json index 9bf4d2791..3decd0c27 100644 --- a/compiled-contracts/paris/PolygonRollupManagerMock.json +++ b/compiled-contracts/paris/PolygonRollupManagerMock.json @@ -1982,8 +1982,8 @@ "type": "function" } ], - "bytecode": "0x60e06040523480156200001157600080fd5b50604051620061a5380380620061a583398101604081905262000034916200006b565b6001600160a01b0392831660805290821660c0521660a052620000bf565b6001600160a01b03811681146200006857600080fd5b50565b6000806000606084860312156200008157600080fd5b83516200008e8162000052565b6020850151909350620000a18162000052565b6040850151909250620000b48162000052565b809150509250925092565b60805160a05160c05161607e62000127600039600081816109bc015281816122ba015261390a01526000818161078201528181612e090152613c0401526000818161091601528181610eca0152818161107a01528181611f9a0152613af3015261607e6000f3fe60806040523480156200001157600080fd5b5060043610620002aa5760003560e01c8063066ec01214620002af578063080b311114620002db5780630a0d9fbe14620003035780630e36f582146200031e57806311f6b287146200033757806312b86e19146200034e5780631489ed10146200036557806315064c96146200037c5780631608859c146200038a5780631796a1ae14620003a15780631816b7e514620003c85780632072f6c514620003df578063248a9ca314620003e957806325280169146200040f5780632f2ff15d14620004c457806336568abe14620004db578063394218e914620004f2578063477fa27014620005095780634d4d3338146200051257806355a71ee0146200052957806360469169146200056d57806365c0504d14620005775780637222020f1462000626578063727885e9146200063d5780637975fcfe14620006545780637fb6e76a146200067a578063841b24d714620006a357806387c20c0114620006be5780638bd4f07114620006d55780638f698ec514620006ec57806391d14854146200070357806399f5634e146200071a5780639a908e7314620007245780639c9f3dfe146200073b578063a066215c1462000752578063a217fddf1462000769578063a2967d991462000772578063a3c573eb146200077c578063afd23cbe14620007b3578063b99d0ad714620007dd578063c1acbc3414620008b5578063c4c928c214620008d0578063ceee281d14620008e7578063d02103ca1462000910578063d5073f6f1462000938578063d547741f146200094f578063d939b3151462000966578063dbc16976146200097a578063dde0ff771462000984578063e0bfd3d2146200099f578063e46761c414620009b6578063f34eb8eb14620009de578063f4e9267514620009f5578063f9c4c2ae1462000a06575b600080fd5b608454620002c3906001600160401b031681565b604051620002d29190620047b2565b60405180910390f35b620002f2620002ec366004620047f3565b62000b1d565b6040519015158152602001620002d2565b608554620002c390600160401b90046001600160401b031681565b620003356200032f36600462004841565b62000b47565b005b620002c362000348366004620048cc565b62000dfe565b620003356200035f366004620048fd565b62000e1e565b620003356200037636600462004994565b62000fce565b606f54620002f29060ff1681565b620003356200039b366004620047f3565b6200115e565b607e54620003b29063ffffffff1681565b60405163ffffffff9091168152602001620002d2565b62000335620003d936600462004a1e565b620011f3565b620003356200129f565b62000400620003fa36600462004a4b565b62001335565b604051908152602001620002d2565b6200049062000420366004620047f3565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002d2565b62000335620004d536600462004a65565b6200134a565b62000335620004ec36600462004a65565b6200136c565b620003356200050336600462004a98565b620013a6565b60865462000400565b620003356200052336600462004ab6565b62001455565b620004006200053a366004620047f3565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620004006200188b565b620005dc62000588366004620048cc565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002d2565b6200033562000637366004620048cc565b620018a3565b620003356200064e36600462004c2b565b6200198e565b6200066b6200066536600462004cf8565b62001df6565b604051620002d2919062004db2565b620003b26200068b36600462004a98565b60836020526000908152604090205463ffffffff1681565b608454620002c390600160c01b90046001600160401b031681565b62000335620006cf36600462004994565b62001e29565b62000335620006e6366004620048fd565b6200214d565b62000335620006fd36600462004dc7565b62002203565b620002f26200071436600462004a65565b6200228a565b62000400620022b5565b620002c36200073536600462004e77565b620023a1565b620003356200074c36600462004a98565b6200256e565b620003356200076336600462004a98565b62002611565b62000400600081565b62000400620026b0565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b604051620002d2919062004ea4565b608554620007c990600160801b900461ffff1681565b60405161ffff9091168152602001620002d2565b62000873620007ee366004620047f3565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002d2919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002c390600160801b90046001600160401b031681565b62000335620008e136600462004eb8565b62002a72565b620003b2620008f836600462004f50565b60826020526000908152604090205463ffffffff1681565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b620003356200094936600462004a4b565b62002d3f565b620003356200096036600462004a65565b62002dca565b608554620002c3906001600160401b031681565b6200033562002dec565b608454620002c390600160401b90046001600160401b031681565b62000335620009b036600462004f82565b62002e89565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b62000335620009ef36600462004ffe565b62002f11565b608054620003b29063ffffffff1681565b62000a9d62000a17366004620048cc565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002d2565b63ffffffff8216600090815260816020526040812062000b3e9083620030fc565b90505b92915050565b600054600290610100900460ff1615801562000b6a575060005460ff8083169116105b62000b925760405162461bcd60e51b815260040162000b899062005095565b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c1362003141565b62000c2e6000805160206200602983398151915288620031ae565b62000c3b600084620031ae565b62000c5660008051602062005f0983398151915284620031ae565b62000c7160008051602062005f8983398151915284620031ae565b62000c8c60008051602062005ea983398151915284620031ae565b62000ca760008051602062005ee983398151915285620031ae565b62000cc26000805160206200600983398151915285620031ae565b62000cdd60008051602062005f2983398151915285620031ae565b62000cf860008051602062005fa983398151915285620031ae565b62000d226000805160206200602983398151915260008051602062005e89833981519152620031ba565b62000d3d60008051602062005e8983398151915285620031ae565b62000d5860008051602062005ec983398151915285620031ae565b62000d8260008051602062005fe983398151915260008051602062005fc9833981519152620031ba565b62000d9d60008051602062005fe983398151915283620031ae565b62000db860008051602062005fc983398151915283620031ae565b62000dc5600033620031ae565b6000805461ff001916905560405160ff8216815260008051602062005f698339815191529060200160405180910390a150505050505050565b63ffffffff8116600090815260816020526040812062000b41906200320f565b6000805160206200602983398151915262000e398162003280565b63ffffffff8916600090815260816020526040902062000e60818a8a8a8a8a8a8a6200328c565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000ec8576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000f01620026b0565b6040518263ffffffff1660e01b815260040162000f2091815260200190565b600060405180830381600087803b15801562000f3b57600080fd5b505af115801562000f50573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b6000805160206200602983398151915262000fe98162003280565b63ffffffff8916600090815260816020526040902062001010818a8a8a8a8a8a8a62003614565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562001078576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620010b1620026b0565b6040518263ffffffff1660e01b8152600401620010d091815260200190565b600060405180830381600087803b158015620010eb57600080fd5b505af115801562001100573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a6040516200114a93929190620050e3565b60405180910390a350505050505050505050565b63ffffffff821660009081526081602052604090206200118e60008051602062006029833981519152336200228a565b620011e257606f5460ff1615620011b857604051630bc011ff60e21b815260040160405180910390fd5b620011c48183620030fc565b620011e257604051630674f25160e11b815260040160405180910390fd5b620011ee818362003a10565b505050565b60008051602062005fa98339815191526200120e8162003280565b6103e88261ffff1610806200122857506103ff8261ffff16115b156200124757604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620012ba60008051602062005fe9833981519152336200228a565b6200132957608454600160801b90046001600160401b031615806200130a57506084544290620012ff9062093a8090600160801b90046001600160401b03166200511a565b6001600160401b0316115b15620013295760405163692baaad60e11b815260040160405180910390fd5b6200133362003c02565b565b60009081526034602052604090206001015490565b620013558262001335565b620013608162003280565b620011ee838362003c81565b6001600160a01b03811633146200139657604051630b4ad1cd60e31b815260040160405180910390fd5b620013a2828262003ced565b5050565b60008051602062005fa9833981519152620013c18162003280565b606f5460ff1662001403576084546001600160401b03600160c01b909104811690831610620014035760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19062001293908490620047b2565b600054600290610100900460ff1615801562001478575060005460ff8083169116105b620014975760405162461bcd60e51b815260040162000b899062005095565b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200151862003141565b62001533600080516020620060298339815191528a620031ae565b62001540600086620031ae565b6200155b60008051602062005f0983398151915286620031ae565b6200157660008051602062005f8983398151915286620031ae565b6200159160008051602062005ea983398151915286620031ae565b620015ac60008051602062005ee983398151915287620031ae565b620015c76000805160206200600983398151915287620031ae565b620015e260008051602062005f2983398151915287620031ae565b620015fd60008051602062005fa983398151915287620031ae565b620016276000805160206200602983398151915260008051602062005e89833981519152620031ba565b6200164260008051602062005e8983398151915287620031ae565b6200165d60008051602062005ec983398151915287620031ae565b6200168760008051602062005fe983398151915260008051602062005fc9833981519152620031ba565b620016a260008051602062005fe983398151915285620031ae565b620016bd60008051602062005fc983398151915285620031ae565b6000620016d28484600561044d600062003d57565b6073546074549192506001600160401b03600160401b909104811691168082146200171057604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b0381811660008181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620018119695831695600160581b9091049092169360769360779391929190911690600401620051f0565b600060405180830381600087803b1580156200182c57600080fd5b505af115801562001841573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff8516815260008051602062005f6983398151915293506020019150620018789050565b60405180910390a1505050505050505050565b600060865460646200189e919062005256565b905090565b60008051602062005ee9833981519152620018be8162003280565b63ffffffff82161580620018dd5750607e5463ffffffff908116908316115b15620018fc57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200194357604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b60008051602062006009833981519152620019a98162003280565b63ffffffff88161580620019c85750607e5463ffffffff908116908916115b15620019e757604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff161515900362001a2e57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001a6c576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062001a879063ffffffff1662005270565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001ad590620047a4565b62001ae39392919062005296565b604051809103906000f08015801562001b00573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001d74949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001db4908d908d9088908e908e908e90600401620052cd565b600060405180830381600087803b15801562001dcf57600080fd5b505af115801562001de4573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001e1e90878787878762003f7c565b979650505050505050565b606f5460ff161562001e4e57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001e9d92600160c01b9004811691166200511a565b6001600160401b0316111562001ec657604051638a0704d360e01b815260040160405180910390fd5b6103e862001ed5888862005330565b6001600160401b0316111562001efe57604051635acfba9d60e11b815260040160405180910390fd5b62001f10818989898989898962003614565b62001f1c8187620040b7565b6085546001600160401b03166000036200202a57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001f98576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001fd1620026b0565b6040518263ffffffff1660e01b815260040162001ff091815260200190565b600060405180830381600087803b1580156200200b57600080fd5b505af115801562002020573d6000803e3d6000fd5b50505050620020f4565b6200203581620042b4565b600681018054600160801b90046001600160401b0316906010620020598362005353565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b48887896040516200213a93929190620050e3565b60405180910390a3505050505050505050565b606f5460ff16156200217257604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602052604090206200219981898989898989896200328c565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620021f862003c02565b505050505050505050565b80516080805463ffffffff191663ffffffff90921691909117905560005b8151811015620013a2578181815181106200224057620022406200537a565b6020026020010151608160008360016200225b919062005390565b63ffffffff168152602081019190915260400160002060050155806200228181620053a6565b91505062002221565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162002306919062004ea4565b602060405180830381865afa15801562002324573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200234a9190620053c2565b60845490915060009062002371906001600160401b03600160401b82048116911662005330565b6001600160401b03169050806000036200238e5760009250505090565b6200239a8183620053f2565b9250505090565b606f5460009060ff1615620023c957604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362002401576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200242c57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff8116600090815260816020526040812060848054919287926200245f9084906001600160401b03166200511a565b82546101009290920a6001600160401b03818102199093169183160217909155600683015416905060006200249587836200511a565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200252483620042b4565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a25826040516200255c9190620047b2565b60405180910390a29695505050505050565b60008051602062005fa9833981519152620025898162003280565b606f5460ff16620025c4576085546001600160401b0390811690831610620025c45760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759062001293908490620047b2565b60008051602062005fa98339815191526200262c8162003280565b62015180826001600160401b031611156200265a57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289062001293908490620047b2565b60805460009063ffffffff16808203620026cc57506000919050565b6000816001600160401b03811115620026e957620026e962004b6c565b60405190808252806020026020018201604052801562002713578160200160208202803683370190505b50905060005b828110156200278657608160006200273383600162005390565b63ffffffff1663ffffffff168152602001908152602001600020600501548282815181106200276657620027666200537a565b6020908102919091010152806200277d81620053a6565b91505062002719565b50600060205b83600114620029ca576000620027a460028662005409565b620027b1600287620053f2565b620027bd919062005390565b90506000816001600160401b03811115620027dc57620027dc62004b6c565b60405190808252806020026020018201604052801562002806578160200160208202803683370190505b50905060005b828110156200297e576200282260018462005420565b811480156200283d57506200283960028862005409565b6001145b15620028bd57856200285182600262005256565b815181106200286457620028646200537a565b6020026020010151856040516020016200288092919062005436565b60405160208183030381529060405280519060200120828281518110620028ab57620028ab6200537a565b60200260200101818152505062002969565b85620028cb82600262005256565b81518110620028de57620028de6200537a565b602002602001015186826002620028f6919062005256565b6200290390600162005390565b815181106200291657620029166200537a565b60200260200101516040516020016200293192919062005436565b604051602081830303815290604052805190602001208282815181106200295c576200295c6200537a565b6020026020010181815250505b806200297581620053a6565b9150506200280c565b5080945081955083846040516020016200299a92919062005436565b6040516020818303038152906040528051906020012093508280620029bf9062005444565b93505050506200278c565b600083600081518110620029e257620029e26200537a565b6020026020010151905060005b8281101562002a6857818460405160200162002a0d92919062005436565b604051602081830303815290604052805190602001209150838460405160200162002a3a92919062005436565b604051602081830303815290604052805190602001209350808062002a5f90620053a6565b915050620029ef565b5095945050505050565b60008051602062005ea983398151915262002a8d8162003280565b63ffffffff8416158062002aac5750607e5463ffffffff908116908516115b1562002acb57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002b0c576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002b5b57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002ba257604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002be057604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002c608462000dfe565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002cb59216908b908b906004016200545e565b600060405180830381600087803b15801562002cd057600080fd5b505af115801562002ce5573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005ec983398151915262002d5a8162003280565b683635c9adc5dea0000082118062002d755750633b9aca0082105b1562002d9457604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001293565b62002dd58262001335565b62002de08162003280565b620011ee838362003ced565b60008051602062005f2983398151915262002e078162003280565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002e6357600080fd5b505af115801562002e78573d6000803e3d6000fd5b5050505062002e866200437f565b50565b60008051602062005f8983398151915262002ea48162003280565b6001600160401b03841660009081526083602052604090205463ffffffff161562002ee2576040516337c8fe0960e11b815260040160405180910390fd5b600062002ef3888888888762003d57565b60008080526002909101602052604090209390935550505050505050565b60008051602062005f0983398151915262002f2c8162003280565b607e805460009190829062002f479063ffffffff1662005270565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620030ea969594939291906200549e565b60405180910390a25050505050505050565b6085546001600160401b038281166000908152600485016020526040812054909242926200312f9291811691166200511a565b6001600160401b031611159392505050565b600054610100900460ff16620013335760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b89565b620013a2828262003c81565b6000620031c78362001335565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6006810154600090600160801b90046001600160401b03161562003263575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002e868133620043d8565b60078801546000906001600160401b039081169087161015620032c25760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620033635760068901546001600160401b03600160801b909104811690891611156200330c5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200335c57604051632bd2e3e760e01b815260040160405180910390fd5b50620033d8565b506001600160401b0385166000908152600289016020526040902054806200339e576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620033d857604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620034115750876001600160401b0316876001600160401b031611155b8062003435575060068901546001600160401b03600160c01b909104811690881611155b15620034545760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b90048116908616146200349b576040516332a2a77f60e01b815260040160405180910390fd5b6000620034ad8a888888868962003f7c565b9050600060008051602062005f49833981519152600283604051620034d39190620054eb565b602060405180830381855afa158015620034f1573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620035169190620053c2565b62003522919062005409565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620035669188919060040162005509565b602060405180830381865afa15801562003584573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620035aa919062005546565b620035c8576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620036075760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620036228a6200320f565b60078b01549091506001600160401b039081169089161015620036585760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620036fb5760068a01546001600160401b03600160801b9091048116908a161115620036a25760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620036f457604051632bd2e3e760e01b815260040160405180910390fd5b506200376b565b6001600160401b038816600090815260028b01602052604090205491508162003737576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200376b57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b0316116200379e5760405163b9b18f5760e01b815260040160405180910390fd5b6000620037b08b8a8a8a878b62003f7c565b9050600060008051602062005f49833981519152600283604051620037d69190620054eb565b602060405180830381855afa158015620037f4573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620038199190620053c2565b62003825919062005409565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620038699189919060040162005509565b602060405180830381865afa15801562003887573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620038ad919062005546565b620038cb576040516309bde33960e01b815260040160405180910390fd5b6000620038d9848b62005330565b90506200393287826001600160401b0316620038f4620022b5565b62003900919062005256565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004402565b80608460088282829054906101000a90046001600160401b03166200395891906200511a565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b158015620039e857600080fd5b505af1158015620039fd573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003a4f575060068201546001600160401b03600160801b9091048116908216115b1562003a6e5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003b2a620026b0565b6040518263ffffffff1660e01b815260040162003b4991815260200190565b600060405180830381600087803b15801562003b6457600080fd5b505af115801562003b79573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003c5e57600080fd5b505af115801562003c73573d6000803e3d6000fd5b505050506200133362004456565b62003c8d82826200228a565b620013a25760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003cf982826200228a565b15620013a25760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b608080546000918291829062003d739063ffffffff1662005270565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000866001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508060826000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150868260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550858260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550838260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003f6a94939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003fb2575081155b1562003fd15760405163340c614f60e11b815260040160405180910390fd5b8062003ff0576040516366385b5160e01b815260040160405180910390fd5b62003ffb84620044b3565b62004019576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b6000620040c4836200320f565b905081600080620040d6848462005330565b6085546001600160401b039182169250600091620040fd91600160401b9004164262005420565b90505b846001600160401b0316846001600160401b03161462004187576001600160401b0380851660009081526003890160205260409020600181015490911682101562004162576001810154600160401b90046001600160401b0316945062004180565b6200416e868662005330565b6001600160401b031693505062004187565b5062004100565b600062004195848462005420565b905083811015620041f357808403600c8111620041b35780620041b6565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620041e857620041e8620053dc565b04608655506200426b565b838103600c811162004206578062004209565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a76400000281620042435762004243620053dc565b04905080608654670de0b6b3a76400000281620042645762004264620053dc565b0460865550505b683635c9adc5dea0000060865411156200429257683635c9adc5dea00000608655620042aa565b633b9aca006086541015620042aa57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002e86576006810154600090620042ff90600160c01b90046001600160401b031660016200511a565b90506200430d8282620030fc565b15620013a25760068201546000906002906200433b908490600160801b90046001600160401b031662005330565b6200434791906200556a565b6200435390836200511a565b9050620043618382620030fc565b156200437357620011ee838262003a10565b620011ee838362003a10565b606f5460ff16620043a357604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b620043e482826200228a565b620013a257604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620011ee90849062004539565b606f5460ff16156200447b57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b038316108015620044ea575067ffffffff00000001604083901c6001600160401b0316105b80156200450b575067ffffffff00000001608083901c6001600160401b0316105b801562004523575067ffffffff0000000160c083901c105b156200453157506001919050565b506000919050565b600062004590826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620046129092919063ffffffff16565b805190915015620011ee5780806020019051810190620045b1919062005546565b620011ee5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b89565b60606200462384846000856200462b565b949350505050565b6060824710156200468e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b89565b600080866001600160a01b03168587604051620046ac9190620054eb565b60006040518083038185875af1925050503d8060008114620046eb576040519150601f19603f3d011682016040523d82523d6000602084013e620046f0565b606091505b509150915062001e1e87838387606083156200477157825160000362004769576001600160a01b0385163b620047695760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b89565b508162004623565b620046238383815115620047885781518083602001fd5b8060405162461bcd60e51b815260040162000b89919062004db2565b6108f5806200559483390190565b6001600160401b0391909116815260200190565b803563ffffffff811681146200327b57600080fd5b80356001600160401b03811681146200327b57600080fd5b600080604083850312156200480757600080fd5b6200481283620047c6565b91506200482260208401620047db565b90509250929050565b6001600160a01b038116811462002e8657600080fd5b60008060008060008060c087890312156200485b57600080fd5b863562004868816200482b565b95506200487860208801620047db565b94506200488860408801620047db565b935060608701356200489a816200482b565b92506080870135620048ac816200482b565b915060a0870135620048be816200482b565b809150509295509295509295565b600060208284031215620048df57600080fd5b62000b3e82620047c6565b80610300810183101562000b4157600080fd5b6000806000806000806000806103e0898b0312156200491b57600080fd5b6200492689620047c6565b97506200493660208a01620047db565b96506200494660408a01620047db565b95506200495660608a01620047db565b94506200496660808a01620047db565b935060a0890135925060c08901359150620049858a60e08b01620048ea565b90509295985092959890939650565b6000806000806000806000806103e0898b031215620049b257600080fd5b620049bd89620047c6565b9750620049cd60208a01620047db565b9650620049dd60408a01620047db565b9550620049ed60608a01620047db565b94506080890135935060a0890135925060c089013562004a0d816200482b565b9150620049858a60e08b01620048ea565b60006020828403121562004a3157600080fd5b813561ffff8116811462004a4457600080fd5b9392505050565b60006020828403121562004a5e57600080fd5b5035919050565b6000806040838503121562004a7957600080fd5b82359150602083013562004a8d816200482b565b809150509250929050565b60006020828403121562004aab57600080fd5b62000b3e82620047db565b600080600080600080600080610100898b03121562004ad457600080fd5b883562004ae1816200482b565b975062004af160208a01620047db565b965062004b0160408a01620047db565b9550606089013562004b13816200482b565b9450608089013562004b25816200482b565b935060a089013562004b37816200482b565b925060c089013562004b49816200482b565b915060e089013562004b5b816200482b565b809150509295985092959890939650565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562004bad5762004bad62004b6c565b604052919050565b600082601f83011262004bc757600080fd5b81356001600160401b0381111562004be35762004be362004b6c565b62004bf8601f8201601f191660200162004b82565b81815284602083860101111562004c0e57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600080600060e0888a03121562004c4757600080fd5b62004c5288620047c6565b965062004c6260208901620047db565b9550604088013562004c74816200482b565b9450606088013562004c86816200482b565b9350608088013562004c98816200482b565b925060a08801356001600160401b038082111562004cb557600080fd5b62004cc38b838c0162004bb5565b935060c08a013591508082111562004cda57600080fd5b5062004ce98a828b0162004bb5565b91505092959891949750929550565b60008060008060008060c0878903121562004d1257600080fd5b62004d1d87620047c6565b955062004d2d60208801620047db565b945062004d3d60408801620047db565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004d7b57818101518382015260200162004d61565b50506000910152565b6000815180845262004d9e81602086016020860162004d5e565b601f01601f19169290920160200192915050565b60208152600062000b3e602083018462004d84565b6000602080838503121562004ddb57600080fd5b82356001600160401b038082111562004df357600080fd5b818501915085601f83011262004e0857600080fd5b81358181111562004e1d5762004e1d62004b6c565b8060051b915062004e3084830162004b82565b818152918301840191848101908884111562004e4b57600080fd5b938501935b8385101562004e6b5784358252938501939085019062004e50565b98975050505050505050565b6000806040838503121562004e8b57600080fd5b62004e9683620047db565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000806000806060858703121562004ecf57600080fd5b843562004edc816200482b565b935062004eec60208601620047c6565b925060408501356001600160401b038082111562004f0957600080fd5b818701915087601f83011262004f1e57600080fd5b81358181111562004f2e57600080fd5b88602082850101111562004f4157600080fd5b95989497505060200194505050565b60006020828403121562004f6357600080fd5b813562004a44816200482b565b803560ff811681146200327b57600080fd5b60008060008060008060c0878903121562004f9c57600080fd5b863562004fa9816200482b565b9550602087013562004fbb816200482b565b945062004fcb60408801620047db565b935062004fdb60608801620047db565b92506080870135915062004ff260a0880162004f70565b90509295509295509295565b60008060008060008060c087890312156200501857600080fd5b863562005025816200482b565b9550602087013562005037816200482b565b94506200504760408801620047db565b9350620050576060880162004f70565b92506080870135915060a08701356001600160401b038111156200507a57600080fd5b6200508889828a0162004bb5565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b038181168382160190808211156200513d576200513d62005104565b5092915050565b8054600090600181811c90808316806200515f57607f831692505b602080841082036200518157634e487b7160e01b600052602260045260246000fd5b838852602088018280156200519f5760018114620051b657620051e3565b60ff198716825285151560051b82019750620051e3565b60008981526020902060005b87811015620051dd57815484820152908601908401620051c2565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c0604082018190526000906200521e9083018762005144565b828103606084015262005232818762005144565b608084019590955250506001600160401b039190911660a090910152949350505050565b808202811582820484141762000b415762000b4162005104565b600063ffffffff8083168181036200528c576200528c62005104565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620052c49083018462004d84565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190526000906200530f9083018562004d84565b82810360a084015262005323818562004d84565b9998505050505050505050565b6001600160401b038281168282160390808211156200513d576200513d62005104565b60006001600160401b038281166002600160401b031981016200528c576200528c62005104565b634e487b7160e01b600052603260045260246000fd5b8082018082111562000b415762000b4162005104565b600060018201620053bb57620053bb62005104565b5060010190565b600060208284031215620053d557600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082620054045762005404620053dc565b500490565b6000826200541b576200541b620053dc565b500690565b8181038181111562000b415762000b4162005104565b918252602082015260400190565b60008162005456576200545662005104565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a0820181905260009062004e6b9083018462004d84565b60008251620054ff81846020870162004d5e565b9190910192915050565b61032081016103008085843782018360005b60018110156200553c5781518352602092830192909101906001016200551b565b5050509392505050565b6000602082840312156200555957600080fd5b8151801515811462004a4457600080fd5b60006001600160401b0383811680620055875762005587620053dc565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220a19e7a72432195d9a35c7ce8fa5f1284415aac66bb1ad08a4c2e1c252fd8690864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a26469706673582212205852eeda437f498b0bdbc880c7dfb3fe1d0947053ae208222c7088b67edf595964736f6c63430008140033", - "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620002aa5760003560e01c8063066ec01214620002af578063080b311114620002db5780630a0d9fbe14620003035780630e36f582146200031e57806311f6b287146200033757806312b86e19146200034e5780631489ed10146200036557806315064c96146200037c5780631608859c146200038a5780631796a1ae14620003a15780631816b7e514620003c85780632072f6c514620003df578063248a9ca314620003e957806325280169146200040f5780632f2ff15d14620004c457806336568abe14620004db578063394218e914620004f2578063477fa27014620005095780634d4d3338146200051257806355a71ee0146200052957806360469169146200056d57806365c0504d14620005775780637222020f1462000626578063727885e9146200063d5780637975fcfe14620006545780637fb6e76a146200067a578063841b24d714620006a357806387c20c0114620006be5780638bd4f07114620006d55780638f698ec514620006ec57806391d14854146200070357806399f5634e146200071a5780639a908e7314620007245780639c9f3dfe146200073b578063a066215c1462000752578063a217fddf1462000769578063a2967d991462000772578063a3c573eb146200077c578063afd23cbe14620007b3578063b99d0ad714620007dd578063c1acbc3414620008b5578063c4c928c214620008d0578063ceee281d14620008e7578063d02103ca1462000910578063d5073f6f1462000938578063d547741f146200094f578063d939b3151462000966578063dbc16976146200097a578063dde0ff771462000984578063e0bfd3d2146200099f578063e46761c414620009b6578063f34eb8eb14620009de578063f4e9267514620009f5578063f9c4c2ae1462000a06575b600080fd5b608454620002c3906001600160401b031681565b604051620002d29190620047b2565b60405180910390f35b620002f2620002ec366004620047f3565b62000b1d565b6040519015158152602001620002d2565b608554620002c390600160401b90046001600160401b031681565b620003356200032f36600462004841565b62000b47565b005b620002c362000348366004620048cc565b62000dfe565b620003356200035f366004620048fd565b62000e1e565b620003356200037636600462004994565b62000fce565b606f54620002f29060ff1681565b620003356200039b366004620047f3565b6200115e565b607e54620003b29063ffffffff1681565b60405163ffffffff9091168152602001620002d2565b62000335620003d936600462004a1e565b620011f3565b620003356200129f565b62000400620003fa36600462004a4b565b62001335565b604051908152602001620002d2565b6200049062000420366004620047f3565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002d2565b62000335620004d536600462004a65565b6200134a565b62000335620004ec36600462004a65565b6200136c565b620003356200050336600462004a98565b620013a6565b60865462000400565b620003356200052336600462004ab6565b62001455565b620004006200053a366004620047f3565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620004006200188b565b620005dc62000588366004620048cc565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002d2565b6200033562000637366004620048cc565b620018a3565b620003356200064e36600462004c2b565b6200198e565b6200066b6200066536600462004cf8565b62001df6565b604051620002d2919062004db2565b620003b26200068b36600462004a98565b60836020526000908152604090205463ffffffff1681565b608454620002c390600160c01b90046001600160401b031681565b62000335620006cf36600462004994565b62001e29565b62000335620006e6366004620048fd565b6200214d565b62000335620006fd36600462004dc7565b62002203565b620002f26200071436600462004a65565b6200228a565b62000400620022b5565b620002c36200073536600462004e77565b620023a1565b620003356200074c36600462004a98565b6200256e565b620003356200076336600462004a98565b62002611565b62000400600081565b62000400620026b0565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b604051620002d2919062004ea4565b608554620007c990600160801b900461ffff1681565b60405161ffff9091168152602001620002d2565b62000873620007ee366004620047f3565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002d2919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002c390600160801b90046001600160401b031681565b62000335620008e136600462004eb8565b62002a72565b620003b2620008f836600462004f50565b60826020526000908152604090205463ffffffff1681565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b620003356200094936600462004a4b565b62002d3f565b620003356200096036600462004a65565b62002dca565b608554620002c3906001600160401b031681565b6200033562002dec565b608454620002c390600160401b90046001600160401b031681565b62000335620009b036600462004f82565b62002e89565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b62000335620009ef36600462004ffe565b62002f11565b608054620003b29063ffffffff1681565b62000a9d62000a17366004620048cc565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002d2565b63ffffffff8216600090815260816020526040812062000b3e9083620030fc565b90505b92915050565b600054600290610100900460ff1615801562000b6a575060005460ff8083169116105b62000b925760405162461bcd60e51b815260040162000b899062005095565b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c1362003141565b62000c2e6000805160206200602983398151915288620031ae565b62000c3b600084620031ae565b62000c5660008051602062005f0983398151915284620031ae565b62000c7160008051602062005f8983398151915284620031ae565b62000c8c60008051602062005ea983398151915284620031ae565b62000ca760008051602062005ee983398151915285620031ae565b62000cc26000805160206200600983398151915285620031ae565b62000cdd60008051602062005f2983398151915285620031ae565b62000cf860008051602062005fa983398151915285620031ae565b62000d226000805160206200602983398151915260008051602062005e89833981519152620031ba565b62000d3d60008051602062005e8983398151915285620031ae565b62000d5860008051602062005ec983398151915285620031ae565b62000d8260008051602062005fe983398151915260008051602062005fc9833981519152620031ba565b62000d9d60008051602062005fe983398151915283620031ae565b62000db860008051602062005fc983398151915283620031ae565b62000dc5600033620031ae565b6000805461ff001916905560405160ff8216815260008051602062005f698339815191529060200160405180910390a150505050505050565b63ffffffff8116600090815260816020526040812062000b41906200320f565b6000805160206200602983398151915262000e398162003280565b63ffffffff8916600090815260816020526040902062000e60818a8a8a8a8a8a8a6200328c565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000ec8576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000f01620026b0565b6040518263ffffffff1660e01b815260040162000f2091815260200190565b600060405180830381600087803b15801562000f3b57600080fd5b505af115801562000f50573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b6000805160206200602983398151915262000fe98162003280565b63ffffffff8916600090815260816020526040902062001010818a8a8a8a8a8a8a62003614565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562001078576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620010b1620026b0565b6040518263ffffffff1660e01b8152600401620010d091815260200190565b600060405180830381600087803b158015620010eb57600080fd5b505af115801562001100573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a6040516200114a93929190620050e3565b60405180910390a350505050505050505050565b63ffffffff821660009081526081602052604090206200118e60008051602062006029833981519152336200228a565b620011e257606f5460ff1615620011b857604051630bc011ff60e21b815260040160405180910390fd5b620011c48183620030fc565b620011e257604051630674f25160e11b815260040160405180910390fd5b620011ee818362003a10565b505050565b60008051602062005fa98339815191526200120e8162003280565b6103e88261ffff1610806200122857506103ff8261ffff16115b156200124757604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620012ba60008051602062005fe9833981519152336200228a565b6200132957608454600160801b90046001600160401b031615806200130a57506084544290620012ff9062093a8090600160801b90046001600160401b03166200511a565b6001600160401b0316115b15620013295760405163692baaad60e11b815260040160405180910390fd5b6200133362003c02565b565b60009081526034602052604090206001015490565b620013558262001335565b620013608162003280565b620011ee838362003c81565b6001600160a01b03811633146200139657604051630b4ad1cd60e31b815260040160405180910390fd5b620013a2828262003ced565b5050565b60008051602062005fa9833981519152620013c18162003280565b606f5460ff1662001403576084546001600160401b03600160c01b909104811690831610620014035760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19062001293908490620047b2565b600054600290610100900460ff1615801562001478575060005460ff8083169116105b620014975760405162461bcd60e51b815260040162000b899062005095565b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200151862003141565b62001533600080516020620060298339815191528a620031ae565b62001540600086620031ae565b6200155b60008051602062005f0983398151915286620031ae565b6200157660008051602062005f8983398151915286620031ae565b6200159160008051602062005ea983398151915286620031ae565b620015ac60008051602062005ee983398151915287620031ae565b620015c76000805160206200600983398151915287620031ae565b620015e260008051602062005f2983398151915287620031ae565b620015fd60008051602062005fa983398151915287620031ae565b620016276000805160206200602983398151915260008051602062005e89833981519152620031ba565b6200164260008051602062005e8983398151915287620031ae565b6200165d60008051602062005ec983398151915287620031ae565b6200168760008051602062005fe983398151915260008051602062005fc9833981519152620031ba565b620016a260008051602062005fe983398151915285620031ae565b620016bd60008051602062005fc983398151915285620031ae565b6000620016d28484600561044d600062003d57565b6073546074549192506001600160401b03600160401b909104811691168082146200171057604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b0381811660008181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620018119695831695600160581b9091049092169360769360779391929190911690600401620051f0565b600060405180830381600087803b1580156200182c57600080fd5b505af115801562001841573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff8516815260008051602062005f6983398151915293506020019150620018789050565b60405180910390a1505050505050505050565b600060865460646200189e919062005256565b905090565b60008051602062005ee9833981519152620018be8162003280565b63ffffffff82161580620018dd5750607e5463ffffffff908116908316115b15620018fc57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200194357604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b60008051602062006009833981519152620019a98162003280565b63ffffffff88161580620019c85750607e5463ffffffff908116908916115b15620019e757604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff161515900362001a2e57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001a6c576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062001a879063ffffffff1662005270565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001ad590620047a4565b62001ae39392919062005296565b604051809103906000f08015801562001b00573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001d74949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001db4908d908d9088908e908e908e90600401620052cd565b600060405180830381600087803b15801562001dcf57600080fd5b505af115801562001de4573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001e1e90878787878762003f7c565b979650505050505050565b606f5460ff161562001e4e57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001e9d92600160c01b9004811691166200511a565b6001600160401b0316111562001ec657604051638a0704d360e01b815260040160405180910390fd5b6103e862001ed5888862005330565b6001600160401b0316111562001efe57604051635acfba9d60e11b815260040160405180910390fd5b62001f10818989898989898962003614565b62001f1c8187620040b7565b6085546001600160401b03166000036200202a57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001f98576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001fd1620026b0565b6040518263ffffffff1660e01b815260040162001ff091815260200190565b600060405180830381600087803b1580156200200b57600080fd5b505af115801562002020573d6000803e3d6000fd5b50505050620020f4565b6200203581620042b4565b600681018054600160801b90046001600160401b0316906010620020598362005353565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b48887896040516200213a93929190620050e3565b60405180910390a3505050505050505050565b606f5460ff16156200217257604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602052604090206200219981898989898989896200328c565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620021f862003c02565b505050505050505050565b80516080805463ffffffff191663ffffffff90921691909117905560005b8151811015620013a2578181815181106200224057620022406200537a565b6020026020010151608160008360016200225b919062005390565b63ffffffff168152602081019190915260400160002060050155806200228181620053a6565b91505062002221565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162002306919062004ea4565b602060405180830381865afa15801562002324573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200234a9190620053c2565b60845490915060009062002371906001600160401b03600160401b82048116911662005330565b6001600160401b03169050806000036200238e5760009250505090565b6200239a8183620053f2565b9250505090565b606f5460009060ff1615620023c957604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362002401576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200242c57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff8116600090815260816020526040812060848054919287926200245f9084906001600160401b03166200511a565b82546101009290920a6001600160401b03818102199093169183160217909155600683015416905060006200249587836200511a565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200252483620042b4565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a25826040516200255c9190620047b2565b60405180910390a29695505050505050565b60008051602062005fa9833981519152620025898162003280565b606f5460ff16620025c4576085546001600160401b0390811690831610620025c45760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759062001293908490620047b2565b60008051602062005fa98339815191526200262c8162003280565b62015180826001600160401b031611156200265a57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289062001293908490620047b2565b60805460009063ffffffff16808203620026cc57506000919050565b6000816001600160401b03811115620026e957620026e962004b6c565b60405190808252806020026020018201604052801562002713578160200160208202803683370190505b50905060005b828110156200278657608160006200273383600162005390565b63ffffffff1663ffffffff168152602001908152602001600020600501548282815181106200276657620027666200537a565b6020908102919091010152806200277d81620053a6565b91505062002719565b50600060205b83600114620029ca576000620027a460028662005409565b620027b1600287620053f2565b620027bd919062005390565b90506000816001600160401b03811115620027dc57620027dc62004b6c565b60405190808252806020026020018201604052801562002806578160200160208202803683370190505b50905060005b828110156200297e576200282260018462005420565b811480156200283d57506200283960028862005409565b6001145b15620028bd57856200285182600262005256565b815181106200286457620028646200537a565b6020026020010151856040516020016200288092919062005436565b60405160208183030381529060405280519060200120828281518110620028ab57620028ab6200537a565b60200260200101818152505062002969565b85620028cb82600262005256565b81518110620028de57620028de6200537a565b602002602001015186826002620028f6919062005256565b6200290390600162005390565b815181106200291657620029166200537a565b60200260200101516040516020016200293192919062005436565b604051602081830303815290604052805190602001208282815181106200295c576200295c6200537a565b6020026020010181815250505b806200297581620053a6565b9150506200280c565b5080945081955083846040516020016200299a92919062005436565b6040516020818303038152906040528051906020012093508280620029bf9062005444565b93505050506200278c565b600083600081518110620029e257620029e26200537a565b6020026020010151905060005b8281101562002a6857818460405160200162002a0d92919062005436565b604051602081830303815290604052805190602001209150838460405160200162002a3a92919062005436565b604051602081830303815290604052805190602001209350808062002a5f90620053a6565b915050620029ef565b5095945050505050565b60008051602062005ea983398151915262002a8d8162003280565b63ffffffff8416158062002aac5750607e5463ffffffff908116908516115b1562002acb57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002b0c576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002b5b57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002ba257604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002be057604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002c608462000dfe565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002cb59216908b908b906004016200545e565b600060405180830381600087803b15801562002cd057600080fd5b505af115801562002ce5573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005ec983398151915262002d5a8162003280565b683635c9adc5dea0000082118062002d755750633b9aca0082105b1562002d9457604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001293565b62002dd58262001335565b62002de08162003280565b620011ee838362003ced565b60008051602062005f2983398151915262002e078162003280565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002e6357600080fd5b505af115801562002e78573d6000803e3d6000fd5b5050505062002e866200437f565b50565b60008051602062005f8983398151915262002ea48162003280565b6001600160401b03841660009081526083602052604090205463ffffffff161562002ee2576040516337c8fe0960e11b815260040160405180910390fd5b600062002ef3888888888762003d57565b60008080526002909101602052604090209390935550505050505050565b60008051602062005f0983398151915262002f2c8162003280565b607e805460009190829062002f479063ffffffff1662005270565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620030ea969594939291906200549e565b60405180910390a25050505050505050565b6085546001600160401b038281166000908152600485016020526040812054909242926200312f9291811691166200511a565b6001600160401b031611159392505050565b600054610100900460ff16620013335760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b89565b620013a2828262003c81565b6000620031c78362001335565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6006810154600090600160801b90046001600160401b03161562003263575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002e868133620043d8565b60078801546000906001600160401b039081169087161015620032c25760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620033635760068901546001600160401b03600160801b909104811690891611156200330c5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200335c57604051632bd2e3e760e01b815260040160405180910390fd5b50620033d8565b506001600160401b0385166000908152600289016020526040902054806200339e576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620033d857604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620034115750876001600160401b0316876001600160401b031611155b8062003435575060068901546001600160401b03600160c01b909104811690881611155b15620034545760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b90048116908616146200349b576040516332a2a77f60e01b815260040160405180910390fd5b6000620034ad8a888888868962003f7c565b9050600060008051602062005f49833981519152600283604051620034d39190620054eb565b602060405180830381855afa158015620034f1573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620035169190620053c2565b62003522919062005409565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620035669188919060040162005509565b602060405180830381865afa15801562003584573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620035aa919062005546565b620035c8576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620036075760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620036228a6200320f565b60078b01549091506001600160401b039081169089161015620036585760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620036fb5760068a01546001600160401b03600160801b9091048116908a161115620036a25760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620036f457604051632bd2e3e760e01b815260040160405180910390fd5b506200376b565b6001600160401b038816600090815260028b01602052604090205491508162003737576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200376b57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b0316116200379e5760405163b9b18f5760e01b815260040160405180910390fd5b6000620037b08b8a8a8a878b62003f7c565b9050600060008051602062005f49833981519152600283604051620037d69190620054eb565b602060405180830381855afa158015620037f4573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620038199190620053c2565b62003825919062005409565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620038699189919060040162005509565b602060405180830381865afa15801562003887573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620038ad919062005546565b620038cb576040516309bde33960e01b815260040160405180910390fd5b6000620038d9848b62005330565b90506200393287826001600160401b0316620038f4620022b5565b62003900919062005256565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004402565b80608460088282829054906101000a90046001600160401b03166200395891906200511a565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b158015620039e857600080fd5b505af1158015620039fd573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003a4f575060068201546001600160401b03600160801b9091048116908216115b1562003a6e5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003b2a620026b0565b6040518263ffffffff1660e01b815260040162003b4991815260200190565b600060405180830381600087803b15801562003b6457600080fd5b505af115801562003b79573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003c5e57600080fd5b505af115801562003c73573d6000803e3d6000fd5b505050506200133362004456565b62003c8d82826200228a565b620013a25760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003cf982826200228a565b15620013a25760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b608080546000918291829062003d739063ffffffff1662005270565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000866001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508060826000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150868260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550858260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550838260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003f6a94939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003fb2575081155b1562003fd15760405163340c614f60e11b815260040160405180910390fd5b8062003ff0576040516366385b5160e01b815260040160405180910390fd5b62003ffb84620044b3565b62004019576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b6000620040c4836200320f565b905081600080620040d6848462005330565b6085546001600160401b039182169250600091620040fd91600160401b9004164262005420565b90505b846001600160401b0316846001600160401b03161462004187576001600160401b0380851660009081526003890160205260409020600181015490911682101562004162576001810154600160401b90046001600160401b0316945062004180565b6200416e868662005330565b6001600160401b031693505062004187565b5062004100565b600062004195848462005420565b905083811015620041f357808403600c8111620041b35780620041b6565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620041e857620041e8620053dc565b04608655506200426b565b838103600c811162004206578062004209565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a76400000281620042435762004243620053dc565b04905080608654670de0b6b3a76400000281620042645762004264620053dc565b0460865550505b683635c9adc5dea0000060865411156200429257683635c9adc5dea00000608655620042aa565b633b9aca006086541015620042aa57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002e86576006810154600090620042ff90600160c01b90046001600160401b031660016200511a565b90506200430d8282620030fc565b15620013a25760068201546000906002906200433b908490600160801b90046001600160401b031662005330565b6200434791906200556a565b6200435390836200511a565b9050620043618382620030fc565b156200437357620011ee838262003a10565b620011ee838362003a10565b606f5460ff16620043a357604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b620043e482826200228a565b620013a257604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620011ee90849062004539565b606f5460ff16156200447b57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b038316108015620044ea575067ffffffff00000001604083901c6001600160401b0316105b80156200450b575067ffffffff00000001608083901c6001600160401b0316105b801562004523575067ffffffff0000000160c083901c105b156200453157506001919050565b506000919050565b600062004590826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620046129092919063ffffffff16565b805190915015620011ee5780806020019051810190620045b1919062005546565b620011ee5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b89565b60606200462384846000856200462b565b949350505050565b6060824710156200468e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b89565b600080866001600160a01b03168587604051620046ac9190620054eb565b60006040518083038185875af1925050503d8060008114620046eb576040519150601f19603f3d011682016040523d82523d6000602084013e620046f0565b606091505b509150915062001e1e87838387606083156200477157825160000362004769576001600160a01b0385163b620047695760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b89565b508162004623565b620046238383815115620047885781518083602001fd5b8060405162461bcd60e51b815260040162000b89919062004db2565b6108f5806200559483390190565b6001600160401b0391909116815260200190565b803563ffffffff811681146200327b57600080fd5b80356001600160401b03811681146200327b57600080fd5b600080604083850312156200480757600080fd5b6200481283620047c6565b91506200482260208401620047db565b90509250929050565b6001600160a01b038116811462002e8657600080fd5b60008060008060008060c087890312156200485b57600080fd5b863562004868816200482b565b95506200487860208801620047db565b94506200488860408801620047db565b935060608701356200489a816200482b565b92506080870135620048ac816200482b565b915060a0870135620048be816200482b565b809150509295509295509295565b600060208284031215620048df57600080fd5b62000b3e82620047c6565b80610300810183101562000b4157600080fd5b6000806000806000806000806103e0898b0312156200491b57600080fd5b6200492689620047c6565b97506200493660208a01620047db565b96506200494660408a01620047db565b95506200495660608a01620047db565b94506200496660808a01620047db565b935060a0890135925060c08901359150620049858a60e08b01620048ea565b90509295985092959890939650565b6000806000806000806000806103e0898b031215620049b257600080fd5b620049bd89620047c6565b9750620049cd60208a01620047db565b9650620049dd60408a01620047db565b9550620049ed60608a01620047db565b94506080890135935060a0890135925060c089013562004a0d816200482b565b9150620049858a60e08b01620048ea565b60006020828403121562004a3157600080fd5b813561ffff8116811462004a4457600080fd5b9392505050565b60006020828403121562004a5e57600080fd5b5035919050565b6000806040838503121562004a7957600080fd5b82359150602083013562004a8d816200482b565b809150509250929050565b60006020828403121562004aab57600080fd5b62000b3e82620047db565b600080600080600080600080610100898b03121562004ad457600080fd5b883562004ae1816200482b565b975062004af160208a01620047db565b965062004b0160408a01620047db565b9550606089013562004b13816200482b565b9450608089013562004b25816200482b565b935060a089013562004b37816200482b565b925060c089013562004b49816200482b565b915060e089013562004b5b816200482b565b809150509295985092959890939650565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562004bad5762004bad62004b6c565b604052919050565b600082601f83011262004bc757600080fd5b81356001600160401b0381111562004be35762004be362004b6c565b62004bf8601f8201601f191660200162004b82565b81815284602083860101111562004c0e57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600080600060e0888a03121562004c4757600080fd5b62004c5288620047c6565b965062004c6260208901620047db565b9550604088013562004c74816200482b565b9450606088013562004c86816200482b565b9350608088013562004c98816200482b565b925060a08801356001600160401b038082111562004cb557600080fd5b62004cc38b838c0162004bb5565b935060c08a013591508082111562004cda57600080fd5b5062004ce98a828b0162004bb5565b91505092959891949750929550565b60008060008060008060c0878903121562004d1257600080fd5b62004d1d87620047c6565b955062004d2d60208801620047db565b945062004d3d60408801620047db565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004d7b57818101518382015260200162004d61565b50506000910152565b6000815180845262004d9e81602086016020860162004d5e565b601f01601f19169290920160200192915050565b60208152600062000b3e602083018462004d84565b6000602080838503121562004ddb57600080fd5b82356001600160401b038082111562004df357600080fd5b818501915085601f83011262004e0857600080fd5b81358181111562004e1d5762004e1d62004b6c565b8060051b915062004e3084830162004b82565b818152918301840191848101908884111562004e4b57600080fd5b938501935b8385101562004e6b5784358252938501939085019062004e50565b98975050505050505050565b6000806040838503121562004e8b57600080fd5b62004e9683620047db565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000806000806060858703121562004ecf57600080fd5b843562004edc816200482b565b935062004eec60208601620047c6565b925060408501356001600160401b038082111562004f0957600080fd5b818701915087601f83011262004f1e57600080fd5b81358181111562004f2e57600080fd5b88602082850101111562004f4157600080fd5b95989497505060200194505050565b60006020828403121562004f6357600080fd5b813562004a44816200482b565b803560ff811681146200327b57600080fd5b60008060008060008060c0878903121562004f9c57600080fd5b863562004fa9816200482b565b9550602087013562004fbb816200482b565b945062004fcb60408801620047db565b935062004fdb60608801620047db565b92506080870135915062004ff260a0880162004f70565b90509295509295509295565b60008060008060008060c087890312156200501857600080fd5b863562005025816200482b565b9550602087013562005037816200482b565b94506200504760408801620047db565b9350620050576060880162004f70565b92506080870135915060a08701356001600160401b038111156200507a57600080fd5b6200508889828a0162004bb5565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b038181168382160190808211156200513d576200513d62005104565b5092915050565b8054600090600181811c90808316806200515f57607f831692505b602080841082036200518157634e487b7160e01b600052602260045260246000fd5b838852602088018280156200519f5760018114620051b657620051e3565b60ff198716825285151560051b82019750620051e3565b60008981526020902060005b87811015620051dd57815484820152908601908401620051c2565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c0604082018190526000906200521e9083018762005144565b828103606084015262005232818762005144565b608084019590955250506001600160401b039190911660a090910152949350505050565b808202811582820484141762000b415762000b4162005104565b600063ffffffff8083168181036200528c576200528c62005104565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620052c49083018462004d84565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190526000906200530f9083018562004d84565b82810360a084015262005323818562004d84565b9998505050505050505050565b6001600160401b038281168282160390808211156200513d576200513d62005104565b60006001600160401b038281166002600160401b031981016200528c576200528c62005104565b634e487b7160e01b600052603260045260246000fd5b8082018082111562000b415762000b4162005104565b600060018201620053bb57620053bb62005104565b5060010190565b600060208284031215620053d557600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082620054045762005404620053dc565b500490565b6000826200541b576200541b620053dc565b500690565b8181038181111562000b415762000b4162005104565b918252602082015260400190565b60008162005456576200545662005104565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a0820181905260009062004e6b9083018462004d84565b60008251620054ff81846020870162004d5e565b9190910192915050565b61032081016103008085843782018360005b60018110156200553c5781518352602092830192909101906001016200551b565b5050509392505050565b6000602082840312156200555957600080fd5b8151801515811462004a4457600080fd5b60006001600160401b0383811680620055875762005587620053dc565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220a19e7a72432195d9a35c7ce8fa5f1284415aac66bb1ad08a4c2e1c252fd8690864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a26469706673582212205852eeda437f498b0bdbc880c7dfb3fe1d0947053ae208222c7088b67edf595964736f6c63430008140033", + "bytecode": "0x60e06040523480156200001157600080fd5b50604051620061a5380380620061a583398101604081905262000034916200006b565b6001600160a01b0392831660805290821660c0521660a052620000bf565b6001600160a01b03811681146200006857600080fd5b50565b6000806000606084860312156200008157600080fd5b83516200008e8162000052565b6020850151909350620000a18162000052565b6040850151909250620000b48162000052565b809150509250925092565b60805160a05160c05161607e62000127600039600081816109bc015281816122ba015261390a01526000818161078201528181612e090152613c0401526000818161091601528181610eca0152818161107a01528181611f9a0152613af3015261607e6000f3fe60806040523480156200001157600080fd5b5060043610620002aa5760003560e01c8063066ec01214620002af578063080b311114620002db5780630a0d9fbe14620003035780630e36f582146200031e57806311f6b287146200033757806312b86e19146200034e5780631489ed10146200036557806315064c96146200037c5780631608859c146200038a5780631796a1ae14620003a15780631816b7e514620003c85780632072f6c514620003df578063248a9ca314620003e957806325280169146200040f5780632f2ff15d14620004c457806336568abe14620004db578063394218e914620004f2578063477fa27014620005095780634d4d3338146200051257806355a71ee0146200052957806360469169146200056d57806365c0504d14620005775780637222020f1462000626578063727885e9146200063d5780637975fcfe14620006545780637fb6e76a146200067a578063841b24d714620006a357806387c20c0114620006be5780638bd4f07114620006d55780638f698ec514620006ec57806391d14854146200070357806399f5634e146200071a5780639a908e7314620007245780639c9f3dfe146200073b578063a066215c1462000752578063a217fddf1462000769578063a2967d991462000772578063a3c573eb146200077c578063afd23cbe14620007b3578063b99d0ad714620007dd578063c1acbc3414620008b5578063c4c928c214620008d0578063ceee281d14620008e7578063d02103ca1462000910578063d5073f6f1462000938578063d547741f146200094f578063d939b3151462000966578063dbc16976146200097a578063dde0ff771462000984578063e0bfd3d2146200099f578063e46761c414620009b6578063f34eb8eb14620009de578063f4e9267514620009f5578063f9c4c2ae1462000a06575b600080fd5b608454620002c3906001600160401b031681565b604051620002d29190620047b2565b60405180910390f35b620002f2620002ec366004620047f3565b62000b1d565b6040519015158152602001620002d2565b608554620002c390600160401b90046001600160401b031681565b620003356200032f36600462004841565b62000b47565b005b620002c362000348366004620048cc565b62000dfe565b620003356200035f366004620048fd565b62000e1e565b620003356200037636600462004994565b62000fce565b606f54620002f29060ff1681565b620003356200039b366004620047f3565b6200115e565b607e54620003b29063ffffffff1681565b60405163ffffffff9091168152602001620002d2565b62000335620003d936600462004a1e565b620011f3565b620003356200129f565b62000400620003fa36600462004a4b565b62001335565b604051908152602001620002d2565b6200049062000420366004620047f3565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002d2565b62000335620004d536600462004a65565b6200134a565b62000335620004ec36600462004a65565b6200136c565b620003356200050336600462004a98565b620013a6565b60865462000400565b620003356200052336600462004ab6565b62001455565b620004006200053a366004620047f3565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620004006200188b565b620005dc62000588366004620048cc565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002d2565b6200033562000637366004620048cc565b620018a3565b620003356200064e36600462004c2b565b6200198e565b6200066b6200066536600462004cf8565b62001df6565b604051620002d2919062004db2565b620003b26200068b36600462004a98565b60836020526000908152604090205463ffffffff1681565b608454620002c390600160c01b90046001600160401b031681565b62000335620006cf36600462004994565b62001e29565b62000335620006e6366004620048fd565b6200214d565b62000335620006fd36600462004dc7565b62002203565b620002f26200071436600462004a65565b6200228a565b62000400620022b5565b620002c36200073536600462004e77565b620023a1565b620003356200074c36600462004a98565b6200256e565b620003356200076336600462004a98565b62002611565b62000400600081565b62000400620026b0565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b604051620002d2919062004ea4565b608554620007c990600160801b900461ffff1681565b60405161ffff9091168152602001620002d2565b62000873620007ee366004620047f3565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002d2919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002c390600160801b90046001600160401b031681565b62000335620008e136600462004eb8565b62002a72565b620003b2620008f836600462004f50565b60826020526000908152604090205463ffffffff1681565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b620003356200094936600462004a4b565b62002d3f565b620003356200096036600462004a65565b62002dca565b608554620002c3906001600160401b031681565b6200033562002dec565b608454620002c390600160401b90046001600160401b031681565b62000335620009b036600462004f82565b62002e89565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b62000335620009ef36600462004ffe565b62002f11565b608054620003b29063ffffffff1681565b62000a9d62000a17366004620048cc565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002d2565b63ffffffff8216600090815260816020526040812062000b3e9083620030fc565b90505b92915050565b600054600290610100900460ff1615801562000b6a575060005460ff8083169116105b62000b925760405162461bcd60e51b815260040162000b899062005095565b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c1362003141565b62000c2e6000805160206200602983398151915288620031ae565b62000c3b600084620031ae565b62000c5660008051602062005f0983398151915284620031ae565b62000c7160008051602062005f8983398151915284620031ae565b62000c8c60008051602062005ea983398151915284620031ae565b62000ca760008051602062005ee983398151915285620031ae565b62000cc26000805160206200600983398151915285620031ae565b62000cdd60008051602062005f2983398151915285620031ae565b62000cf860008051602062005fa983398151915285620031ae565b62000d226000805160206200602983398151915260008051602062005e89833981519152620031ba565b62000d3d60008051602062005e8983398151915285620031ae565b62000d5860008051602062005ec983398151915285620031ae565b62000d8260008051602062005fe983398151915260008051602062005fc9833981519152620031ba565b62000d9d60008051602062005fe983398151915283620031ae565b62000db860008051602062005fc983398151915283620031ae565b62000dc5600033620031ae565b6000805461ff001916905560405160ff8216815260008051602062005f698339815191529060200160405180910390a150505050505050565b63ffffffff8116600090815260816020526040812062000b41906200320f565b6000805160206200602983398151915262000e398162003280565b63ffffffff8916600090815260816020526040902062000e60818a8a8a8a8a8a8a6200328c565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000ec8576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000f01620026b0565b6040518263ffffffff1660e01b815260040162000f2091815260200190565b600060405180830381600087803b15801562000f3b57600080fd5b505af115801562000f50573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b6000805160206200602983398151915262000fe98162003280565b63ffffffff8916600090815260816020526040902062001010818a8a8a8a8a8a8a62003614565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562001078576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620010b1620026b0565b6040518263ffffffff1660e01b8152600401620010d091815260200190565b600060405180830381600087803b158015620010eb57600080fd5b505af115801562001100573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a6040516200114a93929190620050e3565b60405180910390a350505050505050505050565b63ffffffff821660009081526081602052604090206200118e60008051602062006029833981519152336200228a565b620011e257606f5460ff1615620011b857604051630bc011ff60e21b815260040160405180910390fd5b620011c48183620030fc565b620011e257604051630674f25160e11b815260040160405180910390fd5b620011ee818362003a10565b505050565b60008051602062005fa98339815191526200120e8162003280565b6103e88261ffff1610806200122857506103ff8261ffff16115b156200124757604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620012ba60008051602062005fe9833981519152336200228a565b6200132957608454600160801b90046001600160401b031615806200130a57506084544290620012ff9062093a8090600160801b90046001600160401b03166200511a565b6001600160401b0316115b15620013295760405163692baaad60e11b815260040160405180910390fd5b6200133362003c02565b565b60009081526034602052604090206001015490565b620013558262001335565b620013608162003280565b620011ee838362003c81565b6001600160a01b03811633146200139657604051630b4ad1cd60e31b815260040160405180910390fd5b620013a2828262003ced565b5050565b60008051602062005fa9833981519152620013c18162003280565b606f5460ff1662001403576084546001600160401b03600160c01b909104811690831610620014035760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19062001293908490620047b2565b600054600290610100900460ff1615801562001478575060005460ff8083169116105b620014975760405162461bcd60e51b815260040162000b899062005095565b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200151862003141565b62001533600080516020620060298339815191528a620031ae565b62001540600086620031ae565b6200155b60008051602062005f0983398151915286620031ae565b6200157660008051602062005f8983398151915286620031ae565b6200159160008051602062005ea983398151915286620031ae565b620015ac60008051602062005ee983398151915287620031ae565b620015c76000805160206200600983398151915287620031ae565b620015e260008051602062005f2983398151915287620031ae565b620015fd60008051602062005fa983398151915287620031ae565b620016276000805160206200602983398151915260008051602062005e89833981519152620031ba565b6200164260008051602062005e8983398151915287620031ae565b6200165d60008051602062005ec983398151915287620031ae565b6200168760008051602062005fe983398151915260008051602062005fc9833981519152620031ba565b620016a260008051602062005fe983398151915285620031ae565b620016bd60008051602062005fc983398151915285620031ae565b6000620016d28484600561044d600062003d57565b6073546074549192506001600160401b03600160401b909104811691168082146200171057604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b0381811660008181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620018119695831695600160581b9091049092169360769360779391929190911690600401620051f0565b600060405180830381600087803b1580156200182c57600080fd5b505af115801562001841573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff8516815260008051602062005f6983398151915293506020019150620018789050565b60405180910390a1505050505050505050565b600060865460646200189e919062005256565b905090565b60008051602062005ee9833981519152620018be8162003280565b63ffffffff82161580620018dd5750607e5463ffffffff908116908316115b15620018fc57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200194357604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b60008051602062006009833981519152620019a98162003280565b63ffffffff88161580620019c85750607e5463ffffffff908116908916115b15620019e757604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff161515900362001a2e57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001a6c576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062001a879063ffffffff1662005270565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001ad590620047a4565b62001ae39392919062005296565b604051809103906000f08015801562001b00573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001d74949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001db4908d908d9088908e908e908e90600401620052cd565b600060405180830381600087803b15801562001dcf57600080fd5b505af115801562001de4573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001e1e90878787878762003f7c565b979650505050505050565b606f5460ff161562001e4e57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001e9d92600160c01b9004811691166200511a565b6001600160401b0316111562001ec657604051638a0704d360e01b815260040160405180910390fd5b6103e862001ed5888862005330565b6001600160401b0316111562001efe57604051635acfba9d60e11b815260040160405180910390fd5b62001f10818989898989898962003614565b62001f1c8187620040b7565b6085546001600160401b03166000036200202a57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001f98576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001fd1620026b0565b6040518263ffffffff1660e01b815260040162001ff091815260200190565b600060405180830381600087803b1580156200200b57600080fd5b505af115801562002020573d6000803e3d6000fd5b50505050620020f4565b6200203581620042b4565b600681018054600160801b90046001600160401b0316906010620020598362005353565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b48887896040516200213a93929190620050e3565b60405180910390a3505050505050505050565b606f5460ff16156200217257604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602052604090206200219981898989898989896200328c565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620021f862003c02565b505050505050505050565b80516080805463ffffffff191663ffffffff90921691909117905560005b8151811015620013a2578181815181106200224057620022406200537a565b6020026020010151608160008360016200225b919062005390565b63ffffffff168152602081019190915260400160002060050155806200228181620053a6565b91505062002221565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162002306919062004ea4565b602060405180830381865afa15801562002324573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200234a9190620053c2565b60845490915060009062002371906001600160401b03600160401b82048116911662005330565b6001600160401b03169050806000036200238e5760009250505090565b6200239a8183620053f2565b9250505090565b606f5460009060ff1615620023c957604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362002401576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200242c57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff8116600090815260816020526040812060848054919287926200245f9084906001600160401b03166200511a565b82546101009290920a6001600160401b03818102199093169183160217909155600683015416905060006200249587836200511a565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200252483620042b4565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a25826040516200255c9190620047b2565b60405180910390a29695505050505050565b60008051602062005fa9833981519152620025898162003280565b606f5460ff16620025c4576085546001600160401b0390811690831610620025c45760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759062001293908490620047b2565b60008051602062005fa98339815191526200262c8162003280565b62015180826001600160401b031611156200265a57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289062001293908490620047b2565b60805460009063ffffffff16808203620026cc57506000919050565b6000816001600160401b03811115620026e957620026e962004b6c565b60405190808252806020026020018201604052801562002713578160200160208202803683370190505b50905060005b828110156200278657608160006200273383600162005390565b63ffffffff1663ffffffff168152602001908152602001600020600501548282815181106200276657620027666200537a565b6020908102919091010152806200277d81620053a6565b91505062002719565b50600060205b83600114620029ca576000620027a460028662005409565b620027b1600287620053f2565b620027bd919062005390565b90506000816001600160401b03811115620027dc57620027dc62004b6c565b60405190808252806020026020018201604052801562002806578160200160208202803683370190505b50905060005b828110156200297e576200282260018462005420565b811480156200283d57506200283960028862005409565b6001145b15620028bd57856200285182600262005256565b815181106200286457620028646200537a565b6020026020010151856040516020016200288092919062005436565b60405160208183030381529060405280519060200120828281518110620028ab57620028ab6200537a565b60200260200101818152505062002969565b85620028cb82600262005256565b81518110620028de57620028de6200537a565b602002602001015186826002620028f6919062005256565b6200290390600162005390565b815181106200291657620029166200537a565b60200260200101516040516020016200293192919062005436565b604051602081830303815290604052805190602001208282815181106200295c576200295c6200537a565b6020026020010181815250505b806200297581620053a6565b9150506200280c565b5080945081955083846040516020016200299a92919062005436565b6040516020818303038152906040528051906020012093508280620029bf9062005444565b93505050506200278c565b600083600081518110620029e257620029e26200537a565b6020026020010151905060005b8281101562002a6857818460405160200162002a0d92919062005436565b604051602081830303815290604052805190602001209150838460405160200162002a3a92919062005436565b604051602081830303815290604052805190602001209350808062002a5f90620053a6565b915050620029ef565b5095945050505050565b60008051602062005ea983398151915262002a8d8162003280565b63ffffffff8416158062002aac5750607e5463ffffffff908116908516115b1562002acb57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002b0c576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002b5b57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002ba257604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002be057604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002c608462000dfe565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002cb59216908b908b906004016200545e565b600060405180830381600087803b15801562002cd057600080fd5b505af115801562002ce5573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005ec983398151915262002d5a8162003280565b683635c9adc5dea0000082118062002d755750633b9aca0082105b1562002d9457604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001293565b62002dd58262001335565b62002de08162003280565b620011ee838362003ced565b60008051602062005f2983398151915262002e078162003280565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002e6357600080fd5b505af115801562002e78573d6000803e3d6000fd5b5050505062002e866200437f565b50565b60008051602062005f8983398151915262002ea48162003280565b6001600160401b03841660009081526083602052604090205463ffffffff161562002ee2576040516337c8fe0960e11b815260040160405180910390fd5b600062002ef3888888888762003d57565b60008080526002909101602052604090209390935550505050505050565b60008051602062005f0983398151915262002f2c8162003280565b607e805460009190829062002f479063ffffffff1662005270565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620030ea969594939291906200549e565b60405180910390a25050505050505050565b6085546001600160401b038281166000908152600485016020526040812054909242926200312f9291811691166200511a565b6001600160401b031611159392505050565b600054610100900460ff16620013335760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b89565b620013a2828262003c81565b6000620031c78362001335565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6006810154600090600160801b90046001600160401b03161562003263575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002e868133620043d8565b60078801546000906001600160401b039081169087161015620032c25760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620033635760068901546001600160401b03600160801b909104811690891611156200330c5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200335c57604051632bd2e3e760e01b815260040160405180910390fd5b50620033d8565b506001600160401b0385166000908152600289016020526040902054806200339e576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620033d857604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620034115750876001600160401b0316876001600160401b031611155b8062003435575060068901546001600160401b03600160c01b909104811690881611155b15620034545760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b90048116908616146200349b576040516332a2a77f60e01b815260040160405180910390fd5b6000620034ad8a888888868962003f7c565b9050600060008051602062005f49833981519152600283604051620034d39190620054eb565b602060405180830381855afa158015620034f1573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620035169190620053c2565b62003522919062005409565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620035669188919060040162005509565b602060405180830381865afa15801562003584573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620035aa919062005546565b620035c8576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620036075760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620036228a6200320f565b60078b01549091506001600160401b039081169089161015620036585760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620036fb5760068a01546001600160401b03600160801b9091048116908a161115620036a25760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620036f457604051632bd2e3e760e01b815260040160405180910390fd5b506200376b565b6001600160401b038816600090815260028b01602052604090205491508162003737576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200376b57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b0316116200379e5760405163b9b18f5760e01b815260040160405180910390fd5b6000620037b08b8a8a8a878b62003f7c565b9050600060008051602062005f49833981519152600283604051620037d69190620054eb565b602060405180830381855afa158015620037f4573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620038199190620053c2565b62003825919062005409565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620038699189919060040162005509565b602060405180830381865afa15801562003887573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620038ad919062005546565b620038cb576040516309bde33960e01b815260040160405180910390fd5b6000620038d9848b62005330565b90506200393287826001600160401b0316620038f4620022b5565b62003900919062005256565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004402565b80608460088282829054906101000a90046001600160401b03166200395891906200511a565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b158015620039e857600080fd5b505af1158015620039fd573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003a4f575060068201546001600160401b03600160801b9091048116908216115b1562003a6e5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003b2a620026b0565b6040518263ffffffff1660e01b815260040162003b4991815260200190565b600060405180830381600087803b15801562003b6457600080fd5b505af115801562003b79573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003c5e57600080fd5b505af115801562003c73573d6000803e3d6000fd5b505050506200133362004456565b62003c8d82826200228a565b620013a25760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003cf982826200228a565b15620013a25760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b608080546000918291829062003d739063ffffffff1662005270565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000866001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508060826000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150868260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550858260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550838260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003f6a94939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003fb2575081155b1562003fd15760405163340c614f60e11b815260040160405180910390fd5b8062003ff0576040516366385b5160e01b815260040160405180910390fd5b62003ffb84620044b3565b62004019576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b6000620040c4836200320f565b905081600080620040d6848462005330565b6085546001600160401b039182169250600091620040fd91600160401b9004164262005420565b90505b846001600160401b0316846001600160401b03161462004187576001600160401b0380851660009081526003890160205260409020600181015490911682101562004162576001810154600160401b90046001600160401b0316945062004180565b6200416e868662005330565b6001600160401b031693505062004187565b5062004100565b600062004195848462005420565b905083811015620041f357808403600c8111620041b35780620041b6565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620041e857620041e8620053dc565b04608655506200426b565b838103600c811162004206578062004209565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a76400000281620042435762004243620053dc565b04905080608654670de0b6b3a76400000281620042645762004264620053dc565b0460865550505b683635c9adc5dea0000060865411156200429257683635c9adc5dea00000608655620042aa565b633b9aca006086541015620042aa57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002e86576006810154600090620042ff90600160c01b90046001600160401b031660016200511a565b90506200430d8282620030fc565b15620013a25760068201546000906002906200433b908490600160801b90046001600160401b031662005330565b6200434791906200556a565b6200435390836200511a565b9050620043618382620030fc565b156200437357620011ee838262003a10565b620011ee838362003a10565b606f5460ff16620043a357604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b620043e482826200228a565b620013a257604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620011ee90849062004539565b606f5460ff16156200447b57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b038316108015620044ea575067ffffffff00000001604083901c6001600160401b0316105b80156200450b575067ffffffff00000001608083901c6001600160401b0316105b801562004523575067ffffffff0000000160c083901c105b156200453157506001919050565b506000919050565b600062004590826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620046129092919063ffffffff16565b805190915015620011ee5780806020019051810190620045b1919062005546565b620011ee5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b89565b60606200462384846000856200462b565b949350505050565b6060824710156200468e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b89565b600080866001600160a01b03168587604051620046ac9190620054eb565b60006040518083038185875af1925050503d8060008114620046eb576040519150601f19603f3d011682016040523d82523d6000602084013e620046f0565b606091505b509150915062001e1e87838387606083156200477157825160000362004769576001600160a01b0385163b620047695760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b89565b508162004623565b620046238383815115620047885781518083602001fd5b8060405162461bcd60e51b815260040162000b89919062004db2565b6108f5806200559483390190565b6001600160401b0391909116815260200190565b803563ffffffff811681146200327b57600080fd5b80356001600160401b03811681146200327b57600080fd5b600080604083850312156200480757600080fd5b6200481283620047c6565b91506200482260208401620047db565b90509250929050565b6001600160a01b038116811462002e8657600080fd5b60008060008060008060c087890312156200485b57600080fd5b863562004868816200482b565b95506200487860208801620047db565b94506200488860408801620047db565b935060608701356200489a816200482b565b92506080870135620048ac816200482b565b915060a0870135620048be816200482b565b809150509295509295509295565b600060208284031215620048df57600080fd5b62000b3e82620047c6565b80610300810183101562000b4157600080fd5b6000806000806000806000806103e0898b0312156200491b57600080fd5b6200492689620047c6565b97506200493660208a01620047db565b96506200494660408a01620047db565b95506200495660608a01620047db565b94506200496660808a01620047db565b935060a0890135925060c08901359150620049858a60e08b01620048ea565b90509295985092959890939650565b6000806000806000806000806103e0898b031215620049b257600080fd5b620049bd89620047c6565b9750620049cd60208a01620047db565b9650620049dd60408a01620047db565b9550620049ed60608a01620047db565b94506080890135935060a0890135925060c089013562004a0d816200482b565b9150620049858a60e08b01620048ea565b60006020828403121562004a3157600080fd5b813561ffff8116811462004a4457600080fd5b9392505050565b60006020828403121562004a5e57600080fd5b5035919050565b6000806040838503121562004a7957600080fd5b82359150602083013562004a8d816200482b565b809150509250929050565b60006020828403121562004aab57600080fd5b62000b3e82620047db565b600080600080600080600080610100898b03121562004ad457600080fd5b883562004ae1816200482b565b975062004af160208a01620047db565b965062004b0160408a01620047db565b9550606089013562004b13816200482b565b9450608089013562004b25816200482b565b935060a089013562004b37816200482b565b925060c089013562004b49816200482b565b915060e089013562004b5b816200482b565b809150509295985092959890939650565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562004bad5762004bad62004b6c565b604052919050565b600082601f83011262004bc757600080fd5b81356001600160401b0381111562004be35762004be362004b6c565b62004bf8601f8201601f191660200162004b82565b81815284602083860101111562004c0e57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600080600060e0888a03121562004c4757600080fd5b62004c5288620047c6565b965062004c6260208901620047db565b9550604088013562004c74816200482b565b9450606088013562004c86816200482b565b9350608088013562004c98816200482b565b925060a08801356001600160401b038082111562004cb557600080fd5b62004cc38b838c0162004bb5565b935060c08a013591508082111562004cda57600080fd5b5062004ce98a828b0162004bb5565b91505092959891949750929550565b60008060008060008060c0878903121562004d1257600080fd5b62004d1d87620047c6565b955062004d2d60208801620047db565b945062004d3d60408801620047db565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004d7b57818101518382015260200162004d61565b50506000910152565b6000815180845262004d9e81602086016020860162004d5e565b601f01601f19169290920160200192915050565b60208152600062000b3e602083018462004d84565b6000602080838503121562004ddb57600080fd5b82356001600160401b038082111562004df357600080fd5b818501915085601f83011262004e0857600080fd5b81358181111562004e1d5762004e1d62004b6c565b8060051b915062004e3084830162004b82565b818152918301840191848101908884111562004e4b57600080fd5b938501935b8385101562004e6b5784358252938501939085019062004e50565b98975050505050505050565b6000806040838503121562004e8b57600080fd5b62004e9683620047db565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000806000806060858703121562004ecf57600080fd5b843562004edc816200482b565b935062004eec60208601620047c6565b925060408501356001600160401b038082111562004f0957600080fd5b818701915087601f83011262004f1e57600080fd5b81358181111562004f2e57600080fd5b88602082850101111562004f4157600080fd5b95989497505060200194505050565b60006020828403121562004f6357600080fd5b813562004a44816200482b565b803560ff811681146200327b57600080fd5b60008060008060008060c0878903121562004f9c57600080fd5b863562004fa9816200482b565b9550602087013562004fbb816200482b565b945062004fcb60408801620047db565b935062004fdb60608801620047db565b92506080870135915062004ff260a0880162004f70565b90509295509295509295565b60008060008060008060c087890312156200501857600080fd5b863562005025816200482b565b9550602087013562005037816200482b565b94506200504760408801620047db565b9350620050576060880162004f70565b92506080870135915060a08701356001600160401b038111156200507a57600080fd5b6200508889828a0162004bb5565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b038181168382160190808211156200513d576200513d62005104565b5092915050565b8054600090600181811c90808316806200515f57607f831692505b602080841082036200518157634e487b7160e01b600052602260045260246000fd5b838852602088018280156200519f5760018114620051b657620051e3565b60ff198716825285151560051b82019750620051e3565b60008981526020902060005b87811015620051dd57815484820152908601908401620051c2565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c0604082018190526000906200521e9083018762005144565b828103606084015262005232818762005144565b608084019590955250506001600160401b039190911660a090910152949350505050565b808202811582820484141762000b415762000b4162005104565b600063ffffffff8083168181036200528c576200528c62005104565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620052c49083018462004d84565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190526000906200530f9083018562004d84565b82810360a084015262005323818562004d84565b9998505050505050505050565b6001600160401b038281168282160390808211156200513d576200513d62005104565b60006001600160401b038281166002600160401b031981016200528c576200528c62005104565b634e487b7160e01b600052603260045260246000fd5b8082018082111562000b415762000b4162005104565b600060018201620053bb57620053bb62005104565b5060010190565b600060208284031215620053d557600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082620054045762005404620053dc565b500490565b6000826200541b576200541b620053dc565b500690565b8181038181111562000b415762000b4162005104565b918252602082015260400190565b60008162005456576200545662005104565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a0820181905260009062004e6b9083018462004d84565b60008251620054ff81846020870162004d5e565b9190910192915050565b61032081016103008085843782018360005b60018110156200553c5781518352602092830192909101906001016200551b565b5050509392505050565b6000602082840312156200555957600080fd5b8151801515811462004a4457600080fd5b60006001600160401b0383811680620055875762005587620053dc565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220a19e7a72432195d9a35c7ce8fa5f1284415aac66bb1ad08a4c2e1c252fd8690864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a26469706673582212203ed109761baf62dbc1fa9f0e36ec13a862f69b70da8979a56e488b9e97261de064736f6c63430008140033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620002aa5760003560e01c8063066ec01214620002af578063080b311114620002db5780630a0d9fbe14620003035780630e36f582146200031e57806311f6b287146200033757806312b86e19146200034e5780631489ed10146200036557806315064c96146200037c5780631608859c146200038a5780631796a1ae14620003a15780631816b7e514620003c85780632072f6c514620003df578063248a9ca314620003e957806325280169146200040f5780632f2ff15d14620004c457806336568abe14620004db578063394218e914620004f2578063477fa27014620005095780634d4d3338146200051257806355a71ee0146200052957806360469169146200056d57806365c0504d14620005775780637222020f1462000626578063727885e9146200063d5780637975fcfe14620006545780637fb6e76a146200067a578063841b24d714620006a357806387c20c0114620006be5780638bd4f07114620006d55780638f698ec514620006ec57806391d14854146200070357806399f5634e146200071a5780639a908e7314620007245780639c9f3dfe146200073b578063a066215c1462000752578063a217fddf1462000769578063a2967d991462000772578063a3c573eb146200077c578063afd23cbe14620007b3578063b99d0ad714620007dd578063c1acbc3414620008b5578063c4c928c214620008d0578063ceee281d14620008e7578063d02103ca1462000910578063d5073f6f1462000938578063d547741f146200094f578063d939b3151462000966578063dbc16976146200097a578063dde0ff771462000984578063e0bfd3d2146200099f578063e46761c414620009b6578063f34eb8eb14620009de578063f4e9267514620009f5578063f9c4c2ae1462000a06575b600080fd5b608454620002c3906001600160401b031681565b604051620002d29190620047b2565b60405180910390f35b620002f2620002ec366004620047f3565b62000b1d565b6040519015158152602001620002d2565b608554620002c390600160401b90046001600160401b031681565b620003356200032f36600462004841565b62000b47565b005b620002c362000348366004620048cc565b62000dfe565b620003356200035f366004620048fd565b62000e1e565b620003356200037636600462004994565b62000fce565b606f54620002f29060ff1681565b620003356200039b366004620047f3565b6200115e565b607e54620003b29063ffffffff1681565b60405163ffffffff9091168152602001620002d2565b62000335620003d936600462004a1e565b620011f3565b620003356200129f565b62000400620003fa36600462004a4b565b62001335565b604051908152602001620002d2565b6200049062000420366004620047f3565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002d2565b62000335620004d536600462004a65565b6200134a565b62000335620004ec36600462004a65565b6200136c565b620003356200050336600462004a98565b620013a6565b60865462000400565b620003356200052336600462004ab6565b62001455565b620004006200053a366004620047f3565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620004006200188b565b620005dc62000588366004620048cc565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002d2565b6200033562000637366004620048cc565b620018a3565b620003356200064e36600462004c2b565b6200198e565b6200066b6200066536600462004cf8565b62001df6565b604051620002d2919062004db2565b620003b26200068b36600462004a98565b60836020526000908152604090205463ffffffff1681565b608454620002c390600160c01b90046001600160401b031681565b62000335620006cf36600462004994565b62001e29565b62000335620006e6366004620048fd565b6200214d565b62000335620006fd36600462004dc7565b62002203565b620002f26200071436600462004a65565b6200228a565b62000400620022b5565b620002c36200073536600462004e77565b620023a1565b620003356200074c36600462004a98565b6200256e565b620003356200076336600462004a98565b62002611565b62000400600081565b62000400620026b0565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b604051620002d2919062004ea4565b608554620007c990600160801b900461ffff1681565b60405161ffff9091168152602001620002d2565b62000873620007ee366004620047f3565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002d2919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002c390600160801b90046001600160401b031681565b62000335620008e136600462004eb8565b62002a72565b620003b2620008f836600462004f50565b60826020526000908152604090205463ffffffff1681565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b620003356200094936600462004a4b565b62002d3f565b620003356200096036600462004a65565b62002dca565b608554620002c3906001600160401b031681565b6200033562002dec565b608454620002c390600160401b90046001600160401b031681565b62000335620009b036600462004f82565b62002e89565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b62000335620009ef36600462004ffe565b62002f11565b608054620003b29063ffffffff1681565b62000a9d62000a17366004620048cc565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002d2565b63ffffffff8216600090815260816020526040812062000b3e9083620030fc565b90505b92915050565b600054600290610100900460ff1615801562000b6a575060005460ff8083169116105b62000b925760405162461bcd60e51b815260040162000b899062005095565b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c1362003141565b62000c2e6000805160206200602983398151915288620031ae565b62000c3b600084620031ae565b62000c5660008051602062005f0983398151915284620031ae565b62000c7160008051602062005f8983398151915284620031ae565b62000c8c60008051602062005ea983398151915284620031ae565b62000ca760008051602062005ee983398151915285620031ae565b62000cc26000805160206200600983398151915285620031ae565b62000cdd60008051602062005f2983398151915285620031ae565b62000cf860008051602062005fa983398151915285620031ae565b62000d226000805160206200602983398151915260008051602062005e89833981519152620031ba565b62000d3d60008051602062005e8983398151915285620031ae565b62000d5860008051602062005ec983398151915285620031ae565b62000d8260008051602062005fe983398151915260008051602062005fc9833981519152620031ba565b62000d9d60008051602062005fe983398151915283620031ae565b62000db860008051602062005fc983398151915283620031ae565b62000dc5600033620031ae565b6000805461ff001916905560405160ff8216815260008051602062005f698339815191529060200160405180910390a150505050505050565b63ffffffff8116600090815260816020526040812062000b41906200320f565b6000805160206200602983398151915262000e398162003280565b63ffffffff8916600090815260816020526040902062000e60818a8a8a8a8a8a8a6200328c565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000ec8576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000f01620026b0565b6040518263ffffffff1660e01b815260040162000f2091815260200190565b600060405180830381600087803b15801562000f3b57600080fd5b505af115801562000f50573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b6000805160206200602983398151915262000fe98162003280565b63ffffffff8916600090815260816020526040902062001010818a8a8a8a8a8a8a62003614565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562001078576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620010b1620026b0565b6040518263ffffffff1660e01b8152600401620010d091815260200190565b600060405180830381600087803b158015620010eb57600080fd5b505af115801562001100573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a6040516200114a93929190620050e3565b60405180910390a350505050505050505050565b63ffffffff821660009081526081602052604090206200118e60008051602062006029833981519152336200228a565b620011e257606f5460ff1615620011b857604051630bc011ff60e21b815260040160405180910390fd5b620011c48183620030fc565b620011e257604051630674f25160e11b815260040160405180910390fd5b620011ee818362003a10565b505050565b60008051602062005fa98339815191526200120e8162003280565b6103e88261ffff1610806200122857506103ff8261ffff16115b156200124757604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620012ba60008051602062005fe9833981519152336200228a565b6200132957608454600160801b90046001600160401b031615806200130a57506084544290620012ff9062093a8090600160801b90046001600160401b03166200511a565b6001600160401b0316115b15620013295760405163692baaad60e11b815260040160405180910390fd5b6200133362003c02565b565b60009081526034602052604090206001015490565b620013558262001335565b620013608162003280565b620011ee838362003c81565b6001600160a01b03811633146200139657604051630b4ad1cd60e31b815260040160405180910390fd5b620013a2828262003ced565b5050565b60008051602062005fa9833981519152620013c18162003280565b606f5460ff1662001403576084546001600160401b03600160c01b909104811690831610620014035760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19062001293908490620047b2565b600054600290610100900460ff1615801562001478575060005460ff8083169116105b620014975760405162461bcd60e51b815260040162000b899062005095565b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200151862003141565b62001533600080516020620060298339815191528a620031ae565b62001540600086620031ae565b6200155b60008051602062005f0983398151915286620031ae565b6200157660008051602062005f8983398151915286620031ae565b6200159160008051602062005ea983398151915286620031ae565b620015ac60008051602062005ee983398151915287620031ae565b620015c76000805160206200600983398151915287620031ae565b620015e260008051602062005f2983398151915287620031ae565b620015fd60008051602062005fa983398151915287620031ae565b620016276000805160206200602983398151915260008051602062005e89833981519152620031ba565b6200164260008051602062005e8983398151915287620031ae565b6200165d60008051602062005ec983398151915287620031ae565b6200168760008051602062005fe983398151915260008051602062005fc9833981519152620031ba565b620016a260008051602062005fe983398151915285620031ae565b620016bd60008051602062005fc983398151915285620031ae565b6000620016d28484600561044d600062003d57565b6073546074549192506001600160401b03600160401b909104811691168082146200171057604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b0381811660008181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620018119695831695600160581b9091049092169360769360779391929190911690600401620051f0565b600060405180830381600087803b1580156200182c57600080fd5b505af115801562001841573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff8516815260008051602062005f6983398151915293506020019150620018789050565b60405180910390a1505050505050505050565b600060865460646200189e919062005256565b905090565b60008051602062005ee9833981519152620018be8162003280565b63ffffffff82161580620018dd5750607e5463ffffffff908116908316115b15620018fc57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200194357604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b60008051602062006009833981519152620019a98162003280565b63ffffffff88161580620019c85750607e5463ffffffff908116908916115b15620019e757604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff161515900362001a2e57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001a6c576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062001a879063ffffffff1662005270565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001ad590620047a4565b62001ae39392919062005296565b604051809103906000f08015801562001b00573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001d74949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001db4908d908d9088908e908e908e90600401620052cd565b600060405180830381600087803b15801562001dcf57600080fd5b505af115801562001de4573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001e1e90878787878762003f7c565b979650505050505050565b606f5460ff161562001e4e57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001e9d92600160c01b9004811691166200511a565b6001600160401b0316111562001ec657604051638a0704d360e01b815260040160405180910390fd5b6103e862001ed5888862005330565b6001600160401b0316111562001efe57604051635acfba9d60e11b815260040160405180910390fd5b62001f10818989898989898962003614565b62001f1c8187620040b7565b6085546001600160401b03166000036200202a57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001f98576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001fd1620026b0565b6040518263ffffffff1660e01b815260040162001ff091815260200190565b600060405180830381600087803b1580156200200b57600080fd5b505af115801562002020573d6000803e3d6000fd5b50505050620020f4565b6200203581620042b4565b600681018054600160801b90046001600160401b0316906010620020598362005353565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b48887896040516200213a93929190620050e3565b60405180910390a3505050505050505050565b606f5460ff16156200217257604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602052604090206200219981898989898989896200328c565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620021f862003c02565b505050505050505050565b80516080805463ffffffff191663ffffffff90921691909117905560005b8151811015620013a2578181815181106200224057620022406200537a565b6020026020010151608160008360016200225b919062005390565b63ffffffff168152602081019190915260400160002060050155806200228181620053a6565b91505062002221565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162002306919062004ea4565b602060405180830381865afa15801562002324573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200234a9190620053c2565b60845490915060009062002371906001600160401b03600160401b82048116911662005330565b6001600160401b03169050806000036200238e5760009250505090565b6200239a8183620053f2565b9250505090565b606f5460009060ff1615620023c957604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362002401576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200242c57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff8116600090815260816020526040812060848054919287926200245f9084906001600160401b03166200511a565b82546101009290920a6001600160401b03818102199093169183160217909155600683015416905060006200249587836200511a565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200252483620042b4565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a25826040516200255c9190620047b2565b60405180910390a29695505050505050565b60008051602062005fa9833981519152620025898162003280565b606f5460ff16620025c4576085546001600160401b0390811690831610620025c45760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759062001293908490620047b2565b60008051602062005fa98339815191526200262c8162003280565b62015180826001600160401b031611156200265a57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289062001293908490620047b2565b60805460009063ffffffff16808203620026cc57506000919050565b6000816001600160401b03811115620026e957620026e962004b6c565b60405190808252806020026020018201604052801562002713578160200160208202803683370190505b50905060005b828110156200278657608160006200273383600162005390565b63ffffffff1663ffffffff168152602001908152602001600020600501548282815181106200276657620027666200537a565b6020908102919091010152806200277d81620053a6565b91505062002719565b50600060205b83600114620029ca576000620027a460028662005409565b620027b1600287620053f2565b620027bd919062005390565b90506000816001600160401b03811115620027dc57620027dc62004b6c565b60405190808252806020026020018201604052801562002806578160200160208202803683370190505b50905060005b828110156200297e576200282260018462005420565b811480156200283d57506200283960028862005409565b6001145b15620028bd57856200285182600262005256565b815181106200286457620028646200537a565b6020026020010151856040516020016200288092919062005436565b60405160208183030381529060405280519060200120828281518110620028ab57620028ab6200537a565b60200260200101818152505062002969565b85620028cb82600262005256565b81518110620028de57620028de6200537a565b602002602001015186826002620028f6919062005256565b6200290390600162005390565b815181106200291657620029166200537a565b60200260200101516040516020016200293192919062005436565b604051602081830303815290604052805190602001208282815181106200295c576200295c6200537a565b6020026020010181815250505b806200297581620053a6565b9150506200280c565b5080945081955083846040516020016200299a92919062005436565b6040516020818303038152906040528051906020012093508280620029bf9062005444565b93505050506200278c565b600083600081518110620029e257620029e26200537a565b6020026020010151905060005b8281101562002a6857818460405160200162002a0d92919062005436565b604051602081830303815290604052805190602001209150838460405160200162002a3a92919062005436565b604051602081830303815290604052805190602001209350808062002a5f90620053a6565b915050620029ef565b5095945050505050565b60008051602062005ea983398151915262002a8d8162003280565b63ffffffff8416158062002aac5750607e5463ffffffff908116908516115b1562002acb57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002b0c576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002b5b57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002ba257604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002be057604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002c608462000dfe565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002cb59216908b908b906004016200545e565b600060405180830381600087803b15801562002cd057600080fd5b505af115801562002ce5573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005ec983398151915262002d5a8162003280565b683635c9adc5dea0000082118062002d755750633b9aca0082105b1562002d9457604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001293565b62002dd58262001335565b62002de08162003280565b620011ee838362003ced565b60008051602062005f2983398151915262002e078162003280565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002e6357600080fd5b505af115801562002e78573d6000803e3d6000fd5b5050505062002e866200437f565b50565b60008051602062005f8983398151915262002ea48162003280565b6001600160401b03841660009081526083602052604090205463ffffffff161562002ee2576040516337c8fe0960e11b815260040160405180910390fd5b600062002ef3888888888762003d57565b60008080526002909101602052604090209390935550505050505050565b60008051602062005f0983398151915262002f2c8162003280565b607e805460009190829062002f479063ffffffff1662005270565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620030ea969594939291906200549e565b60405180910390a25050505050505050565b6085546001600160401b038281166000908152600485016020526040812054909242926200312f9291811691166200511a565b6001600160401b031611159392505050565b600054610100900460ff16620013335760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b89565b620013a2828262003c81565b6000620031c78362001335565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6006810154600090600160801b90046001600160401b03161562003263575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002e868133620043d8565b60078801546000906001600160401b039081169087161015620032c25760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620033635760068901546001600160401b03600160801b909104811690891611156200330c5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200335c57604051632bd2e3e760e01b815260040160405180910390fd5b50620033d8565b506001600160401b0385166000908152600289016020526040902054806200339e576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620033d857604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620034115750876001600160401b0316876001600160401b031611155b8062003435575060068901546001600160401b03600160c01b909104811690881611155b15620034545760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b90048116908616146200349b576040516332a2a77f60e01b815260040160405180910390fd5b6000620034ad8a888888868962003f7c565b9050600060008051602062005f49833981519152600283604051620034d39190620054eb565b602060405180830381855afa158015620034f1573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620035169190620053c2565b62003522919062005409565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620035669188919060040162005509565b602060405180830381865afa15801562003584573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620035aa919062005546565b620035c8576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620036075760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620036228a6200320f565b60078b01549091506001600160401b039081169089161015620036585760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620036fb5760068a01546001600160401b03600160801b9091048116908a161115620036a25760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620036f457604051632bd2e3e760e01b815260040160405180910390fd5b506200376b565b6001600160401b038816600090815260028b01602052604090205491508162003737576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200376b57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b0316116200379e5760405163b9b18f5760e01b815260040160405180910390fd5b6000620037b08b8a8a8a878b62003f7c565b9050600060008051602062005f49833981519152600283604051620037d69190620054eb565b602060405180830381855afa158015620037f4573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620038199190620053c2565b62003825919062005409565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620038699189919060040162005509565b602060405180830381865afa15801562003887573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620038ad919062005546565b620038cb576040516309bde33960e01b815260040160405180910390fd5b6000620038d9848b62005330565b90506200393287826001600160401b0316620038f4620022b5565b62003900919062005256565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004402565b80608460088282829054906101000a90046001600160401b03166200395891906200511a565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b158015620039e857600080fd5b505af1158015620039fd573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003a4f575060068201546001600160401b03600160801b9091048116908216115b1562003a6e5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003b2a620026b0565b6040518263ffffffff1660e01b815260040162003b4991815260200190565b600060405180830381600087803b15801562003b6457600080fd5b505af115801562003b79573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003c5e57600080fd5b505af115801562003c73573d6000803e3d6000fd5b505050506200133362004456565b62003c8d82826200228a565b620013a25760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003cf982826200228a565b15620013a25760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b608080546000918291829062003d739063ffffffff1662005270565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000866001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508060826000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150868260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550858260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550838260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003f6a94939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003fb2575081155b1562003fd15760405163340c614f60e11b815260040160405180910390fd5b8062003ff0576040516366385b5160e01b815260040160405180910390fd5b62003ffb84620044b3565b62004019576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b6000620040c4836200320f565b905081600080620040d6848462005330565b6085546001600160401b039182169250600091620040fd91600160401b9004164262005420565b90505b846001600160401b0316846001600160401b03161462004187576001600160401b0380851660009081526003890160205260409020600181015490911682101562004162576001810154600160401b90046001600160401b0316945062004180565b6200416e868662005330565b6001600160401b031693505062004187565b5062004100565b600062004195848462005420565b905083811015620041f357808403600c8111620041b35780620041b6565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620041e857620041e8620053dc565b04608655506200426b565b838103600c811162004206578062004209565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a76400000281620042435762004243620053dc565b04905080608654670de0b6b3a76400000281620042645762004264620053dc565b0460865550505b683635c9adc5dea0000060865411156200429257683635c9adc5dea00000608655620042aa565b633b9aca006086541015620042aa57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002e86576006810154600090620042ff90600160c01b90046001600160401b031660016200511a565b90506200430d8282620030fc565b15620013a25760068201546000906002906200433b908490600160801b90046001600160401b031662005330565b6200434791906200556a565b6200435390836200511a565b9050620043618382620030fc565b156200437357620011ee838262003a10565b620011ee838362003a10565b606f5460ff16620043a357604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b620043e482826200228a565b620013a257604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620011ee90849062004539565b606f5460ff16156200447b57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b038316108015620044ea575067ffffffff00000001604083901c6001600160401b0316105b80156200450b575067ffffffff00000001608083901c6001600160401b0316105b801562004523575067ffffffff0000000160c083901c105b156200453157506001919050565b506000919050565b600062004590826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620046129092919063ffffffff16565b805190915015620011ee5780806020019051810190620045b1919062005546565b620011ee5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b89565b60606200462384846000856200462b565b949350505050565b6060824710156200468e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b89565b600080866001600160a01b03168587604051620046ac9190620054eb565b60006040518083038185875af1925050503d8060008114620046eb576040519150601f19603f3d011682016040523d82523d6000602084013e620046f0565b606091505b509150915062001e1e87838387606083156200477157825160000362004769576001600160a01b0385163b620047695760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b89565b508162004623565b620046238383815115620047885781518083602001fd5b8060405162461bcd60e51b815260040162000b89919062004db2565b6108f5806200559483390190565b6001600160401b0391909116815260200190565b803563ffffffff811681146200327b57600080fd5b80356001600160401b03811681146200327b57600080fd5b600080604083850312156200480757600080fd5b6200481283620047c6565b91506200482260208401620047db565b90509250929050565b6001600160a01b038116811462002e8657600080fd5b60008060008060008060c087890312156200485b57600080fd5b863562004868816200482b565b95506200487860208801620047db565b94506200488860408801620047db565b935060608701356200489a816200482b565b92506080870135620048ac816200482b565b915060a0870135620048be816200482b565b809150509295509295509295565b600060208284031215620048df57600080fd5b62000b3e82620047c6565b80610300810183101562000b4157600080fd5b6000806000806000806000806103e0898b0312156200491b57600080fd5b6200492689620047c6565b97506200493660208a01620047db565b96506200494660408a01620047db565b95506200495660608a01620047db565b94506200496660808a01620047db565b935060a0890135925060c08901359150620049858a60e08b01620048ea565b90509295985092959890939650565b6000806000806000806000806103e0898b031215620049b257600080fd5b620049bd89620047c6565b9750620049cd60208a01620047db565b9650620049dd60408a01620047db565b9550620049ed60608a01620047db565b94506080890135935060a0890135925060c089013562004a0d816200482b565b9150620049858a60e08b01620048ea565b60006020828403121562004a3157600080fd5b813561ffff8116811462004a4457600080fd5b9392505050565b60006020828403121562004a5e57600080fd5b5035919050565b6000806040838503121562004a7957600080fd5b82359150602083013562004a8d816200482b565b809150509250929050565b60006020828403121562004aab57600080fd5b62000b3e82620047db565b600080600080600080600080610100898b03121562004ad457600080fd5b883562004ae1816200482b565b975062004af160208a01620047db565b965062004b0160408a01620047db565b9550606089013562004b13816200482b565b9450608089013562004b25816200482b565b935060a089013562004b37816200482b565b925060c089013562004b49816200482b565b915060e089013562004b5b816200482b565b809150509295985092959890939650565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562004bad5762004bad62004b6c565b604052919050565b600082601f83011262004bc757600080fd5b81356001600160401b0381111562004be35762004be362004b6c565b62004bf8601f8201601f191660200162004b82565b81815284602083860101111562004c0e57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600080600060e0888a03121562004c4757600080fd5b62004c5288620047c6565b965062004c6260208901620047db565b9550604088013562004c74816200482b565b9450606088013562004c86816200482b565b9350608088013562004c98816200482b565b925060a08801356001600160401b038082111562004cb557600080fd5b62004cc38b838c0162004bb5565b935060c08a013591508082111562004cda57600080fd5b5062004ce98a828b0162004bb5565b91505092959891949750929550565b60008060008060008060c0878903121562004d1257600080fd5b62004d1d87620047c6565b955062004d2d60208801620047db565b945062004d3d60408801620047db565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004d7b57818101518382015260200162004d61565b50506000910152565b6000815180845262004d9e81602086016020860162004d5e565b601f01601f19169290920160200192915050565b60208152600062000b3e602083018462004d84565b6000602080838503121562004ddb57600080fd5b82356001600160401b038082111562004df357600080fd5b818501915085601f83011262004e0857600080fd5b81358181111562004e1d5762004e1d62004b6c565b8060051b915062004e3084830162004b82565b818152918301840191848101908884111562004e4b57600080fd5b938501935b8385101562004e6b5784358252938501939085019062004e50565b98975050505050505050565b6000806040838503121562004e8b57600080fd5b62004e9683620047db565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000806000806060858703121562004ecf57600080fd5b843562004edc816200482b565b935062004eec60208601620047c6565b925060408501356001600160401b038082111562004f0957600080fd5b818701915087601f83011262004f1e57600080fd5b81358181111562004f2e57600080fd5b88602082850101111562004f4157600080fd5b95989497505060200194505050565b60006020828403121562004f6357600080fd5b813562004a44816200482b565b803560ff811681146200327b57600080fd5b60008060008060008060c0878903121562004f9c57600080fd5b863562004fa9816200482b565b9550602087013562004fbb816200482b565b945062004fcb60408801620047db565b935062004fdb60608801620047db565b92506080870135915062004ff260a0880162004f70565b90509295509295509295565b60008060008060008060c087890312156200501857600080fd5b863562005025816200482b565b9550602087013562005037816200482b565b94506200504760408801620047db565b9350620050576060880162004f70565b92506080870135915060a08701356001600160401b038111156200507a57600080fd5b6200508889828a0162004bb5565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b038181168382160190808211156200513d576200513d62005104565b5092915050565b8054600090600181811c90808316806200515f57607f831692505b602080841082036200518157634e487b7160e01b600052602260045260246000fd5b838852602088018280156200519f5760018114620051b657620051e3565b60ff198716825285151560051b82019750620051e3565b60008981526020902060005b87811015620051dd57815484820152908601908401620051c2565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c0604082018190526000906200521e9083018762005144565b828103606084015262005232818762005144565b608084019590955250506001600160401b039190911660a090910152949350505050565b808202811582820484141762000b415762000b4162005104565b600063ffffffff8083168181036200528c576200528c62005104565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620052c49083018462004d84565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190526000906200530f9083018562004d84565b82810360a084015262005323818562004d84565b9998505050505050505050565b6001600160401b038281168282160390808211156200513d576200513d62005104565b60006001600160401b038281166002600160401b031981016200528c576200528c62005104565b634e487b7160e01b600052603260045260246000fd5b8082018082111562000b415762000b4162005104565b600060018201620053bb57620053bb62005104565b5060010190565b600060208284031215620053d557600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082620054045762005404620053dc565b500490565b6000826200541b576200541b620053dc565b500690565b8181038181111562000b415762000b4162005104565b918252602082015260400190565b60008162005456576200545662005104565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a0820181905260009062004e6b9083018462004d84565b60008251620054ff81846020870162004d5e565b9190910192915050565b61032081016103008085843782018360005b60018110156200553c5781518352602092830192909101906001016200551b565b5050509392505050565b6000602082840312156200555957600080fd5b8151801515811462004a4457600080fd5b60006001600160401b0383811680620055875762005587620053dc565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220a19e7a72432195d9a35c7ce8fa5f1284415aac66bb1ad08a4c2e1c252fd8690864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a26469706673582212203ed109761baf62dbc1fa9f0e36ec13a862f69b70da8979a56e488b9e97261de064736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonRollupManagerMockInternalTest.json b/compiled-contracts/paris/PolygonRollupManagerMockInternalTest.json index a21ebcfe4..8fa0a67c0 100644 --- a/compiled-contracts/paris/PolygonRollupManagerMockInternalTest.json +++ b/compiled-contracts/paris/PolygonRollupManagerMockInternalTest.json @@ -1969,8 +1969,8 @@ "type": "function" } ], - "bytecode": "0x60e06040523480156200001157600080fd5b50604051620060423803806200604283398101604081905262000034916200006b565b6001600160a01b0392831660805290821660c0521660a052620000bf565b6001600160a01b03811681146200006857600080fd5b50565b6000806000606084860312156200008157600080fd5b83516200008e8162000052565b6020850151909350620000a18162000052565b6040850151909250620000b48162000052565b809150509250925092565b60805160a05160c051615f1b620001276000396000818161099901528181612210015261386001526000818161075f01528181612d5f0152613b5a0152600081816108f301528181610ea70152818161105701528181611f770152613a490152615f1b6000f3fe60806040523480156200001157600080fd5b50600436106200029e5760003560e01c8063066ec01214620002a3578063080b311114620002cf5780630a0d9fbe14620002f75780630e36f582146200031257806311f6b287146200032b57806312b86e1914620003425780631489ed10146200035957806315064c9614620003705780631608859c146200037e5780631796a1ae14620003955780631816b7e514620003bc5780632072f6c514620003d3578063248a9ca314620003dd5780632528016914620004035780632f2ff15d14620004b857806336568abe14620004cf578063394218e914620004e6578063477fa27014620004fd5780634d4d3338146200050657806355a71ee0146200051d57806360469169146200056157806365c0504d146200056b5780637222020f146200061a578063727885e914620006315780637975fcfe14620006485780637fb6e76a146200066e578063841b24d7146200069757806387c20c0114620006b25780638bd4f07114620006c957806391d1485414620006e057806399f5634e14620006f75780639a908e7314620007015780639c9f3dfe1462000718578063a066215c146200072f578063a217fddf1462000746578063a2967d99146200074f578063a3c573eb1462000759578063afd23cbe1462000790578063b99d0ad714620007ba578063c1acbc341462000892578063c4c928c214620008ad578063ceee281d14620008c4578063d02103ca14620008ed578063d5073f6f1462000915578063d547741f146200092c578063d939b3151462000943578063dbc169761462000957578063dde0ff771462000961578063e0bfd3d2146200097c578063e46761c41462000993578063f34eb8eb14620009bb578063f4e9267514620009d2578063f9c4c2ae14620009e3575b600080fd5b608454620002b7906001600160401b031681565b604051620002c6919062004708565b60405180910390f35b620002e6620002e036600462004749565b62000afa565b6040519015158152602001620002c6565b608554620002b790600160401b90046001600160401b031681565b620003296200032336600462004797565b62000b24565b005b620002b76200033c36600462004822565b62000ddb565b620003296200035336600462004853565b62000dfb565b620003296200036a366004620048ea565b62000fab565b606f54620002e69060ff1681565b620003296200038f36600462004749565b6200113b565b607e54620003a69063ffffffff1681565b60405163ffffffff9091168152602001620002c6565b62000329620003cd36600462004974565b620011d0565b620003296200127c565b620003f4620003ee366004620049a1565b62001312565b604051908152602001620002c6565b620004846200041436600462004749565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002c6565b62000329620004c9366004620049bb565b62001327565b62000329620004e0366004620049bb565b62001349565b62000329620004f7366004620049ee565b62001383565b608654620003f4565b620003296200051736600462004a0c565b62001432565b620003f46200052e36600462004749565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620003f462001868565b620005d06200057c36600462004822565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002c6565b620003296200062b36600462004822565b62001880565b620003296200064236600462004b6c565b6200196b565b6200065f6200065936600462004c39565b62001dd3565b604051620002c6919062004cf3565b620003a66200067f366004620049ee565b60836020526000908152604090205463ffffffff1681565b608454620002b790600160c01b90046001600160401b031681565b62000329620006c3366004620048ea565b62001e06565b62000329620006da36600462004853565b6200212a565b620002e6620006f1366004620049bb565b620021e0565b620003f46200220b565b620002b76200071236600462004d08565b620022f7565b6200032962000729366004620049ee565b620024c4565b6200032962000740366004620049ee565b62002567565b620003f4600081565b620003f462002606565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b604051620002c6919062004d35565b608554620007a690600160801b900461ffff1681565b60405161ffff9091168152602001620002c6565b62000850620007cb36600462004749565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002c6919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002b790600160801b90046001600160401b031681565b62000329620008be36600462004d49565b620029c8565b620003a6620008d536600462004de1565b60826020526000908152604090205463ffffffff1681565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b6200032962000926366004620049a1565b62002c95565b620003296200093d366004620049bb565b62002d20565b608554620002b7906001600160401b031681565b6200032962002d42565b608454620002b790600160401b90046001600160401b031681565b620003296200098d36600462004e13565b62002ddf565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b62000329620009cc36600462004e8f565b62002e67565b608054620003a69063ffffffff1681565b62000a7a620009f436600462004822565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002c6565b63ffffffff8216600090815260816020526040812062000b1b908362003052565b90505b92915050565b600054600290610100900460ff1615801562000b47575060005460ff8083169116105b62000b6f5760405162461bcd60e51b815260040162000b669062004f26565b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000bf062003097565b62000c0b60008051602062005ec68339815191528862003104565b62000c1860008462003104565b62000c3360008051602062005da68339815191528462003104565b62000c4e60008051602062005e268339815191528462003104565b62000c6960008051602062005d468339815191528462003104565b62000c8460008051602062005d868339815191528562003104565b62000c9f60008051602062005ea68339815191528562003104565b62000cba60008051602062005dc68339815191528562003104565b62000cd560008051602062005e468339815191528562003104565b62000cff60008051602062005ec683398151915260008051602062005d2683398151915262003110565b62000d1a60008051602062005d268339815191528562003104565b62000d3560008051602062005d668339815191528562003104565b62000d5f60008051602062005e8683398151915260008051602062005e6683398151915262003110565b62000d7a60008051602062005e868339815191528362003104565b62000d9560008051602062005e668339815191528362003104565b62000da260003362003104565b6000805461ff001916905560405160ff8216815260008051602062005e068339815191529060200160405180910390a150505050505050565b63ffffffff8116600090815260816020526040812062000b1e9062003165565b60008051602062005ec683398151915262000e1681620031d6565b63ffffffff8916600090815260816020526040902062000e3d818a8a8a8a8a8a8a620031e2565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000ea5576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000ede62002606565b6040518263ffffffff1660e01b815260040162000efd91815260200190565b600060405180830381600087803b15801562000f1857600080fd5b505af115801562000f2d573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005ec683398151915262000fc681620031d6565b63ffffffff8916600090815260816020526040902062000fed818a8a8a8a8a8a8a6200356a565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562001055576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200108e62002606565b6040518263ffffffff1660e01b8152600401620010ad91815260200190565b600060405180830381600087803b158015620010c857600080fd5b505af1158015620010dd573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a604051620011279392919062004f74565b60405180910390a350505050505050505050565b63ffffffff821660009081526081602052604090206200116b60008051602062005ec683398151915233620021e0565b620011bf57606f5460ff16156200119557604051630bc011ff60e21b815260040160405180910390fd5b620011a1818362003052565b620011bf57604051630674f25160e11b815260040160405180910390fd5b620011cb818362003966565b505050565b60008051602062005e46833981519152620011eb81620031d6565b6103e88261ffff1610806200120557506103ff8261ffff16115b156200122457604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200129760008051602062005e8683398151915233620021e0565b6200130657608454600160801b90046001600160401b03161580620012e757506084544290620012dc9062093a8090600160801b90046001600160401b031662004fab565b6001600160401b0316115b15620013065760405163692baaad60e11b815260040160405180910390fd5b6200131062003b58565b565b60009081526034602052604090206001015490565b620013328262001312565b6200133d81620031d6565b620011cb838362003bd7565b6001600160a01b03811633146200137357604051630b4ad1cd60e31b815260040160405180910390fd5b6200137f828262003c43565b5050565b60008051602062005e468339815191526200139e81620031d6565b606f5460ff16620013e0576084546001600160401b03600160c01b909104811690831610620013e05760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1906200127090849062004708565b600054600290610100900460ff1615801562001455575060005460ff8083169116105b620014745760405162461bcd60e51b815260040162000b669062004f26565b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b179055620014f562003097565b6200151060008051602062005ec68339815191528a62003104565b6200151d60008662003104565b6200153860008051602062005da68339815191528662003104565b6200155360008051602062005e268339815191528662003104565b6200156e60008051602062005d468339815191528662003104565b6200158960008051602062005d868339815191528762003104565b620015a460008051602062005ea68339815191528762003104565b620015bf60008051602062005dc68339815191528762003104565b620015da60008051602062005e468339815191528762003104565b6200160460008051602062005ec683398151915260008051602062005d2683398151915262003110565b6200161f60008051602062005d268339815191528762003104565b6200163a60008051602062005d668339815191528762003104565b6200166460008051602062005e8683398151915260008051602062005e6683398151915262003110565b6200167f60008051602062005e868339815191528562003104565b6200169a60008051602062005e668339815191528562003104565b6000620016af8484600561044d600062003cad565b6073546074549192506001600160401b03600160401b90910481169116808214620016ed57604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b0381811660008181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620017ee9695831695600160581b909104909216936076936077939192919091169060040162005081565b600060405180830381600087803b1580156200180957600080fd5b505af11580156200181e573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff8516815260008051602062005e0683398151915293506020019150620018559050565b60405180910390a1505050505050505050565b600060865460646200187b9190620050e7565b905090565b60008051602062005d868339815191526200189b81620031d6565b63ffffffff82161580620018ba5750607e5463ffffffff908116908316115b15620018d957604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200192057604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b60008051602062005ea68339815191526200198681620031d6565b63ffffffff88161580620019a55750607e5463ffffffff908116908916115b15620019c457604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff161515900362001a0b57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001a49576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062001a649063ffffffff1662005101565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001ab290620046fa565b62001ac09392919062005127565b604051809103906000f08015801562001add573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001d51949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001d91908d908d9088908e908e908e906004016200515e565b600060405180830381600087803b15801562001dac57600080fd5b505af115801562001dc1573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001dfb90878787878762003ed2565b979650505050505050565b606f5460ff161562001e2b57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001e7a92600160c01b90048116911662004fab565b6001600160401b0316111562001ea357604051638a0704d360e01b815260040160405180910390fd5b6103e862001eb28888620051c1565b6001600160401b0316111562001edb57604051635acfba9d60e11b815260040160405180910390fd5b62001eed81898989898989896200356a565b62001ef981876200400d565b6085546001600160401b03166000036200200757600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001f75576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001fae62002606565b6040518263ffffffff1660e01b815260040162001fcd91815260200190565b600060405180830381600087803b15801562001fe857600080fd5b505af115801562001ffd573d6000803e3d6000fd5b50505050620020d1565b62002012816200420a565b600681018054600160801b90046001600160401b03169060106200203683620051e4565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b4888789604051620021179392919062004f74565b60405180910390a3505050505050505050565b606f5460ff16156200214f57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88166000908152608160205260409020620021768189898989898989620031e2565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620021d562003b58565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016200225c919062004d35565b602060405180830381865afa1580156200227a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620022a091906200520b565b608454909150600090620022c7906001600160401b03600160401b820481169116620051c1565b6001600160401b0316905080600003620022e45760009250505090565b620022f081836200523b565b9250505090565b606f5460009060ff16156200231f57604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362002357576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200238257604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620023b59084906001600160401b031662004fab565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620023eb878362004fab565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200247a836200420a565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a2582604051620024b2919062004708565b60405180910390a29695505050505050565b60008051602062005e46833981519152620024df81620031d6565b606f5460ff166200251a576085546001600160401b03908116908316106200251a5760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75906200127090849062004708565b60008051602062005e468339815191526200258281620031d6565b62015180826001600160401b03161115620025b057604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28906200127090849062004708565b60805460009063ffffffff168082036200262257506000919050565b6000816001600160401b038111156200263f576200263f62004ac2565b60405190808252806020026020018201604052801562002669578160200160208202803683370190505b50905060005b82811015620026dc57608160006200268983600162005252565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620026bc57620026bc62005268565b602090810291909101015280620026d3816200527e565b9150506200266f565b50600060205b8360011462002920576000620026fa6002866200529a565b620027076002876200523b565b62002713919062005252565b90506000816001600160401b0381111562002732576200273262004ac2565b6040519080825280602002602001820160405280156200275c578160200160208202803683370190505b50905060005b82811015620028d45762002778600184620052b1565b811480156200279357506200278f6002886200529a565b6001145b15620028135785620027a7826002620050e7565b81518110620027ba57620027ba62005268565b602002602001015185604051602001620027d6929190620052c7565b6040516020818303038152906040528051906020012082828151811062002801576200280162005268565b602002602001018181525050620028bf565b8562002821826002620050e7565b8151811062002834576200283462005268565b6020026020010151868260026200284c9190620050e7565b6200285990600162005252565b815181106200286c576200286c62005268565b602002602001015160405160200162002887929190620052c7565b60405160208183030381529060405280519060200120828281518110620028b257620028b262005268565b6020026020010181815250505b80620028cb816200527e565b91505062002762565b508094508195508384604051602001620028f0929190620052c7565b60405160208183030381529060405280519060200120935082806200291590620052d5565b9350505050620026e2565b60008360008151811062002938576200293862005268565b6020026020010151905060005b82811015620029be57818460405160200162002963929190620052c7565b604051602081830303815290604052805190602001209150838460405160200162002990929190620052c7565b6040516020818303038152906040528051906020012093508080620029b5906200527e565b91505062002945565b5095945050505050565b60008051602062005d46833981519152620029e381620031d6565b63ffffffff8416158062002a025750607e5463ffffffff908116908516115b1562002a2157604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002a62576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002ab157604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002af857604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002b3657604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002bb68462000ddb565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002c0b9216908b908b90600401620052ef565b600060405180830381600087803b15801562002c2657600080fd5b505af115801562002c3b573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005d6683398151915262002cb081620031d6565b683635c9adc5dea0000082118062002ccb5750633b9aca0082105b1562002cea57604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001270565b62002d2b8262001312565b62002d3681620031d6565b620011cb838362003c43565b60008051602062005dc683398151915262002d5d81620031d6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002db957600080fd5b505af115801562002dce573d6000803e3d6000fd5b5050505062002ddc620042d5565b50565b60008051602062005e2683398151915262002dfa81620031d6565b6001600160401b03841660009081526083602052604090205463ffffffff161562002e38576040516337c8fe0960e11b815260040160405180910390fd5b600062002e49888888888762003cad565b60008080526002909101602052604090209390935550505050505050565b60008051602062005da683398151915262002e8281620031d6565b607e805460009190829062002e9d9063ffffffff1662005101565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162003040969594939291906200532f565b60405180910390a25050505050505050565b6085546001600160401b038281166000908152600485016020526040812054909242926200308592918116911662004fab565b6001600160401b031611159392505050565b600054610100900460ff16620013105760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b66565b6200137f828262003bd7565b60006200311d8362001312565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6006810154600090600160801b90046001600160401b031615620031b9575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002ddc81336200432e565b60078801546000906001600160401b039081169087161015620032185760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620032b95760068901546001600160401b03600160801b90910481169089161115620032625760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b9092041614620032b257604051632bd2e3e760e01b815260040160405180910390fd5b506200332e565b506001600160401b038516600090815260028901602052604090205480620032f4576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b909104811690871611156200332e57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620033675750876001600160401b0316876001600160401b031611155b806200338b575060068901546001600160401b03600160c01b909104811690881611155b15620033aa5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b9004811690861614620033f1576040516332a2a77f60e01b815260040160405180910390fd5b6000620034038a888888868962003ed2565b9050600060008051602062005de683398151915260028360405162003429919062005388565b602060405180830381855afa15801562003447573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200346c91906200520b565b6200347891906200529a565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620034bc91889190600401620053a6565b602060405180830381865afa158015620034da573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620035009190620053e3565b6200351e576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c0160205260409020600201548590036200355d5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620035788a62003165565b60078b01549091506001600160401b039081169089161015620035ae5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620036515760068a01546001600160401b03600160801b9091048116908a161115620035f85760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200364a57604051632bd2e3e760e01b815260040160405180910390fd5b50620036c1565b6001600160401b038816600090815260028b0160205260409020549150816200368d576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b03161115620036c157604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620036f45760405163b9b18f5760e01b815260040160405180910390fd5b6000620037068b8a8a8a878b62003ed2565b9050600060008051602062005de68339815191526002836040516200372c919062005388565b602060405180830381855afa1580156200374a573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200376f91906200520b565b6200377b91906200529a565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620037bf91899190600401620053a6565b602060405180830381865afa158015620037dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620038039190620053e3565b62003821576040516309bde33960e01b815260040160405180910390fd5b60006200382f848b620051c1565b90506200388887826001600160401b03166200384a6200220b565b620038569190620050e7565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004358565b80608460088282829054906101000a90046001600160401b0316620038ae919062004fab565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b1580156200393e57600080fd5b505af115801562003953573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b9091048116908216111580620039a5575060068201546001600160401b03600160801b9091048116908216115b15620039c45760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003a8062002606565b6040518263ffffffff1660e01b815260040162003a9f91815260200190565b600060405180830381600087803b15801562003aba57600080fd5b505af115801562003acf573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003bb457600080fd5b505af115801562003bc9573d6000803e3d6000fd5b5050505062001310620043ac565b62003be38282620021e0565b6200137f5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003c4f8282620021e0565b156200137f5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b608080546000918291829062003cc99063ffffffff1662005101565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000866001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508060826000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150868260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550858260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550838260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003ec094939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003f08575081155b1562003f275760405163340c614f60e11b815260040160405180910390fd5b8062003f46576040516366385b5160e01b815260040160405180910390fd5b62003f518462004409565b62003f6f576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b60006200401a8362003165565b9050816000806200402c8484620051c1565b6085546001600160401b0391821692506000916200405391600160401b90041642620052b1565b90505b846001600160401b0316846001600160401b031614620040dd576001600160401b03808516600090815260038901602052604090206001810154909116821015620040b8576001810154600160401b90046001600160401b03169450620040d6565b620040c48686620051c1565b6001600160401b0316935050620040dd565b5062004056565b6000620040eb8484620052b1565b9050838110156200414957808403600c81116200410957806200410c565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a60865402816200413e576200413e62005225565b0460865550620041c1565b838103600c81116200415c57806200415f565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162004199576200419962005225565b04905080608654670de0b6b3a76400000281620041ba57620041ba62005225565b0460865550505b683635c9adc5dea000006086541115620041e857683635c9adc5dea0000060865562004200565b633b9aca0060865410156200420057633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002ddc5760068101546000906200425590600160c01b90046001600160401b0316600162004fab565b905062004263828262003052565b156200137f57600682015460009060029062004291908490600160801b90046001600160401b0316620051c1565b6200429d919062005407565b620042a9908362004fab565b9050620042b7838262003052565b15620042c957620011cb838262003966565b620011cb838362003966565b606f5460ff16620042f957604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6200433a8282620021e0565b6200137f57604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620011cb9084906200448f565b606f5460ff1615620043d157604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b03831610801562004440575067ffffffff00000001604083901c6001600160401b0316105b801562004461575067ffffffff00000001608083901c6001600160401b0316105b801562004479575067ffffffff0000000160c083901c105b156200448757506001919050565b506000919050565b6000620044e6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620045689092919063ffffffff16565b805190915015620011cb5780806020019051810190620045079190620053e3565b620011cb5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b66565b606062004579848460008562004581565b949350505050565b606082471015620045e45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b66565b600080866001600160a01b0316858760405162004602919062005388565b60006040518083038185875af1925050503d806000811462004641576040519150601f19603f3d011682016040523d82523d6000602084013e62004646565b606091505b509150915062001dfb8783838760608315620046c7578251600003620046bf576001600160a01b0385163b620046bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b66565b508162004579565b620045798383815115620046de5781518083602001fd5b8060405162461bcd60e51b815260040162000b66919062004cf3565b6108f5806200543183390190565b6001600160401b0391909116815260200190565b803563ffffffff81168114620031d157600080fd5b80356001600160401b0381168114620031d157600080fd5b600080604083850312156200475d57600080fd5b62004768836200471c565b9150620047786020840162004731565b90509250929050565b6001600160a01b038116811462002ddc57600080fd5b60008060008060008060c08789031215620047b157600080fd5b8635620047be8162004781565b9550620047ce6020880162004731565b9450620047de6040880162004731565b93506060870135620047f08162004781565b92506080870135620048028162004781565b915060a0870135620048148162004781565b809150509295509295509295565b6000602082840312156200483557600080fd5b62000b1b826200471c565b80610300810183101562000b1e57600080fd5b6000806000806000806000806103e0898b0312156200487157600080fd5b6200487c896200471c565b97506200488c60208a0162004731565b96506200489c60408a0162004731565b9550620048ac60608a0162004731565b9450620048bc60808a0162004731565b935060a0890135925060c08901359150620048db8a60e08b0162004840565b90509295985092959890939650565b6000806000806000806000806103e0898b0312156200490857600080fd5b62004913896200471c565b97506200492360208a0162004731565b96506200493360408a0162004731565b95506200494360608a0162004731565b94506080890135935060a0890135925060c0890135620049638162004781565b9150620048db8a60e08b0162004840565b6000602082840312156200498757600080fd5b813561ffff811681146200499a57600080fd5b9392505050565b600060208284031215620049b457600080fd5b5035919050565b60008060408385031215620049cf57600080fd5b823591506020830135620049e38162004781565b809150509250929050565b60006020828403121562004a0157600080fd5b62000b1b8262004731565b600080600080600080600080610100898b03121562004a2a57600080fd5b883562004a378162004781565b975062004a4760208a0162004731565b965062004a5760408a0162004731565b9550606089013562004a698162004781565b9450608089013562004a7b8162004781565b935060a089013562004a8d8162004781565b925060c089013562004a9f8162004781565b915060e089013562004ab18162004781565b809150509295985092959890939650565b634e487b7160e01b600052604160045260246000fd5b600082601f83011262004aea57600080fd5b81356001600160401b038082111562004b075762004b0762004ac2565b604051601f8301601f19908116603f0116810190828211818310171562004b325762004b3262004ac2565b8160405283815286602085880101111562004b4c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121562004b8857600080fd5b62004b93886200471c565b965062004ba36020890162004731565b9550604088013562004bb58162004781565b9450606088013562004bc78162004781565b9350608088013562004bd98162004781565b925060a08801356001600160401b038082111562004bf657600080fd5b62004c048b838c0162004ad8565b935060c08a013591508082111562004c1b57600080fd5b5062004c2a8a828b0162004ad8565b91505092959891949750929550565b60008060008060008060c0878903121562004c5357600080fd5b62004c5e876200471c565b955062004c6e6020880162004731565b945062004c7e6040880162004731565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004cbc57818101518382015260200162004ca2565b50506000910152565b6000815180845262004cdf81602086016020860162004c9f565b601f01601f19169290920160200192915050565b60208152600062000b1b602083018462004cc5565b6000806040838503121562004d1c57600080fd5b62004d278362004731565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000806000806060858703121562004d6057600080fd5b843562004d6d8162004781565b935062004d7d602086016200471c565b925060408501356001600160401b038082111562004d9a57600080fd5b818701915087601f83011262004daf57600080fd5b81358181111562004dbf57600080fd5b88602082850101111562004dd257600080fd5b95989497505060200194505050565b60006020828403121562004df457600080fd5b81356200499a8162004781565b803560ff81168114620031d157600080fd5b60008060008060008060c0878903121562004e2d57600080fd5b863562004e3a8162004781565b9550602087013562004e4c8162004781565b945062004e5c6040880162004731565b935062004e6c6060880162004731565b92506080870135915062004e8360a0880162004e01565b90509295509295509295565b60008060008060008060c0878903121562004ea957600080fd5b863562004eb68162004781565b9550602087013562004ec88162004781565b945062004ed86040880162004731565b935062004ee86060880162004e01565b92506080870135915060a08701356001600160401b0381111562004f0b57600080fd5b62004f1989828a0162004ad8565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004fce5762004fce62004f95565b5092915050565b8054600090600181811c908083168062004ff057607f831692505b602080841082036200501257634e487b7160e01b600052602260045260246000fd5b83885260208801828015620050305760018114620050475762005074565b60ff198716825285151560051b8201975062005074565b60008981526020902060005b878110156200506e5781548482015290860190840162005053565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c060408201819052600090620050af9083018762004fd5565b8281036060840152620050c3818762004fd5565b608084019590955250506001600160401b039190911660a090910152949350505050565b808202811582820484141762000b1e5762000b1e62004f95565b600063ffffffff8083168181036200511d576200511d62004f95565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620051559083018462004cc5565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c060808201819052600090620051a09083018562004cc5565b82810360a0840152620051b4818562004cc5565b9998505050505050505050565b6001600160401b0382811682821603908082111562004fce5762004fce62004f95565b60006001600160401b038281166002600160401b031981016200511d576200511d62004f95565b6000602082840312156200521e57600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b6000826200524d576200524d62005225565b500490565b8082018082111562000b1e5762000b1e62004f95565b634e487b7160e01b600052603260045260246000fd5b60006001820162005293576200529362004f95565b5060010190565b600082620052ac57620052ac62005225565b500690565b8181038181111562000b1e5762000b1e62004f95565b918252602082015260400190565b600081620052e757620052e762004f95565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190526000906200537c9083018462004cc5565b98975050505050505050565b600082516200539c81846020870162004c9f565b9190910192915050565b61032081016103008085843782018360005b6001811015620053d9578151835260209283019290910190600101620053b8565b5050509392505050565b600060208284031215620053f657600080fd5b815180151581146200499a57600080fd5b60006001600160401b038381168062005424576200542462005225565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220a19e7a72432195d9a35c7ce8fa5f1284415aac66bb1ad08a4c2e1c252fd8690864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220dd69b4fbcb587c5752b040baae00cd409fddf9ace44ff04b8c6ce19483951df464736f6c63430008140033", - "deployedBytecode": "0x60806040523480156200001157600080fd5b50600436106200029e5760003560e01c8063066ec01214620002a3578063080b311114620002cf5780630a0d9fbe14620002f75780630e36f582146200031257806311f6b287146200032b57806312b86e1914620003425780631489ed10146200035957806315064c9614620003705780631608859c146200037e5780631796a1ae14620003955780631816b7e514620003bc5780632072f6c514620003d3578063248a9ca314620003dd5780632528016914620004035780632f2ff15d14620004b857806336568abe14620004cf578063394218e914620004e6578063477fa27014620004fd5780634d4d3338146200050657806355a71ee0146200051d57806360469169146200056157806365c0504d146200056b5780637222020f146200061a578063727885e914620006315780637975fcfe14620006485780637fb6e76a146200066e578063841b24d7146200069757806387c20c0114620006b25780638bd4f07114620006c957806391d1485414620006e057806399f5634e14620006f75780639a908e7314620007015780639c9f3dfe1462000718578063a066215c146200072f578063a217fddf1462000746578063a2967d99146200074f578063a3c573eb1462000759578063afd23cbe1462000790578063b99d0ad714620007ba578063c1acbc341462000892578063c4c928c214620008ad578063ceee281d14620008c4578063d02103ca14620008ed578063d5073f6f1462000915578063d547741f146200092c578063d939b3151462000943578063dbc169761462000957578063dde0ff771462000961578063e0bfd3d2146200097c578063e46761c41462000993578063f34eb8eb14620009bb578063f4e9267514620009d2578063f9c4c2ae14620009e3575b600080fd5b608454620002b7906001600160401b031681565b604051620002c6919062004708565b60405180910390f35b620002e6620002e036600462004749565b62000afa565b6040519015158152602001620002c6565b608554620002b790600160401b90046001600160401b031681565b620003296200032336600462004797565b62000b24565b005b620002b76200033c36600462004822565b62000ddb565b620003296200035336600462004853565b62000dfb565b620003296200036a366004620048ea565b62000fab565b606f54620002e69060ff1681565b620003296200038f36600462004749565b6200113b565b607e54620003a69063ffffffff1681565b60405163ffffffff9091168152602001620002c6565b62000329620003cd36600462004974565b620011d0565b620003296200127c565b620003f4620003ee366004620049a1565b62001312565b604051908152602001620002c6565b620004846200041436600462004749565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002c6565b62000329620004c9366004620049bb565b62001327565b62000329620004e0366004620049bb565b62001349565b62000329620004f7366004620049ee565b62001383565b608654620003f4565b620003296200051736600462004a0c565b62001432565b620003f46200052e36600462004749565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620003f462001868565b620005d06200057c36600462004822565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002c6565b620003296200062b36600462004822565b62001880565b620003296200064236600462004b6c565b6200196b565b6200065f6200065936600462004c39565b62001dd3565b604051620002c6919062004cf3565b620003a66200067f366004620049ee565b60836020526000908152604090205463ffffffff1681565b608454620002b790600160c01b90046001600160401b031681565b62000329620006c3366004620048ea565b62001e06565b62000329620006da36600462004853565b6200212a565b620002e6620006f1366004620049bb565b620021e0565b620003f46200220b565b620002b76200071236600462004d08565b620022f7565b6200032962000729366004620049ee565b620024c4565b6200032962000740366004620049ee565b62002567565b620003f4600081565b620003f462002606565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b604051620002c6919062004d35565b608554620007a690600160801b900461ffff1681565b60405161ffff9091168152602001620002c6565b62000850620007cb36600462004749565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002c6919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002b790600160801b90046001600160401b031681565b62000329620008be36600462004d49565b620029c8565b620003a6620008d536600462004de1565b60826020526000908152604090205463ffffffff1681565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b6200032962000926366004620049a1565b62002c95565b620003296200093d366004620049bb565b62002d20565b608554620002b7906001600160401b031681565b6200032962002d42565b608454620002b790600160401b90046001600160401b031681565b620003296200098d36600462004e13565b62002ddf565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b62000329620009cc36600462004e8f565b62002e67565b608054620003a69063ffffffff1681565b62000a7a620009f436600462004822565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002c6565b63ffffffff8216600090815260816020526040812062000b1b908362003052565b90505b92915050565b600054600290610100900460ff1615801562000b47575060005460ff8083169116105b62000b6f5760405162461bcd60e51b815260040162000b669062004f26565b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000bf062003097565b62000c0b60008051602062005ec68339815191528862003104565b62000c1860008462003104565b62000c3360008051602062005da68339815191528462003104565b62000c4e60008051602062005e268339815191528462003104565b62000c6960008051602062005d468339815191528462003104565b62000c8460008051602062005d868339815191528562003104565b62000c9f60008051602062005ea68339815191528562003104565b62000cba60008051602062005dc68339815191528562003104565b62000cd560008051602062005e468339815191528562003104565b62000cff60008051602062005ec683398151915260008051602062005d2683398151915262003110565b62000d1a60008051602062005d268339815191528562003104565b62000d3560008051602062005d668339815191528562003104565b62000d5f60008051602062005e8683398151915260008051602062005e6683398151915262003110565b62000d7a60008051602062005e868339815191528362003104565b62000d9560008051602062005e668339815191528362003104565b62000da260003362003104565b6000805461ff001916905560405160ff8216815260008051602062005e068339815191529060200160405180910390a150505050505050565b63ffffffff8116600090815260816020526040812062000b1e9062003165565b60008051602062005ec683398151915262000e1681620031d6565b63ffffffff8916600090815260816020526040902062000e3d818a8a8a8a8a8a8a620031e2565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000ea5576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000ede62002606565b6040518263ffffffff1660e01b815260040162000efd91815260200190565b600060405180830381600087803b15801562000f1857600080fd5b505af115801562000f2d573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005ec683398151915262000fc681620031d6565b63ffffffff8916600090815260816020526040902062000fed818a8a8a8a8a8a8a6200356a565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562001055576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200108e62002606565b6040518263ffffffff1660e01b8152600401620010ad91815260200190565b600060405180830381600087803b158015620010c857600080fd5b505af1158015620010dd573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a604051620011279392919062004f74565b60405180910390a350505050505050505050565b63ffffffff821660009081526081602052604090206200116b60008051602062005ec683398151915233620021e0565b620011bf57606f5460ff16156200119557604051630bc011ff60e21b815260040160405180910390fd5b620011a1818362003052565b620011bf57604051630674f25160e11b815260040160405180910390fd5b620011cb818362003966565b505050565b60008051602062005e46833981519152620011eb81620031d6565b6103e88261ffff1610806200120557506103ff8261ffff16115b156200122457604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200129760008051602062005e8683398151915233620021e0565b6200130657608454600160801b90046001600160401b03161580620012e757506084544290620012dc9062093a8090600160801b90046001600160401b031662004fab565b6001600160401b0316115b15620013065760405163692baaad60e11b815260040160405180910390fd5b6200131062003b58565b565b60009081526034602052604090206001015490565b620013328262001312565b6200133d81620031d6565b620011cb838362003bd7565b6001600160a01b03811633146200137357604051630b4ad1cd60e31b815260040160405180910390fd5b6200137f828262003c43565b5050565b60008051602062005e468339815191526200139e81620031d6565b606f5460ff16620013e0576084546001600160401b03600160c01b909104811690831610620013e05760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1906200127090849062004708565b600054600290610100900460ff1615801562001455575060005460ff8083169116105b620014745760405162461bcd60e51b815260040162000b669062004f26565b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b179055620014f562003097565b6200151060008051602062005ec68339815191528a62003104565b6200151d60008662003104565b6200153860008051602062005da68339815191528662003104565b6200155360008051602062005e268339815191528662003104565b6200156e60008051602062005d468339815191528662003104565b6200158960008051602062005d868339815191528762003104565b620015a460008051602062005ea68339815191528762003104565b620015bf60008051602062005dc68339815191528762003104565b620015da60008051602062005e468339815191528762003104565b6200160460008051602062005ec683398151915260008051602062005d2683398151915262003110565b6200161f60008051602062005d268339815191528762003104565b6200163a60008051602062005d668339815191528762003104565b6200166460008051602062005e8683398151915260008051602062005e6683398151915262003110565b6200167f60008051602062005e868339815191528562003104565b6200169a60008051602062005e668339815191528562003104565b6000620016af8484600561044d600062003cad565b6073546074549192506001600160401b03600160401b90910481169116808214620016ed57604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b0381811660008181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620017ee9695831695600160581b909104909216936076936077939192919091169060040162005081565b600060405180830381600087803b1580156200180957600080fd5b505af11580156200181e573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff8516815260008051602062005e0683398151915293506020019150620018559050565b60405180910390a1505050505050505050565b600060865460646200187b9190620050e7565b905090565b60008051602062005d868339815191526200189b81620031d6565b63ffffffff82161580620018ba5750607e5463ffffffff908116908316115b15620018d957604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200192057604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b60008051602062005ea68339815191526200198681620031d6565b63ffffffff88161580620019a55750607e5463ffffffff908116908916115b15620019c457604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff161515900362001a0b57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001a49576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062001a649063ffffffff1662005101565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001ab290620046fa565b62001ac09392919062005127565b604051809103906000f08015801562001add573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001d51949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001d91908d908d9088908e908e908e906004016200515e565b600060405180830381600087803b15801562001dac57600080fd5b505af115801562001dc1573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001dfb90878787878762003ed2565b979650505050505050565b606f5460ff161562001e2b57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001e7a92600160c01b90048116911662004fab565b6001600160401b0316111562001ea357604051638a0704d360e01b815260040160405180910390fd5b6103e862001eb28888620051c1565b6001600160401b0316111562001edb57604051635acfba9d60e11b815260040160405180910390fd5b62001eed81898989898989896200356a565b62001ef981876200400d565b6085546001600160401b03166000036200200757600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001f75576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001fae62002606565b6040518263ffffffff1660e01b815260040162001fcd91815260200190565b600060405180830381600087803b15801562001fe857600080fd5b505af115801562001ffd573d6000803e3d6000fd5b50505050620020d1565b62002012816200420a565b600681018054600160801b90046001600160401b03169060106200203683620051e4565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b4888789604051620021179392919062004f74565b60405180910390a3505050505050505050565b606f5460ff16156200214f57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88166000908152608160205260409020620021768189898989898989620031e2565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620021d562003b58565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016200225c919062004d35565b602060405180830381865afa1580156200227a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620022a091906200520b565b608454909150600090620022c7906001600160401b03600160401b820481169116620051c1565b6001600160401b0316905080600003620022e45760009250505090565b620022f081836200523b565b9250505090565b606f5460009060ff16156200231f57604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362002357576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200238257604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620023b59084906001600160401b031662004fab565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620023eb878362004fab565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200247a836200420a565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a2582604051620024b2919062004708565b60405180910390a29695505050505050565b60008051602062005e46833981519152620024df81620031d6565b606f5460ff166200251a576085546001600160401b03908116908316106200251a5760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75906200127090849062004708565b60008051602062005e468339815191526200258281620031d6565b62015180826001600160401b03161115620025b057604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28906200127090849062004708565b60805460009063ffffffff168082036200262257506000919050565b6000816001600160401b038111156200263f576200263f62004ac2565b60405190808252806020026020018201604052801562002669578160200160208202803683370190505b50905060005b82811015620026dc57608160006200268983600162005252565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620026bc57620026bc62005268565b602090810291909101015280620026d3816200527e565b9150506200266f565b50600060205b8360011462002920576000620026fa6002866200529a565b620027076002876200523b565b62002713919062005252565b90506000816001600160401b0381111562002732576200273262004ac2565b6040519080825280602002602001820160405280156200275c578160200160208202803683370190505b50905060005b82811015620028d45762002778600184620052b1565b811480156200279357506200278f6002886200529a565b6001145b15620028135785620027a7826002620050e7565b81518110620027ba57620027ba62005268565b602002602001015185604051602001620027d6929190620052c7565b6040516020818303038152906040528051906020012082828151811062002801576200280162005268565b602002602001018181525050620028bf565b8562002821826002620050e7565b8151811062002834576200283462005268565b6020026020010151868260026200284c9190620050e7565b6200285990600162005252565b815181106200286c576200286c62005268565b602002602001015160405160200162002887929190620052c7565b60405160208183030381529060405280519060200120828281518110620028b257620028b262005268565b6020026020010181815250505b80620028cb816200527e565b91505062002762565b508094508195508384604051602001620028f0929190620052c7565b60405160208183030381529060405280519060200120935082806200291590620052d5565b9350505050620026e2565b60008360008151811062002938576200293862005268565b6020026020010151905060005b82811015620029be57818460405160200162002963929190620052c7565b604051602081830303815290604052805190602001209150838460405160200162002990929190620052c7565b6040516020818303038152906040528051906020012093508080620029b5906200527e565b91505062002945565b5095945050505050565b60008051602062005d46833981519152620029e381620031d6565b63ffffffff8416158062002a025750607e5463ffffffff908116908516115b1562002a2157604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002a62576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002ab157604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002af857604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002b3657604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002bb68462000ddb565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002c0b9216908b908b90600401620052ef565b600060405180830381600087803b15801562002c2657600080fd5b505af115801562002c3b573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005d6683398151915262002cb081620031d6565b683635c9adc5dea0000082118062002ccb5750633b9aca0082105b1562002cea57604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001270565b62002d2b8262001312565b62002d3681620031d6565b620011cb838362003c43565b60008051602062005dc683398151915262002d5d81620031d6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002db957600080fd5b505af115801562002dce573d6000803e3d6000fd5b5050505062002ddc620042d5565b50565b60008051602062005e2683398151915262002dfa81620031d6565b6001600160401b03841660009081526083602052604090205463ffffffff161562002e38576040516337c8fe0960e11b815260040160405180910390fd5b600062002e49888888888762003cad565b60008080526002909101602052604090209390935550505050505050565b60008051602062005da683398151915262002e8281620031d6565b607e805460009190829062002e9d9063ffffffff1662005101565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162003040969594939291906200532f565b60405180910390a25050505050505050565b6085546001600160401b038281166000908152600485016020526040812054909242926200308592918116911662004fab565b6001600160401b031611159392505050565b600054610100900460ff16620013105760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b66565b6200137f828262003bd7565b60006200311d8362001312565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6006810154600090600160801b90046001600160401b031615620031b9575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002ddc81336200432e565b60078801546000906001600160401b039081169087161015620032185760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620032b95760068901546001600160401b03600160801b90910481169089161115620032625760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b9092041614620032b257604051632bd2e3e760e01b815260040160405180910390fd5b506200332e565b506001600160401b038516600090815260028901602052604090205480620032f4576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b909104811690871611156200332e57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620033675750876001600160401b0316876001600160401b031611155b806200338b575060068901546001600160401b03600160c01b909104811690881611155b15620033aa5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b9004811690861614620033f1576040516332a2a77f60e01b815260040160405180910390fd5b6000620034038a888888868962003ed2565b9050600060008051602062005de683398151915260028360405162003429919062005388565b602060405180830381855afa15801562003447573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200346c91906200520b565b6200347891906200529a565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620034bc91889190600401620053a6565b602060405180830381865afa158015620034da573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620035009190620053e3565b6200351e576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c0160205260409020600201548590036200355d5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620035788a62003165565b60078b01549091506001600160401b039081169089161015620035ae5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620036515760068a01546001600160401b03600160801b9091048116908a161115620035f85760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200364a57604051632bd2e3e760e01b815260040160405180910390fd5b50620036c1565b6001600160401b038816600090815260028b0160205260409020549150816200368d576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b03161115620036c157604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620036f45760405163b9b18f5760e01b815260040160405180910390fd5b6000620037068b8a8a8a878b62003ed2565b9050600060008051602062005de68339815191526002836040516200372c919062005388565b602060405180830381855afa1580156200374a573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200376f91906200520b565b6200377b91906200529a565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620037bf91899190600401620053a6565b602060405180830381865afa158015620037dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620038039190620053e3565b62003821576040516309bde33960e01b815260040160405180910390fd5b60006200382f848b620051c1565b90506200388887826001600160401b03166200384a6200220b565b620038569190620050e7565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004358565b80608460088282829054906101000a90046001600160401b0316620038ae919062004fab565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b1580156200393e57600080fd5b505af115801562003953573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b9091048116908216111580620039a5575060068201546001600160401b03600160801b9091048116908216115b15620039c45760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003a8062002606565b6040518263ffffffff1660e01b815260040162003a9f91815260200190565b600060405180830381600087803b15801562003aba57600080fd5b505af115801562003acf573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003bb457600080fd5b505af115801562003bc9573d6000803e3d6000fd5b5050505062001310620043ac565b62003be38282620021e0565b6200137f5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003c4f8282620021e0565b156200137f5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b608080546000918291829062003cc99063ffffffff1662005101565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000866001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508060826000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150868260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550858260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550838260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003ec094939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003f08575081155b1562003f275760405163340c614f60e11b815260040160405180910390fd5b8062003f46576040516366385b5160e01b815260040160405180910390fd5b62003f518462004409565b62003f6f576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b60006200401a8362003165565b9050816000806200402c8484620051c1565b6085546001600160401b0391821692506000916200405391600160401b90041642620052b1565b90505b846001600160401b0316846001600160401b031614620040dd576001600160401b03808516600090815260038901602052604090206001810154909116821015620040b8576001810154600160401b90046001600160401b03169450620040d6565b620040c48686620051c1565b6001600160401b0316935050620040dd565b5062004056565b6000620040eb8484620052b1565b9050838110156200414957808403600c81116200410957806200410c565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a60865402816200413e576200413e62005225565b0460865550620041c1565b838103600c81116200415c57806200415f565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162004199576200419962005225565b04905080608654670de0b6b3a76400000281620041ba57620041ba62005225565b0460865550505b683635c9adc5dea000006086541115620041e857683635c9adc5dea0000060865562004200565b633b9aca0060865410156200420057633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002ddc5760068101546000906200425590600160c01b90046001600160401b0316600162004fab565b905062004263828262003052565b156200137f57600682015460009060029062004291908490600160801b90046001600160401b0316620051c1565b6200429d919062005407565b620042a9908362004fab565b9050620042b7838262003052565b15620042c957620011cb838262003966565b620011cb838362003966565b606f5460ff16620042f957604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6200433a8282620021e0565b6200137f57604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620011cb9084906200448f565b606f5460ff1615620043d157604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b03831610801562004440575067ffffffff00000001604083901c6001600160401b0316105b801562004461575067ffffffff00000001608083901c6001600160401b0316105b801562004479575067ffffffff0000000160c083901c105b156200448757506001919050565b506000919050565b6000620044e6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620045689092919063ffffffff16565b805190915015620011cb5780806020019051810190620045079190620053e3565b620011cb5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b66565b606062004579848460008562004581565b949350505050565b606082471015620045e45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b66565b600080866001600160a01b0316858760405162004602919062005388565b60006040518083038185875af1925050503d806000811462004641576040519150601f19603f3d011682016040523d82523d6000602084013e62004646565b606091505b509150915062001dfb8783838760608315620046c7578251600003620046bf576001600160a01b0385163b620046bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b66565b508162004579565b620045798383815115620046de5781518083602001fd5b8060405162461bcd60e51b815260040162000b66919062004cf3565b6108f5806200543183390190565b6001600160401b0391909116815260200190565b803563ffffffff81168114620031d157600080fd5b80356001600160401b0381168114620031d157600080fd5b600080604083850312156200475d57600080fd5b62004768836200471c565b9150620047786020840162004731565b90509250929050565b6001600160a01b038116811462002ddc57600080fd5b60008060008060008060c08789031215620047b157600080fd5b8635620047be8162004781565b9550620047ce6020880162004731565b9450620047de6040880162004731565b93506060870135620047f08162004781565b92506080870135620048028162004781565b915060a0870135620048148162004781565b809150509295509295509295565b6000602082840312156200483557600080fd5b62000b1b826200471c565b80610300810183101562000b1e57600080fd5b6000806000806000806000806103e0898b0312156200487157600080fd5b6200487c896200471c565b97506200488c60208a0162004731565b96506200489c60408a0162004731565b9550620048ac60608a0162004731565b9450620048bc60808a0162004731565b935060a0890135925060c08901359150620048db8a60e08b0162004840565b90509295985092959890939650565b6000806000806000806000806103e0898b0312156200490857600080fd5b62004913896200471c565b97506200492360208a0162004731565b96506200493360408a0162004731565b95506200494360608a0162004731565b94506080890135935060a0890135925060c0890135620049638162004781565b9150620048db8a60e08b0162004840565b6000602082840312156200498757600080fd5b813561ffff811681146200499a57600080fd5b9392505050565b600060208284031215620049b457600080fd5b5035919050565b60008060408385031215620049cf57600080fd5b823591506020830135620049e38162004781565b809150509250929050565b60006020828403121562004a0157600080fd5b62000b1b8262004731565b600080600080600080600080610100898b03121562004a2a57600080fd5b883562004a378162004781565b975062004a4760208a0162004731565b965062004a5760408a0162004731565b9550606089013562004a698162004781565b9450608089013562004a7b8162004781565b935060a089013562004a8d8162004781565b925060c089013562004a9f8162004781565b915060e089013562004ab18162004781565b809150509295985092959890939650565b634e487b7160e01b600052604160045260246000fd5b600082601f83011262004aea57600080fd5b81356001600160401b038082111562004b075762004b0762004ac2565b604051601f8301601f19908116603f0116810190828211818310171562004b325762004b3262004ac2565b8160405283815286602085880101111562004b4c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121562004b8857600080fd5b62004b93886200471c565b965062004ba36020890162004731565b9550604088013562004bb58162004781565b9450606088013562004bc78162004781565b9350608088013562004bd98162004781565b925060a08801356001600160401b038082111562004bf657600080fd5b62004c048b838c0162004ad8565b935060c08a013591508082111562004c1b57600080fd5b5062004c2a8a828b0162004ad8565b91505092959891949750929550565b60008060008060008060c0878903121562004c5357600080fd5b62004c5e876200471c565b955062004c6e6020880162004731565b945062004c7e6040880162004731565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004cbc57818101518382015260200162004ca2565b50506000910152565b6000815180845262004cdf81602086016020860162004c9f565b601f01601f19169290920160200192915050565b60208152600062000b1b602083018462004cc5565b6000806040838503121562004d1c57600080fd5b62004d278362004731565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000806000806060858703121562004d6057600080fd5b843562004d6d8162004781565b935062004d7d602086016200471c565b925060408501356001600160401b038082111562004d9a57600080fd5b818701915087601f83011262004daf57600080fd5b81358181111562004dbf57600080fd5b88602082850101111562004dd257600080fd5b95989497505060200194505050565b60006020828403121562004df457600080fd5b81356200499a8162004781565b803560ff81168114620031d157600080fd5b60008060008060008060c0878903121562004e2d57600080fd5b863562004e3a8162004781565b9550602087013562004e4c8162004781565b945062004e5c6040880162004731565b935062004e6c6060880162004731565b92506080870135915062004e8360a0880162004e01565b90509295509295509295565b60008060008060008060c0878903121562004ea957600080fd5b863562004eb68162004781565b9550602087013562004ec88162004781565b945062004ed86040880162004731565b935062004ee86060880162004e01565b92506080870135915060a08701356001600160401b0381111562004f0b57600080fd5b62004f1989828a0162004ad8565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004fce5762004fce62004f95565b5092915050565b8054600090600181811c908083168062004ff057607f831692505b602080841082036200501257634e487b7160e01b600052602260045260246000fd5b83885260208801828015620050305760018114620050475762005074565b60ff198716825285151560051b8201975062005074565b60008981526020902060005b878110156200506e5781548482015290860190840162005053565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c060408201819052600090620050af9083018762004fd5565b8281036060840152620050c3818762004fd5565b608084019590955250506001600160401b039190911660a090910152949350505050565b808202811582820484141762000b1e5762000b1e62004f95565b600063ffffffff8083168181036200511d576200511d62004f95565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620051559083018462004cc5565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c060808201819052600090620051a09083018562004cc5565b82810360a0840152620051b4818562004cc5565b9998505050505050505050565b6001600160401b0382811682821603908082111562004fce5762004fce62004f95565b60006001600160401b038281166002600160401b031981016200511d576200511d62004f95565b6000602082840312156200521e57600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b6000826200524d576200524d62005225565b500490565b8082018082111562000b1e5762000b1e62004f95565b634e487b7160e01b600052603260045260246000fd5b60006001820162005293576200529362004f95565b5060010190565b600082620052ac57620052ac62005225565b500690565b8181038181111562000b1e5762000b1e62004f95565b918252602082015260400190565b600081620052e757620052e762004f95565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190526000906200537c9083018462004cc5565b98975050505050505050565b600082516200539c81846020870162004c9f565b9190910192915050565b61032081016103008085843782018360005b6001811015620053d9578151835260209283019290910190600101620053b8565b5050509392505050565b600060208284031215620053f657600080fd5b815180151581146200499a57600080fd5b60006001600160401b038381168062005424576200542462005225565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220a19e7a72432195d9a35c7ce8fa5f1284415aac66bb1ad08a4c2e1c252fd8690864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220dd69b4fbcb587c5752b040baae00cd409fddf9ace44ff04b8c6ce19483951df464736f6c63430008140033", + "bytecode": "0x60e06040523480156200001157600080fd5b50604051620060423803806200604283398101604081905262000034916200006b565b6001600160a01b0392831660805290821660c0521660a052620000bf565b6001600160a01b03811681146200006857600080fd5b50565b6000806000606084860312156200008157600080fd5b83516200008e8162000052565b6020850151909350620000a18162000052565b6040850151909250620000b48162000052565b809150509250925092565b60805160a05160c051615f1b620001276000396000818161099901528181612210015261386001526000818161075f01528181612d5f0152613b5a0152600081816108f301528181610ea70152818161105701528181611f770152613a490152615f1b6000f3fe60806040523480156200001157600080fd5b50600436106200029e5760003560e01c8063066ec01214620002a3578063080b311114620002cf5780630a0d9fbe14620002f75780630e36f582146200031257806311f6b287146200032b57806312b86e1914620003425780631489ed10146200035957806315064c9614620003705780631608859c146200037e5780631796a1ae14620003955780631816b7e514620003bc5780632072f6c514620003d3578063248a9ca314620003dd5780632528016914620004035780632f2ff15d14620004b857806336568abe14620004cf578063394218e914620004e6578063477fa27014620004fd5780634d4d3338146200050657806355a71ee0146200051d57806360469169146200056157806365c0504d146200056b5780637222020f146200061a578063727885e914620006315780637975fcfe14620006485780637fb6e76a146200066e578063841b24d7146200069757806387c20c0114620006b25780638bd4f07114620006c957806391d1485414620006e057806399f5634e14620006f75780639a908e7314620007015780639c9f3dfe1462000718578063a066215c146200072f578063a217fddf1462000746578063a2967d99146200074f578063a3c573eb1462000759578063afd23cbe1462000790578063b99d0ad714620007ba578063c1acbc341462000892578063c4c928c214620008ad578063ceee281d14620008c4578063d02103ca14620008ed578063d5073f6f1462000915578063d547741f146200092c578063d939b3151462000943578063dbc169761462000957578063dde0ff771462000961578063e0bfd3d2146200097c578063e46761c41462000993578063f34eb8eb14620009bb578063f4e9267514620009d2578063f9c4c2ae14620009e3575b600080fd5b608454620002b7906001600160401b031681565b604051620002c6919062004708565b60405180910390f35b620002e6620002e036600462004749565b62000afa565b6040519015158152602001620002c6565b608554620002b790600160401b90046001600160401b031681565b620003296200032336600462004797565b62000b24565b005b620002b76200033c36600462004822565b62000ddb565b620003296200035336600462004853565b62000dfb565b620003296200036a366004620048ea565b62000fab565b606f54620002e69060ff1681565b620003296200038f36600462004749565b6200113b565b607e54620003a69063ffffffff1681565b60405163ffffffff9091168152602001620002c6565b62000329620003cd36600462004974565b620011d0565b620003296200127c565b620003f4620003ee366004620049a1565b62001312565b604051908152602001620002c6565b620004846200041436600462004749565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002c6565b62000329620004c9366004620049bb565b62001327565b62000329620004e0366004620049bb565b62001349565b62000329620004f7366004620049ee565b62001383565b608654620003f4565b620003296200051736600462004a0c565b62001432565b620003f46200052e36600462004749565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620003f462001868565b620005d06200057c36600462004822565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002c6565b620003296200062b36600462004822565b62001880565b620003296200064236600462004b6c565b6200196b565b6200065f6200065936600462004c39565b62001dd3565b604051620002c6919062004cf3565b620003a66200067f366004620049ee565b60836020526000908152604090205463ffffffff1681565b608454620002b790600160c01b90046001600160401b031681565b62000329620006c3366004620048ea565b62001e06565b62000329620006da36600462004853565b6200212a565b620002e6620006f1366004620049bb565b620021e0565b620003f46200220b565b620002b76200071236600462004d08565b620022f7565b6200032962000729366004620049ee565b620024c4565b6200032962000740366004620049ee565b62002567565b620003f4600081565b620003f462002606565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b604051620002c6919062004d35565b608554620007a690600160801b900461ffff1681565b60405161ffff9091168152602001620002c6565b62000850620007cb36600462004749565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002c6919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002b790600160801b90046001600160401b031681565b62000329620008be36600462004d49565b620029c8565b620003a6620008d536600462004de1565b60826020526000908152604090205463ffffffff1681565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b6200032962000926366004620049a1565b62002c95565b620003296200093d366004620049bb565b62002d20565b608554620002b7906001600160401b031681565b6200032962002d42565b608454620002b790600160401b90046001600160401b031681565b620003296200098d36600462004e13565b62002ddf565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b62000329620009cc36600462004e8f565b62002e67565b608054620003a69063ffffffff1681565b62000a7a620009f436600462004822565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002c6565b63ffffffff8216600090815260816020526040812062000b1b908362003052565b90505b92915050565b600054600290610100900460ff1615801562000b47575060005460ff8083169116105b62000b6f5760405162461bcd60e51b815260040162000b669062004f26565b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000bf062003097565b62000c0b60008051602062005ec68339815191528862003104565b62000c1860008462003104565b62000c3360008051602062005da68339815191528462003104565b62000c4e60008051602062005e268339815191528462003104565b62000c6960008051602062005d468339815191528462003104565b62000c8460008051602062005d868339815191528562003104565b62000c9f60008051602062005ea68339815191528562003104565b62000cba60008051602062005dc68339815191528562003104565b62000cd560008051602062005e468339815191528562003104565b62000cff60008051602062005ec683398151915260008051602062005d2683398151915262003110565b62000d1a60008051602062005d268339815191528562003104565b62000d3560008051602062005d668339815191528562003104565b62000d5f60008051602062005e8683398151915260008051602062005e6683398151915262003110565b62000d7a60008051602062005e868339815191528362003104565b62000d9560008051602062005e668339815191528362003104565b62000da260003362003104565b6000805461ff001916905560405160ff8216815260008051602062005e068339815191529060200160405180910390a150505050505050565b63ffffffff8116600090815260816020526040812062000b1e9062003165565b60008051602062005ec683398151915262000e1681620031d6565b63ffffffff8916600090815260816020526040902062000e3d818a8a8a8a8a8a8a620031e2565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000ea5576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000ede62002606565b6040518263ffffffff1660e01b815260040162000efd91815260200190565b600060405180830381600087803b15801562000f1857600080fd5b505af115801562000f2d573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005ec683398151915262000fc681620031d6565b63ffffffff8916600090815260816020526040902062000fed818a8a8a8a8a8a8a6200356a565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562001055576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200108e62002606565b6040518263ffffffff1660e01b8152600401620010ad91815260200190565b600060405180830381600087803b158015620010c857600080fd5b505af1158015620010dd573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a604051620011279392919062004f74565b60405180910390a350505050505050505050565b63ffffffff821660009081526081602052604090206200116b60008051602062005ec683398151915233620021e0565b620011bf57606f5460ff16156200119557604051630bc011ff60e21b815260040160405180910390fd5b620011a1818362003052565b620011bf57604051630674f25160e11b815260040160405180910390fd5b620011cb818362003966565b505050565b60008051602062005e46833981519152620011eb81620031d6565b6103e88261ffff1610806200120557506103ff8261ffff16115b156200122457604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200129760008051602062005e8683398151915233620021e0565b6200130657608454600160801b90046001600160401b03161580620012e757506084544290620012dc9062093a8090600160801b90046001600160401b031662004fab565b6001600160401b0316115b15620013065760405163692baaad60e11b815260040160405180910390fd5b6200131062003b58565b565b60009081526034602052604090206001015490565b620013328262001312565b6200133d81620031d6565b620011cb838362003bd7565b6001600160a01b03811633146200137357604051630b4ad1cd60e31b815260040160405180910390fd5b6200137f828262003c43565b5050565b60008051602062005e468339815191526200139e81620031d6565b606f5460ff16620013e0576084546001600160401b03600160c01b909104811690831610620013e05760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1906200127090849062004708565b600054600290610100900460ff1615801562001455575060005460ff8083169116105b620014745760405162461bcd60e51b815260040162000b669062004f26565b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b179055620014f562003097565b6200151060008051602062005ec68339815191528a62003104565b6200151d60008662003104565b6200153860008051602062005da68339815191528662003104565b6200155360008051602062005e268339815191528662003104565b6200156e60008051602062005d468339815191528662003104565b6200158960008051602062005d868339815191528762003104565b620015a460008051602062005ea68339815191528762003104565b620015bf60008051602062005dc68339815191528762003104565b620015da60008051602062005e468339815191528762003104565b6200160460008051602062005ec683398151915260008051602062005d2683398151915262003110565b6200161f60008051602062005d268339815191528762003104565b6200163a60008051602062005d668339815191528762003104565b6200166460008051602062005e8683398151915260008051602062005e6683398151915262003110565b6200167f60008051602062005e868339815191528562003104565b6200169a60008051602062005e668339815191528562003104565b6000620016af8484600561044d600062003cad565b6073546074549192506001600160401b03600160401b90910481169116808214620016ed57604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b0381811660008181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620017ee9695831695600160581b909104909216936076936077939192919091169060040162005081565b600060405180830381600087803b1580156200180957600080fd5b505af11580156200181e573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff8516815260008051602062005e0683398151915293506020019150620018559050565b60405180910390a1505050505050505050565b600060865460646200187b9190620050e7565b905090565b60008051602062005d868339815191526200189b81620031d6565b63ffffffff82161580620018ba5750607e5463ffffffff908116908316115b15620018d957604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200192057604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b60008051602062005ea68339815191526200198681620031d6565b63ffffffff88161580620019a55750607e5463ffffffff908116908916115b15620019c457604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff161515900362001a0b57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001a49576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062001a649063ffffffff1662005101565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001ab290620046fa565b62001ac09392919062005127565b604051809103906000f08015801562001add573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001d51949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001d91908d908d9088908e908e908e906004016200515e565b600060405180830381600087803b15801562001dac57600080fd5b505af115801562001dc1573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001dfb90878787878762003ed2565b979650505050505050565b606f5460ff161562001e2b57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001e7a92600160c01b90048116911662004fab565b6001600160401b0316111562001ea357604051638a0704d360e01b815260040160405180910390fd5b6103e862001eb28888620051c1565b6001600160401b0316111562001edb57604051635acfba9d60e11b815260040160405180910390fd5b62001eed81898989898989896200356a565b62001ef981876200400d565b6085546001600160401b03166000036200200757600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001f75576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001fae62002606565b6040518263ffffffff1660e01b815260040162001fcd91815260200190565b600060405180830381600087803b15801562001fe857600080fd5b505af115801562001ffd573d6000803e3d6000fd5b50505050620020d1565b62002012816200420a565b600681018054600160801b90046001600160401b03169060106200203683620051e4565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b4888789604051620021179392919062004f74565b60405180910390a3505050505050505050565b606f5460ff16156200214f57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88166000908152608160205260409020620021768189898989898989620031e2565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620021d562003b58565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016200225c919062004d35565b602060405180830381865afa1580156200227a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620022a091906200520b565b608454909150600090620022c7906001600160401b03600160401b820481169116620051c1565b6001600160401b0316905080600003620022e45760009250505090565b620022f081836200523b565b9250505090565b606f5460009060ff16156200231f57604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362002357576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200238257604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620023b59084906001600160401b031662004fab565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620023eb878362004fab565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200247a836200420a565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a2582604051620024b2919062004708565b60405180910390a29695505050505050565b60008051602062005e46833981519152620024df81620031d6565b606f5460ff166200251a576085546001600160401b03908116908316106200251a5760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75906200127090849062004708565b60008051602062005e468339815191526200258281620031d6565b62015180826001600160401b03161115620025b057604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28906200127090849062004708565b60805460009063ffffffff168082036200262257506000919050565b6000816001600160401b038111156200263f576200263f62004ac2565b60405190808252806020026020018201604052801562002669578160200160208202803683370190505b50905060005b82811015620026dc57608160006200268983600162005252565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620026bc57620026bc62005268565b602090810291909101015280620026d3816200527e565b9150506200266f565b50600060205b8360011462002920576000620026fa6002866200529a565b620027076002876200523b565b62002713919062005252565b90506000816001600160401b0381111562002732576200273262004ac2565b6040519080825280602002602001820160405280156200275c578160200160208202803683370190505b50905060005b82811015620028d45762002778600184620052b1565b811480156200279357506200278f6002886200529a565b6001145b15620028135785620027a7826002620050e7565b81518110620027ba57620027ba62005268565b602002602001015185604051602001620027d6929190620052c7565b6040516020818303038152906040528051906020012082828151811062002801576200280162005268565b602002602001018181525050620028bf565b8562002821826002620050e7565b8151811062002834576200283462005268565b6020026020010151868260026200284c9190620050e7565b6200285990600162005252565b815181106200286c576200286c62005268565b602002602001015160405160200162002887929190620052c7565b60405160208183030381529060405280519060200120828281518110620028b257620028b262005268565b6020026020010181815250505b80620028cb816200527e565b91505062002762565b508094508195508384604051602001620028f0929190620052c7565b60405160208183030381529060405280519060200120935082806200291590620052d5565b9350505050620026e2565b60008360008151811062002938576200293862005268565b6020026020010151905060005b82811015620029be57818460405160200162002963929190620052c7565b604051602081830303815290604052805190602001209150838460405160200162002990929190620052c7565b6040516020818303038152906040528051906020012093508080620029b5906200527e565b91505062002945565b5095945050505050565b60008051602062005d46833981519152620029e381620031d6565b63ffffffff8416158062002a025750607e5463ffffffff908116908516115b1562002a2157604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002a62576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002ab157604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002af857604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002b3657604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002bb68462000ddb565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002c0b9216908b908b90600401620052ef565b600060405180830381600087803b15801562002c2657600080fd5b505af115801562002c3b573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005d6683398151915262002cb081620031d6565b683635c9adc5dea0000082118062002ccb5750633b9aca0082105b1562002cea57604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001270565b62002d2b8262001312565b62002d3681620031d6565b620011cb838362003c43565b60008051602062005dc683398151915262002d5d81620031d6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002db957600080fd5b505af115801562002dce573d6000803e3d6000fd5b5050505062002ddc620042d5565b50565b60008051602062005e2683398151915262002dfa81620031d6565b6001600160401b03841660009081526083602052604090205463ffffffff161562002e38576040516337c8fe0960e11b815260040160405180910390fd5b600062002e49888888888762003cad565b60008080526002909101602052604090209390935550505050505050565b60008051602062005da683398151915262002e8281620031d6565b607e805460009190829062002e9d9063ffffffff1662005101565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162003040969594939291906200532f565b60405180910390a25050505050505050565b6085546001600160401b038281166000908152600485016020526040812054909242926200308592918116911662004fab565b6001600160401b031611159392505050565b600054610100900460ff16620013105760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b66565b6200137f828262003bd7565b60006200311d8362001312565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6006810154600090600160801b90046001600160401b031615620031b9575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002ddc81336200432e565b60078801546000906001600160401b039081169087161015620032185760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620032b95760068901546001600160401b03600160801b90910481169089161115620032625760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b9092041614620032b257604051632bd2e3e760e01b815260040160405180910390fd5b506200332e565b506001600160401b038516600090815260028901602052604090205480620032f4576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b909104811690871611156200332e57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620033675750876001600160401b0316876001600160401b031611155b806200338b575060068901546001600160401b03600160c01b909104811690881611155b15620033aa5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b9004811690861614620033f1576040516332a2a77f60e01b815260040160405180910390fd5b6000620034038a888888868962003ed2565b9050600060008051602062005de683398151915260028360405162003429919062005388565b602060405180830381855afa15801562003447573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200346c91906200520b565b6200347891906200529a565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620034bc91889190600401620053a6565b602060405180830381865afa158015620034da573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620035009190620053e3565b6200351e576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c0160205260409020600201548590036200355d5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620035788a62003165565b60078b01549091506001600160401b039081169089161015620035ae5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620036515760068a01546001600160401b03600160801b9091048116908a161115620035f85760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200364a57604051632bd2e3e760e01b815260040160405180910390fd5b50620036c1565b6001600160401b038816600090815260028b0160205260409020549150816200368d576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b03161115620036c157604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620036f45760405163b9b18f5760e01b815260040160405180910390fd5b6000620037068b8a8a8a878b62003ed2565b9050600060008051602062005de68339815191526002836040516200372c919062005388565b602060405180830381855afa1580156200374a573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200376f91906200520b565b6200377b91906200529a565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620037bf91899190600401620053a6565b602060405180830381865afa158015620037dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620038039190620053e3565b62003821576040516309bde33960e01b815260040160405180910390fd5b60006200382f848b620051c1565b90506200388887826001600160401b03166200384a6200220b565b620038569190620050e7565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004358565b80608460088282829054906101000a90046001600160401b0316620038ae919062004fab565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b1580156200393e57600080fd5b505af115801562003953573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b9091048116908216111580620039a5575060068201546001600160401b03600160801b9091048116908216115b15620039c45760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003a8062002606565b6040518263ffffffff1660e01b815260040162003a9f91815260200190565b600060405180830381600087803b15801562003aba57600080fd5b505af115801562003acf573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003bb457600080fd5b505af115801562003bc9573d6000803e3d6000fd5b5050505062001310620043ac565b62003be38282620021e0565b6200137f5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003c4f8282620021e0565b156200137f5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b608080546000918291829062003cc99063ffffffff1662005101565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000866001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508060826000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150868260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550858260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550838260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003ec094939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003f08575081155b1562003f275760405163340c614f60e11b815260040160405180910390fd5b8062003f46576040516366385b5160e01b815260040160405180910390fd5b62003f518462004409565b62003f6f576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b60006200401a8362003165565b9050816000806200402c8484620051c1565b6085546001600160401b0391821692506000916200405391600160401b90041642620052b1565b90505b846001600160401b0316846001600160401b031614620040dd576001600160401b03808516600090815260038901602052604090206001810154909116821015620040b8576001810154600160401b90046001600160401b03169450620040d6565b620040c48686620051c1565b6001600160401b0316935050620040dd565b5062004056565b6000620040eb8484620052b1565b9050838110156200414957808403600c81116200410957806200410c565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a60865402816200413e576200413e62005225565b0460865550620041c1565b838103600c81116200415c57806200415f565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162004199576200419962005225565b04905080608654670de0b6b3a76400000281620041ba57620041ba62005225565b0460865550505b683635c9adc5dea000006086541115620041e857683635c9adc5dea0000060865562004200565b633b9aca0060865410156200420057633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002ddc5760068101546000906200425590600160c01b90046001600160401b0316600162004fab565b905062004263828262003052565b156200137f57600682015460009060029062004291908490600160801b90046001600160401b0316620051c1565b6200429d919062005407565b620042a9908362004fab565b9050620042b7838262003052565b15620042c957620011cb838262003966565b620011cb838362003966565b606f5460ff16620042f957604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6200433a8282620021e0565b6200137f57604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620011cb9084906200448f565b606f5460ff1615620043d157604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b03831610801562004440575067ffffffff00000001604083901c6001600160401b0316105b801562004461575067ffffffff00000001608083901c6001600160401b0316105b801562004479575067ffffffff0000000160c083901c105b156200448757506001919050565b506000919050565b6000620044e6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620045689092919063ffffffff16565b805190915015620011cb5780806020019051810190620045079190620053e3565b620011cb5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b66565b606062004579848460008562004581565b949350505050565b606082471015620045e45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b66565b600080866001600160a01b0316858760405162004602919062005388565b60006040518083038185875af1925050503d806000811462004641576040519150601f19603f3d011682016040523d82523d6000602084013e62004646565b606091505b509150915062001dfb8783838760608315620046c7578251600003620046bf576001600160a01b0385163b620046bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b66565b508162004579565b620045798383815115620046de5781518083602001fd5b8060405162461bcd60e51b815260040162000b66919062004cf3565b6108f5806200543183390190565b6001600160401b0391909116815260200190565b803563ffffffff81168114620031d157600080fd5b80356001600160401b0381168114620031d157600080fd5b600080604083850312156200475d57600080fd5b62004768836200471c565b9150620047786020840162004731565b90509250929050565b6001600160a01b038116811462002ddc57600080fd5b60008060008060008060c08789031215620047b157600080fd5b8635620047be8162004781565b9550620047ce6020880162004731565b9450620047de6040880162004731565b93506060870135620047f08162004781565b92506080870135620048028162004781565b915060a0870135620048148162004781565b809150509295509295509295565b6000602082840312156200483557600080fd5b62000b1b826200471c565b80610300810183101562000b1e57600080fd5b6000806000806000806000806103e0898b0312156200487157600080fd5b6200487c896200471c565b97506200488c60208a0162004731565b96506200489c60408a0162004731565b9550620048ac60608a0162004731565b9450620048bc60808a0162004731565b935060a0890135925060c08901359150620048db8a60e08b0162004840565b90509295985092959890939650565b6000806000806000806000806103e0898b0312156200490857600080fd5b62004913896200471c565b97506200492360208a0162004731565b96506200493360408a0162004731565b95506200494360608a0162004731565b94506080890135935060a0890135925060c0890135620049638162004781565b9150620048db8a60e08b0162004840565b6000602082840312156200498757600080fd5b813561ffff811681146200499a57600080fd5b9392505050565b600060208284031215620049b457600080fd5b5035919050565b60008060408385031215620049cf57600080fd5b823591506020830135620049e38162004781565b809150509250929050565b60006020828403121562004a0157600080fd5b62000b1b8262004731565b600080600080600080600080610100898b03121562004a2a57600080fd5b883562004a378162004781565b975062004a4760208a0162004731565b965062004a5760408a0162004731565b9550606089013562004a698162004781565b9450608089013562004a7b8162004781565b935060a089013562004a8d8162004781565b925060c089013562004a9f8162004781565b915060e089013562004ab18162004781565b809150509295985092959890939650565b634e487b7160e01b600052604160045260246000fd5b600082601f83011262004aea57600080fd5b81356001600160401b038082111562004b075762004b0762004ac2565b604051601f8301601f19908116603f0116810190828211818310171562004b325762004b3262004ac2565b8160405283815286602085880101111562004b4c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121562004b8857600080fd5b62004b93886200471c565b965062004ba36020890162004731565b9550604088013562004bb58162004781565b9450606088013562004bc78162004781565b9350608088013562004bd98162004781565b925060a08801356001600160401b038082111562004bf657600080fd5b62004c048b838c0162004ad8565b935060c08a013591508082111562004c1b57600080fd5b5062004c2a8a828b0162004ad8565b91505092959891949750929550565b60008060008060008060c0878903121562004c5357600080fd5b62004c5e876200471c565b955062004c6e6020880162004731565b945062004c7e6040880162004731565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004cbc57818101518382015260200162004ca2565b50506000910152565b6000815180845262004cdf81602086016020860162004c9f565b601f01601f19169290920160200192915050565b60208152600062000b1b602083018462004cc5565b6000806040838503121562004d1c57600080fd5b62004d278362004731565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000806000806060858703121562004d6057600080fd5b843562004d6d8162004781565b935062004d7d602086016200471c565b925060408501356001600160401b038082111562004d9a57600080fd5b818701915087601f83011262004daf57600080fd5b81358181111562004dbf57600080fd5b88602082850101111562004dd257600080fd5b95989497505060200194505050565b60006020828403121562004df457600080fd5b81356200499a8162004781565b803560ff81168114620031d157600080fd5b60008060008060008060c0878903121562004e2d57600080fd5b863562004e3a8162004781565b9550602087013562004e4c8162004781565b945062004e5c6040880162004731565b935062004e6c6060880162004731565b92506080870135915062004e8360a0880162004e01565b90509295509295509295565b60008060008060008060c0878903121562004ea957600080fd5b863562004eb68162004781565b9550602087013562004ec88162004781565b945062004ed86040880162004731565b935062004ee86060880162004e01565b92506080870135915060a08701356001600160401b0381111562004f0b57600080fd5b62004f1989828a0162004ad8565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004fce5762004fce62004f95565b5092915050565b8054600090600181811c908083168062004ff057607f831692505b602080841082036200501257634e487b7160e01b600052602260045260246000fd5b83885260208801828015620050305760018114620050475762005074565b60ff198716825285151560051b8201975062005074565b60008981526020902060005b878110156200506e5781548482015290860190840162005053565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c060408201819052600090620050af9083018762004fd5565b8281036060840152620050c3818762004fd5565b608084019590955250506001600160401b039190911660a090910152949350505050565b808202811582820484141762000b1e5762000b1e62004f95565b600063ffffffff8083168181036200511d576200511d62004f95565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620051559083018462004cc5565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c060808201819052600090620051a09083018562004cc5565b82810360a0840152620051b4818562004cc5565b9998505050505050505050565b6001600160401b0382811682821603908082111562004fce5762004fce62004f95565b60006001600160401b038281166002600160401b031981016200511d576200511d62004f95565b6000602082840312156200521e57600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b6000826200524d576200524d62005225565b500490565b8082018082111562000b1e5762000b1e62004f95565b634e487b7160e01b600052603260045260246000fd5b60006001820162005293576200529362004f95565b5060010190565b600082620052ac57620052ac62005225565b500690565b8181038181111562000b1e5762000b1e62004f95565b918252602082015260400190565b600081620052e757620052e762004f95565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190526000906200537c9083018462004cc5565b98975050505050505050565b600082516200539c81846020870162004c9f565b9190910192915050565b61032081016103008085843782018360005b6001811015620053d9578151835260209283019290910190600101620053b8565b5050509392505050565b600060208284031215620053f657600080fd5b815180151581146200499a57600080fd5b60006001600160401b038381168062005424576200542462005225565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220a19e7a72432195d9a35c7ce8fa5f1284415aac66bb1ad08a4c2e1c252fd8690864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a26469706673582212206abd8d41cddbceaedfd87b2e57b4fd718dbd21be2f778ec08faf526cc9649e0064736f6c63430008140033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b50600436106200029e5760003560e01c8063066ec01214620002a3578063080b311114620002cf5780630a0d9fbe14620002f75780630e36f582146200031257806311f6b287146200032b57806312b86e1914620003425780631489ed10146200035957806315064c9614620003705780631608859c146200037e5780631796a1ae14620003955780631816b7e514620003bc5780632072f6c514620003d3578063248a9ca314620003dd5780632528016914620004035780632f2ff15d14620004b857806336568abe14620004cf578063394218e914620004e6578063477fa27014620004fd5780634d4d3338146200050657806355a71ee0146200051d57806360469169146200056157806365c0504d146200056b5780637222020f146200061a578063727885e914620006315780637975fcfe14620006485780637fb6e76a146200066e578063841b24d7146200069757806387c20c0114620006b25780638bd4f07114620006c957806391d1485414620006e057806399f5634e14620006f75780639a908e7314620007015780639c9f3dfe1462000718578063a066215c146200072f578063a217fddf1462000746578063a2967d99146200074f578063a3c573eb1462000759578063afd23cbe1462000790578063b99d0ad714620007ba578063c1acbc341462000892578063c4c928c214620008ad578063ceee281d14620008c4578063d02103ca14620008ed578063d5073f6f1462000915578063d547741f146200092c578063d939b3151462000943578063dbc169761462000957578063dde0ff771462000961578063e0bfd3d2146200097c578063e46761c41462000993578063f34eb8eb14620009bb578063f4e9267514620009d2578063f9c4c2ae14620009e3575b600080fd5b608454620002b7906001600160401b031681565b604051620002c6919062004708565b60405180910390f35b620002e6620002e036600462004749565b62000afa565b6040519015158152602001620002c6565b608554620002b790600160401b90046001600160401b031681565b620003296200032336600462004797565b62000b24565b005b620002b76200033c36600462004822565b62000ddb565b620003296200035336600462004853565b62000dfb565b620003296200036a366004620048ea565b62000fab565b606f54620002e69060ff1681565b620003296200038f36600462004749565b6200113b565b607e54620003a69063ffffffff1681565b60405163ffffffff9091168152602001620002c6565b62000329620003cd36600462004974565b620011d0565b620003296200127c565b620003f4620003ee366004620049a1565b62001312565b604051908152602001620002c6565b620004846200041436600462004749565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002c6565b62000329620004c9366004620049bb565b62001327565b62000329620004e0366004620049bb565b62001349565b62000329620004f7366004620049ee565b62001383565b608654620003f4565b620003296200051736600462004a0c565b62001432565b620003f46200052e36600462004749565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620003f462001868565b620005d06200057c36600462004822565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002c6565b620003296200062b36600462004822565b62001880565b620003296200064236600462004b6c565b6200196b565b6200065f6200065936600462004c39565b62001dd3565b604051620002c6919062004cf3565b620003a66200067f366004620049ee565b60836020526000908152604090205463ffffffff1681565b608454620002b790600160c01b90046001600160401b031681565b62000329620006c3366004620048ea565b62001e06565b62000329620006da36600462004853565b6200212a565b620002e6620006f1366004620049bb565b620021e0565b620003f46200220b565b620002b76200071236600462004d08565b620022f7565b6200032962000729366004620049ee565b620024c4565b6200032962000740366004620049ee565b62002567565b620003f4600081565b620003f462002606565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b604051620002c6919062004d35565b608554620007a690600160801b900461ffff1681565b60405161ffff9091168152602001620002c6565b62000850620007cb36600462004749565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002c6919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002b790600160801b90046001600160401b031681565b62000329620008be36600462004d49565b620029c8565b620003a6620008d536600462004de1565b60826020526000908152604090205463ffffffff1681565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b6200032962000926366004620049a1565b62002c95565b620003296200093d366004620049bb565b62002d20565b608554620002b7906001600160401b031681565b6200032962002d42565b608454620002b790600160401b90046001600160401b031681565b620003296200098d36600462004e13565b62002ddf565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b62000329620009cc36600462004e8f565b62002e67565b608054620003a69063ffffffff1681565b62000a7a620009f436600462004822565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002c6565b63ffffffff8216600090815260816020526040812062000b1b908362003052565b90505b92915050565b600054600290610100900460ff1615801562000b47575060005460ff8083169116105b62000b6f5760405162461bcd60e51b815260040162000b669062004f26565b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000bf062003097565b62000c0b60008051602062005ec68339815191528862003104565b62000c1860008462003104565b62000c3360008051602062005da68339815191528462003104565b62000c4e60008051602062005e268339815191528462003104565b62000c6960008051602062005d468339815191528462003104565b62000c8460008051602062005d868339815191528562003104565b62000c9f60008051602062005ea68339815191528562003104565b62000cba60008051602062005dc68339815191528562003104565b62000cd560008051602062005e468339815191528562003104565b62000cff60008051602062005ec683398151915260008051602062005d2683398151915262003110565b62000d1a60008051602062005d268339815191528562003104565b62000d3560008051602062005d668339815191528562003104565b62000d5f60008051602062005e8683398151915260008051602062005e6683398151915262003110565b62000d7a60008051602062005e868339815191528362003104565b62000d9560008051602062005e668339815191528362003104565b62000da260003362003104565b6000805461ff001916905560405160ff8216815260008051602062005e068339815191529060200160405180910390a150505050505050565b63ffffffff8116600090815260816020526040812062000b1e9062003165565b60008051602062005ec683398151915262000e1681620031d6565b63ffffffff8916600090815260816020526040902062000e3d818a8a8a8a8a8a8a620031e2565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000ea5576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000ede62002606565b6040518263ffffffff1660e01b815260040162000efd91815260200190565b600060405180830381600087803b15801562000f1857600080fd5b505af115801562000f2d573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005ec683398151915262000fc681620031d6565b63ffffffff8916600090815260816020526040902062000fed818a8a8a8a8a8a8a6200356a565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562001055576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200108e62002606565b6040518263ffffffff1660e01b8152600401620010ad91815260200190565b600060405180830381600087803b158015620010c857600080fd5b505af1158015620010dd573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a604051620011279392919062004f74565b60405180910390a350505050505050505050565b63ffffffff821660009081526081602052604090206200116b60008051602062005ec683398151915233620021e0565b620011bf57606f5460ff16156200119557604051630bc011ff60e21b815260040160405180910390fd5b620011a1818362003052565b620011bf57604051630674f25160e11b815260040160405180910390fd5b620011cb818362003966565b505050565b60008051602062005e46833981519152620011eb81620031d6565b6103e88261ffff1610806200120557506103ff8261ffff16115b156200122457604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200129760008051602062005e8683398151915233620021e0565b6200130657608454600160801b90046001600160401b03161580620012e757506084544290620012dc9062093a8090600160801b90046001600160401b031662004fab565b6001600160401b0316115b15620013065760405163692baaad60e11b815260040160405180910390fd5b6200131062003b58565b565b60009081526034602052604090206001015490565b620013328262001312565b6200133d81620031d6565b620011cb838362003bd7565b6001600160a01b03811633146200137357604051630b4ad1cd60e31b815260040160405180910390fd5b6200137f828262003c43565b5050565b60008051602062005e468339815191526200139e81620031d6565b606f5460ff16620013e0576084546001600160401b03600160c01b909104811690831610620013e05760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1906200127090849062004708565b600054600290610100900460ff1615801562001455575060005460ff8083169116105b620014745760405162461bcd60e51b815260040162000b669062004f26565b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b179055620014f562003097565b6200151060008051602062005ec68339815191528a62003104565b6200151d60008662003104565b6200153860008051602062005da68339815191528662003104565b6200155360008051602062005e268339815191528662003104565b6200156e60008051602062005d468339815191528662003104565b6200158960008051602062005d868339815191528762003104565b620015a460008051602062005ea68339815191528762003104565b620015bf60008051602062005dc68339815191528762003104565b620015da60008051602062005e468339815191528762003104565b6200160460008051602062005ec683398151915260008051602062005d2683398151915262003110565b6200161f60008051602062005d268339815191528762003104565b6200163a60008051602062005d668339815191528762003104565b6200166460008051602062005e8683398151915260008051602062005e6683398151915262003110565b6200167f60008051602062005e868339815191528562003104565b6200169a60008051602062005e668339815191528562003104565b6000620016af8484600561044d600062003cad565b6073546074549192506001600160401b03600160401b90910481169116808214620016ed57604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b0381811660008181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620017ee9695831695600160581b909104909216936076936077939192919091169060040162005081565b600060405180830381600087803b1580156200180957600080fd5b505af11580156200181e573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff8516815260008051602062005e0683398151915293506020019150620018559050565b60405180910390a1505050505050505050565b600060865460646200187b9190620050e7565b905090565b60008051602062005d868339815191526200189b81620031d6565b63ffffffff82161580620018ba5750607e5463ffffffff908116908316115b15620018d957604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200192057604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b60008051602062005ea68339815191526200198681620031d6565b63ffffffff88161580620019a55750607e5463ffffffff908116908916115b15620019c457604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff161515900362001a0b57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001a49576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062001a649063ffffffff1662005101565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001ab290620046fa565b62001ac09392919062005127565b604051809103906000f08015801562001add573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001d51949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001d91908d908d9088908e908e908e906004016200515e565b600060405180830381600087803b15801562001dac57600080fd5b505af115801562001dc1573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001dfb90878787878762003ed2565b979650505050505050565b606f5460ff161562001e2b57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001e7a92600160c01b90048116911662004fab565b6001600160401b0316111562001ea357604051638a0704d360e01b815260040160405180910390fd5b6103e862001eb28888620051c1565b6001600160401b0316111562001edb57604051635acfba9d60e11b815260040160405180910390fd5b62001eed81898989898989896200356a565b62001ef981876200400d565b6085546001600160401b03166000036200200757600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001f75576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001fae62002606565b6040518263ffffffff1660e01b815260040162001fcd91815260200190565b600060405180830381600087803b15801562001fe857600080fd5b505af115801562001ffd573d6000803e3d6000fd5b50505050620020d1565b62002012816200420a565b600681018054600160801b90046001600160401b03169060106200203683620051e4565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b4888789604051620021179392919062004f74565b60405180910390a3505050505050505050565b606f5460ff16156200214f57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88166000908152608160205260409020620021768189898989898989620031e2565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620021d562003b58565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016200225c919062004d35565b602060405180830381865afa1580156200227a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620022a091906200520b565b608454909150600090620022c7906001600160401b03600160401b820481169116620051c1565b6001600160401b0316905080600003620022e45760009250505090565b620022f081836200523b565b9250505090565b606f5460009060ff16156200231f57604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362002357576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200238257604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620023b59084906001600160401b031662004fab565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620023eb878362004fab565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200247a836200420a565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a2582604051620024b2919062004708565b60405180910390a29695505050505050565b60008051602062005e46833981519152620024df81620031d6565b606f5460ff166200251a576085546001600160401b03908116908316106200251a5760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75906200127090849062004708565b60008051602062005e468339815191526200258281620031d6565b62015180826001600160401b03161115620025b057604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28906200127090849062004708565b60805460009063ffffffff168082036200262257506000919050565b6000816001600160401b038111156200263f576200263f62004ac2565b60405190808252806020026020018201604052801562002669578160200160208202803683370190505b50905060005b82811015620026dc57608160006200268983600162005252565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620026bc57620026bc62005268565b602090810291909101015280620026d3816200527e565b9150506200266f565b50600060205b8360011462002920576000620026fa6002866200529a565b620027076002876200523b565b62002713919062005252565b90506000816001600160401b0381111562002732576200273262004ac2565b6040519080825280602002602001820160405280156200275c578160200160208202803683370190505b50905060005b82811015620028d45762002778600184620052b1565b811480156200279357506200278f6002886200529a565b6001145b15620028135785620027a7826002620050e7565b81518110620027ba57620027ba62005268565b602002602001015185604051602001620027d6929190620052c7565b6040516020818303038152906040528051906020012082828151811062002801576200280162005268565b602002602001018181525050620028bf565b8562002821826002620050e7565b8151811062002834576200283462005268565b6020026020010151868260026200284c9190620050e7565b6200285990600162005252565b815181106200286c576200286c62005268565b602002602001015160405160200162002887929190620052c7565b60405160208183030381529060405280519060200120828281518110620028b257620028b262005268565b6020026020010181815250505b80620028cb816200527e565b91505062002762565b508094508195508384604051602001620028f0929190620052c7565b60405160208183030381529060405280519060200120935082806200291590620052d5565b9350505050620026e2565b60008360008151811062002938576200293862005268565b6020026020010151905060005b82811015620029be57818460405160200162002963929190620052c7565b604051602081830303815290604052805190602001209150838460405160200162002990929190620052c7565b6040516020818303038152906040528051906020012093508080620029b5906200527e565b91505062002945565b5095945050505050565b60008051602062005d46833981519152620029e381620031d6565b63ffffffff8416158062002a025750607e5463ffffffff908116908516115b1562002a2157604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002a62576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002ab157604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002af857604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002b3657604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002bb68462000ddb565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002c0b9216908b908b90600401620052ef565b600060405180830381600087803b15801562002c2657600080fd5b505af115801562002c3b573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005d6683398151915262002cb081620031d6565b683635c9adc5dea0000082118062002ccb5750633b9aca0082105b1562002cea57604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001270565b62002d2b8262001312565b62002d3681620031d6565b620011cb838362003c43565b60008051602062005dc683398151915262002d5d81620031d6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002db957600080fd5b505af115801562002dce573d6000803e3d6000fd5b5050505062002ddc620042d5565b50565b60008051602062005e2683398151915262002dfa81620031d6565b6001600160401b03841660009081526083602052604090205463ffffffff161562002e38576040516337c8fe0960e11b815260040160405180910390fd5b600062002e49888888888762003cad565b60008080526002909101602052604090209390935550505050505050565b60008051602062005da683398151915262002e8281620031d6565b607e805460009190829062002e9d9063ffffffff1662005101565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162003040969594939291906200532f565b60405180910390a25050505050505050565b6085546001600160401b038281166000908152600485016020526040812054909242926200308592918116911662004fab565b6001600160401b031611159392505050565b600054610100900460ff16620013105760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b66565b6200137f828262003bd7565b60006200311d8362001312565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6006810154600090600160801b90046001600160401b031615620031b9575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002ddc81336200432e565b60078801546000906001600160401b039081169087161015620032185760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620032b95760068901546001600160401b03600160801b90910481169089161115620032625760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b9092041614620032b257604051632bd2e3e760e01b815260040160405180910390fd5b506200332e565b506001600160401b038516600090815260028901602052604090205480620032f4576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b909104811690871611156200332e57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620033675750876001600160401b0316876001600160401b031611155b806200338b575060068901546001600160401b03600160c01b909104811690881611155b15620033aa5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b9004811690861614620033f1576040516332a2a77f60e01b815260040160405180910390fd5b6000620034038a888888868962003ed2565b9050600060008051602062005de683398151915260028360405162003429919062005388565b602060405180830381855afa15801562003447573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200346c91906200520b565b6200347891906200529a565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620034bc91889190600401620053a6565b602060405180830381865afa158015620034da573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620035009190620053e3565b6200351e576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c0160205260409020600201548590036200355d5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620035788a62003165565b60078b01549091506001600160401b039081169089161015620035ae5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620036515760068a01546001600160401b03600160801b9091048116908a161115620035f85760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200364a57604051632bd2e3e760e01b815260040160405180910390fd5b50620036c1565b6001600160401b038816600090815260028b0160205260409020549150816200368d576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b03161115620036c157604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620036f45760405163b9b18f5760e01b815260040160405180910390fd5b6000620037068b8a8a8a878b62003ed2565b9050600060008051602062005de68339815191526002836040516200372c919062005388565b602060405180830381855afa1580156200374a573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200376f91906200520b565b6200377b91906200529a565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620037bf91899190600401620053a6565b602060405180830381865afa158015620037dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620038039190620053e3565b62003821576040516309bde33960e01b815260040160405180910390fd5b60006200382f848b620051c1565b90506200388887826001600160401b03166200384a6200220b565b620038569190620050e7565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004358565b80608460088282829054906101000a90046001600160401b0316620038ae919062004fab565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b1580156200393e57600080fd5b505af115801562003953573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b9091048116908216111580620039a5575060068201546001600160401b03600160801b9091048116908216115b15620039c45760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003a8062002606565b6040518263ffffffff1660e01b815260040162003a9f91815260200190565b600060405180830381600087803b15801562003aba57600080fd5b505af115801562003acf573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003bb457600080fd5b505af115801562003bc9573d6000803e3d6000fd5b5050505062001310620043ac565b62003be38282620021e0565b6200137f5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003c4f8282620021e0565b156200137f5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b608080546000918291829062003cc99063ffffffff1662005101565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000866001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508060826000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150868260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550858260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550838260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003ec094939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003f08575081155b1562003f275760405163340c614f60e11b815260040160405180910390fd5b8062003f46576040516366385b5160e01b815260040160405180910390fd5b62003f518462004409565b62003f6f576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b60006200401a8362003165565b9050816000806200402c8484620051c1565b6085546001600160401b0391821692506000916200405391600160401b90041642620052b1565b90505b846001600160401b0316846001600160401b031614620040dd576001600160401b03808516600090815260038901602052604090206001810154909116821015620040b8576001810154600160401b90046001600160401b03169450620040d6565b620040c48686620051c1565b6001600160401b0316935050620040dd565b5062004056565b6000620040eb8484620052b1565b9050838110156200414957808403600c81116200410957806200410c565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a60865402816200413e576200413e62005225565b0460865550620041c1565b838103600c81116200415c57806200415f565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162004199576200419962005225565b04905080608654670de0b6b3a76400000281620041ba57620041ba62005225565b0460865550505b683635c9adc5dea000006086541115620041e857683635c9adc5dea0000060865562004200565b633b9aca0060865410156200420057633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002ddc5760068101546000906200425590600160c01b90046001600160401b0316600162004fab565b905062004263828262003052565b156200137f57600682015460009060029062004291908490600160801b90046001600160401b0316620051c1565b6200429d919062005407565b620042a9908362004fab565b9050620042b7838262003052565b15620042c957620011cb838262003966565b620011cb838362003966565b606f5460ff16620042f957604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6200433a8282620021e0565b6200137f57604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620011cb9084906200448f565b606f5460ff1615620043d157604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b03831610801562004440575067ffffffff00000001604083901c6001600160401b0316105b801562004461575067ffffffff00000001608083901c6001600160401b0316105b801562004479575067ffffffff0000000160c083901c105b156200448757506001919050565b506000919050565b6000620044e6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620045689092919063ffffffff16565b805190915015620011cb5780806020019051810190620045079190620053e3565b620011cb5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b66565b606062004579848460008562004581565b949350505050565b606082471015620045e45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b66565b600080866001600160a01b0316858760405162004602919062005388565b60006040518083038185875af1925050503d806000811462004641576040519150601f19603f3d011682016040523d82523d6000602084013e62004646565b606091505b509150915062001dfb8783838760608315620046c7578251600003620046bf576001600160a01b0385163b620046bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b66565b508162004579565b620045798383815115620046de5781518083602001fd5b8060405162461bcd60e51b815260040162000b66919062004cf3565b6108f5806200543183390190565b6001600160401b0391909116815260200190565b803563ffffffff81168114620031d157600080fd5b80356001600160401b0381168114620031d157600080fd5b600080604083850312156200475d57600080fd5b62004768836200471c565b9150620047786020840162004731565b90509250929050565b6001600160a01b038116811462002ddc57600080fd5b60008060008060008060c08789031215620047b157600080fd5b8635620047be8162004781565b9550620047ce6020880162004731565b9450620047de6040880162004731565b93506060870135620047f08162004781565b92506080870135620048028162004781565b915060a0870135620048148162004781565b809150509295509295509295565b6000602082840312156200483557600080fd5b62000b1b826200471c565b80610300810183101562000b1e57600080fd5b6000806000806000806000806103e0898b0312156200487157600080fd5b6200487c896200471c565b97506200488c60208a0162004731565b96506200489c60408a0162004731565b9550620048ac60608a0162004731565b9450620048bc60808a0162004731565b935060a0890135925060c08901359150620048db8a60e08b0162004840565b90509295985092959890939650565b6000806000806000806000806103e0898b0312156200490857600080fd5b62004913896200471c565b97506200492360208a0162004731565b96506200493360408a0162004731565b95506200494360608a0162004731565b94506080890135935060a0890135925060c0890135620049638162004781565b9150620048db8a60e08b0162004840565b6000602082840312156200498757600080fd5b813561ffff811681146200499a57600080fd5b9392505050565b600060208284031215620049b457600080fd5b5035919050565b60008060408385031215620049cf57600080fd5b823591506020830135620049e38162004781565b809150509250929050565b60006020828403121562004a0157600080fd5b62000b1b8262004731565b600080600080600080600080610100898b03121562004a2a57600080fd5b883562004a378162004781565b975062004a4760208a0162004731565b965062004a5760408a0162004731565b9550606089013562004a698162004781565b9450608089013562004a7b8162004781565b935060a089013562004a8d8162004781565b925060c089013562004a9f8162004781565b915060e089013562004ab18162004781565b809150509295985092959890939650565b634e487b7160e01b600052604160045260246000fd5b600082601f83011262004aea57600080fd5b81356001600160401b038082111562004b075762004b0762004ac2565b604051601f8301601f19908116603f0116810190828211818310171562004b325762004b3262004ac2565b8160405283815286602085880101111562004b4c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121562004b8857600080fd5b62004b93886200471c565b965062004ba36020890162004731565b9550604088013562004bb58162004781565b9450606088013562004bc78162004781565b9350608088013562004bd98162004781565b925060a08801356001600160401b038082111562004bf657600080fd5b62004c048b838c0162004ad8565b935060c08a013591508082111562004c1b57600080fd5b5062004c2a8a828b0162004ad8565b91505092959891949750929550565b60008060008060008060c0878903121562004c5357600080fd5b62004c5e876200471c565b955062004c6e6020880162004731565b945062004c7e6040880162004731565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004cbc57818101518382015260200162004ca2565b50506000910152565b6000815180845262004cdf81602086016020860162004c9f565b601f01601f19169290920160200192915050565b60208152600062000b1b602083018462004cc5565b6000806040838503121562004d1c57600080fd5b62004d278362004731565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000806000806060858703121562004d6057600080fd5b843562004d6d8162004781565b935062004d7d602086016200471c565b925060408501356001600160401b038082111562004d9a57600080fd5b818701915087601f83011262004daf57600080fd5b81358181111562004dbf57600080fd5b88602082850101111562004dd257600080fd5b95989497505060200194505050565b60006020828403121562004df457600080fd5b81356200499a8162004781565b803560ff81168114620031d157600080fd5b60008060008060008060c0878903121562004e2d57600080fd5b863562004e3a8162004781565b9550602087013562004e4c8162004781565b945062004e5c6040880162004731565b935062004e6c6060880162004731565b92506080870135915062004e8360a0880162004e01565b90509295509295509295565b60008060008060008060c0878903121562004ea957600080fd5b863562004eb68162004781565b9550602087013562004ec88162004781565b945062004ed86040880162004731565b935062004ee86060880162004e01565b92506080870135915060a08701356001600160401b0381111562004f0b57600080fd5b62004f1989828a0162004ad8565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004fce5762004fce62004f95565b5092915050565b8054600090600181811c908083168062004ff057607f831692505b602080841082036200501257634e487b7160e01b600052602260045260246000fd5b83885260208801828015620050305760018114620050475762005074565b60ff198716825285151560051b8201975062005074565b60008981526020902060005b878110156200506e5781548482015290860190840162005053565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c060408201819052600090620050af9083018762004fd5565b8281036060840152620050c3818762004fd5565b608084019590955250506001600160401b039190911660a090910152949350505050565b808202811582820484141762000b1e5762000b1e62004f95565b600063ffffffff8083168181036200511d576200511d62004f95565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620051559083018462004cc5565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c060808201819052600090620051a09083018562004cc5565b82810360a0840152620051b4818562004cc5565b9998505050505050505050565b6001600160401b0382811682821603908082111562004fce5762004fce62004f95565b60006001600160401b038281166002600160401b031981016200511d576200511d62004f95565b6000602082840312156200521e57600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b6000826200524d576200524d62005225565b500490565b8082018082111562000b1e5762000b1e62004f95565b634e487b7160e01b600052603260045260246000fd5b60006001820162005293576200529362004f95565b5060010190565b600082620052ac57620052ac62005225565b500690565b8181038181111562000b1e5762000b1e62004f95565b918252602082015260400190565b600081620052e757620052e762004f95565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190526000906200537c9083018462004cc5565b98975050505050505050565b600082516200539c81846020870162004c9f565b9190910192915050565b61032081016103008085843782018360005b6001811015620053d9578151835260209283019290910190600101620053b8565b5050509392505050565b600060208284031215620053f657600080fd5b815180151581146200499a57600080fd5b60006001600160401b038381168062005424576200542462005225565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220a19e7a72432195d9a35c7ce8fa5f1284415aac66bb1ad08a4c2e1c252fd8690864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a26469706673582212206abd8d41cddbceaedfd87b2e57b4fd718dbd21be2f778ec08faf526cc9649e0064736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMV2.json b/compiled-contracts/paris/PolygonZkEVMV2.json index e07801a3d..8d3712ca9 100644 --- a/compiled-contracts/paris/PolygonZkEVMV2.json +++ b/compiled-contracts/paris/PolygonZkEVMV2.json @@ -502,6 +502,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS_EMPTY_METADATA", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "INITIALIZE_TX_CONSTANT_BYTES", @@ -515,6 +528,32 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "INITIALIZE_TX_CONSTANT_BYTES_EMPTY_METADATA", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_DATA_LEN_EMPTY_METADATA", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "INITIALIZE_TX_EFFECTIVE_PERCENTAGE", @@ -1070,8 +1109,8 @@ "type": "function" } ], - "bytecode": "0x6101006040523480156200001257600080fd5b506040516200456738038062004567833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e0516143c1620001a6600039600081816104f90152818161093801528181610aa5015281816111fc015281816112c5015281816112e70152818161147e015281816116fb01528181611cb4015281816127c5015281816128930152612980015260008181610604015281816113bf0152818161195501526120b50152600081816106c001528181610f1f01528181611b0a0152612acb015260008181610705015281816107d00152818161124f015281816113950152612a9f01526143c16000f3fe608060405234801561001057600080fd5b50600436106102c75760003560e01c80636ff512cc1161017b578063c89e42df116100d8578063e46761c41161008c578063eaeb077b11610071578063eaeb077b14610747578063f35dda471461075a578063f851a4401461076257600080fd5b8063e46761c414610700578063e7a7ed021461072757600080fd5b8063d02103ca116100bd578063d02103ca146106bb578063d7bc90ff146106e2578063d8d1091b146106ed57600080fd5b8063c89e42df14610688578063cfa8ed471461069b57600080fd5b8063a3c573eb1161012f578063ada8f91911610114578063ada8f91914610639578063b0afe1541461064c578063c754c7ed1461065857600080fd5b8063a3c573eb146105ff578063a652f26c1461062657600080fd5b80637a5460c5116101605780637a5460c5146105a05780638c3d7301146105dc5780639e001877146105e457600080fd5b80636ff512cc1461057a578063712570221461058d57600080fd5b80633cbc795b11610229578063542028d5116101dd5780635ec91958116101c25780635ec91958146105495780636b8616ce146105515780636e05d2cd1461057157600080fd5b8063542028d51461052e5780635e9145c91461053657600080fd5b8063456052671161020e57806345605267146104cc57806349b7b802146104f45780634e4877061461051b57600080fd5b80633cbc795b1461043657806340b5de6c1461047457600080fd5b806319d8ac61116102805780632b35b3ac116102655780632b35b3ac146103df57806332c2d153146103fc5780633c351e101461041157600080fd5b806319d8ac611461036d578063267822471461039a57600080fd5b806305835f37116102b157806305835f3714610302578063107bf28c1461034b57806311e892d41461035357600080fd5b8062d0295d146102cc57806303508963146102e7575b600080fd5b6102d4610788565b6040519081526020015b60405180910390f35b6102ef602081565b60405161ffff90911681526020016102de565b61033e6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102de9190613637565b61033e6108a8565b61035b60f981565b60405160ff90911681526020016102de565b6007546103819067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102de565b6001546103ba9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102de565b6008546103ec9060ff1681565b60405190151581526020016102de565b61040f61040a36600461368c565b610936565b005b6008546103ba90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60085461045f907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102de565b61049b7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102de565b60075461038190700100000000000000000000000000000000900467ffffffffffffffff1681565b6103ba7f000000000000000000000000000000000000000000000000000000000000000081565b61040f6105293660046136ce565b610a05565b61033e610c1f565b61040f610544366004613737565b610c2c565b61040f611545565b6102d461055f3660046136ce565b60066020526000908152604090205481565b6102d460055481565b61040f610588366004613783565b61162f565b61040f61059b3660046138cc565b6116f9565b61033e6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61040f611eaf565b6103ba73a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103ba7f000000000000000000000000000000000000000000000000000000000000000081565b61033e610634366004613979565b611f82565b61040f610647366004613783565b6122ac565b6102d46405ca1ab1e081565b600754610381907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61040f6106963660046139ee565b612376565b6002546103ba9073ffffffffffffffffffffffffffffffffffffffff1681565b6103ba7f000000000000000000000000000000000000000000000000000000000000000081565b6102d4635ca1ab1e81565b61040f6106fb366004613a23565b612409565b6103ba7f000000000000000000000000000000000000000000000000000000000000000081565b6007546103819068010000000000000000900467ffffffffffffffff1681565b61040f610755366004613a65565b612940565b61035b601b81565b6000546103ba9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610817573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083b9190613add565b60075490915060009061087a9067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613b25565b67ffffffffffffffff169050806000036108975760009250505090565b6108a18183613b4d565b9250505090565b600480546108b590613b88565b80601f01602080910402602001604051908101604052809291908181526020018280546108e190613b88565b801561092e5780601f106109035761010080835404028352916020019161092e565b820191906000526020600020905b81548152906001019060200180831161091157829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109a5576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966846040516109f891815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a5c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610aa3576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b329190613bdb565b610b9b5760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610b9b576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546108b590613b88565b60025473ffffffffffffffffffffffffffffffffffffffff163314610c7d576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003610cb9576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610cf5576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b85811015611131576000898983818110610d3e57610d3e613bfd565b9050602002810190610d509190613c2c565b610d5990613c6a565b8051805160209091012060608201519192509067ffffffffffffffff1615610edc5785610d8581613cfb565b96505060008183602001518460600151604051602001610ddd93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114610e66576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015610ebc576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055611019565b602082015115801590610fa3575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015610f7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa19190613add565b155b15610fda576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611019576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff16108061104c575042826040015167ffffffffffffffff16115b15611083576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061112990613d22565b915050610d22565b5060075467ffffffffffffffff6801000000000000000090910481169084161115611188576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146112bf5760006111df8386613b25565b90506111f567ffffffffffffffff821683613d5a565b91506112767f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661122e610788565b6112389190613d6d565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190612d2f565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6113bd337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611350573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113749190613add565b61137e9190613d6d565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190612e08565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561142557600080fd5b505af1158015611439573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af11580156114dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115019190613d84565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461159c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff16156115d9576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611686576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c14565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611768576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156117885750600054600160ff909116105b806117a25750303b1580156117a2575060005460ff166001145b611833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561189157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611aa6576118b885612e6c565b6118c186612f7c565b6118ca87613083565b6040516020016118dc93929190613da1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af115801561199d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c19190613dda565b915091508163ffffffff16600014611a5e57600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff851602179055611aa3565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b600854600090611af3908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff1685611f82565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b979190613add565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611d12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d369190613d84565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611dc89190613e62565b506004611dd58982613e62565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611e3593929190613f7c565b60405180910390a15050505050508015611ea657600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611f00576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa600087604051602401611fb696959493929190613fbb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff700000000000000000000000000000000000000000000000000000000179052805190915061ffff101561206c576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600060f961207d60208461401e565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525086886040516020016121229796959493929190614039565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa1580156121b0573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612228576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405160009061226e9084906405ca1ab1e090635ca1ab1e90601b907fff000000000000000000000000000000000000000000000000000000000000009060200161411c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052955050505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612303576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c14565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146123cd576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036123d98282613e62565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c149190613637565b60085460ff16612445576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003612481576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156124bd576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff6801000000000000000082048116916124f8918491700100000000000000000000000000000000900416614178565b1115612530576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b838110156127bf57600086868381811061257557612575613bfd565b9050602002810190612587919061418b565b612590906141bf565b90508361259c81613cfb565b825180516020918201208185015160408087015190519499509194506000936125fe9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612687576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86166000908152600660205260408120556126ac600188613d5a565b840361271b5742600760189054906101000a900467ffffffffffffffff1684604001516126d9919061423d565b67ffffffffffffffff16111561271b576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806127b790613d22565b915050612559565b506127ed7f00000000000000000000000000000000000000000000000000000000000000008461122e610788565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af11580156128dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129009190613d84565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff1661297c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129e9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0d9190613add565b905081811115612a49576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612a85576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ac773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084612e08565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b589190613add565b600780549192506801000000000000000090910467ffffffffffffffff16906008612b8283613cfb565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612bb992919061425e565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612cc9576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612d28565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612d1f949392919061426e565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052612e039084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613176565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612e669085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612d81565b50505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691612eee91906142df565b600060405180830381855afa9150503d8060008114612f29576040519150601f19603f3d011682016040523d82523d6000602084013e612f2e565b606091505b509150915081612f73576040518060400160405280600781526020017f4e4f5f4e414d45000000000000000000000000000000000000000000000000008152506122a4565b6122a481613282565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691612ffe91906142df565b600060405180830381855afa9150503d8060008114613039576040519150601f19603f3d011682016040523d82523d6000602084013e61303e565b606091505b509150915081612f73576040518060400160405280600981526020017f4e4f5f53594d424f4c00000000000000000000000000000000000000000000008152506122a4565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169161310491906142df565b600060405180830381855afa9150503d806000811461313f576040519150601f19603f3d011682016040523d82523d6000602084013e613144565b606091505b5091509150818015613157575080516020145b6131625760126122a4565b808060200190518101906122a491906142f1565b60006131d8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166134589092919063ffffffff16565b805190915015612e0357808060200190518101906131f69190613bdb565b612e03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161182a565b606060408251106132a757818060200190518101906132a19190614314565b92915050565b815160200361341f5760005b6020811080156132fa57508281815181106132d0576132d0613bfd565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613311578061330981613d22565b9150506132b3565b8060000361335457505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111561336f5761336f6137b2565b6040519080825280601f01601f191660200182016040528015613399576020820181803683370190505b50905060005b82811015613417578481815181106133b9576133b9613bfd565b602001015160f81c60f81b8282815181106133d6576133d6613bfd565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061340f81613d22565b91505061339f565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60606122a48484600085856000808673ffffffffffffffffffffffffffffffffffffffff16858760405161348c91906142df565b60006040518083038185875af1925050503d80600081146134c9576040519150601f19603f3d011682016040523d82523d6000602084013e6134ce565b606091505b50915091506134df878383876134ea565b979650505050505050565b606083156135805782516000036135795773ffffffffffffffffffffffffffffffffffffffff85163b613579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161182a565b50816122a4565b6122a483838151156135955781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182a9190613637565b60005b838110156135e45781810151838201526020016135cc565b50506000910152565b600081518084526136058160208601602086016135c9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061364a60208301846135ed565b9392505050565b67ffffffffffffffff8116811461366757600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461366757600080fd5b6000806000606084860312156136a157600080fd5b83356136ac81613651565b92506020840135915060408401356136c38161366a565b809150509250925092565b6000602082840312156136e057600080fd5b813561364a81613651565b60008083601f8401126136fd57600080fd5b50813567ffffffffffffffff81111561371557600080fd5b6020830191508360208260051b850101111561373057600080fd5b9250929050565b60008060006040848603121561374c57600080fd5b833567ffffffffffffffff81111561376357600080fd5b61376f868287016136eb565b90945092505060208401356136c38161366a565b60006020828403121561379557600080fd5b813561364a8161366a565b63ffffffff8116811461366757600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613828576138286137b2565b604052919050565b600067ffffffffffffffff82111561384a5761384a6137b2565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261388757600080fd5b813561389a61389582613830565b6137e1565b8181528460208386010111156138af57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c087890312156138e557600080fd5b86356138f08161366a565b955060208701356139008161366a565b94506040870135613910816137a0565b935060608701356139208161366a565b9250608087013567ffffffffffffffff8082111561393d57600080fd5b6139498a838b01613876565b935060a089013591508082111561395f57600080fd5b5061396c89828a01613876565b9150509295509295509295565b6000806000806080858703121561398f57600080fd5b843561399a816137a0565b935060208501356139aa8161366a565b925060408501356139ba816137a0565b9150606085013567ffffffffffffffff8111156139d657600080fd5b6139e287828801613876565b91505092959194509250565b600060208284031215613a0057600080fd5b813567ffffffffffffffff811115613a1757600080fd5b6122a484828501613876565b60008060208385031215613a3657600080fd5b823567ffffffffffffffff811115613a4d57600080fd5b613a59858286016136eb565b90969095509350505050565b600080600060408486031215613a7a57600080fd5b833567ffffffffffffffff80821115613a9257600080fd5b818601915086601f830112613aa657600080fd5b813581811115613ab557600080fd5b876020828501011115613ac757600080fd5b6020928301989097509590910135949350505050565b600060208284031215613aef57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613b4657613b46613af6565b5092915050565b600082613b83577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613b9c57607f821691505b602082108103613bd5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215613bed57600080fd5b8151801515811461364a57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613c6057600080fd5b9190910192915050565b600060808236031215613c7c57600080fd5b6040516080810167ffffffffffffffff8282108183111715613ca057613ca06137b2565b816040528435915080821115613cb557600080fd5b50613cc236828601613876565b825250602083013560208201526040830135613cdd81613651565b60408201526060830135613cf081613651565b606082015292915050565b600067ffffffffffffffff808316818103613d1857613d18613af6565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d5357613d53613af6565b5060010190565b818103818111156132a1576132a1613af6565b80820281158282048414176132a1576132a1613af6565b600060208284031215613d9657600080fd5b815161364a81613651565b606081526000613db460608301866135ed565b8281036020840152613dc681866135ed565b91505060ff83166040830152949350505050565b60008060408385031215613ded57600080fd5b8251613df8816137a0565b6020840151909250613e098161366a565b809150509250929050565b601f821115612e0357600081815260208120601f850160051c81016020861015613e3b5750805b601f850160051c820191505b81811015613e5a57828155600101613e47565b505050505050565b815167ffffffffffffffff811115613e7c57613e7c6137b2565b613e9081613e8a8454613b88565b84613e14565b602080601f831160018114613ee35760008415613ead5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613e5a565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613f3057888601518255948401946001909101908401613f11565b5085821015613f6c57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081526000613f8f60608301866135ed565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261401260c08301846135ed565b98975050505050505050565b61ffff818116838216019080821115613b4657613b46613af6565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b16600184015287516140a2816003860160208c016135c9565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516140e5816017840160208b016135c9565b808201915050818660f01b1660178201528451915061410b8260198301602088016135c9565b016019019998505050505050505050565b6000865161412e818460208b016135c9565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b808201808211156132a1576132a1613af6565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112613c6057600080fd5b6000606082360312156141d157600080fd5b6040516060810167ffffffffffffffff82821081831117156141f5576141f56137b2565b81604052843591508082111561420a57600080fd5b5061421736828601613876565b82525060208301356020820152604083013561423281613651565b604082015292915050565b67ffffffffffffffff818116838216019080821115613b4657613b46613af6565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b60008251613c608184602087016135c9565b60006020828403121561430357600080fd5b815160ff8116811461364a57600080fd5b60006020828403121561432657600080fd5b815167ffffffffffffffff81111561433d57600080fd5b8201601f8101841361434e57600080fd5b805161435c61389582613830565b81815285602083850101111561437157600080fd5b6143828260208301602086016135c9565b9594505050505056fea26469706673582212204d4a296dccd84396793e05827383751e30ca858be4e44232f191c2b76670a8c364736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102c75760003560e01c80636ff512cc1161017b578063c89e42df116100d8578063e46761c41161008c578063eaeb077b11610071578063eaeb077b14610747578063f35dda471461075a578063f851a4401461076257600080fd5b8063e46761c414610700578063e7a7ed021461072757600080fd5b8063d02103ca116100bd578063d02103ca146106bb578063d7bc90ff146106e2578063d8d1091b146106ed57600080fd5b8063c89e42df14610688578063cfa8ed471461069b57600080fd5b8063a3c573eb1161012f578063ada8f91911610114578063ada8f91914610639578063b0afe1541461064c578063c754c7ed1461065857600080fd5b8063a3c573eb146105ff578063a652f26c1461062657600080fd5b80637a5460c5116101605780637a5460c5146105a05780638c3d7301146105dc5780639e001877146105e457600080fd5b80636ff512cc1461057a578063712570221461058d57600080fd5b80633cbc795b11610229578063542028d5116101dd5780635ec91958116101c25780635ec91958146105495780636b8616ce146105515780636e05d2cd1461057157600080fd5b8063542028d51461052e5780635e9145c91461053657600080fd5b8063456052671161020e57806345605267146104cc57806349b7b802146104f45780634e4877061461051b57600080fd5b80633cbc795b1461043657806340b5de6c1461047457600080fd5b806319d8ac61116102805780632b35b3ac116102655780632b35b3ac146103df57806332c2d153146103fc5780633c351e101461041157600080fd5b806319d8ac611461036d578063267822471461039a57600080fd5b806305835f37116102b157806305835f3714610302578063107bf28c1461034b57806311e892d41461035357600080fd5b8062d0295d146102cc57806303508963146102e7575b600080fd5b6102d4610788565b6040519081526020015b60405180910390f35b6102ef602081565b60405161ffff90911681526020016102de565b61033e6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102de9190613637565b61033e6108a8565b61035b60f981565b60405160ff90911681526020016102de565b6007546103819067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102de565b6001546103ba9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102de565b6008546103ec9060ff1681565b60405190151581526020016102de565b61040f61040a36600461368c565b610936565b005b6008546103ba90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60085461045f907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102de565b61049b7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102de565b60075461038190700100000000000000000000000000000000900467ffffffffffffffff1681565b6103ba7f000000000000000000000000000000000000000000000000000000000000000081565b61040f6105293660046136ce565b610a05565b61033e610c1f565b61040f610544366004613737565b610c2c565b61040f611545565b6102d461055f3660046136ce565b60066020526000908152604090205481565b6102d460055481565b61040f610588366004613783565b61162f565b61040f61059b3660046138cc565b6116f9565b61033e6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61040f611eaf565b6103ba73a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103ba7f000000000000000000000000000000000000000000000000000000000000000081565b61033e610634366004613979565b611f82565b61040f610647366004613783565b6122ac565b6102d46405ca1ab1e081565b600754610381907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61040f6106963660046139ee565b612376565b6002546103ba9073ffffffffffffffffffffffffffffffffffffffff1681565b6103ba7f000000000000000000000000000000000000000000000000000000000000000081565b6102d4635ca1ab1e81565b61040f6106fb366004613a23565b612409565b6103ba7f000000000000000000000000000000000000000000000000000000000000000081565b6007546103819068010000000000000000900467ffffffffffffffff1681565b61040f610755366004613a65565b612940565b61035b601b81565b6000546103ba9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610817573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083b9190613add565b60075490915060009061087a9067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613b25565b67ffffffffffffffff169050806000036108975760009250505090565b6108a18183613b4d565b9250505090565b600480546108b590613b88565b80601f01602080910402602001604051908101604052809291908181526020018280546108e190613b88565b801561092e5780601f106109035761010080835404028352916020019161092e565b820191906000526020600020905b81548152906001019060200180831161091157829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109a5576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966846040516109f891815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a5c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610aa3576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b329190613bdb565b610b9b5760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610b9b576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546108b590613b88565b60025473ffffffffffffffffffffffffffffffffffffffff163314610c7d576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003610cb9576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610cf5576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b85811015611131576000898983818110610d3e57610d3e613bfd565b9050602002810190610d509190613c2c565b610d5990613c6a565b8051805160209091012060608201519192509067ffffffffffffffff1615610edc5785610d8581613cfb565b96505060008183602001518460600151604051602001610ddd93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114610e66576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015610ebc576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055611019565b602082015115801590610fa3575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015610f7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa19190613add565b155b15610fda576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611019576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff16108061104c575042826040015167ffffffffffffffff16115b15611083576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061112990613d22565b915050610d22565b5060075467ffffffffffffffff6801000000000000000090910481169084161115611188576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146112bf5760006111df8386613b25565b90506111f567ffffffffffffffff821683613d5a565b91506112767f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661122e610788565b6112389190613d6d565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190612d2f565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6113bd337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611350573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113749190613add565b61137e9190613d6d565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190612e08565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561142557600080fd5b505af1158015611439573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af11580156114dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115019190613d84565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461159c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff16156115d9576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611686576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c14565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611768576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156117885750600054600160ff909116105b806117a25750303b1580156117a2575060005460ff166001145b611833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561189157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611aa6576118b885612e6c565b6118c186612f7c565b6118ca87613083565b6040516020016118dc93929190613da1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af115801561199d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c19190613dda565b915091508163ffffffff16600014611a5e57600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff851602179055611aa3565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b600854600090611af3908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff1685611f82565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b979190613add565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611d12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d369190613d84565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611dc89190613e62565b506004611dd58982613e62565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611e3593929190613f7c565b60405180910390a15050505050508015611ea657600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611f00576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa600087604051602401611fb696959493929190613fbb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff700000000000000000000000000000000000000000000000000000000179052805190915061ffff101561206c576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600060f961207d60208461401e565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525086886040516020016121229796959493929190614039565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa1580156121b0573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612228576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405160009061226e9084906405ca1ab1e090635ca1ab1e90601b907fff000000000000000000000000000000000000000000000000000000000000009060200161411c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052955050505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612303576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c14565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146123cd576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036123d98282613e62565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c149190613637565b60085460ff16612445576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003612481576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156124bd576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff6801000000000000000082048116916124f8918491700100000000000000000000000000000000900416614178565b1115612530576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b838110156127bf57600086868381811061257557612575613bfd565b9050602002810190612587919061418b565b612590906141bf565b90508361259c81613cfb565b825180516020918201208185015160408087015190519499509194506000936125fe9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612687576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86166000908152600660205260408120556126ac600188613d5a565b840361271b5742600760189054906101000a900467ffffffffffffffff1684604001516126d9919061423d565b67ffffffffffffffff16111561271b576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806127b790613d22565b915050612559565b506127ed7f00000000000000000000000000000000000000000000000000000000000000008461122e610788565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af11580156128dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129009190613d84565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff1661297c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129e9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0d9190613add565b905081811115612a49576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612a85576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ac773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084612e08565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b589190613add565b600780549192506801000000000000000090910467ffffffffffffffff16906008612b8283613cfb565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612bb992919061425e565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612cc9576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612d28565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612d1f949392919061426e565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052612e039084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613176565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612e669085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612d81565b50505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691612eee91906142df565b600060405180830381855afa9150503d8060008114612f29576040519150601f19603f3d011682016040523d82523d6000602084013e612f2e565b606091505b509150915081612f73576040518060400160405280600781526020017f4e4f5f4e414d45000000000000000000000000000000000000000000000000008152506122a4565b6122a481613282565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691612ffe91906142df565b600060405180830381855afa9150503d8060008114613039576040519150601f19603f3d011682016040523d82523d6000602084013e61303e565b606091505b509150915081612f73576040518060400160405280600981526020017f4e4f5f53594d424f4c00000000000000000000000000000000000000000000008152506122a4565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169161310491906142df565b600060405180830381855afa9150503d806000811461313f576040519150601f19603f3d011682016040523d82523d6000602084013e613144565b606091505b5091509150818015613157575080516020145b6131625760126122a4565b808060200190518101906122a491906142f1565b60006131d8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166134589092919063ffffffff16565b805190915015612e0357808060200190518101906131f69190613bdb565b612e03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161182a565b606060408251106132a757818060200190518101906132a19190614314565b92915050565b815160200361341f5760005b6020811080156132fa57508281815181106132d0576132d0613bfd565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613311578061330981613d22565b9150506132b3565b8060000361335457505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111561336f5761336f6137b2565b6040519080825280601f01601f191660200182016040528015613399576020820181803683370190505b50905060005b82811015613417578481815181106133b9576133b9613bfd565b602001015160f81c60f81b8282815181106133d6576133d6613bfd565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061340f81613d22565b91505061339f565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60606122a48484600085856000808673ffffffffffffffffffffffffffffffffffffffff16858760405161348c91906142df565b60006040518083038185875af1925050503d80600081146134c9576040519150601f19603f3d011682016040523d82523d6000602084013e6134ce565b606091505b50915091506134df878383876134ea565b979650505050505050565b606083156135805782516000036135795773ffffffffffffffffffffffffffffffffffffffff85163b613579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161182a565b50816122a4565b6122a483838151156135955781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182a9190613637565b60005b838110156135e45781810151838201526020016135cc565b50506000910152565b600081518084526136058160208601602086016135c9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061364a60208301846135ed565b9392505050565b67ffffffffffffffff8116811461366757600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461366757600080fd5b6000806000606084860312156136a157600080fd5b83356136ac81613651565b92506020840135915060408401356136c38161366a565b809150509250925092565b6000602082840312156136e057600080fd5b813561364a81613651565b60008083601f8401126136fd57600080fd5b50813567ffffffffffffffff81111561371557600080fd5b6020830191508360208260051b850101111561373057600080fd5b9250929050565b60008060006040848603121561374c57600080fd5b833567ffffffffffffffff81111561376357600080fd5b61376f868287016136eb565b90945092505060208401356136c38161366a565b60006020828403121561379557600080fd5b813561364a8161366a565b63ffffffff8116811461366757600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613828576138286137b2565b604052919050565b600067ffffffffffffffff82111561384a5761384a6137b2565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261388757600080fd5b813561389a61389582613830565b6137e1565b8181528460208386010111156138af57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c087890312156138e557600080fd5b86356138f08161366a565b955060208701356139008161366a565b94506040870135613910816137a0565b935060608701356139208161366a565b9250608087013567ffffffffffffffff8082111561393d57600080fd5b6139498a838b01613876565b935060a089013591508082111561395f57600080fd5b5061396c89828a01613876565b9150509295509295509295565b6000806000806080858703121561398f57600080fd5b843561399a816137a0565b935060208501356139aa8161366a565b925060408501356139ba816137a0565b9150606085013567ffffffffffffffff8111156139d657600080fd5b6139e287828801613876565b91505092959194509250565b600060208284031215613a0057600080fd5b813567ffffffffffffffff811115613a1757600080fd5b6122a484828501613876565b60008060208385031215613a3657600080fd5b823567ffffffffffffffff811115613a4d57600080fd5b613a59858286016136eb565b90969095509350505050565b600080600060408486031215613a7a57600080fd5b833567ffffffffffffffff80821115613a9257600080fd5b818601915086601f830112613aa657600080fd5b813581811115613ab557600080fd5b876020828501011115613ac757600080fd5b6020928301989097509590910135949350505050565b600060208284031215613aef57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613b4657613b46613af6565b5092915050565b600082613b83577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613b9c57607f821691505b602082108103613bd5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215613bed57600080fd5b8151801515811461364a57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613c6057600080fd5b9190910192915050565b600060808236031215613c7c57600080fd5b6040516080810167ffffffffffffffff8282108183111715613ca057613ca06137b2565b816040528435915080821115613cb557600080fd5b50613cc236828601613876565b825250602083013560208201526040830135613cdd81613651565b60408201526060830135613cf081613651565b606082015292915050565b600067ffffffffffffffff808316818103613d1857613d18613af6565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d5357613d53613af6565b5060010190565b818103818111156132a1576132a1613af6565b80820281158282048414176132a1576132a1613af6565b600060208284031215613d9657600080fd5b815161364a81613651565b606081526000613db460608301866135ed565b8281036020840152613dc681866135ed565b91505060ff83166040830152949350505050565b60008060408385031215613ded57600080fd5b8251613df8816137a0565b6020840151909250613e098161366a565b809150509250929050565b601f821115612e0357600081815260208120601f850160051c81016020861015613e3b5750805b601f850160051c820191505b81811015613e5a57828155600101613e47565b505050505050565b815167ffffffffffffffff811115613e7c57613e7c6137b2565b613e9081613e8a8454613b88565b84613e14565b602080601f831160018114613ee35760008415613ead5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613e5a565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613f3057888601518255948401946001909101908401613f11565b5085821015613f6c57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081526000613f8f60608301866135ed565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261401260c08301846135ed565b98975050505050505050565b61ffff818116838216019080821115613b4657613b46613af6565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b16600184015287516140a2816003860160208c016135c9565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516140e5816017840160208b016135c9565b808201915050818660f01b1660178201528451915061410b8260198301602088016135c9565b016019019998505050505050505050565b6000865161412e818460208b016135c9565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b808201808211156132a1576132a1613af6565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112613c6057600080fd5b6000606082360312156141d157600080fd5b6040516060810167ffffffffffffffff82821081831117156141f5576141f56137b2565b81604052843591508082111561420a57600080fd5b5061421736828601613876565b82525060208301356020820152604083013561423281613651565b604082015292915050565b67ffffffffffffffff818116838216019080821115613b4657613b46613af6565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b60008251613c608184602087016135c9565b60006020828403121561430357600080fd5b815160ff8116811461364a57600080fd5b60006020828403121561432657600080fd5b815167ffffffffffffffff81111561433d57600080fd5b8201601f8101841361434e57600080fd5b805161435c61389582613830565b81815285602083850101111561437157600080fd5b6143828260208301602086016135c9565b9594505050505056fea26469706673582212204d4a296dccd84396793e05827383751e30ca858be4e44232f191c2b76670a8c364736f6c63430008140033", + "bytecode": "0x6101006040523480156200001257600080fd5b506040516200477938038062004779833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e0516145cc620001ad6000396000818161051a015281816109a501528181610b12015281816112690152818161133201528181611354015281816114eb0152818161176801528181611d21015281816128ed015281816129bb0152612aa80152600081816106690152818161142c015281816119c2015281816120f001526121f801526000818161072d01528181610f8c01528181611b770152612bf30152600081816107720152818161083d015281816112bc015281816114020152612bc701526145cc6000f3fe608060405234801561001057600080fd5b50600436106102e85760003560e01c80636e05d2cd11610191578063c7fffd4b116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b146107b4578063f35dda47146107c7578063f851a440146107cf57600080fd5b8063d8d1091b1461075a578063e46761c41461076d578063e7a7ed021461079457600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610708578063d02103ca14610728578063d7bc90ff1461074f57600080fd5b8063c7fffd4b146106ed578063c89e42df146106f557600080fd5b80639e00187711610145578063ada8f9191161011f578063ada8f9191461069e578063b0afe154146106b1578063c754c7ed146106bd57600080fd5b80639e00187714610649578063a3c573eb14610664578063a652f26c1461068b57600080fd5b8063712570221161017657806371257022146105f25780637a5460c5146106055780638c3d73011461064157600080fd5b80636e05d2cd146105d65780636ff512cc146105df57600080fd5b80633cbc795b1161024a57806352bdeb6d116101fe5780635ec91958116101d85780635ec91958146105a6578063676870d2146105ae5780636b8616ce146105b657600080fd5b806352bdeb6d1461054f578063542028d51461058b5780635e9145c91461059357600080fd5b8063456052671161022f57806345605267146104ed57806349b7b802146105155780634e4877061461053c57600080fd5b80633cbc795b1461045757806340b5de6c1461049557600080fd5b806319d8ac61116102a15780632b35b3ac116102865780632b35b3ac1461040057806332c2d1531461041d5780633c351e101461043257600080fd5b806319d8ac611461038e57806326782247146103bb57600080fd5b806305835f37116102d257806305835f3714610323578063107bf28c1461036c57806311e892d41461037457600080fd5b8062d0295d146102ed5780630350896314610308575b600080fd5b6102f56107f5565b6040519081526020015b60405180910390f35b610310602081565b60405161ffff90911681526020016102ff565b61035f6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102ff919061375f565b61035f610915565b61037c60f981565b60405160ff90911681526020016102ff565b6007546103a29067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102ff565b6001546103db9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102ff565b60085461040d9060ff1681565b60405190151581526020016102ff565b61043061042b3660046137b4565b6109a3565b005b6008546103db90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b600854610480907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102ff565b6104bc7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102ff565b6007546103a290700100000000000000000000000000000000900467ffffffffffffffff1681565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b61043061054a3660046137f6565b610a72565b61035f6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61035f610c8c565b6104306105a136600461385f565b610c99565b6104306115b2565b610310601f81565b6102f56105c43660046137f6565b60066020526000908152604090205481565b6102f560055481565b6104306105ed3660046138ab565b61169c565b6104306106003660046139f4565b611766565b61035f6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610430611f1c565b6103db73a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b61035f610699366004613aa1565b611fef565b6104306106ac3660046138ab565b6123d4565b6102f56405ca1ab1e081565b6007546103a2907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61037c60e481565b610430610703366004613b16565b61249e565b6002546103db9073ffffffffffffffffffffffffffffffffffffffff1681565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6102f5635ca1ab1e81565b610430610768366004613b4b565b612531565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6007546103a29068010000000000000000900467ffffffffffffffff1681565b6104306107c2366004613b8d565b612a68565b61037c601b81565b6000546103db9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610884573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a89190613c05565b6007549091506000906108e79067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613c4d565b67ffffffffffffffff169050806000036109045760009250505090565b61090e8183613c75565b9250505090565b6004805461092290613cb0565b80601f016020809104026020016040519081016040528092919081815260200182805461094e90613cb0565b801561099b5780601f106109705761010080835404028352916020019161099b565b820191906000526020600020905b81548152906001019060200180831161097e57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a12576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a6591815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ac9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b10576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9f9190613d03565b610c085760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c08576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461092290613cb0565b60025473ffffffffffffffffffffffffffffffffffffffff163314610cea576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003610d26576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610d62576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b8581101561119e576000898983818110610dab57610dab613d25565b9050602002810190610dbd9190613d54565b610dc690613d92565b8051805160209091012060608201519192509067ffffffffffffffff1615610f495785610df281613e23565b96505060008183602001518460600151604051602001610e4a93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114610ed3576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015610f29576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055611086565b602082015115801590611010575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015610fea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100e9190613c05565b155b15611047576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611086576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806110b9575042826040015167ffffffffffffffff16115b156110f0576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061119690613e4a565b915050610d8f565b5060075467ffffffffffffffff68010000000000000000909104811690841611156111f5576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691909117909155600583905585908281169085161461132c57600061124c8386613c4d565b905061126267ffffffffffffffff821683613e82565b91506112e37f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661129b6107f5565b6112a59190613e95565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190612e57565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b61142a337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e19190613c05565b6113eb9190613e95565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190612f30565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561149257600080fd5b505af11580156114a6573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af115801561154a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156e9190613eac565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611609576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615611646576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146116f3576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c81565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146117d5576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156117f55750600054600160ff909116105b8061180f5750303b15801561180f575060005460ff166001145b6118a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156118fe57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611b135761192585612f94565b61192e866130a4565b611937876131ab565b60405160200161194993929190613ec9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611a0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2e9190613f02565b915091508163ffffffff16600014611acb57600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff851602179055611b10565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b600854600090611b60908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff1685611fef565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611be0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c049190613c05565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611d7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da39190613eac565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611e359190613f8a565b506004611e428982613f8a565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611ea2939291906140a4565b60405180910390a15050505050508015611f1357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611f6d576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa600087604051602401612023969594939291906140e3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060906000036121745760f9601f83516120b89190614146565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e48760405160200161215e9796959493929190614161565b6040516020818303038152906040529050612278565b815161ffff10156121b1576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96121c0602083614146565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016122659796959493929190614244565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156122d9573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612351576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906123979084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614327565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461242b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c81565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146124f5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036125018282613f8a565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c81919061375f565b60085460ff1661256d576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036125a9576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156125e5576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612620918491700100000000000000000000000000000000900416614383565b1115612658576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b838110156128e757600086868381811061269d5761269d613d25565b90506020028101906126af9190614396565b6126b8906143ca565b9050836126c481613e23565b825180516020918201208185015160408087015190519499509194506000936127269386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89166000908152600690935291205490915081146127af576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86166000908152600660205260408120556127d4600188613e82565b84036128435742600760189054906101000a900467ffffffffffffffff1684604001516128019190614448565b67ffffffffffffffff161115612843576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806128df90613e4a565b915050612681565b506129157f00000000000000000000000000000000000000000000000000000000000000008461129b6107f5565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612a04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a289190613eac565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612aa4576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b359190613c05565b905081811115612b71576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612bad576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612bef73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084612f30565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c809190613c05565b600780549192506801000000000000000090910467ffffffffffffffff16906008612caa83613e23565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612ce1929190614469565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612df1576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612e50565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612e479493929190614479565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052612f2b9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261329e565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612f8e9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612ea9565b50505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161301691906144ea565b600060405180830381855afa9150503d8060008114613051576040519150601f19603f3d011682016040523d82523d6000602084013e613056565b606091505b50915091508161309b576040518060400160405280600781526020017f4e4f5f4e414d45000000000000000000000000000000000000000000000000008152506123cc565b6123cc816133aa565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161312691906144ea565b600060405180830381855afa9150503d8060008114613161576040519150601f19603f3d011682016040523d82523d6000602084013e613166565b606091505b50915091508161309b576040518060400160405280600981526020017f4e4f5f53594d424f4c00000000000000000000000000000000000000000000008152506123cc565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169161322c91906144ea565b600060405180830381855afa9150503d8060008114613267576040519150601f19603f3d011682016040523d82523d6000602084013e61326c565b606091505b509150915081801561327f575080516020145b61328a5760126123cc565b808060200190518101906123cc91906144fc565b6000613300826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166135809092919063ffffffff16565b805190915015612f2b578080602001905181019061331e9190613d03565b612f2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611897565b606060408251106133cf57818060200190518101906133c9919061451f565b92915050565b81516020036135475760005b60208110801561342257508281815181106133f8576133f8613d25565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613439578061343181613e4a565b9150506133db565b8060000361347c57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115613497576134976138da565b6040519080825280601f01601f1916602001820160405280156134c1576020820181803683370190505b50905060005b8281101561353f578481815181106134e1576134e1613d25565b602001015160f81c60f81b8282815181106134fe576134fe613d25565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061353781613e4a565b9150506134c7565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60606123cc8484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516135b491906144ea565b60006040518083038185875af1925050503d80600081146135f1576040519150601f19603f3d011682016040523d82523d6000602084013e6135f6565b606091505b509150915061360787838387613612565b979650505050505050565b606083156136a85782516000036136a15773ffffffffffffffffffffffffffffffffffffffff85163b6136a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611897565b50816123cc565b6123cc83838151156136bd5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611897919061375f565b60005b8381101561370c5781810151838201526020016136f4565b50506000910152565b6000815180845261372d8160208601602086016136f1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006137726020830184613715565b9392505050565b67ffffffffffffffff8116811461378f57600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461378f57600080fd5b6000806000606084860312156137c957600080fd5b83356137d481613779565b92506020840135915060408401356137eb81613792565b809150509250925092565b60006020828403121561380857600080fd5b813561377281613779565b60008083601f84011261382557600080fd5b50813567ffffffffffffffff81111561383d57600080fd5b6020830191508360208260051b850101111561385857600080fd5b9250929050565b60008060006040848603121561387457600080fd5b833567ffffffffffffffff81111561388b57600080fd5b61389786828701613813565b90945092505060208401356137eb81613792565b6000602082840312156138bd57600080fd5b813561377281613792565b63ffffffff8116811461378f57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613950576139506138da565b604052919050565b600067ffffffffffffffff821115613972576139726138da565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126139af57600080fd5b81356139c26139bd82613958565b613909565b8181528460208386010111156139d757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613a0d57600080fd5b8635613a1881613792565b95506020870135613a2881613792565b94506040870135613a38816138c8565b93506060870135613a4881613792565b9250608087013567ffffffffffffffff80821115613a6557600080fd5b613a718a838b0161399e565b935060a0890135915080821115613a8757600080fd5b50613a9489828a0161399e565b9150509295509295509295565b60008060008060808587031215613ab757600080fd5b8435613ac2816138c8565b93506020850135613ad281613792565b92506040850135613ae2816138c8565b9150606085013567ffffffffffffffff811115613afe57600080fd5b613b0a8782880161399e565b91505092959194509250565b600060208284031215613b2857600080fd5b813567ffffffffffffffff811115613b3f57600080fd5b6123cc8482850161399e565b60008060208385031215613b5e57600080fd5b823567ffffffffffffffff811115613b7557600080fd5b613b8185828601613813565b90969095509350505050565b600080600060408486031215613ba257600080fd5b833567ffffffffffffffff80821115613bba57600080fd5b818601915086601f830112613bce57600080fd5b813581811115613bdd57600080fd5b876020828501011115613bef57600080fd5b6020928301989097509590910135949350505050565b600060208284031215613c1757600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613c6e57613c6e613c1e565b5092915050565b600082613cab577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613cc457607f821691505b602082108103613cfd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215613d1557600080fd5b8151801515811461377257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613d8857600080fd5b9190910192915050565b600060808236031215613da457600080fd5b6040516080810167ffffffffffffffff8282108183111715613dc857613dc86138da565b816040528435915080821115613ddd57600080fd5b50613dea3682860161399e565b825250602083013560208201526040830135613e0581613779565b60408201526060830135613e1881613779565b606082015292915050565b600067ffffffffffffffff808316818103613e4057613e40613c1e565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e7b57613e7b613c1e565b5060010190565b818103818111156133c9576133c9613c1e565b80820281158282048414176133c9576133c9613c1e565b600060208284031215613ebe57600080fd5b815161377281613779565b606081526000613edc6060830186613715565b8281036020840152613eee8186613715565b91505060ff83166040830152949350505050565b60008060408385031215613f1557600080fd5b8251613f20816138c8565b6020840151909250613f3181613792565b809150509250929050565b601f821115612f2b57600081815260208120601f850160051c81016020861015613f635750805b601f850160051c820191505b81811015613f8257828155600101613f6f565b505050505050565b815167ffffffffffffffff811115613fa457613fa46138da565b613fb881613fb28454613cb0565b84613f3c565b602080601f83116001811461400b5760008415613fd55750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613f82565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561405857888601518255948401946001909101908401614039565b508582101561409457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006140b76060830186613715565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261413a60c0830184613715565b98975050505050505050565b61ffff818116838216019080821115613c6e57613c6e613c1e565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b16600184015287516141ca816003860160208c016136f1565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161420d816017840160208b016136f1565b808201915050818660f81b166017820152845191506142338260188301602088016136f1565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b16600184015287516142ad816003860160208c016136f1565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516142f0816017840160208b016136f1565b808201915050818660f01b166017820152845191506143168260198301602088016136f1565b016019019998505050505050505050565b60008651614339818460208b016136f1565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b808201808211156133c9576133c9613c1e565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112613d8857600080fd5b6000606082360312156143dc57600080fd5b6040516060810167ffffffffffffffff8282108183111715614400576144006138da565b81604052843591508082111561441557600080fd5b506144223682860161399e565b82525060208301356020820152604083013561443d81613779565b604082015292915050565b67ffffffffffffffff818116838216019080821115613c6e57613c6e613c1e565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b60008251613d888184602087016136f1565b60006020828403121561450e57600080fd5b815160ff8116811461377257600080fd5b60006020828403121561453157600080fd5b815167ffffffffffffffff81111561454857600080fd5b8201601f8101841361455957600080fd5b80516145676139bd82613958565b81815285602083850101111561457c57600080fd5b61458d8260208301602086016136f1565b9594505050505056fea264697066735822122087592c89b8beca03bac67170668042d883bf5f14f17ea60e42a293e94959dc1264736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102e85760003560e01c80636e05d2cd11610191578063c7fffd4b116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b146107b4578063f35dda47146107c7578063f851a440146107cf57600080fd5b8063d8d1091b1461075a578063e46761c41461076d578063e7a7ed021461079457600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610708578063d02103ca14610728578063d7bc90ff1461074f57600080fd5b8063c7fffd4b146106ed578063c89e42df146106f557600080fd5b80639e00187711610145578063ada8f9191161011f578063ada8f9191461069e578063b0afe154146106b1578063c754c7ed146106bd57600080fd5b80639e00187714610649578063a3c573eb14610664578063a652f26c1461068b57600080fd5b8063712570221161017657806371257022146105f25780637a5460c5146106055780638c3d73011461064157600080fd5b80636e05d2cd146105d65780636ff512cc146105df57600080fd5b80633cbc795b1161024a57806352bdeb6d116101fe5780635ec91958116101d85780635ec91958146105a6578063676870d2146105ae5780636b8616ce146105b657600080fd5b806352bdeb6d1461054f578063542028d51461058b5780635e9145c91461059357600080fd5b8063456052671161022f57806345605267146104ed57806349b7b802146105155780634e4877061461053c57600080fd5b80633cbc795b1461045757806340b5de6c1461049557600080fd5b806319d8ac61116102a15780632b35b3ac116102865780632b35b3ac1461040057806332c2d1531461041d5780633c351e101461043257600080fd5b806319d8ac611461038e57806326782247146103bb57600080fd5b806305835f37116102d257806305835f3714610323578063107bf28c1461036c57806311e892d41461037457600080fd5b8062d0295d146102ed5780630350896314610308575b600080fd5b6102f56107f5565b6040519081526020015b60405180910390f35b610310602081565b60405161ffff90911681526020016102ff565b61035f6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102ff919061375f565b61035f610915565b61037c60f981565b60405160ff90911681526020016102ff565b6007546103a29067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102ff565b6001546103db9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102ff565b60085461040d9060ff1681565b60405190151581526020016102ff565b61043061042b3660046137b4565b6109a3565b005b6008546103db90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b600854610480907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102ff565b6104bc7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102ff565b6007546103a290700100000000000000000000000000000000900467ffffffffffffffff1681565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b61043061054a3660046137f6565b610a72565b61035f6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61035f610c8c565b6104306105a136600461385f565b610c99565b6104306115b2565b610310601f81565b6102f56105c43660046137f6565b60066020526000908152604090205481565b6102f560055481565b6104306105ed3660046138ab565b61169c565b6104306106003660046139f4565b611766565b61035f6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610430611f1c565b6103db73a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b61035f610699366004613aa1565b611fef565b6104306106ac3660046138ab565b6123d4565b6102f56405ca1ab1e081565b6007546103a2907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61037c60e481565b610430610703366004613b16565b61249e565b6002546103db9073ffffffffffffffffffffffffffffffffffffffff1681565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6102f5635ca1ab1e81565b610430610768366004613b4b565b612531565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6007546103a29068010000000000000000900467ffffffffffffffff1681565b6104306107c2366004613b8d565b612a68565b61037c601b81565b6000546103db9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610884573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a89190613c05565b6007549091506000906108e79067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613c4d565b67ffffffffffffffff169050806000036109045760009250505090565b61090e8183613c75565b9250505090565b6004805461092290613cb0565b80601f016020809104026020016040519081016040528092919081815260200182805461094e90613cb0565b801561099b5780601f106109705761010080835404028352916020019161099b565b820191906000526020600020905b81548152906001019060200180831161097e57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a12576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a6591815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ac9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b10576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9f9190613d03565b610c085760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c08576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461092290613cb0565b60025473ffffffffffffffffffffffffffffffffffffffff163314610cea576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003610d26576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610d62576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b8581101561119e576000898983818110610dab57610dab613d25565b9050602002810190610dbd9190613d54565b610dc690613d92565b8051805160209091012060608201519192509067ffffffffffffffff1615610f495785610df281613e23565b96505060008183602001518460600151604051602001610e4a93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114610ed3576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015610f29576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055611086565b602082015115801590611010575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015610fea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100e9190613c05565b155b15611047576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611086576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806110b9575042826040015167ffffffffffffffff16115b156110f0576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061119690613e4a565b915050610d8f565b5060075467ffffffffffffffff68010000000000000000909104811690841611156111f5576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691909117909155600583905585908281169085161461132c57600061124c8386613c4d565b905061126267ffffffffffffffff821683613e82565b91506112e37f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661129b6107f5565b6112a59190613e95565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190612e57565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b61142a337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e19190613c05565b6113eb9190613e95565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190612f30565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561149257600080fd5b505af11580156114a6573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af115801561154a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156e9190613eac565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611609576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615611646576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146116f3576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c81565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146117d5576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156117f55750600054600160ff909116105b8061180f5750303b15801561180f575060005460ff166001145b6118a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156118fe57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611b135761192585612f94565b61192e866130a4565b611937876131ab565b60405160200161194993929190613ec9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611a0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2e9190613f02565b915091508163ffffffff16600014611acb57600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff851602179055611b10565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b600854600090611b60908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff1685611fef565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611be0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c049190613c05565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611d7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da39190613eac565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611e359190613f8a565b506004611e428982613f8a565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611ea2939291906140a4565b60405180910390a15050505050508015611f1357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611f6d576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa600087604051602401612023969594939291906140e3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060906000036121745760f9601f83516120b89190614146565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e48760405160200161215e9796959493929190614161565b6040516020818303038152906040529050612278565b815161ffff10156121b1576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96121c0602083614146565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016122659796959493929190614244565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156122d9573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612351576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906123979084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614327565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461242b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c81565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146124f5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036125018282613f8a565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c81919061375f565b60085460ff1661256d576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036125a9576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156125e5576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612620918491700100000000000000000000000000000000900416614383565b1115612658576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b838110156128e757600086868381811061269d5761269d613d25565b90506020028101906126af9190614396565b6126b8906143ca565b9050836126c481613e23565b825180516020918201208185015160408087015190519499509194506000936127269386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89166000908152600690935291205490915081146127af576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86166000908152600660205260408120556127d4600188613e82565b84036128435742600760189054906101000a900467ffffffffffffffff1684604001516128019190614448565b67ffffffffffffffff161115612843576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806128df90613e4a565b915050612681565b506129157f00000000000000000000000000000000000000000000000000000000000000008461129b6107f5565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612a04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a289190613eac565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612aa4576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b359190613c05565b905081811115612b71576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612bad576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612bef73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084612f30565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c809190613c05565b600780549192506801000000000000000090910467ffffffffffffffff16906008612caa83613e23565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612ce1929190614469565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612df1576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612e50565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612e479493929190614479565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052612f2b9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261329e565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612f8e9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612ea9565b50505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161301691906144ea565b600060405180830381855afa9150503d8060008114613051576040519150601f19603f3d011682016040523d82523d6000602084013e613056565b606091505b50915091508161309b576040518060400160405280600781526020017f4e4f5f4e414d45000000000000000000000000000000000000000000000000008152506123cc565b6123cc816133aa565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161312691906144ea565b600060405180830381855afa9150503d8060008114613161576040519150601f19603f3d011682016040523d82523d6000602084013e613166565b606091505b50915091508161309b576040518060400160405280600981526020017f4e4f5f53594d424f4c00000000000000000000000000000000000000000000008152506123cc565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169161322c91906144ea565b600060405180830381855afa9150503d8060008114613267576040519150601f19603f3d011682016040523d82523d6000602084013e61326c565b606091505b509150915081801561327f575080516020145b61328a5760126123cc565b808060200190518101906123cc91906144fc565b6000613300826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166135809092919063ffffffff16565b805190915015612f2b578080602001905181019061331e9190613d03565b612f2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611897565b606060408251106133cf57818060200190518101906133c9919061451f565b92915050565b81516020036135475760005b60208110801561342257508281815181106133f8576133f8613d25565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613439578061343181613e4a565b9150506133db565b8060000361347c57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115613497576134976138da565b6040519080825280601f01601f1916602001820160405280156134c1576020820181803683370190505b50905060005b8281101561353f578481815181106134e1576134e1613d25565b602001015160f81c60f81b8282815181106134fe576134fe613d25565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061353781613e4a565b9150506134c7565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60606123cc8484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516135b491906144ea565b60006040518083038185875af1925050503d80600081146135f1576040519150601f19603f3d011682016040523d82523d6000602084013e6135f6565b606091505b509150915061360787838387613612565b979650505050505050565b606083156136a85782516000036136a15773ffffffffffffffffffffffffffffffffffffffff85163b6136a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611897565b50816123cc565b6123cc83838151156136bd5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611897919061375f565b60005b8381101561370c5781810151838201526020016136f4565b50506000910152565b6000815180845261372d8160208601602086016136f1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006137726020830184613715565b9392505050565b67ffffffffffffffff8116811461378f57600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461378f57600080fd5b6000806000606084860312156137c957600080fd5b83356137d481613779565b92506020840135915060408401356137eb81613792565b809150509250925092565b60006020828403121561380857600080fd5b813561377281613779565b60008083601f84011261382557600080fd5b50813567ffffffffffffffff81111561383d57600080fd5b6020830191508360208260051b850101111561385857600080fd5b9250929050565b60008060006040848603121561387457600080fd5b833567ffffffffffffffff81111561388b57600080fd5b61389786828701613813565b90945092505060208401356137eb81613792565b6000602082840312156138bd57600080fd5b813561377281613792565b63ffffffff8116811461378f57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613950576139506138da565b604052919050565b600067ffffffffffffffff821115613972576139726138da565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126139af57600080fd5b81356139c26139bd82613958565b613909565b8181528460208386010111156139d757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613a0d57600080fd5b8635613a1881613792565b95506020870135613a2881613792565b94506040870135613a38816138c8565b93506060870135613a4881613792565b9250608087013567ffffffffffffffff80821115613a6557600080fd5b613a718a838b0161399e565b935060a0890135915080821115613a8757600080fd5b50613a9489828a0161399e565b9150509295509295509295565b60008060008060808587031215613ab757600080fd5b8435613ac2816138c8565b93506020850135613ad281613792565b92506040850135613ae2816138c8565b9150606085013567ffffffffffffffff811115613afe57600080fd5b613b0a8782880161399e565b91505092959194509250565b600060208284031215613b2857600080fd5b813567ffffffffffffffff811115613b3f57600080fd5b6123cc8482850161399e565b60008060208385031215613b5e57600080fd5b823567ffffffffffffffff811115613b7557600080fd5b613b8185828601613813565b90969095509350505050565b600080600060408486031215613ba257600080fd5b833567ffffffffffffffff80821115613bba57600080fd5b818601915086601f830112613bce57600080fd5b813581811115613bdd57600080fd5b876020828501011115613bef57600080fd5b6020928301989097509590910135949350505050565b600060208284031215613c1757600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613c6e57613c6e613c1e565b5092915050565b600082613cab577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613cc457607f821691505b602082108103613cfd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215613d1557600080fd5b8151801515811461377257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613d8857600080fd5b9190910192915050565b600060808236031215613da457600080fd5b6040516080810167ffffffffffffffff8282108183111715613dc857613dc86138da565b816040528435915080821115613ddd57600080fd5b50613dea3682860161399e565b825250602083013560208201526040830135613e0581613779565b60408201526060830135613e1881613779565b606082015292915050565b600067ffffffffffffffff808316818103613e4057613e40613c1e565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e7b57613e7b613c1e565b5060010190565b818103818111156133c9576133c9613c1e565b80820281158282048414176133c9576133c9613c1e565b600060208284031215613ebe57600080fd5b815161377281613779565b606081526000613edc6060830186613715565b8281036020840152613eee8186613715565b91505060ff83166040830152949350505050565b60008060408385031215613f1557600080fd5b8251613f20816138c8565b6020840151909250613f3181613792565b809150509250929050565b601f821115612f2b57600081815260208120601f850160051c81016020861015613f635750805b601f850160051c820191505b81811015613f8257828155600101613f6f565b505050505050565b815167ffffffffffffffff811115613fa457613fa46138da565b613fb881613fb28454613cb0565b84613f3c565b602080601f83116001811461400b5760008415613fd55750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613f82565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561405857888601518255948401946001909101908401614039565b508582101561409457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006140b76060830186613715565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261413a60c0830184613715565b98975050505050505050565b61ffff818116838216019080821115613c6e57613c6e613c1e565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b16600184015287516141ca816003860160208c016136f1565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161420d816017840160208b016136f1565b808201915050818660f81b166017820152845191506142338260188301602088016136f1565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b16600184015287516142ad816003860160208c016136f1565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516142f0816017840160208b016136f1565b808201915050818660f01b166017820152845191506143168260198301602088016136f1565b016019019998505050505050505050565b60008651614339818460208b016136f1565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b808201808211156133c9576133c9613c1e565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112613d8857600080fd5b6000606082360312156143dc57600080fd5b6040516060810167ffffffffffffffff8282108183111715614400576144006138da565b81604052843591508082111561441557600080fd5b506144223682860161399e565b82525060208301356020820152604083013561443d81613779565b604082015292915050565b67ffffffffffffffff818116838216019080821115613c6e57613c6e613c1e565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b60008251613d888184602087016136f1565b60006020828403121561450e57600080fd5b815160ff8116811461377257600080fd5b60006020828403121561453157600080fd5b815167ffffffffffffffff81111561454857600080fd5b8201601f8101841361455957600080fd5b80516145676139bd82613958565b81815285602083850101111561457c57600080fd5b61458d8260208301602086016136f1565b9594505050505056fea264697066735822122087592c89b8beca03bac67170668042d883bf5f14f17ea60e42a293e94959dc1264736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMV2Existent.json b/compiled-contracts/paris/PolygonZkEVMV2Existent.json index 42cfb7ee5..21a11cad6 100644 --- a/compiled-contracts/paris/PolygonZkEVMV2Existent.json +++ b/compiled-contracts/paris/PolygonZkEVMV2Existent.json @@ -502,6 +502,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS_EMPTY_METADATA", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "INITIALIZE_TX_CONSTANT_BYTES", @@ -515,6 +528,32 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "INITIALIZE_TX_CONSTANT_BYTES_EMPTY_METADATA", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_DATA_LEN_EMPTY_METADATA", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "INITIALIZE_TX_EFFECTIVE_PERCENTAGE", @@ -1108,8 +1147,8 @@ "type": "function" } ], - "bytecode": "0x6101006040523480156200001257600080fd5b506040516200490b3803806200490b833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e05161475e620001ad600039600081816105040152818161095601528181610ac30152818161121a015281816112e3015281816113050152818161149c0152818161171901528181611cd20152818161239701528181612abc01528181612b8a0152612c7701526000818161060f015281816113dd0152818161197301526120d40152600081816106de01528181610f3d01528181611b280152612dc2015260008181610723015281816107ee0152818161126d015281816113b30152612d96015261475e6000f3fe608060405234801561001057600080fd5b50600436106102d25760003560e01c80636ff512cc11610186578063c754c7ed116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b14610765578063f35dda4714610778578063f851a4401461078057600080fd5b8063d8d1091b1461070b578063e46761c41461071e578063e7a7ed021461074557600080fd5b8063cfa8ed47116100c8578063cfa8ed47146106b9578063d02103ca146106d9578063d7bc90ff1461070057600080fd5b8063c754c7ed14610676578063c89e42df146106a657600080fd5b8063a3c573eb1161013a578063ada8f9191161011f578063ada8f91914610644578063b0afe15414610657578063bb5907081461066357600080fd5b8063a3c573eb1461060a578063a652f26c1461063157600080fd5b80637a5460c51161016b5780637a5460c5146105ab5780638c3d7301146105e75780639e001877146105ef57600080fd5b80636ff512cc14610585578063712570221461059857600080fd5b80633cbc795b11610234578063542028d5116101e85780635ec91958116101cd5780635ec91958146105545780636b8616ce1461055c5780636e05d2cd1461057c57600080fd5b8063542028d5146105395780635e9145c91461054157600080fd5b8063456052671161021957806345605267146104d757806349b7b802146104ff5780634e4877061461052657600080fd5b80633cbc795b1461044157806340b5de6c1461047f57600080fd5b806319d8ac611161028b5780632b35b3ac116102705780632b35b3ac146103ea57806332c2d153146104075780633c351e101461041c57600080fd5b806319d8ac611461037857806326782247146103a557600080fd5b806305835f37116102bc57806305835f371461030d578063107bf28c1461035657806311e892d41461035e57600080fd5b8062d0295d146102d757806303508963146102f2575b600080fd5b6102df6107a6565b6040519081526020015b60405180910390f35b6102fa602081565b60405161ffff90911681526020016102e9565b6103496040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102e9919061392e565b6103496108c6565b61036660f981565b60405160ff90911681526020016102e9565b60075461038c9067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102e9565b6001546103c59073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102e9565b6008546103f79060ff1681565b60405190151581526020016102e9565b61041a610415366004613983565b610954565b005b6008546103c590610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60085461046a907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102e9565b6104a67fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102e9565b60075461038c90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103c57f000000000000000000000000000000000000000000000000000000000000000081565b61041a6105343660046139c5565b610a23565b610349610c3d565b61041a61054f366004613a2e565b610c4a565b61041a611563565b6102df61056a3660046139c5565b60066020526000908152604090205481565b6102df60055481565b61041a610593366004613a7a565b61164d565b61041a6105a6366004613bc3565b611717565b6103496040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61041a611ece565b6103c573a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103c57f000000000000000000000000000000000000000000000000000000000000000081565b61034961063f366004613c70565b611fa1565b61041a610652366004613a7a565b6122cb565b6102df6405ca1ab1e081565b61041a610671366004613ce5565b612395565b60075461038c907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61041a6106b4366004613d8b565b61266d565b6002546103c59073ffffffffffffffffffffffffffffffffffffffff1681565b6103c57f000000000000000000000000000000000000000000000000000000000000000081565b6102df635ca1ab1e81565b61041a610719366004613dc0565b612700565b6103c57f000000000000000000000000000000000000000000000000000000000000000081565b60075461038c9068010000000000000000900467ffffffffffffffff1681565b61041a610773366004613e02565b612c37565b610366601b81565b6000546103c59062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610835573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108599190613e7a565b6007549091506000906108989067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613ec2565b67ffffffffffffffff169050806000036108b55760009250505090565b6108bf8183613eea565b9250505090565b600480546108d390613f25565b80601f01602080910402602001604051908101604052809291908181526020018280546108ff90613f25565b801561094c5780601f106109215761010080835404028352916020019161094c565b820191906000526020600020905b81548152906001019060200180831161092f57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109c3576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a1691815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a7a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610ac1576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b509190613f78565b610bb95760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610bb9576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546108d390613f25565b60025473ffffffffffffffffffffffffffffffffffffffff163314610c9b576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003610cd7576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610d13576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b8581101561114f576000898983818110610d5c57610d5c613f9a565b9050602002810190610d6e9190613fc9565b610d7790614007565b8051805160209091012060608201519192509067ffffffffffffffff1615610efa5785610da381614098565b96505060008183602001518460600151604051602001610dfb93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114610e84576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015610eda576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055611037565b602082015115801590610fc1575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015610f9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbf9190613e7a565b155b15610ff8576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611037576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff16108061106a575042826040015167ffffffffffffffff16115b156110a1576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151965050508080611147906140bf565b915050610d40565b5060075467ffffffffffffffff68010000000000000000909104811690841611156111a6576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146112dd5760006111fd8386613ec2565b905061121367ffffffffffffffff8216836140f7565b91506112947f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661124c6107a6565b611256919061410a565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613026565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6113db337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa15801561136e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113929190613e7a565b61139c919061410a565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906130ff565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561144357600080fd5b505af1158015611457573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af11580156114fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151f9190614121565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146115ba576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff16156115f7576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146116a4576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c32565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611786576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156117a65750600054600160ff909116105b806117c05750303b1580156117c0575060005460ff166001145b611851576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156118af57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611ac4576118d685613163565b6118df86613273565b6118e88761337a565b6040516020016118fa9392919061413e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af11580156119bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119df9190614177565b915091508163ffffffff16600014611a7c57600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff851602179055611ac1565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b600854600090611b11908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff1685611fa1565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb59190613e7a565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611d30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d549190614121565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611de691906141ff565b506004611df389826141ff565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611e5393929190614319565b60405180910390a15050505050508015611ec557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611f1f576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa600087604051602401611fd596959493929190614358565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff700000000000000000000000000000000000000000000000000000000179052805190915061ffff101561208b576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600060f961209c6020846143bb565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b9000000000000000000000000000000000000000000000000000000000000815250868860405160200161214197969594939291906143d6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa1580156121cf573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612247576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405160009061228d9084906405ca1ab1e090635ca1ab1e90601b907fff00000000000000000000000000000000000000000000000000000000000000906020016144b9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052955050505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612322576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c32565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314612404576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156124245750600054600160ff909116105b8061243e5750303b15801561243e575060005460ff166001145b6124ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401611848565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561252857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8a81169190910291909117909155600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001691881691909117905560036125b086826141ff565b5060046125bd85826141ff565b506005839055600780547a06978000000000000000000000000000000000000000000000000077ffffffffffffffffffffffffffffffff000000000000000090911667ffffffffffffffff8516171790558015611ec557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611ebc565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146126c4576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036126d082826141ff565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c32919061392e565b60085460ff1661273c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003612778576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156127b4576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff6801000000000000000082048116916127ef918491700100000000000000000000000000000000900416614515565b1115612827576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015612ab657600086868381811061286c5761286c613f9a565b905060200281019061287e9190614528565b6128879061455c565b90508361289381614098565b825180516020918201208185015160408087015190519499509194506000936128f59386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff891660009081526006909352912054909150811461297e576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86166000908152600660205260408120556129a36001886140f7565b8403612a125742600760189054906101000a900467ffffffffffffffff1684604001516129d091906145da565b67ffffffffffffffff161115612a12576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080612aae906140bf565b915050612850565b50612ae47f00000000000000000000000000000000000000000000000000000000000000008461124c6107a6565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612bd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf79190614121565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612c73576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ce0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d049190613e7a565b905081811115612d40576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612d7c576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612dbe73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846130ff565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e4f9190613e7a565b600780549192506801000000000000000090910467ffffffffffffffff16906008612e7983614098565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612eb09291906145fb565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612fc0576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a261301f565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613016949392919061460b565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526130fa9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261346d565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261315d9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613078565b50505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916131e5919061467c565b600060405180830381855afa9150503d8060008114613220576040519150601f19603f3d011682016040523d82523d6000602084013e613225565b606091505b50915091508161326a576040518060400160405280600781526020017f4e4f5f4e414d45000000000000000000000000000000000000000000000000008152506122c3565b6122c381613579565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916132f5919061467c565b600060405180830381855afa9150503d8060008114613330576040519150601f19603f3d011682016040523d82523d6000602084013e613335565b606091505b50915091508161326a576040518060400160405280600981526020017f4e4f5f53594d424f4c00000000000000000000000000000000000000000000008152506122c3565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8616916133fb919061467c565b600060405180830381855afa9150503d8060008114613436576040519150601f19603f3d011682016040523d82523d6000602084013e61343b565b606091505b509150915081801561344e575080516020145b6134595760126122c3565b808060200190518101906122c3919061468e565b60006134cf826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661374f9092919063ffffffff16565b8051909150156130fa57808060200190518101906134ed9190613f78565b6130fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611848565b6060604082511061359e578180602001905181019061359891906146b1565b92915050565b81516020036137165760005b6020811080156135f157508281815181106135c7576135c7613f9a565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b156136085780613600816140bf565b9150506135aa565b8060000361364b57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111561366657613666613aa9565b6040519080825280601f01601f191660200182016040528015613690576020820181803683370190505b50905060005b8281101561370e578481815181106136b0576136b0613f9a565b602001015160f81c60f81b8282815181106136cd576136cd613f9a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080613706816140bf565b915050613696565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60606122c38484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051613783919061467c565b60006040518083038185875af1925050503d80600081146137c0576040519150601f19603f3d011682016040523d82523d6000602084013e6137c5565b606091505b50915091506137d6878383876137e1565b979650505050505050565b606083156138775782516000036138705773ffffffffffffffffffffffffffffffffffffffff85163b613870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611848565b50816122c3565b6122c3838381511561388c5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611848919061392e565b60005b838110156138db5781810151838201526020016138c3565b50506000910152565b600081518084526138fc8160208601602086016138c0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061394160208301846138e4565b9392505050565b67ffffffffffffffff8116811461395e57600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461395e57600080fd5b60008060006060848603121561399857600080fd5b83356139a381613948565b92506020840135915060408401356139ba81613961565b809150509250925092565b6000602082840312156139d757600080fd5b813561394181613948565b60008083601f8401126139f457600080fd5b50813567ffffffffffffffff811115613a0c57600080fd5b6020830191508360208260051b8501011115613a2757600080fd5b9250929050565b600080600060408486031215613a4357600080fd5b833567ffffffffffffffff811115613a5a57600080fd5b613a66868287016139e2565b90945092505060208401356139ba81613961565b600060208284031215613a8c57600080fd5b813561394181613961565b63ffffffff8116811461395e57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613b1f57613b1f613aa9565b604052919050565b600067ffffffffffffffff821115613b4157613b41613aa9565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613b7e57600080fd5b8135613b91613b8c82613b27565b613ad8565b818152846020838601011115613ba657600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613bdc57600080fd5b8635613be781613961565b95506020870135613bf781613961565b94506040870135613c0781613a97565b93506060870135613c1781613961565b9250608087013567ffffffffffffffff80821115613c3457600080fd5b613c408a838b01613b6d565b935060a0890135915080821115613c5657600080fd5b50613c6389828a01613b6d565b9150509295509295509295565b60008060008060808587031215613c8657600080fd5b8435613c9181613a97565b93506020850135613ca181613961565b92506040850135613cb181613a97565b9150606085013567ffffffffffffffff811115613ccd57600080fd5b613cd987828801613b6d565b91505092959194509250565b60008060008060008060c08789031215613cfe57600080fd5b8635613d0981613961565b95506020870135613d1981613961565b9450604087013567ffffffffffffffff80821115613d3657600080fd5b613d428a838b01613b6d565b95506060890135915080821115613d5857600080fd5b50613d6589828a01613b6d565b9350506080870135915060a0870135613d7d81613948565b809150509295509295509295565b600060208284031215613d9d57600080fd5b813567ffffffffffffffff811115613db457600080fd5b6122c384828501613b6d565b60008060208385031215613dd357600080fd5b823567ffffffffffffffff811115613dea57600080fd5b613df6858286016139e2565b90969095509350505050565b600080600060408486031215613e1757600080fd5b833567ffffffffffffffff80821115613e2f57600080fd5b818601915086601f830112613e4357600080fd5b813581811115613e5257600080fd5b876020828501011115613e6457600080fd5b6020928301989097509590910135949350505050565b600060208284031215613e8c57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613ee357613ee3613e93565b5092915050565b600082613f20577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613f3957607f821691505b602082108103613f72577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215613f8a57600080fd5b8151801515811461394157600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613ffd57600080fd5b9190910192915050565b60006080823603121561401957600080fd5b6040516080810167ffffffffffffffff828210818311171561403d5761403d613aa9565b81604052843591508082111561405257600080fd5b5061405f36828601613b6d565b82525060208301356020820152604083013561407a81613948565b6040820152606083013561408d81613948565b606082015292915050565b600067ffffffffffffffff8083168181036140b5576140b5613e93565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036140f0576140f0613e93565b5060010190565b8181038181111561359857613598613e93565b808202811582820484141761359857613598613e93565b60006020828403121561413357600080fd5b815161394181613948565b60608152600061415160608301866138e4565b828103602084015261416381866138e4565b91505060ff83166040830152949350505050565b6000806040838503121561418a57600080fd5b825161419581613a97565b60208401519092506141a681613961565b809150509250929050565b601f8211156130fa57600081815260208120601f850160051c810160208610156141d85750805b601f850160051c820191505b818110156141f7578281556001016141e4565b505050505050565b815167ffffffffffffffff81111561421957614219613aa9565b61422d816142278454613f25565b846141b1565b602080601f831160018114614280576000841561424a5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556141f7565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156142cd578886015182559484019460019091019084016142ae565b508582101561430957878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60608152600061432c60608301866138e4565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a08301526143af60c08301846138e4565b98975050505050505050565b61ffff818116838216019080821115613ee357613ee3613e93565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b166001840152875161443f816003860160208c016138c0565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614482816017840160208b016138c0565b808201915050818660f01b166017820152845191506144a88260198301602088016138c0565b016019019998505050505050505050565b600086516144cb818460208b016138c0565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b8082018082111561359857613598613e93565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112613ffd57600080fd5b60006060823603121561456e57600080fd5b6040516060810167ffffffffffffffff828210818311171561459257614592613aa9565b8160405284359150808211156145a757600080fd5b506145b436828601613b6d565b8252506020830135602082015260408301356145cf81613948565b604082015292915050565b67ffffffffffffffff818116838216019080821115613ee357613ee3613e93565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b60008251613ffd8184602087016138c0565b6000602082840312156146a057600080fd5b815160ff8116811461394157600080fd5b6000602082840312156146c357600080fd5b815167ffffffffffffffff8111156146da57600080fd5b8201601f810184136146eb57600080fd5b80516146f9613b8c82613b27565b81815285602083850101111561470e57600080fd5b61471f8260208301602086016138c0565b9594505050505056fea264697066735822122085e954b3c03db9fc33602edbb8bc952dc84d1ba702b087333a891f41f926636964736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102d25760003560e01c80636ff512cc11610186578063c754c7ed116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b14610765578063f35dda4714610778578063f851a4401461078057600080fd5b8063d8d1091b1461070b578063e46761c41461071e578063e7a7ed021461074557600080fd5b8063cfa8ed47116100c8578063cfa8ed47146106b9578063d02103ca146106d9578063d7bc90ff1461070057600080fd5b8063c754c7ed14610676578063c89e42df146106a657600080fd5b8063a3c573eb1161013a578063ada8f9191161011f578063ada8f91914610644578063b0afe15414610657578063bb5907081461066357600080fd5b8063a3c573eb1461060a578063a652f26c1461063157600080fd5b80637a5460c51161016b5780637a5460c5146105ab5780638c3d7301146105e75780639e001877146105ef57600080fd5b80636ff512cc14610585578063712570221461059857600080fd5b80633cbc795b11610234578063542028d5116101e85780635ec91958116101cd5780635ec91958146105545780636b8616ce1461055c5780636e05d2cd1461057c57600080fd5b8063542028d5146105395780635e9145c91461054157600080fd5b8063456052671161021957806345605267146104d757806349b7b802146104ff5780634e4877061461052657600080fd5b80633cbc795b1461044157806340b5de6c1461047f57600080fd5b806319d8ac611161028b5780632b35b3ac116102705780632b35b3ac146103ea57806332c2d153146104075780633c351e101461041c57600080fd5b806319d8ac611461037857806326782247146103a557600080fd5b806305835f37116102bc57806305835f371461030d578063107bf28c1461035657806311e892d41461035e57600080fd5b8062d0295d146102d757806303508963146102f2575b600080fd5b6102df6107a6565b6040519081526020015b60405180910390f35b6102fa602081565b60405161ffff90911681526020016102e9565b6103496040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102e9919061392e565b6103496108c6565b61036660f981565b60405160ff90911681526020016102e9565b60075461038c9067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102e9565b6001546103c59073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102e9565b6008546103f79060ff1681565b60405190151581526020016102e9565b61041a610415366004613983565b610954565b005b6008546103c590610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60085461046a907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102e9565b6104a67fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102e9565b60075461038c90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103c57f000000000000000000000000000000000000000000000000000000000000000081565b61041a6105343660046139c5565b610a23565b610349610c3d565b61041a61054f366004613a2e565b610c4a565b61041a611563565b6102df61056a3660046139c5565b60066020526000908152604090205481565b6102df60055481565b61041a610593366004613a7a565b61164d565b61041a6105a6366004613bc3565b611717565b6103496040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61041a611ece565b6103c573a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103c57f000000000000000000000000000000000000000000000000000000000000000081565b61034961063f366004613c70565b611fa1565b61041a610652366004613a7a565b6122cb565b6102df6405ca1ab1e081565b61041a610671366004613ce5565b612395565b60075461038c907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61041a6106b4366004613d8b565b61266d565b6002546103c59073ffffffffffffffffffffffffffffffffffffffff1681565b6103c57f000000000000000000000000000000000000000000000000000000000000000081565b6102df635ca1ab1e81565b61041a610719366004613dc0565b612700565b6103c57f000000000000000000000000000000000000000000000000000000000000000081565b60075461038c9068010000000000000000900467ffffffffffffffff1681565b61041a610773366004613e02565b612c37565b610366601b81565b6000546103c59062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610835573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108599190613e7a565b6007549091506000906108989067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613ec2565b67ffffffffffffffff169050806000036108b55760009250505090565b6108bf8183613eea565b9250505090565b600480546108d390613f25565b80601f01602080910402602001604051908101604052809291908181526020018280546108ff90613f25565b801561094c5780601f106109215761010080835404028352916020019161094c565b820191906000526020600020905b81548152906001019060200180831161092f57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109c3576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a1691815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a7a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610ac1576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b509190613f78565b610bb95760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610bb9576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546108d390613f25565b60025473ffffffffffffffffffffffffffffffffffffffff163314610c9b576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003610cd7576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610d13576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b8581101561114f576000898983818110610d5c57610d5c613f9a565b9050602002810190610d6e9190613fc9565b610d7790614007565b8051805160209091012060608201519192509067ffffffffffffffff1615610efa5785610da381614098565b96505060008183602001518460600151604051602001610dfb93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114610e84576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015610eda576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055611037565b602082015115801590610fc1575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015610f9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbf9190613e7a565b155b15610ff8576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611037576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff16108061106a575042826040015167ffffffffffffffff16115b156110a1576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151965050508080611147906140bf565b915050610d40565b5060075467ffffffffffffffff68010000000000000000909104811690841611156111a6576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146112dd5760006111fd8386613ec2565b905061121367ffffffffffffffff8216836140f7565b91506112947f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661124c6107a6565b611256919061410a565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613026565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6113db337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa15801561136e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113929190613e7a565b61139c919061410a565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906130ff565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561144357600080fd5b505af1158015611457573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af11580156114fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151f9190614121565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146115ba576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff16156115f7576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146116a4576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c32565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611786576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156117a65750600054600160ff909116105b806117c05750303b1580156117c0575060005460ff166001145b611851576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156118af57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611ac4576118d685613163565b6118df86613273565b6118e88761337a565b6040516020016118fa9392919061413e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af11580156119bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119df9190614177565b915091508163ffffffff16600014611a7c57600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff851602179055611ac1565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b600854600090611b11908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff1685611fa1565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb59190613e7a565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611d30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d549190614121565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611de691906141ff565b506004611df389826141ff565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611e5393929190614319565b60405180910390a15050505050508015611ec557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611f1f576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa600087604051602401611fd596959493929190614358565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff700000000000000000000000000000000000000000000000000000000179052805190915061ffff101561208b576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600060f961209c6020846143bb565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b9000000000000000000000000000000000000000000000000000000000000815250868860405160200161214197969594939291906143d6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602080830191909120600080865291850180855252601b928401929092526405ca1ab1e06060840152635ca1ab1e608084015292509060019060a0016020604051602081039080840390855afa1580156121cf573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612247576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405160009061228d9084906405ca1ab1e090635ca1ab1e90601b907fff00000000000000000000000000000000000000000000000000000000000000906020016144b9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052955050505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612322576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c32565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314612404576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156124245750600054600160ff909116105b8061243e5750303b15801561243e575060005460ff166001145b6124ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401611848565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561252857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8a81169190910291909117909155600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001691881691909117905560036125b086826141ff565b5060046125bd85826141ff565b506005839055600780547a06978000000000000000000000000000000000000000000000000077ffffffffffffffffffffffffffffffff000000000000000090911667ffffffffffffffff8516171790558015611ec557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611ebc565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146126c4576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036126d082826141ff565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c32919061392e565b60085460ff1661273c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003612778576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156127b4576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff6801000000000000000082048116916127ef918491700100000000000000000000000000000000900416614515565b1115612827576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015612ab657600086868381811061286c5761286c613f9a565b905060200281019061287e9190614528565b6128879061455c565b90508361289381614098565b825180516020918201208185015160408087015190519499509194506000936128f59386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff891660009081526006909352912054909150811461297e576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86166000908152600660205260408120556129a36001886140f7565b8403612a125742600760189054906101000a900467ffffffffffffffff1684604001516129d091906145da565b67ffffffffffffffff161115612a12576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080612aae906140bf565b915050612850565b50612ae47f00000000000000000000000000000000000000000000000000000000000000008461124c6107a6565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612bd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf79190614121565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612c73576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ce0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d049190613e7a565b905081811115612d40576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612d7c576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612dbe73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846130ff565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e4f9190613e7a565b600780549192506801000000000000000090910467ffffffffffffffff16906008612e7983614098565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612eb09291906145fb565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612fc0576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a261301f565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613016949392919061460b565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526130fa9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261346d565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261315d9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613078565b50505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916131e5919061467c565b600060405180830381855afa9150503d8060008114613220576040519150601f19603f3d011682016040523d82523d6000602084013e613225565b606091505b50915091508161326a576040518060400160405280600781526020017f4e4f5f4e414d45000000000000000000000000000000000000000000000000008152506122c3565b6122c381613579565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916132f5919061467c565b600060405180830381855afa9150503d8060008114613330576040519150601f19603f3d011682016040523d82523d6000602084013e613335565b606091505b50915091508161326a576040518060400160405280600981526020017f4e4f5f53594d424f4c00000000000000000000000000000000000000000000008152506122c3565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8616916133fb919061467c565b600060405180830381855afa9150503d8060008114613436576040519150601f19603f3d011682016040523d82523d6000602084013e61343b565b606091505b509150915081801561344e575080516020145b6134595760126122c3565b808060200190518101906122c3919061468e565b60006134cf826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661374f9092919063ffffffff16565b8051909150156130fa57808060200190518101906134ed9190613f78565b6130fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611848565b6060604082511061359e578180602001905181019061359891906146b1565b92915050565b81516020036137165760005b6020811080156135f157508281815181106135c7576135c7613f9a565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b156136085780613600816140bf565b9150506135aa565b8060000361364b57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111561366657613666613aa9565b6040519080825280601f01601f191660200182016040528015613690576020820181803683370190505b50905060005b8281101561370e578481815181106136b0576136b0613f9a565b602001015160f81c60f81b8282815181106136cd576136cd613f9a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080613706816140bf565b915050613696565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60606122c38484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051613783919061467c565b60006040518083038185875af1925050503d80600081146137c0576040519150601f19603f3d011682016040523d82523d6000602084013e6137c5565b606091505b50915091506137d6878383876137e1565b979650505050505050565b606083156138775782516000036138705773ffffffffffffffffffffffffffffffffffffffff85163b613870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611848565b50816122c3565b6122c3838381511561388c5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611848919061392e565b60005b838110156138db5781810151838201526020016138c3565b50506000910152565b600081518084526138fc8160208601602086016138c0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061394160208301846138e4565b9392505050565b67ffffffffffffffff8116811461395e57600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461395e57600080fd5b60008060006060848603121561399857600080fd5b83356139a381613948565b92506020840135915060408401356139ba81613961565b809150509250925092565b6000602082840312156139d757600080fd5b813561394181613948565b60008083601f8401126139f457600080fd5b50813567ffffffffffffffff811115613a0c57600080fd5b6020830191508360208260051b8501011115613a2757600080fd5b9250929050565b600080600060408486031215613a4357600080fd5b833567ffffffffffffffff811115613a5a57600080fd5b613a66868287016139e2565b90945092505060208401356139ba81613961565b600060208284031215613a8c57600080fd5b813561394181613961565b63ffffffff8116811461395e57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613b1f57613b1f613aa9565b604052919050565b600067ffffffffffffffff821115613b4157613b41613aa9565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613b7e57600080fd5b8135613b91613b8c82613b27565b613ad8565b818152846020838601011115613ba657600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613bdc57600080fd5b8635613be781613961565b95506020870135613bf781613961565b94506040870135613c0781613a97565b93506060870135613c1781613961565b9250608087013567ffffffffffffffff80821115613c3457600080fd5b613c408a838b01613b6d565b935060a0890135915080821115613c5657600080fd5b50613c6389828a01613b6d565b9150509295509295509295565b60008060008060808587031215613c8657600080fd5b8435613c9181613a97565b93506020850135613ca181613961565b92506040850135613cb181613a97565b9150606085013567ffffffffffffffff811115613ccd57600080fd5b613cd987828801613b6d565b91505092959194509250565b60008060008060008060c08789031215613cfe57600080fd5b8635613d0981613961565b95506020870135613d1981613961565b9450604087013567ffffffffffffffff80821115613d3657600080fd5b613d428a838b01613b6d565b95506060890135915080821115613d5857600080fd5b50613d6589828a01613b6d565b9350506080870135915060a0870135613d7d81613948565b809150509295509295509295565b600060208284031215613d9d57600080fd5b813567ffffffffffffffff811115613db457600080fd5b6122c384828501613b6d565b60008060208385031215613dd357600080fd5b823567ffffffffffffffff811115613dea57600080fd5b613df6858286016139e2565b90969095509350505050565b600080600060408486031215613e1757600080fd5b833567ffffffffffffffff80821115613e2f57600080fd5b818601915086601f830112613e4357600080fd5b813581811115613e5257600080fd5b876020828501011115613e6457600080fd5b6020928301989097509590910135949350505050565b600060208284031215613e8c57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613ee357613ee3613e93565b5092915050565b600082613f20577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613f3957607f821691505b602082108103613f72577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215613f8a57600080fd5b8151801515811461394157600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613ffd57600080fd5b9190910192915050565b60006080823603121561401957600080fd5b6040516080810167ffffffffffffffff828210818311171561403d5761403d613aa9565b81604052843591508082111561405257600080fd5b5061405f36828601613b6d565b82525060208301356020820152604083013561407a81613948565b6040820152606083013561408d81613948565b606082015292915050565b600067ffffffffffffffff8083168181036140b5576140b5613e93565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036140f0576140f0613e93565b5060010190565b8181038181111561359857613598613e93565b808202811582820484141761359857613598613e93565b60006020828403121561413357600080fd5b815161394181613948565b60608152600061415160608301866138e4565b828103602084015261416381866138e4565b91505060ff83166040830152949350505050565b6000806040838503121561418a57600080fd5b825161419581613a97565b60208401519092506141a681613961565b809150509250929050565b601f8211156130fa57600081815260208120601f850160051c810160208610156141d85750805b601f850160051c820191505b818110156141f7578281556001016141e4565b505050505050565b815167ffffffffffffffff81111561421957614219613aa9565b61422d816142278454613f25565b846141b1565b602080601f831160018114614280576000841561424a5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556141f7565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156142cd578886015182559484019460019091019084016142ae565b508582101561430957878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60608152600061432c60608301866138e4565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a08301526143af60c08301846138e4565b98975050505050505050565b61ffff818116838216019080821115613ee357613ee3613e93565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b166001840152875161443f816003860160208c016138c0565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614482816017840160208b016138c0565b808201915050818660f01b166017820152845191506144a88260198301602088016138c0565b016019019998505050505050505050565b600086516144cb818460208b016138c0565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b8082018082111561359857613598613e93565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112613ffd57600080fd5b60006060823603121561456e57600080fd5b6040516060810167ffffffffffffffff828210818311171561459257614592613aa9565b8160405284359150808211156145a757600080fd5b506145b436828601613b6d565b8252506020830135602082015260408301356145cf81613948565b604082015292915050565b67ffffffffffffffff818116838216019080821115613ee357613ee3613e93565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b60008251613ffd8184602087016138c0565b6000602082840312156146a057600080fd5b815160ff8116811461394157600080fd5b6000602082840312156146c357600080fd5b815167ffffffffffffffff8111156146da57600080fd5b8201601f810184136146eb57600080fd5b80516146f9613b8c82613b27565b81815285602083850101111561470e57600080fd5b61471f8260208301602086016138c0565b9594505050505056fea264697066735822122085e954b3c03db9fc33602edbb8bc952dc84d1ba702b087333a891f41f926636964736f6c63430008140033", + "bytecode": "0x6101006040523480156200001257600080fd5b5060405162004b1d38038062004b1d833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e051614969620001b460003960008181610525015281816109c301528181610b30015281816112870152818161135001528181611372015281816115090152818161178601528181611d3f015281816124bf01528181612be401528181612cb20152612d9f0152600081816106740152818161144a015281816119e00152818161210f015261221701526000818161074b01528181610faa01528181611b950152612eea0152600081816107900152818161085b015281816112da015281816114200152612ebe01526149696000f3fe608060405234801561001057600080fd5b50600436106102f35760003560e01c80636ff512cc11610191578063c7fffd4b116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b146107d2578063f35dda47146107e5578063f851a440146107ed57600080fd5b8063d8d1091b14610778578063e46761c41461078b578063e7a7ed02146107b257600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610726578063d02103ca14610746578063d7bc90ff1461076d57600080fd5b8063c7fffd4b1461070b578063c89e42df1461071357600080fd5b8063a3c573eb11610145578063b0afe1541161011f578063b0afe154146106bc578063bb590708146106c8578063c754c7ed146106db57600080fd5b8063a3c573eb1461066f578063a652f26c14610696578063ada8f919146106a957600080fd5b80637a5460c5116101765780637a5460c5146106105780638c3d73011461064c5780639e0018771461065457600080fd5b80636ff512cc146105ea57806371257022146105fd57600080fd5b806340b5de6c1161024a578063542028d5116101fe578063676870d2116101d8578063676870d2146105b95780636b8616ce146105c15780636e05d2cd146105e157600080fd5b8063542028d5146105965780635e9145c91461059e5780635ec91958146105b157600080fd5b806349b7b8021161022f57806349b7b802146105205780634e4877061461054757806352bdeb6d1461055a57600080fd5b806340b5de6c146104a057806345605267146104f857600080fd5b806319d8ac61116102ac57806332c2d1531161028657806332c2d153146104285780633c351e101461043d5780633cbc795b1461046257600080fd5b806319d8ac611461039957806326782247146103c65780632b35b3ac1461040b57600080fd5b806305835f37116102dd57806305835f371461032e578063107bf28c1461037757806311e892d41461037f57600080fd5b8062d0295d146102f85780630350896314610313575b600080fd5b610300610813565b6040519081526020015b60405180910390f35b61031b602081565b60405161ffff909116815260200161030a565b61036a6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161030a9190613a56565b61036a610933565b61038760f981565b60405160ff909116815260200161030a565b6007546103ad9067ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161030a565b6001546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161030a565b6008546104189060ff1681565b604051901515815260200161030a565b61043b610436366004613aab565b6109c1565b005b6008546103e690610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60085461048b907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161030a565b6104c77fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161030a565b6007546103ad90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b61043b610555366004613aed565b610a90565b61036a6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61036a610caa565b61043b6105ac366004613b56565b610cb7565b61043b6115d0565b61031b601f81565b6103006105cf366004613aed565b60066020526000908152604090205481565b61030060055481565b61043b6105f8366004613ba2565b6116ba565b61043b61060b366004613ceb565b611784565b61036a6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61043b611f3b565b6103e673a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b61036a6106a4366004613d98565b61200e565b61043b6106b7366004613ba2565b6123f3565b6103006405ca1ab1e081565b61043b6106d6366004613e0d565b6124bd565b6007546103ad907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61038760e481565b61043b610721366004613eb3565b612795565b6002546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b610300635ca1ab1e81565b61043b610786366004613ee8565b612828565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b6007546103ad9068010000000000000000900467ffffffffffffffff1681565b61043b6107e0366004613f2a565b612d5f565b610387601b81565b6000546103e69062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156108a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c69190613fa2565b6007549091506000906109059067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613fea565b67ffffffffffffffff169050806000036109225760009250505090565b61092c8183614012565b9250505090565b600480546109409061404d565b80601f016020809104026020016040519081016040528092919081815260200182805461096c9061404d565b80156109b95780601f1061098e576101008083540402835291602001916109b9565b820191906000526020600020905b81548152906001019060200180831161099c57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a30576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a8391815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ae7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b2e576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbd91906140a0565b610c265760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c26576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546109409061404d565b60025473ffffffffffffffffffffffffffffffffffffffff163314610d08576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003610d44576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610d80576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156111bc576000898983818110610dc957610dc96140c2565b9050602002810190610ddb91906140f1565b610de49061412f565b8051805160209091012060608201519192509067ffffffffffffffff1615610f675785610e10816141c0565b96505060008183602001518460600151604051602001610e6893929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114610ef1576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015610f47576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86166000908152600660205260408120556110a4565b60208201511580159061102e575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015611008573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102c9190613fa2565b155b15611065576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156110a4576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806110d7575042826040015167ffffffffffffffff16115b1561110e576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519650505080806111b4906141e7565b915050610dad565b5060075467ffffffffffffffff6801000000000000000090910481169084161115611213576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691909117909155600583905585908281169085161461134a57600061126a8386613fea565b905061128067ffffffffffffffff82168361421f565b91506113017f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166112b9610813565b6112c39190614232565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016919061314e565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611448337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ff9190613fa2565b6114099190614232565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613227565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156114b057600080fd5b505af11580156114c4573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af1158015611568573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158c9190614249565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611627576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615611664576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611711576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c9f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146117f3576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156118135750600054600160ff909116105b8061182d5750303b15801561182d575060005460ff166001145b6118be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561191c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611b31576119438561328b565b61194c8661339b565b611955876134a2565b60405160200161196793929190614266565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611a28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4c919061429f565b915091508163ffffffff16600014611ae957600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff851602179055611b2e565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b600854600090611b7e908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff168561200e565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c229190613fa2565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611d9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc19190614249565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611e539190614327565b506004611e608982614327565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611ec093929190614441565b60405180910390a15050505050508015611f3257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611f8c576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa60008760405160240161204296959493929190614480565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060906000036121935760f9601f83516120d791906144e3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e48760405160200161217d97969594939291906144fe565b6040516020818303038152906040529050612297565b815161ffff10156121d0576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96121df6020836144e3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b9000000000000000000000000000000000000000000000000000000000000815250858860405160200161228497969594939291906145e1565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156122f8573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612370576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906123b69084906405ca1ab1e090635ca1ab1e90601b907fff00000000000000000000000000000000000000000000000000000000000000906020016146c4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461244a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c9f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461252c576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff161580801561254c5750600054600160ff909116105b806125665750303b158015612566575060005460ff166001145b6125f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016118b5565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561265057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8a81169190910291909117909155600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001691881691909117905560036126d88682614327565b5060046126e58582614327565b506005839055600780547a06978000000000000000000000000000000000000000000000000077ffffffffffffffffffffffffffffffff000000000000000090911667ffffffffffffffff8516171790558015611f3257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611f29565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146127ec576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036127f88282614327565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c9f9190613a56565b60085460ff16612864576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036128a0576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156128dc576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612917918491700100000000000000000000000000000000900416614720565b111561294f576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015612bde576000868683818110612994576129946140c2565b90506020028101906129a69190614733565b6129af90614767565b9050836129bb816141c0565b82518051602091820120818501516040808701519051949950919450600093612a1d9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612aa6576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055612acb60018861421f565b8403612b3a5742600760189054906101000a900467ffffffffffffffff168460400151612af891906147e5565b67ffffffffffffffff161115612b3a576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080612bd6906141e7565b915050612978565b50612c0c7f0000000000000000000000000000000000000000000000000000000000000000846112b9610813565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612cfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d1f9190614249565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612d9b576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e2c9190613fa2565b905081811115612e68576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612ea4576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ee673ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613227565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f779190613fa2565b600780549192506801000000000000000090910467ffffffffffffffff16906008612fa1836141c0565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612fd8929190614806565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff16600090815260069093529120553233036130e8576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613147565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9318233888860405161313e9493929190614816565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526132229084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613595565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526132859085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016131a0565b50505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161330d9190614887565b600060405180830381855afa9150503d8060008114613348576040519150601f19603f3d011682016040523d82523d6000602084013e61334d565b606091505b509150915081613392576040518060400160405280600781526020017f4e4f5f4e414d45000000000000000000000000000000000000000000000000008152506123eb565b6123eb816136a1565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161341d9190614887565b600060405180830381855afa9150503d8060008114613458576040519150601f19603f3d011682016040523d82523d6000602084013e61345d565b606091505b509150915081613392576040518060400160405280600981526020017f4e4f5f53594d424f4c00000000000000000000000000000000000000000000008152506123eb565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8616916135239190614887565b600060405180830381855afa9150503d806000811461355e576040519150601f19603f3d011682016040523d82523d6000602084013e613563565b606091505b5091509150818015613576575080516020145b6135815760126123eb565b808060200190518101906123eb9190614899565b60006135f7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166138779092919063ffffffff16565b805190915015613222578080602001905181019061361591906140a0565b613222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016118b5565b606060408251106136c657818060200190518101906136c091906148bc565b92915050565b815160200361383e5760005b60208110801561371957508281815181106136ef576136ef6140c2565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b156137305780613728816141e7565b9150506136d2565b8060000361377357505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111561378e5761378e613bd1565b6040519080825280601f01601f1916602001820160405280156137b8576020820181803683370190505b50905060005b82811015613836578481815181106137d8576137d86140c2565b602001015160f81c60f81b8282815181106137f5576137f56140c2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061382e816141e7565b9150506137be565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60606123eb8484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516138ab9190614887565b60006040518083038185875af1925050503d80600081146138e8576040519150601f19603f3d011682016040523d82523d6000602084013e6138ed565b606091505b50915091506138fe87838387613909565b979650505050505050565b6060831561399f5782516000036139985773ffffffffffffffffffffffffffffffffffffffff85163b613998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016118b5565b50816123eb565b6123eb83838151156139b45781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b59190613a56565b60005b83811015613a035781810151838201526020016139eb565b50506000910152565b60008151808452613a248160208601602086016139e8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613a696020830184613a0c565b9392505050565b67ffffffffffffffff81168114613a8657600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613a8657600080fd5b600080600060608486031215613ac057600080fd5b8335613acb81613a70565b9250602084013591506040840135613ae281613a89565b809150509250925092565b600060208284031215613aff57600080fd5b8135613a6981613a70565b60008083601f840112613b1c57600080fd5b50813567ffffffffffffffff811115613b3457600080fd5b6020830191508360208260051b8501011115613b4f57600080fd5b9250929050565b600080600060408486031215613b6b57600080fd5b833567ffffffffffffffff811115613b8257600080fd5b613b8e86828701613b0a565b9094509250506020840135613ae281613a89565b600060208284031215613bb457600080fd5b8135613a6981613a89565b63ffffffff81168114613a8657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613c4757613c47613bd1565b604052919050565b600067ffffffffffffffff821115613c6957613c69613bd1565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613ca657600080fd5b8135613cb9613cb482613c4f565b613c00565b818152846020838601011115613cce57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613d0457600080fd5b8635613d0f81613a89565b95506020870135613d1f81613a89565b94506040870135613d2f81613bbf565b93506060870135613d3f81613a89565b9250608087013567ffffffffffffffff80821115613d5c57600080fd5b613d688a838b01613c95565b935060a0890135915080821115613d7e57600080fd5b50613d8b89828a01613c95565b9150509295509295509295565b60008060008060808587031215613dae57600080fd5b8435613db981613bbf565b93506020850135613dc981613a89565b92506040850135613dd981613bbf565b9150606085013567ffffffffffffffff811115613df557600080fd5b613e0187828801613c95565b91505092959194509250565b60008060008060008060c08789031215613e2657600080fd5b8635613e3181613a89565b95506020870135613e4181613a89565b9450604087013567ffffffffffffffff80821115613e5e57600080fd5b613e6a8a838b01613c95565b95506060890135915080821115613e8057600080fd5b50613e8d89828a01613c95565b9350506080870135915060a0870135613ea581613a70565b809150509295509295509295565b600060208284031215613ec557600080fd5b813567ffffffffffffffff811115613edc57600080fd5b6123eb84828501613c95565b60008060208385031215613efb57600080fd5b823567ffffffffffffffff811115613f1257600080fd5b613f1e85828601613b0a565b90969095509350505050565b600080600060408486031215613f3f57600080fd5b833567ffffffffffffffff80821115613f5757600080fd5b818601915086601f830112613f6b57600080fd5b813581811115613f7a57600080fd5b876020828501011115613f8c57600080fd5b6020928301989097509590910135949350505050565b600060208284031215613fb457600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff82811682821603908082111561400b5761400b613fbb565b5092915050565b600082614048577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061406157607f821691505b60208210810361409a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000602082840312156140b257600080fd5b81518015158114613a6957600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261412557600080fd5b9190910192915050565b60006080823603121561414157600080fd5b6040516080810167ffffffffffffffff828210818311171561416557614165613bd1565b81604052843591508082111561417a57600080fd5b5061418736828601613c95565b8252506020830135602082015260408301356141a281613a70565b604082015260608301356141b581613a70565b606082015292915050565b600067ffffffffffffffff8083168181036141dd576141dd613fbb565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361421857614218613fbb565b5060010190565b818103818111156136c0576136c0613fbb565b80820281158282048414176136c0576136c0613fbb565b60006020828403121561425b57600080fd5b8151613a6981613a70565b6060815260006142796060830186613a0c565b828103602084015261428b8186613a0c565b91505060ff83166040830152949350505050565b600080604083850312156142b257600080fd5b82516142bd81613bbf565b60208401519092506142ce81613a89565b809150509250929050565b601f82111561322257600081815260208120601f850160051c810160208610156143005750805b601f850160051c820191505b8181101561431f5782815560010161430c565b505050505050565b815167ffffffffffffffff81111561434157614341613bd1565b6143558161434f845461404d565b846142d9565b602080601f8311600181146143a857600084156143725750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561431f565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156143f5578886015182559484019460019091019084016143d6565b508582101561443157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006144546060830186613a0c565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a08301526144d760c0830184613a0c565b98975050505050505050565b61ffff81811683821601908082111561400b5761400b613fbb565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614567816003860160208c016139e8565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516145aa816017840160208b016139e8565b808201915050818660f81b166017820152845191506145d08260188301602088016139e8565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b166001840152875161464a816003860160208c016139e8565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161468d816017840160208b016139e8565b808201915050818660f01b166017820152845191506146b38260198301602088016139e8565b016019019998505050505050505050565b600086516146d6818460208b016139e8565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b808201808211156136c0576136c0613fbb565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261412557600080fd5b60006060823603121561477957600080fd5b6040516060810167ffffffffffffffff828210818311171561479d5761479d613bd1565b8160405284359150808211156147b257600080fd5b506147bf36828601613c95565b8252506020830135602082015260408301356147da81613a70565b604082015292915050565b67ffffffffffffffff81811683821601908082111561400b5761400b613fbb565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b600082516141258184602087016139e8565b6000602082840312156148ab57600080fd5b815160ff81168114613a6957600080fd5b6000602082840312156148ce57600080fd5b815167ffffffffffffffff8111156148e557600080fd5b8201601f810184136148f657600080fd5b8051614904613cb482613c4f565b81815285602083850101111561491957600080fd5b61492a8260208301602086016139e8565b9594505050505056fea2646970667358221220492dfbc7c1b97148aa44a030fb00678b20ce0fdd3241269fe81eb4228a6add5664736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102f35760003560e01c80636ff512cc11610191578063c7fffd4b116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b146107d2578063f35dda47146107e5578063f851a440146107ed57600080fd5b8063d8d1091b14610778578063e46761c41461078b578063e7a7ed02146107b257600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610726578063d02103ca14610746578063d7bc90ff1461076d57600080fd5b8063c7fffd4b1461070b578063c89e42df1461071357600080fd5b8063a3c573eb11610145578063b0afe1541161011f578063b0afe154146106bc578063bb590708146106c8578063c754c7ed146106db57600080fd5b8063a3c573eb1461066f578063a652f26c14610696578063ada8f919146106a957600080fd5b80637a5460c5116101765780637a5460c5146106105780638c3d73011461064c5780639e0018771461065457600080fd5b80636ff512cc146105ea57806371257022146105fd57600080fd5b806340b5de6c1161024a578063542028d5116101fe578063676870d2116101d8578063676870d2146105b95780636b8616ce146105c15780636e05d2cd146105e157600080fd5b8063542028d5146105965780635e9145c91461059e5780635ec91958146105b157600080fd5b806349b7b8021161022f57806349b7b802146105205780634e4877061461054757806352bdeb6d1461055a57600080fd5b806340b5de6c146104a057806345605267146104f857600080fd5b806319d8ac61116102ac57806332c2d1531161028657806332c2d153146104285780633c351e101461043d5780633cbc795b1461046257600080fd5b806319d8ac611461039957806326782247146103c65780632b35b3ac1461040b57600080fd5b806305835f37116102dd57806305835f371461032e578063107bf28c1461037757806311e892d41461037f57600080fd5b8062d0295d146102f85780630350896314610313575b600080fd5b610300610813565b6040519081526020015b60405180910390f35b61031b602081565b60405161ffff909116815260200161030a565b61036a6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161030a9190613a56565b61036a610933565b61038760f981565b60405160ff909116815260200161030a565b6007546103ad9067ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161030a565b6001546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161030a565b6008546104189060ff1681565b604051901515815260200161030a565b61043b610436366004613aab565b6109c1565b005b6008546103e690610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60085461048b907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161030a565b6104c77fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161030a565b6007546103ad90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b61043b610555366004613aed565b610a90565b61036a6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61036a610caa565b61043b6105ac366004613b56565b610cb7565b61043b6115d0565b61031b601f81565b6103006105cf366004613aed565b60066020526000908152604090205481565b61030060055481565b61043b6105f8366004613ba2565b6116ba565b61043b61060b366004613ceb565b611784565b61036a6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61043b611f3b565b6103e673a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b61036a6106a4366004613d98565b61200e565b61043b6106b7366004613ba2565b6123f3565b6103006405ca1ab1e081565b61043b6106d6366004613e0d565b6124bd565b6007546103ad907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61038760e481565b61043b610721366004613eb3565b612795565b6002546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b610300635ca1ab1e81565b61043b610786366004613ee8565b612828565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b6007546103ad9068010000000000000000900467ffffffffffffffff1681565b61043b6107e0366004613f2a565b612d5f565b610387601b81565b6000546103e69062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156108a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c69190613fa2565b6007549091506000906109059067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613fea565b67ffffffffffffffff169050806000036109225760009250505090565b61092c8183614012565b9250505090565b600480546109409061404d565b80601f016020809104026020016040519081016040528092919081815260200182805461096c9061404d565b80156109b95780601f1061098e576101008083540402835291602001916109b9565b820191906000526020600020905b81548152906001019060200180831161099c57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a30576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a8391815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ae7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b2e576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbd91906140a0565b610c265760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c26576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546109409061404d565b60025473ffffffffffffffffffffffffffffffffffffffff163314610d08576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003610d44576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610d80576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156111bc576000898983818110610dc957610dc96140c2565b9050602002810190610ddb91906140f1565b610de49061412f565b8051805160209091012060608201519192509067ffffffffffffffff1615610f675785610e10816141c0565b96505060008183602001518460600151604051602001610e6893929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114610ef1576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015610f47576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86166000908152600660205260408120556110a4565b60208201511580159061102e575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015611008573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102c9190613fa2565b155b15611065576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156110a4576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806110d7575042826040015167ffffffffffffffff16115b1561110e576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519650505080806111b4906141e7565b915050610dad565b5060075467ffffffffffffffff6801000000000000000090910481169084161115611213576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691909117909155600583905585908281169085161461134a57600061126a8386613fea565b905061128067ffffffffffffffff82168361421f565b91506113017f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166112b9610813565b6112c39190614232565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016919061314e565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611448337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ff9190613fa2565b6114099190614232565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613227565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156114b057600080fd5b505af11580156114c4573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af1158015611568573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158c9190614249565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611627576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615611664576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611711576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c9f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146117f3576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156118135750600054600160ff909116105b8061182d5750303b15801561182d575060005460ff166001145b6118be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561191c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611b31576119438561328b565b61194c8661339b565b611955876134a2565b60405160200161196793929190614266565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611a28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4c919061429f565b915091508163ffffffff16600014611ae957600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff851602179055611b2e565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b600854600090611b7e908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff168561200e565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c229190613fa2565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611d9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc19190614249565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611e539190614327565b506004611e608982614327565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611ec093929190614441565b60405180910390a15050505050508015611f3257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611f8c576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa60008760405160240161204296959493929190614480565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060906000036121935760f9601f83516120d791906144e3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e48760405160200161217d97969594939291906144fe565b6040516020818303038152906040529050612297565b815161ffff10156121d0576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96121df6020836144e3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b9000000000000000000000000000000000000000000000000000000000000815250858860405160200161228497969594939291906145e1565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156122f8573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612370576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906123b69084906405ca1ab1e090635ca1ab1e90601b907fff00000000000000000000000000000000000000000000000000000000000000906020016146c4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461244a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c9f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461252c576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff161580801561254c5750600054600160ff909116105b806125665750303b158015612566575060005460ff166001145b6125f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016118b5565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561265057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8a81169190910291909117909155600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001691881691909117905560036126d88682614327565b5060046126e58582614327565b506005839055600780547a06978000000000000000000000000000000000000000000000000077ffffffffffffffffffffffffffffffff000000000000000090911667ffffffffffffffff8516171790558015611f3257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611f29565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146127ec576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036127f88282614327565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c9f9190613a56565b60085460ff16612864576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036128a0576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156128dc576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612917918491700100000000000000000000000000000000900416614720565b111561294f576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015612bde576000868683818110612994576129946140c2565b90506020028101906129a69190614733565b6129af90614767565b9050836129bb816141c0565b82518051602091820120818501516040808701519051949950919450600093612a1d9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612aa6576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055612acb60018861421f565b8403612b3a5742600760189054906101000a900467ffffffffffffffff168460400151612af891906147e5565b67ffffffffffffffff161115612b3a576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080612bd6906141e7565b915050612978565b50612c0c7f0000000000000000000000000000000000000000000000000000000000000000846112b9610813565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612cfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d1f9190614249565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612d9b576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e2c9190613fa2565b905081811115612e68576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612ea4576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ee673ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613227565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f779190613fa2565b600780549192506801000000000000000090910467ffffffffffffffff16906008612fa1836141c0565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612fd8929190614806565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff16600090815260069093529120553233036130e8576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613147565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9318233888860405161313e9493929190614816565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526132229084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613595565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526132859085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016131a0565b50505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161330d9190614887565b600060405180830381855afa9150503d8060008114613348576040519150601f19603f3d011682016040523d82523d6000602084013e61334d565b606091505b509150915081613392576040518060400160405280600781526020017f4e4f5f4e414d45000000000000000000000000000000000000000000000000008152506123eb565b6123eb816136a1565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161341d9190614887565b600060405180830381855afa9150503d8060008114613458576040519150601f19603f3d011682016040523d82523d6000602084013e61345d565b606091505b509150915081613392576040518060400160405280600981526020017f4e4f5f53594d424f4c00000000000000000000000000000000000000000000008152506123eb565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8616916135239190614887565b600060405180830381855afa9150503d806000811461355e576040519150601f19603f3d011682016040523d82523d6000602084013e613563565b606091505b5091509150818015613576575080516020145b6135815760126123eb565b808060200190518101906123eb9190614899565b60006135f7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166138779092919063ffffffff16565b805190915015613222578080602001905181019061361591906140a0565b613222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016118b5565b606060408251106136c657818060200190518101906136c091906148bc565b92915050565b815160200361383e5760005b60208110801561371957508281815181106136ef576136ef6140c2565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b156137305780613728816141e7565b9150506136d2565b8060000361377357505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111561378e5761378e613bd1565b6040519080825280601f01601f1916602001820160405280156137b8576020820181803683370190505b50905060005b82811015613836578481815181106137d8576137d86140c2565b602001015160f81c60f81b8282815181106137f5576137f56140c2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061382e816141e7565b9150506137be565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60606123eb8484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516138ab9190614887565b60006040518083038185875af1925050503d80600081146138e8576040519150601f19603f3d011682016040523d82523d6000602084013e6138ed565b606091505b50915091506138fe87838387613909565b979650505050505050565b6060831561399f5782516000036139985773ffffffffffffffffffffffffffffffffffffffff85163b613998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016118b5565b50816123eb565b6123eb83838151156139b45781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b59190613a56565b60005b83811015613a035781810151838201526020016139eb565b50506000910152565b60008151808452613a248160208601602086016139e8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613a696020830184613a0c565b9392505050565b67ffffffffffffffff81168114613a8657600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613a8657600080fd5b600080600060608486031215613ac057600080fd5b8335613acb81613a70565b9250602084013591506040840135613ae281613a89565b809150509250925092565b600060208284031215613aff57600080fd5b8135613a6981613a70565b60008083601f840112613b1c57600080fd5b50813567ffffffffffffffff811115613b3457600080fd5b6020830191508360208260051b8501011115613b4f57600080fd5b9250929050565b600080600060408486031215613b6b57600080fd5b833567ffffffffffffffff811115613b8257600080fd5b613b8e86828701613b0a565b9094509250506020840135613ae281613a89565b600060208284031215613bb457600080fd5b8135613a6981613a89565b63ffffffff81168114613a8657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613c4757613c47613bd1565b604052919050565b600067ffffffffffffffff821115613c6957613c69613bd1565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613ca657600080fd5b8135613cb9613cb482613c4f565b613c00565b818152846020838601011115613cce57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613d0457600080fd5b8635613d0f81613a89565b95506020870135613d1f81613a89565b94506040870135613d2f81613bbf565b93506060870135613d3f81613a89565b9250608087013567ffffffffffffffff80821115613d5c57600080fd5b613d688a838b01613c95565b935060a0890135915080821115613d7e57600080fd5b50613d8b89828a01613c95565b9150509295509295509295565b60008060008060808587031215613dae57600080fd5b8435613db981613bbf565b93506020850135613dc981613a89565b92506040850135613dd981613bbf565b9150606085013567ffffffffffffffff811115613df557600080fd5b613e0187828801613c95565b91505092959194509250565b60008060008060008060c08789031215613e2657600080fd5b8635613e3181613a89565b95506020870135613e4181613a89565b9450604087013567ffffffffffffffff80821115613e5e57600080fd5b613e6a8a838b01613c95565b95506060890135915080821115613e8057600080fd5b50613e8d89828a01613c95565b9350506080870135915060a0870135613ea581613a70565b809150509295509295509295565b600060208284031215613ec557600080fd5b813567ffffffffffffffff811115613edc57600080fd5b6123eb84828501613c95565b60008060208385031215613efb57600080fd5b823567ffffffffffffffff811115613f1257600080fd5b613f1e85828601613b0a565b90969095509350505050565b600080600060408486031215613f3f57600080fd5b833567ffffffffffffffff80821115613f5757600080fd5b818601915086601f830112613f6b57600080fd5b813581811115613f7a57600080fd5b876020828501011115613f8c57600080fd5b6020928301989097509590910135949350505050565b600060208284031215613fb457600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff82811682821603908082111561400b5761400b613fbb565b5092915050565b600082614048577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061406157607f821691505b60208210810361409a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000602082840312156140b257600080fd5b81518015158114613a6957600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261412557600080fd5b9190910192915050565b60006080823603121561414157600080fd5b6040516080810167ffffffffffffffff828210818311171561416557614165613bd1565b81604052843591508082111561417a57600080fd5b5061418736828601613c95565b8252506020830135602082015260408301356141a281613a70565b604082015260608301356141b581613a70565b606082015292915050565b600067ffffffffffffffff8083168181036141dd576141dd613fbb565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361421857614218613fbb565b5060010190565b818103818111156136c0576136c0613fbb565b80820281158282048414176136c0576136c0613fbb565b60006020828403121561425b57600080fd5b8151613a6981613a70565b6060815260006142796060830186613a0c565b828103602084015261428b8186613a0c565b91505060ff83166040830152949350505050565b600080604083850312156142b257600080fd5b82516142bd81613bbf565b60208401519092506142ce81613a89565b809150509250929050565b601f82111561322257600081815260208120601f850160051c810160208610156143005750805b601f850160051c820191505b8181101561431f5782815560010161430c565b505050505050565b815167ffffffffffffffff81111561434157614341613bd1565b6143558161434f845461404d565b846142d9565b602080601f8311600181146143a857600084156143725750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561431f565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156143f5578886015182559484019460019091019084016143d6565b508582101561443157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006144546060830186613a0c565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a08301526144d760c0830184613a0c565b98975050505050505050565b61ffff81811683821601908082111561400b5761400b613fbb565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614567816003860160208c016139e8565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516145aa816017840160208b016139e8565b808201915050818660f81b166017820152845191506145d08260188301602088016139e8565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b166001840152875161464a816003860160208c016139e8565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161468d816017840160208b016139e8565b808201915050818660f01b166017820152845191506146b38260198301602088016139e8565b016019019998505050505050505050565b600086516146d6818460208b016139e8565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b808201808211156136c0576136c0613fbb565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261412557600080fd5b60006060823603121561477957600080fd5b6040516060810167ffffffffffffffff828210818311171561479d5761479d613bd1565b8160405284359150808211156147b257600080fd5b506147bf36828601613c95565b8252506020830135602082015260408301356147da81613a70565b604082015292915050565b67ffffffffffffffff81811683821601908082111561400b5761400b613fbb565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b600082516141258184602087016139e8565b6000602082840312156148ab57600080fd5b815160ff81168114613a6957600080fd5b6000602082840312156148ce57600080fd5b815167ffffffffffffffff8111156148e557600080fd5b8201601f810184136148f657600080fd5b8051614904613cb482613c4f565b81815285602083850101111561491957600080fd5b61492a8260208301602086016139e8565b9594505050505056fea2646970667358221220492dfbc7c1b97148aa44a030fb00678b20ce0fdd3241269fe81eb4228a6add5664736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/contracts/v2/lib/PolygonRollupBase.sol b/contracts/v2/lib/PolygonRollupBase.sol index 8ca0bf3de..657c471a8 100644 --- a/contracts/v2/lib/PolygonRollupBase.sol +++ b/contracts/v2/lib/PolygonRollupBase.sol @@ -102,6 +102,16 @@ contract PolygonRollupBase is // List rlp: 1 listLenLen "0xf9" (0xf7 + 2), + listLen 2 (32 bytes + txData bytes) (do not accept more than 65535 bytes) + // First byte of the initialize bridge tx, indicates a list with a lengt of 2 bytes + // Since the minimum constant bytes will be: 259 (tx data empty) + 31 (tx parameters) = 259 (0x103) will always take 2 bytes to express the lenght of the rlp + // Note that more than 2 bytes of list len is not supported, since it's constrained to 65535 + uint8 public constant INITIALIZE_TX_BRIDGE_LIST_LEN_LEN = 0xf9; + + // Tx parameters until the bridge address + bytes public constant INITIALIZE_TX_BRIDGE_PARAMS = hex"80808401c9c38094"; + + // RLP encoded metadata (non empty) + // TxData bytes: 164 bytes data ( signature 4 bytes + 5 parameters*32bytes + // (abi encoded metadata: 32 bytes position + 32 bytes len + 32 bytes position name + 32 bytes length name + 32 bytes position Symbol + 32 bytes length Symbol //+ 32 bytes decimal )) min 7*32 bytes = @@ -113,18 +123,28 @@ contract PolygonRollupBase is // stringLen (0x0184 + nameLen padded to 32 bytes + symbol len padded to 32 bytes) + txData bytes = 32 bytes + txData bytes uint16 public constant INITIALIZE_TX_CONSTANT_BYTES = 32; - // First byte of the initialize bridge tx, indicates a list with a lengt of 2 bytes - // Since the minimum constant bytes will be: 388 (tx data min) + 32 (tx parameters) = 420 (0x1a4) will always take 2 bytes to express the lenght of the rlp - // Note that more than 2 bytes of list len is not supported, since it's constrained to 65535 - uint8 public constant INITIALIZE_TX_BRIDGE_LIST_LEN_LEN = 0xf9; - - // Tx parameters until the bridge address - bytes public constant INITIALIZE_TX_BRIDGE_PARAMS = hex"80808401c9c38094"; - // Tx parameters after the bridge address bytes public constant INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS = hex"80b9"; + // RLP empty metadata + + // TxData empty metadata bytes: 164 bytes data ( signature 4 bytes + 5 parameters*32bytes + + // (abi encoded metadata: 32 bytes position + 32 bytes len = 2*32 bytes = + // = 164 bytes + 64 bytes = 228 (0xe4) + + // Constant bytes empty metadata : 1 nonce "0x80" + 1 gasPrice "0x80" + 5 gasLimit "0x8401c9c380" (30M gas) + // + 21 to ("0x94" + bridgeAddress") + 1 value "0x80" + 1 stringLenLen "0xb8" (0xb7 + 1) + + // 1 stringLen (0xe4) + txData bytes = 31 bytes + txData bytes empty metadata 228 = 259 + uint16 public constant INITIALIZE_TX_CONSTANT_BYTES_EMPTY_METADATA = 31; + + uint8 public constant INITIALIZE_TX_DATA_LEN_EMPTY_METADATA = 228; // 0xe4 + + // Tx parameters after the bridge address + bytes + public constant INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS_EMPTY_METADATA = + hex"80b8"; + // Signature used to initialize the bridge // V parameter of the initialize signature @@ -868,21 +888,37 @@ contract PolygonRollupBase is ) ); - // Do not support more than 65535 bytes - if (initializeBrigeData.length > type(uint16).max) { - revert HugeTokenMetadataNotSupported(); + bytes memory bytesToSign; + + if (_gasTokenMetadata.length == 0) { + bytesToSign = abi.encodePacked( + INITIALIZE_TX_BRIDGE_LIST_LEN_LEN, + uint16(initializeBrigeData.length) + + INITIALIZE_TX_CONSTANT_BYTES_EMPTY_METADATA, // do not support more than 2 bytes of length, intended to revert on overflow + INITIALIZE_TX_BRIDGE_PARAMS, + bridgeAddress, + INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS_EMPTY_METADATA, + INITIALIZE_TX_DATA_LEN_EMPTY_METADATA, + initializeBrigeData + ); + } else { + // Do not support more than 65535 bytes + if (initializeBrigeData.length > type(uint16).max) { + revert HugeTokenMetadataNotSupported(); + } + uint16 initializeBrigeDataLen = uint16(initializeBrigeData.length); + + bytesToSign = abi.encodePacked( + INITIALIZE_TX_BRIDGE_LIST_LEN_LEN, + uint16(initializeBrigeData.length) + + INITIALIZE_TX_CONSTANT_BYTES, // do not support more than 2 bytes of length, intended to revert on overflow + INITIALIZE_TX_BRIDGE_PARAMS, + bridgeAddress, + INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS, + initializeBrigeDataLen, + initializeBrigeData + ); } - uint16 initializeBrigeDataLen = uint16(initializeBrigeData.length); - - bytes memory bytesToSign = abi.encodePacked( - INITIALIZE_TX_BRIDGE_LIST_LEN_LEN, - uint16(initializeBrigeData.length) + INITIALIZE_TX_CONSTANT_BYTES, // do not support more than 2 bytes of length, intended to revert on overflow - INITIALIZE_TX_BRIDGE_PARAMS, - bridgeAddress, - INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS, - initializeBrigeDataLen, - initializeBrigeData - ); // Sanity check that the ecrecover will work // Should never happen that giving a valid signature, ecrecover "breaks" diff --git a/contracts/v2/lib/PolygonRollupBaseEtrog.sol b/contracts/v2/lib/PolygonRollupBaseEtrog.sol index d72389e23..9d6b4a949 100644 --- a/contracts/v2/lib/PolygonRollupBaseEtrog.sol +++ b/contracts/v2/lib/PolygonRollupBaseEtrog.sol @@ -88,6 +88,16 @@ contract PolygonRollupBaseEtrog is // List rlp: 1 listLenLen "0xf9" (0xf7 + 2), + listLen 2 (32 bytes + txData bytes) (do not accept more than 65535 bytes) + // First byte of the initialize bridge tx, indicates a list with a lengt of 2 bytes + // Since the minimum constant bytes will be: 259 (tx data empty) + 31 (tx parameters) = 259 (0x103) will always take 2 bytes to express the lenght of the rlp + // Note that more than 2 bytes of list len is not supported, since it's constrained to 65535 + uint8 public constant INITIALIZE_TX_BRIDGE_LIST_LEN_LEN = 0xf9; + + // Tx parameters until the bridge address + bytes public constant INITIALIZE_TX_BRIDGE_PARAMS = hex"80808401c9c38094"; + + // RLP encoded metadata (non empty) + // TxData bytes: 164 bytes data ( signature 4 bytes + 5 parameters*32bytes + // (abi encoded metadata: 32 bytes position + 32 bytes len + 32 bytes position name + 32 bytes length name + 32 bytes position Symbol + 32 bytes length Symbol //+ 32 bytes decimal )) min 7*32 bytes = @@ -99,18 +109,28 @@ contract PolygonRollupBaseEtrog is // stringLen (0x0184 + nameLen padded to 32 bytes + symbol len padded to 32 bytes) + txData bytes = 32 bytes + txData bytes uint16 public constant INITIALIZE_TX_CONSTANT_BYTES = 32; - // First byte of the initialize bridge tx, indicates a list with a lengt of 2 bytes - // Since the minimum constant bytes will be: 388 (tx data min) + 32 (tx parameters) = 420 (0x1a4) will always take 2 bytes to express the lenght of the rlp - // Note that more than 2 bytes of list len is not supported, since it's constrained to 65535 - uint8 public constant INITIALIZE_TX_BRIDGE_LIST_LEN_LEN = 0xf9; - - // Tx parameters until the bridge address - bytes public constant INITIALIZE_TX_BRIDGE_PARAMS = hex"80808401c9c38094"; - // Tx parameters after the bridge address bytes public constant INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS = hex"80b9"; + // RLP empty metadata + + // TxData empty metadata bytes: 164 bytes data ( signature 4 bytes + 5 parameters*32bytes + + // (abi encoded metadata: 32 bytes position + 32 bytes len = 2*32 bytes = + // = 164 bytes + 64 bytes = 228 (0xe4) + + // Constant bytes empty metadata : 1 nonce "0x80" + 1 gasPrice "0x80" + 5 gasLimit "0x8401c9c380" (30M gas) + // + 21 to ("0x94" + bridgeAddress") + 1 value "0x80" + 1 stringLenLen "0xb8" (0xb7 + 1) + + // 1 stringLen (0xe4) + txData bytes = 31 bytes + txData bytes empty metadata 228 = 259 + uint16 public constant INITIALIZE_TX_CONSTANT_BYTES_EMPTY_METADATA = 31; + + uint8 public constant INITIALIZE_TX_DATA_LEN_EMPTY_METADATA = 228; // 0xe4 + + // Tx parameters after the bridge address + bytes + public constant INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS_EMPTY_METADATA = + hex"80b8"; + // Signature used to initialize the bridge // V parameter of the initialize signature @@ -850,21 +870,37 @@ contract PolygonRollupBaseEtrog is ) ); - // Do not support more than 65535 bytes - if (initializeBrigeData.length > type(uint16).max) { - revert HugeTokenMetadataNotSupported(); + bytes memory bytesToSign; + + if (_gasTokenMetadata.length == 0) { + bytesToSign = abi.encodePacked( + INITIALIZE_TX_BRIDGE_LIST_LEN_LEN, + uint16(initializeBrigeData.length) + + INITIALIZE_TX_CONSTANT_BYTES_EMPTY_METADATA, // do not support more than 2 bytes of length, intended to revert on overflow + INITIALIZE_TX_BRIDGE_PARAMS, + bridgeAddress, + INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS_EMPTY_METADATA, + INITIALIZE_TX_DATA_LEN_EMPTY_METADATA, + initializeBrigeData + ); + } else { + // Do not support more than 65535 bytes + if (initializeBrigeData.length > type(uint16).max) { + revert HugeTokenMetadataNotSupported(); + } + uint16 initializeBrigeDataLen = uint16(initializeBrigeData.length); + + bytesToSign = abi.encodePacked( + INITIALIZE_TX_BRIDGE_LIST_LEN_LEN, + uint16(initializeBrigeData.length) + + INITIALIZE_TX_CONSTANT_BYTES, // do not support more than 2 bytes of length, intended to revert on overflow + INITIALIZE_TX_BRIDGE_PARAMS, + bridgeAddress, + INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS, + initializeBrigeDataLen, + initializeBrigeData + ); } - uint16 initializeBrigeDataLen = uint16(initializeBrigeData.length); - - bytes memory bytesToSign = abi.encodePacked( - INITIALIZE_TX_BRIDGE_LIST_LEN_LEN, - uint16(initializeBrigeData.length) + INITIALIZE_TX_CONSTANT_BYTES, // do not support more than 2 bytes of length, intended to revert on overflow - INITIALIZE_TX_BRIDGE_PARAMS, - bridgeAddress, - INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS, - initializeBrigeDataLen, - initializeBrigeData - ); // Sanity check that the ecrecover will work // Should never happen that giving a valid signature, ecrecover "breaks" diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index abdb8e50a..0311ac117 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -78,6 +78,9 @@ describe("Polygon ZK-EVM TestnetV2", () => { const EMERGENCY_COUNCIL_ROLE = ethers.id("EMERGENCY_COUNCIL_ROLE"); const EMERGENCY_COUNCIL_ADMIN = ethers.id("EMERGENCY_COUNCIL_ADMIN"); + const SIGNATURE_BYTES = 32 + 32 + 1; + const EFFECTIVE_PERCENTAGE_BYTES = 1; + beforeEach("Deploy contract", async () => { upgrades.silenceWarnings(); @@ -456,6 +459,10 @@ describe("Polygon ZK-EVM TestnetV2", () => { const rawTx = processorUtils.customRawTxToRawTx(transaction); const tx = ethers.Transaction.from(rawTx); + + const rlpSignData = transaction.slice(0, -(SIGNATURE_BYTES * 2 + EFFECTIVE_PERCENTAGE_BYTES * 2)); + expect(rlpSignData).to.be.equal(tx.unsignedSerialized); + expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); expect(tx.value).to.be.equal(0); expect(tx.data).to.be.equal(encodedData); @@ -1115,6 +1122,10 @@ describe("Polygon ZK-EVM TestnetV2", () => { const rawTx = processorUtils.customRawTxToRawTx(transaction); const tx = ethers.Transaction.from(rawTx); + + const rlpSignData = transaction.slice(0, -(SIGNATURE_BYTES * 2 + EFFECTIVE_PERCENTAGE_BYTES * 2)); + expect(rlpSignData).to.be.equal(tx.unsignedSerialized); + expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); expect(tx.value).to.be.equal(0); expect(tx.data).to.be.equal(encodedData); @@ -1804,6 +1815,10 @@ describe("Polygon ZK-EVM TestnetV2", () => { const rawTx = processorUtils.customRawTxToRawTx(transaction); const tx = ethers.Transaction.from(rawTx); + + const rlpSignData = transaction.slice(0, -(SIGNATURE_BYTES * 2 + EFFECTIVE_PERCENTAGE_BYTES * 2)); + expect(rlpSignData).to.be.equal(tx.unsignedSerialized); + expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); expect(tx.value).to.be.equal(0); expect(tx.data).to.be.equal(encodedData); @@ -2350,6 +2365,10 @@ describe("Polygon ZK-EVM TestnetV2", () => { const rawTx = processorUtils.customRawTxToRawTx(transaction); const tx = ethers.Transaction.from(rawTx); + + const rlpSignData = transaction.slice(0, -(SIGNATURE_BYTES * 2 + EFFECTIVE_PERCENTAGE_BYTES * 2)); + expect(rlpSignData).to.be.equal(tx.unsignedSerialized); + expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); expect(tx.value).to.be.equal(0); expect(tx.data).to.be.equal(encodedData); From 7247b541629eaa587356f1cb90b9df41b93322cc Mon Sep 17 00:00:00 2001 From: invocamanman Date: Fri, 24 Nov 2023 16:07:46 +0100 Subject: [PATCH 100/230] contract typo --- contracts/v2/PolygonZkEVMBridgeV2.sol | 6 ++++-- .../{PolygonZkEVMVEtrog.sol => PolygonZkEVMEtrog.sol} | 2 +- deployment/v2/4_createRollup.ts | 2 +- test/contractsv2/PolygonRollupManager.test.ts | 8 ++++---- 4 files changed, 10 insertions(+), 8 deletions(-) rename contracts/v2/consensus/zkEVM/{PolygonZkEVMVEtrog.sol => PolygonZkEVMEtrog.sol} (96%) diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index 5668ff6b5..2b4f8316d 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -417,7 +417,8 @@ contract PolygonZkEVMBridgeV2 is * @param smtProofLocalExitRoot Smt proof to proof the leaf agains the exit root * @param smtProofRollupExitRoot Smt proof to proof the rollupLocalExitRoot agains the RollupExitRoot * @param globalIndex Global index is defined as: - * [0:190] not checked, [191] mainnet flag, rollupIndex [192, 223], localRootIndex[224, 255] + * | 191 bits | 1 bit | 32 bits | 32 bits | + * | 0 | mainnetFlag | rollupIndex | localRootIndex | * 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 @@ -573,7 +574,8 @@ contract PolygonZkEVMBridgeV2 is * @param smtProofLocalExitRoot Smt proof to proof the leaf agains the exit root * @param smtProofRollupExitRoot Smt proof to proof the rollupLocalExitRoot agains the RollupExitRoot * @param globalIndex Global index is defined as: - * [0:190] not checked, [191] mainnet flag, rollupIndex [192, 223], localRootIndex [224, 255] + * | 191 bits | 1 bit | 32 bits | 32 bits | + * | 0 | mainnetFlag | rollupIndex | localRootIndex | * 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 diff --git a/contracts/v2/consensus/zkEVM/PolygonZkEVMVEtrog.sol b/contracts/v2/consensus/zkEVM/PolygonZkEVMEtrog.sol similarity index 96% rename from contracts/v2/consensus/zkEVM/PolygonZkEVMVEtrog.sol rename to contracts/v2/consensus/zkEVM/PolygonZkEVMEtrog.sol index a477873da..402e604b4 100644 --- a/contracts/v2/consensus/zkEVM/PolygonZkEVMVEtrog.sol +++ b/contracts/v2/consensus/zkEVM/PolygonZkEVMEtrog.sol @@ -11,7 +11,7 @@ import "../../lib/PolygonRollupBaseEtrog.sol"; * 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. */ -contract PolygonZkEVMVEtrog is PolygonRollupBaseEtrog { +contract PolygonZkEVMEtrog is PolygonRollupBaseEtrog { /** * @param _globalExitRootManager Global exit root manager address * @param _pol POL token address diff --git a/deployment/v2/4_createRollup.ts b/deployment/v2/4_createRollup.ts index b1f372c4e..782803eb3 100644 --- a/deployment/v2/4_createRollup.ts +++ b/deployment/v2/4_createRollup.ts @@ -119,7 +119,7 @@ async function main() { await rollupManagerContract.grantRole(CREATE_ROLLUP_ROLE, deployer.address); // Create zkEVM implementation - const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMV2"); + const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMEtrog"); const PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy( deployOutput.polygonZkEVMGlobalExitRootAddress, deployOutput.polTokenAddress, diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index 0311ac117..8160384d9 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -8,7 +8,7 @@ import { PolygonZkEVMGlobalExitRootV2, PolygonZkEVMBridgeV2, PolygonZkEVMV2, - PolygonZkEVMVEtrog, + PolygonZkEVMEtrog, PolygonRollupBase, PolygonRollupBaseEtrog, TokenWrapped, @@ -916,7 +916,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { // In order to create a new rollup type, create an implementation of the contract // Create zkEVM implementation - const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMVEtrog"); + const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMEtrog"); const PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy( polygonZkEVMGlobalExitRoot.target, polTokenContract.target, @@ -1055,7 +1055,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { nonce: 1, }); - const newZkEVMContract = PolygonZKEVMV2Factory.attach(newZKEVMAddress) as PolygonZkEVMVEtrog; + const newZkEVMContract = PolygonZKEVMV2Factory.attach(newZKEVMAddress) as PolygonZkEVMEtrog; const newSequencedBatch = 1; await expect( @@ -2678,7 +2678,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { // In order to update a new rollup type, create an implementation of the contract // Create zkEVM implementation - const PolygonZKEVMEtrogFactory = await ethers.getContractFactory("PolygonZkEVMVEtrog"); + const PolygonZKEVMEtrogFactory = await ethers.getContractFactory("PolygonZkEVMEtrog"); const PolygonZKEVMEtrogContract = await PolygonZKEVMEtrogFactory.deploy( polygonZkEVMGlobalExitRoot.target, polTokenContract.target, From 8e0d098f39ad4b19c82eef42b417c3c44bc5e0c1 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 28 Nov 2023 16:50:39 +0100 Subject: [PATCH 101/230] update deployment scripts --- contracts/v2/PolygonRollupManager.sol | 26 ++++- deployment/v2/3_deployContracts.ts | 2 +- deployment/v2/4_createRollup.ts | 94 +++++++++++++++---- deployment/v2/README.md | 58 ++++++------ deployment/v2/deploy_parameters.json.example | 4 +- .../scripts/v2/deploy_parameters_docker.json | 1 + hardhat.config.ts | 10 ++ 7 files changed, 144 insertions(+), 51 deletions(-) diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index f87a22c9f..9f6458742 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -956,7 +956,7 @@ contract PolygonRollupManager is /** * @notice Verify and reward batches internal function - * @param rollup Rollup Data struct that will be used to the verification + * @param rollup Rollup Data storage pointer that will be used to the verification * @param pendingStateNum Init pending state, 0 if consolidated state is used * @param initNumBatch Batch which the aggregator starts the verification * @param finalNewBatch Last batch aggregator intends to verify @@ -1085,6 +1085,7 @@ contract PolygonRollupManager is /** * @notice Allows to consolidate any pending state that has already exceed the pendingStateTimeout * Can be called by the trusted aggregator, which can consolidate any state without the timeout restrictions + * @param rollupID Rollup identifier * @param pendingStateNum Pending state to consolidate */ function consolidatePendingState( @@ -1108,6 +1109,7 @@ contract PolygonRollupManager is /** * @notice Internal function to consolidate any pending state that has already exceed the pendingStateTimeout + * @param rollup Rollup data storage pointer * @param pendingStateNum Pending state to consolidate */ function _consolidatePendingState( @@ -1689,6 +1691,8 @@ contract PolygonRollupManager is /** * @notice Returns a boolean that indicates if the pendingStateNum is or not consolidable + * @param rollupID Rollup id + * @param pendingStateNum Pending state number to check * Note that his function does not check if the pending state currently exists, or if it's consolidated already */ function isPendingStateConsolidable( @@ -1704,6 +1708,8 @@ contract PolygonRollupManager is /** * @notice Returns a boolean that indicates if the pendingStateNum is or not consolidable + * @param rollup Rollup data storage pointer + * @param pendingStateNum Pending state number to check * Note that his function does not check if the pending state currently exists, or if it's consolidated already */ function _isPendingStateConsolidable( @@ -1747,6 +1753,7 @@ contract PolygonRollupManager is /** * @notice Function to calculate the input snark bytes + * @param rollupID Rollup id used to calculate the input snark bytes * @param initNumBatch Batch which the aggregator starts the verification * @param finalNewBatch Last batch aggregator intends to verify * @param newLocalExitRoot New local exit root once the batch is processed @@ -1774,6 +1781,7 @@ contract PolygonRollupManager is /** * @notice Function to calculate the input snark bytes + * @param rollup Rollup data storage pointer * @param initNumBatch Batch which the aggregator starts the verification * @param finalNewBatch Last batch aggregator intends to verify * @param newLocalExitRoot New local exit root once the batch is processed @@ -1826,6 +1834,10 @@ contract PolygonRollupManager is ); } + /** + * @notice Function to check if the state root is inside of the prime field + * @param newStateRoot New State root once the batch is processed + */ function _checkStateRootInsidePrime( uint256 newStateRoot ) internal pure returns (bool) { @@ -1843,7 +1855,9 @@ contract PolygonRollupManager is } /** - * @notice Get the last verified batch + * @notice Get rollup state root given a batch number + * @param rollupID Rollup identifier + * @param batchNum Batch number */ function getRollupBatchNumToStateRoot( uint32 rollupID, @@ -1853,7 +1867,9 @@ contract PolygonRollupManager is } /** - * @notice Get the last verified batch + * @notice Get rollup sequence batches struct given a batch number + * @param rollupID Rollup identifier + * @param batchNum Batch number */ function getRollupSequencedBatches( uint32 rollupID, @@ -1863,7 +1879,9 @@ contract PolygonRollupManager is } /** - * @notice Get the last verified batch + * @notice Get rollup sequence pending state struct given a batch number + * @param rollupID Rollup identifier + * @param batchNum Batch number */ function getRollupPendingStateTransitions( uint32 rollupID, diff --git a/deployment/v2/3_deployContracts.ts b/deployment/v2/3_deployContracts.ts index 320871119..4d7e50a7d 100644 --- a/deployment/v2/3_deployContracts.ts +++ b/deployment/v2/3_deployContracts.ts @@ -390,7 +390,7 @@ async function main() { expect(precalculateRollupManager).to.be.equal(await polygonZkEVMGlobalExitRoot.rollupManager()); } - // deploy Rollup Managdr + // deploy Rollup Manager console.log("\n#######################"); console.log("##### Deployment Polygon ZK-EVM #####"); console.log("#######################"); diff --git a/deployment/v2/4_createRollup.ts b/deployment/v2/4_createRollup.ts index 782803eb3..b604be52b 100644 --- a/deployment/v2/4_createRollup.ts +++ b/deployment/v2/4_createRollup.ts @@ -19,7 +19,7 @@ const genesis = require("./genesis.json"); const deployOutput = require("./deploy_output.json"); import "../helpers/utils"; -import {PolygonRollupManager, PolygonZkEVMV2} from "../../typechain-types"; +import {PolygonRollupManager, PolygonZkEVMV2, PolygonZkEVMBridgeV2} from "../../typechain-types"; async function main() { /* @@ -35,6 +35,7 @@ async function main() { "chainID", "adminZkEVM", "forkID", + "consensusContract", ]; for (const parameterName of mandatoryDeploymentParameters) { @@ -43,8 +44,28 @@ async function main() { } } - const {realVerifier, trustedSequencerURL, networkName, description, trustedSequencer, chainID, adminZkEVM, forkID} = - deployParameters; + const { + realVerifier, + trustedSequencerURL, + networkName, + description, + trustedSequencer, + chainID, + adminZkEVM, + forkID, + consensusContract, + } = deployParameters; + + const supportedConensus = [ + "PolygonZkEVMEtrog", + "PolygonZkEVMV2", + "PolygonDataComittee", + "PolygonDataComitteeEtrog", + ]; + + if (!supportedConensus.includes(consensusContract)) { + throw new Error(`Consensus contract not supported, supported contracts are: ${supportedConensus}`); + } // Load provider let currentProvider = ethers.provider; @@ -115,24 +136,28 @@ async function main() { const ADD_ROLLUP_TYPE_ROLE = ethers.id("ADD_ROLLUP_TYPE_ROLE"); const CREATE_ROLLUP_ROLE = ethers.id("CREATE_ROLLUP_ROLE"); - await rollupManagerContract.grantRole(ADD_ROLLUP_TYPE_ROLE, deployer.address); - await rollupManagerContract.grantRole(CREATE_ROLLUP_ROLE, deployer.address); + // Check role: + if ((await rollupManagerContract.hasRole(ADD_ROLLUP_TYPE_ROLE, deployer.address)) == false) + await rollupManagerContract.grantRole(ADD_ROLLUP_TYPE_ROLE, deployer.address); + + if ((await rollupManagerContract.hasRole(CREATE_ROLLUP_ROLE, deployer.address)) == false) + await rollupManagerContract.grantRole(CREATE_ROLLUP_ROLE, deployer.address); - // Create zkEVM implementation - const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMEtrog"); - const PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy( + // Create consensus implementation + const PolygonconsensusFactory = (await ethers.getContractFactory(consensusContract)) as any; + const PolygonconsensusContract = await PolygonconsensusFactory.deploy( deployOutput.polygonZkEVMGlobalExitRootAddress, deployOutput.polTokenAddress, deployOutput.polygonZkEVMBridgeAddress, deployOutput.polygonRollupManager ); - await PolygonZKEVMV2Contract.waitForDeployment(); + await PolygonconsensusContract.waitForDeployment(); // Add a new rollup type with timelock const rollupCompatibilityID = 0; await ( await rollupManagerContract.addNewRollupType( - PolygonZKEVMV2Contract.target, + PolygonconsensusContract.target, verifierContract.target, forkID, rollupCompatibilityID, @@ -147,9 +172,30 @@ async function main() { let gasTokenAddress, gasTokenNetwork, gasTokenMetadata; - if (deployParameters.gasTokenAddress && deployParameters.gasTokenAddress != "") { - gasTokenAddress = deployParameters.gasTokenAddress; - gasTokenNetwork = deployParameters.gasTokenNetwork; + if ( + deployParameters.gasTokenAddress && + deployParameters.gasTokenAddress != "" && + deployParameters.gasTokenAddress != ethers.ZeroAddress + ) { + // Get bridge instance + const bridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2", deployer); + const polygonZkEVMBridgeContract = bridgeFactory.attach( + deployOutput.polygonZkEVMBridgeAddress + ) as PolygonZkEVMBridgeV2; + + // Get token metadata + gasTokenMetadata = await polygonZkEVMBridgeContract.getTokenMetadata(deployParameters.gasTokenAddress); + + const wrappedData = await polygonZkEVMBridgeContract.wrappedTokenToTokenInfo(deployParameters.gasTokenAddress); + if (wrappedData.originNetwork != 0n) { + // Wrapped token + gasTokenAddress = wrappedData.originTokenAddress; + gasTokenNetwork = wrappedData.originNetwork; + } else { + // Mainnet token + gasTokenAddress = deployParameters.gasTokenAddress; + gasTokenNetwork = 0n; + } } else { gasTokenAddress = ethers.ZeroAddress; gasTokenNetwork = 0; @@ -172,22 +218,36 @@ async function main() { networkName ); - const receipt = await txDeployRollup.wait(); + const receipt = (await txDeployRollup.wait()) as any; const timestampReceipt = (await receipt?.getBlock())?.timestamp; const rollupID = await rollupManagerContract.chainIDToRollupID(chainID); + console.log("#######################\n"); console.log("Created new Rollup:", newZKEVMAddress); // Assert admin address expect(await upgrades.erc1967.getAdminAddress(newZKEVMAddress)).to.be.equal(rollupManagerContract.target); - expect(await upgrades.erc1967.getImplementationAddress(newZKEVMAddress)).to.be.equal(PolygonZKEVMV2Contract.target); + expect(await upgrades.erc1967.getImplementationAddress(newZKEVMAddress)).to.be.equal( + PolygonconsensusContract.target + ); + + // Search added global exit root on the logs + let globalExitRoot; + for (const log of receipt?.logs) { + if (log.address == newZKEVMAddress) { + const parsedLog = PolygonconsensusFactory.interface.parseLog(log); + if (parsedLog != null && parsedLog.name == "InitialSequenceBatches") { + globalExitRoot = parsedLog.args.lastGlobalExitRoot; + } + } + } deployOutput.genesis = genesis.root; deployOutput.newZKEVMAddress = newZKEVMAddress; deployOutput.verifierAddress = verifierContract.target; // Add the first batch of the created rollup - const newZKEVMContract = (await PolygonZKEVMV2Factory.attach(newZKEVMAddress)) as PolygonZkEVMV2; + const newZKEVMContract = (await PolygonconsensusFactory.attach(newZKEVMAddress)) as PolygonZkEVMV2; const batchData = { transactions: await newZKEVMContract.generateInitializeTransaction( rollupID, @@ -195,7 +255,7 @@ async function main() { gasTokenNetwork, gasTokenMetadata as any ), - globalExitRoot: ethers.ZeroHash, + globalExitRoot: globalExitRoot, timestamp: timestampReceipt, sequencer: trustedSequencer, }; diff --git a/deployment/v2/README.md b/deployment/v2/README.md index 19bf1191a..f23ca21c3 100644 --- a/deployment/v2/README.md +++ b/deployment/v2/README.md @@ -1,7 +1,7 @@ ## Requirements -- node version: 14.x -- npm version: 7.x +- node version: 14.x +- npm version: 7.x ## Deployment @@ -55,34 +55,38 @@ A new folder will be created witth the following name `deployments/${network}_$( ## deploy-parameters.json -- `realVerifier`: bool, Indicates whether deploy a real verifier or not -- `trustedSequencerURL`: string, trustedSequencer URL -- `networkName`: string, networkName -- `version`:string, will just be emitted at initialization of the contract, usefull just for synchronizer -- `trustedSequencer`: address, trusted sequencer addresss -- `chainID`: uint64, chainID of the zkEVM -- `trustedAggregator`:address, Trusted aggregator address -- `trustedAggregatorTimeout`: uint64, If a sequence is not verified in this timeout everyone can verify it -- `pendingStateTimeout`: uint64, Once a pending state exceeds this timeout it can be consolidated -- `forkID`: uint64, Fork ID of the zkEVM, indicates the prover (zkROM/executor) version -- `admin`:address, Admin address, can adjust PolygonZkEVM parameters or stop the emergency state -- `zkEVMOwner`: address, Able to put the PolygonZkEVM into emergency state (kill switch) -- `timelockAddress`: address, Timelock owner address, able to send start an upgradability process via timelock -- `minDelayTimelock`: number, Minimum timelock delay, -- `salt`: bytes32, Salt used in `PolygonZkEVMDeployer` to deploy deterministic contracts, such as the PolygonZkEVMBridge -- `initialZkEVMDeployerOwner`: address, Initial owner of the `PolygonZkEVMDeployer` -- `maticTokenAddress`: address, Matic token address, only if deploy on testnet can be left blank and will fullfilled by the scripts. -- `zkEVMDeployerAddress`: address, Address of the `PolygonZkEVMDeployer`. Can be left blank, will be fullfilled automatically with the `deploy:deployer:ZkEVM:goerli` script. +- `timelockAdminAddress`: address, Timelock owner address, able to send start an upgradability process via timelock +- `minDelayTimelock`: number, Minimum timelock delay, +- `salt`: bytes32, Salt used in `PolygonZkEVMDeployer` to deploy deterministic contracts, such as the PolygonZkEVMBridge +- `initialZkEVMDeployerOwner`: address, Initial owner of the `PolygonZkEVMDeployer` +- `admin`:address, Admin address, can adjust RollupManager parameters or stop the emergency state +- `trustedAggregator`:address, Trusted aggregator address +- `trustedAggregatorTimeout`: uint64, If a sequence is not verified in this timeout everyone can verify it +- `pendingStateTimeout`: uint64, Once a pending state exceeds this timeout it can be consolidated +- `emergencyCouncilAddress`:address, Emergency council addres + +- `realVerifier`: bool, Indicates whether deploy a real verifier or not for the new created +- `trustedSequencerURL`: string, trustedSequencer URL +- `networkName`: string, networkName +- `description`:string, Description of the new rollup type +- `trustedSequencer`: address, trusted sequencer addresss +- `chainID`: uint64, chainID of the new rollup +- `admin`:address, Admin address, can adjust Rollup parameters +- `forkID`: uint64, Fork ID of the new rollup, indicates the prover (zkROM/executor) version +- `consensusContract`: string, Consensus contract name of the new rollup deployed, current options are: "PolygonZkEVMEtrog","PolygonZkEVMV2","PolygonDataComittee", "PolygonDataComitteeEtrog", +- `gasTokenAddress`:address, Gas token address, empty or address(0) for ether +- `polTokenAddress`: address, Matic token address, only if deploy on testnet can be left blank and will fullfilled by the scripts. +- `zkEVMDeployerAddress`: address, Address of the `PolygonZkEVMDeployer`. Can be left blank, will be fullfilled automatically with the `deploy:deployer:ZkEVM:goerli` script. ### Optional Parameters -- `deployerPvtKey`: string, pvtKey of the deployer, overrides the address in `MNEMONIC` of `.env` if exist -- `maxFeePerGas`:string, Set `maxFeePerGas`, must define aswell `maxPriorityFeePerGas` to use it -- `maxPriorityFeePerGas`:string, Set `maxPriorityFeePerGas`, must define aswell `maxFeePerGas` to use it -- `multiplierGas`: number, Gas multiplier with 3 decimals. If `maxFeePerGas` and `maxPriorityFeePerGas` are set, this will not take effect +- `deployerPvtKey`: string, pvtKey of the deployer, overrides the address in `MNEMONIC` of `.env` if exist +- `maxFeePerGas`:string, Set `maxFeePerGas`, must define aswell `maxPriorityFeePerGas` to use it +- `maxPriorityFeePerGas`:string, Set `maxPriorityFeePerGas`, must define aswell `maxFeePerGas` to use it +- `multiplierGas`: number, Gas multiplier with 3 decimals. If `maxFeePerGas` and `maxPriorityFeePerGas` are set, this will not take effect ## Notes -- Since there are deterministic address you cannot deploy twice on the same network using the same `salt` and `initialZkEVMDeployerOwner`. Changing one of them is enough to make a new deployment. -- It's mandatory to delete the `.openzeppelin` upgradebility information in order to make a new deployment -- `genesis.json` has been generated using the tool: `1_createGenesis`, this script depends on the `deploy_parameters` aswell. +- Since there are deterministic address you cannot deploy twice on the same network using the same `salt` and `initialZkEVMDeployerOwner`. Changing one of them is enough to make a new deployment. +- It's mandatory to delete the `.openzeppelin` upgradebility information in order to make a new deployment +- `genesis.json` has been generated using the tool: `1_createGenesis`, this script depends on the `deploy_parameters` aswell. diff --git a/deployment/v2/deploy_parameters.json.example b/deployment/v2/deploy_parameters.json.example index 522ff3b2e..b2f242a80 100644 --- a/deployment/v2/deploy_parameters.json.example +++ b/deployment/v2/deploy_parameters.json.example @@ -16,10 +16,10 @@ "chainID": 1001, "adminZkEVM":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", "forkID": 1, + "consensusContract": "PolygonZkEVMEtrog", + "gasTokenAddress":"", "polTokenAddress":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", "zkEVMDeployerAddress":"", - "gasTokenAddress":"", - "gasTokenNetwork":0, "deployerPvtKey": "", "maxFeePerGas":"", "maxPriorityFeePerGas":"", diff --git a/docker/scripts/v2/deploy_parameters_docker.json b/docker/scripts/v2/deploy_parameters_docker.json index 0eff58791..3ec40a7c6 100644 --- a/docker/scripts/v2/deploy_parameters_docker.json +++ b/docker/scripts/v2/deploy_parameters_docker.json @@ -16,6 +16,7 @@ "chainID": 1001, "adminZkEVM": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "forkID": 5, + "consensusContract": "PolygonZkEVMEtrog", "polTokenAddress": "", "zkEVMDeployerAddress": "", "gasTokenAddress": "", diff --git a/hardhat.config.ts b/hardhat.config.ts index 01386d93c..acf6360a0 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -105,6 +105,16 @@ const config: HardhatUserConfig = { evmVersion: "shanghai", }, }, + "contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol": { + version: "0.8.20", + settings: { + optimizer: { + enabled: true, + runs: 99, + }, + evmVersion: "shanghai", + }, // try yul optimizer + }, "contracts/v2/mocks/PolygonRollupManagerMock.sol": { version: "0.8.20", settings: { From 0141e5b38937cdbfa77e34c5811d39d026a105d4 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 28 Nov 2023 19:53:12 +0100 Subject: [PATCH 102/230] add compile contract at beggining of scripts --- package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index d76039bf8..b13a0dd5e 100644 --- a/package.json +++ b/package.json @@ -81,10 +81,10 @@ "coverage": "npx hardhat coverage --testfiles \"test/contractsv2/*.ts\"", "gas:report": "REPORT_GAS=true npx hardhat test", "gas:report:file": "rm -f .openzeppelin/unknown-31337.json && REPORT_GAS=true REPORT_GAS_FILE=true npx hardhat test", - "deploy:v2:localhost": "rm -f .openzeppelin/unknown-31337.json && npx ts-node deployment/v2/1_createGenesis.ts --test && npx hardhat run deployment/v2/2_deployPolygonZKEVMDeployer.ts --network localhost && npx hardhat run deployment/v2/3_deployContracts.ts --network localhost && npx hardhat run deployment/v2/4_createRollup.ts --network localhost", - "deploy:testnet:v2:localhost": "rm -f deployment/v2/deploy_ongoing.json && npm run prepare:testnet:ZkEVM:localhost && npm run deploy:v2:localhost", - "deploy:v2:goerli": "npx ts-node deployment/v2/1_createGenesis.ts && npx hardhat run deployment/v2/2_deployPolygonZKEVMDeployer.ts --network goerli && npx hardhat run deployment/v2/3_deployContracts.ts --network goerli && npx hardhat run deployment/v2/4_createRollup.ts --network goerli && npm run saveDeployment:goerli", - "deploy:testnet:v2:goerli": "rm -f deployment/v2/deploy_ongoing.json && npm run prepare:testnet:ZkEVM:goerli && npm run deploy:v2:goerli", + "deploy:v2:localhost": "npx hardhat compile && rm -f .openzeppelin/unknown-31337.json && npx ts-node deployment/v2/1_createGenesis.ts --test && npx hardhat run deployment/v2/2_deployPolygonZKEVMDeployer.ts --network localhost && npx hardhat run deployment/v2/3_deployContracts.ts --network localhost && npx hardhat run deployment/v2/4_createRollup.ts --network localhost", + "deploy:testnet:v2:localhost": "npx hardhat compile && rm -f deployment/v2/deploy_ongoing.json && npm run prepare:testnet:ZkEVM:localhost && npm run deploy:v2:localhost", + "deploy:v2:goerli": "npx hardhat compile && npx ts-node deployment/v2/1_createGenesis.ts && npx hardhat run deployment/v2/2_deployPolygonZKEVMDeployer.ts --network goerli && npx hardhat run deployment/v2/3_deployContracts.ts --network goerli && npx hardhat run deployment/v2/4_createRollup.ts --network goerli && npm run saveDeployment:goerli", + "deploy:testnet:v2:goerli": "npx hardhat compile && rm -f deployment/v2/deploy_ongoing.json && npm run prepare:testnet:ZkEVM:goerli && npm run deploy:v2:goerli", "verify:v2:goerli": "npx hardhat run deployment/v2/verifyContracts.js --network goerli" } } From 0996d5c2922f6ba8dcf85bcf7eb90117b5a03b6a Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 29 Nov 2023 01:36:30 +0100 Subject: [PATCH 103/230] fix deployment, add sepolia --- deployment/v2/4_createRollup.ts | 2 +- hardhat.config.ts | 12 ++++++++++++ package.json | 7 ++++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/deployment/v2/4_createRollup.ts b/deployment/v2/4_createRollup.ts index b604be52b..b4b94c767 100644 --- a/deployment/v2/4_createRollup.ts +++ b/deployment/v2/4_createRollup.ts @@ -144,7 +144,7 @@ async function main() { await rollupManagerContract.grantRole(CREATE_ROLLUP_ROLE, deployer.address); // Create consensus implementation - const PolygonconsensusFactory = (await ethers.getContractFactory(consensusContract)) as any; + const PolygonconsensusFactory = (await ethers.getContractFactory(consensusContract, deployer)) as any; const PolygonconsensusContract = await PolygonconsensusFactory.deploy( deployOutput.polygonZkEVMGlobalExitRootAddress, deployOutput.polTokenAddress, diff --git a/hardhat.config.ts b/hardhat.config.ts index acf6360a0..3fc3f51ca 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -183,6 +183,17 @@ const config: HardhatUserConfig = { count: 20, }, }, + sepolia: { + url: process.env.SEPOLIA_PROVIDER + ? process.env.SEPOLIA_PROVIDER + : `https://sepolia.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, + }, localhost: { url: "http://127.0.0.1:8545", accounts: { @@ -232,6 +243,7 @@ const config: HardhatUserConfig = { polygonZKEVMTestnet: `${process.env.ETHERSCAN_ZKEVM_API_KEY}`, polygonZKEVMMainnet: `${process.env.ETHERSCAN_ZKEVM_API_KEY}`, goerli: `${process.env.ETHERSCAN_API_KEY}`, + sepolia: `${process.env.ETHERSCAN_API_KEY}`, mainnet: `${process.env.ETHERSCAN_API_KEY}`, }, customChains: [ diff --git a/package.json b/package.json index b13a0dd5e..5e4611236 100644 --- a/package.json +++ b/package.json @@ -85,6 +85,11 @@ "deploy:testnet:v2:localhost": "npx hardhat compile && rm -f deployment/v2/deploy_ongoing.json && npm run prepare:testnet:ZkEVM:localhost && npm run deploy:v2:localhost", "deploy:v2:goerli": "npx hardhat compile && npx ts-node deployment/v2/1_createGenesis.ts && npx hardhat run deployment/v2/2_deployPolygonZKEVMDeployer.ts --network goerli && npx hardhat run deployment/v2/3_deployContracts.ts --network goerli && npx hardhat run deployment/v2/4_createRollup.ts --network goerli && npm run saveDeployment:goerli", "deploy:testnet:v2:goerli": "npx hardhat compile && rm -f deployment/v2/deploy_ongoing.json && npm run prepare:testnet:ZkEVM:goerli && npm run deploy:v2:goerli", - "verify:v2:goerli": "npx hardhat run deployment/v2/verifyContracts.js --network goerli" + "verify:v2:goerli": "npx hardhat run deployment/v2/verifyContracts.js --network goerli", + "prepare:testnet:ZkEVM:sepolia": "npx hardhat run deployment/testnet/prepareTestnet.ts --network sepolia", + "deploy:v2:sepolia": "npx hardhat compile && npx ts-node deployment/v2/1_createGenesis.ts && npx hardhat run deployment/v2/2_deployPolygonZKEVMDeployer.ts --network sepolia && npx hardhat run deployment/v2/3_deployContracts.ts --network sepolia && npx hardhat run deployment/v2/4_createRollup.ts --network sepolia && npm run saveDeployment:sepolia", + "deploy:testnet:v2:sepolia": "npx hardhat compile && rm -f deployment/v2/deploy_ongoing.json && npm run prepare:testnet:ZkEVM:sepolia && npm run deploy:v2:sepolia", + "verify:v2:sepolia": "npx hardhat run deployment/v2/verifyContracts.js --network sepolia", + "saveDeployment:sepolia": "mkdir -p deployments/sepolia_$(date +%s) && cp -r deployment/v2/deploy_*.json deployments/sepolia_$(date +%s) && cp .openzeppelin/sepolia.json deployments/sepolia_$(date +%s) && cp deployment/v2/genesis.json deployments/sepolia_$(date +%s)" } } From b041b92884085690b1ed105a49ad8c312c851931 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 29 Nov 2023 01:56:57 +0100 Subject: [PATCH 104/230] verify fixes --- deployment/v2/verifyContracts.js | 4 ++-- hardhat.config.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/deployment/v2/verifyContracts.js b/deployment/v2/verifyContracts.js index 2112c6454..bb6deeff3 100644 --- a/deployment/v2/verifyContracts.js +++ b/deployment/v2/verifyContracts.js @@ -97,7 +97,7 @@ async function main() { }, ); } catch (error) { - expect(error.message.toLowerCase().includes('proxyadmin')).to.be.equal(true); + //expect(error.message.toLowerCase().includes('proxyadmin')).to.be.equal(true); } // verify global exit root address @@ -113,7 +113,7 @@ async function main() { }, ); } catch (error) { - expect(error.message.toLowerCase().includes('proxyadmin')).to.be.equal(true); + //expect(error.message.toLowerCase().includes('proxyadmin')).to.be.equal(true); } try { diff --git a/hardhat.config.ts b/hardhat.config.ts index 3fc3f51ca..63482fe44 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -131,7 +131,7 @@ const config: HardhatUserConfig = { settings: { optimizer: { enabled: true, - runs: 10, + runs: 99, }, evmVersion: "shanghai", }, // try yul optimizer From 8ddd159e3705b5a6aad919664e9253c8c99f587f Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 29 Nov 2023 17:13:35 +0100 Subject: [PATCH 105/230] add validium support to create contracts --- .../dataComittee/PolygonDataComittee.sol | 1 + deployment/v2/4_createRollup.ts | 44 ++++++++++++++++--- 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol b/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol index bab7adc8c..1fb60cd8e 100644 --- a/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol +++ b/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol @@ -49,6 +49,7 @@ contract PolygonDataComittee is PolygonRollupBase, IPolygonDataComittee { * @param _pol POL token address * @param _bridgeAddress Bridge address * @param _rollupManager Global exit root manager address + * @param _dataCommittee Data committee */ constructor( IPolygonZkEVMGlobalExitRoot _globalExitRootManager, diff --git a/deployment/v2/4_createRollup.ts b/deployment/v2/4_createRollup.ts index b4b94c767..04a497bb1 100644 --- a/deployment/v2/4_createRollup.ts +++ b/deployment/v2/4_createRollup.ts @@ -22,6 +22,8 @@ import "../helpers/utils"; import {PolygonRollupManager, PolygonZkEVMV2, PolygonZkEVMBridgeV2} from "../../typechain-types"; async function main() { + const attemptsDeployProxy = 20; + /* * Check deploy parameters * Check that every necessary parameter is fullfilled @@ -145,12 +147,42 @@ async function main() { // Create consensus implementation const PolygonconsensusFactory = (await ethers.getContractFactory(consensusContract, deployer)) as any; - const PolygonconsensusContract = await PolygonconsensusFactory.deploy( - deployOutput.polygonZkEVMGlobalExitRootAddress, - deployOutput.polTokenAddress, - deployOutput.polygonZkEVMBridgeAddress, - deployOutput.polygonRollupManager - ); + let PolygonconsensusContract; + if (consensusContract.includes("DataComittee")) { + // deploy data commitee + const PolygonDataComittee = (await ethers.getContractFactory("CDKDataCommittee", deployer)) as any; + let polygonDataComitteeContract; + + for (let i = 0; i < attemptsDeployProxy; i++) { + try { + polygonDataComitteeContract = await upgrades.deployProxy(PolygonDataComittee, []); + break; + } catch (error: any) { + console.log(`attempt ${i}`); + console.log("upgrades.deployProxy of polygonDataComitteeContract ", error.message); + } + // reach limits of attempts + if (i + 1 === attemptsDeployProxy) { + throw new Error("polygonDataComitteeContract contract has not been deployed"); + } + } + deployOutput.polygonDataComitteeContract = polygonDataComitteeContract?.target; + + PolygonconsensusContract = await PolygonconsensusFactory.deploy( + deployOutput.polygonZkEVMGlobalExitRootAddress, + deployOutput.polTokenAddress, + deployOutput.polygonZkEVMBridgeAddress, + deployOutput.polygonRollupManager, + polygonDataComitteeContract?.target + ); + } else { + PolygonconsensusContract = await PolygonconsensusFactory.deploy( + deployOutput.polygonZkEVMGlobalExitRootAddress, + deployOutput.polTokenAddress, + deployOutput.polygonZkEVMBridgeAddress, + deployOutput.polygonRollupManager + ); + } await PolygonconsensusContract.waitForDeployment(); // Add a new rollup type with timelock From 816b2291ebbd6605feab5adbe5af90a182e5eef5 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 29 Nov 2023 18:54:19 +0100 Subject: [PATCH 106/230] data commitee should be updatable by admind --- .../dataComittee/PolygonDataComittee.sol | 39 ++++++++++++------- .../dataComittee/PolygonDataComitteeEtrog.sol | 38 ++++++++++++------ deployment/v2/4_createRollup.ts | 30 +++++++------- 3 files changed, 66 insertions(+), 41 deletions(-) diff --git a/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol b/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol index 1fb60cd8e..6bacec12b 100644 --- a/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol +++ b/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol @@ -33,12 +33,17 @@ contract PolygonDataComittee is PolygonRollupBase, IPolygonDataComittee { } // CDK Data Committee Address - ICDKDataCommittee public immutable dataCommittee; + ICDKDataCommittee public dataCommittee; // Indicates if sequence with data avialability is allowed // This allow the sequencer to post the data and skip the Data comittee bool public isSequenceWithDataAvailabilityAllowed; + /** + * @dev Emitted when the admin updates the data committee + */ + event SetDataCommittee(address newDataCommittee); + /** * @dev Emitted when switch the ability to sequence with data availability */ @@ -49,14 +54,12 @@ contract PolygonDataComittee is PolygonRollupBase, IPolygonDataComittee { * @param _pol POL token address * @param _bridgeAddress Bridge address * @param _rollupManager Global exit root manager address - * @param _dataCommittee Data committee */ constructor( IPolygonZkEVMGlobalExitRoot _globalExitRootManager, IERC20Upgradeable _pol, IPolygonZkEVMBridgeV2 _bridgeAddress, - PolygonRollupManager _rollupManager, - ICDKDataCommittee _dataCommittee + PolygonRollupManager _rollupManager ) PolygonRollupBase( _globalExitRootManager, @@ -64,9 +67,7 @@ contract PolygonDataComittee is PolygonRollupBase, IPolygonDataComittee { _bridgeAddress, _rollupManager ) - { - dataCommittee = _dataCommittee; - } + {} ///////////////////////////////////// // Sequence/Verify batches functions @@ -194,12 +195,6 @@ contract PolygonDataComittee is PolygonRollupBase, IPolygonDataComittee { uint256 nonForcedBatchesSequenced = batchesNum; - // Validate that the data committee has signed the accInputHash for this sequence - dataCommittee.verifySignatures( - currentAccInputHash, - dataAvailabilityMessage - ); - // Check if there has been forced batches if (currentLastForceBatchSequenced != initLastForceBatchSequenced) { uint64 forcedBatchesSequenced = currentLastForceBatchSequenced - @@ -232,6 +227,12 @@ contract PolygonDataComittee is PolygonRollupBase, IPolygonDataComittee { currentAccInputHash ); + // Validate that the data committee has signed the accInputHash for this sequence + dataCommittee.verifySignatures( + currentAccInputHash, + dataAvailabilityMessage + ); + emit SequenceBatches(currentBatchSequenced); } @@ -239,6 +240,18 @@ contract PolygonDataComittee is PolygonRollupBase, IPolygonDataComittee { // admin functions ////////////////// + /** + * @notice Allow the admin to set a new data committee + * @param newDataCommittee Address of the new data committee + */ + function setDataCommittee( + ICDKDataCommittee newDataCommittee + ) external onlyAdmin { + dataCommittee = newDataCommittee; + + emit SetDataCommittee(address(newDataCommittee)); + } + /** * @notice Allow the admin to turn on the force batches * This action is not reversible diff --git a/contracts/v2/consensus/dataComittee/PolygonDataComitteeEtrog.sol b/contracts/v2/consensus/dataComittee/PolygonDataComitteeEtrog.sol index fd0ce3085..465a4e7c6 100644 --- a/contracts/v2/consensus/dataComittee/PolygonDataComitteeEtrog.sol +++ b/contracts/v2/consensus/dataComittee/PolygonDataComitteeEtrog.sol @@ -36,12 +36,17 @@ contract PolygonDataComitteeEtrog is } // CDK Data Committee Address - ICDKDataCommittee public immutable dataCommittee; + ICDKDataCommittee public dataCommittee; // Indicates if sequence with data avialability is allowed // This allow the sequencer to post the data and skip the Data comittee bool public isSequenceWithDataAvailabilityAllowed; + /** + * @dev Emitted when the admin updates the data committee + */ + event SetDataCommittee(address newDataCommittee); + /** * @dev Emitted when switch the ability to sequence with data availability */ @@ -57,8 +62,7 @@ contract PolygonDataComitteeEtrog is IPolygonZkEVMGlobalExitRootV2 _globalExitRootManager, IERC20Upgradeable _pol, IPolygonZkEVMBridgeV2 _bridgeAddress, - PolygonRollupManager _rollupManager, - ICDKDataCommittee _dataCommittee + PolygonRollupManager _rollupManager ) PolygonRollupBaseEtrog( _globalExitRootManager, @@ -66,9 +70,7 @@ contract PolygonDataComitteeEtrog is _bridgeAddress, _rollupManager ) - { - dataCommittee = _dataCommittee; - } + {} ///////////////////////////////////// // Sequence/Verify batches functions @@ -187,12 +189,6 @@ contract PolygonDataComitteeEtrog is uint256 nonForcedBatchesSequenced = batchesNum; - // Validate that the data committee has signed the accInputHash for this sequence - dataCommittee.verifySignatures( - currentAccInputHash, - dataAvailabilityMessage - ); - // Check if there has been forced batches if (currentLastForceBatchSequenced != initLastForceBatchSequenced) { uint64 forcedBatchesSequenced = currentLastForceBatchSequenced - @@ -222,6 +218,12 @@ contract PolygonDataComitteeEtrog is currentAccInputHash ); + // Validate that the data committee has signed the accInputHash for this sequence + dataCommittee.verifySignatures( + currentAccInputHash, + dataAvailabilityMessage + ); + emit SequenceBatches(currentBatchSequenced, l1InfoRoot); } @@ -229,6 +231,18 @@ contract PolygonDataComitteeEtrog is // admin functions ////////////////// + /** + * @notice Allow the admin to set a new data committee + * @param newDataCommittee Address of the new data committee + */ + function setDataCommittee( + ICDKDataCommittee newDataCommittee + ) external onlyAdmin { + dataCommittee = newDataCommittee; + + emit SetDataCommittee(address(newDataCommittee)); + } + /** * @notice Allow the admin to turn on the force batches * This action is not reversible diff --git a/deployment/v2/4_createRollup.ts b/deployment/v2/4_createRollup.ts index 04a497bb1..f2c4b773b 100644 --- a/deployment/v2/4_createRollup.ts +++ b/deployment/v2/4_createRollup.ts @@ -148,6 +148,15 @@ async function main() { // Create consensus implementation const PolygonconsensusFactory = (await ethers.getContractFactory(consensusContract, deployer)) as any; let PolygonconsensusContract; + + PolygonconsensusContract = await PolygonconsensusFactory.deploy( + deployOutput.polygonZkEVMGlobalExitRootAddress, + deployOutput.polTokenAddress, + deployOutput.polygonZkEVMBridgeAddress, + deployOutput.polygonRollupManager + ); + await PolygonconsensusContract.waitForDeployment(); + if (consensusContract.includes("DataComittee")) { // deploy data commitee const PolygonDataComittee = (await ethers.getContractFactory("CDKDataCommittee", deployer)) as any; @@ -166,24 +175,13 @@ async function main() { throw new Error("polygonDataComitteeContract contract has not been deployed"); } } - deployOutput.polygonDataComitteeContract = polygonDataComitteeContract?.target; + // add data commitee to the consensus contract + if ((await PolygonconsensusContract.admin()) == deployer.address) { + await (await PolygonconsensusContract.setDataCommittee(polygonDataComitteeContract?.target)).wait(); + } - PolygonconsensusContract = await PolygonconsensusFactory.deploy( - deployOutput.polygonZkEVMGlobalExitRootAddress, - deployOutput.polTokenAddress, - deployOutput.polygonZkEVMBridgeAddress, - deployOutput.polygonRollupManager, - polygonDataComitteeContract?.target - ); - } else { - PolygonconsensusContract = await PolygonconsensusFactory.deploy( - deployOutput.polygonZkEVMGlobalExitRootAddress, - deployOutput.polTokenAddress, - deployOutput.polygonZkEVMBridgeAddress, - deployOutput.polygonRollupManager - ); + deployOutput.polygonDataComitteeContract = polygonDataComitteeContract?.target; } - await PolygonconsensusContract.waitForDeployment(); // Add a new rollup type with timelock const rollupCompatibilityID = 0; From eb06bc9b36c014f043fa61cb3e95584732c3bf4b Mon Sep 17 00:00:00 2001 From: invocamanman Date: Thu, 30 Nov 2023 15:45:24 +0100 Subject: [PATCH 107/230] update scripts --- deployment/v2/4_createRollup.ts | 66 ++++++++++--------- deployment/v2/README.md | 10 +-- deployment/v2/create_rollup_parameters.json | 16 +++++ .../v2/create_rollup_parameters.json.example | 16 +++++ deployment/v2/deploy_parameters.json.example | 10 --- .../v2/create_rollup_parameters_docker.json | 16 +++++ docker/scripts/v2/deploy-dockerv2.sh | 2 + package.json | 6 +- 8 files changed, 95 insertions(+), 47 deletions(-) create mode 100644 deployment/v2/create_rollup_parameters.json create mode 100644 deployment/v2/create_rollup_parameters.json.example create mode 100644 docker/scripts/v2/create_rollup_parameters_docker.json diff --git a/deployment/v2/4_createRollup.ts b/deployment/v2/4_createRollup.ts index f2c4b773b..dbc830ca5 100644 --- a/deployment/v2/4_createRollup.ts +++ b/deployment/v2/4_createRollup.ts @@ -8,22 +8,24 @@ import * as dotenv from "dotenv"; dotenv.config({path: path.resolve(__dirname, "../../.env")}); import {ethers, upgrades} from "hardhat"; import {HardhatEthersSigner} from "@nomicfoundation/hardhat-ethers/signers"; - const {create2Deployment} = require("../helpers/deployment-helpers"); -const pathOutputJson = path.join(__dirname, "./deploy_output.json"); const pathGenesis = path.join(__dirname, "./genesis.json"); -const deployParameters = require("./deploy_parameters.json"); +const createRollupParameters = require("./create_rollup_parameters.json"); const genesis = require("./genesis.json"); const deployOutput = require("./deploy_output.json"); import "../helpers/utils"; +const pathOutputJson = path.join(__dirname, "./create_rollup_output.json"); + import {PolygonRollupManager, PolygonZkEVMV2, PolygonZkEVMBridgeV2} from "../../typechain-types"; async function main() { const attemptsDeployProxy = 20; + const outputJson = {} as any; + /* * Check deploy parameters * Check that every necessary parameter is fullfilled @@ -41,7 +43,7 @@ async function main() { ]; for (const parameterName of mandatoryDeploymentParameters) { - if (deployParameters[parameterName] === undefined || deployParameters[parameterName] === "") { + if (createRollupParameters[parameterName] === undefined || createRollupParameters[parameterName] === "") { throw new Error(`Missing parameter: ${parameterName}`); } } @@ -56,7 +58,7 @@ async function main() { adminZkEVM, forkID, consensusContract, - } = deployParameters; + } = createRollupParameters; const supportedConensus = [ "PolygonZkEVMEtrog", @@ -71,30 +73,31 @@ async function main() { // Load provider let currentProvider = ethers.provider; - if (deployParameters.multiplierGas || deployParameters.maxFeePerGas) { + if (createRollupParameters.multiplierGas || createRollupParameters.maxFeePerGas) { if (process.env.HARDHAT_NETWORK !== "hardhat") { currentProvider = ethers.getDefaultProvider( `https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}` ) as any; - if (deployParameters.maxPriorityFeePerGas && deployParameters.maxFeePerGas) { + if (createRollupParameters.maxPriorityFeePerGas && createRollupParameters.maxFeePerGas) { console.log( - `Hardcoded gas used: MaxPriority${deployParameters.maxPriorityFeePerGas} gwei, MaxFee${deployParameters.maxFeePerGas} gwei` + `Hardcoded gas used: MaxPriority${createRollupParameters.maxPriorityFeePerGas} gwei, MaxFee${createRollupParameters.maxFeePerGas} gwei` ); const FEE_DATA = new ethers.FeeData( null, - ethers.parseUnits(deployParameters.maxFeePerGas, "gwei"), - ethers.parseUnits(deployParameters.maxPriorityFeePerGas, "gwei") + ethers.parseUnits(createRollupParameters.maxFeePerGas, "gwei"), + ethers.parseUnits(createRollupParameters.maxPriorityFeePerGas, "gwei") ); currentProvider.getFeeData = async () => FEE_DATA; } else { - console.log("Multiplier gas used: ", deployParameters.multiplierGas); + console.log("Multiplier gas used: ", createRollupParameters.multiplierGas); async function overrideFeeData() { const feedata = await ethers.provider.getFeeData(); return new ethers.FeeData( null, - ((feedata.maxFeePerGas as bigint) * BigInt(deployParameters.multiplierGas)) / 1000n, - ((feedata.maxPriorityFeePerGas as bigint) * BigInt(deployParameters.multiplierGas)) / 1000n + ((feedata.maxFeePerGas as bigint) * BigInt(createRollupParameters.multiplierGas)) / 1000n, + ((feedata.maxPriorityFeePerGas as bigint) * BigInt(createRollupParameters.multiplierGas)) / + 1000n ); } currentProvider.getFeeData = overrideFeeData; @@ -104,8 +107,8 @@ async function main() { // Load deployer let deployer; - if (deployParameters.deployerPvtKey) { - deployer = new ethers.Wallet(deployParameters.deployerPvtKey, currentProvider); + if (createRollupParameters.deployerPvtKey) { + deployer = new ethers.Wallet(createRollupParameters.deployerPvtKey, currentProvider); } else if (process.env.MNEMONIC) { deployer = ethers.HDNodeWallet.fromMnemonic( ethers.Mnemonic.fromPhrase(process.env.MNEMONIC), @@ -180,7 +183,7 @@ async function main() { await (await PolygonconsensusContract.setDataCommittee(polygonDataComitteeContract?.target)).wait(); } - deployOutput.polygonDataComitteeContract = polygonDataComitteeContract?.target; + outputJson.polygonDataComitteeContract = polygonDataComitteeContract?.target; } // Add a new rollup type with timelock @@ -203,9 +206,9 @@ async function main() { let gasTokenAddress, gasTokenNetwork, gasTokenMetadata; if ( - deployParameters.gasTokenAddress && - deployParameters.gasTokenAddress != "" && - deployParameters.gasTokenAddress != ethers.ZeroAddress + createRollupParameters.gasTokenAddress && + createRollupParameters.gasTokenAddress != "" && + createRollupParameters.gasTokenAddress != ethers.ZeroAddress ) { // Get bridge instance const bridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2", deployer); @@ -214,16 +217,18 @@ async function main() { ) as PolygonZkEVMBridgeV2; // Get token metadata - gasTokenMetadata = await polygonZkEVMBridgeContract.getTokenMetadata(deployParameters.gasTokenAddress); + gasTokenMetadata = await polygonZkEVMBridgeContract.getTokenMetadata(createRollupParameters.gasTokenAddress); - const wrappedData = await polygonZkEVMBridgeContract.wrappedTokenToTokenInfo(deployParameters.gasTokenAddress); + const wrappedData = await polygonZkEVMBridgeContract.wrappedTokenToTokenInfo( + createRollupParameters.gasTokenAddress + ); if (wrappedData.originNetwork != 0n) { // Wrapped token gasTokenAddress = wrappedData.originTokenAddress; gasTokenNetwork = wrappedData.originNetwork; } else { // Mainnet token - gasTokenAddress = deployParameters.gasTokenAddress; + gasTokenAddress = createRollupParameters.gasTokenAddress; gasTokenNetwork = 0n; } } else { @@ -249,7 +254,8 @@ async function main() { ); const receipt = (await txDeployRollup.wait()) as any; - const timestampReceipt = (await receipt?.getBlock())?.timestamp; + const blockDeploymentRollup = await receipt?.getBlock(); + const timestampReceipt = blockDeploymentRollup.timestamp; const rollupID = await rollupManagerContract.chainIDToRollupID(chainID); console.log("#######################\n"); @@ -272,10 +278,6 @@ async function main() { } } - deployOutput.genesis = genesis.root; - deployOutput.newZKEVMAddress = newZKEVMAddress; - deployOutput.verifierAddress = verifierContract.target; - // Add the first batch of the created rollup const newZKEVMContract = (await PolygonconsensusFactory.attach(newZKEVMAddress)) as PolygonZkEVMV2; const batchData = { @@ -289,10 +291,14 @@ async function main() { timestamp: timestampReceipt, sequencer: trustedSequencer, }; - genesis.firstBatchData = batchData; - fs.writeFileSync(pathOutputJson, JSON.stringify(deployOutput, null, 1)); - fs.writeFileSync(pathGenesis, JSON.stringify(genesis, null, 1)); + outputJson.firstBatchData = batchData; + outputJson.genesis = genesis.root; + outputJson.createRollupBlock = blockDeploymentRollup.number; + outputJson.rollupAddress = newZKEVMAddress; + outputJson.verifierAddress = verifierContract.target; + + fs.writeFileSync(pathOutputJson, JSON.stringify(outputJson, null, 1)); } main().catch((e) => { diff --git a/deployment/v2/README.md b/deployment/v2/README.md index f23ca21c3..2266fb3e2 100644 --- a/deployment/v2/README.md +++ b/deployment/v2/README.md @@ -64,7 +64,11 @@ A new folder will be created witth the following name `deployments/${network}_$( - `trustedAggregatorTimeout`: uint64, If a sequence is not verified in this timeout everyone can verify it - `pendingStateTimeout`: uint64, Once a pending state exceeds this timeout it can be consolidated - `emergencyCouncilAddress`:address, Emergency council addres - +- `polTokenAddress`: address, Matic token address, only if deploy on testnet can be left blank and will fullfilled by the scripts. +- `zkEVMDeployerAddress`: address, Address of the `PolygonZkEVMDeployer`. Can be left blank, will be fullfilled automatically with the `deploy:deployer:ZkEVM:goerli` script. + +## create_rollup_parameters.json + - `realVerifier`: bool, Indicates whether deploy a real verifier or not for the new created - `trustedSequencerURL`: string, trustedSequencer URL - `networkName`: string, networkName @@ -75,10 +79,8 @@ A new folder will be created witth the following name `deployments/${network}_$( - `forkID`: uint64, Fork ID of the new rollup, indicates the prover (zkROM/executor) version - `consensusContract`: string, Consensus contract name of the new rollup deployed, current options are: "PolygonZkEVMEtrog","PolygonZkEVMV2","PolygonDataComittee", "PolygonDataComitteeEtrog", - `gasTokenAddress`:address, Gas token address, empty or address(0) for ether -- `polTokenAddress`: address, Matic token address, only if deploy on testnet can be left blank and will fullfilled by the scripts. -- `zkEVMDeployerAddress`: address, Address of the `PolygonZkEVMDeployer`. Can be left blank, will be fullfilled automatically with the `deploy:deployer:ZkEVM:goerli` script. -### Optional Parameters +### Optional Parameters on both parameters - `deployerPvtKey`: string, pvtKey of the deployer, overrides the address in `MNEMONIC` of `.env` if exist - `maxFeePerGas`:string, Set `maxFeePerGas`, must define aswell `maxPriorityFeePerGas` to use it diff --git a/deployment/v2/create_rollup_parameters.json b/deployment/v2/create_rollup_parameters.json new file mode 100644 index 000000000..dc6dd2f8e --- /dev/null +++ b/deployment/v2/create_rollup_parameters.json @@ -0,0 +1,16 @@ +{ + "realVerifier": false, + "trustedSequencerURL": "http://zkevm-json-rpc:8123", + "networkName": "zkevm", + "description":"0.0.1", + "trustedSequencer":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", + "chainID": 1001, + "adminZkEVM":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", + "forkID": 1, + "consensusContract": "PolygonZkEVMEtrog", + "gasTokenAddress":"", + "deployerPvtKey": "", + "maxFeePerGas":"", + "maxPriorityFeePerGas":"", + "multiplierGas": "" +} diff --git a/deployment/v2/create_rollup_parameters.json.example b/deployment/v2/create_rollup_parameters.json.example new file mode 100644 index 000000000..dc6dd2f8e --- /dev/null +++ b/deployment/v2/create_rollup_parameters.json.example @@ -0,0 +1,16 @@ +{ + "realVerifier": false, + "trustedSequencerURL": "http://zkevm-json-rpc:8123", + "networkName": "zkevm", + "description":"0.0.1", + "trustedSequencer":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", + "chainID": 1001, + "adminZkEVM":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", + "forkID": 1, + "consensusContract": "PolygonZkEVMEtrog", + "gasTokenAddress":"", + "deployerPvtKey": "", + "maxFeePerGas":"", + "maxPriorityFeePerGas":"", + "multiplierGas": "" +} diff --git a/deployment/v2/deploy_parameters.json.example b/deployment/v2/deploy_parameters.json.example index b2f242a80..f0540f510 100644 --- a/deployment/v2/deploy_parameters.json.example +++ b/deployment/v2/deploy_parameters.json.example @@ -8,16 +8,6 @@ "trustedAggregatorTimeout": 604799, "pendingStateTimeout": 604799, "emergencyCouncilAddress": "0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", - "realVerifier": false, - "trustedSequencerURL": "http://zkevm-json-rpc:8123", - "networkName": "zkevm", - "description":"0.0.1", - "trustedSequencer":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", - "chainID": 1001, - "adminZkEVM":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", - "forkID": 1, - "consensusContract": "PolygonZkEVMEtrog", - "gasTokenAddress":"", "polTokenAddress":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", "zkEVMDeployerAddress":"", "deployerPvtKey": "", diff --git a/docker/scripts/v2/create_rollup_parameters_docker.json b/docker/scripts/v2/create_rollup_parameters_docker.json new file mode 100644 index 000000000..479c0f2c4 --- /dev/null +++ b/docker/scripts/v2/create_rollup_parameters_docker.json @@ -0,0 +1,16 @@ +{ + "realVerifier": false, + "trustedSequencerURL": "http://zkevm-json-rpc:8123", + "networkName": "zkevm", + "description": "0.0.1", + "trustedSequencer": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "chainID": 1001, + "adminZkEVM": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "forkID": 5, + "consensusContract": "PolygonZkEVMEtrog", + "gasTokenAddress":"", + "deployerPvtKey": "", + "maxFeePerGas":"", + "maxPriorityFeePerGas":"", + "multiplierGas": "" +} diff --git a/docker/scripts/v2/deploy-dockerv2.sh b/docker/scripts/v2/deploy-dockerv2.sh index 07ee5b052..31513dc34 100755 --- a/docker/scripts/v2/deploy-dockerv2.sh +++ b/docker/scripts/v2/deploy-dockerv2.sh @@ -4,10 +4,12 @@ DEV_PERIOD=1 docker compose -f docker/docker-compose.geth.yml up -d geth sleep 5 node docker/scripts/fund-accounts.js cp docker/scripts/v2/deploy_parameters_docker.json deployment/v2/deploy_parameters.json +cp docker/scripts/v2/create_rollup_parameters.json deployment/v2/create_rollup_parameters.json npm run deploy:testnet:v2:localhost mkdir docker/deploymentOutput mv deployment/v2/deploy_output.json docker/deploymentOutput mv deployment/v2/genesis.json docker/deploymentOutput +mv deployment/v2/create_rollup_output.json docker/deploymentOutput DEV_PERIOD=1 docker compose -f docker/docker-compose.geth.yml down sudo docker build -t hermeznetwork/geth-zkevm-contracts -f docker/Dockerfile.geth . # Let it readable for the multiplatform build coming later! diff --git a/package.json b/package.json index 5e4611236..4d0c928a3 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ "solidity-docgen": "^0.5.17" }, "scripts": { - "saveDeployment:goerli": "mkdir -p deployments/goerli_$(date +%s) && cp -r deployment/v2/deploy_*.json deployments/goerli_$(date +%s) && cp .openzeppelin/goerli.json deployments/goerli_$(date +%s) && cp deployment/v2/genesis.json deployments/goerli_$(date +%s)", - "saveDeployment:mainnet": "mkdir -p deployments/mainnet_$(date +%s) && cp -r deployment/v2/deploy_*.json deployments/mainnet_$(date +%s) && cp .openzeppelin/mainnet.json deployments/mainnet_$(date +%s) && cp deployment/v2/genesis.json deployments/mainnet_$(date +%s)", + "saveDeployment:goerli": "mkdir -p deployments/goerli_$(date +%s) && cp -r deployment/v2/deploy_*.json deployments/goerli_$(date +%s) && cp .openzeppelin/goerli.json deployments/goerli_$(date +%s) && cp deployment/v2/genesis.json deployments/goerli_$(date +%s) && cp deployment/v2/create_rollup_output.json deployments/goerli_$(date +%s)", + "saveDeployment:mainnet": "mkdir -p deployments/mainnet_$(date +%s) && cp -r deployment/v2/deploy_*.json deployments/mainnet_$(date +%s) && cp .openzeppelin/mainnet.json deployments/mainnet_$(date +%s) && cp deployment/v2/genesis.json deployments/mainnet_$(date +%s) && cp deployment/v2/create_rollup_output.json deployments/mainnet_$(date +%s)", "test": "npx hardhat test test/contractsv2/*ts", "docgen": "npx solidity-docgen --solc-module solc-0.8 -t ./docs/templates -e ./contracts/verifiers,./contracts/mocks", "prepare:testnet:ZkEVM:localhost": "npx hardhat run deployment/testnet/prepareTestnet.ts --network localhost", @@ -90,6 +90,6 @@ "deploy:v2:sepolia": "npx hardhat compile && npx ts-node deployment/v2/1_createGenesis.ts && npx hardhat run deployment/v2/2_deployPolygonZKEVMDeployer.ts --network sepolia && npx hardhat run deployment/v2/3_deployContracts.ts --network sepolia && npx hardhat run deployment/v2/4_createRollup.ts --network sepolia && npm run saveDeployment:sepolia", "deploy:testnet:v2:sepolia": "npx hardhat compile && rm -f deployment/v2/deploy_ongoing.json && npm run prepare:testnet:ZkEVM:sepolia && npm run deploy:v2:sepolia", "verify:v2:sepolia": "npx hardhat run deployment/v2/verifyContracts.js --network sepolia", - "saveDeployment:sepolia": "mkdir -p deployments/sepolia_$(date +%s) && cp -r deployment/v2/deploy_*.json deployments/sepolia_$(date +%s) && cp .openzeppelin/sepolia.json deployments/sepolia_$(date +%s) && cp deployment/v2/genesis.json deployments/sepolia_$(date +%s)" + "saveDeployment:sepolia": "mkdir -p deployments/sepolia_$(date +%s) && cp -r deployment/v2/deploy_*.json deployments/sepolia_$(date +%s) && cp .openzeppelin/sepolia.json deployments/sepolia_$(date +%s) && cp deployment/v2/genesis.json deployments/sepolia_$(date +%s) && cp deployment/v2/create_rollup_output.json deployments/sepolia_$(date +%s)" } } From f648c4fd74c11cecc97fbc1478571678762dbcc3 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Fri, 1 Dec 2023 01:52:02 +0100 Subject: [PATCH 108/230] fix verify contracts --- deployment/v2/verifyContracts.js | 40 ++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/deployment/v2/verifyContracts.js b/deployment/v2/verifyContracts.js index bb6deeff3..1c47277bc 100644 --- a/deployment/v2/verifyContracts.js +++ b/deployment/v2/verifyContracts.js @@ -7,8 +7,13 @@ const { ethers, upgrades } = require('hardhat'); const pathDeployOutputParameters = path.join(__dirname, './deploy_output.json'); const pathDeployParameters = path.join(__dirname, './deploy_parameters.json'); -const deployOutputParameters = require(pathDeployOutputParameters); + const deployParameters = require(pathDeployParameters); +const deployOutputParameters = require(pathDeployOutputParameters); + +const pathCreateRollupOutput = path.join(__dirname, './create_rollup_output.json'); + +const createRollupOutputParameters = require(pathCreateRollupOutput); async function main() { // load deployer account @@ -39,18 +44,6 @@ async function main() { // expect(error.message.toLowerCase().includes('already verified')).to.be.equal(true); } - // verify verifier - try { - await hre.run( - 'verify:verify', - { - address: deployOutputParameters.verifierAddress, - }, - ); - } catch (error) { - expect(error.message.toLowerCase().includes('already verified')).to.be.equal(true); - } - const { minDelayTimelock } = deployParameters; const { timelockAdminAddress } = deployParameters; try { @@ -149,10 +142,10 @@ async function main() { 'verify:verify', { contract: 'contracts/v2/lib/PolygonTransparentProxy.sol:PolygonTransparentProxy', - address: deployOutputParameters.newZKEVMAddress, + address: createRollupOutputParameters.rollupAddress, constructorArguments: [ - await upgrades.erc1967.getImplementationAddress(deployOutputParameters.newZKEVMAddress), - await upgrades.erc1967.getAdminAddress(deployOutputParameters.newZKEVMAddress), + await upgrades.erc1967.getImplementationAddress(createRollupOutputParameters.rollupAddress), + await upgrades.erc1967.getAdminAddress(createRollupOutputParameters.rollupAddress), '0x', ], }, @@ -161,13 +154,26 @@ async function main() { // expect(error.message.toLowerCase().includes('proxyadmin')).to.be.equal(true); } + // verify verifier + try { + await hre.run( + 'verify:verify', + { + address: createRollupOutputParameters.verifierAddress, + }, + ); + } catch (error) { + expect(error.message.toLowerCase().includes('already verified')).to.be.equal(true); + } + + // verify zkEVM address try { await hre.run( 'verify:verify', { contract: 'contracts/v2/consensus/zkEVM/PolygonZkEVMV2.sol:PolygonZkEVMV2', - address: deployOutputParameters.newZKEVMAddress, + address: createRollupOutputParameters.rollupAddress, constructorArguments: [ deployOutputParameters.polygonZkEVMGlobalExitRootAddress, deployOutputParameters.polTokenAddress, From 04da9fb4f73c75e326d0697fc6d57cfbdf941bb3 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Fri, 1 Dec 2023 13:26:31 +0100 Subject: [PATCH 109/230] mini fix readme --- deployment/v2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/v2/README.md b/deployment/v2/README.md index 2266fb3e2..4fee2f052 100644 --- a/deployment/v2/README.md +++ b/deployment/v2/README.md @@ -75,7 +75,7 @@ A new folder will be created witth the following name `deployments/${network}_$( - `description`:string, Description of the new rollup type - `trustedSequencer`: address, trusted sequencer addresss - `chainID`: uint64, chainID of the new rollup -- `admin`:address, Admin address, can adjust Rollup parameters +- `adminZkEVM`:address, Admin address, can adjust Rollup parameters - `forkID`: uint64, Fork ID of the new rollup, indicates the prover (zkROM/executor) version - `consensusContract`: string, Consensus contract name of the new rollup deployed, current options are: "PolygonZkEVMEtrog","PolygonZkEVMV2","PolygonDataComittee", "PolygonDataComitteeEtrog", - `gasTokenAddress`:address, Gas token address, empty or address(0) for ether From 0bd401755a9fbaae95d09aedb333b0f98800d27a Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 13 Dec 2023 14:06:57 +0100 Subject: [PATCH 110/230] update bridge tests, update hardhat upgrade dependency --- contracts/mocks/DAI.sol | 239 --- contracts/mocks/DaiMock.sol | 171 ++ contracts/mocks/Uni.sol | 1582 ++++++++--------- contracts/v2/PolygonZkEVMBridgeV2.sol | 4 +- .../mocks/PolygonRollupManagerEmptyMock.sol | 33 + package-lock.json | 76 +- package.json | 2 +- src/permit-helper.js | 20 +- test/contractsv2/BridgeV2.test.ts | 172 +- test/contractsv2/BridgeV2Metadata.test.ts | 702 ++++++++ test/contractsv2/PolygonRollupManager.test.ts | 582 +++++- test/contractsv2/PolygonZkEVMV2.test.ts | 693 ++++++++ 12 files changed, 3192 insertions(+), 1084 deletions(-) delete mode 100644 contracts/mocks/DAI.sol create mode 100644 contracts/mocks/DaiMock.sol create mode 100644 contracts/v2/mocks/PolygonRollupManagerEmptyMock.sol create mode 100644 test/contractsv2/BridgeV2Metadata.test.ts create mode 100644 test/contractsv2/PolygonZkEVMV2.test.ts diff --git a/contracts/mocks/DAI.sol b/contracts/mocks/DAI.sol deleted file mode 100644 index c57899c2c..000000000 --- a/contracts/mocks/DAI.sol +++ /dev/null @@ -1,239 +0,0 @@ -// /** -// *Submitted for verification at Etherscan.io on 2019-11-14 -// */ - -// // hevm: flattened sources of /nix/store/8xb41r4qd0cjb63wcrxf1qmfg88p0961-dss-6fd7de0/src/dai.sol -// pragma solidity =0.5.12; - -// ////// /nix/store/8xb41r4qd0cjb63wcrxf1qmfg88p0961-dss-6fd7de0/src/lib.sol -// // This program is free software: you can redistribute it and/or modify -// // it under the terms of the GNU General Public License as published by -// // the Free Software Foundation, either version 3 of the License, or -// // (at your option) any later version. - -// // This program is distributed in the hope that it will be useful, -// // but WITHOUT ANY WARRANTY; without even the implied warranty of -// // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// // GNU General Public License for more details. - -// // You should have received a copy of the GNU General Public License -// // along with this program. If not, see . - -// /* pragma solidity 0.5.12; */ - -// contract LibNote { -// event LogNote( -// bytes4 indexed sig, -// address indexed usr, -// bytes32 indexed arg1, -// bytes32 indexed arg2, -// bytes data -// ) anonymous; - -// modifier note() { -// _; -// assembly { -// // log an 'anonymous' event with a constant 6 words of calldata -// // and four indexed topics: selector, caller, arg1 and arg2 -// let mark := msize // end of memory ensures zero -// mstore(0x40, add(mark, 288)) // update free memory pointer -// mstore(mark, 0x20) // bytes type data offset -// mstore(add(mark, 0x20), 224) // bytes size (padded) -// calldatacopy(add(mark, 0x40), 0, 224) // bytes payload -// log4( -// mark, -// 288, // calldata -// shl(224, shr(224, calldataload(0))), // msg.sig -// caller, // msg.sender -// calldataload(4), // arg1 -// calldataload(36) // arg2 -// ) -// } -// } -// } - -// ////// /nix/store/8xb41r4qd0cjb63wcrxf1qmfg88p0961-dss-6fd7de0/src/dai.sol -// // Copyright (C) 2017, 2018, 2019 dbrock, rain, mrchico - -// // This program is free software: you can redistribute it and/or modify -// // it under the terms of the GNU Affero General Public License as published by -// // the Free Software Foundation, either version 3 of the License, or -// // (at your option) any later version. -// // -// // This program is distributed in the hope that it will be useful, -// // but WITHOUT ANY WARRANTY; without even the implied warranty of -// // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// // GNU Affero General Public License for more details. -// // -// // You should have received a copy of the GNU Affero General Public License -// // along with this program. If not, see . - -// /* pragma solidity 0.5.12; */ - -// /* import "./lib.sol"; */ - -// contract Dai is LibNote { -// // --- Auth --- -// mapping(address => uint256) public wards; - -// function rely(address guy) external note auth { -// wards[guy] = 1; -// } - -// function deny(address guy) external note auth { -// wards[guy] = 0; -// } - -// modifier auth() { -// require(wards[msg.sender] == 1, "Dai/not-authorized"); -// _; -// } - -// // --- ERC20 Data --- -// string public constant name = "Dai Stablecoin"; -// string public constant symbol = "DAI"; -// string public constant version = "1"; -// uint8 public constant decimals = 18; -// uint256 public totalSupply; - -// mapping(address => uint256) public balanceOf; -// mapping(address => mapping(address => uint256)) public allowance; -// mapping(address => uint256) public nonces; - -// event Approval(address indexed src, address indexed guy, uint256 wad); -// event Transfer(address indexed src, address indexed dst, uint256 wad); - -// // --- Math --- -// function add(uint256 x, uint256 y) internal pure returns (uint256 z) { -// require((z = x + y) >= x); -// } - -// function sub(uint256 x, uint256 y) internal pure returns (uint256 z) { -// require((z = x - y) <= x); -// } - -// // --- EIP712 niceties --- -// bytes32 public DOMAIN_SEPARATOR; -// // bytes32 public constant PERMIT_TYPEHASH = keccak256("Permit(address holder,address spender,uint256 nonce,uint256 expiry,bool allowed)"); -// bytes32 public constant PERMIT_TYPEHASH = -// 0xea2aa0a1be11a07ed86d755c93467f4f82362b452371d1ba94d1715123511acb; - -// constructor(uint256 chainId_) public { -// wards[msg.sender] = 1; -// DOMAIN_SEPARATOR = keccak256( -// abi.encode( -// keccak256( -// "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" -// ), -// keccak256(bytes(name)), -// keccak256(bytes(version)), -// chainId_, -// address(this) -// ) -// ); -// } - -// // --- Token --- -// function transfer(address dst, uint256 wad) external returns (bool) { -// return transferFrom(msg.sender, dst, wad); -// } - -// function transferFrom( -// address src, -// address dst, -// uint256 wad -// ) public returns (bool) { -// require(balanceOf[src] >= wad, "Dai/insufficient-balance"); -// if (src != msg.sender && allowance[src][msg.sender] != uint256(-1)) { -// require( -// allowance[src][msg.sender] >= wad, -// "Dai/insufficient-allowance" -// ); -// allowance[src][msg.sender] = sub(allowance[src][msg.sender], wad); -// } -// balanceOf[src] = sub(balanceOf[src], wad); -// balanceOf[dst] = add(balanceOf[dst], wad); -// emit Transfer(src, dst, wad); -// return true; -// } - -// function mint(address usr, uint256 wad) external auth { -// balanceOf[usr] = add(balanceOf[usr], wad); -// totalSupply = add(totalSupply, wad); -// emit Transfer(address(0), usr, wad); -// } - -// function burn(address usr, uint256 wad) external { -// require(balanceOf[usr] >= wad, "Dai/insufficient-balance"); -// if (usr != msg.sender && allowance[usr][msg.sender] != uint256(-1)) { -// require( -// allowance[usr][msg.sender] >= wad, -// "Dai/insufficient-allowance" -// ); -// allowance[usr][msg.sender] = sub(allowance[usr][msg.sender], wad); -// } -// balanceOf[usr] = sub(balanceOf[usr], wad); -// totalSupply = sub(totalSupply, wad); -// emit Transfer(usr, address(0), wad); -// } - -// function approve(address usr, uint256 wad) external returns (bool) { -// allowance[msg.sender][usr] = wad; -// emit Approval(msg.sender, usr, wad); -// return true; -// } - -// // --- Alias --- -// function push(address usr, uint256 wad) external { -// transferFrom(msg.sender, usr, wad); -// } - -// function pull(address usr, uint256 wad) external { -// transferFrom(usr, msg.sender, wad); -// } - -// function move( -// address src, -// address dst, -// uint256 wad -// ) external { -// transferFrom(src, dst, wad); -// } - -// // --- Approve by signature --- -// function permit( -// address holder, -// address spender, -// uint256 nonce, -// uint256 expiry, -// bool allowed, -// uint8 v, -// bytes32 r, -// bytes32 s -// ) external { -// bytes32 digest = keccak256( -// abi.encodePacked( -// "\x19\x01", -// DOMAIN_SEPARATOR, -// keccak256( -// abi.encode( -// PERMIT_TYPEHASH, -// holder, -// spender, -// nonce, -// expiry, -// allowed -// ) -// ) -// ) -// ); - -// require(holder != address(0), "Dai/invalid-address-0"); -// require(holder == ecrecover(digest, v, r, s), "Dai/invalid-permit"); -// require(expiry == 0 || now <= expiry, "Dai/permit-expired"); -// require(nonce == nonces[holder]++, "Dai/invalid-nonce"); -// uint256 wad = allowed ? uint256(-1) : 0; -// allowance[holder][spender] = wad; -// emit Approval(holder, spender, wad); -// } -// } diff --git a/contracts/mocks/DaiMock.sol b/contracts/mocks/DaiMock.sol new file mode 100644 index 000000000..4ec7f4560 --- /dev/null +++ b/contracts/mocks/DaiMock.sol @@ -0,0 +1,171 @@ +/** + *Submitted for verification at Etherscan.io on 2019-11-14 + */ + +// hevm: flattened sources of /nix/store/8xb41r4qd0cjb63wcrxf1qmfg88p0961-dss-6fd7de0/src/dai.sol +pragma solidity =0.5.12; + +// Copeid DAi for testing porpuses. The notes are removed from this contract as it does not work correctly woith the +// coverage solidity compiler + +contract DaiMock { + // --- Auth --- + mapping(address => uint256) public wards; + + function rely(address guy) external auth { + wards[guy] = 1; + } + + function deny(address guy) external auth { + wards[guy] = 0; + } + + modifier auth() { + require(wards[msg.sender] == 1, "Dai/not-authorized"); + _; + } + + // --- ERC20 Data --- + string public constant name = "Dai Stablecoin"; + string public constant symbol = "DAI"; + string public constant version = "1"; + uint8 public constant decimals = 18; + uint256 public totalSupply; + + mapping(address => uint256) public balanceOf; + mapping(address => mapping(address => uint256)) public allowance; + mapping(address => uint256) public nonces; + + event Approval(address indexed src, address indexed guy, uint256 wad); + event Transfer(address indexed src, address indexed dst, uint256 wad); + + // --- Math --- + function add(uint256 x, uint256 y) internal pure returns (uint256 z) { + require((z = x + y) >= x); + } + + function sub(uint256 x, uint256 y) internal pure returns (uint256 z) { + require((z = x - y) <= x); + } + + // --- EIP712 niceties --- + bytes32 public DOMAIN_SEPARATOR; + // bytes32 public constant PERMIT_TYPEHASH = keccak256("Permit(address holder,address spender,uint256 nonce,uint256 expiry,bool allowed)"); + bytes32 public constant PERMIT_TYPEHASH = + 0xea2aa0a1be11a07ed86d755c93467f4f82362b452371d1ba94d1715123511acb; + + constructor(uint256 chainId_) public { + wards[msg.sender] = 1; + DOMAIN_SEPARATOR = keccak256( + abi.encode( + keccak256( + "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" + ), + keccak256(bytes(name)), + keccak256(bytes(version)), + chainId_, + address(this) + ) + ); + } + + // --- Token --- + function transfer(address dst, uint256 wad) external returns (bool) { + return transferFrom(msg.sender, dst, wad); + } + + function transferFrom( + address src, + address dst, + uint256 wad + ) public returns (bool) { + require(balanceOf[src] >= wad, "Dai/insufficient-balance"); + if (src != msg.sender && allowance[src][msg.sender] != uint256(-1)) { + require( + allowance[src][msg.sender] >= wad, + "Dai/insufficient-allowance" + ); + allowance[src][msg.sender] = sub(allowance[src][msg.sender], wad); + } + balanceOf[src] = sub(balanceOf[src], wad); + balanceOf[dst] = add(balanceOf[dst], wad); + emit Transfer(src, dst, wad); + return true; + } + + function mint(address usr, uint256 wad) external auth { + balanceOf[usr] = add(balanceOf[usr], wad); + totalSupply = add(totalSupply, wad); + emit Transfer(address(0), usr, wad); + } + + function burn(address usr, uint256 wad) external { + require(balanceOf[usr] >= wad, "Dai/insufficient-balance"); + if (usr != msg.sender && allowance[usr][msg.sender] != uint256(-1)) { + require( + allowance[usr][msg.sender] >= wad, + "Dai/insufficient-allowance" + ); + allowance[usr][msg.sender] = sub(allowance[usr][msg.sender], wad); + } + balanceOf[usr] = sub(balanceOf[usr], wad); + totalSupply = sub(totalSupply, wad); + emit Transfer(usr, address(0), wad); + } + + function approve(address usr, uint256 wad) external returns (bool) { + allowance[msg.sender][usr] = wad; + emit Approval(msg.sender, usr, wad); + return true; + } + + // --- Alias --- + function push(address usr, uint256 wad) external { + transferFrom(msg.sender, usr, wad); + } + + function pull(address usr, uint256 wad) external { + transferFrom(usr, msg.sender, wad); + } + + function move(address src, address dst, uint256 wad) external { + transferFrom(src, dst, wad); + } + + // --- Approve by signature --- + function permit( + address holder, + address spender, + uint256 nonce, + uint256 expiry, + bool allowed, + uint8 v, + bytes32 r, + bytes32 s + ) external { + bytes32 digest = keccak256( + abi.encodePacked( + "\x19\x01", + DOMAIN_SEPARATOR, + keccak256( + abi.encode( + PERMIT_TYPEHASH, + holder, + spender, + nonce, + expiry, + allowed + ) + ) + ) + ); + + require(holder != address(0), "Dai/invalid-address-0"); + require(holder == ecrecover(digest, v, r, s), "Dai/invalid-permit"); + require(expiry == 0 || now <= expiry, "Dai/permit-expired"); + require(nonce == nonces[holder]++, "Dai/invalid-nonce"); + uint256 wad = allowed ? uint256(-1) : 0; + allowance[holder][spender] = wad; + emit Approval(holder, spender, wad); + } +} diff --git a/contracts/mocks/Uni.sol b/contracts/mocks/Uni.sol index cd467abc3..052e77df6 100644 --- a/contracts/mocks/Uni.sol +++ b/contracts/mocks/Uni.sol @@ -1,791 +1,791 @@ -// /** -// *Submitted for verification at Etherscan.io on 2020-09-16 -// */ - -// /** -// *Submitted for verification at Etherscan.io on 2020-09-15 -// */ - -// pragma solidity ^0.5.16; -// pragma experimental ABIEncoderV2; - -// // From https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/Math.sol -// // Subject to the MIT license. - -// /** -// * @dev Wrappers over Solidity's arithmetic operations with added overflow -// * checks. -// * -// * Arithmetic operations in Solidity wrap on overflow. This can easily result -// * in bugs, because programmers usually assume that an overflow raises an -// * error, which is the standard behavior in high level programming languages. -// * `SafeMath` restores this intuition by reverting the transaction when an -// * operation overflows. -// * -// * Using this library instead of the unchecked operations eliminates an entire -// * class of bugs, so it's recommended to use it always. -// */ -// library SafeMath { -// /** -// * @dev Returns the addition of two unsigned integers, reverting on overflow. -// * -// * Counterpart to Solidity's `+` operator. -// * -// * Requirements: -// * - Addition cannot overflow. -// */ -// function add(uint256 a, uint256 b) internal pure returns (uint256) { -// uint256 c = a + b; -// require(c >= a, "SafeMath: addition overflow"); - -// return c; -// } - -// /** -// * @dev Returns the addition of two unsigned integers, reverting with custom message on overflow. -// * -// * Counterpart to Solidity's `+` operator. -// * -// * Requirements: -// * - Addition cannot overflow. -// */ -// function add( -// uint256 a, -// uint256 b, -// string memory errorMessage -// ) internal pure returns (uint256) { -// uint256 c = a + b; -// require(c >= a, errorMessage); - -// return c; -// } - -// /** -// * @dev Returns the subtraction of two unsigned integers, reverting on underflow (when the result is negative). -// * -// * Counterpart to Solidity's `-` operator. -// * -// * Requirements: -// * - Subtraction cannot underflow. -// */ -// function sub(uint256 a, uint256 b) internal pure returns (uint256) { -// return sub(a, b, "SafeMath: subtraction underflow"); -// } - -// /** -// * @dev Returns the subtraction of two unsigned integers, reverting with custom message on underflow (when the result is negative). -// * -// * Counterpart to Solidity's `-` operator. -// * -// * Requirements: -// * - Subtraction cannot underflow. -// */ -// function sub( -// uint256 a, -// uint256 b, -// string memory errorMessage -// ) internal pure returns (uint256) { -// require(b <= a, errorMessage); -// uint256 c = a - b; - -// return c; -// } - -// /** -// * @dev Returns the multiplication of two unsigned integers, reverting on overflow. -// * -// * Counterpart to Solidity's `*` operator. -// * -// * Requirements: -// * - Multiplication cannot overflow. -// */ -// function mul(uint256 a, uint256 b) internal pure returns (uint256) { -// // Gas optimization: this is cheaper than requiring 'a' not being zero, but the -// // benefit is lost if 'b' is also tested. -// // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 -// if (a == 0) { -// return 0; -// } - -// uint256 c = a * b; -// require(c / a == b, "SafeMath: multiplication overflow"); - -// return c; -// } - -// /** -// * @dev Returns the multiplication of two unsigned integers, reverting on overflow. -// * -// * Counterpart to Solidity's `*` operator. -// * -// * Requirements: -// * - Multiplication cannot overflow. -// */ -// function mul( -// uint256 a, -// uint256 b, -// string memory errorMessage -// ) internal pure returns (uint256) { -// // Gas optimization: this is cheaper than requiring 'a' not being zero, but the -// // benefit is lost if 'b' is also tested. -// // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 -// if (a == 0) { -// return 0; -// } - -// uint256 c = a * b; -// require(c / a == b, errorMessage); - -// return c; -// } - -// /** -// * @dev Returns the integer division of two unsigned integers. -// * Reverts on division by zero. The result is rounded towards zero. -// * -// * Counterpart to Solidity's `/` operator. Note: this function uses a -// * `revert` opcode (which leaves remaining gas untouched) while Solidity -// * uses an invalid opcode to revert (consuming all remaining gas). -// * -// * Requirements: -// * - The divisor cannot be zero. -// */ -// function div(uint256 a, uint256 b) internal pure returns (uint256) { -// return div(a, b, "SafeMath: division by zero"); -// } - -// /** -// * @dev Returns the integer division of two unsigned integers. -// * Reverts with custom message on division by zero. The result is rounded towards zero. -// * -// * Counterpart to Solidity's `/` operator. Note: this function uses a -// * `revert` opcode (which leaves remaining gas untouched) while Solidity -// * uses an invalid opcode to revert (consuming all remaining gas). -// * -// * Requirements: -// * - The divisor cannot be zero. -// */ -// function div( -// uint256 a, -// uint256 b, -// string memory errorMessage -// ) internal pure returns (uint256) { -// // Solidity only automatically asserts when dividing by 0 -// require(b > 0, errorMessage); -// uint256 c = a / b; -// // assert(a == b * c + a % b); // There is no case in which this doesn't hold - -// return c; -// } - -// /** -// * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), -// * Reverts when dividing by zero. -// * -// * Counterpart to Solidity's `%` operator. This function uses a `revert` -// * opcode (which leaves remaining gas untouched) while Solidity uses an -// * invalid opcode to revert (consuming all remaining gas). -// * -// * Requirements: -// * - The divisor cannot be zero. -// */ -// function mod(uint256 a, uint256 b) internal pure returns (uint256) { -// return mod(a, b, "SafeMath: modulo by zero"); -// } - -// /** -// * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), -// * Reverts with custom message when dividing by zero. -// * -// * Counterpart to Solidity's `%` operator. This function uses a `revert` -// * opcode (which leaves remaining gas untouched) while Solidity uses an -// * invalid opcode to revert (consuming all remaining gas). -// * -// * Requirements: -// * - The divisor cannot be zero. -// */ -// function mod( -// uint256 a, -// uint256 b, -// string memory errorMessage -// ) internal pure returns (uint256) { -// require(b != 0, errorMessage); -// return a % b; -// } -// } - -// contract Uni { -// /// @notice EIP-20 token name for this token -// string public constant name = "Uniswap"; - -// /// @notice EIP-20 token symbol for this token -// string public constant symbol = "UNI"; - -// /// @notice EIP-20 token decimals for this token -// uint8 public constant decimals = 18; - -// /// @notice Total number of tokens in circulation -// uint256 public totalSupply = 1_000_000_000e18; // 1 billion Uni - -// /// @notice Address which may mint new tokens -// address public minter; - -// /// @notice The timestamp after which minting may occur -// uint256 public mintingAllowedAfter; - -// /// @notice Minimum time between mints -// uint32 public constant minimumTimeBetweenMints = 1 days * 365; - -// /// @notice Cap on the percentage of totalSupply that can be minted at each mint -// uint8 public constant mintCap = 2; - -// /// @notice Allowance amounts on behalf of others -// mapping(address => mapping(address => uint96)) internal allowances; - -// /// @notice Official record of token balances for each account -// mapping(address => uint96) internal balances; - -// /// @notice A record of each accounts delegate -// mapping(address => address) public delegates; - -// /// @notice A checkpoint for marking number of votes from a given block -// struct Checkpoint { -// uint32 fromBlock; -// uint96 votes; -// } - -// /// @notice A record of votes checkpoints for each account, by index -// mapping(address => mapping(uint32 => Checkpoint)) public checkpoints; - -// /// @notice The number of checkpoints for each account -// mapping(address => uint32) public numCheckpoints; - -// /// @notice The EIP-712 typehash for the contract's domain -// bytes32 public constant DOMAIN_TYPEHASH = -// keccak256( -// "EIP712Domain(string name,uint256 chainId,address verifyingContract)" -// ); - -// /// @notice The EIP-712 typehash for the delegation struct used by the contract -// bytes32 public constant DELEGATION_TYPEHASH = -// keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); - -// /// @notice The EIP-712 typehash for the permit struct used by the contract -// bytes32 public constant PERMIT_TYPEHASH = -// keccak256( -// "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" -// ); - -// /// @notice A record of states for signing / validating signatures -// mapping(address => uint256) public nonces; - -// /// @notice An event thats emitted when the minter address is changed -// event MinterChanged(address minter, address newMinter); - -// /// @notice An event thats emitted when an account changes its delegate -// event DelegateChanged( -// address indexed delegator, -// address indexed fromDelegate, -// address indexed toDelegate -// ); - -// /// @notice An event thats emitted when a delegate account's vote balance changes -// event DelegateVotesChanged( -// address indexed delegate, -// uint256 previousBalance, -// uint256 newBalance -// ); - -// /// @notice The standard EIP-20 transfer event -// event Transfer(address indexed from, address indexed to, uint256 amount); - -// /// @notice The standard EIP-20 approval event -// event Approval( -// address indexed owner, -// address indexed spender, -// uint256 amount -// ); - -// /** -// * @notice Construct a new Uni token -// * @param account The initial account to grant all the tokens -// * @param minter_ The account with minting ability -// * @param mintingAllowedAfter_ The timestamp after which minting may occur -// */ -// constructor( -// address account, -// address minter_, -// uint256 mintingAllowedAfter_ -// ) public { -// require( -// mintingAllowedAfter_ >= block.timestamp, -// "Uni::constructor: minting can only begin after deployment" -// ); - -// balances[account] = uint96(totalSupply); -// emit Transfer(address(0), account, totalSupply); -// minter = minter_; -// emit MinterChanged(address(0), minter); -// mintingAllowedAfter = mintingAllowedAfter_; -// } - -// /** -// * @notice Change the minter address -// * @param minter_ The address of the new minter -// */ -// function setMinter(address minter_) external { -// require( -// msg.sender == minter, -// "Uni::setMinter: only the minter can change the minter address" -// ); -// emit MinterChanged(minter, minter_); -// minter = minter_; -// } - -// /** -// * @notice Mint new tokens -// * @param dst The address of the destination account -// * @param rawAmount The number of tokens to be minted -// */ -// function mint(address dst, uint256 rawAmount) external { -// require(msg.sender == minter, "Uni::mint: only the minter can mint"); -// require( -// block.timestamp >= mintingAllowedAfter, -// "Uni::mint: minting not allowed yet" -// ); -// require( -// dst != address(0), -// "Uni::mint: cannot transfer to the zero address" -// ); - -// // record the mint -// mintingAllowedAfter = SafeMath.add( -// block.timestamp, -// minimumTimeBetweenMints -// ); - -// // mint the amount -// uint96 amount = safe96(rawAmount, "Uni::mint: amount exceeds 96 bits"); -// require( -// amount <= SafeMath.div(SafeMath.mul(totalSupply, mintCap), 100), -// "Uni::mint: exceeded mint cap" -// ); -// totalSupply = safe96( -// SafeMath.add(totalSupply, amount), -// "Uni::mint: totalSupply exceeds 96 bits" -// ); - -// // transfer the amount to the recipient -// balances[dst] = add96( -// balances[dst], -// amount, -// "Uni::mint: transfer amount overflows" -// ); -// emit Transfer(address(0), dst, amount); - -// // move delegates -// _moveDelegates(address(0), delegates[dst], amount); -// } - -// /** -// * @notice Get the number of tokens `spender` is approved to spend on behalf of `account` -// * @param account The address of the account holding the funds -// * @param spender The address of the account spending the funds -// * @return The number of tokens approved -// */ -// function allowance( -// address account, -// address spender -// ) external view returns (uint256) { -// return allowances[account][spender]; -// } - -// /** -// * @notice Approve `spender` to transfer up to `amount` from `src` -// * @dev This will overwrite the approval amount for `spender` -// * and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve) -// * @param spender The address of the account which may transfer tokens -// * @param rawAmount The number of tokens that are approved (2^256-1 means infinite) -// * @return Whether or not the approval succeeded -// */ -// function approve( -// address spender, -// uint256 rawAmount -// ) external returns (bool) { -// uint96 amount; -// if (rawAmount == uint256(-1)) { -// amount = uint96(-1); -// } else { -// amount = safe96(rawAmount, "Uni::approve: amount exceeds 96 bits"); -// } - -// allowances[msg.sender][spender] = amount; - -// emit Approval(msg.sender, spender, amount); -// return true; -// } - -// /** -// * @notice Triggers an approval from owner to spends -// * @param owner The address to approve from -// * @param spender The address to be approved -// * @param rawAmount The number of tokens that are approved (2^256-1 means infinite) -// * @param deadline The time at which to expire the signature -// * @param v The recovery byte of the signature -// * @param r Half of the ECDSA signature pair -// * @param s Half of the ECDSA signature pair -// */ -// function permit( -// address owner, -// address spender, -// uint256 rawAmount, -// uint256 deadline, -// uint8 v, -// bytes32 r, -// bytes32 s -// ) external { -// uint96 amount; -// if (rawAmount == uint256(-1)) { -// amount = uint96(-1); -// } else { -// amount = safe96(rawAmount, "Uni::permit: amount exceeds 96 bits"); -// } - -// bytes32 domainSeparator = keccak256( -// abi.encode( -// DOMAIN_TYPEHASH, -// keccak256(bytes(name)), -// getChainId(), -// address(this) -// ) -// ); -// bytes32 structHash = keccak256( -// abi.encode( -// PERMIT_TYPEHASH, -// owner, -// spender, -// rawAmount, -// nonces[owner]++, -// deadline -// ) -// ); -// bytes32 digest = keccak256( -// abi.encodePacked("\x19\x01", domainSeparator, structHash) -// ); -// address signatory = ecrecover(digest, v, r, s); -// require(signatory != address(0), "Uni::permit: invalid signature"); -// require(signatory == owner, "Uni::permit: unauthorized"); -// require(now <= deadline, "Uni::permit: signature expired"); - -// allowances[owner][spender] = amount; - -// emit Approval(owner, spender, amount); -// } - -// /** -// * @notice Get the number of tokens held by the `account` -// * @param account The address of the account to get the balance of -// * @return The number of tokens held -// */ -// function balanceOf(address account) external view returns (uint256) { -// return balances[account]; -// } - -// /** -// * @notice Transfer `amount` tokens from `msg.sender` to `dst` -// * @param dst The address of the destination account -// * @param rawAmount The number of tokens to transfer -// * @return Whether or not the transfer succeeded -// */ -// function transfer(address dst, uint256 rawAmount) external returns (bool) { -// uint96 amount = safe96( -// rawAmount, -// "Uni::transfer: amount exceeds 96 bits" -// ); -// _transferTokens(msg.sender, dst, amount); -// return true; -// } - -// /** -// * @notice Transfer `amount` tokens from `src` to `dst` -// * @param src The address of the source account -// * @param dst The address of the destination account -// * @param rawAmount The number of tokens to transfer -// * @return Whether or not the transfer succeeded -// */ -// function transferFrom( -// address src, -// address dst, -// uint256 rawAmount -// ) external returns (bool) { -// address spender = msg.sender; -// uint96 spenderAllowance = allowances[src][spender]; -// uint96 amount = safe96( -// rawAmount, -// "Uni::approve: amount exceeds 96 bits" -// ); - -// if (spender != src && spenderAllowance != uint96(-1)) { -// uint96 newAllowance = sub96( -// spenderAllowance, -// amount, -// "Uni::transferFrom: transfer amount exceeds spender allowance" -// ); -// allowances[src][spender] = newAllowance; - -// emit Approval(src, spender, newAllowance); -// } - -// _transferTokens(src, dst, amount); -// return true; -// } - -// /** -// * @notice Delegate votes from `msg.sender` to `delegatee` -// * @param delegatee The address to delegate votes to -// */ -// function delegate(address delegatee) public { -// return _delegate(msg.sender, delegatee); -// } - -// /** -// * @notice Delegates votes from signatory to `delegatee` -// * @param delegatee The address to delegate votes to -// * @param nonce The contract state required to match the signature -// * @param expiry The time at which to expire the signature -// * @param v The recovery byte of the signature -// * @param r Half of the ECDSA signature pair -// * @param s Half of the ECDSA signature pair -// */ -// function delegateBySig( -// address delegatee, -// uint256 nonce, -// uint256 expiry, -// uint8 v, -// bytes32 r, -// bytes32 s -// ) public { -// bytes32 domainSeparator = keccak256( -// abi.encode( -// DOMAIN_TYPEHASH, -// keccak256(bytes(name)), -// getChainId(), -// address(this) -// ) -// ); -// bytes32 structHash = keccak256( -// abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry) -// ); -// bytes32 digest = keccak256( -// abi.encodePacked("\x19\x01", domainSeparator, structHash) -// ); -// address signatory = ecrecover(digest, v, r, s); -// require( -// signatory != address(0), -// "Uni::delegateBySig: invalid signature" -// ); -// require( -// nonce == nonces[signatory]++, -// "Uni::delegateBySig: invalid nonce" -// ); -// require(now <= expiry, "Uni::delegateBySig: signature expired"); -// return _delegate(signatory, delegatee); -// } - -// /** -// * @notice Gets the current votes balance for `account` -// * @param account The address to get votes balance -// * @return The number of current votes for `account` -// */ -// function getCurrentVotes(address account) external view returns (uint96) { -// uint32 nCheckpoints = numCheckpoints[account]; -// return -// nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; -// } - -// /** -// * @notice Determine the prior number of votes for an account as of a block number -// * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. -// * @param account The address of the account to check -// * @param blockNumber The block number to get the vote balance at -// * @return The number of votes the account had as of the given block -// */ -// function getPriorVotes( -// address account, -// uint256 blockNumber -// ) public view returns (uint96) { -// require( -// blockNumber < block.number, -// "Uni::getPriorVotes: not yet determined" -// ); - -// uint32 nCheckpoints = numCheckpoints[account]; -// if (nCheckpoints == 0) { -// return 0; -// } - -// // First check most recent balance -// if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { -// return checkpoints[account][nCheckpoints - 1].votes; -// } - -// // Next check implicit zero balance -// if (checkpoints[account][0].fromBlock > blockNumber) { -// return 0; -// } - -// uint32 lower = 0; -// uint32 upper = nCheckpoints - 1; -// while (upper > lower) { -// uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow -// Checkpoint memory cp = checkpoints[account][center]; -// if (cp.fromBlock == blockNumber) { -// return cp.votes; -// } else if (cp.fromBlock < blockNumber) { -// lower = center; -// } else { -// upper = center - 1; -// } -// } -// return checkpoints[account][lower].votes; -// } - -// function _delegate(address delegator, address delegatee) internal { -// address currentDelegate = delegates[delegator]; -// uint96 delegatorBalance = balances[delegator]; -// delegates[delegator] = delegatee; - -// emit DelegateChanged(delegator, currentDelegate, delegatee); - -// _moveDelegates(currentDelegate, delegatee, delegatorBalance); -// } - -// function _transferTokens(address src, address dst, uint96 amount) internal { -// require( -// src != address(0), -// "Uni::_transferTokens: cannot transfer from the zero address" -// ); -// require( -// dst != address(0), -// "Uni::_transferTokens: cannot transfer to the zero address" -// ); - -// balances[src] = sub96( -// balances[src], -// amount, -// "Uni::_transferTokens: transfer amount exceeds balance" -// ); -// balances[dst] = add96( -// balances[dst], -// amount, -// "Uni::_transferTokens: transfer amount overflows" -// ); -// emit Transfer(src, dst, amount); - -// _moveDelegates(delegates[src], delegates[dst], amount); -// } - -// function _moveDelegates( -// address srcRep, -// address dstRep, -// uint96 amount -// ) internal { -// if (srcRep != dstRep && amount > 0) { -// if (srcRep != address(0)) { -// uint32 srcRepNum = numCheckpoints[srcRep]; -// uint96 srcRepOld = srcRepNum > 0 -// ? checkpoints[srcRep][srcRepNum - 1].votes -// : 0; -// uint96 srcRepNew = sub96( -// srcRepOld, -// amount, -// "Uni::_moveVotes: vote amount underflows" -// ); -// _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); -// } - -// if (dstRep != address(0)) { -// uint32 dstRepNum = numCheckpoints[dstRep]; -// uint96 dstRepOld = dstRepNum > 0 -// ? checkpoints[dstRep][dstRepNum - 1].votes -// : 0; -// uint96 dstRepNew = add96( -// dstRepOld, -// amount, -// "Uni::_moveVotes: vote amount overflows" -// ); -// _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); -// } -// } -// } - -// function _writeCheckpoint( -// address delegatee, -// uint32 nCheckpoints, -// uint96 oldVotes, -// uint96 newVotes -// ) internal { -// uint32 blockNumber = safe32( -// block.number, -// "Uni::_writeCheckpoint: block number exceeds 32 bits" -// ); - -// if ( -// nCheckpoints > 0 && -// checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber -// ) { -// checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; -// } else { -// checkpoints[delegatee][nCheckpoints] = Checkpoint( -// blockNumber, -// newVotes -// ); -// numCheckpoints[delegatee] = nCheckpoints + 1; -// } - -// emit DelegateVotesChanged(delegatee, oldVotes, newVotes); -// } - -// function safe32( -// uint256 n, -// string memory errorMessage -// ) internal pure returns (uint32) { -// require(n < 2 ** 32, errorMessage); -// return uint32(n); -// } - -// function safe96( -// uint256 n, -// string memory errorMessage -// ) internal pure returns (uint96) { -// require(n < 2 ** 96, errorMessage); -// return uint96(n); -// } - -// function add96( -// uint96 a, -// uint96 b, -// string memory errorMessage -// ) internal pure returns (uint96) { -// uint96 c = a + b; -// require(c >= a, errorMessage); -// return c; -// } - -// function sub96( -// uint96 a, -// uint96 b, -// string memory errorMessage -// ) internal pure returns (uint96) { -// require(b <= a, errorMessage); -// return a - b; -// } - -// function getChainId() internal pure returns (uint256) { -// uint256 chainId; -// assembly { -// chainId := chainid() -// } -// return chainId; -// } -// } +/** + *Submitted for verification at Etherscan.io on 2020-09-16 + */ + +/** + *Submitted for verification at Etherscan.io on 2020-09-15 + */ + +pragma solidity ^0.5.16; +pragma experimental ABIEncoderV2; + +// From https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/Math.sol +// Subject to the MIT license. + +/** + * @dev Wrappers over Solidity's arithmetic operations with added overflow + * checks. + * + * Arithmetic operations in Solidity wrap on overflow. This can easily result + * in bugs, because programmers usually assume that an overflow raises an + * error, which is the standard behavior in high level programming languages. + * `SafeMath` restores this intuition by reverting the transaction when an + * operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + */ +library SafeMath { + /** + * @dev Returns the addition of two unsigned integers, reverting on overflow. + * + * Counterpart to Solidity's `+` operator. + * + * Requirements: + * - Addition cannot overflow. + */ + function add(uint256 a, uint256 b) internal pure returns (uint256) { + uint256 c = a + b; + require(c >= a, "SafeMath: addition overflow"); + + return c; + } + + /** + * @dev Returns the addition of two unsigned integers, reverting with custom message on overflow. + * + * Counterpart to Solidity's `+` operator. + * + * Requirements: + * - Addition cannot overflow. + */ + function add( + uint256 a, + uint256 b, + string memory errorMessage + ) internal pure returns (uint256) { + uint256 c = a + b; + require(c >= a, errorMessage); + + return c; + } + + /** + * @dev Returns the subtraction of two unsigned integers, reverting on underflow (when the result is negative). + * + * Counterpart to Solidity's `-` operator. + * + * Requirements: + * - Subtraction cannot underflow. + */ + function sub(uint256 a, uint256 b) internal pure returns (uint256) { + return sub(a, b, "SafeMath: subtraction underflow"); + } + + /** + * @dev Returns the subtraction of two unsigned integers, reverting with custom message on underflow (when the result is negative). + * + * Counterpart to Solidity's `-` operator. + * + * Requirements: + * - Subtraction cannot underflow. + */ + function sub( + uint256 a, + uint256 b, + string memory errorMessage + ) internal pure returns (uint256) { + require(b <= a, errorMessage); + uint256 c = a - b; + + return c; + } + + /** + * @dev Returns the multiplication of two unsigned integers, reverting on overflow. + * + * Counterpart to Solidity's `*` operator. + * + * Requirements: + * - Multiplication cannot overflow. + */ + function mul(uint256 a, uint256 b) internal pure returns (uint256) { + // Gas optimization: this is cheaper than requiring 'a' not being zero, but the + // benefit is lost if 'b' is also tested. + // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 + if (a == 0) { + return 0; + } + + uint256 c = a * b; + require(c / a == b, "SafeMath: multiplication overflow"); + + return c; + } + + /** + * @dev Returns the multiplication of two unsigned integers, reverting on overflow. + * + * Counterpart to Solidity's `*` operator. + * + * Requirements: + * - Multiplication cannot overflow. + */ + function mul( + uint256 a, + uint256 b, + string memory errorMessage + ) internal pure returns (uint256) { + // Gas optimization: this is cheaper than requiring 'a' not being zero, but the + // benefit is lost if 'b' is also tested. + // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 + if (a == 0) { + return 0; + } + + uint256 c = a * b; + require(c / a == b, errorMessage); + + return c; + } + + /** + * @dev Returns the integer division of two unsigned integers. + * Reverts on division by zero. The result is rounded towards zero. + * + * Counterpart to Solidity's `/` operator. Note: this function uses a + * `revert` opcode (which leaves remaining gas untouched) while Solidity + * uses an invalid opcode to revert (consuming all remaining gas). + * + * Requirements: + * - The divisor cannot be zero. + */ + function div(uint256 a, uint256 b) internal pure returns (uint256) { + return div(a, b, "SafeMath: division by zero"); + } + + /** + * @dev Returns the integer division of two unsigned integers. + * Reverts with custom message on division by zero. The result is rounded towards zero. + * + * Counterpart to Solidity's `/` operator. Note: this function uses a + * `revert` opcode (which leaves remaining gas untouched) while Solidity + * uses an invalid opcode to revert (consuming all remaining gas). + * + * Requirements: + * - The divisor cannot be zero. + */ + function div( + uint256 a, + uint256 b, + string memory errorMessage + ) internal pure returns (uint256) { + // Solidity only automatically asserts when dividing by 0 + require(b > 0, errorMessage); + uint256 c = a / b; + // assert(a == b * c + a % b); // There is no case in which this doesn't hold + + return c; + } + + /** + * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), + * Reverts when dividing by zero. + * + * Counterpart to Solidity's `%` operator. This function uses a `revert` + * opcode (which leaves remaining gas untouched) while Solidity uses an + * invalid opcode to revert (consuming all remaining gas). + * + * Requirements: + * - The divisor cannot be zero. + */ + function mod(uint256 a, uint256 b) internal pure returns (uint256) { + return mod(a, b, "SafeMath: modulo by zero"); + } + + /** + * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), + * Reverts with custom message when dividing by zero. + * + * Counterpart to Solidity's `%` operator. This function uses a `revert` + * opcode (which leaves remaining gas untouched) while Solidity uses an + * invalid opcode to revert (consuming all remaining gas). + * + * Requirements: + * - The divisor cannot be zero. + */ + function mod( + uint256 a, + uint256 b, + string memory errorMessage + ) internal pure returns (uint256) { + require(b != 0, errorMessage); + return a % b; + } +} + +contract Uni { + /// @notice EIP-20 token name for this token + string public constant name = "Uniswap"; + + /// @notice EIP-20 token symbol for this token + string public constant symbol = "UNI"; + + /// @notice EIP-20 token decimals for this token + uint8 public constant decimals = 18; + + /// @notice Total number of tokens in circulation + uint256 public totalSupply = 1_000_000_000e18; // 1 billion Uni + + /// @notice Address which may mint new tokens + address public minter; + + /// @notice The timestamp after which minting may occur + uint256 public mintingAllowedAfter; + + /// @notice Minimum time between mints + uint32 public constant minimumTimeBetweenMints = 1 days * 365; + + /// @notice Cap on the percentage of totalSupply that can be minted at each mint + uint8 public constant mintCap = 2; + + /// @notice Allowance amounts on behalf of others + mapping(address => mapping(address => uint96)) internal allowances; + + /// @notice Official record of token balances for each account + mapping(address => uint96) internal balances; + + /// @notice A record of each accounts delegate + mapping(address => address) public delegates; + + /// @notice A checkpoint for marking number of votes from a given block + struct Checkpoint { + uint32 fromBlock; + uint96 votes; + } + + /// @notice A record of votes checkpoints for each account, by index + mapping(address => mapping(uint32 => Checkpoint)) public checkpoints; + + /// @notice The number of checkpoints for each account + mapping(address => uint32) public numCheckpoints; + + /// @notice The EIP-712 typehash for the contract's domain + bytes32 public constant DOMAIN_TYPEHASH = + keccak256( + "EIP712Domain(string name,uint256 chainId,address verifyingContract)" + ); + + /// @notice The EIP-712 typehash for the delegation struct used by the contract + bytes32 public constant DELEGATION_TYPEHASH = + keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); + + /// @notice The EIP-712 typehash for the permit struct used by the contract + bytes32 public constant PERMIT_TYPEHASH = + keccak256( + "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" + ); + + /// @notice A record of states for signing / validating signatures + mapping(address => uint256) public nonces; + + /// @notice An event thats emitted when the minter address is changed + event MinterChanged(address minter, address newMinter); + + /// @notice An event thats emitted when an account changes its delegate + event DelegateChanged( + address indexed delegator, + address indexed fromDelegate, + address indexed toDelegate + ); + + /// @notice An event thats emitted when a delegate account's vote balance changes + event DelegateVotesChanged( + address indexed delegate, + uint256 previousBalance, + uint256 newBalance + ); + + /// @notice The standard EIP-20 transfer event + event Transfer(address indexed from, address indexed to, uint256 amount); + + /// @notice The standard EIP-20 approval event + event Approval( + address indexed owner, + address indexed spender, + uint256 amount + ); + + /** + * @notice Construct a new Uni token + * @param account The initial account to grant all the tokens + * @param minter_ The account with minting ability + * @param mintingAllowedAfter_ The timestamp after which minting may occur + */ + constructor( + address account, + address minter_, + uint256 mintingAllowedAfter_ + ) public { + require( + mintingAllowedAfter_ >= block.timestamp, + "Uni::constructor: minting can only begin after deployment" + ); + + balances[account] = uint96(totalSupply); + emit Transfer(address(0), account, totalSupply); + minter = minter_; + emit MinterChanged(address(0), minter); + mintingAllowedAfter = mintingAllowedAfter_; + } + + /** + * @notice Change the minter address + * @param minter_ The address of the new minter + */ + function setMinter(address minter_) external { + require( + msg.sender == minter, + "Uni::setMinter: only the minter can change the minter address" + ); + emit MinterChanged(minter, minter_); + minter = minter_; + } + + /** + * @notice Mint new tokens + * @param dst The address of the destination account + * @param rawAmount The number of tokens to be minted + */ + function mint(address dst, uint256 rawAmount) external { + require(msg.sender == minter, "Uni::mint: only the minter can mint"); + require( + block.timestamp >= mintingAllowedAfter, + "Uni::mint: minting not allowed yet" + ); + require( + dst != address(0), + "Uni::mint: cannot transfer to the zero address" + ); + + // record the mint + mintingAllowedAfter = SafeMath.add( + block.timestamp, + minimumTimeBetweenMints + ); + + // mint the amount + uint96 amount = safe96(rawAmount, "Uni::mint: amount exceeds 96 bits"); + require( + amount <= SafeMath.div(SafeMath.mul(totalSupply, mintCap), 100), + "Uni::mint: exceeded mint cap" + ); + totalSupply = safe96( + SafeMath.add(totalSupply, amount), + "Uni::mint: totalSupply exceeds 96 bits" + ); + + // transfer the amount to the recipient + balances[dst] = add96( + balances[dst], + amount, + "Uni::mint: transfer amount overflows" + ); + emit Transfer(address(0), dst, amount); + + // move delegates + _moveDelegates(address(0), delegates[dst], amount); + } + + /** + * @notice Get the number of tokens `spender` is approved to spend on behalf of `account` + * @param account The address of the account holding the funds + * @param spender The address of the account spending the funds + * @return The number of tokens approved + */ + function allowance( + address account, + address spender + ) external view returns (uint256) { + return allowances[account][spender]; + } + + /** + * @notice Approve `spender` to transfer up to `amount` from `src` + * @dev This will overwrite the approval amount for `spender` + * and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve) + * @param spender The address of the account which may transfer tokens + * @param rawAmount The number of tokens that are approved (2^256-1 means infinite) + * @return Whether or not the approval succeeded + */ + function approve( + address spender, + uint256 rawAmount + ) external returns (bool) { + uint96 amount; + if (rawAmount == uint256(-1)) { + amount = uint96(-1); + } else { + amount = safe96(rawAmount, "Uni::approve: amount exceeds 96 bits"); + } + + allowances[msg.sender][spender] = amount; + + emit Approval(msg.sender, spender, amount); + return true; + } + + /** + * @notice Triggers an approval from owner to spends + * @param owner The address to approve from + * @param spender The address to be approved + * @param rawAmount The number of tokens that are approved (2^256-1 means infinite) + * @param deadline The time at which to expire the signature + * @param v The recovery byte of the signature + * @param r Half of the ECDSA signature pair + * @param s Half of the ECDSA signature pair + */ + function permit( + address owner, + address spender, + uint256 rawAmount, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external { + uint96 amount; + if (rawAmount == uint256(-1)) { + amount = uint96(-1); + } else { + amount = safe96(rawAmount, "Uni::permit: amount exceeds 96 bits"); + } + + bytes32 domainSeparator = keccak256( + abi.encode( + DOMAIN_TYPEHASH, + keccak256(bytes(name)), + getChainId(), + address(this) + ) + ); + bytes32 structHash = keccak256( + abi.encode( + PERMIT_TYPEHASH, + owner, + spender, + rawAmount, + nonces[owner]++, + deadline + ) + ); + bytes32 digest = keccak256( + abi.encodePacked("\x19\x01", domainSeparator, structHash) + ); + address signatory = ecrecover(digest, v, r, s); + require(signatory != address(0), "Uni::permit: invalid signature"); + require(signatory == owner, "Uni::permit: unauthorized"); + require(now <= deadline, "Uni::permit: signature expired"); + + allowances[owner][spender] = amount; + + emit Approval(owner, spender, amount); + } + + /** + * @notice Get the number of tokens held by the `account` + * @param account The address of the account to get the balance of + * @return The number of tokens held + */ + function balanceOf(address account) external view returns (uint256) { + return balances[account]; + } + + /** + * @notice Transfer `amount` tokens from `msg.sender` to `dst` + * @param dst The address of the destination account + * @param rawAmount The number of tokens to transfer + * @return Whether or not the transfer succeeded + */ + function transfer(address dst, uint256 rawAmount) external returns (bool) { + uint96 amount = safe96( + rawAmount, + "Uni::transfer: amount exceeds 96 bits" + ); + _transferTokens(msg.sender, dst, amount); + return true; + } + + /** + * @notice Transfer `amount` tokens from `src` to `dst` + * @param src The address of the source account + * @param dst The address of the destination account + * @param rawAmount The number of tokens to transfer + * @return Whether or not the transfer succeeded + */ + function transferFrom( + address src, + address dst, + uint256 rawAmount + ) external returns (bool) { + address spender = msg.sender; + uint96 spenderAllowance = allowances[src][spender]; + uint96 amount = safe96( + rawAmount, + "Uni::approve: amount exceeds 96 bits" + ); + + if (spender != src && spenderAllowance != uint96(-1)) { + uint96 newAllowance = sub96( + spenderAllowance, + amount, + "Uni::transferFrom: transfer amount exceeds spender allowance" + ); + allowances[src][spender] = newAllowance; + + emit Approval(src, spender, newAllowance); + } + + _transferTokens(src, dst, amount); + return true; + } + + /** + * @notice Delegate votes from `msg.sender` to `delegatee` + * @param delegatee The address to delegate votes to + */ + function delegate(address delegatee) public { + return _delegate(msg.sender, delegatee); + } + + /** + * @notice Delegates votes from signatory to `delegatee` + * @param delegatee The address to delegate votes to + * @param nonce The contract state required to match the signature + * @param expiry The time at which to expire the signature + * @param v The recovery byte of the signature + * @param r Half of the ECDSA signature pair + * @param s Half of the ECDSA signature pair + */ + function delegateBySig( + address delegatee, + uint256 nonce, + uint256 expiry, + uint8 v, + bytes32 r, + bytes32 s + ) public { + bytes32 domainSeparator = keccak256( + abi.encode( + DOMAIN_TYPEHASH, + keccak256(bytes(name)), + getChainId(), + address(this) + ) + ); + bytes32 structHash = keccak256( + abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry) + ); + bytes32 digest = keccak256( + abi.encodePacked("\x19\x01", domainSeparator, structHash) + ); + address signatory = ecrecover(digest, v, r, s); + require( + signatory != address(0), + "Uni::delegateBySig: invalid signature" + ); + require( + nonce == nonces[signatory]++, + "Uni::delegateBySig: invalid nonce" + ); + require(now <= expiry, "Uni::delegateBySig: signature expired"); + return _delegate(signatory, delegatee); + } + + /** + * @notice Gets the current votes balance for `account` + * @param account The address to get votes balance + * @return The number of current votes for `account` + */ + function getCurrentVotes(address account) external view returns (uint96) { + uint32 nCheckpoints = numCheckpoints[account]; + return + nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; + } + + /** + * @notice Determine the prior number of votes for an account as of a block number + * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. + * @param account The address of the account to check + * @param blockNumber The block number to get the vote balance at + * @return The number of votes the account had as of the given block + */ + function getPriorVotes( + address account, + uint256 blockNumber + ) public view returns (uint96) { + require( + blockNumber < block.number, + "Uni::getPriorVotes: not yet determined" + ); + + uint32 nCheckpoints = numCheckpoints[account]; + if (nCheckpoints == 0) { + return 0; + } + + // First check most recent balance + if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { + return checkpoints[account][nCheckpoints - 1].votes; + } + + // Next check implicit zero balance + if (checkpoints[account][0].fromBlock > blockNumber) { + return 0; + } + + uint32 lower = 0; + uint32 upper = nCheckpoints - 1; + while (upper > lower) { + uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow + Checkpoint memory cp = checkpoints[account][center]; + if (cp.fromBlock == blockNumber) { + return cp.votes; + } else if (cp.fromBlock < blockNumber) { + lower = center; + } else { + upper = center - 1; + } + } + return checkpoints[account][lower].votes; + } + + function _delegate(address delegator, address delegatee) internal { + address currentDelegate = delegates[delegator]; + uint96 delegatorBalance = balances[delegator]; + delegates[delegator] = delegatee; + + emit DelegateChanged(delegator, currentDelegate, delegatee); + + _moveDelegates(currentDelegate, delegatee, delegatorBalance); + } + + function _transferTokens(address src, address dst, uint96 amount) internal { + require( + src != address(0), + "Uni::_transferTokens: cannot transfer from the zero address" + ); + require( + dst != address(0), + "Uni::_transferTokens: cannot transfer to the zero address" + ); + + balances[src] = sub96( + balances[src], + amount, + "Uni::_transferTokens: transfer amount exceeds balance" + ); + balances[dst] = add96( + balances[dst], + amount, + "Uni::_transferTokens: transfer amount overflows" + ); + emit Transfer(src, dst, amount); + + _moveDelegates(delegates[src], delegates[dst], amount); + } + + function _moveDelegates( + address srcRep, + address dstRep, + uint96 amount + ) internal { + if (srcRep != dstRep && amount > 0) { + if (srcRep != address(0)) { + uint32 srcRepNum = numCheckpoints[srcRep]; + uint96 srcRepOld = srcRepNum > 0 + ? checkpoints[srcRep][srcRepNum - 1].votes + : 0; + uint96 srcRepNew = sub96( + srcRepOld, + amount, + "Uni::_moveVotes: vote amount underflows" + ); + _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); + } + + if (dstRep != address(0)) { + uint32 dstRepNum = numCheckpoints[dstRep]; + uint96 dstRepOld = dstRepNum > 0 + ? checkpoints[dstRep][dstRepNum - 1].votes + : 0; + uint96 dstRepNew = add96( + dstRepOld, + amount, + "Uni::_moveVotes: vote amount overflows" + ); + _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); + } + } + } + + function _writeCheckpoint( + address delegatee, + uint32 nCheckpoints, + uint96 oldVotes, + uint96 newVotes + ) internal { + uint32 blockNumber = safe32( + block.number, + "Uni::_writeCheckpoint: block number exceeds 32 bits" + ); + + if ( + nCheckpoints > 0 && + checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber + ) { + checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; + } else { + checkpoints[delegatee][nCheckpoints] = Checkpoint( + blockNumber, + newVotes + ); + numCheckpoints[delegatee] = nCheckpoints + 1; + } + + emit DelegateVotesChanged(delegatee, oldVotes, newVotes); + } + + function safe32( + uint256 n, + string memory errorMessage + ) internal pure returns (uint32) { + require(n < 2 ** 32, errorMessage); + return uint32(n); + } + + function safe96( + uint256 n, + string memory errorMessage + ) internal pure returns (uint96) { + require(n < 2 ** 96, errorMessage); + return uint96(n); + } + + function add96( + uint96 a, + uint96 b, + string memory errorMessage + ) internal pure returns (uint96) { + uint96 c = a + b; + require(c >= a, errorMessage); + return c; + } + + function sub96( + uint96 a, + uint96 b, + string memory errorMessage + ) internal pure returns (uint96) { + require(b <= a, errorMessage); + return a - b; + } + + function getChainId() internal pure returns (uint256) { + uint256 chainId; + assembly { + chainId := chainid() + } + return chainId; + } +} diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index 2b4f8316d..1251d8846 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -316,7 +316,7 @@ contract PolygonZkEVMBridgeV2 is address destinationAddress, bool forceUpdateGlobalExitRoot, bytes calldata metadata - ) external payable { + ) external payable ifNotEmergencyState { // If exist a gas token, only allow call this function without value if (msg.value != 0 && address(WETHToken) != address(0)) { revert NoValueInMessagesOnGasTokenNetworks(); @@ -346,7 +346,7 @@ contract PolygonZkEVMBridgeV2 is uint256 amountWETH, bool forceUpdateGlobalExitRoot, bytes calldata metadata - ) external { + ) external ifNotEmergencyState { // If native token is ether, disable this function if (address(WETHToken) == address(0)) { revert NativeTokenIsEther(); diff --git a/contracts/v2/mocks/PolygonRollupManagerEmptyMock.sol b/contracts/v2/mocks/PolygonRollupManagerEmptyMock.sol new file mode 100644 index 000000000..ae9a44ba8 --- /dev/null +++ b/contracts/v2/mocks/PolygonRollupManagerEmptyMock.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.20; +import "../PolygonRollupManager.sol"; +import "../interfaces/IPolygonRollupBase.sol"; +import "../../lib/EmergencyManager.sol"; + +/** + * PolygonRollupManager used only to test conensus contracts + */ +contract PolygonRollupManagerEmptyMock is EmergencyManager { + function onSequenceBatches( + uint64 newSequencedBatches, + bytes32 newAccInputHash + ) external returns (uint64) { + return 1; + } + + function onVerifyBatches( + uint64 finalNewBatch, + bytes32 newStateRoot, + IPolygonRollupBase rollup + ) external returns (uint64) { + rollup.onVerifyBatches(finalNewBatch, newStateRoot, msg.sender); + } + + function getBatchFee() public view returns (uint256) { + return 1; + } + + function getForcedBatchFee() public view returns (uint256) { + return 10; + } +} diff --git a/package-lock.json b/package-lock.json index 982589000..d7ed0d6a6 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.3", + "@openzeppelin/hardhat-upgrades": "2.5.0", "@types/yargs": "^17.0.28", "circomlibjs": "0.1.1", "dotenv": "^8.6.0", @@ -128,12 +128,12 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.428.0.tgz", - "integrity": "sha512-4T0Ps2spjg3qbWE6ZK13Vd3FnzpfliaiotqjxUK5YhjDrKXeT36HJp46JhDupElQuHtTkpdiJOSYk2lvY2H4IA==", + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.468.0.tgz", + "integrity": "sha512-rx/9uHI4inRbp2tw3Y4Ih4PNZkVj32h7WneSg3MVgVjAoVD5Zti9KhS5hkvsBxfgmQmg0AQbE+b1sy5WGAgntA==", "dev": true, "dependencies": { - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.7.0", "tslib": "^2.5.0" }, "engines": { @@ -3254,12 +3254,12 @@ "dev": true }, "node_modules/@openzeppelin/defender-admin-client": { - "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==", + "version": "1.54.1", + "resolved": "https://registry.npmjs.org/@openzeppelin/defender-admin-client/-/defender-admin-client-1.54.1.tgz", + "integrity": "sha512-kRpSUdTsnSqntp4FOXIm95t+6VKHc8CUY2Si71VDuxs0q7HSPZkdpRPSntcolwEzWy9L4a8NS/QMwDF5NJ4X1g==", "dev": true, "dependencies": { - "@openzeppelin/defender-base-client": "1.49.0", + "@openzeppelin/defender-base-client": "1.54.1", "axios": "^1.4.0", "ethers": "^5.7.2", "lodash": "^4.17.19", @@ -3315,9 +3315,9 @@ } }, "node_modules/@openzeppelin/defender-base-client": { - "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==", + "version": "1.54.1", + "resolved": "https://registry.npmjs.org/@openzeppelin/defender-base-client/-/defender-base-client-1.54.1.tgz", + "integrity": "sha512-DRGz/7KN3ZQwu28YWMOaojrC7jjPkz/uCwkC8/C8B11qwZhA5qIVvyhYHhhFOCl0J84+E3TNdvkPD2q3p2WaJw==", "dev": true, "dependencies": { "amazon-cognito-identity-js": "^6.0.1", @@ -3328,38 +3328,38 @@ } }, "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==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/defender-sdk-base-client/-/defender-sdk-base-client-1.7.0.tgz", + "integrity": "sha512-tNT/uaAS37I+EZUVcH6AyM6gfvxiiBQ+tdY8Jk73XKtEdiYd0pJnKyaeeUHIlvKCNS/wyxX6hlPVjeC4hy59Nw==", "dev": true, "dependencies": { - "amazon-cognito-identity-js": "^6.0.1", + "amazon-cognito-identity-js": "^6.3.6", "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==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/defender-sdk-deploy-client/-/defender-sdk-deploy-client-1.7.0.tgz", + "integrity": "sha512-eu/1khO5R0IdHio3BXlzUWZdr0Rgodoi49Djqtl3N78G8yN7t4RijfGrJm9rSqjrDFsjM41eWNHYGjc+KKyhKg==", "dev": true, "dependencies": { - "@ethersproject/abi": "^5.6.3", - "@openzeppelin/defender-sdk-base-client": "^1.3.0", + "@ethersproject/abi": "^5.7.0", + "@openzeppelin/defender-sdk-base-client": "^1.7.0", "axios": "^1.4.0", "lodash": "^4.17.21" } }, "node_modules/@openzeppelin/hardhat-upgrades": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-2.3.3.tgz", - "integrity": "sha512-rF87xYSz6Q2WFq5zcUF1T1tx3Kiq83hmke0xOBn5Qgrl++osseiDwS5oXfDK3NSWvj06oYGLERRGHcXnpQ31FQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-2.5.0.tgz", + "integrity": "sha512-pRsqyRbp8LX9sTSMbL7jx4NjqjN/4PlKngmuAyRQIheYTGbRIs3FW3WyLuiCjkDlTETfmOsmzrnZxJmxDmxZIA==", "dev": true, "dependencies": { - "@openzeppelin/defender-admin-client": "^1.48.0", - "@openzeppelin/defender-base-client": "^1.48.0", - "@openzeppelin/defender-sdk-base-client": "^1.2.0", - "@openzeppelin/defender-sdk-deploy-client": "^1.2.0", - "@openzeppelin/upgrades-core": "^1.30.1", + "@openzeppelin/defender-admin-client": "^1.52.0", + "@openzeppelin/defender-base-client": "^1.52.0", + "@openzeppelin/defender-sdk-base-client": "^1.5.0", + "@openzeppelin/defender-sdk-deploy-client": "^1.5.0", + "@openzeppelin/upgrades-core": "^1.31.2", "chalk": "^4.1.0", "debug": "^4.1.1", "ethereumjs-util": "^7.1.5", @@ -3966,9 +3966,9 @@ } }, "node_modules/@smithy/types": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.5.tgz", - "integrity": "sha512-ehyDt8M9hehyxrLQGoA1BGPou8Js1Ocoh5M0ngDhJMqbFmNK5N6Xhr9/ZExWkyIW8XcGkiMPq3ZUEE0ScrhbuQ==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.7.0.tgz", + "integrity": "sha512-1OIFyhK+vOkMbu4aN2HZz/MomREkrAC/HqY5mlJMUJfGrPRwijJDTeiN8Rnj9zUaB8ogXAfIOtZrrgqZ4w7Wnw==", "dev": true, "dependencies": { "tslib": "^2.5.0" @@ -4466,9 +4466,9 @@ } }, "node_modules/amazon-cognito-identity-js": { - "version": "6.3.6", - "resolved": "https://registry.npmjs.org/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.6.tgz", - "integrity": "sha512-kBq+GE6OkLrxtFj3ZduIOlKBFYeOqZK3EhxbDBkv476UTvy+uwfR0tlriTq2QzNdnvlQAjBIXnXuOM7DwR1UEQ==", + "version": "6.3.7", + "resolved": "https://registry.npmjs.org/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.7.tgz", + "integrity": "sha512-tSjnM7KyAeOZ7UMah+oOZ6cW4Gf64FFcc7BE2l7MTcp7ekAPrXaCbpcW2xEpH1EiDS4cPcAouHzmCuc2tr72vQ==", "dev": true, "dependencies": { "@aws-crypto/sha256-js": "1.2.2", @@ -21282,9 +21282,9 @@ } }, "node_modules/solidity-ast": { - "version": "0.4.52", - "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.52.tgz", - "integrity": "sha512-iOya9BSiB9jhM8Vf40n8lGELGzwrUc57rl5BhfNtJ5cvAaMvRcNlHeAMNvqJJyjoUnczqRbHqdivEqK89du3Cw==", + "version": "0.4.55", + "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.55.tgz", + "integrity": "sha512-qeEU/r/K+V5lrAw8iswf2/yfWAnSGs3WKPHI+zAFKFjX0dIBVXEU/swQ8eJQYHf6PJWUZFO2uWV4V1wEOkeQbA==", "dev": true, "dependencies": { "array.prototype.findlast": "^1.2.2" diff --git a/package.json b/package.json index 4d0c928a3..d92adee1d 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.3", + "@openzeppelin/hardhat-upgrades": "2.5.0", "@types/yargs": "^17.0.28", "circomlibjs": "0.1.1", "dotenv": "^8.6.0", diff --git a/src/permit-helper.js b/src/permit-helper.js index 3edd40185..b745a6da6 100644 --- a/src/permit-helper.js +++ b/src/permit-helper.js @@ -19,7 +19,7 @@ async function createPermitSignature(tokenContractInstance, wallet, spenderAddre name, version: '1', chainId, - verifyingContract: tokenContractInstance.address, + verifyingContract: tokenContractInstance.target, }; // The named list of all type definitions @@ -42,9 +42,10 @@ async function createPermitSignature(tokenContractInstance, wallet, spenderAddre deadline, }; - const rawSignature = await wallet._signTypedData(domain, types, values); - const signature = ethers.splitSignature(rawSignature); + const rawSignature = await wallet.signTypedData(domain, types, values); + const signature = ethers.Signature.from(rawSignature); const recoveredAddressTyped = ethers.verifyTypedData(domain, types, values, rawSignature); + expect(recoveredAddressTyped).to.be.equal(wallet.address); return signature; @@ -70,7 +71,7 @@ async function createPermitSignatureDaiType(tokenContractInstance, wallet, spend name, version, chainId, - verifyingContract: tokenContractInstance.address, + verifyingContract: tokenContractInstance.target, }; // The named list of all type definitions @@ -93,10 +94,9 @@ async function createPermitSignatureDaiType(tokenContractInstance, wallet, spend allowed: true, }; - const rawSignature = await wallet._signTypedData(domain, types, values); - const signature = ethers.splitSignature(rawSignature); + const rawSignature = await wallet.signTypedData(domain, types, values); + const signature = ethers.Signature.from(rawSignature); const recoveredAddressTyped = ethers.verifyTypedData(domain, types, values, rawSignature); - expect(recoveredAddressTyped).to.be.equal(wallet.address); return signature; @@ -120,7 +120,7 @@ async function createPermitSignatureUniType(tokenContractInstance, wallet, spend const domain = { name, chainId, - verifyingContract: tokenContractInstance.address, + verifyingContract: tokenContractInstance.target, }; // The named list of all type definitions @@ -143,8 +143,8 @@ async function createPermitSignatureUniType(tokenContractInstance, wallet, spend deadline, }; - const rawSignature = await wallet._signTypedData(domain, types, values); - const signature = ethers.splitSignature(rawSignature); + const rawSignature = await wallet.signTypedData(domain, types, values); + const signature = ethers.Signature.from(rawSignature); const recoveredAddressTyped = ethers.verifyTypedData(domain, types, values, rawSignature); expect(recoveredAddressTyped).to.be.equal(wallet.address); diff --git a/test/contractsv2/BridgeV2.test.ts b/test/contractsv2/BridgeV2.test.ts index ceb490d39..9e6161326 100644 --- a/test/contractsv2/BridgeV2.test.ts +++ b/test/contractsv2/BridgeV2.test.ts @@ -90,10 +90,28 @@ describe("PolygonZkEVMBridge Contract", () => { ); }); - it("should check the constructor parameters", async () => { + it("should check the initialize parameters", async () => { expect(await polygonZkEVMBridgeContract.globalExitRootManager()).to.be.equal(polygonZkEVMGlobalExitRoot.target); expect(await polygonZkEVMBridgeContract.networkID()).to.be.equal(networkIDMainnet); expect(await polygonZkEVMBridgeContract.polygonRollupManager()).to.be.equal(rollupManager.address); + + // cannot initialzie again + await expect( + polygonZkEVMBridgeContract.initialize( + networkIDMainnet, + ethers.ZeroAddress, // zero for ether + ethers.ZeroAddress, // zero for ether + polygonZkEVMGlobalExitRoot.target, + rollupManager.address, + "0x" + ) + ).to.be.revertedWith("Initializable: contract is already initialized"); + }); + + it("should check bridgeMessageWETH reverts", async () => { + await expect( + polygonZkEVMBridgeContract.bridgeMessageWETH(networkIDMainnet, deployer.address, 0, true, "0x") + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "NativeTokenIsEther"); }); it("should PolygonZkEVM bridge asset and verify merkle proof", async () => { @@ -217,6 +235,10 @@ describe("PolygonZkEVMBridge Contract", () => { merkleTree.add(leafValue); const rootJSMainnet = merkleTree.getRoot(); + await expect( + polygonZkEVMBridgeContract.bridgeMessage(networkIDMainnet, destinationAddress, true, "0x") + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "DestinationNetworkInvalid"); + await expect( polygonZkEVMBridgeContract.bridgeMessage(destinationNetwork, destinationAddress, true, metadata, { value: amount, @@ -463,6 +485,38 @@ describe("PolygonZkEVMBridge Contract", () => { ) ).to.be.revertedWith("ERC20: transfer amount exceeds balance"); + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofLocal, + proofLocal, + globalIndex, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + networkIDRollup, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "DestinationNetworkInvalid"); + + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofLocal, + proofLocal, + globalIndex, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount + 1n, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "InvalidSmtProof"); + // transfer tokens, then claim await expect(polTokenContract.transfer(polygonZkEVMBridgeContract.target, amount)) .to.emit(polTokenContract, "Transfer") @@ -772,6 +826,15 @@ describe("PolygonZkEVMBridge Contract", () => { const newTokenInfo = await polygonZkEVMBridgeContract.wrappedTokenToTokenInfo(precalculateWrappedErc20); + // Use precalculatedWrapperAddress and check if matches + expect( + await polygonZkEVMBridgeContract.calculateTokenWrapperAddress( + networkIDRollup, + tokenAddress, + precalculateWrappedErc20 + ) + ).to.be.equal(precalculateWrappedErc20); + expect(newTokenInfo.originNetwork).to.be.equal(networkIDRollup); expect(newTokenInfo.originTokenAddress).to.be.equal(tokenAddress); expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( @@ -1465,6 +1528,26 @@ describe("PolygonZkEVMBridge Contract", () => { ) ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "InvalidSmtProof"); + /* + * claim + * Can't claim invalid destination network + */ + await expect( + polygonZkEVMBridgeContract.claimMessage( + proofLocal, + proofRollup, + globalIndex, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + networkIDRollup, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "DestinationNetworkInvalid"); + /* * claim * Can't claim without ether @@ -1485,6 +1568,22 @@ describe("PolygonZkEVMBridge Contract", () => { ) ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "MessageFailed"); + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofLocal, + proofRollup, + globalIndex, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + networkIDRollup, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "DestinationNetworkInvalid"); + const balanceDeployer = await ethers.provider.getBalance(deployer.address); /* * Create a deposit to add ether to the PolygonZkEVMBridge @@ -1588,4 +1687,75 @@ describe("PolygonZkEVMBridge Contract", () => { ) ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AlreadyClaimed"); }); + + it("should test emergency state", async () => { + await expect(polygonZkEVMBridgeContract.activateEmergencyState()).to.be.revertedWithCustomError( + polygonZkEVMBridgeContract, + "OnlyRollupManager" + ); + + await expect(polygonZkEVMBridgeContract.connect(rollupManager).activateEmergencyState()).to.emit( + polygonZkEVMBridgeContract, + "EmergencyStateActivated" + ); + + const tokenAddress = polTokenContract.target; + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDRollup; + const destinationAddress = deployer.address; + + const metadata = metadataToken; + + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount, + tokenAddress, + true, + "0x" + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "OnlyNotEmergencyState"); + + await expect( + polygonZkEVMBridgeContract.bridgeMessage(destinationNetwork, destinationAddress, true, "0x") + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "OnlyNotEmergencyState"); + + await expect( + polygonZkEVMBridgeContract.bridgeMessageWETH(destinationNetwork, destinationAddress, amount, true, "0x") + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "OnlyNotEmergencyState"); + + const mockMerkleProof = new Array(32).fill(ethers.ZeroHash) as any; + await expect( + polygonZkEVMBridgeContract.claimAsset( + mockMerkleProof, + mockMerkleProof, + ethers.ZeroHash, + ethers.ZeroHash, + ethers.ZeroHash, + 0, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "OnlyNotEmergencyState"); + + await expect( + polygonZkEVMBridgeContract.claimMessage( + mockMerkleProof, + mockMerkleProof, + ethers.ZeroHash, + ethers.ZeroHash, + ethers.ZeroHash, + 0, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "OnlyNotEmergencyState"); + }); }); diff --git a/test/contractsv2/BridgeV2Metadata.test.ts b/test/contractsv2/BridgeV2Metadata.test.ts new file mode 100644 index 000000000..120d316dc --- /dev/null +++ b/test/contractsv2/BridgeV2Metadata.test.ts @@ -0,0 +1,702 @@ +import {expect} from "chai"; +import {ethers, upgrades} from "hardhat"; +import { + VerifierRollupHelperMock, + ERC20PermitMock, + PolygonRollupManagerMock, + PolygonZkEVMGlobalExitRoot, + PolygonZkEVMBridgeV2, + PolygonZkEVMV2, + PolygonRollupBase, + TokenWrapped, +} from "../../typechain-types"; +import {takeSnapshot, time} from "@nomicfoundation/hardhat-network-helpers"; +import {processorUtils, contractUtils, MTBridge, mtBridgeUtils} from "@0xpolygonhermez/zkevm-commonjs"; +const {calculateSnarkInput, calculateAccInputHash, calculateBatchHashData} = contractUtils; +const MerkleTreeBridge = MTBridge; +const {verifyMerkleProof, getLeafValue} = mtBridgeUtils; +const { + createPermitSignature, + ifacePermit, + createPermitSignatureDaiType, + ifacePermitDAI, + createPermitSignatureUniType, +} = require("../../src/permit-helper"); + +function calculateGlobalExitRoot(mainnetExitRoot: any, rollupExitRoot: any) { + return ethers.solidityPackedKeccak256(["bytes32", "bytes32"], [mainnetExitRoot, rollupExitRoot]); +} +const _GLOBAL_INDEX_MAINNET_FLAG = 2n ** 64n; + +function computeGlobalIndex(indexLocal: any, indexRollup: any, isMainnet: Boolean) { + if (isMainnet === true) { + return BigInt(indexLocal) + _GLOBAL_INDEX_MAINNET_FLAG; + } else { + return BigInt(indexLocal) + BigInt(indexRollup) * 2n ** 32n; + } +} + +describe("PolygonZkEVMBridge Contract", () => { + let polygonZkEVMBridgeContract: PolygonZkEVMBridgeV2; + let polTokenContract: ERC20PermitMock; + let polygonZkEVMGlobalExitRoot: PolygonZkEVMGlobalExitRoot; + + let deployer: any; + let rollupManager: any; + let acc1: any; + + const tokenName = "Matic Token"; + const tokenSymbol = "MATIC"; + const decimals = 18; + const tokenInitialBalance = ethers.parseEther("20000000"); + const metadataToken = ethers.AbiCoder.defaultAbiCoder().encode( + ["string", "string", "uint8"], + [tokenName, tokenSymbol, decimals] + ); + const networkIDMainnet = 0; + const networkIDRollup = 1; + + const LEAF_TYPE_ASSET = 0; + const LEAF_TYPE_MESSAGE = 1; + + const polygonZkEVMAddress = ethers.ZeroAddress; + + beforeEach("Deploy contracts", async () => { + // load signers + [deployer, rollupManager, acc1] = await ethers.getSigners(); + + // deploy PolygonZkEVMBridge + const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + polygonZkEVMBridgeContract = (await upgrades.deployProxy(polygonZkEVMBridgeFactory, [], { + initializer: false, + })) as unknown as PolygonZkEVMBridgeV2; + + // deploy global exit root manager + const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRoot"); + polygonZkEVMGlobalExitRoot = await PolygonZkEVMGlobalExitRootFactory.deploy( + rollupManager.address, + polygonZkEVMBridgeContract.target + ); + + await polygonZkEVMBridgeContract.initialize( + networkIDMainnet, + ethers.ZeroAddress, // zero for ether + ethers.ZeroAddress, // zero for ether + polygonZkEVMGlobalExitRoot.target, + rollupManager.address, + "0x" + ); + + // deploy token + const maticTokenFactory = await ethers.getContractFactory("ERC20PermitMock"); + polTokenContract = await maticTokenFactory.deploy( + tokenName, + tokenSymbol, + deployer.address, + tokenInitialBalance + ); + }); + + it("should PolygonZkEVMBridge with weird token metadata", async () => { + const weirdErc20Metadata = await ethers.getContractFactory("ERC20WeirdMetadata"); + + const nameWeird = "nameToken"; + const symbolWeird = "NTK"; + + const nameWeirdBytes32 = ethers.encodeBytes32String(nameWeird); + const symbolWeirdBytes = ethers.toUtf8Bytes(symbolWeird); + const decimalsWeird = 14; + + const weirdTokenContract = await weirdErc20Metadata.deploy( + nameWeirdBytes32, // bytes32 + symbolWeirdBytes, // bytes + decimalsWeird + ); + await weirdTokenContract.waitForDeployment(); + + // mint and approve tokens + await weirdTokenContract.mint(deployer.address, tokenInitialBalance); + await weirdTokenContract.approve(polygonZkEVMBridgeContract.target, tokenInitialBalance); + + const depositCount = await polygonZkEVMBridgeContract.depositCount(); + const originNetwork = networkIDMainnet; + const tokenAddress = weirdTokenContract.target; + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDRollup; + const destinationAddress = deployer.address; + + const metadata = ethers.AbiCoder.defaultAbiCoder().encode( + ["string", "string", "uint8"], + [nameWeird, symbolWeird, decimalsWeird] + ); + + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + // pre compute root merkle tree in Js + const height = 32; + const merkleTree = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + merkleTree.add(leafValue); + const rootJSMainnet = merkleTree.getRoot(); + + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount, + tokenAddress, + true, + "0x" + ) + ) + .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .withArgs( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata, + depositCount + ); + + expect(await polygonZkEVMBridgeContract.getRoot()).to.be.equal(rootJSMainnet); + }); + + it("should PolygonZkEVMBridge with weird token metadata with reverts", async () => { + const weirdErc20Metadata = await ethers.getContractFactory("ERC20WeirdMetadata"); + + const nameWeird = "nameToken"; + const symbolWeird = "NTK"; + + const nameWeirdBytes32 = ethers.encodeBytes32String(nameWeird); + const symbolWeirdBytes = ethers.toUtf8Bytes(symbolWeird); + const decimalsWeird = ethers.MaxUint256; + + const weirdTokenContract = await weirdErc20Metadata.deploy( + nameWeirdBytes32, // bytes32 + symbolWeirdBytes, // bytes + decimalsWeird + ); + await weirdTokenContract.waitForDeployment(); + + // mint and approve tokens + await weirdTokenContract.mint(deployer.address, tokenInitialBalance); + await weirdTokenContract.approve(polygonZkEVMBridgeContract.target, tokenInitialBalance); + + const depositCount = await polygonZkEVMBridgeContract.depositCount(); + const originNetwork = networkIDMainnet; + const tokenAddress = weirdTokenContract.target; + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDRollup; + const destinationAddress = deployer.address; + + // Since cannot decode decimals + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount, + tokenAddress, + true, + "0x" + ) + ).to.be.reverted; + + // toogle revert + await weirdTokenContract.toggleIsRevert(); + // Use revert strings + const nameRevert = "NO_NAME"; + const symbolRevert = "NO_SYMBOL"; + const decimalsTooRevert = 18; + const metadata = ethers.AbiCoder.defaultAbiCoder().encode( + ["string", "string", "uint8"], + [nameRevert, symbolRevert, decimalsTooRevert] + ); + + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + // pre compute root merkle tree in Js + const height = 32; + const merkleTree = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + merkleTree.add(leafValue); + const rootJSMainnet = merkleTree.getRoot(); + + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount, + tokenAddress, + true, + "0x" + ) + ) + .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .withArgs( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata, + depositCount + ); + + expect(await polygonZkEVMBridgeContract.getRoot()).to.be.equal(rootJSMainnet); + }); + + it("should PolygonZkEVMBridge with weird token metadata with empty data", async () => { + const weirdErc20Metadata = await ethers.getContractFactory("ERC20WeirdMetadata"); + + const nameWeird = ""; + const symbolWeird = ""; + + const nameWeirdBytes32 = ethers.encodeBytes32String(nameWeird); + const symbolWeirdBytes = ethers.toUtf8Bytes(symbolWeird); + const decimalsWeird = 255; + + const weirdTokenContract = await weirdErc20Metadata.deploy( + nameWeirdBytes32, // bytes32 + symbolWeirdBytes, // bytes + decimalsWeird + ); + await weirdTokenContract.waitForDeployment(); + + // mint and approve tokens + await weirdTokenContract.mint(deployer.address, tokenInitialBalance); + await weirdTokenContract.approve(polygonZkEVMBridgeContract.target, tokenInitialBalance); + + const depositCount = await polygonZkEVMBridgeContract.depositCount(); + const originNetwork = networkIDMainnet; + const tokenAddress = weirdTokenContract.target; + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDRollup; + const destinationAddress = deployer.address; + + // Empty bytes32 is a not valid encoding + const nameEmpty = "NOT_VALID_ENCODING"; // bytes32 empty + const symbolEmpty = ""; + + const metadata = ethers.AbiCoder.defaultAbiCoder().encode( + ["string", "string", "uint8"], + [nameEmpty, symbolEmpty, decimalsWeird] + ); + + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + // pre compute root merkle tree in Js + const height = 32; + const merkleTree = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + merkleTree.add(leafValue); + const rootJSMainnet = merkleTree.getRoot(); + + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount, + tokenAddress, + true, + "0x" + ) + ) + .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .withArgs( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata, + depositCount + ); + + expect(await polygonZkEVMBridgeContract.getRoot()).to.be.equal(rootJSMainnet); + }); + + it("should PolygonZkEVMBridge and with permit eip-2612 compilant", async () => { + const depositCount = await polygonZkEVMBridgeContract.depositCount(); + const originNetwork = networkIDMainnet; + const tokenAddress = polTokenContract.target; + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDRollup; + const destinationAddress = deployer.address; + + const metadata = metadataToken; + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + const balanceDeployer = await polTokenContract.balanceOf(deployer.address); + const balanceBridge = await polTokenContract.balanceOf(polygonZkEVMBridgeContract.target); + + const rollupExitRoot = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + + // pre compute root merkle tree in Js + const height = 32; + const merkleTree = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + merkleTree.add(leafValue); + const rootJSMainnet = merkleTree.getRoot(); + + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount, + tokenAddress, + true, + "0x" + ) + ).to.be.revertedWith("ERC20: insufficient allowance"); + + // user permit + const nonce = await polTokenContract.nonces(deployer.address); + const deadline = ethers.MaxUint256; + const {chainId} = await ethers.provider.getNetwork(); + + const {v, r, s} = await createPermitSignature( + polTokenContract, + deployer, + polygonZkEVMBridgeContract.target, + amount, + nonce, + deadline, + chainId + ); + + const dataPermit = ifacePermit.encodeFunctionData("permit", [ + deployer.address, + polygonZkEVMBridgeContract.target, + amount, + deadline, + v, + r, + s, + ]); + + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount, + tokenAddress, + true, + dataPermit + ) + ) + .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .withArgs( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata, + depositCount + ) + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .withArgs(rootJSMainnet, rollupExitRoot); + + expect(await polTokenContract.balanceOf(deployer.address)).to.be.equal(balanceDeployer - amount); + expect(await polTokenContract.balanceOf(polygonZkEVMBridgeContract.target)).to.be.equal(balanceBridge + amount); + + // check merkle root with SC + const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); + expect(rootSCMainnet).to.be.equal(rootJSMainnet); + + // check merkle proof + const proof = merkleTree.getProofTreeByIndex(0); + const index = 0; + + // verify merkle proof + expect(verifyMerkleProof(leafValue, proof, index, rootSCMainnet)).to.be.equal(true); + expect(await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proof, index, rootSCMainnet)).to.be.equal( + true + ); + + const computedGlobalExitRoot = calculateGlobalExitRoot(rootJSMainnet, rollupExitRoot); + expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + }); + + it("should PolygonZkEVMBridge with permit DAI type contracts", async () => { + const {chainId} = await ethers.provider.getNetwork(); + const daiTokenFactory = await ethers.getContractFactory("DaiMock"); + const daiContract = (await daiTokenFactory.deploy(chainId)) as any; + await daiContract.waitForDeployment(); + await daiContract.mint(deployer.address, ethers.parseEther("100")); + + const depositCount = await polygonZkEVMBridgeContract.depositCount(); + const originNetwork = networkIDMainnet; + const tokenAddress = daiContract.target; + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDRollup; + const destinationAddress = deployer.address; + + const metadata = ethers.AbiCoder.defaultAbiCoder().encode( + ["string", "string", "uint8"], + [await daiContract.name(), await daiContract.symbol(), await daiContract.decimals()] + ); + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + const balanceDeployer = await daiContract.balanceOf(deployer.address); + const balanceBridge = await daiContract.balanceOf(polygonZkEVMBridgeContract.target); + + const rollupExitRoot = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + + // pre compute root merkle tree in Js + const height = 32; + const merkleTree = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + merkleTree.add(leafValue); + const rootJSMainnet = merkleTree.getRoot(); + + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount, + tokenAddress, + true, + "0x" + ) + ).to.be.revertedWith("Dai/insufficient-allowance"); + + // user permit + const nonce = await daiContract.nonces(deployer.address); + const deadline = ethers.MaxUint256; + + const {v, r, s} = await createPermitSignatureDaiType( + daiContract, + deployer, + polygonZkEVMBridgeContract.target, + nonce, + deadline, + chainId + ); + const dataPermit = ifacePermitDAI.encodeFunctionData("permit", [ + deployer.address, + polygonZkEVMBridgeContract.target, + nonce, + deadline, + true, + v, + r, + s, + ]); + + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount, + tokenAddress, + true, + dataPermit + ) + ) + .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .withArgs( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata, + depositCount + ) + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .withArgs(rootJSMainnet, rollupExitRoot); + + expect(await daiContract.balanceOf(deployer.address)).to.be.equal(balanceDeployer - amount); + expect(await daiContract.balanceOf(polygonZkEVMBridgeContract.target)).to.be.equal(balanceBridge + amount); + + // check merkle root with SC + const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); + expect(rootSCMainnet).to.be.equal(rootJSMainnet); + + // check merkle proof + const proof = merkleTree.getProofTreeByIndex(0); + const index = 0; + + // verify merkle proof + expect(verifyMerkleProof(leafValue, proof, index, rootSCMainnet)).to.be.equal(true); + expect(await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proof, index, rootSCMainnet)).to.be.equal( + true + ); + + const computedGlobalExitRoot = calculateGlobalExitRoot(rootJSMainnet, rollupExitRoot); + expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + }); + + it("should PolygonZkEVMBridge with permit UNI type contracts", async () => { + const uniTokenFactory = await ethers.getContractFactory("Uni"); + const lastBlock = (await ethers.provider.getBlock("latest")) as any; + const uniContract = (await uniTokenFactory.deploy( + deployer.address, + deployer.address, + lastBlock.timestamp + 1 + )) as any; + await uniContract.waitForDeployment(); + await uniContract.mint(deployer.address, ethers.parseEther("100")); + + const depositCount = await polygonZkEVMBridgeContract.depositCount(); + const originNetwork = networkIDMainnet; + const tokenAddress = uniContract.target; + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDRollup; + const destinationAddress = deployer.address; + + const metadata = ethers.AbiCoder.defaultAbiCoder().encode( + ["string", "string", "uint8"], + [await uniContract.name(), await uniContract.symbol(), await uniContract.decimals()] + ); + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + const balanceDeployer = await uniContract.balanceOf(deployer.address); + const balanceBridge = await uniContract.balanceOf(polygonZkEVMBridgeContract.target); + + const rollupExitRoot = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + + // pre compute root merkle tree in Js + const height = 32; + const merkleTree = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + merkleTree.add(leafValue); + const rootJSMainnet = merkleTree.getRoot(); + + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount, + tokenAddress, + true, + "0x" + ) + ).to.be.revertedWith("Uni::transferFrom: transfer amount exceeds spender allowance"); + + // user permit + const nonce = await uniContract.nonces(deployer.address); + const deadline = ethers.MaxUint256; + const {chainId} = await ethers.provider.getNetwork(); + + const {v, r, s} = await createPermitSignatureUniType( + uniContract, + deployer, + polygonZkEVMBridgeContract.target, + amount, + nonce, + deadline, + chainId + ); + + const dataPermit = ifacePermit.encodeFunctionData("permit", [ + deployer.address, + polygonZkEVMBridgeContract.target, + amount, + deadline, + v, + r, + s, + ]); + + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount, + tokenAddress, + true, + dataPermit + ) + ) + .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .withArgs( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata, + depositCount + ) + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .withArgs(rootJSMainnet, rollupExitRoot); + + expect(await uniContract.balanceOf(deployer.address)).to.be.equal(balanceDeployer - amount); + expect(await uniContract.balanceOf(polygonZkEVMBridgeContract.target)).to.be.equal(balanceBridge + amount); + + // check merkle root with SC + const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); + expect(rootSCMainnet).to.be.equal(rootJSMainnet); + + // check merkle proof + const proof = merkleTree.getProofTreeByIndex(0); + const index = 0; + + // verify merkle proof + expect(verifyMerkleProof(leafValue, proof, index, rootSCMainnet)).to.be.equal(true); + expect(await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proof, index, rootSCMainnet)).to.be.equal( + true + ); + + const computedGlobalExitRoot = calculateGlobalExitRoot(rootJSMainnet, rollupExitRoot); + expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + }); +}); diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index 8160384d9..70effd826 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -1799,7 +1799,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { newCreatedRollupID, gasTokenAddress, gasTokenNetwork, - gasMetadataToken // empty metadata + gasMetadataToken ); // Check transaction @@ -1810,7 +1810,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { gasTokenNetwork, globalExitRootL2Address, ethers.ZeroAddress, - gasMetadataToken, // empty metadata + gasMetadataToken, ]); const rawTx = processorUtils.customRawTxToRawTx(transaction); @@ -2125,6 +2125,584 @@ describe("Polygon ZK-EVM TestnetV2", () => { expect(await newWrappedToken.totalSupply()).to.be.equal(amount); }); + it("should check full flow with gas Token etrog", async () => { + const urlSequencer = "http://zkevm-json-rpc:8123"; + const chainID = 1000; + const networkName = "zkevm"; + const forkID = 0; + const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001"; + const rollupCompatibilityID = 0; + const descirption = "zkevm test"; + // Native token will be ether + + // deploy pol + const gasTokenName = "GAS Token"; + const gasTokenSymbol = "GTOKEN"; + const gasTokenDecimals = 18; + + const gasTokenInitialBalance = ethers.parseEther("20000000"); + + const gasMetadataToken = ethers.AbiCoder.defaultAbiCoder().encode( + ["string", "string", "uint8"], + [gasTokenName, gasTokenSymbol, gasTokenDecimals] + ); + const tokenFactory = await ethers.getContractFactory("ERC20PermitMock"); + const gasTokenContract = await tokenFactory.deploy( + gasTokenName, + gasTokenSymbol, + deployer.address, + gasTokenInitialBalance + ); + + const gasTokenAddress = gasTokenContract.target; + const gasTokenNetwork = 0; + + // In order to create a new rollup type, create an implementation of the contract + + // Create zkEVM implementation + const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMEtrog"); + const PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy( + polygonZkEVMGlobalExitRoot.target, + polTokenContract.target, + polygonZkEVMBridgeContract.target, + rollupManagerContract.target + ); + await PolygonZKEVMV2Contract.waitForDeployment(); + + // Try to add a new rollup type + await expect( + rollupManagerContract.addNewRollupType( + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + genesisRandom, + descirption + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); + + // Add a new rollup type with timelock + const newRollupTypeID = 1; + await expect( + rollupManagerContract + .connect(timelock) + .addNewRollupType( + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + genesisRandom, + descirption + ) + ) + .to.emit(rollupManagerContract, "AddNewRollupType") + .withArgs( + newRollupTypeID, + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + genesisRandom, + descirption + ); + + // assert new rollup type + const createdRollupType = await rollupManagerContract.rollupTypeMap(newRollupTypeID); + + const expectedRollupType = [ + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + false, + genesisRandom, + ]; + expect(createdRollupType).to.be.deep.equal(expectedRollupType); + + // obsoleteRollupType, take snapshot for it + const snapshot = await takeSnapshot(); + + await expect(rollupManagerContract.obsoleteRollupType(newRollupTypeID)).to.be.revertedWithCustomError( + rollupManagerContract, + "AddressDoNotHaveRequiredRole" + ); + + await expect(rollupManagerContract.connect(admin).obsoleteRollupType(newRollupTypeID)) + .to.emit(rollupManagerContract, "ObsoleteRollupType") + .withArgs(newRollupTypeID); + + expect([ + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + true, + genesisRandom, + ]).to.be.deep.equal(await rollupManagerContract.rollupTypeMap(newRollupTypeID)); + await snapshot.restore(); + + expect(expectedRollupType).to.be.deep.equal(await rollupManagerContract.rollupTypeMap(newRollupTypeID)); + // Create a + + // Only admin can create new zkEVMs + await expect( + rollupManagerContract.createNewRollup( + newRollupTypeID, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + urlSequencer, + networkName + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); + + // UNexisting rollupType + await expect( + rollupManagerContract + .connect(admin) + .createNewRollup( + 0, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + urlSequencer, + networkName + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeDoesNotExist"); + + // Obsolete rollup type and test that fails + const snapshot2 = await takeSnapshot(); + await expect(rollupManagerContract.connect(admin).obsoleteRollupType(newRollupTypeID)) + .to.emit(rollupManagerContract, "ObsoleteRollupType") + .withArgs(newRollupTypeID); + + await expect( + rollupManagerContract + .connect(admin) + .createNewRollup( + newRollupTypeID, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + urlSequencer, + networkName + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeObsolete"); + await snapshot2.restore(); + + const newCreatedRollupID = 1; + const newZKEVMAddress = ethers.getCreateAddress({ + from: rollupManagerContract.target as string, + nonce: 1, + }); + + const newZkEVMContract = PolygonZKEVMV2Factory.attach(newZKEVMAddress) as PolygonZkEVMVEtrog; + const newSequencedBatch = 1; + + await expect( + rollupManagerContract + .connect(admin) + .createNewRollup( + newRollupTypeID, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + urlSequencer, + networkName + ) + ) + .to.emit(rollupManagerContract, "CreateNewRollup") + .withArgs(newCreatedRollupID, newRollupTypeID, newZKEVMAddress, chainID, gasTokenAddress) + .to.emit(newZkEVMContract, "InitialSequenceBatches") + .to.emit(rollupManagerContract, "OnSequenceBatches") + .withArgs(newCreatedRollupID, newSequencedBatch); + + const blockCreatedRollup = await ethers.provider.getBlock("latest"); + + // Assert new rollup created + const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; + expect(await newZkEVMContract.admin()).to.be.equal(admin.address); + expect(await newZkEVMContract.trustedSequencer()).to.be.equal(trustedSequencer.address); + expect(await newZkEVMContract.trustedSequencerURL()).to.be.equal(urlSequencer); + expect(await newZkEVMContract.networkName()).to.be.equal(networkName); + expect(await newZkEVMContract.forceBatchTimeout()).to.be.equal(FORCE_BATCH_TIMEOUT); + + // Cannot create 2 chains with the same chainID + await expect( + rollupManagerContract + .connect(admin) + .createNewRollup( + newRollupTypeID, + chainID, + admin.address, + trustedSequencer.address, + gasTokenAddress, + urlSequencer, + networkName + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "ChainIDAlreadyExist"); + + const transaction = await newZkEVMContract.generateInitializeTransaction( + newCreatedRollupID, + gasTokenAddress, + gasTokenNetwork, + gasMetadataToken + ); + + // Check transaction + const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + const encodedData = bridgeL2Factory.interface.encodeFunctionData("initialize", [ + newCreatedRollupID, + gasTokenAddress, + gasTokenNetwork, + globalExitRootL2Address, + ethers.ZeroAddress, + gasMetadataToken, + ]); + + const rawTx = processorUtils.customRawTxToRawTx(transaction); + const tx = ethers.Transaction.from(rawTx); + + const rlpSignData = transaction.slice(0, -(SIGNATURE_BYTES * 2 + EFFECTIVE_PERCENTAGE_BYTES * 2)); + expect(rlpSignData).to.be.equal(tx.unsignedSerialized); + + expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); + expect(tx.value).to.be.equal(0); + expect(tx.data).to.be.equal(encodedData); + expect(tx.gasPrice).to.be.equal(0); + expect(tx.gasLimit).to.be.equal(30000000); + expect(tx.nonce).to.be.equal(0); + expect(tx.chainId).to.be.equal(0); + + const expectedAccInputHash = calculateAccInputHashetrog( + ethers.ZeroHash, + ethers.keccak256(transaction), + await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), + timestampCreatedRollup, + trustedSequencer.address, + blockCreatedRollup?.parentHash + ); + + // calcualte accINputHash + expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash); + + // Check mapping on rollup Manager + const rollupData = await rollupManagerContract.rollupIDToRollupData(newCreatedRollupID); + expect(rollupData.rollupContract).to.be.equal(newZKEVMAddress); + expect(rollupData.chainID).to.be.equal(chainID); + expect(rollupData.verifier).to.be.equal(verifierContract.target); + expect(rollupData.forkID).to.be.equal(forkID); + expect(rollupData.lastLocalExitRoot).to.be.equal(ethers.ZeroHash); + expect(rollupData.lastBatchSequenced).to.be.equal(newSequencedBatch); + expect(rollupData.lastVerifiedBatch).to.be.equal(0); + expect(rollupData.lastPendingState).to.be.equal(0); + expect(rollupData.lastPendingStateConsolidated).to.be.equal(0); + expect(rollupData.lastVerifiedBatchBeforeUpgrade).to.be.equal(0); + expect(rollupData.rollupTypeID).to.be.equal(1); + expect(rollupData.rollupCompatibilityID).to.be.equal(0); + + const sequencedBatchData = await rollupManagerContract.getRollupSequencedBatches( + newCreatedRollupID, + newSequencedBatch + ); + + expect(sequencedBatchData.accInputHash).to.be.equal(expectedAccInputHash); + expect(sequencedBatchData.sequencedTimestamp).to.be.equal(timestampCreatedRollup); + expect(sequencedBatchData.previousLastBatchSequenced).to.be.equal(0); + + // try verify batches + const l2txData = "0x123456"; + const maticAmount = await rollupManagerContract.getBatchFee(); + const currentTimestamp = (await ethers.provider.getBlock("latest"))?.timestamp; + + const sequence = { + transactions: l2txData, + forcedGlobalExitRoot: ethers.ZeroHash, + forcedTimestamp: 0, + forcedBlockHashL1: ethers.ZeroHash, + } as BatchDataStructEtrog; + + const height = 32; + const merkleTreeGLobalExitRoot = new MerkleTreeBridge(height); + + const rootSC = await polygonZkEVMGlobalExitRoot.getRoot(); + const rootJS = merkleTreeGLobalExitRoot.getRoot(); + + expect(rootSC).to.be.equal(rootJS); + + // Approve tokens + await expect(polTokenContract.connect(trustedSequencer).approve(newZkEVMContract.target, maticAmount)).to.emit( + polTokenContract, + "Approval" + ); + + // Sequence Batches + const txSequenceBatches = await newZkEVMContract + .connect(trustedSequencer) + .sequenceBatches([sequence], trustedSequencer.address); + + const lastBlock = await ethers.provider.getBlock("latest"); + const lastBlockHash = lastBlock?.parentHash; + const lastGlobalExitRootS = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); + + const receipt = await txSequenceBatches.wait(); + const logs = receipt.logs; + + for (const log of logs) { + const parsedLog = newZkEVMContract.interface.parseLog(log); + if (parsedLog != null) { + expect(parsedLog.name).to.be.equal("SequenceBatches"); + expect(parsedLog.args.numBatch).to.be.equal(2); + expect(parsedLog.args.l1InfoRoot).to.be.equal(rootSC); + } + } + + const expectedAccInputHash2 = calculateAccInputHashetrog( + expectedAccInputHash, + ethers.keccak256(l2txData), + rootSC, + lastBlock?.timestamp, + trustedSequencer.address, + ethers.ZeroHash + ); + + // calcualte accINputHash + expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash2); + + // Create a new local exit root mocking some bridge + const tokenName = "Matic Token"; + const tokenSymbol = "MATIC"; + const decimals = 18; + const metadataToken = ethers.AbiCoder.defaultAbiCoder().encode( + ["string", "string", "uint8"], + [tokenName, tokenSymbol, decimals] + ); + + const originNetwork = networkIDRollup; + const tokenAddress = ethers.getAddress(ethers.hexlify(ethers.randomBytes(20))); + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDMainnet; + const destinationAddress = beneficiary.address; + const metadata = metadataToken; // since we are inserting in the exit root can be anything + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + // compute root merkle tree in Js + const merkleTreezkEVM = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + + // Add 2 leafs + merkleTreezkEVM.add(leafValue); + merkleTreezkEVM.add(leafValue); + + // check merkle root with SC + const rootzkEVM = merkleTreezkEVM.getRoot(); + + // trustedAggregator forge the batch + const pendingState = 0; + const newLocalExitRoot = rootzkEVM; + const newStateRoot = "0x0000000000000000000000000000000000000000000000000000000000000123"; + const newVerifiedBatch = newSequencedBatch + 1; + const zkProofFFlonk = new Array(24).fill(ethers.ZeroHash); + const currentVerifiedBatch = 0; + + const initialAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); + await expect( + rollupManagerContract + .connect(deployer) + .verifyBatchesTrustedAggregator( + newCreatedRollupID, + pendingState, + currentVerifiedBatch, + newVerifiedBatch, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); + + await expect( + rollupManagerContract + .connect(trustedAggregator) + .verifyBatchesTrustedAggregator( + newCreatedRollupID, + pendingState, + currentVerifiedBatch, + currentVerifiedBatch, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "FinalNumBatchBelowLastVerifiedBatch"); + + await expect( + rollupManagerContract + .connect(trustedAggregator) + .verifyBatchesTrustedAggregator( + newCreatedRollupID, + pendingState, + currentVerifiedBatch, + 3, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "NewAccInputHashDoesNotExist"); + + // Calcualte new globalExitroot + const merkleTreeRollups = new MerkleTreeBridge(height); + merkleTreeRollups.add(newLocalExitRoot); + const rootRollups = merkleTreeRollups.getRoot(); + + // Verify batch + await expect( + rollupManagerContract + .connect(trustedAggregator) + .verifyBatchesTrustedAggregator( + newCreatedRollupID, + pendingState, + currentVerifiedBatch, + newVerifiedBatch, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ) + .to.emit(rollupManagerContract, "VerifyBatchesTrustedAggregator") + .withArgs(newCreatedRollupID, newVerifiedBatch, newStateRoot, newLocalExitRoot, trustedAggregator.address) + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateL1InfoTree") + .withArgs(ethers.ZeroHash, rootRollups); + + const finalAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); + + expect(finalAggregatorMatic).to.equal(initialAggregatorMatic + maticAmount); + + // Assert global exit root + expect(await polygonZkEVMGlobalExitRoot.lastRollupExitRoot()).to.be.equal(rootRollups); + expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(ethers.ZeroHash); + + expect(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()).to.be.equal( + calculateGlobalExitRoot(ethers.ZeroHash, rootRollups) + ); + + const indexLeaf = 0; + const proofZkEVM = merkleTreezkEVM.getProofTreeByIndex(indexLeaf); + const proofRollups = merkleTreeRollups.getProofTreeByIndex(indexLeaf); + + // verify merkle proof + expect(verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM)).to.be.equal(true); + expect(verifyMerkleProof(rootzkEVM, proofRollups, indexLeaf, rootRollups)).to.be.equal(true); + + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM) + ).to.be.equal(true); + + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(newLocalExitRoot, proofRollups, indexLeaf, rootRollups) + ).to.be.equal(true); + + // claim + const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); + // create2 parameters + const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]); + const minimalBytecodeProxy = tokenWrappedFactory.bytecode; + const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]); + const precalculateWrappedErc20 = await ethers.getCreate2Address( + polygonZkEVMBridgeContract.target as string, + salt, + hashInitCode + ); + const newWrappedToken = tokenWrappedFactory.attach(precalculateWrappedErc20) as TokenWrapped; + + // Use precalculatedWrapperAddress and check if matches + expect( + await polygonZkEVMBridgeContract.precalculatedWrapperAddress( + networkIDRollup, + tokenAddress, + tokenName, + tokenSymbol, + decimals + ) + ).to.be.equal(precalculateWrappedErc20); + + // index leaf is 0 bc, does not have mainnet flag, and it's rollup 0 on leaf 0 + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofZkEVM, + proofRollups, + indexLeaf, + ethers.ZeroHash, + rootRollups, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ) + .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") + .withArgs(indexLeaf, originNetwork, tokenAddress, destinationAddress, amount) + .to.emit(polygonZkEVMBridgeContract, "NewWrappedToken") + .withArgs(originNetwork, tokenAddress, precalculateWrappedErc20, metadata) + .to.emit(newWrappedToken, "Transfer") + .withArgs(ethers.ZeroAddress, beneficiary.address, amount); + + // Assert maps created + const newTokenInfo = await polygonZkEVMBridgeContract.wrappedTokenToTokenInfo(precalculateWrappedErc20); + + expect(newTokenInfo.originNetwork).to.be.equal(networkIDRollup); + expect(newTokenInfo.originTokenAddress).to.be.equal(tokenAddress); + expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( + precalculateWrappedErc20 + ); + expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( + precalculateWrappedErc20 + ); + + expect(await polygonZkEVMBridgeContract.tokenInfoToWrappedToken(salt)).to.be.equal(precalculateWrappedErc20); + + // Check the wrapper info + expect(await newWrappedToken.name()).to.be.equal(tokenName); + expect(await newWrappedToken.symbol()).to.be.equal(tokenSymbol); + expect(await newWrappedToken.decimals()).to.be.equal(decimals); + + // Can't claim because nullifier + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofZkEVM, + proofRollups, + indexLeaf, + ethers.ZeroHash, + rootRollups, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AlreadyClaimed"); + + // Check new token + expect(await newWrappedToken.totalSupply()).to.be.equal(amount); + }); + it("should check full flow upgrading rollup", async () => { const urlSequencer = "http://zkevm-json-rpc:8123"; const chainID = 1000; diff --git a/test/contractsv2/PolygonZkEVMV2.test.ts b/test/contractsv2/PolygonZkEVMV2.test.ts new file mode 100644 index 000000000..97c573b3d --- /dev/null +++ b/test/contractsv2/PolygonZkEVMV2.test.ts @@ -0,0 +1,693 @@ +/* eslint-disable no-plusplus, no-await-in-loop */ +import {expect} from "chai"; +import {ethers, network, upgrades} from "hardhat"; +import { + VerifierRollupHelperMock, + ERC20PermitMock, + PolygonRollupManagerMock, + PolygonZkEVMGlobalExitRootV2, + PolygonZkEVMBridgeV2, + PolygonZkEVMV2, + PolygonZkEVMEtrog, + PolygonRollupBase, + PolygonRollupBaseEtrog, + TokenWrapped, + Address, +} from "../../typechain-types"; +import {takeSnapshot, time} from "@nomicfoundation/hardhat-network-helpers"; +import {processorUtils, contractUtils, MTBridge, mtBridgeUtils} from "@0xpolygonhermez/zkevm-commonjs"; +const {calculateSnarkInput, calculateAccInputHash, calculateBatchHashData} = contractUtils; + +type BatchDataStruct = PolygonRollupBase.BatchDataStruct; +type ForcedBatchDataStruct = PolygonRollupBase.ForcedBatchDataStruct; +type BatchDataStructEtrog = PolygonRollupBaseEtrog.BatchDataStruct; + +const MerkleTreeBridge = MTBridge; +const {verifyMerkleProof, getLeafValue} = mtBridgeUtils; + +function calculateGlobalExitRoot(mainnetExitRoot: any, rollupExitRoot: any) { + return ethers.solidityPackedKeccak256(["bytes32", "bytes32"], [mainnetExitRoot, rollupExitRoot]); +} + +describe("Polygon ZK-EVM TestnetV2", () => { + let deployer: any; + let timelock: any; + let emergencyCouncil: any; + let trustedAggregator: any; + let trustedSequencer: any; + let admin: any; + let beneficiary: any; + + let verifierContract: VerifierRollupHelperMock; + let polygonZkEVMBridgeContract: PolygonZkEVMBridgeV2; + let polTokenContract: ERC20PermitMock; + let polygonZkEVMGlobalExitRoot: PolygonZkEVMGlobalExitRootV2; + let rollupManagerContract: PolygonRollupManagerEmptyMock; + let PolygonZKEVMV2Contract: PolygonZkEVMV2; + + const polTokenName = "POL Token"; + const polTokenSymbol = "POL"; + const polTokenInitialBalance = ethers.parseEther("20000000"); + + const pendingStateTimeoutDefault = 100; + const trustedAggregatorTimeout = 100; + const FORCE_BATCH_TIMEOUT = 60 * 60 * 24 * 5; // 5 days + + // BRidge constants + const networkIDMainnet = 0; + const networkIDRollup = 1; + + const LEAF_TYPE_ASSET = 0; + const LEAF_TYPE_MESSAGE = 1; + + const globalExitRootL2Address = "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa" as unknown as Address; + + let firstDeployment = true; + + const urlSequencer = "http://zkevm-json-rpc:8123"; + const chainID = 1000; + const networkName = "zkevm"; + const forkID = 0; + const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001"; + const rollupCompatibilityID = 0; + const descirption = "zkevm test"; + const networkID = 1; + + // Native token will be ether + const gasTokenAddress = ethers.ZeroAddress; + const gasTokenNetwork = 0; + + const SIGNATURE_BYTES = 32 + 32 + 1; + const EFFECTIVE_PERCENTAGE_BYTES = 1; + + beforeEach("Deploy contract", async () => { + upgrades.silenceWarnings(); + + // load signers + [deployer, trustedAggregator, trustedSequencer, admin, timelock, emergencyCouncil, beneficiary] = + await ethers.getSigners(); + + // deploy mock verifier + const VerifierRollupHelperFactory = await ethers.getContractFactory("VerifierRollupHelperMock"); + verifierContract = await VerifierRollupHelperFactory.deploy(); + + // deploy pol + const polTokenFactory = await ethers.getContractFactory("ERC20PermitMock"); + polTokenContract = await polTokenFactory.deploy( + polTokenName, + polTokenSymbol, + deployer.address, + polTokenInitialBalance + ); + + /* + * deploy global exit root manager + * In order to not have trouble with nonce deploy first proxy admin + */ + await upgrades.deployProxyAdmin(); + + if ((await upgrades.admin.getInstance()).target !== "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0") { + firstDeployment = false; + } + const nonceProxyBridge = + Number(await ethers.provider.getTransactionCount(deployer.address)) + (firstDeployment ? 3 : 2); + + const nonceProxyZkevm = nonceProxyBridge + 1; // Always have to redeploy impl since the polygonZkEVMGlobalExitRoot address changes + + const precalculateBridgeAddress = ethers.getCreateAddress({ + from: deployer.address, + nonce: nonceProxyBridge, + }); + const precalculateRollupManagerAddress = ethers.getCreateAddress({ + from: deployer.address, + nonce: nonceProxyZkevm, + }); + firstDeployment = false; + + // deploy globalExitRoot + const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRootV2"); + polygonZkEVMGlobalExitRoot = await upgrades.deployProxy(PolygonZkEVMGlobalExitRootFactory, [], { + initializer: false, + constructorArgs: [precalculateRollupManagerAddress, precalculateBridgeAddress], + unsafeAllow: ["constructor", "state-variable-immutable"], + }); + + // deploy PolygonZkEVMBridge + const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + polygonZkEVMBridgeContract = await upgrades.deployProxy(polygonZkEVMBridgeFactory, [], {initializer: false}); + + // deploy mock verifier + const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManagerEmptyMock"); + + rollupManagerContract = await PolygonRollupManagerFactory.deploy(); + + await rollupManagerContract.waitForDeployment(); + + // check precalculated address + expect(precalculateBridgeAddress).to.be.equal(polygonZkEVMBridgeContract.target); + expect(precalculateRollupManagerAddress).to.be.equal(rollupManagerContract.target); + + await polygonZkEVMBridgeContract.initialize( + networkIDMainnet, + ethers.ZeroAddress, // zero for ether + ethers.ZeroAddress, // zero for ether + polygonZkEVMGlobalExitRoot.target, + rollupManagerContract.target, + "0x" + ); + + // fund sequencer address with Matic tokens + await polTokenContract.transfer(trustedSequencer.address, ethers.parseEther("1000")); + + // deploy consensus + // Create zkEVM implementation + const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMV2"); + PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy( + polygonZkEVMGlobalExitRoot.target, + polTokenContract.target, + polygonZkEVMBridgeContract.target, + rollupManagerContract.target + ); + await PolygonZKEVMV2Contract.waitForDeployment(); + }); + + it("should check the initalized parameters", async () => { + // initialize zkEVM + await expect( + PolygonZKEVMV2Contract.initialize( + admin.address, + trustedSequencer.address, + networkID, + gasTokenAddress, + urlSequencer, + networkName + ) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "OnlyRollupManager"); + + // Initialzie using rollup manager + await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); + const rolllupManagerSigner = await ethers.getSigner(rollupManagerContract.target as any); + await expect( + PolygonZKEVMV2Contract.connect(rolllupManagerSigner).initialize( + admin.address, + trustedSequencer.address, + networkID, + gasTokenAddress, + urlSequencer, + networkName, + {gasPrice: 0} + ) + ).to.emit(PolygonZKEVMV2Contract, "InitialSequenceBatches"); + + const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; + expect(await PolygonZKEVMV2Contract.admin()).to.be.equal(admin.address); + expect(await PolygonZKEVMV2Contract.trustedSequencer()).to.be.equal(trustedSequencer.address); + expect(await PolygonZKEVMV2Contract.trustedSequencerURL()).to.be.equal(urlSequencer); + expect(await PolygonZKEVMV2Contract.networkName()).to.be.equal(networkName); + expect(await PolygonZKEVMV2Contract.forceBatchTimeout()).to.be.equal(FORCE_BATCH_TIMEOUT); + expect(await PolygonZKEVMV2Contract.lastTimestamp()).to.be.equal(timestampCreatedRollup); + }); + + it("should check admin functions", async () => { + // Initialzie using rollup manager + await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); + const rolllupManagerSigner = await ethers.getSigner(rollupManagerContract.target as any); + await expect( + PolygonZKEVMV2Contract.connect(rolllupManagerSigner).initialize( + admin.address, + trustedSequencer.address, + networkID, + gasTokenAddress, + urlSequencer, + networkName, + {gasPrice: 0} + ) + ).to.emit(PolygonZKEVMV2Contract, "InitialSequenceBatches"); + + await expect(PolygonZKEVMV2Contract.setTrustedSequencer(deployer.address)).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "OnlyAdmin" + ); + + await expect(PolygonZKEVMV2Contract.connect(admin).setTrustedSequencer(deployer.address)) + .to.emit(PolygonZKEVMV2Contract, "SetTrustedSequencer") + .withArgs(deployer.address); + + await expect(PolygonZKEVMV2Contract.setTrustedSequencerURL("0x1253")).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "OnlyAdmin" + ); + await expect(PolygonZKEVMV2Contract.connect(admin).setTrustedSequencerURL("0x1253")) + .to.emit(PolygonZKEVMV2Contract, "SetTrustedSequencerURL") + .withArgs("0x1253"); + + await expect(PolygonZKEVMV2Contract.setForceBatchTimeout(0)).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "OnlyAdmin" + ); + + await expect( + PolygonZKEVMV2Contract.connect(admin).setForceBatchTimeout(FORCE_BATCH_TIMEOUT) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "InvalidRangeForceBatchTimeout"); + + await expect(PolygonZKEVMV2Contract.connect(admin).setForceBatchTimeout(0)) + .to.emit(PolygonZKEVMV2Contract, "SetForceBatchTimeout") + .withArgs(0); + + await expect(PolygonZKEVMV2Contract.transferAdminRole(deployer.address)).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "OnlyAdmin" + ); + + await expect(PolygonZKEVMV2Contract.connect(admin).transferAdminRole(deployer.address)) + .to.emit(PolygonZKEVMV2Contract, "TransferAdminRole") + .withArgs(deployer.address); + + await expect(PolygonZKEVMV2Contract.connect(admin).acceptAdminRole()).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "OnlyPendingAdmin" + ); + + await expect(PolygonZKEVMV2Contract.connect(deployer).acceptAdminRole()) + .to.emit(PolygonZKEVMV2Contract, "AcceptAdminRole") + .withArgs(deployer.address); + + // Check force batches are unactive + await expect(PolygonZKEVMV2Contract.forceBatch("0x", 0)).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "ForceBatchNotAllowed" + ); + await expect(PolygonZKEVMV2Contract.sequenceForceBatches([])).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "ForceBatchNotAllowed" + ); + + // deployer now is the admin + await expect(PolygonZKEVMV2Contract.connect(admin).activateForceBatches()).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "OnlyAdmin" + ); + + await expect(PolygonZKEVMV2Contract.connect(deployer).activateForceBatches()).to.emit( + PolygonZKEVMV2Contract, + "ActivateForceBatches" + ); + + await expect(PolygonZKEVMV2Contract.connect(deployer).activateForceBatches()).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "ForceBatchesAlreadyActive" + ); + }); + + it("should check full flow", async () => { + // Initialzie using rollup manager + await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); + const rolllupManagerSigner = await ethers.getSigner(rollupManagerContract.target as any); + await expect( + PolygonZKEVMV2Contract.connect(rolllupManagerSigner).initialize( + admin.address, + trustedSequencer.address, + networkID, + gasTokenAddress, + urlSequencer, + networkName, + {gasPrice: 0} + ) + ).to.emit(PolygonZKEVMV2Contract, "InitialSequenceBatches"); + const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; + + const transaction = await PolygonZKEVMV2Contract.generateInitializeTransaction( + networkID, + gasTokenAddress, + gasTokenNetwork, + "0x" // empty metadata + ); + + // Check transaction + const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + const encodedData = bridgeL2Factory.interface.encodeFunctionData("initialize", [ + networkID, + gasTokenAddress, + gasTokenNetwork, + globalExitRootL2Address, + ethers.ZeroAddress, + "0x", // empty metadata + ]); + + const rawTx = processorUtils.customRawTxToRawTx(transaction); + const tx = ethers.Transaction.from(rawTx); + + const rlpSignData = transaction.slice(0, -(SIGNATURE_BYTES * 2 + EFFECTIVE_PERCENTAGE_BYTES * 2)); + expect(rlpSignData).to.be.equal(tx.unsignedSerialized); + + expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); + expect(tx.value).to.be.equal(0); + expect(tx.data).to.be.equal(encodedData); + expect(tx.gasPrice).to.be.equal(0); + expect(tx.gasLimit).to.be.equal(30000000); + expect(tx.nonce).to.be.equal(0); + expect(tx.chainId).to.be.equal(0); + + const expectedAccInputHash = calculateAccInputHash( + ethers.ZeroHash, + ethers.keccak256(transaction), + await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), + timestampCreatedRollup, + trustedSequencer.address + ); + // calcualte accINputHash + expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash); + + // try verify batches + const l2txData = "0x123456"; + const maticAmount = ethers.parseEther("1"); + const currentTimestamp = (await ethers.provider.getBlock("latest"))?.timestamp; + + const sequence = { + transactions: l2txData, + globalExitRoot: ethers.ZeroHash, + timestamp: currentTimestamp, + minForcedTimestamp: 0, + } as BatchDataStruct; + + // Approve tokens + await expect( + polTokenContract.connect(trustedSequencer).approve(PolygonZKEVMV2Contract.target, maticAmount) + ).to.emit(polTokenContract, "Approval"); + + // Sequence Batches + await expect( + PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address) + ) + .to.emit(PolygonZKEVMV2Contract, "SequenceBatches") + .withArgs(1); + + const expectedAccInputHash2 = calculateAccInputHash( + expectedAccInputHash, + ethers.keccak256(l2txData), + ethers.ZeroHash, + currentTimestamp, + trustedSequencer.address + ); + // calcualte accINputHash + expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash2); + }); + + it("should check full flow with wrapped gas token", async () => { + // Create a new wrapped token mocking the bridge + const tokenName = "Matic Token L2"; + const tokenSymbol = "MATIC"; + const decimals = 18; + const metadataToken = ethers.AbiCoder.defaultAbiCoder().encode( + ["string", "string", "uint8"], + [tokenName, tokenSymbol, decimals] + ); + + const originNetwork = networkIDRollup; + const tokenAddress = ethers.getAddress(ethers.hexlify(ethers.randomBytes(20))); + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDMainnet; + const destinationAddress = beneficiary.address; + const metadata = metadataToken; // since we are inserting in the exit root can be anything + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + // compute root merkle tree in Js + const height = 32; + const merkleTreezkEVM = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + + // Add 2 leafs + merkleTreezkEVM.add(leafValue); + merkleTreezkEVM.add(leafValue); + + // check merkle root with SC + const rootzkEVM = merkleTreezkEVM.getRoot(); + + // Calcualte new globalExitroot + const merkleTreeRollups = new MerkleTreeBridge(height); + merkleTreeRollups.add(rootzkEVM); + const rootRollups = merkleTreeRollups.getRoot(); + + // Assert global exit root + // TODO + await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); + const rolllupManagerSigner = await ethers.getSigner(rollupManagerContract.target as any); + await polygonZkEVMGlobalExitRoot.connect(rolllupManagerSigner).updateExitRoot(rootRollups, {gasPrice: 0}); + + expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(ethers.ZeroHash); + expect(await polygonZkEVMGlobalExitRoot.lastRollupExitRoot()).to.be.equal(rootRollups); + + expect(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()).to.be.equal( + calculateGlobalExitRoot(ethers.ZeroHash, rootRollups) + ); + + const indexLeaf = 0; + const proofZkEVM = merkleTreezkEVM.getProofTreeByIndex(indexLeaf); + const proofRollups = merkleTreeRollups.getProofTreeByIndex(indexLeaf); + + // verify merkle proof + expect(verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM)).to.be.equal(true); + expect(verifyMerkleProof(rootzkEVM, proofRollups, indexLeaf, rootRollups)).to.be.equal(true); + + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM) + ).to.be.equal(true); + + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(rootzkEVM, proofRollups, indexLeaf, rootRollups) + ).to.be.equal(true); + + // claim + const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); + // create2 parameters + const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]); + const minimalBytecodeProxy = tokenWrappedFactory.bytecode; + const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]); + const precalculateWrappedErc20 = await ethers.getCreate2Address( + polygonZkEVMBridgeContract.target as string, + salt, + hashInitCode + ); + const newWrappedToken = tokenWrappedFactory.attach(precalculateWrappedErc20) as TokenWrapped; + + // Use precalculatedWrapperAddress and check if matches + expect( + await polygonZkEVMBridgeContract.precalculatedWrapperAddress( + networkIDRollup, + tokenAddress, + tokenName, + tokenSymbol, + decimals + ) + ).to.be.equal(precalculateWrappedErc20); + + // index leaf is 0 bc, does not have mainnet flag, and it's rollup 0 on leaf 0 + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofZkEVM, + proofRollups, + indexLeaf, + ethers.ZeroHash, + rootRollups, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ) + .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") + .withArgs(indexLeaf, originNetwork, tokenAddress, destinationAddress, amount) + .to.emit(polygonZkEVMBridgeContract, "NewWrappedToken") + .withArgs(originNetwork, tokenAddress, precalculateWrappedErc20, metadata) + .to.emit(newWrappedToken, "Transfer") + .withArgs(ethers.ZeroAddress, beneficiary.address, amount); + + // Assert maps created + const newTokenInfo = await polygonZkEVMBridgeContract.wrappedTokenToTokenInfo(precalculateWrappedErc20); + + expect(newTokenInfo.originNetwork).to.be.equal(networkIDRollup); + expect(newTokenInfo.originTokenAddress).to.be.equal(tokenAddress); + expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( + precalculateWrappedErc20 + ); + expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( + precalculateWrappedErc20 + ); + + expect(await polygonZkEVMBridgeContract.tokenInfoToWrappedToken(salt)).to.be.equal(precalculateWrappedErc20); + + // Check the wrapper info + expect(await newWrappedToken.name()).to.be.equal(tokenName); + expect(await newWrappedToken.symbol()).to.be.equal(tokenSymbol); + expect(await newWrappedToken.decimals()).to.be.equal(decimals); + + // Initialzie using rollup manager with gas token + await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); + await expect( + PolygonZKEVMV2Contract.connect(rolllupManagerSigner).initialize( + admin.address, + trustedSequencer.address, + networkID, + newWrappedToken.target, + urlSequencer, + networkName, + {gasPrice: 0} + ) + ).to.emit(PolygonZKEVMV2Contract, "InitialSequenceBatches"); + + const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; + + const transaction = await PolygonZKEVMV2Contract.generateInitializeTransaction( + networkID, + tokenAddress, + originNetwork, + metadata // empty metadata + ); + + // Check transaction + const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + const encodedData = bridgeL2Factory.interface.encodeFunctionData("initialize", [ + networkID, + tokenAddress, + originNetwork, + globalExitRootL2Address, + ethers.ZeroAddress, + metadata, // empty metadata + ]); + + const rawTx = processorUtils.customRawTxToRawTx(transaction); + const tx = ethers.Transaction.from(rawTx); + + const rlpSignData = transaction.slice(0, -(SIGNATURE_BYTES * 2 + EFFECTIVE_PERCENTAGE_BYTES * 2)); + expect(rlpSignData).to.be.equal(tx.unsignedSerialized); + + expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); + expect(tx.value).to.be.equal(0); + expect(tx.data).to.be.equal(encodedData); + expect(tx.gasPrice).to.be.equal(0); + expect(tx.gasLimit).to.be.equal(30000000); + expect(tx.nonce).to.be.equal(0); + expect(tx.chainId).to.be.equal(0); + + const expectedAccInputHash = calculateAccInputHash( + ethers.ZeroHash, + ethers.keccak256(transaction), + await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), + timestampCreatedRollup, + trustedSequencer.address + ); + + // calcualte accINputHash + expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash); + + expect(await PolygonZKEVMV2Contract.gasTokenAddress()).to.be.equal(tokenAddress); + expect(await PolygonZKEVMV2Contract.gasTokenNetwork()).to.be.equal(originNetwork); + }); + + it("should check forced batches", async () => { + // Initialzie using rollup manager + await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); + const rolllupManagerSigner = await ethers.getSigner(rollupManagerContract.target as any); + await expect( + PolygonZKEVMV2Contract.connect(rolllupManagerSigner).initialize( + admin.address, + trustedSequencer.address, + networkID, + gasTokenAddress, + urlSequencer, + networkName, + {gasPrice: 0} + ) + ).to.emit(PolygonZKEVMV2Contract, "InitialSequenceBatches"); + + const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; + const transaction = await PolygonZKEVMV2Contract.generateInitializeTransaction( + networkID, + gasTokenAddress, + gasTokenNetwork, + "0x" // empty metadata + ); + + // Check transaction + const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + const encodedData = bridgeL2Factory.interface.encodeFunctionData("initialize", [ + networkID, + gasTokenAddress, + gasTokenNetwork, + globalExitRootL2Address, + ethers.ZeroAddress, + "0x", // empty metadata + ]); + + const rawTx = processorUtils.customRawTxToRawTx(transaction); + const tx = ethers.Transaction.from(rawTx); + + const rlpSignData = transaction.slice(0, -(SIGNATURE_BYTES * 2 + EFFECTIVE_PERCENTAGE_BYTES * 2)); + expect(rlpSignData).to.be.equal(tx.unsignedSerialized); + + expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); + expect(tx.value).to.be.equal(0); + expect(tx.data).to.be.equal(encodedData); + expect(tx.gasPrice).to.be.equal(0); + expect(tx.gasLimit).to.be.equal(30000000); + expect(tx.nonce).to.be.equal(0); + expect(tx.chainId).to.be.equal(0); + + const expectedAccInputHash = calculateAccInputHash( + ethers.ZeroHash, + ethers.keccak256(transaction), + await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), + timestampCreatedRollup, + trustedSequencer.address + ); + // calcualte accINputHash + expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash); + + // try verify batches + const l2txData = "0x123456"; + const maticAmount = ethers.parseEther("1"); + + // Approve tokens + await expect(polTokenContract.connect(deployer).approve(PolygonZKEVMV2Contract.target, maticAmount)).to.emit( + polTokenContract, + "Approval" + ); + + expect(await PolygonZKEVMV2Contract.calculatePolPerForceBatch()).to.be.equal(0); + + const globalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); + + // force Batches + await expect(PolygonZKEVMV2Contract.forceBatch(l2txData, maticAmount)).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "ForceBatchNotAllowed" + ); + + // deployer now is the admin + await PolygonZKEVMV2Contract.connect(admin).activateForceBatches(); + + // force Batches + await expect(PolygonZKEVMV2Contract.forceBatch(l2txData, 0)).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "NotEnoughPOLAmount" + ); + + await expect(PolygonZKEVMV2Contract.forceBatch(l2txData, maticAmount)) + .to.emit(PolygonZKEVMV2Contract, "ForceBatch") + .withArgs(1, globalExitRoot, deployer.address, "0x"); + + expect(await PolygonZKEVMV2Contract.calculatePolPerForceBatch()).to.be.equal( + await rollupManagerContract.getForcedBatchFee() + ); + }); +}); From 431f2262b4d1b0f2d548d1b3d97968e44b3fbf0b Mon Sep 17 00:00:00 2001 From: invocamanman Date: Fri, 15 Dec 2023 17:45:38 +0100 Subject: [PATCH 111/230] update deployment v1tov2 --- deployment/v1ToV2/1_createGenesis.ts | 492 ++++++++++++++ .../v1ToV2/2_deployPolygonZKEVMDeployer.ts | 93 +++ deployment/v1ToV2/3_deployContracts.ts | 607 ++++++++++++++++++ deployment/v1ToV2/4_createRollup.ts | 307 +++++++++ deployment/v1ToV2/README.md | 54 ++ .../v1ToV2/deploy_parameters.json.example | 27 + deployment/v1ToV2/prepareTestnet.ts | 132 ++++ docker/scripts/v1ToV2/deploy-docker.sh | 14 + docker/scripts/v1ToV2/deploy-dockerv2.sh | 14 + .../v1ToV2/deploy_parameters_docker.json | 29 + docker/scripts/v1ToV2/genesis.json | 98 +++ docker/scripts/v1ToV2/hardhat.example.paris | 258 ++++++++ docker/scripts/v2/deploy-docker.sh | 2 + package.json | 5 + 14 files changed, 2132 insertions(+) create mode 100644 deployment/v1ToV2/1_createGenesis.ts create mode 100644 deployment/v1ToV2/2_deployPolygonZKEVMDeployer.ts create mode 100644 deployment/v1ToV2/3_deployContracts.ts create mode 100644 deployment/v1ToV2/4_createRollup.ts create mode 100644 deployment/v1ToV2/README.md create mode 100644 deployment/v1ToV2/deploy_parameters.json.example create mode 100644 deployment/v1ToV2/prepareTestnet.ts create mode 100755 docker/scripts/v1ToV2/deploy-docker.sh create mode 100755 docker/scripts/v1ToV2/deploy-dockerv2.sh create mode 100644 docker/scripts/v1ToV2/deploy_parameters_docker.json create mode 100644 docker/scripts/v1ToV2/genesis.json create mode 100644 docker/scripts/v1ToV2/hardhat.example.paris diff --git a/deployment/v1ToV2/1_createGenesis.ts b/deployment/v1ToV2/1_createGenesis.ts new file mode 100644 index 000000000..8668b626c --- /dev/null +++ b/deployment/v1ToV2/1_createGenesis.ts @@ -0,0 +1,492 @@ +/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if, import/no-dynamic-require */ +/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved, no-restricted-syntax */ +import {expect} from "chai"; +import path = require("path"); +import fs = require("fs"); + +import * as dotenv from "dotenv"; +dotenv.config({path: path.resolve(__dirname, "../../.env")}); +import yargs from "yargs/yargs"; + +const argv = yargs(process.argv.slice(2)) + .options({ + test: {type: "boolean", default: false}, + input: {type: "string", default: "./deploy_parameters.json"}, + out: {type: "string", default: "./genesis.json"}, + }) + .parse() as any; + +const DEFAULT_MNEMONIC = "test test test test test test test test test test test junk"; +process.env.HARDHAT_NETWORK = "hardhat"; +process.env.MNEMONIC = argv.test ? DEFAULT_MNEMONIC : process.env.MNEMONIC; +import {ethers, upgrades} from "hardhat"; +import {MemDB, ZkEVMDB, getPoseidon, smtUtils} from "@0xpolygonhermez/zkevm-commonjs"; + +import {deployPolygonZkEVMDeployer, create2Deployment, getCreate2Address} from "../helpers/deployment-helpers"; +import {ProxyAdmin} from "../../typechain-types"; +import {Addressable} from "ethers"; + +import "../helpers/utils"; + +const deployParameters = require(argv.input); +const pathOutputJson = path.join(__dirname, argv.out); + +/* + * bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; + * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; + */ +const _ADMIN_SLOT = "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" as any; +const _IMPLEMENTATION_SLOT = "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" as any; + +// Genesis mainnet address: +const mainnetZkEVMDeployerAddress = "0xCB19eDdE626906eB1EE52357a27F62dd519608C2"; +const mainnetZkEVMTimelockAddress = "0xBBa0935Fa93Eb23de7990b47F0D96a8f75766d13"; +const mainnetProxyAdminAddress = "0x0F99738B2Fc14D77308337f3e2596b63aE7BCC4A"; +const mainnetZkEVMBridgeImplementationAddress = "0x5ac4182A1dd41AeEf465E40B82fd326BF66AB82C"; +const mainnetZkEVMBridgeProxyAddress = "0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe"; +const mainnetGlobalExitRootL2ImplementationAddress = "0x0200143Fa295EE4dffEF22eE2616c2E008D81688"; + +const keylessDeployerMainnet = "0x9d90066e7478496e2284E54c3548106bb4F90E50"; +const deployerMainnet = "0x4c1665d6651ecEfa59B9B3041951608468b18891"; + +const mainnetMultisig = "0x4c1665d6651ecEfa59B9B3041951608468b18891"; +const mainnetInitialZkEVMDeployerOwner = "0x4c1665d6651ecEfa59B9B3041951608468b18891"; +const mainnetMinDelayTimelock = 864000; + +const globalExitRootL2Address = "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa"; +const zkevmAddressL2 = ethers.ZeroAddress; + +async function main() { + // Constant variables + const attemptsDeployProxy = 20; + const balanceBrige = BigInt("0xffffffffffffffffffffffffffffffff"); // 128 bits + + let timelockAdminAddress; + let initialZkEVMDeployerOwner; + let salt; + let minDelayTimelock; + + let bridgeImplementationAddress; + let finalBridgeImplAddress; + + let proxyBridgeAddress; + let finalBridgeProxyAddress; + + let proxyAdminAddress; + let finalProxyAdminAddress; + + let finalTimelockContractAdress; + + let finalzkEVMDeployerAdress; + + const finalGlobalExitRootL2ProxyAddress = globalExitRootL2Address; + + let finalGlobalExitRootL2ImplAddress; + + let finalKeylessDeployer; + let finalDeployer; + + const genesis = []; + + // Check if it's mainnet deployment + const isMainnet = deployParameters["isMainnet"] === true ? true : false; + + if (isMainnet === true) { + timelockAdminAddress = mainnetMultisig; + minDelayTimelock = mainnetMinDelayTimelock; + salt = "0x0000000000000000000000000000000000000000000000000000000000000000"; // salt mock + initialZkEVMDeployerOwner = mainnetInitialZkEVMDeployerOwner; + + finalzkEVMDeployerAdress = mainnetZkEVMDeployerAddress; + finalTimelockContractAdress = mainnetZkEVMTimelockAddress; + finalProxyAdminAddress = mainnetProxyAdminAddress; + finalBridgeImplAddress = mainnetZkEVMBridgeImplementationAddress; + finalBridgeProxyAddress = mainnetZkEVMBridgeProxyAddress; + finalGlobalExitRootL2ImplAddress = mainnetGlobalExitRootL2ImplementationAddress; + finalKeylessDeployer = keylessDeployerMainnet; + finalDeployer = deployerMainnet; + } else { + // load deploy parameters + const mandatoryDeploymentParameters = [ + "timelockAdminAddress", + "minDelayTimelock", + "salt", + "initialZkEVMDeployerOwner", + ]; + + for (const parameterName of mandatoryDeploymentParameters) { + if (deployParameters[parameterName] === undefined || deployParameters[parameterName] === "") { + throw new Error(`Missing parameter: ${parameterName}`); + } + } + ({timelockAdminAddress, minDelayTimelock, salt, initialZkEVMDeployerOwner} = deployParameters); + } + + // Load deployer + await ethers.provider.send("hardhat_impersonateAccount", [initialZkEVMDeployerOwner]); + await ethers.provider.send("hardhat_setBalance", [initialZkEVMDeployerOwner, "0xffffffffffffffff"]); // 18 ethers aprox + const deployer = await ethers.getSigner(initialZkEVMDeployerOwner); + + // Deploy PolygonZkEVMDeployer if is not deployed already + const [zkEVMDeployerContract, keylessDeployer] = await deployPolygonZkEVMDeployer( + initialZkEVMDeployerOwner, + deployer + ); + if (isMainnet === false) { + finalDeployer = deployer.address; + finalKeylessDeployer = keylessDeployer; + finalzkEVMDeployerAdress = zkEVMDeployerContract.target; + } + /* + * Deploy Bridge + * Deploy admin --> implementation --> proxy + */ + + // Deploy proxy admin: + const proxyAdminFactory = await ethers.getContractFactory( + "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol:ProxyAdmin", + deployer + ); + const deployTransactionAdmin = (await proxyAdminFactory.getDeployTransaction()).data; + const dataCallAdmin = proxyAdminFactory.interface.encodeFunctionData("transferOwnership", [deployer.address]); + [proxyAdminAddress] = await create2Deployment( + zkEVMDeployerContract, + salt, + deployTransactionAdmin, + dataCallAdmin, + deployer, + null + ); + + if (isMainnet === false) { + finalProxyAdminAddress = proxyAdminAddress; + } + + // Deploy implementation PolygonZkEVMBridge + const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2", deployer); + const deployTransactionBridge = (await polygonZkEVMBridgeFactory.getDeployTransaction()).data; + // Mandatory to override the gasLimit since the estimation with create are mess up D: + const overrideGasLimit = BigInt(5500000); + [bridgeImplementationAddress] = await create2Deployment( + zkEVMDeployerContract, + salt, + deployTransactionBridge, + null, + deployer, + overrideGasLimit + ); + + if (isMainnet === false) { + finalBridgeImplAddress = bridgeImplementationAddress; + } + // Do not initialize the bridge! + + /* + * deploy proxy + * Do not initialize directly the proxy since we want to deploy the same code on L2 and this will alter the bytecode deployed of the proxy + */ + const transparentProxyFactory = await ethers.getContractFactory( + "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol:TransparentUpgradeableProxy", + deployer + ); + const initializeEmptyDataProxy = "0x"; + const deployTransactionProxy = ( + await transparentProxyFactory.getDeployTransaction( + bridgeImplementationAddress as string, // must have bytecode + proxyAdminAddress as string, + initializeEmptyDataProxy + ) + ).data; + + [proxyBridgeAddress] = await create2Deployment( + zkEVMDeployerContract, + salt, + deployTransactionProxy, + null, + deployer, + null + ); + + if (isMainnet === false) { + finalBridgeProxyAddress = proxyBridgeAddress; + } + + // Import OZ manifest the deployed contracts, its enough to import just the proyx, the rest are imported automatically ( admin/impl) + await upgrades.forceImport(proxyBridgeAddress as string, polygonZkEVMBridgeFactory, "transparent" as any); + + /* + *Deployment Global exit root manager + */ + const PolygonZkEVMGlobalExitRootL2Factory = await ethers.getContractFactory( + "PolygonZkEVMGlobalExitRootL2", + deployer + ); + let polygonZkEVMGlobalExitRootL2; + for (let i = 0; i < attemptsDeployProxy; i++) { + try { + polygonZkEVMGlobalExitRootL2 = await upgrades.deployProxy(PolygonZkEVMGlobalExitRootL2Factory, [], { + initializer: false, + constructorArgs: [finalBridgeProxyAddress], + unsafeAllow: ["constructor", "state-variable-immutable"], + }); + break; + } catch (error: any) { + console.log(`attempt ${i}`); + console.log("upgrades.deployProxy of polygonZkEVMGlobalExitRootL2 ", error.message); + } + + // reach limits of attempts + if (i + 1 === attemptsDeployProxy) { + throw new Error("polygonZkEVMGlobalExitRootL2 contract has not been deployed"); + } + } + + // Assert admin address + expect(await upgrades.erc1967.getAdminAddress(polygonZkEVMGlobalExitRootL2?.target as string)).to.be.equal( + proxyAdminAddress + ); + expect(await upgrades.erc1967.getAdminAddress(proxyBridgeAddress as string)).to.be.equal(proxyAdminAddress); + + const timelockContractFactory = await ethers.getContractFactory("PolygonZkEVMTimelock", deployer); + const timelockContract = await timelockContractFactory.deploy( + minDelayTimelock, + [timelockAdminAddress], + [timelockAdminAddress], + timelockAdminAddress, + zkevmAddressL2 + ); + await timelockContract.waitForDeployment(); + if (isMainnet === false) { + finalTimelockContractAdress = timelockContract.target; + } + + // Transfer ownership of the proxyAdmin to timelock + const proxyAdminInstance = proxyAdminFactory.attach(proxyAdminAddress as string) as ProxyAdmin; + await (await proxyAdminInstance.connect(deployer).transferOwnership(finalTimelockContractAdress as string)).wait(); + + // Recreate genesis with the current information: + + // ZKEVMDeployer + const zkEVMDeployerInfo = await getAddressInfo(zkEVMDeployerContract.target); + genesis.push({ + contractName: "PolygonZkEVMDeployer", + balance: "0", + nonce: zkEVMDeployerInfo.nonce.toString(), + address: finalzkEVMDeployerAdress, + bytecode: zkEVMDeployerInfo.bytecode, + storage: zkEVMDeployerInfo.storage, + }); + + // Proxy Admin + const proxyAdminInfo = await getAddressInfo(proxyAdminAddress as string); + genesis.push({ + contractName: "ProxyAdmin", + balance: "0", + nonce: proxyAdminInfo.nonce.toString(), + address: finalProxyAdminAddress, + bytecode: proxyAdminInfo.bytecode, + storage: proxyAdminInfo.storage, + }); + + // Bridge implementation + const bridgeImplementationInfo = await getAddressInfo(bridgeImplementationAddress as string); + genesis.push({ + contractName: "PolygonZkEVMBridge implementation", + balance: "0", + nonce: bridgeImplementationInfo.nonce.toString(), + address: finalBridgeImplAddress, + bytecode: bridgeImplementationInfo.bytecode, + // storage: bridgeImplementationInfo.storage, implementation do not have storage + }); + + // Bridge proxy + const bridgeProxyInfo = await getAddressInfo(proxyBridgeAddress as string); + // Override admin and implementation slots: + bridgeProxyInfo.storage[_ADMIN_SLOT] = ethers.zeroPadValue(finalProxyAdminAddress as string, 32); + bridgeProxyInfo.storage[_IMPLEMENTATION_SLOT] = ethers.zeroPadValue(finalBridgeImplAddress as string, 32); + + genesis.push({ + contractName: "PolygonZkEVMBridge proxy", + balance: balanceBrige, + nonce: bridgeProxyInfo.nonce.toString(), + address: finalBridgeProxyAddress, + bytecode: bridgeProxyInfo.bytecode, + storage: bridgeProxyInfo.storage, + }); + + // polygonZkEVMGlobalExitRootL2 implementation + const implGlobalExitRootL2 = await upgrades.erc1967.getImplementationAddress( + polygonZkEVMGlobalExitRootL2?.target as string + ); + const implGlobalExitRootL2Info = await getAddressInfo(implGlobalExitRootL2); + + if (isMainnet === false) { + finalGlobalExitRootL2ImplAddress = implGlobalExitRootL2; + } + + genesis.push({ + contractName: "PolygonZkEVMGlobalExitRootL2 implementation", + balance: "0", + nonce: implGlobalExitRootL2Info.nonce.toString(), + address: finalGlobalExitRootL2ImplAddress, + bytecode: implGlobalExitRootL2Info.bytecode, + // storage: implGlobalExitRootL2Info.storage, , implementation do not have storage + }); + + // polygonZkEVMGlobalExitRootL2 proxy + const proxyGlobalExitRootL2Info = await getAddressInfo(polygonZkEVMGlobalExitRootL2?.target as string); + + proxyGlobalExitRootL2Info.storage[_ADMIN_SLOT] = ethers.zeroPadValue(finalProxyAdminAddress as string, 32); + proxyGlobalExitRootL2Info.storage[_IMPLEMENTATION_SLOT] = ethers.zeroPadValue( + finalGlobalExitRootL2ImplAddress as string, + 32 + ); + + genesis.push({ + contractName: "PolygonZkEVMGlobalExitRootL2 proxy", + balance: "0", + nonce: proxyGlobalExitRootL2Info.nonce.toString(), + address: finalGlobalExitRootL2ProxyAddress, + bytecode: proxyGlobalExitRootL2Info.bytecode, + storage: proxyGlobalExitRootL2Info.storage, + }); + + // Timelock + const timelockInfo = await getAddressInfo(timelockContract.target); + + /* + * Since roles are used, most storage are writted in peusdoRandom storage slots + * bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256("TIMELOCK_ADMIN_ROLE"); + * bytes32 public constant PROPOSER_ROLE = keccak256("PROPOSER_ROLE"); + * bytes32 public constant EXECUTOR_ROLE = keccak256("EXECUTOR_ROLE"); + * bytes32 public constant CANCELLER_ROLE = keccak256("CANCELLER_ROLE"); + */ + const timelockRolesHash = [ + ethers.id("TIMELOCK_ADMIN_ROLE"), + ethers.id("PROPOSER_ROLE"), + ethers.id("EXECUTOR_ROLE"), + ethers.id("CANCELLER_ROLE"), + ]; + + for (let i = 0; i < timelockRolesHash.length; i++) { + const rolesMappingStoragePositionStruct = 0; + const storagePosition = ethers.solidityPackedKeccak256( + ["uint256", "uint256"], + [timelockRolesHash[i], rolesMappingStoragePositionStruct] + ); + + // check timelock address manager, and timelock address itself + const addressArray = [timelockAdminAddress, timelockContract.target]; + for (let j = 0; j < addressArray.length; j++) { + const storagePositionRole = ethers.solidityPackedKeccak256( + ["uint256", "uint256"], + [addressArray[j], storagePosition] + ); + const valueRole = await ethers.provider.getStorage(timelockContract.target, storagePositionRole); + if (valueRole !== "0x0000000000000000000000000000000000000000000000000000000000000000") { + timelockInfo.storage[storagePositionRole] = valueRole; + } + } + const roleAdminSlot = ethers.zeroPadValue(ethers.toQuantity(ethers.toBigInt(storagePosition) + 1n), 32); + const valueRoleAdminSlot = await ethers.provider.getStorage(timelockContract.target, roleAdminSlot); + if (valueRoleAdminSlot !== "0x0000000000000000000000000000000000000000000000000000000000000000") { + timelockInfo.storage[roleAdminSlot] = valueRoleAdminSlot; + } + } + + genesis.push({ + contractName: "PolygonZkEVMTimelock", + balance: "0", + nonce: timelockInfo.nonce.toString(), + address: finalTimelockContractAdress, + bytecode: timelockInfo.bytecode, + storage: timelockInfo.storage, + }); + + // Put nonces on deployers + + // Keyless deployer + genesis.push({ + accountName: "keyless Deployer", + balance: "0", + nonce: "1", + address: finalKeylessDeployer, + }); + + // deployer + const deployerInfo = await getAddressInfo(deployer.address); + genesis.push({ + accountName: "deployer", + balance: "0", + nonce: deployerInfo.nonce.toString(), + address: finalDeployer, + }); + + if (argv.test) { + // Add tester account with ether + genesis[genesis.length - 1].balance = "100000000000000000000000"; + } + + // calculate root + const poseidon = await getPoseidon(); + const {F} = poseidon; + const db = new MemDB(F); + const genesisRoot = [F.zero, F.zero, F.zero, F.zero]; + const accHashInput = [F.zero, F.zero, F.zero, F.zero]; + const defaultChainId = 1000; + + const zkEVMDB = await ZkEVMDB.newZkEVM( + db, + poseidon, + genesisRoot, + accHashInput, + genesis, + null, + null, + defaultChainId + ); + + fs.writeFileSync( + pathOutputJson, + JSON.stringify( + { + root: smtUtils.h4toString(zkEVMDB.stateRoot), + genesis, + }, + null, + 1 + ) + ); +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); + +async function getAddressInfo(address: string | Addressable) { + const nonce = await ethers.provider.getTransactionCount(address); + const bytecode = await ethers.provider.getCode(address); + + const storage = {} as { + [key: string]: number | string; + }; + + for (let i = 0; i < 200; i++) { + const storageValue = await ethers.provider.getStorage(address, i); + if (storageValue !== "0x0000000000000000000000000000000000000000000000000000000000000000") { + storage[ethers.toBeHex(i, 32)] = storageValue; + } + } + + const valueAdminSlot = await ethers.provider.getStorage(address, _ADMIN_SLOT); + if (valueAdminSlot !== "0x0000000000000000000000000000000000000000000000000000000000000000") { + storage[_ADMIN_SLOT] = valueAdminSlot; + } + const valuImplementationSlot = await ethers.provider.getStorage(address, _IMPLEMENTATION_SLOT); + if (valuImplementationSlot !== "0x0000000000000000000000000000000000000000000000000000000000000000") { + storage[_IMPLEMENTATION_SLOT] = valuImplementationSlot; + } + + return {nonce, bytecode, storage}; +} diff --git a/deployment/v1ToV2/2_deployPolygonZKEVMDeployer.ts b/deployment/v1ToV2/2_deployPolygonZKEVMDeployer.ts new file mode 100644 index 000000000..620f82b71 --- /dev/null +++ b/deployment/v1ToV2/2_deployPolygonZKEVMDeployer.ts @@ -0,0 +1,93 @@ +/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if */ +/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */ +import {expect} from "chai"; +import path = require("path"); +import fs = require("fs"); + +import * as dotenv from "dotenv"; +dotenv.config({path: path.resolve(__dirname, "../../.env")}); +import {ethers, upgrades} from "hardhat"; +import {HardhatEthersSigner} from "@nomicfoundation/hardhat-ethers/signers"; + +import {deployPolygonZkEVMDeployer} from "../helpers/deployment-helpers"; +import "../helpers/utils"; + +const pathDeployParameters = path.join(__dirname, "./deploy_parameters.json"); +const deployParameters = require("./deploy_parameters.json"); + +async function main() { + // Load provider + let currentProvider = ethers.provider; + if (deployParameters.multiplierGas || deployParameters.maxFeePerGas) { + if (process.env.HARDHAT_NETWORK !== "hardhat") { + currentProvider = ethers.getDefaultProvider( + `https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}` + ) as any; + if (deployParameters.maxPriorityFeePerGas && deployParameters.maxFeePerGas) { + console.log( + `Hardcoded gas used: MaxPriority${deployParameters.maxPriorityFeePerGas} gwei, MaxFee${deployParameters.maxFeePerGas} gwei` + ); + const FEE_DATA = new ethers.FeeData( + null, + ethers.parseUnits(deployParameters.maxFeePerGas, "gwei"), + ethers.parseUnits(deployParameters.maxPriorityFeePerGas, "gwei") + ); + + currentProvider.getFeeData = async () => FEE_DATA; + } else { + console.log("Multiplier gas used: ", deployParameters.multiplierGas); + async function overrideFeeData() { + const feedata = await ethers.provider.getFeeData(); + return new ethers.FeeData( + null, + ((feedata.maxFeePerGas as bigint) * BigInt(deployParameters.multiplierGas)) / 1000n, + ((feedata.maxPriorityFeePerGas as bigint) * BigInt(deployParameters.multiplierGas)) / 1000n + ); + } + currentProvider.getFeeData = overrideFeeData; + } + } + } + + // Load deployer + let deployer; + if (deployParameters.deployerPvtKey) { + deployer = new ethers.Wallet(deployParameters.deployerPvtKey, currentProvider); + } else if (process.env.MNEMONIC) { + deployer = ethers.HDNodeWallet.fromMnemonic( + ethers.Mnemonic.fromPhrase(process.env.MNEMONIC), + "m/44'/60'/0'/0/0" + ).connect(currentProvider); + } else { + [deployer] = await ethers.getSigners(); + } + + // Load initialZkEVMDeployerOwner + const {initialZkEVMDeployerOwner} = deployParameters; + + if (initialZkEVMDeployerOwner === undefined || initialZkEVMDeployerOwner === "") { + throw new Error("Missing parameter: initialZkEVMDeployerOwner"); + } + + // Deploy PolygonZkEVMDeployer if is not deployed already using keyless deployment + const [zkEVMDeployerContract, keylessDeployer] = await deployPolygonZkEVMDeployer( + initialZkEVMDeployerOwner, + deployer as HardhatEthersSigner + ); + + if (keylessDeployer === ethers.ZeroAddress) { + console.log("#######################\n"); + console.log("polygonZkEVMDeployer already deployed on: ", zkEVMDeployerContract.target); + } else { + console.log("#######################\n"); + console.log("polygonZkEVMDeployer deployed on: ", zkEVMDeployerContract.target); + } + + deployParameters.zkEVMDeployerAddress = zkEVMDeployerContract.target; + fs.writeFileSync(pathDeployParameters, JSON.stringify(deployParameters, null, 1)); +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/deployment/v1ToV2/3_deployContracts.ts b/deployment/v1ToV2/3_deployContracts.ts new file mode 100644 index 000000000..1d946bef6 --- /dev/null +++ b/deployment/v1ToV2/3_deployContracts.ts @@ -0,0 +1,607 @@ +/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if */ +/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */ +import {expect} from "chai"; +import path = require("path"); +import fs = require("fs"); + +import * as dotenv from "dotenv"; +dotenv.config({path: path.resolve(__dirname, "../../.env")}); +import {ethers, upgrades} from "hardhat"; + +const {create2Deployment} = require("../helpers/deployment-helpers"); + +const pathOutputJson = path.join(__dirname, "./deploy_output.json"); +const pathOngoingDeploymentJson = path.join(__dirname, "./deploy_ongoing.json"); + +const deployParameters = require("./deploy_parameters.json"); + +const pathOZUpgradability = path.join(__dirname, `../../.openzeppelin/${process.env.HARDHAT_NETWORK}.json`); +const genesis = require("./genesis.json"); + +import { + PolygonZkEVMBridgeV2, + PolygonZkEVMDeployer, + PolygonZkEVMGlobalExitRootV2, + PolygonZkEVMTimelock, + ProxyAdmin, +} from "../../typechain-types"; +import "../helpers/utils"; + +const DEFAULT_ADMIN_ROLE = ethers.ZeroHash; +const ADD_ROLLUP_TYPE_ROLE = ethers.id("ADD_ROLLUP_TYPE_ROLE"); +const OBSOLETE_ROLLUP_TYPE_ROLE = ethers.id("OBSOLETE_ROLLUP_TYPE_ROLE"); +const CREATE_ROLLUP_ROLE = ethers.id("CREATE_ROLLUP_ROLE"); +const ADD_EXISTING_ROLLUP_ROLE = ethers.id("ADD_EXISTING_ROLLUP_ROLE"); +const UPDATE_ROLLUP_ROLE = ethers.id("UPDATE_ROLLUP_ROLE"); +const TRUSTED_AGGREGATOR_ROLE = ethers.id("TRUSTED_AGGREGATOR_ROLE"); +const TRUSTED_AGGREGATOR_ROLE_ADMIN = ethers.id("TRUSTED_AGGREGATOR_ROLE_ADMIN"); +const TWEAK_PARAMETERS_ROLE = ethers.id("TWEAK_PARAMETERS_ROLE"); +const SET_FEE_ROLE = ethers.id("SET_FEE_ROLE"); +const STOP_EMERGENCY_ROLE = ethers.id("STOP_EMERGENCY_ROLE"); +const EMERGENCY_COUNCIL_ROLE = ethers.id("EMERGENCY_COUNCIL_ROLE"); +const EMERGENCY_COUNCIL_ADMIN = ethers.id("EMERGENCY_COUNCIL_ADMIN"); + +async function main() { + // Check that there's no previous OZ deployment + if (fs.existsSync(pathOZUpgradability)) { + throw new Error( + `There's upgradability information from previous deployments, it's mandatory to erase them before start a new one, path: ${pathOZUpgradability}` + ); + } + + // Check if there's an ongoing deployment + let ongoingDeployment = {} as any; + if (fs.existsSync(pathOngoingDeploymentJson)) { + console.log("WARNING: using ongoing deployment"); + ongoingDeployment = require(pathOngoingDeploymentJson); + } + + // Constant variables + const networkIDMainnet = 0; + + // Gas token variables are 0 in mainnet, since native token it's ether + const gasTokenAddressMainnet = ethers.ZeroAddress; + const gasTokenNetworkMainnet = 0n; + const attemptsDeployProxy = 20; + const gasTokenMetadata = "0x"; + + /* + * Check deploy parameters + * Check that every necessary parameter is fullfilled + */ + const mandatoryDeploymentParameters = [ + "timelockAdminAddress", + "minDelayTimelock", + "salt", + "admin", + "trustedAggregator", + "trustedAggregatorTimeout", + "pendingStateTimeout", + "emergencyCouncilAddress", + "zkEVMDeployerAddress", + "polTokenAddress", + "realVerifier", + "trustedSequencerURL", + "networkName", + "description", + "trustedSequencer", + "chainID", + "adminZkEVM", + "forkID", + "version", + ]; + + for (const parameterName of mandatoryDeploymentParameters) { + if (deployParameters[parameterName] === undefined || deployParameters[parameterName] === "") { + throw new Error(`Missing parameter: ${parameterName}`); + } + } + + const { + timelockAdminAddress, + minDelayTimelock, + salt, + admin, + trustedAggregator, + trustedAggregatorTimeout, + pendingStateTimeout, + emergencyCouncilAddress, + zkEVMDeployerAddress, + polTokenAddress, + realVerifier, + trustedSequencerURL, + networkName, + description, + trustedSequencer, + chainID, + adminZkEVM, + forkID, + version, + } = deployParameters; + + // Load provider + let currentProvider = ethers.provider; + if (deployParameters.multiplierGas || deployParameters.maxFeePerGas) { + if (process.env.HARDHAT_NETWORK !== "hardhat") { + currentProvider = ethers.getDefaultProvider( + `https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}` + ) as any; + if (deployParameters.maxPriorityFeePerGas && deployParameters.maxFeePerGas) { + console.log( + `Hardcoded gas used: MaxPriority${deployParameters.maxPriorityFeePerGas} gwei, MaxFee${deployParameters.maxFeePerGas} gwei` + ); + const FEE_DATA = new ethers.FeeData( + null, + ethers.parseUnits(deployParameters.maxFeePerGas, "gwei"), + ethers.parseUnits(deployParameters.maxPriorityFeePerGas, "gwei") + ); + + currentProvider.getFeeData = async () => FEE_DATA; + } else { + console.log("Multiplier gas used: ", deployParameters.multiplierGas); + async function overrideFeeData() { + const feedata = await ethers.provider.getFeeData(); + return new ethers.FeeData( + null, + ((feedata.maxFeePerGas as bigint) * BigInt(deployParameters.multiplierGas)) / 1000n, + ((feedata.maxPriorityFeePerGas as bigint) * BigInt(deployParameters.multiplierGas)) / 1000n + ); + } + currentProvider.getFeeData = overrideFeeData; + } + } + } + + // Load deployer + let deployer; + if (deployParameters.deployerPvtKey) { + deployer = new ethers.Wallet(deployParameters.deployerPvtKey, currentProvider); + } else if (process.env.MNEMONIC) { + deployer = ethers.HDNodeWallet.fromMnemonic( + ethers.Mnemonic.fromPhrase(process.env.MNEMONIC), + "m/44'/60'/0'/0/0" + ).connect(currentProvider); + } else { + [deployer] = await ethers.getSigners(); + } + + // Load zkEVM deployer + const PolgonZKEVMDeployerFactory = await ethers.getContractFactory("PolygonZkEVMDeployer", deployer); + const zkEVMDeployerContract = PolgonZKEVMDeployerFactory.attach(zkEVMDeployerAddress) as PolygonZkEVMDeployer; + + // check deployer is the owner of the deployer + if ((await deployer.provider?.getCode(zkEVMDeployerContract.target)) === "0x") { + throw new Error("zkEVM deployer contract is not deployed"); + } + expect(deployer.address).to.be.equal(await zkEVMDeployerContract.owner()); + + // deploy veriferi + let verifierContract; + if (realVerifier === true) { + const VerifierRollup = await ethers.getContractFactory("FflonkVerifier", deployer); + verifierContract = await VerifierRollup.deploy(); + await verifierContract.waitForDeployment(); + } else { + const VerifierRollupHelperFactory = await ethers.getContractFactory("VerifierRollupHelperMock", deployer); + verifierContract = await VerifierRollupHelperFactory.deploy(); + await verifierContract.waitForDeployment(); + } + console.log("#######################\n"); + console.log("Verifier deployed to:", verifierContract.target); + + /* + * Deploy Bridge + * Deploy admin --> implementation --> proxy + */ + + // Deploy proxy admin: + const proxyAdminFactory = await ethers.getContractFactory( + "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol:ProxyAdmin", + deployer + ); + const deployTransactionAdmin = (await proxyAdminFactory.getDeployTransaction()).data; + const dataCallAdmin = proxyAdminFactory.interface.encodeFunctionData("transferOwnership", [deployer.address]); + const [proxyAdminAddress, isProxyAdminDeployed] = await create2Deployment( + zkEVMDeployerContract, + salt, + deployTransactionAdmin, + dataCallAdmin, + deployer + ); + + if (isProxyAdminDeployed) { + console.log("#######################\n"); + console.log("Proxy admin deployed to:", proxyAdminAddress); + } else { + console.log("#######################\n"); + console.log("Proxy admin was already deployed to:", proxyAdminAddress); + } + + const proxyAdminInstance = proxyAdminFactory.attach(proxyAdminAddress) as ProxyAdmin; + const proxyAdminOwner = await proxyAdminInstance.owner(); + if (proxyAdminOwner !== deployer.address) { + throw new Error( + `Proxy admin was deployed, but the owner is not the deployer, deployer address: ${deployer.address}, proxyAdmin: ${proxyAdminOwner}` + ); + } + + // Deploy implementation PolygonZkEVMBridge + const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2", deployer); + const deployTransactionBridge = (await polygonZkEVMBridgeFactory.getDeployTransaction()).data; + const dataCallNull = null; + // Mandatory to override the gasLimit since the estimation with create are mess up D: + const overrideGasLimit = 5500000n; + const [bridgeImplementationAddress, isBridgeImplDeployed] = await create2Deployment( + zkEVMDeployerContract, + salt, + deployTransactionBridge, + dataCallNull, + deployer, + overrideGasLimit + ); + + if (isBridgeImplDeployed) { + console.log("#######################\n"); + console.log("bridge impl deployed to:", bridgeImplementationAddress); + } else { + console.log("#######################\n"); + console.log("bridge impl was already deployed to:", bridgeImplementationAddress); + } + + let precalculateGlobalExitRootAddress; + let precalculateZkevmAddress; + let timelockContract; + + const timelockContractFactory = await ethers.getContractFactory("PolygonZkEVMTimelock", deployer); + + // Check if the contract is already deployed + if ( + ongoingDeployment.polygonZkEVMGlobalExitRoot && + ongoingDeployment.polygonZkEVMContract && + ongoingDeployment.polygonTimelock + ) { + precalculateGlobalExitRootAddress = ongoingDeployment.polygonZkEVMGlobalExitRoot; + precalculateZkevmAddress = ongoingDeployment.polygonZkEVMContract; + timelockContract = timelockContractFactory.attach(ongoingDeployment.polygonTimelock) as PolygonZkEVMTimelock; + } else { + // If both are not deployed, it's better to deploy them both again + delete ongoingDeployment.polygonZkEVMGlobalExitRoot; + delete ongoingDeployment.polygonZkEVMContract; + delete ongoingDeployment.polygonTimelock; + fs.writeFileSync(pathOngoingDeploymentJson, JSON.stringify(ongoingDeployment, null, 1)); + + // Nonce globalExitRoot: currentNonce + 1 (deploy bridge proxy) + 1(impl globalExitRoot) + // + 1 (deployTimelock) = +3 + const nonceProxyGlobalExitRoot = Number(await ethers.provider.getTransactionCount(deployer.address)) + 3; + // nonceProxyRollupManager :Nonce globalExitRoot + 1 (proxy globalExitRoot) + 1 (impl zkEVM) = +2 + const nonceProxyZkevm = nonceProxyGlobalExitRoot + 2; + + // Contracts are not deployed, normal deployment + precalculateGlobalExitRootAddress = ethers.getCreateAddress({ + from: deployer.address, + nonce: nonceProxyGlobalExitRoot, + }); + precalculateZkevmAddress = ethers.getCreateAddress({from: deployer.address, nonce: nonceProxyZkevm}); + + // deploy timelock + console.log("\n#######################"); + console.log("##### Deployment TimelockContract #####"); + console.log("#######################"); + console.log("minDelayTimelock:", minDelayTimelock); + console.log("timelockAdminAddress:", timelockAdminAddress); + console.log("Rollup Manager:", precalculateZkevmAddress); + timelockContract = await timelockContractFactory.deploy( + minDelayTimelock, + [timelockAdminAddress], + [timelockAdminAddress], + timelockAdminAddress, + precalculateZkevmAddress + ); + await timelockContract.waitForDeployment(); + console.log("#######################\n"); + console.log("Polygon timelockContract deployed to:", timelockContract.target); + } + + console.log("\n#######################"); + console.log("##### Checks TimelockContract #####"); + console.log("#######################"); + //console.log("minDelayTimelock:", await timelockContract.getMinDelay()); + console.log("polygonZkEVM:", await timelockContract.polygonZkEVM()); + + /* + * deploy proxy + * Do not initialize directly the proxy since we want to deploy the same code on L2 and this will alter the bytecode deployed of the proxy + */ + const transparentProxyFactory = await ethers.getContractFactory( + "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol:TransparentUpgradeableProxy", + deployer + ); + const initializeEmptyDataProxy = "0x"; + const deployTransactionProxy = ( + await transparentProxyFactory.getDeployTransaction( + bridgeImplementationAddress, + proxyAdminAddress, + initializeEmptyDataProxy + ) + ).data; + + const dataCallProxy = polygonZkEVMBridgeFactory.interface.encodeFunctionData("initialize", [ + networkIDMainnet, + gasTokenAddressMainnet, + gasTokenNetworkMainnet, + precalculateGlobalExitRootAddress, + precalculateZkevmAddress, + gasTokenMetadata, + ]); + + const [proxyBridgeAddress, isBridgeProxyDeployed] = await create2Deployment( + zkEVMDeployerContract, + salt, + deployTransactionProxy, + dataCallProxy, + deployer + ); + const polygonZkEVMBridgeContract = polygonZkEVMBridgeFactory.attach(proxyBridgeAddress) as PolygonZkEVMBridgeV2; + + if (isBridgeProxyDeployed) { + console.log("#######################\n"); + console.log("PolygonZkEVMBridge deployed to:", polygonZkEVMBridgeContract.target); + } else { + console.log("#######################\n"); + console.log("PolygonZkEVMBridge was already deployed to:", polygonZkEVMBridgeContract.target); + + // If it was already deployed, check that the initialized calldata matches the actual deployment + expect(precalculateGlobalExitRootAddress).to.be.equal(await polygonZkEVMBridgeContract.globalExitRootManager()); + expect(precalculateZkevmAddress).to.be.equal(await polygonZkEVMBridgeContract.polygonRollupManager()); + } + + console.log("\n#######################"); + console.log("##### Checks PolygonZkEVMBridge #####"); + console.log("#######################"); + console.log("PolygonZkEVMGlobalExitRootAddress:", await polygonZkEVMBridgeContract.globalExitRootManager()); + console.log("networkID:", await polygonZkEVMBridgeContract.networkID()); + console.log("zkEVMaddress:", await polygonZkEVMBridgeContract.polygonRollupManager()); + + // Import OZ manifest the deployed contracts, its enough to import just the proxy, the rest are imported automatically (admin/impl) + await upgrades.forceImport(proxyBridgeAddress, polygonZkEVMBridgeFactory, "transparent" as any); + + /* + *Deployment Global exit root manager + */ + let polygonZkEVMGlobalExitRoot; + const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRootV2", deployer); + if (!ongoingDeployment.polygonZkEVMGlobalExitRoot) { + for (let i = 0; i < attemptsDeployProxy; i++) { + try { + polygonZkEVMGlobalExitRoot = await upgrades.deployProxy(PolygonZkEVMGlobalExitRootFactory, [], { + initializer: false, + constructorArgs: [precalculateZkevmAddress, proxyBridgeAddress], + unsafeAllow: ["constructor", "state-variable-immutable"], + }); + break; + } catch (error: any) { + console.log(`attempt ${i}`); + console.log("upgrades.deployProxy of polygonZkEVMGlobalExitRoot ", error.message); + } + + // reach limits of attempts + if (i + 1 === attemptsDeployProxy) { + throw new Error("polygonZkEVMGlobalExitRoot contract has not been deployed"); + } + } + + expect(precalculateGlobalExitRootAddress).to.be.equal(polygonZkEVMGlobalExitRoot?.target); + + console.log("#######################\n"); + console.log("polygonZkEVMGlobalExitRoot deployed to:", polygonZkEVMGlobalExitRoot?.target); + + // save an ongoing deployment + ongoingDeployment.polygonZkEVMGlobalExitRoot = polygonZkEVMGlobalExitRoot?.target; + fs.writeFileSync(pathOngoingDeploymentJson, JSON.stringify(ongoingDeployment, null, 1)); + } else { + // sanity check + expect(precalculateGlobalExitRootAddress).to.be.equal(ongoingDeployment.polygonZkEVMGlobalExitRoot); + + // Expect the precalculate address matches de onogin deployment + polygonZkEVMGlobalExitRoot = PolygonZkEVMGlobalExitRootFactory.attach( + ongoingDeployment.polygonZkEVMGlobalExitRoot + ) as PolygonZkEVMGlobalExitRootV2; + + console.log("#######################\n"); + console.log("polygonZkEVMGlobalExitRoot already deployed on: ", ongoingDeployment.polygonZkEVMGlobalExitRoot); + + // Import OZ manifest the deployed contracts, its enough to import just the proyx, the rest are imported automatically (admin/impl) + await upgrades.forceImport( + ongoingDeployment.polygonZkEVMGlobalExitRoot, + PolygonZkEVMGlobalExitRootFactory, + "transparent" as any + ); + + // Check against current deployment + expect(polygonZkEVMBridgeContract.target).to.be.equal(await polygonZkEVMGlobalExitRoot.bridgeAddress()); + expect(precalculateZkevmAddress).to.be.equal(await polygonZkEVMGlobalExitRoot.rollupManager()); + } + + // deploy zkEVM + console.log("\n#######################"); + console.log("##### Deployment Polygon ZK-EVM #####"); + console.log("#######################"); + console.log("deployer:", deployer.address); + console.log("PolygonZkEVMGlobalExitRootAddress:", polygonZkEVMGlobalExitRoot?.target); + console.log("polTokenAddress:", polTokenAddress); + console.log("verifierAddress:", verifierContract.target); + console.log("polygonZkEVMBridgeContract:", polygonZkEVMBridgeContract.target); + + console.log("trustedAggregator:", trustedAggregator); + console.log("pendingStateTimeout:", pendingStateTimeout); + console.log("trustedAggregatorTimeout:", trustedAggregatorTimeout); + console.log("admin:", adminZkEVM); + console.log("chainID:", chainID); + console.log("trustedSequencer:", trustedSequencer); + + console.log("genesisRoot:", genesis.root); + console.log("trustedSequencerURL:", trustedSequencerURL); + console.log("networkName:", networkName); + console.log("forkID:", forkID); + console.log("emergencyCouncilAddress:", emergencyCouncilAddress); + + const PolygonZkEVMFactory = await ethers.getContractFactory("PolygonZkEVM", deployer); + + let polygonZkEVMContract: any; + let deploymentBlockNumber; + + if (!ongoingDeployment.polygonZkEVMContract) { + for (let i = 0; i < attemptsDeployProxy; i++) { + try { + polygonZkEVMContract = await upgrades.deployProxy( + PolygonZkEVMFactory, + [ + { + admin: adminZkEVM, + trustedSequencer: trustedSequencer, + pendingStateTimeout: pendingStateTimeout, + trustedAggregator: trustedAggregator, + trustedAggregatorTimeout: trustedAggregatorTimeout, + }, + genesis.root, + trustedSequencerURL, + networkName, + version, + ], + { + constructorArgs: [ + polygonZkEVMGlobalExitRoot?.target, + polTokenAddress, + verifierContract.target, + polygonZkEVMBridgeContract.target, + chainID, + forkID, + ], + unsafeAllow: ["constructor", "state-variable-immutable"], + } + ); + + break; + } catch (error: any) { + console.log(`attempt ${i}`); + console.log("upgrades.deployProxy of polygonZkEVMContract ", error.message); + } + + // reach limits of attempts + if (i + 1 === attemptsDeployProxy) { + throw new Error("PolygonZkEVM contract has not been deployed"); + } + } + + expect(precalculateZkevmAddress).to.be.equal(polygonZkEVMContract?.target); + + console.log("#######################\n"); + console.log("polygonZkEVMContract deployed to:", polygonZkEVMContract?.target); + + // save an ongoing deployment + ongoingDeployment.polygonZkEVMContract = polygonZkEVMContract?.target; + fs.writeFileSync(pathOngoingDeploymentJson, JSON.stringify(ongoingDeployment, null, 1)); + deploymentBlockNumber = (await polygonZkEVMContract?.deploymentTransaction().wait()).blockNumber; + } else { + // Expect the precalculate address matches de onogin deployment, sanity check + expect(precalculateZkevmAddress).to.be.equal(ongoingDeployment.polygonZkEVMContract); + polygonZkEVMContract = PolygonZkEVMFactory.attach(ongoingDeployment.polygonZkEVMContract); + + console.log("#######################\n"); + console.log("polygonZkEVMContract already deployed on: ", ongoingDeployment.polygonZkEVMContract); + + // Import OZ manifest the deployed contracts, its enough to import just the proyx, the rest are imported automatically ( admin/impl) + await upgrades.forceImport(ongoingDeployment.polygonZkEVMContract, PolygonZkEVMFactory, "transparent" as any); + + deploymentBlockNumber = 0; + } + + console.log("\n#######################"); + console.log("##### Checks PolygonZkEVM #####"); + console.log("#######################"); + console.log("PolygonZkEVMGlobalExitRootAddress:", await polygonZkEVMContract.globalExitRootManager()); + console.log("polTokenAddres:", await polygonZkEVMContract.matic()); + console.log("verifierAddress:", await polygonZkEVMContract.rollupVerifier()); + console.log("polygonZkEVMBridgeContract:", await polygonZkEVMContract.bridgeAddress()); + + console.log("admin:", await polygonZkEVMContract.admin()); + console.log("chainID:", await polygonZkEVMContract.chainID()); + console.log("trustedSequencer:", await polygonZkEVMContract.trustedSequencer()); + console.log("pendingStateTimeout:", await polygonZkEVMContract.pendingStateTimeout()); + console.log("trustedAggregator:", await polygonZkEVMContract.trustedAggregator()); + console.log("trustedAggregatorTimeout:", await polygonZkEVMContract.trustedAggregatorTimeout()); + + console.log("genesiRoot:", await polygonZkEVMContract.batchNumToStateRoot(0)); + console.log("trustedSequencerURL:", await polygonZkEVMContract.trustedSequencerURL()); + console.log("networkName:", await polygonZkEVMContract.networkName()); + console.log("owner:", await polygonZkEVMContract.owner()); + console.log("forkID:", await polygonZkEVMContract.forkID()); + + // Assert admin address + expect(await upgrades.erc1967.getAdminAddress(precalculateZkevmAddress)).to.be.equal(proxyAdminAddress); + expect(await upgrades.erc1967.getAdminAddress(precalculateGlobalExitRootAddress)).to.be.equal(proxyAdminAddress); + expect(await upgrades.erc1967.getAdminAddress(proxyBridgeAddress)).to.be.equal(proxyAdminAddress); + + // Update current system to rollup manager + + const PolygonZkEVMV2ExistentFactory = await ethers.getContractFactory("PolygonZkEVMV2Existent"); + + const newPolygonZkEVMContract = (await upgrades.deployProxy(PolygonZkEVMV2ExistentFactory, [], { + initializer: false, + constructorArgs: [ + polygonZkEVMGlobalExitRoot?.target, + polTokenAddress, + polygonZkEVMBridgeContract.target, + polygonZkEVMContract.target, + ], + unsafeAllow: ["constructor", "state-variable-immutable"], + })) as any; + + const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager"); + const txRollupManager = await upgrades.upgradeProxy(polygonZkEVMContract.target, PolygonRollupManagerFactory, { + constructorArgs: [polygonZkEVMGlobalExitRoot?.target, polTokenAddress, polygonZkEVMBridgeContract.target], + unsafeAllow: ["constructor", "state-variable-immutable"], + unsafeAllowRenames: false, + call: { + fn: "initialize", + args: [ + trustedAggregator, + pendingStateTimeout, + trustedAggregatorTimeout, + admin, + timelockAdminAddress, + emergencyCouncilAddress, + newPolygonZkEVMContract.target, + verifierContract.target, + ], + }, + }); + await txRollupManager.waitForDeployment(); + + // Transfer ownership of the proxyAdmin to timelock + await (await proxyAdminInstance.transferOwnership(timelockContract.target)).wait(); + + const outputJson = { + polygonRollupManager: polygonZkEVMContract.target, + polygonZkEVMBridgeAddress: polygonZkEVMBridgeContract.target, + polygonZkEVMGlobalExitRootAddress: polygonZkEVMGlobalExitRoot?.target, + polTokenAddress, + zkEVMDeployerContract: zkEVMDeployerContract.target, + deployerAddress: deployer.address, + timelockContractAddress: timelockContract.target, + deploymentBlockNumber, + admin, + trustedAggregator, + proxyAdminAddress, + salt, + }; + fs.writeFileSync(pathOutputJson, JSON.stringify(outputJson, null, 1)); + + // Remove ongoing deployment + fs.unlinkSync(pathOngoingDeploymentJson); +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/deployment/v1ToV2/4_createRollup.ts b/deployment/v1ToV2/4_createRollup.ts new file mode 100644 index 000000000..dbc830ca5 --- /dev/null +++ b/deployment/v1ToV2/4_createRollup.ts @@ -0,0 +1,307 @@ +/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if */ +/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */ +import {expect} from "chai"; +import path = require("path"); +import fs = require("fs"); + +import * as dotenv from "dotenv"; +dotenv.config({path: path.resolve(__dirname, "../../.env")}); +import {ethers, upgrades} from "hardhat"; +import {HardhatEthersSigner} from "@nomicfoundation/hardhat-ethers/signers"; +const {create2Deployment} = require("../helpers/deployment-helpers"); + +const pathGenesis = path.join(__dirname, "./genesis.json"); + +const createRollupParameters = require("./create_rollup_parameters.json"); +const genesis = require("./genesis.json"); +const deployOutput = require("./deploy_output.json"); +import "../helpers/utils"; + +const pathOutputJson = path.join(__dirname, "./create_rollup_output.json"); + +import {PolygonRollupManager, PolygonZkEVMV2, PolygonZkEVMBridgeV2} from "../../typechain-types"; + +async function main() { + const attemptsDeployProxy = 20; + + const outputJson = {} as any; + + /* + * Check deploy parameters + * Check that every necessary parameter is fullfilled + */ + const mandatoryDeploymentParameters = [ + "realVerifier", + "trustedSequencerURL", + "networkName", + "description", + "trustedSequencer", + "chainID", + "adminZkEVM", + "forkID", + "consensusContract", + ]; + + for (const parameterName of mandatoryDeploymentParameters) { + if (createRollupParameters[parameterName] === undefined || createRollupParameters[parameterName] === "") { + throw new Error(`Missing parameter: ${parameterName}`); + } + } + + const { + realVerifier, + trustedSequencerURL, + networkName, + description, + trustedSequencer, + chainID, + adminZkEVM, + forkID, + consensusContract, + } = createRollupParameters; + + const supportedConensus = [ + "PolygonZkEVMEtrog", + "PolygonZkEVMV2", + "PolygonDataComittee", + "PolygonDataComitteeEtrog", + ]; + + if (!supportedConensus.includes(consensusContract)) { + throw new Error(`Consensus contract not supported, supported contracts are: ${supportedConensus}`); + } + + // Load provider + let currentProvider = ethers.provider; + if (createRollupParameters.multiplierGas || createRollupParameters.maxFeePerGas) { + if (process.env.HARDHAT_NETWORK !== "hardhat") { + currentProvider = ethers.getDefaultProvider( + `https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}` + ) as any; + if (createRollupParameters.maxPriorityFeePerGas && createRollupParameters.maxFeePerGas) { + console.log( + `Hardcoded gas used: MaxPriority${createRollupParameters.maxPriorityFeePerGas} gwei, MaxFee${createRollupParameters.maxFeePerGas} gwei` + ); + const FEE_DATA = new ethers.FeeData( + null, + ethers.parseUnits(createRollupParameters.maxFeePerGas, "gwei"), + ethers.parseUnits(createRollupParameters.maxPriorityFeePerGas, "gwei") + ); + + currentProvider.getFeeData = async () => FEE_DATA; + } else { + console.log("Multiplier gas used: ", createRollupParameters.multiplierGas); + async function overrideFeeData() { + const feedata = await ethers.provider.getFeeData(); + return new ethers.FeeData( + null, + ((feedata.maxFeePerGas as bigint) * BigInt(createRollupParameters.multiplierGas)) / 1000n, + ((feedata.maxPriorityFeePerGas as bigint) * BigInt(createRollupParameters.multiplierGas)) / + 1000n + ); + } + currentProvider.getFeeData = overrideFeeData; + } + } + } + + // Load deployer + let deployer; + if (createRollupParameters.deployerPvtKey) { + deployer = new ethers.Wallet(createRollupParameters.deployerPvtKey, currentProvider); + } else if (process.env.MNEMONIC) { + deployer = ethers.HDNodeWallet.fromMnemonic( + ethers.Mnemonic.fromPhrase(process.env.MNEMONIC), + "m/44'/60'/0'/0/0" + ).connect(currentProvider); + } else { + [deployer] = await ethers.getSigners(); + } + + // Load Rollup manager + const PolgonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager", deployer); + const rollupManagerContract = PolgonRollupManagerFactory.attach( + deployOutput.polygonRollupManager + ) as PolygonRollupManager; + + let verifierContract; + if (realVerifier === true) { + const VerifierRollup = await ethers.getContractFactory("FflonkVerifier", deployer); + verifierContract = await VerifierRollup.deploy(); + await verifierContract.waitForDeployment(); + } else { + const VerifierRollupHelperFactory = await ethers.getContractFactory("VerifierRollupHelperMock", deployer); + verifierContract = await VerifierRollupHelperFactory.deploy(); + await verifierContract.waitForDeployment(); + } + console.log("#######################\n"); + console.log("Verifier deployed to:", verifierContract.target); + + // Since it's a mock deployment deployer has all the rights + const ADD_ROLLUP_TYPE_ROLE = ethers.id("ADD_ROLLUP_TYPE_ROLE"); + const CREATE_ROLLUP_ROLE = ethers.id("CREATE_ROLLUP_ROLE"); + + // Check role: + if ((await rollupManagerContract.hasRole(ADD_ROLLUP_TYPE_ROLE, deployer.address)) == false) + await rollupManagerContract.grantRole(ADD_ROLLUP_TYPE_ROLE, deployer.address); + + if ((await rollupManagerContract.hasRole(CREATE_ROLLUP_ROLE, deployer.address)) == false) + await rollupManagerContract.grantRole(CREATE_ROLLUP_ROLE, deployer.address); + + // Create consensus implementation + const PolygonconsensusFactory = (await ethers.getContractFactory(consensusContract, deployer)) as any; + let PolygonconsensusContract; + + PolygonconsensusContract = await PolygonconsensusFactory.deploy( + deployOutput.polygonZkEVMGlobalExitRootAddress, + deployOutput.polTokenAddress, + deployOutput.polygonZkEVMBridgeAddress, + deployOutput.polygonRollupManager + ); + await PolygonconsensusContract.waitForDeployment(); + + if (consensusContract.includes("DataComittee")) { + // deploy data commitee + const PolygonDataComittee = (await ethers.getContractFactory("CDKDataCommittee", deployer)) as any; + let polygonDataComitteeContract; + + for (let i = 0; i < attemptsDeployProxy; i++) { + try { + polygonDataComitteeContract = await upgrades.deployProxy(PolygonDataComittee, []); + break; + } catch (error: any) { + console.log(`attempt ${i}`); + console.log("upgrades.deployProxy of polygonDataComitteeContract ", error.message); + } + // reach limits of attempts + if (i + 1 === attemptsDeployProxy) { + throw new Error("polygonDataComitteeContract contract has not been deployed"); + } + } + // add data commitee to the consensus contract + if ((await PolygonconsensusContract.admin()) == deployer.address) { + await (await PolygonconsensusContract.setDataCommittee(polygonDataComitteeContract?.target)).wait(); + } + + outputJson.polygonDataComitteeContract = polygonDataComitteeContract?.target; + } + + // Add a new rollup type with timelock + const rollupCompatibilityID = 0; + await ( + await rollupManagerContract.addNewRollupType( + PolygonconsensusContract.target, + verifierContract.target, + forkID, + rollupCompatibilityID, + genesis.root, + description + ) + ).wait(); + + console.log("#######################\n"); + console.log("Added new Rollup Type deployed"); + const newRollupTypeID = await rollupManagerContract.rollupTypeCount(); + + let gasTokenAddress, gasTokenNetwork, gasTokenMetadata; + + if ( + createRollupParameters.gasTokenAddress && + createRollupParameters.gasTokenAddress != "" && + createRollupParameters.gasTokenAddress != ethers.ZeroAddress + ) { + // Get bridge instance + const bridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2", deployer); + const polygonZkEVMBridgeContract = bridgeFactory.attach( + deployOutput.polygonZkEVMBridgeAddress + ) as PolygonZkEVMBridgeV2; + + // Get token metadata + gasTokenMetadata = await polygonZkEVMBridgeContract.getTokenMetadata(createRollupParameters.gasTokenAddress); + + const wrappedData = await polygonZkEVMBridgeContract.wrappedTokenToTokenInfo( + createRollupParameters.gasTokenAddress + ); + if (wrappedData.originNetwork != 0n) { + // Wrapped token + gasTokenAddress = wrappedData.originTokenAddress; + gasTokenNetwork = wrappedData.originNetwork; + } else { + // Mainnet token + gasTokenAddress = createRollupParameters.gasTokenAddress; + gasTokenNetwork = 0n; + } + } else { + gasTokenAddress = ethers.ZeroAddress; + gasTokenNetwork = 0; + gasTokenMetadata = "0x"; + } + + const newZKEVMAddress = ethers.getCreateAddress({ + from: rollupManagerContract.target as string, + nonce: await currentProvider.getTransactionCount(rollupManagerContract.target), + }); + + // Create new rollup + const txDeployRollup = await rollupManagerContract.createNewRollup( + newRollupTypeID, + chainID, + adminZkEVM, + trustedSequencer, + gasTokenAddress, + trustedSequencerURL, + networkName + ); + + const receipt = (await txDeployRollup.wait()) as any; + const blockDeploymentRollup = await receipt?.getBlock(); + const timestampReceipt = blockDeploymentRollup.timestamp; + const rollupID = await rollupManagerContract.chainIDToRollupID(chainID); + + console.log("#######################\n"); + console.log("Created new Rollup:", newZKEVMAddress); + + // Assert admin address + expect(await upgrades.erc1967.getAdminAddress(newZKEVMAddress)).to.be.equal(rollupManagerContract.target); + expect(await upgrades.erc1967.getImplementationAddress(newZKEVMAddress)).to.be.equal( + PolygonconsensusContract.target + ); + + // Search added global exit root on the logs + let globalExitRoot; + for (const log of receipt?.logs) { + if (log.address == newZKEVMAddress) { + const parsedLog = PolygonconsensusFactory.interface.parseLog(log); + if (parsedLog != null && parsedLog.name == "InitialSequenceBatches") { + globalExitRoot = parsedLog.args.lastGlobalExitRoot; + } + } + } + + // Add the first batch of the created rollup + const newZKEVMContract = (await PolygonconsensusFactory.attach(newZKEVMAddress)) as PolygonZkEVMV2; + const batchData = { + transactions: await newZKEVMContract.generateInitializeTransaction( + rollupID, + gasTokenAddress, + gasTokenNetwork, + gasTokenMetadata as any + ), + globalExitRoot: globalExitRoot, + timestamp: timestampReceipt, + sequencer: trustedSequencer, + }; + + outputJson.firstBatchData = batchData; + outputJson.genesis = genesis.root; + outputJson.createRollupBlock = blockDeploymentRollup.number; + outputJson.rollupAddress = newZKEVMAddress; + outputJson.verifierAddress = verifierContract.target; + + fs.writeFileSync(pathOutputJson, JSON.stringify(outputJson, null, 1)); +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/deployment/v1ToV2/README.md b/deployment/v1ToV2/README.md new file mode 100644 index 000000000..0f8a9a5f7 --- /dev/null +++ b/deployment/v1ToV2/README.md @@ -0,0 +1,54 @@ +## Important note + +This is just a test deployment to test the upgradability between previous and new systems from the node prespective + +## Requirements + +- node version: 14.x +- npm version: 7.x + +## Usage + +``` +cd deployment +cp deploy_parameters.json.example deploy_parameters.json +``` + +Fill created `deploy_parameters.json` with appropiate parameters. +See below for more information about the `deploy_parameters.json` + +``` +deploy:testnet:v1ToV2:localhost +``` + +## deploy-parameters.json + +- `timelockAdminAddress`: address, Timelock owner address, able to send start an upgradability process via timelock +- `minDelayTimelock`: number, Minimum timelock delay, +- `salt`: bytes32, Salt used in `PolygonZkEVMDeployer` to deploy deterministic contracts, such as the PolygonZkEVMBridge +- `initialZkEVMDeployerOwner`: address, Initial owner of the `PolygonZkEVMDeployer` +- `admin`:address, Admin address, can adjust RollupManager parameters or stop the emergency state +- `trustedAggregator`:address, Trusted aggregator address +- `trustedAggregatorTimeout`: uint64, If a sequence is not verified in this timeout everyone can verify it +- `pendingStateTimeout`: uint64, Once a pending state exceeds this timeout it can be consolidated +- `emergencyCouncilAddress`:address, Emergency council addres +- `polTokenAddress`: address, Matic token address, only if deploy on testnet can be left blank and will fullfilled by the scripts. +- `zkEVMDeployerAddress`: address, Address of the `PolygonZkEVMDeployer`. Can be left blank, will be fullfilled automatically with the `deploy:deployer:ZkEVM:goerli` script. + +- `realVerifier`: bool, Indicates whether deploy a real verifier or not for the new created +- `trustedSequencerURL`: string, trustedSequencer URL +- `networkName`: string, networkName +- `description`:string, Description of the new rollup type +- `trustedSequencer`: address, trusted sequencer addresss +- `chainID`: uint64, chainID of the new rollup +- `adminZkEVM`:address, Admin address, can adjust Rollup parameters +- `forkID`: uint64, Fork ID of the new rollup, indicates the prover (zkROM/executor) version +- `consensusContract`: string, Consensus contract name of the new rollup deployed, current options are: "PolygonZkEVMEtrog","PolygonZkEVMV2","PolygonDataComittee", "PolygonDataComitteeEtrog", +- `gasTokenAddress`:address, Gas token address, empty or address(0) for ether + +### Optional Parameters + +- `deployerPvtKey`: string, pvtKey of the deployer, overrides the address in `MNEMONIC` of `.env` if exist +- `maxFeePerGas`:string, Set `maxFeePerGas`, must define aswell `maxPriorityFeePerGas` to use it +- `maxPriorityFeePerGas`:string, Set `maxPriorityFeePerGas`, must define aswell `maxFeePerGas` to use it +- `multiplierGas`: number, Gas multiplier with 3 decimals. If `maxFeePerGas` and `maxPriorityFeePerGas` are set, this will not take effect diff --git a/deployment/v1ToV2/deploy_parameters.json.example b/deployment/v1ToV2/deploy_parameters.json.example new file mode 100644 index 000000000..a60f53a9f --- /dev/null +++ b/deployment/v1ToV2/deploy_parameters.json.example @@ -0,0 +1,27 @@ +{ + "timelockAdminAddress": "0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", + "minDelayTimelock": 3600, + "salt": "0x0000000000000000000000000000000000000000000000000000000000000000", + "initialZkEVMDeployerOwner" :"0xaddress", + "admin":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", + "trustedAggregator":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", + "trustedAggregatorTimeout": 604799, + "pendingStateTimeout": 604799, + "emergencyCouncilAddress": "0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", + "polTokenAddress":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", + "zkEVMDeployerAddress":"", + "realVerifier": false, + "trustedSequencerURL": "http://zkevm-json-rpc:8123", + "networkName": "zkevm", + "description":"0.0.1", + "trustedSequencer":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", + "chainID": 1001, + "adminZkEVM":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", + "forkID": 1, + "consensusContract": "PolygonZkEVMEtrog", + "gasTokenAddress":"", + "deployerPvtKey": "", + "maxFeePerGas":"", + "maxPriorityFeePerGas":"", + "multiplierGas": "", +} diff --git a/deployment/v1ToV2/prepareTestnet.ts b/deployment/v1ToV2/prepareTestnet.ts new file mode 100644 index 000000000..cc117098a --- /dev/null +++ b/deployment/v1ToV2/prepareTestnet.ts @@ -0,0 +1,132 @@ +/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if, no-restricted-syntax */ +/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */ + +/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if */ +/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */ +import {expect} from "chai"; +import path = require("path"); +import fs = require("fs"); + +import * as dotenv from "dotenv"; +dotenv.config({path: path.resolve(__dirname, "../.env")}); +import {ethers} from "hardhat"; + +import yargs from "yargs/yargs"; + +const argv = yargs(process.argv.slice(2)) + .options({ + input: {type: "string", default: "./deploy_parameters.json"}, + }) + .parse() as any; + +const pathDeployParameters = path.join(__dirname, argv.input); +const deployParameters = require(argv.input); + +async function main() { + // Load provider + let currentProvider = ethers.provider; + if (deployParameters.multiplierGas || deployParameters.maxFeePerGas) { + if (process.env.HARDHAT_NETWORK !== "hardhat") { + currentProvider = ethers.getDefaultProvider( + `https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}` + ) as any; + if (deployParameters.maxPriorityFeePerGas && deployParameters.maxFeePerGas) { + console.log( + `Hardcoded gas used: MaxPriority${deployParameters.maxPriorityFeePerGas} gwei, MaxFee${deployParameters.maxFeePerGas} gwei` + ); + const FEE_DATA = new ethers.FeeData( + null, + ethers.parseUnits(deployParameters.maxFeePerGas, "gwei"), + ethers.parseUnits(deployParameters.maxPriorityFeePerGas, "gwei") + ); + + currentProvider.getFeeData = async () => FEE_DATA; + } else { + console.log("Multiplier gas used: ", deployParameters.multiplierGas); + async function overrideFeeData() { + const feedata = await ethers.provider.getFeeData(); + return new ethers.FeeData( + null, + ((feedata.maxFeePerGas as bigint) * BigInt(deployParameters.multiplierGas)) / 1000n, + ((feedata.maxPriorityFeePerGas as bigint) * BigInt(deployParameters.multiplierGas)) / 1000n + ); + } + currentProvider.getFeeData = overrideFeeData; + } + } + } + + // Load deployer + let deployer; + if (deployParameters.deployerPvtKey) { + deployer = new ethers.Wallet(deployParameters.deployerPvtKey, currentProvider); + } else if (process.env.MNEMONIC) { + deployer = ethers.HDNodeWallet.fromMnemonic( + ethers.Mnemonic.fromPhrase(process.env.MNEMONIC), + "m/44'/60'/0'/0/0" + ).connect(currentProvider); + } else { + [deployer] = await ethers.getSigners(); + } + + // Check trusted address from deploy parameters + const mandatoryDeploymentParameters = ["trustedAggregator", "trustedSequencer"]; + + for (const parameterName of mandatoryDeploymentParameters) { + if (deployParameters[parameterName] === undefined || deployParameters[parameterName] === "") { + throw new Error(`Missing parameter: ${parameterName}`); + } + } + + const {trustedAggregator, trustedSequencer} = deployParameters; + + /* + *Deployment pol + */ + const polTokenName = "Pol Token"; + const polTokenSymbol = "POL"; + const polTokenInitialBalance = ethers.parseEther("20000000"); + + const polTokenFactory = await ethers.getContractFactory("ERC20PermitMock", deployer); + const polTokenContract = await polTokenFactory.deploy( + polTokenName, + polTokenSymbol, + deployer.address, + polTokenInitialBalance + ); + await polTokenContract.waitForDeployment(); + + console.log("#######################\n"); + console.log("pol deployed to:", polTokenContract.target); + + // fund sequencer account with tokens and ether if it have less than 0.1 ether. + const balanceEther = await ethers.provider.getBalance(trustedSequencer); + const minEtherBalance = ethers.parseEther("0.1"); + if (balanceEther < minEtherBalance) { + const params = { + to: trustedSequencer, + value: minEtherBalance, + }; + await deployer.sendTransaction(params); + } + const tokensBalance = ethers.parseEther("100000"); + await (await polTokenContract.transfer(trustedSequencer, tokensBalance)).wait(); + + // fund aggregator account with ether if it have less than 0.1 ether. + const balanceEtherAggr = await ethers.provider.getBalance(trustedAggregator); + if (balanceEtherAggr < minEtherBalance) { + const params = { + to: trustedAggregator, + value: minEtherBalance, + }; + await deployer.sendTransaction(params); + } + + deployParameters.polTokenAddress = polTokenContract.target; + fs.writeFileSync(pathDeployParameters, JSON.stringify(deployParameters, null, 1)); +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/docker/scripts/v1ToV2/deploy-docker.sh b/docker/scripts/v1ToV2/deploy-docker.sh new file mode 100755 index 000000000..09e41b5d3 --- /dev/null +++ b/docker/scripts/v1ToV2/deploy-docker.sh @@ -0,0 +1,14 @@ +#!/bin/bash +sudo rm -rf docker/gethData/geth_data +DEV_PERIOD=1 docker-compose -f docker/docker-compose.geth.yml up -d geth +sleep 5 +node docker/scripts/fund-accounts.js +cp docker/scripts/v1ToV2/deploy_parameters_docker.json deployment/v1ToV2/deploy_parameters.json +npm run deploy:testnet:v1ToV2:localhost +mkdir docker/deploymentOutput +mv deployment/v1ToV2/deploy_output.json docker/deploymentOutput +mv deployment/v1ToV2/genesis.json docker/deploymentOutput +DEV_PERIOD=1 docker-compose -f docker/docker-compose.geth.yml down +sudo docker build -t hermeznetwork/geth-zkevm-contracts -f docker/Dockerfile.geth . +# Let it readable for the multiplatform build coming later! +sudo chmod -R go+rxw docker/gethData diff --git a/docker/scripts/v1ToV2/deploy-dockerv2.sh b/docker/scripts/v1ToV2/deploy-dockerv2.sh new file mode 100755 index 000000000..839ede133 --- /dev/null +++ b/docker/scripts/v1ToV2/deploy-dockerv2.sh @@ -0,0 +1,14 @@ +#!/bin/bash +sudo rm -rf docker/gethData/geth_data +DEV_PERIOD=1 docker compose -f docker/docker-compose.geth.yml up -d geth +sleep 5 +node docker/scripts/fund-accounts.js +cp docker/scripts/v1ToV2/deploy_parameters_docker.json deployment/v1ToV2/deploy_parameters.json +npm run deploy:testnet:v1ToV2:localhost +mkdir docker/deploymentOutput +mv deployment/v1ToV2/deploy_output.json docker/deploymentOutput +mv deployment/v1ToV2/genesis.json docker/deploymentOutput +DEV_PERIOD=1 docker compose -f docker/docker-compose.geth.yml down +sudo docker build -t hermeznetwork/geth-zkevm-contracts -f docker/Dockerfile.geth . +# Let it readable for the multiplatform build coming later! +sudo chmod -R go+rxw docker/gethData \ No newline at end of file diff --git a/docker/scripts/v1ToV2/deploy_parameters_docker.json b/docker/scripts/v1ToV2/deploy_parameters_docker.json new file mode 100644 index 000000000..5697169cd --- /dev/null +++ b/docker/scripts/v1ToV2/deploy_parameters_docker.json @@ -0,0 +1,29 @@ +{ + "timelockAdminAddress": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "minDelayTimelock": 3600, + "salt": "0x0000000000000000000000000000000000000000000000000000000000000000", + "initialZkEVMDeployerOwner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "admin": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "trustedAggregator": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + "trustedAggregatorTimeout": 604799, + "pendingStateTimeout": 604799, + "emergencyCouncilAddress": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "realVerifier": false, + "trustedSequencerURL": "http://zkevm-json-rpc:8123", + "networkName": "zkevm", + "description": "0.0.1", + "version":"0.0.1", + "trustedSequencer": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "chainID": 1001, + "adminZkEVM": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "forkID": 5, + "consensusContract": "PolygonZkEVMEtrog", + "polTokenAddress": "", + "zkEVMDeployerAddress": "", + "gasTokenAddress": "", + "gasTokenNetwork": 0, + "deployerPvtKey": "", + "maxFeePerGas": "", + "maxPriorityFeePerGas": "", + "multiplierGas": "" +} \ No newline at end of file diff --git a/docker/scripts/v1ToV2/genesis.json b/docker/scripts/v1ToV2/genesis.json new file mode 100644 index 000000000..959cd157b --- /dev/null +++ b/docker/scripts/v1ToV2/genesis.json @@ -0,0 +1,98 @@ +{ + "root": "0x40bdab77c40f497be8a427027b336f7a51a0692c3fb20ff36519bc5a79dc60fd", + "genesis": [ + { + "contractName": "PolygonZkEVMDeployer", + "balance": "0", + "nonce": "4", + "address": "0xFbD07134824dDEa24E4ae414c18ecbFa98169A24", + "bytecode": "0x60806040526004361061006e575f3560e01c8063715018a61161004c578063715018a6146100e25780638da5cb5b146100f6578063e11ae6cb1461011f578063f2fde38b14610132575f80fd5b80632b79805a146100725780634a94d487146100875780636d07dbf81461009a575b5f80fd5b610085610080366004610908565b610151565b005b6100856100953660046109a2565b6101c2565b3480156100a5575f80fd5b506100b96100b43660046109f5565b610203565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ed575f80fd5b50610085610215565b348015610101575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff166100b9565b61008561012d366004610a15565b610228565b34801561013d575f80fd5b5061008561014c366004610a61565b61028e565b61015961034a565b5f6101658585856103ca565b90506101718183610527565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a15050505050565b6101ca61034a565b6101d583838361056a565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b905f90a1505050565b5f61020e8383610598565b9392505050565b61021d61034a565b6102265f6105a4565b565b61023061034a565b5f61023c8484846103ca565b60405173ffffffffffffffffffffffffffffffffffffffff821681529091507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a150505050565b61029661034a565b73ffffffffffffffffffffffffffffffffffffffff811661033e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610347816105a4565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610335565b5f83471015610435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610335565b81515f0361049f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610335565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff811661020e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610335565b606061020e83835f6040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c65640000815250610618565b6060610590848484604051806060016040528060298152602001610b0860299139610618565b949350505050565b5f61020e83833061072d565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156106aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610335565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516106d29190610a9c565b5f6040518083038185875af1925050503d805f811461070c576040519150601f19603f3d011682016040523d82523d5f602084013e610711565b606091505b509150915061072287838387610756565b979650505050505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b606083156107eb5782515f036107e45773ffffffffffffffffffffffffffffffffffffffff85163b6107e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610335565b5081610590565b61059083838151156108005781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103359190610ab7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112610870575f80fd5b813567ffffffffffffffff8082111561088b5761088b610834565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156108d1576108d1610834565b816040528381528660208588010111156108e9575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f806080858703121561091b575f80fd5b8435935060208501359250604085013567ffffffffffffffff80821115610940575f80fd5b61094c88838901610861565b93506060870135915080821115610961575f80fd5b5061096e87828801610861565b91505092959194509250565b803573ffffffffffffffffffffffffffffffffffffffff8116811461099d575f80fd5b919050565b5f805f606084860312156109b4575f80fd5b6109bd8461097a565b9250602084013567ffffffffffffffff8111156109d8575f80fd5b6109e486828701610861565b925050604084013590509250925092565b5f8060408385031215610a06575f80fd5b50508035926020909101359150565b5f805f60608486031215610a27575f80fd5b8335925060208401359150604084013567ffffffffffffffff811115610a4b575f80fd5b610a5786828701610861565b9150509250925092565b5f60208284031215610a71575f80fd5b61020e8261097a565b5f5b83811015610a94578181015183820152602001610a7c565b50505f910152565b5f8251610aad818460208701610a7a565b9190910192915050565b602081525f8251806020840152610ad5816040850160208701610a7a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220330b94dc698c4d290bf55c23f13b473cde6a6bae0030cb902de18af54e35839f64736f6c63430008140033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" + } + }, + { + "contractName": "ProxyAdmin", + "balance": "0", + "nonce": "1", + "address": "0xfADB60b5059e31614e02083fF6C021a24C31c891", + "bytecode": "0x608060405260043610610079575f3560e01c80639623609d1161004c5780639623609d1461012357806399a88ec414610136578063f2fde38b14610155578063f3b7dead14610174575f80fd5b8063204e1c7a1461007d578063715018a6146100c55780637eff275e146100db5780638da5cb5b146100fa575b5f80fd5b348015610088575f80fd5b5061009c6100973660046105e8565b610193565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100d0575f80fd5b506100d9610244565b005b3480156100e6575f80fd5b506100d96100f536600461060a565b610257565b348015610105575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff1661009c565b6100d961013136600461066e565b6102e0565b348015610141575f80fd5b506100d961015036600461060a565b610371565b348015610160575f80fd5b506100d961016f3660046105e8565b6103cd565b34801561017f575f80fd5b5061009c61018e3660046105e8565b610489565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907f5c60da1b00000000000000000000000000000000000000000000000000000000815260040190565b5f60405180830381855afa9150503d805f8114610215576040519150601f19603f3d011682016040523d82523d5f602084013e61021a565b606091505b509150915081610228575f80fd5b8080602001905181019061023c919061075b565b949350505050565b61024c6104d3565b6102555f610553565b565b61025f6104d3565b6040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690638f283970906024015b5f604051808303815f87803b1580156102c6575f80fd5b505af11580156102d8573d5f803e3d5ffd5b505050505050565b6102e86104d3565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef28690349061033e9086908690600401610776565b5f604051808303818588803b158015610355575f80fd5b505af1158015610367573d5f803e3d5ffd5b5050505050505050565b6103796104d3565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690633659cfe6906024016102af565b6103d56104d3565b73ffffffffffffffffffffffffffffffffffffffff811661047d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61048681610553565b50565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907ff851a44000000000000000000000000000000000000000000000000000000000815260040190565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610474565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610486575f80fd5b5f602082840312156105f8575f80fd5b8135610603816105c7565b9392505050565b5f806040838503121561061b575f80fd5b8235610626816105c7565b91506020830135610636816105c7565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f805f60608486031215610680575f80fd5b833561068b816105c7565b9250602084013561069b816105c7565b9150604084013567ffffffffffffffff808211156106b7575f80fd5b818601915086601f8301126106ca575f80fd5b8135818111156106dc576106dc610641565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561072257610722610641565b8160405282815289602084870101111561073a575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f6020828403121561076b575f80fd5b8151610603816105c7565b73ffffffffffffffffffffffffffffffffffffffff831681525f602060408184015283518060408501525f5b818110156107be578581018301518582016060015282016107a2565b505f6060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050939250505056fea26469706673582212203083a4ccc2e42eed60bd19037f2efa77ed086dc7a5403f75bebb995dcba2221c64736f6c63430008140033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f" + } + }, + { + "contractName": "PolygonZkEVMBridge implementation", + "balance": "0", + "nonce": "1", + "address": "0x7Cd6d5063c7782d34E2b1b03ED89ecf4A1412148", + "bytecode": "0x608060405260043610620001d3575f3560e01c80638ed7e3f211620000fa578063cd5865791162000092578063dbc16976116200006a578063dbc169761462000685578063ee25560b146200069c578063f5efcd7914620006cb578063fb57083414620006ef575f80fd5b8063cd5865791462000620578063d02103ca1462000637578063d3476afe1462000661575f80fd5b8063bab161bf11620000d2578063bab161bf146200057a578063be5831c7146200059d578063cc46163214620005d8578063ccaa2d1114620005fc575f80fd5b80638ed7e3f21462000511578063aaa13cc21462000532578063b8b284d01462000556575f80fd5b80633cbc795b116200016e5780635ca1e16511620001465780635ca1e165146200048757806379e2cf97146200049e57806381b1c17414620004b557806383f2440314620004ed575f80fd5b80633cbc795b14620003285780633e19704314620003745780634b2f336d1462000466575f80fd5b8063240ff37811620001ae578063240ff378146200025d5780632dfdf0b51462000274578063318aee3d146200029a5780633c351e101462000307575f80fd5b806315064c9614620001d75780632072f6c5146200020757806322e95f2c1462000220575b5f80fd5b348015620001e3575f80fd5b50606854620001f29060ff1681565b60405190151581526020015b60405180910390f35b34801562000213575f80fd5b506200021e62000713565b005b3480156200022c575f80fd5b50620002446200023e36600462003723565b62000764565b6040516001600160a01b039091168152602001620001fe565b6200021e6200026e366004620037b3565b620007f9565b34801562000280575f80fd5b506200028b60535481565b604051908152602001620001fe565b348015620002a6575f80fd5b50620002e2620002b836600462003832565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201620001fe565b34801562000313575f80fd5b50606d5462000244906001600160a01b031681565b34801562000334575f80fd5b50606d546200035e9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001620001fe565b34801562000380575f80fd5b506200028b6200039236600462003866565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b34801562000472575f80fd5b50606e5462000244906001600160a01b031681565b34801562000493575f80fd5b506200028b62000862565b348015620004aa575f80fd5b506200021e62000947565b348015620004c1575f80fd5b5062000244620004d3366004620038eb565b606a6020525f90815260409020546001600160a01b031681565b348015620004f9575f80fd5b506200028b6200050b36600462003915565b62000981565b3480156200051d575f80fd5b50606c5462000244906001600160a01b031681565b3480156200053e575f80fd5b50620002446200055036600462003956565b62000a64565b34801562000562575f80fd5b506200021e6200057436600462003a03565b62000bf4565b34801562000586575f80fd5b506068546200035e90610100900463ffffffff1681565b348015620005a9575f80fd5b506068546200035e90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b348015620005e4575f80fd5b50620001f2620005f636600462003a8b565b62000cc9565b34801562000608575f80fd5b506200021e6200061a36600462003ac1565b62000d58565b6200021e6200063136600462003bb5565b6200144d565b34801562000643575f80fd5b5060685462000244906501000000000090046001600160a01b031681565b3480156200066d575f80fd5b506200021e6200067f36600462003c51565b62001a03565b34801562000691575f80fd5b506200021e62001dd7565b348015620006a8575f80fd5b506200028b620006ba366004620038eb565b60696020525f908152604090205481565b348015620006d7575f80fd5b506200021e620006e936600462003ac1565b62001e26565b348015620006fb575f80fd5b50620001f26200070d36600462003cc5565b620021aa565b606c546001600160a01b0316331462000758576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000762620021c5565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b3415801590620008135750606e546001600160a01b031615155b156200084b576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200085b85853486868662002258565b5050505050565b6053545f90819081805b60208110156200093e578083901c600116600103620008cf57603381602081106200089b576200089b62003d0f565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620008fc565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620009359062003d69565b9150506200086c565b50919392505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000762576200076262002340565b5f83815b602081101562000a5b57600163ffffffff8516821c81169003620009f757848160208110620009b857620009b862003d0f565b602002013582604051602001620009d9929190918252602082015260400190565b60405160208183030381529060405280519060200120915062000a46565b8185826020811062000a0d5762000a0d62003d0f565b602002013560405160200162000a2d929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062000a528162003d69565b91505062000985565b50949350505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b30836040518060200162000af890620036e9565b601f1982820381018352601f90910116604081905262000b25908d908d908d908d908d9060200162003dcc565b60408051601f198184030181529082905262000b45929160200162003e30565b6040516020818303038152906040528051906020012060405160200162000bce94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b606e546001600160a01b031662000c37576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606e546040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018690526001600160a01b0390911690639dc29fac906044015f604051808303815f87803b15801562000c9a575f80fd5b505af115801562000cad573d5f803e3d5ffd5b5050505062000cc186868686868662002258565b505050505050565b6068545f908190610100900463ffffffff1615801562000cef575063ffffffff83166001145b1562000d03575063ffffffff831662000d2f565b62000d1a64010000000063ffffffff851662003e62565b62000d2c9063ffffffff861662003e7c565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000d96576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161462000de0576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000ee78c8c8c8c8c62000ee15f8e8e8e8e8e8e8e60405162000e0592919062003e92565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62002409565b6001600160a01b0386166200105657606e546001600160a01b031662000fd4575f6001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000f40576020820181803683370190505b5060405162000f50919062003ece565b5f6040518083038185875af1925050503d805f811462000f8c576040519150601f19603f3d011682016040523d82523d5f602084013e62000f91565b606091505b505090508062000fcd576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50620013e3565b606e546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015260248201869052909116906340c10f19906044015f604051808303815f87803b15801562001039575f80fd5b505af11580156200104c573d5f803e3d5ffd5b50505050620013e3565b606d546001600160a01b038781169116148015620010965750606d5463ffffffff8881167401000000000000000000000000000000000000000090920416145b15620010af575f6001600160a01b038516848262000f15565b60685463ffffffff610100909104811690881603620010e457620010de6001600160a01b0387168585620025e1565b620013e3565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b03168062001367575f80806200118b8688018862003fa1565b9250925092505f85848484604051620011a490620036e9565b620011b2939291906200404a565b8190604051809103905ff5905080158015620011d0573d5f803e3d5ffd5b506040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562001236575f80fd5b505af115801562001249573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b6040516200135595949392919062004086565b60405180910390a150505050620013e0565b6040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b158015620013c8575f80fd5b505af1158015620013db573d5f803e3d5ffd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156200148b576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200149562002691565b60685463ffffffff610100909104811690881603620014e0576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f806060876001600160a01b03881662001563578834146200152e576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d546001600160a01b038116945074010000000000000000000000000000000000000000900463ffffffff169250620018a2565b34156200159c576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606e546001600160a01b03908116908916036200162f576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018a90526001600160a01b03891690639dc29fac906044015f604051808303815f87803b15801562001612575f80fd5b505af115801562001625573d5f803e3d5ffd5b50505050620018a2565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620016fe576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b90526001600160a01b038a1690639dc29fac906044015f604051808303815f87803b158015620016d4575f80fd5b505af1158015620016e7573d5f803e3d5ffd5b5050505080602001519450805f01519350620018a0565b8515620017135762001713898b898962002706565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa15801562001771573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620017979190620040c0565b9050620017b06001600160a01b038b1633308e62002bb1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa1580156200180e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620018349190620040c0565b9050620018428282620040d8565b6068548c9850610100900463ffffffff1696509350620018628762002c04565b6200186d8c62002d0b565b620018788d62002e07565b6040516020016200188c939291906200404a565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620018e3989796959493929190620040ee565b60405180910390a1620019db620019d55f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62002ef2565b8615620019ec57620019ec62002340565b50505050620019fa60018055565b50505050505050565b5f54610100900460ff161580801562001a2257505f54600160ff909116105b8062001a3d5750303b15801562001a3d57505f5460ff166001145b62001acf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801562001b2c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8916027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016848316179055606d541662001c3157606d5474010000000000000000000000000000000000000000900463ffffffff161562001c2b576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001d63565b606d805463ffffffff861674010000000000000000000000000000000000000000027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b038816171790556040515f9060129062001c9890620036e9565b6060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff909116604082015260e0018190604051809103905ff590508015801562001d29573d5f803e3d5ffd5b50606e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790555b62001d6d62003007565b801562000cc1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b606c546001600160a01b0316331462001e1c576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000762620030a9565b60685460ff161562001e64576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161462001eae576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001ed48c8c8c8c8c62000ee160018e8e8e8e8e8e8e60405162000e0592919062003e92565b606e545f906001600160a01b031662001fbd57846001600160a01b031684888a868660405160240162001f0b949392919062004159565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f2000000000000000000000000000000000000000000000000000000001790525162001f70919062003ece565b5f6040518083038185875af1925050503d805f811462001fac576040519150601f19603f3d011682016040523d82523d5f602084013e62001fb1565b606091505b50508091505062002107565b606e546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260248201879052909116906340c10f19906044015f604051808303815f87803b15801562002022575f80fd5b505af115801562002035573d5f803e3d5ffd5b50505050846001600160a01b0316878985856040516024016200205c949392919062004159565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f20000000000000000000000000000000000000000000000000000000017905251620020c1919062003ece565b5f604051808303815f865af19150503d805f8114620020fc576040519150601f19603f3d011682016040523d82523d5f602084013e62002101565b606091505b50909150505b806200213f576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f81620021b986868662000981565b1490505b949350505050565b60685460ff161562002203576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff610100909104811690871603620022a3576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051620022f99998979695949392919062004193565b60405180910390a162002334620019d56001606860019054906101000a900463ffffffff16338a8a8a898960405162000e0592919062003e92565b821562000cc15762000cc15b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d620023b962000862565b6040518263ffffffff1660e01b8152600401620023d891815260200190565b5f604051808303815f87803b158015620023f0575f80fd5b505af115801562002403573d5f803e3d5ffd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af11580156200249b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620024c19190620040c0565b9050805f03620024fc576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80680100000000000000008716600103620025605786915062002523848a8489620021aa565b6200255a576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620025ca565b602087901c6200257281600162004200565b91508792506200259162002588868c8662000981565b8a8389620021aa565b620025c8576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b620025d6828262003138565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526200268c9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262003200565b505050565b600260015403620026ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001ac6565b6002600155565b5f62002716600482848662004227565b620027219162004250565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002967575f80808080808062002783896004818d62004227565b81019062002792919062004299565b9650965096509650965096509650336001600160a01b0316876001600160a01b031614620027ec576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03861630146200282f576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002869576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002917919062003ece565b5f604051808303815f865af19150503d805f811462002952576040519150601f19603f3d011682016040523d82523d5f602084013e62002957565b606091505b505050505050505050506200085b565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c0000000000000000000000000000000000000000000000000000000014620029e3576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80808080808080620029fa8a6004818e62004227565b81019062002a099190620042ef565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462002a65576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038716301462002aa8576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002b5f919062003ece565b5f604051808303815f865af19150503d805f811462002b9a576040519150601f19603f3d011682016040523d82523d5f602084013e62002b9f565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052620024039085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002627565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b0386169162002c7a919062003ece565b5f60405180830381855afa9150503d805f811462002cb4576040519150601f19603f3d011682016040523d82523d5f602084013e62002cb9565b606091505b50915091508162002d00576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250620021bd565b620021bd8162003305565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b0386169162002d81919062003ece565b5f60405180830381855afa9150503d805f811462002dbb576040519150601f19603f3d011682016040523d82523d5f602084013e62002dc0565b606091505b50915091508162002d00576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250620021bd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b0386169162002e7c919062003ece565b5f60405180830381855afa9150503d805f811462002eb6576040519150601f19603f3d011682016040523d82523d5f602084013e62002ebb565b606091505b509150915081801562002ecf575080516020145b62002edc576012620021bd565b80806020019051810190620021bd919062004376565b80600162002f0360206002620044cb565b62002f0f9190620040d8565b6053541062002f4a576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462002f5b9062003d69565b918290555090505f5b602081101562002ff6578082901c60011660010362002f9c57826033826020811062002f945762002f9462003d0f565b015550505050565b6033816020811062002fb25762002fb262003d0f565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062002fed9062003d69565b91505062002f64565b506200268c620044d8565b60018055565b5f54610100900460ff166200309f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001ac6565b62000762620034f0565b60685460ff16620030e6576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b6068545f90610100900463ffffffff161580156200315c575063ffffffff82166001145b1562003170575063ffffffff82166200319c565b6200318764010000000063ffffffff841662003e62565b620031999063ffffffff851662003e7c565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620019fa576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62003256826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620035889092919063ffffffff16565b8051909150156200268c578080602001905181019062003277919062004505565b6200268c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001ac6565b60606040825110620033275781806020019051810190620007f3919062004523565b8151602003620034b2575f5b6020811080156200337e575082818151811062003354576200335462003d0f565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620033995780620033908162003d69565b91505062003333565b805f03620033dc57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115620033f957620033f962003ea1565b6040519080825280601f01601f19166020018201604052801562003424576020820181803683370190505b5090505f5b82811015620034aa5784818151811062003447576200344762003d0f565b602001015160f81c60f81b82828151811062003467576200346762003d0f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620034a18162003d69565b91505062003429565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b5f54610100900460ff1662003001576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001ac6565b6060620021bd84845f85855f80866001600160a01b03168587604051620035b0919062003ece565b5f6040518083038185875af1925050503d805f8114620035ec576040519150601f19603f3d011682016040523d82523d5f602084013e620035f1565b606091505b509150915062003604878383876200360f565b979650505050505050565b606083156200369c5782515f0362003694576001600160a01b0385163b62003694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001ac6565b5081620021bd565b620021bd8383815115620036b35781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001ac691906200459e565b6119a180620045b383390190565b803563ffffffff81168114620034eb575f80fd5b6001600160a01b038116811462003720575f80fd5b50565b5f806040838503121562003735575f80fd5b6200374083620036f7565b9150602083013562003752816200370b565b809150509250929050565b801515811462003720575f80fd5b5f8083601f8401126200377c575f80fd5b50813567ffffffffffffffff81111562003794575f80fd5b602083019150836020828501011115620037ac575f80fd5b9250929050565b5f805f805f60808688031215620037c8575f80fd5b620037d386620036f7565b94506020860135620037e5816200370b565b93506040860135620037f7816200375d565b9250606086013567ffffffffffffffff81111562003813575f80fd5b62003821888289016200376b565b969995985093965092949392505050565b5f6020828403121562003843575f80fd5b813562003850816200370b565b9392505050565b60ff8116811462003720575f80fd5b5f805f805f805f60e0888a0312156200387d575f80fd5b87356200388a8162003857565b96506200389a60208901620036f7565b95506040880135620038ac816200370b565b9450620038bc60608901620036f7565b93506080880135620038ce816200370b565b9699959850939692959460a0840135945060c09093013592915050565b5f60208284031215620038fc575f80fd5b5035919050565b806104008101831015620007f3575f80fd5b5f805f610440848603121562003929575f80fd5b833592506200393c856020860162003903565b91506200394d6104208501620036f7565b90509250925092565b5f805f805f805f60a0888a0312156200396d575f80fd5b6200397888620036f7565b965060208801356200398a816200370b565b9550604088013567ffffffffffffffff80821115620039a7575f80fd5b620039b58b838c016200376b565b909750955060608a0135915080821115620039ce575f80fd5b50620039dd8a828b016200376b565b9094509250506080880135620039f38162003857565b8091505092959891949750929550565b5f805f805f8060a0878903121562003a19575f80fd5b62003a2487620036f7565b9550602087013562003a36816200370b565b945060408701359350606087013562003a4f816200375d565b9250608087013567ffffffffffffffff81111562003a6b575f80fd5b62003a7989828a016200376b565b979a9699509497509295939492505050565b5f806040838503121562003a9d575f80fd5b62003aa883620036f7565b915062003ab860208401620036f7565b90509250929050565b5f805f805f805f805f805f806109208d8f03121562003ade575f80fd5b62003aea8e8e62003903565b9b5062003afc8e6104008f0162003903565b9a506108008d013599506108208d013598506108408d0135975062003b256108608e01620036f7565b965062003b376108808e01356200370b565b6108808d0135955062003b4e6108a08e01620036f7565b945062003b606108c08e01356200370b565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111562003b8a575f80fd5b62003b9d8e6109008f01358f016200376b565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121562003bcc575f80fd5b62003bd788620036f7565b9650602088013562003be9816200370b565b955060408801359450606088013562003c02816200370b565b9350608088013562003c14816200375d565b925060a088013567ffffffffffffffff81111562003c30575f80fd5b62003c3e8a828b016200376b565b989b979a50959850939692959293505050565b5f805f805f60a0868803121562003c66575f80fd5b62003c7186620036f7565b9450602086013562003c83816200370b565b935062003c9360408701620036f7565b9250606086013562003ca5816200370b565b9150608086013562003cb7816200370b565b809150509295509295909350565b5f805f80610460858703121562003cda575f80fd5b8435935062003ced866020870162003903565b925062003cfe6104208601620036f7565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003d9c5762003d9c62003d3c565b5060010190565b81835281816020850137505f602082840101525f6020601f19601f840116840101905092915050565b606081525f62003de160608301878962003da3565b828103602084015262003df681868862003da3565b91505060ff831660408301529695505050505050565b5f5b8381101562003e2857818101518382015260200162003e0e565b50505f910152565b5f835162003e4381846020880162003e0c565b83519083019062003e5981836020880162003e0c565b01949350505050565b8082028115828204841417620007f357620007f362003d3c565b80820180821115620007f357620007f362003d3c565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f825162003ee181846020870162003e0c565b9190910192915050565b604051601f8201601f1916810167ffffffffffffffff8111828210171562003f175762003f1762003ea1565b604052919050565b5f67ffffffffffffffff82111562003f3b5762003f3b62003ea1565b50601f01601f191660200190565b5f82601f83011262003f59575f80fd5b813562003f7062003f6a8262003f1f565b62003eeb565b81815284602083860101111562003f85575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003fb4575f80fd5b833567ffffffffffffffff8082111562003fcc575f80fd5b62003fda8783880162003f49565b9450602086013591508082111562003ff0575f80fd5b5062003fff8682870162003f49565b9250506040840135620040128162003857565b809150509250925092565b5f81518084526200403681602086016020860162003e0c565b601f01601f19169290920160200192915050565b606081525f6200405e60608301866200401d565b82810360208401526200407281866200401d565b91505060ff83166040830152949350505050565b63ffffffff861681525f6001600160a01b038087166020840152808616604084015250608060608301526200360460808301848662003da3565b5f60208284031215620040d1575f80fd5b5051919050565b81810381811115620007f357620007f362003d3c565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c085015262004140828501876200401d565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f6200418960608301848662003da3565b9695505050505050565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620041e6828501878962003da3565b925080851660e085015250509a9950505050505050505050565b63ffffffff81811683821601908082111562004220576200422062003d3c565b5092915050565b5f808585111562004236575f80fd5b8386111562004243575f80fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620042915780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215620042b0575f80fd5b8735620042bd816200370b565b96506020880135620042cf816200370b565b955060408801359450606088013593506080880135620038ce8162003857565b5f805f805f805f80610100898b03121562004308575f80fd5b883562004315816200370b565b9750602089013562004327816200370b565b96506040890135955060608901359450608089013562004347816200375d565b935060a0890135620043598162003857565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004387575f80fd5b8151620038508162003857565b600181815b80851115620043f357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620043d757620043d762003d3c565b80851615620043e557918102915b93841c939080029062004399565b509250929050565b5f826200440b57506001620007f3565b816200441957505f620007f3565b81600181146200443257600281146200443d576200445d565b6001915050620007f3565b60ff84111562004451576200445162003d3c565b50506001821b620007f3565b5060208310610133831016604e8410600b841016171562004482575081810a620007f3565b6200448e838362004394565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620044c357620044c362003d3c565b029392505050565b5f620038508383620043fb565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6020828403121562004516575f80fd5b815162003850816200375d565b5f6020828403121562004534575f80fd5b815167ffffffffffffffff8111156200454b575f80fd5b8201601f810184136200455c575f80fd5b80516200456d62003f6a8262003f1f565b81815285602083850101111562004582575f80fd5b6200459582602083016020860162003e0c565b95945050505050565b602081525f6200385060208301846200401d56fe61010060405234801562000011575f80fd5b50604051620019a1380380620019a1833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516115036200049e5f395f61022d01525f81816102fb015281816105ad015261067a01525f61052801525f818161036d01526104f201526115035ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b6040516101879190611255565b60405180910390f35b6101a361019e3660046112e6565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461130e565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d3660046112e6565b61054a565b6102856102803660046112e6565b610595565b005b6101b7610295366004611347565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca366004611347565b60056020525f908152604090205481565b61017a610653565b6102856102f13660046112e6565b610662565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a36103503660046112e6565b610717565b6101a36103633660046112e6565b6107cd565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d366004611367565b6107da565b6101b76103b03660046113d4565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611405565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611405565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610ad7565b60019150505b92915050565b5f336104d9858285610c56565b6104e4858585610d12565b506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146105255761052046610f31565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c09082908690610590908790611483565b610ad7565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106455760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61064f8282610ff8565b5050565b60606004805461043290611405565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461070d5760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d42726964676500000000000000000000000000000000606482015260840161063c565b61064f82826110cf565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107c05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161063c565b6104e48286868403610ad7565b5f336104c0818585610d12565b8342111561084f5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d697400000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866108a883611496565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6109126104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156109d3573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610a4e57508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610ac05760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e617475726500000000000000000000000000000000000000000000000000606482015260840161063c565b610acb8a8a8a610ad7565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610b5f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610be85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d0c5781811015610cff5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161063c565b610d0c8484848403610ad7565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610d9b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610e245760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610ebf5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610d0c565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610f5b610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff821661105b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161063c565b8060025f82825461106c9190611483565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166111585760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260208190526040902054818110156111f35760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610c49565b5f6020808352835180828501525f5b8181101561128057858101830151858201604001528201611264565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146112e1575f80fd5b919050565b5f80604083850312156112f7575f80fd5b611300836112be565b946020939093013593505050565b5f805f60608486031215611320575f80fd5b611329846112be565b9250611337602085016112be565b9150604084013590509250925092565b5f60208284031215611357575f80fd5b611360826112be565b9392505050565b5f805f805f805f60e0888a03121561137d575f80fd5b611386886112be565b9650611394602089016112be565b95506040880135945060608801359350608088013560ff811681146113b7575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f80604083850312156113e5575f80fd5b6113ee836112be565b91506113fc602084016112be565b90509250929050565b600181811c9082168061141957607f821691505b602082108103611450577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c6611456565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036114c6576114c6611456565b506001019056fea2646970667358221220176a1a9cf4a702d3853b858873fff4a6370c4e5d7d72d68593ec0ebe64fcc26964736f6c63430008140033a26469706673582212209002ffc0c7cb9056d22d47ac65cf05714a8ae8ce0af7e882f7e68b9fdede830e64736f6c63430008140033" + }, + { + "contractName": "PolygonZkEVMBridge proxy", + "balance": "340282366920938463463374607431768211455", + "nonce": "1", + "address": "0x40E0576c0A7dff9dc460B29ba73e79aBf73dD2a9", + "bytecode": "0x60806040526004361061005d575f3560e01c80635c60da1b116100425780635c60da1b146100a65780638f283970146100e3578063f851a440146101025761006c565b80633659cfe6146100745780634f1ef286146100935761006c565b3661006c5761006a610116565b005b61006a610116565b34801561007f575f80fd5b5061006a61008e366004610854565b610130565b61006a6100a136600461086d565b610178565b3480156100b1575f80fd5b506100ba6101eb565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee575f80fd5b5061006a6100fd366004610854565b610228565b34801561010d575f80fd5b506100ba610255565b61011e610282565b61012e610129610359565b610362565b565b610138610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d8160405180602001604052805f8152505f6103bf565b50565b61016d610116565b610180610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101e3576101de8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250600192506103bf915050565b505050565b6101de610116565b5f6101f4610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610359565b905090565b610225610116565b90565b610230610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d816103e9565b5f61025e610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610380565b61028a610380565b73ffffffffffffffffffffffffffffffffffffffff16330361012e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b5f61021861044a565b365f80375f80365f845af43d5f803e80801561037c573d5ff35b3d5ffd5b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b6103c883610471565b5f825111806103d45750805b156101de576103e383836104bd565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f610412610380565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a161016d816104e9565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103a3565b61047a816105f5565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606104e28383604051806060016040528060278152602001610977602791396106c0565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811661058c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610350565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b73ffffffffffffffffffffffffffffffffffffffff81163b610699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610350565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105af565b60605f808573ffffffffffffffffffffffffffffffffffffffff16856040516106e9919061090b565b5f60405180830381855af49150503d805f8114610721576040519150601f19603f3d011682016040523d82523d5f602084013e610726565b606091505b509150915061073786838387610741565b9695505050505050565b606083156107d65782515f036107cf5773ffffffffffffffffffffffffffffffffffffffff85163b6107cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610350565b50816107e0565b6107e083836107e8565b949350505050565b8151156107f85781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103509190610926565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f575f80fd5b919050565b5f60208284031215610864575f80fd5b6104e28261082c565b5f805f6040848603121561087f575f80fd5b6108888461082c565b9250602084013567ffffffffffffffff808211156108a4575f80fd5b818601915086601f8301126108b7575f80fd5b8135818111156108c5575f80fd5b8760208285010111156108d6575f80fd5b6020830194508093505050509250925092565b5f5b838110156109035781810151838201526020016108eb565b50505f910152565b5f825161091c8184602087016108e9565b9190910192915050565b602081525f82518060208401526109448160408501602087016108e9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212202ac98acbfbb3d3ac1b74050e18c4e76db25a3ff2801ec69bf85d0c61414d502b64736f6c63430008140033", + "storage": { + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000fadb60b5059e31614e02083ff6c021a24c31c891", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000007cd6d5063c7782d34e2b1b03ed89ecf4a1412148" + } + }, + { + "contractName": "PolygonZkEVMGlobalExitRootL2 implementation", + "balance": "0", + "nonce": "1", + "address": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9", + "bytecode": "0x608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301fd90441461004e578063257b36321461006a57806333d6247d14610089578063a3c573eb1461009e575b5f80fd5b61005760015481565b6040519081526020015b60405180910390f35b61005761007836600461015e565b5f6020819052908152604090205481565b61009c61009736600461015e565b6100ea565b005b6100c57f00000000000000000000000040e0576c0a7dff9dc460b29ba73e79abf73dd2a981565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610061565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000040e0576c0a7dff9dc460b29ba73e79abf73dd2a91614610159576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b5f6020828403121561016e575f80fd5b503591905056fea26469706673582212205108c6c4f924146b736832a1bdf696e20d900450207b7452462368d150f2c71c64736f6c63430008140033" + }, + { + "contractName": "PolygonZkEVMGlobalExitRootL2 proxy", + "balance": "0", + "nonce": "1", + "address": "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa", + "bytecode": "0x60806040523661001357610011610017565b005b6100115b61001f6101b7565b6001600160a01b0316336001600160a01b0316141561016f5760606001600160e01b031960003516631b2ce7f360e11b8114156100655761005e6101ea565b9150610167565b6001600160e01b0319811663278f794360e11b14156100865761005e610241565b6001600160e01b031981166308f2839760e41b14156100a75761005e610287565b6001600160e01b031981166303e1469160e61b14156100c85761005e6102b8565b6001600160e01b03198116635c60da1b60e01b14156100e95761005e6102f8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b61017761030c565b565b606061019e83836040518060600160405280602781526020016108576027913961031c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101f4610394565b600061020336600481846106a2565b81019061021091906106e8565b905061022d8160405180602001604052806000815250600061039f565b505060408051602081019091526000815290565b606060008061025336600481846106a2565b8101906102609190610719565b915091506102708282600161039f565b604051806020016040528060008152509250505090565b6060610291610394565b60006102a036600481846106a2565b8101906102ad91906106e8565b905061022d816103cb565b60606102c2610394565b60006102cc6101b7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b6060610302610394565b60006102cc610422565b610177610317610422565b610431565b6060600080856001600160a01b0316856040516103399190610807565b600060405180830381855af49150503d8060008114610374576040519150601f19603f3d011682016040523d82523d6000602084013e610379565b606091505b509150915061038a86838387610455565b9695505050505050565b341561017757600080fd5b6103a8836104d3565b6000825111806103b55750805b156103c6576103c48383610179565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103f46101b7565b604080516001600160a01b03928316815291841660208301520160405180910390a161041f81610513565b50565b600061042c6105bc565b905090565b3660008037600080366000845af43d6000803e808015610450573d6000f35b3d6000fd5b606083156104c15782516104ba576001600160a01b0385163b6104ba5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161015e565b50816104cb565b6104cb83836105e4565b949350505050565b6104dc8161060e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105785760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161015e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101db565b8151156105f45781518083602001fd5b8060405162461bcd60e51b815260040161015e9190610823565b6001600160a01b0381163b61067b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161015e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61059b565b600080858511156106b257600080fd5b838611156106bf57600080fd5b5050820193919092039150565b80356001600160a01b03811681146106e357600080fd5b919050565b6000602082840312156106fa57600080fd5b61019e826106cc565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561072c57600080fd5b610735836106cc565b9150602083013567ffffffffffffffff8082111561075257600080fd5b818501915085601f83011261076657600080fd5b81358181111561077857610778610703565b604051601f8201601f19908116603f011681019083821181831017156107a0576107a0610703565b816040528281528860208487010111156107b957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107f65781810151838201526020016107de565b838111156103c45750506000910152565b600082516108198184602087016107db565b9190910192915050565b60208152600082518060208401526108428160408501602087016107db565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122012bb4f564f73959a03513dc74fc3c6e40e8386e6f02c16b78d6db00ce0aa16af64736f6c63430008090033", + "storage": { + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000fadb60b5059e31614e02083ff6c021a24c31c891", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9" + } + }, + { + "contractName": "PolygonZkEVMTimelock", + "balance": "0", + "nonce": "1", + "address": "0x0165878A594ca255338adfa4d48449f69242Eb8F", + "bytecode": "0x6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220d904e0b10230579952f8427a107aa4349f9a1f5799108d399b11e28b578463e464736f6c63430008140033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000e10", + "0xaedcc9e7897c0d335bdc5d92fe3a8b4f23727fe558cd1c19f332b28716a30559": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xf5e61edb9c9cc6bfbae4463e9a2b1dd6ac3b44ddef38f18016e56ba0363910d9": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x64494413541ff93b31aa309254e3fed72a7456e9845988b915b4c7a7ceba8814": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x60b9d94c75b7b3f721925089391e4644cd890cb5e6466f9596dfbd2c54e0b280": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x3412d5605ac6cd444957cedb533e5dacad6378b4bc819ebe3652188a665066d6": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x4b63b79f1e338a49559dcd3193ac9eecc50d0f275d24e97cc8c319e5a31a8bd0": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d706a": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x800d5dfe4bba53eedee06cd4546a27da8de00f12db83f56062976d4493fda899": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xc3ad33e20b0c56a223ad5104fff154aa010f8715b9c981fd38fdc60a4d1a52fc": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5" + } + }, + { + "accountName": "keyless Deployer", + "balance": "0", + "nonce": "1", + "address": "0x694AB5383a002a4796f95530c14Cf0C25ec3EA03" + }, + { + "accountName": "deployer", + "balance": "100000000000000000000000", + "nonce": "8", + "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + } + ], + "firstBatchData": { + "transactions": "0xf8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4d3476afe000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a40d5f56745a118d0906a34e69aec8c0db1cb8fa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ca1ab1e0000000000000000000000000000000000000000000000000000000005ca1ab1e1bff", + "globalExitRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1697640780, + "sequencer": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + } + } \ No newline at end of file diff --git a/docker/scripts/v1ToV2/hardhat.example.paris b/docker/scripts/v1ToV2/hardhat.example.paris new file mode 100644 index 000000000..41037f816 --- /dev/null +++ b/docker/scripts/v1ToV2/hardhat.example.paris @@ -0,0 +1,258 @@ +import "dotenv/config"; +import "@nomicfoundation/hardhat-toolbox"; +import "@openzeppelin/hardhat-upgrades"; +import "hardhat-dependency-compiler"; + +import {HardhatUserConfig} from "hardhat/config"; + +const DEFAULT_MNEMONIC = "test test test test test test test test test test test junk"; + +/* + * You need to export an object to set up your config + * Go to https://hardhat.org/config/ to learn more + */ + +/** + * @type import('hardhat/config').HardhatUserConfig + */ + +const config: HardhatUserConfig = { + dependencyCompiler: { + paths: [ + "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol", + "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol", + "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol", + ], // , + // keep: true + }, + solidity: { + compilers: [ + { + version: "0.8.17", + settings: { + optimizer: { + enabled: true, + runs: 999999, + }, + }, + }, + { + version: "0.8.20", + settings: { + optimizer: { + enabled: true, + runs: 999999, + }, + evmVersion: "paris", + }, + }, + { + version: "0.6.11", + settings: { + optimizer: { + enabled: true, + runs: 999999, + }, + }, + }, + { + version: "0.5.12", + settings: { + optimizer: { + enabled: true, + runs: 999999, + }, + }, + }, + { + version: "0.5.16", + settings: { + optimizer: { + enabled: true, + runs: 999999, + }, + }, + }, + ], + overrides: { + "contracts/v2/PolygonRollupManager.sol": { + version: "0.8.20", + settings: { + optimizer: { + enabled: true, + runs: 99, + }, + evmVersion: "paris", + }, // try yul optimizer + }, + "contracts/v2/PolygonZkEVMBridgeV2.sol": { + version: "0.8.20", + settings: { + optimizer: { + enabled: true, + runs: 99, + }, + evmVersion: "paris", + }, + }, + "contracts/lib/TokenWrapped.sol": { + version: "0.8.20", + settings: { + optimizer: { + enabled: true, + runs: 9999, // must be the same as bridge, for testing porpuses + }, + evmVersion: "paris", + }, + }, + "contracts/v2/mocks/PolygonRollupManagerMock.sol": { + version: "0.8.20", + settings: { + optimizer: { + enabled: true, + runs: 10, + }, + evmVersion: "paris", + }, // try yul optimizer + }, + // Should have the same optimizations than the RollupManager to verify + "contracts/v2/lib/PolygonTransparentProxy.sol": { + version: "0.8.20", + settings: { + optimizer: { + enabled: true, + runs: 10, + }, + evmVersion: "paris", + }, // try yul optimizer + }, + "contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol": { + version: "0.8.20", + settings: { + optimizer: { + enabled: true, + runs: 10, + }, + evmVersion: "paris", + }, // try yul optimizer + }, + }, + }, + networks: { + mainnet: { + url: process.env.MAINNET_PROVIDER + ? process.env.MAINNET_PROVIDER + : `https://mainnet.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, + }, + ropsten: { + url: process.env.ROPSTEN_PROVIDER + ? process.env.ROPSTEN_PROVIDER + : `https://ropsten.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, + }, + goerli: { + url: process.env.GOERLI_PROVIDER + ? process.env.GOERLI_PROVIDER + : `https://goerli.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, + }, + rinkeby: { + url: process.env.RINKEBY_PROVIDER + ? process.env.RINKEBY_PROVIDER + : `https://rinkeby.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, + }, + localhost: { + url: "http://127.0.0.1:8545", + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, + }, + hardhat: { + initialDate: "0", + //allowUnlimitedContractSize: true, + initialBaseFeePerGas: 0, + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, + }, + polygonZKEVMTestnet: { + url: "https://rpc.public.zkevm-test.net", + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, + }, + polygonZKEVMMainnet: { + url: "https://zkevm-rpc.com", + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, + }, + }, + gasReporter: { + enabled: !!process.env.REPORT_GAS, + outputFile: process.env.REPORT_GAS_FILE ? "./gas_report.md" : undefined, + noColors: !!process.env.REPORT_GAS_FILE, + }, + etherscan: { + apiKey: { + polygonZKEVMTestnet: `${process.env.ETHERSCAN_ZKEVM_API_KEY}`, + polygonZKEVMMainnet: `${process.env.ETHERSCAN_ZKEVM_API_KEY}`, + goerli: `${process.env.ETHERSCAN_API_KEY}`, + mainnet: `${process.env.ETHERSCAN_API_KEY}`, + }, + customChains: [ + { + network: "polygonZKEVMMainnet", + chainId: 1101, + urls: { + apiURL: "https://api-zkevm.polygonscan.com/api", + browserURL: "https://zkevm.polygonscan.com/", + }, + }, + { + network: "polygonZKEVMTestnet", + chainId: 1442, + urls: { + apiURL: "https://api-testnet-zkevm.polygonscan.com/api", + browserURL: "https://testnet-zkevm.polygonscan.com/", + }, + }, + ], + }, +}; + +export default config; diff --git a/docker/scripts/v2/deploy-docker.sh b/docker/scripts/v2/deploy-docker.sh index 63a8586f3..adfb268e2 100755 --- a/docker/scripts/v2/deploy-docker.sh +++ b/docker/scripts/v2/deploy-docker.sh @@ -4,10 +4,12 @@ DEV_PERIOD=1 docker-compose -f docker/docker-compose.geth.yml up -d geth sleep 5 node docker/scripts/fund-accounts.js cp docker/scripts/v2/deploy_parameters_docker.json deployment/v2/deploy_parameters.json +cp docker/scripts/v2/create_rollup_parameters.json deployment/v2/create_rollup_parameters.json npm run deploy:testnet:v2:localhost mkdir docker/deploymentOutput mv deployment/v2/deploy_output.json docker/deploymentOutput mv deployment/v2/genesis.json docker/deploymentOutput +mv deployment/v2/create_rollup_output.json docker/deploymentOutput DEV_PERIOD=1 docker-compose -f docker/docker-compose.geth.yml down sudo docker build -t hermeznetwork/geth-zkevm-contracts -f docker/Dockerfile.geth . # Let it readable for the multiplatform build coming later! diff --git a/package.json b/package.json index d92adee1d..c6cf9354f 100644 --- a/package.json +++ b/package.json @@ -90,6 +90,11 @@ "deploy:v2:sepolia": "npx hardhat compile && npx ts-node deployment/v2/1_createGenesis.ts && npx hardhat run deployment/v2/2_deployPolygonZKEVMDeployer.ts --network sepolia && npx hardhat run deployment/v2/3_deployContracts.ts --network sepolia && npx hardhat run deployment/v2/4_createRollup.ts --network sepolia && npm run saveDeployment:sepolia", "deploy:testnet:v2:sepolia": "npx hardhat compile && rm -f deployment/v2/deploy_ongoing.json && npm run prepare:testnet:ZkEVM:sepolia && npm run deploy:v2:sepolia", "verify:v2:sepolia": "npx hardhat run deployment/v2/verifyContracts.js --network sepolia", + "prepare:v1ToV2:ZkEVM:localhost": "npx hardhat run deployment/v1ToV2/prepareTestnet.ts --network localhost", + "deploy:v1ToV2:localhost": "npx hardhat compile && rm -f .openzeppelin/unknown-31337.json && npx ts-node deployment/v1ToV2/1_createGenesis.ts --test && npx hardhat run deployment/v1ToV2/2_deployPolygonZKEVMDeployer.ts --network localhost && npx hardhat run deployment/v1ToV2/3_deployContracts.ts --network localhost", + "deploy:testnet:v1ToV2:localhost": "npx hardhat compile && rm -f deployment/v1ToV2/deploy_ongoing.json && npm run prepare:v1ToV2:ZkEVM:localhost && npm run deploy:v1ToV2:localhost", + "docker:v1ToV2:contracts": "./docker/scripts/v1ToV2/deploy-docker.sh", + "dockerv2:v1ToV2:contracts": "sudo ./docker/scripts/v1ToV2/deploy-dockerv2.sh", "saveDeployment:sepolia": "mkdir -p deployments/sepolia_$(date +%s) && cp -r deployment/v2/deploy_*.json deployments/sepolia_$(date +%s) && cp .openzeppelin/sepolia.json deployments/sepolia_$(date +%s) && cp deployment/v2/genesis.json deployments/sepolia_$(date +%s) && cp deployment/v2/create_rollup_output.json deployments/sepolia_$(date +%s)" } } From c2be528e7b22916c473f41cfab7068d0d7fd14a9 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Fri, 15 Dec 2023 18:54:11 +0100 Subject: [PATCH 112/230] ongoing add tx on legacy zkevm, pending discuss with node --- deployment/v1ToV2/3_deployContracts.ts | 62 +++++++++++++++-- deployment/v1ToV2/genesis.json | 92 ++++++++++++++++++++++++++ 2 files changed, 150 insertions(+), 4 deletions(-) create mode 100644 deployment/v1ToV2/genesis.json diff --git a/deployment/v1ToV2/3_deployContracts.ts b/deployment/v1ToV2/3_deployContracts.ts index 1d946bef6..0031ce480 100644 --- a/deployment/v1ToV2/3_deployContracts.ts +++ b/deployment/v1ToV2/3_deployContracts.ts @@ -14,6 +14,7 @@ const pathOutputJson = path.join(__dirname, "./deploy_output.json"); const pathOngoingDeploymentJson = path.join(__dirname, "./deploy_ongoing.json"); const deployParameters = require("./deploy_parameters.json"); +import {processorUtils} from "@0xpolygonhermez/zkevm-commonjs"; const pathOZUpgradability = path.join(__dirname, `../../.openzeppelin/${process.env.HARDHAT_NETWORK}.json`); const genesis = require("./genesis.json"); @@ -457,10 +458,10 @@ async function main() { PolygonZkEVMFactory, [ { - admin: adminZkEVM, - trustedSequencer: trustedSequencer, + admin: deployer.address, // should be admin, will be transfered afterwards + trustedSequencer: deployer.address, // should be trusted seuquencer, will be transfered afterwards pendingStateTimeout: pendingStateTimeout, - trustedAggregator: trustedAggregator, + trustedAggregator: deployer.address, // should be trusted aggregator, will be transfered afterwards trustedAggregatorTimeout: trustedAggregatorTimeout, }, genesis.root, @@ -542,8 +543,61 @@ async function main() { expect(await upgrades.erc1967.getAdminAddress(precalculateGlobalExitRootAddress)).to.be.equal(proxyAdminAddress); expect(await upgrades.erc1967.getAdminAddress(proxyBridgeAddress)).to.be.equal(proxyAdminAddress); - // Update current system to rollup manager + // // Approve tokens + // const maticAmount = ethers.parseEther("1"); + // const polTokenFactory = await ethers.getContractFactory("ERC20PermitMock", deployer); + // const polTokenContract = polTokenFactory.attach(polTokenAddress) as any; + // await (await polTokenContract.approve(polygonZkEVMContract.target, maticAmount)).wait(); + + // // Sequence batches + // const tx = ethers.Transaction.from({ + // to: deployer.address, + // nonce: 0, + // value: 1, + // gasLimit: 21000, + // gasPrice: 1, + // data: "0x", + // chainId: chainID, + // type: 0, // legacy transaction + // }); + + // const signer = ethers.HDNodeWallet.fromMnemonic( + // ethers.Mnemonic.fromPhrase("test test test test test test test test test test test junk"), + // "m/44'/60'/0'/0/0" + // ).connect(currentProvider); + + // const signedTx = await signer.signTransaction(tx); + // const l2txData = processorUtils.rawTxToCustomRawTx(signedTx); + // const currentTimestamp = (await currentProvider.getBlock("latest"))?.timestamp; + + // const sequence = { + // transactions: l2txData, + // globalExitRoot: ethers.ZeroHash, + // timestamp: currentTimestamp, + // minForcedTimestamp: 0, + // } as any; + // await (await polygonZkEVMContract.sequenceBatches([sequence], trustedSequencer)).wait(); + + // // Verify batches + // const newStateRoot = "0x0000000000000000000000000000000000000000000000000000000000000000"; + // const zkProofFFlonk = new Array(24).fill(ethers.ZeroHash); + // await ( + // await polygonZkEVMContract.verifyBatchesTrustedAggregator( + // 0, // pending state not used + // 0, // old batch + // 1, // new batch + // ethers.ZeroHash, // local exit root + // newStateRoot, + // new Array(24).fill(ethers.ZeroHash) + // ) + // ).wait(); + + // TRrnsfer roles + await (await polygonZkEVMContract.setTrustedSequencer(trustedSequencer)).wait(); + await (await polygonZkEVMContract.setTrustedAggregator(trustedAggregator)).wait(); + await (await polygonZkEVMContract.transferAdminRole(adminZkEVM)).wait(); + // Update current system to rollup manager const PolygonZkEVMV2ExistentFactory = await ethers.getContractFactory("PolygonZkEVMV2Existent"); const newPolygonZkEVMContract = (await upgrades.deployProxy(PolygonZkEVMV2ExistentFactory, [], { diff --git a/deployment/v1ToV2/genesis.json b/deployment/v1ToV2/genesis.json new file mode 100644 index 000000000..1591582ec --- /dev/null +++ b/deployment/v1ToV2/genesis.json @@ -0,0 +1,92 @@ +{ + "root": "0x86394224eaa1192d4c1098e96677fe793588bcbf38349323364741111dfd52a1", + "genesis": [ + { + "contractName": "PolygonZkEVMDeployer", + "balance": "0", + "nonce": "4", + "address": "0xFbD07134824dDEa24E4ae414c18ecbFa98169A24", + "bytecode": "0x60806040526004361061006e575f3560e01c8063715018a61161004c578063715018a6146100e25780638da5cb5b146100f6578063e11ae6cb1461011f578063f2fde38b14610132575f80fd5b80632b79805a146100725780634a94d487146100875780636d07dbf81461009a575b5f80fd5b610085610080366004610908565b610151565b005b6100856100953660046109a2565b6101c2565b3480156100a5575f80fd5b506100b96100b43660046109f5565b610203565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ed575f80fd5b50610085610215565b348015610101575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff166100b9565b61008561012d366004610a15565b610228565b34801561013d575f80fd5b5061008561014c366004610a61565b61028e565b61015961034a565b5f6101658585856103ca565b90506101718183610527565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a15050505050565b6101ca61034a565b6101d583838361056a565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b905f90a1505050565b5f61020e8383610598565b9392505050565b61021d61034a565b6102265f6105a4565b565b61023061034a565b5f61023c8484846103ca565b60405173ffffffffffffffffffffffffffffffffffffffff821681529091507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a150505050565b61029661034a565b73ffffffffffffffffffffffffffffffffffffffff811661033e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610347816105a4565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610335565b5f83471015610435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610335565b81515f0361049f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610335565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff811661020e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610335565b606061020e83835f6040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c65640000815250610618565b6060610590848484604051806060016040528060298152602001610b0860299139610618565b949350505050565b5f61020e83833061072d565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156106aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610335565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516106d29190610a9c565b5f6040518083038185875af1925050503d805f811461070c576040519150601f19603f3d011682016040523d82523d5f602084013e610711565b606091505b509150915061072287838387610756565b979650505050505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b606083156107eb5782515f036107e45773ffffffffffffffffffffffffffffffffffffffff85163b6107e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610335565b5081610590565b61059083838151156108005781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103359190610ab7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112610870575f80fd5b813567ffffffffffffffff8082111561088b5761088b610834565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156108d1576108d1610834565b816040528381528660208588010111156108e9575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f806080858703121561091b575f80fd5b8435935060208501359250604085013567ffffffffffffffff80821115610940575f80fd5b61094c88838901610861565b93506060870135915080821115610961575f80fd5b5061096e87828801610861565b91505092959194509250565b803573ffffffffffffffffffffffffffffffffffffffff8116811461099d575f80fd5b919050565b5f805f606084860312156109b4575f80fd5b6109bd8461097a565b9250602084013567ffffffffffffffff8111156109d8575f80fd5b6109e486828701610861565b925050604084013590509250925092565b5f8060408385031215610a06575f80fd5b50508035926020909101359150565b5f805f60608486031215610a27575f80fd5b8335925060208401359150604084013567ffffffffffffffff811115610a4b575f80fd5b610a5786828701610861565b9150509250925092565b5f60208284031215610a71575f80fd5b61020e8261097a565b5f5b83811015610a94578181015183820152602001610a7c565b50505f910152565b5f8251610aad818460208701610a7a565b9190910192915050565b602081525f8251806020840152610ad5816040850160208701610a7a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220330b94dc698c4d290bf55c23f13b473cde6a6bae0030cb902de18af54e35839f64736f6c63430008140033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" + } + }, + { + "contractName": "ProxyAdmin", + "balance": "0", + "nonce": "1", + "address": "0xfADB60b5059e31614e02083fF6C021a24C31c891", + "bytecode": "0x608060405260043610610079575f3560e01c80639623609d1161004c5780639623609d1461012357806399a88ec414610136578063f2fde38b14610155578063f3b7dead14610174575f80fd5b8063204e1c7a1461007d578063715018a6146100c55780637eff275e146100db5780638da5cb5b146100fa575b5f80fd5b348015610088575f80fd5b5061009c6100973660046105e8565b610193565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100d0575f80fd5b506100d9610244565b005b3480156100e6575f80fd5b506100d96100f536600461060a565b610257565b348015610105575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff1661009c565b6100d961013136600461066e565b6102e0565b348015610141575f80fd5b506100d961015036600461060a565b610371565b348015610160575f80fd5b506100d961016f3660046105e8565b6103cd565b34801561017f575f80fd5b5061009c61018e3660046105e8565b610489565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907f5c60da1b00000000000000000000000000000000000000000000000000000000815260040190565b5f60405180830381855afa9150503d805f8114610215576040519150601f19603f3d011682016040523d82523d5f602084013e61021a565b606091505b509150915081610228575f80fd5b8080602001905181019061023c919061075b565b949350505050565b61024c6104d3565b6102555f610553565b565b61025f6104d3565b6040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690638f283970906024015b5f604051808303815f87803b1580156102c6575f80fd5b505af11580156102d8573d5f803e3d5ffd5b505050505050565b6102e86104d3565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef28690349061033e9086908690600401610776565b5f604051808303818588803b158015610355575f80fd5b505af1158015610367573d5f803e3d5ffd5b5050505050505050565b6103796104d3565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690633659cfe6906024016102af565b6103d56104d3565b73ffffffffffffffffffffffffffffffffffffffff811661047d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61048681610553565b50565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907ff851a44000000000000000000000000000000000000000000000000000000000815260040190565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610474565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610486575f80fd5b5f602082840312156105f8575f80fd5b8135610603816105c7565b9392505050565b5f806040838503121561061b575f80fd5b8235610626816105c7565b91506020830135610636816105c7565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f805f60608486031215610680575f80fd5b833561068b816105c7565b9250602084013561069b816105c7565b9150604084013567ffffffffffffffff808211156106b7575f80fd5b818601915086601f8301126106ca575f80fd5b8135818111156106dc576106dc610641565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561072257610722610641565b8160405282815289602084870101111561073a575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f6020828403121561076b575f80fd5b8151610603816105c7565b73ffffffffffffffffffffffffffffffffffffffff831681525f602060408184015283518060408501525f5b818110156107be578581018301518582016060015282016107a2565b505f6060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050939250505056fea26469706673582212203083a4ccc2e42eed60bd19037f2efa77ed086dc7a5403f75bebb995dcba2221c64736f6c63430008140033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f" + } + }, + { + "contractName": "PolygonZkEVMBridge implementation", + "balance": "0", + "nonce": "1", + "address": "0x652f0520E67542a9612e8C86b917228A40180383", + "bytecode": "0x608060405260043610620001f7575f3560e01c806383f244031162000112578063ccaa2d11116200009e578063ee25560b116200006a578063ee25560b1462000615578063f5efcd791462000644578063f811bff71462000668578063fb570834146200068c575f80fd5b8063ccaa2d111462000599578063cd58657914620005bd578063d02103ca14620005d4578063dbc1697614620005fe575f80fd5b8063bab161bf11620000de578063bab161bf1462000509578063be5831c7146200052c578063c00f14ab1462000551578063cc4616321462000575575f80fd5b806383f24403146200047c5780638ed7e3f214620004a0578063aaa13cc214620004c1578063b8b284d014620004e5575f80fd5b80633c351e1011620001925780635ca1e165116200015e5780635ca1e16514620003f25780637843298b146200040957806379e2cf97146200042d57806381b1c1741462000444575f80fd5b80633c351e1014620003515780633cbc795b14620003725780633e19704314620003ad5780634b2f336d14620003d1575f80fd5b8063240ff37811620001d2578063240ff378146200028157806327aef4e814620002985780632dfdf0b514620002be578063318aee3d14620002e4575f80fd5b806315064c9614620001fb5780632072f6c5146200022b57806322e95f2c1462000244575b5f80fd5b34801562000207575f80fd5b50606854620002169060ff1681565b60405190151581526020015b60405180910390f35b34801562000237575f80fd5b5062000242620006b0565b005b34801562000250575f80fd5b50620002686200026236600462003137565b620006e8565b6040516001600160a01b03909116815260200162000222565b6200024262000292366004620031c7565b62000752565b348015620002a4575f80fd5b50620002af620007e0565b60405162000222919062003297565b348015620002ca575f80fd5b50620002d560535481565b60405190815260200162000222565b348015620002f0575f80fd5b506200032c62000302366004620032b2565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b0390911660208301520162000222565b3480156200035d575f80fd5b50606d5462000268906001600160a01b031681565b3480156200037e575f80fd5b50606d546200039790600160a01b900463ffffffff1681565b60405163ffffffff909116815260200162000222565b348015620003b9575f80fd5b50620002d5620003cb366004620032df565b62000874565b348015620003dd575f80fd5b50606f5462000268906001600160a01b031681565b348015620003fe575f80fd5b50620002d56200091d565b34801562000415575f80fd5b50620002686200042736600462003364565b62000a02565b34801562000439575f80fd5b506200024262000a32565b34801562000450575f80fd5b506200026862000462366004620033b1565b606a6020525f90815260409020546001600160a01b031681565b34801562000488575f80fd5b50620002d56200049a366004620033db565b62000a56565b348015620004ac575f80fd5b50606c5462000268906001600160a01b031681565b348015620004cd575f80fd5b5062000268620004df366004620034ef565b62000b39565b348015620004f1575f80fd5b50620002426200050336600462003592565b62000c85565b34801562000515575f80fd5b506068546200039790610100900463ffffffff1681565b34801562000538575f80fd5b506068546200039790600160c81b900463ffffffff1681565b3480156200055d575f80fd5b50620002af6200056f366004620032b2565b62000d66565b34801562000581575f80fd5b5062000216620005933660046200361a565b62000db3565b348015620005a5575f80fd5b5062000242620005b736600462003650565b62000e42565b62000242620005ce36600462003744565b620013b0565b348015620005e0575f80fd5b5060685462000268906501000000000090046001600160a01b031681565b3480156200060a575f80fd5b50620002426200184d565b34801562000621575f80fd5b50620002d562000633366004620033b1565b60696020525f908152604090205481565b34801562000650575f80fd5b50620002426200066236600462003650565b62001883565b34801562000674575f80fd5b506200024262000686366004620037e0565b62001b60565b34801562000698575f80fd5b5062000216620006aa36600462003892565b62001e8f565b606c546001600160a01b03163314620006dc57604051631736745960e31b815260040160405180910390fd5b620006e662001ea8565b565b6040805160e084901b6001600160e01b031916602080830191909152606084901b6bffffffffffffffffffffffff1916602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b60685460ff16156200077757604051630bc011ff60e21b815260040160405180910390fd5b3415801590620007915750606f546001600160a01b031615155b15620007c9576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007d985853486868662001f04565b5050505050565b606e8054620007ef90620038dc565b80601f01602080910402602001604051908101604052809291908181526020018280546200081d90620038dc565b80156200086c5780601f1062000842576101008083540402835291602001916200086c565b820191905f5260205f20905b8154815290600101906020018083116200084e57829003601f168201915b505050505081565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201526001600160e01b031960e088811b821660218401526bffffffffffffffffffffffff19606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b6053545f90819081805b6020811015620009f9578083901c6001166001036200098a576033816020811062000956576200095662003916565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620009b7565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620009f0906200393e565b91505062000927565b50919392505050565b5f62000a2a848462000a148562001fd8565b62000a1f86620020ca565b620004df87620021b1565b949350505050565b605354606854600160c81b900463ffffffff161015620006e657620006e662002287565b5f83815b602081101562000b3057600163ffffffff8516821c8116900362000acc5784816020811062000a8d5762000a8d62003916565b60200201358260405160200162000aae929190918252602082015260400190565b60405160208183030381529060405280519060200120915062000b1b565b8185826020811062000ae25762000ae262003916565b602002013560405160200162000b02929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062000b27816200393e565b91505062000a5a565b50949350505050565b6040516001600160e01b031960e087901b1660208201526bffffffffffffffffffffffff19606086901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b30836040518060200162000ba290620030fd565b601f1982820381018352601f90910116604081905262000bcb908b908b908b9060200162003959565b60408051601f198184030181529082905262000beb929160200162003995565b6040516020818303038152906040528051906020012060405160200162000c6194939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff161562000caa57604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b031662000ced576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f54604051632770a7eb60e21b8152336004820152602481018690526001600160a01b0390911690639dc29fac906044015f604051808303815f87803b15801562000d37575f80fd5b505af115801562000d4a573d5f803e3d5ffd5b5050505062000d5e86868686868662001f04565b505050505050565b606062000d738262001fd8565b62000d7e83620020ca565b62000d8984620021b1565b60405160200162000d9d9392919062003959565b6040516020818303038152906040529050919050565b6068545f908190610100900463ffffffff1615801562000dd9575063ffffffff83166001145b1562000ded575063ffffffff831662000e19565b62000e0464010000000063ffffffff8516620039c7565b62000e169063ffffffff8616620039e1565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000e6757604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161462000e98576040516302caf51760e11b815260040160405180910390fd5b62000ed18c8c8c8c8c62000ecb5f8e8e8e8e8e8e8e60405162000ebd929190620039f7565b604051809103902062000874565b6200233a565b6001600160a01b0386166200102757606f546001600160a01b031662000fbe575f6001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000f2a576020820181803683370190505b5060405162000f3a919062003a06565b5f6040518083038185875af1925050503d805f811462000f76576040519150601f19603f3d011682016040523d82523d5f602084013e62000f7b565b606091505b505090508062000fb7576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062001346565b606f546040516340c10f1960e01b81526001600160a01b03868116600483015260248201869052909116906340c10f19906044015f604051808303815f87803b1580156200100a575f80fd5b505af11580156200101d573d5f803e3d5ffd5b5050505062001346565b606d546001600160a01b038781169116148015620010565750606d5463ffffffff888116600160a01b90920416145b156200106f575f6001600160a01b038516848262000eff565b60685463ffffffff610100909104811690881603620010a4576200109e6001600160a01b0387168585620024de565b62001346565b6040516001600160e01b031960e089901b1660208201526bffffffffffffffffffffffff19606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b031680620012e3575f8080620011208688018862003a23565b9250925092505f858484846040516200113990620030fd565b620011479392919062003959565b8190604051809103905ff590508015801562001165573d5f803e3d5ffd5b506040516340c10f1960e01b81526001600160a01b038c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b158015620011b2575f80fd5b505af1158015620011c5573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b604051620012d195949392919062003abc565b60405180910390a15050505062001343565b6040516340c10f1960e01b81526001600160a01b038781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b1580156200132b575f80fd5b505af11580156200133e573d5f803e3d5ffd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff1615620013d557604051630bc011ff60e21b815260040160405180910390fd5b620013df62002561565b60685463ffffffff61010090910481169088160362001411576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b03881662001518578834146200145f576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff169450906200148e90620038dc565b80601f0160208091040260200160405190810160405280929190818152602001828054620014bc90620038dc565b80156200150b5780601f10620014e1576101008083540402835291602001916200150b565b820191905f5260205f20905b815481529060010190602001808311620014ed57829003601f168201915b50505050509150620017ba565b341562001551576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546001600160a01b0390811690891603620015cb57604051632770a7eb60e21b8152336004820152602481018a90526001600160a01b03891690639dc29fac906044015f604051808303815f87803b158015620015ae575f80fd5b505af1158015620015c1573d5f803e3d5ffd5b50505050620017ba565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff81168352640100000000900490921691810182905290156200168157604051632770a7eb60e21b8152336004820152602481018b90526001600160a01b038a1690639dc29fac906044015f604051808303815f87803b15801562001657575f80fd5b505af11580156200166a573d5f803e3d5ffd5b5050505080602001519450805f01519350620017ab565b8515620016965762001696898b8989620025bc565b6040516370a0823160e01b81523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa158015620016db573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001701919062003af6565b90506200171a6001600160a01b038b1633308e62002977565b6040516370a0823160e01b81523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa1580156200175f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001785919062003af6565b905062001793828262003b0e565b6068548c9850610100900463ffffffff169650935050505b620017b68962000d66565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620017fb98979695949392919062003b24565b60405180910390a1620018256200181f5f85878f8f87898051906020012062000874565b620029ca565b861562001836576200183662002287565b505050506200184460018055565b50505050505050565b606c546001600160a01b031633146200187957604051631736745960e31b815260040160405180910390fd5b620006e662002adf565b60685460ff1615620018a857604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614620018d9576040516302caf51760e11b815260040160405180910390fd5b620018ff8c8c8c8c8c62000ecb60018e8e8e8e8e8e8e60405162000ebd929190620039f7565b606f545f906001600160a01b0316620019ba57846001600160a01b031684888a868660405160240162001936949392919062003b8f565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b179052516200196d919062003a06565b5f6040518083038185875af1925050503d805f8114620019a9576040519150601f19603f3d011682016040523d82523d5f602084013e620019ae565b606091505b50508091505062001abd565b606f546040516340c10f1960e01b81526001600160a01b03878116600483015260248201879052909116906340c10f19906044015f604051808303815f87803b15801562001a06575f80fd5b505af115801562001a19573d5f803e3d5ffd5b50505050846001600160a01b03168789858560405160240162001a40949392919062003b8f565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162001a77919062003a06565b5f604051808303815f865af19150503d805f811462001ab2576040519150601f19603f3d011682016040523d82523d5f602084013e62001ab7565b606091505b50909150505b8062001af5576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f54610100900460ff161580801562001b7f57505f54600160ff909116105b8062001b9a5750303b15801562001b9a57505f5460ff166001145b62001c125760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805460ff19166001179055801562001c34575f805461ff0019166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8a16027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038781169190910291909117909155606c805473ffffffffffffffffffffffffffffffffffffffff1916858316179055861662001d125763ffffffff85161562001d0c576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001e37565b606d805463ffffffff8716600160a01b027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b03891617179055606e62001d63838262003c12565b505f801b601260405162001d7790620030fd565b6060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff909116604082015260e0018190604051809103905ff590508015801562001e08573d5f803e3d5ffd5b50606f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790555b62001e4162002b50565b801562001844575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b5f8162001e9e86868662000a56565b1495945050505050565b60685460ff161562001ecd57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff61010090910481169087160362001f36576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff1633898989888860535460405162001f8c9998979695949392919062003cdb565b60405180910390a162001fc76200181f6001606860019054906101000a900463ffffffff16338a8a8a898960405162000ebd929190620039f7565b821562000d5e5762000d5e62002287565b60408051600481526024810182526020810180516001600160e01b03167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b0386169162002039919062003a06565b5f60405180830381855afa9150503d805f811462002073576040519150601f19603f3d011682016040523d82523d5f602084013e62002078565b606091505b509150915081620020bf576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062000a2a565b62000a2a8162002bc6565b60408051600481526024810182526020810180516001600160e01b03167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b038616916200212b919062003a06565b5f60405180830381855afa9150503d805f811462002165576040519150601f19603f3d011682016040523d82523d5f602084013e6200216a565b606091505b509150915081620020bf576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062000a2a565b60408051600481526024810182526020810180516001600160e01b03167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b0386169162002211919062003a06565b5f60405180830381855afa9150503d805f81146200224b576040519150601f19603f3d011682016040523d82523d5f602084013e62002250565b606091505b509150915081801562002264575080516020145b6200227157601262000a2a565b8080602001905181019062000a2a919062003d48565b6053546068805463ffffffff909216600160c81b027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d620022ea6200091d565b6040518263ffffffff1660e01b81526004016200230991815260200190565b5f604051808303815f87803b15801562002321575f80fd5b505af115801562002334573d5f803e3d5ffd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af1158015620023cc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620023f2919062003af6565b9050805f036200242d576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8068010000000000000000871615620024765786915062002452848a848962001e8f565b62002470576040516338105f3b60e21b815260040160405180910390fd5b620024c7565b602087901c6200248881600162003d66565b9150879250620024a76200249e868c8662000a56565b8a838962001e8f565b620024c5576040516338105f3b60e21b815260040160405180910390fd5b505b620024d3828262002db1565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526200255c9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262002e79565b505050565b600260015403620025b55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001c09565b6002600155565b5f620025cc600482848662003d8d565b620025d79162003db6565b90507f2afa5331000000000000000000000000000000000000000000000000000000006001600160e01b0319821601620027be575f80808080808062002621896004818d62003d8d565b81019062002630919062003de7565b9650965096509650965096509650336001600160a01b0316876001600160a01b031614620026715760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03861630146200269b5760405163750643af60e01b815260040160405180910390fd5b8a8514620026d5576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b03167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e16916200276e919062003a06565b5f604051808303815f865af19150503d805f8114620027a9576040519150601f19603f3d011682016040523d82523d5f602084013e620027ae565b606091505b50505050505050505050620007d9565b6001600160e01b031981166323f2ebc360e21b1462002809576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80808080808080620028208a6004818e62003d8d565b8101906200282f919062003e3d565b97509750975097509750975097509750336001600160a01b0316886001600160a01b031614620028725760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146200289c5760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169162002925919062003a06565b5f604051808303815f865af19150503d805f811462002960576040519150601f19603f3d011682016040523d82523d5f602084013e62002965565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052620023349085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002524565b806001620029db6020600262003fbd565b620029e7919062003b0e565b6053541062002a22576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462002a33906200393e565b918290555090505f5b602081101562002ace578082901c60011660010362002a7457826033826020811062002a6c5762002a6c62003916565b015550505050565b6033816020811062002a8a5762002a8a62003916565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062002ac5906200393e565b91505062002a3c565b506200255c62003fca565b60018055565b60685460ff1662002b1c576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f54610100900460ff1662002bbc5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162001c09565b620006e662002f64565b6060604082511062002be857818060200190518101906200074c919062003fde565b815160200362002d73575f5b60208110801562002c3f575082818151811062002c155762002c1562003916565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002c5a578062002c51816200393e565b91505062002bf4565b805f0362002c9d57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff81111562002cba5762002cba6200341c565b6040519080825280601f01601f19166020018201604052801562002ce5576020820181803683370190505b5090505f5b8281101562002d6b5784818151811062002d085762002d0862003916565b602001015160f81c60f81b82828151811062002d285762002d2862003916565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053508062002d62816200393e565b91505062002cea565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b6068545f90610100900463ffffffff1615801562002dd5575063ffffffff82166001145b1562002de9575063ffffffff821662002e15565b62002e0064010000000063ffffffff8416620039c7565b62002e129063ffffffff8516620039e1565b90505b600881901c5f8181526069602052604081208054600160ff861690811b9182189283905592909190818316900362001844576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002ecf826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031662002fd09092919063ffffffff16565b8051909150156200255c578080602001905181019062002ef0919062004059565b6200255c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001c09565b5f54610100900460ff1662002ad95760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162001c09565b606062000a2a84845f85855f80866001600160a01b0316858760405162002ff8919062003a06565b5f6040518083038185875af1925050503d805f811462003034576040519150601f19603f3d011682016040523d82523d5f602084013e62003039565b606091505b50915091506200304c8783838762003057565b979650505050505050565b60608315620030ca5782515f03620030c2576001600160a01b0385163b620030c25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001c09565b508162000a2a565b62000a2a8383815115620030e15781518083602001fd5b8060405162461bcd60e51b815260040162001c09919062003297565b61174d806200407883390190565b803563ffffffff8116811462002dac575f80fd5b6001600160a01b038116811462003134575f80fd5b50565b5f806040838503121562003149575f80fd5b62003154836200310b565b9150602083013562003166816200311f565b809150509250929050565b801515811462003134575f80fd5b5f8083601f84011262003190575f80fd5b50813567ffffffffffffffff811115620031a8575f80fd5b602083019150836020828501011115620031c0575f80fd5b9250929050565b5f805f805f60808688031215620031dc575f80fd5b620031e7866200310b565b94506020860135620031f9816200311f565b935060408601356200320b8162003171565b9250606086013567ffffffffffffffff81111562003227575f80fd5b62003235888289016200317f565b969995985093965092949392505050565b5f5b838110156200326257818101518382015260200162003248565b50505f910152565b5f81518084526200328381602086016020860162003246565b601f01601f19169290920160200192915050565b602081525f620032ab60208301846200326a565b9392505050565b5f60208284031215620032c3575f80fd5b8135620032ab816200311f565b60ff8116811462003134575f80fd5b5f805f805f805f60e0888a031215620032f6575f80fd5b87356200330381620032d0565b965062003313602089016200310b565b9550604088013562003325816200311f565b945062003335606089016200310b565b9350608088013562003347816200311f565b9699959850939692959460a0840135945060c09093013592915050565b5f805f6060848603121562003377575f80fd5b62003382846200310b565b9250602084013562003394816200311f565b91506040840135620033a6816200311f565b809150509250925092565b5f60208284031215620033c2575f80fd5b5035919050565b8061040081018310156200074c575f80fd5b5f805f6104408486031215620033ef575f80fd5b83359250620034028560208601620033c9565b91506200341361042085016200310b565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156200345c576200345c6200341c565b604052919050565b5f67ffffffffffffffff8211156200348057620034806200341c565b50601f01601f191660200190565b5f620034a46200349e8462003464565b62003430565b9050828152838383011115620034b8575f80fd5b828260208301375f602084830101529392505050565b5f82601f830112620034de575f80fd5b620032ab838335602085016200348e565b5f805f805f60a0868803121562003504575f80fd5b6200350f866200310b565b9450602086013562003521816200311f565b9350604086013567ffffffffffffffff808211156200353e575f80fd5b6200354c89838a01620034ce565b9450606088013591508082111562003562575f80fd5b506200357188828901620034ce565b92505060808601356200358481620032d0565b809150509295509295909350565b5f805f805f8060a08789031215620035a8575f80fd5b620035b3876200310b565b95506020870135620035c5816200311f565b9450604087013593506060870135620035de8162003171565b9250608087013567ffffffffffffffff811115620035fa575f80fd5b6200360889828a016200317f565b979a9699509497509295939492505050565b5f80604083850312156200362c575f80fd5b62003637836200310b565b915062003647602084016200310b565b90509250929050565b5f805f805f805f805f805f806109208d8f0312156200366d575f80fd5b620036798e8e620033c9565b9b506200368b8e6104008f01620033c9565b9a506108008d013599506108208d013598506108408d01359750620036b46108608e016200310b565b9650620036c66108808e01356200311f565b6108808d01359550620036dd6108a08e016200310b565b9450620036ef6108c08e01356200311f565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111562003719575f80fd5b6200372c8e6109008f01358f016200317f565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a0312156200375b575f80fd5b62003766886200310b565b9650602088013562003778816200311f565b955060408801359450606088013562003791816200311f565b93506080880135620037a38162003171565b925060a088013567ffffffffffffffff811115620037bf575f80fd5b620037cd8a828b016200317f565b989b979a50959850939692959293505050565b5f805f805f8060c08789031215620037f6575f80fd5b62003801876200310b565b9550602087013562003813816200311f565b945062003823604088016200310b565b9350606087013562003835816200311f565b9250608087013562003847816200311f565b915060a087013567ffffffffffffffff81111562003863575f80fd5b8701601f8101891362003874575f80fd5b62003885898235602084016200348e565b9150509295509295509295565b5f805f806104608587031215620038a7575f80fd5b84359350620038ba8660208701620033c9565b9250620038cb61042086016200310b565b939692955092936104400135925050565b600181811c90821680620038f157607f821691505b6020821081036200391057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600182016200395257620039526200392a565b5060010190565b606081525f6200396d60608301866200326a565b82810360208401526200398181866200326a565b91505060ff83166040830152949350505050565b5f8351620039a881846020880162003246565b835190830190620039be81836020880162003246565b01949350505050565b80820281158282048414176200074c576200074c6200392a565b808201808211156200074c576200074c6200392a565b818382375f9101908152919050565b5f825162003a1981846020870162003246565b9190910192915050565b5f805f6060848603121562003a36575f80fd5b833567ffffffffffffffff8082111562003a4e575f80fd5b62003a5c87838801620034ce565b9450602086013591508082111562003a72575f80fd5b5062003a8186828701620034ce565b9250506040840135620033a681620032d0565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b63ffffffff861681525f6001600160a01b038087166020840152808616604084015250608060608301526200304c60808301848662003a94565b5f6020828403121562003b07575f80fd5b5051919050565b818103818111156200074c576200074c6200392a565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003b76828501876200326a565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f62003bbf60608301848662003a94565b9695505050505050565b601f8211156200255c575f81815260208120601f850160051c8101602086101562003bf15750805b601f850160051c820191505b8181101562000d5e5782815560010162003bfd565b815167ffffffffffffffff81111562003c2f5762003c2f6200341c565b62003c478162003c408454620038dc565b8462003bc9565b602080601f83116001811462003c7d575f841562003c655750858301515b5f19600386901b1c1916600185901b17855562000d5e565b5f85815260208120601f198616915b8281101562003cad5788860151825594840194600190910190840162003c8c565b508582101562003ccb57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003d2e828501878962003a94565b925080851660e085015250509a9950505050505050505050565b5f6020828403121562003d59575f80fd5b8151620032ab81620032d0565b63ffffffff81811683821601908082111562003d865762003d866200392a565b5092915050565b5f808585111562003d9c575f80fd5b8386111562003da9575f80fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101562003ddf5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562003dfe575f80fd5b873562003e0b816200311f565b9650602088013562003e1d816200311f565b9550604088013594506060880135935060808801356200334781620032d0565b5f805f805f805f80610100898b03121562003e56575f80fd5b883562003e63816200311f565b9750602089013562003e75816200311f565b96506040890135955060608901359450608089013562003e958162003171565b935060a089013562003ea781620032d0565b979a969950949793969295929450505060c08201359160e0013590565b600181815b8085111562003f0457815f190482111562003ee85762003ee86200392a565b8085161562003ef657918102915b93841c939080029062003ec9565b509250929050565b5f8262003f1c575060016200074c565b8162003f2a57505f6200074c565b816001811462003f43576002811462003f4e5762003f6e565b60019150506200074c565b60ff84111562003f625762003f626200392a565b50506001821b6200074c565b5060208310610133831016604e8410600b841016171562003f93575081810a6200074c565b62003f9f838362003ec4565b805f190482111562003fb55762003fb56200392a565b029392505050565b5f620032ab838362003f0c565b634e487b7160e01b5f52600160045260245ffd5b5f6020828403121562003fef575f80fd5b815167ffffffffffffffff81111562004006575f80fd5b8201601f8101841362004017575f80fd5b8051620040286200349e8262003464565b8181528560208385010111156200403d575f80fd5b6200405082602083016020860162003246565b95945050505050565b5f602082840312156200406a575f80fd5b8151620032ab816200317156fe61010060405234801562000011575f80fd5b506040516200174d3803806200174d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516112af6200049e5f395f61022d01525f81816102ee01528181610550015261061001525f6104e501525f818161035301526104af01526112af5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf14610375578063dd62ed3e14610388578063ffa1ad74146103c0575f80fd5b8063a457c2d714610328578063a9059cbb1461033b578063cd0d00961461034e575f80fd5b806395d89b41116100b857806395d89b41146102ce5780639dc29fac146102d6578063a3c573eb146102e9575f80fd5b806370a08231146102875780637ecebe00146102af575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a6103e0565b604051610187919061107d565b60405180910390f35b6101a361019e3660046110e3565b610470565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461110b565b610489565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ac565b6101a361026d3660046110e3565b610507565b6102856102803660046110e3565b610545565b005b6101b7610295366004611144565b6001600160a01b03165f9081526020819052604090205490565b6101b76102bd366004611144565b60056020525f908152604090205481565b61017a6105f6565b6102856102e43660046110e3565b610605565b6103107f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610187565b6101a36103363660046110e3565b6106ad565b6101a36103493660046110e3565b610756565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b610285610383366004611164565b610763565b6101b76103963660046111d1565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b61017a604051806040016040528060018152602001603160f81b81525081565b6060600380546103ef90611202565b80601f016020809104026020016040519081016040528092919081815260200182805461041b90611202565b80156104665780601f1061043d57610100808354040283529160200191610466565b820191905f5260205f20905b81548152906001019060200180831161044957829003601f168201915b5050505050905090565b5f3361047d8185856109e3565b60019150505b92915050565b5f33610496858285610b3b565b6104a1858585610bcb565b506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146104e2576104dd46610db6565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f8181526001602090815260408083206001600160a01b038716845290915281205490919061047d908290869061054090879061124e565b6109e3565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105e85760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6105f28282610e61565b5050565b6060600480546103ef90611202565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106a35760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084016105df565b6105f28282610f1e565b335f8181526001602090815260408083206001600160a01b0387168452909152812054909190838110156107495760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016105df565b6104a182868684036109e3565b5f3361047d818585610bcb565b834211156107d85760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d69740000000000000000000000000000000000000000000000000000000060648201526084016105df565b6001600160a01b0387165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661082483611261565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6108816104ac565b6040517f1901000000000000000000000000000000000000000000000000000000000000602082015260228101919091526042810183905260620160408051601f1981840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610924573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381161580159061095a5750896001600160a01b0316816001600160a01b0316145b6109cc5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e61747572650000000000000000000000000000000000000000000000000060648201526084016105df565b6109d78a8a8a6109e3565b50505050505050505050565b6001600160a01b038316610a5e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016105df565b6001600160a01b038216610ada5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016105df565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198114610bc55781811015610bb85760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016105df565b610bc584848484036109e3565b50505050565b6001600160a01b038316610c475760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016105df565b6001600160a01b038216610cc35760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016105df565b6001600160a01b0383165f9081526020819052604090205481811015610d515760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016105df565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610bc5565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610de06103e0565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610eb75760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105df565b8060025f828254610ec8919061124e565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6001600160a01b038216610f9a5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016105df565b6001600160a01b0382165f90815260208190526040902054818110156110285760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016105df565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610b2e565b5f6020808352835180828501525f5b818110156110a85785810183015185820160400152820161108c565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b03811681146110de575f80fd5b919050565b5f80604083850312156110f4575f80fd5b6110fd836110c8565b946020939093013593505050565b5f805f6060848603121561111d575f80fd5b611126846110c8565b9250611134602085016110c8565b9150604084013590509250925092565b5f60208284031215611154575f80fd5b61115d826110c8565b9392505050565b5f805f805f805f60e0888a03121561117a575f80fd5b611183886110c8565b9650611191602089016110c8565b95506040880135945060608801359350608088013560ff811681146111b4575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f80604083850312156111e2575f80fd5b6111eb836110c8565b91506111f9602084016110c8565b90509250929050565b600181811c9082168061121657607f821691505b60208210810361123457634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156104835761048361123a565b5f600182016112725761127261123a565b506001019056fea264697066735822122085df368f2b8936cd5558ab5216c979beafb53cf6494111db07c4593ce39d96e664736f6c63430008140033a26469706673582212203b6bb4c70bf485ea8bf62b9fbe5c39272559d47531e665679c66d43b46a5387a64736f6c63430008140033" + }, + { + "contractName": "PolygonZkEVMBridge proxy", + "balance": "340282366920938463463374607431768211455", + "nonce": "1", + "address": "0x070E2b649520ec6a371faB37625dA9F070e3a615", + "bytecode": "0x60806040526004361061005d575f3560e01c80635c60da1b116100425780635c60da1b146100a65780638f283970146100e3578063f851a440146101025761006c565b80633659cfe6146100745780634f1ef286146100935761006c565b3661006c5761006a610116565b005b61006a610116565b34801561007f575f80fd5b5061006a61008e366004610854565b610130565b61006a6100a136600461086d565b610178565b3480156100b1575f80fd5b506100ba6101eb565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee575f80fd5b5061006a6100fd366004610854565b610228565b34801561010d575f80fd5b506100ba610255565b61011e610282565b61012e610129610359565b610362565b565b610138610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d8160405180602001604052805f8152505f6103bf565b50565b61016d610116565b610180610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101e3576101de8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250600192506103bf915050565b505050565b6101de610116565b5f6101f4610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610359565b905090565b610225610116565b90565b610230610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d816103e9565b5f61025e610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610380565b61028a610380565b73ffffffffffffffffffffffffffffffffffffffff16330361012e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b5f61021861044a565b365f80375f80365f845af43d5f803e80801561037c573d5ff35b3d5ffd5b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b6103c883610471565b5f825111806103d45750805b156101de576103e383836104bd565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f610412610380565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a161016d816104e9565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103a3565b61047a816105f5565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606104e28383604051806060016040528060278152602001610977602791396106c0565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811661058c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610350565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b73ffffffffffffffffffffffffffffffffffffffff81163b610699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610350565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105af565b60605f808573ffffffffffffffffffffffffffffffffffffffff16856040516106e9919061090b565b5f60405180830381855af49150503d805f8114610721576040519150601f19603f3d011682016040523d82523d5f602084013e610726565b606091505b509150915061073786838387610741565b9695505050505050565b606083156107d65782515f036107cf5773ffffffffffffffffffffffffffffffffffffffff85163b6107cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610350565b50816107e0565b6107e083836107e8565b949350505050565b8151156107f85781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103509190610926565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f575f80fd5b919050565b5f60208284031215610864575f80fd5b6104e28261082c565b5f805f6040848603121561087f575f80fd5b6108888461082c565b9250602084013567ffffffffffffffff808211156108a4575f80fd5b818601915086601f8301126108b7575f80fd5b8135818111156108c5575f80fd5b8760208285010111156108d6575f80fd5b6020830194508093505050509250925092565b5f5b838110156109035781810151838201526020016108eb565b50505f910152565b5f825161091c8184602087016108e9565b9190910192915050565b602081525f82518060208401526109448160408501602087016108e9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212202ac98acbfbb3d3ac1b74050e18c4e76db25a3ff2801ec69bf85d0c61414d502b64736f6c63430008140033", + "storage": { + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000fadb60b5059e31614e02083ff6c021a24c31c891", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x000000000000000000000000652f0520e67542a9612e8c86b917228a40180383" + } + }, + { + "contractName": "PolygonZkEVMGlobalExitRootL2 implementation", + "balance": "0", + "nonce": "1", + "address": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9", + "bytecode": "0x608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301fd90441461004e578063257b36321461006a57806333d6247d14610089578063a3c573eb1461009e575b5f80fd5b61005760015481565b6040519081526020015b60405180910390f35b61005761007836600461015e565b5f6020819052908152604090205481565b61009c61009736600461015e565b6100ea565b005b6100c57f000000000000000000000000070e2b649520ec6a371fab37625da9f070e3a61581565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610061565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000070e2b649520ec6a371fab37625da9f070e3a6151614610159576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b5f6020828403121561016e575f80fd5b503591905056fea26469706673582212205108c6c4f924146b736832a1bdf696e20d900450207b7452462368d150f2c71c64736f6c63430008140033" + }, + { + "contractName": "PolygonZkEVMGlobalExitRootL2 proxy", + "balance": "0", + "nonce": "1", + "address": "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa", + "bytecode": "0x60806040523661001357610011610017565b005b6100115b61001f6101b7565b6001600160a01b0316336001600160a01b0316141561016f5760606001600160e01b031960003516631b2ce7f360e11b8114156100655761005e6101ea565b9150610167565b6001600160e01b0319811663278f794360e11b14156100865761005e610241565b6001600160e01b031981166308f2839760e41b14156100a75761005e610287565b6001600160e01b031981166303e1469160e61b14156100c85761005e6102b8565b6001600160e01b03198116635c60da1b60e01b14156100e95761005e6102f8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b61017761030c565b565b606061019e83836040518060600160405280602781526020016108576027913961031c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101f4610394565b600061020336600481846106a2565b81019061021091906106e8565b905061022d8160405180602001604052806000815250600061039f565b505060408051602081019091526000815290565b606060008061025336600481846106a2565b8101906102609190610719565b915091506102708282600161039f565b604051806020016040528060008152509250505090565b6060610291610394565b60006102a036600481846106a2565b8101906102ad91906106e8565b905061022d816103cb565b60606102c2610394565b60006102cc6101b7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b6060610302610394565b60006102cc610422565b610177610317610422565b610431565b6060600080856001600160a01b0316856040516103399190610807565b600060405180830381855af49150503d8060008114610374576040519150601f19603f3d011682016040523d82523d6000602084013e610379565b606091505b509150915061038a86838387610455565b9695505050505050565b341561017757600080fd5b6103a8836104d3565b6000825111806103b55750805b156103c6576103c48383610179565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103f46101b7565b604080516001600160a01b03928316815291841660208301520160405180910390a161041f81610513565b50565b600061042c6105bc565b905090565b3660008037600080366000845af43d6000803e808015610450573d6000f35b3d6000fd5b606083156104c15782516104ba576001600160a01b0385163b6104ba5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161015e565b50816104cb565b6104cb83836105e4565b949350505050565b6104dc8161060e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105785760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161015e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101db565b8151156105f45781518083602001fd5b8060405162461bcd60e51b815260040161015e9190610823565b6001600160a01b0381163b61067b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161015e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61059b565b600080858511156106b257600080fd5b838611156106bf57600080fd5b5050820193919092039150565b80356001600160a01b03811681146106e357600080fd5b919050565b6000602082840312156106fa57600080fd5b61019e826106cc565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561072c57600080fd5b610735836106cc565b9150602083013567ffffffffffffffff8082111561075257600080fd5b818501915085601f83011261076657600080fd5b81358181111561077857610778610703565b604051601f8201601f19908116603f011681019083821181831017156107a0576107a0610703565b816040528281528860208487010111156107b957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107f65781810151838201526020016107de565b838111156103c45750506000910152565b600082516108198184602087016107db565b9190910192915050565b60208152600082518060208401526108428160408501602087016107db565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122012bb4f564f73959a03513dc74fc3c6e40e8386e6f02c16b78d6db00ce0aa16af64736f6c63430008090033", + "storage": { + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000fadb60b5059e31614e02083ff6c021a24c31c891", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9" + } + }, + { + "contractName": "PolygonZkEVMTimelock", + "balance": "0", + "nonce": "1", + "address": "0x0165878A594ca255338adfa4d48449f69242Eb8F", + "bytecode": "0x6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220d904e0b10230579952f8427a107aa4349f9a1f5799108d399b11e28b578463e464736f6c63430008140033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000e10", + "0xaedcc9e7897c0d335bdc5d92fe3a8b4f23727fe558cd1c19f332b28716a30559": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xf5e61edb9c9cc6bfbae4463e9a2b1dd6ac3b44ddef38f18016e56ba0363910d9": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x64494413541ff93b31aa309254e3fed72a7456e9845988b915b4c7a7ceba8814": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x60b9d94c75b7b3f721925089391e4644cd890cb5e6466f9596dfbd2c54e0b280": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x3412d5605ac6cd444957cedb533e5dacad6378b4bc819ebe3652188a665066d6": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x4b63b79f1e338a49559dcd3193ac9eecc50d0f275d24e97cc8c319e5a31a8bd0": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d706a": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x800d5dfe4bba53eedee06cd4546a27da8de00f12db83f56062976d4493fda899": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xc3ad33e20b0c56a223ad5104fff154aa010f8715b9c981fd38fdc60a4d1a52fc": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5" + } + }, + { + "accountName": "keyless Deployer", + "balance": "0", + "nonce": "1", + "address": "0x694AB5383a002a4796f95530c14Cf0C25ec3EA03" + }, + { + "accountName": "deployer", + "balance": "100000000000000000000000", + "nonce": "8", + "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + } + ] +} \ No newline at end of file From 717d062bf84d66dddbcb7b53bf0a91a8f202e56a Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 18 Dec 2023 15:10:43 +0100 Subject: [PATCH 113/230] update deployment scripts --- contracts/v2/PolygonRollupManager.sol | 45 ++++++++++--------- deployment/v1ToV2/3_deployContracts.ts | 12 +++-- .../v1ToV2/deploy_parameters_docker.json | 3 +- .../v2/create_rollup_parameters_docker.json | 2 +- .../scripts/v2/deploy_parameters_docker.json | 9 ---- test/contractsv2/PolygonRollupManager.test.ts | 2 +- .../PolygonRollupManagerUpgrade.test.ts | 2 + 7 files changed, 39 insertions(+), 36 deletions(-) diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index 9f6458742..cb336a7ff 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -110,12 +110,6 @@ contract PolygonRollupManager is // Exit merkle tree levels uint256 internal constant _EXIT_TREE_DEPTH = 32; - // L2 chain identifier - uint64 internal constant _ZKEVM_CHAINID = 1101; - - // zkEVM FORK ID - uint64 internal constant _ZKEVM_FORKID = 5; - // Roles // Be able to add a new rollup type @@ -258,7 +252,8 @@ contract PolygonRollupManager is uint64 forkID, address rollupAddress, uint64 chainID, - uint8 rollupCompatibilityID + uint8 rollupCompatibilityID, + uint64 lastVerifiedBatchBeforeUpgrade ); /** @@ -381,6 +376,8 @@ contract PolygonRollupManager is * @param emergencyCouncil Emergency council address * @param polygonZkEVM New deployed Polygon zkEVM which will be initialized wiht previous values * @param zkEVMVerifier Verifier of the new zkEVM deployed + * @param zkEVMForkID Fork id of the new zkEVM deployed + * @param zkEVMChainID Chain id of the new zkEVM deployed */ function initialize( address trustedAggregator, @@ -390,7 +387,9 @@ contract PolygonRollupManager is address timelock, address emergencyCouncil, PolygonZkEVMV2Existent polygonZkEVM, - IVerifierRollup zkEVMVerifier + IVerifierRollup zkEVMVerifier, + uint64 zkEVMForkID, + uint64 zkEVMChainID ) external reinitializer(2) { pendingStateTimeout = _pendingStateTimeout; trustedAggregatorTimeout = _trustedAggregatorTimeout; @@ -433,21 +432,23 @@ contract PolygonRollupManager is _setupRole(_EMERGENCY_COUNCIL_ROLE, emergencyCouncil); _setupRole(_EMERGENCY_COUNCIL_ADMIN, emergencyCouncil); - // Initialize current zkEVM - RollupData storage currentZkEVM = _addExistingRollup( - IPolygonRollupBase(polygonZkEVM), - zkEVMVerifier, - _ZKEVM_FORKID, - _ZKEVM_CHAINID, - 0 // Rollup compatibility ID is 0 - ); - + // Check last verified batch uint64 zkEVMLastBatchSequenced = _legacylastBatchSequenced; uint64 zkEVMLastVerifiedBatch = _legacyLastVerifiedBatch; if (zkEVMLastBatchSequenced != zkEVMLastVerifiedBatch) { revert AllzkEVMSequencedBatchesMustBeVerified(); } + // Initialize current zkEVM + RollupData storage currentZkEVM = _addExistingRollup( + IPolygonRollupBase(polygonZkEVM), + zkEVMVerifier, + zkEVMForkID, + zkEVMChainID, + 0, // Rollup compatibility ID is 0 + _legacyLastVerifiedBatch + ); + // Copy variables from legacy currentZkEVM.batchNumToStateRoot[ zkEVMLastVerifiedBatch @@ -652,7 +653,8 @@ contract PolygonRollupManager is verifier, forkID, chainID, - rollupCompatibilityID + rollupCompatibilityID, + 0 // last verified batch it's always 0 ); rollup.batchNumToStateRoot[0] = genesis; } @@ -665,13 +667,15 @@ contract PolygonRollupManager is * @param forkID Fork id of the added rollup * @param chainID Chain id of the added rollup * @param rollupCompatibilityID Compatibility ID for the added rollup + * @param lastVerifiedBatch Last verified batch before adding the rollup */ function _addExistingRollup( IPolygonRollupBase rollupAddress, IVerifierRollup verifier, uint64 forkID, uint64 chainID, - uint8 rollupCompatibilityID + uint8 rollupCompatibilityID, + uint64 lastVerifiedBatch ) internal returns (RollupData storage rollup) { uint32 rollupID = ++rollupCount; @@ -694,7 +698,8 @@ contract PolygonRollupManager is forkID, address(rollupAddress), chainID, - rollupCompatibilityID + rollupCompatibilityID, + lastVerifiedBatch ); } diff --git a/deployment/v1ToV2/3_deployContracts.ts b/deployment/v1ToV2/3_deployContracts.ts index 0031ce480..a48869724 100644 --- a/deployment/v1ToV2/3_deployContracts.ts +++ b/deployment/v1ToV2/3_deployContracts.ts @@ -88,7 +88,8 @@ async function main() { "trustedSequencer", "chainID", "adminZkEVM", - "forkID", + "oldForkID", + "newForkID", "version", ]; @@ -116,7 +117,8 @@ async function main() { trustedSequencer, chainID, adminZkEVM, - forkID, + oldForkID, + newForkID, version, } = deployParameters; @@ -443,7 +445,7 @@ async function main() { console.log("genesisRoot:", genesis.root); console.log("trustedSequencerURL:", trustedSequencerURL); console.log("networkName:", networkName); - console.log("forkID:", forkID); + console.log("forkID:", oldForkID); console.log("emergencyCouncilAddress:", emergencyCouncilAddress); const PolygonZkEVMFactory = await ethers.getContractFactory("PolygonZkEVM", deployer); @@ -476,7 +478,7 @@ async function main() { verifierContract.target, polygonZkEVMBridgeContract.target, chainID, - forkID, + oldForkID, ], unsafeAllow: ["constructor", "state-variable-immutable"], } @@ -627,6 +629,8 @@ async function main() { emergencyCouncilAddress, newPolygonZkEVMContract.target, verifierContract.target, + newForkID, + chainID, ], }, }); diff --git a/docker/scripts/v1ToV2/deploy_parameters_docker.json b/docker/scripts/v1ToV2/deploy_parameters_docker.json index 5697169cd..d10c1c98a 100644 --- a/docker/scripts/v1ToV2/deploy_parameters_docker.json +++ b/docker/scripts/v1ToV2/deploy_parameters_docker.json @@ -16,7 +16,8 @@ "trustedSequencer": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "chainID": 1001, "adminZkEVM": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "forkID": 5, + "oldForkID": 6, + "newForkID": 7, "consensusContract": "PolygonZkEVMEtrog", "polTokenAddress": "", "zkEVMDeployerAddress": "", diff --git a/docker/scripts/v2/create_rollup_parameters_docker.json b/docker/scripts/v2/create_rollup_parameters_docker.json index 479c0f2c4..b1105411a 100644 --- a/docker/scripts/v2/create_rollup_parameters_docker.json +++ b/docker/scripts/v2/create_rollup_parameters_docker.json @@ -6,7 +6,7 @@ "trustedSequencer": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "chainID": 1001, "adminZkEVM": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "forkID": 5, + "forkID": 7, "consensusContract": "PolygonZkEVMEtrog", "gasTokenAddress":"", "deployerPvtKey": "", diff --git a/docker/scripts/v2/deploy_parameters_docker.json b/docker/scripts/v2/deploy_parameters_docker.json index 3ec40a7c6..982a581da 100644 --- a/docker/scripts/v2/deploy_parameters_docker.json +++ b/docker/scripts/v2/deploy_parameters_docker.json @@ -8,15 +8,6 @@ "trustedAggregatorTimeout": 604799, "pendingStateTimeout": 604799, "emergencyCouncilAddress": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "realVerifier": false, - "trustedSequencerURL": "http://zkevm-json-rpc:8123", - "networkName": "zkevm", - "description": "0.0.1", - "trustedSequencer": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "chainID": 1001, - "adminZkEVM": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "forkID": 5, - "consensusContract": "PolygonZkEVMEtrog", "polTokenAddress": "", "zkEVMDeployerAddress": "", "gasTokenAddress": "", diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index 70effd826..784defe9f 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -3416,7 +3416,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { ) ) .to.emit(rollupManagerContract, "AddExistingRollup") - .withArgs(RollupID, forkID, PolygonZKEVMV2Contract.target, chainID, rollupCompatibilityID); + .withArgs(RollupID, forkID, PolygonZKEVMV2Contract.target, chainID, rollupCompatibilityID, 0); await expect( rollupManagerContract diff --git a/test/contractsv2/PolygonRollupManagerUpgrade.test.ts b/test/contractsv2/PolygonRollupManagerUpgrade.test.ts index 31660ae56..0cadad609 100644 --- a/test/contractsv2/PolygonRollupManagerUpgrade.test.ts +++ b/test/contractsv2/PolygonRollupManagerUpgrade.test.ts @@ -232,6 +232,8 @@ describe("Polygon ZK-EVM TestnetV2", () => { emergencyCouncil.address, newPolygonZkEVMContract.target, verifierContract.target, + forkID, + chainID, ], }, }); From e6fcfdc7efe1f0ec3dfda65bc28712859e9bac47 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 18 Dec 2023 15:41:08 +0100 Subject: [PATCH 114/230] update paris contracts --- .../paris/PolygonDataComittee.json | 35 +++++++++++++++---- .../paris/PolygonRollupManager.json | 20 +++++++++-- .../paris/PolygonRollupManagerMock.json | 20 +++++++++-- .../PolygonRollupManagerMockInternalTest.json | 20 +++++++++-- .../paris/PolygonZkEVMBridgeV2.json | 4 +-- compiled-contracts/paris/PolygonZkEVMV2.json | 4 +-- .../paris/PolygonZkEVMV2Existent.json | 4 +-- 7 files changed, 88 insertions(+), 19 deletions(-) diff --git a/compiled-contracts/paris/PolygonDataComittee.json b/compiled-contracts/paris/PolygonDataComittee.json index 1a9dc0614..957a8f12f 100644 --- a/compiled-contracts/paris/PolygonDataComittee.json +++ b/compiled-contracts/paris/PolygonDataComittee.json @@ -24,11 +24,6 @@ "internalType": "contract PolygonRollupManager", "name": "_rollupManager", "type": "address" - }, - { - "internalType": "contract ICDKDataCommittee", - "name": "_dataCommittee", - "type": "address" } ], "stateMutability": "nonpayable", @@ -383,6 +378,19 @@ "name": "SequenceForceBatches", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newDataCommittee", + "type": "address" + } + ], + "name": "SetDataCommittee", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -1117,6 +1125,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "contract ICDKDataCommittee", + "name": "newDataCommittee", + "type": "address" + } + ], + "name": "setDataCommittee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -1203,8 +1224,8 @@ "type": "function" } ], - "bytecode": "0x6101206040523480156200001257600080fd5b50604051620053da380380620053da833981016040819052620000359162000078565b6001600160a01b0394851660a05292841660805290831660c052821660e0521661010052620000f8565b6001600160a01b03811681146200007557600080fd5b50565b600080600080600060a086880312156200009157600080fd5b85516200009e816200005f565b6020870151909550620000b1816200005f565b6040870151909450620000c4816200005f565b6060870151909350620000d7816200005f565b6080870151909250620000ea816200005f565b809150509295509295909350565b60805160a05160c05160e051610100516151d262000208600039600081816105ee01526122cb01526000818161054601528181610a3d01528181610baa01528181610f50015281816115090152818161238d01528181612456015281816124780152818161260f01528181612b2701528181612bf501528181612ce201528181613661015281816136e201528181613704015261382e0152600081816106e6015281816111aa015281816118d8015281816119e001528181612550015261376f0152600081816107c50152818161135f0152818161203e01528181612e2d015261338401526000818161080a015281816108d5015281816123e0015281816125260152612e0101526151d26000f3fe608060405234801561001057600080fd5b50600436106103145760003560e01c80636e05d2cd116101a7578063c754c7ed116100ee578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b1461084c578063f35dda471461085f578063f851a4401461086757600080fd5b8063d8d1091b146107f2578063e46761c414610805578063e7a7ed021461082c57600080fd5b8063cfa8ed47116100c8578063cfa8ed47146107a0578063d02103ca146107c0578063d7bc90ff146107e757600080fd5b8063c754c7ed14610755578063c7fffd4b14610785578063c89e42df1461078d57600080fd5b8063a3c573eb11610150578063ada8f9191161012a578063ada8f91914610723578063b0afe15414610736578063b81fcafd1461074257600080fd5b8063a3c573eb146106e1578063a652f26c14610708578063aa3587d31461071b57600080fd5b80637a5460c5116101815780637a5460c5146106825780638c3d7301146106be5780639e001877146106c657600080fd5b80636e05d2cd146106535780636ff512cc1461065c578063712570221461066f57600080fd5b806340b5de6c1161026b578063542028d5116102145780635ec91958116101ee5780635ec9195814610623578063676870d21461062b5780636b8616ce1461063357600080fd5b8063542028d5146105e157806356e29435146105e95780635e9145c91461061057600080fd5b80634c21fef3116102455780634c21fef3146105685780634e4877061461059257806352bdeb6d146105a557600080fd5b806340b5de6c146104c1578063456052671461051957806349b7b8021461054157600080fd5b806319d8ac61116102cd57806332c2d153116102a757806332c2d153146104495780633c351e101461045e5780633cbc795b1461048357600080fd5b806319d8ac61146103ba57806326782247146103e75780632b35b3ac1461042c57600080fd5b806305835f37116102fe57806305835f371461034f578063107bf28c1461039857806311e892d4146103a057600080fd5b8062d0295d146103195780630350896314610334575b600080fd5b61032161088d565b6040519081526020015b60405180910390f35b61033c602081565b60405161ffff909116815260200161032b565b61038b6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161032b91906141fd565b61038b6109ad565b6103a860f981565b60405160ff909116815260200161032b565b6007546103ce9067ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161032b565b6001546104079073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161032b565b6008546104399060ff1681565b604051901515815260200161032b565b61045c61045736600461425d565b610a3b565b005b60085461040790610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6008546104ac907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161032b565b6104e87fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161032b565b6007546103ce90700100000000000000000000000000000000900467ffffffffffffffff1681565b6104077f000000000000000000000000000000000000000000000000000000000000000081565b60085461043990790100000000000000000000000000000000000000000000000000900460ff1681565b61045c6105a036600461429f565b610b0a565b61038b6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61038b610d24565b6104077f000000000000000000000000000000000000000000000000000000000000000081565b61045c61061e366004614308565b610d31565b61045c610d9a565b61033c601f81565b61032161064136600461429f565b60066020526000908152604090205481565b61032160055481565b61045c61066a366004614354565b610e84565b61045c61067d3660046144c6565b610f4e565b61038b6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61045c611704565b61040773a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6104077f000000000000000000000000000000000000000000000000000000000000000081565b61038b610716366004614573565b6117d7565b61045c611bbc565b61045c610731366004614354565b611c8e565b6103216405ca1ab1e081565b61045c61075036600461462a565b611d58565b6007546103ce907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6103a860e481565b61045c61079b3660046146dc565b6126d8565b6002546104079073ffffffffffffffffffffffffffffffffffffffff1681565b6104077f000000000000000000000000000000000000000000000000000000000000000081565b610321635ca1ab1e81565b61045c610800366004614711565b61276b565b6104077f000000000000000000000000000000000000000000000000000000000000000081565b6007546103ce9068010000000000000000900467ffffffffffffffff1681565b61045c61085a366004614753565b612ca2565b6103a8601b81565b6000546104079062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561091c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610940919061479f565b60075490915060009061097f9067ffffffffffffffff7001000000000000000000000000000000008204811691680100000000000000009004166147e7565b67ffffffffffffffff1690508060000361099c5760009250505090565b6109a6818361480f565b9250505090565b600480546109ba9061484a565b80601f01602080910402602001604051908101604052809291908181526020018280546109e69061484a565b8015610a335780601f10610a0857610100808354040283529160200191610a33565b820191906000526020600020905b815481529060010190602001808311610a1657829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610aaa576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610afd91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610b61576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610ba8576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c37919061489d565b610ca05760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610ca0576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546109ba9061484a565b600854790100000000000000000000000000000000000000000000000000900460ff16610d8a576040517f821935b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d95838383613091565b505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610df1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615610e2e576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610edb576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610d19565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610fbd576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610fdd5750600054600160ff909116105b80610ff75750303b158015610ff7575060005460ff166001145b611088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156110e657600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff8516156112fb5761110d856138f5565b61111686613a05565b61111f87613b0c565b604051602001611131939291906148bf565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af11580156111f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121691906148f8565b915091508163ffffffff166000146112b357600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff8516021790556112f8565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b600854600090611348908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff16856117d7565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ec919061479f565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611567573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158b9190614932565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550886003908161161d919061499d565b50600461162a898261499d565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e60405161168a93929190614ab7565b60405180910390a150505050505080156116fb57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611755576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa60008760405160240161180b96959493929190614af6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff700000000000000000000000000000000000000000000000000000000179052835190915060609060000361195c5760f9601f83516118a09190614b59565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e4876040516020016119469796959493929190614b74565b6040516020818303038152906040529050611a60565b815161ffff1015611999576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96119a8602083614b59565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001611a4d9796959493929190614c57565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015611ac1573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611b39576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051600090611b7f9084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614d3a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611c13576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff81167901000000000000000000000000000000000000000000000000009182900460ff16159091021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f4190600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611ce5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610d19565b60025473ffffffffffffffffffffffffffffffffffffffff163314611da9576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836000819003611de5576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611e21576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156122115760008b8b83818110611e6a57611e6a614d96565b905060800201803603810190611e809190614dc5565b805160608201519192509067ffffffffffffffff1615611ffb5785611ea481614e1a565b96505060008183602001518460600151604051602001611efc93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114611f85576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015611fdb576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86166000908152600660205260408120556120f9565b6020820151158015906120c2575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af115801561209c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c0919061479f565b155b156120f9576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff16108061212c575042826040015167ffffffffffffffff16115b15612163576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061220990614e41565b915050611e4e565b5060075467ffffffffffffffff6801000000000000000090910481169084161115612268576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861617905560058290556040517fc7a823e000000000000000000000000000000000000000000000000000000000815285907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063c7a823e0906123199086908c908c90600401614ec2565b60006040518083038186803b15801561233157600080fd5b505afa158015612345573d6000803e3d6000fd5b505050508167ffffffffffffffff168467ffffffffffffffff161461245057600061237083866147e7565b905061238667ffffffffffffffff821683614ee5565b91506124077f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166123bf61088d565b6123c99190614ef8565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613bff565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b61254e337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612505919061479f565b61250f9190614ef8565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613cd3565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156125b657600080fd5b505af11580156125ca573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af115801561266e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126929190614932565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a2505050505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461272f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361273b828261499d565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610d1991906141fd565b60085460ff166127a7576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036127e3576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561281f576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff68010000000000000000820481169161285a918491700100000000000000000000000000000000900416614f0f565b1115612892576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015612b215760008686838181106128d7576128d7614d96565b90506020028101906128e99190614f22565b6128f290614f60565b9050836128fe81614e1a565b825180516020918201208185015160408087015190519499509194506000936129609386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89166000908152600690935291205490915081146129e9576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055612a0e600188614ee5565b8403612a7d5742600760189054906101000a900467ffffffffffffffff168460400151612a3b9190614fde565b67ffffffffffffffff161115612a7d576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080612b1990614e41565b9150506128bb565b50612b4f7f0000000000000000000000000000000000000000000000000000000000000000846123bf61088d565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612c3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c629190614932565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612cde576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d6f919061479f565b905081811115612dab576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612de7576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e2973ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613cd3565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eba919061479f565b600780549192506801000000000000000090910467ffffffffffffffff16906008612ee483614e1a565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612f1b929190614fff565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff166000908152600690935291205532330361302b576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a261308a565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613081949392919061500f565b60405180910390a25b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146130e2576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600081900361311e576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561315a576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156135965760008989838181106131a3576131a3614d96565b90506020028101906131b5919061504f565b6131be90615083565b8051805160209091012060608201519192509067ffffffffffffffff161561334157856131ea81614e1a565b9650506000818360200151846060015160405160200161324293929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a166000908152600690935291205490915081146132cb576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015613321576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff861660009081526006602052604081205561347e565b602082015115801590613408575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af11580156133e2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613406919061479f565b155b1561343f576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c0101561347e576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806134b1575042826040015167ffffffffffffffff16115b156134e8576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061358e90614e41565b915050613187565b5060075467ffffffffffffffff68010000000000000000909104811690841611156135ed576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146136dc57600061364483866147e7565b905061365a67ffffffffffffffff821683614ee5565b91506136937f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166123bf61088d565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b61376d337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124e1573d6000803e3d6000fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156137d557600080fd5b505af11580156137e9573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af115801561388d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138b19190614932565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161397791906150f9565b600060405180830381855afa9150503d80600081146139b2576040519150601f19603f3d011682016040523d82523d6000602084013e6139b7565b606091505b5091509150816139fc576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250611bb4565b611bb481613d37565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691613a8791906150f9565b600060405180830381855afa9150503d8060008114613ac2576040519150601f19603f3d011682016040523d82523d6000602084013e613ac7565b606091505b5091509150816139fc576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250611bb4565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff861691613b8d91906150f9565b600060405180830381855afa9150503d8060008114613bc8576040519150601f19603f3d011682016040523d82523d6000602084013e613bcd565b606091505b5091509150818015613be0575080516020145b613beb576012611bb4565b80806020019051810190611bb4919061510b565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610d959084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613f12565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052613d319085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613c51565b50505050565b60606040825110613d5c5781806020019051810190613d56919061512e565b92915050565b8151602003613ed45760005b602081108015613daf5750828181518110613d8557613d85614d96565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613dc65780613dbe81614e41565b915050613d68565b80600003613e0957505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115613e2457613e24614383565b6040519080825280601f01601f191660200182016040528015613e4e576020820181803683370190505b50905060005b82811015613ecc57848181518110613e6e57613e6e614d96565b602001015160f81c60f81b828281518110613e8b57613e8b614d96565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080613ec481614e41565b915050613e54565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b6000613f74826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661401e9092919063ffffffff16565b805190915015610d955780806020019051810190613f92919061489d565b610d95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161107f565b6060611bb48484600085856000808673ffffffffffffffffffffffffffffffffffffffff16858760405161405291906150f9565b60006040518083038185875af1925050503d806000811461408f576040519150601f19603f3d011682016040523d82523d6000602084013e614094565b606091505b50915091506140a5878383876140b0565b979650505050505050565b6060831561414657825160000361413f5773ffffffffffffffffffffffffffffffffffffffff85163b61413f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161107f565b5081611bb4565b611bb4838381511561415b5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107f91906141fd565b60005b838110156141aa578181015183820152602001614192565b50506000910152565b600081518084526141cb81602086016020860161418f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061421060208301846141b3565b9392505050565b67ffffffffffffffff8116811461422d57600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461422d57600080fd5b8035613f0d81614230565b60008060006060848603121561427257600080fd5b833561427d81614217565b925060208401359150604084013561429481614230565b809150509250925092565b6000602082840312156142b157600080fd5b813561421081614217565b60008083601f8401126142ce57600080fd5b50813567ffffffffffffffff8111156142e657600080fd5b6020830191508360208260051b850101111561430157600080fd5b9250929050565b60008060006040848603121561431d57600080fd5b833567ffffffffffffffff81111561433457600080fd5b614340868287016142bc565b909450925050602084013561429481614230565b60006020828403121561436657600080fd5b813561421081614230565b63ffffffff8116811461422d57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516080810167ffffffffffffffff811182821017156143d5576143d5614383565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561442257614422614383565b604052919050565b600067ffffffffffffffff82111561444457614444614383565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261448157600080fd5b813561449461448f8261442a565b6143db565b8181528460208386010111156144a957600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c087890312156144df57600080fd5b86356144ea81614230565b955060208701356144fa81614230565b9450604087013561450a81614371565b9350606087013561451a81614230565b9250608087013567ffffffffffffffff8082111561453757600080fd5b6145438a838b01614470565b935060a089013591508082111561455957600080fd5b5061456689828a01614470565b9150509295509295509295565b6000806000806080858703121561458957600080fd5b843561459481614371565b935060208501356145a481614230565b925060408501356145b481614371565b9150606085013567ffffffffffffffff8111156145d057600080fd5b6145dc87828801614470565b91505092959194509250565b60008083601f8401126145fa57600080fd5b50813567ffffffffffffffff81111561461257600080fd5b60208301915083602082850101111561430157600080fd5b60008060008060006060868803121561464257600080fd5b853567ffffffffffffffff8082111561465a57600080fd5b818801915088601f83011261466e57600080fd5b81358181111561467d57600080fd5b8960208260071b850101111561469257600080fd5b602083019750809650506146a860208901614252565b945060408801359150808211156146be57600080fd5b506146cb888289016145e8565b969995985093965092949392505050565b6000602082840312156146ee57600080fd5b813567ffffffffffffffff81111561470557600080fd5b611bb484828501614470565b6000806020838503121561472457600080fd5b823567ffffffffffffffff81111561473b57600080fd5b614747858286016142bc565b90969095509350505050565b60008060006040848603121561476857600080fd5b833567ffffffffffffffff81111561477f57600080fd5b61478b868287016145e8565b909790965060209590950135949350505050565b6000602082840312156147b157600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115614808576148086147b8565b5092915050565b600082614845577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061485e57607f821691505b602082108103614897577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000602082840312156148af57600080fd5b8151801515811461421057600080fd5b6060815260006148d260608301866141b3565b82810360208401526148e481866141b3565b91505060ff83166040830152949350505050565b6000806040838503121561490b57600080fd5b825161491681614371565b602084015190925061492781614230565b809150509250929050565b60006020828403121561494457600080fd5b815161421081614217565b601f821115610d9557600081815260208120601f850160051c810160208610156149765750805b601f850160051c820191505b8181101561499557828155600101614982565b505050505050565b815167ffffffffffffffff8111156149b7576149b7614383565b6149cb816149c5845461484a565b8461494f565b602080601f831160018114614a1e57600084156149e85750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555614995565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015614a6b57888601518255948401946001909101908401614a4c565b5085821015614aa757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081526000614aca60608301866141b3565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152614b4d60c08301846141b3565b98975050505050505050565b61ffff818116838216019080821115614808576148086147b8565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614bdd816003860160208c0161418f565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614c20816017840160208b0161418f565b808201915050818660f81b16601782015284519150614c4682601883016020880161418f565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614cc0816003860160208c0161418f565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614d03816017840160208b0161418f565b808201915050818660f01b16601782015284519150614d2982601983016020880161418f565b016019019998505050505050505050565b60008651614d4c818460208b0161418f565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060808284031215614dd757600080fd5b614ddf6143b2565b82358152602083013560208201526040830135614dfb81614217565b60408201526060830135614e0e81614217565b60608201529392505050565b600067ffffffffffffffff808316818103614e3757614e376147b8565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e7257614e726147b8565b5060010190565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201526000614edc604083018486614e79565b95945050505050565b81810381811115613d5657613d566147b8565b8082028115828204841417613d5657613d566147b8565b80820180821115613d5657613d566147b8565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112614f5657600080fd5b9190910192915050565b600060608236031215614f7257600080fd5b6040516060810167ffffffffffffffff8282108183111715614f9657614f96614383565b816040528435915080821115614fab57600080fd5b50614fb836828601614470565b825250602083013560208201526040830135614fd381614217565b604082015292915050565b67ffffffffffffffff818116838216019080821115614808576148086147b8565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000615045606083018486614e79565b9695505050505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112614f5657600080fd5b60006080823603121561509557600080fd5b61509d6143b2565b823567ffffffffffffffff8111156150b457600080fd5b6150c036828601614470565b8252506020830135602082015260408301356150db81614217565b604082015260608301356150ee81614217565b606082015292915050565b60008251614f5681846020870161418f565b60006020828403121561511d57600080fd5b815160ff8116811461421057600080fd5b60006020828403121561514057600080fd5b815167ffffffffffffffff81111561515757600080fd5b8201601f8101841361516857600080fd5b805161517661448f8261442a565b81815285602083850101111561518b57600080fd5b614edc82602083016020860161418f56fea26469706673582212204dc04565b6e3d21f6916e9dd89d1e8fa91fdeee776dc3af2a63fe8c50301199d64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106103145760003560e01c80636e05d2cd116101a7578063c754c7ed116100ee578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b1461084c578063f35dda471461085f578063f851a4401461086757600080fd5b8063d8d1091b146107f2578063e46761c414610805578063e7a7ed021461082c57600080fd5b8063cfa8ed47116100c8578063cfa8ed47146107a0578063d02103ca146107c0578063d7bc90ff146107e757600080fd5b8063c754c7ed14610755578063c7fffd4b14610785578063c89e42df1461078d57600080fd5b8063a3c573eb11610150578063ada8f9191161012a578063ada8f91914610723578063b0afe15414610736578063b81fcafd1461074257600080fd5b8063a3c573eb146106e1578063a652f26c14610708578063aa3587d31461071b57600080fd5b80637a5460c5116101815780637a5460c5146106825780638c3d7301146106be5780639e001877146106c657600080fd5b80636e05d2cd146106535780636ff512cc1461065c578063712570221461066f57600080fd5b806340b5de6c1161026b578063542028d5116102145780635ec91958116101ee5780635ec9195814610623578063676870d21461062b5780636b8616ce1461063357600080fd5b8063542028d5146105e157806356e29435146105e95780635e9145c91461061057600080fd5b80634c21fef3116102455780634c21fef3146105685780634e4877061461059257806352bdeb6d146105a557600080fd5b806340b5de6c146104c1578063456052671461051957806349b7b8021461054157600080fd5b806319d8ac61116102cd57806332c2d153116102a757806332c2d153146104495780633c351e101461045e5780633cbc795b1461048357600080fd5b806319d8ac61146103ba57806326782247146103e75780632b35b3ac1461042c57600080fd5b806305835f37116102fe57806305835f371461034f578063107bf28c1461039857806311e892d4146103a057600080fd5b8062d0295d146103195780630350896314610334575b600080fd5b61032161088d565b6040519081526020015b60405180910390f35b61033c602081565b60405161ffff909116815260200161032b565b61038b6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161032b91906141fd565b61038b6109ad565b6103a860f981565b60405160ff909116815260200161032b565b6007546103ce9067ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161032b565b6001546104079073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161032b565b6008546104399060ff1681565b604051901515815260200161032b565b61045c61045736600461425d565b610a3b565b005b60085461040790610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6008546104ac907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161032b565b6104e87fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161032b565b6007546103ce90700100000000000000000000000000000000900467ffffffffffffffff1681565b6104077f000000000000000000000000000000000000000000000000000000000000000081565b60085461043990790100000000000000000000000000000000000000000000000000900460ff1681565b61045c6105a036600461429f565b610b0a565b61038b6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61038b610d24565b6104077f000000000000000000000000000000000000000000000000000000000000000081565b61045c61061e366004614308565b610d31565b61045c610d9a565b61033c601f81565b61032161064136600461429f565b60066020526000908152604090205481565b61032160055481565b61045c61066a366004614354565b610e84565b61045c61067d3660046144c6565b610f4e565b61038b6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61045c611704565b61040773a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6104077f000000000000000000000000000000000000000000000000000000000000000081565b61038b610716366004614573565b6117d7565b61045c611bbc565b61045c610731366004614354565b611c8e565b6103216405ca1ab1e081565b61045c61075036600461462a565b611d58565b6007546103ce907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6103a860e481565b61045c61079b3660046146dc565b6126d8565b6002546104079073ffffffffffffffffffffffffffffffffffffffff1681565b6104077f000000000000000000000000000000000000000000000000000000000000000081565b610321635ca1ab1e81565b61045c610800366004614711565b61276b565b6104077f000000000000000000000000000000000000000000000000000000000000000081565b6007546103ce9068010000000000000000900467ffffffffffffffff1681565b61045c61085a366004614753565b612ca2565b6103a8601b81565b6000546104079062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561091c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610940919061479f565b60075490915060009061097f9067ffffffffffffffff7001000000000000000000000000000000008204811691680100000000000000009004166147e7565b67ffffffffffffffff1690508060000361099c5760009250505090565b6109a6818361480f565b9250505090565b600480546109ba9061484a565b80601f01602080910402602001604051908101604052809291908181526020018280546109e69061484a565b8015610a335780601f10610a0857610100808354040283529160200191610a33565b820191906000526020600020905b815481529060010190602001808311610a1657829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610aaa576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610afd91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610b61576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610ba8576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c37919061489d565b610ca05760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610ca0576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546109ba9061484a565b600854790100000000000000000000000000000000000000000000000000900460ff16610d8a576040517f821935b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d95838383613091565b505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610df1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615610e2e576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610edb576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610d19565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610fbd576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610fdd5750600054600160ff909116105b80610ff75750303b158015610ff7575060005460ff166001145b611088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156110e657600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff8516156112fb5761110d856138f5565b61111686613a05565b61111f87613b0c565b604051602001611131939291906148bf565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af11580156111f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121691906148f8565b915091508163ffffffff166000146112b357600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff8516021790556112f8565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b600854600090611348908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff16856117d7565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ec919061479f565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611567573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158b9190614932565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550886003908161161d919061499d565b50600461162a898261499d565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e60405161168a93929190614ab7565b60405180910390a150505050505080156116fb57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611755576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa60008760405160240161180b96959493929190614af6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff700000000000000000000000000000000000000000000000000000000179052835190915060609060000361195c5760f9601f83516118a09190614b59565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e4876040516020016119469796959493929190614b74565b6040516020818303038152906040529050611a60565b815161ffff1015611999576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96119a8602083614b59565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001611a4d9796959493929190614c57565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015611ac1573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611b39576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051600090611b7f9084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614d3a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611c13576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff81167901000000000000000000000000000000000000000000000000009182900460ff16159091021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f4190600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611ce5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610d19565b60025473ffffffffffffffffffffffffffffffffffffffff163314611da9576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836000819003611de5576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611e21576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156122115760008b8b83818110611e6a57611e6a614d96565b905060800201803603810190611e809190614dc5565b805160608201519192509067ffffffffffffffff1615611ffb5785611ea481614e1a565b96505060008183602001518460600151604051602001611efc93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114611f85576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015611fdb576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86166000908152600660205260408120556120f9565b6020820151158015906120c2575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af115801561209c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c0919061479f565b155b156120f9576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff16108061212c575042826040015167ffffffffffffffff16115b15612163576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061220990614e41565b915050611e4e565b5060075467ffffffffffffffff6801000000000000000090910481169084161115612268576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861617905560058290556040517fc7a823e000000000000000000000000000000000000000000000000000000000815285907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063c7a823e0906123199086908c908c90600401614ec2565b60006040518083038186803b15801561233157600080fd5b505afa158015612345573d6000803e3d6000fd5b505050508167ffffffffffffffff168467ffffffffffffffff161461245057600061237083866147e7565b905061238667ffffffffffffffff821683614ee5565b91506124077f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166123bf61088d565b6123c99190614ef8565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613bff565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b61254e337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612505919061479f565b61250f9190614ef8565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613cd3565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156125b657600080fd5b505af11580156125ca573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af115801561266e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126929190614932565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a2505050505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461272f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361273b828261499d565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610d1991906141fd565b60085460ff166127a7576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036127e3576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561281f576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff68010000000000000000820481169161285a918491700100000000000000000000000000000000900416614f0f565b1115612892576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015612b215760008686838181106128d7576128d7614d96565b90506020028101906128e99190614f22565b6128f290614f60565b9050836128fe81614e1a565b825180516020918201208185015160408087015190519499509194506000936129609386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89166000908152600690935291205490915081146129e9576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055612a0e600188614ee5565b8403612a7d5742600760189054906101000a900467ffffffffffffffff168460400151612a3b9190614fde565b67ffffffffffffffff161115612a7d576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080612b1990614e41565b9150506128bb565b50612b4f7f0000000000000000000000000000000000000000000000000000000000000000846123bf61088d565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612c3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c629190614932565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612cde576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d6f919061479f565b905081811115612dab576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612de7576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e2973ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613cd3565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eba919061479f565b600780549192506801000000000000000090910467ffffffffffffffff16906008612ee483614e1a565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612f1b929190614fff565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff166000908152600690935291205532330361302b576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a261308a565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613081949392919061500f565b60405180910390a25b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146130e2576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600081900361311e576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561315a576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156135965760008989838181106131a3576131a3614d96565b90506020028101906131b5919061504f565b6131be90615083565b8051805160209091012060608201519192509067ffffffffffffffff161561334157856131ea81614e1a565b9650506000818360200151846060015160405160200161324293929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a166000908152600690935291205490915081146132cb576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015613321576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff861660009081526006602052604081205561347e565b602082015115801590613408575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af11580156133e2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613406919061479f565b155b1561343f576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c0101561347e576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806134b1575042826040015167ffffffffffffffff16115b156134e8576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061358e90614e41565b915050613187565b5060075467ffffffffffffffff68010000000000000000909104811690841611156135ed576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146136dc57600061364483866147e7565b905061365a67ffffffffffffffff821683614ee5565b91506136937f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166123bf61088d565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b61376d337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124e1573d6000803e3d6000fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156137d557600080fd5b505af11580156137e9573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af115801561388d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138b19190614932565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161397791906150f9565b600060405180830381855afa9150503d80600081146139b2576040519150601f19603f3d011682016040523d82523d6000602084013e6139b7565b606091505b5091509150816139fc576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250611bb4565b611bb481613d37565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691613a8791906150f9565b600060405180830381855afa9150503d8060008114613ac2576040519150601f19603f3d011682016040523d82523d6000602084013e613ac7565b606091505b5091509150816139fc576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250611bb4565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff861691613b8d91906150f9565b600060405180830381855afa9150503d8060008114613bc8576040519150601f19603f3d011682016040523d82523d6000602084013e613bcd565b606091505b5091509150818015613be0575080516020145b613beb576012611bb4565b80806020019051810190611bb4919061510b565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610d959084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613f12565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052613d319085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613c51565b50505050565b60606040825110613d5c5781806020019051810190613d56919061512e565b92915050565b8151602003613ed45760005b602081108015613daf5750828181518110613d8557613d85614d96565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613dc65780613dbe81614e41565b915050613d68565b80600003613e0957505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115613e2457613e24614383565b6040519080825280601f01601f191660200182016040528015613e4e576020820181803683370190505b50905060005b82811015613ecc57848181518110613e6e57613e6e614d96565b602001015160f81c60f81b828281518110613e8b57613e8b614d96565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080613ec481614e41565b915050613e54565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b6000613f74826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661401e9092919063ffffffff16565b805190915015610d955780806020019051810190613f92919061489d565b610d95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161107f565b6060611bb48484600085856000808673ffffffffffffffffffffffffffffffffffffffff16858760405161405291906150f9565b60006040518083038185875af1925050503d806000811461408f576040519150601f19603f3d011682016040523d82523d6000602084013e614094565b606091505b50915091506140a5878383876140b0565b979650505050505050565b6060831561414657825160000361413f5773ffffffffffffffffffffffffffffffffffffffff85163b61413f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161107f565b5081611bb4565b611bb4838381511561415b5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107f91906141fd565b60005b838110156141aa578181015183820152602001614192565b50506000910152565b600081518084526141cb81602086016020860161418f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061421060208301846141b3565b9392505050565b67ffffffffffffffff8116811461422d57600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461422d57600080fd5b8035613f0d81614230565b60008060006060848603121561427257600080fd5b833561427d81614217565b925060208401359150604084013561429481614230565b809150509250925092565b6000602082840312156142b157600080fd5b813561421081614217565b60008083601f8401126142ce57600080fd5b50813567ffffffffffffffff8111156142e657600080fd5b6020830191508360208260051b850101111561430157600080fd5b9250929050565b60008060006040848603121561431d57600080fd5b833567ffffffffffffffff81111561433457600080fd5b614340868287016142bc565b909450925050602084013561429481614230565b60006020828403121561436657600080fd5b813561421081614230565b63ffffffff8116811461422d57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516080810167ffffffffffffffff811182821017156143d5576143d5614383565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561442257614422614383565b604052919050565b600067ffffffffffffffff82111561444457614444614383565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261448157600080fd5b813561449461448f8261442a565b6143db565b8181528460208386010111156144a957600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c087890312156144df57600080fd5b86356144ea81614230565b955060208701356144fa81614230565b9450604087013561450a81614371565b9350606087013561451a81614230565b9250608087013567ffffffffffffffff8082111561453757600080fd5b6145438a838b01614470565b935060a089013591508082111561455957600080fd5b5061456689828a01614470565b9150509295509295509295565b6000806000806080858703121561458957600080fd5b843561459481614371565b935060208501356145a481614230565b925060408501356145b481614371565b9150606085013567ffffffffffffffff8111156145d057600080fd5b6145dc87828801614470565b91505092959194509250565b60008083601f8401126145fa57600080fd5b50813567ffffffffffffffff81111561461257600080fd5b60208301915083602082850101111561430157600080fd5b60008060008060006060868803121561464257600080fd5b853567ffffffffffffffff8082111561465a57600080fd5b818801915088601f83011261466e57600080fd5b81358181111561467d57600080fd5b8960208260071b850101111561469257600080fd5b602083019750809650506146a860208901614252565b945060408801359150808211156146be57600080fd5b506146cb888289016145e8565b969995985093965092949392505050565b6000602082840312156146ee57600080fd5b813567ffffffffffffffff81111561470557600080fd5b611bb484828501614470565b6000806020838503121561472457600080fd5b823567ffffffffffffffff81111561473b57600080fd5b614747858286016142bc565b90969095509350505050565b60008060006040848603121561476857600080fd5b833567ffffffffffffffff81111561477f57600080fd5b61478b868287016145e8565b909790965060209590950135949350505050565b6000602082840312156147b157600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115614808576148086147b8565b5092915050565b600082614845577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061485e57607f821691505b602082108103614897577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000602082840312156148af57600080fd5b8151801515811461421057600080fd5b6060815260006148d260608301866141b3565b82810360208401526148e481866141b3565b91505060ff83166040830152949350505050565b6000806040838503121561490b57600080fd5b825161491681614371565b602084015190925061492781614230565b809150509250929050565b60006020828403121561494457600080fd5b815161421081614217565b601f821115610d9557600081815260208120601f850160051c810160208610156149765750805b601f850160051c820191505b8181101561499557828155600101614982565b505050505050565b815167ffffffffffffffff8111156149b7576149b7614383565b6149cb816149c5845461484a565b8461494f565b602080601f831160018114614a1e57600084156149e85750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555614995565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015614a6b57888601518255948401946001909101908401614a4c565b5085821015614aa757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081526000614aca60608301866141b3565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152614b4d60c08301846141b3565b98975050505050505050565b61ffff818116838216019080821115614808576148086147b8565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614bdd816003860160208c0161418f565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614c20816017840160208b0161418f565b808201915050818660f81b16601782015284519150614c4682601883016020880161418f565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614cc0816003860160208c0161418f565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614d03816017840160208b0161418f565b808201915050818660f01b16601782015284519150614d2982601983016020880161418f565b016019019998505050505050505050565b60008651614d4c818460208b0161418f565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060808284031215614dd757600080fd5b614ddf6143b2565b82358152602083013560208201526040830135614dfb81614217565b60408201526060830135614e0e81614217565b60608201529392505050565b600067ffffffffffffffff808316818103614e3757614e376147b8565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e7257614e726147b8565b5060010190565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201526000614edc604083018486614e79565b95945050505050565b81810381811115613d5657613d566147b8565b8082028115828204841417613d5657613d566147b8565b80820180821115613d5657613d566147b8565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112614f5657600080fd5b9190910192915050565b600060608236031215614f7257600080fd5b6040516060810167ffffffffffffffff8282108183111715614f9657614f96614383565b816040528435915080821115614fab57600080fd5b50614fb836828601614470565b825250602083013560208201526040830135614fd381614217565b604082015292915050565b67ffffffffffffffff818116838216019080821115614808576148086147b8565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000615045606083018486614e79565b9695505050505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112614f5657600080fd5b60006080823603121561509557600080fd5b61509d6143b2565b823567ffffffffffffffff8111156150b457600080fd5b6150c036828601614470565b8252506020830135602082015260408301356150db81614217565b604082015260608301356150ee81614217565b606082015292915050565b60008251614f5681846020870161418f565b60006020828403121561511d57600080fd5b815160ff8116811461421057600080fd5b60006020828403121561514057600080fd5b815167ffffffffffffffff81111561515757600080fd5b8201601f8101841361516857600080fd5b805161517661448f8261442a565b81815285602083850101111561518b57600080fd5b614edc82602083016020860161418f56fea26469706673582212204dc04565b6e3d21f6916e9dd89d1e8fa91fdeee776dc3af2a63fe8c50301199d64736f6c63430008140033", + "bytecode": "0x6101006040523480156200001257600080fd5b506040516200545238038062005452833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e05161527b620001d76000396000818161055101528181610a4f01528181610bbc01528181610f5d01528181611516015281816123ae01528181612477015281816124990152818161263001528181612bd001528181612c9e01528181612d8b0152818161370a0152818161378b015281816137ad01526138d70152600081816106f8015281816111b7015281816119af01528181611ab70152818161257101526138180152600081816107d70152818161136c0152818161211001528181612ed6015261342d01526000818161081c015281816108e701528181612401015281816125470152612eaa015261527b6000f3fe608060405234801561001057600080fd5b506004361061031f5760003560e01c80636ff512cc116101a7578063c754c7ed116100ee578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b1461085e578063f35dda4714610871578063f851a4401461087957600080fd5b8063d8d1091b14610804578063e46761c414610817578063e7a7ed021461083e57600080fd5b8063cfa8ed47116100c8578063cfa8ed47146107b2578063d02103ca146107d2578063d7bc90ff146107f957600080fd5b8063c754c7ed14610767578063c7fffd4b14610797578063c89e42df1461079f57600080fd5b8063a3c573eb11610150578063ada8f9191161012a578063ada8f91914610735578063b0afe15414610748578063b81fcafd1461075457600080fd5b8063a3c573eb146106f3578063a652f26c1461071a578063aa3587d31461072d57600080fd5b80638c3d7301116101815780638c3d7301146106bd57806398cf4bd0146106c55780639e001877146106d857600080fd5b80636ff512cc1461065b578063712570221461066e5780637a5460c51461068157600080fd5b8063456052671161026b57806356e2943511610214578063676870d2116101ee578063676870d21461062a5780636b8616ce146106325780636e05d2cd1461065257600080fd5b806356e29435146105ef5780635e9145c91461060f5780635ec919581461062257600080fd5b80634e487706116102455780634e4877061461059857806352bdeb6d146105ab578063542028d5146105e757600080fd5b8063456052671461052457806349b7b8021461054c5780634c21fef31461057357600080fd5b806326782247116102cd5780633c351e10116102a75780633c351e10146104695780633cbc795b1461048e57806340b5de6c146104cc57600080fd5b806326782247146103f25780632b35b3ac1461043757806332c2d1531461045457600080fd5b8063107bf28c116102fe578063107bf28c146103a357806311e892d4146103ab57806319d8ac61146103c557600080fd5b8062d0295d14610324578063035089631461033f57806305835f371461035a575b600080fd5b61032c61089f565b6040519081526020015b60405180910390f35b610347602081565b60405161ffff9091168152602001610336565b6103966040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161033691906142a6565b6103966109bf565b6103b360f981565b60405160ff9091168152602001610336565b6007546103d99067ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610336565b6001546104129073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610336565b6008546104449060ff1681565b6040519015158152602001610336565b610467610462366004614306565b610a4d565b005b60085461041290610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6008546104b7907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610336565b6104f37fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff000000000000000000000000000000000000000000000000000000000000009091168152602001610336565b6007546103d990700100000000000000000000000000000000900467ffffffffffffffff1681565b6104127f000000000000000000000000000000000000000000000000000000000000000081565b6009546104449074010000000000000000000000000000000000000000900460ff1681565b6104676105a6366004614348565b610b1c565b6103966040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610396610d36565b6009546104129073ffffffffffffffffffffffffffffffffffffffff1681565b61046761061d3660046143b1565b610d43565b610467610da7565b610347601f81565b61032c610640366004614348565b60066020526000908152604090205481565b61032c60055481565b6104676106693660046143fd565b610e91565b61046761067c36600461456f565b610f5b565b6103966040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610467611711565b6104676106d33660046143fd565b6117e4565b61041273a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6104127f000000000000000000000000000000000000000000000000000000000000000081565b61039661072836600461461c565b6118ae565b610467611c93565b6104676107433660046143fd565b611d60565b61032c6405ca1ab1e081565b6104676107623660046146d3565b611e2a565b6007546103d9907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6103b360e481565b6104676107ad366004614785565b612781565b6002546104129073ffffffffffffffffffffffffffffffffffffffff1681565b6104127f000000000000000000000000000000000000000000000000000000000000000081565b61032c635ca1ab1e81565b6104676108123660046147ba565b612814565b6104127f000000000000000000000000000000000000000000000000000000000000000081565b6007546103d99068010000000000000000900467ffffffffffffffff1681565b61046761086c3660046147fc565b612d4b565b6103b3601b81565b6000546104129062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561092e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109529190614848565b6007549091506000906109919067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416614890565b67ffffffffffffffff169050806000036109ae5760009250505090565b6109b881836148b8565b9250505090565b600480546109cc906148f3565b80601f01602080910402602001604051908101604052809291908181526020018280546109f8906148f3565b8015610a455780601f10610a1a57610100808354040283529160200191610a45565b820191906000526020600020905b815481529060010190602001808311610a2857829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610abc576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610b0f91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610b73576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610bba576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c499190614946565b610cb25760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610cb2576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546109cc906148f3565b60095474010000000000000000000000000000000000000000900460ff16610d97576040517f821935b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610da283838361313a565b505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610dfe576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615610e3b576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ee8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610d2b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610fca576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610fea5750600054600160ff909116105b806110045750303b158015611004575060005460ff166001145b611095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156110f357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff8516156113085761111a8561399e565b61112386613aae565b61112c87613bb5565b60405160200161113e93929190614968565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af11580156111ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122391906149a1565b915091508163ffffffff166000146112c057600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff851602179055611305565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b600854600090611355908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff16856118ae565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f99190614848565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611574573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159891906149db565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550886003908161162a9190614a46565b5060046116378982614a46565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e60405161169793929190614b60565b60405180910390a1505050505050801561170857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611762576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461183b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f76d12ecc41da43ceb240d60fdd4d9fc0baae9793060e7b592abde7ece5ee965190602001610d2b565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa6000876040516024016118e296959493929190614b9f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff7000000000000000000000000000000000000000000000000000000001790528351909150606090600003611a335760f9601f83516119779190614c02565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611a1d9796959493929190614c1d565b6040516020818303038152906040529050611b37565b815161ffff1015611a70576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611a7f602083614c02565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001611b249796959493929190614d00565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015611b98573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611c10576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051600090611c569084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614de3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611cea576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600980547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff8116740100000000000000000000000000000000000000009182900460ff16159091021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f4190600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611db7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610d2b565b60025473ffffffffffffffffffffffffffffffffffffffff163314611e7b576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836000819003611eb7576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611ef3576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156122e35760008b8b83818110611f3c57611f3c614e3f565b905060800201803603810190611f529190614e6e565b805160608201519192509067ffffffffffffffff16156120cd5785611f7681614ec3565b96505060008183602001518460600151604051602001611fce93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114612057576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff1610156120ad576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86166000908152600660205260408120556121cb565b602082015115801590612194575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af115801561216e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121929190614848565b155b156121cb576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806121fe575042826040015167ffffffffffffffff16115b15612235576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519650505080806122db90614eea565b915050611f20565b5060075467ffffffffffffffff680100000000000000009091048116908416111561233a576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146124715760006123918386614890565b90506123a767ffffffffffffffff821683614f22565b91506124287f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166123e061089f565b6123ea9190614f35565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613ca8565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b61256f337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125269190614848565b6125309190614f35565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613d7c565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156125d757600080fd5b505af11580156125eb573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af115801561268f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b391906149db565b6009546040517fc7a823e000000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff169063c7a823e09061270e9087908d908d90600401614f95565b60006040518083038186803b15801561272657600080fd5b505afa15801561273a573d6000803e3d6000fd5b505060405167ffffffffffffffff841692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a2505050505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146127d8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036127e48282614a46565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610d2b91906142a6565b60085460ff16612850576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081900361288c576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156128c8576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612903918491700100000000000000000000000000000000900416614fb8565b111561293b576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015612bca57600086868381811061298057612980614e3f565b90506020028101906129929190614fcb565b61299b90615009565b9050836129a781614ec3565b82518051602091820120818501516040808701519051949950919450600093612a099386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612a92576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055612ab7600188614f22565b8403612b265742600760189054906101000a900467ffffffffffffffff168460400151612ae49190615087565b67ffffffffffffffff161115612b26576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080612bc290614eea565b915050612964565b50612bf87f0000000000000000000000000000000000000000000000000000000000000000846123e061089f565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612ce7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d0b91906149db565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612d87576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612df4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e189190614848565b905081811115612e54576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612e90576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ed273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613d7c565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f639190614848565b600780549192506801000000000000000090910467ffffffffffffffff16906008612f8d83614ec3565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612fc49291906150a8565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff16600090815260069093529120553233036130d4576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613133565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9318233888860405161312a94939291906150b8565b60405180910390a25b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461318b576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160008190036131c7576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115613203576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b8581101561363f57600089898381811061324c5761324c614e3f565b905060200281019061325e91906150f8565b6132679061512c565b8051805160209091012060608201519192509067ffffffffffffffff16156133ea578561329381614ec3565b965050600081836020015184606001516040516020016132eb93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114613374576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff1610156133ca576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055613527565b6020820151158015906134b1575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af115801561348b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134af9190614848565b155b156134e8576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015613527576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff16108061355a575042826040015167ffffffffffffffff16115b15613591576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061363790614eea565b915050613230565b5060075467ffffffffffffffff6801000000000000000090910481169084161115613696576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146137855760006136ed8386614890565b905061370367ffffffffffffffff821683614f22565b915061373c7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166123e061089f565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b613816337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612502573d6000803e3d6000fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561387e57600080fd5b505af1158015613892573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af1158015613936573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061395a91906149db565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691613a2091906151a2565b600060405180830381855afa9150503d8060008114613a5b576040519150601f19603f3d011682016040523d82523d6000602084013e613a60565b606091505b509150915081613aa5576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250611c8b565b611c8b81613de0565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691613b3091906151a2565b600060405180830381855afa9150503d8060008114613b6b576040519150601f19603f3d011682016040523d82523d6000602084013e613b70565b606091505b509150915081613aa5576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250611c8b565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff861691613c3691906151a2565b600060405180830381855afa9150503d8060008114613c71576040519150601f19603f3d011682016040523d82523d6000602084013e613c76565b606091505b5091509150818015613c89575080516020145b613c94576012611c8b565b80806020019051810190611c8b91906151b4565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610da29084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613fbb565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052613dda9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613cfa565b50505050565b60606040825110613e055781806020019051810190613dff91906151d7565b92915050565b8151602003613f7d5760005b602081108015613e585750828181518110613e2e57613e2e614e3f565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613e6f5780613e6781614eea565b915050613e11565b80600003613eb257505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115613ecd57613ecd61442c565b6040519080825280601f01601f191660200182016040528015613ef7576020820181803683370190505b50905060005b82811015613f7557848181518110613f1757613f17614e3f565b602001015160f81c60f81b828281518110613f3457613f34614e3f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080613f6d81614eea565b915050613efd565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b600061401d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166140c79092919063ffffffff16565b805190915015610da2578080602001905181019061403b9190614946565b610da2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161108c565b6060611c8b8484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516140fb91906151a2565b60006040518083038185875af1925050503d8060008114614138576040519150601f19603f3d011682016040523d82523d6000602084013e61413d565b606091505b509150915061414e87838387614159565b979650505050505050565b606083156141ef5782516000036141e85773ffffffffffffffffffffffffffffffffffffffff85163b6141e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161108c565b5081611c8b565b611c8b83838151156142045781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108c91906142a6565b60005b8381101561425357818101518382015260200161423b565b50506000910152565b60008151808452614274816020860160208601614238565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006142b9602083018461425c565b9392505050565b67ffffffffffffffff811681146142d657600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff811681146142d657600080fd5b8035613fb6816142d9565b60008060006060848603121561431b57600080fd5b8335614326816142c0565b925060208401359150604084013561433d816142d9565b809150509250925092565b60006020828403121561435a57600080fd5b81356142b9816142c0565b60008083601f84011261437757600080fd5b50813567ffffffffffffffff81111561438f57600080fd5b6020830191508360208260051b85010111156143aa57600080fd5b9250929050565b6000806000604084860312156143c657600080fd5b833567ffffffffffffffff8111156143dd57600080fd5b6143e986828701614365565b909450925050602084013561433d816142d9565b60006020828403121561440f57600080fd5b81356142b9816142d9565b63ffffffff811681146142d657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516080810167ffffffffffffffff8111828210171561447e5761447e61442c565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156144cb576144cb61442c565b604052919050565b600067ffffffffffffffff8211156144ed576144ed61442c565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261452a57600080fd5b813561453d614538826144d3565b614484565b81815284602083860101111561455257600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561458857600080fd5b8635614593816142d9565b955060208701356145a3816142d9565b945060408701356145b38161441a565b935060608701356145c3816142d9565b9250608087013567ffffffffffffffff808211156145e057600080fd5b6145ec8a838b01614519565b935060a089013591508082111561460257600080fd5b5061460f89828a01614519565b9150509295509295509295565b6000806000806080858703121561463257600080fd5b843561463d8161441a565b9350602085013561464d816142d9565b9250604085013561465d8161441a565b9150606085013567ffffffffffffffff81111561467957600080fd5b61468587828801614519565b91505092959194509250565b60008083601f8401126146a357600080fd5b50813567ffffffffffffffff8111156146bb57600080fd5b6020830191508360208285010111156143aa57600080fd5b6000806000806000606086880312156146eb57600080fd5b853567ffffffffffffffff8082111561470357600080fd5b818801915088601f83011261471757600080fd5b81358181111561472657600080fd5b8960208260071b850101111561473b57600080fd5b60208301975080965050614751602089016142fb565b9450604088013591508082111561476757600080fd5b5061477488828901614691565b969995985093965092949392505050565b60006020828403121561479757600080fd5b813567ffffffffffffffff8111156147ae57600080fd5b611c8b84828501614519565b600080602083850312156147cd57600080fd5b823567ffffffffffffffff8111156147e457600080fd5b6147f085828601614365565b90969095509350505050565b60008060006040848603121561481157600080fd5b833567ffffffffffffffff81111561482857600080fd5b61483486828701614691565b909790965060209590950135949350505050565b60006020828403121561485a57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8281168282160390808211156148b1576148b1614861565b5092915050565b6000826148ee577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061490757607f821691505b602082108103614940577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561495857600080fd5b815180151581146142b957600080fd5b60608152600061497b606083018661425c565b828103602084015261498d818661425c565b91505060ff83166040830152949350505050565b600080604083850312156149b457600080fd5b82516149bf8161441a565b60208401519092506149d0816142d9565b809150509250929050565b6000602082840312156149ed57600080fd5b81516142b9816142c0565b601f821115610da257600081815260208120601f850160051c81016020861015614a1f5750805b601f850160051c820191505b81811015614a3e57828155600101614a2b565b505050505050565b815167ffffffffffffffff811115614a6057614a6061442c565b614a7481614a6e84546148f3565b846149f8565b602080601f831160018114614ac75760008415614a915750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555614a3e565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015614b1457888601518255948401946001909101908401614af5565b5085821015614b5057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081526000614b73606083018661425c565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152614bf660c083018461425c565b98975050505050505050565b61ffff8181168382160190808211156148b1576148b1614861565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614c86816003860160208c01614238565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614cc9816017840160208b01614238565b808201915050818660f81b16601782015284519150614cef826018830160208801614238565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614d69816003860160208c01614238565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614dac816017840160208b01614238565b808201915050818660f01b16601782015284519150614dd2826019830160208801614238565b016019019998505050505050505050565b60008651614df5818460208b01614238565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060808284031215614e8057600080fd5b614e8861445b565b82358152602083013560208201526040830135614ea4816142c0565b60408201526060830135614eb7816142c0565b60608201529392505050565b600067ffffffffffffffff808316818103614ee057614ee0614861565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614f1b57614f1b614861565b5060010190565b81810381811115613dff57613dff614861565b8082028115828204841417613dff57613dff614861565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201526000614faf604083018486614f4c565b95945050505050565b80820180821115613dff57613dff614861565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112614fff57600080fd5b9190910192915050565b60006060823603121561501b57600080fd5b6040516060810167ffffffffffffffff828210818311171561503f5761503f61442c565b81604052843591508082111561505457600080fd5b5061506136828601614519565b82525060208301356020820152604083013561507c816142c0565b604082015292915050565b67ffffffffffffffff8181168382160190808211156148b1576148b1614861565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff841660208201526060604082015260006150ee606083018486614f4c565b9695505050505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112614fff57600080fd5b60006080823603121561513e57600080fd5b61514661445b565b823567ffffffffffffffff81111561515d57600080fd5b61516936828601614519565b825250602083013560208201526040830135615184816142c0565b60408201526060830135615197816142c0565b606082015292915050565b60008251614fff818460208701614238565b6000602082840312156151c657600080fd5b815160ff811681146142b957600080fd5b6000602082840312156151e957600080fd5b815167ffffffffffffffff81111561520057600080fd5b8201601f8101841361521157600080fd5b805161521f614538826144d3565b81815285602083850101111561523457600080fd5b614faf82602083016020860161423856fea264697066735822122069d10cd5028ca2695f6a141ce83a303d6713533f9ace319dca7d5b73d3fa334264736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061031f5760003560e01c80636ff512cc116101a7578063c754c7ed116100ee578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b1461085e578063f35dda4714610871578063f851a4401461087957600080fd5b8063d8d1091b14610804578063e46761c414610817578063e7a7ed021461083e57600080fd5b8063cfa8ed47116100c8578063cfa8ed47146107b2578063d02103ca146107d2578063d7bc90ff146107f957600080fd5b8063c754c7ed14610767578063c7fffd4b14610797578063c89e42df1461079f57600080fd5b8063a3c573eb11610150578063ada8f9191161012a578063ada8f91914610735578063b0afe15414610748578063b81fcafd1461075457600080fd5b8063a3c573eb146106f3578063a652f26c1461071a578063aa3587d31461072d57600080fd5b80638c3d7301116101815780638c3d7301146106bd57806398cf4bd0146106c55780639e001877146106d857600080fd5b80636ff512cc1461065b578063712570221461066e5780637a5460c51461068157600080fd5b8063456052671161026b57806356e2943511610214578063676870d2116101ee578063676870d21461062a5780636b8616ce146106325780636e05d2cd1461065257600080fd5b806356e29435146105ef5780635e9145c91461060f5780635ec919581461062257600080fd5b80634e487706116102455780634e4877061461059857806352bdeb6d146105ab578063542028d5146105e757600080fd5b8063456052671461052457806349b7b8021461054c5780634c21fef31461057357600080fd5b806326782247116102cd5780633c351e10116102a75780633c351e10146104695780633cbc795b1461048e57806340b5de6c146104cc57600080fd5b806326782247146103f25780632b35b3ac1461043757806332c2d1531461045457600080fd5b8063107bf28c116102fe578063107bf28c146103a357806311e892d4146103ab57806319d8ac61146103c557600080fd5b8062d0295d14610324578063035089631461033f57806305835f371461035a575b600080fd5b61032c61089f565b6040519081526020015b60405180910390f35b610347602081565b60405161ffff9091168152602001610336565b6103966040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161033691906142a6565b6103966109bf565b6103b360f981565b60405160ff9091168152602001610336565b6007546103d99067ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610336565b6001546104129073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610336565b6008546104449060ff1681565b6040519015158152602001610336565b610467610462366004614306565b610a4d565b005b60085461041290610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6008546104b7907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610336565b6104f37fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff000000000000000000000000000000000000000000000000000000000000009091168152602001610336565b6007546103d990700100000000000000000000000000000000900467ffffffffffffffff1681565b6104127f000000000000000000000000000000000000000000000000000000000000000081565b6009546104449074010000000000000000000000000000000000000000900460ff1681565b6104676105a6366004614348565b610b1c565b6103966040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610396610d36565b6009546104129073ffffffffffffffffffffffffffffffffffffffff1681565b61046761061d3660046143b1565b610d43565b610467610da7565b610347601f81565b61032c610640366004614348565b60066020526000908152604090205481565b61032c60055481565b6104676106693660046143fd565b610e91565b61046761067c36600461456f565b610f5b565b6103966040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610467611711565b6104676106d33660046143fd565b6117e4565b61041273a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6104127f000000000000000000000000000000000000000000000000000000000000000081565b61039661072836600461461c565b6118ae565b610467611c93565b6104676107433660046143fd565b611d60565b61032c6405ca1ab1e081565b6104676107623660046146d3565b611e2a565b6007546103d9907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6103b360e481565b6104676107ad366004614785565b612781565b6002546104129073ffffffffffffffffffffffffffffffffffffffff1681565b6104127f000000000000000000000000000000000000000000000000000000000000000081565b61032c635ca1ab1e81565b6104676108123660046147ba565b612814565b6104127f000000000000000000000000000000000000000000000000000000000000000081565b6007546103d99068010000000000000000900467ffffffffffffffff1681565b61046761086c3660046147fc565b612d4b565b6103b3601b81565b6000546104129062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561092e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109529190614848565b6007549091506000906109919067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416614890565b67ffffffffffffffff169050806000036109ae5760009250505090565b6109b881836148b8565b9250505090565b600480546109cc906148f3565b80601f01602080910402602001604051908101604052809291908181526020018280546109f8906148f3565b8015610a455780601f10610a1a57610100808354040283529160200191610a45565b820191906000526020600020905b815481529060010190602001808311610a2857829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610abc576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610b0f91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610b73576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610bba576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c499190614946565b610cb25760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610cb2576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546109cc906148f3565b60095474010000000000000000000000000000000000000000900460ff16610d97576040517f821935b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610da283838361313a565b505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610dfe576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615610e3b576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ee8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610d2b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610fca576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610fea5750600054600160ff909116105b806110045750303b158015611004575060005460ff166001145b611095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156110f357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff8516156113085761111a8561399e565b61112386613aae565b61112c87613bb5565b60405160200161113e93929190614968565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af11580156111ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122391906149a1565b915091508163ffffffff166000146112c057600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff851602179055611305565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b600854600090611355908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff16856118ae565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f99190614848565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611574573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159891906149db565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550886003908161162a9190614a46565b5060046116378982614a46565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e60405161169793929190614b60565b60405180910390a1505050505050801561170857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611762576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461183b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f76d12ecc41da43ceb240d60fdd4d9fc0baae9793060e7b592abde7ece5ee965190602001610d2b565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa6000876040516024016118e296959493929190614b9f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff7000000000000000000000000000000000000000000000000000000001790528351909150606090600003611a335760f9601f83516119779190614c02565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611a1d9796959493929190614c1d565b6040516020818303038152906040529050611b37565b815161ffff1015611a70576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611a7f602083614c02565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001611b249796959493929190614d00565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015611b98573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611c10576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051600090611c569084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614de3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611cea576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600980547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff8116740100000000000000000000000000000000000000009182900460ff16159091021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f4190600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611db7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610d2b565b60025473ffffffffffffffffffffffffffffffffffffffff163314611e7b576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836000819003611eb7576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611ef3576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156122e35760008b8b83818110611f3c57611f3c614e3f565b905060800201803603810190611f529190614e6e565b805160608201519192509067ffffffffffffffff16156120cd5785611f7681614ec3565b96505060008183602001518460600151604051602001611fce93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114612057576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff1610156120ad576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86166000908152600660205260408120556121cb565b602082015115801590612194575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af115801561216e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121929190614848565b155b156121cb576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806121fe575042826040015167ffffffffffffffff16115b15612235576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519650505080806122db90614eea565b915050611f20565b5060075467ffffffffffffffff680100000000000000009091048116908416111561233a576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146124715760006123918386614890565b90506123a767ffffffffffffffff821683614f22565b91506124287f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166123e061089f565b6123ea9190614f35565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613ca8565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b61256f337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125269190614848565b6125309190614f35565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613d7c565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156125d757600080fd5b505af11580156125eb573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af115801561268f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b391906149db565b6009546040517fc7a823e000000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff169063c7a823e09061270e9087908d908d90600401614f95565b60006040518083038186803b15801561272657600080fd5b505afa15801561273a573d6000803e3d6000fd5b505060405167ffffffffffffffff841692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a2505050505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146127d8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036127e48282614a46565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610d2b91906142a6565b60085460ff16612850576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081900361288c576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156128c8576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612903918491700100000000000000000000000000000000900416614fb8565b111561293b576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015612bca57600086868381811061298057612980614e3f565b90506020028101906129929190614fcb565b61299b90615009565b9050836129a781614ec3565b82518051602091820120818501516040808701519051949950919450600093612a099386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612a92576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055612ab7600188614f22565b8403612b265742600760189054906101000a900467ffffffffffffffff168460400151612ae49190615087565b67ffffffffffffffff161115612b26576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080612bc290614eea565b915050612964565b50612bf87f0000000000000000000000000000000000000000000000000000000000000000846123e061089f565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612ce7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d0b91906149db565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612d87576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612df4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e189190614848565b905081811115612e54576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612e90576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ed273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613d7c565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f639190614848565b600780549192506801000000000000000090910467ffffffffffffffff16906008612f8d83614ec3565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612fc49291906150a8565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff16600090815260069093529120553233036130d4576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613133565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9318233888860405161312a94939291906150b8565b60405180910390a25b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461318b576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160008190036131c7576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115613203576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b8581101561363f57600089898381811061324c5761324c614e3f565b905060200281019061325e91906150f8565b6132679061512c565b8051805160209091012060608201519192509067ffffffffffffffff16156133ea578561329381614ec3565b965050600081836020015184606001516040516020016132eb93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114613374576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff1610156133ca576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055613527565b6020820151158015906134b1575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af115801561348b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134af9190614848565b155b156134e8576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015613527576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff16108061355a575042826040015167ffffffffffffffff16115b15613591576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061363790614eea565b915050613230565b5060075467ffffffffffffffff6801000000000000000090910481169084161115613696576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146137855760006136ed8386614890565b905061370367ffffffffffffffff821683614f22565b915061373c7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166123e061089f565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b613816337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612502573d6000803e3d6000fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561387e57600080fd5b505af1158015613892573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af1158015613936573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061395a91906149db565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691613a2091906151a2565b600060405180830381855afa9150503d8060008114613a5b576040519150601f19603f3d011682016040523d82523d6000602084013e613a60565b606091505b509150915081613aa5576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250611c8b565b611c8b81613de0565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691613b3091906151a2565b600060405180830381855afa9150503d8060008114613b6b576040519150601f19603f3d011682016040523d82523d6000602084013e613b70565b606091505b509150915081613aa5576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250611c8b565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff861691613c3691906151a2565b600060405180830381855afa9150503d8060008114613c71576040519150601f19603f3d011682016040523d82523d6000602084013e613c76565b606091505b5091509150818015613c89575080516020145b613c94576012611c8b565b80806020019051810190611c8b91906151b4565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610da29084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613fbb565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052613dda9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613cfa565b50505050565b60606040825110613e055781806020019051810190613dff91906151d7565b92915050565b8151602003613f7d5760005b602081108015613e585750828181518110613e2e57613e2e614e3f565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613e6f5780613e6781614eea565b915050613e11565b80600003613eb257505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115613ecd57613ecd61442c565b6040519080825280601f01601f191660200182016040528015613ef7576020820181803683370190505b50905060005b82811015613f7557848181518110613f1757613f17614e3f565b602001015160f81c60f81b828281518110613f3457613f34614e3f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080613f6d81614eea565b915050613efd565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b600061401d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166140c79092919063ffffffff16565b805190915015610da2578080602001905181019061403b9190614946565b610da2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161108c565b6060611c8b8484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516140fb91906151a2565b60006040518083038185875af1925050503d8060008114614138576040519150601f19603f3d011682016040523d82523d6000602084013e61413d565b606091505b509150915061414e87838387614159565b979650505050505050565b606083156141ef5782516000036141e85773ffffffffffffffffffffffffffffffffffffffff85163b6141e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161108c565b5081611c8b565b611c8b83838151156142045781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108c91906142a6565b60005b8381101561425357818101518382015260200161423b565b50506000910152565b60008151808452614274816020860160208601614238565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006142b9602083018461425c565b9392505050565b67ffffffffffffffff811681146142d657600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff811681146142d657600080fd5b8035613fb6816142d9565b60008060006060848603121561431b57600080fd5b8335614326816142c0565b925060208401359150604084013561433d816142d9565b809150509250925092565b60006020828403121561435a57600080fd5b81356142b9816142c0565b60008083601f84011261437757600080fd5b50813567ffffffffffffffff81111561438f57600080fd5b6020830191508360208260051b85010111156143aa57600080fd5b9250929050565b6000806000604084860312156143c657600080fd5b833567ffffffffffffffff8111156143dd57600080fd5b6143e986828701614365565b909450925050602084013561433d816142d9565b60006020828403121561440f57600080fd5b81356142b9816142d9565b63ffffffff811681146142d657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516080810167ffffffffffffffff8111828210171561447e5761447e61442c565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156144cb576144cb61442c565b604052919050565b600067ffffffffffffffff8211156144ed576144ed61442c565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261452a57600080fd5b813561453d614538826144d3565b614484565b81815284602083860101111561455257600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561458857600080fd5b8635614593816142d9565b955060208701356145a3816142d9565b945060408701356145b38161441a565b935060608701356145c3816142d9565b9250608087013567ffffffffffffffff808211156145e057600080fd5b6145ec8a838b01614519565b935060a089013591508082111561460257600080fd5b5061460f89828a01614519565b9150509295509295509295565b6000806000806080858703121561463257600080fd5b843561463d8161441a565b9350602085013561464d816142d9565b9250604085013561465d8161441a565b9150606085013567ffffffffffffffff81111561467957600080fd5b61468587828801614519565b91505092959194509250565b60008083601f8401126146a357600080fd5b50813567ffffffffffffffff8111156146bb57600080fd5b6020830191508360208285010111156143aa57600080fd5b6000806000806000606086880312156146eb57600080fd5b853567ffffffffffffffff8082111561470357600080fd5b818801915088601f83011261471757600080fd5b81358181111561472657600080fd5b8960208260071b850101111561473b57600080fd5b60208301975080965050614751602089016142fb565b9450604088013591508082111561476757600080fd5b5061477488828901614691565b969995985093965092949392505050565b60006020828403121561479757600080fd5b813567ffffffffffffffff8111156147ae57600080fd5b611c8b84828501614519565b600080602083850312156147cd57600080fd5b823567ffffffffffffffff8111156147e457600080fd5b6147f085828601614365565b90969095509350505050565b60008060006040848603121561481157600080fd5b833567ffffffffffffffff81111561482857600080fd5b61483486828701614691565b909790965060209590950135949350505050565b60006020828403121561485a57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8281168282160390808211156148b1576148b1614861565b5092915050565b6000826148ee577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061490757607f821691505b602082108103614940577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561495857600080fd5b815180151581146142b957600080fd5b60608152600061497b606083018661425c565b828103602084015261498d818661425c565b91505060ff83166040830152949350505050565b600080604083850312156149b457600080fd5b82516149bf8161441a565b60208401519092506149d0816142d9565b809150509250929050565b6000602082840312156149ed57600080fd5b81516142b9816142c0565b601f821115610da257600081815260208120601f850160051c81016020861015614a1f5750805b601f850160051c820191505b81811015614a3e57828155600101614a2b565b505050505050565b815167ffffffffffffffff811115614a6057614a6061442c565b614a7481614a6e84546148f3565b846149f8565b602080601f831160018114614ac75760008415614a915750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555614a3e565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015614b1457888601518255948401946001909101908401614af5565b5085821015614b5057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081526000614b73606083018661425c565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152614bf660c083018461425c565b98975050505050505050565b61ffff8181168382160190808211156148b1576148b1614861565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614c86816003860160208c01614238565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614cc9816017840160208b01614238565b808201915050818660f81b16601782015284519150614cef826018830160208801614238565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614d69816003860160208c01614238565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614dac816017840160208b01614238565b808201915050818660f01b16601782015284519150614dd2826019830160208801614238565b016019019998505050505050505050565b60008651614df5818460208b01614238565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060808284031215614e8057600080fd5b614e8861445b565b82358152602083013560208201526040830135614ea4816142c0565b60408201526060830135614eb7816142c0565b60608201529392505050565b600067ffffffffffffffff808316818103614ee057614ee0614861565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614f1b57614f1b614861565b5060010190565b81810381811115613dff57613dff614861565b8082028115828204841417613dff57613dff614861565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201526000614faf604083018486614f4c565b95945050505050565b80820180821115613dff57613dff614861565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112614fff57600080fd5b9190910192915050565b60006060823603121561501b57600080fd5b6040516060810167ffffffffffffffff828210818311171561503f5761503f61442c565b81604052843591508082111561505457600080fd5b5061506136828601614519565b82525060208301356020820152604083013561507c816142c0565b604082015292915050565b67ffffffffffffffff8181168382160190808211156148b1576148b1614861565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff841660208201526060604082015260006150ee606083018486614f4c565b9695505050505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112614fff57600080fd5b60006080823603121561513e57600080fd5b61514661445b565b823567ffffffffffffffff81111561515d57600080fd5b61516936828601614519565b825250602083013560208201526040830135615184816142c0565b60408201526060830135615197816142c0565b606082015292915050565b60008251614fff818460208701614238565b6000602082840312156151c657600080fd5b815160ff811681146142b957600080fd5b6000602082840312156151e957600080fd5b815167ffffffffffffffff81111561520057600080fd5b8201601f8101841361521157600080fd5b805161521f614538826144d3565b81815285602083850101111561523457600080fd5b614faf82602083016020860161423856fea264697066735822122069d10cd5028ca2695f6a141ce83a303d6713533f9ace319dca7d5b73d3fa334264736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonRollupManager.json b/compiled-contracts/paris/PolygonRollupManager.json index f0aab1bd3..fadf806a4 100644 --- a/compiled-contracts/paris/PolygonRollupManager.json +++ b/compiled-contracts/paris/PolygonRollupManager.json @@ -236,6 +236,12 @@ "internalType": "uint8", "name": "rollupCompatibilityID", "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "lastVerifiedBatchBeforeUpgrade", + "type": "uint64" } ], "name": "AddExistingRollup", @@ -1266,6 +1272,16 @@ "internalType": "contract IVerifierRollup", "name": "zkEVMVerifier", "type": "address" + }, + { + "internalType": "uint64", + "name": "zkEVMForkID", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "zkEVMChainID", + "type": "uint64" } ], "name": "initialize", @@ -1931,8 +1947,8 @@ "type": "function" } ], - "bytecode": "0x60e06040523480156200001157600080fd5b5060405162005d7338038062005d7383398101604081905262000034916200006b565b6001600160a01b0392831660805290821660c0521660a052620000bf565b6001600160a01b03811681146200006857600080fd5b50565b6000806000606084860312156200008157600080fd5b83516200008e8162000052565b6020850151909350620000a18162000052565b6040850151909250620000b48162000052565b809150509250925092565b60805160a05160c051615c4c6200012760003960008181610a0f0152818161212801526137270152600081816107c701528181612cb00152613a2201526000818161096901528181610c6601528181610e1601528181611e6c01526139110152615c4c6000f3fe60806040523480156200001157600080fd5b5060043610620003095760003560e01c806387c20c01116200019d578063c4c928c211620000eb578063dbc16976116200009e578063dbc1697614620009cd578063dde0ff7714620009d7578063e0bfd3d214620009f2578063e46761c41462000a09578063f34eb8eb1462000a31578063f4e926751462000a48578063f9c4c2ae1462000a5957600080fd5b8063c4c928c21462000923578063ceee281d146200093a578063d02103ca1462000963578063d5073f6f146200098b578063d547741f14620009a2578063d939b31514620009b957600080fd5b8063a066215c1162000150578063a066215c1462000797578063a217fddf14620007ae578063a2967d9914620007b7578063a3c573eb14620007c1578063afd23cbe1462000802578063b99d0ad7146200082c578063c1acbc34146200090857600080fd5b806387c20c01146200071a5780638bd4f071146200073157806391d14854146200074857806399f5634e146200075f5780639a908e7314620007695780639c9f3dfe146200078057600080fd5b80632f2ff15d116200025b57806360469169116200020e5780636046916914620005c957806365c0504d14620005d35780637222020f1462000682578063727885e914620006995780637975fcfe14620006b05780637fb6e76a14620006d6578063841b24d714620006ff57600080fd5b80632f2ff15d146200052057806336568abe1462000537578063394218e9146200054e578063477fa27014620005655780634d4d3338146200056e57806355a71ee0146200058557600080fd5b806315064c9611620002c057806315064c9614620003c95780631608859c14620003d75780631796a1ae14620003ee5780631816b7e514620004155780632072f6c5146200042c578063248a9ca3146200043657806325280169146200046b57600080fd5b8063066ec012146200030e578063080b3111146200033f5780630a0d9fbe146200036757806311f6b287146200038257806312b86e1914620003995780631489ed1014620003b2575b600080fd5b60845462000322906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b6200035662000350366004620046c6565b62000b70565b604051901515815260200162000336565b6085546200032290600160401b90046001600160401b031681565b6200032262000393366004620046fe565b62000b9a565b620003b0620003aa3660046200472f565b62000bba565b005b620003b0620003c3366004620047dc565b62000d6a565b606f54620003569060ff1681565b620003b0620003e8366004620046c6565b62000f00565b607e54620003ff9063ffffffff1681565b60405163ffffffff909116815260200162000336565b620003b06200042636600462004866565b62000f95565b620003b062001041565b6200045c6200044736600462004893565b60009081526034602052604090206001015490565b60405190815260200162000336565b620004ec6200047c366004620046c6565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b0390811691830191909152928201519092169082015260600162000336565b620003b062000531366004620048ad565b620010d7565b620003b062000548366004620048ad565b62001100565b620003b06200055f366004620048e0565b6200113a565b6086546200045c565b620003b06200057f366004620048fe565b620011ee565b6200045c62000596366004620046c6565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b6200045c6200173b565b62000638620005e4366004620046fe565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c00162000336565b620003b062000693366004620046fe565b62001753565b620003b0620006aa36600462004a5e565b6200184f565b620006c7620006c136600462004b2b565b62001cc8565b60405162000336919062004be5565b620003ff620006e7366004620048e0565b60836020526000908152604090205463ffffffff1681565b6084546200032290600160c01b90046001600160401b031681565b620003b06200072b366004620047dc565b62001cfb565b620003b0620007423660046200472f565b62002025565b6200035662000759366004620048ad565b620020db565b6200045c62002106565b620003226200077a36600462004bfa565b620021ed565b620003b062000791366004620048e0565b620023bf565b620003b0620007a8366004620048e0565b62002465565b6200045c600081565b6200045c62002509565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200162000336565b6085546200081890600160801b900461ffff1681565b60405161ffff909116815260200162000336565b620008c26200083d366004620046c6565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b60405162000336919060006080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200032290600160801b90046001600160401b031681565b620003b06200093436600462004c27565b620028de565b620003ff6200094b36600462004cbf565b60826020526000908152604090205463ffffffff1681565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b620003b06200099c36600462004893565b62002bbd565b620003b0620009b3366004620048ad565b62002c59565b60855462000322906001600160401b031681565b620003b062002c82565b6084546200032290600160401b90046001600160401b031681565b620003b062000a0336600462004cf1565b62002d30565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b620003b062000a4236600462004d6d565b62002dc9565b608054620003ff9063ffffffff1681565b62000af062000a6a366004620046fe565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff166101608201526101800162000336565b63ffffffff8216600090815260816020526040812062000b91908362002fc5565b90505b92915050565b63ffffffff8116600090815260816020526040812062000b94906200300a565b60008051602062005bf783398151915262000bd5816200307b565b63ffffffff8916600090815260816020526040902062000bfc818a8a8a8a8a8a8a62003087565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000c64576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000c9d62002509565b6040518263ffffffff1660e01b815260040162000cbc91815260200190565b600060405180830381600087803b15801562000cd757600080fd5b505af115801562000cec573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005bf783398151915262000d85816200307b565b63ffffffff8916600090815260816020526040902062000dac818a8a8a8a8a8a8a62003420565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562000e14576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000e4d62002509565b6040518263ffffffff1660e01b815260040162000e6c91815260200190565b600060405180830381600087803b15801562000e8757600080fd5b505af115801562000e9c573d6000803e3d6000fd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff8216600090815260816020526040902062000f3060008051602062005bf783398151915233620020db565b62000f8457606f5460ff161562000f5a57604051630bc011ff60e21b815260040160405180910390fd5b62000f66818362002fc5565b62000f8457604051630674f25160e11b815260040160405180910390fd5b62000f9081836200382e565b505050565b60008051602062005bb783398151915262000fb0816200307b565b6103e88261ffff16108062000fca57506103ff8261ffff16115b1562000fe957604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200105c60008051602062005bd783398151915233620020db565b620010cb57608454600160801b90046001600160401b03161580620010ac57506084544290620010a19062093a8090600160801b90046001600160401b031662004e1a565b6001600160401b0316115b15620010cb5760405163692baaad60e11b815260040160405180910390fd5b620010d562003a20565b565b600082815260346020526040902060010154620010f4816200307b565b62000f90838362003a9f565b6001600160a01b03811633146200112a57604051630b4ad1cd60e31b815260040160405180910390fd5b62001136828262003b0b565b5050565b60008051602062005bb783398151915262001155816200307b565b606f5460ff1662001197576084546001600160401b03600160c01b909104811690831610620011975760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19060200162001035565b600054600290610100900460ff1615801562001211575060005460ff8083169116105b6200127a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b179055620012fb62003b75565b6200131660008051602062005bf78339815191528a62003be2565b6200132360008662003be2565b6200134f7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908662003be2565b6200137b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8662003be2565b620013a77f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8662003be2565b620013d37fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8762003be2565b620013ff7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088762003be2565b6200142b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48762003be2565b6200144660008051602062005bb78339815191528762003be2565b6200148160008051602062005bf78339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062003bee565b620014ad7f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08762003be2565b620014d97f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8762003be2565b6200151460008051602062005bd78339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162003bee565b6200152f60008051602062005bd78339815191528562003be2565b6200155b7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518562003be2565b6000620015708484600561044d600062003c39565b6073546074549192506001600160401b03600160401b90910481169116808214620015ae57604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b0381811660008181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620016b09695831695600160581b909104909216936076936077939192919091169060040162004ef0565b600060405180830381600087803b158015620016cb57600080fd5b505af1158015620016e0573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620017289050565b60405180910390a1505050505050505050565b600060865460646200174e919062004f55565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd6200177f816200307b565b63ffffffff821615806200179e5750607e5463ffffffff908116908316115b15620017bd57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200180457604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd086200187b816200307b565b63ffffffff881615806200189a5750607e5463ffffffff908116908916115b15620018b957604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff16151590036200190057604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff16156200193e576040516337c8fe0960e11b815260040160405180910390fd5b60808054600091908290620019599063ffffffff1662004f6f565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b03909216913091620019a7906200468b565b620019b59392919062004f95565b604051809103906000f080158015620019d2573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001c46949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001c86908d908d9088908e908e908e9060040162004fcc565b600060405180830381600087803b15801562001ca157600080fd5b505af115801562001cb6573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001cf090878787878762003e5e565b979650505050505050565b606f5460ff161562001d2057604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001d6f92600160c01b90048116911662004e1a565b6001600160401b0316111562001d9857604051638a0704d360e01b815260040160405180910390fd5b6103e862001da788886200502f565b6001600160401b0316111562001dd057604051635acfba9d60e11b815260040160405180910390fd5b62001de2818989898989898962003420565b62001dee818762003f9e565b6085546001600160401b031660000362001efc57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001e6a576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001ea362002509565b6040518263ffffffff1660e01b815260040162001ec291815260200190565b600060405180830381600087803b15801562001edd57600080fd5b505af115801562001ef2573d6000803e3d6000fd5b5050505062001fc6565b62001f07816200419b565b600681018054600160801b90046001600160401b031690601062001f2b8362005052565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff16156200204a57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff8816600090815260816020526040902062002071818989898989898962003087565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620020d062003a20565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b815230600482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562002170573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002196919062005071565b608454909150600090620021bd906001600160401b03600160401b8204811691166200502f565b6001600160401b0316905080600003620021da5760009250505090565b620021e68183620050a1565b9250505090565b606f5460009060ff16156200221557604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff16908190036200224d576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200227857604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620022ab9084906001600160401b031662004e1a565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620022e1878362004e1a565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b03199092169290931691909117179055905062002371836200419b565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b60008051602062005bb7833981519152620023da816200307b565b606f5460ff1662002415576085546001600160401b0390811690831610620024155760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759060200162001035565b60008051602062005bb783398151915262002480816200307b565b62015180826001600160401b03161115620024ae57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289060200162001035565b60805460009063ffffffff168082036200252557506000919050565b6000816001600160401b03811115620025425762002542620049b4565b6040519080825280602002602001820160405280156200256c578160200160208202803683370190505b50905060005b82811015620025df57608160006200258c836001620050b8565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620025bf57620025bf620050ce565b602090810291909101015280620025d681620050e4565b91505062002572565b50600060205b836001146200283b576000620025fd60028662005100565b6200260a600287620050a1565b620026169190620050b8565b90506000816001600160401b03811115620026355762002635620049b4565b6040519080825280602002602001820160405280156200265f578160200160208202803683370190505b50905060005b82811015620027e7576200267b60018462005117565b811480156200269657506200269260028862005100565b6001145b156200271e5785620026aa82600262004f55565b81518110620026bd57620026bd620050ce565b602002602001015185604051602001620026e1929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106200270c576200270c620050ce565b602002602001018181525050620027d2565b856200272c82600262004f55565b815181106200273f576200273f620050ce565b60200260200101518682600262002757919062004f55565b62002764906001620050b8565b81518110620027775762002777620050ce565b60200260200101516040516020016200279a929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620027c557620027c5620050ce565b6020026020010181815250505b80620027de81620050e4565b91505062002665565b5080945081955083846040516020016200280b929190918252602082015260400190565b604051602081830303815290604052805190602001209350828062002830906200512d565b9350505050620025e5565b600083600081518110620028535762002853620050ce565b6020026020010151905060005b82811015620028d457604080516020810184905290810185905260600160408051601f19818403018152828252805160209182012090830187905290820186905292506060016040516020818303038152906040528051906020012093508080620028cb90620050e4565b91505062002860565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac6200290a816200307b565b63ffffffff84161580620029295750607e5463ffffffff908116908516115b156200294857604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002989576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b031603620029d857604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002a1f57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002a5d57604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002add8462000b9a565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002b339216908b908b9060040162005147565b600060405180830381600087803b15801562002b4e57600080fd5b505af115801562002b63573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002be9816200307b565b683635c9adc5dea0000082118062002c045750633b9aca0082105b1562002c2357604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001035565b60008281526034602052604090206001015462002c76816200307b565b62000f90838362003b0b565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002cae816200307b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002d0a57600080fd5b505af115801562002d1f573d6000803e3d6000fd5b5050505062002d2d62004266565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62002d5c816200307b565b6001600160401b03841660009081526083602052604090205463ffffffff161562002d9a576040516337c8fe0960e11b815260040160405180910390fd5b600062002dab888888888762003c39565b60008080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002df5816200307b565b607e805460009190829062002e109063ffffffff1662004f6f565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002fb39695949392919062005187565b60405180910390a25050505050505050565b6085546001600160401b0382811660009081526004850160205260408120549092429262002ff892918116911662004e1a565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b0316156200305e575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002d2d8133620042bf565b60078801546000906001600160401b039081169087161015620030bd5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038816156200315e5760068901546001600160401b03600160801b90910481169089161115620031075760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200315757604051632bd2e3e760e01b815260040160405180910390fd5b50620031d3565b506001600160401b03851660009081526002890160205260409020548062003199576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620031d357604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b909104811690881611806200320c5750876001600160401b0316876001600160401b031611155b8062003230575060068901546001600160401b03600160c01b909104811690881611155b156200324f5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b900481169086161462003296576040516332a2a77f60e01b815260040160405180910390fd5b6000620032a88a888888868962003e5e565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620032df9190620051e0565b602060405180830381855afa158015620032fd573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003322919062005071565b6200332e919062005100565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200337291889190600401620051fe565b602060405180830381865afa15801562003390573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620033b691906200523b565b620033d4576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620034135760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b6000806200342e8a6200300a565b60078b01549091506001600160401b039081169089161015620034645760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620035075760068a01546001600160401b03600160801b9091048116908a161115620034ae5760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200350057604051632bd2e3e760e01b815260040160405180910390fd5b5062003577565b6001600160401b038816600090815260028b01602052604090205491508162003543576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200357757604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620035aa5760405163b9b18f5760e01b815260040160405180910390fd5b6000620035bc8b8a8a8a878b62003e5e565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620035f39190620051e0565b602060405180830381855afa15801562003611573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003636919062005071565b62003642919062005100565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200368691899190600401620051fe565b602060405180830381865afa158015620036a4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620036ca91906200523b565b620036e8576040516309bde33960e01b815260040160405180910390fd5b6000620036f6848b6200502f565b90506200374f87826001600160401b03166200371162002106565b6200371d919062004f55565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620042e9565b80608460088282829054906101000a90046001600160401b031662003775919062004e1a565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b1580156200380657600080fd5b505af11580156200381b573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b90910481169082161115806200386d575060068201546001600160401b03600160801b9091048116908216115b156200388c5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200394862002509565b6040518263ffffffff1660e01b81526004016200396791815260200190565b600060405180830381600087803b1580156200398257600080fd5b505af115801562003997573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003a7c57600080fd5b505af115801562003a91573d6000803e3d6000fd5b50505050620010d56200433d565b62003aab8282620020db565b620011365760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003b178282620020db565b15620011365760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600054610100900460ff16620010d55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162001271565b62001136828262003a9f565b600082815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080546000918291829062003c559063ffffffff1662004f6f565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000866001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508060826000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150868260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550858260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550838260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003e4c94939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003e94575081155b1562003eb35760405163340c614f60e11b815260040160405180910390fd5b8062003ed2576040516366385b5160e01b815260040160405180910390fd5b62003edd846200439a565b62003efb576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b600062003fab836200300a565b90508160008062003fbd84846200502f565b6085546001600160401b03918216925060009162003fe491600160401b9004164262005117565b90505b846001600160401b0316846001600160401b0316146200406e576001600160401b0380851660009081526003890160205260409020600181015490911682101562004049576001810154600160401b90046001600160401b0316945062004067565b6200405586866200502f565b6001600160401b03169350506200406e565b5062003fe7565b60006200407c848462005117565b905083811015620040da57808403600c81116200409a57806200409d565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620040cf57620040cf6200508b565b046086555062004152565b838103600c8111620040ed5780620040f0565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a764000002816200412a576200412a6200508b565b04905080608654670de0b6b3a764000002816200414b576200414b6200508b565b0460865550505b683635c9adc5dea0000060865411156200417957683635c9adc5dea0000060865562004191565b633b9aca0060865410156200419157633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002d2d576006810154600090620041e690600160c01b90046001600160401b0316600162004e1a565b9050620041f4828262002fc5565b156200113657600682015460009060029062004222908490600160801b90046001600160401b03166200502f565b6200422e91906200525f565b6200423a908362004e1a565b905062004248838262002fc5565b156200425a5762000f9083826200382e565b62000f9083836200382e565b606f5460ff166200428a57604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b620042cb8282620020db565b6200113657604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905262000f9090849062004420565b606f5460ff16156200436257604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b038316108015620043d1575067ffffffff00000001604083901c6001600160401b0316105b8015620043f2575067ffffffff00000001608083901c6001600160401b0316105b80156200440a575067ffffffff0000000160c083901c105b156200441857506001919050565b506000919050565b600062004477826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620044f99092919063ffffffff16565b80519091501562000f9057808060200190518101906200449891906200523b565b62000f905760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162001271565b60606200450a848460008562004512565b949350505050565b606082471015620045755760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162001271565b600080866001600160a01b03168587604051620045939190620051e0565b60006040518083038185875af1925050503d8060008114620045d2576040519150601f19603f3d011682016040523d82523d6000602084013e620045d7565b606091505b509150915062001cf087838387606083156200465857825160000362004650576001600160a01b0385163b620046505760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001271565b50816200450a565b6200450a83838151156200466f5781518083602001fd5b8060405162461bcd60e51b815260040162001271919062004be5565b61092e806200528983390190565b803563ffffffff811681146200307657600080fd5b80356001600160401b03811681146200307657600080fd5b60008060408385031215620046da57600080fd5b620046e58362004699565b9150620046f560208401620046ae565b90509250929050565b6000602082840312156200471157600080fd5b62000b918262004699565b80610300810183101562000b9457600080fd5b6000806000806000806000806103e0898b0312156200474d57600080fd5b620047588962004699565b97506200476860208a01620046ae565b96506200477860408a01620046ae565b95506200478860608a01620046ae565b94506200479860808a01620046ae565b935060a0890135925060c08901359150620047b78a60e08b016200471c565b90509295985092959890939650565b6001600160a01b038116811462002d2d57600080fd5b6000806000806000806000806103e0898b031215620047fa57600080fd5b620048058962004699565b97506200481560208a01620046ae565b96506200482560408a01620046ae565b95506200483560608a01620046ae565b94506080890135935060a0890135925060c08901356200485581620047c6565b9150620047b78a60e08b016200471c565b6000602082840312156200487957600080fd5b813561ffff811681146200488c57600080fd5b9392505050565b600060208284031215620048a657600080fd5b5035919050565b60008060408385031215620048c157600080fd5b823591506020830135620048d581620047c6565b809150509250929050565b600060208284031215620048f357600080fd5b62000b9182620046ae565b600080600080600080600080610100898b0312156200491c57600080fd5b88356200492981620047c6565b97506200493960208a01620046ae565b96506200494960408a01620046ae565b955060608901356200495b81620047c6565b945060808901356200496d81620047c6565b935060a08901356200497f81620047c6565b925060c08901356200499181620047c6565b915060e0890135620049a381620047c6565b809150509295985092959890939650565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620049dc57600080fd5b81356001600160401b0380821115620049f957620049f9620049b4565b604051601f8301601f19908116603f0116810190828211818310171562004a245762004a24620049b4565b8160405283815286602085880101111562004a3e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121562004a7a57600080fd5b62004a858862004699565b965062004a9560208901620046ae565b9550604088013562004aa781620047c6565b9450606088013562004ab981620047c6565b9350608088013562004acb81620047c6565b925060a08801356001600160401b038082111562004ae857600080fd5b62004af68b838c01620049ca565b935060c08a013591508082111562004b0d57600080fd5b5062004b1c8a828b01620049ca565b91505092959891949750929550565b60008060008060008060c0878903121562004b4557600080fd5b62004b508762004699565b955062004b6060208801620046ae565b945062004b7060408801620046ae565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004bae57818101518382015260200162004b94565b50506000910152565b6000815180845262004bd181602086016020860162004b91565b601f01601f19169290920160200192915050565b60208152600062000b91602083018462004bb7565b6000806040838503121562004c0e57600080fd5b62004c1983620046ae565b946020939093013593505050565b6000806000806060858703121562004c3e57600080fd5b843562004c4b81620047c6565b935062004c5b6020860162004699565b925060408501356001600160401b038082111562004c7857600080fd5b818701915087601f83011262004c8d57600080fd5b81358181111562004c9d57600080fd5b88602082850101111562004cb057600080fd5b95989497505060200194505050565b60006020828403121562004cd257600080fd5b81356200488c81620047c6565b803560ff811681146200307657600080fd5b60008060008060008060c0878903121562004d0b57600080fd5b863562004d1881620047c6565b9550602087013562004d2a81620047c6565b945062004d3a60408801620046ae565b935062004d4a60608801620046ae565b92506080870135915062004d6160a0880162004cdf565b90509295509295509295565b60008060008060008060c0878903121562004d8757600080fd5b863562004d9481620047c6565b9550602087013562004da681620047c6565b945062004db660408801620046ae565b935062004dc66060880162004cdf565b92506080870135915060a08701356001600160401b0381111562004de957600080fd5b62004df789828a01620049ca565b9150509295509295509295565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004e3d5762004e3d62004e04565b5092915050565b8054600090600181811c908083168062004e5f57607f831692505b6020808410820362004e8157634e487b7160e01b600052602260045260246000fd5b8388526020880182801562004e9f576001811462004eb65762004ee3565b60ff198716825285151560051b8201975062004ee3565b60008981526020902060005b8781101562004edd5781548482015290860190840162004ec2565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c06040820181905260009062004f1e9083018762004e44565b828103606084015262004f32818762004e44565b9150508360808301526001600160401b03831660a0830152979650505050505050565b808202811582820484141762000b945762000b9462004e04565b600063ffffffff80831681810362004f8b5762004f8b62004e04565b6001019392505050565b6001600160a01b0384811682528316602082015260606040820181905260009062004fc39083018462004bb7565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190526000906200500e9083018562004bb7565b82810360a084015262005022818562004bb7565b9998505050505050505050565b6001600160401b0382811682821603908082111562004e3d5762004e3d62004e04565b60006001600160401b0380831681810362004f8b5762004f8b62004e04565b6000602082840312156200508457600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082620050b357620050b36200508b565b500490565b8082018082111562000b945762000b9462004e04565b634e487b7160e01b600052603260045260246000fd5b600060018201620050f957620050f962004e04565b5060010190565b6000826200511257620051126200508b565b500690565b8181038181111562000b945762000b9462004e04565b6000816200513f576200513f62004e04565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a08201819052600090620051d49083018462004bb7565b98975050505050505050565b60008251620051f481846020870162004b91565b9190910192915050565b61032081016103008085843782018360005b60018110156200523157815183526020928301929091019060010162005210565b5050509392505050565b6000602082840312156200524e57600080fd5b815180151581146200488c57600080fd5b60006001600160401b03808416806200527c576200527c6200508b565b9216919091049291505056fe60a06040526040516200092e3803806200092e833981016040819052620000269162000383565b828162000034828262000060565b50506001600160a01b038216608052620000576200005160805190565b620000c6565b50505062000481565b6200006b8262000138565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115620000b857620000b38282620001b8565b505050565b620000c262000235565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620001086000805160206200090e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001358162000257565b50565b806001600160a01b03163b6000036200017457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b031684604051620001d7919062000463565b600060405180830381855af49150503d806000811462000214576040519150601f19603f3d011682016040523d82523d6000602084013e62000219565b606091505b5090925090506200022c8583836200029a565b95945050505050565b3415620002555760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166200028357604051633173bdd160e11b8152600060048201526024016200016b565b806000805160206200090e83398151915262000197565b606082620002b357620002ad8262000300565b620002f9565b8151158015620002cb57506001600160a01b0384163b155b15620002f657604051639996b31560e01b81526001600160a01b03851660048201526024016200016b565b50805b9392505050565b805115620003115780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b03811681146200034257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200037a57818101518382015260200162000360565b50506000910152565b6000806000606084860312156200039957600080fd5b620003a4846200032a565b9250620003b4602085016200032a565b60408501519092506001600160401b0380821115620003d257600080fd5b818601915086601f830112620003e757600080fd5b815181811115620003fc57620003fc62000347565b604051601f8201601f19908116603f0116810190838211818310171562000427576200042762000347565b816040528281528960208487010111156200044157600080fd5b620004548360208301602088016200035d565b80955050505050509250925092565b60008251620004778184602087016200035d565b9190910192915050565b6080516104726200049c6000396000601001526104726000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100e5565b60008061008e36600481846102fd565b81019061009b919061033d565b915091506100a98282610109565b5050565b60006100e07f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610104573d6000f35b3d6000fd5b61011282610164565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561015c5761015782826101e0565b505050565b6100a9610256565b806001600160a01b03163b60000361019f57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101fd919061040d565b600060405180830381855af49150503d8060008114610238576040519150601f19603f3d011682016040523d82523d6000602084013e61023d565b606091505b509150915061024d858383610275565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b60608261028a57610285826102d4565b6102cd565b81511580156102a157506001600160a01b0384163b155b156102ca57604051639996b31560e01b81526001600160a01b0385166004820152602401610196565b50805b9392505050565b8051156102e45780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6000808585111561030d57600080fd5b8386111561031a57600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035057600080fd5b82356001600160a01b038116811461036757600080fd5b9150602083013567ffffffffffffffff8082111561038457600080fd5b818501915085601f83011261039857600080fd5b8135818111156103aa576103aa610327565b604051601f8201601f19908116603f011681019083821181831017156103d2576103d2610327565b816040528281528860208487010111156103eb57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000825160005b8181101561042e5760208186018101518583015201610414565b50600092019182525091905056fea2646970667358221220d51c6fc430c553d1da2391464fd71dbfa43dc91a9531c4d842a3289bb581301664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220940fd7fb8f2b0b558c758ec81586b1381069bcd4c57c3af55969d22a9a6d9c3b64736f6c63430008140033", - "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620003095760003560e01c806387c20c01116200019d578063c4c928c211620000eb578063dbc16976116200009e578063dbc1697614620009cd578063dde0ff7714620009d7578063e0bfd3d214620009f2578063e46761c41462000a09578063f34eb8eb1462000a31578063f4e926751462000a48578063f9c4c2ae1462000a5957600080fd5b8063c4c928c21462000923578063ceee281d146200093a578063d02103ca1462000963578063d5073f6f146200098b578063d547741f14620009a2578063d939b31514620009b957600080fd5b8063a066215c1162000150578063a066215c1462000797578063a217fddf14620007ae578063a2967d9914620007b7578063a3c573eb14620007c1578063afd23cbe1462000802578063b99d0ad7146200082c578063c1acbc34146200090857600080fd5b806387c20c01146200071a5780638bd4f071146200073157806391d14854146200074857806399f5634e146200075f5780639a908e7314620007695780639c9f3dfe146200078057600080fd5b80632f2ff15d116200025b57806360469169116200020e5780636046916914620005c957806365c0504d14620005d35780637222020f1462000682578063727885e914620006995780637975fcfe14620006b05780637fb6e76a14620006d6578063841b24d714620006ff57600080fd5b80632f2ff15d146200052057806336568abe1462000537578063394218e9146200054e578063477fa27014620005655780634d4d3338146200056e57806355a71ee0146200058557600080fd5b806315064c9611620002c057806315064c9614620003c95780631608859c14620003d75780631796a1ae14620003ee5780631816b7e514620004155780632072f6c5146200042c578063248a9ca3146200043657806325280169146200046b57600080fd5b8063066ec012146200030e578063080b3111146200033f5780630a0d9fbe146200036757806311f6b287146200038257806312b86e1914620003995780631489ed1014620003b2575b600080fd5b60845462000322906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b6200035662000350366004620046c6565b62000b70565b604051901515815260200162000336565b6085546200032290600160401b90046001600160401b031681565b6200032262000393366004620046fe565b62000b9a565b620003b0620003aa3660046200472f565b62000bba565b005b620003b0620003c3366004620047dc565b62000d6a565b606f54620003569060ff1681565b620003b0620003e8366004620046c6565b62000f00565b607e54620003ff9063ffffffff1681565b60405163ffffffff909116815260200162000336565b620003b06200042636600462004866565b62000f95565b620003b062001041565b6200045c6200044736600462004893565b60009081526034602052604090206001015490565b60405190815260200162000336565b620004ec6200047c366004620046c6565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b0390811691830191909152928201519092169082015260600162000336565b620003b062000531366004620048ad565b620010d7565b620003b062000548366004620048ad565b62001100565b620003b06200055f366004620048e0565b6200113a565b6086546200045c565b620003b06200057f366004620048fe565b620011ee565b6200045c62000596366004620046c6565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b6200045c6200173b565b62000638620005e4366004620046fe565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c00162000336565b620003b062000693366004620046fe565b62001753565b620003b0620006aa36600462004a5e565b6200184f565b620006c7620006c136600462004b2b565b62001cc8565b60405162000336919062004be5565b620003ff620006e7366004620048e0565b60836020526000908152604090205463ffffffff1681565b6084546200032290600160c01b90046001600160401b031681565b620003b06200072b366004620047dc565b62001cfb565b620003b0620007423660046200472f565b62002025565b6200035662000759366004620048ad565b620020db565b6200045c62002106565b620003226200077a36600462004bfa565b620021ed565b620003b062000791366004620048e0565b620023bf565b620003b0620007a8366004620048e0565b62002465565b6200045c600081565b6200045c62002509565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200162000336565b6085546200081890600160801b900461ffff1681565b60405161ffff909116815260200162000336565b620008c26200083d366004620046c6565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b60405162000336919060006080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200032290600160801b90046001600160401b031681565b620003b06200093436600462004c27565b620028de565b620003ff6200094b36600462004cbf565b60826020526000908152604090205463ffffffff1681565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b620003b06200099c36600462004893565b62002bbd565b620003b0620009b3366004620048ad565b62002c59565b60855462000322906001600160401b031681565b620003b062002c82565b6084546200032290600160401b90046001600160401b031681565b620003b062000a0336600462004cf1565b62002d30565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b620003b062000a4236600462004d6d565b62002dc9565b608054620003ff9063ffffffff1681565b62000af062000a6a366004620046fe565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff166101608201526101800162000336565b63ffffffff8216600090815260816020526040812062000b91908362002fc5565b90505b92915050565b63ffffffff8116600090815260816020526040812062000b94906200300a565b60008051602062005bf783398151915262000bd5816200307b565b63ffffffff8916600090815260816020526040902062000bfc818a8a8a8a8a8a8a62003087565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000c64576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000c9d62002509565b6040518263ffffffff1660e01b815260040162000cbc91815260200190565b600060405180830381600087803b15801562000cd757600080fd5b505af115801562000cec573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005bf783398151915262000d85816200307b565b63ffffffff8916600090815260816020526040902062000dac818a8a8a8a8a8a8a62003420565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562000e14576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000e4d62002509565b6040518263ffffffff1660e01b815260040162000e6c91815260200190565b600060405180830381600087803b15801562000e8757600080fd5b505af115801562000e9c573d6000803e3d6000fd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff8216600090815260816020526040902062000f3060008051602062005bf783398151915233620020db565b62000f8457606f5460ff161562000f5a57604051630bc011ff60e21b815260040160405180910390fd5b62000f66818362002fc5565b62000f8457604051630674f25160e11b815260040160405180910390fd5b62000f9081836200382e565b505050565b60008051602062005bb783398151915262000fb0816200307b565b6103e88261ffff16108062000fca57506103ff8261ffff16115b1562000fe957604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200105c60008051602062005bd783398151915233620020db565b620010cb57608454600160801b90046001600160401b03161580620010ac57506084544290620010a19062093a8090600160801b90046001600160401b031662004e1a565b6001600160401b0316115b15620010cb5760405163692baaad60e11b815260040160405180910390fd5b620010d562003a20565b565b600082815260346020526040902060010154620010f4816200307b565b62000f90838362003a9f565b6001600160a01b03811633146200112a57604051630b4ad1cd60e31b815260040160405180910390fd5b62001136828262003b0b565b5050565b60008051602062005bb783398151915262001155816200307b565b606f5460ff1662001197576084546001600160401b03600160c01b909104811690831610620011975760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19060200162001035565b600054600290610100900460ff1615801562001211575060005460ff8083169116105b6200127a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b179055620012fb62003b75565b6200131660008051602062005bf78339815191528a62003be2565b6200132360008662003be2565b6200134f7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908662003be2565b6200137b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8662003be2565b620013a77f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8662003be2565b620013d37fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8762003be2565b620013ff7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088762003be2565b6200142b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48762003be2565b6200144660008051602062005bb78339815191528762003be2565b6200148160008051602062005bf78339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062003bee565b620014ad7f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08762003be2565b620014d97f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8762003be2565b6200151460008051602062005bd78339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162003bee565b6200152f60008051602062005bd78339815191528562003be2565b6200155b7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518562003be2565b6000620015708484600561044d600062003c39565b6073546074549192506001600160401b03600160401b90910481169116808214620015ae57604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b0381811660008181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620016b09695831695600160581b909104909216936076936077939192919091169060040162004ef0565b600060405180830381600087803b158015620016cb57600080fd5b505af1158015620016e0573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620017289050565b60405180910390a1505050505050505050565b600060865460646200174e919062004f55565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd6200177f816200307b565b63ffffffff821615806200179e5750607e5463ffffffff908116908316115b15620017bd57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200180457604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd086200187b816200307b565b63ffffffff881615806200189a5750607e5463ffffffff908116908916115b15620018b957604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff16151590036200190057604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff16156200193e576040516337c8fe0960e11b815260040160405180910390fd5b60808054600091908290620019599063ffffffff1662004f6f565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b03909216913091620019a7906200468b565b620019b59392919062004f95565b604051809103906000f080158015620019d2573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001c46949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001c86908d908d9088908e908e908e9060040162004fcc565b600060405180830381600087803b15801562001ca157600080fd5b505af115801562001cb6573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001cf090878787878762003e5e565b979650505050505050565b606f5460ff161562001d2057604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001d6f92600160c01b90048116911662004e1a565b6001600160401b0316111562001d9857604051638a0704d360e01b815260040160405180910390fd5b6103e862001da788886200502f565b6001600160401b0316111562001dd057604051635acfba9d60e11b815260040160405180910390fd5b62001de2818989898989898962003420565b62001dee818762003f9e565b6085546001600160401b031660000362001efc57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001e6a576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001ea362002509565b6040518263ffffffff1660e01b815260040162001ec291815260200190565b600060405180830381600087803b15801562001edd57600080fd5b505af115801562001ef2573d6000803e3d6000fd5b5050505062001fc6565b62001f07816200419b565b600681018054600160801b90046001600160401b031690601062001f2b8362005052565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff16156200204a57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff8816600090815260816020526040902062002071818989898989898962003087565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620020d062003a20565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b815230600482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562002170573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002196919062005071565b608454909150600090620021bd906001600160401b03600160401b8204811691166200502f565b6001600160401b0316905080600003620021da5760009250505090565b620021e68183620050a1565b9250505090565b606f5460009060ff16156200221557604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff16908190036200224d576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200227857604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620022ab9084906001600160401b031662004e1a565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620022e1878362004e1a565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b03199092169290931691909117179055905062002371836200419b565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b60008051602062005bb7833981519152620023da816200307b565b606f5460ff1662002415576085546001600160401b0390811690831610620024155760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759060200162001035565b60008051602062005bb783398151915262002480816200307b565b62015180826001600160401b03161115620024ae57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289060200162001035565b60805460009063ffffffff168082036200252557506000919050565b6000816001600160401b03811115620025425762002542620049b4565b6040519080825280602002602001820160405280156200256c578160200160208202803683370190505b50905060005b82811015620025df57608160006200258c836001620050b8565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620025bf57620025bf620050ce565b602090810291909101015280620025d681620050e4565b91505062002572565b50600060205b836001146200283b576000620025fd60028662005100565b6200260a600287620050a1565b620026169190620050b8565b90506000816001600160401b03811115620026355762002635620049b4565b6040519080825280602002602001820160405280156200265f578160200160208202803683370190505b50905060005b82811015620027e7576200267b60018462005117565b811480156200269657506200269260028862005100565b6001145b156200271e5785620026aa82600262004f55565b81518110620026bd57620026bd620050ce565b602002602001015185604051602001620026e1929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106200270c576200270c620050ce565b602002602001018181525050620027d2565b856200272c82600262004f55565b815181106200273f576200273f620050ce565b60200260200101518682600262002757919062004f55565b62002764906001620050b8565b81518110620027775762002777620050ce565b60200260200101516040516020016200279a929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620027c557620027c5620050ce565b6020026020010181815250505b80620027de81620050e4565b91505062002665565b5080945081955083846040516020016200280b929190918252602082015260400190565b604051602081830303815290604052805190602001209350828062002830906200512d565b9350505050620025e5565b600083600081518110620028535762002853620050ce565b6020026020010151905060005b82811015620028d457604080516020810184905290810185905260600160408051601f19818403018152828252805160209182012090830187905290820186905292506060016040516020818303038152906040528051906020012093508080620028cb90620050e4565b91505062002860565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac6200290a816200307b565b63ffffffff84161580620029295750607e5463ffffffff908116908516115b156200294857604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002989576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b031603620029d857604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002a1f57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002a5d57604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002add8462000b9a565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002b339216908b908b9060040162005147565b600060405180830381600087803b15801562002b4e57600080fd5b505af115801562002b63573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002be9816200307b565b683635c9adc5dea0000082118062002c045750633b9aca0082105b1562002c2357604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001035565b60008281526034602052604090206001015462002c76816200307b565b62000f90838362003b0b565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002cae816200307b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002d0a57600080fd5b505af115801562002d1f573d6000803e3d6000fd5b5050505062002d2d62004266565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62002d5c816200307b565b6001600160401b03841660009081526083602052604090205463ffffffff161562002d9a576040516337c8fe0960e11b815260040160405180910390fd5b600062002dab888888888762003c39565b60008080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002df5816200307b565b607e805460009190829062002e109063ffffffff1662004f6f565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002fb39695949392919062005187565b60405180910390a25050505050505050565b6085546001600160401b0382811660009081526004850160205260408120549092429262002ff892918116911662004e1a565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b0316156200305e575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002d2d8133620042bf565b60078801546000906001600160401b039081169087161015620030bd5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038816156200315e5760068901546001600160401b03600160801b90910481169089161115620031075760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200315757604051632bd2e3e760e01b815260040160405180910390fd5b50620031d3565b506001600160401b03851660009081526002890160205260409020548062003199576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620031d357604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b909104811690881611806200320c5750876001600160401b0316876001600160401b031611155b8062003230575060068901546001600160401b03600160c01b909104811690881611155b156200324f5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b900481169086161462003296576040516332a2a77f60e01b815260040160405180910390fd5b6000620032a88a888888868962003e5e565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620032df9190620051e0565b602060405180830381855afa158015620032fd573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003322919062005071565b6200332e919062005100565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200337291889190600401620051fe565b602060405180830381865afa15801562003390573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620033b691906200523b565b620033d4576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620034135760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b6000806200342e8a6200300a565b60078b01549091506001600160401b039081169089161015620034645760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620035075760068a01546001600160401b03600160801b9091048116908a161115620034ae5760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200350057604051632bd2e3e760e01b815260040160405180910390fd5b5062003577565b6001600160401b038816600090815260028b01602052604090205491508162003543576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200357757604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620035aa5760405163b9b18f5760e01b815260040160405180910390fd5b6000620035bc8b8a8a8a878b62003e5e565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620035f39190620051e0565b602060405180830381855afa15801562003611573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003636919062005071565b62003642919062005100565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200368691899190600401620051fe565b602060405180830381865afa158015620036a4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620036ca91906200523b565b620036e8576040516309bde33960e01b815260040160405180910390fd5b6000620036f6848b6200502f565b90506200374f87826001600160401b03166200371162002106565b6200371d919062004f55565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620042e9565b80608460088282829054906101000a90046001600160401b031662003775919062004e1a565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b1580156200380657600080fd5b505af11580156200381b573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b90910481169082161115806200386d575060068201546001600160401b03600160801b9091048116908216115b156200388c5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200394862002509565b6040518263ffffffff1660e01b81526004016200396791815260200190565b600060405180830381600087803b1580156200398257600080fd5b505af115801562003997573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003a7c57600080fd5b505af115801562003a91573d6000803e3d6000fd5b50505050620010d56200433d565b62003aab8282620020db565b620011365760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003b178282620020db565b15620011365760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600054610100900460ff16620010d55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162001271565b62001136828262003a9f565b600082815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080546000918291829062003c559063ffffffff1662004f6f565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000866001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508060826000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150868260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550858260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550838260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003e4c94939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003e94575081155b1562003eb35760405163340c614f60e11b815260040160405180910390fd5b8062003ed2576040516366385b5160e01b815260040160405180910390fd5b62003edd846200439a565b62003efb576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b600062003fab836200300a565b90508160008062003fbd84846200502f565b6085546001600160401b03918216925060009162003fe491600160401b9004164262005117565b90505b846001600160401b0316846001600160401b0316146200406e576001600160401b0380851660009081526003890160205260409020600181015490911682101562004049576001810154600160401b90046001600160401b0316945062004067565b6200405586866200502f565b6001600160401b03169350506200406e565b5062003fe7565b60006200407c848462005117565b905083811015620040da57808403600c81116200409a57806200409d565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620040cf57620040cf6200508b565b046086555062004152565b838103600c8111620040ed5780620040f0565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a764000002816200412a576200412a6200508b565b04905080608654670de0b6b3a764000002816200414b576200414b6200508b565b0460865550505b683635c9adc5dea0000060865411156200417957683635c9adc5dea0000060865562004191565b633b9aca0060865410156200419157633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002d2d576006810154600090620041e690600160c01b90046001600160401b0316600162004e1a565b9050620041f4828262002fc5565b156200113657600682015460009060029062004222908490600160801b90046001600160401b03166200502f565b6200422e91906200525f565b6200423a908362004e1a565b905062004248838262002fc5565b156200425a5762000f9083826200382e565b62000f9083836200382e565b606f5460ff166200428a57604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b620042cb8282620020db565b6200113657604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905262000f9090849062004420565b606f5460ff16156200436257604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b038316108015620043d1575067ffffffff00000001604083901c6001600160401b0316105b8015620043f2575067ffffffff00000001608083901c6001600160401b0316105b80156200440a575067ffffffff0000000160c083901c105b156200441857506001919050565b506000919050565b600062004477826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620044f99092919063ffffffff16565b80519091501562000f9057808060200190518101906200449891906200523b565b62000f905760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162001271565b60606200450a848460008562004512565b949350505050565b606082471015620045755760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162001271565b600080866001600160a01b03168587604051620045939190620051e0565b60006040518083038185875af1925050503d8060008114620045d2576040519150601f19603f3d011682016040523d82523d6000602084013e620045d7565b606091505b509150915062001cf087838387606083156200465857825160000362004650576001600160a01b0385163b620046505760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001271565b50816200450a565b6200450a83838151156200466f5781518083602001fd5b8060405162461bcd60e51b815260040162001271919062004be5565b61092e806200528983390190565b803563ffffffff811681146200307657600080fd5b80356001600160401b03811681146200307657600080fd5b60008060408385031215620046da57600080fd5b620046e58362004699565b9150620046f560208401620046ae565b90509250929050565b6000602082840312156200471157600080fd5b62000b918262004699565b80610300810183101562000b9457600080fd5b6000806000806000806000806103e0898b0312156200474d57600080fd5b620047588962004699565b97506200476860208a01620046ae565b96506200477860408a01620046ae565b95506200478860608a01620046ae565b94506200479860808a01620046ae565b935060a0890135925060c08901359150620047b78a60e08b016200471c565b90509295985092959890939650565b6001600160a01b038116811462002d2d57600080fd5b6000806000806000806000806103e0898b031215620047fa57600080fd5b620048058962004699565b97506200481560208a01620046ae565b96506200482560408a01620046ae565b95506200483560608a01620046ae565b94506080890135935060a0890135925060c08901356200485581620047c6565b9150620047b78a60e08b016200471c565b6000602082840312156200487957600080fd5b813561ffff811681146200488c57600080fd5b9392505050565b600060208284031215620048a657600080fd5b5035919050565b60008060408385031215620048c157600080fd5b823591506020830135620048d581620047c6565b809150509250929050565b600060208284031215620048f357600080fd5b62000b9182620046ae565b600080600080600080600080610100898b0312156200491c57600080fd5b88356200492981620047c6565b97506200493960208a01620046ae565b96506200494960408a01620046ae565b955060608901356200495b81620047c6565b945060808901356200496d81620047c6565b935060a08901356200497f81620047c6565b925060c08901356200499181620047c6565b915060e0890135620049a381620047c6565b809150509295985092959890939650565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620049dc57600080fd5b81356001600160401b0380821115620049f957620049f9620049b4565b604051601f8301601f19908116603f0116810190828211818310171562004a245762004a24620049b4565b8160405283815286602085880101111562004a3e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121562004a7a57600080fd5b62004a858862004699565b965062004a9560208901620046ae565b9550604088013562004aa781620047c6565b9450606088013562004ab981620047c6565b9350608088013562004acb81620047c6565b925060a08801356001600160401b038082111562004ae857600080fd5b62004af68b838c01620049ca565b935060c08a013591508082111562004b0d57600080fd5b5062004b1c8a828b01620049ca565b91505092959891949750929550565b60008060008060008060c0878903121562004b4557600080fd5b62004b508762004699565b955062004b6060208801620046ae565b945062004b7060408801620046ae565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004bae57818101518382015260200162004b94565b50506000910152565b6000815180845262004bd181602086016020860162004b91565b601f01601f19169290920160200192915050565b60208152600062000b91602083018462004bb7565b6000806040838503121562004c0e57600080fd5b62004c1983620046ae565b946020939093013593505050565b6000806000806060858703121562004c3e57600080fd5b843562004c4b81620047c6565b935062004c5b6020860162004699565b925060408501356001600160401b038082111562004c7857600080fd5b818701915087601f83011262004c8d57600080fd5b81358181111562004c9d57600080fd5b88602082850101111562004cb057600080fd5b95989497505060200194505050565b60006020828403121562004cd257600080fd5b81356200488c81620047c6565b803560ff811681146200307657600080fd5b60008060008060008060c0878903121562004d0b57600080fd5b863562004d1881620047c6565b9550602087013562004d2a81620047c6565b945062004d3a60408801620046ae565b935062004d4a60608801620046ae565b92506080870135915062004d6160a0880162004cdf565b90509295509295509295565b60008060008060008060c0878903121562004d8757600080fd5b863562004d9481620047c6565b9550602087013562004da681620047c6565b945062004db660408801620046ae565b935062004dc66060880162004cdf565b92506080870135915060a08701356001600160401b0381111562004de957600080fd5b62004df789828a01620049ca565b9150509295509295509295565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004e3d5762004e3d62004e04565b5092915050565b8054600090600181811c908083168062004e5f57607f831692505b6020808410820362004e8157634e487b7160e01b600052602260045260246000fd5b8388526020880182801562004e9f576001811462004eb65762004ee3565b60ff198716825285151560051b8201975062004ee3565b60008981526020902060005b8781101562004edd5781548482015290860190840162004ec2565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c06040820181905260009062004f1e9083018762004e44565b828103606084015262004f32818762004e44565b9150508360808301526001600160401b03831660a0830152979650505050505050565b808202811582820484141762000b945762000b9462004e04565b600063ffffffff80831681810362004f8b5762004f8b62004e04565b6001019392505050565b6001600160a01b0384811682528316602082015260606040820181905260009062004fc39083018462004bb7565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190526000906200500e9083018562004bb7565b82810360a084015262005022818562004bb7565b9998505050505050505050565b6001600160401b0382811682821603908082111562004e3d5762004e3d62004e04565b60006001600160401b0380831681810362004f8b5762004f8b62004e04565b6000602082840312156200508457600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082620050b357620050b36200508b565b500490565b8082018082111562000b945762000b9462004e04565b634e487b7160e01b600052603260045260246000fd5b600060018201620050f957620050f962004e04565b5060010190565b6000826200511257620051126200508b565b500690565b8181038181111562000b945762000b9462004e04565b6000816200513f576200513f62004e04565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a08201819052600090620051d49083018462004bb7565b98975050505050505050565b60008251620051f481846020870162004b91565b9190910192915050565b61032081016103008085843782018360005b60018110156200523157815183526020928301929091019060010162005210565b5050509392505050565b6000602082840312156200524e57600080fd5b815180151581146200488c57600080fd5b60006001600160401b03808416806200527c576200527c6200508b565b9216919091049291505056fe60a06040526040516200092e3803806200092e833981016040819052620000269162000383565b828162000034828262000060565b50506001600160a01b038216608052620000576200005160805190565b620000c6565b50505062000481565b6200006b8262000138565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115620000b857620000b38282620001b8565b505050565b620000c262000235565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620001086000805160206200090e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001358162000257565b50565b806001600160a01b03163b6000036200017457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b031684604051620001d7919062000463565b600060405180830381855af49150503d806000811462000214576040519150601f19603f3d011682016040523d82523d6000602084013e62000219565b606091505b5090925090506200022c8583836200029a565b95945050505050565b3415620002555760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166200028357604051633173bdd160e11b8152600060048201526024016200016b565b806000805160206200090e83398151915262000197565b606082620002b357620002ad8262000300565b620002f9565b8151158015620002cb57506001600160a01b0384163b155b15620002f657604051639996b31560e01b81526001600160a01b03851660048201526024016200016b565b50805b9392505050565b805115620003115780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b03811681146200034257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200037a57818101518382015260200162000360565b50506000910152565b6000806000606084860312156200039957600080fd5b620003a4846200032a565b9250620003b4602085016200032a565b60408501519092506001600160401b0380821115620003d257600080fd5b818601915086601f830112620003e757600080fd5b815181811115620003fc57620003fc62000347565b604051601f8201601f19908116603f0116810190838211818310171562000427576200042762000347565b816040528281528960208487010111156200044157600080fd5b620004548360208301602088016200035d565b80955050505050509250925092565b60008251620004778184602087016200035d565b9190910192915050565b6080516104726200049c6000396000601001526104726000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100e5565b60008061008e36600481846102fd565b81019061009b919061033d565b915091506100a98282610109565b5050565b60006100e07f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610104573d6000f35b3d6000fd5b61011282610164565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561015c5761015782826101e0565b505050565b6100a9610256565b806001600160a01b03163b60000361019f57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101fd919061040d565b600060405180830381855af49150503d8060008114610238576040519150601f19603f3d011682016040523d82523d6000602084013e61023d565b606091505b509150915061024d858383610275565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b60608261028a57610285826102d4565b6102cd565b81511580156102a157506001600160a01b0384163b155b156102ca57604051639996b31560e01b81526001600160a01b0385166004820152602401610196565b50805b9392505050565b8051156102e45780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6000808585111561030d57600080fd5b8386111561031a57600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035057600080fd5b82356001600160a01b038116811461036757600080fd5b9150602083013567ffffffffffffffff8082111561038457600080fd5b818501915085601f83011261039857600080fd5b8135818111156103aa576103aa610327565b604051601f8201601f19908116603f011681019083821181831017156103d2576103d2610327565b816040528281528860208487010111156103eb57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000825160005b8181101561042e5760208186018101518583015201610414565b50600092019182525091905056fea2646970667358221220d51c6fc430c553d1da2391464fd71dbfa43dc91a9531c4d842a3289bb581301664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220940fd7fb8f2b0b558c758ec81586b1381069bcd4c57c3af55969d22a9a6d9c3b64736f6c63430008140033", + "bytecode": "0x60e06040523480156200001157600080fd5b5060405162005db638038062005db683398101604081905262000034916200006b565b6001600160a01b0392831660805290821660c0521660a052620000bf565b6001600160a01b03811681146200006857600080fd5b50565b6000806000606084860312156200008157600080fd5b83516200008e8162000052565b6020850151909350620000a18162000052565b6040850151909250620000b48162000052565b809150509250925092565b60805160a05160c051615c8f6200012760003960008181610a0f0152818161213b0152613a2e0152600081816107c701528181612cc30152613d29015260008181610969015281816111c60152818161137601528181611e7f0152613c180152615c8f6000f3fe60806040523480156200001157600080fd5b5060043610620003095760003560e01c806387c20c01116200019d578063c4c928c211620000eb578063dbc16976116200009e578063dbc1697614620009cd578063dde0ff7714620009d7578063e0bfd3d214620009f2578063e46761c41462000a09578063f34eb8eb1462000a31578063f4e926751462000a48578063f9c4c2ae1462000a5957600080fd5b8063c4c928c21462000923578063ceee281d146200093a578063d02103ca1462000963578063d5073f6f146200098b578063d547741f14620009a2578063d939b31514620009b957600080fd5b8063a066215c1162000150578063a066215c1462000797578063a217fddf14620007ae578063a2967d9914620007b7578063a3c573eb14620007c1578063afd23cbe1462000802578063b99d0ad7146200082c578063c1acbc34146200090857600080fd5b806387c20c01146200071a5780638bd4f071146200073157806391d14854146200074857806399f5634e146200075f5780639a908e7314620007695780639c9f3dfe146200078057600080fd5b806325280169116200025b57806360469169116200020e5780636046916914620005c957806365c0504d14620005d35780637222020f1462000682578063727885e914620006995780637975fcfe14620006b05780637fb6e76a14620006d6578063841b24d714620006ff57600080fd5b80632528016914620004825780632f2ff15d146200053757806336568abe146200054e578063394218e91462000565578063477fa270146200057c57806355a71ee0146200058557600080fd5b80631489ed1011620002c05780631489ed1014620003c957806315064c9614620003e05780631608859c14620003ee5780631796a1ae14620004055780631816b7e5146200042c5780632072f6c51462000443578063248a9ca3146200044d57600080fd5b80630645af09146200030e578063066ec0121462000327578063080b311114620003585780630a0d9fbe146200038057806311f6b287146200039b57806312b86e1914620003b2575b600080fd5b620003256200031f366004620046e5565b62000b70565b005b6084546200033b906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b6200036f62000369366004620047d5565b620010d0565b60405190151581526020016200034f565b6085546200033b90600160401b90046001600160401b031681565b6200033b620003ac3660046200480d565b620010fa565b62000325620003c33660046200483e565b6200111a565b62000325620003da366004620048d5565b620012ca565b606f546200036f9060ff1681565b62000325620003ff366004620047d5565b62001460565b607e54620004169063ffffffff1681565b60405163ffffffff90911681526020016200034f565b620003256200043d3660046200495f565b620014f5565b62000325620015a1565b620004736200045e3660046200498c565b60009081526034602052604090206001015490565b6040519081526020016200034f565b6200050362000493366004620047d5565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b039081169183019190915292820151909216908201526060016200034f565b6200032562000548366004620049a6565b62001637565b620003256200055f366004620049a6565b62001660565b6200032562000576366004620049d9565b6200169a565b60865462000473565b6200047362000596366004620047d5565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620004736200174e565b62000638620005e43660046200480d565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c0016200034f565b62000325620006933660046200480d565b62001766565b62000325620006aa36600462004aa1565b62001862565b620006c7620006c136600462004b6e565b62001cdb565b6040516200034f919062004c28565b62000416620006e7366004620049d9565b60836020526000908152604090205463ffffffff1681565b6084546200033b90600160c01b90046001600160401b031681565b620003256200072b366004620048d5565b62001d0e565b62000325620007423660046200483e565b62002038565b6200036f62000759366004620049a6565b620020ee565b6200047362002119565b6200033b6200077a36600462004c3d565b62002200565b6200032562000791366004620049d9565b620023d2565b62000325620007a8366004620049d9565b62002478565b62000473600081565b620004736200251c565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016200034f565b6085546200081890600160801b900461ffff1681565b60405161ffff90911681526020016200034f565b620008c26200083d366004620047d5565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b6040516200034f919060006080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200033b90600160801b90046001600160401b031681565b620003256200093436600462004c6a565b620028f1565b620004166200094b36600462004d02565b60826020526000908152604090205463ffffffff1681565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b620003256200099c3660046200498c565b62002bd0565b62000325620009b3366004620049a6565b62002c6c565b6085546200033b906001600160401b031681565b6200032562002c95565b6084546200033b90600160401b90046001600160401b031681565b6200032562000a0336600462004d34565b62002d43565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b6200032562000a4236600462004db0565b62002dde565b608054620004169063ffffffff1681565b62000af062000a6a3660046200480d565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff16610160820152610180016200034f565b600054600290610100900460ff1615801562000b93575060005460ff8083169116105b62000bfc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c7d62002fda565b62000c9860008051602062005c3a8339815191528c62003047565b62000ca560008862003047565b62000cd17fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908862003047565b62000cfd7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8862003047565b62000d297f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8862003047565b62000d557fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8962003047565b62000d817fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088962003047565b62000dad7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48962003047565b62000dc860008051602062005bfa8339815191528962003047565b62000e0360008051602062005c3a8339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062003053565b62000e2f7f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08962003047565b62000e5b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8962003047565b62000e9660008051602062005c1a8339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162003053565b62000eb160008051602062005c1a8339815191528762003047565b62000edd7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518762003047565b6073546074546001600160401b03600160401b9092048216911680821462000f1857604051632e4cc54360e11b815260040160405180910390fd5b600062000f40888888886000607460009054906101000a90046001600160401b03166200309e565b6001600160401b03838116600081815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068b018054909216909417938802939093179092556007880180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81529596506001600160a01b038e81169663bb59070896620010439694831695600160581b90950490921693607693607793909291169060040162004ef3565b600060405180830381600087803b1580156200105e57600080fd5b505af115801562001073573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620010bb9050565b60405180910390a15050505050505050505050565b63ffffffff82166000908152608160205260408120620010f19083620032cc565b90505b92915050565b63ffffffff81166000908152608160205260408120620010f49062003311565b60008051602062005c3a833981519152620011358162003382565b63ffffffff891660009081526081602052604090206200115c818a8a8a8a8a8a8a6200338e565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b90041615620011c4576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620011fd6200251c565b6040518263ffffffff1660e01b81526004016200121c91815260200190565b600060405180830381600087803b1580156200123757600080fd5b505af11580156200124c573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005c3a833981519152620012e58162003382565b63ffffffff891660009081526081602052604090206200130c818a8a8a8a8a8a8a62003727565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562001374576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620013ad6200251c565b6040518263ffffffff1660e01b8152600401620013cc91815260200190565b600060405180830381600087803b158015620013e757600080fd5b505af1158015620013fc573d6000803e3d6000fd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff821660009081526081602052604090206200149060008051602062005c3a83398151915233620020ee565b620014e457606f5460ff1615620014ba57604051630bc011ff60e21b815260040160405180910390fd5b620014c68183620032cc565b620014e457604051630674f25160e11b815260040160405180910390fd5b620014f0818362003b35565b505050565b60008051602062005bfa833981519152620015108162003382565b6103e88261ffff1610806200152a57506103ff8261ffff16115b156200154957604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620015bc60008051602062005c1a83398151915233620020ee565b6200162b57608454600160801b90046001600160401b031615806200160c57506084544290620016019062093a8090600160801b90046001600160401b031662004f6e565b6001600160401b0316115b156200162b5760405163692baaad60e11b815260040160405180910390fd5b6200163562003d27565b565b600082815260346020526040902060010154620016548162003382565b620014f0838362003da6565b6001600160a01b03811633146200168a57604051630b4ad1cd60e31b815260040160405180910390fd5b62001696828262003e12565b5050565b60008051602062005bfa833981519152620016b58162003382565b606f5460ff16620016f7576084546001600160401b03600160c01b909104811690831610620016f75760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19060200162001595565b6000608654606462001761919062004f98565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd620017928162003382565b63ffffffff82161580620017b15750607e5463ffffffff908116908316115b15620017d057604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200181757604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd086200188e8162003382565b63ffffffff88161580620018ad5750607e5463ffffffff908116908916115b15620018cc57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff16151590036200191357604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001951576040516337c8fe0960e11b815260040160405180910390fd5b608080546000919082906200196c9063ffffffff1662004fb2565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b03909216913091620019ba90620046a9565b620019c89392919062004fd8565b604051809103906000f080158015620019e5573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001c59949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001c99908d908d9088908e908e908e906004016200500f565b600060405180830381600087803b15801562001cb457600080fd5b505af115801562001cc9573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001d0390878787878762003e7c565b979650505050505050565b606f5460ff161562001d3357604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001d8292600160c01b90048116911662004f6e565b6001600160401b0316111562001dab57604051638a0704d360e01b815260040160405180910390fd5b6103e862001dba888862005072565b6001600160401b0316111562001de357604051635acfba9d60e11b815260040160405180910390fd5b62001df5818989898989898962003727565b62001e01818762003fbc565b6085546001600160401b031660000362001f0f57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001e7d576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001eb66200251c565b6040518263ffffffff1660e01b815260040162001ed591815260200190565b600060405180830381600087803b15801562001ef057600080fd5b505af115801562001f05573d6000803e3d6000fd5b5050505062001fd9565b62001f1a81620041b9565b600681018054600160801b90046001600160401b031690601062001f3e8362005095565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff16156200205d57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602052604090206200208481898989898989896200338e565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620020e362003d27565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b815230600482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562002183573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620021a99190620050b4565b608454909150600090620021d0906001600160401b03600160401b82048116911662005072565b6001600160401b0316905080600003620021ed5760009250505090565b620021f98183620050e4565b9250505090565b606f5460009060ff16156200222857604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362002260576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200228b57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620022be9084906001600160401b031662004f6e565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620022f4878362004f6e565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200238483620041b9565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b60008051602062005bfa833981519152620023ed8162003382565b606f5460ff1662002428576085546001600160401b0390811690831610620024285760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759060200162001595565b60008051602062005bfa833981519152620024938162003382565b62015180826001600160401b03161115620024c157604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289060200162001595565b60805460009063ffffffff168082036200253857506000919050565b6000816001600160401b03811115620025555762002555620049f7565b6040519080825280602002602001820160405280156200257f578160200160208202803683370190505b50905060005b82811015620025f257608160006200259f836001620050fb565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620025d257620025d262005111565b602090810291909101015280620025e98162005127565b91505062002585565b50600060205b836001146200284e5760006200261060028662005143565b6200261d600287620050e4565b620026299190620050fb565b90506000816001600160401b03811115620026485762002648620049f7565b60405190808252806020026020018201604052801562002672578160200160208202803683370190505b50905060005b82811015620027fa576200268e6001846200515a565b81148015620026a95750620026a560028862005143565b6001145b15620027315785620026bd82600262004f98565b81518110620026d057620026d062005111565b602002602001015185604051602001620026f4929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106200271f576200271f62005111565b602002602001018181525050620027e5565b856200273f82600262004f98565b8151811062002752576200275262005111565b6020026020010151868260026200276a919062004f98565b62002777906001620050fb565b815181106200278a576200278a62005111565b6020026020010151604051602001620027ad929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620027d857620027d862005111565b6020026020010181815250505b80620027f18162005127565b91505062002678565b5080945081955083846040516020016200281e929190918252602082015260400190565b6040516020818303038152906040528051906020012093508280620028439062005170565b9350505050620025f8565b60008360008151811062002866576200286662005111565b6020026020010151905060005b82811015620028e757604080516020810184905290810185905260600160408051601f19818403018152828252805160209182012090830187905290820186905292506060016040516020818303038152906040528051906020012093508080620028de9062005127565b91505062002873565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac6200291d8162003382565b63ffffffff841615806200293c5750607e5463ffffffff908116908516115b156200295b57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff16908190036200299c576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b031603620029eb57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002a3257604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002a7057604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002af084620010fa565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002b469216908b908b906004016200518a565b600060405180830381600087803b15801562002b6157600080fd5b505af115801562002b76573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002bfc8162003382565b683635c9adc5dea0000082118062002c175750633b9aca0082105b1562002c3657604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001595565b60008281526034602052604090206001015462002c898162003382565b620014f0838362003e12565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002cc18162003382565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002d1d57600080fd5b505af115801562002d32573d6000803e3d6000fd5b5050505062002d4062004284565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62002d6f8162003382565b6001600160401b03841660009081526083602052604090205463ffffffff161562002dad576040516337c8fe0960e11b815260040160405180910390fd5b600062002dc0888888888760006200309e565b60008080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002e0a8162003382565b607e805460009190829062002e259063ffffffff1662004fb2565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002fc896959493929190620051ca565b60405180910390a25050505050505050565b600054610100900460ff16620016355760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000bf3565b62001696828262003da6565b600082815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6080805460009182918290620030ba9063ffffffff1662004fb2565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000876001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff16021790555080608260008a6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150878260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550868260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620032b99594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b03828116600090815260048501602052604081205490924292620032ff92918116911662004f6e565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b03161562003365575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002d408133620042dd565b60078801546000906001600160401b039081169087161015620033c45760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620034655760068901546001600160401b03600160801b909104811690891611156200340e5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200345e57604051632bd2e3e760e01b815260040160405180910390fd5b50620034da565b506001600160401b038516600090815260028901602052604090205480620034a0576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620034da57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620035135750876001600160401b0316876001600160401b031611155b8062003537575060068901546001600160401b03600160c01b909104811690881611155b15620035565760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b90048116908616146200359d576040516332a2a77f60e01b815260040160405180910390fd5b6000620035af8a888888868962003e7c565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620035e6919062005223565b602060405180830381855afa15801562003604573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620036299190620050b4565b62003635919062005143565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620036799188919060040162005241565b602060405180830381865afa15801562003697573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620036bd91906200527e565b620036db576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c0160205260409020600201548590036200371a5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620037358a62003311565b60078b01549091506001600160401b0390811690891610156200376b5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038916156200380e5760068a01546001600160401b03600160801b9091048116908a161115620037b55760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200380757604051632bd2e3e760e01b815260040160405180910390fd5b506200387e565b6001600160401b038816600090815260028b0160205260409020549150816200384a576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200387e57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620038b15760405163b9b18f5760e01b815260040160405180910390fd5b6000620038c38b8a8a8a878b62003e7c565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620038fa919062005223565b602060405180830381855afa15801562003918573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200393d9190620050b4565b62003949919062005143565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200398d9189919060040162005241565b602060405180830381865afa158015620039ab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620039d191906200527e565b620039ef576040516309bde33960e01b815260040160405180910390fd5b6000620039fd848b62005072565b905062003a5687826001600160401b031662003a1862002119565b62003a24919062004f98565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004307565b80608460088282829054906101000a90046001600160401b031662003a7c919062004f6e565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b15801562003b0d57600080fd5b505af115801562003b22573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003b74575060068201546001600160401b03600160801b9091048116908216115b1562003b935760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003c4f6200251c565b6040518263ffffffff1660e01b815260040162003c6e91815260200190565b600060405180830381600087803b15801562003c8957600080fd5b505af115801562003c9e573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003d8357600080fd5b505af115801562003d98573d6000803e3d6000fd5b50505050620016356200435b565b62003db28282620020ee565b620016965760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003e1e8282620020ee565b15620016965760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003eb2575081155b1562003ed15760405163340c614f60e11b815260040160405180910390fd5b8062003ef0576040516366385b5160e01b815260040160405180910390fd5b62003efb84620043b8565b62003f19576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b600062003fc98362003311565b90508160008062003fdb848462005072565b6085546001600160401b0391821692506000916200400291600160401b900416426200515a565b90505b846001600160401b0316846001600160401b0316146200408c576001600160401b0380851660009081526003890160205260409020600181015490911682101562004067576001810154600160401b90046001600160401b0316945062004085565b62004073868662005072565b6001600160401b03169350506200408c565b5062004005565b60006200409a84846200515a565b905083811015620040f857808403600c8111620040b85780620040bb565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620040ed57620040ed620050ce565b046086555062004170565b838103600c81116200410b57806200410e565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a76400000281620041485762004148620050ce565b04905080608654670de0b6b3a76400000281620041695762004169620050ce565b0460865550505b683635c9adc5dea0000060865411156200419757683635c9adc5dea00000608655620041af565b633b9aca006086541015620041af57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002d405760068101546000906200420490600160c01b90046001600160401b0316600162004f6e565b9050620042128282620032cc565b156200169657600682015460009060029062004240908490600160801b90046001600160401b031662005072565b6200424c9190620052a2565b62004258908362004f6e565b9050620042668382620032cc565b156200427857620014f0838262003b35565b620014f0838362003b35565b606f5460ff16620042a857604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b620042e98282620020ee565b6200169657604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620014f09084906200443e565b606f5460ff16156200438057604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b038316108015620043ef575067ffffffff00000001604083901c6001600160401b0316105b801562004410575067ffffffff00000001608083901c6001600160401b0316105b801562004428575067ffffffff0000000160c083901c105b156200443657506001919050565b506000919050565b600062004495826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620045179092919063ffffffff16565b805190915015620014f05780806020019051810190620044b691906200527e565b620014f05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000bf3565b606062004528848460008562004530565b949350505050565b606082471015620045935760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000bf3565b600080866001600160a01b03168587604051620045b1919062005223565b60006040518083038185875af1925050503d8060008114620045f0576040519150601f19603f3d011682016040523d82523d6000602084013e620045f5565b606091505b509150915062001d038783838760608315620046765782516000036200466e576001600160a01b0385163b6200466e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000bf3565b508162004528565b6200452883838151156200468d5781518083602001fd5b8060405162461bcd60e51b815260040162000bf3919062004c28565b61092e80620052cc83390190565b6001600160a01b038116811462002d4057600080fd5b80356001600160401b03811681146200337d57600080fd5b6000806000806000806000806000806101408b8d0312156200470657600080fd5b8a356200471381620046b7565b99506200472360208c01620046cd565b98506200473360408c01620046cd565b975060608b01356200474581620046b7565b965060808b01356200475781620046b7565b955060a08b01356200476981620046b7565b945060c08b01356200477b81620046b7565b935060e08b01356200478d81620046b7565b92506200479e6101008c01620046cd565b9150620047af6101208c01620046cd565b90509295989b9194979a5092959850565b803563ffffffff811681146200337d57600080fd5b60008060408385031215620047e957600080fd5b620047f483620047c0565b91506200480460208401620046cd565b90509250929050565b6000602082840312156200482057600080fd5b620010f182620047c0565b806103008101831015620010f457600080fd5b6000806000806000806000806103e0898b0312156200485c57600080fd5b6200486789620047c0565b97506200487760208a01620046cd565b96506200488760408a01620046cd565b95506200489760608a01620046cd565b9450620048a760808a01620046cd565b935060a0890135925060c08901359150620048c68a60e08b016200482b565b90509295985092959890939650565b6000806000806000806000806103e0898b031215620048f357600080fd5b620048fe89620047c0565b97506200490e60208a01620046cd565b96506200491e60408a01620046cd565b95506200492e60608a01620046cd565b94506080890135935060a0890135925060c08901356200494e81620046b7565b9150620048c68a60e08b016200482b565b6000602082840312156200497257600080fd5b813561ffff811681146200498557600080fd5b9392505050565b6000602082840312156200499f57600080fd5b5035919050565b60008060408385031215620049ba57600080fd5b823591506020830135620049ce81620046b7565b809150509250929050565b600060208284031215620049ec57600080fd5b620010f182620046cd565b634e487b7160e01b600052604160045260246000fd5b600082601f83011262004a1f57600080fd5b81356001600160401b038082111562004a3c5762004a3c620049f7565b604051601f8301601f19908116603f0116810190828211818310171562004a675762004a67620049f7565b8160405283815286602085880101111562004a8157600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121562004abd57600080fd5b62004ac888620047c0565b965062004ad860208901620046cd565b9550604088013562004aea81620046b7565b9450606088013562004afc81620046b7565b9350608088013562004b0e81620046b7565b925060a08801356001600160401b038082111562004b2b57600080fd5b62004b398b838c0162004a0d565b935060c08a013591508082111562004b5057600080fd5b5062004b5f8a828b0162004a0d565b91505092959891949750929550565b60008060008060008060c0878903121562004b8857600080fd5b62004b9387620047c0565b955062004ba360208801620046cd565b945062004bb360408801620046cd565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004bf157818101518382015260200162004bd7565b50506000910152565b6000815180845262004c1481602086016020860162004bd4565b601f01601f19169290920160200192915050565b602081526000620010f1602083018462004bfa565b6000806040838503121562004c5157600080fd5b62004c5c83620046cd565b946020939093013593505050565b6000806000806060858703121562004c8157600080fd5b843562004c8e81620046b7565b935062004c9e60208601620047c0565b925060408501356001600160401b038082111562004cbb57600080fd5b818701915087601f83011262004cd057600080fd5b81358181111562004ce057600080fd5b88602082850101111562004cf357600080fd5b95989497505060200194505050565b60006020828403121562004d1557600080fd5b81356200498581620046b7565b803560ff811681146200337d57600080fd5b60008060008060008060c0878903121562004d4e57600080fd5b863562004d5b81620046b7565b9550602087013562004d6d81620046b7565b945062004d7d60408801620046cd565b935062004d8d60608801620046cd565b92506080870135915062004da460a0880162004d22565b90509295509295509295565b60008060008060008060c0878903121562004dca57600080fd5b863562004dd781620046b7565b9550602087013562004de981620046b7565b945062004df960408801620046cd565b935062004e096060880162004d22565b92506080870135915060a08701356001600160401b0381111562004e2c57600080fd5b62004e3a89828a0162004a0d565b9150509295509295509295565b8054600090600181811c908083168062004e6257607f831692505b6020808410820362004e8457634e487b7160e01b600052602260045260246000fd5b8388526020880182801562004ea2576001811462004eb95762004ee6565b60ff198716825285151560051b8201975062004ee6565b60008981526020902060005b8781101562004ee05781548482015290860190840162004ec5565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c06040820181905260009062004f219083018762004e47565b828103606084015262004f35818762004e47565b9150508360808301526001600160401b03831660a0830152979650505050505050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004f915762004f9162004f58565b5092915050565b8082028115828204841417620010f457620010f462004f58565b600063ffffffff80831681810362004fce5762004fce62004f58565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620050069083018462004bfa565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c060808201819052600090620050519083018562004bfa565b82810360a084015262005065818562004bfa565b9998505050505050505050565b6001600160401b0382811682821603908082111562004f915762004f9162004f58565b60006001600160401b0380831681810362004fce5762004fce62004f58565b600060208284031215620050c757600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082620050f657620050f6620050ce565b500490565b80820180821115620010f457620010f462004f58565b634e487b7160e01b600052603260045260246000fd5b6000600182016200513c576200513c62004f58565b5060010190565b600082620051555762005155620050ce565b500690565b81810381811115620010f457620010f462004f58565b60008162005182576200518262004f58565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a08201819052600090620052179083018462004bfa565b98975050505050505050565b600082516200523781846020870162004bd4565b9190910192915050565b61032081016103008085843782018360005b60018110156200527457815183526020928301929091019060010162005253565b5050509392505050565b6000602082840312156200529157600080fd5b815180151581146200498557600080fd5b60006001600160401b0380841680620052bf57620052bf620050ce565b9216919091049291505056fe60a06040526040516200092e3803806200092e833981016040819052620000269162000383565b828162000034828262000060565b50506001600160a01b038216608052620000576200005160805190565b620000c6565b50505062000481565b6200006b8262000138565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115620000b857620000b38282620001b8565b505050565b620000c262000235565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620001086000805160206200090e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001358162000257565b50565b806001600160a01b03163b6000036200017457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b031684604051620001d7919062000463565b600060405180830381855af49150503d806000811462000214576040519150601f19603f3d011682016040523d82523d6000602084013e62000219565b606091505b5090925090506200022c8583836200029a565b95945050505050565b3415620002555760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166200028357604051633173bdd160e11b8152600060048201526024016200016b565b806000805160206200090e83398151915262000197565b606082620002b357620002ad8262000300565b620002f9565b8151158015620002cb57506001600160a01b0384163b155b15620002f657604051639996b31560e01b81526001600160a01b03851660048201526024016200016b565b50805b9392505050565b805115620003115780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b03811681146200034257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200037a57818101518382015260200162000360565b50506000910152565b6000806000606084860312156200039957600080fd5b620003a4846200032a565b9250620003b4602085016200032a565b60408501519092506001600160401b0380821115620003d257600080fd5b818601915086601f830112620003e757600080fd5b815181811115620003fc57620003fc62000347565b604051601f8201601f19908116603f0116810190838211818310171562000427576200042762000347565b816040528281528960208487010111156200044157600080fd5b620004548360208301602088016200035d565b80955050505050509250925092565b60008251620004778184602087016200035d565b9190910192915050565b6080516104726200049c6000396000601001526104726000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100e5565b60008061008e36600481846102fd565b81019061009b919061033d565b915091506100a98282610109565b5050565b60006100e07f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610104573d6000f35b3d6000fd5b61011282610164565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561015c5761015782826101e0565b505050565b6100a9610256565b806001600160a01b03163b60000361019f57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101fd919061040d565b600060405180830381855af49150503d8060008114610238576040519150601f19603f3d011682016040523d82523d6000602084013e61023d565b606091505b509150915061024d858383610275565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b60608261028a57610285826102d4565b6102cd565b81511580156102a157506001600160a01b0384163b155b156102ca57604051639996b31560e01b81526001600160a01b0385166004820152602401610196565b50805b9392505050565b8051156102e45780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6000808585111561030d57600080fd5b8386111561031a57600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035057600080fd5b82356001600160a01b038116811461036757600080fd5b9150602083013567ffffffffffffffff8082111561038457600080fd5b818501915085601f83011261039857600080fd5b8135818111156103aa576103aa610327565b604051601f8201601f19908116603f011681019083821181831017156103d2576103d2610327565b816040528281528860208487010111156103eb57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000825160005b8181101561042e5760208186018101518583015201610414565b50600092019182525091905056fea2646970667358221220d51c6fc430c553d1da2391464fd71dbfa43dc91a9531c4d842a3289bb581301664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220088a40e8baaa07c68a28a7d4d3049e902ade8c84c4f07e1bda02246ac30bff2064736f6c63430008140033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620003095760003560e01c806387c20c01116200019d578063c4c928c211620000eb578063dbc16976116200009e578063dbc1697614620009cd578063dde0ff7714620009d7578063e0bfd3d214620009f2578063e46761c41462000a09578063f34eb8eb1462000a31578063f4e926751462000a48578063f9c4c2ae1462000a5957600080fd5b8063c4c928c21462000923578063ceee281d146200093a578063d02103ca1462000963578063d5073f6f146200098b578063d547741f14620009a2578063d939b31514620009b957600080fd5b8063a066215c1162000150578063a066215c1462000797578063a217fddf14620007ae578063a2967d9914620007b7578063a3c573eb14620007c1578063afd23cbe1462000802578063b99d0ad7146200082c578063c1acbc34146200090857600080fd5b806387c20c01146200071a5780638bd4f071146200073157806391d14854146200074857806399f5634e146200075f5780639a908e7314620007695780639c9f3dfe146200078057600080fd5b806325280169116200025b57806360469169116200020e5780636046916914620005c957806365c0504d14620005d35780637222020f1462000682578063727885e914620006995780637975fcfe14620006b05780637fb6e76a14620006d6578063841b24d714620006ff57600080fd5b80632528016914620004825780632f2ff15d146200053757806336568abe146200054e578063394218e91462000565578063477fa270146200057c57806355a71ee0146200058557600080fd5b80631489ed1011620002c05780631489ed1014620003c957806315064c9614620003e05780631608859c14620003ee5780631796a1ae14620004055780631816b7e5146200042c5780632072f6c51462000443578063248a9ca3146200044d57600080fd5b80630645af09146200030e578063066ec0121462000327578063080b311114620003585780630a0d9fbe146200038057806311f6b287146200039b57806312b86e1914620003b2575b600080fd5b620003256200031f366004620046e5565b62000b70565b005b6084546200033b906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b6200036f62000369366004620047d5565b620010d0565b60405190151581526020016200034f565b6085546200033b90600160401b90046001600160401b031681565b6200033b620003ac3660046200480d565b620010fa565b62000325620003c33660046200483e565b6200111a565b62000325620003da366004620048d5565b620012ca565b606f546200036f9060ff1681565b62000325620003ff366004620047d5565b62001460565b607e54620004169063ffffffff1681565b60405163ffffffff90911681526020016200034f565b620003256200043d3660046200495f565b620014f5565b62000325620015a1565b620004736200045e3660046200498c565b60009081526034602052604090206001015490565b6040519081526020016200034f565b6200050362000493366004620047d5565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b039081169183019190915292820151909216908201526060016200034f565b6200032562000548366004620049a6565b62001637565b620003256200055f366004620049a6565b62001660565b6200032562000576366004620049d9565b6200169a565b60865462000473565b6200047362000596366004620047d5565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620004736200174e565b62000638620005e43660046200480d565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c0016200034f565b62000325620006933660046200480d565b62001766565b62000325620006aa36600462004aa1565b62001862565b620006c7620006c136600462004b6e565b62001cdb565b6040516200034f919062004c28565b62000416620006e7366004620049d9565b60836020526000908152604090205463ffffffff1681565b6084546200033b90600160c01b90046001600160401b031681565b620003256200072b366004620048d5565b62001d0e565b62000325620007423660046200483e565b62002038565b6200036f62000759366004620049a6565b620020ee565b6200047362002119565b6200033b6200077a36600462004c3d565b62002200565b6200032562000791366004620049d9565b620023d2565b62000325620007a8366004620049d9565b62002478565b62000473600081565b620004736200251c565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016200034f565b6085546200081890600160801b900461ffff1681565b60405161ffff90911681526020016200034f565b620008c26200083d366004620047d5565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b6040516200034f919060006080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200033b90600160801b90046001600160401b031681565b620003256200093436600462004c6a565b620028f1565b620004166200094b36600462004d02565b60826020526000908152604090205463ffffffff1681565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b620003256200099c3660046200498c565b62002bd0565b62000325620009b3366004620049a6565b62002c6c565b6085546200033b906001600160401b031681565b6200032562002c95565b6084546200033b90600160401b90046001600160401b031681565b6200032562000a0336600462004d34565b62002d43565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b6200032562000a4236600462004db0565b62002dde565b608054620004169063ffffffff1681565b62000af062000a6a3660046200480d565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff16610160820152610180016200034f565b600054600290610100900460ff1615801562000b93575060005460ff8083169116105b62000bfc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c7d62002fda565b62000c9860008051602062005c3a8339815191528c62003047565b62000ca560008862003047565b62000cd17fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908862003047565b62000cfd7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8862003047565b62000d297f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8862003047565b62000d557fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8962003047565b62000d817fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088962003047565b62000dad7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48962003047565b62000dc860008051602062005bfa8339815191528962003047565b62000e0360008051602062005c3a8339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062003053565b62000e2f7f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08962003047565b62000e5b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8962003047565b62000e9660008051602062005c1a8339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162003053565b62000eb160008051602062005c1a8339815191528762003047565b62000edd7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518762003047565b6073546074546001600160401b03600160401b9092048216911680821462000f1857604051632e4cc54360e11b815260040160405180910390fd5b600062000f40888888886000607460009054906101000a90046001600160401b03166200309e565b6001600160401b03838116600081815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068b018054909216909417938802939093179092556007880180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81529596506001600160a01b038e81169663bb59070896620010439694831695600160581b90950490921693607693607793909291169060040162004ef3565b600060405180830381600087803b1580156200105e57600080fd5b505af115801562001073573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620010bb9050565b60405180910390a15050505050505050505050565b63ffffffff82166000908152608160205260408120620010f19083620032cc565b90505b92915050565b63ffffffff81166000908152608160205260408120620010f49062003311565b60008051602062005c3a833981519152620011358162003382565b63ffffffff891660009081526081602052604090206200115c818a8a8a8a8a8a8a6200338e565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b90041615620011c4576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620011fd6200251c565b6040518263ffffffff1660e01b81526004016200121c91815260200190565b600060405180830381600087803b1580156200123757600080fd5b505af11580156200124c573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005c3a833981519152620012e58162003382565b63ffffffff891660009081526081602052604090206200130c818a8a8a8a8a8a8a62003727565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562001374576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620013ad6200251c565b6040518263ffffffff1660e01b8152600401620013cc91815260200190565b600060405180830381600087803b158015620013e757600080fd5b505af1158015620013fc573d6000803e3d6000fd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff821660009081526081602052604090206200149060008051602062005c3a83398151915233620020ee565b620014e457606f5460ff1615620014ba57604051630bc011ff60e21b815260040160405180910390fd5b620014c68183620032cc565b620014e457604051630674f25160e11b815260040160405180910390fd5b620014f0818362003b35565b505050565b60008051602062005bfa833981519152620015108162003382565b6103e88261ffff1610806200152a57506103ff8261ffff16115b156200154957604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620015bc60008051602062005c1a83398151915233620020ee565b6200162b57608454600160801b90046001600160401b031615806200160c57506084544290620016019062093a8090600160801b90046001600160401b031662004f6e565b6001600160401b0316115b156200162b5760405163692baaad60e11b815260040160405180910390fd5b6200163562003d27565b565b600082815260346020526040902060010154620016548162003382565b620014f0838362003da6565b6001600160a01b03811633146200168a57604051630b4ad1cd60e31b815260040160405180910390fd5b62001696828262003e12565b5050565b60008051602062005bfa833981519152620016b58162003382565b606f5460ff16620016f7576084546001600160401b03600160c01b909104811690831610620016f75760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19060200162001595565b6000608654606462001761919062004f98565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd620017928162003382565b63ffffffff82161580620017b15750607e5463ffffffff908116908316115b15620017d057604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200181757604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd086200188e8162003382565b63ffffffff88161580620018ad5750607e5463ffffffff908116908916115b15620018cc57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff16151590036200191357604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001951576040516337c8fe0960e11b815260040160405180910390fd5b608080546000919082906200196c9063ffffffff1662004fb2565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b03909216913091620019ba90620046a9565b620019c89392919062004fd8565b604051809103906000f080158015620019e5573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001c59949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001c99908d908d9088908e908e908e906004016200500f565b600060405180830381600087803b15801562001cb457600080fd5b505af115801562001cc9573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001d0390878787878762003e7c565b979650505050505050565b606f5460ff161562001d3357604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001d8292600160c01b90048116911662004f6e565b6001600160401b0316111562001dab57604051638a0704d360e01b815260040160405180910390fd5b6103e862001dba888862005072565b6001600160401b0316111562001de357604051635acfba9d60e11b815260040160405180910390fd5b62001df5818989898989898962003727565b62001e01818762003fbc565b6085546001600160401b031660000362001f0f57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001e7d576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001eb66200251c565b6040518263ffffffff1660e01b815260040162001ed591815260200190565b600060405180830381600087803b15801562001ef057600080fd5b505af115801562001f05573d6000803e3d6000fd5b5050505062001fd9565b62001f1a81620041b9565b600681018054600160801b90046001600160401b031690601062001f3e8362005095565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff16156200205d57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602052604090206200208481898989898989896200338e565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620020e362003d27565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b815230600482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562002183573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620021a99190620050b4565b608454909150600090620021d0906001600160401b03600160401b82048116911662005072565b6001600160401b0316905080600003620021ed5760009250505090565b620021f98183620050e4565b9250505090565b606f5460009060ff16156200222857604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362002260576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200228b57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620022be9084906001600160401b031662004f6e565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620022f4878362004f6e565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200238483620041b9565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b60008051602062005bfa833981519152620023ed8162003382565b606f5460ff1662002428576085546001600160401b0390811690831610620024285760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759060200162001595565b60008051602062005bfa833981519152620024938162003382565b62015180826001600160401b03161115620024c157604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289060200162001595565b60805460009063ffffffff168082036200253857506000919050565b6000816001600160401b03811115620025555762002555620049f7565b6040519080825280602002602001820160405280156200257f578160200160208202803683370190505b50905060005b82811015620025f257608160006200259f836001620050fb565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620025d257620025d262005111565b602090810291909101015280620025e98162005127565b91505062002585565b50600060205b836001146200284e5760006200261060028662005143565b6200261d600287620050e4565b620026299190620050fb565b90506000816001600160401b03811115620026485762002648620049f7565b60405190808252806020026020018201604052801562002672578160200160208202803683370190505b50905060005b82811015620027fa576200268e6001846200515a565b81148015620026a95750620026a560028862005143565b6001145b15620027315785620026bd82600262004f98565b81518110620026d057620026d062005111565b602002602001015185604051602001620026f4929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106200271f576200271f62005111565b602002602001018181525050620027e5565b856200273f82600262004f98565b8151811062002752576200275262005111565b6020026020010151868260026200276a919062004f98565b62002777906001620050fb565b815181106200278a576200278a62005111565b6020026020010151604051602001620027ad929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620027d857620027d862005111565b6020026020010181815250505b80620027f18162005127565b91505062002678565b5080945081955083846040516020016200281e929190918252602082015260400190565b6040516020818303038152906040528051906020012093508280620028439062005170565b9350505050620025f8565b60008360008151811062002866576200286662005111565b6020026020010151905060005b82811015620028e757604080516020810184905290810185905260600160408051601f19818403018152828252805160209182012090830187905290820186905292506060016040516020818303038152906040528051906020012093508080620028de9062005127565b91505062002873565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac6200291d8162003382565b63ffffffff841615806200293c5750607e5463ffffffff908116908516115b156200295b57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff16908190036200299c576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b031603620029eb57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002a3257604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002a7057604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002af084620010fa565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002b469216908b908b906004016200518a565b600060405180830381600087803b15801562002b6157600080fd5b505af115801562002b76573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002bfc8162003382565b683635c9adc5dea0000082118062002c175750633b9aca0082105b1562002c3657604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001595565b60008281526034602052604090206001015462002c898162003382565b620014f0838362003e12565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002cc18162003382565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002d1d57600080fd5b505af115801562002d32573d6000803e3d6000fd5b5050505062002d4062004284565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62002d6f8162003382565b6001600160401b03841660009081526083602052604090205463ffffffff161562002dad576040516337c8fe0960e11b815260040160405180910390fd5b600062002dc0888888888760006200309e565b60008080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002e0a8162003382565b607e805460009190829062002e259063ffffffff1662004fb2565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002fc896959493929190620051ca565b60405180910390a25050505050505050565b600054610100900460ff16620016355760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000bf3565b62001696828262003da6565b600082815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6080805460009182918290620030ba9063ffffffff1662004fb2565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000876001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff16021790555080608260008a6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150878260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550868260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620032b99594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b03828116600090815260048501602052604081205490924292620032ff92918116911662004f6e565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b03161562003365575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002d408133620042dd565b60078801546000906001600160401b039081169087161015620033c45760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620034655760068901546001600160401b03600160801b909104811690891611156200340e5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200345e57604051632bd2e3e760e01b815260040160405180910390fd5b50620034da565b506001600160401b038516600090815260028901602052604090205480620034a0576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620034da57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620035135750876001600160401b0316876001600160401b031611155b8062003537575060068901546001600160401b03600160c01b909104811690881611155b15620035565760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b90048116908616146200359d576040516332a2a77f60e01b815260040160405180910390fd5b6000620035af8a888888868962003e7c565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620035e6919062005223565b602060405180830381855afa15801562003604573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620036299190620050b4565b62003635919062005143565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620036799188919060040162005241565b602060405180830381865afa15801562003697573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620036bd91906200527e565b620036db576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c0160205260409020600201548590036200371a5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620037358a62003311565b60078b01549091506001600160401b0390811690891610156200376b5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038916156200380e5760068a01546001600160401b03600160801b9091048116908a161115620037b55760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200380757604051632bd2e3e760e01b815260040160405180910390fd5b506200387e565b6001600160401b038816600090815260028b0160205260409020549150816200384a576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200387e57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620038b15760405163b9b18f5760e01b815260040160405180910390fd5b6000620038c38b8a8a8a878b62003e7c565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620038fa919062005223565b602060405180830381855afa15801562003918573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200393d9190620050b4565b62003949919062005143565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200398d9189919060040162005241565b602060405180830381865afa158015620039ab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620039d191906200527e565b620039ef576040516309bde33960e01b815260040160405180910390fd5b6000620039fd848b62005072565b905062003a5687826001600160401b031662003a1862002119565b62003a24919062004f98565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004307565b80608460088282829054906101000a90046001600160401b031662003a7c919062004f6e565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b15801562003b0d57600080fd5b505af115801562003b22573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003b74575060068201546001600160401b03600160801b9091048116908216115b1562003b935760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003c4f6200251c565b6040518263ffffffff1660e01b815260040162003c6e91815260200190565b600060405180830381600087803b15801562003c8957600080fd5b505af115801562003c9e573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003d8357600080fd5b505af115801562003d98573d6000803e3d6000fd5b50505050620016356200435b565b62003db28282620020ee565b620016965760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003e1e8282620020ee565b15620016965760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003eb2575081155b1562003ed15760405163340c614f60e11b815260040160405180910390fd5b8062003ef0576040516366385b5160e01b815260040160405180910390fd5b62003efb84620043b8565b62003f19576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b600062003fc98362003311565b90508160008062003fdb848462005072565b6085546001600160401b0391821692506000916200400291600160401b900416426200515a565b90505b846001600160401b0316846001600160401b0316146200408c576001600160401b0380851660009081526003890160205260409020600181015490911682101562004067576001810154600160401b90046001600160401b0316945062004085565b62004073868662005072565b6001600160401b03169350506200408c565b5062004005565b60006200409a84846200515a565b905083811015620040f857808403600c8111620040b85780620040bb565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620040ed57620040ed620050ce565b046086555062004170565b838103600c81116200410b57806200410e565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a76400000281620041485762004148620050ce565b04905080608654670de0b6b3a76400000281620041695762004169620050ce565b0460865550505b683635c9adc5dea0000060865411156200419757683635c9adc5dea00000608655620041af565b633b9aca006086541015620041af57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002d405760068101546000906200420490600160c01b90046001600160401b0316600162004f6e565b9050620042128282620032cc565b156200169657600682015460009060029062004240908490600160801b90046001600160401b031662005072565b6200424c9190620052a2565b62004258908362004f6e565b9050620042668382620032cc565b156200427857620014f0838262003b35565b620014f0838362003b35565b606f5460ff16620042a857604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b620042e98282620020ee565b6200169657604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620014f09084906200443e565b606f5460ff16156200438057604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b038316108015620043ef575067ffffffff00000001604083901c6001600160401b0316105b801562004410575067ffffffff00000001608083901c6001600160401b0316105b801562004428575067ffffffff0000000160c083901c105b156200443657506001919050565b506000919050565b600062004495826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620045179092919063ffffffff16565b805190915015620014f05780806020019051810190620044b691906200527e565b620014f05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000bf3565b606062004528848460008562004530565b949350505050565b606082471015620045935760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000bf3565b600080866001600160a01b03168587604051620045b1919062005223565b60006040518083038185875af1925050503d8060008114620045f0576040519150601f19603f3d011682016040523d82523d6000602084013e620045f5565b606091505b509150915062001d038783838760608315620046765782516000036200466e576001600160a01b0385163b6200466e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000bf3565b508162004528565b6200452883838151156200468d5781518083602001fd5b8060405162461bcd60e51b815260040162000bf3919062004c28565b61092e80620052cc83390190565b6001600160a01b038116811462002d4057600080fd5b80356001600160401b03811681146200337d57600080fd5b6000806000806000806000806000806101408b8d0312156200470657600080fd5b8a356200471381620046b7565b99506200472360208c01620046cd565b98506200473360408c01620046cd565b975060608b01356200474581620046b7565b965060808b01356200475781620046b7565b955060a08b01356200476981620046b7565b945060c08b01356200477b81620046b7565b935060e08b01356200478d81620046b7565b92506200479e6101008c01620046cd565b9150620047af6101208c01620046cd565b90509295989b9194979a5092959850565b803563ffffffff811681146200337d57600080fd5b60008060408385031215620047e957600080fd5b620047f483620047c0565b91506200480460208401620046cd565b90509250929050565b6000602082840312156200482057600080fd5b620010f182620047c0565b806103008101831015620010f457600080fd5b6000806000806000806000806103e0898b0312156200485c57600080fd5b6200486789620047c0565b97506200487760208a01620046cd565b96506200488760408a01620046cd565b95506200489760608a01620046cd565b9450620048a760808a01620046cd565b935060a0890135925060c08901359150620048c68a60e08b016200482b565b90509295985092959890939650565b6000806000806000806000806103e0898b031215620048f357600080fd5b620048fe89620047c0565b97506200490e60208a01620046cd565b96506200491e60408a01620046cd565b95506200492e60608a01620046cd565b94506080890135935060a0890135925060c08901356200494e81620046b7565b9150620048c68a60e08b016200482b565b6000602082840312156200497257600080fd5b813561ffff811681146200498557600080fd5b9392505050565b6000602082840312156200499f57600080fd5b5035919050565b60008060408385031215620049ba57600080fd5b823591506020830135620049ce81620046b7565b809150509250929050565b600060208284031215620049ec57600080fd5b620010f182620046cd565b634e487b7160e01b600052604160045260246000fd5b600082601f83011262004a1f57600080fd5b81356001600160401b038082111562004a3c5762004a3c620049f7565b604051601f8301601f19908116603f0116810190828211818310171562004a675762004a67620049f7565b8160405283815286602085880101111562004a8157600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121562004abd57600080fd5b62004ac888620047c0565b965062004ad860208901620046cd565b9550604088013562004aea81620046b7565b9450606088013562004afc81620046b7565b9350608088013562004b0e81620046b7565b925060a08801356001600160401b038082111562004b2b57600080fd5b62004b398b838c0162004a0d565b935060c08a013591508082111562004b5057600080fd5b5062004b5f8a828b0162004a0d565b91505092959891949750929550565b60008060008060008060c0878903121562004b8857600080fd5b62004b9387620047c0565b955062004ba360208801620046cd565b945062004bb360408801620046cd565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004bf157818101518382015260200162004bd7565b50506000910152565b6000815180845262004c1481602086016020860162004bd4565b601f01601f19169290920160200192915050565b602081526000620010f1602083018462004bfa565b6000806040838503121562004c5157600080fd5b62004c5c83620046cd565b946020939093013593505050565b6000806000806060858703121562004c8157600080fd5b843562004c8e81620046b7565b935062004c9e60208601620047c0565b925060408501356001600160401b038082111562004cbb57600080fd5b818701915087601f83011262004cd057600080fd5b81358181111562004ce057600080fd5b88602082850101111562004cf357600080fd5b95989497505060200194505050565b60006020828403121562004d1557600080fd5b81356200498581620046b7565b803560ff811681146200337d57600080fd5b60008060008060008060c0878903121562004d4e57600080fd5b863562004d5b81620046b7565b9550602087013562004d6d81620046b7565b945062004d7d60408801620046cd565b935062004d8d60608801620046cd565b92506080870135915062004da460a0880162004d22565b90509295509295509295565b60008060008060008060c0878903121562004dca57600080fd5b863562004dd781620046b7565b9550602087013562004de981620046b7565b945062004df960408801620046cd565b935062004e096060880162004d22565b92506080870135915060a08701356001600160401b0381111562004e2c57600080fd5b62004e3a89828a0162004a0d565b9150509295509295509295565b8054600090600181811c908083168062004e6257607f831692505b6020808410820362004e8457634e487b7160e01b600052602260045260246000fd5b8388526020880182801562004ea2576001811462004eb95762004ee6565b60ff198716825285151560051b8201975062004ee6565b60008981526020902060005b8781101562004ee05781548482015290860190840162004ec5565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c06040820181905260009062004f219083018762004e47565b828103606084015262004f35818762004e47565b9150508360808301526001600160401b03831660a0830152979650505050505050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004f915762004f9162004f58565b5092915050565b8082028115828204841417620010f457620010f462004f58565b600063ffffffff80831681810362004fce5762004fce62004f58565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620050069083018462004bfa565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c060808201819052600090620050519083018562004bfa565b82810360a084015262005065818562004bfa565b9998505050505050505050565b6001600160401b0382811682821603908082111562004f915762004f9162004f58565b60006001600160401b0380831681810362004fce5762004fce62004f58565b600060208284031215620050c757600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082620050f657620050f6620050ce565b500490565b80820180821115620010f457620010f462004f58565b634e487b7160e01b600052603260045260246000fd5b6000600182016200513c576200513c62004f58565b5060010190565b600082620051555762005155620050ce565b500690565b81810381811115620010f457620010f462004f58565b60008162005182576200518262004f58565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a08201819052600090620052179083018462004bfa565b98975050505050505050565b600082516200523781846020870162004bd4565b9190910192915050565b61032081016103008085843782018360005b60018110156200527457815183526020928301929091019060010162005253565b5050509392505050565b6000602082840312156200529157600080fd5b815180151581146200498557600080fd5b60006001600160401b0380841680620052bf57620052bf620050ce565b9216919091049291505056fe60a06040526040516200092e3803806200092e833981016040819052620000269162000383565b828162000034828262000060565b50506001600160a01b038216608052620000576200005160805190565b620000c6565b50505062000481565b6200006b8262000138565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115620000b857620000b38282620001b8565b505050565b620000c262000235565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620001086000805160206200090e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001358162000257565b50565b806001600160a01b03163b6000036200017457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b031684604051620001d7919062000463565b600060405180830381855af49150503d806000811462000214576040519150601f19603f3d011682016040523d82523d6000602084013e62000219565b606091505b5090925090506200022c8583836200029a565b95945050505050565b3415620002555760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166200028357604051633173bdd160e11b8152600060048201526024016200016b565b806000805160206200090e83398151915262000197565b606082620002b357620002ad8262000300565b620002f9565b8151158015620002cb57506001600160a01b0384163b155b15620002f657604051639996b31560e01b81526001600160a01b03851660048201526024016200016b565b50805b9392505050565b805115620003115780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b03811681146200034257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200037a57818101518382015260200162000360565b50506000910152565b6000806000606084860312156200039957600080fd5b620003a4846200032a565b9250620003b4602085016200032a565b60408501519092506001600160401b0380821115620003d257600080fd5b818601915086601f830112620003e757600080fd5b815181811115620003fc57620003fc62000347565b604051601f8201601f19908116603f0116810190838211818310171562000427576200042762000347565b816040528281528960208487010111156200044157600080fd5b620004548360208301602088016200035d565b80955050505050509250925092565b60008251620004778184602087016200035d565b9190910192915050565b6080516104726200049c6000396000601001526104726000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100e5565b60008061008e36600481846102fd565b81019061009b919061033d565b915091506100a98282610109565b5050565b60006100e07f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610104573d6000f35b3d6000fd5b61011282610164565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561015c5761015782826101e0565b505050565b6100a9610256565b806001600160a01b03163b60000361019f57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101fd919061040d565b600060405180830381855af49150503d8060008114610238576040519150601f19603f3d011682016040523d82523d6000602084013e61023d565b606091505b509150915061024d858383610275565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b60608261028a57610285826102d4565b6102cd565b81511580156102a157506001600160a01b0384163b155b156102ca57604051639996b31560e01b81526001600160a01b0385166004820152602401610196565b50805b9392505050565b8051156102e45780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6000808585111561030d57600080fd5b8386111561031a57600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035057600080fd5b82356001600160a01b038116811461036757600080fd5b9150602083013567ffffffffffffffff8082111561038457600080fd5b818501915085601f83011261039857600080fd5b8135818111156103aa576103aa610327565b604051601f8201601f19908116603f011681019083821181831017156103d2576103d2610327565b816040528281528860208487010111156103eb57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000825160005b8181101561042e5760208186018101518583015201610414565b50600092019182525091905056fea2646970667358221220d51c6fc430c553d1da2391464fd71dbfa43dc91a9531c4d842a3289bb581301664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220088a40e8baaa07c68a28a7d4d3049e902ade8c84c4f07e1bda02246ac30bff2064736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonRollupManagerMock.json b/compiled-contracts/paris/PolygonRollupManagerMock.json index 3decd0c27..50e1e4c7c 100644 --- a/compiled-contracts/paris/PolygonRollupManagerMock.json +++ b/compiled-contracts/paris/PolygonRollupManagerMock.json @@ -236,6 +236,12 @@ "internalType": "uint8", "name": "rollupCompatibilityID", "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "lastVerifiedBatchBeforeUpgrade", + "type": "uint64" } ], "name": "AddExistingRollup", @@ -1266,6 +1272,16 @@ "internalType": "contract IVerifierRollup", "name": "zkEVMVerifier", "type": "address" + }, + { + "internalType": "uint64", + "name": "zkEVMForkID", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "zkEVMChainID", + "type": "uint64" } ], "name": "initialize", @@ -1982,8 +1998,8 @@ "type": "function" } ], - "bytecode": "0x60e06040523480156200001157600080fd5b50604051620061a5380380620061a583398101604081905262000034916200006b565b6001600160a01b0392831660805290821660c0521660a052620000bf565b6001600160a01b03811681146200006857600080fd5b50565b6000806000606084860312156200008157600080fd5b83516200008e8162000052565b6020850151909350620000a18162000052565b6040850151909250620000b48162000052565b809150509250925092565b60805160a05160c05161607e62000127600039600081816109bc015281816122ba015261390a01526000818161078201528181612e090152613c0401526000818161091601528181610eca0152818161107a01528181611f9a0152613af3015261607e6000f3fe60806040523480156200001157600080fd5b5060043610620002aa5760003560e01c8063066ec01214620002af578063080b311114620002db5780630a0d9fbe14620003035780630e36f582146200031e57806311f6b287146200033757806312b86e19146200034e5780631489ed10146200036557806315064c96146200037c5780631608859c146200038a5780631796a1ae14620003a15780631816b7e514620003c85780632072f6c514620003df578063248a9ca314620003e957806325280169146200040f5780632f2ff15d14620004c457806336568abe14620004db578063394218e914620004f2578063477fa27014620005095780634d4d3338146200051257806355a71ee0146200052957806360469169146200056d57806365c0504d14620005775780637222020f1462000626578063727885e9146200063d5780637975fcfe14620006545780637fb6e76a146200067a578063841b24d714620006a357806387c20c0114620006be5780638bd4f07114620006d55780638f698ec514620006ec57806391d14854146200070357806399f5634e146200071a5780639a908e7314620007245780639c9f3dfe146200073b578063a066215c1462000752578063a217fddf1462000769578063a2967d991462000772578063a3c573eb146200077c578063afd23cbe14620007b3578063b99d0ad714620007dd578063c1acbc3414620008b5578063c4c928c214620008d0578063ceee281d14620008e7578063d02103ca1462000910578063d5073f6f1462000938578063d547741f146200094f578063d939b3151462000966578063dbc16976146200097a578063dde0ff771462000984578063e0bfd3d2146200099f578063e46761c414620009b6578063f34eb8eb14620009de578063f4e9267514620009f5578063f9c4c2ae1462000a06575b600080fd5b608454620002c3906001600160401b031681565b604051620002d29190620047b2565b60405180910390f35b620002f2620002ec366004620047f3565b62000b1d565b6040519015158152602001620002d2565b608554620002c390600160401b90046001600160401b031681565b620003356200032f36600462004841565b62000b47565b005b620002c362000348366004620048cc565b62000dfe565b620003356200035f366004620048fd565b62000e1e565b620003356200037636600462004994565b62000fce565b606f54620002f29060ff1681565b620003356200039b366004620047f3565b6200115e565b607e54620003b29063ffffffff1681565b60405163ffffffff9091168152602001620002d2565b62000335620003d936600462004a1e565b620011f3565b620003356200129f565b62000400620003fa36600462004a4b565b62001335565b604051908152602001620002d2565b6200049062000420366004620047f3565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002d2565b62000335620004d536600462004a65565b6200134a565b62000335620004ec36600462004a65565b6200136c565b620003356200050336600462004a98565b620013a6565b60865462000400565b620003356200052336600462004ab6565b62001455565b620004006200053a366004620047f3565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620004006200188b565b620005dc62000588366004620048cc565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002d2565b6200033562000637366004620048cc565b620018a3565b620003356200064e36600462004c2b565b6200198e565b6200066b6200066536600462004cf8565b62001df6565b604051620002d2919062004db2565b620003b26200068b36600462004a98565b60836020526000908152604090205463ffffffff1681565b608454620002c390600160c01b90046001600160401b031681565b62000335620006cf36600462004994565b62001e29565b62000335620006e6366004620048fd565b6200214d565b62000335620006fd36600462004dc7565b62002203565b620002f26200071436600462004a65565b6200228a565b62000400620022b5565b620002c36200073536600462004e77565b620023a1565b620003356200074c36600462004a98565b6200256e565b620003356200076336600462004a98565b62002611565b62000400600081565b62000400620026b0565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b604051620002d2919062004ea4565b608554620007c990600160801b900461ffff1681565b60405161ffff9091168152602001620002d2565b62000873620007ee366004620047f3565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002d2919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002c390600160801b90046001600160401b031681565b62000335620008e136600462004eb8565b62002a72565b620003b2620008f836600462004f50565b60826020526000908152604090205463ffffffff1681565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b620003356200094936600462004a4b565b62002d3f565b620003356200096036600462004a65565b62002dca565b608554620002c3906001600160401b031681565b6200033562002dec565b608454620002c390600160401b90046001600160401b031681565b62000335620009b036600462004f82565b62002e89565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b62000335620009ef36600462004ffe565b62002f11565b608054620003b29063ffffffff1681565b62000a9d62000a17366004620048cc565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002d2565b63ffffffff8216600090815260816020526040812062000b3e9083620030fc565b90505b92915050565b600054600290610100900460ff1615801562000b6a575060005460ff8083169116105b62000b925760405162461bcd60e51b815260040162000b899062005095565b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c1362003141565b62000c2e6000805160206200602983398151915288620031ae565b62000c3b600084620031ae565b62000c5660008051602062005f0983398151915284620031ae565b62000c7160008051602062005f8983398151915284620031ae565b62000c8c60008051602062005ea983398151915284620031ae565b62000ca760008051602062005ee983398151915285620031ae565b62000cc26000805160206200600983398151915285620031ae565b62000cdd60008051602062005f2983398151915285620031ae565b62000cf860008051602062005fa983398151915285620031ae565b62000d226000805160206200602983398151915260008051602062005e89833981519152620031ba565b62000d3d60008051602062005e8983398151915285620031ae565b62000d5860008051602062005ec983398151915285620031ae565b62000d8260008051602062005fe983398151915260008051602062005fc9833981519152620031ba565b62000d9d60008051602062005fe983398151915283620031ae565b62000db860008051602062005fc983398151915283620031ae565b62000dc5600033620031ae565b6000805461ff001916905560405160ff8216815260008051602062005f698339815191529060200160405180910390a150505050505050565b63ffffffff8116600090815260816020526040812062000b41906200320f565b6000805160206200602983398151915262000e398162003280565b63ffffffff8916600090815260816020526040902062000e60818a8a8a8a8a8a8a6200328c565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000ec8576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000f01620026b0565b6040518263ffffffff1660e01b815260040162000f2091815260200190565b600060405180830381600087803b15801562000f3b57600080fd5b505af115801562000f50573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b6000805160206200602983398151915262000fe98162003280565b63ffffffff8916600090815260816020526040902062001010818a8a8a8a8a8a8a62003614565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562001078576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620010b1620026b0565b6040518263ffffffff1660e01b8152600401620010d091815260200190565b600060405180830381600087803b158015620010eb57600080fd5b505af115801562001100573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a6040516200114a93929190620050e3565b60405180910390a350505050505050505050565b63ffffffff821660009081526081602052604090206200118e60008051602062006029833981519152336200228a565b620011e257606f5460ff1615620011b857604051630bc011ff60e21b815260040160405180910390fd5b620011c48183620030fc565b620011e257604051630674f25160e11b815260040160405180910390fd5b620011ee818362003a10565b505050565b60008051602062005fa98339815191526200120e8162003280565b6103e88261ffff1610806200122857506103ff8261ffff16115b156200124757604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620012ba60008051602062005fe9833981519152336200228a565b6200132957608454600160801b90046001600160401b031615806200130a57506084544290620012ff9062093a8090600160801b90046001600160401b03166200511a565b6001600160401b0316115b15620013295760405163692baaad60e11b815260040160405180910390fd5b6200133362003c02565b565b60009081526034602052604090206001015490565b620013558262001335565b620013608162003280565b620011ee838362003c81565b6001600160a01b03811633146200139657604051630b4ad1cd60e31b815260040160405180910390fd5b620013a2828262003ced565b5050565b60008051602062005fa9833981519152620013c18162003280565b606f5460ff1662001403576084546001600160401b03600160c01b909104811690831610620014035760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19062001293908490620047b2565b600054600290610100900460ff1615801562001478575060005460ff8083169116105b620014975760405162461bcd60e51b815260040162000b899062005095565b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200151862003141565b62001533600080516020620060298339815191528a620031ae565b62001540600086620031ae565b6200155b60008051602062005f0983398151915286620031ae565b6200157660008051602062005f8983398151915286620031ae565b6200159160008051602062005ea983398151915286620031ae565b620015ac60008051602062005ee983398151915287620031ae565b620015c76000805160206200600983398151915287620031ae565b620015e260008051602062005f2983398151915287620031ae565b620015fd60008051602062005fa983398151915287620031ae565b620016276000805160206200602983398151915260008051602062005e89833981519152620031ba565b6200164260008051602062005e8983398151915287620031ae565b6200165d60008051602062005ec983398151915287620031ae565b6200168760008051602062005fe983398151915260008051602062005fc9833981519152620031ba565b620016a260008051602062005fe983398151915285620031ae565b620016bd60008051602062005fc983398151915285620031ae565b6000620016d28484600561044d600062003d57565b6073546074549192506001600160401b03600160401b909104811691168082146200171057604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b0381811660008181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620018119695831695600160581b9091049092169360769360779391929190911690600401620051f0565b600060405180830381600087803b1580156200182c57600080fd5b505af115801562001841573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff8516815260008051602062005f6983398151915293506020019150620018789050565b60405180910390a1505050505050505050565b600060865460646200189e919062005256565b905090565b60008051602062005ee9833981519152620018be8162003280565b63ffffffff82161580620018dd5750607e5463ffffffff908116908316115b15620018fc57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200194357604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b60008051602062006009833981519152620019a98162003280565b63ffffffff88161580620019c85750607e5463ffffffff908116908916115b15620019e757604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff161515900362001a2e57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001a6c576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062001a879063ffffffff1662005270565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001ad590620047a4565b62001ae39392919062005296565b604051809103906000f08015801562001b00573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001d74949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001db4908d908d9088908e908e908e90600401620052cd565b600060405180830381600087803b15801562001dcf57600080fd5b505af115801562001de4573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001e1e90878787878762003f7c565b979650505050505050565b606f5460ff161562001e4e57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001e9d92600160c01b9004811691166200511a565b6001600160401b0316111562001ec657604051638a0704d360e01b815260040160405180910390fd5b6103e862001ed5888862005330565b6001600160401b0316111562001efe57604051635acfba9d60e11b815260040160405180910390fd5b62001f10818989898989898962003614565b62001f1c8187620040b7565b6085546001600160401b03166000036200202a57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001f98576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001fd1620026b0565b6040518263ffffffff1660e01b815260040162001ff091815260200190565b600060405180830381600087803b1580156200200b57600080fd5b505af115801562002020573d6000803e3d6000fd5b50505050620020f4565b6200203581620042b4565b600681018054600160801b90046001600160401b0316906010620020598362005353565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b48887896040516200213a93929190620050e3565b60405180910390a3505050505050505050565b606f5460ff16156200217257604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602052604090206200219981898989898989896200328c565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620021f862003c02565b505050505050505050565b80516080805463ffffffff191663ffffffff90921691909117905560005b8151811015620013a2578181815181106200224057620022406200537a565b6020026020010151608160008360016200225b919062005390565b63ffffffff168152602081019190915260400160002060050155806200228181620053a6565b91505062002221565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162002306919062004ea4565b602060405180830381865afa15801562002324573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200234a9190620053c2565b60845490915060009062002371906001600160401b03600160401b82048116911662005330565b6001600160401b03169050806000036200238e5760009250505090565b6200239a8183620053f2565b9250505090565b606f5460009060ff1615620023c957604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362002401576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200242c57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff8116600090815260816020526040812060848054919287926200245f9084906001600160401b03166200511a565b82546101009290920a6001600160401b03818102199093169183160217909155600683015416905060006200249587836200511a565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200252483620042b4565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a25826040516200255c9190620047b2565b60405180910390a29695505050505050565b60008051602062005fa9833981519152620025898162003280565b606f5460ff16620025c4576085546001600160401b0390811690831610620025c45760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759062001293908490620047b2565b60008051602062005fa98339815191526200262c8162003280565b62015180826001600160401b031611156200265a57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289062001293908490620047b2565b60805460009063ffffffff16808203620026cc57506000919050565b6000816001600160401b03811115620026e957620026e962004b6c565b60405190808252806020026020018201604052801562002713578160200160208202803683370190505b50905060005b828110156200278657608160006200273383600162005390565b63ffffffff1663ffffffff168152602001908152602001600020600501548282815181106200276657620027666200537a565b6020908102919091010152806200277d81620053a6565b91505062002719565b50600060205b83600114620029ca576000620027a460028662005409565b620027b1600287620053f2565b620027bd919062005390565b90506000816001600160401b03811115620027dc57620027dc62004b6c565b60405190808252806020026020018201604052801562002806578160200160208202803683370190505b50905060005b828110156200297e576200282260018462005420565b811480156200283d57506200283960028862005409565b6001145b15620028bd57856200285182600262005256565b815181106200286457620028646200537a565b6020026020010151856040516020016200288092919062005436565b60405160208183030381529060405280519060200120828281518110620028ab57620028ab6200537a565b60200260200101818152505062002969565b85620028cb82600262005256565b81518110620028de57620028de6200537a565b602002602001015186826002620028f6919062005256565b6200290390600162005390565b815181106200291657620029166200537a565b60200260200101516040516020016200293192919062005436565b604051602081830303815290604052805190602001208282815181106200295c576200295c6200537a565b6020026020010181815250505b806200297581620053a6565b9150506200280c565b5080945081955083846040516020016200299a92919062005436565b6040516020818303038152906040528051906020012093508280620029bf9062005444565b93505050506200278c565b600083600081518110620029e257620029e26200537a565b6020026020010151905060005b8281101562002a6857818460405160200162002a0d92919062005436565b604051602081830303815290604052805190602001209150838460405160200162002a3a92919062005436565b604051602081830303815290604052805190602001209350808062002a5f90620053a6565b915050620029ef565b5095945050505050565b60008051602062005ea983398151915262002a8d8162003280565b63ffffffff8416158062002aac5750607e5463ffffffff908116908516115b1562002acb57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002b0c576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002b5b57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002ba257604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002be057604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002c608462000dfe565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002cb59216908b908b906004016200545e565b600060405180830381600087803b15801562002cd057600080fd5b505af115801562002ce5573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005ec983398151915262002d5a8162003280565b683635c9adc5dea0000082118062002d755750633b9aca0082105b1562002d9457604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001293565b62002dd58262001335565b62002de08162003280565b620011ee838362003ced565b60008051602062005f2983398151915262002e078162003280565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002e6357600080fd5b505af115801562002e78573d6000803e3d6000fd5b5050505062002e866200437f565b50565b60008051602062005f8983398151915262002ea48162003280565b6001600160401b03841660009081526083602052604090205463ffffffff161562002ee2576040516337c8fe0960e11b815260040160405180910390fd5b600062002ef3888888888762003d57565b60008080526002909101602052604090209390935550505050505050565b60008051602062005f0983398151915262002f2c8162003280565b607e805460009190829062002f479063ffffffff1662005270565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620030ea969594939291906200549e565b60405180910390a25050505050505050565b6085546001600160401b038281166000908152600485016020526040812054909242926200312f9291811691166200511a565b6001600160401b031611159392505050565b600054610100900460ff16620013335760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b89565b620013a2828262003c81565b6000620031c78362001335565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6006810154600090600160801b90046001600160401b03161562003263575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002e868133620043d8565b60078801546000906001600160401b039081169087161015620032c25760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620033635760068901546001600160401b03600160801b909104811690891611156200330c5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200335c57604051632bd2e3e760e01b815260040160405180910390fd5b50620033d8565b506001600160401b0385166000908152600289016020526040902054806200339e576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620033d857604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620034115750876001600160401b0316876001600160401b031611155b8062003435575060068901546001600160401b03600160c01b909104811690881611155b15620034545760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b90048116908616146200349b576040516332a2a77f60e01b815260040160405180910390fd5b6000620034ad8a888888868962003f7c565b9050600060008051602062005f49833981519152600283604051620034d39190620054eb565b602060405180830381855afa158015620034f1573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620035169190620053c2565b62003522919062005409565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620035669188919060040162005509565b602060405180830381865afa15801562003584573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620035aa919062005546565b620035c8576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620036075760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620036228a6200320f565b60078b01549091506001600160401b039081169089161015620036585760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620036fb5760068a01546001600160401b03600160801b9091048116908a161115620036a25760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620036f457604051632bd2e3e760e01b815260040160405180910390fd5b506200376b565b6001600160401b038816600090815260028b01602052604090205491508162003737576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200376b57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b0316116200379e5760405163b9b18f5760e01b815260040160405180910390fd5b6000620037b08b8a8a8a878b62003f7c565b9050600060008051602062005f49833981519152600283604051620037d69190620054eb565b602060405180830381855afa158015620037f4573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620038199190620053c2565b62003825919062005409565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620038699189919060040162005509565b602060405180830381865afa15801562003887573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620038ad919062005546565b620038cb576040516309bde33960e01b815260040160405180910390fd5b6000620038d9848b62005330565b90506200393287826001600160401b0316620038f4620022b5565b62003900919062005256565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004402565b80608460088282829054906101000a90046001600160401b03166200395891906200511a565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b158015620039e857600080fd5b505af1158015620039fd573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003a4f575060068201546001600160401b03600160801b9091048116908216115b1562003a6e5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003b2a620026b0565b6040518263ffffffff1660e01b815260040162003b4991815260200190565b600060405180830381600087803b15801562003b6457600080fd5b505af115801562003b79573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003c5e57600080fd5b505af115801562003c73573d6000803e3d6000fd5b505050506200133362004456565b62003c8d82826200228a565b620013a25760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003cf982826200228a565b15620013a25760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b608080546000918291829062003d739063ffffffff1662005270565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000866001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508060826000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150868260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550858260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550838260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003f6a94939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003fb2575081155b1562003fd15760405163340c614f60e11b815260040160405180910390fd5b8062003ff0576040516366385b5160e01b815260040160405180910390fd5b62003ffb84620044b3565b62004019576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b6000620040c4836200320f565b905081600080620040d6848462005330565b6085546001600160401b039182169250600091620040fd91600160401b9004164262005420565b90505b846001600160401b0316846001600160401b03161462004187576001600160401b0380851660009081526003890160205260409020600181015490911682101562004162576001810154600160401b90046001600160401b0316945062004180565b6200416e868662005330565b6001600160401b031693505062004187565b5062004100565b600062004195848462005420565b905083811015620041f357808403600c8111620041b35780620041b6565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620041e857620041e8620053dc565b04608655506200426b565b838103600c811162004206578062004209565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a76400000281620042435762004243620053dc565b04905080608654670de0b6b3a76400000281620042645762004264620053dc565b0460865550505b683635c9adc5dea0000060865411156200429257683635c9adc5dea00000608655620042aa565b633b9aca006086541015620042aa57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002e86576006810154600090620042ff90600160c01b90046001600160401b031660016200511a565b90506200430d8282620030fc565b15620013a25760068201546000906002906200433b908490600160801b90046001600160401b031662005330565b6200434791906200556a565b6200435390836200511a565b9050620043618382620030fc565b156200437357620011ee838262003a10565b620011ee838362003a10565b606f5460ff16620043a357604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b620043e482826200228a565b620013a257604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620011ee90849062004539565b606f5460ff16156200447b57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b038316108015620044ea575067ffffffff00000001604083901c6001600160401b0316105b80156200450b575067ffffffff00000001608083901c6001600160401b0316105b801562004523575067ffffffff0000000160c083901c105b156200453157506001919050565b506000919050565b600062004590826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620046129092919063ffffffff16565b805190915015620011ee5780806020019051810190620045b1919062005546565b620011ee5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b89565b60606200462384846000856200462b565b949350505050565b6060824710156200468e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b89565b600080866001600160a01b03168587604051620046ac9190620054eb565b60006040518083038185875af1925050503d8060008114620046eb576040519150601f19603f3d011682016040523d82523d6000602084013e620046f0565b606091505b509150915062001e1e87838387606083156200477157825160000362004769576001600160a01b0385163b620047695760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b89565b508162004623565b620046238383815115620047885781518083602001fd5b8060405162461bcd60e51b815260040162000b89919062004db2565b6108f5806200559483390190565b6001600160401b0391909116815260200190565b803563ffffffff811681146200327b57600080fd5b80356001600160401b03811681146200327b57600080fd5b600080604083850312156200480757600080fd5b6200481283620047c6565b91506200482260208401620047db565b90509250929050565b6001600160a01b038116811462002e8657600080fd5b60008060008060008060c087890312156200485b57600080fd5b863562004868816200482b565b95506200487860208801620047db565b94506200488860408801620047db565b935060608701356200489a816200482b565b92506080870135620048ac816200482b565b915060a0870135620048be816200482b565b809150509295509295509295565b600060208284031215620048df57600080fd5b62000b3e82620047c6565b80610300810183101562000b4157600080fd5b6000806000806000806000806103e0898b0312156200491b57600080fd5b6200492689620047c6565b97506200493660208a01620047db565b96506200494660408a01620047db565b95506200495660608a01620047db565b94506200496660808a01620047db565b935060a0890135925060c08901359150620049858a60e08b01620048ea565b90509295985092959890939650565b6000806000806000806000806103e0898b031215620049b257600080fd5b620049bd89620047c6565b9750620049cd60208a01620047db565b9650620049dd60408a01620047db565b9550620049ed60608a01620047db565b94506080890135935060a0890135925060c089013562004a0d816200482b565b9150620049858a60e08b01620048ea565b60006020828403121562004a3157600080fd5b813561ffff8116811462004a4457600080fd5b9392505050565b60006020828403121562004a5e57600080fd5b5035919050565b6000806040838503121562004a7957600080fd5b82359150602083013562004a8d816200482b565b809150509250929050565b60006020828403121562004aab57600080fd5b62000b3e82620047db565b600080600080600080600080610100898b03121562004ad457600080fd5b883562004ae1816200482b565b975062004af160208a01620047db565b965062004b0160408a01620047db565b9550606089013562004b13816200482b565b9450608089013562004b25816200482b565b935060a089013562004b37816200482b565b925060c089013562004b49816200482b565b915060e089013562004b5b816200482b565b809150509295985092959890939650565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562004bad5762004bad62004b6c565b604052919050565b600082601f83011262004bc757600080fd5b81356001600160401b0381111562004be35762004be362004b6c565b62004bf8601f8201601f191660200162004b82565b81815284602083860101111562004c0e57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600080600060e0888a03121562004c4757600080fd5b62004c5288620047c6565b965062004c6260208901620047db565b9550604088013562004c74816200482b565b9450606088013562004c86816200482b565b9350608088013562004c98816200482b565b925060a08801356001600160401b038082111562004cb557600080fd5b62004cc38b838c0162004bb5565b935060c08a013591508082111562004cda57600080fd5b5062004ce98a828b0162004bb5565b91505092959891949750929550565b60008060008060008060c0878903121562004d1257600080fd5b62004d1d87620047c6565b955062004d2d60208801620047db565b945062004d3d60408801620047db565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004d7b57818101518382015260200162004d61565b50506000910152565b6000815180845262004d9e81602086016020860162004d5e565b601f01601f19169290920160200192915050565b60208152600062000b3e602083018462004d84565b6000602080838503121562004ddb57600080fd5b82356001600160401b038082111562004df357600080fd5b818501915085601f83011262004e0857600080fd5b81358181111562004e1d5762004e1d62004b6c565b8060051b915062004e3084830162004b82565b818152918301840191848101908884111562004e4b57600080fd5b938501935b8385101562004e6b5784358252938501939085019062004e50565b98975050505050505050565b6000806040838503121562004e8b57600080fd5b62004e9683620047db565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000806000806060858703121562004ecf57600080fd5b843562004edc816200482b565b935062004eec60208601620047c6565b925060408501356001600160401b038082111562004f0957600080fd5b818701915087601f83011262004f1e57600080fd5b81358181111562004f2e57600080fd5b88602082850101111562004f4157600080fd5b95989497505060200194505050565b60006020828403121562004f6357600080fd5b813562004a44816200482b565b803560ff811681146200327b57600080fd5b60008060008060008060c0878903121562004f9c57600080fd5b863562004fa9816200482b565b9550602087013562004fbb816200482b565b945062004fcb60408801620047db565b935062004fdb60608801620047db565b92506080870135915062004ff260a0880162004f70565b90509295509295509295565b60008060008060008060c087890312156200501857600080fd5b863562005025816200482b565b9550602087013562005037816200482b565b94506200504760408801620047db565b9350620050576060880162004f70565b92506080870135915060a08701356001600160401b038111156200507a57600080fd5b6200508889828a0162004bb5565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b038181168382160190808211156200513d576200513d62005104565b5092915050565b8054600090600181811c90808316806200515f57607f831692505b602080841082036200518157634e487b7160e01b600052602260045260246000fd5b838852602088018280156200519f5760018114620051b657620051e3565b60ff198716825285151560051b82019750620051e3565b60008981526020902060005b87811015620051dd57815484820152908601908401620051c2565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c0604082018190526000906200521e9083018762005144565b828103606084015262005232818762005144565b608084019590955250506001600160401b039190911660a090910152949350505050565b808202811582820484141762000b415762000b4162005104565b600063ffffffff8083168181036200528c576200528c62005104565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620052c49083018462004d84565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190526000906200530f9083018562004d84565b82810360a084015262005323818562004d84565b9998505050505050505050565b6001600160401b038281168282160390808211156200513d576200513d62005104565b60006001600160401b038281166002600160401b031981016200528c576200528c62005104565b634e487b7160e01b600052603260045260246000fd5b8082018082111562000b415762000b4162005104565b600060018201620053bb57620053bb62005104565b5060010190565b600060208284031215620053d557600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082620054045762005404620053dc565b500490565b6000826200541b576200541b620053dc565b500690565b8181038181111562000b415762000b4162005104565b918252602082015260400190565b60008162005456576200545662005104565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a0820181905260009062004e6b9083018462004d84565b60008251620054ff81846020870162004d5e565b9190910192915050565b61032081016103008085843782018360005b60018110156200553c5781518352602092830192909101906001016200551b565b5050509392505050565b6000602082840312156200555957600080fd5b8151801515811462004a4457600080fd5b60006001600160401b0383811680620055875762005587620053dc565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220a19e7a72432195d9a35c7ce8fa5f1284415aac66bb1ad08a4c2e1c252fd8690864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a26469706673582212203ed109761baf62dbc1fa9f0e36ec13a862f69b70da8979a56e488b9e97261de064736f6c63430008140033", - "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620002aa5760003560e01c8063066ec01214620002af578063080b311114620002db5780630a0d9fbe14620003035780630e36f582146200031e57806311f6b287146200033757806312b86e19146200034e5780631489ed10146200036557806315064c96146200037c5780631608859c146200038a5780631796a1ae14620003a15780631816b7e514620003c85780632072f6c514620003df578063248a9ca314620003e957806325280169146200040f5780632f2ff15d14620004c457806336568abe14620004db578063394218e914620004f2578063477fa27014620005095780634d4d3338146200051257806355a71ee0146200052957806360469169146200056d57806365c0504d14620005775780637222020f1462000626578063727885e9146200063d5780637975fcfe14620006545780637fb6e76a146200067a578063841b24d714620006a357806387c20c0114620006be5780638bd4f07114620006d55780638f698ec514620006ec57806391d14854146200070357806399f5634e146200071a5780639a908e7314620007245780639c9f3dfe146200073b578063a066215c1462000752578063a217fddf1462000769578063a2967d991462000772578063a3c573eb146200077c578063afd23cbe14620007b3578063b99d0ad714620007dd578063c1acbc3414620008b5578063c4c928c214620008d0578063ceee281d14620008e7578063d02103ca1462000910578063d5073f6f1462000938578063d547741f146200094f578063d939b3151462000966578063dbc16976146200097a578063dde0ff771462000984578063e0bfd3d2146200099f578063e46761c414620009b6578063f34eb8eb14620009de578063f4e9267514620009f5578063f9c4c2ae1462000a06575b600080fd5b608454620002c3906001600160401b031681565b604051620002d29190620047b2565b60405180910390f35b620002f2620002ec366004620047f3565b62000b1d565b6040519015158152602001620002d2565b608554620002c390600160401b90046001600160401b031681565b620003356200032f36600462004841565b62000b47565b005b620002c362000348366004620048cc565b62000dfe565b620003356200035f366004620048fd565b62000e1e565b620003356200037636600462004994565b62000fce565b606f54620002f29060ff1681565b620003356200039b366004620047f3565b6200115e565b607e54620003b29063ffffffff1681565b60405163ffffffff9091168152602001620002d2565b62000335620003d936600462004a1e565b620011f3565b620003356200129f565b62000400620003fa36600462004a4b565b62001335565b604051908152602001620002d2565b6200049062000420366004620047f3565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002d2565b62000335620004d536600462004a65565b6200134a565b62000335620004ec36600462004a65565b6200136c565b620003356200050336600462004a98565b620013a6565b60865462000400565b620003356200052336600462004ab6565b62001455565b620004006200053a366004620047f3565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620004006200188b565b620005dc62000588366004620048cc565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002d2565b6200033562000637366004620048cc565b620018a3565b620003356200064e36600462004c2b565b6200198e565b6200066b6200066536600462004cf8565b62001df6565b604051620002d2919062004db2565b620003b26200068b36600462004a98565b60836020526000908152604090205463ffffffff1681565b608454620002c390600160c01b90046001600160401b031681565b62000335620006cf36600462004994565b62001e29565b62000335620006e6366004620048fd565b6200214d565b62000335620006fd36600462004dc7565b62002203565b620002f26200071436600462004a65565b6200228a565b62000400620022b5565b620002c36200073536600462004e77565b620023a1565b620003356200074c36600462004a98565b6200256e565b620003356200076336600462004a98565b62002611565b62000400600081565b62000400620026b0565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b604051620002d2919062004ea4565b608554620007c990600160801b900461ffff1681565b60405161ffff9091168152602001620002d2565b62000873620007ee366004620047f3565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002d2919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002c390600160801b90046001600160401b031681565b62000335620008e136600462004eb8565b62002a72565b620003b2620008f836600462004f50565b60826020526000908152604090205463ffffffff1681565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b620003356200094936600462004a4b565b62002d3f565b620003356200096036600462004a65565b62002dca565b608554620002c3906001600160401b031681565b6200033562002dec565b608454620002c390600160401b90046001600160401b031681565b62000335620009b036600462004f82565b62002e89565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b62000335620009ef36600462004ffe565b62002f11565b608054620003b29063ffffffff1681565b62000a9d62000a17366004620048cc565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002d2565b63ffffffff8216600090815260816020526040812062000b3e9083620030fc565b90505b92915050565b600054600290610100900460ff1615801562000b6a575060005460ff8083169116105b62000b925760405162461bcd60e51b815260040162000b899062005095565b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c1362003141565b62000c2e6000805160206200602983398151915288620031ae565b62000c3b600084620031ae565b62000c5660008051602062005f0983398151915284620031ae565b62000c7160008051602062005f8983398151915284620031ae565b62000c8c60008051602062005ea983398151915284620031ae565b62000ca760008051602062005ee983398151915285620031ae565b62000cc26000805160206200600983398151915285620031ae565b62000cdd60008051602062005f2983398151915285620031ae565b62000cf860008051602062005fa983398151915285620031ae565b62000d226000805160206200602983398151915260008051602062005e89833981519152620031ba565b62000d3d60008051602062005e8983398151915285620031ae565b62000d5860008051602062005ec983398151915285620031ae565b62000d8260008051602062005fe983398151915260008051602062005fc9833981519152620031ba565b62000d9d60008051602062005fe983398151915283620031ae565b62000db860008051602062005fc983398151915283620031ae565b62000dc5600033620031ae565b6000805461ff001916905560405160ff8216815260008051602062005f698339815191529060200160405180910390a150505050505050565b63ffffffff8116600090815260816020526040812062000b41906200320f565b6000805160206200602983398151915262000e398162003280565b63ffffffff8916600090815260816020526040902062000e60818a8a8a8a8a8a8a6200328c565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000ec8576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000f01620026b0565b6040518263ffffffff1660e01b815260040162000f2091815260200190565b600060405180830381600087803b15801562000f3b57600080fd5b505af115801562000f50573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b6000805160206200602983398151915262000fe98162003280565b63ffffffff8916600090815260816020526040902062001010818a8a8a8a8a8a8a62003614565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562001078576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620010b1620026b0565b6040518263ffffffff1660e01b8152600401620010d091815260200190565b600060405180830381600087803b158015620010eb57600080fd5b505af115801562001100573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a6040516200114a93929190620050e3565b60405180910390a350505050505050505050565b63ffffffff821660009081526081602052604090206200118e60008051602062006029833981519152336200228a565b620011e257606f5460ff1615620011b857604051630bc011ff60e21b815260040160405180910390fd5b620011c48183620030fc565b620011e257604051630674f25160e11b815260040160405180910390fd5b620011ee818362003a10565b505050565b60008051602062005fa98339815191526200120e8162003280565b6103e88261ffff1610806200122857506103ff8261ffff16115b156200124757604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620012ba60008051602062005fe9833981519152336200228a565b6200132957608454600160801b90046001600160401b031615806200130a57506084544290620012ff9062093a8090600160801b90046001600160401b03166200511a565b6001600160401b0316115b15620013295760405163692baaad60e11b815260040160405180910390fd5b6200133362003c02565b565b60009081526034602052604090206001015490565b620013558262001335565b620013608162003280565b620011ee838362003c81565b6001600160a01b03811633146200139657604051630b4ad1cd60e31b815260040160405180910390fd5b620013a2828262003ced565b5050565b60008051602062005fa9833981519152620013c18162003280565b606f5460ff1662001403576084546001600160401b03600160c01b909104811690831610620014035760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19062001293908490620047b2565b600054600290610100900460ff1615801562001478575060005460ff8083169116105b620014975760405162461bcd60e51b815260040162000b899062005095565b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200151862003141565b62001533600080516020620060298339815191528a620031ae565b62001540600086620031ae565b6200155b60008051602062005f0983398151915286620031ae565b6200157660008051602062005f8983398151915286620031ae565b6200159160008051602062005ea983398151915286620031ae565b620015ac60008051602062005ee983398151915287620031ae565b620015c76000805160206200600983398151915287620031ae565b620015e260008051602062005f2983398151915287620031ae565b620015fd60008051602062005fa983398151915287620031ae565b620016276000805160206200602983398151915260008051602062005e89833981519152620031ba565b6200164260008051602062005e8983398151915287620031ae565b6200165d60008051602062005ec983398151915287620031ae565b6200168760008051602062005fe983398151915260008051602062005fc9833981519152620031ba565b620016a260008051602062005fe983398151915285620031ae565b620016bd60008051602062005fc983398151915285620031ae565b6000620016d28484600561044d600062003d57565b6073546074549192506001600160401b03600160401b909104811691168082146200171057604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b0381811660008181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620018119695831695600160581b9091049092169360769360779391929190911690600401620051f0565b600060405180830381600087803b1580156200182c57600080fd5b505af115801562001841573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff8516815260008051602062005f6983398151915293506020019150620018789050565b60405180910390a1505050505050505050565b600060865460646200189e919062005256565b905090565b60008051602062005ee9833981519152620018be8162003280565b63ffffffff82161580620018dd5750607e5463ffffffff908116908316115b15620018fc57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200194357604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b60008051602062006009833981519152620019a98162003280565b63ffffffff88161580620019c85750607e5463ffffffff908116908916115b15620019e757604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff161515900362001a2e57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001a6c576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062001a879063ffffffff1662005270565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001ad590620047a4565b62001ae39392919062005296565b604051809103906000f08015801562001b00573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001d74949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001db4908d908d9088908e908e908e90600401620052cd565b600060405180830381600087803b15801562001dcf57600080fd5b505af115801562001de4573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001e1e90878787878762003f7c565b979650505050505050565b606f5460ff161562001e4e57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001e9d92600160c01b9004811691166200511a565b6001600160401b0316111562001ec657604051638a0704d360e01b815260040160405180910390fd5b6103e862001ed5888862005330565b6001600160401b0316111562001efe57604051635acfba9d60e11b815260040160405180910390fd5b62001f10818989898989898962003614565b62001f1c8187620040b7565b6085546001600160401b03166000036200202a57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001f98576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001fd1620026b0565b6040518263ffffffff1660e01b815260040162001ff091815260200190565b600060405180830381600087803b1580156200200b57600080fd5b505af115801562002020573d6000803e3d6000fd5b50505050620020f4565b6200203581620042b4565b600681018054600160801b90046001600160401b0316906010620020598362005353565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b48887896040516200213a93929190620050e3565b60405180910390a3505050505050505050565b606f5460ff16156200217257604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602052604090206200219981898989898989896200328c565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620021f862003c02565b505050505050505050565b80516080805463ffffffff191663ffffffff90921691909117905560005b8151811015620013a2578181815181106200224057620022406200537a565b6020026020010151608160008360016200225b919062005390565b63ffffffff168152602081019190915260400160002060050155806200228181620053a6565b91505062002221565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162002306919062004ea4565b602060405180830381865afa15801562002324573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200234a9190620053c2565b60845490915060009062002371906001600160401b03600160401b82048116911662005330565b6001600160401b03169050806000036200238e5760009250505090565b6200239a8183620053f2565b9250505090565b606f5460009060ff1615620023c957604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362002401576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200242c57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff8116600090815260816020526040812060848054919287926200245f9084906001600160401b03166200511a565b82546101009290920a6001600160401b03818102199093169183160217909155600683015416905060006200249587836200511a565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200252483620042b4565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a25826040516200255c9190620047b2565b60405180910390a29695505050505050565b60008051602062005fa9833981519152620025898162003280565b606f5460ff16620025c4576085546001600160401b0390811690831610620025c45760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759062001293908490620047b2565b60008051602062005fa98339815191526200262c8162003280565b62015180826001600160401b031611156200265a57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289062001293908490620047b2565b60805460009063ffffffff16808203620026cc57506000919050565b6000816001600160401b03811115620026e957620026e962004b6c565b60405190808252806020026020018201604052801562002713578160200160208202803683370190505b50905060005b828110156200278657608160006200273383600162005390565b63ffffffff1663ffffffff168152602001908152602001600020600501548282815181106200276657620027666200537a565b6020908102919091010152806200277d81620053a6565b91505062002719565b50600060205b83600114620029ca576000620027a460028662005409565b620027b1600287620053f2565b620027bd919062005390565b90506000816001600160401b03811115620027dc57620027dc62004b6c565b60405190808252806020026020018201604052801562002806578160200160208202803683370190505b50905060005b828110156200297e576200282260018462005420565b811480156200283d57506200283960028862005409565b6001145b15620028bd57856200285182600262005256565b815181106200286457620028646200537a565b6020026020010151856040516020016200288092919062005436565b60405160208183030381529060405280519060200120828281518110620028ab57620028ab6200537a565b60200260200101818152505062002969565b85620028cb82600262005256565b81518110620028de57620028de6200537a565b602002602001015186826002620028f6919062005256565b6200290390600162005390565b815181106200291657620029166200537a565b60200260200101516040516020016200293192919062005436565b604051602081830303815290604052805190602001208282815181106200295c576200295c6200537a565b6020026020010181815250505b806200297581620053a6565b9150506200280c565b5080945081955083846040516020016200299a92919062005436565b6040516020818303038152906040528051906020012093508280620029bf9062005444565b93505050506200278c565b600083600081518110620029e257620029e26200537a565b6020026020010151905060005b8281101562002a6857818460405160200162002a0d92919062005436565b604051602081830303815290604052805190602001209150838460405160200162002a3a92919062005436565b604051602081830303815290604052805190602001209350808062002a5f90620053a6565b915050620029ef565b5095945050505050565b60008051602062005ea983398151915262002a8d8162003280565b63ffffffff8416158062002aac5750607e5463ffffffff908116908516115b1562002acb57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002b0c576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002b5b57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002ba257604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002be057604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002c608462000dfe565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002cb59216908b908b906004016200545e565b600060405180830381600087803b15801562002cd057600080fd5b505af115801562002ce5573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005ec983398151915262002d5a8162003280565b683635c9adc5dea0000082118062002d755750633b9aca0082105b1562002d9457604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001293565b62002dd58262001335565b62002de08162003280565b620011ee838362003ced565b60008051602062005f2983398151915262002e078162003280565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002e6357600080fd5b505af115801562002e78573d6000803e3d6000fd5b5050505062002e866200437f565b50565b60008051602062005f8983398151915262002ea48162003280565b6001600160401b03841660009081526083602052604090205463ffffffff161562002ee2576040516337c8fe0960e11b815260040160405180910390fd5b600062002ef3888888888762003d57565b60008080526002909101602052604090209390935550505050505050565b60008051602062005f0983398151915262002f2c8162003280565b607e805460009190829062002f479063ffffffff1662005270565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620030ea969594939291906200549e565b60405180910390a25050505050505050565b6085546001600160401b038281166000908152600485016020526040812054909242926200312f9291811691166200511a565b6001600160401b031611159392505050565b600054610100900460ff16620013335760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b89565b620013a2828262003c81565b6000620031c78362001335565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6006810154600090600160801b90046001600160401b03161562003263575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002e868133620043d8565b60078801546000906001600160401b039081169087161015620032c25760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620033635760068901546001600160401b03600160801b909104811690891611156200330c5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200335c57604051632bd2e3e760e01b815260040160405180910390fd5b50620033d8565b506001600160401b0385166000908152600289016020526040902054806200339e576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620033d857604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620034115750876001600160401b0316876001600160401b031611155b8062003435575060068901546001600160401b03600160c01b909104811690881611155b15620034545760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b90048116908616146200349b576040516332a2a77f60e01b815260040160405180910390fd5b6000620034ad8a888888868962003f7c565b9050600060008051602062005f49833981519152600283604051620034d39190620054eb565b602060405180830381855afa158015620034f1573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620035169190620053c2565b62003522919062005409565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620035669188919060040162005509565b602060405180830381865afa15801562003584573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620035aa919062005546565b620035c8576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620036075760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620036228a6200320f565b60078b01549091506001600160401b039081169089161015620036585760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620036fb5760068a01546001600160401b03600160801b9091048116908a161115620036a25760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620036f457604051632bd2e3e760e01b815260040160405180910390fd5b506200376b565b6001600160401b038816600090815260028b01602052604090205491508162003737576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200376b57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b0316116200379e5760405163b9b18f5760e01b815260040160405180910390fd5b6000620037b08b8a8a8a878b62003f7c565b9050600060008051602062005f49833981519152600283604051620037d69190620054eb565b602060405180830381855afa158015620037f4573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620038199190620053c2565b62003825919062005409565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620038699189919060040162005509565b602060405180830381865afa15801562003887573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620038ad919062005546565b620038cb576040516309bde33960e01b815260040160405180910390fd5b6000620038d9848b62005330565b90506200393287826001600160401b0316620038f4620022b5565b62003900919062005256565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004402565b80608460088282829054906101000a90046001600160401b03166200395891906200511a565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b158015620039e857600080fd5b505af1158015620039fd573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003a4f575060068201546001600160401b03600160801b9091048116908216115b1562003a6e5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003b2a620026b0565b6040518263ffffffff1660e01b815260040162003b4991815260200190565b600060405180830381600087803b15801562003b6457600080fd5b505af115801562003b79573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003c5e57600080fd5b505af115801562003c73573d6000803e3d6000fd5b505050506200133362004456565b62003c8d82826200228a565b620013a25760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003cf982826200228a565b15620013a25760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b608080546000918291829062003d739063ffffffff1662005270565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000866001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508060826000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150868260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550858260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550838260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003f6a94939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003fb2575081155b1562003fd15760405163340c614f60e11b815260040160405180910390fd5b8062003ff0576040516366385b5160e01b815260040160405180910390fd5b62003ffb84620044b3565b62004019576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b6000620040c4836200320f565b905081600080620040d6848462005330565b6085546001600160401b039182169250600091620040fd91600160401b9004164262005420565b90505b846001600160401b0316846001600160401b03161462004187576001600160401b0380851660009081526003890160205260409020600181015490911682101562004162576001810154600160401b90046001600160401b0316945062004180565b6200416e868662005330565b6001600160401b031693505062004187565b5062004100565b600062004195848462005420565b905083811015620041f357808403600c8111620041b35780620041b6565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620041e857620041e8620053dc565b04608655506200426b565b838103600c811162004206578062004209565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a76400000281620042435762004243620053dc565b04905080608654670de0b6b3a76400000281620042645762004264620053dc565b0460865550505b683635c9adc5dea0000060865411156200429257683635c9adc5dea00000608655620042aa565b633b9aca006086541015620042aa57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002e86576006810154600090620042ff90600160c01b90046001600160401b031660016200511a565b90506200430d8282620030fc565b15620013a25760068201546000906002906200433b908490600160801b90046001600160401b031662005330565b6200434791906200556a565b6200435390836200511a565b9050620043618382620030fc565b156200437357620011ee838262003a10565b620011ee838362003a10565b606f5460ff16620043a357604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b620043e482826200228a565b620013a257604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620011ee90849062004539565b606f5460ff16156200447b57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b038316108015620044ea575067ffffffff00000001604083901c6001600160401b0316105b80156200450b575067ffffffff00000001608083901c6001600160401b0316105b801562004523575067ffffffff0000000160c083901c105b156200453157506001919050565b506000919050565b600062004590826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620046129092919063ffffffff16565b805190915015620011ee5780806020019051810190620045b1919062005546565b620011ee5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b89565b60606200462384846000856200462b565b949350505050565b6060824710156200468e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b89565b600080866001600160a01b03168587604051620046ac9190620054eb565b60006040518083038185875af1925050503d8060008114620046eb576040519150601f19603f3d011682016040523d82523d6000602084013e620046f0565b606091505b509150915062001e1e87838387606083156200477157825160000362004769576001600160a01b0385163b620047695760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b89565b508162004623565b620046238383815115620047885781518083602001fd5b8060405162461bcd60e51b815260040162000b89919062004db2565b6108f5806200559483390190565b6001600160401b0391909116815260200190565b803563ffffffff811681146200327b57600080fd5b80356001600160401b03811681146200327b57600080fd5b600080604083850312156200480757600080fd5b6200481283620047c6565b91506200482260208401620047db565b90509250929050565b6001600160a01b038116811462002e8657600080fd5b60008060008060008060c087890312156200485b57600080fd5b863562004868816200482b565b95506200487860208801620047db565b94506200488860408801620047db565b935060608701356200489a816200482b565b92506080870135620048ac816200482b565b915060a0870135620048be816200482b565b809150509295509295509295565b600060208284031215620048df57600080fd5b62000b3e82620047c6565b80610300810183101562000b4157600080fd5b6000806000806000806000806103e0898b0312156200491b57600080fd5b6200492689620047c6565b97506200493660208a01620047db565b96506200494660408a01620047db565b95506200495660608a01620047db565b94506200496660808a01620047db565b935060a0890135925060c08901359150620049858a60e08b01620048ea565b90509295985092959890939650565b6000806000806000806000806103e0898b031215620049b257600080fd5b620049bd89620047c6565b9750620049cd60208a01620047db565b9650620049dd60408a01620047db565b9550620049ed60608a01620047db565b94506080890135935060a0890135925060c089013562004a0d816200482b565b9150620049858a60e08b01620048ea565b60006020828403121562004a3157600080fd5b813561ffff8116811462004a4457600080fd5b9392505050565b60006020828403121562004a5e57600080fd5b5035919050565b6000806040838503121562004a7957600080fd5b82359150602083013562004a8d816200482b565b809150509250929050565b60006020828403121562004aab57600080fd5b62000b3e82620047db565b600080600080600080600080610100898b03121562004ad457600080fd5b883562004ae1816200482b565b975062004af160208a01620047db565b965062004b0160408a01620047db565b9550606089013562004b13816200482b565b9450608089013562004b25816200482b565b935060a089013562004b37816200482b565b925060c089013562004b49816200482b565b915060e089013562004b5b816200482b565b809150509295985092959890939650565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562004bad5762004bad62004b6c565b604052919050565b600082601f83011262004bc757600080fd5b81356001600160401b0381111562004be35762004be362004b6c565b62004bf8601f8201601f191660200162004b82565b81815284602083860101111562004c0e57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600080600060e0888a03121562004c4757600080fd5b62004c5288620047c6565b965062004c6260208901620047db565b9550604088013562004c74816200482b565b9450606088013562004c86816200482b565b9350608088013562004c98816200482b565b925060a08801356001600160401b038082111562004cb557600080fd5b62004cc38b838c0162004bb5565b935060c08a013591508082111562004cda57600080fd5b5062004ce98a828b0162004bb5565b91505092959891949750929550565b60008060008060008060c0878903121562004d1257600080fd5b62004d1d87620047c6565b955062004d2d60208801620047db565b945062004d3d60408801620047db565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004d7b57818101518382015260200162004d61565b50506000910152565b6000815180845262004d9e81602086016020860162004d5e565b601f01601f19169290920160200192915050565b60208152600062000b3e602083018462004d84565b6000602080838503121562004ddb57600080fd5b82356001600160401b038082111562004df357600080fd5b818501915085601f83011262004e0857600080fd5b81358181111562004e1d5762004e1d62004b6c565b8060051b915062004e3084830162004b82565b818152918301840191848101908884111562004e4b57600080fd5b938501935b8385101562004e6b5784358252938501939085019062004e50565b98975050505050505050565b6000806040838503121562004e8b57600080fd5b62004e9683620047db565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000806000806060858703121562004ecf57600080fd5b843562004edc816200482b565b935062004eec60208601620047c6565b925060408501356001600160401b038082111562004f0957600080fd5b818701915087601f83011262004f1e57600080fd5b81358181111562004f2e57600080fd5b88602082850101111562004f4157600080fd5b95989497505060200194505050565b60006020828403121562004f6357600080fd5b813562004a44816200482b565b803560ff811681146200327b57600080fd5b60008060008060008060c0878903121562004f9c57600080fd5b863562004fa9816200482b565b9550602087013562004fbb816200482b565b945062004fcb60408801620047db565b935062004fdb60608801620047db565b92506080870135915062004ff260a0880162004f70565b90509295509295509295565b60008060008060008060c087890312156200501857600080fd5b863562005025816200482b565b9550602087013562005037816200482b565b94506200504760408801620047db565b9350620050576060880162004f70565b92506080870135915060a08701356001600160401b038111156200507a57600080fd5b6200508889828a0162004bb5565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b038181168382160190808211156200513d576200513d62005104565b5092915050565b8054600090600181811c90808316806200515f57607f831692505b602080841082036200518157634e487b7160e01b600052602260045260246000fd5b838852602088018280156200519f5760018114620051b657620051e3565b60ff198716825285151560051b82019750620051e3565b60008981526020902060005b87811015620051dd57815484820152908601908401620051c2565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c0604082018190526000906200521e9083018762005144565b828103606084015262005232818762005144565b608084019590955250506001600160401b039190911660a090910152949350505050565b808202811582820484141762000b415762000b4162005104565b600063ffffffff8083168181036200528c576200528c62005104565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620052c49083018462004d84565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190526000906200530f9083018562004d84565b82810360a084015262005323818562004d84565b9998505050505050505050565b6001600160401b038281168282160390808211156200513d576200513d62005104565b60006001600160401b038281166002600160401b031981016200528c576200528c62005104565b634e487b7160e01b600052603260045260246000fd5b8082018082111562000b415762000b4162005104565b600060018201620053bb57620053bb62005104565b5060010190565b600060208284031215620053d557600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082620054045762005404620053dc565b500490565b6000826200541b576200541b620053dc565b500690565b8181038181111562000b415762000b4162005104565b918252602082015260400190565b60008162005456576200545662005104565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a0820181905260009062004e6b9083018462004d84565b60008251620054ff81846020870162004d5e565b9190910192915050565b61032081016103008085843782018360005b60018110156200553c5781518352602092830192909101906001016200551b565b5050509392505050565b6000602082840312156200555957600080fd5b8151801515811462004a4457600080fd5b60006001600160401b0383811680620055875762005587620053dc565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220a19e7a72432195d9a35c7ce8fa5f1284415aac66bb1ad08a4c2e1c252fd8690864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a26469706673582212203ed109761baf62dbc1fa9f0e36ec13a862f69b70da8979a56e488b9e97261de064736f6c63430008140033", + "bytecode": "0x60e06040523480156200001157600080fd5b50604051620061e8380380620061e883398101604081905262000034916200006b565b6001600160a01b0392831660805290821660c0521660a052620000bf565b6001600160a01b03811681146200006857600080fd5b50565b6000806000606084860312156200008157600080fd5b83516200008e8162000052565b6020850151909350620000a18162000052565b6040850151909250620000b48162000052565b809150509250925092565b60805160a05160c0516160c162000127600039600081816109bc015281816122cd0152613b4d01526000818161078201528181612e1c0152613e4701526000818161091601528181611313015281816114c301528181611fad0152613d3601526160c16000f3fe60806040523480156200001157600080fd5b5060043610620002aa5760003560e01c80630645af0914620002af578063066ec01214620002c8578063080b311114620002f45780630a0d9fbe146200031c5780630e36f582146200033757806311f6b287146200034e57806312b86e1914620003655780631489ed10146200037c57806315064c9614620003935780631608859c14620003a15780631796a1ae14620003b85780631816b7e514620003df5780632072f6c514620003f6578063248a9ca314620004005780632528016914620004265780632f2ff15d14620004db57806336568abe14620004f2578063394218e91462000509578063477fa270146200052057806355a71ee0146200052957806360469169146200056d57806365c0504d14620005775780637222020f1462000626578063727885e9146200063d5780637975fcfe14620006545780637fb6e76a146200067a578063841b24d714620006a357806387c20c0114620006be5780638bd4f07114620006d55780638f698ec514620006ec57806391d14854146200070357806399f5634e146200071a5780639a908e7314620007245780639c9f3dfe146200073b578063a066215c1462000752578063a217fddf1462000769578063a2967d991462000772578063a3c573eb146200077c578063afd23cbe14620007b3578063b99d0ad714620007dd578063c1acbc3414620008b5578063c4c928c214620008d0578063ceee281d14620008e7578063d02103ca1462000910578063d5073f6f1462000938578063d547741f146200094f578063d939b3151462000966578063dbc16976146200097a578063dde0ff771462000984578063e0bfd3d2146200099f578063e46761c414620009b6578063f34eb8eb14620009de578063f4e9267514620009f5578063f9c4c2ae1462000a06575b600080fd5b620002c6620002c0366004620047fe565b62000b1d565b005b608454620002dc906001600160401b031681565b604051620002eb9190620048d9565b60405180910390f35b6200030b6200030536600462004902565b62000f6f565b6040519015158152602001620002eb565b608554620002dc90600160401b90046001600160401b031681565b620002c6620003483660046200493a565b62000f99565b620002dc6200035f366004620049c5565b62001247565b620002c662000376366004620049f6565b62001267565b620002c66200038d36600462004a8d565b62001417565b606f546200030b9060ff1681565b620002c6620003b236600462004902565b620015a7565b607e54620003c99063ffffffff1681565b60405163ffffffff9091168152602001620002eb565b620002c6620003f036600462004b17565b6200163c565b620002c6620016e8565b620004176200041136600462004b44565b6200177e565b604051908152602001620002eb565b620004a76200043736600462004902565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002eb565b620002c6620004ec36600462004b5e565b62001793565b620002c66200050336600462004b5e565b620017b5565b620002c66200051a36600462004b91565b620017ef565b60865462000417565b620004176200053a36600462004902565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620004176200189e565b620005dc62000588366004620049c5565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002eb565b620002c662000637366004620049c5565b620018b6565b620002c66200064e36600462004c6e565b620019a1565b6200066b6200066536600462004d3b565b62001e09565b604051620002eb919062004df5565b620003c96200068b36600462004b91565b60836020526000908152604090205463ffffffff1681565b608454620002dc90600160c01b90046001600160401b031681565b620002c6620006cf36600462004a8d565b62001e3c565b620002c6620006e6366004620049f6565b62002160565b620002c6620006fd36600462004e0a565b62002216565b6200030b6200071436600462004b5e565b6200229d565b62000417620022c8565b620002dc6200073536600462004eba565b620023b4565b620002c66200074c36600462004b91565b62002581565b620002c66200076336600462004b91565b62002624565b62000417600081565b62000417620026c3565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b604051620002eb919062004ee7565b608554620007c990600160801b900461ffff1681565b60405161ffff9091168152602001620002eb565b62000873620007ee36600462004902565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002eb919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002dc90600160801b90046001600160401b031681565b620002c6620008e136600462004efb565b62002a85565b620003c9620008f836600462004f93565b60826020526000908152604090205463ffffffff1681565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b620002c66200094936600462004b44565b62002d52565b620002c66200096036600462004b5e565b62002ddd565b608554620002dc906001600160401b031681565b620002c662002dff565b608454620002dc90600160401b90046001600160401b031681565b620002c6620009b036600462004fc5565b62002e9c565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b620002c6620009ef36600462005041565b62002f26565b608054620003c99063ffffffff1681565b62000a9d62000a17366004620049c5565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002eb565b600054600290610100900460ff1615801562000b40575060005460ff8083169116105b62000b685760405162461bcd60e51b815260040162000b5f90620050d8565b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000be962003111565b62000c046000805160206200606c8339815191528c6200317e565b62000c116000886200317e565b62000c2c60008051602062005f4c833981519152886200317e565b62000c4760008051602062005fcc833981519152886200317e565b62000c6260008051602062005eec833981519152886200317e565b62000c7d60008051602062005f2c833981519152896200317e565b62000c986000805160206200604c833981519152896200317e565b62000cb360008051602062005f6c833981519152896200317e565b62000cce60008051602062005fec833981519152896200317e565b62000cf86000805160206200606c83398151915260008051602062005ecc8339815191526200318a565b62000d1360008051602062005ecc833981519152896200317e565b62000d2e60008051602062005f0c833981519152896200317e565b62000d586000805160206200602c8339815191526000805160206200600c8339815191526200318a565b62000d736000805160206200602c833981519152876200317e565b62000d8e6000805160206200600c833981519152876200317e565b6073546074546001600160401b03600160401b9092048216911680821462000dc957604051632e4cc54360e11b815260040160405180910390fd5b600062000df1888888886000607460009054906101000a90046001600160401b0316620031df565b6001600160401b03838116600081815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068b018054909216909417938802939093179092556007880180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81529596506001600160a01b038e81169663bb5907089662000ef39694831695600160581b909504909216936076936077939092911690600401620051d2565b600060405180830381600087803b15801562000f0e57600080fd5b505af115801562000f23573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff8516815260008051602062005fac8339815191529350602001915062000f5a9050565b60405180910390a15050505050505050505050565b63ffffffff8216600090815260816020526040812062000f9090836200340d565b90505b92915050565b600054600290610100900460ff1615801562000fbc575060005460ff8083169116105b62000fdb5760405162461bcd60e51b815260040162000b5f90620050d8565b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200105c62003111565b620010776000805160206200606c833981519152886200317e565b620010846000846200317e565b6200109f60008051602062005f4c833981519152846200317e565b620010ba60008051602062005fcc833981519152846200317e565b620010d560008051602062005eec833981519152846200317e565b620010f060008051602062005f2c833981519152856200317e565b6200110b6000805160206200604c833981519152856200317e565b6200112660008051602062005f6c833981519152856200317e565b6200114160008051602062005fec833981519152856200317e565b6200116b6000805160206200606c83398151915260008051602062005ecc8339815191526200318a565b6200118660008051602062005ecc833981519152856200317e565b620011a160008051602062005f0c833981519152856200317e565b620011cb6000805160206200602c8339815191526000805160206200600c8339815191526200318a565b620011e66000805160206200602c833981519152836200317e565b620012016000805160206200600c833981519152836200317e565b6200120e6000336200317e565b6000805461ff001916905560405160ff8216815260008051602062005fac8339815191529060200160405180910390a150505050505050565b63ffffffff8116600090815260816020526040812062000f939062003452565b6000805160206200606c8339815191526200128281620034c3565b63ffffffff89166000908152608160205260409020620012a9818a8a8a8a8a8a8a620034cf565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001311576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200134a620026c3565b6040518263ffffffff1660e01b81526004016200136991815260200190565b600060405180830381600087803b1580156200138457600080fd5b505af115801562001399573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b6000805160206200606c8339815191526200143281620034c3565b63ffffffff8916600090815260816020526040902062001459818a8a8a8a8a8a8a62003857565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b90041615620014c1576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620014fa620026c3565b6040518263ffffffff1660e01b81526004016200151991815260200190565b600060405180830381600087803b1580156200153457600080fd5b505af115801562001549573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a604051620015939392919062005238565b60405180910390a350505050505050505050565b63ffffffff82166000908152608160205260409020620015d76000805160206200606c833981519152336200229d565b6200162b57606f5460ff16156200160157604051630bc011ff60e21b815260040160405180910390fd5b6200160d81836200340d565b6200162b57604051630674f25160e11b815260040160405180910390fd5b62001637818362003c53565b505050565b60008051602062005fec8339815191526200165781620034c3565b6103e88261ffff1610806200167157506103ff8261ffff16115b156200169057604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620017036000805160206200602c833981519152336200229d565b6200177257608454600160801b90046001600160401b031615806200175357506084544290620017489062093a8090600160801b90046001600160401b03166200526f565b6001600160401b0316115b15620017725760405163692baaad60e11b815260040160405180910390fd5b6200177c62003e45565b565b60009081526034602052604090206001015490565b6200179e826200177e565b620017a981620034c3565b62001637838362003ec4565b6001600160a01b0381163314620017df57604051630b4ad1cd60e31b815260040160405180910390fd5b620017eb828262003f30565b5050565b60008051602062005fec8339815191526200180a81620034c3565b606f5460ff166200184c576084546001600160401b03600160c01b9091048116908316106200184c5760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190620016dc908490620048d9565b60006086546064620018b1919062005299565b905090565b60008051602062005f2c833981519152620018d181620034c3565b63ffffffff82161580620018f05750607e5463ffffffff908116908316115b156200190f57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200195657604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b6000805160206200604c833981519152620019bc81620034c3565b63ffffffff88161580620019db5750607e5463ffffffff908116908916115b15620019fa57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff161515900362001a4157604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001a7f576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062001a9a9063ffffffff16620052b3565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001ae890620047c2565b62001af693929190620052d9565b604051809103906000f08015801562001b13573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001d87949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001dc7908d908d9088908e908e908e9060040162005310565b600060405180830381600087803b15801562001de257600080fd5b505af115801562001df7573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001e3190878787878762003f9a565b979650505050505050565b606f5460ff161562001e6157604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001eb092600160c01b9004811691166200526f565b6001600160401b0316111562001ed957604051638a0704d360e01b815260040160405180910390fd5b6103e862001ee8888862005373565b6001600160401b0316111562001f1157604051635acfba9d60e11b815260040160405180910390fd5b62001f23818989898989898962003857565b62001f2f8187620040d5565b6085546001600160401b03166000036200203d57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001fab576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001fe4620026c3565b6040518263ffffffff1660e01b81526004016200200391815260200190565b600060405180830381600087803b1580156200201e57600080fd5b505af115801562002033573d6000803e3d6000fd5b5050505062002107565b6200204881620042d2565b600681018054600160801b90046001600160401b03169060106200206c8362005396565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b48887896040516200214d9392919062005238565b60405180910390a3505050505050505050565b606f5460ff16156200218557604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88166000908152608160205260409020620021ac8189898989898989620034cf565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16200220b62003e45565b505050505050505050565b80516080805463ffffffff191663ffffffff90921691909117905560005b8151811015620017eb57818181518110620022535762002253620053bd565b6020026020010151608160008360016200226e9190620053d3565b63ffffffff168152602081019190915260400160002060050155806200229481620053e9565b91505062002234565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162002319919062004ee7565b602060405180830381865afa15801562002337573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200235d919062005405565b60845490915060009062002384906001600160401b03600160401b82048116911662005373565b6001600160401b0316905080600003620023a15760009250505090565b620023ad818362005435565b9250505090565b606f5460009060ff1615620023dc57604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362002414576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200243f57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620024729084906001600160401b03166200526f565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620024a887836200526f565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200253783620042d2565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a25826040516200256f9190620048d9565b60405180910390a29695505050505050565b60008051602062005fec8339815191526200259c81620034c3565b606f5460ff16620025d7576085546001600160401b0390811690831610620025d75760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590620016dc908490620048d9565b60008051602062005fec8339815191526200263f81620034c3565b62015180826001600160401b031611156200266d57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890620016dc908490620048d9565b60805460009063ffffffff16808203620026df57506000919050565b6000816001600160401b03811115620026fc57620026fc62004baf565b60405190808252806020026020018201604052801562002726578160200160208202803683370190505b50905060005b8281101562002799576081600062002746836001620053d3565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620027795762002779620053bd565b6020908102919091010152806200279081620053e9565b9150506200272c565b50600060205b83600114620029dd576000620027b76002866200544c565b620027c460028762005435565b620027d09190620053d3565b90506000816001600160401b03811115620027ef57620027ef62004baf565b60405190808252806020026020018201604052801562002819578160200160208202803683370190505b50905060005b8281101562002991576200283560018462005463565b811480156200285057506200284c6002886200544c565b6001145b15620028d057856200286482600262005299565b81518110620028775762002877620053bd565b6020026020010151856040516020016200289392919062005479565b60405160208183030381529060405280519060200120828281518110620028be57620028be620053bd565b6020026020010181815250506200297c565b85620028de82600262005299565b81518110620028f157620028f1620053bd565b60200260200101518682600262002909919062005299565b62002916906001620053d3565b81518110620029295762002929620053bd565b60200260200101516040516020016200294492919062005479565b604051602081830303815290604052805190602001208282815181106200296f576200296f620053bd565b6020026020010181815250505b806200298881620053e9565b9150506200281f565b508094508195508384604051602001620029ad92919062005479565b6040516020818303038152906040528051906020012093508280620029d29062005487565b93505050506200279f565b600083600081518110620029f557620029f5620053bd565b6020026020010151905060005b8281101562002a7b57818460405160200162002a2092919062005479565b604051602081830303815290604052805190602001209150838460405160200162002a4d92919062005479565b604051602081830303815290604052805190602001209350808062002a7290620053e9565b91505062002a02565b5095945050505050565b60008051602062005eec83398151915262002aa081620034c3565b63ffffffff8416158062002abf5750607e5463ffffffff908116908516115b1562002ade57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002b1f576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002b6e57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002bb557604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002bf357604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002c738462001247565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002cc89216908b908b90600401620054a1565b600060405180830381600087803b15801562002ce357600080fd5b505af115801562002cf8573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005f0c83398151915262002d6d81620034c3565b683635c9adc5dea0000082118062002d885750633b9aca0082105b1562002da757604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620016dc565b62002de8826200177e565b62002df381620034c3565b62001637838362003f30565b60008051602062005f6c83398151915262002e1a81620034c3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002e7657600080fd5b505af115801562002e8b573d6000803e3d6000fd5b5050505062002e996200439d565b50565b60008051602062005fcc83398151915262002eb781620034c3565b6001600160401b03841660009081526083602052604090205463ffffffff161562002ef5576040516337c8fe0960e11b815260040160405180910390fd5b600062002f0888888888876000620031df565b60008080526002909101602052604090209390935550505050505050565b60008051602062005f4c83398151915262002f4181620034c3565b607e805460009190829062002f5c9063ffffffff16620052b3565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620030ff96959493929190620054e1565b60405180910390a25050505050505050565b600054610100900460ff166200177c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b5f565b620017eb828262003ec4565b600062003197836200177e565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6080805460009182918290620031fb9063ffffffff16620052b3565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000876001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff16021790555080608260008a6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150878260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550868260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620033fa9594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b03828116600090815260048501602052604081205490924292620034409291811691166200526f565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b031615620034a6575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002e998133620043f6565b60078801546000906001600160401b039081169087161015620035055760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620035a65760068901546001600160401b03600160801b909104811690891611156200354f5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200359f57604051632bd2e3e760e01b815260040160405180910390fd5b506200361b565b506001600160401b038516600090815260028901602052604090205480620035e1576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b909104811690871611156200361b57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620036545750876001600160401b0316876001600160401b031611155b8062003678575060068901546001600160401b03600160c01b909104811690881611155b15620036975760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b9004811690861614620036de576040516332a2a77f60e01b815260040160405180910390fd5b6000620036f08a888888868962003f9a565b9050600060008051602062005f8c8339815191526002836040516200371691906200552e565b602060405180830381855afa15801562003734573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003759919062005405565b6200376591906200544c565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620037a9918891906004016200554c565b602060405180830381865afa158015620037c7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620037ed919062005589565b6200380b576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c0160205260409020600201548590036200384a5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620038658a62003452565b60078b01549091506001600160401b0390811690891610156200389b5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038916156200393e5760068a01546001600160401b03600160801b9091048116908a161115620038e55760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200393757604051632bd2e3e760e01b815260040160405180910390fd5b50620039ae565b6001600160401b038816600090815260028b0160205260409020549150816200397a576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b03161115620039ae57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620039e15760405163b9b18f5760e01b815260040160405180910390fd5b6000620039f38b8a8a8a878b62003f9a565b9050600060008051602062005f8c83398151915260028360405162003a1991906200552e565b602060405180830381855afa15801562003a37573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003a5c919062005405565b62003a6891906200544c565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003aac918991906004016200554c565b602060405180830381865afa15801562003aca573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003af0919062005589565b62003b0e576040516309bde33960e01b815260040160405180910390fd5b600062003b1c848b62005373565b905062003b7587826001600160401b031662003b37620022c8565b62003b43919062005299565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004420565b80608460088282829054906101000a90046001600160401b031662003b9b91906200526f565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b15801562003c2b57600080fd5b505af115801562003c40573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003c92575060068201546001600160401b03600160801b9091048116908216115b1562003cb15760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003d6d620026c3565b6040518263ffffffff1660e01b815260040162003d8c91815260200190565b600060405180830381600087803b15801562003da757600080fd5b505af115801562003dbc573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003ea157600080fd5b505af115801562003eb6573d6000803e3d6000fd5b505050506200177c62004474565b62003ed082826200229d565b620017eb5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003f3c82826200229d565b15620017eb5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003fd0575081155b1562003fef5760405163340c614f60e11b815260040160405180910390fd5b806200400e576040516366385b5160e01b815260040160405180910390fd5b6200401984620044d1565b62004037576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b6000620040e28362003452565b905081600080620040f4848462005373565b6085546001600160401b0391821692506000916200411b91600160401b9004164262005463565b90505b846001600160401b0316846001600160401b031614620041a5576001600160401b0380851660009081526003890160205260409020600181015490911682101562004180576001810154600160401b90046001600160401b031694506200419e565b6200418c868662005373565b6001600160401b0316935050620041a5565b506200411e565b6000620041b3848462005463565b9050838110156200421157808403600c8111620041d15780620041d4565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a60865402816200420657620042066200541f565b046086555062004289565b838103600c811162004224578062004227565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a764000002816200426157620042616200541f565b04905080608654670de0b6b3a764000002816200428257620042826200541f565b0460865550505b683635c9adc5dea000006086541115620042b057683635c9adc5dea00000608655620042c8565b633b9aca006086541015620042c857633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002e995760068101546000906200431d90600160c01b90046001600160401b031660016200526f565b90506200432b82826200340d565b15620017eb57600682015460009060029062004359908490600160801b90046001600160401b031662005373565b620043659190620055ad565b6200437190836200526f565b90506200437f83826200340d565b15620043915762001637838262003c53565b62001637838362003c53565b606f5460ff16620043c157604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6200440282826200229d565b620017eb57604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526200163790849062004557565b606f5460ff16156200449957604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b03831610801562004508575067ffffffff00000001604083901c6001600160401b0316105b801562004529575067ffffffff00000001608083901c6001600160401b0316105b801562004541575067ffffffff0000000160c083901c105b156200454f57506001919050565b506000919050565b6000620045ae826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620046309092919063ffffffff16565b805190915015620016375780806020019051810190620045cf919062005589565b620016375760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b5f565b606062004641848460008562004649565b949350505050565b606082471015620046ac5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b5f565b600080866001600160a01b03168587604051620046ca91906200552e565b60006040518083038185875af1925050503d806000811462004709576040519150601f19603f3d011682016040523d82523d6000602084013e6200470e565b606091505b509150915062001e3187838387606083156200478f57825160000362004787576001600160a01b0385163b620047875760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b5f565b508162004641565b620046418383815115620047a65781518083602001fd5b8060405162461bcd60e51b815260040162000b5f919062004df5565b6108f580620055d783390190565b6001600160a01b038116811462002e9957600080fd5b80356001600160401b0381168114620034be57600080fd5b6000806000806000806000806000806101408b8d0312156200481f57600080fd5b8a356200482c81620047d0565b99506200483c60208c01620047e6565b98506200484c60408c01620047e6565b975060608b01356200485e81620047d0565b965060808b01356200487081620047d0565b955060a08b01356200488281620047d0565b945060c08b01356200489481620047d0565b935060e08b0135620048a681620047d0565b9250620048b76101008c01620047e6565b9150620048c86101208c01620047e6565b90509295989b9194979a5092959850565b6001600160401b0391909116815260200190565b803563ffffffff81168114620034be57600080fd5b600080604083850312156200491657600080fd5b6200492183620048ed565b91506200493160208401620047e6565b90509250929050565b60008060008060008060c087890312156200495457600080fd5b86356200496181620047d0565b95506200497160208801620047e6565b94506200498160408801620047e6565b935060608701356200499381620047d0565b92506080870135620049a581620047d0565b915060a0870135620049b781620047d0565b809150509295509295509295565b600060208284031215620049d857600080fd5b62000f9082620048ed565b80610300810183101562000f9357600080fd5b6000806000806000806000806103e0898b03121562004a1457600080fd5b62004a1f89620048ed565b975062004a2f60208a01620047e6565b965062004a3f60408a01620047e6565b955062004a4f60608a01620047e6565b945062004a5f60808a01620047e6565b935060a0890135925060c0890135915062004a7e8a60e08b01620049e3565b90509295985092959890939650565b6000806000806000806000806103e0898b03121562004aab57600080fd5b62004ab689620048ed565b975062004ac660208a01620047e6565b965062004ad660408a01620047e6565b955062004ae660608a01620047e6565b94506080890135935060a0890135925060c089013562004b0681620047d0565b915062004a7e8a60e08b01620049e3565b60006020828403121562004b2a57600080fd5b813561ffff8116811462004b3d57600080fd5b9392505050565b60006020828403121562004b5757600080fd5b5035919050565b6000806040838503121562004b7257600080fd5b82359150602083013562004b8681620047d0565b809150509250929050565b60006020828403121562004ba457600080fd5b62000f9082620047e6565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562004bf05762004bf062004baf565b604052919050565b600082601f83011262004c0a57600080fd5b81356001600160401b0381111562004c265762004c2662004baf565b62004c3b601f8201601f191660200162004bc5565b81815284602083860101111562004c5157600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600080600060e0888a03121562004c8a57600080fd5b62004c9588620048ed565b965062004ca560208901620047e6565b9550604088013562004cb781620047d0565b9450606088013562004cc981620047d0565b9350608088013562004cdb81620047d0565b925060a08801356001600160401b038082111562004cf857600080fd5b62004d068b838c0162004bf8565b935060c08a013591508082111562004d1d57600080fd5b5062004d2c8a828b0162004bf8565b91505092959891949750929550565b60008060008060008060c0878903121562004d5557600080fd5b62004d6087620048ed565b955062004d7060208801620047e6565b945062004d8060408801620047e6565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004dbe57818101518382015260200162004da4565b50506000910152565b6000815180845262004de181602086016020860162004da1565b601f01601f19169290920160200192915050565b60208152600062000f90602083018462004dc7565b6000602080838503121562004e1e57600080fd5b82356001600160401b038082111562004e3657600080fd5b818501915085601f83011262004e4b57600080fd5b81358181111562004e605762004e6062004baf565b8060051b915062004e7384830162004bc5565b818152918301840191848101908884111562004e8e57600080fd5b938501935b8385101562004eae5784358252938501939085019062004e93565b98975050505050505050565b6000806040838503121562004ece57600080fd5b62004ed983620047e6565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000806000806060858703121562004f1257600080fd5b843562004f1f81620047d0565b935062004f2f60208601620048ed565b925060408501356001600160401b038082111562004f4c57600080fd5b818701915087601f83011262004f6157600080fd5b81358181111562004f7157600080fd5b88602082850101111562004f8457600080fd5b95989497505060200194505050565b60006020828403121562004fa657600080fd5b813562004b3d81620047d0565b803560ff81168114620034be57600080fd5b60008060008060008060c0878903121562004fdf57600080fd5b863562004fec81620047d0565b9550602087013562004ffe81620047d0565b94506200500e60408801620047e6565b93506200501e60608801620047e6565b9250608087013591506200503560a0880162004fb3565b90509295509295509295565b60008060008060008060c087890312156200505b57600080fd5b86356200506881620047d0565b955060208701356200507a81620047d0565b94506200508a60408801620047e6565b93506200509a6060880162004fb3565b92506080870135915060a08701356001600160401b03811115620050bd57600080fd5b620050cb89828a0162004bf8565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b8054600090600181811c90808316806200514157607f831692505b602080841082036200516357634e487b7160e01b600052602260045260246000fd5b838852602088018280156200518157600181146200519857620051c5565b60ff198716825285151560051b82019750620051c5565b60008981526020902060005b87811015620051bf57815484820152908601908401620051a4565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c060408201819052600090620052009083018762005126565b828103606084015262005214818762005126565b608084019590955250506001600160401b039190911660a090910152949350505050565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562005292576200529262005259565b5092915050565b808202811582820484141762000f935762000f9362005259565b600063ffffffff808316818103620052cf57620052cf62005259565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620053079083018462004dc7565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c060808201819052600090620053529083018562004dc7565b82810360a084015262005366818562004dc7565b9998505050505050505050565b6001600160401b0382811682821603908082111562005292576200529262005259565b60006001600160401b038281166002600160401b03198101620052cf57620052cf62005259565b634e487b7160e01b600052603260045260246000fd5b8082018082111562000f935762000f9362005259565b600060018201620053fe57620053fe62005259565b5060010190565b6000602082840312156200541857600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b6000826200544757620054476200541f565b500490565b6000826200545e576200545e6200541f565b500690565b8181038181111562000f935762000f9362005259565b918252602082015260400190565b60008162005499576200549962005259565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a0820181905260009062004eae9083018462004dc7565b600082516200554281846020870162004da1565b9190910192915050565b61032081016103008085843782018360005b60018110156200557f5781518352602092830192909101906001016200555e565b5050509392505050565b6000602082840312156200559c57600080fd5b8151801515811462004b3d57600080fd5b60006001600160401b0383811680620055ca57620055ca6200541f565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220a19e7a72432195d9a35c7ce8fa5f1284415aac66bb1ad08a4c2e1c252fd8690864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220f0c277530fc86ddd05a56918423fafab9c54bee2881e81568f1fab8a3f325a3d64736f6c63430008140033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620002aa5760003560e01c80630645af0914620002af578063066ec01214620002c8578063080b311114620002f45780630a0d9fbe146200031c5780630e36f582146200033757806311f6b287146200034e57806312b86e1914620003655780631489ed10146200037c57806315064c9614620003935780631608859c14620003a15780631796a1ae14620003b85780631816b7e514620003df5780632072f6c514620003f6578063248a9ca314620004005780632528016914620004265780632f2ff15d14620004db57806336568abe14620004f2578063394218e91462000509578063477fa270146200052057806355a71ee0146200052957806360469169146200056d57806365c0504d14620005775780637222020f1462000626578063727885e9146200063d5780637975fcfe14620006545780637fb6e76a146200067a578063841b24d714620006a357806387c20c0114620006be5780638bd4f07114620006d55780638f698ec514620006ec57806391d14854146200070357806399f5634e146200071a5780639a908e7314620007245780639c9f3dfe146200073b578063a066215c1462000752578063a217fddf1462000769578063a2967d991462000772578063a3c573eb146200077c578063afd23cbe14620007b3578063b99d0ad714620007dd578063c1acbc3414620008b5578063c4c928c214620008d0578063ceee281d14620008e7578063d02103ca1462000910578063d5073f6f1462000938578063d547741f146200094f578063d939b3151462000966578063dbc16976146200097a578063dde0ff771462000984578063e0bfd3d2146200099f578063e46761c414620009b6578063f34eb8eb14620009de578063f4e9267514620009f5578063f9c4c2ae1462000a06575b600080fd5b620002c6620002c0366004620047fe565b62000b1d565b005b608454620002dc906001600160401b031681565b604051620002eb9190620048d9565b60405180910390f35b6200030b6200030536600462004902565b62000f6f565b6040519015158152602001620002eb565b608554620002dc90600160401b90046001600160401b031681565b620002c6620003483660046200493a565b62000f99565b620002dc6200035f366004620049c5565b62001247565b620002c662000376366004620049f6565b62001267565b620002c66200038d36600462004a8d565b62001417565b606f546200030b9060ff1681565b620002c6620003b236600462004902565b620015a7565b607e54620003c99063ffffffff1681565b60405163ffffffff9091168152602001620002eb565b620002c6620003f036600462004b17565b6200163c565b620002c6620016e8565b620004176200041136600462004b44565b6200177e565b604051908152602001620002eb565b620004a76200043736600462004902565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002eb565b620002c6620004ec36600462004b5e565b62001793565b620002c66200050336600462004b5e565b620017b5565b620002c66200051a36600462004b91565b620017ef565b60865462000417565b620004176200053a36600462004902565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620004176200189e565b620005dc62000588366004620049c5565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002eb565b620002c662000637366004620049c5565b620018b6565b620002c66200064e36600462004c6e565b620019a1565b6200066b6200066536600462004d3b565b62001e09565b604051620002eb919062004df5565b620003c96200068b36600462004b91565b60836020526000908152604090205463ffffffff1681565b608454620002dc90600160c01b90046001600160401b031681565b620002c6620006cf36600462004a8d565b62001e3c565b620002c6620006e6366004620049f6565b62002160565b620002c6620006fd36600462004e0a565b62002216565b6200030b6200071436600462004b5e565b6200229d565b62000417620022c8565b620002dc6200073536600462004eba565b620023b4565b620002c66200074c36600462004b91565b62002581565b620002c66200076336600462004b91565b62002624565b62000417600081565b62000417620026c3565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b604051620002eb919062004ee7565b608554620007c990600160801b900461ffff1681565b60405161ffff9091168152602001620002eb565b62000873620007ee36600462004902565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002eb919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002dc90600160801b90046001600160401b031681565b620002c6620008e136600462004efb565b62002a85565b620003c9620008f836600462004f93565b60826020526000908152604090205463ffffffff1681565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b620002c66200094936600462004b44565b62002d52565b620002c66200096036600462004b5e565b62002ddd565b608554620002dc906001600160401b031681565b620002c662002dff565b608454620002dc90600160401b90046001600160401b031681565b620002c6620009b036600462004fc5565b62002e9c565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b620002c6620009ef36600462005041565b62002f26565b608054620003c99063ffffffff1681565b62000a9d62000a17366004620049c5565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002eb565b600054600290610100900460ff1615801562000b40575060005460ff8083169116105b62000b685760405162461bcd60e51b815260040162000b5f90620050d8565b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000be962003111565b62000c046000805160206200606c8339815191528c6200317e565b62000c116000886200317e565b62000c2c60008051602062005f4c833981519152886200317e565b62000c4760008051602062005fcc833981519152886200317e565b62000c6260008051602062005eec833981519152886200317e565b62000c7d60008051602062005f2c833981519152896200317e565b62000c986000805160206200604c833981519152896200317e565b62000cb360008051602062005f6c833981519152896200317e565b62000cce60008051602062005fec833981519152896200317e565b62000cf86000805160206200606c83398151915260008051602062005ecc8339815191526200318a565b62000d1360008051602062005ecc833981519152896200317e565b62000d2e60008051602062005f0c833981519152896200317e565b62000d586000805160206200602c8339815191526000805160206200600c8339815191526200318a565b62000d736000805160206200602c833981519152876200317e565b62000d8e6000805160206200600c833981519152876200317e565b6073546074546001600160401b03600160401b9092048216911680821462000dc957604051632e4cc54360e11b815260040160405180910390fd5b600062000df1888888886000607460009054906101000a90046001600160401b0316620031df565b6001600160401b03838116600081815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068b018054909216909417938802939093179092556007880180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81529596506001600160a01b038e81169663bb5907089662000ef39694831695600160581b909504909216936076936077939092911690600401620051d2565b600060405180830381600087803b15801562000f0e57600080fd5b505af115801562000f23573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff8516815260008051602062005fac8339815191529350602001915062000f5a9050565b60405180910390a15050505050505050505050565b63ffffffff8216600090815260816020526040812062000f9090836200340d565b90505b92915050565b600054600290610100900460ff1615801562000fbc575060005460ff8083169116105b62000fdb5760405162461bcd60e51b815260040162000b5f90620050d8565b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200105c62003111565b620010776000805160206200606c833981519152886200317e565b620010846000846200317e565b6200109f60008051602062005f4c833981519152846200317e565b620010ba60008051602062005fcc833981519152846200317e565b620010d560008051602062005eec833981519152846200317e565b620010f060008051602062005f2c833981519152856200317e565b6200110b6000805160206200604c833981519152856200317e565b6200112660008051602062005f6c833981519152856200317e565b6200114160008051602062005fec833981519152856200317e565b6200116b6000805160206200606c83398151915260008051602062005ecc8339815191526200318a565b6200118660008051602062005ecc833981519152856200317e565b620011a160008051602062005f0c833981519152856200317e565b620011cb6000805160206200602c8339815191526000805160206200600c8339815191526200318a565b620011e66000805160206200602c833981519152836200317e565b620012016000805160206200600c833981519152836200317e565b6200120e6000336200317e565b6000805461ff001916905560405160ff8216815260008051602062005fac8339815191529060200160405180910390a150505050505050565b63ffffffff8116600090815260816020526040812062000f939062003452565b6000805160206200606c8339815191526200128281620034c3565b63ffffffff89166000908152608160205260409020620012a9818a8a8a8a8a8a8a620034cf565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001311576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200134a620026c3565b6040518263ffffffff1660e01b81526004016200136991815260200190565b600060405180830381600087803b1580156200138457600080fd5b505af115801562001399573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b6000805160206200606c8339815191526200143281620034c3565b63ffffffff8916600090815260816020526040902062001459818a8a8a8a8a8a8a62003857565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b90041615620014c1576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620014fa620026c3565b6040518263ffffffff1660e01b81526004016200151991815260200190565b600060405180830381600087803b1580156200153457600080fd5b505af115801562001549573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a604051620015939392919062005238565b60405180910390a350505050505050505050565b63ffffffff82166000908152608160205260409020620015d76000805160206200606c833981519152336200229d565b6200162b57606f5460ff16156200160157604051630bc011ff60e21b815260040160405180910390fd5b6200160d81836200340d565b6200162b57604051630674f25160e11b815260040160405180910390fd5b62001637818362003c53565b505050565b60008051602062005fec8339815191526200165781620034c3565b6103e88261ffff1610806200167157506103ff8261ffff16115b156200169057604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620017036000805160206200602c833981519152336200229d565b6200177257608454600160801b90046001600160401b031615806200175357506084544290620017489062093a8090600160801b90046001600160401b03166200526f565b6001600160401b0316115b15620017725760405163692baaad60e11b815260040160405180910390fd5b6200177c62003e45565b565b60009081526034602052604090206001015490565b6200179e826200177e565b620017a981620034c3565b62001637838362003ec4565b6001600160a01b0381163314620017df57604051630b4ad1cd60e31b815260040160405180910390fd5b620017eb828262003f30565b5050565b60008051602062005fec8339815191526200180a81620034c3565b606f5460ff166200184c576084546001600160401b03600160c01b9091048116908316106200184c5760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190620016dc908490620048d9565b60006086546064620018b1919062005299565b905090565b60008051602062005f2c833981519152620018d181620034c3565b63ffffffff82161580620018f05750607e5463ffffffff908116908316115b156200190f57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200195657604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b6000805160206200604c833981519152620019bc81620034c3565b63ffffffff88161580620019db5750607e5463ffffffff908116908916115b15620019fa57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff161515900362001a4157604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001a7f576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062001a9a9063ffffffff16620052b3565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001ae890620047c2565b62001af693929190620052d9565b604051809103906000f08015801562001b13573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001d87949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001dc7908d908d9088908e908e908e9060040162005310565b600060405180830381600087803b15801562001de257600080fd5b505af115801562001df7573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001e3190878787878762003f9a565b979650505050505050565b606f5460ff161562001e6157604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001eb092600160c01b9004811691166200526f565b6001600160401b0316111562001ed957604051638a0704d360e01b815260040160405180910390fd5b6103e862001ee8888862005373565b6001600160401b0316111562001f1157604051635acfba9d60e11b815260040160405180910390fd5b62001f23818989898989898962003857565b62001f2f8187620040d5565b6085546001600160401b03166000036200203d57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001fab576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001fe4620026c3565b6040518263ffffffff1660e01b81526004016200200391815260200190565b600060405180830381600087803b1580156200201e57600080fd5b505af115801562002033573d6000803e3d6000fd5b5050505062002107565b6200204881620042d2565b600681018054600160801b90046001600160401b03169060106200206c8362005396565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b48887896040516200214d9392919062005238565b60405180910390a3505050505050505050565b606f5460ff16156200218557604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88166000908152608160205260409020620021ac8189898989898989620034cf565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16200220b62003e45565b505050505050505050565b80516080805463ffffffff191663ffffffff90921691909117905560005b8151811015620017eb57818181518110620022535762002253620053bd565b6020026020010151608160008360016200226e9190620053d3565b63ffffffff168152602081019190915260400160002060050155806200229481620053e9565b91505062002234565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162002319919062004ee7565b602060405180830381865afa15801562002337573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200235d919062005405565b60845490915060009062002384906001600160401b03600160401b82048116911662005373565b6001600160401b0316905080600003620023a15760009250505090565b620023ad818362005435565b9250505090565b606f5460009060ff1615620023dc57604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362002414576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200243f57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620024729084906001600160401b03166200526f565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620024a887836200526f565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200253783620042d2565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a25826040516200256f9190620048d9565b60405180910390a29695505050505050565b60008051602062005fec8339815191526200259c81620034c3565b606f5460ff16620025d7576085546001600160401b0390811690831610620025d75760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590620016dc908490620048d9565b60008051602062005fec8339815191526200263f81620034c3565b62015180826001600160401b031611156200266d57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890620016dc908490620048d9565b60805460009063ffffffff16808203620026df57506000919050565b6000816001600160401b03811115620026fc57620026fc62004baf565b60405190808252806020026020018201604052801562002726578160200160208202803683370190505b50905060005b8281101562002799576081600062002746836001620053d3565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620027795762002779620053bd565b6020908102919091010152806200279081620053e9565b9150506200272c565b50600060205b83600114620029dd576000620027b76002866200544c565b620027c460028762005435565b620027d09190620053d3565b90506000816001600160401b03811115620027ef57620027ef62004baf565b60405190808252806020026020018201604052801562002819578160200160208202803683370190505b50905060005b8281101562002991576200283560018462005463565b811480156200285057506200284c6002886200544c565b6001145b15620028d057856200286482600262005299565b81518110620028775762002877620053bd565b6020026020010151856040516020016200289392919062005479565b60405160208183030381529060405280519060200120828281518110620028be57620028be620053bd565b6020026020010181815250506200297c565b85620028de82600262005299565b81518110620028f157620028f1620053bd565b60200260200101518682600262002909919062005299565b62002916906001620053d3565b81518110620029295762002929620053bd565b60200260200101516040516020016200294492919062005479565b604051602081830303815290604052805190602001208282815181106200296f576200296f620053bd565b6020026020010181815250505b806200298881620053e9565b9150506200281f565b508094508195508384604051602001620029ad92919062005479565b6040516020818303038152906040528051906020012093508280620029d29062005487565b93505050506200279f565b600083600081518110620029f557620029f5620053bd565b6020026020010151905060005b8281101562002a7b57818460405160200162002a2092919062005479565b604051602081830303815290604052805190602001209150838460405160200162002a4d92919062005479565b604051602081830303815290604052805190602001209350808062002a7290620053e9565b91505062002a02565b5095945050505050565b60008051602062005eec83398151915262002aa081620034c3565b63ffffffff8416158062002abf5750607e5463ffffffff908116908516115b1562002ade57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002b1f576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002b6e57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002bb557604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002bf357604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002c738462001247565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002cc89216908b908b90600401620054a1565b600060405180830381600087803b15801562002ce357600080fd5b505af115801562002cf8573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005f0c83398151915262002d6d81620034c3565b683635c9adc5dea0000082118062002d885750633b9aca0082105b1562002da757604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620016dc565b62002de8826200177e565b62002df381620034c3565b62001637838362003f30565b60008051602062005f6c83398151915262002e1a81620034c3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002e7657600080fd5b505af115801562002e8b573d6000803e3d6000fd5b5050505062002e996200439d565b50565b60008051602062005fcc83398151915262002eb781620034c3565b6001600160401b03841660009081526083602052604090205463ffffffff161562002ef5576040516337c8fe0960e11b815260040160405180910390fd5b600062002f0888888888876000620031df565b60008080526002909101602052604090209390935550505050505050565b60008051602062005f4c83398151915262002f4181620034c3565b607e805460009190829062002f5c9063ffffffff16620052b3565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620030ff96959493929190620054e1565b60405180910390a25050505050505050565b600054610100900460ff166200177c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b5f565b620017eb828262003ec4565b600062003197836200177e565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6080805460009182918290620031fb9063ffffffff16620052b3565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000876001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff16021790555080608260008a6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150878260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550868260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620033fa9594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b03828116600090815260048501602052604081205490924292620034409291811691166200526f565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b031615620034a6575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002e998133620043f6565b60078801546000906001600160401b039081169087161015620035055760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620035a65760068901546001600160401b03600160801b909104811690891611156200354f5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200359f57604051632bd2e3e760e01b815260040160405180910390fd5b506200361b565b506001600160401b038516600090815260028901602052604090205480620035e1576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b909104811690871611156200361b57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620036545750876001600160401b0316876001600160401b031611155b8062003678575060068901546001600160401b03600160c01b909104811690881611155b15620036975760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b9004811690861614620036de576040516332a2a77f60e01b815260040160405180910390fd5b6000620036f08a888888868962003f9a565b9050600060008051602062005f8c8339815191526002836040516200371691906200552e565b602060405180830381855afa15801562003734573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003759919062005405565b6200376591906200544c565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620037a9918891906004016200554c565b602060405180830381865afa158015620037c7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620037ed919062005589565b6200380b576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c0160205260409020600201548590036200384a5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620038658a62003452565b60078b01549091506001600160401b0390811690891610156200389b5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038916156200393e5760068a01546001600160401b03600160801b9091048116908a161115620038e55760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200393757604051632bd2e3e760e01b815260040160405180910390fd5b50620039ae565b6001600160401b038816600090815260028b0160205260409020549150816200397a576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b03161115620039ae57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620039e15760405163b9b18f5760e01b815260040160405180910390fd5b6000620039f38b8a8a8a878b62003f9a565b9050600060008051602062005f8c83398151915260028360405162003a1991906200552e565b602060405180830381855afa15801562003a37573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003a5c919062005405565b62003a6891906200544c565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003aac918991906004016200554c565b602060405180830381865afa15801562003aca573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003af0919062005589565b62003b0e576040516309bde33960e01b815260040160405180910390fd5b600062003b1c848b62005373565b905062003b7587826001600160401b031662003b37620022c8565b62003b43919062005299565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004420565b80608460088282829054906101000a90046001600160401b031662003b9b91906200526f565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b15801562003c2b57600080fd5b505af115801562003c40573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003c92575060068201546001600160401b03600160801b9091048116908216115b1562003cb15760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003d6d620026c3565b6040518263ffffffff1660e01b815260040162003d8c91815260200190565b600060405180830381600087803b15801562003da757600080fd5b505af115801562003dbc573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003ea157600080fd5b505af115801562003eb6573d6000803e3d6000fd5b505050506200177c62004474565b62003ed082826200229d565b620017eb5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003f3c82826200229d565b15620017eb5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003fd0575081155b1562003fef5760405163340c614f60e11b815260040160405180910390fd5b806200400e576040516366385b5160e01b815260040160405180910390fd5b6200401984620044d1565b62004037576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b6000620040e28362003452565b905081600080620040f4848462005373565b6085546001600160401b0391821692506000916200411b91600160401b9004164262005463565b90505b846001600160401b0316846001600160401b031614620041a5576001600160401b0380851660009081526003890160205260409020600181015490911682101562004180576001810154600160401b90046001600160401b031694506200419e565b6200418c868662005373565b6001600160401b0316935050620041a5565b506200411e565b6000620041b3848462005463565b9050838110156200421157808403600c8111620041d15780620041d4565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a60865402816200420657620042066200541f565b046086555062004289565b838103600c811162004224578062004227565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a764000002816200426157620042616200541f565b04905080608654670de0b6b3a764000002816200428257620042826200541f565b0460865550505b683635c9adc5dea000006086541115620042b057683635c9adc5dea00000608655620042c8565b633b9aca006086541015620042c857633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002e995760068101546000906200431d90600160c01b90046001600160401b031660016200526f565b90506200432b82826200340d565b15620017eb57600682015460009060029062004359908490600160801b90046001600160401b031662005373565b620043659190620055ad565b6200437190836200526f565b90506200437f83826200340d565b15620043915762001637838262003c53565b62001637838362003c53565b606f5460ff16620043c157604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6200440282826200229d565b620017eb57604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526200163790849062004557565b606f5460ff16156200449957604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b03831610801562004508575067ffffffff00000001604083901c6001600160401b0316105b801562004529575067ffffffff00000001608083901c6001600160401b0316105b801562004541575067ffffffff0000000160c083901c105b156200454f57506001919050565b506000919050565b6000620045ae826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620046309092919063ffffffff16565b805190915015620016375780806020019051810190620045cf919062005589565b620016375760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b5f565b606062004641848460008562004649565b949350505050565b606082471015620046ac5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b5f565b600080866001600160a01b03168587604051620046ca91906200552e565b60006040518083038185875af1925050503d806000811462004709576040519150601f19603f3d011682016040523d82523d6000602084013e6200470e565b606091505b509150915062001e3187838387606083156200478f57825160000362004787576001600160a01b0385163b620047875760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b5f565b508162004641565b620046418383815115620047a65781518083602001fd5b8060405162461bcd60e51b815260040162000b5f919062004df5565b6108f580620055d783390190565b6001600160a01b038116811462002e9957600080fd5b80356001600160401b0381168114620034be57600080fd5b6000806000806000806000806000806101408b8d0312156200481f57600080fd5b8a356200482c81620047d0565b99506200483c60208c01620047e6565b98506200484c60408c01620047e6565b975060608b01356200485e81620047d0565b965060808b01356200487081620047d0565b955060a08b01356200488281620047d0565b945060c08b01356200489481620047d0565b935060e08b0135620048a681620047d0565b9250620048b76101008c01620047e6565b9150620048c86101208c01620047e6565b90509295989b9194979a5092959850565b6001600160401b0391909116815260200190565b803563ffffffff81168114620034be57600080fd5b600080604083850312156200491657600080fd5b6200492183620048ed565b91506200493160208401620047e6565b90509250929050565b60008060008060008060c087890312156200495457600080fd5b86356200496181620047d0565b95506200497160208801620047e6565b94506200498160408801620047e6565b935060608701356200499381620047d0565b92506080870135620049a581620047d0565b915060a0870135620049b781620047d0565b809150509295509295509295565b600060208284031215620049d857600080fd5b62000f9082620048ed565b80610300810183101562000f9357600080fd5b6000806000806000806000806103e0898b03121562004a1457600080fd5b62004a1f89620048ed565b975062004a2f60208a01620047e6565b965062004a3f60408a01620047e6565b955062004a4f60608a01620047e6565b945062004a5f60808a01620047e6565b935060a0890135925060c0890135915062004a7e8a60e08b01620049e3565b90509295985092959890939650565b6000806000806000806000806103e0898b03121562004aab57600080fd5b62004ab689620048ed565b975062004ac660208a01620047e6565b965062004ad660408a01620047e6565b955062004ae660608a01620047e6565b94506080890135935060a0890135925060c089013562004b0681620047d0565b915062004a7e8a60e08b01620049e3565b60006020828403121562004b2a57600080fd5b813561ffff8116811462004b3d57600080fd5b9392505050565b60006020828403121562004b5757600080fd5b5035919050565b6000806040838503121562004b7257600080fd5b82359150602083013562004b8681620047d0565b809150509250929050565b60006020828403121562004ba457600080fd5b62000f9082620047e6565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562004bf05762004bf062004baf565b604052919050565b600082601f83011262004c0a57600080fd5b81356001600160401b0381111562004c265762004c2662004baf565b62004c3b601f8201601f191660200162004bc5565b81815284602083860101111562004c5157600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600080600060e0888a03121562004c8a57600080fd5b62004c9588620048ed565b965062004ca560208901620047e6565b9550604088013562004cb781620047d0565b9450606088013562004cc981620047d0565b9350608088013562004cdb81620047d0565b925060a08801356001600160401b038082111562004cf857600080fd5b62004d068b838c0162004bf8565b935060c08a013591508082111562004d1d57600080fd5b5062004d2c8a828b0162004bf8565b91505092959891949750929550565b60008060008060008060c0878903121562004d5557600080fd5b62004d6087620048ed565b955062004d7060208801620047e6565b945062004d8060408801620047e6565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004dbe57818101518382015260200162004da4565b50506000910152565b6000815180845262004de181602086016020860162004da1565b601f01601f19169290920160200192915050565b60208152600062000f90602083018462004dc7565b6000602080838503121562004e1e57600080fd5b82356001600160401b038082111562004e3657600080fd5b818501915085601f83011262004e4b57600080fd5b81358181111562004e605762004e6062004baf565b8060051b915062004e7384830162004bc5565b818152918301840191848101908884111562004e8e57600080fd5b938501935b8385101562004eae5784358252938501939085019062004e93565b98975050505050505050565b6000806040838503121562004ece57600080fd5b62004ed983620047e6565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000806000806060858703121562004f1257600080fd5b843562004f1f81620047d0565b935062004f2f60208601620048ed565b925060408501356001600160401b038082111562004f4c57600080fd5b818701915087601f83011262004f6157600080fd5b81358181111562004f7157600080fd5b88602082850101111562004f8457600080fd5b95989497505060200194505050565b60006020828403121562004fa657600080fd5b813562004b3d81620047d0565b803560ff81168114620034be57600080fd5b60008060008060008060c0878903121562004fdf57600080fd5b863562004fec81620047d0565b9550602087013562004ffe81620047d0565b94506200500e60408801620047e6565b93506200501e60608801620047e6565b9250608087013591506200503560a0880162004fb3565b90509295509295509295565b60008060008060008060c087890312156200505b57600080fd5b86356200506881620047d0565b955060208701356200507a81620047d0565b94506200508a60408801620047e6565b93506200509a6060880162004fb3565b92506080870135915060a08701356001600160401b03811115620050bd57600080fd5b620050cb89828a0162004bf8565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b8054600090600181811c90808316806200514157607f831692505b602080841082036200516357634e487b7160e01b600052602260045260246000fd5b838852602088018280156200518157600181146200519857620051c5565b60ff198716825285151560051b82019750620051c5565b60008981526020902060005b87811015620051bf57815484820152908601908401620051a4565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c060408201819052600090620052009083018762005126565b828103606084015262005214818762005126565b608084019590955250506001600160401b039190911660a090910152949350505050565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562005292576200529262005259565b5092915050565b808202811582820484141762000f935762000f9362005259565b600063ffffffff808316818103620052cf57620052cf62005259565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620053079083018462004dc7565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c060808201819052600090620053529083018562004dc7565b82810360a084015262005366818562004dc7565b9998505050505050505050565b6001600160401b0382811682821603908082111562005292576200529262005259565b60006001600160401b038281166002600160401b03198101620052cf57620052cf62005259565b634e487b7160e01b600052603260045260246000fd5b8082018082111562000f935762000f9362005259565b600060018201620053fe57620053fe62005259565b5060010190565b6000602082840312156200541857600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b6000826200544757620054476200541f565b500490565b6000826200545e576200545e6200541f565b500690565b8181038181111562000f935762000f9362005259565b918252602082015260400190565b60008162005499576200549962005259565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a0820181905260009062004eae9083018462004dc7565b600082516200554281846020870162004da1565b9190910192915050565b61032081016103008085843782018360005b60018110156200557f5781518352602092830192909101906001016200555e565b5050509392505050565b6000602082840312156200559c57600080fd5b8151801515811462004b3d57600080fd5b60006001600160401b0383811680620055ca57620055ca6200541f565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220a19e7a72432195d9a35c7ce8fa5f1284415aac66bb1ad08a4c2e1c252fd8690864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220f0c277530fc86ddd05a56918423fafab9c54bee2881e81568f1fab8a3f325a3d64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonRollupManagerMockInternalTest.json b/compiled-contracts/paris/PolygonRollupManagerMockInternalTest.json index 8fa0a67c0..8855d3f57 100644 --- a/compiled-contracts/paris/PolygonRollupManagerMockInternalTest.json +++ b/compiled-contracts/paris/PolygonRollupManagerMockInternalTest.json @@ -236,6 +236,12 @@ "internalType": "uint8", "name": "rollupCompatibilityID", "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "lastVerifiedBatchBeforeUpgrade", + "type": "uint64" } ], "name": "AddExistingRollup", @@ -1266,6 +1272,16 @@ "internalType": "contract IVerifierRollup", "name": "zkEVMVerifier", "type": "address" + }, + { + "internalType": "uint64", + "name": "zkEVMForkID", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "zkEVMChainID", + "type": "uint64" } ], "name": "initialize", @@ -1969,8 +1985,8 @@ "type": "function" } ], - "bytecode": "0x60e06040523480156200001157600080fd5b50604051620060423803806200604283398101604081905262000034916200006b565b6001600160a01b0392831660805290821660c0521660a052620000bf565b6001600160a01b03811681146200006857600080fd5b50565b6000806000606084860312156200008157600080fd5b83516200008e8162000052565b6020850151909350620000a18162000052565b6040850151909250620000b48162000052565b809150509250925092565b60805160a05160c051615f1b620001276000396000818161099901528181612210015261386001526000818161075f01528181612d5f0152613b5a0152600081816108f301528181610ea70152818161105701528181611f770152613a490152615f1b6000f3fe60806040523480156200001157600080fd5b50600436106200029e5760003560e01c8063066ec01214620002a3578063080b311114620002cf5780630a0d9fbe14620002f75780630e36f582146200031257806311f6b287146200032b57806312b86e1914620003425780631489ed10146200035957806315064c9614620003705780631608859c146200037e5780631796a1ae14620003955780631816b7e514620003bc5780632072f6c514620003d3578063248a9ca314620003dd5780632528016914620004035780632f2ff15d14620004b857806336568abe14620004cf578063394218e914620004e6578063477fa27014620004fd5780634d4d3338146200050657806355a71ee0146200051d57806360469169146200056157806365c0504d146200056b5780637222020f146200061a578063727885e914620006315780637975fcfe14620006485780637fb6e76a146200066e578063841b24d7146200069757806387c20c0114620006b25780638bd4f07114620006c957806391d1485414620006e057806399f5634e14620006f75780639a908e7314620007015780639c9f3dfe1462000718578063a066215c146200072f578063a217fddf1462000746578063a2967d99146200074f578063a3c573eb1462000759578063afd23cbe1462000790578063b99d0ad714620007ba578063c1acbc341462000892578063c4c928c214620008ad578063ceee281d14620008c4578063d02103ca14620008ed578063d5073f6f1462000915578063d547741f146200092c578063d939b3151462000943578063dbc169761462000957578063dde0ff771462000961578063e0bfd3d2146200097c578063e46761c41462000993578063f34eb8eb14620009bb578063f4e9267514620009d2578063f9c4c2ae14620009e3575b600080fd5b608454620002b7906001600160401b031681565b604051620002c6919062004708565b60405180910390f35b620002e6620002e036600462004749565b62000afa565b6040519015158152602001620002c6565b608554620002b790600160401b90046001600160401b031681565b620003296200032336600462004797565b62000b24565b005b620002b76200033c36600462004822565b62000ddb565b620003296200035336600462004853565b62000dfb565b620003296200036a366004620048ea565b62000fab565b606f54620002e69060ff1681565b620003296200038f36600462004749565b6200113b565b607e54620003a69063ffffffff1681565b60405163ffffffff9091168152602001620002c6565b62000329620003cd36600462004974565b620011d0565b620003296200127c565b620003f4620003ee366004620049a1565b62001312565b604051908152602001620002c6565b620004846200041436600462004749565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002c6565b62000329620004c9366004620049bb565b62001327565b62000329620004e0366004620049bb565b62001349565b62000329620004f7366004620049ee565b62001383565b608654620003f4565b620003296200051736600462004a0c565b62001432565b620003f46200052e36600462004749565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620003f462001868565b620005d06200057c36600462004822565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002c6565b620003296200062b36600462004822565b62001880565b620003296200064236600462004b6c565b6200196b565b6200065f6200065936600462004c39565b62001dd3565b604051620002c6919062004cf3565b620003a66200067f366004620049ee565b60836020526000908152604090205463ffffffff1681565b608454620002b790600160c01b90046001600160401b031681565b62000329620006c3366004620048ea565b62001e06565b62000329620006da36600462004853565b6200212a565b620002e6620006f1366004620049bb565b620021e0565b620003f46200220b565b620002b76200071236600462004d08565b620022f7565b6200032962000729366004620049ee565b620024c4565b6200032962000740366004620049ee565b62002567565b620003f4600081565b620003f462002606565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b604051620002c6919062004d35565b608554620007a690600160801b900461ffff1681565b60405161ffff9091168152602001620002c6565b62000850620007cb36600462004749565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002c6919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002b790600160801b90046001600160401b031681565b62000329620008be36600462004d49565b620029c8565b620003a6620008d536600462004de1565b60826020526000908152604090205463ffffffff1681565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b6200032962000926366004620049a1565b62002c95565b620003296200093d366004620049bb565b62002d20565b608554620002b7906001600160401b031681565b6200032962002d42565b608454620002b790600160401b90046001600160401b031681565b620003296200098d36600462004e13565b62002ddf565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b62000329620009cc36600462004e8f565b62002e67565b608054620003a69063ffffffff1681565b62000a7a620009f436600462004822565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002c6565b63ffffffff8216600090815260816020526040812062000b1b908362003052565b90505b92915050565b600054600290610100900460ff1615801562000b47575060005460ff8083169116105b62000b6f5760405162461bcd60e51b815260040162000b669062004f26565b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000bf062003097565b62000c0b60008051602062005ec68339815191528862003104565b62000c1860008462003104565b62000c3360008051602062005da68339815191528462003104565b62000c4e60008051602062005e268339815191528462003104565b62000c6960008051602062005d468339815191528462003104565b62000c8460008051602062005d868339815191528562003104565b62000c9f60008051602062005ea68339815191528562003104565b62000cba60008051602062005dc68339815191528562003104565b62000cd560008051602062005e468339815191528562003104565b62000cff60008051602062005ec683398151915260008051602062005d2683398151915262003110565b62000d1a60008051602062005d268339815191528562003104565b62000d3560008051602062005d668339815191528562003104565b62000d5f60008051602062005e8683398151915260008051602062005e6683398151915262003110565b62000d7a60008051602062005e868339815191528362003104565b62000d9560008051602062005e668339815191528362003104565b62000da260003362003104565b6000805461ff001916905560405160ff8216815260008051602062005e068339815191529060200160405180910390a150505050505050565b63ffffffff8116600090815260816020526040812062000b1e9062003165565b60008051602062005ec683398151915262000e1681620031d6565b63ffffffff8916600090815260816020526040902062000e3d818a8a8a8a8a8a8a620031e2565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000ea5576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000ede62002606565b6040518263ffffffff1660e01b815260040162000efd91815260200190565b600060405180830381600087803b15801562000f1857600080fd5b505af115801562000f2d573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005ec683398151915262000fc681620031d6565b63ffffffff8916600090815260816020526040902062000fed818a8a8a8a8a8a8a6200356a565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562001055576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200108e62002606565b6040518263ffffffff1660e01b8152600401620010ad91815260200190565b600060405180830381600087803b158015620010c857600080fd5b505af1158015620010dd573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a604051620011279392919062004f74565b60405180910390a350505050505050505050565b63ffffffff821660009081526081602052604090206200116b60008051602062005ec683398151915233620021e0565b620011bf57606f5460ff16156200119557604051630bc011ff60e21b815260040160405180910390fd5b620011a1818362003052565b620011bf57604051630674f25160e11b815260040160405180910390fd5b620011cb818362003966565b505050565b60008051602062005e46833981519152620011eb81620031d6565b6103e88261ffff1610806200120557506103ff8261ffff16115b156200122457604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200129760008051602062005e8683398151915233620021e0565b6200130657608454600160801b90046001600160401b03161580620012e757506084544290620012dc9062093a8090600160801b90046001600160401b031662004fab565b6001600160401b0316115b15620013065760405163692baaad60e11b815260040160405180910390fd5b6200131062003b58565b565b60009081526034602052604090206001015490565b620013328262001312565b6200133d81620031d6565b620011cb838362003bd7565b6001600160a01b03811633146200137357604051630b4ad1cd60e31b815260040160405180910390fd5b6200137f828262003c43565b5050565b60008051602062005e468339815191526200139e81620031d6565b606f5460ff16620013e0576084546001600160401b03600160c01b909104811690831610620013e05760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1906200127090849062004708565b600054600290610100900460ff1615801562001455575060005460ff8083169116105b620014745760405162461bcd60e51b815260040162000b669062004f26565b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b179055620014f562003097565b6200151060008051602062005ec68339815191528a62003104565b6200151d60008662003104565b6200153860008051602062005da68339815191528662003104565b6200155360008051602062005e268339815191528662003104565b6200156e60008051602062005d468339815191528662003104565b6200158960008051602062005d868339815191528762003104565b620015a460008051602062005ea68339815191528762003104565b620015bf60008051602062005dc68339815191528762003104565b620015da60008051602062005e468339815191528762003104565b6200160460008051602062005ec683398151915260008051602062005d2683398151915262003110565b6200161f60008051602062005d268339815191528762003104565b6200163a60008051602062005d668339815191528762003104565b6200166460008051602062005e8683398151915260008051602062005e6683398151915262003110565b6200167f60008051602062005e868339815191528562003104565b6200169a60008051602062005e668339815191528562003104565b6000620016af8484600561044d600062003cad565b6073546074549192506001600160401b03600160401b90910481169116808214620016ed57604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b0381811660008181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620017ee9695831695600160581b909104909216936076936077939192919091169060040162005081565b600060405180830381600087803b1580156200180957600080fd5b505af11580156200181e573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff8516815260008051602062005e0683398151915293506020019150620018559050565b60405180910390a1505050505050505050565b600060865460646200187b9190620050e7565b905090565b60008051602062005d868339815191526200189b81620031d6565b63ffffffff82161580620018ba5750607e5463ffffffff908116908316115b15620018d957604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200192057604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b60008051602062005ea68339815191526200198681620031d6565b63ffffffff88161580620019a55750607e5463ffffffff908116908916115b15620019c457604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff161515900362001a0b57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001a49576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062001a649063ffffffff1662005101565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001ab290620046fa565b62001ac09392919062005127565b604051809103906000f08015801562001add573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001d51949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001d91908d908d9088908e908e908e906004016200515e565b600060405180830381600087803b15801562001dac57600080fd5b505af115801562001dc1573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001dfb90878787878762003ed2565b979650505050505050565b606f5460ff161562001e2b57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001e7a92600160c01b90048116911662004fab565b6001600160401b0316111562001ea357604051638a0704d360e01b815260040160405180910390fd5b6103e862001eb28888620051c1565b6001600160401b0316111562001edb57604051635acfba9d60e11b815260040160405180910390fd5b62001eed81898989898989896200356a565b62001ef981876200400d565b6085546001600160401b03166000036200200757600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001f75576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001fae62002606565b6040518263ffffffff1660e01b815260040162001fcd91815260200190565b600060405180830381600087803b15801562001fe857600080fd5b505af115801562001ffd573d6000803e3d6000fd5b50505050620020d1565b62002012816200420a565b600681018054600160801b90046001600160401b03169060106200203683620051e4565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b4888789604051620021179392919062004f74565b60405180910390a3505050505050505050565b606f5460ff16156200214f57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88166000908152608160205260409020620021768189898989898989620031e2565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620021d562003b58565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016200225c919062004d35565b602060405180830381865afa1580156200227a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620022a091906200520b565b608454909150600090620022c7906001600160401b03600160401b820481169116620051c1565b6001600160401b0316905080600003620022e45760009250505090565b620022f081836200523b565b9250505090565b606f5460009060ff16156200231f57604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362002357576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200238257604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620023b59084906001600160401b031662004fab565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620023eb878362004fab565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200247a836200420a565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a2582604051620024b2919062004708565b60405180910390a29695505050505050565b60008051602062005e46833981519152620024df81620031d6565b606f5460ff166200251a576085546001600160401b03908116908316106200251a5760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75906200127090849062004708565b60008051602062005e468339815191526200258281620031d6565b62015180826001600160401b03161115620025b057604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28906200127090849062004708565b60805460009063ffffffff168082036200262257506000919050565b6000816001600160401b038111156200263f576200263f62004ac2565b60405190808252806020026020018201604052801562002669578160200160208202803683370190505b50905060005b82811015620026dc57608160006200268983600162005252565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620026bc57620026bc62005268565b602090810291909101015280620026d3816200527e565b9150506200266f565b50600060205b8360011462002920576000620026fa6002866200529a565b620027076002876200523b565b62002713919062005252565b90506000816001600160401b0381111562002732576200273262004ac2565b6040519080825280602002602001820160405280156200275c578160200160208202803683370190505b50905060005b82811015620028d45762002778600184620052b1565b811480156200279357506200278f6002886200529a565b6001145b15620028135785620027a7826002620050e7565b81518110620027ba57620027ba62005268565b602002602001015185604051602001620027d6929190620052c7565b6040516020818303038152906040528051906020012082828151811062002801576200280162005268565b602002602001018181525050620028bf565b8562002821826002620050e7565b8151811062002834576200283462005268565b6020026020010151868260026200284c9190620050e7565b6200285990600162005252565b815181106200286c576200286c62005268565b602002602001015160405160200162002887929190620052c7565b60405160208183030381529060405280519060200120828281518110620028b257620028b262005268565b6020026020010181815250505b80620028cb816200527e565b91505062002762565b508094508195508384604051602001620028f0929190620052c7565b60405160208183030381529060405280519060200120935082806200291590620052d5565b9350505050620026e2565b60008360008151811062002938576200293862005268565b6020026020010151905060005b82811015620029be57818460405160200162002963929190620052c7565b604051602081830303815290604052805190602001209150838460405160200162002990929190620052c7565b6040516020818303038152906040528051906020012093508080620029b5906200527e565b91505062002945565b5095945050505050565b60008051602062005d46833981519152620029e381620031d6565b63ffffffff8416158062002a025750607e5463ffffffff908116908516115b1562002a2157604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002a62576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002ab157604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002af857604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002b3657604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002bb68462000ddb565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002c0b9216908b908b90600401620052ef565b600060405180830381600087803b15801562002c2657600080fd5b505af115801562002c3b573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005d6683398151915262002cb081620031d6565b683635c9adc5dea0000082118062002ccb5750633b9aca0082105b1562002cea57604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001270565b62002d2b8262001312565b62002d3681620031d6565b620011cb838362003c43565b60008051602062005dc683398151915262002d5d81620031d6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002db957600080fd5b505af115801562002dce573d6000803e3d6000fd5b5050505062002ddc620042d5565b50565b60008051602062005e2683398151915262002dfa81620031d6565b6001600160401b03841660009081526083602052604090205463ffffffff161562002e38576040516337c8fe0960e11b815260040160405180910390fd5b600062002e49888888888762003cad565b60008080526002909101602052604090209390935550505050505050565b60008051602062005da683398151915262002e8281620031d6565b607e805460009190829062002e9d9063ffffffff1662005101565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162003040969594939291906200532f565b60405180910390a25050505050505050565b6085546001600160401b038281166000908152600485016020526040812054909242926200308592918116911662004fab565b6001600160401b031611159392505050565b600054610100900460ff16620013105760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b66565b6200137f828262003bd7565b60006200311d8362001312565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6006810154600090600160801b90046001600160401b031615620031b9575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002ddc81336200432e565b60078801546000906001600160401b039081169087161015620032185760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620032b95760068901546001600160401b03600160801b90910481169089161115620032625760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b9092041614620032b257604051632bd2e3e760e01b815260040160405180910390fd5b506200332e565b506001600160401b038516600090815260028901602052604090205480620032f4576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b909104811690871611156200332e57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620033675750876001600160401b0316876001600160401b031611155b806200338b575060068901546001600160401b03600160c01b909104811690881611155b15620033aa5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b9004811690861614620033f1576040516332a2a77f60e01b815260040160405180910390fd5b6000620034038a888888868962003ed2565b9050600060008051602062005de683398151915260028360405162003429919062005388565b602060405180830381855afa15801562003447573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200346c91906200520b565b6200347891906200529a565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620034bc91889190600401620053a6565b602060405180830381865afa158015620034da573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620035009190620053e3565b6200351e576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c0160205260409020600201548590036200355d5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620035788a62003165565b60078b01549091506001600160401b039081169089161015620035ae5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620036515760068a01546001600160401b03600160801b9091048116908a161115620035f85760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200364a57604051632bd2e3e760e01b815260040160405180910390fd5b50620036c1565b6001600160401b038816600090815260028b0160205260409020549150816200368d576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b03161115620036c157604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620036f45760405163b9b18f5760e01b815260040160405180910390fd5b6000620037068b8a8a8a878b62003ed2565b9050600060008051602062005de68339815191526002836040516200372c919062005388565b602060405180830381855afa1580156200374a573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200376f91906200520b565b6200377b91906200529a565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620037bf91899190600401620053a6565b602060405180830381865afa158015620037dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620038039190620053e3565b62003821576040516309bde33960e01b815260040160405180910390fd5b60006200382f848b620051c1565b90506200388887826001600160401b03166200384a6200220b565b620038569190620050e7565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004358565b80608460088282829054906101000a90046001600160401b0316620038ae919062004fab565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b1580156200393e57600080fd5b505af115801562003953573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b9091048116908216111580620039a5575060068201546001600160401b03600160801b9091048116908216115b15620039c45760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003a8062002606565b6040518263ffffffff1660e01b815260040162003a9f91815260200190565b600060405180830381600087803b15801562003aba57600080fd5b505af115801562003acf573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003bb457600080fd5b505af115801562003bc9573d6000803e3d6000fd5b5050505062001310620043ac565b62003be38282620021e0565b6200137f5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003c4f8282620021e0565b156200137f5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b608080546000918291829062003cc99063ffffffff1662005101565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000866001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508060826000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150868260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550858260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550838260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003ec094939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003f08575081155b1562003f275760405163340c614f60e11b815260040160405180910390fd5b8062003f46576040516366385b5160e01b815260040160405180910390fd5b62003f518462004409565b62003f6f576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b60006200401a8362003165565b9050816000806200402c8484620051c1565b6085546001600160401b0391821692506000916200405391600160401b90041642620052b1565b90505b846001600160401b0316846001600160401b031614620040dd576001600160401b03808516600090815260038901602052604090206001810154909116821015620040b8576001810154600160401b90046001600160401b03169450620040d6565b620040c48686620051c1565b6001600160401b0316935050620040dd565b5062004056565b6000620040eb8484620052b1565b9050838110156200414957808403600c81116200410957806200410c565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a60865402816200413e576200413e62005225565b0460865550620041c1565b838103600c81116200415c57806200415f565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162004199576200419962005225565b04905080608654670de0b6b3a76400000281620041ba57620041ba62005225565b0460865550505b683635c9adc5dea000006086541115620041e857683635c9adc5dea0000060865562004200565b633b9aca0060865410156200420057633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002ddc5760068101546000906200425590600160c01b90046001600160401b0316600162004fab565b905062004263828262003052565b156200137f57600682015460009060029062004291908490600160801b90046001600160401b0316620051c1565b6200429d919062005407565b620042a9908362004fab565b9050620042b7838262003052565b15620042c957620011cb838262003966565b620011cb838362003966565b606f5460ff16620042f957604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6200433a8282620021e0565b6200137f57604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620011cb9084906200448f565b606f5460ff1615620043d157604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b03831610801562004440575067ffffffff00000001604083901c6001600160401b0316105b801562004461575067ffffffff00000001608083901c6001600160401b0316105b801562004479575067ffffffff0000000160c083901c105b156200448757506001919050565b506000919050565b6000620044e6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620045689092919063ffffffff16565b805190915015620011cb5780806020019051810190620045079190620053e3565b620011cb5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b66565b606062004579848460008562004581565b949350505050565b606082471015620045e45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b66565b600080866001600160a01b0316858760405162004602919062005388565b60006040518083038185875af1925050503d806000811462004641576040519150601f19603f3d011682016040523d82523d6000602084013e62004646565b606091505b509150915062001dfb8783838760608315620046c7578251600003620046bf576001600160a01b0385163b620046bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b66565b508162004579565b620045798383815115620046de5781518083602001fd5b8060405162461bcd60e51b815260040162000b66919062004cf3565b6108f5806200543183390190565b6001600160401b0391909116815260200190565b803563ffffffff81168114620031d157600080fd5b80356001600160401b0381168114620031d157600080fd5b600080604083850312156200475d57600080fd5b62004768836200471c565b9150620047786020840162004731565b90509250929050565b6001600160a01b038116811462002ddc57600080fd5b60008060008060008060c08789031215620047b157600080fd5b8635620047be8162004781565b9550620047ce6020880162004731565b9450620047de6040880162004731565b93506060870135620047f08162004781565b92506080870135620048028162004781565b915060a0870135620048148162004781565b809150509295509295509295565b6000602082840312156200483557600080fd5b62000b1b826200471c565b80610300810183101562000b1e57600080fd5b6000806000806000806000806103e0898b0312156200487157600080fd5b6200487c896200471c565b97506200488c60208a0162004731565b96506200489c60408a0162004731565b9550620048ac60608a0162004731565b9450620048bc60808a0162004731565b935060a0890135925060c08901359150620048db8a60e08b0162004840565b90509295985092959890939650565b6000806000806000806000806103e0898b0312156200490857600080fd5b62004913896200471c565b97506200492360208a0162004731565b96506200493360408a0162004731565b95506200494360608a0162004731565b94506080890135935060a0890135925060c0890135620049638162004781565b9150620048db8a60e08b0162004840565b6000602082840312156200498757600080fd5b813561ffff811681146200499a57600080fd5b9392505050565b600060208284031215620049b457600080fd5b5035919050565b60008060408385031215620049cf57600080fd5b823591506020830135620049e38162004781565b809150509250929050565b60006020828403121562004a0157600080fd5b62000b1b8262004731565b600080600080600080600080610100898b03121562004a2a57600080fd5b883562004a378162004781565b975062004a4760208a0162004731565b965062004a5760408a0162004731565b9550606089013562004a698162004781565b9450608089013562004a7b8162004781565b935060a089013562004a8d8162004781565b925060c089013562004a9f8162004781565b915060e089013562004ab18162004781565b809150509295985092959890939650565b634e487b7160e01b600052604160045260246000fd5b600082601f83011262004aea57600080fd5b81356001600160401b038082111562004b075762004b0762004ac2565b604051601f8301601f19908116603f0116810190828211818310171562004b325762004b3262004ac2565b8160405283815286602085880101111562004b4c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121562004b8857600080fd5b62004b93886200471c565b965062004ba36020890162004731565b9550604088013562004bb58162004781565b9450606088013562004bc78162004781565b9350608088013562004bd98162004781565b925060a08801356001600160401b038082111562004bf657600080fd5b62004c048b838c0162004ad8565b935060c08a013591508082111562004c1b57600080fd5b5062004c2a8a828b0162004ad8565b91505092959891949750929550565b60008060008060008060c0878903121562004c5357600080fd5b62004c5e876200471c565b955062004c6e6020880162004731565b945062004c7e6040880162004731565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004cbc57818101518382015260200162004ca2565b50506000910152565b6000815180845262004cdf81602086016020860162004c9f565b601f01601f19169290920160200192915050565b60208152600062000b1b602083018462004cc5565b6000806040838503121562004d1c57600080fd5b62004d278362004731565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000806000806060858703121562004d6057600080fd5b843562004d6d8162004781565b935062004d7d602086016200471c565b925060408501356001600160401b038082111562004d9a57600080fd5b818701915087601f83011262004daf57600080fd5b81358181111562004dbf57600080fd5b88602082850101111562004dd257600080fd5b95989497505060200194505050565b60006020828403121562004df457600080fd5b81356200499a8162004781565b803560ff81168114620031d157600080fd5b60008060008060008060c0878903121562004e2d57600080fd5b863562004e3a8162004781565b9550602087013562004e4c8162004781565b945062004e5c6040880162004731565b935062004e6c6060880162004731565b92506080870135915062004e8360a0880162004e01565b90509295509295509295565b60008060008060008060c0878903121562004ea957600080fd5b863562004eb68162004781565b9550602087013562004ec88162004781565b945062004ed86040880162004731565b935062004ee86060880162004e01565b92506080870135915060a08701356001600160401b0381111562004f0b57600080fd5b62004f1989828a0162004ad8565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004fce5762004fce62004f95565b5092915050565b8054600090600181811c908083168062004ff057607f831692505b602080841082036200501257634e487b7160e01b600052602260045260246000fd5b83885260208801828015620050305760018114620050475762005074565b60ff198716825285151560051b8201975062005074565b60008981526020902060005b878110156200506e5781548482015290860190840162005053565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c060408201819052600090620050af9083018762004fd5565b8281036060840152620050c3818762004fd5565b608084019590955250506001600160401b039190911660a090910152949350505050565b808202811582820484141762000b1e5762000b1e62004f95565b600063ffffffff8083168181036200511d576200511d62004f95565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620051559083018462004cc5565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c060808201819052600090620051a09083018562004cc5565b82810360a0840152620051b4818562004cc5565b9998505050505050505050565b6001600160401b0382811682821603908082111562004fce5762004fce62004f95565b60006001600160401b038281166002600160401b031981016200511d576200511d62004f95565b6000602082840312156200521e57600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b6000826200524d576200524d62005225565b500490565b8082018082111562000b1e5762000b1e62004f95565b634e487b7160e01b600052603260045260246000fd5b60006001820162005293576200529362004f95565b5060010190565b600082620052ac57620052ac62005225565b500690565b8181038181111562000b1e5762000b1e62004f95565b918252602082015260400190565b600081620052e757620052e762004f95565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190526000906200537c9083018462004cc5565b98975050505050505050565b600082516200539c81846020870162004c9f565b9190910192915050565b61032081016103008085843782018360005b6001811015620053d9578151835260209283019290910190600101620053b8565b5050509392505050565b600060208284031215620053f657600080fd5b815180151581146200499a57600080fd5b60006001600160401b038381168062005424576200542462005225565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220a19e7a72432195d9a35c7ce8fa5f1284415aac66bb1ad08a4c2e1c252fd8690864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a26469706673582212206abd8d41cddbceaedfd87b2e57b4fd718dbd21be2f778ec08faf526cc9649e0064736f6c63430008140033", - "deployedBytecode": "0x60806040523480156200001157600080fd5b50600436106200029e5760003560e01c8063066ec01214620002a3578063080b311114620002cf5780630a0d9fbe14620002f75780630e36f582146200031257806311f6b287146200032b57806312b86e1914620003425780631489ed10146200035957806315064c9614620003705780631608859c146200037e5780631796a1ae14620003955780631816b7e514620003bc5780632072f6c514620003d3578063248a9ca314620003dd5780632528016914620004035780632f2ff15d14620004b857806336568abe14620004cf578063394218e914620004e6578063477fa27014620004fd5780634d4d3338146200050657806355a71ee0146200051d57806360469169146200056157806365c0504d146200056b5780637222020f146200061a578063727885e914620006315780637975fcfe14620006485780637fb6e76a146200066e578063841b24d7146200069757806387c20c0114620006b25780638bd4f07114620006c957806391d1485414620006e057806399f5634e14620006f75780639a908e7314620007015780639c9f3dfe1462000718578063a066215c146200072f578063a217fddf1462000746578063a2967d99146200074f578063a3c573eb1462000759578063afd23cbe1462000790578063b99d0ad714620007ba578063c1acbc341462000892578063c4c928c214620008ad578063ceee281d14620008c4578063d02103ca14620008ed578063d5073f6f1462000915578063d547741f146200092c578063d939b3151462000943578063dbc169761462000957578063dde0ff771462000961578063e0bfd3d2146200097c578063e46761c41462000993578063f34eb8eb14620009bb578063f4e9267514620009d2578063f9c4c2ae14620009e3575b600080fd5b608454620002b7906001600160401b031681565b604051620002c6919062004708565b60405180910390f35b620002e6620002e036600462004749565b62000afa565b6040519015158152602001620002c6565b608554620002b790600160401b90046001600160401b031681565b620003296200032336600462004797565b62000b24565b005b620002b76200033c36600462004822565b62000ddb565b620003296200035336600462004853565b62000dfb565b620003296200036a366004620048ea565b62000fab565b606f54620002e69060ff1681565b620003296200038f36600462004749565b6200113b565b607e54620003a69063ffffffff1681565b60405163ffffffff9091168152602001620002c6565b62000329620003cd36600462004974565b620011d0565b620003296200127c565b620003f4620003ee366004620049a1565b62001312565b604051908152602001620002c6565b620004846200041436600462004749565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002c6565b62000329620004c9366004620049bb565b62001327565b62000329620004e0366004620049bb565b62001349565b62000329620004f7366004620049ee565b62001383565b608654620003f4565b620003296200051736600462004a0c565b62001432565b620003f46200052e36600462004749565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620003f462001868565b620005d06200057c36600462004822565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002c6565b620003296200062b36600462004822565b62001880565b620003296200064236600462004b6c565b6200196b565b6200065f6200065936600462004c39565b62001dd3565b604051620002c6919062004cf3565b620003a66200067f366004620049ee565b60836020526000908152604090205463ffffffff1681565b608454620002b790600160c01b90046001600160401b031681565b62000329620006c3366004620048ea565b62001e06565b62000329620006da36600462004853565b6200212a565b620002e6620006f1366004620049bb565b620021e0565b620003f46200220b565b620002b76200071236600462004d08565b620022f7565b6200032962000729366004620049ee565b620024c4565b6200032962000740366004620049ee565b62002567565b620003f4600081565b620003f462002606565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b604051620002c6919062004d35565b608554620007a690600160801b900461ffff1681565b60405161ffff9091168152602001620002c6565b62000850620007cb36600462004749565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002c6919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002b790600160801b90046001600160401b031681565b62000329620008be36600462004d49565b620029c8565b620003a6620008d536600462004de1565b60826020526000908152604090205463ffffffff1681565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b6200032962000926366004620049a1565b62002c95565b620003296200093d366004620049bb565b62002d20565b608554620002b7906001600160401b031681565b6200032962002d42565b608454620002b790600160401b90046001600160401b031681565b620003296200098d36600462004e13565b62002ddf565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b62000329620009cc36600462004e8f565b62002e67565b608054620003a69063ffffffff1681565b62000a7a620009f436600462004822565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002c6565b63ffffffff8216600090815260816020526040812062000b1b908362003052565b90505b92915050565b600054600290610100900460ff1615801562000b47575060005460ff8083169116105b62000b6f5760405162461bcd60e51b815260040162000b669062004f26565b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000bf062003097565b62000c0b60008051602062005ec68339815191528862003104565b62000c1860008462003104565b62000c3360008051602062005da68339815191528462003104565b62000c4e60008051602062005e268339815191528462003104565b62000c6960008051602062005d468339815191528462003104565b62000c8460008051602062005d868339815191528562003104565b62000c9f60008051602062005ea68339815191528562003104565b62000cba60008051602062005dc68339815191528562003104565b62000cd560008051602062005e468339815191528562003104565b62000cff60008051602062005ec683398151915260008051602062005d2683398151915262003110565b62000d1a60008051602062005d268339815191528562003104565b62000d3560008051602062005d668339815191528562003104565b62000d5f60008051602062005e8683398151915260008051602062005e6683398151915262003110565b62000d7a60008051602062005e868339815191528362003104565b62000d9560008051602062005e668339815191528362003104565b62000da260003362003104565b6000805461ff001916905560405160ff8216815260008051602062005e068339815191529060200160405180910390a150505050505050565b63ffffffff8116600090815260816020526040812062000b1e9062003165565b60008051602062005ec683398151915262000e1681620031d6565b63ffffffff8916600090815260816020526040902062000e3d818a8a8a8a8a8a8a620031e2565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000ea5576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000ede62002606565b6040518263ffffffff1660e01b815260040162000efd91815260200190565b600060405180830381600087803b15801562000f1857600080fd5b505af115801562000f2d573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005ec683398151915262000fc681620031d6565b63ffffffff8916600090815260816020526040902062000fed818a8a8a8a8a8a8a6200356a565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562001055576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200108e62002606565b6040518263ffffffff1660e01b8152600401620010ad91815260200190565b600060405180830381600087803b158015620010c857600080fd5b505af1158015620010dd573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a604051620011279392919062004f74565b60405180910390a350505050505050505050565b63ffffffff821660009081526081602052604090206200116b60008051602062005ec683398151915233620021e0565b620011bf57606f5460ff16156200119557604051630bc011ff60e21b815260040160405180910390fd5b620011a1818362003052565b620011bf57604051630674f25160e11b815260040160405180910390fd5b620011cb818362003966565b505050565b60008051602062005e46833981519152620011eb81620031d6565b6103e88261ffff1610806200120557506103ff8261ffff16115b156200122457604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200129760008051602062005e8683398151915233620021e0565b6200130657608454600160801b90046001600160401b03161580620012e757506084544290620012dc9062093a8090600160801b90046001600160401b031662004fab565b6001600160401b0316115b15620013065760405163692baaad60e11b815260040160405180910390fd5b6200131062003b58565b565b60009081526034602052604090206001015490565b620013328262001312565b6200133d81620031d6565b620011cb838362003bd7565b6001600160a01b03811633146200137357604051630b4ad1cd60e31b815260040160405180910390fd5b6200137f828262003c43565b5050565b60008051602062005e468339815191526200139e81620031d6565b606f5460ff16620013e0576084546001600160401b03600160c01b909104811690831610620013e05760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1906200127090849062004708565b600054600290610100900460ff1615801562001455575060005460ff8083169116105b620014745760405162461bcd60e51b815260040162000b669062004f26565b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b179055620014f562003097565b6200151060008051602062005ec68339815191528a62003104565b6200151d60008662003104565b6200153860008051602062005da68339815191528662003104565b6200155360008051602062005e268339815191528662003104565b6200156e60008051602062005d468339815191528662003104565b6200158960008051602062005d868339815191528762003104565b620015a460008051602062005ea68339815191528762003104565b620015bf60008051602062005dc68339815191528762003104565b620015da60008051602062005e468339815191528762003104565b6200160460008051602062005ec683398151915260008051602062005d2683398151915262003110565b6200161f60008051602062005d268339815191528762003104565b6200163a60008051602062005d668339815191528762003104565b6200166460008051602062005e8683398151915260008051602062005e6683398151915262003110565b6200167f60008051602062005e868339815191528562003104565b6200169a60008051602062005e668339815191528562003104565b6000620016af8484600561044d600062003cad565b6073546074549192506001600160401b03600160401b90910481169116808214620016ed57604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b0381811660008181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb59070896620017ee9695831695600160581b909104909216936076936077939192919091169060040162005081565b600060405180830381600087803b1580156200180957600080fd5b505af11580156200181e573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff8516815260008051602062005e0683398151915293506020019150620018559050565b60405180910390a1505050505050505050565b600060865460646200187b9190620050e7565b905090565b60008051602062005d868339815191526200189b81620031d6565b63ffffffff82161580620018ba5750607e5463ffffffff908116908316115b15620018d957604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200192057604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b60008051602062005ea68339815191526200198681620031d6565b63ffffffff88161580620019a55750607e5463ffffffff908116908916115b15620019c457604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff161515900362001a0b57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001a49576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062001a649063ffffffff1662005101565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001ab290620046fa565b62001ac09392919062005127565b604051809103906000f08015801562001add573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001d51949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001d91908d908d9088908e908e908e906004016200515e565b600060405180830381600087803b15801562001dac57600080fd5b505af115801562001dc1573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001dfb90878787878762003ed2565b979650505050505050565b606f5460ff161562001e2b57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001e7a92600160c01b90048116911662004fab565b6001600160401b0316111562001ea357604051638a0704d360e01b815260040160405180910390fd5b6103e862001eb28888620051c1565b6001600160401b0316111562001edb57604051635acfba9d60e11b815260040160405180910390fd5b62001eed81898989898989896200356a565b62001ef981876200400d565b6085546001600160401b03166000036200200757600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001f75576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001fae62002606565b6040518263ffffffff1660e01b815260040162001fcd91815260200190565b600060405180830381600087803b15801562001fe857600080fd5b505af115801562001ffd573d6000803e3d6000fd5b50505050620020d1565b62002012816200420a565b600681018054600160801b90046001600160401b03169060106200203683620051e4565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b4888789604051620021179392919062004f74565b60405180910390a3505050505050505050565b606f5460ff16156200214f57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88166000908152608160205260409020620021768189898989898989620031e2565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620021d562003b58565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016200225c919062004d35565b602060405180830381865afa1580156200227a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620022a091906200520b565b608454909150600090620022c7906001600160401b03600160401b820481169116620051c1565b6001600160401b0316905080600003620022e45760009250505090565b620022f081836200523b565b9250505090565b606f5460009060ff16156200231f57604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362002357576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200238257604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620023b59084906001600160401b031662004fab565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620023eb878362004fab565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200247a836200420a565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a2582604051620024b2919062004708565b60405180910390a29695505050505050565b60008051602062005e46833981519152620024df81620031d6565b606f5460ff166200251a576085546001600160401b03908116908316106200251a5760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75906200127090849062004708565b60008051602062005e468339815191526200258281620031d6565b62015180826001600160401b03161115620025b057604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28906200127090849062004708565b60805460009063ffffffff168082036200262257506000919050565b6000816001600160401b038111156200263f576200263f62004ac2565b60405190808252806020026020018201604052801562002669578160200160208202803683370190505b50905060005b82811015620026dc57608160006200268983600162005252565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620026bc57620026bc62005268565b602090810291909101015280620026d3816200527e565b9150506200266f565b50600060205b8360011462002920576000620026fa6002866200529a565b620027076002876200523b565b62002713919062005252565b90506000816001600160401b0381111562002732576200273262004ac2565b6040519080825280602002602001820160405280156200275c578160200160208202803683370190505b50905060005b82811015620028d45762002778600184620052b1565b811480156200279357506200278f6002886200529a565b6001145b15620028135785620027a7826002620050e7565b81518110620027ba57620027ba62005268565b602002602001015185604051602001620027d6929190620052c7565b6040516020818303038152906040528051906020012082828151811062002801576200280162005268565b602002602001018181525050620028bf565b8562002821826002620050e7565b8151811062002834576200283462005268565b6020026020010151868260026200284c9190620050e7565b6200285990600162005252565b815181106200286c576200286c62005268565b602002602001015160405160200162002887929190620052c7565b60405160208183030381529060405280519060200120828281518110620028b257620028b262005268565b6020026020010181815250505b80620028cb816200527e565b91505062002762565b508094508195508384604051602001620028f0929190620052c7565b60405160208183030381529060405280519060200120935082806200291590620052d5565b9350505050620026e2565b60008360008151811062002938576200293862005268565b6020026020010151905060005b82811015620029be57818460405160200162002963929190620052c7565b604051602081830303815290604052805190602001209150838460405160200162002990929190620052c7565b6040516020818303038152906040528051906020012093508080620029b5906200527e565b91505062002945565b5095945050505050565b60008051602062005d46833981519152620029e381620031d6565b63ffffffff8416158062002a025750607e5463ffffffff908116908516115b1562002a2157604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002a62576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002ab157604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002af857604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002b3657604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002bb68462000ddb565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002c0b9216908b908b90600401620052ef565b600060405180830381600087803b15801562002c2657600080fd5b505af115801562002c3b573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005d6683398151915262002cb081620031d6565b683635c9adc5dea0000082118062002ccb5750633b9aca0082105b1562002cea57604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001270565b62002d2b8262001312565b62002d3681620031d6565b620011cb838362003c43565b60008051602062005dc683398151915262002d5d81620031d6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002db957600080fd5b505af115801562002dce573d6000803e3d6000fd5b5050505062002ddc620042d5565b50565b60008051602062005e2683398151915262002dfa81620031d6565b6001600160401b03841660009081526083602052604090205463ffffffff161562002e38576040516337c8fe0960e11b815260040160405180910390fd5b600062002e49888888888762003cad565b60008080526002909101602052604090209390935550505050505050565b60008051602062005da683398151915262002e8281620031d6565b607e805460009190829062002e9d9063ffffffff1662005101565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162003040969594939291906200532f565b60405180910390a25050505050505050565b6085546001600160401b038281166000908152600485016020526040812054909242926200308592918116911662004fab565b6001600160401b031611159392505050565b600054610100900460ff16620013105760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b66565b6200137f828262003bd7565b60006200311d8362001312565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6006810154600090600160801b90046001600160401b031615620031b9575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002ddc81336200432e565b60078801546000906001600160401b039081169087161015620032185760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620032b95760068901546001600160401b03600160801b90910481169089161115620032625760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b9092041614620032b257604051632bd2e3e760e01b815260040160405180910390fd5b506200332e565b506001600160401b038516600090815260028901602052604090205480620032f4576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b909104811690871611156200332e57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620033675750876001600160401b0316876001600160401b031611155b806200338b575060068901546001600160401b03600160c01b909104811690881611155b15620033aa5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b9004811690861614620033f1576040516332a2a77f60e01b815260040160405180910390fd5b6000620034038a888888868962003ed2565b9050600060008051602062005de683398151915260028360405162003429919062005388565b602060405180830381855afa15801562003447573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200346c91906200520b565b6200347891906200529a565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620034bc91889190600401620053a6565b602060405180830381865afa158015620034da573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620035009190620053e3565b6200351e576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c0160205260409020600201548590036200355d5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620035788a62003165565b60078b01549091506001600160401b039081169089161015620035ae5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620036515760068a01546001600160401b03600160801b9091048116908a161115620035f85760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200364a57604051632bd2e3e760e01b815260040160405180910390fd5b50620036c1565b6001600160401b038816600090815260028b0160205260409020549150816200368d576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b03161115620036c157604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620036f45760405163b9b18f5760e01b815260040160405180910390fd5b6000620037068b8a8a8a878b62003ed2565b9050600060008051602062005de68339815191526002836040516200372c919062005388565b602060405180830381855afa1580156200374a573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200376f91906200520b565b6200377b91906200529a565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620037bf91899190600401620053a6565b602060405180830381865afa158015620037dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620038039190620053e3565b62003821576040516309bde33960e01b815260040160405180910390fd5b60006200382f848b620051c1565b90506200388887826001600160401b03166200384a6200220b565b620038569190620050e7565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004358565b80608460088282829054906101000a90046001600160401b0316620038ae919062004fab565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b1580156200393e57600080fd5b505af115801562003953573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b9091048116908216111580620039a5575060068201546001600160401b03600160801b9091048116908216115b15620039c45760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003a8062002606565b6040518263ffffffff1660e01b815260040162003a9f91815260200190565b600060405180830381600087803b15801562003aba57600080fd5b505af115801562003acf573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003bb457600080fd5b505af115801562003bc9573d6000803e3d6000fd5b5050505062001310620043ac565b62003be38282620021e0565b6200137f5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003c4f8282620021e0565b156200137f5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b608080546000918291829062003cc99063ffffffff1662005101565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000866001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508060826000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150868260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550858260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550838260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003ec094939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003f08575081155b1562003f275760405163340c614f60e11b815260040160405180910390fd5b8062003f46576040516366385b5160e01b815260040160405180910390fd5b62003f518462004409565b62003f6f576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b60006200401a8362003165565b9050816000806200402c8484620051c1565b6085546001600160401b0391821692506000916200405391600160401b90041642620052b1565b90505b846001600160401b0316846001600160401b031614620040dd576001600160401b03808516600090815260038901602052604090206001810154909116821015620040b8576001810154600160401b90046001600160401b03169450620040d6565b620040c48686620051c1565b6001600160401b0316935050620040dd565b5062004056565b6000620040eb8484620052b1565b9050838110156200414957808403600c81116200410957806200410c565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a60865402816200413e576200413e62005225565b0460865550620041c1565b838103600c81116200415c57806200415f565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162004199576200419962005225565b04905080608654670de0b6b3a76400000281620041ba57620041ba62005225565b0460865550505b683635c9adc5dea000006086541115620041e857683635c9adc5dea0000060865562004200565b633b9aca0060865410156200420057633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002ddc5760068101546000906200425590600160c01b90046001600160401b0316600162004fab565b905062004263828262003052565b156200137f57600682015460009060029062004291908490600160801b90046001600160401b0316620051c1565b6200429d919062005407565b620042a9908362004fab565b9050620042b7838262003052565b15620042c957620011cb838262003966565b620011cb838362003966565b606f5460ff16620042f957604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6200433a8282620021e0565b6200137f57604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620011cb9084906200448f565b606f5460ff1615620043d157604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b03831610801562004440575067ffffffff00000001604083901c6001600160401b0316105b801562004461575067ffffffff00000001608083901c6001600160401b0316105b801562004479575067ffffffff0000000160c083901c105b156200448757506001919050565b506000919050565b6000620044e6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620045689092919063ffffffff16565b805190915015620011cb5780806020019051810190620045079190620053e3565b620011cb5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b66565b606062004579848460008562004581565b949350505050565b606082471015620045e45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b66565b600080866001600160a01b0316858760405162004602919062005388565b60006040518083038185875af1925050503d806000811462004641576040519150601f19603f3d011682016040523d82523d6000602084013e62004646565b606091505b509150915062001dfb8783838760608315620046c7578251600003620046bf576001600160a01b0385163b620046bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b66565b508162004579565b620045798383815115620046de5781518083602001fd5b8060405162461bcd60e51b815260040162000b66919062004cf3565b6108f5806200543183390190565b6001600160401b0391909116815260200190565b803563ffffffff81168114620031d157600080fd5b80356001600160401b0381168114620031d157600080fd5b600080604083850312156200475d57600080fd5b62004768836200471c565b9150620047786020840162004731565b90509250929050565b6001600160a01b038116811462002ddc57600080fd5b60008060008060008060c08789031215620047b157600080fd5b8635620047be8162004781565b9550620047ce6020880162004731565b9450620047de6040880162004731565b93506060870135620047f08162004781565b92506080870135620048028162004781565b915060a0870135620048148162004781565b809150509295509295509295565b6000602082840312156200483557600080fd5b62000b1b826200471c565b80610300810183101562000b1e57600080fd5b6000806000806000806000806103e0898b0312156200487157600080fd5b6200487c896200471c565b97506200488c60208a0162004731565b96506200489c60408a0162004731565b9550620048ac60608a0162004731565b9450620048bc60808a0162004731565b935060a0890135925060c08901359150620048db8a60e08b0162004840565b90509295985092959890939650565b6000806000806000806000806103e0898b0312156200490857600080fd5b62004913896200471c565b97506200492360208a0162004731565b96506200493360408a0162004731565b95506200494360608a0162004731565b94506080890135935060a0890135925060c0890135620049638162004781565b9150620048db8a60e08b0162004840565b6000602082840312156200498757600080fd5b813561ffff811681146200499a57600080fd5b9392505050565b600060208284031215620049b457600080fd5b5035919050565b60008060408385031215620049cf57600080fd5b823591506020830135620049e38162004781565b809150509250929050565b60006020828403121562004a0157600080fd5b62000b1b8262004731565b600080600080600080600080610100898b03121562004a2a57600080fd5b883562004a378162004781565b975062004a4760208a0162004731565b965062004a5760408a0162004731565b9550606089013562004a698162004781565b9450608089013562004a7b8162004781565b935060a089013562004a8d8162004781565b925060c089013562004a9f8162004781565b915060e089013562004ab18162004781565b809150509295985092959890939650565b634e487b7160e01b600052604160045260246000fd5b600082601f83011262004aea57600080fd5b81356001600160401b038082111562004b075762004b0762004ac2565b604051601f8301601f19908116603f0116810190828211818310171562004b325762004b3262004ac2565b8160405283815286602085880101111562004b4c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121562004b8857600080fd5b62004b93886200471c565b965062004ba36020890162004731565b9550604088013562004bb58162004781565b9450606088013562004bc78162004781565b9350608088013562004bd98162004781565b925060a08801356001600160401b038082111562004bf657600080fd5b62004c048b838c0162004ad8565b935060c08a013591508082111562004c1b57600080fd5b5062004c2a8a828b0162004ad8565b91505092959891949750929550565b60008060008060008060c0878903121562004c5357600080fd5b62004c5e876200471c565b955062004c6e6020880162004731565b945062004c7e6040880162004731565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004cbc57818101518382015260200162004ca2565b50506000910152565b6000815180845262004cdf81602086016020860162004c9f565b601f01601f19169290920160200192915050565b60208152600062000b1b602083018462004cc5565b6000806040838503121562004d1c57600080fd5b62004d278362004731565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000806000806060858703121562004d6057600080fd5b843562004d6d8162004781565b935062004d7d602086016200471c565b925060408501356001600160401b038082111562004d9a57600080fd5b818701915087601f83011262004daf57600080fd5b81358181111562004dbf57600080fd5b88602082850101111562004dd257600080fd5b95989497505060200194505050565b60006020828403121562004df457600080fd5b81356200499a8162004781565b803560ff81168114620031d157600080fd5b60008060008060008060c0878903121562004e2d57600080fd5b863562004e3a8162004781565b9550602087013562004e4c8162004781565b945062004e5c6040880162004731565b935062004e6c6060880162004731565b92506080870135915062004e8360a0880162004e01565b90509295509295509295565b60008060008060008060c0878903121562004ea957600080fd5b863562004eb68162004781565b9550602087013562004ec88162004781565b945062004ed86040880162004731565b935062004ee86060880162004e01565b92506080870135915060a08701356001600160401b0381111562004f0b57600080fd5b62004f1989828a0162004ad8565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004fce5762004fce62004f95565b5092915050565b8054600090600181811c908083168062004ff057607f831692505b602080841082036200501257634e487b7160e01b600052602260045260246000fd5b83885260208801828015620050305760018114620050475762005074565b60ff198716825285151560051b8201975062005074565b60008981526020902060005b878110156200506e5781548482015290860190840162005053565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c060408201819052600090620050af9083018762004fd5565b8281036060840152620050c3818762004fd5565b608084019590955250506001600160401b039190911660a090910152949350505050565b808202811582820484141762000b1e5762000b1e62004f95565b600063ffffffff8083168181036200511d576200511d62004f95565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620051559083018462004cc5565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c060808201819052600090620051a09083018562004cc5565b82810360a0840152620051b4818562004cc5565b9998505050505050505050565b6001600160401b0382811682821603908082111562004fce5762004fce62004f95565b60006001600160401b038281166002600160401b031981016200511d576200511d62004f95565b6000602082840312156200521e57600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b6000826200524d576200524d62005225565b500490565b8082018082111562000b1e5762000b1e62004f95565b634e487b7160e01b600052603260045260246000fd5b60006001820162005293576200529362004f95565b5060010190565b600082620052ac57620052ac62005225565b500690565b8181038181111562000b1e5762000b1e62004f95565b918252602082015260400190565b600081620052e757620052e762004f95565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190526000906200537c9083018462004cc5565b98975050505050505050565b600082516200539c81846020870162004c9f565b9190910192915050565b61032081016103008085843782018360005b6001811015620053d9578151835260209283019290910190600101620053b8565b5050509392505050565b600060208284031215620053f657600080fd5b815180151581146200499a57600080fd5b60006001600160401b038381168062005424576200542462005225565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220a19e7a72432195d9a35c7ce8fa5f1284415aac66bb1ad08a4c2e1c252fd8690864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a26469706673582212206abd8d41cddbceaedfd87b2e57b4fd718dbd21be2f778ec08faf526cc9649e0064736f6c63430008140033", + "bytecode": "0x60e06040523480156200001157600080fd5b50604051620060853803806200608583398101604081905262000034916200006b565b6001600160a01b0392831660805290821660c0521660a052620000bf565b6001600160a01b03811681146200006857600080fd5b50565b6000806000606084860312156200008157600080fd5b83516200008e8162000052565b6020850151909350620000a18162000052565b6040850151909250620000b48162000052565b809150509250925092565b60805160a05160c051615f5e6200012760003960008181610999015281816122230152613aa301526000818161075f01528181612d720152613d9d0152600081816108f3015281816112f0015281816114a001528181611f8a0152613c8c0152615f5e6000f3fe60806040523480156200001157600080fd5b50600436106200029e5760003560e01c80630645af0914620002a3578063066ec01214620002bc578063080b311114620002e85780630a0d9fbe14620003105780630e36f582146200032b57806311f6b287146200034257806312b86e1914620003595780631489ed10146200037057806315064c9614620003875780631608859c14620003955780631796a1ae14620003ac5780631816b7e514620003d35780632072f6c514620003ea578063248a9ca314620003f457806325280169146200041a5780632f2ff15d14620004cf57806336568abe14620004e6578063394218e914620004fd578063477fa270146200051457806355a71ee0146200051d57806360469169146200056157806365c0504d146200056b5780637222020f146200061a578063727885e914620006315780637975fcfe14620006485780637fb6e76a146200066e578063841b24d7146200069757806387c20c0114620006b25780638bd4f07114620006c957806391d1485414620006e057806399f5634e14620006f75780639a908e7314620007015780639c9f3dfe1462000718578063a066215c146200072f578063a217fddf1462000746578063a2967d99146200074f578063a3c573eb1462000759578063afd23cbe1462000790578063b99d0ad714620007ba578063c1acbc341462000892578063c4c928c214620008ad578063ceee281d14620008c4578063d02103ca14620008ed578063d5073f6f1462000915578063d547741f146200092c578063d939b3151462000943578063dbc169761462000957578063dde0ff771462000961578063e0bfd3d2146200097c578063e46761c41462000993578063f34eb8eb14620009bb578063f4e9267514620009d2578063f9c4c2ae14620009e3575b600080fd5b620002ba620002b436600462004754565b62000afa565b005b608454620002d0906001600160401b031681565b604051620002df91906200482f565b60405180910390f35b620002ff620002f936600462004858565b62000f4c565b6040519015158152602001620002df565b608554620002d090600160401b90046001600160401b031681565b620002ba6200033c36600462004890565b62000f76565b620002d0620003533660046200491b565b62001224565b620002ba6200036a3660046200494c565b62001244565b620002ba62000381366004620049e3565b620013f4565b606f54620002ff9060ff1681565b620002ba620003a636600462004858565b62001584565b607e54620003bd9063ffffffff1681565b60405163ffffffff9091168152602001620002df565b620002ba620003e436600462004a6d565b62001619565b620002ba620016c5565b6200040b6200040536600462004a9a565b6200175b565b604051908152602001620002df565b6200049b6200042b36600462004858565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002df565b620002ba620004e036600462004ab4565b62001770565b620002ba620004f736600462004ab4565b62001792565b620002ba6200050e36600462004ae7565b620017cc565b6086546200040b565b6200040b6200052e36600462004858565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b6200040b6200187b565b620005d06200057c3660046200491b565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002df565b620002ba6200062b3660046200491b565b62001893565b620002ba6200064236600462004baf565b6200197e565b6200065f6200065936600462004c7c565b62001de6565b604051620002df919062004d36565b620003bd6200067f36600462004ae7565b60836020526000908152604090205463ffffffff1681565b608454620002d090600160c01b90046001600160401b031681565b620002ba620006c3366004620049e3565b62001e19565b620002ba620006da3660046200494c565b6200213d565b620002ff620006f136600462004ab4565b620021f3565b6200040b6200221e565b620002d06200071236600462004d4b565b6200230a565b620002ba6200072936600462004ae7565b620024d7565b620002ba6200074036600462004ae7565b6200257a565b6200040b600081565b6200040b62002619565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b604051620002df919062004d78565b608554620007a690600160801b900461ffff1681565b60405161ffff9091168152602001620002df565b62000850620007cb36600462004858565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002df919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002d090600160801b90046001600160401b031681565b620002ba620008be36600462004d8c565b620029db565b620003bd620008d536600462004e24565b60826020526000908152604090205463ffffffff1681565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b620002ba6200092636600462004a9a565b62002ca8565b620002ba6200093d36600462004ab4565b62002d33565b608554620002d0906001600160401b031681565b620002ba62002d55565b608454620002d090600160401b90046001600160401b031681565b620002ba6200098d36600462004e56565b62002df2565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b620002ba620009cc36600462004ed2565b62002e7c565b608054620003bd9063ffffffff1681565b62000a7a620009f43660046200491b565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002df565b600054600290610100900460ff1615801562000b1d575060005460ff8083169116105b62000b455760405162461bcd60e51b815260040162000b3c9062004f69565b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000bc662003067565b62000be160008051602062005f098339815191528c620030d4565b62000bee600088620030d4565b62000c0960008051602062005de983398151915288620030d4565b62000c2460008051602062005e6983398151915288620030d4565b62000c3f60008051602062005d8983398151915288620030d4565b62000c5a60008051602062005dc983398151915289620030d4565b62000c7560008051602062005ee983398151915289620030d4565b62000c9060008051602062005e0983398151915289620030d4565b62000cab60008051602062005e8983398151915289620030d4565b62000cd560008051602062005f0983398151915260008051602062005d69833981519152620030e0565b62000cf060008051602062005d6983398151915289620030d4565b62000d0b60008051602062005da983398151915289620030d4565b62000d3560008051602062005ec983398151915260008051602062005ea9833981519152620030e0565b62000d5060008051602062005ec983398151915287620030d4565b62000d6b60008051602062005ea983398151915287620030d4565b6073546074546001600160401b03600160401b9092048216911680821462000da657604051632e4cc54360e11b815260040160405180910390fd5b600062000dce888888886000607460009054906101000a90046001600160401b031662003135565b6001600160401b03838116600081815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068b018054909216909417938802939093179092556007880180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81529596506001600160a01b038e81169663bb5907089662000ed09694831695600160581b90950490921693607693607793909291169060040162005063565b600060405180830381600087803b15801562000eeb57600080fd5b505af115801562000f00573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff8516815260008051602062005e498339815191529350602001915062000f379050565b60405180910390a15050505050505050505050565b63ffffffff8216600090815260816020526040812062000f6d908362003363565b90505b92915050565b600054600290610100900460ff1615801562000f99575060005460ff8083169116105b62000fb85760405162461bcd60e51b815260040162000b3c9062004f69565b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200103962003067565b6200105460008051602062005f0983398151915288620030d4565b62001061600084620030d4565b6200107c60008051602062005de983398151915284620030d4565b6200109760008051602062005e6983398151915284620030d4565b620010b260008051602062005d8983398151915284620030d4565b620010cd60008051602062005dc983398151915285620030d4565b620010e860008051602062005ee983398151915285620030d4565b6200110360008051602062005e0983398151915285620030d4565b6200111e60008051602062005e8983398151915285620030d4565b6200114860008051602062005f0983398151915260008051602062005d69833981519152620030e0565b6200116360008051602062005d6983398151915285620030d4565b6200117e60008051602062005da983398151915285620030d4565b620011a860008051602062005ec983398151915260008051602062005ea9833981519152620030e0565b620011c360008051602062005ec983398151915283620030d4565b620011de60008051602062005ea983398151915283620030d4565b620011eb600033620030d4565b6000805461ff001916905560405160ff8216815260008051602062005e498339815191529060200160405180910390a150505050505050565b63ffffffff8116600090815260816020526040812062000f7090620033a8565b60008051602062005f098339815191526200125f8162003419565b63ffffffff8916600090815260816020526040902062001286818a8a8a8a8a8a8a62003425565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b90041615620012ee576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200132762002619565b6040518263ffffffff1660e01b81526004016200134691815260200190565b600060405180830381600087803b1580156200136157600080fd5b505af115801562001376573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005f098339815191526200140f8162003419565b63ffffffff8916600090815260816020526040902062001436818a8a8a8a8a8a8a620037ad565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b900416156200149e576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620014d762002619565b6040518263ffffffff1660e01b8152600401620014f691815260200190565b600060405180830381600087803b1580156200151157600080fd5b505af115801562001526573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a6040516200157093929190620050c9565b60405180910390a350505050505050505050565b63ffffffff82166000908152608160205260409020620015b460008051602062005f0983398151915233620021f3565b6200160857606f5460ff1615620015de57604051630bc011ff60e21b815260040160405180910390fd5b620015ea818362003363565b6200160857604051630674f25160e11b815260040160405180910390fd5b62001614818362003ba9565b505050565b60008051602062005e89833981519152620016348162003419565b6103e88261ffff1610806200164e57506103ff8261ffff16115b156200166d57604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620016e060008051602062005ec983398151915233620021f3565b6200174f57608454600160801b90046001600160401b031615806200173057506084544290620017259062093a8090600160801b90046001600160401b031662005100565b6001600160401b0316115b156200174f5760405163692baaad60e11b815260040160405180910390fd5b6200175962003d9b565b565b60009081526034602052604090206001015490565b6200177b826200175b565b620017868162003419565b62001614838362003e1a565b6001600160a01b0381163314620017bc57604051630b4ad1cd60e31b815260040160405180910390fd5b620017c8828262003e86565b5050565b60008051602062005e89833981519152620017e78162003419565b606f5460ff1662001829576084546001600160401b03600160c01b909104811690831610620018295760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190620016b99084906200482f565b600060865460646200188e91906200512a565b905090565b60008051602062005dc9833981519152620018ae8162003419565b63ffffffff82161580620018cd5750607e5463ffffffff908116908316115b15620018ec57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200193357604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b60008051602062005ee9833981519152620019998162003419565b63ffffffff88161580620019b85750607e5463ffffffff908116908916115b15620019d757604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff161515900362001a1e57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001a5c576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062001a779063ffffffff1662005144565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001ac59062004718565b62001ad3939291906200516a565b604051809103906000f08015801562001af0573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001d64949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001da4908d908d9088908e908e908e90600401620051a1565b600060405180830381600087803b15801562001dbf57600080fd5b505af115801562001dd4573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001e0e90878787878762003ef0565b979650505050505050565b606f5460ff161562001e3e57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001e8d92600160c01b90048116911662005100565b6001600160401b0316111562001eb657604051638a0704d360e01b815260040160405180910390fd5b6103e862001ec5888862005204565b6001600160401b0316111562001eee57604051635acfba9d60e11b815260040160405180910390fd5b62001f008189898989898989620037ad565b62001f0c81876200402b565b6085546001600160401b03166000036200201a57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001f88576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001fc162002619565b6040518263ffffffff1660e01b815260040162001fe091815260200190565b600060405180830381600087803b15801562001ffb57600080fd5b505af115801562002010573d6000803e3d6000fd5b50505050620020e4565b620020258162004228565b600681018054600160801b90046001600160401b0316906010620020498362005227565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b48887896040516200212a93929190620050c9565b60405180910390a3505050505050505050565b606f5460ff16156200216257604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff8816600090815260816020526040902062002189818989898989898962003425565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620021e862003d9b565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016200226f919062004d78565b602060405180830381865afa1580156200228d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620022b391906200524e565b608454909150600090620022da906001600160401b03600160401b82048116911662005204565b6001600160401b0316905080600003620022f75760009250505090565b6200230381836200527e565b9250505090565b606f5460009060ff16156200233257604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff16908190036200236a576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200239557604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620023c89084906001600160401b031662005100565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620023fe878362005100565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200248d8362004228565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a2582604051620024c591906200482f565b60405180910390a29695505050505050565b60008051602062005e89833981519152620024f28162003419565b606f5460ff166200252d576085546001600160401b03908116908316106200252d5760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590620016b99084906200482f565b60008051602062005e89833981519152620025958162003419565b62015180826001600160401b03161115620025c357604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890620016b99084906200482f565b60805460009063ffffffff168082036200263557506000919050565b6000816001600160401b0381111562002652576200265262004b05565b6040519080825280602002602001820160405280156200267c578160200160208202803683370190505b50905060005b82811015620026ef57608160006200269c83600162005295565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620026cf57620026cf620052ab565b602090810291909101015280620026e681620052c1565b91505062002682565b50600060205b83600114620029335760006200270d600286620052dd565b6200271a6002876200527e565b62002726919062005295565b90506000816001600160401b0381111562002745576200274562004b05565b6040519080825280602002602001820160405280156200276f578160200160208202803683370190505b50905060005b82811015620028e7576200278b600184620052f4565b81148015620027a65750620027a2600288620052dd565b6001145b15620028265785620027ba8260026200512a565b81518110620027cd57620027cd620052ab565b602002602001015185604051602001620027e99291906200530a565b60405160208183030381529060405280519060200120828281518110620028145762002814620052ab565b602002602001018181525050620028d2565b85620028348260026200512a565b81518110620028475762002847620052ab565b6020026020010151868260026200285f91906200512a565b6200286c90600162005295565b815181106200287f576200287f620052ab565b60200260200101516040516020016200289a9291906200530a565b60405160208183030381529060405280519060200120828281518110620028c557620028c5620052ab565b6020026020010181815250505b80620028de81620052c1565b91505062002775565b508094508195508384604051602001620029039291906200530a565b6040516020818303038152906040528051906020012093508280620029289062005318565b9350505050620026f5565b6000836000815181106200294b576200294b620052ab565b6020026020010151905060005b82811015620029d1578184604051602001620029769291906200530a565b6040516020818303038152906040528051906020012091508384604051602001620029a39291906200530a565b6040516020818303038152906040528051906020012093508080620029c890620052c1565b91505062002958565b5095945050505050565b60008051602062005d89833981519152620029f68162003419565b63ffffffff8416158062002a155750607e5463ffffffff908116908516115b1562002a3457604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002a75576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002ac457604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002b0b57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002b4957604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002bc98462001224565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002c1e9216908b908b9060040162005332565b600060405180830381600087803b15801562002c3957600080fd5b505af115801562002c4e573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005da983398151915262002cc38162003419565b683635c9adc5dea0000082118062002cde5750633b9aca0082105b1562002cfd57604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620016b9565b62002d3e826200175b565b62002d498162003419565b62001614838362003e86565b60008051602062005e0983398151915262002d708162003419565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002dcc57600080fd5b505af115801562002de1573d6000803e3d6000fd5b5050505062002def620042f3565b50565b60008051602062005e6983398151915262002e0d8162003419565b6001600160401b03841660009081526083602052604090205463ffffffff161562002e4b576040516337c8fe0960e11b815260040160405180910390fd5b600062002e5e8888888887600062003135565b60008080526002909101602052604090209390935550505050505050565b60008051602062005de983398151915262002e978162003419565b607e805460009190829062002eb29063ffffffff1662005144565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620030559695949392919062005372565b60405180910390a25050505050505050565b600054610100900460ff16620017595760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b3c565b620017c8828262003e1a565b6000620030ed836200175b565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6080805460009182918290620031519063ffffffff1662005144565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000876001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff16021790555080608260008a6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150878260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550868260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620033509594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b038281166000908152600485016020526040812054909242926200339692918116911662005100565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b031615620033fc575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002def81336200434c565b60078801546000906001600160401b0390811690871610156200345b5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620034fc5760068901546001600160401b03600160801b90910481169089161115620034a55760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b9092041614620034f557604051632bd2e3e760e01b815260040160405180910390fd5b5062003571565b506001600160401b03851660009081526002890160205260409020548062003537576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b909104811690871611156200357157604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620035aa5750876001600160401b0316876001600160401b031611155b80620035ce575060068901546001600160401b03600160c01b909104811690881611155b15620035ed5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b900481169086161462003634576040516332a2a77f60e01b815260040160405180910390fd5b6000620036468a888888868962003ef0565b9050600060008051602062005e298339815191526002836040516200366c9190620053cb565b602060405180830381855afa1580156200368a573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620036af91906200524e565b620036bb9190620052dd565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620036ff91889190600401620053e9565b602060405180830381865afa1580156200371d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003743919062005426565b62003761576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620037a05760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620037bb8a620033a8565b60078b01549091506001600160401b039081169089161015620037f15760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620038945760068a01546001600160401b03600160801b9091048116908a1611156200383b5760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200388d57604051632bd2e3e760e01b815260040160405180910390fd5b5062003904565b6001600160401b038816600090815260028b016020526040902054915081620038d0576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200390457604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620039375760405163b9b18f5760e01b815260040160405180910390fd5b6000620039498b8a8a8a878b62003ef0565b9050600060008051602062005e298339815191526002836040516200396f9190620053cb565b602060405180830381855afa1580156200398d573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620039b291906200524e565b620039be9190620052dd565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003a0291899190600401620053e9565b602060405180830381865afa15801562003a20573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003a46919062005426565b62003a64576040516309bde33960e01b815260040160405180910390fd5b600062003a72848b62005204565b905062003acb87826001600160401b031662003a8d6200221e565b62003a9991906200512a565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004376565b80608460088282829054906101000a90046001600160401b031662003af1919062005100565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b15801562003b8157600080fd5b505af115801562003b96573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003be8575060068201546001600160401b03600160801b9091048116908216115b1562003c075760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003cc362002619565b6040518263ffffffff1660e01b815260040162003ce291815260200190565b600060405180830381600087803b15801562003cfd57600080fd5b505af115801562003d12573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003df757600080fd5b505af115801562003e0c573d6000803e3d6000fd5b5050505062001759620043ca565b62003e268282620021f3565b620017c85760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003e928282620021f3565b15620017c85760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003f26575081155b1562003f455760405163340c614f60e11b815260040160405180910390fd5b8062003f64576040516366385b5160e01b815260040160405180910390fd5b62003f6f8462004427565b62003f8d576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b60006200403883620033a8565b9050816000806200404a848462005204565b6085546001600160401b0391821692506000916200407191600160401b90041642620052f4565b90505b846001600160401b0316846001600160401b031614620040fb576001600160401b03808516600090815260038901602052604090206001810154909116821015620040d6576001810154600160401b90046001600160401b03169450620040f4565b620040e2868662005204565b6001600160401b0316935050620040fb565b5062004074565b6000620041098484620052f4565b9050838110156200416757808403600c81116200412757806200412a565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a60865402816200415c576200415c62005268565b0460865550620041df565b838103600c81116200417a57806200417d565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a76400000281620041b757620041b762005268565b04905080608654670de0b6b3a76400000281620041d857620041d862005268565b0460865550505b683635c9adc5dea0000060865411156200420657683635c9adc5dea000006086556200421e565b633b9aca0060865410156200421e57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002def5760068101546000906200427390600160c01b90046001600160401b0316600162005100565b905062004281828262003363565b15620017c8576006820154600090600290620042af908490600160801b90046001600160401b031662005204565b620042bb91906200544a565b620042c7908362005100565b9050620042d5838262003363565b15620042e75762001614838262003ba9565b62001614838362003ba9565b606f5460ff166200431757604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b620043588282620021f3565b620017c857604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905262001614908490620044ad565b606f5460ff1615620043ef57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b0383161080156200445e575067ffffffff00000001604083901c6001600160401b0316105b80156200447f575067ffffffff00000001608083901c6001600160401b0316105b801562004497575067ffffffff0000000160c083901c105b15620044a557506001919050565b506000919050565b600062004504826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620045869092919063ffffffff16565b80519091501562001614578080602001905181019062004525919062005426565b620016145760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b3c565b60606200459784846000856200459f565b949350505050565b606082471015620046025760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b3c565b600080866001600160a01b03168587604051620046209190620053cb565b60006040518083038185875af1925050503d80600081146200465f576040519150601f19603f3d011682016040523d82523d6000602084013e62004664565b606091505b509150915062001e0e8783838760608315620046e5578251600003620046dd576001600160a01b0385163b620046dd5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b3c565b508162004597565b620045978383815115620046fc5781518083602001fd5b8060405162461bcd60e51b815260040162000b3c919062004d36565b6108f5806200547483390190565b6001600160a01b038116811462002def57600080fd5b80356001600160401b03811681146200341457600080fd5b6000806000806000806000806000806101408b8d0312156200477557600080fd5b8a35620047828162004726565b99506200479260208c016200473c565b9850620047a260408c016200473c565b975060608b0135620047b48162004726565b965060808b0135620047c68162004726565b955060a08b0135620047d88162004726565b945060c08b0135620047ea8162004726565b935060e08b0135620047fc8162004726565b92506200480d6101008c016200473c565b91506200481e6101208c016200473c565b90509295989b9194979a5092959850565b6001600160401b0391909116815260200190565b803563ffffffff811681146200341457600080fd5b600080604083850312156200486c57600080fd5b620048778362004843565b915062004887602084016200473c565b90509250929050565b60008060008060008060c08789031215620048aa57600080fd5b8635620048b78162004726565b9550620048c7602088016200473c565b9450620048d7604088016200473c565b93506060870135620048e98162004726565b92506080870135620048fb8162004726565b915060a08701356200490d8162004726565b809150509295509295509295565b6000602082840312156200492e57600080fd5b62000f6d8262004843565b80610300810183101562000f7057600080fd5b6000806000806000806000806103e0898b0312156200496a57600080fd5b620049758962004843565b97506200498560208a016200473c565b96506200499560408a016200473c565b9550620049a560608a016200473c565b9450620049b560808a016200473c565b935060a0890135925060c08901359150620049d48a60e08b0162004939565b90509295985092959890939650565b6000806000806000806000806103e0898b03121562004a0157600080fd5b62004a0c8962004843565b975062004a1c60208a016200473c565b965062004a2c60408a016200473c565b955062004a3c60608a016200473c565b94506080890135935060a0890135925060c089013562004a5c8162004726565b9150620049d48a60e08b0162004939565b60006020828403121562004a8057600080fd5b813561ffff8116811462004a9357600080fd5b9392505050565b60006020828403121562004aad57600080fd5b5035919050565b6000806040838503121562004ac857600080fd5b82359150602083013562004adc8162004726565b809150509250929050565b60006020828403121562004afa57600080fd5b62000f6d826200473c565b634e487b7160e01b600052604160045260246000fd5b600082601f83011262004b2d57600080fd5b81356001600160401b038082111562004b4a5762004b4a62004b05565b604051601f8301601f19908116603f0116810190828211818310171562004b755762004b7562004b05565b8160405283815286602085880101111562004b8f57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121562004bcb57600080fd5b62004bd68862004843565b965062004be6602089016200473c565b9550604088013562004bf88162004726565b9450606088013562004c0a8162004726565b9350608088013562004c1c8162004726565b925060a08801356001600160401b038082111562004c3957600080fd5b62004c478b838c0162004b1b565b935060c08a013591508082111562004c5e57600080fd5b5062004c6d8a828b0162004b1b565b91505092959891949750929550565b60008060008060008060c0878903121562004c9657600080fd5b62004ca18762004843565b955062004cb1602088016200473c565b945062004cc1604088016200473c565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004cff57818101518382015260200162004ce5565b50506000910152565b6000815180845262004d2281602086016020860162004ce2565b601f01601f19169290920160200192915050565b60208152600062000f6d602083018462004d08565b6000806040838503121562004d5f57600080fd5b62004d6a836200473c565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000806000806060858703121562004da357600080fd5b843562004db08162004726565b935062004dc06020860162004843565b925060408501356001600160401b038082111562004ddd57600080fd5b818701915087601f83011262004df257600080fd5b81358181111562004e0257600080fd5b88602082850101111562004e1557600080fd5b95989497505060200194505050565b60006020828403121562004e3757600080fd5b813562004a938162004726565b803560ff811681146200341457600080fd5b60008060008060008060c0878903121562004e7057600080fd5b863562004e7d8162004726565b9550602087013562004e8f8162004726565b945062004e9f604088016200473c565b935062004eaf606088016200473c565b92506080870135915062004ec660a0880162004e44565b90509295509295509295565b60008060008060008060c0878903121562004eec57600080fd5b863562004ef98162004726565b9550602087013562004f0b8162004726565b945062004f1b604088016200473c565b935062004f2b6060880162004e44565b92506080870135915060a08701356001600160401b0381111562004f4e57600080fd5b62004f5c89828a0162004b1b565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b8054600090600181811c908083168062004fd257607f831692505b6020808410820362004ff457634e487b7160e01b600052602260045260246000fd5b83885260208801828015620050125760018114620050295762005056565b60ff198716825285151560051b8201975062005056565b60008981526020902060005b87811015620050505781548482015290860190840162005035565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c060408201819052600090620050919083018762004fb7565b8281036060840152620050a5818762004fb7565b608084019590955250506001600160401b039190911660a090910152949350505050565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03818116838216019080821115620051235762005123620050ea565b5092915050565b808202811582820484141762000f705762000f70620050ea565b600063ffffffff808316818103620051605762005160620050ea565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620051989083018462004d08565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c060808201819052600090620051e39083018562004d08565b82810360a0840152620051f7818562004d08565b9998505050505050505050565b6001600160401b03828116828216039080821115620051235762005123620050ea565b60006001600160401b038281166002600160401b03198101620051605762005160620050ea565b6000602082840312156200526157600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b60008262005290576200529062005268565b500490565b8082018082111562000f705762000f70620050ea565b634e487b7160e01b600052603260045260246000fd5b600060018201620052d657620052d6620050ea565b5060010190565b600082620052ef57620052ef62005268565b500690565b8181038181111562000f705762000f70620050ea565b918252602082015260400190565b6000816200532a576200532a620050ea565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a08201819052600090620053bf9083018462004d08565b98975050505050505050565b60008251620053df81846020870162004ce2565b9190910192915050565b61032081016103008085843782018360005b60018110156200541c578151835260209283019290910190600101620053fb565b5050509392505050565b6000602082840312156200543957600080fd5b8151801515811462004a9357600080fd5b60006001600160401b038381168062005467576200546762005268565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220a19e7a72432195d9a35c7ce8fa5f1284415aac66bb1ad08a4c2e1c252fd8690864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a26469706673582212203f12260f62b0d87f840f477a6be35cf07e8ec905f8d0f0ce1838a89a9200b2cd64736f6c63430008140033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b50600436106200029e5760003560e01c80630645af0914620002a3578063066ec01214620002bc578063080b311114620002e85780630a0d9fbe14620003105780630e36f582146200032b57806311f6b287146200034257806312b86e1914620003595780631489ed10146200037057806315064c9614620003875780631608859c14620003955780631796a1ae14620003ac5780631816b7e514620003d35780632072f6c514620003ea578063248a9ca314620003f457806325280169146200041a5780632f2ff15d14620004cf57806336568abe14620004e6578063394218e914620004fd578063477fa270146200051457806355a71ee0146200051d57806360469169146200056157806365c0504d146200056b5780637222020f146200061a578063727885e914620006315780637975fcfe14620006485780637fb6e76a146200066e578063841b24d7146200069757806387c20c0114620006b25780638bd4f07114620006c957806391d1485414620006e057806399f5634e14620006f75780639a908e7314620007015780639c9f3dfe1462000718578063a066215c146200072f578063a217fddf1462000746578063a2967d99146200074f578063a3c573eb1462000759578063afd23cbe1462000790578063b99d0ad714620007ba578063c1acbc341462000892578063c4c928c214620008ad578063ceee281d14620008c4578063d02103ca14620008ed578063d5073f6f1462000915578063d547741f146200092c578063d939b3151462000943578063dbc169761462000957578063dde0ff771462000961578063e0bfd3d2146200097c578063e46761c41462000993578063f34eb8eb14620009bb578063f4e9267514620009d2578063f9c4c2ae14620009e3575b600080fd5b620002ba620002b436600462004754565b62000afa565b005b608454620002d0906001600160401b031681565b604051620002df91906200482f565b60405180910390f35b620002ff620002f936600462004858565b62000f4c565b6040519015158152602001620002df565b608554620002d090600160401b90046001600160401b031681565b620002ba6200033c36600462004890565b62000f76565b620002d0620003533660046200491b565b62001224565b620002ba6200036a3660046200494c565b62001244565b620002ba62000381366004620049e3565b620013f4565b606f54620002ff9060ff1681565b620002ba620003a636600462004858565b62001584565b607e54620003bd9063ffffffff1681565b60405163ffffffff9091168152602001620002df565b620002ba620003e436600462004a6d565b62001619565b620002ba620016c5565b6200040b6200040536600462004a9a565b6200175b565b604051908152602001620002df565b6200049b6200042b36600462004858565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002df565b620002ba620004e036600462004ab4565b62001770565b620002ba620004f736600462004ab4565b62001792565b620002ba6200050e36600462004ae7565b620017cc565b6086546200040b565b6200040b6200052e36600462004858565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b6200040b6200187b565b620005d06200057c3660046200491b565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002df565b620002ba6200062b3660046200491b565b62001893565b620002ba6200064236600462004baf565b6200197e565b6200065f6200065936600462004c7c565b62001de6565b604051620002df919062004d36565b620003bd6200067f36600462004ae7565b60836020526000908152604090205463ffffffff1681565b608454620002d090600160c01b90046001600160401b031681565b620002ba620006c3366004620049e3565b62001e19565b620002ba620006da3660046200494c565b6200213d565b620002ff620006f136600462004ab4565b620021f3565b6200040b6200221e565b620002d06200071236600462004d4b565b6200230a565b620002ba6200072936600462004ae7565b620024d7565b620002ba6200074036600462004ae7565b6200257a565b6200040b600081565b6200040b62002619565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b604051620002df919062004d78565b608554620007a690600160801b900461ffff1681565b60405161ffff9091168152602001620002df565b62000850620007cb36600462004858565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002df919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002d090600160801b90046001600160401b031681565b620002ba620008be36600462004d8c565b620029db565b620003bd620008d536600462004e24565b60826020526000908152604090205463ffffffff1681565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b620002ba6200092636600462004a9a565b62002ca8565b620002ba6200093d36600462004ab4565b62002d33565b608554620002d0906001600160401b031681565b620002ba62002d55565b608454620002d090600160401b90046001600160401b031681565b620002ba6200098d36600462004e56565b62002df2565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b620002ba620009cc36600462004ed2565b62002e7c565b608054620003bd9063ffffffff1681565b62000a7a620009f43660046200491b565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002df565b600054600290610100900460ff1615801562000b1d575060005460ff8083169116105b62000b455760405162461bcd60e51b815260040162000b3c9062004f69565b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000bc662003067565b62000be160008051602062005f098339815191528c620030d4565b62000bee600088620030d4565b62000c0960008051602062005de983398151915288620030d4565b62000c2460008051602062005e6983398151915288620030d4565b62000c3f60008051602062005d8983398151915288620030d4565b62000c5a60008051602062005dc983398151915289620030d4565b62000c7560008051602062005ee983398151915289620030d4565b62000c9060008051602062005e0983398151915289620030d4565b62000cab60008051602062005e8983398151915289620030d4565b62000cd560008051602062005f0983398151915260008051602062005d69833981519152620030e0565b62000cf060008051602062005d6983398151915289620030d4565b62000d0b60008051602062005da983398151915289620030d4565b62000d3560008051602062005ec983398151915260008051602062005ea9833981519152620030e0565b62000d5060008051602062005ec983398151915287620030d4565b62000d6b60008051602062005ea983398151915287620030d4565b6073546074546001600160401b03600160401b9092048216911680821462000da657604051632e4cc54360e11b815260040160405180910390fd5b600062000dce888888886000607460009054906101000a90046001600160401b031662003135565b6001600160401b03838116600081815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068b018054909216909417938802939093179092556007880180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81529596506001600160a01b038e81169663bb5907089662000ed09694831695600160581b90950490921693607693607793909291169060040162005063565b600060405180830381600087803b15801562000eeb57600080fd5b505af115801562000f00573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff8516815260008051602062005e498339815191529350602001915062000f379050565b60405180910390a15050505050505050505050565b63ffffffff8216600090815260816020526040812062000f6d908362003363565b90505b92915050565b600054600290610100900460ff1615801562000f99575060005460ff8083169116105b62000fb85760405162461bcd60e51b815260040162000b3c9062004f69565b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200103962003067565b6200105460008051602062005f0983398151915288620030d4565b62001061600084620030d4565b6200107c60008051602062005de983398151915284620030d4565b6200109760008051602062005e6983398151915284620030d4565b620010b260008051602062005d8983398151915284620030d4565b620010cd60008051602062005dc983398151915285620030d4565b620010e860008051602062005ee983398151915285620030d4565b6200110360008051602062005e0983398151915285620030d4565b6200111e60008051602062005e8983398151915285620030d4565b6200114860008051602062005f0983398151915260008051602062005d69833981519152620030e0565b6200116360008051602062005d6983398151915285620030d4565b6200117e60008051602062005da983398151915285620030d4565b620011a860008051602062005ec983398151915260008051602062005ea9833981519152620030e0565b620011c360008051602062005ec983398151915283620030d4565b620011de60008051602062005ea983398151915283620030d4565b620011eb600033620030d4565b6000805461ff001916905560405160ff8216815260008051602062005e498339815191529060200160405180910390a150505050505050565b63ffffffff8116600090815260816020526040812062000f7090620033a8565b60008051602062005f098339815191526200125f8162003419565b63ffffffff8916600090815260816020526040902062001286818a8a8a8a8a8a8a62003425565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b90041615620012ee576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200132762002619565b6040518263ffffffff1660e01b81526004016200134691815260200190565b600060405180830381600087803b1580156200136157600080fd5b505af115801562001376573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005f098339815191526200140f8162003419565b63ffffffff8916600090815260816020526040902062001436818a8a8a8a8a8a8a620037ad565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b900416156200149e576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620014d762002619565b6040518263ffffffff1660e01b8152600401620014f691815260200190565b600060405180830381600087803b1580156200151157600080fd5b505af115801562001526573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a6040516200157093929190620050c9565b60405180910390a350505050505050505050565b63ffffffff82166000908152608160205260409020620015b460008051602062005f0983398151915233620021f3565b6200160857606f5460ff1615620015de57604051630bc011ff60e21b815260040160405180910390fd5b620015ea818362003363565b6200160857604051630674f25160e11b815260040160405180910390fd5b62001614818362003ba9565b505050565b60008051602062005e89833981519152620016348162003419565b6103e88261ffff1610806200164e57506103ff8261ffff16115b156200166d57604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620016e060008051602062005ec983398151915233620021f3565b6200174f57608454600160801b90046001600160401b031615806200173057506084544290620017259062093a8090600160801b90046001600160401b031662005100565b6001600160401b0316115b156200174f5760405163692baaad60e11b815260040160405180910390fd5b6200175962003d9b565b565b60009081526034602052604090206001015490565b6200177b826200175b565b620017868162003419565b62001614838362003e1a565b6001600160a01b0381163314620017bc57604051630b4ad1cd60e31b815260040160405180910390fd5b620017c8828262003e86565b5050565b60008051602062005e89833981519152620017e78162003419565b606f5460ff1662001829576084546001600160401b03600160c01b909104811690831610620018295760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190620016b99084906200482f565b600060865460646200188e91906200512a565b905090565b60008051602062005dc9833981519152620018ae8162003419565b63ffffffff82161580620018cd5750607e5463ffffffff908116908316115b15620018ec57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200193357604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b60008051602062005ee9833981519152620019998162003419565b63ffffffff88161580620019b85750607e5463ffffffff908116908916115b15620019d757604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff161515900362001a1e57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001a5c576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062001a779063ffffffff1662005144565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001ac59062004718565b62001ad3939291906200516a565b604051809103906000f08015801562001af0573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001d64949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001da4908d908d9088908e908e908e90600401620051a1565b600060405180830381600087803b15801562001dbf57600080fd5b505af115801562001dd4573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001e0e90878787878762003ef0565b979650505050505050565b606f5460ff161562001e3e57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001e8d92600160c01b90048116911662005100565b6001600160401b0316111562001eb657604051638a0704d360e01b815260040160405180910390fd5b6103e862001ec5888862005204565b6001600160401b0316111562001eee57604051635acfba9d60e11b815260040160405180910390fd5b62001f008189898989898989620037ad565b62001f0c81876200402b565b6085546001600160401b03166000036200201a57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001f88576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001fc162002619565b6040518263ffffffff1660e01b815260040162001fe091815260200190565b600060405180830381600087803b15801562001ffb57600080fd5b505af115801562002010573d6000803e3d6000fd5b50505050620020e4565b620020258162004228565b600681018054600160801b90046001600160401b0316906010620020498362005227565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b48887896040516200212a93929190620050c9565b60405180910390a3505050505050505050565b606f5460ff16156200216257604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff8816600090815260816020526040902062002189818989898989898962003425565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620021e862003d9b565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016200226f919062004d78565b602060405180830381865afa1580156200228d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620022b391906200524e565b608454909150600090620022da906001600160401b03600160401b82048116911662005204565b6001600160401b0316905080600003620022f75760009250505090565b6200230381836200527e565b9250505090565b606f5460009060ff16156200233257604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff16908190036200236a576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200239557604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620023c89084906001600160401b031662005100565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620023fe878362005100565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200248d8362004228565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a2582604051620024c591906200482f565b60405180910390a29695505050505050565b60008051602062005e89833981519152620024f28162003419565b606f5460ff166200252d576085546001600160401b03908116908316106200252d5760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590620016b99084906200482f565b60008051602062005e89833981519152620025958162003419565b62015180826001600160401b03161115620025c357604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890620016b99084906200482f565b60805460009063ffffffff168082036200263557506000919050565b6000816001600160401b0381111562002652576200265262004b05565b6040519080825280602002602001820160405280156200267c578160200160208202803683370190505b50905060005b82811015620026ef57608160006200269c83600162005295565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620026cf57620026cf620052ab565b602090810291909101015280620026e681620052c1565b91505062002682565b50600060205b83600114620029335760006200270d600286620052dd565b6200271a6002876200527e565b62002726919062005295565b90506000816001600160401b0381111562002745576200274562004b05565b6040519080825280602002602001820160405280156200276f578160200160208202803683370190505b50905060005b82811015620028e7576200278b600184620052f4565b81148015620027a65750620027a2600288620052dd565b6001145b15620028265785620027ba8260026200512a565b81518110620027cd57620027cd620052ab565b602002602001015185604051602001620027e99291906200530a565b60405160208183030381529060405280519060200120828281518110620028145762002814620052ab565b602002602001018181525050620028d2565b85620028348260026200512a565b81518110620028475762002847620052ab565b6020026020010151868260026200285f91906200512a565b6200286c90600162005295565b815181106200287f576200287f620052ab565b60200260200101516040516020016200289a9291906200530a565b60405160208183030381529060405280519060200120828281518110620028c557620028c5620052ab565b6020026020010181815250505b80620028de81620052c1565b91505062002775565b508094508195508384604051602001620029039291906200530a565b6040516020818303038152906040528051906020012093508280620029289062005318565b9350505050620026f5565b6000836000815181106200294b576200294b620052ab565b6020026020010151905060005b82811015620029d1578184604051602001620029769291906200530a565b6040516020818303038152906040528051906020012091508384604051602001620029a39291906200530a565b6040516020818303038152906040528051906020012093508080620029c890620052c1565b91505062002958565b5095945050505050565b60008051602062005d89833981519152620029f68162003419565b63ffffffff8416158062002a155750607e5463ffffffff908116908516115b1562002a3457604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002a75576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002ac457604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002b0b57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002b4957604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002bc98462001224565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002c1e9216908b908b9060040162005332565b600060405180830381600087803b15801562002c3957600080fd5b505af115801562002c4e573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005da983398151915262002cc38162003419565b683635c9adc5dea0000082118062002cde5750633b9aca0082105b1562002cfd57604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620016b9565b62002d3e826200175b565b62002d498162003419565b62001614838362003e86565b60008051602062005e0983398151915262002d708162003419565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002dcc57600080fd5b505af115801562002de1573d6000803e3d6000fd5b5050505062002def620042f3565b50565b60008051602062005e6983398151915262002e0d8162003419565b6001600160401b03841660009081526083602052604090205463ffffffff161562002e4b576040516337c8fe0960e11b815260040160405180910390fd5b600062002e5e8888888887600062003135565b60008080526002909101602052604090209390935550505050505050565b60008051602062005de983398151915262002e978162003419565b607e805460009190829062002eb29063ffffffff1662005144565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620030559695949392919062005372565b60405180910390a25050505050505050565b600054610100900460ff16620017595760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b3c565b620017c8828262003e1a565b6000620030ed836200175b565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6080805460009182918290620031519063ffffffff1662005144565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000876001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff16021790555080608260008a6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150878260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550868260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620033509594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b038281166000908152600485016020526040812054909242926200339692918116911662005100565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b031615620033fc575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002def81336200434c565b60078801546000906001600160401b0390811690871610156200345b5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620034fc5760068901546001600160401b03600160801b90910481169089161115620034a55760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b9092041614620034f557604051632bd2e3e760e01b815260040160405180910390fd5b5062003571565b506001600160401b03851660009081526002890160205260409020548062003537576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b909104811690871611156200357157604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620035aa5750876001600160401b0316876001600160401b031611155b80620035ce575060068901546001600160401b03600160c01b909104811690881611155b15620035ed5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b900481169086161462003634576040516332a2a77f60e01b815260040160405180910390fd5b6000620036468a888888868962003ef0565b9050600060008051602062005e298339815191526002836040516200366c9190620053cb565b602060405180830381855afa1580156200368a573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620036af91906200524e565b620036bb9190620052dd565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620036ff91889190600401620053e9565b602060405180830381865afa1580156200371d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003743919062005426565b62003761576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620037a05760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620037bb8a620033a8565b60078b01549091506001600160401b039081169089161015620037f15760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620038945760068a01546001600160401b03600160801b9091048116908a1611156200383b5760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200388d57604051632bd2e3e760e01b815260040160405180910390fd5b5062003904565b6001600160401b038816600090815260028b016020526040902054915081620038d0576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200390457604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620039375760405163b9b18f5760e01b815260040160405180910390fd5b6000620039498b8a8a8a878b62003ef0565b9050600060008051602062005e298339815191526002836040516200396f9190620053cb565b602060405180830381855afa1580156200398d573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620039b291906200524e565b620039be9190620052dd565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003a0291899190600401620053e9565b602060405180830381865afa15801562003a20573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003a46919062005426565b62003a64576040516309bde33960e01b815260040160405180910390fd5b600062003a72848b62005204565b905062003acb87826001600160401b031662003a8d6200221e565b62003a9991906200512a565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004376565b80608460088282829054906101000a90046001600160401b031662003af1919062005100565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b15801562003b8157600080fd5b505af115801562003b96573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003be8575060068201546001600160401b03600160801b9091048116908216115b1562003c075760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003cc362002619565b6040518263ffffffff1660e01b815260040162003ce291815260200190565b600060405180830381600087803b15801562003cfd57600080fd5b505af115801562003d12573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003df757600080fd5b505af115801562003e0c573d6000803e3d6000fd5b5050505062001759620043ca565b62003e268282620021f3565b620017c85760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003e928282620021f3565b15620017c85760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003f26575081155b1562003f455760405163340c614f60e11b815260040160405180910390fd5b8062003f64576040516366385b5160e01b815260040160405180910390fd5b62003f6f8462004427565b62003f8d576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b60006200403883620033a8565b9050816000806200404a848462005204565b6085546001600160401b0391821692506000916200407191600160401b90041642620052f4565b90505b846001600160401b0316846001600160401b031614620040fb576001600160401b03808516600090815260038901602052604090206001810154909116821015620040d6576001810154600160401b90046001600160401b03169450620040f4565b620040e2868662005204565b6001600160401b0316935050620040fb565b5062004074565b6000620041098484620052f4565b9050838110156200416757808403600c81116200412757806200412a565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a60865402816200415c576200415c62005268565b0460865550620041df565b838103600c81116200417a57806200417d565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a76400000281620041b757620041b762005268565b04905080608654670de0b6b3a76400000281620041d857620041d862005268565b0460865550505b683635c9adc5dea0000060865411156200420657683635c9adc5dea000006086556200421e565b633b9aca0060865410156200421e57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002def5760068101546000906200427390600160c01b90046001600160401b0316600162005100565b905062004281828262003363565b15620017c8576006820154600090600290620042af908490600160801b90046001600160401b031662005204565b620042bb91906200544a565b620042c7908362005100565b9050620042d5838262003363565b15620042e75762001614838262003ba9565b62001614838362003ba9565b606f5460ff166200431757604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b620043588282620021f3565b620017c857604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905262001614908490620044ad565b606f5460ff1615620043ef57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b0383161080156200445e575067ffffffff00000001604083901c6001600160401b0316105b80156200447f575067ffffffff00000001608083901c6001600160401b0316105b801562004497575067ffffffff0000000160c083901c105b15620044a557506001919050565b506000919050565b600062004504826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620045869092919063ffffffff16565b80519091501562001614578080602001905181019062004525919062005426565b620016145760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b3c565b60606200459784846000856200459f565b949350505050565b606082471015620046025760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b3c565b600080866001600160a01b03168587604051620046209190620053cb565b60006040518083038185875af1925050503d80600081146200465f576040519150601f19603f3d011682016040523d82523d6000602084013e62004664565b606091505b509150915062001e0e8783838760608315620046e5578251600003620046dd576001600160a01b0385163b620046dd5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b3c565b508162004597565b620045978383815115620046fc5781518083602001fd5b8060405162461bcd60e51b815260040162000b3c919062004d36565b6108f5806200547483390190565b6001600160a01b038116811462002def57600080fd5b80356001600160401b03811681146200341457600080fd5b6000806000806000806000806000806101408b8d0312156200477557600080fd5b8a35620047828162004726565b99506200479260208c016200473c565b9850620047a260408c016200473c565b975060608b0135620047b48162004726565b965060808b0135620047c68162004726565b955060a08b0135620047d88162004726565b945060c08b0135620047ea8162004726565b935060e08b0135620047fc8162004726565b92506200480d6101008c016200473c565b91506200481e6101208c016200473c565b90509295989b9194979a5092959850565b6001600160401b0391909116815260200190565b803563ffffffff811681146200341457600080fd5b600080604083850312156200486c57600080fd5b620048778362004843565b915062004887602084016200473c565b90509250929050565b60008060008060008060c08789031215620048aa57600080fd5b8635620048b78162004726565b9550620048c7602088016200473c565b9450620048d7604088016200473c565b93506060870135620048e98162004726565b92506080870135620048fb8162004726565b915060a08701356200490d8162004726565b809150509295509295509295565b6000602082840312156200492e57600080fd5b62000f6d8262004843565b80610300810183101562000f7057600080fd5b6000806000806000806000806103e0898b0312156200496a57600080fd5b620049758962004843565b97506200498560208a016200473c565b96506200499560408a016200473c565b9550620049a560608a016200473c565b9450620049b560808a016200473c565b935060a0890135925060c08901359150620049d48a60e08b0162004939565b90509295985092959890939650565b6000806000806000806000806103e0898b03121562004a0157600080fd5b62004a0c8962004843565b975062004a1c60208a016200473c565b965062004a2c60408a016200473c565b955062004a3c60608a016200473c565b94506080890135935060a0890135925060c089013562004a5c8162004726565b9150620049d48a60e08b0162004939565b60006020828403121562004a8057600080fd5b813561ffff8116811462004a9357600080fd5b9392505050565b60006020828403121562004aad57600080fd5b5035919050565b6000806040838503121562004ac857600080fd5b82359150602083013562004adc8162004726565b809150509250929050565b60006020828403121562004afa57600080fd5b62000f6d826200473c565b634e487b7160e01b600052604160045260246000fd5b600082601f83011262004b2d57600080fd5b81356001600160401b038082111562004b4a5762004b4a62004b05565b604051601f8301601f19908116603f0116810190828211818310171562004b755762004b7562004b05565b8160405283815286602085880101111562004b8f57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121562004bcb57600080fd5b62004bd68862004843565b965062004be6602089016200473c565b9550604088013562004bf88162004726565b9450606088013562004c0a8162004726565b9350608088013562004c1c8162004726565b925060a08801356001600160401b038082111562004c3957600080fd5b62004c478b838c0162004b1b565b935060c08a013591508082111562004c5e57600080fd5b5062004c6d8a828b0162004b1b565b91505092959891949750929550565b60008060008060008060c0878903121562004c9657600080fd5b62004ca18762004843565b955062004cb1602088016200473c565b945062004cc1604088016200473c565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004cff57818101518382015260200162004ce5565b50506000910152565b6000815180845262004d2281602086016020860162004ce2565b601f01601f19169290920160200192915050565b60208152600062000f6d602083018462004d08565b6000806040838503121562004d5f57600080fd5b62004d6a836200473c565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000806000806060858703121562004da357600080fd5b843562004db08162004726565b935062004dc06020860162004843565b925060408501356001600160401b038082111562004ddd57600080fd5b818701915087601f83011262004df257600080fd5b81358181111562004e0257600080fd5b88602082850101111562004e1557600080fd5b95989497505060200194505050565b60006020828403121562004e3757600080fd5b813562004a938162004726565b803560ff811681146200341457600080fd5b60008060008060008060c0878903121562004e7057600080fd5b863562004e7d8162004726565b9550602087013562004e8f8162004726565b945062004e9f604088016200473c565b935062004eaf606088016200473c565b92506080870135915062004ec660a0880162004e44565b90509295509295509295565b60008060008060008060c0878903121562004eec57600080fd5b863562004ef98162004726565b9550602087013562004f0b8162004726565b945062004f1b604088016200473c565b935062004f2b6060880162004e44565b92506080870135915060a08701356001600160401b0381111562004f4e57600080fd5b62004f5c89828a0162004b1b565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b8054600090600181811c908083168062004fd257607f831692505b6020808410820362004ff457634e487b7160e01b600052602260045260246000fd5b83885260208801828015620050125760018114620050295762005056565b60ff198716825285151560051b8201975062005056565b60008981526020902060005b87811015620050505781548482015290860190840162005035565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c060408201819052600090620050919083018762004fb7565b8281036060840152620050a5818762004fb7565b608084019590955250506001600160401b039190911660a090910152949350505050565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03818116838216019080821115620051235762005123620050ea565b5092915050565b808202811582820484141762000f705762000f70620050ea565b600063ffffffff808316818103620051605762005160620050ea565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620051989083018462004d08565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c060808201819052600090620051e39083018562004d08565b82810360a0840152620051f7818562004d08565b9998505050505050505050565b6001600160401b03828116828216039080821115620051235762005123620050ea565b60006001600160401b038281166002600160401b03198101620051605762005160620050ea565b6000602082840312156200526157600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b60008262005290576200529062005268565b500490565b8082018082111562000f705762000f70620050ea565b634e487b7160e01b600052603260045260246000fd5b600060018201620052d657620052d6620050ea565b5060010190565b600082620052ef57620052ef62005268565b500690565b8181038181111562000f705762000f70620050ea565b918252602082015260400190565b6000816200532a576200532a620050ea565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a08201819052600090620053bf9083018462004d08565b98975050505050505050565b60008251620053df81846020870162004ce2565b9190910192915050565b61032081016103008085843782018360005b60018110156200541c578151835260209283019290910190600101620053fb565b5050509392505050565b6000602082840312156200543957600080fd5b8151801515811462004a9357600080fd5b60006001600160401b038381168062005467576200546762005268565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220a19e7a72432195d9a35c7ce8fa5f1284415aac66bb1ad08a4c2e1c252fd8690864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a26469706673582212203f12260f62b0d87f840f477a6be35cf07e8ec905f8d0f0ce1838a89a9200b2cd64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMBridgeV2.json b/compiled-contracts/paris/PolygonZkEVMBridgeV2.json index f9061ef0c..b11f33fe5 100644 --- a/compiled-contracts/paris/PolygonZkEVMBridgeV2.json +++ b/compiled-contracts/paris/PolygonZkEVMBridgeV2.json @@ -983,8 +983,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50615336806100206000396000f3fe608060405260043610620001bb5760003560e01c806383f2440311620000f5578063ccaa2d111162000090578063ccaa2d11146200056b578063cd5865791462000590578063d02103ca14620005a7578063dbc1697614620005d0578063ee25560b14620005e8578063f5efcd791462000619578063f811bff7146200063e578063fb570834146200066357600080fd5b806383f2440314620004465780638ed7e3f2146200046b578063aaa13cc2146200048d578063b8b284d014620004b2578063bab161bf14620004d7578063be5831c714620004fb578063c00f14ab1462000521578063cc461632146200054657600080fd5b80633c351e1011620001665780633c351e1014620003125780633cbc795b14620003345780633e19704314620003705780634b2f336d14620003955780635ca1e16514620003b75780637843298b14620003cf57806379e2cf9714620003f457806381b1c174146200040c57600080fd5b806315064c9614620001c05780632072f6c514620001f157806322e95f2c146200020b578063240ff378146200023f57806327aef4e814620002565780632dfdf0b5146200027d578063318aee3d14620002a4575b600080fd5b348015620001cd57600080fd5b50606854620001dc9060ff1681565b60405190151581526020015b60405180910390f35b348015620001fe57600080fd5b506200020962000688565b005b3480156200021857600080fd5b50620002306200022a36600462002cd2565b620006c0565b604051620001e8919062002d0e565b620002096200025036600462002d7c565b62000713565b3480156200026357600080fd5b506200026e62000763565b604051620001e8919062002e53565b3480156200028a57600080fd5b506200029560535481565b604051908152602001620001e8565b348015620002b157600080fd5b50620002ed620002c336600462002e6f565b606b6020526000908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201620001e8565b3480156200031f57600080fd5b50606d5462000230906001600160a01b031681565b3480156200034157600080fd5b50606d546200035a90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001620001e8565b3480156200037d57600080fd5b50620002956200038f36600462002e9f565b620007f9565b348015620003a257600080fd5b50606f5462000230906001600160a01b031681565b348015620003c457600080fd5b506200029562000886565b348015620003dc57600080fd5b5062000230620003ee36600462002f29565b6200096c565b3480156200040157600080fd5b50620002096200099d565b3480156200041957600080fd5b50620002306200042b36600462002f79565b606a602052600090815260409020546001600160a01b031681565b3480156200045357600080fd5b50620002956200046536600462002fa6565b620009c1565b3480156200047857600080fd5b50606c5462000230906001600160a01b031681565b3480156200049a57600080fd5b5062000230620004ac366004620030c3565b62000aa5565b348015620004bf57600080fd5b5062000209620004d13660046200316b565b62000bb6565b348015620004e457600080fd5b506068546200035a90610100900463ffffffff1681565b3480156200050857600080fd5b506068546200035a90600160c81b900463ffffffff1681565b3480156200052e57600080fd5b506200026e6200054036600462002e6f565b62000c60565b3480156200055357600080fd5b50620001dc62000565366004620031f7565b62000cad565b3480156200057857600080fd5b50620002096200058a3660046200322f565b62000d3d565b62000209620005a13660046200332a565b6200127c565b348015620005b457600080fd5b506068546200023090600160281b90046001600160a01b031681565b348015620005dd57600080fd5b50620002096200170f565b348015620005f557600080fd5b50620002956200060736600462002f79565b60696020526000908152604090205481565b3480156200062657600080fd5b5062000209620006383660046200322f565b62001745565b3480156200064b57600080fd5b50620002096200065d366004620033cb565b620019fb565b3480156200067057600080fd5b50620001dc6200068236600462003482565b62001c85565b606c546001600160a01b03163314620006b457604051631736745960e31b815260040160405180910390fd5b620006be62001c9f565b565b6000606a60008484604051602001620006db929190620034cf565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b34158015906200072d5750606f546001600160a01b031615155b156200074c576040516301bd897160e61b815260040160405180910390fd5b6200075c85853486868662001cfc565b5050505050565b606e80546200077290620034f9565b80601f0160208091040260200160405190810160405280929190818152602001828054620007a090620034f9565b8015620007f15780601f10620007c557610100808354040283529160200191620007f1565b820191906000526020600020905b815481529060010190602001808311620007d357829003601f168201915b505050505081565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b605354600090819081805b602081101562000963578083901c600116600103620008f45760338160208110620008c057620008c062003535565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062000921565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806200095a9062003561565b91505062000891565b50919392505050565b60006200099584846200097f8562001dd0565b6200098a8662001e97565b620004ac8762001f55565b949350505050565b605354606854600160c81b900463ffffffff161015620006be57620006be62002016565b600083815b602081101562000a9c57600163ffffffff8516821c8116900362000a3857848160208110620009f957620009f962003535565b60200201358260405160200162000a1a929190918252602082015260400190565b60405160208183030381529060405280519060200120915062000a87565b8185826020811062000a4e5762000a4e62003535565b602002013560405160200162000a6e929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062000a938162003561565b915050620009c6565b50949350505050565b600080868660405160200162000abd929190620034cf565b604051602081830303815290604052805190602001209050600060ff60f81b30836040518060200162000af09062002c96565b601f1982820381018352601f90910116604081905262000b19908b908b908b906020016200357d565b60408051601f198184030181529082905262000b399291602001620035ba565b6040516020818303038152906040528051906020012060405160200162000b9294939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b606f546001600160a01b031662000be05760405163dde3cda760e01b815260040160405180910390fd5b606f54604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac9062000c149033908890600401620035ed565b600060405180830381600087803b15801562000c2f57600080fd5b505af115801562000c44573d6000803e3d6000fd5b5050505062000c5886868686868662001cfc565b505050505050565b606062000c6d8262001dd0565b62000c788362001e97565b62000c838462001f55565b60405160200162000c97939291906200357d565b6040516020818303038152906040529050919050565b6068546000908190610100900463ffffffff1615801562000cd4575063ffffffff83166001145b1562000ce8575063ffffffff831662000d13565b62000cfe600160201b63ffffffff851662003606565b62000d109063ffffffff861662003620565b90505b600881901c600090815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000d6257604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161462000d93576040516302caf51760e11b815260040160405180910390fd5b62000dcd8c8c8c8c8c62000dc760008e8e8e8e8e8e8e60405162000db992919062003636565b6040518091039020620007f9565b620020b4565b6001600160a01b03861662000f1357606f546001600160a01b031662000ea55760006001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000e27576020820181803683370190505b5060405162000e37919062003646565b60006040518083038185875af1925050503d806000811462000e76576040519150601f19603f3d011682016040523d82523d6000602084013e62000e7b565b606091505b505090508062000e9e57604051630ce8f45160e31b815260040160405180910390fd5b506200122d565b606f546040516340c10f1960e01b81526001600160a01b03909116906340c10f199062000ed99087908790600401620035ed565b600060405180830381600087803b15801562000ef457600080fd5b505af115801562000f09573d6000803e3d6000fd5b505050506200122d565b606d546001600160a01b03878116911614801562000f425750606d5463ffffffff888116600160a01b90920416145b1562000f5c5760006001600160a01b038516848262000dfc565b60685463ffffffff61010090910481169088160362000f915762000f8b6001600160a01b038716858562002225565b6200122d565b6000878760405160200162000fa8929190620034cf565b60408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b031680620011c5576000808062000ff18688018862003664565b9250925092506000858484846040516200100b9062002c96565b62001019939291906200357d565b8190604051809103906000f59050801580156200103a573d6000803e3d6000fd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f19906200106e908d908d90600401620035ed565b600060405180830381600087803b1580156200108957600080fd5b505af11580156200109e573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b604051620011b395949392919062003702565b60405180910390a1505050506200122a565b6040516340c10f1960e01b81526001600160a01b038216906340c10f1990620011f59089908990600401620035ed565b600060405180830381600087803b1580156200121057600080fd5b505af115801562001225573d6000803e3d6000fd5b505050505b50505b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8a88888787604051620012669594939291906200373d565b60405180910390a1505050505050505050505050565b60685460ff1615620012a157604051630bc011ff60e21b815260040160405180910390fd5b620012ab62002284565b60685463ffffffff610100909104811690881603620012dd576040516302caf51760e11b815260040160405180910390fd5b6000806060876001600160a01b038816620013ce57883414620013135760405163b89240f560e01b815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff169450906200134290620034f9565b80601f01602080910402602001604051908101604052809291908181526020018280546200137090620034f9565b8015620013c15780601f106200139557610100808354040283529160200191620013c1565b820191906000526020600020905b815481529060010190602001808311620013a357829003601f168201915b505050505091506200167a565b3415620013ee5760405163798ee6f160e01b815260040160405180910390fd5b606f546001600160a01b03908116908916036200146f57604051632770a7eb60e21b81526001600160a01b03891690639dc29fac90620014359033908d90600401620035ed565b600060405180830381600087803b1580156200145057600080fd5b505af115801562001465573d6000803e3d6000fd5b505050506200167a565b6001600160a01b038089166000908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b900490921691810182905290156200152d57604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac90620014e59033908e90600401620035ed565b600060405180830381600087803b1580156200150057600080fd5b505af115801562001515573d6000803e3d6000fd5b5050505080602001519450806000015193506200166b565b8515620015425762001542898b8989620022df565b6040516370a0823160e01b81526000906001600160a01b038b16906370a08231906200157390309060040162002d0e565b602060405180830381865afa15801562001591573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620015b791906200376f565b9050620015d06001600160a01b038b1633308e62002641565b6040516370a0823160e01b81526000906001600160a01b038c16906370a08231906200160190309060040162002d0e565b602060405180830381865afa1580156200161f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200164591906200376f565b905062001653828262003789565b6068548c9850610100900463ffffffff169650935050505b620016768962000c60565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e8688605354604051620016bc9897969594939291906200379f565b60405180910390a1620016e7620016e1600085878f8f878980519060200120620007f9565b6200267b565b8615620016f857620016f862002016565b505050506200170660018055565b50505050505050565b606c546001600160a01b031633146200173b57604051631736745960e31b815260040160405180910390fd5b620006be6200277a565b60685460ff16156200176a57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146200179b576040516302caf51760e11b815260040160405180910390fd5b620017c18c8c8c8c8c62000dc760018e8e8e8e8e8e8e60405162000db992919062003636565b606f546000906001600160a01b03166200188057846001600160a01b031684888a8686604051602401620017f994939291906200380c565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162001830919062003646565b60006040518083038185875af1925050503d80600081146200186f576040519150601f19603f3d011682016040523d82523d6000602084013e62001874565b606091505b5050809150506200198c565b606f546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990620018b49088908890600401620035ed565b600060405180830381600087803b158015620018cf57600080fd5b505af1158015620018e4573d6000803e3d6000fd5b50505050846001600160a01b0316878985856040516024016200190b94939291906200380c565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162001942919062003646565b6000604051808303816000865af19150503d806000811462001981576040519150601f19603f3d011682016040523d82523d6000602084013e62001986565b606091505b50909150505b80620019ab576040516337e391c360e01b815260040160405180910390fd5b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8b89898888604051620019e49594939291906200373d565b60405180910390a150505050505050505050505050565b600054610100900460ff161580801562001a1c5750600054600160ff909116105b8062001a385750303b15801562001a38575060005460ff166001145b62001aa15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562001ac5576000805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff8a160265010000000000600160c81b03191617600160281b6001600160a01b038781169190910291909117909155606c80546001600160a01b031916858316179055861662001b515763ffffffff85161562001b4b57604051630d43a60960e11b815260040160405180910390fd5b62001c2c565b606d805463ffffffff8716600160a01b026001600160c01b03199091166001600160a01b03891617179055606e62001b8a838262003893565b506000801b601260405162001b9f9062002c96565b6060808252600d908201526c2bb930b83832b21022ba3432b960991b608082015260a060208201819052600490820152630ae8aa8960e31b60c082015260ff909116604082015260e0018190604051809103906000f590508015801562001c0a573d6000803e3d6000fd5b50606f80546001600160a01b0319166001600160a01b03929092169190911790555b62001c36620027d3565b801562001706576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b60008162001c95868686620009c1565b1495945050505050565b60685460ff161562001cc457604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b60685463ffffffff61010090910481169087160362001d2e576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff1633898989888860535460405162001d84999897969594939291906200395f565b60405180910390a162001dbf620016e16001606860019054906101000a900463ffffffff16338a8a8a898960405162000db992919062003636565b821562000c585762000c5862002016565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009182916001600160a01b0386169162001e19919062003646565b600060405180830381855afa9150503d806000811462001e56576040519150601f19603f3d011682016040523d82523d6000602084013e62001e5b565b606091505b50915091508162001e8c57604051806040016040528060078152602001664e4f5f4e414d4560c81b81525062000995565b620009958162002807565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009182916001600160a01b0386169162001ee0919062003646565b600060405180830381855afa9150503d806000811462001f1d576040519150601f19603f3d011682016040523d82523d6000602084013e62001f22565b606091505b50915091508162001e8c57604051806040016040528060098152602001681393d7d4d6535093d360ba1b81525062000995565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b0386169162001f9d919062003646565b600060405180830381855afa9150503d806000811462001fda576040519150601f19603f3d011682016040523d82523d6000602084013e62001fdf565b606091505b509150915081801562001ff3575080516020145b6200200057601262000995565b80806020019051810190620009959190620039ce565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d6200205f62000886565b6040518263ffffffff1660e01b81526004016200207e91815260200190565b600060405180830381600087803b1580156200209957600080fd5b505af1158015620020ae573d6000803e3d6000fd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101206312bd9b1960e11b9092526064810191909152600091600160281b90046001600160a01b03169063257b3632906084016020604051808303816000875af11580156200212f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200215591906200376f565b9050806000036200217857604051622f6fad60e01b815260040160405180910390fd5b600080600160401b871615620021bd5786915062002199848a848962001c85565b620021b7576040516338105f3b60e21b815260040160405180910390fd5b6200220e565b602087901c620021cf816001620039ee565b9150879250620021ee620021e5868c86620009c1565b8a838962001c85565b6200220c576040516338105f3b60e21b815260040160405180910390fd5b505b6200221a8282620029b0565b505050505050505050565b6200227f8363a9059cbb60e01b848460405160240162002247929190620035ed565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262002a60565b505050565b600260015403620022d85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001a98565b6002600155565b6000620022f0600482848662003a15565b620022fb9162003a41565b9050632afa533160e01b6001600160e01b03198216016200249c5760008080808080806200232d896004818d62003a15565b8101906200233c919062003a72565b9650965096509650965096509650336001600160a01b0316876001600160a01b0316146200237d5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0386163014620023a75760405163750643af60e01b815260040160405180910390fd5b8a8514620023c8576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e169162002448919062003646565b6000604051808303816000865af19150503d806000811462002487576040519150601f19603f3d011682016040523d82523d6000602084013e6200248c565b606091505b505050505050505050506200075c565b6001600160e01b031981166323f2ebc360e21b14620024ce57604051637141605d60e11b815260040160405180910390fd5b600080808080808080620024e68a6004818e62003a15565b810190620024f5919062003acd565b97509750975097509750975097509750336001600160a01b0316886001600160a01b031614620025385760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0387163014620025625760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f1691620025eb919062003646565b6000604051808303816000865af19150503d80600081146200262a576040519150601f19603f3d011682016040523d82523d6000602084013e6200262f565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052620020ae9085906323b872dd60e01b9060840162002247565b8060016200268c6020600262003c56565b62002698919062003789565b60535410620026ba576040516377ae67b360e11b815260040160405180910390fd5b6000605360008154620026cd9062003561565b9182905550905060005b602081101562002769578082901c6001166001036200270f57826033826020811062002707576200270762003535565b015550505050565b6033816020811062002725576200272562003535565b015460408051602081019290925281018490526060016040516020818303038152906040528051906020012092508080620027609062003561565b915050620026d7565b506200227f62003c64565b60018055565b60685460ff166200279e57604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600054610100900460ff16620027fd5760405162461bcd60e51b815260040162001a989062003c7a565b620006be62002b39565b606060408251106200282957818060200190518101906200070d919062003cc5565b81516020036200297d5760005b60208110801562002869575082818151811062002857576200285762003535565b01602001516001600160f81b03191615155b156200288457806200287b8162003561565b91505062002836565b80600003620028bd5750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b6000816001600160401b03811115620028da57620028da62002fea565b6040519080825280601f01601f19166020018201604052801562002905576020820181803683370190505b50905060005b82811015620029755784818151811062002929576200292962003535565b602001015160f81c60f81b82828151811062002949576200294962003535565b60200101906001600160f81b031916908160001a905350806200296c8162003561565b9150506200290b565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b606854600090610100900463ffffffff16158015620029d5575063ffffffff82166001145b15620029e9575063ffffffff821662002a14565b620029ff600160201b63ffffffff841662003606565b62002a119063ffffffff851662003620565b90505b600881901c60008181526069602052604081208054600160ff861690811b918218928390559290919081831690036200170657604051630c8d9eab60e31b815260040160405180910390fd5b600062002ab7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031662002b639092919063ffffffff16565b8051909150156200227f578080602001905181019062002ad8919062003d44565b6200227f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162001a98565b600054610100900460ff16620027745760405162461bcd60e51b815260040162001a989062003c7a565b606062000995848460008585600080866001600160a01b0316858760405162002b8d919062003646565b60006040518083038185875af1925050503d806000811462002bcc576040519150601f19603f3d011682016040523d82523d6000602084013e62002bd1565b606091505b509150915062002be48783838762002bef565b979650505050505050565b6060831562002c6357825160000362002c5b576001600160a01b0385163b62002c5b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001a98565b508162000995565b62000995838381511562002c7a5781518083602001fd5b8060405162461bcd60e51b815260040162001a98919062002e53565b61159c8062003d6583390190565b803563ffffffff81168114620029ab57600080fd5b6001600160a01b038116811462002ccf57600080fd5b50565b6000806040838503121562002ce657600080fd5b62002cf18362002ca4565b9150602083013562002d038162002cb9565b809150509250929050565b6001600160a01b0391909116815260200190565b801515811462002ccf57600080fd5b60008083601f84011262002d4457600080fd5b5081356001600160401b0381111562002d5c57600080fd5b60208301915083602082850101111562002d7557600080fd5b9250929050565b60008060008060006080868803121562002d9557600080fd5b62002da08662002ca4565b9450602086013562002db28162002cb9565b9350604086013562002dc48162002d22565b925060608601356001600160401b0381111562002de057600080fd5b62002dee8882890162002d31565b969995985093965092949392505050565b60005b8381101562002e1c57818101518382015260200162002e02565b50506000910152565b6000815180845262002e3f81602086016020860162002dff565b601f01601f19169290920160200192915050565b60208152600062002e68602083018462002e25565b9392505050565b60006020828403121562002e8257600080fd5b813562002e688162002cb9565b60ff8116811462002ccf57600080fd5b600080600080600080600060e0888a03121562002ebb57600080fd5b873562002ec88162002e8f565b965062002ed86020890162002ca4565b9550604088013562002eea8162002cb9565b945062002efa6060890162002ca4565b9350608088013562002f0c8162002cb9565b9699959850939692959460a0840135945060c09093013592915050565b60008060006060848603121562002f3f57600080fd5b62002f4a8462002ca4565b9250602084013562002f5c8162002cb9565b9150604084013562002f6e8162002cb9565b809150509250925092565b60006020828403121562002f8c57600080fd5b5035919050565b8061040081018310156200070d57600080fd5b6000806000610440848603121562002fbd57600080fd5b8335925062002fd0856020860162002f93565b915062002fe1610420850162002ca4565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156200302b576200302b62002fea565b604052919050565b60006001600160401b038211156200304f576200304f62002fea565b50601f01601f191660200190565b6000620030746200306e8462003033565b62003000565b90508281528383830111156200308957600080fd5b828260208301376000602084830101529392505050565b600082601f830112620030b257600080fd5b62002e68838335602085016200305d565b600080600080600060a08688031215620030dc57600080fd5b620030e78662002ca4565b94506020860135620030f98162002cb9565b935060408601356001600160401b03808211156200311657600080fd5b6200312489838a01620030a0565b945060608801359150808211156200313b57600080fd5b506200314a88828901620030a0565b92505060808601356200315d8162002e8f565b809150509295509295909350565b60008060008060008060a087890312156200318557600080fd5b620031908762002ca4565b95506020870135620031a28162002cb9565b9450604087013593506060870135620031bb8162002d22565b925060808701356001600160401b03811115620031d757600080fd5b620031e589828a0162002d31565b979a9699509497509295939492505050565b600080604083850312156200320b57600080fd5b620032168362002ca4565b9150620032266020840162002ca4565b90509250929050565b6000806000806000806000806000806000806109208d8f0312156200325357600080fd5b6200325f8e8e62002f93565b9b50620032718e6104008f0162002f93565b9a506108008d013599506108208d013598506108408d013597506200329a6108608e0162002ca4565b9650620032ac6108808e013562002cb9565b6108808d01359550620032c36108a08e0162002ca4565b9450620032d56108c08e013562002cb9565b6108c08d013593506108e08d013592506001600160401b036109008e01351115620032ff57600080fd5b620033128e6109008f01358f0162002d31565b81935080925050509295989b509295989b509295989b565b600080600080600080600060c0888a0312156200334657600080fd5b620033518862002ca4565b96506020880135620033638162002cb9565b95506040880135945060608801356200337c8162002cb9565b935060808801356200338e8162002d22565b925060a08801356001600160401b03811115620033aa57600080fd5b620033b88a828b0162002d31565b989b979a50959850939692959293505050565b60008060008060008060c08789031215620033e557600080fd5b620033f08762002ca4565b95506020870135620034028162002cb9565b9450620034126040880162002ca4565b93506060870135620034248162002cb9565b92506080870135620034368162002cb9565b915060a08701356001600160401b038111156200345257600080fd5b8701601f810189136200346457600080fd5b62003475898235602084016200305d565b9150509295509295509295565b60008060008061046085870312156200349a57600080fd5b84359350620034ad866020870162002f93565b9250620034be610420860162002ca4565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b600181811c908216806200350e57607f821691505b6020821081036200352f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016200357657620035766200354b565b5060010190565b60608152600062003592606083018662002e25565b8281036020840152620035a6818662002e25565b91505060ff83166040830152949350505050565b60008351620035ce81846020880162002dff565b835190830190620035e481836020880162002dff565b01949350505050565b6001600160a01b03929092168252602082015260400190565b80820281158282048414176200070d576200070d6200354b565b808201808211156200070d576200070d6200354b565b8183823760009101908152919050565b600082516200365a81846020870162002dff565b9190910192915050565b6000806000606084860312156200367a57600080fd5b83356001600160401b03808211156200369257600080fd5b620036a087838801620030a0565b94506020860135915080821115620036b757600080fd5b50620036c686828701620030a0565b925050604084013562002f6e8162002e8f565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b63ffffffff861681526001600160a01b0385811660208301528416604082015260806060820181905260009062002be49083018486620036d9565b94855263ffffffff9390931660208501526001600160a01b039182166040850152166060830152608082015260a00190565b6000602082840312156200378257600080fd5b5051919050565b818103818111156200070d576200070d6200354b565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c08301819052600091620037f38483018762002e25565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff841660208201526060604082018190526000906200383f9083018486620036d9565b9695505050505050565b601f8211156200227f57600081815260208120601f850160051c81016020861015620038725750805b601f850160051c820191505b8181101562000c58578281556001016200387e565b81516001600160401b03811115620038af57620038af62002fea565b620038c781620038c08454620034f9565b8462003849565b602080601f831160018114620038ff5760008415620038e65750858301515b600019600386901b1c1916600185901b17855562000c58565b600085815260208120601f198616915b8281101562003930578886015182559484019460019091019084016200390f565b50858210156200394f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c08301819052600091620039b48483018789620036d9565b925080851660e085015250509a9950505050505050505050565b600060208284031215620039e157600080fd5b815162002e688162002e8f565b63ffffffff81811683821601908082111562003a0e5762003a0e6200354b565b5092915050565b6000808585111562003a2657600080fd5b8386111562003a3457600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101562003a6a5780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a03121562003a8e57600080fd5b873562003a9b8162002cb9565b9650602088013562003aad8162002cb9565b95506040880135945060608801359350608088013562002f0c8162002e8f565b600080600080600080600080610100898b03121562003aeb57600080fd5b883562003af88162002cb9565b9750602089013562003b0a8162002cb9565b96506040890135955060608901359450608089013562003b2a8162002d22565b935060a089013562003b3c8162002e8f565b979a969950949793969295929450505060c08201359160e0013590565b600181815b8085111562003b9a57816000190482111562003b7e5762003b7e6200354b565b8085161562003b8c57918102915b93841c939080029062003b5e565b509250929050565b60008262003bb3575060016200070d565b8162003bc2575060006200070d565b816001811462003bdb576002811462003be65762003c06565b60019150506200070d565b60ff84111562003bfa5762003bfa6200354b565b50506001821b6200070d565b5060208310610133831016604e8410600b841016171562003c2b575081810a6200070d565b62003c37838362003b59565b806000190482111562003c4e5762003c4e6200354b565b029392505050565b600062002e68838362003ba2565b634e487b7160e01b600052600160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60006020828403121562003cd857600080fd5b81516001600160401b0381111562003cef57600080fd5b8201601f8101841362003d0157600080fd5b805162003d126200306e8262003033565b81815285602083850101111562003d2857600080fd5b62003d3b82602083016020860162002dff565b95945050505050565b60006020828403121562003d5757600080fd5b815162002e688162002d2256fe6101006040523480156200001257600080fd5b506040516200159c3803806200159c83398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516110e0620004bc60003960006101f70152600081816102ba015281816104e0015261054e0152600061049101526000818161031f015261045b01526110e06000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063a457c2d71161007c578063a457c2d7146102f4578063a9059cbb14610307578063cd0d00961461031a578063d505accf14610341578063dd62ed3e14610354578063ffa1ad741461036757600080fd5b806370a08231146102515780637ecebe001461027a57806395d89b411461029a5780639dc29fac146102a2578063a3c573eb146102b557600080fd5b806330adf81f116100ff57806330adf81f146101c9578063313ce567146101f05780633644e51514610221578063395093511461022957806340c10f191461023c57600080fd5b806306fdde031461013c578063095ea7b31461015a57806318160ddd1461017d57806320606b701461018f57806323b872dd146101b6575b600080fd5b610144610387565b6040516101519190610e26565b60405180910390f35b61016d610168366004610e90565b610419565b6040519015158152602001610151565b6002545b604051908152602001610151565b6101817f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b61016d6101c4366004610eba565b610433565b6101817f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610151565b610181610457565b61016d610237366004610e90565b6104b3565b61024f61024a366004610e90565b6104d5565b005b61018161025f366004610ef6565b6001600160a01b031660009081526020819052604090205490565b610181610288366004610ef6565b60056020526000908152604090205481565b610144610534565b61024f6102b0366004610e90565b610543565b6102dc7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610151565b61016d610302366004610e90565b610595565b61016d610315366004610e90565b610610565b6101817f000000000000000000000000000000000000000000000000000000000000000081565b61024f61034f366004610f18565b61061e565b610181610362366004610f8b565b610859565b610144604051806040016040528060018152602001603160f81b81525081565b60606003805461039690610fbe565b80601f01602080910402602001604051908101604052809291908181526020018280546103c290610fbe565b801561040f5780601f106103e45761010080835404028352916020019161040f565b820191906000526020600020905b8154815290600101906020018083116103f257829003601f168201915b5050505050905090565b600033610427818585610884565b60019150505b92915050565b6000336104418582856109a9565b61044c858585610a23565b506001949350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461461048e5761048946610bb5565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000336104278185856104c68383610859565b6104d0919061100e565b610884565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105265760405162461bcd60e51b815260040161051d90611021565b60405180910390fd5b6105308282610c61565b5050565b60606004805461039690610fbe565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461058b5760405162461bcd60e51b815260040161051d90611021565b6105308282610d0e565b600033816105a38286610859565b9050838110156106035760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161051d565b61044c8286868403610884565b600033610427818585610a23565b8342111561067a5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b606482015260840161051d565b6001600160a01b038716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866106c783611071565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610725610457565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156107b0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906107e65750896001600160a01b0316816001600160a01b0316145b6108425760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b606482015260840161051d565b61084d8a8a8a610884565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166108e65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161051d565b6001600160a01b0382166109475760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161051d565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006109b58484610859565b90506000198114610a1d5781811015610a105760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161051d565b610a1d8484848403610884565b50505050565b6001600160a01b038316610a875760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161051d565b6001600160a01b038216610ae95760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161051d565b6001600160a01b03831660009081526020819052604090205481811015610b615760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161051d565b6001600160a01b038481166000818152602081815260408083208787039055938716808352918490208054870190559251858152909260008051602061108b833981519152910160405180910390a3610a1d565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610be0610387565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610cb75760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161051d565b8060026000828254610cc9919061100e565b90915550506001600160a01b0382166000818152602081815260408083208054860190555184815260008051602061108b833981519152910160405180910390a35050565b6001600160a01b038216610d6e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161051d565b6001600160a01b03821660009081526020819052604090205481811015610de25760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161051d565b6001600160a01b03831660008181526020818152604080832086860390556002805487900390555185815291929160008051602061108b833981519152910161099c565b600060208083528351808285015260005b81811015610e5357858101830151858201604001528201610e37565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610e8b57600080fd5b919050565b60008060408385031215610ea357600080fd5b610eac83610e74565b946020939093013593505050565b600080600060608486031215610ecf57600080fd5b610ed884610e74565b9250610ee660208501610e74565b9150604084013590509250925092565b600060208284031215610f0857600080fd5b610f1182610e74565b9392505050565b600080600080600080600060e0888a031215610f3357600080fd5b610f3c88610e74565b9650610f4a60208901610e74565b95506040880135945060608801359350608088013560ff81168114610f6e57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f9e57600080fd5b610fa783610e74565b9150610fb560208401610e74565b90509250929050565b600181811c90821680610fd257607f821691505b602082108103610ff257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561042d5761042d610ff8565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b60006001820161108357611083610ff8565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122041a613df402940120c0c7421c7d02599c9a28987dd403c01cd013411ae6d388964736f6c63430008140033a2646970667358221220057cd6dd4071fe6d2141a3112622ff43f32081877651a41339de10801839d29064736f6c63430008140033", - "deployedBytecode": "0x608060405260043610620001bb5760003560e01c806383f2440311620000f5578063ccaa2d111162000090578063ccaa2d11146200056b578063cd5865791462000590578063d02103ca14620005a7578063dbc1697614620005d0578063ee25560b14620005e8578063f5efcd791462000619578063f811bff7146200063e578063fb570834146200066357600080fd5b806383f2440314620004465780638ed7e3f2146200046b578063aaa13cc2146200048d578063b8b284d014620004b2578063bab161bf14620004d7578063be5831c714620004fb578063c00f14ab1462000521578063cc461632146200054657600080fd5b80633c351e1011620001665780633c351e1014620003125780633cbc795b14620003345780633e19704314620003705780634b2f336d14620003955780635ca1e16514620003b75780637843298b14620003cf57806379e2cf9714620003f457806381b1c174146200040c57600080fd5b806315064c9614620001c05780632072f6c514620001f157806322e95f2c146200020b578063240ff378146200023f57806327aef4e814620002565780632dfdf0b5146200027d578063318aee3d14620002a4575b600080fd5b348015620001cd57600080fd5b50606854620001dc9060ff1681565b60405190151581526020015b60405180910390f35b348015620001fe57600080fd5b506200020962000688565b005b3480156200021857600080fd5b50620002306200022a36600462002cd2565b620006c0565b604051620001e8919062002d0e565b620002096200025036600462002d7c565b62000713565b3480156200026357600080fd5b506200026e62000763565b604051620001e8919062002e53565b3480156200028a57600080fd5b506200029560535481565b604051908152602001620001e8565b348015620002b157600080fd5b50620002ed620002c336600462002e6f565b606b6020526000908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201620001e8565b3480156200031f57600080fd5b50606d5462000230906001600160a01b031681565b3480156200034157600080fd5b50606d546200035a90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001620001e8565b3480156200037d57600080fd5b50620002956200038f36600462002e9f565b620007f9565b348015620003a257600080fd5b50606f5462000230906001600160a01b031681565b348015620003c457600080fd5b506200029562000886565b348015620003dc57600080fd5b5062000230620003ee36600462002f29565b6200096c565b3480156200040157600080fd5b50620002096200099d565b3480156200041957600080fd5b50620002306200042b36600462002f79565b606a602052600090815260409020546001600160a01b031681565b3480156200045357600080fd5b50620002956200046536600462002fa6565b620009c1565b3480156200047857600080fd5b50606c5462000230906001600160a01b031681565b3480156200049a57600080fd5b5062000230620004ac366004620030c3565b62000aa5565b348015620004bf57600080fd5b5062000209620004d13660046200316b565b62000bb6565b348015620004e457600080fd5b506068546200035a90610100900463ffffffff1681565b3480156200050857600080fd5b506068546200035a90600160c81b900463ffffffff1681565b3480156200052e57600080fd5b506200026e6200054036600462002e6f565b62000c60565b3480156200055357600080fd5b50620001dc62000565366004620031f7565b62000cad565b3480156200057857600080fd5b50620002096200058a3660046200322f565b62000d3d565b62000209620005a13660046200332a565b6200127c565b348015620005b457600080fd5b506068546200023090600160281b90046001600160a01b031681565b348015620005dd57600080fd5b50620002096200170f565b348015620005f557600080fd5b50620002956200060736600462002f79565b60696020526000908152604090205481565b3480156200062657600080fd5b5062000209620006383660046200322f565b62001745565b3480156200064b57600080fd5b50620002096200065d366004620033cb565b620019fb565b3480156200067057600080fd5b50620001dc6200068236600462003482565b62001c85565b606c546001600160a01b03163314620006b457604051631736745960e31b815260040160405180910390fd5b620006be62001c9f565b565b6000606a60008484604051602001620006db929190620034cf565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b34158015906200072d5750606f546001600160a01b031615155b156200074c576040516301bd897160e61b815260040160405180910390fd5b6200075c85853486868662001cfc565b5050505050565b606e80546200077290620034f9565b80601f0160208091040260200160405190810160405280929190818152602001828054620007a090620034f9565b8015620007f15780601f10620007c557610100808354040283529160200191620007f1565b820191906000526020600020905b815481529060010190602001808311620007d357829003601f168201915b505050505081565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b605354600090819081805b602081101562000963578083901c600116600103620008f45760338160208110620008c057620008c062003535565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062000921565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806200095a9062003561565b91505062000891565b50919392505050565b60006200099584846200097f8562001dd0565b6200098a8662001e97565b620004ac8762001f55565b949350505050565b605354606854600160c81b900463ffffffff161015620006be57620006be62002016565b600083815b602081101562000a9c57600163ffffffff8516821c8116900362000a3857848160208110620009f957620009f962003535565b60200201358260405160200162000a1a929190918252602082015260400190565b60405160208183030381529060405280519060200120915062000a87565b8185826020811062000a4e5762000a4e62003535565b602002013560405160200162000a6e929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062000a938162003561565b915050620009c6565b50949350505050565b600080868660405160200162000abd929190620034cf565b604051602081830303815290604052805190602001209050600060ff60f81b30836040518060200162000af09062002c96565b601f1982820381018352601f90910116604081905262000b19908b908b908b906020016200357d565b60408051601f198184030181529082905262000b399291602001620035ba565b6040516020818303038152906040528051906020012060405160200162000b9294939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b606f546001600160a01b031662000be05760405163dde3cda760e01b815260040160405180910390fd5b606f54604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac9062000c149033908890600401620035ed565b600060405180830381600087803b15801562000c2f57600080fd5b505af115801562000c44573d6000803e3d6000fd5b5050505062000c5886868686868662001cfc565b505050505050565b606062000c6d8262001dd0565b62000c788362001e97565b62000c838462001f55565b60405160200162000c97939291906200357d565b6040516020818303038152906040529050919050565b6068546000908190610100900463ffffffff1615801562000cd4575063ffffffff83166001145b1562000ce8575063ffffffff831662000d13565b62000cfe600160201b63ffffffff851662003606565b62000d109063ffffffff861662003620565b90505b600881901c600090815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000d6257604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161462000d93576040516302caf51760e11b815260040160405180910390fd5b62000dcd8c8c8c8c8c62000dc760008e8e8e8e8e8e8e60405162000db992919062003636565b6040518091039020620007f9565b620020b4565b6001600160a01b03861662000f1357606f546001600160a01b031662000ea55760006001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000e27576020820181803683370190505b5060405162000e37919062003646565b60006040518083038185875af1925050503d806000811462000e76576040519150601f19603f3d011682016040523d82523d6000602084013e62000e7b565b606091505b505090508062000e9e57604051630ce8f45160e31b815260040160405180910390fd5b506200122d565b606f546040516340c10f1960e01b81526001600160a01b03909116906340c10f199062000ed99087908790600401620035ed565b600060405180830381600087803b15801562000ef457600080fd5b505af115801562000f09573d6000803e3d6000fd5b505050506200122d565b606d546001600160a01b03878116911614801562000f425750606d5463ffffffff888116600160a01b90920416145b1562000f5c5760006001600160a01b038516848262000dfc565b60685463ffffffff61010090910481169088160362000f915762000f8b6001600160a01b038716858562002225565b6200122d565b6000878760405160200162000fa8929190620034cf565b60408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b031680620011c5576000808062000ff18688018862003664565b9250925092506000858484846040516200100b9062002c96565b62001019939291906200357d565b8190604051809103906000f59050801580156200103a573d6000803e3d6000fd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f19906200106e908d908d90600401620035ed565b600060405180830381600087803b1580156200108957600080fd5b505af11580156200109e573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b604051620011b395949392919062003702565b60405180910390a1505050506200122a565b6040516340c10f1960e01b81526001600160a01b038216906340c10f1990620011f59089908990600401620035ed565b600060405180830381600087803b1580156200121057600080fd5b505af115801562001225573d6000803e3d6000fd5b505050505b50505b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8a88888787604051620012669594939291906200373d565b60405180910390a1505050505050505050505050565b60685460ff1615620012a157604051630bc011ff60e21b815260040160405180910390fd5b620012ab62002284565b60685463ffffffff610100909104811690881603620012dd576040516302caf51760e11b815260040160405180910390fd5b6000806060876001600160a01b038816620013ce57883414620013135760405163b89240f560e01b815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff169450906200134290620034f9565b80601f01602080910402602001604051908101604052809291908181526020018280546200137090620034f9565b8015620013c15780601f106200139557610100808354040283529160200191620013c1565b820191906000526020600020905b815481529060010190602001808311620013a357829003601f168201915b505050505091506200167a565b3415620013ee5760405163798ee6f160e01b815260040160405180910390fd5b606f546001600160a01b03908116908916036200146f57604051632770a7eb60e21b81526001600160a01b03891690639dc29fac90620014359033908d90600401620035ed565b600060405180830381600087803b1580156200145057600080fd5b505af115801562001465573d6000803e3d6000fd5b505050506200167a565b6001600160a01b038089166000908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b900490921691810182905290156200152d57604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac90620014e59033908e90600401620035ed565b600060405180830381600087803b1580156200150057600080fd5b505af115801562001515573d6000803e3d6000fd5b5050505080602001519450806000015193506200166b565b8515620015425762001542898b8989620022df565b6040516370a0823160e01b81526000906001600160a01b038b16906370a08231906200157390309060040162002d0e565b602060405180830381865afa15801562001591573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620015b791906200376f565b9050620015d06001600160a01b038b1633308e62002641565b6040516370a0823160e01b81526000906001600160a01b038c16906370a08231906200160190309060040162002d0e565b602060405180830381865afa1580156200161f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200164591906200376f565b905062001653828262003789565b6068548c9850610100900463ffffffff169650935050505b620016768962000c60565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e8688605354604051620016bc9897969594939291906200379f565b60405180910390a1620016e7620016e1600085878f8f878980519060200120620007f9565b6200267b565b8615620016f857620016f862002016565b505050506200170660018055565b50505050505050565b606c546001600160a01b031633146200173b57604051631736745960e31b815260040160405180910390fd5b620006be6200277a565b60685460ff16156200176a57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146200179b576040516302caf51760e11b815260040160405180910390fd5b620017c18c8c8c8c8c62000dc760018e8e8e8e8e8e8e60405162000db992919062003636565b606f546000906001600160a01b03166200188057846001600160a01b031684888a8686604051602401620017f994939291906200380c565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162001830919062003646565b60006040518083038185875af1925050503d80600081146200186f576040519150601f19603f3d011682016040523d82523d6000602084013e62001874565b606091505b5050809150506200198c565b606f546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990620018b49088908890600401620035ed565b600060405180830381600087803b158015620018cf57600080fd5b505af1158015620018e4573d6000803e3d6000fd5b50505050846001600160a01b0316878985856040516024016200190b94939291906200380c565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162001942919062003646565b6000604051808303816000865af19150503d806000811462001981576040519150601f19603f3d011682016040523d82523d6000602084013e62001986565b606091505b50909150505b80620019ab576040516337e391c360e01b815260040160405180910390fd5b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8b89898888604051620019e49594939291906200373d565b60405180910390a150505050505050505050505050565b600054610100900460ff161580801562001a1c5750600054600160ff909116105b8062001a385750303b15801562001a38575060005460ff166001145b62001aa15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562001ac5576000805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff8a160265010000000000600160c81b03191617600160281b6001600160a01b038781169190910291909117909155606c80546001600160a01b031916858316179055861662001b515763ffffffff85161562001b4b57604051630d43a60960e11b815260040160405180910390fd5b62001c2c565b606d805463ffffffff8716600160a01b026001600160c01b03199091166001600160a01b03891617179055606e62001b8a838262003893565b506000801b601260405162001b9f9062002c96565b6060808252600d908201526c2bb930b83832b21022ba3432b960991b608082015260a060208201819052600490820152630ae8aa8960e31b60c082015260ff909116604082015260e0018190604051809103906000f590508015801562001c0a573d6000803e3d6000fd5b50606f80546001600160a01b0319166001600160a01b03929092169190911790555b62001c36620027d3565b801562001706576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b60008162001c95868686620009c1565b1495945050505050565b60685460ff161562001cc457604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b60685463ffffffff61010090910481169087160362001d2e576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff1633898989888860535460405162001d84999897969594939291906200395f565b60405180910390a162001dbf620016e16001606860019054906101000a900463ffffffff16338a8a8a898960405162000db992919062003636565b821562000c585762000c5862002016565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009182916001600160a01b0386169162001e19919062003646565b600060405180830381855afa9150503d806000811462001e56576040519150601f19603f3d011682016040523d82523d6000602084013e62001e5b565b606091505b50915091508162001e8c57604051806040016040528060078152602001664e4f5f4e414d4560c81b81525062000995565b620009958162002807565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009182916001600160a01b0386169162001ee0919062003646565b600060405180830381855afa9150503d806000811462001f1d576040519150601f19603f3d011682016040523d82523d6000602084013e62001f22565b606091505b50915091508162001e8c57604051806040016040528060098152602001681393d7d4d6535093d360ba1b81525062000995565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b0386169162001f9d919062003646565b600060405180830381855afa9150503d806000811462001fda576040519150601f19603f3d011682016040523d82523d6000602084013e62001fdf565b606091505b509150915081801562001ff3575080516020145b6200200057601262000995565b80806020019051810190620009959190620039ce565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d6200205f62000886565b6040518263ffffffff1660e01b81526004016200207e91815260200190565b600060405180830381600087803b1580156200209957600080fd5b505af1158015620020ae573d6000803e3d6000fd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101206312bd9b1960e11b9092526064810191909152600091600160281b90046001600160a01b03169063257b3632906084016020604051808303816000875af11580156200212f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200215591906200376f565b9050806000036200217857604051622f6fad60e01b815260040160405180910390fd5b600080600160401b871615620021bd5786915062002199848a848962001c85565b620021b7576040516338105f3b60e21b815260040160405180910390fd5b6200220e565b602087901c620021cf816001620039ee565b9150879250620021ee620021e5868c86620009c1565b8a838962001c85565b6200220c576040516338105f3b60e21b815260040160405180910390fd5b505b6200221a8282620029b0565b505050505050505050565b6200227f8363a9059cbb60e01b848460405160240162002247929190620035ed565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262002a60565b505050565b600260015403620022d85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001a98565b6002600155565b6000620022f0600482848662003a15565b620022fb9162003a41565b9050632afa533160e01b6001600160e01b03198216016200249c5760008080808080806200232d896004818d62003a15565b8101906200233c919062003a72565b9650965096509650965096509650336001600160a01b0316876001600160a01b0316146200237d5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0386163014620023a75760405163750643af60e01b815260040160405180910390fd5b8a8514620023c8576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e169162002448919062003646565b6000604051808303816000865af19150503d806000811462002487576040519150601f19603f3d011682016040523d82523d6000602084013e6200248c565b606091505b505050505050505050506200075c565b6001600160e01b031981166323f2ebc360e21b14620024ce57604051637141605d60e11b815260040160405180910390fd5b600080808080808080620024e68a6004818e62003a15565b810190620024f5919062003acd565b97509750975097509750975097509750336001600160a01b0316886001600160a01b031614620025385760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0387163014620025625760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f1691620025eb919062003646565b6000604051808303816000865af19150503d80600081146200262a576040519150601f19603f3d011682016040523d82523d6000602084013e6200262f565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052620020ae9085906323b872dd60e01b9060840162002247565b8060016200268c6020600262003c56565b62002698919062003789565b60535410620026ba576040516377ae67b360e11b815260040160405180910390fd5b6000605360008154620026cd9062003561565b9182905550905060005b602081101562002769578082901c6001166001036200270f57826033826020811062002707576200270762003535565b015550505050565b6033816020811062002725576200272562003535565b015460408051602081019290925281018490526060016040516020818303038152906040528051906020012092508080620027609062003561565b915050620026d7565b506200227f62003c64565b60018055565b60685460ff166200279e57604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600054610100900460ff16620027fd5760405162461bcd60e51b815260040162001a989062003c7a565b620006be62002b39565b606060408251106200282957818060200190518101906200070d919062003cc5565b81516020036200297d5760005b60208110801562002869575082818151811062002857576200285762003535565b01602001516001600160f81b03191615155b156200288457806200287b8162003561565b91505062002836565b80600003620028bd5750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b6000816001600160401b03811115620028da57620028da62002fea565b6040519080825280601f01601f19166020018201604052801562002905576020820181803683370190505b50905060005b82811015620029755784818151811062002929576200292962003535565b602001015160f81c60f81b82828151811062002949576200294962003535565b60200101906001600160f81b031916908160001a905350806200296c8162003561565b9150506200290b565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b606854600090610100900463ffffffff16158015620029d5575063ffffffff82166001145b15620029e9575063ffffffff821662002a14565b620029ff600160201b63ffffffff841662003606565b62002a119063ffffffff851662003620565b90505b600881901c60008181526069602052604081208054600160ff861690811b918218928390559290919081831690036200170657604051630c8d9eab60e31b815260040160405180910390fd5b600062002ab7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031662002b639092919063ffffffff16565b8051909150156200227f578080602001905181019062002ad8919062003d44565b6200227f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162001a98565b600054610100900460ff16620027745760405162461bcd60e51b815260040162001a989062003c7a565b606062000995848460008585600080866001600160a01b0316858760405162002b8d919062003646565b60006040518083038185875af1925050503d806000811462002bcc576040519150601f19603f3d011682016040523d82523d6000602084013e62002bd1565b606091505b509150915062002be48783838762002bef565b979650505050505050565b6060831562002c6357825160000362002c5b576001600160a01b0385163b62002c5b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001a98565b508162000995565b62000995838381511562002c7a5781518083602001fd5b8060405162461bcd60e51b815260040162001a98919062002e53565b61159c8062003d6583390190565b803563ffffffff81168114620029ab57600080fd5b6001600160a01b038116811462002ccf57600080fd5b50565b6000806040838503121562002ce657600080fd5b62002cf18362002ca4565b9150602083013562002d038162002cb9565b809150509250929050565b6001600160a01b0391909116815260200190565b801515811462002ccf57600080fd5b60008083601f84011262002d4457600080fd5b5081356001600160401b0381111562002d5c57600080fd5b60208301915083602082850101111562002d7557600080fd5b9250929050565b60008060008060006080868803121562002d9557600080fd5b62002da08662002ca4565b9450602086013562002db28162002cb9565b9350604086013562002dc48162002d22565b925060608601356001600160401b0381111562002de057600080fd5b62002dee8882890162002d31565b969995985093965092949392505050565b60005b8381101562002e1c57818101518382015260200162002e02565b50506000910152565b6000815180845262002e3f81602086016020860162002dff565b601f01601f19169290920160200192915050565b60208152600062002e68602083018462002e25565b9392505050565b60006020828403121562002e8257600080fd5b813562002e688162002cb9565b60ff8116811462002ccf57600080fd5b600080600080600080600060e0888a03121562002ebb57600080fd5b873562002ec88162002e8f565b965062002ed86020890162002ca4565b9550604088013562002eea8162002cb9565b945062002efa6060890162002ca4565b9350608088013562002f0c8162002cb9565b9699959850939692959460a0840135945060c09093013592915050565b60008060006060848603121562002f3f57600080fd5b62002f4a8462002ca4565b9250602084013562002f5c8162002cb9565b9150604084013562002f6e8162002cb9565b809150509250925092565b60006020828403121562002f8c57600080fd5b5035919050565b8061040081018310156200070d57600080fd5b6000806000610440848603121562002fbd57600080fd5b8335925062002fd0856020860162002f93565b915062002fe1610420850162002ca4565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156200302b576200302b62002fea565b604052919050565b60006001600160401b038211156200304f576200304f62002fea565b50601f01601f191660200190565b6000620030746200306e8462003033565b62003000565b90508281528383830111156200308957600080fd5b828260208301376000602084830101529392505050565b600082601f830112620030b257600080fd5b62002e68838335602085016200305d565b600080600080600060a08688031215620030dc57600080fd5b620030e78662002ca4565b94506020860135620030f98162002cb9565b935060408601356001600160401b03808211156200311657600080fd5b6200312489838a01620030a0565b945060608801359150808211156200313b57600080fd5b506200314a88828901620030a0565b92505060808601356200315d8162002e8f565b809150509295509295909350565b60008060008060008060a087890312156200318557600080fd5b620031908762002ca4565b95506020870135620031a28162002cb9565b9450604087013593506060870135620031bb8162002d22565b925060808701356001600160401b03811115620031d757600080fd5b620031e589828a0162002d31565b979a9699509497509295939492505050565b600080604083850312156200320b57600080fd5b620032168362002ca4565b9150620032266020840162002ca4565b90509250929050565b6000806000806000806000806000806000806109208d8f0312156200325357600080fd5b6200325f8e8e62002f93565b9b50620032718e6104008f0162002f93565b9a506108008d013599506108208d013598506108408d013597506200329a6108608e0162002ca4565b9650620032ac6108808e013562002cb9565b6108808d01359550620032c36108a08e0162002ca4565b9450620032d56108c08e013562002cb9565b6108c08d013593506108e08d013592506001600160401b036109008e01351115620032ff57600080fd5b620033128e6109008f01358f0162002d31565b81935080925050509295989b509295989b509295989b565b600080600080600080600060c0888a0312156200334657600080fd5b620033518862002ca4565b96506020880135620033638162002cb9565b95506040880135945060608801356200337c8162002cb9565b935060808801356200338e8162002d22565b925060a08801356001600160401b03811115620033aa57600080fd5b620033b88a828b0162002d31565b989b979a50959850939692959293505050565b60008060008060008060c08789031215620033e557600080fd5b620033f08762002ca4565b95506020870135620034028162002cb9565b9450620034126040880162002ca4565b93506060870135620034248162002cb9565b92506080870135620034368162002cb9565b915060a08701356001600160401b038111156200345257600080fd5b8701601f810189136200346457600080fd5b62003475898235602084016200305d565b9150509295509295509295565b60008060008061046085870312156200349a57600080fd5b84359350620034ad866020870162002f93565b9250620034be610420860162002ca4565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b600181811c908216806200350e57607f821691505b6020821081036200352f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016200357657620035766200354b565b5060010190565b60608152600062003592606083018662002e25565b8281036020840152620035a6818662002e25565b91505060ff83166040830152949350505050565b60008351620035ce81846020880162002dff565b835190830190620035e481836020880162002dff565b01949350505050565b6001600160a01b03929092168252602082015260400190565b80820281158282048414176200070d576200070d6200354b565b808201808211156200070d576200070d6200354b565b8183823760009101908152919050565b600082516200365a81846020870162002dff565b9190910192915050565b6000806000606084860312156200367a57600080fd5b83356001600160401b03808211156200369257600080fd5b620036a087838801620030a0565b94506020860135915080821115620036b757600080fd5b50620036c686828701620030a0565b925050604084013562002f6e8162002e8f565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b63ffffffff861681526001600160a01b0385811660208301528416604082015260806060820181905260009062002be49083018486620036d9565b94855263ffffffff9390931660208501526001600160a01b039182166040850152166060830152608082015260a00190565b6000602082840312156200378257600080fd5b5051919050565b818103818111156200070d576200070d6200354b565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c08301819052600091620037f38483018762002e25565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff841660208201526060604082018190526000906200383f9083018486620036d9565b9695505050505050565b601f8211156200227f57600081815260208120601f850160051c81016020861015620038725750805b601f850160051c820191505b8181101562000c58578281556001016200387e565b81516001600160401b03811115620038af57620038af62002fea565b620038c781620038c08454620034f9565b8462003849565b602080601f831160018114620038ff5760008415620038e65750858301515b600019600386901b1c1916600185901b17855562000c58565b600085815260208120601f198616915b8281101562003930578886015182559484019460019091019084016200390f565b50858210156200394f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c08301819052600091620039b48483018789620036d9565b925080851660e085015250509a9950505050505050505050565b600060208284031215620039e157600080fd5b815162002e688162002e8f565b63ffffffff81811683821601908082111562003a0e5762003a0e6200354b565b5092915050565b6000808585111562003a2657600080fd5b8386111562003a3457600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101562003a6a5780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a03121562003a8e57600080fd5b873562003a9b8162002cb9565b9650602088013562003aad8162002cb9565b95506040880135945060608801359350608088013562002f0c8162002e8f565b600080600080600080600080610100898b03121562003aeb57600080fd5b883562003af88162002cb9565b9750602089013562003b0a8162002cb9565b96506040890135955060608901359450608089013562003b2a8162002d22565b935060a089013562003b3c8162002e8f565b979a969950949793969295929450505060c08201359160e0013590565b600181815b8085111562003b9a57816000190482111562003b7e5762003b7e6200354b565b8085161562003b8c57918102915b93841c939080029062003b5e565b509250929050565b60008262003bb3575060016200070d565b8162003bc2575060006200070d565b816001811462003bdb576002811462003be65762003c06565b60019150506200070d565b60ff84111562003bfa5762003bfa6200354b565b50506001821b6200070d565b5060208310610133831016604e8410600b841016171562003c2b575081810a6200070d565b62003c37838362003b59565b806000190482111562003c4e5762003c4e6200354b565b029392505050565b600062002e68838362003ba2565b634e487b7160e01b600052600160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60006020828403121562003cd857600080fd5b81516001600160401b0381111562003cef57600080fd5b8201601f8101841362003d0157600080fd5b805162003d126200306e8262003033565b81815285602083850101111562003d2857600080fd5b62003d3b82602083016020860162002dff565b95945050505050565b60006020828403121562003d5757600080fd5b815162002e688162002d2256fe6101006040523480156200001257600080fd5b506040516200159c3803806200159c83398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516110e0620004bc60003960006101f70152600081816102ba015281816104e0015261054e0152600061049101526000818161031f015261045b01526110e06000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063a457c2d71161007c578063a457c2d7146102f4578063a9059cbb14610307578063cd0d00961461031a578063d505accf14610341578063dd62ed3e14610354578063ffa1ad741461036757600080fd5b806370a08231146102515780637ecebe001461027a57806395d89b411461029a5780639dc29fac146102a2578063a3c573eb146102b557600080fd5b806330adf81f116100ff57806330adf81f146101c9578063313ce567146101f05780633644e51514610221578063395093511461022957806340c10f191461023c57600080fd5b806306fdde031461013c578063095ea7b31461015a57806318160ddd1461017d57806320606b701461018f57806323b872dd146101b6575b600080fd5b610144610387565b6040516101519190610e26565b60405180910390f35b61016d610168366004610e90565b610419565b6040519015158152602001610151565b6002545b604051908152602001610151565b6101817f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b61016d6101c4366004610eba565b610433565b6101817f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610151565b610181610457565b61016d610237366004610e90565b6104b3565b61024f61024a366004610e90565b6104d5565b005b61018161025f366004610ef6565b6001600160a01b031660009081526020819052604090205490565b610181610288366004610ef6565b60056020526000908152604090205481565b610144610534565b61024f6102b0366004610e90565b610543565b6102dc7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610151565b61016d610302366004610e90565b610595565b61016d610315366004610e90565b610610565b6101817f000000000000000000000000000000000000000000000000000000000000000081565b61024f61034f366004610f18565b61061e565b610181610362366004610f8b565b610859565b610144604051806040016040528060018152602001603160f81b81525081565b60606003805461039690610fbe565b80601f01602080910402602001604051908101604052809291908181526020018280546103c290610fbe565b801561040f5780601f106103e45761010080835404028352916020019161040f565b820191906000526020600020905b8154815290600101906020018083116103f257829003601f168201915b5050505050905090565b600033610427818585610884565b60019150505b92915050565b6000336104418582856109a9565b61044c858585610a23565b506001949350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461461048e5761048946610bb5565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000336104278185856104c68383610859565b6104d0919061100e565b610884565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105265760405162461bcd60e51b815260040161051d90611021565b60405180910390fd5b6105308282610c61565b5050565b60606004805461039690610fbe565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461058b5760405162461bcd60e51b815260040161051d90611021565b6105308282610d0e565b600033816105a38286610859565b9050838110156106035760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161051d565b61044c8286868403610884565b600033610427818585610a23565b8342111561067a5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b606482015260840161051d565b6001600160a01b038716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866106c783611071565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610725610457565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156107b0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906107e65750896001600160a01b0316816001600160a01b0316145b6108425760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b606482015260840161051d565b61084d8a8a8a610884565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166108e65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161051d565b6001600160a01b0382166109475760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161051d565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006109b58484610859565b90506000198114610a1d5781811015610a105760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161051d565b610a1d8484848403610884565b50505050565b6001600160a01b038316610a875760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161051d565b6001600160a01b038216610ae95760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161051d565b6001600160a01b03831660009081526020819052604090205481811015610b615760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161051d565b6001600160a01b038481166000818152602081815260408083208787039055938716808352918490208054870190559251858152909260008051602061108b833981519152910160405180910390a3610a1d565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610be0610387565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610cb75760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161051d565b8060026000828254610cc9919061100e565b90915550506001600160a01b0382166000818152602081815260408083208054860190555184815260008051602061108b833981519152910160405180910390a35050565b6001600160a01b038216610d6e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161051d565b6001600160a01b03821660009081526020819052604090205481811015610de25760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161051d565b6001600160a01b03831660008181526020818152604080832086860390556002805487900390555185815291929160008051602061108b833981519152910161099c565b600060208083528351808285015260005b81811015610e5357858101830151858201604001528201610e37565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610e8b57600080fd5b919050565b60008060408385031215610ea357600080fd5b610eac83610e74565b946020939093013593505050565b600080600060608486031215610ecf57600080fd5b610ed884610e74565b9250610ee660208501610e74565b9150604084013590509250925092565b600060208284031215610f0857600080fd5b610f1182610e74565b9392505050565b600080600080600080600060e0888a031215610f3357600080fd5b610f3c88610e74565b9650610f4a60208901610e74565b95506040880135945060608801359350608088013560ff81168114610f6e57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f9e57600080fd5b610fa783610e74565b9150610fb560208401610e74565b90509250929050565b600181811c90821680610fd257607f821691505b602082108103610ff257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561042d5761042d610ff8565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b60006001820161108357611083610ff8565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122041a613df402940120c0c7421c7d02599c9a28987dd403c01cd013411ae6d388964736f6c63430008140033a2646970667358221220057cd6dd4071fe6d2141a3112622ff43f32081877651a41339de10801839d29064736f6c63430008140033", + "bytecode": "0x608060405234801561001057600080fd5b50615380806100206000396000f3fe608060405260043610620001bb5760003560e01c806383f2440311620000f5578063ccaa2d111162000090578063ccaa2d11146200056b578063cd5865791462000590578063d02103ca14620005a7578063dbc1697614620005d0578063ee25560b14620005e8578063f5efcd791462000619578063f811bff7146200063e578063fb570834146200066357600080fd5b806383f2440314620004465780638ed7e3f2146200046b578063aaa13cc2146200048d578063b8b284d014620004b2578063bab161bf14620004d7578063be5831c714620004fb578063c00f14ab1462000521578063cc461632146200054657600080fd5b80633c351e1011620001665780633c351e1014620003125780633cbc795b14620003345780633e19704314620003705780634b2f336d14620003955780635ca1e16514620003b75780637843298b14620003cf57806379e2cf9714620003f457806381b1c174146200040c57600080fd5b806315064c9614620001c05780632072f6c514620001f157806322e95f2c146200020b578063240ff378146200023f57806327aef4e814620002565780632dfdf0b5146200027d578063318aee3d14620002a4575b600080fd5b348015620001cd57600080fd5b50606854620001dc9060ff1681565b60405190151581526020015b60405180910390f35b348015620001fe57600080fd5b506200020962000688565b005b3480156200021857600080fd5b50620002306200022a36600462002d1c565b620006c0565b604051620001e8919062002d58565b620002096200025036600462002dc6565b62000713565b3480156200026357600080fd5b506200026e62000788565b604051620001e8919062002e9d565b3480156200028a57600080fd5b506200029560535481565b604051908152602001620001e8565b348015620002b157600080fd5b50620002ed620002c336600462002eb9565b606b6020526000908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201620001e8565b3480156200031f57600080fd5b50606d5462000230906001600160a01b031681565b3480156200034157600080fd5b50606d546200035a90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001620001e8565b3480156200037d57600080fd5b50620002956200038f36600462002ee9565b6200081e565b348015620003a257600080fd5b50606f5462000230906001600160a01b031681565b348015620003c457600080fd5b5062000295620008ab565b348015620003dc57600080fd5b5062000230620003ee36600462002f73565b62000991565b3480156200040157600080fd5b5062000209620009c2565b3480156200041957600080fd5b50620002306200042b36600462002fc3565b606a602052600090815260409020546001600160a01b031681565b3480156200045357600080fd5b50620002956200046536600462002ff0565b620009e6565b3480156200047857600080fd5b50606c5462000230906001600160a01b031681565b3480156200049a57600080fd5b5062000230620004ac3660046200310d565b62000aca565b348015620004bf57600080fd5b5062000209620004d1366004620031b5565b62000bdb565b348015620004e457600080fd5b506068546200035a90610100900463ffffffff1681565b3480156200050857600080fd5b506068546200035a90600160c81b900463ffffffff1681565b3480156200052e57600080fd5b506200026e6200054036600462002eb9565b62000caa565b3480156200055357600080fd5b50620001dc6200056536600462003241565b62000cf7565b3480156200057857600080fd5b50620002096200058a36600462003279565b62000d87565b62000209620005a136600462003374565b620012c6565b348015620005b457600080fd5b506068546200023090600160281b90046001600160a01b031681565b348015620005dd57600080fd5b506200020962001759565b348015620005f557600080fd5b50620002956200060736600462002fc3565b60696020526000908152604090205481565b3480156200062657600080fd5b50620002096200063836600462003279565b6200178f565b3480156200064b57600080fd5b50620002096200065d36600462003415565b62001a45565b3480156200067057600080fd5b50620001dc62000682366004620034cc565b62001ccf565b606c546001600160a01b03163314620006b457604051631736745960e31b815260040160405180910390fd5b620006be62001ce9565b565b6000606a60008484604051602001620006db92919062003519565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b60685460ff16156200073857604051630bc011ff60e21b815260040160405180910390fd5b3415801590620007525750606f546001600160a01b031615155b1562000771576040516301bd897160e61b815260040160405180910390fd5b6200078185853486868662001d46565b5050505050565b606e8054620007979062003543565b80601f0160208091040260200160405190810160405280929190818152602001828054620007c59062003543565b8015620008165780601f10620007ea5761010080835404028352916020019162000816565b820191906000526020600020905b815481529060010190602001808311620007f857829003601f168201915b505050505081565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b605354600090819081805b602081101562000988578083901c600116600103620009195760338160208110620008e557620008e56200357f565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062000946565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806200097f90620035ab565b915050620008b6565b50919392505050565b6000620009ba8484620009a48562001e1a565b620009af8662001ee1565b620004ac8762001f9f565b949350505050565b605354606854600160c81b900463ffffffff161015620006be57620006be62002060565b600083815b602081101562000ac157600163ffffffff8516821c8116900362000a5d5784816020811062000a1e5762000a1e6200357f565b60200201358260405160200162000a3f929190918252602082015260400190565b60405160208183030381529060405280519060200120915062000aac565b8185826020811062000a735762000a736200357f565b602002013560405160200162000a93929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062000ab881620035ab565b915050620009eb565b50949350505050565b600080868660405160200162000ae292919062003519565b604051602081830303815290604052805190602001209050600060ff60f81b30836040518060200162000b159062002ce0565b601f1982820381018352601f90910116604081905262000b3e908b908b908b90602001620035c7565b60408051601f198184030181529082905262000b5e929160200162003604565b6040516020818303038152906040528051906020012060405160200162000bb794939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff161562000c0057604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b031662000c2a5760405163dde3cda760e01b815260040160405180910390fd5b606f54604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac9062000c5e903390889060040162003637565b600060405180830381600087803b15801562000c7957600080fd5b505af115801562000c8e573d6000803e3d6000fd5b5050505062000ca286868686868662001d46565b505050505050565b606062000cb78262001e1a565b62000cc28362001ee1565b62000ccd8462001f9f565b60405160200162000ce193929190620035c7565b6040516020818303038152906040529050919050565b6068546000908190610100900463ffffffff1615801562000d1e575063ffffffff83166001145b1562000d32575063ffffffff831662000d5d565b62000d48600160201b63ffffffff851662003650565b62000d5a9063ffffffff86166200366a565b90505b600881901c600090815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000dac57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161462000ddd576040516302caf51760e11b815260040160405180910390fd5b62000e178c8c8c8c8c62000e1160008e8e8e8e8e8e8e60405162000e0392919062003680565b60405180910390206200081e565b620020fe565b6001600160a01b03861662000f5d57606f546001600160a01b031662000eef5760006001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000e71576020820181803683370190505b5060405162000e81919062003690565b60006040518083038185875af1925050503d806000811462000ec0576040519150601f19603f3d011682016040523d82523d6000602084013e62000ec5565b606091505b505090508062000ee857604051630ce8f45160e31b815260040160405180910390fd5b5062001277565b606f546040516340c10f1960e01b81526001600160a01b03909116906340c10f199062000f23908790879060040162003637565b600060405180830381600087803b15801562000f3e57600080fd5b505af115801562000f53573d6000803e3d6000fd5b5050505062001277565b606d546001600160a01b03878116911614801562000f8c5750606d5463ffffffff888116600160a01b90920416145b1562000fa65760006001600160a01b038516848262000e46565b60685463ffffffff61010090910481169088160362000fdb5762000fd56001600160a01b03871685856200226f565b62001277565b6000878760405160200162000ff292919062003519565b60408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b0316806200120f57600080806200103b86880188620036ae565b925092509250600085848484604051620010559062002ce0565b6200106393929190620035c7565b8190604051809103906000f590508015801562001084573d6000803e3d6000fd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f1990620010b8908d908d9060040162003637565b600060405180830381600087803b158015620010d357600080fd5b505af1158015620010e8573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b604051620011fd9594939291906200374c565b60405180910390a15050505062001274565b6040516340c10f1960e01b81526001600160a01b038216906340c10f19906200123f908990899060040162003637565b600060405180830381600087803b1580156200125a57600080fd5b505af11580156200126f573d6000803e3d6000fd5b505050505b50505b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8a88888787604051620012b095949392919062003787565b60405180910390a1505050505050505050505050565b60685460ff1615620012eb57604051630bc011ff60e21b815260040160405180910390fd5b620012f5620022ce565b60685463ffffffff61010090910481169088160362001327576040516302caf51760e11b815260040160405180910390fd5b6000806060876001600160a01b03881662001418578834146200135d5760405163b89240f560e01b815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff169450906200138c9062003543565b80601f0160208091040260200160405190810160405280929190818152602001828054620013ba9062003543565b80156200140b5780601f10620013df576101008083540402835291602001916200140b565b820191906000526020600020905b815481529060010190602001808311620013ed57829003601f168201915b50505050509150620016c4565b3415620014385760405163798ee6f160e01b815260040160405180910390fd5b606f546001600160a01b0390811690891603620014b957604051632770a7eb60e21b81526001600160a01b03891690639dc29fac906200147f9033908d9060040162003637565b600060405180830381600087803b1580156200149a57600080fd5b505af1158015620014af573d6000803e3d6000fd5b50505050620016c4565b6001600160a01b038089166000908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b900490921691810182905290156200157757604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac906200152f9033908e9060040162003637565b600060405180830381600087803b1580156200154a57600080fd5b505af11580156200155f573d6000803e3d6000fd5b505050508060200151945080600001519350620016b5565b85156200158c576200158c898b898962002329565b6040516370a0823160e01b81526000906001600160a01b038b16906370a0823190620015bd90309060040162002d58565b602060405180830381865afa158015620015db573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620016019190620037b9565b90506200161a6001600160a01b038b1633308e6200268b565b6040516370a0823160e01b81526000906001600160a01b038c16906370a08231906200164b90309060040162002d58565b602060405180830381865afa15801562001669573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200168f9190620037b9565b90506200169d8282620037d3565b6068548c9850610100900463ffffffff169650935050505b620016c08962000caa565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e868860535460405162001706989796959493929190620037e9565b60405180910390a1620017316200172b600085878f8f8789805190602001206200081e565b620026c5565b861562001742576200174262002060565b505050506200175060018055565b50505050505050565b606c546001600160a01b031633146200178557604051631736745960e31b815260040160405180910390fd5b620006be620027c4565b60685460ff1615620017b457604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614620017e5576040516302caf51760e11b815260040160405180910390fd5b6200180b8c8c8c8c8c62000e1160018e8e8e8e8e8e8e60405162000e0392919062003680565b606f546000906001600160a01b0316620018ca57846001600160a01b031684888a868660405160240162001843949392919062003856565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b179052516200187a919062003690565b60006040518083038185875af1925050503d8060008114620018b9576040519150601f19603f3d011682016040523d82523d6000602084013e620018be565b606091505b505080915050620019d6565b606f546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990620018fe908890889060040162003637565b600060405180830381600087803b1580156200191957600080fd5b505af11580156200192e573d6000803e3d6000fd5b50505050846001600160a01b03168789858560405160240162001955949392919062003856565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b179052516200198c919062003690565b6000604051808303816000865af19150503d8060008114620019cb576040519150601f19603f3d011682016040523d82523d6000602084013e620019d0565b606091505b50909150505b80620019f5576040516337e391c360e01b815260040160405180910390fd5b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8b8989888860405162001a2e95949392919062003787565b60405180910390a150505050505050505050505050565b600054610100900460ff161580801562001a665750600054600160ff909116105b8062001a825750303b15801562001a82575060005460ff166001145b62001aeb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562001b0f576000805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff8a160265010000000000600160c81b03191617600160281b6001600160a01b038781169190910291909117909155606c80546001600160a01b031916858316179055861662001b9b5763ffffffff85161562001b9557604051630d43a60960e11b815260040160405180910390fd5b62001c76565b606d805463ffffffff8716600160a01b026001600160c01b03199091166001600160a01b03891617179055606e62001bd48382620038dd565b506000801b601260405162001be99062002ce0565b6060808252600d908201526c2bb930b83832b21022ba3432b960991b608082015260a060208201819052600490820152630ae8aa8960e31b60c082015260ff909116604082015260e0018190604051809103906000f590508015801562001c54573d6000803e3d6000fd5b50606f80546001600160a01b0319166001600160a01b03929092169190911790555b62001c806200281d565b801562001750576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b60008162001cdf868686620009e6565b1495945050505050565b60685460ff161562001d0e57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b60685463ffffffff61010090910481169087160362001d78576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff1633898989888860535460405162001dce99989796959493929190620039a9565b60405180910390a162001e096200172b6001606860019054906101000a900463ffffffff16338a8a8a898960405162000e0392919062003680565b821562000ca25762000ca262002060565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009182916001600160a01b0386169162001e63919062003690565b600060405180830381855afa9150503d806000811462001ea0576040519150601f19603f3d011682016040523d82523d6000602084013e62001ea5565b606091505b50915091508162001ed657604051806040016040528060078152602001664e4f5f4e414d4560c81b815250620009ba565b620009ba8162002851565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009182916001600160a01b0386169162001f2a919062003690565b600060405180830381855afa9150503d806000811462001f67576040519150601f19603f3d011682016040523d82523d6000602084013e62001f6c565b606091505b50915091508162001ed657604051806040016040528060098152602001681393d7d4d6535093d360ba1b815250620009ba565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b0386169162001fe7919062003690565b600060405180830381855afa9150503d806000811462002024576040519150601f19603f3d011682016040523d82523d6000602084013e62002029565b606091505b50915091508180156200203d575080516020145b6200204a576012620009ba565b80806020019051810190620009ba919062003a18565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d620020a9620008ab565b6040518263ffffffff1660e01b8152600401620020c891815260200190565b600060405180830381600087803b158015620020e357600080fd5b505af1158015620020f8573d6000803e3d6000fd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101206312bd9b1960e11b9092526064810191909152600091600160281b90046001600160a01b03169063257b3632906084016020604051808303816000875af115801562002179573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200219f9190620037b9565b905080600003620021c257604051622f6fad60e01b815260040160405180910390fd5b600080600160401b8716156200220757869150620021e3848a848962001ccf565b62002201576040516338105f3b60e21b815260040160405180910390fd5b62002258565b602087901c6200221981600162003a38565b9150879250620022386200222f868c86620009e6565b8a838962001ccf565b62002256576040516338105f3b60e21b815260040160405180910390fd5b505b620022648282620029fa565b505050505050505050565b620022c98363a9059cbb60e01b84846040516024016200229192919062003637565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262002aaa565b505050565b600260015403620023225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001ae2565b6002600155565b60006200233a600482848662003a5f565b620023459162003a8b565b9050632afa533160e01b6001600160e01b0319821601620024e657600080808080808062002377896004818d62003a5f565b81019062002386919062003abc565b9650965096509650965096509650336001600160a01b0316876001600160a01b031614620023c75760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0386163014620023f15760405163750643af60e01b815260040160405180910390fd5b8a851462002412576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e169162002492919062003690565b6000604051808303816000865af19150503d8060008114620024d1576040519150601f19603f3d011682016040523d82523d6000602084013e620024d6565b606091505b5050505050505050505062000781565b6001600160e01b031981166323f2ebc360e21b146200251857604051637141605d60e11b815260040160405180910390fd5b600080808080808080620025308a6004818e62003a5f565b8101906200253f919062003b17565b97509750975097509750975097509750336001600160a01b0316886001600160a01b031614620025825760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0387163014620025ac5760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169162002635919062003690565b6000604051808303816000865af19150503d806000811462002674576040519150601f19603f3d011682016040523d82523d6000602084013e62002679565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052620020f89085906323b872dd60e01b9060840162002291565b806001620026d66020600262003ca0565b620026e29190620037d3565b6053541062002704576040516377ae67b360e11b815260040160405180910390fd5b60006053600081546200271790620035ab565b9182905550905060005b6020811015620027b3578082901c600116600103620027595782603382602081106200275157620027516200357f565b015550505050565b603381602081106200276f576200276f6200357f565b015460408051602081019290925281018490526060016040516020818303038152906040528051906020012092508080620027aa90620035ab565b91505062002721565b50620022c962003cae565b60018055565b60685460ff16620027e857604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600054610100900460ff16620028475760405162461bcd60e51b815260040162001ae29062003cc4565b620006be62002b83565b606060408251106200287357818060200190518101906200070d919062003d0f565b8151602003620029c75760005b602081108015620028b35750828181518110620028a157620028a16200357f565b01602001516001600160f81b03191615155b15620028ce5780620028c581620035ab565b91505062002880565b80600003620029075750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b6000816001600160401b0381111562002924576200292462003034565b6040519080825280601f01601f1916602001820160405280156200294f576020820181803683370190505b50905060005b82811015620029bf578481815181106200297357620029736200357f565b602001015160f81c60f81b8282815181106200299357620029936200357f565b60200101906001600160f81b031916908160001a90535080620029b681620035ab565b91505062002955565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b606854600090610100900463ffffffff1615801562002a1f575063ffffffff82166001145b1562002a33575063ffffffff821662002a5e565b62002a49600160201b63ffffffff841662003650565b62002a5b9063ffffffff85166200366a565b90505b600881901c60008181526069602052604081208054600160ff861690811b918218928390559290919081831690036200175057604051630c8d9eab60e31b815260040160405180910390fd5b600062002b01826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031662002bad9092919063ffffffff16565b805190915015620022c9578080602001905181019062002b22919062003d8e565b620022c95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162001ae2565b600054610100900460ff16620027be5760405162461bcd60e51b815260040162001ae29062003cc4565b6060620009ba848460008585600080866001600160a01b0316858760405162002bd7919062003690565b60006040518083038185875af1925050503d806000811462002c16576040519150601f19603f3d011682016040523d82523d6000602084013e62002c1b565b606091505b509150915062002c2e8783838762002c39565b979650505050505050565b6060831562002cad57825160000362002ca5576001600160a01b0385163b62002ca55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001ae2565b5081620009ba565b620009ba838381511562002cc45781518083602001fd5b8060405162461bcd60e51b815260040162001ae2919062002e9d565b61159c8062003daf83390190565b803563ffffffff81168114620029f557600080fd5b6001600160a01b038116811462002d1957600080fd5b50565b6000806040838503121562002d3057600080fd5b62002d3b8362002cee565b9150602083013562002d4d8162002d03565b809150509250929050565b6001600160a01b0391909116815260200190565b801515811462002d1957600080fd5b60008083601f84011262002d8e57600080fd5b5081356001600160401b0381111562002da657600080fd5b60208301915083602082850101111562002dbf57600080fd5b9250929050565b60008060008060006080868803121562002ddf57600080fd5b62002dea8662002cee565b9450602086013562002dfc8162002d03565b9350604086013562002e0e8162002d6c565b925060608601356001600160401b0381111562002e2a57600080fd5b62002e388882890162002d7b565b969995985093965092949392505050565b60005b8381101562002e6657818101518382015260200162002e4c565b50506000910152565b6000815180845262002e8981602086016020860162002e49565b601f01601f19169290920160200192915050565b60208152600062002eb2602083018462002e6f565b9392505050565b60006020828403121562002ecc57600080fd5b813562002eb28162002d03565b60ff8116811462002d1957600080fd5b600080600080600080600060e0888a03121562002f0557600080fd5b873562002f128162002ed9565b965062002f226020890162002cee565b9550604088013562002f348162002d03565b945062002f446060890162002cee565b9350608088013562002f568162002d03565b9699959850939692959460a0840135945060c09093013592915050565b60008060006060848603121562002f8957600080fd5b62002f948462002cee565b9250602084013562002fa68162002d03565b9150604084013562002fb88162002d03565b809150509250925092565b60006020828403121562002fd657600080fd5b5035919050565b8061040081018310156200070d57600080fd5b600080600061044084860312156200300757600080fd5b833592506200301a856020860162002fdd565b91506200302b610420850162002cee565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562003075576200307562003034565b604052919050565b60006001600160401b0382111562003099576200309962003034565b50601f01601f191660200190565b6000620030be620030b8846200307d565b6200304a565b9050828152838383011115620030d357600080fd5b828260208301376000602084830101529392505050565b600082601f830112620030fc57600080fd5b62002eb283833560208501620030a7565b600080600080600060a086880312156200312657600080fd5b620031318662002cee565b94506020860135620031438162002d03565b935060408601356001600160401b03808211156200316057600080fd5b6200316e89838a01620030ea565b945060608801359150808211156200318557600080fd5b506200319488828901620030ea565b9250506080860135620031a78162002ed9565b809150509295509295909350565b60008060008060008060a08789031215620031cf57600080fd5b620031da8762002cee565b95506020870135620031ec8162002d03565b9450604087013593506060870135620032058162002d6c565b925060808701356001600160401b038111156200322157600080fd5b6200322f89828a0162002d7b565b979a9699509497509295939492505050565b600080604083850312156200325557600080fd5b620032608362002cee565b9150620032706020840162002cee565b90509250929050565b6000806000806000806000806000806000806109208d8f0312156200329d57600080fd5b620032a98e8e62002fdd565b9b50620032bb8e6104008f0162002fdd565b9a506108008d013599506108208d013598506108408d01359750620032e46108608e0162002cee565b9650620032f66108808e013562002d03565b6108808d013595506200330d6108a08e0162002cee565b94506200331f6108c08e013562002d03565b6108c08d013593506108e08d013592506001600160401b036109008e013511156200334957600080fd5b6200335c8e6109008f01358f0162002d7b565b81935080925050509295989b509295989b509295989b565b600080600080600080600060c0888a0312156200339057600080fd5b6200339b8862002cee565b96506020880135620033ad8162002d03565b9550604088013594506060880135620033c68162002d03565b93506080880135620033d88162002d6c565b925060a08801356001600160401b03811115620033f457600080fd5b620034028a828b0162002d7b565b989b979a50959850939692959293505050565b60008060008060008060c087890312156200342f57600080fd5b6200343a8762002cee565b955060208701356200344c8162002d03565b94506200345c6040880162002cee565b935060608701356200346e8162002d03565b92506080870135620034808162002d03565b915060a08701356001600160401b038111156200349c57600080fd5b8701601f81018913620034ae57600080fd5b620034bf89823560208401620030a7565b9150509295509295509295565b6000806000806104608587031215620034e457600080fd5b84359350620034f7866020870162002fdd565b925062003508610420860162002cee565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b600181811c908216806200355857607f821691505b6020821081036200357957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201620035c057620035c062003595565b5060010190565b606081526000620035dc606083018662002e6f565b8281036020840152620035f0818662002e6f565b91505060ff83166040830152949350505050565b600083516200361881846020880162002e49565b8351908301906200362e81836020880162002e49565b01949350505050565b6001600160a01b03929092168252602082015260400190565b80820281158282048414176200070d576200070d62003595565b808201808211156200070d576200070d62003595565b8183823760009101908152919050565b60008251620036a481846020870162002e49565b9190910192915050565b600080600060608486031215620036c457600080fd5b83356001600160401b0380821115620036dc57600080fd5b620036ea87838801620030ea565b945060208601359150808211156200370157600080fd5b506200371086828701620030ea565b925050604084013562002fb88162002ed9565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b63ffffffff861681526001600160a01b0385811660208301528416604082015260806060820181905260009062002c2e908301848662003723565b94855263ffffffff9390931660208501526001600160a01b039182166040850152166060830152608082015260a00190565b600060208284031215620037cc57600080fd5b5051919050565b818103818111156200070d576200070d62003595565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c083018190526000916200383d8483018762002e6f565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff8416602082015260606040820181905260009062003889908301848662003723565b9695505050505050565b601f821115620022c957600081815260208120601f850160051c81016020861015620038bc5750805b601f850160051c820191505b8181101562000ca257828155600101620038c8565b81516001600160401b03811115620038f957620038f962003034565b62003911816200390a845462003543565b8462003893565b602080601f831160018114620039495760008415620039305750858301515b600019600386901b1c1916600185901b17855562000ca2565b600085815260208120601f198616915b828110156200397a5788860151825594840194600190910190840162003959565b5085821015620039995787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c08301819052600091620039fe848301878962003723565b925080851660e085015250509a9950505050505050505050565b60006020828403121562003a2b57600080fd5b815162002eb28162002ed9565b63ffffffff81811683821601908082111562003a585762003a5862003595565b5092915050565b6000808585111562003a7057600080fd5b8386111562003a7e57600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101562003ab45780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a03121562003ad857600080fd5b873562003ae58162002d03565b9650602088013562003af78162002d03565b95506040880135945060608801359350608088013562002f568162002ed9565b600080600080600080600080610100898b03121562003b3557600080fd5b883562003b428162002d03565b9750602089013562003b548162002d03565b96506040890135955060608901359450608089013562003b748162002d6c565b935060a089013562003b868162002ed9565b979a969950949793969295929450505060c08201359160e0013590565b600181815b8085111562003be457816000190482111562003bc85762003bc862003595565b8085161562003bd657918102915b93841c939080029062003ba8565b509250929050565b60008262003bfd575060016200070d565b8162003c0c575060006200070d565b816001811462003c25576002811462003c305762003c50565b60019150506200070d565b60ff84111562003c445762003c4462003595565b50506001821b6200070d565b5060208310610133831016604e8410600b841016171562003c75575081810a6200070d565b62003c81838362003ba3565b806000190482111562003c985762003c9862003595565b029392505050565b600062002eb2838362003bec565b634e487b7160e01b600052600160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60006020828403121562003d2257600080fd5b81516001600160401b0381111562003d3957600080fd5b8201601f8101841362003d4b57600080fd5b805162003d5c620030b8826200307d565b81815285602083850101111562003d7257600080fd5b62003d8582602083016020860162002e49565b95945050505050565b60006020828403121562003da157600080fd5b815162002eb28162002d6c56fe6101006040523480156200001257600080fd5b506040516200159c3803806200159c83398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516110e0620004bc60003960006101f70152600081816102ba015281816104e0015261054e0152600061049101526000818161031f015261045b01526110e06000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063a457c2d71161007c578063a457c2d7146102f4578063a9059cbb14610307578063cd0d00961461031a578063d505accf14610341578063dd62ed3e14610354578063ffa1ad741461036757600080fd5b806370a08231146102515780637ecebe001461027a57806395d89b411461029a5780639dc29fac146102a2578063a3c573eb146102b557600080fd5b806330adf81f116100ff57806330adf81f146101c9578063313ce567146101f05780633644e51514610221578063395093511461022957806340c10f191461023c57600080fd5b806306fdde031461013c578063095ea7b31461015a57806318160ddd1461017d57806320606b701461018f57806323b872dd146101b6575b600080fd5b610144610387565b6040516101519190610e26565b60405180910390f35b61016d610168366004610e90565b610419565b6040519015158152602001610151565b6002545b604051908152602001610151565b6101817f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b61016d6101c4366004610eba565b610433565b6101817f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610151565b610181610457565b61016d610237366004610e90565b6104b3565b61024f61024a366004610e90565b6104d5565b005b61018161025f366004610ef6565b6001600160a01b031660009081526020819052604090205490565b610181610288366004610ef6565b60056020526000908152604090205481565b610144610534565b61024f6102b0366004610e90565b610543565b6102dc7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610151565b61016d610302366004610e90565b610595565b61016d610315366004610e90565b610610565b6101817f000000000000000000000000000000000000000000000000000000000000000081565b61024f61034f366004610f18565b61061e565b610181610362366004610f8b565b610859565b610144604051806040016040528060018152602001603160f81b81525081565b60606003805461039690610fbe565b80601f01602080910402602001604051908101604052809291908181526020018280546103c290610fbe565b801561040f5780601f106103e45761010080835404028352916020019161040f565b820191906000526020600020905b8154815290600101906020018083116103f257829003601f168201915b5050505050905090565b600033610427818585610884565b60019150505b92915050565b6000336104418582856109a9565b61044c858585610a23565b506001949350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461461048e5761048946610bb5565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000336104278185856104c68383610859565b6104d0919061100e565b610884565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105265760405162461bcd60e51b815260040161051d90611021565b60405180910390fd5b6105308282610c61565b5050565b60606004805461039690610fbe565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461058b5760405162461bcd60e51b815260040161051d90611021565b6105308282610d0e565b600033816105a38286610859565b9050838110156106035760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161051d565b61044c8286868403610884565b600033610427818585610a23565b8342111561067a5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b606482015260840161051d565b6001600160a01b038716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866106c783611071565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610725610457565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156107b0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906107e65750896001600160a01b0316816001600160a01b0316145b6108425760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b606482015260840161051d565b61084d8a8a8a610884565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166108e65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161051d565b6001600160a01b0382166109475760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161051d565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006109b58484610859565b90506000198114610a1d5781811015610a105760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161051d565b610a1d8484848403610884565b50505050565b6001600160a01b038316610a875760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161051d565b6001600160a01b038216610ae95760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161051d565b6001600160a01b03831660009081526020819052604090205481811015610b615760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161051d565b6001600160a01b038481166000818152602081815260408083208787039055938716808352918490208054870190559251858152909260008051602061108b833981519152910160405180910390a3610a1d565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610be0610387565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610cb75760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161051d565b8060026000828254610cc9919061100e565b90915550506001600160a01b0382166000818152602081815260408083208054860190555184815260008051602061108b833981519152910160405180910390a35050565b6001600160a01b038216610d6e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161051d565b6001600160a01b03821660009081526020819052604090205481811015610de25760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161051d565b6001600160a01b03831660008181526020818152604080832086860390556002805487900390555185815291929160008051602061108b833981519152910161099c565b600060208083528351808285015260005b81811015610e5357858101830151858201604001528201610e37565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610e8b57600080fd5b919050565b60008060408385031215610ea357600080fd5b610eac83610e74565b946020939093013593505050565b600080600060608486031215610ecf57600080fd5b610ed884610e74565b9250610ee660208501610e74565b9150604084013590509250925092565b600060208284031215610f0857600080fd5b610f1182610e74565b9392505050565b600080600080600080600060e0888a031215610f3357600080fd5b610f3c88610e74565b9650610f4a60208901610e74565b95506040880135945060608801359350608088013560ff81168114610f6e57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f9e57600080fd5b610fa783610e74565b9150610fb560208401610e74565b90509250929050565b600181811c90821680610fd257607f821691505b602082108103610ff257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561042d5761042d610ff8565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b60006001820161108357611083610ff8565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122041a613df402940120c0c7421c7d02599c9a28987dd403c01cd013411ae6d388964736f6c63430008140033a26469706673582212203f4368970cd783f4e4a75720695da4a677b0e2b0336e4a7d19983860ade7c07564736f6c63430008140033", + "deployedBytecode": "0x608060405260043610620001bb5760003560e01c806383f2440311620000f5578063ccaa2d111162000090578063ccaa2d11146200056b578063cd5865791462000590578063d02103ca14620005a7578063dbc1697614620005d0578063ee25560b14620005e8578063f5efcd791462000619578063f811bff7146200063e578063fb570834146200066357600080fd5b806383f2440314620004465780638ed7e3f2146200046b578063aaa13cc2146200048d578063b8b284d014620004b2578063bab161bf14620004d7578063be5831c714620004fb578063c00f14ab1462000521578063cc461632146200054657600080fd5b80633c351e1011620001665780633c351e1014620003125780633cbc795b14620003345780633e19704314620003705780634b2f336d14620003955780635ca1e16514620003b75780637843298b14620003cf57806379e2cf9714620003f457806381b1c174146200040c57600080fd5b806315064c9614620001c05780632072f6c514620001f157806322e95f2c146200020b578063240ff378146200023f57806327aef4e814620002565780632dfdf0b5146200027d578063318aee3d14620002a4575b600080fd5b348015620001cd57600080fd5b50606854620001dc9060ff1681565b60405190151581526020015b60405180910390f35b348015620001fe57600080fd5b506200020962000688565b005b3480156200021857600080fd5b50620002306200022a36600462002d1c565b620006c0565b604051620001e8919062002d58565b620002096200025036600462002dc6565b62000713565b3480156200026357600080fd5b506200026e62000788565b604051620001e8919062002e9d565b3480156200028a57600080fd5b506200029560535481565b604051908152602001620001e8565b348015620002b157600080fd5b50620002ed620002c336600462002eb9565b606b6020526000908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201620001e8565b3480156200031f57600080fd5b50606d5462000230906001600160a01b031681565b3480156200034157600080fd5b50606d546200035a90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001620001e8565b3480156200037d57600080fd5b50620002956200038f36600462002ee9565b6200081e565b348015620003a257600080fd5b50606f5462000230906001600160a01b031681565b348015620003c457600080fd5b5062000295620008ab565b348015620003dc57600080fd5b5062000230620003ee36600462002f73565b62000991565b3480156200040157600080fd5b5062000209620009c2565b3480156200041957600080fd5b50620002306200042b36600462002fc3565b606a602052600090815260409020546001600160a01b031681565b3480156200045357600080fd5b50620002956200046536600462002ff0565b620009e6565b3480156200047857600080fd5b50606c5462000230906001600160a01b031681565b3480156200049a57600080fd5b5062000230620004ac3660046200310d565b62000aca565b348015620004bf57600080fd5b5062000209620004d1366004620031b5565b62000bdb565b348015620004e457600080fd5b506068546200035a90610100900463ffffffff1681565b3480156200050857600080fd5b506068546200035a90600160c81b900463ffffffff1681565b3480156200052e57600080fd5b506200026e6200054036600462002eb9565b62000caa565b3480156200055357600080fd5b50620001dc6200056536600462003241565b62000cf7565b3480156200057857600080fd5b50620002096200058a36600462003279565b62000d87565b62000209620005a136600462003374565b620012c6565b348015620005b457600080fd5b506068546200023090600160281b90046001600160a01b031681565b348015620005dd57600080fd5b506200020962001759565b348015620005f557600080fd5b50620002956200060736600462002fc3565b60696020526000908152604090205481565b3480156200062657600080fd5b50620002096200063836600462003279565b6200178f565b3480156200064b57600080fd5b50620002096200065d36600462003415565b62001a45565b3480156200067057600080fd5b50620001dc62000682366004620034cc565b62001ccf565b606c546001600160a01b03163314620006b457604051631736745960e31b815260040160405180910390fd5b620006be62001ce9565b565b6000606a60008484604051602001620006db92919062003519565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b60685460ff16156200073857604051630bc011ff60e21b815260040160405180910390fd5b3415801590620007525750606f546001600160a01b031615155b1562000771576040516301bd897160e61b815260040160405180910390fd5b6200078185853486868662001d46565b5050505050565b606e8054620007979062003543565b80601f0160208091040260200160405190810160405280929190818152602001828054620007c59062003543565b8015620008165780601f10620007ea5761010080835404028352916020019162000816565b820191906000526020600020905b815481529060010190602001808311620007f857829003601f168201915b505050505081565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b605354600090819081805b602081101562000988578083901c600116600103620009195760338160208110620008e557620008e56200357f565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062000946565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806200097f90620035ab565b915050620008b6565b50919392505050565b6000620009ba8484620009a48562001e1a565b620009af8662001ee1565b620004ac8762001f9f565b949350505050565b605354606854600160c81b900463ffffffff161015620006be57620006be62002060565b600083815b602081101562000ac157600163ffffffff8516821c8116900362000a5d5784816020811062000a1e5762000a1e6200357f565b60200201358260405160200162000a3f929190918252602082015260400190565b60405160208183030381529060405280519060200120915062000aac565b8185826020811062000a735762000a736200357f565b602002013560405160200162000a93929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062000ab881620035ab565b915050620009eb565b50949350505050565b600080868660405160200162000ae292919062003519565b604051602081830303815290604052805190602001209050600060ff60f81b30836040518060200162000b159062002ce0565b601f1982820381018352601f90910116604081905262000b3e908b908b908b90602001620035c7565b60408051601f198184030181529082905262000b5e929160200162003604565b6040516020818303038152906040528051906020012060405160200162000bb794939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff161562000c0057604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b031662000c2a5760405163dde3cda760e01b815260040160405180910390fd5b606f54604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac9062000c5e903390889060040162003637565b600060405180830381600087803b15801562000c7957600080fd5b505af115801562000c8e573d6000803e3d6000fd5b5050505062000ca286868686868662001d46565b505050505050565b606062000cb78262001e1a565b62000cc28362001ee1565b62000ccd8462001f9f565b60405160200162000ce193929190620035c7565b6040516020818303038152906040529050919050565b6068546000908190610100900463ffffffff1615801562000d1e575063ffffffff83166001145b1562000d32575063ffffffff831662000d5d565b62000d48600160201b63ffffffff851662003650565b62000d5a9063ffffffff86166200366a565b90505b600881901c600090815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000dac57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161462000ddd576040516302caf51760e11b815260040160405180910390fd5b62000e178c8c8c8c8c62000e1160008e8e8e8e8e8e8e60405162000e0392919062003680565b60405180910390206200081e565b620020fe565b6001600160a01b03861662000f5d57606f546001600160a01b031662000eef5760006001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000e71576020820181803683370190505b5060405162000e81919062003690565b60006040518083038185875af1925050503d806000811462000ec0576040519150601f19603f3d011682016040523d82523d6000602084013e62000ec5565b606091505b505090508062000ee857604051630ce8f45160e31b815260040160405180910390fd5b5062001277565b606f546040516340c10f1960e01b81526001600160a01b03909116906340c10f199062000f23908790879060040162003637565b600060405180830381600087803b15801562000f3e57600080fd5b505af115801562000f53573d6000803e3d6000fd5b5050505062001277565b606d546001600160a01b03878116911614801562000f8c5750606d5463ffffffff888116600160a01b90920416145b1562000fa65760006001600160a01b038516848262000e46565b60685463ffffffff61010090910481169088160362000fdb5762000fd56001600160a01b03871685856200226f565b62001277565b6000878760405160200162000ff292919062003519565b60408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b0316806200120f57600080806200103b86880188620036ae565b925092509250600085848484604051620010559062002ce0565b6200106393929190620035c7565b8190604051809103906000f590508015801562001084573d6000803e3d6000fd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f1990620010b8908d908d9060040162003637565b600060405180830381600087803b158015620010d357600080fd5b505af1158015620010e8573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b604051620011fd9594939291906200374c565b60405180910390a15050505062001274565b6040516340c10f1960e01b81526001600160a01b038216906340c10f19906200123f908990899060040162003637565b600060405180830381600087803b1580156200125a57600080fd5b505af11580156200126f573d6000803e3d6000fd5b505050505b50505b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8a88888787604051620012b095949392919062003787565b60405180910390a1505050505050505050505050565b60685460ff1615620012eb57604051630bc011ff60e21b815260040160405180910390fd5b620012f5620022ce565b60685463ffffffff61010090910481169088160362001327576040516302caf51760e11b815260040160405180910390fd5b6000806060876001600160a01b03881662001418578834146200135d5760405163b89240f560e01b815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff169450906200138c9062003543565b80601f0160208091040260200160405190810160405280929190818152602001828054620013ba9062003543565b80156200140b5780601f10620013df576101008083540402835291602001916200140b565b820191906000526020600020905b815481529060010190602001808311620013ed57829003601f168201915b50505050509150620016c4565b3415620014385760405163798ee6f160e01b815260040160405180910390fd5b606f546001600160a01b0390811690891603620014b957604051632770a7eb60e21b81526001600160a01b03891690639dc29fac906200147f9033908d9060040162003637565b600060405180830381600087803b1580156200149a57600080fd5b505af1158015620014af573d6000803e3d6000fd5b50505050620016c4565b6001600160a01b038089166000908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b900490921691810182905290156200157757604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac906200152f9033908e9060040162003637565b600060405180830381600087803b1580156200154a57600080fd5b505af11580156200155f573d6000803e3d6000fd5b505050508060200151945080600001519350620016b5565b85156200158c576200158c898b898962002329565b6040516370a0823160e01b81526000906001600160a01b038b16906370a0823190620015bd90309060040162002d58565b602060405180830381865afa158015620015db573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620016019190620037b9565b90506200161a6001600160a01b038b1633308e6200268b565b6040516370a0823160e01b81526000906001600160a01b038c16906370a08231906200164b90309060040162002d58565b602060405180830381865afa15801562001669573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200168f9190620037b9565b90506200169d8282620037d3565b6068548c9850610100900463ffffffff169650935050505b620016c08962000caa565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e868860535460405162001706989796959493929190620037e9565b60405180910390a1620017316200172b600085878f8f8789805190602001206200081e565b620026c5565b861562001742576200174262002060565b505050506200175060018055565b50505050505050565b606c546001600160a01b031633146200178557604051631736745960e31b815260040160405180910390fd5b620006be620027c4565b60685460ff1615620017b457604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614620017e5576040516302caf51760e11b815260040160405180910390fd5b6200180b8c8c8c8c8c62000e1160018e8e8e8e8e8e8e60405162000e0392919062003680565b606f546000906001600160a01b0316620018ca57846001600160a01b031684888a868660405160240162001843949392919062003856565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b179052516200187a919062003690565b60006040518083038185875af1925050503d8060008114620018b9576040519150601f19603f3d011682016040523d82523d6000602084013e620018be565b606091505b505080915050620019d6565b606f546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990620018fe908890889060040162003637565b600060405180830381600087803b1580156200191957600080fd5b505af11580156200192e573d6000803e3d6000fd5b50505050846001600160a01b03168789858560405160240162001955949392919062003856565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b179052516200198c919062003690565b6000604051808303816000865af19150503d8060008114620019cb576040519150601f19603f3d011682016040523d82523d6000602084013e620019d0565b606091505b50909150505b80620019f5576040516337e391c360e01b815260040160405180910390fd5b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8b8989888860405162001a2e95949392919062003787565b60405180910390a150505050505050505050505050565b600054610100900460ff161580801562001a665750600054600160ff909116105b8062001a825750303b15801562001a82575060005460ff166001145b62001aeb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562001b0f576000805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff8a160265010000000000600160c81b03191617600160281b6001600160a01b038781169190910291909117909155606c80546001600160a01b031916858316179055861662001b9b5763ffffffff85161562001b9557604051630d43a60960e11b815260040160405180910390fd5b62001c76565b606d805463ffffffff8716600160a01b026001600160c01b03199091166001600160a01b03891617179055606e62001bd48382620038dd565b506000801b601260405162001be99062002ce0565b6060808252600d908201526c2bb930b83832b21022ba3432b960991b608082015260a060208201819052600490820152630ae8aa8960e31b60c082015260ff909116604082015260e0018190604051809103906000f590508015801562001c54573d6000803e3d6000fd5b50606f80546001600160a01b0319166001600160a01b03929092169190911790555b62001c806200281d565b801562001750576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b60008162001cdf868686620009e6565b1495945050505050565b60685460ff161562001d0e57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b60685463ffffffff61010090910481169087160362001d78576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff1633898989888860535460405162001dce99989796959493929190620039a9565b60405180910390a162001e096200172b6001606860019054906101000a900463ffffffff16338a8a8a898960405162000e0392919062003680565b821562000ca25762000ca262002060565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009182916001600160a01b0386169162001e63919062003690565b600060405180830381855afa9150503d806000811462001ea0576040519150601f19603f3d011682016040523d82523d6000602084013e62001ea5565b606091505b50915091508162001ed657604051806040016040528060078152602001664e4f5f4e414d4560c81b815250620009ba565b620009ba8162002851565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009182916001600160a01b0386169162001f2a919062003690565b600060405180830381855afa9150503d806000811462001f67576040519150601f19603f3d011682016040523d82523d6000602084013e62001f6c565b606091505b50915091508162001ed657604051806040016040528060098152602001681393d7d4d6535093d360ba1b815250620009ba565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b0386169162001fe7919062003690565b600060405180830381855afa9150503d806000811462002024576040519150601f19603f3d011682016040523d82523d6000602084013e62002029565b606091505b50915091508180156200203d575080516020145b6200204a576012620009ba565b80806020019051810190620009ba919062003a18565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d620020a9620008ab565b6040518263ffffffff1660e01b8152600401620020c891815260200190565b600060405180830381600087803b158015620020e357600080fd5b505af1158015620020f8573d6000803e3d6000fd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101206312bd9b1960e11b9092526064810191909152600091600160281b90046001600160a01b03169063257b3632906084016020604051808303816000875af115801562002179573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200219f9190620037b9565b905080600003620021c257604051622f6fad60e01b815260040160405180910390fd5b600080600160401b8716156200220757869150620021e3848a848962001ccf565b62002201576040516338105f3b60e21b815260040160405180910390fd5b62002258565b602087901c6200221981600162003a38565b9150879250620022386200222f868c86620009e6565b8a838962001ccf565b62002256576040516338105f3b60e21b815260040160405180910390fd5b505b620022648282620029fa565b505050505050505050565b620022c98363a9059cbb60e01b84846040516024016200229192919062003637565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262002aaa565b505050565b600260015403620023225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001ae2565b6002600155565b60006200233a600482848662003a5f565b620023459162003a8b565b9050632afa533160e01b6001600160e01b0319821601620024e657600080808080808062002377896004818d62003a5f565b81019062002386919062003abc565b9650965096509650965096509650336001600160a01b0316876001600160a01b031614620023c75760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0386163014620023f15760405163750643af60e01b815260040160405180910390fd5b8a851462002412576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e169162002492919062003690565b6000604051808303816000865af19150503d8060008114620024d1576040519150601f19603f3d011682016040523d82523d6000602084013e620024d6565b606091505b5050505050505050505062000781565b6001600160e01b031981166323f2ebc360e21b146200251857604051637141605d60e11b815260040160405180910390fd5b600080808080808080620025308a6004818e62003a5f565b8101906200253f919062003b17565b97509750975097509750975097509750336001600160a01b0316886001600160a01b031614620025825760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0387163014620025ac5760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169162002635919062003690565b6000604051808303816000865af19150503d806000811462002674576040519150601f19603f3d011682016040523d82523d6000602084013e62002679565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052620020f89085906323b872dd60e01b9060840162002291565b806001620026d66020600262003ca0565b620026e29190620037d3565b6053541062002704576040516377ae67b360e11b815260040160405180910390fd5b60006053600081546200271790620035ab565b9182905550905060005b6020811015620027b3578082901c600116600103620027595782603382602081106200275157620027516200357f565b015550505050565b603381602081106200276f576200276f6200357f565b015460408051602081019290925281018490526060016040516020818303038152906040528051906020012092508080620027aa90620035ab565b91505062002721565b50620022c962003cae565b60018055565b60685460ff16620027e857604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600054610100900460ff16620028475760405162461bcd60e51b815260040162001ae29062003cc4565b620006be62002b83565b606060408251106200287357818060200190518101906200070d919062003d0f565b8151602003620029c75760005b602081108015620028b35750828181518110620028a157620028a16200357f565b01602001516001600160f81b03191615155b15620028ce5780620028c581620035ab565b91505062002880565b80600003620029075750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b6000816001600160401b0381111562002924576200292462003034565b6040519080825280601f01601f1916602001820160405280156200294f576020820181803683370190505b50905060005b82811015620029bf578481815181106200297357620029736200357f565b602001015160f81c60f81b8282815181106200299357620029936200357f565b60200101906001600160f81b031916908160001a90535080620029b681620035ab565b91505062002955565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b606854600090610100900463ffffffff1615801562002a1f575063ffffffff82166001145b1562002a33575063ffffffff821662002a5e565b62002a49600160201b63ffffffff841662003650565b62002a5b9063ffffffff85166200366a565b90505b600881901c60008181526069602052604081208054600160ff861690811b918218928390559290919081831690036200175057604051630c8d9eab60e31b815260040160405180910390fd5b600062002b01826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031662002bad9092919063ffffffff16565b805190915015620022c9578080602001905181019062002b22919062003d8e565b620022c95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162001ae2565b600054610100900460ff16620027be5760405162461bcd60e51b815260040162001ae29062003cc4565b6060620009ba848460008585600080866001600160a01b0316858760405162002bd7919062003690565b60006040518083038185875af1925050503d806000811462002c16576040519150601f19603f3d011682016040523d82523d6000602084013e62002c1b565b606091505b509150915062002c2e8783838762002c39565b979650505050505050565b6060831562002cad57825160000362002ca5576001600160a01b0385163b62002ca55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001ae2565b5081620009ba565b620009ba838381511562002cc45781518083602001fd5b8060405162461bcd60e51b815260040162001ae2919062002e9d565b61159c8062003daf83390190565b803563ffffffff81168114620029f557600080fd5b6001600160a01b038116811462002d1957600080fd5b50565b6000806040838503121562002d3057600080fd5b62002d3b8362002cee565b9150602083013562002d4d8162002d03565b809150509250929050565b6001600160a01b0391909116815260200190565b801515811462002d1957600080fd5b60008083601f84011262002d8e57600080fd5b5081356001600160401b0381111562002da657600080fd5b60208301915083602082850101111562002dbf57600080fd5b9250929050565b60008060008060006080868803121562002ddf57600080fd5b62002dea8662002cee565b9450602086013562002dfc8162002d03565b9350604086013562002e0e8162002d6c565b925060608601356001600160401b0381111562002e2a57600080fd5b62002e388882890162002d7b565b969995985093965092949392505050565b60005b8381101562002e6657818101518382015260200162002e4c565b50506000910152565b6000815180845262002e8981602086016020860162002e49565b601f01601f19169290920160200192915050565b60208152600062002eb2602083018462002e6f565b9392505050565b60006020828403121562002ecc57600080fd5b813562002eb28162002d03565b60ff8116811462002d1957600080fd5b600080600080600080600060e0888a03121562002f0557600080fd5b873562002f128162002ed9565b965062002f226020890162002cee565b9550604088013562002f348162002d03565b945062002f446060890162002cee565b9350608088013562002f568162002d03565b9699959850939692959460a0840135945060c09093013592915050565b60008060006060848603121562002f8957600080fd5b62002f948462002cee565b9250602084013562002fa68162002d03565b9150604084013562002fb88162002d03565b809150509250925092565b60006020828403121562002fd657600080fd5b5035919050565b8061040081018310156200070d57600080fd5b600080600061044084860312156200300757600080fd5b833592506200301a856020860162002fdd565b91506200302b610420850162002cee565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562003075576200307562003034565b604052919050565b60006001600160401b0382111562003099576200309962003034565b50601f01601f191660200190565b6000620030be620030b8846200307d565b6200304a565b9050828152838383011115620030d357600080fd5b828260208301376000602084830101529392505050565b600082601f830112620030fc57600080fd5b62002eb283833560208501620030a7565b600080600080600060a086880312156200312657600080fd5b620031318662002cee565b94506020860135620031438162002d03565b935060408601356001600160401b03808211156200316057600080fd5b6200316e89838a01620030ea565b945060608801359150808211156200318557600080fd5b506200319488828901620030ea565b9250506080860135620031a78162002ed9565b809150509295509295909350565b60008060008060008060a08789031215620031cf57600080fd5b620031da8762002cee565b95506020870135620031ec8162002d03565b9450604087013593506060870135620032058162002d6c565b925060808701356001600160401b038111156200322157600080fd5b6200322f89828a0162002d7b565b979a9699509497509295939492505050565b600080604083850312156200325557600080fd5b620032608362002cee565b9150620032706020840162002cee565b90509250929050565b6000806000806000806000806000806000806109208d8f0312156200329d57600080fd5b620032a98e8e62002fdd565b9b50620032bb8e6104008f0162002fdd565b9a506108008d013599506108208d013598506108408d01359750620032e46108608e0162002cee565b9650620032f66108808e013562002d03565b6108808d013595506200330d6108a08e0162002cee565b94506200331f6108c08e013562002d03565b6108c08d013593506108e08d013592506001600160401b036109008e013511156200334957600080fd5b6200335c8e6109008f01358f0162002d7b565b81935080925050509295989b509295989b509295989b565b600080600080600080600060c0888a0312156200339057600080fd5b6200339b8862002cee565b96506020880135620033ad8162002d03565b9550604088013594506060880135620033c68162002d03565b93506080880135620033d88162002d6c565b925060a08801356001600160401b03811115620033f457600080fd5b620034028a828b0162002d7b565b989b979a50959850939692959293505050565b60008060008060008060c087890312156200342f57600080fd5b6200343a8762002cee565b955060208701356200344c8162002d03565b94506200345c6040880162002cee565b935060608701356200346e8162002d03565b92506080870135620034808162002d03565b915060a08701356001600160401b038111156200349c57600080fd5b8701601f81018913620034ae57600080fd5b620034bf89823560208401620030a7565b9150509295509295509295565b6000806000806104608587031215620034e457600080fd5b84359350620034f7866020870162002fdd565b925062003508610420860162002cee565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b600181811c908216806200355857607f821691505b6020821081036200357957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201620035c057620035c062003595565b5060010190565b606081526000620035dc606083018662002e6f565b8281036020840152620035f0818662002e6f565b91505060ff83166040830152949350505050565b600083516200361881846020880162002e49565b8351908301906200362e81836020880162002e49565b01949350505050565b6001600160a01b03929092168252602082015260400190565b80820281158282048414176200070d576200070d62003595565b808201808211156200070d576200070d62003595565b8183823760009101908152919050565b60008251620036a481846020870162002e49565b9190910192915050565b600080600060608486031215620036c457600080fd5b83356001600160401b0380821115620036dc57600080fd5b620036ea87838801620030ea565b945060208601359150808211156200370157600080fd5b506200371086828701620030ea565b925050604084013562002fb88162002ed9565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b63ffffffff861681526001600160a01b0385811660208301528416604082015260806060820181905260009062002c2e908301848662003723565b94855263ffffffff9390931660208501526001600160a01b039182166040850152166060830152608082015260a00190565b600060208284031215620037cc57600080fd5b5051919050565b818103818111156200070d576200070d62003595565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c083018190526000916200383d8483018762002e6f565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff8416602082015260606040820181905260009062003889908301848662003723565b9695505050505050565b601f821115620022c957600081815260208120601f850160051c81016020861015620038bc5750805b601f850160051c820191505b8181101562000ca257828155600101620038c8565b81516001600160401b03811115620038f957620038f962003034565b62003911816200390a845462003543565b8462003893565b602080601f831160018114620039495760008415620039305750858301515b600019600386901b1c1916600185901b17855562000ca2565b600085815260208120601f198616915b828110156200397a5788860151825594840194600190910190840162003959565b5085821015620039995787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c08301819052600091620039fe848301878962003723565b925080851660e085015250509a9950505050505050505050565b60006020828403121562003a2b57600080fd5b815162002eb28162002ed9565b63ffffffff81811683821601908082111562003a585762003a5862003595565b5092915050565b6000808585111562003a7057600080fd5b8386111562003a7e57600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101562003ab45780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a03121562003ad857600080fd5b873562003ae58162002d03565b9650602088013562003af78162002d03565b95506040880135945060608801359350608088013562002f568162002ed9565b600080600080600080600080610100898b03121562003b3557600080fd5b883562003b428162002d03565b9750602089013562003b548162002d03565b96506040890135955060608901359450608089013562003b748162002d6c565b935060a089013562003b868162002ed9565b979a969950949793969295929450505060c08201359160e0013590565b600181815b8085111562003be457816000190482111562003bc85762003bc862003595565b8085161562003bd657918102915b93841c939080029062003ba8565b509250929050565b60008262003bfd575060016200070d565b8162003c0c575060006200070d565b816001811462003c25576002811462003c305762003c50565b60019150506200070d565b60ff84111562003c445762003c4462003595565b50506001821b6200070d565b5060208310610133831016604e8410600b841016171562003c75575081810a6200070d565b62003c81838362003ba3565b806000190482111562003c985762003c9862003595565b029392505050565b600062002eb2838362003bec565b634e487b7160e01b600052600160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60006020828403121562003d2257600080fd5b81516001600160401b0381111562003d3957600080fd5b8201601f8101841362003d4b57600080fd5b805162003d5c620030b8826200307d565b81815285602083850101111562003d7257600080fd5b62003d8582602083016020860162002e49565b95945050505050565b60006020828403121562003da157600080fd5b815162002eb28162002d6c56fe6101006040523480156200001257600080fd5b506040516200159c3803806200159c83398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516110e0620004bc60003960006101f70152600081816102ba015281816104e0015261054e0152600061049101526000818161031f015261045b01526110e06000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063a457c2d71161007c578063a457c2d7146102f4578063a9059cbb14610307578063cd0d00961461031a578063d505accf14610341578063dd62ed3e14610354578063ffa1ad741461036757600080fd5b806370a08231146102515780637ecebe001461027a57806395d89b411461029a5780639dc29fac146102a2578063a3c573eb146102b557600080fd5b806330adf81f116100ff57806330adf81f146101c9578063313ce567146101f05780633644e51514610221578063395093511461022957806340c10f191461023c57600080fd5b806306fdde031461013c578063095ea7b31461015a57806318160ddd1461017d57806320606b701461018f57806323b872dd146101b6575b600080fd5b610144610387565b6040516101519190610e26565b60405180910390f35b61016d610168366004610e90565b610419565b6040519015158152602001610151565b6002545b604051908152602001610151565b6101817f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b61016d6101c4366004610eba565b610433565b6101817f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610151565b610181610457565b61016d610237366004610e90565b6104b3565b61024f61024a366004610e90565b6104d5565b005b61018161025f366004610ef6565b6001600160a01b031660009081526020819052604090205490565b610181610288366004610ef6565b60056020526000908152604090205481565b610144610534565b61024f6102b0366004610e90565b610543565b6102dc7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610151565b61016d610302366004610e90565b610595565b61016d610315366004610e90565b610610565b6101817f000000000000000000000000000000000000000000000000000000000000000081565b61024f61034f366004610f18565b61061e565b610181610362366004610f8b565b610859565b610144604051806040016040528060018152602001603160f81b81525081565b60606003805461039690610fbe565b80601f01602080910402602001604051908101604052809291908181526020018280546103c290610fbe565b801561040f5780601f106103e45761010080835404028352916020019161040f565b820191906000526020600020905b8154815290600101906020018083116103f257829003601f168201915b5050505050905090565b600033610427818585610884565b60019150505b92915050565b6000336104418582856109a9565b61044c858585610a23565b506001949350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461461048e5761048946610bb5565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000336104278185856104c68383610859565b6104d0919061100e565b610884565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105265760405162461bcd60e51b815260040161051d90611021565b60405180910390fd5b6105308282610c61565b5050565b60606004805461039690610fbe565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461058b5760405162461bcd60e51b815260040161051d90611021565b6105308282610d0e565b600033816105a38286610859565b9050838110156106035760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161051d565b61044c8286868403610884565b600033610427818585610a23565b8342111561067a5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b606482015260840161051d565b6001600160a01b038716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866106c783611071565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610725610457565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156107b0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906107e65750896001600160a01b0316816001600160a01b0316145b6108425760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b606482015260840161051d565b61084d8a8a8a610884565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166108e65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161051d565b6001600160a01b0382166109475760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161051d565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006109b58484610859565b90506000198114610a1d5781811015610a105760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161051d565b610a1d8484848403610884565b50505050565b6001600160a01b038316610a875760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161051d565b6001600160a01b038216610ae95760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161051d565b6001600160a01b03831660009081526020819052604090205481811015610b615760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161051d565b6001600160a01b038481166000818152602081815260408083208787039055938716808352918490208054870190559251858152909260008051602061108b833981519152910160405180910390a3610a1d565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610be0610387565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610cb75760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161051d565b8060026000828254610cc9919061100e565b90915550506001600160a01b0382166000818152602081815260408083208054860190555184815260008051602061108b833981519152910160405180910390a35050565b6001600160a01b038216610d6e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161051d565b6001600160a01b03821660009081526020819052604090205481811015610de25760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161051d565b6001600160a01b03831660008181526020818152604080832086860390556002805487900390555185815291929160008051602061108b833981519152910161099c565b600060208083528351808285015260005b81811015610e5357858101830151858201604001528201610e37565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610e8b57600080fd5b919050565b60008060408385031215610ea357600080fd5b610eac83610e74565b946020939093013593505050565b600080600060608486031215610ecf57600080fd5b610ed884610e74565b9250610ee660208501610e74565b9150604084013590509250925092565b600060208284031215610f0857600080fd5b610f1182610e74565b9392505050565b600080600080600080600060e0888a031215610f3357600080fd5b610f3c88610e74565b9650610f4a60208901610e74565b95506040880135945060608801359350608088013560ff81168114610f6e57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f9e57600080fd5b610fa783610e74565b9150610fb560208401610e74565b90509250929050565b600181811c90821680610fd257607f821691505b602082108103610ff257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561042d5761042d610ff8565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b60006001820161108357611083610ff8565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122041a613df402940120c0c7421c7d02599c9a28987dd403c01cd013411ae6d388964736f6c63430008140033a26469706673582212203f4368970cd783f4e4a75720695da4a677b0e2b0336e4a7d19983860ade7c07564736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMV2.json b/compiled-contracts/paris/PolygonZkEVMV2.json index 8d3712ca9..548468c47 100644 --- a/compiled-contracts/paris/PolygonZkEVMV2.json +++ b/compiled-contracts/paris/PolygonZkEVMV2.json @@ -1109,8 +1109,8 @@ "type": "function" } ], - "bytecode": "0x6101006040523480156200001257600080fd5b506040516200477938038062004779833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e0516145cc620001ad6000396000818161051a015281816109a501528181610b12015281816112690152818161133201528181611354015281816114eb0152818161176801528181611d21015281816128ed015281816129bb0152612aa80152600081816106690152818161142c015281816119c2015281816120f001526121f801526000818161072d01528181610f8c01528181611b770152612bf30152600081816107720152818161083d015281816112bc015281816114020152612bc701526145cc6000f3fe608060405234801561001057600080fd5b50600436106102e85760003560e01c80636e05d2cd11610191578063c7fffd4b116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b146107b4578063f35dda47146107c7578063f851a440146107cf57600080fd5b8063d8d1091b1461075a578063e46761c41461076d578063e7a7ed021461079457600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610708578063d02103ca14610728578063d7bc90ff1461074f57600080fd5b8063c7fffd4b146106ed578063c89e42df146106f557600080fd5b80639e00187711610145578063ada8f9191161011f578063ada8f9191461069e578063b0afe154146106b1578063c754c7ed146106bd57600080fd5b80639e00187714610649578063a3c573eb14610664578063a652f26c1461068b57600080fd5b8063712570221161017657806371257022146105f25780637a5460c5146106055780638c3d73011461064157600080fd5b80636e05d2cd146105d65780636ff512cc146105df57600080fd5b80633cbc795b1161024a57806352bdeb6d116101fe5780635ec91958116101d85780635ec91958146105a6578063676870d2146105ae5780636b8616ce146105b657600080fd5b806352bdeb6d1461054f578063542028d51461058b5780635e9145c91461059357600080fd5b8063456052671161022f57806345605267146104ed57806349b7b802146105155780634e4877061461053c57600080fd5b80633cbc795b1461045757806340b5de6c1461049557600080fd5b806319d8ac61116102a15780632b35b3ac116102865780632b35b3ac1461040057806332c2d1531461041d5780633c351e101461043257600080fd5b806319d8ac611461038e57806326782247146103bb57600080fd5b806305835f37116102d257806305835f3714610323578063107bf28c1461036c57806311e892d41461037457600080fd5b8062d0295d146102ed5780630350896314610308575b600080fd5b6102f56107f5565b6040519081526020015b60405180910390f35b610310602081565b60405161ffff90911681526020016102ff565b61035f6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102ff919061375f565b61035f610915565b61037c60f981565b60405160ff90911681526020016102ff565b6007546103a29067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102ff565b6001546103db9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102ff565b60085461040d9060ff1681565b60405190151581526020016102ff565b61043061042b3660046137b4565b6109a3565b005b6008546103db90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b600854610480907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102ff565b6104bc7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102ff565b6007546103a290700100000000000000000000000000000000900467ffffffffffffffff1681565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b61043061054a3660046137f6565b610a72565b61035f6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61035f610c8c565b6104306105a136600461385f565b610c99565b6104306115b2565b610310601f81565b6102f56105c43660046137f6565b60066020526000908152604090205481565b6102f560055481565b6104306105ed3660046138ab565b61169c565b6104306106003660046139f4565b611766565b61035f6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610430611f1c565b6103db73a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b61035f610699366004613aa1565b611fef565b6104306106ac3660046138ab565b6123d4565b6102f56405ca1ab1e081565b6007546103a2907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61037c60e481565b610430610703366004613b16565b61249e565b6002546103db9073ffffffffffffffffffffffffffffffffffffffff1681565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6102f5635ca1ab1e81565b610430610768366004613b4b565b612531565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6007546103a29068010000000000000000900467ffffffffffffffff1681565b6104306107c2366004613b8d565b612a68565b61037c601b81565b6000546103db9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610884573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a89190613c05565b6007549091506000906108e79067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613c4d565b67ffffffffffffffff169050806000036109045760009250505090565b61090e8183613c75565b9250505090565b6004805461092290613cb0565b80601f016020809104026020016040519081016040528092919081815260200182805461094e90613cb0565b801561099b5780601f106109705761010080835404028352916020019161099b565b820191906000526020600020905b81548152906001019060200180831161097e57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a12576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a6591815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ac9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b10576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9f9190613d03565b610c085760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c08576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461092290613cb0565b60025473ffffffffffffffffffffffffffffffffffffffff163314610cea576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003610d26576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610d62576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b8581101561119e576000898983818110610dab57610dab613d25565b9050602002810190610dbd9190613d54565b610dc690613d92565b8051805160209091012060608201519192509067ffffffffffffffff1615610f495785610df281613e23565b96505060008183602001518460600151604051602001610e4a93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114610ed3576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015610f29576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055611086565b602082015115801590611010575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015610fea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100e9190613c05565b155b15611047576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611086576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806110b9575042826040015167ffffffffffffffff16115b156110f0576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061119690613e4a565b915050610d8f565b5060075467ffffffffffffffff68010000000000000000909104811690841611156111f5576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691909117909155600583905585908281169085161461132c57600061124c8386613c4d565b905061126267ffffffffffffffff821683613e82565b91506112e37f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661129b6107f5565b6112a59190613e95565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190612e57565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b61142a337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e19190613c05565b6113eb9190613e95565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190612f30565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561149257600080fd5b505af11580156114a6573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af115801561154a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156e9190613eac565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611609576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615611646576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146116f3576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c81565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146117d5576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156117f55750600054600160ff909116105b8061180f5750303b15801561180f575060005460ff166001145b6118a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156118fe57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611b135761192585612f94565b61192e866130a4565b611937876131ab565b60405160200161194993929190613ec9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611a0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2e9190613f02565b915091508163ffffffff16600014611acb57600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff851602179055611b10565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b600854600090611b60908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff1685611fef565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611be0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c049190613c05565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611d7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da39190613eac565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611e359190613f8a565b506004611e428982613f8a565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611ea2939291906140a4565b60405180910390a15050505050508015611f1357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611f6d576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa600087604051602401612023969594939291906140e3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060906000036121745760f9601f83516120b89190614146565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e48760405160200161215e9796959493929190614161565b6040516020818303038152906040529050612278565b815161ffff10156121b1576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96121c0602083614146565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016122659796959493929190614244565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156122d9573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612351576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906123979084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614327565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461242b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c81565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146124f5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036125018282613f8a565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c81919061375f565b60085460ff1661256d576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036125a9576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156125e5576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612620918491700100000000000000000000000000000000900416614383565b1115612658576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b838110156128e757600086868381811061269d5761269d613d25565b90506020028101906126af9190614396565b6126b8906143ca565b9050836126c481613e23565b825180516020918201208185015160408087015190519499509194506000936127269386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89166000908152600690935291205490915081146127af576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86166000908152600660205260408120556127d4600188613e82565b84036128435742600760189054906101000a900467ffffffffffffffff1684604001516128019190614448565b67ffffffffffffffff161115612843576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806128df90613e4a565b915050612681565b506129157f00000000000000000000000000000000000000000000000000000000000000008461129b6107f5565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612a04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a289190613eac565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612aa4576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b359190613c05565b905081811115612b71576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612bad576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612bef73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084612f30565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c809190613c05565b600780549192506801000000000000000090910467ffffffffffffffff16906008612caa83613e23565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612ce1929190614469565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612df1576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612e50565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612e479493929190614479565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052612f2b9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261329e565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612f8e9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612ea9565b50505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161301691906144ea565b600060405180830381855afa9150503d8060008114613051576040519150601f19603f3d011682016040523d82523d6000602084013e613056565b606091505b50915091508161309b576040518060400160405280600781526020017f4e4f5f4e414d45000000000000000000000000000000000000000000000000008152506123cc565b6123cc816133aa565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161312691906144ea565b600060405180830381855afa9150503d8060008114613161576040519150601f19603f3d011682016040523d82523d6000602084013e613166565b606091505b50915091508161309b576040518060400160405280600981526020017f4e4f5f53594d424f4c00000000000000000000000000000000000000000000008152506123cc565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169161322c91906144ea565b600060405180830381855afa9150503d8060008114613267576040519150601f19603f3d011682016040523d82523d6000602084013e61326c565b606091505b509150915081801561327f575080516020145b61328a5760126123cc565b808060200190518101906123cc91906144fc565b6000613300826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166135809092919063ffffffff16565b805190915015612f2b578080602001905181019061331e9190613d03565b612f2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611897565b606060408251106133cf57818060200190518101906133c9919061451f565b92915050565b81516020036135475760005b60208110801561342257508281815181106133f8576133f8613d25565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613439578061343181613e4a565b9150506133db565b8060000361347c57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115613497576134976138da565b6040519080825280601f01601f1916602001820160405280156134c1576020820181803683370190505b50905060005b8281101561353f578481815181106134e1576134e1613d25565b602001015160f81c60f81b8282815181106134fe576134fe613d25565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061353781613e4a565b9150506134c7565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60606123cc8484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516135b491906144ea565b60006040518083038185875af1925050503d80600081146135f1576040519150601f19603f3d011682016040523d82523d6000602084013e6135f6565b606091505b509150915061360787838387613612565b979650505050505050565b606083156136a85782516000036136a15773ffffffffffffffffffffffffffffffffffffffff85163b6136a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611897565b50816123cc565b6123cc83838151156136bd5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611897919061375f565b60005b8381101561370c5781810151838201526020016136f4565b50506000910152565b6000815180845261372d8160208601602086016136f1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006137726020830184613715565b9392505050565b67ffffffffffffffff8116811461378f57600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461378f57600080fd5b6000806000606084860312156137c957600080fd5b83356137d481613779565b92506020840135915060408401356137eb81613792565b809150509250925092565b60006020828403121561380857600080fd5b813561377281613779565b60008083601f84011261382557600080fd5b50813567ffffffffffffffff81111561383d57600080fd5b6020830191508360208260051b850101111561385857600080fd5b9250929050565b60008060006040848603121561387457600080fd5b833567ffffffffffffffff81111561388b57600080fd5b61389786828701613813565b90945092505060208401356137eb81613792565b6000602082840312156138bd57600080fd5b813561377281613792565b63ffffffff8116811461378f57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613950576139506138da565b604052919050565b600067ffffffffffffffff821115613972576139726138da565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126139af57600080fd5b81356139c26139bd82613958565b613909565b8181528460208386010111156139d757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613a0d57600080fd5b8635613a1881613792565b95506020870135613a2881613792565b94506040870135613a38816138c8565b93506060870135613a4881613792565b9250608087013567ffffffffffffffff80821115613a6557600080fd5b613a718a838b0161399e565b935060a0890135915080821115613a8757600080fd5b50613a9489828a0161399e565b9150509295509295509295565b60008060008060808587031215613ab757600080fd5b8435613ac2816138c8565b93506020850135613ad281613792565b92506040850135613ae2816138c8565b9150606085013567ffffffffffffffff811115613afe57600080fd5b613b0a8782880161399e565b91505092959194509250565b600060208284031215613b2857600080fd5b813567ffffffffffffffff811115613b3f57600080fd5b6123cc8482850161399e565b60008060208385031215613b5e57600080fd5b823567ffffffffffffffff811115613b7557600080fd5b613b8185828601613813565b90969095509350505050565b600080600060408486031215613ba257600080fd5b833567ffffffffffffffff80821115613bba57600080fd5b818601915086601f830112613bce57600080fd5b813581811115613bdd57600080fd5b876020828501011115613bef57600080fd5b6020928301989097509590910135949350505050565b600060208284031215613c1757600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613c6e57613c6e613c1e565b5092915050565b600082613cab577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613cc457607f821691505b602082108103613cfd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215613d1557600080fd5b8151801515811461377257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613d8857600080fd5b9190910192915050565b600060808236031215613da457600080fd5b6040516080810167ffffffffffffffff8282108183111715613dc857613dc86138da565b816040528435915080821115613ddd57600080fd5b50613dea3682860161399e565b825250602083013560208201526040830135613e0581613779565b60408201526060830135613e1881613779565b606082015292915050565b600067ffffffffffffffff808316818103613e4057613e40613c1e565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e7b57613e7b613c1e565b5060010190565b818103818111156133c9576133c9613c1e565b80820281158282048414176133c9576133c9613c1e565b600060208284031215613ebe57600080fd5b815161377281613779565b606081526000613edc6060830186613715565b8281036020840152613eee8186613715565b91505060ff83166040830152949350505050565b60008060408385031215613f1557600080fd5b8251613f20816138c8565b6020840151909250613f3181613792565b809150509250929050565b601f821115612f2b57600081815260208120601f850160051c81016020861015613f635750805b601f850160051c820191505b81811015613f8257828155600101613f6f565b505050505050565b815167ffffffffffffffff811115613fa457613fa46138da565b613fb881613fb28454613cb0565b84613f3c565b602080601f83116001811461400b5760008415613fd55750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613f82565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561405857888601518255948401946001909101908401614039565b508582101561409457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006140b76060830186613715565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261413a60c0830184613715565b98975050505050505050565b61ffff818116838216019080821115613c6e57613c6e613c1e565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b16600184015287516141ca816003860160208c016136f1565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161420d816017840160208b016136f1565b808201915050818660f81b166017820152845191506142338260188301602088016136f1565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b16600184015287516142ad816003860160208c016136f1565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516142f0816017840160208b016136f1565b808201915050818660f01b166017820152845191506143168260198301602088016136f1565b016019019998505050505050505050565b60008651614339818460208b016136f1565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b808201808211156133c9576133c9613c1e565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112613d8857600080fd5b6000606082360312156143dc57600080fd5b6040516060810167ffffffffffffffff8282108183111715614400576144006138da565b81604052843591508082111561441557600080fd5b506144223682860161399e565b82525060208301356020820152604083013561443d81613779565b604082015292915050565b67ffffffffffffffff818116838216019080821115613c6e57613c6e613c1e565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b60008251613d888184602087016136f1565b60006020828403121561450e57600080fd5b815160ff8116811461377257600080fd5b60006020828403121561453157600080fd5b815167ffffffffffffffff81111561454857600080fd5b8201601f8101841361455957600080fd5b80516145676139bd82613958565b81815285602083850101111561457c57600080fd5b61458d8260208301602086016136f1565b9594505050505056fea264697066735822122087592c89b8beca03bac67170668042d883bf5f14f17ea60e42a293e94959dc1264736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102e85760003560e01c80636e05d2cd11610191578063c7fffd4b116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b146107b4578063f35dda47146107c7578063f851a440146107cf57600080fd5b8063d8d1091b1461075a578063e46761c41461076d578063e7a7ed021461079457600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610708578063d02103ca14610728578063d7bc90ff1461074f57600080fd5b8063c7fffd4b146106ed578063c89e42df146106f557600080fd5b80639e00187711610145578063ada8f9191161011f578063ada8f9191461069e578063b0afe154146106b1578063c754c7ed146106bd57600080fd5b80639e00187714610649578063a3c573eb14610664578063a652f26c1461068b57600080fd5b8063712570221161017657806371257022146105f25780637a5460c5146106055780638c3d73011461064157600080fd5b80636e05d2cd146105d65780636ff512cc146105df57600080fd5b80633cbc795b1161024a57806352bdeb6d116101fe5780635ec91958116101d85780635ec91958146105a6578063676870d2146105ae5780636b8616ce146105b657600080fd5b806352bdeb6d1461054f578063542028d51461058b5780635e9145c91461059357600080fd5b8063456052671161022f57806345605267146104ed57806349b7b802146105155780634e4877061461053c57600080fd5b80633cbc795b1461045757806340b5de6c1461049557600080fd5b806319d8ac61116102a15780632b35b3ac116102865780632b35b3ac1461040057806332c2d1531461041d5780633c351e101461043257600080fd5b806319d8ac611461038e57806326782247146103bb57600080fd5b806305835f37116102d257806305835f3714610323578063107bf28c1461036c57806311e892d41461037457600080fd5b8062d0295d146102ed5780630350896314610308575b600080fd5b6102f56107f5565b6040519081526020015b60405180910390f35b610310602081565b60405161ffff90911681526020016102ff565b61035f6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102ff919061375f565b61035f610915565b61037c60f981565b60405160ff90911681526020016102ff565b6007546103a29067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102ff565b6001546103db9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102ff565b60085461040d9060ff1681565b60405190151581526020016102ff565b61043061042b3660046137b4565b6109a3565b005b6008546103db90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b600854610480907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102ff565b6104bc7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102ff565b6007546103a290700100000000000000000000000000000000900467ffffffffffffffff1681565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b61043061054a3660046137f6565b610a72565b61035f6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61035f610c8c565b6104306105a136600461385f565b610c99565b6104306115b2565b610310601f81565b6102f56105c43660046137f6565b60066020526000908152604090205481565b6102f560055481565b6104306105ed3660046138ab565b61169c565b6104306106003660046139f4565b611766565b61035f6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610430611f1c565b6103db73a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b61035f610699366004613aa1565b611fef565b6104306106ac3660046138ab565b6123d4565b6102f56405ca1ab1e081565b6007546103a2907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61037c60e481565b610430610703366004613b16565b61249e565b6002546103db9073ffffffffffffffffffffffffffffffffffffffff1681565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6102f5635ca1ab1e81565b610430610768366004613b4b565b612531565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6007546103a29068010000000000000000900467ffffffffffffffff1681565b6104306107c2366004613b8d565b612a68565b61037c601b81565b6000546103db9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610884573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a89190613c05565b6007549091506000906108e79067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613c4d565b67ffffffffffffffff169050806000036109045760009250505090565b61090e8183613c75565b9250505090565b6004805461092290613cb0565b80601f016020809104026020016040519081016040528092919081815260200182805461094e90613cb0565b801561099b5780601f106109705761010080835404028352916020019161099b565b820191906000526020600020905b81548152906001019060200180831161097e57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a12576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a6591815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ac9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b10576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9f9190613d03565b610c085760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c08576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461092290613cb0565b60025473ffffffffffffffffffffffffffffffffffffffff163314610cea576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003610d26576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610d62576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b8581101561119e576000898983818110610dab57610dab613d25565b9050602002810190610dbd9190613d54565b610dc690613d92565b8051805160209091012060608201519192509067ffffffffffffffff1615610f495785610df281613e23565b96505060008183602001518460600151604051602001610e4a93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114610ed3576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015610f29576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055611086565b602082015115801590611010575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015610fea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100e9190613c05565b155b15611047576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611086576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806110b9575042826040015167ffffffffffffffff16115b156110f0576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061119690613e4a565b915050610d8f565b5060075467ffffffffffffffff68010000000000000000909104811690841611156111f5576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691909117909155600583905585908281169085161461132c57600061124c8386613c4d565b905061126267ffffffffffffffff821683613e82565b91506112e37f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661129b6107f5565b6112a59190613e95565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190612e57565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b61142a337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e19190613c05565b6113eb9190613e95565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190612f30565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561149257600080fd5b505af11580156114a6573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af115801561154a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156e9190613eac565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611609576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615611646576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146116f3576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c81565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146117d5576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156117f55750600054600160ff909116105b8061180f5750303b15801561180f575060005460ff166001145b6118a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156118fe57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611b135761192585612f94565b61192e866130a4565b611937876131ab565b60405160200161194993929190613ec9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611a0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2e9190613f02565b915091508163ffffffff16600014611acb57600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff851602179055611b10565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b600854600090611b60908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff1685611fef565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611be0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c049190613c05565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611d7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da39190613eac565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611e359190613f8a565b506004611e428982613f8a565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611ea2939291906140a4565b60405180910390a15050505050508015611f1357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611f6d576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa600087604051602401612023969594939291906140e3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060906000036121745760f9601f83516120b89190614146565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e48760405160200161215e9796959493929190614161565b6040516020818303038152906040529050612278565b815161ffff10156121b1576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96121c0602083614146565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016122659796959493929190614244565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156122d9573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612351576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906123979084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614327565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461242b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c81565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146124f5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036125018282613f8a565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c81919061375f565b60085460ff1661256d576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036125a9576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156125e5576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612620918491700100000000000000000000000000000000900416614383565b1115612658576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b838110156128e757600086868381811061269d5761269d613d25565b90506020028101906126af9190614396565b6126b8906143ca565b9050836126c481613e23565b825180516020918201208185015160408087015190519499509194506000936127269386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89166000908152600690935291205490915081146127af576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86166000908152600660205260408120556127d4600188613e82565b84036128435742600760189054906101000a900467ffffffffffffffff1684604001516128019190614448565b67ffffffffffffffff161115612843576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806128df90613e4a565b915050612681565b506129157f00000000000000000000000000000000000000000000000000000000000000008461129b6107f5565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612a04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a289190613eac565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612aa4576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b359190613c05565b905081811115612b71576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612bad576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612bef73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084612f30565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c809190613c05565b600780549192506801000000000000000090910467ffffffffffffffff16906008612caa83613e23565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612ce1929190614469565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612df1576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612e50565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612e479493929190614479565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052612f2b9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261329e565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612f8e9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612ea9565b50505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161301691906144ea565b600060405180830381855afa9150503d8060008114613051576040519150601f19603f3d011682016040523d82523d6000602084013e613056565b606091505b50915091508161309b576040518060400160405280600781526020017f4e4f5f4e414d45000000000000000000000000000000000000000000000000008152506123cc565b6123cc816133aa565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161312691906144ea565b600060405180830381855afa9150503d8060008114613161576040519150601f19603f3d011682016040523d82523d6000602084013e613166565b606091505b50915091508161309b576040518060400160405280600981526020017f4e4f5f53594d424f4c00000000000000000000000000000000000000000000008152506123cc565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169161322c91906144ea565b600060405180830381855afa9150503d8060008114613267576040519150601f19603f3d011682016040523d82523d6000602084013e61326c565b606091505b509150915081801561327f575080516020145b61328a5760126123cc565b808060200190518101906123cc91906144fc565b6000613300826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166135809092919063ffffffff16565b805190915015612f2b578080602001905181019061331e9190613d03565b612f2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611897565b606060408251106133cf57818060200190518101906133c9919061451f565b92915050565b81516020036135475760005b60208110801561342257508281815181106133f8576133f8613d25565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613439578061343181613e4a565b9150506133db565b8060000361347c57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115613497576134976138da565b6040519080825280601f01601f1916602001820160405280156134c1576020820181803683370190505b50905060005b8281101561353f578481815181106134e1576134e1613d25565b602001015160f81c60f81b8282815181106134fe576134fe613d25565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061353781613e4a565b9150506134c7565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60606123cc8484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516135b491906144ea565b60006040518083038185875af1925050503d80600081146135f1576040519150601f19603f3d011682016040523d82523d6000602084013e6135f6565b606091505b509150915061360787838387613612565b979650505050505050565b606083156136a85782516000036136a15773ffffffffffffffffffffffffffffffffffffffff85163b6136a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611897565b50816123cc565b6123cc83838151156136bd5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611897919061375f565b60005b8381101561370c5781810151838201526020016136f4565b50506000910152565b6000815180845261372d8160208601602086016136f1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006137726020830184613715565b9392505050565b67ffffffffffffffff8116811461378f57600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461378f57600080fd5b6000806000606084860312156137c957600080fd5b83356137d481613779565b92506020840135915060408401356137eb81613792565b809150509250925092565b60006020828403121561380857600080fd5b813561377281613779565b60008083601f84011261382557600080fd5b50813567ffffffffffffffff81111561383d57600080fd5b6020830191508360208260051b850101111561385857600080fd5b9250929050565b60008060006040848603121561387457600080fd5b833567ffffffffffffffff81111561388b57600080fd5b61389786828701613813565b90945092505060208401356137eb81613792565b6000602082840312156138bd57600080fd5b813561377281613792565b63ffffffff8116811461378f57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613950576139506138da565b604052919050565b600067ffffffffffffffff821115613972576139726138da565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126139af57600080fd5b81356139c26139bd82613958565b613909565b8181528460208386010111156139d757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613a0d57600080fd5b8635613a1881613792565b95506020870135613a2881613792565b94506040870135613a38816138c8565b93506060870135613a4881613792565b9250608087013567ffffffffffffffff80821115613a6557600080fd5b613a718a838b0161399e565b935060a0890135915080821115613a8757600080fd5b50613a9489828a0161399e565b9150509295509295509295565b60008060008060808587031215613ab757600080fd5b8435613ac2816138c8565b93506020850135613ad281613792565b92506040850135613ae2816138c8565b9150606085013567ffffffffffffffff811115613afe57600080fd5b613b0a8782880161399e565b91505092959194509250565b600060208284031215613b2857600080fd5b813567ffffffffffffffff811115613b3f57600080fd5b6123cc8482850161399e565b60008060208385031215613b5e57600080fd5b823567ffffffffffffffff811115613b7557600080fd5b613b8185828601613813565b90969095509350505050565b600080600060408486031215613ba257600080fd5b833567ffffffffffffffff80821115613bba57600080fd5b818601915086601f830112613bce57600080fd5b813581811115613bdd57600080fd5b876020828501011115613bef57600080fd5b6020928301989097509590910135949350505050565b600060208284031215613c1757600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613c6e57613c6e613c1e565b5092915050565b600082613cab577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613cc457607f821691505b602082108103613cfd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215613d1557600080fd5b8151801515811461377257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613d8857600080fd5b9190910192915050565b600060808236031215613da457600080fd5b6040516080810167ffffffffffffffff8282108183111715613dc857613dc86138da565b816040528435915080821115613ddd57600080fd5b50613dea3682860161399e565b825250602083013560208201526040830135613e0581613779565b60408201526060830135613e1881613779565b606082015292915050565b600067ffffffffffffffff808316818103613e4057613e40613c1e565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e7b57613e7b613c1e565b5060010190565b818103818111156133c9576133c9613c1e565b80820281158282048414176133c9576133c9613c1e565b600060208284031215613ebe57600080fd5b815161377281613779565b606081526000613edc6060830186613715565b8281036020840152613eee8186613715565b91505060ff83166040830152949350505050565b60008060408385031215613f1557600080fd5b8251613f20816138c8565b6020840151909250613f3181613792565b809150509250929050565b601f821115612f2b57600081815260208120601f850160051c81016020861015613f635750805b601f850160051c820191505b81811015613f8257828155600101613f6f565b505050505050565b815167ffffffffffffffff811115613fa457613fa46138da565b613fb881613fb28454613cb0565b84613f3c565b602080601f83116001811461400b5760008415613fd55750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613f82565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561405857888601518255948401946001909101908401614039565b508582101561409457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006140b76060830186613715565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261413a60c0830184613715565b98975050505050505050565b61ffff818116838216019080821115613c6e57613c6e613c1e565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b16600184015287516141ca816003860160208c016136f1565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161420d816017840160208b016136f1565b808201915050818660f81b166017820152845191506142338260188301602088016136f1565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b16600184015287516142ad816003860160208c016136f1565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516142f0816017840160208b016136f1565b808201915050818660f01b166017820152845191506143168260198301602088016136f1565b016019019998505050505050505050565b60008651614339818460208b016136f1565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b808201808211156133c9576133c9613c1e565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112613d8857600080fd5b6000606082360312156143dc57600080fd5b6040516060810167ffffffffffffffff8282108183111715614400576144006138da565b81604052843591508082111561441557600080fd5b506144223682860161399e565b82525060208301356020820152604083013561443d81613779565b604082015292915050565b67ffffffffffffffff818116838216019080821115613c6e57613c6e613c1e565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b60008251613d888184602087016136f1565b60006020828403121561450e57600080fd5b815160ff8116811461377257600080fd5b60006020828403121561453157600080fd5b815167ffffffffffffffff81111561454857600080fd5b8201601f8101841361455957600080fd5b80516145676139bd82613958565b81815285602083850101111561457c57600080fd5b61458d8260208301602086016136f1565b9594505050505056fea264697066735822122087592c89b8beca03bac67170668042d883bf5f14f17ea60e42a293e94959dc1264736f6c63430008140033", + "bytecode": "0x6101006040523480156200001257600080fd5b506040516200477938038062004779833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e0516145cc620001ad6000396000818161051a015281816109a501528181610b12015281816112690152818161133201528181611354015281816114eb0152818161176801528181611d21015281816128ed015281816129bb0152612aa80152600081816106690152818161142c015281816119c2015281816120f001526121f801526000818161072d01528181610f8c01528181611b770152612bf30152600081816107720152818161083d015281816112bc015281816114020152612bc701526145cc6000f3fe608060405234801561001057600080fd5b50600436106102e85760003560e01c80636e05d2cd11610191578063c7fffd4b116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b146107b4578063f35dda47146107c7578063f851a440146107cf57600080fd5b8063d8d1091b1461075a578063e46761c41461076d578063e7a7ed021461079457600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610708578063d02103ca14610728578063d7bc90ff1461074f57600080fd5b8063c7fffd4b146106ed578063c89e42df146106f557600080fd5b80639e00187711610145578063ada8f9191161011f578063ada8f9191461069e578063b0afe154146106b1578063c754c7ed146106bd57600080fd5b80639e00187714610649578063a3c573eb14610664578063a652f26c1461068b57600080fd5b8063712570221161017657806371257022146105f25780637a5460c5146106055780638c3d73011461064157600080fd5b80636e05d2cd146105d65780636ff512cc146105df57600080fd5b80633cbc795b1161024a57806352bdeb6d116101fe5780635ec91958116101d85780635ec91958146105a6578063676870d2146105ae5780636b8616ce146105b657600080fd5b806352bdeb6d1461054f578063542028d51461058b5780635e9145c91461059357600080fd5b8063456052671161022f57806345605267146104ed57806349b7b802146105155780634e4877061461053c57600080fd5b80633cbc795b1461045757806340b5de6c1461049557600080fd5b806319d8ac61116102a15780632b35b3ac116102865780632b35b3ac1461040057806332c2d1531461041d5780633c351e101461043257600080fd5b806319d8ac611461038e57806326782247146103bb57600080fd5b806305835f37116102d257806305835f3714610323578063107bf28c1461036c57806311e892d41461037457600080fd5b8062d0295d146102ed5780630350896314610308575b600080fd5b6102f56107f5565b6040519081526020015b60405180910390f35b610310602081565b60405161ffff90911681526020016102ff565b61035f6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102ff919061375f565b61035f610915565b61037c60f981565b60405160ff90911681526020016102ff565b6007546103a29067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102ff565b6001546103db9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102ff565b60085461040d9060ff1681565b60405190151581526020016102ff565b61043061042b3660046137b4565b6109a3565b005b6008546103db90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b600854610480907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102ff565b6104bc7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102ff565b6007546103a290700100000000000000000000000000000000900467ffffffffffffffff1681565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b61043061054a3660046137f6565b610a72565b61035f6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61035f610c8c565b6104306105a136600461385f565b610c99565b6104306115b2565b610310601f81565b6102f56105c43660046137f6565b60066020526000908152604090205481565b6102f560055481565b6104306105ed3660046138ab565b61169c565b6104306106003660046139f4565b611766565b61035f6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610430611f1c565b6103db73a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b61035f610699366004613aa1565b611fef565b6104306106ac3660046138ab565b6123d4565b6102f56405ca1ab1e081565b6007546103a2907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61037c60e481565b610430610703366004613b16565b61249e565b6002546103db9073ffffffffffffffffffffffffffffffffffffffff1681565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6102f5635ca1ab1e81565b610430610768366004613b4b565b612531565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6007546103a29068010000000000000000900467ffffffffffffffff1681565b6104306107c2366004613b8d565b612a68565b61037c601b81565b6000546103db9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610884573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a89190613c05565b6007549091506000906108e79067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613c4d565b67ffffffffffffffff169050806000036109045760009250505090565b61090e8183613c75565b9250505090565b6004805461092290613cb0565b80601f016020809104026020016040519081016040528092919081815260200182805461094e90613cb0565b801561099b5780601f106109705761010080835404028352916020019161099b565b820191906000526020600020905b81548152906001019060200180831161097e57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a12576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a6591815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ac9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b10576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9f9190613d03565b610c085760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c08576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461092290613cb0565b60025473ffffffffffffffffffffffffffffffffffffffff163314610cea576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003610d26576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610d62576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b8581101561119e576000898983818110610dab57610dab613d25565b9050602002810190610dbd9190613d54565b610dc690613d92565b8051805160209091012060608201519192509067ffffffffffffffff1615610f495785610df281613e23565b96505060008183602001518460600151604051602001610e4a93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114610ed3576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015610f29576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055611086565b602082015115801590611010575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015610fea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100e9190613c05565b155b15611047576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611086576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806110b9575042826040015167ffffffffffffffff16115b156110f0576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061119690613e4a565b915050610d8f565b5060075467ffffffffffffffff68010000000000000000909104811690841611156111f5576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691909117909155600583905585908281169085161461132c57600061124c8386613c4d565b905061126267ffffffffffffffff821683613e82565b91506112e37f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661129b6107f5565b6112a59190613e95565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190612e57565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b61142a337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e19190613c05565b6113eb9190613e95565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190612f30565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561149257600080fd5b505af11580156114a6573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af115801561154a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156e9190613eac565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611609576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615611646576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146116f3576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c81565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146117d5576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156117f55750600054600160ff909116105b8061180f5750303b15801561180f575060005460ff166001145b6118a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156118fe57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611b135761192585612f94565b61192e866130a4565b611937876131ab565b60405160200161194993929190613ec9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611a0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2e9190613f02565b915091508163ffffffff16600014611acb57600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff851602179055611b10565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b600854600090611b60908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff1685611fef565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611be0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c049190613c05565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611d7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da39190613eac565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611e359190613f8a565b506004611e428982613f8a565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611ea2939291906140a4565b60405180910390a15050505050508015611f1357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611f6d576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa600087604051602401612023969594939291906140e3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060906000036121745760f9601f83516120b89190614146565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e48760405160200161215e9796959493929190614161565b6040516020818303038152906040529050612278565b815161ffff10156121b1576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96121c0602083614146565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016122659796959493929190614244565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156122d9573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612351576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906123979084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614327565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461242b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c81565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146124f5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036125018282613f8a565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c81919061375f565b60085460ff1661256d576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036125a9576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156125e5576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612620918491700100000000000000000000000000000000900416614383565b1115612658576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b838110156128e757600086868381811061269d5761269d613d25565b90506020028101906126af9190614396565b6126b8906143ca565b9050836126c481613e23565b825180516020918201208185015160408087015190519499509194506000936127269386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89166000908152600690935291205490915081146127af576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86166000908152600660205260408120556127d4600188613e82565b84036128435742600760189054906101000a900467ffffffffffffffff1684604001516128019190614448565b67ffffffffffffffff161115612843576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806128df90613e4a565b915050612681565b506129157f00000000000000000000000000000000000000000000000000000000000000008461129b6107f5565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612a04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a289190613eac565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612aa4576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b359190613c05565b905081811115612b71576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612bad576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612bef73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084612f30565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c809190613c05565b600780549192506801000000000000000090910467ffffffffffffffff16906008612caa83613e23565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612ce1929190614469565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612df1576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612e50565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612e479493929190614479565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052612f2b9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261329e565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612f8e9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612ea9565b50505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161301691906144ea565b600060405180830381855afa9150503d8060008114613051576040519150601f19603f3d011682016040523d82523d6000602084013e613056565b606091505b50915091508161309b576040518060400160405280600781526020017f4e4f5f4e414d45000000000000000000000000000000000000000000000000008152506123cc565b6123cc816133aa565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161312691906144ea565b600060405180830381855afa9150503d8060008114613161576040519150601f19603f3d011682016040523d82523d6000602084013e613166565b606091505b50915091508161309b576040518060400160405280600981526020017f4e4f5f53594d424f4c00000000000000000000000000000000000000000000008152506123cc565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169161322c91906144ea565b600060405180830381855afa9150503d8060008114613267576040519150601f19603f3d011682016040523d82523d6000602084013e61326c565b606091505b509150915081801561327f575080516020145b61328a5760126123cc565b808060200190518101906123cc91906144fc565b6000613300826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166135809092919063ffffffff16565b805190915015612f2b578080602001905181019061331e9190613d03565b612f2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611897565b606060408251106133cf57818060200190518101906133c9919061451f565b92915050565b81516020036135475760005b60208110801561342257508281815181106133f8576133f8613d25565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613439578061343181613e4a565b9150506133db565b8060000361347c57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115613497576134976138da565b6040519080825280601f01601f1916602001820160405280156134c1576020820181803683370190505b50905060005b8281101561353f578481815181106134e1576134e1613d25565b602001015160f81c60f81b8282815181106134fe576134fe613d25565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061353781613e4a565b9150506134c7565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60606123cc8484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516135b491906144ea565b60006040518083038185875af1925050503d80600081146135f1576040519150601f19603f3d011682016040523d82523d6000602084013e6135f6565b606091505b509150915061360787838387613612565b979650505050505050565b606083156136a85782516000036136a15773ffffffffffffffffffffffffffffffffffffffff85163b6136a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611897565b50816123cc565b6123cc83838151156136bd5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611897919061375f565b60005b8381101561370c5781810151838201526020016136f4565b50506000910152565b6000815180845261372d8160208601602086016136f1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006137726020830184613715565b9392505050565b67ffffffffffffffff8116811461378f57600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461378f57600080fd5b6000806000606084860312156137c957600080fd5b83356137d481613779565b92506020840135915060408401356137eb81613792565b809150509250925092565b60006020828403121561380857600080fd5b813561377281613779565b60008083601f84011261382557600080fd5b50813567ffffffffffffffff81111561383d57600080fd5b6020830191508360208260051b850101111561385857600080fd5b9250929050565b60008060006040848603121561387457600080fd5b833567ffffffffffffffff81111561388b57600080fd5b61389786828701613813565b90945092505060208401356137eb81613792565b6000602082840312156138bd57600080fd5b813561377281613792565b63ffffffff8116811461378f57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613950576139506138da565b604052919050565b600067ffffffffffffffff821115613972576139726138da565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126139af57600080fd5b81356139c26139bd82613958565b613909565b8181528460208386010111156139d757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613a0d57600080fd5b8635613a1881613792565b95506020870135613a2881613792565b94506040870135613a38816138c8565b93506060870135613a4881613792565b9250608087013567ffffffffffffffff80821115613a6557600080fd5b613a718a838b0161399e565b935060a0890135915080821115613a8757600080fd5b50613a9489828a0161399e565b9150509295509295509295565b60008060008060808587031215613ab757600080fd5b8435613ac2816138c8565b93506020850135613ad281613792565b92506040850135613ae2816138c8565b9150606085013567ffffffffffffffff811115613afe57600080fd5b613b0a8782880161399e565b91505092959194509250565b600060208284031215613b2857600080fd5b813567ffffffffffffffff811115613b3f57600080fd5b6123cc8482850161399e565b60008060208385031215613b5e57600080fd5b823567ffffffffffffffff811115613b7557600080fd5b613b8185828601613813565b90969095509350505050565b600080600060408486031215613ba257600080fd5b833567ffffffffffffffff80821115613bba57600080fd5b818601915086601f830112613bce57600080fd5b813581811115613bdd57600080fd5b876020828501011115613bef57600080fd5b6020928301989097509590910135949350505050565b600060208284031215613c1757600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613c6e57613c6e613c1e565b5092915050565b600082613cab577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613cc457607f821691505b602082108103613cfd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215613d1557600080fd5b8151801515811461377257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613d8857600080fd5b9190910192915050565b600060808236031215613da457600080fd5b6040516080810167ffffffffffffffff8282108183111715613dc857613dc86138da565b816040528435915080821115613ddd57600080fd5b50613dea3682860161399e565b825250602083013560208201526040830135613e0581613779565b60408201526060830135613e1881613779565b606082015292915050565b600067ffffffffffffffff808316818103613e4057613e40613c1e565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e7b57613e7b613c1e565b5060010190565b818103818111156133c9576133c9613c1e565b80820281158282048414176133c9576133c9613c1e565b600060208284031215613ebe57600080fd5b815161377281613779565b606081526000613edc6060830186613715565b8281036020840152613eee8186613715565b91505060ff83166040830152949350505050565b60008060408385031215613f1557600080fd5b8251613f20816138c8565b6020840151909250613f3181613792565b809150509250929050565b601f821115612f2b57600081815260208120601f850160051c81016020861015613f635750805b601f850160051c820191505b81811015613f8257828155600101613f6f565b505050505050565b815167ffffffffffffffff811115613fa457613fa46138da565b613fb881613fb28454613cb0565b84613f3c565b602080601f83116001811461400b5760008415613fd55750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613f82565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561405857888601518255948401946001909101908401614039565b508582101561409457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006140b76060830186613715565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261413a60c0830184613715565b98975050505050505050565b61ffff818116838216019080821115613c6e57613c6e613c1e565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b16600184015287516141ca816003860160208c016136f1565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161420d816017840160208b016136f1565b808201915050818660f81b166017820152845191506142338260188301602088016136f1565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b16600184015287516142ad816003860160208c016136f1565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516142f0816017840160208b016136f1565b808201915050818660f01b166017820152845191506143168260198301602088016136f1565b016019019998505050505050505050565b60008651614339818460208b016136f1565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b808201808211156133c9576133c9613c1e565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112613d8857600080fd5b6000606082360312156143dc57600080fd5b6040516060810167ffffffffffffffff8282108183111715614400576144006138da565b81604052843591508082111561441557600080fd5b506144223682860161399e565b82525060208301356020820152604083013561443d81613779565b604082015292915050565b67ffffffffffffffff818116838216019080821115613c6e57613c6e613c1e565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b60008251613d888184602087016136f1565b60006020828403121561450e57600080fd5b815160ff8116811461377257600080fd5b60006020828403121561453157600080fd5b815167ffffffffffffffff81111561454857600080fd5b8201601f8101841361455957600080fd5b80516145676139bd82613958565b81815285602083850101111561457c57600080fd5b61458d8260208301602086016136f1565b9594505050505056fea2646970667358221220f3e7ef0428e2730e80cc4130042d31e9b32129000f1f7cb95d1336b5b268b82c64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102e85760003560e01c80636e05d2cd11610191578063c7fffd4b116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b146107b4578063f35dda47146107c7578063f851a440146107cf57600080fd5b8063d8d1091b1461075a578063e46761c41461076d578063e7a7ed021461079457600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610708578063d02103ca14610728578063d7bc90ff1461074f57600080fd5b8063c7fffd4b146106ed578063c89e42df146106f557600080fd5b80639e00187711610145578063ada8f9191161011f578063ada8f9191461069e578063b0afe154146106b1578063c754c7ed146106bd57600080fd5b80639e00187714610649578063a3c573eb14610664578063a652f26c1461068b57600080fd5b8063712570221161017657806371257022146105f25780637a5460c5146106055780638c3d73011461064157600080fd5b80636e05d2cd146105d65780636ff512cc146105df57600080fd5b80633cbc795b1161024a57806352bdeb6d116101fe5780635ec91958116101d85780635ec91958146105a6578063676870d2146105ae5780636b8616ce146105b657600080fd5b806352bdeb6d1461054f578063542028d51461058b5780635e9145c91461059357600080fd5b8063456052671161022f57806345605267146104ed57806349b7b802146105155780634e4877061461053c57600080fd5b80633cbc795b1461045757806340b5de6c1461049557600080fd5b806319d8ac61116102a15780632b35b3ac116102865780632b35b3ac1461040057806332c2d1531461041d5780633c351e101461043257600080fd5b806319d8ac611461038e57806326782247146103bb57600080fd5b806305835f37116102d257806305835f3714610323578063107bf28c1461036c57806311e892d41461037457600080fd5b8062d0295d146102ed5780630350896314610308575b600080fd5b6102f56107f5565b6040519081526020015b60405180910390f35b610310602081565b60405161ffff90911681526020016102ff565b61035f6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102ff919061375f565b61035f610915565b61037c60f981565b60405160ff90911681526020016102ff565b6007546103a29067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102ff565b6001546103db9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102ff565b60085461040d9060ff1681565b60405190151581526020016102ff565b61043061042b3660046137b4565b6109a3565b005b6008546103db90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b600854610480907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102ff565b6104bc7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102ff565b6007546103a290700100000000000000000000000000000000900467ffffffffffffffff1681565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b61043061054a3660046137f6565b610a72565b61035f6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61035f610c8c565b6104306105a136600461385f565b610c99565b6104306115b2565b610310601f81565b6102f56105c43660046137f6565b60066020526000908152604090205481565b6102f560055481565b6104306105ed3660046138ab565b61169c565b6104306106003660046139f4565b611766565b61035f6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610430611f1c565b6103db73a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b61035f610699366004613aa1565b611fef565b6104306106ac3660046138ab565b6123d4565b6102f56405ca1ab1e081565b6007546103a2907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61037c60e481565b610430610703366004613b16565b61249e565b6002546103db9073ffffffffffffffffffffffffffffffffffffffff1681565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6102f5635ca1ab1e81565b610430610768366004613b4b565b612531565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6007546103a29068010000000000000000900467ffffffffffffffff1681565b6104306107c2366004613b8d565b612a68565b61037c601b81565b6000546103db9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610884573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a89190613c05565b6007549091506000906108e79067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613c4d565b67ffffffffffffffff169050806000036109045760009250505090565b61090e8183613c75565b9250505090565b6004805461092290613cb0565b80601f016020809104026020016040519081016040528092919081815260200182805461094e90613cb0565b801561099b5780601f106109705761010080835404028352916020019161099b565b820191906000526020600020905b81548152906001019060200180831161097e57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a12576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a6591815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ac9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b10576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9f9190613d03565b610c085760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c08576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461092290613cb0565b60025473ffffffffffffffffffffffffffffffffffffffff163314610cea576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003610d26576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610d62576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b8581101561119e576000898983818110610dab57610dab613d25565b9050602002810190610dbd9190613d54565b610dc690613d92565b8051805160209091012060608201519192509067ffffffffffffffff1615610f495785610df281613e23565b96505060008183602001518460600151604051602001610e4a93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114610ed3576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015610f29576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055611086565b602082015115801590611010575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015610fea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100e9190613c05565b155b15611047576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611086576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806110b9575042826040015167ffffffffffffffff16115b156110f0576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061119690613e4a565b915050610d8f565b5060075467ffffffffffffffff68010000000000000000909104811690841611156111f5576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691909117909155600583905585908281169085161461132c57600061124c8386613c4d565b905061126267ffffffffffffffff821683613e82565b91506112e37f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661129b6107f5565b6112a59190613e95565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190612e57565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b61142a337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e19190613c05565b6113eb9190613e95565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190612f30565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561149257600080fd5b505af11580156114a6573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af115801561154a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156e9190613eac565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611609576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615611646576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146116f3576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c81565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146117d5576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156117f55750600054600160ff909116105b8061180f5750303b15801561180f575060005460ff166001145b6118a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156118fe57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611b135761192585612f94565b61192e866130a4565b611937876131ab565b60405160200161194993929190613ec9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611a0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2e9190613f02565b915091508163ffffffff16600014611acb57600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff851602179055611b10565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b600854600090611b60908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff1685611fef565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611be0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c049190613c05565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611d7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da39190613eac565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611e359190613f8a565b506004611e428982613f8a565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611ea2939291906140a4565b60405180910390a15050505050508015611f1357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611f6d576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa600087604051602401612023969594939291906140e3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060906000036121745760f9601f83516120b89190614146565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e48760405160200161215e9796959493929190614161565b6040516020818303038152906040529050612278565b815161ffff10156121b1576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96121c0602083614146565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016122659796959493929190614244565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156122d9573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612351576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906123979084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614327565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461242b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c81565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146124f5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036125018282613f8a565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c81919061375f565b60085460ff1661256d576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036125a9576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156125e5576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612620918491700100000000000000000000000000000000900416614383565b1115612658576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b838110156128e757600086868381811061269d5761269d613d25565b90506020028101906126af9190614396565b6126b8906143ca565b9050836126c481613e23565b825180516020918201208185015160408087015190519499509194506000936127269386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89166000908152600690935291205490915081146127af576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86166000908152600660205260408120556127d4600188613e82565b84036128435742600760189054906101000a900467ffffffffffffffff1684604001516128019190614448565b67ffffffffffffffff161115612843576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806128df90613e4a565b915050612681565b506129157f00000000000000000000000000000000000000000000000000000000000000008461129b6107f5565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612a04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a289190613eac565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612aa4576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b359190613c05565b905081811115612b71576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612bad576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612bef73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084612f30565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c809190613c05565b600780549192506801000000000000000090910467ffffffffffffffff16906008612caa83613e23565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612ce1929190614469565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612df1576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612e50565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612e479493929190614479565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052612f2b9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261329e565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612f8e9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612ea9565b50505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161301691906144ea565b600060405180830381855afa9150503d8060008114613051576040519150601f19603f3d011682016040523d82523d6000602084013e613056565b606091505b50915091508161309b576040518060400160405280600781526020017f4e4f5f4e414d45000000000000000000000000000000000000000000000000008152506123cc565b6123cc816133aa565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161312691906144ea565b600060405180830381855afa9150503d8060008114613161576040519150601f19603f3d011682016040523d82523d6000602084013e613166565b606091505b50915091508161309b576040518060400160405280600981526020017f4e4f5f53594d424f4c00000000000000000000000000000000000000000000008152506123cc565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169161322c91906144ea565b600060405180830381855afa9150503d8060008114613267576040519150601f19603f3d011682016040523d82523d6000602084013e61326c565b606091505b509150915081801561327f575080516020145b61328a5760126123cc565b808060200190518101906123cc91906144fc565b6000613300826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166135809092919063ffffffff16565b805190915015612f2b578080602001905181019061331e9190613d03565b612f2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611897565b606060408251106133cf57818060200190518101906133c9919061451f565b92915050565b81516020036135475760005b60208110801561342257508281815181106133f8576133f8613d25565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613439578061343181613e4a565b9150506133db565b8060000361347c57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115613497576134976138da565b6040519080825280601f01601f1916602001820160405280156134c1576020820181803683370190505b50905060005b8281101561353f578481815181106134e1576134e1613d25565b602001015160f81c60f81b8282815181106134fe576134fe613d25565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061353781613e4a565b9150506134c7565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60606123cc8484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516135b491906144ea565b60006040518083038185875af1925050503d80600081146135f1576040519150601f19603f3d011682016040523d82523d6000602084013e6135f6565b606091505b509150915061360787838387613612565b979650505050505050565b606083156136a85782516000036136a15773ffffffffffffffffffffffffffffffffffffffff85163b6136a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611897565b50816123cc565b6123cc83838151156136bd5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611897919061375f565b60005b8381101561370c5781810151838201526020016136f4565b50506000910152565b6000815180845261372d8160208601602086016136f1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006137726020830184613715565b9392505050565b67ffffffffffffffff8116811461378f57600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461378f57600080fd5b6000806000606084860312156137c957600080fd5b83356137d481613779565b92506020840135915060408401356137eb81613792565b809150509250925092565b60006020828403121561380857600080fd5b813561377281613779565b60008083601f84011261382557600080fd5b50813567ffffffffffffffff81111561383d57600080fd5b6020830191508360208260051b850101111561385857600080fd5b9250929050565b60008060006040848603121561387457600080fd5b833567ffffffffffffffff81111561388b57600080fd5b61389786828701613813565b90945092505060208401356137eb81613792565b6000602082840312156138bd57600080fd5b813561377281613792565b63ffffffff8116811461378f57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613950576139506138da565b604052919050565b600067ffffffffffffffff821115613972576139726138da565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126139af57600080fd5b81356139c26139bd82613958565b613909565b8181528460208386010111156139d757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613a0d57600080fd5b8635613a1881613792565b95506020870135613a2881613792565b94506040870135613a38816138c8565b93506060870135613a4881613792565b9250608087013567ffffffffffffffff80821115613a6557600080fd5b613a718a838b0161399e565b935060a0890135915080821115613a8757600080fd5b50613a9489828a0161399e565b9150509295509295509295565b60008060008060808587031215613ab757600080fd5b8435613ac2816138c8565b93506020850135613ad281613792565b92506040850135613ae2816138c8565b9150606085013567ffffffffffffffff811115613afe57600080fd5b613b0a8782880161399e565b91505092959194509250565b600060208284031215613b2857600080fd5b813567ffffffffffffffff811115613b3f57600080fd5b6123cc8482850161399e565b60008060208385031215613b5e57600080fd5b823567ffffffffffffffff811115613b7557600080fd5b613b8185828601613813565b90969095509350505050565b600080600060408486031215613ba257600080fd5b833567ffffffffffffffff80821115613bba57600080fd5b818601915086601f830112613bce57600080fd5b813581811115613bdd57600080fd5b876020828501011115613bef57600080fd5b6020928301989097509590910135949350505050565b600060208284031215613c1757600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613c6e57613c6e613c1e565b5092915050565b600082613cab577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613cc457607f821691505b602082108103613cfd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215613d1557600080fd5b8151801515811461377257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613d8857600080fd5b9190910192915050565b600060808236031215613da457600080fd5b6040516080810167ffffffffffffffff8282108183111715613dc857613dc86138da565b816040528435915080821115613ddd57600080fd5b50613dea3682860161399e565b825250602083013560208201526040830135613e0581613779565b60408201526060830135613e1881613779565b606082015292915050565b600067ffffffffffffffff808316818103613e4057613e40613c1e565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e7b57613e7b613c1e565b5060010190565b818103818111156133c9576133c9613c1e565b80820281158282048414176133c9576133c9613c1e565b600060208284031215613ebe57600080fd5b815161377281613779565b606081526000613edc6060830186613715565b8281036020840152613eee8186613715565b91505060ff83166040830152949350505050565b60008060408385031215613f1557600080fd5b8251613f20816138c8565b6020840151909250613f3181613792565b809150509250929050565b601f821115612f2b57600081815260208120601f850160051c81016020861015613f635750805b601f850160051c820191505b81811015613f8257828155600101613f6f565b505050505050565b815167ffffffffffffffff811115613fa457613fa46138da565b613fb881613fb28454613cb0565b84613f3c565b602080601f83116001811461400b5760008415613fd55750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613f82565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561405857888601518255948401946001909101908401614039565b508582101561409457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006140b76060830186613715565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261413a60c0830184613715565b98975050505050505050565b61ffff818116838216019080821115613c6e57613c6e613c1e565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b16600184015287516141ca816003860160208c016136f1565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161420d816017840160208b016136f1565b808201915050818660f81b166017820152845191506142338260188301602088016136f1565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b16600184015287516142ad816003860160208c016136f1565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516142f0816017840160208b016136f1565b808201915050818660f01b166017820152845191506143168260198301602088016136f1565b016019019998505050505050505050565b60008651614339818460208b016136f1565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b808201808211156133c9576133c9613c1e565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112613d8857600080fd5b6000606082360312156143dc57600080fd5b6040516060810167ffffffffffffffff8282108183111715614400576144006138da565b81604052843591508082111561441557600080fd5b506144223682860161399e565b82525060208301356020820152604083013561443d81613779565b604082015292915050565b67ffffffffffffffff818116838216019080821115613c6e57613c6e613c1e565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b60008251613d888184602087016136f1565b60006020828403121561450e57600080fd5b815160ff8116811461377257600080fd5b60006020828403121561453157600080fd5b815167ffffffffffffffff81111561454857600080fd5b8201601f8101841361455957600080fd5b80516145676139bd82613958565b81815285602083850101111561457c57600080fd5b61458d8260208301602086016136f1565b9594505050505056fea2646970667358221220f3e7ef0428e2730e80cc4130042d31e9b32129000f1f7cb95d1336b5b268b82c64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMV2Existent.json b/compiled-contracts/paris/PolygonZkEVMV2Existent.json index 21a11cad6..9401a42cc 100644 --- a/compiled-contracts/paris/PolygonZkEVMV2Existent.json +++ b/compiled-contracts/paris/PolygonZkEVMV2Existent.json @@ -1147,8 +1147,8 @@ "type": "function" } ], - "bytecode": "0x6101006040523480156200001257600080fd5b5060405162004b1d38038062004b1d833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e051614969620001b460003960008181610525015281816109c301528181610b30015281816112870152818161135001528181611372015281816115090152818161178601528181611d3f015281816124bf01528181612be401528181612cb20152612d9f0152600081816106740152818161144a015281816119e00152818161210f015261221701526000818161074b01528181610faa01528181611b950152612eea0152600081816107900152818161085b015281816112da015281816114200152612ebe01526149696000f3fe608060405234801561001057600080fd5b50600436106102f35760003560e01c80636ff512cc11610191578063c7fffd4b116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b146107d2578063f35dda47146107e5578063f851a440146107ed57600080fd5b8063d8d1091b14610778578063e46761c41461078b578063e7a7ed02146107b257600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610726578063d02103ca14610746578063d7bc90ff1461076d57600080fd5b8063c7fffd4b1461070b578063c89e42df1461071357600080fd5b8063a3c573eb11610145578063b0afe1541161011f578063b0afe154146106bc578063bb590708146106c8578063c754c7ed146106db57600080fd5b8063a3c573eb1461066f578063a652f26c14610696578063ada8f919146106a957600080fd5b80637a5460c5116101765780637a5460c5146106105780638c3d73011461064c5780639e0018771461065457600080fd5b80636ff512cc146105ea57806371257022146105fd57600080fd5b806340b5de6c1161024a578063542028d5116101fe578063676870d2116101d8578063676870d2146105b95780636b8616ce146105c15780636e05d2cd146105e157600080fd5b8063542028d5146105965780635e9145c91461059e5780635ec91958146105b157600080fd5b806349b7b8021161022f57806349b7b802146105205780634e4877061461054757806352bdeb6d1461055a57600080fd5b806340b5de6c146104a057806345605267146104f857600080fd5b806319d8ac61116102ac57806332c2d1531161028657806332c2d153146104285780633c351e101461043d5780633cbc795b1461046257600080fd5b806319d8ac611461039957806326782247146103c65780632b35b3ac1461040b57600080fd5b806305835f37116102dd57806305835f371461032e578063107bf28c1461037757806311e892d41461037f57600080fd5b8062d0295d146102f85780630350896314610313575b600080fd5b610300610813565b6040519081526020015b60405180910390f35b61031b602081565b60405161ffff909116815260200161030a565b61036a6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161030a9190613a56565b61036a610933565b61038760f981565b60405160ff909116815260200161030a565b6007546103ad9067ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161030a565b6001546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161030a565b6008546104189060ff1681565b604051901515815260200161030a565b61043b610436366004613aab565b6109c1565b005b6008546103e690610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60085461048b907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161030a565b6104c77fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161030a565b6007546103ad90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b61043b610555366004613aed565b610a90565b61036a6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61036a610caa565b61043b6105ac366004613b56565b610cb7565b61043b6115d0565b61031b601f81565b6103006105cf366004613aed565b60066020526000908152604090205481565b61030060055481565b61043b6105f8366004613ba2565b6116ba565b61043b61060b366004613ceb565b611784565b61036a6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61043b611f3b565b6103e673a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b61036a6106a4366004613d98565b61200e565b61043b6106b7366004613ba2565b6123f3565b6103006405ca1ab1e081565b61043b6106d6366004613e0d565b6124bd565b6007546103ad907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61038760e481565b61043b610721366004613eb3565b612795565b6002546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b610300635ca1ab1e81565b61043b610786366004613ee8565b612828565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b6007546103ad9068010000000000000000900467ffffffffffffffff1681565b61043b6107e0366004613f2a565b612d5f565b610387601b81565b6000546103e69062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156108a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c69190613fa2565b6007549091506000906109059067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613fea565b67ffffffffffffffff169050806000036109225760009250505090565b61092c8183614012565b9250505090565b600480546109409061404d565b80601f016020809104026020016040519081016040528092919081815260200182805461096c9061404d565b80156109b95780601f1061098e576101008083540402835291602001916109b9565b820191906000526020600020905b81548152906001019060200180831161099c57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a30576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a8391815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ae7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b2e576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbd91906140a0565b610c265760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c26576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546109409061404d565b60025473ffffffffffffffffffffffffffffffffffffffff163314610d08576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003610d44576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610d80576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156111bc576000898983818110610dc957610dc96140c2565b9050602002810190610ddb91906140f1565b610de49061412f565b8051805160209091012060608201519192509067ffffffffffffffff1615610f675785610e10816141c0565b96505060008183602001518460600151604051602001610e6893929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114610ef1576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015610f47576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86166000908152600660205260408120556110a4565b60208201511580159061102e575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015611008573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102c9190613fa2565b155b15611065576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156110a4576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806110d7575042826040015167ffffffffffffffff16115b1561110e576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519650505080806111b4906141e7565b915050610dad565b5060075467ffffffffffffffff6801000000000000000090910481169084161115611213576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691909117909155600583905585908281169085161461134a57600061126a8386613fea565b905061128067ffffffffffffffff82168361421f565b91506113017f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166112b9610813565b6112c39190614232565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016919061314e565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611448337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ff9190613fa2565b6114099190614232565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613227565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156114b057600080fd5b505af11580156114c4573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af1158015611568573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158c9190614249565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611627576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615611664576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611711576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c9f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146117f3576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156118135750600054600160ff909116105b8061182d5750303b15801561182d575060005460ff166001145b6118be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561191c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611b31576119438561328b565b61194c8661339b565b611955876134a2565b60405160200161196793929190614266565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611a28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4c919061429f565b915091508163ffffffff16600014611ae957600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff851602179055611b2e565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b600854600090611b7e908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff168561200e565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c229190613fa2565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611d9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc19190614249565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611e539190614327565b506004611e608982614327565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611ec093929190614441565b60405180910390a15050505050508015611f3257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611f8c576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa60008760405160240161204296959493929190614480565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060906000036121935760f9601f83516120d791906144e3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e48760405160200161217d97969594939291906144fe565b6040516020818303038152906040529050612297565b815161ffff10156121d0576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96121df6020836144e3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b9000000000000000000000000000000000000000000000000000000000000815250858860405160200161228497969594939291906145e1565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156122f8573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612370576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906123b69084906405ca1ab1e090635ca1ab1e90601b907fff00000000000000000000000000000000000000000000000000000000000000906020016146c4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461244a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c9f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461252c576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff161580801561254c5750600054600160ff909116105b806125665750303b158015612566575060005460ff166001145b6125f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016118b5565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561265057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8a81169190910291909117909155600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001691881691909117905560036126d88682614327565b5060046126e58582614327565b506005839055600780547a06978000000000000000000000000000000000000000000000000077ffffffffffffffffffffffffffffffff000000000000000090911667ffffffffffffffff8516171790558015611f3257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611f29565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146127ec576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036127f88282614327565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c9f9190613a56565b60085460ff16612864576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036128a0576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156128dc576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612917918491700100000000000000000000000000000000900416614720565b111561294f576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015612bde576000868683818110612994576129946140c2565b90506020028101906129a69190614733565b6129af90614767565b9050836129bb816141c0565b82518051602091820120818501516040808701519051949950919450600093612a1d9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612aa6576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055612acb60018861421f565b8403612b3a5742600760189054906101000a900467ffffffffffffffff168460400151612af891906147e5565b67ffffffffffffffff161115612b3a576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080612bd6906141e7565b915050612978565b50612c0c7f0000000000000000000000000000000000000000000000000000000000000000846112b9610813565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612cfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d1f9190614249565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612d9b576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e2c9190613fa2565b905081811115612e68576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612ea4576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ee673ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613227565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f779190613fa2565b600780549192506801000000000000000090910467ffffffffffffffff16906008612fa1836141c0565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612fd8929190614806565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff16600090815260069093529120553233036130e8576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613147565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9318233888860405161313e9493929190614816565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526132229084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613595565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526132859085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016131a0565b50505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161330d9190614887565b600060405180830381855afa9150503d8060008114613348576040519150601f19603f3d011682016040523d82523d6000602084013e61334d565b606091505b509150915081613392576040518060400160405280600781526020017f4e4f5f4e414d45000000000000000000000000000000000000000000000000008152506123eb565b6123eb816136a1565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161341d9190614887565b600060405180830381855afa9150503d8060008114613458576040519150601f19603f3d011682016040523d82523d6000602084013e61345d565b606091505b509150915081613392576040518060400160405280600981526020017f4e4f5f53594d424f4c00000000000000000000000000000000000000000000008152506123eb565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8616916135239190614887565b600060405180830381855afa9150503d806000811461355e576040519150601f19603f3d011682016040523d82523d6000602084013e613563565b606091505b5091509150818015613576575080516020145b6135815760126123eb565b808060200190518101906123eb9190614899565b60006135f7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166138779092919063ffffffff16565b805190915015613222578080602001905181019061361591906140a0565b613222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016118b5565b606060408251106136c657818060200190518101906136c091906148bc565b92915050565b815160200361383e5760005b60208110801561371957508281815181106136ef576136ef6140c2565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b156137305780613728816141e7565b9150506136d2565b8060000361377357505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111561378e5761378e613bd1565b6040519080825280601f01601f1916602001820160405280156137b8576020820181803683370190505b50905060005b82811015613836578481815181106137d8576137d86140c2565b602001015160f81c60f81b8282815181106137f5576137f56140c2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061382e816141e7565b9150506137be565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60606123eb8484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516138ab9190614887565b60006040518083038185875af1925050503d80600081146138e8576040519150601f19603f3d011682016040523d82523d6000602084013e6138ed565b606091505b50915091506138fe87838387613909565b979650505050505050565b6060831561399f5782516000036139985773ffffffffffffffffffffffffffffffffffffffff85163b613998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016118b5565b50816123eb565b6123eb83838151156139b45781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b59190613a56565b60005b83811015613a035781810151838201526020016139eb565b50506000910152565b60008151808452613a248160208601602086016139e8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613a696020830184613a0c565b9392505050565b67ffffffffffffffff81168114613a8657600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613a8657600080fd5b600080600060608486031215613ac057600080fd5b8335613acb81613a70565b9250602084013591506040840135613ae281613a89565b809150509250925092565b600060208284031215613aff57600080fd5b8135613a6981613a70565b60008083601f840112613b1c57600080fd5b50813567ffffffffffffffff811115613b3457600080fd5b6020830191508360208260051b8501011115613b4f57600080fd5b9250929050565b600080600060408486031215613b6b57600080fd5b833567ffffffffffffffff811115613b8257600080fd5b613b8e86828701613b0a565b9094509250506020840135613ae281613a89565b600060208284031215613bb457600080fd5b8135613a6981613a89565b63ffffffff81168114613a8657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613c4757613c47613bd1565b604052919050565b600067ffffffffffffffff821115613c6957613c69613bd1565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613ca657600080fd5b8135613cb9613cb482613c4f565b613c00565b818152846020838601011115613cce57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613d0457600080fd5b8635613d0f81613a89565b95506020870135613d1f81613a89565b94506040870135613d2f81613bbf565b93506060870135613d3f81613a89565b9250608087013567ffffffffffffffff80821115613d5c57600080fd5b613d688a838b01613c95565b935060a0890135915080821115613d7e57600080fd5b50613d8b89828a01613c95565b9150509295509295509295565b60008060008060808587031215613dae57600080fd5b8435613db981613bbf565b93506020850135613dc981613a89565b92506040850135613dd981613bbf565b9150606085013567ffffffffffffffff811115613df557600080fd5b613e0187828801613c95565b91505092959194509250565b60008060008060008060c08789031215613e2657600080fd5b8635613e3181613a89565b95506020870135613e4181613a89565b9450604087013567ffffffffffffffff80821115613e5e57600080fd5b613e6a8a838b01613c95565b95506060890135915080821115613e8057600080fd5b50613e8d89828a01613c95565b9350506080870135915060a0870135613ea581613a70565b809150509295509295509295565b600060208284031215613ec557600080fd5b813567ffffffffffffffff811115613edc57600080fd5b6123eb84828501613c95565b60008060208385031215613efb57600080fd5b823567ffffffffffffffff811115613f1257600080fd5b613f1e85828601613b0a565b90969095509350505050565b600080600060408486031215613f3f57600080fd5b833567ffffffffffffffff80821115613f5757600080fd5b818601915086601f830112613f6b57600080fd5b813581811115613f7a57600080fd5b876020828501011115613f8c57600080fd5b6020928301989097509590910135949350505050565b600060208284031215613fb457600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff82811682821603908082111561400b5761400b613fbb565b5092915050565b600082614048577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061406157607f821691505b60208210810361409a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000602082840312156140b257600080fd5b81518015158114613a6957600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261412557600080fd5b9190910192915050565b60006080823603121561414157600080fd5b6040516080810167ffffffffffffffff828210818311171561416557614165613bd1565b81604052843591508082111561417a57600080fd5b5061418736828601613c95565b8252506020830135602082015260408301356141a281613a70565b604082015260608301356141b581613a70565b606082015292915050565b600067ffffffffffffffff8083168181036141dd576141dd613fbb565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361421857614218613fbb565b5060010190565b818103818111156136c0576136c0613fbb565b80820281158282048414176136c0576136c0613fbb565b60006020828403121561425b57600080fd5b8151613a6981613a70565b6060815260006142796060830186613a0c565b828103602084015261428b8186613a0c565b91505060ff83166040830152949350505050565b600080604083850312156142b257600080fd5b82516142bd81613bbf565b60208401519092506142ce81613a89565b809150509250929050565b601f82111561322257600081815260208120601f850160051c810160208610156143005750805b601f850160051c820191505b8181101561431f5782815560010161430c565b505050505050565b815167ffffffffffffffff81111561434157614341613bd1565b6143558161434f845461404d565b846142d9565b602080601f8311600181146143a857600084156143725750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561431f565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156143f5578886015182559484019460019091019084016143d6565b508582101561443157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006144546060830186613a0c565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a08301526144d760c0830184613a0c565b98975050505050505050565b61ffff81811683821601908082111561400b5761400b613fbb565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614567816003860160208c016139e8565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516145aa816017840160208b016139e8565b808201915050818660f81b166017820152845191506145d08260188301602088016139e8565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b166001840152875161464a816003860160208c016139e8565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161468d816017840160208b016139e8565b808201915050818660f01b166017820152845191506146b38260198301602088016139e8565b016019019998505050505050505050565b600086516146d6818460208b016139e8565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b808201808211156136c0576136c0613fbb565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261412557600080fd5b60006060823603121561477957600080fd5b6040516060810167ffffffffffffffff828210818311171561479d5761479d613bd1565b8160405284359150808211156147b257600080fd5b506147bf36828601613c95565b8252506020830135602082015260408301356147da81613a70565b604082015292915050565b67ffffffffffffffff81811683821601908082111561400b5761400b613fbb565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b600082516141258184602087016139e8565b6000602082840312156148ab57600080fd5b815160ff81168114613a6957600080fd5b6000602082840312156148ce57600080fd5b815167ffffffffffffffff8111156148e557600080fd5b8201601f810184136148f657600080fd5b8051614904613cb482613c4f565b81815285602083850101111561491957600080fd5b61492a8260208301602086016139e8565b9594505050505056fea2646970667358221220492dfbc7c1b97148aa44a030fb00678b20ce0fdd3241269fe81eb4228a6add5664736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102f35760003560e01c80636ff512cc11610191578063c7fffd4b116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b146107d2578063f35dda47146107e5578063f851a440146107ed57600080fd5b8063d8d1091b14610778578063e46761c41461078b578063e7a7ed02146107b257600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610726578063d02103ca14610746578063d7bc90ff1461076d57600080fd5b8063c7fffd4b1461070b578063c89e42df1461071357600080fd5b8063a3c573eb11610145578063b0afe1541161011f578063b0afe154146106bc578063bb590708146106c8578063c754c7ed146106db57600080fd5b8063a3c573eb1461066f578063a652f26c14610696578063ada8f919146106a957600080fd5b80637a5460c5116101765780637a5460c5146106105780638c3d73011461064c5780639e0018771461065457600080fd5b80636ff512cc146105ea57806371257022146105fd57600080fd5b806340b5de6c1161024a578063542028d5116101fe578063676870d2116101d8578063676870d2146105b95780636b8616ce146105c15780636e05d2cd146105e157600080fd5b8063542028d5146105965780635e9145c91461059e5780635ec91958146105b157600080fd5b806349b7b8021161022f57806349b7b802146105205780634e4877061461054757806352bdeb6d1461055a57600080fd5b806340b5de6c146104a057806345605267146104f857600080fd5b806319d8ac61116102ac57806332c2d1531161028657806332c2d153146104285780633c351e101461043d5780633cbc795b1461046257600080fd5b806319d8ac611461039957806326782247146103c65780632b35b3ac1461040b57600080fd5b806305835f37116102dd57806305835f371461032e578063107bf28c1461037757806311e892d41461037f57600080fd5b8062d0295d146102f85780630350896314610313575b600080fd5b610300610813565b6040519081526020015b60405180910390f35b61031b602081565b60405161ffff909116815260200161030a565b61036a6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161030a9190613a56565b61036a610933565b61038760f981565b60405160ff909116815260200161030a565b6007546103ad9067ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161030a565b6001546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161030a565b6008546104189060ff1681565b604051901515815260200161030a565b61043b610436366004613aab565b6109c1565b005b6008546103e690610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60085461048b907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161030a565b6104c77fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161030a565b6007546103ad90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b61043b610555366004613aed565b610a90565b61036a6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61036a610caa565b61043b6105ac366004613b56565b610cb7565b61043b6115d0565b61031b601f81565b6103006105cf366004613aed565b60066020526000908152604090205481565b61030060055481565b61043b6105f8366004613ba2565b6116ba565b61043b61060b366004613ceb565b611784565b61036a6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61043b611f3b565b6103e673a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b61036a6106a4366004613d98565b61200e565b61043b6106b7366004613ba2565b6123f3565b6103006405ca1ab1e081565b61043b6106d6366004613e0d565b6124bd565b6007546103ad907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61038760e481565b61043b610721366004613eb3565b612795565b6002546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b610300635ca1ab1e81565b61043b610786366004613ee8565b612828565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b6007546103ad9068010000000000000000900467ffffffffffffffff1681565b61043b6107e0366004613f2a565b612d5f565b610387601b81565b6000546103e69062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156108a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c69190613fa2565b6007549091506000906109059067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613fea565b67ffffffffffffffff169050806000036109225760009250505090565b61092c8183614012565b9250505090565b600480546109409061404d565b80601f016020809104026020016040519081016040528092919081815260200182805461096c9061404d565b80156109b95780601f1061098e576101008083540402835291602001916109b9565b820191906000526020600020905b81548152906001019060200180831161099c57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a30576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a8391815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ae7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b2e576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbd91906140a0565b610c265760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c26576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546109409061404d565b60025473ffffffffffffffffffffffffffffffffffffffff163314610d08576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003610d44576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610d80576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156111bc576000898983818110610dc957610dc96140c2565b9050602002810190610ddb91906140f1565b610de49061412f565b8051805160209091012060608201519192509067ffffffffffffffff1615610f675785610e10816141c0565b96505060008183602001518460600151604051602001610e6893929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114610ef1576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015610f47576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86166000908152600660205260408120556110a4565b60208201511580159061102e575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015611008573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102c9190613fa2565b155b15611065576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156110a4576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806110d7575042826040015167ffffffffffffffff16115b1561110e576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519650505080806111b4906141e7565b915050610dad565b5060075467ffffffffffffffff6801000000000000000090910481169084161115611213576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691909117909155600583905585908281169085161461134a57600061126a8386613fea565b905061128067ffffffffffffffff82168361421f565b91506113017f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166112b9610813565b6112c39190614232565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016919061314e565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611448337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ff9190613fa2565b6114099190614232565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613227565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156114b057600080fd5b505af11580156114c4573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af1158015611568573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158c9190614249565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611627576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615611664576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611711576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c9f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146117f3576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156118135750600054600160ff909116105b8061182d5750303b15801561182d575060005460ff166001145b6118be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561191c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611b31576119438561328b565b61194c8661339b565b611955876134a2565b60405160200161196793929190614266565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611a28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4c919061429f565b915091508163ffffffff16600014611ae957600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff851602179055611b2e565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b600854600090611b7e908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff168561200e565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c229190613fa2565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611d9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc19190614249565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611e539190614327565b506004611e608982614327565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611ec093929190614441565b60405180910390a15050505050508015611f3257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611f8c576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa60008760405160240161204296959493929190614480565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060906000036121935760f9601f83516120d791906144e3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e48760405160200161217d97969594939291906144fe565b6040516020818303038152906040529050612297565b815161ffff10156121d0576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96121df6020836144e3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b9000000000000000000000000000000000000000000000000000000000000815250858860405160200161228497969594939291906145e1565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156122f8573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612370576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906123b69084906405ca1ab1e090635ca1ab1e90601b907fff00000000000000000000000000000000000000000000000000000000000000906020016146c4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461244a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c9f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461252c576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff161580801561254c5750600054600160ff909116105b806125665750303b158015612566575060005460ff166001145b6125f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016118b5565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561265057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8a81169190910291909117909155600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001691881691909117905560036126d88682614327565b5060046126e58582614327565b506005839055600780547a06978000000000000000000000000000000000000000000000000077ffffffffffffffffffffffffffffffff000000000000000090911667ffffffffffffffff8516171790558015611f3257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611f29565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146127ec576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036127f88282614327565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c9f9190613a56565b60085460ff16612864576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036128a0576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156128dc576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612917918491700100000000000000000000000000000000900416614720565b111561294f576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015612bde576000868683818110612994576129946140c2565b90506020028101906129a69190614733565b6129af90614767565b9050836129bb816141c0565b82518051602091820120818501516040808701519051949950919450600093612a1d9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612aa6576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055612acb60018861421f565b8403612b3a5742600760189054906101000a900467ffffffffffffffff168460400151612af891906147e5565b67ffffffffffffffff161115612b3a576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080612bd6906141e7565b915050612978565b50612c0c7f0000000000000000000000000000000000000000000000000000000000000000846112b9610813565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612cfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d1f9190614249565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612d9b576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e2c9190613fa2565b905081811115612e68576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612ea4576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ee673ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613227565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f779190613fa2565b600780549192506801000000000000000090910467ffffffffffffffff16906008612fa1836141c0565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612fd8929190614806565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff16600090815260069093529120553233036130e8576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613147565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9318233888860405161313e9493929190614816565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526132229084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613595565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526132859085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016131a0565b50505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161330d9190614887565b600060405180830381855afa9150503d8060008114613348576040519150601f19603f3d011682016040523d82523d6000602084013e61334d565b606091505b509150915081613392576040518060400160405280600781526020017f4e4f5f4e414d45000000000000000000000000000000000000000000000000008152506123eb565b6123eb816136a1565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161341d9190614887565b600060405180830381855afa9150503d8060008114613458576040519150601f19603f3d011682016040523d82523d6000602084013e61345d565b606091505b509150915081613392576040518060400160405280600981526020017f4e4f5f53594d424f4c00000000000000000000000000000000000000000000008152506123eb565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8616916135239190614887565b600060405180830381855afa9150503d806000811461355e576040519150601f19603f3d011682016040523d82523d6000602084013e613563565b606091505b5091509150818015613576575080516020145b6135815760126123eb565b808060200190518101906123eb9190614899565b60006135f7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166138779092919063ffffffff16565b805190915015613222578080602001905181019061361591906140a0565b613222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016118b5565b606060408251106136c657818060200190518101906136c091906148bc565b92915050565b815160200361383e5760005b60208110801561371957508281815181106136ef576136ef6140c2565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b156137305780613728816141e7565b9150506136d2565b8060000361377357505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111561378e5761378e613bd1565b6040519080825280601f01601f1916602001820160405280156137b8576020820181803683370190505b50905060005b82811015613836578481815181106137d8576137d86140c2565b602001015160f81c60f81b8282815181106137f5576137f56140c2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061382e816141e7565b9150506137be565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60606123eb8484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516138ab9190614887565b60006040518083038185875af1925050503d80600081146138e8576040519150601f19603f3d011682016040523d82523d6000602084013e6138ed565b606091505b50915091506138fe87838387613909565b979650505050505050565b6060831561399f5782516000036139985773ffffffffffffffffffffffffffffffffffffffff85163b613998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016118b5565b50816123eb565b6123eb83838151156139b45781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b59190613a56565b60005b83811015613a035781810151838201526020016139eb565b50506000910152565b60008151808452613a248160208601602086016139e8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613a696020830184613a0c565b9392505050565b67ffffffffffffffff81168114613a8657600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613a8657600080fd5b600080600060608486031215613ac057600080fd5b8335613acb81613a70565b9250602084013591506040840135613ae281613a89565b809150509250925092565b600060208284031215613aff57600080fd5b8135613a6981613a70565b60008083601f840112613b1c57600080fd5b50813567ffffffffffffffff811115613b3457600080fd5b6020830191508360208260051b8501011115613b4f57600080fd5b9250929050565b600080600060408486031215613b6b57600080fd5b833567ffffffffffffffff811115613b8257600080fd5b613b8e86828701613b0a565b9094509250506020840135613ae281613a89565b600060208284031215613bb457600080fd5b8135613a6981613a89565b63ffffffff81168114613a8657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613c4757613c47613bd1565b604052919050565b600067ffffffffffffffff821115613c6957613c69613bd1565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613ca657600080fd5b8135613cb9613cb482613c4f565b613c00565b818152846020838601011115613cce57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613d0457600080fd5b8635613d0f81613a89565b95506020870135613d1f81613a89565b94506040870135613d2f81613bbf565b93506060870135613d3f81613a89565b9250608087013567ffffffffffffffff80821115613d5c57600080fd5b613d688a838b01613c95565b935060a0890135915080821115613d7e57600080fd5b50613d8b89828a01613c95565b9150509295509295509295565b60008060008060808587031215613dae57600080fd5b8435613db981613bbf565b93506020850135613dc981613a89565b92506040850135613dd981613bbf565b9150606085013567ffffffffffffffff811115613df557600080fd5b613e0187828801613c95565b91505092959194509250565b60008060008060008060c08789031215613e2657600080fd5b8635613e3181613a89565b95506020870135613e4181613a89565b9450604087013567ffffffffffffffff80821115613e5e57600080fd5b613e6a8a838b01613c95565b95506060890135915080821115613e8057600080fd5b50613e8d89828a01613c95565b9350506080870135915060a0870135613ea581613a70565b809150509295509295509295565b600060208284031215613ec557600080fd5b813567ffffffffffffffff811115613edc57600080fd5b6123eb84828501613c95565b60008060208385031215613efb57600080fd5b823567ffffffffffffffff811115613f1257600080fd5b613f1e85828601613b0a565b90969095509350505050565b600080600060408486031215613f3f57600080fd5b833567ffffffffffffffff80821115613f5757600080fd5b818601915086601f830112613f6b57600080fd5b813581811115613f7a57600080fd5b876020828501011115613f8c57600080fd5b6020928301989097509590910135949350505050565b600060208284031215613fb457600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff82811682821603908082111561400b5761400b613fbb565b5092915050565b600082614048577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061406157607f821691505b60208210810361409a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000602082840312156140b257600080fd5b81518015158114613a6957600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261412557600080fd5b9190910192915050565b60006080823603121561414157600080fd5b6040516080810167ffffffffffffffff828210818311171561416557614165613bd1565b81604052843591508082111561417a57600080fd5b5061418736828601613c95565b8252506020830135602082015260408301356141a281613a70565b604082015260608301356141b581613a70565b606082015292915050565b600067ffffffffffffffff8083168181036141dd576141dd613fbb565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361421857614218613fbb565b5060010190565b818103818111156136c0576136c0613fbb565b80820281158282048414176136c0576136c0613fbb565b60006020828403121561425b57600080fd5b8151613a6981613a70565b6060815260006142796060830186613a0c565b828103602084015261428b8186613a0c565b91505060ff83166040830152949350505050565b600080604083850312156142b257600080fd5b82516142bd81613bbf565b60208401519092506142ce81613a89565b809150509250929050565b601f82111561322257600081815260208120601f850160051c810160208610156143005750805b601f850160051c820191505b8181101561431f5782815560010161430c565b505050505050565b815167ffffffffffffffff81111561434157614341613bd1565b6143558161434f845461404d565b846142d9565b602080601f8311600181146143a857600084156143725750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561431f565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156143f5578886015182559484019460019091019084016143d6565b508582101561443157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006144546060830186613a0c565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a08301526144d760c0830184613a0c565b98975050505050505050565b61ffff81811683821601908082111561400b5761400b613fbb565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614567816003860160208c016139e8565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516145aa816017840160208b016139e8565b808201915050818660f81b166017820152845191506145d08260188301602088016139e8565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b166001840152875161464a816003860160208c016139e8565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161468d816017840160208b016139e8565b808201915050818660f01b166017820152845191506146b38260198301602088016139e8565b016019019998505050505050505050565b600086516146d6818460208b016139e8565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b808201808211156136c0576136c0613fbb565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261412557600080fd5b60006060823603121561477957600080fd5b6040516060810167ffffffffffffffff828210818311171561479d5761479d613bd1565b8160405284359150808211156147b257600080fd5b506147bf36828601613c95565b8252506020830135602082015260408301356147da81613a70565b604082015292915050565b67ffffffffffffffff81811683821601908082111561400b5761400b613fbb565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b600082516141258184602087016139e8565b6000602082840312156148ab57600080fd5b815160ff81168114613a6957600080fd5b6000602082840312156148ce57600080fd5b815167ffffffffffffffff8111156148e557600080fd5b8201601f810184136148f657600080fd5b8051614904613cb482613c4f565b81815285602083850101111561491957600080fd5b61492a8260208301602086016139e8565b9594505050505056fea2646970667358221220492dfbc7c1b97148aa44a030fb00678b20ce0fdd3241269fe81eb4228a6add5664736f6c63430008140033", + "bytecode": "0x6101006040523480156200001257600080fd5b5060405162004b1d38038062004b1d833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e051614969620001b460003960008181610525015281816109c301528181610b30015281816112870152818161135001528181611372015281816115090152818161178601528181611d3f015281816124bf01528181612be401528181612cb20152612d9f0152600081816106740152818161144a015281816119e00152818161210f015261221701526000818161074b01528181610faa01528181611b950152612eea0152600081816107900152818161085b015281816112da015281816114200152612ebe01526149696000f3fe608060405234801561001057600080fd5b50600436106102f35760003560e01c80636ff512cc11610191578063c7fffd4b116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b146107d2578063f35dda47146107e5578063f851a440146107ed57600080fd5b8063d8d1091b14610778578063e46761c41461078b578063e7a7ed02146107b257600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610726578063d02103ca14610746578063d7bc90ff1461076d57600080fd5b8063c7fffd4b1461070b578063c89e42df1461071357600080fd5b8063a3c573eb11610145578063b0afe1541161011f578063b0afe154146106bc578063bb590708146106c8578063c754c7ed146106db57600080fd5b8063a3c573eb1461066f578063a652f26c14610696578063ada8f919146106a957600080fd5b80637a5460c5116101765780637a5460c5146106105780638c3d73011461064c5780639e0018771461065457600080fd5b80636ff512cc146105ea57806371257022146105fd57600080fd5b806340b5de6c1161024a578063542028d5116101fe578063676870d2116101d8578063676870d2146105b95780636b8616ce146105c15780636e05d2cd146105e157600080fd5b8063542028d5146105965780635e9145c91461059e5780635ec91958146105b157600080fd5b806349b7b8021161022f57806349b7b802146105205780634e4877061461054757806352bdeb6d1461055a57600080fd5b806340b5de6c146104a057806345605267146104f857600080fd5b806319d8ac61116102ac57806332c2d1531161028657806332c2d153146104285780633c351e101461043d5780633cbc795b1461046257600080fd5b806319d8ac611461039957806326782247146103c65780632b35b3ac1461040b57600080fd5b806305835f37116102dd57806305835f371461032e578063107bf28c1461037757806311e892d41461037f57600080fd5b8062d0295d146102f85780630350896314610313575b600080fd5b610300610813565b6040519081526020015b60405180910390f35b61031b602081565b60405161ffff909116815260200161030a565b61036a6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161030a9190613a56565b61036a610933565b61038760f981565b60405160ff909116815260200161030a565b6007546103ad9067ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161030a565b6001546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161030a565b6008546104189060ff1681565b604051901515815260200161030a565b61043b610436366004613aab565b6109c1565b005b6008546103e690610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60085461048b907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161030a565b6104c77fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161030a565b6007546103ad90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b61043b610555366004613aed565b610a90565b61036a6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61036a610caa565b61043b6105ac366004613b56565b610cb7565b61043b6115d0565b61031b601f81565b6103006105cf366004613aed565b60066020526000908152604090205481565b61030060055481565b61043b6105f8366004613ba2565b6116ba565b61043b61060b366004613ceb565b611784565b61036a6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61043b611f3b565b6103e673a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b61036a6106a4366004613d98565b61200e565b61043b6106b7366004613ba2565b6123f3565b6103006405ca1ab1e081565b61043b6106d6366004613e0d565b6124bd565b6007546103ad907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61038760e481565b61043b610721366004613eb3565b612795565b6002546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b610300635ca1ab1e81565b61043b610786366004613ee8565b612828565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b6007546103ad9068010000000000000000900467ffffffffffffffff1681565b61043b6107e0366004613f2a565b612d5f565b610387601b81565b6000546103e69062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156108a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c69190613fa2565b6007549091506000906109059067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613fea565b67ffffffffffffffff169050806000036109225760009250505090565b61092c8183614012565b9250505090565b600480546109409061404d565b80601f016020809104026020016040519081016040528092919081815260200182805461096c9061404d565b80156109b95780601f1061098e576101008083540402835291602001916109b9565b820191906000526020600020905b81548152906001019060200180831161099c57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a30576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a8391815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ae7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b2e576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbd91906140a0565b610c265760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c26576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546109409061404d565b60025473ffffffffffffffffffffffffffffffffffffffff163314610d08576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003610d44576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610d80576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156111bc576000898983818110610dc957610dc96140c2565b9050602002810190610ddb91906140f1565b610de49061412f565b8051805160209091012060608201519192509067ffffffffffffffff1615610f675785610e10816141c0565b96505060008183602001518460600151604051602001610e6893929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114610ef1576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015610f47576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86166000908152600660205260408120556110a4565b60208201511580159061102e575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015611008573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102c9190613fa2565b155b15611065576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156110a4576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806110d7575042826040015167ffffffffffffffff16115b1561110e576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519650505080806111b4906141e7565b915050610dad565b5060075467ffffffffffffffff6801000000000000000090910481169084161115611213576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691909117909155600583905585908281169085161461134a57600061126a8386613fea565b905061128067ffffffffffffffff82168361421f565b91506113017f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166112b9610813565b6112c39190614232565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016919061314e565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611448337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ff9190613fa2565b6114099190614232565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613227565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156114b057600080fd5b505af11580156114c4573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af1158015611568573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158c9190614249565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611627576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615611664576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611711576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c9f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146117f3576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156118135750600054600160ff909116105b8061182d5750303b15801561182d575060005460ff166001145b6118be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561191c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611b31576119438561328b565b61194c8661339b565b611955876134a2565b60405160200161196793929190614266565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611a28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4c919061429f565b915091508163ffffffff16600014611ae957600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff851602179055611b2e565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b600854600090611b7e908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff168561200e565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c229190613fa2565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611d9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc19190614249565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611e539190614327565b506004611e608982614327565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611ec093929190614441565b60405180910390a15050505050508015611f3257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611f8c576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa60008760405160240161204296959493929190614480565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060906000036121935760f9601f83516120d791906144e3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e48760405160200161217d97969594939291906144fe565b6040516020818303038152906040529050612297565b815161ffff10156121d0576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96121df6020836144e3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b9000000000000000000000000000000000000000000000000000000000000815250858860405160200161228497969594939291906145e1565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156122f8573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612370576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906123b69084906405ca1ab1e090635ca1ab1e90601b907fff00000000000000000000000000000000000000000000000000000000000000906020016146c4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461244a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c9f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461252c576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff161580801561254c5750600054600160ff909116105b806125665750303b158015612566575060005460ff166001145b6125f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016118b5565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561265057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8a81169190910291909117909155600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001691881691909117905560036126d88682614327565b5060046126e58582614327565b506005839055600780547a06978000000000000000000000000000000000000000000000000077ffffffffffffffffffffffffffffffff000000000000000090911667ffffffffffffffff8516171790558015611f3257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611f29565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146127ec576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036127f88282614327565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c9f9190613a56565b60085460ff16612864576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036128a0576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156128dc576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612917918491700100000000000000000000000000000000900416614720565b111561294f576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015612bde576000868683818110612994576129946140c2565b90506020028101906129a69190614733565b6129af90614767565b9050836129bb816141c0565b82518051602091820120818501516040808701519051949950919450600093612a1d9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612aa6576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055612acb60018861421f565b8403612b3a5742600760189054906101000a900467ffffffffffffffff168460400151612af891906147e5565b67ffffffffffffffff161115612b3a576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080612bd6906141e7565b915050612978565b50612c0c7f0000000000000000000000000000000000000000000000000000000000000000846112b9610813565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612cfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d1f9190614249565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612d9b576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e2c9190613fa2565b905081811115612e68576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612ea4576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ee673ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613227565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f779190613fa2565b600780549192506801000000000000000090910467ffffffffffffffff16906008612fa1836141c0565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612fd8929190614806565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff16600090815260069093529120553233036130e8576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613147565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9318233888860405161313e9493929190614816565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526132229084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613595565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526132859085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016131a0565b50505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161330d9190614887565b600060405180830381855afa9150503d8060008114613348576040519150601f19603f3d011682016040523d82523d6000602084013e61334d565b606091505b509150915081613392576040518060400160405280600781526020017f4e4f5f4e414d45000000000000000000000000000000000000000000000000008152506123eb565b6123eb816136a1565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161341d9190614887565b600060405180830381855afa9150503d8060008114613458576040519150601f19603f3d011682016040523d82523d6000602084013e61345d565b606091505b509150915081613392576040518060400160405280600981526020017f4e4f5f53594d424f4c00000000000000000000000000000000000000000000008152506123eb565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8616916135239190614887565b600060405180830381855afa9150503d806000811461355e576040519150601f19603f3d011682016040523d82523d6000602084013e613563565b606091505b5091509150818015613576575080516020145b6135815760126123eb565b808060200190518101906123eb9190614899565b60006135f7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166138779092919063ffffffff16565b805190915015613222578080602001905181019061361591906140a0565b613222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016118b5565b606060408251106136c657818060200190518101906136c091906148bc565b92915050565b815160200361383e5760005b60208110801561371957508281815181106136ef576136ef6140c2565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b156137305780613728816141e7565b9150506136d2565b8060000361377357505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111561378e5761378e613bd1565b6040519080825280601f01601f1916602001820160405280156137b8576020820181803683370190505b50905060005b82811015613836578481815181106137d8576137d86140c2565b602001015160f81c60f81b8282815181106137f5576137f56140c2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061382e816141e7565b9150506137be565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60606123eb8484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516138ab9190614887565b60006040518083038185875af1925050503d80600081146138e8576040519150601f19603f3d011682016040523d82523d6000602084013e6138ed565b606091505b50915091506138fe87838387613909565b979650505050505050565b6060831561399f5782516000036139985773ffffffffffffffffffffffffffffffffffffffff85163b613998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016118b5565b50816123eb565b6123eb83838151156139b45781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b59190613a56565b60005b83811015613a035781810151838201526020016139eb565b50506000910152565b60008151808452613a248160208601602086016139e8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613a696020830184613a0c565b9392505050565b67ffffffffffffffff81168114613a8657600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613a8657600080fd5b600080600060608486031215613ac057600080fd5b8335613acb81613a70565b9250602084013591506040840135613ae281613a89565b809150509250925092565b600060208284031215613aff57600080fd5b8135613a6981613a70565b60008083601f840112613b1c57600080fd5b50813567ffffffffffffffff811115613b3457600080fd5b6020830191508360208260051b8501011115613b4f57600080fd5b9250929050565b600080600060408486031215613b6b57600080fd5b833567ffffffffffffffff811115613b8257600080fd5b613b8e86828701613b0a565b9094509250506020840135613ae281613a89565b600060208284031215613bb457600080fd5b8135613a6981613a89565b63ffffffff81168114613a8657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613c4757613c47613bd1565b604052919050565b600067ffffffffffffffff821115613c6957613c69613bd1565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613ca657600080fd5b8135613cb9613cb482613c4f565b613c00565b818152846020838601011115613cce57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613d0457600080fd5b8635613d0f81613a89565b95506020870135613d1f81613a89565b94506040870135613d2f81613bbf565b93506060870135613d3f81613a89565b9250608087013567ffffffffffffffff80821115613d5c57600080fd5b613d688a838b01613c95565b935060a0890135915080821115613d7e57600080fd5b50613d8b89828a01613c95565b9150509295509295509295565b60008060008060808587031215613dae57600080fd5b8435613db981613bbf565b93506020850135613dc981613a89565b92506040850135613dd981613bbf565b9150606085013567ffffffffffffffff811115613df557600080fd5b613e0187828801613c95565b91505092959194509250565b60008060008060008060c08789031215613e2657600080fd5b8635613e3181613a89565b95506020870135613e4181613a89565b9450604087013567ffffffffffffffff80821115613e5e57600080fd5b613e6a8a838b01613c95565b95506060890135915080821115613e8057600080fd5b50613e8d89828a01613c95565b9350506080870135915060a0870135613ea581613a70565b809150509295509295509295565b600060208284031215613ec557600080fd5b813567ffffffffffffffff811115613edc57600080fd5b6123eb84828501613c95565b60008060208385031215613efb57600080fd5b823567ffffffffffffffff811115613f1257600080fd5b613f1e85828601613b0a565b90969095509350505050565b600080600060408486031215613f3f57600080fd5b833567ffffffffffffffff80821115613f5757600080fd5b818601915086601f830112613f6b57600080fd5b813581811115613f7a57600080fd5b876020828501011115613f8c57600080fd5b6020928301989097509590910135949350505050565b600060208284031215613fb457600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff82811682821603908082111561400b5761400b613fbb565b5092915050565b600082614048577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061406157607f821691505b60208210810361409a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000602082840312156140b257600080fd5b81518015158114613a6957600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261412557600080fd5b9190910192915050565b60006080823603121561414157600080fd5b6040516080810167ffffffffffffffff828210818311171561416557614165613bd1565b81604052843591508082111561417a57600080fd5b5061418736828601613c95565b8252506020830135602082015260408301356141a281613a70565b604082015260608301356141b581613a70565b606082015292915050565b600067ffffffffffffffff8083168181036141dd576141dd613fbb565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361421857614218613fbb565b5060010190565b818103818111156136c0576136c0613fbb565b80820281158282048414176136c0576136c0613fbb565b60006020828403121561425b57600080fd5b8151613a6981613a70565b6060815260006142796060830186613a0c565b828103602084015261428b8186613a0c565b91505060ff83166040830152949350505050565b600080604083850312156142b257600080fd5b82516142bd81613bbf565b60208401519092506142ce81613a89565b809150509250929050565b601f82111561322257600081815260208120601f850160051c810160208610156143005750805b601f850160051c820191505b8181101561431f5782815560010161430c565b505050505050565b815167ffffffffffffffff81111561434157614341613bd1565b6143558161434f845461404d565b846142d9565b602080601f8311600181146143a857600084156143725750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561431f565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156143f5578886015182559484019460019091019084016143d6565b508582101561443157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006144546060830186613a0c565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a08301526144d760c0830184613a0c565b98975050505050505050565b61ffff81811683821601908082111561400b5761400b613fbb565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614567816003860160208c016139e8565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516145aa816017840160208b016139e8565b808201915050818660f81b166017820152845191506145d08260188301602088016139e8565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b166001840152875161464a816003860160208c016139e8565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161468d816017840160208b016139e8565b808201915050818660f01b166017820152845191506146b38260198301602088016139e8565b016019019998505050505050505050565b600086516146d6818460208b016139e8565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b808201808211156136c0576136c0613fbb565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261412557600080fd5b60006060823603121561477957600080fd5b6040516060810167ffffffffffffffff828210818311171561479d5761479d613bd1565b8160405284359150808211156147b257600080fd5b506147bf36828601613c95565b8252506020830135602082015260408301356147da81613a70565b604082015292915050565b67ffffffffffffffff81811683821601908082111561400b5761400b613fbb565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b600082516141258184602087016139e8565b6000602082840312156148ab57600080fd5b815160ff81168114613a6957600080fd5b6000602082840312156148ce57600080fd5b815167ffffffffffffffff8111156148e557600080fd5b8201601f810184136148f657600080fd5b8051614904613cb482613c4f565b81815285602083850101111561491957600080fd5b61492a8260208301602086016139e8565b9594505050505056fea2646970667358221220533ac3b5c59a13a0403cdbad383ed7f87a2f4bb1b36f2a54136e8564861b6e8564736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102f35760003560e01c80636ff512cc11610191578063c7fffd4b116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b146107d2578063f35dda47146107e5578063f851a440146107ed57600080fd5b8063d8d1091b14610778578063e46761c41461078b578063e7a7ed02146107b257600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610726578063d02103ca14610746578063d7bc90ff1461076d57600080fd5b8063c7fffd4b1461070b578063c89e42df1461071357600080fd5b8063a3c573eb11610145578063b0afe1541161011f578063b0afe154146106bc578063bb590708146106c8578063c754c7ed146106db57600080fd5b8063a3c573eb1461066f578063a652f26c14610696578063ada8f919146106a957600080fd5b80637a5460c5116101765780637a5460c5146106105780638c3d73011461064c5780639e0018771461065457600080fd5b80636ff512cc146105ea57806371257022146105fd57600080fd5b806340b5de6c1161024a578063542028d5116101fe578063676870d2116101d8578063676870d2146105b95780636b8616ce146105c15780636e05d2cd146105e157600080fd5b8063542028d5146105965780635e9145c91461059e5780635ec91958146105b157600080fd5b806349b7b8021161022f57806349b7b802146105205780634e4877061461054757806352bdeb6d1461055a57600080fd5b806340b5de6c146104a057806345605267146104f857600080fd5b806319d8ac61116102ac57806332c2d1531161028657806332c2d153146104285780633c351e101461043d5780633cbc795b1461046257600080fd5b806319d8ac611461039957806326782247146103c65780632b35b3ac1461040b57600080fd5b806305835f37116102dd57806305835f371461032e578063107bf28c1461037757806311e892d41461037f57600080fd5b8062d0295d146102f85780630350896314610313575b600080fd5b610300610813565b6040519081526020015b60405180910390f35b61031b602081565b60405161ffff909116815260200161030a565b61036a6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161030a9190613a56565b61036a610933565b61038760f981565b60405160ff909116815260200161030a565b6007546103ad9067ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161030a565b6001546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161030a565b6008546104189060ff1681565b604051901515815260200161030a565b61043b610436366004613aab565b6109c1565b005b6008546103e690610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60085461048b907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161030a565b6104c77fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161030a565b6007546103ad90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b61043b610555366004613aed565b610a90565b61036a6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61036a610caa565b61043b6105ac366004613b56565b610cb7565b61043b6115d0565b61031b601f81565b6103006105cf366004613aed565b60066020526000908152604090205481565b61030060055481565b61043b6105f8366004613ba2565b6116ba565b61043b61060b366004613ceb565b611784565b61036a6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61043b611f3b565b6103e673a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b61036a6106a4366004613d98565b61200e565b61043b6106b7366004613ba2565b6123f3565b6103006405ca1ab1e081565b61043b6106d6366004613e0d565b6124bd565b6007546103ad907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61038760e481565b61043b610721366004613eb3565b612795565b6002546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b610300635ca1ab1e81565b61043b610786366004613ee8565b612828565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b6007546103ad9068010000000000000000900467ffffffffffffffff1681565b61043b6107e0366004613f2a565b612d5f565b610387601b81565b6000546103e69062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156108a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c69190613fa2565b6007549091506000906109059067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613fea565b67ffffffffffffffff169050806000036109225760009250505090565b61092c8183614012565b9250505090565b600480546109409061404d565b80601f016020809104026020016040519081016040528092919081815260200182805461096c9061404d565b80156109b95780601f1061098e576101008083540402835291602001916109b9565b820191906000526020600020905b81548152906001019060200180831161099c57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a30576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a8391815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ae7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b2e576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbd91906140a0565b610c265760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c26576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546109409061404d565b60025473ffffffffffffffffffffffffffffffffffffffff163314610d08576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003610d44576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610d80576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156111bc576000898983818110610dc957610dc96140c2565b9050602002810190610ddb91906140f1565b610de49061412f565b8051805160209091012060608201519192509067ffffffffffffffff1615610f675785610e10816141c0565b96505060008183602001518460600151604051602001610e6893929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114610ef1576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015610f47576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86166000908152600660205260408120556110a4565b60208201511580159061102e575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015611008573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102c9190613fa2565b155b15611065576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156110a4576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806110d7575042826040015167ffffffffffffffff16115b1561110e576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519650505080806111b4906141e7565b915050610dad565b5060075467ffffffffffffffff6801000000000000000090910481169084161115611213576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691909117909155600583905585908281169085161461134a57600061126a8386613fea565b905061128067ffffffffffffffff82168361421f565b91506113017f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166112b9610813565b6112c39190614232565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016919061314e565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611448337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ff9190613fa2565b6114099190614232565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613227565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156114b057600080fd5b505af11580156114c4573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af1158015611568573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158c9190614249565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611627576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615611664576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611711576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c9f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146117f3576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156118135750600054600160ff909116105b8061182d5750303b15801561182d575060005460ff166001145b6118be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561191c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611b31576119438561328b565b61194c8661339b565b611955876134a2565b60405160200161196793929190614266565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611a28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4c919061429f565b915091508163ffffffff16600014611ae957600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff851602179055611b2e565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b600854600090611b7e908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff168561200e565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c229190613fa2565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611d9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc19190614249565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611e539190614327565b506004611e608982614327565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611ec093929190614441565b60405180910390a15050505050508015611f3257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611f8c576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa60008760405160240161204296959493929190614480565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060906000036121935760f9601f83516120d791906144e3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e48760405160200161217d97969594939291906144fe565b6040516020818303038152906040529050612297565b815161ffff10156121d0576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96121df6020836144e3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b9000000000000000000000000000000000000000000000000000000000000815250858860405160200161228497969594939291906145e1565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156122f8573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612370576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906123b69084906405ca1ab1e090635ca1ab1e90601b907fff00000000000000000000000000000000000000000000000000000000000000906020016146c4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461244a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c9f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461252c576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff161580801561254c5750600054600160ff909116105b806125665750303b158015612566575060005460ff166001145b6125f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016118b5565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561265057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8a81169190910291909117909155600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001691881691909117905560036126d88682614327565b5060046126e58582614327565b506005839055600780547a06978000000000000000000000000000000000000000000000000077ffffffffffffffffffffffffffffffff000000000000000090911667ffffffffffffffff8516171790558015611f3257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611f29565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146127ec576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036127f88282614327565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c9f9190613a56565b60085460ff16612864576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036128a0576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156128dc576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612917918491700100000000000000000000000000000000900416614720565b111561294f576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015612bde576000868683818110612994576129946140c2565b90506020028101906129a69190614733565b6129af90614767565b9050836129bb816141c0565b82518051602091820120818501516040808701519051949950919450600093612a1d9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612aa6576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055612acb60018861421f565b8403612b3a5742600760189054906101000a900467ffffffffffffffff168460400151612af891906147e5565b67ffffffffffffffff161115612b3a576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080612bd6906141e7565b915050612978565b50612c0c7f0000000000000000000000000000000000000000000000000000000000000000846112b9610813565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612cfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d1f9190614249565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612d9b576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e2c9190613fa2565b905081811115612e68576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612ea4576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ee673ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613227565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f779190613fa2565b600780549192506801000000000000000090910467ffffffffffffffff16906008612fa1836141c0565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612fd8929190614806565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff16600090815260069093529120553233036130e8576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613147565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9318233888860405161313e9493929190614816565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526132229084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613595565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526132859085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016131a0565b50505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161330d9190614887565b600060405180830381855afa9150503d8060008114613348576040519150601f19603f3d011682016040523d82523d6000602084013e61334d565b606091505b509150915081613392576040518060400160405280600781526020017f4e4f5f4e414d45000000000000000000000000000000000000000000000000008152506123eb565b6123eb816136a1565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161341d9190614887565b600060405180830381855afa9150503d8060008114613458576040519150601f19603f3d011682016040523d82523d6000602084013e61345d565b606091505b509150915081613392576040518060400160405280600981526020017f4e4f5f53594d424f4c00000000000000000000000000000000000000000000008152506123eb565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8616916135239190614887565b600060405180830381855afa9150503d806000811461355e576040519150601f19603f3d011682016040523d82523d6000602084013e613563565b606091505b5091509150818015613576575080516020145b6135815760126123eb565b808060200190518101906123eb9190614899565b60006135f7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166138779092919063ffffffff16565b805190915015613222578080602001905181019061361591906140a0565b613222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016118b5565b606060408251106136c657818060200190518101906136c091906148bc565b92915050565b815160200361383e5760005b60208110801561371957508281815181106136ef576136ef6140c2565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b156137305780613728816141e7565b9150506136d2565b8060000361377357505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111561378e5761378e613bd1565b6040519080825280601f01601f1916602001820160405280156137b8576020820181803683370190505b50905060005b82811015613836578481815181106137d8576137d86140c2565b602001015160f81c60f81b8282815181106137f5576137f56140c2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061382e816141e7565b9150506137be565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60606123eb8484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516138ab9190614887565b60006040518083038185875af1925050503d80600081146138e8576040519150601f19603f3d011682016040523d82523d6000602084013e6138ed565b606091505b50915091506138fe87838387613909565b979650505050505050565b6060831561399f5782516000036139985773ffffffffffffffffffffffffffffffffffffffff85163b613998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016118b5565b50816123eb565b6123eb83838151156139b45781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b59190613a56565b60005b83811015613a035781810151838201526020016139eb565b50506000910152565b60008151808452613a248160208601602086016139e8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613a696020830184613a0c565b9392505050565b67ffffffffffffffff81168114613a8657600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613a8657600080fd5b600080600060608486031215613ac057600080fd5b8335613acb81613a70565b9250602084013591506040840135613ae281613a89565b809150509250925092565b600060208284031215613aff57600080fd5b8135613a6981613a70565b60008083601f840112613b1c57600080fd5b50813567ffffffffffffffff811115613b3457600080fd5b6020830191508360208260051b8501011115613b4f57600080fd5b9250929050565b600080600060408486031215613b6b57600080fd5b833567ffffffffffffffff811115613b8257600080fd5b613b8e86828701613b0a565b9094509250506020840135613ae281613a89565b600060208284031215613bb457600080fd5b8135613a6981613a89565b63ffffffff81168114613a8657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613c4757613c47613bd1565b604052919050565b600067ffffffffffffffff821115613c6957613c69613bd1565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613ca657600080fd5b8135613cb9613cb482613c4f565b613c00565b818152846020838601011115613cce57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613d0457600080fd5b8635613d0f81613a89565b95506020870135613d1f81613a89565b94506040870135613d2f81613bbf565b93506060870135613d3f81613a89565b9250608087013567ffffffffffffffff80821115613d5c57600080fd5b613d688a838b01613c95565b935060a0890135915080821115613d7e57600080fd5b50613d8b89828a01613c95565b9150509295509295509295565b60008060008060808587031215613dae57600080fd5b8435613db981613bbf565b93506020850135613dc981613a89565b92506040850135613dd981613bbf565b9150606085013567ffffffffffffffff811115613df557600080fd5b613e0187828801613c95565b91505092959194509250565b60008060008060008060c08789031215613e2657600080fd5b8635613e3181613a89565b95506020870135613e4181613a89565b9450604087013567ffffffffffffffff80821115613e5e57600080fd5b613e6a8a838b01613c95565b95506060890135915080821115613e8057600080fd5b50613e8d89828a01613c95565b9350506080870135915060a0870135613ea581613a70565b809150509295509295509295565b600060208284031215613ec557600080fd5b813567ffffffffffffffff811115613edc57600080fd5b6123eb84828501613c95565b60008060208385031215613efb57600080fd5b823567ffffffffffffffff811115613f1257600080fd5b613f1e85828601613b0a565b90969095509350505050565b600080600060408486031215613f3f57600080fd5b833567ffffffffffffffff80821115613f5757600080fd5b818601915086601f830112613f6b57600080fd5b813581811115613f7a57600080fd5b876020828501011115613f8c57600080fd5b6020928301989097509590910135949350505050565b600060208284031215613fb457600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff82811682821603908082111561400b5761400b613fbb565b5092915050565b600082614048577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061406157607f821691505b60208210810361409a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000602082840312156140b257600080fd5b81518015158114613a6957600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261412557600080fd5b9190910192915050565b60006080823603121561414157600080fd5b6040516080810167ffffffffffffffff828210818311171561416557614165613bd1565b81604052843591508082111561417a57600080fd5b5061418736828601613c95565b8252506020830135602082015260408301356141a281613a70565b604082015260608301356141b581613a70565b606082015292915050565b600067ffffffffffffffff8083168181036141dd576141dd613fbb565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361421857614218613fbb565b5060010190565b818103818111156136c0576136c0613fbb565b80820281158282048414176136c0576136c0613fbb565b60006020828403121561425b57600080fd5b8151613a6981613a70565b6060815260006142796060830186613a0c565b828103602084015261428b8186613a0c565b91505060ff83166040830152949350505050565b600080604083850312156142b257600080fd5b82516142bd81613bbf565b60208401519092506142ce81613a89565b809150509250929050565b601f82111561322257600081815260208120601f850160051c810160208610156143005750805b601f850160051c820191505b8181101561431f5782815560010161430c565b505050505050565b815167ffffffffffffffff81111561434157614341613bd1565b6143558161434f845461404d565b846142d9565b602080601f8311600181146143a857600084156143725750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561431f565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156143f5578886015182559484019460019091019084016143d6565b508582101561443157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006144546060830186613a0c565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a08301526144d760c0830184613a0c565b98975050505050505050565b61ffff81811683821601908082111561400b5761400b613fbb565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614567816003860160208c016139e8565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516145aa816017840160208b016139e8565b808201915050818660f81b166017820152845191506145d08260188301602088016139e8565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b166001840152875161464a816003860160208c016139e8565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161468d816017840160208b016139e8565b808201915050818660f01b166017820152845191506146b38260198301602088016139e8565b016019019998505050505050505050565b600086516146d6818460208b016139e8565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b808201808211156136c0576136c0613fbb565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261412557600080fd5b60006060823603121561477957600080fd5b6040516060810167ffffffffffffffff828210818311171561479d5761479d613bd1565b8160405284359150808211156147b257600080fd5b506147bf36828601613c95565b8252506020830135602082015260408301356147da81613a70565b604082015292915050565b67ffffffffffffffff81811683821601908082111561400b5761400b613fbb565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b600082516141258184602087016139e8565b6000602082840312156148ab57600080fd5b815160ff81168114613a6957600080fd5b6000602082840312156148ce57600080fd5b815167ffffffffffffffff8111156148e557600080fd5b8201601f810184136148f657600080fd5b8051614904613cb482613c4f565b81815285602083850101111561491957600080fd5b61492a8260208301602086016139e8565b9594505050505056fea2646970667358221220533ac3b5c59a13a0403cdbad383ed7f87a2f4bb1b36f2a54136e8564861b6e8564736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } From 1d5b41301853d11859df00cb77bce258b8c7a16b Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 18 Dec 2023 16:47:30 +0100 Subject: [PATCH 115/230] mini fix --- deployment/testnet/prepareTestnet.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/deployment/testnet/prepareTestnet.ts b/deployment/testnet/prepareTestnet.ts index 24bf71331..fdeb47244 100644 --- a/deployment/testnet/prepareTestnet.ts +++ b/deployment/testnet/prepareTestnet.ts @@ -16,12 +16,15 @@ import yargs from "yargs/yargs"; const argv = yargs(process.argv.slice(2)) .options({ input: {type: "string", default: "../v2/deploy_parameters.json"}, + createRollupInput: {type: "string", default: "../v2/create_rollup_parameters.json"}, }) .parse() as any; const pathDeployParameters = path.join(__dirname, argv.input); const deployParameters = require(argv.input); +const createRollupParameters = require(argv.createRollupInput); + async function main() { // Load provider let currentProvider = ethers.provider; @@ -70,15 +73,21 @@ async function main() { } // Check trusted address from deploy parameters - const mandatoryDeploymentParameters = ["trustedAggregator", "trustedSequencer"]; - + const mandatoryDeploymentParameters = ["trustedAggregator"]; for (const parameterName of mandatoryDeploymentParameters) { if (deployParameters[parameterName] === undefined || deployParameters[parameterName] === "") { throw new Error(`Missing parameter: ${parameterName}`); } } + const {trustedAggregator} = deployParameters; - const {trustedAggregator, trustedSequencer} = deployParameters; + const mandatoryDeploymentParametersCreateRollup = ["trustedSequencer"]; + for (const parameterName of mandatoryDeploymentParametersCreateRollup) { + if (createRollupParameters[parameterName] === undefined || createRollupParameters[parameterName] === "") { + throw new Error(`Missing parameter: ${parameterName}`); + } + } + const {trustedSequencer} = createRollupParameters; /* *Deployment pol From 3d44fe5150ce4cf564ed4ebe169685beb0e8a581 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 19 Dec 2023 11:45:29 +0100 Subject: [PATCH 116/230] fix cp docker --- deployment/v2/create_rollup_parameters.json | 16 ---------------- docker/scripts/v2/deploy-docker.sh | 2 +- docker/scripts/v2/deploy-dockerv2.sh | 2 +- 3 files changed, 2 insertions(+), 18 deletions(-) delete mode 100644 deployment/v2/create_rollup_parameters.json diff --git a/deployment/v2/create_rollup_parameters.json b/deployment/v2/create_rollup_parameters.json deleted file mode 100644 index dc6dd2f8e..000000000 --- a/deployment/v2/create_rollup_parameters.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "realVerifier": false, - "trustedSequencerURL": "http://zkevm-json-rpc:8123", - "networkName": "zkevm", - "description":"0.0.1", - "trustedSequencer":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", - "chainID": 1001, - "adminZkEVM":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", - "forkID": 1, - "consensusContract": "PolygonZkEVMEtrog", - "gasTokenAddress":"", - "deployerPvtKey": "", - "maxFeePerGas":"", - "maxPriorityFeePerGas":"", - "multiplierGas": "" -} diff --git a/docker/scripts/v2/deploy-docker.sh b/docker/scripts/v2/deploy-docker.sh index adfb268e2..b7c330d2a 100755 --- a/docker/scripts/v2/deploy-docker.sh +++ b/docker/scripts/v2/deploy-docker.sh @@ -4,7 +4,7 @@ DEV_PERIOD=1 docker-compose -f docker/docker-compose.geth.yml up -d geth sleep 5 node docker/scripts/fund-accounts.js cp docker/scripts/v2/deploy_parameters_docker.json deployment/v2/deploy_parameters.json -cp docker/scripts/v2/create_rollup_parameters.json deployment/v2/create_rollup_parameters.json +cp docker/scripts/v2/create_rollup_parameters_docker.json deployment/v2/create_rollup_parameters.json npm run deploy:testnet:v2:localhost mkdir docker/deploymentOutput mv deployment/v2/deploy_output.json docker/deploymentOutput diff --git a/docker/scripts/v2/deploy-dockerv2.sh b/docker/scripts/v2/deploy-dockerv2.sh index 31513dc34..feabb0a87 100755 --- a/docker/scripts/v2/deploy-dockerv2.sh +++ b/docker/scripts/v2/deploy-dockerv2.sh @@ -4,7 +4,7 @@ DEV_PERIOD=1 docker compose -f docker/docker-compose.geth.yml up -d geth sleep 5 node docker/scripts/fund-accounts.js cp docker/scripts/v2/deploy_parameters_docker.json deployment/v2/deploy_parameters.json -cp docker/scripts/v2/create_rollup_parameters.json deployment/v2/create_rollup_parameters.json +cp docker/scripts/v2/create_rollup_parameters_docker.json deployment/v2/create_rollup_parameters.json npm run deploy:testnet:v2:localhost mkdir docker/deploymentOutput mv deployment/v2/deploy_output.json docker/deploymentOutput From 78f2c6750b2f25a6aaafd78d767057c732216085 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 19 Dec 2023 11:47:16 +0100 Subject: [PATCH 117/230] update ignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 07ce8cbb8..4f37d8194 100644 --- a/.gitignore +++ b/.gitignore @@ -18,4 +18,5 @@ deployments upgrade_parameters.json docker/gethData/ *.ignore/ -typechain-types/ \ No newline at end of file +typechain-types/ +create_rollup_parameters.json \ No newline at end of file From 3df06058a8e2d508655503f9fe2db68e8cbd30e0 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 19 Dec 2023 12:23:52 +0100 Subject: [PATCH 118/230] fix create genesis --- deployment/v1ToV2/1_createGenesis.ts | 12 +++- deployment/v1ToV2/genesis.json | 92 ---------------------------- 2 files changed, 11 insertions(+), 93 deletions(-) delete mode 100644 deployment/v1ToV2/genesis.json diff --git a/deployment/v1ToV2/1_createGenesis.ts b/deployment/v1ToV2/1_createGenesis.ts index 8668b626c..66fb5dd4f 100644 --- a/deployment/v1ToV2/1_createGenesis.ts +++ b/deployment/v1ToV2/1_createGenesis.ts @@ -55,6 +55,7 @@ const mainnetMinDelayTimelock = 864000; const globalExitRootL2Address = "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa"; const zkevmAddressL2 = ethers.ZeroAddress; +const networkIDL2 = 1; async function main() { // Constant variables @@ -198,11 +199,20 @@ async function main() { ) ).data; + const dataCallProxy = polygonZkEVMBridgeFactory.interface.encodeFunctionData("initialize", [ + networkIDL2, + ethers.ZeroAddress, // gas token address + 0, // gas token network + globalExitRootL2Address, + zkevmAddressL2, + "0x", // metadata + ]); + [proxyBridgeAddress] = await create2Deployment( zkEVMDeployerContract, salt, deployTransactionProxy, - null, + dataCallProxy, deployer, null ); diff --git a/deployment/v1ToV2/genesis.json b/deployment/v1ToV2/genesis.json deleted file mode 100644 index 1591582ec..000000000 --- a/deployment/v1ToV2/genesis.json +++ /dev/null @@ -1,92 +0,0 @@ -{ - "root": "0x86394224eaa1192d4c1098e96677fe793588bcbf38349323364741111dfd52a1", - "genesis": [ - { - "contractName": "PolygonZkEVMDeployer", - "balance": "0", - "nonce": "4", - "address": "0xFbD07134824dDEa24E4ae414c18ecbFa98169A24", - "bytecode": "0x60806040526004361061006e575f3560e01c8063715018a61161004c578063715018a6146100e25780638da5cb5b146100f6578063e11ae6cb1461011f578063f2fde38b14610132575f80fd5b80632b79805a146100725780634a94d487146100875780636d07dbf81461009a575b5f80fd5b610085610080366004610908565b610151565b005b6100856100953660046109a2565b6101c2565b3480156100a5575f80fd5b506100b96100b43660046109f5565b610203565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ed575f80fd5b50610085610215565b348015610101575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff166100b9565b61008561012d366004610a15565b610228565b34801561013d575f80fd5b5061008561014c366004610a61565b61028e565b61015961034a565b5f6101658585856103ca565b90506101718183610527565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a15050505050565b6101ca61034a565b6101d583838361056a565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b905f90a1505050565b5f61020e8383610598565b9392505050565b61021d61034a565b6102265f6105a4565b565b61023061034a565b5f61023c8484846103ca565b60405173ffffffffffffffffffffffffffffffffffffffff821681529091507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a150505050565b61029661034a565b73ffffffffffffffffffffffffffffffffffffffff811661033e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610347816105a4565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610335565b5f83471015610435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610335565b81515f0361049f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610335565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff811661020e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610335565b606061020e83835f6040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c65640000815250610618565b6060610590848484604051806060016040528060298152602001610b0860299139610618565b949350505050565b5f61020e83833061072d565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156106aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610335565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516106d29190610a9c565b5f6040518083038185875af1925050503d805f811461070c576040519150601f19603f3d011682016040523d82523d5f602084013e610711565b606091505b509150915061072287838387610756565b979650505050505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b606083156107eb5782515f036107e45773ffffffffffffffffffffffffffffffffffffffff85163b6107e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610335565b5081610590565b61059083838151156108005781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103359190610ab7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112610870575f80fd5b813567ffffffffffffffff8082111561088b5761088b610834565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156108d1576108d1610834565b816040528381528660208588010111156108e9575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f806080858703121561091b575f80fd5b8435935060208501359250604085013567ffffffffffffffff80821115610940575f80fd5b61094c88838901610861565b93506060870135915080821115610961575f80fd5b5061096e87828801610861565b91505092959194509250565b803573ffffffffffffffffffffffffffffffffffffffff8116811461099d575f80fd5b919050565b5f805f606084860312156109b4575f80fd5b6109bd8461097a565b9250602084013567ffffffffffffffff8111156109d8575f80fd5b6109e486828701610861565b925050604084013590509250925092565b5f8060408385031215610a06575f80fd5b50508035926020909101359150565b5f805f60608486031215610a27575f80fd5b8335925060208401359150604084013567ffffffffffffffff811115610a4b575f80fd5b610a5786828701610861565b9150509250925092565b5f60208284031215610a71575f80fd5b61020e8261097a565b5f5b83811015610a94578181015183820152602001610a7c565b50505f910152565b5f8251610aad818460208701610a7a565b9190910192915050565b602081525f8251806020840152610ad5816040850160208701610a7a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220330b94dc698c4d290bf55c23f13b473cde6a6bae0030cb902de18af54e35839f64736f6c63430008140033", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" - } - }, - { - "contractName": "ProxyAdmin", - "balance": "0", - "nonce": "1", - "address": "0xfADB60b5059e31614e02083fF6C021a24C31c891", - "bytecode": "0x608060405260043610610079575f3560e01c80639623609d1161004c5780639623609d1461012357806399a88ec414610136578063f2fde38b14610155578063f3b7dead14610174575f80fd5b8063204e1c7a1461007d578063715018a6146100c55780637eff275e146100db5780638da5cb5b146100fa575b5f80fd5b348015610088575f80fd5b5061009c6100973660046105e8565b610193565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100d0575f80fd5b506100d9610244565b005b3480156100e6575f80fd5b506100d96100f536600461060a565b610257565b348015610105575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff1661009c565b6100d961013136600461066e565b6102e0565b348015610141575f80fd5b506100d961015036600461060a565b610371565b348015610160575f80fd5b506100d961016f3660046105e8565b6103cd565b34801561017f575f80fd5b5061009c61018e3660046105e8565b610489565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907f5c60da1b00000000000000000000000000000000000000000000000000000000815260040190565b5f60405180830381855afa9150503d805f8114610215576040519150601f19603f3d011682016040523d82523d5f602084013e61021a565b606091505b509150915081610228575f80fd5b8080602001905181019061023c919061075b565b949350505050565b61024c6104d3565b6102555f610553565b565b61025f6104d3565b6040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690638f283970906024015b5f604051808303815f87803b1580156102c6575f80fd5b505af11580156102d8573d5f803e3d5ffd5b505050505050565b6102e86104d3565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef28690349061033e9086908690600401610776565b5f604051808303818588803b158015610355575f80fd5b505af1158015610367573d5f803e3d5ffd5b5050505050505050565b6103796104d3565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690633659cfe6906024016102af565b6103d56104d3565b73ffffffffffffffffffffffffffffffffffffffff811661047d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61048681610553565b50565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907ff851a44000000000000000000000000000000000000000000000000000000000815260040190565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610474565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610486575f80fd5b5f602082840312156105f8575f80fd5b8135610603816105c7565b9392505050565b5f806040838503121561061b575f80fd5b8235610626816105c7565b91506020830135610636816105c7565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f805f60608486031215610680575f80fd5b833561068b816105c7565b9250602084013561069b816105c7565b9150604084013567ffffffffffffffff808211156106b7575f80fd5b818601915086601f8301126106ca575f80fd5b8135818111156106dc576106dc610641565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561072257610722610641565b8160405282815289602084870101111561073a575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f6020828403121561076b575f80fd5b8151610603816105c7565b73ffffffffffffffffffffffffffffffffffffffff831681525f602060408184015283518060408501525f5b818110156107be578581018301518582016060015282016107a2565b505f6060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050939250505056fea26469706673582212203083a4ccc2e42eed60bd19037f2efa77ed086dc7a5403f75bebb995dcba2221c64736f6c63430008140033", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f" - } - }, - { - "contractName": "PolygonZkEVMBridge implementation", - "balance": "0", - "nonce": "1", - "address": "0x652f0520E67542a9612e8C86b917228A40180383", - "bytecode": "0x608060405260043610620001f7575f3560e01c806383f244031162000112578063ccaa2d11116200009e578063ee25560b116200006a578063ee25560b1462000615578063f5efcd791462000644578063f811bff71462000668578063fb570834146200068c575f80fd5b8063ccaa2d111462000599578063cd58657914620005bd578063d02103ca14620005d4578063dbc1697614620005fe575f80fd5b8063bab161bf11620000de578063bab161bf1462000509578063be5831c7146200052c578063c00f14ab1462000551578063cc4616321462000575575f80fd5b806383f24403146200047c5780638ed7e3f214620004a0578063aaa13cc214620004c1578063b8b284d014620004e5575f80fd5b80633c351e1011620001925780635ca1e165116200015e5780635ca1e16514620003f25780637843298b146200040957806379e2cf97146200042d57806381b1c1741462000444575f80fd5b80633c351e1014620003515780633cbc795b14620003725780633e19704314620003ad5780634b2f336d14620003d1575f80fd5b8063240ff37811620001d2578063240ff378146200028157806327aef4e814620002985780632dfdf0b514620002be578063318aee3d14620002e4575f80fd5b806315064c9614620001fb5780632072f6c5146200022b57806322e95f2c1462000244575b5f80fd5b34801562000207575f80fd5b50606854620002169060ff1681565b60405190151581526020015b60405180910390f35b34801562000237575f80fd5b5062000242620006b0565b005b34801562000250575f80fd5b50620002686200026236600462003137565b620006e8565b6040516001600160a01b03909116815260200162000222565b6200024262000292366004620031c7565b62000752565b348015620002a4575f80fd5b50620002af620007e0565b60405162000222919062003297565b348015620002ca575f80fd5b50620002d560535481565b60405190815260200162000222565b348015620002f0575f80fd5b506200032c62000302366004620032b2565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b0390911660208301520162000222565b3480156200035d575f80fd5b50606d5462000268906001600160a01b031681565b3480156200037e575f80fd5b50606d546200039790600160a01b900463ffffffff1681565b60405163ffffffff909116815260200162000222565b348015620003b9575f80fd5b50620002d5620003cb366004620032df565b62000874565b348015620003dd575f80fd5b50606f5462000268906001600160a01b031681565b348015620003fe575f80fd5b50620002d56200091d565b34801562000415575f80fd5b50620002686200042736600462003364565b62000a02565b34801562000439575f80fd5b506200024262000a32565b34801562000450575f80fd5b506200026862000462366004620033b1565b606a6020525f90815260409020546001600160a01b031681565b34801562000488575f80fd5b50620002d56200049a366004620033db565b62000a56565b348015620004ac575f80fd5b50606c5462000268906001600160a01b031681565b348015620004cd575f80fd5b5062000268620004df366004620034ef565b62000b39565b348015620004f1575f80fd5b50620002426200050336600462003592565b62000c85565b34801562000515575f80fd5b506068546200039790610100900463ffffffff1681565b34801562000538575f80fd5b506068546200039790600160c81b900463ffffffff1681565b3480156200055d575f80fd5b50620002af6200056f366004620032b2565b62000d66565b34801562000581575f80fd5b5062000216620005933660046200361a565b62000db3565b348015620005a5575f80fd5b5062000242620005b736600462003650565b62000e42565b62000242620005ce36600462003744565b620013b0565b348015620005e0575f80fd5b5060685462000268906501000000000090046001600160a01b031681565b3480156200060a575f80fd5b50620002426200184d565b34801562000621575f80fd5b50620002d562000633366004620033b1565b60696020525f908152604090205481565b34801562000650575f80fd5b50620002426200066236600462003650565b62001883565b34801562000674575f80fd5b506200024262000686366004620037e0565b62001b60565b34801562000698575f80fd5b5062000216620006aa36600462003892565b62001e8f565b606c546001600160a01b03163314620006dc57604051631736745960e31b815260040160405180910390fd5b620006e662001ea8565b565b6040805160e084901b6001600160e01b031916602080830191909152606084901b6bffffffffffffffffffffffff1916602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b60685460ff16156200077757604051630bc011ff60e21b815260040160405180910390fd5b3415801590620007915750606f546001600160a01b031615155b15620007c9576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007d985853486868662001f04565b5050505050565b606e8054620007ef90620038dc565b80601f01602080910402602001604051908101604052809291908181526020018280546200081d90620038dc565b80156200086c5780601f1062000842576101008083540402835291602001916200086c565b820191905f5260205f20905b8154815290600101906020018083116200084e57829003601f168201915b505050505081565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201526001600160e01b031960e088811b821660218401526bffffffffffffffffffffffff19606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b6053545f90819081805b6020811015620009f9578083901c6001166001036200098a576033816020811062000956576200095662003916565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620009b7565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620009f0906200393e565b91505062000927565b50919392505050565b5f62000a2a848462000a148562001fd8565b62000a1f86620020ca565b620004df87620021b1565b949350505050565b605354606854600160c81b900463ffffffff161015620006e657620006e662002287565b5f83815b602081101562000b3057600163ffffffff8516821c8116900362000acc5784816020811062000a8d5762000a8d62003916565b60200201358260405160200162000aae929190918252602082015260400190565b60405160208183030381529060405280519060200120915062000b1b565b8185826020811062000ae25762000ae262003916565b602002013560405160200162000b02929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062000b27816200393e565b91505062000a5a565b50949350505050565b6040516001600160e01b031960e087901b1660208201526bffffffffffffffffffffffff19606086901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b30836040518060200162000ba290620030fd565b601f1982820381018352601f90910116604081905262000bcb908b908b908b9060200162003959565b60408051601f198184030181529082905262000beb929160200162003995565b6040516020818303038152906040528051906020012060405160200162000c6194939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff161562000caa57604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b031662000ced576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f54604051632770a7eb60e21b8152336004820152602481018690526001600160a01b0390911690639dc29fac906044015f604051808303815f87803b15801562000d37575f80fd5b505af115801562000d4a573d5f803e3d5ffd5b5050505062000d5e86868686868662001f04565b505050505050565b606062000d738262001fd8565b62000d7e83620020ca565b62000d8984620021b1565b60405160200162000d9d9392919062003959565b6040516020818303038152906040529050919050565b6068545f908190610100900463ffffffff1615801562000dd9575063ffffffff83166001145b1562000ded575063ffffffff831662000e19565b62000e0464010000000063ffffffff8516620039c7565b62000e169063ffffffff8616620039e1565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000e6757604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161462000e98576040516302caf51760e11b815260040160405180910390fd5b62000ed18c8c8c8c8c62000ecb5f8e8e8e8e8e8e8e60405162000ebd929190620039f7565b604051809103902062000874565b6200233a565b6001600160a01b0386166200102757606f546001600160a01b031662000fbe575f6001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000f2a576020820181803683370190505b5060405162000f3a919062003a06565b5f6040518083038185875af1925050503d805f811462000f76576040519150601f19603f3d011682016040523d82523d5f602084013e62000f7b565b606091505b505090508062000fb7576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062001346565b606f546040516340c10f1960e01b81526001600160a01b03868116600483015260248201869052909116906340c10f19906044015f604051808303815f87803b1580156200100a575f80fd5b505af11580156200101d573d5f803e3d5ffd5b5050505062001346565b606d546001600160a01b038781169116148015620010565750606d5463ffffffff888116600160a01b90920416145b156200106f575f6001600160a01b038516848262000eff565b60685463ffffffff610100909104811690881603620010a4576200109e6001600160a01b0387168585620024de565b62001346565b6040516001600160e01b031960e089901b1660208201526bffffffffffffffffffffffff19606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b031680620012e3575f8080620011208688018862003a23565b9250925092505f858484846040516200113990620030fd565b620011479392919062003959565b8190604051809103905ff590508015801562001165573d5f803e3d5ffd5b506040516340c10f1960e01b81526001600160a01b038c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b158015620011b2575f80fd5b505af1158015620011c5573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b604051620012d195949392919062003abc565b60405180910390a15050505062001343565b6040516340c10f1960e01b81526001600160a01b038781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b1580156200132b575f80fd5b505af11580156200133e573d5f803e3d5ffd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff1615620013d557604051630bc011ff60e21b815260040160405180910390fd5b620013df62002561565b60685463ffffffff61010090910481169088160362001411576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b03881662001518578834146200145f576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff169450906200148e90620038dc565b80601f0160208091040260200160405190810160405280929190818152602001828054620014bc90620038dc565b80156200150b5780601f10620014e1576101008083540402835291602001916200150b565b820191905f5260205f20905b815481529060010190602001808311620014ed57829003601f168201915b50505050509150620017ba565b341562001551576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546001600160a01b0390811690891603620015cb57604051632770a7eb60e21b8152336004820152602481018a90526001600160a01b03891690639dc29fac906044015f604051808303815f87803b158015620015ae575f80fd5b505af1158015620015c1573d5f803e3d5ffd5b50505050620017ba565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff81168352640100000000900490921691810182905290156200168157604051632770a7eb60e21b8152336004820152602481018b90526001600160a01b038a1690639dc29fac906044015f604051808303815f87803b15801562001657575f80fd5b505af11580156200166a573d5f803e3d5ffd5b5050505080602001519450805f01519350620017ab565b8515620016965762001696898b8989620025bc565b6040516370a0823160e01b81523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa158015620016db573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001701919062003af6565b90506200171a6001600160a01b038b1633308e62002977565b6040516370a0823160e01b81523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa1580156200175f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001785919062003af6565b905062001793828262003b0e565b6068548c9850610100900463ffffffff169650935050505b620017b68962000d66565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620017fb98979695949392919062003b24565b60405180910390a1620018256200181f5f85878f8f87898051906020012062000874565b620029ca565b861562001836576200183662002287565b505050506200184460018055565b50505050505050565b606c546001600160a01b031633146200187957604051631736745960e31b815260040160405180910390fd5b620006e662002adf565b60685460ff1615620018a857604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614620018d9576040516302caf51760e11b815260040160405180910390fd5b620018ff8c8c8c8c8c62000ecb60018e8e8e8e8e8e8e60405162000ebd929190620039f7565b606f545f906001600160a01b0316620019ba57846001600160a01b031684888a868660405160240162001936949392919062003b8f565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b179052516200196d919062003a06565b5f6040518083038185875af1925050503d805f8114620019a9576040519150601f19603f3d011682016040523d82523d5f602084013e620019ae565b606091505b50508091505062001abd565b606f546040516340c10f1960e01b81526001600160a01b03878116600483015260248201879052909116906340c10f19906044015f604051808303815f87803b15801562001a06575f80fd5b505af115801562001a19573d5f803e3d5ffd5b50505050846001600160a01b03168789858560405160240162001a40949392919062003b8f565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162001a77919062003a06565b5f604051808303815f865af19150503d805f811462001ab2576040519150601f19603f3d011682016040523d82523d5f602084013e62001ab7565b606091505b50909150505b8062001af5576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f54610100900460ff161580801562001b7f57505f54600160ff909116105b8062001b9a5750303b15801562001b9a57505f5460ff166001145b62001c125760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805460ff19166001179055801562001c34575f805461ff0019166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8a16027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038781169190910291909117909155606c805473ffffffffffffffffffffffffffffffffffffffff1916858316179055861662001d125763ffffffff85161562001d0c576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001e37565b606d805463ffffffff8716600160a01b027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b03891617179055606e62001d63838262003c12565b505f801b601260405162001d7790620030fd565b6060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff909116604082015260e0018190604051809103905ff590508015801562001e08573d5f803e3d5ffd5b50606f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790555b62001e4162002b50565b801562001844575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b5f8162001e9e86868662000a56565b1495945050505050565b60685460ff161562001ecd57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff61010090910481169087160362001f36576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff1633898989888860535460405162001f8c9998979695949392919062003cdb565b60405180910390a162001fc76200181f6001606860019054906101000a900463ffffffff16338a8a8a898960405162000ebd929190620039f7565b821562000d5e5762000d5e62002287565b60408051600481526024810182526020810180516001600160e01b03167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b0386169162002039919062003a06565b5f60405180830381855afa9150503d805f811462002073576040519150601f19603f3d011682016040523d82523d5f602084013e62002078565b606091505b509150915081620020bf576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062000a2a565b62000a2a8162002bc6565b60408051600481526024810182526020810180516001600160e01b03167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b038616916200212b919062003a06565b5f60405180830381855afa9150503d805f811462002165576040519150601f19603f3d011682016040523d82523d5f602084013e6200216a565b606091505b509150915081620020bf576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062000a2a565b60408051600481526024810182526020810180516001600160e01b03167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b0386169162002211919062003a06565b5f60405180830381855afa9150503d805f81146200224b576040519150601f19603f3d011682016040523d82523d5f602084013e62002250565b606091505b509150915081801562002264575080516020145b6200227157601262000a2a565b8080602001905181019062000a2a919062003d48565b6053546068805463ffffffff909216600160c81b027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d620022ea6200091d565b6040518263ffffffff1660e01b81526004016200230991815260200190565b5f604051808303815f87803b15801562002321575f80fd5b505af115801562002334573d5f803e3d5ffd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af1158015620023cc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620023f2919062003af6565b9050805f036200242d576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8068010000000000000000871615620024765786915062002452848a848962001e8f565b62002470576040516338105f3b60e21b815260040160405180910390fd5b620024c7565b602087901c6200248881600162003d66565b9150879250620024a76200249e868c8662000a56565b8a838962001e8f565b620024c5576040516338105f3b60e21b815260040160405180910390fd5b505b620024d3828262002db1565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526200255c9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262002e79565b505050565b600260015403620025b55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001c09565b6002600155565b5f620025cc600482848662003d8d565b620025d79162003db6565b90507f2afa5331000000000000000000000000000000000000000000000000000000006001600160e01b0319821601620027be575f80808080808062002621896004818d62003d8d565b81019062002630919062003de7565b9650965096509650965096509650336001600160a01b0316876001600160a01b031614620026715760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03861630146200269b5760405163750643af60e01b815260040160405180910390fd5b8a8514620026d5576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b03167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e16916200276e919062003a06565b5f604051808303815f865af19150503d805f8114620027a9576040519150601f19603f3d011682016040523d82523d5f602084013e620027ae565b606091505b50505050505050505050620007d9565b6001600160e01b031981166323f2ebc360e21b1462002809576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80808080808080620028208a6004818e62003d8d565b8101906200282f919062003e3d565b97509750975097509750975097509750336001600160a01b0316886001600160a01b031614620028725760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146200289c5760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169162002925919062003a06565b5f604051808303815f865af19150503d805f811462002960576040519150601f19603f3d011682016040523d82523d5f602084013e62002965565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052620023349085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002524565b806001620029db6020600262003fbd565b620029e7919062003b0e565b6053541062002a22576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462002a33906200393e565b918290555090505f5b602081101562002ace578082901c60011660010362002a7457826033826020811062002a6c5762002a6c62003916565b015550505050565b6033816020811062002a8a5762002a8a62003916565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062002ac5906200393e565b91505062002a3c565b506200255c62003fca565b60018055565b60685460ff1662002b1c576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f54610100900460ff1662002bbc5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162001c09565b620006e662002f64565b6060604082511062002be857818060200190518101906200074c919062003fde565b815160200362002d73575f5b60208110801562002c3f575082818151811062002c155762002c1562003916565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002c5a578062002c51816200393e565b91505062002bf4565b805f0362002c9d57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff81111562002cba5762002cba6200341c565b6040519080825280601f01601f19166020018201604052801562002ce5576020820181803683370190505b5090505f5b8281101562002d6b5784818151811062002d085762002d0862003916565b602001015160f81c60f81b82828151811062002d285762002d2862003916565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053508062002d62816200393e565b91505062002cea565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b6068545f90610100900463ffffffff1615801562002dd5575063ffffffff82166001145b1562002de9575063ffffffff821662002e15565b62002e0064010000000063ffffffff8416620039c7565b62002e129063ffffffff8516620039e1565b90505b600881901c5f8181526069602052604081208054600160ff861690811b9182189283905592909190818316900362001844576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002ecf826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031662002fd09092919063ffffffff16565b8051909150156200255c578080602001905181019062002ef0919062004059565b6200255c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001c09565b5f54610100900460ff1662002ad95760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162001c09565b606062000a2a84845f85855f80866001600160a01b0316858760405162002ff8919062003a06565b5f6040518083038185875af1925050503d805f811462003034576040519150601f19603f3d011682016040523d82523d5f602084013e62003039565b606091505b50915091506200304c8783838762003057565b979650505050505050565b60608315620030ca5782515f03620030c2576001600160a01b0385163b620030c25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001c09565b508162000a2a565b62000a2a8383815115620030e15781518083602001fd5b8060405162461bcd60e51b815260040162001c09919062003297565b61174d806200407883390190565b803563ffffffff8116811462002dac575f80fd5b6001600160a01b038116811462003134575f80fd5b50565b5f806040838503121562003149575f80fd5b62003154836200310b565b9150602083013562003166816200311f565b809150509250929050565b801515811462003134575f80fd5b5f8083601f84011262003190575f80fd5b50813567ffffffffffffffff811115620031a8575f80fd5b602083019150836020828501011115620031c0575f80fd5b9250929050565b5f805f805f60808688031215620031dc575f80fd5b620031e7866200310b565b94506020860135620031f9816200311f565b935060408601356200320b8162003171565b9250606086013567ffffffffffffffff81111562003227575f80fd5b62003235888289016200317f565b969995985093965092949392505050565b5f5b838110156200326257818101518382015260200162003248565b50505f910152565b5f81518084526200328381602086016020860162003246565b601f01601f19169290920160200192915050565b602081525f620032ab60208301846200326a565b9392505050565b5f60208284031215620032c3575f80fd5b8135620032ab816200311f565b60ff8116811462003134575f80fd5b5f805f805f805f60e0888a031215620032f6575f80fd5b87356200330381620032d0565b965062003313602089016200310b565b9550604088013562003325816200311f565b945062003335606089016200310b565b9350608088013562003347816200311f565b9699959850939692959460a0840135945060c09093013592915050565b5f805f6060848603121562003377575f80fd5b62003382846200310b565b9250602084013562003394816200311f565b91506040840135620033a6816200311f565b809150509250925092565b5f60208284031215620033c2575f80fd5b5035919050565b8061040081018310156200074c575f80fd5b5f805f6104408486031215620033ef575f80fd5b83359250620034028560208601620033c9565b91506200341361042085016200310b565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156200345c576200345c6200341c565b604052919050565b5f67ffffffffffffffff8211156200348057620034806200341c565b50601f01601f191660200190565b5f620034a46200349e8462003464565b62003430565b9050828152838383011115620034b8575f80fd5b828260208301375f602084830101529392505050565b5f82601f830112620034de575f80fd5b620032ab838335602085016200348e565b5f805f805f60a0868803121562003504575f80fd5b6200350f866200310b565b9450602086013562003521816200311f565b9350604086013567ffffffffffffffff808211156200353e575f80fd5b6200354c89838a01620034ce565b9450606088013591508082111562003562575f80fd5b506200357188828901620034ce565b92505060808601356200358481620032d0565b809150509295509295909350565b5f805f805f8060a08789031215620035a8575f80fd5b620035b3876200310b565b95506020870135620035c5816200311f565b9450604087013593506060870135620035de8162003171565b9250608087013567ffffffffffffffff811115620035fa575f80fd5b6200360889828a016200317f565b979a9699509497509295939492505050565b5f80604083850312156200362c575f80fd5b62003637836200310b565b915062003647602084016200310b565b90509250929050565b5f805f805f805f805f805f806109208d8f0312156200366d575f80fd5b620036798e8e620033c9565b9b506200368b8e6104008f01620033c9565b9a506108008d013599506108208d013598506108408d01359750620036b46108608e016200310b565b9650620036c66108808e01356200311f565b6108808d01359550620036dd6108a08e016200310b565b9450620036ef6108c08e01356200311f565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111562003719575f80fd5b6200372c8e6109008f01358f016200317f565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a0312156200375b575f80fd5b62003766886200310b565b9650602088013562003778816200311f565b955060408801359450606088013562003791816200311f565b93506080880135620037a38162003171565b925060a088013567ffffffffffffffff811115620037bf575f80fd5b620037cd8a828b016200317f565b989b979a50959850939692959293505050565b5f805f805f8060c08789031215620037f6575f80fd5b62003801876200310b565b9550602087013562003813816200311f565b945062003823604088016200310b565b9350606087013562003835816200311f565b9250608087013562003847816200311f565b915060a087013567ffffffffffffffff81111562003863575f80fd5b8701601f8101891362003874575f80fd5b62003885898235602084016200348e565b9150509295509295509295565b5f805f806104608587031215620038a7575f80fd5b84359350620038ba8660208701620033c9565b9250620038cb61042086016200310b565b939692955092936104400135925050565b600181811c90821680620038f157607f821691505b6020821081036200391057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600182016200395257620039526200392a565b5060010190565b606081525f6200396d60608301866200326a565b82810360208401526200398181866200326a565b91505060ff83166040830152949350505050565b5f8351620039a881846020880162003246565b835190830190620039be81836020880162003246565b01949350505050565b80820281158282048414176200074c576200074c6200392a565b808201808211156200074c576200074c6200392a565b818382375f9101908152919050565b5f825162003a1981846020870162003246565b9190910192915050565b5f805f6060848603121562003a36575f80fd5b833567ffffffffffffffff8082111562003a4e575f80fd5b62003a5c87838801620034ce565b9450602086013591508082111562003a72575f80fd5b5062003a8186828701620034ce565b9250506040840135620033a681620032d0565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b63ffffffff861681525f6001600160a01b038087166020840152808616604084015250608060608301526200304c60808301848662003a94565b5f6020828403121562003b07575f80fd5b5051919050565b818103818111156200074c576200074c6200392a565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003b76828501876200326a565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f62003bbf60608301848662003a94565b9695505050505050565b601f8211156200255c575f81815260208120601f850160051c8101602086101562003bf15750805b601f850160051c820191505b8181101562000d5e5782815560010162003bfd565b815167ffffffffffffffff81111562003c2f5762003c2f6200341c565b62003c478162003c408454620038dc565b8462003bc9565b602080601f83116001811462003c7d575f841562003c655750858301515b5f19600386901b1c1916600185901b17855562000d5e565b5f85815260208120601f198616915b8281101562003cad5788860151825594840194600190910190840162003c8c565b508582101562003ccb57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003d2e828501878962003a94565b925080851660e085015250509a9950505050505050505050565b5f6020828403121562003d59575f80fd5b8151620032ab81620032d0565b63ffffffff81811683821601908082111562003d865762003d866200392a565b5092915050565b5f808585111562003d9c575f80fd5b8386111562003da9575f80fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101562003ddf5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562003dfe575f80fd5b873562003e0b816200311f565b9650602088013562003e1d816200311f565b9550604088013594506060880135935060808801356200334781620032d0565b5f805f805f805f80610100898b03121562003e56575f80fd5b883562003e63816200311f565b9750602089013562003e75816200311f565b96506040890135955060608901359450608089013562003e958162003171565b935060a089013562003ea781620032d0565b979a969950949793969295929450505060c08201359160e0013590565b600181815b8085111562003f0457815f190482111562003ee85762003ee86200392a565b8085161562003ef657918102915b93841c939080029062003ec9565b509250929050565b5f8262003f1c575060016200074c565b8162003f2a57505f6200074c565b816001811462003f43576002811462003f4e5762003f6e565b60019150506200074c565b60ff84111562003f625762003f626200392a565b50506001821b6200074c565b5060208310610133831016604e8410600b841016171562003f93575081810a6200074c565b62003f9f838362003ec4565b805f190482111562003fb55762003fb56200392a565b029392505050565b5f620032ab838362003f0c565b634e487b7160e01b5f52600160045260245ffd5b5f6020828403121562003fef575f80fd5b815167ffffffffffffffff81111562004006575f80fd5b8201601f8101841362004017575f80fd5b8051620040286200349e8262003464565b8181528560208385010111156200403d575f80fd5b6200405082602083016020860162003246565b95945050505050565b5f602082840312156200406a575f80fd5b8151620032ab816200317156fe61010060405234801562000011575f80fd5b506040516200174d3803806200174d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516112af6200049e5f395f61022d01525f81816102ee01528181610550015261061001525f6104e501525f818161035301526104af01526112af5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf14610375578063dd62ed3e14610388578063ffa1ad74146103c0575f80fd5b8063a457c2d714610328578063a9059cbb1461033b578063cd0d00961461034e575f80fd5b806395d89b41116100b857806395d89b41146102ce5780639dc29fac146102d6578063a3c573eb146102e9575f80fd5b806370a08231146102875780637ecebe00146102af575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a6103e0565b604051610187919061107d565b60405180910390f35b6101a361019e3660046110e3565b610470565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461110b565b610489565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ac565b6101a361026d3660046110e3565b610507565b6102856102803660046110e3565b610545565b005b6101b7610295366004611144565b6001600160a01b03165f9081526020819052604090205490565b6101b76102bd366004611144565b60056020525f908152604090205481565b61017a6105f6565b6102856102e43660046110e3565b610605565b6103107f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610187565b6101a36103363660046110e3565b6106ad565b6101a36103493660046110e3565b610756565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b610285610383366004611164565b610763565b6101b76103963660046111d1565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b61017a604051806040016040528060018152602001603160f81b81525081565b6060600380546103ef90611202565b80601f016020809104026020016040519081016040528092919081815260200182805461041b90611202565b80156104665780601f1061043d57610100808354040283529160200191610466565b820191905f5260205f20905b81548152906001019060200180831161044957829003601f168201915b5050505050905090565b5f3361047d8185856109e3565b60019150505b92915050565b5f33610496858285610b3b565b6104a1858585610bcb565b506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146104e2576104dd46610db6565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f8181526001602090815260408083206001600160a01b038716845290915281205490919061047d908290869061054090879061124e565b6109e3565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105e85760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6105f28282610e61565b5050565b6060600480546103ef90611202565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106a35760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084016105df565b6105f28282610f1e565b335f8181526001602090815260408083206001600160a01b0387168452909152812054909190838110156107495760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016105df565b6104a182868684036109e3565b5f3361047d818585610bcb565b834211156107d85760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d69740000000000000000000000000000000000000000000000000000000060648201526084016105df565b6001600160a01b0387165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661082483611261565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6108816104ac565b6040517f1901000000000000000000000000000000000000000000000000000000000000602082015260228101919091526042810183905260620160408051601f1981840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610924573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381161580159061095a5750896001600160a01b0316816001600160a01b0316145b6109cc5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e61747572650000000000000000000000000000000000000000000000000060648201526084016105df565b6109d78a8a8a6109e3565b50505050505050505050565b6001600160a01b038316610a5e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016105df565b6001600160a01b038216610ada5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016105df565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198114610bc55781811015610bb85760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016105df565b610bc584848484036109e3565b50505050565b6001600160a01b038316610c475760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016105df565b6001600160a01b038216610cc35760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016105df565b6001600160a01b0383165f9081526020819052604090205481811015610d515760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016105df565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610bc5565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610de06103e0565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610eb75760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105df565b8060025f828254610ec8919061124e565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6001600160a01b038216610f9a5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016105df565b6001600160a01b0382165f90815260208190526040902054818110156110285760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016105df565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610b2e565b5f6020808352835180828501525f5b818110156110a85785810183015185820160400152820161108c565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b03811681146110de575f80fd5b919050565b5f80604083850312156110f4575f80fd5b6110fd836110c8565b946020939093013593505050565b5f805f6060848603121561111d575f80fd5b611126846110c8565b9250611134602085016110c8565b9150604084013590509250925092565b5f60208284031215611154575f80fd5b61115d826110c8565b9392505050565b5f805f805f805f60e0888a03121561117a575f80fd5b611183886110c8565b9650611191602089016110c8565b95506040880135945060608801359350608088013560ff811681146111b4575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f80604083850312156111e2575f80fd5b6111eb836110c8565b91506111f9602084016110c8565b90509250929050565b600181811c9082168061121657607f821691505b60208210810361123457634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156104835761048361123a565b5f600182016112725761127261123a565b506001019056fea264697066735822122085df368f2b8936cd5558ab5216c979beafb53cf6494111db07c4593ce39d96e664736f6c63430008140033a26469706673582212203b6bb4c70bf485ea8bf62b9fbe5c39272559d47531e665679c66d43b46a5387a64736f6c63430008140033" - }, - { - "contractName": "PolygonZkEVMBridge proxy", - "balance": "340282366920938463463374607431768211455", - "nonce": "1", - "address": "0x070E2b649520ec6a371faB37625dA9F070e3a615", - "bytecode": "0x60806040526004361061005d575f3560e01c80635c60da1b116100425780635c60da1b146100a65780638f283970146100e3578063f851a440146101025761006c565b80633659cfe6146100745780634f1ef286146100935761006c565b3661006c5761006a610116565b005b61006a610116565b34801561007f575f80fd5b5061006a61008e366004610854565b610130565b61006a6100a136600461086d565b610178565b3480156100b1575f80fd5b506100ba6101eb565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee575f80fd5b5061006a6100fd366004610854565b610228565b34801561010d575f80fd5b506100ba610255565b61011e610282565b61012e610129610359565b610362565b565b610138610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d8160405180602001604052805f8152505f6103bf565b50565b61016d610116565b610180610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101e3576101de8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250600192506103bf915050565b505050565b6101de610116565b5f6101f4610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610359565b905090565b610225610116565b90565b610230610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d816103e9565b5f61025e610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610380565b61028a610380565b73ffffffffffffffffffffffffffffffffffffffff16330361012e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b5f61021861044a565b365f80375f80365f845af43d5f803e80801561037c573d5ff35b3d5ffd5b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b6103c883610471565b5f825111806103d45750805b156101de576103e383836104bd565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f610412610380565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a161016d816104e9565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103a3565b61047a816105f5565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606104e28383604051806060016040528060278152602001610977602791396106c0565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811661058c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610350565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b73ffffffffffffffffffffffffffffffffffffffff81163b610699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610350565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105af565b60605f808573ffffffffffffffffffffffffffffffffffffffff16856040516106e9919061090b565b5f60405180830381855af49150503d805f8114610721576040519150601f19603f3d011682016040523d82523d5f602084013e610726565b606091505b509150915061073786838387610741565b9695505050505050565b606083156107d65782515f036107cf5773ffffffffffffffffffffffffffffffffffffffff85163b6107cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610350565b50816107e0565b6107e083836107e8565b949350505050565b8151156107f85781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103509190610926565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f575f80fd5b919050565b5f60208284031215610864575f80fd5b6104e28261082c565b5f805f6040848603121561087f575f80fd5b6108888461082c565b9250602084013567ffffffffffffffff808211156108a4575f80fd5b818601915086601f8301126108b7575f80fd5b8135818111156108c5575f80fd5b8760208285010111156108d6575f80fd5b6020830194508093505050509250925092565b5f5b838110156109035781810151838201526020016108eb565b50505f910152565b5f825161091c8184602087016108e9565b9190910192915050565b602081525f82518060208401526109448160408501602087016108e9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212202ac98acbfbb3d3ac1b74050e18c4e76db25a3ff2801ec69bf85d0c61414d502b64736f6c63430008140033", - "storage": { - "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000fadb60b5059e31614e02083ff6c021a24c31c891", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x000000000000000000000000652f0520e67542a9612e8c86b917228a40180383" - } - }, - { - "contractName": "PolygonZkEVMGlobalExitRootL2 implementation", - "balance": "0", - "nonce": "1", - "address": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9", - "bytecode": "0x608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301fd90441461004e578063257b36321461006a57806333d6247d14610089578063a3c573eb1461009e575b5f80fd5b61005760015481565b6040519081526020015b60405180910390f35b61005761007836600461015e565b5f6020819052908152604090205481565b61009c61009736600461015e565b6100ea565b005b6100c57f000000000000000000000000070e2b649520ec6a371fab37625da9f070e3a61581565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610061565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000070e2b649520ec6a371fab37625da9f070e3a6151614610159576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b5f6020828403121561016e575f80fd5b503591905056fea26469706673582212205108c6c4f924146b736832a1bdf696e20d900450207b7452462368d150f2c71c64736f6c63430008140033" - }, - { - "contractName": "PolygonZkEVMGlobalExitRootL2 proxy", - "balance": "0", - "nonce": "1", - "address": "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa", - "bytecode": "0x60806040523661001357610011610017565b005b6100115b61001f6101b7565b6001600160a01b0316336001600160a01b0316141561016f5760606001600160e01b031960003516631b2ce7f360e11b8114156100655761005e6101ea565b9150610167565b6001600160e01b0319811663278f794360e11b14156100865761005e610241565b6001600160e01b031981166308f2839760e41b14156100a75761005e610287565b6001600160e01b031981166303e1469160e61b14156100c85761005e6102b8565b6001600160e01b03198116635c60da1b60e01b14156100e95761005e6102f8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b61017761030c565b565b606061019e83836040518060600160405280602781526020016108576027913961031c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101f4610394565b600061020336600481846106a2565b81019061021091906106e8565b905061022d8160405180602001604052806000815250600061039f565b505060408051602081019091526000815290565b606060008061025336600481846106a2565b8101906102609190610719565b915091506102708282600161039f565b604051806020016040528060008152509250505090565b6060610291610394565b60006102a036600481846106a2565b8101906102ad91906106e8565b905061022d816103cb565b60606102c2610394565b60006102cc6101b7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b6060610302610394565b60006102cc610422565b610177610317610422565b610431565b6060600080856001600160a01b0316856040516103399190610807565b600060405180830381855af49150503d8060008114610374576040519150601f19603f3d011682016040523d82523d6000602084013e610379565b606091505b509150915061038a86838387610455565b9695505050505050565b341561017757600080fd5b6103a8836104d3565b6000825111806103b55750805b156103c6576103c48383610179565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103f46101b7565b604080516001600160a01b03928316815291841660208301520160405180910390a161041f81610513565b50565b600061042c6105bc565b905090565b3660008037600080366000845af43d6000803e808015610450573d6000f35b3d6000fd5b606083156104c15782516104ba576001600160a01b0385163b6104ba5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161015e565b50816104cb565b6104cb83836105e4565b949350505050565b6104dc8161060e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105785760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161015e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101db565b8151156105f45781518083602001fd5b8060405162461bcd60e51b815260040161015e9190610823565b6001600160a01b0381163b61067b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161015e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61059b565b600080858511156106b257600080fd5b838611156106bf57600080fd5b5050820193919092039150565b80356001600160a01b03811681146106e357600080fd5b919050565b6000602082840312156106fa57600080fd5b61019e826106cc565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561072c57600080fd5b610735836106cc565b9150602083013567ffffffffffffffff8082111561075257600080fd5b818501915085601f83011261076657600080fd5b81358181111561077857610778610703565b604051601f8201601f19908116603f011681019083821181831017156107a0576107a0610703565b816040528281528860208487010111156107b957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107f65781810151838201526020016107de565b838111156103c45750506000910152565b600082516108198184602087016107db565b9190910192915050565b60208152600082518060208401526108428160408501602087016107db565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122012bb4f564f73959a03513dc74fc3c6e40e8386e6f02c16b78d6db00ce0aa16af64736f6c63430008090033", - "storage": { - "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000fadb60b5059e31614e02083ff6c021a24c31c891", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9" - } - }, - { - "contractName": "PolygonZkEVMTimelock", - "balance": "0", - "nonce": "1", - "address": "0x0165878A594ca255338adfa4d48449f69242Eb8F", - "bytecode": "0x6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220d904e0b10230579952f8427a107aa4349f9a1f5799108d399b11e28b578463e464736f6c63430008140033", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000e10", - "0xaedcc9e7897c0d335bdc5d92fe3a8b4f23727fe558cd1c19f332b28716a30559": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0xf5e61edb9c9cc6bfbae4463e9a2b1dd6ac3b44ddef38f18016e56ba0363910d9": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x64494413541ff93b31aa309254e3fed72a7456e9845988b915b4c7a7ceba8814": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", - "0x60b9d94c75b7b3f721925089391e4644cd890cb5e6466f9596dfbd2c54e0b280": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x3412d5605ac6cd444957cedb533e5dacad6378b4bc819ebe3652188a665066d6": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", - "0x4b63b79f1e338a49559dcd3193ac9eecc50d0f275d24e97cc8c319e5a31a8bd0": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0xdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d706a": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", - "0x800d5dfe4bba53eedee06cd4546a27da8de00f12db83f56062976d4493fda899": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0xc3ad33e20b0c56a223ad5104fff154aa010f8715b9c981fd38fdc60a4d1a52fc": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5" - } - }, - { - "accountName": "keyless Deployer", - "balance": "0", - "nonce": "1", - "address": "0x694AB5383a002a4796f95530c14Cf0C25ec3EA03" - }, - { - "accountName": "deployer", - "balance": "100000000000000000000000", - "nonce": "8", - "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" - } - ] -} \ No newline at end of file From 89a5e8601ea946e513336df20ec03274e66f81e6 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 20 Dec 2023 13:45:17 +0100 Subject: [PATCH 119/230] add mising parameter to deploymentjson v1v2C --- deployment/v1ToV2/3_deployContracts.ts | 1 + deployment/v1ToV2/4_createRollup.ts | 307 ------------------------- 2 files changed, 1 insertion(+), 307 deletions(-) delete mode 100644 deployment/v1ToV2/4_createRollup.ts diff --git a/deployment/v1ToV2/3_deployContracts.ts b/deployment/v1ToV2/3_deployContracts.ts index a48869724..a44603ea9 100644 --- a/deployment/v1ToV2/3_deployContracts.ts +++ b/deployment/v1ToV2/3_deployContracts.ts @@ -643,6 +643,7 @@ async function main() { polygonRollupManager: polygonZkEVMContract.target, polygonZkEVMBridgeAddress: polygonZkEVMBridgeContract.target, polygonZkEVMGlobalExitRootAddress: polygonZkEVMGlobalExitRoot?.target, + newPolygonZkEVM: newPolygonZkEVMContract.target, polTokenAddress, zkEVMDeployerContract: zkEVMDeployerContract.target, deployerAddress: deployer.address, diff --git a/deployment/v1ToV2/4_createRollup.ts b/deployment/v1ToV2/4_createRollup.ts deleted file mode 100644 index dbc830ca5..000000000 --- a/deployment/v1ToV2/4_createRollup.ts +++ /dev/null @@ -1,307 +0,0 @@ -/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if */ -/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */ -import {expect} from "chai"; -import path = require("path"); -import fs = require("fs"); - -import * as dotenv from "dotenv"; -dotenv.config({path: path.resolve(__dirname, "../../.env")}); -import {ethers, upgrades} from "hardhat"; -import {HardhatEthersSigner} from "@nomicfoundation/hardhat-ethers/signers"; -const {create2Deployment} = require("../helpers/deployment-helpers"); - -const pathGenesis = path.join(__dirname, "./genesis.json"); - -const createRollupParameters = require("./create_rollup_parameters.json"); -const genesis = require("./genesis.json"); -const deployOutput = require("./deploy_output.json"); -import "../helpers/utils"; - -const pathOutputJson = path.join(__dirname, "./create_rollup_output.json"); - -import {PolygonRollupManager, PolygonZkEVMV2, PolygonZkEVMBridgeV2} from "../../typechain-types"; - -async function main() { - const attemptsDeployProxy = 20; - - const outputJson = {} as any; - - /* - * Check deploy parameters - * Check that every necessary parameter is fullfilled - */ - const mandatoryDeploymentParameters = [ - "realVerifier", - "trustedSequencerURL", - "networkName", - "description", - "trustedSequencer", - "chainID", - "adminZkEVM", - "forkID", - "consensusContract", - ]; - - for (const parameterName of mandatoryDeploymentParameters) { - if (createRollupParameters[parameterName] === undefined || createRollupParameters[parameterName] === "") { - throw new Error(`Missing parameter: ${parameterName}`); - } - } - - const { - realVerifier, - trustedSequencerURL, - networkName, - description, - trustedSequencer, - chainID, - adminZkEVM, - forkID, - consensusContract, - } = createRollupParameters; - - const supportedConensus = [ - "PolygonZkEVMEtrog", - "PolygonZkEVMV2", - "PolygonDataComittee", - "PolygonDataComitteeEtrog", - ]; - - if (!supportedConensus.includes(consensusContract)) { - throw new Error(`Consensus contract not supported, supported contracts are: ${supportedConensus}`); - } - - // Load provider - let currentProvider = ethers.provider; - if (createRollupParameters.multiplierGas || createRollupParameters.maxFeePerGas) { - if (process.env.HARDHAT_NETWORK !== "hardhat") { - currentProvider = ethers.getDefaultProvider( - `https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}` - ) as any; - if (createRollupParameters.maxPriorityFeePerGas && createRollupParameters.maxFeePerGas) { - console.log( - `Hardcoded gas used: MaxPriority${createRollupParameters.maxPriorityFeePerGas} gwei, MaxFee${createRollupParameters.maxFeePerGas} gwei` - ); - const FEE_DATA = new ethers.FeeData( - null, - ethers.parseUnits(createRollupParameters.maxFeePerGas, "gwei"), - ethers.parseUnits(createRollupParameters.maxPriorityFeePerGas, "gwei") - ); - - currentProvider.getFeeData = async () => FEE_DATA; - } else { - console.log("Multiplier gas used: ", createRollupParameters.multiplierGas); - async function overrideFeeData() { - const feedata = await ethers.provider.getFeeData(); - return new ethers.FeeData( - null, - ((feedata.maxFeePerGas as bigint) * BigInt(createRollupParameters.multiplierGas)) / 1000n, - ((feedata.maxPriorityFeePerGas as bigint) * BigInt(createRollupParameters.multiplierGas)) / - 1000n - ); - } - currentProvider.getFeeData = overrideFeeData; - } - } - } - - // Load deployer - let deployer; - if (createRollupParameters.deployerPvtKey) { - deployer = new ethers.Wallet(createRollupParameters.deployerPvtKey, currentProvider); - } else if (process.env.MNEMONIC) { - deployer = ethers.HDNodeWallet.fromMnemonic( - ethers.Mnemonic.fromPhrase(process.env.MNEMONIC), - "m/44'/60'/0'/0/0" - ).connect(currentProvider); - } else { - [deployer] = await ethers.getSigners(); - } - - // Load Rollup manager - const PolgonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager", deployer); - const rollupManagerContract = PolgonRollupManagerFactory.attach( - deployOutput.polygonRollupManager - ) as PolygonRollupManager; - - let verifierContract; - if (realVerifier === true) { - const VerifierRollup = await ethers.getContractFactory("FflonkVerifier", deployer); - verifierContract = await VerifierRollup.deploy(); - await verifierContract.waitForDeployment(); - } else { - const VerifierRollupHelperFactory = await ethers.getContractFactory("VerifierRollupHelperMock", deployer); - verifierContract = await VerifierRollupHelperFactory.deploy(); - await verifierContract.waitForDeployment(); - } - console.log("#######################\n"); - console.log("Verifier deployed to:", verifierContract.target); - - // Since it's a mock deployment deployer has all the rights - const ADD_ROLLUP_TYPE_ROLE = ethers.id("ADD_ROLLUP_TYPE_ROLE"); - const CREATE_ROLLUP_ROLE = ethers.id("CREATE_ROLLUP_ROLE"); - - // Check role: - if ((await rollupManagerContract.hasRole(ADD_ROLLUP_TYPE_ROLE, deployer.address)) == false) - await rollupManagerContract.grantRole(ADD_ROLLUP_TYPE_ROLE, deployer.address); - - if ((await rollupManagerContract.hasRole(CREATE_ROLLUP_ROLE, deployer.address)) == false) - await rollupManagerContract.grantRole(CREATE_ROLLUP_ROLE, deployer.address); - - // Create consensus implementation - const PolygonconsensusFactory = (await ethers.getContractFactory(consensusContract, deployer)) as any; - let PolygonconsensusContract; - - PolygonconsensusContract = await PolygonconsensusFactory.deploy( - deployOutput.polygonZkEVMGlobalExitRootAddress, - deployOutput.polTokenAddress, - deployOutput.polygonZkEVMBridgeAddress, - deployOutput.polygonRollupManager - ); - await PolygonconsensusContract.waitForDeployment(); - - if (consensusContract.includes("DataComittee")) { - // deploy data commitee - const PolygonDataComittee = (await ethers.getContractFactory("CDKDataCommittee", deployer)) as any; - let polygonDataComitteeContract; - - for (let i = 0; i < attemptsDeployProxy; i++) { - try { - polygonDataComitteeContract = await upgrades.deployProxy(PolygonDataComittee, []); - break; - } catch (error: any) { - console.log(`attempt ${i}`); - console.log("upgrades.deployProxy of polygonDataComitteeContract ", error.message); - } - // reach limits of attempts - if (i + 1 === attemptsDeployProxy) { - throw new Error("polygonDataComitteeContract contract has not been deployed"); - } - } - // add data commitee to the consensus contract - if ((await PolygonconsensusContract.admin()) == deployer.address) { - await (await PolygonconsensusContract.setDataCommittee(polygonDataComitteeContract?.target)).wait(); - } - - outputJson.polygonDataComitteeContract = polygonDataComitteeContract?.target; - } - - // Add a new rollup type with timelock - const rollupCompatibilityID = 0; - await ( - await rollupManagerContract.addNewRollupType( - PolygonconsensusContract.target, - verifierContract.target, - forkID, - rollupCompatibilityID, - genesis.root, - description - ) - ).wait(); - - console.log("#######################\n"); - console.log("Added new Rollup Type deployed"); - const newRollupTypeID = await rollupManagerContract.rollupTypeCount(); - - let gasTokenAddress, gasTokenNetwork, gasTokenMetadata; - - if ( - createRollupParameters.gasTokenAddress && - createRollupParameters.gasTokenAddress != "" && - createRollupParameters.gasTokenAddress != ethers.ZeroAddress - ) { - // Get bridge instance - const bridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2", deployer); - const polygonZkEVMBridgeContract = bridgeFactory.attach( - deployOutput.polygonZkEVMBridgeAddress - ) as PolygonZkEVMBridgeV2; - - // Get token metadata - gasTokenMetadata = await polygonZkEVMBridgeContract.getTokenMetadata(createRollupParameters.gasTokenAddress); - - const wrappedData = await polygonZkEVMBridgeContract.wrappedTokenToTokenInfo( - createRollupParameters.gasTokenAddress - ); - if (wrappedData.originNetwork != 0n) { - // Wrapped token - gasTokenAddress = wrappedData.originTokenAddress; - gasTokenNetwork = wrappedData.originNetwork; - } else { - // Mainnet token - gasTokenAddress = createRollupParameters.gasTokenAddress; - gasTokenNetwork = 0n; - } - } else { - gasTokenAddress = ethers.ZeroAddress; - gasTokenNetwork = 0; - gasTokenMetadata = "0x"; - } - - const newZKEVMAddress = ethers.getCreateAddress({ - from: rollupManagerContract.target as string, - nonce: await currentProvider.getTransactionCount(rollupManagerContract.target), - }); - - // Create new rollup - const txDeployRollup = await rollupManagerContract.createNewRollup( - newRollupTypeID, - chainID, - adminZkEVM, - trustedSequencer, - gasTokenAddress, - trustedSequencerURL, - networkName - ); - - const receipt = (await txDeployRollup.wait()) as any; - const blockDeploymentRollup = await receipt?.getBlock(); - const timestampReceipt = blockDeploymentRollup.timestamp; - const rollupID = await rollupManagerContract.chainIDToRollupID(chainID); - - console.log("#######################\n"); - console.log("Created new Rollup:", newZKEVMAddress); - - // Assert admin address - expect(await upgrades.erc1967.getAdminAddress(newZKEVMAddress)).to.be.equal(rollupManagerContract.target); - expect(await upgrades.erc1967.getImplementationAddress(newZKEVMAddress)).to.be.equal( - PolygonconsensusContract.target - ); - - // Search added global exit root on the logs - let globalExitRoot; - for (const log of receipt?.logs) { - if (log.address == newZKEVMAddress) { - const parsedLog = PolygonconsensusFactory.interface.parseLog(log); - if (parsedLog != null && parsedLog.name == "InitialSequenceBatches") { - globalExitRoot = parsedLog.args.lastGlobalExitRoot; - } - } - } - - // Add the first batch of the created rollup - const newZKEVMContract = (await PolygonconsensusFactory.attach(newZKEVMAddress)) as PolygonZkEVMV2; - const batchData = { - transactions: await newZKEVMContract.generateInitializeTransaction( - rollupID, - gasTokenAddress, - gasTokenNetwork, - gasTokenMetadata as any - ), - globalExitRoot: globalExitRoot, - timestamp: timestampReceipt, - sequencer: trustedSequencer, - }; - - outputJson.firstBatchData = batchData; - outputJson.genesis = genesis.root; - outputJson.createRollupBlock = blockDeploymentRollup.number; - outputJson.rollupAddress = newZKEVMAddress; - outputJson.verifierAddress = verifierContract.target; - - fs.writeFileSync(pathOutputJson, JSON.stringify(outputJson, null, 1)); -} - -main().catch((e) => { - console.error(e); - process.exit(1); -}); From 0cfb12892b151de54bac667114b33858366d554a Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 20 Dec 2023 15:57:05 +0100 Subject: [PATCH 120/230] add tx on genesis --- deployment/v1ToV2/3_deployContracts.ts | 163 +++++++++++++++++-------- 1 file changed, 114 insertions(+), 49 deletions(-) diff --git a/deployment/v1ToV2/3_deployContracts.ts b/deployment/v1ToV2/3_deployContracts.ts index a44603ea9..4baa5a08c 100644 --- a/deployment/v1ToV2/3_deployContracts.ts +++ b/deployment/v1ToV2/3_deployContracts.ts @@ -14,7 +14,7 @@ const pathOutputJson = path.join(__dirname, "./deploy_output.json"); const pathOngoingDeploymentJson = path.join(__dirname, "./deploy_ongoing.json"); const deployParameters = require("./deploy_parameters.json"); -import {processorUtils} from "@0xpolygonhermez/zkevm-commonjs"; +import {MemDB, ZkEVMDB, getPoseidon, smtUtils, processorUtils} from "@0xpolygonhermez/zkevm-commonjs"; const pathOZUpgradability = path.join(__dirname, `../../.openzeppelin/${process.env.HARDHAT_NETWORK}.json`); const genesis = require("./genesis.json"); @@ -545,54 +545,119 @@ async function main() { expect(await upgrades.erc1967.getAdminAddress(precalculateGlobalExitRootAddress)).to.be.equal(proxyAdminAddress); expect(await upgrades.erc1967.getAdminAddress(proxyBridgeAddress)).to.be.equal(proxyAdminAddress); - // // Approve tokens - // const maticAmount = ethers.parseEther("1"); - // const polTokenFactory = await ethers.getContractFactory("ERC20PermitMock", deployer); - // const polTokenContract = polTokenFactory.attach(polTokenAddress) as any; - // await (await polTokenContract.approve(polygonZkEVMContract.target, maticAmount)).wait(); - - // // Sequence batches - // const tx = ethers.Transaction.from({ - // to: deployer.address, - // nonce: 0, - // value: 1, - // gasLimit: 21000, - // gasPrice: 1, - // data: "0x", - // chainId: chainID, - // type: 0, // legacy transaction - // }); - - // const signer = ethers.HDNodeWallet.fromMnemonic( - // ethers.Mnemonic.fromPhrase("test test test test test test test test test test test junk"), - // "m/44'/60'/0'/0/0" - // ).connect(currentProvider); - - // const signedTx = await signer.signTransaction(tx); - // const l2txData = processorUtils.rawTxToCustomRawTx(signedTx); - // const currentTimestamp = (await currentProvider.getBlock("latest"))?.timestamp; - - // const sequence = { - // transactions: l2txData, - // globalExitRoot: ethers.ZeroHash, - // timestamp: currentTimestamp, - // minForcedTimestamp: 0, - // } as any; - // await (await polygonZkEVMContract.sequenceBatches([sequence], trustedSequencer)).wait(); - - // // Verify batches - // const newStateRoot = "0x0000000000000000000000000000000000000000000000000000000000000000"; - // const zkProofFFlonk = new Array(24).fill(ethers.ZeroHash); - // await ( - // await polygonZkEVMContract.verifyBatchesTrustedAggregator( - // 0, // pending state not used - // 0, // old batch - // 1, // new batch - // ethers.ZeroHash, // local exit root - // newStateRoot, - // new Array(24).fill(ethers.ZeroHash) - // ) - // ).wait(); + // Load genesis on a zkEVMDB + const poseidon = await getPoseidon(); + const {F} = poseidon; + const db = new MemDB(F); + const genesisRoot = [F.zero, F.zero, F.zero, F.zero]; + const accHashInput = [F.zero, F.zero, F.zero, F.zero]; + const zkEVMDB = await ZkEVMDB.newZkEVM( + db, + poseidon, + genesisRoot, + accHashInput, + genesis.genesis, + null, + null, + chainID + ); + + // Build batch params + const currentTimestamp = (await currentProvider.getBlock("latest"))?.timestamp; + const options = {skipUpdateSystemStorage: true}; + const batch = await zkEVMDB.buildBatch( + currentTimestamp, + trustedSequencer, + smtUtils.stringToH4(ethers.ZeroHash), + undefined, + options + ); + + // Load signer + const signer = ethers.HDNodeWallet.fromMnemonic( + ethers.Mnemonic.fromPhrase("test test test test test test test test test test test junk"), + "m/44'/60'/0'/0/0" + ).connect(currentProvider); + + let initialNonceGenesis = 8; + const polTokenFactory = await ethers.getContractFactory("ERC20PermitMock", deployer); + + const txArray = [ + // test normal ether transfer + ethers.Transaction.from({ + to: deployer.address, + nonce: initialNonceGenesis++, + value: 1, + gasLimit: 21000, + gasPrice: 1, + data: "0x", + chainId: chainID, + type: 0, // legacy transaction + }), + // test deployment transactions + ethers.Transaction.from({ + to: null, + nonce: initialNonceGenesis++, + value: 0, + gasLimit: 10000000, + gasPrice: 1, + data: ( + await polTokenFactory.getDeployTransaction( + "Polygon Token", + "POL", + deployer.address, + ethers.parseEther("1000") + ) + ).data, + chainId: chainID, + type: 0, // legacy transaction + }), + ]; + + for (let i = 0; i < txArray.length; i++) { + const currentTx = txArray[i]; + const signedTx = await signer.signTransaction(currentTx); + const newTx = processorUtils.rawTxToCustomRawTx(signedTx); + // Add the raw tx to the batch builder + batch.addRawTx(newTx); + } + + // execute the transactions added to the batch + await batch.executeTxs(); + // consolidate state + await zkEVMDB.consolidate(batch); + + const sequence = { + transactions: batch.getBatchL2Data(), + globalExitRoot: ethers.ZeroHash, + timestamp: currentTimestamp, + minForcedTimestamp: 0, + } as any; + + // Approve tokens + const maticAmount = ethers.parseEther("1"); + const polTokenContract = polTokenFactory.attach(polTokenAddress) as any; + await (await polTokenContract.approve(polygonZkEVMContract.target, maticAmount)).wait(); + + // Sequence batches + await (await polygonZkEVMContract.sequenceBatches([sequence], trustedSequencer)).wait(); + + // Verify batches + const oldBatch = 0; + const newBatch = 1; + const newRoot = smtUtils.h4toString(batch.currentStateRoot); + const zkProofFFlonk = new Array(24).fill(ethers.ZeroHash); + + await ( + await polygonZkEVMContract.verifyBatchesTrustedAggregator( + 0, // pending state not used + oldBatch, + newBatch, + ethers.ZeroHash, // local exit root + newRoot, + zkProofFFlonk + ) + ).wait(); // TRrnsfer roles await (await polygonZkEVMContract.setTrustedSequencer(trustedSequencer)).wait(); From 0400b143940a2b0a092a181cb211274f88456270 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 8 Jan 2024 13:55:50 +0100 Subject: [PATCH 121/230] upsie --- deployment/v1ToV2/3_deployContracts.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/v1ToV2/3_deployContracts.ts b/deployment/v1ToV2/3_deployContracts.ts index 4baa5a08c..06756596f 100644 --- a/deployment/v1ToV2/3_deployContracts.ts +++ b/deployment/v1ToV2/3_deployContracts.ts @@ -564,7 +564,7 @@ async function main() { // Build batch params const currentTimestamp = (await currentProvider.getBlock("latest"))?.timestamp; - const options = {skipUpdateSystemStorage: true}; + const options = {skipUpdateSystemStorage: false}; const batch = await zkEVMDB.buildBatch( currentTimestamp, trustedSequencer, From b7ced4e61d404be14c24d86197e2e9b817fe25cf Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 9 Jan 2024 17:50:49 +0100 Subject: [PATCH 122/230] fix type --- .../v2/consensus/dataComittee/PolygonDataComitteeEtrog.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/v2/consensus/dataComittee/PolygonDataComitteeEtrog.sol b/contracts/v2/consensus/dataComittee/PolygonDataComitteeEtrog.sol index 465a4e7c6..adbe605eb 100644 --- a/contracts/v2/consensus/dataComittee/PolygonDataComitteeEtrog.sol +++ b/contracts/v2/consensus/dataComittee/PolygonDataComitteeEtrog.sol @@ -32,7 +32,7 @@ contract PolygonDataComitteeEtrog is bytes32 transactionsHash; bytes32 forcedGlobalExitRoot; uint64 forcedTimestamp; - uint64 forcedBlockHashL1; + bytes32 forcedBlockHashL1; } // CDK Data Committee Address From 6b610512de1062f32985bfafd99b7c7500bda56e Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 15 Jan 2024 11:43:00 +0100 Subject: [PATCH 123/230] update v2ToV2 Etrog --- .../zkEVM/PolygonZkEVMV2ExistentEtrog.sol | 67 +++++++++++++++++++ deployment/v1ToV2/3_deployContracts.ts | 2 +- 2 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 contracts/v2/consensus/zkEVM/PolygonZkEVMV2ExistentEtrog.sol diff --git a/contracts/v2/consensus/zkEVM/PolygonZkEVMV2ExistentEtrog.sol b/contracts/v2/consensus/zkEVM/PolygonZkEVMV2ExistentEtrog.sol new file mode 100644 index 000000000..ba47c308f --- /dev/null +++ b/contracts/v2/consensus/zkEVM/PolygonZkEVMV2ExistentEtrog.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity ^0.8.20; + +import "../../lib/PolygonRollupBaseEtrog.sol"; + +/** + * 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. + */ +contract PolygonZkEVMV2ExistentEtrog is PolygonRollupBaseEtrog { + /** + * @param _globalExitRootManager Global exit root manager address + * @param _pol POL token address + * @param _bridgeAddress Bridge address + * @param _rollupManager Global exit root manager address + */ + constructor( + IPolygonZkEVMGlobalExitRootV2 _globalExitRootManager, + IERC20Upgradeable _pol, + IPolygonZkEVMBridgeV2 _bridgeAddress, + PolygonRollupManager _rollupManager + ) + PolygonRollupBaseEtrog( + _globalExitRootManager, + _pol, + _bridgeAddress, + _rollupManager + ) + {} + + /** + * note This initializer will be called instead of the PolygonRollupBase + * This is a especial initializer since the zkEVM it's an already created network + * @param _admin Admin address + * @param _trustedSequencer Trusted sequencer address + * @param _trustedSequencerURL Trusted sequencer URL + * @param _networkName L2 network name + * @param _lastAccInputHash Acc input hash + */ + function initializeUpgrade( + address _admin, + address _trustedSequencer, + string memory _trustedSequencerURL, + string memory _networkName, + bytes32 _lastAccInputHash, + uint64 /*_lastTimestamp*/ // review + ) external onlyRollupManager initializer { + admin = _admin; + trustedSequencer = _trustedSequencer; + + trustedSequencerURL = _trustedSequencerURL; + networkName = _networkName; + + // zkEVM Upgraded variables + lastAccInputHash = _lastAccInputHash; + + // Constant deployment variables + forceBatchTimeout = 5 days; + + // Both gasTokenAddress and gasTokenNetwork are 0, since it uses ether as gas token + // Therefore is not necessary to set the variables + } +} diff --git a/deployment/v1ToV2/3_deployContracts.ts b/deployment/v1ToV2/3_deployContracts.ts index 06756596f..e6ada9805 100644 --- a/deployment/v1ToV2/3_deployContracts.ts +++ b/deployment/v1ToV2/3_deployContracts.ts @@ -665,7 +665,7 @@ async function main() { await (await polygonZkEVMContract.transferAdminRole(adminZkEVM)).wait(); // Update current system to rollup manager - const PolygonZkEVMV2ExistentFactory = await ethers.getContractFactory("PolygonZkEVMV2Existent"); + const PolygonZkEVMV2ExistentFactory = await ethers.getContractFactory("PolygonZkEVMV2ExistentEtrog"); const newPolygonZkEVMContract = (await upgrades.deployProxy(PolygonZkEVMV2ExistentFactory, [], { initializer: false, From a1a75477d605b47f833cb370745762a12cf78554 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 15 Jan 2024 14:21:21 +0100 Subject: [PATCH 124/230] fix deployment data commitee --- deployment/v2/4_createRollup.ts | 64 +++++++++++++++++++-------------- 1 file changed, 37 insertions(+), 27 deletions(-) diff --git a/deployment/v2/4_createRollup.ts b/deployment/v2/4_createRollup.ts index dbc830ca5..ef3ece7ed 100644 --- a/deployment/v2/4_createRollup.ts +++ b/deployment/v2/4_createRollup.ts @@ -19,7 +19,13 @@ import "../helpers/utils"; const pathOutputJson = path.join(__dirname, "./create_rollup_output.json"); -import {PolygonRollupManager, PolygonZkEVMV2, PolygonZkEVMBridgeV2} from "../../typechain-types"; +import { + PolygonRollupManager, + PolygonZkEVMV2, + PolygonZkEVMBridgeV2, + PolygonDataComittee, + PolygonDataComitteeEtrog, +} from "../../typechain-types"; async function main() { const attemptsDeployProxy = 20; @@ -160,32 +166,6 @@ async function main() { ); await PolygonconsensusContract.waitForDeployment(); - if (consensusContract.includes("DataComittee")) { - // deploy data commitee - const PolygonDataComittee = (await ethers.getContractFactory("CDKDataCommittee", deployer)) as any; - let polygonDataComitteeContract; - - for (let i = 0; i < attemptsDeployProxy; i++) { - try { - polygonDataComitteeContract = await upgrades.deployProxy(PolygonDataComittee, []); - break; - } catch (error: any) { - console.log(`attempt ${i}`); - console.log("upgrades.deployProxy of polygonDataComitteeContract ", error.message); - } - // reach limits of attempts - if (i + 1 === attemptsDeployProxy) { - throw new Error("polygonDataComitteeContract contract has not been deployed"); - } - } - // add data commitee to the consensus contract - if ((await PolygonconsensusContract.admin()) == deployer.address) { - await (await PolygonconsensusContract.setDataCommittee(polygonDataComitteeContract?.target)).wait(); - } - - outputJson.polygonDataComitteeContract = polygonDataComitteeContract?.target; - } - // Add a new rollup type with timelock const rollupCompatibilityID = 0; await ( @@ -261,6 +241,36 @@ async function main() { console.log("#######################\n"); console.log("Created new Rollup:", newZKEVMAddress); + if (consensusContract.includes("DataComittee")) { + // deploy data commitee + const PolygonDataComittee = (await ethers.getContractFactory("CDKDataCommittee", deployer)) as any; + let polygonCDKComittee; + + for (let i = 0; i < attemptsDeployProxy; i++) { + try { + polygonCDKComittee = await upgrades.deployProxy(PolygonDataComittee, []); + break; + } catch (error: any) { + console.log(`attempt ${i}`); + console.log("upgrades.deployProxy of polygonCDKComittee ", error.message); + } + // reach limits of attempts + if (i + 1 === attemptsDeployProxy) { + throw new Error("polygonCDKComittee contract has not been deployed"); + } + } + // Load data commitee + const PolygonDataComiteeContract = (await PolygonconsensusFactory.attach( + newZKEVMAddress + )) as PolygonDataComittee; + // add data commitee to the consensus contract + if ((await PolygonDataComiteeContract.admin()) == deployer.address) { + await (await PolygonDataComiteeContract.setDataCommittee(polygonCDKComittee?.target as any)).wait(); + } + + outputJson.polygonCDKComittee = polygonCDKComittee?.target; + } + // Assert admin address expect(await upgrades.erc1967.getAdminAddress(newZKEVMAddress)).to.be.equal(rollupManagerContract.target); expect(await upgrades.erc1967.getImplementationAddress(newZKEVMAddress)).to.be.equal( From b9eaa788e74f1903504366ec443935165f3a1017 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 15 Jan 2024 14:56:16 +0100 Subject: [PATCH 125/230] set data commitee 0 --- deployment/v2/4_createRollup.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/deployment/v2/4_createRollup.ts b/deployment/v2/4_createRollup.ts index ef3ece7ed..aa723a1d1 100644 --- a/deployment/v2/4_createRollup.ts +++ b/deployment/v2/4_createRollup.ts @@ -266,6 +266,9 @@ async function main() { // add data commitee to the consensus contract if ((await PolygonDataComiteeContract.admin()) == deployer.address) { await (await PolygonDataComiteeContract.setDataCommittee(polygonCDKComittee?.target as any)).wait(); + + // Setup data commitee to 0 + await (await polygonCDKComittee?.setupCommittee(0, [], "0x")).wait(); } outputJson.polygonCDKComittee = polygonCDKComittee?.target; From 7c4516b257b862012ed08abf647a909adad42c7f Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 13 Dec 2023 18:27:02 +0100 Subject: [PATCH 126/230] possible fix wrapped address --- contracts/PolygonZkEVMBridge.sol | 2 +- .../IBasePolygonZkEVMGlobalExitRoot.sol | 2 +- .../interfaces/IBridgeMessageReceiver.sol | 2 +- contracts/interfaces/IPolygonZkEVMBridge.sol | 2 +- contracts/lib/DepositContract.sol | 2 +- contracts/lib/EmergencyManager.sol | 2 +- contracts/lib/GlobalExitRootLib.sol | 2 +- contracts/lib/TokenWrapped.sol | 2 +- contracts/v2/PolygonZkEVMBridgeV2.sol | 55 ++++++++++++++----- .../v2/interfaces/IPolygonZkEVMBridgeV2.sol | 2 +- contracts/v2/lib/DepositContractBase.sol | 2 +- contracts/v2/lib/DepositContractV2.sol | 2 +- hardhat.config.ts | 5 +- 13 files changed, 54 insertions(+), 28 deletions(-) diff --git a/contracts/PolygonZkEVMBridge.sol b/contracts/PolygonZkEVMBridge.sol index 1892f6b26..552e361ad 100644 --- a/contracts/PolygonZkEVMBridge.sol +++ b/contracts/PolygonZkEVMBridge.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.20; +pragma solidity ^0.8.20; import "./lib/DepositContract.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; diff --git a/contracts/interfaces/IBasePolygonZkEVMGlobalExitRoot.sol b/contracts/interfaces/IBasePolygonZkEVMGlobalExitRoot.sol index 3d558f9b0..c631aceca 100644 --- a/contracts/interfaces/IBasePolygonZkEVMGlobalExitRoot.sol +++ b/contracts/interfaces/IBasePolygonZkEVMGlobalExitRoot.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.20; +pragma solidity ^0.8.17; interface IBasePolygonZkEVMGlobalExitRoot { /** diff --git a/contracts/interfaces/IBridgeMessageReceiver.sol b/contracts/interfaces/IBridgeMessageReceiver.sol index 2bee23ab3..45ff185bb 100644 --- a/contracts/interfaces/IBridgeMessageReceiver.sol +++ b/contracts/interfaces/IBridgeMessageReceiver.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.20; +pragma solidity ^0.8.17; /** * @dev Define interface for PolygonZkEVM Bridge message receiver diff --git a/contracts/interfaces/IPolygonZkEVMBridge.sol b/contracts/interfaces/IPolygonZkEVMBridge.sol index 716b0a550..cbde9fc87 100644 --- a/contracts/interfaces/IPolygonZkEVMBridge.sol +++ b/contracts/interfaces/IPolygonZkEVMBridge.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.20; +pragma solidity ^0.8.17; interface IPolygonZkEVMBridge { /** diff --git a/contracts/lib/DepositContract.sol b/contracts/lib/DepositContract.sol index 24bc34ab2..1f020f86a 100644 --- a/contracts/lib/DepositContract.sol +++ b/contracts/lib/DepositContract.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.20; +pragma solidity ^0.8.17; import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; diff --git a/contracts/lib/EmergencyManager.sol b/contracts/lib/EmergencyManager.sol index 6ea9378d9..1c287cad1 100644 --- a/contracts/lib/EmergencyManager.sol +++ b/contracts/lib/EmergencyManager.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.20; +pragma solidity ^0.8.17; /** * @dev Contract helper responsible to manage the emergency state diff --git a/contracts/lib/GlobalExitRootLib.sol b/contracts/lib/GlobalExitRootLib.sol index f0c773857..947317282 100644 --- a/contracts/lib/GlobalExitRootLib.sol +++ b/contracts/lib/GlobalExitRootLib.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.20; +pragma solidity ^0.8.17; /** * @dev A library that provides the necessary calculations to calculate the global exit root diff --git a/contracts/lib/TokenWrapped.sol b/contracts/lib/TokenWrapped.sol index 50eb3a995..4442b25f0 100644 --- a/contracts/lib/TokenWrapped.sol +++ b/contracts/lib/TokenWrapped.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-3.0 // Implementation of permit based on https://github.com/WETH10/WETH10/blob/main/contracts/WETH10.sol -pragma solidity 0.8.20; +pragma solidity ^0.8.17; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index 1251d8846..eeb9c3812 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -51,9 +51,13 @@ contract PolygonZkEVMBridgeV2 is // Nullifier offset uint256 private constant _MAX_LEAFS_PER_NETWORK = 2 ** 32; - // // Indicate where's the mainnet flag bit in the global index + // Indicate where's the mainnet flag bit in the global index uint256 private constant _GLOBAL_INDEX_MAINNET_FLAG = 2 ** 64; + // Init code of the erc20 wrapped token + bytes private constant _BASE_INIT_BYTCODE_WRAPPED_TOKEN = + hex"6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea2646970667358221220d1961e711f962f770679c80ebfabbda76d7b41439e16632bbd174d9ee7f2789264736f6c63430008110033"; + // Network identifier uint32 public networkID; @@ -123,11 +127,21 @@ contract PolygonZkEVMBridgeV2 is gasTokenNetwork = _gasTokenNetwork; gasTokenMetadata = _gasTokenMetadata; - WETHToken = (new TokenWrapped){salt: bytes32(0)}( - "Wrapped Ether", - "WETH", - 18 + TokenWrapped newWrappedToken; + bytes memory initBytecode = abi.encodePacked( + _BASE_INIT_BYTCODE_WRAPPED_TOKEN, + abi.encode("Wrapped Ether", "WETH", 18) ); + + assembly { + newWrappedToken := create2( + 0, // 0 value + add(initBytecode, 0x20), + mload(initBytecode), + 0 // 0 salt + ) + } + WETHToken = newWrappedToken; } // Initialize OZ contracts @@ -517,16 +531,29 @@ contract PolygonZkEVMBridgeV2 is if (wrappedToken == address(0)) { // Get ERC20 metadata - ( - string memory name, - string memory symbol, - uint8 decimals - ) = abi.decode(metadata, (string, string, uint8)); + { + ( + string memory name, + string memory symbol, + uint8 decimals + ) = abi.decode(metadata, (string, string, uint8)); + } // Create a new wrapped erc20 using create2 - TokenWrapped newWrappedToken = (new TokenWrapped){ - salt: tokenInfoHash - }(name, symbol, decimals); + bytes memory initBytecode = abi.encodePacked( + _BASE_INIT_BYTCODE_WRAPPED_TOKEN, + metadata + ); + + TokenWrapped newWrappedToken; + assembly { + newWrappedToken := create2( + 0, + add(initBytecode, 0x20), + mload(initBytecode), + tokenInfoHash + ) + } // Mint tokens for the destination address newWrappedToken.mint(destinationAddress, amount); @@ -693,7 +720,7 @@ contract PolygonZkEVMBridgeV2 is salt, keccak256( abi.encodePacked( - type(TokenWrapped).creationCode, + _BASE_INIT_BYTCODE_WRAPPED_TOKEN, abi.encode(name, symbol, decimals) ) ) diff --git a/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol b/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol index 95ddb2316..a2f679d53 100644 --- a/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol +++ b/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.20; +pragma solidity ^0.8.17; import "../../interfaces/IBasePolygonZkEVMGlobalExitRoot.sol"; interface IPolygonZkEVMBridgeV2 { diff --git a/contracts/v2/lib/DepositContractBase.sol b/contracts/v2/lib/DepositContractBase.sol index a93f0a90f..13c9c55c2 100644 --- a/contracts/v2/lib/DepositContractBase.sol +++ b/contracts/v2/lib/DepositContractBase.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.20; +pragma solidity ^0.8.17; /** * This contract will be used as a helper for all the sparse merkle tree related functions diff --git a/contracts/v2/lib/DepositContractV2.sol b/contracts/v2/lib/DepositContractV2.sol index 57995dfb4..b03075318 100644 --- a/contracts/v2/lib/DepositContractV2.sol +++ b/contracts/v2/lib/DepositContractV2.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.20; +pragma solidity ^0.8.17; import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; import "./DepositContractBase.sol"; diff --git a/hardhat.config.ts b/hardhat.config.ts index 63482fe44..c7eb53394 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -96,13 +96,12 @@ const config: HardhatUserConfig = { }, }, "contracts/lib/TokenWrapped.sol": { - version: "0.8.20", + version: "0.8.17", settings: { optimizer: { enabled: true, - runs: 999, // must be the same as bridge, for testing porpuses + runs: 999999, // must be the same as the previous bridge }, - evmVersion: "shanghai", }, }, "contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol": { From c40c7d83b0b2fe6aa403c4e4a0be1b08dbf3b6ed Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 18 Dec 2023 19:06:15 +0100 Subject: [PATCH 127/230] cleaner --- contracts/v2/PolygonZkEVMBridgeV2.sol | 67 +++++++++++-------- .../v2/interfaces/IPolygonZkEVMBridgeV2.sol | 5 ++ .../PolygonRollupManagerUpgrade.test.ts | 34 +++++----- 3 files changed, 60 insertions(+), 46 deletions(-) diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index eeb9c3812..f324ba769 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -4,11 +4,11 @@ pragma solidity 0.8.20; import "./lib/DepositContractV2.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol"; import "../lib/TokenWrapped.sol"; import "../interfaces/IBasePolygonZkEVMGlobalExitRoot.sol"; import "../interfaces/IBridgeMessageReceiver.sol"; import "./interfaces/IPolygonZkEVMBridgeV2.sol"; -import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol"; import "../lib/EmergencyManager.sol"; import "../lib/GlobalExitRootLib.sol"; @@ -54,8 +54,8 @@ contract PolygonZkEVMBridgeV2 is // Indicate where's the mainnet flag bit in the global index uint256 private constant _GLOBAL_INDEX_MAINNET_FLAG = 2 ** 64; - // Init code of the erc20 wrapped token - bytes private constant _BASE_INIT_BYTCODE_WRAPPED_TOKEN = + // Init code of the erc20 wrapped token, to deploy a wrapped token the constructor parameters must be appended + bytes private constant _BASE_INIT_BYTECODE_WRAPPED_TOKEN = hex"6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea2646970667358221220d1961e711f962f770679c80ebfabbda76d7b41439e16632bbd174d9ee7f2789264736f6c63430008110033"; // Network identifier @@ -127,21 +127,11 @@ contract PolygonZkEVMBridgeV2 is gasTokenNetwork = _gasTokenNetwork; gasTokenMetadata = _gasTokenMetadata; - TokenWrapped newWrappedToken; - bytes memory initBytecode = abi.encodePacked( - _BASE_INIT_BYTCODE_WRAPPED_TOKEN, + // Create a wrapped token for WETH, with salt == 0 + WETHToken = _deployWrappedToken( + 0, // salt abi.encode("Wrapped Ether", "WETH", 18) ); - - assembly { - newWrappedToken := create2( - 0, // 0 value - add(initBytecode, 0x20), - mload(initBytecode), - 0 // 0 salt - ) - } - WETHToken = newWrappedToken; } // Initialize OZ contracts @@ -532,6 +522,7 @@ contract PolygonZkEVMBridgeV2 is if (wrappedToken == address(0)) { // Get ERC20 metadata { + // Decode the metadata just as a sanity check of correct encoding ( string memory name, string memory symbol, @@ -540,21 +531,11 @@ contract PolygonZkEVMBridgeV2 is } // Create a new wrapped erc20 using create2 - bytes memory initBytecode = abi.encodePacked( - _BASE_INIT_BYTCODE_WRAPPED_TOKEN, + TokenWrapped newWrappedToken = _deployWrappedToken( + tokenInfoHash, metadata ); - TokenWrapped newWrappedToken; - assembly { - newWrappedToken := create2( - 0, - add(initBytecode, 0x20), - mload(initBytecode), - tokenInfoHash - ) - } - // Mint tokens for the destination address newWrappedToken.mint(destinationAddress, amount); @@ -720,7 +701,7 @@ contract PolygonZkEVMBridgeV2 is salt, keccak256( abi.encodePacked( - _BASE_INIT_BYTCODE_WRAPPED_TOKEN, + _BASE_INIT_BYTECODE_WRAPPED_TOKEN, abi.encode(name, symbol, decimals) ) ) @@ -1042,6 +1023,34 @@ contract PolygonZkEVMBridgeV2 is } } + /** + * @notice Internal function that uses create2 to deploy the wrapped tokens + * @param salt Salt used in create2 params, + * tokenInfoHash will be used as salt for all wrappeds except for bridge native WETH, that will be bytes32(0) + * @param constructorArgs Encoded constructor args for the wrapped token + */ + function _deployWrappedToken( + bytes32 salt, + bytes memory constructorArgs + ) internal returns (TokenWrapped newWrappedToken) { + bytes memory initBytecode = abi.encodePacked( + _BASE_INIT_BYTECODE_WRAPPED_TOKEN, + constructorArgs + ); + + /// @solidity memory-safe-assembly + assembly { + newWrappedToken := create2( + 0, + add(initBytecode, 0x20), + mload(initBytecode), + salt + ) + } + if (address(newWrappedToken) == address(0)) + revert FailedTokenWrappedDeployment(); + } + // Helpers to safely get the metadata from a token, inspired by https://github.com/traderjoe-xyz/joe-core/blob/main/contracts/MasterChefJoeV3.sol#L55-L95 /** diff --git a/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol b/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol index a2f679d53..839b1c155 100644 --- a/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol +++ b/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol @@ -84,6 +84,11 @@ interface IPolygonZkEVMBridgeV2 { */ error GasTokenNetworkMustBeZeroOnEther(); + /** + * @dev Thrown when the wrapped token deployment fails + */ + error FailedTokenWrappedDeployment(); + function wrappedTokenToTokenInfo( address destinationAddress ) external returns (uint32, address); diff --git a/test/contractsv2/PolygonRollupManagerUpgrade.test.ts b/test/contractsv2/PolygonRollupManagerUpgrade.test.ts index 0cadad609..fad570f77 100644 --- a/test/contractsv2/PolygonRollupManagerUpgrade.test.ts +++ b/test/contractsv2/PolygonRollupManagerUpgrade.test.ts @@ -275,7 +275,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { it("should check full flow", async () => { const urlSequencer = "http://zkevm-json-rpc:8123"; - const chainID = 1000; + const chainID2 = 1001; const networkName = "zkevm"; const forkID = 0; const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001"; @@ -376,7 +376,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { await expect( rollupManagerContract.createNewRollup( newRollupTypeID, - chainID, + chainID2, admin.address, trustedSequencer.address, gasTokenAddress, @@ -391,7 +391,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { .connect(admin) .createNewRollup( 0, - chainID, + chainID2, admin.address, trustedSequencer.address, gasTokenAddress, @@ -411,7 +411,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { .connect(admin) .createNewRollup( newRollupTypeID, - chainID, + chainID2, admin.address, trustedSequencer.address, gasTokenAddress, @@ -435,7 +435,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { .connect(admin) .createNewRollup( newRollupTypeID, - chainID, + chainID2, admin.address, trustedSequencer.address, gasTokenAddress, @@ -444,7 +444,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { ) ) .to.emit(rollupManagerContract, "CreateNewRollup") - .withArgs(newCreatedRollupID, newRollupTypeID, newZKEVMAddress, chainID, gasTokenAddress) + .withArgs(newCreatedRollupID, newRollupTypeID, newZKEVMAddress, chainID2, gasTokenAddress) .to.emit(newZkEVMContract, "InitialSequenceBatches") .to.emit(rollupManagerContract, "OnSequenceBatches") .withArgs(newCreatedRollupID, newSequencedBatch); @@ -464,7 +464,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { .connect(admin) .createNewRollup( newRollupTypeID, - chainID, + chainID2, admin.address, trustedSequencer.address, gasTokenAddress, @@ -514,7 +514,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { // Check mapping on rollup Manager const rollupData = await rollupManagerContract.rollupIDToRollupData(newCreatedRollupID); expect(rollupData.rollupContract).to.be.equal(newZKEVMAddress); - expect(rollupData.chainID).to.be.equal(chainID); + expect(rollupData.chainID).to.be.equal(chainID2); expect(rollupData.verifier).to.be.equal(verifierContract.target); expect(rollupData.forkID).to.be.equal(forkID); expect(rollupData.lastLocalExitRoot).to.be.equal(ethers.ZeroHash); @@ -804,7 +804,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { it("should check full flow no trusted aggreagtor", async () => { const urlSequencer = "http://zkevm-json-rpc:8123"; - const chainID = 1000; + const chainID2 = 1001; const networkName = "zkevm"; const forkID = 0; const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001"; @@ -905,7 +905,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { await expect( rollupManagerContract.createNewRollup( newRollupTypeID, - chainID, + chainID2, admin.address, trustedSequencer.address, gasTokenAddress, @@ -920,7 +920,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { .connect(admin) .createNewRollup( 0, - chainID, + chainID2, admin.address, trustedSequencer.address, gasTokenAddress, @@ -940,7 +940,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { .connect(admin) .createNewRollup( newRollupTypeID, - chainID, + chainID2, admin.address, trustedSequencer.address, gasTokenAddress, @@ -964,7 +964,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { .connect(admin) .createNewRollup( newRollupTypeID, - chainID, + chainID2, admin.address, trustedSequencer.address, gasTokenAddress, @@ -973,7 +973,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { ) ) .to.emit(rollupManagerContract, "CreateNewRollup") - .withArgs(newCreatedRollupID, newRollupTypeID, newZKEVMAddress, chainID, gasTokenAddress) + .withArgs(newCreatedRollupID, newRollupTypeID, newZKEVMAddress, chainID2, gasTokenAddress) .to.emit(newZkEVMContract, "InitialSequenceBatches") .to.emit(rollupManagerContract, "OnSequenceBatches") .withArgs(newCreatedRollupID, newSequencedBatch); @@ -987,13 +987,13 @@ describe("Polygon ZK-EVM TestnetV2", () => { expect(await newZkEVMContract.forceBatchTimeout()).to.be.equal(FORCE_BATCH_TIMEOUT); expect(await newZkEVMContract.lastTimestamp()).to.be.equal(timestampCreatedRollup); - // Cannot create 2 chains with the same chainID + // Cannot create 2 chains with the same chainID2 await expect( rollupManagerContract .connect(admin) .createNewRollup( newRollupTypeID, - chainID, + chainID2, admin.address, trustedSequencer.address, gasTokenAddress, @@ -1043,7 +1043,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { // Check mapping on rollup Manager const rollupData = await rollupManagerContract.rollupIDToRollupData(newCreatedRollupID); expect(rollupData.rollupContract).to.be.equal(newZKEVMAddress); - expect(rollupData.chainID).to.be.equal(chainID); + expect(rollupData.chainID).to.be.equal(chainID2); expect(rollupData.verifier).to.be.equal(verifierContract.target); expect(rollupData.forkID).to.be.equal(forkID); expect(rollupData.lastLocalExitRoot).to.be.equal(ethers.ZeroHash); From 991bd9858d9bd5a68015a5dede57636b808605f3 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 18 Dec 2023 19:43:29 +0100 Subject: [PATCH 128/230] same address mainnet --- contracts/PolygonZkEVMBridge.sol | 2 +- .../IBasePolygonZkEVMGlobalExitRoot.sol | 2 +- .../interfaces/IBridgeMessageReceiver.sol | 2 +- contracts/interfaces/IPolygonZkEVMBridge.sol | 2 +- contracts/lib/DepositContract.sol | 2 +- contracts/lib/EmergencyManager.sol | 2 +- contracts/lib/GlobalExitRootLib.sol | 2 +- contracts/lib/TokenWrapped.sol | 2 +- contracts/v2/PolygonZkEVMBridgeV2.sol | 8 +- .../v2/interfaces/IPolygonZkEVMBridgeV2.sol | 2 +- contracts/v2/lib/DepositContractBase.sol | 2 +- contracts/v2/lib/DepositContractV2.sol | 2 +- hardhat.config.ts | 9 -- test/contractsv2/BridgeV2.test.ts | 2 +- test/contractsv2/BridgeV2GasTokens.test.ts | 4 +- test/contractsv2/BridgeWrappedAddress.test.ts | 93 +++++++++++++++++++ test/contractsv2/PolygonRollupManager.test.ts | 12 +-- .../PolygonRollupManagerUpgrade.test.ts | 8 +- test/contractsv2/PolygonZkEVMV2.test.ts | 2 +- 19 files changed, 122 insertions(+), 38 deletions(-) create mode 100644 test/contractsv2/BridgeWrappedAddress.test.ts diff --git a/contracts/PolygonZkEVMBridge.sol b/contracts/PolygonZkEVMBridge.sol index 552e361ad..1892f6b26 100644 --- a/contracts/PolygonZkEVMBridge.sol +++ b/contracts/PolygonZkEVMBridge.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.20; +pragma solidity 0.8.20; import "./lib/DepositContract.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; diff --git a/contracts/interfaces/IBasePolygonZkEVMGlobalExitRoot.sol b/contracts/interfaces/IBasePolygonZkEVMGlobalExitRoot.sol index c631aceca..3d558f9b0 100644 --- a/contracts/interfaces/IBasePolygonZkEVMGlobalExitRoot.sol +++ b/contracts/interfaces/IBasePolygonZkEVMGlobalExitRoot.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; interface IBasePolygonZkEVMGlobalExitRoot { /** diff --git a/contracts/interfaces/IBridgeMessageReceiver.sol b/contracts/interfaces/IBridgeMessageReceiver.sol index 45ff185bb..b9083ee77 100644 --- a/contracts/interfaces/IBridgeMessageReceiver.sol +++ b/contracts/interfaces/IBridgeMessageReceiver.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; /** * @dev Define interface for PolygonZkEVM Bridge message receiver diff --git a/contracts/interfaces/IPolygonZkEVMBridge.sol b/contracts/interfaces/IPolygonZkEVMBridge.sol index cbde9fc87..716b0a550 100644 --- a/contracts/interfaces/IPolygonZkEVMBridge.sol +++ b/contracts/interfaces/IPolygonZkEVMBridge.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; interface IPolygonZkEVMBridge { /** diff --git a/contracts/lib/DepositContract.sol b/contracts/lib/DepositContract.sol index 1f020f86a..60fb79426 100644 --- a/contracts/lib/DepositContract.sol +++ b/contracts/lib/DepositContract.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; diff --git a/contracts/lib/EmergencyManager.sol b/contracts/lib/EmergencyManager.sol index 1c287cad1..6ea9378d9 100644 --- a/contracts/lib/EmergencyManager.sol +++ b/contracts/lib/EmergencyManager.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; /** * @dev Contract helper responsible to manage the emergency state diff --git a/contracts/lib/GlobalExitRootLib.sol b/contracts/lib/GlobalExitRootLib.sol index 947317282..f0c773857 100644 --- a/contracts/lib/GlobalExitRootLib.sol +++ b/contracts/lib/GlobalExitRootLib.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.17; +pragma solidity 0.8.20; /** * @dev A library that provides the necessary calculations to calculate the global exit root diff --git a/contracts/lib/TokenWrapped.sol b/contracts/lib/TokenWrapped.sol index 4442b25f0..50eb3a995 100644 --- a/contracts/lib/TokenWrapped.sol +++ b/contracts/lib/TokenWrapped.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-3.0 // Implementation of permit based on https://github.com/WETH10/WETH10/blob/main/contracts/WETH10.sol -pragma solidity ^0.8.17; +pragma solidity 0.8.20; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index f324ba769..9ecc54cef 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -55,8 +55,8 @@ contract PolygonZkEVMBridgeV2 is uint256 private constant _GLOBAL_INDEX_MAINNET_FLAG = 2 ** 64; // Init code of the erc20 wrapped token, to deploy a wrapped token the constructor parameters must be appended - bytes private constant _BASE_INIT_BYTECODE_WRAPPED_TOKEN = - hex"6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea2646970667358221220d1961e711f962f770679c80ebfabbda76d7b41439e16632bbd174d9ee7f2789264736f6c63430008110033"; + bytes public constant BASE_INIT_BYTECODE_WRAPPED_TOKEN = + hex"6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033"; // Network identifier uint32 public networkID; @@ -701,7 +701,7 @@ contract PolygonZkEVMBridgeV2 is salt, keccak256( abi.encodePacked( - _BASE_INIT_BYTECODE_WRAPPED_TOKEN, + BASE_INIT_BYTECODE_WRAPPED_TOKEN, abi.encode(name, symbol, decimals) ) ) @@ -1034,7 +1034,7 @@ contract PolygonZkEVMBridgeV2 is bytes memory constructorArgs ) internal returns (TokenWrapped newWrappedToken) { bytes memory initBytecode = abi.encodePacked( - _BASE_INIT_BYTECODE_WRAPPED_TOKEN, + BASE_INIT_BYTECODE_WRAPPED_TOKEN, constructorArgs ); diff --git a/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol b/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol index 839b1c155..507d6df38 100644 --- a/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol +++ b/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.17; +pragma solidity ^0.8.20; import "../../interfaces/IBasePolygonZkEVMGlobalExitRoot.sol"; interface IPolygonZkEVMBridgeV2 { diff --git a/contracts/v2/lib/DepositContractBase.sol b/contracts/v2/lib/DepositContractBase.sol index 13c9c55c2..a93f0a90f 100644 --- a/contracts/v2/lib/DepositContractBase.sol +++ b/contracts/v2/lib/DepositContractBase.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.17; +pragma solidity 0.8.20; /** * This contract will be used as a helper for all the sparse merkle tree related functions diff --git a/contracts/v2/lib/DepositContractV2.sol b/contracts/v2/lib/DepositContractV2.sol index b03075318..57995dfb4 100644 --- a/contracts/v2/lib/DepositContractV2.sol +++ b/contracts/v2/lib/DepositContractV2.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.17; +pragma solidity 0.8.20; import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; import "./DepositContractBase.sol"; diff --git a/hardhat.config.ts b/hardhat.config.ts index c7eb53394..07c6270f4 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -95,15 +95,6 @@ const config: HardhatUserConfig = { evmVersion: "shanghai", }, }, - "contracts/lib/TokenWrapped.sol": { - version: "0.8.17", - settings: { - optimizer: { - enabled: true, - runs: 999999, // must be the same as the previous bridge - }, - }, - }, "contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol": { version: "0.8.20", settings: { diff --git a/test/contractsv2/BridgeV2.test.ts b/test/contractsv2/BridgeV2.test.ts index 9e6161326..34b0f3a26 100644 --- a/test/contractsv2/BridgeV2.test.ts +++ b/test/contractsv2/BridgeV2.test.ts @@ -782,7 +782,7 @@ describe("PolygonZkEVMBridge Contract", () => { const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); // create2 parameters const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]); - const minimalBytecodeProxy = tokenWrappedFactory.bytecode; + const minimalBytecodeProxy = await polygonZkEVMBridgeContract.BASE_INIT_BYTECODE_WRAPPED_TOKEN(); const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]); const precalculateWrappedErc20 = await ethers.getCreate2Address( polygonZkEVMBridgeContract.target as string, diff --git a/test/contractsv2/BridgeV2GasTokens.test.ts b/test/contractsv2/BridgeV2GasTokens.test.ts index 679ed9165..eea3657b6 100644 --- a/test/contractsv2/BridgeV2GasTokens.test.ts +++ b/test/contractsv2/BridgeV2GasTokens.test.ts @@ -102,7 +102,7 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { // calculate the weth address: const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); // create2 parameters - const minimalBytecodeProxy = tokenWrappedFactory.bytecode; + const minimalBytecodeProxy = await polygonZkEVMBridgeContract.BASE_INIT_BYTECODE_WRAPPED_TOKEN(); const WETHName = "Wrapped Ether"; const WETHSymbol = "WETH"; const WETHDecimals = 18; @@ -885,7 +885,7 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); // create2 parameters const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]); - const minimalBytecodeProxy = tokenWrappedFactory.bytecode; + const minimalBytecodeProxy = await polygonZkEVMBridgeContract.BASE_INIT_BYTECODE_WRAPPED_TOKEN(); const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]); const precalculateWrappedErc20 = await ethers.getCreate2Address( polygonZkEVMBridgeContract.target as string, diff --git a/test/contractsv2/BridgeWrappedAddress.test.ts b/test/contractsv2/BridgeWrappedAddress.test.ts new file mode 100644 index 000000000..619e82621 --- /dev/null +++ b/test/contractsv2/BridgeWrappedAddress.test.ts @@ -0,0 +1,93 @@ +import {expect} from "chai"; +import {ethers, upgrades} from "hardhat"; +import { + VerifierRollupHelperMock, + ERC20PermitMock, + PolygonRollupManagerMock, + PolygonZkEVMGlobalExitRoot, + PolygonZkEVMBridgeV2, + PolygonZkEVMV2, + PolygonRollupBase, + TokenWrapped, +} from "../../typechain-types"; +import {takeSnapshot, time} from "@nomicfoundation/hardhat-network-helpers"; +import {processorUtils, contractUtils, MTBridge, mtBridgeUtils} from "@0xpolygonhermez/zkevm-commonjs"; +const {calculateSnarkInput, calculateAccInputHash, calculateBatchHashData} = contractUtils; +const MerkleTreeBridge = MTBridge; +const {verifyMerkleProof, getLeafValue} = mtBridgeUtils; + +function calculateGlobalExitRoot(mainnetExitRoot: any, rollupExitRoot: any) { + return ethers.solidityPackedKeccak256(["bytes32", "bytes32"], [mainnetExitRoot, rollupExitRoot]); +} +const _GLOBAL_INDEX_MAINNET_FLAG = 2n ** 64n; + +function computeGlobalIndex(indexLocal: any, indexRollup: any, isMainnet: Boolean) { + if (isMainnet === true) { + return BigInt(indexLocal) + _GLOBAL_INDEX_MAINNET_FLAG; + } else { + return BigInt(indexLocal) + BigInt(indexRollup) * 2n ** 32n; + } +} + +describe("PolygonZkEVMBridge Contract", () => { + let polygonZkEVMBridgeContract: PolygonZkEVMBridgeV2; + let polTokenContract: ERC20PermitMock; + let polygonZkEVMGlobalExitRoot: PolygonZkEVMGlobalExitRoot; + + let deployer: any; + let rollupManager: any; + let acc1: any; + + const networkIDMainnet = 0; + + beforeEach("Deploy contracts", async () => { + // load signers + [deployer, rollupManager, acc1] = await ethers.getSigners(); + + // deploy PolygonZkEVMBridge + const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + polygonZkEVMBridgeContract = (await upgrades.deployProxy(polygonZkEVMBridgeFactory, [], { + initializer: false, + })) as unknown as PolygonZkEVMBridgeV2; + + // deploy global exit root manager + const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRoot"); + polygonZkEVMGlobalExitRoot = await PolygonZkEVMGlobalExitRootFactory.deploy( + rollupManager.address, + polygonZkEVMBridgeContract.target + ); + + await polygonZkEVMBridgeContract.initialize( + networkIDMainnet, + ethers.ZeroAddress, // zero for ether + ethers.ZeroAddress, // zero for ether + polygonZkEVMGlobalExitRoot.target, + rollupManager.address, + "0x" + ); + }); + + it("should claim tokens from Rollup to Mainnet", async () => { + // create2 parameters + const mainnetBridgeAddress = "0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe"; + const mainnetMaticAddress = "0x7d1afa7b718fb893db30a3abc0cfc608aacfebb0"; + const mainnetWrappedMaticAddress = "0xa2036f0538221a77A3937F1379699f44945018d0"; + + // Matic params + const tokenName = "Matic Token"; + const tokenSymbol = "MATIC"; + const decimals = 18; + const metadataToken = ethers.AbiCoder.defaultAbiCoder().encode( + ["string", "string", "uint8"], + [tokenName, tokenSymbol, decimals] + ); + + const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [0, mainnetMaticAddress]); + + const minimalBytecodeProxy = await polygonZkEVMBridgeContract.BASE_INIT_BYTECODE_WRAPPED_TOKEN(); + const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]); + const precalculateWrappedErc20 = await ethers.getCreate2Address(mainnetBridgeAddress, salt, hashInitCode); + + expect(precalculateWrappedErc20).to.be.equal(mainnetWrappedMaticAddress); // mainnet b + }); +}); diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index 784defe9f..6d16cbe7a 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -686,7 +686,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); // create2 parameters const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]); - const minimalBytecodeProxy = tokenWrappedFactory.bytecode; + const minimalBytecodeProxy = await polygonZkEVMBridgeContract.BASE_INIT_BYTECODE_WRAPPED_TOKEN(); const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]); const precalculateWrappedErc20 = await ethers.getCreate2Address( polygonZkEVMBridgeContract.target as string, @@ -1366,7 +1366,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); // create2 parameters const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]); - const minimalBytecodeProxy = tokenWrappedFactory.bytecode; + const minimalBytecodeProxy = await polygonZkEVMBridgeContract.BASE_INIT_BYTECODE_WRAPPED_TOKEN(); const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]); const precalculateWrappedErc20 = await ethers.getCreate2Address( polygonZkEVMBridgeContract.target as string, @@ -2042,7 +2042,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); // create2 parameters const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]); - const minimalBytecodeProxy = tokenWrappedFactory.bytecode; + const minimalBytecodeProxy = await polygonZkEVMBridgeContract.BASE_INIT_BYTECODE_WRAPPED_TOKEN(); const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]); const precalculateWrappedErc20 = await ethers.getCreate2Address( polygonZkEVMBridgeContract.target as string, @@ -2620,7 +2620,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); // create2 parameters const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]); - const minimalBytecodeProxy = tokenWrappedFactory.bytecode; + const minimalBytecodeProxy = await polygonZkEVMBridgeContract.BASE_INIT_BYTECODE_WRAPPED_TOKEN(); const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]); const precalculateWrappedErc20 = await ethers.getCreate2Address( polygonZkEVMBridgeContract.target as string, @@ -3170,7 +3170,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); // create2 parameters const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]); - const minimalBytecodeProxy = tokenWrappedFactory.bytecode; + const minimalBytecodeProxy = await polygonZkEVMBridgeContract.BASE_INIT_BYTECODE_WRAPPED_TOKEN(); const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]); const precalculateWrappedErc20 = await ethers.getCreate2Address( polygonZkEVMBridgeContract.target as string, @@ -3623,7 +3623,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); // create2 parameters const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]); - const minimalBytecodeProxy = tokenWrappedFactory.bytecode; + const minimalBytecodeProxy = await polygonZkEVMBridgeContract.BASE_INIT_BYTECODE_WRAPPED_TOKEN(); const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]); const precalculateWrappedErc20 = await ethers.getCreate2Address( polygonZkEVMBridgeContract.target as string, diff --git a/test/contractsv2/PolygonRollupManagerUpgrade.test.ts b/test/contractsv2/PolygonRollupManagerUpgrade.test.ts index fad570f77..aac7a503f 100644 --- a/test/contractsv2/PolygonRollupManagerUpgrade.test.ts +++ b/test/contractsv2/PolygonRollupManagerUpgrade.test.ts @@ -275,7 +275,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { it("should check full flow", async () => { const urlSequencer = "http://zkevm-json-rpc:8123"; - const chainID2 = 1001; + const chainID2 = chainID + 1; const networkName = "zkevm"; const forkID = 0; const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001"; @@ -718,7 +718,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); // create2 parameters const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]); - const minimalBytecodeProxy = tokenWrappedFactory.bytecode; + const minimalBytecodeProxy = await polygonZkEVMBridgeContract.BASE_INIT_BYTECODE_WRAPPED_TOKEN(); const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]); const precalculateWrappedErc20 = await ethers.getCreate2Address( polygonZkEVMBridgeContract.target as string, @@ -804,7 +804,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { it("should check full flow no trusted aggreagtor", async () => { const urlSequencer = "http://zkevm-json-rpc:8123"; - const chainID2 = 1001; + const chainID2 = chainID + 1; const networkName = "zkevm"; const forkID = 0; const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001"; @@ -1237,7 +1237,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); // create2 parameters const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]); - const minimalBytecodeProxy = tokenWrappedFactory.bytecode; + const minimalBytecodeProxy = await polygonZkEVMBridgeContract.BASE_INIT_BYTECODE_WRAPPED_TOKEN(); const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]); const precalculateWrappedErc20 = await ethers.getCreate2Address( polygonZkEVMBridgeContract.target as string, diff --git a/test/contractsv2/PolygonZkEVMV2.test.ts b/test/contractsv2/PolygonZkEVMV2.test.ts index 97c573b3d..5d188e7e9 100644 --- a/test/contractsv2/PolygonZkEVMV2.test.ts +++ b/test/contractsv2/PolygonZkEVMV2.test.ts @@ -469,7 +469,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); // create2 parameters const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]); - const minimalBytecodeProxy = tokenWrappedFactory.bytecode; + const minimalBytecodeProxy = await polygonZkEVMBridgeContract.BASE_INIT_BYTECODE_WRAPPED_TOKEN(); const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]); const precalculateWrappedErc20 = await ethers.getCreate2Address( polygonZkEVMBridgeContract.target as string, From 847b25aa9f7697245fc5f5d839bab770d37c796e Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 19 Dec 2023 11:25:37 +0100 Subject: [PATCH 129/230] fix logs --- deployment/v2/3_deployContracts.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/deployment/v2/3_deployContracts.ts b/deployment/v2/3_deployContracts.ts index 4d7e50a7d..8f88cb17f 100644 --- a/deployment/v2/3_deployContracts.ts +++ b/deployment/v2/3_deployContracts.ts @@ -274,7 +274,7 @@ async function main() { console.log("##### Checks TimelockContract #####"); console.log("#######################"); //console.log("minDelayTimelock:", await timelockContract.getMinDelay()); - console.log("polygonZkEVM:", await timelockContract.polygonZkEVM()); + console.log("polygonZkEVM (Rollup Manager):", await timelockContract.polygonZkEVM()); /* * deploy proxy @@ -328,7 +328,7 @@ async function main() { console.log("#######################"); console.log("PolygonZkEVMGlobalExitRootAddress:", await polygonZkEVMBridgeContract.globalExitRootManager()); console.log("networkID:", await polygonZkEVMBridgeContract.networkID()); - console.log("zkEVMaddress:", await polygonZkEVMBridgeContract.polygonRollupManager()); + console.log("Rollup Manager:", await polygonZkEVMBridgeContract.polygonRollupManager()); // Import OZ manifest the deployed contracts, its enough to import just the proxy, the rest are imported automatically (admin/impl) await upgrades.forceImport(proxyBridgeAddress, polygonZkEVMBridgeFactory, "transparent" as any); @@ -392,7 +392,7 @@ async function main() { // deploy Rollup Manager console.log("\n#######################"); - console.log("##### Deployment Polygon ZK-EVM #####"); + console.log("##### Deployment Rollup Manager #####"); console.log("#######################"); console.log("deployer:", deployer.address); console.log("PolygonZkEVMGlobalExitRootAddress:", polygonZkEVMGlobalExitRoot?.target); @@ -445,7 +445,7 @@ async function main() { // reach limits of attempts if (i + 1 === attemptsDeployProxy) { - throw new Error("PolygonZkEVM contract has not been deployed"); + throw new Error("Rollup Manager contract has not been deployed"); } } @@ -482,7 +482,7 @@ async function main() { } console.log("\n#######################"); - console.log("##### Checks PolygonZkEVM #####"); + console.log("##### Checks Rollup Manager #####"); console.log("#######################"); console.log("PolygonZkEVMGlobalExitRootAddress:", await polygonRollupManagerContract.globalExitRootManager()); console.log("polTokenAddress:", await polygonRollupManagerContract.pol()); From f545c77a0c510310d9aa21aedd5e7992acb045b0 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 3 Jan 2024 13:48:03 +0100 Subject: [PATCH 130/230] udpate vierifeir --- contracts/interfaces/IVerifierRollup.sol | 2 +- contracts/verifiers/FflonkVerifier.sol | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/interfaces/IVerifierRollup.sol b/contracts/interfaces/IVerifierRollup.sol index f29dfc9ce..8f114a0a7 100644 --- a/contracts/interfaces/IVerifierRollup.sol +++ b/contracts/interfaces/IVerifierRollup.sol @@ -8,6 +8,6 @@ pragma solidity ^0.8.20; interface IVerifierRollup { function verifyProof( bytes32[24] calldata proof, - uint256[1] memory pubSignals + uint256[1] calldata pubSignals ) external view returns (bool); } diff --git a/contracts/verifiers/FflonkVerifier.sol b/contracts/verifiers/FflonkVerifier.sol index 6945c6475..10ee75667 100644 --- a/contracts/verifiers/FflonkVerifier.sol +++ b/contracts/verifiers/FflonkVerifier.sol @@ -48,8 +48,8 @@ contract FflonkVerifier { uint256 constant w8_7 = 8613538655231327379234925296132678673308827349856085326283699237864372525723; // Verifier preprocessed input C_0(x)·[1]_1 - uint256 constant C0x = 7436841426934271843999872946312645822871802402068881571108027575346498207286; - uint256 constant C0y = 18448034242258174646222819724328439025708531082946938915005051387020977719791; + uint256 constant C0x = 13740223412188786024382620276207902995170246026576302003212539499946277391680; + uint256 constant C0y = 5215376971112980485769354596643131749394956291061945857226755788999033966865; // Verifier preprocessed input x·[1]_2 uint256 constant X2x1 = 21831381940315734285607113342023901060522397560371972897001948545212302161822; diff --git a/package.json b/package.json index c6cf9354f..03e6df0c7 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "deploy:testnet:v2:goerli": "npx hardhat compile && rm -f deployment/v2/deploy_ongoing.json && npm run prepare:testnet:ZkEVM:goerli && npm run deploy:v2:goerli", "verify:v2:goerli": "npx hardhat run deployment/v2/verifyContracts.js --network goerli", "prepare:testnet:ZkEVM:sepolia": "npx hardhat run deployment/testnet/prepareTestnet.ts --network sepolia", - "deploy:v2:sepolia": "npx hardhat compile && npx ts-node deployment/v2/1_createGenesis.ts && npx hardhat run deployment/v2/2_deployPolygonZKEVMDeployer.ts --network sepolia && npx hardhat run deployment/v2/3_deployContracts.ts --network sepolia && npx hardhat run deployment/v2/4_createRollup.ts --network sepolia && npm run saveDeployment:sepolia", + "deploy:v2:sepolia": "npx hardhat compile && npx ts-node deployment/v2/1_createGenesis.ts --test && npx hardhat run deployment/v2/2_deployPolygonZKEVMDeployer.ts --network sepolia && npx hardhat run deployment/v2/3_deployContracts.ts --network sepolia && npx hardhat run deployment/v2/4_createRollup.ts --network sepolia && npm run saveDeployment:sepolia", "deploy:testnet:v2:sepolia": "npx hardhat compile && rm -f deployment/v2/deploy_ongoing.json && npm run prepare:testnet:ZkEVM:sepolia && npm run deploy:v2:sepolia", "verify:v2:sepolia": "npx hardhat run deployment/v2/verifyContracts.js --network sepolia", "prepare:v1ToV2:ZkEVM:localhost": "npx hardhat run deployment/v1ToV2/prepareTestnet.ts --network localhost", From e841334090052e6dc9331aa87802ee8364213f1f Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 3 Jan 2024 14:02:30 +0100 Subject: [PATCH 131/230] udpat eveirfy contracts --- deployment/v2/verifyContracts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/v2/verifyContracts.js b/deployment/v2/verifyContracts.js index 1c47277bc..fb67a027a 100644 --- a/deployment/v2/verifyContracts.js +++ b/deployment/v2/verifyContracts.js @@ -172,7 +172,7 @@ async function main() { await hre.run( 'verify:verify', { - contract: 'contracts/v2/consensus/zkEVM/PolygonZkEVMV2.sol:PolygonZkEVMV2', + contract: 'contracts/v2/consensus/zkEVM/PolygonZkEVMEtrog.sol:PolygonZkEVMEtrog', address: createRollupOutputParameters.rollupAddress, constructorArguments: [ deployOutputParameters.polygonZkEVMGlobalExitRootAddress, From 2e4544aac4af69c30072b1991dda31ae821cab98 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 9 Jan 2024 14:41:43 +0100 Subject: [PATCH 132/230] fix timeout issues when emergency state --- contracts/v2/PolygonRollupManager.sol | 11 +++++++++- .../v2/interfaces/IPolygonZkEVMV2Errors.sol | 10 +++++++++ contracts/v2/lib/PolygonRollupBase.sol | 14 +++++++++++++ contracts/v2/lib/PolygonRollupBaseEtrog.sol | 14 +++++++++++++ test/contractsv2/PolygonRollupManager.test.ts | 21 +++++++++++++++++++ 5 files changed, 69 insertions(+), 1 deletion(-) diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index cb336a7ff..b28bf927c 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -215,6 +215,9 @@ contract PolygonRollupManager is // note This variable is internal, since the view function getBatchFee is likely to be ugpraded uint256 internal _batchFee; + // Timestamp when the last emergency state was deactivated + uint64 public lastDeactivatedEmergencyStateTimestamp; + /** * @dev Emitted when a new rollup type is added */ @@ -1471,13 +1474,16 @@ contract PolygonRollupManager is /** * @notice Function to activate emergency state, which also enables the emergency mode on both PolygonZkEVM and PolygonZkEVMBridge contracts - * If not called by the owner must 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 and an emergency state was not happened in the same period */ function activateEmergencyState() external { if (!hasRole(_EMERGENCY_COUNCIL_ROLE, msg.sender)) { if ( lastAggregationTimestamp == 0 || lastAggregationTimestamp + _HALT_AGGREGATION_TIMEOUT > + block.timestamp || + lastDeactivatedEmergencyStateTimestamp + + _HALT_AGGREGATION_TIMEOUT > block.timestamp ) { revert HaltTimeoutNotExpired(); @@ -1493,6 +1499,9 @@ contract PolygonRollupManager is external onlyRole(_STOP_EMERGENCY_ROLE) { + // Set last deactivated emergency state + lastDeactivatedEmergencyStateTimestamp = uint64(block.timestamp); + // Deactivate emergency state on PolygonZkEVMBridge bridgeAddress.deactivateEmergencyState(); diff --git a/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol b/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol index 1a6783040..141902826 100644 --- a/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol +++ b/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol @@ -28,4 +28,14 @@ interface IPolygonZkEVMV2Errors is IPolygonZkEVMErrors { * @dev Thrown when the try to initialize with a gas token with huge metadata */ error HugeTokenMetadataNotSupported(); + + /** + * @dev Thrown when trying force a batch during emergency state + */ + error ForceBatchesNotAllowedOnEmergencyState(); + + /** + * @dev Thrown when the try to sequence force batches before the halt timeout period + */ + error HaltTimeoutNotExpiredAfterEmergencyState(); } diff --git a/contracts/v2/lib/PolygonRollupBase.sol b/contracts/v2/lib/PolygonRollupBase.sol index 657c471a8..516b1f968 100644 --- a/contracts/v2/lib/PolygonRollupBase.sol +++ b/contracts/v2/lib/PolygonRollupBase.sol @@ -619,6 +619,11 @@ contract PolygonRollupBase is bytes calldata transactions, uint256 polAmount ) public virtual isForceBatchActive { + // Check if rollup manager is on emergency state + if (rollupManager.isEmergencyState()) { + revert ForceBatchesNotAllowedOnEmergencyState(); + } + // Calculate pol collateral uint256 polFee = rollupManager.getForcedBatchFee(); @@ -670,6 +675,15 @@ contract PolygonRollupBase is function sequenceForceBatches( ForcedBatchData[] calldata batches ) external virtual isForceBatchActive { + // Check if rollup manager is on emergency state + if ( + rollupManager.lastDeactivatedEmergencyStateTimestamp() + + _HALT_AGGREGATION_TIMEOUT > + block.timestamp + ) { + revert HaltTimeoutNotExpiredAfterEmergencyState(); + } + uint256 batchesNum = batches.length; if (batchesNum == 0) { diff --git a/contracts/v2/lib/PolygonRollupBaseEtrog.sol b/contracts/v2/lib/PolygonRollupBaseEtrog.sol index 9d6b4a949..ae2c350af 100644 --- a/contracts/v2/lib/PolygonRollupBaseEtrog.sol +++ b/contracts/v2/lib/PolygonRollupBaseEtrog.sol @@ -599,6 +599,11 @@ contract PolygonRollupBaseEtrog is bytes calldata transactions, uint256 polAmount ) public virtual isForceBatchActive { + // Check if rollup manager is on emergency state + if (rollupManager.isEmergencyState()) { + revert ForceBatchesNotAllowedOnEmergencyState(); + } + // Calculate pol collateral uint256 polFee = rollupManager.getForcedBatchFee(); @@ -651,6 +656,15 @@ contract PolygonRollupBaseEtrog is function sequenceForceBatches( BatchData[] calldata batches ) external virtual isForceBatchActive { + // Check if rollup manager is on emergency state + if ( + rollupManager.lastDeactivatedEmergencyStateTimestamp() + + _HALT_AGGREGATION_TIMEOUT > + block.timestamp + ) { + revert HaltTimeoutNotExpiredAfterEmergencyState(); + } + uint256 batchesNum = batches.length; if (batchesNum == 0) { diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index 6d16cbe7a..a914ec80d 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -789,6 +789,27 @@ describe("Polygon ZK-EVM TestnetV2", () => { "ForceBatchesAlreadyActive" ); + //snapshot emergency + const snapshotEmergencyState = await takeSnapshot(); + await rollupManagerContract.connect(emergencyCouncil).activateEmergencyState(); + await expect(newZkEVMContract.forceBatch("0x", 0)).to.be.revertedWithCustomError( + newZkEVMContract, + "ForceBatchesNotAllowedOnEmergencyState" + ); + await rollupManagerContract.connect(admin).deactivateEmergencyState(); + const currentTimestampEmergency = (await ethers.provider.getBlock("latest"))?.timestamp; + + expect(await rollupManagerContract.lastDeactivatedEmergencyStateTimestamp()).to.be.equal( + currentTimestampEmergency + ); + + await expect(newZkEVMContract.sequenceForceBatches([sequence])).to.be.revertedWithCustomError( + newZkEVMContract, + "HaltTimeoutNotExpiredAfterEmergencyState" + ); + + await snapshotEmergencyState.restore(); + const l2txDataForceBatch = "0x123456"; const maticAmountForced = await rollupManagerContract.getForcedBatchFee(); const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); From 106000e8887ac634deec4be3a1017abc0d110af3 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 10 Jan 2024 14:59:43 +0100 Subject: [PATCH 133/230] fix miscelaneousC --- contracts/v2/PolygonRollupManager.sol | 23 +++--- contracts/v2/PolygonZkEVMBridgeV2.sol | 77 ++++++++++--------- contracts/v2/PolygonZkEVMGlobalExitRootV2.sol | 6 +- .../dataComittee/CDKDataCommittee.sol | 7 +- .../dataComittee/PolygonDataComittee.sol | 16 +++- .../v2/interfaces/IPolygonDataComittee.sol | 5 ++ .../v2/interfaces/IPolygonRollupManager.sol | 5 ++ .../v2/lib/LegacyZKEVMStateVariables.sol | 3 +- contracts/v2/lib/PolygonConstantsBase.sol | 14 ++++ contracts/v2/lib/PolygonRollupBase.sol | 22 +----- contracts/v2/lib/PolygonRollupBaseEtrog.sol | 22 +----- contracts/v2/lib/PolygonTransparentProxy.sol | 1 - .../PolygonZkEVMGlobalExitRootBaseStorage.sol | 1 + .../v2/mocks/PolygonRollupManagerMock.sol | 2 +- .../PolygonRollupManagerMockInternalTest.sol | 2 +- test/contractsv2/BridgeV2.test.ts | 3 + test/contractsv2/BridgeV2GasTokens.test.ts | 8 +- test/contractsv2/BridgeV2Metadata.test.ts | 3 + test/contractsv2/BridgeWrappedAddress.test.ts | 3 + test/contractsv2/PolygonRollupManager.test.ts | 5 +- .../PolygonRollupManagerUpgrade.test.ts | 1 + test/contractsv2/PolygonZkEVMV2.test.ts | 5 +- 22 files changed, 134 insertions(+), 100 deletions(-) create mode 100644 contracts/v2/lib/PolygonConstantsBase.sol diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index b28bf927c..39a5e8a07 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.20; import "./interfaces/IPolygonRollupManager.sol"; -import "../interfaces/IPolygonZkEVMGlobalExitRoot.sol"; +import "./interfaces/IPolygonZkEVMGlobalExitRootV2.sol"; import "../interfaces/IPolygonZkEVMBridge.sol"; import "./interfaces/IPolygonRollupBase.sol"; import "../interfaces/IVerifierRollup.sol"; @@ -13,6 +13,7 @@ import "./lib/PolygonTransparentProxy.sol"; import "./lib/PolygonAccessControlUpgradeable.sol"; import "./lib/LegacyZKEVMStateVariables.sol"; import "./consensus/zkEVM/PolygonZkEVMV2Existent.sol"; +import "./lib/PolygonConstantsBase.sol"; // review Possible renaming to PolygonL2Manager /** @@ -22,6 +23,7 @@ contract PolygonRollupManager is PolygonAccessControlUpgradeable, EmergencyManager, LegacyZKEVMStateVariables, + PolygonConstantsBase, IPolygonRollupManager { using SafeERC20Upgradeable for IERC20Upgradeable; @@ -85,13 +87,6 @@ contract PolygonRollupManager is uint256 internal constant _RFIELD = 21888242871839275222246405745257275088548364400416034343698204186575808495617; - // If the system a does not verify a batch inside this time window, the contract enters in emergency mode - uint64 internal constant _HALT_AGGREGATION_TIMEOUT = 1 weeks; - - // Maximum batches that can be verified in one call. It depends on our current metrics - // This should be a protection against someone that tries to generate huge chunk of invalid batches, and we can't prove otherwise before the pending timeout expires - uint64 internal constant _MAX_VERIFY_BATCHES = 1000; - // Max batch multiplier per verification uint256 internal constant _MAX_BATCH_MULTIPLIER = 12; @@ -161,7 +156,7 @@ contract PolygonRollupManager is keccak256("EMERGENCY_COUNCIL_ADMIN"); // Global Exit Root address - IPolygonZkEVMGlobalExitRoot public immutable globalExitRootManager; + IPolygonZkEVMGlobalExitRootV2 public immutable globalExitRootManager; // PolygonZkEVM Bridge Address IPolygonZkEVMBridge public immutable bridgeAddress; @@ -361,13 +356,16 @@ contract PolygonRollupManager is * @param _bridgeAddress Bridge address */ constructor( - IPolygonZkEVMGlobalExitRoot _globalExitRootManager, + IPolygonZkEVMGlobalExitRootV2 _globalExitRootManager, IERC20Upgradeable _pol, IPolygonZkEVMBridge _bridgeAddress ) { globalExitRootManager = _globalExitRootManager; pol = _pol; bridgeAddress = _bridgeAddress; + + // Disable initalizers on the implementation following the best practices + _disableInitializers(); } /** @@ -651,6 +649,11 @@ contract PolygonRollupManager is revert ChainIDAlreadyExist(); } + // Check if rollup address was already added + if (rollupAddressToID[address(rollupAddress)] != 0) { + revert RollupAddressAlreadyExist(); + } + RollupData storage rollup = _addExistingRollup( rollupAddress, verifier, diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index 9ecc54cef..18dab8dfc 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -92,6 +92,48 @@ contract PolygonZkEVMBridgeV2 is // WETH address TokenWrapped public WETHToken; + /** + * @dev Emitted when bridge assets or messages to another network + */ + event BridgeEvent( + uint8 leafType, + uint32 originNetwork, + address originAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes metadata, + uint32 depositCount + ); + + /** + * @dev Emitted when a claim is done from another network + */ + event ClaimEvent( + uint256 globalIndex, + uint32 originNetwork, + address originAddress, + address destinationAddress, + uint256 amount + ); + + /** + * @dev Emitted when a new wrapped token is created + */ + event NewWrappedToken( + uint32 originNetwork, + address originTokenAddress, + address wrappedTokenAddress, + bytes metadata + ); + + /** + * Disable initalizers on the implementation following the best practices + */ + constructor() { + _disableInitializers(); + } + /** * @param _networkID networkID * @param _gasTokenAddress gas token address @@ -145,41 +187,6 @@ contract PolygonZkEVMBridgeV2 is _; } - /** - * @dev Emitted when bridge assets or messages to another network - */ - event BridgeEvent( - uint8 leafType, - uint32 originNetwork, - address originAddress, - uint32 destinationNetwork, - address destinationAddress, - uint256 amount, - bytes metadata, - uint32 depositCount - ); - - /** - * @dev Emitted when a claim is done from another network - */ - event ClaimEvent( - uint256 globalIndex, - uint32 originNetwork, - address originAddress, - address destinationAddress, - uint256 amount - ); - - /** - * @dev Emitted when a new wrapped token is created - */ - event NewWrappedToken( - uint32 originNetwork, - address originTokenAddress, - address wrappedTokenAddress, - bytes metadata - ); - /** * @notice 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 diff --git a/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol b/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol index e487ba870..f0c8da74b 100644 --- a/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol +++ b/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol @@ -44,15 +44,17 @@ contract PolygonZkEVMGlobalExitRootV2 is */ function updateExitRoot(bytes32 newRoot) external { // Store storage variables into temporal variables since will be used multiple times - bytes32 cacheLastRollupExitRoot = lastRollupExitRoot; - bytes32 cacheLastMainnetExitRoot = lastMainnetExitRoot; + bytes32 cacheLastRollupExitRoot; + bytes32 cacheLastMainnetExitRoot; if (msg.sender == bridgeAddress) { lastMainnetExitRoot = newRoot; cacheLastMainnetExitRoot = newRoot; + cacheLastRollupExitRoot = lastRollupExitRoot; } else if (msg.sender == rollupManager) { lastRollupExitRoot = newRoot; cacheLastRollupExitRoot = newRoot; + cacheLastMainnetExitRoot = lastMainnetExitRoot; } else { revert OnlyAllowedContracts(); } diff --git a/contracts/v2/consensus/dataComittee/CDKDataCommittee.sol b/contracts/v2/consensus/dataComittee/CDKDataCommittee.sol index e02b3b4e7..962abed75 100644 --- a/contracts/v2/consensus/dataComittee/CDKDataCommittee.sol +++ b/contracts/v2/consensus/dataComittee/CDKDataCommittee.sol @@ -111,8 +111,11 @@ contract CDKDataCommittee is ICDKDataCommitteeErrors, OwnableUpgradeable { bytes32 signedHash, bytes calldata signaturesAndAddrs ) external view { + // Save storage variable on cache since will be used multiple times + uint256 cacheRequiredAmountOfSignatures = requiredAmountOfSignatures; + // pre-check: byte array size - uint256 splitByte = _SIGNATURE_SIZE * requiredAmountOfSignatures; + uint256 splitByte = _SIGNATURE_SIZE * cacheRequiredAmountOfSignatures; if ( signaturesAndAddrs.length < splitByte || (signaturesAndAddrs.length - splitByte) % _ADDR_SIZE != 0 @@ -128,7 +131,7 @@ contract CDKDataCommittee is ICDKDataCommitteeErrors, OwnableUpgradeable { // recover addresses from signatures and check that are part of the committee uint256 lastAddrIndexUsed; uint256 addrsLen = (signaturesAndAddrs.length - splitByte) / _ADDR_SIZE; - for (uint256 i = 0; i < requiredAmountOfSignatures; i++) { + for (uint256 i = 0; i < cacheRequiredAmountOfSignatures; i++) { uint256 currentSignatureStartingByte = i * _SIGNATURE_SIZE; // Recover currnet signer from the signature diff --git a/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol b/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol index 6bacec12b..681d3cf6d 100644 --- a/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol +++ b/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol @@ -253,11 +253,19 @@ contract PolygonDataComittee is PolygonRollupBase, IPolygonDataComittee { } /** - * @notice Allow the admin to turn on the force batches - * This action is not reversible + * @notice Allow the admin to switch the sequence with data availability + * @param newIsSequenceWithDataAvailabilityAllowed Boolean to switch */ - function switchSequenceWithDataAvailability() external onlyAdmin { - isSequenceWithDataAvailabilityAllowed = !isSequenceWithDataAvailabilityAllowed; + function switchSequenceWithDataAvailability( + bool newIsSequenceWithDataAvailabilityAllowed + ) external onlyAdmin { + if ( + isSequenceWithDataAvailabilityAllowed == + newIsSequenceWithDataAvailabilityAllowed + ) { + revert SwitchToSameValue(); + } + isSequenceWithDataAvailabilityAllowed = newIsSequenceWithDataAvailabilityAllowed; emit SwitchSequenceWithDataAvailability(); } } diff --git a/contracts/v2/interfaces/IPolygonDataComittee.sol b/contracts/v2/interfaces/IPolygonDataComittee.sol index 9b3ccad9c..314a5b865 100644 --- a/contracts/v2/interfaces/IPolygonDataComittee.sol +++ b/contracts/v2/interfaces/IPolygonDataComittee.sol @@ -7,4 +7,9 @@ interface IPolygonDataComittee { * @dev Thrown when try to activate force batches when they are already active */ error SequenceWithDataAvailabilityNotAllowed(); + + /** + * @dev Thrown when try to switch SequenceWithDataAvailability to the same value + */ + error SwitchToSameValue(); } diff --git a/contracts/v2/interfaces/IPolygonRollupManager.sol b/contracts/v2/interfaces/IPolygonRollupManager.sol index fa665c085..0e2de7332 100644 --- a/contracts/v2/interfaces/IPolygonRollupManager.sol +++ b/contracts/v2/interfaces/IPolygonRollupManager.sol @@ -162,4 +162,9 @@ interface IPolygonRollupManager { * @dev When a rollup type does not exist */ error AllzkEVMSequencedBatchesMustBeVerified(); + + /** + * @dev When adding an existing rollup where the rollup address already was added + */ + error RollupAddressAlreadyExist(); } diff --git a/contracts/v2/lib/LegacyZKEVMStateVariables.sol b/contracts/v2/lib/LegacyZKEVMStateVariables.sol index 66d93ca2f..3802a9865 100644 --- a/contracts/v2/lib/LegacyZKEVMStateVariables.sol +++ b/contracts/v2/lib/LegacyZKEVMStateVariables.sol @@ -11,7 +11,8 @@ contract LegacyZKEVMStateVariables { /** * @notice Struct which will be stored for every batch sequence * @param accInputHash Hash chain that contains all the information to process a batch: - * keccak256(bytes32 oldAccInputHash, keccak256(bytes transactions), bytes32 globalExitRoot, uint64 timestamp, address seqAddress) + * Before etrog: keccak256(bytes32 oldAccInputHash, keccak256(bytes transactions), bytes32 globalExitRoot, uint64 timestamp, address seqAddress) + * Etrog: keccak256(bytes32 oldAccInputHash, keccak256(bytes transactions), bytes32 l1InfoRoot/forcedGlobalExitRoot, uint64 currentTimestamp/forcedTimestamp, address l2Coinbase, bytes32 0/forcedBlockHashL1) * @param sequencedTimestamp Sequenced timestamp * @param previousLastBatchSequenced Previous last batch sequenced before the current one, this is used to properly calculate the fees */ diff --git a/contracts/v2/lib/PolygonConstantsBase.sol b/contracts/v2/lib/PolygonConstantsBase.sol new file mode 100644 index 000000000..6050be9c1 --- /dev/null +++ b/contracts/v2/lib/PolygonConstantsBase.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.20; + +/** + * This contract will contain the constants used across different contracts + */ +contract PolygonConstantsBase { + // If the system a does not verify a batch inside this time window, the contract enters in emergency mode + uint64 internal constant _HALT_AGGREGATION_TIMEOUT = 1 weeks; + + // Maximum batches that can be verified in one call. It depends on our current metrics + // This should be a protection against someone that tries to generate huge chunk of invalid batches, and we can't prove otherwise before the pending timeout expires + uint64 internal constant _MAX_VERIFY_BATCHES = 1000; +} diff --git a/contracts/v2/lib/PolygonRollupBase.sol b/contracts/v2/lib/PolygonRollupBase.sol index 516b1f968..4a7facac0 100644 --- a/contracts/v2/lib/PolygonRollupBase.sol +++ b/contracts/v2/lib/PolygonRollupBase.sol @@ -10,6 +10,7 @@ import "../PolygonRollupManager.sol"; import "../interfaces/IPolygonRollupBase.sol"; import "../interfaces/IPolygonZkEVMBridgeV2.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol"; +import "./PolygonConstantsBase.sol"; // review Possible renaming to PolygonL2Base @@ -23,6 +24,7 @@ import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20Metadat */ contract PolygonRollupBase is Initializable, + PolygonConstantsBase, IPolygonZkEVMV2Errors, IPolygonRollupBase { @@ -59,19 +61,6 @@ contract PolygonRollupBase is uint64 minForcedTimestamp; } - /** - * @notice Struct which will be stored for every batch sequence - * @param accInputHash Hash chain that contains all the information to process a batch: - * keccak256(bytes32 oldAccInputHash, keccak256(bytes transactions), bytes32 globalExitRoot, uint64 timestamp, address seqAddress) - * @param sequencedTimestamp Sequenced timestamp - * @param previousLastBatchSequenced Previous last batch sequenced before the current one, this is used to properly calculate the fees - */ - struct SequencedBatchData { - bytes32 accInputHash; - uint64 sequencedTimestamp; - uint64 previousLastBatchSequenced; - } - // Max transactions bytes that can be added in a single batch // Max keccaks circuit = (2**23 / 155286) * 44 = 2376 // Bytes per keccak = 136 @@ -90,13 +79,6 @@ contract PolygonRollupBase is // This is used to avoid huge calldata attacks, where the attacker call force batches from another contract uint256 internal constant _MAX_FORCE_BATCH_BYTE_LENGTH = 5000; - // If a sequenced batch exceeds this timeout without being verified, the contract enters in emergency mode - uint64 internal constant _HALT_AGGREGATION_TIMEOUT = 1 weeks; - - // Maximum batches that can be verified in one call. It depends on our current metrics - // This should be a protection against someone that tries to generate huge chunk of invalid batches, and we can't prove otherwise before the pending timeout expires - uint64 internal constant _MAX_VERIFY_BATCHES = 1000; - // In order to encode the initialize transaction of the bridge there's have a constant part and the metadata which is variable // Note the total transaction will be constrained to 65535 to avoid attacks and simplify the implementation diff --git a/contracts/v2/lib/PolygonRollupBaseEtrog.sol b/contracts/v2/lib/PolygonRollupBaseEtrog.sol index ae2c350af..1e6551578 100644 --- a/contracts/v2/lib/PolygonRollupBaseEtrog.sol +++ b/contracts/v2/lib/PolygonRollupBaseEtrog.sol @@ -10,6 +10,7 @@ import "../PolygonRollupManager.sol"; import "../interfaces/IPolygonRollupBase.sol"; import "../interfaces/IPolygonZkEVMBridgeV2.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol"; +import "./PolygonConstantsBase.sol"; // review Possible renaming to PolygonL2BaseEtrog @@ -23,6 +24,7 @@ import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20Metadat */ contract PolygonRollupBaseEtrog is Initializable, + PolygonConstantsBase, IPolygonZkEVMV2Errors, IPolygonRollupBase { @@ -45,19 +47,6 @@ contract PolygonRollupBaseEtrog is bytes32 forcedBlockHashL1; } - /** - * @notice Struct which will be stored for every batch sequence - * @param accInputHash Hash chain that contains all the information to process a batch: - * keccak256(bytes32 oldAccInputHash, keccak256(bytes transactions), bytes32 globalExitRoot, uint64 timestamp, address seqAddress) - * @param sequencedTimestamp Sequenced timestamp - * @param previousLastBatchSequenced Previous last batch sequenced before the current one, this is used to properly calculate the fees - */ - struct SequencedBatchData { - bytes32 accInputHash; - uint64 sequencedTimestamp; - uint64 previousLastBatchSequenced; - } - // Max transactions bytes that can be added in a single batch // Max keccaks circuit = (2**23 / 155286) * 44 = 2376 // Bytes per keccak = 136 @@ -76,13 +65,6 @@ contract PolygonRollupBaseEtrog is // This is used to avoid huge calldata attacks, where the attacker call force batches from another contract uint256 internal constant _MAX_FORCE_BATCH_BYTE_LENGTH = 5000; - // If a sequenced batch exceeds this timeout without being verified, the contract enters in emergency mode - uint64 internal constant _HALT_AGGREGATION_TIMEOUT = 1 weeks; - - // Maximum batches that can be verified in one call. It depends on our current metrics - // This should be a protection against someone that tries to generate huge chunk of invalid batches, and we can't prove otherwise before the pending timeout expires - uint64 internal constant _MAX_VERIFY_BATCHES = 1000; - // In order to encode the initialize transaction of the bridge there's have a constant part and the metadata which is variable // Note the total transaction will be constrained to 65535 to avoid attacks and simplify the implementation diff --git a/contracts/v2/lib/PolygonTransparentProxy.sol b/contracts/v2/lib/PolygonTransparentProxy.sol index c0392b06d..08acd0f80 100644 --- a/contracts/v2/lib/PolygonTransparentProxy.sol +++ b/contracts/v2/lib/PolygonTransparentProxy.sol @@ -13,7 +13,6 @@ import {ITransparentUpgradeableProxy} from "@openzeppelin/contracts5/proxy/trans * @dev 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 */ contract PolygonTransparentProxy is ERC1967Proxy { diff --git a/contracts/v2/lib/PolygonZkEVMGlobalExitRootBaseStorage.sol b/contracts/v2/lib/PolygonZkEVMGlobalExitRootBaseStorage.sol index cb73169d8..2f8b48c7e 100644 --- a/contracts/v2/lib/PolygonZkEVMGlobalExitRootBaseStorage.sol +++ b/contracts/v2/lib/PolygonZkEVMGlobalExitRootBaseStorage.sol @@ -17,5 +17,6 @@ abstract contract PolygonZkEVMGlobalExitRootBaseStorage is bytes32 public lastMainnetExitRoot; // Store every global exit root: Root --> blockhash + // Note that previously recoded global exit roots in previous versions, timestamp was recorded instead of blockhash mapping(bytes32 => uint256) public globalExitRootMap; } diff --git a/contracts/v2/mocks/PolygonRollupManagerMock.sol b/contracts/v2/mocks/PolygonRollupManagerMock.sol index 4067f98fb..a3de8c046 100644 --- a/contracts/v2/mocks/PolygonRollupManagerMock.sol +++ b/contracts/v2/mocks/PolygonRollupManagerMock.sol @@ -12,7 +12,7 @@ contract PolygonRollupManagerMock is PolygonRollupManager { * @param _bridgeAddress Bridge address */ constructor( - IPolygonZkEVMGlobalExitRoot _globalExitRootManager, + IPolygonZkEVMGlobalExitRootV2 _globalExitRootManager, IERC20Upgradeable _pol, IPolygonZkEVMBridge _bridgeAddress ) PolygonRollupManager(_globalExitRootManager, _pol, _bridgeAddress) {} diff --git a/contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol b/contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol index 7047f8e94..26777f774 100644 --- a/contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol +++ b/contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol @@ -12,7 +12,7 @@ contract PolygonRollupManagerMockInternalTest is PolygonRollupManager { * @param _bridgeAddress Bridge address */ constructor( - IPolygonZkEVMGlobalExitRoot _globalExitRootManager, + IPolygonZkEVMGlobalExitRootV2 _globalExitRootManager, IERC20Upgradeable _pol, IPolygonZkEVMBridge _bridgeAddress ) PolygonRollupManager(_globalExitRootManager, _pol, _bridgeAddress) {} diff --git a/test/contractsv2/BridgeV2.test.ts b/test/contractsv2/BridgeV2.test.ts index 34b0f3a26..f7cbf63bf 100644 --- a/test/contractsv2/BridgeV2.test.ts +++ b/test/contractsv2/BridgeV2.test.ts @@ -30,6 +30,8 @@ function computeGlobalIndex(indexLocal: any, indexRollup: any, isMainnet: Boolea } describe("PolygonZkEVMBridge Contract", () => { + upgrades.silenceWarnings(); + let polygonZkEVMBridgeContract: PolygonZkEVMBridgeV2; let polTokenContract: ERC20PermitMock; let polygonZkEVMGlobalExitRoot: PolygonZkEVMGlobalExitRoot; @@ -62,6 +64,7 @@ describe("PolygonZkEVMBridge Contract", () => { const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); polygonZkEVMBridgeContract = (await upgrades.deployProxy(polygonZkEVMBridgeFactory, [], { initializer: false, + unsafeAllow: ["constructor"], })) as unknown as PolygonZkEVMBridgeV2; // deploy global exit root manager diff --git a/test/contractsv2/BridgeV2GasTokens.test.ts b/test/contractsv2/BridgeV2GasTokens.test.ts index eea3657b6..b14acb307 100644 --- a/test/contractsv2/BridgeV2GasTokens.test.ts +++ b/test/contractsv2/BridgeV2GasTokens.test.ts @@ -31,6 +31,8 @@ function computeGlobalIndex(indexLocal: any, indexRollup: any, isMainnet: Boolea } describe("PolygonZkEVMBridge Gas tokens tests", () => { + upgrades.silenceWarnings(); + let polygonZkEVMBridgeContract: PolygonZkEVMBridgeV2; let polTokenContract: ERC20PermitMock; let polygonZkEVMGlobalExitRoot: PolygonZkEVMGlobalExitRoot; @@ -68,6 +70,7 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); polygonZkEVMBridgeContract = (await upgrades.deployProxy(polygonZkEVMBridgeFactory, [], { initializer: false, + unsafeAllow: ["constructor"], })) as unknown as PolygonZkEVMBridgeV2; // deploy global exit root manager @@ -135,7 +138,10 @@ describe("PolygonZkEVMBridge Gas tokens tests", () => { it("should check the initalized function", async () => { // deploy PolygonZkEVMBridge const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); - const bridge = await upgrades.deployProxy(polygonZkEVMBridgeFactory, [], {initializer: false}); + const bridge = await upgrades.deployProxy(polygonZkEVMBridgeFactory, [], { + initializer: false, + unsafeAllow: ["constructor"], + }); await expect( bridge.initialize( diff --git a/test/contractsv2/BridgeV2Metadata.test.ts b/test/contractsv2/BridgeV2Metadata.test.ts index 120d316dc..2cf5f502a 100644 --- a/test/contractsv2/BridgeV2Metadata.test.ts +++ b/test/contractsv2/BridgeV2Metadata.test.ts @@ -37,6 +37,8 @@ function computeGlobalIndex(indexLocal: any, indexRollup: any, isMainnet: Boolea } describe("PolygonZkEVMBridge Contract", () => { + upgrades.silenceWarnings(); + let polygonZkEVMBridgeContract: PolygonZkEVMBridgeV2; let polTokenContract: ERC20PermitMock; let polygonZkEVMGlobalExitRoot: PolygonZkEVMGlobalExitRoot; @@ -69,6 +71,7 @@ describe("PolygonZkEVMBridge Contract", () => { const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); polygonZkEVMBridgeContract = (await upgrades.deployProxy(polygonZkEVMBridgeFactory, [], { initializer: false, + unsafeAllow: ["constructor"], })) as unknown as PolygonZkEVMBridgeV2; // deploy global exit root manager diff --git a/test/contractsv2/BridgeWrappedAddress.test.ts b/test/contractsv2/BridgeWrappedAddress.test.ts index 619e82621..65951f5fb 100644 --- a/test/contractsv2/BridgeWrappedAddress.test.ts +++ b/test/contractsv2/BridgeWrappedAddress.test.ts @@ -30,6 +30,8 @@ function computeGlobalIndex(indexLocal: any, indexRollup: any, isMainnet: Boolea } describe("PolygonZkEVMBridge Contract", () => { + upgrades.silenceWarnings(); + let polygonZkEVMBridgeContract: PolygonZkEVMBridgeV2; let polTokenContract: ERC20PermitMock; let polygonZkEVMGlobalExitRoot: PolygonZkEVMGlobalExitRoot; @@ -48,6 +50,7 @@ describe("PolygonZkEVMBridge Contract", () => { const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); polygonZkEVMBridgeContract = (await upgrades.deployProxy(polygonZkEVMBridgeFactory, [], { initializer: false, + unsafeAllow: ["constructor"], })) as unknown as PolygonZkEVMBridgeV2; // deploy global exit root manager diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index a914ec80d..6f7ac00bc 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -135,7 +135,10 @@ describe("Polygon ZK-EVM TestnetV2", () => { // deploy PolygonZkEVMBridge const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); - polygonZkEVMBridgeContract = await upgrades.deployProxy(polygonZkEVMBridgeFactory, [], {initializer: false}); + polygonZkEVMBridgeContract = await upgrades.deployProxy(polygonZkEVMBridgeFactory, [], { + initializer: false, + unsafeAllow: ["constructor"], + }); // deploy mock verifier const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManagerMock"); diff --git a/test/contractsv2/PolygonRollupManagerUpgrade.test.ts b/test/contractsv2/PolygonRollupManagerUpgrade.test.ts index aac7a503f..1fbf599e8 100644 --- a/test/contractsv2/PolygonRollupManagerUpgrade.test.ts +++ b/test/contractsv2/PolygonRollupManagerUpgrade.test.ts @@ -149,6 +149,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); polygonZkEVMBridgeContract = (await upgrades.deployProxy(polygonZkEVMBridgeFactory, [], { initializer: false, + unsafeAllow: ["constructor"], })) as any; // deploy PolygonZkEVM diff --git a/test/contractsv2/PolygonZkEVMV2.test.ts b/test/contractsv2/PolygonZkEVMV2.test.ts index 5d188e7e9..18e1e164c 100644 --- a/test/contractsv2/PolygonZkEVMV2.test.ts +++ b/test/contractsv2/PolygonZkEVMV2.test.ts @@ -134,7 +134,10 @@ describe("Polygon ZK-EVM TestnetV2", () => { // deploy PolygonZkEVMBridge const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); - polygonZkEVMBridgeContract = await upgrades.deployProxy(polygonZkEVMBridgeFactory, [], {initializer: false}); + polygonZkEVMBridgeContract = await upgrades.deployProxy(polygonZkEVMBridgeFactory, [], { + initializer: false, + unsafeAllow: ["constructor"], + }); // deploy mock verifier const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManagerEmptyMock"); From be4b9b15102f8309d92f2bd9bc46313ac98823d8 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 10 Jan 2024 15:23:39 +0100 Subject: [PATCH 134/230] fix deployment --- contracts/v2/PolygonRollupManager.sol | 2 +- .../v2/mocks/PolygonRollupManagerMockInternalTest.sol | 10 +++++++--- deployment/v2/3_deployContracts.ts | 6 +++++- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index 39a5e8a07..861692dbe 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -391,7 +391,7 @@ contract PolygonRollupManager is IVerifierRollup zkEVMVerifier, uint64 zkEVMForkID, uint64 zkEVMChainID - ) external reinitializer(2) { + ) external virtual reinitializer(2) { pendingStateTimeout = _pendingStateTimeout; trustedAggregatorTimeout = _trustedAggregatorTimeout; diff --git a/contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol b/contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol index 26777f774..ee14ae90b 100644 --- a/contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol +++ b/contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol @@ -17,14 +17,18 @@ contract PolygonRollupManagerMockInternalTest is PolygonRollupManager { IPolygonZkEVMBridge _bridgeAddress ) PolygonRollupManager(_globalExitRootManager, _pol, _bridgeAddress) {} - function initializeMock( + function initialize( address trustedAggregator, uint64 _pendingStateTimeout, uint64 _trustedAggregatorTimeout, address admin, address timelock, - address emergencyCouncil - ) external reinitializer(2) { + address emergencyCouncil, + PolygonZkEVMV2Existent polygonZkEVM, + IVerifierRollup zkEVMVerifier, + uint64 zkEVMForkID, + uint64 zkEVMChainID + ) external override reinitializer(2) { pendingStateTimeout = _pendingStateTimeout; trustedAggregatorTimeout = _trustedAggregatorTimeout; diff --git a/deployment/v2/3_deployContracts.ts b/deployment/v2/3_deployContracts.ts index 8f88cb17f..ca48ff162 100644 --- a/deployment/v2/3_deployContracts.ts +++ b/deployment/v2/3_deployContracts.ts @@ -425,9 +425,13 @@ async function main() { admin, timelockContract.target, emergencyCouncilAddress, + ethers.ZeroAddress, // unused parameter + ethers.ZeroAddress, // unused parameter + 0, // unused parameter + 0, // unused parameter ], { - initializer: "initializeMock", + initializer: "initialize", constructorArgs: [ polygonZkEVMGlobalExitRoot?.target, polTokenAddress, From a1617a05a3aec3db0fb931cd5823cc6b0bc5f696 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Fri, 12 Jan 2024 21:54:55 +0100 Subject: [PATCH 135/230] permissiones forced batches --- .../v2/interfaces/IPolygonZkEVMV2Errors.sol | 5 ++ contracts/v2/lib/PolygonRollupBase.sol | 49 +++++++++++-------- contracts/v2/lib/PolygonRollupBaseEtrog.sol | 49 +++++++++++-------- test/contractsv2/PolygonRollupManager.test.ts | 32 ++++++------ test/contractsv2/PolygonZkEVMV2.test.ts | 36 +++++++------- 5 files changed, 98 insertions(+), 73 deletions(-) diff --git a/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol b/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol index 141902826..f36da3b02 100644 --- a/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol +++ b/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol @@ -38,4 +38,9 @@ interface IPolygonZkEVMV2Errors is IPolygonZkEVMErrors { * @dev Thrown when the try to sequence force batches before the halt timeout period */ error HaltTimeoutNotExpiredAfterEmergencyState(); + + /** + * @dev Thrown when the try to update the force batch address once is set to address(0) + */ + error ForceBatchesDescentralized(); } diff --git a/contracts/v2/lib/PolygonRollupBase.sol b/contracts/v2/lib/PolygonRollupBase.sol index 4a7facac0..31337a691 100644 --- a/contracts/v2/lib/PolygonRollupBase.sol +++ b/contracts/v2/lib/PolygonRollupBase.sol @@ -198,8 +198,9 @@ contract PolygonRollupBase is // Force batch timeout uint64 public forceBatchTimeout; - // Indicates if forced batches are allowed - bool public isForcedBatchAllowed; + // Indicates what address is able to do forced batches + // If the address is set to 0, forced batches are open to everyone + address public forceBatchAddress; // Token address that will be used to pay gas fees in this rollup. This variable it's just for read purposes address public gasTokenAddress; @@ -261,9 +262,9 @@ contract PolygonRollupBase is event SetForceBatchTimeout(uint64 newforceBatchTimeout); /** - * @dev Emitted when activate force batches + * @dev Emitted when the admin update the force batch address */ - event ActivateForceBatches(); + event SetForceBatchAddress(address newForceBatchAddress); /** * @dev Emitted when the admin starts the two-step transfer role setting a new pending admin @@ -380,6 +381,8 @@ contract PolygonRollupBase is trustedSequencerURL = sequencerURL; networkName = _networkName; + forceBatchAddress = _admin; + // Constant deployment variables forceBatchTimeout = 5 days; @@ -400,8 +403,10 @@ contract PolygonRollupBase is _; } - modifier isForceBatchActive() { - if (!isForcedBatchAllowed) { + modifier isSenderAllowedToForceBatches() { + if ( + forceBatchAddress != address(0) && forceBatchAddress != msg.sender + ) { revert ForceBatchNotAllowed(); } _; @@ -600,7 +605,7 @@ contract PolygonRollupBase is function forceBatch( bytes calldata transactions, uint256 polAmount - ) public virtual isForceBatchActive { + ) public virtual isSenderAllowedToForceBatches { // Check if rollup manager is on emergency state if (rollupManager.isEmergencyState()) { revert ForceBatchesNotAllowedOnEmergencyState(); @@ -656,7 +661,7 @@ contract PolygonRollupBase is */ function sequenceForceBatches( ForcedBatchData[] calldata batches - ) external virtual isForceBatchActive { + ) external virtual isSenderAllowedToForceBatches { // Check if rollup manager is on emergency state if ( rollupManager.lastDeactivatedEmergencyStateTimestamp() + @@ -785,6 +790,22 @@ contract PolygonRollupBase is emit SetTrustedSequencerURL(newTrustedSequencerURL); } + /** + * @notice Allow the admin to change the force batch address, that will be allowed to force batches + * If address 0 is set, then everyone is able to force batches, this action is irreversible + * @param newForceBatchAddress New force batch address + */ + function setForceBatchAddress( + address newForceBatchAddress + ) external onlyAdmin { + if (forceBatchAddress == address(0)) { + revert ForceBatchesDescentralized(); + } + forceBatchAddress = newForceBatchAddress; + + emit SetForceBatchAddress(newForceBatchAddress); + } + /** * @notice Allow the admin to set the forcedBatchTimeout * The new value can only be lower, except if emergency state is active @@ -807,18 +828,6 @@ contract PolygonRollupBase is emit SetForceBatchTimeout(newforceBatchTimeout); } - /** - * @notice Allow the admin to turn on the force batches - * This action is not reversible - */ - function activateForceBatches() external onlyAdmin { - if (isForcedBatchAllowed) { - revert ForceBatchesAlreadyActive(); - } - isForcedBatchAllowed = true; - emit ActivateForceBatches(); - } - /** * @notice Starts the admin role transfer * This is a two step process, the pending admin must accepted to finalize the process diff --git a/contracts/v2/lib/PolygonRollupBaseEtrog.sol b/contracts/v2/lib/PolygonRollupBaseEtrog.sol index 1e6551578..b4b083a20 100644 --- a/contracts/v2/lib/PolygonRollupBaseEtrog.sol +++ b/contracts/v2/lib/PolygonRollupBaseEtrog.sol @@ -186,8 +186,9 @@ contract PolygonRollupBaseEtrog is // Force batch timeout uint64 public forceBatchTimeout; - // Indicates if forced batches are allowed - bool public isForcedBatchAllowed; + // Indicates what address is able to do forced batches + // If the address is set to 0, forced batches are open to everyone + address public forceBatchAddress; // Token address that will be used to pay gas fees in this rollup. This variable it's just for read purposes address public gasTokenAddress; @@ -249,9 +250,9 @@ contract PolygonRollupBaseEtrog is event SetForceBatchTimeout(uint64 newforceBatchTimeout); /** - * @dev Emitted when activate force batches + * @dev Emitted when the admin update the force batch address */ - event ActivateForceBatches(); + event SetForceBatchAddress(address newForceBatchAddress); /** * @dev Emitted when the admin starts the two-step transfer role setting a new pending admin @@ -370,6 +371,8 @@ contract PolygonRollupBaseEtrog is trustedSequencerURL = sequencerURL; networkName = _networkName; + forceBatchAddress = _admin; + // Constant deployment variables forceBatchTimeout = 5 days; @@ -390,8 +393,10 @@ contract PolygonRollupBaseEtrog is _; } - modifier isForceBatchActive() { - if (!isForcedBatchAllowed) { + modifier isSenderAllowedToForceBatches() { + if ( + forceBatchAddress != address(0) && forceBatchAddress != msg.sender + ) { revert ForceBatchNotAllowed(); } _; @@ -580,7 +585,7 @@ contract PolygonRollupBaseEtrog is function forceBatch( bytes calldata transactions, uint256 polAmount - ) public virtual isForceBatchActive { + ) public virtual isSenderAllowedToForceBatches { // Check if rollup manager is on emergency state if (rollupManager.isEmergencyState()) { revert ForceBatchesNotAllowedOnEmergencyState(); @@ -637,7 +642,7 @@ contract PolygonRollupBaseEtrog is */ function sequenceForceBatches( BatchData[] calldata batches - ) external virtual isForceBatchActive { + ) external virtual isSenderAllowedToForceBatches { // Check if rollup manager is on emergency state if ( rollupManager.lastDeactivatedEmergencyStateTimestamp() + @@ -767,6 +772,22 @@ contract PolygonRollupBaseEtrog is emit SetTrustedSequencerURL(newTrustedSequencerURL); } + /** + * @notice Allow the admin to change the force batch address, that will be allowed to force batches + * If address 0 is set, then everyone is able to force batches, this action is irreversible + * @param newForceBatchAddress New force batch address + */ + function setForceBatchAddress( + address newForceBatchAddress + ) external onlyAdmin { + if (forceBatchAddress == address(0)) { + revert ForceBatchesDescentralized(); + } + forceBatchAddress = newForceBatchAddress; + + emit SetForceBatchAddress(newForceBatchAddress); + } + /** * @notice Allow the admin to set the forcedBatchTimeout * The new value can only be lower, except if emergency state is active @@ -789,18 +810,6 @@ contract PolygonRollupBaseEtrog is emit SetForceBatchTimeout(newforceBatchTimeout); } - /** - * @notice Allow the admin to turn on the force batches - * This action is not reversible - */ - function activateForceBatches() external onlyAdmin { - if (isForcedBatchAllowed) { - revert ForceBatchesAlreadyActive(); - } - isForcedBatchAllowed = true; - emit ActivateForceBatches(); - } - /** * @notice Starts the admin role transfer * This is a two step process, the pending admin must accepted to finalize the process diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index 6f7ac00bc..4732ccfd3 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -783,14 +783,19 @@ describe("Polygon ZK-EVM TestnetV2", () => { "ForceBatchNotAllowed" ); - await expect(newZkEVMContract.connect(admin).activateForceBatches()).to.emit( - newZkEVMContract, - "ActivateForceBatches" - ); - await expect(newZkEVMContract.connect(admin).activateForceBatches()).to.be.revertedWithCustomError( - newZkEVMContract, - "ForceBatchesAlreadyActive" - ); + expect(await newZkEVMContract.forceBatchAddress()).to.be.equal(admin.address); + await expect(newZkEVMContract.connect(admin).setForceBatchAddress(deployer.address)) + .to.emit(newZkEVMContract, "SetForceBatchAddress") + .withArgs(deployer.address); + expect(await newZkEVMContract.forceBatchAddress()).to.be.equal(deployer.address); + + await expect(newZkEVMContract.connect(admin).setForceBatchAddress(ethers.ZeroAddress)) + .to.emit(newZkEVMContract, "SetForceBatchAddress") + .withArgs(ethers.ZeroAddress); + + await expect( + newZkEVMContract.connect(admin).setForceBatchAddress(deployer.address) + ).to.be.revertedWithCustomError(newZkEVMContract, "ForceBatchesDescentralized"); //snapshot emergency const snapshotEmergencyState = await takeSnapshot(); @@ -1484,14 +1489,9 @@ describe("Polygon ZK-EVM TestnetV2", () => { "ForceBatchNotAllowed" ); - await expect(newZkEVMContract.connect(admin).activateForceBatches()).to.emit( - newZkEVMContract, - "ActivateForceBatches" - ); - await expect(newZkEVMContract.connect(admin).activateForceBatches()).to.be.revertedWithCustomError( - newZkEVMContract, - "ForceBatchesAlreadyActive" - ); + await expect(newZkEVMContract.connect(admin).setForceBatchAddress(ethers.ZeroAddress)) + .to.emit(newZkEVMContract, "SetForceBatchAddress") + .withArgs(ethers.ZeroAddress); const l2txDataForceBatch = "0x123456"; const maticAmountForced = await rollupManagerContract.getForcedBatchFee(); diff --git a/test/contractsv2/PolygonZkEVMV2.test.ts b/test/contractsv2/PolygonZkEVMV2.test.ts index 18e1e164c..92f17ea6b 100644 --- a/test/contractsv2/PolygonZkEVMV2.test.ts +++ b/test/contractsv2/PolygonZkEVMV2.test.ts @@ -286,20 +286,17 @@ describe("Polygon ZK-EVM TestnetV2", () => { ); // deployer now is the admin - await expect(PolygonZKEVMV2Contract.connect(admin).activateForceBatches()).to.be.revertedWithCustomError( - PolygonZKEVMV2Contract, - "OnlyAdmin" - ); + await expect( + PolygonZKEVMV2Contract.connect(admin).setForceBatchAddress(ethers.ZeroAddress) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "OnlyAdmin"); - await expect(PolygonZKEVMV2Contract.connect(deployer).activateForceBatches()).to.emit( - PolygonZKEVMV2Contract, - "ActivateForceBatches" - ); + await expect(PolygonZKEVMV2Contract.connect(deployer).setForceBatchAddress(ethers.ZeroAddress)) + .to.emit(PolygonZKEVMV2Contract, "SetForceBatchAddress") + .withArgs(ethers.ZeroAddress); - await expect(PolygonZKEVMV2Contract.connect(deployer).activateForceBatches()).to.be.revertedWithCustomError( - PolygonZKEVMV2Contract, - "ForceBatchesAlreadyActive" - ); + await expect( + PolygonZKEVMV2Contract.connect(deployer).setForceBatchAddress(ethers.ZeroAddress) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "ForceBatchesDescentralized"); }); it("should check full flow", async () => { @@ -661,7 +658,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { const maticAmount = ethers.parseEther("1"); // Approve tokens - await expect(polTokenContract.connect(deployer).approve(PolygonZKEVMV2Contract.target, maticAmount)).to.emit( + await expect(polTokenContract.connect(admin).approve(PolygonZKEVMV2Contract.target, maticAmount)).to.emit( polTokenContract, "Approval" ); @@ -676,18 +673,23 @@ describe("Polygon ZK-EVM TestnetV2", () => { "ForceBatchNotAllowed" ); - // deployer now is the admin - await PolygonZKEVMV2Contract.connect(admin).activateForceBatches(); + //await PolygonZKEVMV2Contract.connect(admin).activateForceBatches(); + await polTokenContract.transfer(admin.address, ethers.parseEther("1000")); // force Batches await expect(PolygonZKEVMV2Contract.forceBatch(l2txData, 0)).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "ForceBatchNotAllowed" + ); + + await expect(PolygonZKEVMV2Contract.connect(admin).forceBatch(l2txData, 0)).to.be.revertedWithCustomError( PolygonZKEVMV2Contract, "NotEnoughPOLAmount" ); - await expect(PolygonZKEVMV2Contract.forceBatch(l2txData, maticAmount)) + await expect(PolygonZKEVMV2Contract.connect(admin).forceBatch(l2txData, maticAmount)) .to.emit(PolygonZKEVMV2Contract, "ForceBatch") - .withArgs(1, globalExitRoot, deployer.address, "0x"); + .withArgs(1, globalExitRoot, admin.address, "0x"); expect(await PolygonZKEVMV2Contract.calculatePolPerForceBatch()).to.be.equal( await rollupManagerContract.getForcedBatchFee() From 31071ac425f89a343f285200212dd58d4736875e Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 15 Jan 2024 16:59:25 +0100 Subject: [PATCH 136/230] fixed --- contracts/v2/consensus/zkEVM/PolygonZkEVMV2Existent.sol | 2 ++ contracts/v2/consensus/zkEVM/PolygonZkEVMV2ExistentEtrog.sol | 2 ++ 2 files changed, 4 insertions(+) diff --git a/contracts/v2/consensus/zkEVM/PolygonZkEVMV2Existent.sol b/contracts/v2/consensus/zkEVM/PolygonZkEVMV2Existent.sol index adb2be166..708867a35 100644 --- a/contracts/v2/consensus/zkEVM/PolygonZkEVMV2Existent.sol +++ b/contracts/v2/consensus/zkEVM/PolygonZkEVMV2Existent.sol @@ -56,6 +56,8 @@ contract PolygonZkEVMV2Existent is PolygonRollupBase { trustedSequencerURL = _trustedSequencerURL; networkName = _networkName; + forceBatchAddress = _admin; + // zkEVM Upgraded variables lastAccInputHash = _lastAccInputHash; lastTimestamp = _lastTimestamp; diff --git a/contracts/v2/consensus/zkEVM/PolygonZkEVMV2ExistentEtrog.sol b/contracts/v2/consensus/zkEVM/PolygonZkEVMV2ExistentEtrog.sol index ba47c308f..d6745d022 100644 --- a/contracts/v2/consensus/zkEVM/PolygonZkEVMV2ExistentEtrog.sol +++ b/contracts/v2/consensus/zkEVM/PolygonZkEVMV2ExistentEtrog.sol @@ -55,6 +55,8 @@ contract PolygonZkEVMV2ExistentEtrog is PolygonRollupBaseEtrog { trustedSequencerURL = _trustedSequencerURL; networkName = _networkName; + forceBatchAddress = _admin; + // zkEVM Upgraded variables lastAccInputHash = _lastAccInputHash; From 27bd5c361729ea32710b6bab5eb13d6de40e515f Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 16 Jan 2024 18:26:59 +0100 Subject: [PATCH 137/230] fix typo --- contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol | 2 +- contracts/v2/lib/PolygonRollupBase.sol | 2 +- contracts/v2/lib/PolygonRollupBaseEtrog.sol | 2 +- test/contractsv2/PolygonRollupManager.test.ts | 2 +- test/contractsv2/PolygonZkEVMV2.test.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol b/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol index f36da3b02..02799979f 100644 --- a/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol +++ b/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol @@ -42,5 +42,5 @@ interface IPolygonZkEVMV2Errors is IPolygonZkEVMErrors { /** * @dev Thrown when the try to update the force batch address once is set to address(0) */ - error ForceBatchesDescentralized(); + error ForceBatchesDecentralized(); } diff --git a/contracts/v2/lib/PolygonRollupBase.sol b/contracts/v2/lib/PolygonRollupBase.sol index 31337a691..cea7bdcf1 100644 --- a/contracts/v2/lib/PolygonRollupBase.sol +++ b/contracts/v2/lib/PolygonRollupBase.sol @@ -799,7 +799,7 @@ contract PolygonRollupBase is address newForceBatchAddress ) external onlyAdmin { if (forceBatchAddress == address(0)) { - revert ForceBatchesDescentralized(); + revert ForceBatchesDecentralized(); } forceBatchAddress = newForceBatchAddress; diff --git a/contracts/v2/lib/PolygonRollupBaseEtrog.sol b/contracts/v2/lib/PolygonRollupBaseEtrog.sol index b4b083a20..63274e980 100644 --- a/contracts/v2/lib/PolygonRollupBaseEtrog.sol +++ b/contracts/v2/lib/PolygonRollupBaseEtrog.sol @@ -781,7 +781,7 @@ contract PolygonRollupBaseEtrog is address newForceBatchAddress ) external onlyAdmin { if (forceBatchAddress == address(0)) { - revert ForceBatchesDescentralized(); + revert ForceBatchesDecentralized(); } forceBatchAddress = newForceBatchAddress; diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index 4732ccfd3..6b0043523 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -795,7 +795,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { await expect( newZkEVMContract.connect(admin).setForceBatchAddress(deployer.address) - ).to.be.revertedWithCustomError(newZkEVMContract, "ForceBatchesDescentralized"); + ).to.be.revertedWithCustomError(newZkEVMContract, "ForceBatchesDecentralized"); //snapshot emergency const snapshotEmergencyState = await takeSnapshot(); diff --git a/test/contractsv2/PolygonZkEVMV2.test.ts b/test/contractsv2/PolygonZkEVMV2.test.ts index 92f17ea6b..49ef1d6c3 100644 --- a/test/contractsv2/PolygonZkEVMV2.test.ts +++ b/test/contractsv2/PolygonZkEVMV2.test.ts @@ -296,7 +296,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { await expect( PolygonZKEVMV2Contract.connect(deployer).setForceBatchAddress(ethers.ZeroAddress) - ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "ForceBatchesDescentralized"); + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "ForceBatchesDecentralized"); }); it("should check full flow", async () => { From 47a1dd736b342a2da7dc99c68727d08c5dfc8660 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 15 Jan 2024 16:52:00 +0100 Subject: [PATCH 138/230] injec tx on existen etrog --- .../zkEVM/PolygonZkEVMV2ExistentEtrog.sol | 54 +++++++++++++++++-- 1 file changed, 50 insertions(+), 4 deletions(-) diff --git a/contracts/v2/consensus/zkEVM/PolygonZkEVMV2ExistentEtrog.sol b/contracts/v2/consensus/zkEVM/PolygonZkEVMV2ExistentEtrog.sol index d6745d022..cc317d47d 100644 --- a/contracts/v2/consensus/zkEVM/PolygonZkEVMV2ExistentEtrog.sol +++ b/contracts/v2/consensus/zkEVM/PolygonZkEVMV2ExistentEtrog.sol @@ -12,6 +12,19 @@ import "../../lib/PolygonRollupBaseEtrog.sol"; * To enter and exit of the L2 network will be used a PolygonZkEVMBridge smart contract that will be deployed in both networks. */ contract PolygonZkEVMV2ExistentEtrog is PolygonRollupBaseEtrog { + // Transaction that will be injected as a forced transaction, to setup the timestamp on the state root + bytes public constant SET_UP_ETROG_TX = + hex"df2a8080944d5cf5032b2a844602278b01199ed191a86c93ff80808210928080ba42034e163abcd726e65aac3b7c747e8d36cd473b2419910ffa3fb96c10b9df28e9b6f13e927dd66ab2281a5cdeb98cdb3d49d09be9ba1b1716535c650f012b1bff"; + + /** + * @dev Emitted when the system is updated to a etrog using this contract, contain the set up etrog transaction + */ + event UpdateEtrogSequence( + bytes transactions, + bytes32 lastGlobalExitRoot, + address sequencer + ); + /** * @param _globalExitRootManager Global exit root manager address * @param _pol POL token address @@ -49,6 +62,36 @@ contract PolygonZkEVMV2ExistentEtrog is PolygonRollupBaseEtrog { bytes32 _lastAccInputHash, uint64 /*_lastTimestamp*/ // review ) external onlyRollupManager initializer { + // Set up etrog Tx + bytes memory transaction = SET_UP_ETROG_TX; + bytes32 currentTransactionsHash = keccak256(transaction); + + // Get current timestamp and global exit root + uint64 currentTimestamp = uint64(block.timestamp); + bytes32 lastGlobalExitRoot = globalExitRootManager + .getLastGlobalExitRoot(); + + // Add the transaction to the sequence as if it was a force transaction + bytes32 newAccInputHash = keccak256( + abi.encodePacked( + _lastAccInputHash, // Last acc Input hash + currentTransactionsHash, + lastGlobalExitRoot, // Global exit root + currentTimestamp, + _trustedSequencer, + blockhash(block.number - 1) + ) + ); + + // Set acumulated input hash + lastAccInputHash = newAccInputHash; + + rollupManager.onSequenceBatches( + uint64(1), // num total batches + newAccInputHash + ); + + // Set zkEVM variables admin = _admin; trustedSequencer = _trustedSequencer; @@ -57,13 +100,16 @@ contract PolygonZkEVMV2ExistentEtrog is PolygonRollupBaseEtrog { forceBatchAddress = _admin; - // zkEVM Upgraded variables - lastAccInputHash = _lastAccInputHash; - - // Constant deployment variables + // Constant variables forceBatchTimeout = 5 days; // Both gasTokenAddress and gasTokenNetwork are 0, since it uses ether as gas token // Therefore is not necessary to set the variables + + emit UpdateEtrogSequence( + transaction, + lastGlobalExitRoot, + _trustedSequencer + ); } } From 7c60b711a2a2831a6bbc80f8385da7a9ef2c677c Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 16 Jan 2024 09:16:36 +0100 Subject: [PATCH 139/230] update paris contracts --- compiled-contracts/paris/FflonkVerifier.json | 4 +- .../paris/PolygonDataComittee.json | 97 +++++++++++++------ .../paris/PolygonRollupManager.json | 26 ++++- .../paris/PolygonRollupManagerMock.json | 26 ++++- .../PolygonRollupManagerMockInternalTest.json | 64 +++++------- compiled-contracts/paris/PolygonZkEVM.json | 4 +- .../paris/PolygonZkEVMBridge.json | 4 +- .../paris/PolygonZkEVMBridgeMock.json | 4 +- .../paris/PolygonZkEVMBridgeV2.json | 27 +++++- .../paris/PolygonZkEVMGlobalExitRootV2.json | 4 +- .../paris/PolygonZkEVMMock.json | 4 +- .../paris/PolygonZkEVMTimelock.json | 4 +- compiled-contracts/paris/PolygonZkEVMV2.json | 84 ++++++++++------ .../paris/PolygonZkEVMV2Existent.json | 84 ++++++++++------ .../paris/VerifierRollupHelperMock.json | 4 +- 15 files changed, 287 insertions(+), 153 deletions(-) diff --git a/compiled-contracts/paris/FflonkVerifier.json b/compiled-contracts/paris/FflonkVerifier.json index b1c7ce830..49aac4704 100644 --- a/compiled-contracts/paris/FflonkVerifier.json +++ b/compiled-contracts/paris/FflonkVerifier.json @@ -28,8 +28,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b506159ee80620000216000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80639121da8a14610030575b600080fd5b61004361003e366004615973565b610057565b604051901515815260200160405180910390f35b6000615901565b6040516104c08201518082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610500840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610520840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610620840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760840151820990508082526102e4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309600114610514576000805260206000f35b8091506020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161076085015183099150806107608501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001850151830991508060a06106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001850151830991508060806106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001850151830991508060606106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001850151830991508060406106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001850151830991508060206106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a085015183099150806106a08501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106200185015183099150806060610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106200185015183099150806040610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106200185015183099150806020610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161062085015183099150806106208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001850151830991508060e0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001850151830991508060c0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001850151830991508060a0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806105200185015183099150806080610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606105200185015183099150806060610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406105200185015183099150806040610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206105200185015183099150806020610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161052085015183099150806105208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161050085015183099150806105008501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e085015183099150806104e085015250806104c0840152505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110610d7a576000805260206000f35b50565b803560208201357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760037f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478085860985090891507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478182099050808214610e08576000805260206000f35b505050565b610e176004610d7d565b610e216044610d7d565b610e2b6084610d7d565b610e3560c4610d7d565b610e4161010435610d49565b610e4d61012435610d49565b610e5961014435610d49565b610e6561016435610d49565b610e7161018435610d49565b610e7d6101a435610d49565b610e896101c435610d49565b610e956101e435610d49565b610ea161020435610d49565b610ead61022435610d49565b610eb961024435610d49565b610ec561026435610d49565b610ed161028435610d49565b610edd6102a435610d49565b610ee96102c435610d49565b610ef56102e435610d49565b565b7f10711a639fed66ba6cd6001188b8fe7285cb9bd01afc1f90598223550aa57e3661078082019081527f28c937a4cb758326763015d30fff3568f5cbed932cdc7c411a435d3de04549ef6107a0830190815283356107c084019081526004356107e085015260243561080085015260a083207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908190066020808701918252902081900660408601819052845260443590925260643590526060909120819006608083018190529081800960a0830181905260808301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001910960e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8060e0840151096101008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f70363660e0840151096101208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f1d59376149b959ccbd157ac850893a6f07c2d99b3852513ab8d01be8e846a56660e0840151096101408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000060e0840151096101608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0530d09118705106cbb4a786ead16926d5d174e181a26686af5448492e42a18160e0840151096101808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb60e0840151096101a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f130b17119778465cfb3acaee30f81dee20710ead41671f568b11d9ab07b95a9b60e0840151096101c083015260e08201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019080096101e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f7036366101e0840151096102008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006101e0840151096102208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb6101e0840151096102408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a08301516101e0840151096102608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f23610260840151096102808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd610260840151096102a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f283ce45a2e5b8e4e78f9fbaf5f6a348bfcfaf76dd28e5ca7121b74ef68fdec2e610260840151096102c08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f236102c0840151096102e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd6102c0840151096103008301526102608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081818009098060c08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018182097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000909101066104a084018190526104c0840152506107808201526101e06101046107a083013761020061078082019081207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081900680845282526084356107a084015260a4356107c08401526060918290200691015250565b60e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018160080960e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105208601526101c08501516101008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105408601526101a08501516101208601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105608601526101808501516101408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961058086015261016085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105a08601526101408501516101808601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105c08601526101208501516101a08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105e08601526101008501516101c08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830960e0610520018601525050505050565b6101e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001816004096101e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106208601526102408501516102008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961064086015261022085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106608601526102008501516102408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096060610620018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c0870151097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030660c0850151087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610260850151600309096102608301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181810381900684087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106a08601526102a08501516102808601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106c08601526102808501516102a08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960406106a0018601527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c08801517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103067f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08a015109087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c0880151600309096102c086015190935091507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001828103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107008601526103008501516102e08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107208601526102e08501516103008601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960a06106a0018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806101e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806104e08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102608501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102e08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016103008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806105008401526127ff8361194e565b61280883611d96565b61281183611fac565b505060c081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000083018190066301000000096107608401525050610d7a8161005e565b6104a08101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181610760840151096107608301525050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185356107608601510983030106905080610320830152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820860e083015190915060009081807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600061052001890151880984098508935061010086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001890151880984098508935061012086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001890151880984098508935061014086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001890151880984098508935061016086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001890151880984098508935061018086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06105200189015188098409850893506101a086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c06105200189015188098409850893506101c086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e4350983089150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e0610520018801518709830984089250505080610340840152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068208905060006102043561022435610244357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183610104350993507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180836101243509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018486096101443509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161018435850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610320870151850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c087015185096101e08701519094506000908490827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600002610620018d01518c098509850893508692506102008a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600102610620018d01518c098509850893508692506102208a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600202610620018d01518c098509850893508692506102408a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001858509098408925050507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600302610620018b01518a09830983089150508061036088015250505050505050565b606081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309905060017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08901510908820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830860c08501519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190817f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b82090990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183089150506000915060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c085015160208601510960408501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828408610204350892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028709086102243508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160038709086102443508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161026435840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a43560208b01510908610204350894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c43560208c015109086102243508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101e43560208c015109086102443508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161028435860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151840992506001610264350394507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760870151860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c08701518609610260870151909550915060009050807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206000026106a0018a0151880983098308915061028087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206001026106a0018a015188098309830891506102a087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206002026106a0018a015188098309830891506102c087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206003026106a0018a015188098309830891506102e087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206004026106a0018a0151880983098308915061030087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206005026106a0018a015188098309830891505080610380870152505050505050565b6040518151815260208201516020820152825160408201526020830151606082015260408260808360066107d05a03fa905080610e08576000805260206000f35b6000604051833581526020840135602082015284604082015260408160608360076107d05a03fa91508161514e576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa9150508061517f576000805260206000f35b50505050565b600060405183815284602082015285604082015260408160608360076107d05a03fa9150816151b8576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa915050806151e9576000805260206000f35b5050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101608601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806104e0850151830984510991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180610500850151830984517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908009097f10711a639fed66ba6cd6001188b8fe7285cb9bd01afc1f90598223550aa57e366103a08501527f28c937a4cb758326763015d30fff3568f5cbed932cdc7c411a435d3de04549ef60206103a0018501526156408360046103a08701615116565b6156508160446103a08701615116565b6156dd7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161038088015185097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161036089015188090861034087015108600260016103e08801615185565b50610e088160846104208601615116565b604051610400820180517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd479081038190069091526104408301805182039190910690526000906157466103e084016103a085016150d5565b61575861042084016103a085016150d5565b61576c606084015160c46103a08601615116565b6103a083015181526103c08301516020808301919091527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a083015260c43560c08301527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760e43581030660e08301527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6101008301527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6101208301527f1970ea81dd6992adfbc571effb03503adbbb6a857f578403c6c40e22d65b3c026101408301527f054793348f12c0cf5622c340573cb277586319de359ab9389778f689786b1e48610160830152816101808160086107d05a03fa90511692915050565b6040516107808101604052615914610e0d565b61591e8382610ef7565b615927816123b7565b61593081612878565b61593a83826128b1565b61594381612911565b61594c81613e61565b61595581614559565b61595e816151f0565b615967816156ee565b90508060005260206000f35b60008061032080848603121561598857600080fd5b61030084018581111561599a57600080fd5b8493508582860111156159ac57600080fd5b8092505050925092905056fea2646970667358221220a7ce4ff15918cfa18c62f216a918f83379870551bb7d6de9b7e59e19931b9ada64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80639121da8a14610030575b600080fd5b61004361003e366004615973565b610057565b604051901515815260200160405180910390f35b6000615901565b6040516104c08201518082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610500840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610520840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610620840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760840151820990508082526102e4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309600114610514576000805260206000f35b8091506020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161076085015183099150806107608501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001850151830991508060a06106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001850151830991508060806106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001850151830991508060606106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001850151830991508060406106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001850151830991508060206106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a085015183099150806106a08501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106200185015183099150806060610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106200185015183099150806040610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106200185015183099150806020610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161062085015183099150806106208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001850151830991508060e0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001850151830991508060c0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001850151830991508060a0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806105200185015183099150806080610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606105200185015183099150806060610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406105200185015183099150806040610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206105200185015183099150806020610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161052085015183099150806105208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161050085015183099150806105008501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e085015183099150806104e085015250806104c0840152505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110610d7a576000805260206000f35b50565b803560208201357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760037f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478085860985090891507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478182099050808214610e08576000805260206000f35b505050565b610e176004610d7d565b610e216044610d7d565b610e2b6084610d7d565b610e3560c4610d7d565b610e4161010435610d49565b610e4d61012435610d49565b610e5961014435610d49565b610e6561016435610d49565b610e7161018435610d49565b610e7d6101a435610d49565b610e896101c435610d49565b610e956101e435610d49565b610ea161020435610d49565b610ead61022435610d49565b610eb961024435610d49565b610ec561026435610d49565b610ed161028435610d49565b610edd6102a435610d49565b610ee96102c435610d49565b610ef56102e435610d49565b565b7f10711a639fed66ba6cd6001188b8fe7285cb9bd01afc1f90598223550aa57e3661078082019081527f28c937a4cb758326763015d30fff3568f5cbed932cdc7c411a435d3de04549ef6107a0830190815283356107c084019081526004356107e085015260243561080085015260a083207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908190066020808701918252902081900660408601819052845260443590925260643590526060909120819006608083018190529081800960a0830181905260808301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001910960e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8060e0840151096101008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f70363660e0840151096101208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f1d59376149b959ccbd157ac850893a6f07c2d99b3852513ab8d01be8e846a56660e0840151096101408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000060e0840151096101608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0530d09118705106cbb4a786ead16926d5d174e181a26686af5448492e42a18160e0840151096101808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb60e0840151096101a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f130b17119778465cfb3acaee30f81dee20710ead41671f568b11d9ab07b95a9b60e0840151096101c083015260e08201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019080096101e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f7036366101e0840151096102008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006101e0840151096102208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb6101e0840151096102408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a08301516101e0840151096102608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f23610260840151096102808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd610260840151096102a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f283ce45a2e5b8e4e78f9fbaf5f6a348bfcfaf76dd28e5ca7121b74ef68fdec2e610260840151096102c08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f236102c0840151096102e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd6102c0840151096103008301526102608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081818009098060c08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018182097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000909101066104a084018190526104c0840152506107808201526101e06101046107a083013761020061078082019081207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081900680845282526084356107a084015260a4356107c08401526060918290200691015250565b60e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018160080960e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105208601526101c08501516101008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105408601526101a08501516101208601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105608601526101808501516101408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961058086015261016085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105a08601526101408501516101808601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105c08601526101208501516101a08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105e08601526101008501516101c08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830960e0610520018601525050505050565b6101e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001816004096101e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106208601526102408501516102008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961064086015261022085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106608601526102008501516102408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096060610620018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c0870151097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030660c0850151087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610260850151600309096102608301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181810381900684087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106a08601526102a08501516102808601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106c08601526102808501516102a08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960406106a0018601527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c08801517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103067f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08a015109087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c0880151600309096102c086015190935091507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001828103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107008601526103008501516102e08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107208601526102e08501516103008601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960a06106a0018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806101e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806104e08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102608501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102e08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016103008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806105008401526127ff8361194e565b61280883611d96565b61281183611fac565b505060c081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000083018190066301000000096107608401525050610d7a8161005e565b6104a08101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181610760840151096107608301525050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185356107608601510983030106905080610320830152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820860e083015190915060009081807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600061052001890151880984098508935061010086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001890151880984098508935061012086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001890151880984098508935061014086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001890151880984098508935061016086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001890151880984098508935061018086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06105200189015188098409850893506101a086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c06105200189015188098409850893506101c086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e4350983089150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e0610520018801518709830984089250505080610340840152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068208905060006102043561022435610244357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183610104350993507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180836101243509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018486096101443509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161018435850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610320870151850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c087015185096101e08701519094506000908490827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600002610620018d01518c098509850893508692506102008a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600102610620018d01518c098509850893508692506102208a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600202610620018d01518c098509850893508692506102408a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001858509098408925050507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600302610620018b01518a09830983089150508061036088015250505050505050565b606081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309905060017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08901510908820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830860c08501519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190817f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b82090990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183089150506000915060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c085015160208601510960408501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828408610204350892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028709086102243508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160038709086102443508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161026435840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a43560208b01510908610204350894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c43560208c015109086102243508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101e43560208c015109086102443508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161028435860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151840992506001610264350394507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760870151860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c08701518609610260870151909550915060009050807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206000026106a0018a0151880983098308915061028087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206001026106a0018a015188098309830891506102a087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206002026106a0018a015188098309830891506102c087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206003026106a0018a015188098309830891506102e087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206004026106a0018a0151880983098308915061030087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206005026106a0018a015188098309830891505080610380870152505050505050565b6040518151815260208201516020820152825160408201526020830151606082015260408260808360066107d05a03fa905080610e08576000805260206000f35b6000604051833581526020840135602082015284604082015260408160608360076107d05a03fa91508161514e576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa9150508061517f576000805260206000f35b50505050565b600060405183815284602082015285604082015260408160608360076107d05a03fa9150816151b8576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa915050806151e9576000805260206000f35b5050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101608601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806104e0850151830984510991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180610500850151830984517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908009097f10711a639fed66ba6cd6001188b8fe7285cb9bd01afc1f90598223550aa57e366103a08501527f28c937a4cb758326763015d30fff3568f5cbed932cdc7c411a435d3de04549ef60206103a0018501526156408360046103a08701615116565b6156508160446103a08701615116565b6156dd7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161038088015185097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161036089015188090861034087015108600260016103e08801615185565b50610e088160846104208601615116565b604051610400820180517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd479081038190069091526104408301805182039190910690526000906157466103e084016103a085016150d5565b61575861042084016103a085016150d5565b61576c606084015160c46103a08601615116565b6103a083015181526103c08301516020808301919091527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a083015260c43560c08301527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760e43581030660e08301527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6101008301527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6101208301527f1970ea81dd6992adfbc571effb03503adbbb6a857f578403c6c40e22d65b3c026101408301527f054793348f12c0cf5622c340573cb277586319de359ab9389778f689786b1e48610160830152816101808160086107d05a03fa90511692915050565b6040516107808101604052615914610e0d565b61591e8382610ef7565b615927816123b7565b61593081612878565b61593a83826128b1565b61594381612911565b61594c81613e61565b61595581614559565b61595e816151f0565b615967816156ee565b90508060005260206000f35b60008061032080848603121561598857600080fd5b61030084018581111561599a57600080fd5b8493508582860111156159ac57600080fd5b8092505050925092905056fea2646970667358221220a7ce4ff15918cfa18c62f216a918f83379870551bb7d6de9b7e59e19931b9ada64736f6c63430008140033", + "bytecode": "0x608060405234801561001057600080fd5b506159ee80620000216000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80639121da8a14610030575b600080fd5b61004361003e366004615973565b610057565b604051901515815260200160405180910390f35b6000615901565b6040516104c08201518082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610500840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610520840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610620840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760840151820990508082526102e4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309600114610514576000805260206000f35b8091506020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161076085015183099150806107608501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001850151830991508060a06106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001850151830991508060806106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001850151830991508060606106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001850151830991508060406106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001850151830991508060206106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a085015183099150806106a08501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106200185015183099150806060610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106200185015183099150806040610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106200185015183099150806020610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161062085015183099150806106208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001850151830991508060e0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001850151830991508060c0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001850151830991508060a0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806105200185015183099150806080610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606105200185015183099150806060610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406105200185015183099150806040610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206105200185015183099150806020610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161052085015183099150806105208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161050085015183099150806105008501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e085015183099150806104e085015250806104c0840152505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110610d7a576000805260206000f35b50565b803560208201357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760037f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478085860985090891507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478182099050808214610e08576000805260206000f35b505050565b610e176004610d7d565b610e216044610d7d565b610e2b6084610d7d565b610e3560c4610d7d565b610e4161010435610d49565b610e4d61012435610d49565b610e5961014435610d49565b610e6561016435610d49565b610e7161018435610d49565b610e7d6101a435610d49565b610e896101c435610d49565b610e956101e435610d49565b610ea161020435610d49565b610ead61022435610d49565b610eb961024435610d49565b610ec561026435610d49565b610ed161028435610d49565b610edd6102a435610d49565b610ee96102c435610d49565b610ef56102e435610d49565b565b7f1e60b0dbec504049d180f2de88b98bf5d80a003eeac1799af0f8815466e4cd4061078082019081527f0b87cc7b64e0fc636fd18765070505cadfcf82f08ffeb41f4fcd0188817951116107a0830190815283356107c084019081526004356107e085015260243561080085015260a083207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908190066020808701918252902081900660408601819052845260443590925260643590526060909120819006608083018190529081800960a0830181905260808301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001910960e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8060e0840151096101008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f70363660e0840151096101208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f1d59376149b959ccbd157ac850893a6f07c2d99b3852513ab8d01be8e846a56660e0840151096101408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000060e0840151096101608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0530d09118705106cbb4a786ead16926d5d174e181a26686af5448492e42a18160e0840151096101808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb60e0840151096101a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f130b17119778465cfb3acaee30f81dee20710ead41671f568b11d9ab07b95a9b60e0840151096101c083015260e08201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019080096101e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f7036366101e0840151096102008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006101e0840151096102208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb6101e0840151096102408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a08301516101e0840151096102608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f23610260840151096102808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd610260840151096102a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f283ce45a2e5b8e4e78f9fbaf5f6a348bfcfaf76dd28e5ca7121b74ef68fdec2e610260840151096102c08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f236102c0840151096102e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd6102c0840151096103008301526102608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081818009098060c08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018182097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000909101066104a084018190526104c0840152506107808201526101e06101046107a083013761020061078082019081207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081900680845282526084356107a084015260a4356107c08401526060918290200691015250565b60e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018160080960e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105208601526101c08501516101008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105408601526101a08501516101208601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105608601526101808501516101408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961058086015261016085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105a08601526101408501516101808601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105c08601526101208501516101a08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105e08601526101008501516101c08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830960e0610520018601525050505050565b6101e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001816004096101e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106208601526102408501516102008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961064086015261022085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106608601526102008501516102408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096060610620018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c0870151097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030660c0850151087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610260850151600309096102608301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181810381900684087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106a08601526102a08501516102808601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106c08601526102808501516102a08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960406106a0018601527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c08801517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103067f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08a015109087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c0880151600309096102c086015190935091507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001828103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107008601526103008501516102e08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107208601526102e08501516103008601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960a06106a0018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806101e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806104e08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102608501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102e08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016103008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806105008401526127ff8361194e565b61280883611d96565b61281183611fac565b505060c081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000083018190066301000000096107608401525050610d7a8161005e565b6104a08101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181610760840151096107608301525050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185356107608601510983030106905080610320830152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820860e083015190915060009081807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600061052001890151880984098508935061010086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001890151880984098508935061012086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001890151880984098508935061014086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001890151880984098508935061016086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001890151880984098508935061018086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06105200189015188098409850893506101a086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c06105200189015188098409850893506101c086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e4350983089150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e0610520018801518709830984089250505080610340840152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068208905060006102043561022435610244357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183610104350993507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180836101243509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018486096101443509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161018435850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610320870151850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c087015185096101e08701519094506000908490827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600002610620018d01518c098509850893508692506102008a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600102610620018d01518c098509850893508692506102208a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600202610620018d01518c098509850893508692506102408a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001858509098408925050507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600302610620018b01518a09830983089150508061036088015250505050505050565b606081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309905060017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08901510908820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830860c08501519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190817f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b82090990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183089150506000915060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c085015160208601510960408501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828408610204350892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028709086102243508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160038709086102443508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161026435840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a43560208b01510908610204350894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c43560208c015109086102243508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101e43560208c015109086102443508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161028435860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151840992506001610264350394507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760870151860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c08701518609610260870151909550915060009050807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206000026106a0018a0151880983098308915061028087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206001026106a0018a015188098309830891506102a087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206002026106a0018a015188098309830891506102c087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206003026106a0018a015188098309830891506102e087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206004026106a0018a0151880983098308915061030087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206005026106a0018a015188098309830891505080610380870152505050505050565b6040518151815260208201516020820152825160408201526020830151606082015260408260808360066107d05a03fa905080610e08576000805260206000f35b6000604051833581526020840135602082015284604082015260408160608360076107d05a03fa91508161514e576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa9150508061517f576000805260206000f35b50505050565b600060405183815284602082015285604082015260408160608360076107d05a03fa9150816151b8576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa915050806151e9576000805260206000f35b5050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101608601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806104e0850151830984510991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180610500850151830984517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908009097f1e60b0dbec504049d180f2de88b98bf5d80a003eeac1799af0f8815466e4cd406103a08501527f0b87cc7b64e0fc636fd18765070505cadfcf82f08ffeb41f4fcd01888179511160206103a0018501526156408360046103a08701615116565b6156508160446103a08701615116565b6156dd7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161038088015185097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161036089015188090861034087015108600260016103e08801615185565b50610e088160846104208601615116565b604051610400820180517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd479081038190069091526104408301805182039190910690526000906157466103e084016103a085016150d5565b61575861042084016103a085016150d5565b61576c606084015160c46103a08601615116565b6103a083015181526103c08301516020808301919091527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a083015260c43560c08301527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760e43581030660e08301527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6101008301527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6101208301527f1970ea81dd6992adfbc571effb03503adbbb6a857f578403c6c40e22d65b3c026101408301527f054793348f12c0cf5622c340573cb277586319de359ab9389778f689786b1e48610160830152816101808160086107d05a03fa90511692915050565b6040516107808101604052615914610e0d565b61591e8382610ef7565b615927816123b7565b61593081612878565b61593a83826128b1565b61594381612911565b61594c81613e61565b61595581614559565b61595e816151f0565b615967816156ee565b90508060005260206000f35b60008061032080848603121561598857600080fd5b61030084018581111561599a57600080fd5b8493508582860111156159ac57600080fd5b8092505050925092905056fea264697066735822122045e16ea3ed8ec2e4243f7b81a1d770d00dc184ebea3ec6446f4ecdc5504fbd3264736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80639121da8a14610030575b600080fd5b61004361003e366004615973565b610057565b604051901515815260200160405180910390f35b6000615901565b6040516104c08201518082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610500840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610520840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610620840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760840151820990508082526102e4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309600114610514576000805260206000f35b8091506020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161076085015183099150806107608501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001850151830991508060a06106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001850151830991508060806106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001850151830991508060606106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001850151830991508060406106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001850151830991508060206106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a085015183099150806106a08501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106200185015183099150806060610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106200185015183099150806040610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106200185015183099150806020610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161062085015183099150806106208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001850151830991508060e0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001850151830991508060c0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001850151830991508060a0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806105200185015183099150806080610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606105200185015183099150806060610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406105200185015183099150806040610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206105200185015183099150806020610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161052085015183099150806105208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161050085015183099150806105008501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e085015183099150806104e085015250806104c0840152505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110610d7a576000805260206000f35b50565b803560208201357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760037f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478085860985090891507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478182099050808214610e08576000805260206000f35b505050565b610e176004610d7d565b610e216044610d7d565b610e2b6084610d7d565b610e3560c4610d7d565b610e4161010435610d49565b610e4d61012435610d49565b610e5961014435610d49565b610e6561016435610d49565b610e7161018435610d49565b610e7d6101a435610d49565b610e896101c435610d49565b610e956101e435610d49565b610ea161020435610d49565b610ead61022435610d49565b610eb961024435610d49565b610ec561026435610d49565b610ed161028435610d49565b610edd6102a435610d49565b610ee96102c435610d49565b610ef56102e435610d49565b565b7f1e60b0dbec504049d180f2de88b98bf5d80a003eeac1799af0f8815466e4cd4061078082019081527f0b87cc7b64e0fc636fd18765070505cadfcf82f08ffeb41f4fcd0188817951116107a0830190815283356107c084019081526004356107e085015260243561080085015260a083207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908190066020808701918252902081900660408601819052845260443590925260643590526060909120819006608083018190529081800960a0830181905260808301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001910960e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8060e0840151096101008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f70363660e0840151096101208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f1d59376149b959ccbd157ac850893a6f07c2d99b3852513ab8d01be8e846a56660e0840151096101408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000060e0840151096101608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0530d09118705106cbb4a786ead16926d5d174e181a26686af5448492e42a18160e0840151096101808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb60e0840151096101a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f130b17119778465cfb3acaee30f81dee20710ead41671f568b11d9ab07b95a9b60e0840151096101c083015260e08201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019080096101e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f7036366101e0840151096102008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006101e0840151096102208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb6101e0840151096102408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a08301516101e0840151096102608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f23610260840151096102808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd610260840151096102a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f283ce45a2e5b8e4e78f9fbaf5f6a348bfcfaf76dd28e5ca7121b74ef68fdec2e610260840151096102c08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f236102c0840151096102e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd6102c0840151096103008301526102608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081818009098060c08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018182097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000909101066104a084018190526104c0840152506107808201526101e06101046107a083013761020061078082019081207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081900680845282526084356107a084015260a4356107c08401526060918290200691015250565b60e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018160080960e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105208601526101c08501516101008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105408601526101a08501516101208601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105608601526101808501516101408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961058086015261016085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105a08601526101408501516101808601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105c08601526101208501516101a08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105e08601526101008501516101c08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830960e0610520018601525050505050565b6101e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001816004096101e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106208601526102408501516102008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961064086015261022085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106608601526102008501516102408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096060610620018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c0870151097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030660c0850151087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610260850151600309096102608301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181810381900684087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106a08601526102a08501516102808601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106c08601526102808501516102a08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960406106a0018601527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c08801517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103067f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08a015109087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c0880151600309096102c086015190935091507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001828103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107008601526103008501516102e08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107208601526102e08501516103008601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960a06106a0018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806101e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806104e08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102608501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102e08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016103008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806105008401526127ff8361194e565b61280883611d96565b61281183611fac565b505060c081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000083018190066301000000096107608401525050610d7a8161005e565b6104a08101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181610760840151096107608301525050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185356107608601510983030106905080610320830152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820860e083015190915060009081807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600061052001890151880984098508935061010086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001890151880984098508935061012086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001890151880984098508935061014086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001890151880984098508935061016086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001890151880984098508935061018086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06105200189015188098409850893506101a086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c06105200189015188098409850893506101c086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e4350983089150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e0610520018801518709830984089250505080610340840152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068208905060006102043561022435610244357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183610104350993507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180836101243509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018486096101443509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161018435850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610320870151850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c087015185096101e08701519094506000908490827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600002610620018d01518c098509850893508692506102008a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600102610620018d01518c098509850893508692506102208a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600202610620018d01518c098509850893508692506102408a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001858509098408925050507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600302610620018b01518a09830983089150508061036088015250505050505050565b606081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309905060017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08901510908820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830860c08501519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190817f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b82090990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183089150506000915060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c085015160208601510960408501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828408610204350892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028709086102243508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160038709086102443508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161026435840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a43560208b01510908610204350894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c43560208c015109086102243508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101e43560208c015109086102443508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161028435860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151840992506001610264350394507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760870151860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c08701518609610260870151909550915060009050807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206000026106a0018a0151880983098308915061028087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206001026106a0018a015188098309830891506102a087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206002026106a0018a015188098309830891506102c087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206003026106a0018a015188098309830891506102e087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206004026106a0018a0151880983098308915061030087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206005026106a0018a015188098309830891505080610380870152505050505050565b6040518151815260208201516020820152825160408201526020830151606082015260408260808360066107d05a03fa905080610e08576000805260206000f35b6000604051833581526020840135602082015284604082015260408160608360076107d05a03fa91508161514e576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa9150508061517f576000805260206000f35b50505050565b600060405183815284602082015285604082015260408160608360076107d05a03fa9150816151b8576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa915050806151e9576000805260206000f35b5050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101608601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806104e0850151830984510991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180610500850151830984517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908009097f1e60b0dbec504049d180f2de88b98bf5d80a003eeac1799af0f8815466e4cd406103a08501527f0b87cc7b64e0fc636fd18765070505cadfcf82f08ffeb41f4fcd01888179511160206103a0018501526156408360046103a08701615116565b6156508160446103a08701615116565b6156dd7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161038088015185097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161036089015188090861034087015108600260016103e08801615185565b50610e088160846104208601615116565b604051610400820180517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd479081038190069091526104408301805182039190910690526000906157466103e084016103a085016150d5565b61575861042084016103a085016150d5565b61576c606084015160c46103a08601615116565b6103a083015181526103c08301516020808301919091527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a083015260c43560c08301527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760e43581030660e08301527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6101008301527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6101208301527f1970ea81dd6992adfbc571effb03503adbbb6a857f578403c6c40e22d65b3c026101408301527f054793348f12c0cf5622c340573cb277586319de359ab9389778f689786b1e48610160830152816101808160086107d05a03fa90511692915050565b6040516107808101604052615914610e0d565b61591e8382610ef7565b615927816123b7565b61593081612878565b61593a83826128b1565b61594381612911565b61594c81613e61565b61595581614559565b61595e816151f0565b615967816156ee565b90508060005260206000f35b60008061032080848603121561598857600080fd5b61030084018581111561599a57600080fd5b8493508582860111156159ac57600080fd5b8092505050925092905056fea264697066735822122045e16ea3ed8ec2e4243f7b81a1d770d00dc184ebea3ec6446f4ecdc5504fbd3264736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonDataComittee.json b/compiled-contracts/paris/PolygonDataComittee.json index 957a8f12f..3bfb80a27 100644 --- a/compiled-contracts/paris/PolygonDataComittee.json +++ b/compiled-contracts/paris/PolygonDataComittee.json @@ -74,6 +74,16 @@ "name": "ForceBatchesAlreadyActive", "type": "error" }, + { + "inputs": [], + "name": "ForceBatchesDescentralized", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchesNotAllowedOnEmergencyState", + "type": "error" + }, { "inputs": [], "name": "ForceBatchesOverflow", @@ -99,6 +109,11 @@ "name": "HaltTimeoutNotExpired", "type": "error" }, + { + "inputs": [], + "name": "HaltTimeoutNotExpiredAfterEmergencyState", + "type": "error" + }, { "inputs": [], "name": "HugeTokenMetadataNotSupported", @@ -249,6 +264,11 @@ "name": "StoredRootMustBeDifferentThanNewRoot", "type": "error" }, + { + "inputs": [], + "name": "SwitchToSameValue", + "type": "error" + }, { "inputs": [], "name": "TransactionsLengthAboveMax", @@ -277,12 +297,6 @@ "name": "AcceptAdminRole", "type": "event" }, - { - "anonymous": false, - "inputs": [], - "name": "ActivateForceBatches", - "type": "event" - }, { "anonymous": false, "inputs": [ @@ -391,6 +405,19 @@ "name": "SetDataCommittee", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newForceBatchAddress", + "type": "address" + } + ], + "name": "SetForceBatchAddress", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -637,13 +664,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [], - "name": "activateForceBatches", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [], "name": "admin", @@ -714,6 +734,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "forceBatchAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "forceBatchTimeout", @@ -857,19 +890,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [], - "name": "isForcedBatchAllowed", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "isSequenceWithDataAvailabilityAllowed", @@ -1138,6 +1158,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "newForceBatchAddress", + "type": "address" + } + ], + "name": "setForceBatchAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -1178,7 +1211,13 @@ "type": "function" }, { - "inputs": [], + "inputs": [ + { + "internalType": "bool", + "name": "newIsSequenceWithDataAvailabilityAllowed", + "type": "bool" + } + ], "name": "switchSequenceWithDataAvailability", "outputs": [], "stateMutability": "nonpayable", @@ -1224,8 +1263,8 @@ "type": "function" } ], - "bytecode": "0x6101006040523480156200001257600080fd5b506040516200545238038062005452833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e05161527b620001d76000396000818161055101528181610a4f01528181610bbc01528181610f5d01528181611516015281816123ae01528181612477015281816124990152818161263001528181612bd001528181612c9e01528181612d8b0152818161370a0152818161378b015281816137ad01526138d70152600081816106f8015281816111b7015281816119af01528181611ab70152818161257101526138180152600081816107d70152818161136c0152818161211001528181612ed6015261342d01526000818161081c015281816108e701528181612401015281816125470152612eaa015261527b6000f3fe608060405234801561001057600080fd5b506004361061031f5760003560e01c80636ff512cc116101a7578063c754c7ed116100ee578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b1461085e578063f35dda4714610871578063f851a4401461087957600080fd5b8063d8d1091b14610804578063e46761c414610817578063e7a7ed021461083e57600080fd5b8063cfa8ed47116100c8578063cfa8ed47146107b2578063d02103ca146107d2578063d7bc90ff146107f957600080fd5b8063c754c7ed14610767578063c7fffd4b14610797578063c89e42df1461079f57600080fd5b8063a3c573eb11610150578063ada8f9191161012a578063ada8f91914610735578063b0afe15414610748578063b81fcafd1461075457600080fd5b8063a3c573eb146106f3578063a652f26c1461071a578063aa3587d31461072d57600080fd5b80638c3d7301116101815780638c3d7301146106bd57806398cf4bd0146106c55780639e001877146106d857600080fd5b80636ff512cc1461065b578063712570221461066e5780637a5460c51461068157600080fd5b8063456052671161026b57806356e2943511610214578063676870d2116101ee578063676870d21461062a5780636b8616ce146106325780636e05d2cd1461065257600080fd5b806356e29435146105ef5780635e9145c91461060f5780635ec919581461062257600080fd5b80634e487706116102455780634e4877061461059857806352bdeb6d146105ab578063542028d5146105e757600080fd5b8063456052671461052457806349b7b8021461054c5780634c21fef31461057357600080fd5b806326782247116102cd5780633c351e10116102a75780633c351e10146104695780633cbc795b1461048e57806340b5de6c146104cc57600080fd5b806326782247146103f25780632b35b3ac1461043757806332c2d1531461045457600080fd5b8063107bf28c116102fe578063107bf28c146103a357806311e892d4146103ab57806319d8ac61146103c557600080fd5b8062d0295d14610324578063035089631461033f57806305835f371461035a575b600080fd5b61032c61089f565b6040519081526020015b60405180910390f35b610347602081565b60405161ffff9091168152602001610336565b6103966040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161033691906142a6565b6103966109bf565b6103b360f981565b60405160ff9091168152602001610336565b6007546103d99067ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610336565b6001546104129073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610336565b6008546104449060ff1681565b6040519015158152602001610336565b610467610462366004614306565b610a4d565b005b60085461041290610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6008546104b7907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610336565b6104f37fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff000000000000000000000000000000000000000000000000000000000000009091168152602001610336565b6007546103d990700100000000000000000000000000000000900467ffffffffffffffff1681565b6104127f000000000000000000000000000000000000000000000000000000000000000081565b6009546104449074010000000000000000000000000000000000000000900460ff1681565b6104676105a6366004614348565b610b1c565b6103966040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610396610d36565b6009546104129073ffffffffffffffffffffffffffffffffffffffff1681565b61046761061d3660046143b1565b610d43565b610467610da7565b610347601f81565b61032c610640366004614348565b60066020526000908152604090205481565b61032c60055481565b6104676106693660046143fd565b610e91565b61046761067c36600461456f565b610f5b565b6103966040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610467611711565b6104676106d33660046143fd565b6117e4565b61041273a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6104127f000000000000000000000000000000000000000000000000000000000000000081565b61039661072836600461461c565b6118ae565b610467611c93565b6104676107433660046143fd565b611d60565b61032c6405ca1ab1e081565b6104676107623660046146d3565b611e2a565b6007546103d9907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6103b360e481565b6104676107ad366004614785565b612781565b6002546104129073ffffffffffffffffffffffffffffffffffffffff1681565b6104127f000000000000000000000000000000000000000000000000000000000000000081565b61032c635ca1ab1e81565b6104676108123660046147ba565b612814565b6104127f000000000000000000000000000000000000000000000000000000000000000081565b6007546103d99068010000000000000000900467ffffffffffffffff1681565b61046761086c3660046147fc565b612d4b565b6103b3601b81565b6000546104129062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561092e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109529190614848565b6007549091506000906109919067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416614890565b67ffffffffffffffff169050806000036109ae5760009250505090565b6109b881836148b8565b9250505090565b600480546109cc906148f3565b80601f01602080910402602001604051908101604052809291908181526020018280546109f8906148f3565b8015610a455780601f10610a1a57610100808354040283529160200191610a45565b820191906000526020600020905b815481529060010190602001808311610a2857829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610abc576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610b0f91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610b73576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610bba576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c499190614946565b610cb25760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610cb2576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546109cc906148f3565b60095474010000000000000000000000000000000000000000900460ff16610d97576040517f821935b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610da283838361313a565b505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610dfe576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615610e3b576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ee8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610d2b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610fca576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610fea5750600054600160ff909116105b806110045750303b158015611004575060005460ff166001145b611095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156110f357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff8516156113085761111a8561399e565b61112386613aae565b61112c87613bb5565b60405160200161113e93929190614968565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af11580156111ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122391906149a1565b915091508163ffffffff166000146112c057600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff851602179055611305565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b600854600090611355908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff16856118ae565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f99190614848565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611574573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159891906149db565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550886003908161162a9190614a46565b5060046116378982614a46565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e60405161169793929190614b60565b60405180910390a1505050505050801561170857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611762576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461183b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f76d12ecc41da43ceb240d60fdd4d9fc0baae9793060e7b592abde7ece5ee965190602001610d2b565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa6000876040516024016118e296959493929190614b9f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff7000000000000000000000000000000000000000000000000000000001790528351909150606090600003611a335760f9601f83516119779190614c02565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611a1d9796959493929190614c1d565b6040516020818303038152906040529050611b37565b815161ffff1015611a70576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611a7f602083614c02565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001611b249796959493929190614d00565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015611b98573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611c10576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051600090611c569084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614de3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611cea576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600980547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff8116740100000000000000000000000000000000000000009182900460ff16159091021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f4190600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611db7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610d2b565b60025473ffffffffffffffffffffffffffffffffffffffff163314611e7b576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836000819003611eb7576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611ef3576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156122e35760008b8b83818110611f3c57611f3c614e3f565b905060800201803603810190611f529190614e6e565b805160608201519192509067ffffffffffffffff16156120cd5785611f7681614ec3565b96505060008183602001518460600151604051602001611fce93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114612057576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff1610156120ad576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86166000908152600660205260408120556121cb565b602082015115801590612194575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af115801561216e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121929190614848565b155b156121cb576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806121fe575042826040015167ffffffffffffffff16115b15612235576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519650505080806122db90614eea565b915050611f20565b5060075467ffffffffffffffff680100000000000000009091048116908416111561233a576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146124715760006123918386614890565b90506123a767ffffffffffffffff821683614f22565b91506124287f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166123e061089f565b6123ea9190614f35565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613ca8565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b61256f337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125269190614848565b6125309190614f35565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613d7c565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156125d757600080fd5b505af11580156125eb573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af115801561268f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b391906149db565b6009546040517fc7a823e000000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff169063c7a823e09061270e9087908d908d90600401614f95565b60006040518083038186803b15801561272657600080fd5b505afa15801561273a573d6000803e3d6000fd5b505060405167ffffffffffffffff841692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a2505050505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146127d8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036127e48282614a46565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610d2b91906142a6565b60085460ff16612850576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081900361288c576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156128c8576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612903918491700100000000000000000000000000000000900416614fb8565b111561293b576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015612bca57600086868381811061298057612980614e3f565b90506020028101906129929190614fcb565b61299b90615009565b9050836129a781614ec3565b82518051602091820120818501516040808701519051949950919450600093612a099386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612a92576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055612ab7600188614f22565b8403612b265742600760189054906101000a900467ffffffffffffffff168460400151612ae49190615087565b67ffffffffffffffff161115612b26576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080612bc290614eea565b915050612964565b50612bf87f0000000000000000000000000000000000000000000000000000000000000000846123e061089f565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612ce7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d0b91906149db565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612d87576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612df4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e189190614848565b905081811115612e54576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612e90576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ed273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613d7c565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f639190614848565b600780549192506801000000000000000090910467ffffffffffffffff16906008612f8d83614ec3565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612fc49291906150a8565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff16600090815260069093529120553233036130d4576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613133565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9318233888860405161312a94939291906150b8565b60405180910390a25b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461318b576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160008190036131c7576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115613203576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b8581101561363f57600089898381811061324c5761324c614e3f565b905060200281019061325e91906150f8565b6132679061512c565b8051805160209091012060608201519192509067ffffffffffffffff16156133ea578561329381614ec3565b965050600081836020015184606001516040516020016132eb93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114613374576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff1610156133ca576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055613527565b6020820151158015906134b1575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af115801561348b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134af9190614848565b155b156134e8576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015613527576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff16108061355a575042826040015167ffffffffffffffff16115b15613591576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061363790614eea565b915050613230565b5060075467ffffffffffffffff6801000000000000000090910481169084161115613696576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146137855760006136ed8386614890565b905061370367ffffffffffffffff821683614f22565b915061373c7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166123e061089f565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b613816337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612502573d6000803e3d6000fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561387e57600080fd5b505af1158015613892573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af1158015613936573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061395a91906149db565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691613a2091906151a2565b600060405180830381855afa9150503d8060008114613a5b576040519150601f19603f3d011682016040523d82523d6000602084013e613a60565b606091505b509150915081613aa5576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250611c8b565b611c8b81613de0565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691613b3091906151a2565b600060405180830381855afa9150503d8060008114613b6b576040519150601f19603f3d011682016040523d82523d6000602084013e613b70565b606091505b509150915081613aa5576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250611c8b565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff861691613c3691906151a2565b600060405180830381855afa9150503d8060008114613c71576040519150601f19603f3d011682016040523d82523d6000602084013e613c76565b606091505b5091509150818015613c89575080516020145b613c94576012611c8b565b80806020019051810190611c8b91906151b4565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610da29084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613fbb565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052613dda9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613cfa565b50505050565b60606040825110613e055781806020019051810190613dff91906151d7565b92915050565b8151602003613f7d5760005b602081108015613e585750828181518110613e2e57613e2e614e3f565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613e6f5780613e6781614eea565b915050613e11565b80600003613eb257505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115613ecd57613ecd61442c565b6040519080825280601f01601f191660200182016040528015613ef7576020820181803683370190505b50905060005b82811015613f7557848181518110613f1757613f17614e3f565b602001015160f81c60f81b828281518110613f3457613f34614e3f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080613f6d81614eea565b915050613efd565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b600061401d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166140c79092919063ffffffff16565b805190915015610da2578080602001905181019061403b9190614946565b610da2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161108c565b6060611c8b8484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516140fb91906151a2565b60006040518083038185875af1925050503d8060008114614138576040519150601f19603f3d011682016040523d82523d6000602084013e61413d565b606091505b509150915061414e87838387614159565b979650505050505050565b606083156141ef5782516000036141e85773ffffffffffffffffffffffffffffffffffffffff85163b6141e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161108c565b5081611c8b565b611c8b83838151156142045781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108c91906142a6565b60005b8381101561425357818101518382015260200161423b565b50506000910152565b60008151808452614274816020860160208601614238565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006142b9602083018461425c565b9392505050565b67ffffffffffffffff811681146142d657600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff811681146142d657600080fd5b8035613fb6816142d9565b60008060006060848603121561431b57600080fd5b8335614326816142c0565b925060208401359150604084013561433d816142d9565b809150509250925092565b60006020828403121561435a57600080fd5b81356142b9816142c0565b60008083601f84011261437757600080fd5b50813567ffffffffffffffff81111561438f57600080fd5b6020830191508360208260051b85010111156143aa57600080fd5b9250929050565b6000806000604084860312156143c657600080fd5b833567ffffffffffffffff8111156143dd57600080fd5b6143e986828701614365565b909450925050602084013561433d816142d9565b60006020828403121561440f57600080fd5b81356142b9816142d9565b63ffffffff811681146142d657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516080810167ffffffffffffffff8111828210171561447e5761447e61442c565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156144cb576144cb61442c565b604052919050565b600067ffffffffffffffff8211156144ed576144ed61442c565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261452a57600080fd5b813561453d614538826144d3565b614484565b81815284602083860101111561455257600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561458857600080fd5b8635614593816142d9565b955060208701356145a3816142d9565b945060408701356145b38161441a565b935060608701356145c3816142d9565b9250608087013567ffffffffffffffff808211156145e057600080fd5b6145ec8a838b01614519565b935060a089013591508082111561460257600080fd5b5061460f89828a01614519565b9150509295509295509295565b6000806000806080858703121561463257600080fd5b843561463d8161441a565b9350602085013561464d816142d9565b9250604085013561465d8161441a565b9150606085013567ffffffffffffffff81111561467957600080fd5b61468587828801614519565b91505092959194509250565b60008083601f8401126146a357600080fd5b50813567ffffffffffffffff8111156146bb57600080fd5b6020830191508360208285010111156143aa57600080fd5b6000806000806000606086880312156146eb57600080fd5b853567ffffffffffffffff8082111561470357600080fd5b818801915088601f83011261471757600080fd5b81358181111561472657600080fd5b8960208260071b850101111561473b57600080fd5b60208301975080965050614751602089016142fb565b9450604088013591508082111561476757600080fd5b5061477488828901614691565b969995985093965092949392505050565b60006020828403121561479757600080fd5b813567ffffffffffffffff8111156147ae57600080fd5b611c8b84828501614519565b600080602083850312156147cd57600080fd5b823567ffffffffffffffff8111156147e457600080fd5b6147f085828601614365565b90969095509350505050565b60008060006040848603121561481157600080fd5b833567ffffffffffffffff81111561482857600080fd5b61483486828701614691565b909790965060209590950135949350505050565b60006020828403121561485a57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8281168282160390808211156148b1576148b1614861565b5092915050565b6000826148ee577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061490757607f821691505b602082108103614940577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561495857600080fd5b815180151581146142b957600080fd5b60608152600061497b606083018661425c565b828103602084015261498d818661425c565b91505060ff83166040830152949350505050565b600080604083850312156149b457600080fd5b82516149bf8161441a565b60208401519092506149d0816142d9565b809150509250929050565b6000602082840312156149ed57600080fd5b81516142b9816142c0565b601f821115610da257600081815260208120601f850160051c81016020861015614a1f5750805b601f850160051c820191505b81811015614a3e57828155600101614a2b565b505050505050565b815167ffffffffffffffff811115614a6057614a6061442c565b614a7481614a6e84546148f3565b846149f8565b602080601f831160018114614ac75760008415614a915750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555614a3e565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015614b1457888601518255948401946001909101908401614af5565b5085821015614b5057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081526000614b73606083018661425c565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152614bf660c083018461425c565b98975050505050505050565b61ffff8181168382160190808211156148b1576148b1614861565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614c86816003860160208c01614238565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614cc9816017840160208b01614238565b808201915050818660f81b16601782015284519150614cef826018830160208801614238565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614d69816003860160208c01614238565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614dac816017840160208b01614238565b808201915050818660f01b16601782015284519150614dd2826019830160208801614238565b016019019998505050505050505050565b60008651614df5818460208b01614238565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060808284031215614e8057600080fd5b614e8861445b565b82358152602083013560208201526040830135614ea4816142c0565b60408201526060830135614eb7816142c0565b60608201529392505050565b600067ffffffffffffffff808316818103614ee057614ee0614861565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614f1b57614f1b614861565b5060010190565b81810381811115613dff57613dff614861565b8082028115828204841417613dff57613dff614861565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201526000614faf604083018486614f4c565b95945050505050565b80820180821115613dff57613dff614861565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112614fff57600080fd5b9190910192915050565b60006060823603121561501b57600080fd5b6040516060810167ffffffffffffffff828210818311171561503f5761503f61442c565b81604052843591508082111561505457600080fd5b5061506136828601614519565b82525060208301356020820152604083013561507c816142c0565b604082015292915050565b67ffffffffffffffff8181168382160190808211156148b1576148b1614861565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff841660208201526060604082015260006150ee606083018486614f4c565b9695505050505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112614fff57600080fd5b60006080823603121561513e57600080fd5b61514661445b565b823567ffffffffffffffff81111561515d57600080fd5b61516936828601614519565b825250602083013560208201526040830135615184816142c0565b60408201526060830135615197816142c0565b606082015292915050565b60008251614fff818460208701614238565b6000602082840312156151c657600080fd5b815160ff811681146142b957600080fd5b6000602082840312156151e957600080fd5b815167ffffffffffffffff81111561520057600080fd5b8201601f8101841361521157600080fd5b805161521f614538826144d3565b81815285602083850101111561523457600080fd5b614faf82602083016020860161423856fea264697066735822122069d10cd5028ca2695f6a141ce83a303d6713533f9ace319dca7d5b73d3fa334264736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061031f5760003560e01c80636ff512cc116101a7578063c754c7ed116100ee578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b1461085e578063f35dda4714610871578063f851a4401461087957600080fd5b8063d8d1091b14610804578063e46761c414610817578063e7a7ed021461083e57600080fd5b8063cfa8ed47116100c8578063cfa8ed47146107b2578063d02103ca146107d2578063d7bc90ff146107f957600080fd5b8063c754c7ed14610767578063c7fffd4b14610797578063c89e42df1461079f57600080fd5b8063a3c573eb11610150578063ada8f9191161012a578063ada8f91914610735578063b0afe15414610748578063b81fcafd1461075457600080fd5b8063a3c573eb146106f3578063a652f26c1461071a578063aa3587d31461072d57600080fd5b80638c3d7301116101815780638c3d7301146106bd57806398cf4bd0146106c55780639e001877146106d857600080fd5b80636ff512cc1461065b578063712570221461066e5780637a5460c51461068157600080fd5b8063456052671161026b57806356e2943511610214578063676870d2116101ee578063676870d21461062a5780636b8616ce146106325780636e05d2cd1461065257600080fd5b806356e29435146105ef5780635e9145c91461060f5780635ec919581461062257600080fd5b80634e487706116102455780634e4877061461059857806352bdeb6d146105ab578063542028d5146105e757600080fd5b8063456052671461052457806349b7b8021461054c5780634c21fef31461057357600080fd5b806326782247116102cd5780633c351e10116102a75780633c351e10146104695780633cbc795b1461048e57806340b5de6c146104cc57600080fd5b806326782247146103f25780632b35b3ac1461043757806332c2d1531461045457600080fd5b8063107bf28c116102fe578063107bf28c146103a357806311e892d4146103ab57806319d8ac61146103c557600080fd5b8062d0295d14610324578063035089631461033f57806305835f371461035a575b600080fd5b61032c61089f565b6040519081526020015b60405180910390f35b610347602081565b60405161ffff9091168152602001610336565b6103966040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161033691906142a6565b6103966109bf565b6103b360f981565b60405160ff9091168152602001610336565b6007546103d99067ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610336565b6001546104129073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610336565b6008546104449060ff1681565b6040519015158152602001610336565b610467610462366004614306565b610a4d565b005b60085461041290610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6008546104b7907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610336565b6104f37fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff000000000000000000000000000000000000000000000000000000000000009091168152602001610336565b6007546103d990700100000000000000000000000000000000900467ffffffffffffffff1681565b6104127f000000000000000000000000000000000000000000000000000000000000000081565b6009546104449074010000000000000000000000000000000000000000900460ff1681565b6104676105a6366004614348565b610b1c565b6103966040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610396610d36565b6009546104129073ffffffffffffffffffffffffffffffffffffffff1681565b61046761061d3660046143b1565b610d43565b610467610da7565b610347601f81565b61032c610640366004614348565b60066020526000908152604090205481565b61032c60055481565b6104676106693660046143fd565b610e91565b61046761067c36600461456f565b610f5b565b6103966040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610467611711565b6104676106d33660046143fd565b6117e4565b61041273a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6104127f000000000000000000000000000000000000000000000000000000000000000081565b61039661072836600461461c565b6118ae565b610467611c93565b6104676107433660046143fd565b611d60565b61032c6405ca1ab1e081565b6104676107623660046146d3565b611e2a565b6007546103d9907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6103b360e481565b6104676107ad366004614785565b612781565b6002546104129073ffffffffffffffffffffffffffffffffffffffff1681565b6104127f000000000000000000000000000000000000000000000000000000000000000081565b61032c635ca1ab1e81565b6104676108123660046147ba565b612814565b6104127f000000000000000000000000000000000000000000000000000000000000000081565b6007546103d99068010000000000000000900467ffffffffffffffff1681565b61046761086c3660046147fc565b612d4b565b6103b3601b81565b6000546104129062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561092e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109529190614848565b6007549091506000906109919067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416614890565b67ffffffffffffffff169050806000036109ae5760009250505090565b6109b881836148b8565b9250505090565b600480546109cc906148f3565b80601f01602080910402602001604051908101604052809291908181526020018280546109f8906148f3565b8015610a455780601f10610a1a57610100808354040283529160200191610a45565b820191906000526020600020905b815481529060010190602001808311610a2857829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610abc576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610b0f91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610b73576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610bba576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c499190614946565b610cb25760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610cb2576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546109cc906148f3565b60095474010000000000000000000000000000000000000000900460ff16610d97576040517f821935b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610da283838361313a565b505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610dfe576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615610e3b576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ee8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610d2b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610fca576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610fea5750600054600160ff909116105b806110045750303b158015611004575060005460ff166001145b611095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156110f357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff8516156113085761111a8561399e565b61112386613aae565b61112c87613bb5565b60405160200161113e93929190614968565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af11580156111ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122391906149a1565b915091508163ffffffff166000146112c057600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff851602179055611305565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b600854600090611355908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff16856118ae565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f99190614848565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611574573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159891906149db565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550886003908161162a9190614a46565b5060046116378982614a46565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e60405161169793929190614b60565b60405180910390a1505050505050801561170857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611762576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461183b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f76d12ecc41da43ceb240d60fdd4d9fc0baae9793060e7b592abde7ece5ee965190602001610d2b565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa6000876040516024016118e296959493929190614b9f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff7000000000000000000000000000000000000000000000000000000001790528351909150606090600003611a335760f9601f83516119779190614c02565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611a1d9796959493929190614c1d565b6040516020818303038152906040529050611b37565b815161ffff1015611a70576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611a7f602083614c02565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001611b249796959493929190614d00565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015611b98573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611c10576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051600090611c569084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614de3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611cea576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600980547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff8116740100000000000000000000000000000000000000009182900460ff16159091021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f4190600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611db7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610d2b565b60025473ffffffffffffffffffffffffffffffffffffffff163314611e7b576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836000819003611eb7576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611ef3576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156122e35760008b8b83818110611f3c57611f3c614e3f565b905060800201803603810190611f529190614e6e565b805160608201519192509067ffffffffffffffff16156120cd5785611f7681614ec3565b96505060008183602001518460600151604051602001611fce93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114612057576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff1610156120ad576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86166000908152600660205260408120556121cb565b602082015115801590612194575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af115801561216e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121929190614848565b155b156121cb576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806121fe575042826040015167ffffffffffffffff16115b15612235576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519650505080806122db90614eea565b915050611f20565b5060075467ffffffffffffffff680100000000000000009091048116908416111561233a576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146124715760006123918386614890565b90506123a767ffffffffffffffff821683614f22565b91506124287f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166123e061089f565b6123ea9190614f35565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613ca8565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b61256f337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125269190614848565b6125309190614f35565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613d7c565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156125d757600080fd5b505af11580156125eb573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af115801561268f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b391906149db565b6009546040517fc7a823e000000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff169063c7a823e09061270e9087908d908d90600401614f95565b60006040518083038186803b15801561272657600080fd5b505afa15801561273a573d6000803e3d6000fd5b505060405167ffffffffffffffff841692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a2505050505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146127d8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036127e48282614a46565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610d2b91906142a6565b60085460ff16612850576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081900361288c576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156128c8576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612903918491700100000000000000000000000000000000900416614fb8565b111561293b576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015612bca57600086868381811061298057612980614e3f565b90506020028101906129929190614fcb565b61299b90615009565b9050836129a781614ec3565b82518051602091820120818501516040808701519051949950919450600093612a099386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612a92576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055612ab7600188614f22565b8403612b265742600760189054906101000a900467ffffffffffffffff168460400151612ae49190615087565b67ffffffffffffffff161115612b26576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080612bc290614eea565b915050612964565b50612bf87f0000000000000000000000000000000000000000000000000000000000000000846123e061089f565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612ce7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d0b91906149db565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612d87576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612df4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e189190614848565b905081811115612e54576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612e90576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ed273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613d7c565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f639190614848565b600780549192506801000000000000000090910467ffffffffffffffff16906008612f8d83614ec3565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612fc49291906150a8565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff16600090815260069093529120553233036130d4576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613133565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9318233888860405161312a94939291906150b8565b60405180910390a25b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461318b576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160008190036131c7576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115613203576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b8581101561363f57600089898381811061324c5761324c614e3f565b905060200281019061325e91906150f8565b6132679061512c565b8051805160209091012060608201519192509067ffffffffffffffff16156133ea578561329381614ec3565b965050600081836020015184606001516040516020016132eb93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114613374576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff1610156133ca576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055613527565b6020820151158015906134b1575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af115801561348b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134af9190614848565b155b156134e8576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015613527576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff16108061355a575042826040015167ffffffffffffffff16115b15613591576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061363790614eea565b915050613230565b5060075467ffffffffffffffff6801000000000000000090910481169084161115613696576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146137855760006136ed8386614890565b905061370367ffffffffffffffff821683614f22565b915061373c7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166123e061089f565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b613816337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612502573d6000803e3d6000fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561387e57600080fd5b505af1158015613892573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af1158015613936573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061395a91906149db565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691613a2091906151a2565b600060405180830381855afa9150503d8060008114613a5b576040519150601f19603f3d011682016040523d82523d6000602084013e613a60565b606091505b509150915081613aa5576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250611c8b565b611c8b81613de0565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691613b3091906151a2565b600060405180830381855afa9150503d8060008114613b6b576040519150601f19603f3d011682016040523d82523d6000602084013e613b70565b606091505b509150915081613aa5576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250611c8b565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff861691613c3691906151a2565b600060405180830381855afa9150503d8060008114613c71576040519150601f19603f3d011682016040523d82523d6000602084013e613c76565b606091505b5091509150818015613c89575080516020145b613c94576012611c8b565b80806020019051810190611c8b91906151b4565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610da29084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613fbb565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052613dda9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613cfa565b50505050565b60606040825110613e055781806020019051810190613dff91906151d7565b92915050565b8151602003613f7d5760005b602081108015613e585750828181518110613e2e57613e2e614e3f565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613e6f5780613e6781614eea565b915050613e11565b80600003613eb257505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115613ecd57613ecd61442c565b6040519080825280601f01601f191660200182016040528015613ef7576020820181803683370190505b50905060005b82811015613f7557848181518110613f1757613f17614e3f565b602001015160f81c60f81b828281518110613f3457613f34614e3f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080613f6d81614eea565b915050613efd565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b600061401d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166140c79092919063ffffffff16565b805190915015610da2578080602001905181019061403b9190614946565b610da2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161108c565b6060611c8b8484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516140fb91906151a2565b60006040518083038185875af1925050503d8060008114614138576040519150601f19603f3d011682016040523d82523d6000602084013e61413d565b606091505b509150915061414e87838387614159565b979650505050505050565b606083156141ef5782516000036141e85773ffffffffffffffffffffffffffffffffffffffff85163b6141e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161108c565b5081611c8b565b611c8b83838151156142045781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108c91906142a6565b60005b8381101561425357818101518382015260200161423b565b50506000910152565b60008151808452614274816020860160208601614238565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006142b9602083018461425c565b9392505050565b67ffffffffffffffff811681146142d657600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff811681146142d657600080fd5b8035613fb6816142d9565b60008060006060848603121561431b57600080fd5b8335614326816142c0565b925060208401359150604084013561433d816142d9565b809150509250925092565b60006020828403121561435a57600080fd5b81356142b9816142c0565b60008083601f84011261437757600080fd5b50813567ffffffffffffffff81111561438f57600080fd5b6020830191508360208260051b85010111156143aa57600080fd5b9250929050565b6000806000604084860312156143c657600080fd5b833567ffffffffffffffff8111156143dd57600080fd5b6143e986828701614365565b909450925050602084013561433d816142d9565b60006020828403121561440f57600080fd5b81356142b9816142d9565b63ffffffff811681146142d657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516080810167ffffffffffffffff8111828210171561447e5761447e61442c565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156144cb576144cb61442c565b604052919050565b600067ffffffffffffffff8211156144ed576144ed61442c565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261452a57600080fd5b813561453d614538826144d3565b614484565b81815284602083860101111561455257600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561458857600080fd5b8635614593816142d9565b955060208701356145a3816142d9565b945060408701356145b38161441a565b935060608701356145c3816142d9565b9250608087013567ffffffffffffffff808211156145e057600080fd5b6145ec8a838b01614519565b935060a089013591508082111561460257600080fd5b5061460f89828a01614519565b9150509295509295509295565b6000806000806080858703121561463257600080fd5b843561463d8161441a565b9350602085013561464d816142d9565b9250604085013561465d8161441a565b9150606085013567ffffffffffffffff81111561467957600080fd5b61468587828801614519565b91505092959194509250565b60008083601f8401126146a357600080fd5b50813567ffffffffffffffff8111156146bb57600080fd5b6020830191508360208285010111156143aa57600080fd5b6000806000806000606086880312156146eb57600080fd5b853567ffffffffffffffff8082111561470357600080fd5b818801915088601f83011261471757600080fd5b81358181111561472657600080fd5b8960208260071b850101111561473b57600080fd5b60208301975080965050614751602089016142fb565b9450604088013591508082111561476757600080fd5b5061477488828901614691565b969995985093965092949392505050565b60006020828403121561479757600080fd5b813567ffffffffffffffff8111156147ae57600080fd5b611c8b84828501614519565b600080602083850312156147cd57600080fd5b823567ffffffffffffffff8111156147e457600080fd5b6147f085828601614365565b90969095509350505050565b60008060006040848603121561481157600080fd5b833567ffffffffffffffff81111561482857600080fd5b61483486828701614691565b909790965060209590950135949350505050565b60006020828403121561485a57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8281168282160390808211156148b1576148b1614861565b5092915050565b6000826148ee577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061490757607f821691505b602082108103614940577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561495857600080fd5b815180151581146142b957600080fd5b60608152600061497b606083018661425c565b828103602084015261498d818661425c565b91505060ff83166040830152949350505050565b600080604083850312156149b457600080fd5b82516149bf8161441a565b60208401519092506149d0816142d9565b809150509250929050565b6000602082840312156149ed57600080fd5b81516142b9816142c0565b601f821115610da257600081815260208120601f850160051c81016020861015614a1f5750805b601f850160051c820191505b81811015614a3e57828155600101614a2b565b505050505050565b815167ffffffffffffffff811115614a6057614a6061442c565b614a7481614a6e84546148f3565b846149f8565b602080601f831160018114614ac75760008415614a915750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555614a3e565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015614b1457888601518255948401946001909101908401614af5565b5085821015614b5057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081526000614b73606083018661425c565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152614bf660c083018461425c565b98975050505050505050565b61ffff8181168382160190808211156148b1576148b1614861565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614c86816003860160208c01614238565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614cc9816017840160208b01614238565b808201915050818660f81b16601782015284519150614cef826018830160208801614238565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614d69816003860160208c01614238565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614dac816017840160208b01614238565b808201915050818660f01b16601782015284519150614dd2826019830160208801614238565b016019019998505050505050505050565b60008651614df5818460208b01614238565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060808284031215614e8057600080fd5b614e8861445b565b82358152602083013560208201526040830135614ea4816142c0565b60408201526060830135614eb7816142c0565b60608201529392505050565b600067ffffffffffffffff808316818103614ee057614ee0614861565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614f1b57614f1b614861565b5060010190565b81810381811115613dff57613dff614861565b8082028115828204841417613dff57613dff614861565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201526000614faf604083018486614f4c565b95945050505050565b80820180821115613dff57613dff614861565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112614fff57600080fd5b9190910192915050565b60006060823603121561501b57600080fd5b6040516060810167ffffffffffffffff828210818311171561503f5761503f61442c565b81604052843591508082111561505457600080fd5b5061506136828601614519565b82525060208301356020820152604083013561507c816142c0565b604082015292915050565b67ffffffffffffffff8181168382160190808211156148b1576148b1614861565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff841660208201526060604082015260006150ee606083018486614f4c565b9695505050505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112614fff57600080fd5b60006080823603121561513e57600080fd5b61514661445b565b823567ffffffffffffffff81111561515d57600080fd5b61516936828601614519565b825250602083013560208201526040830135615184816142c0565b60408201526060830135615197816142c0565b606082015292915050565b60008251614fff818460208701614238565b6000602082840312156151c657600080fd5b815160ff811681146142b957600080fd5b6000602082840312156151e957600080fd5b815167ffffffffffffffff81111561520057600080fd5b8201601f8101841361521157600080fd5b805161521f614538826144d3565b81815285602083850101111561523457600080fd5b614faf82602083016020860161423856fea264697066735822122069d10cd5028ca2695f6a141ce83a303d6713533f9ace319dca7d5b73d3fa334264736f6c63430008140033", + "bytecode": "0x6101006040523480156200001257600080fd5b506040516200574a3803806200574a833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e051615565620001e56000396000818161056101528181610b8401528181610cf101528181610fa801528181611533015281816124580152818161252101528181612543015281816126da0152818161293b01528181612d9401528181612e6201528181612f870152818161304f015281816139ce01528181613a4f01528181613a710152613b9b0152600081816107230152818161120201528181611b2601528181611c2e0152818161261b0152613adc0152600081816107fa01528181611389015281816121ba0152818161319a01526136f101526000818161083f0152818161090a015281816124ab015281816125f1015261316e01526155656000f3fe608060405234801561001057600080fd5b506004361061031f5760003560e01c80636ff512cc116101a7578063c754c7ed116100ee578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b14610881578063f35dda4714610894578063f851a4401461089c57600080fd5b8063d8d1091b14610827578063e46761c41461083a578063e7a7ed021461086157600080fd5b8063cfa8ed47116100c8578063cfa8ed47146107d5578063d02103ca146107f5578063d7bc90ff1461081c57600080fd5b8063c754c7ed1461078a578063c7fffd4b146107ba578063c89e42df146107c257600080fd5b80639e00187711610150578063ada8f9191161012a578063ada8f91914610758578063b0afe1541461076b578063b81fcafd1461077757600080fd5b80639e00187714610703578063a3c573eb1461071e578063a652f26c1461074557600080fd5b80638c3d7301116101815780638c3d7301146106d557806391cafe32146106dd57806398cf4bd0146106f057600080fd5b80636ff512cc1461067357806371257022146106865780637a5460c51461069957600080fd5b806340b5de6c1161026b578063542028d511610214578063676870d2116101ee578063676870d2146106425780636b8616ce1461064a5780636e05d2cd1461066a57600080fd5b8063542028d51461060757806356e294351461060f5780635e9145c91461062f57600080fd5b80634c21fef3116102455780634c21fef3146105835780634e487706146105b857806352bdeb6d146105cb57600080fd5b806340b5de6c146104dc578063456052671461053457806349b7b8021461055c57600080fd5b806326782247116102cd57806332c2d153116102a757806332c2d1531461046c5780633c351e101461047f5780633cbc795b1461049f57600080fd5b806326782247146103f25780632acdc2b6146104375780632c111c061461044c57600080fd5b8063107bf28c116102fe578063107bf28c146103a357806311e892d4146103ab57806319d8ac61146103c557600080fd5b8062d0295d14610324578063035089631461033f57806305835f371461035a575b600080fd5b61032c6108c2565b6040519081526020015b60405180910390f35b610347602081565b60405161ffff9091168152602001610336565b6103966040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b604051610336919061456a565b6103966109e2565b6103b360f981565b60405160ff9091168152602001610336565b6007546103d99067ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610336565b6001546104129073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610336565b61044a610445366004614595565b610a70565b005b6008546104129073ffffffffffffffffffffffffffffffffffffffff1681565b61044a61047a3660046145f5565b610b82565b6009546104129073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104c79074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610336565b6105037fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff000000000000000000000000000000000000000000000000000000000000009091168152602001610336565b6007546103d990700100000000000000000000000000000000900467ffffffffffffffff1681565b6104127f000000000000000000000000000000000000000000000000000000000000000081565b600a546105a89074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001610336565b61044a6105c6366004614637565b610c51565b6103966040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610396610e6b565b600a546104129073ffffffffffffffffffffffffffffffffffffffff1681565b61044a61063d3660046146a0565b610e78565b610347601f81565b61032c610658366004614637565b60066020526000908152604090205481565b61032c60055481565b61044a6106813660046146ec565b610edc565b61044a61069436600461485e565b610fa6565b6103966040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61044a61176f565b61044a6106eb3660046146ec565b611842565b61044a6106fe3660046146ec565b61195b565b61041273a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6104127f000000000000000000000000000000000000000000000000000000000000000081565b61039661075336600461490b565b611a25565b61044a6107663660046146ec565b611e0a565b61032c6405ca1ab1e081565b61044a6107853660046149c2565b611ed4565b6007546103d9907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6103b360e481565b61044a6107d0366004614a74565b61282b565b6002546104129073ffffffffffffffffffffffffffffffffffffffff1681565b6104127f000000000000000000000000000000000000000000000000000000000000000081565b61032c635ca1ab1e81565b61044a610835366004614aa9565b6128be565b6104127f000000000000000000000000000000000000000000000000000000000000000081565b6007546103d99068010000000000000000900467ffffffffffffffff1681565b61044a61088f366004614aeb565b612f0f565b6103b3601b81565b6000546104129062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610951573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109759190614b37565b6007549091506000906109b49067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416614b7f565b67ffffffffffffffff169050806000036109d15760009250505090565b6109db8183614ba7565b9250505090565b600480546109ef90614be2565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1b90614be2565b8015610a685780601f10610a3d57610100808354040283529160200191610a68565b820191906000526020600020905b815481529060010190602001808311610a4b57829003601f168201915b505050505081565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ac7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b801515600a60149054906101000a900460ff16151503610b13576040517f5f0e7abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000831515021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f4190600090a150565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610bf1576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610c4491815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ca8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610cef576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7e9190614c35565b610de75760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610de7576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546109ef90614be2565b600a5474010000000000000000000000000000000000000000900460ff16610ecc576040517f821935b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ed78383836133fe565b505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610f33576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610e60565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611015576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156110355750600054600160ff909116105b8061104f5750303b15801561104f575060005460ff166001145b6110e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561113e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff85161561132a5761116585613c62565b61116e86613d72565b61117787613e79565b60405160200161118993929190614c52565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af115801561124a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126e9190614c8b565b915091508163ffffffff166000146112e6576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055611327565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b60095460009061137290889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685611a25565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114169190614b37565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611591573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b59190614cc5565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600390816116479190614d30565b5060046116548982614d30565b508c600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e6040516116f593929190614e4a565b60405180910390a1505050505050801561176657600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146117c0576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611899576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff166118e8576040517fd40d91c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610e60565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146119b2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f76d12ecc41da43ceb240d60fdd4d9fc0baae9793060e7b592abde7ece5ee965190602001610e60565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa600087604051602401611a5996959493929190614e89565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff7000000000000000000000000000000000000000000000000000000001790528351909150606090600003611baa5760f9601f8351611aee9190614eec565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611b949796959493929190614f07565b6040516020818303038152906040529050611cae565b815161ffff1015611be7576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611bf6602083614eec565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001611c9b9796959493929190614fea565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015611d0f573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611d87576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051600090611dcd9084906405ca1ab1e090635ca1ab1e90601b907fff00000000000000000000000000000000000000000000000000000000000000906020016150cd565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611e61576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610e60565b60025473ffffffffffffffffffffffffffffffffffffffff163314611f25576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836000819003611f61576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611f9d576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b8581101561238d5760008b8b83818110611fe657611fe6615129565b905060800201803603810190611ffc9190615158565b805160608201519192509067ffffffffffffffff16156121775785612020816151ad565b9650506000818360200151846060015160405160200161207893929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114612101576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015612157576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055612275565b60208201511580159061223e575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015612218573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223c9190614b37565b155b15612275576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806122a8575042826040015167ffffffffffffffff16115b156122df576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151965050508080612385906151d4565b915050611fca565b5060075467ffffffffffffffff68010000000000000000909104811690841611156123e4576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691909117909155600583905585908281169085161461251b57600061243b8386614b7f565b905061245167ffffffffffffffff82168361520c565b91506124d27f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661248a6108c2565b612494919061521f565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613f6c565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b612619337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125d09190614b37565b6125da919061521f565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190614040565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561268157600080fd5b505af1158015612695573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af1158015612739573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061275d9190614cc5565b600a546040517fc7a823e000000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff169063c7a823e0906127b89087908d908d9060040161527f565b60006040518083038186803b1580156127d057600080fd5b505afa1580156127e4573d6000803e3d6000fd5b505060405167ffffffffffffffff841692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a2505050505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612882576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361288e8282614d30565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610e60919061456a565b60085473ffffffffffffffffffffffffffffffffffffffff16158015906128fd575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15612934576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c89190614cc5565b6129d291906152a2565b67ffffffffffffffff161115612a14576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003612a50576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612a8c576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612ac79184917001000000000000000000000000000000009004166152c3565b1115612aff576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015612d8e576000868683818110612b4457612b44615129565b9050602002810190612b5691906152d6565b612b5f90615314565b905083612b6b816151ad565b82518051602091820120818501516040808701519051949950919450600093612bcd9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612c56576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055612c7b60018861520c565b8403612cea5742600760189054906101000a900467ffffffffffffffff168460400151612ca891906152a2565b67ffffffffffffffff161115612cea576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080612d86906151d4565b915050612b28565b50612dbc7f00000000000000000000000000000000000000000000000000000000000000008461248a6108c2565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612eab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ecf9190614cc5565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085473ffffffffffffffffffffffffffffffffffffffff1615801590612f4e575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15612f85576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ff0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130149190614c35565b1561304b576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130dc9190614b37565b905081811115613118576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115613154576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61319673ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084614040565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613203573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132279190614b37565b600780549192506801000000000000000090910467ffffffffffffffff16906008613251836151ad565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051613288929190615392565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303613398576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26133f7565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931823388886040516133ee94939291906153a2565b60405180910390a25b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461344f576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600081900361348b576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156134c7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b8581101561390357600089898381811061351057613510615129565b905060200281019061352291906153e2565b61352b90615416565b8051805160209091012060608201519192509067ffffffffffffffff16156136ae5785613557816151ad565b965050600081836020015184606001516040516020016135af93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114613638576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff16101561368e576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86166000908152600660205260408120556137eb565b602082015115801590613775575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af115801561374f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137739190614b37565b155b156137ac576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156137eb576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff16108061381e575042826040015167ffffffffffffffff16115b15613855576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519650505080806138fb906151d4565b9150506134f4565b5060075467ffffffffffffffff680100000000000000009091048116908416111561395a576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff868116919091179091556005839055859082811690851614613a495760006139b18386614b7f565b90506139c767ffffffffffffffff82168361520c565b9150613a007f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661248a6108c2565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b613ada337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125ac573d6000803e3d6000fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613b4257600080fd5b505af1158015613b56573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af1158015613bfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c1e9190614cc5565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691613ce4919061548c565b600060405180830381855afa9150503d8060008114613d1f576040519150601f19603f3d011682016040523d82523d6000602084013e613d24565b606091505b509150915081613d69576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250611e02565b611e02816140a4565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691613df4919061548c565b600060405180830381855afa9150503d8060008114613e2f576040519150601f19603f3d011682016040523d82523d6000602084013e613e34565b606091505b509150915081613d69576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250611e02565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff861691613efa919061548c565b600060405180830381855afa9150503d8060008114613f35576040519150601f19603f3d011682016040523d82523d6000602084013e613f3a565b606091505b5091509150818015613f4d575080516020145b613f58576012611e02565b80806020019051810190611e02919061549e565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610ed79084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261427f565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261409e9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613fbe565b50505050565b606060408251106140c957818060200190518101906140c391906154c1565b92915050565b81516020036142415760005b60208110801561411c57508281815181106140f2576140f2615129565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15614133578061412b816151d4565b9150506140d5565b8060000361417657505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff8111156141915761419161471b565b6040519080825280601f01601f1916602001820160405280156141bb576020820181803683370190505b50905060005b82811015614239578481815181106141db576141db615129565b602001015160f81c60f81b8282815181106141f8576141f8615129565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080614231816151d4565b9150506141c1565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60006142e1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661438b9092919063ffffffff16565b805190915015610ed757808060200190518101906142ff9190614c35565b610ed7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016110d7565b6060611e028484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516143bf919061548c565b60006040518083038185875af1925050503d80600081146143fc576040519150601f19603f3d011682016040523d82523d6000602084013e614401565b606091505b50915091506144128783838761441d565b979650505050505050565b606083156144b35782516000036144ac5773ffffffffffffffffffffffffffffffffffffffff85163b6144ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016110d7565b5081611e02565b611e0283838151156144c85781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d7919061456a565b60005b838110156145175781810151838201526020016144ff565b50506000910152565b600081518084526145388160208601602086016144fc565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061457d6020830184614520565b9392505050565b801515811461459257600080fd5b50565b6000602082840312156145a757600080fd5b813561457d81614584565b67ffffffffffffffff8116811461459257600080fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461459257600080fd5b803561427a816145c8565b60008060006060848603121561460a57600080fd5b8335614615816145b2565b925060208401359150604084013561462c816145c8565b809150509250925092565b60006020828403121561464957600080fd5b813561457d816145b2565b60008083601f84011261466657600080fd5b50813567ffffffffffffffff81111561467e57600080fd5b6020830191508360208260051b850101111561469957600080fd5b9250929050565b6000806000604084860312156146b557600080fd5b833567ffffffffffffffff8111156146cc57600080fd5b6146d886828701614654565b909450925050602084013561462c816145c8565b6000602082840312156146fe57600080fd5b813561457d816145c8565b63ffffffff8116811461459257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516080810167ffffffffffffffff8111828210171561476d5761476d61471b565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156147ba576147ba61471b565b604052919050565b600067ffffffffffffffff8211156147dc576147dc61471b565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261481957600080fd5b813561482c614827826147c2565b614773565b81815284602083860101111561484157600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561487757600080fd5b8635614882816145c8565b95506020870135614892816145c8565b945060408701356148a281614709565b935060608701356148b2816145c8565b9250608087013567ffffffffffffffff808211156148cf57600080fd5b6148db8a838b01614808565b935060a08901359150808211156148f157600080fd5b506148fe89828a01614808565b9150509295509295509295565b6000806000806080858703121561492157600080fd5b843561492c81614709565b9350602085013561493c816145c8565b9250604085013561494c81614709565b9150606085013567ffffffffffffffff81111561496857600080fd5b61497487828801614808565b91505092959194509250565b60008083601f84011261499257600080fd5b50813567ffffffffffffffff8111156149aa57600080fd5b60208301915083602082850101111561469957600080fd5b6000806000806000606086880312156149da57600080fd5b853567ffffffffffffffff808211156149f257600080fd5b818801915088601f830112614a0657600080fd5b813581811115614a1557600080fd5b8960208260071b8501011115614a2a57600080fd5b60208301975080965050614a40602089016145ea565b94506040880135915080821115614a5657600080fd5b50614a6388828901614980565b969995985093965092949392505050565b600060208284031215614a8657600080fd5b813567ffffffffffffffff811115614a9d57600080fd5b611e0284828501614808565b60008060208385031215614abc57600080fd5b823567ffffffffffffffff811115614ad357600080fd5b614adf85828601614654565b90969095509350505050565b600080600060408486031215614b0057600080fd5b833567ffffffffffffffff811115614b1757600080fd5b614b2386828701614980565b909790965060209590950135949350505050565b600060208284031215614b4957600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115614ba057614ba0614b50565b5092915050565b600082614bdd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680614bf657607f821691505b602082108103614c2f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215614c4757600080fd5b815161457d81614584565b606081526000614c656060830186614520565b8281036020840152614c778186614520565b91505060ff83166040830152949350505050565b60008060408385031215614c9e57600080fd5b8251614ca981614709565b6020840151909250614cba816145c8565b809150509250929050565b600060208284031215614cd757600080fd5b815161457d816145b2565b601f821115610ed757600081815260208120601f850160051c81016020861015614d095750805b601f850160051c820191505b81811015614d2857828155600101614d15565b505050505050565b815167ffffffffffffffff811115614d4a57614d4a61471b565b614d5e81614d588454614be2565b84614ce2565b602080601f831160018114614db15760008415614d7b5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555614d28565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015614dfe57888601518255948401946001909101908401614ddf565b5085821015614e3a57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081526000614e5d6060830186614520565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152614ee060c0830184614520565b98975050505050505050565b61ffff818116838216019080821115614ba057614ba0614b50565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614f70816003860160208c016144fc565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614fb3816017840160208b016144fc565b808201915050818660f81b16601782015284519150614fd98260188301602088016144fc565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751615053816003860160208c016144fc565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651615096816017840160208b016144fc565b808201915050818660f01b166017820152845191506150bc8260198301602088016144fc565b016019019998505050505050505050565b600086516150df818460208b016144fc565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006080828403121561516a57600080fd5b61517261474a565b8235815260208301356020820152604083013561518e816145b2565b604082015260608301356151a1816145b2565b60608201529392505050565b600067ffffffffffffffff8083168181036151ca576151ca614b50565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361520557615205614b50565b5060010190565b818103818111156140c3576140c3614b50565b80820281158282048414176140c3576140c3614b50565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201526000615299604083018486615236565b95945050505050565b67ffffffffffffffff818116838216019080821115614ba057614ba0614b50565b808201808211156140c3576140c3614b50565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261530a57600080fd5b9190910192915050565b60006060823603121561532657600080fd5b6040516060810167ffffffffffffffff828210818311171561534a5761534a61471b565b81604052843591508082111561535f57600080fd5b5061536c36828601614808565b825250602083013560208201526040830135615387816145b2565b604082015292915050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff841660208201526060604082015260006153d8606083018486615236565b9695505050505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261530a57600080fd5b60006080823603121561542857600080fd5b61543061474a565b823567ffffffffffffffff81111561544757600080fd5b61545336828601614808565b82525060208301356020820152604083013561546e816145b2565b60408201526060830135615481816145b2565b606082015292915050565b6000825161530a8184602087016144fc565b6000602082840312156154b057600080fd5b815160ff8116811461457d57600080fd5b6000602082840312156154d357600080fd5b815167ffffffffffffffff8111156154ea57600080fd5b8201601f810184136154fb57600080fd5b8051615509614827826147c2565b81815285602083850101111561551e57600080fd5b6152998260208301602086016144fc56fea26469706673582212200514f292c4fe2edd49bb67d8e2cc62c96746b535eebc9a1c0caaf13f8ed670f664736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061031f5760003560e01c80636ff512cc116101a7578063c754c7ed116100ee578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b14610881578063f35dda4714610894578063f851a4401461089c57600080fd5b8063d8d1091b14610827578063e46761c41461083a578063e7a7ed021461086157600080fd5b8063cfa8ed47116100c8578063cfa8ed47146107d5578063d02103ca146107f5578063d7bc90ff1461081c57600080fd5b8063c754c7ed1461078a578063c7fffd4b146107ba578063c89e42df146107c257600080fd5b80639e00187711610150578063ada8f9191161012a578063ada8f91914610758578063b0afe1541461076b578063b81fcafd1461077757600080fd5b80639e00187714610703578063a3c573eb1461071e578063a652f26c1461074557600080fd5b80638c3d7301116101815780638c3d7301146106d557806391cafe32146106dd57806398cf4bd0146106f057600080fd5b80636ff512cc1461067357806371257022146106865780637a5460c51461069957600080fd5b806340b5de6c1161026b578063542028d511610214578063676870d2116101ee578063676870d2146106425780636b8616ce1461064a5780636e05d2cd1461066a57600080fd5b8063542028d51461060757806356e294351461060f5780635e9145c91461062f57600080fd5b80634c21fef3116102455780634c21fef3146105835780634e487706146105b857806352bdeb6d146105cb57600080fd5b806340b5de6c146104dc578063456052671461053457806349b7b8021461055c57600080fd5b806326782247116102cd57806332c2d153116102a757806332c2d1531461046c5780633c351e101461047f5780633cbc795b1461049f57600080fd5b806326782247146103f25780632acdc2b6146104375780632c111c061461044c57600080fd5b8063107bf28c116102fe578063107bf28c146103a357806311e892d4146103ab57806319d8ac61146103c557600080fd5b8062d0295d14610324578063035089631461033f57806305835f371461035a575b600080fd5b61032c6108c2565b6040519081526020015b60405180910390f35b610347602081565b60405161ffff9091168152602001610336565b6103966040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b604051610336919061456a565b6103966109e2565b6103b360f981565b60405160ff9091168152602001610336565b6007546103d99067ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610336565b6001546104129073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610336565b61044a610445366004614595565b610a70565b005b6008546104129073ffffffffffffffffffffffffffffffffffffffff1681565b61044a61047a3660046145f5565b610b82565b6009546104129073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104c79074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610336565b6105037fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff000000000000000000000000000000000000000000000000000000000000009091168152602001610336565b6007546103d990700100000000000000000000000000000000900467ffffffffffffffff1681565b6104127f000000000000000000000000000000000000000000000000000000000000000081565b600a546105a89074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001610336565b61044a6105c6366004614637565b610c51565b6103966040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610396610e6b565b600a546104129073ffffffffffffffffffffffffffffffffffffffff1681565b61044a61063d3660046146a0565b610e78565b610347601f81565b61032c610658366004614637565b60066020526000908152604090205481565b61032c60055481565b61044a6106813660046146ec565b610edc565b61044a61069436600461485e565b610fa6565b6103966040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61044a61176f565b61044a6106eb3660046146ec565b611842565b61044a6106fe3660046146ec565b61195b565b61041273a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6104127f000000000000000000000000000000000000000000000000000000000000000081565b61039661075336600461490b565b611a25565b61044a6107663660046146ec565b611e0a565b61032c6405ca1ab1e081565b61044a6107853660046149c2565b611ed4565b6007546103d9907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6103b360e481565b61044a6107d0366004614a74565b61282b565b6002546104129073ffffffffffffffffffffffffffffffffffffffff1681565b6104127f000000000000000000000000000000000000000000000000000000000000000081565b61032c635ca1ab1e81565b61044a610835366004614aa9565b6128be565b6104127f000000000000000000000000000000000000000000000000000000000000000081565b6007546103d99068010000000000000000900467ffffffffffffffff1681565b61044a61088f366004614aeb565b612f0f565b6103b3601b81565b6000546104129062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610951573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109759190614b37565b6007549091506000906109b49067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416614b7f565b67ffffffffffffffff169050806000036109d15760009250505090565b6109db8183614ba7565b9250505090565b600480546109ef90614be2565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1b90614be2565b8015610a685780601f10610a3d57610100808354040283529160200191610a68565b820191906000526020600020905b815481529060010190602001808311610a4b57829003601f168201915b505050505081565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ac7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b801515600a60149054906101000a900460ff16151503610b13576040517f5f0e7abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000831515021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f4190600090a150565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610bf1576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610c4491815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ca8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610cef576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7e9190614c35565b610de75760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610de7576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546109ef90614be2565b600a5474010000000000000000000000000000000000000000900460ff16610ecc576040517f821935b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ed78383836133fe565b505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610f33576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610e60565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611015576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156110355750600054600160ff909116105b8061104f5750303b15801561104f575060005460ff166001145b6110e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561113e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff85161561132a5761116585613c62565b61116e86613d72565b61117787613e79565b60405160200161118993929190614c52565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af115801561124a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126e9190614c8b565b915091508163ffffffff166000146112e6576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055611327565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b60095460009061137290889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685611a25565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114169190614b37565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611591573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b59190614cc5565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600390816116479190614d30565b5060046116548982614d30565b508c600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e6040516116f593929190614e4a565b60405180910390a1505050505050801561176657600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146117c0576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611899576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff166118e8576040517fd40d91c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610e60565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146119b2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f76d12ecc41da43ceb240d60fdd4d9fc0baae9793060e7b592abde7ece5ee965190602001610e60565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa600087604051602401611a5996959493929190614e89565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff7000000000000000000000000000000000000000000000000000000001790528351909150606090600003611baa5760f9601f8351611aee9190614eec565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611b949796959493929190614f07565b6040516020818303038152906040529050611cae565b815161ffff1015611be7576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611bf6602083614eec565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001611c9b9796959493929190614fea565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015611d0f573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611d87576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051600090611dcd9084906405ca1ab1e090635ca1ab1e90601b907fff00000000000000000000000000000000000000000000000000000000000000906020016150cd565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611e61576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610e60565b60025473ffffffffffffffffffffffffffffffffffffffff163314611f25576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836000819003611f61576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611f9d576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b8581101561238d5760008b8b83818110611fe657611fe6615129565b905060800201803603810190611ffc9190615158565b805160608201519192509067ffffffffffffffff16156121775785612020816151ad565b9650506000818360200151846060015160405160200161207893929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114612101576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015612157576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055612275565b60208201511580159061223e575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015612218573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223c9190614b37565b155b15612275576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806122a8575042826040015167ffffffffffffffff16115b156122df576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151965050508080612385906151d4565b915050611fca565b5060075467ffffffffffffffff68010000000000000000909104811690841611156123e4576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691909117909155600583905585908281169085161461251b57600061243b8386614b7f565b905061245167ffffffffffffffff82168361520c565b91506124d27f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661248a6108c2565b612494919061521f565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613f6c565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b612619337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125d09190614b37565b6125da919061521f565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190614040565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561268157600080fd5b505af1158015612695573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af1158015612739573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061275d9190614cc5565b600a546040517fc7a823e000000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff169063c7a823e0906127b89087908d908d9060040161527f565b60006040518083038186803b1580156127d057600080fd5b505afa1580156127e4573d6000803e3d6000fd5b505060405167ffffffffffffffff841692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a2505050505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612882576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361288e8282614d30565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610e60919061456a565b60085473ffffffffffffffffffffffffffffffffffffffff16158015906128fd575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15612934576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c89190614cc5565b6129d291906152a2565b67ffffffffffffffff161115612a14576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003612a50576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612a8c576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612ac79184917001000000000000000000000000000000009004166152c3565b1115612aff576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015612d8e576000868683818110612b4457612b44615129565b9050602002810190612b5691906152d6565b612b5f90615314565b905083612b6b816151ad565b82518051602091820120818501516040808701519051949950919450600093612bcd9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612c56576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055612c7b60018861520c565b8403612cea5742600760189054906101000a900467ffffffffffffffff168460400151612ca891906152a2565b67ffffffffffffffff161115612cea576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080612d86906151d4565b915050612b28565b50612dbc7f00000000000000000000000000000000000000000000000000000000000000008461248a6108c2565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612eab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ecf9190614cc5565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085473ffffffffffffffffffffffffffffffffffffffff1615801590612f4e575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15612f85576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ff0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130149190614c35565b1561304b576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130dc9190614b37565b905081811115613118576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115613154576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61319673ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084614040565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613203573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132279190614b37565b600780549192506801000000000000000090910467ffffffffffffffff16906008613251836151ad565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051613288929190615392565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303613398576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26133f7565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931823388886040516133ee94939291906153a2565b60405180910390a25b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461344f576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600081900361348b576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156134c7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b8581101561390357600089898381811061351057613510615129565b905060200281019061352291906153e2565b61352b90615416565b8051805160209091012060608201519192509067ffffffffffffffff16156136ae5785613557816151ad565b965050600081836020015184606001516040516020016135af93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114613638576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff16101561368e576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86166000908152600660205260408120556137eb565b602082015115801590613775575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af115801561374f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137739190614b37565b155b156137ac576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156137eb576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff16108061381e575042826040015167ffffffffffffffff16115b15613855576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519650505080806138fb906151d4565b9150506134f4565b5060075467ffffffffffffffff680100000000000000009091048116908416111561395a576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff868116919091179091556005839055859082811690851614613a495760006139b18386614b7f565b90506139c767ffffffffffffffff82168361520c565b9150613a007f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661248a6108c2565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b613ada337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125ac573d6000803e3d6000fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613b4257600080fd5b505af1158015613b56573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af1158015613bfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c1e9190614cc5565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691613ce4919061548c565b600060405180830381855afa9150503d8060008114613d1f576040519150601f19603f3d011682016040523d82523d6000602084013e613d24565b606091505b509150915081613d69576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250611e02565b611e02816140a4565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691613df4919061548c565b600060405180830381855afa9150503d8060008114613e2f576040519150601f19603f3d011682016040523d82523d6000602084013e613e34565b606091505b509150915081613d69576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250611e02565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff861691613efa919061548c565b600060405180830381855afa9150503d8060008114613f35576040519150601f19603f3d011682016040523d82523d6000602084013e613f3a565b606091505b5091509150818015613f4d575080516020145b613f58576012611e02565b80806020019051810190611e02919061549e565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610ed79084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261427f565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261409e9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613fbe565b50505050565b606060408251106140c957818060200190518101906140c391906154c1565b92915050565b81516020036142415760005b60208110801561411c57508281815181106140f2576140f2615129565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15614133578061412b816151d4565b9150506140d5565b8060000361417657505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff8111156141915761419161471b565b6040519080825280601f01601f1916602001820160405280156141bb576020820181803683370190505b50905060005b82811015614239578481815181106141db576141db615129565b602001015160f81c60f81b8282815181106141f8576141f8615129565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080614231816151d4565b9150506141c1565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60006142e1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661438b9092919063ffffffff16565b805190915015610ed757808060200190518101906142ff9190614c35565b610ed7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016110d7565b6060611e028484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516143bf919061548c565b60006040518083038185875af1925050503d80600081146143fc576040519150601f19603f3d011682016040523d82523d6000602084013e614401565b606091505b50915091506144128783838761441d565b979650505050505050565b606083156144b35782516000036144ac5773ffffffffffffffffffffffffffffffffffffffff85163b6144ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016110d7565b5081611e02565b611e0283838151156144c85781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d7919061456a565b60005b838110156145175781810151838201526020016144ff565b50506000910152565b600081518084526145388160208601602086016144fc565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061457d6020830184614520565b9392505050565b801515811461459257600080fd5b50565b6000602082840312156145a757600080fd5b813561457d81614584565b67ffffffffffffffff8116811461459257600080fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461459257600080fd5b803561427a816145c8565b60008060006060848603121561460a57600080fd5b8335614615816145b2565b925060208401359150604084013561462c816145c8565b809150509250925092565b60006020828403121561464957600080fd5b813561457d816145b2565b60008083601f84011261466657600080fd5b50813567ffffffffffffffff81111561467e57600080fd5b6020830191508360208260051b850101111561469957600080fd5b9250929050565b6000806000604084860312156146b557600080fd5b833567ffffffffffffffff8111156146cc57600080fd5b6146d886828701614654565b909450925050602084013561462c816145c8565b6000602082840312156146fe57600080fd5b813561457d816145c8565b63ffffffff8116811461459257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516080810167ffffffffffffffff8111828210171561476d5761476d61471b565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156147ba576147ba61471b565b604052919050565b600067ffffffffffffffff8211156147dc576147dc61471b565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261481957600080fd5b813561482c614827826147c2565b614773565b81815284602083860101111561484157600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561487757600080fd5b8635614882816145c8565b95506020870135614892816145c8565b945060408701356148a281614709565b935060608701356148b2816145c8565b9250608087013567ffffffffffffffff808211156148cf57600080fd5b6148db8a838b01614808565b935060a08901359150808211156148f157600080fd5b506148fe89828a01614808565b9150509295509295509295565b6000806000806080858703121561492157600080fd5b843561492c81614709565b9350602085013561493c816145c8565b9250604085013561494c81614709565b9150606085013567ffffffffffffffff81111561496857600080fd5b61497487828801614808565b91505092959194509250565b60008083601f84011261499257600080fd5b50813567ffffffffffffffff8111156149aa57600080fd5b60208301915083602082850101111561469957600080fd5b6000806000806000606086880312156149da57600080fd5b853567ffffffffffffffff808211156149f257600080fd5b818801915088601f830112614a0657600080fd5b813581811115614a1557600080fd5b8960208260071b8501011115614a2a57600080fd5b60208301975080965050614a40602089016145ea565b94506040880135915080821115614a5657600080fd5b50614a6388828901614980565b969995985093965092949392505050565b600060208284031215614a8657600080fd5b813567ffffffffffffffff811115614a9d57600080fd5b611e0284828501614808565b60008060208385031215614abc57600080fd5b823567ffffffffffffffff811115614ad357600080fd5b614adf85828601614654565b90969095509350505050565b600080600060408486031215614b0057600080fd5b833567ffffffffffffffff811115614b1757600080fd5b614b2386828701614980565b909790965060209590950135949350505050565b600060208284031215614b4957600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115614ba057614ba0614b50565b5092915050565b600082614bdd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680614bf657607f821691505b602082108103614c2f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215614c4757600080fd5b815161457d81614584565b606081526000614c656060830186614520565b8281036020840152614c778186614520565b91505060ff83166040830152949350505050565b60008060408385031215614c9e57600080fd5b8251614ca981614709565b6020840151909250614cba816145c8565b809150509250929050565b600060208284031215614cd757600080fd5b815161457d816145b2565b601f821115610ed757600081815260208120601f850160051c81016020861015614d095750805b601f850160051c820191505b81811015614d2857828155600101614d15565b505050505050565b815167ffffffffffffffff811115614d4a57614d4a61471b565b614d5e81614d588454614be2565b84614ce2565b602080601f831160018114614db15760008415614d7b5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555614d28565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015614dfe57888601518255948401946001909101908401614ddf565b5085821015614e3a57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081526000614e5d6060830186614520565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152614ee060c0830184614520565b98975050505050505050565b61ffff818116838216019080821115614ba057614ba0614b50565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614f70816003860160208c016144fc565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614fb3816017840160208b016144fc565b808201915050818660f81b16601782015284519150614fd98260188301602088016144fc565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751615053816003860160208c016144fc565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651615096816017840160208b016144fc565b808201915050818660f01b166017820152845191506150bc8260198301602088016144fc565b016019019998505050505050505050565b600086516150df818460208b016144fc565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006080828403121561516a57600080fd5b61517261474a565b8235815260208301356020820152604083013561518e816145b2565b604082015260608301356151a1816145b2565b60608201529392505050565b600067ffffffffffffffff8083168181036151ca576151ca614b50565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361520557615205614b50565b5060010190565b818103818111156140c3576140c3614b50565b80820281158282048414176140c3576140c3614b50565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201526000615299604083018486615236565b95945050505050565b67ffffffffffffffff818116838216019080821115614ba057614ba0614b50565b808201808211156140c3576140c3614b50565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261530a57600080fd5b9190910192915050565b60006060823603121561532657600080fd5b6040516060810167ffffffffffffffff828210818311171561534a5761534a61471b565b81604052843591508082111561535f57600080fd5b5061536c36828601614808565b825250602083013560208201526040830135615387816145b2565b604082015292915050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff841660208201526060604082015260006153d8606083018486615236565b9695505050505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261530a57600080fd5b60006080823603121561542857600080fd5b61543061474a565b823567ffffffffffffffff81111561544757600080fd5b61545336828601614808565b82525060208301356020820152604083013561546e816145b2565b60408201526060830135615481816145b2565b606082015292915050565b6000825161530a8184602087016144fc565b6000602082840312156154b057600080fd5b815160ff8116811461457d57600080fd5b6000602082840312156154d357600080fd5b815167ffffffffffffffff8111156154ea57600080fd5b8201601f810184136154fb57600080fd5b8051615509614827826147c2565b81815285602083850101111561551e57600080fd5b6152998260208301602086016144fc56fea26469706673582212200514f292c4fe2edd49bb67d8e2cc62c96746b535eebc9a1c0caaf13f8ed670f664736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonRollupManager.json b/compiled-contracts/paris/PolygonRollupManager.json index fadf806a4..b237b40c7 100644 --- a/compiled-contracts/paris/PolygonRollupManager.json +++ b/compiled-contracts/paris/PolygonRollupManager.json @@ -6,7 +6,7 @@ { "inputs": [ { - "internalType": "contract IPolygonZkEVMGlobalExitRoot", + "internalType": "contract IPolygonZkEVMGlobalExitRootV2", "name": "_globalExitRootManager", "type": "address" }, @@ -164,6 +164,11 @@ "name": "PendingStateNotConsolidable", "type": "error" }, + { + "inputs": [], + "name": "RollupAddressAlreadyExist", + "type": "error" + }, { "inputs": [], "name": "RollupMustExist", @@ -1181,7 +1186,7 @@ "name": "globalExitRootManager", "outputs": [ { - "internalType": "contract IPolygonZkEVMGlobalExitRoot", + "internalType": "contract IPolygonZkEVMGlobalExitRootV2", "name": "", "type": "address" } @@ -1339,6 +1344,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "lastDeactivatedEmergencyStateTimestamp", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "multiplierBatchFee", @@ -1947,8 +1965,8 @@ "type": "function" } ], - "bytecode": "0x60e06040523480156200001157600080fd5b5060405162005db638038062005db683398101604081905262000034916200006b565b6001600160a01b0392831660805290821660c0521660a052620000bf565b6001600160a01b03811681146200006857600080fd5b50565b6000806000606084860312156200008157600080fd5b83516200008e8162000052565b6020850151909350620000a18162000052565b6040850151909250620000b48162000052565b809150509250925092565b60805160a05160c051615c8f6200012760003960008181610a0f0152818161213b0152613a2e0152600081816107c701528181612cc30152613d29015260008181610969015281816111c60152818161137601528181611e7f0152613c180152615c8f6000f3fe60806040523480156200001157600080fd5b5060043610620003095760003560e01c806387c20c01116200019d578063c4c928c211620000eb578063dbc16976116200009e578063dbc1697614620009cd578063dde0ff7714620009d7578063e0bfd3d214620009f2578063e46761c41462000a09578063f34eb8eb1462000a31578063f4e926751462000a48578063f9c4c2ae1462000a5957600080fd5b8063c4c928c21462000923578063ceee281d146200093a578063d02103ca1462000963578063d5073f6f146200098b578063d547741f14620009a2578063d939b31514620009b957600080fd5b8063a066215c1162000150578063a066215c1462000797578063a217fddf14620007ae578063a2967d9914620007b7578063a3c573eb14620007c1578063afd23cbe1462000802578063b99d0ad7146200082c578063c1acbc34146200090857600080fd5b806387c20c01146200071a5780638bd4f071146200073157806391d14854146200074857806399f5634e146200075f5780639a908e7314620007695780639c9f3dfe146200078057600080fd5b806325280169116200025b57806360469169116200020e5780636046916914620005c957806365c0504d14620005d35780637222020f1462000682578063727885e914620006995780637975fcfe14620006b05780637fb6e76a14620006d6578063841b24d714620006ff57600080fd5b80632528016914620004825780632f2ff15d146200053757806336568abe146200054e578063394218e91462000565578063477fa270146200057c57806355a71ee0146200058557600080fd5b80631489ed1011620002c05780631489ed1014620003c957806315064c9614620003e05780631608859c14620003ee5780631796a1ae14620004055780631816b7e5146200042c5780632072f6c51462000443578063248a9ca3146200044d57600080fd5b80630645af09146200030e578063066ec0121462000327578063080b311114620003585780630a0d9fbe146200038057806311f6b287146200039b57806312b86e1914620003b2575b600080fd5b620003256200031f366004620046e5565b62000b70565b005b6084546200033b906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b6200036f62000369366004620047d5565b620010d0565b60405190151581526020016200034f565b6085546200033b90600160401b90046001600160401b031681565b6200033b620003ac3660046200480d565b620010fa565b62000325620003c33660046200483e565b6200111a565b62000325620003da366004620048d5565b620012ca565b606f546200036f9060ff1681565b62000325620003ff366004620047d5565b62001460565b607e54620004169063ffffffff1681565b60405163ffffffff90911681526020016200034f565b620003256200043d3660046200495f565b620014f5565b62000325620015a1565b620004736200045e3660046200498c565b60009081526034602052604090206001015490565b6040519081526020016200034f565b6200050362000493366004620047d5565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b039081169183019190915292820151909216908201526060016200034f565b6200032562000548366004620049a6565b62001637565b620003256200055f366004620049a6565b62001660565b6200032562000576366004620049d9565b6200169a565b60865462000473565b6200047362000596366004620047d5565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620004736200174e565b62000638620005e43660046200480d565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c0016200034f565b62000325620006933660046200480d565b62001766565b62000325620006aa36600462004aa1565b62001862565b620006c7620006c136600462004b6e565b62001cdb565b6040516200034f919062004c28565b62000416620006e7366004620049d9565b60836020526000908152604090205463ffffffff1681565b6084546200033b90600160c01b90046001600160401b031681565b620003256200072b366004620048d5565b62001d0e565b62000325620007423660046200483e565b62002038565b6200036f62000759366004620049a6565b620020ee565b6200047362002119565b6200033b6200077a36600462004c3d565b62002200565b6200032562000791366004620049d9565b620023d2565b62000325620007a8366004620049d9565b62002478565b62000473600081565b620004736200251c565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016200034f565b6085546200081890600160801b900461ffff1681565b60405161ffff90911681526020016200034f565b620008c26200083d366004620047d5565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b6040516200034f919060006080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200033b90600160801b90046001600160401b031681565b620003256200093436600462004c6a565b620028f1565b620004166200094b36600462004d02565b60826020526000908152604090205463ffffffff1681565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b620003256200099c3660046200498c565b62002bd0565b62000325620009b3366004620049a6565b62002c6c565b6085546200033b906001600160401b031681565b6200032562002c95565b6084546200033b90600160401b90046001600160401b031681565b6200032562000a0336600462004d34565b62002d43565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b6200032562000a4236600462004db0565b62002dde565b608054620004169063ffffffff1681565b62000af062000a6a3660046200480d565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff16610160820152610180016200034f565b600054600290610100900460ff1615801562000b93575060005460ff8083169116105b62000bfc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c7d62002fda565b62000c9860008051602062005c3a8339815191528c62003047565b62000ca560008862003047565b62000cd17fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908862003047565b62000cfd7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8862003047565b62000d297f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8862003047565b62000d557fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8962003047565b62000d817fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088962003047565b62000dad7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48962003047565b62000dc860008051602062005bfa8339815191528962003047565b62000e0360008051602062005c3a8339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062003053565b62000e2f7f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08962003047565b62000e5b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8962003047565b62000e9660008051602062005c1a8339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162003053565b62000eb160008051602062005c1a8339815191528762003047565b62000edd7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518762003047565b6073546074546001600160401b03600160401b9092048216911680821462000f1857604051632e4cc54360e11b815260040160405180910390fd5b600062000f40888888886000607460009054906101000a90046001600160401b03166200309e565b6001600160401b03838116600081815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068b018054909216909417938802939093179092556007880180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81529596506001600160a01b038e81169663bb59070896620010439694831695600160581b90950490921693607693607793909291169060040162004ef3565b600060405180830381600087803b1580156200105e57600080fd5b505af115801562001073573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620010bb9050565b60405180910390a15050505050505050505050565b63ffffffff82166000908152608160205260408120620010f19083620032cc565b90505b92915050565b63ffffffff81166000908152608160205260408120620010f49062003311565b60008051602062005c3a833981519152620011358162003382565b63ffffffff891660009081526081602052604090206200115c818a8a8a8a8a8a8a6200338e565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b90041615620011c4576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620011fd6200251c565b6040518263ffffffff1660e01b81526004016200121c91815260200190565b600060405180830381600087803b1580156200123757600080fd5b505af11580156200124c573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005c3a833981519152620012e58162003382565b63ffffffff891660009081526081602052604090206200130c818a8a8a8a8a8a8a62003727565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562001374576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620013ad6200251c565b6040518263ffffffff1660e01b8152600401620013cc91815260200190565b600060405180830381600087803b158015620013e757600080fd5b505af1158015620013fc573d6000803e3d6000fd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff821660009081526081602052604090206200149060008051602062005c3a83398151915233620020ee565b620014e457606f5460ff1615620014ba57604051630bc011ff60e21b815260040160405180910390fd5b620014c68183620032cc565b620014e457604051630674f25160e11b815260040160405180910390fd5b620014f0818362003b35565b505050565b60008051602062005bfa833981519152620015108162003382565b6103e88261ffff1610806200152a57506103ff8261ffff16115b156200154957604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620015bc60008051602062005c1a83398151915233620020ee565b6200162b57608454600160801b90046001600160401b031615806200160c57506084544290620016019062093a8090600160801b90046001600160401b031662004f6e565b6001600160401b0316115b156200162b5760405163692baaad60e11b815260040160405180910390fd5b6200163562003d27565b565b600082815260346020526040902060010154620016548162003382565b620014f0838362003da6565b6001600160a01b03811633146200168a57604051630b4ad1cd60e31b815260040160405180910390fd5b62001696828262003e12565b5050565b60008051602062005bfa833981519152620016b58162003382565b606f5460ff16620016f7576084546001600160401b03600160c01b909104811690831610620016f75760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19060200162001595565b6000608654606462001761919062004f98565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd620017928162003382565b63ffffffff82161580620017b15750607e5463ffffffff908116908316115b15620017d057604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200181757604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd086200188e8162003382565b63ffffffff88161580620018ad5750607e5463ffffffff908116908916115b15620018cc57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff16151590036200191357604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001951576040516337c8fe0960e11b815260040160405180910390fd5b608080546000919082906200196c9063ffffffff1662004fb2565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b03909216913091620019ba90620046a9565b620019c89392919062004fd8565b604051809103906000f080158015620019e5573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001c59949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001c99908d908d9088908e908e908e906004016200500f565b600060405180830381600087803b15801562001cb457600080fd5b505af115801562001cc9573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001d0390878787878762003e7c565b979650505050505050565b606f5460ff161562001d3357604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001d8292600160c01b90048116911662004f6e565b6001600160401b0316111562001dab57604051638a0704d360e01b815260040160405180910390fd5b6103e862001dba888862005072565b6001600160401b0316111562001de357604051635acfba9d60e11b815260040160405180910390fd5b62001df5818989898989898962003727565b62001e01818762003fbc565b6085546001600160401b031660000362001f0f57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001e7d576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001eb66200251c565b6040518263ffffffff1660e01b815260040162001ed591815260200190565b600060405180830381600087803b15801562001ef057600080fd5b505af115801562001f05573d6000803e3d6000fd5b5050505062001fd9565b62001f1a81620041b9565b600681018054600160801b90046001600160401b031690601062001f3e8362005095565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff16156200205d57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602052604090206200208481898989898989896200338e565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620020e362003d27565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b815230600482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562002183573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620021a99190620050b4565b608454909150600090620021d0906001600160401b03600160401b82048116911662005072565b6001600160401b0316905080600003620021ed5760009250505090565b620021f98183620050e4565b9250505090565b606f5460009060ff16156200222857604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362002260576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200228b57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620022be9084906001600160401b031662004f6e565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620022f4878362004f6e565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200238483620041b9565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b60008051602062005bfa833981519152620023ed8162003382565b606f5460ff1662002428576085546001600160401b0390811690831610620024285760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759060200162001595565b60008051602062005bfa833981519152620024938162003382565b62015180826001600160401b03161115620024c157604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289060200162001595565b60805460009063ffffffff168082036200253857506000919050565b6000816001600160401b03811115620025555762002555620049f7565b6040519080825280602002602001820160405280156200257f578160200160208202803683370190505b50905060005b82811015620025f257608160006200259f836001620050fb565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620025d257620025d262005111565b602090810291909101015280620025e98162005127565b91505062002585565b50600060205b836001146200284e5760006200261060028662005143565b6200261d600287620050e4565b620026299190620050fb565b90506000816001600160401b03811115620026485762002648620049f7565b60405190808252806020026020018201604052801562002672578160200160208202803683370190505b50905060005b82811015620027fa576200268e6001846200515a565b81148015620026a95750620026a560028862005143565b6001145b15620027315785620026bd82600262004f98565b81518110620026d057620026d062005111565b602002602001015185604051602001620026f4929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106200271f576200271f62005111565b602002602001018181525050620027e5565b856200273f82600262004f98565b8151811062002752576200275262005111565b6020026020010151868260026200276a919062004f98565b62002777906001620050fb565b815181106200278a576200278a62005111565b6020026020010151604051602001620027ad929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620027d857620027d862005111565b6020026020010181815250505b80620027f18162005127565b91505062002678565b5080945081955083846040516020016200281e929190918252602082015260400190565b6040516020818303038152906040528051906020012093508280620028439062005170565b9350505050620025f8565b60008360008151811062002866576200286662005111565b6020026020010151905060005b82811015620028e757604080516020810184905290810185905260600160408051601f19818403018152828252805160209182012090830187905290820186905292506060016040516020818303038152906040528051906020012093508080620028de9062005127565b91505062002873565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac6200291d8162003382565b63ffffffff841615806200293c5750607e5463ffffffff908116908516115b156200295b57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff16908190036200299c576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b031603620029eb57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002a3257604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002a7057604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002af084620010fa565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002b469216908b908b906004016200518a565b600060405180830381600087803b15801562002b6157600080fd5b505af115801562002b76573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002bfc8162003382565b683635c9adc5dea0000082118062002c175750633b9aca0082105b1562002c3657604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001595565b60008281526034602052604090206001015462002c898162003382565b620014f0838362003e12565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002cc18162003382565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002d1d57600080fd5b505af115801562002d32573d6000803e3d6000fd5b5050505062002d4062004284565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62002d6f8162003382565b6001600160401b03841660009081526083602052604090205463ffffffff161562002dad576040516337c8fe0960e11b815260040160405180910390fd5b600062002dc0888888888760006200309e565b60008080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002e0a8162003382565b607e805460009190829062002e259063ffffffff1662004fb2565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002fc896959493929190620051ca565b60405180910390a25050505050505050565b600054610100900460ff16620016355760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000bf3565b62001696828262003da6565b600082815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6080805460009182918290620030ba9063ffffffff1662004fb2565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000876001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff16021790555080608260008a6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150878260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550868260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620032b99594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b03828116600090815260048501602052604081205490924292620032ff92918116911662004f6e565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b03161562003365575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002d408133620042dd565b60078801546000906001600160401b039081169087161015620033c45760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620034655760068901546001600160401b03600160801b909104811690891611156200340e5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200345e57604051632bd2e3e760e01b815260040160405180910390fd5b50620034da565b506001600160401b038516600090815260028901602052604090205480620034a0576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620034da57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620035135750876001600160401b0316876001600160401b031611155b8062003537575060068901546001600160401b03600160c01b909104811690881611155b15620035565760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b90048116908616146200359d576040516332a2a77f60e01b815260040160405180910390fd5b6000620035af8a888888868962003e7c565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620035e6919062005223565b602060405180830381855afa15801562003604573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620036299190620050b4565b62003635919062005143565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620036799188919060040162005241565b602060405180830381865afa15801562003697573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620036bd91906200527e565b620036db576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c0160205260409020600201548590036200371a5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620037358a62003311565b60078b01549091506001600160401b0390811690891610156200376b5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038916156200380e5760068a01546001600160401b03600160801b9091048116908a161115620037b55760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200380757604051632bd2e3e760e01b815260040160405180910390fd5b506200387e565b6001600160401b038816600090815260028b0160205260409020549150816200384a576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200387e57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620038b15760405163b9b18f5760e01b815260040160405180910390fd5b6000620038c38b8a8a8a878b62003e7c565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620038fa919062005223565b602060405180830381855afa15801562003918573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200393d9190620050b4565b62003949919062005143565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200398d9189919060040162005241565b602060405180830381865afa158015620039ab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620039d191906200527e565b620039ef576040516309bde33960e01b815260040160405180910390fd5b6000620039fd848b62005072565b905062003a5687826001600160401b031662003a1862002119565b62003a24919062004f98565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004307565b80608460088282829054906101000a90046001600160401b031662003a7c919062004f6e565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b15801562003b0d57600080fd5b505af115801562003b22573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003b74575060068201546001600160401b03600160801b9091048116908216115b1562003b935760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003c4f6200251c565b6040518263ffffffff1660e01b815260040162003c6e91815260200190565b600060405180830381600087803b15801562003c8957600080fd5b505af115801562003c9e573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003d8357600080fd5b505af115801562003d98573d6000803e3d6000fd5b50505050620016356200435b565b62003db28282620020ee565b620016965760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003e1e8282620020ee565b15620016965760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003eb2575081155b1562003ed15760405163340c614f60e11b815260040160405180910390fd5b8062003ef0576040516366385b5160e01b815260040160405180910390fd5b62003efb84620043b8565b62003f19576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b600062003fc98362003311565b90508160008062003fdb848462005072565b6085546001600160401b0391821692506000916200400291600160401b900416426200515a565b90505b846001600160401b0316846001600160401b0316146200408c576001600160401b0380851660009081526003890160205260409020600181015490911682101562004067576001810154600160401b90046001600160401b0316945062004085565b62004073868662005072565b6001600160401b03169350506200408c565b5062004005565b60006200409a84846200515a565b905083811015620040f857808403600c8111620040b85780620040bb565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620040ed57620040ed620050ce565b046086555062004170565b838103600c81116200410b57806200410e565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a76400000281620041485762004148620050ce565b04905080608654670de0b6b3a76400000281620041695762004169620050ce565b0460865550505b683635c9adc5dea0000060865411156200419757683635c9adc5dea00000608655620041af565b633b9aca006086541015620041af57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002d405760068101546000906200420490600160c01b90046001600160401b0316600162004f6e565b9050620042128282620032cc565b156200169657600682015460009060029062004240908490600160801b90046001600160401b031662005072565b6200424c9190620052a2565b62004258908362004f6e565b9050620042668382620032cc565b156200427857620014f0838262003b35565b620014f0838362003b35565b606f5460ff16620042a857604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b620042e98282620020ee565b6200169657604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620014f09084906200443e565b606f5460ff16156200438057604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b038316108015620043ef575067ffffffff00000001604083901c6001600160401b0316105b801562004410575067ffffffff00000001608083901c6001600160401b0316105b801562004428575067ffffffff0000000160c083901c105b156200443657506001919050565b506000919050565b600062004495826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620045179092919063ffffffff16565b805190915015620014f05780806020019051810190620044b691906200527e565b620014f05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000bf3565b606062004528848460008562004530565b949350505050565b606082471015620045935760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000bf3565b600080866001600160a01b03168587604051620045b1919062005223565b60006040518083038185875af1925050503d8060008114620045f0576040519150601f19603f3d011682016040523d82523d6000602084013e620045f5565b606091505b509150915062001d038783838760608315620046765782516000036200466e576001600160a01b0385163b6200466e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000bf3565b508162004528565b6200452883838151156200468d5781518083602001fd5b8060405162461bcd60e51b815260040162000bf3919062004c28565b61092e80620052cc83390190565b6001600160a01b038116811462002d4057600080fd5b80356001600160401b03811681146200337d57600080fd5b6000806000806000806000806000806101408b8d0312156200470657600080fd5b8a356200471381620046b7565b99506200472360208c01620046cd565b98506200473360408c01620046cd565b975060608b01356200474581620046b7565b965060808b01356200475781620046b7565b955060a08b01356200476981620046b7565b945060c08b01356200477b81620046b7565b935060e08b01356200478d81620046b7565b92506200479e6101008c01620046cd565b9150620047af6101208c01620046cd565b90509295989b9194979a5092959850565b803563ffffffff811681146200337d57600080fd5b60008060408385031215620047e957600080fd5b620047f483620047c0565b91506200480460208401620046cd565b90509250929050565b6000602082840312156200482057600080fd5b620010f182620047c0565b806103008101831015620010f457600080fd5b6000806000806000806000806103e0898b0312156200485c57600080fd5b6200486789620047c0565b97506200487760208a01620046cd565b96506200488760408a01620046cd565b95506200489760608a01620046cd565b9450620048a760808a01620046cd565b935060a0890135925060c08901359150620048c68a60e08b016200482b565b90509295985092959890939650565b6000806000806000806000806103e0898b031215620048f357600080fd5b620048fe89620047c0565b97506200490e60208a01620046cd565b96506200491e60408a01620046cd565b95506200492e60608a01620046cd565b94506080890135935060a0890135925060c08901356200494e81620046b7565b9150620048c68a60e08b016200482b565b6000602082840312156200497257600080fd5b813561ffff811681146200498557600080fd5b9392505050565b6000602082840312156200499f57600080fd5b5035919050565b60008060408385031215620049ba57600080fd5b823591506020830135620049ce81620046b7565b809150509250929050565b600060208284031215620049ec57600080fd5b620010f182620046cd565b634e487b7160e01b600052604160045260246000fd5b600082601f83011262004a1f57600080fd5b81356001600160401b038082111562004a3c5762004a3c620049f7565b604051601f8301601f19908116603f0116810190828211818310171562004a675762004a67620049f7565b8160405283815286602085880101111562004a8157600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121562004abd57600080fd5b62004ac888620047c0565b965062004ad860208901620046cd565b9550604088013562004aea81620046b7565b9450606088013562004afc81620046b7565b9350608088013562004b0e81620046b7565b925060a08801356001600160401b038082111562004b2b57600080fd5b62004b398b838c0162004a0d565b935060c08a013591508082111562004b5057600080fd5b5062004b5f8a828b0162004a0d565b91505092959891949750929550565b60008060008060008060c0878903121562004b8857600080fd5b62004b9387620047c0565b955062004ba360208801620046cd565b945062004bb360408801620046cd565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004bf157818101518382015260200162004bd7565b50506000910152565b6000815180845262004c1481602086016020860162004bd4565b601f01601f19169290920160200192915050565b602081526000620010f1602083018462004bfa565b6000806040838503121562004c5157600080fd5b62004c5c83620046cd565b946020939093013593505050565b6000806000806060858703121562004c8157600080fd5b843562004c8e81620046b7565b935062004c9e60208601620047c0565b925060408501356001600160401b038082111562004cbb57600080fd5b818701915087601f83011262004cd057600080fd5b81358181111562004ce057600080fd5b88602082850101111562004cf357600080fd5b95989497505060200194505050565b60006020828403121562004d1557600080fd5b81356200498581620046b7565b803560ff811681146200337d57600080fd5b60008060008060008060c0878903121562004d4e57600080fd5b863562004d5b81620046b7565b9550602087013562004d6d81620046b7565b945062004d7d60408801620046cd565b935062004d8d60608801620046cd565b92506080870135915062004da460a0880162004d22565b90509295509295509295565b60008060008060008060c0878903121562004dca57600080fd5b863562004dd781620046b7565b9550602087013562004de981620046b7565b945062004df960408801620046cd565b935062004e096060880162004d22565b92506080870135915060a08701356001600160401b0381111562004e2c57600080fd5b62004e3a89828a0162004a0d565b9150509295509295509295565b8054600090600181811c908083168062004e6257607f831692505b6020808410820362004e8457634e487b7160e01b600052602260045260246000fd5b8388526020880182801562004ea2576001811462004eb95762004ee6565b60ff198716825285151560051b8201975062004ee6565b60008981526020902060005b8781101562004ee05781548482015290860190840162004ec5565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c06040820181905260009062004f219083018762004e47565b828103606084015262004f35818762004e47565b9150508360808301526001600160401b03831660a0830152979650505050505050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004f915762004f9162004f58565b5092915050565b8082028115828204841417620010f457620010f462004f58565b600063ffffffff80831681810362004fce5762004fce62004f58565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620050069083018462004bfa565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c060808201819052600090620050519083018562004bfa565b82810360a084015262005065818562004bfa565b9998505050505050505050565b6001600160401b0382811682821603908082111562004f915762004f9162004f58565b60006001600160401b0380831681810362004fce5762004fce62004f58565b600060208284031215620050c757600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082620050f657620050f6620050ce565b500490565b80820180821115620010f457620010f462004f58565b634e487b7160e01b600052603260045260246000fd5b6000600182016200513c576200513c62004f58565b5060010190565b600082620051555762005155620050ce565b500690565b81810381811115620010f457620010f462004f58565b60008162005182576200518262004f58565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a08201819052600090620052179083018462004bfa565b98975050505050505050565b600082516200523781846020870162004bd4565b9190910192915050565b61032081016103008085843782018360005b60018110156200527457815183526020928301929091019060010162005253565b5050509392505050565b6000602082840312156200529157600080fd5b815180151581146200498557600080fd5b60006001600160401b0380841680620052bf57620052bf620050ce565b9216919091049291505056fe60a06040526040516200092e3803806200092e833981016040819052620000269162000383565b828162000034828262000060565b50506001600160a01b038216608052620000576200005160805190565b620000c6565b50505062000481565b6200006b8262000138565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115620000b857620000b38282620001b8565b505050565b620000c262000235565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620001086000805160206200090e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001358162000257565b50565b806001600160a01b03163b6000036200017457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b031684604051620001d7919062000463565b600060405180830381855af49150503d806000811462000214576040519150601f19603f3d011682016040523d82523d6000602084013e62000219565b606091505b5090925090506200022c8583836200029a565b95945050505050565b3415620002555760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166200028357604051633173bdd160e11b8152600060048201526024016200016b565b806000805160206200090e83398151915262000197565b606082620002b357620002ad8262000300565b620002f9565b8151158015620002cb57506001600160a01b0384163b155b15620002f657604051639996b31560e01b81526001600160a01b03851660048201526024016200016b565b50805b9392505050565b805115620003115780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b03811681146200034257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200037a57818101518382015260200162000360565b50506000910152565b6000806000606084860312156200039957600080fd5b620003a4846200032a565b9250620003b4602085016200032a565b60408501519092506001600160401b0380821115620003d257600080fd5b818601915086601f830112620003e757600080fd5b815181811115620003fc57620003fc62000347565b604051601f8201601f19908116603f0116810190838211818310171562000427576200042762000347565b816040528281528960208487010111156200044157600080fd5b620004548360208301602088016200035d565b80955050505050509250925092565b60008251620004778184602087016200035d565b9190910192915050565b6080516104726200049c6000396000601001526104726000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100e5565b60008061008e36600481846102fd565b81019061009b919061033d565b915091506100a98282610109565b5050565b60006100e07f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610104573d6000f35b3d6000fd5b61011282610164565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561015c5761015782826101e0565b505050565b6100a9610256565b806001600160a01b03163b60000361019f57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101fd919061040d565b600060405180830381855af49150503d8060008114610238576040519150601f19603f3d011682016040523d82523d6000602084013e61023d565b606091505b509150915061024d858383610275565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b60608261028a57610285826102d4565b6102cd565b81511580156102a157506001600160a01b0384163b155b156102ca57604051639996b31560e01b81526001600160a01b0385166004820152602401610196565b50805b9392505050565b8051156102e45780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6000808585111561030d57600080fd5b8386111561031a57600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035057600080fd5b82356001600160a01b038116811461036757600080fd5b9150602083013567ffffffffffffffff8082111561038457600080fd5b818501915085601f83011261039857600080fd5b8135818111156103aa576103aa610327565b604051601f8201601f19908116603f011681019083821181831017156103d2576103d2610327565b816040528281528860208487010111156103eb57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000825160005b8181101561042e5760208186018101518583015201610414565b50600092019182525091905056fea2646970667358221220d51c6fc430c553d1da2391464fd71dbfa43dc91a9531c4d842a3289bb581301664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220088a40e8baaa07c68a28a7d4d3049e902ade8c84c4f07e1bda02246ac30bff2064736f6c63430008140033", - "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620003095760003560e01c806387c20c01116200019d578063c4c928c211620000eb578063dbc16976116200009e578063dbc1697614620009cd578063dde0ff7714620009d7578063e0bfd3d214620009f2578063e46761c41462000a09578063f34eb8eb1462000a31578063f4e926751462000a48578063f9c4c2ae1462000a5957600080fd5b8063c4c928c21462000923578063ceee281d146200093a578063d02103ca1462000963578063d5073f6f146200098b578063d547741f14620009a2578063d939b31514620009b957600080fd5b8063a066215c1162000150578063a066215c1462000797578063a217fddf14620007ae578063a2967d9914620007b7578063a3c573eb14620007c1578063afd23cbe1462000802578063b99d0ad7146200082c578063c1acbc34146200090857600080fd5b806387c20c01146200071a5780638bd4f071146200073157806391d14854146200074857806399f5634e146200075f5780639a908e7314620007695780639c9f3dfe146200078057600080fd5b806325280169116200025b57806360469169116200020e5780636046916914620005c957806365c0504d14620005d35780637222020f1462000682578063727885e914620006995780637975fcfe14620006b05780637fb6e76a14620006d6578063841b24d714620006ff57600080fd5b80632528016914620004825780632f2ff15d146200053757806336568abe146200054e578063394218e91462000565578063477fa270146200057c57806355a71ee0146200058557600080fd5b80631489ed1011620002c05780631489ed1014620003c957806315064c9614620003e05780631608859c14620003ee5780631796a1ae14620004055780631816b7e5146200042c5780632072f6c51462000443578063248a9ca3146200044d57600080fd5b80630645af09146200030e578063066ec0121462000327578063080b311114620003585780630a0d9fbe146200038057806311f6b287146200039b57806312b86e1914620003b2575b600080fd5b620003256200031f366004620046e5565b62000b70565b005b6084546200033b906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b6200036f62000369366004620047d5565b620010d0565b60405190151581526020016200034f565b6085546200033b90600160401b90046001600160401b031681565b6200033b620003ac3660046200480d565b620010fa565b62000325620003c33660046200483e565b6200111a565b62000325620003da366004620048d5565b620012ca565b606f546200036f9060ff1681565b62000325620003ff366004620047d5565b62001460565b607e54620004169063ffffffff1681565b60405163ffffffff90911681526020016200034f565b620003256200043d3660046200495f565b620014f5565b62000325620015a1565b620004736200045e3660046200498c565b60009081526034602052604090206001015490565b6040519081526020016200034f565b6200050362000493366004620047d5565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b039081169183019190915292820151909216908201526060016200034f565b6200032562000548366004620049a6565b62001637565b620003256200055f366004620049a6565b62001660565b6200032562000576366004620049d9565b6200169a565b60865462000473565b6200047362000596366004620047d5565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620004736200174e565b62000638620005e43660046200480d565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c0016200034f565b62000325620006933660046200480d565b62001766565b62000325620006aa36600462004aa1565b62001862565b620006c7620006c136600462004b6e565b62001cdb565b6040516200034f919062004c28565b62000416620006e7366004620049d9565b60836020526000908152604090205463ffffffff1681565b6084546200033b90600160c01b90046001600160401b031681565b620003256200072b366004620048d5565b62001d0e565b62000325620007423660046200483e565b62002038565b6200036f62000759366004620049a6565b620020ee565b6200047362002119565b6200033b6200077a36600462004c3d565b62002200565b6200032562000791366004620049d9565b620023d2565b62000325620007a8366004620049d9565b62002478565b62000473600081565b620004736200251c565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016200034f565b6085546200081890600160801b900461ffff1681565b60405161ffff90911681526020016200034f565b620008c26200083d366004620047d5565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b6040516200034f919060006080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200033b90600160801b90046001600160401b031681565b620003256200093436600462004c6a565b620028f1565b620004166200094b36600462004d02565b60826020526000908152604090205463ffffffff1681565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b620003256200099c3660046200498c565b62002bd0565b62000325620009b3366004620049a6565b62002c6c565b6085546200033b906001600160401b031681565b6200032562002c95565b6084546200033b90600160401b90046001600160401b031681565b6200032562000a0336600462004d34565b62002d43565b620007e97f000000000000000000000000000000000000000000000000000000000000000081565b6200032562000a4236600462004db0565b62002dde565b608054620004169063ffffffff1681565b62000af062000a6a3660046200480d565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff16610160820152610180016200034f565b600054600290610100900460ff1615801562000b93575060005460ff8083169116105b62000bfc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c7d62002fda565b62000c9860008051602062005c3a8339815191528c62003047565b62000ca560008862003047565b62000cd17fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908862003047565b62000cfd7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8862003047565b62000d297f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8862003047565b62000d557fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8962003047565b62000d817fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088962003047565b62000dad7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48962003047565b62000dc860008051602062005bfa8339815191528962003047565b62000e0360008051602062005c3a8339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062003053565b62000e2f7f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08962003047565b62000e5b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8962003047565b62000e9660008051602062005c1a8339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162003053565b62000eb160008051602062005c1a8339815191528762003047565b62000edd7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518762003047565b6073546074546001600160401b03600160401b9092048216911680821462000f1857604051632e4cc54360e11b815260040160405180910390fd5b600062000f40888888886000607460009054906101000a90046001600160401b03166200309e565b6001600160401b03838116600081815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068b018054909216909417938802939093179092556007880180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81529596506001600160a01b038e81169663bb59070896620010439694831695600160581b90950490921693607693607793909291169060040162004ef3565b600060405180830381600087803b1580156200105e57600080fd5b505af115801562001073573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620010bb9050565b60405180910390a15050505050505050505050565b63ffffffff82166000908152608160205260408120620010f19083620032cc565b90505b92915050565b63ffffffff81166000908152608160205260408120620010f49062003311565b60008051602062005c3a833981519152620011358162003382565b63ffffffff891660009081526081602052604090206200115c818a8a8a8a8a8a8a6200338e565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b90041615620011c4576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620011fd6200251c565b6040518263ffffffff1660e01b81526004016200121c91815260200190565b600060405180830381600087803b1580156200123757600080fd5b505af11580156200124c573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005c3a833981519152620012e58162003382565b63ffffffff891660009081526081602052604090206200130c818a8a8a8a8a8a8a62003727565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562001374576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620013ad6200251c565b6040518263ffffffff1660e01b8152600401620013cc91815260200190565b600060405180830381600087803b158015620013e757600080fd5b505af1158015620013fc573d6000803e3d6000fd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff821660009081526081602052604090206200149060008051602062005c3a83398151915233620020ee565b620014e457606f5460ff1615620014ba57604051630bc011ff60e21b815260040160405180910390fd5b620014c68183620032cc565b620014e457604051630674f25160e11b815260040160405180910390fd5b620014f0818362003b35565b505050565b60008051602062005bfa833981519152620015108162003382565b6103e88261ffff1610806200152a57506103ff8261ffff16115b156200154957604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620015bc60008051602062005c1a83398151915233620020ee565b6200162b57608454600160801b90046001600160401b031615806200160c57506084544290620016019062093a8090600160801b90046001600160401b031662004f6e565b6001600160401b0316115b156200162b5760405163692baaad60e11b815260040160405180910390fd5b6200163562003d27565b565b600082815260346020526040902060010154620016548162003382565b620014f0838362003da6565b6001600160a01b03811633146200168a57604051630b4ad1cd60e31b815260040160405180910390fd5b62001696828262003e12565b5050565b60008051602062005bfa833981519152620016b58162003382565b606f5460ff16620016f7576084546001600160401b03600160c01b909104811690831610620016f75760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19060200162001595565b6000608654606462001761919062004f98565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd620017928162003382565b63ffffffff82161580620017b15750607e5463ffffffff908116908316115b15620017d057604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200181757604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd086200188e8162003382565b63ffffffff88161580620018ad5750607e5463ffffffff908116908916115b15620018cc57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff16151590036200191357604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001951576040516337c8fe0960e11b815260040160405180910390fd5b608080546000919082906200196c9063ffffffff1662004fb2565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b03909216913091620019ba90620046a9565b620019c89392919062004fd8565b604051809103906000f080158015620019e5573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001c59949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001c99908d908d9088908e908e908e906004016200500f565b600060405180830381600087803b15801562001cb457600080fd5b505af115801562001cc9573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001d0390878787878762003e7c565b979650505050505050565b606f5460ff161562001d3357604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001d8292600160c01b90048116911662004f6e565b6001600160401b0316111562001dab57604051638a0704d360e01b815260040160405180910390fd5b6103e862001dba888862005072565b6001600160401b0316111562001de357604051635acfba9d60e11b815260040160405180910390fd5b62001df5818989898989898962003727565b62001e01818762003fbc565b6085546001600160401b031660000362001f0f57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001e7d576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001eb66200251c565b6040518263ffffffff1660e01b815260040162001ed591815260200190565b600060405180830381600087803b15801562001ef057600080fd5b505af115801562001f05573d6000803e3d6000fd5b5050505062001fd9565b62001f1a81620041b9565b600681018054600160801b90046001600160401b031690601062001f3e8362005095565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff16156200205d57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602052604090206200208481898989898989896200338e565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620020e362003d27565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b815230600482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562002183573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620021a99190620050b4565b608454909150600090620021d0906001600160401b03600160401b82048116911662005072565b6001600160401b0316905080600003620021ed5760009250505090565b620021f98183620050e4565b9250505090565b606f5460009060ff16156200222857604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362002260576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200228b57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620022be9084906001600160401b031662004f6e565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620022f4878362004f6e565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200238483620041b9565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b60008051602062005bfa833981519152620023ed8162003382565b606f5460ff1662002428576085546001600160401b0390811690831610620024285760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759060200162001595565b60008051602062005bfa833981519152620024938162003382565b62015180826001600160401b03161115620024c157604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289060200162001595565b60805460009063ffffffff168082036200253857506000919050565b6000816001600160401b03811115620025555762002555620049f7565b6040519080825280602002602001820160405280156200257f578160200160208202803683370190505b50905060005b82811015620025f257608160006200259f836001620050fb565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620025d257620025d262005111565b602090810291909101015280620025e98162005127565b91505062002585565b50600060205b836001146200284e5760006200261060028662005143565b6200261d600287620050e4565b620026299190620050fb565b90506000816001600160401b03811115620026485762002648620049f7565b60405190808252806020026020018201604052801562002672578160200160208202803683370190505b50905060005b82811015620027fa576200268e6001846200515a565b81148015620026a95750620026a560028862005143565b6001145b15620027315785620026bd82600262004f98565b81518110620026d057620026d062005111565b602002602001015185604051602001620026f4929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106200271f576200271f62005111565b602002602001018181525050620027e5565b856200273f82600262004f98565b8151811062002752576200275262005111565b6020026020010151868260026200276a919062004f98565b62002777906001620050fb565b815181106200278a576200278a62005111565b6020026020010151604051602001620027ad929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620027d857620027d862005111565b6020026020010181815250505b80620027f18162005127565b91505062002678565b5080945081955083846040516020016200281e929190918252602082015260400190565b6040516020818303038152906040528051906020012093508280620028439062005170565b9350505050620025f8565b60008360008151811062002866576200286662005111565b6020026020010151905060005b82811015620028e757604080516020810184905290810185905260600160408051601f19818403018152828252805160209182012090830187905290820186905292506060016040516020818303038152906040528051906020012093508080620028de9062005127565b91505062002873565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac6200291d8162003382565b63ffffffff841615806200293c5750607e5463ffffffff908116908516115b156200295b57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff16908190036200299c576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b031603620029eb57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002a3257604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002a7057604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002af084620010fa565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002b469216908b908b906004016200518a565b600060405180830381600087803b15801562002b6157600080fd5b505af115801562002b76573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002bfc8162003382565b683635c9adc5dea0000082118062002c175750633b9aca0082105b1562002c3657604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001595565b60008281526034602052604090206001015462002c898162003382565b620014f0838362003e12565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002cc18162003382565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002d1d57600080fd5b505af115801562002d32573d6000803e3d6000fd5b5050505062002d4062004284565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62002d6f8162003382565b6001600160401b03841660009081526083602052604090205463ffffffff161562002dad576040516337c8fe0960e11b815260040160405180910390fd5b600062002dc0888888888760006200309e565b60008080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002e0a8162003382565b607e805460009190829062002e259063ffffffff1662004fb2565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002fc896959493929190620051ca565b60405180910390a25050505050505050565b600054610100900460ff16620016355760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000bf3565b62001696828262003da6565b600082815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6080805460009182918290620030ba9063ffffffff1662004fb2565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000876001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff16021790555080608260008a6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150878260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550868260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620032b99594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b03828116600090815260048501602052604081205490924292620032ff92918116911662004f6e565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b03161562003365575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002d408133620042dd565b60078801546000906001600160401b039081169087161015620033c45760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620034655760068901546001600160401b03600160801b909104811690891611156200340e5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200345e57604051632bd2e3e760e01b815260040160405180910390fd5b50620034da565b506001600160401b038516600090815260028901602052604090205480620034a0576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620034da57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620035135750876001600160401b0316876001600160401b031611155b8062003537575060068901546001600160401b03600160c01b909104811690881611155b15620035565760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b90048116908616146200359d576040516332a2a77f60e01b815260040160405180910390fd5b6000620035af8a888888868962003e7c565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620035e6919062005223565b602060405180830381855afa15801562003604573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620036299190620050b4565b62003635919062005143565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620036799188919060040162005241565b602060405180830381865afa15801562003697573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620036bd91906200527e565b620036db576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c0160205260409020600201548590036200371a5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620037358a62003311565b60078b01549091506001600160401b0390811690891610156200376b5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038916156200380e5760068a01546001600160401b03600160801b9091048116908a161115620037b55760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200380757604051632bd2e3e760e01b815260040160405180910390fd5b506200387e565b6001600160401b038816600090815260028b0160205260409020549150816200384a576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200387e57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620038b15760405163b9b18f5760e01b815260040160405180910390fd5b6000620038c38b8a8a8a878b62003e7c565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620038fa919062005223565b602060405180830381855afa15801562003918573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200393d9190620050b4565b62003949919062005143565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200398d9189919060040162005241565b602060405180830381865afa158015620039ab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620039d191906200527e565b620039ef576040516309bde33960e01b815260040160405180910390fd5b6000620039fd848b62005072565b905062003a5687826001600160401b031662003a1862002119565b62003a24919062004f98565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004307565b80608460088282829054906101000a90046001600160401b031662003a7c919062004f6e565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b15801562003b0d57600080fd5b505af115801562003b22573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003b74575060068201546001600160401b03600160801b9091048116908216115b1562003b935760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003c4f6200251c565b6040518263ffffffff1660e01b815260040162003c6e91815260200190565b600060405180830381600087803b15801562003c8957600080fd5b505af115801562003c9e573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003d8357600080fd5b505af115801562003d98573d6000803e3d6000fd5b50505050620016356200435b565b62003db28282620020ee565b620016965760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003e1e8282620020ee565b15620016965760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003eb2575081155b1562003ed15760405163340c614f60e11b815260040160405180910390fd5b8062003ef0576040516366385b5160e01b815260040160405180910390fd5b62003efb84620043b8565b62003f19576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b600062003fc98362003311565b90508160008062003fdb848462005072565b6085546001600160401b0391821692506000916200400291600160401b900416426200515a565b90505b846001600160401b0316846001600160401b0316146200408c576001600160401b0380851660009081526003890160205260409020600181015490911682101562004067576001810154600160401b90046001600160401b0316945062004085565b62004073868662005072565b6001600160401b03169350506200408c565b5062004005565b60006200409a84846200515a565b905083811015620040f857808403600c8111620040b85780620040bb565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620040ed57620040ed620050ce565b046086555062004170565b838103600c81116200410b57806200410e565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a76400000281620041485762004148620050ce565b04905080608654670de0b6b3a76400000281620041695762004169620050ce565b0460865550505b683635c9adc5dea0000060865411156200419757683635c9adc5dea00000608655620041af565b633b9aca006086541015620041af57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002d405760068101546000906200420490600160c01b90046001600160401b0316600162004f6e565b9050620042128282620032cc565b156200169657600682015460009060029062004240908490600160801b90046001600160401b031662005072565b6200424c9190620052a2565b62004258908362004f6e565b9050620042668382620032cc565b156200427857620014f0838262003b35565b620014f0838362003b35565b606f5460ff16620042a857604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b620042e98282620020ee565b6200169657604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620014f09084906200443e565b606f5460ff16156200438057604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b038316108015620043ef575067ffffffff00000001604083901c6001600160401b0316105b801562004410575067ffffffff00000001608083901c6001600160401b0316105b801562004428575067ffffffff0000000160c083901c105b156200443657506001919050565b506000919050565b600062004495826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620045179092919063ffffffff16565b805190915015620014f05780806020019051810190620044b691906200527e565b620014f05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000bf3565b606062004528848460008562004530565b949350505050565b606082471015620045935760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000bf3565b600080866001600160a01b03168587604051620045b1919062005223565b60006040518083038185875af1925050503d8060008114620045f0576040519150601f19603f3d011682016040523d82523d6000602084013e620045f5565b606091505b509150915062001d038783838760608315620046765782516000036200466e576001600160a01b0385163b6200466e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000bf3565b508162004528565b6200452883838151156200468d5781518083602001fd5b8060405162461bcd60e51b815260040162000bf3919062004c28565b61092e80620052cc83390190565b6001600160a01b038116811462002d4057600080fd5b80356001600160401b03811681146200337d57600080fd5b6000806000806000806000806000806101408b8d0312156200470657600080fd5b8a356200471381620046b7565b99506200472360208c01620046cd565b98506200473360408c01620046cd565b975060608b01356200474581620046b7565b965060808b01356200475781620046b7565b955060a08b01356200476981620046b7565b945060c08b01356200477b81620046b7565b935060e08b01356200478d81620046b7565b92506200479e6101008c01620046cd565b9150620047af6101208c01620046cd565b90509295989b9194979a5092959850565b803563ffffffff811681146200337d57600080fd5b60008060408385031215620047e957600080fd5b620047f483620047c0565b91506200480460208401620046cd565b90509250929050565b6000602082840312156200482057600080fd5b620010f182620047c0565b806103008101831015620010f457600080fd5b6000806000806000806000806103e0898b0312156200485c57600080fd5b6200486789620047c0565b97506200487760208a01620046cd565b96506200488760408a01620046cd565b95506200489760608a01620046cd565b9450620048a760808a01620046cd565b935060a0890135925060c08901359150620048c68a60e08b016200482b565b90509295985092959890939650565b6000806000806000806000806103e0898b031215620048f357600080fd5b620048fe89620047c0565b97506200490e60208a01620046cd565b96506200491e60408a01620046cd565b95506200492e60608a01620046cd565b94506080890135935060a0890135925060c08901356200494e81620046b7565b9150620048c68a60e08b016200482b565b6000602082840312156200497257600080fd5b813561ffff811681146200498557600080fd5b9392505050565b6000602082840312156200499f57600080fd5b5035919050565b60008060408385031215620049ba57600080fd5b823591506020830135620049ce81620046b7565b809150509250929050565b600060208284031215620049ec57600080fd5b620010f182620046cd565b634e487b7160e01b600052604160045260246000fd5b600082601f83011262004a1f57600080fd5b81356001600160401b038082111562004a3c5762004a3c620049f7565b604051601f8301601f19908116603f0116810190828211818310171562004a675762004a67620049f7565b8160405283815286602085880101111562004a8157600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121562004abd57600080fd5b62004ac888620047c0565b965062004ad860208901620046cd565b9550604088013562004aea81620046b7565b9450606088013562004afc81620046b7565b9350608088013562004b0e81620046b7565b925060a08801356001600160401b038082111562004b2b57600080fd5b62004b398b838c0162004a0d565b935060c08a013591508082111562004b5057600080fd5b5062004b5f8a828b0162004a0d565b91505092959891949750929550565b60008060008060008060c0878903121562004b8857600080fd5b62004b9387620047c0565b955062004ba360208801620046cd565b945062004bb360408801620046cd565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004bf157818101518382015260200162004bd7565b50506000910152565b6000815180845262004c1481602086016020860162004bd4565b601f01601f19169290920160200192915050565b602081526000620010f1602083018462004bfa565b6000806040838503121562004c5157600080fd5b62004c5c83620046cd565b946020939093013593505050565b6000806000806060858703121562004c8157600080fd5b843562004c8e81620046b7565b935062004c9e60208601620047c0565b925060408501356001600160401b038082111562004cbb57600080fd5b818701915087601f83011262004cd057600080fd5b81358181111562004ce057600080fd5b88602082850101111562004cf357600080fd5b95989497505060200194505050565b60006020828403121562004d1557600080fd5b81356200498581620046b7565b803560ff811681146200337d57600080fd5b60008060008060008060c0878903121562004d4e57600080fd5b863562004d5b81620046b7565b9550602087013562004d6d81620046b7565b945062004d7d60408801620046cd565b935062004d8d60608801620046cd565b92506080870135915062004da460a0880162004d22565b90509295509295509295565b60008060008060008060c0878903121562004dca57600080fd5b863562004dd781620046b7565b9550602087013562004de981620046b7565b945062004df960408801620046cd565b935062004e096060880162004d22565b92506080870135915060a08701356001600160401b0381111562004e2c57600080fd5b62004e3a89828a0162004a0d565b9150509295509295509295565b8054600090600181811c908083168062004e6257607f831692505b6020808410820362004e8457634e487b7160e01b600052602260045260246000fd5b8388526020880182801562004ea2576001811462004eb95762004ee6565b60ff198716825285151560051b8201975062004ee6565b60008981526020902060005b8781101562004ee05781548482015290860190840162004ec5565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c06040820181905260009062004f219083018762004e47565b828103606084015262004f35818762004e47565b9150508360808301526001600160401b03831660a0830152979650505050505050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004f915762004f9162004f58565b5092915050565b8082028115828204841417620010f457620010f462004f58565b600063ffffffff80831681810362004fce5762004fce62004f58565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620050069083018462004bfa565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c060808201819052600090620050519083018562004bfa565b82810360a084015262005065818562004bfa565b9998505050505050505050565b6001600160401b0382811682821603908082111562004f915762004f9162004f58565b60006001600160401b0380831681810362004fce5762004fce62004f58565b600060208284031215620050c757600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082620050f657620050f6620050ce565b500490565b80820180821115620010f457620010f462004f58565b634e487b7160e01b600052603260045260246000fd5b6000600182016200513c576200513c62004f58565b5060010190565b600082620051555762005155620050ce565b500690565b81810381811115620010f457620010f462004f58565b60008162005182576200518262004f58565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a08201819052600090620052179083018462004bfa565b98975050505050505050565b600082516200523781846020870162004bd4565b9190910192915050565b61032081016103008085843782018360005b60018110156200527457815183526020928301929091019060010162005253565b5050509392505050565b6000602082840312156200529157600080fd5b815180151581146200498557600080fd5b60006001600160401b0380841680620052bf57620052bf620050ce565b9216919091049291505056fe60a06040526040516200092e3803806200092e833981016040819052620000269162000383565b828162000034828262000060565b50506001600160a01b038216608052620000576200005160805190565b620000c6565b50505062000481565b6200006b8262000138565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115620000b857620000b38282620001b8565b505050565b620000c262000235565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620001086000805160206200090e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001358162000257565b50565b806001600160a01b03163b6000036200017457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b031684604051620001d7919062000463565b600060405180830381855af49150503d806000811462000214576040519150601f19603f3d011682016040523d82523d6000602084013e62000219565b606091505b5090925090506200022c8583836200029a565b95945050505050565b3415620002555760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166200028357604051633173bdd160e11b8152600060048201526024016200016b565b806000805160206200090e83398151915262000197565b606082620002b357620002ad8262000300565b620002f9565b8151158015620002cb57506001600160a01b0384163b155b15620002f657604051639996b31560e01b81526001600160a01b03851660048201526024016200016b565b50805b9392505050565b805115620003115780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b03811681146200034257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200037a57818101518382015260200162000360565b50506000910152565b6000806000606084860312156200039957600080fd5b620003a4846200032a565b9250620003b4602085016200032a565b60408501519092506001600160401b0380821115620003d257600080fd5b818601915086601f830112620003e757600080fd5b815181811115620003fc57620003fc62000347565b604051601f8201601f19908116603f0116810190838211818310171562000427576200042762000347565b816040528281528960208487010111156200044157600080fd5b620004548360208301602088016200035d565b80955050505050509250925092565b60008251620004778184602087016200035d565b9190910192915050565b6080516104726200049c6000396000601001526104726000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100e5565b60008061008e36600481846102fd565b81019061009b919061033d565b915091506100a98282610109565b5050565b60006100e07f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610104573d6000f35b3d6000fd5b61011282610164565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561015c5761015782826101e0565b505050565b6100a9610256565b806001600160a01b03163b60000361019f57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101fd919061040d565b600060405180830381855af49150503d8060008114610238576040519150601f19603f3d011682016040523d82523d6000602084013e61023d565b606091505b509150915061024d858383610275565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b60608261028a57610285826102d4565b6102cd565b81511580156102a157506001600160a01b0384163b155b156102ca57604051639996b31560e01b81526001600160a01b0385166004820152602401610196565b50805b9392505050565b8051156102e45780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6000808585111561030d57600080fd5b8386111561031a57600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035057600080fd5b82356001600160a01b038116811461036757600080fd5b9150602083013567ffffffffffffffff8082111561038457600080fd5b818501915085601f83011261039857600080fd5b8135818111156103aa576103aa610327565b604051601f8201601f19908116603f011681019083821181831017156103d2576103d2610327565b816040528281528860208487010111156103eb57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000825160005b8181101561042e5760208186018101518583015201610414565b50600092019182525091905056fea2646970667358221220d51c6fc430c553d1da2391464fd71dbfa43dc91a9531c4d842a3289bb581301664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220088a40e8baaa07c68a28a7d4d3049e902ade8c84c4f07e1bda02246ac30bff2064736f6c63430008140033", + "bytecode": "0x60e06040523480156200001157600080fd5b5060405162005f3638038062005f3683398101604081905262000034916200013b565b6001600160a01b0380841660805282811660c052811660a0526200005762000060565b5050506200018f565b600054610100900460ff1615620000cd5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000120576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013857600080fd5b50565b6000806000606084860312156200015157600080fd5b83516200015e8162000122565b6020850151909350620001718162000122565b6040850151909250620001848162000122565b809150509250925092565b60805160a05160c051615d3f620001f760003960008181610a2f0152818161218b0152613ade0152600081816107e701528181612d3f0152613dd9015260008181610989015281816111e60152818161139601528181611ecf0152613cc80152615d3f6000f3fe60806040523480156200001157600080fd5b5060043610620003155760003560e01c8063841b24d711620001a9578063c1acbc3411620000f7578063dbc16976116200009e578063dbc1697614620009ed578063dde0ff7714620009f7578063e0bfd3d21462000a12578063e46761c41462000a29578063f34eb8eb1462000a51578063f4e926751462000a68578063f9c4c2ae1462000a7957600080fd5b8063c1acbc341462000928578063c4c928c21462000943578063ceee281d146200095a578063d02103ca1462000983578063d5073f6f14620009ab578063d547741f14620009c2578063d939b31514620009d957600080fd5b80639c9f3dfe116200015c5780639c9f3dfe14620007a0578063a066215c14620007b7578063a217fddf14620007ce578063a2967d9914620007d7578063a3c573eb14620007e1578063afd23cbe1462000822578063b99d0ad7146200084c57600080fd5b8063841b24d7146200071f57806387c20c01146200073a5780638bd4f071146200075157806391d14854146200076857806399f5634e146200077f5780639a908e73146200078957600080fd5b806325280169116200026757806355a71ee0116200021a57806355a71ee014620005a55780636046916914620005e957806365c0504d14620005f35780637222020f14620006a2578063727885e914620006b95780637975fcfe14620006d05780637fb6e76a14620006f657600080fd5b806325280169146200048e5780632f2ff15d146200054357806330c27dde146200055a57806336568abe146200056e578063394218e91462000585578063477fa270146200059c57600080fd5b80631489ed1011620002cc5780631489ed1014620003d557806315064c9614620003ec5780631608859c14620003fa5780631796a1ae14620004115780631816b7e514620004385780632072f6c5146200044f578063248a9ca3146200045957600080fd5b80630645af09146200031a578063066ec0121462000333578063080b311114620003645780630a0d9fbe146200038c57806311f6b28714620003a757806312b86e1914620003be575b600080fd5b620003316200032b36600462004795565b62000b90565b005b60845462000347906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b6200037b6200037536600462004885565b620010f0565b60405190151581526020016200035b565b6085546200034790600160401b90046001600160401b031681565b62000347620003b8366004620048bd565b6200111a565b62000331620003cf366004620048ee565b6200113a565b62000331620003e636600462004985565b620012ea565b606f546200037b9060ff1681565b620003316200040b36600462004885565b62001480565b607e54620004229063ffffffff1681565b60405163ffffffff90911681526020016200035b565b620003316200044936600462004a0f565b62001515565b62000331620015c1565b6200047f6200046a36600462004a3c565b60009081526034602052604090206001015490565b6040519081526020016200035b565b6200050f6200049f36600462004885565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b039081169183019190915292820151909216908201526060016200035b565b620003316200055436600462004a56565b62001687565b60875462000347906001600160401b031681565b620003316200057f36600462004a56565b620016b0565b620003316200059636600462004a89565b620016ea565b6086546200047f565b6200047f620005b636600462004885565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b6200047f6200179e565b6200065862000604366004620048bd565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c0016200035b565b62000331620006b3366004620048bd565b620017b6565b62000331620006ca36600462004b51565b620018b2565b620006e7620006e136600462004c1e565b62001d2b565b6040516200035b919062004cd8565b620004226200070736600462004a89565b60836020526000908152604090205463ffffffff1681565b6084546200034790600160c01b90046001600160401b031681565b620003316200074b36600462004985565b62001d5e565b6200033162000762366004620048ee565b62002088565b6200037b6200077936600462004a56565b6200213e565b6200047f62002169565b620003476200079a36600462004ced565b62002250565b62000331620007b136600462004a89565b62002422565b62000331620007c836600462004a89565b620024c8565b6200047f600081565b6200047f6200256c565b620008097f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016200035b565b6085546200083890600160801b900461ffff1681565b60405161ffff90911681526020016200035b565b620008e26200085d36600462004885565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b6040516200035b919060006080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200034790600160801b90046001600160401b031681565b620003316200095436600462004d1a565b62002941565b620004226200096b36600462004db2565b60826020526000908152604090205463ffffffff1681565b620008097f000000000000000000000000000000000000000000000000000000000000000081565b62000331620009bc36600462004a3c565b62002c20565b62000331620009d336600462004a56565b62002cbc565b60855462000347906001600160401b031681565b6200033162002ce5565b6084546200034790600160401b90046001600160401b031681565b6200033162000a2336600462004de4565b62002db5565b620008097f000000000000000000000000000000000000000000000000000000000000000081565b6200033162000a6236600462004e60565b62002e8e565b608054620004229063ffffffff1681565b62000b1062000a8a366004620048bd565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff16610160820152610180016200035b565b600054600290610100900460ff1615801562000bb3575060005460ff8083169116105b62000c1c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c9d6200308a565b62000cb860008051602062005cea8339815191528c620030f7565b62000cc5600088620030f7565b62000cf17fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59088620030f7565b62000d1d7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e88620030f7565b62000d497f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac88620030f7565b62000d757fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd89620030f7565b62000da17fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd0889620030f7565b62000dcd7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f489620030f7565b62000de860008051602062005caa83398151915289620030f7565b62000e2360008051602062005cea8339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062003103565b62000e4f7f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f089620030f7565b62000e7b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb89620030f7565b62000eb660008051602062005cca8339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162003103565b62000ed160008051602062005cca83398151915287620030f7565b62000efd7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595187620030f7565b6073546074546001600160401b03600160401b9092048216911680821462000f3857604051632e4cc54360e11b815260040160405180910390fd5b600062000f60888888886000607460009054906101000a90046001600160401b03166200314e565b6001600160401b03838116600081815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068b018054909216909417938802939093179092556007880180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81529596506001600160a01b038e81169663bb59070896620010639694831695600160581b90950490921693607693607793909291169060040162004fa3565b600060405180830381600087803b1580156200107e57600080fd5b505af115801562001093573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620010db9050565b60405180910390a15050505050505050505050565b63ffffffff821660009081526081602052604081206200111190836200337c565b90505b92915050565b63ffffffff811660009081526081602052604081206200111490620033c1565b60008051602062005cea833981519152620011558162003432565b63ffffffff891660009081526081602052604090206200117c818a8a8a8a8a8a8a6200343e565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b90041615620011e4576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200121d6200256c565b6040518263ffffffff1660e01b81526004016200123c91815260200190565b600060405180830381600087803b1580156200125757600080fd5b505af11580156200126c573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005cea833981519152620013058162003432565b63ffffffff891660009081526081602052604090206200132c818a8a8a8a8a8a8a620037d7565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562001394576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620013cd6200256c565b6040518263ffffffff1660e01b8152600401620013ec91815260200190565b600060405180830381600087803b1580156200140757600080fd5b505af11580156200141c573d6000803e3d6000fd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff82166000908152608160205260409020620014b060008051602062005cea833981519152336200213e565b6200150457606f5460ff1615620014da57604051630bc011ff60e21b815260040160405180910390fd5b620014e681836200337c565b6200150457604051630674f25160e11b815260040160405180910390fd5b62001510818362003be5565b505050565b60008051602062005caa833981519152620015308162003432565b6103e88261ffff1610806200154a57506103ff8261ffff16115b156200156957604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620015dc60008051602062005cca833981519152336200213e565b6200167b57608454600160801b90046001600160401b031615806200162c57506084544290620016219062093a8090600160801b90046001600160401b03166200501e565b6001600160401b0316115b806200165c57506087544290620016519062093a80906001600160401b03166200501e565b6001600160401b0316115b156200167b5760405163692baaad60e11b815260040160405180910390fd5b6200168562003dd7565b565b600082815260346020526040902060010154620016a48162003432565b62001510838362003e56565b6001600160a01b0381163314620016da57604051630b4ad1cd60e31b815260040160405180910390fd5b620016e6828262003ec2565b5050565b60008051602062005caa833981519152620017058162003432565b606f5460ff1662001747576084546001600160401b03600160c01b909104811690831610620017475760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001620015b5565b60006086546064620017b1919062005048565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd620017e28162003432565b63ffffffff82161580620018015750607e5463ffffffff908116908316115b156200182057604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200186757604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08620018de8162003432565b63ffffffff88161580620018fd5750607e5463ffffffff908116908916115b156200191c57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff16151590036200196357604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff1615620019a1576040516337c8fe0960e11b815260040160405180910390fd5b60808054600091908290620019bc9063ffffffff1662005062565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001a0a9062004759565b62001a189392919062005088565b604051809103906000f08015801562001a35573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001ca9949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001ce9908d908d9088908e908e908e90600401620050bf565b600060405180830381600087803b15801562001d0457600080fd5b505af115801562001d19573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001d5390878787878762003f2c565b979650505050505050565b606f5460ff161562001d8357604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001dd292600160c01b9004811691166200501e565b6001600160401b0316111562001dfb57604051638a0704d360e01b815260040160405180910390fd5b6103e862001e0a888862005122565b6001600160401b0316111562001e3357604051635acfba9d60e11b815260040160405180910390fd5b62001e458189898989898989620037d7565b62001e5181876200406c565b6085546001600160401b031660000362001f5f57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001ecd576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001f066200256c565b6040518263ffffffff1660e01b815260040162001f2591815260200190565b600060405180830381600087803b15801562001f4057600080fd5b505af115801562001f55573d6000803e3d6000fd5b5050505062002029565b62001f6a8162004269565b600681018054600160801b90046001600160401b031690601062001f8e8362005145565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff1615620020ad57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88166000908152608160205260409020620020d481898989898989896200343e565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16200213362003dd7565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b815230600482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015620021d3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620021f9919062005164565b60845490915060009062002220906001600160401b03600160401b82048116911662005122565b6001600160401b03169050806000036200223d5760009250505090565b62002249818362005194565b9250505090565b606f5460009060ff16156200227857604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff1690819003620022b0576040516371653c1560e01b815260040160405180910390fd5b836001600160401b0316600003620022db57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff8116600090815260816020526040812060848054919287926200230e9084906001600160401b03166200501e565b82546101009290920a6001600160401b03818102199093169183160217909155600683015416905060006200234487836200501e565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b031990921692909316919091171790559050620023d48362004269565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b60008051602062005caa8339815191526200243d8162003432565b606f5460ff1662002478576085546001600160401b0390811690831610620024785760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001620015b5565b60008051602062005caa833981519152620024e38162003432565b62015180826001600160401b031611156200251157604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001620015b5565b60805460009063ffffffff168082036200258857506000919050565b6000816001600160401b03811115620025a557620025a562004aa7565b604051908082528060200260200182016040528015620025cf578160200160208202803683370190505b50905060005b82811015620026425760816000620025ef836001620051ab565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620026225762002622620051c1565b6020908102919091010152806200263981620051d7565b915050620025d5565b50600060205b836001146200289e57600062002660600286620051f3565b6200266d60028762005194565b620026799190620051ab565b90506000816001600160401b0381111562002698576200269862004aa7565b604051908082528060200260200182016040528015620026c2578160200160208202803683370190505b50905060005b828110156200284a57620026de6001846200520a565b81148015620026f95750620026f5600288620051f3565b6001145b156200278157856200270d82600262005048565b81518110620027205762002720620051c1565b60200260200101518560405160200162002744929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106200276f576200276f620051c1565b60200260200101818152505062002835565b856200278f82600262005048565b81518110620027a257620027a2620051c1565b602002602001015186826002620027ba919062005048565b620027c7906001620051ab565b81518110620027da57620027da620051c1565b6020026020010151604051602001620027fd929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620028285762002828620051c1565b6020026020010181815250505b806200284181620051d7565b915050620026c8565b5080945081955083846040516020016200286e929190918252602082015260400190565b6040516020818303038152906040528051906020012093508280620028939062005220565b935050505062002648565b600083600081518110620028b657620028b6620051c1565b6020026020010151905060005b828110156200293757604080516020810184905290810185905260600160408051601f198184030181528282528051602091820120908301879052908201869052925060600160405160208183030381529060405280519060200120935080806200292e90620051d7565b915050620028c3565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac6200296d8162003432565b63ffffffff841615806200298c5750607e5463ffffffff908116908516115b15620029ab57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff1690819003620029ec576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002a3b57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002a8257604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002ac057604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002b40846200111a565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002b969216908b908b906004016200523a565b600060405180830381600087803b15801562002bb157600080fd5b505af115801562002bc6573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002c4c8162003432565b683635c9adc5dea0000082118062002c675750633b9aca0082105b1562002c8657604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620015b5565b60008281526034602052604090206001015462002cd98162003432565b62001510838362003ec2565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002d118162003432565b6087805467ffffffffffffffff1916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc1697691600480830192600092919082900301818387803b15801562002d8f57600080fd5b505af115801562002da4573d6000803e3d6000fd5b5050505062002db262004334565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62002de18162003432565b6001600160401b03841660009081526083602052604090205463ffffffff161562002e1f576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b03871660009081526082602052604090205463ffffffff161562002e5d57604051630d409b9360e41b815260040160405180910390fd5b600062002e70888888888760006200314e565b60008080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002eba8162003432565b607e805460009190829062002ed59063ffffffff1662005062565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162003078969594939291906200527a565b60405180910390a25050505050505050565b600054610100900460ff16620016855760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000c13565b620016e6828262003e56565b600082815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b60808054600091829182906200316a9063ffffffff1662005062565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000876001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff16021790555080608260008a6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150878260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550868260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620033699594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b03828116600090815260048501602052604081205490924292620033af9291811691166200501e565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b03161562003415575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002db281336200438d565b60078801546000906001600160401b039081169087161015620034745760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620035155760068901546001600160401b03600160801b90910481169089161115620034be5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200350e57604051632bd2e3e760e01b815260040160405180910390fd5b506200358a565b506001600160401b03851660009081526002890160205260409020548062003550576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b909104811690871611156200358a57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620035c35750876001600160401b0316876001600160401b031611155b80620035e7575060068901546001600160401b03600160c01b909104811690881611155b15620036065760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b90048116908616146200364d576040516332a2a77f60e01b815260040160405180910390fd5b60006200365f8a888888868962003f2c565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620036969190620052d3565b602060405180830381855afa158015620036b4573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620036d9919062005164565b620036e59190620051f3565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200372991889190600401620052f1565b602060405180830381865afa15801562003747573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200376d91906200532e565b6200378b576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620037ca5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620037e58a620033c1565b60078b01549091506001600160401b0390811690891610156200381b5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620038be5760068a01546001600160401b03600160801b9091048116908a161115620038655760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620038b757604051632bd2e3e760e01b815260040160405180910390fd5b506200392e565b6001600160401b038816600090815260028b016020526040902054915081620038fa576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200392e57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620039615760405163b9b18f5760e01b815260040160405180910390fd5b6000620039738b8a8a8a878b62003f2c565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620039aa9190620052d3565b602060405180830381855afa158015620039c8573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620039ed919062005164565b620039f99190620051f3565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003a3d91899190600401620052f1565b602060405180830381865afa15801562003a5b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003a8191906200532e565b62003a9f576040516309bde33960e01b815260040160405180910390fd5b600062003aad848b62005122565b905062003b0687826001600160401b031662003ac862002169565b62003ad4919062005048565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620043b7565b80608460088282829054906101000a90046001600160401b031662003b2c91906200501e565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b15801562003bbd57600080fd5b505af115801562003bd2573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003c24575060068201546001600160401b03600160801b9091048116908216115b1562003c435760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003cff6200256c565b6040518263ffffffff1660e01b815260040162003d1e91815260200190565b600060405180830381600087803b15801562003d3957600080fd5b505af115801562003d4e573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003e3357600080fd5b505af115801562003e48573d6000803e3d6000fd5b50505050620016856200440b565b62003e6282826200213e565b620016e65760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003ece82826200213e565b15620016e65760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003f62575081155b1562003f815760405163340c614f60e11b815260040160405180910390fd5b8062003fa0576040516366385b5160e01b815260040160405180910390fd5b62003fab8462004468565b62003fc9576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b60006200407983620033c1565b9050816000806200408b848462005122565b6085546001600160401b039182169250600091620040b291600160401b900416426200520a565b90505b846001600160401b0316846001600160401b0316146200413c576001600160401b0380851660009081526003890160205260409020600181015490911682101562004117576001810154600160401b90046001600160401b0316945062004135565b62004123868662005122565b6001600160401b03169350506200413c565b50620040b5565b60006200414a84846200520a565b905083811015620041a857808403600c81116200416857806200416b565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a60865402816200419d576200419d6200517e565b046086555062004220565b838103600c8111620041bb5780620041be565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a76400000281620041f857620041f86200517e565b04905080608654670de0b6b3a764000002816200421957620042196200517e565b0460865550505b683635c9adc5dea0000060865411156200424757683635c9adc5dea000006086556200425f565b633b9aca0060865410156200425f57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002db2576006810154600090620042b490600160c01b90046001600160401b031660016200501e565b9050620042c282826200337c565b15620016e6576006820154600090600290620042f0908490600160801b90046001600160401b031662005122565b620042fc919062005352565b6200430890836200501e565b90506200431683826200337c565b15620043285762001510838262003be5565b62001510838362003be5565b606f5460ff166200435857604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6200439982826200213e565b620016e657604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905262001510908490620044ee565b606f5460ff16156200443057604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b0383161080156200449f575067ffffffff00000001604083901c6001600160401b0316105b8015620044c0575067ffffffff00000001608083901c6001600160401b0316105b8015620044d8575067ffffffff0000000160c083901c105b15620044e657506001919050565b506000919050565b600062004545826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620045c79092919063ffffffff16565b8051909150156200151057808060200190518101906200456691906200532e565b620015105760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000c13565b6060620045d88484600085620045e0565b949350505050565b606082471015620046435760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000c13565b600080866001600160a01b03168587604051620046619190620052d3565b60006040518083038185875af1925050503d8060008114620046a0576040519150601f19603f3d011682016040523d82523d6000602084013e620046a5565b606091505b509150915062001d538783838760608315620047265782516000036200471e576001600160a01b0385163b6200471e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000c13565b5081620045d8565b620045d883838151156200473d5781518083602001fd5b8060405162461bcd60e51b815260040162000c13919062004cd8565b61092e806200537c83390190565b6001600160a01b038116811462002db257600080fd5b80356001600160401b03811681146200342d57600080fd5b6000806000806000806000806000806101408b8d031215620047b657600080fd5b8a35620047c38162004767565b9950620047d360208c016200477d565b9850620047e360408c016200477d565b975060608b0135620047f58162004767565b965060808b0135620048078162004767565b955060a08b0135620048198162004767565b945060c08b01356200482b8162004767565b935060e08b01356200483d8162004767565b92506200484e6101008c016200477d565b91506200485f6101208c016200477d565b90509295989b9194979a5092959850565b803563ffffffff811681146200342d57600080fd5b600080604083850312156200489957600080fd5b620048a48362004870565b9150620048b4602084016200477d565b90509250929050565b600060208284031215620048d057600080fd5b620011118262004870565b8061030081018310156200111457600080fd5b6000806000806000806000806103e0898b0312156200490c57600080fd5b620049178962004870565b97506200492760208a016200477d565b96506200493760408a016200477d565b95506200494760608a016200477d565b94506200495760808a016200477d565b935060a0890135925060c08901359150620049768a60e08b01620048db565b90509295985092959890939650565b6000806000806000806000806103e0898b031215620049a357600080fd5b620049ae8962004870565b9750620049be60208a016200477d565b9650620049ce60408a016200477d565b9550620049de60608a016200477d565b94506080890135935060a0890135925060c0890135620049fe8162004767565b9150620049768a60e08b01620048db565b60006020828403121562004a2257600080fd5b813561ffff8116811462004a3557600080fd5b9392505050565b60006020828403121562004a4f57600080fd5b5035919050565b6000806040838503121562004a6a57600080fd5b82359150602083013562004a7e8162004767565b809150509250929050565b60006020828403121562004a9c57600080fd5b62001111826200477d565b634e487b7160e01b600052604160045260246000fd5b600082601f83011262004acf57600080fd5b81356001600160401b038082111562004aec5762004aec62004aa7565b604051601f8301601f19908116603f0116810190828211818310171562004b175762004b1762004aa7565b8160405283815286602085880101111562004b3157600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121562004b6d57600080fd5b62004b788862004870565b965062004b88602089016200477d565b9550604088013562004b9a8162004767565b9450606088013562004bac8162004767565b9350608088013562004bbe8162004767565b925060a08801356001600160401b038082111562004bdb57600080fd5b62004be98b838c0162004abd565b935060c08a013591508082111562004c0057600080fd5b5062004c0f8a828b0162004abd565b91505092959891949750929550565b60008060008060008060c0878903121562004c3857600080fd5b62004c438762004870565b955062004c53602088016200477d565b945062004c63604088016200477d565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004ca157818101518382015260200162004c87565b50506000910152565b6000815180845262004cc481602086016020860162004c84565b601f01601f19169290920160200192915050565b60208152600062001111602083018462004caa565b6000806040838503121562004d0157600080fd5b62004d0c836200477d565b946020939093013593505050565b6000806000806060858703121562004d3157600080fd5b843562004d3e8162004767565b935062004d4e6020860162004870565b925060408501356001600160401b038082111562004d6b57600080fd5b818701915087601f83011262004d8057600080fd5b81358181111562004d9057600080fd5b88602082850101111562004da357600080fd5b95989497505060200194505050565b60006020828403121562004dc557600080fd5b813562004a358162004767565b803560ff811681146200342d57600080fd5b60008060008060008060c0878903121562004dfe57600080fd5b863562004e0b8162004767565b9550602087013562004e1d8162004767565b945062004e2d604088016200477d565b935062004e3d606088016200477d565b92506080870135915062004e5460a0880162004dd2565b90509295509295509295565b60008060008060008060c0878903121562004e7a57600080fd5b863562004e878162004767565b9550602087013562004e998162004767565b945062004ea9604088016200477d565b935062004eb96060880162004dd2565b92506080870135915060a08701356001600160401b0381111562004edc57600080fd5b62004eea89828a0162004abd565b9150509295509295509295565b8054600090600181811c908083168062004f1257607f831692505b6020808410820362004f3457634e487b7160e01b600052602260045260246000fd5b8388526020880182801562004f52576001811462004f695762004f96565b60ff198716825285151560051b8201975062004f96565b60008981526020902060005b8781101562004f905781548482015290860190840162004f75565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c06040820181905260009062004fd19083018762004ef7565b828103606084015262004fe5818762004ef7565b9150508360808301526001600160401b03831660a0830152979650505050505050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562005041576200504162005008565b5092915050565b808202811582820484141762001114576200111462005008565b600063ffffffff8083168181036200507e576200507e62005008565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620050b69083018462004caa565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c060808201819052600090620051019083018562004caa565b82810360a084015262005115818562004caa565b9998505050505050505050565b6001600160401b0382811682821603908082111562005041576200504162005008565b60006001600160401b038083168181036200507e576200507e62005008565b6000602082840312156200517757600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082620051a657620051a66200517e565b500490565b8082018082111562001114576200111462005008565b634e487b7160e01b600052603260045260246000fd5b600060018201620051ec57620051ec62005008565b5060010190565b6000826200520557620052056200517e565b500690565b8181038181111562001114576200111462005008565b60008162005232576200523262005008565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a08201819052600090620052c79083018462004caa565b98975050505050505050565b60008251620052e781846020870162004c84565b9190910192915050565b61032081016103008085843782018360005b60018110156200532457815183526020928301929091019060010162005303565b5050509392505050565b6000602082840312156200534157600080fd5b8151801515811462004a3557600080fd5b60006001600160401b03808416806200536f576200536f6200517e565b9216919091049291505056fe60a06040526040516200092e3803806200092e833981016040819052620000269162000383565b828162000034828262000060565b50506001600160a01b038216608052620000576200005160805190565b620000c6565b50505062000481565b6200006b8262000138565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115620000b857620000b38282620001b8565b505050565b620000c262000235565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620001086000805160206200090e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001358162000257565b50565b806001600160a01b03163b6000036200017457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b031684604051620001d7919062000463565b600060405180830381855af49150503d806000811462000214576040519150601f19603f3d011682016040523d82523d6000602084013e62000219565b606091505b5090925090506200022c8583836200029a565b95945050505050565b3415620002555760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166200028357604051633173bdd160e11b8152600060048201526024016200016b565b806000805160206200090e83398151915262000197565b606082620002b357620002ad8262000300565b620002f9565b8151158015620002cb57506001600160a01b0384163b155b15620002f657604051639996b31560e01b81526001600160a01b03851660048201526024016200016b565b50805b9392505050565b805115620003115780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b03811681146200034257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200037a57818101518382015260200162000360565b50506000910152565b6000806000606084860312156200039957600080fd5b620003a4846200032a565b9250620003b4602085016200032a565b60408501519092506001600160401b0380821115620003d257600080fd5b818601915086601f830112620003e757600080fd5b815181811115620003fc57620003fc62000347565b604051601f8201601f19908116603f0116810190838211818310171562000427576200042762000347565b816040528281528960208487010111156200044157600080fd5b620004548360208301602088016200035d565b80955050505050509250925092565b60008251620004778184602087016200035d565b9190910192915050565b6080516104726200049c6000396000601001526104726000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100e5565b60008061008e36600481846102fd565b81019061009b919061033d565b915091506100a98282610109565b5050565b60006100e07f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610104573d6000f35b3d6000fd5b61011282610164565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561015c5761015782826101e0565b505050565b6100a9610256565b806001600160a01b03163b60000361019f57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101fd919061040d565b600060405180830381855af49150503d8060008114610238576040519150601f19603f3d011682016040523d82523d6000602084013e61023d565b606091505b509150915061024d858383610275565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b60608261028a57610285826102d4565b6102cd565b81511580156102a157506001600160a01b0384163b155b156102ca57604051639996b31560e01b81526001600160a01b0385166004820152602401610196565b50805b9392505050565b8051156102e45780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6000808585111561030d57600080fd5b8386111561031a57600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035057600080fd5b82356001600160a01b038116811461036757600080fd5b9150602083013567ffffffffffffffff8082111561038457600080fd5b818501915085601f83011261039857600080fd5b8135818111156103aa576103aa610327565b604051601f8201601f19908116603f011681019083821181831017156103d2576103d2610327565b816040528281528860208487010111156103eb57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000825160005b8181101561042e5760208186018101518583015201610414565b50600092019182525091905056fea2646970667358221220b682b645e70b0310ca18f6b5889dc8bdacf4b460a01fb9d34b74753f65dc9ae364736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a264697066735822122074fa5fae4b7539b28e148b8a0e0cc30e343ede0a3cae2821f306d8c06bd61d4d64736f6c63430008140033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620003155760003560e01c8063841b24d711620001a9578063c1acbc3411620000f7578063dbc16976116200009e578063dbc1697614620009ed578063dde0ff7714620009f7578063e0bfd3d21462000a12578063e46761c41462000a29578063f34eb8eb1462000a51578063f4e926751462000a68578063f9c4c2ae1462000a7957600080fd5b8063c1acbc341462000928578063c4c928c21462000943578063ceee281d146200095a578063d02103ca1462000983578063d5073f6f14620009ab578063d547741f14620009c2578063d939b31514620009d957600080fd5b80639c9f3dfe116200015c5780639c9f3dfe14620007a0578063a066215c14620007b7578063a217fddf14620007ce578063a2967d9914620007d7578063a3c573eb14620007e1578063afd23cbe1462000822578063b99d0ad7146200084c57600080fd5b8063841b24d7146200071f57806387c20c01146200073a5780638bd4f071146200075157806391d14854146200076857806399f5634e146200077f5780639a908e73146200078957600080fd5b806325280169116200026757806355a71ee0116200021a57806355a71ee014620005a55780636046916914620005e957806365c0504d14620005f35780637222020f14620006a2578063727885e914620006b95780637975fcfe14620006d05780637fb6e76a14620006f657600080fd5b806325280169146200048e5780632f2ff15d146200054357806330c27dde146200055a57806336568abe146200056e578063394218e91462000585578063477fa270146200059c57600080fd5b80631489ed1011620002cc5780631489ed1014620003d557806315064c9614620003ec5780631608859c14620003fa5780631796a1ae14620004115780631816b7e514620004385780632072f6c5146200044f578063248a9ca3146200045957600080fd5b80630645af09146200031a578063066ec0121462000333578063080b311114620003645780630a0d9fbe146200038c57806311f6b28714620003a757806312b86e1914620003be575b600080fd5b620003316200032b36600462004795565b62000b90565b005b60845462000347906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b6200037b6200037536600462004885565b620010f0565b60405190151581526020016200035b565b6085546200034790600160401b90046001600160401b031681565b62000347620003b8366004620048bd565b6200111a565b62000331620003cf366004620048ee565b6200113a565b62000331620003e636600462004985565b620012ea565b606f546200037b9060ff1681565b620003316200040b36600462004885565b62001480565b607e54620004229063ffffffff1681565b60405163ffffffff90911681526020016200035b565b620003316200044936600462004a0f565b62001515565b62000331620015c1565b6200047f6200046a36600462004a3c565b60009081526034602052604090206001015490565b6040519081526020016200035b565b6200050f6200049f36600462004885565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b039081169183019190915292820151909216908201526060016200035b565b620003316200055436600462004a56565b62001687565b60875462000347906001600160401b031681565b620003316200057f36600462004a56565b620016b0565b620003316200059636600462004a89565b620016ea565b6086546200047f565b6200047f620005b636600462004885565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b6200047f6200179e565b6200065862000604366004620048bd565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c0016200035b565b62000331620006b3366004620048bd565b620017b6565b62000331620006ca36600462004b51565b620018b2565b620006e7620006e136600462004c1e565b62001d2b565b6040516200035b919062004cd8565b620004226200070736600462004a89565b60836020526000908152604090205463ffffffff1681565b6084546200034790600160c01b90046001600160401b031681565b620003316200074b36600462004985565b62001d5e565b6200033162000762366004620048ee565b62002088565b6200037b6200077936600462004a56565b6200213e565b6200047f62002169565b620003476200079a36600462004ced565b62002250565b62000331620007b136600462004a89565b62002422565b62000331620007c836600462004a89565b620024c8565b6200047f600081565b6200047f6200256c565b620008097f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016200035b565b6085546200083890600160801b900461ffff1681565b60405161ffff90911681526020016200035b565b620008e26200085d36600462004885565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b6040516200035b919060006080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200034790600160801b90046001600160401b031681565b620003316200095436600462004d1a565b62002941565b620004226200096b36600462004db2565b60826020526000908152604090205463ffffffff1681565b620008097f000000000000000000000000000000000000000000000000000000000000000081565b62000331620009bc36600462004a3c565b62002c20565b62000331620009d336600462004a56565b62002cbc565b60855462000347906001600160401b031681565b6200033162002ce5565b6084546200034790600160401b90046001600160401b031681565b6200033162000a2336600462004de4565b62002db5565b620008097f000000000000000000000000000000000000000000000000000000000000000081565b6200033162000a6236600462004e60565b62002e8e565b608054620004229063ffffffff1681565b62000b1062000a8a366004620048bd565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff16610160820152610180016200035b565b600054600290610100900460ff1615801562000bb3575060005460ff8083169116105b62000c1c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c9d6200308a565b62000cb860008051602062005cea8339815191528c620030f7565b62000cc5600088620030f7565b62000cf17fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59088620030f7565b62000d1d7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e88620030f7565b62000d497f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac88620030f7565b62000d757fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd89620030f7565b62000da17fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd0889620030f7565b62000dcd7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f489620030f7565b62000de860008051602062005caa83398151915289620030f7565b62000e2360008051602062005cea8339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062003103565b62000e4f7f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f089620030f7565b62000e7b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb89620030f7565b62000eb660008051602062005cca8339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162003103565b62000ed160008051602062005cca83398151915287620030f7565b62000efd7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595187620030f7565b6073546074546001600160401b03600160401b9092048216911680821462000f3857604051632e4cc54360e11b815260040160405180910390fd5b600062000f60888888886000607460009054906101000a90046001600160401b03166200314e565b6001600160401b03838116600081815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068b018054909216909417938802939093179092556007880180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81529596506001600160a01b038e81169663bb59070896620010639694831695600160581b90950490921693607693607793909291169060040162004fa3565b600060405180830381600087803b1580156200107e57600080fd5b505af115801562001093573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620010db9050565b60405180910390a15050505050505050505050565b63ffffffff821660009081526081602052604081206200111190836200337c565b90505b92915050565b63ffffffff811660009081526081602052604081206200111490620033c1565b60008051602062005cea833981519152620011558162003432565b63ffffffff891660009081526081602052604090206200117c818a8a8a8a8a8a8a6200343e565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b90041615620011e4576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200121d6200256c565b6040518263ffffffff1660e01b81526004016200123c91815260200190565b600060405180830381600087803b1580156200125757600080fd5b505af11580156200126c573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005cea833981519152620013058162003432565b63ffffffff891660009081526081602052604090206200132c818a8a8a8a8a8a8a620037d7565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562001394576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620013cd6200256c565b6040518263ffffffff1660e01b8152600401620013ec91815260200190565b600060405180830381600087803b1580156200140757600080fd5b505af11580156200141c573d6000803e3d6000fd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff82166000908152608160205260409020620014b060008051602062005cea833981519152336200213e565b6200150457606f5460ff1615620014da57604051630bc011ff60e21b815260040160405180910390fd5b620014e681836200337c565b6200150457604051630674f25160e11b815260040160405180910390fd5b62001510818362003be5565b505050565b60008051602062005caa833981519152620015308162003432565b6103e88261ffff1610806200154a57506103ff8261ffff16115b156200156957604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620015dc60008051602062005cca833981519152336200213e565b6200167b57608454600160801b90046001600160401b031615806200162c57506084544290620016219062093a8090600160801b90046001600160401b03166200501e565b6001600160401b0316115b806200165c57506087544290620016519062093a80906001600160401b03166200501e565b6001600160401b0316115b156200167b5760405163692baaad60e11b815260040160405180910390fd5b6200168562003dd7565b565b600082815260346020526040902060010154620016a48162003432565b62001510838362003e56565b6001600160a01b0381163314620016da57604051630b4ad1cd60e31b815260040160405180910390fd5b620016e6828262003ec2565b5050565b60008051602062005caa833981519152620017058162003432565b606f5460ff1662001747576084546001600160401b03600160c01b909104811690831610620017475760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001620015b5565b60006086546064620017b1919062005048565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd620017e28162003432565b63ffffffff82161580620018015750607e5463ffffffff908116908316115b156200182057604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200186757604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08620018de8162003432565b63ffffffff88161580620018fd5750607e5463ffffffff908116908916115b156200191c57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff16151590036200196357604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff1615620019a1576040516337c8fe0960e11b815260040160405180910390fd5b60808054600091908290620019bc9063ffffffff1662005062565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001a0a9062004759565b62001a189392919062005088565b604051809103906000f08015801562001a35573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001ca9949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001ce9908d908d9088908e908e908e90600401620050bf565b600060405180830381600087803b15801562001d0457600080fd5b505af115801562001d19573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001d5390878787878762003f2c565b979650505050505050565b606f5460ff161562001d8357604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001dd292600160c01b9004811691166200501e565b6001600160401b0316111562001dfb57604051638a0704d360e01b815260040160405180910390fd5b6103e862001e0a888862005122565b6001600160401b0316111562001e3357604051635acfba9d60e11b815260040160405180910390fd5b62001e458189898989898989620037d7565b62001e5181876200406c565b6085546001600160401b031660000362001f5f57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001ecd576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001f066200256c565b6040518263ffffffff1660e01b815260040162001f2591815260200190565b600060405180830381600087803b15801562001f4057600080fd5b505af115801562001f55573d6000803e3d6000fd5b5050505062002029565b62001f6a8162004269565b600681018054600160801b90046001600160401b031690601062001f8e8362005145565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff1615620020ad57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88166000908152608160205260409020620020d481898989898989896200343e565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16200213362003dd7565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b815230600482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015620021d3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620021f9919062005164565b60845490915060009062002220906001600160401b03600160401b82048116911662005122565b6001600160401b03169050806000036200223d5760009250505090565b62002249818362005194565b9250505090565b606f5460009060ff16156200227857604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff1690819003620022b0576040516371653c1560e01b815260040160405180910390fd5b836001600160401b0316600003620022db57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff8116600090815260816020526040812060848054919287926200230e9084906001600160401b03166200501e565b82546101009290920a6001600160401b03818102199093169183160217909155600683015416905060006200234487836200501e565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b031990921692909316919091171790559050620023d48362004269565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b60008051602062005caa8339815191526200243d8162003432565b606f5460ff1662002478576085546001600160401b0390811690831610620024785760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001620015b5565b60008051602062005caa833981519152620024e38162003432565b62015180826001600160401b031611156200251157604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001620015b5565b60805460009063ffffffff168082036200258857506000919050565b6000816001600160401b03811115620025a557620025a562004aa7565b604051908082528060200260200182016040528015620025cf578160200160208202803683370190505b50905060005b82811015620026425760816000620025ef836001620051ab565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620026225762002622620051c1565b6020908102919091010152806200263981620051d7565b915050620025d5565b50600060205b836001146200289e57600062002660600286620051f3565b6200266d60028762005194565b620026799190620051ab565b90506000816001600160401b0381111562002698576200269862004aa7565b604051908082528060200260200182016040528015620026c2578160200160208202803683370190505b50905060005b828110156200284a57620026de6001846200520a565b81148015620026f95750620026f5600288620051f3565b6001145b156200278157856200270d82600262005048565b81518110620027205762002720620051c1565b60200260200101518560405160200162002744929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106200276f576200276f620051c1565b60200260200101818152505062002835565b856200278f82600262005048565b81518110620027a257620027a2620051c1565b602002602001015186826002620027ba919062005048565b620027c7906001620051ab565b81518110620027da57620027da620051c1565b6020026020010151604051602001620027fd929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620028285762002828620051c1565b6020026020010181815250505b806200284181620051d7565b915050620026c8565b5080945081955083846040516020016200286e929190918252602082015260400190565b6040516020818303038152906040528051906020012093508280620028939062005220565b935050505062002648565b600083600081518110620028b657620028b6620051c1565b6020026020010151905060005b828110156200293757604080516020810184905290810185905260600160408051601f198184030181528282528051602091820120908301879052908201869052925060600160405160208183030381529060405280519060200120935080806200292e90620051d7565b915050620028c3565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac6200296d8162003432565b63ffffffff841615806200298c5750607e5463ffffffff908116908516115b15620029ab57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff1690819003620029ec576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002a3b57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002a8257604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002ac057604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002b40846200111a565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002b969216908b908b906004016200523a565b600060405180830381600087803b15801562002bb157600080fd5b505af115801562002bc6573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002c4c8162003432565b683635c9adc5dea0000082118062002c675750633b9aca0082105b1562002c8657604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620015b5565b60008281526034602052604090206001015462002cd98162003432565b62001510838362003ec2565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002d118162003432565b6087805467ffffffffffffffff1916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc1697691600480830192600092919082900301818387803b15801562002d8f57600080fd5b505af115801562002da4573d6000803e3d6000fd5b5050505062002db262004334565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62002de18162003432565b6001600160401b03841660009081526083602052604090205463ffffffff161562002e1f576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b03871660009081526082602052604090205463ffffffff161562002e5d57604051630d409b9360e41b815260040160405180910390fd5b600062002e70888888888760006200314e565b60008080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002eba8162003432565b607e805460009190829062002ed59063ffffffff1662005062565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162003078969594939291906200527a565b60405180910390a25050505050505050565b600054610100900460ff16620016855760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000c13565b620016e6828262003e56565b600082815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b60808054600091829182906200316a9063ffffffff1662005062565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000876001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff16021790555080608260008a6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150878260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550868260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620033699594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b03828116600090815260048501602052604081205490924292620033af9291811691166200501e565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b03161562003415575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002db281336200438d565b60078801546000906001600160401b039081169087161015620034745760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620035155760068901546001600160401b03600160801b90910481169089161115620034be5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200350e57604051632bd2e3e760e01b815260040160405180910390fd5b506200358a565b506001600160401b03851660009081526002890160205260409020548062003550576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b909104811690871611156200358a57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620035c35750876001600160401b0316876001600160401b031611155b80620035e7575060068901546001600160401b03600160c01b909104811690881611155b15620036065760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b90048116908616146200364d576040516332a2a77f60e01b815260040160405180910390fd5b60006200365f8a888888868962003f2c565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620036969190620052d3565b602060405180830381855afa158015620036b4573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620036d9919062005164565b620036e59190620051f3565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200372991889190600401620052f1565b602060405180830381865afa15801562003747573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200376d91906200532e565b6200378b576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620037ca5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620037e58a620033c1565b60078b01549091506001600160401b0390811690891610156200381b5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620038be5760068a01546001600160401b03600160801b9091048116908a161115620038655760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620038b757604051632bd2e3e760e01b815260040160405180910390fd5b506200392e565b6001600160401b038816600090815260028b016020526040902054915081620038fa576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200392e57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620039615760405163b9b18f5760e01b815260040160405180910390fd5b6000620039738b8a8a8a878b62003f2c565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620039aa9190620052d3565b602060405180830381855afa158015620039c8573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620039ed919062005164565b620039f99190620051f3565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003a3d91899190600401620052f1565b602060405180830381865afa15801562003a5b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003a8191906200532e565b62003a9f576040516309bde33960e01b815260040160405180910390fd5b600062003aad848b62005122565b905062003b0687826001600160401b031662003ac862002169565b62003ad4919062005048565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620043b7565b80608460088282829054906101000a90046001600160401b031662003b2c91906200501e565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b15801562003bbd57600080fd5b505af115801562003bd2573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003c24575060068201546001600160401b03600160801b9091048116908216115b1562003c435760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003cff6200256c565b6040518263ffffffff1660e01b815260040162003d1e91815260200190565b600060405180830381600087803b15801562003d3957600080fd5b505af115801562003d4e573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003e3357600080fd5b505af115801562003e48573d6000803e3d6000fd5b50505050620016856200440b565b62003e6282826200213e565b620016e65760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003ece82826200213e565b15620016e65760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003f62575081155b1562003f815760405163340c614f60e11b815260040160405180910390fd5b8062003fa0576040516366385b5160e01b815260040160405180910390fd5b62003fab8462004468565b62003fc9576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b60006200407983620033c1565b9050816000806200408b848462005122565b6085546001600160401b039182169250600091620040b291600160401b900416426200520a565b90505b846001600160401b0316846001600160401b0316146200413c576001600160401b0380851660009081526003890160205260409020600181015490911682101562004117576001810154600160401b90046001600160401b0316945062004135565b62004123868662005122565b6001600160401b03169350506200413c565b50620040b5565b60006200414a84846200520a565b905083811015620041a857808403600c81116200416857806200416b565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a60865402816200419d576200419d6200517e565b046086555062004220565b838103600c8111620041bb5780620041be565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a76400000281620041f857620041f86200517e565b04905080608654670de0b6b3a764000002816200421957620042196200517e565b0460865550505b683635c9adc5dea0000060865411156200424757683635c9adc5dea000006086556200425f565b633b9aca0060865410156200425f57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002db2576006810154600090620042b490600160c01b90046001600160401b031660016200501e565b9050620042c282826200337c565b15620016e6576006820154600090600290620042f0908490600160801b90046001600160401b031662005122565b620042fc919062005352565b6200430890836200501e565b90506200431683826200337c565b15620043285762001510838262003be5565b62001510838362003be5565b606f5460ff166200435857604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6200439982826200213e565b620016e657604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905262001510908490620044ee565b606f5460ff16156200443057604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b0383161080156200449f575067ffffffff00000001604083901c6001600160401b0316105b8015620044c0575067ffffffff00000001608083901c6001600160401b0316105b8015620044d8575067ffffffff0000000160c083901c105b15620044e657506001919050565b506000919050565b600062004545826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620045c79092919063ffffffff16565b8051909150156200151057808060200190518101906200456691906200532e565b620015105760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000c13565b6060620045d88484600085620045e0565b949350505050565b606082471015620046435760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000c13565b600080866001600160a01b03168587604051620046619190620052d3565b60006040518083038185875af1925050503d8060008114620046a0576040519150601f19603f3d011682016040523d82523d6000602084013e620046a5565b606091505b509150915062001d538783838760608315620047265782516000036200471e576001600160a01b0385163b6200471e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000c13565b5081620045d8565b620045d883838151156200473d5781518083602001fd5b8060405162461bcd60e51b815260040162000c13919062004cd8565b61092e806200537c83390190565b6001600160a01b038116811462002db257600080fd5b80356001600160401b03811681146200342d57600080fd5b6000806000806000806000806000806101408b8d031215620047b657600080fd5b8a35620047c38162004767565b9950620047d360208c016200477d565b9850620047e360408c016200477d565b975060608b0135620047f58162004767565b965060808b0135620048078162004767565b955060a08b0135620048198162004767565b945060c08b01356200482b8162004767565b935060e08b01356200483d8162004767565b92506200484e6101008c016200477d565b91506200485f6101208c016200477d565b90509295989b9194979a5092959850565b803563ffffffff811681146200342d57600080fd5b600080604083850312156200489957600080fd5b620048a48362004870565b9150620048b4602084016200477d565b90509250929050565b600060208284031215620048d057600080fd5b620011118262004870565b8061030081018310156200111457600080fd5b6000806000806000806000806103e0898b0312156200490c57600080fd5b620049178962004870565b97506200492760208a016200477d565b96506200493760408a016200477d565b95506200494760608a016200477d565b94506200495760808a016200477d565b935060a0890135925060c08901359150620049768a60e08b01620048db565b90509295985092959890939650565b6000806000806000806000806103e0898b031215620049a357600080fd5b620049ae8962004870565b9750620049be60208a016200477d565b9650620049ce60408a016200477d565b9550620049de60608a016200477d565b94506080890135935060a0890135925060c0890135620049fe8162004767565b9150620049768a60e08b01620048db565b60006020828403121562004a2257600080fd5b813561ffff8116811462004a3557600080fd5b9392505050565b60006020828403121562004a4f57600080fd5b5035919050565b6000806040838503121562004a6a57600080fd5b82359150602083013562004a7e8162004767565b809150509250929050565b60006020828403121562004a9c57600080fd5b62001111826200477d565b634e487b7160e01b600052604160045260246000fd5b600082601f83011262004acf57600080fd5b81356001600160401b038082111562004aec5762004aec62004aa7565b604051601f8301601f19908116603f0116810190828211818310171562004b175762004b1762004aa7565b8160405283815286602085880101111562004b3157600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121562004b6d57600080fd5b62004b788862004870565b965062004b88602089016200477d565b9550604088013562004b9a8162004767565b9450606088013562004bac8162004767565b9350608088013562004bbe8162004767565b925060a08801356001600160401b038082111562004bdb57600080fd5b62004be98b838c0162004abd565b935060c08a013591508082111562004c0057600080fd5b5062004c0f8a828b0162004abd565b91505092959891949750929550565b60008060008060008060c0878903121562004c3857600080fd5b62004c438762004870565b955062004c53602088016200477d565b945062004c63604088016200477d565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004ca157818101518382015260200162004c87565b50506000910152565b6000815180845262004cc481602086016020860162004c84565b601f01601f19169290920160200192915050565b60208152600062001111602083018462004caa565b6000806040838503121562004d0157600080fd5b62004d0c836200477d565b946020939093013593505050565b6000806000806060858703121562004d3157600080fd5b843562004d3e8162004767565b935062004d4e6020860162004870565b925060408501356001600160401b038082111562004d6b57600080fd5b818701915087601f83011262004d8057600080fd5b81358181111562004d9057600080fd5b88602082850101111562004da357600080fd5b95989497505060200194505050565b60006020828403121562004dc557600080fd5b813562004a358162004767565b803560ff811681146200342d57600080fd5b60008060008060008060c0878903121562004dfe57600080fd5b863562004e0b8162004767565b9550602087013562004e1d8162004767565b945062004e2d604088016200477d565b935062004e3d606088016200477d565b92506080870135915062004e5460a0880162004dd2565b90509295509295509295565b60008060008060008060c0878903121562004e7a57600080fd5b863562004e878162004767565b9550602087013562004e998162004767565b945062004ea9604088016200477d565b935062004eb96060880162004dd2565b92506080870135915060a08701356001600160401b0381111562004edc57600080fd5b62004eea89828a0162004abd565b9150509295509295509295565b8054600090600181811c908083168062004f1257607f831692505b6020808410820362004f3457634e487b7160e01b600052602260045260246000fd5b8388526020880182801562004f52576001811462004f695762004f96565b60ff198716825285151560051b8201975062004f96565b60008981526020902060005b8781101562004f905781548482015290860190840162004f75565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c06040820181905260009062004fd19083018762004ef7565b828103606084015262004fe5818762004ef7565b9150508360808301526001600160401b03831660a0830152979650505050505050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562005041576200504162005008565b5092915050565b808202811582820484141762001114576200111462005008565b600063ffffffff8083168181036200507e576200507e62005008565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620050b69083018462004caa565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c060808201819052600090620051019083018562004caa565b82810360a084015262005115818562004caa565b9998505050505050505050565b6001600160401b0382811682821603908082111562005041576200504162005008565b60006001600160401b038083168181036200507e576200507e62005008565b6000602082840312156200517757600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082620051a657620051a66200517e565b500490565b8082018082111562001114576200111462005008565b634e487b7160e01b600052603260045260246000fd5b600060018201620051ec57620051ec62005008565b5060010190565b6000826200520557620052056200517e565b500690565b8181038181111562001114576200111462005008565b60008162005232576200523262005008565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a08201819052600090620052c79083018462004caa565b98975050505050505050565b60008251620052e781846020870162004c84565b9190910192915050565b61032081016103008085843782018360005b60018110156200532457815183526020928301929091019060010162005303565b5050509392505050565b6000602082840312156200534157600080fd5b8151801515811462004a3557600080fd5b60006001600160401b03808416806200536f576200536f6200517e565b9216919091049291505056fe60a06040526040516200092e3803806200092e833981016040819052620000269162000383565b828162000034828262000060565b50506001600160a01b038216608052620000576200005160805190565b620000c6565b50505062000481565b6200006b8262000138565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115620000b857620000b38282620001b8565b505050565b620000c262000235565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620001086000805160206200090e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001358162000257565b50565b806001600160a01b03163b6000036200017457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b031684604051620001d7919062000463565b600060405180830381855af49150503d806000811462000214576040519150601f19603f3d011682016040523d82523d6000602084013e62000219565b606091505b5090925090506200022c8583836200029a565b95945050505050565b3415620002555760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166200028357604051633173bdd160e11b8152600060048201526024016200016b565b806000805160206200090e83398151915262000197565b606082620002b357620002ad8262000300565b620002f9565b8151158015620002cb57506001600160a01b0384163b155b15620002f657604051639996b31560e01b81526001600160a01b03851660048201526024016200016b565b50805b9392505050565b805115620003115780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b03811681146200034257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200037a57818101518382015260200162000360565b50506000910152565b6000806000606084860312156200039957600080fd5b620003a4846200032a565b9250620003b4602085016200032a565b60408501519092506001600160401b0380821115620003d257600080fd5b818601915086601f830112620003e757600080fd5b815181811115620003fc57620003fc62000347565b604051601f8201601f19908116603f0116810190838211818310171562000427576200042762000347565b816040528281528960208487010111156200044157600080fd5b620004548360208301602088016200035d565b80955050505050509250925092565b60008251620004778184602087016200035d565b9190910192915050565b6080516104726200049c6000396000601001526104726000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100e5565b60008061008e36600481846102fd565b81019061009b919061033d565b915091506100a98282610109565b5050565b60006100e07f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610104573d6000f35b3d6000fd5b61011282610164565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561015c5761015782826101e0565b505050565b6100a9610256565b806001600160a01b03163b60000361019f57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101fd919061040d565b600060405180830381855af49150503d8060008114610238576040519150601f19603f3d011682016040523d82523d6000602084013e61023d565b606091505b509150915061024d858383610275565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b60608261028a57610285826102d4565b6102cd565b81511580156102a157506001600160a01b0384163b155b156102ca57604051639996b31560e01b81526001600160a01b0385166004820152602401610196565b50805b9392505050565b8051156102e45780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6000808585111561030d57600080fd5b8386111561031a57600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035057600080fd5b82356001600160a01b038116811461036757600080fd5b9150602083013567ffffffffffffffff8082111561038457600080fd5b818501915085601f83011261039857600080fd5b8135818111156103aa576103aa610327565b604051601f8201601f19908116603f011681019083821181831017156103d2576103d2610327565b816040528281528860208487010111156103eb57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000825160005b8181101561042e5760208186018101518583015201610414565b50600092019182525091905056fea2646970667358221220b682b645e70b0310ca18f6b5889dc8bdacf4b460a01fb9d34b74753f65dc9ae364736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a264697066735822122074fa5fae4b7539b28e148b8a0e0cc30e343ede0a3cae2821f306d8c06bd61d4d64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonRollupManagerMock.json b/compiled-contracts/paris/PolygonRollupManagerMock.json index 50e1e4c7c..599845ebf 100644 --- a/compiled-contracts/paris/PolygonRollupManagerMock.json +++ b/compiled-contracts/paris/PolygonRollupManagerMock.json @@ -6,7 +6,7 @@ { "inputs": [ { - "internalType": "contract IPolygonZkEVMGlobalExitRoot", + "internalType": "contract IPolygonZkEVMGlobalExitRootV2", "name": "_globalExitRootManager", "type": "address" }, @@ -164,6 +164,11 @@ "name": "PendingStateNotConsolidable", "type": "error" }, + { + "inputs": [], + "name": "RollupAddressAlreadyExist", + "type": "error" + }, { "inputs": [], "name": "RollupMustExist", @@ -1181,7 +1186,7 @@ "name": "globalExitRootManager", "outputs": [ { - "internalType": "contract IPolygonZkEVMGlobalExitRoot", + "internalType": "contract IPolygonZkEVMGlobalExitRootV2", "name": "", "type": "address" } @@ -1377,6 +1382,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "lastDeactivatedEmergencyStateTimestamp", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "multiplierBatchFee", @@ -1998,8 +2016,8 @@ "type": "function" } ], - "bytecode": "0x60e06040523480156200001157600080fd5b50604051620061e8380380620061e883398101604081905262000034916200006b565b6001600160a01b0392831660805290821660c0521660a052620000bf565b6001600160a01b03811681146200006857600080fd5b50565b6000806000606084860312156200008157600080fd5b83516200008e8162000052565b6020850151909350620000a18162000052565b6040850151909250620000b48162000052565b809150509250925092565b60805160a05160c0516160c162000127600039600081816109bc015281816122cd0152613b4d01526000818161078201528181612e1c0152613e4701526000818161091601528181611313015281816114c301528181611fad0152613d3601526160c16000f3fe60806040523480156200001157600080fd5b5060043610620002aa5760003560e01c80630645af0914620002af578063066ec01214620002c8578063080b311114620002f45780630a0d9fbe146200031c5780630e36f582146200033757806311f6b287146200034e57806312b86e1914620003655780631489ed10146200037c57806315064c9614620003935780631608859c14620003a15780631796a1ae14620003b85780631816b7e514620003df5780632072f6c514620003f6578063248a9ca314620004005780632528016914620004265780632f2ff15d14620004db57806336568abe14620004f2578063394218e91462000509578063477fa270146200052057806355a71ee0146200052957806360469169146200056d57806365c0504d14620005775780637222020f1462000626578063727885e9146200063d5780637975fcfe14620006545780637fb6e76a146200067a578063841b24d714620006a357806387c20c0114620006be5780638bd4f07114620006d55780638f698ec514620006ec57806391d14854146200070357806399f5634e146200071a5780639a908e7314620007245780639c9f3dfe146200073b578063a066215c1462000752578063a217fddf1462000769578063a2967d991462000772578063a3c573eb146200077c578063afd23cbe14620007b3578063b99d0ad714620007dd578063c1acbc3414620008b5578063c4c928c214620008d0578063ceee281d14620008e7578063d02103ca1462000910578063d5073f6f1462000938578063d547741f146200094f578063d939b3151462000966578063dbc16976146200097a578063dde0ff771462000984578063e0bfd3d2146200099f578063e46761c414620009b6578063f34eb8eb14620009de578063f4e9267514620009f5578063f9c4c2ae1462000a06575b600080fd5b620002c6620002c0366004620047fe565b62000b1d565b005b608454620002dc906001600160401b031681565b604051620002eb9190620048d9565b60405180910390f35b6200030b6200030536600462004902565b62000f6f565b6040519015158152602001620002eb565b608554620002dc90600160401b90046001600160401b031681565b620002c6620003483660046200493a565b62000f99565b620002dc6200035f366004620049c5565b62001247565b620002c662000376366004620049f6565b62001267565b620002c66200038d36600462004a8d565b62001417565b606f546200030b9060ff1681565b620002c6620003b236600462004902565b620015a7565b607e54620003c99063ffffffff1681565b60405163ffffffff9091168152602001620002eb565b620002c6620003f036600462004b17565b6200163c565b620002c6620016e8565b620004176200041136600462004b44565b6200177e565b604051908152602001620002eb565b620004a76200043736600462004902565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002eb565b620002c6620004ec36600462004b5e565b62001793565b620002c66200050336600462004b5e565b620017b5565b620002c66200051a36600462004b91565b620017ef565b60865462000417565b620004176200053a36600462004902565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620004176200189e565b620005dc62000588366004620049c5565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002eb565b620002c662000637366004620049c5565b620018b6565b620002c66200064e36600462004c6e565b620019a1565b6200066b6200066536600462004d3b565b62001e09565b604051620002eb919062004df5565b620003c96200068b36600462004b91565b60836020526000908152604090205463ffffffff1681565b608454620002dc90600160c01b90046001600160401b031681565b620002c6620006cf36600462004a8d565b62001e3c565b620002c6620006e6366004620049f6565b62002160565b620002c6620006fd36600462004e0a565b62002216565b6200030b6200071436600462004b5e565b6200229d565b62000417620022c8565b620002dc6200073536600462004eba565b620023b4565b620002c66200074c36600462004b91565b62002581565b620002c66200076336600462004b91565b62002624565b62000417600081565b62000417620026c3565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b604051620002eb919062004ee7565b608554620007c990600160801b900461ffff1681565b60405161ffff9091168152602001620002eb565b62000873620007ee36600462004902565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002eb919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002dc90600160801b90046001600160401b031681565b620002c6620008e136600462004efb565b62002a85565b620003c9620008f836600462004f93565b60826020526000908152604090205463ffffffff1681565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b620002c66200094936600462004b44565b62002d52565b620002c66200096036600462004b5e565b62002ddd565b608554620002dc906001600160401b031681565b620002c662002dff565b608454620002dc90600160401b90046001600160401b031681565b620002c6620009b036600462004fc5565b62002e9c565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b620002c6620009ef36600462005041565b62002f26565b608054620003c99063ffffffff1681565b62000a9d62000a17366004620049c5565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002eb565b600054600290610100900460ff1615801562000b40575060005460ff8083169116105b62000b685760405162461bcd60e51b815260040162000b5f90620050d8565b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000be962003111565b62000c046000805160206200606c8339815191528c6200317e565b62000c116000886200317e565b62000c2c60008051602062005f4c833981519152886200317e565b62000c4760008051602062005fcc833981519152886200317e565b62000c6260008051602062005eec833981519152886200317e565b62000c7d60008051602062005f2c833981519152896200317e565b62000c986000805160206200604c833981519152896200317e565b62000cb360008051602062005f6c833981519152896200317e565b62000cce60008051602062005fec833981519152896200317e565b62000cf86000805160206200606c83398151915260008051602062005ecc8339815191526200318a565b62000d1360008051602062005ecc833981519152896200317e565b62000d2e60008051602062005f0c833981519152896200317e565b62000d586000805160206200602c8339815191526000805160206200600c8339815191526200318a565b62000d736000805160206200602c833981519152876200317e565b62000d8e6000805160206200600c833981519152876200317e565b6073546074546001600160401b03600160401b9092048216911680821462000dc957604051632e4cc54360e11b815260040160405180910390fd5b600062000df1888888886000607460009054906101000a90046001600160401b0316620031df565b6001600160401b03838116600081815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068b018054909216909417938802939093179092556007880180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81529596506001600160a01b038e81169663bb5907089662000ef39694831695600160581b909504909216936076936077939092911690600401620051d2565b600060405180830381600087803b15801562000f0e57600080fd5b505af115801562000f23573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff8516815260008051602062005fac8339815191529350602001915062000f5a9050565b60405180910390a15050505050505050505050565b63ffffffff8216600090815260816020526040812062000f9090836200340d565b90505b92915050565b600054600290610100900460ff1615801562000fbc575060005460ff8083169116105b62000fdb5760405162461bcd60e51b815260040162000b5f90620050d8565b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200105c62003111565b620010776000805160206200606c833981519152886200317e565b620010846000846200317e565b6200109f60008051602062005f4c833981519152846200317e565b620010ba60008051602062005fcc833981519152846200317e565b620010d560008051602062005eec833981519152846200317e565b620010f060008051602062005f2c833981519152856200317e565b6200110b6000805160206200604c833981519152856200317e565b6200112660008051602062005f6c833981519152856200317e565b6200114160008051602062005fec833981519152856200317e565b6200116b6000805160206200606c83398151915260008051602062005ecc8339815191526200318a565b6200118660008051602062005ecc833981519152856200317e565b620011a160008051602062005f0c833981519152856200317e565b620011cb6000805160206200602c8339815191526000805160206200600c8339815191526200318a565b620011e66000805160206200602c833981519152836200317e565b620012016000805160206200600c833981519152836200317e565b6200120e6000336200317e565b6000805461ff001916905560405160ff8216815260008051602062005fac8339815191529060200160405180910390a150505050505050565b63ffffffff8116600090815260816020526040812062000f939062003452565b6000805160206200606c8339815191526200128281620034c3565b63ffffffff89166000908152608160205260409020620012a9818a8a8a8a8a8a8a620034cf565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001311576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200134a620026c3565b6040518263ffffffff1660e01b81526004016200136991815260200190565b600060405180830381600087803b1580156200138457600080fd5b505af115801562001399573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b6000805160206200606c8339815191526200143281620034c3565b63ffffffff8916600090815260816020526040902062001459818a8a8a8a8a8a8a62003857565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b90041615620014c1576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620014fa620026c3565b6040518263ffffffff1660e01b81526004016200151991815260200190565b600060405180830381600087803b1580156200153457600080fd5b505af115801562001549573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a604051620015939392919062005238565b60405180910390a350505050505050505050565b63ffffffff82166000908152608160205260409020620015d76000805160206200606c833981519152336200229d565b6200162b57606f5460ff16156200160157604051630bc011ff60e21b815260040160405180910390fd5b6200160d81836200340d565b6200162b57604051630674f25160e11b815260040160405180910390fd5b62001637818362003c53565b505050565b60008051602062005fec8339815191526200165781620034c3565b6103e88261ffff1610806200167157506103ff8261ffff16115b156200169057604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620017036000805160206200602c833981519152336200229d565b6200177257608454600160801b90046001600160401b031615806200175357506084544290620017489062093a8090600160801b90046001600160401b03166200526f565b6001600160401b0316115b15620017725760405163692baaad60e11b815260040160405180910390fd5b6200177c62003e45565b565b60009081526034602052604090206001015490565b6200179e826200177e565b620017a981620034c3565b62001637838362003ec4565b6001600160a01b0381163314620017df57604051630b4ad1cd60e31b815260040160405180910390fd5b620017eb828262003f30565b5050565b60008051602062005fec8339815191526200180a81620034c3565b606f5460ff166200184c576084546001600160401b03600160c01b9091048116908316106200184c5760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190620016dc908490620048d9565b60006086546064620018b1919062005299565b905090565b60008051602062005f2c833981519152620018d181620034c3565b63ffffffff82161580620018f05750607e5463ffffffff908116908316115b156200190f57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200195657604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b6000805160206200604c833981519152620019bc81620034c3565b63ffffffff88161580620019db5750607e5463ffffffff908116908916115b15620019fa57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff161515900362001a4157604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001a7f576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062001a9a9063ffffffff16620052b3565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001ae890620047c2565b62001af693929190620052d9565b604051809103906000f08015801562001b13573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001d87949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001dc7908d908d9088908e908e908e9060040162005310565b600060405180830381600087803b15801562001de257600080fd5b505af115801562001df7573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001e3190878787878762003f9a565b979650505050505050565b606f5460ff161562001e6157604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001eb092600160c01b9004811691166200526f565b6001600160401b0316111562001ed957604051638a0704d360e01b815260040160405180910390fd5b6103e862001ee8888862005373565b6001600160401b0316111562001f1157604051635acfba9d60e11b815260040160405180910390fd5b62001f23818989898989898962003857565b62001f2f8187620040d5565b6085546001600160401b03166000036200203d57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001fab576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001fe4620026c3565b6040518263ffffffff1660e01b81526004016200200391815260200190565b600060405180830381600087803b1580156200201e57600080fd5b505af115801562002033573d6000803e3d6000fd5b5050505062002107565b6200204881620042d2565b600681018054600160801b90046001600160401b03169060106200206c8362005396565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b48887896040516200214d9392919062005238565b60405180910390a3505050505050505050565b606f5460ff16156200218557604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88166000908152608160205260409020620021ac8189898989898989620034cf565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16200220b62003e45565b505050505050505050565b80516080805463ffffffff191663ffffffff90921691909117905560005b8151811015620017eb57818181518110620022535762002253620053bd565b6020026020010151608160008360016200226e9190620053d3565b63ffffffff168152602081019190915260400160002060050155806200229481620053e9565b91505062002234565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162002319919062004ee7565b602060405180830381865afa15801562002337573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200235d919062005405565b60845490915060009062002384906001600160401b03600160401b82048116911662005373565b6001600160401b0316905080600003620023a15760009250505090565b620023ad818362005435565b9250505090565b606f5460009060ff1615620023dc57604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362002414576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200243f57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620024729084906001600160401b03166200526f565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620024a887836200526f565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200253783620042d2565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a25826040516200256f9190620048d9565b60405180910390a29695505050505050565b60008051602062005fec8339815191526200259c81620034c3565b606f5460ff16620025d7576085546001600160401b0390811690831610620025d75760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590620016dc908490620048d9565b60008051602062005fec8339815191526200263f81620034c3565b62015180826001600160401b031611156200266d57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890620016dc908490620048d9565b60805460009063ffffffff16808203620026df57506000919050565b6000816001600160401b03811115620026fc57620026fc62004baf565b60405190808252806020026020018201604052801562002726578160200160208202803683370190505b50905060005b8281101562002799576081600062002746836001620053d3565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620027795762002779620053bd565b6020908102919091010152806200279081620053e9565b9150506200272c565b50600060205b83600114620029dd576000620027b76002866200544c565b620027c460028762005435565b620027d09190620053d3565b90506000816001600160401b03811115620027ef57620027ef62004baf565b60405190808252806020026020018201604052801562002819578160200160208202803683370190505b50905060005b8281101562002991576200283560018462005463565b811480156200285057506200284c6002886200544c565b6001145b15620028d057856200286482600262005299565b81518110620028775762002877620053bd565b6020026020010151856040516020016200289392919062005479565b60405160208183030381529060405280519060200120828281518110620028be57620028be620053bd565b6020026020010181815250506200297c565b85620028de82600262005299565b81518110620028f157620028f1620053bd565b60200260200101518682600262002909919062005299565b62002916906001620053d3565b81518110620029295762002929620053bd565b60200260200101516040516020016200294492919062005479565b604051602081830303815290604052805190602001208282815181106200296f576200296f620053bd565b6020026020010181815250505b806200298881620053e9565b9150506200281f565b508094508195508384604051602001620029ad92919062005479565b6040516020818303038152906040528051906020012093508280620029d29062005487565b93505050506200279f565b600083600081518110620029f557620029f5620053bd565b6020026020010151905060005b8281101562002a7b57818460405160200162002a2092919062005479565b604051602081830303815290604052805190602001209150838460405160200162002a4d92919062005479565b604051602081830303815290604052805190602001209350808062002a7290620053e9565b91505062002a02565b5095945050505050565b60008051602062005eec83398151915262002aa081620034c3565b63ffffffff8416158062002abf5750607e5463ffffffff908116908516115b1562002ade57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002b1f576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002b6e57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002bb557604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002bf357604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002c738462001247565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002cc89216908b908b90600401620054a1565b600060405180830381600087803b15801562002ce357600080fd5b505af115801562002cf8573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005f0c83398151915262002d6d81620034c3565b683635c9adc5dea0000082118062002d885750633b9aca0082105b1562002da757604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620016dc565b62002de8826200177e565b62002df381620034c3565b62001637838362003f30565b60008051602062005f6c83398151915262002e1a81620034c3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002e7657600080fd5b505af115801562002e8b573d6000803e3d6000fd5b5050505062002e996200439d565b50565b60008051602062005fcc83398151915262002eb781620034c3565b6001600160401b03841660009081526083602052604090205463ffffffff161562002ef5576040516337c8fe0960e11b815260040160405180910390fd5b600062002f0888888888876000620031df565b60008080526002909101602052604090209390935550505050505050565b60008051602062005f4c83398151915262002f4181620034c3565b607e805460009190829062002f5c9063ffffffff16620052b3565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620030ff96959493929190620054e1565b60405180910390a25050505050505050565b600054610100900460ff166200177c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b5f565b620017eb828262003ec4565b600062003197836200177e565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6080805460009182918290620031fb9063ffffffff16620052b3565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000876001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff16021790555080608260008a6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150878260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550868260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620033fa9594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b03828116600090815260048501602052604081205490924292620034409291811691166200526f565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b031615620034a6575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002e998133620043f6565b60078801546000906001600160401b039081169087161015620035055760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620035a65760068901546001600160401b03600160801b909104811690891611156200354f5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200359f57604051632bd2e3e760e01b815260040160405180910390fd5b506200361b565b506001600160401b038516600090815260028901602052604090205480620035e1576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b909104811690871611156200361b57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620036545750876001600160401b0316876001600160401b031611155b8062003678575060068901546001600160401b03600160c01b909104811690881611155b15620036975760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b9004811690861614620036de576040516332a2a77f60e01b815260040160405180910390fd5b6000620036f08a888888868962003f9a565b9050600060008051602062005f8c8339815191526002836040516200371691906200552e565b602060405180830381855afa15801562003734573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003759919062005405565b6200376591906200544c565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620037a9918891906004016200554c565b602060405180830381865afa158015620037c7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620037ed919062005589565b6200380b576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c0160205260409020600201548590036200384a5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620038658a62003452565b60078b01549091506001600160401b0390811690891610156200389b5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038916156200393e5760068a01546001600160401b03600160801b9091048116908a161115620038e55760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200393757604051632bd2e3e760e01b815260040160405180910390fd5b50620039ae565b6001600160401b038816600090815260028b0160205260409020549150816200397a576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b03161115620039ae57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620039e15760405163b9b18f5760e01b815260040160405180910390fd5b6000620039f38b8a8a8a878b62003f9a565b9050600060008051602062005f8c83398151915260028360405162003a1991906200552e565b602060405180830381855afa15801562003a37573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003a5c919062005405565b62003a6891906200544c565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003aac918991906004016200554c565b602060405180830381865afa15801562003aca573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003af0919062005589565b62003b0e576040516309bde33960e01b815260040160405180910390fd5b600062003b1c848b62005373565b905062003b7587826001600160401b031662003b37620022c8565b62003b43919062005299565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004420565b80608460088282829054906101000a90046001600160401b031662003b9b91906200526f565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b15801562003c2b57600080fd5b505af115801562003c40573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003c92575060068201546001600160401b03600160801b9091048116908216115b1562003cb15760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003d6d620026c3565b6040518263ffffffff1660e01b815260040162003d8c91815260200190565b600060405180830381600087803b15801562003da757600080fd5b505af115801562003dbc573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003ea157600080fd5b505af115801562003eb6573d6000803e3d6000fd5b505050506200177c62004474565b62003ed082826200229d565b620017eb5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003f3c82826200229d565b15620017eb5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003fd0575081155b1562003fef5760405163340c614f60e11b815260040160405180910390fd5b806200400e576040516366385b5160e01b815260040160405180910390fd5b6200401984620044d1565b62004037576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b6000620040e28362003452565b905081600080620040f4848462005373565b6085546001600160401b0391821692506000916200411b91600160401b9004164262005463565b90505b846001600160401b0316846001600160401b031614620041a5576001600160401b0380851660009081526003890160205260409020600181015490911682101562004180576001810154600160401b90046001600160401b031694506200419e565b6200418c868662005373565b6001600160401b0316935050620041a5565b506200411e565b6000620041b3848462005463565b9050838110156200421157808403600c8111620041d15780620041d4565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a60865402816200420657620042066200541f565b046086555062004289565b838103600c811162004224578062004227565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a764000002816200426157620042616200541f565b04905080608654670de0b6b3a764000002816200428257620042826200541f565b0460865550505b683635c9adc5dea000006086541115620042b057683635c9adc5dea00000608655620042c8565b633b9aca006086541015620042c857633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002e995760068101546000906200431d90600160c01b90046001600160401b031660016200526f565b90506200432b82826200340d565b15620017eb57600682015460009060029062004359908490600160801b90046001600160401b031662005373565b620043659190620055ad565b6200437190836200526f565b90506200437f83826200340d565b15620043915762001637838262003c53565b62001637838362003c53565b606f5460ff16620043c157604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6200440282826200229d565b620017eb57604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526200163790849062004557565b606f5460ff16156200449957604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b03831610801562004508575067ffffffff00000001604083901c6001600160401b0316105b801562004529575067ffffffff00000001608083901c6001600160401b0316105b801562004541575067ffffffff0000000160c083901c105b156200454f57506001919050565b506000919050565b6000620045ae826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620046309092919063ffffffff16565b805190915015620016375780806020019051810190620045cf919062005589565b620016375760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b5f565b606062004641848460008562004649565b949350505050565b606082471015620046ac5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b5f565b600080866001600160a01b03168587604051620046ca91906200552e565b60006040518083038185875af1925050503d806000811462004709576040519150601f19603f3d011682016040523d82523d6000602084013e6200470e565b606091505b509150915062001e3187838387606083156200478f57825160000362004787576001600160a01b0385163b620047875760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b5f565b508162004641565b620046418383815115620047a65781518083602001fd5b8060405162461bcd60e51b815260040162000b5f919062004df5565b6108f580620055d783390190565b6001600160a01b038116811462002e9957600080fd5b80356001600160401b0381168114620034be57600080fd5b6000806000806000806000806000806101408b8d0312156200481f57600080fd5b8a356200482c81620047d0565b99506200483c60208c01620047e6565b98506200484c60408c01620047e6565b975060608b01356200485e81620047d0565b965060808b01356200487081620047d0565b955060a08b01356200488281620047d0565b945060c08b01356200489481620047d0565b935060e08b0135620048a681620047d0565b9250620048b76101008c01620047e6565b9150620048c86101208c01620047e6565b90509295989b9194979a5092959850565b6001600160401b0391909116815260200190565b803563ffffffff81168114620034be57600080fd5b600080604083850312156200491657600080fd5b6200492183620048ed565b91506200493160208401620047e6565b90509250929050565b60008060008060008060c087890312156200495457600080fd5b86356200496181620047d0565b95506200497160208801620047e6565b94506200498160408801620047e6565b935060608701356200499381620047d0565b92506080870135620049a581620047d0565b915060a0870135620049b781620047d0565b809150509295509295509295565b600060208284031215620049d857600080fd5b62000f9082620048ed565b80610300810183101562000f9357600080fd5b6000806000806000806000806103e0898b03121562004a1457600080fd5b62004a1f89620048ed565b975062004a2f60208a01620047e6565b965062004a3f60408a01620047e6565b955062004a4f60608a01620047e6565b945062004a5f60808a01620047e6565b935060a0890135925060c0890135915062004a7e8a60e08b01620049e3565b90509295985092959890939650565b6000806000806000806000806103e0898b03121562004aab57600080fd5b62004ab689620048ed565b975062004ac660208a01620047e6565b965062004ad660408a01620047e6565b955062004ae660608a01620047e6565b94506080890135935060a0890135925060c089013562004b0681620047d0565b915062004a7e8a60e08b01620049e3565b60006020828403121562004b2a57600080fd5b813561ffff8116811462004b3d57600080fd5b9392505050565b60006020828403121562004b5757600080fd5b5035919050565b6000806040838503121562004b7257600080fd5b82359150602083013562004b8681620047d0565b809150509250929050565b60006020828403121562004ba457600080fd5b62000f9082620047e6565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562004bf05762004bf062004baf565b604052919050565b600082601f83011262004c0a57600080fd5b81356001600160401b0381111562004c265762004c2662004baf565b62004c3b601f8201601f191660200162004bc5565b81815284602083860101111562004c5157600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600080600060e0888a03121562004c8a57600080fd5b62004c9588620048ed565b965062004ca560208901620047e6565b9550604088013562004cb781620047d0565b9450606088013562004cc981620047d0565b9350608088013562004cdb81620047d0565b925060a08801356001600160401b038082111562004cf857600080fd5b62004d068b838c0162004bf8565b935060c08a013591508082111562004d1d57600080fd5b5062004d2c8a828b0162004bf8565b91505092959891949750929550565b60008060008060008060c0878903121562004d5557600080fd5b62004d6087620048ed565b955062004d7060208801620047e6565b945062004d8060408801620047e6565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004dbe57818101518382015260200162004da4565b50506000910152565b6000815180845262004de181602086016020860162004da1565b601f01601f19169290920160200192915050565b60208152600062000f90602083018462004dc7565b6000602080838503121562004e1e57600080fd5b82356001600160401b038082111562004e3657600080fd5b818501915085601f83011262004e4b57600080fd5b81358181111562004e605762004e6062004baf565b8060051b915062004e7384830162004bc5565b818152918301840191848101908884111562004e8e57600080fd5b938501935b8385101562004eae5784358252938501939085019062004e93565b98975050505050505050565b6000806040838503121562004ece57600080fd5b62004ed983620047e6565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000806000806060858703121562004f1257600080fd5b843562004f1f81620047d0565b935062004f2f60208601620048ed565b925060408501356001600160401b038082111562004f4c57600080fd5b818701915087601f83011262004f6157600080fd5b81358181111562004f7157600080fd5b88602082850101111562004f8457600080fd5b95989497505060200194505050565b60006020828403121562004fa657600080fd5b813562004b3d81620047d0565b803560ff81168114620034be57600080fd5b60008060008060008060c0878903121562004fdf57600080fd5b863562004fec81620047d0565b9550602087013562004ffe81620047d0565b94506200500e60408801620047e6565b93506200501e60608801620047e6565b9250608087013591506200503560a0880162004fb3565b90509295509295509295565b60008060008060008060c087890312156200505b57600080fd5b86356200506881620047d0565b955060208701356200507a81620047d0565b94506200508a60408801620047e6565b93506200509a6060880162004fb3565b92506080870135915060a08701356001600160401b03811115620050bd57600080fd5b620050cb89828a0162004bf8565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b8054600090600181811c90808316806200514157607f831692505b602080841082036200516357634e487b7160e01b600052602260045260246000fd5b838852602088018280156200518157600181146200519857620051c5565b60ff198716825285151560051b82019750620051c5565b60008981526020902060005b87811015620051bf57815484820152908601908401620051a4565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c060408201819052600090620052009083018762005126565b828103606084015262005214818762005126565b608084019590955250506001600160401b039190911660a090910152949350505050565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562005292576200529262005259565b5092915050565b808202811582820484141762000f935762000f9362005259565b600063ffffffff808316818103620052cf57620052cf62005259565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620053079083018462004dc7565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c060808201819052600090620053529083018562004dc7565b82810360a084015262005366818562004dc7565b9998505050505050505050565b6001600160401b0382811682821603908082111562005292576200529262005259565b60006001600160401b038281166002600160401b03198101620052cf57620052cf62005259565b634e487b7160e01b600052603260045260246000fd5b8082018082111562000f935762000f9362005259565b600060018201620053fe57620053fe62005259565b5060010190565b6000602082840312156200541857600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b6000826200544757620054476200541f565b500490565b6000826200545e576200545e6200541f565b500690565b8181038181111562000f935762000f9362005259565b918252602082015260400190565b60008162005499576200549962005259565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a0820181905260009062004eae9083018462004dc7565b600082516200554281846020870162004da1565b9190910192915050565b61032081016103008085843782018360005b60018110156200557f5781518352602092830192909101906001016200555e565b5050509392505050565b6000602082840312156200559c57600080fd5b8151801515811462004b3d57600080fd5b60006001600160401b0383811680620055ca57620055ca6200541f565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220a19e7a72432195d9a35c7ce8fa5f1284415aac66bb1ad08a4c2e1c252fd8690864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220f0c277530fc86ddd05a56918423fafab9c54bee2881e81568f1fab8a3f325a3d64736f6c63430008140033", - "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620002aa5760003560e01c80630645af0914620002af578063066ec01214620002c8578063080b311114620002f45780630a0d9fbe146200031c5780630e36f582146200033757806311f6b287146200034e57806312b86e1914620003655780631489ed10146200037c57806315064c9614620003935780631608859c14620003a15780631796a1ae14620003b85780631816b7e514620003df5780632072f6c514620003f6578063248a9ca314620004005780632528016914620004265780632f2ff15d14620004db57806336568abe14620004f2578063394218e91462000509578063477fa270146200052057806355a71ee0146200052957806360469169146200056d57806365c0504d14620005775780637222020f1462000626578063727885e9146200063d5780637975fcfe14620006545780637fb6e76a146200067a578063841b24d714620006a357806387c20c0114620006be5780638bd4f07114620006d55780638f698ec514620006ec57806391d14854146200070357806399f5634e146200071a5780639a908e7314620007245780639c9f3dfe146200073b578063a066215c1462000752578063a217fddf1462000769578063a2967d991462000772578063a3c573eb146200077c578063afd23cbe14620007b3578063b99d0ad714620007dd578063c1acbc3414620008b5578063c4c928c214620008d0578063ceee281d14620008e7578063d02103ca1462000910578063d5073f6f1462000938578063d547741f146200094f578063d939b3151462000966578063dbc16976146200097a578063dde0ff771462000984578063e0bfd3d2146200099f578063e46761c414620009b6578063f34eb8eb14620009de578063f4e9267514620009f5578063f9c4c2ae1462000a06575b600080fd5b620002c6620002c0366004620047fe565b62000b1d565b005b608454620002dc906001600160401b031681565b604051620002eb9190620048d9565b60405180910390f35b6200030b6200030536600462004902565b62000f6f565b6040519015158152602001620002eb565b608554620002dc90600160401b90046001600160401b031681565b620002c6620003483660046200493a565b62000f99565b620002dc6200035f366004620049c5565b62001247565b620002c662000376366004620049f6565b62001267565b620002c66200038d36600462004a8d565b62001417565b606f546200030b9060ff1681565b620002c6620003b236600462004902565b620015a7565b607e54620003c99063ffffffff1681565b60405163ffffffff9091168152602001620002eb565b620002c6620003f036600462004b17565b6200163c565b620002c6620016e8565b620004176200041136600462004b44565b6200177e565b604051908152602001620002eb565b620004a76200043736600462004902565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002eb565b620002c6620004ec36600462004b5e565b62001793565b620002c66200050336600462004b5e565b620017b5565b620002c66200051a36600462004b91565b620017ef565b60865462000417565b620004176200053a36600462004902565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620004176200189e565b620005dc62000588366004620049c5565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002eb565b620002c662000637366004620049c5565b620018b6565b620002c66200064e36600462004c6e565b620019a1565b6200066b6200066536600462004d3b565b62001e09565b604051620002eb919062004df5565b620003c96200068b36600462004b91565b60836020526000908152604090205463ffffffff1681565b608454620002dc90600160c01b90046001600160401b031681565b620002c6620006cf36600462004a8d565b62001e3c565b620002c6620006e6366004620049f6565b62002160565b620002c6620006fd36600462004e0a565b62002216565b6200030b6200071436600462004b5e565b6200229d565b62000417620022c8565b620002dc6200073536600462004eba565b620023b4565b620002c66200074c36600462004b91565b62002581565b620002c66200076336600462004b91565b62002624565b62000417600081565b62000417620026c3565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b604051620002eb919062004ee7565b608554620007c990600160801b900461ffff1681565b60405161ffff9091168152602001620002eb565b62000873620007ee36600462004902565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002eb919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002dc90600160801b90046001600160401b031681565b620002c6620008e136600462004efb565b62002a85565b620003c9620008f836600462004f93565b60826020526000908152604090205463ffffffff1681565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b620002c66200094936600462004b44565b62002d52565b620002c66200096036600462004b5e565b62002ddd565b608554620002dc906001600160401b031681565b620002c662002dff565b608454620002dc90600160401b90046001600160401b031681565b620002c6620009b036600462004fc5565b62002e9c565b620007a47f000000000000000000000000000000000000000000000000000000000000000081565b620002c6620009ef36600462005041565b62002f26565b608054620003c99063ffffffff1681565b62000a9d62000a17366004620049c5565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002eb565b600054600290610100900460ff1615801562000b40575060005460ff8083169116105b62000b685760405162461bcd60e51b815260040162000b5f90620050d8565b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000be962003111565b62000c046000805160206200606c8339815191528c6200317e565b62000c116000886200317e565b62000c2c60008051602062005f4c833981519152886200317e565b62000c4760008051602062005fcc833981519152886200317e565b62000c6260008051602062005eec833981519152886200317e565b62000c7d60008051602062005f2c833981519152896200317e565b62000c986000805160206200604c833981519152896200317e565b62000cb360008051602062005f6c833981519152896200317e565b62000cce60008051602062005fec833981519152896200317e565b62000cf86000805160206200606c83398151915260008051602062005ecc8339815191526200318a565b62000d1360008051602062005ecc833981519152896200317e565b62000d2e60008051602062005f0c833981519152896200317e565b62000d586000805160206200602c8339815191526000805160206200600c8339815191526200318a565b62000d736000805160206200602c833981519152876200317e565b62000d8e6000805160206200600c833981519152876200317e565b6073546074546001600160401b03600160401b9092048216911680821462000dc957604051632e4cc54360e11b815260040160405180910390fd5b600062000df1888888886000607460009054906101000a90046001600160401b0316620031df565b6001600160401b03838116600081815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068b018054909216909417938802939093179092556007880180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81529596506001600160a01b038e81169663bb5907089662000ef39694831695600160581b909504909216936076936077939092911690600401620051d2565b600060405180830381600087803b15801562000f0e57600080fd5b505af115801562000f23573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff8516815260008051602062005fac8339815191529350602001915062000f5a9050565b60405180910390a15050505050505050505050565b63ffffffff8216600090815260816020526040812062000f9090836200340d565b90505b92915050565b600054600290610100900460ff1615801562000fbc575060005460ff8083169116105b62000fdb5760405162461bcd60e51b815260040162000b5f90620050d8565b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200105c62003111565b620010776000805160206200606c833981519152886200317e565b620010846000846200317e565b6200109f60008051602062005f4c833981519152846200317e565b620010ba60008051602062005fcc833981519152846200317e565b620010d560008051602062005eec833981519152846200317e565b620010f060008051602062005f2c833981519152856200317e565b6200110b6000805160206200604c833981519152856200317e565b6200112660008051602062005f6c833981519152856200317e565b6200114160008051602062005fec833981519152856200317e565b6200116b6000805160206200606c83398151915260008051602062005ecc8339815191526200318a565b6200118660008051602062005ecc833981519152856200317e565b620011a160008051602062005f0c833981519152856200317e565b620011cb6000805160206200602c8339815191526000805160206200600c8339815191526200318a565b620011e66000805160206200602c833981519152836200317e565b620012016000805160206200600c833981519152836200317e565b6200120e6000336200317e565b6000805461ff001916905560405160ff8216815260008051602062005fac8339815191529060200160405180910390a150505050505050565b63ffffffff8116600090815260816020526040812062000f939062003452565b6000805160206200606c8339815191526200128281620034c3565b63ffffffff89166000908152608160205260409020620012a9818a8a8a8a8a8a8a620034cf565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001311576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200134a620026c3565b6040518263ffffffff1660e01b81526004016200136991815260200190565b600060405180830381600087803b1580156200138457600080fd5b505af115801562001399573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b6000805160206200606c8339815191526200143281620034c3565b63ffffffff8916600090815260816020526040902062001459818a8a8a8a8a8a8a62003857565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b90041615620014c1576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620014fa620026c3565b6040518263ffffffff1660e01b81526004016200151991815260200190565b600060405180830381600087803b1580156200153457600080fd5b505af115801562001549573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a604051620015939392919062005238565b60405180910390a350505050505050505050565b63ffffffff82166000908152608160205260409020620015d76000805160206200606c833981519152336200229d565b6200162b57606f5460ff16156200160157604051630bc011ff60e21b815260040160405180910390fd5b6200160d81836200340d565b6200162b57604051630674f25160e11b815260040160405180910390fd5b62001637818362003c53565b505050565b60008051602062005fec8339815191526200165781620034c3565b6103e88261ffff1610806200167157506103ff8261ffff16115b156200169057604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620017036000805160206200602c833981519152336200229d565b6200177257608454600160801b90046001600160401b031615806200175357506084544290620017489062093a8090600160801b90046001600160401b03166200526f565b6001600160401b0316115b15620017725760405163692baaad60e11b815260040160405180910390fd5b6200177c62003e45565b565b60009081526034602052604090206001015490565b6200179e826200177e565b620017a981620034c3565b62001637838362003ec4565b6001600160a01b0381163314620017df57604051630b4ad1cd60e31b815260040160405180910390fd5b620017eb828262003f30565b5050565b60008051602062005fec8339815191526200180a81620034c3565b606f5460ff166200184c576084546001600160401b03600160c01b9091048116908316106200184c5760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190620016dc908490620048d9565b60006086546064620018b1919062005299565b905090565b60008051602062005f2c833981519152620018d181620034c3565b63ffffffff82161580620018f05750607e5463ffffffff908116908316115b156200190f57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200195657604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b6000805160206200604c833981519152620019bc81620034c3565b63ffffffff88161580620019db5750607e5463ffffffff908116908916115b15620019fa57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff161515900362001a4157604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001a7f576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062001a9a9063ffffffff16620052b3565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001ae890620047c2565b62001af693929190620052d9565b604051809103906000f08015801562001b13573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001d87949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001dc7908d908d9088908e908e908e9060040162005310565b600060405180830381600087803b15801562001de257600080fd5b505af115801562001df7573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001e3190878787878762003f9a565b979650505050505050565b606f5460ff161562001e6157604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001eb092600160c01b9004811691166200526f565b6001600160401b0316111562001ed957604051638a0704d360e01b815260040160405180910390fd5b6103e862001ee8888862005373565b6001600160401b0316111562001f1157604051635acfba9d60e11b815260040160405180910390fd5b62001f23818989898989898962003857565b62001f2f8187620040d5565b6085546001600160401b03166000036200203d57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001fab576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001fe4620026c3565b6040518263ffffffff1660e01b81526004016200200391815260200190565b600060405180830381600087803b1580156200201e57600080fd5b505af115801562002033573d6000803e3d6000fd5b5050505062002107565b6200204881620042d2565b600681018054600160801b90046001600160401b03169060106200206c8362005396565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b48887896040516200214d9392919062005238565b60405180910390a3505050505050505050565b606f5460ff16156200218557604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88166000908152608160205260409020620021ac8189898989898989620034cf565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16200220b62003e45565b505050505050505050565b80516080805463ffffffff191663ffffffff90921691909117905560005b8151811015620017eb57818181518110620022535762002253620053bd565b6020026020010151608160008360016200226e9190620053d3565b63ffffffff168152602081019190915260400160002060050155806200229481620053e9565b91505062002234565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162002319919062004ee7565b602060405180830381865afa15801562002337573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200235d919062005405565b60845490915060009062002384906001600160401b03600160401b82048116911662005373565b6001600160401b0316905080600003620023a15760009250505090565b620023ad818362005435565b9250505090565b606f5460009060ff1615620023dc57604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362002414576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200243f57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620024729084906001600160401b03166200526f565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620024a887836200526f565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200253783620042d2565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a25826040516200256f9190620048d9565b60405180910390a29695505050505050565b60008051602062005fec8339815191526200259c81620034c3565b606f5460ff16620025d7576085546001600160401b0390811690831610620025d75760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590620016dc908490620048d9565b60008051602062005fec8339815191526200263f81620034c3565b62015180826001600160401b031611156200266d57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890620016dc908490620048d9565b60805460009063ffffffff16808203620026df57506000919050565b6000816001600160401b03811115620026fc57620026fc62004baf565b60405190808252806020026020018201604052801562002726578160200160208202803683370190505b50905060005b8281101562002799576081600062002746836001620053d3565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620027795762002779620053bd565b6020908102919091010152806200279081620053e9565b9150506200272c565b50600060205b83600114620029dd576000620027b76002866200544c565b620027c460028762005435565b620027d09190620053d3565b90506000816001600160401b03811115620027ef57620027ef62004baf565b60405190808252806020026020018201604052801562002819578160200160208202803683370190505b50905060005b8281101562002991576200283560018462005463565b811480156200285057506200284c6002886200544c565b6001145b15620028d057856200286482600262005299565b81518110620028775762002877620053bd565b6020026020010151856040516020016200289392919062005479565b60405160208183030381529060405280519060200120828281518110620028be57620028be620053bd565b6020026020010181815250506200297c565b85620028de82600262005299565b81518110620028f157620028f1620053bd565b60200260200101518682600262002909919062005299565b62002916906001620053d3565b81518110620029295762002929620053bd565b60200260200101516040516020016200294492919062005479565b604051602081830303815290604052805190602001208282815181106200296f576200296f620053bd565b6020026020010181815250505b806200298881620053e9565b9150506200281f565b508094508195508384604051602001620029ad92919062005479565b6040516020818303038152906040528051906020012093508280620029d29062005487565b93505050506200279f565b600083600081518110620029f557620029f5620053bd565b6020026020010151905060005b8281101562002a7b57818460405160200162002a2092919062005479565b604051602081830303815290604052805190602001209150838460405160200162002a4d92919062005479565b604051602081830303815290604052805190602001209350808062002a7290620053e9565b91505062002a02565b5095945050505050565b60008051602062005eec83398151915262002aa081620034c3565b63ffffffff8416158062002abf5750607e5463ffffffff908116908516115b1562002ade57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002b1f576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002b6e57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002bb557604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002bf357604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002c738462001247565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002cc89216908b908b90600401620054a1565b600060405180830381600087803b15801562002ce357600080fd5b505af115801562002cf8573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005f0c83398151915262002d6d81620034c3565b683635c9adc5dea0000082118062002d885750633b9aca0082105b1562002da757604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620016dc565b62002de8826200177e565b62002df381620034c3565b62001637838362003f30565b60008051602062005f6c83398151915262002e1a81620034c3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002e7657600080fd5b505af115801562002e8b573d6000803e3d6000fd5b5050505062002e996200439d565b50565b60008051602062005fcc83398151915262002eb781620034c3565b6001600160401b03841660009081526083602052604090205463ffffffff161562002ef5576040516337c8fe0960e11b815260040160405180910390fd5b600062002f0888888888876000620031df565b60008080526002909101602052604090209390935550505050505050565b60008051602062005f4c83398151915262002f4181620034c3565b607e805460009190829062002f5c9063ffffffff16620052b3565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620030ff96959493929190620054e1565b60405180910390a25050505050505050565b600054610100900460ff166200177c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b5f565b620017eb828262003ec4565b600062003197836200177e565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6080805460009182918290620031fb9063ffffffff16620052b3565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000876001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff16021790555080608260008a6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150878260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550868260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620033fa9594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b03828116600090815260048501602052604081205490924292620034409291811691166200526f565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b031615620034a6575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002e998133620043f6565b60078801546000906001600160401b039081169087161015620035055760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620035a65760068901546001600160401b03600160801b909104811690891611156200354f5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200359f57604051632bd2e3e760e01b815260040160405180910390fd5b506200361b565b506001600160401b038516600090815260028901602052604090205480620035e1576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b909104811690871611156200361b57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620036545750876001600160401b0316876001600160401b031611155b8062003678575060068901546001600160401b03600160c01b909104811690881611155b15620036975760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b9004811690861614620036de576040516332a2a77f60e01b815260040160405180910390fd5b6000620036f08a888888868962003f9a565b9050600060008051602062005f8c8339815191526002836040516200371691906200552e565b602060405180830381855afa15801562003734573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003759919062005405565b6200376591906200544c565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620037a9918891906004016200554c565b602060405180830381865afa158015620037c7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620037ed919062005589565b6200380b576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c0160205260409020600201548590036200384a5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620038658a62003452565b60078b01549091506001600160401b0390811690891610156200389b5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038916156200393e5760068a01546001600160401b03600160801b9091048116908a161115620038e55760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200393757604051632bd2e3e760e01b815260040160405180910390fd5b50620039ae565b6001600160401b038816600090815260028b0160205260409020549150816200397a576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b03161115620039ae57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620039e15760405163b9b18f5760e01b815260040160405180910390fd5b6000620039f38b8a8a8a878b62003f9a565b9050600060008051602062005f8c83398151915260028360405162003a1991906200552e565b602060405180830381855afa15801562003a37573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003a5c919062005405565b62003a6891906200544c565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003aac918991906004016200554c565b602060405180830381865afa15801562003aca573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003af0919062005589565b62003b0e576040516309bde33960e01b815260040160405180910390fd5b600062003b1c848b62005373565b905062003b7587826001600160401b031662003b37620022c8565b62003b43919062005299565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004420565b80608460088282829054906101000a90046001600160401b031662003b9b91906200526f565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b15801562003c2b57600080fd5b505af115801562003c40573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003c92575060068201546001600160401b03600160801b9091048116908216115b1562003cb15760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003d6d620026c3565b6040518263ffffffff1660e01b815260040162003d8c91815260200190565b600060405180830381600087803b15801562003da757600080fd5b505af115801562003dbc573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003ea157600080fd5b505af115801562003eb6573d6000803e3d6000fd5b505050506200177c62004474565b62003ed082826200229d565b620017eb5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003f3c82826200229d565b15620017eb5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003fd0575081155b1562003fef5760405163340c614f60e11b815260040160405180910390fd5b806200400e576040516366385b5160e01b815260040160405180910390fd5b6200401984620044d1565b62004037576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b6000620040e28362003452565b905081600080620040f4848462005373565b6085546001600160401b0391821692506000916200411b91600160401b9004164262005463565b90505b846001600160401b0316846001600160401b031614620041a5576001600160401b0380851660009081526003890160205260409020600181015490911682101562004180576001810154600160401b90046001600160401b031694506200419e565b6200418c868662005373565b6001600160401b0316935050620041a5565b506200411e565b6000620041b3848462005463565b9050838110156200421157808403600c8111620041d15780620041d4565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a60865402816200420657620042066200541f565b046086555062004289565b838103600c811162004224578062004227565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a764000002816200426157620042616200541f565b04905080608654670de0b6b3a764000002816200428257620042826200541f565b0460865550505b683635c9adc5dea000006086541115620042b057683635c9adc5dea00000608655620042c8565b633b9aca006086541015620042c857633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002e995760068101546000906200431d90600160c01b90046001600160401b031660016200526f565b90506200432b82826200340d565b15620017eb57600682015460009060029062004359908490600160801b90046001600160401b031662005373565b620043659190620055ad565b6200437190836200526f565b90506200437f83826200340d565b15620043915762001637838262003c53565b62001637838362003c53565b606f5460ff16620043c157604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6200440282826200229d565b620017eb57604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526200163790849062004557565b606f5460ff16156200449957604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b03831610801562004508575067ffffffff00000001604083901c6001600160401b0316105b801562004529575067ffffffff00000001608083901c6001600160401b0316105b801562004541575067ffffffff0000000160c083901c105b156200454f57506001919050565b506000919050565b6000620045ae826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620046309092919063ffffffff16565b805190915015620016375780806020019051810190620045cf919062005589565b620016375760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b5f565b606062004641848460008562004649565b949350505050565b606082471015620046ac5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b5f565b600080866001600160a01b03168587604051620046ca91906200552e565b60006040518083038185875af1925050503d806000811462004709576040519150601f19603f3d011682016040523d82523d6000602084013e6200470e565b606091505b509150915062001e3187838387606083156200478f57825160000362004787576001600160a01b0385163b620047875760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b5f565b508162004641565b620046418383815115620047a65781518083602001fd5b8060405162461bcd60e51b815260040162000b5f919062004df5565b6108f580620055d783390190565b6001600160a01b038116811462002e9957600080fd5b80356001600160401b0381168114620034be57600080fd5b6000806000806000806000806000806101408b8d0312156200481f57600080fd5b8a356200482c81620047d0565b99506200483c60208c01620047e6565b98506200484c60408c01620047e6565b975060608b01356200485e81620047d0565b965060808b01356200487081620047d0565b955060a08b01356200488281620047d0565b945060c08b01356200489481620047d0565b935060e08b0135620048a681620047d0565b9250620048b76101008c01620047e6565b9150620048c86101208c01620047e6565b90509295989b9194979a5092959850565b6001600160401b0391909116815260200190565b803563ffffffff81168114620034be57600080fd5b600080604083850312156200491657600080fd5b6200492183620048ed565b91506200493160208401620047e6565b90509250929050565b60008060008060008060c087890312156200495457600080fd5b86356200496181620047d0565b95506200497160208801620047e6565b94506200498160408801620047e6565b935060608701356200499381620047d0565b92506080870135620049a581620047d0565b915060a0870135620049b781620047d0565b809150509295509295509295565b600060208284031215620049d857600080fd5b62000f9082620048ed565b80610300810183101562000f9357600080fd5b6000806000806000806000806103e0898b03121562004a1457600080fd5b62004a1f89620048ed565b975062004a2f60208a01620047e6565b965062004a3f60408a01620047e6565b955062004a4f60608a01620047e6565b945062004a5f60808a01620047e6565b935060a0890135925060c0890135915062004a7e8a60e08b01620049e3565b90509295985092959890939650565b6000806000806000806000806103e0898b03121562004aab57600080fd5b62004ab689620048ed565b975062004ac660208a01620047e6565b965062004ad660408a01620047e6565b955062004ae660608a01620047e6565b94506080890135935060a0890135925060c089013562004b0681620047d0565b915062004a7e8a60e08b01620049e3565b60006020828403121562004b2a57600080fd5b813561ffff8116811462004b3d57600080fd5b9392505050565b60006020828403121562004b5757600080fd5b5035919050565b6000806040838503121562004b7257600080fd5b82359150602083013562004b8681620047d0565b809150509250929050565b60006020828403121562004ba457600080fd5b62000f9082620047e6565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562004bf05762004bf062004baf565b604052919050565b600082601f83011262004c0a57600080fd5b81356001600160401b0381111562004c265762004c2662004baf565b62004c3b601f8201601f191660200162004bc5565b81815284602083860101111562004c5157600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600080600060e0888a03121562004c8a57600080fd5b62004c9588620048ed565b965062004ca560208901620047e6565b9550604088013562004cb781620047d0565b9450606088013562004cc981620047d0565b9350608088013562004cdb81620047d0565b925060a08801356001600160401b038082111562004cf857600080fd5b62004d068b838c0162004bf8565b935060c08a013591508082111562004d1d57600080fd5b5062004d2c8a828b0162004bf8565b91505092959891949750929550565b60008060008060008060c0878903121562004d5557600080fd5b62004d6087620048ed565b955062004d7060208801620047e6565b945062004d8060408801620047e6565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004dbe57818101518382015260200162004da4565b50506000910152565b6000815180845262004de181602086016020860162004da1565b601f01601f19169290920160200192915050565b60208152600062000f90602083018462004dc7565b6000602080838503121562004e1e57600080fd5b82356001600160401b038082111562004e3657600080fd5b818501915085601f83011262004e4b57600080fd5b81358181111562004e605762004e6062004baf565b8060051b915062004e7384830162004bc5565b818152918301840191848101908884111562004e8e57600080fd5b938501935b8385101562004eae5784358252938501939085019062004e93565b98975050505050505050565b6000806040838503121562004ece57600080fd5b62004ed983620047e6565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000806000806060858703121562004f1257600080fd5b843562004f1f81620047d0565b935062004f2f60208601620048ed565b925060408501356001600160401b038082111562004f4c57600080fd5b818701915087601f83011262004f6157600080fd5b81358181111562004f7157600080fd5b88602082850101111562004f8457600080fd5b95989497505060200194505050565b60006020828403121562004fa657600080fd5b813562004b3d81620047d0565b803560ff81168114620034be57600080fd5b60008060008060008060c0878903121562004fdf57600080fd5b863562004fec81620047d0565b9550602087013562004ffe81620047d0565b94506200500e60408801620047e6565b93506200501e60608801620047e6565b9250608087013591506200503560a0880162004fb3565b90509295509295509295565b60008060008060008060c087890312156200505b57600080fd5b86356200506881620047d0565b955060208701356200507a81620047d0565b94506200508a60408801620047e6565b93506200509a6060880162004fb3565b92506080870135915060a08701356001600160401b03811115620050bd57600080fd5b620050cb89828a0162004bf8565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b8054600090600181811c90808316806200514157607f831692505b602080841082036200516357634e487b7160e01b600052602260045260246000fd5b838852602088018280156200518157600181146200519857620051c5565b60ff198716825285151560051b82019750620051c5565b60008981526020902060005b87811015620051bf57815484820152908601908401620051a4565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c060408201819052600090620052009083018762005126565b828103606084015262005214818762005126565b608084019590955250506001600160401b039190911660a090910152949350505050565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562005292576200529262005259565b5092915050565b808202811582820484141762000f935762000f9362005259565b600063ffffffff808316818103620052cf57620052cf62005259565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620053079083018462004dc7565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c060808201819052600090620053529083018562004dc7565b82810360a084015262005366818562004dc7565b9998505050505050505050565b6001600160401b0382811682821603908082111562005292576200529262005259565b60006001600160401b038281166002600160401b03198101620052cf57620052cf62005259565b634e487b7160e01b600052603260045260246000fd5b8082018082111562000f935762000f9362005259565b600060018201620053fe57620053fe62005259565b5060010190565b6000602082840312156200541857600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b6000826200544757620054476200541f565b500490565b6000826200545e576200545e6200541f565b500690565b8181038181111562000f935762000f9362005259565b918252602082015260400190565b60008162005499576200549962005259565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a0820181905260009062004eae9083018462004dc7565b600082516200554281846020870162004da1565b9190910192915050565b61032081016103008085843782018360005b60018110156200557f5781518352602092830192909101906001016200555e565b5050509392505050565b6000602082840312156200559c57600080fd5b8151801515811462004b3d57600080fd5b60006001600160401b0383811680620055ca57620055ca6200541f565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220a19e7a72432195d9a35c7ce8fa5f1284415aac66bb1ad08a4c2e1c252fd8690864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220f0c277530fc86ddd05a56918423fafab9c54bee2881e81568f1fab8a3f325a3d64736f6c63430008140033", + "bytecode": "0x60e06040523480156200001157600080fd5b506040516200636d3803806200636d833981016040819052620000349162000141565b6001600160a01b0380841660805280831660c052811660a0528282826200005a62000066565b50505050505062000195565b600054610100900460ff1615620000d35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000126576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013e57600080fd5b50565b6000806000606084860312156200015757600080fd5b8351620001648162000128565b6020850151909350620001778162000128565b60408501519092506200018a8162000128565b809150509250925092565b60805160a05160c051616170620001fd600039600081816109dc0152818161231d0152613bfc0152600081816107a201528181612e970152613ef601526000818161093601528181611333015281816114e301528181611ffd0152613de501526161706000f3fe60806040523480156200001157600080fd5b5060043610620002b65760003560e01c80630645af0914620002bb578063066ec01214620002d4578063080b311114620003005780630a0d9fbe14620003285780630e36f582146200034357806311f6b287146200035a57806312b86e1914620003715780631489ed10146200038857806315064c96146200039f5780631608859c14620003ad5780631796a1ae14620003c45780631816b7e514620003eb5780632072f6c51462000402578063248a9ca3146200040c5780632528016914620004325780632f2ff15d14620004e757806330c27dde14620004fe57806336568abe1462000512578063394218e91462000529578063477fa270146200054057806355a71ee0146200054957806360469169146200058d57806365c0504d14620005975780637222020f1462000646578063727885e9146200065d5780637975fcfe14620006745780637fb6e76a146200069a578063841b24d714620006c357806387c20c0114620006de5780638bd4f07114620006f55780638f698ec5146200070c57806391d14854146200072357806399f5634e146200073a5780639a908e7314620007445780639c9f3dfe146200075b578063a066215c1462000772578063a217fddf1462000789578063a2967d991462000792578063a3c573eb146200079c578063afd23cbe14620007d3578063b99d0ad714620007fd578063c1acbc3414620008d5578063c4c928c214620008f0578063ceee281d1462000907578063d02103ca1462000930578063d5073f6f1462000958578063d547741f146200096f578063d939b3151462000986578063dbc16976146200099a578063dde0ff7714620009a4578063e0bfd3d214620009bf578063e46761c414620009d6578063f34eb8eb14620009fe578063f4e926751462000a15578063f9c4c2ae1462000a26575b600080fd5b620002d2620002cc366004620048ad565b62000b3d565b005b608454620002e8906001600160401b031681565b604051620002f7919062004988565b60405180910390f35b6200031762000311366004620049b1565b62000f8f565b6040519015158152602001620002f7565b608554620002e890600160401b90046001600160401b031681565b620002d262000354366004620049e9565b62000fb9565b620002e86200036b36600462004a74565b62001267565b620002d26200038236600462004aa5565b62001287565b620002d26200039936600462004b3c565b62001437565b606f54620003179060ff1681565b620002d2620003be366004620049b1565b620015c7565b607e54620003d59063ffffffff1681565b60405163ffffffff9091168152602001620002f7565b620002d2620003fc36600462004bc6565b6200165c565b620002d262001708565b620004236200041d36600462004bf3565b620017ce565b604051908152602001620002f7565b620004b362000443366004620049b1565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002f7565b620002d2620004f836600462004c0d565b620017e3565b608754620002e8906001600160401b031681565b620002d26200052336600462004c0d565b62001805565b620002d26200053a36600462004c40565b6200183f565b60865462000423565b620004236200055a366004620049b1565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b62000423620018ee565b620005fc620005a836600462004a74565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002f7565b620002d26200065736600462004a74565b62001906565b620002d26200066e36600462004d1d565b620019f1565b6200068b6200068536600462004dea565b62001e59565b604051620002f7919062004ea4565b620003d5620006ab36600462004c40565b60836020526000908152604090205463ffffffff1681565b608454620002e890600160c01b90046001600160401b031681565b620002d2620006ef36600462004b3c565b62001e8c565b620002d26200070636600462004aa5565b620021b0565b620002d26200071d36600462004eb9565b62002266565b620003176200073436600462004c0d565b620022ed565b6200042362002318565b620002e86200075536600462004f69565b62002404565b620002d26200076c36600462004c40565b620025d1565b620002d26200078336600462004c40565b62002674565b62000423600081565b6200042362002713565b620007c47f000000000000000000000000000000000000000000000000000000000000000081565b604051620002f7919062004f96565b608554620007e990600160801b900461ffff1681565b60405161ffff9091168152602001620002f7565b620008936200080e366004620049b1565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002f7919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002e890600160801b90046001600160401b031681565b620002d26200090136600462004faa565b62002ad5565b620003d56200091836600462005042565b60826020526000908152604090205463ffffffff1681565b620007c47f000000000000000000000000000000000000000000000000000000000000000081565b620002d26200096936600462004bf3565b62002da2565b620002d26200098036600462004c0d565b62002e2d565b608554620002e8906001600160401b031681565b620002d262002e4f565b608454620002e890600160401b90046001600160401b031681565b620002d2620009d036600462005074565b62002f0d565b620007c47f000000000000000000000000000000000000000000000000000000000000000081565b620002d262000a0f366004620050f0565b62002fd5565b608054620003d59063ffffffff1681565b62000abd62000a3736600462004a74565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002f7565b600054600290610100900460ff1615801562000b60575060005460ff8083169116105b62000b885760405162461bcd60e51b815260040162000b7f9062005187565b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c09620031c0565b62000c246000805160206200611b8339815191528c6200322d565b62000c316000886200322d565b62000c4c60008051602062005ffb833981519152886200322d565b62000c676000805160206200607b833981519152886200322d565b62000c8260008051602062005f9b833981519152886200322d565b62000c9d60008051602062005fdb833981519152896200322d565b62000cb8600080516020620060fb833981519152896200322d565b62000cd36000805160206200601b833981519152896200322d565b62000cee6000805160206200609b833981519152896200322d565b62000d186000805160206200611b83398151915260008051602062005f7b83398151915262003239565b62000d3360008051602062005f7b833981519152896200322d565b62000d4e60008051602062005fbb833981519152896200322d565b62000d78600080516020620060db833981519152600080516020620060bb83398151915262003239565b62000d93600080516020620060db833981519152876200322d565b62000dae600080516020620060bb833981519152876200322d565b6073546074546001600160401b03600160401b9092048216911680821462000de957604051632e4cc54360e11b815260040160405180910390fd5b600062000e11888888886000607460009054906101000a90046001600160401b03166200328e565b6001600160401b03838116600081815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068b018054909216909417938802939093179092556007880180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81529596506001600160a01b038e81169663bb5907089662000f139694831695600160581b90950490921693607693607793909291169060040162005281565b600060405180830381600087803b15801562000f2e57600080fd5b505af115801562000f43573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff851681526000805160206200605b8339815191529350602001915062000f7a9050565b60405180910390a15050505050505050505050565b63ffffffff8216600090815260816020526040812062000fb09083620034bc565b90505b92915050565b600054600290610100900460ff1615801562000fdc575060005460ff8083169116105b62000ffb5760405162461bcd60e51b815260040162000b7f9062005187565b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200107c620031c0565b620010976000805160206200611b833981519152886200322d565b620010a46000846200322d565b620010bf60008051602062005ffb833981519152846200322d565b620010da6000805160206200607b833981519152846200322d565b620010f560008051602062005f9b833981519152846200322d565b6200111060008051602062005fdb833981519152856200322d565b6200112b600080516020620060fb833981519152856200322d565b620011466000805160206200601b833981519152856200322d565b620011616000805160206200609b833981519152856200322d565b6200118b6000805160206200611b83398151915260008051602062005f7b83398151915262003239565b620011a660008051602062005f7b833981519152856200322d565b620011c160008051602062005fbb833981519152856200322d565b620011eb600080516020620060db833981519152600080516020620060bb83398151915262003239565b62001206600080516020620060db833981519152836200322d565b62001221600080516020620060bb833981519152836200322d565b6200122e6000336200322d565b6000805461ff001916905560405160ff821681526000805160206200605b8339815191529060200160405180910390a150505050505050565b63ffffffff8116600090815260816020526040812062000fb39062003501565b6000805160206200611b833981519152620012a28162003572565b63ffffffff89166000908152608160205260409020620012c9818a8a8a8a8a8a8a6200357e565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001331576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200136a62002713565b6040518263ffffffff1660e01b81526004016200138991815260200190565b600060405180830381600087803b158015620013a457600080fd5b505af1158015620013b9573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b6000805160206200611b833981519152620014528162003572565b63ffffffff8916600090815260816020526040902062001479818a8a8a8a8a8a8a62003906565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b90041615620014e1576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200151a62002713565b6040518263ffffffff1660e01b81526004016200153991815260200190565b600060405180830381600087803b1580156200155457600080fd5b505af115801562001569573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a604051620015b393929190620052e7565b60405180910390a350505050505050505050565b63ffffffff82166000908152608160205260409020620015f76000805160206200611b83398151915233620022ed565b6200164b57606f5460ff16156200162157604051630bc011ff60e21b815260040160405180910390fd5b6200162d8183620034bc565b6200164b57604051630674f25160e11b815260040160405180910390fd5b62001657818362003d02565b505050565b6000805160206200609b833981519152620016778162003572565b6103e88261ffff1610806200169157506103ff8261ffff16115b15620016b057604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b62001723600080516020620060db83398151915233620022ed565b620017c257608454600160801b90046001600160401b031615806200177357506084544290620017689062093a8090600160801b90046001600160401b03166200531e565b6001600160401b0316115b80620017a357506087544290620017989062093a80906001600160401b03166200531e565b6001600160401b0316115b15620017c25760405163692baaad60e11b815260040160405180910390fd5b620017cc62003ef4565b565b60009081526034602052604090206001015490565b620017ee82620017ce565b620017f98162003572565b62001657838362003f73565b6001600160a01b03811633146200182f57604051630b4ad1cd60e31b815260040160405180910390fd5b6200183b828262003fdf565b5050565b6000805160206200609b8339815191526200185a8162003572565b606f5460ff166200189c576084546001600160401b03600160c01b9091048116908316106200189c5760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190620016fc90849062004988565b6000608654606462001901919062005348565b905090565b60008051602062005fdb833981519152620019218162003572565b63ffffffff82161580620019405750607e5463ffffffff908116908316115b156200195f57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff1615159003620019a657604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b600080516020620060fb83398151915262001a0c8162003572565b63ffffffff8816158062001a2b5750607e5463ffffffff908116908916115b1562001a4a57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff161515900362001a9157604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001acf576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062001aea9063ffffffff1662005362565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001b389062004871565b62001b469392919062005388565b604051809103906000f08015801562001b63573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001dd7949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001e17908d908d9088908e908e908e90600401620053bf565b600060405180830381600087803b15801562001e3257600080fd5b505af115801562001e47573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001e8190878787878762004049565b979650505050505050565b606f5460ff161562001eb157604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001f0092600160c01b9004811691166200531e565b6001600160401b0316111562001f2957604051638a0704d360e01b815260040160405180910390fd5b6103e862001f38888862005422565b6001600160401b0316111562001f6157604051635acfba9d60e11b815260040160405180910390fd5b62001f73818989898989898962003906565b62001f7f818762004184565b6085546001600160401b03166000036200208d57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001ffb576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200203462002713565b6040518263ffffffff1660e01b81526004016200205391815260200190565b600060405180830381600087803b1580156200206e57600080fd5b505af115801562002083573d6000803e3d6000fd5b5050505062002157565b620020988162004381565b600681018054600160801b90046001600160401b0316906010620020bc8362005445565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b48887896040516200219d93929190620052e7565b60405180910390a3505050505050505050565b606f5460ff1615620021d557604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88166000908152608160205260409020620021fc81898989898989896200357e565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16200225b62003ef4565b505050505050505050565b80516080805463ffffffff191663ffffffff90921691909117905560005b81518110156200183b57818181518110620022a357620022a36200546c565b602002602001015160816000836001620022be919062005482565b63ffffffff16815260208101919091526040016000206005015580620022e48162005498565b91505062002284565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162002369919062004f96565b602060405180830381865afa15801562002387573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620023ad9190620054b4565b608454909150600090620023d4906001600160401b03600160401b82048116911662005422565b6001600160401b0316905080600003620023f15760009250505090565b620023fd8183620054e4565b9250505090565b606f5460009060ff16156200242c57604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362002464576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200248f57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620024c29084906001600160401b03166200531e565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620024f887836200531e565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b031990921692909316919091171790559050620025878362004381565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a2582604051620025bf919062004988565b60405180910390a29695505050505050565b6000805160206200609b833981519152620025ec8162003572565b606f5460ff1662002627576085546001600160401b0390811690831610620026275760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590620016fc90849062004988565b6000805160206200609b8339815191526200268f8162003572565b62015180826001600160401b03161115620026bd57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890620016fc90849062004988565b60805460009063ffffffff168082036200272f57506000919050565b6000816001600160401b038111156200274c576200274c62004c5e565b60405190808252806020026020018201604052801562002776578160200160208202803683370190505b50905060005b82811015620027e957608160006200279683600162005482565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620027c957620027c96200546c565b602090810291909101015280620027e08162005498565b9150506200277c565b50600060205b8360011462002a2d57600062002807600286620054fb565b62002814600287620054e4565b62002820919062005482565b90506000816001600160401b038111156200283f576200283f62004c5e565b60405190808252806020026020018201604052801562002869578160200160208202803683370190505b50905060005b82811015620029e1576200288560018462005512565b81148015620028a057506200289c600288620054fb565b6001145b15620029205785620028b482600262005348565b81518110620028c757620028c76200546c565b602002602001015185604051602001620028e392919062005528565b604051602081830303815290604052805190602001208282815181106200290e576200290e6200546c565b602002602001018181525050620029cc565b856200292e82600262005348565b815181106200294157620029416200546c565b60200260200101518682600262002959919062005348565b6200296690600162005482565b815181106200297957620029796200546c565b60200260200101516040516020016200299492919062005528565b60405160208183030381529060405280519060200120828281518110620029bf57620029bf6200546c565b6020026020010181815250505b80620029d88162005498565b9150506200286f565b508094508195508384604051602001620029fd92919062005528565b604051602081830303815290604052805190602001209350828062002a229062005536565b9350505050620027ef565b60008360008151811062002a455762002a456200546c565b6020026020010151905060005b8281101562002acb57818460405160200162002a7092919062005528565b604051602081830303815290604052805190602001209150838460405160200162002a9d92919062005528565b604051602081830303815290604052805190602001209350808062002ac29062005498565b91505062002a52565b5095945050505050565b60008051602062005f9b83398151915262002af08162003572565b63ffffffff8416158062002b0f5750607e5463ffffffff908116908516115b1562002b2e57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002b6f576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002bbe57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002c0557604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002c4357604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002cc38462001267565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002d189216908b908b9060040162005550565b600060405180830381600087803b15801562002d3357600080fd5b505af115801562002d48573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005fbb83398151915262002dbd8162003572565b683635c9adc5dea0000082118062002dd85750633b9aca0082105b1562002df757604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620016fc565b62002e3882620017ce565b62002e438162003572565b62001657838362003fdf565b6000805160206200601b83398151915262002e6a8162003572565b608780546001600160401b031916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc1697691600480830192600092919082900301818387803b15801562002ee757600080fd5b505af115801562002efc573d6000803e3d6000fd5b5050505062002f0a6200444c565b50565b6000805160206200607b83398151915262002f288162003572565b6001600160401b03841660009081526083602052604090205463ffffffff161562002f66576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b03871660009081526082602052604090205463ffffffff161562002fa457604051630d409b9360e41b815260040160405180910390fd5b600062002fb7888888888760006200328e565b60008080526002909101602052604090209390935550505050505050565b60008051602062005ffb83398151915262002ff08162003572565b607e80546000919082906200300b9063ffffffff1662005362565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620031ae9695949392919062005590565b60405180910390a25050505050505050565b600054610100900460ff16620017cc5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b7f565b6200183b828262003f73565b60006200324683620017ce565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6080805460009182918290620032aa9063ffffffff1662005362565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000876001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff16021790555080608260008a6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150878260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550868260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620034a99594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b03828116600090815260048501602052604081205490924292620034ef9291811691166200531e565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b03161562003555575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002f0a8133620044a5565b60078801546000906001600160401b039081169087161015620035b45760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620036555760068901546001600160401b03600160801b90910481169089161115620035fe5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200364e57604051632bd2e3e760e01b815260040160405180910390fd5b50620036ca565b506001600160401b03851660009081526002890160205260409020548062003690576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620036ca57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620037035750876001600160401b0316876001600160401b031611155b8062003727575060068901546001600160401b03600160c01b909104811690881611155b15620037465760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b90048116908616146200378d576040516332a2a77f60e01b815260040160405180910390fd5b60006200379f8a888888868962004049565b905060006000805160206200603b833981519152600283604051620037c59190620055dd565b602060405180830381855afa158015620037e3573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620038089190620054b4565b620038149190620054fb565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200385891889190600401620055fb565b602060405180830381865afa15801562003876573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200389c919062005638565b620038ba576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620038f95760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620039148a62003501565b60078b01549091506001600160401b0390811690891610156200394a5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620039ed5760068a01546001600160401b03600160801b9091048116908a161115620039945760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620039e657604051632bd2e3e760e01b815260040160405180910390fd5b5062003a5d565b6001600160401b038816600090815260028b01602052604090205491508162003a29576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b0316111562003a5d57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b03161162003a905760405163b9b18f5760e01b815260040160405180910390fd5b600062003aa28b8a8a8a878b62004049565b905060006000805160206200603b83398151915260028360405162003ac89190620055dd565b602060405180830381855afa15801562003ae6573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003b0b9190620054b4565b62003b179190620054fb565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003b5b91899190600401620055fb565b602060405180830381865afa15801562003b79573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003b9f919062005638565b62003bbd576040516309bde33960e01b815260040160405180910390fd5b600062003bcb848b62005422565b905062003c2487826001600160401b031662003be662002318565b62003bf2919062005348565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620044cf565b80608460088282829054906101000a90046001600160401b031662003c4a91906200531e565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b15801562003cda57600080fd5b505af115801562003cef573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003d41575060068201546001600160401b03600160801b9091048116908216115b1562003d605760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003e1c62002713565b6040518263ffffffff1660e01b815260040162003e3b91815260200190565b600060405180830381600087803b15801562003e5657600080fd5b505af115801562003e6b573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003f5057600080fd5b505af115801562003f65573d6000803e3d6000fd5b50505050620017cc62004523565b62003f7f8282620022ed565b6200183b5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003feb8282620022ed565b156200183b5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b03808616600081815260038901602052604080822054938816825290205460609291158015906200407f575081155b156200409e5760405163340c614f60e11b815260040160405180910390fd5b80620040bd576040516366385b5160e01b815260040160405180910390fd5b620040c88462004580565b620040e6576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b6000620041918362003501565b905081600080620041a3848462005422565b6085546001600160401b039182169250600091620041ca91600160401b9004164262005512565b90505b846001600160401b0316846001600160401b03161462004254576001600160401b038085166000908152600389016020526040902060018101549091168210156200422f576001810154600160401b90046001600160401b031694506200424d565b6200423b868662005422565b6001600160401b031693505062004254565b50620041cd565b600062004262848462005512565b905083811015620042c057808403600c811162004280578062004283565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620042b557620042b5620054ce565b046086555062004338565b838103600c8111620042d35780620042d6565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a76400000281620043105762004310620054ce565b04905080608654670de0b6b3a76400000281620043315762004331620054ce565b0460865550505b683635c9adc5dea0000060865411156200435f57683635c9adc5dea0000060865562004377565b633b9aca0060865410156200437757633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002f0a576006810154600090620043cc90600160c01b90046001600160401b031660016200531e565b9050620043da8282620034bc565b156200183b57600682015460009060029062004408908490600160801b90046001600160401b031662005422565b6200441491906200565c565b6200442090836200531e565b90506200442e8382620034bc565b15620044405762001657838262003d02565b62001657838362003d02565b606f5460ff166200447057604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b620044b18282620022ed565b6200183b57604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526200165790849062004606565b606f5460ff16156200454857604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b038316108015620045b7575067ffffffff00000001604083901c6001600160401b0316105b8015620045d8575067ffffffff00000001608083901c6001600160401b0316105b8015620045f0575067ffffffff0000000160c083901c105b15620045fe57506001919050565b506000919050565b60006200465d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620046df9092919063ffffffff16565b8051909150156200165757808060200190518101906200467e919062005638565b620016575760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b7f565b6060620046f08484600085620046f8565b949350505050565b6060824710156200475b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b7f565b600080866001600160a01b03168587604051620047799190620055dd565b60006040518083038185875af1925050503d8060008114620047b8576040519150601f19603f3d011682016040523d82523d6000602084013e620047bd565b606091505b509150915062001e8187838387606083156200483e57825160000362004836576001600160a01b0385163b620048365760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b7f565b5081620046f0565b620046f08383815115620048555781518083602001fd5b8060405162461bcd60e51b815260040162000b7f919062004ea4565b6108f5806200568683390190565b6001600160a01b038116811462002f0a57600080fd5b80356001600160401b03811681146200356d57600080fd5b6000806000806000806000806000806101408b8d031215620048ce57600080fd5b8a35620048db816200487f565b9950620048eb60208c0162004895565b9850620048fb60408c0162004895565b975060608b01356200490d816200487f565b965060808b01356200491f816200487f565b955060a08b013562004931816200487f565b945060c08b013562004943816200487f565b935060e08b013562004955816200487f565b9250620049666101008c0162004895565b9150620049776101208c0162004895565b90509295989b9194979a5092959850565b6001600160401b0391909116815260200190565b803563ffffffff811681146200356d57600080fd5b60008060408385031215620049c557600080fd5b620049d0836200499c565b9150620049e06020840162004895565b90509250929050565b60008060008060008060c0878903121562004a0357600080fd5b863562004a10816200487f565b955062004a206020880162004895565b945062004a306040880162004895565b9350606087013562004a42816200487f565b9250608087013562004a54816200487f565b915060a087013562004a66816200487f565b809150509295509295509295565b60006020828403121562004a8757600080fd5b62000fb0826200499c565b80610300810183101562000fb357600080fd5b6000806000806000806000806103e0898b03121562004ac357600080fd5b62004ace896200499c565b975062004ade60208a0162004895565b965062004aee60408a0162004895565b955062004afe60608a0162004895565b945062004b0e60808a0162004895565b935060a0890135925060c0890135915062004b2d8a60e08b0162004a92565b90509295985092959890939650565b6000806000806000806000806103e0898b03121562004b5a57600080fd5b62004b65896200499c565b975062004b7560208a0162004895565b965062004b8560408a0162004895565b955062004b9560608a0162004895565b94506080890135935060a0890135925060c089013562004bb5816200487f565b915062004b2d8a60e08b0162004a92565b60006020828403121562004bd957600080fd5b813561ffff8116811462004bec57600080fd5b9392505050565b60006020828403121562004c0657600080fd5b5035919050565b6000806040838503121562004c2157600080fd5b82359150602083013562004c35816200487f565b809150509250929050565b60006020828403121562004c5357600080fd5b62000fb08262004895565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562004c9f5762004c9f62004c5e565b604052919050565b600082601f83011262004cb957600080fd5b81356001600160401b0381111562004cd55762004cd562004c5e565b62004cea601f8201601f191660200162004c74565b81815284602083860101111562004d0057600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600080600060e0888a03121562004d3957600080fd5b62004d44886200499c565b965062004d546020890162004895565b9550604088013562004d66816200487f565b9450606088013562004d78816200487f565b9350608088013562004d8a816200487f565b925060a08801356001600160401b038082111562004da757600080fd5b62004db58b838c0162004ca7565b935060c08a013591508082111562004dcc57600080fd5b5062004ddb8a828b0162004ca7565b91505092959891949750929550565b60008060008060008060c0878903121562004e0457600080fd5b62004e0f876200499c565b955062004e1f6020880162004895565b945062004e2f6040880162004895565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004e6d57818101518382015260200162004e53565b50506000910152565b6000815180845262004e9081602086016020860162004e50565b601f01601f19169290920160200192915050565b60208152600062000fb0602083018462004e76565b6000602080838503121562004ecd57600080fd5b82356001600160401b038082111562004ee557600080fd5b818501915085601f83011262004efa57600080fd5b81358181111562004f0f5762004f0f62004c5e565b8060051b915062004f2284830162004c74565b818152918301840191848101908884111562004f3d57600080fd5b938501935b8385101562004f5d5784358252938501939085019062004f42565b98975050505050505050565b6000806040838503121562004f7d57600080fd5b62004f888362004895565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000806000806060858703121562004fc157600080fd5b843562004fce816200487f565b935062004fde602086016200499c565b925060408501356001600160401b038082111562004ffb57600080fd5b818701915087601f8301126200501057600080fd5b8135818111156200502057600080fd5b8860208285010111156200503357600080fd5b95989497505060200194505050565b6000602082840312156200505557600080fd5b813562004bec816200487f565b803560ff811681146200356d57600080fd5b60008060008060008060c087890312156200508e57600080fd5b86356200509b816200487f565b95506020870135620050ad816200487f565b9450620050bd6040880162004895565b9350620050cd6060880162004895565b925060808701359150620050e460a0880162005062565b90509295509295509295565b60008060008060008060c087890312156200510a57600080fd5b863562005117816200487f565b9550602087013562005129816200487f565b9450620051396040880162004895565b9350620051496060880162005062565b92506080870135915060a08701356001600160401b038111156200516c57600080fd5b6200517a89828a0162004ca7565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b8054600090600181811c9080831680620051f057607f831692505b602080841082036200521257634e487b7160e01b600052602260045260246000fd5b83885260208801828015620052305760018114620052475762005274565b60ff198716825285151560051b8201975062005274565b60008981526020902060005b878110156200526e5781548482015290860190840162005253565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c060408201819052600090620052af90830187620051d5565b8281036060840152620052c38187620051d5565b608084019590955250506001600160401b039190911660a090910152949350505050565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562005341576200534162005308565b5092915050565b808202811582820484141762000fb35762000fb362005308565b600063ffffffff8083168181036200537e576200537e62005308565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620053b69083018462004e76565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c060808201819052600090620054019083018562004e76565b82810360a084015262005415818562004e76565b9998505050505050505050565b6001600160401b0382811682821603908082111562005341576200534162005308565b60006001600160401b038281166002600160401b031981016200537e576200537e62005308565b634e487b7160e01b600052603260045260246000fd5b8082018082111562000fb35762000fb362005308565b600060018201620054ad57620054ad62005308565b5060010190565b600060208284031215620054c757600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082620054f657620054f6620054ce565b500490565b6000826200550d576200550d620054ce565b500690565b8181038181111562000fb35762000fb362005308565b918252602082015260400190565b60008162005548576200554862005308565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a0820181905260009062004f5d9083018462004e76565b60008251620055f181846020870162004e50565b9190910192915050565b61032081016103008085843782018360005b60018110156200562e5781518352602092830192909101906001016200560d565b5050509392505050565b6000602082840312156200564b57600080fd5b8151801515811462004bec57600080fd5b60006001600160401b0383811680620056795762005679620054ce565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca26469706673582212208e78e901799caaaff866d77d874534e79db9f4bae5f48cfae79611891464d2c664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220b4e84f276524b22fbe82e90bcf3803a423a5f13e0a292c4910a87f421c2a476864736f6c63430008140033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620002b65760003560e01c80630645af0914620002bb578063066ec01214620002d4578063080b311114620003005780630a0d9fbe14620003285780630e36f582146200034357806311f6b287146200035a57806312b86e1914620003715780631489ed10146200038857806315064c96146200039f5780631608859c14620003ad5780631796a1ae14620003c45780631816b7e514620003eb5780632072f6c51462000402578063248a9ca3146200040c5780632528016914620004325780632f2ff15d14620004e757806330c27dde14620004fe57806336568abe1462000512578063394218e91462000529578063477fa270146200054057806355a71ee0146200054957806360469169146200058d57806365c0504d14620005975780637222020f1462000646578063727885e9146200065d5780637975fcfe14620006745780637fb6e76a146200069a578063841b24d714620006c357806387c20c0114620006de5780638bd4f07114620006f55780638f698ec5146200070c57806391d14854146200072357806399f5634e146200073a5780639a908e7314620007445780639c9f3dfe146200075b578063a066215c1462000772578063a217fddf1462000789578063a2967d991462000792578063a3c573eb146200079c578063afd23cbe14620007d3578063b99d0ad714620007fd578063c1acbc3414620008d5578063c4c928c214620008f0578063ceee281d1462000907578063d02103ca1462000930578063d5073f6f1462000958578063d547741f146200096f578063d939b3151462000986578063dbc16976146200099a578063dde0ff7714620009a4578063e0bfd3d214620009bf578063e46761c414620009d6578063f34eb8eb14620009fe578063f4e926751462000a15578063f9c4c2ae1462000a26575b600080fd5b620002d2620002cc366004620048ad565b62000b3d565b005b608454620002e8906001600160401b031681565b604051620002f7919062004988565b60405180910390f35b6200031762000311366004620049b1565b62000f8f565b6040519015158152602001620002f7565b608554620002e890600160401b90046001600160401b031681565b620002d262000354366004620049e9565b62000fb9565b620002e86200036b36600462004a74565b62001267565b620002d26200038236600462004aa5565b62001287565b620002d26200039936600462004b3c565b62001437565b606f54620003179060ff1681565b620002d2620003be366004620049b1565b620015c7565b607e54620003d59063ffffffff1681565b60405163ffffffff9091168152602001620002f7565b620002d2620003fc36600462004bc6565b6200165c565b620002d262001708565b620004236200041d36600462004bf3565b620017ce565b604051908152602001620002f7565b620004b362000443366004620049b1565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002f7565b620002d2620004f836600462004c0d565b620017e3565b608754620002e8906001600160401b031681565b620002d26200052336600462004c0d565b62001805565b620002d26200053a36600462004c40565b6200183f565b60865462000423565b620004236200055a366004620049b1565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b62000423620018ee565b620005fc620005a836600462004a74565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002f7565b620002d26200065736600462004a74565b62001906565b620002d26200066e36600462004d1d565b620019f1565b6200068b6200068536600462004dea565b62001e59565b604051620002f7919062004ea4565b620003d5620006ab36600462004c40565b60836020526000908152604090205463ffffffff1681565b608454620002e890600160c01b90046001600160401b031681565b620002d2620006ef36600462004b3c565b62001e8c565b620002d26200070636600462004aa5565b620021b0565b620002d26200071d36600462004eb9565b62002266565b620003176200073436600462004c0d565b620022ed565b6200042362002318565b620002e86200075536600462004f69565b62002404565b620002d26200076c36600462004c40565b620025d1565b620002d26200078336600462004c40565b62002674565b62000423600081565b6200042362002713565b620007c47f000000000000000000000000000000000000000000000000000000000000000081565b604051620002f7919062004f96565b608554620007e990600160801b900461ffff1681565b60405161ffff9091168152602001620002f7565b620008936200080e366004620049b1565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002f7919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002e890600160801b90046001600160401b031681565b620002d26200090136600462004faa565b62002ad5565b620003d56200091836600462005042565b60826020526000908152604090205463ffffffff1681565b620007c47f000000000000000000000000000000000000000000000000000000000000000081565b620002d26200096936600462004bf3565b62002da2565b620002d26200098036600462004c0d565b62002e2d565b608554620002e8906001600160401b031681565b620002d262002e4f565b608454620002e890600160401b90046001600160401b031681565b620002d2620009d036600462005074565b62002f0d565b620007c47f000000000000000000000000000000000000000000000000000000000000000081565b620002d262000a0f366004620050f0565b62002fd5565b608054620003d59063ffffffff1681565b62000abd62000a3736600462004a74565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002f7565b600054600290610100900460ff1615801562000b60575060005460ff8083169116105b62000b885760405162461bcd60e51b815260040162000b7f9062005187565b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c09620031c0565b62000c246000805160206200611b8339815191528c6200322d565b62000c316000886200322d565b62000c4c60008051602062005ffb833981519152886200322d565b62000c676000805160206200607b833981519152886200322d565b62000c8260008051602062005f9b833981519152886200322d565b62000c9d60008051602062005fdb833981519152896200322d565b62000cb8600080516020620060fb833981519152896200322d565b62000cd36000805160206200601b833981519152896200322d565b62000cee6000805160206200609b833981519152896200322d565b62000d186000805160206200611b83398151915260008051602062005f7b83398151915262003239565b62000d3360008051602062005f7b833981519152896200322d565b62000d4e60008051602062005fbb833981519152896200322d565b62000d78600080516020620060db833981519152600080516020620060bb83398151915262003239565b62000d93600080516020620060db833981519152876200322d565b62000dae600080516020620060bb833981519152876200322d565b6073546074546001600160401b03600160401b9092048216911680821462000de957604051632e4cc54360e11b815260040160405180910390fd5b600062000e11888888886000607460009054906101000a90046001600160401b03166200328e565b6001600160401b03838116600081815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068b018054909216909417938802939093179092556007880180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81529596506001600160a01b038e81169663bb5907089662000f139694831695600160581b90950490921693607693607793909291169060040162005281565b600060405180830381600087803b15801562000f2e57600080fd5b505af115801562000f43573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff851681526000805160206200605b8339815191529350602001915062000f7a9050565b60405180910390a15050505050505050505050565b63ffffffff8216600090815260816020526040812062000fb09083620034bc565b90505b92915050565b600054600290610100900460ff1615801562000fdc575060005460ff8083169116105b62000ffb5760405162461bcd60e51b815260040162000b7f9062005187565b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200107c620031c0565b620010976000805160206200611b833981519152886200322d565b620010a46000846200322d565b620010bf60008051602062005ffb833981519152846200322d565b620010da6000805160206200607b833981519152846200322d565b620010f560008051602062005f9b833981519152846200322d565b6200111060008051602062005fdb833981519152856200322d565b6200112b600080516020620060fb833981519152856200322d565b620011466000805160206200601b833981519152856200322d565b620011616000805160206200609b833981519152856200322d565b6200118b6000805160206200611b83398151915260008051602062005f7b83398151915262003239565b620011a660008051602062005f7b833981519152856200322d565b620011c160008051602062005fbb833981519152856200322d565b620011eb600080516020620060db833981519152600080516020620060bb83398151915262003239565b62001206600080516020620060db833981519152836200322d565b62001221600080516020620060bb833981519152836200322d565b6200122e6000336200322d565b6000805461ff001916905560405160ff821681526000805160206200605b8339815191529060200160405180910390a150505050505050565b63ffffffff8116600090815260816020526040812062000fb39062003501565b6000805160206200611b833981519152620012a28162003572565b63ffffffff89166000908152608160205260409020620012c9818a8a8a8a8a8a8a6200357e565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001331576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200136a62002713565b6040518263ffffffff1660e01b81526004016200138991815260200190565b600060405180830381600087803b158015620013a457600080fd5b505af1158015620013b9573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b6000805160206200611b833981519152620014528162003572565b63ffffffff8916600090815260816020526040902062001479818a8a8a8a8a8a8a62003906565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b90041615620014e1576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200151a62002713565b6040518263ffffffff1660e01b81526004016200153991815260200190565b600060405180830381600087803b1580156200155457600080fd5b505af115801562001569573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a604051620015b393929190620052e7565b60405180910390a350505050505050505050565b63ffffffff82166000908152608160205260409020620015f76000805160206200611b83398151915233620022ed565b6200164b57606f5460ff16156200162157604051630bc011ff60e21b815260040160405180910390fd5b6200162d8183620034bc565b6200164b57604051630674f25160e11b815260040160405180910390fd5b62001657818362003d02565b505050565b6000805160206200609b833981519152620016778162003572565b6103e88261ffff1610806200169157506103ff8261ffff16115b15620016b057604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b62001723600080516020620060db83398151915233620022ed565b620017c257608454600160801b90046001600160401b031615806200177357506084544290620017689062093a8090600160801b90046001600160401b03166200531e565b6001600160401b0316115b80620017a357506087544290620017989062093a80906001600160401b03166200531e565b6001600160401b0316115b15620017c25760405163692baaad60e11b815260040160405180910390fd5b620017cc62003ef4565b565b60009081526034602052604090206001015490565b620017ee82620017ce565b620017f98162003572565b62001657838362003f73565b6001600160a01b03811633146200182f57604051630b4ad1cd60e31b815260040160405180910390fd5b6200183b828262003fdf565b5050565b6000805160206200609b8339815191526200185a8162003572565b606f5460ff166200189c576084546001600160401b03600160c01b9091048116908316106200189c5760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190620016fc90849062004988565b6000608654606462001901919062005348565b905090565b60008051602062005fdb833981519152620019218162003572565b63ffffffff82161580620019405750607e5463ffffffff908116908316115b156200195f57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff1615159003620019a657604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b600080516020620060fb83398151915262001a0c8162003572565b63ffffffff8816158062001a2b5750607e5463ffffffff908116908916115b1562001a4a57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff161515900362001a9157604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001acf576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062001aea9063ffffffff1662005362565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001b389062004871565b62001b469392919062005388565b604051809103906000f08015801562001b63573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001dd7949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001e17908d908d9088908e908e908e90600401620053bf565b600060405180830381600087803b15801562001e3257600080fd5b505af115801562001e47573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001e8190878787878762004049565b979650505050505050565b606f5460ff161562001eb157604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001f0092600160c01b9004811691166200531e565b6001600160401b0316111562001f2957604051638a0704d360e01b815260040160405180910390fd5b6103e862001f38888862005422565b6001600160401b0316111562001f6157604051635acfba9d60e11b815260040160405180910390fd5b62001f73818989898989898962003906565b62001f7f818762004184565b6085546001600160401b03166000036200208d57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001ffb576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200203462002713565b6040518263ffffffff1660e01b81526004016200205391815260200190565b600060405180830381600087803b1580156200206e57600080fd5b505af115801562002083573d6000803e3d6000fd5b5050505062002157565b620020988162004381565b600681018054600160801b90046001600160401b0316906010620020bc8362005445565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b48887896040516200219d93929190620052e7565b60405180910390a3505050505050505050565b606f5460ff1615620021d557604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88166000908152608160205260409020620021fc81898989898989896200357e565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16200225b62003ef4565b505050505050505050565b80516080805463ffffffff191663ffffffff90921691909117905560005b81518110156200183b57818181518110620022a357620022a36200546c565b602002602001015160816000836001620022be919062005482565b63ffffffff16815260208101919091526040016000206005015580620022e48162005498565b91505062002284565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162002369919062004f96565b602060405180830381865afa15801562002387573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620023ad9190620054b4565b608454909150600090620023d4906001600160401b03600160401b82048116911662005422565b6001600160401b0316905080600003620023f15760009250505090565b620023fd8183620054e4565b9250505090565b606f5460009060ff16156200242c57604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362002464576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200248f57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620024c29084906001600160401b03166200531e565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620024f887836200531e565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b031990921692909316919091171790559050620025878362004381565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a2582604051620025bf919062004988565b60405180910390a29695505050505050565b6000805160206200609b833981519152620025ec8162003572565b606f5460ff1662002627576085546001600160401b0390811690831610620026275760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590620016fc90849062004988565b6000805160206200609b8339815191526200268f8162003572565b62015180826001600160401b03161115620026bd57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890620016fc90849062004988565b60805460009063ffffffff168082036200272f57506000919050565b6000816001600160401b038111156200274c576200274c62004c5e565b60405190808252806020026020018201604052801562002776578160200160208202803683370190505b50905060005b82811015620027e957608160006200279683600162005482565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620027c957620027c96200546c565b602090810291909101015280620027e08162005498565b9150506200277c565b50600060205b8360011462002a2d57600062002807600286620054fb565b62002814600287620054e4565b62002820919062005482565b90506000816001600160401b038111156200283f576200283f62004c5e565b60405190808252806020026020018201604052801562002869578160200160208202803683370190505b50905060005b82811015620029e1576200288560018462005512565b81148015620028a057506200289c600288620054fb565b6001145b15620029205785620028b482600262005348565b81518110620028c757620028c76200546c565b602002602001015185604051602001620028e392919062005528565b604051602081830303815290604052805190602001208282815181106200290e576200290e6200546c565b602002602001018181525050620029cc565b856200292e82600262005348565b815181106200294157620029416200546c565b60200260200101518682600262002959919062005348565b6200296690600162005482565b815181106200297957620029796200546c565b60200260200101516040516020016200299492919062005528565b60405160208183030381529060405280519060200120828281518110620029bf57620029bf6200546c565b6020026020010181815250505b80620029d88162005498565b9150506200286f565b508094508195508384604051602001620029fd92919062005528565b604051602081830303815290604052805190602001209350828062002a229062005536565b9350505050620027ef565b60008360008151811062002a455762002a456200546c565b6020026020010151905060005b8281101562002acb57818460405160200162002a7092919062005528565b604051602081830303815290604052805190602001209150838460405160200162002a9d92919062005528565b604051602081830303815290604052805190602001209350808062002ac29062005498565b91505062002a52565b5095945050505050565b60008051602062005f9b83398151915262002af08162003572565b63ffffffff8416158062002b0f5750607e5463ffffffff908116908516115b1562002b2e57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002b6f576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002bbe57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002c0557604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002c4357604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002cc38462001267565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002d189216908b908b9060040162005550565b600060405180830381600087803b15801562002d3357600080fd5b505af115801562002d48573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005fbb83398151915262002dbd8162003572565b683635c9adc5dea0000082118062002dd85750633b9aca0082105b1562002df757604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620016fc565b62002e3882620017ce565b62002e438162003572565b62001657838362003fdf565b6000805160206200601b83398151915262002e6a8162003572565b608780546001600160401b031916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc1697691600480830192600092919082900301818387803b15801562002ee757600080fd5b505af115801562002efc573d6000803e3d6000fd5b5050505062002f0a6200444c565b50565b6000805160206200607b83398151915262002f288162003572565b6001600160401b03841660009081526083602052604090205463ffffffff161562002f66576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b03871660009081526082602052604090205463ffffffff161562002fa457604051630d409b9360e41b815260040160405180910390fd5b600062002fb7888888888760006200328e565b60008080526002909101602052604090209390935550505050505050565b60008051602062005ffb83398151915262002ff08162003572565b607e80546000919082906200300b9063ffffffff1662005362565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620031ae9695949392919062005590565b60405180910390a25050505050505050565b600054610100900460ff16620017cc5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b7f565b6200183b828262003f73565b60006200324683620017ce565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6080805460009182918290620032aa9063ffffffff1662005362565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000876001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff16021790555080608260008a6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150878260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550868260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620034a99594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b03828116600090815260048501602052604081205490924292620034ef9291811691166200531e565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b03161562003555575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002f0a8133620044a5565b60078801546000906001600160401b039081169087161015620035b45760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620036555760068901546001600160401b03600160801b90910481169089161115620035fe5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200364e57604051632bd2e3e760e01b815260040160405180910390fd5b50620036ca565b506001600160401b03851660009081526002890160205260409020548062003690576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620036ca57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620037035750876001600160401b0316876001600160401b031611155b8062003727575060068901546001600160401b03600160c01b909104811690881611155b15620037465760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b90048116908616146200378d576040516332a2a77f60e01b815260040160405180910390fd5b60006200379f8a888888868962004049565b905060006000805160206200603b833981519152600283604051620037c59190620055dd565b602060405180830381855afa158015620037e3573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620038089190620054b4565b620038149190620054fb565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200385891889190600401620055fb565b602060405180830381865afa15801562003876573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200389c919062005638565b620038ba576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620038f95760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620039148a62003501565b60078b01549091506001600160401b0390811690891610156200394a5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620039ed5760068a01546001600160401b03600160801b9091048116908a161115620039945760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620039e657604051632bd2e3e760e01b815260040160405180910390fd5b5062003a5d565b6001600160401b038816600090815260028b01602052604090205491508162003a29576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b0316111562003a5d57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b03161162003a905760405163b9b18f5760e01b815260040160405180910390fd5b600062003aa28b8a8a8a878b62004049565b905060006000805160206200603b83398151915260028360405162003ac89190620055dd565b602060405180830381855afa15801562003ae6573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003b0b9190620054b4565b62003b179190620054fb565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003b5b91899190600401620055fb565b602060405180830381865afa15801562003b79573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003b9f919062005638565b62003bbd576040516309bde33960e01b815260040160405180910390fd5b600062003bcb848b62005422565b905062003c2487826001600160401b031662003be662002318565b62003bf2919062005348565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620044cf565b80608460088282829054906101000a90046001600160401b031662003c4a91906200531e565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b15801562003cda57600080fd5b505af115801562003cef573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003d41575060068201546001600160401b03600160801b9091048116908216115b1562003d605760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003e1c62002713565b6040518263ffffffff1660e01b815260040162003e3b91815260200190565b600060405180830381600087803b15801562003e5657600080fd5b505af115801562003e6b573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003f5057600080fd5b505af115801562003f65573d6000803e3d6000fd5b50505050620017cc62004523565b62003f7f8282620022ed565b6200183b5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003feb8282620022ed565b156200183b5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b03808616600081815260038901602052604080822054938816825290205460609291158015906200407f575081155b156200409e5760405163340c614f60e11b815260040160405180910390fd5b80620040bd576040516366385b5160e01b815260040160405180910390fd5b620040c88462004580565b620040e6576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b6000620041918362003501565b905081600080620041a3848462005422565b6085546001600160401b039182169250600091620041ca91600160401b9004164262005512565b90505b846001600160401b0316846001600160401b03161462004254576001600160401b038085166000908152600389016020526040902060018101549091168210156200422f576001810154600160401b90046001600160401b031694506200424d565b6200423b868662005422565b6001600160401b031693505062004254565b50620041cd565b600062004262848462005512565b905083811015620042c057808403600c811162004280578062004283565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620042b557620042b5620054ce565b046086555062004338565b838103600c8111620042d35780620042d6565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a76400000281620043105762004310620054ce565b04905080608654670de0b6b3a76400000281620043315762004331620054ce565b0460865550505b683635c9adc5dea0000060865411156200435f57683635c9adc5dea0000060865562004377565b633b9aca0060865410156200437757633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002f0a576006810154600090620043cc90600160c01b90046001600160401b031660016200531e565b9050620043da8282620034bc565b156200183b57600682015460009060029062004408908490600160801b90046001600160401b031662005422565b6200441491906200565c565b6200442090836200531e565b90506200442e8382620034bc565b15620044405762001657838262003d02565b62001657838362003d02565b606f5460ff166200447057604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b620044b18282620022ed565b6200183b57604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526200165790849062004606565b606f5460ff16156200454857604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b038316108015620045b7575067ffffffff00000001604083901c6001600160401b0316105b8015620045d8575067ffffffff00000001608083901c6001600160401b0316105b8015620045f0575067ffffffff0000000160c083901c105b15620045fe57506001919050565b506000919050565b60006200465d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620046df9092919063ffffffff16565b8051909150156200165757808060200190518101906200467e919062005638565b620016575760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b7f565b6060620046f08484600085620046f8565b949350505050565b6060824710156200475b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b7f565b600080866001600160a01b03168587604051620047799190620055dd565b60006040518083038185875af1925050503d8060008114620047b8576040519150601f19603f3d011682016040523d82523d6000602084013e620047bd565b606091505b509150915062001e8187838387606083156200483e57825160000362004836576001600160a01b0385163b620048365760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b7f565b5081620046f0565b620046f08383815115620048555781518083602001fd5b8060405162461bcd60e51b815260040162000b7f919062004ea4565b6108f5806200568683390190565b6001600160a01b038116811462002f0a57600080fd5b80356001600160401b03811681146200356d57600080fd5b6000806000806000806000806000806101408b8d031215620048ce57600080fd5b8a35620048db816200487f565b9950620048eb60208c0162004895565b9850620048fb60408c0162004895565b975060608b01356200490d816200487f565b965060808b01356200491f816200487f565b955060a08b013562004931816200487f565b945060c08b013562004943816200487f565b935060e08b013562004955816200487f565b9250620049666101008c0162004895565b9150620049776101208c0162004895565b90509295989b9194979a5092959850565b6001600160401b0391909116815260200190565b803563ffffffff811681146200356d57600080fd5b60008060408385031215620049c557600080fd5b620049d0836200499c565b9150620049e06020840162004895565b90509250929050565b60008060008060008060c0878903121562004a0357600080fd5b863562004a10816200487f565b955062004a206020880162004895565b945062004a306040880162004895565b9350606087013562004a42816200487f565b9250608087013562004a54816200487f565b915060a087013562004a66816200487f565b809150509295509295509295565b60006020828403121562004a8757600080fd5b62000fb0826200499c565b80610300810183101562000fb357600080fd5b6000806000806000806000806103e0898b03121562004ac357600080fd5b62004ace896200499c565b975062004ade60208a0162004895565b965062004aee60408a0162004895565b955062004afe60608a0162004895565b945062004b0e60808a0162004895565b935060a0890135925060c0890135915062004b2d8a60e08b0162004a92565b90509295985092959890939650565b6000806000806000806000806103e0898b03121562004b5a57600080fd5b62004b65896200499c565b975062004b7560208a0162004895565b965062004b8560408a0162004895565b955062004b9560608a0162004895565b94506080890135935060a0890135925060c089013562004bb5816200487f565b915062004b2d8a60e08b0162004a92565b60006020828403121562004bd957600080fd5b813561ffff8116811462004bec57600080fd5b9392505050565b60006020828403121562004c0657600080fd5b5035919050565b6000806040838503121562004c2157600080fd5b82359150602083013562004c35816200487f565b809150509250929050565b60006020828403121562004c5357600080fd5b62000fb08262004895565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562004c9f5762004c9f62004c5e565b604052919050565b600082601f83011262004cb957600080fd5b81356001600160401b0381111562004cd55762004cd562004c5e565b62004cea601f8201601f191660200162004c74565b81815284602083860101111562004d0057600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600080600060e0888a03121562004d3957600080fd5b62004d44886200499c565b965062004d546020890162004895565b9550604088013562004d66816200487f565b9450606088013562004d78816200487f565b9350608088013562004d8a816200487f565b925060a08801356001600160401b038082111562004da757600080fd5b62004db58b838c0162004ca7565b935060c08a013591508082111562004dcc57600080fd5b5062004ddb8a828b0162004ca7565b91505092959891949750929550565b60008060008060008060c0878903121562004e0457600080fd5b62004e0f876200499c565b955062004e1f6020880162004895565b945062004e2f6040880162004895565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004e6d57818101518382015260200162004e53565b50506000910152565b6000815180845262004e9081602086016020860162004e50565b601f01601f19169290920160200192915050565b60208152600062000fb0602083018462004e76565b6000602080838503121562004ecd57600080fd5b82356001600160401b038082111562004ee557600080fd5b818501915085601f83011262004efa57600080fd5b81358181111562004f0f5762004f0f62004c5e565b8060051b915062004f2284830162004c74565b818152918301840191848101908884111562004f3d57600080fd5b938501935b8385101562004f5d5784358252938501939085019062004f42565b98975050505050505050565b6000806040838503121562004f7d57600080fd5b62004f888362004895565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000806000806060858703121562004fc157600080fd5b843562004fce816200487f565b935062004fde602086016200499c565b925060408501356001600160401b038082111562004ffb57600080fd5b818701915087601f8301126200501057600080fd5b8135818111156200502057600080fd5b8860208285010111156200503357600080fd5b95989497505060200194505050565b6000602082840312156200505557600080fd5b813562004bec816200487f565b803560ff811681146200356d57600080fd5b60008060008060008060c087890312156200508e57600080fd5b86356200509b816200487f565b95506020870135620050ad816200487f565b9450620050bd6040880162004895565b9350620050cd6060880162004895565b925060808701359150620050e460a0880162005062565b90509295509295509295565b60008060008060008060c087890312156200510a57600080fd5b863562005117816200487f565b9550602087013562005129816200487f565b9450620051396040880162004895565b9350620051496060880162005062565b92506080870135915060a08701356001600160401b038111156200516c57600080fd5b6200517a89828a0162004ca7565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b8054600090600181811c9080831680620051f057607f831692505b602080841082036200521257634e487b7160e01b600052602260045260246000fd5b83885260208801828015620052305760018114620052475762005274565b60ff198716825285151560051b8201975062005274565b60008981526020902060005b878110156200526e5781548482015290860190840162005253565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c060408201819052600090620052af90830187620051d5565b8281036060840152620052c38187620051d5565b608084019590955250506001600160401b039190911660a090910152949350505050565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562005341576200534162005308565b5092915050565b808202811582820484141762000fb35762000fb362005308565b600063ffffffff8083168181036200537e576200537e62005308565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620053b69083018462004e76565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c060808201819052600090620054019083018562004e76565b82810360a084015262005415818562004e76565b9998505050505050505050565b6001600160401b0382811682821603908082111562005341576200534162005308565b60006001600160401b038281166002600160401b031981016200537e576200537e62005308565b634e487b7160e01b600052603260045260246000fd5b8082018082111562000fb35762000fb362005308565b600060018201620054ad57620054ad62005308565b5060010190565b600060208284031215620054c757600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082620054f657620054f6620054ce565b500490565b6000826200550d576200550d620054ce565b500690565b8181038181111562000fb35762000fb362005308565b918252602082015260400190565b60008162005548576200554862005308565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a0820181905260009062004f5d9083018462004e76565b60008251620055f181846020870162004e50565b9190910192915050565b61032081016103008085843782018360005b60018110156200562e5781518352602092830192909101906001016200560d565b5050509392505050565b6000602082840312156200564b57600080fd5b8151801515811462004bec57600080fd5b60006001600160401b0383811680620056795762005679620054ce565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca26469706673582212208e78e901799caaaff866d77d874534e79db9f4bae5f48cfae79611891464d2c664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220b4e84f276524b22fbe82e90bcf3803a423a5f13e0a292c4910a87f421c2a476864736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonRollupManagerMockInternalTest.json b/compiled-contracts/paris/PolygonRollupManagerMockInternalTest.json index 8855d3f57..0affe7bd5 100644 --- a/compiled-contracts/paris/PolygonRollupManagerMockInternalTest.json +++ b/compiled-contracts/paris/PolygonRollupManagerMockInternalTest.json @@ -6,7 +6,7 @@ { "inputs": [ { - "internalType": "contract IPolygonZkEVMGlobalExitRoot", + "internalType": "contract IPolygonZkEVMGlobalExitRootV2", "name": "_globalExitRootManager", "type": "address" }, @@ -164,6 +164,11 @@ "name": "PendingStateNotConsolidable", "type": "error" }, + { + "inputs": [], + "name": "RollupAddressAlreadyExist", + "type": "error" + }, { "inputs": [], "name": "RollupMustExist", @@ -1181,7 +1186,7 @@ "name": "globalExitRootManager", "outputs": [ { - "internalType": "contract IPolygonZkEVMGlobalExitRoot", + "internalType": "contract IPolygonZkEVMGlobalExitRootV2", "name": "", "type": "address" } @@ -1289,44 +1294,6 @@ "stateMutability": "nonpayable", "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" - } - ], - "name": "initializeMock", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [], "name": "isEmergencyState", @@ -1377,6 +1344,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "lastDeactivatedEmergencyStateTimestamp", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "multiplierBatchFee", @@ -1985,8 +1965,8 @@ "type": "function" } ], - "bytecode": "0x60e06040523480156200001157600080fd5b50604051620060853803806200608583398101604081905262000034916200006b565b6001600160a01b0392831660805290821660c0521660a052620000bf565b6001600160a01b03811681146200006857600080fd5b50565b6000806000606084860312156200008157600080fd5b83516200008e8162000052565b6020850151909350620000a18162000052565b6040850151909250620000b48162000052565b809150509250925092565b60805160a05160c051615f5e6200012760003960008181610999015281816122230152613aa301526000818161075f01528181612d720152613d9d0152600081816108f3015281816112f0015281816114a001528181611f8a0152613c8c0152615f5e6000f3fe60806040523480156200001157600080fd5b50600436106200029e5760003560e01c80630645af0914620002a3578063066ec01214620002bc578063080b311114620002e85780630a0d9fbe14620003105780630e36f582146200032b57806311f6b287146200034257806312b86e1914620003595780631489ed10146200037057806315064c9614620003875780631608859c14620003955780631796a1ae14620003ac5780631816b7e514620003d35780632072f6c514620003ea578063248a9ca314620003f457806325280169146200041a5780632f2ff15d14620004cf57806336568abe14620004e6578063394218e914620004fd578063477fa270146200051457806355a71ee0146200051d57806360469169146200056157806365c0504d146200056b5780637222020f146200061a578063727885e914620006315780637975fcfe14620006485780637fb6e76a146200066e578063841b24d7146200069757806387c20c0114620006b25780638bd4f07114620006c957806391d1485414620006e057806399f5634e14620006f75780639a908e7314620007015780639c9f3dfe1462000718578063a066215c146200072f578063a217fddf1462000746578063a2967d99146200074f578063a3c573eb1462000759578063afd23cbe1462000790578063b99d0ad714620007ba578063c1acbc341462000892578063c4c928c214620008ad578063ceee281d14620008c4578063d02103ca14620008ed578063d5073f6f1462000915578063d547741f146200092c578063d939b3151462000943578063dbc169761462000957578063dde0ff771462000961578063e0bfd3d2146200097c578063e46761c41462000993578063f34eb8eb14620009bb578063f4e9267514620009d2578063f9c4c2ae14620009e3575b600080fd5b620002ba620002b436600462004754565b62000afa565b005b608454620002d0906001600160401b031681565b604051620002df91906200482f565b60405180910390f35b620002ff620002f936600462004858565b62000f4c565b6040519015158152602001620002df565b608554620002d090600160401b90046001600160401b031681565b620002ba6200033c36600462004890565b62000f76565b620002d0620003533660046200491b565b62001224565b620002ba6200036a3660046200494c565b62001244565b620002ba62000381366004620049e3565b620013f4565b606f54620002ff9060ff1681565b620002ba620003a636600462004858565b62001584565b607e54620003bd9063ffffffff1681565b60405163ffffffff9091168152602001620002df565b620002ba620003e436600462004a6d565b62001619565b620002ba620016c5565b6200040b6200040536600462004a9a565b6200175b565b604051908152602001620002df565b6200049b6200042b36600462004858565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002df565b620002ba620004e036600462004ab4565b62001770565b620002ba620004f736600462004ab4565b62001792565b620002ba6200050e36600462004ae7565b620017cc565b6086546200040b565b6200040b6200052e36600462004858565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b6200040b6200187b565b620005d06200057c3660046200491b565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002df565b620002ba6200062b3660046200491b565b62001893565b620002ba6200064236600462004baf565b6200197e565b6200065f6200065936600462004c7c565b62001de6565b604051620002df919062004d36565b620003bd6200067f36600462004ae7565b60836020526000908152604090205463ffffffff1681565b608454620002d090600160c01b90046001600160401b031681565b620002ba620006c3366004620049e3565b62001e19565b620002ba620006da3660046200494c565b6200213d565b620002ff620006f136600462004ab4565b620021f3565b6200040b6200221e565b620002d06200071236600462004d4b565b6200230a565b620002ba6200072936600462004ae7565b620024d7565b620002ba6200074036600462004ae7565b6200257a565b6200040b600081565b6200040b62002619565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b604051620002df919062004d78565b608554620007a690600160801b900461ffff1681565b60405161ffff9091168152602001620002df565b62000850620007cb36600462004858565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002df919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002d090600160801b90046001600160401b031681565b620002ba620008be36600462004d8c565b620029db565b620003bd620008d536600462004e24565b60826020526000908152604090205463ffffffff1681565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b620002ba6200092636600462004a9a565b62002ca8565b620002ba6200093d36600462004ab4565b62002d33565b608554620002d0906001600160401b031681565b620002ba62002d55565b608454620002d090600160401b90046001600160401b031681565b620002ba6200098d36600462004e56565b62002df2565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b620002ba620009cc36600462004ed2565b62002e7c565b608054620003bd9063ffffffff1681565b62000a7a620009f43660046200491b565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002df565b600054600290610100900460ff1615801562000b1d575060005460ff8083169116105b62000b455760405162461bcd60e51b815260040162000b3c9062004f69565b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000bc662003067565b62000be160008051602062005f098339815191528c620030d4565b62000bee600088620030d4565b62000c0960008051602062005de983398151915288620030d4565b62000c2460008051602062005e6983398151915288620030d4565b62000c3f60008051602062005d8983398151915288620030d4565b62000c5a60008051602062005dc983398151915289620030d4565b62000c7560008051602062005ee983398151915289620030d4565b62000c9060008051602062005e0983398151915289620030d4565b62000cab60008051602062005e8983398151915289620030d4565b62000cd560008051602062005f0983398151915260008051602062005d69833981519152620030e0565b62000cf060008051602062005d6983398151915289620030d4565b62000d0b60008051602062005da983398151915289620030d4565b62000d3560008051602062005ec983398151915260008051602062005ea9833981519152620030e0565b62000d5060008051602062005ec983398151915287620030d4565b62000d6b60008051602062005ea983398151915287620030d4565b6073546074546001600160401b03600160401b9092048216911680821462000da657604051632e4cc54360e11b815260040160405180910390fd5b600062000dce888888886000607460009054906101000a90046001600160401b031662003135565b6001600160401b03838116600081815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068b018054909216909417938802939093179092556007880180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81529596506001600160a01b038e81169663bb5907089662000ed09694831695600160581b90950490921693607693607793909291169060040162005063565b600060405180830381600087803b15801562000eeb57600080fd5b505af115801562000f00573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff8516815260008051602062005e498339815191529350602001915062000f379050565b60405180910390a15050505050505050505050565b63ffffffff8216600090815260816020526040812062000f6d908362003363565b90505b92915050565b600054600290610100900460ff1615801562000f99575060005460ff8083169116105b62000fb85760405162461bcd60e51b815260040162000b3c9062004f69565b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200103962003067565b6200105460008051602062005f0983398151915288620030d4565b62001061600084620030d4565b6200107c60008051602062005de983398151915284620030d4565b6200109760008051602062005e6983398151915284620030d4565b620010b260008051602062005d8983398151915284620030d4565b620010cd60008051602062005dc983398151915285620030d4565b620010e860008051602062005ee983398151915285620030d4565b6200110360008051602062005e0983398151915285620030d4565b6200111e60008051602062005e8983398151915285620030d4565b6200114860008051602062005f0983398151915260008051602062005d69833981519152620030e0565b6200116360008051602062005d6983398151915285620030d4565b6200117e60008051602062005da983398151915285620030d4565b620011a860008051602062005ec983398151915260008051602062005ea9833981519152620030e0565b620011c360008051602062005ec983398151915283620030d4565b620011de60008051602062005ea983398151915283620030d4565b620011eb600033620030d4565b6000805461ff001916905560405160ff8216815260008051602062005e498339815191529060200160405180910390a150505050505050565b63ffffffff8116600090815260816020526040812062000f7090620033a8565b60008051602062005f098339815191526200125f8162003419565b63ffffffff8916600090815260816020526040902062001286818a8a8a8a8a8a8a62003425565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b90041615620012ee576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200132762002619565b6040518263ffffffff1660e01b81526004016200134691815260200190565b600060405180830381600087803b1580156200136157600080fd5b505af115801562001376573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005f098339815191526200140f8162003419565b63ffffffff8916600090815260816020526040902062001436818a8a8a8a8a8a8a620037ad565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b900416156200149e576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620014d762002619565b6040518263ffffffff1660e01b8152600401620014f691815260200190565b600060405180830381600087803b1580156200151157600080fd5b505af115801562001526573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a6040516200157093929190620050c9565b60405180910390a350505050505050505050565b63ffffffff82166000908152608160205260409020620015b460008051602062005f0983398151915233620021f3565b6200160857606f5460ff1615620015de57604051630bc011ff60e21b815260040160405180910390fd5b620015ea818362003363565b6200160857604051630674f25160e11b815260040160405180910390fd5b62001614818362003ba9565b505050565b60008051602062005e89833981519152620016348162003419565b6103e88261ffff1610806200164e57506103ff8261ffff16115b156200166d57604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620016e060008051602062005ec983398151915233620021f3565b6200174f57608454600160801b90046001600160401b031615806200173057506084544290620017259062093a8090600160801b90046001600160401b031662005100565b6001600160401b0316115b156200174f5760405163692baaad60e11b815260040160405180910390fd5b6200175962003d9b565b565b60009081526034602052604090206001015490565b6200177b826200175b565b620017868162003419565b62001614838362003e1a565b6001600160a01b0381163314620017bc57604051630b4ad1cd60e31b815260040160405180910390fd5b620017c8828262003e86565b5050565b60008051602062005e89833981519152620017e78162003419565b606f5460ff1662001829576084546001600160401b03600160c01b909104811690831610620018295760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190620016b99084906200482f565b600060865460646200188e91906200512a565b905090565b60008051602062005dc9833981519152620018ae8162003419565b63ffffffff82161580620018cd5750607e5463ffffffff908116908316115b15620018ec57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200193357604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b60008051602062005ee9833981519152620019998162003419565b63ffffffff88161580620019b85750607e5463ffffffff908116908916115b15620019d757604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff161515900362001a1e57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001a5c576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062001a779063ffffffff1662005144565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001ac59062004718565b62001ad3939291906200516a565b604051809103906000f08015801562001af0573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001d64949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001da4908d908d9088908e908e908e90600401620051a1565b600060405180830381600087803b15801562001dbf57600080fd5b505af115801562001dd4573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001e0e90878787878762003ef0565b979650505050505050565b606f5460ff161562001e3e57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001e8d92600160c01b90048116911662005100565b6001600160401b0316111562001eb657604051638a0704d360e01b815260040160405180910390fd5b6103e862001ec5888862005204565b6001600160401b0316111562001eee57604051635acfba9d60e11b815260040160405180910390fd5b62001f008189898989898989620037ad565b62001f0c81876200402b565b6085546001600160401b03166000036200201a57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001f88576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001fc162002619565b6040518263ffffffff1660e01b815260040162001fe091815260200190565b600060405180830381600087803b15801562001ffb57600080fd5b505af115801562002010573d6000803e3d6000fd5b50505050620020e4565b620020258162004228565b600681018054600160801b90046001600160401b0316906010620020498362005227565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b48887896040516200212a93929190620050c9565b60405180910390a3505050505050505050565b606f5460ff16156200216257604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff8816600090815260816020526040902062002189818989898989898962003425565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620021e862003d9b565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016200226f919062004d78565b602060405180830381865afa1580156200228d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620022b391906200524e565b608454909150600090620022da906001600160401b03600160401b82048116911662005204565b6001600160401b0316905080600003620022f75760009250505090565b6200230381836200527e565b9250505090565b606f5460009060ff16156200233257604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff16908190036200236a576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200239557604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620023c89084906001600160401b031662005100565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620023fe878362005100565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200248d8362004228565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a2582604051620024c591906200482f565b60405180910390a29695505050505050565b60008051602062005e89833981519152620024f28162003419565b606f5460ff166200252d576085546001600160401b03908116908316106200252d5760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590620016b99084906200482f565b60008051602062005e89833981519152620025958162003419565b62015180826001600160401b03161115620025c357604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890620016b99084906200482f565b60805460009063ffffffff168082036200263557506000919050565b6000816001600160401b0381111562002652576200265262004b05565b6040519080825280602002602001820160405280156200267c578160200160208202803683370190505b50905060005b82811015620026ef57608160006200269c83600162005295565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620026cf57620026cf620052ab565b602090810291909101015280620026e681620052c1565b91505062002682565b50600060205b83600114620029335760006200270d600286620052dd565b6200271a6002876200527e565b62002726919062005295565b90506000816001600160401b0381111562002745576200274562004b05565b6040519080825280602002602001820160405280156200276f578160200160208202803683370190505b50905060005b82811015620028e7576200278b600184620052f4565b81148015620027a65750620027a2600288620052dd565b6001145b15620028265785620027ba8260026200512a565b81518110620027cd57620027cd620052ab565b602002602001015185604051602001620027e99291906200530a565b60405160208183030381529060405280519060200120828281518110620028145762002814620052ab565b602002602001018181525050620028d2565b85620028348260026200512a565b81518110620028475762002847620052ab565b6020026020010151868260026200285f91906200512a565b6200286c90600162005295565b815181106200287f576200287f620052ab565b60200260200101516040516020016200289a9291906200530a565b60405160208183030381529060405280519060200120828281518110620028c557620028c5620052ab565b6020026020010181815250505b80620028de81620052c1565b91505062002775565b508094508195508384604051602001620029039291906200530a565b6040516020818303038152906040528051906020012093508280620029289062005318565b9350505050620026f5565b6000836000815181106200294b576200294b620052ab565b6020026020010151905060005b82811015620029d1578184604051602001620029769291906200530a565b6040516020818303038152906040528051906020012091508384604051602001620029a39291906200530a565b6040516020818303038152906040528051906020012093508080620029c890620052c1565b91505062002958565b5095945050505050565b60008051602062005d89833981519152620029f68162003419565b63ffffffff8416158062002a155750607e5463ffffffff908116908516115b1562002a3457604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002a75576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002ac457604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002b0b57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002b4957604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002bc98462001224565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002c1e9216908b908b9060040162005332565b600060405180830381600087803b15801562002c3957600080fd5b505af115801562002c4e573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005da983398151915262002cc38162003419565b683635c9adc5dea0000082118062002cde5750633b9aca0082105b1562002cfd57604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620016b9565b62002d3e826200175b565b62002d498162003419565b62001614838362003e86565b60008051602062005e0983398151915262002d708162003419565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002dcc57600080fd5b505af115801562002de1573d6000803e3d6000fd5b5050505062002def620042f3565b50565b60008051602062005e6983398151915262002e0d8162003419565b6001600160401b03841660009081526083602052604090205463ffffffff161562002e4b576040516337c8fe0960e11b815260040160405180910390fd5b600062002e5e8888888887600062003135565b60008080526002909101602052604090209390935550505050505050565b60008051602062005de983398151915262002e978162003419565b607e805460009190829062002eb29063ffffffff1662005144565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620030559695949392919062005372565b60405180910390a25050505050505050565b600054610100900460ff16620017595760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b3c565b620017c8828262003e1a565b6000620030ed836200175b565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6080805460009182918290620031519063ffffffff1662005144565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000876001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff16021790555080608260008a6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150878260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550868260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620033509594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b038281166000908152600485016020526040812054909242926200339692918116911662005100565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b031615620033fc575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002def81336200434c565b60078801546000906001600160401b0390811690871610156200345b5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620034fc5760068901546001600160401b03600160801b90910481169089161115620034a55760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b9092041614620034f557604051632bd2e3e760e01b815260040160405180910390fd5b5062003571565b506001600160401b03851660009081526002890160205260409020548062003537576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b909104811690871611156200357157604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620035aa5750876001600160401b0316876001600160401b031611155b80620035ce575060068901546001600160401b03600160c01b909104811690881611155b15620035ed5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b900481169086161462003634576040516332a2a77f60e01b815260040160405180910390fd5b6000620036468a888888868962003ef0565b9050600060008051602062005e298339815191526002836040516200366c9190620053cb565b602060405180830381855afa1580156200368a573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620036af91906200524e565b620036bb9190620052dd565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620036ff91889190600401620053e9565b602060405180830381865afa1580156200371d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003743919062005426565b62003761576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620037a05760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620037bb8a620033a8565b60078b01549091506001600160401b039081169089161015620037f15760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620038945760068a01546001600160401b03600160801b9091048116908a1611156200383b5760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200388d57604051632bd2e3e760e01b815260040160405180910390fd5b5062003904565b6001600160401b038816600090815260028b016020526040902054915081620038d0576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200390457604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620039375760405163b9b18f5760e01b815260040160405180910390fd5b6000620039498b8a8a8a878b62003ef0565b9050600060008051602062005e298339815191526002836040516200396f9190620053cb565b602060405180830381855afa1580156200398d573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620039b291906200524e565b620039be9190620052dd565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003a0291899190600401620053e9565b602060405180830381865afa15801562003a20573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003a46919062005426565b62003a64576040516309bde33960e01b815260040160405180910390fd5b600062003a72848b62005204565b905062003acb87826001600160401b031662003a8d6200221e565b62003a9991906200512a565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004376565b80608460088282829054906101000a90046001600160401b031662003af1919062005100565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b15801562003b8157600080fd5b505af115801562003b96573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003be8575060068201546001600160401b03600160801b9091048116908216115b1562003c075760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003cc362002619565b6040518263ffffffff1660e01b815260040162003ce291815260200190565b600060405180830381600087803b15801562003cfd57600080fd5b505af115801562003d12573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003df757600080fd5b505af115801562003e0c573d6000803e3d6000fd5b5050505062001759620043ca565b62003e268282620021f3565b620017c85760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003e928282620021f3565b15620017c85760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003f26575081155b1562003f455760405163340c614f60e11b815260040160405180910390fd5b8062003f64576040516366385b5160e01b815260040160405180910390fd5b62003f6f8462004427565b62003f8d576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b60006200403883620033a8565b9050816000806200404a848462005204565b6085546001600160401b0391821692506000916200407191600160401b90041642620052f4565b90505b846001600160401b0316846001600160401b031614620040fb576001600160401b03808516600090815260038901602052604090206001810154909116821015620040d6576001810154600160401b90046001600160401b03169450620040f4565b620040e2868662005204565b6001600160401b0316935050620040fb565b5062004074565b6000620041098484620052f4565b9050838110156200416757808403600c81116200412757806200412a565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a60865402816200415c576200415c62005268565b0460865550620041df565b838103600c81116200417a57806200417d565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a76400000281620041b757620041b762005268565b04905080608654670de0b6b3a76400000281620041d857620041d862005268565b0460865550505b683635c9adc5dea0000060865411156200420657683635c9adc5dea000006086556200421e565b633b9aca0060865410156200421e57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002def5760068101546000906200427390600160c01b90046001600160401b0316600162005100565b905062004281828262003363565b15620017c8576006820154600090600290620042af908490600160801b90046001600160401b031662005204565b620042bb91906200544a565b620042c7908362005100565b9050620042d5838262003363565b15620042e75762001614838262003ba9565b62001614838362003ba9565b606f5460ff166200431757604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b620043588282620021f3565b620017c857604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905262001614908490620044ad565b606f5460ff1615620043ef57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b0383161080156200445e575067ffffffff00000001604083901c6001600160401b0316105b80156200447f575067ffffffff00000001608083901c6001600160401b0316105b801562004497575067ffffffff0000000160c083901c105b15620044a557506001919050565b506000919050565b600062004504826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620045869092919063ffffffff16565b80519091501562001614578080602001905181019062004525919062005426565b620016145760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b3c565b60606200459784846000856200459f565b949350505050565b606082471015620046025760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b3c565b600080866001600160a01b03168587604051620046209190620053cb565b60006040518083038185875af1925050503d80600081146200465f576040519150601f19603f3d011682016040523d82523d6000602084013e62004664565b606091505b509150915062001e0e8783838760608315620046e5578251600003620046dd576001600160a01b0385163b620046dd5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b3c565b508162004597565b620045978383815115620046fc5781518083602001fd5b8060405162461bcd60e51b815260040162000b3c919062004d36565b6108f5806200547483390190565b6001600160a01b038116811462002def57600080fd5b80356001600160401b03811681146200341457600080fd5b6000806000806000806000806000806101408b8d0312156200477557600080fd5b8a35620047828162004726565b99506200479260208c016200473c565b9850620047a260408c016200473c565b975060608b0135620047b48162004726565b965060808b0135620047c68162004726565b955060a08b0135620047d88162004726565b945060c08b0135620047ea8162004726565b935060e08b0135620047fc8162004726565b92506200480d6101008c016200473c565b91506200481e6101208c016200473c565b90509295989b9194979a5092959850565b6001600160401b0391909116815260200190565b803563ffffffff811681146200341457600080fd5b600080604083850312156200486c57600080fd5b620048778362004843565b915062004887602084016200473c565b90509250929050565b60008060008060008060c08789031215620048aa57600080fd5b8635620048b78162004726565b9550620048c7602088016200473c565b9450620048d7604088016200473c565b93506060870135620048e98162004726565b92506080870135620048fb8162004726565b915060a08701356200490d8162004726565b809150509295509295509295565b6000602082840312156200492e57600080fd5b62000f6d8262004843565b80610300810183101562000f7057600080fd5b6000806000806000806000806103e0898b0312156200496a57600080fd5b620049758962004843565b97506200498560208a016200473c565b96506200499560408a016200473c565b9550620049a560608a016200473c565b9450620049b560808a016200473c565b935060a0890135925060c08901359150620049d48a60e08b0162004939565b90509295985092959890939650565b6000806000806000806000806103e0898b03121562004a0157600080fd5b62004a0c8962004843565b975062004a1c60208a016200473c565b965062004a2c60408a016200473c565b955062004a3c60608a016200473c565b94506080890135935060a0890135925060c089013562004a5c8162004726565b9150620049d48a60e08b0162004939565b60006020828403121562004a8057600080fd5b813561ffff8116811462004a9357600080fd5b9392505050565b60006020828403121562004aad57600080fd5b5035919050565b6000806040838503121562004ac857600080fd5b82359150602083013562004adc8162004726565b809150509250929050565b60006020828403121562004afa57600080fd5b62000f6d826200473c565b634e487b7160e01b600052604160045260246000fd5b600082601f83011262004b2d57600080fd5b81356001600160401b038082111562004b4a5762004b4a62004b05565b604051601f8301601f19908116603f0116810190828211818310171562004b755762004b7562004b05565b8160405283815286602085880101111562004b8f57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121562004bcb57600080fd5b62004bd68862004843565b965062004be6602089016200473c565b9550604088013562004bf88162004726565b9450606088013562004c0a8162004726565b9350608088013562004c1c8162004726565b925060a08801356001600160401b038082111562004c3957600080fd5b62004c478b838c0162004b1b565b935060c08a013591508082111562004c5e57600080fd5b5062004c6d8a828b0162004b1b565b91505092959891949750929550565b60008060008060008060c0878903121562004c9657600080fd5b62004ca18762004843565b955062004cb1602088016200473c565b945062004cc1604088016200473c565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004cff57818101518382015260200162004ce5565b50506000910152565b6000815180845262004d2281602086016020860162004ce2565b601f01601f19169290920160200192915050565b60208152600062000f6d602083018462004d08565b6000806040838503121562004d5f57600080fd5b62004d6a836200473c565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000806000806060858703121562004da357600080fd5b843562004db08162004726565b935062004dc06020860162004843565b925060408501356001600160401b038082111562004ddd57600080fd5b818701915087601f83011262004df257600080fd5b81358181111562004e0257600080fd5b88602082850101111562004e1557600080fd5b95989497505060200194505050565b60006020828403121562004e3757600080fd5b813562004a938162004726565b803560ff811681146200341457600080fd5b60008060008060008060c0878903121562004e7057600080fd5b863562004e7d8162004726565b9550602087013562004e8f8162004726565b945062004e9f604088016200473c565b935062004eaf606088016200473c565b92506080870135915062004ec660a0880162004e44565b90509295509295509295565b60008060008060008060c0878903121562004eec57600080fd5b863562004ef98162004726565b9550602087013562004f0b8162004726565b945062004f1b604088016200473c565b935062004f2b6060880162004e44565b92506080870135915060a08701356001600160401b0381111562004f4e57600080fd5b62004f5c89828a0162004b1b565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b8054600090600181811c908083168062004fd257607f831692505b6020808410820362004ff457634e487b7160e01b600052602260045260246000fd5b83885260208801828015620050125760018114620050295762005056565b60ff198716825285151560051b8201975062005056565b60008981526020902060005b87811015620050505781548482015290860190840162005035565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c060408201819052600090620050919083018762004fb7565b8281036060840152620050a5818762004fb7565b608084019590955250506001600160401b039190911660a090910152949350505050565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03818116838216019080821115620051235762005123620050ea565b5092915050565b808202811582820484141762000f705762000f70620050ea565b600063ffffffff808316818103620051605762005160620050ea565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620051989083018462004d08565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c060808201819052600090620051e39083018562004d08565b82810360a0840152620051f7818562004d08565b9998505050505050505050565b6001600160401b03828116828216039080821115620051235762005123620050ea565b60006001600160401b038281166002600160401b03198101620051605762005160620050ea565b6000602082840312156200526157600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b60008262005290576200529062005268565b500490565b8082018082111562000f705762000f70620050ea565b634e487b7160e01b600052603260045260246000fd5b600060018201620052d657620052d6620050ea565b5060010190565b600082620052ef57620052ef62005268565b500690565b8181038181111562000f705762000f70620050ea565b918252602082015260400190565b6000816200532a576200532a620050ea565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a08201819052600090620053bf9083018462004d08565b98975050505050505050565b60008251620053df81846020870162004ce2565b9190910192915050565b61032081016103008085843782018360005b60018110156200541c578151835260209283019290910190600101620053fb565b5050509392505050565b6000602082840312156200543957600080fd5b8151801515811462004a9357600080fd5b60006001600160401b038381168062005467576200546762005268565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220a19e7a72432195d9a35c7ce8fa5f1284415aac66bb1ad08a4c2e1c252fd8690864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a26469706673582212203f12260f62b0d87f840f477a6be35cf07e8ec905f8d0f0ce1838a89a9200b2cd64736f6c63430008140033", - "deployedBytecode": "0x60806040523480156200001157600080fd5b50600436106200029e5760003560e01c80630645af0914620002a3578063066ec01214620002bc578063080b311114620002e85780630a0d9fbe14620003105780630e36f582146200032b57806311f6b287146200034257806312b86e1914620003595780631489ed10146200037057806315064c9614620003875780631608859c14620003955780631796a1ae14620003ac5780631816b7e514620003d35780632072f6c514620003ea578063248a9ca314620003f457806325280169146200041a5780632f2ff15d14620004cf57806336568abe14620004e6578063394218e914620004fd578063477fa270146200051457806355a71ee0146200051d57806360469169146200056157806365c0504d146200056b5780637222020f146200061a578063727885e914620006315780637975fcfe14620006485780637fb6e76a146200066e578063841b24d7146200069757806387c20c0114620006b25780638bd4f07114620006c957806391d1485414620006e057806399f5634e14620006f75780639a908e7314620007015780639c9f3dfe1462000718578063a066215c146200072f578063a217fddf1462000746578063a2967d99146200074f578063a3c573eb1462000759578063afd23cbe1462000790578063b99d0ad714620007ba578063c1acbc341462000892578063c4c928c214620008ad578063ceee281d14620008c4578063d02103ca14620008ed578063d5073f6f1462000915578063d547741f146200092c578063d939b3151462000943578063dbc169761462000957578063dde0ff771462000961578063e0bfd3d2146200097c578063e46761c41462000993578063f34eb8eb14620009bb578063f4e9267514620009d2578063f9c4c2ae14620009e3575b600080fd5b620002ba620002b436600462004754565b62000afa565b005b608454620002d0906001600160401b031681565b604051620002df91906200482f565b60405180910390f35b620002ff620002f936600462004858565b62000f4c565b6040519015158152602001620002df565b608554620002d090600160401b90046001600160401b031681565b620002ba6200033c36600462004890565b62000f76565b620002d0620003533660046200491b565b62001224565b620002ba6200036a3660046200494c565b62001244565b620002ba62000381366004620049e3565b620013f4565b606f54620002ff9060ff1681565b620002ba620003a636600462004858565b62001584565b607e54620003bd9063ffffffff1681565b60405163ffffffff9091168152602001620002df565b620002ba620003e436600462004a6d565b62001619565b620002ba620016c5565b6200040b6200040536600462004a9a565b6200175b565b604051908152602001620002df565b6200049b6200042b36600462004858565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002df565b620002ba620004e036600462004ab4565b62001770565b620002ba620004f736600462004ab4565b62001792565b620002ba6200050e36600462004ae7565b620017cc565b6086546200040b565b6200040b6200052e36600462004858565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b6200040b6200187b565b620005d06200057c3660046200491b565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002df565b620002ba6200062b3660046200491b565b62001893565b620002ba6200064236600462004baf565b6200197e565b6200065f6200065936600462004c7c565b62001de6565b604051620002df919062004d36565b620003bd6200067f36600462004ae7565b60836020526000908152604090205463ffffffff1681565b608454620002d090600160c01b90046001600160401b031681565b620002ba620006c3366004620049e3565b62001e19565b620002ba620006da3660046200494c565b6200213d565b620002ff620006f136600462004ab4565b620021f3565b6200040b6200221e565b620002d06200071236600462004d4b565b6200230a565b620002ba6200072936600462004ae7565b620024d7565b620002ba6200074036600462004ae7565b6200257a565b6200040b600081565b6200040b62002619565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b604051620002df919062004d78565b608554620007a690600160801b900461ffff1681565b60405161ffff9091168152602001620002df565b62000850620007cb36600462004858565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002df919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002d090600160801b90046001600160401b031681565b620002ba620008be36600462004d8c565b620029db565b620003bd620008d536600462004e24565b60826020526000908152604090205463ffffffff1681565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b620002ba6200092636600462004a9a565b62002ca8565b620002ba6200093d36600462004ab4565b62002d33565b608554620002d0906001600160401b031681565b620002ba62002d55565b608454620002d090600160401b90046001600160401b031681565b620002ba6200098d36600462004e56565b62002df2565b620007817f000000000000000000000000000000000000000000000000000000000000000081565b620002ba620009cc36600462004ed2565b62002e7c565b608054620003bd9063ffffffff1681565b62000a7a620009f43660046200491b565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002df565b600054600290610100900460ff1615801562000b1d575060005460ff8083169116105b62000b455760405162461bcd60e51b815260040162000b3c9062004f69565b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000bc662003067565b62000be160008051602062005f098339815191528c620030d4565b62000bee600088620030d4565b62000c0960008051602062005de983398151915288620030d4565b62000c2460008051602062005e6983398151915288620030d4565b62000c3f60008051602062005d8983398151915288620030d4565b62000c5a60008051602062005dc983398151915289620030d4565b62000c7560008051602062005ee983398151915289620030d4565b62000c9060008051602062005e0983398151915289620030d4565b62000cab60008051602062005e8983398151915289620030d4565b62000cd560008051602062005f0983398151915260008051602062005d69833981519152620030e0565b62000cf060008051602062005d6983398151915289620030d4565b62000d0b60008051602062005da983398151915289620030d4565b62000d3560008051602062005ec983398151915260008051602062005ea9833981519152620030e0565b62000d5060008051602062005ec983398151915287620030d4565b62000d6b60008051602062005ea983398151915287620030d4565b6073546074546001600160401b03600160401b9092048216911680821462000da657604051632e4cc54360e11b815260040160405180910390fd5b600062000dce888888886000607460009054906101000a90046001600160401b031662003135565b6001600160401b03838116600081815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068b018054909216909417938802939093179092556007880180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81529596506001600160a01b038e81169663bb5907089662000ed09694831695600160581b90950490921693607693607793909291169060040162005063565b600060405180830381600087803b15801562000eeb57600080fd5b505af115801562000f00573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff8516815260008051602062005e498339815191529350602001915062000f379050565b60405180910390a15050505050505050505050565b63ffffffff8216600090815260816020526040812062000f6d908362003363565b90505b92915050565b600054600290610100900460ff1615801562000f99575060005460ff8083169116105b62000fb85760405162461bcd60e51b815260040162000b3c9062004f69565b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200103962003067565b6200105460008051602062005f0983398151915288620030d4565b62001061600084620030d4565b6200107c60008051602062005de983398151915284620030d4565b6200109760008051602062005e6983398151915284620030d4565b620010b260008051602062005d8983398151915284620030d4565b620010cd60008051602062005dc983398151915285620030d4565b620010e860008051602062005ee983398151915285620030d4565b6200110360008051602062005e0983398151915285620030d4565b6200111e60008051602062005e8983398151915285620030d4565b6200114860008051602062005f0983398151915260008051602062005d69833981519152620030e0565b6200116360008051602062005d6983398151915285620030d4565b6200117e60008051602062005da983398151915285620030d4565b620011a860008051602062005ec983398151915260008051602062005ea9833981519152620030e0565b620011c360008051602062005ec983398151915283620030d4565b620011de60008051602062005ea983398151915283620030d4565b620011eb600033620030d4565b6000805461ff001916905560405160ff8216815260008051602062005e498339815191529060200160405180910390a150505050505050565b63ffffffff8116600090815260816020526040812062000f7090620033a8565b60008051602062005f098339815191526200125f8162003419565b63ffffffff8916600090815260816020526040902062001286818a8a8a8a8a8a8a62003425565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b90041615620012ee576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200132762002619565b6040518263ffffffff1660e01b81526004016200134691815260200190565b600060405180830381600087803b1580156200136157600080fd5b505af115801562001376573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005f098339815191526200140f8162003419565b63ffffffff8916600090815260816020526040902062001436818a8a8a8a8a8a8a620037ad565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b900416156200149e576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620014d762002619565b6040518263ffffffff1660e01b8152600401620014f691815260200190565b600060405180830381600087803b1580156200151157600080fd5b505af115801562001526573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a6040516200157093929190620050c9565b60405180910390a350505050505050505050565b63ffffffff82166000908152608160205260409020620015b460008051602062005f0983398151915233620021f3565b6200160857606f5460ff1615620015de57604051630bc011ff60e21b815260040160405180910390fd5b620015ea818362003363565b6200160857604051630674f25160e11b815260040160405180910390fd5b62001614818362003ba9565b505050565b60008051602062005e89833981519152620016348162003419565b6103e88261ffff1610806200164e57506103ff8261ffff16115b156200166d57604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620016e060008051602062005ec983398151915233620021f3565b6200174f57608454600160801b90046001600160401b031615806200173057506084544290620017259062093a8090600160801b90046001600160401b031662005100565b6001600160401b0316115b156200174f5760405163692baaad60e11b815260040160405180910390fd5b6200175962003d9b565b565b60009081526034602052604090206001015490565b6200177b826200175b565b620017868162003419565b62001614838362003e1a565b6001600160a01b0381163314620017bc57604051630b4ad1cd60e31b815260040160405180910390fd5b620017c8828262003e86565b5050565b60008051602062005e89833981519152620017e78162003419565b606f5460ff1662001829576084546001600160401b03600160c01b909104811690831610620018295760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190620016b99084906200482f565b600060865460646200188e91906200512a565b905090565b60008051602062005dc9833981519152620018ae8162003419565b63ffffffff82161580620018cd5750607e5463ffffffff908116908316115b15620018ec57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200193357604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b60008051602062005ee9833981519152620019998162003419565b63ffffffff88161580620019b85750607e5463ffffffff908116908916115b15620019d757604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff161515900362001a1e57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001a5c576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062001a779063ffffffff1662005144565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001ac59062004718565b62001ad3939291906200516a565b604051809103906000f08015801562001af0573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001d64949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001da4908d908d9088908e908e908e90600401620051a1565b600060405180830381600087803b15801562001dbf57600080fd5b505af115801562001dd4573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001e0e90878787878762003ef0565b979650505050505050565b606f5460ff161562001e3e57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001e8d92600160c01b90048116911662005100565b6001600160401b0316111562001eb657604051638a0704d360e01b815260040160405180910390fd5b6103e862001ec5888862005204565b6001600160401b0316111562001eee57604051635acfba9d60e11b815260040160405180910390fd5b62001f008189898989898989620037ad565b62001f0c81876200402b565b6085546001600160401b03166000036200201a57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001f88576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001fc162002619565b6040518263ffffffff1660e01b815260040162001fe091815260200190565b600060405180830381600087803b15801562001ffb57600080fd5b505af115801562002010573d6000803e3d6000fd5b50505050620020e4565b620020258162004228565b600681018054600160801b90046001600160401b0316906010620020498362005227565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b48887896040516200212a93929190620050c9565b60405180910390a3505050505050505050565b606f5460ff16156200216257604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff8816600090815260816020526040902062002189818989898989898962003425565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620021e862003d9b565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016200226f919062004d78565b602060405180830381865afa1580156200228d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620022b391906200524e565b608454909150600090620022da906001600160401b03600160401b82048116911662005204565b6001600160401b0316905080600003620022f75760009250505090565b6200230381836200527e565b9250505090565b606f5460009060ff16156200233257604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff16908190036200236a576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200239557604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620023c89084906001600160401b031662005100565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620023fe878362005100565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200248d8362004228565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a2582604051620024c591906200482f565b60405180910390a29695505050505050565b60008051602062005e89833981519152620024f28162003419565b606f5460ff166200252d576085546001600160401b03908116908316106200252d5760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590620016b99084906200482f565b60008051602062005e89833981519152620025958162003419565b62015180826001600160401b03161115620025c357604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890620016b99084906200482f565b60805460009063ffffffff168082036200263557506000919050565b6000816001600160401b0381111562002652576200265262004b05565b6040519080825280602002602001820160405280156200267c578160200160208202803683370190505b50905060005b82811015620026ef57608160006200269c83600162005295565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620026cf57620026cf620052ab565b602090810291909101015280620026e681620052c1565b91505062002682565b50600060205b83600114620029335760006200270d600286620052dd565b6200271a6002876200527e565b62002726919062005295565b90506000816001600160401b0381111562002745576200274562004b05565b6040519080825280602002602001820160405280156200276f578160200160208202803683370190505b50905060005b82811015620028e7576200278b600184620052f4565b81148015620027a65750620027a2600288620052dd565b6001145b15620028265785620027ba8260026200512a565b81518110620027cd57620027cd620052ab565b602002602001015185604051602001620027e99291906200530a565b60405160208183030381529060405280519060200120828281518110620028145762002814620052ab565b602002602001018181525050620028d2565b85620028348260026200512a565b81518110620028475762002847620052ab565b6020026020010151868260026200285f91906200512a565b6200286c90600162005295565b815181106200287f576200287f620052ab565b60200260200101516040516020016200289a9291906200530a565b60405160208183030381529060405280519060200120828281518110620028c557620028c5620052ab565b6020026020010181815250505b80620028de81620052c1565b91505062002775565b508094508195508384604051602001620029039291906200530a565b6040516020818303038152906040528051906020012093508280620029289062005318565b9350505050620026f5565b6000836000815181106200294b576200294b620052ab565b6020026020010151905060005b82811015620029d1578184604051602001620029769291906200530a565b6040516020818303038152906040528051906020012091508384604051602001620029a39291906200530a565b6040516020818303038152906040528051906020012093508080620029c890620052c1565b91505062002958565b5095945050505050565b60008051602062005d89833981519152620029f68162003419565b63ffffffff8416158062002a155750607e5463ffffffff908116908516115b1562002a3457604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002a75576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002ac457604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002b0b57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002b4957604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002bc98462001224565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002c1e9216908b908b9060040162005332565b600060405180830381600087803b15801562002c3957600080fd5b505af115801562002c4e573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005da983398151915262002cc38162003419565b683635c9adc5dea0000082118062002cde5750633b9aca0082105b1562002cfd57604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620016b9565b62002d3e826200175b565b62002d498162003419565b62001614838362003e86565b60008051602062005e0983398151915262002d708162003419565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562002dcc57600080fd5b505af115801562002de1573d6000803e3d6000fd5b5050505062002def620042f3565b50565b60008051602062005e6983398151915262002e0d8162003419565b6001600160401b03841660009081526083602052604090205463ffffffff161562002e4b576040516337c8fe0960e11b815260040160405180910390fd5b600062002e5e8888888887600062003135565b60008080526002909101602052604090209390935550505050505050565b60008051602062005de983398151915262002e978162003419565b607e805460009190829062002eb29063ffffffff1662005144565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620030559695949392919062005372565b60405180910390a25050505050505050565b600054610100900460ff16620017595760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b3c565b620017c8828262003e1a565b6000620030ed836200175b565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6080805460009182918290620031519063ffffffff1662005144565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000876001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff16021790555080608260008a6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150878260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550868260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620033509594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b038281166000908152600485016020526040812054909242926200339692918116911662005100565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b031615620033fc575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002def81336200434c565b60078801546000906001600160401b0390811690871610156200345b5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620034fc5760068901546001600160401b03600160801b90910481169089161115620034a55760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b9092041614620034f557604051632bd2e3e760e01b815260040160405180910390fd5b5062003571565b506001600160401b03851660009081526002890160205260409020548062003537576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b909104811690871611156200357157604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620035aa5750876001600160401b0316876001600160401b031611155b80620035ce575060068901546001600160401b03600160c01b909104811690881611155b15620035ed5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b900481169086161462003634576040516332a2a77f60e01b815260040160405180910390fd5b6000620036468a888888868962003ef0565b9050600060008051602062005e298339815191526002836040516200366c9190620053cb565b602060405180830381855afa1580156200368a573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620036af91906200524e565b620036bb9190620052dd565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620036ff91889190600401620053e9565b602060405180830381865afa1580156200371d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003743919062005426565b62003761576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620037a05760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620037bb8a620033a8565b60078b01549091506001600160401b039081169089161015620037f15760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620038945760068a01546001600160401b03600160801b9091048116908a1611156200383b5760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200388d57604051632bd2e3e760e01b815260040160405180910390fd5b5062003904565b6001600160401b038816600090815260028b016020526040902054915081620038d0576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200390457604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620039375760405163b9b18f5760e01b815260040160405180910390fd5b6000620039498b8a8a8a878b62003ef0565b9050600060008051602062005e298339815191526002836040516200396f9190620053cb565b602060405180830381855afa1580156200398d573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620039b291906200524e565b620039be9190620052dd565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003a0291899190600401620053e9565b602060405180830381865afa15801562003a20573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003a46919062005426565b62003a64576040516309bde33960e01b815260040160405180910390fd5b600062003a72848b62005204565b905062003acb87826001600160401b031662003a8d6200221e565b62003a9991906200512a565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004376565b80608460088282829054906101000a90046001600160401b031662003af1919062005100565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b15801562003b8157600080fd5b505af115801562003b96573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003be8575060068201546001600160401b03600160801b9091048116908216115b1562003c075760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003cc362002619565b6040518263ffffffff1660e01b815260040162003ce291815260200190565b600060405180830381600087803b15801562003cfd57600080fd5b505af115801562003d12573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003df757600080fd5b505af115801562003e0c573d6000803e3d6000fd5b5050505062001759620043ca565b62003e268282620021f3565b620017c85760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003e928282620021f3565b15620017c85760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003f26575081155b1562003f455760405163340c614f60e11b815260040160405180910390fd5b8062003f64576040516366385b5160e01b815260040160405180910390fd5b62003f6f8462004427565b62003f8d576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b60006200403883620033a8565b9050816000806200404a848462005204565b6085546001600160401b0391821692506000916200407191600160401b90041642620052f4565b90505b846001600160401b0316846001600160401b031614620040fb576001600160401b03808516600090815260038901602052604090206001810154909116821015620040d6576001810154600160401b90046001600160401b03169450620040f4565b620040e2868662005204565b6001600160401b0316935050620040fb565b5062004074565b6000620041098484620052f4565b9050838110156200416757808403600c81116200412757806200412a565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a60865402816200415c576200415c62005268565b0460865550620041df565b838103600c81116200417a57806200417d565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a76400000281620041b757620041b762005268565b04905080608654670de0b6b3a76400000281620041d857620041d862005268565b0460865550505b683635c9adc5dea0000060865411156200420657683635c9adc5dea000006086556200421e565b633b9aca0060865410156200421e57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002def5760068101546000906200427390600160c01b90046001600160401b0316600162005100565b905062004281828262003363565b15620017c8576006820154600090600290620042af908490600160801b90046001600160401b031662005204565b620042bb91906200544a565b620042c7908362005100565b9050620042d5838262003363565b15620042e75762001614838262003ba9565b62001614838362003ba9565b606f5460ff166200431757604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b620043588282620021f3565b620017c857604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905262001614908490620044ad565b606f5460ff1615620043ef57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b0383161080156200445e575067ffffffff00000001604083901c6001600160401b0316105b80156200447f575067ffffffff00000001608083901c6001600160401b0316105b801562004497575067ffffffff0000000160c083901c105b15620044a557506001919050565b506000919050565b600062004504826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620045869092919063ffffffff16565b80519091501562001614578080602001905181019062004525919062005426565b620016145760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b3c565b60606200459784846000856200459f565b949350505050565b606082471015620046025760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b3c565b600080866001600160a01b03168587604051620046209190620053cb565b60006040518083038185875af1925050503d80600081146200465f576040519150601f19603f3d011682016040523d82523d6000602084013e62004664565b606091505b509150915062001e0e8783838760608315620046e5578251600003620046dd576001600160a01b0385163b620046dd5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b3c565b508162004597565b620045978383815115620046fc5781518083602001fd5b8060405162461bcd60e51b815260040162000b3c919062004d36565b6108f5806200547483390190565b6001600160a01b038116811462002def57600080fd5b80356001600160401b03811681146200341457600080fd5b6000806000806000806000806000806101408b8d0312156200477557600080fd5b8a35620047828162004726565b99506200479260208c016200473c565b9850620047a260408c016200473c565b975060608b0135620047b48162004726565b965060808b0135620047c68162004726565b955060a08b0135620047d88162004726565b945060c08b0135620047ea8162004726565b935060e08b0135620047fc8162004726565b92506200480d6101008c016200473c565b91506200481e6101208c016200473c565b90509295989b9194979a5092959850565b6001600160401b0391909116815260200190565b803563ffffffff811681146200341457600080fd5b600080604083850312156200486c57600080fd5b620048778362004843565b915062004887602084016200473c565b90509250929050565b60008060008060008060c08789031215620048aa57600080fd5b8635620048b78162004726565b9550620048c7602088016200473c565b9450620048d7604088016200473c565b93506060870135620048e98162004726565b92506080870135620048fb8162004726565b915060a08701356200490d8162004726565b809150509295509295509295565b6000602082840312156200492e57600080fd5b62000f6d8262004843565b80610300810183101562000f7057600080fd5b6000806000806000806000806103e0898b0312156200496a57600080fd5b620049758962004843565b97506200498560208a016200473c565b96506200499560408a016200473c565b9550620049a560608a016200473c565b9450620049b560808a016200473c565b935060a0890135925060c08901359150620049d48a60e08b0162004939565b90509295985092959890939650565b6000806000806000806000806103e0898b03121562004a0157600080fd5b62004a0c8962004843565b975062004a1c60208a016200473c565b965062004a2c60408a016200473c565b955062004a3c60608a016200473c565b94506080890135935060a0890135925060c089013562004a5c8162004726565b9150620049d48a60e08b0162004939565b60006020828403121562004a8057600080fd5b813561ffff8116811462004a9357600080fd5b9392505050565b60006020828403121562004aad57600080fd5b5035919050565b6000806040838503121562004ac857600080fd5b82359150602083013562004adc8162004726565b809150509250929050565b60006020828403121562004afa57600080fd5b62000f6d826200473c565b634e487b7160e01b600052604160045260246000fd5b600082601f83011262004b2d57600080fd5b81356001600160401b038082111562004b4a5762004b4a62004b05565b604051601f8301601f19908116603f0116810190828211818310171562004b755762004b7562004b05565b8160405283815286602085880101111562004b8f57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121562004bcb57600080fd5b62004bd68862004843565b965062004be6602089016200473c565b9550604088013562004bf88162004726565b9450606088013562004c0a8162004726565b9350608088013562004c1c8162004726565b925060a08801356001600160401b038082111562004c3957600080fd5b62004c478b838c0162004b1b565b935060c08a013591508082111562004c5e57600080fd5b5062004c6d8a828b0162004b1b565b91505092959891949750929550565b60008060008060008060c0878903121562004c9657600080fd5b62004ca18762004843565b955062004cb1602088016200473c565b945062004cc1604088016200473c565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004cff57818101518382015260200162004ce5565b50506000910152565b6000815180845262004d2281602086016020860162004ce2565b601f01601f19169290920160200192915050565b60208152600062000f6d602083018462004d08565b6000806040838503121562004d5f57600080fd5b62004d6a836200473c565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000806000806060858703121562004da357600080fd5b843562004db08162004726565b935062004dc06020860162004843565b925060408501356001600160401b038082111562004ddd57600080fd5b818701915087601f83011262004df257600080fd5b81358181111562004e0257600080fd5b88602082850101111562004e1557600080fd5b95989497505060200194505050565b60006020828403121562004e3757600080fd5b813562004a938162004726565b803560ff811681146200341457600080fd5b60008060008060008060c0878903121562004e7057600080fd5b863562004e7d8162004726565b9550602087013562004e8f8162004726565b945062004e9f604088016200473c565b935062004eaf606088016200473c565b92506080870135915062004ec660a0880162004e44565b90509295509295509295565b60008060008060008060c0878903121562004eec57600080fd5b863562004ef98162004726565b9550602087013562004f0b8162004726565b945062004f1b604088016200473c565b935062004f2b6060880162004e44565b92506080870135915060a08701356001600160401b0381111562004f4e57600080fd5b62004f5c89828a0162004b1b565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b8054600090600181811c908083168062004fd257607f831692505b6020808410820362004ff457634e487b7160e01b600052602260045260246000fd5b83885260208801828015620050125760018114620050295762005056565b60ff198716825285151560051b8201975062005056565b60008981526020902060005b87811015620050505781548482015290860190840162005035565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c060408201819052600090620050919083018762004fb7565b8281036060840152620050a5818762004fb7565b608084019590955250506001600160401b039190911660a090910152949350505050565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03818116838216019080821115620051235762005123620050ea565b5092915050565b808202811582820484141762000f705762000f70620050ea565b600063ffffffff808316818103620051605762005160620050ea565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620051989083018462004d08565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c060808201819052600090620051e39083018562004d08565b82810360a0840152620051f7818562004d08565b9998505050505050505050565b6001600160401b03828116828216039080821115620051235762005123620050ea565b60006001600160401b038281166002600160401b03198101620051605762005160620050ea565b6000602082840312156200526157600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b60008262005290576200529062005268565b500490565b8082018082111562000f705762000f70620050ea565b634e487b7160e01b600052603260045260246000fd5b600060018201620052d657620052d6620050ea565b5060010190565b600082620052ef57620052ef62005268565b500690565b8181038181111562000f705762000f70620050ea565b918252602082015260400190565b6000816200532a576200532a620050ea565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a08201819052600090620053bf9083018462004d08565b98975050505050505050565b60008251620053df81846020870162004ce2565b9190910192915050565b61032081016103008085843782018360005b60018110156200541c578151835260209283019290910190600101620053fb565b5050509392505050565b6000602082840312156200543957600080fd5b8151801515811462004a9357600080fd5b60006001600160401b038381168062005467576200546762005268565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220a19e7a72432195d9a35c7ce8fa5f1284415aac66bb1ad08a4c2e1c252fd8690864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a26469706673582212203f12260f62b0d87f840f477a6be35cf07e8ec905f8d0f0ce1838a89a9200b2cd64736f6c63430008140033", + "bytecode": "0x60e06040523480156200001157600080fd5b5060405162005be938038062005be9833981016040819052620000349162000141565b6001600160a01b0380841660805280831660c052811660a0528282826200005a62000066565b50505050505062000195565b600054610100900460ff1615620000d35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000126576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013e57600080fd5b50565b6000806000606084860312156200015757600080fd5b8351620001648162000128565b6020850151909350620001778162000128565b60408501519092506200018a8162000128565b809150509250925092565b60805160a05160c0516159ec620001fd6000396000818161099601528181611e5d015261350e01526000818161075c015281816129d701526138080152600081816108f001528181610efa015281816110aa01528181611bc401526136f701526159ec6000f3fe60806040523480156200001157600080fd5b50600436106200029e5760003560e01c80630645af0914620002a3578063066ec01214620002bc578063080b311114620002e85780630a0d9fbe146200031057806311f6b287146200032b57806312b86e1914620003425780631489ed10146200035957806315064c9614620003705780631608859c146200037e5780631796a1ae14620003955780631816b7e514620003bc5780632072f6c514620003d3578063248a9ca314620003dd5780632528016914620004035780632f2ff15d14620004b857806330c27dde14620004cf57806336568abe14620004e3578063394218e914620004fa578063477fa270146200051157806355a71ee0146200051a57806360469169146200055e57806365c0504d14620005685780637222020f1462000617578063727885e9146200062e5780637975fcfe14620006455780637fb6e76a146200066b578063841b24d7146200069457806387c20c0114620006af5780638bd4f07114620006c657806391d1485414620006dd57806399f5634e14620006f45780639a908e7314620006fe5780639c9f3dfe1462000715578063a066215c146200072c578063a217fddf1462000743578063a2967d99146200074c578063a3c573eb1462000756578063afd23cbe146200078d578063b99d0ad714620007b7578063c1acbc34146200088f578063c4c928c214620008aa578063ceee281d14620008c1578063d02103ca14620008ea578063d5073f6f1462000912578063d547741f1462000929578063d939b3151462000940578063dbc169761462000954578063dde0ff77146200095e578063e0bfd3d21462000979578063e46761c41462000990578063f34eb8eb14620009b8578063f4e9267514620009cf578063f9c4c2ae14620009e0575b600080fd5b620002ba620002b4366004620043ed565b62000af7565b005b608454620002d0906001600160401b031681565b604051620002df9190620044c8565b60405180910390f35b620002ff620002f9366004620044f1565b62000e04565b6040519015158152602001620002df565b608554620002d090600160401b90046001600160401b031681565b620002d06200033c36600462004529565b62000e2e565b620002ba620003533660046200455a565b62000e4e565b620002ba6200036a366004620045f1565b62000ffe565b606f54620002ff9060ff1681565b620002ba6200038f366004620044f1565b6200118e565b607e54620003a69063ffffffff1681565b60405163ffffffff9091168152602001620002df565b620002ba620003cd3660046200467b565b62001223565b620002ba620012cf565b620003f4620003ee366004620046a8565b62001395565b604051908152602001620002df565b6200048462000414366004620044f1565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002df565b620002ba620004c9366004620046c2565b620013aa565b608754620002d0906001600160401b031681565b620002ba620004f4366004620046c2565b620013cc565b620002ba6200050b366004620046f5565b62001406565b608654620003f4565b620003f46200052b366004620044f1565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620003f4620014b5565b620005cd6200057936600462004529565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002df565b620002ba6200062836600462004529565b620014cd565b620002ba6200063f366004620047bd565b620015b8565b6200065c620006563660046200488a565b62001a20565b604051620002df919062004944565b620003a66200067c366004620046f5565b60836020526000908152604090205463ffffffff1681565b608454620002d090600160c01b90046001600160401b031681565b620002ba620006c0366004620045f1565b62001a53565b620002ba620006d73660046200455a565b62001d77565b620002ff620006ee366004620046c2565b62001e2d565b620003f462001e58565b620002d06200070f36600462004959565b62001f44565b620002ba62000726366004620046f5565b62002111565b620002ba6200073d366004620046f5565b620021b4565b620003f4600081565b620003f462002253565b6200077e7f000000000000000000000000000000000000000000000000000000000000000081565b604051620002df919062004986565b608554620007a390600160801b900461ffff1681565b60405161ffff9091168152602001620002df565b6200084d620007c8366004620044f1565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002df919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002d090600160801b90046001600160401b031681565b620002ba620008bb3660046200499a565b62002615565b620003a6620008d236600462004a32565b60826020526000908152604090205463ffffffff1681565b6200077e7f000000000000000000000000000000000000000000000000000000000000000081565b620002ba62000923366004620046a8565b620028e2565b620002ba6200093a366004620046c2565b6200296d565b608554620002d0906001600160401b031681565b620002ba6200298f565b608454620002d090600160401b90046001600160401b031681565b620002ba6200098a36600462004a64565b62002a4d565b6200077e7f000000000000000000000000000000000000000000000000000000000000000081565b620002ba620009c936600462004ae0565b62002b15565b608054620003a69063ffffffff1681565b62000a77620009f136600462004529565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002df565b600054600290610100900460ff1615801562000b1a575060005460ff8083169116105b62000b835760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c0462002d00565b62000c1f600080516020620059978339815191528c62002d6d565b62000c2c60008862002d6d565b62000c47600080516020620058978339815191528862002d6d565b62000c62600080516020620058f78339815191528862002d6d565b62000c7d600080516020620058378339815191528862002d6d565b62000c98600080516020620058778339815191528962002d6d565b62000cb3600080516020620059778339815191528962002d6d565b62000cce600080516020620058b78339815191528962002d6d565b62000ce9600080516020620059178339815191528962002d6d565b62000d13600080516020620059978339815191526000805160206200581783398151915262002d79565b62000d2e600080516020620058178339815191528962002d6d565b62000d49600080516020620058578339815191528962002d6d565b62000d73600080516020620059578339815191526000805160206200593783398151915262002d79565b62000d8e600080516020620059578339815191528762002d6d565b62000da9600080516020620059378339815191528762002d6d565b62000db660003362002d6d565b6000805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050505050565b63ffffffff8216600090815260816020526040812062000e25908362002dce565b90505b92915050565b63ffffffff8116600090815260816020526040812062000e289062002e13565b6000805160206200599783398151915262000e698162002e84565b63ffffffff8916600090815260816020526040902062000e90818a8a8a8a8a8a8a62002e90565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000ef8576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000f3162002253565b6040518263ffffffff1660e01b815260040162000f5091815260200190565b600060405180830381600087803b15801562000f6b57600080fd5b505af115801562000f80573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005997833981519152620010198162002e84565b63ffffffff8916600090815260816020526040902062001040818a8a8a8a8a8a8a62003218565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b90041615620010a8576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620010e162002253565b6040518263ffffffff1660e01b81526004016200110091815260200190565b600060405180830381600087803b1580156200111b57600080fd5b505af115801562001130573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a6040516200117a9392919062004b77565b60405180910390a350505050505050505050565b63ffffffff82166000908152608160205260409020620011be600080516020620059978339815191523362001e2d565b6200121257606f5460ff1615620011e857604051630bc011ff60e21b815260040160405180910390fd5b620011f4818362002dce565b6200121257604051630674f25160e11b815260040160405180910390fd5b6200121e818362003614565b505050565b600080516020620059178339815191526200123e8162002e84565b6103e88261ffff1610806200125857506103ff8261ffff16115b156200127757604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620012ea600080516020620059578339815191523362001e2d565b6200138957608454600160801b90046001600160401b031615806200133a575060845442906200132f9062093a8090600160801b90046001600160401b031662004bae565b6001600160401b0316115b806200136a575060875442906200135f9062093a80906001600160401b031662004bae565b6001600160401b0316115b15620013895760405163692baaad60e11b815260040160405180910390fd5b6200139362003806565b565b60009081526034602052604090206001015490565b620013b58262001395565b620013c08162002e84565b6200121e838362003885565b6001600160a01b0381163314620013f657604051630b4ad1cd60e31b815260040160405180910390fd5b620014028282620038f1565b5050565b60008051602062005917833981519152620014218162002e84565b606f5460ff1662001463576084546001600160401b03600160c01b909104811690831610620014635760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190620012c3908490620044c8565b60006086546064620014c8919062004bd8565b905090565b60008051602062005877833981519152620014e88162002e84565b63ffffffff82161580620015075750607e5463ffffffff908116908316115b156200152657604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200156d57604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b60008051602062005977833981519152620015d38162002e84565b63ffffffff88161580620015f25750607e5463ffffffff908116908916115b156200161157604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff16151590036200165857604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001696576040516337c8fe0960e11b815260040160405180910390fd5b60808054600091908290620016b19063ffffffff1662004bf2565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b03909216913091620016ff90620043b1565b6200170d9392919062004c18565b604051809103906000f0801580156200172a573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c6040516200199e949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b03831690637125702290620019de908d908d9088908e908e908e9060040162004c4f565b600060405180830381600087803b158015620019f957600080fd5b505af115801562001a0e573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001a489087878787876200395b565b979650505050505050565b606f5460ff161562001a7857604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001ac792600160c01b90048116911662004bae565b6001600160401b0316111562001af057604051638a0704d360e01b815260040160405180910390fd5b6103e862001aff888862004cb2565b6001600160401b0316111562001b2857604051635acfba9d60e11b815260040160405180910390fd5b62001b3a818989898989898962003218565b62001b46818762003a96565b6085546001600160401b031660000362001c5457600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001bc2576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001bfb62002253565b6040518263ffffffff1660e01b815260040162001c1a91815260200190565b600060405180830381600087803b15801562001c3557600080fd5b505af115801562001c4a573d6000803e3d6000fd5b5050505062001d1e565b62001c5f8162003c93565b600681018054600160801b90046001600160401b031690601062001c838362004cd5565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b488878960405162001d649392919062004b77565b60405180910390a3505050505050505050565b606f5460ff161562001d9c57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff8816600090815260816020526040902062001dc3818989898989898962002e90565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a162001e2262003806565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162001ea9919062004986565b602060405180830381865afa15801562001ec7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001eed919062004cfc565b60845490915060009062001f14906001600160401b03600160401b82048116911662004cb2565b6001600160401b031690508060000362001f315760009250505090565b62001f3d818362004d2c565b9250505090565b606f5460009060ff161562001f6c57604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362001fa4576040516371653c1560e01b815260040160405180910390fd5b836001600160401b031660000362001fcf57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620020029084906001600160401b031662004bae565b82546101009290920a6001600160401b038181021990931691831602179091556006830154169050600062002038878362004bae565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b031990921692909316919091171790559050620020c78362003c93565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a2582604051620020ff9190620044c8565b60405180910390a29695505050505050565b600080516020620059178339815191526200212c8162002e84565b606f5460ff1662002167576085546001600160401b0390811690831610620021675760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590620012c3908490620044c8565b60008051602062005917833981519152620021cf8162002e84565b62015180826001600160401b03161115620021fd57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890620012c3908490620044c8565b60805460009063ffffffff168082036200226f57506000919050565b6000816001600160401b038111156200228c576200228c62004713565b604051908082528060200260200182016040528015620022b6578160200160208202803683370190505b50905060005b82811015620023295760816000620022d683600162004d43565b63ffffffff1663ffffffff1681526020019081526020016000206005015482828151811062002309576200230962004d59565b602090810291909101015280620023208162004d6f565b915050620022bc565b50600060205b836001146200256d5760006200234760028662004d8b565b6200235460028762004d2c565b62002360919062004d43565b90506000816001600160401b038111156200237f576200237f62004713565b604051908082528060200260200182016040528015620023a9578160200160208202803683370190505b50905060005b828110156200252157620023c560018462004da2565b81148015620023e05750620023dc60028862004d8b565b6001145b15620024605785620023f482600262004bd8565b8151811062002407576200240762004d59565b6020026020010151856040516020016200242392919062004db8565b604051602081830303815290604052805190602001208282815181106200244e576200244e62004d59565b6020026020010181815250506200250c565b856200246e82600262004bd8565b8151811062002481576200248162004d59565b60200260200101518682600262002499919062004bd8565b620024a690600162004d43565b81518110620024b957620024b962004d59565b6020026020010151604051602001620024d492919062004db8565b60405160208183030381529060405280519060200120828281518110620024ff57620024ff62004d59565b6020026020010181815250505b80620025188162004d6f565b915050620023af565b5080945081955083846040516020016200253d92919062004db8565b6040516020818303038152906040528051906020012093508280620025629062004dc6565b93505050506200232f565b60008360008151811062002585576200258562004d59565b6020026020010151905060005b828110156200260b578184604051602001620025b092919062004db8565b6040516020818303038152906040528051906020012091508384604051602001620025dd92919062004db8565b6040516020818303038152906040528051906020012093508080620026029062004d6f565b91505062002592565b5095945050505050565b60008051602062005837833981519152620026308162002e84565b63ffffffff841615806200264f5750607e5463ffffffff908116908516115b156200266e57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff1690819003620026af576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b031603620026fe57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff16151590036200274557604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b90920416146200278357604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790556000620028038462000e2e565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef28692620028589216908b908b9060040162004de0565b600060405180830381600087803b1580156200287357600080fd5b505af115801562002888573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005857833981519152620028fd8162002e84565b683635c9adc5dea00000821180620029185750633b9aca0082105b156200293757604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620012c3565b620029788262001395565b620029838162002e84565b6200121e8383620038f1565b600080516020620058b7833981519152620029aa8162002e84565b608780546001600160401b031916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc1697691600480830192600092919082900301818387803b15801562002a2757600080fd5b505af115801562002a3c573d6000803e3d6000fd5b5050505062002a4a62003d5e565b50565b600080516020620058f783398151915262002a688162002e84565b6001600160401b03841660009081526083602052604090205463ffffffff161562002aa6576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b03871660009081526082602052604090205463ffffffff161562002ae457604051630d409b9360e41b815260040160405180910390fd5b600062002af78888888887600062003db7565b60008080526002909101602052604090209390935550505050505050565b6000805160206200589783398151915262002b308162002e84565b607e805460009190829062002b4b9063ffffffff1662004bf2565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002cee9695949392919062004e20565b60405180910390a25050505050505050565b600054610100900460ff16620013935760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b7a565b62001402828262003885565b600062002d868362001395565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6085546001600160401b0382811660009081526004850160205260408120549092429262002e0192918116911662004bae565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b03161562002e67575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002a4a813362003fe5565b60078801546000906001600160401b03908116908716101562002ec65760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b0388161562002f675760068901546001600160401b03600160801b9091048116908916111562002f105760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b909204161462002f6057604051632bd2e3e760e01b815260040160405180910390fd5b5062002fdc565b506001600160401b03851660009081526002890160205260409020548062002fa2576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b9091048116908716111562002fdc57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620030155750876001600160401b0316876001600160401b031611155b8062003039575060068901546001600160401b03600160c01b909104811690881611155b15620030585760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b90048116908616146200309f576040516332a2a77f60e01b815260040160405180910390fd5b6000620030b18a88888886896200395b565b90506000600080516020620058d7833981519152600283604051620030d7919062004e79565b602060405180830381855afa158015620030f5573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200311a919062004cfc565b62003126919062004d8b565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200316a9188919060040162004e97565b602060405180830381865afa15801562003188573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620031ae919062004ed4565b620031cc576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c0160205260409020600201548590036200320b5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620032268a62002e13565b60078b01549091506001600160401b0390811690891610156200325c5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620032ff5760068a01546001600160401b03600160801b9091048116908a161115620032a65760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620032f857604051632bd2e3e760e01b815260040160405180910390fd5b506200336f565b6001600160401b038816600090815260028b0160205260409020549150816200333b576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200336f57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620033a25760405163b9b18f5760e01b815260040160405180910390fd5b6000620033b48b8a8a8a878b6200395b565b90506000600080516020620058d7833981519152600283604051620033da919062004e79565b602060405180830381855afa158015620033f8573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200341d919062004cfc565b62003429919062004d8b565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200346d9189919060040162004e97565b602060405180830381865afa1580156200348b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620034b1919062004ed4565b620034cf576040516309bde33960e01b815260040160405180910390fd5b6000620034dd848b62004cb2565b90506200353687826001600160401b0316620034f862001e58565b62003504919062004bd8565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906200400f565b80608460088282829054906101000a90046001600160401b03166200355c919062004bae565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b158015620035ec57600080fd5b505af115801562003601573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003653575060068201546001600160401b03600160801b9091048116908216115b15620036725760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200372e62002253565b6040518263ffffffff1660e01b81526004016200374d91815260200190565b600060405180830381600087803b1580156200376857600080fd5b505af11580156200377d573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200386257600080fd5b505af115801562003877573d6000803e3d6000fd5b505050506200139362004063565b62003891828262001e2d565b620014025760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b620038fd828262001e2d565b15620014025760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003991575081155b15620039b05760405163340c614f60e11b815260040160405180910390fd5b80620039cf576040516366385b5160e01b815260040160405180910390fd5b620039da84620040c0565b620039f8576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b600062003aa38362002e13565b90508160008062003ab5848462004cb2565b6085546001600160401b03918216925060009162003adc91600160401b9004164262004da2565b90505b846001600160401b0316846001600160401b03161462003b66576001600160401b0380851660009081526003890160205260409020600181015490911682101562003b41576001810154600160401b90046001600160401b0316945062003b5f565b62003b4d868662004cb2565b6001600160401b031693505062003b66565b5062003adf565b600062003b74848462004da2565b90508381101562003bd257808403600c811162003b92578062003b95565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a608654028162003bc75762003bc762004d16565b046086555062003c4a565b838103600c811162003be5578062003be8565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162003c225762003c2262004d16565b04905080608654670de0b6b3a7640000028162003c435762003c4362004d16565b0460865550505b683635c9adc5dea00000608654111562003c7157683635c9adc5dea0000060865562003c89565b633b9aca00608654101562003c8957633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002a4a57600681015460009062003cde90600160c01b90046001600160401b0316600162004bae565b905062003cec828262002dce565b156200140257600682015460009060029062003d1a908490600160801b90046001600160401b031662004cb2565b62003d26919062004ef8565b62003d32908362004bae565b905062003d40838262002dce565b1562003d52576200121e838262003614565b6200121e838362003614565b606f5460ff1662003d8257604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b608080546000918291829062003dd39063ffffffff1662004bf2565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000876001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff16021790555080608260008a6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150878260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550868260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a88888860405162003fd29594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b62003ff1828262001e2d565b6200140257604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526200121e90849062004146565b606f5460ff16156200408857604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b038316108015620040f7575067ffffffff00000001604083901c6001600160401b0316105b801562004118575067ffffffff00000001608083901c6001600160401b0316105b801562004130575067ffffffff0000000160c083901c105b156200413e57506001919050565b506000919050565b60006200419d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200421f9092919063ffffffff16565b8051909150156200121e5780806020019051810190620041be919062004ed4565b6200121e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b7a565b606062004230848460008562004238565b949350505050565b6060824710156200429b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b7a565b600080866001600160a01b03168587604051620042b9919062004e79565b60006040518083038185875af1925050503d8060008114620042f8576040519150601f19603f3d011682016040523d82523d6000602084013e620042fd565b606091505b509150915062001a4887838387606083156200437e57825160000362004376576001600160a01b0385163b620043765760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b7a565b508162004230565b620042308383815115620043955781518083602001fd5b8060405162461bcd60e51b815260040162000b7a919062004944565b6108f58062004f2283390190565b6001600160a01b038116811462002a4a57600080fd5b80356001600160401b038116811462002e7f57600080fd5b6000806000806000806000806000806101408b8d0312156200440e57600080fd5b8a356200441b81620043bf565b99506200442b60208c01620043d5565b98506200443b60408c01620043d5565b975060608b01356200444d81620043bf565b965060808b01356200445f81620043bf565b955060a08b01356200447181620043bf565b945060c08b01356200448381620043bf565b935060e08b01356200449581620043bf565b9250620044a66101008c01620043d5565b9150620044b76101208c01620043d5565b90509295989b9194979a5092959850565b6001600160401b0391909116815260200190565b803563ffffffff8116811462002e7f57600080fd5b600080604083850312156200450557600080fd5b6200451083620044dc565b91506200452060208401620043d5565b90509250929050565b6000602082840312156200453c57600080fd5b62000e2582620044dc565b80610300810183101562000e2857600080fd5b6000806000806000806000806103e0898b0312156200457857600080fd5b6200458389620044dc565b97506200459360208a01620043d5565b9650620045a360408a01620043d5565b9550620045b360608a01620043d5565b9450620045c360808a01620043d5565b935060a0890135925060c08901359150620045e28a60e08b0162004547565b90509295985092959890939650565b6000806000806000806000806103e0898b0312156200460f57600080fd5b6200461a89620044dc565b97506200462a60208a01620043d5565b96506200463a60408a01620043d5565b95506200464a60608a01620043d5565b94506080890135935060a0890135925060c08901356200466a81620043bf565b9150620045e28a60e08b0162004547565b6000602082840312156200468e57600080fd5b813561ffff81168114620046a157600080fd5b9392505050565b600060208284031215620046bb57600080fd5b5035919050565b60008060408385031215620046d657600080fd5b823591506020830135620046ea81620043bf565b809150509250929050565b6000602082840312156200470857600080fd5b62000e2582620043d5565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200473b57600080fd5b81356001600160401b038082111562004758576200475862004713565b604051601f8301601f19908116603f0116810190828211818310171562004783576200478362004713565b816040528381528660208588010111156200479d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a031215620047d957600080fd5b620047e488620044dc565b9650620047f460208901620043d5565b955060408801356200480681620043bf565b945060608801356200481881620043bf565b935060808801356200482a81620043bf565b925060a08801356001600160401b03808211156200484757600080fd5b620048558b838c0162004729565b935060c08a01359150808211156200486c57600080fd5b506200487b8a828b0162004729565b91505092959891949750929550565b60008060008060008060c08789031215620048a457600080fd5b620048af87620044dc565b9550620048bf60208801620043d5565b9450620048cf60408801620043d5565b9350606087013592506080870135915060a087013590509295509295509295565b60005b838110156200490d578181015183820152602001620048f3565b50506000910152565b6000815180845262004930816020860160208601620048f0565b601f01601f19169290920160200192915050565b60208152600062000e25602083018462004916565b600080604083850312156200496d57600080fd5b6200497883620043d5565b946020939093013593505050565b6001600160a01b0391909116815260200190565b60008060008060608587031215620049b157600080fd5b8435620049be81620043bf565b9350620049ce60208601620044dc565b925060408501356001600160401b0380821115620049eb57600080fd5b818701915087601f83011262004a0057600080fd5b81358181111562004a1057600080fd5b88602082850101111562004a2357600080fd5b95989497505060200194505050565b60006020828403121562004a4557600080fd5b8135620046a181620043bf565b803560ff8116811462002e7f57600080fd5b60008060008060008060c0878903121562004a7e57600080fd5b863562004a8b81620043bf565b9550602087013562004a9d81620043bf565b945062004aad60408801620043d5565b935062004abd60608801620043d5565b92506080870135915062004ad460a0880162004a52565b90509295509295509295565b60008060008060008060c0878903121562004afa57600080fd5b863562004b0781620043bf565b9550602087013562004b1981620043bf565b945062004b2960408801620043d5565b935062004b396060880162004a52565b92506080870135915060a08701356001600160401b0381111562004b5c57600080fd5b62004b6a89828a0162004729565b9150509295509295509295565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004bd15762004bd162004b98565b5092915050565b808202811582820484141762000e285762000e2862004b98565b600063ffffffff80831681810362004c0e5762004c0e62004b98565b6001019392505050565b6001600160a01b0384811682528316602082015260606040820181905260009062004c469083018462004916565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c06080820181905260009062004c919083018562004916565b82810360a084015262004ca5818562004916565b9998505050505050505050565b6001600160401b0382811682821603908082111562004bd15762004bd162004b98565b60006001600160401b038281166002600160401b0319810162004c0e5762004c0e62004b98565b60006020828403121562004d0f57600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b60008262004d3e5762004d3e62004d16565b500490565b8082018082111562000e285762000e2862004b98565b634e487b7160e01b600052603260045260246000fd5b60006001820162004d845762004d8462004b98565b5060010190565b60008262004d9d5762004d9d62004d16565b500690565b8181038181111562000e285762000e2862004b98565b918252602082015260400190565b60008162004dd85762004dd862004b98565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a0820181905260009062004e6d9083018462004916565b98975050505050505050565b6000825162004e8d818460208701620048f0565b9190910192915050565b61032081016103008085843782018360005b600181101562004eca57815183526020928301929091019060010162004ea9565b5050509392505050565b60006020828403121562004ee757600080fd5b81518015158114620046a157600080fd5b60006001600160401b038381168062004f155762004f1562004d16565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca26469706673582212208e78e901799caaaff866d77d874534e79db9f4bae5f48cfae79611891464d2c664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000013dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a264697066735822122030adb7cdaec642e29699593befd5e18a415007c5419bda7df68fe953295bd7ff64736f6c63430008140033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b50600436106200029e5760003560e01c80630645af0914620002a3578063066ec01214620002bc578063080b311114620002e85780630a0d9fbe146200031057806311f6b287146200032b57806312b86e1914620003425780631489ed10146200035957806315064c9614620003705780631608859c146200037e5780631796a1ae14620003955780631816b7e514620003bc5780632072f6c514620003d3578063248a9ca314620003dd5780632528016914620004035780632f2ff15d14620004b857806330c27dde14620004cf57806336568abe14620004e3578063394218e914620004fa578063477fa270146200051157806355a71ee0146200051a57806360469169146200055e57806365c0504d14620005685780637222020f1462000617578063727885e9146200062e5780637975fcfe14620006455780637fb6e76a146200066b578063841b24d7146200069457806387c20c0114620006af5780638bd4f07114620006c657806391d1485414620006dd57806399f5634e14620006f45780639a908e7314620006fe5780639c9f3dfe1462000715578063a066215c146200072c578063a217fddf1462000743578063a2967d99146200074c578063a3c573eb1462000756578063afd23cbe146200078d578063b99d0ad714620007b7578063c1acbc34146200088f578063c4c928c214620008aa578063ceee281d14620008c1578063d02103ca14620008ea578063d5073f6f1462000912578063d547741f1462000929578063d939b3151462000940578063dbc169761462000954578063dde0ff77146200095e578063e0bfd3d21462000979578063e46761c41462000990578063f34eb8eb14620009b8578063f4e9267514620009cf578063f9c4c2ae14620009e0575b600080fd5b620002ba620002b4366004620043ed565b62000af7565b005b608454620002d0906001600160401b031681565b604051620002df9190620044c8565b60405180910390f35b620002ff620002f9366004620044f1565b62000e04565b6040519015158152602001620002df565b608554620002d090600160401b90046001600160401b031681565b620002d06200033c36600462004529565b62000e2e565b620002ba620003533660046200455a565b62000e4e565b620002ba6200036a366004620045f1565b62000ffe565b606f54620002ff9060ff1681565b620002ba6200038f366004620044f1565b6200118e565b607e54620003a69063ffffffff1681565b60405163ffffffff9091168152602001620002df565b620002ba620003cd3660046200467b565b62001223565b620002ba620012cf565b620003f4620003ee366004620046a8565b62001395565b604051908152602001620002df565b6200048462000414366004620044f1565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002df565b620002ba620004c9366004620046c2565b620013aa565b608754620002d0906001600160401b031681565b620002ba620004f4366004620046c2565b620013cc565b620002ba6200050b366004620046f5565b62001406565b608654620003f4565b620003f46200052b366004620044f1565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620003f4620014b5565b620005cd6200057936600462004529565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002df565b620002ba6200062836600462004529565b620014cd565b620002ba6200063f366004620047bd565b620015b8565b6200065c620006563660046200488a565b62001a20565b604051620002df919062004944565b620003a66200067c366004620046f5565b60836020526000908152604090205463ffffffff1681565b608454620002d090600160c01b90046001600160401b031681565b620002ba620006c0366004620045f1565b62001a53565b620002ba620006d73660046200455a565b62001d77565b620002ff620006ee366004620046c2565b62001e2d565b620003f462001e58565b620002d06200070f36600462004959565b62001f44565b620002ba62000726366004620046f5565b62002111565b620002ba6200073d366004620046f5565b620021b4565b620003f4600081565b620003f462002253565b6200077e7f000000000000000000000000000000000000000000000000000000000000000081565b604051620002df919062004986565b608554620007a390600160801b900461ffff1681565b60405161ffff9091168152602001620002df565b6200084d620007c8366004620044f1565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002df919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002d090600160801b90046001600160401b031681565b620002ba620008bb3660046200499a565b62002615565b620003a6620008d236600462004a32565b60826020526000908152604090205463ffffffff1681565b6200077e7f000000000000000000000000000000000000000000000000000000000000000081565b620002ba62000923366004620046a8565b620028e2565b620002ba6200093a366004620046c2565b6200296d565b608554620002d0906001600160401b031681565b620002ba6200298f565b608454620002d090600160401b90046001600160401b031681565b620002ba6200098a36600462004a64565b62002a4d565b6200077e7f000000000000000000000000000000000000000000000000000000000000000081565b620002ba620009c936600462004ae0565b62002b15565b608054620003a69063ffffffff1681565b62000a77620009f136600462004529565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002df565b600054600290610100900460ff1615801562000b1a575060005460ff8083169116105b62000b835760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c0462002d00565b62000c1f600080516020620059978339815191528c62002d6d565b62000c2c60008862002d6d565b62000c47600080516020620058978339815191528862002d6d565b62000c62600080516020620058f78339815191528862002d6d565b62000c7d600080516020620058378339815191528862002d6d565b62000c98600080516020620058778339815191528962002d6d565b62000cb3600080516020620059778339815191528962002d6d565b62000cce600080516020620058b78339815191528962002d6d565b62000ce9600080516020620059178339815191528962002d6d565b62000d13600080516020620059978339815191526000805160206200581783398151915262002d79565b62000d2e600080516020620058178339815191528962002d6d565b62000d49600080516020620058578339815191528962002d6d565b62000d73600080516020620059578339815191526000805160206200593783398151915262002d79565b62000d8e600080516020620059578339815191528762002d6d565b62000da9600080516020620059378339815191528762002d6d565b62000db660003362002d6d565b6000805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050505050565b63ffffffff8216600090815260816020526040812062000e25908362002dce565b90505b92915050565b63ffffffff8116600090815260816020526040812062000e289062002e13565b6000805160206200599783398151915262000e698162002e84565b63ffffffff8916600090815260816020526040902062000e90818a8a8a8a8a8a8a62002e90565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000ef8576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000f3162002253565b6040518263ffffffff1660e01b815260040162000f5091815260200190565b600060405180830381600087803b15801562000f6b57600080fd5b505af115801562000f80573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005997833981519152620010198162002e84565b63ffffffff8916600090815260816020526040902062001040818a8a8a8a8a8a8a62003218565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b90041615620010a8576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620010e162002253565b6040518263ffffffff1660e01b81526004016200110091815260200190565b600060405180830381600087803b1580156200111b57600080fd5b505af115801562001130573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a6040516200117a9392919062004b77565b60405180910390a350505050505050505050565b63ffffffff82166000908152608160205260409020620011be600080516020620059978339815191523362001e2d565b6200121257606f5460ff1615620011e857604051630bc011ff60e21b815260040160405180910390fd5b620011f4818362002dce565b6200121257604051630674f25160e11b815260040160405180910390fd5b6200121e818362003614565b505050565b600080516020620059178339815191526200123e8162002e84565b6103e88261ffff1610806200125857506103ff8261ffff16115b156200127757604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620012ea600080516020620059578339815191523362001e2d565b6200138957608454600160801b90046001600160401b031615806200133a575060845442906200132f9062093a8090600160801b90046001600160401b031662004bae565b6001600160401b0316115b806200136a575060875442906200135f9062093a80906001600160401b031662004bae565b6001600160401b0316115b15620013895760405163692baaad60e11b815260040160405180910390fd5b6200139362003806565b565b60009081526034602052604090206001015490565b620013b58262001395565b620013c08162002e84565b6200121e838362003885565b6001600160a01b0381163314620013f657604051630b4ad1cd60e31b815260040160405180910390fd5b620014028282620038f1565b5050565b60008051602062005917833981519152620014218162002e84565b606f5460ff1662001463576084546001600160401b03600160c01b909104811690831610620014635760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190620012c3908490620044c8565b60006086546064620014c8919062004bd8565b905090565b60008051602062005877833981519152620014e88162002e84565b63ffffffff82161580620015075750607e5463ffffffff908116908316115b156200152657604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200156d57604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b60008051602062005977833981519152620015d38162002e84565b63ffffffff88161580620015f25750607e5463ffffffff908116908916115b156200161157604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff16151590036200165857604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001696576040516337c8fe0960e11b815260040160405180910390fd5b60808054600091908290620016b19063ffffffff1662004bf2565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b03909216913091620016ff90620043b1565b6200170d9392919062004c18565b604051809103906000f0801580156200172a573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c6040516200199e949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b03831690637125702290620019de908d908d9088908e908e908e9060040162004c4f565b600060405180830381600087803b158015620019f957600080fd5b505af115801562001a0e573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001a489087878787876200395b565b979650505050505050565b606f5460ff161562001a7857604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001ac792600160c01b90048116911662004bae565b6001600160401b0316111562001af057604051638a0704d360e01b815260040160405180910390fd5b6103e862001aff888862004cb2565b6001600160401b0316111562001b2857604051635acfba9d60e11b815260040160405180910390fd5b62001b3a818989898989898962003218565b62001b46818762003a96565b6085546001600160401b031660000362001c5457600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001bc2576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001bfb62002253565b6040518263ffffffff1660e01b815260040162001c1a91815260200190565b600060405180830381600087803b15801562001c3557600080fd5b505af115801562001c4a573d6000803e3d6000fd5b5050505062001d1e565b62001c5f8162003c93565b600681018054600160801b90046001600160401b031690601062001c838362004cd5565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b488878960405162001d649392919062004b77565b60405180910390a3505050505050505050565b606f5460ff161562001d9c57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff8816600090815260816020526040902062001dc3818989898989898962002e90565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a162001e2262003806565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162001ea9919062004986565b602060405180830381865afa15801562001ec7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001eed919062004cfc565b60845490915060009062001f14906001600160401b03600160401b82048116911662004cb2565b6001600160401b031690508060000362001f315760009250505090565b62001f3d818362004d2c565b9250505090565b606f5460009060ff161562001f6c57604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362001fa4576040516371653c1560e01b815260040160405180910390fd5b836001600160401b031660000362001fcf57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620020029084906001600160401b031662004bae565b82546101009290920a6001600160401b038181021990931691831602179091556006830154169050600062002038878362004bae565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b031990921692909316919091171790559050620020c78362003c93565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a2582604051620020ff9190620044c8565b60405180910390a29695505050505050565b600080516020620059178339815191526200212c8162002e84565b606f5460ff1662002167576085546001600160401b0390811690831610620021675760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590620012c3908490620044c8565b60008051602062005917833981519152620021cf8162002e84565b62015180826001600160401b03161115620021fd57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890620012c3908490620044c8565b60805460009063ffffffff168082036200226f57506000919050565b6000816001600160401b038111156200228c576200228c62004713565b604051908082528060200260200182016040528015620022b6578160200160208202803683370190505b50905060005b82811015620023295760816000620022d683600162004d43565b63ffffffff1663ffffffff1681526020019081526020016000206005015482828151811062002309576200230962004d59565b602090810291909101015280620023208162004d6f565b915050620022bc565b50600060205b836001146200256d5760006200234760028662004d8b565b6200235460028762004d2c565b62002360919062004d43565b90506000816001600160401b038111156200237f576200237f62004713565b604051908082528060200260200182016040528015620023a9578160200160208202803683370190505b50905060005b828110156200252157620023c560018462004da2565b81148015620023e05750620023dc60028862004d8b565b6001145b15620024605785620023f482600262004bd8565b8151811062002407576200240762004d59565b6020026020010151856040516020016200242392919062004db8565b604051602081830303815290604052805190602001208282815181106200244e576200244e62004d59565b6020026020010181815250506200250c565b856200246e82600262004bd8565b8151811062002481576200248162004d59565b60200260200101518682600262002499919062004bd8565b620024a690600162004d43565b81518110620024b957620024b962004d59565b6020026020010151604051602001620024d492919062004db8565b60405160208183030381529060405280519060200120828281518110620024ff57620024ff62004d59565b6020026020010181815250505b80620025188162004d6f565b915050620023af565b5080945081955083846040516020016200253d92919062004db8565b6040516020818303038152906040528051906020012093508280620025629062004dc6565b93505050506200232f565b60008360008151811062002585576200258562004d59565b6020026020010151905060005b828110156200260b578184604051602001620025b092919062004db8565b6040516020818303038152906040528051906020012091508384604051602001620025dd92919062004db8565b6040516020818303038152906040528051906020012093508080620026029062004d6f565b91505062002592565b5095945050505050565b60008051602062005837833981519152620026308162002e84565b63ffffffff841615806200264f5750607e5463ffffffff908116908516115b156200266e57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff1690819003620026af576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b031603620026fe57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff16151590036200274557604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b90920416146200278357604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790556000620028038462000e2e565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef28692620028589216908b908b9060040162004de0565b600060405180830381600087803b1580156200287357600080fd5b505af115801562002888573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005857833981519152620028fd8162002e84565b683635c9adc5dea00000821180620029185750633b9aca0082105b156200293757604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620012c3565b620029788262001395565b620029838162002e84565b6200121e8383620038f1565b600080516020620058b7833981519152620029aa8162002e84565b608780546001600160401b031916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc1697691600480830192600092919082900301818387803b15801562002a2757600080fd5b505af115801562002a3c573d6000803e3d6000fd5b5050505062002a4a62003d5e565b50565b600080516020620058f783398151915262002a688162002e84565b6001600160401b03841660009081526083602052604090205463ffffffff161562002aa6576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b03871660009081526082602052604090205463ffffffff161562002ae457604051630d409b9360e41b815260040160405180910390fd5b600062002af78888888887600062003db7565b60008080526002909101602052604090209390935550505050505050565b6000805160206200589783398151915262002b308162002e84565b607e805460009190829062002b4b9063ffffffff1662004bf2565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002cee9695949392919062004e20565b60405180910390a25050505050505050565b600054610100900460ff16620013935760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b7a565b62001402828262003885565b600062002d868362001395565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6085546001600160401b0382811660009081526004850160205260408120549092429262002e0192918116911662004bae565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b03161562002e67575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002a4a813362003fe5565b60078801546000906001600160401b03908116908716101562002ec65760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b0388161562002f675760068901546001600160401b03600160801b9091048116908916111562002f105760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b909204161462002f6057604051632bd2e3e760e01b815260040160405180910390fd5b5062002fdc565b506001600160401b03851660009081526002890160205260409020548062002fa2576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b9091048116908716111562002fdc57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620030155750876001600160401b0316876001600160401b031611155b8062003039575060068901546001600160401b03600160c01b909104811690881611155b15620030585760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b90048116908616146200309f576040516332a2a77f60e01b815260040160405180910390fd5b6000620030b18a88888886896200395b565b90506000600080516020620058d7833981519152600283604051620030d7919062004e79565b602060405180830381855afa158015620030f5573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200311a919062004cfc565b62003126919062004d8b565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200316a9188919060040162004e97565b602060405180830381865afa15801562003188573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620031ae919062004ed4565b620031cc576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c0160205260409020600201548590036200320b5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620032268a62002e13565b60078b01549091506001600160401b0390811690891610156200325c5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620032ff5760068a01546001600160401b03600160801b9091048116908a161115620032a65760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620032f857604051632bd2e3e760e01b815260040160405180910390fd5b506200336f565b6001600160401b038816600090815260028b0160205260409020549150816200333b576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200336f57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620033a25760405163b9b18f5760e01b815260040160405180910390fd5b6000620033b48b8a8a8a878b6200395b565b90506000600080516020620058d7833981519152600283604051620033da919062004e79565b602060405180830381855afa158015620033f8573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200341d919062004cfc565b62003429919062004d8b565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200346d9189919060040162004e97565b602060405180830381865afa1580156200348b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620034b1919062004ed4565b620034cf576040516309bde33960e01b815260040160405180910390fd5b6000620034dd848b62004cb2565b90506200353687826001600160401b0316620034f862001e58565b62003504919062004bd8565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906200400f565b80608460088282829054906101000a90046001600160401b03166200355c919062004bae565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b158015620035ec57600080fd5b505af115801562003601573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003653575060068201546001600160401b03600160801b9091048116908216115b15620036725760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200372e62002253565b6040518263ffffffff1660e01b81526004016200374d91815260200190565b600060405180830381600087803b1580156200376857600080fd5b505af11580156200377d573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200386257600080fd5b505af115801562003877573d6000803e3d6000fd5b505050506200139362004063565b62003891828262001e2d565b620014025760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b620038fd828262001e2d565b15620014025760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003991575081155b15620039b05760405163340c614f60e11b815260040160405180910390fd5b80620039cf576040516366385b5160e01b815260040160405180910390fd5b620039da84620040c0565b620039f8576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b600062003aa38362002e13565b90508160008062003ab5848462004cb2565b6085546001600160401b03918216925060009162003adc91600160401b9004164262004da2565b90505b846001600160401b0316846001600160401b03161462003b66576001600160401b0380851660009081526003890160205260409020600181015490911682101562003b41576001810154600160401b90046001600160401b0316945062003b5f565b62003b4d868662004cb2565b6001600160401b031693505062003b66565b5062003adf565b600062003b74848462004da2565b90508381101562003bd257808403600c811162003b92578062003b95565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a608654028162003bc75762003bc762004d16565b046086555062003c4a565b838103600c811162003be5578062003be8565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162003c225762003c2262004d16565b04905080608654670de0b6b3a7640000028162003c435762003c4362004d16565b0460865550505b683635c9adc5dea00000608654111562003c7157683635c9adc5dea0000060865562003c89565b633b9aca00608654101562003c8957633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002a4a57600681015460009062003cde90600160c01b90046001600160401b0316600162004bae565b905062003cec828262002dce565b156200140257600682015460009060029062003d1a908490600160801b90046001600160401b031662004cb2565b62003d26919062004ef8565b62003d32908362004bae565b905062003d40838262002dce565b1562003d52576200121e838262003614565b6200121e838362003614565b606f5460ff1662003d8257604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b608080546000918291829062003dd39063ffffffff1662004bf2565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000876001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff16021790555080608260008a6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150878260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550868260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a88888860405162003fd29594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b62003ff1828262001e2d565b6200140257604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526200121e90849062004146565b606f5460ff16156200408857604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b038316108015620040f7575067ffffffff00000001604083901c6001600160401b0316105b801562004118575067ffffffff00000001608083901c6001600160401b0316105b801562004130575067ffffffff0000000160c083901c105b156200413e57506001919050565b506000919050565b60006200419d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200421f9092919063ffffffff16565b8051909150156200121e5780806020019051810190620041be919062004ed4565b6200121e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b7a565b606062004230848460008562004238565b949350505050565b6060824710156200429b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b7a565b600080866001600160a01b03168587604051620042b9919062004e79565b60006040518083038185875af1925050503d8060008114620042f8576040519150601f19603f3d011682016040523d82523d6000602084013e620042fd565b606091505b509150915062001a4887838387606083156200437e57825160000362004376576001600160a01b0385163b620043765760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b7a565b508162004230565b620042308383815115620043955781518083602001fd5b8060405162461bcd60e51b815260040162000b7a919062004944565b6108f58062004f2283390190565b6001600160a01b038116811462002a4a57600080fd5b80356001600160401b038116811462002e7f57600080fd5b6000806000806000806000806000806101408b8d0312156200440e57600080fd5b8a356200441b81620043bf565b99506200442b60208c01620043d5565b98506200443b60408c01620043d5565b975060608b01356200444d81620043bf565b965060808b01356200445f81620043bf565b955060a08b01356200447181620043bf565b945060c08b01356200448381620043bf565b935060e08b01356200449581620043bf565b9250620044a66101008c01620043d5565b9150620044b76101208c01620043d5565b90509295989b9194979a5092959850565b6001600160401b0391909116815260200190565b803563ffffffff8116811462002e7f57600080fd5b600080604083850312156200450557600080fd5b6200451083620044dc565b91506200452060208401620043d5565b90509250929050565b6000602082840312156200453c57600080fd5b62000e2582620044dc565b80610300810183101562000e2857600080fd5b6000806000806000806000806103e0898b0312156200457857600080fd5b6200458389620044dc565b97506200459360208a01620043d5565b9650620045a360408a01620043d5565b9550620045b360608a01620043d5565b9450620045c360808a01620043d5565b935060a0890135925060c08901359150620045e28a60e08b0162004547565b90509295985092959890939650565b6000806000806000806000806103e0898b0312156200460f57600080fd5b6200461a89620044dc565b97506200462a60208a01620043d5565b96506200463a60408a01620043d5565b95506200464a60608a01620043d5565b94506080890135935060a0890135925060c08901356200466a81620043bf565b9150620045e28a60e08b0162004547565b6000602082840312156200468e57600080fd5b813561ffff81168114620046a157600080fd5b9392505050565b600060208284031215620046bb57600080fd5b5035919050565b60008060408385031215620046d657600080fd5b823591506020830135620046ea81620043bf565b809150509250929050565b6000602082840312156200470857600080fd5b62000e2582620043d5565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200473b57600080fd5b81356001600160401b038082111562004758576200475862004713565b604051601f8301601f19908116603f0116810190828211818310171562004783576200478362004713565b816040528381528660208588010111156200479d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a031215620047d957600080fd5b620047e488620044dc565b9650620047f460208901620043d5565b955060408801356200480681620043bf565b945060608801356200481881620043bf565b935060808801356200482a81620043bf565b925060a08801356001600160401b03808211156200484757600080fd5b620048558b838c0162004729565b935060c08a01359150808211156200486c57600080fd5b506200487b8a828b0162004729565b91505092959891949750929550565b60008060008060008060c08789031215620048a457600080fd5b620048af87620044dc565b9550620048bf60208801620043d5565b9450620048cf60408801620043d5565b9350606087013592506080870135915060a087013590509295509295509295565b60005b838110156200490d578181015183820152602001620048f3565b50506000910152565b6000815180845262004930816020860160208601620048f0565b601f01601f19169290920160200192915050565b60208152600062000e25602083018462004916565b600080604083850312156200496d57600080fd5b6200497883620043d5565b946020939093013593505050565b6001600160a01b0391909116815260200190565b60008060008060608587031215620049b157600080fd5b8435620049be81620043bf565b9350620049ce60208601620044dc565b925060408501356001600160401b0380821115620049eb57600080fd5b818701915087601f83011262004a0057600080fd5b81358181111562004a1057600080fd5b88602082850101111562004a2357600080fd5b95989497505060200194505050565b60006020828403121562004a4557600080fd5b8135620046a181620043bf565b803560ff8116811462002e7f57600080fd5b60008060008060008060c0878903121562004a7e57600080fd5b863562004a8b81620043bf565b9550602087013562004a9d81620043bf565b945062004aad60408801620043d5565b935062004abd60608801620043d5565b92506080870135915062004ad460a0880162004a52565b90509295509295509295565b60008060008060008060c0878903121562004afa57600080fd5b863562004b0781620043bf565b9550602087013562004b1981620043bf565b945062004b2960408801620043d5565b935062004b396060880162004a52565b92506080870135915060a08701356001600160401b0381111562004b5c57600080fd5b62004b6a89828a0162004729565b9150509295509295509295565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004bd15762004bd162004b98565b5092915050565b808202811582820484141762000e285762000e2862004b98565b600063ffffffff80831681810362004c0e5762004c0e62004b98565b6001019392505050565b6001600160a01b0384811682528316602082015260606040820181905260009062004c469083018462004916565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c06080820181905260009062004c919083018562004916565b82810360a084015262004ca5818562004916565b9998505050505050505050565b6001600160401b0382811682821603908082111562004bd15762004bd162004b98565b60006001600160401b038281166002600160401b0319810162004c0e5762004c0e62004b98565b60006020828403121562004d0f57600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b60008262004d3e5762004d3e62004d16565b500490565b8082018082111562000e285762000e2862004b98565b634e487b7160e01b600052603260045260246000fd5b60006001820162004d845762004d8462004b98565b5060010190565b60008262004d9d5762004d9d62004d16565b500690565b8181038181111562000e285762000e2862004b98565b918252602082015260400190565b60008162004dd85762004dd862004b98565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a0820181905260009062004e6d9083018462004916565b98975050505050505050565b6000825162004e8d818460208701620048f0565b9190910192915050565b61032081016103008085843782018360005b600181101562004eca57815183526020928301929091019060010162004ea9565b5050509392505050565b60006020828403121562004ee757600080fd5b81518015158114620046a157600080fd5b60006001600160401b038381168062004f155762004f1562004d16565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca26469706673582212208e78e901799caaaff866d77d874534e79db9f4bae5f48cfae79611891464d2c664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000013dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a264697066735822122030adb7cdaec642e29699593befd5e18a415007c5419bda7df68fe953295bd7ff64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVM.json b/compiled-contracts/paris/PolygonZkEVM.json index 98e418fb3..9599326c5 100644 --- a/compiled-contracts/paris/PolygonZkEVM.json +++ b/compiled-contracts/paris/PolygonZkEVM.json @@ -1711,8 +1711,8 @@ "type": "function" } ], - "bytecode": "0x6101406040523480156200001257600080fd5b5060405162006078380380620060788339810160408190526200003591620000a5565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b0391821661010052166101205262000131565b6001600160a01b03811681146200008557600080fd5b50565b80516001600160401b0381168114620000a057600080fd5b919050565b60008060008060008060c08789031215620000bf57600080fd5b8651620000cc816200006f565b6020880151909650620000df816200006f565b6040880151909550620000f2816200006f565b606088015190945062000105816200006f565b9250620001156080880162000088565b91506200012560a0880162000088565b90509295509295509295565b60805160a05160c05160e0516101005161012051615e79620001ff6000396000818161069601528181610dec01526131760152600081816108030152610dc20152600081816107c901528181611d910152818161380f0152614c8f01526000818161096f01528181610f5f01528181611130015281816119990152818161216a015281816139f70152614759015260008181610a1c015281816140b4015261450c0152600081816108bf01528181611d5f0152818161265b015281816139cb01526141a20152615e796000f3fe608060405234801561001057600080fd5b50600436106103ba5760003560e01c8063841b24d7116101f4578063c754c7ed1161011a578063e7a7ed02116100ad578063f14916d61161007c578063f14916d614610a7e578063f2fde38b14610a91578063f851a44014610aa4578063f8b823e414610ac457600080fd5b8063e7a7ed02146109e7578063e8bf92ed14610a17578063eaeb077b14610a3e578063ed6b010414610a5157600080fd5b8063d2e129f9116100e9578063d2e129f914610991578063d8d1091b146109a4578063d939b315146109b7578063dbc16976146109df57600080fd5b8063c754c7ed146108fc578063c89e42df14610928578063cfa8ed471461093b578063d02103ca1461096a57600080fd5b8063a3c573eb11610192578063b4d63f5811610161578063b4d63f5814610853578063b6b0b097146108ba578063ba58ae39146108e1578063c0ed84e0146108f457600080fd5b8063a3c573eb146107c4578063ada8f919146107eb578063adc879e9146107fe578063afd23cbe1461082557600080fd5b806399f5634e116101ce57806399f5634e146107835780639aa972a31461078b5780639c9f3dfe1461079e578063a066215c146107b157600080fd5b8063841b24d71461072d5780638c3d73011461075d5780638da5cb5b1461076557600080fd5b80634a1a89a7116102e4578063621dd411116102775780637215541a116102465780637215541a1461066a5780637fcb36531461067d578063831c7ead14610691578063837a4738146106b857600080fd5b8063621dd4111461061c5780636b8616ce1461062f5780636ff512cc1461064f578063715018a61461066257600080fd5b8063542028d5116102b3578063542028d5146105f15780635e9145c9146105f95780635ec919581461060c578063604691691461061457600080fd5b80634a1a89a71461057d5780634a910e6a1461059d5780634e487706146105b05780635392c5e0146105c357600080fd5b8063298789831161035c578063394218e91161032b578063394218e91461050e578063423fa856146105215780634560526714610541578063458c04771461056957600080fd5b806329878983146104a95780632b0006fa146104d55780632c1f816a146104e8578063383b3be8146104fb57600080fd5b80631816b7e5116103985780631816b7e51461042857806319d8ac611461043d578063220d789914610451578063267822471461046457600080fd5b80630a0d9fbe146103bf578063107bf28c146103f657806315064c961461040b575b600080fd5b606f546103d890610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6103fe610acd565b6040516103ed91906152bb565b606f546104189060ff1681565b60405190151581526020016103ed565b61043b6104363660046152d5565b610b5b565b005b6073546103d89067ffffffffffffffff1681565b6103fe61045f366004615311565b610c73565b607b546104849073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103ed565b6074546104849068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61043b6104e3366004615376565b610e4a565b61043b6104f63660046153de565b61101a565b610418610509366004615458565b611228565b61043b61051c366004615458565b61127e565b6073546103d89068010000000000000000900467ffffffffffffffff1681565b6073546103d890700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546103d89067ffffffffffffffff1681565b6079546103d89068010000000000000000900467ffffffffffffffff1681565b61043b6105ab366004615458565b611402565b61043b6105be366004615458565b6114b5565b6105e36105d1366004615458565b60756020526000908152604090205481565b6040519081526020016103ed565b6103fe611639565b61043b6106073660046154e3565b611646565b61043b611e50565b6105e3611f50565b61043b61062a366004615376565b611f66565b6105e361063d366004615458565b60716020526000908152604090205481565b61043b61065d366004615537565b6122ee565b61043b6123c3565b61043b610678366004615458565b6123d7565b6074546103d89067ffffffffffffffff1681565b6103d87f000000000000000000000000000000000000000000000000000000000000000081565b6107016106c6366004615552565b60786020526000908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016103ed565b6079546103d8907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61043b612547565b60335473ffffffffffffffffffffffffffffffffffffffff16610484565b6105e3612613565b61043b6107993660046153de565b61276c565b61043b6107ac366004615458565b61281d565b61043b6107bf366004615458565b612999565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b61043b6107f9366004615537565b612a9f565b6103d87f000000000000000000000000000000000000000000000000000000000000000081565b606f54610840906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103ed565b610894610861366004615458565b6072602052600090815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016103ed565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b6104186108ef366004615552565b612b63565b6103d8612bed565b607b546103d89074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b61043b610936366004615645565b612c42565b606f54610484906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b61043b61099f3660046156bc565b612ccf565b61043b6109b236600461576f565b61321a565b6079546103d890700100000000000000000000000000000000900467ffffffffffffffff1681565b61043b6137bc565b6073546103d8907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b61043b610a4c3660046157b1565b613895565b607b54610418907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b61043b610a8c366004615537565b613c8b565b61043b610a9f366004615537565b613d5d565b607a546104849073ffffffffffffffffffffffffffffffffffffffff1681565b6105e360705481565b60778054610ada906157fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610b06906157fd565b8015610b535780601f10610b2857610100808354040283529160200191610b53565b820191906000526020600020905b815481529060010190602001808311610b3657829003601f168201915b505050505081565b607a5473ffffffffffffffffffffffffffffffffffffffff163314610bac576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff161080610bc557506103ff8161ffff16115b15610bfc576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086166000818152607260205260408082205493881682529020546060929115801590610ca7575081155b15610cde576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610d15576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d1e84612b63565b610d54576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610ea7576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610eb5868686868686613e11565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615610f3057607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015610fb857600080fd5b505af1158015610fcc573d6000803e3d6000fd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611077576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611086878787878787876141d5565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092556000908152607560205260409020839055607954161561110157607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b15801561118957600080fd5b505af115801561119d573d6000803e3d6000fd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281166000908152607860205260408120549092429261126c927001000000000000000000000000000000009092048116911661587f565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146112cf576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611316576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166113855760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611385576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610c68565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146114a957606f5460ff161561146a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61147381611228565b6114a9576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114b28161460f565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611506576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561154d576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166115b857607b5467ffffffffffffffff740100000000000000000000000000000000000000009091048116908216106115b8576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001610c68565b60768054610ada906157fd565b606f5460ff1615611683576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146116e3576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600081900361171f576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561175b576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000082048116600081815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b86811015611bab5760008a8a838181106117c3576117c36158a7565b90506020028101906117d591906158d6565b6117de90615914565b8051805160209091012060608201519192509067ffffffffffffffff1615611956578561180a816159a1565b9650506000818360200151846060015160405160200161186293929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a166000908152607190935291205490915081146118eb576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088166000908152607160205260408082209190915560608501519085015190821691161015611950576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611a93565b602082015115801590611a1d575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af11580156119f7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1b91906159c8565b155b15611a54576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611a93576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080611ac6575042826040015167ffffffffffffffff16115b15611afd576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151975050508080611ba3906159e1565b9150506117a7565b50611bb6868561587f565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115611c1f576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611c2b8285615a19565b611c3f9067ffffffffffffffff1688615a3a565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d861660008181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611d3557607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611d87333083607054611d489190615a4d565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190614822565b611d8f614904565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611df757600080fd5b505af1158015611e0b573d6000803e3d6000fd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611ea1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16611efd576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60006070546064611f619190615a4d565b905090565b606f5460ff1615611fa3576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581166000908152607260205260409020600101544292611ff09278010000000000000000000000000000000000000000000000009091048116911661587f565b67ffffffffffffffff161115612032576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e861203f8686615a19565b67ffffffffffffffff161115612081576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61208f868686868686613e11565b612098846149b5565b607954700100000000000000000000000000000000900467ffffffffffffffff166000036121e057607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092556000908152607560205260409020839055607954161561213b57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b1580156121c357600080fd5b505af11580156121d7573d6000803e3d6000fd5b505050506122b0565b6121e8614904565b6079805467ffffffffffffffff16906000612202836159a1565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487166000908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59669060200161100a565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461233f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c68565b6123cb614b95565b6123d56000614c16565b565b60335473ffffffffffffffffffffffffffffffffffffffff16331461253f576000612400612bed565b90508067ffffffffffffffff168267ffffffffffffffff161161244f576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000090910481169083161180612495575067ffffffffffffffff80831660009081526072602052604090206001015416155b156124cc576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff80831660009081526072602052604090206001015442916124fb9162093a80911661587f565b67ffffffffffffffff16111561253d576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6114b2614c8d565b607b5473ffffffffffffffffffffffffffffffffffffffff163314612598576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156126a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c691906159c8565b905060006126d2612bed565b60735467ffffffffffffffff68010000000000000000820481169161272a9170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416615a19565b612734919061587f565b61273e9190615a19565b67ffffffffffffffff1690508060000361275b5760009250505090565b6127658183615a93565b9250505090565b606f5460ff16156127a9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127b8878787878787876141d5565b67ffffffffffffffff84166000908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1612814614c8d565b50505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461286e576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156128b5576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661291c5760795467ffffffffffffffff70010000000000000000000000000000000090910481169082161061291c576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610c68565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146129ea576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff161115612a31576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001610c68565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612af0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c68565b600067ffffffff0000000167ffffffffffffffff8316108015612b9b575067ffffffff00000001604083901c67ffffffffffffffff16105b8015612bbc575067ffffffff00000001608083901c67ffffffffffffffff16105b8015612bd3575067ffffffff0000000160c083901c105b15612be057506001919050565b506000919050565b919050565b60795460009067ffffffffffffffff1615612c31575060795467ffffffffffffffff9081166000908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612c93576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6076612c9f8282615af5565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c6891906152bb565b600054610100900460ff1615808015612cef5750600054600160ff909116105b80612d095750303b158015612d09575060005460ff166001145b612d9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612df857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b612e056020880188615537565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612e5a6040880160208901615537565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055612ebf6080880160608901615537565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790556000805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076612f4a8682615af5565b506077612f578582615af5565b5062093a80612f6c6060890160408a01615458565b67ffffffffffffffff161115612fae576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fbe6060880160408901615458565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a8061302060a0890160808a01615458565b67ffffffffffffffff161115613062576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61307260a0880160808901615458565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613151614d15565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd660007f000000000000000000000000000000000000000000000000000000000000000085856040516131a79493929190615c58565b60405180910390a1801561281457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613277576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16156132b4576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036132f0576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561332c576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff78010000000000000000000000000000000000000000000000008204811691613377918491700100000000000000000000000000000000900416615c90565b11156133af576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000008204811660008181526072602052604081205491937001000000000000000000000000000000009004909216915b8481101561365957600087878381811061340f5761340f6158a7565b90506020028101906134219190615ca3565b61342a90615cd7565b905083613436816159a1565b825180516020918201208185015160408087015190519499509194506000936134989386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260719093529120549091508114613521576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260716020526040812055613546600189615a3a565b84036135b55742607b60149054906101000a900467ffffffffffffffff168460400151613573919061587f565b67ffffffffffffffff1611156135b5576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080613651906159e1565b9150506133f3565b50613664848461587f565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589166000818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461380d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561387557600080fd5b505af1158015613889573d6000803e3d6000fd5b505050506123d5614db5565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16156138f2576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff161561392f576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613939611f50565b905081811115613975576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113888311156139b1576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6139f373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084614822565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a8491906159c8565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16906018613abe836159a1565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051613af5929190615d53565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1660009081526071909352912055323303613c2557607354604080518381523360208201526060918101829052600091810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613c84565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613c7b9493929190615d63565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613cdc576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610c68565b613d65614b95565b73ffffffffffffffffffffffffffffffffffffffff8116613e08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401612d91565b6114b281614c16565b600080613e1c612bed565b905067ffffffffffffffff881615613eec5760795467ffffffffffffffff9081169089161115613e78576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089166000908152607860205260409020600281015481549094509091898116680100000000000000009092041614613ee6576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50613f8d565b67ffffffffffffffff8716600090815260756020526040902054915081613f3f576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115613f8d576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611613fda576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613fe98888888689610c73565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161401e9190615d99565b602060405180830381855afa15801561403b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061405e91906159c8565b6140689190615dab565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916140ea91899190600401615dbf565b602060405180830381865afa158015614107573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061412b9190615dfa565b614161576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6141c93361416f858b615a19565b67ffffffffffffffff16614181612613565b61418b9190615a4d565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190614e44565b50505050505050505050565b600067ffffffffffffffff8816156142a35760795467ffffffffffffffff9081169089161115614231576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff808816600090815260786020526040902060028101548154909288811668010000000000000000909204161461429d576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061433f565b5067ffffffffffffffff8516600090815260756020526040902054806142f5576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff908116908716111561433f576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff908116908816118061437157508767ffffffffffffffff168767ffffffffffffffff1611155b80614398575060795467ffffffffffffffff68010000000000000000909104811690881611155b156143cf576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff878116600090815260786020526040902054680100000000000000009004811690861614614432576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006144418787878588610c73565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516144769190615d99565b602060405180830381855afa158015614493573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906144b691906159c8565b6144c09190615dab565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161454291889190600401615dbf565b602060405180830381865afa15801561455f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145839190615dfa565b6145b9576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89166000908152607860205260409020600201548590036141c9576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff680100000000000000009091048116908216111580614649575060795467ffffffffffffffff908116908216115b15614680576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff818116600081815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b1580156147b257600080fd5b505af11580156147c6573d6000803e3d6000fd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161481591815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526148fe9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614e9f565b50505050565b60795467ffffffffffffffff6801000000000000000082048116911611156123d55760795460009061494d9068010000000000000000900467ffffffffffffffff16600161587f565b905061495881611228565b156114b25760795460009060029061497b90849067ffffffffffffffff16615a19565b6149859190615e1c565b61498f908361587f565b905061499a81611228565b156149ac576149a88161460f565b5050565b6149a88261460f565b60006149bf612bed565b9050816000806149cf8484615a19565b606f5467ffffffffffffffff91821692506000916149f39161010090041642615a3a565b90505b8467ffffffffffffffff168467ffffffffffffffff1614614a7e5767ffffffffffffffff80851660009081526072602052604090206001810154909116821015614a5c57600181015468010000000000000000900467ffffffffffffffff169450614a78565b614a668686615a19565b67ffffffffffffffff16935050614a7e565b506149f6565b6000614a8a8484615a3a565b905083811015614ae157808403600c8111614aa55780614aa8565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281614ad757614ad7615a64565b0460705550614b51565b838103600c8111614af25780614af5565b600c5b90506000816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a76400000281614b2c57614b2c615a64565b04905080607054670de0b6b3a76400000281614b4a57614b4a615a64565b0460705550505b683635c9adc5dea000006070541115614b7657683635c9adc5dea00000607055612814565b633b9aca00607054101561281457633b9aca0060705550505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146123d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612d91565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b158015614cf557600080fd5b505af1158015614d09573d6000803e3d6000fd5b505050506123d5614fab565b600054610100900460ff16614dac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401612d91565b6123d533614c16565b606f5460ff16614df1576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052614e9a9084907fa9059cbb000000000000000000000000000000000000000000000000000000009060640161487c565b505050565b6000614f01826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661503e9092919063ffffffff16565b805190915015614e9a5780806020019051810190614f1f9190615dfa565b614e9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401612d91565b606f5460ff1615614fe8576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b606061504d8484600085615055565b949350505050565b6060824710156150e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401612d91565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516151109190615d99565b60006040518083038185875af1925050503d806000811461514d576040519150601f19603f3d011682016040523d82523d6000602084013e615152565b606091505b50915091506151638783838761516e565b979650505050505050565b606083156152045782516000036151fd5773ffffffffffffffffffffffffffffffffffffffff85163b6151fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612d91565b508161504d565b61504d83838151156152195781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9191906152bb565b60005b83811015615268578181015183820152602001615250565b50506000910152565b6000815180845261528981602086016020860161524d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006152ce6020830184615271565b9392505050565b6000602082840312156152e757600080fd5b813561ffff811681146152ce57600080fd5b803567ffffffffffffffff81168114612be857600080fd5b600080600080600060a0868803121561532957600080fd5b615332866152f9565b9450615340602087016152f9565b94979496505050506040830135926060810135926080909101359150565b80610300810183101561537057600080fd5b92915050565b6000806000806000806103a0878903121561539057600080fd5b615399876152f9565b95506153a7602088016152f9565b94506153b5604088016152f9565b935060608701359250608087013591506153d28860a0890161535e565b90509295509295509295565b60008060008060008060006103c0888a0312156153fa57600080fd5b615403886152f9565b9650615411602089016152f9565b955061541f604089016152f9565b945061542d606089016152f9565b93506080880135925060a0880135915061544a8960c08a0161535e565b905092959891949750929550565b60006020828403121561546a57600080fd5b6152ce826152f9565b60008083601f84011261548557600080fd5b50813567ffffffffffffffff81111561549d57600080fd5b6020830191508360208260051b85010111156154b857600080fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612be857600080fd5b6000806000604084860312156154f857600080fd5b833567ffffffffffffffff81111561550f57600080fd5b61551b86828701615473565b909450925061552e9050602085016154bf565b90509250925092565b60006020828403121561554957600080fd5b6152ce826154bf565b60006020828403121561556457600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126155ab57600080fd5b813567ffffffffffffffff808211156155c6576155c661556b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561560c5761560c61556b565b8160405283815286602085880101111561562557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561565757600080fd5b813567ffffffffffffffff81111561566e57600080fd5b61504d8482850161559a565b60008083601f84011261568c57600080fd5b50813567ffffffffffffffff8111156156a457600080fd5b6020830191508360208285010111156154b857600080fd5b6000806000806000808688036101208112156156d757600080fd5b60a08112156156e557600080fd5b5086955060a0870135945060c087013567ffffffffffffffff8082111561570b57600080fd5b6157178a838b0161559a565b955060e089013591508082111561572d57600080fd5b6157398a838b0161559a565b945061010089013591508082111561575057600080fd5b5061575d89828a0161567a565b979a9699509497509295939492505050565b6000806020838503121561578257600080fd5b823567ffffffffffffffff81111561579957600080fd5b6157a585828601615473565b90969095509350505050565b6000806000604084860312156157c657600080fd5b833567ffffffffffffffff8111156157dd57600080fd5b6157e98682870161567a565b909790965060209590950135949350505050565b600181811c9082168061581157607f821691505b60208210810361584a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8181168382160190808211156158a0576158a0615850565b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261590a57600080fd5b9190910192915050565b60006080823603121561592657600080fd5b6040516080810167ffffffffffffffff828210818311171561594a5761594a61556b565b81604052843591508082111561595f57600080fd5b5061596c3682860161559a565b82525060208301356020820152615985604084016152f9565b6040820152615996606084016152f9565b606082015292915050565b600067ffffffffffffffff8083168181036159be576159be615850565b6001019392505050565b6000602082840312156159da57600080fd5b5051919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a1257615a12615850565b5060010190565b67ffffffffffffffff8281168282160390808211156158a0576158a0615850565b8181038181111561537057615370615850565b808202811582820484141761537057615370615850565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615aa257615aa2615a64565b500490565b601f821115614e9a57600081815260208120601f850160051c81016020861015615ace5750805b601f850160051c820191505b81811015615aed57828155600101615ada565b505050505050565b815167ffffffffffffffff811115615b0f57615b0f61556b565b615b2381615b1d84546157fd565b84615aa7565b602080601f831160018114615b765760008415615b405750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555615aed565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615bc357888601518255948401946001909101908401615ba4565b5085821015615bff57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600067ffffffffffffffff808716835280861660208401525060606040830152615c86606083018486615c0f565b9695505050505050565b8082018082111561537057615370615850565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261590a57600080fd5b600060608236031215615ce957600080fd5b6040516060810167ffffffffffffffff8282108183111715615d0d57615d0d61556b565b816040528435915080821115615d2257600080fd5b50615d2f3682860161559a565b82525060208301356020820152615d48604084016152f9565b604082015292915050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000615c86606083018486615c0f565b6000825161590a81846020870161524d565b600082615dba57615dba615a64565b500690565b61032081016103008085843782018360005b6001811015615df0578151835260209283019290910190600101615dd1565b5050509392505050565b600060208284031215615e0c57600080fd5b815180151581146152ce57600080fd5b600067ffffffffffffffff80841680615e3757615e37615a64565b9216919091049291505056fea26469706673582212207c65fe318a797352428af5d61503d4af269ad89de3f139b6d4f4cab38b830bc864736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106103ba5760003560e01c8063841b24d7116101f4578063c754c7ed1161011a578063e7a7ed02116100ad578063f14916d61161007c578063f14916d614610a7e578063f2fde38b14610a91578063f851a44014610aa4578063f8b823e414610ac457600080fd5b8063e7a7ed02146109e7578063e8bf92ed14610a17578063eaeb077b14610a3e578063ed6b010414610a5157600080fd5b8063d2e129f9116100e9578063d2e129f914610991578063d8d1091b146109a4578063d939b315146109b7578063dbc16976146109df57600080fd5b8063c754c7ed146108fc578063c89e42df14610928578063cfa8ed471461093b578063d02103ca1461096a57600080fd5b8063a3c573eb11610192578063b4d63f5811610161578063b4d63f5814610853578063b6b0b097146108ba578063ba58ae39146108e1578063c0ed84e0146108f457600080fd5b8063a3c573eb146107c4578063ada8f919146107eb578063adc879e9146107fe578063afd23cbe1461082557600080fd5b806399f5634e116101ce57806399f5634e146107835780639aa972a31461078b5780639c9f3dfe1461079e578063a066215c146107b157600080fd5b8063841b24d71461072d5780638c3d73011461075d5780638da5cb5b1461076557600080fd5b80634a1a89a7116102e4578063621dd411116102775780637215541a116102465780637215541a1461066a5780637fcb36531461067d578063831c7ead14610691578063837a4738146106b857600080fd5b8063621dd4111461061c5780636b8616ce1461062f5780636ff512cc1461064f578063715018a61461066257600080fd5b8063542028d5116102b3578063542028d5146105f15780635e9145c9146105f95780635ec919581461060c578063604691691461061457600080fd5b80634a1a89a71461057d5780634a910e6a1461059d5780634e487706146105b05780635392c5e0146105c357600080fd5b8063298789831161035c578063394218e91161032b578063394218e91461050e578063423fa856146105215780634560526714610541578063458c04771461056957600080fd5b806329878983146104a95780632b0006fa146104d55780632c1f816a146104e8578063383b3be8146104fb57600080fd5b80631816b7e5116103985780631816b7e51461042857806319d8ac611461043d578063220d789914610451578063267822471461046457600080fd5b80630a0d9fbe146103bf578063107bf28c146103f657806315064c961461040b575b600080fd5b606f546103d890610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6103fe610acd565b6040516103ed91906152bb565b606f546104189060ff1681565b60405190151581526020016103ed565b61043b6104363660046152d5565b610b5b565b005b6073546103d89067ffffffffffffffff1681565b6103fe61045f366004615311565b610c73565b607b546104849073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103ed565b6074546104849068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61043b6104e3366004615376565b610e4a565b61043b6104f63660046153de565b61101a565b610418610509366004615458565b611228565b61043b61051c366004615458565b61127e565b6073546103d89068010000000000000000900467ffffffffffffffff1681565b6073546103d890700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546103d89067ffffffffffffffff1681565b6079546103d89068010000000000000000900467ffffffffffffffff1681565b61043b6105ab366004615458565b611402565b61043b6105be366004615458565b6114b5565b6105e36105d1366004615458565b60756020526000908152604090205481565b6040519081526020016103ed565b6103fe611639565b61043b6106073660046154e3565b611646565b61043b611e50565b6105e3611f50565b61043b61062a366004615376565b611f66565b6105e361063d366004615458565b60716020526000908152604090205481565b61043b61065d366004615537565b6122ee565b61043b6123c3565b61043b610678366004615458565b6123d7565b6074546103d89067ffffffffffffffff1681565b6103d87f000000000000000000000000000000000000000000000000000000000000000081565b6107016106c6366004615552565b60786020526000908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016103ed565b6079546103d8907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61043b612547565b60335473ffffffffffffffffffffffffffffffffffffffff16610484565b6105e3612613565b61043b6107993660046153de565b61276c565b61043b6107ac366004615458565b61281d565b61043b6107bf366004615458565b612999565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b61043b6107f9366004615537565b612a9f565b6103d87f000000000000000000000000000000000000000000000000000000000000000081565b606f54610840906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103ed565b610894610861366004615458565b6072602052600090815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016103ed565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b6104186108ef366004615552565b612b63565b6103d8612bed565b607b546103d89074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b61043b610936366004615645565b612c42565b606f54610484906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b61043b61099f3660046156bc565b612ccf565b61043b6109b236600461576f565b61321a565b6079546103d890700100000000000000000000000000000000900467ffffffffffffffff1681565b61043b6137bc565b6073546103d8907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b61043b610a4c3660046157b1565b613895565b607b54610418907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b61043b610a8c366004615537565b613c8b565b61043b610a9f366004615537565b613d5d565b607a546104849073ffffffffffffffffffffffffffffffffffffffff1681565b6105e360705481565b60778054610ada906157fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610b06906157fd565b8015610b535780601f10610b2857610100808354040283529160200191610b53565b820191906000526020600020905b815481529060010190602001808311610b3657829003601f168201915b505050505081565b607a5473ffffffffffffffffffffffffffffffffffffffff163314610bac576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff161080610bc557506103ff8161ffff16115b15610bfc576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086166000818152607260205260408082205493881682529020546060929115801590610ca7575081155b15610cde576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610d15576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d1e84612b63565b610d54576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610ea7576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610eb5868686868686613e11565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615610f3057607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015610fb857600080fd5b505af1158015610fcc573d6000803e3d6000fd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611077576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611086878787878787876141d5565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092556000908152607560205260409020839055607954161561110157607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b15801561118957600080fd5b505af115801561119d573d6000803e3d6000fd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281166000908152607860205260408120549092429261126c927001000000000000000000000000000000009092048116911661587f565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146112cf576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611316576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166113855760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611385576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610c68565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146114a957606f5460ff161561146a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61147381611228565b6114a9576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114b28161460f565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611506576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561154d576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166115b857607b5467ffffffffffffffff740100000000000000000000000000000000000000009091048116908216106115b8576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001610c68565b60768054610ada906157fd565b606f5460ff1615611683576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146116e3576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600081900361171f576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561175b576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000082048116600081815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b86811015611bab5760008a8a838181106117c3576117c36158a7565b90506020028101906117d591906158d6565b6117de90615914565b8051805160209091012060608201519192509067ffffffffffffffff1615611956578561180a816159a1565b9650506000818360200151846060015160405160200161186293929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a166000908152607190935291205490915081146118eb576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088166000908152607160205260408082209190915560608501519085015190821691161015611950576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611a93565b602082015115801590611a1d575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af11580156119f7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1b91906159c8565b155b15611a54576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611a93576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080611ac6575042826040015167ffffffffffffffff16115b15611afd576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151975050508080611ba3906159e1565b9150506117a7565b50611bb6868561587f565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115611c1f576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611c2b8285615a19565b611c3f9067ffffffffffffffff1688615a3a565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d861660008181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611d3557607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611d87333083607054611d489190615a4d565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190614822565b611d8f614904565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611df757600080fd5b505af1158015611e0b573d6000803e3d6000fd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611ea1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16611efd576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60006070546064611f619190615a4d565b905090565b606f5460ff1615611fa3576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581166000908152607260205260409020600101544292611ff09278010000000000000000000000000000000000000000000000009091048116911661587f565b67ffffffffffffffff161115612032576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e861203f8686615a19565b67ffffffffffffffff161115612081576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61208f868686868686613e11565b612098846149b5565b607954700100000000000000000000000000000000900467ffffffffffffffff166000036121e057607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092556000908152607560205260409020839055607954161561213b57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b1580156121c357600080fd5b505af11580156121d7573d6000803e3d6000fd5b505050506122b0565b6121e8614904565b6079805467ffffffffffffffff16906000612202836159a1565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487166000908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59669060200161100a565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461233f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c68565b6123cb614b95565b6123d56000614c16565b565b60335473ffffffffffffffffffffffffffffffffffffffff16331461253f576000612400612bed565b90508067ffffffffffffffff168267ffffffffffffffff161161244f576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000090910481169083161180612495575067ffffffffffffffff80831660009081526072602052604090206001015416155b156124cc576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff80831660009081526072602052604090206001015442916124fb9162093a80911661587f565b67ffffffffffffffff16111561253d576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6114b2614c8d565b607b5473ffffffffffffffffffffffffffffffffffffffff163314612598576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156126a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c691906159c8565b905060006126d2612bed565b60735467ffffffffffffffff68010000000000000000820481169161272a9170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416615a19565b612734919061587f565b61273e9190615a19565b67ffffffffffffffff1690508060000361275b5760009250505090565b6127658183615a93565b9250505090565b606f5460ff16156127a9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127b8878787878787876141d5565b67ffffffffffffffff84166000908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1612814614c8d565b50505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461286e576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156128b5576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661291c5760795467ffffffffffffffff70010000000000000000000000000000000090910481169082161061291c576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610c68565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146129ea576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff161115612a31576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001610c68565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612af0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c68565b600067ffffffff0000000167ffffffffffffffff8316108015612b9b575067ffffffff00000001604083901c67ffffffffffffffff16105b8015612bbc575067ffffffff00000001608083901c67ffffffffffffffff16105b8015612bd3575067ffffffff0000000160c083901c105b15612be057506001919050565b506000919050565b919050565b60795460009067ffffffffffffffff1615612c31575060795467ffffffffffffffff9081166000908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612c93576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6076612c9f8282615af5565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c6891906152bb565b600054610100900460ff1615808015612cef5750600054600160ff909116105b80612d095750303b158015612d09575060005460ff166001145b612d9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612df857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b612e056020880188615537565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612e5a6040880160208901615537565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055612ebf6080880160608901615537565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790556000805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076612f4a8682615af5565b506077612f578582615af5565b5062093a80612f6c6060890160408a01615458565b67ffffffffffffffff161115612fae576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fbe6060880160408901615458565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a8061302060a0890160808a01615458565b67ffffffffffffffff161115613062576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61307260a0880160808901615458565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613151614d15565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd660007f000000000000000000000000000000000000000000000000000000000000000085856040516131a79493929190615c58565b60405180910390a1801561281457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613277576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16156132b4576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036132f0576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561332c576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff78010000000000000000000000000000000000000000000000008204811691613377918491700100000000000000000000000000000000900416615c90565b11156133af576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000008204811660008181526072602052604081205491937001000000000000000000000000000000009004909216915b8481101561365957600087878381811061340f5761340f6158a7565b90506020028101906134219190615ca3565b61342a90615cd7565b905083613436816159a1565b825180516020918201208185015160408087015190519499509194506000936134989386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260719093529120549091508114613521576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260716020526040812055613546600189615a3a565b84036135b55742607b60149054906101000a900467ffffffffffffffff168460400151613573919061587f565b67ffffffffffffffff1611156135b5576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080613651906159e1565b9150506133f3565b50613664848461587f565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589166000818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461380d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561387557600080fd5b505af1158015613889573d6000803e3d6000fd5b505050506123d5614db5565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16156138f2576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff161561392f576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613939611f50565b905081811115613975576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113888311156139b1576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6139f373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084614822565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a8491906159c8565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16906018613abe836159a1565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051613af5929190615d53565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1660009081526071909352912055323303613c2557607354604080518381523360208201526060918101829052600091810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613c84565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613c7b9493929190615d63565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613cdc576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610c68565b613d65614b95565b73ffffffffffffffffffffffffffffffffffffffff8116613e08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401612d91565b6114b281614c16565b600080613e1c612bed565b905067ffffffffffffffff881615613eec5760795467ffffffffffffffff9081169089161115613e78576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089166000908152607860205260409020600281015481549094509091898116680100000000000000009092041614613ee6576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50613f8d565b67ffffffffffffffff8716600090815260756020526040902054915081613f3f576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115613f8d576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611613fda576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613fe98888888689610c73565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161401e9190615d99565b602060405180830381855afa15801561403b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061405e91906159c8565b6140689190615dab565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916140ea91899190600401615dbf565b602060405180830381865afa158015614107573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061412b9190615dfa565b614161576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6141c93361416f858b615a19565b67ffffffffffffffff16614181612613565b61418b9190615a4d565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190614e44565b50505050505050505050565b600067ffffffffffffffff8816156142a35760795467ffffffffffffffff9081169089161115614231576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff808816600090815260786020526040902060028101548154909288811668010000000000000000909204161461429d576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061433f565b5067ffffffffffffffff8516600090815260756020526040902054806142f5576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff908116908716111561433f576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff908116908816118061437157508767ffffffffffffffff168767ffffffffffffffff1611155b80614398575060795467ffffffffffffffff68010000000000000000909104811690881611155b156143cf576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff878116600090815260786020526040902054680100000000000000009004811690861614614432576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006144418787878588610c73565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516144769190615d99565b602060405180830381855afa158015614493573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906144b691906159c8565b6144c09190615dab565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161454291889190600401615dbf565b602060405180830381865afa15801561455f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145839190615dfa565b6145b9576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89166000908152607860205260409020600201548590036141c9576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff680100000000000000009091048116908216111580614649575060795467ffffffffffffffff908116908216115b15614680576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff818116600081815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b1580156147b257600080fd5b505af11580156147c6573d6000803e3d6000fd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161481591815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526148fe9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614e9f565b50505050565b60795467ffffffffffffffff6801000000000000000082048116911611156123d55760795460009061494d9068010000000000000000900467ffffffffffffffff16600161587f565b905061495881611228565b156114b25760795460009060029061497b90849067ffffffffffffffff16615a19565b6149859190615e1c565b61498f908361587f565b905061499a81611228565b156149ac576149a88161460f565b5050565b6149a88261460f565b60006149bf612bed565b9050816000806149cf8484615a19565b606f5467ffffffffffffffff91821692506000916149f39161010090041642615a3a565b90505b8467ffffffffffffffff168467ffffffffffffffff1614614a7e5767ffffffffffffffff80851660009081526072602052604090206001810154909116821015614a5c57600181015468010000000000000000900467ffffffffffffffff169450614a78565b614a668686615a19565b67ffffffffffffffff16935050614a7e565b506149f6565b6000614a8a8484615a3a565b905083811015614ae157808403600c8111614aa55780614aa8565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281614ad757614ad7615a64565b0460705550614b51565b838103600c8111614af25780614af5565b600c5b90506000816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a76400000281614b2c57614b2c615a64565b04905080607054670de0b6b3a76400000281614b4a57614b4a615a64565b0460705550505b683635c9adc5dea000006070541115614b7657683635c9adc5dea00000607055612814565b633b9aca00607054101561281457633b9aca0060705550505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146123d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612d91565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b158015614cf557600080fd5b505af1158015614d09573d6000803e3d6000fd5b505050506123d5614fab565b600054610100900460ff16614dac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401612d91565b6123d533614c16565b606f5460ff16614df1576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052614e9a9084907fa9059cbb000000000000000000000000000000000000000000000000000000009060640161487c565b505050565b6000614f01826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661503e9092919063ffffffff16565b805190915015614e9a5780806020019051810190614f1f9190615dfa565b614e9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401612d91565b606f5460ff1615614fe8576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b606061504d8484600085615055565b949350505050565b6060824710156150e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401612d91565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516151109190615d99565b60006040518083038185875af1925050503d806000811461514d576040519150601f19603f3d011682016040523d82523d6000602084013e615152565b606091505b50915091506151638783838761516e565b979650505050505050565b606083156152045782516000036151fd5773ffffffffffffffffffffffffffffffffffffffff85163b6151fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612d91565b508161504d565b61504d83838151156152195781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9191906152bb565b60005b83811015615268578181015183820152602001615250565b50506000910152565b6000815180845261528981602086016020860161524d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006152ce6020830184615271565b9392505050565b6000602082840312156152e757600080fd5b813561ffff811681146152ce57600080fd5b803567ffffffffffffffff81168114612be857600080fd5b600080600080600060a0868803121561532957600080fd5b615332866152f9565b9450615340602087016152f9565b94979496505050506040830135926060810135926080909101359150565b80610300810183101561537057600080fd5b92915050565b6000806000806000806103a0878903121561539057600080fd5b615399876152f9565b95506153a7602088016152f9565b94506153b5604088016152f9565b935060608701359250608087013591506153d28860a0890161535e565b90509295509295509295565b60008060008060008060006103c0888a0312156153fa57600080fd5b615403886152f9565b9650615411602089016152f9565b955061541f604089016152f9565b945061542d606089016152f9565b93506080880135925060a0880135915061544a8960c08a0161535e565b905092959891949750929550565b60006020828403121561546a57600080fd5b6152ce826152f9565b60008083601f84011261548557600080fd5b50813567ffffffffffffffff81111561549d57600080fd5b6020830191508360208260051b85010111156154b857600080fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612be857600080fd5b6000806000604084860312156154f857600080fd5b833567ffffffffffffffff81111561550f57600080fd5b61551b86828701615473565b909450925061552e9050602085016154bf565b90509250925092565b60006020828403121561554957600080fd5b6152ce826154bf565b60006020828403121561556457600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126155ab57600080fd5b813567ffffffffffffffff808211156155c6576155c661556b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561560c5761560c61556b565b8160405283815286602085880101111561562557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561565757600080fd5b813567ffffffffffffffff81111561566e57600080fd5b61504d8482850161559a565b60008083601f84011261568c57600080fd5b50813567ffffffffffffffff8111156156a457600080fd5b6020830191508360208285010111156154b857600080fd5b6000806000806000808688036101208112156156d757600080fd5b60a08112156156e557600080fd5b5086955060a0870135945060c087013567ffffffffffffffff8082111561570b57600080fd5b6157178a838b0161559a565b955060e089013591508082111561572d57600080fd5b6157398a838b0161559a565b945061010089013591508082111561575057600080fd5b5061575d89828a0161567a565b979a9699509497509295939492505050565b6000806020838503121561578257600080fd5b823567ffffffffffffffff81111561579957600080fd5b6157a585828601615473565b90969095509350505050565b6000806000604084860312156157c657600080fd5b833567ffffffffffffffff8111156157dd57600080fd5b6157e98682870161567a565b909790965060209590950135949350505050565b600181811c9082168061581157607f821691505b60208210810361584a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8181168382160190808211156158a0576158a0615850565b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261590a57600080fd5b9190910192915050565b60006080823603121561592657600080fd5b6040516080810167ffffffffffffffff828210818311171561594a5761594a61556b565b81604052843591508082111561595f57600080fd5b5061596c3682860161559a565b82525060208301356020820152615985604084016152f9565b6040820152615996606084016152f9565b606082015292915050565b600067ffffffffffffffff8083168181036159be576159be615850565b6001019392505050565b6000602082840312156159da57600080fd5b5051919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a1257615a12615850565b5060010190565b67ffffffffffffffff8281168282160390808211156158a0576158a0615850565b8181038181111561537057615370615850565b808202811582820484141761537057615370615850565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615aa257615aa2615a64565b500490565b601f821115614e9a57600081815260208120601f850160051c81016020861015615ace5750805b601f850160051c820191505b81811015615aed57828155600101615ada565b505050505050565b815167ffffffffffffffff811115615b0f57615b0f61556b565b615b2381615b1d84546157fd565b84615aa7565b602080601f831160018114615b765760008415615b405750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555615aed565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615bc357888601518255948401946001909101908401615ba4565b5085821015615bff57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600067ffffffffffffffff808716835280861660208401525060606040830152615c86606083018486615c0f565b9695505050505050565b8082018082111561537057615370615850565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261590a57600080fd5b600060608236031215615ce957600080fd5b6040516060810167ffffffffffffffff8282108183111715615d0d57615d0d61556b565b816040528435915080821115615d2257600080fd5b50615d2f3682860161559a565b82525060208301356020820152615d48604084016152f9565b604082015292915050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000615c86606083018486615c0f565b6000825161590a81846020870161524d565b600082615dba57615dba615a64565b500690565b61032081016103008085843782018360005b6001811015615df0578151835260209283019290910190600101615dd1565b5050509392505050565b600060208284031215615e0c57600080fd5b815180151581146152ce57600080fd5b600067ffffffffffffffff80841680615e3757615e37615a64565b9216919091049291505056fea26469706673582212207c65fe318a797352428af5d61503d4af269ad89de3f139b6d4f4cab38b830bc864736f6c63430008140033", + "bytecode": "0x6101406040523480156200001257600080fd5b5060405162006078380380620060788339810160408190526200003591620000a5565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b0391821661010052166101205262000131565b6001600160a01b03811681146200008557600080fd5b50565b80516001600160401b0381168114620000a057600080fd5b919050565b60008060008060008060c08789031215620000bf57600080fd5b8651620000cc816200006f565b6020880151909650620000df816200006f565b6040880151909550620000f2816200006f565b606088015190945062000105816200006f565b9250620001156080880162000088565b91506200012560a0880162000088565b90509295509295509295565b60805160a05160c05160e0516101005161012051615e79620001ff6000396000818161069601528181610dec01526131760152600081816108030152610dc20152600081816107c901528181611d910152818161380f0152614c8f01526000818161096f01528181610f5f01528181611130015281816119990152818161216a015281816139f70152614759015260008181610a1c015281816140b4015261450c0152600081816108bf01528181611d5f0152818161265b015281816139cb01526141a20152615e796000f3fe608060405234801561001057600080fd5b50600436106103ba5760003560e01c8063841b24d7116101f4578063c754c7ed1161011a578063e7a7ed02116100ad578063f14916d61161007c578063f14916d614610a7e578063f2fde38b14610a91578063f851a44014610aa4578063f8b823e414610ac457600080fd5b8063e7a7ed02146109e7578063e8bf92ed14610a17578063eaeb077b14610a3e578063ed6b010414610a5157600080fd5b8063d2e129f9116100e9578063d2e129f914610991578063d8d1091b146109a4578063d939b315146109b7578063dbc16976146109df57600080fd5b8063c754c7ed146108fc578063c89e42df14610928578063cfa8ed471461093b578063d02103ca1461096a57600080fd5b8063a3c573eb11610192578063b4d63f5811610161578063b4d63f5814610853578063b6b0b097146108ba578063ba58ae39146108e1578063c0ed84e0146108f457600080fd5b8063a3c573eb146107c4578063ada8f919146107eb578063adc879e9146107fe578063afd23cbe1461082557600080fd5b806399f5634e116101ce57806399f5634e146107835780639aa972a31461078b5780639c9f3dfe1461079e578063a066215c146107b157600080fd5b8063841b24d71461072d5780638c3d73011461075d5780638da5cb5b1461076557600080fd5b80634a1a89a7116102e4578063621dd411116102775780637215541a116102465780637215541a1461066a5780637fcb36531461067d578063831c7ead14610691578063837a4738146106b857600080fd5b8063621dd4111461061c5780636b8616ce1461062f5780636ff512cc1461064f578063715018a61461066257600080fd5b8063542028d5116102b3578063542028d5146105f15780635e9145c9146105f95780635ec919581461060c578063604691691461061457600080fd5b80634a1a89a71461057d5780634a910e6a1461059d5780634e487706146105b05780635392c5e0146105c357600080fd5b8063298789831161035c578063394218e91161032b578063394218e91461050e578063423fa856146105215780634560526714610541578063458c04771461056957600080fd5b806329878983146104a95780632b0006fa146104d55780632c1f816a146104e8578063383b3be8146104fb57600080fd5b80631816b7e5116103985780631816b7e51461042857806319d8ac611461043d578063220d789914610451578063267822471461046457600080fd5b80630a0d9fbe146103bf578063107bf28c146103f657806315064c961461040b575b600080fd5b606f546103d890610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6103fe610acd565b6040516103ed91906152bb565b606f546104189060ff1681565b60405190151581526020016103ed565b61043b6104363660046152d5565b610b5b565b005b6073546103d89067ffffffffffffffff1681565b6103fe61045f366004615311565b610c73565b607b546104849073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103ed565b6074546104849068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61043b6104e3366004615376565b610e4a565b61043b6104f63660046153de565b61101a565b610418610509366004615458565b611228565b61043b61051c366004615458565b61127e565b6073546103d89068010000000000000000900467ffffffffffffffff1681565b6073546103d890700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546103d89067ffffffffffffffff1681565b6079546103d89068010000000000000000900467ffffffffffffffff1681565b61043b6105ab366004615458565b611402565b61043b6105be366004615458565b6114b5565b6105e36105d1366004615458565b60756020526000908152604090205481565b6040519081526020016103ed565b6103fe611639565b61043b6106073660046154e3565b611646565b61043b611e50565b6105e3611f50565b61043b61062a366004615376565b611f66565b6105e361063d366004615458565b60716020526000908152604090205481565b61043b61065d366004615537565b6122ee565b61043b6123c3565b61043b610678366004615458565b6123d7565b6074546103d89067ffffffffffffffff1681565b6103d87f000000000000000000000000000000000000000000000000000000000000000081565b6107016106c6366004615552565b60786020526000908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016103ed565b6079546103d8907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61043b612547565b60335473ffffffffffffffffffffffffffffffffffffffff16610484565b6105e3612613565b61043b6107993660046153de565b61276c565b61043b6107ac366004615458565b61281d565b61043b6107bf366004615458565b612999565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b61043b6107f9366004615537565b612a9f565b6103d87f000000000000000000000000000000000000000000000000000000000000000081565b606f54610840906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103ed565b610894610861366004615458565b6072602052600090815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016103ed565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b6104186108ef366004615552565b612b63565b6103d8612bed565b607b546103d89074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b61043b610936366004615645565b612c42565b606f54610484906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b61043b61099f3660046156bc565b612ccf565b61043b6109b236600461576f565b61321a565b6079546103d890700100000000000000000000000000000000900467ffffffffffffffff1681565b61043b6137bc565b6073546103d8907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b61043b610a4c3660046157b1565b613895565b607b54610418907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b61043b610a8c366004615537565b613c8b565b61043b610a9f366004615537565b613d5d565b607a546104849073ffffffffffffffffffffffffffffffffffffffff1681565b6105e360705481565b60778054610ada906157fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610b06906157fd565b8015610b535780601f10610b2857610100808354040283529160200191610b53565b820191906000526020600020905b815481529060010190602001808311610b3657829003601f168201915b505050505081565b607a5473ffffffffffffffffffffffffffffffffffffffff163314610bac576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff161080610bc557506103ff8161ffff16115b15610bfc576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086166000818152607260205260408082205493881682529020546060929115801590610ca7575081155b15610cde576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610d15576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d1e84612b63565b610d54576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610ea7576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610eb5868686868686613e11565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615610f3057607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015610fb857600080fd5b505af1158015610fcc573d6000803e3d6000fd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611077576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611086878787878787876141d5565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092556000908152607560205260409020839055607954161561110157607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b15801561118957600080fd5b505af115801561119d573d6000803e3d6000fd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281166000908152607860205260408120549092429261126c927001000000000000000000000000000000009092048116911661587f565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146112cf576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611316576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166113855760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611385576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610c68565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146114a957606f5460ff161561146a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61147381611228565b6114a9576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114b28161460f565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611506576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561154d576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166115b857607b5467ffffffffffffffff740100000000000000000000000000000000000000009091048116908216106115b8576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001610c68565b60768054610ada906157fd565b606f5460ff1615611683576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146116e3576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600081900361171f576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561175b576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000082048116600081815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b86811015611bab5760008a8a838181106117c3576117c36158a7565b90506020028101906117d591906158d6565b6117de90615914565b8051805160209091012060608201519192509067ffffffffffffffff1615611956578561180a816159a1565b9650506000818360200151846060015160405160200161186293929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a166000908152607190935291205490915081146118eb576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088166000908152607160205260408082209190915560608501519085015190821691161015611950576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611a93565b602082015115801590611a1d575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af11580156119f7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1b91906159c8565b155b15611a54576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611a93576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080611ac6575042826040015167ffffffffffffffff16115b15611afd576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151975050508080611ba3906159e1565b9150506117a7565b50611bb6868561587f565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115611c1f576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611c2b8285615a19565b611c3f9067ffffffffffffffff1688615a3a565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d861660008181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611d3557607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611d87333083607054611d489190615a4d565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190614822565b611d8f614904565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611df757600080fd5b505af1158015611e0b573d6000803e3d6000fd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611ea1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16611efd576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60006070546064611f619190615a4d565b905090565b606f5460ff1615611fa3576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581166000908152607260205260409020600101544292611ff09278010000000000000000000000000000000000000000000000009091048116911661587f565b67ffffffffffffffff161115612032576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e861203f8686615a19565b67ffffffffffffffff161115612081576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61208f868686868686613e11565b612098846149b5565b607954700100000000000000000000000000000000900467ffffffffffffffff166000036121e057607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092556000908152607560205260409020839055607954161561213b57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b1580156121c357600080fd5b505af11580156121d7573d6000803e3d6000fd5b505050506122b0565b6121e8614904565b6079805467ffffffffffffffff16906000612202836159a1565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487166000908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59669060200161100a565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461233f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c68565b6123cb614b95565b6123d56000614c16565b565b60335473ffffffffffffffffffffffffffffffffffffffff16331461253f576000612400612bed565b90508067ffffffffffffffff168267ffffffffffffffff161161244f576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000090910481169083161180612495575067ffffffffffffffff80831660009081526072602052604090206001015416155b156124cc576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff80831660009081526072602052604090206001015442916124fb9162093a80911661587f565b67ffffffffffffffff16111561253d576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6114b2614c8d565b607b5473ffffffffffffffffffffffffffffffffffffffff163314612598576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156126a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c691906159c8565b905060006126d2612bed565b60735467ffffffffffffffff68010000000000000000820481169161272a9170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416615a19565b612734919061587f565b61273e9190615a19565b67ffffffffffffffff1690508060000361275b5760009250505090565b6127658183615a93565b9250505090565b606f5460ff16156127a9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127b8878787878787876141d5565b67ffffffffffffffff84166000908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1612814614c8d565b50505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461286e576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156128b5576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661291c5760795467ffffffffffffffff70010000000000000000000000000000000090910481169082161061291c576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610c68565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146129ea576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff161115612a31576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001610c68565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612af0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c68565b600067ffffffff0000000167ffffffffffffffff8316108015612b9b575067ffffffff00000001604083901c67ffffffffffffffff16105b8015612bbc575067ffffffff00000001608083901c67ffffffffffffffff16105b8015612bd3575067ffffffff0000000160c083901c105b15612be057506001919050565b506000919050565b919050565b60795460009067ffffffffffffffff1615612c31575060795467ffffffffffffffff9081166000908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612c93576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6076612c9f8282615af5565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c6891906152bb565b600054610100900460ff1615808015612cef5750600054600160ff909116105b80612d095750303b158015612d09575060005460ff166001145b612d9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612df857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b612e056020880188615537565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612e5a6040880160208901615537565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055612ebf6080880160608901615537565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790556000805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076612f4a8682615af5565b506077612f578582615af5565b5062093a80612f6c6060890160408a01615458565b67ffffffffffffffff161115612fae576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fbe6060880160408901615458565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a8061302060a0890160808a01615458565b67ffffffffffffffff161115613062576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61307260a0880160808901615458565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613151614d15565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd660007f000000000000000000000000000000000000000000000000000000000000000085856040516131a79493929190615c58565b60405180910390a1801561281457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613277576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16156132b4576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036132f0576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561332c576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff78010000000000000000000000000000000000000000000000008204811691613377918491700100000000000000000000000000000000900416615c90565b11156133af576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000008204811660008181526072602052604081205491937001000000000000000000000000000000009004909216915b8481101561365957600087878381811061340f5761340f6158a7565b90506020028101906134219190615ca3565b61342a90615cd7565b905083613436816159a1565b825180516020918201208185015160408087015190519499509194506000936134989386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260719093529120549091508114613521576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260716020526040812055613546600189615a3a565b84036135b55742607b60149054906101000a900467ffffffffffffffff168460400151613573919061587f565b67ffffffffffffffff1611156135b5576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080613651906159e1565b9150506133f3565b50613664848461587f565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589166000818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461380d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561387557600080fd5b505af1158015613889573d6000803e3d6000fd5b505050506123d5614db5565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16156138f2576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff161561392f576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613939611f50565b905081811115613975576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113888311156139b1576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6139f373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084614822565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a8491906159c8565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16906018613abe836159a1565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051613af5929190615d53565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1660009081526071909352912055323303613c2557607354604080518381523360208201526060918101829052600091810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613c84565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613c7b9493929190615d63565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613cdc576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610c68565b613d65614b95565b73ffffffffffffffffffffffffffffffffffffffff8116613e08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401612d91565b6114b281614c16565b600080613e1c612bed565b905067ffffffffffffffff881615613eec5760795467ffffffffffffffff9081169089161115613e78576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089166000908152607860205260409020600281015481549094509091898116680100000000000000009092041614613ee6576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50613f8d565b67ffffffffffffffff8716600090815260756020526040902054915081613f3f576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115613f8d576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611613fda576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613fe98888888689610c73565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161401e9190615d99565b602060405180830381855afa15801561403b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061405e91906159c8565b6140689190615dab565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916140ea91899190600401615dbf565b602060405180830381865afa158015614107573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061412b9190615dfa565b614161576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6141c93361416f858b615a19565b67ffffffffffffffff16614181612613565b61418b9190615a4d565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190614e44565b50505050505050505050565b600067ffffffffffffffff8816156142a35760795467ffffffffffffffff9081169089161115614231576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff808816600090815260786020526040902060028101548154909288811668010000000000000000909204161461429d576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061433f565b5067ffffffffffffffff8516600090815260756020526040902054806142f5576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff908116908716111561433f576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff908116908816118061437157508767ffffffffffffffff168767ffffffffffffffff1611155b80614398575060795467ffffffffffffffff68010000000000000000909104811690881611155b156143cf576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff878116600090815260786020526040902054680100000000000000009004811690861614614432576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006144418787878588610c73565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516144769190615d99565b602060405180830381855afa158015614493573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906144b691906159c8565b6144c09190615dab565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161454291889190600401615dbf565b602060405180830381865afa15801561455f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145839190615dfa565b6145b9576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89166000908152607860205260409020600201548590036141c9576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff680100000000000000009091048116908216111580614649575060795467ffffffffffffffff908116908216115b15614680576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff818116600081815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b1580156147b257600080fd5b505af11580156147c6573d6000803e3d6000fd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161481591815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526148fe9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614e9f565b50505050565b60795467ffffffffffffffff6801000000000000000082048116911611156123d55760795460009061494d9068010000000000000000900467ffffffffffffffff16600161587f565b905061495881611228565b156114b25760795460009060029061497b90849067ffffffffffffffff16615a19565b6149859190615e1c565b61498f908361587f565b905061499a81611228565b156149ac576149a88161460f565b5050565b6149a88261460f565b60006149bf612bed565b9050816000806149cf8484615a19565b606f5467ffffffffffffffff91821692506000916149f39161010090041642615a3a565b90505b8467ffffffffffffffff168467ffffffffffffffff1614614a7e5767ffffffffffffffff80851660009081526072602052604090206001810154909116821015614a5c57600181015468010000000000000000900467ffffffffffffffff169450614a78565b614a668686615a19565b67ffffffffffffffff16935050614a7e565b506149f6565b6000614a8a8484615a3a565b905083811015614ae157808403600c8111614aa55780614aa8565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281614ad757614ad7615a64565b0460705550614b51565b838103600c8111614af25780614af5565b600c5b90506000816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a76400000281614b2c57614b2c615a64565b04905080607054670de0b6b3a76400000281614b4a57614b4a615a64565b0460705550505b683635c9adc5dea000006070541115614b7657683635c9adc5dea00000607055612814565b633b9aca00607054101561281457633b9aca0060705550505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146123d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612d91565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b158015614cf557600080fd5b505af1158015614d09573d6000803e3d6000fd5b505050506123d5614fab565b600054610100900460ff16614dac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401612d91565b6123d533614c16565b606f5460ff16614df1576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052614e9a9084907fa9059cbb000000000000000000000000000000000000000000000000000000009060640161487c565b505050565b6000614f01826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661503e9092919063ffffffff16565b805190915015614e9a5780806020019051810190614f1f9190615dfa565b614e9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401612d91565b606f5460ff1615614fe8576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b606061504d8484600085615055565b949350505050565b6060824710156150e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401612d91565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516151109190615d99565b60006040518083038185875af1925050503d806000811461514d576040519150601f19603f3d011682016040523d82523d6000602084013e615152565b606091505b50915091506151638783838761516e565b979650505050505050565b606083156152045782516000036151fd5773ffffffffffffffffffffffffffffffffffffffff85163b6151fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612d91565b508161504d565b61504d83838151156152195781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9191906152bb565b60005b83811015615268578181015183820152602001615250565b50506000910152565b6000815180845261528981602086016020860161524d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006152ce6020830184615271565b9392505050565b6000602082840312156152e757600080fd5b813561ffff811681146152ce57600080fd5b803567ffffffffffffffff81168114612be857600080fd5b600080600080600060a0868803121561532957600080fd5b615332866152f9565b9450615340602087016152f9565b94979496505050506040830135926060810135926080909101359150565b80610300810183101561537057600080fd5b92915050565b6000806000806000806103a0878903121561539057600080fd5b615399876152f9565b95506153a7602088016152f9565b94506153b5604088016152f9565b935060608701359250608087013591506153d28860a0890161535e565b90509295509295509295565b60008060008060008060006103c0888a0312156153fa57600080fd5b615403886152f9565b9650615411602089016152f9565b955061541f604089016152f9565b945061542d606089016152f9565b93506080880135925060a0880135915061544a8960c08a0161535e565b905092959891949750929550565b60006020828403121561546a57600080fd5b6152ce826152f9565b60008083601f84011261548557600080fd5b50813567ffffffffffffffff81111561549d57600080fd5b6020830191508360208260051b85010111156154b857600080fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612be857600080fd5b6000806000604084860312156154f857600080fd5b833567ffffffffffffffff81111561550f57600080fd5b61551b86828701615473565b909450925061552e9050602085016154bf565b90509250925092565b60006020828403121561554957600080fd5b6152ce826154bf565b60006020828403121561556457600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126155ab57600080fd5b813567ffffffffffffffff808211156155c6576155c661556b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561560c5761560c61556b565b8160405283815286602085880101111561562557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561565757600080fd5b813567ffffffffffffffff81111561566e57600080fd5b61504d8482850161559a565b60008083601f84011261568c57600080fd5b50813567ffffffffffffffff8111156156a457600080fd5b6020830191508360208285010111156154b857600080fd5b6000806000806000808688036101208112156156d757600080fd5b60a08112156156e557600080fd5b5086955060a0870135945060c087013567ffffffffffffffff8082111561570b57600080fd5b6157178a838b0161559a565b955060e089013591508082111561572d57600080fd5b6157398a838b0161559a565b945061010089013591508082111561575057600080fd5b5061575d89828a0161567a565b979a9699509497509295939492505050565b6000806020838503121561578257600080fd5b823567ffffffffffffffff81111561579957600080fd5b6157a585828601615473565b90969095509350505050565b6000806000604084860312156157c657600080fd5b833567ffffffffffffffff8111156157dd57600080fd5b6157e98682870161567a565b909790965060209590950135949350505050565b600181811c9082168061581157607f821691505b60208210810361584a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8181168382160190808211156158a0576158a0615850565b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261590a57600080fd5b9190910192915050565b60006080823603121561592657600080fd5b6040516080810167ffffffffffffffff828210818311171561594a5761594a61556b565b81604052843591508082111561595f57600080fd5b5061596c3682860161559a565b82525060208301356020820152615985604084016152f9565b6040820152615996606084016152f9565b606082015292915050565b600067ffffffffffffffff8083168181036159be576159be615850565b6001019392505050565b6000602082840312156159da57600080fd5b5051919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a1257615a12615850565b5060010190565b67ffffffffffffffff8281168282160390808211156158a0576158a0615850565b8181038181111561537057615370615850565b808202811582820484141761537057615370615850565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615aa257615aa2615a64565b500490565b601f821115614e9a57600081815260208120601f850160051c81016020861015615ace5750805b601f850160051c820191505b81811015615aed57828155600101615ada565b505050505050565b815167ffffffffffffffff811115615b0f57615b0f61556b565b615b2381615b1d84546157fd565b84615aa7565b602080601f831160018114615b765760008415615b405750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555615aed565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615bc357888601518255948401946001909101908401615ba4565b5085821015615bff57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600067ffffffffffffffff808716835280861660208401525060606040830152615c86606083018486615c0f565b9695505050505050565b8082018082111561537057615370615850565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261590a57600080fd5b600060608236031215615ce957600080fd5b6040516060810167ffffffffffffffff8282108183111715615d0d57615d0d61556b565b816040528435915080821115615d2257600080fd5b50615d2f3682860161559a565b82525060208301356020820152615d48604084016152f9565b604082015292915050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000615c86606083018486615c0f565b6000825161590a81846020870161524d565b600082615dba57615dba615a64565b500690565b61032081016103008085843782018360005b6001811015615df0578151835260209283019290910190600101615dd1565b5050509392505050565b600060208284031215615e0c57600080fd5b815180151581146152ce57600080fd5b600067ffffffffffffffff80841680615e3757615e37615a64565b9216919091049291505056fea2646970667358221220d484248ab85425cf841f2d4f89e9b0bb8b95957c1d626a5a6728eefeb91ede3764736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106103ba5760003560e01c8063841b24d7116101f4578063c754c7ed1161011a578063e7a7ed02116100ad578063f14916d61161007c578063f14916d614610a7e578063f2fde38b14610a91578063f851a44014610aa4578063f8b823e414610ac457600080fd5b8063e7a7ed02146109e7578063e8bf92ed14610a17578063eaeb077b14610a3e578063ed6b010414610a5157600080fd5b8063d2e129f9116100e9578063d2e129f914610991578063d8d1091b146109a4578063d939b315146109b7578063dbc16976146109df57600080fd5b8063c754c7ed146108fc578063c89e42df14610928578063cfa8ed471461093b578063d02103ca1461096a57600080fd5b8063a3c573eb11610192578063b4d63f5811610161578063b4d63f5814610853578063b6b0b097146108ba578063ba58ae39146108e1578063c0ed84e0146108f457600080fd5b8063a3c573eb146107c4578063ada8f919146107eb578063adc879e9146107fe578063afd23cbe1461082557600080fd5b806399f5634e116101ce57806399f5634e146107835780639aa972a31461078b5780639c9f3dfe1461079e578063a066215c146107b157600080fd5b8063841b24d71461072d5780638c3d73011461075d5780638da5cb5b1461076557600080fd5b80634a1a89a7116102e4578063621dd411116102775780637215541a116102465780637215541a1461066a5780637fcb36531461067d578063831c7ead14610691578063837a4738146106b857600080fd5b8063621dd4111461061c5780636b8616ce1461062f5780636ff512cc1461064f578063715018a61461066257600080fd5b8063542028d5116102b3578063542028d5146105f15780635e9145c9146105f95780635ec919581461060c578063604691691461061457600080fd5b80634a1a89a71461057d5780634a910e6a1461059d5780634e487706146105b05780635392c5e0146105c357600080fd5b8063298789831161035c578063394218e91161032b578063394218e91461050e578063423fa856146105215780634560526714610541578063458c04771461056957600080fd5b806329878983146104a95780632b0006fa146104d55780632c1f816a146104e8578063383b3be8146104fb57600080fd5b80631816b7e5116103985780631816b7e51461042857806319d8ac611461043d578063220d789914610451578063267822471461046457600080fd5b80630a0d9fbe146103bf578063107bf28c146103f657806315064c961461040b575b600080fd5b606f546103d890610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6103fe610acd565b6040516103ed91906152bb565b606f546104189060ff1681565b60405190151581526020016103ed565b61043b6104363660046152d5565b610b5b565b005b6073546103d89067ffffffffffffffff1681565b6103fe61045f366004615311565b610c73565b607b546104849073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103ed565b6074546104849068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61043b6104e3366004615376565b610e4a565b61043b6104f63660046153de565b61101a565b610418610509366004615458565b611228565b61043b61051c366004615458565b61127e565b6073546103d89068010000000000000000900467ffffffffffffffff1681565b6073546103d890700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546103d89067ffffffffffffffff1681565b6079546103d89068010000000000000000900467ffffffffffffffff1681565b61043b6105ab366004615458565b611402565b61043b6105be366004615458565b6114b5565b6105e36105d1366004615458565b60756020526000908152604090205481565b6040519081526020016103ed565b6103fe611639565b61043b6106073660046154e3565b611646565b61043b611e50565b6105e3611f50565b61043b61062a366004615376565b611f66565b6105e361063d366004615458565b60716020526000908152604090205481565b61043b61065d366004615537565b6122ee565b61043b6123c3565b61043b610678366004615458565b6123d7565b6074546103d89067ffffffffffffffff1681565b6103d87f000000000000000000000000000000000000000000000000000000000000000081565b6107016106c6366004615552565b60786020526000908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016103ed565b6079546103d8907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61043b612547565b60335473ffffffffffffffffffffffffffffffffffffffff16610484565b6105e3612613565b61043b6107993660046153de565b61276c565b61043b6107ac366004615458565b61281d565b61043b6107bf366004615458565b612999565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b61043b6107f9366004615537565b612a9f565b6103d87f000000000000000000000000000000000000000000000000000000000000000081565b606f54610840906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103ed565b610894610861366004615458565b6072602052600090815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016103ed565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b6104186108ef366004615552565b612b63565b6103d8612bed565b607b546103d89074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b61043b610936366004615645565b612c42565b606f54610484906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b61043b61099f3660046156bc565b612ccf565b61043b6109b236600461576f565b61321a565b6079546103d890700100000000000000000000000000000000900467ffffffffffffffff1681565b61043b6137bc565b6073546103d8907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104847f000000000000000000000000000000000000000000000000000000000000000081565b61043b610a4c3660046157b1565b613895565b607b54610418907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b61043b610a8c366004615537565b613c8b565b61043b610a9f366004615537565b613d5d565b607a546104849073ffffffffffffffffffffffffffffffffffffffff1681565b6105e360705481565b60778054610ada906157fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610b06906157fd565b8015610b535780601f10610b2857610100808354040283529160200191610b53565b820191906000526020600020905b815481529060010190602001808311610b3657829003601f168201915b505050505081565b607a5473ffffffffffffffffffffffffffffffffffffffff163314610bac576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff161080610bc557506103ff8161ffff16115b15610bfc576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086166000818152607260205260408082205493881682529020546060929115801590610ca7575081155b15610cde576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610d15576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d1e84612b63565b610d54576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610ea7576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610eb5868686868686613e11565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615610f3057607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015610fb857600080fd5b505af1158015610fcc573d6000803e3d6000fd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611077576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611086878787878787876141d5565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092556000908152607560205260409020839055607954161561110157607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b15801561118957600080fd5b505af115801561119d573d6000803e3d6000fd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281166000908152607860205260408120549092429261126c927001000000000000000000000000000000009092048116911661587f565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146112cf576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611316576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166113855760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611385576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610c68565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146114a957606f5460ff161561146a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61147381611228565b6114a9576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114b28161460f565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611506576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561154d576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166115b857607b5467ffffffffffffffff740100000000000000000000000000000000000000009091048116908216106115b8576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001610c68565b60768054610ada906157fd565b606f5460ff1615611683576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146116e3576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600081900361171f576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561175b576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000082048116600081815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b86811015611bab5760008a8a838181106117c3576117c36158a7565b90506020028101906117d591906158d6565b6117de90615914565b8051805160209091012060608201519192509067ffffffffffffffff1615611956578561180a816159a1565b9650506000818360200151846060015160405160200161186293929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a166000908152607190935291205490915081146118eb576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088166000908152607160205260408082209190915560608501519085015190821691161015611950576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611a93565b602082015115801590611a1d575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af11580156119f7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1b91906159c8565b155b15611a54576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611a93576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080611ac6575042826040015167ffffffffffffffff16115b15611afd576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151975050508080611ba3906159e1565b9150506117a7565b50611bb6868561587f565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115611c1f576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611c2b8285615a19565b611c3f9067ffffffffffffffff1688615a3a565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d861660008181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611d3557607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611d87333083607054611d489190615a4d565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190614822565b611d8f614904565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611df757600080fd5b505af1158015611e0b573d6000803e3d6000fd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611ea1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16611efd576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60006070546064611f619190615a4d565b905090565b606f5460ff1615611fa3576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581166000908152607260205260409020600101544292611ff09278010000000000000000000000000000000000000000000000009091048116911661587f565b67ffffffffffffffff161115612032576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e861203f8686615a19565b67ffffffffffffffff161115612081576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61208f868686868686613e11565b612098846149b5565b607954700100000000000000000000000000000000900467ffffffffffffffff166000036121e057607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092556000908152607560205260409020839055607954161561213b57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b1580156121c357600080fd5b505af11580156121d7573d6000803e3d6000fd5b505050506122b0565b6121e8614904565b6079805467ffffffffffffffff16906000612202836159a1565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487166000908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59669060200161100a565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461233f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c68565b6123cb614b95565b6123d56000614c16565b565b60335473ffffffffffffffffffffffffffffffffffffffff16331461253f576000612400612bed565b90508067ffffffffffffffff168267ffffffffffffffff161161244f576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000090910481169083161180612495575067ffffffffffffffff80831660009081526072602052604090206001015416155b156124cc576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff80831660009081526072602052604090206001015442916124fb9162093a80911661587f565b67ffffffffffffffff16111561253d576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6114b2614c8d565b607b5473ffffffffffffffffffffffffffffffffffffffff163314612598576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156126a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c691906159c8565b905060006126d2612bed565b60735467ffffffffffffffff68010000000000000000820481169161272a9170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416615a19565b612734919061587f565b61273e9190615a19565b67ffffffffffffffff1690508060000361275b5760009250505090565b6127658183615a93565b9250505090565b606f5460ff16156127a9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127b8878787878787876141d5565b67ffffffffffffffff84166000908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1612814614c8d565b50505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461286e576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156128b5576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661291c5760795467ffffffffffffffff70010000000000000000000000000000000090910481169082161061291c576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610c68565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146129ea576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff161115612a31576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001610c68565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612af0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c68565b600067ffffffff0000000167ffffffffffffffff8316108015612b9b575067ffffffff00000001604083901c67ffffffffffffffff16105b8015612bbc575067ffffffff00000001608083901c67ffffffffffffffff16105b8015612bd3575067ffffffff0000000160c083901c105b15612be057506001919050565b506000919050565b919050565b60795460009067ffffffffffffffff1615612c31575060795467ffffffffffffffff9081166000908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612c93576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6076612c9f8282615af5565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c6891906152bb565b600054610100900460ff1615808015612cef5750600054600160ff909116105b80612d095750303b158015612d09575060005460ff166001145b612d9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612df857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b612e056020880188615537565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612e5a6040880160208901615537565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055612ebf6080880160608901615537565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790556000805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076612f4a8682615af5565b506077612f578582615af5565b5062093a80612f6c6060890160408a01615458565b67ffffffffffffffff161115612fae576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fbe6060880160408901615458565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a8061302060a0890160808a01615458565b67ffffffffffffffff161115613062576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61307260a0880160808901615458565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613151614d15565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd660007f000000000000000000000000000000000000000000000000000000000000000085856040516131a79493929190615c58565b60405180910390a1801561281457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613277576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16156132b4576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036132f0576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561332c576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff78010000000000000000000000000000000000000000000000008204811691613377918491700100000000000000000000000000000000900416615c90565b11156133af576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000008204811660008181526072602052604081205491937001000000000000000000000000000000009004909216915b8481101561365957600087878381811061340f5761340f6158a7565b90506020028101906134219190615ca3565b61342a90615cd7565b905083613436816159a1565b825180516020918201208185015160408087015190519499509194506000936134989386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260719093529120549091508114613521576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260716020526040812055613546600189615a3a565b84036135b55742607b60149054906101000a900467ffffffffffffffff168460400151613573919061587f565b67ffffffffffffffff1611156135b5576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080613651906159e1565b9150506133f3565b50613664848461587f565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589166000818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461380d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561387557600080fd5b505af1158015613889573d6000803e3d6000fd5b505050506123d5614db5565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16156138f2576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff161561392f576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613939611f50565b905081811115613975576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113888311156139b1576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6139f373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084614822565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a8491906159c8565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16906018613abe836159a1565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051613af5929190615d53565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1660009081526071909352912055323303613c2557607354604080518381523360208201526060918101829052600091810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613c84565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613c7b9493929190615d63565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613cdc576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610c68565b613d65614b95565b73ffffffffffffffffffffffffffffffffffffffff8116613e08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401612d91565b6114b281614c16565b600080613e1c612bed565b905067ffffffffffffffff881615613eec5760795467ffffffffffffffff9081169089161115613e78576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089166000908152607860205260409020600281015481549094509091898116680100000000000000009092041614613ee6576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50613f8d565b67ffffffffffffffff8716600090815260756020526040902054915081613f3f576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115613f8d576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611613fda576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613fe98888888689610c73565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161401e9190615d99565b602060405180830381855afa15801561403b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061405e91906159c8565b6140689190615dab565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916140ea91899190600401615dbf565b602060405180830381865afa158015614107573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061412b9190615dfa565b614161576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6141c93361416f858b615a19565b67ffffffffffffffff16614181612613565b61418b9190615a4d565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190614e44565b50505050505050505050565b600067ffffffffffffffff8816156142a35760795467ffffffffffffffff9081169089161115614231576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff808816600090815260786020526040902060028101548154909288811668010000000000000000909204161461429d576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061433f565b5067ffffffffffffffff8516600090815260756020526040902054806142f5576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff908116908716111561433f576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff908116908816118061437157508767ffffffffffffffff168767ffffffffffffffff1611155b80614398575060795467ffffffffffffffff68010000000000000000909104811690881611155b156143cf576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff878116600090815260786020526040902054680100000000000000009004811690861614614432576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006144418787878588610c73565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516144769190615d99565b602060405180830381855afa158015614493573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906144b691906159c8565b6144c09190615dab565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161454291889190600401615dbf565b602060405180830381865afa15801561455f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145839190615dfa565b6145b9576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89166000908152607860205260409020600201548590036141c9576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff680100000000000000009091048116908216111580614649575060795467ffffffffffffffff908116908216115b15614680576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff818116600081815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b1580156147b257600080fd5b505af11580156147c6573d6000803e3d6000fd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161481591815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526148fe9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614e9f565b50505050565b60795467ffffffffffffffff6801000000000000000082048116911611156123d55760795460009061494d9068010000000000000000900467ffffffffffffffff16600161587f565b905061495881611228565b156114b25760795460009060029061497b90849067ffffffffffffffff16615a19565b6149859190615e1c565b61498f908361587f565b905061499a81611228565b156149ac576149a88161460f565b5050565b6149a88261460f565b60006149bf612bed565b9050816000806149cf8484615a19565b606f5467ffffffffffffffff91821692506000916149f39161010090041642615a3a565b90505b8467ffffffffffffffff168467ffffffffffffffff1614614a7e5767ffffffffffffffff80851660009081526072602052604090206001810154909116821015614a5c57600181015468010000000000000000900467ffffffffffffffff169450614a78565b614a668686615a19565b67ffffffffffffffff16935050614a7e565b506149f6565b6000614a8a8484615a3a565b905083811015614ae157808403600c8111614aa55780614aa8565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281614ad757614ad7615a64565b0460705550614b51565b838103600c8111614af25780614af5565b600c5b90506000816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a76400000281614b2c57614b2c615a64565b04905080607054670de0b6b3a76400000281614b4a57614b4a615a64565b0460705550505b683635c9adc5dea000006070541115614b7657683635c9adc5dea00000607055612814565b633b9aca00607054101561281457633b9aca0060705550505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146123d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612d91565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b158015614cf557600080fd5b505af1158015614d09573d6000803e3d6000fd5b505050506123d5614fab565b600054610100900460ff16614dac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401612d91565b6123d533614c16565b606f5460ff16614df1576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052614e9a9084907fa9059cbb000000000000000000000000000000000000000000000000000000009060640161487c565b505050565b6000614f01826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661503e9092919063ffffffff16565b805190915015614e9a5780806020019051810190614f1f9190615dfa565b614e9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401612d91565b606f5460ff1615614fe8576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b606061504d8484600085615055565b949350505050565b6060824710156150e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401612d91565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516151109190615d99565b60006040518083038185875af1925050503d806000811461514d576040519150601f19603f3d011682016040523d82523d6000602084013e615152565b606091505b50915091506151638783838761516e565b979650505050505050565b606083156152045782516000036151fd5773ffffffffffffffffffffffffffffffffffffffff85163b6151fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612d91565b508161504d565b61504d83838151156152195781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9191906152bb565b60005b83811015615268578181015183820152602001615250565b50506000910152565b6000815180845261528981602086016020860161524d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006152ce6020830184615271565b9392505050565b6000602082840312156152e757600080fd5b813561ffff811681146152ce57600080fd5b803567ffffffffffffffff81168114612be857600080fd5b600080600080600060a0868803121561532957600080fd5b615332866152f9565b9450615340602087016152f9565b94979496505050506040830135926060810135926080909101359150565b80610300810183101561537057600080fd5b92915050565b6000806000806000806103a0878903121561539057600080fd5b615399876152f9565b95506153a7602088016152f9565b94506153b5604088016152f9565b935060608701359250608087013591506153d28860a0890161535e565b90509295509295509295565b60008060008060008060006103c0888a0312156153fa57600080fd5b615403886152f9565b9650615411602089016152f9565b955061541f604089016152f9565b945061542d606089016152f9565b93506080880135925060a0880135915061544a8960c08a0161535e565b905092959891949750929550565b60006020828403121561546a57600080fd5b6152ce826152f9565b60008083601f84011261548557600080fd5b50813567ffffffffffffffff81111561549d57600080fd5b6020830191508360208260051b85010111156154b857600080fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612be857600080fd5b6000806000604084860312156154f857600080fd5b833567ffffffffffffffff81111561550f57600080fd5b61551b86828701615473565b909450925061552e9050602085016154bf565b90509250925092565b60006020828403121561554957600080fd5b6152ce826154bf565b60006020828403121561556457600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126155ab57600080fd5b813567ffffffffffffffff808211156155c6576155c661556b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561560c5761560c61556b565b8160405283815286602085880101111561562557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561565757600080fd5b813567ffffffffffffffff81111561566e57600080fd5b61504d8482850161559a565b60008083601f84011261568c57600080fd5b50813567ffffffffffffffff8111156156a457600080fd5b6020830191508360208285010111156154b857600080fd5b6000806000806000808688036101208112156156d757600080fd5b60a08112156156e557600080fd5b5086955060a0870135945060c087013567ffffffffffffffff8082111561570b57600080fd5b6157178a838b0161559a565b955060e089013591508082111561572d57600080fd5b6157398a838b0161559a565b945061010089013591508082111561575057600080fd5b5061575d89828a0161567a565b979a9699509497509295939492505050565b6000806020838503121561578257600080fd5b823567ffffffffffffffff81111561579957600080fd5b6157a585828601615473565b90969095509350505050565b6000806000604084860312156157c657600080fd5b833567ffffffffffffffff8111156157dd57600080fd5b6157e98682870161567a565b909790965060209590950135949350505050565b600181811c9082168061581157607f821691505b60208210810361584a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8181168382160190808211156158a0576158a0615850565b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261590a57600080fd5b9190910192915050565b60006080823603121561592657600080fd5b6040516080810167ffffffffffffffff828210818311171561594a5761594a61556b565b81604052843591508082111561595f57600080fd5b5061596c3682860161559a565b82525060208301356020820152615985604084016152f9565b6040820152615996606084016152f9565b606082015292915050565b600067ffffffffffffffff8083168181036159be576159be615850565b6001019392505050565b6000602082840312156159da57600080fd5b5051919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a1257615a12615850565b5060010190565b67ffffffffffffffff8281168282160390808211156158a0576158a0615850565b8181038181111561537057615370615850565b808202811582820484141761537057615370615850565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615aa257615aa2615a64565b500490565b601f821115614e9a57600081815260208120601f850160051c81016020861015615ace5750805b601f850160051c820191505b81811015615aed57828155600101615ada565b505050505050565b815167ffffffffffffffff811115615b0f57615b0f61556b565b615b2381615b1d84546157fd565b84615aa7565b602080601f831160018114615b765760008415615b405750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555615aed565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615bc357888601518255948401946001909101908401615ba4565b5085821015615bff57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600067ffffffffffffffff808716835280861660208401525060606040830152615c86606083018486615c0f565b9695505050505050565b8082018082111561537057615370615850565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261590a57600080fd5b600060608236031215615ce957600080fd5b6040516060810167ffffffffffffffff8282108183111715615d0d57615d0d61556b565b816040528435915080821115615d2257600080fd5b50615d2f3682860161559a565b82525060208301356020820152615d48604084016152f9565b604082015292915050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000615c86606083018486615c0f565b6000825161590a81846020870161524d565b600082615dba57615dba615a64565b500690565b61032081016103008085843782018360005b6001811015615df0578151835260209283019290910190600101615dd1565b5050509392505050565b600060208284031215615e0c57600080fd5b815180151581146152ce57600080fd5b600067ffffffffffffffff80841680615e3757615e37615a64565b9216919091049291505056fea2646970667358221220d484248ab85425cf841f2d4f89e9b0bb8b95957c1d626a5a6728eefeb91ede3764736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMBridge.json b/compiled-contracts/paris/PolygonZkEVMBridge.json index b10a58ab2..bc27479b1 100644 --- a/compiled-contracts/paris/PolygonZkEVMBridge.json +++ b/compiled-contracts/paris/PolygonZkEVMBridge.json @@ -776,8 +776,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50615c83806100206000396000f3fe6080604052600436106200019f5760003560e01c8063647c576c11620000e7578063be5831c71162000089578063dbc169761162000060578063dbc169761462000639578063ee25560b1462000651578063fb570834146200068257600080fd5b8063be5831c714620005ae578063cd58657914620005ea578063d02103ca146200060157600080fd5b80639e34070f11620000be5780639e34070f146200050a578063aaa13cc2146200054f578063bab161bf146200057457600080fd5b8063647c576c146200048657806379e2cf9714620004ab57806381b1c17414620004c357600080fd5b80632d2c9d94116200015157806334ac9cf2116200012857806334ac9cf2146200034b5780633ae05047146200037a5780633e197043146200039257600080fd5b80632d2c9d9414620002765780632dfdf0b5146200029b578063318aee3d14620002c257600080fd5b806322e95f2c116200018657806322e95f2c14620001ef578063240ff378146200023a5780632cffd02e146200025157600080fd5b806315064c9614620001a45780632072f6c514620001d5575b600080fd5b348015620001b157600080fd5b50606854620001c09060ff1681565b60405190151581526020015b60405180910390f35b348015620001e257600080fd5b50620001ed620006a7565b005b348015620001fc57600080fd5b50620002146200020e366004620032db565b62000705565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001cc565b620001ed6200024b36600462003372565b620007a8565b3480156200025e57600080fd5b50620001ed6200027036600462003409565b620009d0565b3480156200028357600080fd5b50620001ed6200029536600462003409565b62000f74565b348015620002a857600080fd5b50620002b360535481565b604051908152602001620001cc565b348015620002cf57600080fd5b5062000319620002e1366004620034ef565b606b6020526000908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001cc565b3480156200035857600080fd5b50606c54620002149073ffffffffffffffffffffffffffffffffffffffff1681565b3480156200038757600080fd5b50620002b362001178565b3480156200039f57600080fd5b50620002b3620003b136600462003526565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200049357600080fd5b50620001ed620004a5366004620035b0565b6200125e565b348015620004b857600080fd5b50620001ed620014ad565b348015620004d057600080fd5b5062000214620004e236600462003600565b606a6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200051757600080fd5b50620001c06200052936600462003600565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b3480156200055c57600080fd5b50620002146200056e3660046200361a565b620014e7565b3480156200058157600080fd5b506068546200059890610100900463ffffffff1681565b60405163ffffffff9091168152602001620001cc565b348015620005bb57600080fd5b506068546200059890790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001ed620005fb366004620036ce565b620016d3565b3480156200060e57600080fd5b50606854620002149065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200064657600080fd5b50620001ed62001c37565b3480156200065e57600080fd5b50620002b36200067036600462003600565b60696020526000908152604090205481565b3480156200068f57600080fd5b50620001c0620006a136600462003770565b62001c93565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006f9576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200070362001d7c565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091206000908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007e6576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8681166101009092041614806200080c5750600263ffffffff861610155b1562000844576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff163388883488886053546040516200089a9998979695949392919062003806565b60405180910390a1620009b8620009b26001606860019054906101000a900463ffffffff16338989348989604051620008d592919062003881565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b62001e10565b8215620009c957620009c962001f27565b5050505050565b60685460ff161562000a0e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000a258b8b8b8b8b8b8b8b8b8b8b600062001ffc565b73ffffffffffffffffffffffffffffffffffffffff861662000b01576040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a7a9190620038e6565b60006040518083038185875af1925050503d806000811462000ab9576040519150601f19603f3d011682016040523d82523d6000602084013e62000abe565b606091505b505090508062000afa576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000efc565b60685463ffffffff61010090910481169088160362000b435762000b3d73ffffffffffffffffffffffffffffffffffffffff87168585620021ed565b62000efc565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b166024820152600090603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e6e576000808062000c1886880188620039fb565b92509250925060008584848460405162000c329062003292565b62000c409392919062003abd565b8190604051809103906000f590508015801562000c61573d6000803e3d6000fd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f1990604401600060405180830381600087803b15801562000cd757600080fd5b505af115801562000cec573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e5c95949392919062003afa565b60405180910390a15050505062000ef9565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f1990604401600060405180830381600087803b15801562000edf57600080fd5b505af115801562000ef4573d6000803e3d6000fd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000fb2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000fc98b8b8b8b8b8b8b8b8b8b8b600162001ffc565b60008473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000ffc949392919062003b42565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200107f9190620038e6565b60006040518083038185875af1925050503d8060008114620010be576040519150601f19603f3d011682016040523d82523d6000602084013e620010c3565b606091505b5050905080620010ff576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b605354600090819081805b602081101562001255578083901c600116600103620011e65760338160208110620011b257620011b262003b8a565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062001213565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806200124c9062003be8565b91505062001183565b50919392505050565b600054610100900460ff16158080156200127f5750600054600160ff909116105b806200129b5750303b1580156200129b575060005460ff166001145b6200132d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200138c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001691841691909117905562001443620022c3565b8015620014a757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000703576200070362001f27565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201526000908190603801604051602081830303815290604052805190602001209050600060ff60f81b3083604051806020016200157d9062003292565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620015c8908d908d908d908d908d9060200162003c23565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001606929160200162003c64565b604051602081830303815290604052805190602001206040516020016200168f94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff161562001711576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200171b62002366565b60685463ffffffff888116610100909204161480620017415750600263ffffffff881610155b1562001779576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060608773ffffffffffffffffffffffffffffffffffffffff8816620017df57883414620017d5576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000925062001ad9565b341562001818576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089166000908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901562001908576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac90604401600060405180830381600087803b158015620018db57600080fd5b505af1158015620018f0573d6000803e3d6000fd5b50505050806020015194508060000151935062001ad7565b85156200191d576200191d898b8989620023db565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200198b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620019b1919062003c97565b9050620019d773ffffffffffffffffffffffffffffffffffffffff8b1633308e620028f9565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa15801562001a45573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a6b919062003c97565b905062001a79828262003cb1565b6068548c9850610100900463ffffffff169650935062001a998762002959565b62001aa48c62002a71565b62001aaf8d62002b7e565b60405160200162001ac39392919062003abd565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e868860535460405162001b1b98979695949392919062003cc7565b60405180910390a162001c0f620009b2600085878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b861562001c205762001c2062001f27565b5050505062001c2e60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c89576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200070362002c80565b600084815b602081101562001d6e57600163ffffffff8616821c8116900362001d0a5785816020811062001ccb5762001ccb62003b8a565b60200201358260405160200162001cec929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001d59565b8186826020811062001d205762001d2062003b8a565b602002013560405160200162001d40929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d658162003be8565b91505062001c98565b50821490505b949350505050565b60685460ff161562001dba576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b80600162001e216020600262003e79565b62001e2d919062003cb1565b6053541062001e68576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060536000815462001e7b9062003be8565b9182905550905060005b602081101562001f17578082901c60011660010362001ebd57826033826020811062001eb55762001eb562003b8a565b015550505050565b6033816020811062001ed35762001ed362003b8a565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001f0e9062003be8565b91505062001e85565b5062001f2262003e87565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001fad62001178565b6040518263ffffffff1660e01b815260040162001fcc91815260200190565b600060405180830381600087803b15801562001fe757600080fd5b505af1158015620014a7573d6000803e3d6000fd5b6200200d8b63ffffffff1662002d10565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b363200000000000000000000000000000000000000000000000000000000909252606481019190915260009165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303816000875af1158015620020b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620020d6919062003c97565b90508060000362002112576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff88811661010090920416146200215c576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606854600090610100900463ffffffff166200217a5750896200217d565b508a5b620021a66200219d848c8c8c8c8c8c8c604051620008d592919062003881565b8f8f8462001c93565b620021dd576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001f229084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002d75565b600054610100900460ff166200235c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001324565b6200070362002e88565b600260015403620023d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001324565b6002600155565b6000620023ec600482848662003eb6565b620023f79162003ee2565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620026765760008080808080806200245a896004818d62003eb6565b81019062002469919062003f2b565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614620024dd576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff861630146200252d576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002567576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620026229190620038e6565b6000604051808303816000865af19150503d806000811462002661576040519150601f19603f3d011682016040523d82523d6000602084013e62002666565b606091505b50505050505050505050620009c9565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c0000000000000000000000000000000000000000000000000000000014620026f2576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808080808080806200270a8a6004818e62003eb6565b81019062002719919062003f86565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146200278f576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87163014620027df576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f1691620028a39190620038e6565b6000604051808303816000865af19150503d8060008114620028e2576040519150601f19603f3d011682016040523d82523d6000602084013e620028e7565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014a79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002240565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691620029dd9190620038e6565b600060405180830381855afa9150503d806000811462002a1a576040519150601f19603f3d011682016040523d82523d6000602084013e62002a1f565b606091505b50915091508162002a66576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d74565b62001d748162002f21565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162002af59190620038e6565b600060405180830381855afa9150503d806000811462002b32576040519150601f19603f3d011682016040523d82523d6000602084013e62002b37565b606091505b50915091508162002a66576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d74565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169162002c019190620038e6565b600060405180830381855afa9150503d806000811462002c3e576040519150601f19603f3d011682016040523d82523d6000602084013e62002c43565b606091505b509150915081801562002c57575080516020145b62002c6457601262001d74565b8080602001905181019062001d74919062004012565b60018055565b60685460ff1662002cbd576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600881901c60008181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009c9576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600062002dd9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031119092919063ffffffff16565b80519091501562001f22578080602001905181019062002dfa919062004032565b62001f22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001324565b600054610100900460ff1662002c7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001324565b6060604082511062002f435781806020019051810190620007a2919062004052565b8151602003620030d35760005b60208110801562002f9b575082818151811062002f715762002f7162003b8a565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002fb6578062002fad8162003be8565b91505062002f50565b8060000362002ffa57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111562003018576200301862003891565b6040519080825280601f01601f19166020018201604052801562003043576020820181803683370190505b50905060005b82811015620030cb5784818151811062003067576200306762003b8a565b602001015160f81c60f81b82828151811062003087576200308762003b8a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080620030c28162003be8565b91505062003049565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d748484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051620031489190620038e6565b60006040518083038185875af1925050503d806000811462003187576040519150601f19603f3d011682016040523d82523d6000602084013e6200318c565b606091505b50915091506200319f87838387620031aa565b979650505050505050565b60608315620032455782516000036200323d5773ffffffffffffffffffffffffffffffffffffffff85163b6200323d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001324565b508162001d74565b62001d7483838151156200325c5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620013249190620040d2565b611b6680620040e883390190565b803563ffffffff811681146200310c57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620032d857600080fd5b50565b60008060408385031215620032ef57600080fd5b620032fa83620032a0565b915060208301356200330c81620032b5565b809150509250929050565b8015158114620032d857600080fd5b60008083601f8401126200333957600080fd5b50813567ffffffffffffffff8111156200335257600080fd5b6020830191508360208285010111156200336b57600080fd5b9250929050565b6000806000806000608086880312156200338b57600080fd5b6200339686620032a0565b94506020860135620033a881620032b5565b93506040860135620033ba8162003317565b9250606086013567ffffffffffffffff811115620033d757600080fd5b620033e58882890162003326565b969995985093965092949392505050565b806104008101831015620007a257600080fd5b60008060008060008060008060008060006105208c8e0312156200342c57600080fd5b620034388d8d620033f6565b9a50620034496104008d01620032a0565b99506104208c013598506104408c013597506200346a6104608d01620032a0565b96506104808c01356200347d81620032b5565b95506200348e6104a08d01620032a0565b94506104c08c0135620034a181620032b5565b93506104e08c013592506105008c013567ffffffffffffffff811115620034c757600080fd5b620034d58e828f0162003326565b915080935050809150509295989b509295989b9093969950565b6000602082840312156200350257600080fd5b81356200350f81620032b5565b9392505050565b60ff81168114620032d857600080fd5b600080600080600080600060e0888a0312156200354257600080fd5b87356200354f8162003516565b96506200355f60208901620032a0565b955060408801356200357181620032b5565b94506200358160608901620032a0565b935060808801356200359381620032b5565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215620035c657600080fd5b620035d184620032a0565b92506020840135620035e381620032b5565b91506040840135620035f581620032b5565b809150509250925092565b6000602082840312156200361357600080fd5b5035919050565b600080600080600080600060a0888a0312156200363657600080fd5b6200364188620032a0565b965060208801356200365381620032b5565b9550604088013567ffffffffffffffff808211156200367157600080fd5b6200367f8b838c0162003326565b909750955060608a01359150808211156200369957600080fd5b50620036a88a828b0162003326565b9094509250506080880135620036be8162003516565b8091505092959891949750929550565b600080600080600080600060c0888a031215620036ea57600080fd5b620036f588620032a0565b965060208801356200370781620032b5565b95506040880135945060608801356200372081620032b5565b93506080880135620037328162003317565b925060a088013567ffffffffffffffff8111156200374f57600080fd5b6200375d8a828b0162003326565b989b979a50959850939692959293505050565b60008060008061046085870312156200378857600080fd5b843593506200379b8660208701620033f6565b9250620037ac6104208601620032a0565b939692955092936104400135925050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600061010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620038678285018789620037bd565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b83811015620038dd578181015183820152602001620038c3565b50506000910152565b60008251620038fa818460208701620038c0565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156200394e576200394e62003891565b604052919050565b600067ffffffffffffffff82111562003973576200397362003891565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112620039b157600080fd5b8135620039c8620039c28262003956565b62003904565b818152846020838601011115620039de57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562003a1157600080fd5b833567ffffffffffffffff8082111562003a2a57600080fd5b62003a38878388016200399f565b9450602086013591508082111562003a4f57600080fd5b5062003a5e868287016200399f565b9250506040840135620035f58162003516565b6000815180845262003a8b816020860160208601620038c0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60608152600062003ad2606083018662003a71565b828103602084015262003ae6818662003a71565b91505060ff83166040830152949350505050565b63ffffffff86168152600073ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200319f608083018486620037bd565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff8416602082015260606040820152600062003b80606083018486620037bd565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003c1c5762003c1c62003bb9565b5060010190565b60608152600062003c39606083018789620037bd565b828103602084015262003c4e818688620037bd565b91505060ff831660408301529695505050505050565b6000835162003c78818460208801620038c0565b83519083019062003c8e818360208801620038c0565b01949350505050565b60006020828403121562003caa57600080fd5b5051919050565b81810381811115620007a257620007a262003bb9565b600061010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003d278285018762003a71565b925080851660e085015250509998505050505050505050565b600181815b8085111562003d9f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d835762003d8362003bb9565b8085161562003d9157918102915b93841c939080029062003d45565b509250929050565b60008262003db857506001620007a2565b8162003dc757506000620007a2565b816001811462003de0576002811462003deb5762003e0b565b6001915050620007a2565b60ff84111562003dff5762003dff62003bb9565b50506001821b620007a2565b5060208310610133831016604e8410600b841016171562003e30575081810a620007a2565b62003e3c838362003d40565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003e715762003e7162003bb9565b029392505050565b60006200350f838362003da7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000808585111562003ec757600080fd5b8386111562003ed557600080fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003f235780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a03121562003f4757600080fd5b873562003f5481620032b5565b9650602088013562003f6681620032b5565b955060408801359450606088013593506080880135620035938162003516565b600080600080600080600080610100898b03121562003fa457600080fd5b883562003fb181620032b5565b9750602089013562003fc381620032b5565b96506040890135955060608901359450608089013562003fe38162003317565b935060a089013562003ff58162003516565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200402557600080fd5b81516200350f8162003516565b6000602082840312156200404557600080fd5b81516200350f8162003317565b6000602082840312156200406557600080fd5b815167ffffffffffffffff8111156200407d57600080fd5b8201601f810184136200408f57600080fd5b8051620040a0620039c28262003956565b818152856020838501011115620040b657600080fd5b620040c9826020830160208601620038c0565b95945050505050565b6020815260006200350f602083018462003a7156fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212206fe049be388a1d04319b9913fe6d100c4c8e272fe0f5748eb056bd0622beabcc64736f6c63430008140033a2646970667358221220ef4412c515d53043ca441d4b33288d9aa2b101bc9853f859467ab1a42f16139c64736f6c63430008140033", - "deployedBytecode": "0x6080604052600436106200019f5760003560e01c8063647c576c11620000e7578063be5831c71162000089578063dbc169761162000060578063dbc169761462000639578063ee25560b1462000651578063fb570834146200068257600080fd5b8063be5831c714620005ae578063cd58657914620005ea578063d02103ca146200060157600080fd5b80639e34070f11620000be5780639e34070f146200050a578063aaa13cc2146200054f578063bab161bf146200057457600080fd5b8063647c576c146200048657806379e2cf9714620004ab57806381b1c17414620004c357600080fd5b80632d2c9d94116200015157806334ac9cf2116200012857806334ac9cf2146200034b5780633ae05047146200037a5780633e197043146200039257600080fd5b80632d2c9d9414620002765780632dfdf0b5146200029b578063318aee3d14620002c257600080fd5b806322e95f2c116200018657806322e95f2c14620001ef578063240ff378146200023a5780632cffd02e146200025157600080fd5b806315064c9614620001a45780632072f6c514620001d5575b600080fd5b348015620001b157600080fd5b50606854620001c09060ff1681565b60405190151581526020015b60405180910390f35b348015620001e257600080fd5b50620001ed620006a7565b005b348015620001fc57600080fd5b50620002146200020e366004620032db565b62000705565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001cc565b620001ed6200024b36600462003372565b620007a8565b3480156200025e57600080fd5b50620001ed6200027036600462003409565b620009d0565b3480156200028357600080fd5b50620001ed6200029536600462003409565b62000f74565b348015620002a857600080fd5b50620002b360535481565b604051908152602001620001cc565b348015620002cf57600080fd5b5062000319620002e1366004620034ef565b606b6020526000908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001cc565b3480156200035857600080fd5b50606c54620002149073ffffffffffffffffffffffffffffffffffffffff1681565b3480156200038757600080fd5b50620002b362001178565b3480156200039f57600080fd5b50620002b3620003b136600462003526565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200049357600080fd5b50620001ed620004a5366004620035b0565b6200125e565b348015620004b857600080fd5b50620001ed620014ad565b348015620004d057600080fd5b5062000214620004e236600462003600565b606a6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200051757600080fd5b50620001c06200052936600462003600565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b3480156200055c57600080fd5b50620002146200056e3660046200361a565b620014e7565b3480156200058157600080fd5b506068546200059890610100900463ffffffff1681565b60405163ffffffff9091168152602001620001cc565b348015620005bb57600080fd5b506068546200059890790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001ed620005fb366004620036ce565b620016d3565b3480156200060e57600080fd5b50606854620002149065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200064657600080fd5b50620001ed62001c37565b3480156200065e57600080fd5b50620002b36200067036600462003600565b60696020526000908152604090205481565b3480156200068f57600080fd5b50620001c0620006a136600462003770565b62001c93565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006f9576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200070362001d7c565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091206000908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007e6576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8681166101009092041614806200080c5750600263ffffffff861610155b1562000844576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff163388883488886053546040516200089a9998979695949392919062003806565b60405180910390a1620009b8620009b26001606860019054906101000a900463ffffffff16338989348989604051620008d592919062003881565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b62001e10565b8215620009c957620009c962001f27565b5050505050565b60685460ff161562000a0e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000a258b8b8b8b8b8b8b8b8b8b8b600062001ffc565b73ffffffffffffffffffffffffffffffffffffffff861662000b01576040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a7a9190620038e6565b60006040518083038185875af1925050503d806000811462000ab9576040519150601f19603f3d011682016040523d82523d6000602084013e62000abe565b606091505b505090508062000afa576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000efc565b60685463ffffffff61010090910481169088160362000b435762000b3d73ffffffffffffffffffffffffffffffffffffffff87168585620021ed565b62000efc565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b166024820152600090603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e6e576000808062000c1886880188620039fb565b92509250925060008584848460405162000c329062003292565b62000c409392919062003abd565b8190604051809103906000f590508015801562000c61573d6000803e3d6000fd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f1990604401600060405180830381600087803b15801562000cd757600080fd5b505af115801562000cec573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e5c95949392919062003afa565b60405180910390a15050505062000ef9565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f1990604401600060405180830381600087803b15801562000edf57600080fd5b505af115801562000ef4573d6000803e3d6000fd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000fb2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000fc98b8b8b8b8b8b8b8b8b8b8b600162001ffc565b60008473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000ffc949392919062003b42565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200107f9190620038e6565b60006040518083038185875af1925050503d8060008114620010be576040519150601f19603f3d011682016040523d82523d6000602084013e620010c3565b606091505b5050905080620010ff576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b605354600090819081805b602081101562001255578083901c600116600103620011e65760338160208110620011b257620011b262003b8a565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062001213565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806200124c9062003be8565b91505062001183565b50919392505050565b600054610100900460ff16158080156200127f5750600054600160ff909116105b806200129b5750303b1580156200129b575060005460ff166001145b6200132d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200138c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001691841691909117905562001443620022c3565b8015620014a757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000703576200070362001f27565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201526000908190603801604051602081830303815290604052805190602001209050600060ff60f81b3083604051806020016200157d9062003292565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620015c8908d908d908d908d908d9060200162003c23565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001606929160200162003c64565b604051602081830303815290604052805190602001206040516020016200168f94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff161562001711576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200171b62002366565b60685463ffffffff888116610100909204161480620017415750600263ffffffff881610155b1562001779576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060608773ffffffffffffffffffffffffffffffffffffffff8816620017df57883414620017d5576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000925062001ad9565b341562001818576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089166000908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901562001908576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac90604401600060405180830381600087803b158015620018db57600080fd5b505af1158015620018f0573d6000803e3d6000fd5b50505050806020015194508060000151935062001ad7565b85156200191d576200191d898b8989620023db565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200198b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620019b1919062003c97565b9050620019d773ffffffffffffffffffffffffffffffffffffffff8b1633308e620028f9565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa15801562001a45573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a6b919062003c97565b905062001a79828262003cb1565b6068548c9850610100900463ffffffff169650935062001a998762002959565b62001aa48c62002a71565b62001aaf8d62002b7e565b60405160200162001ac39392919062003abd565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e868860535460405162001b1b98979695949392919062003cc7565b60405180910390a162001c0f620009b2600085878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b861562001c205762001c2062001f27565b5050505062001c2e60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c89576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200070362002c80565b600084815b602081101562001d6e57600163ffffffff8616821c8116900362001d0a5785816020811062001ccb5762001ccb62003b8a565b60200201358260405160200162001cec929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001d59565b8186826020811062001d205762001d2062003b8a565b602002013560405160200162001d40929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d658162003be8565b91505062001c98565b50821490505b949350505050565b60685460ff161562001dba576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b80600162001e216020600262003e79565b62001e2d919062003cb1565b6053541062001e68576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060536000815462001e7b9062003be8565b9182905550905060005b602081101562001f17578082901c60011660010362001ebd57826033826020811062001eb55762001eb562003b8a565b015550505050565b6033816020811062001ed35762001ed362003b8a565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001f0e9062003be8565b91505062001e85565b5062001f2262003e87565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001fad62001178565b6040518263ffffffff1660e01b815260040162001fcc91815260200190565b600060405180830381600087803b15801562001fe757600080fd5b505af1158015620014a7573d6000803e3d6000fd5b6200200d8b63ffffffff1662002d10565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b363200000000000000000000000000000000000000000000000000000000909252606481019190915260009165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303816000875af1158015620020b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620020d6919062003c97565b90508060000362002112576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff88811661010090920416146200215c576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606854600090610100900463ffffffff166200217a5750896200217d565b508a5b620021a66200219d848c8c8c8c8c8c8c604051620008d592919062003881565b8f8f8462001c93565b620021dd576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001f229084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002d75565b600054610100900460ff166200235c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001324565b6200070362002e88565b600260015403620023d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001324565b6002600155565b6000620023ec600482848662003eb6565b620023f79162003ee2565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620026765760008080808080806200245a896004818d62003eb6565b81019062002469919062003f2b565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614620024dd576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff861630146200252d576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002567576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620026229190620038e6565b6000604051808303816000865af19150503d806000811462002661576040519150601f19603f3d011682016040523d82523d6000602084013e62002666565b606091505b50505050505050505050620009c9565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c0000000000000000000000000000000000000000000000000000000014620026f2576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808080808080806200270a8a6004818e62003eb6565b81019062002719919062003f86565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146200278f576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87163014620027df576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f1691620028a39190620038e6565b6000604051808303816000865af19150503d8060008114620028e2576040519150601f19603f3d011682016040523d82523d6000602084013e620028e7565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014a79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002240565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691620029dd9190620038e6565b600060405180830381855afa9150503d806000811462002a1a576040519150601f19603f3d011682016040523d82523d6000602084013e62002a1f565b606091505b50915091508162002a66576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d74565b62001d748162002f21565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162002af59190620038e6565b600060405180830381855afa9150503d806000811462002b32576040519150601f19603f3d011682016040523d82523d6000602084013e62002b37565b606091505b50915091508162002a66576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d74565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169162002c019190620038e6565b600060405180830381855afa9150503d806000811462002c3e576040519150601f19603f3d011682016040523d82523d6000602084013e62002c43565b606091505b509150915081801562002c57575080516020145b62002c6457601262001d74565b8080602001905181019062001d74919062004012565b60018055565b60685460ff1662002cbd576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600881901c60008181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009c9576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600062002dd9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031119092919063ffffffff16565b80519091501562001f22578080602001905181019062002dfa919062004032565b62001f22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001324565b600054610100900460ff1662002c7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001324565b6060604082511062002f435781806020019051810190620007a2919062004052565b8151602003620030d35760005b60208110801562002f9b575082818151811062002f715762002f7162003b8a565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002fb6578062002fad8162003be8565b91505062002f50565b8060000362002ffa57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111562003018576200301862003891565b6040519080825280601f01601f19166020018201604052801562003043576020820181803683370190505b50905060005b82811015620030cb5784818151811062003067576200306762003b8a565b602001015160f81c60f81b82828151811062003087576200308762003b8a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080620030c28162003be8565b91505062003049565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d748484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051620031489190620038e6565b60006040518083038185875af1925050503d806000811462003187576040519150601f19603f3d011682016040523d82523d6000602084013e6200318c565b606091505b50915091506200319f87838387620031aa565b979650505050505050565b60608315620032455782516000036200323d5773ffffffffffffffffffffffffffffffffffffffff85163b6200323d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001324565b508162001d74565b62001d7483838151156200325c5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620013249190620040d2565b611b6680620040e883390190565b803563ffffffff811681146200310c57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620032d857600080fd5b50565b60008060408385031215620032ef57600080fd5b620032fa83620032a0565b915060208301356200330c81620032b5565b809150509250929050565b8015158114620032d857600080fd5b60008083601f8401126200333957600080fd5b50813567ffffffffffffffff8111156200335257600080fd5b6020830191508360208285010111156200336b57600080fd5b9250929050565b6000806000806000608086880312156200338b57600080fd5b6200339686620032a0565b94506020860135620033a881620032b5565b93506040860135620033ba8162003317565b9250606086013567ffffffffffffffff811115620033d757600080fd5b620033e58882890162003326565b969995985093965092949392505050565b806104008101831015620007a257600080fd5b60008060008060008060008060008060006105208c8e0312156200342c57600080fd5b620034388d8d620033f6565b9a50620034496104008d01620032a0565b99506104208c013598506104408c013597506200346a6104608d01620032a0565b96506104808c01356200347d81620032b5565b95506200348e6104a08d01620032a0565b94506104c08c0135620034a181620032b5565b93506104e08c013592506105008c013567ffffffffffffffff811115620034c757600080fd5b620034d58e828f0162003326565b915080935050809150509295989b509295989b9093969950565b6000602082840312156200350257600080fd5b81356200350f81620032b5565b9392505050565b60ff81168114620032d857600080fd5b600080600080600080600060e0888a0312156200354257600080fd5b87356200354f8162003516565b96506200355f60208901620032a0565b955060408801356200357181620032b5565b94506200358160608901620032a0565b935060808801356200359381620032b5565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215620035c657600080fd5b620035d184620032a0565b92506020840135620035e381620032b5565b91506040840135620035f581620032b5565b809150509250925092565b6000602082840312156200361357600080fd5b5035919050565b600080600080600080600060a0888a0312156200363657600080fd5b6200364188620032a0565b965060208801356200365381620032b5565b9550604088013567ffffffffffffffff808211156200367157600080fd5b6200367f8b838c0162003326565b909750955060608a01359150808211156200369957600080fd5b50620036a88a828b0162003326565b9094509250506080880135620036be8162003516565b8091505092959891949750929550565b600080600080600080600060c0888a031215620036ea57600080fd5b620036f588620032a0565b965060208801356200370781620032b5565b95506040880135945060608801356200372081620032b5565b93506080880135620037328162003317565b925060a088013567ffffffffffffffff8111156200374f57600080fd5b6200375d8a828b0162003326565b989b979a50959850939692959293505050565b60008060008061046085870312156200378857600080fd5b843593506200379b8660208701620033f6565b9250620037ac6104208601620032a0565b939692955092936104400135925050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600061010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620038678285018789620037bd565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b83811015620038dd578181015183820152602001620038c3565b50506000910152565b60008251620038fa818460208701620038c0565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156200394e576200394e62003891565b604052919050565b600067ffffffffffffffff82111562003973576200397362003891565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112620039b157600080fd5b8135620039c8620039c28262003956565b62003904565b818152846020838601011115620039de57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562003a1157600080fd5b833567ffffffffffffffff8082111562003a2a57600080fd5b62003a38878388016200399f565b9450602086013591508082111562003a4f57600080fd5b5062003a5e868287016200399f565b9250506040840135620035f58162003516565b6000815180845262003a8b816020860160208601620038c0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60608152600062003ad2606083018662003a71565b828103602084015262003ae6818662003a71565b91505060ff83166040830152949350505050565b63ffffffff86168152600073ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200319f608083018486620037bd565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff8416602082015260606040820152600062003b80606083018486620037bd565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003c1c5762003c1c62003bb9565b5060010190565b60608152600062003c39606083018789620037bd565b828103602084015262003c4e818688620037bd565b91505060ff831660408301529695505050505050565b6000835162003c78818460208801620038c0565b83519083019062003c8e818360208801620038c0565b01949350505050565b60006020828403121562003caa57600080fd5b5051919050565b81810381811115620007a257620007a262003bb9565b600061010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003d278285018762003a71565b925080851660e085015250509998505050505050505050565b600181815b8085111562003d9f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d835762003d8362003bb9565b8085161562003d9157918102915b93841c939080029062003d45565b509250929050565b60008262003db857506001620007a2565b8162003dc757506000620007a2565b816001811462003de0576002811462003deb5762003e0b565b6001915050620007a2565b60ff84111562003dff5762003dff62003bb9565b50506001821b620007a2565b5060208310610133831016604e8410600b841016171562003e30575081810a620007a2565b62003e3c838362003d40565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003e715762003e7162003bb9565b029392505050565b60006200350f838362003da7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000808585111562003ec757600080fd5b8386111562003ed557600080fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003f235780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a03121562003f4757600080fd5b873562003f5481620032b5565b9650602088013562003f6681620032b5565b955060408801359450606088013593506080880135620035938162003516565b600080600080600080600080610100898b03121562003fa457600080fd5b883562003fb181620032b5565b9750602089013562003fc381620032b5565b96506040890135955060608901359450608089013562003fe38162003317565b935060a089013562003ff58162003516565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200402557600080fd5b81516200350f8162003516565b6000602082840312156200404557600080fd5b81516200350f8162003317565b6000602082840312156200406557600080fd5b815167ffffffffffffffff8111156200407d57600080fd5b8201601f810184136200408f57600080fd5b8051620040a0620039c28262003956565b818152856020838501011115620040b657600080fd5b620040c9826020830160208601620038c0565b95945050505050565b6020815260006200350f602083018462003a7156fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212206fe049be388a1d04319b9913fe6d100c4c8e272fe0f5748eb056bd0622beabcc64736f6c63430008140033a2646970667358221220ef4412c515d53043ca441d4b33288d9aa2b101bc9853f859467ab1a42f16139c64736f6c63430008140033", + "bytecode": "0x608060405234801561001057600080fd5b50615c83806100206000396000f3fe6080604052600436106200019f5760003560e01c8063647c576c11620000e7578063be5831c71162000089578063dbc169761162000060578063dbc169761462000639578063ee25560b1462000651578063fb570834146200068257600080fd5b8063be5831c714620005ae578063cd58657914620005ea578063d02103ca146200060157600080fd5b80639e34070f11620000be5780639e34070f146200050a578063aaa13cc2146200054f578063bab161bf146200057457600080fd5b8063647c576c146200048657806379e2cf9714620004ab57806381b1c17414620004c357600080fd5b80632d2c9d94116200015157806334ac9cf2116200012857806334ac9cf2146200034b5780633ae05047146200037a5780633e197043146200039257600080fd5b80632d2c9d9414620002765780632dfdf0b5146200029b578063318aee3d14620002c257600080fd5b806322e95f2c116200018657806322e95f2c14620001ef578063240ff378146200023a5780632cffd02e146200025157600080fd5b806315064c9614620001a45780632072f6c514620001d5575b600080fd5b348015620001b157600080fd5b50606854620001c09060ff1681565b60405190151581526020015b60405180910390f35b348015620001e257600080fd5b50620001ed620006a7565b005b348015620001fc57600080fd5b50620002146200020e366004620032db565b62000705565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001cc565b620001ed6200024b36600462003372565b620007a8565b3480156200025e57600080fd5b50620001ed6200027036600462003409565b620009d0565b3480156200028357600080fd5b50620001ed6200029536600462003409565b62000f74565b348015620002a857600080fd5b50620002b360535481565b604051908152602001620001cc565b348015620002cf57600080fd5b5062000319620002e1366004620034ef565b606b6020526000908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001cc565b3480156200035857600080fd5b50606c54620002149073ffffffffffffffffffffffffffffffffffffffff1681565b3480156200038757600080fd5b50620002b362001178565b3480156200039f57600080fd5b50620002b3620003b136600462003526565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200049357600080fd5b50620001ed620004a5366004620035b0565b6200125e565b348015620004b857600080fd5b50620001ed620014ad565b348015620004d057600080fd5b5062000214620004e236600462003600565b606a6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200051757600080fd5b50620001c06200052936600462003600565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b3480156200055c57600080fd5b50620002146200056e3660046200361a565b620014e7565b3480156200058157600080fd5b506068546200059890610100900463ffffffff1681565b60405163ffffffff9091168152602001620001cc565b348015620005bb57600080fd5b506068546200059890790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001ed620005fb366004620036ce565b620016d3565b3480156200060e57600080fd5b50606854620002149065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200064657600080fd5b50620001ed62001c37565b3480156200065e57600080fd5b50620002b36200067036600462003600565b60696020526000908152604090205481565b3480156200068f57600080fd5b50620001c0620006a136600462003770565b62001c93565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006f9576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200070362001d7c565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091206000908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007e6576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8681166101009092041614806200080c5750600263ffffffff861610155b1562000844576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff163388883488886053546040516200089a9998979695949392919062003806565b60405180910390a1620009b8620009b26001606860019054906101000a900463ffffffff16338989348989604051620008d592919062003881565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b62001e10565b8215620009c957620009c962001f27565b5050505050565b60685460ff161562000a0e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000a258b8b8b8b8b8b8b8b8b8b8b600062001ffc565b73ffffffffffffffffffffffffffffffffffffffff861662000b01576040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a7a9190620038e6565b60006040518083038185875af1925050503d806000811462000ab9576040519150601f19603f3d011682016040523d82523d6000602084013e62000abe565b606091505b505090508062000afa576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000efc565b60685463ffffffff61010090910481169088160362000b435762000b3d73ffffffffffffffffffffffffffffffffffffffff87168585620021ed565b62000efc565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b166024820152600090603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e6e576000808062000c1886880188620039fb565b92509250925060008584848460405162000c329062003292565b62000c409392919062003abd565b8190604051809103906000f590508015801562000c61573d6000803e3d6000fd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f1990604401600060405180830381600087803b15801562000cd757600080fd5b505af115801562000cec573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e5c95949392919062003afa565b60405180910390a15050505062000ef9565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f1990604401600060405180830381600087803b15801562000edf57600080fd5b505af115801562000ef4573d6000803e3d6000fd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000fb2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000fc98b8b8b8b8b8b8b8b8b8b8b600162001ffc565b60008473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000ffc949392919062003b42565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200107f9190620038e6565b60006040518083038185875af1925050503d8060008114620010be576040519150601f19603f3d011682016040523d82523d6000602084013e620010c3565b606091505b5050905080620010ff576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b605354600090819081805b602081101562001255578083901c600116600103620011e65760338160208110620011b257620011b262003b8a565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062001213565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806200124c9062003be8565b91505062001183565b50919392505050565b600054610100900460ff16158080156200127f5750600054600160ff909116105b806200129b5750303b1580156200129b575060005460ff166001145b6200132d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200138c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001691841691909117905562001443620022c3565b8015620014a757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000703576200070362001f27565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201526000908190603801604051602081830303815290604052805190602001209050600060ff60f81b3083604051806020016200157d9062003292565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620015c8908d908d908d908d908d9060200162003c23565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001606929160200162003c64565b604051602081830303815290604052805190602001206040516020016200168f94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff161562001711576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200171b62002366565b60685463ffffffff888116610100909204161480620017415750600263ffffffff881610155b1562001779576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060608773ffffffffffffffffffffffffffffffffffffffff8816620017df57883414620017d5576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000925062001ad9565b341562001818576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089166000908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901562001908576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac90604401600060405180830381600087803b158015620018db57600080fd5b505af1158015620018f0573d6000803e3d6000fd5b50505050806020015194508060000151935062001ad7565b85156200191d576200191d898b8989620023db565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200198b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620019b1919062003c97565b9050620019d773ffffffffffffffffffffffffffffffffffffffff8b1633308e620028f9565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa15801562001a45573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a6b919062003c97565b905062001a79828262003cb1565b6068548c9850610100900463ffffffff169650935062001a998762002959565b62001aa48c62002a71565b62001aaf8d62002b7e565b60405160200162001ac39392919062003abd565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e868860535460405162001b1b98979695949392919062003cc7565b60405180910390a162001c0f620009b2600085878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b861562001c205762001c2062001f27565b5050505062001c2e60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c89576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200070362002c80565b600084815b602081101562001d6e57600163ffffffff8616821c8116900362001d0a5785816020811062001ccb5762001ccb62003b8a565b60200201358260405160200162001cec929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001d59565b8186826020811062001d205762001d2062003b8a565b602002013560405160200162001d40929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d658162003be8565b91505062001c98565b50821490505b949350505050565b60685460ff161562001dba576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b80600162001e216020600262003e79565b62001e2d919062003cb1565b6053541062001e68576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060536000815462001e7b9062003be8565b9182905550905060005b602081101562001f17578082901c60011660010362001ebd57826033826020811062001eb55762001eb562003b8a565b015550505050565b6033816020811062001ed35762001ed362003b8a565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001f0e9062003be8565b91505062001e85565b5062001f2262003e87565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001fad62001178565b6040518263ffffffff1660e01b815260040162001fcc91815260200190565b600060405180830381600087803b15801562001fe757600080fd5b505af1158015620014a7573d6000803e3d6000fd5b6200200d8b63ffffffff1662002d10565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b363200000000000000000000000000000000000000000000000000000000909252606481019190915260009165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303816000875af1158015620020b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620020d6919062003c97565b90508060000362002112576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff88811661010090920416146200215c576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606854600090610100900463ffffffff166200217a5750896200217d565b508a5b620021a66200219d848c8c8c8c8c8c8c604051620008d592919062003881565b8f8f8462001c93565b620021dd576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001f229084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002d75565b600054610100900460ff166200235c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001324565b6200070362002e88565b600260015403620023d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001324565b6002600155565b6000620023ec600482848662003eb6565b620023f79162003ee2565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620026765760008080808080806200245a896004818d62003eb6565b81019062002469919062003f2b565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614620024dd576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff861630146200252d576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002567576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620026229190620038e6565b6000604051808303816000865af19150503d806000811462002661576040519150601f19603f3d011682016040523d82523d6000602084013e62002666565b606091505b50505050505050505050620009c9565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c0000000000000000000000000000000000000000000000000000000014620026f2576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808080808080806200270a8a6004818e62003eb6565b81019062002719919062003f86565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146200278f576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87163014620027df576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f1691620028a39190620038e6565b6000604051808303816000865af19150503d8060008114620028e2576040519150601f19603f3d011682016040523d82523d6000602084013e620028e7565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014a79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002240565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691620029dd9190620038e6565b600060405180830381855afa9150503d806000811462002a1a576040519150601f19603f3d011682016040523d82523d6000602084013e62002a1f565b606091505b50915091508162002a66576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d74565b62001d748162002f21565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162002af59190620038e6565b600060405180830381855afa9150503d806000811462002b32576040519150601f19603f3d011682016040523d82523d6000602084013e62002b37565b606091505b50915091508162002a66576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d74565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169162002c019190620038e6565b600060405180830381855afa9150503d806000811462002c3e576040519150601f19603f3d011682016040523d82523d6000602084013e62002c43565b606091505b509150915081801562002c57575080516020145b62002c6457601262001d74565b8080602001905181019062001d74919062004012565b60018055565b60685460ff1662002cbd576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600881901c60008181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009c9576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600062002dd9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031119092919063ffffffff16565b80519091501562001f22578080602001905181019062002dfa919062004032565b62001f22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001324565b600054610100900460ff1662002c7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001324565b6060604082511062002f435781806020019051810190620007a2919062004052565b8151602003620030d35760005b60208110801562002f9b575082818151811062002f715762002f7162003b8a565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002fb6578062002fad8162003be8565b91505062002f50565b8060000362002ffa57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111562003018576200301862003891565b6040519080825280601f01601f19166020018201604052801562003043576020820181803683370190505b50905060005b82811015620030cb5784818151811062003067576200306762003b8a565b602001015160f81c60f81b82828151811062003087576200308762003b8a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080620030c28162003be8565b91505062003049565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d748484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051620031489190620038e6565b60006040518083038185875af1925050503d806000811462003187576040519150601f19603f3d011682016040523d82523d6000602084013e6200318c565b606091505b50915091506200319f87838387620031aa565b979650505050505050565b60608315620032455782516000036200323d5773ffffffffffffffffffffffffffffffffffffffff85163b6200323d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001324565b508162001d74565b62001d7483838151156200325c5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620013249190620040d2565b611b6680620040e883390190565b803563ffffffff811681146200310c57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620032d857600080fd5b50565b60008060408385031215620032ef57600080fd5b620032fa83620032a0565b915060208301356200330c81620032b5565b809150509250929050565b8015158114620032d857600080fd5b60008083601f8401126200333957600080fd5b50813567ffffffffffffffff8111156200335257600080fd5b6020830191508360208285010111156200336b57600080fd5b9250929050565b6000806000806000608086880312156200338b57600080fd5b6200339686620032a0565b94506020860135620033a881620032b5565b93506040860135620033ba8162003317565b9250606086013567ffffffffffffffff811115620033d757600080fd5b620033e58882890162003326565b969995985093965092949392505050565b806104008101831015620007a257600080fd5b60008060008060008060008060008060006105208c8e0312156200342c57600080fd5b620034388d8d620033f6565b9a50620034496104008d01620032a0565b99506104208c013598506104408c013597506200346a6104608d01620032a0565b96506104808c01356200347d81620032b5565b95506200348e6104a08d01620032a0565b94506104c08c0135620034a181620032b5565b93506104e08c013592506105008c013567ffffffffffffffff811115620034c757600080fd5b620034d58e828f0162003326565b915080935050809150509295989b509295989b9093969950565b6000602082840312156200350257600080fd5b81356200350f81620032b5565b9392505050565b60ff81168114620032d857600080fd5b600080600080600080600060e0888a0312156200354257600080fd5b87356200354f8162003516565b96506200355f60208901620032a0565b955060408801356200357181620032b5565b94506200358160608901620032a0565b935060808801356200359381620032b5565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215620035c657600080fd5b620035d184620032a0565b92506020840135620035e381620032b5565b91506040840135620035f581620032b5565b809150509250925092565b6000602082840312156200361357600080fd5b5035919050565b600080600080600080600060a0888a0312156200363657600080fd5b6200364188620032a0565b965060208801356200365381620032b5565b9550604088013567ffffffffffffffff808211156200367157600080fd5b6200367f8b838c0162003326565b909750955060608a01359150808211156200369957600080fd5b50620036a88a828b0162003326565b9094509250506080880135620036be8162003516565b8091505092959891949750929550565b600080600080600080600060c0888a031215620036ea57600080fd5b620036f588620032a0565b965060208801356200370781620032b5565b95506040880135945060608801356200372081620032b5565b93506080880135620037328162003317565b925060a088013567ffffffffffffffff8111156200374f57600080fd5b6200375d8a828b0162003326565b989b979a50959850939692959293505050565b60008060008061046085870312156200378857600080fd5b843593506200379b8660208701620033f6565b9250620037ac6104208601620032a0565b939692955092936104400135925050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600061010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620038678285018789620037bd565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b83811015620038dd578181015183820152602001620038c3565b50506000910152565b60008251620038fa818460208701620038c0565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156200394e576200394e62003891565b604052919050565b600067ffffffffffffffff82111562003973576200397362003891565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112620039b157600080fd5b8135620039c8620039c28262003956565b62003904565b818152846020838601011115620039de57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562003a1157600080fd5b833567ffffffffffffffff8082111562003a2a57600080fd5b62003a38878388016200399f565b9450602086013591508082111562003a4f57600080fd5b5062003a5e868287016200399f565b9250506040840135620035f58162003516565b6000815180845262003a8b816020860160208601620038c0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60608152600062003ad2606083018662003a71565b828103602084015262003ae6818662003a71565b91505060ff83166040830152949350505050565b63ffffffff86168152600073ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200319f608083018486620037bd565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff8416602082015260606040820152600062003b80606083018486620037bd565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003c1c5762003c1c62003bb9565b5060010190565b60608152600062003c39606083018789620037bd565b828103602084015262003c4e818688620037bd565b91505060ff831660408301529695505050505050565b6000835162003c78818460208801620038c0565b83519083019062003c8e818360208801620038c0565b01949350505050565b60006020828403121562003caa57600080fd5b5051919050565b81810381811115620007a257620007a262003bb9565b600061010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003d278285018762003a71565b925080851660e085015250509998505050505050505050565b600181815b8085111562003d9f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d835762003d8362003bb9565b8085161562003d9157918102915b93841c939080029062003d45565b509250929050565b60008262003db857506001620007a2565b8162003dc757506000620007a2565b816001811462003de0576002811462003deb5762003e0b565b6001915050620007a2565b60ff84111562003dff5762003dff62003bb9565b50506001821b620007a2565b5060208310610133831016604e8410600b841016171562003e30575081810a620007a2565b62003e3c838362003d40565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003e715762003e7162003bb9565b029392505050565b60006200350f838362003da7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000808585111562003ec757600080fd5b8386111562003ed557600080fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003f235780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a03121562003f4757600080fd5b873562003f5481620032b5565b9650602088013562003f6681620032b5565b955060408801359450606088013593506080880135620035938162003516565b600080600080600080600080610100898b03121562003fa457600080fd5b883562003fb181620032b5565b9750602089013562003fc381620032b5565b96506040890135955060608901359450608089013562003fe38162003317565b935060a089013562003ff58162003516565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200402557600080fd5b81516200350f8162003516565b6000602082840312156200404557600080fd5b81516200350f8162003317565b6000602082840312156200406557600080fd5b815167ffffffffffffffff8111156200407d57600080fd5b8201601f810184136200408f57600080fd5b8051620040a0620039c28262003956565b818152856020838501011115620040b657600080fd5b620040c9826020830160208601620038c0565b95945050505050565b6020815260006200350f602083018462003a7156fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212206fe049be388a1d04319b9913fe6d100c4c8e272fe0f5748eb056bd0622beabcc64736f6c63430008140033a26469706673582212205e825f08fed9eccdd780300bb75246eabdc5a004a933a09442baa89c981e174464736f6c63430008140033", + "deployedBytecode": "0x6080604052600436106200019f5760003560e01c8063647c576c11620000e7578063be5831c71162000089578063dbc169761162000060578063dbc169761462000639578063ee25560b1462000651578063fb570834146200068257600080fd5b8063be5831c714620005ae578063cd58657914620005ea578063d02103ca146200060157600080fd5b80639e34070f11620000be5780639e34070f146200050a578063aaa13cc2146200054f578063bab161bf146200057457600080fd5b8063647c576c146200048657806379e2cf9714620004ab57806381b1c17414620004c357600080fd5b80632d2c9d94116200015157806334ac9cf2116200012857806334ac9cf2146200034b5780633ae05047146200037a5780633e197043146200039257600080fd5b80632d2c9d9414620002765780632dfdf0b5146200029b578063318aee3d14620002c257600080fd5b806322e95f2c116200018657806322e95f2c14620001ef578063240ff378146200023a5780632cffd02e146200025157600080fd5b806315064c9614620001a45780632072f6c514620001d5575b600080fd5b348015620001b157600080fd5b50606854620001c09060ff1681565b60405190151581526020015b60405180910390f35b348015620001e257600080fd5b50620001ed620006a7565b005b348015620001fc57600080fd5b50620002146200020e366004620032db565b62000705565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001cc565b620001ed6200024b36600462003372565b620007a8565b3480156200025e57600080fd5b50620001ed6200027036600462003409565b620009d0565b3480156200028357600080fd5b50620001ed6200029536600462003409565b62000f74565b348015620002a857600080fd5b50620002b360535481565b604051908152602001620001cc565b348015620002cf57600080fd5b5062000319620002e1366004620034ef565b606b6020526000908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001cc565b3480156200035857600080fd5b50606c54620002149073ffffffffffffffffffffffffffffffffffffffff1681565b3480156200038757600080fd5b50620002b362001178565b3480156200039f57600080fd5b50620002b3620003b136600462003526565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200049357600080fd5b50620001ed620004a5366004620035b0565b6200125e565b348015620004b857600080fd5b50620001ed620014ad565b348015620004d057600080fd5b5062000214620004e236600462003600565b606a6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200051757600080fd5b50620001c06200052936600462003600565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b3480156200055c57600080fd5b50620002146200056e3660046200361a565b620014e7565b3480156200058157600080fd5b506068546200059890610100900463ffffffff1681565b60405163ffffffff9091168152602001620001cc565b348015620005bb57600080fd5b506068546200059890790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001ed620005fb366004620036ce565b620016d3565b3480156200060e57600080fd5b50606854620002149065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200064657600080fd5b50620001ed62001c37565b3480156200065e57600080fd5b50620002b36200067036600462003600565b60696020526000908152604090205481565b3480156200068f57600080fd5b50620001c0620006a136600462003770565b62001c93565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006f9576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200070362001d7c565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091206000908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007e6576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8681166101009092041614806200080c5750600263ffffffff861610155b1562000844576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff163388883488886053546040516200089a9998979695949392919062003806565b60405180910390a1620009b8620009b26001606860019054906101000a900463ffffffff16338989348989604051620008d592919062003881565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b62001e10565b8215620009c957620009c962001f27565b5050505050565b60685460ff161562000a0e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000a258b8b8b8b8b8b8b8b8b8b8b600062001ffc565b73ffffffffffffffffffffffffffffffffffffffff861662000b01576040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a7a9190620038e6565b60006040518083038185875af1925050503d806000811462000ab9576040519150601f19603f3d011682016040523d82523d6000602084013e62000abe565b606091505b505090508062000afa576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000efc565b60685463ffffffff61010090910481169088160362000b435762000b3d73ffffffffffffffffffffffffffffffffffffffff87168585620021ed565b62000efc565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b166024820152600090603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e6e576000808062000c1886880188620039fb565b92509250925060008584848460405162000c329062003292565b62000c409392919062003abd565b8190604051809103906000f590508015801562000c61573d6000803e3d6000fd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f1990604401600060405180830381600087803b15801562000cd757600080fd5b505af115801562000cec573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e5c95949392919062003afa565b60405180910390a15050505062000ef9565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f1990604401600060405180830381600087803b15801562000edf57600080fd5b505af115801562000ef4573d6000803e3d6000fd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000fb2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000fc98b8b8b8b8b8b8b8b8b8b8b600162001ffc565b60008473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000ffc949392919062003b42565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200107f9190620038e6565b60006040518083038185875af1925050503d8060008114620010be576040519150601f19603f3d011682016040523d82523d6000602084013e620010c3565b606091505b5050905080620010ff576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b605354600090819081805b602081101562001255578083901c600116600103620011e65760338160208110620011b257620011b262003b8a565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062001213565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806200124c9062003be8565b91505062001183565b50919392505050565b600054610100900460ff16158080156200127f5750600054600160ff909116105b806200129b5750303b1580156200129b575060005460ff166001145b6200132d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200138c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001691841691909117905562001443620022c3565b8015620014a757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000703576200070362001f27565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201526000908190603801604051602081830303815290604052805190602001209050600060ff60f81b3083604051806020016200157d9062003292565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620015c8908d908d908d908d908d9060200162003c23565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001606929160200162003c64565b604051602081830303815290604052805190602001206040516020016200168f94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff161562001711576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200171b62002366565b60685463ffffffff888116610100909204161480620017415750600263ffffffff881610155b1562001779576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060608773ffffffffffffffffffffffffffffffffffffffff8816620017df57883414620017d5576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000925062001ad9565b341562001818576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089166000908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901562001908576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac90604401600060405180830381600087803b158015620018db57600080fd5b505af1158015620018f0573d6000803e3d6000fd5b50505050806020015194508060000151935062001ad7565b85156200191d576200191d898b8989620023db565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200198b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620019b1919062003c97565b9050620019d773ffffffffffffffffffffffffffffffffffffffff8b1633308e620028f9565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa15801562001a45573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a6b919062003c97565b905062001a79828262003cb1565b6068548c9850610100900463ffffffff169650935062001a998762002959565b62001aa48c62002a71565b62001aaf8d62002b7e565b60405160200162001ac39392919062003abd565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e868860535460405162001b1b98979695949392919062003cc7565b60405180910390a162001c0f620009b2600085878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b861562001c205762001c2062001f27565b5050505062001c2e60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c89576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200070362002c80565b600084815b602081101562001d6e57600163ffffffff8616821c8116900362001d0a5785816020811062001ccb5762001ccb62003b8a565b60200201358260405160200162001cec929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001d59565b8186826020811062001d205762001d2062003b8a565b602002013560405160200162001d40929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d658162003be8565b91505062001c98565b50821490505b949350505050565b60685460ff161562001dba576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b80600162001e216020600262003e79565b62001e2d919062003cb1565b6053541062001e68576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060536000815462001e7b9062003be8565b9182905550905060005b602081101562001f17578082901c60011660010362001ebd57826033826020811062001eb55762001eb562003b8a565b015550505050565b6033816020811062001ed35762001ed362003b8a565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001f0e9062003be8565b91505062001e85565b5062001f2262003e87565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001fad62001178565b6040518263ffffffff1660e01b815260040162001fcc91815260200190565b600060405180830381600087803b15801562001fe757600080fd5b505af1158015620014a7573d6000803e3d6000fd5b6200200d8b63ffffffff1662002d10565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b363200000000000000000000000000000000000000000000000000000000909252606481019190915260009165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303816000875af1158015620020b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620020d6919062003c97565b90508060000362002112576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff88811661010090920416146200215c576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606854600090610100900463ffffffff166200217a5750896200217d565b508a5b620021a66200219d848c8c8c8c8c8c8c604051620008d592919062003881565b8f8f8462001c93565b620021dd576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001f229084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002d75565b600054610100900460ff166200235c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001324565b6200070362002e88565b600260015403620023d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001324565b6002600155565b6000620023ec600482848662003eb6565b620023f79162003ee2565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620026765760008080808080806200245a896004818d62003eb6565b81019062002469919062003f2b565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614620024dd576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff861630146200252d576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002567576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620026229190620038e6565b6000604051808303816000865af19150503d806000811462002661576040519150601f19603f3d011682016040523d82523d6000602084013e62002666565b606091505b50505050505050505050620009c9565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c0000000000000000000000000000000000000000000000000000000014620026f2576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808080808080806200270a8a6004818e62003eb6565b81019062002719919062003f86565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146200278f576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87163014620027df576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f1691620028a39190620038e6565b6000604051808303816000865af19150503d8060008114620028e2576040519150601f19603f3d011682016040523d82523d6000602084013e620028e7565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014a79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002240565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691620029dd9190620038e6565b600060405180830381855afa9150503d806000811462002a1a576040519150601f19603f3d011682016040523d82523d6000602084013e62002a1f565b606091505b50915091508162002a66576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d74565b62001d748162002f21565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162002af59190620038e6565b600060405180830381855afa9150503d806000811462002b32576040519150601f19603f3d011682016040523d82523d6000602084013e62002b37565b606091505b50915091508162002a66576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d74565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169162002c019190620038e6565b600060405180830381855afa9150503d806000811462002c3e576040519150601f19603f3d011682016040523d82523d6000602084013e62002c43565b606091505b509150915081801562002c57575080516020145b62002c6457601262001d74565b8080602001905181019062001d74919062004012565b60018055565b60685460ff1662002cbd576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600881901c60008181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009c9576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600062002dd9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031119092919063ffffffff16565b80519091501562001f22578080602001905181019062002dfa919062004032565b62001f22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001324565b600054610100900460ff1662002c7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001324565b6060604082511062002f435781806020019051810190620007a2919062004052565b8151602003620030d35760005b60208110801562002f9b575082818151811062002f715762002f7162003b8a565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002fb6578062002fad8162003be8565b91505062002f50565b8060000362002ffa57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111562003018576200301862003891565b6040519080825280601f01601f19166020018201604052801562003043576020820181803683370190505b50905060005b82811015620030cb5784818151811062003067576200306762003b8a565b602001015160f81c60f81b82828151811062003087576200308762003b8a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080620030c28162003be8565b91505062003049565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d748484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051620031489190620038e6565b60006040518083038185875af1925050503d806000811462003187576040519150601f19603f3d011682016040523d82523d6000602084013e6200318c565b606091505b50915091506200319f87838387620031aa565b979650505050505050565b60608315620032455782516000036200323d5773ffffffffffffffffffffffffffffffffffffffff85163b6200323d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001324565b508162001d74565b62001d7483838151156200325c5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620013249190620040d2565b611b6680620040e883390190565b803563ffffffff811681146200310c57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620032d857600080fd5b50565b60008060408385031215620032ef57600080fd5b620032fa83620032a0565b915060208301356200330c81620032b5565b809150509250929050565b8015158114620032d857600080fd5b60008083601f8401126200333957600080fd5b50813567ffffffffffffffff8111156200335257600080fd5b6020830191508360208285010111156200336b57600080fd5b9250929050565b6000806000806000608086880312156200338b57600080fd5b6200339686620032a0565b94506020860135620033a881620032b5565b93506040860135620033ba8162003317565b9250606086013567ffffffffffffffff811115620033d757600080fd5b620033e58882890162003326565b969995985093965092949392505050565b806104008101831015620007a257600080fd5b60008060008060008060008060008060006105208c8e0312156200342c57600080fd5b620034388d8d620033f6565b9a50620034496104008d01620032a0565b99506104208c013598506104408c013597506200346a6104608d01620032a0565b96506104808c01356200347d81620032b5565b95506200348e6104a08d01620032a0565b94506104c08c0135620034a181620032b5565b93506104e08c013592506105008c013567ffffffffffffffff811115620034c757600080fd5b620034d58e828f0162003326565b915080935050809150509295989b509295989b9093969950565b6000602082840312156200350257600080fd5b81356200350f81620032b5565b9392505050565b60ff81168114620032d857600080fd5b600080600080600080600060e0888a0312156200354257600080fd5b87356200354f8162003516565b96506200355f60208901620032a0565b955060408801356200357181620032b5565b94506200358160608901620032a0565b935060808801356200359381620032b5565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215620035c657600080fd5b620035d184620032a0565b92506020840135620035e381620032b5565b91506040840135620035f581620032b5565b809150509250925092565b6000602082840312156200361357600080fd5b5035919050565b600080600080600080600060a0888a0312156200363657600080fd5b6200364188620032a0565b965060208801356200365381620032b5565b9550604088013567ffffffffffffffff808211156200367157600080fd5b6200367f8b838c0162003326565b909750955060608a01359150808211156200369957600080fd5b50620036a88a828b0162003326565b9094509250506080880135620036be8162003516565b8091505092959891949750929550565b600080600080600080600060c0888a031215620036ea57600080fd5b620036f588620032a0565b965060208801356200370781620032b5565b95506040880135945060608801356200372081620032b5565b93506080880135620037328162003317565b925060a088013567ffffffffffffffff8111156200374f57600080fd5b6200375d8a828b0162003326565b989b979a50959850939692959293505050565b60008060008061046085870312156200378857600080fd5b843593506200379b8660208701620033f6565b9250620037ac6104208601620032a0565b939692955092936104400135925050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600061010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620038678285018789620037bd565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b83811015620038dd578181015183820152602001620038c3565b50506000910152565b60008251620038fa818460208701620038c0565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156200394e576200394e62003891565b604052919050565b600067ffffffffffffffff82111562003973576200397362003891565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112620039b157600080fd5b8135620039c8620039c28262003956565b62003904565b818152846020838601011115620039de57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562003a1157600080fd5b833567ffffffffffffffff8082111562003a2a57600080fd5b62003a38878388016200399f565b9450602086013591508082111562003a4f57600080fd5b5062003a5e868287016200399f565b9250506040840135620035f58162003516565b6000815180845262003a8b816020860160208601620038c0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60608152600062003ad2606083018662003a71565b828103602084015262003ae6818662003a71565b91505060ff83166040830152949350505050565b63ffffffff86168152600073ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200319f608083018486620037bd565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff8416602082015260606040820152600062003b80606083018486620037bd565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003c1c5762003c1c62003bb9565b5060010190565b60608152600062003c39606083018789620037bd565b828103602084015262003c4e818688620037bd565b91505060ff831660408301529695505050505050565b6000835162003c78818460208801620038c0565b83519083019062003c8e818360208801620038c0565b01949350505050565b60006020828403121562003caa57600080fd5b5051919050565b81810381811115620007a257620007a262003bb9565b600061010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003d278285018762003a71565b925080851660e085015250509998505050505050505050565b600181815b8085111562003d9f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d835762003d8362003bb9565b8085161562003d9157918102915b93841c939080029062003d45565b509250929050565b60008262003db857506001620007a2565b8162003dc757506000620007a2565b816001811462003de0576002811462003deb5762003e0b565b6001915050620007a2565b60ff84111562003dff5762003dff62003bb9565b50506001821b620007a2565b5060208310610133831016604e8410600b841016171562003e30575081810a620007a2565b62003e3c838362003d40565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003e715762003e7162003bb9565b029392505050565b60006200350f838362003da7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000808585111562003ec757600080fd5b8386111562003ed557600080fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003f235780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a03121562003f4757600080fd5b873562003f5481620032b5565b9650602088013562003f6681620032b5565b955060408801359450606088013593506080880135620035938162003516565b600080600080600080600080610100898b03121562003fa457600080fd5b883562003fb181620032b5565b9750602089013562003fc381620032b5565b96506040890135955060608901359450608089013562003fe38162003317565b935060a089013562003ff58162003516565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200402557600080fd5b81516200350f8162003516565b6000602082840312156200404557600080fd5b81516200350f8162003317565b6000602082840312156200406557600080fd5b815167ffffffffffffffff8111156200407d57600080fd5b8201601f810184136200408f57600080fd5b8051620040a0620039c28262003956565b818152856020838501011115620040b657600080fd5b620040c9826020830160208601620038c0565b95945050505050565b6020815260006200350f602083018462003a7156fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212206fe049be388a1d04319b9913fe6d100c4c8e272fe0f5748eb056bd0622beabcc64736f6c63430008140033a26469706673582212205e825f08fed9eccdd780300bb75246eabdc5a004a933a09442baa89c981e174464736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMBridgeMock.json b/compiled-contracts/paris/PolygonZkEVMBridgeMock.json index 8bcc271f0..9f45c0742 100644 --- a/compiled-contracts/paris/PolygonZkEVMBridgeMock.json +++ b/compiled-contracts/paris/PolygonZkEVMBridgeMock.json @@ -867,8 +867,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b506160a1806100206000396000f3fe608060405260043610620001e75760003560e01c8063715018a6116200010b578063bab161bf11620000a1578063dbc16976116200006c578063dbc169761462000728578063ee25560b1462000740578063f2fde38b1462000771578063fb570834146200079657600080fd5b8063bab161bf1462000663578063be5831c7146200069d578063cd58657914620006d9578063d02103ca14620006f057600080fd5b80638da5cb5b11620000e25780638da5cb5b14620005b457806391e57e2d14620005e15780639e34070f14620005f9578063aaa13cc2146200063e57600080fd5b8063715018a6146200053d57806379e2cf97146200055557806381b1c174146200056d57600080fd5b80632d2c9d94116200018157806334ac9cf2116200015857806334ac9cf214620003dd5780633ae05047146200040c5780633e1970431462000424578063647c576c146200051857600080fd5b80632d2c9d9414620003085780632dfdf0b5146200032d578063318aee3d146200035457600080fd5b8063240ff37811620001c2578063240ff37814620002825780632b5e42e714620002995780632c3f58cd14620002be5780632cffd02e14620002e357600080fd5b806315064c9614620001ec5780632072f6c5146200021d57806322e95f2c1462000237575b600080fd5b348015620001f957600080fd5b50606854620002089060ff1681565b60405190151581526020015b60405180910390f35b3480156200022a57600080fd5b5062000235620007bb565b005b3480156200024457600080fd5b506200025c62000256366004620036db565b62000819565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200162000214565b620002356200029336600462003772565b620008bc565b348015620002a657600080fd5b5062000235620002b8366004620037f6565b62000ae4565b348015620002cb57600080fd5b5062000235620002dd36600462003810565b62000af3565b348015620002f057600080fd5b50620002356200030236600462003848565b62000b39565b3480156200031557600080fd5b50620002356200032736600462003848565b620010dd565b3480156200033a57600080fd5b506200034560535481565b60405190815260200162000214565b3480156200036157600080fd5b50620003ab620003733660046200392e565b606b6020526000908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff90911660208301520162000214565b348015620003ea57600080fd5b50606c546200025c9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156200041957600080fd5b5062000345620012e1565b3480156200043157600080fd5b5062000345620004433660046200395e565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200052557600080fd5b506200023562000537366004620039e8565b620013c7565b3480156200054a57600080fd5b506200023562001622565b3480156200056257600080fd5b506200023562001638565b3480156200057a57600080fd5b506200025c6200058c366004620037f6565b606a6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005c157600080fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff166200025c565b348015620005ee57600080fd5b506200034560d15481565b3480156200060657600080fd5b506200020862000618366004620037f6565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b3480156200064b57600080fd5b506200025c6200065d36600462003a38565b62001672565b3480156200067057600080fd5b506068546200068790610100900463ffffffff1681565b60405163ffffffff909116815260200162000214565b348015620006aa57600080fd5b506068546200068790790100000000000000000000000000000000000000000000000000900463ffffffff1681565b62000235620006ea36600462003aec565b6200185e565b348015620006fd57600080fd5b506068546200025c9065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200073557600080fd5b506200023562001932565b3480156200074d57600080fd5b50620003456200075f366004620037f6565b60696020526000908152604090205481565b3480156200077e57600080fd5b5062000235620007903660046200392e565b6200198e565b348015620007a357600080fd5b5062000208620007b536600462003b8e565b62001a4b565b606c5473ffffffffffffffffffffffffffffffffffffffff1633146200080d576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200081762001b34565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091206000908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620008fa576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620009205750600263ffffffff861610155b1562000958576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009ae9998979695949392919062003c24565b60405180910390a162000acc62000ac66001606860019054906101000a900463ffffffff16338989348989604051620009e992919062003c9f565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b62001bc8565b821562000add5762000add62001cdf565b5050505050565b62000aee62001db4565b60d155565b62000afd62001db4565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b77576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b8e8b8b8b8b8b8b8b8b8b8b8b600062001e37565b73ffffffffffffffffffffffffffffffffffffffff861662000c6a576040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000be3919062003d04565b60006040518083038185875af1925050503d806000811462000c22576040519150601f19603f3d011682016040523d82523d6000602084013e62000c27565b606091505b505090508062000c63576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062001065565b60685463ffffffff61010090910481169088160362000cac5762000ca673ffffffffffffffffffffffffffffffffffffffff8716858562002028565b62001065565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b166024820152600090603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000fd7576000808062000d818688018862003e19565b92509250925060008584848460405162000d9b9062003695565b62000da99392919062003edb565b8190604051809103906000f590508015801562000dca573d6000803e3d6000fd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f1990604401600060405180830381600087803b15801562000e4057600080fd5b505af115801562000e55573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000fc595949392919062003f18565b60405180910390a15050505062001062565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f1990604401600060405180830381600087803b1580156200104857600080fd5b505af11580156200105d573d6000803e3d6000fd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff16156200111b576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620011328b8b8b8b8b8b8b8b8b8b8b600162001e37565b60008473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162001165949392919062003f60565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f20000000000000000000000000000000000000000000000000000000017905251620011e8919062003d04565b60006040518083038185875af1925050503d806000811462001227576040519150601f19603f3d011682016040523d82523d6000602084013e6200122c565b606091505b505090508062001268576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b605354600090819081805b6020811015620013be578083901c6001166001036200134f57603381602081106200131b576200131b62003fa8565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200137c565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013b59062004006565b915050620012ec565b50919392505050565b600054610100900460ff1615808015620013e85750600054600160ff909116105b80620014045750303b15801562001404575060005460ff166001145b62001496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014f557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d155620015b8620020fe565b80156200161c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6200162c62001db4565b6200081760006200219d565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000817576200081762001cdf565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201526000908190603801604051602081830303815290604052805190602001209050600060ff60f81b308360405180602001620017089062003695565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905262001753908d908d908d908d908d9060200162004041565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001791929160200162004082565b604051602081830303815290604052805190602001206040516020016200181a94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d15434111562001918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200148d565b620019298787878787878762002214565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001984576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620008176200276f565b6200199862001db4565b73ffffffffffffffffffffffffffffffffffffffff811662001a3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200148d565b62001a48816200219d565b50565b600084815b602081101562001b2657600163ffffffff8616821c8116900362001ac25785816020811062001a835762001a8362003fa8565b60200201358260405160200162001aa4929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001b11565b8186826020811062001ad85762001ad862003fa8565b602002013560405160200162001af8929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001b1d8162004006565b91505062001a50565b50821490505b949350505050565b60685460ff161562001b72576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b80600162001bd960206002620041ee565b62001be59190620041fc565b6053541062001c20576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060536000815462001c339062004006565b9182905550905060005b602081101562001ccf578082901c60011660010362001c7557826033826020811062001c6d5762001c6d62003fa8565b015550505050565b6033816020811062001c8b5762001c8b62003fa8565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001cc69062004006565b91505062001c3d565b5062001cda62004212565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001d65620012e1565b6040518263ffffffff1660e01b815260040162001d8491815260200190565b600060405180830381600087803b15801562001d9f57600080fd5b505af11580156200161c573d6000803e3d6000fd5b609f5473ffffffffffffffffffffffffffffffffffffffff16331462000817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200148d565b62001e488b63ffffffff16620027ff565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b363200000000000000000000000000000000000000000000000000000000909252606481019190915260009165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303816000875af115801562001eeb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001f11919062004241565b90508060000362001f4d576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462001f97576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606854600090610100900463ffffffff1662001fb557508962001fb8565b508a5b62001fe162001fd8848c8c8c8c8c8c8c604051620009e992919062003c9f565b8f8f8462001a4b565b62002018576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001cda9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002864565b600054610100900460ff1662002197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200148d565b62000817335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60685460ff161562002252576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200225c62002977565b60685463ffffffff888116610100909204161480620022825750600263ffffffff881610155b15620022ba576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060608773ffffffffffffffffffffffffffffffffffffffff8816620023205788341462002316576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600092506200261a565b341562002359576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089166000908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901562002449576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac90604401600060405180830381600087803b1580156200241c57600080fd5b505af115801562002431573d6000803e3d6000fd5b50505050806020015194508060000151935062002618565b85156200245e576200245e898b8989620029ec565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa158015620024cc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620024f2919062004241565b90506200251873ffffffffffffffffffffffffffffffffffffffff8b1633308e62002f0a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa15801562002586573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620025ac919062004241565b9050620025ba8282620041fc565b6068548c9850610100900463ffffffff1696509350620025da8762002f6a565b620025e58c62003082565b620025f08d6200318f565b604051602001620026049392919062003edb565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e86886053546040516200265c9897969594939291906200425b565b60405180910390a16200275062000ac6600085878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b861562002761576200276162001cdf565b505050506200192960018055565b60685460ff16620027ac576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600881901c60008181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000add576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000620028c8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200328b9092919063ffffffff16565b80519091501562001cda5780806020019051810190620028e99190620042d4565b62001cda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200148d565b600260015403620029e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200148d565b6002600155565b6000620029fd6004828486620042f4565b62002a089162004320565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002c8757600080808080808062002a6b896004818d620042f4565b81019062002a7a919062004369565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002aee576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002b3e576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002b78576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002c33919062003d04565b6000604051808303816000865af19150503d806000811462002c72576040519150601f19603f3d011682016040523d82523d6000602084013e62002c77565b606091505b5050505050505050505062000add565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002d03576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008080808080808062002d1b8a6004818e620042f4565b81019062002d2a9190620043c4565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002da0576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002df0576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002eb4919062003d04565b6000604051808303816000865af19150503d806000811462002ef3576040519150601f19603f3d011682016040523d82523d6000602084013e62002ef8565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526200161c9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016200207b565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162002fee919062003d04565b600060405180830381855afa9150503d80600081146200302b576040519150601f19603f3d011682016040523d82523d6000602084013e62003030565b606091505b50915091508162003077576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001b2c565b62001b2c816200329c565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162003106919062003d04565b600060405180830381855afa9150503d806000811462003143576040519150601f19603f3d011682016040523d82523d6000602084013e62003148565b606091505b50915091508162003077576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001b2c565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169162003212919062003d04565b600060405180830381855afa9150503d80600081146200324f576040519150601f19603f3d011682016040523d82523d6000602084013e62003254565b606091505b509150915081801562003268575080516020145b6200327557601262001b2c565b8080602001905181019062001b2c919062004450565b606062001b2c84846000856200348c565b60606040825110620032be5781806020019051810190620008b6919062004470565b81516020036200344e5760005b602081108015620033165750828181518110620032ec57620032ec62003fa8565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620033315780620033288162004006565b915050620032cb565b806000036200337557505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111562003393576200339362003caf565b6040519080825280601f01601f191660200182016040528015620033be576020820181803683370190505b50905060005b828110156200344657848181518110620033e257620033e262003fa8565b602001015160f81c60f81b82828151811062003402576200340262003fa8565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806200343d8162004006565b915050620033c4565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200148d565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516200354b919062003d04565b60006040518083038185875af1925050503d80600081146200358a576040519150601f19603f3d011682016040523d82523d6000602084013e6200358f565b606091505b5091509150620035a287838387620035ad565b979650505050505050565b6060831562003648578251600003620036405773ffffffffffffffffffffffffffffffffffffffff85163b62003640576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200148d565b508162001b2c565b62001b2c83838151156200365f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200148d9190620044f0565b611b66806200450683390190565b803563ffffffff811681146200348757600080fd5b73ffffffffffffffffffffffffffffffffffffffff8116811462001a4857600080fd5b60008060408385031215620036ef57600080fd5b620036fa83620036a3565b915060208301356200370c81620036b8565b809150509250929050565b801515811462001a4857600080fd5b60008083601f8401126200373957600080fd5b50813567ffffffffffffffff8111156200375257600080fd5b6020830191508360208285010111156200376b57600080fd5b9250929050565b6000806000806000608086880312156200378b57600080fd5b6200379686620036a3565b94506020860135620037a881620036b8565b93506040860135620037ba8162003717565b9250606086013567ffffffffffffffff811115620037d757600080fd5b620037e58882890162003726565b969995985093965092949392505050565b6000602082840312156200380957600080fd5b5035919050565b6000602082840312156200382357600080fd5b6200382e82620036a3565b9392505050565b806104008101831015620008b657600080fd5b60008060008060008060008060008060006105208c8e0312156200386b57600080fd5b620038778d8d62003835565b9a50620038886104008d01620036a3565b99506104208c013598506104408c01359750620038a96104608d01620036a3565b96506104808c0135620038bc81620036b8565b9550620038cd6104a08d01620036a3565b94506104c08c0135620038e081620036b8565b93506104e08c013592506105008c013567ffffffffffffffff8111156200390657600080fd5b620039148e828f0162003726565b915080935050809150509295989b509295989b9093969950565b6000602082840312156200394157600080fd5b81356200382e81620036b8565b60ff8116811462001a4857600080fd5b600080600080600080600060e0888a0312156200397a57600080fd5b873562003987816200394e565b96506200399760208901620036a3565b95506040880135620039a981620036b8565b9450620039b960608901620036a3565b93506080880135620039cb81620036b8565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215620039fe57600080fd5b62003a0984620036a3565b9250602084013562003a1b81620036b8565b9150604084013562003a2d81620036b8565b809150509250925092565b600080600080600080600060a0888a03121562003a5457600080fd5b62003a5f88620036a3565b9650602088013562003a7181620036b8565b9550604088013567ffffffffffffffff8082111562003a8f57600080fd5b62003a9d8b838c0162003726565b909750955060608a013591508082111562003ab757600080fd5b5062003ac68a828b0162003726565b909450925050608088013562003adc816200394e565b8091505092959891949750929550565b600080600080600080600060c0888a03121562003b0857600080fd5b62003b1388620036a3565b9650602088013562003b2581620036b8565b955060408801359450606088013562003b3e81620036b8565b9350608088013562003b508162003717565b925060a088013567ffffffffffffffff81111562003b6d57600080fd5b62003b7b8a828b0162003726565b989b979a50959850939692959293505050565b600080600080610460858703121562003ba657600080fd5b8435935062003bb9866020870162003835565b925062003bca6104208601620036a3565b939692955092936104400135925050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600061010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003c85828501878962003bdb565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b8381101562003cfb57818101518382015260200162003ce1565b50506000910152565b6000825162003d1881846020870162003cde565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003d6c5762003d6c62003caf565b604052919050565b600067ffffffffffffffff82111562003d915762003d9162003caf565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011262003dcf57600080fd5b813562003de662003de08262003d74565b62003d22565b81815284602083860101111562003dfc57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562003e2f57600080fd5b833567ffffffffffffffff8082111562003e4857600080fd5b62003e568783880162003dbd565b9450602086013591508082111562003e6d57600080fd5b5062003e7c8682870162003dbd565b925050604084013562003a2d816200394e565b6000815180845262003ea981602086016020860162003cde565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60608152600062003ef0606083018662003e8f565b828103602084015262003f04818662003e8f565b91505060ff83166040830152949350505050565b63ffffffff86168152600073ffffffffffffffffffffffffffffffffffffffff808716602084015280861660408401525060806060830152620035a260808301848662003bdb565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff8416602082015260606040820152600062003f9e60608301848662003bdb565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036200403a576200403a62003fd7565b5060010190565b6060815260006200405760608301878962003bdb565b82810360208401526200406c81868862003bdb565b91505060ff831660408301529695505050505050565b600083516200409681846020880162003cde565b835190830190620040ac81836020880162003cde565b01949350505050565b600181815b808511156200411457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620040f857620040f862003fd7565b808516156200410657918102915b93841c9390800290620040ba565b509250929050565b6000826200412d57506001620008b6565b816200413c57506000620008b6565b8160018114620041555760028114620041605762004180565b6001915050620008b6565b60ff84111562004174576200417462003fd7565b50506001821b620008b6565b5060208310610133831016604e8410600b8410161715620041a5575081810a620008b6565b620041b18383620040b5565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620041e657620041e662003fd7565b029392505050565b60006200382e83836200411c565b81810381811115620008b657620008b662003fd7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000602082840312156200425457600080fd5b5051919050565b600061010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620042bb8285018762003e8f565b925080851660e085015250509998505050505050505050565b600060208284031215620042e757600080fd5b81516200382e8162003717565b600080858511156200430557600080fd5b838611156200431357600080fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620043615780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a0312156200438557600080fd5b87356200439281620036b8565b96506020880135620043a481620036b8565b955060408801359450606088013593506080880135620039cb816200394e565b600080600080600080600080610100898b031215620043e257600080fd5b8835620043ef81620036b8565b975060208901356200440181620036b8565b965060408901359550606089013594506080890135620044218162003717565b935060a089013562004433816200394e565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200446357600080fd5b81516200382e816200394e565b6000602082840312156200448357600080fd5b815167ffffffffffffffff8111156200449b57600080fd5b8201601f81018413620044ad57600080fd5b8051620044be62003de08262003d74565b818152856020838501011115620044d457600080fd5b620044e782602083016020860162003cde565b95945050505050565b6020815260006200382e602083018462003e8f56fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212206fe049be388a1d04319b9913fe6d100c4c8e272fe0f5748eb056bd0622beabcc64736f6c63430008140033a2646970667358221220b14509f55d59293305a5dbe90fdf3a7b7ae9417e96c0bbfe4ba0150ddd7bb7a064736f6c63430008140033", - "deployedBytecode": "0x608060405260043610620001e75760003560e01c8063715018a6116200010b578063bab161bf11620000a1578063dbc16976116200006c578063dbc169761462000728578063ee25560b1462000740578063f2fde38b1462000771578063fb570834146200079657600080fd5b8063bab161bf1462000663578063be5831c7146200069d578063cd58657914620006d9578063d02103ca14620006f057600080fd5b80638da5cb5b11620000e25780638da5cb5b14620005b457806391e57e2d14620005e15780639e34070f14620005f9578063aaa13cc2146200063e57600080fd5b8063715018a6146200053d57806379e2cf97146200055557806381b1c174146200056d57600080fd5b80632d2c9d94116200018157806334ac9cf2116200015857806334ac9cf214620003dd5780633ae05047146200040c5780633e1970431462000424578063647c576c146200051857600080fd5b80632d2c9d9414620003085780632dfdf0b5146200032d578063318aee3d146200035457600080fd5b8063240ff37811620001c2578063240ff37814620002825780632b5e42e714620002995780632c3f58cd14620002be5780632cffd02e14620002e357600080fd5b806315064c9614620001ec5780632072f6c5146200021d57806322e95f2c1462000237575b600080fd5b348015620001f957600080fd5b50606854620002089060ff1681565b60405190151581526020015b60405180910390f35b3480156200022a57600080fd5b5062000235620007bb565b005b3480156200024457600080fd5b506200025c62000256366004620036db565b62000819565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200162000214565b620002356200029336600462003772565b620008bc565b348015620002a657600080fd5b5062000235620002b8366004620037f6565b62000ae4565b348015620002cb57600080fd5b5062000235620002dd36600462003810565b62000af3565b348015620002f057600080fd5b50620002356200030236600462003848565b62000b39565b3480156200031557600080fd5b50620002356200032736600462003848565b620010dd565b3480156200033a57600080fd5b506200034560535481565b60405190815260200162000214565b3480156200036157600080fd5b50620003ab620003733660046200392e565b606b6020526000908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff90911660208301520162000214565b348015620003ea57600080fd5b50606c546200025c9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156200041957600080fd5b5062000345620012e1565b3480156200043157600080fd5b5062000345620004433660046200395e565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200052557600080fd5b506200023562000537366004620039e8565b620013c7565b3480156200054a57600080fd5b506200023562001622565b3480156200056257600080fd5b506200023562001638565b3480156200057a57600080fd5b506200025c6200058c366004620037f6565b606a6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005c157600080fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff166200025c565b348015620005ee57600080fd5b506200034560d15481565b3480156200060657600080fd5b506200020862000618366004620037f6565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b3480156200064b57600080fd5b506200025c6200065d36600462003a38565b62001672565b3480156200067057600080fd5b506068546200068790610100900463ffffffff1681565b60405163ffffffff909116815260200162000214565b348015620006aa57600080fd5b506068546200068790790100000000000000000000000000000000000000000000000000900463ffffffff1681565b62000235620006ea36600462003aec565b6200185e565b348015620006fd57600080fd5b506068546200025c9065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200073557600080fd5b506200023562001932565b3480156200074d57600080fd5b50620003456200075f366004620037f6565b60696020526000908152604090205481565b3480156200077e57600080fd5b5062000235620007903660046200392e565b6200198e565b348015620007a357600080fd5b5062000208620007b536600462003b8e565b62001a4b565b606c5473ffffffffffffffffffffffffffffffffffffffff1633146200080d576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200081762001b34565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091206000908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620008fa576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620009205750600263ffffffff861610155b1562000958576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009ae9998979695949392919062003c24565b60405180910390a162000acc62000ac66001606860019054906101000a900463ffffffff16338989348989604051620009e992919062003c9f565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b62001bc8565b821562000add5762000add62001cdf565b5050505050565b62000aee62001db4565b60d155565b62000afd62001db4565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b77576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b8e8b8b8b8b8b8b8b8b8b8b8b600062001e37565b73ffffffffffffffffffffffffffffffffffffffff861662000c6a576040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000be3919062003d04565b60006040518083038185875af1925050503d806000811462000c22576040519150601f19603f3d011682016040523d82523d6000602084013e62000c27565b606091505b505090508062000c63576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062001065565b60685463ffffffff61010090910481169088160362000cac5762000ca673ffffffffffffffffffffffffffffffffffffffff8716858562002028565b62001065565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b166024820152600090603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000fd7576000808062000d818688018862003e19565b92509250925060008584848460405162000d9b9062003695565b62000da99392919062003edb565b8190604051809103906000f590508015801562000dca573d6000803e3d6000fd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f1990604401600060405180830381600087803b15801562000e4057600080fd5b505af115801562000e55573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000fc595949392919062003f18565b60405180910390a15050505062001062565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f1990604401600060405180830381600087803b1580156200104857600080fd5b505af11580156200105d573d6000803e3d6000fd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff16156200111b576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620011328b8b8b8b8b8b8b8b8b8b8b600162001e37565b60008473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162001165949392919062003f60565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f20000000000000000000000000000000000000000000000000000000017905251620011e8919062003d04565b60006040518083038185875af1925050503d806000811462001227576040519150601f19603f3d011682016040523d82523d6000602084013e6200122c565b606091505b505090508062001268576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b605354600090819081805b6020811015620013be578083901c6001166001036200134f57603381602081106200131b576200131b62003fa8565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200137c565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013b59062004006565b915050620012ec565b50919392505050565b600054610100900460ff1615808015620013e85750600054600160ff909116105b80620014045750303b15801562001404575060005460ff166001145b62001496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014f557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d155620015b8620020fe565b80156200161c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6200162c62001db4565b6200081760006200219d565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000817576200081762001cdf565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201526000908190603801604051602081830303815290604052805190602001209050600060ff60f81b308360405180602001620017089062003695565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905262001753908d908d908d908d908d9060200162004041565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001791929160200162004082565b604051602081830303815290604052805190602001206040516020016200181a94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d15434111562001918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200148d565b620019298787878787878762002214565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001984576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620008176200276f565b6200199862001db4565b73ffffffffffffffffffffffffffffffffffffffff811662001a3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200148d565b62001a48816200219d565b50565b600084815b602081101562001b2657600163ffffffff8616821c8116900362001ac25785816020811062001a835762001a8362003fa8565b60200201358260405160200162001aa4929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001b11565b8186826020811062001ad85762001ad862003fa8565b602002013560405160200162001af8929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001b1d8162004006565b91505062001a50565b50821490505b949350505050565b60685460ff161562001b72576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b80600162001bd960206002620041ee565b62001be59190620041fc565b6053541062001c20576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060536000815462001c339062004006565b9182905550905060005b602081101562001ccf578082901c60011660010362001c7557826033826020811062001c6d5762001c6d62003fa8565b015550505050565b6033816020811062001c8b5762001c8b62003fa8565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001cc69062004006565b91505062001c3d565b5062001cda62004212565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001d65620012e1565b6040518263ffffffff1660e01b815260040162001d8491815260200190565b600060405180830381600087803b15801562001d9f57600080fd5b505af11580156200161c573d6000803e3d6000fd5b609f5473ffffffffffffffffffffffffffffffffffffffff16331462000817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200148d565b62001e488b63ffffffff16620027ff565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b363200000000000000000000000000000000000000000000000000000000909252606481019190915260009165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303816000875af115801562001eeb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001f11919062004241565b90508060000362001f4d576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462001f97576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606854600090610100900463ffffffff1662001fb557508962001fb8565b508a5b62001fe162001fd8848c8c8c8c8c8c8c604051620009e992919062003c9f565b8f8f8462001a4b565b62002018576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001cda9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002864565b600054610100900460ff1662002197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200148d565b62000817335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60685460ff161562002252576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200225c62002977565b60685463ffffffff888116610100909204161480620022825750600263ffffffff881610155b15620022ba576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060608773ffffffffffffffffffffffffffffffffffffffff8816620023205788341462002316576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600092506200261a565b341562002359576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089166000908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901562002449576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac90604401600060405180830381600087803b1580156200241c57600080fd5b505af115801562002431573d6000803e3d6000fd5b50505050806020015194508060000151935062002618565b85156200245e576200245e898b8989620029ec565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa158015620024cc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620024f2919062004241565b90506200251873ffffffffffffffffffffffffffffffffffffffff8b1633308e62002f0a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa15801562002586573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620025ac919062004241565b9050620025ba8282620041fc565b6068548c9850610100900463ffffffff1696509350620025da8762002f6a565b620025e58c62003082565b620025f08d6200318f565b604051602001620026049392919062003edb565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e86886053546040516200265c9897969594939291906200425b565b60405180910390a16200275062000ac6600085878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b861562002761576200276162001cdf565b505050506200192960018055565b60685460ff16620027ac576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600881901c60008181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000add576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000620028c8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200328b9092919063ffffffff16565b80519091501562001cda5780806020019051810190620028e99190620042d4565b62001cda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200148d565b600260015403620029e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200148d565b6002600155565b6000620029fd6004828486620042f4565b62002a089162004320565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002c8757600080808080808062002a6b896004818d620042f4565b81019062002a7a919062004369565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002aee576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002b3e576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002b78576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002c33919062003d04565b6000604051808303816000865af19150503d806000811462002c72576040519150601f19603f3d011682016040523d82523d6000602084013e62002c77565b606091505b5050505050505050505062000add565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002d03576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008080808080808062002d1b8a6004818e620042f4565b81019062002d2a9190620043c4565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002da0576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002df0576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002eb4919062003d04565b6000604051808303816000865af19150503d806000811462002ef3576040519150601f19603f3d011682016040523d82523d6000602084013e62002ef8565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526200161c9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016200207b565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162002fee919062003d04565b600060405180830381855afa9150503d80600081146200302b576040519150601f19603f3d011682016040523d82523d6000602084013e62003030565b606091505b50915091508162003077576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001b2c565b62001b2c816200329c565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162003106919062003d04565b600060405180830381855afa9150503d806000811462003143576040519150601f19603f3d011682016040523d82523d6000602084013e62003148565b606091505b50915091508162003077576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001b2c565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169162003212919062003d04565b600060405180830381855afa9150503d80600081146200324f576040519150601f19603f3d011682016040523d82523d6000602084013e62003254565b606091505b509150915081801562003268575080516020145b6200327557601262001b2c565b8080602001905181019062001b2c919062004450565b606062001b2c84846000856200348c565b60606040825110620032be5781806020019051810190620008b6919062004470565b81516020036200344e5760005b602081108015620033165750828181518110620032ec57620032ec62003fa8565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620033315780620033288162004006565b915050620032cb565b806000036200337557505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111562003393576200339362003caf565b6040519080825280601f01601f191660200182016040528015620033be576020820181803683370190505b50905060005b828110156200344657848181518110620033e257620033e262003fa8565b602001015160f81c60f81b82828151811062003402576200340262003fa8565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806200343d8162004006565b915050620033c4565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200148d565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516200354b919062003d04565b60006040518083038185875af1925050503d80600081146200358a576040519150601f19603f3d011682016040523d82523d6000602084013e6200358f565b606091505b5091509150620035a287838387620035ad565b979650505050505050565b6060831562003648578251600003620036405773ffffffffffffffffffffffffffffffffffffffff85163b62003640576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200148d565b508162001b2c565b62001b2c83838151156200365f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200148d9190620044f0565b611b66806200450683390190565b803563ffffffff811681146200348757600080fd5b73ffffffffffffffffffffffffffffffffffffffff8116811462001a4857600080fd5b60008060408385031215620036ef57600080fd5b620036fa83620036a3565b915060208301356200370c81620036b8565b809150509250929050565b801515811462001a4857600080fd5b60008083601f8401126200373957600080fd5b50813567ffffffffffffffff8111156200375257600080fd5b6020830191508360208285010111156200376b57600080fd5b9250929050565b6000806000806000608086880312156200378b57600080fd5b6200379686620036a3565b94506020860135620037a881620036b8565b93506040860135620037ba8162003717565b9250606086013567ffffffffffffffff811115620037d757600080fd5b620037e58882890162003726565b969995985093965092949392505050565b6000602082840312156200380957600080fd5b5035919050565b6000602082840312156200382357600080fd5b6200382e82620036a3565b9392505050565b806104008101831015620008b657600080fd5b60008060008060008060008060008060006105208c8e0312156200386b57600080fd5b620038778d8d62003835565b9a50620038886104008d01620036a3565b99506104208c013598506104408c01359750620038a96104608d01620036a3565b96506104808c0135620038bc81620036b8565b9550620038cd6104a08d01620036a3565b94506104c08c0135620038e081620036b8565b93506104e08c013592506105008c013567ffffffffffffffff8111156200390657600080fd5b620039148e828f0162003726565b915080935050809150509295989b509295989b9093969950565b6000602082840312156200394157600080fd5b81356200382e81620036b8565b60ff8116811462001a4857600080fd5b600080600080600080600060e0888a0312156200397a57600080fd5b873562003987816200394e565b96506200399760208901620036a3565b95506040880135620039a981620036b8565b9450620039b960608901620036a3565b93506080880135620039cb81620036b8565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215620039fe57600080fd5b62003a0984620036a3565b9250602084013562003a1b81620036b8565b9150604084013562003a2d81620036b8565b809150509250925092565b600080600080600080600060a0888a03121562003a5457600080fd5b62003a5f88620036a3565b9650602088013562003a7181620036b8565b9550604088013567ffffffffffffffff8082111562003a8f57600080fd5b62003a9d8b838c0162003726565b909750955060608a013591508082111562003ab757600080fd5b5062003ac68a828b0162003726565b909450925050608088013562003adc816200394e565b8091505092959891949750929550565b600080600080600080600060c0888a03121562003b0857600080fd5b62003b1388620036a3565b9650602088013562003b2581620036b8565b955060408801359450606088013562003b3e81620036b8565b9350608088013562003b508162003717565b925060a088013567ffffffffffffffff81111562003b6d57600080fd5b62003b7b8a828b0162003726565b989b979a50959850939692959293505050565b600080600080610460858703121562003ba657600080fd5b8435935062003bb9866020870162003835565b925062003bca6104208601620036a3565b939692955092936104400135925050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600061010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003c85828501878962003bdb565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b8381101562003cfb57818101518382015260200162003ce1565b50506000910152565b6000825162003d1881846020870162003cde565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003d6c5762003d6c62003caf565b604052919050565b600067ffffffffffffffff82111562003d915762003d9162003caf565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011262003dcf57600080fd5b813562003de662003de08262003d74565b62003d22565b81815284602083860101111562003dfc57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562003e2f57600080fd5b833567ffffffffffffffff8082111562003e4857600080fd5b62003e568783880162003dbd565b9450602086013591508082111562003e6d57600080fd5b5062003e7c8682870162003dbd565b925050604084013562003a2d816200394e565b6000815180845262003ea981602086016020860162003cde565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60608152600062003ef0606083018662003e8f565b828103602084015262003f04818662003e8f565b91505060ff83166040830152949350505050565b63ffffffff86168152600073ffffffffffffffffffffffffffffffffffffffff808716602084015280861660408401525060806060830152620035a260808301848662003bdb565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff8416602082015260606040820152600062003f9e60608301848662003bdb565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036200403a576200403a62003fd7565b5060010190565b6060815260006200405760608301878962003bdb565b82810360208401526200406c81868862003bdb565b91505060ff831660408301529695505050505050565b600083516200409681846020880162003cde565b835190830190620040ac81836020880162003cde565b01949350505050565b600181815b808511156200411457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620040f857620040f862003fd7565b808516156200410657918102915b93841c9390800290620040ba565b509250929050565b6000826200412d57506001620008b6565b816200413c57506000620008b6565b8160018114620041555760028114620041605762004180565b6001915050620008b6565b60ff84111562004174576200417462003fd7565b50506001821b620008b6565b5060208310610133831016604e8410600b8410161715620041a5575081810a620008b6565b620041b18383620040b5565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620041e657620041e662003fd7565b029392505050565b60006200382e83836200411c565b81810381811115620008b657620008b662003fd7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000602082840312156200425457600080fd5b5051919050565b600061010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620042bb8285018762003e8f565b925080851660e085015250509998505050505050505050565b600060208284031215620042e757600080fd5b81516200382e8162003717565b600080858511156200430557600080fd5b838611156200431357600080fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620043615780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a0312156200438557600080fd5b87356200439281620036b8565b96506020880135620043a481620036b8565b955060408801359450606088013593506080880135620039cb816200394e565b600080600080600080600080610100898b031215620043e257600080fd5b8835620043ef81620036b8565b975060208901356200440181620036b8565b965060408901359550606089013594506080890135620044218162003717565b935060a089013562004433816200394e565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200446357600080fd5b81516200382e816200394e565b6000602082840312156200448357600080fd5b815167ffffffffffffffff8111156200449b57600080fd5b8201601f81018413620044ad57600080fd5b8051620044be62003de08262003d74565b818152856020838501011115620044d457600080fd5b620044e782602083016020860162003cde565b95945050505050565b6020815260006200382e602083018462003e8f56fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212206fe049be388a1d04319b9913fe6d100c4c8e272fe0f5748eb056bd0622beabcc64736f6c63430008140033a2646970667358221220b14509f55d59293305a5dbe90fdf3a7b7ae9417e96c0bbfe4ba0150ddd7bb7a064736f6c63430008140033", + "bytecode": "0x608060405234801561001057600080fd5b506160a1806100206000396000f3fe608060405260043610620001e75760003560e01c8063715018a6116200010b578063bab161bf11620000a1578063dbc16976116200006c578063dbc169761462000728578063ee25560b1462000740578063f2fde38b1462000771578063fb570834146200079657600080fd5b8063bab161bf1462000663578063be5831c7146200069d578063cd58657914620006d9578063d02103ca14620006f057600080fd5b80638da5cb5b11620000e25780638da5cb5b14620005b457806391e57e2d14620005e15780639e34070f14620005f9578063aaa13cc2146200063e57600080fd5b8063715018a6146200053d57806379e2cf97146200055557806381b1c174146200056d57600080fd5b80632d2c9d94116200018157806334ac9cf2116200015857806334ac9cf214620003dd5780633ae05047146200040c5780633e1970431462000424578063647c576c146200051857600080fd5b80632d2c9d9414620003085780632dfdf0b5146200032d578063318aee3d146200035457600080fd5b8063240ff37811620001c2578063240ff37814620002825780632b5e42e714620002995780632c3f58cd14620002be5780632cffd02e14620002e357600080fd5b806315064c9614620001ec5780632072f6c5146200021d57806322e95f2c1462000237575b600080fd5b348015620001f957600080fd5b50606854620002089060ff1681565b60405190151581526020015b60405180910390f35b3480156200022a57600080fd5b5062000235620007bb565b005b3480156200024457600080fd5b506200025c62000256366004620036db565b62000819565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200162000214565b620002356200029336600462003772565b620008bc565b348015620002a657600080fd5b5062000235620002b8366004620037f6565b62000ae4565b348015620002cb57600080fd5b5062000235620002dd36600462003810565b62000af3565b348015620002f057600080fd5b50620002356200030236600462003848565b62000b39565b3480156200031557600080fd5b50620002356200032736600462003848565b620010dd565b3480156200033a57600080fd5b506200034560535481565b60405190815260200162000214565b3480156200036157600080fd5b50620003ab620003733660046200392e565b606b6020526000908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff90911660208301520162000214565b348015620003ea57600080fd5b50606c546200025c9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156200041957600080fd5b5062000345620012e1565b3480156200043157600080fd5b5062000345620004433660046200395e565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200052557600080fd5b506200023562000537366004620039e8565b620013c7565b3480156200054a57600080fd5b506200023562001622565b3480156200056257600080fd5b506200023562001638565b3480156200057a57600080fd5b506200025c6200058c366004620037f6565b606a6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005c157600080fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff166200025c565b348015620005ee57600080fd5b506200034560d15481565b3480156200060657600080fd5b506200020862000618366004620037f6565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b3480156200064b57600080fd5b506200025c6200065d36600462003a38565b62001672565b3480156200067057600080fd5b506068546200068790610100900463ffffffff1681565b60405163ffffffff909116815260200162000214565b348015620006aa57600080fd5b506068546200068790790100000000000000000000000000000000000000000000000000900463ffffffff1681565b62000235620006ea36600462003aec565b6200185e565b348015620006fd57600080fd5b506068546200025c9065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200073557600080fd5b506200023562001932565b3480156200074d57600080fd5b50620003456200075f366004620037f6565b60696020526000908152604090205481565b3480156200077e57600080fd5b5062000235620007903660046200392e565b6200198e565b348015620007a357600080fd5b5062000208620007b536600462003b8e565b62001a4b565b606c5473ffffffffffffffffffffffffffffffffffffffff1633146200080d576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200081762001b34565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091206000908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620008fa576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620009205750600263ffffffff861610155b1562000958576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009ae9998979695949392919062003c24565b60405180910390a162000acc62000ac66001606860019054906101000a900463ffffffff16338989348989604051620009e992919062003c9f565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b62001bc8565b821562000add5762000add62001cdf565b5050505050565b62000aee62001db4565b60d155565b62000afd62001db4565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b77576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b8e8b8b8b8b8b8b8b8b8b8b8b600062001e37565b73ffffffffffffffffffffffffffffffffffffffff861662000c6a576040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000be3919062003d04565b60006040518083038185875af1925050503d806000811462000c22576040519150601f19603f3d011682016040523d82523d6000602084013e62000c27565b606091505b505090508062000c63576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062001065565b60685463ffffffff61010090910481169088160362000cac5762000ca673ffffffffffffffffffffffffffffffffffffffff8716858562002028565b62001065565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b166024820152600090603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000fd7576000808062000d818688018862003e19565b92509250925060008584848460405162000d9b9062003695565b62000da99392919062003edb565b8190604051809103906000f590508015801562000dca573d6000803e3d6000fd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f1990604401600060405180830381600087803b15801562000e4057600080fd5b505af115801562000e55573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000fc595949392919062003f18565b60405180910390a15050505062001062565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f1990604401600060405180830381600087803b1580156200104857600080fd5b505af11580156200105d573d6000803e3d6000fd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff16156200111b576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620011328b8b8b8b8b8b8b8b8b8b8b600162001e37565b60008473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162001165949392919062003f60565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f20000000000000000000000000000000000000000000000000000000017905251620011e8919062003d04565b60006040518083038185875af1925050503d806000811462001227576040519150601f19603f3d011682016040523d82523d6000602084013e6200122c565b606091505b505090508062001268576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b605354600090819081805b6020811015620013be578083901c6001166001036200134f57603381602081106200131b576200131b62003fa8565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200137c565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013b59062004006565b915050620012ec565b50919392505050565b600054610100900460ff1615808015620013e85750600054600160ff909116105b80620014045750303b15801562001404575060005460ff166001145b62001496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014f557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d155620015b8620020fe565b80156200161c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6200162c62001db4565b6200081760006200219d565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000817576200081762001cdf565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201526000908190603801604051602081830303815290604052805190602001209050600060ff60f81b308360405180602001620017089062003695565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905262001753908d908d908d908d908d9060200162004041565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001791929160200162004082565b604051602081830303815290604052805190602001206040516020016200181a94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d15434111562001918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200148d565b620019298787878787878762002214565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001984576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620008176200276f565b6200199862001db4565b73ffffffffffffffffffffffffffffffffffffffff811662001a3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200148d565b62001a48816200219d565b50565b600084815b602081101562001b2657600163ffffffff8616821c8116900362001ac25785816020811062001a835762001a8362003fa8565b60200201358260405160200162001aa4929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001b11565b8186826020811062001ad85762001ad862003fa8565b602002013560405160200162001af8929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001b1d8162004006565b91505062001a50565b50821490505b949350505050565b60685460ff161562001b72576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b80600162001bd960206002620041ee565b62001be59190620041fc565b6053541062001c20576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060536000815462001c339062004006565b9182905550905060005b602081101562001ccf578082901c60011660010362001c7557826033826020811062001c6d5762001c6d62003fa8565b015550505050565b6033816020811062001c8b5762001c8b62003fa8565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001cc69062004006565b91505062001c3d565b5062001cda62004212565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001d65620012e1565b6040518263ffffffff1660e01b815260040162001d8491815260200190565b600060405180830381600087803b15801562001d9f57600080fd5b505af11580156200161c573d6000803e3d6000fd5b609f5473ffffffffffffffffffffffffffffffffffffffff16331462000817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200148d565b62001e488b63ffffffff16620027ff565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b363200000000000000000000000000000000000000000000000000000000909252606481019190915260009165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303816000875af115801562001eeb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001f11919062004241565b90508060000362001f4d576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462001f97576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606854600090610100900463ffffffff1662001fb557508962001fb8565b508a5b62001fe162001fd8848c8c8c8c8c8c8c604051620009e992919062003c9f565b8f8f8462001a4b565b62002018576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001cda9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002864565b600054610100900460ff1662002197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200148d565b62000817335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60685460ff161562002252576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200225c62002977565b60685463ffffffff888116610100909204161480620022825750600263ffffffff881610155b15620022ba576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060608773ffffffffffffffffffffffffffffffffffffffff8816620023205788341462002316576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600092506200261a565b341562002359576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089166000908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901562002449576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac90604401600060405180830381600087803b1580156200241c57600080fd5b505af115801562002431573d6000803e3d6000fd5b50505050806020015194508060000151935062002618565b85156200245e576200245e898b8989620029ec565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa158015620024cc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620024f2919062004241565b90506200251873ffffffffffffffffffffffffffffffffffffffff8b1633308e62002f0a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa15801562002586573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620025ac919062004241565b9050620025ba8282620041fc565b6068548c9850610100900463ffffffff1696509350620025da8762002f6a565b620025e58c62003082565b620025f08d6200318f565b604051602001620026049392919062003edb565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e86886053546040516200265c9897969594939291906200425b565b60405180910390a16200275062000ac6600085878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b861562002761576200276162001cdf565b505050506200192960018055565b60685460ff16620027ac576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600881901c60008181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000add576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000620028c8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200328b9092919063ffffffff16565b80519091501562001cda5780806020019051810190620028e99190620042d4565b62001cda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200148d565b600260015403620029e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200148d565b6002600155565b6000620029fd6004828486620042f4565b62002a089162004320565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002c8757600080808080808062002a6b896004818d620042f4565b81019062002a7a919062004369565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002aee576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002b3e576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002b78576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002c33919062003d04565b6000604051808303816000865af19150503d806000811462002c72576040519150601f19603f3d011682016040523d82523d6000602084013e62002c77565b606091505b5050505050505050505062000add565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002d03576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008080808080808062002d1b8a6004818e620042f4565b81019062002d2a9190620043c4565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002da0576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002df0576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002eb4919062003d04565b6000604051808303816000865af19150503d806000811462002ef3576040519150601f19603f3d011682016040523d82523d6000602084013e62002ef8565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526200161c9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016200207b565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162002fee919062003d04565b600060405180830381855afa9150503d80600081146200302b576040519150601f19603f3d011682016040523d82523d6000602084013e62003030565b606091505b50915091508162003077576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001b2c565b62001b2c816200329c565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162003106919062003d04565b600060405180830381855afa9150503d806000811462003143576040519150601f19603f3d011682016040523d82523d6000602084013e62003148565b606091505b50915091508162003077576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001b2c565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169162003212919062003d04565b600060405180830381855afa9150503d80600081146200324f576040519150601f19603f3d011682016040523d82523d6000602084013e62003254565b606091505b509150915081801562003268575080516020145b6200327557601262001b2c565b8080602001905181019062001b2c919062004450565b606062001b2c84846000856200348c565b60606040825110620032be5781806020019051810190620008b6919062004470565b81516020036200344e5760005b602081108015620033165750828181518110620032ec57620032ec62003fa8565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620033315780620033288162004006565b915050620032cb565b806000036200337557505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111562003393576200339362003caf565b6040519080825280601f01601f191660200182016040528015620033be576020820181803683370190505b50905060005b828110156200344657848181518110620033e257620033e262003fa8565b602001015160f81c60f81b82828151811062003402576200340262003fa8565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806200343d8162004006565b915050620033c4565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200148d565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516200354b919062003d04565b60006040518083038185875af1925050503d80600081146200358a576040519150601f19603f3d011682016040523d82523d6000602084013e6200358f565b606091505b5091509150620035a287838387620035ad565b979650505050505050565b6060831562003648578251600003620036405773ffffffffffffffffffffffffffffffffffffffff85163b62003640576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200148d565b508162001b2c565b62001b2c83838151156200365f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200148d9190620044f0565b611b66806200450683390190565b803563ffffffff811681146200348757600080fd5b73ffffffffffffffffffffffffffffffffffffffff8116811462001a4857600080fd5b60008060408385031215620036ef57600080fd5b620036fa83620036a3565b915060208301356200370c81620036b8565b809150509250929050565b801515811462001a4857600080fd5b60008083601f8401126200373957600080fd5b50813567ffffffffffffffff8111156200375257600080fd5b6020830191508360208285010111156200376b57600080fd5b9250929050565b6000806000806000608086880312156200378b57600080fd5b6200379686620036a3565b94506020860135620037a881620036b8565b93506040860135620037ba8162003717565b9250606086013567ffffffffffffffff811115620037d757600080fd5b620037e58882890162003726565b969995985093965092949392505050565b6000602082840312156200380957600080fd5b5035919050565b6000602082840312156200382357600080fd5b6200382e82620036a3565b9392505050565b806104008101831015620008b657600080fd5b60008060008060008060008060008060006105208c8e0312156200386b57600080fd5b620038778d8d62003835565b9a50620038886104008d01620036a3565b99506104208c013598506104408c01359750620038a96104608d01620036a3565b96506104808c0135620038bc81620036b8565b9550620038cd6104a08d01620036a3565b94506104c08c0135620038e081620036b8565b93506104e08c013592506105008c013567ffffffffffffffff8111156200390657600080fd5b620039148e828f0162003726565b915080935050809150509295989b509295989b9093969950565b6000602082840312156200394157600080fd5b81356200382e81620036b8565b60ff8116811462001a4857600080fd5b600080600080600080600060e0888a0312156200397a57600080fd5b873562003987816200394e565b96506200399760208901620036a3565b95506040880135620039a981620036b8565b9450620039b960608901620036a3565b93506080880135620039cb81620036b8565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215620039fe57600080fd5b62003a0984620036a3565b9250602084013562003a1b81620036b8565b9150604084013562003a2d81620036b8565b809150509250925092565b600080600080600080600060a0888a03121562003a5457600080fd5b62003a5f88620036a3565b9650602088013562003a7181620036b8565b9550604088013567ffffffffffffffff8082111562003a8f57600080fd5b62003a9d8b838c0162003726565b909750955060608a013591508082111562003ab757600080fd5b5062003ac68a828b0162003726565b909450925050608088013562003adc816200394e565b8091505092959891949750929550565b600080600080600080600060c0888a03121562003b0857600080fd5b62003b1388620036a3565b9650602088013562003b2581620036b8565b955060408801359450606088013562003b3e81620036b8565b9350608088013562003b508162003717565b925060a088013567ffffffffffffffff81111562003b6d57600080fd5b62003b7b8a828b0162003726565b989b979a50959850939692959293505050565b600080600080610460858703121562003ba657600080fd5b8435935062003bb9866020870162003835565b925062003bca6104208601620036a3565b939692955092936104400135925050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600061010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003c85828501878962003bdb565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b8381101562003cfb57818101518382015260200162003ce1565b50506000910152565b6000825162003d1881846020870162003cde565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003d6c5762003d6c62003caf565b604052919050565b600067ffffffffffffffff82111562003d915762003d9162003caf565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011262003dcf57600080fd5b813562003de662003de08262003d74565b62003d22565b81815284602083860101111562003dfc57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562003e2f57600080fd5b833567ffffffffffffffff8082111562003e4857600080fd5b62003e568783880162003dbd565b9450602086013591508082111562003e6d57600080fd5b5062003e7c8682870162003dbd565b925050604084013562003a2d816200394e565b6000815180845262003ea981602086016020860162003cde565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60608152600062003ef0606083018662003e8f565b828103602084015262003f04818662003e8f565b91505060ff83166040830152949350505050565b63ffffffff86168152600073ffffffffffffffffffffffffffffffffffffffff808716602084015280861660408401525060806060830152620035a260808301848662003bdb565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff8416602082015260606040820152600062003f9e60608301848662003bdb565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036200403a576200403a62003fd7565b5060010190565b6060815260006200405760608301878962003bdb565b82810360208401526200406c81868862003bdb565b91505060ff831660408301529695505050505050565b600083516200409681846020880162003cde565b835190830190620040ac81836020880162003cde565b01949350505050565b600181815b808511156200411457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620040f857620040f862003fd7565b808516156200410657918102915b93841c9390800290620040ba565b509250929050565b6000826200412d57506001620008b6565b816200413c57506000620008b6565b8160018114620041555760028114620041605762004180565b6001915050620008b6565b60ff84111562004174576200417462003fd7565b50506001821b620008b6565b5060208310610133831016604e8410600b8410161715620041a5575081810a620008b6565b620041b18383620040b5565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620041e657620041e662003fd7565b029392505050565b60006200382e83836200411c565b81810381811115620008b657620008b662003fd7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000602082840312156200425457600080fd5b5051919050565b600061010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620042bb8285018762003e8f565b925080851660e085015250509998505050505050505050565b600060208284031215620042e757600080fd5b81516200382e8162003717565b600080858511156200430557600080fd5b838611156200431357600080fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620043615780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a0312156200438557600080fd5b87356200439281620036b8565b96506020880135620043a481620036b8565b955060408801359450606088013593506080880135620039cb816200394e565b600080600080600080600080610100898b031215620043e257600080fd5b8835620043ef81620036b8565b975060208901356200440181620036b8565b965060408901359550606089013594506080890135620044218162003717565b935060a089013562004433816200394e565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200446357600080fd5b81516200382e816200394e565b6000602082840312156200448357600080fd5b815167ffffffffffffffff8111156200449b57600080fd5b8201601f81018413620044ad57600080fd5b8051620044be62003de08262003d74565b818152856020838501011115620044d457600080fd5b620044e782602083016020860162003cde565b95945050505050565b6020815260006200382e602083018462003e8f56fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212206fe049be388a1d04319b9913fe6d100c4c8e272fe0f5748eb056bd0622beabcc64736f6c63430008140033a2646970667358221220eaf51b06c631bb8661a0406c1fa0d2b53d2a3e33075c841dcabb74480b37a55864736f6c63430008140033", + "deployedBytecode": "0x608060405260043610620001e75760003560e01c8063715018a6116200010b578063bab161bf11620000a1578063dbc16976116200006c578063dbc169761462000728578063ee25560b1462000740578063f2fde38b1462000771578063fb570834146200079657600080fd5b8063bab161bf1462000663578063be5831c7146200069d578063cd58657914620006d9578063d02103ca14620006f057600080fd5b80638da5cb5b11620000e25780638da5cb5b14620005b457806391e57e2d14620005e15780639e34070f14620005f9578063aaa13cc2146200063e57600080fd5b8063715018a6146200053d57806379e2cf97146200055557806381b1c174146200056d57600080fd5b80632d2c9d94116200018157806334ac9cf2116200015857806334ac9cf214620003dd5780633ae05047146200040c5780633e1970431462000424578063647c576c146200051857600080fd5b80632d2c9d9414620003085780632dfdf0b5146200032d578063318aee3d146200035457600080fd5b8063240ff37811620001c2578063240ff37814620002825780632b5e42e714620002995780632c3f58cd14620002be5780632cffd02e14620002e357600080fd5b806315064c9614620001ec5780632072f6c5146200021d57806322e95f2c1462000237575b600080fd5b348015620001f957600080fd5b50606854620002089060ff1681565b60405190151581526020015b60405180910390f35b3480156200022a57600080fd5b5062000235620007bb565b005b3480156200024457600080fd5b506200025c62000256366004620036db565b62000819565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200162000214565b620002356200029336600462003772565b620008bc565b348015620002a657600080fd5b5062000235620002b8366004620037f6565b62000ae4565b348015620002cb57600080fd5b5062000235620002dd36600462003810565b62000af3565b348015620002f057600080fd5b50620002356200030236600462003848565b62000b39565b3480156200031557600080fd5b50620002356200032736600462003848565b620010dd565b3480156200033a57600080fd5b506200034560535481565b60405190815260200162000214565b3480156200036157600080fd5b50620003ab620003733660046200392e565b606b6020526000908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff90911660208301520162000214565b348015620003ea57600080fd5b50606c546200025c9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156200041957600080fd5b5062000345620012e1565b3480156200043157600080fd5b5062000345620004433660046200395e565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200052557600080fd5b506200023562000537366004620039e8565b620013c7565b3480156200054a57600080fd5b506200023562001622565b3480156200056257600080fd5b506200023562001638565b3480156200057a57600080fd5b506200025c6200058c366004620037f6565b606a6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005c157600080fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff166200025c565b348015620005ee57600080fd5b506200034560d15481565b3480156200060657600080fd5b506200020862000618366004620037f6565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b3480156200064b57600080fd5b506200025c6200065d36600462003a38565b62001672565b3480156200067057600080fd5b506068546200068790610100900463ffffffff1681565b60405163ffffffff909116815260200162000214565b348015620006aa57600080fd5b506068546200068790790100000000000000000000000000000000000000000000000000900463ffffffff1681565b62000235620006ea36600462003aec565b6200185e565b348015620006fd57600080fd5b506068546200025c9065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200073557600080fd5b506200023562001932565b3480156200074d57600080fd5b50620003456200075f366004620037f6565b60696020526000908152604090205481565b3480156200077e57600080fd5b5062000235620007903660046200392e565b6200198e565b348015620007a357600080fd5b5062000208620007b536600462003b8e565b62001a4b565b606c5473ffffffffffffffffffffffffffffffffffffffff1633146200080d576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200081762001b34565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091206000908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620008fa576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620009205750600263ffffffff861610155b1562000958576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009ae9998979695949392919062003c24565b60405180910390a162000acc62000ac66001606860019054906101000a900463ffffffff16338989348989604051620009e992919062003c9f565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b62001bc8565b821562000add5762000add62001cdf565b5050505050565b62000aee62001db4565b60d155565b62000afd62001db4565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b77576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b8e8b8b8b8b8b8b8b8b8b8b8b600062001e37565b73ffffffffffffffffffffffffffffffffffffffff861662000c6a576040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000be3919062003d04565b60006040518083038185875af1925050503d806000811462000c22576040519150601f19603f3d011682016040523d82523d6000602084013e62000c27565b606091505b505090508062000c63576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062001065565b60685463ffffffff61010090910481169088160362000cac5762000ca673ffffffffffffffffffffffffffffffffffffffff8716858562002028565b62001065565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b166024820152600090603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000fd7576000808062000d818688018862003e19565b92509250925060008584848460405162000d9b9062003695565b62000da99392919062003edb565b8190604051809103906000f590508015801562000dca573d6000803e3d6000fd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f1990604401600060405180830381600087803b15801562000e4057600080fd5b505af115801562000e55573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000fc595949392919062003f18565b60405180910390a15050505062001062565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f1990604401600060405180830381600087803b1580156200104857600080fd5b505af11580156200105d573d6000803e3d6000fd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff16156200111b576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620011328b8b8b8b8b8b8b8b8b8b8b600162001e37565b60008473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162001165949392919062003f60565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f20000000000000000000000000000000000000000000000000000000017905251620011e8919062003d04565b60006040518083038185875af1925050503d806000811462001227576040519150601f19603f3d011682016040523d82523d6000602084013e6200122c565b606091505b505090508062001268576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b605354600090819081805b6020811015620013be578083901c6001166001036200134f57603381602081106200131b576200131b62003fa8565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200137c565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013b59062004006565b915050620012ec565b50919392505050565b600054610100900460ff1615808015620013e85750600054600160ff909116105b80620014045750303b15801562001404575060005460ff166001145b62001496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014f557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d155620015b8620020fe565b80156200161c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6200162c62001db4565b6200081760006200219d565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000817576200081762001cdf565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201526000908190603801604051602081830303815290604052805190602001209050600060ff60f81b308360405180602001620017089062003695565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905262001753908d908d908d908d908d9060200162004041565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001791929160200162004082565b604051602081830303815290604052805190602001206040516020016200181a94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d15434111562001918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200148d565b620019298787878787878762002214565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001984576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620008176200276f565b6200199862001db4565b73ffffffffffffffffffffffffffffffffffffffff811662001a3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200148d565b62001a48816200219d565b50565b600084815b602081101562001b2657600163ffffffff8616821c8116900362001ac25785816020811062001a835762001a8362003fa8565b60200201358260405160200162001aa4929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001b11565b8186826020811062001ad85762001ad862003fa8565b602002013560405160200162001af8929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001b1d8162004006565b91505062001a50565b50821490505b949350505050565b60685460ff161562001b72576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b80600162001bd960206002620041ee565b62001be59190620041fc565b6053541062001c20576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060536000815462001c339062004006565b9182905550905060005b602081101562001ccf578082901c60011660010362001c7557826033826020811062001c6d5762001c6d62003fa8565b015550505050565b6033816020811062001c8b5762001c8b62003fa8565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001cc69062004006565b91505062001c3d565b5062001cda62004212565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001d65620012e1565b6040518263ffffffff1660e01b815260040162001d8491815260200190565b600060405180830381600087803b15801562001d9f57600080fd5b505af11580156200161c573d6000803e3d6000fd5b609f5473ffffffffffffffffffffffffffffffffffffffff16331462000817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200148d565b62001e488b63ffffffff16620027ff565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b363200000000000000000000000000000000000000000000000000000000909252606481019190915260009165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303816000875af115801562001eeb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001f11919062004241565b90508060000362001f4d576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462001f97576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606854600090610100900463ffffffff1662001fb557508962001fb8565b508a5b62001fe162001fd8848c8c8c8c8c8c8c604051620009e992919062003c9f565b8f8f8462001a4b565b62002018576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001cda9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002864565b600054610100900460ff1662002197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200148d565b62000817335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60685460ff161562002252576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200225c62002977565b60685463ffffffff888116610100909204161480620022825750600263ffffffff881610155b15620022ba576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060608773ffffffffffffffffffffffffffffffffffffffff8816620023205788341462002316576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600092506200261a565b341562002359576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089166000908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901562002449576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac90604401600060405180830381600087803b1580156200241c57600080fd5b505af115801562002431573d6000803e3d6000fd5b50505050806020015194508060000151935062002618565b85156200245e576200245e898b8989620029ec565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa158015620024cc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620024f2919062004241565b90506200251873ffffffffffffffffffffffffffffffffffffffff8b1633308e62002f0a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa15801562002586573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620025ac919062004241565b9050620025ba8282620041fc565b6068548c9850610100900463ffffffff1696509350620025da8762002f6a565b620025e58c62003082565b620025f08d6200318f565b604051602001620026049392919062003edb565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e86886053546040516200265c9897969594939291906200425b565b60405180910390a16200275062000ac6600085878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b861562002761576200276162001cdf565b505050506200192960018055565b60685460ff16620027ac576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600881901c60008181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000add576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000620028c8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200328b9092919063ffffffff16565b80519091501562001cda5780806020019051810190620028e99190620042d4565b62001cda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200148d565b600260015403620029e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200148d565b6002600155565b6000620029fd6004828486620042f4565b62002a089162004320565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002c8757600080808080808062002a6b896004818d620042f4565b81019062002a7a919062004369565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002aee576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002b3e576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002b78576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002c33919062003d04565b6000604051808303816000865af19150503d806000811462002c72576040519150601f19603f3d011682016040523d82523d6000602084013e62002c77565b606091505b5050505050505050505062000add565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002d03576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008080808080808062002d1b8a6004818e620042f4565b81019062002d2a9190620043c4565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002da0576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002df0576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002eb4919062003d04565b6000604051808303816000865af19150503d806000811462002ef3576040519150601f19603f3d011682016040523d82523d6000602084013e62002ef8565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526200161c9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016200207b565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162002fee919062003d04565b600060405180830381855afa9150503d80600081146200302b576040519150601f19603f3d011682016040523d82523d6000602084013e62003030565b606091505b50915091508162003077576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001b2c565b62001b2c816200329c565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162003106919062003d04565b600060405180830381855afa9150503d806000811462003143576040519150601f19603f3d011682016040523d82523d6000602084013e62003148565b606091505b50915091508162003077576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001b2c565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169162003212919062003d04565b600060405180830381855afa9150503d80600081146200324f576040519150601f19603f3d011682016040523d82523d6000602084013e62003254565b606091505b509150915081801562003268575080516020145b6200327557601262001b2c565b8080602001905181019062001b2c919062004450565b606062001b2c84846000856200348c565b60606040825110620032be5781806020019051810190620008b6919062004470565b81516020036200344e5760005b602081108015620033165750828181518110620032ec57620032ec62003fa8565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620033315780620033288162004006565b915050620032cb565b806000036200337557505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111562003393576200339362003caf565b6040519080825280601f01601f191660200182016040528015620033be576020820181803683370190505b50905060005b828110156200344657848181518110620033e257620033e262003fa8565b602001015160f81c60f81b82828151811062003402576200340262003fa8565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806200343d8162004006565b915050620033c4565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200148d565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516200354b919062003d04565b60006040518083038185875af1925050503d80600081146200358a576040519150601f19603f3d011682016040523d82523d6000602084013e6200358f565b606091505b5091509150620035a287838387620035ad565b979650505050505050565b6060831562003648578251600003620036405773ffffffffffffffffffffffffffffffffffffffff85163b62003640576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200148d565b508162001b2c565b62001b2c83838151156200365f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200148d9190620044f0565b611b66806200450683390190565b803563ffffffff811681146200348757600080fd5b73ffffffffffffffffffffffffffffffffffffffff8116811462001a4857600080fd5b60008060408385031215620036ef57600080fd5b620036fa83620036a3565b915060208301356200370c81620036b8565b809150509250929050565b801515811462001a4857600080fd5b60008083601f8401126200373957600080fd5b50813567ffffffffffffffff8111156200375257600080fd5b6020830191508360208285010111156200376b57600080fd5b9250929050565b6000806000806000608086880312156200378b57600080fd5b6200379686620036a3565b94506020860135620037a881620036b8565b93506040860135620037ba8162003717565b9250606086013567ffffffffffffffff811115620037d757600080fd5b620037e58882890162003726565b969995985093965092949392505050565b6000602082840312156200380957600080fd5b5035919050565b6000602082840312156200382357600080fd5b6200382e82620036a3565b9392505050565b806104008101831015620008b657600080fd5b60008060008060008060008060008060006105208c8e0312156200386b57600080fd5b620038778d8d62003835565b9a50620038886104008d01620036a3565b99506104208c013598506104408c01359750620038a96104608d01620036a3565b96506104808c0135620038bc81620036b8565b9550620038cd6104a08d01620036a3565b94506104c08c0135620038e081620036b8565b93506104e08c013592506105008c013567ffffffffffffffff8111156200390657600080fd5b620039148e828f0162003726565b915080935050809150509295989b509295989b9093969950565b6000602082840312156200394157600080fd5b81356200382e81620036b8565b60ff8116811462001a4857600080fd5b600080600080600080600060e0888a0312156200397a57600080fd5b873562003987816200394e565b96506200399760208901620036a3565b95506040880135620039a981620036b8565b9450620039b960608901620036a3565b93506080880135620039cb81620036b8565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215620039fe57600080fd5b62003a0984620036a3565b9250602084013562003a1b81620036b8565b9150604084013562003a2d81620036b8565b809150509250925092565b600080600080600080600060a0888a03121562003a5457600080fd5b62003a5f88620036a3565b9650602088013562003a7181620036b8565b9550604088013567ffffffffffffffff8082111562003a8f57600080fd5b62003a9d8b838c0162003726565b909750955060608a013591508082111562003ab757600080fd5b5062003ac68a828b0162003726565b909450925050608088013562003adc816200394e565b8091505092959891949750929550565b600080600080600080600060c0888a03121562003b0857600080fd5b62003b1388620036a3565b9650602088013562003b2581620036b8565b955060408801359450606088013562003b3e81620036b8565b9350608088013562003b508162003717565b925060a088013567ffffffffffffffff81111562003b6d57600080fd5b62003b7b8a828b0162003726565b989b979a50959850939692959293505050565b600080600080610460858703121562003ba657600080fd5b8435935062003bb9866020870162003835565b925062003bca6104208601620036a3565b939692955092936104400135925050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600061010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003c85828501878962003bdb565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b8381101562003cfb57818101518382015260200162003ce1565b50506000910152565b6000825162003d1881846020870162003cde565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003d6c5762003d6c62003caf565b604052919050565b600067ffffffffffffffff82111562003d915762003d9162003caf565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011262003dcf57600080fd5b813562003de662003de08262003d74565b62003d22565b81815284602083860101111562003dfc57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562003e2f57600080fd5b833567ffffffffffffffff8082111562003e4857600080fd5b62003e568783880162003dbd565b9450602086013591508082111562003e6d57600080fd5b5062003e7c8682870162003dbd565b925050604084013562003a2d816200394e565b6000815180845262003ea981602086016020860162003cde565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60608152600062003ef0606083018662003e8f565b828103602084015262003f04818662003e8f565b91505060ff83166040830152949350505050565b63ffffffff86168152600073ffffffffffffffffffffffffffffffffffffffff808716602084015280861660408401525060806060830152620035a260808301848662003bdb565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff8416602082015260606040820152600062003f9e60608301848662003bdb565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036200403a576200403a62003fd7565b5060010190565b6060815260006200405760608301878962003bdb565b82810360208401526200406c81868862003bdb565b91505060ff831660408301529695505050505050565b600083516200409681846020880162003cde565b835190830190620040ac81836020880162003cde565b01949350505050565b600181815b808511156200411457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620040f857620040f862003fd7565b808516156200410657918102915b93841c9390800290620040ba565b509250929050565b6000826200412d57506001620008b6565b816200413c57506000620008b6565b8160018114620041555760028114620041605762004180565b6001915050620008b6565b60ff84111562004174576200417462003fd7565b50506001821b620008b6565b5060208310610133831016604e8410600b8410161715620041a5575081810a620008b6565b620041b18383620040b5565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620041e657620041e662003fd7565b029392505050565b60006200382e83836200411c565b81810381811115620008b657620008b662003fd7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000602082840312156200425457600080fd5b5051919050565b600061010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620042bb8285018762003e8f565b925080851660e085015250509998505050505050505050565b600060208284031215620042e757600080fd5b81516200382e8162003717565b600080858511156200430557600080fd5b838611156200431357600080fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620043615780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a0312156200438557600080fd5b87356200439281620036b8565b96506020880135620043a481620036b8565b955060408801359450606088013593506080880135620039cb816200394e565b600080600080600080600080610100898b031215620043e257600080fd5b8835620043ef81620036b8565b975060208901356200440181620036b8565b965060408901359550606089013594506080890135620044218162003717565b935060a089013562004433816200394e565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200446357600080fd5b81516200382e816200394e565b6000602082840312156200448357600080fd5b815167ffffffffffffffff8111156200449b57600080fd5b8201601f81018413620044ad57600080fd5b8051620044be62003de08262003d74565b818152856020838501011115620044d457600080fd5b620044e782602083016020860162003cde565b95945050505050565b6020815260006200382e602083018462003e8f56fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212206fe049be388a1d04319b9913fe6d100c4c8e272fe0f5748eb056bd0622beabcc64736f6c63430008140033a2646970667358221220eaf51b06c631bb8661a0406c1fa0d2b53d2a3e33075c841dcabb74480b37a55864736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMBridgeV2.json b/compiled-contracts/paris/PolygonZkEVMBridgeV2.json index b11f33fe5..439f1cc4a 100644 --- a/compiled-contracts/paris/PolygonZkEVMBridgeV2.json +++ b/compiled-contracts/paris/PolygonZkEVMBridgeV2.json @@ -3,6 +3,11 @@ "contractName": "PolygonZkEVMBridgeV2", "sourceName": "contracts/v2/PolygonZkEVMBridgeV2.sol", "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, { "inputs": [], "name": "AlreadyClaimed", @@ -23,6 +28,11 @@ "name": "EtherTransferFailed", "type": "error" }, + { + "inputs": [], + "name": "FailedTokenWrappedDeployment", + "type": "error" + }, { "inputs": [], "name": "GasTokenNetworkMustBeZeroOnEther", @@ -246,6 +256,19 @@ "name": "NewWrappedToken", "type": "event" }, + { + "inputs": [], + "name": "BASE_INIT_BYTECODE_WRAPPED_TOKEN", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "WETHToken", @@ -983,8 +1006,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50615380806100206000396000f3fe608060405260043610620001bb5760003560e01c806383f2440311620000f5578063ccaa2d111162000090578063ccaa2d11146200056b578063cd5865791462000590578063d02103ca14620005a7578063dbc1697614620005d0578063ee25560b14620005e8578063f5efcd791462000619578063f811bff7146200063e578063fb570834146200066357600080fd5b806383f2440314620004465780638ed7e3f2146200046b578063aaa13cc2146200048d578063b8b284d014620004b2578063bab161bf14620004d7578063be5831c714620004fb578063c00f14ab1462000521578063cc461632146200054657600080fd5b80633c351e1011620001665780633c351e1014620003125780633cbc795b14620003345780633e19704314620003705780634b2f336d14620003955780635ca1e16514620003b75780637843298b14620003cf57806379e2cf9714620003f457806381b1c174146200040c57600080fd5b806315064c9614620001c05780632072f6c514620001f157806322e95f2c146200020b578063240ff378146200023f57806327aef4e814620002565780632dfdf0b5146200027d578063318aee3d14620002a4575b600080fd5b348015620001cd57600080fd5b50606854620001dc9060ff1681565b60405190151581526020015b60405180910390f35b348015620001fe57600080fd5b506200020962000688565b005b3480156200021857600080fd5b50620002306200022a36600462002d1c565b620006c0565b604051620001e8919062002d58565b620002096200025036600462002dc6565b62000713565b3480156200026357600080fd5b506200026e62000788565b604051620001e8919062002e9d565b3480156200028a57600080fd5b506200029560535481565b604051908152602001620001e8565b348015620002b157600080fd5b50620002ed620002c336600462002eb9565b606b6020526000908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201620001e8565b3480156200031f57600080fd5b50606d5462000230906001600160a01b031681565b3480156200034157600080fd5b50606d546200035a90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001620001e8565b3480156200037d57600080fd5b50620002956200038f36600462002ee9565b6200081e565b348015620003a257600080fd5b50606f5462000230906001600160a01b031681565b348015620003c457600080fd5b5062000295620008ab565b348015620003dc57600080fd5b5062000230620003ee36600462002f73565b62000991565b3480156200040157600080fd5b5062000209620009c2565b3480156200041957600080fd5b50620002306200042b36600462002fc3565b606a602052600090815260409020546001600160a01b031681565b3480156200045357600080fd5b50620002956200046536600462002ff0565b620009e6565b3480156200047857600080fd5b50606c5462000230906001600160a01b031681565b3480156200049a57600080fd5b5062000230620004ac3660046200310d565b62000aca565b348015620004bf57600080fd5b5062000209620004d1366004620031b5565b62000bdb565b348015620004e457600080fd5b506068546200035a90610100900463ffffffff1681565b3480156200050857600080fd5b506068546200035a90600160c81b900463ffffffff1681565b3480156200052e57600080fd5b506200026e6200054036600462002eb9565b62000caa565b3480156200055357600080fd5b50620001dc6200056536600462003241565b62000cf7565b3480156200057857600080fd5b50620002096200058a36600462003279565b62000d87565b62000209620005a136600462003374565b620012c6565b348015620005b457600080fd5b506068546200023090600160281b90046001600160a01b031681565b348015620005dd57600080fd5b506200020962001759565b348015620005f557600080fd5b50620002956200060736600462002fc3565b60696020526000908152604090205481565b3480156200062657600080fd5b50620002096200063836600462003279565b6200178f565b3480156200064b57600080fd5b50620002096200065d36600462003415565b62001a45565b3480156200067057600080fd5b50620001dc62000682366004620034cc565b62001ccf565b606c546001600160a01b03163314620006b457604051631736745960e31b815260040160405180910390fd5b620006be62001ce9565b565b6000606a60008484604051602001620006db92919062003519565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b60685460ff16156200073857604051630bc011ff60e21b815260040160405180910390fd5b3415801590620007525750606f546001600160a01b031615155b1562000771576040516301bd897160e61b815260040160405180910390fd5b6200078185853486868662001d46565b5050505050565b606e8054620007979062003543565b80601f0160208091040260200160405190810160405280929190818152602001828054620007c59062003543565b8015620008165780601f10620007ea5761010080835404028352916020019162000816565b820191906000526020600020905b815481529060010190602001808311620007f857829003601f168201915b505050505081565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b605354600090819081805b602081101562000988578083901c600116600103620009195760338160208110620008e557620008e56200357f565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062000946565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806200097f90620035ab565b915050620008b6565b50919392505050565b6000620009ba8484620009a48562001e1a565b620009af8662001ee1565b620004ac8762001f9f565b949350505050565b605354606854600160c81b900463ffffffff161015620006be57620006be62002060565b600083815b602081101562000ac157600163ffffffff8516821c8116900362000a5d5784816020811062000a1e5762000a1e6200357f565b60200201358260405160200162000a3f929190918252602082015260400190565b60405160208183030381529060405280519060200120915062000aac565b8185826020811062000a735762000a736200357f565b602002013560405160200162000a93929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062000ab881620035ab565b915050620009eb565b50949350505050565b600080868660405160200162000ae292919062003519565b604051602081830303815290604052805190602001209050600060ff60f81b30836040518060200162000b159062002ce0565b601f1982820381018352601f90910116604081905262000b3e908b908b908b90602001620035c7565b60408051601f198184030181529082905262000b5e929160200162003604565b6040516020818303038152906040528051906020012060405160200162000bb794939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff161562000c0057604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b031662000c2a5760405163dde3cda760e01b815260040160405180910390fd5b606f54604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac9062000c5e903390889060040162003637565b600060405180830381600087803b15801562000c7957600080fd5b505af115801562000c8e573d6000803e3d6000fd5b5050505062000ca286868686868662001d46565b505050505050565b606062000cb78262001e1a565b62000cc28362001ee1565b62000ccd8462001f9f565b60405160200162000ce193929190620035c7565b6040516020818303038152906040529050919050565b6068546000908190610100900463ffffffff1615801562000d1e575063ffffffff83166001145b1562000d32575063ffffffff831662000d5d565b62000d48600160201b63ffffffff851662003650565b62000d5a9063ffffffff86166200366a565b90505b600881901c600090815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000dac57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161462000ddd576040516302caf51760e11b815260040160405180910390fd5b62000e178c8c8c8c8c62000e1160008e8e8e8e8e8e8e60405162000e0392919062003680565b60405180910390206200081e565b620020fe565b6001600160a01b03861662000f5d57606f546001600160a01b031662000eef5760006001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000e71576020820181803683370190505b5060405162000e81919062003690565b60006040518083038185875af1925050503d806000811462000ec0576040519150601f19603f3d011682016040523d82523d6000602084013e62000ec5565b606091505b505090508062000ee857604051630ce8f45160e31b815260040160405180910390fd5b5062001277565b606f546040516340c10f1960e01b81526001600160a01b03909116906340c10f199062000f23908790879060040162003637565b600060405180830381600087803b15801562000f3e57600080fd5b505af115801562000f53573d6000803e3d6000fd5b5050505062001277565b606d546001600160a01b03878116911614801562000f8c5750606d5463ffffffff888116600160a01b90920416145b1562000fa65760006001600160a01b038516848262000e46565b60685463ffffffff61010090910481169088160362000fdb5762000fd56001600160a01b03871685856200226f565b62001277565b6000878760405160200162000ff292919062003519565b60408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b0316806200120f57600080806200103b86880188620036ae565b925092509250600085848484604051620010559062002ce0565b6200106393929190620035c7565b8190604051809103906000f590508015801562001084573d6000803e3d6000fd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f1990620010b8908d908d9060040162003637565b600060405180830381600087803b158015620010d357600080fd5b505af1158015620010e8573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b604051620011fd9594939291906200374c565b60405180910390a15050505062001274565b6040516340c10f1960e01b81526001600160a01b038216906340c10f19906200123f908990899060040162003637565b600060405180830381600087803b1580156200125a57600080fd5b505af11580156200126f573d6000803e3d6000fd5b505050505b50505b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8a88888787604051620012b095949392919062003787565b60405180910390a1505050505050505050505050565b60685460ff1615620012eb57604051630bc011ff60e21b815260040160405180910390fd5b620012f5620022ce565b60685463ffffffff61010090910481169088160362001327576040516302caf51760e11b815260040160405180910390fd5b6000806060876001600160a01b03881662001418578834146200135d5760405163b89240f560e01b815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff169450906200138c9062003543565b80601f0160208091040260200160405190810160405280929190818152602001828054620013ba9062003543565b80156200140b5780601f10620013df576101008083540402835291602001916200140b565b820191906000526020600020905b815481529060010190602001808311620013ed57829003601f168201915b50505050509150620016c4565b3415620014385760405163798ee6f160e01b815260040160405180910390fd5b606f546001600160a01b0390811690891603620014b957604051632770a7eb60e21b81526001600160a01b03891690639dc29fac906200147f9033908d9060040162003637565b600060405180830381600087803b1580156200149a57600080fd5b505af1158015620014af573d6000803e3d6000fd5b50505050620016c4565b6001600160a01b038089166000908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b900490921691810182905290156200157757604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac906200152f9033908e9060040162003637565b600060405180830381600087803b1580156200154a57600080fd5b505af11580156200155f573d6000803e3d6000fd5b505050508060200151945080600001519350620016b5565b85156200158c576200158c898b898962002329565b6040516370a0823160e01b81526000906001600160a01b038b16906370a0823190620015bd90309060040162002d58565b602060405180830381865afa158015620015db573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620016019190620037b9565b90506200161a6001600160a01b038b1633308e6200268b565b6040516370a0823160e01b81526000906001600160a01b038c16906370a08231906200164b90309060040162002d58565b602060405180830381865afa15801562001669573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200168f9190620037b9565b90506200169d8282620037d3565b6068548c9850610100900463ffffffff169650935050505b620016c08962000caa565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e868860535460405162001706989796959493929190620037e9565b60405180910390a1620017316200172b600085878f8f8789805190602001206200081e565b620026c5565b861562001742576200174262002060565b505050506200175060018055565b50505050505050565b606c546001600160a01b031633146200178557604051631736745960e31b815260040160405180910390fd5b620006be620027c4565b60685460ff1615620017b457604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614620017e5576040516302caf51760e11b815260040160405180910390fd5b6200180b8c8c8c8c8c62000e1160018e8e8e8e8e8e8e60405162000e0392919062003680565b606f546000906001600160a01b0316620018ca57846001600160a01b031684888a868660405160240162001843949392919062003856565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b179052516200187a919062003690565b60006040518083038185875af1925050503d8060008114620018b9576040519150601f19603f3d011682016040523d82523d6000602084013e620018be565b606091505b505080915050620019d6565b606f546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990620018fe908890889060040162003637565b600060405180830381600087803b1580156200191957600080fd5b505af11580156200192e573d6000803e3d6000fd5b50505050846001600160a01b03168789858560405160240162001955949392919062003856565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b179052516200198c919062003690565b6000604051808303816000865af19150503d8060008114620019cb576040519150601f19603f3d011682016040523d82523d6000602084013e620019d0565b606091505b50909150505b80620019f5576040516337e391c360e01b815260040160405180910390fd5b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8b8989888860405162001a2e95949392919062003787565b60405180910390a150505050505050505050505050565b600054610100900460ff161580801562001a665750600054600160ff909116105b8062001a825750303b15801562001a82575060005460ff166001145b62001aeb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562001b0f576000805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff8a160265010000000000600160c81b03191617600160281b6001600160a01b038781169190910291909117909155606c80546001600160a01b031916858316179055861662001b9b5763ffffffff85161562001b9557604051630d43a60960e11b815260040160405180910390fd5b62001c76565b606d805463ffffffff8716600160a01b026001600160c01b03199091166001600160a01b03891617179055606e62001bd48382620038dd565b506000801b601260405162001be99062002ce0565b6060808252600d908201526c2bb930b83832b21022ba3432b960991b608082015260a060208201819052600490820152630ae8aa8960e31b60c082015260ff909116604082015260e0018190604051809103906000f590508015801562001c54573d6000803e3d6000fd5b50606f80546001600160a01b0319166001600160a01b03929092169190911790555b62001c806200281d565b801562001750576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b60008162001cdf868686620009e6565b1495945050505050565b60685460ff161562001d0e57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b60685463ffffffff61010090910481169087160362001d78576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff1633898989888860535460405162001dce99989796959493929190620039a9565b60405180910390a162001e096200172b6001606860019054906101000a900463ffffffff16338a8a8a898960405162000e0392919062003680565b821562000ca25762000ca262002060565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009182916001600160a01b0386169162001e63919062003690565b600060405180830381855afa9150503d806000811462001ea0576040519150601f19603f3d011682016040523d82523d6000602084013e62001ea5565b606091505b50915091508162001ed657604051806040016040528060078152602001664e4f5f4e414d4560c81b815250620009ba565b620009ba8162002851565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009182916001600160a01b0386169162001f2a919062003690565b600060405180830381855afa9150503d806000811462001f67576040519150601f19603f3d011682016040523d82523d6000602084013e62001f6c565b606091505b50915091508162001ed657604051806040016040528060098152602001681393d7d4d6535093d360ba1b815250620009ba565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b0386169162001fe7919062003690565b600060405180830381855afa9150503d806000811462002024576040519150601f19603f3d011682016040523d82523d6000602084013e62002029565b606091505b50915091508180156200203d575080516020145b6200204a576012620009ba565b80806020019051810190620009ba919062003a18565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d620020a9620008ab565b6040518263ffffffff1660e01b8152600401620020c891815260200190565b600060405180830381600087803b158015620020e357600080fd5b505af1158015620020f8573d6000803e3d6000fd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101206312bd9b1960e11b9092526064810191909152600091600160281b90046001600160a01b03169063257b3632906084016020604051808303816000875af115801562002179573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200219f9190620037b9565b905080600003620021c257604051622f6fad60e01b815260040160405180910390fd5b600080600160401b8716156200220757869150620021e3848a848962001ccf565b62002201576040516338105f3b60e21b815260040160405180910390fd5b62002258565b602087901c6200221981600162003a38565b9150879250620022386200222f868c86620009e6565b8a838962001ccf565b62002256576040516338105f3b60e21b815260040160405180910390fd5b505b620022648282620029fa565b505050505050505050565b620022c98363a9059cbb60e01b84846040516024016200229192919062003637565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262002aaa565b505050565b600260015403620023225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001ae2565b6002600155565b60006200233a600482848662003a5f565b620023459162003a8b565b9050632afa533160e01b6001600160e01b0319821601620024e657600080808080808062002377896004818d62003a5f565b81019062002386919062003abc565b9650965096509650965096509650336001600160a01b0316876001600160a01b031614620023c75760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0386163014620023f15760405163750643af60e01b815260040160405180910390fd5b8a851462002412576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e169162002492919062003690565b6000604051808303816000865af19150503d8060008114620024d1576040519150601f19603f3d011682016040523d82523d6000602084013e620024d6565b606091505b5050505050505050505062000781565b6001600160e01b031981166323f2ebc360e21b146200251857604051637141605d60e11b815260040160405180910390fd5b600080808080808080620025308a6004818e62003a5f565b8101906200253f919062003b17565b97509750975097509750975097509750336001600160a01b0316886001600160a01b031614620025825760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0387163014620025ac5760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169162002635919062003690565b6000604051808303816000865af19150503d806000811462002674576040519150601f19603f3d011682016040523d82523d6000602084013e62002679565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052620020f89085906323b872dd60e01b9060840162002291565b806001620026d66020600262003ca0565b620026e29190620037d3565b6053541062002704576040516377ae67b360e11b815260040160405180910390fd5b60006053600081546200271790620035ab565b9182905550905060005b6020811015620027b3578082901c600116600103620027595782603382602081106200275157620027516200357f565b015550505050565b603381602081106200276f576200276f6200357f565b015460408051602081019290925281018490526060016040516020818303038152906040528051906020012092508080620027aa90620035ab565b91505062002721565b50620022c962003cae565b60018055565b60685460ff16620027e857604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600054610100900460ff16620028475760405162461bcd60e51b815260040162001ae29062003cc4565b620006be62002b83565b606060408251106200287357818060200190518101906200070d919062003d0f565b8151602003620029c75760005b602081108015620028b35750828181518110620028a157620028a16200357f565b01602001516001600160f81b03191615155b15620028ce5780620028c581620035ab565b91505062002880565b80600003620029075750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b6000816001600160401b0381111562002924576200292462003034565b6040519080825280601f01601f1916602001820160405280156200294f576020820181803683370190505b50905060005b82811015620029bf578481815181106200297357620029736200357f565b602001015160f81c60f81b8282815181106200299357620029936200357f565b60200101906001600160f81b031916908160001a90535080620029b681620035ab565b91505062002955565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b606854600090610100900463ffffffff1615801562002a1f575063ffffffff82166001145b1562002a33575063ffffffff821662002a5e565b62002a49600160201b63ffffffff841662003650565b62002a5b9063ffffffff85166200366a565b90505b600881901c60008181526069602052604081208054600160ff861690811b918218928390559290919081831690036200175057604051630c8d9eab60e31b815260040160405180910390fd5b600062002b01826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031662002bad9092919063ffffffff16565b805190915015620022c9578080602001905181019062002b22919062003d8e565b620022c95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162001ae2565b600054610100900460ff16620027be5760405162461bcd60e51b815260040162001ae29062003cc4565b6060620009ba848460008585600080866001600160a01b0316858760405162002bd7919062003690565b60006040518083038185875af1925050503d806000811462002c16576040519150601f19603f3d011682016040523d82523d6000602084013e62002c1b565b606091505b509150915062002c2e8783838762002c39565b979650505050505050565b6060831562002cad57825160000362002ca5576001600160a01b0385163b62002ca55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001ae2565b5081620009ba565b620009ba838381511562002cc45781518083602001fd5b8060405162461bcd60e51b815260040162001ae2919062002e9d565b61159c8062003daf83390190565b803563ffffffff81168114620029f557600080fd5b6001600160a01b038116811462002d1957600080fd5b50565b6000806040838503121562002d3057600080fd5b62002d3b8362002cee565b9150602083013562002d4d8162002d03565b809150509250929050565b6001600160a01b0391909116815260200190565b801515811462002d1957600080fd5b60008083601f84011262002d8e57600080fd5b5081356001600160401b0381111562002da657600080fd5b60208301915083602082850101111562002dbf57600080fd5b9250929050565b60008060008060006080868803121562002ddf57600080fd5b62002dea8662002cee565b9450602086013562002dfc8162002d03565b9350604086013562002e0e8162002d6c565b925060608601356001600160401b0381111562002e2a57600080fd5b62002e388882890162002d7b565b969995985093965092949392505050565b60005b8381101562002e6657818101518382015260200162002e4c565b50506000910152565b6000815180845262002e8981602086016020860162002e49565b601f01601f19169290920160200192915050565b60208152600062002eb2602083018462002e6f565b9392505050565b60006020828403121562002ecc57600080fd5b813562002eb28162002d03565b60ff8116811462002d1957600080fd5b600080600080600080600060e0888a03121562002f0557600080fd5b873562002f128162002ed9565b965062002f226020890162002cee565b9550604088013562002f348162002d03565b945062002f446060890162002cee565b9350608088013562002f568162002d03565b9699959850939692959460a0840135945060c09093013592915050565b60008060006060848603121562002f8957600080fd5b62002f948462002cee565b9250602084013562002fa68162002d03565b9150604084013562002fb88162002d03565b809150509250925092565b60006020828403121562002fd657600080fd5b5035919050565b8061040081018310156200070d57600080fd5b600080600061044084860312156200300757600080fd5b833592506200301a856020860162002fdd565b91506200302b610420850162002cee565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562003075576200307562003034565b604052919050565b60006001600160401b0382111562003099576200309962003034565b50601f01601f191660200190565b6000620030be620030b8846200307d565b6200304a565b9050828152838383011115620030d357600080fd5b828260208301376000602084830101529392505050565b600082601f830112620030fc57600080fd5b62002eb283833560208501620030a7565b600080600080600060a086880312156200312657600080fd5b620031318662002cee565b94506020860135620031438162002d03565b935060408601356001600160401b03808211156200316057600080fd5b6200316e89838a01620030ea565b945060608801359150808211156200318557600080fd5b506200319488828901620030ea565b9250506080860135620031a78162002ed9565b809150509295509295909350565b60008060008060008060a08789031215620031cf57600080fd5b620031da8762002cee565b95506020870135620031ec8162002d03565b9450604087013593506060870135620032058162002d6c565b925060808701356001600160401b038111156200322157600080fd5b6200322f89828a0162002d7b565b979a9699509497509295939492505050565b600080604083850312156200325557600080fd5b620032608362002cee565b9150620032706020840162002cee565b90509250929050565b6000806000806000806000806000806000806109208d8f0312156200329d57600080fd5b620032a98e8e62002fdd565b9b50620032bb8e6104008f0162002fdd565b9a506108008d013599506108208d013598506108408d01359750620032e46108608e0162002cee565b9650620032f66108808e013562002d03565b6108808d013595506200330d6108a08e0162002cee565b94506200331f6108c08e013562002d03565b6108c08d013593506108e08d013592506001600160401b036109008e013511156200334957600080fd5b6200335c8e6109008f01358f0162002d7b565b81935080925050509295989b509295989b509295989b565b600080600080600080600060c0888a0312156200339057600080fd5b6200339b8862002cee565b96506020880135620033ad8162002d03565b9550604088013594506060880135620033c68162002d03565b93506080880135620033d88162002d6c565b925060a08801356001600160401b03811115620033f457600080fd5b620034028a828b0162002d7b565b989b979a50959850939692959293505050565b60008060008060008060c087890312156200342f57600080fd5b6200343a8762002cee565b955060208701356200344c8162002d03565b94506200345c6040880162002cee565b935060608701356200346e8162002d03565b92506080870135620034808162002d03565b915060a08701356001600160401b038111156200349c57600080fd5b8701601f81018913620034ae57600080fd5b620034bf89823560208401620030a7565b9150509295509295509295565b6000806000806104608587031215620034e457600080fd5b84359350620034f7866020870162002fdd565b925062003508610420860162002cee565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b600181811c908216806200355857607f821691505b6020821081036200357957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201620035c057620035c062003595565b5060010190565b606081526000620035dc606083018662002e6f565b8281036020840152620035f0818662002e6f565b91505060ff83166040830152949350505050565b600083516200361881846020880162002e49565b8351908301906200362e81836020880162002e49565b01949350505050565b6001600160a01b03929092168252602082015260400190565b80820281158282048414176200070d576200070d62003595565b808201808211156200070d576200070d62003595565b8183823760009101908152919050565b60008251620036a481846020870162002e49565b9190910192915050565b600080600060608486031215620036c457600080fd5b83356001600160401b0380821115620036dc57600080fd5b620036ea87838801620030ea565b945060208601359150808211156200370157600080fd5b506200371086828701620030ea565b925050604084013562002fb88162002ed9565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b63ffffffff861681526001600160a01b0385811660208301528416604082015260806060820181905260009062002c2e908301848662003723565b94855263ffffffff9390931660208501526001600160a01b039182166040850152166060830152608082015260a00190565b600060208284031215620037cc57600080fd5b5051919050565b818103818111156200070d576200070d62003595565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c083018190526000916200383d8483018762002e6f565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff8416602082015260606040820181905260009062003889908301848662003723565b9695505050505050565b601f821115620022c957600081815260208120601f850160051c81016020861015620038bc5750805b601f850160051c820191505b8181101562000ca257828155600101620038c8565b81516001600160401b03811115620038f957620038f962003034565b62003911816200390a845462003543565b8462003893565b602080601f831160018114620039495760008415620039305750858301515b600019600386901b1c1916600185901b17855562000ca2565b600085815260208120601f198616915b828110156200397a5788860151825594840194600190910190840162003959565b5085821015620039995787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c08301819052600091620039fe848301878962003723565b925080851660e085015250509a9950505050505050505050565b60006020828403121562003a2b57600080fd5b815162002eb28162002ed9565b63ffffffff81811683821601908082111562003a585762003a5862003595565b5092915050565b6000808585111562003a7057600080fd5b8386111562003a7e57600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101562003ab45780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a03121562003ad857600080fd5b873562003ae58162002d03565b9650602088013562003af78162002d03565b95506040880135945060608801359350608088013562002f568162002ed9565b600080600080600080600080610100898b03121562003b3557600080fd5b883562003b428162002d03565b9750602089013562003b548162002d03565b96506040890135955060608901359450608089013562003b748162002d6c565b935060a089013562003b868162002ed9565b979a969950949793969295929450505060c08201359160e0013590565b600181815b8085111562003be457816000190482111562003bc85762003bc862003595565b8085161562003bd657918102915b93841c939080029062003ba8565b509250929050565b60008262003bfd575060016200070d565b8162003c0c575060006200070d565b816001811462003c25576002811462003c305762003c50565b60019150506200070d565b60ff84111562003c445762003c4462003595565b50506001821b6200070d565b5060208310610133831016604e8410600b841016171562003c75575081810a6200070d565b62003c81838362003ba3565b806000190482111562003c985762003c9862003595565b029392505050565b600062002eb2838362003bec565b634e487b7160e01b600052600160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60006020828403121562003d2257600080fd5b81516001600160401b0381111562003d3957600080fd5b8201601f8101841362003d4b57600080fd5b805162003d5c620030b8826200307d565b81815285602083850101111562003d7257600080fd5b62003d8582602083016020860162002e49565b95945050505050565b60006020828403121562003da157600080fd5b815162002eb28162002d6c56fe6101006040523480156200001257600080fd5b506040516200159c3803806200159c83398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516110e0620004bc60003960006101f70152600081816102ba015281816104e0015261054e0152600061049101526000818161031f015261045b01526110e06000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063a457c2d71161007c578063a457c2d7146102f4578063a9059cbb14610307578063cd0d00961461031a578063d505accf14610341578063dd62ed3e14610354578063ffa1ad741461036757600080fd5b806370a08231146102515780637ecebe001461027a57806395d89b411461029a5780639dc29fac146102a2578063a3c573eb146102b557600080fd5b806330adf81f116100ff57806330adf81f146101c9578063313ce567146101f05780633644e51514610221578063395093511461022957806340c10f191461023c57600080fd5b806306fdde031461013c578063095ea7b31461015a57806318160ddd1461017d57806320606b701461018f57806323b872dd146101b6575b600080fd5b610144610387565b6040516101519190610e26565b60405180910390f35b61016d610168366004610e90565b610419565b6040519015158152602001610151565b6002545b604051908152602001610151565b6101817f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b61016d6101c4366004610eba565b610433565b6101817f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610151565b610181610457565b61016d610237366004610e90565b6104b3565b61024f61024a366004610e90565b6104d5565b005b61018161025f366004610ef6565b6001600160a01b031660009081526020819052604090205490565b610181610288366004610ef6565b60056020526000908152604090205481565b610144610534565b61024f6102b0366004610e90565b610543565b6102dc7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610151565b61016d610302366004610e90565b610595565b61016d610315366004610e90565b610610565b6101817f000000000000000000000000000000000000000000000000000000000000000081565b61024f61034f366004610f18565b61061e565b610181610362366004610f8b565b610859565b610144604051806040016040528060018152602001603160f81b81525081565b60606003805461039690610fbe565b80601f01602080910402602001604051908101604052809291908181526020018280546103c290610fbe565b801561040f5780601f106103e45761010080835404028352916020019161040f565b820191906000526020600020905b8154815290600101906020018083116103f257829003601f168201915b5050505050905090565b600033610427818585610884565b60019150505b92915050565b6000336104418582856109a9565b61044c858585610a23565b506001949350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461461048e5761048946610bb5565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000336104278185856104c68383610859565b6104d0919061100e565b610884565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105265760405162461bcd60e51b815260040161051d90611021565b60405180910390fd5b6105308282610c61565b5050565b60606004805461039690610fbe565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461058b5760405162461bcd60e51b815260040161051d90611021565b6105308282610d0e565b600033816105a38286610859565b9050838110156106035760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161051d565b61044c8286868403610884565b600033610427818585610a23565b8342111561067a5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b606482015260840161051d565b6001600160a01b038716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866106c783611071565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610725610457565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156107b0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906107e65750896001600160a01b0316816001600160a01b0316145b6108425760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b606482015260840161051d565b61084d8a8a8a610884565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166108e65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161051d565b6001600160a01b0382166109475760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161051d565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006109b58484610859565b90506000198114610a1d5781811015610a105760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161051d565b610a1d8484848403610884565b50505050565b6001600160a01b038316610a875760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161051d565b6001600160a01b038216610ae95760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161051d565b6001600160a01b03831660009081526020819052604090205481811015610b615760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161051d565b6001600160a01b038481166000818152602081815260408083208787039055938716808352918490208054870190559251858152909260008051602061108b833981519152910160405180910390a3610a1d565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610be0610387565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610cb75760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161051d565b8060026000828254610cc9919061100e565b90915550506001600160a01b0382166000818152602081815260408083208054860190555184815260008051602061108b833981519152910160405180910390a35050565b6001600160a01b038216610d6e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161051d565b6001600160a01b03821660009081526020819052604090205481811015610de25760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161051d565b6001600160a01b03831660008181526020818152604080832086860390556002805487900390555185815291929160008051602061108b833981519152910161099c565b600060208083528351808285015260005b81811015610e5357858101830151858201604001528201610e37565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610e8b57600080fd5b919050565b60008060408385031215610ea357600080fd5b610eac83610e74565b946020939093013593505050565b600080600060608486031215610ecf57600080fd5b610ed884610e74565b9250610ee660208501610e74565b9150604084013590509250925092565b600060208284031215610f0857600080fd5b610f1182610e74565b9392505050565b600080600080600080600060e0888a031215610f3357600080fd5b610f3c88610e74565b9650610f4a60208901610e74565b95506040880135945060608801359350608088013560ff81168114610f6e57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f9e57600080fd5b610fa783610e74565b9150610fb560208401610e74565b90509250929050565b600181811c90821680610fd257607f821691505b602082108103610ff257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561042d5761042d610ff8565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b60006001820161108357611083610ff8565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122041a613df402940120c0c7421c7d02599c9a28987dd403c01cd013411ae6d388964736f6c63430008140033a26469706673582212203f4368970cd783f4e4a75720695da4a677b0e2b0336e4a7d19983860ade7c07564736f6c63430008140033", - "deployedBytecode": "0x608060405260043610620001bb5760003560e01c806383f2440311620000f5578063ccaa2d111162000090578063ccaa2d11146200056b578063cd5865791462000590578063d02103ca14620005a7578063dbc1697614620005d0578063ee25560b14620005e8578063f5efcd791462000619578063f811bff7146200063e578063fb570834146200066357600080fd5b806383f2440314620004465780638ed7e3f2146200046b578063aaa13cc2146200048d578063b8b284d014620004b2578063bab161bf14620004d7578063be5831c714620004fb578063c00f14ab1462000521578063cc461632146200054657600080fd5b80633c351e1011620001665780633c351e1014620003125780633cbc795b14620003345780633e19704314620003705780634b2f336d14620003955780635ca1e16514620003b75780637843298b14620003cf57806379e2cf9714620003f457806381b1c174146200040c57600080fd5b806315064c9614620001c05780632072f6c514620001f157806322e95f2c146200020b578063240ff378146200023f57806327aef4e814620002565780632dfdf0b5146200027d578063318aee3d14620002a4575b600080fd5b348015620001cd57600080fd5b50606854620001dc9060ff1681565b60405190151581526020015b60405180910390f35b348015620001fe57600080fd5b506200020962000688565b005b3480156200021857600080fd5b50620002306200022a36600462002d1c565b620006c0565b604051620001e8919062002d58565b620002096200025036600462002dc6565b62000713565b3480156200026357600080fd5b506200026e62000788565b604051620001e8919062002e9d565b3480156200028a57600080fd5b506200029560535481565b604051908152602001620001e8565b348015620002b157600080fd5b50620002ed620002c336600462002eb9565b606b6020526000908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201620001e8565b3480156200031f57600080fd5b50606d5462000230906001600160a01b031681565b3480156200034157600080fd5b50606d546200035a90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001620001e8565b3480156200037d57600080fd5b50620002956200038f36600462002ee9565b6200081e565b348015620003a257600080fd5b50606f5462000230906001600160a01b031681565b348015620003c457600080fd5b5062000295620008ab565b348015620003dc57600080fd5b5062000230620003ee36600462002f73565b62000991565b3480156200040157600080fd5b5062000209620009c2565b3480156200041957600080fd5b50620002306200042b36600462002fc3565b606a602052600090815260409020546001600160a01b031681565b3480156200045357600080fd5b50620002956200046536600462002ff0565b620009e6565b3480156200047857600080fd5b50606c5462000230906001600160a01b031681565b3480156200049a57600080fd5b5062000230620004ac3660046200310d565b62000aca565b348015620004bf57600080fd5b5062000209620004d1366004620031b5565b62000bdb565b348015620004e457600080fd5b506068546200035a90610100900463ffffffff1681565b3480156200050857600080fd5b506068546200035a90600160c81b900463ffffffff1681565b3480156200052e57600080fd5b506200026e6200054036600462002eb9565b62000caa565b3480156200055357600080fd5b50620001dc6200056536600462003241565b62000cf7565b3480156200057857600080fd5b50620002096200058a36600462003279565b62000d87565b62000209620005a136600462003374565b620012c6565b348015620005b457600080fd5b506068546200023090600160281b90046001600160a01b031681565b348015620005dd57600080fd5b506200020962001759565b348015620005f557600080fd5b50620002956200060736600462002fc3565b60696020526000908152604090205481565b3480156200062657600080fd5b50620002096200063836600462003279565b6200178f565b3480156200064b57600080fd5b50620002096200065d36600462003415565b62001a45565b3480156200067057600080fd5b50620001dc62000682366004620034cc565b62001ccf565b606c546001600160a01b03163314620006b457604051631736745960e31b815260040160405180910390fd5b620006be62001ce9565b565b6000606a60008484604051602001620006db92919062003519565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b60685460ff16156200073857604051630bc011ff60e21b815260040160405180910390fd5b3415801590620007525750606f546001600160a01b031615155b1562000771576040516301bd897160e61b815260040160405180910390fd5b6200078185853486868662001d46565b5050505050565b606e8054620007979062003543565b80601f0160208091040260200160405190810160405280929190818152602001828054620007c59062003543565b8015620008165780601f10620007ea5761010080835404028352916020019162000816565b820191906000526020600020905b815481529060010190602001808311620007f857829003601f168201915b505050505081565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b605354600090819081805b602081101562000988578083901c600116600103620009195760338160208110620008e557620008e56200357f565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062000946565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806200097f90620035ab565b915050620008b6565b50919392505050565b6000620009ba8484620009a48562001e1a565b620009af8662001ee1565b620004ac8762001f9f565b949350505050565b605354606854600160c81b900463ffffffff161015620006be57620006be62002060565b600083815b602081101562000ac157600163ffffffff8516821c8116900362000a5d5784816020811062000a1e5762000a1e6200357f565b60200201358260405160200162000a3f929190918252602082015260400190565b60405160208183030381529060405280519060200120915062000aac565b8185826020811062000a735762000a736200357f565b602002013560405160200162000a93929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062000ab881620035ab565b915050620009eb565b50949350505050565b600080868660405160200162000ae292919062003519565b604051602081830303815290604052805190602001209050600060ff60f81b30836040518060200162000b159062002ce0565b601f1982820381018352601f90910116604081905262000b3e908b908b908b90602001620035c7565b60408051601f198184030181529082905262000b5e929160200162003604565b6040516020818303038152906040528051906020012060405160200162000bb794939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff161562000c0057604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b031662000c2a5760405163dde3cda760e01b815260040160405180910390fd5b606f54604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac9062000c5e903390889060040162003637565b600060405180830381600087803b15801562000c7957600080fd5b505af115801562000c8e573d6000803e3d6000fd5b5050505062000ca286868686868662001d46565b505050505050565b606062000cb78262001e1a565b62000cc28362001ee1565b62000ccd8462001f9f565b60405160200162000ce193929190620035c7565b6040516020818303038152906040529050919050565b6068546000908190610100900463ffffffff1615801562000d1e575063ffffffff83166001145b1562000d32575063ffffffff831662000d5d565b62000d48600160201b63ffffffff851662003650565b62000d5a9063ffffffff86166200366a565b90505b600881901c600090815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000dac57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff868116610100909204161462000ddd576040516302caf51760e11b815260040160405180910390fd5b62000e178c8c8c8c8c62000e1160008e8e8e8e8e8e8e60405162000e0392919062003680565b60405180910390206200081e565b620020fe565b6001600160a01b03861662000f5d57606f546001600160a01b031662000eef5760006001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000e71576020820181803683370190505b5060405162000e81919062003690565b60006040518083038185875af1925050503d806000811462000ec0576040519150601f19603f3d011682016040523d82523d6000602084013e62000ec5565b606091505b505090508062000ee857604051630ce8f45160e31b815260040160405180910390fd5b5062001277565b606f546040516340c10f1960e01b81526001600160a01b03909116906340c10f199062000f23908790879060040162003637565b600060405180830381600087803b15801562000f3e57600080fd5b505af115801562000f53573d6000803e3d6000fd5b5050505062001277565b606d546001600160a01b03878116911614801562000f8c5750606d5463ffffffff888116600160a01b90920416145b1562000fa65760006001600160a01b038516848262000e46565b60685463ffffffff61010090910481169088160362000fdb5762000fd56001600160a01b03871685856200226f565b62001277565b6000878760405160200162000ff292919062003519565b60408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b0316806200120f57600080806200103b86880188620036ae565b925092509250600085848484604051620010559062002ce0565b6200106393929190620035c7565b8190604051809103906000f590508015801562001084573d6000803e3d6000fd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f1990620010b8908d908d9060040162003637565b600060405180830381600087803b158015620010d357600080fd5b505af1158015620010e8573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b604051620011fd9594939291906200374c565b60405180910390a15050505062001274565b6040516340c10f1960e01b81526001600160a01b038216906340c10f19906200123f908990899060040162003637565b600060405180830381600087803b1580156200125a57600080fd5b505af11580156200126f573d6000803e3d6000fd5b505050505b50505b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8a88888787604051620012b095949392919062003787565b60405180910390a1505050505050505050505050565b60685460ff1615620012eb57604051630bc011ff60e21b815260040160405180910390fd5b620012f5620022ce565b60685463ffffffff61010090910481169088160362001327576040516302caf51760e11b815260040160405180910390fd5b6000806060876001600160a01b03881662001418578834146200135d5760405163b89240f560e01b815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff169450906200138c9062003543565b80601f0160208091040260200160405190810160405280929190818152602001828054620013ba9062003543565b80156200140b5780601f10620013df576101008083540402835291602001916200140b565b820191906000526020600020905b815481529060010190602001808311620013ed57829003601f168201915b50505050509150620016c4565b3415620014385760405163798ee6f160e01b815260040160405180910390fd5b606f546001600160a01b0390811690891603620014b957604051632770a7eb60e21b81526001600160a01b03891690639dc29fac906200147f9033908d9060040162003637565b600060405180830381600087803b1580156200149a57600080fd5b505af1158015620014af573d6000803e3d6000fd5b50505050620016c4565b6001600160a01b038089166000908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b900490921691810182905290156200157757604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac906200152f9033908e9060040162003637565b600060405180830381600087803b1580156200154a57600080fd5b505af11580156200155f573d6000803e3d6000fd5b505050508060200151945080600001519350620016b5565b85156200158c576200158c898b898962002329565b6040516370a0823160e01b81526000906001600160a01b038b16906370a0823190620015bd90309060040162002d58565b602060405180830381865afa158015620015db573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620016019190620037b9565b90506200161a6001600160a01b038b1633308e6200268b565b6040516370a0823160e01b81526000906001600160a01b038c16906370a08231906200164b90309060040162002d58565b602060405180830381865afa15801562001669573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200168f9190620037b9565b90506200169d8282620037d3565b6068548c9850610100900463ffffffff169650935050505b620016c08962000caa565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e868860535460405162001706989796959493929190620037e9565b60405180910390a1620017316200172b600085878f8f8789805190602001206200081e565b620026c5565b861562001742576200174262002060565b505050506200175060018055565b50505050505050565b606c546001600160a01b031633146200178557604051631736745960e31b815260040160405180910390fd5b620006be620027c4565b60685460ff1615620017b457604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614620017e5576040516302caf51760e11b815260040160405180910390fd5b6200180b8c8c8c8c8c62000e1160018e8e8e8e8e8e8e60405162000e0392919062003680565b606f546000906001600160a01b0316620018ca57846001600160a01b031684888a868660405160240162001843949392919062003856565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b179052516200187a919062003690565b60006040518083038185875af1925050503d8060008114620018b9576040519150601f19603f3d011682016040523d82523d6000602084013e620018be565b606091505b505080915050620019d6565b606f546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990620018fe908890889060040162003637565b600060405180830381600087803b1580156200191957600080fd5b505af11580156200192e573d6000803e3d6000fd5b50505050846001600160a01b03168789858560405160240162001955949392919062003856565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b179052516200198c919062003690565b6000604051808303816000865af19150503d8060008114620019cb576040519150601f19603f3d011682016040523d82523d6000602084013e620019d0565b606091505b50909150505b80620019f5576040516337e391c360e01b815260040160405180910390fd5b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8b8989888860405162001a2e95949392919062003787565b60405180910390a150505050505050505050505050565b600054610100900460ff161580801562001a665750600054600160ff909116105b8062001a825750303b15801562001a82575060005460ff166001145b62001aeb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562001b0f576000805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff8a160265010000000000600160c81b03191617600160281b6001600160a01b038781169190910291909117909155606c80546001600160a01b031916858316179055861662001b9b5763ffffffff85161562001b9557604051630d43a60960e11b815260040160405180910390fd5b62001c76565b606d805463ffffffff8716600160a01b026001600160c01b03199091166001600160a01b03891617179055606e62001bd48382620038dd565b506000801b601260405162001be99062002ce0565b6060808252600d908201526c2bb930b83832b21022ba3432b960991b608082015260a060208201819052600490820152630ae8aa8960e31b60c082015260ff909116604082015260e0018190604051809103906000f590508015801562001c54573d6000803e3d6000fd5b50606f80546001600160a01b0319166001600160a01b03929092169190911790555b62001c806200281d565b801562001750576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b60008162001cdf868686620009e6565b1495945050505050565b60685460ff161562001d0e57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b60685463ffffffff61010090910481169087160362001d78576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff1633898989888860535460405162001dce99989796959493929190620039a9565b60405180910390a162001e096200172b6001606860019054906101000a900463ffffffff16338a8a8a898960405162000e0392919062003680565b821562000ca25762000ca262002060565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009182916001600160a01b0386169162001e63919062003690565b600060405180830381855afa9150503d806000811462001ea0576040519150601f19603f3d011682016040523d82523d6000602084013e62001ea5565b606091505b50915091508162001ed657604051806040016040528060078152602001664e4f5f4e414d4560c81b815250620009ba565b620009ba8162002851565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009182916001600160a01b0386169162001f2a919062003690565b600060405180830381855afa9150503d806000811462001f67576040519150601f19603f3d011682016040523d82523d6000602084013e62001f6c565b606091505b50915091508162001ed657604051806040016040528060098152602001681393d7d4d6535093d360ba1b815250620009ba565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b0386169162001fe7919062003690565b600060405180830381855afa9150503d806000811462002024576040519150601f19603f3d011682016040523d82523d6000602084013e62002029565b606091505b50915091508180156200203d575080516020145b6200204a576012620009ba565b80806020019051810190620009ba919062003a18565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d620020a9620008ab565b6040518263ffffffff1660e01b8152600401620020c891815260200190565b600060405180830381600087803b158015620020e357600080fd5b505af1158015620020f8573d6000803e3d6000fd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101206312bd9b1960e11b9092526064810191909152600091600160281b90046001600160a01b03169063257b3632906084016020604051808303816000875af115801562002179573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200219f9190620037b9565b905080600003620021c257604051622f6fad60e01b815260040160405180910390fd5b600080600160401b8716156200220757869150620021e3848a848962001ccf565b62002201576040516338105f3b60e21b815260040160405180910390fd5b62002258565b602087901c6200221981600162003a38565b9150879250620022386200222f868c86620009e6565b8a838962001ccf565b62002256576040516338105f3b60e21b815260040160405180910390fd5b505b620022648282620029fa565b505050505050505050565b620022c98363a9059cbb60e01b84846040516024016200229192919062003637565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262002aaa565b505050565b600260015403620023225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001ae2565b6002600155565b60006200233a600482848662003a5f565b620023459162003a8b565b9050632afa533160e01b6001600160e01b0319821601620024e657600080808080808062002377896004818d62003a5f565b81019062002386919062003abc565b9650965096509650965096509650336001600160a01b0316876001600160a01b031614620023c75760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0386163014620023f15760405163750643af60e01b815260040160405180910390fd5b8a851462002412576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e169162002492919062003690565b6000604051808303816000865af19150503d8060008114620024d1576040519150601f19603f3d011682016040523d82523d6000602084013e620024d6565b606091505b5050505050505050505062000781565b6001600160e01b031981166323f2ebc360e21b146200251857604051637141605d60e11b815260040160405180910390fd5b600080808080808080620025308a6004818e62003a5f565b8101906200253f919062003b17565b97509750975097509750975097509750336001600160a01b0316886001600160a01b031614620025825760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0387163014620025ac5760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169162002635919062003690565b6000604051808303816000865af19150503d806000811462002674576040519150601f19603f3d011682016040523d82523d6000602084013e62002679565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052620020f89085906323b872dd60e01b9060840162002291565b806001620026d66020600262003ca0565b620026e29190620037d3565b6053541062002704576040516377ae67b360e11b815260040160405180910390fd5b60006053600081546200271790620035ab565b9182905550905060005b6020811015620027b3578082901c600116600103620027595782603382602081106200275157620027516200357f565b015550505050565b603381602081106200276f576200276f6200357f565b015460408051602081019290925281018490526060016040516020818303038152906040528051906020012092508080620027aa90620035ab565b91505062002721565b50620022c962003cae565b60018055565b60685460ff16620027e857604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600054610100900460ff16620028475760405162461bcd60e51b815260040162001ae29062003cc4565b620006be62002b83565b606060408251106200287357818060200190518101906200070d919062003d0f565b8151602003620029c75760005b602081108015620028b35750828181518110620028a157620028a16200357f565b01602001516001600160f81b03191615155b15620028ce5780620028c581620035ab565b91505062002880565b80600003620029075750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b6000816001600160401b0381111562002924576200292462003034565b6040519080825280601f01601f1916602001820160405280156200294f576020820181803683370190505b50905060005b82811015620029bf578481815181106200297357620029736200357f565b602001015160f81c60f81b8282815181106200299357620029936200357f565b60200101906001600160f81b031916908160001a90535080620029b681620035ab565b91505062002955565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b606854600090610100900463ffffffff1615801562002a1f575063ffffffff82166001145b1562002a33575063ffffffff821662002a5e565b62002a49600160201b63ffffffff841662003650565b62002a5b9063ffffffff85166200366a565b90505b600881901c60008181526069602052604081208054600160ff861690811b918218928390559290919081831690036200175057604051630c8d9eab60e31b815260040160405180910390fd5b600062002b01826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031662002bad9092919063ffffffff16565b805190915015620022c9578080602001905181019062002b22919062003d8e565b620022c95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162001ae2565b600054610100900460ff16620027be5760405162461bcd60e51b815260040162001ae29062003cc4565b6060620009ba848460008585600080866001600160a01b0316858760405162002bd7919062003690565b60006040518083038185875af1925050503d806000811462002c16576040519150601f19603f3d011682016040523d82523d6000602084013e62002c1b565b606091505b509150915062002c2e8783838762002c39565b979650505050505050565b6060831562002cad57825160000362002ca5576001600160a01b0385163b62002ca55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001ae2565b5081620009ba565b620009ba838381511562002cc45781518083602001fd5b8060405162461bcd60e51b815260040162001ae2919062002e9d565b61159c8062003daf83390190565b803563ffffffff81168114620029f557600080fd5b6001600160a01b038116811462002d1957600080fd5b50565b6000806040838503121562002d3057600080fd5b62002d3b8362002cee565b9150602083013562002d4d8162002d03565b809150509250929050565b6001600160a01b0391909116815260200190565b801515811462002d1957600080fd5b60008083601f84011262002d8e57600080fd5b5081356001600160401b0381111562002da657600080fd5b60208301915083602082850101111562002dbf57600080fd5b9250929050565b60008060008060006080868803121562002ddf57600080fd5b62002dea8662002cee565b9450602086013562002dfc8162002d03565b9350604086013562002e0e8162002d6c565b925060608601356001600160401b0381111562002e2a57600080fd5b62002e388882890162002d7b565b969995985093965092949392505050565b60005b8381101562002e6657818101518382015260200162002e4c565b50506000910152565b6000815180845262002e8981602086016020860162002e49565b601f01601f19169290920160200192915050565b60208152600062002eb2602083018462002e6f565b9392505050565b60006020828403121562002ecc57600080fd5b813562002eb28162002d03565b60ff8116811462002d1957600080fd5b600080600080600080600060e0888a03121562002f0557600080fd5b873562002f128162002ed9565b965062002f226020890162002cee565b9550604088013562002f348162002d03565b945062002f446060890162002cee565b9350608088013562002f568162002d03565b9699959850939692959460a0840135945060c09093013592915050565b60008060006060848603121562002f8957600080fd5b62002f948462002cee565b9250602084013562002fa68162002d03565b9150604084013562002fb88162002d03565b809150509250925092565b60006020828403121562002fd657600080fd5b5035919050565b8061040081018310156200070d57600080fd5b600080600061044084860312156200300757600080fd5b833592506200301a856020860162002fdd565b91506200302b610420850162002cee565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562003075576200307562003034565b604052919050565b60006001600160401b0382111562003099576200309962003034565b50601f01601f191660200190565b6000620030be620030b8846200307d565b6200304a565b9050828152838383011115620030d357600080fd5b828260208301376000602084830101529392505050565b600082601f830112620030fc57600080fd5b62002eb283833560208501620030a7565b600080600080600060a086880312156200312657600080fd5b620031318662002cee565b94506020860135620031438162002d03565b935060408601356001600160401b03808211156200316057600080fd5b6200316e89838a01620030ea565b945060608801359150808211156200318557600080fd5b506200319488828901620030ea565b9250506080860135620031a78162002ed9565b809150509295509295909350565b60008060008060008060a08789031215620031cf57600080fd5b620031da8762002cee565b95506020870135620031ec8162002d03565b9450604087013593506060870135620032058162002d6c565b925060808701356001600160401b038111156200322157600080fd5b6200322f89828a0162002d7b565b979a9699509497509295939492505050565b600080604083850312156200325557600080fd5b620032608362002cee565b9150620032706020840162002cee565b90509250929050565b6000806000806000806000806000806000806109208d8f0312156200329d57600080fd5b620032a98e8e62002fdd565b9b50620032bb8e6104008f0162002fdd565b9a506108008d013599506108208d013598506108408d01359750620032e46108608e0162002cee565b9650620032f66108808e013562002d03565b6108808d013595506200330d6108a08e0162002cee565b94506200331f6108c08e013562002d03565b6108c08d013593506108e08d013592506001600160401b036109008e013511156200334957600080fd5b6200335c8e6109008f01358f0162002d7b565b81935080925050509295989b509295989b509295989b565b600080600080600080600060c0888a0312156200339057600080fd5b6200339b8862002cee565b96506020880135620033ad8162002d03565b9550604088013594506060880135620033c68162002d03565b93506080880135620033d88162002d6c565b925060a08801356001600160401b03811115620033f457600080fd5b620034028a828b0162002d7b565b989b979a50959850939692959293505050565b60008060008060008060c087890312156200342f57600080fd5b6200343a8762002cee565b955060208701356200344c8162002d03565b94506200345c6040880162002cee565b935060608701356200346e8162002d03565b92506080870135620034808162002d03565b915060a08701356001600160401b038111156200349c57600080fd5b8701601f81018913620034ae57600080fd5b620034bf89823560208401620030a7565b9150509295509295509295565b6000806000806104608587031215620034e457600080fd5b84359350620034f7866020870162002fdd565b925062003508610420860162002cee565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b600181811c908216806200355857607f821691505b6020821081036200357957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201620035c057620035c062003595565b5060010190565b606081526000620035dc606083018662002e6f565b8281036020840152620035f0818662002e6f565b91505060ff83166040830152949350505050565b600083516200361881846020880162002e49565b8351908301906200362e81836020880162002e49565b01949350505050565b6001600160a01b03929092168252602082015260400190565b80820281158282048414176200070d576200070d62003595565b808201808211156200070d576200070d62003595565b8183823760009101908152919050565b60008251620036a481846020870162002e49565b9190910192915050565b600080600060608486031215620036c457600080fd5b83356001600160401b0380821115620036dc57600080fd5b620036ea87838801620030ea565b945060208601359150808211156200370157600080fd5b506200371086828701620030ea565b925050604084013562002fb88162002ed9565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b63ffffffff861681526001600160a01b0385811660208301528416604082015260806060820181905260009062002c2e908301848662003723565b94855263ffffffff9390931660208501526001600160a01b039182166040850152166060830152608082015260a00190565b600060208284031215620037cc57600080fd5b5051919050565b818103818111156200070d576200070d62003595565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c083018190526000916200383d8483018762002e6f565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff8416602082015260606040820181905260009062003889908301848662003723565b9695505050505050565b601f821115620022c957600081815260208120601f850160051c81016020861015620038bc5750805b601f850160051c820191505b8181101562000ca257828155600101620038c8565b81516001600160401b03811115620038f957620038f962003034565b62003911816200390a845462003543565b8462003893565b602080601f831160018114620039495760008415620039305750858301515b600019600386901b1c1916600185901b17855562000ca2565b600085815260208120601f198616915b828110156200397a5788860151825594840194600190910190840162003959565b5085821015620039995787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c08301819052600091620039fe848301878962003723565b925080851660e085015250509a9950505050505050505050565b60006020828403121562003a2b57600080fd5b815162002eb28162002ed9565b63ffffffff81811683821601908082111562003a585762003a5862003595565b5092915050565b6000808585111562003a7057600080fd5b8386111562003a7e57600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101562003ab45780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a03121562003ad857600080fd5b873562003ae58162002d03565b9650602088013562003af78162002d03565b95506040880135945060608801359350608088013562002f568162002ed9565b600080600080600080600080610100898b03121562003b3557600080fd5b883562003b428162002d03565b9750602089013562003b548162002d03565b96506040890135955060608901359450608089013562003b748162002d6c565b935060a089013562003b868162002ed9565b979a969950949793969295929450505060c08201359160e0013590565b600181815b8085111562003be457816000190482111562003bc85762003bc862003595565b8085161562003bd657918102915b93841c939080029062003ba8565b509250929050565b60008262003bfd575060016200070d565b8162003c0c575060006200070d565b816001811462003c25576002811462003c305762003c50565b60019150506200070d565b60ff84111562003c445762003c4462003595565b50506001821b6200070d565b5060208310610133831016604e8410600b841016171562003c75575081810a6200070d565b62003c81838362003ba3565b806000190482111562003c985762003c9862003595565b029392505050565b600062002eb2838362003bec565b634e487b7160e01b600052600160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60006020828403121562003d2257600080fd5b81516001600160401b0381111562003d3957600080fd5b8201601f8101841362003d4b57600080fd5b805162003d5c620030b8826200307d565b81815285602083850101111562003d7257600080fd5b62003d8582602083016020860162002e49565b95945050505050565b60006020828403121562003da157600080fd5b815162002eb28162002d6c56fe6101006040523480156200001257600080fd5b506040516200159c3803806200159c83398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516110e0620004bc60003960006101f70152600081816102ba015281816104e0015261054e0152600061049101526000818161031f015261045b01526110e06000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063a457c2d71161007c578063a457c2d7146102f4578063a9059cbb14610307578063cd0d00961461031a578063d505accf14610341578063dd62ed3e14610354578063ffa1ad741461036757600080fd5b806370a08231146102515780637ecebe001461027a57806395d89b411461029a5780639dc29fac146102a2578063a3c573eb146102b557600080fd5b806330adf81f116100ff57806330adf81f146101c9578063313ce567146101f05780633644e51514610221578063395093511461022957806340c10f191461023c57600080fd5b806306fdde031461013c578063095ea7b31461015a57806318160ddd1461017d57806320606b701461018f57806323b872dd146101b6575b600080fd5b610144610387565b6040516101519190610e26565b60405180910390f35b61016d610168366004610e90565b610419565b6040519015158152602001610151565b6002545b604051908152602001610151565b6101817f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b61016d6101c4366004610eba565b610433565b6101817f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610151565b610181610457565b61016d610237366004610e90565b6104b3565b61024f61024a366004610e90565b6104d5565b005b61018161025f366004610ef6565b6001600160a01b031660009081526020819052604090205490565b610181610288366004610ef6565b60056020526000908152604090205481565b610144610534565b61024f6102b0366004610e90565b610543565b6102dc7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610151565b61016d610302366004610e90565b610595565b61016d610315366004610e90565b610610565b6101817f000000000000000000000000000000000000000000000000000000000000000081565b61024f61034f366004610f18565b61061e565b610181610362366004610f8b565b610859565b610144604051806040016040528060018152602001603160f81b81525081565b60606003805461039690610fbe565b80601f01602080910402602001604051908101604052809291908181526020018280546103c290610fbe565b801561040f5780601f106103e45761010080835404028352916020019161040f565b820191906000526020600020905b8154815290600101906020018083116103f257829003601f168201915b5050505050905090565b600033610427818585610884565b60019150505b92915050565b6000336104418582856109a9565b61044c858585610a23565b506001949350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461461048e5761048946610bb5565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000336104278185856104c68383610859565b6104d0919061100e565b610884565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105265760405162461bcd60e51b815260040161051d90611021565b60405180910390fd5b6105308282610c61565b5050565b60606004805461039690610fbe565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461058b5760405162461bcd60e51b815260040161051d90611021565b6105308282610d0e565b600033816105a38286610859565b9050838110156106035760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161051d565b61044c8286868403610884565b600033610427818585610a23565b8342111561067a5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b606482015260840161051d565b6001600160a01b038716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866106c783611071565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610725610457565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156107b0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906107e65750896001600160a01b0316816001600160a01b0316145b6108425760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b606482015260840161051d565b61084d8a8a8a610884565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166108e65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161051d565b6001600160a01b0382166109475760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161051d565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006109b58484610859565b90506000198114610a1d5781811015610a105760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161051d565b610a1d8484848403610884565b50505050565b6001600160a01b038316610a875760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161051d565b6001600160a01b038216610ae95760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161051d565b6001600160a01b03831660009081526020819052604090205481811015610b615760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161051d565b6001600160a01b038481166000818152602081815260408083208787039055938716808352918490208054870190559251858152909260008051602061108b833981519152910160405180910390a3610a1d565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610be0610387565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610cb75760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161051d565b8060026000828254610cc9919061100e565b90915550506001600160a01b0382166000818152602081815260408083208054860190555184815260008051602061108b833981519152910160405180910390a35050565b6001600160a01b038216610d6e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161051d565b6001600160a01b03821660009081526020819052604090205481811015610de25760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161051d565b6001600160a01b03831660008181526020818152604080832086860390556002805487900390555185815291929160008051602061108b833981519152910161099c565b600060208083528351808285015260005b81811015610e5357858101830151858201604001528201610e37565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610e8b57600080fd5b919050565b60008060408385031215610ea357600080fd5b610eac83610e74565b946020939093013593505050565b600080600060608486031215610ecf57600080fd5b610ed884610e74565b9250610ee660208501610e74565b9150604084013590509250925092565b600060208284031215610f0857600080fd5b610f1182610e74565b9392505050565b600080600080600080600060e0888a031215610f3357600080fd5b610f3c88610e74565b9650610f4a60208901610e74565b95506040880135945060608801359350608088013560ff81168114610f6e57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f9e57600080fd5b610fa783610e74565b9150610fb560208401610e74565b90509250929050565b600181811c90821680610fd257607f821691505b602082108103610ff257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561042d5761042d610ff8565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b60006001820161108357611083610ff8565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122041a613df402940120c0c7421c7d02599c9a28987dd403c01cd013411ae6d388964736f6c63430008140033a26469706673582212203f4368970cd783f4e4a75720695da4a677b0e2b0336e4a7d19983860ade7c07564736f6c63430008140033", + "bytecode": "0x60806040523480156200001157600080fd5b506200001c62000022565b620000e4565b600054610100900460ff16156200008f5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161015620000e2576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b61569a80620000f46000396000f3fe6080604052600436106101a35760003560e01c806383f24403116100e2578063ccaa2d1111610085578063ccaa2d1114610511578063cd58657914610531578063d02103ca14610544578063dbc169761461056b578063ee25560b14610580578063f5efcd79146105ad578063f811bff7146105cd578063fb570834146105ed57600080fd5b806383f244031461040b5780638ed7e3f21461042b578063aaa13cc21461044b578063b8b284d01461046b578063bab161bf1461048b578063be5831c7146104ad578063c00f14ab146104d1578063cc461632146104f157600080fd5b80633cbc795b1161014a5780633cbc795b146102fd5780633e197043146103365780634b2f336d146103565780635ca1e165146103765780637843298b1461038b57806379e2cf97146103ab57806381b1c174146103c057806383c43a55146103f657600080fd5b806315064c96146101a85780632072f6c5146101d757806322e95f2c146101ee578063240ff3781461021b57806327aef4e81461022e5780632dfdf0b514610250578063318aee3d146102745780633c351e10146102dd575b600080fd5b3480156101b457600080fd5b506068546101c29060ff1681565b60405190151581526020015b60405180910390f35b3480156101e357600080fd5b506101ec61060d565b005b3480156101fa57600080fd5b5061020e610209366004612b7e565b610642565b6040516101ce9190612bb5565b6101ec610229366004612c1f565b610693565b34801561023a57600080fd5b50610243610703565b6040516101ce9190612ce8565b34801561025c57600080fd5b5061026660535481565b6040519081526020016101ce565b34801561028057600080fd5b506102b961028f366004612d02565b606b6020526000908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b039091166020830152016101ce565b3480156102e957600080fd5b50606d5461020e906001600160a01b031681565b34801561030957600080fd5b50606d5461032190600160a01b900463ffffffff1681565b60405163ffffffff90911681526020016101ce565b34801561034257600080fd5b50610266610351366004612d2e565b610791565b34801561036257600080fd5b50606f5461020e906001600160a01b031681565b34801561038257600080fd5b5061026661081e565b34801561039757600080fd5b5061020e6103a6366004612dad565b6108fb565b3480156103b757600080fd5b506101ec610925565b3480156103cc57600080fd5b5061020e6103db366004612df6565b606a602052600090815260409020546001600160a01b031681565b34801561040257600080fd5b50610243610946565b34801561041757600080fd5b50610266610426366004612e21565b610965565b34801561043757600080fd5b50606c5461020e906001600160a01b031681565b34801561045757600080fd5b5061020e610466366004612f2b565b610a3b565b34801561047757600080fd5b506101ec610486366004612fc6565b610b3d565b34801561049757600080fd5b5060685461032190610100900463ffffffff1681565b3480156104b957600080fd5b5060685461032190600160c81b900463ffffffff1681565b3480156104dd57600080fd5b506102436104ec366004612d02565b610c04565b3480156104fd57600080fd5b506101c261050c366004613048565b610c49565b34801561051d57600080fd5b506101ec61052c36600461307b565b610cd2565b6101ec61053f366004613166565b6111e0565b34801561055057600080fd5b5060685461020e90600160281b90046001600160a01b031681565b34801561057757600080fd5b506101ec61163a565b34801561058c57600080fd5b5061026661059b366004612df6565b60696020526000908152604090205481565b3480156105b957600080fd5b506101ec6105c836600461307b565b61166d565b3480156105d957600080fd5b506101ec6105e83660046131fb565b611908565b3480156105f957600080fd5b506101c26106083660046132a3565b611b7b565b606c546001600160a01b0316331461063857604051631736745960e31b815260040160405180910390fd5b610640611b93565b565b6000606a6000848460405160200161065b9291906132eb565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b60685460ff16156106b757604051630bc011ff60e21b815260040160405180910390fd5b34158015906106d05750606f546001600160a01b031615155b156106ee576040516301bd897160e61b815260040160405180910390fd5b6106fc858534868686611bef565b5050505050565b606e805461071090613315565b80601f016020809104026020016040519081016040528092919081815260200182805461073c90613315565b80156107895780601f1061075e57610100808354040283529160200191610789565b820191906000526020600020905b81548152906001019060200180831161076c57829003601f168201915b505050505081565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b605354600090819081805b60208110156108f2578083901c60011660010361088657603381602081106108535761085361334f565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506108b3565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806108ea9061337b565b915050610829565b50919392505050565b600061091d848461090b85611cb9565b61091486611d78565b61046687611e30565b949350505050565b605354606854600160c81b900463ffffffff16101561064057610640611ee8565b60405180611ba00160405280611b668152602001613aff611b66913981565b600083815b6020811015610a3257600163ffffffff8516821c811690036109d5578481602081106109985761099861334f565b6020020135826040516020016109b8929190918252602082015260400190565b604051602081830303815290604052805190602001209150610a20565b818582602081106109e8576109e861334f565b6020020135604051602001610a07929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610a2a8161337b565b91505061096a565b50949350505050565b6000808686604051602001610a519291906132eb565b604051602081830303815290604052805190602001209050600060ff60f81b308360405180611ba00160405280611b668152602001613aff611b669139898989604051602001610aa393929190613394565b60408051601f1981840301815290829052610ac192916020016133cd565b60405160208183030381529060405280519060200120604051602001610b1994939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff1615610b6157604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b0316610b8a5760405163dde3cda760e01b815260040160405180910390fd5b606f54604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac90610bbc90339088906004016133fc565b600060405180830381600087803b158015610bd657600080fd5b505af1158015610bea573d6000803e3d6000fd5b50505050610bfc868686868686611bef565b505050505050565b6060610c0f82611cb9565b610c1883611d78565b610c2184611e30565b604051602001610c3393929190613394565b6040516020818303038152906040529050919050565b6068546000908190610100900463ffffffff16158015610c6f575063ffffffff83166001145b15610c81575063ffffffff8316610ca8565b610c95600160201b63ffffffff8516613415565b610ca59063ffffffff861661342c565b90505b600881901c600090815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff1615610cf657604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614610d26576040516302caf51760e11b815260040160405180910390fd5b610d5a8c8c8c8c8c610d5560008e8e8e8e8e8e8e604051610d4892919061343f565b6040518091039020610791565b611f81565b6001600160a01b038616610e9257606f546001600160a01b0316610e295760006001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015610db1576020820181803683370190505b50604051610dbf919061344f565b60006040518083038185875af1925050503d8060008114610dfc576040519150601f19603f3d011682016040523d82523d6000602084013e610e01565b606091505b5050905080610e2357604051630ce8f45160e31b815260040160405180910390fd5b50611193565b606f546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990610e5b90879087906004016133fc565b600060405180830381600087803b158015610e7557600080fd5b505af1158015610e89573d6000803e3d6000fd5b50505050611193565b606d546001600160a01b038781169116148015610ec05750606d5463ffffffff888116600160a01b90920416145b15610ed85760006001600160a01b0385168482610d87565b60685463ffffffff610100909104811690881603610f0957610f046001600160a01b03871685856120e0565b611193565b60008787604051602001610f1e9291906132eb565b60408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b03168061112f5760008080610f648688018861346b565b9250925092505050506000610faf8386868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061213b92505050565b6040516340c10f1960e01b81529091506001600160a01b038216906340c10f1990610fe0908a908a906004016133fc565b600060405180830381600087803b158015610ffa57600080fd5b505af115801561100e573d6000803e3d6000fd5b5050505080606a600085815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a838888604051611121959493929190613500565b60405180910390a150611190565b6040516340c10f1960e01b81526001600160a01b038216906340c10f199061115d90899089906004016133fc565b600060405180830381600087803b15801561117757600080fd5b505af115801561118b573d6000803e3d6000fd5b505050505b50505b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8a888887876040516111ca959493929190613539565b60405180910390a1505050505050505050505050565b60685460ff161561120457604051630bc011ff60e21b815260040160405180910390fd5b61120c6121b7565b60685463ffffffff61010090910481169088160361123d576040516302caf51760e11b815260040160405180910390fd5b6000806060876001600160a01b038816611323578834146112715760405163b89240f560e01b815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff1694509061129e90613315565b80601f01602080910402602001604051908101604052809291908181526020018280546112ca90613315565b80156113175780601f106112ec57610100808354040283529160200191611317565b820191906000526020600020905b8154815290600101906020018083116112fa57829003601f168201915b505050505091506115af565b34156113425760405163798ee6f160e01b815260040160405180910390fd5b606f546001600160a01b03908116908916036113bd57604051632770a7eb60e21b81526001600160a01b03891690639dc29fac906113869033908d906004016133fc565b600060405180830381600087803b1580156113a057600080fd5b505af11580156113b4573d6000803e3d6000fd5b505050506115af565b6001600160a01b038089166000908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b9004909216918101829052901561147557604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac906114309033908e906004016133fc565b600060405180830381600087803b15801561144a57600080fd5b505af115801561145e573d6000803e3d6000fd5b5050505080602001519450806000015193506115a2565b851561148757611487898b8989612210565b6040516370a0823160e01b81526000906001600160a01b038b16906370a08231906114b6903090600401612bb5565b602060405180830381865afa1580156114d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f7919061356b565b905061150e6001600160a01b038b1633308e612556565b6040516370a0823160e01b81526000906001600160a01b038c16906370a082319061153d903090600401612bb5565b602060405180830381865afa15801561155a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157e919061356b565b905061158a8282613584565b6068548c9850610100900463ffffffff169650935050505b6115ab89610c04565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e86886053546040516115ef989796959493929190613597565b60405180910390a1611616611611600085878f8f878980519060200120610791565b61258e565b861561162457611624611ee8565b5050505061163160018055565b50505050505050565b606c546001600160a01b0316331461166557604051631736745960e31b815260040160405180910390fd5b610640612679565b60685460ff161561169157604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146116c1576040516302caf51760e11b815260040160405180910390fd5b6116e38c8c8c8c8c610d5560018e8e8e8e8e8e8e604051610d4892919061343f565b606f546000906001600160a01b031661179a57846001600160a01b031684888a86866040516024016117189493929190613602565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161174d919061344f565b60006040518083038185875af1925050503d806000811461178a576040519150601f19603f3d011682016040523d82523d6000602084013e61178f565b606091505b50508091505061189c565b606f546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906117cc90889088906004016133fc565b600060405180830381600087803b1580156117e657600080fd5b505af11580156117fa573d6000803e3d6000fd5b50505050846001600160a01b03168789858560405160240161181f9493929190613602565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b17905251611854919061344f565b6000604051808303816000865af19150503d8060008114611891576040519150601f19603f3d011682016040523d82523d6000602084013e611896565b606091505b50909150505b806118ba576040516337e391c360e01b815260040160405180910390fd5b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8b898988886040516118f1959493929190613539565b60405180910390a150505050505050505050505050565b600054610100900460ff16158080156119285750600054600160ff909116105b806119425750303b158015611942575060005460ff166001145b6119aa5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156119cd576000805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff8a160265010000000000600160c81b03191617600160281b6001600160a01b038781169190910291909117909155606c80546001600160a01b0319168583161790558616611a565763ffffffff851615611a5157604051630d43a60960e11b815260040160405180910390fd5b611b25565b606d805463ffffffff8716600160a01b026001600160c01b03199091166001600160a01b03891617179055606e611a8d8382613683565b50611b046000801b6012604051602001611af091906060808252600d908201526c2bb930b83832b21022ba3432b960991b608082015260a060208201819052600490820152630ae8aa8960e31b60c082015260ff91909116604082015260e00190565b60405160208183030381529060405261213b565b606f80546001600160a01b0319166001600160a01b03929092169190911790555b611b2d6126d1565b8015611631576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b600081611b89868686610965565b1495945050505050565b60685460ff1615611bb757604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b60685463ffffffff610100909104811690871603611c20576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051611c7499989796959493929190613742565b60405180910390a1611cab6116116001606860019054906101000a900463ffffffff16338a8a8a8989604051610d4892919061343f565b8215610bfc57610bfc611ee8565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009182916001600160a01b03861691611d00919061344f565b600060405180830381855afa9150503d8060008114611d3b576040519150601f19603f3d011682016040523d82523d6000602084013e611d40565b606091505b509150915081611d6f57604051806040016040528060078152602001664e4f5f4e414d4560c81b81525061091d565b61091d81612700565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009182916001600160a01b03861691611dbf919061344f565b600060405180830381855afa9150503d8060008114611dfa576040519150601f19603f3d011682016040523d82523d6000602084013e611dff565b606091505b509150915081611d6f57604051806040016040528060098152602001681393d7d4d6535093d360ba1b81525061091d565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b03861691611e76919061344f565b600060405180830381855afa9150503d8060008114611eb1576040519150601f19603f3d011682016040523d82523d6000602084013e611eb6565b606091505b5091509150818015611ec9575080516020145b611ed457601261091d565b8080602001905181019061091d91906137af565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d611f2f61081e565b6040518263ffffffff1660e01b8152600401611f4d91815260200190565b600060405180830381600087803b158015611f6757600080fd5b505af1158015611f7b573d6000803e3d6000fd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101206312bd9b1960e11b9092526064810191909152600091600160281b90046001600160a01b03169063257b3632906084016020604051808303816000875af1158015611ffb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201f919061356b565b90508060000361204157604051622f6fad60e01b815260040160405180910390fd5b600080600160401b8716156120815786915061205f848a8489611b7b565b61207c576040516338105f3b60e21b815260040160405180910390fd5b6120cb565b602087901c6120918160016137cc565b91508792506120ac6120a4868c86610965565b8a8389611b7b565b6120c9576040516338105f3b60e21b815260040160405180910390fd5b505b6120d5828261288e565b505050505050505050565b6121368363a9059cbb60e01b84846040516024016120ff9291906133fc565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612936565b505050565b60008060405180611ba00160405280611b668152602001613aff611b6691398360405160200161216c9291906133cd565b6040516020818303038152906040529050838151602083016000f591506001600160a01b0382166121b0576040516305f7d84960e51b815260040160405180910390fd5b5092915050565b6002600154036122095760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016119a1565b6002600155565b600061221f60048284866137e9565b61222891613813565b9050632afa533160e01b6001600160e01b03198216016123bc576000808080808080612257896004818d6137e9565b8101906122649190613843565b9650965096509650965096509650336001600160a01b0316876001600160a01b0316146122a45760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03861630146122cd5760405163750643af60e01b815260040160405180910390fd5b8a85146122ed576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e169161236b919061344f565b6000604051808303816000865af19150503d80600081146123a8576040519150601f19603f3d011682016040523d82523d6000602084013e6123ad565b606091505b505050505050505050506106fc565b6001600160e01b031981166323f2ebc360e21b146123ed57604051637141605d60e11b815260040160405180910390fd5b6000808080808080806124038a6004818e6137e9565b8101906124109190613897565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146124525760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038716301461247b5760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f1691612502919061344f565b6000604051808303816000865af19150503d806000811461253f576040519150601f19603f3d011682016040523d82523d6000602084013e612544565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611f7b9085906323b872dd60e01b906084016120ff565b80600161259d602060026139fe565b6125a79190613584565b605354106125c8576040516377ae67b360e11b815260040160405180910390fd5b60006053600081546125d99061337b565b9182905550905060005b602081101561266a578082901c60011660010361261657826033826020811061260e5761260e61334f565b015550505050565b603381602081106126295761262961334f565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925080806126629061337b565b9150506125e3565b50612136613a0a565b60018055565b60685460ff1661269c57604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600054610100900460ff166126f85760405162461bcd60e51b81526004016119a190613a20565b610640612a08565b6060604082511061271f578180602001905181019061068d9190613a6b565b815160200361285b5760005b60208110801561275a57508281815181106127485761274861334f565b01602001516001600160f81b03191615155b1561277157806127698161337b565b91505061272b565b806000036127a95750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b6000816001600160401b038111156127c3576127c3612e60565b6040519080825280601f01601f1916602001820160405280156127ed576020820181803683370190505b50905060005b828110156128535784818151811061280d5761280d61334f565b602001015160f81c60f81b82828151811061282a5761282a61334f565b60200101906001600160f81b031916908160001a9053508061284b8161337b565b9150506127f3565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b606854600090610100900463ffffffff161580156128b2575063ffffffff82166001145b156128c4575063ffffffff82166128eb565b6128d8600160201b63ffffffff8416613415565b6128e89063ffffffff851661342c565b90505b600881901c60008181526069602052604081208054600160ff861690811b9182189283905592909190818316900361163157604051630c8d9eab60e31b815260040160405180910390fd5b600061298b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612a2f9092919063ffffffff16565b80519091501561213657808060200190518101906129a99190613ae1565b6121365760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016119a1565b600054610100900460ff166126735760405162461bcd60e51b81526004016119a190613a20565b606061091d848460008585600080866001600160a01b03168587604051612a56919061344f565b60006040518083038185875af1925050503d8060008114612a93576040519150601f19603f3d011682016040523d82523d6000602084013e612a98565b606091505b5091509150612aa987838387612ab4565b979650505050505050565b60608315612b23578251600003612b1c576001600160a01b0385163b612b1c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016119a1565b508161091d565b61091d8383815115612b385781518083602001fd5b8060405162461bcd60e51b81526004016119a19190612ce8565b803563ffffffff8116811461288957600080fd5b6001600160a01b0381168114612b7b57600080fd5b50565b60008060408385031215612b9157600080fd5b612b9a83612b52565b91506020830135612baa81612b66565b809150509250929050565b6001600160a01b0391909116815260200190565b8015158114612b7b57600080fd5b60008083601f840112612be957600080fd5b5081356001600160401b03811115612c0057600080fd5b602083019150836020828501011115612c1857600080fd5b9250929050565b600080600080600060808688031215612c3757600080fd5b612c4086612b52565b94506020860135612c5081612b66565b93506040860135612c6081612bc9565b925060608601356001600160401b03811115612c7b57600080fd5b612c8788828901612bd7565b969995985093965092949392505050565b60005b83811015612cb3578181015183820152602001612c9b565b50506000910152565b60008151808452612cd4816020860160208601612c98565b601f01601f19169290920160200192915050565b602081526000612cfb6020830184612cbc565b9392505050565b600060208284031215612d1457600080fd5b8135612cfb81612b66565b60ff81168114612b7b57600080fd5b600080600080600080600060e0888a031215612d4957600080fd5b8735612d5481612d1f565b9650612d6260208901612b52565b95506040880135612d7281612b66565b9450612d8060608901612b52565b93506080880135612d9081612b66565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215612dc257600080fd5b612dcb84612b52565b92506020840135612ddb81612b66565b91506040840135612deb81612b66565b809150509250925092565b600060208284031215612e0857600080fd5b5035919050565b80610400810183101561068d57600080fd5b60008060006104408486031215612e3757600080fd5b83359250612e488560208601612e0f565b9150612e576104208501612b52565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612e9e57612e9e612e60565b604052919050565b60006001600160401b03821115612ebf57612ebf612e60565b50601f01601f191660200190565b6000612ee0612edb84612ea6565b612e76565b9050828152838383011115612ef457600080fd5b828260208301376000602084830101529392505050565b600082601f830112612f1c57600080fd5b612cfb83833560208501612ecd565b600080600080600060a08688031215612f4357600080fd5b612f4c86612b52565b94506020860135612f5c81612b66565b935060408601356001600160401b0380821115612f7857600080fd5b612f8489838a01612f0b565b94506060880135915080821115612f9a57600080fd5b50612fa788828901612f0b565b9250506080860135612fb881612d1f565b809150509295509295909350565b60008060008060008060a08789031215612fdf57600080fd5b612fe887612b52565b95506020870135612ff881612b66565b945060408701359350606087013561300f81612bc9565b925060808701356001600160401b0381111561302a57600080fd5b61303689828a01612bd7565b979a9699509497509295939492505050565b6000806040838503121561305b57600080fd5b61306483612b52565b915061307260208401612b52565b90509250929050565b6000806000806000806000806000806000806109208d8f03121561309e57600080fd5b6130a88e8e612e0f565b9b506130b88e6104008f01612e0f565b9a506108008d013599506108208d013598506108408d013597506130df6108608e01612b52565b96506130ef6108808e0135612b66565b6108808d013595506131046108a08e01612b52565b94506131146108c08e0135612b66565b6108c08d013593506108e08d013592506001600160401b036109008e0135111561313d57600080fd5b61314e8e6109008f01358f01612bd7565b81935080925050509295989b509295989b509295989b565b600080600080600080600060c0888a03121561318157600080fd5b61318a88612b52565b9650602088013561319a81612b66565b95506040880135945060608801356131b181612b66565b935060808801356131c181612bc9565b925060a08801356001600160401b038111156131dc57600080fd5b6131e88a828b01612bd7565b989b979a50959850939692959293505050565b60008060008060008060c0878903121561321457600080fd5b61321d87612b52565b9550602087013561322d81612b66565b945061323b60408801612b52565b9350606087013561324b81612b66565b9250608087013561325b81612b66565b915060a08701356001600160401b0381111561327657600080fd5b8701601f8101891361328757600080fd5b61329689823560208401612ecd565b9150509295509295509295565b60008060008061046085870312156132ba57600080fd5b843593506132cb8660208701612e0f565b92506132da6104208601612b52565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b600181811c9082168061332957607f821691505b60208210810361334957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161338d5761338d613365565b5060010190565b6060815260006133a76060830186612cbc565b82810360208401526133b98186612cbc565b91505060ff83166040830152949350505050565b600083516133df818460208801612c98565b8351908301906133f3818360208801612c98565b01949350505050565b6001600160a01b03929092168252602082015260400190565b808202811582820484141761068d5761068d613365565b8082018082111561068d5761068d613365565b8183823760009101908152919050565b60008251613461818460208701612c98565b9190910192915050565b60008060006060848603121561348057600080fd5b83356001600160401b038082111561349757600080fd5b6134a387838801612f0b565b945060208601359150808211156134b957600080fd5b506134c686828701612f0b565b9250506040840135612deb81612d1f565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b63ffffffff861681526001600160a01b03858116602083015284166040820152608060608201819052600090612aa990830184866134d7565b94855263ffffffff9390931660208501526001600160a01b039182166040850152166060830152608082015260a00190565b60006020828403121561357d57600080fd5b5051919050565b8181038181111561068d5761068d613365565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c083018190526000916135e984830187612cbc565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff8416602082015260606040820181905260009061363390830184866134d7565b9695505050505050565b601f82111561213657600081815260208120601f850160051c810160208610156136645750805b601f850160051c820191505b81811015610bfc57828155600101613670565b81516001600160401b0381111561369c5761369c612e60565b6136b0816136aa8454613315565b8461363d565b602080601f8311600181146136e557600084156136cd5750858301515b600019600386901b1c1916600185901b178555610bfc565b600085815260208120601f198616915b82811015613714578886015182559484019460019091019084016136f5565b50858210156137325787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c0830181905260009161379584830187896134d7565b925080851660e085015250509a9950505050505050505050565b6000602082840312156137c157600080fd5b8151612cfb81612d1f565b63ffffffff8181168382160190808211156121b0576121b0613365565b600080858511156137f957600080fd5b8386111561380657600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561383b5780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a03121561385e57600080fd5b873561386981612b66565b9650602088013561387981612b66565b955060408801359450606088013593506080880135612d9081612d1f565b600080600080600080600080610100898b0312156138b457600080fd5b88356138bf81612b66565b975060208901356138cf81612b66565b9650604089013595506060890135945060808901356138ed81612bc9565b935060a08901356138fd81612d1f565b979a969950949793969295929450505060c08201359160e0013590565b600181815b8085111561395557816000190482111561393b5761393b613365565b8085161561394857918102915b93841c939080029061391f565b509250929050565b60008261396c5750600161068d565b816139795750600061068d565b816001811461398f5760028114613999576139b5565b600191505061068d565b60ff8411156139aa576139aa613365565b50506001821b61068d565b5060208310610133831016604e8410600b84101617156139d8575081810a61068d565b6139e2838361391a565b80600019048211156139f6576139f6613365565b029392505050565b6000612cfb838361395d565b634e487b7160e01b600052600160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600060208284031215613a7d57600080fd5b81516001600160401b03811115613a9357600080fd5b8201601f81018413613aa457600080fd5b8051613ab2612edb82612ea6565b818152856020838501011115613ac757600080fd5b613ad8826020830160208601612c98565b95945050505050565b600060208284031215613af357600080fd5b8151612cfb81612bc956fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a26469706673582212200a12026b2bf610e2f7ca4010de0412e160fb51c1e73ab9266a4271993dca473b64736f6c63430008140033", + "deployedBytecode": "0x6080604052600436106101a35760003560e01c806383f24403116100e2578063ccaa2d1111610085578063ccaa2d1114610511578063cd58657914610531578063d02103ca14610544578063dbc169761461056b578063ee25560b14610580578063f5efcd79146105ad578063f811bff7146105cd578063fb570834146105ed57600080fd5b806383f244031461040b5780638ed7e3f21461042b578063aaa13cc21461044b578063b8b284d01461046b578063bab161bf1461048b578063be5831c7146104ad578063c00f14ab146104d1578063cc461632146104f157600080fd5b80633cbc795b1161014a5780633cbc795b146102fd5780633e197043146103365780634b2f336d146103565780635ca1e165146103765780637843298b1461038b57806379e2cf97146103ab57806381b1c174146103c057806383c43a55146103f657600080fd5b806315064c96146101a85780632072f6c5146101d757806322e95f2c146101ee578063240ff3781461021b57806327aef4e81461022e5780632dfdf0b514610250578063318aee3d146102745780633c351e10146102dd575b600080fd5b3480156101b457600080fd5b506068546101c29060ff1681565b60405190151581526020015b60405180910390f35b3480156101e357600080fd5b506101ec61060d565b005b3480156101fa57600080fd5b5061020e610209366004612b7e565b610642565b6040516101ce9190612bb5565b6101ec610229366004612c1f565b610693565b34801561023a57600080fd5b50610243610703565b6040516101ce9190612ce8565b34801561025c57600080fd5b5061026660535481565b6040519081526020016101ce565b34801561028057600080fd5b506102b961028f366004612d02565b606b6020526000908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b039091166020830152016101ce565b3480156102e957600080fd5b50606d5461020e906001600160a01b031681565b34801561030957600080fd5b50606d5461032190600160a01b900463ffffffff1681565b60405163ffffffff90911681526020016101ce565b34801561034257600080fd5b50610266610351366004612d2e565b610791565b34801561036257600080fd5b50606f5461020e906001600160a01b031681565b34801561038257600080fd5b5061026661081e565b34801561039757600080fd5b5061020e6103a6366004612dad565b6108fb565b3480156103b757600080fd5b506101ec610925565b3480156103cc57600080fd5b5061020e6103db366004612df6565b606a602052600090815260409020546001600160a01b031681565b34801561040257600080fd5b50610243610946565b34801561041757600080fd5b50610266610426366004612e21565b610965565b34801561043757600080fd5b50606c5461020e906001600160a01b031681565b34801561045757600080fd5b5061020e610466366004612f2b565b610a3b565b34801561047757600080fd5b506101ec610486366004612fc6565b610b3d565b34801561049757600080fd5b5060685461032190610100900463ffffffff1681565b3480156104b957600080fd5b5060685461032190600160c81b900463ffffffff1681565b3480156104dd57600080fd5b506102436104ec366004612d02565b610c04565b3480156104fd57600080fd5b506101c261050c366004613048565b610c49565b34801561051d57600080fd5b506101ec61052c36600461307b565b610cd2565b6101ec61053f366004613166565b6111e0565b34801561055057600080fd5b5060685461020e90600160281b90046001600160a01b031681565b34801561057757600080fd5b506101ec61163a565b34801561058c57600080fd5b5061026661059b366004612df6565b60696020526000908152604090205481565b3480156105b957600080fd5b506101ec6105c836600461307b565b61166d565b3480156105d957600080fd5b506101ec6105e83660046131fb565b611908565b3480156105f957600080fd5b506101c26106083660046132a3565b611b7b565b606c546001600160a01b0316331461063857604051631736745960e31b815260040160405180910390fd5b610640611b93565b565b6000606a6000848460405160200161065b9291906132eb565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b60685460ff16156106b757604051630bc011ff60e21b815260040160405180910390fd5b34158015906106d05750606f546001600160a01b031615155b156106ee576040516301bd897160e61b815260040160405180910390fd5b6106fc858534868686611bef565b5050505050565b606e805461071090613315565b80601f016020809104026020016040519081016040528092919081815260200182805461073c90613315565b80156107895780601f1061075e57610100808354040283529160200191610789565b820191906000526020600020905b81548152906001019060200180831161076c57829003601f168201915b505050505081565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b605354600090819081805b60208110156108f2578083901c60011660010361088657603381602081106108535761085361334f565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506108b3565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806108ea9061337b565b915050610829565b50919392505050565b600061091d848461090b85611cb9565b61091486611d78565b61046687611e30565b949350505050565b605354606854600160c81b900463ffffffff16101561064057610640611ee8565b60405180611ba00160405280611b668152602001613aff611b66913981565b600083815b6020811015610a3257600163ffffffff8516821c811690036109d5578481602081106109985761099861334f565b6020020135826040516020016109b8929190918252602082015260400190565b604051602081830303815290604052805190602001209150610a20565b818582602081106109e8576109e861334f565b6020020135604051602001610a07929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610a2a8161337b565b91505061096a565b50949350505050565b6000808686604051602001610a519291906132eb565b604051602081830303815290604052805190602001209050600060ff60f81b308360405180611ba00160405280611b668152602001613aff611b669139898989604051602001610aa393929190613394565b60408051601f1981840301815290829052610ac192916020016133cd565b60405160208183030381529060405280519060200120604051602001610b1994939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff1615610b6157604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b0316610b8a5760405163dde3cda760e01b815260040160405180910390fd5b606f54604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac90610bbc90339088906004016133fc565b600060405180830381600087803b158015610bd657600080fd5b505af1158015610bea573d6000803e3d6000fd5b50505050610bfc868686868686611bef565b505050505050565b6060610c0f82611cb9565b610c1883611d78565b610c2184611e30565b604051602001610c3393929190613394565b6040516020818303038152906040529050919050565b6068546000908190610100900463ffffffff16158015610c6f575063ffffffff83166001145b15610c81575063ffffffff8316610ca8565b610c95600160201b63ffffffff8516613415565b610ca59063ffffffff861661342c565b90505b600881901c600090815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff1615610cf657604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614610d26576040516302caf51760e11b815260040160405180910390fd5b610d5a8c8c8c8c8c610d5560008e8e8e8e8e8e8e604051610d4892919061343f565b6040518091039020610791565b611f81565b6001600160a01b038616610e9257606f546001600160a01b0316610e295760006001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015610db1576020820181803683370190505b50604051610dbf919061344f565b60006040518083038185875af1925050503d8060008114610dfc576040519150601f19603f3d011682016040523d82523d6000602084013e610e01565b606091505b5050905080610e2357604051630ce8f45160e31b815260040160405180910390fd5b50611193565b606f546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990610e5b90879087906004016133fc565b600060405180830381600087803b158015610e7557600080fd5b505af1158015610e89573d6000803e3d6000fd5b50505050611193565b606d546001600160a01b038781169116148015610ec05750606d5463ffffffff888116600160a01b90920416145b15610ed85760006001600160a01b0385168482610d87565b60685463ffffffff610100909104811690881603610f0957610f046001600160a01b03871685856120e0565b611193565b60008787604051602001610f1e9291906132eb565b60408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b03168061112f5760008080610f648688018861346b565b9250925092505050506000610faf8386868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061213b92505050565b6040516340c10f1960e01b81529091506001600160a01b038216906340c10f1990610fe0908a908a906004016133fc565b600060405180830381600087803b158015610ffa57600080fd5b505af115801561100e573d6000803e3d6000fd5b5050505080606a600085815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a838888604051611121959493929190613500565b60405180910390a150611190565b6040516340c10f1960e01b81526001600160a01b038216906340c10f199061115d90899089906004016133fc565b600060405180830381600087803b15801561117757600080fd5b505af115801561118b573d6000803e3d6000fd5b505050505b50505b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8a888887876040516111ca959493929190613539565b60405180910390a1505050505050505050505050565b60685460ff161561120457604051630bc011ff60e21b815260040160405180910390fd5b61120c6121b7565b60685463ffffffff61010090910481169088160361123d576040516302caf51760e11b815260040160405180910390fd5b6000806060876001600160a01b038816611323578834146112715760405163b89240f560e01b815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff1694509061129e90613315565b80601f01602080910402602001604051908101604052809291908181526020018280546112ca90613315565b80156113175780601f106112ec57610100808354040283529160200191611317565b820191906000526020600020905b8154815290600101906020018083116112fa57829003601f168201915b505050505091506115af565b34156113425760405163798ee6f160e01b815260040160405180910390fd5b606f546001600160a01b03908116908916036113bd57604051632770a7eb60e21b81526001600160a01b03891690639dc29fac906113869033908d906004016133fc565b600060405180830381600087803b1580156113a057600080fd5b505af11580156113b4573d6000803e3d6000fd5b505050506115af565b6001600160a01b038089166000908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b9004909216918101829052901561147557604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac906114309033908e906004016133fc565b600060405180830381600087803b15801561144a57600080fd5b505af115801561145e573d6000803e3d6000fd5b5050505080602001519450806000015193506115a2565b851561148757611487898b8989612210565b6040516370a0823160e01b81526000906001600160a01b038b16906370a08231906114b6903090600401612bb5565b602060405180830381865afa1580156114d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f7919061356b565b905061150e6001600160a01b038b1633308e612556565b6040516370a0823160e01b81526000906001600160a01b038c16906370a082319061153d903090600401612bb5565b602060405180830381865afa15801561155a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157e919061356b565b905061158a8282613584565b6068548c9850610100900463ffffffff169650935050505b6115ab89610c04565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e86886053546040516115ef989796959493929190613597565b60405180910390a1611616611611600085878f8f878980519060200120610791565b61258e565b861561162457611624611ee8565b5050505061163160018055565b50505050505050565b606c546001600160a01b0316331461166557604051631736745960e31b815260040160405180910390fd5b610640612679565b60685460ff161561169157604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146116c1576040516302caf51760e11b815260040160405180910390fd5b6116e38c8c8c8c8c610d5560018e8e8e8e8e8e8e604051610d4892919061343f565b606f546000906001600160a01b031661179a57846001600160a01b031684888a86866040516024016117189493929190613602565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161174d919061344f565b60006040518083038185875af1925050503d806000811461178a576040519150601f19603f3d011682016040523d82523d6000602084013e61178f565b606091505b50508091505061189c565b606f546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906117cc90889088906004016133fc565b600060405180830381600087803b1580156117e657600080fd5b505af11580156117fa573d6000803e3d6000fd5b50505050846001600160a01b03168789858560405160240161181f9493929190613602565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b17905251611854919061344f565b6000604051808303816000865af19150503d8060008114611891576040519150601f19603f3d011682016040523d82523d6000602084013e611896565b606091505b50909150505b806118ba576040516337e391c360e01b815260040160405180910390fd5b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8b898988886040516118f1959493929190613539565b60405180910390a150505050505050505050505050565b600054610100900460ff16158080156119285750600054600160ff909116105b806119425750303b158015611942575060005460ff166001145b6119aa5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156119cd576000805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff8a160265010000000000600160c81b03191617600160281b6001600160a01b038781169190910291909117909155606c80546001600160a01b0319168583161790558616611a565763ffffffff851615611a5157604051630d43a60960e11b815260040160405180910390fd5b611b25565b606d805463ffffffff8716600160a01b026001600160c01b03199091166001600160a01b03891617179055606e611a8d8382613683565b50611b046000801b6012604051602001611af091906060808252600d908201526c2bb930b83832b21022ba3432b960991b608082015260a060208201819052600490820152630ae8aa8960e31b60c082015260ff91909116604082015260e00190565b60405160208183030381529060405261213b565b606f80546001600160a01b0319166001600160a01b03929092169190911790555b611b2d6126d1565b8015611631576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b600081611b89868686610965565b1495945050505050565b60685460ff1615611bb757604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b60685463ffffffff610100909104811690871603611c20576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051611c7499989796959493929190613742565b60405180910390a1611cab6116116001606860019054906101000a900463ffffffff16338a8a8a8989604051610d4892919061343f565b8215610bfc57610bfc611ee8565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009182916001600160a01b03861691611d00919061344f565b600060405180830381855afa9150503d8060008114611d3b576040519150601f19603f3d011682016040523d82523d6000602084013e611d40565b606091505b509150915081611d6f57604051806040016040528060078152602001664e4f5f4e414d4560c81b81525061091d565b61091d81612700565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009182916001600160a01b03861691611dbf919061344f565b600060405180830381855afa9150503d8060008114611dfa576040519150601f19603f3d011682016040523d82523d6000602084013e611dff565b606091505b509150915081611d6f57604051806040016040528060098152602001681393d7d4d6535093d360ba1b81525061091d565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b03861691611e76919061344f565b600060405180830381855afa9150503d8060008114611eb1576040519150601f19603f3d011682016040523d82523d6000602084013e611eb6565b606091505b5091509150818015611ec9575080516020145b611ed457601261091d565b8080602001905181019061091d91906137af565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d611f2f61081e565b6040518263ffffffff1660e01b8152600401611f4d91815260200190565b600060405180830381600087803b158015611f6757600080fd5b505af1158015611f7b573d6000803e3d6000fd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101206312bd9b1960e11b9092526064810191909152600091600160281b90046001600160a01b03169063257b3632906084016020604051808303816000875af1158015611ffb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201f919061356b565b90508060000361204157604051622f6fad60e01b815260040160405180910390fd5b600080600160401b8716156120815786915061205f848a8489611b7b565b61207c576040516338105f3b60e21b815260040160405180910390fd5b6120cb565b602087901c6120918160016137cc565b91508792506120ac6120a4868c86610965565b8a8389611b7b565b6120c9576040516338105f3b60e21b815260040160405180910390fd5b505b6120d5828261288e565b505050505050505050565b6121368363a9059cbb60e01b84846040516024016120ff9291906133fc565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612936565b505050565b60008060405180611ba00160405280611b668152602001613aff611b6691398360405160200161216c9291906133cd565b6040516020818303038152906040529050838151602083016000f591506001600160a01b0382166121b0576040516305f7d84960e51b815260040160405180910390fd5b5092915050565b6002600154036122095760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016119a1565b6002600155565b600061221f60048284866137e9565b61222891613813565b9050632afa533160e01b6001600160e01b03198216016123bc576000808080808080612257896004818d6137e9565b8101906122649190613843565b9650965096509650965096509650336001600160a01b0316876001600160a01b0316146122a45760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03861630146122cd5760405163750643af60e01b815260040160405180910390fd5b8a85146122ed576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e169161236b919061344f565b6000604051808303816000865af19150503d80600081146123a8576040519150601f19603f3d011682016040523d82523d6000602084013e6123ad565b606091505b505050505050505050506106fc565b6001600160e01b031981166323f2ebc360e21b146123ed57604051637141605d60e11b815260040160405180910390fd5b6000808080808080806124038a6004818e6137e9565b8101906124109190613897565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146124525760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038716301461247b5760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f1691612502919061344f565b6000604051808303816000865af19150503d806000811461253f576040519150601f19603f3d011682016040523d82523d6000602084013e612544565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611f7b9085906323b872dd60e01b906084016120ff565b80600161259d602060026139fe565b6125a79190613584565b605354106125c8576040516377ae67b360e11b815260040160405180910390fd5b60006053600081546125d99061337b565b9182905550905060005b602081101561266a578082901c60011660010361261657826033826020811061260e5761260e61334f565b015550505050565b603381602081106126295761262961334f565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925080806126629061337b565b9150506125e3565b50612136613a0a565b60018055565b60685460ff1661269c57604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600054610100900460ff166126f85760405162461bcd60e51b81526004016119a190613a20565b610640612a08565b6060604082511061271f578180602001905181019061068d9190613a6b565b815160200361285b5760005b60208110801561275a57508281815181106127485761274861334f565b01602001516001600160f81b03191615155b1561277157806127698161337b565b91505061272b565b806000036127a95750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b6000816001600160401b038111156127c3576127c3612e60565b6040519080825280601f01601f1916602001820160405280156127ed576020820181803683370190505b50905060005b828110156128535784818151811061280d5761280d61334f565b602001015160f81c60f81b82828151811061282a5761282a61334f565b60200101906001600160f81b031916908160001a9053508061284b8161337b565b9150506127f3565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b606854600090610100900463ffffffff161580156128b2575063ffffffff82166001145b156128c4575063ffffffff82166128eb565b6128d8600160201b63ffffffff8416613415565b6128e89063ffffffff851661342c565b90505b600881901c60008181526069602052604081208054600160ff861690811b9182189283905592909190818316900361163157604051630c8d9eab60e31b815260040160405180910390fd5b600061298b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612a2f9092919063ffffffff16565b80519091501561213657808060200190518101906129a99190613ae1565b6121365760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016119a1565b600054610100900460ff166126735760405162461bcd60e51b81526004016119a190613a20565b606061091d848460008585600080866001600160a01b03168587604051612a56919061344f565b60006040518083038185875af1925050503d8060008114612a93576040519150601f19603f3d011682016040523d82523d6000602084013e612a98565b606091505b5091509150612aa987838387612ab4565b979650505050505050565b60608315612b23578251600003612b1c576001600160a01b0385163b612b1c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016119a1565b508161091d565b61091d8383815115612b385781518083602001fd5b8060405162461bcd60e51b81526004016119a19190612ce8565b803563ffffffff8116811461288957600080fd5b6001600160a01b0381168114612b7b57600080fd5b50565b60008060408385031215612b9157600080fd5b612b9a83612b52565b91506020830135612baa81612b66565b809150509250929050565b6001600160a01b0391909116815260200190565b8015158114612b7b57600080fd5b60008083601f840112612be957600080fd5b5081356001600160401b03811115612c0057600080fd5b602083019150836020828501011115612c1857600080fd5b9250929050565b600080600080600060808688031215612c3757600080fd5b612c4086612b52565b94506020860135612c5081612b66565b93506040860135612c6081612bc9565b925060608601356001600160401b03811115612c7b57600080fd5b612c8788828901612bd7565b969995985093965092949392505050565b60005b83811015612cb3578181015183820152602001612c9b565b50506000910152565b60008151808452612cd4816020860160208601612c98565b601f01601f19169290920160200192915050565b602081526000612cfb6020830184612cbc565b9392505050565b600060208284031215612d1457600080fd5b8135612cfb81612b66565b60ff81168114612b7b57600080fd5b600080600080600080600060e0888a031215612d4957600080fd5b8735612d5481612d1f565b9650612d6260208901612b52565b95506040880135612d7281612b66565b9450612d8060608901612b52565b93506080880135612d9081612b66565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215612dc257600080fd5b612dcb84612b52565b92506020840135612ddb81612b66565b91506040840135612deb81612b66565b809150509250925092565b600060208284031215612e0857600080fd5b5035919050565b80610400810183101561068d57600080fd5b60008060006104408486031215612e3757600080fd5b83359250612e488560208601612e0f565b9150612e576104208501612b52565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612e9e57612e9e612e60565b604052919050565b60006001600160401b03821115612ebf57612ebf612e60565b50601f01601f191660200190565b6000612ee0612edb84612ea6565b612e76565b9050828152838383011115612ef457600080fd5b828260208301376000602084830101529392505050565b600082601f830112612f1c57600080fd5b612cfb83833560208501612ecd565b600080600080600060a08688031215612f4357600080fd5b612f4c86612b52565b94506020860135612f5c81612b66565b935060408601356001600160401b0380821115612f7857600080fd5b612f8489838a01612f0b565b94506060880135915080821115612f9a57600080fd5b50612fa788828901612f0b565b9250506080860135612fb881612d1f565b809150509295509295909350565b60008060008060008060a08789031215612fdf57600080fd5b612fe887612b52565b95506020870135612ff881612b66565b945060408701359350606087013561300f81612bc9565b925060808701356001600160401b0381111561302a57600080fd5b61303689828a01612bd7565b979a9699509497509295939492505050565b6000806040838503121561305b57600080fd5b61306483612b52565b915061307260208401612b52565b90509250929050565b6000806000806000806000806000806000806109208d8f03121561309e57600080fd5b6130a88e8e612e0f565b9b506130b88e6104008f01612e0f565b9a506108008d013599506108208d013598506108408d013597506130df6108608e01612b52565b96506130ef6108808e0135612b66565b6108808d013595506131046108a08e01612b52565b94506131146108c08e0135612b66565b6108c08d013593506108e08d013592506001600160401b036109008e0135111561313d57600080fd5b61314e8e6109008f01358f01612bd7565b81935080925050509295989b509295989b509295989b565b600080600080600080600060c0888a03121561318157600080fd5b61318a88612b52565b9650602088013561319a81612b66565b95506040880135945060608801356131b181612b66565b935060808801356131c181612bc9565b925060a08801356001600160401b038111156131dc57600080fd5b6131e88a828b01612bd7565b989b979a50959850939692959293505050565b60008060008060008060c0878903121561321457600080fd5b61321d87612b52565b9550602087013561322d81612b66565b945061323b60408801612b52565b9350606087013561324b81612b66565b9250608087013561325b81612b66565b915060a08701356001600160401b0381111561327657600080fd5b8701601f8101891361328757600080fd5b61329689823560208401612ecd565b9150509295509295509295565b60008060008061046085870312156132ba57600080fd5b843593506132cb8660208701612e0f565b92506132da6104208601612b52565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b600181811c9082168061332957607f821691505b60208210810361334957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161338d5761338d613365565b5060010190565b6060815260006133a76060830186612cbc565b82810360208401526133b98186612cbc565b91505060ff83166040830152949350505050565b600083516133df818460208801612c98565b8351908301906133f3818360208801612c98565b01949350505050565b6001600160a01b03929092168252602082015260400190565b808202811582820484141761068d5761068d613365565b8082018082111561068d5761068d613365565b8183823760009101908152919050565b60008251613461818460208701612c98565b9190910192915050565b60008060006060848603121561348057600080fd5b83356001600160401b038082111561349757600080fd5b6134a387838801612f0b565b945060208601359150808211156134b957600080fd5b506134c686828701612f0b565b9250506040840135612deb81612d1f565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b63ffffffff861681526001600160a01b03858116602083015284166040820152608060608201819052600090612aa990830184866134d7565b94855263ffffffff9390931660208501526001600160a01b039182166040850152166060830152608082015260a00190565b60006020828403121561357d57600080fd5b5051919050565b8181038181111561068d5761068d613365565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c083018190526000916135e984830187612cbc565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff8416602082015260606040820181905260009061363390830184866134d7565b9695505050505050565b601f82111561213657600081815260208120601f850160051c810160208610156136645750805b601f850160051c820191505b81811015610bfc57828155600101613670565b81516001600160401b0381111561369c5761369c612e60565b6136b0816136aa8454613315565b8461363d565b602080601f8311600181146136e557600084156136cd5750858301515b600019600386901b1c1916600185901b178555610bfc565b600085815260208120601f198616915b82811015613714578886015182559484019460019091019084016136f5565b50858210156137325787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c0830181905260009161379584830187896134d7565b925080851660e085015250509a9950505050505050505050565b6000602082840312156137c157600080fd5b8151612cfb81612d1f565b63ffffffff8181168382160190808211156121b0576121b0613365565b600080858511156137f957600080fd5b8386111561380657600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561383b5780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a03121561385e57600080fd5b873561386981612b66565b9650602088013561387981612b66565b955060408801359450606088013593506080880135612d9081612d1f565b600080600080600080600080610100898b0312156138b457600080fd5b88356138bf81612b66565b975060208901356138cf81612b66565b9650604089013595506060890135945060808901356138ed81612bc9565b935060a08901356138fd81612d1f565b979a969950949793969295929450505060c08201359160e0013590565b600181815b8085111561395557816000190482111561393b5761393b613365565b8085161561394857918102915b93841c939080029061391f565b509250929050565b60008261396c5750600161068d565b816139795750600061068d565b816001811461398f5760028114613999576139b5565b600191505061068d565b60ff8411156139aa576139aa613365565b50506001821b61068d565b5060208310610133831016604e8410600b84101617156139d8575081810a61068d565b6139e2838361391a565b80600019048211156139f6576139f6613365565b029392505050565b6000612cfb838361395d565b634e487b7160e01b600052600160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600060208284031215613a7d57600080fd5b81516001600160401b03811115613a9357600080fd5b8201601f81018413613aa457600080fd5b8051613ab2612edb82612ea6565b818152856020838501011115613ac757600080fd5b613ad8826020830160208601612c98565b95945050505050565b600060208284031215613af357600080fd5b8151612cfb81612bc956fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a26469706673582212200a12026b2bf610e2f7ca4010de0412e160fb51c1e73ab9266a4271993dca473b64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMGlobalExitRootV2.json b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootV2.json index e434c1983..605a26653 100644 --- a/compiled-contracts/paris/PolygonZkEVMGlobalExitRootV2.json +++ b/compiled-contracts/paris/PolygonZkEVMGlobalExitRootV2.json @@ -264,8 +264,8 @@ "type": "function" } ], - "bytecode": "0x60c060405234801561001057600080fd5b50604051610b37380380610b3783398101604081905261002f91610062565b6001600160a01b0391821660a05216608052610095565b80516001600160a01b038116811461005d57600080fd5b919050565b6000806040838503121561007557600080fd5b61007e83610046565b915061008c60208401610046565b90509250929050565b60805160a051610a6f6100c86000396000818161014901526102c3015260008181610218015261027a0152610a6f6000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c806349b7b8021161008157806383f244031161005b57806383f2440314610200578063a3c573eb14610213578063fb5708341461023a57600080fd5b806349b7b802146101445780635ca1e165146101905780635d8105011461019857600080fd5b8063319cf735116100b2578063319cf7351461011e57806333d6247d146101275780633ed691ef1461013c57600080fd5b806301fd9044146100d9578063257b3632146100f55780632dfdf0b514610115575b600080fd5b6100e260005481565b6040519081526020015b60405180910390f35b6100e261010336600461071d565b60026020526000908152604090205481565b6100e260235481565b6100e260015481565b61013a61013536600461071d565b61025d565b005b6100e2610401565b61016b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ec565b6100e2610416565b6100e26101a6366004610736565b604080516020808201959095528082019390935260c09190911b7fffffffffffffffff0000000000000000000000000000000000000000000000001660608301528051604881840301815260689092019052805191012090565b6100e261020e3660046107a7565b610420565b61016b7f000000000000000000000000000000000000000000000000000000000000000081565b61024d6102483660046107e6565b6104f6565b60405190151581526020016100ec565b60005460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102ac5750600182905581610328565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102f6576000839055829150610328565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610334828461050e565b600081815260026020526040812054919250036103fb57600061035860014361085d565b60008381526002602090815260409182902092409283905581518082018690528083018490527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b16606082015282518082036048018152606890910190925281519101209091506103cc9061053d565b604051849084907fda61aa7823fcd807e37b95aabcbe17f03a6f3efd514176444dae191d27fd66b390600090a3505b50505050565b600061041160015460005461050e565b905090565b6000610411610640565b600083815b60208110156104ed57600163ffffffff8516821c811690036104905784816020811061045357610453610870565b602002013582604051602001610473929190918252602082015260400190565b6040516020818303038152906040528051906020012091506104db565b818582602081106104a3576104a3610870565b60200201356040516020016104c2929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806104e58161089f565b915050610425565b50949350505050565b600081610504868686610420565b1495945050505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b80600161054c602060026109f7565b610556919061085d565b60235410610590576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006023600081546105a19061089f565b9182905550905060005b6020811015610632578082901c6001166001036105de5782600382602081106105d6576105d6610870565b015550505050565b600381602081106105f1576105f1610870565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061062a9061089f565b9150506105ab565b5061063b610a0a565b505050565b602354600090819081805b6020811015610714578083901c6001166001036106a8576003816020811061067557610675610870565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506106d5565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b6040805160208101849052908101839052606001604051602081830303815290604052805190602001209150808061070c9061089f565b91505061064b565b50919392505050565b60006020828403121561072f57600080fd5b5035919050565b60008060006060848603121561074b57600080fd5b8335925060208401359150604084013567ffffffffffffffff8116811461077157600080fd5b809150509250925092565b80610400810183101561053757600080fd5b803563ffffffff811681146107a257600080fd5b919050565b600080600061044084860312156107bd57600080fd5b833592506107ce856020860161077c565b91506107dd610420850161078e565b90509250925092565b60008060008061046085870312156107fd57600080fd5b8435935061080e866020870161077c565b925061081d610420860161078e565b939692955092936104400135925050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156105375761053761082e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036108d0576108d061082e565b5060010190565b600181815b8085111561093057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109165761091661082e565b8085161561092357918102915b93841c93908002906108dc565b509250929050565b60008261094757506001610537565b8161095457506000610537565b816001811461096a576002811461097457610990565b6001915050610537565b60ff8411156109855761098561082e565b50506001821b610537565b5060208310610133831016604e8410600b84101617156109b3575081810a610537565b6109bd83836108d7565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109ef576109ef61082e565b029392505050565b6000610a038383610938565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea2646970667358221220085253bac61681748496caf7cd5c09a387c4551b2b1cabbc8ff512cdeb63bfcc64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100d45760003560e01c806349b7b8021161008157806383f244031161005b57806383f2440314610200578063a3c573eb14610213578063fb5708341461023a57600080fd5b806349b7b802146101445780635ca1e165146101905780635d8105011461019857600080fd5b8063319cf735116100b2578063319cf7351461011e57806333d6247d146101275780633ed691ef1461013c57600080fd5b806301fd9044146100d9578063257b3632146100f55780632dfdf0b514610115575b600080fd5b6100e260005481565b6040519081526020015b60405180910390f35b6100e261010336600461071d565b60026020526000908152604090205481565b6100e260235481565b6100e260015481565b61013a61013536600461071d565b61025d565b005b6100e2610401565b61016b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ec565b6100e2610416565b6100e26101a6366004610736565b604080516020808201959095528082019390935260c09190911b7fffffffffffffffff0000000000000000000000000000000000000000000000001660608301528051604881840301815260689092019052805191012090565b6100e261020e3660046107a7565b610420565b61016b7f000000000000000000000000000000000000000000000000000000000000000081565b61024d6102483660046107e6565b6104f6565b60405190151581526020016100ec565b60005460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102ac5750600182905581610328565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102f6576000839055829150610328565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610334828461050e565b600081815260026020526040812054919250036103fb57600061035860014361085d565b60008381526002602090815260409182902092409283905581518082018690528083018490527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b16606082015282518082036048018152606890910190925281519101209091506103cc9061053d565b604051849084907fda61aa7823fcd807e37b95aabcbe17f03a6f3efd514176444dae191d27fd66b390600090a3505b50505050565b600061041160015460005461050e565b905090565b6000610411610640565b600083815b60208110156104ed57600163ffffffff8516821c811690036104905784816020811061045357610453610870565b602002013582604051602001610473929190918252602082015260400190565b6040516020818303038152906040528051906020012091506104db565b818582602081106104a3576104a3610870565b60200201356040516020016104c2929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806104e58161089f565b915050610425565b50949350505050565b600081610504868686610420565b1495945050505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b80600161054c602060026109f7565b610556919061085d565b60235410610590576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006023600081546105a19061089f565b9182905550905060005b6020811015610632578082901c6001166001036105de5782600382602081106105d6576105d6610870565b015550505050565b600381602081106105f1576105f1610870565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061062a9061089f565b9150506105ab565b5061063b610a0a565b505050565b602354600090819081805b6020811015610714578083901c6001166001036106a8576003816020811061067557610675610870565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506106d5565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b6040805160208101849052908101839052606001604051602081830303815290604052805190602001209150808061070c9061089f565b91505061064b565b50919392505050565b60006020828403121561072f57600080fd5b5035919050565b60008060006060848603121561074b57600080fd5b8335925060208401359150604084013567ffffffffffffffff8116811461077157600080fd5b809150509250925092565b80610400810183101561053757600080fd5b803563ffffffff811681146107a257600080fd5b919050565b600080600061044084860312156107bd57600080fd5b833592506107ce856020860161077c565b91506107dd610420850161078e565b90509250925092565b60008060008061046085870312156107fd57600080fd5b8435935061080e866020870161077c565b925061081d610420860161078e565b939692955092936104400135925050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156105375761053761082e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036108d0576108d061082e565b5060010190565b600181815b8085111561093057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109165761091661082e565b8085161561092357918102915b93841c93908002906108dc565b509250929050565b60008261094757506001610537565b8161095457506000610537565b816001811461096a576002811461097457610990565b6001915050610537565b60ff8411156109855761098561082e565b50506001821b610537565b5060208310610133831016604e8410600b84101617156109b3575081810a610537565b6109bd83836108d7565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109ef576109ef61082e565b029392505050565b6000610a038383610938565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea2646970667358221220085253bac61681748496caf7cd5c09a387c4551b2b1cabbc8ff512cdeb63bfcc64736f6c63430008140033", + "bytecode": "0x60c060405234801561001057600080fd5b50604051610b3c380380610b3c83398101604081905261002f91610062565b6001600160a01b0391821660a05216608052610095565b80516001600160a01b038116811461005d57600080fd5b919050565b6000806040838503121561007557600080fd5b61007e83610046565b915061008c60208401610046565b90509250929050565b60805160a051610a746100c86000396000818161014901526102c401526000818161021801526102770152610a746000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c806349b7b8021161008157806383f244031161005b57806383f2440314610200578063a3c573eb14610213578063fb5708341461023a57600080fd5b806349b7b802146101445780635ca1e165146101905780635d8105011461019857600080fd5b8063319cf735116100b2578063319cf7351461011e57806333d6247d146101275780633ed691ef1461013c57600080fd5b806301fd9044146100d9578063257b3632146100f55780632dfdf0b514610115575b600080fd5b6100e260005481565b6040519081526020015b60405180910390f35b6100e2610103366004610722565b60026020526000908152604090205481565b6100e260235481565b6100e260015481565b61013a610135366004610722565b61025d565b005b6100e2610406565b61016b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ec565b6100e261041b565b6100e26101a636600461073b565b604080516020808201959095528082019390935260c09190911b7fffffffffffffffff0000000000000000000000000000000000000000000000001660608301528051604881840301815260689092019052805191012090565b6100e261020e3660046107ac565b610425565b61016b7f000000000000000000000000000000000000000000000000000000000000000081565b61024d6102483660046107eb565b6104fb565b60405190151581526020016100ec565b60008073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102ad57505060018190556000548161032d565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102fb5750506000819055600154819061032d565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006103398284610513565b6000818152600260205260408120549192500361040057600061035d600143610862565b60008381526002602090815260409182902092409283905581518082018690528083018490527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b16606082015282518082036048018152606890910190925281519101209091506103d190610542565b604051849084907fda61aa7823fcd807e37b95aabcbe17f03a6f3efd514176444dae191d27fd66b390600090a3505b50505050565b6000610416600154600054610513565b905090565b6000610416610645565b600083815b60208110156104f257600163ffffffff8516821c811690036104955784816020811061045857610458610875565b602002013582604051602001610478929190918252602082015260400190565b6040516020818303038152906040528051906020012091506104e0565b818582602081106104a8576104a8610875565b60200201356040516020016104c7929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806104ea816108a4565b91505061042a565b50949350505050565b600081610509868686610425565b1495945050505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b806001610551602060026109fc565b61055b9190610862565b60235410610595576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006023600081546105a6906108a4565b9182905550905060005b6020811015610637578082901c6001166001036105e35782600382602081106105db576105db610875565b015550505050565b600381602081106105f6576105f6610875565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061062f906108a4565b9150506105b0565b50610640610a0f565b505050565b602354600090819081805b6020811015610719578083901c6001166001036106ad576003816020811061067a5761067a610875565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506106da565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080610711906108a4565b915050610650565b50919392505050565b60006020828403121561073457600080fd5b5035919050565b60008060006060848603121561075057600080fd5b8335925060208401359150604084013567ffffffffffffffff8116811461077657600080fd5b809150509250925092565b80610400810183101561053c57600080fd5b803563ffffffff811681146107a757600080fd5b919050565b600080600061044084860312156107c257600080fd5b833592506107d38560208601610781565b91506107e26104208501610793565b90509250925092565b600080600080610460858703121561080257600080fd5b843593506108138660208701610781565b92506108226104208601610793565b939692955092936104400135925050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561053c5761053c610833565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036108d5576108d5610833565b5060010190565b600181815b8085111561093557817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561091b5761091b610833565b8085161561092857918102915b93841c93908002906108e1565b509250929050565b60008261094c5750600161053c565b816109595750600061053c565b816001811461096f576002811461097957610995565b600191505061053c565b60ff84111561098a5761098a610833565b50506001821b61053c565b5060208310610133831016604e8410600b84101617156109b8575081810a61053c565b6109c283836108dc565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109f4576109f4610833565b029392505050565b6000610a08838361093d565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea2646970667358221220fc07ebcb1bf3607eb76c734998833eef05f4a3c59de6fc9a8c736d9a5464407464736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100d45760003560e01c806349b7b8021161008157806383f244031161005b57806383f2440314610200578063a3c573eb14610213578063fb5708341461023a57600080fd5b806349b7b802146101445780635ca1e165146101905780635d8105011461019857600080fd5b8063319cf735116100b2578063319cf7351461011e57806333d6247d146101275780633ed691ef1461013c57600080fd5b806301fd9044146100d9578063257b3632146100f55780632dfdf0b514610115575b600080fd5b6100e260005481565b6040519081526020015b60405180910390f35b6100e2610103366004610722565b60026020526000908152604090205481565b6100e260235481565b6100e260015481565b61013a610135366004610722565b61025d565b005b6100e2610406565b61016b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ec565b6100e261041b565b6100e26101a636600461073b565b604080516020808201959095528082019390935260c09190911b7fffffffffffffffff0000000000000000000000000000000000000000000000001660608301528051604881840301815260689092019052805191012090565b6100e261020e3660046107ac565b610425565b61016b7f000000000000000000000000000000000000000000000000000000000000000081565b61024d6102483660046107eb565b6104fb565b60405190151581526020016100ec565b60008073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102ad57505060018190556000548161032d565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102fb5750506000819055600154819061032d565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006103398284610513565b6000818152600260205260408120549192500361040057600061035d600143610862565b60008381526002602090815260409182902092409283905581518082018690528083018490527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b16606082015282518082036048018152606890910190925281519101209091506103d190610542565b604051849084907fda61aa7823fcd807e37b95aabcbe17f03a6f3efd514176444dae191d27fd66b390600090a3505b50505050565b6000610416600154600054610513565b905090565b6000610416610645565b600083815b60208110156104f257600163ffffffff8516821c811690036104955784816020811061045857610458610875565b602002013582604051602001610478929190918252602082015260400190565b6040516020818303038152906040528051906020012091506104e0565b818582602081106104a8576104a8610875565b60200201356040516020016104c7929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806104ea816108a4565b91505061042a565b50949350505050565b600081610509868686610425565b1495945050505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b806001610551602060026109fc565b61055b9190610862565b60235410610595576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006023600081546105a6906108a4565b9182905550905060005b6020811015610637578082901c6001166001036105e35782600382602081106105db576105db610875565b015550505050565b600381602081106105f6576105f6610875565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061062f906108a4565b9150506105b0565b50610640610a0f565b505050565b602354600090819081805b6020811015610719578083901c6001166001036106ad576003816020811061067a5761067a610875565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506106da565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080610711906108a4565b915050610650565b50919392505050565b60006020828403121561073457600080fd5b5035919050565b60008060006060848603121561075057600080fd5b8335925060208401359150604084013567ffffffffffffffff8116811461077657600080fd5b809150509250925092565b80610400810183101561053c57600080fd5b803563ffffffff811681146107a757600080fd5b919050565b600080600061044084860312156107c257600080fd5b833592506107d38560208601610781565b91506107e26104208501610793565b90509250925092565b600080600080610460858703121561080257600080fd5b843593506108138660208701610781565b92506108226104208601610793565b939692955092936104400135925050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561053c5761053c610833565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036108d5576108d5610833565b5060010190565b600181815b8085111561093557817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561091b5761091b610833565b8085161561092857918102915b93841c93908002906108e1565b509250929050565b60008261094c5750600161053c565b816109595750600061053c565b816001811461096f576002811461097957610995565b600191505061053c565b60ff84111561098a5761098a610833565b50506001821b61053c565b5060208310610133831016604e8410600b84101617156109b8575081810a61053c565b6109c283836108dc565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109f4576109f4610833565b029392505050565b6000610a08838361093d565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea2646970667358221220fc07ebcb1bf3607eb76c734998833eef05f4a3c59de6fc9a8c736d9a5464407464736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMMock.json b/compiled-contracts/paris/PolygonZkEVMMock.json index 652ee5fb6..f13b762cc 100644 --- a/compiled-contracts/paris/PolygonZkEVMMock.json +++ b/compiled-contracts/paris/PolygonZkEVMMock.json @@ -1935,8 +1935,8 @@ "type": "function" } ], - "bytecode": "0x6101406040523480156200001257600080fd5b5060405162007064380380620070648339810160408190526200003591620000a5565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b0391821661010052166101205262000131565b6001600160a01b03811681146200008557600080fd5b50565b80516001600160401b0381168114620000a057600080fd5b919050565b60008060008060008060c08789031215620000bf57600080fd5b8651620000cc816200006f565b6020880151909650620000df816200006f565b6040880151909550620000f2816200006f565b606088015190945062000105816200006f565b9250620001156080880162000088565b91506200012560a0880162000088565b90509295509295509295565b60805160a05160c05160e0516101005161012051616e5e620002066000396000818161083001528181611a880152613ec80152600081816109c30152611a5e01526000818161098901528181612a2d015281816145610152615a90015260008181610b550152818161173801528181611bfb01528181611dcc0152818161263501528181612e06015281816147d901526155df015260008181610c1501528181614f3a0152615392015260008181610a92015281816129fb0152818161333a015281816147ad01526150280152616e5e6000f3fe608060405234801561001057600080fd5b506004361061048d5760003560e01c80638c3d73011161026b578063c754c7ed11610150578063e7a7ed02116100c8578063f14916d611610097578063f851a4401161007c578063f851a44014610c9d578063f8b823e414610cbd578063fe16564f14610cc657600080fd5b8063f14916d614610c77578063f2fde38b14610c8a57600080fd5b8063e7a7ed0214610be0578063e8bf92ed14610c10578063eaeb077b14610c37578063ed6b010414610c4a57600080fd5b8063d2e129f91161011f578063d939b31511610104578063d939b31514610b9d578063dbc1697614610bc5578063e0d1744114610bcd57600080fd5b8063d2e129f914610b77578063d8d1091b14610b8a57600080fd5b8063c754c7ed14610ae2578063c89e42df14610b0e578063cfa8ed4714610b21578063d02103ca14610b5057600080fd5b8063ada8f919116101e3578063b4f77ea9116101b2578063ba58ae3911610197578063ba58ae3914610ab4578063c0cad30214610ac7578063c0ed84e014610ada57600080fd5b8063b4f77ea914610a7a578063b6b0b09714610a8d57600080fd5b8063ada8f919146109ab578063adc879e9146109be578063afd23cbe146109e5578063b4d63f5814610a1357600080fd5b80639aa972a31161023a5780639c9f3dfe1161021f5780639c9f3dfe1461095e578063a066215c14610971578063a3c573eb1461098457600080fd5b80639aa972a3146109385780639b7967601461094b57600080fd5b80638c3d7301146108f75780638da5cb5b146108ff57806396dc3d391461091d57806399f5634e1461093057600080fd5b80634a1a89a711610391578063621dd411116103095780637215541a116102d8578063831c7ead116102bd578063831c7ead1461082b578063837a473814610852578063841b24d7146108c757600080fd5b80637215541a146108045780637fcb36531461081757600080fd5b8063621dd411146107b65780636b8616ce146107c95780636ff512cc146107e9578063715018a6146107fc57600080fd5b8063542028d5116103605780635e9145c9116103455780635e9145c9146107935780635ec91958146107a657806360469169146107ae57600080fd5b8063542028d5146106ea578063574f649e146106f257600080fd5b80634a1a89a7146106845780634a910e6a146106a45780634e487706146106b75780635392c5e0146106ca57600080fd5b80632678224711610424578063383b3be8116103f3578063423fa856116103d8578063423fa856146106285780634560526714610648578063458c04771461067057600080fd5b8063383b3be814610602578063394218e91461061557600080fd5b8063267822471461056b57806329878983146105b05780632b0006fa146105dc5780632c1f816a146105ef57600080fd5b806315064c961161046057806315064c96146105145780631816b7e51461053157806319d8ac6114610544578063220d78991461055857600080fd5b80630a0d9fbe146104925780630eaa86ea146104c9578063107bf28c146104ea57806310a01a72146104ff575b600080fd5b606f546104ab90610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6104dc6104d7366004616066565b610cd9565b6040519081526020016104c0565b6104f26111b1565b6040516104c09190616129565b61051261050d36600461615a565b61123f565b005b606f546105219060ff1681565b60405190151581526020016104c0565b61051261053f3660046161ed565b6117f7565b6073546104ab9067ffffffffffffffff1681565b6104f2610566366004616211565b61190f565b607b5461058b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104c0565b60745461058b9068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6105126105ea366004616270565b611ae6565b6105126105fd3660046162d8565b611cb6565b610521610610366004616352565b611ec4565b610512610623366004616352565b611f1a565b6073546104ab9068010000000000000000900467ffffffffffffffff1681565b6073546104ab90700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546104ab9067ffffffffffffffff1681565b6079546104ab9068010000000000000000900467ffffffffffffffff1681565b6105126106b2366004616352565b61209e565b6105126106c5366004616352565b612151565b6104dc6106d8366004616352565b60756020526000908152604090205481565b6104f26122d5565b6104dc61070036600461646b565b835160209485012060408051808701979097528681019190915260608087019490945260c09290921b7fffffffffffffffff00000000000000000000000000000000000000000000000016608086015290911b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888401528051808403607c018152609c9093019052815191012090565b6105126107a1366004616529565b6122e2565b610512612aec565b6104dc612bec565b6105126107c4366004616270565b612c02565b6104dc6107d7366004616352565b60716020526000908152604090205481565b6105126107f736600461657d565b612f8a565b61051261305f565b610512610812366004616352565b613073565b6074546104ab9067ffffffffffffffff1681565b6104ab7f000000000000000000000000000000000000000000000000000000000000000081565b61089b610860366004616598565b60786020526000908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016104c0565b6079546104ab907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6105126131e3565b60335473ffffffffffffffffffffffffffffffffffffffff1661058b565b61051261092b366004616352565b6132af565b6104dc6132f2565b6105126109463660046162d8565b61344b565b610512610959366004616352565b6134fc565b61051261096c366004616352565b61354b565b61051261097f366004616352565b6136c7565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b6105126109b936600461657d565b6137cd565b6104ab7f000000000000000000000000000000000000000000000000000000000000000081565b606f54610a00906901000000000000000000900461ffff1681565b60405161ffff90911681526020016104c0565b610a54610a21366004616352565b6072602052600090815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016104c0565b610512610a88366004616352565b613891565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b610521610ac2366004616598565b6138a2565b610512610ad53660046165b1565b61392c565b6104ab613944565b607b546104ab9074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b610512610b1c3660046165b1565b613999565b606f5461058b906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b610512610b85366004616628565b613a26565b610512610b983660046166db565b613f6c565b6079546104ab90700100000000000000000000000000000000900467ffffffffffffffff1681565b61051261450e565b610512610bdb36600461671d565b6145e7565b6073546104ab907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b610512610c4536600461676a565b614677565b607b54610521907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b610512610c8536600461657d565b614a6d565b610512610c9836600461657d565b614b3f565b607a5461058b9073ffffffffffffffffffffffffffffffffffffffff1681565b6104dc60705481565b610512610cd43660046167b6565b614bf3565b6000806000610ce6613944565b905067ffffffffffffffff881615610eb35760795467ffffffffffffffff9081169089161115610dc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a4015b60405180910390fd5b67ffffffffffffffff8089166000908152607860205260409020600281015481549094509091898116680100000000000000009092041614610ead576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610dba565b5061104c565b67ffffffffffffffff8716600090815260756020526040902054915081610f82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610dba565b8067ffffffffffffffff168767ffffffffffffffff16111561104c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610dba565b8067ffffffffffffffff168667ffffffffffffffff1611611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610dba565b6000611124888888868961190f565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161115991906167e2565b602060405180830381855afa158015611176573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061119991906167fe565b6111a39190616846565b9a9950505050505050505050565b607780546111be9061685a565b80601f01602080910402602001604051908101604052809291908181526020018280546111ea9061685a565b80156112375780601f1061120c57610100808354040283529160200191611237565b820191906000526020600020905b81548152906001019060200180831161121a57829003601f168201915b505050505081565b611247614c16565b600080611252613944565b905067ffffffffffffffff8a161561141a5760795467ffffffffffffffff908116908b16111561132a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a401610dba565b67ffffffffffffffff808b1660009081526078602052604090206002810154815490945090918b8116680100000000000000009092041614611414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610dba565b506115b3565b67ffffffffffffffff89166000908152607560205260409020549150816114e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610dba565b8067ffffffffffffffff168967ffffffffffffffff1611156115b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610dba565b8067ffffffffffffffff168867ffffffffffffffff161161167c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610dba565b600061168b8a8a8a868b61190f565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8c81169182179092556000908152607560205260409020899055607954919250161561170957607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018990527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b15801561179157600080fd5b505af11580156117a5573d6000803e3d6000fd5b505060405189815233925067ffffffffffffffff8c1691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe9060200160405180910390a35050505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611848576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff16108061186157506103ff8161ffff16115b15611898576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086166000818152607260205260408082205493881682529020546060929115801590611943575081155b1561197a576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806119b1576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119ba846138a2565b6119f0576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611b43576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b51868686868686614c97565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615611bcc57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015611c5457600080fd5b505af1158015611c68573d6000803e3d6000fd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611d13576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d228787878787878761505b565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615611d9d57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015611e2557600080fd5b505af1158015611e39573d6000803e3d6000fd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff82811660009081526078602052604081205490924292611f0892700100000000000000000000000000000000909204811691166168dc565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611f6b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611fb2576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166120215760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610612021576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001611904565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461214557606f5460ff1615612106576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61210f81611ec4565b612145576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61214e81615495565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146121a2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156121e9576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661225457607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610612254576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001611904565b607680546111be9061685a565b606f5460ff161561231f576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461237f576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160008190036123bb576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156123f7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000082048116600081815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b868110156128475760008a8a8381811061245f5761245f616904565b90506020028101906124719190616933565b61247a90616967565b8051805160209091012060608201519192509067ffffffffffffffff16156125f257856124a6816169f4565b965050600081836020015184606001516040516020016124fe93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260719093529120549091508114612587576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff80881660009081526071602052604080822091909155606085015190850151908216911610156125ec576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061272f565b6020820151158015906126b9575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015612693573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b791906167fe565b155b156126f0576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c0101561272f576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080612762575042826040015167ffffffffffffffff16115b15612799576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015197505050808061283f90616a1b565b915050612443565b5061285286856168dc565b60735490945067ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690841611156128bb576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006128c78285616a53565b6128db9067ffffffffffffffff1688616a74565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d861660008181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c84169116179302929092179055909150828116908516146129d157607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b612a233330836070546129e49190616a87565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906156a8565b612a2b61578a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612a9357600080fd5b505af1158015612aa7573d6000803e3d6000fd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612b3d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16612b99576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60006070546064612bfd9190616a87565b905090565b606f5460ff1615612c3f576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581166000908152607260205260409020600101544292612c8c927801000000000000000000000000000000000000000000000000909104811691166168dc565b67ffffffffffffffff161115612cce576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612cdb8686616a53565b67ffffffffffffffff161115612d1d576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d2b868686868686614c97565b612d3484615837565b607954700100000000000000000000000000000000900467ffffffffffffffff16600003612e7c57607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615612dd757607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015612e5f57600080fd5b505af1158015612e73573d6000803e3d6000fd5b50505050612f4c565b612e8461578a565b6079805467ffffffffffffffff16906000612e9e836169f4565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487166000908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001611ca6565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612fdb576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001611904565b613067614c16565b6130716000615a17565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146131db57600061309c613944565b90508067ffffffffffffffff168267ffffffffffffffff16116130eb576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000090910481169083161180613131575067ffffffffffffffff80831660009081526072602052604090206001015416155b15613168576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff80831660009081526072602052604090206001015442916131979162093a8091166168dc565b67ffffffffffffffff1611156131d9576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61214e615a8e565b607b5473ffffffffffffffffffffffffffffffffffffffff163314613234576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6132b7614c16565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015613381573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133a591906167fe565b905060006133b1613944565b60735467ffffffffffffffff6801000000000000000082048116916134099170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416616a53565b61341391906168dc565b61341d9190616a53565b67ffffffffffffffff1690508060000361343a5760009250505090565b6134448183616a9e565b9250505090565b606f5460ff1615613488576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134978787878787878761505b565b67ffffffffffffffff84166000908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16134f3615a8e565b50505050505050565b613504614c16565b6073805467ffffffffffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461359c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156135e3576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661364a5760795467ffffffffffffffff70010000000000000000000000000000000090910481169082161061364a576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001611904565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613718576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff16111561375f576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001611904565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461381e576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001611904565b613899614c16565b61214e81615837565b600067ffffffff0000000167ffffffffffffffff83161080156138da575067ffffffff00000001604083901c67ffffffffffffffff16105b80156138fb575067ffffffff00000001608083901c67ffffffffffffffff16105b8015613912575067ffffffff0000000160c083901c105b1561391f57506001919050565b506000919050565b919050565b613934614c16565b60776139408282616b00565b5050565b60795460009067ffffffffffffffff1615613988575060795467ffffffffffffffff9081166000908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146139ea576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60766139f68282616b00565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516119049190616129565b600054610100900460ff1615808015613a465750600054600160ff909116105b80613a605750303b158015613a60575060005460ff166001145b613aec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610dba565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015613b4a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b613b57602088018861657d565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055613bac604088016020890161657d565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055613c11608088016060890161657d565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790556000805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076613c9c8682616b00565b506077613ca98582616b00565b5062093a80613cbe6060890160408a01616352565b67ffffffffffffffff161115613d00576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d106060880160408901616352565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80613d7260a0890160808a01616352565b67ffffffffffffffff161115613db4576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613dc460a0880160808901616352565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613ea3615b16565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd660007f00000000000000000000000000000000000000000000000000000000000000008585604051613ef99493929190616c63565b60405180910390a180156134f357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613fc9576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614006576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003614042576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561407e576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff780100000000000000000000000000000000000000000000000082048116916140c9918491700100000000000000000000000000000000900416616c9b565b1115614101576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000008204811660008181526072602052604081205491937001000000000000000000000000000000009004909216915b848110156143ab57600087878381811061416157614161616904565b90506020028101906141739190616cae565b61417c90616ce2565b905083614188816169f4565b825180516020918201208185015160408087015190519499509194506000936141ea9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260719093529120549091508114614273576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260716020526040812055614298600189616a74565b84036143075742607b60149054906101000a900467ffffffffffffffff1684604001516142c591906168dc565b67ffffffffffffffff161115614307576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806143a390616a1b565b915050614145565b506143b684846168dc565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589166000818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461455f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156145c757600080fd5b505af11580156145db573d6000803e3d6000fd5b50505050613071615bb6565b6145ef614c16565b6040805160608101825293845267ffffffffffffffff92831660208086019182529284168583019081529584166000908152607290935291209251835551600190920180549351821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169290911691909117919091179055565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16156146d4576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614711576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061471b612bec565b905081811115614757576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115614793576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6147d573ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846156a8565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614842573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061486691906167fe565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff169060186148a0836169f4565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505084846040516148d7929190616d5e565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1660009081526071909352912055323303614a0757607354604080518381523360208201526060918101829052600091810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2614a66565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051614a5d9493929190616d6e565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314614abe576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001611904565b614b47614c16565b73ffffffffffffffffffffffffffffffffffffffff8116614bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610dba565b61214e81615a17565b614bfb614c16565b67ffffffffffffffff16600090815260756020526040902055565b60335473ffffffffffffffffffffffffffffffffffffffff163314613071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dba565b600080614ca2613944565b905067ffffffffffffffff881615614d725760795467ffffffffffffffff9081169089161115614cfe576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089166000908152607860205260409020600281015481549094509091898116680100000000000000009092041614614d6c576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614e13565b67ffffffffffffffff8716600090815260756020526040902054915081614dc5576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115614e13576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611614e60576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000614e6f888888868961190f565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051614ea491906167e2565b602060405180830381855afa158015614ec1573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190614ee491906167fe565b614eee9190616846565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91614f7091899190600401616da4565b602060405180830381865afa158015614f8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614fb19190616ddf565b614fe7576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61504f33614ff5858b616a53565b67ffffffffffffffff166150076132f2565b6150119190616a87565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190615c45565b50505050505050505050565b600067ffffffffffffffff8816156151295760795467ffffffffffffffff90811690891611156150b7576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088166000908152607860205260409020600281015481549092888116680100000000000000009092041614615123576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506151c5565b5067ffffffffffffffff85166000908152607560205260409020548061517b576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff90811690871611156151c5576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff90811690881611806151f757508767ffffffffffffffff168767ffffffffffffffff1611155b8061521e575060795467ffffffffffffffff68010000000000000000909104811690881611155b15615255576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781166000908152607860205260409020546801000000000000000090048116908616146152b8576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006152c7878787858861190f565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516152fc91906167e2565b602060405180830381855afa158015615319573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061533c91906167fe565b6153469190616846565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916153c891889190600401616da4565b602060405180830381865afa1580156153e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906154099190616ddf565b61543f576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff891660009081526078602052604090206002015485900361504f576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff6801000000000000000090910481169082161115806154cf575060795467ffffffffffffffff908116908216115b15615506576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff818116600081815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b15801561563857600080fd5b505af115801561564c573d6000803e3d6000fd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161569b91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526157849085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152615ca0565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115613071576079546000906157d39068010000000000000000900467ffffffffffffffff1660016168dc565b90506157de81611ec4565b1561214e5760795460009060029061580190849067ffffffffffffffff16616a53565b61580b9190616e01565b61581590836168dc565b905061582081611ec4565b1561582e5761394081615495565b61394082615495565b6000615841613944565b9050816000806158518484616a53565b606f5467ffffffffffffffff91821692506000916158759161010090041642616a74565b90505b8467ffffffffffffffff168467ffffffffffffffff16146159005767ffffffffffffffff808516600090815260726020526040902060018101549091168210156158de57600181015468010000000000000000900467ffffffffffffffff1694506158fa565b6158e88686616a53565b67ffffffffffffffff16935050615900565b50615878565b600061590c8484616a74565b90508381101561596357808403600c8111615927578061592a565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a607054028161595957615959616817565b04607055506159d3565b838103600c81116159745780615977565b600c5b90506000816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a764000002816159ae576159ae616817565b04905080607054670de0b6b3a764000002816159cc576159cc616817565b0460705550505b683635c9adc5dea0000060705411156159f857683635c9adc5dea000006070556134f3565b633b9aca0060705410156134f357633b9aca0060705550505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b158015615af657600080fd5b505af1158015615b0a573d6000803e3d6000fd5b50505050613071615dac565b600054610100900460ff16615bad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610dba565b61307133615a17565b606f5460ff16615bf2576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052615c9b9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401615702565b505050565b6000615d02826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615e3f9092919063ffffffff16565b805190915015615c9b5780806020019051810190615d209190616ddf565b615c9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610dba565b606f5460ff1615615de9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b6060615e4e8484600085615e56565b949350505050565b606082471015615ee8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610dba565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051615f1191906167e2565b60006040518083038185875af1925050503d8060008114615f4e576040519150601f19603f3d011682016040523d82523d6000602084013e615f53565b606091505b5091509150615f6487838387615f6f565b979650505050505050565b60608315616005578251600003615ffe5773ffffffffffffffffffffffffffffffffffffffff85163b615ffe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610dba565b5081615e4e565b615e4e838381511561601a5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dba9190616129565b803567ffffffffffffffff8116811461392757600080fd5b600080600080600060a0868803121561607e57600080fd5b6160878661604e565b94506160956020870161604e565b93506160a36040870161604e565b94979396509394606081013594506080013592915050565b60005b838110156160d65781810151838201526020016160be565b50506000910152565b600081518084526160f78160208601602086016160bb565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061613c60208301846160df565b9392505050565b806040810183101561615457600080fd5b92915050565b6000806000806000806000806101a0898b03121561617757600080fd5b6161808961604e565b975061618e60208a0161604e565b965061619c60408a0161604e565b955060608901359450608089013593506161b98a60a08b01616143565b925061016089018a8111156161cd57600080fd5b60e08a0192506161dd8b82616143565b9150509295985092959890939650565b6000602082840312156161ff57600080fd5b813561ffff8116811461613c57600080fd5b600080600080600060a0868803121561622957600080fd5b6162328661604e565b94506162406020870161604e565b94979496505050506040830135926060810135926080909101359150565b80610300810183101561615457600080fd5b6000806000806000806103a0878903121561628a57600080fd5b6162938761604e565b95506162a16020880161604e565b94506162af6040880161604e565b935060608701359250608087013591506162cc8860a0890161625e565b90509295509295509295565b60008060008060008060006103c0888a0312156162f457600080fd5b6162fd8861604e565b965061630b6020890161604e565b95506163196040890161604e565b94506163276060890161604e565b93506080880135925060a088013591506163448960c08a0161625e565b905092959891949750929550565b60006020828403121561636457600080fd5b61613c8261604e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126163ad57600080fd5b813567ffffffffffffffff808211156163c8576163c861636d565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561640e5761640e61636d565b8160405283815286602085880101111561642757600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461392757600080fd5b600080600080600060a0868803121561648357600080fd5b85359450602086013567ffffffffffffffff8111156164a157600080fd5b6164ad8882890161639c565b945050604086013592506164c36060870161604e565b91506164d160808701616447565b90509295509295909350565b60008083601f8401126164ef57600080fd5b50813567ffffffffffffffff81111561650757600080fd5b6020830191508360208260051b850101111561652257600080fd5b9250929050565b60008060006040848603121561653e57600080fd5b833567ffffffffffffffff81111561655557600080fd5b616561868287016164dd565b9094509250616574905060208501616447565b90509250925092565b60006020828403121561658f57600080fd5b61613c82616447565b6000602082840312156165aa57600080fd5b5035919050565b6000602082840312156165c357600080fd5b813567ffffffffffffffff8111156165da57600080fd5b615e4e8482850161639c565b60008083601f8401126165f857600080fd5b50813567ffffffffffffffff81111561661057600080fd5b60208301915083602082850101111561652257600080fd5b60008060008060008086880361012081121561664357600080fd5b60a081121561665157600080fd5b5086955060a0870135945060c087013567ffffffffffffffff8082111561667757600080fd5b6166838a838b0161639c565b955060e089013591508082111561669957600080fd5b6166a58a838b0161639c565b94506101008901359150808211156166bc57600080fd5b506166c989828a016165e6565b979a9699509497509295939492505050565b600080602083850312156166ee57600080fd5b823567ffffffffffffffff81111561670557600080fd5b616711858286016164dd565b90969095509350505050565b6000806000806080858703121561673357600080fd5b61673c8561604e565b9350602085013592506167516040860161604e565b915061675f6060860161604e565b905092959194509250565b60008060006040848603121561677f57600080fd5b833567ffffffffffffffff81111561679657600080fd5b6167a2868287016165e6565b909790965060209590950135949350505050565b600080604083850312156167c957600080fd5b823591506167d96020840161604e565b90509250929050565b600082516167f48184602087016160bb565b9190910192915050565b60006020828403121561681057600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261685557616855616817565b500690565b600181811c9082168061686e57607f821691505b6020821081036168a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8181168382160190808211156168fd576168fd6168ad565b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126167f457600080fd5b60006080823603121561697957600080fd5b6040516080810167ffffffffffffffff828210818311171561699d5761699d61636d565b8160405284359150808211156169b257600080fd5b506169bf3682860161639c565b825250602083013560208201526169d86040840161604e565b60408201526169e96060840161604e565b606082015292915050565b600067ffffffffffffffff808316818103616a1157616a116168ad565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203616a4c57616a4c6168ad565b5060010190565b67ffffffffffffffff8281168282160390808211156168fd576168fd6168ad565b81810381811115616154576161546168ad565b8082028115828204841417616154576161546168ad565b600082616aad57616aad616817565b500490565b601f821115615c9b57600081815260208120601f850160051c81016020861015616ad95750805b601f850160051c820191505b81811015616af857828155600101616ae5565b505050505050565b815167ffffffffffffffff811115616b1a57616b1a61636d565b616b2e81616b28845461685a565b84616ab2565b602080601f831160018114616b815760008415616b4b5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555616af8565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015616bce57888601518255948401946001909101908401616baf565b5085821015616c0a57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600067ffffffffffffffff808716835280861660208401525060606040830152616c91606083018486616c1a565b9695505050505050565b80820180821115616154576161546168ad565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126167f457600080fd5b600060608236031215616cf457600080fd5b6040516060810167ffffffffffffffff8282108183111715616d1857616d1861636d565b816040528435915080821115616d2d57600080fd5b50616d3a3682860161639c565b82525060208301356020820152616d536040840161604e565b604082015292915050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000616c91606083018486616c1a565b61032081016103008085843782018360005b6001811015616dd5578151835260209283019290910190600101616db6565b5050509392505050565b600060208284031215616df157600080fd5b8151801515811461613c57600080fd5b600067ffffffffffffffff80841680616e1c57616e1c616817565b9216919091049291505056fea26469706673582212200d16bdfde0b321a22abe6c2d141b1b0579321cd6fce8fe87dd8ebcb5f5c5aaca64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061048d5760003560e01c80638c3d73011161026b578063c754c7ed11610150578063e7a7ed02116100c8578063f14916d611610097578063f851a4401161007c578063f851a44014610c9d578063f8b823e414610cbd578063fe16564f14610cc657600080fd5b8063f14916d614610c77578063f2fde38b14610c8a57600080fd5b8063e7a7ed0214610be0578063e8bf92ed14610c10578063eaeb077b14610c37578063ed6b010414610c4a57600080fd5b8063d2e129f91161011f578063d939b31511610104578063d939b31514610b9d578063dbc1697614610bc5578063e0d1744114610bcd57600080fd5b8063d2e129f914610b77578063d8d1091b14610b8a57600080fd5b8063c754c7ed14610ae2578063c89e42df14610b0e578063cfa8ed4714610b21578063d02103ca14610b5057600080fd5b8063ada8f919116101e3578063b4f77ea9116101b2578063ba58ae3911610197578063ba58ae3914610ab4578063c0cad30214610ac7578063c0ed84e014610ada57600080fd5b8063b4f77ea914610a7a578063b6b0b09714610a8d57600080fd5b8063ada8f919146109ab578063adc879e9146109be578063afd23cbe146109e5578063b4d63f5814610a1357600080fd5b80639aa972a31161023a5780639c9f3dfe1161021f5780639c9f3dfe1461095e578063a066215c14610971578063a3c573eb1461098457600080fd5b80639aa972a3146109385780639b7967601461094b57600080fd5b80638c3d7301146108f75780638da5cb5b146108ff57806396dc3d391461091d57806399f5634e1461093057600080fd5b80634a1a89a711610391578063621dd411116103095780637215541a116102d8578063831c7ead116102bd578063831c7ead1461082b578063837a473814610852578063841b24d7146108c757600080fd5b80637215541a146108045780637fcb36531461081757600080fd5b8063621dd411146107b65780636b8616ce146107c95780636ff512cc146107e9578063715018a6146107fc57600080fd5b8063542028d5116103605780635e9145c9116103455780635e9145c9146107935780635ec91958146107a657806360469169146107ae57600080fd5b8063542028d5146106ea578063574f649e146106f257600080fd5b80634a1a89a7146106845780634a910e6a146106a45780634e487706146106b75780635392c5e0146106ca57600080fd5b80632678224711610424578063383b3be8116103f3578063423fa856116103d8578063423fa856146106285780634560526714610648578063458c04771461067057600080fd5b8063383b3be814610602578063394218e91461061557600080fd5b8063267822471461056b57806329878983146105b05780632b0006fa146105dc5780632c1f816a146105ef57600080fd5b806315064c961161046057806315064c96146105145780631816b7e51461053157806319d8ac6114610544578063220d78991461055857600080fd5b80630a0d9fbe146104925780630eaa86ea146104c9578063107bf28c146104ea57806310a01a72146104ff575b600080fd5b606f546104ab90610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6104dc6104d7366004616066565b610cd9565b6040519081526020016104c0565b6104f26111b1565b6040516104c09190616129565b61051261050d36600461615a565b61123f565b005b606f546105219060ff1681565b60405190151581526020016104c0565b61051261053f3660046161ed565b6117f7565b6073546104ab9067ffffffffffffffff1681565b6104f2610566366004616211565b61190f565b607b5461058b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104c0565b60745461058b9068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6105126105ea366004616270565b611ae6565b6105126105fd3660046162d8565b611cb6565b610521610610366004616352565b611ec4565b610512610623366004616352565b611f1a565b6073546104ab9068010000000000000000900467ffffffffffffffff1681565b6073546104ab90700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546104ab9067ffffffffffffffff1681565b6079546104ab9068010000000000000000900467ffffffffffffffff1681565b6105126106b2366004616352565b61209e565b6105126106c5366004616352565b612151565b6104dc6106d8366004616352565b60756020526000908152604090205481565b6104f26122d5565b6104dc61070036600461646b565b835160209485012060408051808701979097528681019190915260608087019490945260c09290921b7fffffffffffffffff00000000000000000000000000000000000000000000000016608086015290911b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888401528051808403607c018152609c9093019052815191012090565b6105126107a1366004616529565b6122e2565b610512612aec565b6104dc612bec565b6105126107c4366004616270565b612c02565b6104dc6107d7366004616352565b60716020526000908152604090205481565b6105126107f736600461657d565b612f8a565b61051261305f565b610512610812366004616352565b613073565b6074546104ab9067ffffffffffffffff1681565b6104ab7f000000000000000000000000000000000000000000000000000000000000000081565b61089b610860366004616598565b60786020526000908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016104c0565b6079546104ab907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6105126131e3565b60335473ffffffffffffffffffffffffffffffffffffffff1661058b565b61051261092b366004616352565b6132af565b6104dc6132f2565b6105126109463660046162d8565b61344b565b610512610959366004616352565b6134fc565b61051261096c366004616352565b61354b565b61051261097f366004616352565b6136c7565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b6105126109b936600461657d565b6137cd565b6104ab7f000000000000000000000000000000000000000000000000000000000000000081565b606f54610a00906901000000000000000000900461ffff1681565b60405161ffff90911681526020016104c0565b610a54610a21366004616352565b6072602052600090815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016104c0565b610512610a88366004616352565b613891565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b610521610ac2366004616598565b6138a2565b610512610ad53660046165b1565b61392c565b6104ab613944565b607b546104ab9074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b610512610b1c3660046165b1565b613999565b606f5461058b906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b610512610b85366004616628565b613a26565b610512610b983660046166db565b613f6c565b6079546104ab90700100000000000000000000000000000000900467ffffffffffffffff1681565b61051261450e565b610512610bdb36600461671d565b6145e7565b6073546104ab907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b610512610c4536600461676a565b614677565b607b54610521907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b610512610c8536600461657d565b614a6d565b610512610c9836600461657d565b614b3f565b607a5461058b9073ffffffffffffffffffffffffffffffffffffffff1681565b6104dc60705481565b610512610cd43660046167b6565b614bf3565b6000806000610ce6613944565b905067ffffffffffffffff881615610eb35760795467ffffffffffffffff9081169089161115610dc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a4015b60405180910390fd5b67ffffffffffffffff8089166000908152607860205260409020600281015481549094509091898116680100000000000000009092041614610ead576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610dba565b5061104c565b67ffffffffffffffff8716600090815260756020526040902054915081610f82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610dba565b8067ffffffffffffffff168767ffffffffffffffff16111561104c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610dba565b8067ffffffffffffffff168667ffffffffffffffff1611611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610dba565b6000611124888888868961190f565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161115991906167e2565b602060405180830381855afa158015611176573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061119991906167fe565b6111a39190616846565b9a9950505050505050505050565b607780546111be9061685a565b80601f01602080910402602001604051908101604052809291908181526020018280546111ea9061685a565b80156112375780601f1061120c57610100808354040283529160200191611237565b820191906000526020600020905b81548152906001019060200180831161121a57829003601f168201915b505050505081565b611247614c16565b600080611252613944565b905067ffffffffffffffff8a161561141a5760795467ffffffffffffffff908116908b16111561132a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a401610dba565b67ffffffffffffffff808b1660009081526078602052604090206002810154815490945090918b8116680100000000000000009092041614611414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610dba565b506115b3565b67ffffffffffffffff89166000908152607560205260409020549150816114e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610dba565b8067ffffffffffffffff168967ffffffffffffffff1611156115b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610dba565b8067ffffffffffffffff168867ffffffffffffffff161161167c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610dba565b600061168b8a8a8a868b61190f565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8c81169182179092556000908152607560205260409020899055607954919250161561170957607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018990527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b15801561179157600080fd5b505af11580156117a5573d6000803e3d6000fd5b505060405189815233925067ffffffffffffffff8c1691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe9060200160405180910390a35050505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611848576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff16108061186157506103ff8161ffff16115b15611898576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086166000818152607260205260408082205493881682529020546060929115801590611943575081155b1561197a576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806119b1576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119ba846138a2565b6119f0576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611b43576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b51868686868686614c97565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615611bcc57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015611c5457600080fd5b505af1158015611c68573d6000803e3d6000fd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611d13576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d228787878787878761505b565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615611d9d57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015611e2557600080fd5b505af1158015611e39573d6000803e3d6000fd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff82811660009081526078602052604081205490924292611f0892700100000000000000000000000000000000909204811691166168dc565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611f6b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611fb2576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166120215760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610612021576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001611904565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461214557606f5460ff1615612106576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61210f81611ec4565b612145576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61214e81615495565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146121a2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156121e9576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661225457607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610612254576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001611904565b607680546111be9061685a565b606f5460ff161561231f576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461237f576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160008190036123bb576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156123f7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000082048116600081815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b868110156128475760008a8a8381811061245f5761245f616904565b90506020028101906124719190616933565b61247a90616967565b8051805160209091012060608201519192509067ffffffffffffffff16156125f257856124a6816169f4565b965050600081836020015184606001516040516020016124fe93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260719093529120549091508114612587576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff80881660009081526071602052604080822091909155606085015190850151908216911610156125ec576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061272f565b6020820151158015906126b9575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015612693573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b791906167fe565b155b156126f0576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c0101561272f576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080612762575042826040015167ffffffffffffffff16115b15612799576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015197505050808061283f90616a1b565b915050612443565b5061285286856168dc565b60735490945067ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690841611156128bb576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006128c78285616a53565b6128db9067ffffffffffffffff1688616a74565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d861660008181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c84169116179302929092179055909150828116908516146129d157607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b612a233330836070546129e49190616a87565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906156a8565b612a2b61578a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612a9357600080fd5b505af1158015612aa7573d6000803e3d6000fd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612b3d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16612b99576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60006070546064612bfd9190616a87565b905090565b606f5460ff1615612c3f576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581166000908152607260205260409020600101544292612c8c927801000000000000000000000000000000000000000000000000909104811691166168dc565b67ffffffffffffffff161115612cce576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612cdb8686616a53565b67ffffffffffffffff161115612d1d576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d2b868686868686614c97565b612d3484615837565b607954700100000000000000000000000000000000900467ffffffffffffffff16600003612e7c57607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615612dd757607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015612e5f57600080fd5b505af1158015612e73573d6000803e3d6000fd5b50505050612f4c565b612e8461578a565b6079805467ffffffffffffffff16906000612e9e836169f4565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487166000908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001611ca6565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612fdb576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001611904565b613067614c16565b6130716000615a17565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146131db57600061309c613944565b90508067ffffffffffffffff168267ffffffffffffffff16116130eb576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000090910481169083161180613131575067ffffffffffffffff80831660009081526072602052604090206001015416155b15613168576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff80831660009081526072602052604090206001015442916131979162093a8091166168dc565b67ffffffffffffffff1611156131d9576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61214e615a8e565b607b5473ffffffffffffffffffffffffffffffffffffffff163314613234576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6132b7614c16565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015613381573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133a591906167fe565b905060006133b1613944565b60735467ffffffffffffffff6801000000000000000082048116916134099170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416616a53565b61341391906168dc565b61341d9190616a53565b67ffffffffffffffff1690508060000361343a5760009250505090565b6134448183616a9e565b9250505090565b606f5460ff1615613488576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134978787878787878761505b565b67ffffffffffffffff84166000908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16134f3615a8e565b50505050505050565b613504614c16565b6073805467ffffffffffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461359c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156135e3576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661364a5760795467ffffffffffffffff70010000000000000000000000000000000090910481169082161061364a576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001611904565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613718576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff16111561375f576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001611904565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461381e576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001611904565b613899614c16565b61214e81615837565b600067ffffffff0000000167ffffffffffffffff83161080156138da575067ffffffff00000001604083901c67ffffffffffffffff16105b80156138fb575067ffffffff00000001608083901c67ffffffffffffffff16105b8015613912575067ffffffff0000000160c083901c105b1561391f57506001919050565b506000919050565b919050565b613934614c16565b60776139408282616b00565b5050565b60795460009067ffffffffffffffff1615613988575060795467ffffffffffffffff9081166000908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146139ea576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60766139f68282616b00565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516119049190616129565b600054610100900460ff1615808015613a465750600054600160ff909116105b80613a605750303b158015613a60575060005460ff166001145b613aec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610dba565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015613b4a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b613b57602088018861657d565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055613bac604088016020890161657d565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055613c11608088016060890161657d565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790556000805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076613c9c8682616b00565b506077613ca98582616b00565b5062093a80613cbe6060890160408a01616352565b67ffffffffffffffff161115613d00576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d106060880160408901616352565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80613d7260a0890160808a01616352565b67ffffffffffffffff161115613db4576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613dc460a0880160808901616352565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613ea3615b16565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd660007f00000000000000000000000000000000000000000000000000000000000000008585604051613ef99493929190616c63565b60405180910390a180156134f357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613fc9576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614006576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003614042576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561407e576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff780100000000000000000000000000000000000000000000000082048116916140c9918491700100000000000000000000000000000000900416616c9b565b1115614101576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000008204811660008181526072602052604081205491937001000000000000000000000000000000009004909216915b848110156143ab57600087878381811061416157614161616904565b90506020028101906141739190616cae565b61417c90616ce2565b905083614188816169f4565b825180516020918201208185015160408087015190519499509194506000936141ea9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260719093529120549091508114614273576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260716020526040812055614298600189616a74565b84036143075742607b60149054906101000a900467ffffffffffffffff1684604001516142c591906168dc565b67ffffffffffffffff161115614307576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806143a390616a1b565b915050614145565b506143b684846168dc565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589166000818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461455f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156145c757600080fd5b505af11580156145db573d6000803e3d6000fd5b50505050613071615bb6565b6145ef614c16565b6040805160608101825293845267ffffffffffffffff92831660208086019182529284168583019081529584166000908152607290935291209251835551600190920180549351821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169290911691909117919091179055565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16156146d4576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614711576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061471b612bec565b905081811115614757576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115614793576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6147d573ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846156a8565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614842573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061486691906167fe565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff169060186148a0836169f4565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505084846040516148d7929190616d5e565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1660009081526071909352912055323303614a0757607354604080518381523360208201526060918101829052600091810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2614a66565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051614a5d9493929190616d6e565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314614abe576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001611904565b614b47614c16565b73ffffffffffffffffffffffffffffffffffffffff8116614bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610dba565b61214e81615a17565b614bfb614c16565b67ffffffffffffffff16600090815260756020526040902055565b60335473ffffffffffffffffffffffffffffffffffffffff163314613071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dba565b600080614ca2613944565b905067ffffffffffffffff881615614d725760795467ffffffffffffffff9081169089161115614cfe576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089166000908152607860205260409020600281015481549094509091898116680100000000000000009092041614614d6c576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614e13565b67ffffffffffffffff8716600090815260756020526040902054915081614dc5576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115614e13576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611614e60576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000614e6f888888868961190f565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051614ea491906167e2565b602060405180830381855afa158015614ec1573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190614ee491906167fe565b614eee9190616846565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91614f7091899190600401616da4565b602060405180830381865afa158015614f8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614fb19190616ddf565b614fe7576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61504f33614ff5858b616a53565b67ffffffffffffffff166150076132f2565b6150119190616a87565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190615c45565b50505050505050505050565b600067ffffffffffffffff8816156151295760795467ffffffffffffffff90811690891611156150b7576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088166000908152607860205260409020600281015481549092888116680100000000000000009092041614615123576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506151c5565b5067ffffffffffffffff85166000908152607560205260409020548061517b576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff90811690871611156151c5576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff90811690881611806151f757508767ffffffffffffffff168767ffffffffffffffff1611155b8061521e575060795467ffffffffffffffff68010000000000000000909104811690881611155b15615255576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781166000908152607860205260409020546801000000000000000090048116908616146152b8576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006152c7878787858861190f565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516152fc91906167e2565b602060405180830381855afa158015615319573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061533c91906167fe565b6153469190616846565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916153c891889190600401616da4565b602060405180830381865afa1580156153e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906154099190616ddf565b61543f576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff891660009081526078602052604090206002015485900361504f576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff6801000000000000000090910481169082161115806154cf575060795467ffffffffffffffff908116908216115b15615506576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff818116600081815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b15801561563857600080fd5b505af115801561564c573d6000803e3d6000fd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161569b91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526157849085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152615ca0565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115613071576079546000906157d39068010000000000000000900467ffffffffffffffff1660016168dc565b90506157de81611ec4565b1561214e5760795460009060029061580190849067ffffffffffffffff16616a53565b61580b9190616e01565b61581590836168dc565b905061582081611ec4565b1561582e5761394081615495565b61394082615495565b6000615841613944565b9050816000806158518484616a53565b606f5467ffffffffffffffff91821692506000916158759161010090041642616a74565b90505b8467ffffffffffffffff168467ffffffffffffffff16146159005767ffffffffffffffff808516600090815260726020526040902060018101549091168210156158de57600181015468010000000000000000900467ffffffffffffffff1694506158fa565b6158e88686616a53565b67ffffffffffffffff16935050615900565b50615878565b600061590c8484616a74565b90508381101561596357808403600c8111615927578061592a565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a607054028161595957615959616817565b04607055506159d3565b838103600c81116159745780615977565b600c5b90506000816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a764000002816159ae576159ae616817565b04905080607054670de0b6b3a764000002816159cc576159cc616817565b0460705550505b683635c9adc5dea0000060705411156159f857683635c9adc5dea000006070556134f3565b633b9aca0060705410156134f357633b9aca0060705550505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b158015615af657600080fd5b505af1158015615b0a573d6000803e3d6000fd5b50505050613071615dac565b600054610100900460ff16615bad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610dba565b61307133615a17565b606f5460ff16615bf2576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052615c9b9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401615702565b505050565b6000615d02826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615e3f9092919063ffffffff16565b805190915015615c9b5780806020019051810190615d209190616ddf565b615c9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610dba565b606f5460ff1615615de9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b6060615e4e8484600085615e56565b949350505050565b606082471015615ee8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610dba565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051615f1191906167e2565b60006040518083038185875af1925050503d8060008114615f4e576040519150601f19603f3d011682016040523d82523d6000602084013e615f53565b606091505b5091509150615f6487838387615f6f565b979650505050505050565b60608315616005578251600003615ffe5773ffffffffffffffffffffffffffffffffffffffff85163b615ffe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610dba565b5081615e4e565b615e4e838381511561601a5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dba9190616129565b803567ffffffffffffffff8116811461392757600080fd5b600080600080600060a0868803121561607e57600080fd5b6160878661604e565b94506160956020870161604e565b93506160a36040870161604e565b94979396509394606081013594506080013592915050565b60005b838110156160d65781810151838201526020016160be565b50506000910152565b600081518084526160f78160208601602086016160bb565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061613c60208301846160df565b9392505050565b806040810183101561615457600080fd5b92915050565b6000806000806000806000806101a0898b03121561617757600080fd5b6161808961604e565b975061618e60208a0161604e565b965061619c60408a0161604e565b955060608901359450608089013593506161b98a60a08b01616143565b925061016089018a8111156161cd57600080fd5b60e08a0192506161dd8b82616143565b9150509295985092959890939650565b6000602082840312156161ff57600080fd5b813561ffff8116811461613c57600080fd5b600080600080600060a0868803121561622957600080fd5b6162328661604e565b94506162406020870161604e565b94979496505050506040830135926060810135926080909101359150565b80610300810183101561615457600080fd5b6000806000806000806103a0878903121561628a57600080fd5b6162938761604e565b95506162a16020880161604e565b94506162af6040880161604e565b935060608701359250608087013591506162cc8860a0890161625e565b90509295509295509295565b60008060008060008060006103c0888a0312156162f457600080fd5b6162fd8861604e565b965061630b6020890161604e565b95506163196040890161604e565b94506163276060890161604e565b93506080880135925060a088013591506163448960c08a0161625e565b905092959891949750929550565b60006020828403121561636457600080fd5b61613c8261604e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126163ad57600080fd5b813567ffffffffffffffff808211156163c8576163c861636d565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561640e5761640e61636d565b8160405283815286602085880101111561642757600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461392757600080fd5b600080600080600060a0868803121561648357600080fd5b85359450602086013567ffffffffffffffff8111156164a157600080fd5b6164ad8882890161639c565b945050604086013592506164c36060870161604e565b91506164d160808701616447565b90509295509295909350565b60008083601f8401126164ef57600080fd5b50813567ffffffffffffffff81111561650757600080fd5b6020830191508360208260051b850101111561652257600080fd5b9250929050565b60008060006040848603121561653e57600080fd5b833567ffffffffffffffff81111561655557600080fd5b616561868287016164dd565b9094509250616574905060208501616447565b90509250925092565b60006020828403121561658f57600080fd5b61613c82616447565b6000602082840312156165aa57600080fd5b5035919050565b6000602082840312156165c357600080fd5b813567ffffffffffffffff8111156165da57600080fd5b615e4e8482850161639c565b60008083601f8401126165f857600080fd5b50813567ffffffffffffffff81111561661057600080fd5b60208301915083602082850101111561652257600080fd5b60008060008060008086880361012081121561664357600080fd5b60a081121561665157600080fd5b5086955060a0870135945060c087013567ffffffffffffffff8082111561667757600080fd5b6166838a838b0161639c565b955060e089013591508082111561669957600080fd5b6166a58a838b0161639c565b94506101008901359150808211156166bc57600080fd5b506166c989828a016165e6565b979a9699509497509295939492505050565b600080602083850312156166ee57600080fd5b823567ffffffffffffffff81111561670557600080fd5b616711858286016164dd565b90969095509350505050565b6000806000806080858703121561673357600080fd5b61673c8561604e565b9350602085013592506167516040860161604e565b915061675f6060860161604e565b905092959194509250565b60008060006040848603121561677f57600080fd5b833567ffffffffffffffff81111561679657600080fd5b6167a2868287016165e6565b909790965060209590950135949350505050565b600080604083850312156167c957600080fd5b823591506167d96020840161604e565b90509250929050565b600082516167f48184602087016160bb565b9190910192915050565b60006020828403121561681057600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261685557616855616817565b500690565b600181811c9082168061686e57607f821691505b6020821081036168a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8181168382160190808211156168fd576168fd6168ad565b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126167f457600080fd5b60006080823603121561697957600080fd5b6040516080810167ffffffffffffffff828210818311171561699d5761699d61636d565b8160405284359150808211156169b257600080fd5b506169bf3682860161639c565b825250602083013560208201526169d86040840161604e565b60408201526169e96060840161604e565b606082015292915050565b600067ffffffffffffffff808316818103616a1157616a116168ad565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203616a4c57616a4c6168ad565b5060010190565b67ffffffffffffffff8281168282160390808211156168fd576168fd6168ad565b81810381811115616154576161546168ad565b8082028115828204841417616154576161546168ad565b600082616aad57616aad616817565b500490565b601f821115615c9b57600081815260208120601f850160051c81016020861015616ad95750805b601f850160051c820191505b81811015616af857828155600101616ae5565b505050505050565b815167ffffffffffffffff811115616b1a57616b1a61636d565b616b2e81616b28845461685a565b84616ab2565b602080601f831160018114616b815760008415616b4b5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555616af8565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015616bce57888601518255948401946001909101908401616baf565b5085821015616c0a57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600067ffffffffffffffff808716835280861660208401525060606040830152616c91606083018486616c1a565b9695505050505050565b80820180821115616154576161546168ad565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126167f457600080fd5b600060608236031215616cf457600080fd5b6040516060810167ffffffffffffffff8282108183111715616d1857616d1861636d565b816040528435915080821115616d2d57600080fd5b50616d3a3682860161639c565b82525060208301356020820152616d536040840161604e565b604082015292915050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000616c91606083018486616c1a565b61032081016103008085843782018360005b6001811015616dd5578151835260209283019290910190600101616db6565b5050509392505050565b600060208284031215616df157600080fd5b8151801515811461613c57600080fd5b600067ffffffffffffffff80841680616e1c57616e1c616817565b9216919091049291505056fea26469706673582212200d16bdfde0b321a22abe6c2d141b1b0579321cd6fce8fe87dd8ebcb5f5c5aaca64736f6c63430008140033", + "bytecode": "0x6101406040523480156200001257600080fd5b5060405162007064380380620070648339810160408190526200003591620000a5565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b0391821661010052166101205262000131565b6001600160a01b03811681146200008557600080fd5b50565b80516001600160401b0381168114620000a057600080fd5b919050565b60008060008060008060c08789031215620000bf57600080fd5b8651620000cc816200006f565b6020880151909650620000df816200006f565b6040880151909550620000f2816200006f565b606088015190945062000105816200006f565b9250620001156080880162000088565b91506200012560a0880162000088565b90509295509295509295565b60805160a05160c05160e0516101005161012051616e5e620002066000396000818161083001528181611a880152613ec80152600081816109c30152611a5e01526000818161098901528181612a2d015281816145610152615a90015260008181610b550152818161173801528181611bfb01528181611dcc0152818161263501528181612e06015281816147d901526155df015260008181610c1501528181614f3a0152615392015260008181610a92015281816129fb0152818161333a015281816147ad01526150280152616e5e6000f3fe608060405234801561001057600080fd5b506004361061048d5760003560e01c80638c3d73011161026b578063c754c7ed11610150578063e7a7ed02116100c8578063f14916d611610097578063f851a4401161007c578063f851a44014610c9d578063f8b823e414610cbd578063fe16564f14610cc657600080fd5b8063f14916d614610c77578063f2fde38b14610c8a57600080fd5b8063e7a7ed0214610be0578063e8bf92ed14610c10578063eaeb077b14610c37578063ed6b010414610c4a57600080fd5b8063d2e129f91161011f578063d939b31511610104578063d939b31514610b9d578063dbc1697614610bc5578063e0d1744114610bcd57600080fd5b8063d2e129f914610b77578063d8d1091b14610b8a57600080fd5b8063c754c7ed14610ae2578063c89e42df14610b0e578063cfa8ed4714610b21578063d02103ca14610b5057600080fd5b8063ada8f919116101e3578063b4f77ea9116101b2578063ba58ae3911610197578063ba58ae3914610ab4578063c0cad30214610ac7578063c0ed84e014610ada57600080fd5b8063b4f77ea914610a7a578063b6b0b09714610a8d57600080fd5b8063ada8f919146109ab578063adc879e9146109be578063afd23cbe146109e5578063b4d63f5814610a1357600080fd5b80639aa972a31161023a5780639c9f3dfe1161021f5780639c9f3dfe1461095e578063a066215c14610971578063a3c573eb1461098457600080fd5b80639aa972a3146109385780639b7967601461094b57600080fd5b80638c3d7301146108f75780638da5cb5b146108ff57806396dc3d391461091d57806399f5634e1461093057600080fd5b80634a1a89a711610391578063621dd411116103095780637215541a116102d8578063831c7ead116102bd578063831c7ead1461082b578063837a473814610852578063841b24d7146108c757600080fd5b80637215541a146108045780637fcb36531461081757600080fd5b8063621dd411146107b65780636b8616ce146107c95780636ff512cc146107e9578063715018a6146107fc57600080fd5b8063542028d5116103605780635e9145c9116103455780635e9145c9146107935780635ec91958146107a657806360469169146107ae57600080fd5b8063542028d5146106ea578063574f649e146106f257600080fd5b80634a1a89a7146106845780634a910e6a146106a45780634e487706146106b75780635392c5e0146106ca57600080fd5b80632678224711610424578063383b3be8116103f3578063423fa856116103d8578063423fa856146106285780634560526714610648578063458c04771461067057600080fd5b8063383b3be814610602578063394218e91461061557600080fd5b8063267822471461056b57806329878983146105b05780632b0006fa146105dc5780632c1f816a146105ef57600080fd5b806315064c961161046057806315064c96146105145780631816b7e51461053157806319d8ac6114610544578063220d78991461055857600080fd5b80630a0d9fbe146104925780630eaa86ea146104c9578063107bf28c146104ea57806310a01a72146104ff575b600080fd5b606f546104ab90610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6104dc6104d7366004616066565b610cd9565b6040519081526020016104c0565b6104f26111b1565b6040516104c09190616129565b61051261050d36600461615a565b61123f565b005b606f546105219060ff1681565b60405190151581526020016104c0565b61051261053f3660046161ed565b6117f7565b6073546104ab9067ffffffffffffffff1681565b6104f2610566366004616211565b61190f565b607b5461058b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104c0565b60745461058b9068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6105126105ea366004616270565b611ae6565b6105126105fd3660046162d8565b611cb6565b610521610610366004616352565b611ec4565b610512610623366004616352565b611f1a565b6073546104ab9068010000000000000000900467ffffffffffffffff1681565b6073546104ab90700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546104ab9067ffffffffffffffff1681565b6079546104ab9068010000000000000000900467ffffffffffffffff1681565b6105126106b2366004616352565b61209e565b6105126106c5366004616352565b612151565b6104dc6106d8366004616352565b60756020526000908152604090205481565b6104f26122d5565b6104dc61070036600461646b565b835160209485012060408051808701979097528681019190915260608087019490945260c09290921b7fffffffffffffffff00000000000000000000000000000000000000000000000016608086015290911b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888401528051808403607c018152609c9093019052815191012090565b6105126107a1366004616529565b6122e2565b610512612aec565b6104dc612bec565b6105126107c4366004616270565b612c02565b6104dc6107d7366004616352565b60716020526000908152604090205481565b6105126107f736600461657d565b612f8a565b61051261305f565b610512610812366004616352565b613073565b6074546104ab9067ffffffffffffffff1681565b6104ab7f000000000000000000000000000000000000000000000000000000000000000081565b61089b610860366004616598565b60786020526000908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016104c0565b6079546104ab907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6105126131e3565b60335473ffffffffffffffffffffffffffffffffffffffff1661058b565b61051261092b366004616352565b6132af565b6104dc6132f2565b6105126109463660046162d8565b61344b565b610512610959366004616352565b6134fc565b61051261096c366004616352565b61354b565b61051261097f366004616352565b6136c7565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b6105126109b936600461657d565b6137cd565b6104ab7f000000000000000000000000000000000000000000000000000000000000000081565b606f54610a00906901000000000000000000900461ffff1681565b60405161ffff90911681526020016104c0565b610a54610a21366004616352565b6072602052600090815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016104c0565b610512610a88366004616352565b613891565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b610521610ac2366004616598565b6138a2565b610512610ad53660046165b1565b61392c565b6104ab613944565b607b546104ab9074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b610512610b1c3660046165b1565b613999565b606f5461058b906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b610512610b85366004616628565b613a26565b610512610b983660046166db565b613f6c565b6079546104ab90700100000000000000000000000000000000900467ffffffffffffffff1681565b61051261450e565b610512610bdb36600461671d565b6145e7565b6073546104ab907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b610512610c4536600461676a565b614677565b607b54610521907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b610512610c8536600461657d565b614a6d565b610512610c9836600461657d565b614b3f565b607a5461058b9073ffffffffffffffffffffffffffffffffffffffff1681565b6104dc60705481565b610512610cd43660046167b6565b614bf3565b6000806000610ce6613944565b905067ffffffffffffffff881615610eb35760795467ffffffffffffffff9081169089161115610dc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a4015b60405180910390fd5b67ffffffffffffffff8089166000908152607860205260409020600281015481549094509091898116680100000000000000009092041614610ead576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610dba565b5061104c565b67ffffffffffffffff8716600090815260756020526040902054915081610f82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610dba565b8067ffffffffffffffff168767ffffffffffffffff16111561104c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610dba565b8067ffffffffffffffff168667ffffffffffffffff1611611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610dba565b6000611124888888868961190f565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161115991906167e2565b602060405180830381855afa158015611176573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061119991906167fe565b6111a39190616846565b9a9950505050505050505050565b607780546111be9061685a565b80601f01602080910402602001604051908101604052809291908181526020018280546111ea9061685a565b80156112375780601f1061120c57610100808354040283529160200191611237565b820191906000526020600020905b81548152906001019060200180831161121a57829003601f168201915b505050505081565b611247614c16565b600080611252613944565b905067ffffffffffffffff8a161561141a5760795467ffffffffffffffff908116908b16111561132a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a401610dba565b67ffffffffffffffff808b1660009081526078602052604090206002810154815490945090918b8116680100000000000000009092041614611414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610dba565b506115b3565b67ffffffffffffffff89166000908152607560205260409020549150816114e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610dba565b8067ffffffffffffffff168967ffffffffffffffff1611156115b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610dba565b8067ffffffffffffffff168867ffffffffffffffff161161167c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610dba565b600061168b8a8a8a868b61190f565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8c81169182179092556000908152607560205260409020899055607954919250161561170957607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018990527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b15801561179157600080fd5b505af11580156117a5573d6000803e3d6000fd5b505060405189815233925067ffffffffffffffff8c1691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe9060200160405180910390a35050505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611848576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff16108061186157506103ff8161ffff16115b15611898576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086166000818152607260205260408082205493881682529020546060929115801590611943575081155b1561197a576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806119b1576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119ba846138a2565b6119f0576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611b43576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b51868686868686614c97565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615611bcc57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015611c5457600080fd5b505af1158015611c68573d6000803e3d6000fd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611d13576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d228787878787878761505b565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615611d9d57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015611e2557600080fd5b505af1158015611e39573d6000803e3d6000fd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff82811660009081526078602052604081205490924292611f0892700100000000000000000000000000000000909204811691166168dc565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611f6b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611fb2576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166120215760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610612021576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001611904565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461214557606f5460ff1615612106576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61210f81611ec4565b612145576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61214e81615495565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146121a2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156121e9576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661225457607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610612254576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001611904565b607680546111be9061685a565b606f5460ff161561231f576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461237f576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160008190036123bb576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156123f7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000082048116600081815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b868110156128475760008a8a8381811061245f5761245f616904565b90506020028101906124719190616933565b61247a90616967565b8051805160209091012060608201519192509067ffffffffffffffff16156125f257856124a6816169f4565b965050600081836020015184606001516040516020016124fe93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260719093529120549091508114612587576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff80881660009081526071602052604080822091909155606085015190850151908216911610156125ec576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061272f565b6020820151158015906126b9575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015612693573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b791906167fe565b155b156126f0576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c0101561272f576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080612762575042826040015167ffffffffffffffff16115b15612799576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015197505050808061283f90616a1b565b915050612443565b5061285286856168dc565b60735490945067ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690841611156128bb576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006128c78285616a53565b6128db9067ffffffffffffffff1688616a74565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d861660008181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c84169116179302929092179055909150828116908516146129d157607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b612a233330836070546129e49190616a87565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906156a8565b612a2b61578a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612a9357600080fd5b505af1158015612aa7573d6000803e3d6000fd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612b3d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16612b99576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60006070546064612bfd9190616a87565b905090565b606f5460ff1615612c3f576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581166000908152607260205260409020600101544292612c8c927801000000000000000000000000000000000000000000000000909104811691166168dc565b67ffffffffffffffff161115612cce576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612cdb8686616a53565b67ffffffffffffffff161115612d1d576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d2b868686868686614c97565b612d3484615837565b607954700100000000000000000000000000000000900467ffffffffffffffff16600003612e7c57607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615612dd757607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015612e5f57600080fd5b505af1158015612e73573d6000803e3d6000fd5b50505050612f4c565b612e8461578a565b6079805467ffffffffffffffff16906000612e9e836169f4565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487166000908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001611ca6565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612fdb576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001611904565b613067614c16565b6130716000615a17565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146131db57600061309c613944565b90508067ffffffffffffffff168267ffffffffffffffff16116130eb576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000090910481169083161180613131575067ffffffffffffffff80831660009081526072602052604090206001015416155b15613168576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff80831660009081526072602052604090206001015442916131979162093a8091166168dc565b67ffffffffffffffff1611156131d9576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61214e615a8e565b607b5473ffffffffffffffffffffffffffffffffffffffff163314613234576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6132b7614c16565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015613381573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133a591906167fe565b905060006133b1613944565b60735467ffffffffffffffff6801000000000000000082048116916134099170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416616a53565b61341391906168dc565b61341d9190616a53565b67ffffffffffffffff1690508060000361343a5760009250505090565b6134448183616a9e565b9250505090565b606f5460ff1615613488576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134978787878787878761505b565b67ffffffffffffffff84166000908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16134f3615a8e565b50505050505050565b613504614c16565b6073805467ffffffffffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461359c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156135e3576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661364a5760795467ffffffffffffffff70010000000000000000000000000000000090910481169082161061364a576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001611904565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613718576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff16111561375f576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001611904565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461381e576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001611904565b613899614c16565b61214e81615837565b600067ffffffff0000000167ffffffffffffffff83161080156138da575067ffffffff00000001604083901c67ffffffffffffffff16105b80156138fb575067ffffffff00000001608083901c67ffffffffffffffff16105b8015613912575067ffffffff0000000160c083901c105b1561391f57506001919050565b506000919050565b919050565b613934614c16565b60776139408282616b00565b5050565b60795460009067ffffffffffffffff1615613988575060795467ffffffffffffffff9081166000908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146139ea576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60766139f68282616b00565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516119049190616129565b600054610100900460ff1615808015613a465750600054600160ff909116105b80613a605750303b158015613a60575060005460ff166001145b613aec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610dba565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015613b4a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b613b57602088018861657d565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055613bac604088016020890161657d565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055613c11608088016060890161657d565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790556000805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076613c9c8682616b00565b506077613ca98582616b00565b5062093a80613cbe6060890160408a01616352565b67ffffffffffffffff161115613d00576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d106060880160408901616352565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80613d7260a0890160808a01616352565b67ffffffffffffffff161115613db4576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613dc460a0880160808901616352565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613ea3615b16565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd660007f00000000000000000000000000000000000000000000000000000000000000008585604051613ef99493929190616c63565b60405180910390a180156134f357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613fc9576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614006576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003614042576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561407e576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff780100000000000000000000000000000000000000000000000082048116916140c9918491700100000000000000000000000000000000900416616c9b565b1115614101576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000008204811660008181526072602052604081205491937001000000000000000000000000000000009004909216915b848110156143ab57600087878381811061416157614161616904565b90506020028101906141739190616cae565b61417c90616ce2565b905083614188816169f4565b825180516020918201208185015160408087015190519499509194506000936141ea9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260719093529120549091508114614273576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260716020526040812055614298600189616a74565b84036143075742607b60149054906101000a900467ffffffffffffffff1684604001516142c591906168dc565b67ffffffffffffffff161115614307576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806143a390616a1b565b915050614145565b506143b684846168dc565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589166000818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461455f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156145c757600080fd5b505af11580156145db573d6000803e3d6000fd5b50505050613071615bb6565b6145ef614c16565b6040805160608101825293845267ffffffffffffffff92831660208086019182529284168583019081529584166000908152607290935291209251835551600190920180549351821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169290911691909117919091179055565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16156146d4576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614711576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061471b612bec565b905081811115614757576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115614793576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6147d573ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846156a8565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614842573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061486691906167fe565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff169060186148a0836169f4565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505084846040516148d7929190616d5e565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1660009081526071909352912055323303614a0757607354604080518381523360208201526060918101829052600091810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2614a66565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051614a5d9493929190616d6e565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314614abe576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001611904565b614b47614c16565b73ffffffffffffffffffffffffffffffffffffffff8116614bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610dba565b61214e81615a17565b614bfb614c16565b67ffffffffffffffff16600090815260756020526040902055565b60335473ffffffffffffffffffffffffffffffffffffffff163314613071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dba565b600080614ca2613944565b905067ffffffffffffffff881615614d725760795467ffffffffffffffff9081169089161115614cfe576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089166000908152607860205260409020600281015481549094509091898116680100000000000000009092041614614d6c576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614e13565b67ffffffffffffffff8716600090815260756020526040902054915081614dc5576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115614e13576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611614e60576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000614e6f888888868961190f565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051614ea491906167e2565b602060405180830381855afa158015614ec1573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190614ee491906167fe565b614eee9190616846565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91614f7091899190600401616da4565b602060405180830381865afa158015614f8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614fb19190616ddf565b614fe7576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61504f33614ff5858b616a53565b67ffffffffffffffff166150076132f2565b6150119190616a87565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190615c45565b50505050505050505050565b600067ffffffffffffffff8816156151295760795467ffffffffffffffff90811690891611156150b7576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088166000908152607860205260409020600281015481549092888116680100000000000000009092041614615123576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506151c5565b5067ffffffffffffffff85166000908152607560205260409020548061517b576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff90811690871611156151c5576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff90811690881611806151f757508767ffffffffffffffff168767ffffffffffffffff1611155b8061521e575060795467ffffffffffffffff68010000000000000000909104811690881611155b15615255576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781166000908152607860205260409020546801000000000000000090048116908616146152b8576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006152c7878787858861190f565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516152fc91906167e2565b602060405180830381855afa158015615319573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061533c91906167fe565b6153469190616846565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916153c891889190600401616da4565b602060405180830381865afa1580156153e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906154099190616ddf565b61543f576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff891660009081526078602052604090206002015485900361504f576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff6801000000000000000090910481169082161115806154cf575060795467ffffffffffffffff908116908216115b15615506576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff818116600081815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b15801561563857600080fd5b505af115801561564c573d6000803e3d6000fd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161569b91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526157849085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152615ca0565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115613071576079546000906157d39068010000000000000000900467ffffffffffffffff1660016168dc565b90506157de81611ec4565b1561214e5760795460009060029061580190849067ffffffffffffffff16616a53565b61580b9190616e01565b61581590836168dc565b905061582081611ec4565b1561582e5761394081615495565b61394082615495565b6000615841613944565b9050816000806158518484616a53565b606f5467ffffffffffffffff91821692506000916158759161010090041642616a74565b90505b8467ffffffffffffffff168467ffffffffffffffff16146159005767ffffffffffffffff808516600090815260726020526040902060018101549091168210156158de57600181015468010000000000000000900467ffffffffffffffff1694506158fa565b6158e88686616a53565b67ffffffffffffffff16935050615900565b50615878565b600061590c8484616a74565b90508381101561596357808403600c8111615927578061592a565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a607054028161595957615959616817565b04607055506159d3565b838103600c81116159745780615977565b600c5b90506000816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a764000002816159ae576159ae616817565b04905080607054670de0b6b3a764000002816159cc576159cc616817565b0460705550505b683635c9adc5dea0000060705411156159f857683635c9adc5dea000006070556134f3565b633b9aca0060705410156134f357633b9aca0060705550505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b158015615af657600080fd5b505af1158015615b0a573d6000803e3d6000fd5b50505050613071615dac565b600054610100900460ff16615bad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610dba565b61307133615a17565b606f5460ff16615bf2576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052615c9b9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401615702565b505050565b6000615d02826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615e3f9092919063ffffffff16565b805190915015615c9b5780806020019051810190615d209190616ddf565b615c9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610dba565b606f5460ff1615615de9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b6060615e4e8484600085615e56565b949350505050565b606082471015615ee8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610dba565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051615f1191906167e2565b60006040518083038185875af1925050503d8060008114615f4e576040519150601f19603f3d011682016040523d82523d6000602084013e615f53565b606091505b5091509150615f6487838387615f6f565b979650505050505050565b60608315616005578251600003615ffe5773ffffffffffffffffffffffffffffffffffffffff85163b615ffe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610dba565b5081615e4e565b615e4e838381511561601a5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dba9190616129565b803567ffffffffffffffff8116811461392757600080fd5b600080600080600060a0868803121561607e57600080fd5b6160878661604e565b94506160956020870161604e565b93506160a36040870161604e565b94979396509394606081013594506080013592915050565b60005b838110156160d65781810151838201526020016160be565b50506000910152565b600081518084526160f78160208601602086016160bb565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061613c60208301846160df565b9392505050565b806040810183101561615457600080fd5b92915050565b6000806000806000806000806101a0898b03121561617757600080fd5b6161808961604e565b975061618e60208a0161604e565b965061619c60408a0161604e565b955060608901359450608089013593506161b98a60a08b01616143565b925061016089018a8111156161cd57600080fd5b60e08a0192506161dd8b82616143565b9150509295985092959890939650565b6000602082840312156161ff57600080fd5b813561ffff8116811461613c57600080fd5b600080600080600060a0868803121561622957600080fd5b6162328661604e565b94506162406020870161604e565b94979496505050506040830135926060810135926080909101359150565b80610300810183101561615457600080fd5b6000806000806000806103a0878903121561628a57600080fd5b6162938761604e565b95506162a16020880161604e565b94506162af6040880161604e565b935060608701359250608087013591506162cc8860a0890161625e565b90509295509295509295565b60008060008060008060006103c0888a0312156162f457600080fd5b6162fd8861604e565b965061630b6020890161604e565b95506163196040890161604e565b94506163276060890161604e565b93506080880135925060a088013591506163448960c08a0161625e565b905092959891949750929550565b60006020828403121561636457600080fd5b61613c8261604e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126163ad57600080fd5b813567ffffffffffffffff808211156163c8576163c861636d565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561640e5761640e61636d565b8160405283815286602085880101111561642757600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461392757600080fd5b600080600080600060a0868803121561648357600080fd5b85359450602086013567ffffffffffffffff8111156164a157600080fd5b6164ad8882890161639c565b945050604086013592506164c36060870161604e565b91506164d160808701616447565b90509295509295909350565b60008083601f8401126164ef57600080fd5b50813567ffffffffffffffff81111561650757600080fd5b6020830191508360208260051b850101111561652257600080fd5b9250929050565b60008060006040848603121561653e57600080fd5b833567ffffffffffffffff81111561655557600080fd5b616561868287016164dd565b9094509250616574905060208501616447565b90509250925092565b60006020828403121561658f57600080fd5b61613c82616447565b6000602082840312156165aa57600080fd5b5035919050565b6000602082840312156165c357600080fd5b813567ffffffffffffffff8111156165da57600080fd5b615e4e8482850161639c565b60008083601f8401126165f857600080fd5b50813567ffffffffffffffff81111561661057600080fd5b60208301915083602082850101111561652257600080fd5b60008060008060008086880361012081121561664357600080fd5b60a081121561665157600080fd5b5086955060a0870135945060c087013567ffffffffffffffff8082111561667757600080fd5b6166838a838b0161639c565b955060e089013591508082111561669957600080fd5b6166a58a838b0161639c565b94506101008901359150808211156166bc57600080fd5b506166c989828a016165e6565b979a9699509497509295939492505050565b600080602083850312156166ee57600080fd5b823567ffffffffffffffff81111561670557600080fd5b616711858286016164dd565b90969095509350505050565b6000806000806080858703121561673357600080fd5b61673c8561604e565b9350602085013592506167516040860161604e565b915061675f6060860161604e565b905092959194509250565b60008060006040848603121561677f57600080fd5b833567ffffffffffffffff81111561679657600080fd5b6167a2868287016165e6565b909790965060209590950135949350505050565b600080604083850312156167c957600080fd5b823591506167d96020840161604e565b90509250929050565b600082516167f48184602087016160bb565b9190910192915050565b60006020828403121561681057600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261685557616855616817565b500690565b600181811c9082168061686e57607f821691505b6020821081036168a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8181168382160190808211156168fd576168fd6168ad565b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126167f457600080fd5b60006080823603121561697957600080fd5b6040516080810167ffffffffffffffff828210818311171561699d5761699d61636d565b8160405284359150808211156169b257600080fd5b506169bf3682860161639c565b825250602083013560208201526169d86040840161604e565b60408201526169e96060840161604e565b606082015292915050565b600067ffffffffffffffff808316818103616a1157616a116168ad565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203616a4c57616a4c6168ad565b5060010190565b67ffffffffffffffff8281168282160390808211156168fd576168fd6168ad565b81810381811115616154576161546168ad565b8082028115828204841417616154576161546168ad565b600082616aad57616aad616817565b500490565b601f821115615c9b57600081815260208120601f850160051c81016020861015616ad95750805b601f850160051c820191505b81811015616af857828155600101616ae5565b505050505050565b815167ffffffffffffffff811115616b1a57616b1a61636d565b616b2e81616b28845461685a565b84616ab2565b602080601f831160018114616b815760008415616b4b5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555616af8565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015616bce57888601518255948401946001909101908401616baf565b5085821015616c0a57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600067ffffffffffffffff808716835280861660208401525060606040830152616c91606083018486616c1a565b9695505050505050565b80820180821115616154576161546168ad565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126167f457600080fd5b600060608236031215616cf457600080fd5b6040516060810167ffffffffffffffff8282108183111715616d1857616d1861636d565b816040528435915080821115616d2d57600080fd5b50616d3a3682860161639c565b82525060208301356020820152616d536040840161604e565b604082015292915050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000616c91606083018486616c1a565b61032081016103008085843782018360005b6001811015616dd5578151835260209283019290910190600101616db6565b5050509392505050565b600060208284031215616df157600080fd5b8151801515811461613c57600080fd5b600067ffffffffffffffff80841680616e1c57616e1c616817565b9216919091049291505056fea2646970667358221220686527cac84d98a7b3630b988cb7efce8cacdf200640ffe3e0ae6e4b6af7579264736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061048d5760003560e01c80638c3d73011161026b578063c754c7ed11610150578063e7a7ed02116100c8578063f14916d611610097578063f851a4401161007c578063f851a44014610c9d578063f8b823e414610cbd578063fe16564f14610cc657600080fd5b8063f14916d614610c77578063f2fde38b14610c8a57600080fd5b8063e7a7ed0214610be0578063e8bf92ed14610c10578063eaeb077b14610c37578063ed6b010414610c4a57600080fd5b8063d2e129f91161011f578063d939b31511610104578063d939b31514610b9d578063dbc1697614610bc5578063e0d1744114610bcd57600080fd5b8063d2e129f914610b77578063d8d1091b14610b8a57600080fd5b8063c754c7ed14610ae2578063c89e42df14610b0e578063cfa8ed4714610b21578063d02103ca14610b5057600080fd5b8063ada8f919116101e3578063b4f77ea9116101b2578063ba58ae3911610197578063ba58ae3914610ab4578063c0cad30214610ac7578063c0ed84e014610ada57600080fd5b8063b4f77ea914610a7a578063b6b0b09714610a8d57600080fd5b8063ada8f919146109ab578063adc879e9146109be578063afd23cbe146109e5578063b4d63f5814610a1357600080fd5b80639aa972a31161023a5780639c9f3dfe1161021f5780639c9f3dfe1461095e578063a066215c14610971578063a3c573eb1461098457600080fd5b80639aa972a3146109385780639b7967601461094b57600080fd5b80638c3d7301146108f75780638da5cb5b146108ff57806396dc3d391461091d57806399f5634e1461093057600080fd5b80634a1a89a711610391578063621dd411116103095780637215541a116102d8578063831c7ead116102bd578063831c7ead1461082b578063837a473814610852578063841b24d7146108c757600080fd5b80637215541a146108045780637fcb36531461081757600080fd5b8063621dd411146107b65780636b8616ce146107c95780636ff512cc146107e9578063715018a6146107fc57600080fd5b8063542028d5116103605780635e9145c9116103455780635e9145c9146107935780635ec91958146107a657806360469169146107ae57600080fd5b8063542028d5146106ea578063574f649e146106f257600080fd5b80634a1a89a7146106845780634a910e6a146106a45780634e487706146106b75780635392c5e0146106ca57600080fd5b80632678224711610424578063383b3be8116103f3578063423fa856116103d8578063423fa856146106285780634560526714610648578063458c04771461067057600080fd5b8063383b3be814610602578063394218e91461061557600080fd5b8063267822471461056b57806329878983146105b05780632b0006fa146105dc5780632c1f816a146105ef57600080fd5b806315064c961161046057806315064c96146105145780631816b7e51461053157806319d8ac6114610544578063220d78991461055857600080fd5b80630a0d9fbe146104925780630eaa86ea146104c9578063107bf28c146104ea57806310a01a72146104ff575b600080fd5b606f546104ab90610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6104dc6104d7366004616066565b610cd9565b6040519081526020016104c0565b6104f26111b1565b6040516104c09190616129565b61051261050d36600461615a565b61123f565b005b606f546105219060ff1681565b60405190151581526020016104c0565b61051261053f3660046161ed565b6117f7565b6073546104ab9067ffffffffffffffff1681565b6104f2610566366004616211565b61190f565b607b5461058b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104c0565b60745461058b9068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6105126105ea366004616270565b611ae6565b6105126105fd3660046162d8565b611cb6565b610521610610366004616352565b611ec4565b610512610623366004616352565b611f1a565b6073546104ab9068010000000000000000900467ffffffffffffffff1681565b6073546104ab90700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546104ab9067ffffffffffffffff1681565b6079546104ab9068010000000000000000900467ffffffffffffffff1681565b6105126106b2366004616352565b61209e565b6105126106c5366004616352565b612151565b6104dc6106d8366004616352565b60756020526000908152604090205481565b6104f26122d5565b6104dc61070036600461646b565b835160209485012060408051808701979097528681019190915260608087019490945260c09290921b7fffffffffffffffff00000000000000000000000000000000000000000000000016608086015290911b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888401528051808403607c018152609c9093019052815191012090565b6105126107a1366004616529565b6122e2565b610512612aec565b6104dc612bec565b6105126107c4366004616270565b612c02565b6104dc6107d7366004616352565b60716020526000908152604090205481565b6105126107f736600461657d565b612f8a565b61051261305f565b610512610812366004616352565b613073565b6074546104ab9067ffffffffffffffff1681565b6104ab7f000000000000000000000000000000000000000000000000000000000000000081565b61089b610860366004616598565b60786020526000908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016104c0565b6079546104ab907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6105126131e3565b60335473ffffffffffffffffffffffffffffffffffffffff1661058b565b61051261092b366004616352565b6132af565b6104dc6132f2565b6105126109463660046162d8565b61344b565b610512610959366004616352565b6134fc565b61051261096c366004616352565b61354b565b61051261097f366004616352565b6136c7565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b6105126109b936600461657d565b6137cd565b6104ab7f000000000000000000000000000000000000000000000000000000000000000081565b606f54610a00906901000000000000000000900461ffff1681565b60405161ffff90911681526020016104c0565b610a54610a21366004616352565b6072602052600090815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016104c0565b610512610a88366004616352565b613891565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b610521610ac2366004616598565b6138a2565b610512610ad53660046165b1565b61392c565b6104ab613944565b607b546104ab9074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b610512610b1c3660046165b1565b613999565b606f5461058b906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b610512610b85366004616628565b613a26565b610512610b983660046166db565b613f6c565b6079546104ab90700100000000000000000000000000000000900467ffffffffffffffff1681565b61051261450e565b610512610bdb36600461671d565b6145e7565b6073546104ab907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61058b7f000000000000000000000000000000000000000000000000000000000000000081565b610512610c4536600461676a565b614677565b607b54610521907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b610512610c8536600461657d565b614a6d565b610512610c9836600461657d565b614b3f565b607a5461058b9073ffffffffffffffffffffffffffffffffffffffff1681565b6104dc60705481565b610512610cd43660046167b6565b614bf3565b6000806000610ce6613944565b905067ffffffffffffffff881615610eb35760795467ffffffffffffffff9081169089161115610dc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a4015b60405180910390fd5b67ffffffffffffffff8089166000908152607860205260409020600281015481549094509091898116680100000000000000009092041614610ead576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610dba565b5061104c565b67ffffffffffffffff8716600090815260756020526040902054915081610f82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610dba565b8067ffffffffffffffff168767ffffffffffffffff16111561104c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610dba565b8067ffffffffffffffff168667ffffffffffffffff1611611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610dba565b6000611124888888868961190f565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161115991906167e2565b602060405180830381855afa158015611176573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061119991906167fe565b6111a39190616846565b9a9950505050505050505050565b607780546111be9061685a565b80601f01602080910402602001604051908101604052809291908181526020018280546111ea9061685a565b80156112375780601f1061120c57610100808354040283529160200191611237565b820191906000526020600020905b81548152906001019060200180831161121a57829003601f168201915b505050505081565b611247614c16565b600080611252613944565b905067ffffffffffffffff8a161561141a5760795467ffffffffffffffff908116908b16111561132a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a401610dba565b67ffffffffffffffff808b1660009081526078602052604090206002810154815490945090918b8116680100000000000000009092041614611414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610dba565b506115b3565b67ffffffffffffffff89166000908152607560205260409020549150816114e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610dba565b8067ffffffffffffffff168967ffffffffffffffff1611156115b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610dba565b8067ffffffffffffffff168867ffffffffffffffff161161167c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610dba565b600061168b8a8a8a868b61190f565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8c81169182179092556000908152607560205260409020899055607954919250161561170957607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018990527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b15801561179157600080fd5b505af11580156117a5573d6000803e3d6000fd5b505060405189815233925067ffffffffffffffff8c1691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe9060200160405180910390a35050505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611848576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff16108061186157506103ff8161ffff16115b15611898576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086166000818152607260205260408082205493881682529020546060929115801590611943575081155b1561197a576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806119b1576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119ba846138a2565b6119f0576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611b43576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b51868686868686614c97565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615611bcc57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015611c5457600080fd5b505af1158015611c68573d6000803e3d6000fd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611d13576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d228787878787878761505b565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615611d9d57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015611e2557600080fd5b505af1158015611e39573d6000803e3d6000fd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff82811660009081526078602052604081205490924292611f0892700100000000000000000000000000000000909204811691166168dc565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611f6b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611fb2576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166120215760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610612021576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001611904565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461214557606f5460ff1615612106576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61210f81611ec4565b612145576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61214e81615495565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146121a2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156121e9576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661225457607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610612254576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001611904565b607680546111be9061685a565b606f5460ff161561231f576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461237f576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160008190036123bb576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156123f7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000082048116600081815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b868110156128475760008a8a8381811061245f5761245f616904565b90506020028101906124719190616933565b61247a90616967565b8051805160209091012060608201519192509067ffffffffffffffff16156125f257856124a6816169f4565b965050600081836020015184606001516040516020016124fe93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260719093529120549091508114612587576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff80881660009081526071602052604080822091909155606085015190850151908216911610156125ec576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061272f565b6020820151158015906126b9575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015612693573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b791906167fe565b155b156126f0576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c0101561272f576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080612762575042826040015167ffffffffffffffff16115b15612799576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015197505050808061283f90616a1b565b915050612443565b5061285286856168dc565b60735490945067ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690841611156128bb576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006128c78285616a53565b6128db9067ffffffffffffffff1688616a74565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d861660008181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c84169116179302929092179055909150828116908516146129d157607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b612a233330836070546129e49190616a87565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906156a8565b612a2b61578a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612a9357600080fd5b505af1158015612aa7573d6000803e3d6000fd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce9150600090a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612b3d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16612b99576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60006070546064612bfd9190616a87565b905090565b606f5460ff1615612c3f576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581166000908152607260205260409020600101544292612c8c927801000000000000000000000000000000000000000000000000909104811691166168dc565b67ffffffffffffffff161115612cce576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612cdb8686616a53565b67ffffffffffffffff161115612d1d576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d2b868686868686614c97565b612d3484615837565b607954700100000000000000000000000000000000900467ffffffffffffffff16600003612e7c57607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691821790925560009081526075602052604090208390556079541615612dd757607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b158015612e5f57600080fd5b505af1158015612e73573d6000803e3d6000fd5b50505050612f4c565b612e8461578a565b6079805467ffffffffffffffff16906000612e9e836169f4565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487166000908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001611ca6565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612fdb576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001611904565b613067614c16565b6130716000615a17565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146131db57600061309c613944565b90508067ffffffffffffffff168267ffffffffffffffff16116130eb576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff6801000000000000000090910481169083161180613131575067ffffffffffffffff80831660009081526072602052604090206001015416155b15613168576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff80831660009081526072602052604090206001015442916131979162093a8091166168dc565b67ffffffffffffffff1611156131d9576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61214e615a8e565b607b5473ffffffffffffffffffffffffffffffffffffffff163314613234576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6132b7614c16565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015613381573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133a591906167fe565b905060006133b1613944565b60735467ffffffffffffffff6801000000000000000082048116916134099170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416616a53565b61341391906168dc565b61341d9190616a53565b67ffffffffffffffff1690508060000361343a5760009250505090565b6134448183616a9e565b9250505090565b606f5460ff1615613488576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134978787878787878761505b565b67ffffffffffffffff84166000908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16134f3615a8e565b50505050505050565b613504614c16565b6073805467ffffffffffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461359c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156135e3576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661364a5760795467ffffffffffffffff70010000000000000000000000000000000090910481169082161061364a576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001611904565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613718576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff16111561375f576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001611904565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461381e576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001611904565b613899614c16565b61214e81615837565b600067ffffffff0000000167ffffffffffffffff83161080156138da575067ffffffff00000001604083901c67ffffffffffffffff16105b80156138fb575067ffffffff00000001608083901c67ffffffffffffffff16105b8015613912575067ffffffff0000000160c083901c105b1561391f57506001919050565b506000919050565b919050565b613934614c16565b60776139408282616b00565b5050565b60795460009067ffffffffffffffff1615613988575060795467ffffffffffffffff9081166000908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146139ea576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60766139f68282616b00565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516119049190616129565b600054610100900460ff1615808015613a465750600054600160ff909116105b80613a605750303b158015613a60575060005460ff166001145b613aec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610dba565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015613b4a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b613b57602088018861657d565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055613bac604088016020890161657d565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055613c11608088016060890161657d565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790556000805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076613c9c8682616b00565b506077613ca98582616b00565b5062093a80613cbe6060890160408a01616352565b67ffffffffffffffff161115613d00576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d106060880160408901616352565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80613d7260a0890160808a01616352565b67ffffffffffffffff161115613db4576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613dc460a0880160808901616352565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613ea3615b16565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd660007f00000000000000000000000000000000000000000000000000000000000000008585604051613ef99493929190616c63565b60405180910390a180156134f357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613fc9576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614006576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003614042576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561407e576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff780100000000000000000000000000000000000000000000000082048116916140c9918491700100000000000000000000000000000000900416616c9b565b1115614101576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000008204811660008181526072602052604081205491937001000000000000000000000000000000009004909216915b848110156143ab57600087878381811061416157614161616904565b90506020028101906141739190616cae565b61417c90616ce2565b905083614188816169f4565b825180516020918201208185015160408087015190519499509194506000936141ea9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260719093529120549091508114614273576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260716020526040812055614298600189616a74565b84036143075742607b60149054906101000a900467ffffffffffffffff1684604001516142c591906168dc565b67ffffffffffffffff161115614307576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806143a390616a1b565b915050614145565b506143b684846168dc565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589166000818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461455f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156145c757600080fd5b505af11580156145db573d6000803e3d6000fd5b50505050613071615bb6565b6145ef614c16565b6040805160608101825293845267ffffffffffffffff92831660208086019182529284168583019081529584166000908152607290935291209251835551600190920180549351821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169290911691909117919091179055565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16156146d4576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614711576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061471b612bec565b905081811115614757576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115614793576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6147d573ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846156a8565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614842573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061486691906167fe565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff169060186148a0836169f4565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505084846040516148d7929190616d5e565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1660009081526071909352912055323303614a0757607354604080518381523360208201526060918101829052600091810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2614a66565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051614a5d9493929190616d6e565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314614abe576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001611904565b614b47614c16565b73ffffffffffffffffffffffffffffffffffffffff8116614bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610dba565b61214e81615a17565b614bfb614c16565b67ffffffffffffffff16600090815260756020526040902055565b60335473ffffffffffffffffffffffffffffffffffffffff163314613071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610dba565b600080614ca2613944565b905067ffffffffffffffff881615614d725760795467ffffffffffffffff9081169089161115614cfe576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089166000908152607860205260409020600281015481549094509091898116680100000000000000009092041614614d6c576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614e13565b67ffffffffffffffff8716600090815260756020526040902054915081614dc5576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115614e13576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611614e60576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000614e6f888888868961190f565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051614ea491906167e2565b602060405180830381855afa158015614ec1573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190614ee491906167fe565b614eee9190616846565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91614f7091899190600401616da4565b602060405180830381865afa158015614f8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614fb19190616ddf565b614fe7576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61504f33614ff5858b616a53565b67ffffffffffffffff166150076132f2565b6150119190616a87565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190615c45565b50505050505050505050565b600067ffffffffffffffff8816156151295760795467ffffffffffffffff90811690891611156150b7576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088166000908152607860205260409020600281015481549092888116680100000000000000009092041614615123576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506151c5565b5067ffffffffffffffff85166000908152607560205260409020548061517b576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff90811690871611156151c5576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff90811690881611806151f757508767ffffffffffffffff168767ffffffffffffffff1611155b8061521e575060795467ffffffffffffffff68010000000000000000909104811690881611155b15615255576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781166000908152607860205260409020546801000000000000000090048116908616146152b8576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006152c7878787858861190f565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516152fc91906167e2565b602060405180830381855afa158015615319573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061533c91906167fe565b6153469190616846565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916153c891889190600401616da4565b602060405180830381865afa1580156153e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906154099190616ddf565b61543f576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff891660009081526078602052604090206002015485900361504f576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff6801000000000000000090910481169082161115806154cf575060795467ffffffffffffffff908116908216115b15615506576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff818116600081815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d90602401600060405180830381600087803b15801561563857600080fd5b505af115801561564c573d6000803e3d6000fd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161569b91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526157849085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152615ca0565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115613071576079546000906157d39068010000000000000000900467ffffffffffffffff1660016168dc565b90506157de81611ec4565b1561214e5760795460009060029061580190849067ffffffffffffffff16616a53565b61580b9190616e01565b61581590836168dc565b905061582081611ec4565b1561582e5761394081615495565b61394082615495565b6000615841613944565b9050816000806158518484616a53565b606f5467ffffffffffffffff91821692506000916158759161010090041642616a74565b90505b8467ffffffffffffffff168467ffffffffffffffff16146159005767ffffffffffffffff808516600090815260726020526040902060018101549091168210156158de57600181015468010000000000000000900467ffffffffffffffff1694506158fa565b6158e88686616a53565b67ffffffffffffffff16935050615900565b50615878565b600061590c8484616a74565b90508381101561596357808403600c8111615927578061592a565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a607054028161595957615959616817565b04607055506159d3565b838103600c81116159745780615977565b600c5b90506000816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a764000002816159ae576159ae616817565b04905080607054670de0b6b3a764000002816159cc576159cc616817565b0460705550505b683635c9adc5dea0000060705411156159f857683635c9adc5dea000006070556134f3565b633b9aca0060705410156134f357633b9aca0060705550505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b158015615af657600080fd5b505af1158015615b0a573d6000803e3d6000fd5b50505050613071615dac565b600054610100900460ff16615bad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610dba565b61307133615a17565b606f5460ff16615bf2576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052615c9b9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401615702565b505050565b6000615d02826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615e3f9092919063ffffffff16565b805190915015615c9b5780806020019051810190615d209190616ddf565b615c9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610dba565b606f5460ff1615615de9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b6060615e4e8484600085615e56565b949350505050565b606082471015615ee8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610dba565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051615f1191906167e2565b60006040518083038185875af1925050503d8060008114615f4e576040519150601f19603f3d011682016040523d82523d6000602084013e615f53565b606091505b5091509150615f6487838387615f6f565b979650505050505050565b60608315616005578251600003615ffe5773ffffffffffffffffffffffffffffffffffffffff85163b615ffe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610dba565b5081615e4e565b615e4e838381511561601a5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dba9190616129565b803567ffffffffffffffff8116811461392757600080fd5b600080600080600060a0868803121561607e57600080fd5b6160878661604e565b94506160956020870161604e565b93506160a36040870161604e565b94979396509394606081013594506080013592915050565b60005b838110156160d65781810151838201526020016160be565b50506000910152565b600081518084526160f78160208601602086016160bb565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061613c60208301846160df565b9392505050565b806040810183101561615457600080fd5b92915050565b6000806000806000806000806101a0898b03121561617757600080fd5b6161808961604e565b975061618e60208a0161604e565b965061619c60408a0161604e565b955060608901359450608089013593506161b98a60a08b01616143565b925061016089018a8111156161cd57600080fd5b60e08a0192506161dd8b82616143565b9150509295985092959890939650565b6000602082840312156161ff57600080fd5b813561ffff8116811461613c57600080fd5b600080600080600060a0868803121561622957600080fd5b6162328661604e565b94506162406020870161604e565b94979496505050506040830135926060810135926080909101359150565b80610300810183101561615457600080fd5b6000806000806000806103a0878903121561628a57600080fd5b6162938761604e565b95506162a16020880161604e565b94506162af6040880161604e565b935060608701359250608087013591506162cc8860a0890161625e565b90509295509295509295565b60008060008060008060006103c0888a0312156162f457600080fd5b6162fd8861604e565b965061630b6020890161604e565b95506163196040890161604e565b94506163276060890161604e565b93506080880135925060a088013591506163448960c08a0161625e565b905092959891949750929550565b60006020828403121561636457600080fd5b61613c8261604e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126163ad57600080fd5b813567ffffffffffffffff808211156163c8576163c861636d565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561640e5761640e61636d565b8160405283815286602085880101111561642757600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461392757600080fd5b600080600080600060a0868803121561648357600080fd5b85359450602086013567ffffffffffffffff8111156164a157600080fd5b6164ad8882890161639c565b945050604086013592506164c36060870161604e565b91506164d160808701616447565b90509295509295909350565b60008083601f8401126164ef57600080fd5b50813567ffffffffffffffff81111561650757600080fd5b6020830191508360208260051b850101111561652257600080fd5b9250929050565b60008060006040848603121561653e57600080fd5b833567ffffffffffffffff81111561655557600080fd5b616561868287016164dd565b9094509250616574905060208501616447565b90509250925092565b60006020828403121561658f57600080fd5b61613c82616447565b6000602082840312156165aa57600080fd5b5035919050565b6000602082840312156165c357600080fd5b813567ffffffffffffffff8111156165da57600080fd5b615e4e8482850161639c565b60008083601f8401126165f857600080fd5b50813567ffffffffffffffff81111561661057600080fd5b60208301915083602082850101111561652257600080fd5b60008060008060008086880361012081121561664357600080fd5b60a081121561665157600080fd5b5086955060a0870135945060c087013567ffffffffffffffff8082111561667757600080fd5b6166838a838b0161639c565b955060e089013591508082111561669957600080fd5b6166a58a838b0161639c565b94506101008901359150808211156166bc57600080fd5b506166c989828a016165e6565b979a9699509497509295939492505050565b600080602083850312156166ee57600080fd5b823567ffffffffffffffff81111561670557600080fd5b616711858286016164dd565b90969095509350505050565b6000806000806080858703121561673357600080fd5b61673c8561604e565b9350602085013592506167516040860161604e565b915061675f6060860161604e565b905092959194509250565b60008060006040848603121561677f57600080fd5b833567ffffffffffffffff81111561679657600080fd5b6167a2868287016165e6565b909790965060209590950135949350505050565b600080604083850312156167c957600080fd5b823591506167d96020840161604e565b90509250929050565b600082516167f48184602087016160bb565b9190910192915050565b60006020828403121561681057600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261685557616855616817565b500690565b600181811c9082168061686e57607f821691505b6020821081036168a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8181168382160190808211156168fd576168fd6168ad565b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126167f457600080fd5b60006080823603121561697957600080fd5b6040516080810167ffffffffffffffff828210818311171561699d5761699d61636d565b8160405284359150808211156169b257600080fd5b506169bf3682860161639c565b825250602083013560208201526169d86040840161604e565b60408201526169e96060840161604e565b606082015292915050565b600067ffffffffffffffff808316818103616a1157616a116168ad565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203616a4c57616a4c6168ad565b5060010190565b67ffffffffffffffff8281168282160390808211156168fd576168fd6168ad565b81810381811115616154576161546168ad565b8082028115828204841417616154576161546168ad565b600082616aad57616aad616817565b500490565b601f821115615c9b57600081815260208120601f850160051c81016020861015616ad95750805b601f850160051c820191505b81811015616af857828155600101616ae5565b505050505050565b815167ffffffffffffffff811115616b1a57616b1a61636d565b616b2e81616b28845461685a565b84616ab2565b602080601f831160018114616b815760008415616b4b5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555616af8565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015616bce57888601518255948401946001909101908401616baf565b5085821015616c0a57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600067ffffffffffffffff808716835280861660208401525060606040830152616c91606083018486616c1a565b9695505050505050565b80820180821115616154576161546168ad565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126167f457600080fd5b600060608236031215616cf457600080fd5b6040516060810167ffffffffffffffff8282108183111715616d1857616d1861636d565b816040528435915080821115616d2d57600080fd5b50616d3a3682860161639c565b82525060208301356020820152616d536040840161604e565b604082015292915050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000616c91606083018486616c1a565b61032081016103008085843782018360005b6001811015616dd5578151835260209283019290910190600101616db6565b5050509392505050565b600060208284031215616df157600080fd5b8151801515811461613c57600080fd5b600067ffffffffffffffff80841680616e1c57616e1c616817565b9216919091049291505056fea2646970667358221220686527cac84d98a7b3630b988cb7efce8cacdf200640ffe3e0ae6e4b6af7579264736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMTimelock.json b/compiled-contracts/paris/PolygonZkEVMTimelock.json index 81068dc6d..25dada3ed 100644 --- a/compiled-contracts/paris/PolygonZkEVMTimelock.json +++ b/compiled-contracts/paris/PolygonZkEVMTimelock.json @@ -892,8 +892,8 @@ "type": "receive" } ], - "bytecode": "0x60a06040523480156200001157600080fd5b5060405162002d2f38038062002d2f83398101604081905262000034916200042b565b848484846200005360008051602062002caf8339815191528062000242565b6200007d60008051602062002ccf83398151915260008051602062002caf83398151915262000242565b620000a760008051602062002cef83398151915260008051602062002caf83398151915262000242565b620000d160008051602062002d0f83398151915260008051602062002caf83398151915262000242565b620000ec60008051602062002caf833981519152306200028d565b6001600160a01b0381161562000117576200011760008051602062002caf833981519152826200028d565b60005b83518110156200019d576200016160008051602062002ccf8339815191528583815181106200014d576200014d620004cc565b60200260200101516200028d60201b60201c565b6200018a60008051602062002d0f8339815191528583815181106200014d576200014d620004cc565b6200019581620004e2565b90506200011a565b5060005b8251811015620001e757620001d460008051602062002cef8339815191528483815181106200014d576200014d620004cc565b620001df81620004e2565b9050620001a1565b5060028490556040805160008152602081018690527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1505050506001600160a01b0316608052506200050a92505050565b600082815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6200029982826200029d565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1662000299576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620002f93390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146200036957600080fd5b50565b8051620003798162000353565b919050565b600082601f8301126200039057600080fd5b815160206001600160401b0380831115620003af57620003af6200033d565b8260051b604051601f19603f83011681018181108482111715620003d757620003d76200033d565b604052938452858101830193838101925087851115620003f657600080fd5b83870191505b84821015620004205762000410826200036c565b83529183019190830190620003fc565b979650505050505050565b600080600080600060a086880312156200044457600080fd5b855160208701519095506001600160401b03808211156200046457600080fd5b6200047289838a016200037e565b955060408801519150808211156200048957600080fd5b5062000498888289016200037e565b9350506060860151620004ab8162000353565b6080870151909250620004be8162000353565b809150509295509295909350565b634e487b7160e01b600052603260045260246000fd5b6000600182016200050357634e487b7160e01b600052601160045260246000fd5b5060010190565b60805161277b620005346000396000818161041a0152818161116501526111a5015261277b6000f3fe6080604052600436106101c65760003560e01c806364d62353116100f7578063b1c5f42711610095578063d547741f11610064578063d547741f14610661578063e38335e514610681578063f23a6e6114610694578063f27a0c92146106d957600080fd5b8063b1c5f427146105af578063bc197c81146105cf578063c4d252f514610614578063d45c44351461063457600080fd5b80638f61f4f5116100d15780638f61f4f5146104e157806391d1485414610515578063a217fddf14610566578063b08e51c01461057b57600080fd5b806364d62353146104815780638065657f146104a15780638f2a0bb0146104c157600080fd5b8063248a9ca31161016457806331d507501161013e57806331d50750146103c857806336568abe146103e85780633a6aae7214610408578063584b153e1461046157600080fd5b8063248a9ca3146103475780632ab0f529146103775780632f2ff15d146103a857600080fd5b80630d3cf6fc116101a05780630d3cf6fc1461026b578063134008d31461029f57806313bc9f20146102b2578063150b7a02146102d257600080fd5b806301d5062a146101d257806301ffc9a7146101f457806307bd02651461022957600080fd5b366101cd57005b600080fd5b3480156101de57600080fd5b506101f26101ed366004611c52565b6106ee565b005b34801561020057600080fd5b5061021461020f366004611cc7565b610783565b60405190151581526020015b60405180910390f35b34801561023557600080fd5b5061025d7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610220565b34801561027757600080fd5b5061025d7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101f26102ad366004611d09565b6107df565b3480156102be57600080fd5b506102146102cd366004611d75565b6108d7565b3480156102de57600080fd5b506103166102ed366004611e9a565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610220565b34801561035357600080fd5b5061025d610362366004611d75565b60009081526020819052604090206001015490565b34801561038357600080fd5b50610214610392366004611d75565b6000908152600160208190526040909120541490565b3480156103b457600080fd5b506101f26103c3366004611f02565b6108fd565b3480156103d457600080fd5b506102146103e3366004611d75565b610927565b3480156103f457600080fd5b506101f2610403366004611f02565b610940565b34801561041457600080fd5b5061043c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610220565b34801561046d57600080fd5b5061021461047c366004611d75565b6109f8565b34801561048d57600080fd5b506101f261049c366004611d75565b610a0e565b3480156104ad57600080fd5b5061025d6104bc366004611d09565b610ade565b3480156104cd57600080fd5b506101f26104dc366004611f73565b610b1d565b3480156104ed57600080fd5b5061025d7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b34801561052157600080fd5b50610214610530366004611f02565b60009182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b34801561057257600080fd5b5061025d600081565b34801561058757600080fd5b5061025d7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b3480156105bb57600080fd5b5061025d6105ca366004612025565b610d4f565b3480156105db57600080fd5b506103166105ea36600461214e565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b34801561062057600080fd5b506101f261062f366004611d75565b610d94565b34801561064057600080fd5b5061025d61064f366004611d75565b60009081526001602052604090205490565b34801561066d57600080fd5b506101f261067c366004611f02565b610e8f565b6101f261068f366004612025565b610eb4565b3480156106a057600080fd5b506103166106af3660046121f8565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106e557600080fd5b5061025d611161565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161071881611244565b6000610728898989898989610ade565b90506107348184611251565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a604051610770969594939291906122a6565b60405180910390a3505050505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107d957506107d98261139e565b92915050565b600080527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661085c5761085c8133611435565b600061086c888888888888610ade565b905061087881856114ed565b6108848888888861162a565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a6040516108bc94939291906122f1565b60405180910390a36108cd8161172e565b5050505050505050565b6000818152600160205260408120546001811180156108f65750428111155b9392505050565b60008281526020819052604090206001015461091881611244565b61092283836117d7565b505050565b60008181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109f482826118c7565b5050565b6000818152600160208190526040822054610939565b333014610a9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109e1565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b6000868686868686604051602001610afb969594939291906122a6565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b4781611244565b888714610bd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b888514610c65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b6000610c778b8b8b8b8b8b8b8b610d4f565b9050610c838184611251565b60005b8a811015610d415780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610cc357610cc3612331565b9050602002016020810190610cd89190612360565b8d8d86818110610cea57610cea612331565b905060200201358c8c87818110610d0357610d03612331565b9050602002810190610d15919061237b565b8c8b604051610d29969594939291906122a6565b60405180910390a3610d3a8161240f565b9050610c86565b505050505050505050505050565b60008888888888888888604051602001610d709897969594939291906124f7565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610dbe81611244565b610dc7826109f8565b610e53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109e1565b6000828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b600082815260208190526040902060010154610eaa81611244565b61092283836118c7565b600080527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610f3157610f318133611435565b878614610fc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b87841461104f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b60006110618a8a8a8a8a8a8a8a610d4f565b905061106d81856114ed565b60005b8981101561114b5760008b8b8381811061108c5761108c612331565b90506020020160208101906110a19190612360565b905060008a8a848181106110b7576110b7612331565b9050602002013590503660008a8a868181106110d5576110d5612331565b90506020028101906110e7919061237b565b915091506110f78484848461162a565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588686868660405161112e94939291906122f1565b60405180910390a350505050806111449061240f565b9050611070565b506111558161172e565b50505050505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161580159061123257507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123291906125be565b1561123d5750600090565b5060025490565b61124e8133611435565b50565b61125a82610927565b156112e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109e1565b6112ef611161565b81101561137e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109e1565b61138881426125e0565b6000928352600160205260409092209190915550565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107d957507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107d9565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109f4576114738161197e565b61147e83602061199d565b60405160200161148f929190612617565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109e191600401612698565b6114f6826108d7565b611582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109e1565b80158061159e5750600081815260016020819052604090912054145b6109f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109e1565b60008473ffffffffffffffffffffffffffffffffffffffff168484846040516116549291906126e9565b60006040518083038185875af1925050503d8060008114611691576040519150601f19603f3d011682016040523d82523d6000602084013e611696565b606091505b5050905080611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109e1565b5050505050565b611737816108d7565b6117c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109e1565b600090815260016020819052604090912055565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109f45760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556118693390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109f45760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107d973ffffffffffffffffffffffffffffffffffffffff831660145b606060006119ac8360026126f9565b6119b79060026125e0565b67ffffffffffffffff8111156119cf576119cf611d8e565b6040519080825280601f01601f1916602001820160405280156119f9576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611a3057611a30612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a9357611a93612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000611acf8460026126f9565b611ada9060016125e0565b90505b6001811115611b77577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611b1b57611b1b612331565b1a60f81b828281518110611b3157611b31612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c93611b7081612710565b9050611add565b5083156108f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109e1565b803573ffffffffffffffffffffffffffffffffffffffff81168114611c0457600080fd5b919050565b60008083601f840112611c1b57600080fd5b50813567ffffffffffffffff811115611c3357600080fd5b602083019150836020828501011115611c4b57600080fd5b9250929050565b600080600080600080600060c0888a031215611c6d57600080fd5b611c7688611be0565b965060208801359550604088013567ffffffffffffffff811115611c9957600080fd5b611ca58a828b01611c09565b989b979a50986060810135976080820135975060a09091013595509350505050565b600060208284031215611cd957600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108f657600080fd5b60008060008060008060a08789031215611d2257600080fd5b611d2b87611be0565b955060208701359450604087013567ffffffffffffffff811115611d4e57600080fd5b611d5a89828a01611c09565b979a9699509760608101359660809091013595509350505050565b600060208284031215611d8757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611e0457611e04611d8e565b604052919050565b600082601f830112611e1d57600080fd5b813567ffffffffffffffff811115611e3757611e37611d8e565b611e6860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611dbd565b818152846020838601011115611e7d57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611eb057600080fd5b611eb985611be0565b9350611ec760208601611be0565b925060408501359150606085013567ffffffffffffffff811115611eea57600080fd5b611ef687828801611e0c565b91505092959194509250565b60008060408385031215611f1557600080fd5b82359150611f2560208401611be0565b90509250929050565b60008083601f840112611f4057600080fd5b50813567ffffffffffffffff811115611f5857600080fd5b6020830191508360208260051b8501011115611c4b57600080fd5b600080600080600080600080600060c08a8c031215611f9157600080fd5b893567ffffffffffffffff80821115611fa957600080fd5b611fb58d838e01611f2e565b909b50995060208c0135915080821115611fce57600080fd5b611fda8d838e01611f2e565b909950975060408c0135915080821115611ff357600080fd5b506120008c828d01611f2e565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b60008060008060008060008060a0898b03121561204157600080fd5b883567ffffffffffffffff8082111561205957600080fd5b6120658c838d01611f2e565b909a50985060208b013591508082111561207e57600080fd5b61208a8c838d01611f2e565b909850965060408b01359150808211156120a357600080fd5b506120b08b828c01611f2e565b999c989b509699959896976060870135966080013595509350505050565b600082601f8301126120df57600080fd5b8135602067ffffffffffffffff8211156120fb576120fb611d8e565b8160051b61210a828201611dbd565b928352848101820192828101908785111561212457600080fd5b83870192505b848310156121435782358252918301919083019061212a565b979650505050505050565b600080600080600060a0868803121561216657600080fd5b61216f86611be0565b945061217d60208701611be0565b9350604086013567ffffffffffffffff8082111561219a57600080fd5b6121a689838a016120ce565b945060608801359150808211156121bc57600080fd5b6121c889838a016120ce565b935060808801359150808211156121de57600080fd5b506121eb88828901611e0c565b9150509295509295909350565b600080600080600060a0868803121561221057600080fd5b61221986611be0565b945061222760208701611be0565b93506040860135925060608601359150608086013567ffffffffffffffff81111561225157600080fd5b6121eb88828901611e0c565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a0604082015260006122dc60a08301868861225d565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260606040820152600061232760608301848661225d565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561237257600080fd5b6108f682611be0565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126123b057600080fd5b83018035915067ffffffffffffffff8211156123cb57600080fd5b602001915036819003821315611c4b57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612440576124406123e0565b5060010190565b81835260006020808501808196508560051b810191508460005b878110156124ea57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126124a057600080fd5b8701858101903567ffffffffffffffff8111156124bc57600080fd5b8036038213156124cb57600080fd5b6124d686828461225d565b9a87019a9550505090840190600101612461565b5091979650505050505050565b60a0808252810188905260008960c08301825b8b8110156125455773ffffffffffffffffffffffffffffffffffffffff61253084611be0565b1682526020928301929091019060010161250a565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff89111561257e57600080fd5b8860051b9150818a602083013701828103602090810160408501526125a69082018789612447565b60608401959095525050608001529695505050505050565b6000602082840312156125d057600080fd5b815180151581146108f657600080fd5b808201808211156107d9576107d96123e0565b60005b8381101561260e5781810151838201526020016125f6565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161264f8160178501602088016125f3565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000601791840191820152835161268c8160288401602088016125f3565b01602801949350505050565b60208152600082518060208401526126b78160408501602087016125f3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b8183823760009101908152919050565b80820281158282048414176107d9576107d96123e0565b60008161271f5761271f6123e0565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea264697066735822122048ac459f9165e9eaa91bead23625fe941931ad2332a61820c2a6d1dcd92c218164736f6c634300081400335f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63fd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783", - "deployedBytecode": "0x6080604052600436106101c65760003560e01c806364d62353116100f7578063b1c5f42711610095578063d547741f11610064578063d547741f14610661578063e38335e514610681578063f23a6e6114610694578063f27a0c92146106d957600080fd5b8063b1c5f427146105af578063bc197c81146105cf578063c4d252f514610614578063d45c44351461063457600080fd5b80638f61f4f5116100d15780638f61f4f5146104e157806391d1485414610515578063a217fddf14610566578063b08e51c01461057b57600080fd5b806364d62353146104815780638065657f146104a15780638f2a0bb0146104c157600080fd5b8063248a9ca31161016457806331d507501161013e57806331d50750146103c857806336568abe146103e85780633a6aae7214610408578063584b153e1461046157600080fd5b8063248a9ca3146103475780632ab0f529146103775780632f2ff15d146103a857600080fd5b80630d3cf6fc116101a05780630d3cf6fc1461026b578063134008d31461029f57806313bc9f20146102b2578063150b7a02146102d257600080fd5b806301d5062a146101d257806301ffc9a7146101f457806307bd02651461022957600080fd5b366101cd57005b600080fd5b3480156101de57600080fd5b506101f26101ed366004611c52565b6106ee565b005b34801561020057600080fd5b5061021461020f366004611cc7565b610783565b60405190151581526020015b60405180910390f35b34801561023557600080fd5b5061025d7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610220565b34801561027757600080fd5b5061025d7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101f26102ad366004611d09565b6107df565b3480156102be57600080fd5b506102146102cd366004611d75565b6108d7565b3480156102de57600080fd5b506103166102ed366004611e9a565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610220565b34801561035357600080fd5b5061025d610362366004611d75565b60009081526020819052604090206001015490565b34801561038357600080fd5b50610214610392366004611d75565b6000908152600160208190526040909120541490565b3480156103b457600080fd5b506101f26103c3366004611f02565b6108fd565b3480156103d457600080fd5b506102146103e3366004611d75565b610927565b3480156103f457600080fd5b506101f2610403366004611f02565b610940565b34801561041457600080fd5b5061043c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610220565b34801561046d57600080fd5b5061021461047c366004611d75565b6109f8565b34801561048d57600080fd5b506101f261049c366004611d75565b610a0e565b3480156104ad57600080fd5b5061025d6104bc366004611d09565b610ade565b3480156104cd57600080fd5b506101f26104dc366004611f73565b610b1d565b3480156104ed57600080fd5b5061025d7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b34801561052157600080fd5b50610214610530366004611f02565b60009182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b34801561057257600080fd5b5061025d600081565b34801561058757600080fd5b5061025d7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b3480156105bb57600080fd5b5061025d6105ca366004612025565b610d4f565b3480156105db57600080fd5b506103166105ea36600461214e565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b34801561062057600080fd5b506101f261062f366004611d75565b610d94565b34801561064057600080fd5b5061025d61064f366004611d75565b60009081526001602052604090205490565b34801561066d57600080fd5b506101f261067c366004611f02565b610e8f565b6101f261068f366004612025565b610eb4565b3480156106a057600080fd5b506103166106af3660046121f8565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106e557600080fd5b5061025d611161565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161071881611244565b6000610728898989898989610ade565b90506107348184611251565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a604051610770969594939291906122a6565b60405180910390a3505050505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107d957506107d98261139e565b92915050565b600080527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661085c5761085c8133611435565b600061086c888888888888610ade565b905061087881856114ed565b6108848888888861162a565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a6040516108bc94939291906122f1565b60405180910390a36108cd8161172e565b5050505050505050565b6000818152600160205260408120546001811180156108f65750428111155b9392505050565b60008281526020819052604090206001015461091881611244565b61092283836117d7565b505050565b60008181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109f482826118c7565b5050565b6000818152600160208190526040822054610939565b333014610a9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109e1565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b6000868686868686604051602001610afb969594939291906122a6565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b4781611244565b888714610bd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b888514610c65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b6000610c778b8b8b8b8b8b8b8b610d4f565b9050610c838184611251565b60005b8a811015610d415780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610cc357610cc3612331565b9050602002016020810190610cd89190612360565b8d8d86818110610cea57610cea612331565b905060200201358c8c87818110610d0357610d03612331565b9050602002810190610d15919061237b565b8c8b604051610d29969594939291906122a6565b60405180910390a3610d3a8161240f565b9050610c86565b505050505050505050505050565b60008888888888888888604051602001610d709897969594939291906124f7565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610dbe81611244565b610dc7826109f8565b610e53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109e1565b6000828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b600082815260208190526040902060010154610eaa81611244565b61092283836118c7565b600080527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610f3157610f318133611435565b878614610fc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b87841461104f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b60006110618a8a8a8a8a8a8a8a610d4f565b905061106d81856114ed565b60005b8981101561114b5760008b8b8381811061108c5761108c612331565b90506020020160208101906110a19190612360565b905060008a8a848181106110b7576110b7612331565b9050602002013590503660008a8a868181106110d5576110d5612331565b90506020028101906110e7919061237b565b915091506110f78484848461162a565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588686868660405161112e94939291906122f1565b60405180910390a350505050806111449061240f565b9050611070565b506111558161172e565b50505050505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161580159061123257507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123291906125be565b1561123d5750600090565b5060025490565b61124e8133611435565b50565b61125a82610927565b156112e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109e1565b6112ef611161565b81101561137e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109e1565b61138881426125e0565b6000928352600160205260409092209190915550565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107d957507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107d9565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109f4576114738161197e565b61147e83602061199d565b60405160200161148f929190612617565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109e191600401612698565b6114f6826108d7565b611582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109e1565b80158061159e5750600081815260016020819052604090912054145b6109f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109e1565b60008473ffffffffffffffffffffffffffffffffffffffff168484846040516116549291906126e9565b60006040518083038185875af1925050503d8060008114611691576040519150601f19603f3d011682016040523d82523d6000602084013e611696565b606091505b5050905080611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109e1565b5050505050565b611737816108d7565b6117c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109e1565b600090815260016020819052604090912055565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109f45760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556118693390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109f45760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107d973ffffffffffffffffffffffffffffffffffffffff831660145b606060006119ac8360026126f9565b6119b79060026125e0565b67ffffffffffffffff8111156119cf576119cf611d8e565b6040519080825280601f01601f1916602001820160405280156119f9576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611a3057611a30612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a9357611a93612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000611acf8460026126f9565b611ada9060016125e0565b90505b6001811115611b77577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611b1b57611b1b612331565b1a60f81b828281518110611b3157611b31612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c93611b7081612710565b9050611add565b5083156108f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109e1565b803573ffffffffffffffffffffffffffffffffffffffff81168114611c0457600080fd5b919050565b60008083601f840112611c1b57600080fd5b50813567ffffffffffffffff811115611c3357600080fd5b602083019150836020828501011115611c4b57600080fd5b9250929050565b600080600080600080600060c0888a031215611c6d57600080fd5b611c7688611be0565b965060208801359550604088013567ffffffffffffffff811115611c9957600080fd5b611ca58a828b01611c09565b989b979a50986060810135976080820135975060a09091013595509350505050565b600060208284031215611cd957600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108f657600080fd5b60008060008060008060a08789031215611d2257600080fd5b611d2b87611be0565b955060208701359450604087013567ffffffffffffffff811115611d4e57600080fd5b611d5a89828a01611c09565b979a9699509760608101359660809091013595509350505050565b600060208284031215611d8757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611e0457611e04611d8e565b604052919050565b600082601f830112611e1d57600080fd5b813567ffffffffffffffff811115611e3757611e37611d8e565b611e6860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611dbd565b818152846020838601011115611e7d57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611eb057600080fd5b611eb985611be0565b9350611ec760208601611be0565b925060408501359150606085013567ffffffffffffffff811115611eea57600080fd5b611ef687828801611e0c565b91505092959194509250565b60008060408385031215611f1557600080fd5b82359150611f2560208401611be0565b90509250929050565b60008083601f840112611f4057600080fd5b50813567ffffffffffffffff811115611f5857600080fd5b6020830191508360208260051b8501011115611c4b57600080fd5b600080600080600080600080600060c08a8c031215611f9157600080fd5b893567ffffffffffffffff80821115611fa957600080fd5b611fb58d838e01611f2e565b909b50995060208c0135915080821115611fce57600080fd5b611fda8d838e01611f2e565b909950975060408c0135915080821115611ff357600080fd5b506120008c828d01611f2e565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b60008060008060008060008060a0898b03121561204157600080fd5b883567ffffffffffffffff8082111561205957600080fd5b6120658c838d01611f2e565b909a50985060208b013591508082111561207e57600080fd5b61208a8c838d01611f2e565b909850965060408b01359150808211156120a357600080fd5b506120b08b828c01611f2e565b999c989b509699959896976060870135966080013595509350505050565b600082601f8301126120df57600080fd5b8135602067ffffffffffffffff8211156120fb576120fb611d8e565b8160051b61210a828201611dbd565b928352848101820192828101908785111561212457600080fd5b83870192505b848310156121435782358252918301919083019061212a565b979650505050505050565b600080600080600060a0868803121561216657600080fd5b61216f86611be0565b945061217d60208701611be0565b9350604086013567ffffffffffffffff8082111561219a57600080fd5b6121a689838a016120ce565b945060608801359150808211156121bc57600080fd5b6121c889838a016120ce565b935060808801359150808211156121de57600080fd5b506121eb88828901611e0c565b9150509295509295909350565b600080600080600060a0868803121561221057600080fd5b61221986611be0565b945061222760208701611be0565b93506040860135925060608601359150608086013567ffffffffffffffff81111561225157600080fd5b6121eb88828901611e0c565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a0604082015260006122dc60a08301868861225d565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260606040820152600061232760608301848661225d565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561237257600080fd5b6108f682611be0565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126123b057600080fd5b83018035915067ffffffffffffffff8211156123cb57600080fd5b602001915036819003821315611c4b57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612440576124406123e0565b5060010190565b81835260006020808501808196508560051b810191508460005b878110156124ea57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126124a057600080fd5b8701858101903567ffffffffffffffff8111156124bc57600080fd5b8036038213156124cb57600080fd5b6124d686828461225d565b9a87019a9550505090840190600101612461565b5091979650505050505050565b60a0808252810188905260008960c08301825b8b8110156125455773ffffffffffffffffffffffffffffffffffffffff61253084611be0565b1682526020928301929091019060010161250a565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff89111561257e57600080fd5b8860051b9150818a602083013701828103602090810160408501526125a69082018789612447565b60608401959095525050608001529695505050505050565b6000602082840312156125d057600080fd5b815180151581146108f657600080fd5b808201808211156107d9576107d96123e0565b60005b8381101561260e5781810151838201526020016125f6565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161264f8160178501602088016125f3565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000601791840191820152835161268c8160288401602088016125f3565b01602801949350505050565b60208152600082518060208401526126b78160408501602087016125f3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b8183823760009101908152919050565b80820281158282048414176107d9576107d96123e0565b60008161271f5761271f6123e0565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea264697066735822122048ac459f9165e9eaa91bead23625fe941931ad2332a61820c2a6d1dcd92c218164736f6c63430008140033", + "bytecode": "0x60a06040523480156200001157600080fd5b5060405162002d2f38038062002d2f83398101604081905262000034916200042b565b848484846200005360008051602062002caf8339815191528062000242565b6200007d60008051602062002ccf83398151915260008051602062002caf83398151915262000242565b620000a760008051602062002cef83398151915260008051602062002caf83398151915262000242565b620000d160008051602062002d0f83398151915260008051602062002caf83398151915262000242565b620000ec60008051602062002caf833981519152306200028d565b6001600160a01b0381161562000117576200011760008051602062002caf833981519152826200028d565b60005b83518110156200019d576200016160008051602062002ccf8339815191528583815181106200014d576200014d620004cc565b60200260200101516200028d60201b60201c565b6200018a60008051602062002d0f8339815191528583815181106200014d576200014d620004cc565b6200019581620004e2565b90506200011a565b5060005b8251811015620001e757620001d460008051602062002cef8339815191528483815181106200014d576200014d620004cc565b620001df81620004e2565b9050620001a1565b5060028490556040805160008152602081018690527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1505050506001600160a01b0316608052506200050a92505050565b600082815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6200029982826200029d565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1662000299576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620002f93390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146200036957600080fd5b50565b8051620003798162000353565b919050565b600082601f8301126200039057600080fd5b815160206001600160401b0380831115620003af57620003af6200033d565b8260051b604051601f19603f83011681018181108482111715620003d757620003d76200033d565b604052938452858101830193838101925087851115620003f657600080fd5b83870191505b84821015620004205762000410826200036c565b83529183019190830190620003fc565b979650505050505050565b600080600080600060a086880312156200044457600080fd5b855160208701519095506001600160401b03808211156200046457600080fd5b6200047289838a016200037e565b955060408801519150808211156200048957600080fd5b5062000498888289016200037e565b9350506060860151620004ab8162000353565b6080870151909250620004be8162000353565b809150509295509295909350565b634e487b7160e01b600052603260045260246000fd5b6000600182016200050357634e487b7160e01b600052601160045260246000fd5b5060010190565b60805161277b620005346000396000818161041a0152818161116501526111a5015261277b6000f3fe6080604052600436106101c65760003560e01c806364d62353116100f7578063b1c5f42711610095578063d547741f11610064578063d547741f14610661578063e38335e514610681578063f23a6e6114610694578063f27a0c92146106d957600080fd5b8063b1c5f427146105af578063bc197c81146105cf578063c4d252f514610614578063d45c44351461063457600080fd5b80638f61f4f5116100d15780638f61f4f5146104e157806391d1485414610515578063a217fddf14610566578063b08e51c01461057b57600080fd5b806364d62353146104815780638065657f146104a15780638f2a0bb0146104c157600080fd5b8063248a9ca31161016457806331d507501161013e57806331d50750146103c857806336568abe146103e85780633a6aae7214610408578063584b153e1461046157600080fd5b8063248a9ca3146103475780632ab0f529146103775780632f2ff15d146103a857600080fd5b80630d3cf6fc116101a05780630d3cf6fc1461026b578063134008d31461029f57806313bc9f20146102b2578063150b7a02146102d257600080fd5b806301d5062a146101d257806301ffc9a7146101f457806307bd02651461022957600080fd5b366101cd57005b600080fd5b3480156101de57600080fd5b506101f26101ed366004611c52565b6106ee565b005b34801561020057600080fd5b5061021461020f366004611cc7565b610783565b60405190151581526020015b60405180910390f35b34801561023557600080fd5b5061025d7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610220565b34801561027757600080fd5b5061025d7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101f26102ad366004611d09565b6107df565b3480156102be57600080fd5b506102146102cd366004611d75565b6108d7565b3480156102de57600080fd5b506103166102ed366004611e9a565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610220565b34801561035357600080fd5b5061025d610362366004611d75565b60009081526020819052604090206001015490565b34801561038357600080fd5b50610214610392366004611d75565b6000908152600160208190526040909120541490565b3480156103b457600080fd5b506101f26103c3366004611f02565b6108fd565b3480156103d457600080fd5b506102146103e3366004611d75565b610927565b3480156103f457600080fd5b506101f2610403366004611f02565b610940565b34801561041457600080fd5b5061043c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610220565b34801561046d57600080fd5b5061021461047c366004611d75565b6109f8565b34801561048d57600080fd5b506101f261049c366004611d75565b610a0e565b3480156104ad57600080fd5b5061025d6104bc366004611d09565b610ade565b3480156104cd57600080fd5b506101f26104dc366004611f73565b610b1d565b3480156104ed57600080fd5b5061025d7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b34801561052157600080fd5b50610214610530366004611f02565b60009182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b34801561057257600080fd5b5061025d600081565b34801561058757600080fd5b5061025d7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b3480156105bb57600080fd5b5061025d6105ca366004612025565b610d4f565b3480156105db57600080fd5b506103166105ea36600461214e565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b34801561062057600080fd5b506101f261062f366004611d75565b610d94565b34801561064057600080fd5b5061025d61064f366004611d75565b60009081526001602052604090205490565b34801561066d57600080fd5b506101f261067c366004611f02565b610e8f565b6101f261068f366004612025565b610eb4565b3480156106a057600080fd5b506103166106af3660046121f8565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106e557600080fd5b5061025d611161565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161071881611244565b6000610728898989898989610ade565b90506107348184611251565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a604051610770969594939291906122a6565b60405180910390a3505050505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107d957506107d98261139e565b92915050565b600080527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661085c5761085c8133611435565b600061086c888888888888610ade565b905061087881856114ed565b6108848888888861162a565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a6040516108bc94939291906122f1565b60405180910390a36108cd8161172e565b5050505050505050565b6000818152600160205260408120546001811180156108f65750428111155b9392505050565b60008281526020819052604090206001015461091881611244565b61092283836117d7565b505050565b60008181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109f482826118c7565b5050565b6000818152600160208190526040822054610939565b333014610a9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109e1565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b6000868686868686604051602001610afb969594939291906122a6565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b4781611244565b888714610bd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b888514610c65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b6000610c778b8b8b8b8b8b8b8b610d4f565b9050610c838184611251565b60005b8a811015610d415780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610cc357610cc3612331565b9050602002016020810190610cd89190612360565b8d8d86818110610cea57610cea612331565b905060200201358c8c87818110610d0357610d03612331565b9050602002810190610d15919061237b565b8c8b604051610d29969594939291906122a6565b60405180910390a3610d3a8161240f565b9050610c86565b505050505050505050505050565b60008888888888888888604051602001610d709897969594939291906124f7565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610dbe81611244565b610dc7826109f8565b610e53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109e1565b6000828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b600082815260208190526040902060010154610eaa81611244565b61092283836118c7565b600080527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610f3157610f318133611435565b878614610fc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b87841461104f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b60006110618a8a8a8a8a8a8a8a610d4f565b905061106d81856114ed565b60005b8981101561114b5760008b8b8381811061108c5761108c612331565b90506020020160208101906110a19190612360565b905060008a8a848181106110b7576110b7612331565b9050602002013590503660008a8a868181106110d5576110d5612331565b90506020028101906110e7919061237b565b915091506110f78484848461162a565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588686868660405161112e94939291906122f1565b60405180910390a350505050806111449061240f565b9050611070565b506111558161172e565b50505050505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161580159061123257507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123291906125be565b1561123d5750600090565b5060025490565b61124e8133611435565b50565b61125a82610927565b156112e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109e1565b6112ef611161565b81101561137e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109e1565b61138881426125e0565b6000928352600160205260409092209190915550565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107d957507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107d9565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109f4576114738161197e565b61147e83602061199d565b60405160200161148f929190612617565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109e191600401612698565b6114f6826108d7565b611582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109e1565b80158061159e5750600081815260016020819052604090912054145b6109f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109e1565b60008473ffffffffffffffffffffffffffffffffffffffff168484846040516116549291906126e9565b60006040518083038185875af1925050503d8060008114611691576040519150601f19603f3d011682016040523d82523d6000602084013e611696565b606091505b5050905080611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109e1565b5050505050565b611737816108d7565b6117c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109e1565b600090815260016020819052604090912055565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109f45760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556118693390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109f45760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107d973ffffffffffffffffffffffffffffffffffffffff831660145b606060006119ac8360026126f9565b6119b79060026125e0565b67ffffffffffffffff8111156119cf576119cf611d8e565b6040519080825280601f01601f1916602001820160405280156119f9576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611a3057611a30612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a9357611a93612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000611acf8460026126f9565b611ada9060016125e0565b90505b6001811115611b77577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611b1b57611b1b612331565b1a60f81b828281518110611b3157611b31612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c93611b7081612710565b9050611add565b5083156108f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109e1565b803573ffffffffffffffffffffffffffffffffffffffff81168114611c0457600080fd5b919050565b60008083601f840112611c1b57600080fd5b50813567ffffffffffffffff811115611c3357600080fd5b602083019150836020828501011115611c4b57600080fd5b9250929050565b600080600080600080600060c0888a031215611c6d57600080fd5b611c7688611be0565b965060208801359550604088013567ffffffffffffffff811115611c9957600080fd5b611ca58a828b01611c09565b989b979a50986060810135976080820135975060a09091013595509350505050565b600060208284031215611cd957600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108f657600080fd5b60008060008060008060a08789031215611d2257600080fd5b611d2b87611be0565b955060208701359450604087013567ffffffffffffffff811115611d4e57600080fd5b611d5a89828a01611c09565b979a9699509760608101359660809091013595509350505050565b600060208284031215611d8757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611e0457611e04611d8e565b604052919050565b600082601f830112611e1d57600080fd5b813567ffffffffffffffff811115611e3757611e37611d8e565b611e6860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611dbd565b818152846020838601011115611e7d57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611eb057600080fd5b611eb985611be0565b9350611ec760208601611be0565b925060408501359150606085013567ffffffffffffffff811115611eea57600080fd5b611ef687828801611e0c565b91505092959194509250565b60008060408385031215611f1557600080fd5b82359150611f2560208401611be0565b90509250929050565b60008083601f840112611f4057600080fd5b50813567ffffffffffffffff811115611f5857600080fd5b6020830191508360208260051b8501011115611c4b57600080fd5b600080600080600080600080600060c08a8c031215611f9157600080fd5b893567ffffffffffffffff80821115611fa957600080fd5b611fb58d838e01611f2e565b909b50995060208c0135915080821115611fce57600080fd5b611fda8d838e01611f2e565b909950975060408c0135915080821115611ff357600080fd5b506120008c828d01611f2e565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b60008060008060008060008060a0898b03121561204157600080fd5b883567ffffffffffffffff8082111561205957600080fd5b6120658c838d01611f2e565b909a50985060208b013591508082111561207e57600080fd5b61208a8c838d01611f2e565b909850965060408b01359150808211156120a357600080fd5b506120b08b828c01611f2e565b999c989b509699959896976060870135966080013595509350505050565b600082601f8301126120df57600080fd5b8135602067ffffffffffffffff8211156120fb576120fb611d8e565b8160051b61210a828201611dbd565b928352848101820192828101908785111561212457600080fd5b83870192505b848310156121435782358252918301919083019061212a565b979650505050505050565b600080600080600060a0868803121561216657600080fd5b61216f86611be0565b945061217d60208701611be0565b9350604086013567ffffffffffffffff8082111561219a57600080fd5b6121a689838a016120ce565b945060608801359150808211156121bc57600080fd5b6121c889838a016120ce565b935060808801359150808211156121de57600080fd5b506121eb88828901611e0c565b9150509295509295909350565b600080600080600060a0868803121561221057600080fd5b61221986611be0565b945061222760208701611be0565b93506040860135925060608601359150608086013567ffffffffffffffff81111561225157600080fd5b6121eb88828901611e0c565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a0604082015260006122dc60a08301868861225d565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260606040820152600061232760608301848661225d565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561237257600080fd5b6108f682611be0565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126123b057600080fd5b83018035915067ffffffffffffffff8211156123cb57600080fd5b602001915036819003821315611c4b57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612440576124406123e0565b5060010190565b81835260006020808501808196508560051b810191508460005b878110156124ea57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126124a057600080fd5b8701858101903567ffffffffffffffff8111156124bc57600080fd5b8036038213156124cb57600080fd5b6124d686828461225d565b9a87019a9550505090840190600101612461565b5091979650505050505050565b60a0808252810188905260008960c08301825b8b8110156125455773ffffffffffffffffffffffffffffffffffffffff61253084611be0565b1682526020928301929091019060010161250a565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff89111561257e57600080fd5b8860051b9150818a602083013701828103602090810160408501526125a69082018789612447565b60608401959095525050608001529695505050505050565b6000602082840312156125d057600080fd5b815180151581146108f657600080fd5b808201808211156107d9576107d96123e0565b60005b8381101561260e5781810151838201526020016125f6565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161264f8160178501602088016125f3565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000601791840191820152835161268c8160288401602088016125f3565b01602801949350505050565b60208152600082518060208401526126b78160408501602087016125f3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b8183823760009101908152919050565b80820281158282048414176107d9576107d96123e0565b60008161271f5761271f6123e0565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220c474c39da3523b28ebfa5fd66c05b42d6ddcc4a57055483bdda32888b366016164736f6c634300081400335f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63fd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783", + "deployedBytecode": "0x6080604052600436106101c65760003560e01c806364d62353116100f7578063b1c5f42711610095578063d547741f11610064578063d547741f14610661578063e38335e514610681578063f23a6e6114610694578063f27a0c92146106d957600080fd5b8063b1c5f427146105af578063bc197c81146105cf578063c4d252f514610614578063d45c44351461063457600080fd5b80638f61f4f5116100d15780638f61f4f5146104e157806391d1485414610515578063a217fddf14610566578063b08e51c01461057b57600080fd5b806364d62353146104815780638065657f146104a15780638f2a0bb0146104c157600080fd5b8063248a9ca31161016457806331d507501161013e57806331d50750146103c857806336568abe146103e85780633a6aae7214610408578063584b153e1461046157600080fd5b8063248a9ca3146103475780632ab0f529146103775780632f2ff15d146103a857600080fd5b80630d3cf6fc116101a05780630d3cf6fc1461026b578063134008d31461029f57806313bc9f20146102b2578063150b7a02146102d257600080fd5b806301d5062a146101d257806301ffc9a7146101f457806307bd02651461022957600080fd5b366101cd57005b600080fd5b3480156101de57600080fd5b506101f26101ed366004611c52565b6106ee565b005b34801561020057600080fd5b5061021461020f366004611cc7565b610783565b60405190151581526020015b60405180910390f35b34801561023557600080fd5b5061025d7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610220565b34801561027757600080fd5b5061025d7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101f26102ad366004611d09565b6107df565b3480156102be57600080fd5b506102146102cd366004611d75565b6108d7565b3480156102de57600080fd5b506103166102ed366004611e9a565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610220565b34801561035357600080fd5b5061025d610362366004611d75565b60009081526020819052604090206001015490565b34801561038357600080fd5b50610214610392366004611d75565b6000908152600160208190526040909120541490565b3480156103b457600080fd5b506101f26103c3366004611f02565b6108fd565b3480156103d457600080fd5b506102146103e3366004611d75565b610927565b3480156103f457600080fd5b506101f2610403366004611f02565b610940565b34801561041457600080fd5b5061043c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610220565b34801561046d57600080fd5b5061021461047c366004611d75565b6109f8565b34801561048d57600080fd5b506101f261049c366004611d75565b610a0e565b3480156104ad57600080fd5b5061025d6104bc366004611d09565b610ade565b3480156104cd57600080fd5b506101f26104dc366004611f73565b610b1d565b3480156104ed57600080fd5b5061025d7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b34801561052157600080fd5b50610214610530366004611f02565b60009182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b34801561057257600080fd5b5061025d600081565b34801561058757600080fd5b5061025d7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b3480156105bb57600080fd5b5061025d6105ca366004612025565b610d4f565b3480156105db57600080fd5b506103166105ea36600461214e565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b34801561062057600080fd5b506101f261062f366004611d75565b610d94565b34801561064057600080fd5b5061025d61064f366004611d75565b60009081526001602052604090205490565b34801561066d57600080fd5b506101f261067c366004611f02565b610e8f565b6101f261068f366004612025565b610eb4565b3480156106a057600080fd5b506103166106af3660046121f8565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106e557600080fd5b5061025d611161565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161071881611244565b6000610728898989898989610ade565b90506107348184611251565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a604051610770969594939291906122a6565b60405180910390a3505050505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107d957506107d98261139e565b92915050565b600080527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661085c5761085c8133611435565b600061086c888888888888610ade565b905061087881856114ed565b6108848888888861162a565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a6040516108bc94939291906122f1565b60405180910390a36108cd8161172e565b5050505050505050565b6000818152600160205260408120546001811180156108f65750428111155b9392505050565b60008281526020819052604090206001015461091881611244565b61092283836117d7565b505050565b60008181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109f482826118c7565b5050565b6000818152600160208190526040822054610939565b333014610a9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109e1565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b6000868686868686604051602001610afb969594939291906122a6565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b4781611244565b888714610bd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b888514610c65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b6000610c778b8b8b8b8b8b8b8b610d4f565b9050610c838184611251565b60005b8a811015610d415780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610cc357610cc3612331565b9050602002016020810190610cd89190612360565b8d8d86818110610cea57610cea612331565b905060200201358c8c87818110610d0357610d03612331565b9050602002810190610d15919061237b565b8c8b604051610d29969594939291906122a6565b60405180910390a3610d3a8161240f565b9050610c86565b505050505050505050505050565b60008888888888888888604051602001610d709897969594939291906124f7565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610dbe81611244565b610dc7826109f8565b610e53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109e1565b6000828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b600082815260208190526040902060010154610eaa81611244565b61092283836118c7565b600080527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610f3157610f318133611435565b878614610fc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b87841461104f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b60006110618a8a8a8a8a8a8a8a610d4f565b905061106d81856114ed565b60005b8981101561114b5760008b8b8381811061108c5761108c612331565b90506020020160208101906110a19190612360565b905060008a8a848181106110b7576110b7612331565b9050602002013590503660008a8a868181106110d5576110d5612331565b90506020028101906110e7919061237b565b915091506110f78484848461162a565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588686868660405161112e94939291906122f1565b60405180910390a350505050806111449061240f565b9050611070565b506111558161172e565b50505050505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161580159061123257507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123291906125be565b1561123d5750600090565b5060025490565b61124e8133611435565b50565b61125a82610927565b156112e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109e1565b6112ef611161565b81101561137e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109e1565b61138881426125e0565b6000928352600160205260409092209190915550565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107d957507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107d9565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109f4576114738161197e565b61147e83602061199d565b60405160200161148f929190612617565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109e191600401612698565b6114f6826108d7565b611582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109e1565b80158061159e5750600081815260016020819052604090912054145b6109f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109e1565b60008473ffffffffffffffffffffffffffffffffffffffff168484846040516116549291906126e9565b60006040518083038185875af1925050503d8060008114611691576040519150601f19603f3d011682016040523d82523d6000602084013e611696565b606091505b5050905080611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109e1565b5050505050565b611737816108d7565b6117c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109e1565b600090815260016020819052604090912055565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109f45760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556118693390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109f45760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107d973ffffffffffffffffffffffffffffffffffffffff831660145b606060006119ac8360026126f9565b6119b79060026125e0565b67ffffffffffffffff8111156119cf576119cf611d8e565b6040519080825280601f01601f1916602001820160405280156119f9576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611a3057611a30612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a9357611a93612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000611acf8460026126f9565b611ada9060016125e0565b90505b6001811115611b77577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611b1b57611b1b612331565b1a60f81b828281518110611b3157611b31612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c93611b7081612710565b9050611add565b5083156108f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109e1565b803573ffffffffffffffffffffffffffffffffffffffff81168114611c0457600080fd5b919050565b60008083601f840112611c1b57600080fd5b50813567ffffffffffffffff811115611c3357600080fd5b602083019150836020828501011115611c4b57600080fd5b9250929050565b600080600080600080600060c0888a031215611c6d57600080fd5b611c7688611be0565b965060208801359550604088013567ffffffffffffffff811115611c9957600080fd5b611ca58a828b01611c09565b989b979a50986060810135976080820135975060a09091013595509350505050565b600060208284031215611cd957600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108f657600080fd5b60008060008060008060a08789031215611d2257600080fd5b611d2b87611be0565b955060208701359450604087013567ffffffffffffffff811115611d4e57600080fd5b611d5a89828a01611c09565b979a9699509760608101359660809091013595509350505050565b600060208284031215611d8757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611e0457611e04611d8e565b604052919050565b600082601f830112611e1d57600080fd5b813567ffffffffffffffff811115611e3757611e37611d8e565b611e6860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611dbd565b818152846020838601011115611e7d57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611eb057600080fd5b611eb985611be0565b9350611ec760208601611be0565b925060408501359150606085013567ffffffffffffffff811115611eea57600080fd5b611ef687828801611e0c565b91505092959194509250565b60008060408385031215611f1557600080fd5b82359150611f2560208401611be0565b90509250929050565b60008083601f840112611f4057600080fd5b50813567ffffffffffffffff811115611f5857600080fd5b6020830191508360208260051b8501011115611c4b57600080fd5b600080600080600080600080600060c08a8c031215611f9157600080fd5b893567ffffffffffffffff80821115611fa957600080fd5b611fb58d838e01611f2e565b909b50995060208c0135915080821115611fce57600080fd5b611fda8d838e01611f2e565b909950975060408c0135915080821115611ff357600080fd5b506120008c828d01611f2e565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b60008060008060008060008060a0898b03121561204157600080fd5b883567ffffffffffffffff8082111561205957600080fd5b6120658c838d01611f2e565b909a50985060208b013591508082111561207e57600080fd5b61208a8c838d01611f2e565b909850965060408b01359150808211156120a357600080fd5b506120b08b828c01611f2e565b999c989b509699959896976060870135966080013595509350505050565b600082601f8301126120df57600080fd5b8135602067ffffffffffffffff8211156120fb576120fb611d8e565b8160051b61210a828201611dbd565b928352848101820192828101908785111561212457600080fd5b83870192505b848310156121435782358252918301919083019061212a565b979650505050505050565b600080600080600060a0868803121561216657600080fd5b61216f86611be0565b945061217d60208701611be0565b9350604086013567ffffffffffffffff8082111561219a57600080fd5b6121a689838a016120ce565b945060608801359150808211156121bc57600080fd5b6121c889838a016120ce565b935060808801359150808211156121de57600080fd5b506121eb88828901611e0c565b9150509295509295909350565b600080600080600060a0868803121561221057600080fd5b61221986611be0565b945061222760208701611be0565b93506040860135925060608601359150608086013567ffffffffffffffff81111561225157600080fd5b6121eb88828901611e0c565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a0604082015260006122dc60a08301868861225d565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260606040820152600061232760608301848661225d565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561237257600080fd5b6108f682611be0565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126123b057600080fd5b83018035915067ffffffffffffffff8211156123cb57600080fd5b602001915036819003821315611c4b57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612440576124406123e0565b5060010190565b81835260006020808501808196508560051b810191508460005b878110156124ea57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126124a057600080fd5b8701858101903567ffffffffffffffff8111156124bc57600080fd5b8036038213156124cb57600080fd5b6124d686828461225d565b9a87019a9550505090840190600101612461565b5091979650505050505050565b60a0808252810188905260008960c08301825b8b8110156125455773ffffffffffffffffffffffffffffffffffffffff61253084611be0565b1682526020928301929091019060010161250a565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff89111561257e57600080fd5b8860051b9150818a602083013701828103602090810160408501526125a69082018789612447565b60608401959095525050608001529695505050505050565b6000602082840312156125d057600080fd5b815180151581146108f657600080fd5b808201808211156107d9576107d96123e0565b60005b8381101561260e5781810151838201526020016125f6565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161264f8160178501602088016125f3565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000601791840191820152835161268c8160288401602088016125f3565b01602801949350505050565b60208152600082518060208401526126b78160408501602087016125f3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b8183823760009101908152919050565b80820281158282048414176107d9576107d96123e0565b60008161271f5761271f6123e0565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220c474c39da3523b28ebfa5fd66c05b42d6ddcc4a57055483bdda32888b366016164736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMV2.json b/compiled-contracts/paris/PolygonZkEVMV2.json index 548468c47..c5024afa8 100644 --- a/compiled-contracts/paris/PolygonZkEVMV2.json +++ b/compiled-contracts/paris/PolygonZkEVMV2.json @@ -74,6 +74,16 @@ "name": "ForceBatchesAlreadyActive", "type": "error" }, + { + "inputs": [], + "name": "ForceBatchesDescentralized", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchesNotAllowedOnEmergencyState", + "type": "error" + }, { "inputs": [], "name": "ForceBatchesOverflow", @@ -99,6 +109,11 @@ "name": "HaltTimeoutNotExpired", "type": "error" }, + { + "inputs": [], + "name": "HaltTimeoutNotExpiredAfterEmergencyState", + "type": "error" + }, { "inputs": [], "name": "HugeTokenMetadataNotSupported", @@ -272,12 +287,6 @@ "name": "AcceptAdminRole", "type": "event" }, - { - "anonymous": false, - "inputs": [], - "name": "ActivateForceBatches", - "type": "event" - }, { "anonymous": false, "inputs": [ @@ -373,6 +382,19 @@ "name": "SequenceForceBatches", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newForceBatchAddress", + "type": "address" + } + ], + "name": "SetForceBatchAddress", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -613,13 +635,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [], - "name": "activateForceBatches", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [], "name": "admin", @@ -677,6 +692,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "forceBatchAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "forceBatchTimeout", @@ -820,19 +848,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [], - "name": "isForcedBatchAllowed", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "lastAccInputHash", @@ -1030,6 +1045,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "newForceBatchAddress", + "type": "address" + } + ], + "name": "setForceBatchAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -1109,8 +1137,8 @@ "type": "function" } ], - "bytecode": "0x6101006040523480156200001257600080fd5b506040516200477938038062004779833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e0516145cc620001ad6000396000818161051a015281816109a501528181610b12015281816112690152818161133201528181611354015281816114eb0152818161176801528181611d21015281816128ed015281816129bb0152612aa80152600081816106690152818161142c015281816119c2015281816120f001526121f801526000818161072d01528181610f8c01528181611b770152612bf30152600081816107720152818161083d015281816112bc015281816114020152612bc701526145cc6000f3fe608060405234801561001057600080fd5b50600436106102e85760003560e01c80636e05d2cd11610191578063c7fffd4b116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b146107b4578063f35dda47146107c7578063f851a440146107cf57600080fd5b8063d8d1091b1461075a578063e46761c41461076d578063e7a7ed021461079457600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610708578063d02103ca14610728578063d7bc90ff1461074f57600080fd5b8063c7fffd4b146106ed578063c89e42df146106f557600080fd5b80639e00187711610145578063ada8f9191161011f578063ada8f9191461069e578063b0afe154146106b1578063c754c7ed146106bd57600080fd5b80639e00187714610649578063a3c573eb14610664578063a652f26c1461068b57600080fd5b8063712570221161017657806371257022146105f25780637a5460c5146106055780638c3d73011461064157600080fd5b80636e05d2cd146105d65780636ff512cc146105df57600080fd5b80633cbc795b1161024a57806352bdeb6d116101fe5780635ec91958116101d85780635ec91958146105a6578063676870d2146105ae5780636b8616ce146105b657600080fd5b806352bdeb6d1461054f578063542028d51461058b5780635e9145c91461059357600080fd5b8063456052671161022f57806345605267146104ed57806349b7b802146105155780634e4877061461053c57600080fd5b80633cbc795b1461045757806340b5de6c1461049557600080fd5b806319d8ac61116102a15780632b35b3ac116102865780632b35b3ac1461040057806332c2d1531461041d5780633c351e101461043257600080fd5b806319d8ac611461038e57806326782247146103bb57600080fd5b806305835f37116102d257806305835f3714610323578063107bf28c1461036c57806311e892d41461037457600080fd5b8062d0295d146102ed5780630350896314610308575b600080fd5b6102f56107f5565b6040519081526020015b60405180910390f35b610310602081565b60405161ffff90911681526020016102ff565b61035f6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102ff919061375f565b61035f610915565b61037c60f981565b60405160ff90911681526020016102ff565b6007546103a29067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102ff565b6001546103db9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102ff565b60085461040d9060ff1681565b60405190151581526020016102ff565b61043061042b3660046137b4565b6109a3565b005b6008546103db90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b600854610480907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102ff565b6104bc7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102ff565b6007546103a290700100000000000000000000000000000000900467ffffffffffffffff1681565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b61043061054a3660046137f6565b610a72565b61035f6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61035f610c8c565b6104306105a136600461385f565b610c99565b6104306115b2565b610310601f81565b6102f56105c43660046137f6565b60066020526000908152604090205481565b6102f560055481565b6104306105ed3660046138ab565b61169c565b6104306106003660046139f4565b611766565b61035f6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610430611f1c565b6103db73a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b61035f610699366004613aa1565b611fef565b6104306106ac3660046138ab565b6123d4565b6102f56405ca1ab1e081565b6007546103a2907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61037c60e481565b610430610703366004613b16565b61249e565b6002546103db9073ffffffffffffffffffffffffffffffffffffffff1681565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6102f5635ca1ab1e81565b610430610768366004613b4b565b612531565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6007546103a29068010000000000000000900467ffffffffffffffff1681565b6104306107c2366004613b8d565b612a68565b61037c601b81565b6000546103db9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610884573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a89190613c05565b6007549091506000906108e79067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613c4d565b67ffffffffffffffff169050806000036109045760009250505090565b61090e8183613c75565b9250505090565b6004805461092290613cb0565b80601f016020809104026020016040519081016040528092919081815260200182805461094e90613cb0565b801561099b5780601f106109705761010080835404028352916020019161099b565b820191906000526020600020905b81548152906001019060200180831161097e57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a12576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a6591815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ac9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b10576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9f9190613d03565b610c085760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c08576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461092290613cb0565b60025473ffffffffffffffffffffffffffffffffffffffff163314610cea576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003610d26576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610d62576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b8581101561119e576000898983818110610dab57610dab613d25565b9050602002810190610dbd9190613d54565b610dc690613d92565b8051805160209091012060608201519192509067ffffffffffffffff1615610f495785610df281613e23565b96505060008183602001518460600151604051602001610e4a93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114610ed3576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015610f29576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055611086565b602082015115801590611010575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015610fea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100e9190613c05565b155b15611047576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611086576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806110b9575042826040015167ffffffffffffffff16115b156110f0576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061119690613e4a565b915050610d8f565b5060075467ffffffffffffffff68010000000000000000909104811690841611156111f5576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691909117909155600583905585908281169085161461132c57600061124c8386613c4d565b905061126267ffffffffffffffff821683613e82565b91506112e37f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661129b6107f5565b6112a59190613e95565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190612e57565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b61142a337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e19190613c05565b6113eb9190613e95565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190612f30565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561149257600080fd5b505af11580156114a6573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af115801561154a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156e9190613eac565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611609576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615611646576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146116f3576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c81565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146117d5576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156117f55750600054600160ff909116105b8061180f5750303b15801561180f575060005460ff166001145b6118a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156118fe57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611b135761192585612f94565b61192e866130a4565b611937876131ab565b60405160200161194993929190613ec9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611a0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2e9190613f02565b915091508163ffffffff16600014611acb57600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff851602179055611b10565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b600854600090611b60908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff1685611fef565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611be0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c049190613c05565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611d7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da39190613eac565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611e359190613f8a565b506004611e428982613f8a565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611ea2939291906140a4565b60405180910390a15050505050508015611f1357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611f6d576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa600087604051602401612023969594939291906140e3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060906000036121745760f9601f83516120b89190614146565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e48760405160200161215e9796959493929190614161565b6040516020818303038152906040529050612278565b815161ffff10156121b1576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96121c0602083614146565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016122659796959493929190614244565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156122d9573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612351576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906123979084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614327565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461242b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c81565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146124f5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036125018282613f8a565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c81919061375f565b60085460ff1661256d576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036125a9576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156125e5576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612620918491700100000000000000000000000000000000900416614383565b1115612658576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b838110156128e757600086868381811061269d5761269d613d25565b90506020028101906126af9190614396565b6126b8906143ca565b9050836126c481613e23565b825180516020918201208185015160408087015190519499509194506000936127269386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89166000908152600690935291205490915081146127af576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86166000908152600660205260408120556127d4600188613e82565b84036128435742600760189054906101000a900467ffffffffffffffff1684604001516128019190614448565b67ffffffffffffffff161115612843576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806128df90613e4a565b915050612681565b506129157f00000000000000000000000000000000000000000000000000000000000000008461129b6107f5565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612a04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a289190613eac565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612aa4576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b359190613c05565b905081811115612b71576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612bad576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612bef73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084612f30565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c809190613c05565b600780549192506801000000000000000090910467ffffffffffffffff16906008612caa83613e23565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612ce1929190614469565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612df1576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612e50565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612e479493929190614479565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052612f2b9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261329e565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612f8e9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612ea9565b50505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161301691906144ea565b600060405180830381855afa9150503d8060008114613051576040519150601f19603f3d011682016040523d82523d6000602084013e613056565b606091505b50915091508161309b576040518060400160405280600781526020017f4e4f5f4e414d45000000000000000000000000000000000000000000000000008152506123cc565b6123cc816133aa565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161312691906144ea565b600060405180830381855afa9150503d8060008114613161576040519150601f19603f3d011682016040523d82523d6000602084013e613166565b606091505b50915091508161309b576040518060400160405280600981526020017f4e4f5f53594d424f4c00000000000000000000000000000000000000000000008152506123cc565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169161322c91906144ea565b600060405180830381855afa9150503d8060008114613267576040519150601f19603f3d011682016040523d82523d6000602084013e61326c565b606091505b509150915081801561327f575080516020145b61328a5760126123cc565b808060200190518101906123cc91906144fc565b6000613300826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166135809092919063ffffffff16565b805190915015612f2b578080602001905181019061331e9190613d03565b612f2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611897565b606060408251106133cf57818060200190518101906133c9919061451f565b92915050565b81516020036135475760005b60208110801561342257508281815181106133f8576133f8613d25565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613439578061343181613e4a565b9150506133db565b8060000361347c57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115613497576134976138da565b6040519080825280601f01601f1916602001820160405280156134c1576020820181803683370190505b50905060005b8281101561353f578481815181106134e1576134e1613d25565b602001015160f81c60f81b8282815181106134fe576134fe613d25565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061353781613e4a565b9150506134c7565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60606123cc8484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516135b491906144ea565b60006040518083038185875af1925050503d80600081146135f1576040519150601f19603f3d011682016040523d82523d6000602084013e6135f6565b606091505b509150915061360787838387613612565b979650505050505050565b606083156136a85782516000036136a15773ffffffffffffffffffffffffffffffffffffffff85163b6136a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611897565b50816123cc565b6123cc83838151156136bd5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611897919061375f565b60005b8381101561370c5781810151838201526020016136f4565b50506000910152565b6000815180845261372d8160208601602086016136f1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006137726020830184613715565b9392505050565b67ffffffffffffffff8116811461378f57600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461378f57600080fd5b6000806000606084860312156137c957600080fd5b83356137d481613779565b92506020840135915060408401356137eb81613792565b809150509250925092565b60006020828403121561380857600080fd5b813561377281613779565b60008083601f84011261382557600080fd5b50813567ffffffffffffffff81111561383d57600080fd5b6020830191508360208260051b850101111561385857600080fd5b9250929050565b60008060006040848603121561387457600080fd5b833567ffffffffffffffff81111561388b57600080fd5b61389786828701613813565b90945092505060208401356137eb81613792565b6000602082840312156138bd57600080fd5b813561377281613792565b63ffffffff8116811461378f57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613950576139506138da565b604052919050565b600067ffffffffffffffff821115613972576139726138da565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126139af57600080fd5b81356139c26139bd82613958565b613909565b8181528460208386010111156139d757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613a0d57600080fd5b8635613a1881613792565b95506020870135613a2881613792565b94506040870135613a38816138c8565b93506060870135613a4881613792565b9250608087013567ffffffffffffffff80821115613a6557600080fd5b613a718a838b0161399e565b935060a0890135915080821115613a8757600080fd5b50613a9489828a0161399e565b9150509295509295509295565b60008060008060808587031215613ab757600080fd5b8435613ac2816138c8565b93506020850135613ad281613792565b92506040850135613ae2816138c8565b9150606085013567ffffffffffffffff811115613afe57600080fd5b613b0a8782880161399e565b91505092959194509250565b600060208284031215613b2857600080fd5b813567ffffffffffffffff811115613b3f57600080fd5b6123cc8482850161399e565b60008060208385031215613b5e57600080fd5b823567ffffffffffffffff811115613b7557600080fd5b613b8185828601613813565b90969095509350505050565b600080600060408486031215613ba257600080fd5b833567ffffffffffffffff80821115613bba57600080fd5b818601915086601f830112613bce57600080fd5b813581811115613bdd57600080fd5b876020828501011115613bef57600080fd5b6020928301989097509590910135949350505050565b600060208284031215613c1757600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613c6e57613c6e613c1e565b5092915050565b600082613cab577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613cc457607f821691505b602082108103613cfd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215613d1557600080fd5b8151801515811461377257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613d8857600080fd5b9190910192915050565b600060808236031215613da457600080fd5b6040516080810167ffffffffffffffff8282108183111715613dc857613dc86138da565b816040528435915080821115613ddd57600080fd5b50613dea3682860161399e565b825250602083013560208201526040830135613e0581613779565b60408201526060830135613e1881613779565b606082015292915050565b600067ffffffffffffffff808316818103613e4057613e40613c1e565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e7b57613e7b613c1e565b5060010190565b818103818111156133c9576133c9613c1e565b80820281158282048414176133c9576133c9613c1e565b600060208284031215613ebe57600080fd5b815161377281613779565b606081526000613edc6060830186613715565b8281036020840152613eee8186613715565b91505060ff83166040830152949350505050565b60008060408385031215613f1557600080fd5b8251613f20816138c8565b6020840151909250613f3181613792565b809150509250929050565b601f821115612f2b57600081815260208120601f850160051c81016020861015613f635750805b601f850160051c820191505b81811015613f8257828155600101613f6f565b505050505050565b815167ffffffffffffffff811115613fa457613fa46138da565b613fb881613fb28454613cb0565b84613f3c565b602080601f83116001811461400b5760008415613fd55750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613f82565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561405857888601518255948401946001909101908401614039565b508582101561409457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006140b76060830186613715565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261413a60c0830184613715565b98975050505050505050565b61ffff818116838216019080821115613c6e57613c6e613c1e565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b16600184015287516141ca816003860160208c016136f1565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161420d816017840160208b016136f1565b808201915050818660f81b166017820152845191506142338260188301602088016136f1565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b16600184015287516142ad816003860160208c016136f1565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516142f0816017840160208b016136f1565b808201915050818660f01b166017820152845191506143168260198301602088016136f1565b016019019998505050505050505050565b60008651614339818460208b016136f1565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b808201808211156133c9576133c9613c1e565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112613d8857600080fd5b6000606082360312156143dc57600080fd5b6040516060810167ffffffffffffffff8282108183111715614400576144006138da565b81604052843591508082111561441557600080fd5b506144223682860161399e565b82525060208301356020820152604083013561443d81613779565b604082015292915050565b67ffffffffffffffff818116838216019080821115613c6e57613c6e613c1e565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b60008251613d888184602087016136f1565b60006020828403121561450e57600080fd5b815160ff8116811461377257600080fd5b60006020828403121561453157600080fd5b815167ffffffffffffffff81111561454857600080fd5b8201601f8101841361455957600080fd5b80516145676139bd82613958565b81815285602083850101111561457c57600080fd5b61458d8260208301602086016136f1565b9594505050505056fea2646970667358221220f3e7ef0428e2730e80cc4130042d31e9b32129000f1f7cb95d1336b5b268b82c64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102e85760003560e01c80636e05d2cd11610191578063c7fffd4b116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b146107b4578063f35dda47146107c7578063f851a440146107cf57600080fd5b8063d8d1091b1461075a578063e46761c41461076d578063e7a7ed021461079457600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610708578063d02103ca14610728578063d7bc90ff1461074f57600080fd5b8063c7fffd4b146106ed578063c89e42df146106f557600080fd5b80639e00187711610145578063ada8f9191161011f578063ada8f9191461069e578063b0afe154146106b1578063c754c7ed146106bd57600080fd5b80639e00187714610649578063a3c573eb14610664578063a652f26c1461068b57600080fd5b8063712570221161017657806371257022146105f25780637a5460c5146106055780638c3d73011461064157600080fd5b80636e05d2cd146105d65780636ff512cc146105df57600080fd5b80633cbc795b1161024a57806352bdeb6d116101fe5780635ec91958116101d85780635ec91958146105a6578063676870d2146105ae5780636b8616ce146105b657600080fd5b806352bdeb6d1461054f578063542028d51461058b5780635e9145c91461059357600080fd5b8063456052671161022f57806345605267146104ed57806349b7b802146105155780634e4877061461053c57600080fd5b80633cbc795b1461045757806340b5de6c1461049557600080fd5b806319d8ac61116102a15780632b35b3ac116102865780632b35b3ac1461040057806332c2d1531461041d5780633c351e101461043257600080fd5b806319d8ac611461038e57806326782247146103bb57600080fd5b806305835f37116102d257806305835f3714610323578063107bf28c1461036c57806311e892d41461037457600080fd5b8062d0295d146102ed5780630350896314610308575b600080fd5b6102f56107f5565b6040519081526020015b60405180910390f35b610310602081565b60405161ffff90911681526020016102ff565b61035f6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102ff919061375f565b61035f610915565b61037c60f981565b60405160ff90911681526020016102ff565b6007546103a29067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102ff565b6001546103db9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102ff565b60085461040d9060ff1681565b60405190151581526020016102ff565b61043061042b3660046137b4565b6109a3565b005b6008546103db90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b600854610480907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102ff565b6104bc7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102ff565b6007546103a290700100000000000000000000000000000000900467ffffffffffffffff1681565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b61043061054a3660046137f6565b610a72565b61035f6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61035f610c8c565b6104306105a136600461385f565b610c99565b6104306115b2565b610310601f81565b6102f56105c43660046137f6565b60066020526000908152604090205481565b6102f560055481565b6104306105ed3660046138ab565b61169c565b6104306106003660046139f4565b611766565b61035f6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610430611f1c565b6103db73a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b61035f610699366004613aa1565b611fef565b6104306106ac3660046138ab565b6123d4565b6102f56405ca1ab1e081565b6007546103a2907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61037c60e481565b610430610703366004613b16565b61249e565b6002546103db9073ffffffffffffffffffffffffffffffffffffffff1681565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6102f5635ca1ab1e81565b610430610768366004613b4b565b612531565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6007546103a29068010000000000000000900467ffffffffffffffff1681565b6104306107c2366004613b8d565b612a68565b61037c601b81565b6000546103db9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610884573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a89190613c05565b6007549091506000906108e79067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613c4d565b67ffffffffffffffff169050806000036109045760009250505090565b61090e8183613c75565b9250505090565b6004805461092290613cb0565b80601f016020809104026020016040519081016040528092919081815260200182805461094e90613cb0565b801561099b5780601f106109705761010080835404028352916020019161099b565b820191906000526020600020905b81548152906001019060200180831161097e57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a12576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a6591815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ac9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b10576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9f9190613d03565b610c085760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c08576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461092290613cb0565b60025473ffffffffffffffffffffffffffffffffffffffff163314610cea576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003610d26576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610d62576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b8581101561119e576000898983818110610dab57610dab613d25565b9050602002810190610dbd9190613d54565b610dc690613d92565b8051805160209091012060608201519192509067ffffffffffffffff1615610f495785610df281613e23565b96505060008183602001518460600151604051602001610e4a93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114610ed3576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015610f29576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8616600090815260066020526040812055611086565b602082015115801590611010575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015610fea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100e9190613c05565b155b15611047576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611086576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806110b9575042826040015167ffffffffffffffff16115b156110f0576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061119690613e4a565b915050610d8f565b5060075467ffffffffffffffff68010000000000000000909104811690841611156111f5576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691909117909155600583905585908281169085161461132c57600061124c8386613c4d565b905061126267ffffffffffffffff821683613e82565b91506112e37f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661129b6107f5565b6112a59190613e95565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190612e57565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b61142a337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e19190613c05565b6113eb9190613e95565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190612f30565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561149257600080fd5b505af11580156114a6573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af115801561154a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156e9190613eac565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611609576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615611646576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146116f3576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c81565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146117d5576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156117f55750600054600160ff909116105b8061180f5750303b15801561180f575060005460ff166001145b6118a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156118fe57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611b135761192585612f94565b61192e866130a4565b611937876131ab565b60405160200161194993929190613ec9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611a0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2e9190613f02565b915091508163ffffffff16600014611acb57600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff851602179055611b10565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b600854600090611b60908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff1685611fef565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611be0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c049190613c05565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611d7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da39190613eac565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611e359190613f8a565b506004611e428982613f8a565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611ea2939291906140a4565b60405180910390a15050505050508015611f1357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611f6d576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa600087604051602401612023969594939291906140e3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060906000036121745760f9601f83516120b89190614146565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e48760405160200161215e9796959493929190614161565b6040516020818303038152906040529050612278565b815161ffff10156121b1576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96121c0602083614146565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016122659796959493929190614244565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156122d9573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612351576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906123979084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614327565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461242b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c81565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146124f5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036125018282613f8a565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c81919061375f565b60085460ff1661256d576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036125a9576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156125e5576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612620918491700100000000000000000000000000000000900416614383565b1115612658576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b838110156128e757600086868381811061269d5761269d613d25565b90506020028101906126af9190614396565b6126b8906143ca565b9050836126c481613e23565b825180516020918201208185015160408087015190519499509194506000936127269386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89166000908152600690935291205490915081146127af576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86166000908152600660205260408120556127d4600188613e82565b84036128435742600760189054906101000a900467ffffffffffffffff1684604001516128019190614448565b67ffffffffffffffff161115612843576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806128df90613e4a565b915050612681565b506129157f00000000000000000000000000000000000000000000000000000000000000008461129b6107f5565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612a04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a289190613eac565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612aa4576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b359190613c05565b905081811115612b71576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612bad576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612bef73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084612f30565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c809190613c05565b600780549192506801000000000000000090910467ffffffffffffffff16906008612caa83613e23565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612ce1929190614469565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612df1576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612e50565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612e479493929190614479565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052612f2b9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261329e565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612f8e9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612ea9565b50505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161301691906144ea565b600060405180830381855afa9150503d8060008114613051576040519150601f19603f3d011682016040523d82523d6000602084013e613056565b606091505b50915091508161309b576040518060400160405280600781526020017f4e4f5f4e414d45000000000000000000000000000000000000000000000000008152506123cc565b6123cc816133aa565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161312691906144ea565b600060405180830381855afa9150503d8060008114613161576040519150601f19603f3d011682016040523d82523d6000602084013e613166565b606091505b50915091508161309b576040518060400160405280600981526020017f4e4f5f53594d424f4c00000000000000000000000000000000000000000000008152506123cc565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169161322c91906144ea565b600060405180830381855afa9150503d8060008114613267576040519150601f19603f3d011682016040523d82523d6000602084013e61326c565b606091505b509150915081801561327f575080516020145b61328a5760126123cc565b808060200190518101906123cc91906144fc565b6000613300826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166135809092919063ffffffff16565b805190915015612f2b578080602001905181019061331e9190613d03565b612f2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611897565b606060408251106133cf57818060200190518101906133c9919061451f565b92915050565b81516020036135475760005b60208110801561342257508281815181106133f8576133f8613d25565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613439578061343181613e4a565b9150506133db565b8060000361347c57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115613497576134976138da565b6040519080825280601f01601f1916602001820160405280156134c1576020820181803683370190505b50905060005b8281101561353f578481815181106134e1576134e1613d25565b602001015160f81c60f81b8282815181106134fe576134fe613d25565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061353781613e4a565b9150506134c7565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60606123cc8484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516135b491906144ea565b60006040518083038185875af1925050503d80600081146135f1576040519150601f19603f3d011682016040523d82523d6000602084013e6135f6565b606091505b509150915061360787838387613612565b979650505050505050565b606083156136a85782516000036136a15773ffffffffffffffffffffffffffffffffffffffff85163b6136a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611897565b50816123cc565b6123cc83838151156136bd5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611897919061375f565b60005b8381101561370c5781810151838201526020016136f4565b50506000910152565b6000815180845261372d8160208601602086016136f1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006137726020830184613715565b9392505050565b67ffffffffffffffff8116811461378f57600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461378f57600080fd5b6000806000606084860312156137c957600080fd5b83356137d481613779565b92506020840135915060408401356137eb81613792565b809150509250925092565b60006020828403121561380857600080fd5b813561377281613779565b60008083601f84011261382557600080fd5b50813567ffffffffffffffff81111561383d57600080fd5b6020830191508360208260051b850101111561385857600080fd5b9250929050565b60008060006040848603121561387457600080fd5b833567ffffffffffffffff81111561388b57600080fd5b61389786828701613813565b90945092505060208401356137eb81613792565b6000602082840312156138bd57600080fd5b813561377281613792565b63ffffffff8116811461378f57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613950576139506138da565b604052919050565b600067ffffffffffffffff821115613972576139726138da565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126139af57600080fd5b81356139c26139bd82613958565b613909565b8181528460208386010111156139d757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613a0d57600080fd5b8635613a1881613792565b95506020870135613a2881613792565b94506040870135613a38816138c8565b93506060870135613a4881613792565b9250608087013567ffffffffffffffff80821115613a6557600080fd5b613a718a838b0161399e565b935060a0890135915080821115613a8757600080fd5b50613a9489828a0161399e565b9150509295509295509295565b60008060008060808587031215613ab757600080fd5b8435613ac2816138c8565b93506020850135613ad281613792565b92506040850135613ae2816138c8565b9150606085013567ffffffffffffffff811115613afe57600080fd5b613b0a8782880161399e565b91505092959194509250565b600060208284031215613b2857600080fd5b813567ffffffffffffffff811115613b3f57600080fd5b6123cc8482850161399e565b60008060208385031215613b5e57600080fd5b823567ffffffffffffffff811115613b7557600080fd5b613b8185828601613813565b90969095509350505050565b600080600060408486031215613ba257600080fd5b833567ffffffffffffffff80821115613bba57600080fd5b818601915086601f830112613bce57600080fd5b813581811115613bdd57600080fd5b876020828501011115613bef57600080fd5b6020928301989097509590910135949350505050565b600060208284031215613c1757600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613c6e57613c6e613c1e565b5092915050565b600082613cab577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613cc457607f821691505b602082108103613cfd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215613d1557600080fd5b8151801515811461377257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613d8857600080fd5b9190910192915050565b600060808236031215613da457600080fd5b6040516080810167ffffffffffffffff8282108183111715613dc857613dc86138da565b816040528435915080821115613ddd57600080fd5b50613dea3682860161399e565b825250602083013560208201526040830135613e0581613779565b60408201526060830135613e1881613779565b606082015292915050565b600067ffffffffffffffff808316818103613e4057613e40613c1e565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e7b57613e7b613c1e565b5060010190565b818103818111156133c9576133c9613c1e565b80820281158282048414176133c9576133c9613c1e565b600060208284031215613ebe57600080fd5b815161377281613779565b606081526000613edc6060830186613715565b8281036020840152613eee8186613715565b91505060ff83166040830152949350505050565b60008060408385031215613f1557600080fd5b8251613f20816138c8565b6020840151909250613f3181613792565b809150509250929050565b601f821115612f2b57600081815260208120601f850160051c81016020861015613f635750805b601f850160051c820191505b81811015613f8257828155600101613f6f565b505050505050565b815167ffffffffffffffff811115613fa457613fa46138da565b613fb881613fb28454613cb0565b84613f3c565b602080601f83116001811461400b5760008415613fd55750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613f82565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561405857888601518255948401946001909101908401614039565b508582101561409457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006140b76060830186613715565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261413a60c0830184613715565b98975050505050505050565b61ffff818116838216019080821115613c6e57613c6e613c1e565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b16600184015287516141ca816003860160208c016136f1565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161420d816017840160208b016136f1565b808201915050818660f81b166017820152845191506142338260188301602088016136f1565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b16600184015287516142ad816003860160208c016136f1565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516142f0816017840160208b016136f1565b808201915050818660f01b166017820152845191506143168260198301602088016136f1565b016019019998505050505050505050565b60008651614339818460208b016136f1565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b808201808211156133c9576133c9613c1e565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112613d8857600080fd5b6000606082360312156143dc57600080fd5b6040516060810167ffffffffffffffff8282108183111715614400576144006138da565b81604052843591508082111561441557600080fd5b506144223682860161399e565b82525060208301356020820152604083013561443d81613779565b604082015292915050565b67ffffffffffffffff818116838216019080821115613c6e57613c6e613c1e565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b60008251613d888184602087016136f1565b60006020828403121561450e57600080fd5b815160ff8116811461377257600080fd5b60006020828403121561453157600080fd5b815167ffffffffffffffff81111561454857600080fd5b8201601f8101841361455957600080fd5b80516145676139bd82613958565b81815285602083850101111561457c57600080fd5b61458d8260208301602086016136f1565b9594505050505056fea2646970667358221220f3e7ef0428e2730e80cc4130042d31e9b32129000f1f7cb95d1336b5b268b82c64736f6c63430008140033", + "bytecode": "0x6101006040523480156200001257600080fd5b50604051620049eb380380620049eb833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e051614830620001bb60003960008181610517015281816109ad01528181610b1a015281816112710152818161133a0152818161135c015281816114f30152818161168601528181611c11015281816125f801528181612a5101528181612b1f01528181612c440152612d0c01526000818161067101528181611434015281816118e00152818161213a015261224201526000818161073501528181610f9401528181611a670152612e5701526000818161077a01528181610845015281816112c40152818161140a0152612e2b01526148306000f3fe608060405234801561001057600080fd5b50600436106102e85760003560e01c80636ff512cc11610191578063c7fffd4b116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b146107bc578063f35dda47146107cf578063f851a440146107d757600080fd5b8063d8d1091b14610762578063e46761c414610775578063e7a7ed021461079c57600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610710578063d02103ca14610730578063d7bc90ff1461075757600080fd5b8063c7fffd4b146106f5578063c89e42df146106fd57600080fd5b80639e00187711610145578063ada8f9191161011f578063ada8f919146106a6578063b0afe154146106b9578063c754c7ed146106c557600080fd5b80639e00187714610651578063a3c573eb1461066c578063a652f26c1461069357600080fd5b80637a5460c5116101765780637a5460c5146105fa5780638c3d73011461063657806391cafe321461063e57600080fd5b80636ff512cc146105d457806371257022146105e757600080fd5b80633cbc795b1161024a57806352bdeb6d116101fe578063676870d2116101d8578063676870d2146105a35780636b8616ce146105ab5780636e05d2cd146105cb57600080fd5b806352bdeb6d1461054c578063542028d5146105885780635e9145c91461059057600080fd5b8063456052671161022f57806345605267146104ea57806349b7b802146105125780634e4877061461053957600080fd5b80633cbc795b1461045557806340b5de6c1461049257600080fd5b806319d8ac61116102a15780632c111c06116102865780632c111c061461040057806332c2d153146104205780633c351e101461043557600080fd5b806319d8ac611461038e57806326782247146103bb57600080fd5b806305835f37116102d257806305835f3714610323578063107bf28c1461036c57806311e892d41461037457600080fd5b8062d0295d146102ed5780630350896314610308575b600080fd5b6102f56107fd565b6040519081526020015b60405180910390f35b610310602081565b60405161ffff90911681526020016102ff565b61035f6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102ff91906139c3565b61035f61091d565b61037c60f981565b60405160ff90911681526020016102ff565b6007546103a29067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102ff565b6001546103db9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102ff565b6008546103db9073ffffffffffffffffffffffffffffffffffffffff1681565b61043361042e366004613a18565b6109ab565b005b6009546103db9073ffffffffffffffffffffffffffffffffffffffff1681565b60095461047d9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102ff565b6104b97fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102ff565b6007546103a290700100000000000000000000000000000000900467ffffffffffffffff1681565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b610433610547366004613a5a565b610a7a565b61035f6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61035f610c94565b61043361059e366004613ac3565b610ca1565b610310601f81565b6102f56105b9366004613a5a565b60066020526000908152604090205481565b6102f560055481565b6104336105e2366004613b0f565b6115ba565b6104336105f5366004613c58565b611684565b61035f6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610433611e4d565b61043361064c366004613b0f565b611f20565b6103db73a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b61035f6106a1366004613d05565b612039565b6104336106b4366004613b0f565b61241e565b6102f56405ca1ab1e081565b6007546103a2907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61037c60e481565b61043361070b366004613d7a565b6124e8565b6002546103db9073ffffffffffffffffffffffffffffffffffffffff1681565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6102f5635ca1ab1e81565b610433610770366004613daf565b61257b565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6007546103a29068010000000000000000900467ffffffffffffffff1681565b6104336107ca366004613df1565b612bcc565b61037c601b81565b6000546103db9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561088c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b09190613e69565b6007549091506000906108ef9067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613eb1565b67ffffffffffffffff1690508060000361090c5760009250505090565b6109168183613ed9565b9250505090565b6004805461092a90613f14565b80601f016020809104026020016040519081016040528092919081815260200182805461095690613f14565b80156109a35780601f10610978576101008083540402835291602001916109a3565b820191906000526020600020905b81548152906001019060200180831161098657829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a1a576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a6d91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ad1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b18576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba79190613f67565b610c105760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c10576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461092a90613f14565b60025473ffffffffffffffffffffffffffffffffffffffff163314610cf2576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003610d2e576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610d6a576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156111a6576000898983818110610db357610db3613f89565b9050602002810190610dc59190613fb8565b610dce90613ff6565b8051805160209091012060608201519192509067ffffffffffffffff1615610f515785610dfa81614087565b96505060008183602001518460600151604051602001610e5293929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114610edb576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015610f31576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff861660009081526006602052604081205561108e565b602082015115801590611018575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015610ff2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110169190613e69565b155b1561104f576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c0101561108e576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806110c1575042826040015167ffffffffffffffff16115b156110f8576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061119e906140ae565b915050610d97565b5060075467ffffffffffffffff68010000000000000000909104811690841611156111fd576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146113345760006112548386613eb1565b905061126a67ffffffffffffffff8216836140e6565b91506112eb7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166112a36107fd565b6112ad91906140f9565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691906130bb565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611432337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e99190613e69565b6113f391906140f9565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613194565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561149a57600080fd5b505af11580156114ae573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af1158015611552573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115769190614110565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611611576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c89565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146116f3576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156117135750600054600160ff909116105b8061172d5750303b15801561172d575060005460ff166001145b6117be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561181c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611a0857611843856131f8565b61184c86613308565b6118558761340f565b6040516020016118679392919061412d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611928573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194c9190614166565b915091508163ffffffff166000146119c4576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055611a05565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b600954600090611a5090889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685612039565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ad0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af49190613e69565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611c6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c939190614110565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611d2591906141ee565b506004611d3289826141ee565b508c600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611dd393929190614308565b60405180910390a15050505050508015611e4457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611e9e576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611f77576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611fc6576040517fd40d91c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c89565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa60008760405160240161206d96959493929190614347565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060906000036121be5760f9601f835161210291906143aa565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e4876040516020016121a897969594939291906143c5565b60405160208183030381529060405290506122c2565b815161ffff10156121fb576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f961220a6020836143aa565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016122af97969594939291906144a8565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015612323573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661239b576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906123e19084906405ca1ab1e090635ca1ab1e90601b907fff000000000000000000000000000000000000000000000000000000000000009060200161458b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612475576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c89565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461253f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361254b82826141ee565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c8991906139c3565b60085473ffffffffffffffffffffffffffffffffffffffff16158015906125ba575060085473ffffffffffffffffffffffffffffffffffffffff163314155b156125f1576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612661573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126859190614110565b61268f91906145e7565b67ffffffffffffffff1611156126d1576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081900361270d576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612749576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612784918491700100000000000000000000000000000000900416614608565b11156127bc576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015612a4b57600086868381811061280157612801613f89565b9050602002810190612813919061461b565b61281c9061464f565b90508361282881614087565b8251805160209182012081850151604080870151905194995091945060009361288a9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612913576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86166000908152600660205260408120556129386001886140e6565b84036129a75742600760189054906101000a900467ffffffffffffffff16846040015161296591906145e7565b67ffffffffffffffff1611156129a7576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080612a43906140ae565b9150506127e5565b50612a797f0000000000000000000000000000000000000000000000000000000000000000846112a36107fd565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612b68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b8c9190614110565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085473ffffffffffffffffffffffffffffffffffffffff1615801590612c0b575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15612c42576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd19190613f67565b15612d08576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d999190613e69565b905081811115612dd5576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612e11576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e5373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613194565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ec0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ee49190613e69565b600780549192506801000000000000000090910467ffffffffffffffff16906008612f0e83614087565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612f459291906146cd565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303613055576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26130b4565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931823388886040516130ab94939291906146dd565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261318f9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613502565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526131f29085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161310d565b50505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161327a919061474e565b600060405180830381855afa9150503d80600081146132b5576040519150601f19603f3d011682016040523d82523d6000602084013e6132ba565b606091505b5091509150816132ff576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250612416565b6124168161360e565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161338a919061474e565b600060405180830381855afa9150503d80600081146133c5576040519150601f19603f3d011682016040523d82523d6000602084013e6133ca565b606091505b5091509150816132ff576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250612416565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff861691613490919061474e565b600060405180830381855afa9150503d80600081146134cb576040519150601f19603f3d011682016040523d82523d6000602084013e6134d0565b606091505b50915091508180156134e3575080516020145b6134ee576012612416565b808060200190518101906124169190614760565b6000613564826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166137e49092919063ffffffff16565b80519091501561318f57808060200190518101906135829190613f67565b61318f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016117b5565b60606040825110613633578180602001905181019061362d9190614783565b92915050565b81516020036137ab5760005b602081108015613686575082818151811061365c5761365c613f89565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1561369d5780613695816140ae565b91505061363f565b806000036136e057505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff8111156136fb576136fb613b3e565b6040519080825280601f01601f191660200182016040528015613725576020820181803683370190505b50905060005b828110156137a35784818151811061374557613745613f89565b602001015160f81c60f81b82828151811061376257613762613f89565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061379b816140ae565b91505061372b565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60606124168484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051613818919061474e565b60006040518083038185875af1925050503d8060008114613855576040519150601f19603f3d011682016040523d82523d6000602084013e61385a565b606091505b509150915061386b87838387613876565b979650505050505050565b6060831561390c5782516000036139055773ffffffffffffffffffffffffffffffffffffffff85163b613905576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016117b5565b5081612416565b61241683838151156139215781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b591906139c3565b60005b83811015613970578181015183820152602001613958565b50506000910152565b60008151808452613991816020860160208601613955565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006139d66020830184613979565b9392505050565b67ffffffffffffffff811681146139f357600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff811681146139f357600080fd5b600080600060608486031215613a2d57600080fd5b8335613a38816139dd565b9250602084013591506040840135613a4f816139f6565b809150509250925092565b600060208284031215613a6c57600080fd5b81356139d6816139dd565b60008083601f840112613a8957600080fd5b50813567ffffffffffffffff811115613aa157600080fd5b6020830191508360208260051b8501011115613abc57600080fd5b9250929050565b600080600060408486031215613ad857600080fd5b833567ffffffffffffffff811115613aef57600080fd5b613afb86828701613a77565b9094509250506020840135613a4f816139f6565b600060208284031215613b2157600080fd5b81356139d6816139f6565b63ffffffff811681146139f357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613bb457613bb4613b3e565b604052919050565b600067ffffffffffffffff821115613bd657613bd6613b3e565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613c1357600080fd5b8135613c26613c2182613bbc565b613b6d565b818152846020838601011115613c3b57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613c7157600080fd5b8635613c7c816139f6565b95506020870135613c8c816139f6565b94506040870135613c9c81613b2c565b93506060870135613cac816139f6565b9250608087013567ffffffffffffffff80821115613cc957600080fd5b613cd58a838b01613c02565b935060a0890135915080821115613ceb57600080fd5b50613cf889828a01613c02565b9150509295509295509295565b60008060008060808587031215613d1b57600080fd5b8435613d2681613b2c565b93506020850135613d36816139f6565b92506040850135613d4681613b2c565b9150606085013567ffffffffffffffff811115613d6257600080fd5b613d6e87828801613c02565b91505092959194509250565b600060208284031215613d8c57600080fd5b813567ffffffffffffffff811115613da357600080fd5b61241684828501613c02565b60008060208385031215613dc257600080fd5b823567ffffffffffffffff811115613dd957600080fd5b613de585828601613a77565b90969095509350505050565b600080600060408486031215613e0657600080fd5b833567ffffffffffffffff80821115613e1e57600080fd5b818601915086601f830112613e3257600080fd5b813581811115613e4157600080fd5b876020828501011115613e5357600080fd5b6020928301989097509590910135949350505050565b600060208284031215613e7b57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613ed257613ed2613e82565b5092915050565b600082613f0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613f2857607f821691505b602082108103613f61577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215613f7957600080fd5b815180151581146139d657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613fec57600080fd5b9190910192915050565b60006080823603121561400857600080fd5b6040516080810167ffffffffffffffff828210818311171561402c5761402c613b3e565b81604052843591508082111561404157600080fd5b5061404e36828601613c02565b825250602083013560208201526040830135614069816139dd565b6040820152606083013561407c816139dd565b606082015292915050565b600067ffffffffffffffff8083168181036140a4576140a4613e82565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036140df576140df613e82565b5060010190565b8181038181111561362d5761362d613e82565b808202811582820484141761362d5761362d613e82565b60006020828403121561412257600080fd5b81516139d6816139dd565b6060815260006141406060830186613979565b82810360208401526141528186613979565b91505060ff83166040830152949350505050565b6000806040838503121561417957600080fd5b825161418481613b2c565b6020840151909250614195816139f6565b809150509250929050565b601f82111561318f57600081815260208120601f850160051c810160208610156141c75750805b601f850160051c820191505b818110156141e6578281556001016141d3565b505050505050565b815167ffffffffffffffff81111561420857614208613b3e565b61421c816142168454613f14565b846141a0565b602080601f83116001811461426f57600084156142395750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556141e6565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156142bc5788860151825594840194600190910190840161429d565b50858210156142f857878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60608152600061431b6060830186613979565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261439e60c0830184613979565b98975050505050505050565b61ffff818116838216019080821115613ed257613ed2613e82565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b166001840152875161442e816003860160208c01613955565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614471816017840160208b01613955565b808201915050818660f81b16601782015284519150614497826018830160208801613955565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614511816003860160208c01613955565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614554816017840160208b01613955565b808201915050818660f01b1660178201528451915061457a826019830160208801613955565b016019019998505050505050505050565b6000865161459d818460208b01613955565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b67ffffffffffffffff818116838216019080821115613ed257613ed2613e82565b8082018082111561362d5761362d613e82565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112613fec57600080fd5b60006060823603121561466157600080fd5b6040516060810167ffffffffffffffff828210818311171561468557614685613b3e565b81604052843591508082111561469a57600080fd5b506146a736828601613c02565b8252506020830135602082015260408301356146c2816139dd565b604082015292915050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b60008251613fec818460208701613955565b60006020828403121561477257600080fd5b815160ff811681146139d657600080fd5b60006020828403121561479557600080fd5b815167ffffffffffffffff8111156147ac57600080fd5b8201601f810184136147bd57600080fd5b80516147cb613c2182613bbc565b8181528560208385010111156147e057600080fd5b6147f1826020830160208601613955565b9594505050505056fea264697066735822122054d17ab62a9c80223317103957a799f93d742c7a9fb607c4af5b2f022a2d816e64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102e85760003560e01c80636ff512cc11610191578063c7fffd4b116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b146107bc578063f35dda47146107cf578063f851a440146107d757600080fd5b8063d8d1091b14610762578063e46761c414610775578063e7a7ed021461079c57600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610710578063d02103ca14610730578063d7bc90ff1461075757600080fd5b8063c7fffd4b146106f5578063c89e42df146106fd57600080fd5b80639e00187711610145578063ada8f9191161011f578063ada8f919146106a6578063b0afe154146106b9578063c754c7ed146106c557600080fd5b80639e00187714610651578063a3c573eb1461066c578063a652f26c1461069357600080fd5b80637a5460c5116101765780637a5460c5146105fa5780638c3d73011461063657806391cafe321461063e57600080fd5b80636ff512cc146105d457806371257022146105e757600080fd5b80633cbc795b1161024a57806352bdeb6d116101fe578063676870d2116101d8578063676870d2146105a35780636b8616ce146105ab5780636e05d2cd146105cb57600080fd5b806352bdeb6d1461054c578063542028d5146105885780635e9145c91461059057600080fd5b8063456052671161022f57806345605267146104ea57806349b7b802146105125780634e4877061461053957600080fd5b80633cbc795b1461045557806340b5de6c1461049257600080fd5b806319d8ac61116102a15780632c111c06116102865780632c111c061461040057806332c2d153146104205780633c351e101461043557600080fd5b806319d8ac611461038e57806326782247146103bb57600080fd5b806305835f37116102d257806305835f3714610323578063107bf28c1461036c57806311e892d41461037457600080fd5b8062d0295d146102ed5780630350896314610308575b600080fd5b6102f56107fd565b6040519081526020015b60405180910390f35b610310602081565b60405161ffff90911681526020016102ff565b61035f6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102ff91906139c3565b61035f61091d565b61037c60f981565b60405160ff90911681526020016102ff565b6007546103a29067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102ff565b6001546103db9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102ff565b6008546103db9073ffffffffffffffffffffffffffffffffffffffff1681565b61043361042e366004613a18565b6109ab565b005b6009546103db9073ffffffffffffffffffffffffffffffffffffffff1681565b60095461047d9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102ff565b6104b97fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102ff565b6007546103a290700100000000000000000000000000000000900467ffffffffffffffff1681565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b610433610547366004613a5a565b610a7a565b61035f6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61035f610c94565b61043361059e366004613ac3565b610ca1565b610310601f81565b6102f56105b9366004613a5a565b60066020526000908152604090205481565b6102f560055481565b6104336105e2366004613b0f565b6115ba565b6104336105f5366004613c58565b611684565b61035f6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610433611e4d565b61043361064c366004613b0f565b611f20565b6103db73a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b61035f6106a1366004613d05565b612039565b6104336106b4366004613b0f565b61241e565b6102f56405ca1ab1e081565b6007546103a2907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61037c60e481565b61043361070b366004613d7a565b6124e8565b6002546103db9073ffffffffffffffffffffffffffffffffffffffff1681565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6102f5635ca1ab1e81565b610433610770366004613daf565b61257b565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6007546103a29068010000000000000000900467ffffffffffffffff1681565b6104336107ca366004613df1565b612bcc565b61037c601b81565b6000546103db9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561088c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b09190613e69565b6007549091506000906108ef9067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613eb1565b67ffffffffffffffff1690508060000361090c5760009250505090565b6109168183613ed9565b9250505090565b6004805461092a90613f14565b80601f016020809104026020016040519081016040528092919081815260200182805461095690613f14565b80156109a35780601f10610978576101008083540402835291602001916109a3565b820191906000526020600020905b81548152906001019060200180831161098657829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a1a576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a6d91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ad1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b18576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba79190613f67565b610c105760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c10576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461092a90613f14565b60025473ffffffffffffffffffffffffffffffffffffffff163314610cf2576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003610d2e576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610d6a576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156111a6576000898983818110610db357610db3613f89565b9050602002810190610dc59190613fb8565b610dce90613ff6565b8051805160209091012060608201519192509067ffffffffffffffff1615610f515785610dfa81614087565b96505060008183602001518460600151604051602001610e5293929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114610edb576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015610f31576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff861660009081526006602052604081205561108e565b602082015115801590611018575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015610ff2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110169190613e69565b155b1561104f576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c0101561108e576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806110c1575042826040015167ffffffffffffffff16115b156110f8576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061119e906140ae565b915050610d97565b5060075467ffffffffffffffff68010000000000000000909104811690841611156111fd576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146113345760006112548386613eb1565b905061126a67ffffffffffffffff8216836140e6565b91506112eb7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166112a36107fd565b6112ad91906140f9565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691906130bb565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611432337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e99190613e69565b6113f391906140f9565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613194565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561149a57600080fd5b505af11580156114ae573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af1158015611552573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115769190614110565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611611576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c89565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146116f3576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156117135750600054600160ff909116105b8061172d5750303b15801561172d575060005460ff166001145b6117be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561181c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611a0857611843856131f8565b61184c86613308565b6118558761340f565b6040516020016118679392919061412d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611928573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194c9190614166565b915091508163ffffffff166000146119c4576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055611a05565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b600954600090611a5090889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685612039565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ad0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af49190613e69565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611c6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c939190614110565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611d2591906141ee565b506004611d3289826141ee565b508c600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611dd393929190614308565b60405180910390a15050505050508015611e4457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611e9e576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611f77576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611fc6576040517fd40d91c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c89565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa60008760405160240161206d96959493929190614347565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060906000036121be5760f9601f835161210291906143aa565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e4876040516020016121a897969594939291906143c5565b60405160208183030381529060405290506122c2565b815161ffff10156121fb576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f961220a6020836143aa565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016122af97969594939291906144a8565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015612323573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661239b576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906123e19084906405ca1ab1e090635ca1ab1e90601b907fff000000000000000000000000000000000000000000000000000000000000009060200161458b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612475576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c89565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461253f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361254b82826141ee565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c8991906139c3565b60085473ffffffffffffffffffffffffffffffffffffffff16158015906125ba575060085473ffffffffffffffffffffffffffffffffffffffff163314155b156125f1576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612661573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126859190614110565b61268f91906145e7565b67ffffffffffffffff1611156126d1576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081900361270d576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612749576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612784918491700100000000000000000000000000000000900416614608565b11156127bc576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015612a4b57600086868381811061280157612801613f89565b9050602002810190612813919061461b565b61281c9061464f565b90508361282881614087565b8251805160209182012081850151604080870151905194995091945060009361288a9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612913576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86166000908152600660205260408120556129386001886140e6565b84036129a75742600760189054906101000a900467ffffffffffffffff16846040015161296591906145e7565b67ffffffffffffffff1611156129a7576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080612a43906140ae565b9150506127e5565b50612a797f0000000000000000000000000000000000000000000000000000000000000000846112a36107fd565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612b68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b8c9190614110565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085473ffffffffffffffffffffffffffffffffffffffff1615801590612c0b575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15612c42576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd19190613f67565b15612d08576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d999190613e69565b905081811115612dd5576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612e11576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e5373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613194565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ec0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ee49190613e69565b600780549192506801000000000000000090910467ffffffffffffffff16906008612f0e83614087565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612f459291906146cd565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303613055576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26130b4565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931823388886040516130ab94939291906146dd565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261318f9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613502565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526131f29085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161310d565b50505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161327a919061474e565b600060405180830381855afa9150503d80600081146132b5576040519150601f19603f3d011682016040523d82523d6000602084013e6132ba565b606091505b5091509150816132ff576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250612416565b6124168161360e565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161338a919061474e565b600060405180830381855afa9150503d80600081146133c5576040519150601f19603f3d011682016040523d82523d6000602084013e6133ca565b606091505b5091509150816132ff576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250612416565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff861691613490919061474e565b600060405180830381855afa9150503d80600081146134cb576040519150601f19603f3d011682016040523d82523d6000602084013e6134d0565b606091505b50915091508180156134e3575080516020145b6134ee576012612416565b808060200190518101906124169190614760565b6000613564826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166137e49092919063ffffffff16565b80519091501561318f57808060200190518101906135829190613f67565b61318f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016117b5565b60606040825110613633578180602001905181019061362d9190614783565b92915050565b81516020036137ab5760005b602081108015613686575082818151811061365c5761365c613f89565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1561369d5780613695816140ae565b91505061363f565b806000036136e057505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff8111156136fb576136fb613b3e565b6040519080825280601f01601f191660200182016040528015613725576020820181803683370190505b50905060005b828110156137a35784818151811061374557613745613f89565b602001015160f81c60f81b82828151811061376257613762613f89565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061379b816140ae565b91505061372b565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60606124168484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051613818919061474e565b60006040518083038185875af1925050503d8060008114613855576040519150601f19603f3d011682016040523d82523d6000602084013e61385a565b606091505b509150915061386b87838387613876565b979650505050505050565b6060831561390c5782516000036139055773ffffffffffffffffffffffffffffffffffffffff85163b613905576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016117b5565b5081612416565b61241683838151156139215781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b591906139c3565b60005b83811015613970578181015183820152602001613958565b50506000910152565b60008151808452613991816020860160208601613955565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006139d66020830184613979565b9392505050565b67ffffffffffffffff811681146139f357600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff811681146139f357600080fd5b600080600060608486031215613a2d57600080fd5b8335613a38816139dd565b9250602084013591506040840135613a4f816139f6565b809150509250925092565b600060208284031215613a6c57600080fd5b81356139d6816139dd565b60008083601f840112613a8957600080fd5b50813567ffffffffffffffff811115613aa157600080fd5b6020830191508360208260051b8501011115613abc57600080fd5b9250929050565b600080600060408486031215613ad857600080fd5b833567ffffffffffffffff811115613aef57600080fd5b613afb86828701613a77565b9094509250506020840135613a4f816139f6565b600060208284031215613b2157600080fd5b81356139d6816139f6565b63ffffffff811681146139f357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613bb457613bb4613b3e565b604052919050565b600067ffffffffffffffff821115613bd657613bd6613b3e565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613c1357600080fd5b8135613c26613c2182613bbc565b613b6d565b818152846020838601011115613c3b57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613c7157600080fd5b8635613c7c816139f6565b95506020870135613c8c816139f6565b94506040870135613c9c81613b2c565b93506060870135613cac816139f6565b9250608087013567ffffffffffffffff80821115613cc957600080fd5b613cd58a838b01613c02565b935060a0890135915080821115613ceb57600080fd5b50613cf889828a01613c02565b9150509295509295509295565b60008060008060808587031215613d1b57600080fd5b8435613d2681613b2c565b93506020850135613d36816139f6565b92506040850135613d4681613b2c565b9150606085013567ffffffffffffffff811115613d6257600080fd5b613d6e87828801613c02565b91505092959194509250565b600060208284031215613d8c57600080fd5b813567ffffffffffffffff811115613da357600080fd5b61241684828501613c02565b60008060208385031215613dc257600080fd5b823567ffffffffffffffff811115613dd957600080fd5b613de585828601613a77565b90969095509350505050565b600080600060408486031215613e0657600080fd5b833567ffffffffffffffff80821115613e1e57600080fd5b818601915086601f830112613e3257600080fd5b813581811115613e4157600080fd5b876020828501011115613e5357600080fd5b6020928301989097509590910135949350505050565b600060208284031215613e7b57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613ed257613ed2613e82565b5092915050565b600082613f0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613f2857607f821691505b602082108103613f61577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215613f7957600080fd5b815180151581146139d657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613fec57600080fd5b9190910192915050565b60006080823603121561400857600080fd5b6040516080810167ffffffffffffffff828210818311171561402c5761402c613b3e565b81604052843591508082111561404157600080fd5b5061404e36828601613c02565b825250602083013560208201526040830135614069816139dd565b6040820152606083013561407c816139dd565b606082015292915050565b600067ffffffffffffffff8083168181036140a4576140a4613e82565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036140df576140df613e82565b5060010190565b8181038181111561362d5761362d613e82565b808202811582820484141761362d5761362d613e82565b60006020828403121561412257600080fd5b81516139d6816139dd565b6060815260006141406060830186613979565b82810360208401526141528186613979565b91505060ff83166040830152949350505050565b6000806040838503121561417957600080fd5b825161418481613b2c565b6020840151909250614195816139f6565b809150509250929050565b601f82111561318f57600081815260208120601f850160051c810160208610156141c75750805b601f850160051c820191505b818110156141e6578281556001016141d3565b505050505050565b815167ffffffffffffffff81111561420857614208613b3e565b61421c816142168454613f14565b846141a0565b602080601f83116001811461426f57600084156142395750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556141e6565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156142bc5788860151825594840194600190910190840161429d565b50858210156142f857878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60608152600061431b6060830186613979565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261439e60c0830184613979565b98975050505050505050565b61ffff818116838216019080821115613ed257613ed2613e82565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b166001840152875161442e816003860160208c01613955565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614471816017840160208b01613955565b808201915050818660f81b16601782015284519150614497826018830160208801613955565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614511816003860160208c01613955565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614554816017840160208b01613955565b808201915050818660f01b1660178201528451915061457a826019830160208801613955565b016019019998505050505050505050565b6000865161459d818460208b01613955565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b67ffffffffffffffff818116838216019080821115613ed257613ed2613e82565b8082018082111561362d5761362d613e82565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112613fec57600080fd5b60006060823603121561466157600080fd5b6040516060810167ffffffffffffffff828210818311171561468557614685613b3e565b81604052843591508082111561469a57600080fd5b506146a736828601613c02565b8252506020830135602082015260408301356146c2816139dd565b604082015292915050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b60008251613fec818460208701613955565b60006020828403121561477257600080fd5b815160ff811681146139d657600080fd5b60006020828403121561479557600080fd5b815167ffffffffffffffff8111156147ac57600080fd5b8201601f810184136147bd57600080fd5b80516147cb613c2182613bbc565b8181528560208385010111156147e057600080fd5b6147f1826020830160208601613955565b9594505050505056fea264697066735822122054d17ab62a9c80223317103957a799f93d742c7a9fb607c4af5b2f022a2d816e64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMV2Existent.json b/compiled-contracts/paris/PolygonZkEVMV2Existent.json index 9401a42cc..004282c72 100644 --- a/compiled-contracts/paris/PolygonZkEVMV2Existent.json +++ b/compiled-contracts/paris/PolygonZkEVMV2Existent.json @@ -74,6 +74,16 @@ "name": "ForceBatchesAlreadyActive", "type": "error" }, + { + "inputs": [], + "name": "ForceBatchesDescentralized", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchesNotAllowedOnEmergencyState", + "type": "error" + }, { "inputs": [], "name": "ForceBatchesOverflow", @@ -99,6 +109,11 @@ "name": "HaltTimeoutNotExpired", "type": "error" }, + { + "inputs": [], + "name": "HaltTimeoutNotExpiredAfterEmergencyState", + "type": "error" + }, { "inputs": [], "name": "HugeTokenMetadataNotSupported", @@ -272,12 +287,6 @@ "name": "AcceptAdminRole", "type": "event" }, - { - "anonymous": false, - "inputs": [], - "name": "ActivateForceBatches", - "type": "event" - }, { "anonymous": false, "inputs": [ @@ -373,6 +382,19 @@ "name": "SequenceForceBatches", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newForceBatchAddress", + "type": "address" + } + ], + "name": "SetForceBatchAddress", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -613,13 +635,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [], - "name": "activateForceBatches", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [], "name": "admin", @@ -677,6 +692,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "forceBatchAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "forceBatchTimeout", @@ -858,19 +886,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [], - "name": "isForcedBatchAllowed", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "lastAccInputHash", @@ -1068,6 +1083,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "newForceBatchAddress", + "type": "address" + } + ], + "name": "setForceBatchAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -1147,8 +1175,8 @@ "type": "function" } ], - "bytecode": "0x6101006040523480156200001257600080fd5b5060405162004b1d38038062004b1d833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e051614969620001b460003960008181610525015281816109c301528181610b30015281816112870152818161135001528181611372015281816115090152818161178601528181611d3f015281816124bf01528181612be401528181612cb20152612d9f0152600081816106740152818161144a015281816119e00152818161210f015261221701526000818161074b01528181610faa01528181611b950152612eea0152600081816107900152818161085b015281816112da015281816114200152612ebe01526149696000f3fe608060405234801561001057600080fd5b50600436106102f35760003560e01c80636ff512cc11610191578063c7fffd4b116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b146107d2578063f35dda47146107e5578063f851a440146107ed57600080fd5b8063d8d1091b14610778578063e46761c41461078b578063e7a7ed02146107b257600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610726578063d02103ca14610746578063d7bc90ff1461076d57600080fd5b8063c7fffd4b1461070b578063c89e42df1461071357600080fd5b8063a3c573eb11610145578063b0afe1541161011f578063b0afe154146106bc578063bb590708146106c8578063c754c7ed146106db57600080fd5b8063a3c573eb1461066f578063a652f26c14610696578063ada8f919146106a957600080fd5b80637a5460c5116101765780637a5460c5146106105780638c3d73011461064c5780639e0018771461065457600080fd5b80636ff512cc146105ea57806371257022146105fd57600080fd5b806340b5de6c1161024a578063542028d5116101fe578063676870d2116101d8578063676870d2146105b95780636b8616ce146105c15780636e05d2cd146105e157600080fd5b8063542028d5146105965780635e9145c91461059e5780635ec91958146105b157600080fd5b806349b7b8021161022f57806349b7b802146105205780634e4877061461054757806352bdeb6d1461055a57600080fd5b806340b5de6c146104a057806345605267146104f857600080fd5b806319d8ac61116102ac57806332c2d1531161028657806332c2d153146104285780633c351e101461043d5780633cbc795b1461046257600080fd5b806319d8ac611461039957806326782247146103c65780632b35b3ac1461040b57600080fd5b806305835f37116102dd57806305835f371461032e578063107bf28c1461037757806311e892d41461037f57600080fd5b8062d0295d146102f85780630350896314610313575b600080fd5b610300610813565b6040519081526020015b60405180910390f35b61031b602081565b60405161ffff909116815260200161030a565b61036a6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161030a9190613a56565b61036a610933565b61038760f981565b60405160ff909116815260200161030a565b6007546103ad9067ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161030a565b6001546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161030a565b6008546104189060ff1681565b604051901515815260200161030a565b61043b610436366004613aab565b6109c1565b005b6008546103e690610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60085461048b907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161030a565b6104c77fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161030a565b6007546103ad90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b61043b610555366004613aed565b610a90565b61036a6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61036a610caa565b61043b6105ac366004613b56565b610cb7565b61043b6115d0565b61031b601f81565b6103006105cf366004613aed565b60066020526000908152604090205481565b61030060055481565b61043b6105f8366004613ba2565b6116ba565b61043b61060b366004613ceb565b611784565b61036a6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61043b611f3b565b6103e673a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b61036a6106a4366004613d98565b61200e565b61043b6106b7366004613ba2565b6123f3565b6103006405ca1ab1e081565b61043b6106d6366004613e0d565b6124bd565b6007546103ad907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61038760e481565b61043b610721366004613eb3565b612795565b6002546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b610300635ca1ab1e81565b61043b610786366004613ee8565b612828565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b6007546103ad9068010000000000000000900467ffffffffffffffff1681565b61043b6107e0366004613f2a565b612d5f565b610387601b81565b6000546103e69062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156108a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c69190613fa2565b6007549091506000906109059067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613fea565b67ffffffffffffffff169050806000036109225760009250505090565b61092c8183614012565b9250505090565b600480546109409061404d565b80601f016020809104026020016040519081016040528092919081815260200182805461096c9061404d565b80156109b95780601f1061098e576101008083540402835291602001916109b9565b820191906000526020600020905b81548152906001019060200180831161099c57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a30576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a8391815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ae7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b2e576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbd91906140a0565b610c265760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c26576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546109409061404d565b60025473ffffffffffffffffffffffffffffffffffffffff163314610d08576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003610d44576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610d80576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156111bc576000898983818110610dc957610dc96140c2565b9050602002810190610ddb91906140f1565b610de49061412f565b8051805160209091012060608201519192509067ffffffffffffffff1615610f675785610e10816141c0565b96505060008183602001518460600151604051602001610e6893929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114610ef1576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015610f47576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86166000908152600660205260408120556110a4565b60208201511580159061102e575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015611008573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102c9190613fa2565b155b15611065576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156110a4576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806110d7575042826040015167ffffffffffffffff16115b1561110e576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519650505080806111b4906141e7565b915050610dad565b5060075467ffffffffffffffff6801000000000000000090910481169084161115611213576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691909117909155600583905585908281169085161461134a57600061126a8386613fea565b905061128067ffffffffffffffff82168361421f565b91506113017f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166112b9610813565b6112c39190614232565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016919061314e565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611448337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ff9190613fa2565b6114099190614232565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613227565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156114b057600080fd5b505af11580156114c4573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af1158015611568573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158c9190614249565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611627576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615611664576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611711576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c9f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146117f3576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156118135750600054600160ff909116105b8061182d5750303b15801561182d575060005460ff166001145b6118be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561191c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611b31576119438561328b565b61194c8661339b565b611955876134a2565b60405160200161196793929190614266565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611a28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4c919061429f565b915091508163ffffffff16600014611ae957600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff851602179055611b2e565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b600854600090611b7e908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff168561200e565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c229190613fa2565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611d9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc19190614249565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611e539190614327565b506004611e608982614327565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611ec093929190614441565b60405180910390a15050505050508015611f3257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611f8c576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa60008760405160240161204296959493929190614480565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060906000036121935760f9601f83516120d791906144e3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e48760405160200161217d97969594939291906144fe565b6040516020818303038152906040529050612297565b815161ffff10156121d0576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96121df6020836144e3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b9000000000000000000000000000000000000000000000000000000000000815250858860405160200161228497969594939291906145e1565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156122f8573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612370576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906123b69084906405ca1ab1e090635ca1ab1e90601b907fff00000000000000000000000000000000000000000000000000000000000000906020016146c4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461244a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c9f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461252c576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff161580801561254c5750600054600160ff909116105b806125665750303b158015612566575060005460ff166001145b6125f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016118b5565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561265057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8a81169190910291909117909155600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001691881691909117905560036126d88682614327565b5060046126e58582614327565b506005839055600780547a06978000000000000000000000000000000000000000000000000077ffffffffffffffffffffffffffffffff000000000000000090911667ffffffffffffffff8516171790558015611f3257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611f29565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146127ec576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036127f88282614327565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c9f9190613a56565b60085460ff16612864576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036128a0576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156128dc576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612917918491700100000000000000000000000000000000900416614720565b111561294f576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015612bde576000868683818110612994576129946140c2565b90506020028101906129a69190614733565b6129af90614767565b9050836129bb816141c0565b82518051602091820120818501516040808701519051949950919450600093612a1d9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612aa6576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055612acb60018861421f565b8403612b3a5742600760189054906101000a900467ffffffffffffffff168460400151612af891906147e5565b67ffffffffffffffff161115612b3a576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080612bd6906141e7565b915050612978565b50612c0c7f0000000000000000000000000000000000000000000000000000000000000000846112b9610813565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612cfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d1f9190614249565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612d9b576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e2c9190613fa2565b905081811115612e68576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612ea4576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ee673ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613227565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f779190613fa2565b600780549192506801000000000000000090910467ffffffffffffffff16906008612fa1836141c0565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612fd8929190614806565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff16600090815260069093529120553233036130e8576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613147565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9318233888860405161313e9493929190614816565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526132229084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613595565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526132859085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016131a0565b50505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161330d9190614887565b600060405180830381855afa9150503d8060008114613348576040519150601f19603f3d011682016040523d82523d6000602084013e61334d565b606091505b509150915081613392576040518060400160405280600781526020017f4e4f5f4e414d45000000000000000000000000000000000000000000000000008152506123eb565b6123eb816136a1565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161341d9190614887565b600060405180830381855afa9150503d8060008114613458576040519150601f19603f3d011682016040523d82523d6000602084013e61345d565b606091505b509150915081613392576040518060400160405280600981526020017f4e4f5f53594d424f4c00000000000000000000000000000000000000000000008152506123eb565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8616916135239190614887565b600060405180830381855afa9150503d806000811461355e576040519150601f19603f3d011682016040523d82523d6000602084013e613563565b606091505b5091509150818015613576575080516020145b6135815760126123eb565b808060200190518101906123eb9190614899565b60006135f7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166138779092919063ffffffff16565b805190915015613222578080602001905181019061361591906140a0565b613222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016118b5565b606060408251106136c657818060200190518101906136c091906148bc565b92915050565b815160200361383e5760005b60208110801561371957508281815181106136ef576136ef6140c2565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b156137305780613728816141e7565b9150506136d2565b8060000361377357505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111561378e5761378e613bd1565b6040519080825280601f01601f1916602001820160405280156137b8576020820181803683370190505b50905060005b82811015613836578481815181106137d8576137d86140c2565b602001015160f81c60f81b8282815181106137f5576137f56140c2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061382e816141e7565b9150506137be565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60606123eb8484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516138ab9190614887565b60006040518083038185875af1925050503d80600081146138e8576040519150601f19603f3d011682016040523d82523d6000602084013e6138ed565b606091505b50915091506138fe87838387613909565b979650505050505050565b6060831561399f5782516000036139985773ffffffffffffffffffffffffffffffffffffffff85163b613998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016118b5565b50816123eb565b6123eb83838151156139b45781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b59190613a56565b60005b83811015613a035781810151838201526020016139eb565b50506000910152565b60008151808452613a248160208601602086016139e8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613a696020830184613a0c565b9392505050565b67ffffffffffffffff81168114613a8657600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613a8657600080fd5b600080600060608486031215613ac057600080fd5b8335613acb81613a70565b9250602084013591506040840135613ae281613a89565b809150509250925092565b600060208284031215613aff57600080fd5b8135613a6981613a70565b60008083601f840112613b1c57600080fd5b50813567ffffffffffffffff811115613b3457600080fd5b6020830191508360208260051b8501011115613b4f57600080fd5b9250929050565b600080600060408486031215613b6b57600080fd5b833567ffffffffffffffff811115613b8257600080fd5b613b8e86828701613b0a565b9094509250506020840135613ae281613a89565b600060208284031215613bb457600080fd5b8135613a6981613a89565b63ffffffff81168114613a8657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613c4757613c47613bd1565b604052919050565b600067ffffffffffffffff821115613c6957613c69613bd1565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613ca657600080fd5b8135613cb9613cb482613c4f565b613c00565b818152846020838601011115613cce57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613d0457600080fd5b8635613d0f81613a89565b95506020870135613d1f81613a89565b94506040870135613d2f81613bbf565b93506060870135613d3f81613a89565b9250608087013567ffffffffffffffff80821115613d5c57600080fd5b613d688a838b01613c95565b935060a0890135915080821115613d7e57600080fd5b50613d8b89828a01613c95565b9150509295509295509295565b60008060008060808587031215613dae57600080fd5b8435613db981613bbf565b93506020850135613dc981613a89565b92506040850135613dd981613bbf565b9150606085013567ffffffffffffffff811115613df557600080fd5b613e0187828801613c95565b91505092959194509250565b60008060008060008060c08789031215613e2657600080fd5b8635613e3181613a89565b95506020870135613e4181613a89565b9450604087013567ffffffffffffffff80821115613e5e57600080fd5b613e6a8a838b01613c95565b95506060890135915080821115613e8057600080fd5b50613e8d89828a01613c95565b9350506080870135915060a0870135613ea581613a70565b809150509295509295509295565b600060208284031215613ec557600080fd5b813567ffffffffffffffff811115613edc57600080fd5b6123eb84828501613c95565b60008060208385031215613efb57600080fd5b823567ffffffffffffffff811115613f1257600080fd5b613f1e85828601613b0a565b90969095509350505050565b600080600060408486031215613f3f57600080fd5b833567ffffffffffffffff80821115613f5757600080fd5b818601915086601f830112613f6b57600080fd5b813581811115613f7a57600080fd5b876020828501011115613f8c57600080fd5b6020928301989097509590910135949350505050565b600060208284031215613fb457600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff82811682821603908082111561400b5761400b613fbb565b5092915050565b600082614048577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061406157607f821691505b60208210810361409a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000602082840312156140b257600080fd5b81518015158114613a6957600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261412557600080fd5b9190910192915050565b60006080823603121561414157600080fd5b6040516080810167ffffffffffffffff828210818311171561416557614165613bd1565b81604052843591508082111561417a57600080fd5b5061418736828601613c95565b8252506020830135602082015260408301356141a281613a70565b604082015260608301356141b581613a70565b606082015292915050565b600067ffffffffffffffff8083168181036141dd576141dd613fbb565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361421857614218613fbb565b5060010190565b818103818111156136c0576136c0613fbb565b80820281158282048414176136c0576136c0613fbb565b60006020828403121561425b57600080fd5b8151613a6981613a70565b6060815260006142796060830186613a0c565b828103602084015261428b8186613a0c565b91505060ff83166040830152949350505050565b600080604083850312156142b257600080fd5b82516142bd81613bbf565b60208401519092506142ce81613a89565b809150509250929050565b601f82111561322257600081815260208120601f850160051c810160208610156143005750805b601f850160051c820191505b8181101561431f5782815560010161430c565b505050505050565b815167ffffffffffffffff81111561434157614341613bd1565b6143558161434f845461404d565b846142d9565b602080601f8311600181146143a857600084156143725750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561431f565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156143f5578886015182559484019460019091019084016143d6565b508582101561443157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006144546060830186613a0c565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a08301526144d760c0830184613a0c565b98975050505050505050565b61ffff81811683821601908082111561400b5761400b613fbb565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614567816003860160208c016139e8565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516145aa816017840160208b016139e8565b808201915050818660f81b166017820152845191506145d08260188301602088016139e8565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b166001840152875161464a816003860160208c016139e8565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161468d816017840160208b016139e8565b808201915050818660f01b166017820152845191506146b38260198301602088016139e8565b016019019998505050505050505050565b600086516146d6818460208b016139e8565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b808201808211156136c0576136c0613fbb565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261412557600080fd5b60006060823603121561477957600080fd5b6040516060810167ffffffffffffffff828210818311171561479d5761479d613bd1565b8160405284359150808211156147b257600080fd5b506147bf36828601613c95565b8252506020830135602082015260408301356147da81613a70565b604082015292915050565b67ffffffffffffffff81811683821601908082111561400b5761400b613fbb565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b600082516141258184602087016139e8565b6000602082840312156148ab57600080fd5b815160ff81168114613a6957600080fd5b6000602082840312156148ce57600080fd5b815167ffffffffffffffff8111156148e557600080fd5b8201601f810184136148f657600080fd5b8051614904613cb482613c4f565b81815285602083850101111561491957600080fd5b61492a8260208301602086016139e8565b9594505050505056fea2646970667358221220533ac3b5c59a13a0403cdbad383ed7f87a2f4bb1b36f2a54136e8564861b6e8564736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102f35760003560e01c80636ff512cc11610191578063c7fffd4b116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b146107d2578063f35dda47146107e5578063f851a440146107ed57600080fd5b8063d8d1091b14610778578063e46761c41461078b578063e7a7ed02146107b257600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610726578063d02103ca14610746578063d7bc90ff1461076d57600080fd5b8063c7fffd4b1461070b578063c89e42df1461071357600080fd5b8063a3c573eb11610145578063b0afe1541161011f578063b0afe154146106bc578063bb590708146106c8578063c754c7ed146106db57600080fd5b8063a3c573eb1461066f578063a652f26c14610696578063ada8f919146106a957600080fd5b80637a5460c5116101765780637a5460c5146106105780638c3d73011461064c5780639e0018771461065457600080fd5b80636ff512cc146105ea57806371257022146105fd57600080fd5b806340b5de6c1161024a578063542028d5116101fe578063676870d2116101d8578063676870d2146105b95780636b8616ce146105c15780636e05d2cd146105e157600080fd5b8063542028d5146105965780635e9145c91461059e5780635ec91958146105b157600080fd5b806349b7b8021161022f57806349b7b802146105205780634e4877061461054757806352bdeb6d1461055a57600080fd5b806340b5de6c146104a057806345605267146104f857600080fd5b806319d8ac61116102ac57806332c2d1531161028657806332c2d153146104285780633c351e101461043d5780633cbc795b1461046257600080fd5b806319d8ac611461039957806326782247146103c65780632b35b3ac1461040b57600080fd5b806305835f37116102dd57806305835f371461032e578063107bf28c1461037757806311e892d41461037f57600080fd5b8062d0295d146102f85780630350896314610313575b600080fd5b610300610813565b6040519081526020015b60405180910390f35b61031b602081565b60405161ffff909116815260200161030a565b61036a6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161030a9190613a56565b61036a610933565b61038760f981565b60405160ff909116815260200161030a565b6007546103ad9067ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161030a565b6001546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161030a565b6008546104189060ff1681565b604051901515815260200161030a565b61043b610436366004613aab565b6109c1565b005b6008546103e690610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60085461048b907501000000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161030a565b6104c77fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161030a565b6007546103ad90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b61043b610555366004613aed565b610a90565b61036a6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61036a610caa565b61043b6105ac366004613b56565b610cb7565b61043b6115d0565b61031b601f81565b6103006105cf366004613aed565b60066020526000908152604090205481565b61030060055481565b61043b6105f8366004613ba2565b6116ba565b61043b61060b366004613ceb565b611784565b61036a6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61043b611f3b565b6103e673a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b61036a6106a4366004613d98565b61200e565b61043b6106b7366004613ba2565b6123f3565b6103006405ca1ab1e081565b61043b6106d6366004613e0d565b6124bd565b6007546103ad907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61038760e481565b61043b610721366004613eb3565b612795565b6002546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b610300635ca1ab1e81565b61043b610786366004613ee8565b612828565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b6007546103ad9068010000000000000000900467ffffffffffffffff1681565b61043b6107e0366004613f2a565b612d5f565b610387601b81565b6000546103e69062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156108a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c69190613fa2565b6007549091506000906109059067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613fea565b67ffffffffffffffff169050806000036109225760009250505090565b61092c8183614012565b9250505090565b600480546109409061404d565b80601f016020809104026020016040519081016040528092919081815260200182805461096c9061404d565b80156109b95780601f1061098e576101008083540402835291602001916109b9565b820191906000526020600020905b81548152906001019060200180831161099c57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a30576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a8391815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ae7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b2e576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbd91906140a0565b610c265760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c26576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546109409061404d565b60025473ffffffffffffffffffffffffffffffffffffffff163314610d08576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003610d44576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610d80576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156111bc576000898983818110610dc957610dc96140c2565b9050602002810190610ddb91906140f1565b610de49061412f565b8051805160209091012060608201519192509067ffffffffffffffff1615610f675785610e10816141c0565b96505060008183602001518460600151604051602001610e6893929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114610ef1576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015610f47576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86166000908152600660205260408120556110a4565b60208201511580159061102e575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015611008573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102c9190613fa2565b155b15611065576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156110a4576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806110d7575042826040015167ffffffffffffffff16115b1561110e576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519650505080806111b4906141e7565b915050610dad565b5060075467ffffffffffffffff6801000000000000000090910481169084161115611213576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff86811691909117909155600583905585908281169085161461134a57600061126a8386613fea565b905061128067ffffffffffffffff82168361421f565b91506113017f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166112b9610813565b6112c39190614232565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016919061314e565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611448337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ff9190613fa2565b6114099190614232565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613227565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156114b057600080fd5b505af11580156114c4573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af1158015611568573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158c9190614249565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611627576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085460ff1615611664576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f90600090a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611711576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c9f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146117f3576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156118135750600054600160ff909116105b8061182d5750303b15801561182d575060005460ff166001145b6118be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561191c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611b31576119438561328b565b61194c8661339b565b611955876134a2565b60405160200161196793929190614266565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611a28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4c919061429f565b915091508163ffffffff16600014611ae957600880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416027fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff1617750100000000000000000000000000000000000000000063ffffffff851602179055611b2e565b600880547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8a16021790555b50505b600854600090611b7e908890610100810473ffffffffffffffffffffffffffffffffffffffff16907501000000000000000000000000000000000000000000900463ffffffff168561200e565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c229190613fa2565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611d9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc19190614249565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611e539190614327565b506004611e608982614327565b5062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611ec093929190614441565b60405180910390a15050505050508015611f3257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611f8c576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa60008760405160240161204296959493929190614480565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060906000036121935760f9601f83516120d791906144e3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e48760405160200161217d97969594939291906144fe565b6040516020818303038152906040529050612297565b815161ffff10156121d0576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96121df6020836144e3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b9000000000000000000000000000000000000000000000000000000000000815250858860405160200161228497969594939291906145e1565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156122f8573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612370576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906123b69084906405ca1ab1e090635ca1ab1e90601b907fff00000000000000000000000000000000000000000000000000000000000000906020016146c4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461244a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c9f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461252c576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff161580801561254c5750600054600160ff909116105b806125665750303b158015612566575060005460ff166001145b6125f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016118b5565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561265057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8a81169190910291909117909155600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001691881691909117905560036126d88682614327565b5060046126e58582614327565b506005839055600780547a06978000000000000000000000000000000000000000000000000077ffffffffffffffffffffffffffffffff000000000000000090911667ffffffffffffffff8516171790558015611f3257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611f29565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146127ec576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036127f88282614327565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c9f9190613a56565b60085460ff16612864576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036128a0576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156128dc576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612917918491700100000000000000000000000000000000900416614720565b111561294f576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015612bde576000868683818110612994576129946140c2565b90506020028101906129a69190614733565b6129af90614767565b9050836129bb816141c0565b82518051602091820120818501516040808701519051949950919450600093612a1d9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612aa6576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055612acb60018861421f565b8403612b3a5742600760189054906101000a900467ffffffffffffffff168460400151612af891906147e5565b67ffffffffffffffff161115612b3a576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080612bd6906141e7565b915050612978565b50612c0c7f0000000000000000000000000000000000000000000000000000000000000000846112b9610813565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612cfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d1f9190614249565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085460ff16612d9b576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e2c9190613fa2565b905081811115612e68576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612ea4576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ee673ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613227565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f779190613fa2565b600780549192506801000000000000000090910467ffffffffffffffff16906008612fa1836141c0565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612fd8929190614806565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff16600090815260069093529120553233036130e8576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613147565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9318233888860405161313e9493929190614816565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526132229084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613595565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526132859085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016131a0565b50505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161330d9190614887565b600060405180830381855afa9150503d8060008114613348576040519150601f19603f3d011682016040523d82523d6000602084013e61334d565b606091505b509150915081613392576040518060400160405280600781526020017f4e4f5f4e414d45000000000000000000000000000000000000000000000000008152506123eb565b6123eb816136a1565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161341d9190614887565b600060405180830381855afa9150503d8060008114613458576040519150601f19603f3d011682016040523d82523d6000602084013e61345d565b606091505b509150915081613392576040518060400160405280600981526020017f4e4f5f53594d424f4c00000000000000000000000000000000000000000000008152506123eb565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8616916135239190614887565b600060405180830381855afa9150503d806000811461355e576040519150601f19603f3d011682016040523d82523d6000602084013e613563565b606091505b5091509150818015613576575080516020145b6135815760126123eb565b808060200190518101906123eb9190614899565b60006135f7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166138779092919063ffffffff16565b805190915015613222578080602001905181019061361591906140a0565b613222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016118b5565b606060408251106136c657818060200190518101906136c091906148bc565b92915050565b815160200361383e5760005b60208110801561371957508281815181106136ef576136ef6140c2565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b156137305780613728816141e7565b9150506136d2565b8060000361377357505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111561378e5761378e613bd1565b6040519080825280601f01601f1916602001820160405280156137b8576020820181803683370190505b50905060005b82811015613836578481815181106137d8576137d86140c2565b602001015160f81c60f81b8282815181106137f5576137f56140c2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061382e816141e7565b9150506137be565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60606123eb8484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516138ab9190614887565b60006040518083038185875af1925050503d80600081146138e8576040519150601f19603f3d011682016040523d82523d6000602084013e6138ed565b606091505b50915091506138fe87838387613909565b979650505050505050565b6060831561399f5782516000036139985773ffffffffffffffffffffffffffffffffffffffff85163b613998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016118b5565b50816123eb565b6123eb83838151156139b45781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b59190613a56565b60005b83811015613a035781810151838201526020016139eb565b50506000910152565b60008151808452613a248160208601602086016139e8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613a696020830184613a0c565b9392505050565b67ffffffffffffffff81168114613a8657600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613a8657600080fd5b600080600060608486031215613ac057600080fd5b8335613acb81613a70565b9250602084013591506040840135613ae281613a89565b809150509250925092565b600060208284031215613aff57600080fd5b8135613a6981613a70565b60008083601f840112613b1c57600080fd5b50813567ffffffffffffffff811115613b3457600080fd5b6020830191508360208260051b8501011115613b4f57600080fd5b9250929050565b600080600060408486031215613b6b57600080fd5b833567ffffffffffffffff811115613b8257600080fd5b613b8e86828701613b0a565b9094509250506020840135613ae281613a89565b600060208284031215613bb457600080fd5b8135613a6981613a89565b63ffffffff81168114613a8657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613c4757613c47613bd1565b604052919050565b600067ffffffffffffffff821115613c6957613c69613bd1565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613ca657600080fd5b8135613cb9613cb482613c4f565b613c00565b818152846020838601011115613cce57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613d0457600080fd5b8635613d0f81613a89565b95506020870135613d1f81613a89565b94506040870135613d2f81613bbf565b93506060870135613d3f81613a89565b9250608087013567ffffffffffffffff80821115613d5c57600080fd5b613d688a838b01613c95565b935060a0890135915080821115613d7e57600080fd5b50613d8b89828a01613c95565b9150509295509295509295565b60008060008060808587031215613dae57600080fd5b8435613db981613bbf565b93506020850135613dc981613a89565b92506040850135613dd981613bbf565b9150606085013567ffffffffffffffff811115613df557600080fd5b613e0187828801613c95565b91505092959194509250565b60008060008060008060c08789031215613e2657600080fd5b8635613e3181613a89565b95506020870135613e4181613a89565b9450604087013567ffffffffffffffff80821115613e5e57600080fd5b613e6a8a838b01613c95565b95506060890135915080821115613e8057600080fd5b50613e8d89828a01613c95565b9350506080870135915060a0870135613ea581613a70565b809150509295509295509295565b600060208284031215613ec557600080fd5b813567ffffffffffffffff811115613edc57600080fd5b6123eb84828501613c95565b60008060208385031215613efb57600080fd5b823567ffffffffffffffff811115613f1257600080fd5b613f1e85828601613b0a565b90969095509350505050565b600080600060408486031215613f3f57600080fd5b833567ffffffffffffffff80821115613f5757600080fd5b818601915086601f830112613f6b57600080fd5b813581811115613f7a57600080fd5b876020828501011115613f8c57600080fd5b6020928301989097509590910135949350505050565b600060208284031215613fb457600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff82811682821603908082111561400b5761400b613fbb565b5092915050565b600082614048577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061406157607f821691505b60208210810361409a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000602082840312156140b257600080fd5b81518015158114613a6957600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261412557600080fd5b9190910192915050565b60006080823603121561414157600080fd5b6040516080810167ffffffffffffffff828210818311171561416557614165613bd1565b81604052843591508082111561417a57600080fd5b5061418736828601613c95565b8252506020830135602082015260408301356141a281613a70565b604082015260608301356141b581613a70565b606082015292915050565b600067ffffffffffffffff8083168181036141dd576141dd613fbb565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361421857614218613fbb565b5060010190565b818103818111156136c0576136c0613fbb565b80820281158282048414176136c0576136c0613fbb565b60006020828403121561425b57600080fd5b8151613a6981613a70565b6060815260006142796060830186613a0c565b828103602084015261428b8186613a0c565b91505060ff83166040830152949350505050565b600080604083850312156142b257600080fd5b82516142bd81613bbf565b60208401519092506142ce81613a89565b809150509250929050565b601f82111561322257600081815260208120601f850160051c810160208610156143005750805b601f850160051c820191505b8181101561431f5782815560010161430c565b505050505050565b815167ffffffffffffffff81111561434157614341613bd1565b6143558161434f845461404d565b846142d9565b602080601f8311600181146143a857600084156143725750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561431f565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156143f5578886015182559484019460019091019084016143d6565b508582101561443157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006144546060830186613a0c565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a08301526144d760c0830184613a0c565b98975050505050505050565b61ffff81811683821601908082111561400b5761400b613fbb565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614567816003860160208c016139e8565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516145aa816017840160208b016139e8565b808201915050818660f81b166017820152845191506145d08260188301602088016139e8565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b166001840152875161464a816003860160208c016139e8565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161468d816017840160208b016139e8565b808201915050818660f01b166017820152845191506146b38260198301602088016139e8565b016019019998505050505050505050565b600086516146d6818460208b016139e8565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b808201808211156136c0576136c0613fbb565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261412557600080fd5b60006060823603121561477957600080fd5b6040516060810167ffffffffffffffff828210818311171561479d5761479d613bd1565b8160405284359150808211156147b257600080fd5b506147bf36828601613c95565b8252506020830135602082015260408301356147da81613a70565b604082015292915050565b67ffffffffffffffff81811683821601908082111561400b5761400b613fbb565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b600082516141258184602087016139e8565b6000602082840312156148ab57600080fd5b815160ff81168114613a6957600080fd5b6000602082840312156148ce57600080fd5b815167ffffffffffffffff8111156148e557600080fd5b8201601f810184136148f657600080fd5b8051614904613cb482613c4f565b81815285602083850101111561491957600080fd5b61492a8260208301602086016139e8565b9594505050505056fea2646970667358221220533ac3b5c59a13a0403cdbad383ed7f87a2f4bb1b36f2a54136e8564861b6e8564736f6c63430008140033", + "bytecode": "0x6101006040523480156200001257600080fd5b5060405162004dcf38038062004dcf833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e051614c0d620001c260003960008181610522015281816109cb01528181610b380152818161128f015281816113580152818161137a01528181611511015281816116a401528181611c2f015281816125090152818161292f01528181612d8801528181612e5601528181612f7b015261304301526000818161067c01528181611452015281816118fe01528181612159015261226101526000818161075301528181610fb201528181611a85015261318e01526000818161079801528181610863015281816112e20152818161142801526131620152614c0d6000f3fe608060405234801561001057600080fd5b50600436106102f35760003560e01c80637125702211610191578063c7fffd4b116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b146107da578063f35dda47146107ed578063f851a440146107f557600080fd5b8063d8d1091b14610780578063e46761c414610793578063e7a7ed02146107ba57600080fd5b8063cfa8ed47116100c8578063cfa8ed471461072e578063d02103ca1461074e578063d7bc90ff1461077557600080fd5b8063c7fffd4b14610713578063c89e42df1461071b57600080fd5b8063a3c573eb11610145578063b0afe1541161011f578063b0afe154146106c4578063bb590708146106d0578063c754c7ed146106e357600080fd5b8063a3c573eb14610677578063a652f26c1461069e578063ada8f919146106b157600080fd5b80638c3d7301116101765780638c3d73011461064157806391cafe32146106495780639e0018771461065c57600080fd5b806371257022146105f25780637a5460c51461060557600080fd5b806340b5de6c1161024a578063542028d5116101fe5780636b8616ce116101d85780636b8616ce146105b65780636e05d2cd146105d65780636ff512cc146105df57600080fd5b8063542028d5146105935780635e9145c91461059b578063676870d2146105ae57600080fd5b806349b7b8021161022f57806349b7b8021461051d5780634e4877061461054457806352bdeb6d1461055757600080fd5b806340b5de6c1461049d57806345605267146104f557600080fd5b806319d8ac61116102ac57806332c2d1531161028657806332c2d1531461042b5780633c351e10146104405780633cbc795b1461046057600080fd5b806319d8ac611461039957806326782247146103c65780632c111c061461040b57600080fd5b806305835f37116102dd57806305835f371461032e578063107bf28c1461037757806311e892d41461037f57600080fd5b8062d0295d146102f85780630350896314610313575b600080fd5b61030061081b565b6040519081526020015b60405180910390f35b61031b602081565b60405161ffff909116815260200161030a565b61036a6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161030a9190613cfa565b61036a61093b565b61038760f981565b60405160ff909116815260200161030a565b6007546103ad9067ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161030a565b6001546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161030a565b6008546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b61043e610439366004613d4f565b6109c9565b005b6009546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104889074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161030a565b6104c47fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161030a565b6007546103ad90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b61043e610552366004613d91565b610a98565b61036a6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61036a610cb2565b61043e6105a9366004613dfa565b610cbf565b61031b601f81565b6103006105c4366004613d91565b60066020526000908152604090205481565b61030060055481565b61043e6105ed366004613e46565b6115d8565b61043e610600366004613f8f565b6116a2565b61036a6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61043e611e6c565b61043e610657366004613e46565b611f3f565b6103e673a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b61036a6106ac36600461403c565b612058565b61043e6106bf366004613e46565b61243d565b6103006405ca1ab1e081565b61043e6106de3660046140b1565b612507565b6007546103ad907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61038760e481565b61043e610729366004614157565b61281f565b6002546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b610300635ca1ab1e81565b61043e61078e36600461418c565b6128b2565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b6007546103ad9068010000000000000000900467ffffffffffffffff1681565b61043e6107e83660046141ce565b612f03565b610387601b81565b6000546103e69062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156108aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ce9190614246565b60075490915060009061090d9067ffffffffffffffff70010000000000000000000000000000000082048116916801000000000000000090041661428e565b67ffffffffffffffff1690508060000361092a5760009250505090565b61093481836142b6565b9250505090565b60048054610948906142f1565b80601f0160208091040260200160405190810160405280929190818152602001828054610974906142f1565b80156109c15780601f10610996576101008083540402835291602001916109c1565b820191906000526020600020905b8154815290600101906020018083116109a457829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a38576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a8b91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610aef576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b36576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc59190614344565b610c2e5760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c2e576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b60038054610948906142f1565b60025473ffffffffffffffffffffffffffffffffffffffff163314610d10576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003610d4c576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610d88576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156111c4576000898983818110610dd157610dd1614366565b9050602002810190610de39190614395565b610dec906143d3565b8051805160209091012060608201519192509067ffffffffffffffff1615610f6f5785610e1881614464565b96505060008183602001518460600151604051602001610e7093929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114610ef9576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015610f4f576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86166000908152600660205260408120556110ac565b602082015115801590611036575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015611010573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110349190614246565b155b1561106d576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156110ac576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806110df575042826040015167ffffffffffffffff16115b15611116576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519650505080806111bc9061448b565b915050610db5565b5060075467ffffffffffffffff680100000000000000009091048116908416111561121b576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff868116919091179091556005839055859082811690851614611352576000611272838661428e565b905061128867ffffffffffffffff8216836144c3565b91506113097f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166112c161081b565b6112cb91906144d6565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691906133f2565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611450337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114079190614246565b61141191906144d6565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906134cb565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156114b857600080fd5b505af11580156114cc573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af1158015611570573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159491906144ed565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461162f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610ca7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611711576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156117315750600054600160ff909116105b8061174b5750303b15801561174b575060005460ff166001145b6117dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561183a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611a26576118618561352f565b61186a8661363f565b61187387613746565b6040516020016118859392919061450a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611946573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196a9190614543565b915091508163ffffffff166000146119e2576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055611a23565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b600954600090611a6e90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685612058565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611aee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b129190614246565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611c8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb191906144ed565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611d4391906145cb565b506004611d5089826145cb565b508c600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611df1939291906146e5565b60405180910390a15050505050508015611e6357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611ebd576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611f96576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611fe5576040517fd40d91c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610ca7565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa60008760405160240161208c96959493929190614724565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060906000036121dd5760f9601f83516121219190614787565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e4876040516020016121c797969594939291906147a2565b60405160208183030381529060405290506122e1565b815161ffff101561221a576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9612229602083614787565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016122ce9796959493929190614885565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015612342573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166123ba576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906124009084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614968565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612494576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610ca7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314612576576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156125965750600054600160ff909116105b806125b05750303b1580156125b0575060005460ff166001145b61263c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016117d3565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561269a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8a81169190910291909117909155600280547fffffffffffffffffffffffff000000000000000000000000000000000000000016918816919091179055600361272286826145cb565b50600461272f85826145cb565b50600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff891617905560058390556007805467ffffffffffffffff841677ffffffffffffffffffffffffffffffff0000000000000000909116177a0697800000000000000000000000000000000000000000000000001790558015611e6357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611e5a565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612876576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361288282826145cb565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610ca79190613cfa565b60085473ffffffffffffffffffffffffffffffffffffffff16158015906128f1575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15612928576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612998573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129bc91906144ed565b6129c691906149c4565b67ffffffffffffffff161115612a08576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003612a44576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612a80576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612abb9184917001000000000000000000000000000000009004166149e5565b1115612af3576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015612d82576000868683818110612b3857612b38614366565b9050602002810190612b4a91906149f8565b612b5390614a2c565b905083612b5f81614464565b82518051602091820120818501516040808701519051949950919450600093612bc19386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612c4a576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055612c6f6001886144c3565b8403612cde5742600760189054906101000a900467ffffffffffffffff168460400151612c9c91906149c4565b67ffffffffffffffff161115612cde576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080612d7a9061448b565b915050612b1c565b50612db07f0000000000000000000000000000000000000000000000000000000000000000846112c161081b565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612e9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec391906144ed565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085473ffffffffffffffffffffffffffffffffffffffff1615801590612f42575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15612f79576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fe4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130089190614344565b1561303f576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130d09190614246565b90508181111561310c576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115613148576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61318a73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846134cb565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061321b9190614246565b600780549192506801000000000000000090910467ffffffffffffffff1690600861324583614464565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050848460405161327c929190614aaa565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff166000908152600690935291205532330361338c576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26133eb565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931823388886040516133e29493929190614aba565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526134c69084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613839565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526135299085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613444565b50505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916135b19190614b2b565b600060405180830381855afa9150503d80600081146135ec576040519150601f19603f3d011682016040523d82523d6000602084013e6135f1565b606091505b509150915081613636576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250612435565b61243581613945565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916136c19190614b2b565b600060405180830381855afa9150503d80600081146136fc576040519150601f19603f3d011682016040523d82523d6000602084013e613701565b606091505b509150915081613636576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250612435565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8616916137c79190614b2b565b600060405180830381855afa9150503d8060008114613802576040519150601f19603f3d011682016040523d82523d6000602084013e613807565b606091505b509150915081801561381a575080516020145b613825576012612435565b808060200190518101906124359190614b3d565b600061389b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613b1b9092919063ffffffff16565b8051909150156134c657808060200190518101906138b99190614344565b6134c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016117d3565b6060604082511061396a57818060200190518101906139649190614b60565b92915050565b8151602003613ae25760005b6020811080156139bd575082818151811061399357613993614366565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b156139d457806139cc8161448b565b915050613976565b80600003613a1757505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115613a3257613a32613e75565b6040519080825280601f01601f191660200182016040528015613a5c576020820181803683370190505b50905060005b82811015613ada57848181518110613a7c57613a7c614366565b602001015160f81c60f81b828281518110613a9957613a99614366565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080613ad28161448b565b915050613a62565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60606124358484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051613b4f9190614b2b565b60006040518083038185875af1925050503d8060008114613b8c576040519150601f19603f3d011682016040523d82523d6000602084013e613b91565b606091505b5091509150613ba287838387613bad565b979650505050505050565b60608315613c43578251600003613c3c5773ffffffffffffffffffffffffffffffffffffffff85163b613c3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016117d3565b5081612435565b6124358383815115613c585781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d39190613cfa565b60005b83811015613ca7578181015183820152602001613c8f565b50506000910152565b60008151808452613cc8816020860160208601613c8c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613d0d6020830184613cb0565b9392505050565b67ffffffffffffffff81168114613d2a57600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613d2a57600080fd5b600080600060608486031215613d6457600080fd5b8335613d6f81613d14565b9250602084013591506040840135613d8681613d2d565b809150509250925092565b600060208284031215613da357600080fd5b8135613d0d81613d14565b60008083601f840112613dc057600080fd5b50813567ffffffffffffffff811115613dd857600080fd5b6020830191508360208260051b8501011115613df357600080fd5b9250929050565b600080600060408486031215613e0f57600080fd5b833567ffffffffffffffff811115613e2657600080fd5b613e3286828701613dae565b9094509250506020840135613d8681613d2d565b600060208284031215613e5857600080fd5b8135613d0d81613d2d565b63ffffffff81168114613d2a57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613eeb57613eeb613e75565b604052919050565b600067ffffffffffffffff821115613f0d57613f0d613e75565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613f4a57600080fd5b8135613f5d613f5882613ef3565b613ea4565b818152846020838601011115613f7257600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613fa857600080fd5b8635613fb381613d2d565b95506020870135613fc381613d2d565b94506040870135613fd381613e63565b93506060870135613fe381613d2d565b9250608087013567ffffffffffffffff8082111561400057600080fd5b61400c8a838b01613f39565b935060a089013591508082111561402257600080fd5b5061402f89828a01613f39565b9150509295509295509295565b6000806000806080858703121561405257600080fd5b843561405d81613e63565b9350602085013561406d81613d2d565b9250604085013561407d81613e63565b9150606085013567ffffffffffffffff81111561409957600080fd5b6140a587828801613f39565b91505092959194509250565b60008060008060008060c087890312156140ca57600080fd5b86356140d581613d2d565b955060208701356140e581613d2d565b9450604087013567ffffffffffffffff8082111561410257600080fd5b61410e8a838b01613f39565b9550606089013591508082111561412457600080fd5b5061413189828a01613f39565b9350506080870135915060a087013561414981613d14565b809150509295509295509295565b60006020828403121561416957600080fd5b813567ffffffffffffffff81111561418057600080fd5b61243584828501613f39565b6000806020838503121561419f57600080fd5b823567ffffffffffffffff8111156141b657600080fd5b6141c285828601613dae565b90969095509350505050565b6000806000604084860312156141e357600080fd5b833567ffffffffffffffff808211156141fb57600080fd5b818601915086601f83011261420f57600080fd5b81358181111561421e57600080fd5b87602082850101111561423057600080fd5b6020928301989097509590910135949350505050565b60006020828403121561425857600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8281168282160390808211156142af576142af61425f565b5092915050565b6000826142ec577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061430557607f821691505b60208210810361433e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561435657600080fd5b81518015158114613d0d57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126143c957600080fd5b9190910192915050565b6000608082360312156143e557600080fd5b6040516080810167ffffffffffffffff828210818311171561440957614409613e75565b81604052843591508082111561441e57600080fd5b5061442b36828601613f39565b82525060208301356020820152604083013561444681613d14565b6040820152606083013561445981613d14565b606082015292915050565b600067ffffffffffffffff8083168181036144815761448161425f565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144bc576144bc61425f565b5060010190565b818103818111156139645761396461425f565b80820281158282048414176139645761396461425f565b6000602082840312156144ff57600080fd5b8151613d0d81613d14565b60608152600061451d6060830186613cb0565b828103602084015261452f8186613cb0565b91505060ff83166040830152949350505050565b6000806040838503121561455657600080fd5b825161456181613e63565b602084015190925061457281613d2d565b809150509250929050565b601f8211156134c657600081815260208120601f850160051c810160208610156145a45750805b601f850160051c820191505b818110156145c3578281556001016145b0565b505050505050565b815167ffffffffffffffff8111156145e5576145e5613e75565b6145f9816145f384546142f1565b8461457d565b602080601f83116001811461464c57600084156146165750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556145c3565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156146995788860151825594840194600190910190840161467a565b50858210156146d557878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006146f86060830186613cb0565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261477b60c0830184613cb0565b98975050505050505050565b61ffff8181168382160190808211156142af576142af61425f565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b166001840152875161480b816003860160208c01613c8c565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161484e816017840160208b01613c8c565b808201915050818660f81b16601782015284519150614874826018830160208801613c8c565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b16600184015287516148ee816003860160208c01613c8c565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614931816017840160208b01613c8c565b808201915050818660f01b16601782015284519150614957826019830160208801613c8c565b016019019998505050505050505050565b6000865161497a818460208b01613c8c565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b67ffffffffffffffff8181168382160190808211156142af576142af61425f565b808201808211156139645761396461425f565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126143c957600080fd5b600060608236031215614a3e57600080fd5b6040516060810167ffffffffffffffff8282108183111715614a6257614a62613e75565b816040528435915080821115614a7757600080fd5b50614a8436828601613f39565b825250602083013560208201526040830135614a9f81613d14565b604082015292915050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b600082516143c9818460208701613c8c565b600060208284031215614b4f57600080fd5b815160ff81168114613d0d57600080fd5b600060208284031215614b7257600080fd5b815167ffffffffffffffff811115614b8957600080fd5b8201601f81018413614b9a57600080fd5b8051614ba8613f5882613ef3565b818152856020838501011115614bbd57600080fd5b614bce826020830160208601613c8c565b9594505050505056fea264697066735822122065654da33f4913d4e862eebcafeec80c738b7e1e3836f72c8aa73f3c6d8e76e364736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102f35760003560e01c80637125702211610191578063c7fffd4b116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b146107da578063f35dda47146107ed578063f851a440146107f557600080fd5b8063d8d1091b14610780578063e46761c414610793578063e7a7ed02146107ba57600080fd5b8063cfa8ed47116100c8578063cfa8ed471461072e578063d02103ca1461074e578063d7bc90ff1461077557600080fd5b8063c7fffd4b14610713578063c89e42df1461071b57600080fd5b8063a3c573eb11610145578063b0afe1541161011f578063b0afe154146106c4578063bb590708146106d0578063c754c7ed146106e357600080fd5b8063a3c573eb14610677578063a652f26c1461069e578063ada8f919146106b157600080fd5b80638c3d7301116101765780638c3d73011461064157806391cafe32146106495780639e0018771461065c57600080fd5b806371257022146105f25780637a5460c51461060557600080fd5b806340b5de6c1161024a578063542028d5116101fe5780636b8616ce116101d85780636b8616ce146105b65780636e05d2cd146105d65780636ff512cc146105df57600080fd5b8063542028d5146105935780635e9145c91461059b578063676870d2146105ae57600080fd5b806349b7b8021161022f57806349b7b8021461051d5780634e4877061461054457806352bdeb6d1461055757600080fd5b806340b5de6c1461049d57806345605267146104f557600080fd5b806319d8ac61116102ac57806332c2d1531161028657806332c2d1531461042b5780633c351e10146104405780633cbc795b1461046057600080fd5b806319d8ac611461039957806326782247146103c65780632c111c061461040b57600080fd5b806305835f37116102dd57806305835f371461032e578063107bf28c1461037757806311e892d41461037f57600080fd5b8062d0295d146102f85780630350896314610313575b600080fd5b61030061081b565b6040519081526020015b60405180910390f35b61031b602081565b60405161ffff909116815260200161030a565b61036a6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161030a9190613cfa565b61036a61093b565b61038760f981565b60405160ff909116815260200161030a565b6007546103ad9067ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161030a565b6001546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161030a565b6008546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b61043e610439366004613d4f565b6109c9565b005b6009546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104889074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161030a565b6104c47fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161030a565b6007546103ad90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b61043e610552366004613d91565b610a98565b61036a6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61036a610cb2565b61043e6105a9366004613dfa565b610cbf565b61031b601f81565b6103006105c4366004613d91565b60066020526000908152604090205481565b61030060055481565b61043e6105ed366004613e46565b6115d8565b61043e610600366004613f8f565b6116a2565b61036a6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61043e611e6c565b61043e610657366004613e46565b611f3f565b6103e673a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b61036a6106ac36600461403c565b612058565b61043e6106bf366004613e46565b61243d565b6103006405ca1ab1e081565b61043e6106de3660046140b1565b612507565b6007546103ad907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61038760e481565b61043e610729366004614157565b61281f565b6002546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b610300635ca1ab1e81565b61043e61078e36600461418c565b6128b2565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b6007546103ad9068010000000000000000900467ffffffffffffffff1681565b61043e6107e83660046141ce565b612f03565b610387601b81565b6000546103e69062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156108aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ce9190614246565b60075490915060009061090d9067ffffffffffffffff70010000000000000000000000000000000082048116916801000000000000000090041661428e565b67ffffffffffffffff1690508060000361092a5760009250505090565b61093481836142b6565b9250505090565b60048054610948906142f1565b80601f0160208091040260200160405190810160405280929190818152602001828054610974906142f1565b80156109c15780601f10610996576101008083540402835291602001916109c1565b820191906000526020600020905b8154815290600101906020018083116109a457829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a38576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a8b91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610aef576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b36576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc59190614344565b610c2e5760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c2e576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b60038054610948906142f1565b60025473ffffffffffffffffffffffffffffffffffffffff163314610d10576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003610d4c576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610d88576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156111c4576000898983818110610dd157610dd1614366565b9050602002810190610de39190614395565b610dec906143d3565b8051805160209091012060608201519192509067ffffffffffffffff1615610f6f5785610e1881614464565b96505060008183602001518460600151604051602001610e7093929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114610ef9576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015610f4f576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86166000908152600660205260408120556110ac565b602082015115801590611036575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015611010573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110349190614246565b155b1561106d576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156110ac576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806110df575042826040015167ffffffffffffffff16115b15611116576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519650505080806111bc9061448b565b915050610db5565b5060075467ffffffffffffffff680100000000000000009091048116908416111561121b576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff868116919091179091556005839055859082811690851614611352576000611272838661428e565b905061128867ffffffffffffffff8216836144c3565b91506113097f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166112c161081b565b6112cb91906144d6565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691906133f2565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611450337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114079190614246565b61141191906144d6565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906134cb565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156114b857600080fd5b505af11580156114cc573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af1158015611570573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159491906144ed565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461162f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610ca7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611711576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156117315750600054600160ff909116105b8061174b5750303b15801561174b575060005460ff166001145b6117dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561183a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611a26576118618561352f565b61186a8661363f565b61187387613746565b6040516020016118859392919061450a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611946573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196a9190614543565b915091508163ffffffff166000146119e2576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055611a23565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b600954600090611a6e90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685612058565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611aee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b129190614246565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611c8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb191906144ed565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611d4391906145cb565b506004611d5089826145cb565b508c600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611df1939291906146e5565b60405180910390a15050505050508015611e6357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611ebd576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611f96576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611fe5576040517fd40d91c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610ca7565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa60008760405160240161208c96959493929190614724565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060906000036121dd5760f9601f83516121219190614787565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e4876040516020016121c797969594939291906147a2565b60405160208183030381529060405290506122e1565b815161ffff101561221a576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9612229602083614787565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016122ce9796959493929190614885565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015612342573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166123ba576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906124009084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614968565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612494576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610ca7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314612576576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156125965750600054600160ff909116105b806125b05750303b1580156125b0575060005460ff166001145b61263c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016117d3565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561269a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8a81169190910291909117909155600280547fffffffffffffffffffffffff000000000000000000000000000000000000000016918816919091179055600361272286826145cb565b50600461272f85826145cb565b50600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff891617905560058390556007805467ffffffffffffffff841677ffffffffffffffffffffffffffffffff0000000000000000909116177a0697800000000000000000000000000000000000000000000000001790558015611e6357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611e5a565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612876576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361288282826145cb565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610ca79190613cfa565b60085473ffffffffffffffffffffffffffffffffffffffff16158015906128f1575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15612928576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612998573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129bc91906144ed565b6129c691906149c4565b67ffffffffffffffff161115612a08576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003612a44576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612a80576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612abb9184917001000000000000000000000000000000009004166149e5565b1115612af3576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015612d82576000868683818110612b3857612b38614366565b9050602002810190612b4a91906149f8565b612b5390614a2c565b905083612b5f81614464565b82518051602091820120818501516040808701519051949950919450600093612bc19386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612c4a576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055612c6f6001886144c3565b8403612cde5742600760189054906101000a900467ffffffffffffffff168460400151612c9c91906149c4565b67ffffffffffffffff161115612cde576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080612d7a9061448b565b915050612b1c565b50612db07f0000000000000000000000000000000000000000000000000000000000000000846112c161081b565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612e9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec391906144ed565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085473ffffffffffffffffffffffffffffffffffffffff1615801590612f42575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15612f79576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fe4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130089190614344565b1561303f576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130d09190614246565b90508181111561310c576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115613148576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61318a73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846134cb565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061321b9190614246565b600780549192506801000000000000000090910467ffffffffffffffff1690600861324583614464565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050848460405161327c929190614aaa565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff166000908152600690935291205532330361338c576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26133eb565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931823388886040516133e29493929190614aba565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526134c69084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613839565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526135299085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613444565b50505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916135b19190614b2b565b600060405180830381855afa9150503d80600081146135ec576040519150601f19603f3d011682016040523d82523d6000602084013e6135f1565b606091505b509150915081613636576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250612435565b61243581613945565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916136c19190614b2b565b600060405180830381855afa9150503d80600081146136fc576040519150601f19603f3d011682016040523d82523d6000602084013e613701565b606091505b509150915081613636576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250612435565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8616916137c79190614b2b565b600060405180830381855afa9150503d8060008114613802576040519150601f19603f3d011682016040523d82523d6000602084013e613807565b606091505b509150915081801561381a575080516020145b613825576012612435565b808060200190518101906124359190614b3d565b600061389b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613b1b9092919063ffffffff16565b8051909150156134c657808060200190518101906138b99190614344565b6134c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016117d3565b6060604082511061396a57818060200190518101906139649190614b60565b92915050565b8151602003613ae25760005b6020811080156139bd575082818151811061399357613993614366565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b156139d457806139cc8161448b565b915050613976565b80600003613a1757505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115613a3257613a32613e75565b6040519080825280601f01601f191660200182016040528015613a5c576020820181803683370190505b50905060005b82811015613ada57848181518110613a7c57613a7c614366565b602001015160f81c60f81b828281518110613a9957613a99614366565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080613ad28161448b565b915050613a62565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60606124358484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051613b4f9190614b2b565b60006040518083038185875af1925050503d8060008114613b8c576040519150601f19603f3d011682016040523d82523d6000602084013e613b91565b606091505b5091509150613ba287838387613bad565b979650505050505050565b60608315613c43578251600003613c3c5773ffffffffffffffffffffffffffffffffffffffff85163b613c3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016117d3565b5081612435565b6124358383815115613c585781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d39190613cfa565b60005b83811015613ca7578181015183820152602001613c8f565b50506000910152565b60008151808452613cc8816020860160208601613c8c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613d0d6020830184613cb0565b9392505050565b67ffffffffffffffff81168114613d2a57600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613d2a57600080fd5b600080600060608486031215613d6457600080fd5b8335613d6f81613d14565b9250602084013591506040840135613d8681613d2d565b809150509250925092565b600060208284031215613da357600080fd5b8135613d0d81613d14565b60008083601f840112613dc057600080fd5b50813567ffffffffffffffff811115613dd857600080fd5b6020830191508360208260051b8501011115613df357600080fd5b9250929050565b600080600060408486031215613e0f57600080fd5b833567ffffffffffffffff811115613e2657600080fd5b613e3286828701613dae565b9094509250506020840135613d8681613d2d565b600060208284031215613e5857600080fd5b8135613d0d81613d2d565b63ffffffff81168114613d2a57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613eeb57613eeb613e75565b604052919050565b600067ffffffffffffffff821115613f0d57613f0d613e75565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613f4a57600080fd5b8135613f5d613f5882613ef3565b613ea4565b818152846020838601011115613f7257600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613fa857600080fd5b8635613fb381613d2d565b95506020870135613fc381613d2d565b94506040870135613fd381613e63565b93506060870135613fe381613d2d565b9250608087013567ffffffffffffffff8082111561400057600080fd5b61400c8a838b01613f39565b935060a089013591508082111561402257600080fd5b5061402f89828a01613f39565b9150509295509295509295565b6000806000806080858703121561405257600080fd5b843561405d81613e63565b9350602085013561406d81613d2d565b9250604085013561407d81613e63565b9150606085013567ffffffffffffffff81111561409957600080fd5b6140a587828801613f39565b91505092959194509250565b60008060008060008060c087890312156140ca57600080fd5b86356140d581613d2d565b955060208701356140e581613d2d565b9450604087013567ffffffffffffffff8082111561410257600080fd5b61410e8a838b01613f39565b9550606089013591508082111561412457600080fd5b5061413189828a01613f39565b9350506080870135915060a087013561414981613d14565b809150509295509295509295565b60006020828403121561416957600080fd5b813567ffffffffffffffff81111561418057600080fd5b61243584828501613f39565b6000806020838503121561419f57600080fd5b823567ffffffffffffffff8111156141b657600080fd5b6141c285828601613dae565b90969095509350505050565b6000806000604084860312156141e357600080fd5b833567ffffffffffffffff808211156141fb57600080fd5b818601915086601f83011261420f57600080fd5b81358181111561421e57600080fd5b87602082850101111561423057600080fd5b6020928301989097509590910135949350505050565b60006020828403121561425857600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8281168282160390808211156142af576142af61425f565b5092915050565b6000826142ec577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061430557607f821691505b60208210810361433e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561435657600080fd5b81518015158114613d0d57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126143c957600080fd5b9190910192915050565b6000608082360312156143e557600080fd5b6040516080810167ffffffffffffffff828210818311171561440957614409613e75565b81604052843591508082111561441e57600080fd5b5061442b36828601613f39565b82525060208301356020820152604083013561444681613d14565b6040820152606083013561445981613d14565b606082015292915050565b600067ffffffffffffffff8083168181036144815761448161425f565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144bc576144bc61425f565b5060010190565b818103818111156139645761396461425f565b80820281158282048414176139645761396461425f565b6000602082840312156144ff57600080fd5b8151613d0d81613d14565b60608152600061451d6060830186613cb0565b828103602084015261452f8186613cb0565b91505060ff83166040830152949350505050565b6000806040838503121561455657600080fd5b825161456181613e63565b602084015190925061457281613d2d565b809150509250929050565b601f8211156134c657600081815260208120601f850160051c810160208610156145a45750805b601f850160051c820191505b818110156145c3578281556001016145b0565b505050505050565b815167ffffffffffffffff8111156145e5576145e5613e75565b6145f9816145f384546142f1565b8461457d565b602080601f83116001811461464c57600084156146165750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556145c3565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156146995788860151825594840194600190910190840161467a565b50858210156146d557878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006146f86060830186613cb0565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261477b60c0830184613cb0565b98975050505050505050565b61ffff8181168382160190808211156142af576142af61425f565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b166001840152875161480b816003860160208c01613c8c565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161484e816017840160208b01613c8c565b808201915050818660f81b16601782015284519150614874826018830160208801613c8c565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b16600184015287516148ee816003860160208c01613c8c565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614931816017840160208b01613c8c565b808201915050818660f01b16601782015284519150614957826019830160208801613c8c565b016019019998505050505050505050565b6000865161497a818460208b01613c8c565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b67ffffffffffffffff8181168382160190808211156142af576142af61425f565b808201808211156139645761396461425f565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126143c957600080fd5b600060608236031215614a3e57600080fd5b6040516060810167ffffffffffffffff8282108183111715614a6257614a62613e75565b816040528435915080821115614a7757600080fd5b50614a8436828601613f39565b825250602083013560208201526040830135614a9f81613d14565b604082015292915050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b600082516143c9818460208701613c8c565b600060208284031215614b4f57600080fd5b815160ff81168114613d0d57600080fd5b600060208284031215614b7257600080fd5b815167ffffffffffffffff811115614b8957600080fd5b8201601f81018413614b9a57600080fd5b8051614ba8613f5882613ef3565b818152856020838501011115614bbd57600080fd5b614bce826020830160208601613c8c565b9594505050505056fea264697066735822122065654da33f4913d4e862eebcafeec80c738b7e1e3836f72c8aa73f3c6d8e76e364736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/VerifierRollupHelperMock.json b/compiled-contracts/paris/VerifierRollupHelperMock.json index b2751e2b5..a14ae2697 100644 --- a/compiled-contracts/paris/VerifierRollupHelperMock.json +++ b/compiled-contracts/paris/VerifierRollupHelperMock.json @@ -28,8 +28,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50610158806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80639121da8a14610030575b600080fd5b61004661003e366004610089565b600192915050565b604051901515815260200160405180910390f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008061032080848603121561009e57600080fd5b6103008401858111156100b057600080fd5b8493508561031f8601126100c357600080fd5b604051602080820182811067ffffffffffffffff821117156100e7576100e761005a565b6040529286019281888511156100fc57600080fd5b5b8484101561011457833581529281019281016100fd565b50949790965094505050505056fea264697066735822122061fd8311ce6da82f24c0874a992ea14a8aaf711e353693cae56066e3223abc5a64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80639121da8a14610030575b600080fd5b61004661003e366004610089565b600192915050565b604051901515815260200160405180910390f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008061032080848603121561009e57600080fd5b6103008401858111156100b057600080fd5b8493508561031f8601126100c357600080fd5b604051602080820182811067ffffffffffffffff821117156100e7576100e761005a565b6040529286019281888511156100fc57600080fd5b5b8484101561011457833581529281019281016100fd565b50949790965094505050505056fea264697066735822122061fd8311ce6da82f24c0874a992ea14a8aaf711e353693cae56066e3223abc5a64736f6c63430008140033", + "bytecode": "0x608060405234801561001057600080fd5b50610158806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80639121da8a14610030575b600080fd5b61004661003e366004610089565b600192915050565b604051901515815260200160405180910390f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008061032080848603121561009e57600080fd5b6103008401858111156100b057600080fd5b8493508561031f8601126100c357600080fd5b604051602080820182811067ffffffffffffffff821117156100e7576100e761005a565b6040529286019281888511156100fc57600080fd5b5b8484101561011457833581529281019281016100fd565b50949790965094505050505056fea264697066735822122066b50cbb730099c9f1f258fa949f9d4e1a1ef7636af905817cebb300b2be0d2664736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80639121da8a14610030575b600080fd5b61004661003e366004610089565b600192915050565b604051901515815260200160405180910390f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008061032080848603121561009e57600080fd5b6103008401858111156100b057600080fd5b8493508561031f8601126100c357600080fd5b604051602080820182811067ffffffffffffffff821117156100e7576100e761005a565b6040529286019281888511156100fc57600080fd5b5b8484101561011457833581529281019281016100fd565b50949790965094505050505056fea264697066735822122066b50cbb730099c9f1f258fa949f9d4e1a1ef7636af905817cebb300b2be0d2664736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } From e71de8b4aeca6d8ff9f799b3e8f853c7eff9bd18 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 16 Jan 2024 09:34:25 +0100 Subject: [PATCH 140/230] update paris etrog --- .githooks/pre-commit | 2 + .../paris/PolygonZkEVMEtrog.json | 1155 ++++++++++++++++ .../paris/PolygonZkEVMV2ExistentEtrog.json | 1231 +++++++++++++++++ 3 files changed, 2388 insertions(+) create mode 100644 compiled-contracts/paris/PolygonZkEVMEtrog.json create mode 100644 compiled-contracts/paris/PolygonZkEVMV2ExistentEtrog.json diff --git a/.githooks/pre-commit b/.githooks/pre-commit index 12d696325..89f395bab 100755 --- a/.githooks/pre-commit +++ b/.githooks/pre-commit @@ -33,6 +33,8 @@ if npm run lint; then 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/zkEVM/PolygonZkEVMEtrog.sol/PolygonZkEVMEtrog.json compiled-contracts/ + cp artifacts/contracts/v2/consensus/zkEVM/PolygonZkEVMV2ExistentEtrog.sol/PolygonZkEVMV2ExistentEtrog.json compiled-contracts/ cp artifacts/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol/PolygonDataComittee.json compiled-contracts/ git add compiled-contracts diff --git a/compiled-contracts/paris/PolygonZkEVMEtrog.json b/compiled-contracts/paris/PolygonZkEVMEtrog.json new file mode 100644 index 000000000..78b4480ac --- /dev/null +++ b/compiled-contracts/paris/PolygonZkEVMEtrog.json @@ -0,0 +1,1155 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonZkEVMEtrog", + "sourceName": "contracts/v2/consensus/zkEVM/PolygonZkEVMEtrog.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRootV2", + "name": "_globalExitRootManager", + "type": "address" + }, + { + "internalType": "contract IERC20Upgradeable", + "name": "_pol", + "type": "address" + }, + { + "internalType": "contract IPolygonZkEVMBridgeV2", + "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": "ForceBatchesDescentralized", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchesNotAllowedOnEmergencyState", + "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": "HaltTimeoutNotExpiredAfterEmergencyState", + "type": "error" + }, + { + "inputs": [], + "name": "HugeTokenMetadataNotSupported", + "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": [ + { + "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": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "lastGlobalExitRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "sequencer", + "type": "address" + } + ], + "name": "InitialSequenceBatches", + "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" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "l1InfoRoot", + "type": "bytes32" + } + ], + "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": "address", + "name": "newForceBatchAddress", + "type": "address" + } + ], + "name": "SetForceBatchAddress", + "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": "GLOBAL_EXIT_ROOT_MANAGER_L2", + "outputs": [ + { + "internalType": "contract IBasePolygonZkEVMGlobalExitRoot", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_LIST_LEN_LEN", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS_EMPTY_METADATA", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_CONSTANT_BYTES", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_CONSTANT_BYTES_EMPTY_METADATA", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_DATA_LEN_EMPTY_METADATA", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "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": "admin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "bridgeAddress", + "outputs": [ + { + "internalType": "contract IPolygonZkEVMBridgeV2", + "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": "forceBatchAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "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": "gapLastTimestamp", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "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" + }, + { + "internalType": "bytes", + "name": "_gasTokenMetadata", + "type": "bytes" + } + ], + "name": "generateInitializeTransaction", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalExitRootManager", + "outputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRootV2", + "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": "string", + "name": "sequencerURL", + "type": "string" + }, + { + "internalType": "string", + "name": "_networkName", + "type": "string" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "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": "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": "forcedGlobalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "forcedTimestamp", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "forcedBlockHashL1", + "type": "bytes32" + } + ], + "internalType": "struct PolygonRollupBaseEtrog.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": "forcedGlobalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "forcedTimestamp", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "forcedBlockHashL1", + "type": "bytes32" + } + ], + "internalType": "struct PolygonRollupBaseEtrog.BatchData[]", + "name": "batches", + "type": "tuple[]" + } + ], + "name": "sequenceForceBatches", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newForceBatchAddress", + "type": "address" + } + ], + "name": "setForceBatchAddress", + "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": "0x6101006040523480156200001257600080fd5b50604051620048b3380380620048b3833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e0516146f8620001bb60003960008181610517015281816109ad01528181610b1a01528181610d6d015281816112da0152818161177f01528181611bf101528181611cef015281816123780152818161244001528181612dad01528181612e2e01528181612e500152612f6801526000818161067101528181610fc701528181611ebf01528181611fc701526128d30152600081816107350152818161114e0152818161258b01526129550152600081816107670152818161084501528181611c3a0152818161255f0152612efe01526146f86000f3fe608060405234801561001057600080fd5b50600436106102e85760003560e01c80637125702211610191578063c7fffd4b116100e3578063e46761c411610097578063ecef3f9911610071578063ecef3f99146107bc578063f35dda47146107cf578063f851a440146107d757600080fd5b8063e46761c414610762578063e7a7ed0214610789578063eaeb077b146107a957600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610710578063d02103ca14610730578063d7bc90ff1461075757600080fd5b8063c7fffd4b146106f5578063c89e42df146106fd57600080fd5b80639f26f84011610145578063ada8f9191161011f578063ada8f919146106a6578063b0afe154146106b9578063c754c7ed146106c557600080fd5b80639f26f84014610659578063a3c573eb1461066c578063a652f26c1461069357600080fd5b80638c3d7301116101765780638c3d73011461062357806391cafe321461062b5780639e0018771461063e57600080fd5b806371257022146105d45780637a5460c5146105e757600080fd5b80633cbc795b1161024a57806352bdeb6d116101fe5780636b8616ce116101d85780636b8616ce146105985780636e05d2cd146105b85780636ff512cc146105c157600080fd5b806352bdeb6d1461054c578063542028d514610588578063676870d21461059057600080fd5b8063456052671161022f57806345605267146104ea57806349b7b802146105125780634e4877061461053957600080fd5b80633cbc795b1461045557806340b5de6c1461049257600080fd5b806326782247116102a15780632c111c06116102865780632c111c061461040057806332c2d153146104205780633c351e101461043557600080fd5b8063267822471461038e5780632a9f208f146103d357600080fd5b806305835f37116102d257806305835f3714610323578063107bf28c1461036c57806311e892d41461037457600080fd5b8062d0295d146102ed5780630350896314610308575b600080fd5b6102f56107fd565b6040519081526020015b60405180910390f35b610310602081565b60405161ffff90911681526020016102ff565b61035f6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102ff9190613945565b61035f61091d565b61037c60f981565b60405160ff90911681526020016102ff565b6001546103ae9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102ff565b6007546103e79067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102ff565b6008546103ae9073ffffffffffffffffffffffffffffffffffffffff1681565b61043361042e36600461399a565b6109ab565b005b6009546103ae9073ffffffffffffffffffffffffffffffffffffffff1681565b60095461047d9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102ff565b6104b97fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102ff565b6007546103e790700100000000000000000000000000000000900467ffffffffffffffff1681565b6103ae7f000000000000000000000000000000000000000000000000000000000000000081565b6104336105473660046139dc565b610a7a565b61035f6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61035f610c94565b610310601f81565b6102f56105a63660046139dc565b60066020526000908152604090205481565b6102f560055481565b6104336105cf3660046139f9565b610ca1565b6104336105e2366004613b42565b610d6b565b61035f6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610433611516565b6104336106393660046139f9565b6115e9565b6103ae73a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b610433610667366004613c3b565b611702565b6103ae7f000000000000000000000000000000000000000000000000000000000000000081565b61035f6106a1366004613c7d565b611dbe565b6104336106b43660046139f9565b6121a3565b6102f56405ca1ab1e081565b6007546103e7907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61037c60e481565b61043361070b366004613cf2565b61226d565b6002546103ae9073ffffffffffffffffffffffffffffffffffffffff1681565b6103ae7f000000000000000000000000000000000000000000000000000000000000000081565b6102f5635ca1ab1e81565b6103ae7f000000000000000000000000000000000000000000000000000000000000000081565b6007546103e79068010000000000000000900467ffffffffffffffff1681565b6104336107b7366004613d27565b612300565b6104336107ca366004613d9f565b612808565b61037c601b81565b6000546103ae9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561088c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b09190613deb565b6007549091506000906108ef9067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613e33565b67ffffffffffffffff1690508060000361090c5760009250505090565b6109168183613e5b565b9250505090565b6004805461092a90613e96565b80601f016020809104026020016040519081016040528092919081815260200182805461095690613e96565b80156109a35780601f10610978576101008083540402835291602001916109a3565b820191906000526020600020905b81548152906001019060200180831161098657829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a1a576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a6d91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ad1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b18576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba79190613ee9565b610c105760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c10576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461092a90613e96565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610cf8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c89565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610dda576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610dfa5750600054600160ff909116105b80610e145750303b158015610e14575060005460ff166001145b610ea5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610f0357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff8516156110ef57610f2a8561303d565b610f338661314d565b610f3c87613254565b604051602001610f4e93929190613f0b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af115801561100f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110339190613f44565b915091508163ffffffff166000146110ab576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff8416171790556110ec565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b60095460009061113790889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685611dbe565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111db9190613deb565b90506000808483858f6111ef600143613f7e565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611338573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135c9190613f91565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600390816113ee9190613ffc565b5060046113fb8982613ffc565b508c600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e60405161149c93929190614116565b60405180910390a1505050505050801561150d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611567576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611640576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff1661168f576040517fd40d91c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c89565b60085473ffffffffffffffffffffffffffffffffffffffff1615801590611741575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15611778576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180c9190613f91565b6118169190614155565b67ffffffffffffffff161115611858576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003611894576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156118d0576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff68010000000000000000820481169161190b918491700100000000000000000000000000000000900416614176565b1115611943576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015611beb57600086868381811061198857611988614189565b905060200281019061199a91906141b8565b6119a3906141f6565b9050836119af8161427f565b825180516020918201208185015160408087015160608801519151959a50929550600094611a1c948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114611aa5576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055611aca600188613f7e565b8403611b395742600760189054906101000a900467ffffffffffffffff168460400151611af79190614155565b67ffffffffffffffff161115611b39576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc016040516020818303038152906040528051906020012094505050508080611be3906142a6565b91505061196c565b50611c617f000000000000000000000000000000000000000000000000000000000000000084611c196107fd565b611c2391906142de565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613347565b60058190556007805467ffffffffffffffff8416700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff9091161790556040517f9a908e7300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611d3b908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af1158015611d5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7e9190613f91565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa600087604051602401611df2969594939291906142f5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff7000000000000000000000000000000000000000000000000000000001790528351909150606090600003611f435760f9601f8351611e879190614358565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611f2d9796959493929190614373565b6040516020818303038152906040529050612047565b815161ffff1015611f80576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611f8f602083614358565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016120349796959493929190614456565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156120a8573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612120576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906121669084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614539565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146121fa576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c89565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146122c4576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036122d08282613ffc565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c899190613945565b60085473ffffffffffffffffffffffffffffffffffffffff161580159061233f575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15612376576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124059190613ee9565b1561243c576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cd9190613deb565b905081811115612509576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612545576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61258773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613420565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126189190613deb565b600780549192506801000000000000000090910467ffffffffffffffff169060086126428361427f565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612679929190614595565b604051908190039020814261268f600143613f7e565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff16600090815260069093529120553233036127a2576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612801565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931823388886040516127f894939291906145a5565b60405180910390a25b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612859576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003612895576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156128d1576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561293957600080fd5b505af115801561294d573d6000803e3d6000fd5b5050505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129e29190613deb565b600754600554919250429170010000000000000000000000000000000090910467ffffffffffffffff16908160005b86811015612d135760008a8a83818110612a2d57612a2d614189565b9050602002810190612a3f91906141b8565b612a48906141f6565b8051805160209091012060408201519192509067ffffffffffffffff1615612c2d5785612a748161427f565b965050600081836020015184604001518560600151604051602001612ad79493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114612b60576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209550600660008867ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000905550612cfe565b8151516201d4c01015612c6c576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201526000609c82015260bc016040516020818303038152906040528051906020012094505b50508080612d0b906142a6565b915050612a11565b5060075467ffffffffffffffff6801000000000000000090910481169084161115612d6a576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff84811690831614612e28576000612d908386613e33565b9050612da667ffffffffffffffff821683613f7e565b9150612ddf7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611c196107fd565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b612f26337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612eb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612edd9190613deb565b612ee791906142de565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613420565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015612fc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fea9190613f91565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e7668860405161302891815260200190565b60405180910390a25050505050505050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916130bf9190614616565b600060405180830381855afa9150503d80600081146130fa576040519150601f19603f3d011682016040523d82523d6000602084013e6130ff565b606091505b509150915081613144576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525061219b565b61219b81613484565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916131cf9190614616565b600060405180830381855afa9150503d806000811461320a576040519150601f19603f3d011682016040523d82523d6000602084013e61320f565b606091505b509150915081613144576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525061219b565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8616916132d59190614616565b600060405180830381855afa9150503d8060008114613310576040519150601f19603f3d011682016040523d82523d6000602084013e613315565b606091505b5091509150818015613328575080516020145b61333357601261219b565b8080602001905181019061219b9190614628565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261341b9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261365a565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261347e9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613399565b50505050565b606060408251106134a957818060200190518101906134a3919061464b565b92915050565b81516020036136215760005b6020811080156134fc57508281815181106134d2576134d2614189565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613513578061350b816142a6565b9150506134b5565b8060000361355657505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111561357157613571613a28565b6040519080825280601f01601f19166020018201604052801561359b576020820181803683370190505b50905060005b82811015613619578481815181106135bb576135bb614189565b602001015160f81c60f81b8282815181106135d8576135d8614189565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080613611816142a6565b9150506135a1565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60006136bc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166137669092919063ffffffff16565b80519091501561341b57808060200190518101906136da9190613ee9565b61341b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610e9c565b606061219b8484600085856000808673ffffffffffffffffffffffffffffffffffffffff16858760405161379a9190614616565b60006040518083038185875af1925050503d80600081146137d7576040519150601f19603f3d011682016040523d82523d6000602084013e6137dc565b606091505b50915091506137ed878383876137f8565b979650505050505050565b6060831561388e5782516000036138875773ffffffffffffffffffffffffffffffffffffffff85163b613887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e9c565b508161219b565b61219b83838151156138a35781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9c9190613945565b60005b838110156138f25781810151838201526020016138da565b50506000910152565b600081518084526139138160208601602086016138d7565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061395860208301846138fb565b9392505050565b67ffffffffffffffff8116811461397557600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461397557600080fd5b6000806000606084860312156139af57600080fd5b83356139ba8161395f565b92506020840135915060408401356139d181613978565b809150509250925092565b6000602082840312156139ee57600080fd5b81356139588161395f565b600060208284031215613a0b57600080fd5b813561395881613978565b63ffffffff8116811461397557600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613a9e57613a9e613a28565b604052919050565b600067ffffffffffffffff821115613ac057613ac0613a28565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613afd57600080fd5b8135613b10613b0b82613aa6565b613a57565b818152846020838601011115613b2557600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613b5b57600080fd5b8635613b6681613978565b95506020870135613b7681613978565b94506040870135613b8681613a16565b93506060870135613b9681613978565b9250608087013567ffffffffffffffff80821115613bb357600080fd5b613bbf8a838b01613aec565b935060a0890135915080821115613bd557600080fd5b50613be289828a01613aec565b9150509295509295509295565b60008083601f840112613c0157600080fd5b50813567ffffffffffffffff811115613c1957600080fd5b6020830191508360208260051b8501011115613c3457600080fd5b9250929050565b60008060208385031215613c4e57600080fd5b823567ffffffffffffffff811115613c6557600080fd5b613c7185828601613bef565b90969095509350505050565b60008060008060808587031215613c9357600080fd5b8435613c9e81613a16565b93506020850135613cae81613978565b92506040850135613cbe81613a16565b9150606085013567ffffffffffffffff811115613cda57600080fd5b613ce687828801613aec565b91505092959194509250565b600060208284031215613d0457600080fd5b813567ffffffffffffffff811115613d1b57600080fd5b61219b84828501613aec565b600080600060408486031215613d3c57600080fd5b833567ffffffffffffffff80821115613d5457600080fd5b818601915086601f830112613d6857600080fd5b813581811115613d7757600080fd5b876020828501011115613d8957600080fd5b6020928301989097509590910135949350505050565b600080600060408486031215613db457600080fd5b833567ffffffffffffffff811115613dcb57600080fd5b613dd786828701613bef565b90945092505060208401356139d181613978565b600060208284031215613dfd57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613e5457613e54613e04565b5092915050565b600082613e91577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613eaa57607f821691505b602082108103613ee3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215613efb57600080fd5b8151801515811461395857600080fd5b606081526000613f1e60608301866138fb565b8281036020840152613f3081866138fb565b91505060ff83166040830152949350505050565b60008060408385031215613f5757600080fd5b8251613f6281613a16565b6020840151909250613f7381613978565b809150509250929050565b818103818111156134a3576134a3613e04565b600060208284031215613fa357600080fd5b81516139588161395f565b601f82111561341b57600081815260208120601f850160051c81016020861015613fd55750805b601f850160051c820191505b81811015613ff457828155600101613fe1565b505050505050565b815167ffffffffffffffff81111561401657614016613a28565b61402a816140248454613e96565b84613fae565b602080601f83116001811461407d57600084156140475750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613ff4565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156140ca578886015182559484019460019091019084016140ab565b508582101561410657878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60608152600061412960608301866138fb565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff818116838216019080821115613e5457613e54613e04565b808201808211156134a3576134a3613e04565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126141ec57600080fd5b9190910192915050565b60006080823603121561420857600080fd5b6040516080810167ffffffffffffffff828210818311171561422c5761422c613a28565b81604052843591508082111561424157600080fd5b5061424e36828601613aec565b8252506020830135602082015260408301356142698161395f565b6040820152606092830135928101929092525090565b600067ffffffffffffffff80831681810361429c5761429c613e04565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036142d7576142d7613e04565b5060010190565b80820281158282048414176134a3576134a3613e04565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261434c60c08301846138fb565b98975050505050505050565b61ffff818116838216019080821115613e5457613e54613e04565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b16600184015287516143dc816003860160208c016138d7565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161441f816017840160208b016138d7565b808201915050818660f81b166017820152845191506144458260188301602088016138d7565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b16600184015287516144bf816003860160208c016138d7565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614502816017840160208b016138d7565b808201915050818660f01b166017820152845191506145288260198301602088016138d7565b016019019998505050505050505050565b6000865161454b818460208b016138d7565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b600082516141ec8184602087016138d7565b60006020828403121561463a57600080fd5b815160ff8116811461395857600080fd5b60006020828403121561465d57600080fd5b815167ffffffffffffffff81111561467457600080fd5b8201601f8101841361468557600080fd5b8051614693613b0b82613aa6565b8181528560208385010111156146a857600080fd5b6146b98260208301602086016138d7565b9594505050505056fea26469706673582212205200938211fe1304792adcf2e33b90e11eec8c63d1dde801988e53543359968a64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102e85760003560e01c80637125702211610191578063c7fffd4b116100e3578063e46761c411610097578063ecef3f9911610071578063ecef3f99146107bc578063f35dda47146107cf578063f851a440146107d757600080fd5b8063e46761c414610762578063e7a7ed0214610789578063eaeb077b146107a957600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610710578063d02103ca14610730578063d7bc90ff1461075757600080fd5b8063c7fffd4b146106f5578063c89e42df146106fd57600080fd5b80639f26f84011610145578063ada8f9191161011f578063ada8f919146106a6578063b0afe154146106b9578063c754c7ed146106c557600080fd5b80639f26f84014610659578063a3c573eb1461066c578063a652f26c1461069357600080fd5b80638c3d7301116101765780638c3d73011461062357806391cafe321461062b5780639e0018771461063e57600080fd5b806371257022146105d45780637a5460c5146105e757600080fd5b80633cbc795b1161024a57806352bdeb6d116101fe5780636b8616ce116101d85780636b8616ce146105985780636e05d2cd146105b85780636ff512cc146105c157600080fd5b806352bdeb6d1461054c578063542028d514610588578063676870d21461059057600080fd5b8063456052671161022f57806345605267146104ea57806349b7b802146105125780634e4877061461053957600080fd5b80633cbc795b1461045557806340b5de6c1461049257600080fd5b806326782247116102a15780632c111c06116102865780632c111c061461040057806332c2d153146104205780633c351e101461043557600080fd5b8063267822471461038e5780632a9f208f146103d357600080fd5b806305835f37116102d257806305835f3714610323578063107bf28c1461036c57806311e892d41461037457600080fd5b8062d0295d146102ed5780630350896314610308575b600080fd5b6102f56107fd565b6040519081526020015b60405180910390f35b610310602081565b60405161ffff90911681526020016102ff565b61035f6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102ff9190613945565b61035f61091d565b61037c60f981565b60405160ff90911681526020016102ff565b6001546103ae9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102ff565b6007546103e79067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102ff565b6008546103ae9073ffffffffffffffffffffffffffffffffffffffff1681565b61043361042e36600461399a565b6109ab565b005b6009546103ae9073ffffffffffffffffffffffffffffffffffffffff1681565b60095461047d9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102ff565b6104b97fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102ff565b6007546103e790700100000000000000000000000000000000900467ffffffffffffffff1681565b6103ae7f000000000000000000000000000000000000000000000000000000000000000081565b6104336105473660046139dc565b610a7a565b61035f6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61035f610c94565b610310601f81565b6102f56105a63660046139dc565b60066020526000908152604090205481565b6102f560055481565b6104336105cf3660046139f9565b610ca1565b6104336105e2366004613b42565b610d6b565b61035f6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610433611516565b6104336106393660046139f9565b6115e9565b6103ae73a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b610433610667366004613c3b565b611702565b6103ae7f000000000000000000000000000000000000000000000000000000000000000081565b61035f6106a1366004613c7d565b611dbe565b6104336106b43660046139f9565b6121a3565b6102f56405ca1ab1e081565b6007546103e7907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61037c60e481565b61043361070b366004613cf2565b61226d565b6002546103ae9073ffffffffffffffffffffffffffffffffffffffff1681565b6103ae7f000000000000000000000000000000000000000000000000000000000000000081565b6102f5635ca1ab1e81565b6103ae7f000000000000000000000000000000000000000000000000000000000000000081565b6007546103e79068010000000000000000900467ffffffffffffffff1681565b6104336107b7366004613d27565b612300565b6104336107ca366004613d9f565b612808565b61037c601b81565b6000546103ae9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561088c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b09190613deb565b6007549091506000906108ef9067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613e33565b67ffffffffffffffff1690508060000361090c5760009250505090565b6109168183613e5b565b9250505090565b6004805461092a90613e96565b80601f016020809104026020016040519081016040528092919081815260200182805461095690613e96565b80156109a35780601f10610978576101008083540402835291602001916109a3565b820191906000526020600020905b81548152906001019060200180831161098657829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a1a576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a6d91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ad1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b18576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba79190613ee9565b610c105760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c10576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461092a90613e96565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610cf8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c89565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610dda576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610dfa5750600054600160ff909116105b80610e145750303b158015610e14575060005460ff166001145b610ea5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610f0357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff8516156110ef57610f2a8561303d565b610f338661314d565b610f3c87613254565b604051602001610f4e93929190613f0b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af115801561100f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110339190613f44565b915091508163ffffffff166000146110ab576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff8416171790556110ec565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b60095460009061113790889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685611dbe565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111db9190613deb565b90506000808483858f6111ef600143613f7e565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611338573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135c9190613f91565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600390816113ee9190613ffc565b5060046113fb8982613ffc565b508c600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e60405161149c93929190614116565b60405180910390a1505050505050801561150d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611567576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611640576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff1661168f576040517fd40d91c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c89565b60085473ffffffffffffffffffffffffffffffffffffffff1615801590611741575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15611778576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180c9190613f91565b6118169190614155565b67ffffffffffffffff161115611858576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003611894576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156118d0576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff68010000000000000000820481169161190b918491700100000000000000000000000000000000900416614176565b1115611943576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015611beb57600086868381811061198857611988614189565b905060200281019061199a91906141b8565b6119a3906141f6565b9050836119af8161427f565b825180516020918201208185015160408087015160608801519151959a50929550600094611a1c948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114611aa5576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055611aca600188613f7e565b8403611b395742600760189054906101000a900467ffffffffffffffff168460400151611af79190614155565b67ffffffffffffffff161115611b39576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc016040516020818303038152906040528051906020012094505050508080611be3906142a6565b91505061196c565b50611c617f000000000000000000000000000000000000000000000000000000000000000084611c196107fd565b611c2391906142de565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613347565b60058190556007805467ffffffffffffffff8416700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff9091161790556040517f9a908e7300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611d3b908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af1158015611d5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7e9190613f91565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa600087604051602401611df2969594939291906142f5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff7000000000000000000000000000000000000000000000000000000001790528351909150606090600003611f435760f9601f8351611e879190614358565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611f2d9796959493929190614373565b6040516020818303038152906040529050612047565b815161ffff1015611f80576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611f8f602083614358565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016120349796959493929190614456565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156120a8573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612120576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906121669084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614539565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146121fa576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c89565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146122c4576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036122d08282613ffc565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c899190613945565b60085473ffffffffffffffffffffffffffffffffffffffff161580159061233f575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15612376576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124059190613ee9565b1561243c576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cd9190613deb565b905081811115612509576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612545576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61258773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613420565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126189190613deb565b600780549192506801000000000000000090910467ffffffffffffffff169060086126428361427f565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612679929190614595565b604051908190039020814261268f600143613f7e565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff16600090815260069093529120553233036127a2576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612801565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931823388886040516127f894939291906145a5565b60405180910390a25b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612859576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003612895576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156128d1576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561293957600080fd5b505af115801561294d573d6000803e3d6000fd5b5050505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129e29190613deb565b600754600554919250429170010000000000000000000000000000000090910467ffffffffffffffff16908160005b86811015612d135760008a8a83818110612a2d57612a2d614189565b9050602002810190612a3f91906141b8565b612a48906141f6565b8051805160209091012060408201519192509067ffffffffffffffff1615612c2d5785612a748161427f565b965050600081836020015184604001518560600151604051602001612ad79493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114612b60576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209550600660008867ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000905550612cfe565b8151516201d4c01015612c6c576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201526000609c82015260bc016040516020818303038152906040528051906020012094505b50508080612d0b906142a6565b915050612a11565b5060075467ffffffffffffffff6801000000000000000090910481169084161115612d6a576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff84811690831614612e28576000612d908386613e33565b9050612da667ffffffffffffffff821683613f7e565b9150612ddf7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611c196107fd565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b612f26337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612eb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612edd9190613deb565b612ee791906142de565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613420565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015612fc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fea9190613f91565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e7668860405161302891815260200190565b60405180910390a25050505050505050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916130bf9190614616565b600060405180830381855afa9150503d80600081146130fa576040519150601f19603f3d011682016040523d82523d6000602084013e6130ff565b606091505b509150915081613144576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525061219b565b61219b81613484565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916131cf9190614616565b600060405180830381855afa9150503d806000811461320a576040519150601f19603f3d011682016040523d82523d6000602084013e61320f565b606091505b509150915081613144576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525061219b565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8616916132d59190614616565b600060405180830381855afa9150503d8060008114613310576040519150601f19603f3d011682016040523d82523d6000602084013e613315565b606091505b5091509150818015613328575080516020145b61333357601261219b565b8080602001905181019061219b9190614628565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261341b9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261365a565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261347e9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613399565b50505050565b606060408251106134a957818060200190518101906134a3919061464b565b92915050565b81516020036136215760005b6020811080156134fc57508281815181106134d2576134d2614189565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613513578061350b816142a6565b9150506134b5565b8060000361355657505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111561357157613571613a28565b6040519080825280601f01601f19166020018201604052801561359b576020820181803683370190505b50905060005b82811015613619578481815181106135bb576135bb614189565b602001015160f81c60f81b8282815181106135d8576135d8614189565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080613611816142a6565b9150506135a1565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60006136bc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166137669092919063ffffffff16565b80519091501561341b57808060200190518101906136da9190613ee9565b61341b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610e9c565b606061219b8484600085856000808673ffffffffffffffffffffffffffffffffffffffff16858760405161379a9190614616565b60006040518083038185875af1925050503d80600081146137d7576040519150601f19603f3d011682016040523d82523d6000602084013e6137dc565b606091505b50915091506137ed878383876137f8565b979650505050505050565b6060831561388e5782516000036138875773ffffffffffffffffffffffffffffffffffffffff85163b613887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e9c565b508161219b565b61219b83838151156138a35781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9c9190613945565b60005b838110156138f25781810151838201526020016138da565b50506000910152565b600081518084526139138160208601602086016138d7565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061395860208301846138fb565b9392505050565b67ffffffffffffffff8116811461397557600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461397557600080fd5b6000806000606084860312156139af57600080fd5b83356139ba8161395f565b92506020840135915060408401356139d181613978565b809150509250925092565b6000602082840312156139ee57600080fd5b81356139588161395f565b600060208284031215613a0b57600080fd5b813561395881613978565b63ffffffff8116811461397557600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613a9e57613a9e613a28565b604052919050565b600067ffffffffffffffff821115613ac057613ac0613a28565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613afd57600080fd5b8135613b10613b0b82613aa6565b613a57565b818152846020838601011115613b2557600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613b5b57600080fd5b8635613b6681613978565b95506020870135613b7681613978565b94506040870135613b8681613a16565b93506060870135613b9681613978565b9250608087013567ffffffffffffffff80821115613bb357600080fd5b613bbf8a838b01613aec565b935060a0890135915080821115613bd557600080fd5b50613be289828a01613aec565b9150509295509295509295565b60008083601f840112613c0157600080fd5b50813567ffffffffffffffff811115613c1957600080fd5b6020830191508360208260051b8501011115613c3457600080fd5b9250929050565b60008060208385031215613c4e57600080fd5b823567ffffffffffffffff811115613c6557600080fd5b613c7185828601613bef565b90969095509350505050565b60008060008060808587031215613c9357600080fd5b8435613c9e81613a16565b93506020850135613cae81613978565b92506040850135613cbe81613a16565b9150606085013567ffffffffffffffff811115613cda57600080fd5b613ce687828801613aec565b91505092959194509250565b600060208284031215613d0457600080fd5b813567ffffffffffffffff811115613d1b57600080fd5b61219b84828501613aec565b600080600060408486031215613d3c57600080fd5b833567ffffffffffffffff80821115613d5457600080fd5b818601915086601f830112613d6857600080fd5b813581811115613d7757600080fd5b876020828501011115613d8957600080fd5b6020928301989097509590910135949350505050565b600080600060408486031215613db457600080fd5b833567ffffffffffffffff811115613dcb57600080fd5b613dd786828701613bef565b90945092505060208401356139d181613978565b600060208284031215613dfd57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613e5457613e54613e04565b5092915050565b600082613e91577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613eaa57607f821691505b602082108103613ee3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215613efb57600080fd5b8151801515811461395857600080fd5b606081526000613f1e60608301866138fb565b8281036020840152613f3081866138fb565b91505060ff83166040830152949350505050565b60008060408385031215613f5757600080fd5b8251613f6281613a16565b6020840151909250613f7381613978565b809150509250929050565b818103818111156134a3576134a3613e04565b600060208284031215613fa357600080fd5b81516139588161395f565b601f82111561341b57600081815260208120601f850160051c81016020861015613fd55750805b601f850160051c820191505b81811015613ff457828155600101613fe1565b505050505050565b815167ffffffffffffffff81111561401657614016613a28565b61402a816140248454613e96565b84613fae565b602080601f83116001811461407d57600084156140475750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613ff4565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156140ca578886015182559484019460019091019084016140ab565b508582101561410657878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60608152600061412960608301866138fb565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff818116838216019080821115613e5457613e54613e04565b808201808211156134a3576134a3613e04565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126141ec57600080fd5b9190910192915050565b60006080823603121561420857600080fd5b6040516080810167ffffffffffffffff828210818311171561422c5761422c613a28565b81604052843591508082111561424157600080fd5b5061424e36828601613aec565b8252506020830135602082015260408301356142698161395f565b6040820152606092830135928101929092525090565b600067ffffffffffffffff80831681810361429c5761429c613e04565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036142d7576142d7613e04565b5060010190565b80820281158282048414176134a3576134a3613e04565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261434c60c08301846138fb565b98975050505050505050565b61ffff818116838216019080821115613e5457613e54613e04565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b16600184015287516143dc816003860160208c016138d7565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161441f816017840160208b016138d7565b808201915050818660f81b166017820152845191506144458260188301602088016138d7565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b16600184015287516144bf816003860160208c016138d7565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614502816017840160208b016138d7565b808201915050818660f01b166017820152845191506145288260198301602088016138d7565b016019019998505050505050505050565b6000865161454b818460208b016138d7565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b600082516141ec8184602087016138d7565b60006020828403121561463a57600080fd5b815160ff8116811461395857600080fd5b60006020828403121561465d57600080fd5b815167ffffffffffffffff81111561467457600080fd5b8201601f8101841361468557600080fd5b8051614693613b0b82613aa6565b8181528560208385010111156146a857600080fd5b6146b98260208301602086016138d7565b9594505050505056fea26469706673582212205200938211fe1304792adcf2e33b90e11eec8c63d1dde801988e53543359968a64736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/paris/PolygonZkEVMV2ExistentEtrog.json b/compiled-contracts/paris/PolygonZkEVMV2ExistentEtrog.json new file mode 100644 index 000000000..6410216b3 --- /dev/null +++ b/compiled-contracts/paris/PolygonZkEVMV2ExistentEtrog.json @@ -0,0 +1,1231 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonZkEVMV2ExistentEtrog", + "sourceName": "contracts/v2/consensus/zkEVM/PolygonZkEVMV2ExistentEtrog.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRootV2", + "name": "_globalExitRootManager", + "type": "address" + }, + { + "internalType": "contract IERC20Upgradeable", + "name": "_pol", + "type": "address" + }, + { + "internalType": "contract IPolygonZkEVMBridgeV2", + "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": "ForceBatchesDescentralized", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchesNotAllowedOnEmergencyState", + "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": "HaltTimeoutNotExpiredAfterEmergencyState", + "type": "error" + }, + { + "inputs": [], + "name": "HugeTokenMetadataNotSupported", + "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": [ + { + "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": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "lastGlobalExitRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "sequencer", + "type": "address" + } + ], + "name": "InitialSequenceBatches", + "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" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "l1InfoRoot", + "type": "bytes32" + } + ], + "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": "address", + "name": "newForceBatchAddress", + "type": "address" + } + ], + "name": "SetForceBatchAddress", + "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": false, + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "lastGlobalExitRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "sequencer", + "type": "address" + } + ], + "name": "UpdateEtrogSequence", + "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": "GLOBAL_EXIT_ROOT_MANAGER_L2", + "outputs": [ + { + "internalType": "contract IBasePolygonZkEVMGlobalExitRoot", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_LIST_LEN_LEN", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS_EMPTY_METADATA", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_CONSTANT_BYTES", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_CONSTANT_BYTES_EMPTY_METADATA", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_DATA_LEN_EMPTY_METADATA", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_EFFECTIVE_PERCENTAGE", + "outputs": [ + { + "internalType": "bytes1", + "name": "", + "type": "bytes1" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SET_UP_ETROG_TX", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "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": "admin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "bridgeAddress", + "outputs": [ + { + "internalType": "contract IPolygonZkEVMBridgeV2", + "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": "forceBatchAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "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": "gapLastTimestamp", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "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" + }, + { + "internalType": "bytes", + "name": "_gasTokenMetadata", + "type": "bytes" + } + ], + "name": "generateInitializeTransaction", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalExitRootManager", + "outputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRootV2", + "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": "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": "", + "type": "uint64" + } + ], + "name": "initializeUpgrade", + "outputs": [], + "stateMutability": "nonpayable", + "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": "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": "forcedGlobalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "forcedTimestamp", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "forcedBlockHashL1", + "type": "bytes32" + } + ], + "internalType": "struct PolygonRollupBaseEtrog.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": "forcedGlobalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "forcedTimestamp", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "forcedBlockHashL1", + "type": "bytes32" + } + ], + "internalType": "struct PolygonRollupBaseEtrog.BatchData[]", + "name": "batches", + "type": "tuple[]" + } + ], + "name": "sequenceForceBatches", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newForceBatchAddress", + "type": "address" + } + ], + "name": "setForceBatchAddress", + "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": "0x6101006040523480156200001257600080fd5b5060405162004fa538038062004fa5833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e051614dd5620001d06000396000818161052d015281816109de01528181610b4b01528181610d9e0152818161130b015281816117b101528181611c2301528181611d21015281816122bd0152818161260c0152818161294d01528181612a15015281816133820152818161340301528181613425015261353d01526000818161068701528181610ff801528181611ef101528181611ff90152612ea80152600081816107660152818161117f0152818161248001528181612b600152612f2a0152600081816107980152818161087601528181611c6c01528181612b3401526134d30152614dd56000f3fe608060405234801561001057600080fd5b50600436106102fe5760003560e01c80637a5460c51161019c578063c754c7ed116100ee578063e46761c411610097578063ecef3f9911610071578063ecef3f99146107ed578063f35dda4714610800578063f851a4401461080857600080fd5b8063e46761c414610793578063e7a7ed02146107ba578063eaeb077b146107da57600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610741578063d02103ca14610761578063d7bc90ff1461078857600080fd5b8063c754c7ed146106f6578063c7fffd4b14610726578063c89e42df1461072e57600080fd5b8063a3c573eb11610150578063af7f3e021161012a578063af7f3e02146106cf578063b0afe154146106d7578063bb590708146106e357600080fd5b8063a3c573eb14610682578063a652f26c146106a9578063ada8f919146106bc57600080fd5b806391cafe321161018157806391cafe32146106415780639e001877146106545780639f26f8401461066f57600080fd5b80637a5460c5146105fd5780638c3d73011461063957600080fd5b806340b5de6c11610255578063542028d5116102095780636e05d2cd116101e35780636e05d2cd146105ce5780636ff512cc146105d757806371257022146105ea57600080fd5b8063542028d51461059e578063676870d2146105a65780636b8616ce146105ae57600080fd5b806349b7b8021161023a57806349b7b802146105285780634e4877061461054f57806352bdeb6d1461056257600080fd5b806340b5de6c146104a8578063456052671461050057600080fd5b806326782247116102b757806332c2d1531161029157806332c2d153146104365780633c351e101461044b5780633cbc795b1461046b57600080fd5b806326782247146103a45780632a9f208f146103e95780632c111c061461041657600080fd5b806305835f37116102e857806305835f3714610339578063107bf28c1461038257806311e892d41461038a57600080fd5b8062d0295d14610303578063035089631461031e575b600080fd5b61030b61082e565b6040519081526020015b60405180910390f35b610326602081565b60405161ffff9091168152602001610315565b6103756040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516103159190613f1a565b61037561094e565b61039260f981565b60405160ff9091168152602001610315565b6001546103c49073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610315565b6007546103fd9067ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610315565b6008546103c49073ffffffffffffffffffffffffffffffffffffffff1681565b610449610444366004613f6f565b6109dc565b005b6009546103c49073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104939074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610315565b6104cf7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff000000000000000000000000000000000000000000000000000000000000009091168152602001610315565b6007546103fd90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b61044961055d366004613fb1565b610aab565b6103756040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610375610cc5565b610326601f81565b61030b6105bc366004613fb1565b60066020526000908152604090205481565b61030b60055481565b6104496105e5366004613fce565b610cd2565b6104496105f8366004614117565b610d9c565b6103756040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610449611548565b61044961064f366004613fce565b61161b565b6103c473a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b61044961067d366004614210565b611734565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b6103756106b7366004614252565b611df0565b6104496106ca366004613fce565b6121d5565b61037561229f565b61030b6405ca1ab1e081565b6104496106f13660046142c7565b6122bb565b6007546103fd907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61039260e481565b61044961073c36600461436d565b612842565b6002546103c49073ffffffffffffffffffffffffffffffffffffffff1681565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b61030b635ca1ab1e81565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b6007546103fd9068010000000000000000900467ffffffffffffffff1681565b6104496107e83660046143a2565b6128d5565b6104496107fb36600461441a565b612ddd565b610392601b81565b6000546103c49062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156108bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e19190614466565b6007549091506000906109209067ffffffffffffffff7001000000000000000000000000000000008204811691680100000000000000009004166144ae565b67ffffffffffffffff1690508060000361093d5760009250505090565b61094781836144d6565b9250505090565b6004805461095b90614511565b80601f016020809104026020016040519081016040528092919081815260200182805461098790614511565b80156109d45780601f106109a9576101008083540402835291602001916109d4565b820191906000526020600020905b8154815290600101906020018083116109b757829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a4b576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a9e91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610b02576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b49576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd89190614564565b610c415760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c41576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461095b90614511565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610d29576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610cba565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610e0b576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610e2b5750600054600160ff909116105b80610e455750303b158015610e45575060005460ff166001145b610ed6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610f3457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff85161561112057610f5b85613612565b610f6486613722565b610f6d87613829565b604051602001610f7f93929190614586565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611040573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106491906145bf565b915091508163ffffffff166000146110dc576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff84161717905561111d565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b60095460009061116890889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685611df0565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120c9190614466565b90506000808483858f6112206001436145f9565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611369573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138d919061460c565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550886003908161141f9190614677565b50600461142c8982614677565b508c600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e6040516114cd93929190614791565b60405180910390a1505050505050801561153f57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611599576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611672576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff166116c1576040517fd40d91c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610cba565b60085473ffffffffffffffffffffffffffffffffffffffff1615801590611773575060085473ffffffffffffffffffffffffffffffffffffffff163314155b156117aa576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561181a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183e919061460c565b61184891906147d0565b67ffffffffffffffff16111561188a576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036118c6576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611902576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff68010000000000000000820481169161193d9184917001000000000000000000000000000000009004166147f1565b1115611975576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015611c1d5760008686838181106119ba576119ba614804565b90506020028101906119cc9190614833565b6119d590614871565b9050836119e1816148fa565b825180516020918201208185015160408087015160608801519151959a50929550600094611a4e948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114611ad7576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055611afc6001886145f9565b8403611b6b5742600760189054906101000a900467ffffffffffffffff168460400151611b2991906147d0565b67ffffffffffffffff161115611b6b576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc016040516020818303038152906040528051906020012094505050508080611c1590614921565b91505061199e565b50611c937f000000000000000000000000000000000000000000000000000000000000000084611c4b61082e565b611c559190614959565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016919061391c565b60058190556007805467ffffffffffffffff8416700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff9091161790556040517f9a908e7300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611d6d908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af1158015611d8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db0919061460c565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa600087604051602401611e2496959493929190614970565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff7000000000000000000000000000000000000000000000000000000001790528351909150606090600003611f755760f9601f8351611eb991906149d3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611f5f97969594939291906149ee565b6040516020818303038152906040529050612079565b815161ffff1015611fb2576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611fc16020836149d3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016120669796959493929190614ad1565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156120da573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612152576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906121989084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614bb4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461222c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610cba565b6040518060a0016040528060628152602001614d3e6062913981565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461232a576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff161580801561234a5750600054600160ff909116105b806123645750303b158015612364575060005460ff166001145b6123f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610ecd565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561244e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60006040518060a0016040528060628152602001614d3e606291399050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250d9190614466565b90506000878483858e6125216001436145f9565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af115801561266a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268e919061460c565b50600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8f81169190910291909117909155600280547fffffffffffffffffffffffff000000000000000000000000000000000000000016918d1691909117905560036127178b82614677565b5060046127248a82614677565b50600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8e161790556007805477ffffffffffffffffffffffffffffffffffffffffffffffff167a0697800000000000000000000000000000000000000000000000001790556040517f2bf779968f2cd549d28a94deec97630ab04362cb219c64664de7d2e21f3ccf46906127d690879085908f90614791565b60405180910390a15050505050801561153f57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611536565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612899576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036128a58282614677565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610cba9190613f1a565b60085473ffffffffffffffffffffffffffffffffffffffff1615801590612914575060085473ffffffffffffffffffffffffffffffffffffffff163314155b1561294b576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129da9190614564565b15612a11576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aa29190614466565b905081811115612ade576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612b1a576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b5c73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846139f5565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bed9190614466565b600780549192506801000000000000000090910467ffffffffffffffff16906008612c17836148fa565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612c4e929190614c10565b6040519081900390208142612c646001436145f9565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612d77576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612dd6565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612dcd9493929190614c20565b60405180910390a25b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612e2e576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003612e6a576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612ea6576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612f0e57600080fd5b505af1158015612f22573d6000803e3d6000fd5b5050505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fb79190614466565b600754600554919250429170010000000000000000000000000000000090910467ffffffffffffffff16908160005b868110156132e85760008a8a8381811061300257613002614804565b90506020028101906130149190614833565b61301d90614871565b8051805160209091012060408201519192509067ffffffffffffffff16156132025785613049816148fa565b9650506000818360200151846040015185606001516040516020016130ac9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114613135576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209550600660008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060009055506132d3565b8151516201d4c01015613241576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201526000609c82015260bc016040516020818303038152906040528051906020012094505b505080806132e090614921565b915050612fe6565b5060075467ffffffffffffffff680100000000000000009091048116908416111561333f576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff848116908316146133fd57600061336583866144ae565b905061337b67ffffffffffffffff8216836145f9565b91506133b47f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611c4b61082e565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6134fb337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa15801561348e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134b29190614466565b6134bc9190614959565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906139f5565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af115801561359b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135bf919061460c565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e766886040516135fd91815260200190565b60405180910390a25050505050505050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916136949190614c91565b600060405180830381855afa9150503d80600081146136cf576040519150601f19603f3d011682016040523d82523d6000602084013e6136d4565b606091505b509150915081613719576040518060400160405280600781526020017f4e4f5f4e414d45000000000000000000000000000000000000000000000000008152506121cd565b6121cd81613a59565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916137a49190614c91565b600060405180830381855afa9150503d80600081146137df576040519150601f19603f3d011682016040523d82523d6000602084013e6137e4565b606091505b509150915081613719576040518060400160405280600981526020017f4e4f5f53594d424f4c00000000000000000000000000000000000000000000008152506121cd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8616916138aa9190614c91565b600060405180830381855afa9150503d80600081146138e5576040519150601f19603f3d011682016040523d82523d6000602084013e6138ea565b606091505b50915091508180156138fd575080516020145b6139085760126121cd565b808060200190518101906121cd9190614ca3565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526139f09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613c2f565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052613a539085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161396e565b50505050565b60606040825110613a7e5781806020019051810190613a789190614cc6565b92915050565b8151602003613bf65760005b602081108015613ad15750828181518110613aa757613aa7614804565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613ae85780613ae081614921565b915050613a8a565b80600003613b2b57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115613b4657613b46613ffd565b6040519080825280601f01601f191660200182016040528015613b70576020820181803683370190505b50905060005b82811015613bee57848181518110613b9057613b90614804565b602001015160f81c60f81b828281518110613bad57613bad614804565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080613be681614921565b915050613b76565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b6000613c91826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613d3b9092919063ffffffff16565b8051909150156139f05780806020019051810190613caf9190614564565b6139f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610ecd565b60606121cd8484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051613d6f9190614c91565b60006040518083038185875af1925050503d8060008114613dac576040519150601f19603f3d011682016040523d82523d6000602084013e613db1565b606091505b5091509150613dc287838387613dcd565b979650505050505050565b60608315613e63578251600003613e5c5773ffffffffffffffffffffffffffffffffffffffff85163b613e5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ecd565b50816121cd565b6121cd8383815115613e785781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecd9190613f1a565b60005b83811015613ec7578181015183820152602001613eaf565b50506000910152565b60008151808452613ee8816020860160208601613eac565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613f2d6020830184613ed0565b9392505050565b67ffffffffffffffff81168114613f4a57600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613f4a57600080fd5b600080600060608486031215613f8457600080fd5b8335613f8f81613f34565b9250602084013591506040840135613fa681613f4d565b809150509250925092565b600060208284031215613fc357600080fd5b8135613f2d81613f34565b600060208284031215613fe057600080fd5b8135613f2d81613f4d565b63ffffffff81168114613f4a57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561407357614073613ffd565b604052919050565b600067ffffffffffffffff82111561409557614095613ffd565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126140d257600080fd5b81356140e56140e08261407b565b61402c565b8181528460208386010111156140fa57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561413057600080fd5b863561413b81613f4d565b9550602087013561414b81613f4d565b9450604087013561415b81613feb565b9350606087013561416b81613f4d565b9250608087013567ffffffffffffffff8082111561418857600080fd5b6141948a838b016140c1565b935060a08901359150808211156141aa57600080fd5b506141b789828a016140c1565b9150509295509295509295565b60008083601f8401126141d657600080fd5b50813567ffffffffffffffff8111156141ee57600080fd5b6020830191508360208260051b850101111561420957600080fd5b9250929050565b6000806020838503121561422357600080fd5b823567ffffffffffffffff81111561423a57600080fd5b614246858286016141c4565b90969095509350505050565b6000806000806080858703121561426857600080fd5b843561427381613feb565b9350602085013561428381613f4d565b9250604085013561429381613feb565b9150606085013567ffffffffffffffff8111156142af57600080fd5b6142bb878288016140c1565b91505092959194509250565b60008060008060008060c087890312156142e057600080fd5b86356142eb81613f4d565b955060208701356142fb81613f4d565b9450604087013567ffffffffffffffff8082111561431857600080fd5b6143248a838b016140c1565b9550606089013591508082111561433a57600080fd5b5061434789828a016140c1565b9350506080870135915060a087013561435f81613f34565b809150509295509295509295565b60006020828403121561437f57600080fd5b813567ffffffffffffffff81111561439657600080fd5b6121cd848285016140c1565b6000806000604084860312156143b757600080fd5b833567ffffffffffffffff808211156143cf57600080fd5b818601915086601f8301126143e357600080fd5b8135818111156143f257600080fd5b87602082850101111561440457600080fd5b6020928301989097509590910135949350505050565b60008060006040848603121561442f57600080fd5b833567ffffffffffffffff81111561444657600080fd5b614452868287016141c4565b9094509250506020840135613fa681613f4d565b60006020828403121561447857600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8281168282160390808211156144cf576144cf61447f565b5092915050565b60008261450c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061452557607f821691505b60208210810361455e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561457657600080fd5b81518015158114613f2d57600080fd5b6060815260006145996060830186613ed0565b82810360208401526145ab8186613ed0565b91505060ff83166040830152949350505050565b600080604083850312156145d257600080fd5b82516145dd81613feb565b60208401519092506145ee81613f4d565b809150509250929050565b81810381811115613a7857613a7861447f565b60006020828403121561461e57600080fd5b8151613f2d81613f34565b601f8211156139f057600081815260208120601f850160051c810160208610156146505750805b601f850160051c820191505b8181101561466f5782815560010161465c565b505050505050565b815167ffffffffffffffff81111561469157614691613ffd565b6146a58161469f8454614511565b84614629565b602080601f8311600181146146f857600084156146c25750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561466f565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561474557888601518255948401946001909101908401614726565b508582101561478157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006147a46060830186613ed0565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff8181168382160190808211156144cf576144cf61447f565b80820180821115613a7857613a7861447f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261486757600080fd5b9190910192915050565b60006080823603121561488357600080fd5b6040516080810167ffffffffffffffff82821081831117156148a7576148a7613ffd565b8160405284359150808211156148bc57600080fd5b506148c9368286016140c1565b8252506020830135602082015260408301356148e481613f34565b6040820152606092830135928101929092525090565b600067ffffffffffffffff8083168181036149175761491761447f565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149525761495261447f565b5060010190565b8082028115828204841417613a7857613a7861447f565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a08301526149c760c0830184613ed0565b98975050505050505050565b61ffff8181168382160190808211156144cf576144cf61447f565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614a57816003860160208c01613eac565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614a9a816017840160208b01613eac565b808201915050818660f81b16601782015284519150614ac0826018830160208801613eac565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614b3a816003860160208c01613eac565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614b7d816017840160208b01613eac565b808201915050818660f01b16601782015284519150614ba3826019830160208801613eac565b016019019998505050505050505050565b60008651614bc6818460208b01613eac565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b60008251614867818460208701613eac565b600060208284031215614cb557600080fd5b815160ff81168114613f2d57600080fd5b600060208284031215614cd857600080fd5b815167ffffffffffffffff811115614cef57600080fd5b8201601f81018413614d0057600080fd5b8051614d0e6140e08261407b565b818152856020838501011115614d2357600080fd5b614d34826020830160208601613eac565b9594505050505056fedf2a8080944d5cf5032b2a844602278b01199ed191a86c93ff80808210928080ba42034e163abcd726e65aac3b7c747e8d36cd473b2419910ffa3fb96c10b9df28e9b6f13e927dd66ab2281a5cdeb98cdb3d49d09be9ba1b1716535c650f012b1bffa264697066735822122009fb21d9c95081ff5eda7e3294010ff8501b88596d28a0c989dfb47c2a65229964736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102fe5760003560e01c80637a5460c51161019c578063c754c7ed116100ee578063e46761c411610097578063ecef3f9911610071578063ecef3f99146107ed578063f35dda4714610800578063f851a4401461080857600080fd5b8063e46761c414610793578063e7a7ed02146107ba578063eaeb077b146107da57600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610741578063d02103ca14610761578063d7bc90ff1461078857600080fd5b8063c754c7ed146106f6578063c7fffd4b14610726578063c89e42df1461072e57600080fd5b8063a3c573eb11610150578063af7f3e021161012a578063af7f3e02146106cf578063b0afe154146106d7578063bb590708146106e357600080fd5b8063a3c573eb14610682578063a652f26c146106a9578063ada8f919146106bc57600080fd5b806391cafe321161018157806391cafe32146106415780639e001877146106545780639f26f8401461066f57600080fd5b80637a5460c5146105fd5780638c3d73011461063957600080fd5b806340b5de6c11610255578063542028d5116102095780636e05d2cd116101e35780636e05d2cd146105ce5780636ff512cc146105d757806371257022146105ea57600080fd5b8063542028d51461059e578063676870d2146105a65780636b8616ce146105ae57600080fd5b806349b7b8021161023a57806349b7b802146105285780634e4877061461054f57806352bdeb6d1461056257600080fd5b806340b5de6c146104a8578063456052671461050057600080fd5b806326782247116102b757806332c2d1531161029157806332c2d153146104365780633c351e101461044b5780633cbc795b1461046b57600080fd5b806326782247146103a45780632a9f208f146103e95780632c111c061461041657600080fd5b806305835f37116102e857806305835f3714610339578063107bf28c1461038257806311e892d41461038a57600080fd5b8062d0295d14610303578063035089631461031e575b600080fd5b61030b61082e565b6040519081526020015b60405180910390f35b610326602081565b60405161ffff9091168152602001610315565b6103756040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516103159190613f1a565b61037561094e565b61039260f981565b60405160ff9091168152602001610315565b6001546103c49073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610315565b6007546103fd9067ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610315565b6008546103c49073ffffffffffffffffffffffffffffffffffffffff1681565b610449610444366004613f6f565b6109dc565b005b6009546103c49073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104939074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610315565b6104cf7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff000000000000000000000000000000000000000000000000000000000000009091168152602001610315565b6007546103fd90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b61044961055d366004613fb1565b610aab565b6103756040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610375610cc5565b610326601f81565b61030b6105bc366004613fb1565b60066020526000908152604090205481565b61030b60055481565b6104496105e5366004613fce565b610cd2565b6104496105f8366004614117565b610d9c565b6103756040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610449611548565b61044961064f366004613fce565b61161b565b6103c473a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b61044961067d366004614210565b611734565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b6103756106b7366004614252565b611df0565b6104496106ca366004613fce565b6121d5565b61037561229f565b61030b6405ca1ab1e081565b6104496106f13660046142c7565b6122bb565b6007546103fd907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61039260e481565b61044961073c36600461436d565b612842565b6002546103c49073ffffffffffffffffffffffffffffffffffffffff1681565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b61030b635ca1ab1e81565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b6007546103fd9068010000000000000000900467ffffffffffffffff1681565b6104496107e83660046143a2565b6128d5565b6104496107fb36600461441a565b612ddd565b610392601b81565b6000546103c49062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156108bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e19190614466565b6007549091506000906109209067ffffffffffffffff7001000000000000000000000000000000008204811691680100000000000000009004166144ae565b67ffffffffffffffff1690508060000361093d5760009250505090565b61094781836144d6565b9250505090565b6004805461095b90614511565b80601f016020809104026020016040519081016040528092919081815260200182805461098790614511565b80156109d45780601f106109a9576101008083540402835291602001916109d4565b820191906000526020600020905b8154815290600101906020018083116109b757829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a4b576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a9e91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610b02576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b49576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd89190614564565b610c415760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c41576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461095b90614511565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610d29576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610cba565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610e0b576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610e2b5750600054600160ff909116105b80610e455750303b158015610e45575060005460ff166001145b610ed6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610f3457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff85161561112057610f5b85613612565b610f6486613722565b610f6d87613829565b604051602001610f7f93929190614586565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611040573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106491906145bf565b915091508163ffffffff166000146110dc576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff84161717905561111d565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b60095460009061116890889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685611df0565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120c9190614466565b90506000808483858f6112206001436145f9565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611369573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138d919061460c565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550886003908161141f9190614677565b50600461142c8982614677565b508c600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e6040516114cd93929190614791565b60405180910390a1505050505050801561153f57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611599576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611672576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff166116c1576040517fd40d91c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610cba565b60085473ffffffffffffffffffffffffffffffffffffffff1615801590611773575060085473ffffffffffffffffffffffffffffffffffffffff163314155b156117aa576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561181a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183e919061460c565b61184891906147d0565b67ffffffffffffffff16111561188a576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036118c6576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611902576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff68010000000000000000820481169161193d9184917001000000000000000000000000000000009004166147f1565b1115611975576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015611c1d5760008686838181106119ba576119ba614804565b90506020028101906119cc9190614833565b6119d590614871565b9050836119e1816148fa565b825180516020918201208185015160408087015160608801519151959a50929550600094611a4e948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114611ad7576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055611afc6001886145f9565b8403611b6b5742600760189054906101000a900467ffffffffffffffff168460400151611b2991906147d0565b67ffffffffffffffff161115611b6b576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc016040516020818303038152906040528051906020012094505050508080611c1590614921565b91505061199e565b50611c937f000000000000000000000000000000000000000000000000000000000000000084611c4b61082e565b611c559190614959565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016919061391c565b60058190556007805467ffffffffffffffff8416700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff9091161790556040517f9a908e7300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611d6d908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af1158015611d8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db0919061460c565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa600087604051602401611e2496959493929190614970565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff7000000000000000000000000000000000000000000000000000000001790528351909150606090600003611f755760f9601f8351611eb991906149d3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611f5f97969594939291906149ee565b6040516020818303038152906040529050612079565b815161ffff1015611fb2576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611fc16020836149d3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016120669796959493929190614ad1565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156120da573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612152576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906121989084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614bb4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461222c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610cba565b6040518060a0016040528060628152602001614d3e6062913981565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461232a576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff161580801561234a5750600054600160ff909116105b806123645750303b158015612364575060005460ff166001145b6123f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610ecd565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561244e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60006040518060a0016040528060628152602001614d3e606291399050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250d9190614466565b90506000878483858e6125216001436145f9565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af115801561266a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268e919061460c565b50600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8f81169190910291909117909155600280547fffffffffffffffffffffffff000000000000000000000000000000000000000016918d1691909117905560036127178b82614677565b5060046127248a82614677565b50600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8e161790556007805477ffffffffffffffffffffffffffffffffffffffffffffffff167a0697800000000000000000000000000000000000000000000000001790556040517f2bf779968f2cd549d28a94deec97630ab04362cb219c64664de7d2e21f3ccf46906127d690879085908f90614791565b60405180910390a15050505050801561153f57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611536565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612899576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036128a58282614677565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610cba9190613f1a565b60085473ffffffffffffffffffffffffffffffffffffffff1615801590612914575060085473ffffffffffffffffffffffffffffffffffffffff163314155b1561294b576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129da9190614564565b15612a11576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aa29190614466565b905081811115612ade576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612b1a576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b5c73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846139f5565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bed9190614466565b600780549192506801000000000000000090910467ffffffffffffffff16906008612c17836148fa565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612c4e929190614c10565b6040519081900390208142612c646001436145f9565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612d77576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612dd6565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612dcd9493929190614c20565b60405180910390a25b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612e2e576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003612e6a576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612ea6576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612f0e57600080fd5b505af1158015612f22573d6000803e3d6000fd5b5050505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fb79190614466565b600754600554919250429170010000000000000000000000000000000090910467ffffffffffffffff16908160005b868110156132e85760008a8a8381811061300257613002614804565b90506020028101906130149190614833565b61301d90614871565b8051805160209091012060408201519192509067ffffffffffffffff16156132025785613049816148fa565b9650506000818360200151846040015185606001516040516020016130ac9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114613135576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209550600660008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060009055506132d3565b8151516201d4c01015613241576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201526000609c82015260bc016040516020818303038152906040528051906020012094505b505080806132e090614921565b915050612fe6565b5060075467ffffffffffffffff680100000000000000009091048116908416111561333f576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff848116908316146133fd57600061336583866144ae565b905061337b67ffffffffffffffff8216836145f9565b91506133b47f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611c4b61082e565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6134fb337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa15801561348e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134b29190614466565b6134bc9190614959565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906139f5565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af115801561359b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135bf919061460c565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e766886040516135fd91815260200190565b60405180910390a25050505050505050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916136949190614c91565b600060405180830381855afa9150503d80600081146136cf576040519150601f19603f3d011682016040523d82523d6000602084013e6136d4565b606091505b509150915081613719576040518060400160405280600781526020017f4e4f5f4e414d45000000000000000000000000000000000000000000000000008152506121cd565b6121cd81613a59565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916137a49190614c91565b600060405180830381855afa9150503d80600081146137df576040519150601f19603f3d011682016040523d82523d6000602084013e6137e4565b606091505b509150915081613719576040518060400160405280600981526020017f4e4f5f53594d424f4c00000000000000000000000000000000000000000000008152506121cd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8616916138aa9190614c91565b600060405180830381855afa9150503d80600081146138e5576040519150601f19603f3d011682016040523d82523d6000602084013e6138ea565b606091505b50915091508180156138fd575080516020145b6139085760126121cd565b808060200190518101906121cd9190614ca3565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526139f09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613c2f565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052613a539085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161396e565b50505050565b60606040825110613a7e5781806020019051810190613a789190614cc6565b92915050565b8151602003613bf65760005b602081108015613ad15750828181518110613aa757613aa7614804565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613ae85780613ae081614921565b915050613a8a565b80600003613b2b57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115613b4657613b46613ffd565b6040519080825280601f01601f191660200182016040528015613b70576020820181803683370190505b50905060005b82811015613bee57848181518110613b9057613b90614804565b602001015160f81c60f81b828281518110613bad57613bad614804565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080613be681614921565b915050613b76565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b6000613c91826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613d3b9092919063ffffffff16565b8051909150156139f05780806020019051810190613caf9190614564565b6139f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610ecd565b60606121cd8484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051613d6f9190614c91565b60006040518083038185875af1925050503d8060008114613dac576040519150601f19603f3d011682016040523d82523d6000602084013e613db1565b606091505b5091509150613dc287838387613dcd565b979650505050505050565b60608315613e63578251600003613e5c5773ffffffffffffffffffffffffffffffffffffffff85163b613e5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ecd565b50816121cd565b6121cd8383815115613e785781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecd9190613f1a565b60005b83811015613ec7578181015183820152602001613eaf565b50506000910152565b60008151808452613ee8816020860160208601613eac565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613f2d6020830184613ed0565b9392505050565b67ffffffffffffffff81168114613f4a57600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613f4a57600080fd5b600080600060608486031215613f8457600080fd5b8335613f8f81613f34565b9250602084013591506040840135613fa681613f4d565b809150509250925092565b600060208284031215613fc357600080fd5b8135613f2d81613f34565b600060208284031215613fe057600080fd5b8135613f2d81613f4d565b63ffffffff81168114613f4a57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561407357614073613ffd565b604052919050565b600067ffffffffffffffff82111561409557614095613ffd565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126140d257600080fd5b81356140e56140e08261407b565b61402c565b8181528460208386010111156140fa57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561413057600080fd5b863561413b81613f4d565b9550602087013561414b81613f4d565b9450604087013561415b81613feb565b9350606087013561416b81613f4d565b9250608087013567ffffffffffffffff8082111561418857600080fd5b6141948a838b016140c1565b935060a08901359150808211156141aa57600080fd5b506141b789828a016140c1565b9150509295509295509295565b60008083601f8401126141d657600080fd5b50813567ffffffffffffffff8111156141ee57600080fd5b6020830191508360208260051b850101111561420957600080fd5b9250929050565b6000806020838503121561422357600080fd5b823567ffffffffffffffff81111561423a57600080fd5b614246858286016141c4565b90969095509350505050565b6000806000806080858703121561426857600080fd5b843561427381613feb565b9350602085013561428381613f4d565b9250604085013561429381613feb565b9150606085013567ffffffffffffffff8111156142af57600080fd5b6142bb878288016140c1565b91505092959194509250565b60008060008060008060c087890312156142e057600080fd5b86356142eb81613f4d565b955060208701356142fb81613f4d565b9450604087013567ffffffffffffffff8082111561431857600080fd5b6143248a838b016140c1565b9550606089013591508082111561433a57600080fd5b5061434789828a016140c1565b9350506080870135915060a087013561435f81613f34565b809150509295509295509295565b60006020828403121561437f57600080fd5b813567ffffffffffffffff81111561439657600080fd5b6121cd848285016140c1565b6000806000604084860312156143b757600080fd5b833567ffffffffffffffff808211156143cf57600080fd5b818601915086601f8301126143e357600080fd5b8135818111156143f257600080fd5b87602082850101111561440457600080fd5b6020928301989097509590910135949350505050565b60008060006040848603121561442f57600080fd5b833567ffffffffffffffff81111561444657600080fd5b614452868287016141c4565b9094509250506020840135613fa681613f4d565b60006020828403121561447857600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8281168282160390808211156144cf576144cf61447f565b5092915050565b60008261450c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061452557607f821691505b60208210810361455e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561457657600080fd5b81518015158114613f2d57600080fd5b6060815260006145996060830186613ed0565b82810360208401526145ab8186613ed0565b91505060ff83166040830152949350505050565b600080604083850312156145d257600080fd5b82516145dd81613feb565b60208401519092506145ee81613f4d565b809150509250929050565b81810381811115613a7857613a7861447f565b60006020828403121561461e57600080fd5b8151613f2d81613f34565b601f8211156139f057600081815260208120601f850160051c810160208610156146505750805b601f850160051c820191505b8181101561466f5782815560010161465c565b505050505050565b815167ffffffffffffffff81111561469157614691613ffd565b6146a58161469f8454614511565b84614629565b602080601f8311600181146146f857600084156146c25750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561466f565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561474557888601518255948401946001909101908401614726565b508582101561478157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006147a46060830186613ed0565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff8181168382160190808211156144cf576144cf61447f565b80820180821115613a7857613a7861447f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261486757600080fd5b9190910192915050565b60006080823603121561488357600080fd5b6040516080810167ffffffffffffffff82821081831117156148a7576148a7613ffd565b8160405284359150808211156148bc57600080fd5b506148c9368286016140c1565b8252506020830135602082015260408301356148e481613f34565b6040820152606092830135928101929092525090565b600067ffffffffffffffff8083168181036149175761491761447f565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149525761495261447f565b5060010190565b8082028115828204841417613a7857613a7861447f565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a08301526149c760c0830184613ed0565b98975050505050505050565b61ffff8181168382160190808211156144cf576144cf61447f565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614a57816003860160208c01613eac565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614a9a816017840160208b01613eac565b808201915050818660f81b16601782015284519150614ac0826018830160208801613eac565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614b3a816003860160208c01613eac565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614b7d816017840160208b01613eac565b808201915050818660f01b16601782015284519150614ba3826019830160208801613eac565b016019019998505050505050505050565b60008651614bc6818460208b01613eac565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b60008251614867818460208701613eac565b600060208284031215614cb557600080fd5b815160ff81168114613f2d57600080fd5b600060208284031215614cd857600080fd5b815167ffffffffffffffff811115614cef57600080fd5b8201601f81018413614d0057600080fd5b8051614d0e6140e08261407b565b818152856020838501011115614d2357600080fd5b614d34826020830160208601613eac565b9594505050505056fedf2a8080944d5cf5032b2a844602278b01199ed191a86c93ff80808210928080ba42034e163abcd726e65aac3b7c747e8d36cd473b2419910ffa3fb96c10b9df28e9b6f13e927dd66ab2281a5cdeb98cdb3d49d09be9ba1b1716535c650f012b1bffa264697066735822122009fb21d9c95081ff5eda7e3294010ff8501b88596d28a0c989dfb47c2a65229964736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} From 2847c6b869818ea88ffca742f667489ca65ee309 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 16 Jan 2024 10:24:19 +0100 Subject: [PATCH 141/230] update tx set up etrog --- .../mocks/VerifierRollupHelperMock copy.sol | 26 +++++++++++++++++++ .../zkEVM/PolygonZkEVMV2ExistentEtrog.sol | 22 ++++++++++++++-- 2 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 contracts/mocks/VerifierRollupHelperMock copy.sol diff --git a/contracts/mocks/VerifierRollupHelperMock copy.sol b/contracts/mocks/VerifierRollupHelperMock copy.sol new file mode 100644 index 000000000..a18220174 --- /dev/null +++ b/contracts/mocks/VerifierRollupHelperMock copy.sol @@ -0,0 +1,26 @@ +// // SPDX-License-Identifier: AGPL-3.0 + +// pragma solidity 0.8.20; + +// import "../interfaces/IVerifierRollup.sol"; +// import "../verifiers/FflonkVerifier.sol"; +// import "@openzeppelin/contracts/access/Ownable.sol"; + +// contract VerifierRollupHelperMock is FflonkVerifier, Ownable { +// bool public realVerifier; + +// function verifyProof( +// bytes32[24] calldata proof, +// uint256[1] calldata pubSignals +// ) public pure override returns (bool) { +// if (realVerifier == true) { +// return super.verifyProof(proof, pubSignals); +// } else { +// return true; +// } +// } + +// function switchRealVerifier() public onlyOwner { +// realVerifier = !realVerifier; +// } +// } diff --git a/contracts/v2/consensus/zkEVM/PolygonZkEVMV2ExistentEtrog.sol b/contracts/v2/consensus/zkEVM/PolygonZkEVMV2ExistentEtrog.sol index cc317d47d..1becd3439 100644 --- a/contracts/v2/consensus/zkEVM/PolygonZkEVMV2ExistentEtrog.sol +++ b/contracts/v2/consensus/zkEVM/PolygonZkEVMV2ExistentEtrog.sol @@ -12,9 +12,27 @@ import "../../lib/PolygonRollupBaseEtrog.sol"; * To enter and exit of the L2 network will be used a PolygonZkEVMBridge smart contract that will be deployed in both networks. */ contract PolygonZkEVMV2ExistentEtrog is PolygonRollupBaseEtrog { - // Transaction that will be injected as a forced transaction, to setup the timestamp on the state root + // Transaction that will be injected as a forced transaction, to setup the timestamp on the state root, we just need a well encoded RLP transaction + // It's ok if the transaction is not processable + /* Encoded transaction: + { + "from": "0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", + "to": "0x4d5Cf5032B2a844602278b01199ED191A86c93ff", + "nonce": 42, + "data": "0x", + "value": "0", + "gasLimit": 0, + "gasPrice": "0", + "chainId": 4242, + "overwrite": { + "v": "0x1b", + "r": "0x00000000000000000000000000000000000000000000000000000005ca1ab1e0", + "s": "0x00000000000000000000000000000000000000000000000000000005ca1ab1e0" + } + } + */ bytes public constant SET_UP_ETROG_TX = - hex"df2a8080944d5cf5032b2a844602278b01199ed191a86c93ff80808210928080ba42034e163abcd726e65aac3b7c747e8d36cd473b2419910ffa3fb96c10b9df28e9b6f13e927dd66ab2281a5cdeb98cdb3d49d09be9ba1b1716535c650f012b1bff"; + hex"df2a8080944d5cf5032b2a844602278b01199ed191a86c93ff8080821092808000000000000000000000000000000000000000000000000000000005ca1ab1e000000000000000000000000000000000000000000000000000000005ca1ab1e01bff"; /** * @dev Emitted when the system is updated to a etrog using this contract, contain the set up etrog transaction From efe19bcfd8cff16e7a9cd12c43cbf16230d1eba2 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 16 Jan 2024 10:25:56 +0100 Subject: [PATCH 142/230] delete copy cotracts --- .../mocks/VerifierRollupHelperMock copy.sol | 26 ------------------- 1 file changed, 26 deletions(-) delete mode 100644 contracts/mocks/VerifierRollupHelperMock copy.sol diff --git a/contracts/mocks/VerifierRollupHelperMock copy.sol b/contracts/mocks/VerifierRollupHelperMock copy.sol deleted file mode 100644 index a18220174..000000000 --- a/contracts/mocks/VerifierRollupHelperMock copy.sol +++ /dev/null @@ -1,26 +0,0 @@ -// // SPDX-License-Identifier: AGPL-3.0 - -// pragma solidity 0.8.20; - -// import "../interfaces/IVerifierRollup.sol"; -// import "../verifiers/FflonkVerifier.sol"; -// import "@openzeppelin/contracts/access/Ownable.sol"; - -// contract VerifierRollupHelperMock is FflonkVerifier, Ownable { -// bool public realVerifier; - -// function verifyProof( -// bytes32[24] calldata proof, -// uint256[1] calldata pubSignals -// ) public pure override returns (bool) { -// if (realVerifier == true) { -// return super.verifyProof(proof, pubSignals); -// } else { -// return true; -// } -// } - -// function switchRealVerifier() public onlyOwner { -// realVerifier = !realVerifier; -// } -// } From e9a477f8f271fe549a989489a3fd5f1d3f2c808d Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 16 Jan 2024 10:27:36 +0100 Subject: [PATCH 143/230] update paris --- .../PolygonZkEVMV2ExistentEtrog.json | 1231 +++++++++++++++++ 1 file changed, 1231 insertions(+) create mode 100644 compiled-contracts/PolygonZkEVMV2ExistentEtrog.json diff --git a/compiled-contracts/PolygonZkEVMV2ExistentEtrog.json b/compiled-contracts/PolygonZkEVMV2ExistentEtrog.json new file mode 100644 index 000000000..b47865ec4 --- /dev/null +++ b/compiled-contracts/PolygonZkEVMV2ExistentEtrog.json @@ -0,0 +1,1231 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonZkEVMV2ExistentEtrog", + "sourceName": "contracts/v2/consensus/zkEVM/PolygonZkEVMV2ExistentEtrog.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRootV2", + "name": "_globalExitRootManager", + "type": "address" + }, + { + "internalType": "contract IERC20Upgradeable", + "name": "_pol", + "type": "address" + }, + { + "internalType": "contract IPolygonZkEVMBridgeV2", + "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": "ForceBatchesDescentralized", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchesNotAllowedOnEmergencyState", + "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": "HaltTimeoutNotExpiredAfterEmergencyState", + "type": "error" + }, + { + "inputs": [], + "name": "HugeTokenMetadataNotSupported", + "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": [ + { + "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": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "lastGlobalExitRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "sequencer", + "type": "address" + } + ], + "name": "InitialSequenceBatches", + "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" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "l1InfoRoot", + "type": "bytes32" + } + ], + "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": "address", + "name": "newForceBatchAddress", + "type": "address" + } + ], + "name": "SetForceBatchAddress", + "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": false, + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "lastGlobalExitRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "sequencer", + "type": "address" + } + ], + "name": "UpdateEtrogSequence", + "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": "GLOBAL_EXIT_ROOT_MANAGER_L2", + "outputs": [ + { + "internalType": "contract IBasePolygonZkEVMGlobalExitRoot", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_LIST_LEN_LEN", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS_EMPTY_METADATA", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_CONSTANT_BYTES", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_CONSTANT_BYTES_EMPTY_METADATA", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_DATA_LEN_EMPTY_METADATA", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_EFFECTIVE_PERCENTAGE", + "outputs": [ + { + "internalType": "bytes1", + "name": "", + "type": "bytes1" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SET_UP_ETROG_TX", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "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": "admin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "bridgeAddress", + "outputs": [ + { + "internalType": "contract IPolygonZkEVMBridgeV2", + "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": "forceBatchAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "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": "gapLastTimestamp", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "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" + }, + { + "internalType": "bytes", + "name": "_gasTokenMetadata", + "type": "bytes" + } + ], + "name": "generateInitializeTransaction", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalExitRootManager", + "outputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRootV2", + "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": "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": "", + "type": "uint64" + } + ], + "name": "initializeUpgrade", + "outputs": [], + "stateMutability": "nonpayable", + "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": "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": "forcedGlobalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "forcedTimestamp", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "forcedBlockHashL1", + "type": "bytes32" + } + ], + "internalType": "struct PolygonRollupBaseEtrog.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": "forcedGlobalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "forcedTimestamp", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "forcedBlockHashL1", + "type": "bytes32" + } + ], + "internalType": "struct PolygonRollupBaseEtrog.BatchData[]", + "name": "batches", + "type": "tuple[]" + } + ], + "name": "sequenceForceBatches", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newForceBatchAddress", + "type": "address" + } + ], + "name": "setForceBatchAddress", + "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": "0x6101006040523480156200001257600080fd5b5060405162004fa538038062004fa5833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e051614dd5620001d06000396000818161052d015281816109de01528181610b4b01528181610d9e0152818161130b015281816117b101528181611c2301528181611d21015281816122bd0152818161260c0152818161294d01528181612a15015281816133820152818161340301528181613425015261353d01526000818161068701528181610ff801528181611ef101528181611ff90152612ea80152600081816107660152818161117f0152818161248001528181612b600152612f2a0152600081816107980152818161087601528181611c6c01528181612b3401526134d30152614dd56000f3fe608060405234801561001057600080fd5b50600436106102fe5760003560e01c80637a5460c51161019c578063c754c7ed116100ee578063e46761c411610097578063ecef3f9911610071578063ecef3f99146107ed578063f35dda4714610800578063f851a4401461080857600080fd5b8063e46761c414610793578063e7a7ed02146107ba578063eaeb077b146107da57600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610741578063d02103ca14610761578063d7bc90ff1461078857600080fd5b8063c754c7ed146106f6578063c7fffd4b14610726578063c89e42df1461072e57600080fd5b8063a3c573eb11610150578063af7f3e021161012a578063af7f3e02146106cf578063b0afe154146106d7578063bb590708146106e357600080fd5b8063a3c573eb14610682578063a652f26c146106a9578063ada8f919146106bc57600080fd5b806391cafe321161018157806391cafe32146106415780639e001877146106545780639f26f8401461066f57600080fd5b80637a5460c5146105fd5780638c3d73011461063957600080fd5b806340b5de6c11610255578063542028d5116102095780636e05d2cd116101e35780636e05d2cd146105ce5780636ff512cc146105d757806371257022146105ea57600080fd5b8063542028d51461059e578063676870d2146105a65780636b8616ce146105ae57600080fd5b806349b7b8021161023a57806349b7b802146105285780634e4877061461054f57806352bdeb6d1461056257600080fd5b806340b5de6c146104a8578063456052671461050057600080fd5b806326782247116102b757806332c2d1531161029157806332c2d153146104365780633c351e101461044b5780633cbc795b1461046b57600080fd5b806326782247146103a45780632a9f208f146103e95780632c111c061461041657600080fd5b806305835f37116102e857806305835f3714610339578063107bf28c1461038257806311e892d41461038a57600080fd5b8062d0295d14610303578063035089631461031e575b600080fd5b61030b61082e565b6040519081526020015b60405180910390f35b610326602081565b60405161ffff9091168152602001610315565b6103756040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516103159190613f1a565b61037561094e565b61039260f981565b60405160ff9091168152602001610315565b6001546103c49073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610315565b6007546103fd9067ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610315565b6008546103c49073ffffffffffffffffffffffffffffffffffffffff1681565b610449610444366004613f6f565b6109dc565b005b6009546103c49073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104939074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610315565b6104cf7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff000000000000000000000000000000000000000000000000000000000000009091168152602001610315565b6007546103fd90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b61044961055d366004613fb1565b610aab565b6103756040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610375610cc5565b610326601f81565b61030b6105bc366004613fb1565b60066020526000908152604090205481565b61030b60055481565b6104496105e5366004613fce565b610cd2565b6104496105f8366004614117565b610d9c565b6103756040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610449611548565b61044961064f366004613fce565b61161b565b6103c473a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b61044961067d366004614210565b611734565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b6103756106b7366004614252565b611df0565b6104496106ca366004613fce565b6121d5565b61037561229f565b61030b6405ca1ab1e081565b6104496106f13660046142c7565b6122bb565b6007546103fd907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61039260e481565b61044961073c36600461436d565b612842565b6002546103c49073ffffffffffffffffffffffffffffffffffffffff1681565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b61030b635ca1ab1e81565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b6007546103fd9068010000000000000000900467ffffffffffffffff1681565b6104496107e83660046143a2565b6128d5565b6104496107fb36600461441a565b612ddd565b610392601b81565b6000546103c49062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156108bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e19190614466565b6007549091506000906109209067ffffffffffffffff7001000000000000000000000000000000008204811691680100000000000000009004166144ae565b67ffffffffffffffff1690508060000361093d5760009250505090565b61094781836144d6565b9250505090565b6004805461095b90614511565b80601f016020809104026020016040519081016040528092919081815260200182805461098790614511565b80156109d45780601f106109a9576101008083540402835291602001916109d4565b820191906000526020600020905b8154815290600101906020018083116109b757829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a4b576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a9e91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610b02576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b49576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd89190614564565b610c415760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c41576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461095b90614511565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610d29576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610cba565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610e0b576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610e2b5750600054600160ff909116105b80610e455750303b158015610e45575060005460ff166001145b610ed6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610f3457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff85161561112057610f5b85613612565b610f6486613722565b610f6d87613829565b604051602001610f7f93929190614586565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611040573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106491906145bf565b915091508163ffffffff166000146110dc576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff84161717905561111d565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b60095460009061116890889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685611df0565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120c9190614466565b90506000808483858f6112206001436145f9565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611369573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138d919061460c565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550886003908161141f9190614677565b50600461142c8982614677565b508c600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e6040516114cd93929190614791565b60405180910390a1505050505050801561153f57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611599576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611672576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff166116c1576040517fd40d91c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610cba565b60085473ffffffffffffffffffffffffffffffffffffffff1615801590611773575060085473ffffffffffffffffffffffffffffffffffffffff163314155b156117aa576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561181a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183e919061460c565b61184891906147d0565b67ffffffffffffffff16111561188a576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036118c6576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611902576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff68010000000000000000820481169161193d9184917001000000000000000000000000000000009004166147f1565b1115611975576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015611c1d5760008686838181106119ba576119ba614804565b90506020028101906119cc9190614833565b6119d590614871565b9050836119e1816148fa565b825180516020918201208185015160408087015160608801519151959a50929550600094611a4e948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114611ad7576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055611afc6001886145f9565b8403611b6b5742600760189054906101000a900467ffffffffffffffff168460400151611b2991906147d0565b67ffffffffffffffff161115611b6b576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc016040516020818303038152906040528051906020012094505050508080611c1590614921565b91505061199e565b50611c937f000000000000000000000000000000000000000000000000000000000000000084611c4b61082e565b611c559190614959565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016919061391c565b60058190556007805467ffffffffffffffff8416700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff9091161790556040517f9a908e7300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611d6d908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af1158015611d8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db0919061460c565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa600087604051602401611e2496959493929190614970565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff7000000000000000000000000000000000000000000000000000000001790528351909150606090600003611f755760f9601f8351611eb991906149d3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611f5f97969594939291906149ee565b6040516020818303038152906040529050612079565b815161ffff1015611fb2576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611fc16020836149d3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016120669796959493929190614ad1565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156120da573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612152576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906121989084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614bb4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461222c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610cba565b6040518060a0016040528060628152602001614d3e6062913981565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461232a576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff161580801561234a5750600054600160ff909116105b806123645750303b158015612364575060005460ff166001145b6123f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610ecd565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561244e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60006040518060a0016040528060628152602001614d3e606291399050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250d9190614466565b90506000878483858e6125216001436145f9565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af115801561266a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268e919061460c565b50600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8f81169190910291909117909155600280547fffffffffffffffffffffffff000000000000000000000000000000000000000016918d1691909117905560036127178b82614677565b5060046127248a82614677565b50600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8e161790556007805477ffffffffffffffffffffffffffffffffffffffffffffffff167a0697800000000000000000000000000000000000000000000000001790556040517f2bf779968f2cd549d28a94deec97630ab04362cb219c64664de7d2e21f3ccf46906127d690879085908f90614791565b60405180910390a15050505050801561153f57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611536565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612899576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036128a58282614677565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610cba9190613f1a565b60085473ffffffffffffffffffffffffffffffffffffffff1615801590612914575060085473ffffffffffffffffffffffffffffffffffffffff163314155b1561294b576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129da9190614564565b15612a11576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aa29190614466565b905081811115612ade576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612b1a576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b5c73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846139f5565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bed9190614466565b600780549192506801000000000000000090910467ffffffffffffffff16906008612c17836148fa565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612c4e929190614c10565b6040519081900390208142612c646001436145f9565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612d77576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612dd6565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612dcd9493929190614c20565b60405180910390a25b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612e2e576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003612e6a576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612ea6576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612f0e57600080fd5b505af1158015612f22573d6000803e3d6000fd5b5050505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fb79190614466565b600754600554919250429170010000000000000000000000000000000090910467ffffffffffffffff16908160005b868110156132e85760008a8a8381811061300257613002614804565b90506020028101906130149190614833565b61301d90614871565b8051805160209091012060408201519192509067ffffffffffffffff16156132025785613049816148fa565b9650506000818360200151846040015185606001516040516020016130ac9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114613135576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209550600660008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060009055506132d3565b8151516201d4c01015613241576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201526000609c82015260bc016040516020818303038152906040528051906020012094505b505080806132e090614921565b915050612fe6565b5060075467ffffffffffffffff680100000000000000009091048116908416111561333f576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff848116908316146133fd57600061336583866144ae565b905061337b67ffffffffffffffff8216836145f9565b91506133b47f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611c4b61082e565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6134fb337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa15801561348e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134b29190614466565b6134bc9190614959565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906139f5565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af115801561359b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135bf919061460c565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e766886040516135fd91815260200190565b60405180910390a25050505050505050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916136949190614c91565b600060405180830381855afa9150503d80600081146136cf576040519150601f19603f3d011682016040523d82523d6000602084013e6136d4565b606091505b509150915081613719576040518060400160405280600781526020017f4e4f5f4e414d45000000000000000000000000000000000000000000000000008152506121cd565b6121cd81613a59565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916137a49190614c91565b600060405180830381855afa9150503d80600081146137df576040519150601f19603f3d011682016040523d82523d6000602084013e6137e4565b606091505b509150915081613719576040518060400160405280600981526020017f4e4f5f53594d424f4c00000000000000000000000000000000000000000000008152506121cd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8616916138aa9190614c91565b600060405180830381855afa9150503d80600081146138e5576040519150601f19603f3d011682016040523d82523d6000602084013e6138ea565b606091505b50915091508180156138fd575080516020145b6139085760126121cd565b808060200190518101906121cd9190614ca3565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526139f09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613c2f565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052613a539085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161396e565b50505050565b60606040825110613a7e5781806020019051810190613a789190614cc6565b92915050565b8151602003613bf65760005b602081108015613ad15750828181518110613aa757613aa7614804565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613ae85780613ae081614921565b915050613a8a565b80600003613b2b57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115613b4657613b46613ffd565b6040519080825280601f01601f191660200182016040528015613b70576020820181803683370190505b50905060005b82811015613bee57848181518110613b9057613b90614804565b602001015160f81c60f81b828281518110613bad57613bad614804565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080613be681614921565b915050613b76565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b6000613c91826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613d3b9092919063ffffffff16565b8051909150156139f05780806020019051810190613caf9190614564565b6139f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610ecd565b60606121cd8484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051613d6f9190614c91565b60006040518083038185875af1925050503d8060008114613dac576040519150601f19603f3d011682016040523d82523d6000602084013e613db1565b606091505b5091509150613dc287838387613dcd565b979650505050505050565b60608315613e63578251600003613e5c5773ffffffffffffffffffffffffffffffffffffffff85163b613e5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ecd565b50816121cd565b6121cd8383815115613e785781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecd9190613f1a565b60005b83811015613ec7578181015183820152602001613eaf565b50506000910152565b60008151808452613ee8816020860160208601613eac565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613f2d6020830184613ed0565b9392505050565b67ffffffffffffffff81168114613f4a57600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613f4a57600080fd5b600080600060608486031215613f8457600080fd5b8335613f8f81613f34565b9250602084013591506040840135613fa681613f4d565b809150509250925092565b600060208284031215613fc357600080fd5b8135613f2d81613f34565b600060208284031215613fe057600080fd5b8135613f2d81613f4d565b63ffffffff81168114613f4a57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561407357614073613ffd565b604052919050565b600067ffffffffffffffff82111561409557614095613ffd565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126140d257600080fd5b81356140e56140e08261407b565b61402c565b8181528460208386010111156140fa57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561413057600080fd5b863561413b81613f4d565b9550602087013561414b81613f4d565b9450604087013561415b81613feb565b9350606087013561416b81613f4d565b9250608087013567ffffffffffffffff8082111561418857600080fd5b6141948a838b016140c1565b935060a08901359150808211156141aa57600080fd5b506141b789828a016140c1565b9150509295509295509295565b60008083601f8401126141d657600080fd5b50813567ffffffffffffffff8111156141ee57600080fd5b6020830191508360208260051b850101111561420957600080fd5b9250929050565b6000806020838503121561422357600080fd5b823567ffffffffffffffff81111561423a57600080fd5b614246858286016141c4565b90969095509350505050565b6000806000806080858703121561426857600080fd5b843561427381613feb565b9350602085013561428381613f4d565b9250604085013561429381613feb565b9150606085013567ffffffffffffffff8111156142af57600080fd5b6142bb878288016140c1565b91505092959194509250565b60008060008060008060c087890312156142e057600080fd5b86356142eb81613f4d565b955060208701356142fb81613f4d565b9450604087013567ffffffffffffffff8082111561431857600080fd5b6143248a838b016140c1565b9550606089013591508082111561433a57600080fd5b5061434789828a016140c1565b9350506080870135915060a087013561435f81613f34565b809150509295509295509295565b60006020828403121561437f57600080fd5b813567ffffffffffffffff81111561439657600080fd5b6121cd848285016140c1565b6000806000604084860312156143b757600080fd5b833567ffffffffffffffff808211156143cf57600080fd5b818601915086601f8301126143e357600080fd5b8135818111156143f257600080fd5b87602082850101111561440457600080fd5b6020928301989097509590910135949350505050565b60008060006040848603121561442f57600080fd5b833567ffffffffffffffff81111561444657600080fd5b614452868287016141c4565b9094509250506020840135613fa681613f4d565b60006020828403121561447857600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8281168282160390808211156144cf576144cf61447f565b5092915050565b60008261450c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061452557607f821691505b60208210810361455e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561457657600080fd5b81518015158114613f2d57600080fd5b6060815260006145996060830186613ed0565b82810360208401526145ab8186613ed0565b91505060ff83166040830152949350505050565b600080604083850312156145d257600080fd5b82516145dd81613feb565b60208401519092506145ee81613f4d565b809150509250929050565b81810381811115613a7857613a7861447f565b60006020828403121561461e57600080fd5b8151613f2d81613f34565b601f8211156139f057600081815260208120601f850160051c810160208610156146505750805b601f850160051c820191505b8181101561466f5782815560010161465c565b505050505050565b815167ffffffffffffffff81111561469157614691613ffd565b6146a58161469f8454614511565b84614629565b602080601f8311600181146146f857600084156146c25750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561466f565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561474557888601518255948401946001909101908401614726565b508582101561478157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006147a46060830186613ed0565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff8181168382160190808211156144cf576144cf61447f565b80820180821115613a7857613a7861447f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261486757600080fd5b9190910192915050565b60006080823603121561488357600080fd5b6040516080810167ffffffffffffffff82821081831117156148a7576148a7613ffd565b8160405284359150808211156148bc57600080fd5b506148c9368286016140c1565b8252506020830135602082015260408301356148e481613f34565b6040820152606092830135928101929092525090565b600067ffffffffffffffff8083168181036149175761491761447f565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149525761495261447f565b5060010190565b8082028115828204841417613a7857613a7861447f565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a08301526149c760c0830184613ed0565b98975050505050505050565b61ffff8181168382160190808211156144cf576144cf61447f565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614a57816003860160208c01613eac565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614a9a816017840160208b01613eac565b808201915050818660f81b16601782015284519150614ac0826018830160208801613eac565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614b3a816003860160208c01613eac565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614b7d816017840160208b01613eac565b808201915050818660f01b16601782015284519150614ba3826019830160208801613eac565b016019019998505050505050505050565b60008651614bc6818460208b01613eac565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b60008251614867818460208701613eac565b600060208284031215614cb557600080fd5b815160ff81168114613f2d57600080fd5b600060208284031215614cd857600080fd5b815167ffffffffffffffff811115614cef57600080fd5b8201601f81018413614d0057600080fd5b8051614d0e6140e08261407b565b818152856020838501011115614d2357600080fd5b614d34826020830160208601613eac565b9594505050505056fedf2a8080944d5cf5032b2a844602278b01199ed191a86c93ff8080821092808000000000000000000000000000000000000000000000000000000005ca1ab1e000000000000000000000000000000000000000000000000000000005ca1ab1e01bffa2646970667358221220f3abedebef61d2850c2c18454404c17f364dfad30fc638ff6034cdfa1d7b3ffc64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102fe5760003560e01c80637a5460c51161019c578063c754c7ed116100ee578063e46761c411610097578063ecef3f9911610071578063ecef3f99146107ed578063f35dda4714610800578063f851a4401461080857600080fd5b8063e46761c414610793578063e7a7ed02146107ba578063eaeb077b146107da57600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610741578063d02103ca14610761578063d7bc90ff1461078857600080fd5b8063c754c7ed146106f6578063c7fffd4b14610726578063c89e42df1461072e57600080fd5b8063a3c573eb11610150578063af7f3e021161012a578063af7f3e02146106cf578063b0afe154146106d7578063bb590708146106e357600080fd5b8063a3c573eb14610682578063a652f26c146106a9578063ada8f919146106bc57600080fd5b806391cafe321161018157806391cafe32146106415780639e001877146106545780639f26f8401461066f57600080fd5b80637a5460c5146105fd5780638c3d73011461063957600080fd5b806340b5de6c11610255578063542028d5116102095780636e05d2cd116101e35780636e05d2cd146105ce5780636ff512cc146105d757806371257022146105ea57600080fd5b8063542028d51461059e578063676870d2146105a65780636b8616ce146105ae57600080fd5b806349b7b8021161023a57806349b7b802146105285780634e4877061461054f57806352bdeb6d1461056257600080fd5b806340b5de6c146104a8578063456052671461050057600080fd5b806326782247116102b757806332c2d1531161029157806332c2d153146104365780633c351e101461044b5780633cbc795b1461046b57600080fd5b806326782247146103a45780632a9f208f146103e95780632c111c061461041657600080fd5b806305835f37116102e857806305835f3714610339578063107bf28c1461038257806311e892d41461038a57600080fd5b8062d0295d14610303578063035089631461031e575b600080fd5b61030b61082e565b6040519081526020015b60405180910390f35b610326602081565b60405161ffff9091168152602001610315565b6103756040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516103159190613f1a565b61037561094e565b61039260f981565b60405160ff9091168152602001610315565b6001546103c49073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610315565b6007546103fd9067ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610315565b6008546103c49073ffffffffffffffffffffffffffffffffffffffff1681565b610449610444366004613f6f565b6109dc565b005b6009546103c49073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104939074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610315565b6104cf7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff000000000000000000000000000000000000000000000000000000000000009091168152602001610315565b6007546103fd90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b61044961055d366004613fb1565b610aab565b6103756040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610375610cc5565b610326601f81565b61030b6105bc366004613fb1565b60066020526000908152604090205481565b61030b60055481565b6104496105e5366004613fce565b610cd2565b6104496105f8366004614117565b610d9c565b6103756040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610449611548565b61044961064f366004613fce565b61161b565b6103c473a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b61044961067d366004614210565b611734565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b6103756106b7366004614252565b611df0565b6104496106ca366004613fce565b6121d5565b61037561229f565b61030b6405ca1ab1e081565b6104496106f13660046142c7565b6122bb565b6007546103fd907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61039260e481565b61044961073c36600461436d565b612842565b6002546103c49073ffffffffffffffffffffffffffffffffffffffff1681565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b61030b635ca1ab1e81565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b6007546103fd9068010000000000000000900467ffffffffffffffff1681565b6104496107e83660046143a2565b6128d5565b6104496107fb36600461441a565b612ddd565b610392601b81565b6000546103c49062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156108bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e19190614466565b6007549091506000906109209067ffffffffffffffff7001000000000000000000000000000000008204811691680100000000000000009004166144ae565b67ffffffffffffffff1690508060000361093d5760009250505090565b61094781836144d6565b9250505090565b6004805461095b90614511565b80601f016020809104026020016040519081016040528092919081815260200182805461098790614511565b80156109d45780601f106109a9576101008083540402835291602001916109d4565b820191906000526020600020905b8154815290600101906020018083116109b757829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a4b576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a9e91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610b02576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b49576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd89190614564565b610c415760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c41576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461095b90614511565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610d29576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610cba565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610e0b576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610e2b5750600054600160ff909116105b80610e455750303b158015610e45575060005460ff166001145b610ed6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610f3457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff85161561112057610f5b85613612565b610f6486613722565b610f6d87613829565b604051602001610f7f93929190614586565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611040573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106491906145bf565b915091508163ffffffff166000146110dc576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff84161717905561111d565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b60095460009061116890889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685611df0565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120c9190614466565b90506000808483858f6112206001436145f9565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611369573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138d919061460c565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550886003908161141f9190614677565b50600461142c8982614677565b508c600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e6040516114cd93929190614791565b60405180910390a1505050505050801561153f57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611599576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611672576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff166116c1576040517fd40d91c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610cba565b60085473ffffffffffffffffffffffffffffffffffffffff1615801590611773575060085473ffffffffffffffffffffffffffffffffffffffff163314155b156117aa576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561181a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183e919061460c565b61184891906147d0565b67ffffffffffffffff16111561188a576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036118c6576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611902576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff68010000000000000000820481169161193d9184917001000000000000000000000000000000009004166147f1565b1115611975576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015611c1d5760008686838181106119ba576119ba614804565b90506020028101906119cc9190614833565b6119d590614871565b9050836119e1816148fa565b825180516020918201208185015160408087015160608801519151959a50929550600094611a4e948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114611ad7576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055611afc6001886145f9565b8403611b6b5742600760189054906101000a900467ffffffffffffffff168460400151611b2991906147d0565b67ffffffffffffffff161115611b6b576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc016040516020818303038152906040528051906020012094505050508080611c1590614921565b91505061199e565b50611c937f000000000000000000000000000000000000000000000000000000000000000084611c4b61082e565b611c559190614959565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016919061391c565b60058190556007805467ffffffffffffffff8416700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff9091161790556040517f9a908e7300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611d6d908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af1158015611d8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db0919061460c565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa600087604051602401611e2496959493929190614970565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff7000000000000000000000000000000000000000000000000000000001790528351909150606090600003611f755760f9601f8351611eb991906149d3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611f5f97969594939291906149ee565b6040516020818303038152906040529050612079565b815161ffff1015611fb2576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611fc16020836149d3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016120669796959493929190614ad1565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156120da573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612152576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906121989084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614bb4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461222c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610cba565b6040518060a0016040528060628152602001614d3e6062913981565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461232a576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff161580801561234a5750600054600160ff909116105b806123645750303b158015612364575060005460ff166001145b6123f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610ecd565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561244e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60006040518060a0016040528060628152602001614d3e606291399050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250d9190614466565b90506000878483858e6125216001436145f9565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af115801561266a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268e919061460c565b50600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8f81169190910291909117909155600280547fffffffffffffffffffffffff000000000000000000000000000000000000000016918d1691909117905560036127178b82614677565b5060046127248a82614677565b50600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8e161790556007805477ffffffffffffffffffffffffffffffffffffffffffffffff167a0697800000000000000000000000000000000000000000000000001790556040517f2bf779968f2cd549d28a94deec97630ab04362cb219c64664de7d2e21f3ccf46906127d690879085908f90614791565b60405180910390a15050505050801561153f57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611536565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612899576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036128a58282614677565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610cba9190613f1a565b60085473ffffffffffffffffffffffffffffffffffffffff1615801590612914575060085473ffffffffffffffffffffffffffffffffffffffff163314155b1561294b576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129da9190614564565b15612a11576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aa29190614466565b905081811115612ade576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612b1a576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b5c73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846139f5565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bed9190614466565b600780549192506801000000000000000090910467ffffffffffffffff16906008612c17836148fa565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612c4e929190614c10565b6040519081900390208142612c646001436145f9565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612d77576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612dd6565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612dcd9493929190614c20565b60405180910390a25b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612e2e576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003612e6a576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612ea6576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612f0e57600080fd5b505af1158015612f22573d6000803e3d6000fd5b5050505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fb79190614466565b600754600554919250429170010000000000000000000000000000000090910467ffffffffffffffff16908160005b868110156132e85760008a8a8381811061300257613002614804565b90506020028101906130149190614833565b61301d90614871565b8051805160209091012060408201519192509067ffffffffffffffff16156132025785613049816148fa565b9650506000818360200151846040015185606001516040516020016130ac9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114613135576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209550600660008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060009055506132d3565b8151516201d4c01015613241576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201526000609c82015260bc016040516020818303038152906040528051906020012094505b505080806132e090614921565b915050612fe6565b5060075467ffffffffffffffff680100000000000000009091048116908416111561333f576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff848116908316146133fd57600061336583866144ae565b905061337b67ffffffffffffffff8216836145f9565b91506133b47f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611c4b61082e565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6134fb337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa15801561348e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134b29190614466565b6134bc9190614959565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906139f5565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af115801561359b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135bf919061460c565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e766886040516135fd91815260200190565b60405180910390a25050505050505050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916136949190614c91565b600060405180830381855afa9150503d80600081146136cf576040519150601f19603f3d011682016040523d82523d6000602084013e6136d4565b606091505b509150915081613719576040518060400160405280600781526020017f4e4f5f4e414d45000000000000000000000000000000000000000000000000008152506121cd565b6121cd81613a59565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916137a49190614c91565b600060405180830381855afa9150503d80600081146137df576040519150601f19603f3d011682016040523d82523d6000602084013e6137e4565b606091505b509150915081613719576040518060400160405280600981526020017f4e4f5f53594d424f4c00000000000000000000000000000000000000000000008152506121cd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8616916138aa9190614c91565b600060405180830381855afa9150503d80600081146138e5576040519150601f19603f3d011682016040523d82523d6000602084013e6138ea565b606091505b50915091508180156138fd575080516020145b6139085760126121cd565b808060200190518101906121cd9190614ca3565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526139f09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613c2f565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052613a539085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161396e565b50505050565b60606040825110613a7e5781806020019051810190613a789190614cc6565b92915050565b8151602003613bf65760005b602081108015613ad15750828181518110613aa757613aa7614804565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613ae85780613ae081614921565b915050613a8a565b80600003613b2b57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115613b4657613b46613ffd565b6040519080825280601f01601f191660200182016040528015613b70576020820181803683370190505b50905060005b82811015613bee57848181518110613b9057613b90614804565b602001015160f81c60f81b828281518110613bad57613bad614804565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080613be681614921565b915050613b76565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b6000613c91826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613d3b9092919063ffffffff16565b8051909150156139f05780806020019051810190613caf9190614564565b6139f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610ecd565b60606121cd8484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051613d6f9190614c91565b60006040518083038185875af1925050503d8060008114613dac576040519150601f19603f3d011682016040523d82523d6000602084013e613db1565b606091505b5091509150613dc287838387613dcd565b979650505050505050565b60608315613e63578251600003613e5c5773ffffffffffffffffffffffffffffffffffffffff85163b613e5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ecd565b50816121cd565b6121cd8383815115613e785781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecd9190613f1a565b60005b83811015613ec7578181015183820152602001613eaf565b50506000910152565b60008151808452613ee8816020860160208601613eac565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613f2d6020830184613ed0565b9392505050565b67ffffffffffffffff81168114613f4a57600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613f4a57600080fd5b600080600060608486031215613f8457600080fd5b8335613f8f81613f34565b9250602084013591506040840135613fa681613f4d565b809150509250925092565b600060208284031215613fc357600080fd5b8135613f2d81613f34565b600060208284031215613fe057600080fd5b8135613f2d81613f4d565b63ffffffff81168114613f4a57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561407357614073613ffd565b604052919050565b600067ffffffffffffffff82111561409557614095613ffd565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126140d257600080fd5b81356140e56140e08261407b565b61402c565b8181528460208386010111156140fa57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561413057600080fd5b863561413b81613f4d565b9550602087013561414b81613f4d565b9450604087013561415b81613feb565b9350606087013561416b81613f4d565b9250608087013567ffffffffffffffff8082111561418857600080fd5b6141948a838b016140c1565b935060a08901359150808211156141aa57600080fd5b506141b789828a016140c1565b9150509295509295509295565b60008083601f8401126141d657600080fd5b50813567ffffffffffffffff8111156141ee57600080fd5b6020830191508360208260051b850101111561420957600080fd5b9250929050565b6000806020838503121561422357600080fd5b823567ffffffffffffffff81111561423a57600080fd5b614246858286016141c4565b90969095509350505050565b6000806000806080858703121561426857600080fd5b843561427381613feb565b9350602085013561428381613f4d565b9250604085013561429381613feb565b9150606085013567ffffffffffffffff8111156142af57600080fd5b6142bb878288016140c1565b91505092959194509250565b60008060008060008060c087890312156142e057600080fd5b86356142eb81613f4d565b955060208701356142fb81613f4d565b9450604087013567ffffffffffffffff8082111561431857600080fd5b6143248a838b016140c1565b9550606089013591508082111561433a57600080fd5b5061434789828a016140c1565b9350506080870135915060a087013561435f81613f34565b809150509295509295509295565b60006020828403121561437f57600080fd5b813567ffffffffffffffff81111561439657600080fd5b6121cd848285016140c1565b6000806000604084860312156143b757600080fd5b833567ffffffffffffffff808211156143cf57600080fd5b818601915086601f8301126143e357600080fd5b8135818111156143f257600080fd5b87602082850101111561440457600080fd5b6020928301989097509590910135949350505050565b60008060006040848603121561442f57600080fd5b833567ffffffffffffffff81111561444657600080fd5b614452868287016141c4565b9094509250506020840135613fa681613f4d565b60006020828403121561447857600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8281168282160390808211156144cf576144cf61447f565b5092915050565b60008261450c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061452557607f821691505b60208210810361455e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561457657600080fd5b81518015158114613f2d57600080fd5b6060815260006145996060830186613ed0565b82810360208401526145ab8186613ed0565b91505060ff83166040830152949350505050565b600080604083850312156145d257600080fd5b82516145dd81613feb565b60208401519092506145ee81613f4d565b809150509250929050565b81810381811115613a7857613a7861447f565b60006020828403121561461e57600080fd5b8151613f2d81613f34565b601f8211156139f057600081815260208120601f850160051c810160208610156146505750805b601f850160051c820191505b8181101561466f5782815560010161465c565b505050505050565b815167ffffffffffffffff81111561469157614691613ffd565b6146a58161469f8454614511565b84614629565b602080601f8311600181146146f857600084156146c25750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561466f565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561474557888601518255948401946001909101908401614726565b508582101561478157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006147a46060830186613ed0565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff8181168382160190808211156144cf576144cf61447f565b80820180821115613a7857613a7861447f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261486757600080fd5b9190910192915050565b60006080823603121561488357600080fd5b6040516080810167ffffffffffffffff82821081831117156148a7576148a7613ffd565b8160405284359150808211156148bc57600080fd5b506148c9368286016140c1565b8252506020830135602082015260408301356148e481613f34565b6040820152606092830135928101929092525090565b600067ffffffffffffffff8083168181036149175761491761447f565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149525761495261447f565b5060010190565b8082028115828204841417613a7857613a7861447f565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a08301526149c760c0830184613ed0565b98975050505050505050565b61ffff8181168382160190808211156144cf576144cf61447f565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614a57816003860160208c01613eac565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614a9a816017840160208b01613eac565b808201915050818660f81b16601782015284519150614ac0826018830160208801613eac565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614b3a816003860160208c01613eac565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614b7d816017840160208b01613eac565b808201915050818660f01b16601782015284519150614ba3826019830160208801613eac565b016019019998505050505050505050565b60008651614bc6818460208b01613eac565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b60008251614867818460208701613eac565b600060208284031215614cb557600080fd5b815160ff81168114613f2d57600080fd5b600060208284031215614cd857600080fd5b815167ffffffffffffffff811115614cef57600080fd5b8201601f81018413614d0057600080fd5b8051614d0e6140e08261407b565b818152856020838501011115614d2357600080fd5b614d34826020830160208601613eac565b9594505050505056fedf2a8080944d5cf5032b2a844602278b01199ed191a86c93ff8080821092808000000000000000000000000000000000000000000000000000000005ca1ab1e000000000000000000000000000000000000000000000000000000005ca1ab1e01bffa2646970667358221220f3abedebef61d2850c2c18454404c17f364dfad30fc638ff6034cdfa1d7b3ffc64736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} From 846519cb3f9599a7ee2709bc4fea7ccd7736e1ea Mon Sep 17 00:00:00 2001 From: bros Date: Tue, 16 Jan 2024 12:13:56 +0000 Subject: [PATCH 144/230] Refactor validium naming --- .githooks/pre-commit | 2 +- .../PolygonDataCommittee.sol} | 9 ++-- .../PolygonValidium.sol} | 30 +++++++------- .../PolygonValidiumEtrog.sol} | 32 +++++++-------- contracts/v2/interfaces/ICDKDataCommittee.sol | 7 ---- .../IPolygonDataAvailabilityProtocol.sol | 7 ++++ ...rs.sol => IPolygonDataCommitteeErrors.sol} | 2 +- ...nDataComittee.sol => IPolygonValidium.sol} | 2 +- deployment/v2/4_createRollup.ts | 41 +++++++++++-------- 9 files changed, 72 insertions(+), 60 deletions(-) rename contracts/v2/consensus/{dataComittee/CDKDataCommittee.sol => validium/PolygonDataCommittee.sol} (95%) rename contracts/v2/consensus/{dataComittee/PolygonDataComittee.sol => validium/PolygonValidium.sol} (90%) rename contracts/v2/consensus/{dataComittee/PolygonDataComitteeEtrog.sol => validium/PolygonValidiumEtrog.sol} (90%) delete mode 100644 contracts/v2/interfaces/ICDKDataCommittee.sol create mode 100644 contracts/v2/interfaces/IPolygonDataAvailabilityProtocol.sol rename contracts/v2/interfaces/{ICDKDataCommitteeErrors.sol => IPolygonDataCommitteeErrors.sol} (96%) rename contracts/v2/interfaces/{IPolygonDataComittee.sol => IPolygonValidium.sol} (91%) diff --git a/.githooks/pre-commit b/.githooks/pre-commit index 89f395bab..6c41c3c4d 100755 --- a/.githooks/pre-commit +++ b/.githooks/pre-commit @@ -36,7 +36,7 @@ if npm run lint; then cp artifacts/contracts/v2/consensus/zkEVM/PolygonZkEVMEtrog.sol/PolygonZkEVMEtrog.json compiled-contracts/ cp artifacts/contracts/v2/consensus/zkEVM/PolygonZkEVMV2ExistentEtrog.sol/PolygonZkEVMV2ExistentEtrog.json compiled-contracts/ - cp artifacts/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol/PolygonDataComittee.json compiled-contracts/ + cp artifacts/contracts/v2/consensus/validium/PolygonValidium.sol/PolygonValidium.json compiled-contracts/ git add compiled-contracts exit 0 else diff --git a/contracts/v2/consensus/dataComittee/CDKDataCommittee.sol b/contracts/v2/consensus/validium/PolygonDataCommittee.sol similarity index 95% rename from contracts/v2/consensus/dataComittee/CDKDataCommittee.sol rename to contracts/v2/consensus/validium/PolygonDataCommittee.sol index 962abed75..48266762c 100644 --- a/contracts/v2/consensus/dataComittee/CDKDataCommittee.sol +++ b/contracts/v2/consensus/validium/PolygonDataCommittee.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: AGPL-3.0 pragma solidity 0.8.20; -import "../../interfaces/ICDKDataCommitteeErrors.sol"; +import "../../interfaces/IPolygonDataCommitteeErrors.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; -contract CDKDataCommittee is ICDKDataCommitteeErrors, OwnableUpgradeable { +contract PolygonDataCommittee is IPolygonDataCommitteeErrors, OwnableUpgradeable { /** * @notice Struct which will store all the data of the committee members * @param url string that represents the URL of the member to be used to access the data @@ -16,6 +16,9 @@ contract CDKDataCommittee is ICDKDataCommitteeErrors, OwnableUpgradeable { address addr; } + // Name of the data availability protocol + string public constant protocolName = "DataAvailabilityCommittee"; + // Size of a signature in bytes uint256 internal constant _SIGNATURE_SIZE = 65; @@ -107,7 +110,7 @@ contract CDKDataCommittee is ICDKDataCommitteeErrors, OwnableUpgradeable { * [signature 0, ..., signature requiredAmountOfSignatures -1, address 0, ... address N] * note that each ECDSA signatures are used, therefore each one must be 65 bytes */ - function verifySignatures( + function verifyMessage( bytes32 signedHash, bytes calldata signaturesAndAddrs ) external view { diff --git a/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol b/contracts/v2/consensus/validium/PolygonValidium.sol similarity index 90% rename from contracts/v2/consensus/dataComittee/PolygonDataComittee.sol rename to contracts/v2/consensus/validium/PolygonValidium.sol index 681d3cf6d..abb934c2b 100644 --- a/contracts/v2/consensus/dataComittee/PolygonDataComittee.sol +++ b/contracts/v2/consensus/validium/PolygonValidium.sol @@ -2,8 +2,8 @@ pragma solidity ^0.8.20; import "../../lib/PolygonRollupBase.sol"; -import "../../interfaces/ICDKDataCommittee.sol"; -import "../../interfaces/IPolygonDataComittee.sol"; +import "../../interfaces/IPolygonDataAvailabilityProtocol.sol"; +import "../../interfaces/IPolygonValidium.sol"; /** * Contract responsible for managing the states and the updates of L2 network. @@ -13,7 +13,7 @@ import "../../interfaces/IPolygonDataComittee.sol"; * 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. */ -contract PolygonDataComittee is PolygonRollupBase, IPolygonDataComittee { +contract PolygonValidium is PolygonRollupBase, IPolygonValidium { using SafeERC20Upgradeable for IERC20Upgradeable; /** @@ -32,17 +32,17 @@ contract PolygonDataComittee is PolygonRollupBase, IPolygonDataComittee { uint64 minForcedTimestamp; } - // CDK Data Committee Address - ICDKDataCommittee public dataCommittee; + // Data Availability Protocol Address + IPolygonDataAvailabilityProtocol public dataAvailabilityProtocol; // Indicates if sequence with data avialability is allowed // This allow the sequencer to post the data and skip the Data comittee bool public isSequenceWithDataAvailabilityAllowed; /** - * @dev Emitted when the admin updates the data committee + * @dev Emitted when the admin updates the data availability protocol */ - event SetDataCommittee(address newDataCommittee); + event SetDataAvailabilityProtocol(address newDataAvailabilityProtocol); /** * @dev Emitted when switch the ability to sequence with data availability @@ -227,8 +227,8 @@ contract PolygonDataComittee is PolygonRollupBase, IPolygonDataComittee { currentAccInputHash ); - // Validate that the data committee has signed the accInputHash for this sequence - dataCommittee.verifySignatures( + // Validate that the data availability protocol accepts the dataAvailabilityMessage + dataAvailabilityProtocol.verifyMessage( currentAccInputHash, dataAvailabilityMessage ); @@ -241,15 +241,15 @@ contract PolygonDataComittee is PolygonRollupBase, IPolygonDataComittee { ////////////////// /** - * @notice Allow the admin to set a new data committee - * @param newDataCommittee Address of the new data committee + * @notice Allow the admin to set a new data availability protocol + * @param newDataAvailabilityProtocol Address of the new data availability protocol */ - function setDataCommittee( - ICDKDataCommittee newDataCommittee + function setDataAvailabilityProtocol( + IPolygonDataAvailabilityProtocol newDataAvailabilityProtocol ) external onlyAdmin { - dataCommittee = newDataCommittee; + dataAvailabilityProtocol = newDataAvailabilityProtocol; - emit SetDataCommittee(address(newDataCommittee)); + emit SetDataAvailabilityProtocol(address(newDataAvailabilityProtocol)); } /** diff --git a/contracts/v2/consensus/dataComittee/PolygonDataComitteeEtrog.sol b/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol similarity index 90% rename from contracts/v2/consensus/dataComittee/PolygonDataComitteeEtrog.sol rename to contracts/v2/consensus/validium/PolygonValidiumEtrog.sol index adbe605eb..96a21c0c4 100644 --- a/contracts/v2/consensus/dataComittee/PolygonDataComitteeEtrog.sol +++ b/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol @@ -2,8 +2,8 @@ pragma solidity ^0.8.20; import "../../lib/PolygonRollupBaseEtrog.sol"; -import "../../interfaces/ICDKDataCommittee.sol"; -import "../../interfaces/IPolygonDataComittee.sol"; +import "../../interfaces/IPolygonDataAvailabilityProtocol.sol"; +import "../../interfaces/IPolygonValidium.sol"; /** * Contract responsible for managing the states and the updates of L2 network. @@ -13,9 +13,9 @@ import "../../interfaces/IPolygonDataComittee.sol"; * 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. */ -contract PolygonDataComitteeEtrog is +contract PolygonValidiumEtrog is PolygonRollupBaseEtrog, - IPolygonDataComittee + IPolygonValidium { using SafeERC20Upgradeable for IERC20Upgradeable; @@ -35,17 +35,17 @@ contract PolygonDataComitteeEtrog is bytes32 forcedBlockHashL1; } - // CDK Data Committee Address - ICDKDataCommittee public dataCommittee; + // Data Availability Protocol Address + IPolygonDataAvailabilityProtocol public dataAvailabilityProtocol; // Indicates if sequence with data avialability is allowed // This allow the sequencer to post the data and skip the Data comittee bool public isSequenceWithDataAvailabilityAllowed; /** - * @dev Emitted when the admin updates the data committee + * @dev Emitted when the admin updates the data availability protocol */ - event SetDataCommittee(address newDataCommittee); + event SetDataAvailabilityProtocol(address newDataAvailabilityProtocol); /** * @dev Emitted when switch the ability to sequence with data availability @@ -218,8 +218,8 @@ contract PolygonDataComitteeEtrog is currentAccInputHash ); - // Validate that the data committee has signed the accInputHash for this sequence - dataCommittee.verifySignatures( + // Validate that the data availability protocol accepts the dataAvailabilityMessage + dataAvailabilityProtocol.verifyMessage( currentAccInputHash, dataAvailabilityMessage ); @@ -232,15 +232,15 @@ contract PolygonDataComitteeEtrog is ////////////////// /** - * @notice Allow the admin to set a new data committee - * @param newDataCommittee Address of the new data committee + * @notice Allow the admin to set a new data availability protocol + * @param newDataAvailabilityProtocol Address of the new data availability protocol */ - function setDataCommittee( - ICDKDataCommittee newDataCommittee + function setDataAvailabilityProtocol( + IPolygonDataAvailabilityProtocol newDataAvailabilityProtocol ) external onlyAdmin { - dataCommittee = newDataCommittee; + dataAvailabilityProtocol = newDataAvailabilityProtocol; - emit SetDataCommittee(address(newDataCommittee)); + emit SetDataAvailabilityProtocol(address(newDataAvailabilityProtocol)); } /** diff --git a/contracts/v2/interfaces/ICDKDataCommittee.sol b/contracts/v2/interfaces/ICDKDataCommittee.sol deleted file mode 100644 index 6b9de977c..000000000 --- a/contracts/v2/interfaces/ICDKDataCommittee.sol +++ /dev/null @@ -1,7 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 - -pragma solidity 0.8.20; - -interface ICDKDataCommittee { - function verifySignatures(bytes32 hash, bytes memory signaturesAndAddrs) external view; -} \ No newline at end of file diff --git a/contracts/v2/interfaces/IPolygonDataAvailabilityProtocol.sol b/contracts/v2/interfaces/IPolygonDataAvailabilityProtocol.sol new file mode 100644 index 000000000..ab7cf9979 --- /dev/null +++ b/contracts/v2/interfaces/IPolygonDataAvailabilityProtocol.sol @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: AGPL-3.0 + +pragma solidity 0.8.20; + +interface IPolygonDataAvailabilityProtocol { + function verifyMessage(bytes32 hash, bytes calldata dataAvailabilityMessage) external view; +} \ No newline at end of file diff --git a/contracts/v2/interfaces/ICDKDataCommitteeErrors.sol b/contracts/v2/interfaces/IPolygonDataCommitteeErrors.sol similarity index 96% rename from contracts/v2/interfaces/ICDKDataCommitteeErrors.sol rename to contracts/v2/interfaces/IPolygonDataCommitteeErrors.sol index 78aa2f4b2..9df1100c6 100644 --- a/contracts/v2/interfaces/ICDKDataCommitteeErrors.sol +++ b/contracts/v2/interfaces/IPolygonDataCommitteeErrors.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.20; -interface ICDKDataCommitteeErrors { +interface IPolygonDataCommitteeErrors { /** * @dev Thrown when the addres bytes doesn't have the expected length */ diff --git a/contracts/v2/interfaces/IPolygonDataComittee.sol b/contracts/v2/interfaces/IPolygonValidium.sol similarity index 91% rename from contracts/v2/interfaces/IPolygonDataComittee.sol rename to contracts/v2/interfaces/IPolygonValidium.sol index 314a5b865..8159cb249 100644 --- a/contracts/v2/interfaces/IPolygonDataComittee.sol +++ b/contracts/v2/interfaces/IPolygonValidium.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.20; -interface IPolygonDataComittee { +interface IPolygonValidium { /** * @dev Thrown when try to activate force batches when they are already active */ diff --git a/deployment/v2/4_createRollup.ts b/deployment/v2/4_createRollup.ts index aa723a1d1..08cc610e1 100644 --- a/deployment/v2/4_createRollup.ts +++ b/deployment/v2/4_createRollup.ts @@ -23,8 +23,8 @@ import { PolygonRollupManager, PolygonZkEVMV2, PolygonZkEVMBridgeV2, - PolygonDataComittee, - PolygonDataComitteeEtrog, + PolygonValidium, + PolygonValidiumEtrog, } from "../../typechain-types"; async function main() { @@ -64,19 +64,28 @@ async function main() { adminZkEVM, forkID, consensusContract, + dataAvailabilityProtocol, } = createRollupParameters; const supportedConensus = [ "PolygonZkEVMEtrog", "PolygonZkEVMV2", - "PolygonDataComittee", - "PolygonDataComitteeEtrog", + "PolygonValidium", + "PolygonValidiumEtrog", ]; if (!supportedConensus.includes(consensusContract)) { throw new Error(`Consensus contract not supported, supported contracts are: ${supportedConensus}`); } + const supporteDataAvailabilityProtocols = [ + "PolygonDataCommittee", + ]; + + if (consensusContract.includes("PolygonValidium") && !supporteDataAvailabilityProtocols.includes(dataAvailabilityProtocol)) { + throw new Error(`Data availability protocol not supported, supported data availability protocols are: ${supporteDataAvailabilityProtocols}`); + } + // Load provider let currentProvider = ethers.provider; if (createRollupParameters.multiplierGas || createRollupParameters.maxFeePerGas) { @@ -241,37 +250,37 @@ async function main() { console.log("#######################\n"); console.log("Created new Rollup:", newZKEVMAddress); - if (consensusContract.includes("DataComittee")) { + if (consensusContract.includes("PolygonValidium") && dataAvailabilityProtocol === "PolygonDataCommittee") { // deploy data commitee - const PolygonDataComittee = (await ethers.getContractFactory("CDKDataCommittee", deployer)) as any; - let polygonCDKComittee; + const PolygonDataCommitteeContract = (await ethers.getContractFactory("PolygonDataCommittee", deployer)) as any; + let polygonDataCommittee; for (let i = 0; i < attemptsDeployProxy; i++) { try { - polygonCDKComittee = await upgrades.deployProxy(PolygonDataComittee, []); + polygonDataCommittee = await upgrades.deployProxy(PolygonDataCommitteeContract, []); break; } catch (error: any) { console.log(`attempt ${i}`); - console.log("upgrades.deployProxy of polygonCDKComittee ", error.message); + console.log("upgrades.deployProxy of polygonDataCommittee ", error.message); } // reach limits of attempts if (i + 1 === attemptsDeployProxy) { - throw new Error("polygonCDKComittee contract has not been deployed"); + throw new Error("polygonDataCommittee contract has not been deployed"); } } // Load data commitee - const PolygonDataComiteeContract = (await PolygonconsensusFactory.attach( + const PolygonValidiumContract = (await PolygonconsensusFactory.attach( newZKEVMAddress - )) as PolygonDataComittee; + )) as PolygonValidium; // add data commitee to the consensus contract - if ((await PolygonDataComiteeContract.admin()) == deployer.address) { - await (await PolygonDataComiteeContract.setDataCommittee(polygonCDKComittee?.target as any)).wait(); + if ((await PolygonValidiumContract.admin()) == deployer.address) { + await (await PolygonValidiumContract.setDataAvailabilityProtocol(polygonDataCommittee?.target as any)).wait(); // Setup data commitee to 0 - await (await polygonCDKComittee?.setupCommittee(0, [], "0x")).wait(); + await (await polygonDataCommittee?.setupCommittee(0, [], "0x")).wait(); } - outputJson.polygonCDKComittee = polygonCDKComittee?.target; + outputJson.polygonDataCommittee = polygonDataCommittee?.target; } // Assert admin address From daa36dd7694b2cefd11eaefc85110e5d7ef3db65 Mon Sep 17 00:00:00 2001 From: bros Date: Tue, 16 Jan 2024 14:37:15 +0000 Subject: [PATCH 145/230] Rename sequence function --- contracts/v2/consensus/validium/PolygonValidium.sol | 2 +- contracts/v2/consensus/validium/PolygonValidiumEtrog.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/v2/consensus/validium/PolygonValidium.sol b/contracts/v2/consensus/validium/PolygonValidium.sol index abb934c2b..5dca77d70 100644 --- a/contracts/v2/consensus/validium/PolygonValidium.sol +++ b/contracts/v2/consensus/validium/PolygonValidium.sol @@ -91,7 +91,7 @@ contract PolygonValidium is PolygonRollupBase, IPolygonValidium { * [signature 0, ..., signature requiredAmountOfSignatures -1, address 0, ... address N] * note that each ECDSA signatures are used, therefore each one must be 65 bytes */ - function sequenceBatchesDataCommittee( + function sequenceBatchesValidium( ValidiumBatchData[] calldata batches, address l2Coinbase, bytes calldata dataAvailabilityMessage diff --git a/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol b/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol index 96a21c0c4..4085964a7 100644 --- a/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol +++ b/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol @@ -94,7 +94,7 @@ contract PolygonValidiumEtrog is * [signature 0, ..., signature requiredAmountOfSignatures -1, address 0, ... address N] * note that each ECDSA signatures are used, therefore each one must be 65 bytes */ - function sequenceBatchesDataCommittee( + function sequenceBatchesValidium( ValidiumBatchData[] calldata batches, address l2Coinbase, bytes calldata dataAvailabilityMessage From 57bdd92286230b70fbe25221257066067723f293 Mon Sep 17 00:00:00 2001 From: bros Date: Tue, 16 Jan 2024 17:29:06 +0000 Subject: [PATCH 146/230] Force DA protocol interface --- .../v2/consensus/validium/PolygonDataCommittee.sol | 12 ++++++++++-- contracts/v2/consensus/validium/PolygonValidium.sol | 6 +++--- .../v2/consensus/validium/PolygonValidiumEtrog.sol | 6 +++--- ...ityProtocol.sol => IDataAvailabilityProtocol.sol} | 3 ++- 4 files changed, 18 insertions(+), 9 deletions(-) rename contracts/v2/interfaces/{IPolygonDataAvailabilityProtocol.sol => IDataAvailabilityProtocol.sol} (59%) diff --git a/contracts/v2/consensus/validium/PolygonDataCommittee.sol b/contracts/v2/consensus/validium/PolygonDataCommittee.sol index 48266762c..901554ece 100644 --- a/contracts/v2/consensus/validium/PolygonDataCommittee.sol +++ b/contracts/v2/consensus/validium/PolygonDataCommittee.sol @@ -2,10 +2,11 @@ pragma solidity 0.8.20; import "../../interfaces/IPolygonDataCommitteeErrors.sol"; +import "../../interfaces/IDataAvailabilityProtocol.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; -contract PolygonDataCommittee is IPolygonDataCommitteeErrors, OwnableUpgradeable { +contract PolygonDataCommittee is IDataAvailabilityProtocol, IPolygonDataCommitteeErrors, OwnableUpgradeable { /** * @notice Struct which will store all the data of the committee members * @param url string that represents the URL of the member to be used to access the data @@ -17,7 +18,7 @@ contract PolygonDataCommittee is IPolygonDataCommitteeErrors, OwnableUpgradeable } // Name of the data availability protocol - string public constant protocolName = "DataAvailabilityCommittee"; + string internal constant _PROTOCOL_NAME = "DataAvailabilityCommittee"; // Size of a signature in bytes uint256 internal constant _SIGNATURE_SIZE = 65; @@ -45,6 +46,13 @@ contract PolygonDataCommittee is IPolygonDataCommitteeErrors, OwnableUpgradeable __Ownable_init_unchained(); } + /** + * @notice Return the protocol name + */ + function getProcotolName() pure external returns (string memory) { + return _PROTOCOL_NAME; + } + /** * @notice 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 diff --git a/contracts/v2/consensus/validium/PolygonValidium.sol b/contracts/v2/consensus/validium/PolygonValidium.sol index 5dca77d70..058fb0aef 100644 --- a/contracts/v2/consensus/validium/PolygonValidium.sol +++ b/contracts/v2/consensus/validium/PolygonValidium.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.20; import "../../lib/PolygonRollupBase.sol"; -import "../../interfaces/IPolygonDataAvailabilityProtocol.sol"; +import "../../interfaces/IDataAvailabilityProtocol.sol"; import "../../interfaces/IPolygonValidium.sol"; /** @@ -33,7 +33,7 @@ contract PolygonValidium is PolygonRollupBase, IPolygonValidium { } // Data Availability Protocol Address - IPolygonDataAvailabilityProtocol public dataAvailabilityProtocol; + IDataAvailabilityProtocol public dataAvailabilityProtocol; // Indicates if sequence with data avialability is allowed // This allow the sequencer to post the data and skip the Data comittee @@ -245,7 +245,7 @@ contract PolygonValidium is PolygonRollupBase, IPolygonValidium { * @param newDataAvailabilityProtocol Address of the new data availability protocol */ function setDataAvailabilityProtocol( - IPolygonDataAvailabilityProtocol newDataAvailabilityProtocol + IDataAvailabilityProtocol newDataAvailabilityProtocol ) external onlyAdmin { dataAvailabilityProtocol = newDataAvailabilityProtocol; diff --git a/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol b/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol index 4085964a7..0ee03da9a 100644 --- a/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol +++ b/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.20; import "../../lib/PolygonRollupBaseEtrog.sol"; -import "../../interfaces/IPolygonDataAvailabilityProtocol.sol"; +import "../../interfaces/IDataAvailabilityProtocol.sol"; import "../../interfaces/IPolygonValidium.sol"; /** @@ -36,7 +36,7 @@ contract PolygonValidiumEtrog is } // Data Availability Protocol Address - IPolygonDataAvailabilityProtocol public dataAvailabilityProtocol; + IDataAvailabilityProtocol public dataAvailabilityProtocol; // Indicates if sequence with data avialability is allowed // This allow the sequencer to post the data and skip the Data comittee @@ -236,7 +236,7 @@ contract PolygonValidiumEtrog is * @param newDataAvailabilityProtocol Address of the new data availability protocol */ function setDataAvailabilityProtocol( - IPolygonDataAvailabilityProtocol newDataAvailabilityProtocol + IDataAvailabilityProtocol newDataAvailabilityProtocol ) external onlyAdmin { dataAvailabilityProtocol = newDataAvailabilityProtocol; diff --git a/contracts/v2/interfaces/IPolygonDataAvailabilityProtocol.sol b/contracts/v2/interfaces/IDataAvailabilityProtocol.sol similarity index 59% rename from contracts/v2/interfaces/IPolygonDataAvailabilityProtocol.sol rename to contracts/v2/interfaces/IDataAvailabilityProtocol.sol index ab7cf9979..64f11d1f0 100644 --- a/contracts/v2/interfaces/IPolygonDataAvailabilityProtocol.sol +++ b/contracts/v2/interfaces/IDataAvailabilityProtocol.sol @@ -2,6 +2,7 @@ pragma solidity 0.8.20; -interface IPolygonDataAvailabilityProtocol { +interface IDataAvailabilityProtocol { + function getProcotolName() pure external returns (string memory); function verifyMessage(bytes32 hash, bytes calldata dataAvailabilityMessage) external view; } \ No newline at end of file From 8f910bd31a6b663ceb1e68a2e57294d812a30aee Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 16 Jan 2024 19:13:53 +0100 Subject: [PATCH 147/230] put view functions on bottom, interface view --- .../validium/PolygonDataCommittee.sol | 31 ++++++++++++------- .../interfaces/IDataAvailabilityProtocol.sol | 10 ++++-- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/contracts/v2/consensus/validium/PolygonDataCommittee.sol b/contracts/v2/consensus/validium/PolygonDataCommittee.sol index 901554ece..a7338c625 100644 --- a/contracts/v2/consensus/validium/PolygonDataCommittee.sol +++ b/contracts/v2/consensus/validium/PolygonDataCommittee.sol @@ -6,7 +6,11 @@ import "../../interfaces/IDataAvailabilityProtocol.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; -contract PolygonDataCommittee is IDataAvailabilityProtocol, IPolygonDataCommitteeErrors, OwnableUpgradeable { +contract PolygonDataCommittee is + IDataAvailabilityProtocol, + IPolygonDataCommitteeErrors, + OwnableUpgradeable +{ /** * @notice Struct which will store all the data of the committee members * @param url string that represents the URL of the member to be used to access the data @@ -46,13 +50,6 @@ contract PolygonDataCommittee is IDataAvailabilityProtocol, IPolygonDataCommitte __Ownable_init_unchained(); } - /** - * @notice Return the protocol name - */ - function getProcotolName() pure external returns (string memory) { - return _PROTOCOL_NAME; - } - /** * @notice 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 @@ -107,10 +104,6 @@ contract PolygonDataCommittee is IDataAvailabilityProtocol, IPolygonDataCommitte emit CommitteeUpdated(committeeHash); } - function getAmountOfMembers() public view returns (uint256) { - return members.length; - } - /** * @notice Verifies that the given signedHash has been signed by requiredAmountOfSignatures committee members * @param signedHash Hash that must have been signed by requiredAmountOfSignatures of committee members @@ -176,4 +169,18 @@ contract PolygonDataCommittee is IDataAvailabilityProtocol, IPolygonDataCommitte } } } + + /** + * @notice Return the amount of committee members + */ + function getAmountOfMembers() public view returns (uint256) { + return members.length; + } + + /** + * @notice Return the protocol name + */ + function getProcotolName() external pure override returns (string memory) { + return _PROTOCOL_NAME; + } } diff --git a/contracts/v2/interfaces/IDataAvailabilityProtocol.sol b/contracts/v2/interfaces/IDataAvailabilityProtocol.sol index 64f11d1f0..21d812143 100644 --- a/contracts/v2/interfaces/IDataAvailabilityProtocol.sol +++ b/contracts/v2/interfaces/IDataAvailabilityProtocol.sol @@ -3,6 +3,10 @@ pragma solidity 0.8.20; interface IDataAvailabilityProtocol { - function getProcotolName() pure external returns (string memory); - function verifyMessage(bytes32 hash, bytes calldata dataAvailabilityMessage) external view; -} \ No newline at end of file + function getProcotolName() external view returns (string memory); + + function verifyMessage( + bytes32 hash, + bytes calldata dataAvailabilityMessage + ) external view; +} From d7336b6d00cc56139f80c0738492ec64d0a4f807 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 16 Jan 2024 18:24:17 +0100 Subject: [PATCH 148/230] todo --- contracts/v2/PolygonZkEVMBridgeV2.sol | 1 + contracts/v2/lib/PolygonRollupBase.sol | 1 + contracts/v2/lib/PolygonRollupBaseEtrog.sol | 2 ++ 3 files changed, 4 insertions(+) diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index 18dab8dfc..c2623806d 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -528,6 +528,7 @@ contract PolygonZkEVMBridgeV2 is if (wrappedToken == address(0)) { // Get ERC20 metadata + // review optimization { // Decode the metadata just as a sanity check of correct encoding ( diff --git a/contracts/v2/lib/PolygonRollupBase.sol b/contracts/v2/lib/PolygonRollupBase.sol index cea7bdcf1..73f1536f1 100644 --- a/contracts/v2/lib/PolygonRollupBase.sol +++ b/contracts/v2/lib/PolygonRollupBase.sol @@ -404,6 +404,7 @@ contract PolygonRollupBase is } modifier isSenderAllowedToForceBatches() { + // review optimize if ( forceBatchAddress != address(0) && forceBatchAddress != msg.sender ) { diff --git a/contracts/v2/lib/PolygonRollupBaseEtrog.sol b/contracts/v2/lib/PolygonRollupBaseEtrog.sol index 63274e980..377cc0d47 100644 --- a/contracts/v2/lib/PolygonRollupBaseEtrog.sol +++ b/contracts/v2/lib/PolygonRollupBaseEtrog.sol @@ -307,6 +307,7 @@ contract PolygonRollupBaseEtrog is // Ask for token metadata, the same way is enconded in the bridge // Note that this function will revert if the token is not in this network // Note that this could be a possible reentrant call, but cannot make changes on the state since are static call + // review optimization gasTokenMetadata = abi.encode( _safeName(_gasTokenAddress), _safeSymbol(_gasTokenAddress), @@ -394,6 +395,7 @@ contract PolygonRollupBaseEtrog is } modifier isSenderAllowedToForceBatches() { + // review optimize if ( forceBatchAddress != address(0) && forceBatchAddress != msg.sender ) { From b1b6674df0f5c7c685ba6b6be643a398ea30a081 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 17 Jan 2024 12:46:21 +0100 Subject: [PATCH 149/230] no more no etrog --- .githooks/pre-commit | 4 +- contracts/v2/PolygonRollupManager.sol | 7 +- contracts/v2/PolygonZkEVMBridgeV2.sol | 9 - .../v2/consensus/validium/PolygonValidium.sol | 271 --- .../validium/PolygonValidiumEtrog.sol | 30 +- ...trog.sol => PolygonZkEVMExistentEtrog.sol} | 5 +- .../v2/consensus/zkEVM/PolygonZkEVMV2.sol | 34 - .../zkEVM/PolygonZkEVMV2Existent.sol | 71 - .../v2/interfaces/IPolygonZkEVMBridgeV2.sol | 4 + ...rors.sol => IPolygonZkEVMVEtrogErrors.sol} | 2 +- contracts/v2/lib/PolygonRollupBase.sol | 1020 ---------- contracts/v2/lib/PolygonRollupBaseEtrog.sol | 89 +- .../PolygonRollupManagerMockInternalTest.sol | 2 +- deployment/helpers/deployment-helpers.ts | 3 - deployment/v1ToV2/3_deployContracts.ts | 2 +- deployment/v1ToV2/README.md | 2 +- deployment/v2/4_createRollup.ts | 28 +- docs/v2/PolygonZkEVMV2.md | 426 ---- .../PolygonGlobalExitRootV2.test.ts | 3 +- test/contractsv2/PolygonRollupManager.test.ts | 1722 +++-------------- .../PolygonRollupManagerUpgrade.test.ts | 345 +++- test/contractsv2/PolygonZkEVMV2.test.ts | 80 +- 22 files changed, 665 insertions(+), 3494 deletions(-) delete mode 100644 contracts/v2/consensus/validium/PolygonValidium.sol rename contracts/v2/consensus/zkEVM/{PolygonZkEVMV2ExistentEtrog.sol => PolygonZkEVMExistentEtrog.sol} (97%) delete mode 100644 contracts/v2/consensus/zkEVM/PolygonZkEVMV2.sol delete mode 100644 contracts/v2/consensus/zkEVM/PolygonZkEVMV2Existent.sol rename contracts/v2/interfaces/{IPolygonZkEVMV2Errors.sol => IPolygonZkEVMVEtrogErrors.sol} (95%) delete mode 100644 contracts/v2/lib/PolygonRollupBase.sol delete mode 100644 docs/v2/PolygonZkEVMV2.md diff --git a/.githooks/pre-commit b/.githooks/pre-commit index 6c41c3c4d..2bbaa264b 100755 --- a/.githooks/pre-commit +++ b/.githooks/pre-commit @@ -31,10 +31,8 @@ if npm run lint; then 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/zkEVM/PolygonZkEVMEtrog.sol/PolygonZkEVMEtrog.json compiled-contracts/ - cp artifacts/contracts/v2/consensus/zkEVM/PolygonZkEVMV2ExistentEtrog.sol/PolygonZkEVMV2ExistentEtrog.json compiled-contracts/ + cp artifacts/contracts/v2/consensus/zkEVM/PolygonZkEVMExistentEtrog.sol/PolygonZkEVMExistentEtrog.json compiled-contracts/ cp artifacts/contracts/v2/consensus/validium/PolygonValidium.sol/PolygonValidium.json compiled-contracts/ git add compiled-contracts diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index 861692dbe..bfc7743cb 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -12,7 +12,7 @@ import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeab import "./lib/PolygonTransparentProxy.sol"; import "./lib/PolygonAccessControlUpgradeable.sol"; import "./lib/LegacyZKEVMStateVariables.sol"; -import "./consensus/zkEVM/PolygonZkEVMV2Existent.sol"; +import "./consensus/zkEVM/PolygonZkEVMExistentEtrog.sol"; import "./lib/PolygonConstantsBase.sol"; // review Possible renaming to PolygonL2Manager @@ -387,7 +387,7 @@ contract PolygonRollupManager is address admin, address timelock, address emergencyCouncil, - PolygonZkEVMV2Existent polygonZkEVM, + PolygonZkEVMExistentEtrog polygonZkEVM, IVerifierRollup zkEVMVerifier, uint64 zkEVMForkID, uint64 zkEVMChainID @@ -474,8 +474,7 @@ contract PolygonRollupManager is _legacyTrustedSequencer, _legacyTrustedSequencerURL, _legacyNetworkName, - _legacySequencedBatches[zkEVMLastBatchSequenced].accInputHash, - _legacyLastTimestamp + _legacySequencedBatches[zkEVMLastBatchSequenced].accInputHash ); } diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index c2623806d..9e1c86624 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -528,15 +528,6 @@ contract PolygonZkEVMBridgeV2 is if (wrappedToken == address(0)) { // Get ERC20 metadata - // review optimization - { - // Decode the metadata just as a sanity check of correct encoding - ( - string memory name, - string memory symbol, - uint8 decimals - ) = abi.decode(metadata, (string, string, uint8)); - } // Create a new wrapped erc20 using create2 TokenWrapped newWrappedToken = _deployWrappedToken( diff --git a/contracts/v2/consensus/validium/PolygonValidium.sol b/contracts/v2/consensus/validium/PolygonValidium.sol deleted file mode 100644 index 058fb0aef..000000000 --- a/contracts/v2/consensus/validium/PolygonValidium.sol +++ /dev/null @@ -1,271 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.20; - -import "../../lib/PolygonRollupBase.sol"; -import "../../interfaces/IDataAvailabilityProtocol.sol"; -import "../../interfaces/IPolygonValidium.sol"; - -/** - * 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. - */ -contract PolygonValidium is PolygonRollupBase, IPolygonValidium { - using SafeERC20Upgradeable for IERC20Upgradeable; - - /** - * @notice Struct which will be used to call sequenceBatches - * @param transactionsHash keccak256 hash of the L2 ethereum transactions EIP-155 or pre-EIP-155 with signature: - * EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data, chainid, 0, 0,) || v || r || s - * pre-EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data) || v || r || s - * @param globalExitRoot Global exit root of the batch - * @param timestamp Sequenced timestamp of the batch - * @param minForcedTimestamp Minimum timestamp of the force batch data, empty when non forced batch - */ - struct ValidiumBatchData { - bytes32 transactionsHash; - bytes32 globalExitRoot; - uint64 timestamp; - uint64 minForcedTimestamp; - } - - // Data Availability Protocol Address - IDataAvailabilityProtocol public dataAvailabilityProtocol; - - // Indicates if sequence with data avialability is allowed - // This allow the sequencer to post the data and skip the Data comittee - bool public isSequenceWithDataAvailabilityAllowed; - - /** - * @dev Emitted when the admin updates the data availability protocol - */ - event SetDataAvailabilityProtocol(address newDataAvailabilityProtocol); - - /** - * @dev Emitted when switch the ability to sequence with data availability - */ - event SwitchSequenceWithDataAvailability(); - - /** - * @param _globalExitRootManager Global exit root manager address - * @param _pol POL token address - * @param _bridgeAddress Bridge address - * @param _rollupManager Global exit root manager address - */ - constructor( - IPolygonZkEVMGlobalExitRoot _globalExitRootManager, - IERC20Upgradeable _pol, - IPolygonZkEVMBridgeV2 _bridgeAddress, - PolygonRollupManager _rollupManager - ) - PolygonRollupBase( - _globalExitRootManager, - _pol, - _bridgeAddress, - _rollupManager - ) - {} - - ///////////////////////////////////// - // Sequence/Verify batches functions - //////////////////////////////////// - - function sequenceBatches( - BatchData[] calldata batches, - address l2Coinbase - ) public override { - if (!isSequenceWithDataAvailabilityAllowed) { - revert SequenceWithDataAvailabilityNotAllowed(); - } - super.sequenceBatches(batches, l2Coinbase); - } - - /** - * @notice Allows a sequencer to send multiple batches - * @param batches Struct array which holds the necessary data to append new batches to the sequence - * @param l2Coinbase Address that will receive the fees from L2 - * @param dataAvailabilityMessage 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 - */ - function sequenceBatchesValidium( - ValidiumBatchData[] calldata batches, - address l2Coinbase, - bytes calldata dataAvailabilityMessage - ) external onlyTrustedSequencer { - uint256 batchesNum = batches.length; - if (batchesNum == 0) { - revert SequenceZeroBatches(); - } - - if (batchesNum > _MAX_VERIFY_BATCHES) { - revert ExceedMaxVerifyBatches(); - } - - // Store storage variables in memory, to save gas, because will be overrided multiple times - uint64 currentTimestamp = lastTimestamp; - uint64 currentLastForceBatchSequenced = lastForceBatchSequenced; - bytes32 currentAccInputHash = lastAccInputHash; - - // Store in a temporal variable, for avoid access again the storage slot - uint64 initLastForceBatchSequenced = currentLastForceBatchSequenced; - - for (uint256 i = 0; i < batchesNum; i++) { - // Load current sequence - ValidiumBatchData memory currentBatch = batches[i]; - - // Store the current transactions hash since can be used more than once for gas saving - bytes32 currentTransactionsHash = currentBatch.transactionsHash; - - // Check if it's a forced batch - if (currentBatch.minForcedTimestamp > 0) { - currentLastForceBatchSequenced++; - - // Check forced data matches - bytes32 hashedForcedBatchData = keccak256( - abi.encodePacked( - currentTransactionsHash, - currentBatch.globalExitRoot, - currentBatch.minForcedTimestamp - ) - ); - - if ( - hashedForcedBatchData != - forcedBatches[currentLastForceBatchSequenced] - ) { - revert ForcedDataDoesNotMatch(); - } - - // Check timestamp is bigger than min timestamp - if (currentBatch.timestamp < currentBatch.minForcedTimestamp) { - revert SequencedTimestampBelowForcedTimestamp(); - } - - // Delete forceBatch data since won't be used anymore - delete forcedBatches[currentLastForceBatchSequenced]; - } else { - // Check global exit root exists with proper batch length. These checks are already done in the forceBatches call - // Note that the sequencer can skip setting a global exit root putting zeros - if ( - currentBatch.globalExitRoot != bytes32(0) && - globalExitRootManager.globalExitRootMap( - currentBatch.globalExitRoot - ) == - 0 - ) { - revert GlobalExitRootNotExist(); - } - } - - // Check Batch timestamps are correct - if ( - currentBatch.timestamp < currentTimestamp || - currentBatch.timestamp > block.timestamp - ) { - revert SequencedTimestampInvalid(); - } - - // Calculate next accumulated input hash - currentAccInputHash = keccak256( - abi.encodePacked( - currentAccInputHash, - currentTransactionsHash, - currentBatch.globalExitRoot, - currentBatch.timestamp, - l2Coinbase - ) - ); - - // Update timestamp - currentTimestamp = currentBatch.timestamp; - } - - // Sanity check, should be unreachable - if (currentLastForceBatchSequenced > lastForceBatch) { - revert ForceBatchesOverflow(); - } - - // Store back the storage variables - lastTimestamp = currentTimestamp; - lastAccInputHash = currentAccInputHash; - - uint256 nonForcedBatchesSequenced = batchesNum; - - // Check if there has been forced batches - if (currentLastForceBatchSequenced != initLastForceBatchSequenced) { - uint64 forcedBatchesSequenced = currentLastForceBatchSequenced - - initLastForceBatchSequenced; - // substract forced batches - nonForcedBatchesSequenced -= forcedBatchesSequenced; - - // Transfer pol for every forced batch submitted - pol.safeTransfer( - address(rollupManager), - calculatePolPerForceBatch() * (forcedBatchesSequenced) - ); - - // Store new last force batch sequenced - lastForceBatchSequenced = currentLastForceBatchSequenced; - } - - // Pay collateral for every non-forced batch submitted - pol.safeTransferFrom( - msg.sender, - address(rollupManager), - rollupManager.getBatchFee() * nonForcedBatchesSequenced - ); - - // Update global exit root if there are new deposits - bridgeAddress.updateGlobalExitRoot(); - - uint64 currentBatchSequenced = rollupManager.onSequenceBatches( - uint64(batchesNum), - currentAccInputHash - ); - - // Validate that the data availability protocol accepts the dataAvailabilityMessage - dataAvailabilityProtocol.verifyMessage( - currentAccInputHash, - dataAvailabilityMessage - ); - - emit SequenceBatches(currentBatchSequenced); - } - - ////////////////// - // admin functions - ////////////////// - - /** - * @notice Allow the admin to set a new data availability protocol - * @param newDataAvailabilityProtocol Address of the new data availability protocol - */ - function setDataAvailabilityProtocol( - IDataAvailabilityProtocol newDataAvailabilityProtocol - ) external onlyAdmin { - dataAvailabilityProtocol = newDataAvailabilityProtocol; - - emit SetDataAvailabilityProtocol(address(newDataAvailabilityProtocol)); - } - - /** - * @notice Allow the admin to switch the sequence with data availability - * @param newIsSequenceWithDataAvailabilityAllowed Boolean to switch - */ - function switchSequenceWithDataAvailability( - bool newIsSequenceWithDataAvailabilityAllowed - ) external onlyAdmin { - if ( - isSequenceWithDataAvailabilityAllowed == - newIsSequenceWithDataAvailabilityAllowed - ) { - revert SwitchToSameValue(); - } - isSequenceWithDataAvailabilityAllowed = newIsSequenceWithDataAvailabilityAllowed; - emit SwitchSequenceWithDataAvailability(); - } -} diff --git a/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol b/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol index 0ee03da9a..2727ea8d4 100644 --- a/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol +++ b/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol @@ -13,10 +13,7 @@ import "../../interfaces/IPolygonValidium.sol"; * 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. */ -contract PolygonValidiumEtrog is - PolygonRollupBaseEtrog, - IPolygonValidium -{ +contract PolygonValidiumEtrog is PolygonRollupBaseEtrog, IPolygonValidium { using SafeERC20Upgradeable for IERC20Upgradeable; /** @@ -76,16 +73,6 @@ contract PolygonValidiumEtrog is // Sequence/Verify batches functions //////////////////////////////////// - function sequenceBatches( - BatchData[] calldata batches, - address l2Coinbase - ) public override { - if (!isSequenceWithDataAvailabilityAllowed) { - revert SequenceWithDataAvailabilityNotAllowed(); - } - super.sequenceBatches(batches, l2Coinbase); - } - /** * @notice Allows a sequencer to send multiple batches * @param batches Struct array which holds the necessary data to append new batches to the sequence @@ -227,6 +214,21 @@ contract PolygonValidiumEtrog is emit SequenceBatches(currentBatchSequenced, l1InfoRoot); } + /** + * @notice Allows a sequencer to send multiple batches sending all the data, and without using the dataAvailabilityProtocol + * @param batches Struct array which holds the necessary data to append new batches to the sequence + * @param l2Coinbase Address that will receive the fees from L2 + */ + function sequenceBatches( + BatchData[] calldata batches, + address l2Coinbase + ) public override { + if (!isSequenceWithDataAvailabilityAllowed) { + revert SequenceWithDataAvailabilityNotAllowed(); + } + super.sequenceBatches(batches, l2Coinbase); + } + ////////////////// // admin functions ////////////////// diff --git a/contracts/v2/consensus/zkEVM/PolygonZkEVMV2ExistentEtrog.sol b/contracts/v2/consensus/zkEVM/PolygonZkEVMExistentEtrog.sol similarity index 97% rename from contracts/v2/consensus/zkEVM/PolygonZkEVMV2ExistentEtrog.sol rename to contracts/v2/consensus/zkEVM/PolygonZkEVMExistentEtrog.sol index 1becd3439..f13d02ea6 100644 --- a/contracts/v2/consensus/zkEVM/PolygonZkEVMV2ExistentEtrog.sol +++ b/contracts/v2/consensus/zkEVM/PolygonZkEVMExistentEtrog.sol @@ -11,7 +11,7 @@ import "../../lib/PolygonRollupBaseEtrog.sol"; * 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. */ -contract PolygonZkEVMV2ExistentEtrog is PolygonRollupBaseEtrog { +contract PolygonZkEVMExistentEtrog is PolygonRollupBaseEtrog { // Transaction that will be injected as a forced transaction, to setup the timestamp on the state root, we just need a well encoded RLP transaction // It's ok if the transaction is not processable /* Encoded transaction: @@ -77,8 +77,7 @@ contract PolygonZkEVMV2ExistentEtrog is PolygonRollupBaseEtrog { address _trustedSequencer, string memory _trustedSequencerURL, string memory _networkName, - bytes32 _lastAccInputHash, - uint64 /*_lastTimestamp*/ // review + bytes32 _lastAccInputHash ) external onlyRollupManager initializer { // Set up etrog Tx bytes memory transaction = SET_UP_ETROG_TX; diff --git a/contracts/v2/consensus/zkEVM/PolygonZkEVMV2.sol b/contracts/v2/consensus/zkEVM/PolygonZkEVMV2.sol deleted file mode 100644 index f026514ec..000000000 --- a/contracts/v2/consensus/zkEVM/PolygonZkEVMV2.sol +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.20; - -import "../../lib/PolygonRollupBase.sol"; - -/** - * 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. - */ -contract PolygonZkEVMV2 is PolygonRollupBase { - /** - * @param _globalExitRootManager Global exit root manager address - * @param _pol POL token address - * @param _bridgeAddress Bridge address - * @param _rollupManager Global exit root manager address - */ - constructor( - IPolygonZkEVMGlobalExitRoot _globalExitRootManager, - IERC20Upgradeable _pol, - IPolygonZkEVMBridgeV2 _bridgeAddress, - PolygonRollupManager _rollupManager - ) - PolygonRollupBase( - _globalExitRootManager, - _pol, - _bridgeAddress, - _rollupManager - ) - {} -} diff --git a/contracts/v2/consensus/zkEVM/PolygonZkEVMV2Existent.sol b/contracts/v2/consensus/zkEVM/PolygonZkEVMV2Existent.sol deleted file mode 100644 index 708867a35..000000000 --- a/contracts/v2/consensus/zkEVM/PolygonZkEVMV2Existent.sol +++ /dev/null @@ -1,71 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.20; - -import "../../lib/PolygonRollupBase.sol"; - -/** - * 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. - */ -contract PolygonZkEVMV2Existent is PolygonRollupBase { - /** - * @param _globalExitRootManager Global exit root manager address - * @param _pol POL token address - * @param _bridgeAddress Bridge address - * @param _rollupManager Global exit root manager address - */ - constructor( - IPolygonZkEVMGlobalExitRoot _globalExitRootManager, - IERC20Upgradeable _pol, - IPolygonZkEVMBridgeV2 _bridgeAddress, - PolygonRollupManager _rollupManager - ) - PolygonRollupBase( - _globalExitRootManager, - _pol, - _bridgeAddress, - _rollupManager - ) - {} - - /** - * note This initializer will be called instead of the PolygonRollupBase - * This is a especial initializer since the zkEVM it's an already created network - * @param _admin Admin address - * @param _trustedSequencer Trusted sequencer address - * @param _trustedSequencerURL Trusted sequencer URL - * @param _networkName L2 network name - * @param _lastAccInputHash Acc input hash - * @param _lastTimestamp Timestamp - */ - function initializeUpgrade( - address _admin, - address _trustedSequencer, - string memory _trustedSequencerURL, - string memory _networkName, - bytes32 _lastAccInputHash, - uint64 _lastTimestamp - ) external onlyRollupManager initializer { - admin = _admin; - trustedSequencer = _trustedSequencer; - - trustedSequencerURL = _trustedSequencerURL; - networkName = _networkName; - - forceBatchAddress = _admin; - - // zkEVM Upgraded variables - lastAccInputHash = _lastAccInputHash; - lastTimestamp = _lastTimestamp; - - // Constant deployment variables - forceBatchTimeout = 5 days; - - // Both gasTokenAddress and gasTokenNetwork are 0, since it uses ether as gas token - // Therefore is not necessary to set the variables - } -} diff --git a/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol b/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol index 507d6df38..389ef54dd 100644 --- a/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol +++ b/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol @@ -159,4 +159,8 @@ interface IPolygonZkEVMBridgeV2 { address _polygonRollupManager, bytes memory _gasTokenMetadata ) external; + + function getTokenMetadata( + address token + ) external view returns (bytes memory); } diff --git a/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol b/contracts/v2/interfaces/IPolygonZkEVMVEtrogErrors.sol similarity index 95% rename from contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol rename to contracts/v2/interfaces/IPolygonZkEVMVEtrogErrors.sol index 02799979f..7ae9c705f 100644 --- a/contracts/v2/interfaces/IPolygonZkEVMV2Errors.sol +++ b/contracts/v2/interfaces/IPolygonZkEVMVEtrogErrors.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.20; import "../../interfaces/IPolygonZkEVMErrors.sol"; -interface IPolygonZkEVMV2Errors is IPolygonZkEVMErrors { +interface IPolygonZkEVMVEtrogErrors is IPolygonZkEVMErrors { /** * @dev Thrown when the caller is not the trusted sequencer */ diff --git a/contracts/v2/lib/PolygonRollupBase.sol b/contracts/v2/lib/PolygonRollupBase.sol deleted file mode 100644 index 73f1536f1..000000000 --- a/contracts/v2/lib/PolygonRollupBase.sol +++ /dev/null @@ -1,1020 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.20; - -import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; -import "../../interfaces/IPolygonZkEVMGlobalExitRoot.sol"; -import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; -import "../../interfaces/IPolygonZkEVMErrors.sol"; -import "../interfaces/IPolygonZkEVMV2Errors.sol"; -import "../PolygonRollupManager.sol"; -import "../interfaces/IPolygonRollupBase.sol"; -import "../interfaces/IPolygonZkEVMBridgeV2.sol"; -import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol"; -import "./PolygonConstantsBase.sol"; - -// review Possible renaming to PolygonL2Base - -/** - * 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. - */ -contract PolygonRollupBase is - Initializable, - PolygonConstantsBase, - IPolygonZkEVMV2Errors, - IPolygonRollupBase -{ - // Interface cehcks renaming - using SafeERC20Upgradeable for IERC20Upgradeable; - - /** - * @notice Struct which will be used to call sequenceBatches - * @param transactions L2 ethereum transactions EIP-155 or pre-EIP-155 with signature: - * EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data, chainid, 0, 0,) || v || r || s || effectiveGasPrice - * pre-EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data) || v || r || s || effectiveGasPrice - * @param globalExitRoot Global exit root of the batch - * @param timestamp Sequenced timestamp of the batch - * @param minForcedTimestamp Minimum timestamp of the force batch data, empty when non forced batch - */ - struct BatchData { - bytes transactions; - bytes32 globalExitRoot; - uint64 timestamp; - uint64 minForcedTimestamp; - } - - /** - * @notice Struct which will be used to call sequenceForceBatches - * @param transactions L2 ethereum transactions EIP-155 or pre-EIP-155 with signature: - * EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data, chainid, 0, 0,) || v || r || s - * pre-EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data) || v || r || s - * @param globalExitRoot Global exit root of the batch - * @param minForcedTimestamp Indicates the minimum sequenced timestamp of the batch - */ - struct ForcedBatchData { - bytes transactions; - bytes32 globalExitRoot; - uint64 minForcedTimestamp; - } - - // Max transactions bytes that can be added in a single batch - // Max keccaks circuit = (2**23 / 155286) * 44 = 2376 - // Bytes per keccak = 136 - // Minimum Static keccaks batch = 2 - // Max bytes allowed = (2376 - 2) * 136 = 322864 bytes - 1 byte padding - // Rounded to 300000 bytes - // In order to process the transaction, the data is approximately hashed twice for ecrecover: - // 300000 bytes / 2 = 150000 bytes - // Since geth pool currently only accepts at maximum 128kb transactions: - // https://github.com/ethereum/go-ethereum/blob/master/core/txpool/txpool.go#L54 - // We will limit this length to be compliant with the geth restrictions since our node will use it - // We let 8kb as a sanity margin - uint256 internal constant _MAX_TRANSACTIONS_BYTE_LENGTH = 120000; - - // Max force batch transaction length - // This is used to avoid huge calldata attacks, where the attacker call force batches from another contract - uint256 internal constant _MAX_FORCE_BATCH_BYTE_LENGTH = 5000; - - // In order to encode the initialize transaction of the bridge there's have a constant part and the metadata which is variable - // Note the total transaction will be constrained to 65535 to avoid attacks and simplify the implementation - - // List rlp: 1 listLenLen "0xf9" (0xf7 + 2), + listLen 2 (32 bytes + txData bytes) (do not accept more than 65535 bytes) - - // First byte of the initialize bridge tx, indicates a list with a lengt of 2 bytes - // Since the minimum constant bytes will be: 259 (tx data empty) + 31 (tx parameters) = 259 (0x103) will always take 2 bytes to express the lenght of the rlp - // Note that more than 2 bytes of list len is not supported, since it's constrained to 65535 - uint8 public constant INITIALIZE_TX_BRIDGE_LIST_LEN_LEN = 0xf9; - - // Tx parameters until the bridge address - bytes public constant INITIALIZE_TX_BRIDGE_PARAMS = hex"80808401c9c38094"; - - // RLP encoded metadata (non empty) - - // TxData bytes: 164 bytes data ( signature 4 bytes + 5 parameters*32bytes + - // (abi encoded metadata: 32 bytes position + 32 bytes len + 32 bytes position name + 32 bytes length name + 32 bytes position Symbol + 32 bytes length Symbol - //+ 32 bytes decimal )) min 7*32 bytes = - // = 164 bytes + 224 bytes = 388 (0x0184) minimum - // Extra data: nameLen padded to 32 bytes + symbol len padded to 32 bytes - - // Constant bytes: 1 nonce "0x80" + 1 gasPrice "0x80" + 5 gasLimit "0x8401c9c380" (30M gas) - // + 21 to ("0x94" + bridgeAddress") + 1 value "0x80" + 1 stringLenLen "0xb9" (0xb7 + 2) + - // stringLen (0x0184 + nameLen padded to 32 bytes + symbol len padded to 32 bytes) + txData bytes = 32 bytes + txData bytes - uint16 public constant INITIALIZE_TX_CONSTANT_BYTES = 32; - - // Tx parameters after the bridge address - bytes public constant INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS = - hex"80b9"; - - // RLP empty metadata - - // TxData empty metadata bytes: 164 bytes data ( signature 4 bytes + 5 parameters*32bytes + - // (abi encoded metadata: 32 bytes position + 32 bytes len = 2*32 bytes = - // = 164 bytes + 64 bytes = 228 (0xe4) - - // Constant bytes empty metadata : 1 nonce "0x80" + 1 gasPrice "0x80" + 5 gasLimit "0x8401c9c380" (30M gas) - // + 21 to ("0x94" + bridgeAddress") + 1 value "0x80" + 1 stringLenLen "0xb8" (0xb7 + 1) + - // 1 stringLen (0xe4) + txData bytes = 31 bytes + txData bytes empty metadata 228 = 259 - uint16 public constant INITIALIZE_TX_CONSTANT_BYTES_EMPTY_METADATA = 31; - - uint8 public constant INITIALIZE_TX_DATA_LEN_EMPTY_METADATA = 228; // 0xe4 - - // Tx parameters after the bridge address - bytes - public constant INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS_EMPTY_METADATA = - hex"80b8"; - - // Signature used to initialize the bridge - - // V parameter of the initialize signature - uint8 public constant SIGNATURE_INITIALIZE_TX_V = 27; - - // R parameter of the initialize signature - bytes32 public constant SIGNATURE_INITIALIZE_TX_R = - 0x00000000000000000000000000000000000000000000000000000005ca1ab1e0; - - // S parameter of the initialize signature - bytes32 public constant SIGNATURE_INITIALIZE_TX_S = - 0x000000000000000000000000000000000000000000000000000000005ca1ab1e; - - // Effective percentage of the initalize transaction - bytes1 public constant INITIALIZE_TX_EFFECTIVE_PERCENTAGE = 0xFF; - - // Global Exit Root address L2 - IBasePolygonZkEVMGlobalExitRoot - public constant GLOBAL_EXIT_ROOT_MANAGER_L2 = - IBasePolygonZkEVMGlobalExitRoot( - 0xa40D5f56745a118D0906a34E69aeC8C0Db1cB8fA - ); - - // POL token address - IERC20Upgradeable public immutable pol; - - // Global Exit Root interface - IPolygonZkEVMGlobalExitRoot public immutable globalExitRootManager; - - // PolygonZkEVM Bridge Address - IPolygonZkEVMBridgeV2 public immutable bridgeAddress; - - // Rollup manager - PolygonRollupManager public immutable rollupManager; - - // Address that will be able to adjust contract parameters or stop the emergency state - address public admin; - - // This account will be able to accept the admin role - address public pendingAdmin; - - // Trusted sequencer address - address public trustedSequencer; - - // Trusted sequencer URL - string public trustedSequencerURL; - - // L2 network name - string public networkName; - - // Current accumulate input hash - bytes32 public lastAccInputHash; - - // Queue of forced batches with their associated data - // ForceBatchNum --> hashedForcedBatchData - // hashedForcedBatchData: hash containing the necessary information to force a batch: - // keccak256(keccak256(bytes transactions), bytes32 globalExitRoot, unint64 minForcedTimestamp) - mapping(uint64 => bytes32) public forcedBatches; - - // Last sequenced timestamp - uint64 public lastTimestamp; - - // Last forced batch - uint64 public lastForceBatch; - - // Last forced batch included in the sequence - uint64 public lastForceBatchSequenced; - - // Force batch timeout - uint64 public forceBatchTimeout; - - // Indicates what address is able to do forced batches - // If the address is set to 0, forced batches are open to everyone - address public forceBatchAddress; - - // Token address that will be used to pay gas fees in this rollup. This variable it's just for read purposes - address public gasTokenAddress; - - // Native network of the token address of the gas tokena address. This variable it's just for read purposes - uint32 public gasTokenNetwork; - - /** - * @dev Emitted when the trusted sequencer sends a new batch of transactions - */ - event SequenceBatches(uint64 indexed numBatch); - - /** - * @dev Emitted when a batch is forced - */ - event ForceBatch( - uint64 indexed forceBatchNum, - bytes32 lastGlobalExitRoot, - address sequencer, - bytes transactions - ); - - /** - * @dev Emitted when forced batches are sequenced by not the trusted sequencer - */ - event SequenceForceBatches(uint64 indexed numBatch); - - /** - * @dev Emitted when the contract is initialized, contain the first sequenced transaction - */ - event InitialSequenceBatches( - bytes transactions, - bytes32 lastGlobalExitRoot, - address sequencer - ); - - /** - * @dev Emitted when a aggregator verifies batches - */ - event VerifyBatches( - uint64 indexed numBatch, - bytes32 stateRoot, - address indexed aggregator - ); - - /** - * @dev Emitted when the admin updates the trusted sequencer address - */ - event SetTrustedSequencer(address newTrustedSequencer); - - /** - * @dev Emitted when the admin updates the sequencer URL - */ - event SetTrustedSequencerURL(string newTrustedSequencerURL); - - /** - * @dev Emitted when the admin update the force batch timeout - */ - event SetForceBatchTimeout(uint64 newforceBatchTimeout); - - /** - * @dev Emitted when the admin update the force batch address - */ - event SetForceBatchAddress(address newForceBatchAddress); - - /** - * @dev Emitted when the admin starts the two-step transfer role setting a new pending admin - */ - event TransferAdminRole(address newPendingAdmin); - - /** - * @dev Emitted when the pending admin accepts the admin role - */ - event AcceptAdminRole(address newAdmin); - - // General parameters that will have in common all networks that deploys rollup manager - - /** - * @param _globalExitRootManager Global exit root manager address - * @param _pol POL token address - * @param _bridgeAddress Bridge address - * @param _rollupManager Global exit root manager address - */ - constructor( - IPolygonZkEVMGlobalExitRoot _globalExitRootManager, - IERC20Upgradeable _pol, - IPolygonZkEVMBridgeV2 _bridgeAddress, - PolygonRollupManager _rollupManager - ) { - globalExitRootManager = _globalExitRootManager; - pol = _pol; - bridgeAddress = _bridgeAddress; - rollupManager = _rollupManager; - } - - /** - * @param _admin Admin address - * @param sequencer Trusted sequencer address - * @param networkID Indicates the network identifier that will be used in the bridge - * @param _gasTokenAddress Indicates the token address in mainnet that will be used as a gas token - * Note if a wrapped token of the bridge is used, the original network and address of this wrapped are used instead - * @param sequencerURL Trusted sequencer URL - * @param _networkName L2 network name - */ - function initialize( - address _admin, - address sequencer, - uint32 networkID, - address _gasTokenAddress, - string memory sequencerURL, - string memory _networkName - ) external virtual onlyRollupManager initializer { - bytes memory gasTokenMetadata; - - if (_gasTokenAddress != address(0)) { - // Ask for token metadata, the same way is enconded in the bridge - // Note that this function will revert if the token is not in this network - // Note that this could be a possible reentrant call, but cannot make changes on the state since are static call - gasTokenMetadata = abi.encode( - _safeName(_gasTokenAddress), - _safeSymbol(_gasTokenAddress), - _safeDecimals(_gasTokenAddress) - ); - - // Check gas token address on the bridge - ( - uint32 originWrappedNetwork, - address originWrappedAddress - ) = bridgeAddress.wrappedTokenToTokenInfo(_gasTokenAddress); - - if (originWrappedNetwork != 0) { - // It's a wrapped token, get the wrapped parameters - gasTokenAddress = originWrappedAddress; - gasTokenNetwork = originWrappedNetwork; - } else { - // gasTokenNetwork will be mainnet, for instance 0 - gasTokenAddress = _gasTokenAddress; - } - } - // Sequence transaction to initilize the bridge - - // Calculate transaction to initialize the bridge - bytes memory transaction = generateInitializeTransaction( - networkID, - gasTokenAddress, - gasTokenNetwork, - gasTokenMetadata - ); - - bytes32 currentTransactionsHash = keccak256(transaction); - - // Get current timestamp and global exit root - uint64 currentTimestamp = uint64(block.timestamp); - bytes32 lastGlobalExitRoot = globalExitRootManager - .getLastGlobalExitRoot(); - - bytes32 newAccInputHash = keccak256( - abi.encodePacked( - bytes32(0), // Current acc Input hash - currentTransactionsHash, - lastGlobalExitRoot, // Global exit root - currentTimestamp, - sequencer - ) - ); - lastTimestamp = currentTimestamp; - lastAccInputHash = newAccInputHash; - - rollupManager.onSequenceBatches( - uint64(1), // num total batches - newAccInputHash - ); - - // Set initialize variables - admin = _admin; - trustedSequencer = sequencer; - - trustedSequencerURL = sequencerURL; - networkName = _networkName; - - forceBatchAddress = _admin; - - // Constant deployment variables - forceBatchTimeout = 5 days; - - emit InitialSequenceBatches(transaction, lastGlobalExitRoot, sequencer); - } - - modifier onlyAdmin() { - if (admin != msg.sender) { - revert OnlyAdmin(); - } - _; - } - - modifier onlyTrustedSequencer() { - if (trustedSequencer != msg.sender) { - revert OnlyTrustedSequencer(); - } - _; - } - - modifier isSenderAllowedToForceBatches() { - // review optimize - if ( - forceBatchAddress != address(0) && forceBatchAddress != msg.sender - ) { - revert ForceBatchNotAllowed(); - } - _; - } - - modifier onlyRollupManager() { - if (address(rollupManager) != msg.sender) { - revert OnlyRollupManager(); - } - _; - } - - ///////////////////////////////////// - // Sequence/Verify batches functions - //////////////////////////////////// - - /** - * @notice Allows a sequencer to send multiple batches - * @param batches Struct array which holds the necessary data to append new batches to the sequence - * @param l2Coinbase Address that will receive the fees from L2 - */ - function sequenceBatches( - BatchData[] calldata batches, - address l2Coinbase - ) public virtual onlyTrustedSequencer { - uint256 batchesNum = batches.length; - if (batchesNum == 0) { - revert SequenceZeroBatches(); - } - - if (batchesNum > _MAX_VERIFY_BATCHES) { - revert ExceedMaxVerifyBatches(); - } - - // Store storage variables in memory, to save gas, because will be overrided multiple times - uint64 currentTimestamp = lastTimestamp; - uint64 currentLastForceBatchSequenced = lastForceBatchSequenced; - bytes32 currentAccInputHash = lastAccInputHash; - - // Store in a temporal variable, for avoid access again the storage slot - uint64 initLastForceBatchSequenced = currentLastForceBatchSequenced; - - for (uint256 i = 0; i < batchesNum; i++) { - // Load current sequence - BatchData memory currentBatch = batches[i]; - - // Store the current transactions hash since can be used more than once for gas saving - bytes32 currentTransactionsHash = keccak256( - currentBatch.transactions - ); - - // Check if it's a forced batch - if (currentBatch.minForcedTimestamp > 0) { - currentLastForceBatchSequenced++; - - // Check forced data matches - bytes32 hashedForcedBatchData = keccak256( - abi.encodePacked( - currentTransactionsHash, - currentBatch.globalExitRoot, - currentBatch.minForcedTimestamp - ) - ); - - if ( - hashedForcedBatchData != - forcedBatches[currentLastForceBatchSequenced] - ) { - revert ForcedDataDoesNotMatch(); - } - - // Check timestamp is bigger than min timestamp - if (currentBatch.timestamp < currentBatch.minForcedTimestamp) { - revert SequencedTimestampBelowForcedTimestamp(); - } - - // Delete forceBatch data since won't be used anymore - delete forcedBatches[currentLastForceBatchSequenced]; - } else { - // Check global exit root exists with proper batch length. These checks are already done in the forceBatches call - // Note that the sequencer can skip setting a global exit root putting zeros - if ( - currentBatch.globalExitRoot != bytes32(0) && - globalExitRootManager.globalExitRootMap( - currentBatch.globalExitRoot - ) == - 0 - ) { - revert GlobalExitRootNotExist(); - } - - if ( - currentBatch.transactions.length > - _MAX_TRANSACTIONS_BYTE_LENGTH - ) { - revert TransactionsLengthAboveMax(); - } - } - - // Check Batch timestamps are correct - if ( - currentBatch.timestamp < currentTimestamp || - currentBatch.timestamp > block.timestamp - ) { - revert SequencedTimestampInvalid(); - } - - // Calculate next accumulated input hash - currentAccInputHash = keccak256( - abi.encodePacked( - currentAccInputHash, - currentTransactionsHash, - currentBatch.globalExitRoot, - currentBatch.timestamp, - l2Coinbase - ) - ); - - // Update timestamp - currentTimestamp = currentBatch.timestamp; - } - - // Sanity check, should be unreachable - if (currentLastForceBatchSequenced > lastForceBatch) { - revert ForceBatchesOverflow(); - } - - // Store back the storage variables - lastTimestamp = currentTimestamp; - lastAccInputHash = currentAccInputHash; - - uint256 nonForcedBatchesSequenced = batchesNum; - - // Check if there has been forced batches - if (currentLastForceBatchSequenced != initLastForceBatchSequenced) { - uint64 forcedBatchesSequenced = currentLastForceBatchSequenced - - initLastForceBatchSequenced; - // substract forced batches - nonForcedBatchesSequenced -= forcedBatchesSequenced; - - // Transfer pol for every forced batch submitted - pol.safeTransfer( - address(rollupManager), - calculatePolPerForceBatch() * (forcedBatchesSequenced) - ); - - // Store new last force batch sequenced - lastForceBatchSequenced = currentLastForceBatchSequenced; - } - - // Pay collateral for every non-forced batch submitted - pol.safeTransferFrom( - msg.sender, - address(rollupManager), - rollupManager.getBatchFee() * nonForcedBatchesSequenced - ); - - // Update global exit root if there are new deposits - bridgeAddress.updateGlobalExitRoot(); - - uint64 currentBatchSequenced = rollupManager.onSequenceBatches( - uint64(batchesNum), - currentAccInputHash - ); - - emit SequenceBatches(currentBatchSequenced); - } - - /** - * @notice Callback on verify batches, can only be called by the rollup manager - * @param lastVerifiedBatch Last verified batch - * @param newStateRoot new state root - * @param aggregator Aggregator address - */ - function onVerifyBatches( - uint64 lastVerifiedBatch, - bytes32 newStateRoot, - address aggregator - ) public virtual override onlyRollupManager { - emit VerifyBatches(lastVerifiedBatch, newStateRoot, aggregator); - } - - //////////////////////////// - // Force batches functions - //////////////////////////// - - /** - * @notice 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 - * @param transactions L2 ethereum transactions EIP-155 or pre-EIP-155 with signature: - * @param polAmount Max amount of pol tokens that the sender is willing to pay - */ - function forceBatch( - bytes calldata transactions, - uint256 polAmount - ) public virtual isSenderAllowedToForceBatches { - // Check if rollup manager is on emergency state - if (rollupManager.isEmergencyState()) { - revert ForceBatchesNotAllowedOnEmergencyState(); - } - - // Calculate pol collateral - uint256 polFee = rollupManager.getForcedBatchFee(); - - if (polFee > polAmount) { - revert NotEnoughPOLAmount(); - } - - if (transactions.length > _MAX_FORCE_BATCH_BYTE_LENGTH) { - revert TransactionsLengthAboveMax(); - } - - // keep the pol fees on this contract until forced it's sequenced - pol.safeTransferFrom(msg.sender, address(this), polFee); - - // Get globalExitRoot global exit root - bytes32 lastGlobalExitRoot = globalExitRootManager - .getLastGlobalExitRoot(); - - // Update forcedBatches mapping - lastForceBatch++; - - forcedBatches[lastForceBatch] = keccak256( - abi.encodePacked( - keccak256(transactions), - lastGlobalExitRoot, - uint64(block.timestamp) - ) - ); - - if (msg.sender == tx.origin) { - // Getting the calldata from an EOA is easy so no need to put the `transactions` in the event - emit ForceBatch(lastForceBatch, lastGlobalExitRoot, msg.sender, ""); - } else { - // Getting internal transaction calldata is complicated (because it requires an archive node) - // Therefore it's worth it to put the `transactions` in the event, which is easy to query - emit ForceBatch( - lastForceBatch, - lastGlobalExitRoot, - msg.sender, - transactions - ); - } - } - - /** - * @notice Allows anyone to sequence forced Batches if the trusted sequencer has not done so in the timeout period - * @param batches Struct array which holds the necessary data to append force batches - */ - function sequenceForceBatches( - ForcedBatchData[] calldata batches - ) external virtual isSenderAllowedToForceBatches { - // Check if rollup manager is on emergency state - if ( - rollupManager.lastDeactivatedEmergencyStateTimestamp() + - _HALT_AGGREGATION_TIMEOUT > - block.timestamp - ) { - revert HaltTimeoutNotExpiredAfterEmergencyState(); - } - - uint256 batchesNum = batches.length; - - if (batchesNum == 0) { - revert SequenceZeroBatches(); - } - - if (batchesNum > _MAX_VERIFY_BATCHES) { - revert ExceedMaxVerifyBatches(); - } - - if ( - uint256(lastForceBatchSequenced) + batchesNum > - uint256(lastForceBatch) - ) { - revert ForceBatchesOverflow(); - } - - // Store storage variables in memory, to save gas, because will be overrided multiple times - uint64 currentLastForceBatchSequenced = lastForceBatchSequenced; - bytes32 currentAccInputHash = lastAccInputHash; - - // Sequence force batches - for (uint256 i = 0; i < batchesNum; i++) { - // Load current sequence - ForcedBatchData memory currentBatch = batches[i]; - currentLastForceBatchSequenced++; - - // Store the current transactions hash since it's used more than once for gas saving - bytes32 currentTransactionsHash = keccak256( - currentBatch.transactions - ); - - // Check forced data matches - bytes32 hashedForcedBatchData = keccak256( - abi.encodePacked( - currentTransactionsHash, - currentBatch.globalExitRoot, - currentBatch.minForcedTimestamp - ) - ); - - if ( - hashedForcedBatchData != - forcedBatches[currentLastForceBatchSequenced] - ) { - revert ForcedDataDoesNotMatch(); - } - - // Delete forceBatch data since won't be used anymore - delete forcedBatches[currentLastForceBatchSequenced]; - - if (i == (batchesNum - 1)) { - // The last batch will have the most restrictive timestamp - if ( - currentBatch.minForcedTimestamp + forceBatchTimeout > - block.timestamp - ) { - revert ForceBatchTimeoutNotExpired(); - } - } - // Calculate next acc input hash - currentAccInputHash = keccak256( - abi.encodePacked( - currentAccInputHash, - currentTransactionsHash, - currentBatch.globalExitRoot, - uint64(block.timestamp), - msg.sender - ) - ); - } - - // Transfer pol for every forced batch submitted - pol.safeTransfer( - address(rollupManager), - calculatePolPerForceBatch() * (batchesNum) - ); - - // Store back the storage variables - lastAccInputHash = currentAccInputHash; - lastTimestamp = uint64(block.timestamp); - lastForceBatchSequenced = currentLastForceBatchSequenced; - - uint64 currentBatchSequenced = rollupManager.onSequenceBatches( - uint64(batchesNum), - currentAccInputHash - ); - - emit SequenceForceBatches(currentBatchSequenced); - } - - ////////////////// - // admin functions - ////////////////// - - /** - * @notice Allow the admin to set a new trusted sequencer - * @param newTrustedSequencer Address of the new trusted sequencer - */ - function setTrustedSequencer( - address newTrustedSequencer - ) external onlyAdmin { - trustedSequencer = newTrustedSequencer; - - emit SetTrustedSequencer(newTrustedSequencer); - } - - /** - * @notice Allow the admin to set the trusted sequencer URL - * @param newTrustedSequencerURL URL of trusted sequencer - */ - function setTrustedSequencerURL( - string memory newTrustedSequencerURL - ) external onlyAdmin { - trustedSequencerURL = newTrustedSequencerURL; - - emit SetTrustedSequencerURL(newTrustedSequencerURL); - } - - /** - * @notice Allow the admin to change the force batch address, that will be allowed to force batches - * If address 0 is set, then everyone is able to force batches, this action is irreversible - * @param newForceBatchAddress New force batch address - */ - function setForceBatchAddress( - address newForceBatchAddress - ) external onlyAdmin { - if (forceBatchAddress == address(0)) { - revert ForceBatchesDecentralized(); - } - forceBatchAddress = newForceBatchAddress; - - emit SetForceBatchAddress(newForceBatchAddress); - } - - /** - * @notice Allow the admin to set the forcedBatchTimeout - * The new value can only be lower, except if emergency state is active - * @param newforceBatchTimeout New force batch timeout - */ - function setForceBatchTimeout( - uint64 newforceBatchTimeout - ) external onlyAdmin { - if (newforceBatchTimeout > _HALT_AGGREGATION_TIMEOUT) { - revert InvalidRangeForceBatchTimeout(); - } - - if (!rollupManager.isEmergencyState()) { - if (newforceBatchTimeout >= forceBatchTimeout) { - revert InvalidRangeForceBatchTimeout(); - } - } - - forceBatchTimeout = newforceBatchTimeout; - emit SetForceBatchTimeout(newforceBatchTimeout); - } - - /** - * @notice Starts the admin role transfer - * This is a two step process, the pending admin must accepted to finalize the process - * @param newPendingAdmin Address of the new pending admin - */ - function transferAdminRole(address newPendingAdmin) external onlyAdmin { - pendingAdmin = newPendingAdmin; - emit TransferAdminRole(newPendingAdmin); - } - - /** - * @notice Allow the current pending admin to accept the admin role - */ - function acceptAdminRole() external { - if (pendingAdmin != msg.sender) { - revert OnlyPendingAdmin(); - } - - admin = pendingAdmin; - emit AcceptAdminRole(pendingAdmin); - } - - ////////////////// - // view/pure functions - ////////////////// - - /** - * @notice Function to calculate the reward for a forced batch - */ - function calculatePolPerForceBatch() public view returns (uint256) { - uint256 currentBalance = pol.balanceOf(address(this)); - - // Pending forced Batches = last forced batch added - last forced batch sequenced - uint256 pendingForcedBatches = lastForceBatch - lastForceBatchSequenced; - - if (pendingForcedBatches == 0) return 0; - return currentBalance / pendingForcedBatches; - } - - /** - * @notice Generate Initialize transaction for hte bridge on L2 - * @param networkID Indicates the network identifier that will be used in the bridge - * @param _gasTokenAddress Indicates the token address that will be used to pay gas fees in the new rollup - * @param _gasTokenNetwork Indicates the native network of the token address - */ - function generateInitializeTransaction( - uint32 networkID, - address _gasTokenAddress, - uint32 _gasTokenNetwork, - bytes memory _gasTokenMetadata - ) public view returns (bytes memory) { - // Check the ecrecover, as a sanity check, to not allow invalid transactions - - bytes memory initializeBrigeData = abi.encodeCall( - IPolygonZkEVMBridgeV2.initialize, - ( - networkID, - _gasTokenAddress, - _gasTokenNetwork, - GLOBAL_EXIT_ROOT_MANAGER_L2, - address(0), // Rollup manager on L2 does not exist - _gasTokenMetadata - ) - ); - - bytes memory bytesToSign; - - if (_gasTokenMetadata.length == 0) { - bytesToSign = abi.encodePacked( - INITIALIZE_TX_BRIDGE_LIST_LEN_LEN, - uint16(initializeBrigeData.length) + - INITIALIZE_TX_CONSTANT_BYTES_EMPTY_METADATA, // do not support more than 2 bytes of length, intended to revert on overflow - INITIALIZE_TX_BRIDGE_PARAMS, - bridgeAddress, - INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS_EMPTY_METADATA, - INITIALIZE_TX_DATA_LEN_EMPTY_METADATA, - initializeBrigeData - ); - } else { - // Do not support more than 65535 bytes - if (initializeBrigeData.length > type(uint16).max) { - revert HugeTokenMetadataNotSupported(); - } - uint16 initializeBrigeDataLen = uint16(initializeBrigeData.length); - - bytesToSign = abi.encodePacked( - INITIALIZE_TX_BRIDGE_LIST_LEN_LEN, - uint16(initializeBrigeData.length) + - INITIALIZE_TX_CONSTANT_BYTES, // do not support more than 2 bytes of length, intended to revert on overflow - INITIALIZE_TX_BRIDGE_PARAMS, - bridgeAddress, - INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS, - initializeBrigeDataLen, - initializeBrigeData - ); - } - - // Sanity check that the ecrecover will work - // Should never happen that giving a valid signature, ecrecover "breaks" - address signer = ecrecover( - keccak256(bytesToSign), - SIGNATURE_INITIALIZE_TX_V, - SIGNATURE_INITIALIZE_TX_R, - SIGNATURE_INITIALIZE_TX_S - ); - - if (signer == address(0)) { - revert InvalidInitializeTransaction(); - } - - bytes memory transaction = abi.encodePacked( - bytesToSign, - SIGNATURE_INITIALIZE_TX_R, - SIGNATURE_INITIALIZE_TX_S, - SIGNATURE_INITIALIZE_TX_V, - INITIALIZE_TX_EFFECTIVE_PERCENTAGE - ); - - return transaction; - } - - // Helpers to safely get the metadata from a token, inspired by https://github.com/traderjoe-xyz/joe-core/blob/main/contracts/MasterChefJoeV3.sol#L55-L95 - - /** - * @notice Provides a safe ERC20.symbol version which returns 'NO_SYMBOL' as fallback string - * @param token The address of the ERC-20 token contract - */ - function _safeSymbol(address token) internal view returns (string memory) { - (bool success, bytes memory data) = address(token).staticcall( - abi.encodeCall(IERC20MetadataUpgradeable.symbol, ()) - ); - return success ? _returnDataToString(data) : "NO_SYMBOL"; - } - - /** - * @notice Provides a safe ERC20.name version which returns 'NO_NAME' as fallback string. - * @param token The address of the ERC-20 token contract. - */ - function _safeName(address token) internal view returns (string memory) { - (bool success, bytes memory data) = address(token).staticcall( - abi.encodeCall(IERC20MetadataUpgradeable.name, ()) - ); - return success ? _returnDataToString(data) : "NO_NAME"; - } - - /** - * @notice Provides a safe ERC20.decimals version which returns '18' as fallback value. - * Note Tokens with (decimals > 255) are not supported - * @param token The address of the ERC-20 token contract - */ - function _safeDecimals(address token) internal view returns (uint8) { - (bool success, bytes memory data) = address(token).staticcall( - abi.encodeCall(IERC20MetadataUpgradeable.decimals, ()) - ); - return success && data.length == 32 ? abi.decode(data, (uint8)) : 18; - } - - /** - * @notice Function to convert returned data to string - * returns 'NOT_VALID_ENCODING' as fallback value. - * @param data returned data - */ - function _returnDataToString( - bytes memory data - ) internal pure returns (string memory) { - if (data.length >= 64) { - return abi.decode(data, (string)); - } else if (data.length == 32) { - // Since the strings on bytes32 are encoded left-right, check the first zero in the data - uint256 nonZeroBytes; - while (nonZeroBytes < 32 && data[nonZeroBytes] != 0) { - nonZeroBytes++; - } - - // If the first one is 0, we do not handle the encoding - if (nonZeroBytes == 0) { - return "NOT_VALID_ENCODING"; - } - // Create a byte array with nonZeroBytes length - bytes memory bytesArray = new bytes(nonZeroBytes); - for (uint256 i = 0; i < nonZeroBytes; i++) { - bytesArray[i] = data[i]; - } - return string(bytesArray); - } else { - return "NOT_VALID_ENCODING"; - } - } -} diff --git a/contracts/v2/lib/PolygonRollupBaseEtrog.sol b/contracts/v2/lib/PolygonRollupBaseEtrog.sol index 377cc0d47..359ee0b52 100644 --- a/contracts/v2/lib/PolygonRollupBaseEtrog.sol +++ b/contracts/v2/lib/PolygonRollupBaseEtrog.sol @@ -5,7 +5,7 @@ import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeab import "../interfaces/IPolygonZkEVMGlobalExitRootV2.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "../../interfaces/IPolygonZkEVMErrors.sol"; -import "../interfaces/IPolygonZkEVMV2Errors.sol"; +import "../interfaces/IPolygonZkEVMVEtrogErrors.sol"; import "../PolygonRollupManager.sol"; import "../interfaces/IPolygonRollupBase.sol"; import "../interfaces/IPolygonZkEVMBridgeV2.sol"; @@ -25,7 +25,7 @@ import "./PolygonConstantsBase.sol"; contract PolygonRollupBaseEtrog is Initializable, PolygonConstantsBase, - IPolygonZkEVMV2Errors, + IPolygonZkEVMVEtrogErrors, IPolygonRollupBase { // Interface cehcks renaming @@ -172,11 +172,6 @@ contract PolygonRollupBaseEtrog is // keccak256(keccak256(bytes transactions), bytes32 globalExitRoot, unint64 minForcedTimestamp) mapping(uint64 => bytes32) public forcedBatches; - // Last sequenced timestamp gap, since this contract could be an upgrade from a non etrog contract - // review if not incaberry contracts are deployed, this might be erased - /// @custom:oz-renamed-from lastTimestamp - uint64 public gapLastTimestamp; - // Last forced batch uint64 public lastForceBatch; @@ -307,12 +302,7 @@ contract PolygonRollupBaseEtrog is // Ask for token metadata, the same way is enconded in the bridge // Note that this function will revert if the token is not in this network // Note that this could be a possible reentrant call, but cannot make changes on the state since are static call - // review optimization - gasTokenMetadata = abi.encode( - _safeName(_gasTokenAddress), - _safeSymbol(_gasTokenAddress), - _safeDecimals(_gasTokenAddress) - ); + gasTokenMetadata = bridgeAddress.getTokenMetadata(_gasTokenAddress); // Check gas token address on the bridge ( @@ -395,9 +385,10 @@ contract PolygonRollupBaseEtrog is } modifier isSenderAllowedToForceBatches() { - // review optimize + address cacheForceBatchAddress = forceBatchAddress; if ( - forceBatchAddress != address(0) && forceBatchAddress != msg.sender + cacheForceBatchAddress != address(0) && + cacheForceBatchAddress != msg.sender ) { revert ForceBatchNotAllowed(); } @@ -932,72 +923,4 @@ contract PolygonRollupBaseEtrog is return transaction; } - - // Helpers to safely get the metadata from a token, inspired by https://github.com/traderjoe-xyz/joe-core/blob/main/contracts/MasterChefJoeV3.sol#L55-L95 - - /** - * @notice Provides a safe ERC20.symbol version which returns 'NO_SYMBOL' as fallback string - * @param token The address of the ERC-20 token contract - */ - function _safeSymbol(address token) internal view returns (string memory) { - (bool success, bytes memory data) = address(token).staticcall( - abi.encodeCall(IERC20MetadataUpgradeable.symbol, ()) - ); - return success ? _returnDataToString(data) : "NO_SYMBOL"; - } - - /** - * @notice Provides a safe ERC20.name version which returns 'NO_NAME' as fallback string. - * @param token The address of the ERC-20 token contract. - */ - function _safeName(address token) internal view returns (string memory) { - (bool success, bytes memory data) = address(token).staticcall( - abi.encodeCall(IERC20MetadataUpgradeable.name, ()) - ); - return success ? _returnDataToString(data) : "NO_NAME"; - } - - /** - * @notice Provides a safe ERC20.decimals version which returns '18' as fallback value. - * Note Tokens with (decimals > 255) are not supported - * @param token The address of the ERC-20 token contract - */ - function _safeDecimals(address token) internal view returns (uint8) { - (bool success, bytes memory data) = address(token).staticcall( - abi.encodeCall(IERC20MetadataUpgradeable.decimals, ()) - ); - return success && data.length == 32 ? abi.decode(data, (uint8)) : 18; - } - - /** - * @notice Function to convert returned data to string - * returns 'NOT_VALID_ENCODING' as fallback value. - * @param data returned data - */ - function _returnDataToString( - bytes memory data - ) internal pure returns (string memory) { - if (data.length >= 64) { - return abi.decode(data, (string)); - } else if (data.length == 32) { - // Since the strings on bytes32 are encoded left-right, check the first zero in the data - uint256 nonZeroBytes; - while (nonZeroBytes < 32 && data[nonZeroBytes] != 0) { - nonZeroBytes++; - } - - // If the first one is 0, we do not handle the encoding - if (nonZeroBytes == 0) { - return "NOT_VALID_ENCODING"; - } - // Create a byte array with nonZeroBytes length - bytes memory bytesArray = new bytes(nonZeroBytes); - for (uint256 i = 0; i < nonZeroBytes; i++) { - bytesArray[i] = data[i]; - } - return string(bytesArray); - } else { - return "NOT_VALID_ENCODING"; - } - } } diff --git a/contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol b/contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol index ee14ae90b..db05b9edc 100644 --- a/contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol +++ b/contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol @@ -24,7 +24,7 @@ contract PolygonRollupManagerMockInternalTest is PolygonRollupManager { address admin, address timelock, address emergencyCouncil, - PolygonZkEVMV2Existent polygonZkEVM, + PolygonZkEVMExistentEtrog polygonZkEVM, IVerifierRollup zkEVMVerifier, uint64 zkEVMForkID, uint64 zkEVMChainID diff --git a/deployment/helpers/deployment-helpers.ts b/deployment/helpers/deployment-helpers.ts index c87ed8587..97318a213 100644 --- a/deployment/helpers/deployment-helpers.ts +++ b/deployment/helpers/deployment-helpers.ts @@ -15,12 +15,9 @@ import { PolygonRollupManagerMock, PolygonZkEVMGlobalExitRoot, PolygonZkEVMBridgeV2, - PolygonZkEVMV2, - PolygonRollupBase, TokenWrapped, Address, PolygonZkEVM, - PolygonZkEVMV2Existent, PolygonZkEVMDeployer, } from "../../typechain-types"; import {string} from "yargs"; diff --git a/deployment/v1ToV2/3_deployContracts.ts b/deployment/v1ToV2/3_deployContracts.ts index e6ada9805..b44437786 100644 --- a/deployment/v1ToV2/3_deployContracts.ts +++ b/deployment/v1ToV2/3_deployContracts.ts @@ -665,7 +665,7 @@ async function main() { await (await polygonZkEVMContract.transferAdminRole(adminZkEVM)).wait(); // Update current system to rollup manager - const PolygonZkEVMV2ExistentFactory = await ethers.getContractFactory("PolygonZkEVMV2ExistentEtrog"); + const PolygonZkEVMV2ExistentFactory = await ethers.getContractFactory("PolygonZkEVMExistentEtrog"); const newPolygonZkEVMContract = (await upgrades.deployProxy(PolygonZkEVMV2ExistentFactory, [], { initializer: false, diff --git a/deployment/v1ToV2/README.md b/deployment/v1ToV2/README.md index 0f8a9a5f7..fbc0a4e7f 100644 --- a/deployment/v1ToV2/README.md +++ b/deployment/v1ToV2/README.md @@ -43,7 +43,7 @@ deploy:testnet:v1ToV2:localhost - `chainID`: uint64, chainID of the new rollup - `adminZkEVM`:address, Admin address, can adjust Rollup parameters - `forkID`: uint64, Fork ID of the new rollup, indicates the prover (zkROM/executor) version -- `consensusContract`: string, Consensus contract name of the new rollup deployed, current options are: "PolygonZkEVMEtrog","PolygonZkEVMV2","PolygonDataComittee", "PolygonDataComitteeEtrog", +- `consensusContract`: string, Consensus contract name of the new rollup deployed, current options are: "PolygonZkEVMEtrog","PolygonValidiumEtrog", - `gasTokenAddress`:address, Gas token address, empty or address(0) for ether ### Optional Parameters diff --git a/deployment/v2/4_createRollup.ts b/deployment/v2/4_createRollup.ts index 08cc610e1..890a501d7 100644 --- a/deployment/v2/4_createRollup.ts +++ b/deployment/v2/4_createRollup.ts @@ -67,23 +67,21 @@ async function main() { dataAvailabilityProtocol, } = createRollupParameters; - const supportedConensus = [ - "PolygonZkEVMEtrog", - "PolygonZkEVMV2", - "PolygonValidium", - "PolygonValidiumEtrog", - ]; + const supportedConensus = ["PolygonZkEVMEtrog", "PolygonValidiumEtrog"]; if (!supportedConensus.includes(consensusContract)) { throw new Error(`Consensus contract not supported, supported contracts are: ${supportedConensus}`); } - const supporteDataAvailabilityProtocols = [ - "PolygonDataCommittee", - ]; + const supporteDataAvailabilityProtocols = ["PolygonDataCommittee"]; - if (consensusContract.includes("PolygonValidium") && !supporteDataAvailabilityProtocols.includes(dataAvailabilityProtocol)) { - throw new Error(`Data availability protocol not supported, supported data availability protocols are: ${supporteDataAvailabilityProtocols}`); + if ( + consensusContract.includes("PolygonValidium") && + !supporteDataAvailabilityProtocols.includes(dataAvailabilityProtocol) + ) { + throw new Error( + `Data availability protocol not supported, supported data availability protocols are: ${supporteDataAvailabilityProtocols}` + ); } // Load provider @@ -269,12 +267,12 @@ async function main() { } } // Load data commitee - const PolygonValidiumContract = (await PolygonconsensusFactory.attach( - newZKEVMAddress - )) as PolygonValidium; + const PolygonValidiumContract = (await PolygonconsensusFactory.attach(newZKEVMAddress)) as PolygonValidium; // add data commitee to the consensus contract if ((await PolygonValidiumContract.admin()) == deployer.address) { - await (await PolygonValidiumContract.setDataAvailabilityProtocol(polygonDataCommittee?.target as any)).wait(); + await ( + await PolygonValidiumContract.setDataAvailabilityProtocol(polygonDataCommittee?.target as any) + ).wait(); // Setup data commitee to 0 await (await polygonDataCommittee?.setupCommittee(0, [], "0x")).wait(); diff --git a/docs/v2/PolygonZkEVMV2.md b/docs/v2/PolygonZkEVMV2.md deleted file mode 100644 index 92a65a309..000000000 --- a/docs/v2/PolygonZkEVMV2.md +++ /dev/null @@ -1,426 +0,0 @@ -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 IVerifierRollup _rollupVerifier, - contract PolygonRollupManager _rollupManager - ) public -``` - - -#### Parameters: -| Name | Type | Description | -| :--- | :--- | :------------------------------------------------------------------- | -|`_globalExitRootManager` | contract IPolygonZkEVMGlobalExitRoot | Global exit root manager address -|`_rollupVerifier` | contract IVerifierRollup | Rollup verifier address -|`_rollupManager` | contract PolygonRollupManager | Global exit root manager address - -### initialize -```solidity - function initialize( - address _admin, - address _trustedSequencer, - contract IERC20Upgradeable _feeToken, - string _trustedSequencerURL, - string _networkName, - string _version - ) external -``` - - -#### Parameters: -| Name | Type | Description | -| :--- | :--- | :------------------------------------------------------------------- | -|`_admin` | address | Admin address -|`_trustedSequencer` | address | Trusted sequencer address -|`_feeToken` | contract IERC20Upgradeable | Fee token -|`_trustedSequencerURL` | string | Trusted sequencer URL -|`_networkName` | string | L2 network name -|`_version` | string | version - -### sequenceBatches -```solidity - function sequenceBatches( - struct PolygonZkEVMV2.BatchData[] batches, - address l2Coinbase - ) external -``` -Allows a sequencer to send multiple batches - - -#### Parameters: -| Name | Type | Description | -| :--- | :--- | :------------------------------------------------------------------- | -|`batches` | struct PolygonZkEVMV2.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 - -### verifyAndRewardBatches -```solidity - function verifyAndRewardBatches( - address beneficiary, - uint64 batchesToReward - ) public -``` -Reward batches, can only be called by the rollup manager - - -#### Parameters: -| Name | Type | Description | -| :--- | :--- | :------------------------------------------------------------------- | -|`beneficiary` | address | Addres htat will receive the fees -|`batchesToReward` | uint64 | Batches to reward - -### _updateBatchFee -```solidity - function _updateBatchFee( - uint64 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` | uint64 | New last verified batch - -### forceBatch -```solidity - function forceBatch( - bytes transactions, - uint256 feeTokenAmount - ) 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: -|`feeTokenAmount` | uint256 | Max amount of feeToken tokens that the sender is willing to pay - -### sequenceForceBatches -```solidity - function sequenceForceBatches( - struct PolygonZkEVMV2.BatchData[] 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 PolygonZkEVMV2.BatchData[] | 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 - -### setMultiplierBatchFee -```solidity - function setMultiplierBatchFee( - uint16 newMultiplierBatchFee - ) external -``` -Allow the admin to set a new multiplier batch fee - - -#### Parameters: -| Name | Type | Description | -| :--- | :--- | :------------------------------------------------------------------- | -|`newMultiplierBatchFee` | uint16 | multiplier batch fee - -### setVerifyBatchTimeTarget -```solidity - function setVerifyBatchTimeTarget( - uint64 newVerifyBatchTimeTarget - ) external -``` -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 - -### 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 - - - -### getForcedBatchFee -```solidity - function getForcedBatchFee( - ) public returns (uint256) -``` -Get forced batch fee - - - -### calculateRewardPerBatch -```solidity - function calculateRewardPerBatch( - ) public returns (uint256) -``` -Function to calculate the reward to verify a single batch - - - -### getLastVerifiedBatch -```solidity - function getLastVerifiedBatch( - ) public returns (uint64) -``` -Get the last verified batch - - - -## 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 - -### VerifyBatchesTrustedAggregator -```solidity - event VerifyBatchesTrustedAggregator( - ) -``` - -Emitted when the trusted aggregator verifies batches - -### ConsolidatePendingState -```solidity - event ConsolidatePendingState( - ) -``` - -Emitted when pending state is consolidated - -### 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 - -### SetTrustedAggregatorTimeout -```solidity - event SetTrustedAggregatorTimeout( - ) -``` - -Emitted when the admin updates the trusted aggregator timeout - -### SetPendingStateTimeout -```solidity - event SetPendingStateTimeout( - ) -``` - -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( - ) -``` - -Emitted when the admin updates the multiplier batch fee - -### SetVerifyBatchTimeTarget -```solidity - event SetVerifyBatchTimeTarget( - ) -``` - -Emitted when the admin updates the verify batch timeout - -### 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 - -### ProveNonDeterministicPendingState -```solidity - event ProveNonDeterministicPendingState( - ) -``` - -Emitted when is proved a different state given the same batches - -### OverridePendingState -```solidity - event OverridePendingState( - ) -``` - -Emitted when the trusted aggregator overrides pending state - -### UpdateZkEVMVersion -```solidity - event UpdateZkEVMVersion( - ) -``` - -Emitted everytime the forkID is updated, this includes the first initialization of the contract -This event is intended to be emitted for every upgrade of the contract with relevant changes for the nodes - diff --git a/test/contractsv2/PolygonGlobalExitRootV2.test.ts b/test/contractsv2/PolygonGlobalExitRootV2.test.ts index f7be0d41f..2ff94ed15 100644 --- a/test/contractsv2/PolygonGlobalExitRootV2.test.ts +++ b/test/contractsv2/PolygonGlobalExitRootV2.test.ts @@ -13,7 +13,6 @@ import { TokenWrapped, Address, PolygonZkEVM, - PolygonZkEVMV2Existent, } from "../../typechain-types"; import {takeSnapshot, time} from "@nomicfoundation/hardhat-network-helpers"; import {processorUtils, contractUtils, MTBridge, mtBridgeUtils} from "@0xpolygonhermez/zkevm-commonjs"; @@ -43,7 +42,7 @@ function calculateGlobalExitRootLeaf(newGlobalExitRoot: any, lastBlockHash: any, [newGlobalExitRoot, lastBlockHash, timestamp] ); } -describe("Polygon ZK-EVM TestnetV2", () => { +describe("Polygon Globlal exit root v2", () => { let deployer: any; let rollupManager: any; let bridge: any; diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index 6b0043523..9724dea34 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -7,9 +7,7 @@ import { PolygonRollupManagerMock, PolygonZkEVMGlobalExitRootV2, PolygonZkEVMBridgeV2, - PolygonZkEVMV2, PolygonZkEVMEtrog, - PolygonRollupBase, PolygonRollupBaseEtrog, TokenWrapped, Address, @@ -18,8 +16,6 @@ import {takeSnapshot, time} from "@nomicfoundation/hardhat-network-helpers"; import {processorUtils, contractUtils, MTBridge, mtBridgeUtils} from "@0xpolygonhermez/zkevm-commonjs"; const {calculateSnarkInput, calculateAccInputHash, calculateBatchHashData} = contractUtils; -type BatchDataStruct = PolygonRollupBase.BatchDataStruct; -type ForcedBatchDataStruct = PolygonRollupBase.ForcedBatchDataStruct; type BatchDataStructEtrog = PolygonRollupBaseEtrog.BatchDataStruct; const MerkleTreeBridge = MTBridge; @@ -29,7 +25,7 @@ function calculateGlobalExitRoot(mainnetExitRoot: any, rollupExitRoot: any) { return ethers.solidityPackedKeccak256(["bytes32", "bytes32"], [mainnetExitRoot, rollupExitRoot]); } -describe("Polygon ZK-EVM TestnetV2", () => { +describe("Polygon Rollup Manager", () => { let deployer: any; let timelock: any; let emergencyCouncil: any; @@ -242,7 +238,8 @@ describe("Polygon ZK-EVM TestnetV2", () => { expect(await rollupManagerContract.isEmergencyState()).to.be.equal(false); expect(await polygonZkEVMBridgeContract.isEmergencyState()).to.be.equal(false); }); - it("should check full flow", async () => { + + it("should check full flow etrog", async () => { const urlSequencer = "http://zkevm-json-rpc:8123"; const chainID = 1000; const networkName = "zkevm"; @@ -257,7 +254,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { // In order to create a new rollup type, create an implementation of the contract // Create zkEVM implementation - const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMV2"); + const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMEtrog"); const PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy( polygonZkEVMGlobalExitRoot.target, polTokenContract.target, @@ -339,7 +336,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { await snapshot.restore(); expect(expectedRollupType).to.be.deep.equal(await rollupManagerContract.rollupTypeMap(newRollupTypeID)); - // Create a // Only admin can create new zkEVMs await expect( @@ -396,7 +392,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { nonce: 1, }); - const newZkEVMContract = PolygonZKEVMV2Factory.attach(newZKEVMAddress) as PolygonZkEVMV2; + const newZkEVMContract = PolygonZKEVMV2Factory.attach(newZKEVMAddress) as PolygonZkEVMEtrog; const newSequencedBatch = 1; await expect( @@ -418,6 +414,8 @@ describe("Polygon ZK-EVM TestnetV2", () => { .to.emit(rollupManagerContract, "OnSequenceBatches") .withArgs(newCreatedRollupID, newSequencedBatch); + const blockCreatedRollup = await ethers.provider.getBlock("latest"); + // Assert new rollup created const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; expect(await newZkEVMContract.admin()).to.be.equal(admin.address); @@ -425,7 +423,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { expect(await newZkEVMContract.trustedSequencerURL()).to.be.equal(urlSequencer); expect(await newZkEVMContract.networkName()).to.be.equal(networkName); expect(await newZkEVMContract.forceBatchTimeout()).to.be.equal(FORCE_BATCH_TIMEOUT); - expect(await newZkEVMContract.lastTimestamp()).to.be.equal(timestampCreatedRollup); // Cannot create 2 chains with the same chainID await expect( @@ -474,13 +471,15 @@ describe("Polygon ZK-EVM TestnetV2", () => { expect(tx.nonce).to.be.equal(0); expect(tx.chainId).to.be.equal(0); - const expectedAccInputHash = calculateAccInputHash( + const expectedAccInputHash = calculateAccInputHashetrog( ethers.ZeroHash, ethers.keccak256(transaction), await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), timestampCreatedRollup, - trustedSequencer.address + trustedSequencer.address, + blockCreatedRollup?.parentHash ); + // calcualte accINputHash expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash); @@ -511,14 +510,13 @@ describe("Polygon ZK-EVM TestnetV2", () => { // try verify batches const l2txData = "0x123456"; const maticAmount = await rollupManagerContract.getBatchFee(); - const currentTimestamp = (await ethers.provider.getBlock("latest"))?.timestamp; const sequence = { transactions: l2txData, - globalExitRoot: ethers.ZeroHash, - timestamp: currentTimestamp, - minForcedTimestamp: 0, - } as BatchDataStruct; + forcedGlobalExitRoot: ethers.ZeroHash, + forcedTimestamp: 0, + forcedBlockHashL1: ethers.ZeroHash, + } as BatchDataStructEtrog; // Approve tokens await expect(polTokenContract.connect(trustedSequencer).approve(newZkEVMContract.target, maticAmount)).to.emit( @@ -527,1393 +525,31 @@ describe("Polygon ZK-EVM TestnetV2", () => { ); // Sequence Batches - await expect(newZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address)) - .to.emit(newZkEVMContract, "SequenceBatches") - .withArgs(newSequencedBatch + 1); - - const expectedAccInputHash2 = calculateAccInputHash( - expectedAccInputHash, - ethers.keccak256(l2txData), - ethers.ZeroHash, - currentTimestamp, - trustedSequencer.address - ); - // calcualte accINputHash - expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash2); - - // Create a new local exit root mocking some bridge - const tokenName = "Matic Token"; - const tokenSymbol = "MATIC"; - const decimals = 18; - const metadataToken = ethers.AbiCoder.defaultAbiCoder().encode( - ["string", "string", "uint8"], - [tokenName, tokenSymbol, decimals] - ); - - const originNetwork = networkIDRollup; - const tokenAddress = ethers.getAddress(ethers.hexlify(ethers.randomBytes(20))); - const amount = ethers.parseEther("10"); - const destinationNetwork = networkIDMainnet; - const destinationAddress = beneficiary.address; - const metadata = metadataToken; // since we are inserting in the exit root can be anything - const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); - - // compute root merkle tree in Js - const height = 32; - const merkleTreezkEVM = new MerkleTreeBridge(height); - const leafValue = getLeafValue( - LEAF_TYPE_ASSET, - originNetwork, - tokenAddress, - destinationNetwork, - destinationAddress, - amount, - metadataHash - ); - - // Add 2 leafs - merkleTreezkEVM.add(leafValue); - merkleTreezkEVM.add(leafValue); - - // check merkle root with SC - const rootzkEVM = merkleTreezkEVM.getRoot(); - - // trustedAggregator forge the batch - const pendingState = 0; - const newLocalExitRoot = rootzkEVM; - const newStateRoot = "0x0000000000000000000000000000000000000000000000000000000000000123"; - const newVerifiedBatch = newSequencedBatch + 1; - const zkProofFFlonk = new Array(24).fill(ethers.ZeroHash); - const currentVerifiedBatch = 0; - - const initialAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); - await expect( - rollupManagerContract - .connect(deployer) - .verifyBatchesTrustedAggregator( - newCreatedRollupID, - pendingState, - currentVerifiedBatch, - newVerifiedBatch, - newLocalExitRoot, - newStateRoot, - beneficiary.address, - zkProofFFlonk - ) - ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); - - await expect( - rollupManagerContract - .connect(trustedAggregator) - .verifyBatchesTrustedAggregator( - newCreatedRollupID, - pendingState, - currentVerifiedBatch, - currentVerifiedBatch, - newLocalExitRoot, - newStateRoot, - beneficiary.address, - zkProofFFlonk - ) - ).to.be.revertedWithCustomError(rollupManagerContract, "FinalNumBatchBelowLastVerifiedBatch"); - - await expect( - rollupManagerContract - .connect(trustedAggregator) - .verifyBatchesTrustedAggregator( - newCreatedRollupID, - pendingState, - currentVerifiedBatch, - 3, - newLocalExitRoot, - newStateRoot, - beneficiary.address, - zkProofFFlonk - ) - ).to.be.revertedWithCustomError(rollupManagerContract, "NewAccInputHashDoesNotExist"); - - // Calcualte new globalExitroot - const merkleTreeRollups = new MerkleTreeBridge(height); - merkleTreeRollups.add(newLocalExitRoot); - const rootRollups = merkleTreeRollups.getRoot(); - - // Verify batch - await expect( - rollupManagerContract - .connect(trustedAggregator) - .verifyBatchesTrustedAggregator( - newCreatedRollupID, - pendingState, - currentVerifiedBatch, - newVerifiedBatch, - newLocalExitRoot, - newStateRoot, - beneficiary.address, - zkProofFFlonk - ) - ) - .to.emit(rollupManagerContract, "VerifyBatchesTrustedAggregator") - .withArgs(newCreatedRollupID, newVerifiedBatch, newStateRoot, newLocalExitRoot, trustedAggregator.address) - .to.emit(polygonZkEVMGlobalExitRoot, "UpdateL1InfoTree") - .withArgs(ethers.ZeroHash, rootRollups); - - const finalAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); - - expect(finalAggregatorMatic).to.equal(initialAggregatorMatic + maticAmount); - - // Assert global exit root - expect(await polygonZkEVMGlobalExitRoot.lastRollupExitRoot()).to.be.equal(rootRollups); - expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(ethers.ZeroHash); - - expect(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()).to.be.equal( - calculateGlobalExitRoot(ethers.ZeroHash, rootRollups) - ); - - const indexLeaf = 0; - const proofZkEVM = merkleTreezkEVM.getProofTreeByIndex(indexLeaf); - const proofRollups = merkleTreeRollups.getProofTreeByIndex(indexLeaf); - - // verify merkle proof - expect(verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM)).to.be.equal(true); - expect(verifyMerkleProof(rootzkEVM, proofRollups, indexLeaf, rootRollups)).to.be.equal(true); - - expect( - await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM) - ).to.be.equal(true); - - expect( - await polygonZkEVMBridgeContract.verifyMerkleProof(newLocalExitRoot, proofRollups, indexLeaf, rootRollups) - ).to.be.equal(true); - - // claim - const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); - // create2 parameters - const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]); - const minimalBytecodeProxy = await polygonZkEVMBridgeContract.BASE_INIT_BYTECODE_WRAPPED_TOKEN(); - const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]); - const precalculateWrappedErc20 = await ethers.getCreate2Address( - polygonZkEVMBridgeContract.target as string, - salt, - hashInitCode - ); - const newWrappedToken = tokenWrappedFactory.attach(precalculateWrappedErc20) as TokenWrapped; - - // Use precalculatedWrapperAddress and check if matches - expect( - await polygonZkEVMBridgeContract.precalculatedWrapperAddress( - networkIDRollup, - tokenAddress, - tokenName, - tokenSymbol, - decimals - ) - ).to.be.equal(precalculateWrappedErc20); - - // index leaf is 0 bc, does not have mainnet flag, and it's rollup 0 on leaf 0 - await expect( - polygonZkEVMBridgeContract.claimAsset( - proofZkEVM, - proofRollups, - indexLeaf, - ethers.ZeroHash, - rootRollups, - originNetwork, - tokenAddress, - destinationNetwork, - destinationAddress, - amount, - metadata - ) - ) - .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") - .withArgs(indexLeaf, originNetwork, tokenAddress, destinationAddress, amount) - .to.emit(polygonZkEVMBridgeContract, "NewWrappedToken") - .withArgs(originNetwork, tokenAddress, precalculateWrappedErc20, metadata) - .to.emit(newWrappedToken, "Transfer") - .withArgs(ethers.ZeroAddress, beneficiary.address, amount); - - // Assert maps created - const newTokenInfo = await polygonZkEVMBridgeContract.wrappedTokenToTokenInfo(precalculateWrappedErc20); - - expect(newTokenInfo.originNetwork).to.be.equal(networkIDRollup); - expect(newTokenInfo.originTokenAddress).to.be.equal(tokenAddress); - expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( - precalculateWrappedErc20 - ); - expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( - precalculateWrappedErc20 - ); - - expect(await polygonZkEVMBridgeContract.tokenInfoToWrappedToken(salt)).to.be.equal(precalculateWrappedErc20); - - // Check the wrapper info - expect(await newWrappedToken.name()).to.be.equal(tokenName); - expect(await newWrappedToken.symbol()).to.be.equal(tokenSymbol); - expect(await newWrappedToken.decimals()).to.be.equal(decimals); - - // Can't claim because nullifier await expect( - polygonZkEVMBridgeContract.claimAsset( - proofZkEVM, - proofRollups, - indexLeaf, - ethers.ZeroHash, - rootRollups, - originNetwork, - tokenAddress, - destinationNetwork, - destinationAddress, - amount, - metadata - ) - ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AlreadyClaimed"); - - // Check new token - expect(await newWrappedToken.totalSupply()).to.be.equal(amount); - - // Force batches + newZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address) + ).to.emit(newZkEVMContract, "SequenceBatches"); - // Check force batches are unactive - await expect(newZkEVMContract.forceBatch("0x", 0)).to.be.revertedWithCustomError( - newZkEVMContract, - "ForceBatchNotAllowed" - ); - await expect(newZkEVMContract.sequenceForceBatches([])).to.be.revertedWithCustomError( - newZkEVMContract, - "ForceBatchNotAllowed" - ); - - expect(await newZkEVMContract.forceBatchAddress()).to.be.equal(admin.address); - await expect(newZkEVMContract.connect(admin).setForceBatchAddress(deployer.address)) - .to.emit(newZkEVMContract, "SetForceBatchAddress") - .withArgs(deployer.address); - expect(await newZkEVMContract.forceBatchAddress()).to.be.equal(deployer.address); - - await expect(newZkEVMContract.connect(admin).setForceBatchAddress(ethers.ZeroAddress)) - .to.emit(newZkEVMContract, "SetForceBatchAddress") - .withArgs(ethers.ZeroAddress); - - await expect( - newZkEVMContract.connect(admin).setForceBatchAddress(deployer.address) - ).to.be.revertedWithCustomError(newZkEVMContract, "ForceBatchesDecentralized"); - - //snapshot emergency - const snapshotEmergencyState = await takeSnapshot(); - await rollupManagerContract.connect(emergencyCouncil).activateEmergencyState(); - await expect(newZkEVMContract.forceBatch("0x", 0)).to.be.revertedWithCustomError( - newZkEVMContract, - "ForceBatchesNotAllowedOnEmergencyState" - ); - await rollupManagerContract.connect(admin).deactivateEmergencyState(); - const currentTimestampEmergency = (await ethers.provider.getBlock("latest"))?.timestamp; - - expect(await rollupManagerContract.lastDeactivatedEmergencyStateTimestamp()).to.be.equal( - currentTimestampEmergency - ); - - await expect(newZkEVMContract.sequenceForceBatches([sequence])).to.be.revertedWithCustomError( - newZkEVMContract, - "HaltTimeoutNotExpiredAfterEmergencyState" - ); - - await snapshotEmergencyState.restore(); - - const l2txDataForceBatch = "0x123456"; - const maticAmountForced = await rollupManagerContract.getForcedBatchFee(); - const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); - - // Approve tokens - await expect(polTokenContract.approve(newZkEVMContract.target, maticAmountForced)).to.emit( - polTokenContract, - "Approval" - ); - - const lastForcedBatch = (await newZkEVMContract.lastForceBatch()) + 1n; - - // Force batch - await expect(newZkEVMContract.forceBatch(l2txDataForceBatch, maticAmountForced)) - .to.emit(newZkEVMContract, "ForceBatch") - .withArgs(lastForcedBatch, lastGlobalExitRoot, deployer.address, "0x"); - - const currentTimestamp2 = (await ethers.provider.getBlock("latest"))?.timestamp; - - const sequenceForced = { - transactions: l2txDataForceBatch, - globalExitRoot: lastGlobalExitRoot, - timestamp: currentTimestamp2, - minForcedTimestamp: currentTimestamp2, - } as BatchDataStruct; - - const snapshot3 = await takeSnapshot(); - // Sequence Batches - await expect( - newZkEVMContract.connect(trustedSequencer).sequenceBatches([sequenceForced], trustedSequencer.address) - ) - .to.emit(newZkEVMContract, "SequenceBatches") - .withArgs(3); - - const expectedAccInputHash3 = calculateAccInputHash( - expectedAccInputHash2, - ethers.keccak256(l2txDataForceBatch), - lastGlobalExitRoot, - currentTimestamp2, - trustedSequencer.address - ); - // calcualte accINputHash - expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash3); - - await snapshot3.restore(); - // sequence force batches - - const timestampForceBatch = (await ethers.provider.getBlock("latest"))?.timestamp as any; - // Increment timestamp - await ethers.provider.send("evm_setNextBlockTimestamp", [timestampForceBatch + FORCE_BATCH_TIMEOUT]); - - const forceBatchStruct = { - transactions: l2txDataForceBatch, - globalExitRoot: lastGlobalExitRoot, - minForcedTimestamp: currentTimestamp2, - } as ForcedBatchDataStruct; - - // sequence force batch - await expect(newZkEVMContract.sequenceForceBatches([forceBatchStruct])) - .to.emit(newZkEVMContract, "SequenceForceBatches") - .withArgs(3); - - // Check admin functions - await expect(newZkEVMContract.setTrustedSequencer(deployer.address)).to.be.revertedWithCustomError( - newZkEVMContract, - "OnlyAdmin" - ); - - await expect(newZkEVMContract.connect(admin).setTrustedSequencer(deployer.address)) - .to.emit(newZkEVMContract, "SetTrustedSequencer") - .withArgs(deployer.address); - - await expect(newZkEVMContract.setTrustedSequencerURL("0x1253")).to.be.revertedWithCustomError( - newZkEVMContract, - "OnlyAdmin" - ); - await expect(newZkEVMContract.connect(admin).setTrustedSequencerURL("0x1253")) - .to.emit(newZkEVMContract, "SetTrustedSequencerURL") - .withArgs("0x1253"); - - await expect(newZkEVMContract.setForceBatchTimeout(0)).to.be.revertedWithCustomError( - newZkEVMContract, - "OnlyAdmin" - ); - - await expect( - newZkEVMContract.connect(admin).setForceBatchTimeout(FORCE_BATCH_TIMEOUT) - ).to.be.revertedWithCustomError(newZkEVMContract, "InvalidRangeForceBatchTimeout"); - - await expect(newZkEVMContract.connect(admin).setForceBatchTimeout(0)) - .to.emit(newZkEVMContract, "SetForceBatchTimeout") - .withArgs(0); - - await expect(newZkEVMContract.transferAdminRole(deployer.address)).to.be.revertedWithCustomError( - newZkEVMContract, - "OnlyAdmin" - ); - - await expect(newZkEVMContract.connect(admin).transferAdminRole(deployer.address)) - .to.emit(newZkEVMContract, "TransferAdminRole") - .withArgs(deployer.address); - - await expect(newZkEVMContract.connect(admin).acceptAdminRole()).to.be.revertedWithCustomError( - newZkEVMContract, - "OnlyPendingAdmin" - ); - - await expect(newZkEVMContract.connect(deployer).acceptAdminRole()) - .to.emit(newZkEVMContract, "AcceptAdminRole") - .withArgs(deployer.address); - }); - - it("should check full flow etrog", async () => { - const urlSequencer = "http://zkevm-json-rpc:8123"; - const chainID = 1000; - const networkName = "zkevm"; - const forkID = 0; - const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001"; - const rollupCompatibilityID = 0; - const descirption = "zkevm test"; - // Native token will be ether - const gasTokenAddress = ethers.ZeroAddress; - const gasTokenNetwork = 0; - - // In order to create a new rollup type, create an implementation of the contract - - // Create zkEVM implementation - const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMEtrog"); - const PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy( - polygonZkEVMGlobalExitRoot.target, - polTokenContract.target, - polygonZkEVMBridgeContract.target, - rollupManagerContract.target - ); - await PolygonZKEVMV2Contract.waitForDeployment(); - - // Try to add a new rollup type - await expect( - rollupManagerContract.addNewRollupType( - PolygonZKEVMV2Contract.target, - verifierContract.target, - forkID, - rollupCompatibilityID, - genesisRandom, - descirption - ) - ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); - - // Add a new rollup type with timelock - const newRollupTypeID = 1; - await expect( - rollupManagerContract - .connect(timelock) - .addNewRollupType( - PolygonZKEVMV2Contract.target, - verifierContract.target, - forkID, - rollupCompatibilityID, - genesisRandom, - descirption - ) - ) - .to.emit(rollupManagerContract, "AddNewRollupType") - .withArgs( - newRollupTypeID, - PolygonZKEVMV2Contract.target, - verifierContract.target, - forkID, - rollupCompatibilityID, - genesisRandom, - descirption - ); - - // assert new rollup type - const createdRollupType = await rollupManagerContract.rollupTypeMap(newRollupTypeID); - - const expectedRollupType = [ - PolygonZKEVMV2Contract.target, - verifierContract.target, - forkID, - rollupCompatibilityID, - false, - genesisRandom, - ]; - expect(createdRollupType).to.be.deep.equal(expectedRollupType); - - // obsoleteRollupType, take snapshot for it - const snapshot = await takeSnapshot(); - - await expect(rollupManagerContract.obsoleteRollupType(newRollupTypeID)).to.be.revertedWithCustomError( - rollupManagerContract, - "AddressDoNotHaveRequiredRole" - ); - - await expect(rollupManagerContract.connect(admin).obsoleteRollupType(newRollupTypeID)) - .to.emit(rollupManagerContract, "ObsoleteRollupType") - .withArgs(newRollupTypeID); - - expect([ - PolygonZKEVMV2Contract.target, - verifierContract.target, - forkID, - rollupCompatibilityID, - true, - genesisRandom, - ]).to.be.deep.equal(await rollupManagerContract.rollupTypeMap(newRollupTypeID)); - await snapshot.restore(); - - expect(expectedRollupType).to.be.deep.equal(await rollupManagerContract.rollupTypeMap(newRollupTypeID)); - // Create a - - // Only admin can create new zkEVMs - await expect( - rollupManagerContract.createNewRollup( - newRollupTypeID, - chainID, - admin.address, - trustedSequencer.address, - gasTokenAddress, - urlSequencer, - networkName - ) - ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); - - // UNexisting rollupType - await expect( - rollupManagerContract - .connect(admin) - .createNewRollup( - 0, - chainID, - admin.address, - trustedSequencer.address, - gasTokenAddress, - urlSequencer, - networkName - ) - ).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeDoesNotExist"); - - // Obsolete rollup type and test that fails - const snapshot2 = await takeSnapshot(); - await expect(rollupManagerContract.connect(admin).obsoleteRollupType(newRollupTypeID)) - .to.emit(rollupManagerContract, "ObsoleteRollupType") - .withArgs(newRollupTypeID); - - await expect( - rollupManagerContract - .connect(admin) - .createNewRollup( - newRollupTypeID, - chainID, - admin.address, - trustedSequencer.address, - gasTokenAddress, - urlSequencer, - networkName - ) - ).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeObsolete"); - await snapshot2.restore(); - - const newCreatedRollupID = 1; - const newZKEVMAddress = ethers.getCreateAddress({ - from: rollupManagerContract.target as string, - nonce: 1, - }); - - const newZkEVMContract = PolygonZKEVMV2Factory.attach(newZKEVMAddress) as PolygonZkEVMEtrog; - const newSequencedBatch = 1; - - await expect( - rollupManagerContract - .connect(admin) - .createNewRollup( - newRollupTypeID, - chainID, - admin.address, - trustedSequencer.address, - gasTokenAddress, - urlSequencer, - networkName - ) - ) - .to.emit(rollupManagerContract, "CreateNewRollup") - .withArgs(newCreatedRollupID, newRollupTypeID, newZKEVMAddress, chainID, gasTokenAddress) - .to.emit(newZkEVMContract, "InitialSequenceBatches") - .to.emit(rollupManagerContract, "OnSequenceBatches") - .withArgs(newCreatedRollupID, newSequencedBatch); - - const blockCreatedRollup = await ethers.provider.getBlock("latest"); - - // Assert new rollup created - const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; - expect(await newZkEVMContract.admin()).to.be.equal(admin.address); - expect(await newZkEVMContract.trustedSequencer()).to.be.equal(trustedSequencer.address); - expect(await newZkEVMContract.trustedSequencerURL()).to.be.equal(urlSequencer); - expect(await newZkEVMContract.networkName()).to.be.equal(networkName); - expect(await newZkEVMContract.forceBatchTimeout()).to.be.equal(FORCE_BATCH_TIMEOUT); - - // Cannot create 2 chains with the same chainID - await expect( - rollupManagerContract - .connect(admin) - .createNewRollup( - newRollupTypeID, - chainID, - admin.address, - trustedSequencer.address, - gasTokenAddress, - urlSequencer, - networkName - ) - ).to.be.revertedWithCustomError(rollupManagerContract, "ChainIDAlreadyExist"); - - const transaction = await newZkEVMContract.generateInitializeTransaction( - newCreatedRollupID, - gasTokenAddress, - gasTokenNetwork, - "0x" // empty metadata - ); - - // Check transaction - const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); - const encodedData = bridgeL2Factory.interface.encodeFunctionData("initialize", [ - newCreatedRollupID, - gasTokenAddress, - gasTokenNetwork, - globalExitRootL2Address, - ethers.ZeroAddress, - "0x", // empty metadata - ]); - - const rawTx = processorUtils.customRawTxToRawTx(transaction); - const tx = ethers.Transaction.from(rawTx); - - const rlpSignData = transaction.slice(0, -(SIGNATURE_BYTES * 2 + EFFECTIVE_PERCENTAGE_BYTES * 2)); - expect(rlpSignData).to.be.equal(tx.unsignedSerialized); - - expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); - expect(tx.value).to.be.equal(0); - expect(tx.data).to.be.equal(encodedData); - expect(tx.gasPrice).to.be.equal(0); - expect(tx.gasLimit).to.be.equal(30000000); - expect(tx.nonce).to.be.equal(0); - expect(tx.chainId).to.be.equal(0); - - const expectedAccInputHash = calculateAccInputHashetrog( - ethers.ZeroHash, - ethers.keccak256(transaction), - await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), - timestampCreatedRollup, - trustedSequencer.address, - blockCreatedRollup?.parentHash - ); - - // calcualte accINputHash - expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash); - - // Check mapping on rollup Manager - const rollupData = await rollupManagerContract.rollupIDToRollupData(newCreatedRollupID); - expect(rollupData.rollupContract).to.be.equal(newZKEVMAddress); - expect(rollupData.chainID).to.be.equal(chainID); - expect(rollupData.verifier).to.be.equal(verifierContract.target); - expect(rollupData.forkID).to.be.equal(forkID); - expect(rollupData.lastLocalExitRoot).to.be.equal(ethers.ZeroHash); - expect(rollupData.lastBatchSequenced).to.be.equal(newSequencedBatch); - expect(rollupData.lastVerifiedBatch).to.be.equal(0); - expect(rollupData.lastPendingState).to.be.equal(0); - expect(rollupData.lastPendingStateConsolidated).to.be.equal(0); - expect(rollupData.lastVerifiedBatchBeforeUpgrade).to.be.equal(0); - expect(rollupData.rollupTypeID).to.be.equal(1); - expect(rollupData.rollupCompatibilityID).to.be.equal(0); - - const sequencedBatchData = await rollupManagerContract.getRollupSequencedBatches( - newCreatedRollupID, - newSequencedBatch - ); - - expect(sequencedBatchData.accInputHash).to.be.equal(expectedAccInputHash); - expect(sequencedBatchData.sequencedTimestamp).to.be.equal(timestampCreatedRollup); - expect(sequencedBatchData.previousLastBatchSequenced).to.be.equal(0); - - // try verify batches - const l2txData = "0x123456"; - const maticAmount = await rollupManagerContract.getBatchFee(); - const currentTimestamp = (await ethers.provider.getBlock("latest"))?.timestamp; - - const sequence = { - transactions: l2txData, - forcedGlobalExitRoot: ethers.ZeroHash, - forcedTimestamp: 0, - forcedBlockHashL1: ethers.ZeroHash, - } as BatchDataStructEtrog; - - // Approve tokens - await expect(polTokenContract.connect(trustedSequencer).approve(newZkEVMContract.target, maticAmount)).to.emit( - polTokenContract, - "Approval" - ); - - // Sequence Batches - await expect( - newZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address) - ).to.emit(newZkEVMContract, "SequenceBatches"); - - const lastBlock = await ethers.provider.getBlock("latest"); - const lastBlockHash = lastBlock?.parentHash; - const lastGlobalExitRootS = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); - - // TODO - const height = 32; - const merkleTreeGLobalExitRoot = new MerkleTreeBridge(height); - const leafValueJs = calculateGlobalExitRootLeaf(lastGlobalExitRootS, lastBlockHash, lastBlock?.timestamp); - //merkleTreeGLobalExitRoot.add(leafValueJs); - - const rootSC = await polygonZkEVMGlobalExitRoot.getRoot(); - const rootJS = merkleTreeGLobalExitRoot.getRoot(); - - expect(rootSC).to.be.equal(rootJS); - - const expectedAccInputHash2 = calculateAccInputHashetrog( - expectedAccInputHash, - ethers.keccak256(l2txData), - rootSC, - lastBlock?.timestamp, - trustedSequencer.address, - ethers.ZeroHash - ); - // calcualte accINputHash - expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash2); - - // Create a new local exit root mocking some bridge - const tokenName = "Matic Token"; - const tokenSymbol = "MATIC"; - const decimals = 18; - const metadataToken = ethers.AbiCoder.defaultAbiCoder().encode( - ["string", "string", "uint8"], - [tokenName, tokenSymbol, decimals] - ); - - const originNetwork = networkIDRollup; - const tokenAddress = ethers.getAddress(ethers.hexlify(ethers.randomBytes(20))); - const amount = ethers.parseEther("10"); - const destinationNetwork = networkIDMainnet; - const destinationAddress = beneficiary.address; - const metadata = metadataToken; // since we are inserting in the exit root can be anything - const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); - - // compute root merkle tree in Js - const merkleTreezkEVM = new MerkleTreeBridge(height); - const leafValue = getLeafValue( - LEAF_TYPE_ASSET, - originNetwork, - tokenAddress, - destinationNetwork, - destinationAddress, - amount, - metadataHash - ); - - // Add 2 leafs - merkleTreezkEVM.add(leafValue); - merkleTreezkEVM.add(leafValue); - - // check merkle root with SC - const rootzkEVM = merkleTreezkEVM.getRoot(); - - // trustedAggregator forge the batch - const pendingState = 0; - const newLocalExitRoot = rootzkEVM; - const newStateRoot = "0x0000000000000000000000000000000000000000000000000000000000000123"; - const newVerifiedBatch = newSequencedBatch + 1; - const zkProofFFlonk = new Array(24).fill(ethers.ZeroHash); - const currentVerifiedBatch = 0; - - const initialAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); - await expect( - rollupManagerContract - .connect(deployer) - .verifyBatchesTrustedAggregator( - newCreatedRollupID, - pendingState, - currentVerifiedBatch, - newVerifiedBatch, - newLocalExitRoot, - newStateRoot, - beneficiary.address, - zkProofFFlonk - ) - ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); - - await expect( - rollupManagerContract - .connect(trustedAggregator) - .verifyBatchesTrustedAggregator( - newCreatedRollupID, - pendingState, - currentVerifiedBatch, - currentVerifiedBatch, - newLocalExitRoot, - newStateRoot, - beneficiary.address, - zkProofFFlonk - ) - ).to.be.revertedWithCustomError(rollupManagerContract, "FinalNumBatchBelowLastVerifiedBatch"); - - await expect( - rollupManagerContract - .connect(trustedAggregator) - .verifyBatchesTrustedAggregator( - newCreatedRollupID, - pendingState, - currentVerifiedBatch, - 3, - newLocalExitRoot, - newStateRoot, - beneficiary.address, - zkProofFFlonk - ) - ).to.be.revertedWithCustomError(rollupManagerContract, "NewAccInputHashDoesNotExist"); - - // Calcualte new globalExitroot - const merkleTreeRollups = new MerkleTreeBridge(height); - merkleTreeRollups.add(newLocalExitRoot); - const rootRollups = merkleTreeRollups.getRoot(); - - // Verify batch - await expect( - rollupManagerContract - .connect(trustedAggregator) - .verifyBatchesTrustedAggregator( - newCreatedRollupID, - pendingState, - currentVerifiedBatch, - newVerifiedBatch, - newLocalExitRoot, - newStateRoot, - beneficiary.address, - zkProofFFlonk - ) - ) - .to.emit(rollupManagerContract, "VerifyBatchesTrustedAggregator") - .withArgs(newCreatedRollupID, newVerifiedBatch, newStateRoot, newLocalExitRoot, trustedAggregator.address) - .to.emit(polygonZkEVMGlobalExitRoot, "UpdateL1InfoTree") - .withArgs(ethers.ZeroHash, rootRollups); - - const finalAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); - - expect(finalAggregatorMatic).to.equal(initialAggregatorMatic + maticAmount); - - // Assert global exit root - expect(await polygonZkEVMGlobalExitRoot.lastRollupExitRoot()).to.be.equal(rootRollups); - expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(ethers.ZeroHash); - - expect(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()).to.be.equal( - calculateGlobalExitRoot(ethers.ZeroHash, rootRollups) - ); - - const indexLeaf = 0; - const proofZkEVM = merkleTreezkEVM.getProofTreeByIndex(indexLeaf); - const proofRollups = merkleTreeRollups.getProofTreeByIndex(indexLeaf); - - // verify merkle proof - expect(verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM)).to.be.equal(true); - expect(verifyMerkleProof(rootzkEVM, proofRollups, indexLeaf, rootRollups)).to.be.equal(true); - - expect( - await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM) - ).to.be.equal(true); - - expect( - await polygonZkEVMBridgeContract.verifyMerkleProof(newLocalExitRoot, proofRollups, indexLeaf, rootRollups) - ).to.be.equal(true); - - // claim - const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); - // create2 parameters - const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]); - const minimalBytecodeProxy = await polygonZkEVMBridgeContract.BASE_INIT_BYTECODE_WRAPPED_TOKEN(); - const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]); - const precalculateWrappedErc20 = await ethers.getCreate2Address( - polygonZkEVMBridgeContract.target as string, - salt, - hashInitCode - ); - const newWrappedToken = tokenWrappedFactory.attach(precalculateWrappedErc20) as TokenWrapped; - - // Use precalculatedWrapperAddress and check if matches - expect( - await polygonZkEVMBridgeContract.precalculatedWrapperAddress( - networkIDRollup, - tokenAddress, - tokenName, - tokenSymbol, - decimals - ) - ).to.be.equal(precalculateWrappedErc20); - - // index leaf is 0 bc, does not have mainnet flag, and it's rollup 0 on leaf 0 - await expect( - polygonZkEVMBridgeContract.claimAsset( - proofZkEVM, - proofRollups, - indexLeaf, - ethers.ZeroHash, - rootRollups, - originNetwork, - tokenAddress, - destinationNetwork, - destinationAddress, - amount, - metadata - ) - ) - .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") - .withArgs(indexLeaf, originNetwork, tokenAddress, destinationAddress, amount) - .to.emit(polygonZkEVMBridgeContract, "NewWrappedToken") - .withArgs(originNetwork, tokenAddress, precalculateWrappedErc20, metadata) - .to.emit(newWrappedToken, "Transfer") - .withArgs(ethers.ZeroAddress, beneficiary.address, amount); - - // Assert maps created - const newTokenInfo = await polygonZkEVMBridgeContract.wrappedTokenToTokenInfo(precalculateWrappedErc20); - - expect(newTokenInfo.originNetwork).to.be.equal(networkIDRollup); - expect(newTokenInfo.originTokenAddress).to.be.equal(tokenAddress); - expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( - precalculateWrappedErc20 - ); - expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( - precalculateWrappedErc20 - ); - - expect(await polygonZkEVMBridgeContract.tokenInfoToWrappedToken(salt)).to.be.equal(precalculateWrappedErc20); - - // Check the wrapper info - expect(await newWrappedToken.name()).to.be.equal(tokenName); - expect(await newWrappedToken.symbol()).to.be.equal(tokenSymbol); - expect(await newWrappedToken.decimals()).to.be.equal(decimals); - - // Can't claim because nullifier - await expect( - polygonZkEVMBridgeContract.claimAsset( - proofZkEVM, - proofRollups, - indexLeaf, - ethers.ZeroHash, - rootRollups, - originNetwork, - tokenAddress, - destinationNetwork, - destinationAddress, - amount, - metadata - ) - ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AlreadyClaimed"); - - // Check new token - expect(await newWrappedToken.totalSupply()).to.be.equal(amount); - - // Force batches - - // Check force batches are unactive - await expect(newZkEVMContract.forceBatch("0x", 0)).to.be.revertedWithCustomError( - newZkEVMContract, - "ForceBatchNotAllowed" - ); - await expect(newZkEVMContract.sequenceForceBatches([])).to.be.revertedWithCustomError( - newZkEVMContract, - "ForceBatchNotAllowed" - ); - - await expect(newZkEVMContract.connect(admin).setForceBatchAddress(ethers.ZeroAddress)) - .to.emit(newZkEVMContract, "SetForceBatchAddress") - .withArgs(ethers.ZeroAddress); - - const l2txDataForceBatch = "0x123456"; - const maticAmountForced = await rollupManagerContract.getForcedBatchFee(); - const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); - - // Approve tokens - await expect(polTokenContract.approve(newZkEVMContract.target, maticAmountForced)).to.emit( - polTokenContract, - "Approval" - ); - - const lastForcedBatch = (await newZkEVMContract.lastForceBatch()) + 1n; - - // Force batch - await expect(newZkEVMContract.forceBatch(l2txDataForceBatch, maticAmountForced)) - .to.emit(newZkEVMContract, "ForceBatch") - .withArgs(lastForcedBatch, lastGlobalExitRoot, deployer.address, "0x"); - - const forcedBlock = await ethers.provider.getBlock("latest"); - const currentTimestamp2 = forcedBlock?.timestamp; - - const sequenceForced = { - transactions: l2txDataForceBatch, - forcedGlobalExitRoot: lastGlobalExitRoot, - forcedTimestamp: currentTimestamp2, - forcedBlockHashL1: forcedBlock?.parentHash, - } as BatchDataStructEtrog; - - const snapshot3 = await takeSnapshot(); - // Sequence Batches - await expect( - newZkEVMContract.connect(trustedSequencer).sequenceBatches([sequenceForced], trustedSequencer.address) - ).to.emit(newZkEVMContract, "SequenceBatches"); - - const expectedAccInputHash3 = calculateAccInputHashetrog( - expectedAccInputHash2, - ethers.keccak256(l2txDataForceBatch), - lastGlobalExitRoot, - currentTimestamp2, - trustedSequencer.address, - forcedBlock?.parentHash - ); - // calcualte accINputHash - expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash3); - - await snapshot3.restore(); - // sequence force batches - - const timestampForceBatch = (await ethers.provider.getBlock("latest"))?.timestamp as any; - // Increment timestamp - await ethers.provider.send("evm_setNextBlockTimestamp", [timestampForceBatch + FORCE_BATCH_TIMEOUT]); - - // sequence force batch - await expect(newZkEVMContract.sequenceForceBatches([sequenceForced])) - .to.emit(newZkEVMContract, "SequenceForceBatches") - .withArgs(3); - - // Check admin functions - await expect(newZkEVMContract.setTrustedSequencer(deployer.address)).to.be.revertedWithCustomError( - newZkEVMContract, - "OnlyAdmin" - ); - - await expect(newZkEVMContract.connect(admin).setTrustedSequencer(deployer.address)) - .to.emit(newZkEVMContract, "SetTrustedSequencer") - .withArgs(deployer.address); - - await expect(newZkEVMContract.setTrustedSequencerURL("0x1253")).to.be.revertedWithCustomError( - newZkEVMContract, - "OnlyAdmin" - ); - await expect(newZkEVMContract.connect(admin).setTrustedSequencerURL("0x1253")) - .to.emit(newZkEVMContract, "SetTrustedSequencerURL") - .withArgs("0x1253"); - - await expect(newZkEVMContract.setForceBatchTimeout(0)).to.be.revertedWithCustomError( - newZkEVMContract, - "OnlyAdmin" - ); - - await expect( - newZkEVMContract.connect(admin).setForceBatchTimeout(FORCE_BATCH_TIMEOUT) - ).to.be.revertedWithCustomError(newZkEVMContract, "InvalidRangeForceBatchTimeout"); - - await expect(newZkEVMContract.connect(admin).setForceBatchTimeout(0)) - .to.emit(newZkEVMContract, "SetForceBatchTimeout") - .withArgs(0); - - await expect(newZkEVMContract.transferAdminRole(deployer.address)).to.be.revertedWithCustomError( - newZkEVMContract, - "OnlyAdmin" - ); - - await expect(newZkEVMContract.connect(admin).transferAdminRole(deployer.address)) - .to.emit(newZkEVMContract, "TransferAdminRole") - .withArgs(deployer.address); - - await expect(newZkEVMContract.connect(admin).acceptAdminRole()).to.be.revertedWithCustomError( - newZkEVMContract, - "OnlyPendingAdmin" - ); - - await expect(newZkEVMContract.connect(deployer).acceptAdminRole()) - .to.emit(newZkEVMContract, "AcceptAdminRole") - .withArgs(deployer.address); - }); - - it("should check full flow with gas Token", async () => { - const urlSequencer = "http://zkevm-json-rpc:8123"; - const chainID = 1000; - const networkName = "zkevm"; - const forkID = 0; - const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001"; - const rollupCompatibilityID = 0; - const descirption = "zkevm test"; - // Native token will be ether - - // deploy pol - const gasTokenName = "GAS Token"; - const gasTokenSymbol = "GTOKEN"; - const gasTokenDecimals = 18; - - const gasTokenInitialBalance = ethers.parseEther("20000000"); - - const gasMetadataToken = ethers.AbiCoder.defaultAbiCoder().encode( - ["string", "string", "uint8"], - [gasTokenName, gasTokenSymbol, gasTokenDecimals] - ); - const tokenFactory = await ethers.getContractFactory("ERC20PermitMock"); - const gasTokenContract = await tokenFactory.deploy( - gasTokenName, - gasTokenSymbol, - deployer.address, - gasTokenInitialBalance - ); - - const gasTokenAddress = gasTokenContract.target; - const gasTokenNetwork = 0; - - // In order to create a new rollup type, create an implementation of the contract - - // Create zkEVM implementation - const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMV2"); - const PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy( - polygonZkEVMGlobalExitRoot.target, - polTokenContract.target, - polygonZkEVMBridgeContract.target, - rollupManagerContract.target - ); - await PolygonZKEVMV2Contract.waitForDeployment(); - - // Try to add a new rollup type - await expect( - rollupManagerContract.addNewRollupType( - PolygonZKEVMV2Contract.target, - verifierContract.target, - forkID, - rollupCompatibilityID, - genesisRandom, - descirption - ) - ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); - - // Add a new rollup type with timelock - const newRollupTypeID = 1; - await expect( - rollupManagerContract - .connect(timelock) - .addNewRollupType( - PolygonZKEVMV2Contract.target, - verifierContract.target, - forkID, - rollupCompatibilityID, - genesisRandom, - descirption - ) - ) - .to.emit(rollupManagerContract, "AddNewRollupType") - .withArgs( - newRollupTypeID, - PolygonZKEVMV2Contract.target, - verifierContract.target, - forkID, - rollupCompatibilityID, - genesisRandom, - descirption - ); - - // assert new rollup type - const createdRollupType = await rollupManagerContract.rollupTypeMap(newRollupTypeID); - - const expectedRollupType = [ - PolygonZKEVMV2Contract.target, - verifierContract.target, - forkID, - rollupCompatibilityID, - false, - genesisRandom, - ]; - expect(createdRollupType).to.be.deep.equal(expectedRollupType); - - // obsoleteRollupType, take snapshot for it - const snapshot = await takeSnapshot(); - - await expect(rollupManagerContract.obsoleteRollupType(newRollupTypeID)).to.be.revertedWithCustomError( - rollupManagerContract, - "AddressDoNotHaveRequiredRole" - ); - - await expect(rollupManagerContract.connect(admin).obsoleteRollupType(newRollupTypeID)) - .to.emit(rollupManagerContract, "ObsoleteRollupType") - .withArgs(newRollupTypeID); - - expect([ - PolygonZKEVMV2Contract.target, - verifierContract.target, - forkID, - rollupCompatibilityID, - true, - genesisRandom, - ]).to.be.deep.equal(await rollupManagerContract.rollupTypeMap(newRollupTypeID)); - await snapshot.restore(); - - expect(expectedRollupType).to.be.deep.equal(await rollupManagerContract.rollupTypeMap(newRollupTypeID)); - // Create a - - // Only admin can create new zkEVMs - await expect( - rollupManagerContract.createNewRollup( - newRollupTypeID, - chainID, - admin.address, - trustedSequencer.address, - gasTokenAddress, - urlSequencer, - networkName - ) - ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); - - // UNexisting rollupType - await expect( - rollupManagerContract - .connect(admin) - .createNewRollup( - 0, - chainID, - admin.address, - trustedSequencer.address, - gasTokenAddress, - urlSequencer, - networkName - ) - ).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeDoesNotExist"); - - // Obsolete rollup type and test that fails - const snapshot2 = await takeSnapshot(); - await expect(rollupManagerContract.connect(admin).obsoleteRollupType(newRollupTypeID)) - .to.emit(rollupManagerContract, "ObsoleteRollupType") - .withArgs(newRollupTypeID); - - await expect( - rollupManagerContract - .connect(admin) - .createNewRollup( - newRollupTypeID, - chainID, - admin.address, - trustedSequencer.address, - gasTokenAddress, - urlSequencer, - networkName - ) - ).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeObsolete"); - await snapshot2.restore(); - - const newCreatedRollupID = 1; - const newZKEVMAddress = ethers.getCreateAddress({ - from: rollupManagerContract.target as string, - nonce: 1, - }); - - const newZkEVMContract = PolygonZKEVMV2Factory.attach(newZKEVMAddress) as PolygonZkEVMV2; - const newSequencedBatch = 1; - - await expect( - rollupManagerContract - .connect(admin) - .createNewRollup( - newRollupTypeID, - chainID, - admin.address, - trustedSequencer.address, - gasTokenAddress, - urlSequencer, - networkName - ) - ) - .to.emit(rollupManagerContract, "CreateNewRollup") - .withArgs(newCreatedRollupID, newRollupTypeID, newZKEVMAddress, chainID, gasTokenAddress) - .to.emit(newZkEVMContract, "InitialSequenceBatches") - .to.emit(rollupManagerContract, "OnSequenceBatches") - .withArgs(newCreatedRollupID, newSequencedBatch); - - // Assert new rollup created - const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; - expect(await newZkEVMContract.admin()).to.be.equal(admin.address); - expect(await newZkEVMContract.trustedSequencer()).to.be.equal(trustedSequencer.address); - expect(await newZkEVMContract.trustedSequencerURL()).to.be.equal(urlSequencer); - expect(await newZkEVMContract.networkName()).to.be.equal(networkName); - expect(await newZkEVMContract.forceBatchTimeout()).to.be.equal(FORCE_BATCH_TIMEOUT); - expect(await newZkEVMContract.lastTimestamp()).to.be.equal(timestampCreatedRollup); - - // Cannot create 2 chains with the same chainID - await expect( - rollupManagerContract - .connect(admin) - .createNewRollup( - newRollupTypeID, - chainID, - admin.address, - trustedSequencer.address, - gasTokenAddress, - urlSequencer, - networkName - ) - ).to.be.revertedWithCustomError(rollupManagerContract, "ChainIDAlreadyExist"); - - const transaction = await newZkEVMContract.generateInitializeTransaction( - newCreatedRollupID, - gasTokenAddress, - gasTokenNetwork, - gasMetadataToken - ); - - // Check transaction - const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); - const encodedData = bridgeL2Factory.interface.encodeFunctionData("initialize", [ - newCreatedRollupID, - gasTokenAddress, - gasTokenNetwork, - globalExitRootL2Address, - ethers.ZeroAddress, - gasMetadataToken, - ]); - - const rawTx = processorUtils.customRawTxToRawTx(transaction); - const tx = ethers.Transaction.from(rawTx); - - const rlpSignData = transaction.slice(0, -(SIGNATURE_BYTES * 2 + EFFECTIVE_PERCENTAGE_BYTES * 2)); - expect(rlpSignData).to.be.equal(tx.unsignedSerialized); - - expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); - expect(tx.value).to.be.equal(0); - expect(tx.data).to.be.equal(encodedData); - expect(tx.gasPrice).to.be.equal(0); - expect(tx.gasLimit).to.be.equal(30000000); - expect(tx.nonce).to.be.equal(0); - expect(tx.chainId).to.be.equal(0); - - const expectedAccInputHash = calculateAccInputHash( - ethers.ZeroHash, - ethers.keccak256(transaction), - await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), - timestampCreatedRollup, - trustedSequencer.address - ); - // calcualte accINputHash - expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash); - - // Check mapping on rollup Manager - const rollupData = await rollupManagerContract.rollupIDToRollupData(newCreatedRollupID); - expect(rollupData.rollupContract).to.be.equal(newZKEVMAddress); - expect(rollupData.chainID).to.be.equal(chainID); - expect(rollupData.verifier).to.be.equal(verifierContract.target); - expect(rollupData.forkID).to.be.equal(forkID); - expect(rollupData.lastLocalExitRoot).to.be.equal(ethers.ZeroHash); - expect(rollupData.lastBatchSequenced).to.be.equal(newSequencedBatch); - expect(rollupData.lastVerifiedBatch).to.be.equal(0); - expect(rollupData.lastPendingState).to.be.equal(0); - expect(rollupData.lastPendingStateConsolidated).to.be.equal(0); - expect(rollupData.lastVerifiedBatchBeforeUpgrade).to.be.equal(0); - expect(rollupData.rollupTypeID).to.be.equal(1); - expect(rollupData.rollupCompatibilityID).to.be.equal(0); - - const sequencedBatchData = await rollupManagerContract.getRollupSequencedBatches( - newCreatedRollupID, - newSequencedBatch - ); - - expect(sequencedBatchData.accInputHash).to.be.equal(expectedAccInputHash); - expect(sequencedBatchData.sequencedTimestamp).to.be.equal(timestampCreatedRollup); - expect(sequencedBatchData.previousLastBatchSequenced).to.be.equal(0); - - // try verify batches - const l2txData = "0x123456"; - const maticAmount = await rollupManagerContract.getBatchFee(); - const currentTimestamp = (await ethers.provider.getBlock("latest"))?.timestamp; - - const sequence = { - transactions: l2txData, - globalExitRoot: ethers.ZeroHash, - timestamp: currentTimestamp, - minForcedTimestamp: 0, - } as BatchDataStruct; + const lastBlock = await ethers.provider.getBlock("latest"); + const lastBlockHash = lastBlock?.parentHash; + const lastGlobalExitRootS = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); - // Approve tokens - await expect(polTokenContract.connect(trustedSequencer).approve(newZkEVMContract.target, maticAmount)).to.emit( - polTokenContract, - "Approval" - ); + const height = 32; + const merkleTreeGLobalExitRoot = new MerkleTreeBridge(height); + const leafValueJs = calculateGlobalExitRootLeaf(lastGlobalExitRootS, lastBlockHash, lastBlock?.timestamp); + //merkleTreeGLobalExitRoot.add(leafValueJs); - // Sequence Batches - await expect(newZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address)) - .to.emit(newZkEVMContract, "SequenceBatches") - .withArgs(newSequencedBatch + 1); + const rootSC = await polygonZkEVMGlobalExitRoot.getRoot(); + const rootJS = merkleTreeGLobalExitRoot.getRoot(); - const expectedAccInputHash2 = calculateAccInputHash( + expect(rootSC).to.be.equal(rootJS); + + const expectedAccInputHash2 = calculateAccInputHashetrog( expectedAccInputHash, ethers.keccak256(l2txData), - ethers.ZeroHash, - currentTimestamp, - trustedSequencer.address + rootSC, + lastBlock?.timestamp, + trustedSequencer.address, + ethers.ZeroHash ); // calcualte accINputHash expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash2); @@ -1936,7 +572,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); // compute root merkle tree in Js - const height = 32; const merkleTreezkEVM = new MerkleTreeBridge(height); const leafValue = getLeafValue( LEAF_TYPE_ASSET, @@ -2147,6 +782,158 @@ describe("Polygon ZK-EVM TestnetV2", () => { // Check new token expect(await newWrappedToken.totalSupply()).to.be.equal(amount); + + // Force batches + + // Check force batches are unactive + await expect(newZkEVMContract.forceBatch("0x", 0)).to.be.revertedWithCustomError( + newZkEVMContract, + "ForceBatchNotAllowed" + ); + await expect(newZkEVMContract.sequenceForceBatches([])).to.be.revertedWithCustomError( + newZkEVMContract, + "ForceBatchNotAllowed" + ); + + await expect(await newZkEVMContract.forceBatchAddress()).to.be.equal(admin.address); + await expect(newZkEVMContract.connect(admin).setForceBatchAddress(deployer.address)) + .to.emit(newZkEVMContract, "SetForceBatchAddress") + .withArgs(deployer.address); + expect(await newZkEVMContract.forceBatchAddress()).to.be.equal(deployer.address); + + await expect(newZkEVMContract.connect(admin).setForceBatchAddress(ethers.ZeroAddress)) + .to.emit(newZkEVMContract, "SetForceBatchAddress") + .withArgs(ethers.ZeroAddress); + + await expect( + newZkEVMContract.connect(admin).setForceBatchAddress(deployer.address) + ).to.be.revertedWithCustomError(newZkEVMContract, "ForceBatchesDecentralized"); + + //snapshot emergency + const snapshotEmergencyState = await takeSnapshot(); + await rollupManagerContract.connect(emergencyCouncil).activateEmergencyState(); + await expect(newZkEVMContract.forceBatch("0x", 0)).to.be.revertedWithCustomError( + newZkEVMContract, + "ForceBatchesNotAllowedOnEmergencyState" + ); + await rollupManagerContract.connect(admin).deactivateEmergencyState(); + const currentTimestampEmergency = (await ethers.provider.getBlock("latest"))?.timestamp; + + expect(await rollupManagerContract.lastDeactivatedEmergencyStateTimestamp()).to.be.equal( + currentTimestampEmergency + ); + + await expect(newZkEVMContract.sequenceForceBatches([sequence])).to.be.revertedWithCustomError( + newZkEVMContract, + "HaltTimeoutNotExpiredAfterEmergencyState" + ); + + await snapshotEmergencyState.restore(); + + const l2txDataForceBatch = "0x123456"; + const maticAmountForced = await rollupManagerContract.getForcedBatchFee(); + const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); + + // Approve tokens + await expect(polTokenContract.approve(newZkEVMContract.target, maticAmountForced)).to.emit( + polTokenContract, + "Approval" + ); + + const lastForcedBatch = (await newZkEVMContract.lastForceBatch()) + 1n; + + // Force batch + await expect(newZkEVMContract.forceBatch(l2txDataForceBatch, maticAmountForced)) + .to.emit(newZkEVMContract, "ForceBatch") + .withArgs(lastForcedBatch, lastGlobalExitRoot, deployer.address, "0x"); + + const forcedBlock = await ethers.provider.getBlock("latest"); + const currentTimestamp2 = forcedBlock?.timestamp; + + const sequenceForced = { + transactions: l2txDataForceBatch, + forcedGlobalExitRoot: lastGlobalExitRoot, + forcedTimestamp: currentTimestamp2, + forcedBlockHashL1: forcedBlock?.parentHash, + } as BatchDataStructEtrog; + + const snapshot3 = await takeSnapshot(); + // Sequence Batches + await expect( + newZkEVMContract.connect(trustedSequencer).sequenceBatches([sequenceForced], trustedSequencer.address) + ).to.emit(newZkEVMContract, "SequenceBatches"); + + const expectedAccInputHash3 = calculateAccInputHashetrog( + expectedAccInputHash2, + ethers.keccak256(l2txDataForceBatch), + lastGlobalExitRoot, + currentTimestamp2, + trustedSequencer.address, + forcedBlock?.parentHash + ); + // calcualte accINputHash + expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash3); + + await snapshot3.restore(); + // sequence force batches + + const timestampForceBatch = (await ethers.provider.getBlock("latest"))?.timestamp as any; + // Increment timestamp + await ethers.provider.send("evm_setNextBlockTimestamp", [timestampForceBatch + FORCE_BATCH_TIMEOUT]); + + // sequence force batch + await expect(newZkEVMContract.sequenceForceBatches([sequenceForced])) + .to.emit(newZkEVMContract, "SequenceForceBatches") + .withArgs(3); + + // Check admin functions + await expect(newZkEVMContract.setTrustedSequencer(deployer.address)).to.be.revertedWithCustomError( + newZkEVMContract, + "OnlyAdmin" + ); + + await expect(newZkEVMContract.connect(admin).setTrustedSequencer(deployer.address)) + .to.emit(newZkEVMContract, "SetTrustedSequencer") + .withArgs(deployer.address); + + await expect(newZkEVMContract.setTrustedSequencerURL("0x1253")).to.be.revertedWithCustomError( + newZkEVMContract, + "OnlyAdmin" + ); + await expect(newZkEVMContract.connect(admin).setTrustedSequencerURL("0x1253")) + .to.emit(newZkEVMContract, "SetTrustedSequencerURL") + .withArgs("0x1253"); + + await expect(newZkEVMContract.setForceBatchTimeout(0)).to.be.revertedWithCustomError( + newZkEVMContract, + "OnlyAdmin" + ); + + await expect( + newZkEVMContract.connect(admin).setForceBatchTimeout(FORCE_BATCH_TIMEOUT) + ).to.be.revertedWithCustomError(newZkEVMContract, "InvalidRangeForceBatchTimeout"); + + await expect(newZkEVMContract.connect(admin).setForceBatchTimeout(0)) + .to.emit(newZkEVMContract, "SetForceBatchTimeout") + .withArgs(0); + + await expect(newZkEVMContract.transferAdminRole(deployer.address)).to.be.revertedWithCustomError( + newZkEVMContract, + "OnlyAdmin" + ); + + await expect(newZkEVMContract.connect(admin).transferAdminRole(deployer.address)) + .to.emit(newZkEVMContract, "TransferAdminRole") + .withArgs(deployer.address); + + await expect(newZkEVMContract.connect(admin).acceptAdminRole()).to.be.revertedWithCustomError( + newZkEVMContract, + "OnlyPendingAdmin" + ); + + await expect(newZkEVMContract.connect(deployer).acceptAdminRole()) + .to.emit(newZkEVMContract, "AcceptAdminRole") + .withArgs(deployer.address); }); it("should check full flow with gas Token etrog", async () => { @@ -2266,7 +1053,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { await snapshot.restore(); expect(expectedRollupType).to.be.deep.equal(await rollupManagerContract.rollupTypeMap(newRollupTypeID)); - // Create a // Only admin can create new zkEVMs await expect( @@ -2281,7 +1067,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { ) ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); - // UNexisting rollupType + // Unexisting rollupType await expect( rollupManagerContract .connect(admin) @@ -2323,7 +1109,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { nonce: 1, }); - const newZkEVMContract = PolygonZKEVMV2Factory.attach(newZKEVMAddress) as PolygonZkEVMVEtrog; + const newZkEVMContract = PolygonZKEVMV2Factory.attach(newZKEVMAddress) as PolygonZkEVMEtrog; const newSequencedBatch = 1; await expect( @@ -2441,7 +1227,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { // try verify batches const l2txData = "0x123456"; const maticAmount = await rollupManagerContract.getBatchFee(); - const currentTimestamp = (await ethers.provider.getBlock("latest"))?.timestamp; const sequence = { transactions: l2txData, @@ -2727,7 +1512,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { expect(await newWrappedToken.totalSupply()).to.be.equal(amount); }); - it("should check full flow upgrading rollup", async () => { + it("should check full flow upgrading rollup etrog", async () => { const urlSequencer = "http://zkevm-json-rpc:8123"; const chainID = 1000; const networkName = "zkevm"; @@ -2762,7 +1547,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { // In order to create a new rollup type, create an implementation of the contract // Create zkEVM implementation - const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMV2"); + const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMEtrog"); const PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy( polygonZkEVMGlobalExitRoot.target, polTokenContract.target, @@ -2901,7 +1686,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { nonce: 1, }); - const newZkEVMContract = PolygonZKEVMV2Factory.attach(newZKEVMAddress) as PolygonZkEVMV2; + const newZkEVMContract = PolygonZKEVMV2Factory.attach(newZKEVMAddress) as PolygonZkEVMEtrog; const newSequencedBatch = 1; await expect( @@ -2923,14 +1708,15 @@ describe("Polygon ZK-EVM TestnetV2", () => { .to.emit(rollupManagerContract, "OnSequenceBatches") .withArgs(newCreatedRollupID, newSequencedBatch); + const blockCreatedRollup = await ethers.provider.getBlock("latest"); + // Assert new rollup created - const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; + const timestampCreatedRollup = blockCreatedRollup?.timestamp; expect(await newZkEVMContract.admin()).to.be.equal(admin.address); expect(await newZkEVMContract.trustedSequencer()).to.be.equal(trustedSequencer.address); expect(await newZkEVMContract.trustedSequencerURL()).to.be.equal(urlSequencer); expect(await newZkEVMContract.networkName()).to.be.equal(networkName); expect(await newZkEVMContract.forceBatchTimeout()).to.be.equal(FORCE_BATCH_TIMEOUT); - expect(await newZkEVMContract.lastTimestamp()).to.be.equal(timestampCreatedRollup); // Cannot create 2 chains with the same chainID await expect( @@ -2979,13 +1765,15 @@ describe("Polygon ZK-EVM TestnetV2", () => { expect(tx.nonce).to.be.equal(0); expect(tx.chainId).to.be.equal(0); - const expectedAccInputHash = calculateAccInputHash( + const expectedAccInputHash = calculateAccInputHashetrog( ethers.ZeroHash, ethers.keccak256(transaction), await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), timestampCreatedRollup, - trustedSequencer.address + trustedSequencer.address, + blockCreatedRollup?.parentHash ); + // calcualte accINputHash expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash); @@ -3020,10 +1808,10 @@ describe("Polygon ZK-EVM TestnetV2", () => { const sequence = { transactions: l2txData, - globalExitRoot: ethers.ZeroHash, - timestamp: currentTimestamp, - minForcedTimestamp: 0, - } as BatchDataStruct; + forcedGlobalExitRoot: ethers.ZeroHash, + forcedTimestamp: 0, + forcedBlockHashL1: ethers.ZeroHash, + } as BatchDataStructEtrog; // Approve tokens await expect(polTokenContract.connect(trustedSequencer).approve(newZkEVMContract.target, maticAmount)).to.emit( @@ -3032,17 +1820,23 @@ describe("Polygon ZK-EVM TestnetV2", () => { ); // Sequence Batches - await expect(newZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address)) - .to.emit(newZkEVMContract, "SequenceBatches") - .withArgs(newSequencedBatch + 1); + await expect( + newZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address) + ).to.emit(newZkEVMContract, "SequenceBatches"); - const expectedAccInputHash2 = calculateAccInputHash( + const lastBlock = await ethers.provider.getBlock("latest"); + + const rootSC = await polygonZkEVMGlobalExitRoot.getRoot(); + + const expectedAccInputHash2 = calculateAccInputHashetrog( expectedAccInputHash, ethers.keccak256(l2txData), - ethers.ZeroHash, - currentTimestamp, - trustedSequencer.address + rootSC, + lastBlock?.timestamp, + trustedSequencer.address, + ethers.ZeroHash ); + // calcualte accINputHash expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash2); @@ -3373,7 +2167,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { // In order to create a new rollup type, create an implementation of the contract // Create zkEVM implementation - const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMV2Existent"); + const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMExistentEtrog"); const PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy( polygonZkEVMGlobalExitRoot.target, polTokenContract.target, @@ -3395,25 +2189,25 @@ describe("Polygon ZK-EVM TestnetV2", () => { trustedSequencer.address, urlSequencer, networkName, - initializeAccInputHash, // last acc input hash - intializeTimestmap // timestmap + initializeAccInputHash // last acc input hash ) ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "OnlyRollupManager"); await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); const RollupManagerMock = await ethers.getSigner(rollupManagerContract.target as any); - await PolygonZKEVMV2Contract.connect(RollupManagerMock).initializeUpgrade( - admin.address, - trustedSequencer.address, - urlSequencer, - networkName, - initializeAccInputHash, // last acc input hash - intializeTimestmap, // timestmap - { - gasPrice: 0, - } - ); + await expect( + PolygonZKEVMV2Contract.connect(RollupManagerMock).initializeUpgrade( + admin.address, + trustedSequencer.address, + urlSequencer, + networkName, + initializeAccInputHash, // last acc input hash + { + gasPrice: 0, + } + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "SenderMustBeRollup"); // Only admin can create new zkEVMs await expect( @@ -3455,15 +2249,38 @@ describe("Polygon ZK-EVM TestnetV2", () => { ) ).to.be.revertedWithCustomError(rollupManagerContract, "ChainIDAlreadyExist"); + // Initialize upgrade + await PolygonZKEVMV2Contract.connect(RollupManagerMock).initializeUpgrade( + admin.address, + trustedSequencer.address, + urlSequencer, + networkName, + initializeAccInputHash, // last acc input hash + { + gasPrice: 0, + } + ); + // Assert new rollup created - const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; + const lastBlock = await ethers.provider.getBlock("latest"); + const timestampCreatedRollup = lastBlock?.timestamp; expect(await PolygonZKEVMV2Contract.admin()).to.be.equal(admin.address); expect(await PolygonZKEVMV2Contract.trustedSequencer()).to.be.equal(trustedSequencer.address); expect(await PolygonZKEVMV2Contract.trustedSequencerURL()).to.be.equal(urlSequencer); expect(await PolygonZKEVMV2Contract.networkName()).to.be.equal(networkName); expect(await PolygonZKEVMV2Contract.forceBatchTimeout()).to.be.equal(FORCE_BATCH_TIMEOUT); - expect(await PolygonZKEVMV2Contract.lastTimestamp()).to.be.equal(intializeTimestmap); - expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(initializeAccInputHash); + + const txSetupEtrog = await PolygonZKEVMV2Contract.SET_UP_ETROG_TX(); + const expectedAccInputHashInitial = calculateAccInputHashetrog( + initializeAccInputHash, + ethers.keccak256(txSetupEtrog), + await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), + timestampCreatedRollup, + trustedSequencer.address, + lastBlock?.parentHash + ); + + expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHashInitial); // try verify batches const l2txData = "0x123456"; @@ -3472,10 +2289,10 @@ describe("Polygon ZK-EVM TestnetV2", () => { const sequence = { transactions: l2txData, - globalExitRoot: ethers.ZeroHash, - timestamp: currentTimestamp, - minForcedTimestamp: 0, - } as BatchDataStruct; + forcedGlobalExitRoot: ethers.ZeroHash, + forcedTimestamp: 0, + forcedBlockHashL1: ethers.ZeroHash, + } as BatchDataStructEtrog; // Approve tokens await expect( @@ -3485,16 +2302,18 @@ describe("Polygon ZK-EVM TestnetV2", () => { // Sequence Batches await expect( PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address) - ) - .to.emit(PolygonZKEVMV2Contract, "SequenceBatches") - .withArgs(1); + ).to.emit(PolygonZKEVMV2Contract, "SequenceBatches"); - const expectedAccInputHash2 = calculateAccInputHash( - initializeAccInputHash, + const rootSC = await polygonZkEVMGlobalExitRoot.getRoot(); + const currentTimestampSequenced = (await ethers.provider.getBlock("latest"))?.timestamp; + + const expectedAccInputHash2 = calculateAccInputHashetrog( + expectedAccInputHashInitial, ethers.keccak256(l2txData), - ethers.ZeroHash, - currentTimestamp, - trustedSequencer.address + rootSC, + currentTimestampSequenced, + trustedSequencer.address, + ethers.ZeroHash ); // calcualte accINputHash expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash2); @@ -3617,7 +2436,8 @@ describe("Polygon ZK-EVM TestnetV2", () => { const finalAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); - expect(finalAggregatorMatic).to.equal(initialAggregatorMatic + maticAmount); + //review + expect(finalAggregatorMatic).to.equal((initialAggregatorMatic + maticAmount) / 2n); // Assert global exit root expect(await polygonZkEVMGlobalExitRoot.lastRollupExitRoot()).to.be.equal(rootRollups); @@ -3739,7 +2559,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { // In order to create a new rollup type, create an implementation of the contract // Create zkEVM implementation - const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMV2"); + const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMEtrog"); const PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy( polygonZkEVMGlobalExitRoot.target, polTokenContract.target, diff --git a/test/contractsv2/PolygonRollupManagerUpgrade.test.ts b/test/contractsv2/PolygonRollupManagerUpgrade.test.ts index 1fbf599e8..84cceb640 100644 --- a/test/contractsv2/PolygonRollupManagerUpgrade.test.ts +++ b/test/contractsv2/PolygonRollupManagerUpgrade.test.ts @@ -5,20 +5,20 @@ import { VerifierRollupHelperMock, ERC20PermitMock, PolygonRollupManagerMock, - PolygonZkEVMGlobalExitRoot, + PolygonZkEVMGlobalExitRootV2, PolygonZkEVMBridgeV2, - PolygonZkEVMV2, - PolygonRollupBase, + PolygonZkEVMEtrog, + PolygonRollupBaseEtrog, TokenWrapped, Address, PolygonZkEVM, - PolygonZkEVMV2Existent, + PolygonZkEVMExistentEtrog, } from "../../typechain-types"; import {takeSnapshot, time} from "@nomicfoundation/hardhat-network-helpers"; import {processorUtils, contractUtils, MTBridge, mtBridgeUtils} from "@0xpolygonhermez/zkevm-commonjs"; const {calculateSnarkInput, calculateAccInputHash, calculateBatchHashData} = contractUtils; -type BatchDataStruct = PolygonRollupBase.BatchDataStruct; +type BatchDataStructEtrog = PolygonRollupBaseEtrog.BatchDataStruct; const MerkleTreeBridge = MTBridge; const {verifyMerkleProof, getLeafValue} = mtBridgeUtils; @@ -36,7 +36,10 @@ function computeGlobalIndex(indexLocal: any, indexRollup: any, isMainnet: Boolea } } -describe("Polygon ZK-EVM TestnetV2", () => { +const SIGNATURE_BYTES = 32 + 32 + 1; +const EFFECTIVE_PERCENTAGE_BYTES = 1; + +describe("Polygon Rollup manager upgraded", () => { let deployer: any; let timelock: any; let emergencyCouncil: any; @@ -49,7 +52,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { let verifierContract: VerifierRollupHelperMock; let polygonZkEVMBridgeContract: PolygonZkEVMBridgeV2; let polTokenContract: ERC20PermitMock; - let polygonZkEVMGlobalExitRoot: PolygonZkEVMGlobalExitRoot; + let polygonZkEVMGlobalExitRoot: PolygonZkEVMGlobalExitRootV2; let rollupManagerContract: PolygonRollupManagerMock; const polTokenName = "POL Token"; @@ -200,7 +203,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { await polTokenContract.transfer(trustedSequencer.address, ethers.parseEther("1000")); // DEploy new zkEVM - const PolygonZkEVMV2ExistentFactory = await ethers.getContractFactory("PolygonZkEVMV2Existent"); + const PolygonZkEVMV2ExistentFactory = await ethers.getContractFactory("PolygonZkEVMExistentEtrog"); const newPolygonZkEVMContract = (await upgrades.deployProxy(PolygonZkEVMV2ExistentFactory, [], { initializer: false, @@ -211,7 +214,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { rollupManagerContract.target, ], unsafeAllow: ["constructor", "state-variable-immutable"], - })) as any as PolygonZkEVMV2Existent; + })) as any as PolygonZkEVMExistentEtrog; //const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager"); const txRollupManager = await upgrades.upgradeProxy(polygonZkEVMContract.target, PolygonRollupManagerFactory, { @@ -274,7 +277,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { ); }); - it("should check full flow", async () => { + it("should check full flow etrog", async () => { const urlSequencer = "http://zkevm-json-rpc:8123"; const chainID2 = chainID + 1; const networkName = "zkevm"; @@ -289,7 +292,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { // In order to create a new rollup type, create an implementation of the contract // Create zkEVM implementation - const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMV2"); + const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMEtrog"); const PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy( polygonZkEVMGlobalExitRoot.target, polTokenContract.target, @@ -371,7 +374,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { await snapshot.restore(); expect(expectedRollupType).to.be.deep.equal(await rollupManagerContract.rollupTypeMap(newRollupTypeID)); - // Create a // Only admin can create new zkEVMs await expect( @@ -428,7 +430,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { nonce: 1, }); - const newZkEVMContract = PolygonZKEVMV2Factory.attach(newZKEVMAddress) as PolygonZkEVMV2; + const newZkEVMContract = PolygonZKEVMV2Factory.attach(newZKEVMAddress) as PolygonZkEVMEtrog; const newSequencedBatch = 1; await expect( @@ -450,6 +452,8 @@ describe("Polygon ZK-EVM TestnetV2", () => { .to.emit(rollupManagerContract, "OnSequenceBatches") .withArgs(newCreatedRollupID, newSequencedBatch); + const blockCreatedRollup = await ethers.provider.getBlock("latest"); + // Assert new rollup created const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; expect(await newZkEVMContract.admin()).to.be.equal(admin.address); @@ -457,7 +461,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { expect(await newZkEVMContract.trustedSequencerURL()).to.be.equal(urlSequencer); expect(await newZkEVMContract.networkName()).to.be.equal(networkName); expect(await newZkEVMContract.forceBatchTimeout()).to.be.equal(FORCE_BATCH_TIMEOUT); - expect(await newZkEVMContract.lastTimestamp()).to.be.equal(timestampCreatedRollup); // Cannot create 2 chains with the same chainID await expect( @@ -494,6 +497,10 @@ describe("Polygon ZK-EVM TestnetV2", () => { const rawTx = processorUtils.customRawTxToRawTx(transaction); const tx = ethers.Transaction.from(rawTx); + + const rlpSignData = transaction.slice(0, -(SIGNATURE_BYTES * 2 + EFFECTIVE_PERCENTAGE_BYTES * 2)); + expect(rlpSignData).to.be.equal(tx.unsignedSerialized); + expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); expect(tx.value).to.be.equal(0); expect(tx.data).to.be.equal(encodedData); @@ -502,13 +509,15 @@ describe("Polygon ZK-EVM TestnetV2", () => { expect(tx.nonce).to.be.equal(0); expect(tx.chainId).to.be.equal(0); - const expectedAccInputHash = calculateAccInputHash( + const expectedAccInputHash = calculateAccInputHashetrog( ethers.ZeroHash, ethers.keccak256(transaction), await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), timestampCreatedRollup, - trustedSequencer.address + trustedSequencer.address, + blockCreatedRollup?.parentHash ); + // calcualte accINputHash expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash); @@ -539,14 +548,13 @@ describe("Polygon ZK-EVM TestnetV2", () => { // try verify batches const l2txData = "0x123456"; const maticAmount = await rollupManagerContract.getBatchFee(); - const currentTimestamp = (await ethers.provider.getBlock("latest"))?.timestamp; const sequence = { transactions: l2txData, - globalExitRoot: ethers.ZeroHash, - timestamp: currentTimestamp, - minForcedTimestamp: 0, - } as BatchDataStruct; + forcedGlobalExitRoot: ethers.ZeroHash, + forcedTimestamp: 0, + forcedBlockHashL1: ethers.ZeroHash, + } as BatchDataStructEtrog; // Approve tokens await expect(polTokenContract.connect(trustedSequencer).approve(newZkEVMContract.target, maticAmount)).to.emit( @@ -555,16 +563,31 @@ describe("Polygon ZK-EVM TestnetV2", () => { ); // Sequence Batches - await expect(newZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address)) - .to.emit(newZkEVMContract, "SequenceBatches") - .withArgs(newSequencedBatch + 1); + await expect( + newZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address) + ).to.emit(newZkEVMContract, "SequenceBatches"); + + const lastBlock = await ethers.provider.getBlock("latest"); + const lastBlockHash = lastBlock?.parentHash; + const lastGlobalExitRootS = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); + + const height = 32; + const merkleTreeGLobalExitRoot = new MerkleTreeBridge(height); + const leafValueJs = calculateGlobalExitRootLeaf(lastGlobalExitRootS, lastBlockHash, lastBlock?.timestamp); + //merkleTreeGLobalExitRoot.add(leafValueJs); + + const rootSC = await polygonZkEVMGlobalExitRoot.getRoot(); + const rootJS = merkleTreeGLobalExitRoot.getRoot(); - const expectedAccInputHash2 = calculateAccInputHash( + expect(rootSC).to.be.equal(rootJS); + + const expectedAccInputHash2 = calculateAccInputHashetrog( expectedAccInputHash, ethers.keccak256(l2txData), - ethers.ZeroHash, - currentTimestamp, - trustedSequencer.address + rootSC, + lastBlock?.timestamp, + trustedSequencer.address, + ethers.ZeroHash ); // calcualte accINputHash expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash2); @@ -587,7 +610,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); // compute root merkle tree in Js - const height = 32; const merkleTreezkEVM = new MerkleTreeBridge(height); const leafValue = getLeafValue( LEAF_TYPE_ASSET, @@ -688,7 +710,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { const finalAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); - expect(finalAggregatorMatic).to.equal(initialAggregatorMatic + maticAmount); + expect(finalAggregatorMatic).to.equal(((initialAggregatorMatic + maticAmount) * 2n) / 3n); // Assert global exit root expect(await polygonZkEVMGlobalExitRoot.lastRollupExitRoot()).to.be.equal(rootRollups); @@ -699,20 +721,26 @@ describe("Polygon ZK-EVM TestnetV2", () => { ); const indexLeaf = 0; - const indexRollup = 1; const proofZkEVM = merkleTreezkEVM.getProofTreeByIndex(indexLeaf); - const proofRollups = merkleTreeRollups.getProofTreeByIndex(indexRollup); + + const indexLeafRollup = 1; + const proofRollups = merkleTreeRollups.getProofTreeByIndex(indexLeafRollup); // verify merkle proof expect(verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM)).to.be.equal(true); - expect(verifyMerkleProof(rootzkEVM, proofRollups, indexRollup, rootRollups)).to.be.equal(true); + expect(verifyMerkleProof(rootzkEVM, proofRollups, indexLeafRollup, rootRollups)).to.be.equal(true); expect( await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM) ).to.be.equal(true); expect( - await polygonZkEVMBridgeContract.verifyMerkleProof(newLocalExitRoot, proofRollups, indexRollup, rootRollups) + await polygonZkEVMBridgeContract.verifyMerkleProof( + newLocalExitRoot, + proofRollups, + indexLeafRollup, + rootRollups + ) ).to.be.equal(true); // claim @@ -740,12 +768,12 @@ describe("Polygon ZK-EVM TestnetV2", () => { ).to.be.equal(precalculateWrappedErc20); // index leaf is 0 bc, does not have mainnet flag, and it's rollup 0 on leaf 0 - const globalIndex = computeGlobalIndex(indexLeaf, indexRollup, false); + const claimIndex = computeGlobalIndex(indexLeaf, indexLeafRollup, false); await expect( polygonZkEVMBridgeContract.claimAsset( proofZkEVM, proofRollups, - globalIndex, + claimIndex, ethers.ZeroHash, rootRollups, originNetwork, @@ -757,7 +785,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { ) ) .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") - .withArgs(globalIndex, originNetwork, tokenAddress, destinationAddress, amount) + .withArgs(claimIndex, originNetwork, tokenAddress, destinationAddress, amount) .to.emit(polygonZkEVMBridgeContract, "NewWrappedToken") .withArgs(originNetwork, tokenAddress, precalculateWrappedErc20, metadata) .to.emit(newWrappedToken, "Transfer") @@ -787,7 +815,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { polygonZkEVMBridgeContract.claimAsset( proofZkEVM, proofRollups, - globalIndex, + claimIndex, ethers.ZeroHash, rootRollups, originNetwork, @@ -801,6 +829,158 @@ describe("Polygon ZK-EVM TestnetV2", () => { // Check new token expect(await newWrappedToken.totalSupply()).to.be.equal(amount); + + // Force batches + + // Check force batches are unactive + await expect(newZkEVMContract.forceBatch("0x", 0)).to.be.revertedWithCustomError( + newZkEVMContract, + "ForceBatchNotAllowed" + ); + await expect(newZkEVMContract.sequenceForceBatches([])).to.be.revertedWithCustomError( + newZkEVMContract, + "ForceBatchNotAllowed" + ); + + await expect(await newZkEVMContract.forceBatchAddress()).to.be.equal(admin.address); + await expect(newZkEVMContract.connect(admin).setForceBatchAddress(deployer.address)) + .to.emit(newZkEVMContract, "SetForceBatchAddress") + .withArgs(deployer.address); + expect(await newZkEVMContract.forceBatchAddress()).to.be.equal(deployer.address); + + await expect(newZkEVMContract.connect(admin).setForceBatchAddress(ethers.ZeroAddress)) + .to.emit(newZkEVMContract, "SetForceBatchAddress") + .withArgs(ethers.ZeroAddress); + + await expect( + newZkEVMContract.connect(admin).setForceBatchAddress(deployer.address) + ).to.be.revertedWithCustomError(newZkEVMContract, "ForceBatchesDecentralized"); + + //snapshot emergency + const snapshotEmergencyState = await takeSnapshot(); + await rollupManagerContract.connect(emergencyCouncil).activateEmergencyState(); + await expect(newZkEVMContract.forceBatch("0x", 0)).to.be.revertedWithCustomError( + newZkEVMContract, + "ForceBatchesNotAllowedOnEmergencyState" + ); + await rollupManagerContract.connect(admin).deactivateEmergencyState(); + const currentTimestampEmergency = (await ethers.provider.getBlock("latest"))?.timestamp; + + expect(await rollupManagerContract.lastDeactivatedEmergencyStateTimestamp()).to.be.equal( + currentTimestampEmergency + ); + + await expect(newZkEVMContract.sequenceForceBatches([sequence])).to.be.revertedWithCustomError( + newZkEVMContract, + "HaltTimeoutNotExpiredAfterEmergencyState" + ); + + await snapshotEmergencyState.restore(); + + const l2txDataForceBatch = "0x123456"; + const maticAmountForced = await rollupManagerContract.getForcedBatchFee(); + const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); + + // Approve tokens + await expect(polTokenContract.approve(newZkEVMContract.target, maticAmountForced)).to.emit( + polTokenContract, + "Approval" + ); + + const lastForcedBatch = (await newZkEVMContract.lastForceBatch()) + 1n; + + // Force batch + await expect(newZkEVMContract.forceBatch(l2txDataForceBatch, maticAmountForced)) + .to.emit(newZkEVMContract, "ForceBatch") + .withArgs(lastForcedBatch, lastGlobalExitRoot, deployer.address, "0x"); + + const forcedBlock = await ethers.provider.getBlock("latest"); + const currentTimestamp2 = forcedBlock?.timestamp; + + const sequenceForced = { + transactions: l2txDataForceBatch, + forcedGlobalExitRoot: lastGlobalExitRoot, + forcedTimestamp: currentTimestamp2, + forcedBlockHashL1: forcedBlock?.parentHash, + } as BatchDataStructEtrog; + + const snapshot3 = await takeSnapshot(); + // Sequence Batches + await expect( + newZkEVMContract.connect(trustedSequencer).sequenceBatches([sequenceForced], trustedSequencer.address) + ).to.emit(newZkEVMContract, "SequenceBatches"); + + const expectedAccInputHash3 = calculateAccInputHashetrog( + expectedAccInputHash2, + ethers.keccak256(l2txDataForceBatch), + lastGlobalExitRoot, + currentTimestamp2, + trustedSequencer.address, + forcedBlock?.parentHash + ); + // calcualte accINputHash + expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash3); + + await snapshot3.restore(); + // sequence force batches + + const timestampForceBatch = (await ethers.provider.getBlock("latest"))?.timestamp as any; + // Increment timestamp + await ethers.provider.send("evm_setNextBlockTimestamp", [timestampForceBatch + FORCE_BATCH_TIMEOUT]); + + // sequence force batch + await expect(newZkEVMContract.sequenceForceBatches([sequenceForced])) + .to.emit(newZkEVMContract, "SequenceForceBatches") + .withArgs(3); + + // Check admin functions + await expect(newZkEVMContract.setTrustedSequencer(deployer.address)).to.be.revertedWithCustomError( + newZkEVMContract, + "OnlyAdmin" + ); + + await expect(newZkEVMContract.connect(admin).setTrustedSequencer(deployer.address)) + .to.emit(newZkEVMContract, "SetTrustedSequencer") + .withArgs(deployer.address); + + await expect(newZkEVMContract.setTrustedSequencerURL("0x1253")).to.be.revertedWithCustomError( + newZkEVMContract, + "OnlyAdmin" + ); + await expect(newZkEVMContract.connect(admin).setTrustedSequencerURL("0x1253")) + .to.emit(newZkEVMContract, "SetTrustedSequencerURL") + .withArgs("0x1253"); + + await expect(newZkEVMContract.setForceBatchTimeout(0)).to.be.revertedWithCustomError( + newZkEVMContract, + "OnlyAdmin" + ); + + await expect( + newZkEVMContract.connect(admin).setForceBatchTimeout(FORCE_BATCH_TIMEOUT) + ).to.be.revertedWithCustomError(newZkEVMContract, "InvalidRangeForceBatchTimeout"); + + await expect(newZkEVMContract.connect(admin).setForceBatchTimeout(0)) + .to.emit(newZkEVMContract, "SetForceBatchTimeout") + .withArgs(0); + + await expect(newZkEVMContract.transferAdminRole(deployer.address)).to.be.revertedWithCustomError( + newZkEVMContract, + "OnlyAdmin" + ); + + await expect(newZkEVMContract.connect(admin).transferAdminRole(deployer.address)) + .to.emit(newZkEVMContract, "TransferAdminRole") + .withArgs(deployer.address); + + await expect(newZkEVMContract.connect(admin).acceptAdminRole()).to.be.revertedWithCustomError( + newZkEVMContract, + "OnlyPendingAdmin" + ); + + await expect(newZkEVMContract.connect(deployer).acceptAdminRole()) + .to.emit(newZkEVMContract, "AcceptAdminRole") + .withArgs(deployer.address); }); it("should check full flow no trusted aggreagtor", async () => { @@ -818,7 +998,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { // In order to create a new rollup type, create an implementation of the contract // Create zkEVM implementation - const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMV2"); + const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMEtrog"); const PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy( polygonZkEVMGlobalExitRoot.target, polTokenContract.target, @@ -957,7 +1137,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { nonce: 1, }); - const newZkEVMContract = PolygonZKEVMV2Factory.attach(newZKEVMAddress) as PolygonZkEVMV2; + const newZkEVMContract = PolygonZKEVMV2Factory.attach(newZKEVMAddress) as PolygonZkEVMEtrog; const newSequencedBatch = 1; await expect( @@ -979,14 +1159,15 @@ describe("Polygon ZK-EVM TestnetV2", () => { .to.emit(rollupManagerContract, "OnSequenceBatches") .withArgs(newCreatedRollupID, newSequencedBatch); + const blockCreatedRollup = await ethers.provider.getBlock("latest"); + // Assert new rollup created - const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; + const timestampCreatedRollup = blockCreatedRollup?.timestamp; expect(await newZkEVMContract.admin()).to.be.equal(admin.address); expect(await newZkEVMContract.trustedSequencer()).to.be.equal(trustedSequencer.address); expect(await newZkEVMContract.trustedSequencerURL()).to.be.equal(urlSequencer); expect(await newZkEVMContract.networkName()).to.be.equal(networkName); expect(await newZkEVMContract.forceBatchTimeout()).to.be.equal(FORCE_BATCH_TIMEOUT); - expect(await newZkEVMContract.lastTimestamp()).to.be.equal(timestampCreatedRollup); // Cannot create 2 chains with the same chainID2 await expect( @@ -1023,6 +1204,9 @@ describe("Polygon ZK-EVM TestnetV2", () => { const rawTx = processorUtils.customRawTxToRawTx(transaction); const tx = ethers.Transaction.from(rawTx); + const rlpSignData = transaction.slice(0, -(SIGNATURE_BYTES * 2 + EFFECTIVE_PERCENTAGE_BYTES * 2)); + expect(rlpSignData).to.be.equal(tx.unsignedSerialized); + expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); expect(tx.value).to.be.equal(0); expect(tx.data).to.be.equal(encodedData); @@ -1031,12 +1215,13 @@ describe("Polygon ZK-EVM TestnetV2", () => { expect(tx.nonce).to.be.equal(0); expect(tx.chainId).to.be.equal(0); - const expectedAccInputHash = calculateAccInputHash( + const expectedAccInputHash = calculateAccInputHashetrog( ethers.ZeroHash, ethers.keccak256(transaction), await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), timestampCreatedRollup, - trustedSequencer.address + trustedSequencer.address, + blockCreatedRollup?.parentHash ); // calcualte accINputHash expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash); @@ -1072,10 +1257,10 @@ describe("Polygon ZK-EVM TestnetV2", () => { const sequence = { transactions: l2txData, - globalExitRoot: ethers.ZeroHash, - timestamp: currentTimestamp, - minForcedTimestamp: 0, - } as BatchDataStruct; + forcedGlobalExitRoot: ethers.ZeroHash, + forcedTimestamp: 0, + forcedBlockHashL1: ethers.ZeroHash, + } as BatchDataStructEtrog; // Approve tokens await expect(polTokenContract.connect(trustedSequencer).approve(newZkEVMContract.target, maticAmount)).to.emit( @@ -1084,16 +1269,29 @@ describe("Polygon ZK-EVM TestnetV2", () => { ); // Sequence Batches - await expect(newZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address)) - .to.emit(newZkEVMContract, "SequenceBatches") - .withArgs(newSequencedBatch + 1); + await expect( + newZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address) + ).to.emit(newZkEVMContract, "SequenceBatches"); - const expectedAccInputHash2 = calculateAccInputHash( + const lastBlock = await ethers.provider.getBlock("latest"); + const lastBlockHash = lastBlock?.parentHash; + const lastGlobalExitRootS = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); + const height = 32; + + const merkleTreeGLobalExitRoot = new MerkleTreeBridge(height); + + const rootSC = await polygonZkEVMGlobalExitRoot.getRoot(); + const rootJS = merkleTreeGLobalExitRoot.getRoot(); + + expect(rootSC).to.be.equal(rootJS); + + const expectedAccInputHash2 = calculateAccInputHashetrog( expectedAccInputHash, ethers.keccak256(l2txData), - ethers.ZeroHash, - currentTimestamp, - trustedSequencer.address + rootSC, + lastBlock?.timestamp, + trustedSequencer.address, + ethers.ZeroHash ); // calcualte accINputHash expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash2); @@ -1116,7 +1314,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); // compute root merkle tree in Js - const height = 32; const merkleTreezkEVM = new MerkleTreeBridge(height); const leafValue = getLeafValue( LEAF_TYPE_ASSET, @@ -1198,7 +1395,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { .withArgs(newCreatedRollupID, newVerifiedBatch, newStateRoot, newLocalExitRoot, deployer.address); const finalAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); - expect(finalAggregatorMatic).to.equal(initialAggregatorMatic + maticAmount); + expect(finalAggregatorMatic).to.equal(((initialAggregatorMatic + maticAmount) * 2n) / 3n); const pendingStateNum = 1; await expect( @@ -1331,7 +1528,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { // In order to create a new rollup type, create an implementation of the contract // Create zkEVM implementation - const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMV2"); + const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMEtrog"); const PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy( polygonZkEVMGlobalExitRoot.target, polTokenContract.target, @@ -1431,3 +1628,35 @@ describe("Polygon ZK-EVM TestnetV2", () => { } }); }); + +/** + * Compute accumulateInputHash = Keccak256(oldAccInputHash, batchHashData, globalExitRoot, timestamp, seqAddress) + * @param {String} oldAccInputHash - old accumulateInputHash + * @param {String} batchHashData - Batch hash data + * @param {String} globalExitRoot - Global Exit Root + * @param {Number} timestamp - Block timestamp + * @param {String} sequencerAddress - Sequencer address + * @returns {String} - accumulateInputHash in hex encoding + */ +function calculateAccInputHashetrog( + oldAccInputHash: any, + batchHashData: any, + globalExitRoot: any, + timestamp: any, + sequencerAddress: any, + forcedBlockHash: any +) { + const hashKeccak = ethers.solidityPackedKeccak256( + ["bytes32", "bytes32", "bytes32", "uint64", "address", "bytes32"], + [oldAccInputHash, batchHashData, globalExitRoot, timestamp, sequencerAddress, forcedBlockHash] + ); + + return hashKeccak; +} + +function calculateGlobalExitRootLeaf(newGlobalExitRoot: any, lastBlockHash: any, timestamp: any) { + return ethers.solidityPackedKeccak256( + ["bytes32", "bytes32", "uint64"], + [newGlobalExitRoot, lastBlockHash, timestamp] + ); +} diff --git a/test/contractsv2/PolygonZkEVMV2.test.ts b/test/contractsv2/PolygonZkEVMV2.test.ts index 49ef1d6c3..db5556480 100644 --- a/test/contractsv2/PolygonZkEVMV2.test.ts +++ b/test/contractsv2/PolygonZkEVMV2.test.ts @@ -29,7 +29,7 @@ function calculateGlobalExitRoot(mainnetExitRoot: any, rollupExitRoot: any) { return ethers.solidityPackedKeccak256(["bytes32", "bytes32"], [mainnetExitRoot, rollupExitRoot]); } -describe("Polygon ZK-EVM TestnetV2", () => { +describe("PolygonZkEVMEtrog", () => { let deployer: any; let timelock: any; let emergencyCouncil: any; @@ -164,7 +164,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { // deploy consensus // Create zkEVM implementation - const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMV2"); + const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMEtrog"); PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy( polygonZkEVMGlobalExitRoot.target, polTokenContract.target, @@ -208,7 +208,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { expect(await PolygonZKEVMV2Contract.trustedSequencerURL()).to.be.equal(urlSequencer); expect(await PolygonZKEVMV2Contract.networkName()).to.be.equal(networkName); expect(await PolygonZKEVMV2Contract.forceBatchTimeout()).to.be.equal(FORCE_BATCH_TIMEOUT); - expect(await PolygonZKEVMV2Contract.lastTimestamp()).to.be.equal(timestampCreatedRollup); }); it("should check admin functions", async () => { @@ -333,6 +332,7 @@ describe("Polygon ZK-EVM TestnetV2", () => { ethers.ZeroAddress, "0x", // empty metadata ]); + const blockCreatedRollup = await ethers.provider.getBlock("latest"); const rawTx = processorUtils.customRawTxToRawTx(transaction); const tx = ethers.Transaction.from(rawTx); @@ -348,27 +348,28 @@ describe("Polygon ZK-EVM TestnetV2", () => { expect(tx.nonce).to.be.equal(0); expect(tx.chainId).to.be.equal(0); - const expectedAccInputHash = calculateAccInputHash( + const expectedAccInputHash = calculateAccInputHashetrog( ethers.ZeroHash, ethers.keccak256(transaction), await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), timestampCreatedRollup, - trustedSequencer.address + trustedSequencer.address, + blockCreatedRollup?.parentHash ); + // calcualte accINputHash expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash); // try verify batches const l2txData = "0x123456"; - const maticAmount = ethers.parseEther("1"); - const currentTimestamp = (await ethers.provider.getBlock("latest"))?.timestamp; + const maticAmount = await rollupManagerContract.getBatchFee(); const sequence = { transactions: l2txData, - globalExitRoot: ethers.ZeroHash, - timestamp: currentTimestamp, - minForcedTimestamp: 0, - } as BatchDataStruct; + forcedGlobalExitRoot: ethers.ZeroHash, + forcedTimestamp: 0, + forcedBlockHashL1: ethers.ZeroHash, + } as BatchDataStructEtrog; // Approve tokens await expect( @@ -378,17 +379,19 @@ describe("Polygon ZK-EVM TestnetV2", () => { // Sequence Batches await expect( PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address) - ) - .to.emit(PolygonZKEVMV2Contract, "SequenceBatches") - .withArgs(1); + ).to.emit(PolygonZKEVMV2Contract, "SequenceBatches"); - const expectedAccInputHash2 = calculateAccInputHash( + const currentTimestampSequenced = (await ethers.provider.getBlock("latest"))?.timestamp; + + const expectedAccInputHash2 = calculateAccInputHashetrog( expectedAccInputHash, ethers.keccak256(l2txData), - ethers.ZeroHash, - currentTimestamp, - trustedSequencer.address + await polygonZkEVMGlobalExitRoot.getRoot(), + currentTimestampSequenced, + trustedSequencer.address, + ethers.ZeroHash ); + // calcualte accINputHash expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash2); }); @@ -437,7 +440,6 @@ describe("Polygon ZK-EVM TestnetV2", () => { const rootRollups = merkleTreeRollups.getRoot(); // Assert global exit root - // TODO await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); const rolllupManagerSigner = await ethers.getSigner(rollupManagerContract.target as any); await polygonZkEVMGlobalExitRoot.connect(rolllupManagerSigner).updateExitRoot(rootRollups, {gasPrice: 0}); @@ -565,6 +567,8 @@ describe("Polygon ZK-EVM TestnetV2", () => { metadata, // empty metadata ]); + const blockCreatedRollup = await ethers.provider.getBlock("latest"); + const rawTx = processorUtils.customRawTxToRawTx(transaction); const tx = ethers.Transaction.from(rawTx); @@ -579,12 +583,13 @@ describe("Polygon ZK-EVM TestnetV2", () => { expect(tx.nonce).to.be.equal(0); expect(tx.chainId).to.be.equal(0); - const expectedAccInputHash = calculateAccInputHash( + const expectedAccInputHash = calculateAccInputHashetrog( ethers.ZeroHash, ethers.keccak256(transaction), await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), timestampCreatedRollup, - trustedSequencer.address + trustedSequencer.address, + blockCreatedRollup?.parentHash ); // calcualte accINputHash @@ -629,6 +634,8 @@ describe("Polygon ZK-EVM TestnetV2", () => { "0x", // empty metadata ]); + const blockCreatedRollup = await ethers.provider.getBlock("latest"); + const rawTx = processorUtils.customRawTxToRawTx(transaction); const tx = ethers.Transaction.from(rawTx); @@ -643,13 +650,15 @@ describe("Polygon ZK-EVM TestnetV2", () => { expect(tx.nonce).to.be.equal(0); expect(tx.chainId).to.be.equal(0); - const expectedAccInputHash = calculateAccInputHash( + const expectedAccInputHash = calculateAccInputHashetrog( ethers.ZeroHash, ethers.keccak256(transaction), await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), timestampCreatedRollup, - trustedSequencer.address + trustedSequencer.address, + blockCreatedRollup?.parentHash ); + // calcualte accINputHash expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash); @@ -696,3 +705,28 @@ describe("Polygon ZK-EVM TestnetV2", () => { ); }); }); + +/** + * Compute accumulateInputHash = Keccak256(oldAccInputHash, batchHashData, globalExitRoot, timestamp, seqAddress) + * @param {String} oldAccInputHash - old accumulateInputHash + * @param {String} batchHashData - Batch hash data + * @param {String} globalExitRoot - Global Exit Root + * @param {Number} timestamp - Block timestamp + * @param {String} sequencerAddress - Sequencer address + * @returns {String} - accumulateInputHash in hex encoding + */ +function calculateAccInputHashetrog( + oldAccInputHash: any, + batchHashData: any, + globalExitRoot: any, + timestamp: any, + sequencerAddress: any, + forcedBlockHash: any +) { + const hashKeccak = ethers.solidityPackedKeccak256( + ["bytes32", "bytes32", "bytes32", "uint64", "address", "bytes32"], + [oldAccInputHash, batchHashData, globalExitRoot, timestamp, sequencerAddress, forcedBlockHash] + ); + + return hashKeccak; +} From dab0ea47389135bd89b1e7921e85d8bf586e18f4 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 17 Jan 2024 12:55:09 +0100 Subject: [PATCH 150/230] update paris contracts --- compiled-contracts/PolygonZkEVMV2.json | 1008 -------------- .../PolygonZkEVMV2Existent.json | 1046 -------------- .../PolygonZkEVMV2ExistentEtrog.json | 1231 ----------------- .../paris/PolygonRollupManager.json | 6 +- .../paris/PolygonRollupManagerMock.json | 6 +- .../PolygonRollupManagerMockInternalTest.json | 6 +- .../paris/PolygonZkEVMBridgeV2.json | 4 +- .../paris/PolygonZkEVMEtrog.json | 19 +- .../paris/PolygonZkEVMExistentEtrog.json | 1213 ++++++++++++++++ compiled-contracts/paris/PolygonZkEVMV2.json | 1144 --------------- .../paris/PolygonZkEVMV2Existent.json | 1182 ---------------- .../paris/PolygonZkEVMV2ExistentEtrog.json | 1231 ----------------- 12 files changed, 1227 insertions(+), 6869 deletions(-) delete mode 100644 compiled-contracts/PolygonZkEVMV2.json delete mode 100644 compiled-contracts/PolygonZkEVMV2Existent.json delete mode 100644 compiled-contracts/PolygonZkEVMV2ExistentEtrog.json create mode 100644 compiled-contracts/paris/PolygonZkEVMExistentEtrog.json delete mode 100644 compiled-contracts/paris/PolygonZkEVMV2.json delete mode 100644 compiled-contracts/paris/PolygonZkEVMV2Existent.json delete mode 100644 compiled-contracts/paris/PolygonZkEVMV2ExistentEtrog.json diff --git a/compiled-contracts/PolygonZkEVMV2.json b/compiled-contracts/PolygonZkEVMV2.json deleted file mode 100644 index e82c6c44a..000000000 --- a/compiled-contracts/PolygonZkEVMV2.json +++ /dev/null @@ -1,1008 +0,0 @@ -{ - "_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 deleted file mode 100644 index 5459198ed..000000000 --- a/compiled-contracts/PolygonZkEVMV2Existent.json +++ /dev/null @@ -1,1046 +0,0 @@ -{ - "_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/PolygonZkEVMV2ExistentEtrog.json b/compiled-contracts/PolygonZkEVMV2ExistentEtrog.json deleted file mode 100644 index b47865ec4..000000000 --- a/compiled-contracts/PolygonZkEVMV2ExistentEtrog.json +++ /dev/null @@ -1,1231 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "PolygonZkEVMV2ExistentEtrog", - "sourceName": "contracts/v2/consensus/zkEVM/PolygonZkEVMV2ExistentEtrog.sol", - "abi": [ - { - "inputs": [ - { - "internalType": "contract IPolygonZkEVMGlobalExitRootV2", - "name": "_globalExitRootManager", - "type": "address" - }, - { - "internalType": "contract IERC20Upgradeable", - "name": "_pol", - "type": "address" - }, - { - "internalType": "contract IPolygonZkEVMBridgeV2", - "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": "ForceBatchesDescentralized", - "type": "error" - }, - { - "inputs": [], - "name": "ForceBatchesNotAllowedOnEmergencyState", - "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": "HaltTimeoutNotExpiredAfterEmergencyState", - "type": "error" - }, - { - "inputs": [], - "name": "HugeTokenMetadataNotSupported", - "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": [ - { - "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": "bytes", - "name": "transactions", - "type": "bytes" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "lastGlobalExitRoot", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "address", - "name": "sequencer", - "type": "address" - } - ], - "name": "InitialSequenceBatches", - "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" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "l1InfoRoot", - "type": "bytes32" - } - ], - "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": "address", - "name": "newForceBatchAddress", - "type": "address" - } - ], - "name": "SetForceBatchAddress", - "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": false, - "internalType": "bytes", - "name": "transactions", - "type": "bytes" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "lastGlobalExitRoot", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "address", - "name": "sequencer", - "type": "address" - } - ], - "name": "UpdateEtrogSequence", - "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": "GLOBAL_EXIT_ROOT_MANAGER_L2", - "outputs": [ - { - "internalType": "contract IBasePolygonZkEVMGlobalExitRoot", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INITIALIZE_TX_BRIDGE_LIST_LEN_LEN", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INITIALIZE_TX_BRIDGE_PARAMS", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS_EMPTY_METADATA", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INITIALIZE_TX_CONSTANT_BYTES", - "outputs": [ - { - "internalType": "uint16", - "name": "", - "type": "uint16" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INITIALIZE_TX_CONSTANT_BYTES_EMPTY_METADATA", - "outputs": [ - { - "internalType": "uint16", - "name": "", - "type": "uint16" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INITIALIZE_TX_DATA_LEN_EMPTY_METADATA", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INITIALIZE_TX_EFFECTIVE_PERCENTAGE", - "outputs": [ - { - "internalType": "bytes1", - "name": "", - "type": "bytes1" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "SET_UP_ETROG_TX", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "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": "admin", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "bridgeAddress", - "outputs": [ - { - "internalType": "contract IPolygonZkEVMBridgeV2", - "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": "forceBatchAddress", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "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": "gapLastTimestamp", - "outputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], - "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" - }, - { - "internalType": "bytes", - "name": "_gasTokenMetadata", - "type": "bytes" - } - ], - "name": "generateInitializeTransaction", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "globalExitRootManager", - "outputs": [ - { - "internalType": "contract IPolygonZkEVMGlobalExitRootV2", - "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": "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": "", - "type": "uint64" - } - ], - "name": "initializeUpgrade", - "outputs": [], - "stateMutability": "nonpayable", - "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": "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": "forcedGlobalExitRoot", - "type": "bytes32" - }, - { - "internalType": "uint64", - "name": "forcedTimestamp", - "type": "uint64" - }, - { - "internalType": "bytes32", - "name": "forcedBlockHashL1", - "type": "bytes32" - } - ], - "internalType": "struct PolygonRollupBaseEtrog.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": "forcedGlobalExitRoot", - "type": "bytes32" - }, - { - "internalType": "uint64", - "name": "forcedTimestamp", - "type": "uint64" - }, - { - "internalType": "bytes32", - "name": "forcedBlockHashL1", - "type": "bytes32" - } - ], - "internalType": "struct PolygonRollupBaseEtrog.BatchData[]", - "name": "batches", - "type": "tuple[]" - } - ], - "name": "sequenceForceBatches", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newForceBatchAddress", - "type": "address" - } - ], - "name": "setForceBatchAddress", - "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": "0x6101006040523480156200001257600080fd5b5060405162004fa538038062004fa5833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e051614dd5620001d06000396000818161052d015281816109de01528181610b4b01528181610d9e0152818161130b015281816117b101528181611c2301528181611d21015281816122bd0152818161260c0152818161294d01528181612a15015281816133820152818161340301528181613425015261353d01526000818161068701528181610ff801528181611ef101528181611ff90152612ea80152600081816107660152818161117f0152818161248001528181612b600152612f2a0152600081816107980152818161087601528181611c6c01528181612b3401526134d30152614dd56000f3fe608060405234801561001057600080fd5b50600436106102fe5760003560e01c80637a5460c51161019c578063c754c7ed116100ee578063e46761c411610097578063ecef3f9911610071578063ecef3f99146107ed578063f35dda4714610800578063f851a4401461080857600080fd5b8063e46761c414610793578063e7a7ed02146107ba578063eaeb077b146107da57600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610741578063d02103ca14610761578063d7bc90ff1461078857600080fd5b8063c754c7ed146106f6578063c7fffd4b14610726578063c89e42df1461072e57600080fd5b8063a3c573eb11610150578063af7f3e021161012a578063af7f3e02146106cf578063b0afe154146106d7578063bb590708146106e357600080fd5b8063a3c573eb14610682578063a652f26c146106a9578063ada8f919146106bc57600080fd5b806391cafe321161018157806391cafe32146106415780639e001877146106545780639f26f8401461066f57600080fd5b80637a5460c5146105fd5780638c3d73011461063957600080fd5b806340b5de6c11610255578063542028d5116102095780636e05d2cd116101e35780636e05d2cd146105ce5780636ff512cc146105d757806371257022146105ea57600080fd5b8063542028d51461059e578063676870d2146105a65780636b8616ce146105ae57600080fd5b806349b7b8021161023a57806349b7b802146105285780634e4877061461054f57806352bdeb6d1461056257600080fd5b806340b5de6c146104a8578063456052671461050057600080fd5b806326782247116102b757806332c2d1531161029157806332c2d153146104365780633c351e101461044b5780633cbc795b1461046b57600080fd5b806326782247146103a45780632a9f208f146103e95780632c111c061461041657600080fd5b806305835f37116102e857806305835f3714610339578063107bf28c1461038257806311e892d41461038a57600080fd5b8062d0295d14610303578063035089631461031e575b600080fd5b61030b61082e565b6040519081526020015b60405180910390f35b610326602081565b60405161ffff9091168152602001610315565b6103756040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516103159190613f1a565b61037561094e565b61039260f981565b60405160ff9091168152602001610315565b6001546103c49073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610315565b6007546103fd9067ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610315565b6008546103c49073ffffffffffffffffffffffffffffffffffffffff1681565b610449610444366004613f6f565b6109dc565b005b6009546103c49073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104939074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610315565b6104cf7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff000000000000000000000000000000000000000000000000000000000000009091168152602001610315565b6007546103fd90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b61044961055d366004613fb1565b610aab565b6103756040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610375610cc5565b610326601f81565b61030b6105bc366004613fb1565b60066020526000908152604090205481565b61030b60055481565b6104496105e5366004613fce565b610cd2565b6104496105f8366004614117565b610d9c565b6103756040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610449611548565b61044961064f366004613fce565b61161b565b6103c473a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b61044961067d366004614210565b611734565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b6103756106b7366004614252565b611df0565b6104496106ca366004613fce565b6121d5565b61037561229f565b61030b6405ca1ab1e081565b6104496106f13660046142c7565b6122bb565b6007546103fd907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61039260e481565b61044961073c36600461436d565b612842565b6002546103c49073ffffffffffffffffffffffffffffffffffffffff1681565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b61030b635ca1ab1e81565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b6007546103fd9068010000000000000000900467ffffffffffffffff1681565b6104496107e83660046143a2565b6128d5565b6104496107fb36600461441a565b612ddd565b610392601b81565b6000546103c49062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156108bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e19190614466565b6007549091506000906109209067ffffffffffffffff7001000000000000000000000000000000008204811691680100000000000000009004166144ae565b67ffffffffffffffff1690508060000361093d5760009250505090565b61094781836144d6565b9250505090565b6004805461095b90614511565b80601f016020809104026020016040519081016040528092919081815260200182805461098790614511565b80156109d45780601f106109a9576101008083540402835291602001916109d4565b820191906000526020600020905b8154815290600101906020018083116109b757829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a4b576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a9e91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610b02576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b49576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd89190614564565b610c415760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c41576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461095b90614511565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610d29576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610cba565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610e0b576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610e2b5750600054600160ff909116105b80610e455750303b158015610e45575060005460ff166001145b610ed6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610f3457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff85161561112057610f5b85613612565b610f6486613722565b610f6d87613829565b604051602001610f7f93929190614586565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611040573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106491906145bf565b915091508163ffffffff166000146110dc576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff84161717905561111d565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b60095460009061116890889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685611df0565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120c9190614466565b90506000808483858f6112206001436145f9565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611369573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138d919061460c565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550886003908161141f9190614677565b50600461142c8982614677565b508c600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e6040516114cd93929190614791565b60405180910390a1505050505050801561153f57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611599576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611672576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff166116c1576040517fd40d91c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610cba565b60085473ffffffffffffffffffffffffffffffffffffffff1615801590611773575060085473ffffffffffffffffffffffffffffffffffffffff163314155b156117aa576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561181a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183e919061460c565b61184891906147d0565b67ffffffffffffffff16111561188a576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036118c6576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611902576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff68010000000000000000820481169161193d9184917001000000000000000000000000000000009004166147f1565b1115611975576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015611c1d5760008686838181106119ba576119ba614804565b90506020028101906119cc9190614833565b6119d590614871565b9050836119e1816148fa565b825180516020918201208185015160408087015160608801519151959a50929550600094611a4e948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114611ad7576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055611afc6001886145f9565b8403611b6b5742600760189054906101000a900467ffffffffffffffff168460400151611b2991906147d0565b67ffffffffffffffff161115611b6b576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc016040516020818303038152906040528051906020012094505050508080611c1590614921565b91505061199e565b50611c937f000000000000000000000000000000000000000000000000000000000000000084611c4b61082e565b611c559190614959565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016919061391c565b60058190556007805467ffffffffffffffff8416700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff9091161790556040517f9a908e7300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611d6d908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af1158015611d8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db0919061460c565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa600087604051602401611e2496959493929190614970565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff7000000000000000000000000000000000000000000000000000000001790528351909150606090600003611f755760f9601f8351611eb991906149d3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611f5f97969594939291906149ee565b6040516020818303038152906040529050612079565b815161ffff1015611fb2576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611fc16020836149d3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016120669796959493929190614ad1565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156120da573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612152576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906121989084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614bb4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461222c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610cba565b6040518060a0016040528060628152602001614d3e6062913981565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461232a576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff161580801561234a5750600054600160ff909116105b806123645750303b158015612364575060005460ff166001145b6123f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610ecd565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561244e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60006040518060a0016040528060628152602001614d3e606291399050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250d9190614466565b90506000878483858e6125216001436145f9565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af115801561266a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268e919061460c565b50600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8f81169190910291909117909155600280547fffffffffffffffffffffffff000000000000000000000000000000000000000016918d1691909117905560036127178b82614677565b5060046127248a82614677565b50600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8e161790556007805477ffffffffffffffffffffffffffffffffffffffffffffffff167a0697800000000000000000000000000000000000000000000000001790556040517f2bf779968f2cd549d28a94deec97630ab04362cb219c64664de7d2e21f3ccf46906127d690879085908f90614791565b60405180910390a15050505050801561153f57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611536565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612899576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036128a58282614677565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610cba9190613f1a565b60085473ffffffffffffffffffffffffffffffffffffffff1615801590612914575060085473ffffffffffffffffffffffffffffffffffffffff163314155b1561294b576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129da9190614564565b15612a11576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aa29190614466565b905081811115612ade576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612b1a576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b5c73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846139f5565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bed9190614466565b600780549192506801000000000000000090910467ffffffffffffffff16906008612c17836148fa565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612c4e929190614c10565b6040519081900390208142612c646001436145f9565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612d77576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612dd6565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612dcd9493929190614c20565b60405180910390a25b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612e2e576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003612e6a576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612ea6576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612f0e57600080fd5b505af1158015612f22573d6000803e3d6000fd5b5050505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fb79190614466565b600754600554919250429170010000000000000000000000000000000090910467ffffffffffffffff16908160005b868110156132e85760008a8a8381811061300257613002614804565b90506020028101906130149190614833565b61301d90614871565b8051805160209091012060408201519192509067ffffffffffffffff16156132025785613049816148fa565b9650506000818360200151846040015185606001516040516020016130ac9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114613135576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209550600660008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060009055506132d3565b8151516201d4c01015613241576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201526000609c82015260bc016040516020818303038152906040528051906020012094505b505080806132e090614921565b915050612fe6565b5060075467ffffffffffffffff680100000000000000009091048116908416111561333f576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff848116908316146133fd57600061336583866144ae565b905061337b67ffffffffffffffff8216836145f9565b91506133b47f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611c4b61082e565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6134fb337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa15801561348e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134b29190614466565b6134bc9190614959565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906139f5565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af115801561359b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135bf919061460c565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e766886040516135fd91815260200190565b60405180910390a25050505050505050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916136949190614c91565b600060405180830381855afa9150503d80600081146136cf576040519150601f19603f3d011682016040523d82523d6000602084013e6136d4565b606091505b509150915081613719576040518060400160405280600781526020017f4e4f5f4e414d45000000000000000000000000000000000000000000000000008152506121cd565b6121cd81613a59565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916137a49190614c91565b600060405180830381855afa9150503d80600081146137df576040519150601f19603f3d011682016040523d82523d6000602084013e6137e4565b606091505b509150915081613719576040518060400160405280600981526020017f4e4f5f53594d424f4c00000000000000000000000000000000000000000000008152506121cd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8616916138aa9190614c91565b600060405180830381855afa9150503d80600081146138e5576040519150601f19603f3d011682016040523d82523d6000602084013e6138ea565b606091505b50915091508180156138fd575080516020145b6139085760126121cd565b808060200190518101906121cd9190614ca3565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526139f09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613c2f565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052613a539085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161396e565b50505050565b60606040825110613a7e5781806020019051810190613a789190614cc6565b92915050565b8151602003613bf65760005b602081108015613ad15750828181518110613aa757613aa7614804565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613ae85780613ae081614921565b915050613a8a565b80600003613b2b57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115613b4657613b46613ffd565b6040519080825280601f01601f191660200182016040528015613b70576020820181803683370190505b50905060005b82811015613bee57848181518110613b9057613b90614804565b602001015160f81c60f81b828281518110613bad57613bad614804565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080613be681614921565b915050613b76565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b6000613c91826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613d3b9092919063ffffffff16565b8051909150156139f05780806020019051810190613caf9190614564565b6139f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610ecd565b60606121cd8484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051613d6f9190614c91565b60006040518083038185875af1925050503d8060008114613dac576040519150601f19603f3d011682016040523d82523d6000602084013e613db1565b606091505b5091509150613dc287838387613dcd565b979650505050505050565b60608315613e63578251600003613e5c5773ffffffffffffffffffffffffffffffffffffffff85163b613e5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ecd565b50816121cd565b6121cd8383815115613e785781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecd9190613f1a565b60005b83811015613ec7578181015183820152602001613eaf565b50506000910152565b60008151808452613ee8816020860160208601613eac565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613f2d6020830184613ed0565b9392505050565b67ffffffffffffffff81168114613f4a57600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613f4a57600080fd5b600080600060608486031215613f8457600080fd5b8335613f8f81613f34565b9250602084013591506040840135613fa681613f4d565b809150509250925092565b600060208284031215613fc357600080fd5b8135613f2d81613f34565b600060208284031215613fe057600080fd5b8135613f2d81613f4d565b63ffffffff81168114613f4a57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561407357614073613ffd565b604052919050565b600067ffffffffffffffff82111561409557614095613ffd565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126140d257600080fd5b81356140e56140e08261407b565b61402c565b8181528460208386010111156140fa57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561413057600080fd5b863561413b81613f4d565b9550602087013561414b81613f4d565b9450604087013561415b81613feb565b9350606087013561416b81613f4d565b9250608087013567ffffffffffffffff8082111561418857600080fd5b6141948a838b016140c1565b935060a08901359150808211156141aa57600080fd5b506141b789828a016140c1565b9150509295509295509295565b60008083601f8401126141d657600080fd5b50813567ffffffffffffffff8111156141ee57600080fd5b6020830191508360208260051b850101111561420957600080fd5b9250929050565b6000806020838503121561422357600080fd5b823567ffffffffffffffff81111561423a57600080fd5b614246858286016141c4565b90969095509350505050565b6000806000806080858703121561426857600080fd5b843561427381613feb565b9350602085013561428381613f4d565b9250604085013561429381613feb565b9150606085013567ffffffffffffffff8111156142af57600080fd5b6142bb878288016140c1565b91505092959194509250565b60008060008060008060c087890312156142e057600080fd5b86356142eb81613f4d565b955060208701356142fb81613f4d565b9450604087013567ffffffffffffffff8082111561431857600080fd5b6143248a838b016140c1565b9550606089013591508082111561433a57600080fd5b5061434789828a016140c1565b9350506080870135915060a087013561435f81613f34565b809150509295509295509295565b60006020828403121561437f57600080fd5b813567ffffffffffffffff81111561439657600080fd5b6121cd848285016140c1565b6000806000604084860312156143b757600080fd5b833567ffffffffffffffff808211156143cf57600080fd5b818601915086601f8301126143e357600080fd5b8135818111156143f257600080fd5b87602082850101111561440457600080fd5b6020928301989097509590910135949350505050565b60008060006040848603121561442f57600080fd5b833567ffffffffffffffff81111561444657600080fd5b614452868287016141c4565b9094509250506020840135613fa681613f4d565b60006020828403121561447857600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8281168282160390808211156144cf576144cf61447f565b5092915050565b60008261450c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061452557607f821691505b60208210810361455e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561457657600080fd5b81518015158114613f2d57600080fd5b6060815260006145996060830186613ed0565b82810360208401526145ab8186613ed0565b91505060ff83166040830152949350505050565b600080604083850312156145d257600080fd5b82516145dd81613feb565b60208401519092506145ee81613f4d565b809150509250929050565b81810381811115613a7857613a7861447f565b60006020828403121561461e57600080fd5b8151613f2d81613f34565b601f8211156139f057600081815260208120601f850160051c810160208610156146505750805b601f850160051c820191505b8181101561466f5782815560010161465c565b505050505050565b815167ffffffffffffffff81111561469157614691613ffd565b6146a58161469f8454614511565b84614629565b602080601f8311600181146146f857600084156146c25750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561466f565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561474557888601518255948401946001909101908401614726565b508582101561478157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006147a46060830186613ed0565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff8181168382160190808211156144cf576144cf61447f565b80820180821115613a7857613a7861447f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261486757600080fd5b9190910192915050565b60006080823603121561488357600080fd5b6040516080810167ffffffffffffffff82821081831117156148a7576148a7613ffd565b8160405284359150808211156148bc57600080fd5b506148c9368286016140c1565b8252506020830135602082015260408301356148e481613f34565b6040820152606092830135928101929092525090565b600067ffffffffffffffff8083168181036149175761491761447f565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149525761495261447f565b5060010190565b8082028115828204841417613a7857613a7861447f565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a08301526149c760c0830184613ed0565b98975050505050505050565b61ffff8181168382160190808211156144cf576144cf61447f565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614a57816003860160208c01613eac565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614a9a816017840160208b01613eac565b808201915050818660f81b16601782015284519150614ac0826018830160208801613eac565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614b3a816003860160208c01613eac565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614b7d816017840160208b01613eac565b808201915050818660f01b16601782015284519150614ba3826019830160208801613eac565b016019019998505050505050505050565b60008651614bc6818460208b01613eac565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b60008251614867818460208701613eac565b600060208284031215614cb557600080fd5b815160ff81168114613f2d57600080fd5b600060208284031215614cd857600080fd5b815167ffffffffffffffff811115614cef57600080fd5b8201601f81018413614d0057600080fd5b8051614d0e6140e08261407b565b818152856020838501011115614d2357600080fd5b614d34826020830160208601613eac565b9594505050505056fedf2a8080944d5cf5032b2a844602278b01199ed191a86c93ff8080821092808000000000000000000000000000000000000000000000000000000005ca1ab1e000000000000000000000000000000000000000000000000000000005ca1ab1e01bffa2646970667358221220f3abedebef61d2850c2c18454404c17f364dfad30fc638ff6034cdfa1d7b3ffc64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102fe5760003560e01c80637a5460c51161019c578063c754c7ed116100ee578063e46761c411610097578063ecef3f9911610071578063ecef3f99146107ed578063f35dda4714610800578063f851a4401461080857600080fd5b8063e46761c414610793578063e7a7ed02146107ba578063eaeb077b146107da57600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610741578063d02103ca14610761578063d7bc90ff1461078857600080fd5b8063c754c7ed146106f6578063c7fffd4b14610726578063c89e42df1461072e57600080fd5b8063a3c573eb11610150578063af7f3e021161012a578063af7f3e02146106cf578063b0afe154146106d7578063bb590708146106e357600080fd5b8063a3c573eb14610682578063a652f26c146106a9578063ada8f919146106bc57600080fd5b806391cafe321161018157806391cafe32146106415780639e001877146106545780639f26f8401461066f57600080fd5b80637a5460c5146105fd5780638c3d73011461063957600080fd5b806340b5de6c11610255578063542028d5116102095780636e05d2cd116101e35780636e05d2cd146105ce5780636ff512cc146105d757806371257022146105ea57600080fd5b8063542028d51461059e578063676870d2146105a65780636b8616ce146105ae57600080fd5b806349b7b8021161023a57806349b7b802146105285780634e4877061461054f57806352bdeb6d1461056257600080fd5b806340b5de6c146104a8578063456052671461050057600080fd5b806326782247116102b757806332c2d1531161029157806332c2d153146104365780633c351e101461044b5780633cbc795b1461046b57600080fd5b806326782247146103a45780632a9f208f146103e95780632c111c061461041657600080fd5b806305835f37116102e857806305835f3714610339578063107bf28c1461038257806311e892d41461038a57600080fd5b8062d0295d14610303578063035089631461031e575b600080fd5b61030b61082e565b6040519081526020015b60405180910390f35b610326602081565b60405161ffff9091168152602001610315565b6103756040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516103159190613f1a565b61037561094e565b61039260f981565b60405160ff9091168152602001610315565b6001546103c49073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610315565b6007546103fd9067ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610315565b6008546103c49073ffffffffffffffffffffffffffffffffffffffff1681565b610449610444366004613f6f565b6109dc565b005b6009546103c49073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104939074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610315565b6104cf7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff000000000000000000000000000000000000000000000000000000000000009091168152602001610315565b6007546103fd90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b61044961055d366004613fb1565b610aab565b6103756040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610375610cc5565b610326601f81565b61030b6105bc366004613fb1565b60066020526000908152604090205481565b61030b60055481565b6104496105e5366004613fce565b610cd2565b6104496105f8366004614117565b610d9c565b6103756040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610449611548565b61044961064f366004613fce565b61161b565b6103c473a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b61044961067d366004614210565b611734565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b6103756106b7366004614252565b611df0565b6104496106ca366004613fce565b6121d5565b61037561229f565b61030b6405ca1ab1e081565b6104496106f13660046142c7565b6122bb565b6007546103fd907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61039260e481565b61044961073c36600461436d565b612842565b6002546103c49073ffffffffffffffffffffffffffffffffffffffff1681565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b61030b635ca1ab1e81565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b6007546103fd9068010000000000000000900467ffffffffffffffff1681565b6104496107e83660046143a2565b6128d5565b6104496107fb36600461441a565b612ddd565b610392601b81565b6000546103c49062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156108bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e19190614466565b6007549091506000906109209067ffffffffffffffff7001000000000000000000000000000000008204811691680100000000000000009004166144ae565b67ffffffffffffffff1690508060000361093d5760009250505090565b61094781836144d6565b9250505090565b6004805461095b90614511565b80601f016020809104026020016040519081016040528092919081815260200182805461098790614511565b80156109d45780601f106109a9576101008083540402835291602001916109d4565b820191906000526020600020905b8154815290600101906020018083116109b757829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a4b576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a9e91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610b02576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b49576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd89190614564565b610c415760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c41576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461095b90614511565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610d29576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610cba565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610e0b576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610e2b5750600054600160ff909116105b80610e455750303b158015610e45575060005460ff166001145b610ed6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610f3457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff85161561112057610f5b85613612565b610f6486613722565b610f6d87613829565b604051602001610f7f93929190614586565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611040573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106491906145bf565b915091508163ffffffff166000146110dc576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff84161717905561111d565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b60095460009061116890889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685611df0565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120c9190614466565b90506000808483858f6112206001436145f9565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611369573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138d919061460c565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550886003908161141f9190614677565b50600461142c8982614677565b508c600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e6040516114cd93929190614791565b60405180910390a1505050505050801561153f57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611599576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611672576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff166116c1576040517fd40d91c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610cba565b60085473ffffffffffffffffffffffffffffffffffffffff1615801590611773575060085473ffffffffffffffffffffffffffffffffffffffff163314155b156117aa576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561181a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183e919061460c565b61184891906147d0565b67ffffffffffffffff16111561188a576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036118c6576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611902576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff68010000000000000000820481169161193d9184917001000000000000000000000000000000009004166147f1565b1115611975576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015611c1d5760008686838181106119ba576119ba614804565b90506020028101906119cc9190614833565b6119d590614871565b9050836119e1816148fa565b825180516020918201208185015160408087015160608801519151959a50929550600094611a4e948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114611ad7576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055611afc6001886145f9565b8403611b6b5742600760189054906101000a900467ffffffffffffffff168460400151611b2991906147d0565b67ffffffffffffffff161115611b6b576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc016040516020818303038152906040528051906020012094505050508080611c1590614921565b91505061199e565b50611c937f000000000000000000000000000000000000000000000000000000000000000084611c4b61082e565b611c559190614959565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016919061391c565b60058190556007805467ffffffffffffffff8416700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff9091161790556040517f9a908e7300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611d6d908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af1158015611d8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db0919061460c565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa600087604051602401611e2496959493929190614970565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff7000000000000000000000000000000000000000000000000000000001790528351909150606090600003611f755760f9601f8351611eb991906149d3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611f5f97969594939291906149ee565b6040516020818303038152906040529050612079565b815161ffff1015611fb2576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611fc16020836149d3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016120669796959493929190614ad1565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156120da573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612152576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906121989084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614bb4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461222c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610cba565b6040518060a0016040528060628152602001614d3e6062913981565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461232a576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff161580801561234a5750600054600160ff909116105b806123645750303b158015612364575060005460ff166001145b6123f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610ecd565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561244e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60006040518060a0016040528060628152602001614d3e606291399050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250d9190614466565b90506000878483858e6125216001436145f9565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af115801561266a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268e919061460c565b50600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8f81169190910291909117909155600280547fffffffffffffffffffffffff000000000000000000000000000000000000000016918d1691909117905560036127178b82614677565b5060046127248a82614677565b50600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8e161790556007805477ffffffffffffffffffffffffffffffffffffffffffffffff167a0697800000000000000000000000000000000000000000000000001790556040517f2bf779968f2cd549d28a94deec97630ab04362cb219c64664de7d2e21f3ccf46906127d690879085908f90614791565b60405180910390a15050505050801561153f57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611536565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612899576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036128a58282614677565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610cba9190613f1a565b60085473ffffffffffffffffffffffffffffffffffffffff1615801590612914575060085473ffffffffffffffffffffffffffffffffffffffff163314155b1561294b576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129da9190614564565b15612a11576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aa29190614466565b905081811115612ade576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612b1a576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b5c73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846139f5565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bed9190614466565b600780549192506801000000000000000090910467ffffffffffffffff16906008612c17836148fa565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612c4e929190614c10565b6040519081900390208142612c646001436145f9565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612d77576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612dd6565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612dcd9493929190614c20565b60405180910390a25b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612e2e576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003612e6a576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612ea6576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612f0e57600080fd5b505af1158015612f22573d6000803e3d6000fd5b5050505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fb79190614466565b600754600554919250429170010000000000000000000000000000000090910467ffffffffffffffff16908160005b868110156132e85760008a8a8381811061300257613002614804565b90506020028101906130149190614833565b61301d90614871565b8051805160209091012060408201519192509067ffffffffffffffff16156132025785613049816148fa565b9650506000818360200151846040015185606001516040516020016130ac9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114613135576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209550600660008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060009055506132d3565b8151516201d4c01015613241576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201526000609c82015260bc016040516020818303038152906040528051906020012094505b505080806132e090614921565b915050612fe6565b5060075467ffffffffffffffff680100000000000000009091048116908416111561333f576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff848116908316146133fd57600061336583866144ae565b905061337b67ffffffffffffffff8216836145f9565b91506133b47f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611c4b61082e565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6134fb337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa15801561348e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134b29190614466565b6134bc9190614959565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906139f5565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af115801561359b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135bf919061460c565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e766886040516135fd91815260200190565b60405180910390a25050505050505050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916136949190614c91565b600060405180830381855afa9150503d80600081146136cf576040519150601f19603f3d011682016040523d82523d6000602084013e6136d4565b606091505b509150915081613719576040518060400160405280600781526020017f4e4f5f4e414d45000000000000000000000000000000000000000000000000008152506121cd565b6121cd81613a59565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916137a49190614c91565b600060405180830381855afa9150503d80600081146137df576040519150601f19603f3d011682016040523d82523d6000602084013e6137e4565b606091505b509150915081613719576040518060400160405280600981526020017f4e4f5f53594d424f4c00000000000000000000000000000000000000000000008152506121cd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8616916138aa9190614c91565b600060405180830381855afa9150503d80600081146138e5576040519150601f19603f3d011682016040523d82523d6000602084013e6138ea565b606091505b50915091508180156138fd575080516020145b6139085760126121cd565b808060200190518101906121cd9190614ca3565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526139f09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613c2f565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052613a539085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161396e565b50505050565b60606040825110613a7e5781806020019051810190613a789190614cc6565b92915050565b8151602003613bf65760005b602081108015613ad15750828181518110613aa757613aa7614804565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613ae85780613ae081614921565b915050613a8a565b80600003613b2b57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115613b4657613b46613ffd565b6040519080825280601f01601f191660200182016040528015613b70576020820181803683370190505b50905060005b82811015613bee57848181518110613b9057613b90614804565b602001015160f81c60f81b828281518110613bad57613bad614804565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080613be681614921565b915050613b76565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b6000613c91826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613d3b9092919063ffffffff16565b8051909150156139f05780806020019051810190613caf9190614564565b6139f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610ecd565b60606121cd8484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051613d6f9190614c91565b60006040518083038185875af1925050503d8060008114613dac576040519150601f19603f3d011682016040523d82523d6000602084013e613db1565b606091505b5091509150613dc287838387613dcd565b979650505050505050565b60608315613e63578251600003613e5c5773ffffffffffffffffffffffffffffffffffffffff85163b613e5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ecd565b50816121cd565b6121cd8383815115613e785781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecd9190613f1a565b60005b83811015613ec7578181015183820152602001613eaf565b50506000910152565b60008151808452613ee8816020860160208601613eac565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613f2d6020830184613ed0565b9392505050565b67ffffffffffffffff81168114613f4a57600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613f4a57600080fd5b600080600060608486031215613f8457600080fd5b8335613f8f81613f34565b9250602084013591506040840135613fa681613f4d565b809150509250925092565b600060208284031215613fc357600080fd5b8135613f2d81613f34565b600060208284031215613fe057600080fd5b8135613f2d81613f4d565b63ffffffff81168114613f4a57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561407357614073613ffd565b604052919050565b600067ffffffffffffffff82111561409557614095613ffd565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126140d257600080fd5b81356140e56140e08261407b565b61402c565b8181528460208386010111156140fa57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561413057600080fd5b863561413b81613f4d565b9550602087013561414b81613f4d565b9450604087013561415b81613feb565b9350606087013561416b81613f4d565b9250608087013567ffffffffffffffff8082111561418857600080fd5b6141948a838b016140c1565b935060a08901359150808211156141aa57600080fd5b506141b789828a016140c1565b9150509295509295509295565b60008083601f8401126141d657600080fd5b50813567ffffffffffffffff8111156141ee57600080fd5b6020830191508360208260051b850101111561420957600080fd5b9250929050565b6000806020838503121561422357600080fd5b823567ffffffffffffffff81111561423a57600080fd5b614246858286016141c4565b90969095509350505050565b6000806000806080858703121561426857600080fd5b843561427381613feb565b9350602085013561428381613f4d565b9250604085013561429381613feb565b9150606085013567ffffffffffffffff8111156142af57600080fd5b6142bb878288016140c1565b91505092959194509250565b60008060008060008060c087890312156142e057600080fd5b86356142eb81613f4d565b955060208701356142fb81613f4d565b9450604087013567ffffffffffffffff8082111561431857600080fd5b6143248a838b016140c1565b9550606089013591508082111561433a57600080fd5b5061434789828a016140c1565b9350506080870135915060a087013561435f81613f34565b809150509295509295509295565b60006020828403121561437f57600080fd5b813567ffffffffffffffff81111561439657600080fd5b6121cd848285016140c1565b6000806000604084860312156143b757600080fd5b833567ffffffffffffffff808211156143cf57600080fd5b818601915086601f8301126143e357600080fd5b8135818111156143f257600080fd5b87602082850101111561440457600080fd5b6020928301989097509590910135949350505050565b60008060006040848603121561442f57600080fd5b833567ffffffffffffffff81111561444657600080fd5b614452868287016141c4565b9094509250506020840135613fa681613f4d565b60006020828403121561447857600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8281168282160390808211156144cf576144cf61447f565b5092915050565b60008261450c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061452557607f821691505b60208210810361455e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561457657600080fd5b81518015158114613f2d57600080fd5b6060815260006145996060830186613ed0565b82810360208401526145ab8186613ed0565b91505060ff83166040830152949350505050565b600080604083850312156145d257600080fd5b82516145dd81613feb565b60208401519092506145ee81613f4d565b809150509250929050565b81810381811115613a7857613a7861447f565b60006020828403121561461e57600080fd5b8151613f2d81613f34565b601f8211156139f057600081815260208120601f850160051c810160208610156146505750805b601f850160051c820191505b8181101561466f5782815560010161465c565b505050505050565b815167ffffffffffffffff81111561469157614691613ffd565b6146a58161469f8454614511565b84614629565b602080601f8311600181146146f857600084156146c25750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561466f565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561474557888601518255948401946001909101908401614726565b508582101561478157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006147a46060830186613ed0565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff8181168382160190808211156144cf576144cf61447f565b80820180821115613a7857613a7861447f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261486757600080fd5b9190910192915050565b60006080823603121561488357600080fd5b6040516080810167ffffffffffffffff82821081831117156148a7576148a7613ffd565b8160405284359150808211156148bc57600080fd5b506148c9368286016140c1565b8252506020830135602082015260408301356148e481613f34565b6040820152606092830135928101929092525090565b600067ffffffffffffffff8083168181036149175761491761447f565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149525761495261447f565b5060010190565b8082028115828204841417613a7857613a7861447f565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a08301526149c760c0830184613ed0565b98975050505050505050565b61ffff8181168382160190808211156144cf576144cf61447f565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614a57816003860160208c01613eac565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614a9a816017840160208b01613eac565b808201915050818660f81b16601782015284519150614ac0826018830160208801613eac565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614b3a816003860160208c01613eac565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614b7d816017840160208b01613eac565b808201915050818660f01b16601782015284519150614ba3826019830160208801613eac565b016019019998505050505050505050565b60008651614bc6818460208b01613eac565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b60008251614867818460208701613eac565b600060208284031215614cb557600080fd5b815160ff81168114613f2d57600080fd5b600060208284031215614cd857600080fd5b815167ffffffffffffffff811115614cef57600080fd5b8201601f81018413614d0057600080fd5b8051614d0e6140e08261407b565b818152856020838501011115614d2357600080fd5b614d34826020830160208601613eac565b9594505050505056fedf2a8080944d5cf5032b2a844602278b01199ed191a86c93ff8080821092808000000000000000000000000000000000000000000000000000000005ca1ab1e000000000000000000000000000000000000000000000000000000005ca1ab1e01bffa2646970667358221220f3abedebef61d2850c2c18454404c17f364dfad30fc638ff6034cdfa1d7b3ffc64736f6c63430008140033", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/compiled-contracts/paris/PolygonRollupManager.json b/compiled-contracts/paris/PolygonRollupManager.json index b237b40c7..07ab3b7d3 100644 --- a/compiled-contracts/paris/PolygonRollupManager.json +++ b/compiled-contracts/paris/PolygonRollupManager.json @@ -1269,7 +1269,7 @@ "type": "address" }, { - "internalType": "contract PolygonZkEVMV2Existent", + "internalType": "contract PolygonZkEVMExistentEtrog", "name": "polygonZkEVM", "type": "address" }, @@ -1965,8 +1965,8 @@ "type": "function" } ], - "bytecode": "0x60e06040523480156200001157600080fd5b5060405162005f3638038062005f3683398101604081905262000034916200013b565b6001600160a01b0380841660805282811660c052811660a0526200005762000060565b5050506200018f565b600054610100900460ff1615620000cd5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000120576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013857600080fd5b50565b6000806000606084860312156200015157600080fd5b83516200015e8162000122565b6020850151909350620001718162000122565b6040850151909250620001848162000122565b809150509250925092565b60805160a05160c051615d3f620001f760003960008181610a2f0152818161218b0152613ade0152600081816107e701528181612d3f0152613dd9015260008181610989015281816111e60152818161139601528181611ecf0152613cc80152615d3f6000f3fe60806040523480156200001157600080fd5b5060043610620003155760003560e01c8063841b24d711620001a9578063c1acbc3411620000f7578063dbc16976116200009e578063dbc1697614620009ed578063dde0ff7714620009f7578063e0bfd3d21462000a12578063e46761c41462000a29578063f34eb8eb1462000a51578063f4e926751462000a68578063f9c4c2ae1462000a7957600080fd5b8063c1acbc341462000928578063c4c928c21462000943578063ceee281d146200095a578063d02103ca1462000983578063d5073f6f14620009ab578063d547741f14620009c2578063d939b31514620009d957600080fd5b80639c9f3dfe116200015c5780639c9f3dfe14620007a0578063a066215c14620007b7578063a217fddf14620007ce578063a2967d9914620007d7578063a3c573eb14620007e1578063afd23cbe1462000822578063b99d0ad7146200084c57600080fd5b8063841b24d7146200071f57806387c20c01146200073a5780638bd4f071146200075157806391d14854146200076857806399f5634e146200077f5780639a908e73146200078957600080fd5b806325280169116200026757806355a71ee0116200021a57806355a71ee014620005a55780636046916914620005e957806365c0504d14620005f35780637222020f14620006a2578063727885e914620006b95780637975fcfe14620006d05780637fb6e76a14620006f657600080fd5b806325280169146200048e5780632f2ff15d146200054357806330c27dde146200055a57806336568abe146200056e578063394218e91462000585578063477fa270146200059c57600080fd5b80631489ed1011620002cc5780631489ed1014620003d557806315064c9614620003ec5780631608859c14620003fa5780631796a1ae14620004115780631816b7e514620004385780632072f6c5146200044f578063248a9ca3146200045957600080fd5b80630645af09146200031a578063066ec0121462000333578063080b311114620003645780630a0d9fbe146200038c57806311f6b28714620003a757806312b86e1914620003be575b600080fd5b620003316200032b36600462004795565b62000b90565b005b60845462000347906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b6200037b6200037536600462004885565b620010f0565b60405190151581526020016200035b565b6085546200034790600160401b90046001600160401b031681565b62000347620003b8366004620048bd565b6200111a565b62000331620003cf366004620048ee565b6200113a565b62000331620003e636600462004985565b620012ea565b606f546200037b9060ff1681565b620003316200040b36600462004885565b62001480565b607e54620004229063ffffffff1681565b60405163ffffffff90911681526020016200035b565b620003316200044936600462004a0f565b62001515565b62000331620015c1565b6200047f6200046a36600462004a3c565b60009081526034602052604090206001015490565b6040519081526020016200035b565b6200050f6200049f36600462004885565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b039081169183019190915292820151909216908201526060016200035b565b620003316200055436600462004a56565b62001687565b60875462000347906001600160401b031681565b620003316200057f36600462004a56565b620016b0565b620003316200059636600462004a89565b620016ea565b6086546200047f565b6200047f620005b636600462004885565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b6200047f6200179e565b6200065862000604366004620048bd565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c0016200035b565b62000331620006b3366004620048bd565b620017b6565b62000331620006ca36600462004b51565b620018b2565b620006e7620006e136600462004c1e565b62001d2b565b6040516200035b919062004cd8565b620004226200070736600462004a89565b60836020526000908152604090205463ffffffff1681565b6084546200034790600160c01b90046001600160401b031681565b620003316200074b36600462004985565b62001d5e565b6200033162000762366004620048ee565b62002088565b6200037b6200077936600462004a56565b6200213e565b6200047f62002169565b620003476200079a36600462004ced565b62002250565b62000331620007b136600462004a89565b62002422565b62000331620007c836600462004a89565b620024c8565b6200047f600081565b6200047f6200256c565b620008097f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016200035b565b6085546200083890600160801b900461ffff1681565b60405161ffff90911681526020016200035b565b620008e26200085d36600462004885565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b6040516200035b919060006080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200034790600160801b90046001600160401b031681565b620003316200095436600462004d1a565b62002941565b620004226200096b36600462004db2565b60826020526000908152604090205463ffffffff1681565b620008097f000000000000000000000000000000000000000000000000000000000000000081565b62000331620009bc36600462004a3c565b62002c20565b62000331620009d336600462004a56565b62002cbc565b60855462000347906001600160401b031681565b6200033162002ce5565b6084546200034790600160401b90046001600160401b031681565b6200033162000a2336600462004de4565b62002db5565b620008097f000000000000000000000000000000000000000000000000000000000000000081565b6200033162000a6236600462004e60565b62002e8e565b608054620004229063ffffffff1681565b62000b1062000a8a366004620048bd565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff16610160820152610180016200035b565b600054600290610100900460ff1615801562000bb3575060005460ff8083169116105b62000c1c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c9d6200308a565b62000cb860008051602062005cea8339815191528c620030f7565b62000cc5600088620030f7565b62000cf17fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59088620030f7565b62000d1d7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e88620030f7565b62000d497f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac88620030f7565b62000d757fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd89620030f7565b62000da17fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd0889620030f7565b62000dcd7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f489620030f7565b62000de860008051602062005caa83398151915289620030f7565b62000e2360008051602062005cea8339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062003103565b62000e4f7f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f089620030f7565b62000e7b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb89620030f7565b62000eb660008051602062005cca8339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162003103565b62000ed160008051602062005cca83398151915287620030f7565b62000efd7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595187620030f7565b6073546074546001600160401b03600160401b9092048216911680821462000f3857604051632e4cc54360e11b815260040160405180910390fd5b600062000f60888888886000607460009054906101000a90046001600160401b03166200314e565b6001600160401b03838116600081815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068b018054909216909417938802939093179092556007880180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81529596506001600160a01b038e81169663bb59070896620010639694831695600160581b90950490921693607693607793909291169060040162004fa3565b600060405180830381600087803b1580156200107e57600080fd5b505af115801562001093573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620010db9050565b60405180910390a15050505050505050505050565b63ffffffff821660009081526081602052604081206200111190836200337c565b90505b92915050565b63ffffffff811660009081526081602052604081206200111490620033c1565b60008051602062005cea833981519152620011558162003432565b63ffffffff891660009081526081602052604090206200117c818a8a8a8a8a8a8a6200343e565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b90041615620011e4576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200121d6200256c565b6040518263ffffffff1660e01b81526004016200123c91815260200190565b600060405180830381600087803b1580156200125757600080fd5b505af11580156200126c573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005cea833981519152620013058162003432565b63ffffffff891660009081526081602052604090206200132c818a8a8a8a8a8a8a620037d7565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562001394576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620013cd6200256c565b6040518263ffffffff1660e01b8152600401620013ec91815260200190565b600060405180830381600087803b1580156200140757600080fd5b505af11580156200141c573d6000803e3d6000fd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff82166000908152608160205260409020620014b060008051602062005cea833981519152336200213e565b6200150457606f5460ff1615620014da57604051630bc011ff60e21b815260040160405180910390fd5b620014e681836200337c565b6200150457604051630674f25160e11b815260040160405180910390fd5b62001510818362003be5565b505050565b60008051602062005caa833981519152620015308162003432565b6103e88261ffff1610806200154a57506103ff8261ffff16115b156200156957604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620015dc60008051602062005cca833981519152336200213e565b6200167b57608454600160801b90046001600160401b031615806200162c57506084544290620016219062093a8090600160801b90046001600160401b03166200501e565b6001600160401b0316115b806200165c57506087544290620016519062093a80906001600160401b03166200501e565b6001600160401b0316115b156200167b5760405163692baaad60e11b815260040160405180910390fd5b6200168562003dd7565b565b600082815260346020526040902060010154620016a48162003432565b62001510838362003e56565b6001600160a01b0381163314620016da57604051630b4ad1cd60e31b815260040160405180910390fd5b620016e6828262003ec2565b5050565b60008051602062005caa833981519152620017058162003432565b606f5460ff1662001747576084546001600160401b03600160c01b909104811690831610620017475760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001620015b5565b60006086546064620017b1919062005048565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd620017e28162003432565b63ffffffff82161580620018015750607e5463ffffffff908116908316115b156200182057604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200186757604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08620018de8162003432565b63ffffffff88161580620018fd5750607e5463ffffffff908116908916115b156200191c57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff16151590036200196357604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff1615620019a1576040516337c8fe0960e11b815260040160405180910390fd5b60808054600091908290620019bc9063ffffffff1662005062565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001a0a9062004759565b62001a189392919062005088565b604051809103906000f08015801562001a35573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001ca9949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001ce9908d908d9088908e908e908e90600401620050bf565b600060405180830381600087803b15801562001d0457600080fd5b505af115801562001d19573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001d5390878787878762003f2c565b979650505050505050565b606f5460ff161562001d8357604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001dd292600160c01b9004811691166200501e565b6001600160401b0316111562001dfb57604051638a0704d360e01b815260040160405180910390fd5b6103e862001e0a888862005122565b6001600160401b0316111562001e3357604051635acfba9d60e11b815260040160405180910390fd5b62001e458189898989898989620037d7565b62001e5181876200406c565b6085546001600160401b031660000362001f5f57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001ecd576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001f066200256c565b6040518263ffffffff1660e01b815260040162001f2591815260200190565b600060405180830381600087803b15801562001f4057600080fd5b505af115801562001f55573d6000803e3d6000fd5b5050505062002029565b62001f6a8162004269565b600681018054600160801b90046001600160401b031690601062001f8e8362005145565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff1615620020ad57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88166000908152608160205260409020620020d481898989898989896200343e565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16200213362003dd7565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b815230600482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015620021d3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620021f9919062005164565b60845490915060009062002220906001600160401b03600160401b82048116911662005122565b6001600160401b03169050806000036200223d5760009250505090565b62002249818362005194565b9250505090565b606f5460009060ff16156200227857604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff1690819003620022b0576040516371653c1560e01b815260040160405180910390fd5b836001600160401b0316600003620022db57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff8116600090815260816020526040812060848054919287926200230e9084906001600160401b03166200501e565b82546101009290920a6001600160401b03818102199093169183160217909155600683015416905060006200234487836200501e565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b031990921692909316919091171790559050620023d48362004269565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b60008051602062005caa8339815191526200243d8162003432565b606f5460ff1662002478576085546001600160401b0390811690831610620024785760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001620015b5565b60008051602062005caa833981519152620024e38162003432565b62015180826001600160401b031611156200251157604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001620015b5565b60805460009063ffffffff168082036200258857506000919050565b6000816001600160401b03811115620025a557620025a562004aa7565b604051908082528060200260200182016040528015620025cf578160200160208202803683370190505b50905060005b82811015620026425760816000620025ef836001620051ab565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620026225762002622620051c1565b6020908102919091010152806200263981620051d7565b915050620025d5565b50600060205b836001146200289e57600062002660600286620051f3565b6200266d60028762005194565b620026799190620051ab565b90506000816001600160401b0381111562002698576200269862004aa7565b604051908082528060200260200182016040528015620026c2578160200160208202803683370190505b50905060005b828110156200284a57620026de6001846200520a565b81148015620026f95750620026f5600288620051f3565b6001145b156200278157856200270d82600262005048565b81518110620027205762002720620051c1565b60200260200101518560405160200162002744929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106200276f576200276f620051c1565b60200260200101818152505062002835565b856200278f82600262005048565b81518110620027a257620027a2620051c1565b602002602001015186826002620027ba919062005048565b620027c7906001620051ab565b81518110620027da57620027da620051c1565b6020026020010151604051602001620027fd929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620028285762002828620051c1565b6020026020010181815250505b806200284181620051d7565b915050620026c8565b5080945081955083846040516020016200286e929190918252602082015260400190565b6040516020818303038152906040528051906020012093508280620028939062005220565b935050505062002648565b600083600081518110620028b657620028b6620051c1565b6020026020010151905060005b828110156200293757604080516020810184905290810185905260600160408051601f198184030181528282528051602091820120908301879052908201869052925060600160405160208183030381529060405280519060200120935080806200292e90620051d7565b915050620028c3565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac6200296d8162003432565b63ffffffff841615806200298c5750607e5463ffffffff908116908516115b15620029ab57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff1690819003620029ec576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002a3b57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002a8257604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002ac057604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002b40846200111a565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002b969216908b908b906004016200523a565b600060405180830381600087803b15801562002bb157600080fd5b505af115801562002bc6573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002c4c8162003432565b683635c9adc5dea0000082118062002c675750633b9aca0082105b1562002c8657604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620015b5565b60008281526034602052604090206001015462002cd98162003432565b62001510838362003ec2565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002d118162003432565b6087805467ffffffffffffffff1916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc1697691600480830192600092919082900301818387803b15801562002d8f57600080fd5b505af115801562002da4573d6000803e3d6000fd5b5050505062002db262004334565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62002de18162003432565b6001600160401b03841660009081526083602052604090205463ffffffff161562002e1f576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b03871660009081526082602052604090205463ffffffff161562002e5d57604051630d409b9360e41b815260040160405180910390fd5b600062002e70888888888760006200314e565b60008080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002eba8162003432565b607e805460009190829062002ed59063ffffffff1662005062565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162003078969594939291906200527a565b60405180910390a25050505050505050565b600054610100900460ff16620016855760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000c13565b620016e6828262003e56565b600082815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b60808054600091829182906200316a9063ffffffff1662005062565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000876001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff16021790555080608260008a6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150878260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550868260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620033699594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b03828116600090815260048501602052604081205490924292620033af9291811691166200501e565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b03161562003415575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002db281336200438d565b60078801546000906001600160401b039081169087161015620034745760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620035155760068901546001600160401b03600160801b90910481169089161115620034be5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200350e57604051632bd2e3e760e01b815260040160405180910390fd5b506200358a565b506001600160401b03851660009081526002890160205260409020548062003550576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b909104811690871611156200358a57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620035c35750876001600160401b0316876001600160401b031611155b80620035e7575060068901546001600160401b03600160c01b909104811690881611155b15620036065760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b90048116908616146200364d576040516332a2a77f60e01b815260040160405180910390fd5b60006200365f8a888888868962003f2c565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620036969190620052d3565b602060405180830381855afa158015620036b4573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620036d9919062005164565b620036e59190620051f3565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200372991889190600401620052f1565b602060405180830381865afa15801562003747573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200376d91906200532e565b6200378b576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620037ca5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620037e58a620033c1565b60078b01549091506001600160401b0390811690891610156200381b5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620038be5760068a01546001600160401b03600160801b9091048116908a161115620038655760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620038b757604051632bd2e3e760e01b815260040160405180910390fd5b506200392e565b6001600160401b038816600090815260028b016020526040902054915081620038fa576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200392e57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620039615760405163b9b18f5760e01b815260040160405180910390fd5b6000620039738b8a8a8a878b62003f2c565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620039aa9190620052d3565b602060405180830381855afa158015620039c8573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620039ed919062005164565b620039f99190620051f3565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003a3d91899190600401620052f1565b602060405180830381865afa15801562003a5b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003a8191906200532e565b62003a9f576040516309bde33960e01b815260040160405180910390fd5b600062003aad848b62005122565b905062003b0687826001600160401b031662003ac862002169565b62003ad4919062005048565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620043b7565b80608460088282829054906101000a90046001600160401b031662003b2c91906200501e565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b15801562003bbd57600080fd5b505af115801562003bd2573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003c24575060068201546001600160401b03600160801b9091048116908216115b1562003c435760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003cff6200256c565b6040518263ffffffff1660e01b815260040162003d1e91815260200190565b600060405180830381600087803b15801562003d3957600080fd5b505af115801562003d4e573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003e3357600080fd5b505af115801562003e48573d6000803e3d6000fd5b50505050620016856200440b565b62003e6282826200213e565b620016e65760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003ece82826200213e565b15620016e65760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003f62575081155b1562003f815760405163340c614f60e11b815260040160405180910390fd5b8062003fa0576040516366385b5160e01b815260040160405180910390fd5b62003fab8462004468565b62003fc9576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b60006200407983620033c1565b9050816000806200408b848462005122565b6085546001600160401b039182169250600091620040b291600160401b900416426200520a565b90505b846001600160401b0316846001600160401b0316146200413c576001600160401b0380851660009081526003890160205260409020600181015490911682101562004117576001810154600160401b90046001600160401b0316945062004135565b62004123868662005122565b6001600160401b03169350506200413c565b50620040b5565b60006200414a84846200520a565b905083811015620041a857808403600c81116200416857806200416b565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a60865402816200419d576200419d6200517e565b046086555062004220565b838103600c8111620041bb5780620041be565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a76400000281620041f857620041f86200517e565b04905080608654670de0b6b3a764000002816200421957620042196200517e565b0460865550505b683635c9adc5dea0000060865411156200424757683635c9adc5dea000006086556200425f565b633b9aca0060865410156200425f57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002db2576006810154600090620042b490600160c01b90046001600160401b031660016200501e565b9050620042c282826200337c565b15620016e6576006820154600090600290620042f0908490600160801b90046001600160401b031662005122565b620042fc919062005352565b6200430890836200501e565b90506200431683826200337c565b15620043285762001510838262003be5565b62001510838362003be5565b606f5460ff166200435857604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6200439982826200213e565b620016e657604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905262001510908490620044ee565b606f5460ff16156200443057604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b0383161080156200449f575067ffffffff00000001604083901c6001600160401b0316105b8015620044c0575067ffffffff00000001608083901c6001600160401b0316105b8015620044d8575067ffffffff0000000160c083901c105b15620044e657506001919050565b506000919050565b600062004545826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620045c79092919063ffffffff16565b8051909150156200151057808060200190518101906200456691906200532e565b620015105760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000c13565b6060620045d88484600085620045e0565b949350505050565b606082471015620046435760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000c13565b600080866001600160a01b03168587604051620046619190620052d3565b60006040518083038185875af1925050503d8060008114620046a0576040519150601f19603f3d011682016040523d82523d6000602084013e620046a5565b606091505b509150915062001d538783838760608315620047265782516000036200471e576001600160a01b0385163b6200471e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000c13565b5081620045d8565b620045d883838151156200473d5781518083602001fd5b8060405162461bcd60e51b815260040162000c13919062004cd8565b61092e806200537c83390190565b6001600160a01b038116811462002db257600080fd5b80356001600160401b03811681146200342d57600080fd5b6000806000806000806000806000806101408b8d031215620047b657600080fd5b8a35620047c38162004767565b9950620047d360208c016200477d565b9850620047e360408c016200477d565b975060608b0135620047f58162004767565b965060808b0135620048078162004767565b955060a08b0135620048198162004767565b945060c08b01356200482b8162004767565b935060e08b01356200483d8162004767565b92506200484e6101008c016200477d565b91506200485f6101208c016200477d565b90509295989b9194979a5092959850565b803563ffffffff811681146200342d57600080fd5b600080604083850312156200489957600080fd5b620048a48362004870565b9150620048b4602084016200477d565b90509250929050565b600060208284031215620048d057600080fd5b620011118262004870565b8061030081018310156200111457600080fd5b6000806000806000806000806103e0898b0312156200490c57600080fd5b620049178962004870565b97506200492760208a016200477d565b96506200493760408a016200477d565b95506200494760608a016200477d565b94506200495760808a016200477d565b935060a0890135925060c08901359150620049768a60e08b01620048db565b90509295985092959890939650565b6000806000806000806000806103e0898b031215620049a357600080fd5b620049ae8962004870565b9750620049be60208a016200477d565b9650620049ce60408a016200477d565b9550620049de60608a016200477d565b94506080890135935060a0890135925060c0890135620049fe8162004767565b9150620049768a60e08b01620048db565b60006020828403121562004a2257600080fd5b813561ffff8116811462004a3557600080fd5b9392505050565b60006020828403121562004a4f57600080fd5b5035919050565b6000806040838503121562004a6a57600080fd5b82359150602083013562004a7e8162004767565b809150509250929050565b60006020828403121562004a9c57600080fd5b62001111826200477d565b634e487b7160e01b600052604160045260246000fd5b600082601f83011262004acf57600080fd5b81356001600160401b038082111562004aec5762004aec62004aa7565b604051601f8301601f19908116603f0116810190828211818310171562004b175762004b1762004aa7565b8160405283815286602085880101111562004b3157600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121562004b6d57600080fd5b62004b788862004870565b965062004b88602089016200477d565b9550604088013562004b9a8162004767565b9450606088013562004bac8162004767565b9350608088013562004bbe8162004767565b925060a08801356001600160401b038082111562004bdb57600080fd5b62004be98b838c0162004abd565b935060c08a013591508082111562004c0057600080fd5b5062004c0f8a828b0162004abd565b91505092959891949750929550565b60008060008060008060c0878903121562004c3857600080fd5b62004c438762004870565b955062004c53602088016200477d565b945062004c63604088016200477d565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004ca157818101518382015260200162004c87565b50506000910152565b6000815180845262004cc481602086016020860162004c84565b601f01601f19169290920160200192915050565b60208152600062001111602083018462004caa565b6000806040838503121562004d0157600080fd5b62004d0c836200477d565b946020939093013593505050565b6000806000806060858703121562004d3157600080fd5b843562004d3e8162004767565b935062004d4e6020860162004870565b925060408501356001600160401b038082111562004d6b57600080fd5b818701915087601f83011262004d8057600080fd5b81358181111562004d9057600080fd5b88602082850101111562004da357600080fd5b95989497505060200194505050565b60006020828403121562004dc557600080fd5b813562004a358162004767565b803560ff811681146200342d57600080fd5b60008060008060008060c0878903121562004dfe57600080fd5b863562004e0b8162004767565b9550602087013562004e1d8162004767565b945062004e2d604088016200477d565b935062004e3d606088016200477d565b92506080870135915062004e5460a0880162004dd2565b90509295509295509295565b60008060008060008060c0878903121562004e7a57600080fd5b863562004e878162004767565b9550602087013562004e998162004767565b945062004ea9604088016200477d565b935062004eb96060880162004dd2565b92506080870135915060a08701356001600160401b0381111562004edc57600080fd5b62004eea89828a0162004abd565b9150509295509295509295565b8054600090600181811c908083168062004f1257607f831692505b6020808410820362004f3457634e487b7160e01b600052602260045260246000fd5b8388526020880182801562004f52576001811462004f695762004f96565b60ff198716825285151560051b8201975062004f96565b60008981526020902060005b8781101562004f905781548482015290860190840162004f75565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c06040820181905260009062004fd19083018762004ef7565b828103606084015262004fe5818762004ef7565b9150508360808301526001600160401b03831660a0830152979650505050505050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562005041576200504162005008565b5092915050565b808202811582820484141762001114576200111462005008565b600063ffffffff8083168181036200507e576200507e62005008565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620050b69083018462004caa565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c060808201819052600090620051019083018562004caa565b82810360a084015262005115818562004caa565b9998505050505050505050565b6001600160401b0382811682821603908082111562005041576200504162005008565b60006001600160401b038083168181036200507e576200507e62005008565b6000602082840312156200517757600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082620051a657620051a66200517e565b500490565b8082018082111562001114576200111462005008565b634e487b7160e01b600052603260045260246000fd5b600060018201620051ec57620051ec62005008565b5060010190565b6000826200520557620052056200517e565b500690565b8181038181111562001114576200111462005008565b60008162005232576200523262005008565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a08201819052600090620052c79083018462004caa565b98975050505050505050565b60008251620052e781846020870162004c84565b9190910192915050565b61032081016103008085843782018360005b60018110156200532457815183526020928301929091019060010162005303565b5050509392505050565b6000602082840312156200534157600080fd5b8151801515811462004a3557600080fd5b60006001600160401b03808416806200536f576200536f6200517e565b9216919091049291505056fe60a06040526040516200092e3803806200092e833981016040819052620000269162000383565b828162000034828262000060565b50506001600160a01b038216608052620000576200005160805190565b620000c6565b50505062000481565b6200006b8262000138565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115620000b857620000b38282620001b8565b505050565b620000c262000235565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620001086000805160206200090e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001358162000257565b50565b806001600160a01b03163b6000036200017457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b031684604051620001d7919062000463565b600060405180830381855af49150503d806000811462000214576040519150601f19603f3d011682016040523d82523d6000602084013e62000219565b606091505b5090925090506200022c8583836200029a565b95945050505050565b3415620002555760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166200028357604051633173bdd160e11b8152600060048201526024016200016b565b806000805160206200090e83398151915262000197565b606082620002b357620002ad8262000300565b620002f9565b8151158015620002cb57506001600160a01b0384163b155b15620002f657604051639996b31560e01b81526001600160a01b03851660048201526024016200016b565b50805b9392505050565b805115620003115780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b03811681146200034257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200037a57818101518382015260200162000360565b50506000910152565b6000806000606084860312156200039957600080fd5b620003a4846200032a565b9250620003b4602085016200032a565b60408501519092506001600160401b0380821115620003d257600080fd5b818601915086601f830112620003e757600080fd5b815181811115620003fc57620003fc62000347565b604051601f8201601f19908116603f0116810190838211818310171562000427576200042762000347565b816040528281528960208487010111156200044157600080fd5b620004548360208301602088016200035d565b80955050505050509250925092565b60008251620004778184602087016200035d565b9190910192915050565b6080516104726200049c6000396000601001526104726000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100e5565b60008061008e36600481846102fd565b81019061009b919061033d565b915091506100a98282610109565b5050565b60006100e07f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610104573d6000f35b3d6000fd5b61011282610164565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561015c5761015782826101e0565b505050565b6100a9610256565b806001600160a01b03163b60000361019f57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101fd919061040d565b600060405180830381855af49150503d8060008114610238576040519150601f19603f3d011682016040523d82523d6000602084013e61023d565b606091505b509150915061024d858383610275565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b60608261028a57610285826102d4565b6102cd565b81511580156102a157506001600160a01b0384163b155b156102ca57604051639996b31560e01b81526001600160a01b0385166004820152602401610196565b50805b9392505050565b8051156102e45780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6000808585111561030d57600080fd5b8386111561031a57600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035057600080fd5b82356001600160a01b038116811461036757600080fd5b9150602083013567ffffffffffffffff8082111561038457600080fd5b818501915085601f83011261039857600080fd5b8135818111156103aa576103aa610327565b604051601f8201601f19908116603f011681019083821181831017156103d2576103d2610327565b816040528281528860208487010111156103eb57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000825160005b8181101561042e5760208186018101518583015201610414565b50600092019182525091905056fea2646970667358221220b682b645e70b0310ca18f6b5889dc8bdacf4b460a01fb9d34b74753f65dc9ae364736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a264697066735822122074fa5fae4b7539b28e148b8a0e0cc30e343ede0a3cae2821f306d8c06bd61d4d64736f6c63430008140033", - "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620003155760003560e01c8063841b24d711620001a9578063c1acbc3411620000f7578063dbc16976116200009e578063dbc1697614620009ed578063dde0ff7714620009f7578063e0bfd3d21462000a12578063e46761c41462000a29578063f34eb8eb1462000a51578063f4e926751462000a68578063f9c4c2ae1462000a7957600080fd5b8063c1acbc341462000928578063c4c928c21462000943578063ceee281d146200095a578063d02103ca1462000983578063d5073f6f14620009ab578063d547741f14620009c2578063d939b31514620009d957600080fd5b80639c9f3dfe116200015c5780639c9f3dfe14620007a0578063a066215c14620007b7578063a217fddf14620007ce578063a2967d9914620007d7578063a3c573eb14620007e1578063afd23cbe1462000822578063b99d0ad7146200084c57600080fd5b8063841b24d7146200071f57806387c20c01146200073a5780638bd4f071146200075157806391d14854146200076857806399f5634e146200077f5780639a908e73146200078957600080fd5b806325280169116200026757806355a71ee0116200021a57806355a71ee014620005a55780636046916914620005e957806365c0504d14620005f35780637222020f14620006a2578063727885e914620006b95780637975fcfe14620006d05780637fb6e76a14620006f657600080fd5b806325280169146200048e5780632f2ff15d146200054357806330c27dde146200055a57806336568abe146200056e578063394218e91462000585578063477fa270146200059c57600080fd5b80631489ed1011620002cc5780631489ed1014620003d557806315064c9614620003ec5780631608859c14620003fa5780631796a1ae14620004115780631816b7e514620004385780632072f6c5146200044f578063248a9ca3146200045957600080fd5b80630645af09146200031a578063066ec0121462000333578063080b311114620003645780630a0d9fbe146200038c57806311f6b28714620003a757806312b86e1914620003be575b600080fd5b620003316200032b36600462004795565b62000b90565b005b60845462000347906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b6200037b6200037536600462004885565b620010f0565b60405190151581526020016200035b565b6085546200034790600160401b90046001600160401b031681565b62000347620003b8366004620048bd565b6200111a565b62000331620003cf366004620048ee565b6200113a565b62000331620003e636600462004985565b620012ea565b606f546200037b9060ff1681565b620003316200040b36600462004885565b62001480565b607e54620004229063ffffffff1681565b60405163ffffffff90911681526020016200035b565b620003316200044936600462004a0f565b62001515565b62000331620015c1565b6200047f6200046a36600462004a3c565b60009081526034602052604090206001015490565b6040519081526020016200035b565b6200050f6200049f36600462004885565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b039081169183019190915292820151909216908201526060016200035b565b620003316200055436600462004a56565b62001687565b60875462000347906001600160401b031681565b620003316200057f36600462004a56565b620016b0565b620003316200059636600462004a89565b620016ea565b6086546200047f565b6200047f620005b636600462004885565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b6200047f6200179e565b6200065862000604366004620048bd565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c0016200035b565b62000331620006b3366004620048bd565b620017b6565b62000331620006ca36600462004b51565b620018b2565b620006e7620006e136600462004c1e565b62001d2b565b6040516200035b919062004cd8565b620004226200070736600462004a89565b60836020526000908152604090205463ffffffff1681565b6084546200034790600160c01b90046001600160401b031681565b620003316200074b36600462004985565b62001d5e565b6200033162000762366004620048ee565b62002088565b6200037b6200077936600462004a56565b6200213e565b6200047f62002169565b620003476200079a36600462004ced565b62002250565b62000331620007b136600462004a89565b62002422565b62000331620007c836600462004a89565b620024c8565b6200047f600081565b6200047f6200256c565b620008097f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016200035b565b6085546200083890600160801b900461ffff1681565b60405161ffff90911681526020016200035b565b620008e26200085d36600462004885565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b6040516200035b919060006080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200034790600160801b90046001600160401b031681565b620003316200095436600462004d1a565b62002941565b620004226200096b36600462004db2565b60826020526000908152604090205463ffffffff1681565b620008097f000000000000000000000000000000000000000000000000000000000000000081565b62000331620009bc36600462004a3c565b62002c20565b62000331620009d336600462004a56565b62002cbc565b60855462000347906001600160401b031681565b6200033162002ce5565b6084546200034790600160401b90046001600160401b031681565b6200033162000a2336600462004de4565b62002db5565b620008097f000000000000000000000000000000000000000000000000000000000000000081565b6200033162000a6236600462004e60565b62002e8e565b608054620004229063ffffffff1681565b62000b1062000a8a366004620048bd565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff16610160820152610180016200035b565b600054600290610100900460ff1615801562000bb3575060005460ff8083169116105b62000c1c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c9d6200308a565b62000cb860008051602062005cea8339815191528c620030f7565b62000cc5600088620030f7565b62000cf17fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59088620030f7565b62000d1d7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e88620030f7565b62000d497f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac88620030f7565b62000d757fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd89620030f7565b62000da17fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd0889620030f7565b62000dcd7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f489620030f7565b62000de860008051602062005caa83398151915289620030f7565b62000e2360008051602062005cea8339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062003103565b62000e4f7f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f089620030f7565b62000e7b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb89620030f7565b62000eb660008051602062005cca8339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162003103565b62000ed160008051602062005cca83398151915287620030f7565b62000efd7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595187620030f7565b6073546074546001600160401b03600160401b9092048216911680821462000f3857604051632e4cc54360e11b815260040160405180910390fd5b600062000f60888888886000607460009054906101000a90046001600160401b03166200314e565b6001600160401b03838116600081815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068b018054909216909417938802939093179092556007880180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81529596506001600160a01b038e81169663bb59070896620010639694831695600160581b90950490921693607693607793909291169060040162004fa3565b600060405180830381600087803b1580156200107e57600080fd5b505af115801562001093573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620010db9050565b60405180910390a15050505050505050505050565b63ffffffff821660009081526081602052604081206200111190836200337c565b90505b92915050565b63ffffffff811660009081526081602052604081206200111490620033c1565b60008051602062005cea833981519152620011558162003432565b63ffffffff891660009081526081602052604090206200117c818a8a8a8a8a8a8a6200343e565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b90041615620011e4576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200121d6200256c565b6040518263ffffffff1660e01b81526004016200123c91815260200190565b600060405180830381600087803b1580156200125757600080fd5b505af11580156200126c573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005cea833981519152620013058162003432565b63ffffffff891660009081526081602052604090206200132c818a8a8a8a8a8a8a620037d7565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562001394576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620013cd6200256c565b6040518263ffffffff1660e01b8152600401620013ec91815260200190565b600060405180830381600087803b1580156200140757600080fd5b505af11580156200141c573d6000803e3d6000fd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff82166000908152608160205260409020620014b060008051602062005cea833981519152336200213e565b6200150457606f5460ff1615620014da57604051630bc011ff60e21b815260040160405180910390fd5b620014e681836200337c565b6200150457604051630674f25160e11b815260040160405180910390fd5b62001510818362003be5565b505050565b60008051602062005caa833981519152620015308162003432565b6103e88261ffff1610806200154a57506103ff8261ffff16115b156200156957604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620015dc60008051602062005cca833981519152336200213e565b6200167b57608454600160801b90046001600160401b031615806200162c57506084544290620016219062093a8090600160801b90046001600160401b03166200501e565b6001600160401b0316115b806200165c57506087544290620016519062093a80906001600160401b03166200501e565b6001600160401b0316115b156200167b5760405163692baaad60e11b815260040160405180910390fd5b6200168562003dd7565b565b600082815260346020526040902060010154620016a48162003432565b62001510838362003e56565b6001600160a01b0381163314620016da57604051630b4ad1cd60e31b815260040160405180910390fd5b620016e6828262003ec2565b5050565b60008051602062005caa833981519152620017058162003432565b606f5460ff1662001747576084546001600160401b03600160c01b909104811690831610620017475760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001620015b5565b60006086546064620017b1919062005048565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd620017e28162003432565b63ffffffff82161580620018015750607e5463ffffffff908116908316115b156200182057604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200186757604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08620018de8162003432565b63ffffffff88161580620018fd5750607e5463ffffffff908116908916115b156200191c57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff16151590036200196357604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff1615620019a1576040516337c8fe0960e11b815260040160405180910390fd5b60808054600091908290620019bc9063ffffffff1662005062565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001a0a9062004759565b62001a189392919062005088565b604051809103906000f08015801562001a35573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001ca9949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001ce9908d908d9088908e908e908e90600401620050bf565b600060405180830381600087803b15801562001d0457600080fd5b505af115801562001d19573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001d5390878787878762003f2c565b979650505050505050565b606f5460ff161562001d8357604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001dd292600160c01b9004811691166200501e565b6001600160401b0316111562001dfb57604051638a0704d360e01b815260040160405180910390fd5b6103e862001e0a888862005122565b6001600160401b0316111562001e3357604051635acfba9d60e11b815260040160405180910390fd5b62001e458189898989898989620037d7565b62001e5181876200406c565b6085546001600160401b031660000362001f5f57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001ecd576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001f066200256c565b6040518263ffffffff1660e01b815260040162001f2591815260200190565b600060405180830381600087803b15801562001f4057600080fd5b505af115801562001f55573d6000803e3d6000fd5b5050505062002029565b62001f6a8162004269565b600681018054600160801b90046001600160401b031690601062001f8e8362005145565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff1615620020ad57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88166000908152608160205260409020620020d481898989898989896200343e565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16200213362003dd7565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b815230600482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015620021d3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620021f9919062005164565b60845490915060009062002220906001600160401b03600160401b82048116911662005122565b6001600160401b03169050806000036200223d5760009250505090565b62002249818362005194565b9250505090565b606f5460009060ff16156200227857604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff1690819003620022b0576040516371653c1560e01b815260040160405180910390fd5b836001600160401b0316600003620022db57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff8116600090815260816020526040812060848054919287926200230e9084906001600160401b03166200501e565b82546101009290920a6001600160401b03818102199093169183160217909155600683015416905060006200234487836200501e565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b031990921692909316919091171790559050620023d48362004269565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b60008051602062005caa8339815191526200243d8162003432565b606f5460ff1662002478576085546001600160401b0390811690831610620024785760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001620015b5565b60008051602062005caa833981519152620024e38162003432565b62015180826001600160401b031611156200251157604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001620015b5565b60805460009063ffffffff168082036200258857506000919050565b6000816001600160401b03811115620025a557620025a562004aa7565b604051908082528060200260200182016040528015620025cf578160200160208202803683370190505b50905060005b82811015620026425760816000620025ef836001620051ab565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620026225762002622620051c1565b6020908102919091010152806200263981620051d7565b915050620025d5565b50600060205b836001146200289e57600062002660600286620051f3565b6200266d60028762005194565b620026799190620051ab565b90506000816001600160401b0381111562002698576200269862004aa7565b604051908082528060200260200182016040528015620026c2578160200160208202803683370190505b50905060005b828110156200284a57620026de6001846200520a565b81148015620026f95750620026f5600288620051f3565b6001145b156200278157856200270d82600262005048565b81518110620027205762002720620051c1565b60200260200101518560405160200162002744929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106200276f576200276f620051c1565b60200260200101818152505062002835565b856200278f82600262005048565b81518110620027a257620027a2620051c1565b602002602001015186826002620027ba919062005048565b620027c7906001620051ab565b81518110620027da57620027da620051c1565b6020026020010151604051602001620027fd929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620028285762002828620051c1565b6020026020010181815250505b806200284181620051d7565b915050620026c8565b5080945081955083846040516020016200286e929190918252602082015260400190565b6040516020818303038152906040528051906020012093508280620028939062005220565b935050505062002648565b600083600081518110620028b657620028b6620051c1565b6020026020010151905060005b828110156200293757604080516020810184905290810185905260600160408051601f198184030181528282528051602091820120908301879052908201869052925060600160405160208183030381529060405280519060200120935080806200292e90620051d7565b915050620028c3565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac6200296d8162003432565b63ffffffff841615806200298c5750607e5463ffffffff908116908516115b15620029ab57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff1690819003620029ec576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002a3b57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002a8257604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002ac057604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002b40846200111a565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002b969216908b908b906004016200523a565b600060405180830381600087803b15801562002bb157600080fd5b505af115801562002bc6573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002c4c8162003432565b683635c9adc5dea0000082118062002c675750633b9aca0082105b1562002c8657604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620015b5565b60008281526034602052604090206001015462002cd98162003432565b62001510838362003ec2565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002d118162003432565b6087805467ffffffffffffffff1916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc1697691600480830192600092919082900301818387803b15801562002d8f57600080fd5b505af115801562002da4573d6000803e3d6000fd5b5050505062002db262004334565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62002de18162003432565b6001600160401b03841660009081526083602052604090205463ffffffff161562002e1f576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b03871660009081526082602052604090205463ffffffff161562002e5d57604051630d409b9360e41b815260040160405180910390fd5b600062002e70888888888760006200314e565b60008080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002eba8162003432565b607e805460009190829062002ed59063ffffffff1662005062565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162003078969594939291906200527a565b60405180910390a25050505050505050565b600054610100900460ff16620016855760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000c13565b620016e6828262003e56565b600082815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b60808054600091829182906200316a9063ffffffff1662005062565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000876001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff16021790555080608260008a6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150878260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550868260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620033699594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b03828116600090815260048501602052604081205490924292620033af9291811691166200501e565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b03161562003415575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002db281336200438d565b60078801546000906001600160401b039081169087161015620034745760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620035155760068901546001600160401b03600160801b90910481169089161115620034be5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200350e57604051632bd2e3e760e01b815260040160405180910390fd5b506200358a565b506001600160401b03851660009081526002890160205260409020548062003550576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b909104811690871611156200358a57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620035c35750876001600160401b0316876001600160401b031611155b80620035e7575060068901546001600160401b03600160c01b909104811690881611155b15620036065760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b90048116908616146200364d576040516332a2a77f60e01b815260040160405180910390fd5b60006200365f8a888888868962003f2c565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620036969190620052d3565b602060405180830381855afa158015620036b4573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620036d9919062005164565b620036e59190620051f3565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200372991889190600401620052f1565b602060405180830381865afa15801562003747573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200376d91906200532e565b6200378b576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620037ca5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620037e58a620033c1565b60078b01549091506001600160401b0390811690891610156200381b5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620038be5760068a01546001600160401b03600160801b9091048116908a161115620038655760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620038b757604051632bd2e3e760e01b815260040160405180910390fd5b506200392e565b6001600160401b038816600090815260028b016020526040902054915081620038fa576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200392e57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620039615760405163b9b18f5760e01b815260040160405180910390fd5b6000620039738b8a8a8a878b62003f2c565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620039aa9190620052d3565b602060405180830381855afa158015620039c8573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620039ed919062005164565b620039f99190620051f3565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003a3d91899190600401620052f1565b602060405180830381865afa15801562003a5b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003a8191906200532e565b62003a9f576040516309bde33960e01b815260040160405180910390fd5b600062003aad848b62005122565b905062003b0687826001600160401b031662003ac862002169565b62003ad4919062005048565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620043b7565b80608460088282829054906101000a90046001600160401b031662003b2c91906200501e565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b15801562003bbd57600080fd5b505af115801562003bd2573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003c24575060068201546001600160401b03600160801b9091048116908216115b1562003c435760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003cff6200256c565b6040518263ffffffff1660e01b815260040162003d1e91815260200190565b600060405180830381600087803b15801562003d3957600080fd5b505af115801562003d4e573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003e3357600080fd5b505af115801562003e48573d6000803e3d6000fd5b50505050620016856200440b565b62003e6282826200213e565b620016e65760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003ece82826200213e565b15620016e65760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003f62575081155b1562003f815760405163340c614f60e11b815260040160405180910390fd5b8062003fa0576040516366385b5160e01b815260040160405180910390fd5b62003fab8462004468565b62003fc9576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b60006200407983620033c1565b9050816000806200408b848462005122565b6085546001600160401b039182169250600091620040b291600160401b900416426200520a565b90505b846001600160401b0316846001600160401b0316146200413c576001600160401b0380851660009081526003890160205260409020600181015490911682101562004117576001810154600160401b90046001600160401b0316945062004135565b62004123868662005122565b6001600160401b03169350506200413c565b50620040b5565b60006200414a84846200520a565b905083811015620041a857808403600c81116200416857806200416b565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a60865402816200419d576200419d6200517e565b046086555062004220565b838103600c8111620041bb5780620041be565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a76400000281620041f857620041f86200517e565b04905080608654670de0b6b3a764000002816200421957620042196200517e565b0460865550505b683635c9adc5dea0000060865411156200424757683635c9adc5dea000006086556200425f565b633b9aca0060865410156200425f57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002db2576006810154600090620042b490600160c01b90046001600160401b031660016200501e565b9050620042c282826200337c565b15620016e6576006820154600090600290620042f0908490600160801b90046001600160401b031662005122565b620042fc919062005352565b6200430890836200501e565b90506200431683826200337c565b15620043285762001510838262003be5565b62001510838362003be5565b606f5460ff166200435857604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6200439982826200213e565b620016e657604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905262001510908490620044ee565b606f5460ff16156200443057604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b0383161080156200449f575067ffffffff00000001604083901c6001600160401b0316105b8015620044c0575067ffffffff00000001608083901c6001600160401b0316105b8015620044d8575067ffffffff0000000160c083901c105b15620044e657506001919050565b506000919050565b600062004545826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620045c79092919063ffffffff16565b8051909150156200151057808060200190518101906200456691906200532e565b620015105760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000c13565b6060620045d88484600085620045e0565b949350505050565b606082471015620046435760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000c13565b600080866001600160a01b03168587604051620046619190620052d3565b60006040518083038185875af1925050503d8060008114620046a0576040519150601f19603f3d011682016040523d82523d6000602084013e620046a5565b606091505b509150915062001d538783838760608315620047265782516000036200471e576001600160a01b0385163b6200471e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000c13565b5081620045d8565b620045d883838151156200473d5781518083602001fd5b8060405162461bcd60e51b815260040162000c13919062004cd8565b61092e806200537c83390190565b6001600160a01b038116811462002db257600080fd5b80356001600160401b03811681146200342d57600080fd5b6000806000806000806000806000806101408b8d031215620047b657600080fd5b8a35620047c38162004767565b9950620047d360208c016200477d565b9850620047e360408c016200477d565b975060608b0135620047f58162004767565b965060808b0135620048078162004767565b955060a08b0135620048198162004767565b945060c08b01356200482b8162004767565b935060e08b01356200483d8162004767565b92506200484e6101008c016200477d565b91506200485f6101208c016200477d565b90509295989b9194979a5092959850565b803563ffffffff811681146200342d57600080fd5b600080604083850312156200489957600080fd5b620048a48362004870565b9150620048b4602084016200477d565b90509250929050565b600060208284031215620048d057600080fd5b620011118262004870565b8061030081018310156200111457600080fd5b6000806000806000806000806103e0898b0312156200490c57600080fd5b620049178962004870565b97506200492760208a016200477d565b96506200493760408a016200477d565b95506200494760608a016200477d565b94506200495760808a016200477d565b935060a0890135925060c08901359150620049768a60e08b01620048db565b90509295985092959890939650565b6000806000806000806000806103e0898b031215620049a357600080fd5b620049ae8962004870565b9750620049be60208a016200477d565b9650620049ce60408a016200477d565b9550620049de60608a016200477d565b94506080890135935060a0890135925060c0890135620049fe8162004767565b9150620049768a60e08b01620048db565b60006020828403121562004a2257600080fd5b813561ffff8116811462004a3557600080fd5b9392505050565b60006020828403121562004a4f57600080fd5b5035919050565b6000806040838503121562004a6a57600080fd5b82359150602083013562004a7e8162004767565b809150509250929050565b60006020828403121562004a9c57600080fd5b62001111826200477d565b634e487b7160e01b600052604160045260246000fd5b600082601f83011262004acf57600080fd5b81356001600160401b038082111562004aec5762004aec62004aa7565b604051601f8301601f19908116603f0116810190828211818310171562004b175762004b1762004aa7565b8160405283815286602085880101111562004b3157600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121562004b6d57600080fd5b62004b788862004870565b965062004b88602089016200477d565b9550604088013562004b9a8162004767565b9450606088013562004bac8162004767565b9350608088013562004bbe8162004767565b925060a08801356001600160401b038082111562004bdb57600080fd5b62004be98b838c0162004abd565b935060c08a013591508082111562004c0057600080fd5b5062004c0f8a828b0162004abd565b91505092959891949750929550565b60008060008060008060c0878903121562004c3857600080fd5b62004c438762004870565b955062004c53602088016200477d565b945062004c63604088016200477d565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004ca157818101518382015260200162004c87565b50506000910152565b6000815180845262004cc481602086016020860162004c84565b601f01601f19169290920160200192915050565b60208152600062001111602083018462004caa565b6000806040838503121562004d0157600080fd5b62004d0c836200477d565b946020939093013593505050565b6000806000806060858703121562004d3157600080fd5b843562004d3e8162004767565b935062004d4e6020860162004870565b925060408501356001600160401b038082111562004d6b57600080fd5b818701915087601f83011262004d8057600080fd5b81358181111562004d9057600080fd5b88602082850101111562004da357600080fd5b95989497505060200194505050565b60006020828403121562004dc557600080fd5b813562004a358162004767565b803560ff811681146200342d57600080fd5b60008060008060008060c0878903121562004dfe57600080fd5b863562004e0b8162004767565b9550602087013562004e1d8162004767565b945062004e2d604088016200477d565b935062004e3d606088016200477d565b92506080870135915062004e5460a0880162004dd2565b90509295509295509295565b60008060008060008060c0878903121562004e7a57600080fd5b863562004e878162004767565b9550602087013562004e998162004767565b945062004ea9604088016200477d565b935062004eb96060880162004dd2565b92506080870135915060a08701356001600160401b0381111562004edc57600080fd5b62004eea89828a0162004abd565b9150509295509295509295565b8054600090600181811c908083168062004f1257607f831692505b6020808410820362004f3457634e487b7160e01b600052602260045260246000fd5b8388526020880182801562004f52576001811462004f695762004f96565b60ff198716825285151560051b8201975062004f96565b60008981526020902060005b8781101562004f905781548482015290860190840162004f75565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c06040820181905260009062004fd19083018762004ef7565b828103606084015262004fe5818762004ef7565b9150508360808301526001600160401b03831660a0830152979650505050505050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562005041576200504162005008565b5092915050565b808202811582820484141762001114576200111462005008565b600063ffffffff8083168181036200507e576200507e62005008565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620050b69083018462004caa565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c060808201819052600090620051019083018562004caa565b82810360a084015262005115818562004caa565b9998505050505050505050565b6001600160401b0382811682821603908082111562005041576200504162005008565b60006001600160401b038083168181036200507e576200507e62005008565b6000602082840312156200517757600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082620051a657620051a66200517e565b500490565b8082018082111562001114576200111462005008565b634e487b7160e01b600052603260045260246000fd5b600060018201620051ec57620051ec62005008565b5060010190565b6000826200520557620052056200517e565b500690565b8181038181111562001114576200111462005008565b60008162005232576200523262005008565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a08201819052600090620052c79083018462004caa565b98975050505050505050565b60008251620052e781846020870162004c84565b9190910192915050565b61032081016103008085843782018360005b60018110156200532457815183526020928301929091019060010162005303565b5050509392505050565b6000602082840312156200534157600080fd5b8151801515811462004a3557600080fd5b60006001600160401b03808416806200536f576200536f6200517e565b9216919091049291505056fe60a06040526040516200092e3803806200092e833981016040819052620000269162000383565b828162000034828262000060565b50506001600160a01b038216608052620000576200005160805190565b620000c6565b50505062000481565b6200006b8262000138565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115620000b857620000b38282620001b8565b505050565b620000c262000235565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620001086000805160206200090e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001358162000257565b50565b806001600160a01b03163b6000036200017457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b031684604051620001d7919062000463565b600060405180830381855af49150503d806000811462000214576040519150601f19603f3d011682016040523d82523d6000602084013e62000219565b606091505b5090925090506200022c8583836200029a565b95945050505050565b3415620002555760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166200028357604051633173bdd160e11b8152600060048201526024016200016b565b806000805160206200090e83398151915262000197565b606082620002b357620002ad8262000300565b620002f9565b8151158015620002cb57506001600160a01b0384163b155b15620002f657604051639996b31560e01b81526001600160a01b03851660048201526024016200016b565b50805b9392505050565b805115620003115780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b03811681146200034257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200037a57818101518382015260200162000360565b50506000910152565b6000806000606084860312156200039957600080fd5b620003a4846200032a565b9250620003b4602085016200032a565b60408501519092506001600160401b0380821115620003d257600080fd5b818601915086601f830112620003e757600080fd5b815181811115620003fc57620003fc62000347565b604051601f8201601f19908116603f0116810190838211818310171562000427576200042762000347565b816040528281528960208487010111156200044157600080fd5b620004548360208301602088016200035d565b80955050505050509250925092565b60008251620004778184602087016200035d565b9190910192915050565b6080516104726200049c6000396000601001526104726000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100e5565b60008061008e36600481846102fd565b81019061009b919061033d565b915091506100a98282610109565b5050565b60006100e07f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610104573d6000f35b3d6000fd5b61011282610164565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561015c5761015782826101e0565b505050565b6100a9610256565b806001600160a01b03163b60000361019f57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101fd919061040d565b600060405180830381855af49150503d8060008114610238576040519150601f19603f3d011682016040523d82523d6000602084013e61023d565b606091505b509150915061024d858383610275565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b60608261028a57610285826102d4565b6102cd565b81511580156102a157506001600160a01b0384163b155b156102ca57604051639996b31560e01b81526001600160a01b0385166004820152602401610196565b50805b9392505050565b8051156102e45780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6000808585111561030d57600080fd5b8386111561031a57600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035057600080fd5b82356001600160a01b038116811461036757600080fd5b9150602083013567ffffffffffffffff8082111561038457600080fd5b818501915085601f83011261039857600080fd5b8135818111156103aa576103aa610327565b604051601f8201601f19908116603f011681019083821181831017156103d2576103d2610327565b816040528281528860208487010111156103eb57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000825160005b8181101561042e5760208186018101518583015201610414565b50600092019182525091905056fea2646970667358221220b682b645e70b0310ca18f6b5889dc8bdacf4b460a01fb9d34b74753f65dc9ae364736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a264697066735822122074fa5fae4b7539b28e148b8a0e0cc30e343ede0a3cae2821f306d8c06bd61d4d64736f6c63430008140033", + "bytecode": "0x60e06040523480156200001157600080fd5b5060405162005f2238038062005f2283398101604081905262000034916200013b565b6001600160a01b0380841660805282811660c052811660a0526200005762000060565b5050506200018f565b600054610100900460ff1615620000cd5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000120576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013857600080fd5b50565b6000806000606084860312156200015157600080fd5b83516200015e8162000122565b6020850151909350620001718162000122565b6040850151909250620001848162000122565b809150509250925092565b60805160a05160c051615d2b620001f760003960008181610a2f015281816121870152613ada0152600081816107e701528181612d3b0152613dd5015260008181610989015281816111e20152818161139201528181611ecb0152613cc40152615d2b6000f3fe60806040523480156200001157600080fd5b5060043610620003155760003560e01c8063841b24d711620001a9578063c1acbc3411620000f7578063dbc16976116200009e578063dbc1697614620009ed578063dde0ff7714620009f7578063e0bfd3d21462000a12578063e46761c41462000a29578063f34eb8eb1462000a51578063f4e926751462000a68578063f9c4c2ae1462000a7957600080fd5b8063c1acbc341462000928578063c4c928c21462000943578063ceee281d146200095a578063d02103ca1462000983578063d5073f6f14620009ab578063d547741f14620009c2578063d939b31514620009d957600080fd5b80639c9f3dfe116200015c5780639c9f3dfe14620007a0578063a066215c14620007b7578063a217fddf14620007ce578063a2967d9914620007d7578063a3c573eb14620007e1578063afd23cbe1462000822578063b99d0ad7146200084c57600080fd5b8063841b24d7146200071f57806387c20c01146200073a5780638bd4f071146200075157806391d14854146200076857806399f5634e146200077f5780639a908e73146200078957600080fd5b806325280169116200026757806355a71ee0116200021a57806355a71ee014620005a55780636046916914620005e957806365c0504d14620005f35780637222020f14620006a2578063727885e914620006b95780637975fcfe14620006d05780637fb6e76a14620006f657600080fd5b806325280169146200048e5780632f2ff15d146200054357806330c27dde146200055a57806336568abe146200056e578063394218e91462000585578063477fa270146200059c57600080fd5b80631489ed1011620002cc5780631489ed1014620003d557806315064c9614620003ec5780631608859c14620003fa5780631796a1ae14620004115780631816b7e514620004385780632072f6c5146200044f578063248a9ca3146200045957600080fd5b80630645af09146200031a578063066ec0121462000333578063080b311114620003645780630a0d9fbe146200038c57806311f6b28714620003a757806312b86e1914620003be575b600080fd5b620003316200032b36600462004791565b62000b90565b005b60845462000347906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b6200037b6200037536600462004881565b620010ec565b60405190151581526020016200035b565b6085546200034790600160401b90046001600160401b031681565b62000347620003b8366004620048b9565b62001116565b62000331620003cf366004620048ea565b62001136565b62000331620003e636600462004981565b620012e6565b606f546200037b9060ff1681565b620003316200040b36600462004881565b6200147c565b607e54620004229063ffffffff1681565b60405163ffffffff90911681526020016200035b565b620003316200044936600462004a0b565b62001511565b62000331620015bd565b6200047f6200046a36600462004a38565b60009081526034602052604090206001015490565b6040519081526020016200035b565b6200050f6200049f36600462004881565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b039081169183019190915292820151909216908201526060016200035b565b620003316200055436600462004a52565b62001683565b60875462000347906001600160401b031681565b620003316200057f36600462004a52565b620016ac565b620003316200059636600462004a85565b620016e6565b6086546200047f565b6200047f620005b636600462004881565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b6200047f6200179a565b6200065862000604366004620048b9565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c0016200035b565b62000331620006b3366004620048b9565b620017b2565b62000331620006ca36600462004b4d565b620018ae565b620006e7620006e136600462004c1a565b62001d27565b6040516200035b919062004cd4565b620004226200070736600462004a85565b60836020526000908152604090205463ffffffff1681565b6084546200034790600160c01b90046001600160401b031681565b620003316200074b36600462004981565b62001d5a565b6200033162000762366004620048ea565b62002084565b6200037b6200077936600462004a52565b6200213a565b6200047f62002165565b620003476200079a36600462004ce9565b6200224c565b62000331620007b136600462004a85565b6200241e565b62000331620007c836600462004a85565b620024c4565b6200047f600081565b6200047f62002568565b620008097f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016200035b565b6085546200083890600160801b900461ffff1681565b60405161ffff90911681526020016200035b565b620008e26200085d36600462004881565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b6040516200035b919060006080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200034790600160801b90046001600160401b031681565b620003316200095436600462004d16565b6200293d565b620004226200096b36600462004dae565b60826020526000908152604090205463ffffffff1681565b620008097f000000000000000000000000000000000000000000000000000000000000000081565b62000331620009bc36600462004a38565b62002c1c565b62000331620009d336600462004a52565b62002cb8565b60855462000347906001600160401b031681565b6200033162002ce1565b6084546200034790600160401b90046001600160401b031681565b6200033162000a2336600462004de0565b62002db1565b620008097f000000000000000000000000000000000000000000000000000000000000000081565b6200033162000a6236600462004e5c565b62002e8a565b608054620004229063ffffffff1681565b62000b1062000a8a366004620048b9565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff16610160820152610180016200035b565b600054600290610100900460ff1615801562000bb3575060005460ff8083169116105b62000c1c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c9d62003086565b62000cb860008051602062005cd68339815191528c620030f3565b62000cc5600088620030f3565b62000cf17fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59088620030f3565b62000d1d7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e88620030f3565b62000d497f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac88620030f3565b62000d757fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd89620030f3565b62000da17fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd0889620030f3565b62000dcd7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f489620030f3565b62000de860008051602062005c9683398151915289620030f3565b62000e2360008051602062005cd68339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f0620030ff565b62000e4f7f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f089620030f3565b62000e7b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb89620030f3565b62000eb660008051602062005cb68339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951620030ff565b62000ed160008051602062005cb683398151915287620030f3565b62000efd7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595187620030f3565b6073546074546001600160401b03600160401b9092048216911680821462000f3857604051632e4cc54360e11b815260040160405180910390fd5b600062000f60888888886000607460009054906101000a90046001600160401b03166200314a565b6001600160401b03838116600081815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b91829004909b1681029a909a17905560068a01805490911690931797870297909717909155600787018054909616909417909455607a54606f549390915290549251635d6717a560e01b81529394506001600160a01b038c811694635d6717a5946200105f9493831693600160581b9004909216916076916077919060040162004f9f565b600060405180830381600087803b1580156200107a57600080fd5b505af11580156200108f573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620010d79050565b60405180910390a15050505050505050505050565b63ffffffff821660009081526081602052604081206200110d908362003378565b90505b92915050565b63ffffffff811660009081526081602052604081206200111090620033bd565b60008051602062005cd683398151915262001151816200342e565b63ffffffff8916600090815260816020526040902062001178818a8a8a8a8a8a8a6200343a565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b90041615620011e0576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200121962002568565b6040518263ffffffff1660e01b81526004016200123891815260200190565b600060405180830381600087803b1580156200125357600080fd5b505af115801562001268573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005cd683398151915262001301816200342e565b63ffffffff8916600090815260816020526040902062001328818a8a8a8a8a8a8a620037d3565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562001390576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620013c962002568565b6040518263ffffffff1660e01b8152600401620013e891815260200190565b600060405180830381600087803b1580156200140357600080fd5b505af115801562001418573d6000803e3d6000fd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff82166000908152608160205260409020620014ac60008051602062005cd6833981519152336200213a565b6200150057606f5460ff1615620014d657604051630bc011ff60e21b815260040160405180910390fd5b620014e2818362003378565b6200150057604051630674f25160e11b815260040160405180910390fd5b6200150c818362003be1565b505050565b60008051602062005c968339815191526200152c816200342e565b6103e88261ffff1610806200154657506103ff8261ffff16115b156200156557604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620015d860008051602062005cb6833981519152336200213a565b6200167757608454600160801b90046001600160401b0316158062001628575060845442906200161d9062093a8090600160801b90046001600160401b03166200500a565b6001600160401b0316115b8062001658575060875442906200164d9062093a80906001600160401b03166200500a565b6001600160401b0316115b15620016775760405163692baaad60e11b815260040160405180910390fd5b6200168162003dd3565b565b600082815260346020526040902060010154620016a0816200342e565b6200150c838362003e52565b6001600160a01b0381163314620016d657604051630b4ad1cd60e31b815260040160405180910390fd5b620016e2828262003ebe565b5050565b60008051602062005c9683398151915262001701816200342e565b606f5460ff1662001743576084546001600160401b03600160c01b909104811690831610620017435760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001620015b1565b60006086546064620017ad919062005034565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd620017de816200342e565b63ffffffff82161580620017fd5750607e5463ffffffff908116908316115b156200181c57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200186357604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08620018da816200342e565b63ffffffff88161580620018f95750607e5463ffffffff908116908916115b156200191857604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff16151590036200195f57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff16156200199d576040516337c8fe0960e11b815260040160405180910390fd5b60808054600091908290620019b89063ffffffff166200504e565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001a069062004755565b62001a149392919062005074565b604051809103906000f08015801562001a31573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001ca5949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001ce5908d908d9088908e908e908e90600401620050ab565b600060405180830381600087803b15801562001d0057600080fd5b505af115801562001d15573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001d4f90878787878762003f28565b979650505050505050565b606f5460ff161562001d7f57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001dce92600160c01b9004811691166200500a565b6001600160401b0316111562001df757604051638a0704d360e01b815260040160405180910390fd5b6103e862001e0688886200510e565b6001600160401b0316111562001e2f57604051635acfba9d60e11b815260040160405180910390fd5b62001e418189898989898989620037d3565b62001e4d818762004068565b6085546001600160401b031660000362001f5b57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001ec9576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001f0262002568565b6040518263ffffffff1660e01b815260040162001f2191815260200190565b600060405180830381600087803b15801562001f3c57600080fd5b505af115801562001f51573d6000803e3d6000fd5b5050505062002025565b62001f668162004265565b600681018054600160801b90046001600160401b031690601062001f8a8362005131565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff1615620020a957604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88166000908152608160205260409020620020d081898989898989896200343a565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16200212f62003dd3565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b815230600482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015620021cf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620021f5919062005150565b6084549091506000906200221c906001600160401b03600160401b8204811691166200510e565b6001600160401b0316905080600003620022395760009250505090565b62002245818362005180565b9250505090565b606f5460009060ff16156200227457604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff1690819003620022ac576040516371653c1560e01b815260040160405180910390fd5b836001600160401b0316600003620022d757604051632590ccf960e01b815260040160405180910390fd5b63ffffffff8116600090815260816020526040812060848054919287926200230a9084906001600160401b03166200500a565b82546101009290920a6001600160401b03818102199093169183160217909155600683015416905060006200234087836200500a565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b031990921692909316919091171790559050620023d08362004265565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b60008051602062005c9683398151915262002439816200342e565b606f5460ff1662002474576085546001600160401b0390811690831610620024745760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001620015b1565b60008051602062005c96833981519152620024df816200342e565b62015180826001600160401b031611156200250d57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001620015b1565b60805460009063ffffffff168082036200258457506000919050565b6000816001600160401b03811115620025a157620025a162004aa3565b604051908082528060200260200182016040528015620025cb578160200160208202803683370190505b50905060005b828110156200263e5760816000620025eb83600162005197565b63ffffffff1663ffffffff168152602001908152602001600020600501548282815181106200261e576200261e620051ad565b6020908102919091010152806200263581620051c3565b915050620025d1565b50600060205b836001146200289a5760006200265c600286620051df565b6200266960028762005180565b62002675919062005197565b90506000816001600160401b0381111562002694576200269462004aa3565b604051908082528060200260200182016040528015620026be578160200160208202803683370190505b50905060005b828110156200284657620026da600184620051f6565b81148015620026f55750620026f1600288620051df565b6001145b156200277d57856200270982600262005034565b815181106200271c576200271c620051ad565b60200260200101518560405160200162002740929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106200276b576200276b620051ad565b60200260200101818152505062002831565b856200278b82600262005034565b815181106200279e576200279e620051ad565b602002602001015186826002620027b6919062005034565b620027c390600162005197565b81518110620027d657620027d6620051ad565b6020026020010151604051602001620027f9929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620028245762002824620051ad565b6020026020010181815250505b806200283d81620051c3565b915050620026c4565b5080945081955083846040516020016200286a929190918252602082015260400190565b60405160208183030381529060405280519060200120935082806200288f906200520c565b935050505062002644565b600083600081518110620028b257620028b2620051ad565b6020026020010151905060005b828110156200293357604080516020810184905290810185905260600160408051601f198184030181528282528051602091820120908301879052908201869052925060600160405160208183030381529060405280519060200120935080806200292a90620051c3565b915050620028bf565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac62002969816200342e565b63ffffffff84161580620029885750607e5463ffffffff908116908516115b15620029a757604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff1690819003620029e8576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002a3757604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002a7e57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002abc57604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002b3c8462001116565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002b929216908b908b9060040162005226565b600060405180830381600087803b15801562002bad57600080fd5b505af115801562002bc2573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002c48816200342e565b683635c9adc5dea0000082118062002c635750633b9aca0082105b1562002c8257604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620015b1565b60008281526034602052604090206001015462002cd5816200342e565b6200150c838362003ebe565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002d0d816200342e565b6087805467ffffffffffffffff1916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc1697691600480830192600092919082900301818387803b15801562002d8b57600080fd5b505af115801562002da0573d6000803e3d6000fd5b5050505062002dae62004330565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62002ddd816200342e565b6001600160401b03841660009081526083602052604090205463ffffffff161562002e1b576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b03871660009081526082602052604090205463ffffffff161562002e5957604051630d409b9360e41b815260040160405180910390fd5b600062002e6c888888888760006200314a565b60008080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002eb6816200342e565b607e805460009190829062002ed19063ffffffff166200504e565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620030749695949392919062005266565b60405180910390a25050505050505050565b600054610100900460ff16620016815760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000c13565b620016e2828262003e52565b600082815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6080805460009182918290620031669063ffffffff166200504e565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000876001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff16021790555080608260008a6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150878260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550868260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620033659594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b03828116600090815260048501602052604081205490924292620033ab9291811691166200500a565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b03161562003411575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002dae813362004389565b60078801546000906001600160401b039081169087161015620034705760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620035115760068901546001600160401b03600160801b90910481169089161115620034ba5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200350a57604051632bd2e3e760e01b815260040160405180910390fd5b5062003586565b506001600160401b0385166000908152600289016020526040902054806200354c576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b909104811690871611156200358657604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620035bf5750876001600160401b0316876001600160401b031611155b80620035e3575060068901546001600160401b03600160c01b909104811690881611155b15620036025760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b900481169086161462003649576040516332a2a77f60e01b815260040160405180910390fd5b60006200365b8a888888868962003f28565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620036929190620052bf565b602060405180830381855afa158015620036b0573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620036d5919062005150565b620036e19190620051df565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200372591889190600401620052dd565b602060405180830381865afa15801562003743573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200376991906200531a565b62003787576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620037c65760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620037e18a620033bd565b60078b01549091506001600160401b039081169089161015620038175760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620038ba5760068a01546001600160401b03600160801b9091048116908a161115620038615760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620038b357604051632bd2e3e760e01b815260040160405180910390fd5b506200392a565b6001600160401b038816600090815260028b016020526040902054915081620038f6576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200392a57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b0316116200395d5760405163b9b18f5760e01b815260040160405180910390fd5b60006200396f8b8a8a8a878b62003f28565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620039a69190620052bf565b602060405180830381855afa158015620039c4573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620039e9919062005150565b620039f59190620051df565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003a3991899190600401620052dd565b602060405180830381865afa15801562003a57573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003a7d91906200531a565b62003a9b576040516309bde33960e01b815260040160405180910390fd5b600062003aa9848b6200510e565b905062003b0287826001600160401b031662003ac462002165565b62003ad0919062005034565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620043b3565b80608460088282829054906101000a90046001600160401b031662003b2891906200500a565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b15801562003bb957600080fd5b505af115801562003bce573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003c20575060068201546001600160401b03600160801b9091048116908216115b1562003c3f5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003cfb62002568565b6040518263ffffffff1660e01b815260040162003d1a91815260200190565b600060405180830381600087803b15801562003d3557600080fd5b505af115801562003d4a573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003e2f57600080fd5b505af115801562003e44573d6000803e3d6000fd5b505050506200168162004407565b62003e5e82826200213a565b620016e25760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003eca82826200213a565b15620016e25760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003f5e575081155b1562003f7d5760405163340c614f60e11b815260040160405180910390fd5b8062003f9c576040516366385b5160e01b815260040160405180910390fd5b62003fa78462004464565b62003fc5576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b60006200407583620033bd565b9050816000806200408784846200510e565b6085546001600160401b039182169250600091620040ae91600160401b90041642620051f6565b90505b846001600160401b0316846001600160401b03161462004138576001600160401b0380851660009081526003890160205260409020600181015490911682101562004113576001810154600160401b90046001600160401b0316945062004131565b6200411f86866200510e565b6001600160401b031693505062004138565b50620040b1565b6000620041468484620051f6565b905083811015620041a457808403600c811162004164578062004167565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a60865402816200419957620041996200516a565b04608655506200421c565b838103600c8111620041b75780620041ba565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a76400000281620041f457620041f46200516a565b04905080608654670de0b6b3a764000002816200421557620042156200516a565b0460865550505b683635c9adc5dea0000060865411156200424357683635c9adc5dea000006086556200425b565b633b9aca0060865410156200425b57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002dae576006810154600090620042b090600160c01b90046001600160401b031660016200500a565b9050620042be828262003378565b15620016e2576006820154600090600290620042ec908490600160801b90046001600160401b03166200510e565b620042f891906200533e565b6200430490836200500a565b905062004312838262003378565b1562004324576200150c838262003be1565b6200150c838362003be1565b606f5460ff166200435457604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6200439582826200213a565b620016e257604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526200150c908490620044ea565b606f5460ff16156200442c57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b0383161080156200449b575067ffffffff00000001604083901c6001600160401b0316105b8015620044bc575067ffffffff00000001608083901c6001600160401b0316105b8015620044d4575067ffffffff0000000160c083901c105b15620044e257506001919050565b506000919050565b600062004541826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620045c39092919063ffffffff16565b8051909150156200150c57808060200190518101906200456291906200531a565b6200150c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000c13565b6060620045d48484600085620045dc565b949350505050565b6060824710156200463f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000c13565b600080866001600160a01b031685876040516200465d9190620052bf565b60006040518083038185875af1925050503d80600081146200469c576040519150601f19603f3d011682016040523d82523d6000602084013e620046a1565b606091505b509150915062001d4f8783838760608315620047225782516000036200471a576001600160a01b0385163b6200471a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000c13565b5081620045d4565b620045d48383815115620047395781518083602001fd5b8060405162461bcd60e51b815260040162000c13919062004cd4565b61092e806200536883390190565b6001600160a01b038116811462002dae57600080fd5b80356001600160401b03811681146200342957600080fd5b6000806000806000806000806000806101408b8d031215620047b257600080fd5b8a35620047bf8162004763565b9950620047cf60208c0162004779565b9850620047df60408c0162004779565b975060608b0135620047f18162004763565b965060808b0135620048038162004763565b955060a08b0135620048158162004763565b945060c08b0135620048278162004763565b935060e08b0135620048398162004763565b92506200484a6101008c0162004779565b91506200485b6101208c0162004779565b90509295989b9194979a5092959850565b803563ffffffff811681146200342957600080fd5b600080604083850312156200489557600080fd5b620048a0836200486c565b9150620048b06020840162004779565b90509250929050565b600060208284031215620048cc57600080fd5b6200110d826200486c565b8061030081018310156200111057600080fd5b6000806000806000806000806103e0898b0312156200490857600080fd5b62004913896200486c565b97506200492360208a0162004779565b96506200493360408a0162004779565b95506200494360608a0162004779565b94506200495360808a0162004779565b935060a0890135925060c08901359150620049728a60e08b01620048d7565b90509295985092959890939650565b6000806000806000806000806103e0898b0312156200499f57600080fd5b620049aa896200486c565b9750620049ba60208a0162004779565b9650620049ca60408a0162004779565b9550620049da60608a0162004779565b94506080890135935060a0890135925060c0890135620049fa8162004763565b9150620049728a60e08b01620048d7565b60006020828403121562004a1e57600080fd5b813561ffff8116811462004a3157600080fd5b9392505050565b60006020828403121562004a4b57600080fd5b5035919050565b6000806040838503121562004a6657600080fd5b82359150602083013562004a7a8162004763565b809150509250929050565b60006020828403121562004a9857600080fd5b6200110d8262004779565b634e487b7160e01b600052604160045260246000fd5b600082601f83011262004acb57600080fd5b81356001600160401b038082111562004ae85762004ae862004aa3565b604051601f8301601f19908116603f0116810190828211818310171562004b135762004b1362004aa3565b8160405283815286602085880101111562004b2d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121562004b6957600080fd5b62004b74886200486c565b965062004b846020890162004779565b9550604088013562004b968162004763565b9450606088013562004ba88162004763565b9350608088013562004bba8162004763565b925060a08801356001600160401b038082111562004bd757600080fd5b62004be58b838c0162004ab9565b935060c08a013591508082111562004bfc57600080fd5b5062004c0b8a828b0162004ab9565b91505092959891949750929550565b60008060008060008060c0878903121562004c3457600080fd5b62004c3f876200486c565b955062004c4f6020880162004779565b945062004c5f6040880162004779565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004c9d57818101518382015260200162004c83565b50506000910152565b6000815180845262004cc081602086016020860162004c80565b601f01601f19169290920160200192915050565b6020815260006200110d602083018462004ca6565b6000806040838503121562004cfd57600080fd5b62004d088362004779565b946020939093013593505050565b6000806000806060858703121562004d2d57600080fd5b843562004d3a8162004763565b935062004d4a602086016200486c565b925060408501356001600160401b038082111562004d6757600080fd5b818701915087601f83011262004d7c57600080fd5b81358181111562004d8c57600080fd5b88602082850101111562004d9f57600080fd5b95989497505060200194505050565b60006020828403121562004dc157600080fd5b813562004a318162004763565b803560ff811681146200342957600080fd5b60008060008060008060c0878903121562004dfa57600080fd5b863562004e078162004763565b9550602087013562004e198162004763565b945062004e296040880162004779565b935062004e396060880162004779565b92506080870135915062004e5060a0880162004dce565b90509295509295509295565b60008060008060008060c0878903121562004e7657600080fd5b863562004e838162004763565b9550602087013562004e958162004763565b945062004ea56040880162004779565b935062004eb56060880162004dce565b92506080870135915060a08701356001600160401b0381111562004ed857600080fd5b62004ee689828a0162004ab9565b9150509295509295509295565b8054600090600181811c908083168062004f0e57607f831692505b6020808410820362004f3057634e487b7160e01b600052602260045260246000fd5b8388526020880182801562004f4e576001811462004f655762004f92565b60ff198716825285151560051b8201975062004f92565b60008981526020902060005b8781101562004f8c5781548482015290860190840162004f71565b83019850505b5050505050505092915050565b6001600160a01b0386811682528516602082015260a06040820181905260009062004fcd9083018662004ef3565b828103606084015262004fe1818662004ef3565b9150508260808301529695505050505050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b038181168382160190808211156200502d576200502d62004ff4565b5092915050565b808202811582820484141762001110576200111062004ff4565b600063ffffffff8083168181036200506a576200506a62004ff4565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620050a29083018462004ca6565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c060808201819052600090620050ed9083018562004ca6565b82810360a084015262005101818562004ca6565b9998505050505050505050565b6001600160401b038281168282160390808211156200502d576200502d62004ff4565b60006001600160401b038083168181036200506a576200506a62004ff4565b6000602082840312156200516357600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b6000826200519257620051926200516a565b500490565b8082018082111562001110576200111062004ff4565b634e487b7160e01b600052603260045260246000fd5b600060018201620051d857620051d862004ff4565b5060010190565b600082620051f157620051f16200516a565b500690565b8181038181111562001110576200111062004ff4565b6000816200521e576200521e62004ff4565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a08201819052600090620052b39083018462004ca6565b98975050505050505050565b60008251620052d381846020870162004c80565b9190910192915050565b61032081016103008085843782018360005b600181101562005310578151835260209283019290910190600101620052ef565b5050509392505050565b6000602082840312156200532d57600080fd5b8151801515811462004a3157600080fd5b60006001600160401b03808416806200535b576200535b6200516a565b9216919091049291505056fe60a06040526040516200092e3803806200092e833981016040819052620000269162000383565b828162000034828262000060565b50506001600160a01b038216608052620000576200005160805190565b620000c6565b50505062000481565b6200006b8262000138565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115620000b857620000b38282620001b8565b505050565b620000c262000235565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620001086000805160206200090e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001358162000257565b50565b806001600160a01b03163b6000036200017457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b031684604051620001d7919062000463565b600060405180830381855af49150503d806000811462000214576040519150601f19603f3d011682016040523d82523d6000602084013e62000219565b606091505b5090925090506200022c8583836200029a565b95945050505050565b3415620002555760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166200028357604051633173bdd160e11b8152600060048201526024016200016b565b806000805160206200090e83398151915262000197565b606082620002b357620002ad8262000300565b620002f9565b8151158015620002cb57506001600160a01b0384163b155b15620002f657604051639996b31560e01b81526001600160a01b03851660048201526024016200016b565b50805b9392505050565b805115620003115780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b03811681146200034257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200037a57818101518382015260200162000360565b50506000910152565b6000806000606084860312156200039957600080fd5b620003a4846200032a565b9250620003b4602085016200032a565b60408501519092506001600160401b0380821115620003d257600080fd5b818601915086601f830112620003e757600080fd5b815181811115620003fc57620003fc62000347565b604051601f8201601f19908116603f0116810190838211818310171562000427576200042762000347565b816040528281528960208487010111156200044157600080fd5b620004548360208301602088016200035d565b80955050505050509250925092565b60008251620004778184602087016200035d565b9190910192915050565b6080516104726200049c6000396000601001526104726000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100e5565b60008061008e36600481846102fd565b81019061009b919061033d565b915091506100a98282610109565b5050565b60006100e07f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610104573d6000f35b3d6000fd5b61011282610164565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561015c5761015782826101e0565b505050565b6100a9610256565b806001600160a01b03163b60000361019f57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101fd919061040d565b600060405180830381855af49150503d8060008114610238576040519150601f19603f3d011682016040523d82523d6000602084013e61023d565b606091505b509150915061024d858383610275565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b60608261028a57610285826102d4565b6102cd565b81511580156102a157506001600160a01b0384163b155b156102ca57604051639996b31560e01b81526001600160a01b0385166004820152602401610196565b50805b9392505050565b8051156102e45780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6000808585111561030d57600080fd5b8386111561031a57600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035057600080fd5b82356001600160a01b038116811461036757600080fd5b9150602083013567ffffffffffffffff8082111561038457600080fd5b818501915085601f83011261039857600080fd5b8135818111156103aa576103aa610327565b604051601f8201601f19908116603f011681019083821181831017156103d2576103d2610327565b816040528281528860208487010111156103eb57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000825160005b8181101561042e5760208186018101518583015201610414565b50600092019182525091905056fea2646970667358221220b682b645e70b0310ca18f6b5889dc8bdacf4b460a01fb9d34b74753f65dc9ae364736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a264697066735822122007c6fdbac14414801e0b7d94dedb9fc404d41fb52ef6f8b62d9f4b867dc7604764736f6c63430008140033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620003155760003560e01c8063841b24d711620001a9578063c1acbc3411620000f7578063dbc16976116200009e578063dbc1697614620009ed578063dde0ff7714620009f7578063e0bfd3d21462000a12578063e46761c41462000a29578063f34eb8eb1462000a51578063f4e926751462000a68578063f9c4c2ae1462000a7957600080fd5b8063c1acbc341462000928578063c4c928c21462000943578063ceee281d146200095a578063d02103ca1462000983578063d5073f6f14620009ab578063d547741f14620009c2578063d939b31514620009d957600080fd5b80639c9f3dfe116200015c5780639c9f3dfe14620007a0578063a066215c14620007b7578063a217fddf14620007ce578063a2967d9914620007d7578063a3c573eb14620007e1578063afd23cbe1462000822578063b99d0ad7146200084c57600080fd5b8063841b24d7146200071f57806387c20c01146200073a5780638bd4f071146200075157806391d14854146200076857806399f5634e146200077f5780639a908e73146200078957600080fd5b806325280169116200026757806355a71ee0116200021a57806355a71ee014620005a55780636046916914620005e957806365c0504d14620005f35780637222020f14620006a2578063727885e914620006b95780637975fcfe14620006d05780637fb6e76a14620006f657600080fd5b806325280169146200048e5780632f2ff15d146200054357806330c27dde146200055a57806336568abe146200056e578063394218e91462000585578063477fa270146200059c57600080fd5b80631489ed1011620002cc5780631489ed1014620003d557806315064c9614620003ec5780631608859c14620003fa5780631796a1ae14620004115780631816b7e514620004385780632072f6c5146200044f578063248a9ca3146200045957600080fd5b80630645af09146200031a578063066ec0121462000333578063080b311114620003645780630a0d9fbe146200038c57806311f6b28714620003a757806312b86e1914620003be575b600080fd5b620003316200032b36600462004791565b62000b90565b005b60845462000347906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b6200037b6200037536600462004881565b620010ec565b60405190151581526020016200035b565b6085546200034790600160401b90046001600160401b031681565b62000347620003b8366004620048b9565b62001116565b62000331620003cf366004620048ea565b62001136565b62000331620003e636600462004981565b620012e6565b606f546200037b9060ff1681565b620003316200040b36600462004881565b6200147c565b607e54620004229063ffffffff1681565b60405163ffffffff90911681526020016200035b565b620003316200044936600462004a0b565b62001511565b62000331620015bd565b6200047f6200046a36600462004a38565b60009081526034602052604090206001015490565b6040519081526020016200035b565b6200050f6200049f36600462004881565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b039081169183019190915292820151909216908201526060016200035b565b620003316200055436600462004a52565b62001683565b60875462000347906001600160401b031681565b620003316200057f36600462004a52565b620016ac565b620003316200059636600462004a85565b620016e6565b6086546200047f565b6200047f620005b636600462004881565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b6200047f6200179a565b6200065862000604366004620048b9565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c0016200035b565b62000331620006b3366004620048b9565b620017b2565b62000331620006ca36600462004b4d565b620018ae565b620006e7620006e136600462004c1a565b62001d27565b6040516200035b919062004cd4565b620004226200070736600462004a85565b60836020526000908152604090205463ffffffff1681565b6084546200034790600160c01b90046001600160401b031681565b620003316200074b36600462004981565b62001d5a565b6200033162000762366004620048ea565b62002084565b6200037b6200077936600462004a52565b6200213a565b6200047f62002165565b620003476200079a36600462004ce9565b6200224c565b62000331620007b136600462004a85565b6200241e565b62000331620007c836600462004a85565b620024c4565b6200047f600081565b6200047f62002568565b620008097f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016200035b565b6085546200083890600160801b900461ffff1681565b60405161ffff90911681526020016200035b565b620008e26200085d36600462004881565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b6040516200035b919060006080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200034790600160801b90046001600160401b031681565b620003316200095436600462004d16565b6200293d565b620004226200096b36600462004dae565b60826020526000908152604090205463ffffffff1681565b620008097f000000000000000000000000000000000000000000000000000000000000000081565b62000331620009bc36600462004a38565b62002c1c565b62000331620009d336600462004a52565b62002cb8565b60855462000347906001600160401b031681565b6200033162002ce1565b6084546200034790600160401b90046001600160401b031681565b6200033162000a2336600462004de0565b62002db1565b620008097f000000000000000000000000000000000000000000000000000000000000000081565b6200033162000a6236600462004e5c565b62002e8a565b608054620004229063ffffffff1681565b62000b1062000a8a366004620048b9565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff16610160820152610180016200035b565b600054600290610100900460ff1615801562000bb3575060005460ff8083169116105b62000c1c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c9d62003086565b62000cb860008051602062005cd68339815191528c620030f3565b62000cc5600088620030f3565b62000cf17fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59088620030f3565b62000d1d7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e88620030f3565b62000d497f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac88620030f3565b62000d757fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd89620030f3565b62000da17fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd0889620030f3565b62000dcd7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f489620030f3565b62000de860008051602062005c9683398151915289620030f3565b62000e2360008051602062005cd68339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f0620030ff565b62000e4f7f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f089620030f3565b62000e7b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb89620030f3565b62000eb660008051602062005cb68339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951620030ff565b62000ed160008051602062005cb683398151915287620030f3565b62000efd7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595187620030f3565b6073546074546001600160401b03600160401b9092048216911680821462000f3857604051632e4cc54360e11b815260040160405180910390fd5b600062000f60888888886000607460009054906101000a90046001600160401b03166200314a565b6001600160401b03838116600081815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b91829004909b1681029a909a17905560068a01805490911690931797870297909717909155600787018054909616909417909455607a54606f549390915290549251635d6717a560e01b81529394506001600160a01b038c811694635d6717a5946200105f9493831693600160581b9004909216916076916077919060040162004f9f565b600060405180830381600087803b1580156200107a57600080fd5b505af11580156200108f573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620010d79050565b60405180910390a15050505050505050505050565b63ffffffff821660009081526081602052604081206200110d908362003378565b90505b92915050565b63ffffffff811660009081526081602052604081206200111090620033bd565b60008051602062005cd683398151915262001151816200342e565b63ffffffff8916600090815260816020526040902062001178818a8a8a8a8a8a8a6200343a565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b90041615620011e0576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200121962002568565b6040518263ffffffff1660e01b81526004016200123891815260200190565b600060405180830381600087803b1580156200125357600080fd5b505af115801562001268573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005cd683398151915262001301816200342e565b63ffffffff8916600090815260816020526040902062001328818a8a8a8a8a8a8a620037d3565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b9004161562001390576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620013c962002568565b6040518263ffffffff1660e01b8152600401620013e891815260200190565b600060405180830381600087803b1580156200140357600080fd5b505af115801562001418573d6000803e3d6000fd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff82166000908152608160205260409020620014ac60008051602062005cd6833981519152336200213a565b6200150057606f5460ff1615620014d657604051630bc011ff60e21b815260040160405180910390fd5b620014e2818362003378565b6200150057604051630674f25160e11b815260040160405180910390fd5b6200150c818362003be1565b505050565b60008051602062005c968339815191526200152c816200342e565b6103e88261ffff1610806200154657506103ff8261ffff16115b156200156557604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620015d860008051602062005cb6833981519152336200213a565b6200167757608454600160801b90046001600160401b0316158062001628575060845442906200161d9062093a8090600160801b90046001600160401b03166200500a565b6001600160401b0316115b8062001658575060875442906200164d9062093a80906001600160401b03166200500a565b6001600160401b0316115b15620016775760405163692baaad60e11b815260040160405180910390fd5b6200168162003dd3565b565b600082815260346020526040902060010154620016a0816200342e565b6200150c838362003e52565b6001600160a01b0381163314620016d657604051630b4ad1cd60e31b815260040160405180910390fd5b620016e2828262003ebe565b5050565b60008051602062005c9683398151915262001701816200342e565b606f5460ff1662001743576084546001600160401b03600160c01b909104811690831610620017435760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001620015b1565b60006086546064620017ad919062005034565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd620017de816200342e565b63ffffffff82161580620017fd5750607e5463ffffffff908116908316115b156200181c57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200186357604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08620018da816200342e565b63ffffffff88161580620018f95750607e5463ffffffff908116908916115b156200191857604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff16151590036200195f57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff16156200199d576040516337c8fe0960e11b815260040160405180910390fd5b60808054600091908290620019b89063ffffffff166200504e565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001a069062004755565b62001a149392919062005074565b604051809103906000f08015801562001a31573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001ca5949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001ce5908d908d9088908e908e908e90600401620050ab565b600060405180830381600087803b15801562001d0057600080fd5b505af115801562001d15573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001d4f90878787878762003f28565b979650505050505050565b606f5460ff161562001d7f57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001dce92600160c01b9004811691166200500a565b6001600160401b0316111562001df757604051638a0704d360e01b815260040160405180910390fd5b6103e862001e0688886200510e565b6001600160401b0316111562001e2f57604051635acfba9d60e11b815260040160405180910390fd5b62001e418189898989898989620037d3565b62001e4d818762004068565b6085546001600160401b031660000362001f5b57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001ec9576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001f0262002568565b6040518263ffffffff1660e01b815260040162001f2191815260200190565b600060405180830381600087803b15801562001f3c57600080fd5b505af115801562001f51573d6000803e3d6000fd5b5050505062002025565b62001f668162004265565b600681018054600160801b90046001600160401b031690601062001f8a8362005131565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff1615620020a957604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88166000908152608160205260409020620020d081898989898989896200343a565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16200212f62003dd3565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b815230600482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015620021cf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620021f5919062005150565b6084549091506000906200221c906001600160401b03600160401b8204811691166200510e565b6001600160401b0316905080600003620022395760009250505090565b62002245818362005180565b9250505090565b606f5460009060ff16156200227457604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff1690819003620022ac576040516371653c1560e01b815260040160405180910390fd5b836001600160401b0316600003620022d757604051632590ccf960e01b815260040160405180910390fd5b63ffffffff8116600090815260816020526040812060848054919287926200230a9084906001600160401b03166200500a565b82546101009290920a6001600160401b03818102199093169183160217909155600683015416905060006200234087836200500a565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b031990921692909316919091171790559050620023d08362004265565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b60008051602062005c9683398151915262002439816200342e565b606f5460ff1662002474576085546001600160401b0390811690831610620024745760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001620015b1565b60008051602062005c96833981519152620024df816200342e565b62015180826001600160401b031611156200250d57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001620015b1565b60805460009063ffffffff168082036200258457506000919050565b6000816001600160401b03811115620025a157620025a162004aa3565b604051908082528060200260200182016040528015620025cb578160200160208202803683370190505b50905060005b828110156200263e5760816000620025eb83600162005197565b63ffffffff1663ffffffff168152602001908152602001600020600501548282815181106200261e576200261e620051ad565b6020908102919091010152806200263581620051c3565b915050620025d1565b50600060205b836001146200289a5760006200265c600286620051df565b6200266960028762005180565b62002675919062005197565b90506000816001600160401b0381111562002694576200269462004aa3565b604051908082528060200260200182016040528015620026be578160200160208202803683370190505b50905060005b828110156200284657620026da600184620051f6565b81148015620026f55750620026f1600288620051df565b6001145b156200277d57856200270982600262005034565b815181106200271c576200271c620051ad565b60200260200101518560405160200162002740929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106200276b576200276b620051ad565b60200260200101818152505062002831565b856200278b82600262005034565b815181106200279e576200279e620051ad565b602002602001015186826002620027b6919062005034565b620027c390600162005197565b81518110620027d657620027d6620051ad565b6020026020010151604051602001620027f9929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620028245762002824620051ad565b6020026020010181815250505b806200283d81620051c3565b915050620026c4565b5080945081955083846040516020016200286a929190918252602082015260400190565b60405160208183030381529060405280519060200120935082806200288f906200520c565b935050505062002644565b600083600081518110620028b257620028b2620051ad565b6020026020010151905060005b828110156200293357604080516020810184905290810185905260600160408051601f198184030181528282528051602091820120908301879052908201869052925060600160405160208183030381529060405280519060200120935080806200292a90620051c3565b915050620028bf565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac62002969816200342e565b63ffffffff84161580620029885750607e5463ffffffff908116908516115b15620029a757604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff1690819003620029e8576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002a3757604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002a7e57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002abc57604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002b3c8462001116565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002b929216908b908b9060040162005226565b600060405180830381600087803b15801562002bad57600080fd5b505af115801562002bc2573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002c48816200342e565b683635c9adc5dea0000082118062002c635750633b9aca0082105b1562002c8257604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620015b1565b60008281526034602052604090206001015462002cd5816200342e565b6200150c838362003ebe565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002d0d816200342e565b6087805467ffffffffffffffff1916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc1697691600480830192600092919082900301818387803b15801562002d8b57600080fd5b505af115801562002da0573d6000803e3d6000fd5b5050505062002dae62004330565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62002ddd816200342e565b6001600160401b03841660009081526083602052604090205463ffffffff161562002e1b576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b03871660009081526082602052604090205463ffffffff161562002e5957604051630d409b9360e41b815260040160405180910390fd5b600062002e6c888888888760006200314a565b60008080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002eb6816200342e565b607e805460009190829062002ed19063ffffffff166200504e565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620030749695949392919062005266565b60405180910390a25050505050505050565b600054610100900460ff16620016815760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000c13565b620016e2828262003e52565b600082815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6080805460009182918290620031669063ffffffff166200504e565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000876001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff16021790555080608260008a6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150878260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550868260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620033659594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b03828116600090815260048501602052604081205490924292620033ab9291811691166200500a565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b03161562003411575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002dae813362004389565b60078801546000906001600160401b039081169087161015620034705760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620035115760068901546001600160401b03600160801b90910481169089161115620034ba5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200350a57604051632bd2e3e760e01b815260040160405180910390fd5b5062003586565b506001600160401b0385166000908152600289016020526040902054806200354c576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b909104811690871611156200358657604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620035bf5750876001600160401b0316876001600160401b031611155b80620035e3575060068901546001600160401b03600160c01b909104811690881611155b15620036025760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b900481169086161462003649576040516332a2a77f60e01b815260040160405180910390fd5b60006200365b8a888888868962003f28565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620036929190620052bf565b602060405180830381855afa158015620036b0573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620036d5919062005150565b620036e19190620051df565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200372591889190600401620052dd565b602060405180830381865afa15801562003743573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200376991906200531a565b62003787576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620037c65760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620037e18a620033bd565b60078b01549091506001600160401b039081169089161015620038175760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620038ba5760068a01546001600160401b03600160801b9091048116908a161115620038615760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620038b357604051632bd2e3e760e01b815260040160405180910390fd5b506200392a565b6001600160401b038816600090815260028b016020526040902054915081620038f6576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200392a57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b0316116200395d5760405163b9b18f5760e01b815260040160405180910390fd5b60006200396f8b8a8a8a878b62003f28565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620039a69190620052bf565b602060405180830381855afa158015620039c4573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620039e9919062005150565b620039f59190620051df565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003a3991899190600401620052dd565b602060405180830381865afa15801562003a57573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003a7d91906200531a565b62003a9b576040516309bde33960e01b815260040160405180910390fd5b600062003aa9848b6200510e565b905062003b0287826001600160401b031662003ac462002165565b62003ad0919062005034565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620043b3565b80608460088282829054906101000a90046001600160401b031662003b2891906200500a565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b15801562003bb957600080fd5b505af115801562003bce573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003c20575060068201546001600160401b03600160801b9091048116908216115b1562003c3f5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003cfb62002568565b6040518263ffffffff1660e01b815260040162003d1a91815260200190565b600060405180830381600087803b15801562003d3557600080fd5b505af115801562003d4a573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003e2f57600080fd5b505af115801562003e44573d6000803e3d6000fd5b505050506200168162004407565b62003e5e82826200213a565b620016e25760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003eca82826200213a565b15620016e25760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003f5e575081155b1562003f7d5760405163340c614f60e11b815260040160405180910390fd5b8062003f9c576040516366385b5160e01b815260040160405180910390fd5b62003fa78462004464565b62003fc5576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b60006200407583620033bd565b9050816000806200408784846200510e565b6085546001600160401b039182169250600091620040ae91600160401b90041642620051f6565b90505b846001600160401b0316846001600160401b03161462004138576001600160401b0380851660009081526003890160205260409020600181015490911682101562004113576001810154600160401b90046001600160401b0316945062004131565b6200411f86866200510e565b6001600160401b031693505062004138565b50620040b1565b6000620041468484620051f6565b905083811015620041a457808403600c811162004164578062004167565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a60865402816200419957620041996200516a565b04608655506200421c565b838103600c8111620041b75780620041ba565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a76400000281620041f457620041f46200516a565b04905080608654670de0b6b3a764000002816200421557620042156200516a565b0460865550505b683635c9adc5dea0000060865411156200424357683635c9adc5dea000006086556200425b565b633b9aca0060865410156200425b57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002dae576006810154600090620042b090600160c01b90046001600160401b031660016200500a565b9050620042be828262003378565b15620016e2576006820154600090600290620042ec908490600160801b90046001600160401b03166200510e565b620042f891906200533e565b6200430490836200500a565b905062004312838262003378565b1562004324576200150c838262003be1565b6200150c838362003be1565b606f5460ff166200435457604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6200439582826200213a565b620016e257604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526200150c908490620044ea565b606f5460ff16156200442c57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b0383161080156200449b575067ffffffff00000001604083901c6001600160401b0316105b8015620044bc575067ffffffff00000001608083901c6001600160401b0316105b8015620044d4575067ffffffff0000000160c083901c105b15620044e257506001919050565b506000919050565b600062004541826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620045c39092919063ffffffff16565b8051909150156200150c57808060200190518101906200456291906200531a565b6200150c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000c13565b6060620045d48484600085620045dc565b949350505050565b6060824710156200463f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000c13565b600080866001600160a01b031685876040516200465d9190620052bf565b60006040518083038185875af1925050503d80600081146200469c576040519150601f19603f3d011682016040523d82523d6000602084013e620046a1565b606091505b509150915062001d4f8783838760608315620047225782516000036200471a576001600160a01b0385163b6200471a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000c13565b5081620045d4565b620045d48383815115620047395781518083602001fd5b8060405162461bcd60e51b815260040162000c13919062004cd4565b61092e806200536883390190565b6001600160a01b038116811462002dae57600080fd5b80356001600160401b03811681146200342957600080fd5b6000806000806000806000806000806101408b8d031215620047b257600080fd5b8a35620047bf8162004763565b9950620047cf60208c0162004779565b9850620047df60408c0162004779565b975060608b0135620047f18162004763565b965060808b0135620048038162004763565b955060a08b0135620048158162004763565b945060c08b0135620048278162004763565b935060e08b0135620048398162004763565b92506200484a6101008c0162004779565b91506200485b6101208c0162004779565b90509295989b9194979a5092959850565b803563ffffffff811681146200342957600080fd5b600080604083850312156200489557600080fd5b620048a0836200486c565b9150620048b06020840162004779565b90509250929050565b600060208284031215620048cc57600080fd5b6200110d826200486c565b8061030081018310156200111057600080fd5b6000806000806000806000806103e0898b0312156200490857600080fd5b62004913896200486c565b97506200492360208a0162004779565b96506200493360408a0162004779565b95506200494360608a0162004779565b94506200495360808a0162004779565b935060a0890135925060c08901359150620049728a60e08b01620048d7565b90509295985092959890939650565b6000806000806000806000806103e0898b0312156200499f57600080fd5b620049aa896200486c565b9750620049ba60208a0162004779565b9650620049ca60408a0162004779565b9550620049da60608a0162004779565b94506080890135935060a0890135925060c0890135620049fa8162004763565b9150620049728a60e08b01620048d7565b60006020828403121562004a1e57600080fd5b813561ffff8116811462004a3157600080fd5b9392505050565b60006020828403121562004a4b57600080fd5b5035919050565b6000806040838503121562004a6657600080fd5b82359150602083013562004a7a8162004763565b809150509250929050565b60006020828403121562004a9857600080fd5b6200110d8262004779565b634e487b7160e01b600052604160045260246000fd5b600082601f83011262004acb57600080fd5b81356001600160401b038082111562004ae85762004ae862004aa3565b604051601f8301601f19908116603f0116810190828211818310171562004b135762004b1362004aa3565b8160405283815286602085880101111562004b2d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121562004b6957600080fd5b62004b74886200486c565b965062004b846020890162004779565b9550604088013562004b968162004763565b9450606088013562004ba88162004763565b9350608088013562004bba8162004763565b925060a08801356001600160401b038082111562004bd757600080fd5b62004be58b838c0162004ab9565b935060c08a013591508082111562004bfc57600080fd5b5062004c0b8a828b0162004ab9565b91505092959891949750929550565b60008060008060008060c0878903121562004c3457600080fd5b62004c3f876200486c565b955062004c4f6020880162004779565b945062004c5f6040880162004779565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004c9d57818101518382015260200162004c83565b50506000910152565b6000815180845262004cc081602086016020860162004c80565b601f01601f19169290920160200192915050565b6020815260006200110d602083018462004ca6565b6000806040838503121562004cfd57600080fd5b62004d088362004779565b946020939093013593505050565b6000806000806060858703121562004d2d57600080fd5b843562004d3a8162004763565b935062004d4a602086016200486c565b925060408501356001600160401b038082111562004d6757600080fd5b818701915087601f83011262004d7c57600080fd5b81358181111562004d8c57600080fd5b88602082850101111562004d9f57600080fd5b95989497505060200194505050565b60006020828403121562004dc157600080fd5b813562004a318162004763565b803560ff811681146200342957600080fd5b60008060008060008060c0878903121562004dfa57600080fd5b863562004e078162004763565b9550602087013562004e198162004763565b945062004e296040880162004779565b935062004e396060880162004779565b92506080870135915062004e5060a0880162004dce565b90509295509295509295565b60008060008060008060c0878903121562004e7657600080fd5b863562004e838162004763565b9550602087013562004e958162004763565b945062004ea56040880162004779565b935062004eb56060880162004dce565b92506080870135915060a08701356001600160401b0381111562004ed857600080fd5b62004ee689828a0162004ab9565b9150509295509295509295565b8054600090600181811c908083168062004f0e57607f831692505b6020808410820362004f3057634e487b7160e01b600052602260045260246000fd5b8388526020880182801562004f4e576001811462004f655762004f92565b60ff198716825285151560051b8201975062004f92565b60008981526020902060005b8781101562004f8c5781548482015290860190840162004f71565b83019850505b5050505050505092915050565b6001600160a01b0386811682528516602082015260a06040820181905260009062004fcd9083018662004ef3565b828103606084015262004fe1818662004ef3565b9150508260808301529695505050505050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b038181168382160190808211156200502d576200502d62004ff4565b5092915050565b808202811582820484141762001110576200111062004ff4565b600063ffffffff8083168181036200506a576200506a62004ff4565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620050a29083018462004ca6565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c060808201819052600090620050ed9083018562004ca6565b82810360a084015262005101818562004ca6565b9998505050505050505050565b6001600160401b038281168282160390808211156200502d576200502d62004ff4565b60006001600160401b038083168181036200506a576200506a62004ff4565b6000602082840312156200516357600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b6000826200519257620051926200516a565b500490565b8082018082111562001110576200111062004ff4565b634e487b7160e01b600052603260045260246000fd5b600060018201620051d857620051d862004ff4565b5060010190565b600082620051f157620051f16200516a565b500690565b8181038181111562001110576200111062004ff4565b6000816200521e576200521e62004ff4565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a08201819052600090620052b39083018462004ca6565b98975050505050505050565b60008251620052d381846020870162004c80565b9190910192915050565b61032081016103008085843782018360005b600181101562005310578151835260209283019290910190600101620052ef565b5050509392505050565b6000602082840312156200532d57600080fd5b8151801515811462004a3157600080fd5b60006001600160401b03808416806200535b576200535b6200516a565b9216919091049291505056fe60a06040526040516200092e3803806200092e833981016040819052620000269162000383565b828162000034828262000060565b50506001600160a01b038216608052620000576200005160805190565b620000c6565b50505062000481565b6200006b8262000138565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115620000b857620000b38282620001b8565b505050565b620000c262000235565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620001086000805160206200090e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001358162000257565b50565b806001600160a01b03163b6000036200017457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b031684604051620001d7919062000463565b600060405180830381855af49150503d806000811462000214576040519150601f19603f3d011682016040523d82523d6000602084013e62000219565b606091505b5090925090506200022c8583836200029a565b95945050505050565b3415620002555760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166200028357604051633173bdd160e11b8152600060048201526024016200016b565b806000805160206200090e83398151915262000197565b606082620002b357620002ad8262000300565b620002f9565b8151158015620002cb57506001600160a01b0384163b155b15620002f657604051639996b31560e01b81526001600160a01b03851660048201526024016200016b565b50805b9392505050565b805115620003115780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b03811681146200034257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200037a57818101518382015260200162000360565b50506000910152565b6000806000606084860312156200039957600080fd5b620003a4846200032a565b9250620003b4602085016200032a565b60408501519092506001600160401b0380821115620003d257600080fd5b818601915086601f830112620003e757600080fd5b815181811115620003fc57620003fc62000347565b604051601f8201601f19908116603f0116810190838211818310171562000427576200042762000347565b816040528281528960208487010111156200044157600080fd5b620004548360208301602088016200035d565b80955050505050509250925092565b60008251620004778184602087016200035d565b9190910192915050565b6080516104726200049c6000396000601001526104726000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100e5565b60008061008e36600481846102fd565b81019061009b919061033d565b915091506100a98282610109565b5050565b60006100e07f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610104573d6000f35b3d6000fd5b61011282610164565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561015c5761015782826101e0565b505050565b6100a9610256565b806001600160a01b03163b60000361019f57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101fd919061040d565b600060405180830381855af49150503d8060008114610238576040519150601f19603f3d011682016040523d82523d6000602084013e61023d565b606091505b509150915061024d858383610275565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b60608261028a57610285826102d4565b6102cd565b81511580156102a157506001600160a01b0384163b155b156102ca57604051639996b31560e01b81526001600160a01b0385166004820152602401610196565b50805b9392505050565b8051156102e45780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6000808585111561030d57600080fd5b8386111561031a57600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561035057600080fd5b82356001600160a01b038116811461036757600080fd5b9150602083013567ffffffffffffffff8082111561038457600080fd5b818501915085601f83011261039857600080fd5b8135818111156103aa576103aa610327565b604051601f8201601f19908116603f011681019083821181831017156103d2576103d2610327565b816040528281528860208487010111156103eb57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000825160005b8181101561042e5760208186018101518583015201610414565b50600092019182525091905056fea2646970667358221220b682b645e70b0310ca18f6b5889dc8bdacf4b460a01fb9d34b74753f65dc9ae364736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a264697066735822122007c6fdbac14414801e0b7d94dedb9fc404d41fb52ef6f8b62d9f4b867dc7604764736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonRollupManagerMock.json b/compiled-contracts/paris/PolygonRollupManagerMock.json index 599845ebf..a199d23bf 100644 --- a/compiled-contracts/paris/PolygonRollupManagerMock.json +++ b/compiled-contracts/paris/PolygonRollupManagerMock.json @@ -1269,7 +1269,7 @@ "type": "address" }, { - "internalType": "contract PolygonZkEVMV2Existent", + "internalType": "contract PolygonZkEVMExistentEtrog", "name": "polygonZkEVM", "type": "address" }, @@ -2016,8 +2016,8 @@ "type": "function" } ], - "bytecode": "0x60e06040523480156200001157600080fd5b506040516200636d3803806200636d833981016040819052620000349162000141565b6001600160a01b0380841660805280831660c052811660a0528282826200005a62000066565b50505050505062000195565b600054610100900460ff1615620000d35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000126576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013e57600080fd5b50565b6000806000606084860312156200015757600080fd5b8351620001648162000128565b6020850151909350620001778162000128565b60408501519092506200018a8162000128565b809150509250925092565b60805160a05160c051616170620001fd600039600081816109dc0152818161231d0152613bfc0152600081816107a201528181612e970152613ef601526000818161093601528181611333015281816114e301528181611ffd0152613de501526161706000f3fe60806040523480156200001157600080fd5b5060043610620002b65760003560e01c80630645af0914620002bb578063066ec01214620002d4578063080b311114620003005780630a0d9fbe14620003285780630e36f582146200034357806311f6b287146200035a57806312b86e1914620003715780631489ed10146200038857806315064c96146200039f5780631608859c14620003ad5780631796a1ae14620003c45780631816b7e514620003eb5780632072f6c51462000402578063248a9ca3146200040c5780632528016914620004325780632f2ff15d14620004e757806330c27dde14620004fe57806336568abe1462000512578063394218e91462000529578063477fa270146200054057806355a71ee0146200054957806360469169146200058d57806365c0504d14620005975780637222020f1462000646578063727885e9146200065d5780637975fcfe14620006745780637fb6e76a146200069a578063841b24d714620006c357806387c20c0114620006de5780638bd4f07114620006f55780638f698ec5146200070c57806391d14854146200072357806399f5634e146200073a5780639a908e7314620007445780639c9f3dfe146200075b578063a066215c1462000772578063a217fddf1462000789578063a2967d991462000792578063a3c573eb146200079c578063afd23cbe14620007d3578063b99d0ad714620007fd578063c1acbc3414620008d5578063c4c928c214620008f0578063ceee281d1462000907578063d02103ca1462000930578063d5073f6f1462000958578063d547741f146200096f578063d939b3151462000986578063dbc16976146200099a578063dde0ff7714620009a4578063e0bfd3d214620009bf578063e46761c414620009d6578063f34eb8eb14620009fe578063f4e926751462000a15578063f9c4c2ae1462000a26575b600080fd5b620002d2620002cc366004620048ad565b62000b3d565b005b608454620002e8906001600160401b031681565b604051620002f7919062004988565b60405180910390f35b6200031762000311366004620049b1565b62000f8f565b6040519015158152602001620002f7565b608554620002e890600160401b90046001600160401b031681565b620002d262000354366004620049e9565b62000fb9565b620002e86200036b36600462004a74565b62001267565b620002d26200038236600462004aa5565b62001287565b620002d26200039936600462004b3c565b62001437565b606f54620003179060ff1681565b620002d2620003be366004620049b1565b620015c7565b607e54620003d59063ffffffff1681565b60405163ffffffff9091168152602001620002f7565b620002d2620003fc36600462004bc6565b6200165c565b620002d262001708565b620004236200041d36600462004bf3565b620017ce565b604051908152602001620002f7565b620004b362000443366004620049b1565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002f7565b620002d2620004f836600462004c0d565b620017e3565b608754620002e8906001600160401b031681565b620002d26200052336600462004c0d565b62001805565b620002d26200053a36600462004c40565b6200183f565b60865462000423565b620004236200055a366004620049b1565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b62000423620018ee565b620005fc620005a836600462004a74565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002f7565b620002d26200065736600462004a74565b62001906565b620002d26200066e36600462004d1d565b620019f1565b6200068b6200068536600462004dea565b62001e59565b604051620002f7919062004ea4565b620003d5620006ab36600462004c40565b60836020526000908152604090205463ffffffff1681565b608454620002e890600160c01b90046001600160401b031681565b620002d2620006ef36600462004b3c565b62001e8c565b620002d26200070636600462004aa5565b620021b0565b620002d26200071d36600462004eb9565b62002266565b620003176200073436600462004c0d565b620022ed565b6200042362002318565b620002e86200075536600462004f69565b62002404565b620002d26200076c36600462004c40565b620025d1565b620002d26200078336600462004c40565b62002674565b62000423600081565b6200042362002713565b620007c47f000000000000000000000000000000000000000000000000000000000000000081565b604051620002f7919062004f96565b608554620007e990600160801b900461ffff1681565b60405161ffff9091168152602001620002f7565b620008936200080e366004620049b1565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002f7919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002e890600160801b90046001600160401b031681565b620002d26200090136600462004faa565b62002ad5565b620003d56200091836600462005042565b60826020526000908152604090205463ffffffff1681565b620007c47f000000000000000000000000000000000000000000000000000000000000000081565b620002d26200096936600462004bf3565b62002da2565b620002d26200098036600462004c0d565b62002e2d565b608554620002e8906001600160401b031681565b620002d262002e4f565b608454620002e890600160401b90046001600160401b031681565b620002d2620009d036600462005074565b62002f0d565b620007c47f000000000000000000000000000000000000000000000000000000000000000081565b620002d262000a0f366004620050f0565b62002fd5565b608054620003d59063ffffffff1681565b62000abd62000a3736600462004a74565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002f7565b600054600290610100900460ff1615801562000b60575060005460ff8083169116105b62000b885760405162461bcd60e51b815260040162000b7f9062005187565b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c09620031c0565b62000c246000805160206200611b8339815191528c6200322d565b62000c316000886200322d565b62000c4c60008051602062005ffb833981519152886200322d565b62000c676000805160206200607b833981519152886200322d565b62000c8260008051602062005f9b833981519152886200322d565b62000c9d60008051602062005fdb833981519152896200322d565b62000cb8600080516020620060fb833981519152896200322d565b62000cd36000805160206200601b833981519152896200322d565b62000cee6000805160206200609b833981519152896200322d565b62000d186000805160206200611b83398151915260008051602062005f7b83398151915262003239565b62000d3360008051602062005f7b833981519152896200322d565b62000d4e60008051602062005fbb833981519152896200322d565b62000d78600080516020620060db833981519152600080516020620060bb83398151915262003239565b62000d93600080516020620060db833981519152876200322d565b62000dae600080516020620060bb833981519152876200322d565b6073546074546001600160401b03600160401b9092048216911680821462000de957604051632e4cc54360e11b815260040160405180910390fd5b600062000e11888888886000607460009054906101000a90046001600160401b03166200328e565b6001600160401b03838116600081815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068b018054909216909417938802939093179092556007880180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81529596506001600160a01b038e81169663bb5907089662000f139694831695600160581b90950490921693607693607793909291169060040162005281565b600060405180830381600087803b15801562000f2e57600080fd5b505af115801562000f43573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff851681526000805160206200605b8339815191529350602001915062000f7a9050565b60405180910390a15050505050505050505050565b63ffffffff8216600090815260816020526040812062000fb09083620034bc565b90505b92915050565b600054600290610100900460ff1615801562000fdc575060005460ff8083169116105b62000ffb5760405162461bcd60e51b815260040162000b7f9062005187565b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200107c620031c0565b620010976000805160206200611b833981519152886200322d565b620010a46000846200322d565b620010bf60008051602062005ffb833981519152846200322d565b620010da6000805160206200607b833981519152846200322d565b620010f560008051602062005f9b833981519152846200322d565b6200111060008051602062005fdb833981519152856200322d565b6200112b600080516020620060fb833981519152856200322d565b620011466000805160206200601b833981519152856200322d565b620011616000805160206200609b833981519152856200322d565b6200118b6000805160206200611b83398151915260008051602062005f7b83398151915262003239565b620011a660008051602062005f7b833981519152856200322d565b620011c160008051602062005fbb833981519152856200322d565b620011eb600080516020620060db833981519152600080516020620060bb83398151915262003239565b62001206600080516020620060db833981519152836200322d565b62001221600080516020620060bb833981519152836200322d565b6200122e6000336200322d565b6000805461ff001916905560405160ff821681526000805160206200605b8339815191529060200160405180910390a150505050505050565b63ffffffff8116600090815260816020526040812062000fb39062003501565b6000805160206200611b833981519152620012a28162003572565b63ffffffff89166000908152608160205260409020620012c9818a8a8a8a8a8a8a6200357e565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001331576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200136a62002713565b6040518263ffffffff1660e01b81526004016200138991815260200190565b600060405180830381600087803b158015620013a457600080fd5b505af1158015620013b9573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b6000805160206200611b833981519152620014528162003572565b63ffffffff8916600090815260816020526040902062001479818a8a8a8a8a8a8a62003906565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b90041615620014e1576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200151a62002713565b6040518263ffffffff1660e01b81526004016200153991815260200190565b600060405180830381600087803b1580156200155457600080fd5b505af115801562001569573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a604051620015b393929190620052e7565b60405180910390a350505050505050505050565b63ffffffff82166000908152608160205260409020620015f76000805160206200611b83398151915233620022ed565b6200164b57606f5460ff16156200162157604051630bc011ff60e21b815260040160405180910390fd5b6200162d8183620034bc565b6200164b57604051630674f25160e11b815260040160405180910390fd5b62001657818362003d02565b505050565b6000805160206200609b833981519152620016778162003572565b6103e88261ffff1610806200169157506103ff8261ffff16115b15620016b057604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b62001723600080516020620060db83398151915233620022ed565b620017c257608454600160801b90046001600160401b031615806200177357506084544290620017689062093a8090600160801b90046001600160401b03166200531e565b6001600160401b0316115b80620017a357506087544290620017989062093a80906001600160401b03166200531e565b6001600160401b0316115b15620017c25760405163692baaad60e11b815260040160405180910390fd5b620017cc62003ef4565b565b60009081526034602052604090206001015490565b620017ee82620017ce565b620017f98162003572565b62001657838362003f73565b6001600160a01b03811633146200182f57604051630b4ad1cd60e31b815260040160405180910390fd5b6200183b828262003fdf565b5050565b6000805160206200609b8339815191526200185a8162003572565b606f5460ff166200189c576084546001600160401b03600160c01b9091048116908316106200189c5760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190620016fc90849062004988565b6000608654606462001901919062005348565b905090565b60008051602062005fdb833981519152620019218162003572565b63ffffffff82161580620019405750607e5463ffffffff908116908316115b156200195f57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff1615159003620019a657604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b600080516020620060fb83398151915262001a0c8162003572565b63ffffffff8816158062001a2b5750607e5463ffffffff908116908916115b1562001a4a57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff161515900362001a9157604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001acf576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062001aea9063ffffffff1662005362565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001b389062004871565b62001b469392919062005388565b604051809103906000f08015801562001b63573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001dd7949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001e17908d908d9088908e908e908e90600401620053bf565b600060405180830381600087803b15801562001e3257600080fd5b505af115801562001e47573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001e8190878787878762004049565b979650505050505050565b606f5460ff161562001eb157604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001f0092600160c01b9004811691166200531e565b6001600160401b0316111562001f2957604051638a0704d360e01b815260040160405180910390fd5b6103e862001f38888862005422565b6001600160401b0316111562001f6157604051635acfba9d60e11b815260040160405180910390fd5b62001f73818989898989898962003906565b62001f7f818762004184565b6085546001600160401b03166000036200208d57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001ffb576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200203462002713565b6040518263ffffffff1660e01b81526004016200205391815260200190565b600060405180830381600087803b1580156200206e57600080fd5b505af115801562002083573d6000803e3d6000fd5b5050505062002157565b620020988162004381565b600681018054600160801b90046001600160401b0316906010620020bc8362005445565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b48887896040516200219d93929190620052e7565b60405180910390a3505050505050505050565b606f5460ff1615620021d557604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88166000908152608160205260409020620021fc81898989898989896200357e565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16200225b62003ef4565b505050505050505050565b80516080805463ffffffff191663ffffffff90921691909117905560005b81518110156200183b57818181518110620022a357620022a36200546c565b602002602001015160816000836001620022be919062005482565b63ffffffff16815260208101919091526040016000206005015580620022e48162005498565b91505062002284565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162002369919062004f96565b602060405180830381865afa15801562002387573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620023ad9190620054b4565b608454909150600090620023d4906001600160401b03600160401b82048116911662005422565b6001600160401b0316905080600003620023f15760009250505090565b620023fd8183620054e4565b9250505090565b606f5460009060ff16156200242c57604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362002464576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200248f57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620024c29084906001600160401b03166200531e565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620024f887836200531e565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b031990921692909316919091171790559050620025878362004381565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a2582604051620025bf919062004988565b60405180910390a29695505050505050565b6000805160206200609b833981519152620025ec8162003572565b606f5460ff1662002627576085546001600160401b0390811690831610620026275760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590620016fc90849062004988565b6000805160206200609b8339815191526200268f8162003572565b62015180826001600160401b03161115620026bd57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890620016fc90849062004988565b60805460009063ffffffff168082036200272f57506000919050565b6000816001600160401b038111156200274c576200274c62004c5e565b60405190808252806020026020018201604052801562002776578160200160208202803683370190505b50905060005b82811015620027e957608160006200279683600162005482565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620027c957620027c96200546c565b602090810291909101015280620027e08162005498565b9150506200277c565b50600060205b8360011462002a2d57600062002807600286620054fb565b62002814600287620054e4565b62002820919062005482565b90506000816001600160401b038111156200283f576200283f62004c5e565b60405190808252806020026020018201604052801562002869578160200160208202803683370190505b50905060005b82811015620029e1576200288560018462005512565b81148015620028a057506200289c600288620054fb565b6001145b15620029205785620028b482600262005348565b81518110620028c757620028c76200546c565b602002602001015185604051602001620028e392919062005528565b604051602081830303815290604052805190602001208282815181106200290e576200290e6200546c565b602002602001018181525050620029cc565b856200292e82600262005348565b815181106200294157620029416200546c565b60200260200101518682600262002959919062005348565b6200296690600162005482565b815181106200297957620029796200546c565b60200260200101516040516020016200299492919062005528565b60405160208183030381529060405280519060200120828281518110620029bf57620029bf6200546c565b6020026020010181815250505b80620029d88162005498565b9150506200286f565b508094508195508384604051602001620029fd92919062005528565b604051602081830303815290604052805190602001209350828062002a229062005536565b9350505050620027ef565b60008360008151811062002a455762002a456200546c565b6020026020010151905060005b8281101562002acb57818460405160200162002a7092919062005528565b604051602081830303815290604052805190602001209150838460405160200162002a9d92919062005528565b604051602081830303815290604052805190602001209350808062002ac29062005498565b91505062002a52565b5095945050505050565b60008051602062005f9b83398151915262002af08162003572565b63ffffffff8416158062002b0f5750607e5463ffffffff908116908516115b1562002b2e57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002b6f576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002bbe57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002c0557604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002c4357604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002cc38462001267565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002d189216908b908b9060040162005550565b600060405180830381600087803b15801562002d3357600080fd5b505af115801562002d48573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005fbb83398151915262002dbd8162003572565b683635c9adc5dea0000082118062002dd85750633b9aca0082105b1562002df757604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620016fc565b62002e3882620017ce565b62002e438162003572565b62001657838362003fdf565b6000805160206200601b83398151915262002e6a8162003572565b608780546001600160401b031916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc1697691600480830192600092919082900301818387803b15801562002ee757600080fd5b505af115801562002efc573d6000803e3d6000fd5b5050505062002f0a6200444c565b50565b6000805160206200607b83398151915262002f288162003572565b6001600160401b03841660009081526083602052604090205463ffffffff161562002f66576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b03871660009081526082602052604090205463ffffffff161562002fa457604051630d409b9360e41b815260040160405180910390fd5b600062002fb7888888888760006200328e565b60008080526002909101602052604090209390935550505050505050565b60008051602062005ffb83398151915262002ff08162003572565b607e80546000919082906200300b9063ffffffff1662005362565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620031ae9695949392919062005590565b60405180910390a25050505050505050565b600054610100900460ff16620017cc5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b7f565b6200183b828262003f73565b60006200324683620017ce565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6080805460009182918290620032aa9063ffffffff1662005362565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000876001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff16021790555080608260008a6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150878260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550868260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620034a99594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b03828116600090815260048501602052604081205490924292620034ef9291811691166200531e565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b03161562003555575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002f0a8133620044a5565b60078801546000906001600160401b039081169087161015620035b45760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620036555760068901546001600160401b03600160801b90910481169089161115620035fe5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200364e57604051632bd2e3e760e01b815260040160405180910390fd5b50620036ca565b506001600160401b03851660009081526002890160205260409020548062003690576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620036ca57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620037035750876001600160401b0316876001600160401b031611155b8062003727575060068901546001600160401b03600160c01b909104811690881611155b15620037465760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b90048116908616146200378d576040516332a2a77f60e01b815260040160405180910390fd5b60006200379f8a888888868962004049565b905060006000805160206200603b833981519152600283604051620037c59190620055dd565b602060405180830381855afa158015620037e3573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620038089190620054b4565b620038149190620054fb565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200385891889190600401620055fb565b602060405180830381865afa15801562003876573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200389c919062005638565b620038ba576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620038f95760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620039148a62003501565b60078b01549091506001600160401b0390811690891610156200394a5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620039ed5760068a01546001600160401b03600160801b9091048116908a161115620039945760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620039e657604051632bd2e3e760e01b815260040160405180910390fd5b5062003a5d565b6001600160401b038816600090815260028b01602052604090205491508162003a29576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b0316111562003a5d57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b03161162003a905760405163b9b18f5760e01b815260040160405180910390fd5b600062003aa28b8a8a8a878b62004049565b905060006000805160206200603b83398151915260028360405162003ac89190620055dd565b602060405180830381855afa15801562003ae6573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003b0b9190620054b4565b62003b179190620054fb565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003b5b91899190600401620055fb565b602060405180830381865afa15801562003b79573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003b9f919062005638565b62003bbd576040516309bde33960e01b815260040160405180910390fd5b600062003bcb848b62005422565b905062003c2487826001600160401b031662003be662002318565b62003bf2919062005348565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620044cf565b80608460088282829054906101000a90046001600160401b031662003c4a91906200531e565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b15801562003cda57600080fd5b505af115801562003cef573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003d41575060068201546001600160401b03600160801b9091048116908216115b1562003d605760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003e1c62002713565b6040518263ffffffff1660e01b815260040162003e3b91815260200190565b600060405180830381600087803b15801562003e5657600080fd5b505af115801562003e6b573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003f5057600080fd5b505af115801562003f65573d6000803e3d6000fd5b50505050620017cc62004523565b62003f7f8282620022ed565b6200183b5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003feb8282620022ed565b156200183b5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b03808616600081815260038901602052604080822054938816825290205460609291158015906200407f575081155b156200409e5760405163340c614f60e11b815260040160405180910390fd5b80620040bd576040516366385b5160e01b815260040160405180910390fd5b620040c88462004580565b620040e6576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b6000620041918362003501565b905081600080620041a3848462005422565b6085546001600160401b039182169250600091620041ca91600160401b9004164262005512565b90505b846001600160401b0316846001600160401b03161462004254576001600160401b038085166000908152600389016020526040902060018101549091168210156200422f576001810154600160401b90046001600160401b031694506200424d565b6200423b868662005422565b6001600160401b031693505062004254565b50620041cd565b600062004262848462005512565b905083811015620042c057808403600c811162004280578062004283565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620042b557620042b5620054ce565b046086555062004338565b838103600c8111620042d35780620042d6565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a76400000281620043105762004310620054ce565b04905080608654670de0b6b3a76400000281620043315762004331620054ce565b0460865550505b683635c9adc5dea0000060865411156200435f57683635c9adc5dea0000060865562004377565b633b9aca0060865410156200437757633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002f0a576006810154600090620043cc90600160c01b90046001600160401b031660016200531e565b9050620043da8282620034bc565b156200183b57600682015460009060029062004408908490600160801b90046001600160401b031662005422565b6200441491906200565c565b6200442090836200531e565b90506200442e8382620034bc565b15620044405762001657838262003d02565b62001657838362003d02565b606f5460ff166200447057604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b620044b18282620022ed565b6200183b57604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526200165790849062004606565b606f5460ff16156200454857604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b038316108015620045b7575067ffffffff00000001604083901c6001600160401b0316105b8015620045d8575067ffffffff00000001608083901c6001600160401b0316105b8015620045f0575067ffffffff0000000160c083901c105b15620045fe57506001919050565b506000919050565b60006200465d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620046df9092919063ffffffff16565b8051909150156200165757808060200190518101906200467e919062005638565b620016575760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b7f565b6060620046f08484600085620046f8565b949350505050565b6060824710156200475b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b7f565b600080866001600160a01b03168587604051620047799190620055dd565b60006040518083038185875af1925050503d8060008114620047b8576040519150601f19603f3d011682016040523d82523d6000602084013e620047bd565b606091505b509150915062001e8187838387606083156200483e57825160000362004836576001600160a01b0385163b620048365760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b7f565b5081620046f0565b620046f08383815115620048555781518083602001fd5b8060405162461bcd60e51b815260040162000b7f919062004ea4565b6108f5806200568683390190565b6001600160a01b038116811462002f0a57600080fd5b80356001600160401b03811681146200356d57600080fd5b6000806000806000806000806000806101408b8d031215620048ce57600080fd5b8a35620048db816200487f565b9950620048eb60208c0162004895565b9850620048fb60408c0162004895565b975060608b01356200490d816200487f565b965060808b01356200491f816200487f565b955060a08b013562004931816200487f565b945060c08b013562004943816200487f565b935060e08b013562004955816200487f565b9250620049666101008c0162004895565b9150620049776101208c0162004895565b90509295989b9194979a5092959850565b6001600160401b0391909116815260200190565b803563ffffffff811681146200356d57600080fd5b60008060408385031215620049c557600080fd5b620049d0836200499c565b9150620049e06020840162004895565b90509250929050565b60008060008060008060c0878903121562004a0357600080fd5b863562004a10816200487f565b955062004a206020880162004895565b945062004a306040880162004895565b9350606087013562004a42816200487f565b9250608087013562004a54816200487f565b915060a087013562004a66816200487f565b809150509295509295509295565b60006020828403121562004a8757600080fd5b62000fb0826200499c565b80610300810183101562000fb357600080fd5b6000806000806000806000806103e0898b03121562004ac357600080fd5b62004ace896200499c565b975062004ade60208a0162004895565b965062004aee60408a0162004895565b955062004afe60608a0162004895565b945062004b0e60808a0162004895565b935060a0890135925060c0890135915062004b2d8a60e08b0162004a92565b90509295985092959890939650565b6000806000806000806000806103e0898b03121562004b5a57600080fd5b62004b65896200499c565b975062004b7560208a0162004895565b965062004b8560408a0162004895565b955062004b9560608a0162004895565b94506080890135935060a0890135925060c089013562004bb5816200487f565b915062004b2d8a60e08b0162004a92565b60006020828403121562004bd957600080fd5b813561ffff8116811462004bec57600080fd5b9392505050565b60006020828403121562004c0657600080fd5b5035919050565b6000806040838503121562004c2157600080fd5b82359150602083013562004c35816200487f565b809150509250929050565b60006020828403121562004c5357600080fd5b62000fb08262004895565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562004c9f5762004c9f62004c5e565b604052919050565b600082601f83011262004cb957600080fd5b81356001600160401b0381111562004cd55762004cd562004c5e565b62004cea601f8201601f191660200162004c74565b81815284602083860101111562004d0057600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600080600060e0888a03121562004d3957600080fd5b62004d44886200499c565b965062004d546020890162004895565b9550604088013562004d66816200487f565b9450606088013562004d78816200487f565b9350608088013562004d8a816200487f565b925060a08801356001600160401b038082111562004da757600080fd5b62004db58b838c0162004ca7565b935060c08a013591508082111562004dcc57600080fd5b5062004ddb8a828b0162004ca7565b91505092959891949750929550565b60008060008060008060c0878903121562004e0457600080fd5b62004e0f876200499c565b955062004e1f6020880162004895565b945062004e2f6040880162004895565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004e6d57818101518382015260200162004e53565b50506000910152565b6000815180845262004e9081602086016020860162004e50565b601f01601f19169290920160200192915050565b60208152600062000fb0602083018462004e76565b6000602080838503121562004ecd57600080fd5b82356001600160401b038082111562004ee557600080fd5b818501915085601f83011262004efa57600080fd5b81358181111562004f0f5762004f0f62004c5e565b8060051b915062004f2284830162004c74565b818152918301840191848101908884111562004f3d57600080fd5b938501935b8385101562004f5d5784358252938501939085019062004f42565b98975050505050505050565b6000806040838503121562004f7d57600080fd5b62004f888362004895565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000806000806060858703121562004fc157600080fd5b843562004fce816200487f565b935062004fde602086016200499c565b925060408501356001600160401b038082111562004ffb57600080fd5b818701915087601f8301126200501057600080fd5b8135818111156200502057600080fd5b8860208285010111156200503357600080fd5b95989497505060200194505050565b6000602082840312156200505557600080fd5b813562004bec816200487f565b803560ff811681146200356d57600080fd5b60008060008060008060c087890312156200508e57600080fd5b86356200509b816200487f565b95506020870135620050ad816200487f565b9450620050bd6040880162004895565b9350620050cd6060880162004895565b925060808701359150620050e460a0880162005062565b90509295509295509295565b60008060008060008060c087890312156200510a57600080fd5b863562005117816200487f565b9550602087013562005129816200487f565b9450620051396040880162004895565b9350620051496060880162005062565b92506080870135915060a08701356001600160401b038111156200516c57600080fd5b6200517a89828a0162004ca7565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b8054600090600181811c9080831680620051f057607f831692505b602080841082036200521257634e487b7160e01b600052602260045260246000fd5b83885260208801828015620052305760018114620052475762005274565b60ff198716825285151560051b8201975062005274565b60008981526020902060005b878110156200526e5781548482015290860190840162005253565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c060408201819052600090620052af90830187620051d5565b8281036060840152620052c38187620051d5565b608084019590955250506001600160401b039190911660a090910152949350505050565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562005341576200534162005308565b5092915050565b808202811582820484141762000fb35762000fb362005308565b600063ffffffff8083168181036200537e576200537e62005308565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620053b69083018462004e76565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c060808201819052600090620054019083018562004e76565b82810360a084015262005415818562004e76565b9998505050505050505050565b6001600160401b0382811682821603908082111562005341576200534162005308565b60006001600160401b038281166002600160401b031981016200537e576200537e62005308565b634e487b7160e01b600052603260045260246000fd5b8082018082111562000fb35762000fb362005308565b600060018201620054ad57620054ad62005308565b5060010190565b600060208284031215620054c757600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082620054f657620054f6620054ce565b500490565b6000826200550d576200550d620054ce565b500690565b8181038181111562000fb35762000fb362005308565b918252602082015260400190565b60008162005548576200554862005308565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a0820181905260009062004f5d9083018462004e76565b60008251620055f181846020870162004e50565b9190910192915050565b61032081016103008085843782018360005b60018110156200562e5781518352602092830192909101906001016200560d565b5050509392505050565b6000602082840312156200564b57600080fd5b8151801515811462004bec57600080fd5b60006001600160401b0383811680620056795762005679620054ce565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca26469706673582212208e78e901799caaaff866d77d874534e79db9f4bae5f48cfae79611891464d2c664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220b4e84f276524b22fbe82e90bcf3803a423a5f13e0a292c4910a87f421c2a476864736f6c63430008140033", - "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620002b65760003560e01c80630645af0914620002bb578063066ec01214620002d4578063080b311114620003005780630a0d9fbe14620003285780630e36f582146200034357806311f6b287146200035a57806312b86e1914620003715780631489ed10146200038857806315064c96146200039f5780631608859c14620003ad5780631796a1ae14620003c45780631816b7e514620003eb5780632072f6c51462000402578063248a9ca3146200040c5780632528016914620004325780632f2ff15d14620004e757806330c27dde14620004fe57806336568abe1462000512578063394218e91462000529578063477fa270146200054057806355a71ee0146200054957806360469169146200058d57806365c0504d14620005975780637222020f1462000646578063727885e9146200065d5780637975fcfe14620006745780637fb6e76a146200069a578063841b24d714620006c357806387c20c0114620006de5780638bd4f07114620006f55780638f698ec5146200070c57806391d14854146200072357806399f5634e146200073a5780639a908e7314620007445780639c9f3dfe146200075b578063a066215c1462000772578063a217fddf1462000789578063a2967d991462000792578063a3c573eb146200079c578063afd23cbe14620007d3578063b99d0ad714620007fd578063c1acbc3414620008d5578063c4c928c214620008f0578063ceee281d1462000907578063d02103ca1462000930578063d5073f6f1462000958578063d547741f146200096f578063d939b3151462000986578063dbc16976146200099a578063dde0ff7714620009a4578063e0bfd3d214620009bf578063e46761c414620009d6578063f34eb8eb14620009fe578063f4e926751462000a15578063f9c4c2ae1462000a26575b600080fd5b620002d2620002cc366004620048ad565b62000b3d565b005b608454620002e8906001600160401b031681565b604051620002f7919062004988565b60405180910390f35b6200031762000311366004620049b1565b62000f8f565b6040519015158152602001620002f7565b608554620002e890600160401b90046001600160401b031681565b620002d262000354366004620049e9565b62000fb9565b620002e86200036b36600462004a74565b62001267565b620002d26200038236600462004aa5565b62001287565b620002d26200039936600462004b3c565b62001437565b606f54620003179060ff1681565b620002d2620003be366004620049b1565b620015c7565b607e54620003d59063ffffffff1681565b60405163ffffffff9091168152602001620002f7565b620002d2620003fc36600462004bc6565b6200165c565b620002d262001708565b620004236200041d36600462004bf3565b620017ce565b604051908152602001620002f7565b620004b362000443366004620049b1565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002f7565b620002d2620004f836600462004c0d565b620017e3565b608754620002e8906001600160401b031681565b620002d26200052336600462004c0d565b62001805565b620002d26200053a36600462004c40565b6200183f565b60865462000423565b620004236200055a366004620049b1565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b62000423620018ee565b620005fc620005a836600462004a74565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002f7565b620002d26200065736600462004a74565b62001906565b620002d26200066e36600462004d1d565b620019f1565b6200068b6200068536600462004dea565b62001e59565b604051620002f7919062004ea4565b620003d5620006ab36600462004c40565b60836020526000908152604090205463ffffffff1681565b608454620002e890600160c01b90046001600160401b031681565b620002d2620006ef36600462004b3c565b62001e8c565b620002d26200070636600462004aa5565b620021b0565b620002d26200071d36600462004eb9565b62002266565b620003176200073436600462004c0d565b620022ed565b6200042362002318565b620002e86200075536600462004f69565b62002404565b620002d26200076c36600462004c40565b620025d1565b620002d26200078336600462004c40565b62002674565b62000423600081565b6200042362002713565b620007c47f000000000000000000000000000000000000000000000000000000000000000081565b604051620002f7919062004f96565b608554620007e990600160801b900461ffff1681565b60405161ffff9091168152602001620002f7565b620008936200080e366004620049b1565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002f7919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002e890600160801b90046001600160401b031681565b620002d26200090136600462004faa565b62002ad5565b620003d56200091836600462005042565b60826020526000908152604090205463ffffffff1681565b620007c47f000000000000000000000000000000000000000000000000000000000000000081565b620002d26200096936600462004bf3565b62002da2565b620002d26200098036600462004c0d565b62002e2d565b608554620002e8906001600160401b031681565b620002d262002e4f565b608454620002e890600160401b90046001600160401b031681565b620002d2620009d036600462005074565b62002f0d565b620007c47f000000000000000000000000000000000000000000000000000000000000000081565b620002d262000a0f366004620050f0565b62002fd5565b608054620003d59063ffffffff1681565b62000abd62000a3736600462004a74565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002f7565b600054600290610100900460ff1615801562000b60575060005460ff8083169116105b62000b885760405162461bcd60e51b815260040162000b7f9062005187565b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c09620031c0565b62000c246000805160206200611b8339815191528c6200322d565b62000c316000886200322d565b62000c4c60008051602062005ffb833981519152886200322d565b62000c676000805160206200607b833981519152886200322d565b62000c8260008051602062005f9b833981519152886200322d565b62000c9d60008051602062005fdb833981519152896200322d565b62000cb8600080516020620060fb833981519152896200322d565b62000cd36000805160206200601b833981519152896200322d565b62000cee6000805160206200609b833981519152896200322d565b62000d186000805160206200611b83398151915260008051602062005f7b83398151915262003239565b62000d3360008051602062005f7b833981519152896200322d565b62000d4e60008051602062005fbb833981519152896200322d565b62000d78600080516020620060db833981519152600080516020620060bb83398151915262003239565b62000d93600080516020620060db833981519152876200322d565b62000dae600080516020620060bb833981519152876200322d565b6073546074546001600160401b03600160401b9092048216911680821462000de957604051632e4cc54360e11b815260040160405180910390fd5b600062000e11888888886000607460009054906101000a90046001600160401b03166200328e565b6001600160401b03838116600081815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068b018054909216909417938802939093179092556007880180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81529596506001600160a01b038e81169663bb5907089662000f139694831695600160581b90950490921693607693607793909291169060040162005281565b600060405180830381600087803b15801562000f2e57600080fd5b505af115801562000f43573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff851681526000805160206200605b8339815191529350602001915062000f7a9050565b60405180910390a15050505050505050505050565b63ffffffff8216600090815260816020526040812062000fb09083620034bc565b90505b92915050565b600054600290610100900460ff1615801562000fdc575060005460ff8083169116105b62000ffb5760405162461bcd60e51b815260040162000b7f9062005187565b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200107c620031c0565b620010976000805160206200611b833981519152886200322d565b620010a46000846200322d565b620010bf60008051602062005ffb833981519152846200322d565b620010da6000805160206200607b833981519152846200322d565b620010f560008051602062005f9b833981519152846200322d565b6200111060008051602062005fdb833981519152856200322d565b6200112b600080516020620060fb833981519152856200322d565b620011466000805160206200601b833981519152856200322d565b620011616000805160206200609b833981519152856200322d565b6200118b6000805160206200611b83398151915260008051602062005f7b83398151915262003239565b620011a660008051602062005f7b833981519152856200322d565b620011c160008051602062005fbb833981519152856200322d565b620011eb600080516020620060db833981519152600080516020620060bb83398151915262003239565b62001206600080516020620060db833981519152836200322d565b62001221600080516020620060bb833981519152836200322d565b6200122e6000336200322d565b6000805461ff001916905560405160ff821681526000805160206200605b8339815191529060200160405180910390a150505050505050565b63ffffffff8116600090815260816020526040812062000fb39062003501565b6000805160206200611b833981519152620012a28162003572565b63ffffffff89166000908152608160205260409020620012c9818a8a8a8a8a8a8a6200357e565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001331576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200136a62002713565b6040518263ffffffff1660e01b81526004016200138991815260200190565b600060405180830381600087803b158015620013a457600080fd5b505af1158015620013b9573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b6000805160206200611b833981519152620014528162003572565b63ffffffff8916600090815260816020526040902062001479818a8a8a8a8a8a8a62003906565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b90041615620014e1576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200151a62002713565b6040518263ffffffff1660e01b81526004016200153991815260200190565b600060405180830381600087803b1580156200155457600080fd5b505af115801562001569573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a604051620015b393929190620052e7565b60405180910390a350505050505050505050565b63ffffffff82166000908152608160205260409020620015f76000805160206200611b83398151915233620022ed565b6200164b57606f5460ff16156200162157604051630bc011ff60e21b815260040160405180910390fd5b6200162d8183620034bc565b6200164b57604051630674f25160e11b815260040160405180910390fd5b62001657818362003d02565b505050565b6000805160206200609b833981519152620016778162003572565b6103e88261ffff1610806200169157506103ff8261ffff16115b15620016b057604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b62001723600080516020620060db83398151915233620022ed565b620017c257608454600160801b90046001600160401b031615806200177357506084544290620017689062093a8090600160801b90046001600160401b03166200531e565b6001600160401b0316115b80620017a357506087544290620017989062093a80906001600160401b03166200531e565b6001600160401b0316115b15620017c25760405163692baaad60e11b815260040160405180910390fd5b620017cc62003ef4565b565b60009081526034602052604090206001015490565b620017ee82620017ce565b620017f98162003572565b62001657838362003f73565b6001600160a01b03811633146200182f57604051630b4ad1cd60e31b815260040160405180910390fd5b6200183b828262003fdf565b5050565b6000805160206200609b8339815191526200185a8162003572565b606f5460ff166200189c576084546001600160401b03600160c01b9091048116908316106200189c5760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190620016fc90849062004988565b6000608654606462001901919062005348565b905090565b60008051602062005fdb833981519152620019218162003572565b63ffffffff82161580620019405750607e5463ffffffff908116908316115b156200195f57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff1615159003620019a657604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b600080516020620060fb83398151915262001a0c8162003572565b63ffffffff8816158062001a2b5750607e5463ffffffff908116908916115b1562001a4a57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff161515900362001a9157604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001acf576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062001aea9063ffffffff1662005362565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001b389062004871565b62001b469392919062005388565b604051809103906000f08015801562001b63573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001dd7949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001e17908d908d9088908e908e908e90600401620053bf565b600060405180830381600087803b15801562001e3257600080fd5b505af115801562001e47573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001e8190878787878762004049565b979650505050505050565b606f5460ff161562001eb157604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001f0092600160c01b9004811691166200531e565b6001600160401b0316111562001f2957604051638a0704d360e01b815260040160405180910390fd5b6103e862001f38888862005422565b6001600160401b0316111562001f6157604051635acfba9d60e11b815260040160405180910390fd5b62001f73818989898989898962003906565b62001f7f818762004184565b6085546001600160401b03166000036200208d57600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001ffb576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200203462002713565b6040518263ffffffff1660e01b81526004016200205391815260200190565b600060405180830381600087803b1580156200206e57600080fd5b505af115801562002083573d6000803e3d6000fd5b5050505062002157565b620020988162004381565b600681018054600160801b90046001600160401b0316906010620020bc8362005445565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b48887896040516200219d93929190620052e7565b60405180910390a3505050505050505050565b606f5460ff1615620021d557604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88166000908152608160205260409020620021fc81898989898989896200357e565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16200225b62003ef4565b505050505050505050565b80516080805463ffffffff191663ffffffff90921691909117905560005b81518110156200183b57818181518110620022a357620022a36200546c565b602002602001015160816000836001620022be919062005482565b63ffffffff16815260208101919091526040016000206005015580620022e48162005498565b91505062002284565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162002369919062004f96565b602060405180830381865afa15801562002387573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620023ad9190620054b4565b608454909150600090620023d4906001600160401b03600160401b82048116911662005422565b6001600160401b0316905080600003620023f15760009250505090565b620023fd8183620054e4565b9250505090565b606f5460009060ff16156200242c57604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362002464576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200248f57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620024c29084906001600160401b03166200531e565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620024f887836200531e565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b031990921692909316919091171790559050620025878362004381565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a2582604051620025bf919062004988565b60405180910390a29695505050505050565b6000805160206200609b833981519152620025ec8162003572565b606f5460ff1662002627576085546001600160401b0390811690831610620026275760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590620016fc90849062004988565b6000805160206200609b8339815191526200268f8162003572565b62015180826001600160401b03161115620026bd57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890620016fc90849062004988565b60805460009063ffffffff168082036200272f57506000919050565b6000816001600160401b038111156200274c576200274c62004c5e565b60405190808252806020026020018201604052801562002776578160200160208202803683370190505b50905060005b82811015620027e957608160006200279683600162005482565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620027c957620027c96200546c565b602090810291909101015280620027e08162005498565b9150506200277c565b50600060205b8360011462002a2d57600062002807600286620054fb565b62002814600287620054e4565b62002820919062005482565b90506000816001600160401b038111156200283f576200283f62004c5e565b60405190808252806020026020018201604052801562002869578160200160208202803683370190505b50905060005b82811015620029e1576200288560018462005512565b81148015620028a057506200289c600288620054fb565b6001145b15620029205785620028b482600262005348565b81518110620028c757620028c76200546c565b602002602001015185604051602001620028e392919062005528565b604051602081830303815290604052805190602001208282815181106200290e576200290e6200546c565b602002602001018181525050620029cc565b856200292e82600262005348565b815181106200294157620029416200546c565b60200260200101518682600262002959919062005348565b6200296690600162005482565b815181106200297957620029796200546c565b60200260200101516040516020016200299492919062005528565b60405160208183030381529060405280519060200120828281518110620029bf57620029bf6200546c565b6020026020010181815250505b80620029d88162005498565b9150506200286f565b508094508195508384604051602001620029fd92919062005528565b604051602081830303815290604052805190602001209350828062002a229062005536565b9350505050620027ef565b60008360008151811062002a455762002a456200546c565b6020026020010151905060005b8281101562002acb57818460405160200162002a7092919062005528565b604051602081830303815290604052805190602001209150838460405160200162002a9d92919062005528565b604051602081830303815290604052805190602001209350808062002ac29062005498565b91505062002a52565b5095945050505050565b60008051602062005f9b83398151915262002af08162003572565b63ffffffff8416158062002b0f5750607e5463ffffffff908116908516115b1562002b2e57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002b6f576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002bbe57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002c0557604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002c4357604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002cc38462001267565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002d189216908b908b9060040162005550565b600060405180830381600087803b15801562002d3357600080fd5b505af115801562002d48573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005fbb83398151915262002dbd8162003572565b683635c9adc5dea0000082118062002dd85750633b9aca0082105b1562002df757604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620016fc565b62002e3882620017ce565b62002e438162003572565b62001657838362003fdf565b6000805160206200601b83398151915262002e6a8162003572565b608780546001600160401b031916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc1697691600480830192600092919082900301818387803b15801562002ee757600080fd5b505af115801562002efc573d6000803e3d6000fd5b5050505062002f0a6200444c565b50565b6000805160206200607b83398151915262002f288162003572565b6001600160401b03841660009081526083602052604090205463ffffffff161562002f66576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b03871660009081526082602052604090205463ffffffff161562002fa457604051630d409b9360e41b815260040160405180910390fd5b600062002fb7888888888760006200328e565b60008080526002909101602052604090209390935550505050505050565b60008051602062005ffb83398151915262002ff08162003572565b607e80546000919082906200300b9063ffffffff1662005362565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620031ae9695949392919062005590565b60405180910390a25050505050505050565b600054610100900460ff16620017cc5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b7f565b6200183b828262003f73565b60006200324683620017ce565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6080805460009182918290620032aa9063ffffffff1662005362565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000876001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff16021790555080608260008a6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150878260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550868260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620034a99594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b03828116600090815260048501602052604081205490924292620034ef9291811691166200531e565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b03161562003555575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002f0a8133620044a5565b60078801546000906001600160401b039081169087161015620035b45760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620036555760068901546001600160401b03600160801b90910481169089161115620035fe5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200364e57604051632bd2e3e760e01b815260040160405180910390fd5b50620036ca565b506001600160401b03851660009081526002890160205260409020548062003690576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620036ca57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620037035750876001600160401b0316876001600160401b031611155b8062003727575060068901546001600160401b03600160c01b909104811690881611155b15620037465760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b90048116908616146200378d576040516332a2a77f60e01b815260040160405180910390fd5b60006200379f8a888888868962004049565b905060006000805160206200603b833981519152600283604051620037c59190620055dd565b602060405180830381855afa158015620037e3573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190620038089190620054b4565b620038149190620054fb565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200385891889190600401620055fb565b602060405180830381865afa15801562003876573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200389c919062005638565b620038ba576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620038f95760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620039148a62003501565b60078b01549091506001600160401b0390811690891610156200394a5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620039ed5760068a01546001600160401b03600160801b9091048116908a161115620039945760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620039e657604051632bd2e3e760e01b815260040160405180910390fd5b5062003a5d565b6001600160401b038816600090815260028b01602052604090205491508162003a29576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b0316111562003a5d57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b03161162003a905760405163b9b18f5760e01b815260040160405180910390fd5b600062003aa28b8a8a8a878b62004049565b905060006000805160206200603b83398151915260028360405162003ac89190620055dd565b602060405180830381855afa15801562003ae6573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003b0b9190620054b4565b62003b179190620054fb565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003b5b91899190600401620055fb565b602060405180830381865afa15801562003b79573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003b9f919062005638565b62003bbd576040516309bde33960e01b815260040160405180910390fd5b600062003bcb848b62005422565b905062003c2487826001600160401b031662003be662002318565b62003bf2919062005348565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620044cf565b80608460088282829054906101000a90046001600160401b031662003c4a91906200531e565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b15801562003cda57600080fd5b505af115801562003cef573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003d41575060068201546001600160401b03600160801b9091048116908216115b1562003d605760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003e1c62002713565b6040518263ffffffff1660e01b815260040162003e3b91815260200190565b600060405180830381600087803b15801562003e5657600080fd5b505af115801562003e6b573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003f5057600080fd5b505af115801562003f65573d6000803e3d6000fd5b50505050620017cc62004523565b62003f7f8282620022ed565b6200183b5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003feb8282620022ed565b156200183b5760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b03808616600081815260038901602052604080822054938816825290205460609291158015906200407f575081155b156200409e5760405163340c614f60e11b815260040160405180910390fd5b80620040bd576040516366385b5160e01b815260040160405180910390fd5b620040c88462004580565b620040e6576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b6000620041918362003501565b905081600080620041a3848462005422565b6085546001600160401b039182169250600091620041ca91600160401b9004164262005512565b90505b846001600160401b0316846001600160401b03161462004254576001600160401b038085166000908152600389016020526040902060018101549091168210156200422f576001810154600160401b90046001600160401b031694506200424d565b6200423b868662005422565b6001600160401b031693505062004254565b50620041cd565b600062004262848462005512565b905083811015620042c057808403600c811162004280578062004283565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620042b557620042b5620054ce565b046086555062004338565b838103600c8111620042d35780620042d6565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a76400000281620043105762004310620054ce565b04905080608654670de0b6b3a76400000281620043315762004331620054ce565b0460865550505b683635c9adc5dea0000060865411156200435f57683635c9adc5dea0000060865562004377565b633b9aca0060865410156200437757633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002f0a576006810154600090620043cc90600160c01b90046001600160401b031660016200531e565b9050620043da8282620034bc565b156200183b57600682015460009060029062004408908490600160801b90046001600160401b031662005422565b6200441491906200565c565b6200442090836200531e565b90506200442e8382620034bc565b15620044405762001657838262003d02565b62001657838362003d02565b606f5460ff166200447057604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b620044b18282620022ed565b6200183b57604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526200165790849062004606565b606f5460ff16156200454857604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b038316108015620045b7575067ffffffff00000001604083901c6001600160401b0316105b8015620045d8575067ffffffff00000001608083901c6001600160401b0316105b8015620045f0575067ffffffff0000000160c083901c105b15620045fe57506001919050565b506000919050565b60006200465d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620046df9092919063ffffffff16565b8051909150156200165757808060200190518101906200467e919062005638565b620016575760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b7f565b6060620046f08484600085620046f8565b949350505050565b6060824710156200475b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b7f565b600080866001600160a01b03168587604051620047799190620055dd565b60006040518083038185875af1925050503d8060008114620047b8576040519150601f19603f3d011682016040523d82523d6000602084013e620047bd565b606091505b509150915062001e8187838387606083156200483e57825160000362004836576001600160a01b0385163b620048365760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b7f565b5081620046f0565b620046f08383815115620048555781518083602001fd5b8060405162461bcd60e51b815260040162000b7f919062004ea4565b6108f5806200568683390190565b6001600160a01b038116811462002f0a57600080fd5b80356001600160401b03811681146200356d57600080fd5b6000806000806000806000806000806101408b8d031215620048ce57600080fd5b8a35620048db816200487f565b9950620048eb60208c0162004895565b9850620048fb60408c0162004895565b975060608b01356200490d816200487f565b965060808b01356200491f816200487f565b955060a08b013562004931816200487f565b945060c08b013562004943816200487f565b935060e08b013562004955816200487f565b9250620049666101008c0162004895565b9150620049776101208c0162004895565b90509295989b9194979a5092959850565b6001600160401b0391909116815260200190565b803563ffffffff811681146200356d57600080fd5b60008060408385031215620049c557600080fd5b620049d0836200499c565b9150620049e06020840162004895565b90509250929050565b60008060008060008060c0878903121562004a0357600080fd5b863562004a10816200487f565b955062004a206020880162004895565b945062004a306040880162004895565b9350606087013562004a42816200487f565b9250608087013562004a54816200487f565b915060a087013562004a66816200487f565b809150509295509295509295565b60006020828403121562004a8757600080fd5b62000fb0826200499c565b80610300810183101562000fb357600080fd5b6000806000806000806000806103e0898b03121562004ac357600080fd5b62004ace896200499c565b975062004ade60208a0162004895565b965062004aee60408a0162004895565b955062004afe60608a0162004895565b945062004b0e60808a0162004895565b935060a0890135925060c0890135915062004b2d8a60e08b0162004a92565b90509295985092959890939650565b6000806000806000806000806103e0898b03121562004b5a57600080fd5b62004b65896200499c565b975062004b7560208a0162004895565b965062004b8560408a0162004895565b955062004b9560608a0162004895565b94506080890135935060a0890135925060c089013562004bb5816200487f565b915062004b2d8a60e08b0162004a92565b60006020828403121562004bd957600080fd5b813561ffff8116811462004bec57600080fd5b9392505050565b60006020828403121562004c0657600080fd5b5035919050565b6000806040838503121562004c2157600080fd5b82359150602083013562004c35816200487f565b809150509250929050565b60006020828403121562004c5357600080fd5b62000fb08262004895565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562004c9f5762004c9f62004c5e565b604052919050565b600082601f83011262004cb957600080fd5b81356001600160401b0381111562004cd55762004cd562004c5e565b62004cea601f8201601f191660200162004c74565b81815284602083860101111562004d0057600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600080600060e0888a03121562004d3957600080fd5b62004d44886200499c565b965062004d546020890162004895565b9550604088013562004d66816200487f565b9450606088013562004d78816200487f565b9350608088013562004d8a816200487f565b925060a08801356001600160401b038082111562004da757600080fd5b62004db58b838c0162004ca7565b935060c08a013591508082111562004dcc57600080fd5b5062004ddb8a828b0162004ca7565b91505092959891949750929550565b60008060008060008060c0878903121562004e0457600080fd5b62004e0f876200499c565b955062004e1f6020880162004895565b945062004e2f6040880162004895565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004e6d57818101518382015260200162004e53565b50506000910152565b6000815180845262004e9081602086016020860162004e50565b601f01601f19169290920160200192915050565b60208152600062000fb0602083018462004e76565b6000602080838503121562004ecd57600080fd5b82356001600160401b038082111562004ee557600080fd5b818501915085601f83011262004efa57600080fd5b81358181111562004f0f5762004f0f62004c5e565b8060051b915062004f2284830162004c74565b818152918301840191848101908884111562004f3d57600080fd5b938501935b8385101562004f5d5784358252938501939085019062004f42565b98975050505050505050565b6000806040838503121562004f7d57600080fd5b62004f888362004895565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000806000806060858703121562004fc157600080fd5b843562004fce816200487f565b935062004fde602086016200499c565b925060408501356001600160401b038082111562004ffb57600080fd5b818701915087601f8301126200501057600080fd5b8135818111156200502057600080fd5b8860208285010111156200503357600080fd5b95989497505060200194505050565b6000602082840312156200505557600080fd5b813562004bec816200487f565b803560ff811681146200356d57600080fd5b60008060008060008060c087890312156200508e57600080fd5b86356200509b816200487f565b95506020870135620050ad816200487f565b9450620050bd6040880162004895565b9350620050cd6060880162004895565b925060808701359150620050e460a0880162005062565b90509295509295509295565b60008060008060008060c087890312156200510a57600080fd5b863562005117816200487f565b9550602087013562005129816200487f565b9450620051396040880162004895565b9350620051496060880162005062565b92506080870135915060a08701356001600160401b038111156200516c57600080fd5b6200517a89828a0162004ca7565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b8054600090600181811c9080831680620051f057607f831692505b602080841082036200521257634e487b7160e01b600052602260045260246000fd5b83885260208801828015620052305760018114620052475762005274565b60ff198716825285151560051b8201975062005274565b60008981526020902060005b878110156200526e5781548482015290860190840162005253565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c060408201819052600090620052af90830187620051d5565b8281036060840152620052c38187620051d5565b608084019590955250506001600160401b039190911660a090910152949350505050565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562005341576200534162005308565b5092915050565b808202811582820484141762000fb35762000fb362005308565b600063ffffffff8083168181036200537e576200537e62005308565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620053b69083018462004e76565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c060808201819052600090620054019083018562004e76565b82810360a084015262005415818562004e76565b9998505050505050505050565b6001600160401b0382811682821603908082111562005341576200534162005308565b60006001600160401b038281166002600160401b031981016200537e576200537e62005308565b634e487b7160e01b600052603260045260246000fd5b8082018082111562000fb35762000fb362005308565b600060018201620054ad57620054ad62005308565b5060010190565b600060208284031215620054c757600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082620054f657620054f6620054ce565b500490565b6000826200550d576200550d620054ce565b500690565b8181038181111562000fb35762000fb362005308565b918252602082015260400190565b60008162005548576200554862005308565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a0820181905260009062004f5d9083018462004e76565b60008251620055f181846020870162004e50565b9190910192915050565b61032081016103008085843782018360005b60018110156200562e5781518352602092830192909101906001016200560d565b5050509392505050565b6000602082840312156200564b57600080fd5b8151801515811462004bec57600080fd5b60006001600160401b0383811680620056795762005679620054ce565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca26469706673582212208e78e901799caaaff866d77d874534e79db9f4bae5f48cfae79611891464d2c664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220b4e84f276524b22fbe82e90bcf3803a423a5f13e0a292c4910a87f421c2a476864736f6c63430008140033", + "bytecode": "0x60e06040523480156200001157600080fd5b506040516200635838038062006358833981016040819052620000349162000141565b6001600160a01b0380841660805280831660c052811660a0528282826200005a62000066565b50505050505062000195565b600054610100900460ff1615620000d35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000126576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013e57600080fd5b50565b6000806000606084860312156200015757600080fd5b8351620001648162000128565b6020850151909350620001778162000128565b60408501519092506200018a8162000128565b809150509250925092565b60805160a05160c05161615b620001fd600039600081816109dc015281816123190152613bf80152600081816107a201528181612e930152613ef20152600081816109360152818161132f015281816114df01528181611ff90152613de1015261615b6000f3fe60806040523480156200001157600080fd5b5060043610620002b65760003560e01c80630645af0914620002bb578063066ec01214620002d4578063080b311114620003005780630a0d9fbe14620003285780630e36f582146200034357806311f6b287146200035a57806312b86e1914620003715780631489ed10146200038857806315064c96146200039f5780631608859c14620003ad5780631796a1ae14620003c45780631816b7e514620003eb5780632072f6c51462000402578063248a9ca3146200040c5780632528016914620004325780632f2ff15d14620004e757806330c27dde14620004fe57806336568abe1462000512578063394218e91462000529578063477fa270146200054057806355a71ee0146200054957806360469169146200058d57806365c0504d14620005975780637222020f1462000646578063727885e9146200065d5780637975fcfe14620006745780637fb6e76a146200069a578063841b24d714620006c357806387c20c0114620006de5780638bd4f07114620006f55780638f698ec5146200070c57806391d14854146200072357806399f5634e146200073a5780639a908e7314620007445780639c9f3dfe146200075b578063a066215c1462000772578063a217fddf1462000789578063a2967d991462000792578063a3c573eb146200079c578063afd23cbe14620007d3578063b99d0ad714620007fd578063c1acbc3414620008d5578063c4c928c214620008f0578063ceee281d1462000907578063d02103ca1462000930578063d5073f6f1462000958578063d547741f146200096f578063d939b3151462000986578063dbc16976146200099a578063dde0ff7714620009a4578063e0bfd3d214620009bf578063e46761c414620009d6578063f34eb8eb14620009fe578063f4e926751462000a15578063f9c4c2ae1462000a26575b600080fd5b620002d2620002cc366004620048a9565b62000b3d565b005b608454620002e8906001600160401b031681565b604051620002f7919062004984565b60405180910390f35b6200031762000311366004620049ad565b62000f8b565b6040519015158152602001620002f7565b608554620002e890600160401b90046001600160401b031681565b620002d262000354366004620049e5565b62000fb5565b620002e86200036b36600462004a70565b62001263565b620002d26200038236600462004aa1565b62001283565b620002d26200039936600462004b38565b62001433565b606f54620003179060ff1681565b620002d2620003be366004620049ad565b620015c3565b607e54620003d59063ffffffff1681565b60405163ffffffff9091168152602001620002f7565b620002d2620003fc36600462004bc2565b62001658565b620002d262001704565b620004236200041d36600462004bef565b620017ca565b604051908152602001620002f7565b620004b362000443366004620049ad565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002f7565b620002d2620004f836600462004c09565b620017df565b608754620002e8906001600160401b031681565b620002d26200052336600462004c09565b62001801565b620002d26200053a36600462004c3c565b6200183b565b60865462000423565b620004236200055a366004620049ad565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b62000423620018ea565b620005fc620005a836600462004a70565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002f7565b620002d26200065736600462004a70565b62001902565b620002d26200066e36600462004d19565b620019ed565b6200068b6200068536600462004de6565b62001e55565b604051620002f7919062004ea0565b620003d5620006ab36600462004c3c565b60836020526000908152604090205463ffffffff1681565b608454620002e890600160c01b90046001600160401b031681565b620002d2620006ef36600462004b38565b62001e88565b620002d26200070636600462004aa1565b620021ac565b620002d26200071d36600462004eb5565b62002262565b620003176200073436600462004c09565b620022e9565b6200042362002314565b620002e86200075536600462004f65565b62002400565b620002d26200076c36600462004c3c565b620025cd565b620002d26200078336600462004c3c565b62002670565b62000423600081565b620004236200270f565b620007c47f000000000000000000000000000000000000000000000000000000000000000081565b604051620002f7919062004f92565b608554620007e990600160801b900461ffff1681565b60405161ffff9091168152602001620002f7565b620008936200080e366004620049ad565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002f7919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002e890600160801b90046001600160401b031681565b620002d26200090136600462004fa6565b62002ad1565b620003d5620009183660046200503e565b60826020526000908152604090205463ffffffff1681565b620007c47f000000000000000000000000000000000000000000000000000000000000000081565b620002d26200096936600462004bef565b62002d9e565b620002d26200098036600462004c09565b62002e29565b608554620002e8906001600160401b031681565b620002d262002e4b565b608454620002e890600160401b90046001600160401b031681565b620002d2620009d036600462005070565b62002f09565b620007c47f000000000000000000000000000000000000000000000000000000000000000081565b620002d262000a0f366004620050ec565b62002fd1565b608054620003d59063ffffffff1681565b62000abd62000a3736600462004a70565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002f7565b600054600290610100900460ff1615801562000b60575060005460ff8083169116105b62000b885760405162461bcd60e51b815260040162000b7f9062005183565b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c09620031bc565b62000c24600080516020620061068339815191528c62003229565b62000c3160008862003229565b62000c4c60008051602062005fe68339815191528862003229565b62000c67600080516020620060668339815191528862003229565b62000c8260008051602062005f868339815191528862003229565b62000c9d60008051602062005fc68339815191528962003229565b62000cb8600080516020620060e68339815191528962003229565b62000cd3600080516020620060068339815191528962003229565b62000cee600080516020620060868339815191528962003229565b62000d186000805160206200610683398151915260008051602062005f6683398151915262003235565b62000d3360008051602062005f668339815191528962003229565b62000d4e60008051602062005fa68339815191528962003229565b62000d78600080516020620060c6833981519152600080516020620060a683398151915262003235565b62000d93600080516020620060c68339815191528762003229565b62000dae600080516020620060a68339815191528762003229565b6073546074546001600160401b03600160401b9092048216911680821462000de957604051632e4cc54360e11b815260040160405180910390fd5b600062000e11888888886000607460009054906101000a90046001600160401b03166200328a565b6001600160401b03838116600081815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b91829004909b1681029a909a17905560068a01805490911690931797870297909717909155600787018054909616909417909455607a54606f549390915290549251635d6717a560e01b81529394506001600160a01b038c811694635d6717a59462000f0f9493831693600160581b900490921691607691607791906004016200527d565b600060405180830381600087803b15801562000f2a57600080fd5b505af115801562000f3f573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff85168152600080516020620060468339815191529350602001915062000f769050565b60405180910390a15050505050505050505050565b63ffffffff8216600090815260816020526040812062000fac9083620034b8565b90505b92915050565b600054600290610100900460ff1615801562000fd8575060005460ff8083169116105b62000ff75760405162461bcd60e51b815260040162000b7f9062005183565b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562001078620031bc565b62001093600080516020620061068339815191528862003229565b620010a060008462003229565b620010bb60008051602062005fe68339815191528462003229565b620010d6600080516020620060668339815191528462003229565b620010f160008051602062005f868339815191528462003229565b6200110c60008051602062005fc68339815191528562003229565b62001127600080516020620060e68339815191528562003229565b62001142600080516020620060068339815191528562003229565b6200115d600080516020620060868339815191528562003229565b620011876000805160206200610683398151915260008051602062005f6683398151915262003235565b620011a260008051602062005f668339815191528562003229565b620011bd60008051602062005fa68339815191528562003229565b620011e7600080516020620060c6833981519152600080516020620060a683398151915262003235565b62001202600080516020620060c68339815191528362003229565b6200121d600080516020620060a68339815191528362003229565b6200122a60003362003229565b6000805461ff001916905560405160ff82168152600080516020620060468339815191529060200160405180910390a150505050505050565b63ffffffff8116600090815260816020526040812062000faf90620034fd565b600080516020620061068339815191526200129e816200356e565b63ffffffff89166000908152608160205260409020620012c5818a8a8a8a8a8a8a6200357a565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b900416156200132d576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620013666200270f565b6040518263ffffffff1660e01b81526004016200138591815260200190565b600060405180830381600087803b158015620013a057600080fd5b505af1158015620013b5573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b600080516020620061068339815191526200144e816200356e565b63ffffffff8916600090815260816020526040902062001475818a8a8a8a8a8a8a62003902565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b90041615620014dd576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620015166200270f565b6040518263ffffffff1660e01b81526004016200153591815260200190565b600060405180830381600087803b1580156200155057600080fd5b505af115801562001565573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a604051620015af93929190620052d2565b60405180910390a350505050505050505050565b63ffffffff82166000908152608160205260409020620015f36000805160206200610683398151915233620022e9565b6200164757606f5460ff16156200161d57604051630bc011ff60e21b815260040160405180910390fd5b620016298183620034b8565b6200164757604051630674f25160e11b815260040160405180910390fd5b62001653818362003cfe565b505050565b6000805160206200608683398151915262001673816200356e565b6103e88261ffff1610806200168d57506103ff8261ffff16115b15620016ac57604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200171f600080516020620060c683398151915233620022e9565b620017be57608454600160801b90046001600160401b031615806200176f57506084544290620017649062093a8090600160801b90046001600160401b031662005309565b6001600160401b0316115b806200179f57506087544290620017949062093a80906001600160401b031662005309565b6001600160401b0316115b15620017be5760405163692baaad60e11b815260040160405180910390fd5b620017c862003ef0565b565b60009081526034602052604090206001015490565b620017ea82620017ca565b620017f5816200356e565b62001653838362003f6f565b6001600160a01b03811633146200182b57604051630b4ad1cd60e31b815260040160405180910390fd5b62001837828262003fdb565b5050565b6000805160206200608683398151915262001856816200356e565b606f5460ff1662001898576084546001600160401b03600160c01b909104811690831610620018985760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190620016f890849062004984565b60006086546064620018fd919062005333565b905090565b60008051602062005fc68339815191526200191d816200356e565b63ffffffff821615806200193c5750607e5463ffffffff908116908316115b156200195b57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff1615159003620019a257604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b600080516020620060e683398151915262001a08816200356e565b63ffffffff8816158062001a275750607e5463ffffffff908116908916115b1562001a4657604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff161515900362001a8d57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001acb576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062001ae69063ffffffff166200534d565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001b34906200486d565b62001b429392919062005373565b604051809103906000f08015801562001b5f573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001dd3949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001e13908d908d9088908e908e908e90600401620053aa565b600060405180830381600087803b15801562001e2e57600080fd5b505af115801562001e43573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001e7d90878787878762004045565b979650505050505050565b606f5460ff161562001ead57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001efc92600160c01b90048116911662005309565b6001600160401b0316111562001f2557604051638a0704d360e01b815260040160405180910390fd5b6103e862001f3488886200540d565b6001600160401b0316111562001f5d57604051635acfba9d60e11b815260040160405180910390fd5b62001f6f818989898989898962003902565b62001f7b818762004180565b6085546001600160401b03166000036200208957600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001ff7576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620020306200270f565b6040518263ffffffff1660e01b81526004016200204f91815260200190565b600060405180830381600087803b1580156200206a57600080fd5b505af11580156200207f573d6000803e3d6000fd5b5050505062002153565b62002094816200437d565b600681018054600160801b90046001600160401b0316906010620020b88362005430565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b48887896040516200219993929190620052d2565b60405180910390a3505050505050505050565b606f5460ff1615620021d157604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88166000908152608160205260409020620021f881898989898989896200357a565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16200225762003ef0565b505050505050505050565b80516080805463ffffffff191663ffffffff90921691909117905560005b815181101562001837578181815181106200229f576200229f62005457565b602002602001015160816000836001620022ba91906200546d565b63ffffffff16815260208101919091526040016000206005015580620022e08162005483565b91505062002280565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162002365919062004f92565b602060405180830381865afa15801562002383573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620023a991906200549f565b608454909150600090620023d0906001600160401b03600160401b8204811691166200540d565b6001600160401b0316905080600003620023ed5760009250505090565b620023f98183620054cf565b9250505090565b606f5460009060ff16156200242857604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362002460576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200248b57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620024be9084906001600160401b031662005309565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620024f4878362005309565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b03199092169290931691909117179055905062002583836200437d565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a2582604051620025bb919062004984565b60405180910390a29695505050505050565b60008051602062006086833981519152620025e8816200356e565b606f5460ff1662002623576085546001600160401b0390811690831610620026235760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590620016f890849062004984565b600080516020620060868339815191526200268b816200356e565b62015180826001600160401b03161115620026b957604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890620016f890849062004984565b60805460009063ffffffff168082036200272b57506000919050565b6000816001600160401b0381111562002748576200274862004c5a565b60405190808252806020026020018201604052801562002772578160200160208202803683370190505b50905060005b82811015620027e55760816000620027928360016200546d565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620027c557620027c562005457565b602090810291909101015280620027dc8162005483565b91505062002778565b50600060205b8360011462002a2957600062002803600286620054e6565b62002810600287620054cf565b6200281c91906200546d565b90506000816001600160401b038111156200283b576200283b62004c5a565b60405190808252806020026020018201604052801562002865578160200160208202803683370190505b50905060005b82811015620029dd5762002881600184620054fd565b811480156200289c575062002898600288620054e6565b6001145b156200291c5785620028b082600262005333565b81518110620028c357620028c362005457565b602002602001015185604051602001620028df92919062005513565b604051602081830303815290604052805190602001208282815181106200290a576200290a62005457565b602002602001018181525050620029c8565b856200292a82600262005333565b815181106200293d576200293d62005457565b60200260200101518682600262002955919062005333565b620029629060016200546d565b8151811062002975576200297562005457565b60200260200101516040516020016200299092919062005513565b60405160208183030381529060405280519060200120828281518110620029bb57620029bb62005457565b6020026020010181815250505b80620029d48162005483565b9150506200286b565b508094508195508384604051602001620029f992919062005513565b604051602081830303815290604052805190602001209350828062002a1e9062005521565b9350505050620027eb565b60008360008151811062002a415762002a4162005457565b6020026020010151905060005b8281101562002ac757818460405160200162002a6c92919062005513565b604051602081830303815290604052805190602001209150838460405160200162002a9992919062005513565b604051602081830303815290604052805190602001209350808062002abe9062005483565b91505062002a4e565b5095945050505050565b60008051602062005f8683398151915262002aec816200356e565b63ffffffff8416158062002b0b5750607e5463ffffffff908116908516115b1562002b2a57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002b6b576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002bba57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002c0157604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002c3f57604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002cbf8462001263565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002d149216908b908b906004016200553b565b600060405180830381600087803b15801562002d2f57600080fd5b505af115801562002d44573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005fa683398151915262002db9816200356e565b683635c9adc5dea0000082118062002dd45750633b9aca0082105b1562002df357604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620016f8565b62002e3482620017ca565b62002e3f816200356e565b62001653838362003fdb565b6000805160206200600683398151915262002e66816200356e565b608780546001600160401b031916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc1697691600480830192600092919082900301818387803b15801562002ee357600080fd5b505af115801562002ef8573d6000803e3d6000fd5b5050505062002f0662004448565b50565b6000805160206200606683398151915262002f24816200356e565b6001600160401b03841660009081526083602052604090205463ffffffff161562002f62576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b03871660009081526082602052604090205463ffffffff161562002fa057604051630d409b9360e41b815260040160405180910390fd5b600062002fb3888888888760006200328a565b60008080526002909101602052604090209390935550505050505050565b60008051602062005fe683398151915262002fec816200356e565b607e8054600091908290620030079063ffffffff166200534d565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620031aa969594939291906200557b565b60405180910390a25050505050505050565b600054610100900460ff16620017c85760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b7f565b62001837828262003f6f565b60006200324283620017ca565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6080805460009182918290620032a69063ffffffff166200534d565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000876001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff16021790555080608260008a6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150878260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550868260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620034a59594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b03828116600090815260048501602052604081205490924292620034eb92918116911662005309565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b03161562003551575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002f068133620044a1565b60078801546000906001600160401b039081169087161015620035b05760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620036515760068901546001600160401b03600160801b90910481169089161115620035fa5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200364a57604051632bd2e3e760e01b815260040160405180910390fd5b50620036c6565b506001600160401b0385166000908152600289016020526040902054806200368c576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620036c657604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620036ff5750876001600160401b0316876001600160401b031611155b8062003723575060068901546001600160401b03600160c01b909104811690881611155b15620037425760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b900481169086161462003789576040516332a2a77f60e01b815260040160405180910390fd5b60006200379b8a888888868962004045565b9050600060008051602062006026833981519152600283604051620037c19190620055c8565b602060405180830381855afa158015620037df573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200380491906200549f565b620038109190620054e6565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200385491889190600401620055e6565b602060405180830381865afa15801562003872573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003898919062005623565b620038b6576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620038f55760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620039108a620034fd565b60078b01549091506001600160401b039081169089161015620039465760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620039e95760068a01546001600160401b03600160801b9091048116908a161115620039905760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620039e257604051632bd2e3e760e01b815260040160405180910390fd5b5062003a59565b6001600160401b038816600090815260028b01602052604090205491508162003a25576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b0316111562003a5957604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b03161162003a8c5760405163b9b18f5760e01b815260040160405180910390fd5b600062003a9e8b8a8a8a878b62004045565b905060006000805160206200602683398151915260028360405162003ac49190620055c8565b602060405180830381855afa15801562003ae2573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003b0791906200549f565b62003b139190620054e6565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003b5791899190600401620055e6565b602060405180830381865afa15801562003b75573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003b9b919062005623565b62003bb9576040516309bde33960e01b815260040160405180910390fd5b600062003bc7848b6200540d565b905062003c2087826001600160401b031662003be262002314565b62003bee919062005333565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620044cb565b80608460088282829054906101000a90046001600160401b031662003c46919062005309565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b15801562003cd657600080fd5b505af115801562003ceb573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003d3d575060068201546001600160401b03600160801b9091048116908216115b1562003d5c5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003e186200270f565b6040518263ffffffff1660e01b815260040162003e3791815260200190565b600060405180830381600087803b15801562003e5257600080fd5b505af115801562003e67573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003f4c57600080fd5b505af115801562003f61573d6000803e3d6000fd5b50505050620017c86200451f565b62003f7b8282620022e9565b620018375760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003fe78282620022e9565b15620018375760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b03808616600081815260038901602052604080822054938816825290205460609291158015906200407b575081155b156200409a5760405163340c614f60e11b815260040160405180910390fd5b80620040b9576040516366385b5160e01b815260040160405180910390fd5b620040c4846200457c565b620040e2576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b60006200418d83620034fd565b9050816000806200419f84846200540d565b6085546001600160401b039182169250600091620041c691600160401b90041642620054fd565b90505b846001600160401b0316846001600160401b03161462004250576001600160401b038085166000908152600389016020526040902060018101549091168210156200422b576001810154600160401b90046001600160401b0316945062004249565b6200423786866200540d565b6001600160401b031693505062004250565b50620041c9565b60006200425e8484620054fd565b905083811015620042bc57808403600c81116200427c57806200427f565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620042b157620042b1620054b9565b046086555062004334565b838103600c8111620042cf5780620042d2565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a764000002816200430c576200430c620054b9565b04905080608654670de0b6b3a764000002816200432d576200432d620054b9565b0460865550505b683635c9adc5dea0000060865411156200435b57683635c9adc5dea0000060865562004373565b633b9aca0060865410156200437357633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002f06576006810154600090620043c890600160c01b90046001600160401b0316600162005309565b9050620043d68282620034b8565b156200183757600682015460009060029062004404908490600160801b90046001600160401b03166200540d565b62004410919062005647565b6200441c908362005309565b90506200442a8382620034b8565b156200443c5762001653838262003cfe565b62001653838362003cfe565b606f5460ff166200446c57604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b620044ad8282620022e9565b6200183757604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526200165390849062004602565b606f5460ff16156200454457604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b038316108015620045b3575067ffffffff00000001604083901c6001600160401b0316105b8015620045d4575067ffffffff00000001608083901c6001600160401b0316105b8015620045ec575067ffffffff0000000160c083901c105b15620045fa57506001919050565b506000919050565b600062004659826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620046db9092919063ffffffff16565b8051909150156200165357808060200190518101906200467a919062005623565b620016535760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b7f565b6060620046ec8484600085620046f4565b949350505050565b606082471015620047575760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b7f565b600080866001600160a01b03168587604051620047759190620055c8565b60006040518083038185875af1925050503d8060008114620047b4576040519150601f19603f3d011682016040523d82523d6000602084013e620047b9565b606091505b509150915062001e7d87838387606083156200483a57825160000362004832576001600160a01b0385163b620048325760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b7f565b5081620046ec565b620046ec8383815115620048515781518083602001fd5b8060405162461bcd60e51b815260040162000b7f919062004ea0565b6108f5806200567183390190565b6001600160a01b038116811462002f0657600080fd5b80356001600160401b03811681146200356957600080fd5b6000806000806000806000806000806101408b8d031215620048ca57600080fd5b8a35620048d7816200487b565b9950620048e760208c0162004891565b9850620048f760408c0162004891565b975060608b013562004909816200487b565b965060808b01356200491b816200487b565b955060a08b01356200492d816200487b565b945060c08b01356200493f816200487b565b935060e08b013562004951816200487b565b9250620049626101008c0162004891565b9150620049736101208c0162004891565b90509295989b9194979a5092959850565b6001600160401b0391909116815260200190565b803563ffffffff811681146200356957600080fd5b60008060408385031215620049c157600080fd5b620049cc8362004998565b9150620049dc6020840162004891565b90509250929050565b60008060008060008060c08789031215620049ff57600080fd5b863562004a0c816200487b565b955062004a1c6020880162004891565b945062004a2c6040880162004891565b9350606087013562004a3e816200487b565b9250608087013562004a50816200487b565b915060a087013562004a62816200487b565b809150509295509295509295565b60006020828403121562004a8357600080fd5b62000fac8262004998565b80610300810183101562000faf57600080fd5b6000806000806000806000806103e0898b03121562004abf57600080fd5b62004aca8962004998565b975062004ada60208a0162004891565b965062004aea60408a0162004891565b955062004afa60608a0162004891565b945062004b0a60808a0162004891565b935060a0890135925060c0890135915062004b298a60e08b0162004a8e565b90509295985092959890939650565b6000806000806000806000806103e0898b03121562004b5657600080fd5b62004b618962004998565b975062004b7160208a0162004891565b965062004b8160408a0162004891565b955062004b9160608a0162004891565b94506080890135935060a0890135925060c089013562004bb1816200487b565b915062004b298a60e08b0162004a8e565b60006020828403121562004bd557600080fd5b813561ffff8116811462004be857600080fd5b9392505050565b60006020828403121562004c0257600080fd5b5035919050565b6000806040838503121562004c1d57600080fd5b82359150602083013562004c31816200487b565b809150509250929050565b60006020828403121562004c4f57600080fd5b62000fac8262004891565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562004c9b5762004c9b62004c5a565b604052919050565b600082601f83011262004cb557600080fd5b81356001600160401b0381111562004cd15762004cd162004c5a565b62004ce6601f8201601f191660200162004c70565b81815284602083860101111562004cfc57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600080600060e0888a03121562004d3557600080fd5b62004d408862004998565b965062004d506020890162004891565b9550604088013562004d62816200487b565b9450606088013562004d74816200487b565b9350608088013562004d86816200487b565b925060a08801356001600160401b038082111562004da357600080fd5b62004db18b838c0162004ca3565b935060c08a013591508082111562004dc857600080fd5b5062004dd78a828b0162004ca3565b91505092959891949750929550565b60008060008060008060c0878903121562004e0057600080fd5b62004e0b8762004998565b955062004e1b6020880162004891565b945062004e2b6040880162004891565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004e6957818101518382015260200162004e4f565b50506000910152565b6000815180845262004e8c81602086016020860162004e4c565b601f01601f19169290920160200192915050565b60208152600062000fac602083018462004e72565b6000602080838503121562004ec957600080fd5b82356001600160401b038082111562004ee157600080fd5b818501915085601f83011262004ef657600080fd5b81358181111562004f0b5762004f0b62004c5a565b8060051b915062004f1e84830162004c70565b818152918301840191848101908884111562004f3957600080fd5b938501935b8385101562004f595784358252938501939085019062004f3e565b98975050505050505050565b6000806040838503121562004f7957600080fd5b62004f848362004891565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000806000806060858703121562004fbd57600080fd5b843562004fca816200487b565b935062004fda6020860162004998565b925060408501356001600160401b038082111562004ff757600080fd5b818701915087601f8301126200500c57600080fd5b8135818111156200501c57600080fd5b8860208285010111156200502f57600080fd5b95989497505060200194505050565b6000602082840312156200505157600080fd5b813562004be8816200487b565b803560ff811681146200356957600080fd5b60008060008060008060c087890312156200508a57600080fd5b863562005097816200487b565b95506020870135620050a9816200487b565b9450620050b96040880162004891565b9350620050c96060880162004891565b925060808701359150620050e060a088016200505e565b90509295509295509295565b60008060008060008060c087890312156200510657600080fd5b863562005113816200487b565b9550602087013562005125816200487b565b9450620051356040880162004891565b935062005145606088016200505e565b92506080870135915060a08701356001600160401b038111156200516857600080fd5b6200517689828a0162004ca3565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b8054600090600181811c9080831680620051ec57607f831692505b602080841082036200520e57634e487b7160e01b600052602260045260246000fd5b838852602088018280156200522c5760018114620052435762005270565b60ff198716825285151560051b8201975062005270565b60008981526020902060005b878110156200526a578154848201529086019084016200524f565b83019850505b5050505050505092915050565b6001600160a01b0386811682528516602082015260a060408201819052600090620052ab90830186620051d1565b8281036060840152620052bf8186620051d1565b9150508260808301529695505050505050565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b038181168382160190808211156200532c576200532c620052f3565b5092915050565b808202811582820484141762000faf5762000faf620052f3565b600063ffffffff808316818103620053695762005369620052f3565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620053a19083018462004e72565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c060808201819052600090620053ec9083018562004e72565b82810360a084015262005400818562004e72565b9998505050505050505050565b6001600160401b038281168282160390808211156200532c576200532c620052f3565b60006001600160401b038281166002600160401b03198101620053695762005369620052f3565b634e487b7160e01b600052603260045260246000fd5b8082018082111562000faf5762000faf620052f3565b600060018201620054985762005498620052f3565b5060010190565b600060208284031215620054b257600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082620054e157620054e1620054b9565b500490565b600082620054f857620054f8620054b9565b500690565b8181038181111562000faf5762000faf620052f3565b918252602082015260400190565b600081620055335762005533620052f3565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a0820181905260009062004f599083018462004e72565b60008251620055dc81846020870162004e4c565b9190910192915050565b61032081016103008085843782018360005b600181101562005619578151835260209283019290910190600101620055f8565b5050509392505050565b6000602082840312156200563657600080fd5b8151801515811462004be857600080fd5b60006001600160401b0383811680620056645762005664620054b9565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca26469706673582212208e78e901799caaaff866d77d874534e79db9f4bae5f48cfae79611891464d2c664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220d44303e2010f53f125bbe3701c14ed18ee41ed5358105277cd564671f4cf395a64736f6c63430008140033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620002b65760003560e01c80630645af0914620002bb578063066ec01214620002d4578063080b311114620003005780630a0d9fbe14620003285780630e36f582146200034357806311f6b287146200035a57806312b86e1914620003715780631489ed10146200038857806315064c96146200039f5780631608859c14620003ad5780631796a1ae14620003c45780631816b7e514620003eb5780632072f6c51462000402578063248a9ca3146200040c5780632528016914620004325780632f2ff15d14620004e757806330c27dde14620004fe57806336568abe1462000512578063394218e91462000529578063477fa270146200054057806355a71ee0146200054957806360469169146200058d57806365c0504d14620005975780637222020f1462000646578063727885e9146200065d5780637975fcfe14620006745780637fb6e76a146200069a578063841b24d714620006c357806387c20c0114620006de5780638bd4f07114620006f55780638f698ec5146200070c57806391d14854146200072357806399f5634e146200073a5780639a908e7314620007445780639c9f3dfe146200075b578063a066215c1462000772578063a217fddf1462000789578063a2967d991462000792578063a3c573eb146200079c578063afd23cbe14620007d3578063b99d0ad714620007fd578063c1acbc3414620008d5578063c4c928c214620008f0578063ceee281d1462000907578063d02103ca1462000930578063d5073f6f1462000958578063d547741f146200096f578063d939b3151462000986578063dbc16976146200099a578063dde0ff7714620009a4578063e0bfd3d214620009bf578063e46761c414620009d6578063f34eb8eb14620009fe578063f4e926751462000a15578063f9c4c2ae1462000a26575b600080fd5b620002d2620002cc366004620048a9565b62000b3d565b005b608454620002e8906001600160401b031681565b604051620002f7919062004984565b60405180910390f35b6200031762000311366004620049ad565b62000f8b565b6040519015158152602001620002f7565b608554620002e890600160401b90046001600160401b031681565b620002d262000354366004620049e5565b62000fb5565b620002e86200036b36600462004a70565b62001263565b620002d26200038236600462004aa1565b62001283565b620002d26200039936600462004b38565b62001433565b606f54620003179060ff1681565b620002d2620003be366004620049ad565b620015c3565b607e54620003d59063ffffffff1681565b60405163ffffffff9091168152602001620002f7565b620002d2620003fc36600462004bc2565b62001658565b620002d262001704565b620004236200041d36600462004bef565b620017ca565b604051908152602001620002f7565b620004b362000443366004620049ad565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002f7565b620002d2620004f836600462004c09565b620017df565b608754620002e8906001600160401b031681565b620002d26200052336600462004c09565b62001801565b620002d26200053a36600462004c3c565b6200183b565b60865462000423565b620004236200055a366004620049ad565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b62000423620018ea565b620005fc620005a836600462004a70565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002f7565b620002d26200065736600462004a70565b62001902565b620002d26200066e36600462004d19565b620019ed565b6200068b6200068536600462004de6565b62001e55565b604051620002f7919062004ea0565b620003d5620006ab36600462004c3c565b60836020526000908152604090205463ffffffff1681565b608454620002e890600160c01b90046001600160401b031681565b620002d2620006ef36600462004b38565b62001e88565b620002d26200070636600462004aa1565b620021ac565b620002d26200071d36600462004eb5565b62002262565b620003176200073436600462004c09565b620022e9565b6200042362002314565b620002e86200075536600462004f65565b62002400565b620002d26200076c36600462004c3c565b620025cd565b620002d26200078336600462004c3c565b62002670565b62000423600081565b620004236200270f565b620007c47f000000000000000000000000000000000000000000000000000000000000000081565b604051620002f7919062004f92565b608554620007e990600160801b900461ffff1681565b60405161ffff9091168152602001620002f7565b620008936200080e366004620049ad565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002f7919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002e890600160801b90046001600160401b031681565b620002d26200090136600462004fa6565b62002ad1565b620003d5620009183660046200503e565b60826020526000908152604090205463ffffffff1681565b620007c47f000000000000000000000000000000000000000000000000000000000000000081565b620002d26200096936600462004bef565b62002d9e565b620002d26200098036600462004c09565b62002e29565b608554620002e8906001600160401b031681565b620002d262002e4b565b608454620002e890600160401b90046001600160401b031681565b620002d2620009d036600462005070565b62002f09565b620007c47f000000000000000000000000000000000000000000000000000000000000000081565b620002d262000a0f366004620050ec565b62002fd1565b608054620003d59063ffffffff1681565b62000abd62000a3736600462004a70565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002f7565b600054600290610100900460ff1615801562000b60575060005460ff8083169116105b62000b885760405162461bcd60e51b815260040162000b7f9062005183565b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c09620031bc565b62000c24600080516020620061068339815191528c62003229565b62000c3160008862003229565b62000c4c60008051602062005fe68339815191528862003229565b62000c67600080516020620060668339815191528862003229565b62000c8260008051602062005f868339815191528862003229565b62000c9d60008051602062005fc68339815191528962003229565b62000cb8600080516020620060e68339815191528962003229565b62000cd3600080516020620060068339815191528962003229565b62000cee600080516020620060868339815191528962003229565b62000d186000805160206200610683398151915260008051602062005f6683398151915262003235565b62000d3360008051602062005f668339815191528962003229565b62000d4e60008051602062005fa68339815191528962003229565b62000d78600080516020620060c6833981519152600080516020620060a683398151915262003235565b62000d93600080516020620060c68339815191528762003229565b62000dae600080516020620060a68339815191528762003229565b6073546074546001600160401b03600160401b9092048216911680821462000de957604051632e4cc54360e11b815260040160405180910390fd5b600062000e11888888886000607460009054906101000a90046001600160401b03166200328a565b6001600160401b03838116600081815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b91829004909b1681029a909a17905560068a01805490911690931797870297909717909155600787018054909616909417909455607a54606f549390915290549251635d6717a560e01b81529394506001600160a01b038c811694635d6717a59462000f0f9493831693600160581b900490921691607691607791906004016200527d565b600060405180830381600087803b15801562000f2a57600080fd5b505af115801562000f3f573d6000803e3d6000fd5b50506000805461ff0019169055505060405160ff85168152600080516020620060468339815191529350602001915062000f769050565b60405180910390a15050505050505050505050565b63ffffffff8216600090815260816020526040812062000fac9083620034b8565b90505b92915050565b600054600290610100900460ff1615801562000fd8575060005460ff8083169116105b62000ff75760405162461bcd60e51b815260040162000b7f9062005183565b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562001078620031bc565b62001093600080516020620061068339815191528862003229565b620010a060008462003229565b620010bb60008051602062005fe68339815191528462003229565b620010d6600080516020620060668339815191528462003229565b620010f160008051602062005f868339815191528462003229565b6200110c60008051602062005fc68339815191528562003229565b62001127600080516020620060e68339815191528562003229565b62001142600080516020620060068339815191528562003229565b6200115d600080516020620060868339815191528562003229565b620011876000805160206200610683398151915260008051602062005f6683398151915262003235565b620011a260008051602062005f668339815191528562003229565b620011bd60008051602062005fa68339815191528562003229565b620011e7600080516020620060c6833981519152600080516020620060a683398151915262003235565b62001202600080516020620060c68339815191528362003229565b6200121d600080516020620060a68339815191528362003229565b6200122a60003362003229565b6000805461ff001916905560405160ff82168152600080516020620060468339815191529060200160405180910390a150505050505050565b63ffffffff8116600090815260816020526040812062000faf90620034fd565b600080516020620061068339815191526200129e816200356e565b63ffffffff89166000908152608160205260409020620012c5818a8a8a8a8a8a8a6200357a565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b900416156200132d576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620013666200270f565b6040518263ffffffff1660e01b81526004016200138591815260200190565b600060405180830381600087803b158015620013a057600080fd5b505af1158015620013b5573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b600080516020620061068339815191526200144e816200356e565b63ffffffff8916600090815260816020526040902062001475818a8a8a8a8a8a8a62003902565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b90041615620014dd576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620015166200270f565b6040518263ffffffff1660e01b81526004016200153591815260200190565b600060405180830381600087803b1580156200155057600080fd5b505af115801562001565573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a604051620015af93929190620052d2565b60405180910390a350505050505050505050565b63ffffffff82166000908152608160205260409020620015f36000805160206200610683398151915233620022e9565b6200164757606f5460ff16156200161d57604051630bc011ff60e21b815260040160405180910390fd5b620016298183620034b8565b6200164757604051630674f25160e11b815260040160405180910390fd5b62001653818362003cfe565b505050565b6000805160206200608683398151915262001673816200356e565b6103e88261ffff1610806200168d57506103ff8261ffff16115b15620016ac57604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200171f600080516020620060c683398151915233620022e9565b620017be57608454600160801b90046001600160401b031615806200176f57506084544290620017649062093a8090600160801b90046001600160401b031662005309565b6001600160401b0316115b806200179f57506087544290620017949062093a80906001600160401b031662005309565b6001600160401b0316115b15620017be5760405163692baaad60e11b815260040160405180910390fd5b620017c862003ef0565b565b60009081526034602052604090206001015490565b620017ea82620017ca565b620017f5816200356e565b62001653838362003f6f565b6001600160a01b03811633146200182b57604051630b4ad1cd60e31b815260040160405180910390fd5b62001837828262003fdb565b5050565b6000805160206200608683398151915262001856816200356e565b606f5460ff1662001898576084546001600160401b03600160c01b909104811690831610620018985760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190620016f890849062004984565b60006086546064620018fd919062005333565b905090565b60008051602062005fc68339815191526200191d816200356e565b63ffffffff821615806200193c5750607e5463ffffffff908116908316115b156200195b57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff1615159003620019a257604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b600080516020620060e683398151915262001a08816200356e565b63ffffffff8816158062001a275750607e5463ffffffff908116908916115b1562001a4657604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff161515900362001a8d57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001acb576040516337c8fe0960e11b815260040160405180910390fd5b6080805460009190829062001ae69063ffffffff166200534d565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b0390921691309162001b34906200486d565b62001b429392919062005373565b604051809103906000f08015801562001b5f573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001dd3949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001e13908d908d9088908e908e908e90600401620053aa565b600060405180830381600087803b15801562001e2e57600080fd5b505af115801562001e43573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001e7d90878787878762004045565b979650505050505050565b606f5460ff161562001ead57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001efc92600160c01b90048116911662005309565b6001600160401b0316111562001f2557604051638a0704d360e01b815260040160405180910390fd5b6103e862001f3488886200540d565b6001600160401b0316111562001f5d57604051635acfba9d60e11b815260040160405180910390fd5b62001f6f818989898989898962003902565b62001f7b818762004180565b6085546001600160401b03166000036200208957600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001ff7576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620020306200270f565b6040518263ffffffff1660e01b81526004016200204f91815260200190565b600060405180830381600087803b1580156200206a57600080fd5b505af11580156200207f573d6000803e3d6000fd5b5050505062002153565b62002094816200437d565b600681018054600160801b90046001600160401b0316906010620020b88362005430565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b48887896040516200219993929190620052d2565b60405180910390a3505050505050505050565b606f5460ff1615620021d157604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88166000908152608160205260409020620021f881898989898989896200357a565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16200225762003ef0565b505050505050505050565b80516080805463ffffffff191663ffffffff90921691909117905560005b815181101562001837578181815181106200229f576200229f62005457565b602002602001015160816000836001620022ba91906200546d565b63ffffffff16815260208101919091526040016000206005015580620022e08162005483565b91505062002280565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162002365919062004f92565b602060405180830381865afa15801562002383573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620023a991906200549f565b608454909150600090620023d0906001600160401b03600160401b8204811691166200540d565b6001600160401b0316905080600003620023ed5760009250505090565b620023f98183620054cf565b9250505090565b606f5460009060ff16156200242857604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362002460576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03166000036200248b57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620024be9084906001600160401b031662005309565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690506000620024f4878362005309565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b03199092169290931691909117179055905062002583836200437d565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a2582604051620025bb919062004984565b60405180910390a29695505050505050565b60008051602062006086833981519152620025e8816200356e565b606f5460ff1662002623576085546001600160401b0390811690831610620026235760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590620016f890849062004984565b600080516020620060868339815191526200268b816200356e565b62015180826001600160401b03161115620026b957604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890620016f890849062004984565b60805460009063ffffffff168082036200272b57506000919050565b6000816001600160401b0381111562002748576200274862004c5a565b60405190808252806020026020018201604052801562002772578160200160208202803683370190505b50905060005b82811015620027e55760816000620027928360016200546d565b63ffffffff1663ffffffff16815260200190815260200160002060050154828281518110620027c557620027c562005457565b602090810291909101015280620027dc8162005483565b91505062002778565b50600060205b8360011462002a2957600062002803600286620054e6565b62002810600287620054cf565b6200281c91906200546d565b90506000816001600160401b038111156200283b576200283b62004c5a565b60405190808252806020026020018201604052801562002865578160200160208202803683370190505b50905060005b82811015620029dd5762002881600184620054fd565b811480156200289c575062002898600288620054e6565b6001145b156200291c5785620028b082600262005333565b81518110620028c357620028c362005457565b602002602001015185604051602001620028df92919062005513565b604051602081830303815290604052805190602001208282815181106200290a576200290a62005457565b602002602001018181525050620029c8565b856200292a82600262005333565b815181106200293d576200293d62005457565b60200260200101518682600262002955919062005333565b620029629060016200546d565b8151811062002975576200297562005457565b60200260200101516040516020016200299092919062005513565b60405160208183030381529060405280519060200120828281518110620029bb57620029bb62005457565b6020026020010181815250505b80620029d48162005483565b9150506200286b565b508094508195508384604051602001620029f992919062005513565b604051602081830303815290604052805190602001209350828062002a1e9062005521565b9350505050620027eb565b60008360008151811062002a415762002a4162005457565b6020026020010151905060005b8281101562002ac757818460405160200162002a6c92919062005513565b604051602081830303815290604052805190602001209150838460405160200162002a9992919062005513565b604051602081830303815290604052805190602001209350808062002abe9062005483565b91505062002a4e565b5095945050505050565b60008051602062005f8683398151915262002aec816200356e565b63ffffffff8416158062002b0b5750607e5463ffffffff908116908516115b1562002b2a57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff169081900362002b6b576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002bba57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff161515900362002c0157604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002c3f57604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b0319909116179055600062002cbf8462001263565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002d149216908b908b906004016200553b565b600060405180830381600087803b15801562002d2f57600080fd5b505af115801562002d44573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005fa683398151915262002db9816200356e565b683635c9adc5dea0000082118062002dd45750633b9aca0082105b1562002df357604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620016f8565b62002e3482620017ca565b62002e3f816200356e565b62001653838362003fdb565b6000805160206200600683398151915262002e66816200356e565b608780546001600160401b031916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc1697691600480830192600092919082900301818387803b15801562002ee357600080fd5b505af115801562002ef8573d6000803e3d6000fd5b5050505062002f0662004448565b50565b6000805160206200606683398151915262002f24816200356e565b6001600160401b03841660009081526083602052604090205463ffffffff161562002f62576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b03871660009081526082602052604090205463ffffffff161562002fa057604051630d409b9360e41b815260040160405180910390fd5b600062002fb3888888888760006200328a565b60008080526002909101602052604090209390935550505050505050565b60008051602062005fe683398151915262002fec816200356e565b607e8054600091908290620030079063ffffffff166200534d565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620031aa969594939291906200557b565b60405180910390a25050505050505050565b600054610100900460ff16620017c85760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b7f565b62001837828262003f6f565b60006200324283620017ca565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6080805460009182918290620032a69063ffffffff166200534d565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000876001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff16021790555080608260008a6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150878260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550868260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620034a59594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b03828116600090815260048501602052604081205490924292620034eb92918116911662005309565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b03161562003551575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002f068133620044a1565b60078801546000906001600160401b039081169087161015620035b05760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620036515760068901546001600160401b03600160801b90910481169089161115620035fa5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b90920416146200364a57604051632bd2e3e760e01b815260040160405180910390fd5b50620036c6565b506001600160401b0385166000908152600289016020526040902054806200368c576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620036c657604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620036ff5750876001600160401b0316876001600160401b031611155b8062003723575060068901546001600160401b03600160c01b909104811690881611155b15620037425760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b900481169086161462003789576040516332a2a77f60e01b815260040160405180910390fd5b60006200379b8a888888868962004045565b9050600060008051602062006026833981519152600283604051620037c19190620055c8565b602060405180830381855afa158015620037df573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200380491906200549f565b620038109190620054e6565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200385491889190600401620055e6565b602060405180830381865afa15801562003872573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003898919062005623565b620038b6576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c016020526040902060020154859003620038f55760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620039108a620034fd565b60078b01549091506001600160401b039081169089161015620039465760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620039e95760068a01546001600160401b03600160801b9091048116908a161115620039905760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620039e257604051632bd2e3e760e01b815260040160405180910390fd5b5062003a59565b6001600160401b038816600090815260028b01602052604090205491508162003a25576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b0316111562003a5957604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b03161162003a8c5760405163b9b18f5760e01b815260040160405180910390fd5b600062003a9e8b8a8a8a878b62004045565b905060006000805160206200602683398151915260028360405162003ac49190620055c8565b602060405180830381855afa15801562003ae2573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019062003b0791906200549f565b62003b139190620054e6565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003b5791899190600401620055e6565b602060405180830381865afa15801562003b75573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003b9b919062005623565b62003bb9576040516309bde33960e01b815260040160405180910390fd5b600062003bc7848b6200540d565b905062003c2087826001600160401b031662003be262002314565b62003bee919062005333565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620044cb565b80608460088282829054906101000a90046001600160401b031662003c46919062005309565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b15801562003cd657600080fd5b505af115801562003ceb573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003d3d575060068201546001600160401b03600160801b9091048116908216115b1562003d5c5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003e186200270f565b6040518263ffffffff1660e01b815260040162003e3791815260200190565b600060405180830381600087803b15801562003e5257600080fd5b505af115801562003e67573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562003f4c57600080fd5b505af115801562003f61573d6000803e3d6000fd5b50505050620017c86200451f565b62003f7b8282620022e9565b620018375760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003fe78282620022e9565b15620018375760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b03808616600081815260038901602052604080822054938816825290205460609291158015906200407b575081155b156200409a5760405163340c614f60e11b815260040160405180910390fd5b80620040b9576040516366385b5160e01b815260040160405180910390fd5b620040c4846200457c565b620040e2576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b60006200418d83620034fd565b9050816000806200419f84846200540d565b6085546001600160401b039182169250600091620041c691600160401b90041642620054fd565b90505b846001600160401b0316846001600160401b03161462004250576001600160401b038085166000908152600389016020526040902060018101549091168210156200422b576001810154600160401b90046001600160401b0316945062004249565b6200423786866200540d565b6001600160401b031693505062004250565b50620041c9565b60006200425e8484620054fd565b905083811015620042bc57808403600c81116200427c57806200427f565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620042b157620042b1620054b9565b046086555062004334565b838103600c8111620042cf5780620042d2565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a764000002816200430c576200430c620054b9565b04905080608654670de0b6b3a764000002816200432d576200432d620054b9565b0460865550505b683635c9adc5dea0000060865411156200435b57683635c9adc5dea0000060865562004373565b633b9aca0060865410156200437357633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002f06576006810154600090620043c890600160c01b90046001600160401b0316600162005309565b9050620043d68282620034b8565b156200183757600682015460009060029062004404908490600160801b90046001600160401b03166200540d565b62004410919062005647565b6200441c908362005309565b90506200442a8382620034b8565b156200443c5762001653838262003cfe565b62001653838362003cfe565b606f5460ff166200446c57604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b620044ad8282620022e9565b6200183757604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526200165390849062004602565b606f5460ff16156200454457604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b038316108015620045b3575067ffffffff00000001604083901c6001600160401b0316105b8015620045d4575067ffffffff00000001608083901c6001600160401b0316105b8015620045ec575067ffffffff0000000160c083901c105b15620045fa57506001919050565b506000919050565b600062004659826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620046db9092919063ffffffff16565b8051909150156200165357808060200190518101906200467a919062005623565b620016535760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b7f565b6060620046ec8484600085620046f4565b949350505050565b606082471015620047575760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b7f565b600080866001600160a01b03168587604051620047759190620055c8565b60006040518083038185875af1925050503d8060008114620047b4576040519150601f19603f3d011682016040523d82523d6000602084013e620047b9565b606091505b509150915062001e7d87838387606083156200483a57825160000362004832576001600160a01b0385163b620048325760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b7f565b5081620046ec565b620046ec8383815115620048515781518083602001fd5b8060405162461bcd60e51b815260040162000b7f919062004ea0565b6108f5806200567183390190565b6001600160a01b038116811462002f0657600080fd5b80356001600160401b03811681146200356957600080fd5b6000806000806000806000806000806101408b8d031215620048ca57600080fd5b8a35620048d7816200487b565b9950620048e760208c0162004891565b9850620048f760408c0162004891565b975060608b013562004909816200487b565b965060808b01356200491b816200487b565b955060a08b01356200492d816200487b565b945060c08b01356200493f816200487b565b935060e08b013562004951816200487b565b9250620049626101008c0162004891565b9150620049736101208c0162004891565b90509295989b9194979a5092959850565b6001600160401b0391909116815260200190565b803563ffffffff811681146200356957600080fd5b60008060408385031215620049c157600080fd5b620049cc8362004998565b9150620049dc6020840162004891565b90509250929050565b60008060008060008060c08789031215620049ff57600080fd5b863562004a0c816200487b565b955062004a1c6020880162004891565b945062004a2c6040880162004891565b9350606087013562004a3e816200487b565b9250608087013562004a50816200487b565b915060a087013562004a62816200487b565b809150509295509295509295565b60006020828403121562004a8357600080fd5b62000fac8262004998565b80610300810183101562000faf57600080fd5b6000806000806000806000806103e0898b03121562004abf57600080fd5b62004aca8962004998565b975062004ada60208a0162004891565b965062004aea60408a0162004891565b955062004afa60608a0162004891565b945062004b0a60808a0162004891565b935060a0890135925060c0890135915062004b298a60e08b0162004a8e565b90509295985092959890939650565b6000806000806000806000806103e0898b03121562004b5657600080fd5b62004b618962004998565b975062004b7160208a0162004891565b965062004b8160408a0162004891565b955062004b9160608a0162004891565b94506080890135935060a0890135925060c089013562004bb1816200487b565b915062004b298a60e08b0162004a8e565b60006020828403121562004bd557600080fd5b813561ffff8116811462004be857600080fd5b9392505050565b60006020828403121562004c0257600080fd5b5035919050565b6000806040838503121562004c1d57600080fd5b82359150602083013562004c31816200487b565b809150509250929050565b60006020828403121562004c4f57600080fd5b62000fac8262004891565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562004c9b5762004c9b62004c5a565b604052919050565b600082601f83011262004cb557600080fd5b81356001600160401b0381111562004cd15762004cd162004c5a565b62004ce6601f8201601f191660200162004c70565b81815284602083860101111562004cfc57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600080600060e0888a03121562004d3557600080fd5b62004d408862004998565b965062004d506020890162004891565b9550604088013562004d62816200487b565b9450606088013562004d74816200487b565b9350608088013562004d86816200487b565b925060a08801356001600160401b038082111562004da357600080fd5b62004db18b838c0162004ca3565b935060c08a013591508082111562004dc857600080fd5b5062004dd78a828b0162004ca3565b91505092959891949750929550565b60008060008060008060c0878903121562004e0057600080fd5b62004e0b8762004998565b955062004e1b6020880162004891565b945062004e2b6040880162004891565b9350606087013592506080870135915060a087013590509295509295509295565b60005b8381101562004e6957818101518382015260200162004e4f565b50506000910152565b6000815180845262004e8c81602086016020860162004e4c565b601f01601f19169290920160200192915050565b60208152600062000fac602083018462004e72565b6000602080838503121562004ec957600080fd5b82356001600160401b038082111562004ee157600080fd5b818501915085601f83011262004ef657600080fd5b81358181111562004f0b5762004f0b62004c5a565b8060051b915062004f1e84830162004c70565b818152918301840191848101908884111562004f3957600080fd5b938501935b8385101562004f595784358252938501939085019062004f3e565b98975050505050505050565b6000806040838503121562004f7957600080fd5b62004f848362004891565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000806000806060858703121562004fbd57600080fd5b843562004fca816200487b565b935062004fda6020860162004998565b925060408501356001600160401b038082111562004ff757600080fd5b818701915087601f8301126200500c57600080fd5b8135818111156200501c57600080fd5b8860208285010111156200502f57600080fd5b95989497505060200194505050565b6000602082840312156200505157600080fd5b813562004be8816200487b565b803560ff811681146200356957600080fd5b60008060008060008060c087890312156200508a57600080fd5b863562005097816200487b565b95506020870135620050a9816200487b565b9450620050b96040880162004891565b9350620050c96060880162004891565b925060808701359150620050e060a088016200505e565b90509295509295509295565b60008060008060008060c087890312156200510657600080fd5b863562005113816200487b565b9550602087013562005125816200487b565b9450620051356040880162004891565b935062005145606088016200505e565b92506080870135915060a08701356001600160401b038111156200516857600080fd5b6200517689828a0162004ca3565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b8054600090600181811c9080831680620051ec57607f831692505b602080841082036200520e57634e487b7160e01b600052602260045260246000fd5b838852602088018280156200522c5760018114620052435762005270565b60ff198716825285151560051b8201975062005270565b60008981526020902060005b878110156200526a578154848201529086019084016200524f565b83019850505b5050505050505092915050565b6001600160a01b0386811682528516602082015260a060408201819052600090620052ab90830186620051d1565b8281036060840152620052bf8186620051d1565b9150508260808301529695505050505050565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b038181168382160190808211156200532c576200532c620052f3565b5092915050565b808202811582820484141762000faf5762000faf620052f3565b600063ffffffff808316818103620053695762005369620052f3565b6001019392505050565b6001600160a01b03848116825283166020820152606060408201819052600090620053a19083018462004e72565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c060808201819052600090620053ec9083018562004e72565b82810360a084015262005400818562004e72565b9998505050505050505050565b6001600160401b038281168282160390808211156200532c576200532c620052f3565b60006001600160401b038281166002600160401b03198101620053695762005369620052f3565b634e487b7160e01b600052603260045260246000fd5b8082018082111562000faf5762000faf620052f3565b600060018201620054985762005498620052f3565b5060010190565b600060208284031215620054b257600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b600082620054e157620054e1620054b9565b500490565b600082620054f857620054f8620054b9565b500690565b8181038181111562000faf5762000faf620052f3565b918252602082015260400190565b600081620055335762005533620052f3565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a0820181905260009062004f599083018462004e72565b60008251620055dc81846020870162004e4c565b9190910192915050565b61032081016103008085843782018360005b600181101562005619578151835260209283019290910190600101620055f8565b5050509392505050565b6000602082840312156200563657600080fd5b8151801515811462004be857600080fd5b60006001600160401b0383811680620056645762005664620054b9565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca26469706673582212208e78e901799caaaff866d77d874534e79db9f4bae5f48cfae79611891464d2c664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220d44303e2010f53f125bbe3701c14ed18ee41ed5358105277cd564671f4cf395a64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonRollupManagerMockInternalTest.json b/compiled-contracts/paris/PolygonRollupManagerMockInternalTest.json index 0affe7bd5..5c50645c6 100644 --- a/compiled-contracts/paris/PolygonRollupManagerMockInternalTest.json +++ b/compiled-contracts/paris/PolygonRollupManagerMockInternalTest.json @@ -1269,7 +1269,7 @@ "type": "address" }, { - "internalType": "contract PolygonZkEVMV2Existent", + "internalType": "contract PolygonZkEVMExistentEtrog", "name": "polygonZkEVM", "type": "address" }, @@ -1965,8 +1965,8 @@ "type": "function" } ], - "bytecode": "0x60e06040523480156200001157600080fd5b5060405162005be938038062005be9833981016040819052620000349162000141565b6001600160a01b0380841660805280831660c052811660a0528282826200005a62000066565b50505050505062000195565b600054610100900460ff1615620000d35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000126576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013e57600080fd5b50565b6000806000606084860312156200015757600080fd5b8351620001648162000128565b6020850151909350620001778162000128565b60408501519092506200018a8162000128565b809150509250925092565b60805160a05160c0516159ec620001fd6000396000818161099601528181611e5d015261350e01526000818161075c015281816129d701526138080152600081816108f001528181610efa015281816110aa01528181611bc401526136f701526159ec6000f3fe60806040523480156200001157600080fd5b50600436106200029e5760003560e01c80630645af0914620002a3578063066ec01214620002bc578063080b311114620002e85780630a0d9fbe146200031057806311f6b287146200032b57806312b86e1914620003425780631489ed10146200035957806315064c9614620003705780631608859c146200037e5780631796a1ae14620003955780631816b7e514620003bc5780632072f6c514620003d3578063248a9ca314620003dd5780632528016914620004035780632f2ff15d14620004b857806330c27dde14620004cf57806336568abe14620004e3578063394218e914620004fa578063477fa270146200051157806355a71ee0146200051a57806360469169146200055e57806365c0504d14620005685780637222020f1462000617578063727885e9146200062e5780637975fcfe14620006455780637fb6e76a146200066b578063841b24d7146200069457806387c20c0114620006af5780638bd4f07114620006c657806391d1485414620006dd57806399f5634e14620006f45780639a908e7314620006fe5780639c9f3dfe1462000715578063a066215c146200072c578063a217fddf1462000743578063a2967d99146200074c578063a3c573eb1462000756578063afd23cbe146200078d578063b99d0ad714620007b7578063c1acbc34146200088f578063c4c928c214620008aa578063ceee281d14620008c1578063d02103ca14620008ea578063d5073f6f1462000912578063d547741f1462000929578063d939b3151462000940578063dbc169761462000954578063dde0ff77146200095e578063e0bfd3d21462000979578063e46761c41462000990578063f34eb8eb14620009b8578063f4e9267514620009cf578063f9c4c2ae14620009e0575b600080fd5b620002ba620002b4366004620043ed565b62000af7565b005b608454620002d0906001600160401b031681565b604051620002df9190620044c8565b60405180910390f35b620002ff620002f9366004620044f1565b62000e04565b6040519015158152602001620002df565b608554620002d090600160401b90046001600160401b031681565b620002d06200033c36600462004529565b62000e2e565b620002ba620003533660046200455a565b62000e4e565b620002ba6200036a366004620045f1565b62000ffe565b606f54620002ff9060ff1681565b620002ba6200038f366004620044f1565b6200118e565b607e54620003a69063ffffffff1681565b60405163ffffffff9091168152602001620002df565b620002ba620003cd3660046200467b565b62001223565b620002ba620012cf565b620003f4620003ee366004620046a8565b62001395565b604051908152602001620002df565b6200048462000414366004620044f1565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002df565b620002ba620004c9366004620046c2565b620013aa565b608754620002d0906001600160401b031681565b620002ba620004f4366004620046c2565b620013cc565b620002ba6200050b366004620046f5565b62001406565b608654620003f4565b620003f46200052b366004620044f1565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620003f4620014b5565b620005cd6200057936600462004529565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002df565b620002ba6200062836600462004529565b620014cd565b620002ba6200063f366004620047bd565b620015b8565b6200065c620006563660046200488a565b62001a20565b604051620002df919062004944565b620003a66200067c366004620046f5565b60836020526000908152604090205463ffffffff1681565b608454620002d090600160c01b90046001600160401b031681565b620002ba620006c0366004620045f1565b62001a53565b620002ba620006d73660046200455a565b62001d77565b620002ff620006ee366004620046c2565b62001e2d565b620003f462001e58565b620002d06200070f36600462004959565b62001f44565b620002ba62000726366004620046f5565b62002111565b620002ba6200073d366004620046f5565b620021b4565b620003f4600081565b620003f462002253565b6200077e7f000000000000000000000000000000000000000000000000000000000000000081565b604051620002df919062004986565b608554620007a390600160801b900461ffff1681565b60405161ffff9091168152602001620002df565b6200084d620007c8366004620044f1565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002df919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002d090600160801b90046001600160401b031681565b620002ba620008bb3660046200499a565b62002615565b620003a6620008d236600462004a32565b60826020526000908152604090205463ffffffff1681565b6200077e7f000000000000000000000000000000000000000000000000000000000000000081565b620002ba62000923366004620046a8565b620028e2565b620002ba6200093a366004620046c2565b6200296d565b608554620002d0906001600160401b031681565b620002ba6200298f565b608454620002d090600160401b90046001600160401b031681565b620002ba6200098a36600462004a64565b62002a4d565b6200077e7f000000000000000000000000000000000000000000000000000000000000000081565b620002ba620009c936600462004ae0565b62002b15565b608054620003a69063ffffffff1681565b62000a77620009f136600462004529565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002df565b600054600290610100900460ff1615801562000b1a575060005460ff8083169116105b62000b835760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c0462002d00565b62000c1f600080516020620059978339815191528c62002d6d565b62000c2c60008862002d6d565b62000c47600080516020620058978339815191528862002d6d565b62000c62600080516020620058f78339815191528862002d6d565b62000c7d600080516020620058378339815191528862002d6d565b62000c98600080516020620058778339815191528962002d6d565b62000cb3600080516020620059778339815191528962002d6d565b62000cce600080516020620058b78339815191528962002d6d565b62000ce9600080516020620059178339815191528962002d6d565b62000d13600080516020620059978339815191526000805160206200581783398151915262002d79565b62000d2e600080516020620058178339815191528962002d6d565b62000d49600080516020620058578339815191528962002d6d565b62000d73600080516020620059578339815191526000805160206200593783398151915262002d79565b62000d8e600080516020620059578339815191528762002d6d565b62000da9600080516020620059378339815191528762002d6d565b62000db660003362002d6d565b6000805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050505050565b63ffffffff8216600090815260816020526040812062000e25908362002dce565b90505b92915050565b63ffffffff8116600090815260816020526040812062000e289062002e13565b6000805160206200599783398151915262000e698162002e84565b63ffffffff8916600090815260816020526040902062000e90818a8a8a8a8a8a8a62002e90565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000ef8576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000f3162002253565b6040518263ffffffff1660e01b815260040162000f5091815260200190565b600060405180830381600087803b15801562000f6b57600080fd5b505af115801562000f80573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005997833981519152620010198162002e84565b63ffffffff8916600090815260816020526040902062001040818a8a8a8a8a8a8a62003218565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b90041615620010a8576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620010e162002253565b6040518263ffffffff1660e01b81526004016200110091815260200190565b600060405180830381600087803b1580156200111b57600080fd5b505af115801562001130573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a6040516200117a9392919062004b77565b60405180910390a350505050505050505050565b63ffffffff82166000908152608160205260409020620011be600080516020620059978339815191523362001e2d565b6200121257606f5460ff1615620011e857604051630bc011ff60e21b815260040160405180910390fd5b620011f4818362002dce565b6200121257604051630674f25160e11b815260040160405180910390fd5b6200121e818362003614565b505050565b600080516020620059178339815191526200123e8162002e84565b6103e88261ffff1610806200125857506103ff8261ffff16115b156200127757604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620012ea600080516020620059578339815191523362001e2d565b6200138957608454600160801b90046001600160401b031615806200133a575060845442906200132f9062093a8090600160801b90046001600160401b031662004bae565b6001600160401b0316115b806200136a575060875442906200135f9062093a80906001600160401b031662004bae565b6001600160401b0316115b15620013895760405163692baaad60e11b815260040160405180910390fd5b6200139362003806565b565b60009081526034602052604090206001015490565b620013b58262001395565b620013c08162002e84565b6200121e838362003885565b6001600160a01b0381163314620013f657604051630b4ad1cd60e31b815260040160405180910390fd5b620014028282620038f1565b5050565b60008051602062005917833981519152620014218162002e84565b606f5460ff1662001463576084546001600160401b03600160c01b909104811690831610620014635760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190620012c3908490620044c8565b60006086546064620014c8919062004bd8565b905090565b60008051602062005877833981519152620014e88162002e84565b63ffffffff82161580620015075750607e5463ffffffff908116908316115b156200152657604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200156d57604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b60008051602062005977833981519152620015d38162002e84565b63ffffffff88161580620015f25750607e5463ffffffff908116908916115b156200161157604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff16151590036200165857604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001696576040516337c8fe0960e11b815260040160405180910390fd5b60808054600091908290620016b19063ffffffff1662004bf2565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b03909216913091620016ff90620043b1565b6200170d9392919062004c18565b604051809103906000f0801580156200172a573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c6040516200199e949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b03831690637125702290620019de908d908d9088908e908e908e9060040162004c4f565b600060405180830381600087803b158015620019f957600080fd5b505af115801562001a0e573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001a489087878787876200395b565b979650505050505050565b606f5460ff161562001a7857604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001ac792600160c01b90048116911662004bae565b6001600160401b0316111562001af057604051638a0704d360e01b815260040160405180910390fd5b6103e862001aff888862004cb2565b6001600160401b0316111562001b2857604051635acfba9d60e11b815260040160405180910390fd5b62001b3a818989898989898962003218565b62001b46818762003a96565b6085546001600160401b031660000362001c5457600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001bc2576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001bfb62002253565b6040518263ffffffff1660e01b815260040162001c1a91815260200190565b600060405180830381600087803b15801562001c3557600080fd5b505af115801562001c4a573d6000803e3d6000fd5b5050505062001d1e565b62001c5f8162003c93565b600681018054600160801b90046001600160401b031690601062001c838362004cd5565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b488878960405162001d649392919062004b77565b60405180910390a3505050505050505050565b606f5460ff161562001d9c57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff8816600090815260816020526040902062001dc3818989898989898962002e90565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a162001e2262003806565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162001ea9919062004986565b602060405180830381865afa15801562001ec7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001eed919062004cfc565b60845490915060009062001f14906001600160401b03600160401b82048116911662004cb2565b6001600160401b031690508060000362001f315760009250505090565b62001f3d818362004d2c565b9250505090565b606f5460009060ff161562001f6c57604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362001fa4576040516371653c1560e01b815260040160405180910390fd5b836001600160401b031660000362001fcf57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620020029084906001600160401b031662004bae565b82546101009290920a6001600160401b038181021990931691831602179091556006830154169050600062002038878362004bae565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b031990921692909316919091171790559050620020c78362003c93565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a2582604051620020ff9190620044c8565b60405180910390a29695505050505050565b600080516020620059178339815191526200212c8162002e84565b606f5460ff1662002167576085546001600160401b0390811690831610620021675760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590620012c3908490620044c8565b60008051602062005917833981519152620021cf8162002e84565b62015180826001600160401b03161115620021fd57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890620012c3908490620044c8565b60805460009063ffffffff168082036200226f57506000919050565b6000816001600160401b038111156200228c576200228c62004713565b604051908082528060200260200182016040528015620022b6578160200160208202803683370190505b50905060005b82811015620023295760816000620022d683600162004d43565b63ffffffff1663ffffffff1681526020019081526020016000206005015482828151811062002309576200230962004d59565b602090810291909101015280620023208162004d6f565b915050620022bc565b50600060205b836001146200256d5760006200234760028662004d8b565b6200235460028762004d2c565b62002360919062004d43565b90506000816001600160401b038111156200237f576200237f62004713565b604051908082528060200260200182016040528015620023a9578160200160208202803683370190505b50905060005b828110156200252157620023c560018462004da2565b81148015620023e05750620023dc60028862004d8b565b6001145b15620024605785620023f482600262004bd8565b8151811062002407576200240762004d59565b6020026020010151856040516020016200242392919062004db8565b604051602081830303815290604052805190602001208282815181106200244e576200244e62004d59565b6020026020010181815250506200250c565b856200246e82600262004bd8565b8151811062002481576200248162004d59565b60200260200101518682600262002499919062004bd8565b620024a690600162004d43565b81518110620024b957620024b962004d59565b6020026020010151604051602001620024d492919062004db8565b60405160208183030381529060405280519060200120828281518110620024ff57620024ff62004d59565b6020026020010181815250505b80620025188162004d6f565b915050620023af565b5080945081955083846040516020016200253d92919062004db8565b6040516020818303038152906040528051906020012093508280620025629062004dc6565b93505050506200232f565b60008360008151811062002585576200258562004d59565b6020026020010151905060005b828110156200260b578184604051602001620025b092919062004db8565b6040516020818303038152906040528051906020012091508384604051602001620025dd92919062004db8565b6040516020818303038152906040528051906020012093508080620026029062004d6f565b91505062002592565b5095945050505050565b60008051602062005837833981519152620026308162002e84565b63ffffffff841615806200264f5750607e5463ffffffff908116908516115b156200266e57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff1690819003620026af576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b031603620026fe57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff16151590036200274557604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b90920416146200278357604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790556000620028038462000e2e565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef28692620028589216908b908b9060040162004de0565b600060405180830381600087803b1580156200287357600080fd5b505af115801562002888573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005857833981519152620028fd8162002e84565b683635c9adc5dea00000821180620029185750633b9aca0082105b156200293757604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620012c3565b620029788262001395565b620029838162002e84565b6200121e8383620038f1565b600080516020620058b7833981519152620029aa8162002e84565b608780546001600160401b031916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc1697691600480830192600092919082900301818387803b15801562002a2757600080fd5b505af115801562002a3c573d6000803e3d6000fd5b5050505062002a4a62003d5e565b50565b600080516020620058f783398151915262002a688162002e84565b6001600160401b03841660009081526083602052604090205463ffffffff161562002aa6576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b03871660009081526082602052604090205463ffffffff161562002ae457604051630d409b9360e41b815260040160405180910390fd5b600062002af78888888887600062003db7565b60008080526002909101602052604090209390935550505050505050565b6000805160206200589783398151915262002b308162002e84565b607e805460009190829062002b4b9063ffffffff1662004bf2565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002cee9695949392919062004e20565b60405180910390a25050505050505050565b600054610100900460ff16620013935760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b7a565b62001402828262003885565b600062002d868362001395565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6085546001600160401b0382811660009081526004850160205260408120549092429262002e0192918116911662004bae565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b03161562002e67575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002a4a813362003fe5565b60078801546000906001600160401b03908116908716101562002ec65760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b0388161562002f675760068901546001600160401b03600160801b9091048116908916111562002f105760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b909204161462002f6057604051632bd2e3e760e01b815260040160405180910390fd5b5062002fdc565b506001600160401b03851660009081526002890160205260409020548062002fa2576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b9091048116908716111562002fdc57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620030155750876001600160401b0316876001600160401b031611155b8062003039575060068901546001600160401b03600160c01b909104811690881611155b15620030585760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b90048116908616146200309f576040516332a2a77f60e01b815260040160405180910390fd5b6000620030b18a88888886896200395b565b90506000600080516020620058d7833981519152600283604051620030d7919062004e79565b602060405180830381855afa158015620030f5573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200311a919062004cfc565b62003126919062004d8b565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200316a9188919060040162004e97565b602060405180830381865afa15801562003188573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620031ae919062004ed4565b620031cc576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c0160205260409020600201548590036200320b5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620032268a62002e13565b60078b01549091506001600160401b0390811690891610156200325c5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620032ff5760068a01546001600160401b03600160801b9091048116908a161115620032a65760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620032f857604051632bd2e3e760e01b815260040160405180910390fd5b506200336f565b6001600160401b038816600090815260028b0160205260409020549150816200333b576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200336f57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620033a25760405163b9b18f5760e01b815260040160405180910390fd5b6000620033b48b8a8a8a878b6200395b565b90506000600080516020620058d7833981519152600283604051620033da919062004e79565b602060405180830381855afa158015620033f8573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200341d919062004cfc565b62003429919062004d8b565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200346d9189919060040162004e97565b602060405180830381865afa1580156200348b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620034b1919062004ed4565b620034cf576040516309bde33960e01b815260040160405180910390fd5b6000620034dd848b62004cb2565b90506200353687826001600160401b0316620034f862001e58565b62003504919062004bd8565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906200400f565b80608460088282829054906101000a90046001600160401b03166200355c919062004bae565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b158015620035ec57600080fd5b505af115801562003601573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003653575060068201546001600160401b03600160801b9091048116908216115b15620036725760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200372e62002253565b6040518263ffffffff1660e01b81526004016200374d91815260200190565b600060405180830381600087803b1580156200376857600080fd5b505af11580156200377d573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200386257600080fd5b505af115801562003877573d6000803e3d6000fd5b505050506200139362004063565b62003891828262001e2d565b620014025760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b620038fd828262001e2d565b15620014025760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003991575081155b15620039b05760405163340c614f60e11b815260040160405180910390fd5b80620039cf576040516366385b5160e01b815260040160405180910390fd5b620039da84620040c0565b620039f8576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b600062003aa38362002e13565b90508160008062003ab5848462004cb2565b6085546001600160401b03918216925060009162003adc91600160401b9004164262004da2565b90505b846001600160401b0316846001600160401b03161462003b66576001600160401b0380851660009081526003890160205260409020600181015490911682101562003b41576001810154600160401b90046001600160401b0316945062003b5f565b62003b4d868662004cb2565b6001600160401b031693505062003b66565b5062003adf565b600062003b74848462004da2565b90508381101562003bd257808403600c811162003b92578062003b95565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a608654028162003bc75762003bc762004d16565b046086555062003c4a565b838103600c811162003be5578062003be8565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162003c225762003c2262004d16565b04905080608654670de0b6b3a7640000028162003c435762003c4362004d16565b0460865550505b683635c9adc5dea00000608654111562003c7157683635c9adc5dea0000060865562003c89565b633b9aca00608654101562003c8957633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002a4a57600681015460009062003cde90600160c01b90046001600160401b0316600162004bae565b905062003cec828262002dce565b156200140257600682015460009060029062003d1a908490600160801b90046001600160401b031662004cb2565b62003d26919062004ef8565b62003d32908362004bae565b905062003d40838262002dce565b1562003d52576200121e838262003614565b6200121e838362003614565b606f5460ff1662003d8257604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b608080546000918291829062003dd39063ffffffff1662004bf2565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000876001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff16021790555080608260008a6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150878260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550868260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a88888860405162003fd29594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b62003ff1828262001e2d565b6200140257604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526200121e90849062004146565b606f5460ff16156200408857604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b038316108015620040f7575067ffffffff00000001604083901c6001600160401b0316105b801562004118575067ffffffff00000001608083901c6001600160401b0316105b801562004130575067ffffffff0000000160c083901c105b156200413e57506001919050565b506000919050565b60006200419d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200421f9092919063ffffffff16565b8051909150156200121e5780806020019051810190620041be919062004ed4565b6200121e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b7a565b606062004230848460008562004238565b949350505050565b6060824710156200429b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b7a565b600080866001600160a01b03168587604051620042b9919062004e79565b60006040518083038185875af1925050503d8060008114620042f8576040519150601f19603f3d011682016040523d82523d6000602084013e620042fd565b606091505b509150915062001a4887838387606083156200437e57825160000362004376576001600160a01b0385163b620043765760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b7a565b508162004230565b620042308383815115620043955781518083602001fd5b8060405162461bcd60e51b815260040162000b7a919062004944565b6108f58062004f2283390190565b6001600160a01b038116811462002a4a57600080fd5b80356001600160401b038116811462002e7f57600080fd5b6000806000806000806000806000806101408b8d0312156200440e57600080fd5b8a356200441b81620043bf565b99506200442b60208c01620043d5565b98506200443b60408c01620043d5565b975060608b01356200444d81620043bf565b965060808b01356200445f81620043bf565b955060a08b01356200447181620043bf565b945060c08b01356200448381620043bf565b935060e08b01356200449581620043bf565b9250620044a66101008c01620043d5565b9150620044b76101208c01620043d5565b90509295989b9194979a5092959850565b6001600160401b0391909116815260200190565b803563ffffffff8116811462002e7f57600080fd5b600080604083850312156200450557600080fd5b6200451083620044dc565b91506200452060208401620043d5565b90509250929050565b6000602082840312156200453c57600080fd5b62000e2582620044dc565b80610300810183101562000e2857600080fd5b6000806000806000806000806103e0898b0312156200457857600080fd5b6200458389620044dc565b97506200459360208a01620043d5565b9650620045a360408a01620043d5565b9550620045b360608a01620043d5565b9450620045c360808a01620043d5565b935060a0890135925060c08901359150620045e28a60e08b0162004547565b90509295985092959890939650565b6000806000806000806000806103e0898b0312156200460f57600080fd5b6200461a89620044dc565b97506200462a60208a01620043d5565b96506200463a60408a01620043d5565b95506200464a60608a01620043d5565b94506080890135935060a0890135925060c08901356200466a81620043bf565b9150620045e28a60e08b0162004547565b6000602082840312156200468e57600080fd5b813561ffff81168114620046a157600080fd5b9392505050565b600060208284031215620046bb57600080fd5b5035919050565b60008060408385031215620046d657600080fd5b823591506020830135620046ea81620043bf565b809150509250929050565b6000602082840312156200470857600080fd5b62000e2582620043d5565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200473b57600080fd5b81356001600160401b038082111562004758576200475862004713565b604051601f8301601f19908116603f0116810190828211818310171562004783576200478362004713565b816040528381528660208588010111156200479d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a031215620047d957600080fd5b620047e488620044dc565b9650620047f460208901620043d5565b955060408801356200480681620043bf565b945060608801356200481881620043bf565b935060808801356200482a81620043bf565b925060a08801356001600160401b03808211156200484757600080fd5b620048558b838c0162004729565b935060c08a01359150808211156200486c57600080fd5b506200487b8a828b0162004729565b91505092959891949750929550565b60008060008060008060c08789031215620048a457600080fd5b620048af87620044dc565b9550620048bf60208801620043d5565b9450620048cf60408801620043d5565b9350606087013592506080870135915060a087013590509295509295509295565b60005b838110156200490d578181015183820152602001620048f3565b50506000910152565b6000815180845262004930816020860160208601620048f0565b601f01601f19169290920160200192915050565b60208152600062000e25602083018462004916565b600080604083850312156200496d57600080fd5b6200497883620043d5565b946020939093013593505050565b6001600160a01b0391909116815260200190565b60008060008060608587031215620049b157600080fd5b8435620049be81620043bf565b9350620049ce60208601620044dc565b925060408501356001600160401b0380821115620049eb57600080fd5b818701915087601f83011262004a0057600080fd5b81358181111562004a1057600080fd5b88602082850101111562004a2357600080fd5b95989497505060200194505050565b60006020828403121562004a4557600080fd5b8135620046a181620043bf565b803560ff8116811462002e7f57600080fd5b60008060008060008060c0878903121562004a7e57600080fd5b863562004a8b81620043bf565b9550602087013562004a9d81620043bf565b945062004aad60408801620043d5565b935062004abd60608801620043d5565b92506080870135915062004ad460a0880162004a52565b90509295509295509295565b60008060008060008060c0878903121562004afa57600080fd5b863562004b0781620043bf565b9550602087013562004b1981620043bf565b945062004b2960408801620043d5565b935062004b396060880162004a52565b92506080870135915060a08701356001600160401b0381111562004b5c57600080fd5b62004b6a89828a0162004729565b9150509295509295509295565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004bd15762004bd162004b98565b5092915050565b808202811582820484141762000e285762000e2862004b98565b600063ffffffff80831681810362004c0e5762004c0e62004b98565b6001019392505050565b6001600160a01b0384811682528316602082015260606040820181905260009062004c469083018462004916565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c06080820181905260009062004c919083018562004916565b82810360a084015262004ca5818562004916565b9998505050505050505050565b6001600160401b0382811682821603908082111562004bd15762004bd162004b98565b60006001600160401b038281166002600160401b0319810162004c0e5762004c0e62004b98565b60006020828403121562004d0f57600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b60008262004d3e5762004d3e62004d16565b500490565b8082018082111562000e285762000e2862004b98565b634e487b7160e01b600052603260045260246000fd5b60006001820162004d845762004d8462004b98565b5060010190565b60008262004d9d5762004d9d62004d16565b500690565b8181038181111562000e285762000e2862004b98565b918252602082015260400190565b60008162004dd85762004dd862004b98565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a0820181905260009062004e6d9083018462004916565b98975050505050505050565b6000825162004e8d818460208701620048f0565b9190910192915050565b61032081016103008085843782018360005b600181101562004eca57815183526020928301929091019060010162004ea9565b5050509392505050565b60006020828403121562004ee757600080fd5b81518015158114620046a157600080fd5b60006001600160401b038381168062004f155762004f1562004d16565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca26469706673582212208e78e901799caaaff866d77d874534e79db9f4bae5f48cfae79611891464d2c664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000013dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a264697066735822122030adb7cdaec642e29699593befd5e18a415007c5419bda7df68fe953295bd7ff64736f6c63430008140033", - "deployedBytecode": "0x60806040523480156200001157600080fd5b50600436106200029e5760003560e01c80630645af0914620002a3578063066ec01214620002bc578063080b311114620002e85780630a0d9fbe146200031057806311f6b287146200032b57806312b86e1914620003425780631489ed10146200035957806315064c9614620003705780631608859c146200037e5780631796a1ae14620003955780631816b7e514620003bc5780632072f6c514620003d3578063248a9ca314620003dd5780632528016914620004035780632f2ff15d14620004b857806330c27dde14620004cf57806336568abe14620004e3578063394218e914620004fa578063477fa270146200051157806355a71ee0146200051a57806360469169146200055e57806365c0504d14620005685780637222020f1462000617578063727885e9146200062e5780637975fcfe14620006455780637fb6e76a146200066b578063841b24d7146200069457806387c20c0114620006af5780638bd4f07114620006c657806391d1485414620006dd57806399f5634e14620006f45780639a908e7314620006fe5780639c9f3dfe1462000715578063a066215c146200072c578063a217fddf1462000743578063a2967d99146200074c578063a3c573eb1462000756578063afd23cbe146200078d578063b99d0ad714620007b7578063c1acbc34146200088f578063c4c928c214620008aa578063ceee281d14620008c1578063d02103ca14620008ea578063d5073f6f1462000912578063d547741f1462000929578063d939b3151462000940578063dbc169761462000954578063dde0ff77146200095e578063e0bfd3d21462000979578063e46761c41462000990578063f34eb8eb14620009b8578063f4e9267514620009cf578063f9c4c2ae14620009e0575b600080fd5b620002ba620002b4366004620043ed565b62000af7565b005b608454620002d0906001600160401b031681565b604051620002df9190620044c8565b60405180910390f35b620002ff620002f9366004620044f1565b62000e04565b6040519015158152602001620002df565b608554620002d090600160401b90046001600160401b031681565b620002d06200033c36600462004529565b62000e2e565b620002ba620003533660046200455a565b62000e4e565b620002ba6200036a366004620045f1565b62000ffe565b606f54620002ff9060ff1681565b620002ba6200038f366004620044f1565b6200118e565b607e54620003a69063ffffffff1681565b60405163ffffffff9091168152602001620002df565b620002ba620003cd3660046200467b565b62001223565b620002ba620012cf565b620003f4620003ee366004620046a8565b62001395565b604051908152602001620002df565b6200048462000414366004620044f1565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002df565b620002ba620004c9366004620046c2565b620013aa565b608754620002d0906001600160401b031681565b620002ba620004f4366004620046c2565b620013cc565b620002ba6200050b366004620046f5565b62001406565b608654620003f4565b620003f46200052b366004620044f1565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620003f4620014b5565b620005cd6200057936600462004529565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002df565b620002ba6200062836600462004529565b620014cd565b620002ba6200063f366004620047bd565b620015b8565b6200065c620006563660046200488a565b62001a20565b604051620002df919062004944565b620003a66200067c366004620046f5565b60836020526000908152604090205463ffffffff1681565b608454620002d090600160c01b90046001600160401b031681565b620002ba620006c0366004620045f1565b62001a53565b620002ba620006d73660046200455a565b62001d77565b620002ff620006ee366004620046c2565b62001e2d565b620003f462001e58565b620002d06200070f36600462004959565b62001f44565b620002ba62000726366004620046f5565b62002111565b620002ba6200073d366004620046f5565b620021b4565b620003f4600081565b620003f462002253565b6200077e7f000000000000000000000000000000000000000000000000000000000000000081565b604051620002df919062004986565b608554620007a390600160801b900461ffff1681565b60405161ffff9091168152602001620002df565b6200084d620007c8366004620044f1565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002df919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002d090600160801b90046001600160401b031681565b620002ba620008bb3660046200499a565b62002615565b620003a6620008d236600462004a32565b60826020526000908152604090205463ffffffff1681565b6200077e7f000000000000000000000000000000000000000000000000000000000000000081565b620002ba62000923366004620046a8565b620028e2565b620002ba6200093a366004620046c2565b6200296d565b608554620002d0906001600160401b031681565b620002ba6200298f565b608454620002d090600160401b90046001600160401b031681565b620002ba6200098a36600462004a64565b62002a4d565b6200077e7f000000000000000000000000000000000000000000000000000000000000000081565b620002ba620009c936600462004ae0565b62002b15565b608054620003a69063ffffffff1681565b62000a77620009f136600462004529565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002df565b600054600290610100900460ff1615801562000b1a575060005460ff8083169116105b62000b835760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c0462002d00565b62000c1f600080516020620059978339815191528c62002d6d565b62000c2c60008862002d6d565b62000c47600080516020620058978339815191528862002d6d565b62000c62600080516020620058f78339815191528862002d6d565b62000c7d600080516020620058378339815191528862002d6d565b62000c98600080516020620058778339815191528962002d6d565b62000cb3600080516020620059778339815191528962002d6d565b62000cce600080516020620058b78339815191528962002d6d565b62000ce9600080516020620059178339815191528962002d6d565b62000d13600080516020620059978339815191526000805160206200581783398151915262002d79565b62000d2e600080516020620058178339815191528962002d6d565b62000d49600080516020620058578339815191528962002d6d565b62000d73600080516020620059578339815191526000805160206200593783398151915262002d79565b62000d8e600080516020620059578339815191528762002d6d565b62000da9600080516020620059378339815191528762002d6d565b62000db660003362002d6d565b6000805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050505050565b63ffffffff8216600090815260816020526040812062000e25908362002dce565b90505b92915050565b63ffffffff8116600090815260816020526040812062000e289062002e13565b6000805160206200599783398151915262000e698162002e84565b63ffffffff8916600090815260816020526040902062000e90818a8a8a8a8a8a8a62002e90565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000ef8576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000f3162002253565b6040518263ffffffff1660e01b815260040162000f5091815260200190565b600060405180830381600087803b15801562000f6b57600080fd5b505af115801562000f80573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005997833981519152620010198162002e84565b63ffffffff8916600090815260816020526040902062001040818a8a8a8a8a8a8a62003218565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b90041615620010a8576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620010e162002253565b6040518263ffffffff1660e01b81526004016200110091815260200190565b600060405180830381600087803b1580156200111b57600080fd5b505af115801562001130573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a6040516200117a9392919062004b77565b60405180910390a350505050505050505050565b63ffffffff82166000908152608160205260409020620011be600080516020620059978339815191523362001e2d565b6200121257606f5460ff1615620011e857604051630bc011ff60e21b815260040160405180910390fd5b620011f4818362002dce565b6200121257604051630674f25160e11b815260040160405180910390fd5b6200121e818362003614565b505050565b600080516020620059178339815191526200123e8162002e84565b6103e88261ffff1610806200125857506103ff8261ffff16115b156200127757604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620012ea600080516020620059578339815191523362001e2d565b6200138957608454600160801b90046001600160401b031615806200133a575060845442906200132f9062093a8090600160801b90046001600160401b031662004bae565b6001600160401b0316115b806200136a575060875442906200135f9062093a80906001600160401b031662004bae565b6001600160401b0316115b15620013895760405163692baaad60e11b815260040160405180910390fd5b6200139362003806565b565b60009081526034602052604090206001015490565b620013b58262001395565b620013c08162002e84565b6200121e838362003885565b6001600160a01b0381163314620013f657604051630b4ad1cd60e31b815260040160405180910390fd5b620014028282620038f1565b5050565b60008051602062005917833981519152620014218162002e84565b606f5460ff1662001463576084546001600160401b03600160c01b909104811690831610620014635760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190620012c3908490620044c8565b60006086546064620014c8919062004bd8565b905090565b60008051602062005877833981519152620014e88162002e84565b63ffffffff82161580620015075750607e5463ffffffff908116908316115b156200152657604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200156d57604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b60008051602062005977833981519152620015d38162002e84565b63ffffffff88161580620015f25750607e5463ffffffff908116908916115b156200161157604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff16151590036200165857604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001696576040516337c8fe0960e11b815260040160405180910390fd5b60808054600091908290620016b19063ffffffff1662004bf2565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b03909216913091620016ff90620043b1565b6200170d9392919062004c18565b604051809103906000f0801580156200172a573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c6040516200199e949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b03831690637125702290620019de908d908d9088908e908e908e9060040162004c4f565b600060405180830381600087803b158015620019f957600080fd5b505af115801562001a0e573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001a489087878787876200395b565b979650505050505050565b606f5460ff161562001a7857604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001ac792600160c01b90048116911662004bae565b6001600160401b0316111562001af057604051638a0704d360e01b815260040160405180910390fd5b6103e862001aff888862004cb2565b6001600160401b0316111562001b2857604051635acfba9d60e11b815260040160405180910390fd5b62001b3a818989898989898962003218565b62001b46818762003a96565b6085546001600160401b031660000362001c5457600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001bc2576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001bfb62002253565b6040518263ffffffff1660e01b815260040162001c1a91815260200190565b600060405180830381600087803b15801562001c3557600080fd5b505af115801562001c4a573d6000803e3d6000fd5b5050505062001d1e565b62001c5f8162003c93565b600681018054600160801b90046001600160401b031690601062001c838362004cd5565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b488878960405162001d649392919062004b77565b60405180910390a3505050505050505050565b606f5460ff161562001d9c57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff8816600090815260816020526040902062001dc3818989898989898962002e90565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a162001e2262003806565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162001ea9919062004986565b602060405180830381865afa15801562001ec7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001eed919062004cfc565b60845490915060009062001f14906001600160401b03600160401b82048116911662004cb2565b6001600160401b031690508060000362001f315760009250505090565b62001f3d818362004d2c565b9250505090565b606f5460009060ff161562001f6c57604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362001fa4576040516371653c1560e01b815260040160405180910390fd5b836001600160401b031660000362001fcf57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620020029084906001600160401b031662004bae565b82546101009290920a6001600160401b038181021990931691831602179091556006830154169050600062002038878362004bae565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b031990921692909316919091171790559050620020c78362003c93565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a2582604051620020ff9190620044c8565b60405180910390a29695505050505050565b600080516020620059178339815191526200212c8162002e84565b606f5460ff1662002167576085546001600160401b0390811690831610620021675760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590620012c3908490620044c8565b60008051602062005917833981519152620021cf8162002e84565b62015180826001600160401b03161115620021fd57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890620012c3908490620044c8565b60805460009063ffffffff168082036200226f57506000919050565b6000816001600160401b038111156200228c576200228c62004713565b604051908082528060200260200182016040528015620022b6578160200160208202803683370190505b50905060005b82811015620023295760816000620022d683600162004d43565b63ffffffff1663ffffffff1681526020019081526020016000206005015482828151811062002309576200230962004d59565b602090810291909101015280620023208162004d6f565b915050620022bc565b50600060205b836001146200256d5760006200234760028662004d8b565b6200235460028762004d2c565b62002360919062004d43565b90506000816001600160401b038111156200237f576200237f62004713565b604051908082528060200260200182016040528015620023a9578160200160208202803683370190505b50905060005b828110156200252157620023c560018462004da2565b81148015620023e05750620023dc60028862004d8b565b6001145b15620024605785620023f482600262004bd8565b8151811062002407576200240762004d59565b6020026020010151856040516020016200242392919062004db8565b604051602081830303815290604052805190602001208282815181106200244e576200244e62004d59565b6020026020010181815250506200250c565b856200246e82600262004bd8565b8151811062002481576200248162004d59565b60200260200101518682600262002499919062004bd8565b620024a690600162004d43565b81518110620024b957620024b962004d59565b6020026020010151604051602001620024d492919062004db8565b60405160208183030381529060405280519060200120828281518110620024ff57620024ff62004d59565b6020026020010181815250505b80620025188162004d6f565b915050620023af565b5080945081955083846040516020016200253d92919062004db8565b6040516020818303038152906040528051906020012093508280620025629062004dc6565b93505050506200232f565b60008360008151811062002585576200258562004d59565b6020026020010151905060005b828110156200260b578184604051602001620025b092919062004db8565b6040516020818303038152906040528051906020012091508384604051602001620025dd92919062004db8565b6040516020818303038152906040528051906020012093508080620026029062004d6f565b91505062002592565b5095945050505050565b60008051602062005837833981519152620026308162002e84565b63ffffffff841615806200264f5750607e5463ffffffff908116908516115b156200266e57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff1690819003620026af576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b031603620026fe57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff16151590036200274557604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b90920416146200278357604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790556000620028038462000e2e565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef28692620028589216908b908b9060040162004de0565b600060405180830381600087803b1580156200287357600080fd5b505af115801562002888573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005857833981519152620028fd8162002e84565b683635c9adc5dea00000821180620029185750633b9aca0082105b156200293757604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620012c3565b620029788262001395565b620029838162002e84565b6200121e8383620038f1565b600080516020620058b7833981519152620029aa8162002e84565b608780546001600160401b031916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc1697691600480830192600092919082900301818387803b15801562002a2757600080fd5b505af115801562002a3c573d6000803e3d6000fd5b5050505062002a4a62003d5e565b50565b600080516020620058f783398151915262002a688162002e84565b6001600160401b03841660009081526083602052604090205463ffffffff161562002aa6576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b03871660009081526082602052604090205463ffffffff161562002ae457604051630d409b9360e41b815260040160405180910390fd5b600062002af78888888887600062003db7565b60008080526002909101602052604090209390935550505050505050565b6000805160206200589783398151915262002b308162002e84565b607e805460009190829062002b4b9063ffffffff1662004bf2565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002cee9695949392919062004e20565b60405180910390a25050505050505050565b600054610100900460ff16620013935760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b7a565b62001402828262003885565b600062002d868362001395565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6085546001600160401b0382811660009081526004850160205260408120549092429262002e0192918116911662004bae565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b03161562002e67575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002a4a813362003fe5565b60078801546000906001600160401b03908116908716101562002ec65760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b0388161562002f675760068901546001600160401b03600160801b9091048116908916111562002f105760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b909204161462002f6057604051632bd2e3e760e01b815260040160405180910390fd5b5062002fdc565b506001600160401b03851660009081526002890160205260409020548062002fa2576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b9091048116908716111562002fdc57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620030155750876001600160401b0316876001600160401b031611155b8062003039575060068901546001600160401b03600160c01b909104811690881611155b15620030585760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b90048116908616146200309f576040516332a2a77f60e01b815260040160405180910390fd5b6000620030b18a88888886896200395b565b90506000600080516020620058d7833981519152600283604051620030d7919062004e79565b602060405180830381855afa158015620030f5573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200311a919062004cfc565b62003126919062004d8b565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200316a9188919060040162004e97565b602060405180830381865afa15801562003188573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620031ae919062004ed4565b620031cc576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c0160205260409020600201548590036200320b5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620032268a62002e13565b60078b01549091506001600160401b0390811690891610156200325c5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620032ff5760068a01546001600160401b03600160801b9091048116908a161115620032a65760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620032f857604051632bd2e3e760e01b815260040160405180910390fd5b506200336f565b6001600160401b038816600090815260028b0160205260409020549150816200333b576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200336f57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620033a25760405163b9b18f5760e01b815260040160405180910390fd5b6000620033b48b8a8a8a878b6200395b565b90506000600080516020620058d7833981519152600283604051620033da919062004e79565b602060405180830381855afa158015620033f8573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200341d919062004cfc565b62003429919062004d8b565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200346d9189919060040162004e97565b602060405180830381865afa1580156200348b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620034b1919062004ed4565b620034cf576040516309bde33960e01b815260040160405180910390fd5b6000620034dd848b62004cb2565b90506200353687826001600160401b0316620034f862001e58565b62003504919062004bd8565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906200400f565b80608460088282829054906101000a90046001600160401b03166200355c919062004bae565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b158015620035ec57600080fd5b505af115801562003601573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003653575060068201546001600160401b03600160801b9091048116908216115b15620036725760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200372e62002253565b6040518263ffffffff1660e01b81526004016200374d91815260200190565b600060405180830381600087803b1580156200376857600080fd5b505af11580156200377d573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200386257600080fd5b505af115801562003877573d6000803e3d6000fd5b505050506200139362004063565b62003891828262001e2d565b620014025760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b620038fd828262001e2d565b15620014025760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003991575081155b15620039b05760405163340c614f60e11b815260040160405180910390fd5b80620039cf576040516366385b5160e01b815260040160405180910390fd5b620039da84620040c0565b620039f8576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b600062003aa38362002e13565b90508160008062003ab5848462004cb2565b6085546001600160401b03918216925060009162003adc91600160401b9004164262004da2565b90505b846001600160401b0316846001600160401b03161462003b66576001600160401b0380851660009081526003890160205260409020600181015490911682101562003b41576001810154600160401b90046001600160401b0316945062003b5f565b62003b4d868662004cb2565b6001600160401b031693505062003b66565b5062003adf565b600062003b74848462004da2565b90508381101562003bd257808403600c811162003b92578062003b95565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a608654028162003bc75762003bc762004d16565b046086555062003c4a565b838103600c811162003be5578062003be8565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162003c225762003c2262004d16565b04905080608654670de0b6b3a7640000028162003c435762003c4362004d16565b0460865550505b683635c9adc5dea00000608654111562003c7157683635c9adc5dea0000060865562003c89565b633b9aca00608654101562003c8957633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002a4a57600681015460009062003cde90600160c01b90046001600160401b0316600162004bae565b905062003cec828262002dce565b156200140257600682015460009060029062003d1a908490600160801b90046001600160401b031662004cb2565b62003d26919062004ef8565b62003d32908362004bae565b905062003d40838262002dce565b1562003d52576200121e838262003614565b6200121e838362003614565b606f5460ff1662003d8257604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b608080546000918291829062003dd39063ffffffff1662004bf2565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000876001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff16021790555080608260008a6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150878260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550868260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a88888860405162003fd29594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b62003ff1828262001e2d565b6200140257604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526200121e90849062004146565b606f5460ff16156200408857604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b038316108015620040f7575067ffffffff00000001604083901c6001600160401b0316105b801562004118575067ffffffff00000001608083901c6001600160401b0316105b801562004130575067ffffffff0000000160c083901c105b156200413e57506001919050565b506000919050565b60006200419d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200421f9092919063ffffffff16565b8051909150156200121e5780806020019051810190620041be919062004ed4565b6200121e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b7a565b606062004230848460008562004238565b949350505050565b6060824710156200429b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b7a565b600080866001600160a01b03168587604051620042b9919062004e79565b60006040518083038185875af1925050503d8060008114620042f8576040519150601f19603f3d011682016040523d82523d6000602084013e620042fd565b606091505b509150915062001a4887838387606083156200437e57825160000362004376576001600160a01b0385163b620043765760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b7a565b508162004230565b620042308383815115620043955781518083602001fd5b8060405162461bcd60e51b815260040162000b7a919062004944565b6108f58062004f2283390190565b6001600160a01b038116811462002a4a57600080fd5b80356001600160401b038116811462002e7f57600080fd5b6000806000806000806000806000806101408b8d0312156200440e57600080fd5b8a356200441b81620043bf565b99506200442b60208c01620043d5565b98506200443b60408c01620043d5565b975060608b01356200444d81620043bf565b965060808b01356200445f81620043bf565b955060a08b01356200447181620043bf565b945060c08b01356200448381620043bf565b935060e08b01356200449581620043bf565b9250620044a66101008c01620043d5565b9150620044b76101208c01620043d5565b90509295989b9194979a5092959850565b6001600160401b0391909116815260200190565b803563ffffffff8116811462002e7f57600080fd5b600080604083850312156200450557600080fd5b6200451083620044dc565b91506200452060208401620043d5565b90509250929050565b6000602082840312156200453c57600080fd5b62000e2582620044dc565b80610300810183101562000e2857600080fd5b6000806000806000806000806103e0898b0312156200457857600080fd5b6200458389620044dc565b97506200459360208a01620043d5565b9650620045a360408a01620043d5565b9550620045b360608a01620043d5565b9450620045c360808a01620043d5565b935060a0890135925060c08901359150620045e28a60e08b0162004547565b90509295985092959890939650565b6000806000806000806000806103e0898b0312156200460f57600080fd5b6200461a89620044dc565b97506200462a60208a01620043d5565b96506200463a60408a01620043d5565b95506200464a60608a01620043d5565b94506080890135935060a0890135925060c08901356200466a81620043bf565b9150620045e28a60e08b0162004547565b6000602082840312156200468e57600080fd5b813561ffff81168114620046a157600080fd5b9392505050565b600060208284031215620046bb57600080fd5b5035919050565b60008060408385031215620046d657600080fd5b823591506020830135620046ea81620043bf565b809150509250929050565b6000602082840312156200470857600080fd5b62000e2582620043d5565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200473b57600080fd5b81356001600160401b038082111562004758576200475862004713565b604051601f8301601f19908116603f0116810190828211818310171562004783576200478362004713565b816040528381528660208588010111156200479d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a031215620047d957600080fd5b620047e488620044dc565b9650620047f460208901620043d5565b955060408801356200480681620043bf565b945060608801356200481881620043bf565b935060808801356200482a81620043bf565b925060a08801356001600160401b03808211156200484757600080fd5b620048558b838c0162004729565b935060c08a01359150808211156200486c57600080fd5b506200487b8a828b0162004729565b91505092959891949750929550565b60008060008060008060c08789031215620048a457600080fd5b620048af87620044dc565b9550620048bf60208801620043d5565b9450620048cf60408801620043d5565b9350606087013592506080870135915060a087013590509295509295509295565b60005b838110156200490d578181015183820152602001620048f3565b50506000910152565b6000815180845262004930816020860160208601620048f0565b601f01601f19169290920160200192915050565b60208152600062000e25602083018462004916565b600080604083850312156200496d57600080fd5b6200497883620043d5565b946020939093013593505050565b6001600160a01b0391909116815260200190565b60008060008060608587031215620049b157600080fd5b8435620049be81620043bf565b9350620049ce60208601620044dc565b925060408501356001600160401b0380821115620049eb57600080fd5b818701915087601f83011262004a0057600080fd5b81358181111562004a1057600080fd5b88602082850101111562004a2357600080fd5b95989497505060200194505050565b60006020828403121562004a4557600080fd5b8135620046a181620043bf565b803560ff8116811462002e7f57600080fd5b60008060008060008060c0878903121562004a7e57600080fd5b863562004a8b81620043bf565b9550602087013562004a9d81620043bf565b945062004aad60408801620043d5565b935062004abd60608801620043d5565b92506080870135915062004ad460a0880162004a52565b90509295509295509295565b60008060008060008060c0878903121562004afa57600080fd5b863562004b0781620043bf565b9550602087013562004b1981620043bf565b945062004b2960408801620043d5565b935062004b396060880162004a52565b92506080870135915060a08701356001600160401b0381111562004b5c57600080fd5b62004b6a89828a0162004729565b9150509295509295509295565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004bd15762004bd162004b98565b5092915050565b808202811582820484141762000e285762000e2862004b98565b600063ffffffff80831681810362004c0e5762004c0e62004b98565b6001019392505050565b6001600160a01b0384811682528316602082015260606040820181905260009062004c469083018462004916565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c06080820181905260009062004c919083018562004916565b82810360a084015262004ca5818562004916565b9998505050505050505050565b6001600160401b0382811682821603908082111562004bd15762004bd162004b98565b60006001600160401b038281166002600160401b0319810162004c0e5762004c0e62004b98565b60006020828403121562004d0f57600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b60008262004d3e5762004d3e62004d16565b500490565b8082018082111562000e285762000e2862004b98565b634e487b7160e01b600052603260045260246000fd5b60006001820162004d845762004d8462004b98565b5060010190565b60008262004d9d5762004d9d62004d16565b500690565b8181038181111562000e285762000e2862004b98565b918252602082015260400190565b60008162004dd85762004dd862004b98565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a0820181905260009062004e6d9083018462004916565b98975050505050505050565b6000825162004e8d818460208701620048f0565b9190910192915050565b61032081016103008085843782018360005b600181101562004eca57815183526020928301929091019060010162004ea9565b5050509392505050565b60006020828403121562004ee757600080fd5b81518015158114620046a157600080fd5b60006001600160401b038381168062004f155762004f1562004d16565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca26469706673582212208e78e901799caaaff866d77d874534e79db9f4bae5f48cfae79611891464d2c664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000013dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a264697066735822122030adb7cdaec642e29699593befd5e18a415007c5419bda7df68fe953295bd7ff64736f6c63430008140033", + "bytecode": "0x60e06040523480156200001157600080fd5b5060405162005be938038062005be9833981016040819052620000349162000141565b6001600160a01b0380841660805280831660c052811660a0528282826200005a62000066565b50505050505062000195565b600054610100900460ff1615620000d35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000126576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013e57600080fd5b50565b6000806000606084860312156200015757600080fd5b8351620001648162000128565b6020850151909350620001778162000128565b60408501519092506200018a8162000128565b809150509250925092565b60805160a05160c0516159ec620001fd6000396000818161099601528181611e5d015261350e01526000818161075c015281816129d701526138080152600081816108f001528181610efa015281816110aa01528181611bc401526136f701526159ec6000f3fe60806040523480156200001157600080fd5b50600436106200029e5760003560e01c80630645af0914620002a3578063066ec01214620002bc578063080b311114620002e85780630a0d9fbe146200031057806311f6b287146200032b57806312b86e1914620003425780631489ed10146200035957806315064c9614620003705780631608859c146200037e5780631796a1ae14620003955780631816b7e514620003bc5780632072f6c514620003d3578063248a9ca314620003dd5780632528016914620004035780632f2ff15d14620004b857806330c27dde14620004cf57806336568abe14620004e3578063394218e914620004fa578063477fa270146200051157806355a71ee0146200051a57806360469169146200055e57806365c0504d14620005685780637222020f1462000617578063727885e9146200062e5780637975fcfe14620006455780637fb6e76a146200066b578063841b24d7146200069457806387c20c0114620006af5780638bd4f07114620006c657806391d1485414620006dd57806399f5634e14620006f45780639a908e7314620006fe5780639c9f3dfe1462000715578063a066215c146200072c578063a217fddf1462000743578063a2967d99146200074c578063a3c573eb1462000756578063afd23cbe146200078d578063b99d0ad714620007b7578063c1acbc34146200088f578063c4c928c214620008aa578063ceee281d14620008c1578063d02103ca14620008ea578063d5073f6f1462000912578063d547741f1462000929578063d939b3151462000940578063dbc169761462000954578063dde0ff77146200095e578063e0bfd3d21462000979578063e46761c41462000990578063f34eb8eb14620009b8578063f4e9267514620009cf578063f9c4c2ae14620009e0575b600080fd5b620002ba620002b4366004620043ed565b62000af7565b005b608454620002d0906001600160401b031681565b604051620002df9190620044c8565b60405180910390f35b620002ff620002f9366004620044f1565b62000e04565b6040519015158152602001620002df565b608554620002d090600160401b90046001600160401b031681565b620002d06200033c36600462004529565b62000e2e565b620002ba620003533660046200455a565b62000e4e565b620002ba6200036a366004620045f1565b62000ffe565b606f54620002ff9060ff1681565b620002ba6200038f366004620044f1565b6200118e565b607e54620003a69063ffffffff1681565b60405163ffffffff9091168152602001620002df565b620002ba620003cd3660046200467b565b62001223565b620002ba620012cf565b620003f4620003ee366004620046a8565b62001395565b604051908152602001620002df565b6200048462000414366004620044f1565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002df565b620002ba620004c9366004620046c2565b620013aa565b608754620002d0906001600160401b031681565b620002ba620004f4366004620046c2565b620013cc565b620002ba6200050b366004620046f5565b62001406565b608654620003f4565b620003f46200052b366004620044f1565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620003f4620014b5565b620005cd6200057936600462004529565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002df565b620002ba6200062836600462004529565b620014cd565b620002ba6200063f366004620047bd565b620015b8565b6200065c620006563660046200488a565b62001a20565b604051620002df919062004944565b620003a66200067c366004620046f5565b60836020526000908152604090205463ffffffff1681565b608454620002d090600160c01b90046001600160401b031681565b620002ba620006c0366004620045f1565b62001a53565b620002ba620006d73660046200455a565b62001d77565b620002ff620006ee366004620046c2565b62001e2d565b620003f462001e58565b620002d06200070f36600462004959565b62001f44565b620002ba62000726366004620046f5565b62002111565b620002ba6200073d366004620046f5565b620021b4565b620003f4600081565b620003f462002253565b6200077e7f000000000000000000000000000000000000000000000000000000000000000081565b604051620002df919062004986565b608554620007a390600160801b900461ffff1681565b60405161ffff9091168152602001620002df565b6200084d620007c8366004620044f1565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002df919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002d090600160801b90046001600160401b031681565b620002ba620008bb3660046200499a565b62002615565b620003a6620008d236600462004a32565b60826020526000908152604090205463ffffffff1681565b6200077e7f000000000000000000000000000000000000000000000000000000000000000081565b620002ba62000923366004620046a8565b620028e2565b620002ba6200093a366004620046c2565b6200296d565b608554620002d0906001600160401b031681565b620002ba6200298f565b608454620002d090600160401b90046001600160401b031681565b620002ba6200098a36600462004a64565b62002a4d565b6200077e7f000000000000000000000000000000000000000000000000000000000000000081565b620002ba620009c936600462004ae0565b62002b15565b608054620003a69063ffffffff1681565b62000a77620009f136600462004529565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002df565b600054600290610100900460ff1615801562000b1a575060005460ff8083169116105b62000b835760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c0462002d00565b62000c1f600080516020620059978339815191528c62002d6d565b62000c2c60008862002d6d565b62000c47600080516020620058978339815191528862002d6d565b62000c62600080516020620058f78339815191528862002d6d565b62000c7d600080516020620058378339815191528862002d6d565b62000c98600080516020620058778339815191528962002d6d565b62000cb3600080516020620059778339815191528962002d6d565b62000cce600080516020620058b78339815191528962002d6d565b62000ce9600080516020620059178339815191528962002d6d565b62000d13600080516020620059978339815191526000805160206200581783398151915262002d79565b62000d2e600080516020620058178339815191528962002d6d565b62000d49600080516020620058578339815191528962002d6d565b62000d73600080516020620059578339815191526000805160206200593783398151915262002d79565b62000d8e600080516020620059578339815191528762002d6d565b62000da9600080516020620059378339815191528762002d6d565b62000db660003362002d6d565b6000805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050505050565b63ffffffff8216600090815260816020526040812062000e25908362002dce565b90505b92915050565b63ffffffff8116600090815260816020526040812062000e289062002e13565b6000805160206200599783398151915262000e698162002e84565b63ffffffff8916600090815260816020526040902062000e90818a8a8a8a8a8a8a62002e90565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000ef8576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000f3162002253565b6040518263ffffffff1660e01b815260040162000f5091815260200190565b600060405180830381600087803b15801562000f6b57600080fd5b505af115801562000f80573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005997833981519152620010198162002e84565b63ffffffff8916600090815260816020526040902062001040818a8a8a8a8a8a8a62003218565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b90041615620010a8576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620010e162002253565b6040518263ffffffff1660e01b81526004016200110091815260200190565b600060405180830381600087803b1580156200111b57600080fd5b505af115801562001130573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a6040516200117a9392919062004b77565b60405180910390a350505050505050505050565b63ffffffff82166000908152608160205260409020620011be600080516020620059978339815191523362001e2d565b6200121257606f5460ff1615620011e857604051630bc011ff60e21b815260040160405180910390fd5b620011f4818362002dce565b6200121257604051630674f25160e11b815260040160405180910390fd5b6200121e818362003614565b505050565b600080516020620059178339815191526200123e8162002e84565b6103e88261ffff1610806200125857506103ff8261ffff16115b156200127757604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620012ea600080516020620059578339815191523362001e2d565b6200138957608454600160801b90046001600160401b031615806200133a575060845442906200132f9062093a8090600160801b90046001600160401b031662004bae565b6001600160401b0316115b806200136a575060875442906200135f9062093a80906001600160401b031662004bae565b6001600160401b0316115b15620013895760405163692baaad60e11b815260040160405180910390fd5b6200139362003806565b565b60009081526034602052604090206001015490565b620013b58262001395565b620013c08162002e84565b6200121e838362003885565b6001600160a01b0381163314620013f657604051630b4ad1cd60e31b815260040160405180910390fd5b620014028282620038f1565b5050565b60008051602062005917833981519152620014218162002e84565b606f5460ff1662001463576084546001600160401b03600160c01b909104811690831610620014635760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190620012c3908490620044c8565b60006086546064620014c8919062004bd8565b905090565b60008051602062005877833981519152620014e88162002e84565b63ffffffff82161580620015075750607e5463ffffffff908116908316115b156200152657604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200156d57604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b60008051602062005977833981519152620015d38162002e84565b63ffffffff88161580620015f25750607e5463ffffffff908116908916115b156200161157604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff16151590036200165857604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001696576040516337c8fe0960e11b815260040160405180910390fd5b60808054600091908290620016b19063ffffffff1662004bf2565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b03909216913091620016ff90620043b1565b6200170d9392919062004c18565b604051809103906000f0801580156200172a573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c6040516200199e949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b03831690637125702290620019de908d908d9088908e908e908e9060040162004c4f565b600060405180830381600087803b158015620019f957600080fd5b505af115801562001a0e573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001a489087878787876200395b565b979650505050505050565b606f5460ff161562001a7857604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001ac792600160c01b90048116911662004bae565b6001600160401b0316111562001af057604051638a0704d360e01b815260040160405180910390fd5b6103e862001aff888862004cb2565b6001600160401b0316111562001b2857604051635acfba9d60e11b815260040160405180910390fd5b62001b3a818989898989898962003218565b62001b46818762003a96565b6085546001600160401b031660000362001c5457600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001bc2576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001bfb62002253565b6040518263ffffffff1660e01b815260040162001c1a91815260200190565b600060405180830381600087803b15801562001c3557600080fd5b505af115801562001c4a573d6000803e3d6000fd5b5050505062001d1e565b62001c5f8162003c93565b600681018054600160801b90046001600160401b031690601062001c838362004cd5565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b488878960405162001d649392919062004b77565b60405180910390a3505050505050505050565b606f5460ff161562001d9c57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff8816600090815260816020526040902062001dc3818989898989898962002e90565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a162001e2262003806565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162001ea9919062004986565b602060405180830381865afa15801562001ec7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001eed919062004cfc565b60845490915060009062001f14906001600160401b03600160401b82048116911662004cb2565b6001600160401b031690508060000362001f315760009250505090565b62001f3d818362004d2c565b9250505090565b606f5460009060ff161562001f6c57604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362001fa4576040516371653c1560e01b815260040160405180910390fd5b836001600160401b031660000362001fcf57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620020029084906001600160401b031662004bae565b82546101009290920a6001600160401b038181021990931691831602179091556006830154169050600062002038878362004bae565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b031990921692909316919091171790559050620020c78362003c93565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a2582604051620020ff9190620044c8565b60405180910390a29695505050505050565b600080516020620059178339815191526200212c8162002e84565b606f5460ff1662002167576085546001600160401b0390811690831610620021675760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590620012c3908490620044c8565b60008051602062005917833981519152620021cf8162002e84565b62015180826001600160401b03161115620021fd57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890620012c3908490620044c8565b60805460009063ffffffff168082036200226f57506000919050565b6000816001600160401b038111156200228c576200228c62004713565b604051908082528060200260200182016040528015620022b6578160200160208202803683370190505b50905060005b82811015620023295760816000620022d683600162004d43565b63ffffffff1663ffffffff1681526020019081526020016000206005015482828151811062002309576200230962004d59565b602090810291909101015280620023208162004d6f565b915050620022bc565b50600060205b836001146200256d5760006200234760028662004d8b565b6200235460028762004d2c565b62002360919062004d43565b90506000816001600160401b038111156200237f576200237f62004713565b604051908082528060200260200182016040528015620023a9578160200160208202803683370190505b50905060005b828110156200252157620023c560018462004da2565b81148015620023e05750620023dc60028862004d8b565b6001145b15620024605785620023f482600262004bd8565b8151811062002407576200240762004d59565b6020026020010151856040516020016200242392919062004db8565b604051602081830303815290604052805190602001208282815181106200244e576200244e62004d59565b6020026020010181815250506200250c565b856200246e82600262004bd8565b8151811062002481576200248162004d59565b60200260200101518682600262002499919062004bd8565b620024a690600162004d43565b81518110620024b957620024b962004d59565b6020026020010151604051602001620024d492919062004db8565b60405160208183030381529060405280519060200120828281518110620024ff57620024ff62004d59565b6020026020010181815250505b80620025188162004d6f565b915050620023af565b5080945081955083846040516020016200253d92919062004db8565b6040516020818303038152906040528051906020012093508280620025629062004dc6565b93505050506200232f565b60008360008151811062002585576200258562004d59565b6020026020010151905060005b828110156200260b578184604051602001620025b092919062004db8565b6040516020818303038152906040528051906020012091508384604051602001620025dd92919062004db8565b6040516020818303038152906040528051906020012093508080620026029062004d6f565b91505062002592565b5095945050505050565b60008051602062005837833981519152620026308162002e84565b63ffffffff841615806200264f5750607e5463ffffffff908116908516115b156200266e57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff1690819003620026af576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b031603620026fe57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff16151590036200274557604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b90920416146200278357604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790556000620028038462000e2e565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef28692620028589216908b908b9060040162004de0565b600060405180830381600087803b1580156200287357600080fd5b505af115801562002888573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005857833981519152620028fd8162002e84565b683635c9adc5dea00000821180620029185750633b9aca0082105b156200293757604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620012c3565b620029788262001395565b620029838162002e84565b6200121e8383620038f1565b600080516020620058b7833981519152620029aa8162002e84565b608780546001600160401b031916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc1697691600480830192600092919082900301818387803b15801562002a2757600080fd5b505af115801562002a3c573d6000803e3d6000fd5b5050505062002a4a62003d5e565b50565b600080516020620058f783398151915262002a688162002e84565b6001600160401b03841660009081526083602052604090205463ffffffff161562002aa6576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b03871660009081526082602052604090205463ffffffff161562002ae457604051630d409b9360e41b815260040160405180910390fd5b600062002af78888888887600062003db7565b60008080526002909101602052604090209390935550505050505050565b6000805160206200589783398151915262002b308162002e84565b607e805460009190829062002b4b9063ffffffff1662004bf2565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002cee9695949392919062004e20565b60405180910390a25050505050505050565b600054610100900460ff16620013935760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b7a565b62001402828262003885565b600062002d868362001395565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6085546001600160401b0382811660009081526004850160205260408120549092429262002e0192918116911662004bae565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b03161562002e67575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002a4a813362003fe5565b60078801546000906001600160401b03908116908716101562002ec65760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b0388161562002f675760068901546001600160401b03600160801b9091048116908916111562002f105760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b909204161462002f6057604051632bd2e3e760e01b815260040160405180910390fd5b5062002fdc565b506001600160401b03851660009081526002890160205260409020548062002fa2576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b9091048116908716111562002fdc57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620030155750876001600160401b0316876001600160401b031611155b8062003039575060068901546001600160401b03600160c01b909104811690881611155b15620030585760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b90048116908616146200309f576040516332a2a77f60e01b815260040160405180910390fd5b6000620030b18a88888886896200395b565b90506000600080516020620058d7833981519152600283604051620030d7919062004e79565b602060405180830381855afa158015620030f5573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200311a919062004cfc565b62003126919062004d8b565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200316a9188919060040162004e97565b602060405180830381865afa15801562003188573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620031ae919062004ed4565b620031cc576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c0160205260409020600201548590036200320b5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620032268a62002e13565b60078b01549091506001600160401b0390811690891610156200325c5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620032ff5760068a01546001600160401b03600160801b9091048116908a161115620032a65760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620032f857604051632bd2e3e760e01b815260040160405180910390fd5b506200336f565b6001600160401b038816600090815260028b0160205260409020549150816200333b576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200336f57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620033a25760405163b9b18f5760e01b815260040160405180910390fd5b6000620033b48b8a8a8a878b6200395b565b90506000600080516020620058d7833981519152600283604051620033da919062004e79565b602060405180830381855afa158015620033f8573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200341d919062004cfc565b62003429919062004d8b565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200346d9189919060040162004e97565b602060405180830381865afa1580156200348b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620034b1919062004ed4565b620034cf576040516309bde33960e01b815260040160405180910390fd5b6000620034dd848b62004cb2565b90506200353687826001600160401b0316620034f862001e58565b62003504919062004bd8565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906200400f565b80608460088282829054906101000a90046001600160401b03166200355c919062004bae565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b158015620035ec57600080fd5b505af115801562003601573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003653575060068201546001600160401b03600160801b9091048116908216115b15620036725760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200372e62002253565b6040518263ffffffff1660e01b81526004016200374d91815260200190565b600060405180830381600087803b1580156200376857600080fd5b505af11580156200377d573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200386257600080fd5b505af115801562003877573d6000803e3d6000fd5b505050506200139362004063565b62003891828262001e2d565b620014025760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b620038fd828262001e2d565b15620014025760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003991575081155b15620039b05760405163340c614f60e11b815260040160405180910390fd5b80620039cf576040516366385b5160e01b815260040160405180910390fd5b620039da84620040c0565b620039f8576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b600062003aa38362002e13565b90508160008062003ab5848462004cb2565b6085546001600160401b03918216925060009162003adc91600160401b9004164262004da2565b90505b846001600160401b0316846001600160401b03161462003b66576001600160401b0380851660009081526003890160205260409020600181015490911682101562003b41576001810154600160401b90046001600160401b0316945062003b5f565b62003b4d868662004cb2565b6001600160401b031693505062003b66565b5062003adf565b600062003b74848462004da2565b90508381101562003bd257808403600c811162003b92578062003b95565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a608654028162003bc75762003bc762004d16565b046086555062003c4a565b838103600c811162003be5578062003be8565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162003c225762003c2262004d16565b04905080608654670de0b6b3a7640000028162003c435762003c4362004d16565b0460865550505b683635c9adc5dea00000608654111562003c7157683635c9adc5dea0000060865562003c89565b633b9aca00608654101562003c8957633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002a4a57600681015460009062003cde90600160c01b90046001600160401b0316600162004bae565b905062003cec828262002dce565b156200140257600682015460009060029062003d1a908490600160801b90046001600160401b031662004cb2565b62003d26919062004ef8565b62003d32908362004bae565b905062003d40838262002dce565b1562003d52576200121e838262003614565b6200121e838362003614565b606f5460ff1662003d8257604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b608080546000918291829062003dd39063ffffffff1662004bf2565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000876001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff16021790555080608260008a6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150878260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550868260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a88888860405162003fd29594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b62003ff1828262001e2d565b6200140257604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526200121e90849062004146565b606f5460ff16156200408857604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b038316108015620040f7575067ffffffff00000001604083901c6001600160401b0316105b801562004118575067ffffffff00000001608083901c6001600160401b0316105b801562004130575067ffffffff0000000160c083901c105b156200413e57506001919050565b506000919050565b60006200419d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200421f9092919063ffffffff16565b8051909150156200121e5780806020019051810190620041be919062004ed4565b6200121e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b7a565b606062004230848460008562004238565b949350505050565b6060824710156200429b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b7a565b600080866001600160a01b03168587604051620042b9919062004e79565b60006040518083038185875af1925050503d8060008114620042f8576040519150601f19603f3d011682016040523d82523d6000602084013e620042fd565b606091505b509150915062001a4887838387606083156200437e57825160000362004376576001600160a01b0385163b620043765760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b7a565b508162004230565b620042308383815115620043955781518083602001fd5b8060405162461bcd60e51b815260040162000b7a919062004944565b6108f58062004f2283390190565b6001600160a01b038116811462002a4a57600080fd5b80356001600160401b038116811462002e7f57600080fd5b6000806000806000806000806000806101408b8d0312156200440e57600080fd5b8a356200441b81620043bf565b99506200442b60208c01620043d5565b98506200443b60408c01620043d5565b975060608b01356200444d81620043bf565b965060808b01356200445f81620043bf565b955060a08b01356200447181620043bf565b945060c08b01356200448381620043bf565b935060e08b01356200449581620043bf565b9250620044a66101008c01620043d5565b9150620044b76101208c01620043d5565b90509295989b9194979a5092959850565b6001600160401b0391909116815260200190565b803563ffffffff8116811462002e7f57600080fd5b600080604083850312156200450557600080fd5b6200451083620044dc565b91506200452060208401620043d5565b90509250929050565b6000602082840312156200453c57600080fd5b62000e2582620044dc565b80610300810183101562000e2857600080fd5b6000806000806000806000806103e0898b0312156200457857600080fd5b6200458389620044dc565b97506200459360208a01620043d5565b9650620045a360408a01620043d5565b9550620045b360608a01620043d5565b9450620045c360808a01620043d5565b935060a0890135925060c08901359150620045e28a60e08b0162004547565b90509295985092959890939650565b6000806000806000806000806103e0898b0312156200460f57600080fd5b6200461a89620044dc565b97506200462a60208a01620043d5565b96506200463a60408a01620043d5565b95506200464a60608a01620043d5565b94506080890135935060a0890135925060c08901356200466a81620043bf565b9150620045e28a60e08b0162004547565b6000602082840312156200468e57600080fd5b813561ffff81168114620046a157600080fd5b9392505050565b600060208284031215620046bb57600080fd5b5035919050565b60008060408385031215620046d657600080fd5b823591506020830135620046ea81620043bf565b809150509250929050565b6000602082840312156200470857600080fd5b62000e2582620043d5565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200473b57600080fd5b81356001600160401b038082111562004758576200475862004713565b604051601f8301601f19908116603f0116810190828211818310171562004783576200478362004713565b816040528381528660208588010111156200479d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a031215620047d957600080fd5b620047e488620044dc565b9650620047f460208901620043d5565b955060408801356200480681620043bf565b945060608801356200481881620043bf565b935060808801356200482a81620043bf565b925060a08801356001600160401b03808211156200484757600080fd5b620048558b838c0162004729565b935060c08a01359150808211156200486c57600080fd5b506200487b8a828b0162004729565b91505092959891949750929550565b60008060008060008060c08789031215620048a457600080fd5b620048af87620044dc565b9550620048bf60208801620043d5565b9450620048cf60408801620043d5565b9350606087013592506080870135915060a087013590509295509295509295565b60005b838110156200490d578181015183820152602001620048f3565b50506000910152565b6000815180845262004930816020860160208601620048f0565b601f01601f19169290920160200192915050565b60208152600062000e25602083018462004916565b600080604083850312156200496d57600080fd5b6200497883620043d5565b946020939093013593505050565b6001600160a01b0391909116815260200190565b60008060008060608587031215620049b157600080fd5b8435620049be81620043bf565b9350620049ce60208601620044dc565b925060408501356001600160401b0380821115620049eb57600080fd5b818701915087601f83011262004a0057600080fd5b81358181111562004a1057600080fd5b88602082850101111562004a2357600080fd5b95989497505060200194505050565b60006020828403121562004a4557600080fd5b8135620046a181620043bf565b803560ff8116811462002e7f57600080fd5b60008060008060008060c0878903121562004a7e57600080fd5b863562004a8b81620043bf565b9550602087013562004a9d81620043bf565b945062004aad60408801620043d5565b935062004abd60608801620043d5565b92506080870135915062004ad460a0880162004a52565b90509295509295509295565b60008060008060008060c0878903121562004afa57600080fd5b863562004b0781620043bf565b9550602087013562004b1981620043bf565b945062004b2960408801620043d5565b935062004b396060880162004a52565b92506080870135915060a08701356001600160401b0381111562004b5c57600080fd5b62004b6a89828a0162004729565b9150509295509295509295565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004bd15762004bd162004b98565b5092915050565b808202811582820484141762000e285762000e2862004b98565b600063ffffffff80831681810362004c0e5762004c0e62004b98565b6001019392505050565b6001600160a01b0384811682528316602082015260606040820181905260009062004c469083018462004916565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c06080820181905260009062004c919083018562004916565b82810360a084015262004ca5818562004916565b9998505050505050505050565b6001600160401b0382811682821603908082111562004bd15762004bd162004b98565b60006001600160401b038281166002600160401b0319810162004c0e5762004c0e62004b98565b60006020828403121562004d0f57600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b60008262004d3e5762004d3e62004d16565b500490565b8082018082111562000e285762000e2862004b98565b634e487b7160e01b600052603260045260246000fd5b60006001820162004d845762004d8462004b98565b5060010190565b60008262004d9d5762004d9d62004d16565b500690565b8181038181111562000e285762000e2862004b98565b918252602082015260400190565b60008162004dd85762004dd862004b98565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a0820181905260009062004e6d9083018462004916565b98975050505050505050565b6000825162004e8d818460208701620048f0565b9190910192915050565b61032081016103008085843782018360005b600181101562004eca57815183526020928301929091019060010162004ea9565b5050509392505050565b60006020828403121562004ee757600080fd5b81518015158114620046a157600080fd5b60006001600160401b038381168062004f155762004f1562004d16565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca26469706673582212208e78e901799caaaff866d77d874534e79db9f4bae5f48cfae79611891464d2c664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000013dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a264697066735822122013cd106688d3319879d6d9a8087d2da6775a820327bc28ca9d64262c43ecace764736f6c63430008140033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b50600436106200029e5760003560e01c80630645af0914620002a3578063066ec01214620002bc578063080b311114620002e85780630a0d9fbe146200031057806311f6b287146200032b57806312b86e1914620003425780631489ed10146200035957806315064c9614620003705780631608859c146200037e5780631796a1ae14620003955780631816b7e514620003bc5780632072f6c514620003d3578063248a9ca314620003dd5780632528016914620004035780632f2ff15d14620004b857806330c27dde14620004cf57806336568abe14620004e3578063394218e914620004fa578063477fa270146200051157806355a71ee0146200051a57806360469169146200055e57806365c0504d14620005685780637222020f1462000617578063727885e9146200062e5780637975fcfe14620006455780637fb6e76a146200066b578063841b24d7146200069457806387c20c0114620006af5780638bd4f07114620006c657806391d1485414620006dd57806399f5634e14620006f45780639a908e7314620006fe5780639c9f3dfe1462000715578063a066215c146200072c578063a217fddf1462000743578063a2967d99146200074c578063a3c573eb1462000756578063afd23cbe146200078d578063b99d0ad714620007b7578063c1acbc34146200088f578063c4c928c214620008aa578063ceee281d14620008c1578063d02103ca14620008ea578063d5073f6f1462000912578063d547741f1462000929578063d939b3151462000940578063dbc169761462000954578063dde0ff77146200095e578063e0bfd3d21462000979578063e46761c41462000990578063f34eb8eb14620009b8578063f4e9267514620009cf578063f9c4c2ae14620009e0575b600080fd5b620002ba620002b4366004620043ed565b62000af7565b005b608454620002d0906001600160401b031681565b604051620002df9190620044c8565b60405180910390f35b620002ff620002f9366004620044f1565b62000e04565b6040519015158152602001620002df565b608554620002d090600160401b90046001600160401b031681565b620002d06200033c36600462004529565b62000e2e565b620002ba620003533660046200455a565b62000e4e565b620002ba6200036a366004620045f1565b62000ffe565b606f54620002ff9060ff1681565b620002ba6200038f366004620044f1565b6200118e565b607e54620003a69063ffffffff1681565b60405163ffffffff9091168152602001620002df565b620002ba620003cd3660046200467b565b62001223565b620002ba620012cf565b620003f4620003ee366004620046a8565b62001395565b604051908152602001620002df565b6200048462000414366004620044f1565b60408051606080820183526000808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002df565b620002ba620004c9366004620046c2565b620013aa565b608754620002d0906001600160401b031681565b620002ba620004f4366004620046c2565b620013cc565b620002ba6200050b366004620046f5565b62001406565b608654620003f4565b620003f46200052b366004620044f1565b63ffffffff821660009081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620003f4620014b5565b620005cd6200057936600462004529565b607f602052600090815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002df565b620002ba6200062836600462004529565b620014cd565b620002ba6200063f366004620047bd565b620015b8565b6200065c620006563660046200488a565b62001a20565b604051620002df919062004944565b620003a66200067c366004620046f5565b60836020526000908152604090205463ffffffff1681565b608454620002d090600160c01b90046001600160401b031681565b620002ba620006c0366004620045f1565b62001a53565b620002ba620006d73660046200455a565b62001d77565b620002ff620006ee366004620046c2565b62001e2d565b620003f462001e58565b620002d06200070f36600462004959565b62001f44565b620002ba62000726366004620046f5565b62002111565b620002ba6200073d366004620046f5565b620021b4565b620003f4600081565b620003f462002253565b6200077e7f000000000000000000000000000000000000000000000000000000000000000081565b604051620002df919062004986565b608554620007a390600160801b900461ffff1681565b60405161ffff9091168152602001620002df565b6200084d620007c8366004620044f1565b604080516080808201835260008083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002df919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002d090600160801b90046001600160401b031681565b620002ba620008bb3660046200499a565b62002615565b620003a6620008d236600462004a32565b60826020526000908152604090205463ffffffff1681565b6200077e7f000000000000000000000000000000000000000000000000000000000000000081565b620002ba62000923366004620046a8565b620028e2565b620002ba6200093a366004620046c2565b6200296d565b608554620002d0906001600160401b031681565b620002ba6200298f565b608454620002d090600160401b90046001600160401b031681565b620002ba6200098a36600462004a64565b62002a4d565b6200077e7f000000000000000000000000000000000000000000000000000000000000000081565b620002ba620009c936600462004ae0565b62002b15565b608054620003a69063ffffffff1681565b62000a77620009f136600462004529565b608160205260009081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002df565b600054600290610100900460ff1615801562000b1a575060005460ff8083169116105b62000b835760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c0462002d00565b62000c1f600080516020620059978339815191528c62002d6d565b62000c2c60008862002d6d565b62000c47600080516020620058978339815191528862002d6d565b62000c62600080516020620058f78339815191528862002d6d565b62000c7d600080516020620058378339815191528862002d6d565b62000c98600080516020620058778339815191528962002d6d565b62000cb3600080516020620059778339815191528962002d6d565b62000cce600080516020620058b78339815191528962002d6d565b62000ce9600080516020620059178339815191528962002d6d565b62000d13600080516020620059978339815191526000805160206200581783398151915262002d79565b62000d2e600080516020620058178339815191528962002d6d565b62000d49600080516020620058578339815191528962002d6d565b62000d73600080516020620059578339815191526000805160206200593783398151915262002d79565b62000d8e600080516020620059578339815191528762002d6d565b62000da9600080516020620059378339815191528762002d6d565b62000db660003362002d6d565b6000805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050505050565b63ffffffff8216600090815260816020526040812062000e25908362002dce565b90505b92915050565b63ffffffff8116600090815260816020526040812062000e289062002e13565b6000805160206200599783398151915262000e698162002e84565b63ffffffff8916600090815260816020526040902062000e90818a8a8a8a8a8a8a62002e90565b600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562000ef8576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000f3162002253565b6040518263ffffffff1660e01b815260040162000f5091815260200190565b600060405180830381600087803b15801562000f6b57600080fd5b505af115801562000f80573d6000803e3d6000fd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b60008051602062005997833981519152620010198162002e84565b63ffffffff8916600090815260816020526040902062001040818a8a8a8a8a8a8a62003218565b600681018054600160401b600160801b031916600160401b6001600160401b038a811691820292909217835560009081526002840160205260409020879055600583018890559054600160801b90041615620010a8576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620010e162002253565b6040518263ffffffff1660e01b81526004016200110091815260200190565b600060405180830381600087803b1580156200111b57600080fd5b505af115801562001130573d6000803e3d6000fd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a6040516200117a9392919062004b77565b60405180910390a350505050505050505050565b63ffffffff82166000908152608160205260409020620011be600080516020620059978339815191523362001e2d565b6200121257606f5460ff1615620011e857604051630bc011ff60e21b815260040160405180910390fd5b620011f4818362002dce565b6200121257604051630674f25160e11b815260040160405180910390fd5b6200121e818362003614565b505050565b600080516020620059178339815191526200123e8162002e84565b6103e88261ffff1610806200125857506103ff8261ffff16115b156200127757604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620012ea600080516020620059578339815191523362001e2d565b6200138957608454600160801b90046001600160401b031615806200133a575060845442906200132f9062093a8090600160801b90046001600160401b031662004bae565b6001600160401b0316115b806200136a575060875442906200135f9062093a80906001600160401b031662004bae565b6001600160401b0316115b15620013895760405163692baaad60e11b815260040160405180910390fd5b6200139362003806565b565b60009081526034602052604090206001015490565b620013b58262001395565b620013c08162002e84565b6200121e838362003885565b6001600160a01b0381163314620013f657604051630b4ad1cd60e31b815260040160405180910390fd5b620014028282620038f1565b5050565b60008051602062005917833981519152620014218162002e84565b606f5460ff1662001463576084546001600160401b03600160c01b909104811690831610620014635760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190620012c3908490620044c8565b60006086546064620014c8919062004bd8565b905090565b60008051602062005877833981519152620014e88162002e84565b63ffffffff82161580620015075750607e5463ffffffff908116908316115b156200152657604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82166000908152607f60205260409020600180820154600160e81b900460ff16151590036200156d57604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e4490600090a2505050565b60008051602062005977833981519152620015d38162002e84565b63ffffffff88161580620015f25750607e5463ffffffff908116908916115b156200161157604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88166000908152607f60205260409020600180820154600160e81b900460ff16151590036200165857604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b03881660009081526083602052604090205463ffffffff161562001696576040516337c8fe0960e11b815260040160405180910390fd5b60808054600091908290620016b19063ffffffff1662004bf2565b825463ffffffff8281166101009490940a9384029302191691909117909155825460408051600080825260208201928390529394506001600160a01b03909216913091620016ff90620043b1565b6200170d9392919062004c18565b604051809103906000f0801580156200172a573d6000803e3d6000fd5b50905081608360008c6001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508160826000836001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055506000608160008463ffffffff1663ffffffff1681526020019081526020016000209050818160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b031602179055508360010160009054906101000a90046001600160a01b03168160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a8160000160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002016000806001600160401b03168152602001908152602001600020819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c6040516200199e949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b03831690637125702290620019de908d908d9088908e908e908e9060040162004c4f565b600060405180830381600087803b158015620019f957600080fd5b505af115801562001a0e573d6000803e3d6000fd5b50505050505050505050505050505050565b63ffffffff8616600090815260816020526040902060609062001a489087878787876200395b565b979650505050505050565b606f5460ff161562001a7857604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff881660009081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001ac792600160c01b90048116911662004bae565b6001600160401b0316111562001af057604051638a0704d360e01b815260040160405180910390fd5b6103e862001aff888862004cb2565b6001600160401b0316111562001b2857604051635acfba9d60e11b815260040160405180910390fd5b62001b3a818989898989898962003218565b62001b46818762003a96565b6085546001600160401b031660000362001c5457600681018054600160401b600160801b031916600160401b6001600160401b0389811691820292909217835560009081526002840160205260409020869055600583018790559054600160801b9004161562001bc2576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001bfb62002253565b6040518263ffffffff1660e01b815260040162001c1a91815260200190565b600060405180830381600087803b15801562001c3557600080fd5b505af115801562001c4a573d6000803e3d6000fd5b5050505062001d1e565b62001c5f8162003c93565b600681018054600160801b90046001600160401b031690601062001c838362004cd5565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b90048716600090815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b488878960405162001d649392919062004b77565b60405180910390a3505050505050505050565b606f5460ff161562001d9c57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff8816600090815260816020526040902062001dc3818989898989898962002e90565b6001600160401b03851660009081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a162001e2262003806565b505050505050505050565b60009182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040162001ea9919062004986565b602060405180830381865afa15801562001ec7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001eed919062004cfc565b60845490915060009062001f14906001600160401b03600160401b82048116911662004cb2565b6001600160401b031690508060000362001f315760009250505090565b62001f3d818362004d2c565b9250505090565b606f5460009060ff161562001f6c57604051630bc011ff60e21b815260040160405180910390fd5b3360009081526082602052604081205463ffffffff169081900362001fa4576040516371653c1560e01b815260040160405180910390fd5b836001600160401b031660000362001fcf57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff811660009081526081602052604081206084805491928792620020029084906001600160401b031662004bae565b82546101009290920a6001600160401b038181021990931691831602179091556006830154169050600062002038878362004bae565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a81524284166020808301918252888616838501908152600095865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b031990921692909316919091171790559050620020c78362003c93565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a2582604051620020ff9190620044c8565b60405180910390a29695505050505050565b600080516020620059178339815191526200212c8162002e84565b606f5460ff1662002167576085546001600160401b0390811690831610620021675760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590620012c3908490620044c8565b60008051602062005917833981519152620021cf8162002e84565b62015180826001600160401b03161115620021fd57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890620012c3908490620044c8565b60805460009063ffffffff168082036200226f57506000919050565b6000816001600160401b038111156200228c576200228c62004713565b604051908082528060200260200182016040528015620022b6578160200160208202803683370190505b50905060005b82811015620023295760816000620022d683600162004d43565b63ffffffff1663ffffffff1681526020019081526020016000206005015482828151811062002309576200230962004d59565b602090810291909101015280620023208162004d6f565b915050620022bc565b50600060205b836001146200256d5760006200234760028662004d8b565b6200235460028762004d2c565b62002360919062004d43565b90506000816001600160401b038111156200237f576200237f62004713565b604051908082528060200260200182016040528015620023a9578160200160208202803683370190505b50905060005b828110156200252157620023c560018462004da2565b81148015620023e05750620023dc60028862004d8b565b6001145b15620024605785620023f482600262004bd8565b8151811062002407576200240762004d59565b6020026020010151856040516020016200242392919062004db8565b604051602081830303815290604052805190602001208282815181106200244e576200244e62004d59565b6020026020010181815250506200250c565b856200246e82600262004bd8565b8151811062002481576200248162004d59565b60200260200101518682600262002499919062004bd8565b620024a690600162004d43565b81518110620024b957620024b962004d59565b6020026020010151604051602001620024d492919062004db8565b60405160208183030381529060405280519060200120828281518110620024ff57620024ff62004d59565b6020026020010181815250505b80620025188162004d6f565b915050620023af565b5080945081955083846040516020016200253d92919062004db8565b6040516020818303038152906040528051906020012093508280620025629062004dc6565b93505050506200232f565b60008360008151811062002585576200258562004d59565b6020026020010151905060005b828110156200260b578184604051602001620025b092919062004db8565b6040516020818303038152906040528051906020012091508384604051602001620025dd92919062004db8565b6040516020818303038152906040528051906020012093508080620026029062004d6f565b91505062002592565b5095945050505050565b60008051602062005837833981519152620026308162002e84565b63ffffffff841615806200264f5750607e5463ffffffff908116908516115b156200266e57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b03851660009081526082602052604081205463ffffffff1690819003620026af576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181166000908152608160205260409020600781015490918716600160401b9091046001600160401b031603620026fe57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86166000908152607f60205260409020600180820154600160e81b900460ff16151590036200274557604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b90920416146200278357604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790556000620028038462000e2e565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef28692620028589216908b908b9060040162004de0565b600060405180830381600087803b1580156200287357600080fd5b505af115801562002888573d6000803e3d6000fd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b60008051602062005857833981519152620028fd8162002e84565b683635c9adc5dea00000821180620029185750633b9aca0082105b156200293757604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620012c3565b620029788262001395565b620029838162002e84565b6200121e8383620038f1565b600080516020620058b7833981519152620029aa8162002e84565b608780546001600160401b031916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc1697691600480830192600092919082900301818387803b15801562002a2757600080fd5b505af115801562002a3c573d6000803e3d6000fd5b5050505062002a4a62003d5e565b50565b600080516020620058f783398151915262002a688162002e84565b6001600160401b03841660009081526083602052604090205463ffffffff161562002aa6576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b03871660009081526082602052604090205463ffffffff161562002ae457604051630d409b9360e41b815260040160405180910390fd5b600062002af78888888887600062003db7565b60008080526002909101602052604090209390935550505050505050565b6000805160206200589783398151915262002b308162002e84565b607e805460009190829062002b4b9063ffffffff1662004bf2565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff16815260200160001515815260200185815250607f60008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002cee9695949392919062004e20565b60405180910390a25050505050505050565b600054610100900460ff16620013935760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b7a565b62001402828262003885565b600062002d868362001395565b600084815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6085546001600160401b0382811660009081526004850160205260408120549092429262002e0192918116911662004bae565b6001600160401b031611159392505050565b6006810154600090600160801b90046001600160401b03161562002e67575060068101546001600160401b03600160801b909104811660009081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002a4a813362003fe5565b60078801546000906001600160401b03908116908716101562002ec65760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b0388161562002f675760068901546001600160401b03600160801b9091048116908916111562002f105760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808816600090815260048a0160205260409020600281015481549092888116600160401b909204161462002f6057604051632bd2e3e760e01b815260040160405180910390fd5b5062002fdc565b506001600160401b03851660009081526002890160205260409020548062002fa2576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b9091048116908716111562002fdc57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620030155750876001600160401b0316876001600160401b031611155b8062003039575060068901546001600160401b03600160c01b909104811690881611155b15620030585760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b03878116600090815260048b016020526040902054600160401b90048116908616146200309f576040516332a2a77f60e01b815260040160405180910390fd5b6000620030b18a88888886896200395b565b90506000600080516020620058d7833981519152600283604051620030d7919062004e79565b602060405180830381855afa158015620030f5573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200311a919062004cfc565b62003126919062004d8b565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200316a9188919060040162004e97565b602060405180830381865afa15801562003188573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620031ae919062004ed4565b620031cc576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038916600090815260048c0160205260409020600201548590036200320b5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b600080620032268a62002e13565b60078b01549091506001600160401b0390811690891610156200325c5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620032ff5760068a01546001600160401b03600160801b9091048116908a161115620032a65760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a16600090815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620032f857604051632bd2e3e760e01b815260040160405180910390fd5b506200336f565b6001600160401b038816600090815260028b0160205260409020549150816200333b576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200336f57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620033a25760405163b9b18f5760e01b815260040160405180910390fd5b6000620033b48b8a8a8a878b6200395b565b90506000600080516020620058d7833981519152600283604051620033da919062004e79565b602060405180830381855afa158015620033f8573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906200341d919062004cfc565b62003429919062004d8b565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200346d9189919060040162004e97565b602060405180830381865afa1580156200348b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620034b1919062004ed4565b620034cf576040516309bde33960e01b815260040160405180910390fd5b6000620034dd848b62004cb2565b90506200353687826001600160401b0316620034f862001e58565b62003504919062004bd8565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906200400f565b80608460088282829054906101000a90046001600160401b03166200355c919062004bae565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401600060405180830381600087803b158015620035ec57600080fd5b505af115801562003601573d6000803e3d6000fd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003653575060068201546001600160401b03600160801b9091048116908216115b15620036725760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b03818116600081815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200372e62002253565b6040518263ffffffff1660e01b81526004016200374d91815260200190565b600060405180830381600087803b1580156200376857600080fd5b505af11580156200377d573d6000803e3d6000fd5b505085546001600160a01b0316600090815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200386257600080fd5b505af115801562003877573d6000803e3d6000fd5b505050506200139362004063565b62003891828262001e2d565b620014025760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b620038fd828262001e2d565b15620014025760008281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086166000818152600389016020526040808220549388168252902054606092911580159062003991575081155b15620039b05760405163340c614f60e11b815260040160405180910390fd5b80620039cf576040516366385b5160e01b815260040160405180910390fd5b620039da84620040c0565b620039f8576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b600062003aa38362002e13565b90508160008062003ab5848462004cb2565b6085546001600160401b03918216925060009162003adc91600160401b9004164262004da2565b90505b846001600160401b0316846001600160401b03161462003b66576001600160401b0380851660009081526003890160205260409020600181015490911682101562003b41576001810154600160401b90046001600160401b0316945062003b5f565b62003b4d868662004cb2565b6001600160401b031693505062003b66565b5062003adf565b600062003b74848462004da2565b90508381101562003bd257808403600c811162003b92578062003b95565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a608654028162003bc75762003bc762004d16565b046086555062003c4a565b838103600c811162003be5578062003be8565b600c5b90506000816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162003c225762003c2262004d16565b04905080608654670de0b6b3a7640000028162003c435762003c4362004d16565b0460865550505b683635c9adc5dea00000608654111562003c7157683635c9adc5dea0000060865562003c89565b633b9aca00608654101562003c8957633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002a4a57600681015460009062003cde90600160c01b90046001600160401b0316600162004bae565b905062003cec828262002dce565b156200140257600682015460009060029062003d1a908490600160801b90046001600160401b031662004cb2565b62003d26919062004ef8565b62003d32908362004bae565b905062003d40838262002dce565b1562003d52576200121e838262003614565b6200121e838362003614565b606f5460ff1662003d8257604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b608080546000918291829062003dd39063ffffffff1662004bf2565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060836000876001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff16021790555080608260008a6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff160217905550608160008263ffffffff1663ffffffff1681526020019081526020016000209150878260000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b03160217905550868260010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260000160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a88888860405162003fd29594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b62003ff1828262001e2d565b6200140257604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526200121e90849062004146565b606f5460ff16156200408857604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b600067ffffffff000000016001600160401b038316108015620040f7575067ffffffff00000001604083901c6001600160401b0316105b801562004118575067ffffffff00000001608083901c6001600160401b0316105b801562004130575067ffffffff0000000160c083901c105b156200413e57506001919050565b506000919050565b60006200419d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200421f9092919063ffffffff16565b8051909150156200121e5780806020019051810190620041be919062004ed4565b6200121e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b7a565b606062004230848460008562004238565b949350505050565b6060824710156200429b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b7a565b600080866001600160a01b03168587604051620042b9919062004e79565b60006040518083038185875af1925050503d8060008114620042f8576040519150601f19603f3d011682016040523d82523d6000602084013e620042fd565b606091505b509150915062001a4887838387606083156200437e57825160000362004376576001600160a01b0385163b620043765760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b7a565b508162004230565b620042308383815115620043955781518083602001fd5b8060405162461bcd60e51b815260040162000b7a919062004944565b6108f58062004f2283390190565b6001600160a01b038116811462002a4a57600080fd5b80356001600160401b038116811462002e7f57600080fd5b6000806000806000806000806000806101408b8d0312156200440e57600080fd5b8a356200441b81620043bf565b99506200442b60208c01620043d5565b98506200443b60408c01620043d5565b975060608b01356200444d81620043bf565b965060808b01356200445f81620043bf565b955060a08b01356200447181620043bf565b945060c08b01356200448381620043bf565b935060e08b01356200449581620043bf565b9250620044a66101008c01620043d5565b9150620044b76101208c01620043d5565b90509295989b9194979a5092959850565b6001600160401b0391909116815260200190565b803563ffffffff8116811462002e7f57600080fd5b600080604083850312156200450557600080fd5b6200451083620044dc565b91506200452060208401620043d5565b90509250929050565b6000602082840312156200453c57600080fd5b62000e2582620044dc565b80610300810183101562000e2857600080fd5b6000806000806000806000806103e0898b0312156200457857600080fd5b6200458389620044dc565b97506200459360208a01620043d5565b9650620045a360408a01620043d5565b9550620045b360608a01620043d5565b9450620045c360808a01620043d5565b935060a0890135925060c08901359150620045e28a60e08b0162004547565b90509295985092959890939650565b6000806000806000806000806103e0898b0312156200460f57600080fd5b6200461a89620044dc565b97506200462a60208a01620043d5565b96506200463a60408a01620043d5565b95506200464a60608a01620043d5565b94506080890135935060a0890135925060c08901356200466a81620043bf565b9150620045e28a60e08b0162004547565b6000602082840312156200468e57600080fd5b813561ffff81168114620046a157600080fd5b9392505050565b600060208284031215620046bb57600080fd5b5035919050565b60008060408385031215620046d657600080fd5b823591506020830135620046ea81620043bf565b809150509250929050565b6000602082840312156200470857600080fd5b62000e2582620043d5565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200473b57600080fd5b81356001600160401b038082111562004758576200475862004713565b604051601f8301601f19908116603f0116810190828211818310171562004783576200478362004713565b816040528381528660208588010111156200479d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a031215620047d957600080fd5b620047e488620044dc565b9650620047f460208901620043d5565b955060408801356200480681620043bf565b945060608801356200481881620043bf565b935060808801356200482a81620043bf565b925060a08801356001600160401b03808211156200484757600080fd5b620048558b838c0162004729565b935060c08a01359150808211156200486c57600080fd5b506200487b8a828b0162004729565b91505092959891949750929550565b60008060008060008060c08789031215620048a457600080fd5b620048af87620044dc565b9550620048bf60208801620043d5565b9450620048cf60408801620043d5565b9350606087013592506080870135915060a087013590509295509295509295565b60005b838110156200490d578181015183820152602001620048f3565b50506000910152565b6000815180845262004930816020860160208601620048f0565b601f01601f19169290920160200192915050565b60208152600062000e25602083018462004916565b600080604083850312156200496d57600080fd5b6200497883620043d5565b946020939093013593505050565b6001600160a01b0391909116815260200190565b60008060008060608587031215620049b157600080fd5b8435620049be81620043bf565b9350620049ce60208601620044dc565b925060408501356001600160401b0380821115620049eb57600080fd5b818701915087601f83011262004a0057600080fd5b81358181111562004a1057600080fd5b88602082850101111562004a2357600080fd5b95989497505060200194505050565b60006020828403121562004a4557600080fd5b8135620046a181620043bf565b803560ff8116811462002e7f57600080fd5b60008060008060008060c0878903121562004a7e57600080fd5b863562004a8b81620043bf565b9550602087013562004a9d81620043bf565b945062004aad60408801620043d5565b935062004abd60608801620043d5565b92506080870135915062004ad460a0880162004a52565b90509295509295509295565b60008060008060008060c0878903121562004afa57600080fd5b863562004b0781620043bf565b9550602087013562004b1981620043bf565b945062004b2960408801620043d5565b935062004b396060880162004a52565b92506080870135915060a08701356001600160401b0381111562004b5c57600080fd5b62004b6a89828a0162004729565b9150509295509295509295565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111562004bd15762004bd162004b98565b5092915050565b808202811582820484141762000e285762000e2862004b98565b600063ffffffff80831681810362004c0e5762004c0e62004b98565b6001019392505050565b6001600160a01b0384811682528316602082015260606040820181905260009062004c469083018462004916565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c06080820181905260009062004c919083018562004916565b82810360a084015262004ca5818562004916565b9998505050505050505050565b6001600160401b0382811682821603908082111562004bd15762004bd162004b98565b60006001600160401b038281166002600160401b0319810162004c0e5762004c0e62004b98565b60006020828403121562004d0f57600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b60008262004d3e5762004d3e62004d16565b500490565b8082018082111562000e285762000e2862004b98565b634e487b7160e01b600052603260045260246000fd5b60006001820162004d845762004d8462004b98565b5060010190565b60008262004d9d5762004d9d62004d16565b500690565b8181038181111562000e285762000e2862004b98565b918252602082015260400190565b60008162004dd85762004dd862004b98565b506000190190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a0820181905260009062004e6d9083018462004916565b98975050505050505050565b6000825162004e8d818460208701620048f0565b9190910192915050565b61032081016103008085843782018360005b600181101562004eca57815183526020928301929091019060010162004ea9565b5050509392505050565b60006020828403121562004ee757600080fd5b81518015158114620046a157600080fd5b60006001600160401b038381168062004f155762004f1562004d16565b9216919091049291505056fe60a0604052604051620008f5380380620008f58339810160408190526100249161035b565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b7565b505050610447565b61006182610126565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156100ab576100a682826101a5565b505050565b6100b361021c565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f8600080516020620008d5833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a16101238161023d565b50565b806001600160a01b03163b60000361016157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b0316846040516101c2919061042b565b600060405180830381855af49150503d80600081146101fd576040519150601f19603f3d011682016040523d82523d6000602084013e610202565b606091505b50909250905061021385838361027d565b95945050505050565b341561023b5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661026757604051633173bdd160e11b815260006004820152602401610158565b80600080516020620008d5833981519152610184565b6060826102925761028d826102dc565b6102d5565b81511580156102a957506001600160a01b0384163b155b156102d257604051639996b31560e01b81526001600160a01b0385166004820152602401610158565b50805b9392505050565b8051156102ec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461031c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561035257818101518382015260200161033a565b50506000910152565b60008060006060848603121561037057600080fd5b61037984610305565b925061038760208501610305565b60408501519092506001600160401b03808211156103a457600080fd5b818601915086601f8301126103b857600080fd5b8151818111156103ca576103ca610321565b604051601f8201601f19908116603f011681019083821181831017156103f2576103f2610321565b8160405282815289602084870101111561040b57600080fd5b61041c836020830160208801610337565b80955050505050509250925092565b6000825161043d818460208701610337565b9190910192915050565b608051610473620004626000396000601001526104736000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361006a576000356001600160e01b03191663278f794360e11b146100625761006061006e565b565b61006061007e565b6100605b6100606100796100ad565b6100d3565b60008061008e36600481846102cb565b81019061009b919061030b565b915091506100a982826100f7565b5050565b60006100ce60008051602061041e833981519152546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b61010082610152565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561014a5761014582826101b7565b505050565b6100a961022d565b806001600160a01b03163b6000036101885780604051634c9c8ce360e01b815260040161017f91906103da565b60405180910390fd5b60008051602061041e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516101d491906103ee565b600060405180830381855af49150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b509150915061022485838361024c565b95945050505050565b34156100605760405163b398979f60e01b815260040160405180910390fd5b6060826102615761025c826102a2565b61029b565b815115801561027857506001600160a01b0384163b155b156102985783604051639996b31560e01b815260040161017f91906103da565b50805b9392505050565b8051156102b25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600080858511156102db57600080fd5b838611156102e857600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561031e57600080fd5b82356001600160a01b038116811461033557600080fd5b915060208301356001600160401b038082111561035157600080fd5b818501915085601f83011261036557600080fd5b813581811115610377576103776102f5565b604051601f8201601f19908116603f0116810190838211818310171561039f5761039f6102f5565b816040528281528860208487010111156103b857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b6000825160005b8181101561040f57602081860181015185830152016103f5565b50600092019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca26469706673582212208e78e901799caaaff866d77d874534e79db9f4bae5f48cfae79611891464d2c664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000013dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a264697066735822122013cd106688d3319879d6d9a8087d2da6775a820327bc28ca9d64262c43ecace764736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMBridgeV2.json b/compiled-contracts/paris/PolygonZkEVMBridgeV2.json index 439f1cc4a..5bc411d00 100644 --- a/compiled-contracts/paris/PolygonZkEVMBridgeV2.json +++ b/compiled-contracts/paris/PolygonZkEVMBridgeV2.json @@ -1006,8 +1006,8 @@ "type": "function" } ], - "bytecode": "0x60806040523480156200001157600080fd5b506200001c62000022565b620000e4565b600054610100900460ff16156200008f5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161015620000e2576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b61569a80620000f46000396000f3fe6080604052600436106101a35760003560e01c806383f24403116100e2578063ccaa2d1111610085578063ccaa2d1114610511578063cd58657914610531578063d02103ca14610544578063dbc169761461056b578063ee25560b14610580578063f5efcd79146105ad578063f811bff7146105cd578063fb570834146105ed57600080fd5b806383f244031461040b5780638ed7e3f21461042b578063aaa13cc21461044b578063b8b284d01461046b578063bab161bf1461048b578063be5831c7146104ad578063c00f14ab146104d1578063cc461632146104f157600080fd5b80633cbc795b1161014a5780633cbc795b146102fd5780633e197043146103365780634b2f336d146103565780635ca1e165146103765780637843298b1461038b57806379e2cf97146103ab57806381b1c174146103c057806383c43a55146103f657600080fd5b806315064c96146101a85780632072f6c5146101d757806322e95f2c146101ee578063240ff3781461021b57806327aef4e81461022e5780632dfdf0b514610250578063318aee3d146102745780633c351e10146102dd575b600080fd5b3480156101b457600080fd5b506068546101c29060ff1681565b60405190151581526020015b60405180910390f35b3480156101e357600080fd5b506101ec61060d565b005b3480156101fa57600080fd5b5061020e610209366004612b7e565b610642565b6040516101ce9190612bb5565b6101ec610229366004612c1f565b610693565b34801561023a57600080fd5b50610243610703565b6040516101ce9190612ce8565b34801561025c57600080fd5b5061026660535481565b6040519081526020016101ce565b34801561028057600080fd5b506102b961028f366004612d02565b606b6020526000908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b039091166020830152016101ce565b3480156102e957600080fd5b50606d5461020e906001600160a01b031681565b34801561030957600080fd5b50606d5461032190600160a01b900463ffffffff1681565b60405163ffffffff90911681526020016101ce565b34801561034257600080fd5b50610266610351366004612d2e565b610791565b34801561036257600080fd5b50606f5461020e906001600160a01b031681565b34801561038257600080fd5b5061026661081e565b34801561039757600080fd5b5061020e6103a6366004612dad565b6108fb565b3480156103b757600080fd5b506101ec610925565b3480156103cc57600080fd5b5061020e6103db366004612df6565b606a602052600090815260409020546001600160a01b031681565b34801561040257600080fd5b50610243610946565b34801561041757600080fd5b50610266610426366004612e21565b610965565b34801561043757600080fd5b50606c5461020e906001600160a01b031681565b34801561045757600080fd5b5061020e610466366004612f2b565b610a3b565b34801561047757600080fd5b506101ec610486366004612fc6565b610b3d565b34801561049757600080fd5b5060685461032190610100900463ffffffff1681565b3480156104b957600080fd5b5060685461032190600160c81b900463ffffffff1681565b3480156104dd57600080fd5b506102436104ec366004612d02565b610c04565b3480156104fd57600080fd5b506101c261050c366004613048565b610c49565b34801561051d57600080fd5b506101ec61052c36600461307b565b610cd2565b6101ec61053f366004613166565b6111e0565b34801561055057600080fd5b5060685461020e90600160281b90046001600160a01b031681565b34801561057757600080fd5b506101ec61163a565b34801561058c57600080fd5b5061026661059b366004612df6565b60696020526000908152604090205481565b3480156105b957600080fd5b506101ec6105c836600461307b565b61166d565b3480156105d957600080fd5b506101ec6105e83660046131fb565b611908565b3480156105f957600080fd5b506101c26106083660046132a3565b611b7b565b606c546001600160a01b0316331461063857604051631736745960e31b815260040160405180910390fd5b610640611b93565b565b6000606a6000848460405160200161065b9291906132eb565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b60685460ff16156106b757604051630bc011ff60e21b815260040160405180910390fd5b34158015906106d05750606f546001600160a01b031615155b156106ee576040516301bd897160e61b815260040160405180910390fd5b6106fc858534868686611bef565b5050505050565b606e805461071090613315565b80601f016020809104026020016040519081016040528092919081815260200182805461073c90613315565b80156107895780601f1061075e57610100808354040283529160200191610789565b820191906000526020600020905b81548152906001019060200180831161076c57829003601f168201915b505050505081565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b605354600090819081805b60208110156108f2578083901c60011660010361088657603381602081106108535761085361334f565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506108b3565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806108ea9061337b565b915050610829565b50919392505050565b600061091d848461090b85611cb9565b61091486611d78565b61046687611e30565b949350505050565b605354606854600160c81b900463ffffffff16101561064057610640611ee8565b60405180611ba00160405280611b668152602001613aff611b66913981565b600083815b6020811015610a3257600163ffffffff8516821c811690036109d5578481602081106109985761099861334f565b6020020135826040516020016109b8929190918252602082015260400190565b604051602081830303815290604052805190602001209150610a20565b818582602081106109e8576109e861334f565b6020020135604051602001610a07929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610a2a8161337b565b91505061096a565b50949350505050565b6000808686604051602001610a519291906132eb565b604051602081830303815290604052805190602001209050600060ff60f81b308360405180611ba00160405280611b668152602001613aff611b669139898989604051602001610aa393929190613394565b60408051601f1981840301815290829052610ac192916020016133cd565b60405160208183030381529060405280519060200120604051602001610b1994939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff1615610b6157604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b0316610b8a5760405163dde3cda760e01b815260040160405180910390fd5b606f54604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac90610bbc90339088906004016133fc565b600060405180830381600087803b158015610bd657600080fd5b505af1158015610bea573d6000803e3d6000fd5b50505050610bfc868686868686611bef565b505050505050565b6060610c0f82611cb9565b610c1883611d78565b610c2184611e30565b604051602001610c3393929190613394565b6040516020818303038152906040529050919050565b6068546000908190610100900463ffffffff16158015610c6f575063ffffffff83166001145b15610c81575063ffffffff8316610ca8565b610c95600160201b63ffffffff8516613415565b610ca59063ffffffff861661342c565b90505b600881901c600090815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff1615610cf657604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614610d26576040516302caf51760e11b815260040160405180910390fd5b610d5a8c8c8c8c8c610d5560008e8e8e8e8e8e8e604051610d4892919061343f565b6040518091039020610791565b611f81565b6001600160a01b038616610e9257606f546001600160a01b0316610e295760006001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015610db1576020820181803683370190505b50604051610dbf919061344f565b60006040518083038185875af1925050503d8060008114610dfc576040519150601f19603f3d011682016040523d82523d6000602084013e610e01565b606091505b5050905080610e2357604051630ce8f45160e31b815260040160405180910390fd5b50611193565b606f546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990610e5b90879087906004016133fc565b600060405180830381600087803b158015610e7557600080fd5b505af1158015610e89573d6000803e3d6000fd5b50505050611193565b606d546001600160a01b038781169116148015610ec05750606d5463ffffffff888116600160a01b90920416145b15610ed85760006001600160a01b0385168482610d87565b60685463ffffffff610100909104811690881603610f0957610f046001600160a01b03871685856120e0565b611193565b60008787604051602001610f1e9291906132eb565b60408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b03168061112f5760008080610f648688018861346b565b9250925092505050506000610faf8386868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061213b92505050565b6040516340c10f1960e01b81529091506001600160a01b038216906340c10f1990610fe0908a908a906004016133fc565b600060405180830381600087803b158015610ffa57600080fd5b505af115801561100e573d6000803e3d6000fd5b5050505080606a600085815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a838888604051611121959493929190613500565b60405180910390a150611190565b6040516340c10f1960e01b81526001600160a01b038216906340c10f199061115d90899089906004016133fc565b600060405180830381600087803b15801561117757600080fd5b505af115801561118b573d6000803e3d6000fd5b505050505b50505b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8a888887876040516111ca959493929190613539565b60405180910390a1505050505050505050505050565b60685460ff161561120457604051630bc011ff60e21b815260040160405180910390fd5b61120c6121b7565b60685463ffffffff61010090910481169088160361123d576040516302caf51760e11b815260040160405180910390fd5b6000806060876001600160a01b038816611323578834146112715760405163b89240f560e01b815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff1694509061129e90613315565b80601f01602080910402602001604051908101604052809291908181526020018280546112ca90613315565b80156113175780601f106112ec57610100808354040283529160200191611317565b820191906000526020600020905b8154815290600101906020018083116112fa57829003601f168201915b505050505091506115af565b34156113425760405163798ee6f160e01b815260040160405180910390fd5b606f546001600160a01b03908116908916036113bd57604051632770a7eb60e21b81526001600160a01b03891690639dc29fac906113869033908d906004016133fc565b600060405180830381600087803b1580156113a057600080fd5b505af11580156113b4573d6000803e3d6000fd5b505050506115af565b6001600160a01b038089166000908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b9004909216918101829052901561147557604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac906114309033908e906004016133fc565b600060405180830381600087803b15801561144a57600080fd5b505af115801561145e573d6000803e3d6000fd5b5050505080602001519450806000015193506115a2565b851561148757611487898b8989612210565b6040516370a0823160e01b81526000906001600160a01b038b16906370a08231906114b6903090600401612bb5565b602060405180830381865afa1580156114d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f7919061356b565b905061150e6001600160a01b038b1633308e612556565b6040516370a0823160e01b81526000906001600160a01b038c16906370a082319061153d903090600401612bb5565b602060405180830381865afa15801561155a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157e919061356b565b905061158a8282613584565b6068548c9850610100900463ffffffff169650935050505b6115ab89610c04565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e86886053546040516115ef989796959493929190613597565b60405180910390a1611616611611600085878f8f878980519060200120610791565b61258e565b861561162457611624611ee8565b5050505061163160018055565b50505050505050565b606c546001600160a01b0316331461166557604051631736745960e31b815260040160405180910390fd5b610640612679565b60685460ff161561169157604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146116c1576040516302caf51760e11b815260040160405180910390fd5b6116e38c8c8c8c8c610d5560018e8e8e8e8e8e8e604051610d4892919061343f565b606f546000906001600160a01b031661179a57846001600160a01b031684888a86866040516024016117189493929190613602565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161174d919061344f565b60006040518083038185875af1925050503d806000811461178a576040519150601f19603f3d011682016040523d82523d6000602084013e61178f565b606091505b50508091505061189c565b606f546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906117cc90889088906004016133fc565b600060405180830381600087803b1580156117e657600080fd5b505af11580156117fa573d6000803e3d6000fd5b50505050846001600160a01b03168789858560405160240161181f9493929190613602565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b17905251611854919061344f565b6000604051808303816000865af19150503d8060008114611891576040519150601f19603f3d011682016040523d82523d6000602084013e611896565b606091505b50909150505b806118ba576040516337e391c360e01b815260040160405180910390fd5b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8b898988886040516118f1959493929190613539565b60405180910390a150505050505050505050505050565b600054610100900460ff16158080156119285750600054600160ff909116105b806119425750303b158015611942575060005460ff166001145b6119aa5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156119cd576000805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff8a160265010000000000600160c81b03191617600160281b6001600160a01b038781169190910291909117909155606c80546001600160a01b0319168583161790558616611a565763ffffffff851615611a5157604051630d43a60960e11b815260040160405180910390fd5b611b25565b606d805463ffffffff8716600160a01b026001600160c01b03199091166001600160a01b03891617179055606e611a8d8382613683565b50611b046000801b6012604051602001611af091906060808252600d908201526c2bb930b83832b21022ba3432b960991b608082015260a060208201819052600490820152630ae8aa8960e31b60c082015260ff91909116604082015260e00190565b60405160208183030381529060405261213b565b606f80546001600160a01b0319166001600160a01b03929092169190911790555b611b2d6126d1565b8015611631576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b600081611b89868686610965565b1495945050505050565b60685460ff1615611bb757604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b60685463ffffffff610100909104811690871603611c20576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051611c7499989796959493929190613742565b60405180910390a1611cab6116116001606860019054906101000a900463ffffffff16338a8a8a8989604051610d4892919061343f565b8215610bfc57610bfc611ee8565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009182916001600160a01b03861691611d00919061344f565b600060405180830381855afa9150503d8060008114611d3b576040519150601f19603f3d011682016040523d82523d6000602084013e611d40565b606091505b509150915081611d6f57604051806040016040528060078152602001664e4f5f4e414d4560c81b81525061091d565b61091d81612700565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009182916001600160a01b03861691611dbf919061344f565b600060405180830381855afa9150503d8060008114611dfa576040519150601f19603f3d011682016040523d82523d6000602084013e611dff565b606091505b509150915081611d6f57604051806040016040528060098152602001681393d7d4d6535093d360ba1b81525061091d565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b03861691611e76919061344f565b600060405180830381855afa9150503d8060008114611eb1576040519150601f19603f3d011682016040523d82523d6000602084013e611eb6565b606091505b5091509150818015611ec9575080516020145b611ed457601261091d565b8080602001905181019061091d91906137af565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d611f2f61081e565b6040518263ffffffff1660e01b8152600401611f4d91815260200190565b600060405180830381600087803b158015611f6757600080fd5b505af1158015611f7b573d6000803e3d6000fd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101206312bd9b1960e11b9092526064810191909152600091600160281b90046001600160a01b03169063257b3632906084016020604051808303816000875af1158015611ffb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201f919061356b565b90508060000361204157604051622f6fad60e01b815260040160405180910390fd5b600080600160401b8716156120815786915061205f848a8489611b7b565b61207c576040516338105f3b60e21b815260040160405180910390fd5b6120cb565b602087901c6120918160016137cc565b91508792506120ac6120a4868c86610965565b8a8389611b7b565b6120c9576040516338105f3b60e21b815260040160405180910390fd5b505b6120d5828261288e565b505050505050505050565b6121368363a9059cbb60e01b84846040516024016120ff9291906133fc565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612936565b505050565b60008060405180611ba00160405280611b668152602001613aff611b6691398360405160200161216c9291906133cd565b6040516020818303038152906040529050838151602083016000f591506001600160a01b0382166121b0576040516305f7d84960e51b815260040160405180910390fd5b5092915050565b6002600154036122095760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016119a1565b6002600155565b600061221f60048284866137e9565b61222891613813565b9050632afa533160e01b6001600160e01b03198216016123bc576000808080808080612257896004818d6137e9565b8101906122649190613843565b9650965096509650965096509650336001600160a01b0316876001600160a01b0316146122a45760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03861630146122cd5760405163750643af60e01b815260040160405180910390fd5b8a85146122ed576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e169161236b919061344f565b6000604051808303816000865af19150503d80600081146123a8576040519150601f19603f3d011682016040523d82523d6000602084013e6123ad565b606091505b505050505050505050506106fc565b6001600160e01b031981166323f2ebc360e21b146123ed57604051637141605d60e11b815260040160405180910390fd5b6000808080808080806124038a6004818e6137e9565b8101906124109190613897565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146124525760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038716301461247b5760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f1691612502919061344f565b6000604051808303816000865af19150503d806000811461253f576040519150601f19603f3d011682016040523d82523d6000602084013e612544565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611f7b9085906323b872dd60e01b906084016120ff565b80600161259d602060026139fe565b6125a79190613584565b605354106125c8576040516377ae67b360e11b815260040160405180910390fd5b60006053600081546125d99061337b565b9182905550905060005b602081101561266a578082901c60011660010361261657826033826020811061260e5761260e61334f565b015550505050565b603381602081106126295761262961334f565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925080806126629061337b565b9150506125e3565b50612136613a0a565b60018055565b60685460ff1661269c57604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600054610100900460ff166126f85760405162461bcd60e51b81526004016119a190613a20565b610640612a08565b6060604082511061271f578180602001905181019061068d9190613a6b565b815160200361285b5760005b60208110801561275a57508281815181106127485761274861334f565b01602001516001600160f81b03191615155b1561277157806127698161337b565b91505061272b565b806000036127a95750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b6000816001600160401b038111156127c3576127c3612e60565b6040519080825280601f01601f1916602001820160405280156127ed576020820181803683370190505b50905060005b828110156128535784818151811061280d5761280d61334f565b602001015160f81c60f81b82828151811061282a5761282a61334f565b60200101906001600160f81b031916908160001a9053508061284b8161337b565b9150506127f3565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b606854600090610100900463ffffffff161580156128b2575063ffffffff82166001145b156128c4575063ffffffff82166128eb565b6128d8600160201b63ffffffff8416613415565b6128e89063ffffffff851661342c565b90505b600881901c60008181526069602052604081208054600160ff861690811b9182189283905592909190818316900361163157604051630c8d9eab60e31b815260040160405180910390fd5b600061298b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612a2f9092919063ffffffff16565b80519091501561213657808060200190518101906129a99190613ae1565b6121365760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016119a1565b600054610100900460ff166126735760405162461bcd60e51b81526004016119a190613a20565b606061091d848460008585600080866001600160a01b03168587604051612a56919061344f565b60006040518083038185875af1925050503d8060008114612a93576040519150601f19603f3d011682016040523d82523d6000602084013e612a98565b606091505b5091509150612aa987838387612ab4565b979650505050505050565b60608315612b23578251600003612b1c576001600160a01b0385163b612b1c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016119a1565b508161091d565b61091d8383815115612b385781518083602001fd5b8060405162461bcd60e51b81526004016119a19190612ce8565b803563ffffffff8116811461288957600080fd5b6001600160a01b0381168114612b7b57600080fd5b50565b60008060408385031215612b9157600080fd5b612b9a83612b52565b91506020830135612baa81612b66565b809150509250929050565b6001600160a01b0391909116815260200190565b8015158114612b7b57600080fd5b60008083601f840112612be957600080fd5b5081356001600160401b03811115612c0057600080fd5b602083019150836020828501011115612c1857600080fd5b9250929050565b600080600080600060808688031215612c3757600080fd5b612c4086612b52565b94506020860135612c5081612b66565b93506040860135612c6081612bc9565b925060608601356001600160401b03811115612c7b57600080fd5b612c8788828901612bd7565b969995985093965092949392505050565b60005b83811015612cb3578181015183820152602001612c9b565b50506000910152565b60008151808452612cd4816020860160208601612c98565b601f01601f19169290920160200192915050565b602081526000612cfb6020830184612cbc565b9392505050565b600060208284031215612d1457600080fd5b8135612cfb81612b66565b60ff81168114612b7b57600080fd5b600080600080600080600060e0888a031215612d4957600080fd5b8735612d5481612d1f565b9650612d6260208901612b52565b95506040880135612d7281612b66565b9450612d8060608901612b52565b93506080880135612d9081612b66565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215612dc257600080fd5b612dcb84612b52565b92506020840135612ddb81612b66565b91506040840135612deb81612b66565b809150509250925092565b600060208284031215612e0857600080fd5b5035919050565b80610400810183101561068d57600080fd5b60008060006104408486031215612e3757600080fd5b83359250612e488560208601612e0f565b9150612e576104208501612b52565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612e9e57612e9e612e60565b604052919050565b60006001600160401b03821115612ebf57612ebf612e60565b50601f01601f191660200190565b6000612ee0612edb84612ea6565b612e76565b9050828152838383011115612ef457600080fd5b828260208301376000602084830101529392505050565b600082601f830112612f1c57600080fd5b612cfb83833560208501612ecd565b600080600080600060a08688031215612f4357600080fd5b612f4c86612b52565b94506020860135612f5c81612b66565b935060408601356001600160401b0380821115612f7857600080fd5b612f8489838a01612f0b565b94506060880135915080821115612f9a57600080fd5b50612fa788828901612f0b565b9250506080860135612fb881612d1f565b809150509295509295909350565b60008060008060008060a08789031215612fdf57600080fd5b612fe887612b52565b95506020870135612ff881612b66565b945060408701359350606087013561300f81612bc9565b925060808701356001600160401b0381111561302a57600080fd5b61303689828a01612bd7565b979a9699509497509295939492505050565b6000806040838503121561305b57600080fd5b61306483612b52565b915061307260208401612b52565b90509250929050565b6000806000806000806000806000806000806109208d8f03121561309e57600080fd5b6130a88e8e612e0f565b9b506130b88e6104008f01612e0f565b9a506108008d013599506108208d013598506108408d013597506130df6108608e01612b52565b96506130ef6108808e0135612b66565b6108808d013595506131046108a08e01612b52565b94506131146108c08e0135612b66565b6108c08d013593506108e08d013592506001600160401b036109008e0135111561313d57600080fd5b61314e8e6109008f01358f01612bd7565b81935080925050509295989b509295989b509295989b565b600080600080600080600060c0888a03121561318157600080fd5b61318a88612b52565b9650602088013561319a81612b66565b95506040880135945060608801356131b181612b66565b935060808801356131c181612bc9565b925060a08801356001600160401b038111156131dc57600080fd5b6131e88a828b01612bd7565b989b979a50959850939692959293505050565b60008060008060008060c0878903121561321457600080fd5b61321d87612b52565b9550602087013561322d81612b66565b945061323b60408801612b52565b9350606087013561324b81612b66565b9250608087013561325b81612b66565b915060a08701356001600160401b0381111561327657600080fd5b8701601f8101891361328757600080fd5b61329689823560208401612ecd565b9150509295509295509295565b60008060008061046085870312156132ba57600080fd5b843593506132cb8660208701612e0f565b92506132da6104208601612b52565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b600181811c9082168061332957607f821691505b60208210810361334957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161338d5761338d613365565b5060010190565b6060815260006133a76060830186612cbc565b82810360208401526133b98186612cbc565b91505060ff83166040830152949350505050565b600083516133df818460208801612c98565b8351908301906133f3818360208801612c98565b01949350505050565b6001600160a01b03929092168252602082015260400190565b808202811582820484141761068d5761068d613365565b8082018082111561068d5761068d613365565b8183823760009101908152919050565b60008251613461818460208701612c98565b9190910192915050565b60008060006060848603121561348057600080fd5b83356001600160401b038082111561349757600080fd5b6134a387838801612f0b565b945060208601359150808211156134b957600080fd5b506134c686828701612f0b565b9250506040840135612deb81612d1f565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b63ffffffff861681526001600160a01b03858116602083015284166040820152608060608201819052600090612aa990830184866134d7565b94855263ffffffff9390931660208501526001600160a01b039182166040850152166060830152608082015260a00190565b60006020828403121561357d57600080fd5b5051919050565b8181038181111561068d5761068d613365565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c083018190526000916135e984830187612cbc565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff8416602082015260606040820181905260009061363390830184866134d7565b9695505050505050565b601f82111561213657600081815260208120601f850160051c810160208610156136645750805b601f850160051c820191505b81811015610bfc57828155600101613670565b81516001600160401b0381111561369c5761369c612e60565b6136b0816136aa8454613315565b8461363d565b602080601f8311600181146136e557600084156136cd5750858301515b600019600386901b1c1916600185901b178555610bfc565b600085815260208120601f198616915b82811015613714578886015182559484019460019091019084016136f5565b50858210156137325787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c0830181905260009161379584830187896134d7565b925080851660e085015250509a9950505050505050505050565b6000602082840312156137c157600080fd5b8151612cfb81612d1f565b63ffffffff8181168382160190808211156121b0576121b0613365565b600080858511156137f957600080fd5b8386111561380657600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561383b5780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a03121561385e57600080fd5b873561386981612b66565b9650602088013561387981612b66565b955060408801359450606088013593506080880135612d9081612d1f565b600080600080600080600080610100898b0312156138b457600080fd5b88356138bf81612b66565b975060208901356138cf81612b66565b9650604089013595506060890135945060808901356138ed81612bc9565b935060a08901356138fd81612d1f565b979a969950949793969295929450505060c08201359160e0013590565b600181815b8085111561395557816000190482111561393b5761393b613365565b8085161561394857918102915b93841c939080029061391f565b509250929050565b60008261396c5750600161068d565b816139795750600061068d565b816001811461398f5760028114613999576139b5565b600191505061068d565b60ff8411156139aa576139aa613365565b50506001821b61068d565b5060208310610133831016604e8410600b84101617156139d8575081810a61068d565b6139e2838361391a565b80600019048211156139f6576139f6613365565b029392505050565b6000612cfb838361395d565b634e487b7160e01b600052600160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600060208284031215613a7d57600080fd5b81516001600160401b03811115613a9357600080fd5b8201601f81018413613aa457600080fd5b8051613ab2612edb82612ea6565b818152856020838501011115613ac757600080fd5b613ad8826020830160208601612c98565b95945050505050565b600060208284031215613af357600080fd5b8151612cfb81612bc956fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a26469706673582212200a12026b2bf610e2f7ca4010de0412e160fb51c1e73ab9266a4271993dca473b64736f6c63430008140033", - "deployedBytecode": "0x6080604052600436106101a35760003560e01c806383f24403116100e2578063ccaa2d1111610085578063ccaa2d1114610511578063cd58657914610531578063d02103ca14610544578063dbc169761461056b578063ee25560b14610580578063f5efcd79146105ad578063f811bff7146105cd578063fb570834146105ed57600080fd5b806383f244031461040b5780638ed7e3f21461042b578063aaa13cc21461044b578063b8b284d01461046b578063bab161bf1461048b578063be5831c7146104ad578063c00f14ab146104d1578063cc461632146104f157600080fd5b80633cbc795b1161014a5780633cbc795b146102fd5780633e197043146103365780634b2f336d146103565780635ca1e165146103765780637843298b1461038b57806379e2cf97146103ab57806381b1c174146103c057806383c43a55146103f657600080fd5b806315064c96146101a85780632072f6c5146101d757806322e95f2c146101ee578063240ff3781461021b57806327aef4e81461022e5780632dfdf0b514610250578063318aee3d146102745780633c351e10146102dd575b600080fd5b3480156101b457600080fd5b506068546101c29060ff1681565b60405190151581526020015b60405180910390f35b3480156101e357600080fd5b506101ec61060d565b005b3480156101fa57600080fd5b5061020e610209366004612b7e565b610642565b6040516101ce9190612bb5565b6101ec610229366004612c1f565b610693565b34801561023a57600080fd5b50610243610703565b6040516101ce9190612ce8565b34801561025c57600080fd5b5061026660535481565b6040519081526020016101ce565b34801561028057600080fd5b506102b961028f366004612d02565b606b6020526000908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b039091166020830152016101ce565b3480156102e957600080fd5b50606d5461020e906001600160a01b031681565b34801561030957600080fd5b50606d5461032190600160a01b900463ffffffff1681565b60405163ffffffff90911681526020016101ce565b34801561034257600080fd5b50610266610351366004612d2e565b610791565b34801561036257600080fd5b50606f5461020e906001600160a01b031681565b34801561038257600080fd5b5061026661081e565b34801561039757600080fd5b5061020e6103a6366004612dad565b6108fb565b3480156103b757600080fd5b506101ec610925565b3480156103cc57600080fd5b5061020e6103db366004612df6565b606a602052600090815260409020546001600160a01b031681565b34801561040257600080fd5b50610243610946565b34801561041757600080fd5b50610266610426366004612e21565b610965565b34801561043757600080fd5b50606c5461020e906001600160a01b031681565b34801561045757600080fd5b5061020e610466366004612f2b565b610a3b565b34801561047757600080fd5b506101ec610486366004612fc6565b610b3d565b34801561049757600080fd5b5060685461032190610100900463ffffffff1681565b3480156104b957600080fd5b5060685461032190600160c81b900463ffffffff1681565b3480156104dd57600080fd5b506102436104ec366004612d02565b610c04565b3480156104fd57600080fd5b506101c261050c366004613048565b610c49565b34801561051d57600080fd5b506101ec61052c36600461307b565b610cd2565b6101ec61053f366004613166565b6111e0565b34801561055057600080fd5b5060685461020e90600160281b90046001600160a01b031681565b34801561057757600080fd5b506101ec61163a565b34801561058c57600080fd5b5061026661059b366004612df6565b60696020526000908152604090205481565b3480156105b957600080fd5b506101ec6105c836600461307b565b61166d565b3480156105d957600080fd5b506101ec6105e83660046131fb565b611908565b3480156105f957600080fd5b506101c26106083660046132a3565b611b7b565b606c546001600160a01b0316331461063857604051631736745960e31b815260040160405180910390fd5b610640611b93565b565b6000606a6000848460405160200161065b9291906132eb565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b60685460ff16156106b757604051630bc011ff60e21b815260040160405180910390fd5b34158015906106d05750606f546001600160a01b031615155b156106ee576040516301bd897160e61b815260040160405180910390fd5b6106fc858534868686611bef565b5050505050565b606e805461071090613315565b80601f016020809104026020016040519081016040528092919081815260200182805461073c90613315565b80156107895780601f1061075e57610100808354040283529160200191610789565b820191906000526020600020905b81548152906001019060200180831161076c57829003601f168201915b505050505081565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b605354600090819081805b60208110156108f2578083901c60011660010361088657603381602081106108535761085361334f565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506108b3565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806108ea9061337b565b915050610829565b50919392505050565b600061091d848461090b85611cb9565b61091486611d78565b61046687611e30565b949350505050565b605354606854600160c81b900463ffffffff16101561064057610640611ee8565b60405180611ba00160405280611b668152602001613aff611b66913981565b600083815b6020811015610a3257600163ffffffff8516821c811690036109d5578481602081106109985761099861334f565b6020020135826040516020016109b8929190918252602082015260400190565b604051602081830303815290604052805190602001209150610a20565b818582602081106109e8576109e861334f565b6020020135604051602001610a07929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610a2a8161337b565b91505061096a565b50949350505050565b6000808686604051602001610a519291906132eb565b604051602081830303815290604052805190602001209050600060ff60f81b308360405180611ba00160405280611b668152602001613aff611b669139898989604051602001610aa393929190613394565b60408051601f1981840301815290829052610ac192916020016133cd565b60405160208183030381529060405280519060200120604051602001610b1994939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff1615610b6157604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b0316610b8a5760405163dde3cda760e01b815260040160405180910390fd5b606f54604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac90610bbc90339088906004016133fc565b600060405180830381600087803b158015610bd657600080fd5b505af1158015610bea573d6000803e3d6000fd5b50505050610bfc868686868686611bef565b505050505050565b6060610c0f82611cb9565b610c1883611d78565b610c2184611e30565b604051602001610c3393929190613394565b6040516020818303038152906040529050919050565b6068546000908190610100900463ffffffff16158015610c6f575063ffffffff83166001145b15610c81575063ffffffff8316610ca8565b610c95600160201b63ffffffff8516613415565b610ca59063ffffffff861661342c565b90505b600881901c600090815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff1615610cf657604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614610d26576040516302caf51760e11b815260040160405180910390fd5b610d5a8c8c8c8c8c610d5560008e8e8e8e8e8e8e604051610d4892919061343f565b6040518091039020610791565b611f81565b6001600160a01b038616610e9257606f546001600160a01b0316610e295760006001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015610db1576020820181803683370190505b50604051610dbf919061344f565b60006040518083038185875af1925050503d8060008114610dfc576040519150601f19603f3d011682016040523d82523d6000602084013e610e01565b606091505b5050905080610e2357604051630ce8f45160e31b815260040160405180910390fd5b50611193565b606f546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990610e5b90879087906004016133fc565b600060405180830381600087803b158015610e7557600080fd5b505af1158015610e89573d6000803e3d6000fd5b50505050611193565b606d546001600160a01b038781169116148015610ec05750606d5463ffffffff888116600160a01b90920416145b15610ed85760006001600160a01b0385168482610d87565b60685463ffffffff610100909104811690881603610f0957610f046001600160a01b03871685856120e0565b611193565b60008787604051602001610f1e9291906132eb565b60408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b03168061112f5760008080610f648688018861346b565b9250925092505050506000610faf8386868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061213b92505050565b6040516340c10f1960e01b81529091506001600160a01b038216906340c10f1990610fe0908a908a906004016133fc565b600060405180830381600087803b158015610ffa57600080fd5b505af115801561100e573d6000803e3d6000fd5b5050505080606a600085815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a838888604051611121959493929190613500565b60405180910390a150611190565b6040516340c10f1960e01b81526001600160a01b038216906340c10f199061115d90899089906004016133fc565b600060405180830381600087803b15801561117757600080fd5b505af115801561118b573d6000803e3d6000fd5b505050505b50505b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8a888887876040516111ca959493929190613539565b60405180910390a1505050505050505050505050565b60685460ff161561120457604051630bc011ff60e21b815260040160405180910390fd5b61120c6121b7565b60685463ffffffff61010090910481169088160361123d576040516302caf51760e11b815260040160405180910390fd5b6000806060876001600160a01b038816611323578834146112715760405163b89240f560e01b815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff1694509061129e90613315565b80601f01602080910402602001604051908101604052809291908181526020018280546112ca90613315565b80156113175780601f106112ec57610100808354040283529160200191611317565b820191906000526020600020905b8154815290600101906020018083116112fa57829003601f168201915b505050505091506115af565b34156113425760405163798ee6f160e01b815260040160405180910390fd5b606f546001600160a01b03908116908916036113bd57604051632770a7eb60e21b81526001600160a01b03891690639dc29fac906113869033908d906004016133fc565b600060405180830381600087803b1580156113a057600080fd5b505af11580156113b4573d6000803e3d6000fd5b505050506115af565b6001600160a01b038089166000908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b9004909216918101829052901561147557604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac906114309033908e906004016133fc565b600060405180830381600087803b15801561144a57600080fd5b505af115801561145e573d6000803e3d6000fd5b5050505080602001519450806000015193506115a2565b851561148757611487898b8989612210565b6040516370a0823160e01b81526000906001600160a01b038b16906370a08231906114b6903090600401612bb5565b602060405180830381865afa1580156114d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f7919061356b565b905061150e6001600160a01b038b1633308e612556565b6040516370a0823160e01b81526000906001600160a01b038c16906370a082319061153d903090600401612bb5565b602060405180830381865afa15801561155a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157e919061356b565b905061158a8282613584565b6068548c9850610100900463ffffffff169650935050505b6115ab89610c04565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e86886053546040516115ef989796959493929190613597565b60405180910390a1611616611611600085878f8f878980519060200120610791565b61258e565b861561162457611624611ee8565b5050505061163160018055565b50505050505050565b606c546001600160a01b0316331461166557604051631736745960e31b815260040160405180910390fd5b610640612679565b60685460ff161561169157604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146116c1576040516302caf51760e11b815260040160405180910390fd5b6116e38c8c8c8c8c610d5560018e8e8e8e8e8e8e604051610d4892919061343f565b606f546000906001600160a01b031661179a57846001600160a01b031684888a86866040516024016117189493929190613602565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161174d919061344f565b60006040518083038185875af1925050503d806000811461178a576040519150601f19603f3d011682016040523d82523d6000602084013e61178f565b606091505b50508091505061189c565b606f546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906117cc90889088906004016133fc565b600060405180830381600087803b1580156117e657600080fd5b505af11580156117fa573d6000803e3d6000fd5b50505050846001600160a01b03168789858560405160240161181f9493929190613602565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b17905251611854919061344f565b6000604051808303816000865af19150503d8060008114611891576040519150601f19603f3d011682016040523d82523d6000602084013e611896565b606091505b50909150505b806118ba576040516337e391c360e01b815260040160405180910390fd5b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8b898988886040516118f1959493929190613539565b60405180910390a150505050505050505050505050565b600054610100900460ff16158080156119285750600054600160ff909116105b806119425750303b158015611942575060005460ff166001145b6119aa5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156119cd576000805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff8a160265010000000000600160c81b03191617600160281b6001600160a01b038781169190910291909117909155606c80546001600160a01b0319168583161790558616611a565763ffffffff851615611a5157604051630d43a60960e11b815260040160405180910390fd5b611b25565b606d805463ffffffff8716600160a01b026001600160c01b03199091166001600160a01b03891617179055606e611a8d8382613683565b50611b046000801b6012604051602001611af091906060808252600d908201526c2bb930b83832b21022ba3432b960991b608082015260a060208201819052600490820152630ae8aa8960e31b60c082015260ff91909116604082015260e00190565b60405160208183030381529060405261213b565b606f80546001600160a01b0319166001600160a01b03929092169190911790555b611b2d6126d1565b8015611631576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b600081611b89868686610965565b1495945050505050565b60685460ff1615611bb757604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b60685463ffffffff610100909104811690871603611c20576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051611c7499989796959493929190613742565b60405180910390a1611cab6116116001606860019054906101000a900463ffffffff16338a8a8a8989604051610d4892919061343f565b8215610bfc57610bfc611ee8565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009182916001600160a01b03861691611d00919061344f565b600060405180830381855afa9150503d8060008114611d3b576040519150601f19603f3d011682016040523d82523d6000602084013e611d40565b606091505b509150915081611d6f57604051806040016040528060078152602001664e4f5f4e414d4560c81b81525061091d565b61091d81612700565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009182916001600160a01b03861691611dbf919061344f565b600060405180830381855afa9150503d8060008114611dfa576040519150601f19603f3d011682016040523d82523d6000602084013e611dff565b606091505b509150915081611d6f57604051806040016040528060098152602001681393d7d4d6535093d360ba1b81525061091d565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b03861691611e76919061344f565b600060405180830381855afa9150503d8060008114611eb1576040519150601f19603f3d011682016040523d82523d6000602084013e611eb6565b606091505b5091509150818015611ec9575080516020145b611ed457601261091d565b8080602001905181019061091d91906137af565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d611f2f61081e565b6040518263ffffffff1660e01b8152600401611f4d91815260200190565b600060405180830381600087803b158015611f6757600080fd5b505af1158015611f7b573d6000803e3d6000fd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101206312bd9b1960e11b9092526064810191909152600091600160281b90046001600160a01b03169063257b3632906084016020604051808303816000875af1158015611ffb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201f919061356b565b90508060000361204157604051622f6fad60e01b815260040160405180910390fd5b600080600160401b8716156120815786915061205f848a8489611b7b565b61207c576040516338105f3b60e21b815260040160405180910390fd5b6120cb565b602087901c6120918160016137cc565b91508792506120ac6120a4868c86610965565b8a8389611b7b565b6120c9576040516338105f3b60e21b815260040160405180910390fd5b505b6120d5828261288e565b505050505050505050565b6121368363a9059cbb60e01b84846040516024016120ff9291906133fc565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612936565b505050565b60008060405180611ba00160405280611b668152602001613aff611b6691398360405160200161216c9291906133cd565b6040516020818303038152906040529050838151602083016000f591506001600160a01b0382166121b0576040516305f7d84960e51b815260040160405180910390fd5b5092915050565b6002600154036122095760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016119a1565b6002600155565b600061221f60048284866137e9565b61222891613813565b9050632afa533160e01b6001600160e01b03198216016123bc576000808080808080612257896004818d6137e9565b8101906122649190613843565b9650965096509650965096509650336001600160a01b0316876001600160a01b0316146122a45760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03861630146122cd5760405163750643af60e01b815260040160405180910390fd5b8a85146122ed576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e169161236b919061344f565b6000604051808303816000865af19150503d80600081146123a8576040519150601f19603f3d011682016040523d82523d6000602084013e6123ad565b606091505b505050505050505050506106fc565b6001600160e01b031981166323f2ebc360e21b146123ed57604051637141605d60e11b815260040160405180910390fd5b6000808080808080806124038a6004818e6137e9565b8101906124109190613897565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146124525760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038716301461247b5760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f1691612502919061344f565b6000604051808303816000865af19150503d806000811461253f576040519150601f19603f3d011682016040523d82523d6000602084013e612544565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611f7b9085906323b872dd60e01b906084016120ff565b80600161259d602060026139fe565b6125a79190613584565b605354106125c8576040516377ae67b360e11b815260040160405180910390fd5b60006053600081546125d99061337b565b9182905550905060005b602081101561266a578082901c60011660010361261657826033826020811061260e5761260e61334f565b015550505050565b603381602081106126295761262961334f565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925080806126629061337b565b9150506125e3565b50612136613a0a565b60018055565b60685460ff1661269c57604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600054610100900460ff166126f85760405162461bcd60e51b81526004016119a190613a20565b610640612a08565b6060604082511061271f578180602001905181019061068d9190613a6b565b815160200361285b5760005b60208110801561275a57508281815181106127485761274861334f565b01602001516001600160f81b03191615155b1561277157806127698161337b565b91505061272b565b806000036127a95750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b6000816001600160401b038111156127c3576127c3612e60565b6040519080825280601f01601f1916602001820160405280156127ed576020820181803683370190505b50905060005b828110156128535784818151811061280d5761280d61334f565b602001015160f81c60f81b82828151811061282a5761282a61334f565b60200101906001600160f81b031916908160001a9053508061284b8161337b565b9150506127f3565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b606854600090610100900463ffffffff161580156128b2575063ffffffff82166001145b156128c4575063ffffffff82166128eb565b6128d8600160201b63ffffffff8416613415565b6128e89063ffffffff851661342c565b90505b600881901c60008181526069602052604081208054600160ff861690811b9182189283905592909190818316900361163157604051630c8d9eab60e31b815260040160405180910390fd5b600061298b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612a2f9092919063ffffffff16565b80519091501561213657808060200190518101906129a99190613ae1565b6121365760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016119a1565b600054610100900460ff166126735760405162461bcd60e51b81526004016119a190613a20565b606061091d848460008585600080866001600160a01b03168587604051612a56919061344f565b60006040518083038185875af1925050503d8060008114612a93576040519150601f19603f3d011682016040523d82523d6000602084013e612a98565b606091505b5091509150612aa987838387612ab4565b979650505050505050565b60608315612b23578251600003612b1c576001600160a01b0385163b612b1c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016119a1565b508161091d565b61091d8383815115612b385781518083602001fd5b8060405162461bcd60e51b81526004016119a19190612ce8565b803563ffffffff8116811461288957600080fd5b6001600160a01b0381168114612b7b57600080fd5b50565b60008060408385031215612b9157600080fd5b612b9a83612b52565b91506020830135612baa81612b66565b809150509250929050565b6001600160a01b0391909116815260200190565b8015158114612b7b57600080fd5b60008083601f840112612be957600080fd5b5081356001600160401b03811115612c0057600080fd5b602083019150836020828501011115612c1857600080fd5b9250929050565b600080600080600060808688031215612c3757600080fd5b612c4086612b52565b94506020860135612c5081612b66565b93506040860135612c6081612bc9565b925060608601356001600160401b03811115612c7b57600080fd5b612c8788828901612bd7565b969995985093965092949392505050565b60005b83811015612cb3578181015183820152602001612c9b565b50506000910152565b60008151808452612cd4816020860160208601612c98565b601f01601f19169290920160200192915050565b602081526000612cfb6020830184612cbc565b9392505050565b600060208284031215612d1457600080fd5b8135612cfb81612b66565b60ff81168114612b7b57600080fd5b600080600080600080600060e0888a031215612d4957600080fd5b8735612d5481612d1f565b9650612d6260208901612b52565b95506040880135612d7281612b66565b9450612d8060608901612b52565b93506080880135612d9081612b66565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215612dc257600080fd5b612dcb84612b52565b92506020840135612ddb81612b66565b91506040840135612deb81612b66565b809150509250925092565b600060208284031215612e0857600080fd5b5035919050565b80610400810183101561068d57600080fd5b60008060006104408486031215612e3757600080fd5b83359250612e488560208601612e0f565b9150612e576104208501612b52565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612e9e57612e9e612e60565b604052919050565b60006001600160401b03821115612ebf57612ebf612e60565b50601f01601f191660200190565b6000612ee0612edb84612ea6565b612e76565b9050828152838383011115612ef457600080fd5b828260208301376000602084830101529392505050565b600082601f830112612f1c57600080fd5b612cfb83833560208501612ecd565b600080600080600060a08688031215612f4357600080fd5b612f4c86612b52565b94506020860135612f5c81612b66565b935060408601356001600160401b0380821115612f7857600080fd5b612f8489838a01612f0b565b94506060880135915080821115612f9a57600080fd5b50612fa788828901612f0b565b9250506080860135612fb881612d1f565b809150509295509295909350565b60008060008060008060a08789031215612fdf57600080fd5b612fe887612b52565b95506020870135612ff881612b66565b945060408701359350606087013561300f81612bc9565b925060808701356001600160401b0381111561302a57600080fd5b61303689828a01612bd7565b979a9699509497509295939492505050565b6000806040838503121561305b57600080fd5b61306483612b52565b915061307260208401612b52565b90509250929050565b6000806000806000806000806000806000806109208d8f03121561309e57600080fd5b6130a88e8e612e0f565b9b506130b88e6104008f01612e0f565b9a506108008d013599506108208d013598506108408d013597506130df6108608e01612b52565b96506130ef6108808e0135612b66565b6108808d013595506131046108a08e01612b52565b94506131146108c08e0135612b66565b6108c08d013593506108e08d013592506001600160401b036109008e0135111561313d57600080fd5b61314e8e6109008f01358f01612bd7565b81935080925050509295989b509295989b509295989b565b600080600080600080600060c0888a03121561318157600080fd5b61318a88612b52565b9650602088013561319a81612b66565b95506040880135945060608801356131b181612b66565b935060808801356131c181612bc9565b925060a08801356001600160401b038111156131dc57600080fd5b6131e88a828b01612bd7565b989b979a50959850939692959293505050565b60008060008060008060c0878903121561321457600080fd5b61321d87612b52565b9550602087013561322d81612b66565b945061323b60408801612b52565b9350606087013561324b81612b66565b9250608087013561325b81612b66565b915060a08701356001600160401b0381111561327657600080fd5b8701601f8101891361328757600080fd5b61329689823560208401612ecd565b9150509295509295509295565b60008060008061046085870312156132ba57600080fd5b843593506132cb8660208701612e0f565b92506132da6104208601612b52565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b600181811c9082168061332957607f821691505b60208210810361334957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161338d5761338d613365565b5060010190565b6060815260006133a76060830186612cbc565b82810360208401526133b98186612cbc565b91505060ff83166040830152949350505050565b600083516133df818460208801612c98565b8351908301906133f3818360208801612c98565b01949350505050565b6001600160a01b03929092168252602082015260400190565b808202811582820484141761068d5761068d613365565b8082018082111561068d5761068d613365565b8183823760009101908152919050565b60008251613461818460208701612c98565b9190910192915050565b60008060006060848603121561348057600080fd5b83356001600160401b038082111561349757600080fd5b6134a387838801612f0b565b945060208601359150808211156134b957600080fd5b506134c686828701612f0b565b9250506040840135612deb81612d1f565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b63ffffffff861681526001600160a01b03858116602083015284166040820152608060608201819052600090612aa990830184866134d7565b94855263ffffffff9390931660208501526001600160a01b039182166040850152166060830152608082015260a00190565b60006020828403121561357d57600080fd5b5051919050565b8181038181111561068d5761068d613365565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c083018190526000916135e984830187612cbc565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff8416602082015260606040820181905260009061363390830184866134d7565b9695505050505050565b601f82111561213657600081815260208120601f850160051c810160208610156136645750805b601f850160051c820191505b81811015610bfc57828155600101613670565b81516001600160401b0381111561369c5761369c612e60565b6136b0816136aa8454613315565b8461363d565b602080601f8311600181146136e557600084156136cd5750858301515b600019600386901b1c1916600185901b178555610bfc565b600085815260208120601f198616915b82811015613714578886015182559484019460019091019084016136f5565b50858210156137325787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c0830181905260009161379584830187896134d7565b925080851660e085015250509a9950505050505050505050565b6000602082840312156137c157600080fd5b8151612cfb81612d1f565b63ffffffff8181168382160190808211156121b0576121b0613365565b600080858511156137f957600080fd5b8386111561380657600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561383b5780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a03121561385e57600080fd5b873561386981612b66565b9650602088013561387981612b66565b955060408801359450606088013593506080880135612d9081612d1f565b600080600080600080600080610100898b0312156138b457600080fd5b88356138bf81612b66565b975060208901356138cf81612b66565b9650604089013595506060890135945060808901356138ed81612bc9565b935060a08901356138fd81612d1f565b979a969950949793969295929450505060c08201359160e0013590565b600181815b8085111561395557816000190482111561393b5761393b613365565b8085161561394857918102915b93841c939080029061391f565b509250929050565b60008261396c5750600161068d565b816139795750600061068d565b816001811461398f5760028114613999576139b5565b600191505061068d565b60ff8411156139aa576139aa613365565b50506001821b61068d565b5060208310610133831016604e8410600b84101617156139d8575081810a61068d565b6139e2838361391a565b80600019048211156139f6576139f6613365565b029392505050565b6000612cfb838361395d565b634e487b7160e01b600052600160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600060208284031215613a7d57600080fd5b81516001600160401b03811115613a9357600080fd5b8201601f81018413613aa457600080fd5b8051613ab2612edb82612ea6565b818152856020838501011115613ac757600080fd5b613ad8826020830160208601612c98565b95945050505050565b600060208284031215613af357600080fd5b8151612cfb81612bc956fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a26469706673582212200a12026b2bf610e2f7ca4010de0412e160fb51c1e73ab9266a4271993dca473b64736f6c63430008140033", + "bytecode": "0x60806040523480156200001157600080fd5b506200001c62000022565b620000e4565b600054610100900460ff16156200008f5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161015620000e2576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b61561580620000f46000396000f3fe6080604052600436106101a35760003560e01c806383f24403116100e2578063ccaa2d1111610085578063ccaa2d1114610511578063cd58657914610531578063d02103ca14610544578063dbc169761461056b578063ee25560b14610580578063f5efcd79146105ad578063f811bff7146105cd578063fb570834146105ed57600080fd5b806383f244031461040b5780638ed7e3f21461042b578063aaa13cc21461044b578063b8b284d01461046b578063bab161bf1461048b578063be5831c7146104ad578063c00f14ab146104d1578063cc461632146104f157600080fd5b80633cbc795b1161014a5780633cbc795b146102fd5780633e197043146103365780634b2f336d146103565780635ca1e165146103765780637843298b1461038b57806379e2cf97146103ab57806381b1c174146103c057806383c43a55146103f657600080fd5b806315064c96146101a85780632072f6c5146101d757806322e95f2c146101ee578063240ff3781461021b57806327aef4e81461022e5780632dfdf0b514610250578063318aee3d146102745780633c351e10146102dd575b600080fd5b3480156101b457600080fd5b506068546101c29060ff1681565b60405190151581526020015b60405180910390f35b3480156101e357600080fd5b506101ec61060d565b005b3480156101fa57600080fd5b5061020e610209366004612b65565b610642565b6040516101ce9190612b9c565b6101ec610229366004612c06565b610693565b34801561023a57600080fd5b50610243610703565b6040516101ce9190612ccf565b34801561025c57600080fd5b5061026660535481565b6040519081526020016101ce565b34801561028057600080fd5b506102b961028f366004612ce9565b606b6020526000908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b039091166020830152016101ce565b3480156102e957600080fd5b50606d5461020e906001600160a01b031681565b34801561030957600080fd5b50606d5461032190600160a01b900463ffffffff1681565b60405163ffffffff90911681526020016101ce565b34801561034257600080fd5b50610266610351366004612d15565b610791565b34801561036257600080fd5b50606f5461020e906001600160a01b031681565b34801561038257600080fd5b5061026661081e565b34801561039757600080fd5b5061020e6103a6366004612d94565b6108fb565b3480156103b757600080fd5b506101ec610925565b3480156103cc57600080fd5b5061020e6103db366004612ddd565b606a602052600090815260409020546001600160a01b031681565b34801561040257600080fd5b50610243610946565b34801561041757600080fd5b50610266610426366004612e08565b610965565b34801561043757600080fd5b50606c5461020e906001600160a01b031681565b34801561045757600080fd5b5061020e610466366004612f12565b610a3b565b34801561047757600080fd5b506101ec610486366004612fad565b610b3d565b34801561049757600080fd5b5060685461032190610100900463ffffffff1681565b3480156104b957600080fd5b5060685461032190600160c81b900463ffffffff1681565b3480156104dd57600080fd5b506102436104ec366004612ce9565b610c04565b3480156104fd57600080fd5b506101c261050c36600461302f565b610c49565b34801561051d57600080fd5b506101ec61052c366004613062565b610cd2565b6101ec61053f36600461314d565b6111c7565b34801561055057600080fd5b5060685461020e90600160281b90046001600160a01b031681565b34801561057757600080fd5b506101ec611621565b34801561058c57600080fd5b5061026661059b366004612ddd565b60696020526000908152604090205481565b3480156105b957600080fd5b506101ec6105c8366004613062565b611654565b3480156105d957600080fd5b506101ec6105e83660046131e2565b6118ef565b3480156105f957600080fd5b506101c261060836600461328a565b611b62565b606c546001600160a01b0316331461063857604051631736745960e31b815260040160405180910390fd5b610640611b7a565b565b6000606a6000848460405160200161065b9291906132d2565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b60685460ff16156106b757604051630bc011ff60e21b815260040160405180910390fd5b34158015906106d05750606f546001600160a01b031615155b156106ee576040516301bd897160e61b815260040160405180910390fd5b6106fc858534868686611bd6565b5050505050565b606e8054610710906132fc565b80601f016020809104026020016040519081016040528092919081815260200182805461073c906132fc565b80156107895780601f1061075e57610100808354040283529160200191610789565b820191906000526020600020905b81548152906001019060200180831161076c57829003601f168201915b505050505081565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b605354600090819081805b60208110156108f2578083901c600116600103610886576033816020811061085357610853613336565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506108b3565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806108ea90613362565b915050610829565b50919392505050565b600061091d848461090b85611ca0565b61091486611d5f565b61046687611e17565b949350505050565b605354606854600160c81b900463ffffffff16101561064057610640611ecf565b60405180611ba00160405280611b668152602001613a7a611b66913981565b600083815b6020811015610a3257600163ffffffff8516821c811690036109d55784816020811061099857610998613336565b6020020135826040516020016109b8929190918252602082015260400190565b604051602081830303815290604052805190602001209150610a20565b818582602081106109e8576109e8613336565b6020020135604051602001610a07929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610a2a81613362565b91505061096a565b50949350505050565b6000808686604051602001610a519291906132d2565b604051602081830303815290604052805190602001209050600060ff60f81b308360405180611ba00160405280611b668152602001613a7a611b669139898989604051602001610aa39392919061337b565b60408051601f1981840301815290829052610ac192916020016133b4565b60405160208183030381529060405280519060200120604051602001610b1994939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff1615610b6157604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b0316610b8a5760405163dde3cda760e01b815260040160405180910390fd5b606f54604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac90610bbc90339088906004016133e3565b600060405180830381600087803b158015610bd657600080fd5b505af1158015610bea573d6000803e3d6000fd5b50505050610bfc868686868686611bd6565b505050505050565b6060610c0f82611ca0565b610c1883611d5f565b610c2184611e17565b604051602001610c339392919061337b565b6040516020818303038152906040529050919050565b6068546000908190610100900463ffffffff16158015610c6f575063ffffffff83166001145b15610c81575063ffffffff8316610ca8565b610c95600160201b63ffffffff85166133fc565b610ca59063ffffffff8616613413565b90505b600881901c600090815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff1615610cf657604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614610d26576040516302caf51760e11b815260040160405180910390fd5b610d5a8c8c8c8c8c610d5560008e8e8e8e8e8e8e604051610d48929190613426565b6040518091039020610791565b611f68565b6001600160a01b038616610e9257606f546001600160a01b0316610e295760006001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015610db1576020820181803683370190505b50604051610dbf9190613436565b60006040518083038185875af1925050503d8060008114610dfc576040519150601f19603f3d011682016040523d82523d6000602084013e610e01565b606091505b5050905080610e2357604051630ce8f45160e31b815260040160405180910390fd5b5061117a565b606f546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990610e5b90879087906004016133e3565b600060405180830381600087803b158015610e7557600080fd5b505af1158015610e89573d6000803e3d6000fd5b5050505061117a565b606d546001600160a01b038781169116148015610ec05750606d5463ffffffff888116600160a01b90920416145b15610ed85760006001600160a01b0385168482610d87565b60685463ffffffff610100909104811690881603610f0957610f046001600160a01b03871685856120c7565b61117a565b60008787604051602001610f1e9291906132d2565b60408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b031680611116576000610f968386868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061212292505050565b6040516340c10f1960e01b81529091506001600160a01b038216906340c10f1990610fc7908a908a906004016133e3565b600060405180830381600087803b158015610fe157600080fd5b505af1158015610ff5573d6000803e3d6000fd5b5050505080606a600085815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a83888860405161110895949392919061347b565b60405180910390a150611177565b6040516340c10f1960e01b81526001600160a01b038216906340c10f199061114490899089906004016133e3565b600060405180830381600087803b15801561115e57600080fd5b505af1158015611172573d6000803e3d6000fd5b505050505b50505b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8a888887876040516111b19594939291906134b4565b60405180910390a1505050505050505050505050565b60685460ff16156111eb57604051630bc011ff60e21b815260040160405180910390fd5b6111f361219e565b60685463ffffffff610100909104811690881603611224576040516302caf51760e11b815260040160405180910390fd5b6000806060876001600160a01b03881661130a578834146112585760405163b89240f560e01b815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff16945090611285906132fc565b80601f01602080910402602001604051908101604052809291908181526020018280546112b1906132fc565b80156112fe5780601f106112d3576101008083540402835291602001916112fe565b820191906000526020600020905b8154815290600101906020018083116112e157829003601f168201915b50505050509150611596565b34156113295760405163798ee6f160e01b815260040160405180910390fd5b606f546001600160a01b03908116908916036113a457604051632770a7eb60e21b81526001600160a01b03891690639dc29fac9061136d9033908d906004016133e3565b600060405180830381600087803b15801561138757600080fd5b505af115801561139b573d6000803e3d6000fd5b50505050611596565b6001600160a01b038089166000908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b9004909216918101829052901561145c57604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac906114179033908e906004016133e3565b600060405180830381600087803b15801561143157600080fd5b505af1158015611445573d6000803e3d6000fd5b505050508060200151945080600001519350611589565b851561146e5761146e898b89896121f7565b6040516370a0823160e01b81526000906001600160a01b038b16906370a082319061149d903090600401612b9c565b602060405180830381865afa1580156114ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114de91906134e6565b90506114f56001600160a01b038b1633308e61253d565b6040516370a0823160e01b81526000906001600160a01b038c16906370a0823190611524903090600401612b9c565b602060405180830381865afa158015611541573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156591906134e6565b905061157182826134ff565b6068548c9850610100900463ffffffff169650935050505b61159289610c04565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e86886053546040516115d6989796959493929190613512565b60405180910390a16115fd6115f8600085878f8f878980519060200120610791565b612575565b861561160b5761160b611ecf565b5050505061161860018055565b50505050505050565b606c546001600160a01b0316331461164c57604051631736745960e31b815260040160405180910390fd5b610640612660565b60685460ff161561167857604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146116a8576040516302caf51760e11b815260040160405180910390fd5b6116ca8c8c8c8c8c610d5560018e8e8e8e8e8e8e604051610d48929190613426565b606f546000906001600160a01b031661178157846001600160a01b031684888a86866040516024016116ff949392919061357d565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b179052516117349190613436565b60006040518083038185875af1925050503d8060008114611771576040519150601f19603f3d011682016040523d82523d6000602084013e611776565b606091505b505080915050611883565b606f546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906117b390889088906004016133e3565b600060405180830381600087803b1580156117cd57600080fd5b505af11580156117e1573d6000803e3d6000fd5b50505050846001600160a01b031687898585604051602401611806949392919061357d565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161183b9190613436565b6000604051808303816000865af19150503d8060008114611878576040519150601f19603f3d011682016040523d82523d6000602084013e61187d565b606091505b50909150505b806118a1576040516337e391c360e01b815260040160405180910390fd5b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8b898988886040516118d89594939291906134b4565b60405180910390a150505050505050505050505050565b600054610100900460ff161580801561190f5750600054600160ff909116105b806119295750303b158015611929575060005460ff166001145b6119915760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156119b4576000805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff8a160265010000000000600160c81b03191617600160281b6001600160a01b038781169190910291909117909155606c80546001600160a01b0319168583161790558616611a3d5763ffffffff851615611a3857604051630d43a60960e11b815260040160405180910390fd5b611b0c565b606d805463ffffffff8716600160a01b026001600160c01b03199091166001600160a01b03891617179055606e611a7483826135fe565b50611aeb6000801b6012604051602001611ad791906060808252600d908201526c2bb930b83832b21022ba3432b960991b608082015260a060208201819052600490820152630ae8aa8960e31b60c082015260ff91909116604082015260e00190565b604051602081830303815290604052612122565b606f80546001600160a01b0319166001600160a01b03929092169190911790555b611b146126b8565b8015611618576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b600081611b70868686610965565b1495945050505050565b60685460ff1615611b9e57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b60685463ffffffff610100909104811690871603611c07576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051611c5b999897969594939291906136bd565b60405180910390a1611c926115f86001606860019054906101000a900463ffffffff16338a8a8a8989604051610d48929190613426565b8215610bfc57610bfc611ecf565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009182916001600160a01b03861691611ce79190613436565b600060405180830381855afa9150503d8060008114611d22576040519150601f19603f3d011682016040523d82523d6000602084013e611d27565b606091505b509150915081611d5657604051806040016040528060078152602001664e4f5f4e414d4560c81b81525061091d565b61091d816126e7565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009182916001600160a01b03861691611da69190613436565b600060405180830381855afa9150503d8060008114611de1576040519150601f19603f3d011682016040523d82523d6000602084013e611de6565b606091505b509150915081611d5657604051806040016040528060098152602001681393d7d4d6535093d360ba1b81525061091d565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b03861691611e5d9190613436565b600060405180830381855afa9150503d8060008114611e98576040519150601f19603f3d011682016040523d82523d6000602084013e611e9d565b606091505b5091509150818015611eb0575080516020145b611ebb57601261091d565b8080602001905181019061091d919061372a565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d611f1661081e565b6040518263ffffffff1660e01b8152600401611f3491815260200190565b600060405180830381600087803b158015611f4e57600080fd5b505af1158015611f62573d6000803e3d6000fd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101206312bd9b1960e11b9092526064810191909152600091600160281b90046001600160a01b03169063257b3632906084016020604051808303816000875af1158015611fe2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200691906134e6565b90508060000361202857604051622f6fad60e01b815260040160405180910390fd5b600080600160401b87161561206857869150612046848a8489611b62565b612063576040516338105f3b60e21b815260040160405180910390fd5b6120b2565b602087901c612078816001613747565b915087925061209361208b868c86610965565b8a8389611b62565b6120b0576040516338105f3b60e21b815260040160405180910390fd5b505b6120bc8282612875565b505050505050505050565b61211d8363a9059cbb60e01b84846040516024016120e69291906133e3565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261291d565b505050565b60008060405180611ba00160405280611b668152602001613a7a611b669139836040516020016121539291906133b4565b6040516020818303038152906040529050838151602083016000f591506001600160a01b038216612197576040516305f7d84960e51b815260040160405180910390fd5b5092915050565b6002600154036121f05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611988565b6002600155565b60006122066004828486613764565b61220f9161378e565b9050632afa533160e01b6001600160e01b03198216016123a357600080808080808061223e896004818d613764565b81019061224b91906137be565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161461228b5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03861630146122b45760405163750643af60e01b815260040160405180910390fd5b8a85146122d4576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e16916123529190613436565b6000604051808303816000865af19150503d806000811461238f576040519150601f19603f3d011682016040523d82523d6000602084013e612394565b606091505b505050505050505050506106fc565b6001600160e01b031981166323f2ebc360e21b146123d457604051637141605d60e11b815260040160405180910390fd5b6000808080808080806123ea8a6004818e613764565b8101906123f79190613812565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146124395760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146124625760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f16916124e99190613436565b6000604051808303816000865af19150503d8060008114612526576040519150601f19603f3d011682016040523d82523d6000602084013e61252b565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611f629085906323b872dd60e01b906084016120e6565b80600161258460206002613979565b61258e91906134ff565b605354106125af576040516377ae67b360e11b815260040160405180910390fd5b60006053600081546125c090613362565b9182905550905060005b6020811015612651578082901c6001166001036125fd5782603382602081106125f5576125f5613336565b015550505050565b6033816020811061261057612610613336565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061264990613362565b9150506125ca565b5061211d613985565b60018055565b60685460ff1661268357604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600054610100900460ff166126df5760405162461bcd60e51b81526004016119889061399b565b6106406129ef565b60606040825110612706578180602001905181019061068d91906139e6565b81516020036128425760005b602081108015612741575082818151811061272f5761272f613336565b01602001516001600160f81b03191615155b15612758578061275081613362565b915050612712565b806000036127905750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b6000816001600160401b038111156127aa576127aa612e47565b6040519080825280601f01601f1916602001820160405280156127d4576020820181803683370190505b50905060005b8281101561283a578481815181106127f4576127f4613336565b602001015160f81c60f81b82828151811061281157612811613336565b60200101906001600160f81b031916908160001a9053508061283281613362565b9150506127da565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b606854600090610100900463ffffffff16158015612899575063ffffffff82166001145b156128ab575063ffffffff82166128d2565b6128bf600160201b63ffffffff84166133fc565b6128cf9063ffffffff8516613413565b90505b600881901c60008181526069602052604081208054600160ff861690811b9182189283905592909190818316900361161857604051630c8d9eab60e31b815260040160405180910390fd5b6000612972826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612a169092919063ffffffff16565b80519091501561211d57808060200190518101906129909190613a5c565b61211d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611988565b600054610100900460ff1661265a5760405162461bcd60e51b81526004016119889061399b565b606061091d848460008585600080866001600160a01b03168587604051612a3d9190613436565b60006040518083038185875af1925050503d8060008114612a7a576040519150601f19603f3d011682016040523d82523d6000602084013e612a7f565b606091505b5091509150612a9087838387612a9b565b979650505050505050565b60608315612b0a578251600003612b03576001600160a01b0385163b612b035760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611988565b508161091d565b61091d8383815115612b1f5781518083602001fd5b8060405162461bcd60e51b81526004016119889190612ccf565b803563ffffffff8116811461287057600080fd5b6001600160a01b0381168114612b6257600080fd5b50565b60008060408385031215612b7857600080fd5b612b8183612b39565b91506020830135612b9181612b4d565b809150509250929050565b6001600160a01b0391909116815260200190565b8015158114612b6257600080fd5b60008083601f840112612bd057600080fd5b5081356001600160401b03811115612be757600080fd5b602083019150836020828501011115612bff57600080fd5b9250929050565b600080600080600060808688031215612c1e57600080fd5b612c2786612b39565b94506020860135612c3781612b4d565b93506040860135612c4781612bb0565b925060608601356001600160401b03811115612c6257600080fd5b612c6e88828901612bbe565b969995985093965092949392505050565b60005b83811015612c9a578181015183820152602001612c82565b50506000910152565b60008151808452612cbb816020860160208601612c7f565b601f01601f19169290920160200192915050565b602081526000612ce26020830184612ca3565b9392505050565b600060208284031215612cfb57600080fd5b8135612ce281612b4d565b60ff81168114612b6257600080fd5b600080600080600080600060e0888a031215612d3057600080fd5b8735612d3b81612d06565b9650612d4960208901612b39565b95506040880135612d5981612b4d565b9450612d6760608901612b39565b93506080880135612d7781612b4d565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215612da957600080fd5b612db284612b39565b92506020840135612dc281612b4d565b91506040840135612dd281612b4d565b809150509250925092565b600060208284031215612def57600080fd5b5035919050565b80610400810183101561068d57600080fd5b60008060006104408486031215612e1e57600080fd5b83359250612e2f8560208601612df6565b9150612e3e6104208501612b39565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612e8557612e85612e47565b604052919050565b60006001600160401b03821115612ea657612ea6612e47565b50601f01601f191660200190565b6000612ec7612ec284612e8d565b612e5d565b9050828152838383011115612edb57600080fd5b828260208301376000602084830101529392505050565b600082601f830112612f0357600080fd5b612ce283833560208501612eb4565b600080600080600060a08688031215612f2a57600080fd5b612f3386612b39565b94506020860135612f4381612b4d565b935060408601356001600160401b0380821115612f5f57600080fd5b612f6b89838a01612ef2565b94506060880135915080821115612f8157600080fd5b50612f8e88828901612ef2565b9250506080860135612f9f81612d06565b809150509295509295909350565b60008060008060008060a08789031215612fc657600080fd5b612fcf87612b39565b95506020870135612fdf81612b4d565b9450604087013593506060870135612ff681612bb0565b925060808701356001600160401b0381111561301157600080fd5b61301d89828a01612bbe565b979a9699509497509295939492505050565b6000806040838503121561304257600080fd5b61304b83612b39565b915061305960208401612b39565b90509250929050565b6000806000806000806000806000806000806109208d8f03121561308557600080fd5b61308f8e8e612df6565b9b5061309f8e6104008f01612df6565b9a506108008d013599506108208d013598506108408d013597506130c66108608e01612b39565b96506130d66108808e0135612b4d565b6108808d013595506130eb6108a08e01612b39565b94506130fb6108c08e0135612b4d565b6108c08d013593506108e08d013592506001600160401b036109008e0135111561312457600080fd5b6131358e6109008f01358f01612bbe565b81935080925050509295989b509295989b509295989b565b600080600080600080600060c0888a03121561316857600080fd5b61317188612b39565b9650602088013561318181612b4d565b955060408801359450606088013561319881612b4d565b935060808801356131a881612bb0565b925060a08801356001600160401b038111156131c357600080fd5b6131cf8a828b01612bbe565b989b979a50959850939692959293505050565b60008060008060008060c087890312156131fb57600080fd5b61320487612b39565b9550602087013561321481612b4d565b945061322260408801612b39565b9350606087013561323281612b4d565b9250608087013561324281612b4d565b915060a08701356001600160401b0381111561325d57600080fd5b8701601f8101891361326e57600080fd5b61327d89823560208401612eb4565b9150509295509295509295565b60008060008061046085870312156132a157600080fd5b843593506132b28660208701612df6565b92506132c16104208601612b39565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b600181811c9082168061331057607f821691505b60208210810361333057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016133745761337461334c565b5060010190565b60608152600061338e6060830186612ca3565b82810360208401526133a08186612ca3565b91505060ff83166040830152949350505050565b600083516133c6818460208801612c7f565b8351908301906133da818360208801612c7f565b01949350505050565b6001600160a01b03929092168252602082015260400190565b808202811582820484141761068d5761068d61334c565b8082018082111561068d5761068d61334c565b8183823760009101908152919050565b60008251613448818460208701612c7f565b9190910192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b63ffffffff861681526001600160a01b03858116602083015284166040820152608060608201819052600090612a909083018486613452565b94855263ffffffff9390931660208501526001600160a01b039182166040850152166060830152608082015260a00190565b6000602082840312156134f857600080fd5b5051919050565b8181038181111561068d5761068d61334c565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c0830181905260009161356484830187612ca3565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff841660208201526060604082018190526000906135ae9083018486613452565b9695505050505050565b601f82111561211d57600081815260208120601f850160051c810160208610156135df5750805b601f850160051c820191505b81811015610bfc578281556001016135eb565b81516001600160401b0381111561361757613617612e47565b61362b8161362584546132fc565b846135b8565b602080601f83116001811461366057600084156136485750858301515b600019600386901b1c1916600185901b178555610bfc565b600085815260208120601f198616915b8281101561368f57888601518255948401946001909101908401613670565b50858210156136ad5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c083018190526000916137108483018789613452565b925080851660e085015250509a9950505050505050505050565b60006020828403121561373c57600080fd5b8151612ce281612d06565b63ffffffff8181168382160190808211156121975761219761334c565b6000808585111561377457600080fd5b8386111561378157600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156137b65780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a0312156137d957600080fd5b87356137e481612b4d565b965060208801356137f481612b4d565b955060408801359450606088013593506080880135612d7781612d06565b600080600080600080600080610100898b03121561382f57600080fd5b883561383a81612b4d565b9750602089013561384a81612b4d565b96506040890135955060608901359450608089013561386881612bb0565b935060a089013561387881612d06565b979a969950949793969295929450505060c08201359160e0013590565b600181815b808511156138d05781600019048211156138b6576138b661334c565b808516156138c357918102915b93841c939080029061389a565b509250929050565b6000826138e75750600161068d565b816138f45750600061068d565b816001811461390a576002811461391457613930565b600191505061068d565b60ff8411156139255761392561334c565b50506001821b61068d565b5060208310610133831016604e8410600b8410161715613953575081810a61068d565b61395d8383613895565b80600019048211156139715761397161334c565b029392505050565b6000612ce283836138d8565b634e487b7160e01b600052600160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000602082840312156139f857600080fd5b81516001600160401b03811115613a0e57600080fd5b8201601f81018413613a1f57600080fd5b8051613a2d612ec282612e8d565b818152856020838501011115613a4257600080fd5b613a53826020830160208601612c7f565b95945050505050565b600060208284031215613a6e57600080fd5b8151612ce281612bb056fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a2646970667358221220f4e9229df3970b50b597bd5362e024183a84348b10ec25c7428ed52f5630fca964736f6c63430008140033", + "deployedBytecode": "0x6080604052600436106101a35760003560e01c806383f24403116100e2578063ccaa2d1111610085578063ccaa2d1114610511578063cd58657914610531578063d02103ca14610544578063dbc169761461056b578063ee25560b14610580578063f5efcd79146105ad578063f811bff7146105cd578063fb570834146105ed57600080fd5b806383f244031461040b5780638ed7e3f21461042b578063aaa13cc21461044b578063b8b284d01461046b578063bab161bf1461048b578063be5831c7146104ad578063c00f14ab146104d1578063cc461632146104f157600080fd5b80633cbc795b1161014a5780633cbc795b146102fd5780633e197043146103365780634b2f336d146103565780635ca1e165146103765780637843298b1461038b57806379e2cf97146103ab57806381b1c174146103c057806383c43a55146103f657600080fd5b806315064c96146101a85780632072f6c5146101d757806322e95f2c146101ee578063240ff3781461021b57806327aef4e81461022e5780632dfdf0b514610250578063318aee3d146102745780633c351e10146102dd575b600080fd5b3480156101b457600080fd5b506068546101c29060ff1681565b60405190151581526020015b60405180910390f35b3480156101e357600080fd5b506101ec61060d565b005b3480156101fa57600080fd5b5061020e610209366004612b65565b610642565b6040516101ce9190612b9c565b6101ec610229366004612c06565b610693565b34801561023a57600080fd5b50610243610703565b6040516101ce9190612ccf565b34801561025c57600080fd5b5061026660535481565b6040519081526020016101ce565b34801561028057600080fd5b506102b961028f366004612ce9565b606b6020526000908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b039091166020830152016101ce565b3480156102e957600080fd5b50606d5461020e906001600160a01b031681565b34801561030957600080fd5b50606d5461032190600160a01b900463ffffffff1681565b60405163ffffffff90911681526020016101ce565b34801561034257600080fd5b50610266610351366004612d15565b610791565b34801561036257600080fd5b50606f5461020e906001600160a01b031681565b34801561038257600080fd5b5061026661081e565b34801561039757600080fd5b5061020e6103a6366004612d94565b6108fb565b3480156103b757600080fd5b506101ec610925565b3480156103cc57600080fd5b5061020e6103db366004612ddd565b606a602052600090815260409020546001600160a01b031681565b34801561040257600080fd5b50610243610946565b34801561041757600080fd5b50610266610426366004612e08565b610965565b34801561043757600080fd5b50606c5461020e906001600160a01b031681565b34801561045757600080fd5b5061020e610466366004612f12565b610a3b565b34801561047757600080fd5b506101ec610486366004612fad565b610b3d565b34801561049757600080fd5b5060685461032190610100900463ffffffff1681565b3480156104b957600080fd5b5060685461032190600160c81b900463ffffffff1681565b3480156104dd57600080fd5b506102436104ec366004612ce9565b610c04565b3480156104fd57600080fd5b506101c261050c36600461302f565b610c49565b34801561051d57600080fd5b506101ec61052c366004613062565b610cd2565b6101ec61053f36600461314d565b6111c7565b34801561055057600080fd5b5060685461020e90600160281b90046001600160a01b031681565b34801561057757600080fd5b506101ec611621565b34801561058c57600080fd5b5061026661059b366004612ddd565b60696020526000908152604090205481565b3480156105b957600080fd5b506101ec6105c8366004613062565b611654565b3480156105d957600080fd5b506101ec6105e83660046131e2565b6118ef565b3480156105f957600080fd5b506101c261060836600461328a565b611b62565b606c546001600160a01b0316331461063857604051631736745960e31b815260040160405180910390fd5b610640611b7a565b565b6000606a6000848460405160200161065b9291906132d2565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b60685460ff16156106b757604051630bc011ff60e21b815260040160405180910390fd5b34158015906106d05750606f546001600160a01b031615155b156106ee576040516301bd897160e61b815260040160405180910390fd5b6106fc858534868686611bd6565b5050505050565b606e8054610710906132fc565b80601f016020809104026020016040519081016040528092919081815260200182805461073c906132fc565b80156107895780601f1061075e57610100808354040283529160200191610789565b820191906000526020600020905b81548152906001019060200180831161076c57829003601f168201915b505050505081565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b605354600090819081805b60208110156108f2578083901c600116600103610886576033816020811061085357610853613336565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506108b3565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806108ea90613362565b915050610829565b50919392505050565b600061091d848461090b85611ca0565b61091486611d5f565b61046687611e17565b949350505050565b605354606854600160c81b900463ffffffff16101561064057610640611ecf565b60405180611ba00160405280611b668152602001613a7a611b66913981565b600083815b6020811015610a3257600163ffffffff8516821c811690036109d55784816020811061099857610998613336565b6020020135826040516020016109b8929190918252602082015260400190565b604051602081830303815290604052805190602001209150610a20565b818582602081106109e8576109e8613336565b6020020135604051602001610a07929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610a2a81613362565b91505061096a565b50949350505050565b6000808686604051602001610a519291906132d2565b604051602081830303815290604052805190602001209050600060ff60f81b308360405180611ba00160405280611b668152602001613a7a611b669139898989604051602001610aa39392919061337b565b60408051601f1981840301815290829052610ac192916020016133b4565b60405160208183030381529060405280519060200120604051602001610b1994939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff1615610b6157604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b0316610b8a5760405163dde3cda760e01b815260040160405180910390fd5b606f54604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac90610bbc90339088906004016133e3565b600060405180830381600087803b158015610bd657600080fd5b505af1158015610bea573d6000803e3d6000fd5b50505050610bfc868686868686611bd6565b505050505050565b6060610c0f82611ca0565b610c1883611d5f565b610c2184611e17565b604051602001610c339392919061337b565b6040516020818303038152906040529050919050565b6068546000908190610100900463ffffffff16158015610c6f575063ffffffff83166001145b15610c81575063ffffffff8316610ca8565b610c95600160201b63ffffffff85166133fc565b610ca59063ffffffff8616613413565b90505b600881901c600090815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff1615610cf657604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614610d26576040516302caf51760e11b815260040160405180910390fd5b610d5a8c8c8c8c8c610d5560008e8e8e8e8e8e8e604051610d48929190613426565b6040518091039020610791565b611f68565b6001600160a01b038616610e9257606f546001600160a01b0316610e295760006001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015610db1576020820181803683370190505b50604051610dbf9190613436565b60006040518083038185875af1925050503d8060008114610dfc576040519150601f19603f3d011682016040523d82523d6000602084013e610e01565b606091505b5050905080610e2357604051630ce8f45160e31b815260040160405180910390fd5b5061117a565b606f546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990610e5b90879087906004016133e3565b600060405180830381600087803b158015610e7557600080fd5b505af1158015610e89573d6000803e3d6000fd5b5050505061117a565b606d546001600160a01b038781169116148015610ec05750606d5463ffffffff888116600160a01b90920416145b15610ed85760006001600160a01b0385168482610d87565b60685463ffffffff610100909104811690881603610f0957610f046001600160a01b03871685856120c7565b61117a565b60008787604051602001610f1e9291906132d2565b60408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b031680611116576000610f968386868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061212292505050565b6040516340c10f1960e01b81529091506001600160a01b038216906340c10f1990610fc7908a908a906004016133e3565b600060405180830381600087803b158015610fe157600080fd5b505af1158015610ff5573d6000803e3d6000fd5b5050505080606a600085815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a83888860405161110895949392919061347b565b60405180910390a150611177565b6040516340c10f1960e01b81526001600160a01b038216906340c10f199061114490899089906004016133e3565b600060405180830381600087803b15801561115e57600080fd5b505af1158015611172573d6000803e3d6000fd5b505050505b50505b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8a888887876040516111b19594939291906134b4565b60405180910390a1505050505050505050505050565b60685460ff16156111eb57604051630bc011ff60e21b815260040160405180910390fd5b6111f361219e565b60685463ffffffff610100909104811690881603611224576040516302caf51760e11b815260040160405180910390fd5b6000806060876001600160a01b03881661130a578834146112585760405163b89240f560e01b815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff16945090611285906132fc565b80601f01602080910402602001604051908101604052809291908181526020018280546112b1906132fc565b80156112fe5780601f106112d3576101008083540402835291602001916112fe565b820191906000526020600020905b8154815290600101906020018083116112e157829003601f168201915b50505050509150611596565b34156113295760405163798ee6f160e01b815260040160405180910390fd5b606f546001600160a01b03908116908916036113a457604051632770a7eb60e21b81526001600160a01b03891690639dc29fac9061136d9033908d906004016133e3565b600060405180830381600087803b15801561138757600080fd5b505af115801561139b573d6000803e3d6000fd5b50505050611596565b6001600160a01b038089166000908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b9004909216918101829052901561145c57604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac906114179033908e906004016133e3565b600060405180830381600087803b15801561143157600080fd5b505af1158015611445573d6000803e3d6000fd5b505050508060200151945080600001519350611589565b851561146e5761146e898b89896121f7565b6040516370a0823160e01b81526000906001600160a01b038b16906370a082319061149d903090600401612b9c565b602060405180830381865afa1580156114ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114de91906134e6565b90506114f56001600160a01b038b1633308e61253d565b6040516370a0823160e01b81526000906001600160a01b038c16906370a0823190611524903090600401612b9c565b602060405180830381865afa158015611541573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156591906134e6565b905061157182826134ff565b6068548c9850610100900463ffffffff169650935050505b61159289610c04565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e86886053546040516115d6989796959493929190613512565b60405180910390a16115fd6115f8600085878f8f878980519060200120610791565b612575565b861561160b5761160b611ecf565b5050505061161860018055565b50505050505050565b606c546001600160a01b0316331461164c57604051631736745960e31b815260040160405180910390fd5b610640612660565b60685460ff161561167857604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146116a8576040516302caf51760e11b815260040160405180910390fd5b6116ca8c8c8c8c8c610d5560018e8e8e8e8e8e8e604051610d48929190613426565b606f546000906001600160a01b031661178157846001600160a01b031684888a86866040516024016116ff949392919061357d565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b179052516117349190613436565b60006040518083038185875af1925050503d8060008114611771576040519150601f19603f3d011682016040523d82523d6000602084013e611776565b606091505b505080915050611883565b606f546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906117b390889088906004016133e3565b600060405180830381600087803b1580156117cd57600080fd5b505af11580156117e1573d6000803e3d6000fd5b50505050846001600160a01b031687898585604051602401611806949392919061357d565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161183b9190613436565b6000604051808303816000865af19150503d8060008114611878576040519150601f19603f3d011682016040523d82523d6000602084013e61187d565b606091505b50909150505b806118a1576040516337e391c360e01b815260040160405180910390fd5b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8b898988886040516118d89594939291906134b4565b60405180910390a150505050505050505050505050565b600054610100900460ff161580801561190f5750600054600160ff909116105b806119295750303b158015611929575060005460ff166001145b6119915760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156119b4576000805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff8a160265010000000000600160c81b03191617600160281b6001600160a01b038781169190910291909117909155606c80546001600160a01b0319168583161790558616611a3d5763ffffffff851615611a3857604051630d43a60960e11b815260040160405180910390fd5b611b0c565b606d805463ffffffff8716600160a01b026001600160c01b03199091166001600160a01b03891617179055606e611a7483826135fe565b50611aeb6000801b6012604051602001611ad791906060808252600d908201526c2bb930b83832b21022ba3432b960991b608082015260a060208201819052600490820152630ae8aa8960e31b60c082015260ff91909116604082015260e00190565b604051602081830303815290604052612122565b606f80546001600160a01b0319166001600160a01b03929092169190911790555b611b146126b8565b8015611618576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b600081611b70868686610965565b1495945050505050565b60685460ff1615611b9e57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b60685463ffffffff610100909104811690871603611c07576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051611c5b999897969594939291906136bd565b60405180910390a1611c926115f86001606860019054906101000a900463ffffffff16338a8a8a8989604051610d48929190613426565b8215610bfc57610bfc611ecf565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009182916001600160a01b03861691611ce79190613436565b600060405180830381855afa9150503d8060008114611d22576040519150601f19603f3d011682016040523d82523d6000602084013e611d27565b606091505b509150915081611d5657604051806040016040528060078152602001664e4f5f4e414d4560c81b81525061091d565b61091d816126e7565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009182916001600160a01b03861691611da69190613436565b600060405180830381855afa9150503d8060008114611de1576040519150601f19603f3d011682016040523d82523d6000602084013e611de6565b606091505b509150915081611d5657604051806040016040528060098152602001681393d7d4d6535093d360ba1b81525061091d565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b03861691611e5d9190613436565b600060405180830381855afa9150503d8060008114611e98576040519150601f19603f3d011682016040523d82523d6000602084013e611e9d565b606091505b5091509150818015611eb0575080516020145b611ebb57601261091d565b8080602001905181019061091d919061372a565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d611f1661081e565b6040518263ffffffff1660e01b8152600401611f3491815260200190565b600060405180830381600087803b158015611f4e57600080fd5b505af1158015611f62573d6000803e3d6000fd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101206312bd9b1960e11b9092526064810191909152600091600160281b90046001600160a01b03169063257b3632906084016020604051808303816000875af1158015611fe2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200691906134e6565b90508060000361202857604051622f6fad60e01b815260040160405180910390fd5b600080600160401b87161561206857869150612046848a8489611b62565b612063576040516338105f3b60e21b815260040160405180910390fd5b6120b2565b602087901c612078816001613747565b915087925061209361208b868c86610965565b8a8389611b62565b6120b0576040516338105f3b60e21b815260040160405180910390fd5b505b6120bc8282612875565b505050505050505050565b61211d8363a9059cbb60e01b84846040516024016120e69291906133e3565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261291d565b505050565b60008060405180611ba00160405280611b668152602001613a7a611b669139836040516020016121539291906133b4565b6040516020818303038152906040529050838151602083016000f591506001600160a01b038216612197576040516305f7d84960e51b815260040160405180910390fd5b5092915050565b6002600154036121f05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611988565b6002600155565b60006122066004828486613764565b61220f9161378e565b9050632afa533160e01b6001600160e01b03198216016123a357600080808080808061223e896004818d613764565b81019061224b91906137be565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161461228b5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03861630146122b45760405163750643af60e01b815260040160405180910390fd5b8a85146122d4576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e16916123529190613436565b6000604051808303816000865af19150503d806000811461238f576040519150601f19603f3d011682016040523d82523d6000602084013e612394565b606091505b505050505050505050506106fc565b6001600160e01b031981166323f2ebc360e21b146123d457604051637141605d60e11b815260040160405180910390fd5b6000808080808080806123ea8a6004818e613764565b8101906123f79190613812565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146124395760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146124625760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f16916124e99190613436565b6000604051808303816000865af19150503d8060008114612526576040519150601f19603f3d011682016040523d82523d6000602084013e61252b565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611f629085906323b872dd60e01b906084016120e6565b80600161258460206002613979565b61258e91906134ff565b605354106125af576040516377ae67b360e11b815260040160405180910390fd5b60006053600081546125c090613362565b9182905550905060005b6020811015612651578082901c6001166001036125fd5782603382602081106125f5576125f5613336565b015550505050565b6033816020811061261057612610613336565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061264990613362565b9150506125ca565b5061211d613985565b60018055565b60685460ff1661268357604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600054610100900460ff166126df5760405162461bcd60e51b81526004016119889061399b565b6106406129ef565b60606040825110612706578180602001905181019061068d91906139e6565b81516020036128425760005b602081108015612741575082818151811061272f5761272f613336565b01602001516001600160f81b03191615155b15612758578061275081613362565b915050612712565b806000036127905750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b6000816001600160401b038111156127aa576127aa612e47565b6040519080825280601f01601f1916602001820160405280156127d4576020820181803683370190505b50905060005b8281101561283a578481815181106127f4576127f4613336565b602001015160f81c60f81b82828151811061281157612811613336565b60200101906001600160f81b031916908160001a9053508061283281613362565b9150506127da565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b606854600090610100900463ffffffff16158015612899575063ffffffff82166001145b156128ab575063ffffffff82166128d2565b6128bf600160201b63ffffffff84166133fc565b6128cf9063ffffffff8516613413565b90505b600881901c60008181526069602052604081208054600160ff861690811b9182189283905592909190818316900361161857604051630c8d9eab60e31b815260040160405180910390fd5b6000612972826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612a169092919063ffffffff16565b80519091501561211d57808060200190518101906129909190613a5c565b61211d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611988565b600054610100900460ff1661265a5760405162461bcd60e51b81526004016119889061399b565b606061091d848460008585600080866001600160a01b03168587604051612a3d9190613436565b60006040518083038185875af1925050503d8060008114612a7a576040519150601f19603f3d011682016040523d82523d6000602084013e612a7f565b606091505b5091509150612a9087838387612a9b565b979650505050505050565b60608315612b0a578251600003612b03576001600160a01b0385163b612b035760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611988565b508161091d565b61091d8383815115612b1f5781518083602001fd5b8060405162461bcd60e51b81526004016119889190612ccf565b803563ffffffff8116811461287057600080fd5b6001600160a01b0381168114612b6257600080fd5b50565b60008060408385031215612b7857600080fd5b612b8183612b39565b91506020830135612b9181612b4d565b809150509250929050565b6001600160a01b0391909116815260200190565b8015158114612b6257600080fd5b60008083601f840112612bd057600080fd5b5081356001600160401b03811115612be757600080fd5b602083019150836020828501011115612bff57600080fd5b9250929050565b600080600080600060808688031215612c1e57600080fd5b612c2786612b39565b94506020860135612c3781612b4d565b93506040860135612c4781612bb0565b925060608601356001600160401b03811115612c6257600080fd5b612c6e88828901612bbe565b969995985093965092949392505050565b60005b83811015612c9a578181015183820152602001612c82565b50506000910152565b60008151808452612cbb816020860160208601612c7f565b601f01601f19169290920160200192915050565b602081526000612ce26020830184612ca3565b9392505050565b600060208284031215612cfb57600080fd5b8135612ce281612b4d565b60ff81168114612b6257600080fd5b600080600080600080600060e0888a031215612d3057600080fd5b8735612d3b81612d06565b9650612d4960208901612b39565b95506040880135612d5981612b4d565b9450612d6760608901612b39565b93506080880135612d7781612b4d565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215612da957600080fd5b612db284612b39565b92506020840135612dc281612b4d565b91506040840135612dd281612b4d565b809150509250925092565b600060208284031215612def57600080fd5b5035919050565b80610400810183101561068d57600080fd5b60008060006104408486031215612e1e57600080fd5b83359250612e2f8560208601612df6565b9150612e3e6104208501612b39565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612e8557612e85612e47565b604052919050565b60006001600160401b03821115612ea657612ea6612e47565b50601f01601f191660200190565b6000612ec7612ec284612e8d565b612e5d565b9050828152838383011115612edb57600080fd5b828260208301376000602084830101529392505050565b600082601f830112612f0357600080fd5b612ce283833560208501612eb4565b600080600080600060a08688031215612f2a57600080fd5b612f3386612b39565b94506020860135612f4381612b4d565b935060408601356001600160401b0380821115612f5f57600080fd5b612f6b89838a01612ef2565b94506060880135915080821115612f8157600080fd5b50612f8e88828901612ef2565b9250506080860135612f9f81612d06565b809150509295509295909350565b60008060008060008060a08789031215612fc657600080fd5b612fcf87612b39565b95506020870135612fdf81612b4d565b9450604087013593506060870135612ff681612bb0565b925060808701356001600160401b0381111561301157600080fd5b61301d89828a01612bbe565b979a9699509497509295939492505050565b6000806040838503121561304257600080fd5b61304b83612b39565b915061305960208401612b39565b90509250929050565b6000806000806000806000806000806000806109208d8f03121561308557600080fd5b61308f8e8e612df6565b9b5061309f8e6104008f01612df6565b9a506108008d013599506108208d013598506108408d013597506130c66108608e01612b39565b96506130d66108808e0135612b4d565b6108808d013595506130eb6108a08e01612b39565b94506130fb6108c08e0135612b4d565b6108c08d013593506108e08d013592506001600160401b036109008e0135111561312457600080fd5b6131358e6109008f01358f01612bbe565b81935080925050509295989b509295989b509295989b565b600080600080600080600060c0888a03121561316857600080fd5b61317188612b39565b9650602088013561318181612b4d565b955060408801359450606088013561319881612b4d565b935060808801356131a881612bb0565b925060a08801356001600160401b038111156131c357600080fd5b6131cf8a828b01612bbe565b989b979a50959850939692959293505050565b60008060008060008060c087890312156131fb57600080fd5b61320487612b39565b9550602087013561321481612b4d565b945061322260408801612b39565b9350606087013561323281612b4d565b9250608087013561324281612b4d565b915060a08701356001600160401b0381111561325d57600080fd5b8701601f8101891361326e57600080fd5b61327d89823560208401612eb4565b9150509295509295509295565b60008060008061046085870312156132a157600080fd5b843593506132b28660208701612df6565b92506132c16104208601612b39565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b600181811c9082168061331057607f821691505b60208210810361333057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016133745761337461334c565b5060010190565b60608152600061338e6060830186612ca3565b82810360208401526133a08186612ca3565b91505060ff83166040830152949350505050565b600083516133c6818460208801612c7f565b8351908301906133da818360208801612c7f565b01949350505050565b6001600160a01b03929092168252602082015260400190565b808202811582820484141761068d5761068d61334c565b8082018082111561068d5761068d61334c565b8183823760009101908152919050565b60008251613448818460208701612c7f565b9190910192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b63ffffffff861681526001600160a01b03858116602083015284166040820152608060608201819052600090612a909083018486613452565b94855263ffffffff9390931660208501526001600160a01b039182166040850152166060830152608082015260a00190565b6000602082840312156134f857600080fd5b5051919050565b8181038181111561068d5761068d61334c565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c0830181905260009161356484830187612ca3565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff841660208201526060604082018190526000906135ae9083018486613452565b9695505050505050565b601f82111561211d57600081815260208120601f850160051c810160208610156135df5750805b601f850160051c820191505b81811015610bfc578281556001016135eb565b81516001600160401b0381111561361757613617612e47565b61362b8161362584546132fc565b846135b8565b602080601f83116001811461366057600084156136485750858301515b600019600386901b1c1916600185901b178555610bfc565b600085815260208120601f198616915b8281101561368f57888601518255948401946001909101908401613670565b50858210156136ad5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c083018190526000916137108483018789613452565b925080851660e085015250509a9950505050505050505050565b60006020828403121561373c57600080fd5b8151612ce281612d06565b63ffffffff8181168382160190808211156121975761219761334c565b6000808585111561377457600080fd5b8386111561378157600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156137b65780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a0312156137d957600080fd5b87356137e481612b4d565b965060208801356137f481612b4d565b955060408801359450606088013593506080880135612d7781612d06565b600080600080600080600080610100898b03121561382f57600080fd5b883561383a81612b4d565b9750602089013561384a81612b4d565b96506040890135955060608901359450608089013561386881612bb0565b935060a089013561387881612d06565b979a969950949793969295929450505060c08201359160e0013590565b600181815b808511156138d05781600019048211156138b6576138b661334c565b808516156138c357918102915b93841c939080029061389a565b509250929050565b6000826138e75750600161068d565b816138f45750600061068d565b816001811461390a576002811461391457613930565b600191505061068d565b60ff8411156139255761392561334c565b50506001821b61068d565b5060208310610133831016604e8410600b8410161715613953575081810a61068d565b61395d8383613895565b80600019048211156139715761397161334c565b029392505050565b6000612ce283836138d8565b634e487b7160e01b600052600160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000602082840312156139f857600080fd5b81516001600160401b03811115613a0e57600080fd5b8201601f81018413613a1f57600080fd5b8051613a2d612ec282612e8d565b818152856020838501011115613a4257600080fd5b613a53826020830160208601612c7f565b95945050505050565b600060208284031215613a6e57600080fd5b8151612ce281612bb056fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a2646970667358221220f4e9229df3970b50b597bd5362e024183a84348b10ec25c7428ed52f5630fca964736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMEtrog.json b/compiled-contracts/paris/PolygonZkEVMEtrog.json index 78b4480ac..c92ae1f61 100644 --- a/compiled-contracts/paris/PolygonZkEVMEtrog.json +++ b/compiled-contracts/paris/PolygonZkEVMEtrog.json @@ -76,7 +76,7 @@ }, { "inputs": [], - "name": "ForceBatchesDescentralized", + "name": "ForceBatchesDecentralized", "type": "error" }, { @@ -743,19 +743,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "gapLastTimestamp", - "outputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "gasTokenAddress", @@ -1148,8 +1135,8 @@ "type": "function" } ], - "bytecode": "0x6101006040523480156200001257600080fd5b50604051620048b3380380620048b3833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e0516146f8620001bb60003960008181610517015281816109ad01528181610b1a01528181610d6d015281816112da0152818161177f01528181611bf101528181611cef015281816123780152818161244001528181612dad01528181612e2e01528181612e500152612f6801526000818161067101528181610fc701528181611ebf01528181611fc701526128d30152600081816107350152818161114e0152818161258b01526129550152600081816107670152818161084501528181611c3a0152818161255f0152612efe01526146f86000f3fe608060405234801561001057600080fd5b50600436106102e85760003560e01c80637125702211610191578063c7fffd4b116100e3578063e46761c411610097578063ecef3f9911610071578063ecef3f99146107bc578063f35dda47146107cf578063f851a440146107d757600080fd5b8063e46761c414610762578063e7a7ed0214610789578063eaeb077b146107a957600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610710578063d02103ca14610730578063d7bc90ff1461075757600080fd5b8063c7fffd4b146106f5578063c89e42df146106fd57600080fd5b80639f26f84011610145578063ada8f9191161011f578063ada8f919146106a6578063b0afe154146106b9578063c754c7ed146106c557600080fd5b80639f26f84014610659578063a3c573eb1461066c578063a652f26c1461069357600080fd5b80638c3d7301116101765780638c3d73011461062357806391cafe321461062b5780639e0018771461063e57600080fd5b806371257022146105d45780637a5460c5146105e757600080fd5b80633cbc795b1161024a57806352bdeb6d116101fe5780636b8616ce116101d85780636b8616ce146105985780636e05d2cd146105b85780636ff512cc146105c157600080fd5b806352bdeb6d1461054c578063542028d514610588578063676870d21461059057600080fd5b8063456052671161022f57806345605267146104ea57806349b7b802146105125780634e4877061461053957600080fd5b80633cbc795b1461045557806340b5de6c1461049257600080fd5b806326782247116102a15780632c111c06116102865780632c111c061461040057806332c2d153146104205780633c351e101461043557600080fd5b8063267822471461038e5780632a9f208f146103d357600080fd5b806305835f37116102d257806305835f3714610323578063107bf28c1461036c57806311e892d41461037457600080fd5b8062d0295d146102ed5780630350896314610308575b600080fd5b6102f56107fd565b6040519081526020015b60405180910390f35b610310602081565b60405161ffff90911681526020016102ff565b61035f6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102ff9190613945565b61035f61091d565b61037c60f981565b60405160ff90911681526020016102ff565b6001546103ae9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102ff565b6007546103e79067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102ff565b6008546103ae9073ffffffffffffffffffffffffffffffffffffffff1681565b61043361042e36600461399a565b6109ab565b005b6009546103ae9073ffffffffffffffffffffffffffffffffffffffff1681565b60095461047d9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102ff565b6104b97fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102ff565b6007546103e790700100000000000000000000000000000000900467ffffffffffffffff1681565b6103ae7f000000000000000000000000000000000000000000000000000000000000000081565b6104336105473660046139dc565b610a7a565b61035f6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61035f610c94565b610310601f81565b6102f56105a63660046139dc565b60066020526000908152604090205481565b6102f560055481565b6104336105cf3660046139f9565b610ca1565b6104336105e2366004613b42565b610d6b565b61035f6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610433611516565b6104336106393660046139f9565b6115e9565b6103ae73a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b610433610667366004613c3b565b611702565b6103ae7f000000000000000000000000000000000000000000000000000000000000000081565b61035f6106a1366004613c7d565b611dbe565b6104336106b43660046139f9565b6121a3565b6102f56405ca1ab1e081565b6007546103e7907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61037c60e481565b61043361070b366004613cf2565b61226d565b6002546103ae9073ffffffffffffffffffffffffffffffffffffffff1681565b6103ae7f000000000000000000000000000000000000000000000000000000000000000081565b6102f5635ca1ab1e81565b6103ae7f000000000000000000000000000000000000000000000000000000000000000081565b6007546103e79068010000000000000000900467ffffffffffffffff1681565b6104336107b7366004613d27565b612300565b6104336107ca366004613d9f565b612808565b61037c601b81565b6000546103ae9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561088c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b09190613deb565b6007549091506000906108ef9067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613e33565b67ffffffffffffffff1690508060000361090c5760009250505090565b6109168183613e5b565b9250505090565b6004805461092a90613e96565b80601f016020809104026020016040519081016040528092919081815260200182805461095690613e96565b80156109a35780601f10610978576101008083540402835291602001916109a3565b820191906000526020600020905b81548152906001019060200180831161098657829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a1a576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a6d91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ad1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b18576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba79190613ee9565b610c105760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c10576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461092a90613e96565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610cf8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c89565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610dda576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610dfa5750600054600160ff909116105b80610e145750303b158015610e14575060005460ff166001145b610ea5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610f0357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff8516156110ef57610f2a8561303d565b610f338661314d565b610f3c87613254565b604051602001610f4e93929190613f0b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af115801561100f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110339190613f44565b915091508163ffffffff166000146110ab576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff8416171790556110ec565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b60095460009061113790889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685611dbe565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111db9190613deb565b90506000808483858f6111ef600143613f7e565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611338573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135c9190613f91565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600390816113ee9190613ffc565b5060046113fb8982613ffc565b508c600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e60405161149c93929190614116565b60405180910390a1505050505050801561150d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611567576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611640576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff1661168f576040517fd40d91c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c89565b60085473ffffffffffffffffffffffffffffffffffffffff1615801590611741575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15611778576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180c9190613f91565b6118169190614155565b67ffffffffffffffff161115611858576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003611894576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156118d0576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff68010000000000000000820481169161190b918491700100000000000000000000000000000000900416614176565b1115611943576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015611beb57600086868381811061198857611988614189565b905060200281019061199a91906141b8565b6119a3906141f6565b9050836119af8161427f565b825180516020918201208185015160408087015160608801519151959a50929550600094611a1c948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114611aa5576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055611aca600188613f7e565b8403611b395742600760189054906101000a900467ffffffffffffffff168460400151611af79190614155565b67ffffffffffffffff161115611b39576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc016040516020818303038152906040528051906020012094505050508080611be3906142a6565b91505061196c565b50611c617f000000000000000000000000000000000000000000000000000000000000000084611c196107fd565b611c2391906142de565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613347565b60058190556007805467ffffffffffffffff8416700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff9091161790556040517f9a908e7300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611d3b908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af1158015611d5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7e9190613f91565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa600087604051602401611df2969594939291906142f5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff7000000000000000000000000000000000000000000000000000000001790528351909150606090600003611f435760f9601f8351611e879190614358565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611f2d9796959493929190614373565b6040516020818303038152906040529050612047565b815161ffff1015611f80576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611f8f602083614358565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016120349796959493929190614456565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156120a8573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612120576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906121669084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614539565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146121fa576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c89565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146122c4576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036122d08282613ffc565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c899190613945565b60085473ffffffffffffffffffffffffffffffffffffffff161580159061233f575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15612376576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124059190613ee9565b1561243c576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cd9190613deb565b905081811115612509576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612545576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61258773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613420565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126189190613deb565b600780549192506801000000000000000090910467ffffffffffffffff169060086126428361427f565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612679929190614595565b604051908190039020814261268f600143613f7e565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff16600090815260069093529120553233036127a2576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612801565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931823388886040516127f894939291906145a5565b60405180910390a25b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612859576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003612895576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156128d1576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561293957600080fd5b505af115801561294d573d6000803e3d6000fd5b5050505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129e29190613deb565b600754600554919250429170010000000000000000000000000000000090910467ffffffffffffffff16908160005b86811015612d135760008a8a83818110612a2d57612a2d614189565b9050602002810190612a3f91906141b8565b612a48906141f6565b8051805160209091012060408201519192509067ffffffffffffffff1615612c2d5785612a748161427f565b965050600081836020015184604001518560600151604051602001612ad79493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114612b60576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209550600660008867ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000905550612cfe565b8151516201d4c01015612c6c576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201526000609c82015260bc016040516020818303038152906040528051906020012094505b50508080612d0b906142a6565b915050612a11565b5060075467ffffffffffffffff6801000000000000000090910481169084161115612d6a576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff84811690831614612e28576000612d908386613e33565b9050612da667ffffffffffffffff821683613f7e565b9150612ddf7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611c196107fd565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b612f26337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612eb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612edd9190613deb565b612ee791906142de565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613420565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015612fc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fea9190613f91565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e7668860405161302891815260200190565b60405180910390a25050505050505050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916130bf9190614616565b600060405180830381855afa9150503d80600081146130fa576040519150601f19603f3d011682016040523d82523d6000602084013e6130ff565b606091505b509150915081613144576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525061219b565b61219b81613484565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916131cf9190614616565b600060405180830381855afa9150503d806000811461320a576040519150601f19603f3d011682016040523d82523d6000602084013e61320f565b606091505b509150915081613144576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525061219b565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8616916132d59190614616565b600060405180830381855afa9150503d8060008114613310576040519150601f19603f3d011682016040523d82523d6000602084013e613315565b606091505b5091509150818015613328575080516020145b61333357601261219b565b8080602001905181019061219b9190614628565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261341b9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261365a565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261347e9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613399565b50505050565b606060408251106134a957818060200190518101906134a3919061464b565b92915050565b81516020036136215760005b6020811080156134fc57508281815181106134d2576134d2614189565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613513578061350b816142a6565b9150506134b5565b8060000361355657505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111561357157613571613a28565b6040519080825280601f01601f19166020018201604052801561359b576020820181803683370190505b50905060005b82811015613619578481815181106135bb576135bb614189565b602001015160f81c60f81b8282815181106135d8576135d8614189565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080613611816142a6565b9150506135a1565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60006136bc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166137669092919063ffffffff16565b80519091501561341b57808060200190518101906136da9190613ee9565b61341b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610e9c565b606061219b8484600085856000808673ffffffffffffffffffffffffffffffffffffffff16858760405161379a9190614616565b60006040518083038185875af1925050503d80600081146137d7576040519150601f19603f3d011682016040523d82523d6000602084013e6137dc565b606091505b50915091506137ed878383876137f8565b979650505050505050565b6060831561388e5782516000036138875773ffffffffffffffffffffffffffffffffffffffff85163b613887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e9c565b508161219b565b61219b83838151156138a35781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9c9190613945565b60005b838110156138f25781810151838201526020016138da565b50506000910152565b600081518084526139138160208601602086016138d7565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061395860208301846138fb565b9392505050565b67ffffffffffffffff8116811461397557600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461397557600080fd5b6000806000606084860312156139af57600080fd5b83356139ba8161395f565b92506020840135915060408401356139d181613978565b809150509250925092565b6000602082840312156139ee57600080fd5b81356139588161395f565b600060208284031215613a0b57600080fd5b813561395881613978565b63ffffffff8116811461397557600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613a9e57613a9e613a28565b604052919050565b600067ffffffffffffffff821115613ac057613ac0613a28565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613afd57600080fd5b8135613b10613b0b82613aa6565b613a57565b818152846020838601011115613b2557600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613b5b57600080fd5b8635613b6681613978565b95506020870135613b7681613978565b94506040870135613b8681613a16565b93506060870135613b9681613978565b9250608087013567ffffffffffffffff80821115613bb357600080fd5b613bbf8a838b01613aec565b935060a0890135915080821115613bd557600080fd5b50613be289828a01613aec565b9150509295509295509295565b60008083601f840112613c0157600080fd5b50813567ffffffffffffffff811115613c1957600080fd5b6020830191508360208260051b8501011115613c3457600080fd5b9250929050565b60008060208385031215613c4e57600080fd5b823567ffffffffffffffff811115613c6557600080fd5b613c7185828601613bef565b90969095509350505050565b60008060008060808587031215613c9357600080fd5b8435613c9e81613a16565b93506020850135613cae81613978565b92506040850135613cbe81613a16565b9150606085013567ffffffffffffffff811115613cda57600080fd5b613ce687828801613aec565b91505092959194509250565b600060208284031215613d0457600080fd5b813567ffffffffffffffff811115613d1b57600080fd5b61219b84828501613aec565b600080600060408486031215613d3c57600080fd5b833567ffffffffffffffff80821115613d5457600080fd5b818601915086601f830112613d6857600080fd5b813581811115613d7757600080fd5b876020828501011115613d8957600080fd5b6020928301989097509590910135949350505050565b600080600060408486031215613db457600080fd5b833567ffffffffffffffff811115613dcb57600080fd5b613dd786828701613bef565b90945092505060208401356139d181613978565b600060208284031215613dfd57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613e5457613e54613e04565b5092915050565b600082613e91577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613eaa57607f821691505b602082108103613ee3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215613efb57600080fd5b8151801515811461395857600080fd5b606081526000613f1e60608301866138fb565b8281036020840152613f3081866138fb565b91505060ff83166040830152949350505050565b60008060408385031215613f5757600080fd5b8251613f6281613a16565b6020840151909250613f7381613978565b809150509250929050565b818103818111156134a3576134a3613e04565b600060208284031215613fa357600080fd5b81516139588161395f565b601f82111561341b57600081815260208120601f850160051c81016020861015613fd55750805b601f850160051c820191505b81811015613ff457828155600101613fe1565b505050505050565b815167ffffffffffffffff81111561401657614016613a28565b61402a816140248454613e96565b84613fae565b602080601f83116001811461407d57600084156140475750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613ff4565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156140ca578886015182559484019460019091019084016140ab565b508582101561410657878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60608152600061412960608301866138fb565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff818116838216019080821115613e5457613e54613e04565b808201808211156134a3576134a3613e04565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126141ec57600080fd5b9190910192915050565b60006080823603121561420857600080fd5b6040516080810167ffffffffffffffff828210818311171561422c5761422c613a28565b81604052843591508082111561424157600080fd5b5061424e36828601613aec565b8252506020830135602082015260408301356142698161395f565b6040820152606092830135928101929092525090565b600067ffffffffffffffff80831681810361429c5761429c613e04565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036142d7576142d7613e04565b5060010190565b80820281158282048414176134a3576134a3613e04565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261434c60c08301846138fb565b98975050505050505050565b61ffff818116838216019080821115613e5457613e54613e04565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b16600184015287516143dc816003860160208c016138d7565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161441f816017840160208b016138d7565b808201915050818660f81b166017820152845191506144458260188301602088016138d7565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b16600184015287516144bf816003860160208c016138d7565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614502816017840160208b016138d7565b808201915050818660f01b166017820152845191506145288260198301602088016138d7565b016019019998505050505050505050565b6000865161454b818460208b016138d7565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b600082516141ec8184602087016138d7565b60006020828403121561463a57600080fd5b815160ff8116811461395857600080fd5b60006020828403121561465d57600080fd5b815167ffffffffffffffff81111561467457600080fd5b8201601f8101841361468557600080fd5b8051614693613b0b82613aa6565b8181528560208385010111156146a857600080fd5b6146b98260208301602086016138d7565b9594505050505056fea26469706673582212205200938211fe1304792adcf2e33b90e11eec8c63d1dde801988e53543359968a64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102e85760003560e01c80637125702211610191578063c7fffd4b116100e3578063e46761c411610097578063ecef3f9911610071578063ecef3f99146107bc578063f35dda47146107cf578063f851a440146107d757600080fd5b8063e46761c414610762578063e7a7ed0214610789578063eaeb077b146107a957600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610710578063d02103ca14610730578063d7bc90ff1461075757600080fd5b8063c7fffd4b146106f5578063c89e42df146106fd57600080fd5b80639f26f84011610145578063ada8f9191161011f578063ada8f919146106a6578063b0afe154146106b9578063c754c7ed146106c557600080fd5b80639f26f84014610659578063a3c573eb1461066c578063a652f26c1461069357600080fd5b80638c3d7301116101765780638c3d73011461062357806391cafe321461062b5780639e0018771461063e57600080fd5b806371257022146105d45780637a5460c5146105e757600080fd5b80633cbc795b1161024a57806352bdeb6d116101fe5780636b8616ce116101d85780636b8616ce146105985780636e05d2cd146105b85780636ff512cc146105c157600080fd5b806352bdeb6d1461054c578063542028d514610588578063676870d21461059057600080fd5b8063456052671161022f57806345605267146104ea57806349b7b802146105125780634e4877061461053957600080fd5b80633cbc795b1461045557806340b5de6c1461049257600080fd5b806326782247116102a15780632c111c06116102865780632c111c061461040057806332c2d153146104205780633c351e101461043557600080fd5b8063267822471461038e5780632a9f208f146103d357600080fd5b806305835f37116102d257806305835f3714610323578063107bf28c1461036c57806311e892d41461037457600080fd5b8062d0295d146102ed5780630350896314610308575b600080fd5b6102f56107fd565b6040519081526020015b60405180910390f35b610310602081565b60405161ffff90911681526020016102ff565b61035f6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102ff9190613945565b61035f61091d565b61037c60f981565b60405160ff90911681526020016102ff565b6001546103ae9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102ff565b6007546103e79067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102ff565b6008546103ae9073ffffffffffffffffffffffffffffffffffffffff1681565b61043361042e36600461399a565b6109ab565b005b6009546103ae9073ffffffffffffffffffffffffffffffffffffffff1681565b60095461047d9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102ff565b6104b97fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102ff565b6007546103e790700100000000000000000000000000000000900467ffffffffffffffff1681565b6103ae7f000000000000000000000000000000000000000000000000000000000000000081565b6104336105473660046139dc565b610a7a565b61035f6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61035f610c94565b610310601f81565b6102f56105a63660046139dc565b60066020526000908152604090205481565b6102f560055481565b6104336105cf3660046139f9565b610ca1565b6104336105e2366004613b42565b610d6b565b61035f6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610433611516565b6104336106393660046139f9565b6115e9565b6103ae73a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b610433610667366004613c3b565b611702565b6103ae7f000000000000000000000000000000000000000000000000000000000000000081565b61035f6106a1366004613c7d565b611dbe565b6104336106b43660046139f9565b6121a3565b6102f56405ca1ab1e081565b6007546103e7907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61037c60e481565b61043361070b366004613cf2565b61226d565b6002546103ae9073ffffffffffffffffffffffffffffffffffffffff1681565b6103ae7f000000000000000000000000000000000000000000000000000000000000000081565b6102f5635ca1ab1e81565b6103ae7f000000000000000000000000000000000000000000000000000000000000000081565b6007546103e79068010000000000000000900467ffffffffffffffff1681565b6104336107b7366004613d27565b612300565b6104336107ca366004613d9f565b612808565b61037c601b81565b6000546103ae9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561088c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b09190613deb565b6007549091506000906108ef9067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613e33565b67ffffffffffffffff1690508060000361090c5760009250505090565b6109168183613e5b565b9250505090565b6004805461092a90613e96565b80601f016020809104026020016040519081016040528092919081815260200182805461095690613e96565b80156109a35780601f10610978576101008083540402835291602001916109a3565b820191906000526020600020905b81548152906001019060200180831161098657829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a1a576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a6d91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ad1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b18576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba79190613ee9565b610c105760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c10576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461092a90613e96565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610cf8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c89565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610dda576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610dfa5750600054600160ff909116105b80610e145750303b158015610e14575060005460ff166001145b610ea5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610f0357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff8516156110ef57610f2a8561303d565b610f338661314d565b610f3c87613254565b604051602001610f4e93929190613f0b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af115801561100f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110339190613f44565b915091508163ffffffff166000146110ab576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff8416171790556110ec565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b60095460009061113790889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685611dbe565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111db9190613deb565b90506000808483858f6111ef600143613f7e565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611338573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135c9190613f91565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600390816113ee9190613ffc565b5060046113fb8982613ffc565b508c600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e60405161149c93929190614116565b60405180910390a1505050505050801561150d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611567576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611640576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff1661168f576040517fd40d91c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c89565b60085473ffffffffffffffffffffffffffffffffffffffff1615801590611741575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15611778576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180c9190613f91565b6118169190614155565b67ffffffffffffffff161115611858576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003611894576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156118d0576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff68010000000000000000820481169161190b918491700100000000000000000000000000000000900416614176565b1115611943576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015611beb57600086868381811061198857611988614189565b905060200281019061199a91906141b8565b6119a3906141f6565b9050836119af8161427f565b825180516020918201208185015160408087015160608801519151959a50929550600094611a1c948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114611aa5576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055611aca600188613f7e565b8403611b395742600760189054906101000a900467ffffffffffffffff168460400151611af79190614155565b67ffffffffffffffff161115611b39576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc016040516020818303038152906040528051906020012094505050508080611be3906142a6565b91505061196c565b50611c617f000000000000000000000000000000000000000000000000000000000000000084611c196107fd565b611c2391906142de565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613347565b60058190556007805467ffffffffffffffff8416700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff9091161790556040517f9a908e7300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611d3b908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af1158015611d5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7e9190613f91565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa600087604051602401611df2969594939291906142f5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff7000000000000000000000000000000000000000000000000000000001790528351909150606090600003611f435760f9601f8351611e879190614358565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611f2d9796959493929190614373565b6040516020818303038152906040529050612047565b815161ffff1015611f80576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611f8f602083614358565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016120349796959493929190614456565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156120a8573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612120576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906121669084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614539565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146121fa576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c89565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146122c4576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036122d08282613ffc565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c899190613945565b60085473ffffffffffffffffffffffffffffffffffffffff161580159061233f575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15612376576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124059190613ee9565b1561243c576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cd9190613deb565b905081811115612509576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612545576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61258773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613420565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126189190613deb565b600780549192506801000000000000000090910467ffffffffffffffff169060086126428361427f565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612679929190614595565b604051908190039020814261268f600143613f7e565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff16600090815260069093529120553233036127a2576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612801565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931823388886040516127f894939291906145a5565b60405180910390a25b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612859576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003612895576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156128d1576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561293957600080fd5b505af115801561294d573d6000803e3d6000fd5b5050505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129e29190613deb565b600754600554919250429170010000000000000000000000000000000090910467ffffffffffffffff16908160005b86811015612d135760008a8a83818110612a2d57612a2d614189565b9050602002810190612a3f91906141b8565b612a48906141f6565b8051805160209091012060408201519192509067ffffffffffffffff1615612c2d5785612a748161427f565b965050600081836020015184604001518560600151604051602001612ad79493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114612b60576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209550600660008867ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000905550612cfe565b8151516201d4c01015612c6c576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201526000609c82015260bc016040516020818303038152906040528051906020012094505b50508080612d0b906142a6565b915050612a11565b5060075467ffffffffffffffff6801000000000000000090910481169084161115612d6a576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff84811690831614612e28576000612d908386613e33565b9050612da667ffffffffffffffff821683613f7e565b9150612ddf7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611c196107fd565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b612f26337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612eb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612edd9190613deb565b612ee791906142de565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613420565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015612fc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fea9190613f91565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e7668860405161302891815260200190565b60405180910390a25050505050505050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916130bf9190614616565b600060405180830381855afa9150503d80600081146130fa576040519150601f19603f3d011682016040523d82523d6000602084013e6130ff565b606091505b509150915081613144576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525061219b565b61219b81613484565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916131cf9190614616565b600060405180830381855afa9150503d806000811461320a576040519150601f19603f3d011682016040523d82523d6000602084013e61320f565b606091505b509150915081613144576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525061219b565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8616916132d59190614616565b600060405180830381855afa9150503d8060008114613310576040519150601f19603f3d011682016040523d82523d6000602084013e613315565b606091505b5091509150818015613328575080516020145b61333357601261219b565b8080602001905181019061219b9190614628565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261341b9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261365a565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261347e9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613399565b50505050565b606060408251106134a957818060200190518101906134a3919061464b565b92915050565b81516020036136215760005b6020811080156134fc57508281815181106134d2576134d2614189565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613513578061350b816142a6565b9150506134b5565b8060000361355657505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111561357157613571613a28565b6040519080825280601f01601f19166020018201604052801561359b576020820181803683370190505b50905060005b82811015613619578481815181106135bb576135bb614189565b602001015160f81c60f81b8282815181106135d8576135d8614189565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080613611816142a6565b9150506135a1565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60006136bc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166137669092919063ffffffff16565b80519091501561341b57808060200190518101906136da9190613ee9565b61341b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610e9c565b606061219b8484600085856000808673ffffffffffffffffffffffffffffffffffffffff16858760405161379a9190614616565b60006040518083038185875af1925050503d80600081146137d7576040519150601f19603f3d011682016040523d82523d6000602084013e6137dc565b606091505b50915091506137ed878383876137f8565b979650505050505050565b6060831561388e5782516000036138875773ffffffffffffffffffffffffffffffffffffffff85163b613887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e9c565b508161219b565b61219b83838151156138a35781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9c9190613945565b60005b838110156138f25781810151838201526020016138da565b50506000910152565b600081518084526139138160208601602086016138d7565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061395860208301846138fb565b9392505050565b67ffffffffffffffff8116811461397557600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461397557600080fd5b6000806000606084860312156139af57600080fd5b83356139ba8161395f565b92506020840135915060408401356139d181613978565b809150509250925092565b6000602082840312156139ee57600080fd5b81356139588161395f565b600060208284031215613a0b57600080fd5b813561395881613978565b63ffffffff8116811461397557600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613a9e57613a9e613a28565b604052919050565b600067ffffffffffffffff821115613ac057613ac0613a28565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613afd57600080fd5b8135613b10613b0b82613aa6565b613a57565b818152846020838601011115613b2557600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613b5b57600080fd5b8635613b6681613978565b95506020870135613b7681613978565b94506040870135613b8681613a16565b93506060870135613b9681613978565b9250608087013567ffffffffffffffff80821115613bb357600080fd5b613bbf8a838b01613aec565b935060a0890135915080821115613bd557600080fd5b50613be289828a01613aec565b9150509295509295509295565b60008083601f840112613c0157600080fd5b50813567ffffffffffffffff811115613c1957600080fd5b6020830191508360208260051b8501011115613c3457600080fd5b9250929050565b60008060208385031215613c4e57600080fd5b823567ffffffffffffffff811115613c6557600080fd5b613c7185828601613bef565b90969095509350505050565b60008060008060808587031215613c9357600080fd5b8435613c9e81613a16565b93506020850135613cae81613978565b92506040850135613cbe81613a16565b9150606085013567ffffffffffffffff811115613cda57600080fd5b613ce687828801613aec565b91505092959194509250565b600060208284031215613d0457600080fd5b813567ffffffffffffffff811115613d1b57600080fd5b61219b84828501613aec565b600080600060408486031215613d3c57600080fd5b833567ffffffffffffffff80821115613d5457600080fd5b818601915086601f830112613d6857600080fd5b813581811115613d7757600080fd5b876020828501011115613d8957600080fd5b6020928301989097509590910135949350505050565b600080600060408486031215613db457600080fd5b833567ffffffffffffffff811115613dcb57600080fd5b613dd786828701613bef565b90945092505060208401356139d181613978565b600060208284031215613dfd57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613e5457613e54613e04565b5092915050565b600082613e91577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613eaa57607f821691505b602082108103613ee3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215613efb57600080fd5b8151801515811461395857600080fd5b606081526000613f1e60608301866138fb565b8281036020840152613f3081866138fb565b91505060ff83166040830152949350505050565b60008060408385031215613f5757600080fd5b8251613f6281613a16565b6020840151909250613f7381613978565b809150509250929050565b818103818111156134a3576134a3613e04565b600060208284031215613fa357600080fd5b81516139588161395f565b601f82111561341b57600081815260208120601f850160051c81016020861015613fd55750805b601f850160051c820191505b81811015613ff457828155600101613fe1565b505050505050565b815167ffffffffffffffff81111561401657614016613a28565b61402a816140248454613e96565b84613fae565b602080601f83116001811461407d57600084156140475750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613ff4565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156140ca578886015182559484019460019091019084016140ab565b508582101561410657878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60608152600061412960608301866138fb565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff818116838216019080821115613e5457613e54613e04565b808201808211156134a3576134a3613e04565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126141ec57600080fd5b9190910192915050565b60006080823603121561420857600080fd5b6040516080810167ffffffffffffffff828210818311171561422c5761422c613a28565b81604052843591508082111561424157600080fd5b5061424e36828601613aec565b8252506020830135602082015260408301356142698161395f565b6040820152606092830135928101929092525090565b600067ffffffffffffffff80831681810361429c5761429c613e04565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036142d7576142d7613e04565b5060010190565b80820281158282048414176134a3576134a3613e04565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261434c60c08301846138fb565b98975050505050505050565b61ffff818116838216019080821115613e5457613e54613e04565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b16600184015287516143dc816003860160208c016138d7565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161441f816017840160208b016138d7565b808201915050818660f81b166017820152845191506144458260188301602088016138d7565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b16600184015287516144bf816003860160208c016138d7565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614502816017840160208b016138d7565b808201915050818660f01b166017820152845191506145288260198301602088016138d7565b016019019998505050505050505050565b6000865161454b818460208b016138d7565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b600082516141ec8184602087016138d7565b60006020828403121561463a57600080fd5b815160ff8116811461395857600080fd5b60006020828403121561465d57600080fd5b815167ffffffffffffffff81111561467457600080fd5b8201601f8101841361468557600080fd5b8051614693613b0b82613aa6565b8181528560208385010111156146a857600080fd5b6146b98260208301602086016138d7565b9594505050505056fea26469706673582212205200938211fe1304792adcf2e33b90e11eec8c63d1dde801988e53543359968a64736f6c63430008140033", + "bytecode": "0x6101006040523480156200001257600080fd5b506040516200432b3803806200432b833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e051614169620001c2600039600081816104f00152818161095e01528181610acb01528181610d16015281816112fe015281816117a201528181611bf901528181611cef015281816123780152818161244001528181612d6401528181612ddd01528181612dff0152612f1701526000818161064a01528181610f0f01528181610fe901528181611ec001528181611fc8015261289e015260008181610706015281816111720152818161258b01526129200152600081816107380152818161080a01528181611c420152818161255f0152612ead01526141696000f3fe608060405234801561001057600080fd5b50600436106102dd5760003560e01c80637a5460c511610186578063c7fffd4b116100e3578063e46761c411610097578063ecef3f9911610071578063ecef3f9914610781578063f35dda4714610794578063f851a4401461079c57600080fd5b8063e46761c414610733578063e7a7ed021461075a578063eaeb077b1461076e57600080fd5b8063cfa8ed47116100c8578063cfa8ed47146106e1578063d02103ca14610701578063d7bc90ff1461072857600080fd5b8063c7fffd4b146106c6578063c89e42df146106ce57600080fd5b8063a3c573eb1161013a578063ada8f9191161011f578063ada8f9191461067f578063b0afe15414610692578063c754c7ed1461069e57600080fd5b8063a3c573eb14610645578063a652f26c1461066c57600080fd5b806391cafe321161016b57806391cafe32146106045780639e001877146106175780639f26f8401461063257600080fd5b80637a5460c5146105c05780638c3d7301146105fc57600080fd5b806340b5de6c1161023f578063542028d5116101f35780636e05d2cd116101cd5780636e05d2cd146105915780636ff512cc1461059a57806371257022146105ad57600080fd5b8063542028d514610561578063676870d2146105695780636b8616ce1461057157600080fd5b806349b7b8021161022457806349b7b802146104eb5780634e4877061461051257806352bdeb6d1461052557600080fd5b806340b5de6c1461045a57806345605267146104b257600080fd5b8063267822471161029657806332c2d1531161027b57806332c2d153146103e85780633c351e10146103fd5780633cbc795b1461041d57600080fd5b806326782247146103835780632c111c06146103c857600080fd5b806305835f37116102c757806305835f3714610318578063107bf28c1461036157806311e892d41461036957600080fd5b8062d0295d146102e257806303508963146102fd575b600080fd5b6102ea6107c2565b6040519081526020015b60405180910390f35b610305602081565b60405161ffff90911681526020016102f4565b6103546040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102f49190613414565b6103546108ce565b61037160f981565b60405160ff90911681526020016102f4565b6001546103a39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102f4565b6008546103a39073ffffffffffffffffffffffffffffffffffffffff1681565b6103fb6103f6366004613469565b61095c565b005b6009546103a39073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104459074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102f4565b6104817fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102f4565b6007546104d29068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102f4565b6103a37f000000000000000000000000000000000000000000000000000000000000000081565b6103fb6105203660046134ab565b610a2b565b6103546040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610354610c3d565b610305601f81565b6102ea61057f3660046134ab565b60066020526000908152604090205481565b6102ea60055481565b6103fb6105a83660046134c8565b610c4a565b6103fb6105bb366004613611565b610d14565b6103546040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b6103fb61153a565b6103fb6106123660046134c8565b61160d565b6103a373a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103fb61064036600461370a565b611726565b6103a37f000000000000000000000000000000000000000000000000000000000000000081565b61035461067a36600461374c565b611dbf565b6103fb61068d3660046134c8565b6121a4565b6102ea6405ca1ab1e081565b6007546104d290700100000000000000000000000000000000900467ffffffffffffffff1681565b61037160e481565b6103fb6106dc3660046137c1565b61226e565b6002546103a39073ffffffffffffffffffffffffffffffffffffffff1681565b6103a37f000000000000000000000000000000000000000000000000000000000000000081565b6102ea635ca1ab1e81565b6103a37f000000000000000000000000000000000000000000000000000000000000000081565b6007546104d29067ffffffffffffffff1681565b6103fb61077c3660046137f6565b612301565b6103fb61078f36600461386e565b6127d3565b610371601b81565b6000546103a39062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610851573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087591906138ba565b6007549091506000906108a09067ffffffffffffffff68010000000000000000820481169116613902565b67ffffffffffffffff169050806000036108bd5760009250505090565b6108c7818361392a565b9250505090565b600480546108db90613965565b80601f016020809104026020016040519081016040528092919081815260200182805461090790613965565b80156109545780601f1061092957610100808354040283529160200191610954565b820191906000526020600020905b81548152906001019060200180831161093757829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109cb576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a1e91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a82576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610ac9576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5891906139b8565b610bb95760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610bb9576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546108db90613965565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ca1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c32565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610d83576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610da35750600054600160ff909116105b80610dbd5750303b158015610dbd575060005460ff166001145b610e4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610eac57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611113576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab90602401600060405180830381865afa158015610f56573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610f9c91908101906139da565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015291925060009182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d9060240160408051808303816000875af1158015611033573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110579190613a51565b915091508163ffffffff166000146110cf576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055611110565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b60095460009061115b90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685611dbf565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ff91906138ba565b90506000808483858f611213600143613a8b565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af115801561135c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113809190613aa4565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600390816114129190613b07565b50600461141f8982613b07565b508c600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e6040516114c093929190613c21565b60405180910390a1505050505050801561153157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461158b576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611664576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff166116b3576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c32565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590611764575073ffffffffffffffffffffffffffffffffffffffff81163314155b1561179b576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561180b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182f9190613aa4565b6118399190613c60565b67ffffffffffffffff16111561187b576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160008190036118b7576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156118f3576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff8082169161191b91849168010000000000000000900416613c81565b1115611953576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff169060005b83811015611bf357600087878381811061199057611990613c94565b90506020028101906119a29190613cc3565b6119ab90613d01565b9050836119b781613d8a565b825180516020918201208185015160408087015160608801519151959a50929550600094611a24948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114611aad576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055611ad2600188613a8b565b8403611b415742600760109054906101000a900467ffffffffffffffff168460400151611aff9190613c60565b67ffffffffffffffff161115611b41576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc016040516020818303038152906040528051906020012094505050508080611beb90613db1565b915050611974565b50611c697f000000000000000000000000000000000000000000000000000000000000000084611c216107c2565b611c2b9190613de9565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190612fec565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e7300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611d3b908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af1158015611d5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7e9190613aa4565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a250505050505050565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa600087604051602401611df396959493929190613e00565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff7000000000000000000000000000000000000000000000000000000001790528351909150606090600003611f445760f9601f8351611e889190613e63565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611f2e9796959493929190613e7e565b6040516020818303038152906040529050612048565b815161ffff1015611f81576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611f90602083613e63565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016120359796959493929190613f61565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156120a9573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612121576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906121679084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614044565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146121fb576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c32565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146122c5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036122d18282613b07565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c329190613414565b60085473ffffffffffffffffffffffffffffffffffffffff16801580159061233f575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612376576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240591906139b8565b1561243c576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cd91906138ba565b905082811115612509576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388841115612545576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61258773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846130c5565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125f4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061261891906138ba565b6007805491925067ffffffffffffffff90911690600061263783613d8a565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050858560405161266e9291906140a0565b6040519081900390208142612684600143613a8b565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff166000908152600690935291205532330361277c57600754604080518381523360208201526060818301819052600090820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a26127cb565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931906127c290849033908b908b906140b0565b60405180910390a25b505050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612824576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003612860576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561289c576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561290457600080fd5b505af1158015612918573d6000803e3d6000fd5b5050505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612989573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ad91906138ba565b60075460055491925042916801000000000000000090910467ffffffffffffffff16908160005b86811015612cd65760008a8a838181106129f0576129f0613c94565b9050602002810190612a029190613cc3565b612a0b90613d01565b8051805160209091012060408201519192509067ffffffffffffffff1615612bf05785612a3781613d8a565b965050600081836020015184604001518560600151604051602001612a9a9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114612b23576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209550600660008867ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000905550612cc1565b8151516201d4c01015612c2f576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201526000609c82015260bc016040516020818303038152906040528051906020012094505b50508080612cce90613db1565b9150506129d4565b5060075467ffffffffffffffff9081169084161115612d21576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff84811690831614612dd7576000612d478386613902565b9050612d5d67ffffffffffffffff821683613a8b565b9150612d967f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611c216107c2565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b612ed5337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e8c91906138ba565b612e969190613de9565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906130c5565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015612f75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f999190613aa4565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e76688604051612fd791815260200190565b60405180910390a25050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526130c09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613129565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526131239085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161303e565b50505050565b600061318b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166132359092919063ffffffff16565b8051909150156130c057808060200190518101906131a991906139b8565b6130c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610e45565b606061219c8484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516132699190614121565b60006040518083038185875af1925050503d80600081146132a6576040519150601f19603f3d011682016040523d82523d6000602084013e6132ab565b606091505b50915091506132bc878383876132c7565b979650505050505050565b6060831561335d5782516000036133565773ffffffffffffffffffffffffffffffffffffffff85163b613356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e45565b508161219c565b61219c83838151156133725781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e459190613414565b60005b838110156133c15781810151838201526020016133a9565b50506000910152565b600081518084526133e28160208601602086016133a6565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061342760208301846133ca565b9392505050565b67ffffffffffffffff8116811461344457600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461344457600080fd5b60008060006060848603121561347e57600080fd5b83356134898161342e565b92506020840135915060408401356134a081613447565b809150509250925092565b6000602082840312156134bd57600080fd5b81356134278161342e565b6000602082840312156134da57600080fd5b813561342781613447565b63ffffffff8116811461344457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561356d5761356d6134f7565b604052919050565b600067ffffffffffffffff82111561358f5761358f6134f7565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126135cc57600080fd5b81356135df6135da82613575565b613526565b8181528460208386010111156135f457600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561362a57600080fd5b863561363581613447565b9550602087013561364581613447565b94506040870135613655816134e5565b9350606087013561366581613447565b9250608087013567ffffffffffffffff8082111561368257600080fd5b61368e8a838b016135bb565b935060a08901359150808211156136a457600080fd5b506136b189828a016135bb565b9150509295509295509295565b60008083601f8401126136d057600080fd5b50813567ffffffffffffffff8111156136e857600080fd5b6020830191508360208260051b850101111561370357600080fd5b9250929050565b6000806020838503121561371d57600080fd5b823567ffffffffffffffff81111561373457600080fd5b613740858286016136be565b90969095509350505050565b6000806000806080858703121561376257600080fd5b843561376d816134e5565b9350602085013561377d81613447565b9250604085013561378d816134e5565b9150606085013567ffffffffffffffff8111156137a957600080fd5b6137b5878288016135bb565b91505092959194509250565b6000602082840312156137d357600080fd5b813567ffffffffffffffff8111156137ea57600080fd5b61219c848285016135bb565b60008060006040848603121561380b57600080fd5b833567ffffffffffffffff8082111561382357600080fd5b818601915086601f83011261383757600080fd5b81358181111561384657600080fd5b87602082850101111561385857600080fd5b6020928301989097509590910135949350505050565b60008060006040848603121561388357600080fd5b833567ffffffffffffffff81111561389a57600080fd5b6138a6868287016136be565b90945092505060208401356134a081613447565b6000602082840312156138cc57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613923576139236138d3565b5092915050565b600082613960577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061397957607f821691505b6020821081036139b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000602082840312156139ca57600080fd5b8151801515811461342757600080fd5b6000602082840312156139ec57600080fd5b815167ffffffffffffffff811115613a0357600080fd5b8201601f81018413613a1457600080fd5b8051613a226135da82613575565b818152856020838501011115613a3757600080fd5b613a488260208301602086016133a6565b95945050505050565b60008060408385031215613a6457600080fd5b8251613a6f816134e5565b6020840151909250613a8081613447565b809150509250929050565b81810381811115613a9e57613a9e6138d3565b92915050565b600060208284031215613ab657600080fd5b81516134278161342e565b601f8211156130c057600081815260208120601f850160051c81016020861015613ae85750805b601f850160051c820191505b818110156127cb57828155600101613af4565b815167ffffffffffffffff811115613b2157613b216134f7565b613b3581613b2f8454613965565b84613ac1565b602080601f831160018114613b885760008415613b525750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556127cb565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613bd557888601518255948401946001909101908401613bb6565b5085821015613c1157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081526000613c3460608301866133ca565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff818116838216019080821115613923576139236138d3565b80820180821115613a9e57613a9e6138d3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613cf757600080fd5b9190910192915050565b600060808236031215613d1357600080fd5b6040516080810167ffffffffffffffff8282108183111715613d3757613d376134f7565b816040528435915080821115613d4c57600080fd5b50613d59368286016135bb565b825250602083013560208201526040830135613d748161342e565b6040820152606092830135928101929092525090565b600067ffffffffffffffff808316818103613da757613da76138d3565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613de257613de26138d3565b5060010190565b8082028115828204841417613a9e57613a9e6138d3565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152613e5760c08301846133ca565b98975050505050505050565b61ffff818116838216019080821115613923576139236138d3565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751613ee7816003860160208c016133a6565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651613f2a816017840160208b016133a6565b808201915050818660f81b16601782015284519150613f508260188301602088016133a6565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751613fca816003860160208c016133a6565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161400d816017840160208b016133a6565b808201915050818660f01b166017820152845191506140338260198301602088016133a6565b016019019998505050505050505050565b60008651614056818460208b016133a6565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b60008251613cf78184602087016133a656fea2646970667358221220e80e7c861c249d7aa7f436abaf9c84d68839dc717ead17c9a82ad6c0b740f8f264736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102dd5760003560e01c80637a5460c511610186578063c7fffd4b116100e3578063e46761c411610097578063ecef3f9911610071578063ecef3f9914610781578063f35dda4714610794578063f851a4401461079c57600080fd5b8063e46761c414610733578063e7a7ed021461075a578063eaeb077b1461076e57600080fd5b8063cfa8ed47116100c8578063cfa8ed47146106e1578063d02103ca14610701578063d7bc90ff1461072857600080fd5b8063c7fffd4b146106c6578063c89e42df146106ce57600080fd5b8063a3c573eb1161013a578063ada8f9191161011f578063ada8f9191461067f578063b0afe15414610692578063c754c7ed1461069e57600080fd5b8063a3c573eb14610645578063a652f26c1461066c57600080fd5b806391cafe321161016b57806391cafe32146106045780639e001877146106175780639f26f8401461063257600080fd5b80637a5460c5146105c05780638c3d7301146105fc57600080fd5b806340b5de6c1161023f578063542028d5116101f35780636e05d2cd116101cd5780636e05d2cd146105915780636ff512cc1461059a57806371257022146105ad57600080fd5b8063542028d514610561578063676870d2146105695780636b8616ce1461057157600080fd5b806349b7b8021161022457806349b7b802146104eb5780634e4877061461051257806352bdeb6d1461052557600080fd5b806340b5de6c1461045a57806345605267146104b257600080fd5b8063267822471161029657806332c2d1531161027b57806332c2d153146103e85780633c351e10146103fd5780633cbc795b1461041d57600080fd5b806326782247146103835780632c111c06146103c857600080fd5b806305835f37116102c757806305835f3714610318578063107bf28c1461036157806311e892d41461036957600080fd5b8062d0295d146102e257806303508963146102fd575b600080fd5b6102ea6107c2565b6040519081526020015b60405180910390f35b610305602081565b60405161ffff90911681526020016102f4565b6103546040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102f49190613414565b6103546108ce565b61037160f981565b60405160ff90911681526020016102f4565b6001546103a39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102f4565b6008546103a39073ffffffffffffffffffffffffffffffffffffffff1681565b6103fb6103f6366004613469565b61095c565b005b6009546103a39073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104459074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102f4565b6104817fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102f4565b6007546104d29068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102f4565b6103a37f000000000000000000000000000000000000000000000000000000000000000081565b6103fb6105203660046134ab565b610a2b565b6103546040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610354610c3d565b610305601f81565b6102ea61057f3660046134ab565b60066020526000908152604090205481565b6102ea60055481565b6103fb6105a83660046134c8565b610c4a565b6103fb6105bb366004613611565b610d14565b6103546040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b6103fb61153a565b6103fb6106123660046134c8565b61160d565b6103a373a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103fb61064036600461370a565b611726565b6103a37f000000000000000000000000000000000000000000000000000000000000000081565b61035461067a36600461374c565b611dbf565b6103fb61068d3660046134c8565b6121a4565b6102ea6405ca1ab1e081565b6007546104d290700100000000000000000000000000000000900467ffffffffffffffff1681565b61037160e481565b6103fb6106dc3660046137c1565b61226e565b6002546103a39073ffffffffffffffffffffffffffffffffffffffff1681565b6103a37f000000000000000000000000000000000000000000000000000000000000000081565b6102ea635ca1ab1e81565b6103a37f000000000000000000000000000000000000000000000000000000000000000081565b6007546104d29067ffffffffffffffff1681565b6103fb61077c3660046137f6565b612301565b6103fb61078f36600461386e565b6127d3565b610371601b81565b6000546103a39062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610851573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087591906138ba565b6007549091506000906108a09067ffffffffffffffff68010000000000000000820481169116613902565b67ffffffffffffffff169050806000036108bd5760009250505090565b6108c7818361392a565b9250505090565b600480546108db90613965565b80601f016020809104026020016040519081016040528092919081815260200182805461090790613965565b80156109545780601f1061092957610100808354040283529160200191610954565b820191906000526020600020905b81548152906001019060200180831161093757829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109cb576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a1e91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a82576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610ac9576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5891906139b8565b610bb95760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610bb9576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546108db90613965565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ca1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c32565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610d83576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610da35750600054600160ff909116105b80610dbd5750303b158015610dbd575060005460ff166001145b610e4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610eac57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611113576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab90602401600060405180830381865afa158015610f56573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610f9c91908101906139da565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015291925060009182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d9060240160408051808303816000875af1158015611033573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110579190613a51565b915091508163ffffffff166000146110cf576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055611110565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b60095460009061115b90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685611dbf565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ff91906138ba565b90506000808483858f611213600143613a8b565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af115801561135c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113809190613aa4565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600390816114129190613b07565b50600461141f8982613b07565b508c600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e6040516114c093929190613c21565b60405180910390a1505050505050801561153157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461158b576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611664576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff166116b3576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c32565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590611764575073ffffffffffffffffffffffffffffffffffffffff81163314155b1561179b576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561180b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182f9190613aa4565b6118399190613c60565b67ffffffffffffffff16111561187b576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160008190036118b7576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156118f3576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff8082169161191b91849168010000000000000000900416613c81565b1115611953576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff169060005b83811015611bf357600087878381811061199057611990613c94565b90506020028101906119a29190613cc3565b6119ab90613d01565b9050836119b781613d8a565b825180516020918201208185015160408087015160608801519151959a50929550600094611a24948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114611aad576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055611ad2600188613a8b565b8403611b415742600760109054906101000a900467ffffffffffffffff168460400151611aff9190613c60565b67ffffffffffffffff161115611b41576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc016040516020818303038152906040528051906020012094505050508080611beb90613db1565b915050611974565b50611c697f000000000000000000000000000000000000000000000000000000000000000084611c216107c2565b611c2b9190613de9565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190612fec565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e7300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611d3b908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af1158015611d5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7e9190613aa4565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a250505050505050565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa600087604051602401611df396959493929190613e00565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff7000000000000000000000000000000000000000000000000000000001790528351909150606090600003611f445760f9601f8351611e889190613e63565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611f2e9796959493929190613e7e565b6040516020818303038152906040529050612048565b815161ffff1015611f81576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611f90602083613e63565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016120359796959493929190613f61565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156120a9573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612121576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906121679084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614044565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146121fb576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c32565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146122c5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036122d18282613b07565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c329190613414565b60085473ffffffffffffffffffffffffffffffffffffffff16801580159061233f575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612376576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240591906139b8565b1561243c576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cd91906138ba565b905082811115612509576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388841115612545576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61258773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846130c5565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125f4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061261891906138ba565b6007805491925067ffffffffffffffff90911690600061263783613d8a565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050858560405161266e9291906140a0565b6040519081900390208142612684600143613a8b565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff166000908152600690935291205532330361277c57600754604080518381523360208201526060818301819052600090820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a26127cb565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931906127c290849033908b908b906140b0565b60405180910390a25b505050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612824576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003612860576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561289c576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561290457600080fd5b505af1158015612918573d6000803e3d6000fd5b5050505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612989573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ad91906138ba565b60075460055491925042916801000000000000000090910467ffffffffffffffff16908160005b86811015612cd65760008a8a838181106129f0576129f0613c94565b9050602002810190612a029190613cc3565b612a0b90613d01565b8051805160209091012060408201519192509067ffffffffffffffff1615612bf05785612a3781613d8a565b965050600081836020015184604001518560600151604051602001612a9a9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114612b23576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209550600660008867ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000905550612cc1565b8151516201d4c01015612c2f576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201526000609c82015260bc016040516020818303038152906040528051906020012094505b50508080612cce90613db1565b9150506129d4565b5060075467ffffffffffffffff9081169084161115612d21576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff84811690831614612dd7576000612d478386613902565b9050612d5d67ffffffffffffffff821683613a8b565b9150612d967f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611c216107c2565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b612ed5337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e8c91906138ba565b612e969190613de9565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906130c5565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015612f75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f999190613aa4565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e76688604051612fd791815260200190565b60405180910390a25050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526130c09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613129565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526131239085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161303e565b50505050565b600061318b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166132359092919063ffffffff16565b8051909150156130c057808060200190518101906131a991906139b8565b6130c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610e45565b606061219c8484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516132699190614121565b60006040518083038185875af1925050503d80600081146132a6576040519150601f19603f3d011682016040523d82523d6000602084013e6132ab565b606091505b50915091506132bc878383876132c7565b979650505050505050565b6060831561335d5782516000036133565773ffffffffffffffffffffffffffffffffffffffff85163b613356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e45565b508161219c565b61219c83838151156133725781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e459190613414565b60005b838110156133c15781810151838201526020016133a9565b50506000910152565b600081518084526133e28160208601602086016133a6565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061342760208301846133ca565b9392505050565b67ffffffffffffffff8116811461344457600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461344457600080fd5b60008060006060848603121561347e57600080fd5b83356134898161342e565b92506020840135915060408401356134a081613447565b809150509250925092565b6000602082840312156134bd57600080fd5b81356134278161342e565b6000602082840312156134da57600080fd5b813561342781613447565b63ffffffff8116811461344457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561356d5761356d6134f7565b604052919050565b600067ffffffffffffffff82111561358f5761358f6134f7565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126135cc57600080fd5b81356135df6135da82613575565b613526565b8181528460208386010111156135f457600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561362a57600080fd5b863561363581613447565b9550602087013561364581613447565b94506040870135613655816134e5565b9350606087013561366581613447565b9250608087013567ffffffffffffffff8082111561368257600080fd5b61368e8a838b016135bb565b935060a08901359150808211156136a457600080fd5b506136b189828a016135bb565b9150509295509295509295565b60008083601f8401126136d057600080fd5b50813567ffffffffffffffff8111156136e857600080fd5b6020830191508360208260051b850101111561370357600080fd5b9250929050565b6000806020838503121561371d57600080fd5b823567ffffffffffffffff81111561373457600080fd5b613740858286016136be565b90969095509350505050565b6000806000806080858703121561376257600080fd5b843561376d816134e5565b9350602085013561377d81613447565b9250604085013561378d816134e5565b9150606085013567ffffffffffffffff8111156137a957600080fd5b6137b5878288016135bb565b91505092959194509250565b6000602082840312156137d357600080fd5b813567ffffffffffffffff8111156137ea57600080fd5b61219c848285016135bb565b60008060006040848603121561380b57600080fd5b833567ffffffffffffffff8082111561382357600080fd5b818601915086601f83011261383757600080fd5b81358181111561384657600080fd5b87602082850101111561385857600080fd5b6020928301989097509590910135949350505050565b60008060006040848603121561388357600080fd5b833567ffffffffffffffff81111561389a57600080fd5b6138a6868287016136be565b90945092505060208401356134a081613447565b6000602082840312156138cc57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613923576139236138d3565b5092915050565b600082613960577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061397957607f821691505b6020821081036139b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000602082840312156139ca57600080fd5b8151801515811461342757600080fd5b6000602082840312156139ec57600080fd5b815167ffffffffffffffff811115613a0357600080fd5b8201601f81018413613a1457600080fd5b8051613a226135da82613575565b818152856020838501011115613a3757600080fd5b613a488260208301602086016133a6565b95945050505050565b60008060408385031215613a6457600080fd5b8251613a6f816134e5565b6020840151909250613a8081613447565b809150509250929050565b81810381811115613a9e57613a9e6138d3565b92915050565b600060208284031215613ab657600080fd5b81516134278161342e565b601f8211156130c057600081815260208120601f850160051c81016020861015613ae85750805b601f850160051c820191505b818110156127cb57828155600101613af4565b815167ffffffffffffffff811115613b2157613b216134f7565b613b3581613b2f8454613965565b84613ac1565b602080601f831160018114613b885760008415613b525750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556127cb565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613bd557888601518255948401946001909101908401613bb6565b5085821015613c1157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081526000613c3460608301866133ca565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff818116838216019080821115613923576139236138d3565b80820180821115613a9e57613a9e6138d3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613cf757600080fd5b9190910192915050565b600060808236031215613d1357600080fd5b6040516080810167ffffffffffffffff8282108183111715613d3757613d376134f7565b816040528435915080821115613d4c57600080fd5b50613d59368286016135bb565b825250602083013560208201526040830135613d748161342e565b6040820152606092830135928101929092525090565b600067ffffffffffffffff808316818103613da757613da76138d3565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613de257613de26138d3565b5060010190565b8082028115828204841417613a9e57613a9e6138d3565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152613e5760c08301846133ca565b98975050505050505050565b61ffff818116838216019080821115613923576139236138d3565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751613ee7816003860160208c016133a6565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651613f2a816017840160208b016133a6565b808201915050818660f81b16601782015284519150613f508260188301602088016133a6565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751613fca816003860160208c016133a6565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161400d816017840160208b016133a6565b808201915050818660f01b166017820152845191506140338260198301602088016133a6565b016019019998505050505050505050565b60008651614056818460208b016133a6565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b60008251613cf78184602087016133a656fea2646970667358221220e80e7c861c249d7aa7f436abaf9c84d68839dc717ead17c9a82ad6c0b740f8f264736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/paris/PolygonZkEVMExistentEtrog.json b/compiled-contracts/paris/PolygonZkEVMExistentEtrog.json new file mode 100644 index 000000000..f9f7fb76b --- /dev/null +++ b/compiled-contracts/paris/PolygonZkEVMExistentEtrog.json @@ -0,0 +1,1213 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonZkEVMExistentEtrog", + "sourceName": "contracts/v2/consensus/zkEVM/PolygonZkEVMExistentEtrog.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRootV2", + "name": "_globalExitRootManager", + "type": "address" + }, + { + "internalType": "contract IERC20Upgradeable", + "name": "_pol", + "type": "address" + }, + { + "internalType": "contract IPolygonZkEVMBridgeV2", + "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": "ForceBatchesDecentralized", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchesNotAllowedOnEmergencyState", + "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": "HaltTimeoutNotExpiredAfterEmergencyState", + "type": "error" + }, + { + "inputs": [], + "name": "HugeTokenMetadataNotSupported", + "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": [ + { + "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": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "lastGlobalExitRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "sequencer", + "type": "address" + } + ], + "name": "InitialSequenceBatches", + "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" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "l1InfoRoot", + "type": "bytes32" + } + ], + "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": "address", + "name": "newForceBatchAddress", + "type": "address" + } + ], + "name": "SetForceBatchAddress", + "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": false, + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "lastGlobalExitRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "sequencer", + "type": "address" + } + ], + "name": "UpdateEtrogSequence", + "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": "GLOBAL_EXIT_ROOT_MANAGER_L2", + "outputs": [ + { + "internalType": "contract IBasePolygonZkEVMGlobalExitRoot", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_LIST_LEN_LEN", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS_EMPTY_METADATA", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_CONSTANT_BYTES", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_CONSTANT_BYTES_EMPTY_METADATA", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_DATA_LEN_EMPTY_METADATA", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_EFFECTIVE_PERCENTAGE", + "outputs": [ + { + "internalType": "bytes1", + "name": "", + "type": "bytes1" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SET_UP_ETROG_TX", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "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": "admin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "bridgeAddress", + "outputs": [ + { + "internalType": "contract IPolygonZkEVMBridgeV2", + "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": "forceBatchAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "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" + }, + { + "internalType": "bytes", + "name": "_gasTokenMetadata", + "type": "bytes" + } + ], + "name": "generateInitializeTransaction", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalExitRootManager", + "outputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRootV2", + "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": "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" + } + ], + "name": "initializeUpgrade", + "outputs": [], + "stateMutability": "nonpayable", + "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": "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": "forcedGlobalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "forcedTimestamp", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "forcedBlockHashL1", + "type": "bytes32" + } + ], + "internalType": "struct PolygonRollupBaseEtrog.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": "forcedGlobalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "forcedTimestamp", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "forcedBlockHashL1", + "type": "bytes32" + } + ], + "internalType": "struct PolygonRollupBaseEtrog.BatchData[]", + "name": "batches", + "type": "tuple[]" + } + ], + "name": "sequenceForceBatches", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newForceBatchAddress", + "type": "address" + } + ], + "name": "setForceBatchAddress", + "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": "0x6101006040523480156200001257600080fd5b5060405162004a1238038062004a12833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e05161483b620001d7600039600081816105060152818161098f01528181610afc01528181610c7d01528181610fd1015281816112df015281816118c201528181611d66015281816121bd015281816122b30152818161295801528181612a2001528181613343015281816133bc015281816133de01526134f6015260008181610673015281816114d3015281816115ad015281816124840152818161258c0152612e7d01526000818161073701528181610e450152818161173601528181612b6b0152612eff0152600081816107690152818161083b0152818161220601528181612b3f015261348c015261483b6000f3fe608060405234801561001057600080fd5b50600436106102f35760003560e01c80637a5460c511610191578063c7fffd4b116100e3578063e46761c411610097578063ecef3f9911610071578063ecef3f99146107b2578063f35dda47146107c5578063f851a440146107cd57600080fd5b8063e46761c414610764578063e7a7ed021461078b578063eaeb077b1461079f57600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610712578063d02103ca14610732578063d7bc90ff1461075957600080fd5b8063c7fffd4b146106f7578063c89e42df146106ff57600080fd5b8063a3c573eb11610145578063af7f3e021161011f578063af7f3e02146106bb578063b0afe154146106c3578063c754c7ed146106cf57600080fd5b8063a3c573eb1461066e578063a652f26c14610695578063ada8f919146106a857600080fd5b806391cafe321161017657806391cafe321461062d5780639e001877146106405780639f26f8401461065b57600080fd5b80637a5460c5146105e95780638c3d73011461062557600080fd5b8063456052671161024a5780635d6717a5116101fe5780636e05d2cd116101d85780636e05d2cd146105ba5780636ff512cc146105c357806371257022146105d657600080fd5b80635d6717a51461057f578063676870d2146105925780636b8616ce1461059a57600080fd5b80634e4877061161022f5780634e4877061461052857806352bdeb6d1461053b578063542028d51461057757600080fd5b806345605267146104c857806349b7b8021461050157600080fd5b806326782247116102ac5780633c351e10116102865780633c351e10146104135780633cbc795b1461043357806340b5de6c1461047057600080fd5b806326782247146103995780632c111c06146103de57806332c2d153146103fe57600080fd5b806305835f37116102dd57806305835f371461032e578063107bf28c1461037757806311e892d41461037f57600080fd5b8062d0295d146102f85780630350896314610313575b600080fd5b6103006107f3565b6040519081526020015b60405180910390f35b61031b602081565b60405161ffff909116815260200161030a565b61036a6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161030a91906139f3565b61036a6108ff565b61038760f981565b60405160ff909116815260200161030a565b6001546103b99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161030a565b6008546103b99073ffffffffffffffffffffffffffffffffffffffff1681565b61041161040c366004613a48565b61098d565b005b6009546103b99073ffffffffffffffffffffffffffffffffffffffff1681565b60095461045b9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161030a565b6104977fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161030a565b6007546104e89068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161030a565b6103b97f000000000000000000000000000000000000000000000000000000000000000081565b610411610536366004613a8a565b610a5c565b61036a6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61036a610c6e565b61041161058d366004613bc1565b610c7b565b61031b601f81565b6103006105a8366004613a8a565b60066020526000908152604090205481565b61030060055481565b6104116105d1366004613c52565b611213565b6104116105e4366004613c81565b6112dd565b61036a6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610411611afe565b61041161063b366004613c52565b611bd1565b6103b973a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b610411610669366004613d7a565b611cea565b6103b97f000000000000000000000000000000000000000000000000000000000000000081565b61036a6106a3366004613dbc565b612383565b6104116106b6366004613c52565b612768565b61036a612832565b6103006405ca1ab1e081565b6007546104e890700100000000000000000000000000000000900467ffffffffffffffff1681565b61038760e481565b61041161070d366004613e31565b61284e565b6002546103b99073ffffffffffffffffffffffffffffffffffffffff1681565b6103b97f000000000000000000000000000000000000000000000000000000000000000081565b610300635ca1ab1e81565b6103b97f000000000000000000000000000000000000000000000000000000000000000081565b6007546104e89067ffffffffffffffff1681565b6104116107ad366004613e66565b6128e1565b6104116107c0366004613ede565b612db2565b610387601b81565b6000546103b99062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610882573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a69190613f2a565b6007549091506000906108d19067ffffffffffffffff68010000000000000000820481169116613f72565b67ffffffffffffffff169050806000036108ee5760009250505090565b6108f88183613f9a565b9250505090565b6004805461090c90613fd5565b80601f016020809104026020016040519081016040528092919081815260200182805461093890613fd5565b80156109855780601f1061095a57610100808354040283529160200191610985565b820191906000526020600020905b81548152906001019060200180831161096857829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109fc576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a4f91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ab3576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610afa576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b899190614028565b610bea5760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610bea576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461090c90613fd5565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610cea576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610d0a5750600054600160ff909116105b80610d245750303b158015610d24575060005460ff166001145b610db5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e1357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60006040518060a00160405280606281526020016147a4606291399050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed29190613f2a565b90506000868483858d610ee660014361404a565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af115801561102f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110539190614063565b50600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8e81169190910291909117909155600280547fffffffffffffffffffffffff000000000000000000000000000000000000000016918c1691909117905560036110dc8a826140c6565b5060046110e989826140c6565b50600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8d16179055600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1672069780000000000000000000000000000000001790556040517f2bf779968f2cd549d28a94deec97630ab04362cb219c64664de7d2e21f3ccf469061119b90879085908e906141e0565b60405180910390a15050505050801561120b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461126a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c63565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461134c576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff161580801561136c5750600054600160ff909116105b806113865750303b158015611386575060005460ff166001145b611412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610dac565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561147057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff8516156116d7576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab90602401600060405180830381865afa15801561151a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611560919081019061421f565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015291925060009182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d9060240160408051808303816000875af11580156115f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161b9190614296565b915091508163ffffffff16600014611693576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff8416171790556116d4565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b60095460009061171f90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685612383565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561179f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c39190613f2a565b90506000808483858f6117d760014361404a565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611920573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119449190614063565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600390816119d691906140c6565b5060046119e389826140c6565b508c600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611a84939291906141e0565b60405180910390a15050505050508015611af557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611b4f576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611c28576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611c77576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c63565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590611d28575073ffffffffffffffffffffffffffffffffffffffff81163314155b15611d5f576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611dcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df39190614063565b611dfd91906142d0565b67ffffffffffffffff161115611e3f576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003611e7b576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611eb7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff80821691611edf918491680100000000000000009004166142f1565b1115611f17576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff169060005b838110156121b7576000878783818110611f5457611f54614304565b9050602002810190611f669190614333565b611f6f90614371565b905083611f7b816143fa565b825180516020918201208185015160408087015160608801519151959a50929550600094611fe8948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612071576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff861660009081526006602052604081205561209660018861404a565b84036121055742600760109054906101000a900467ffffffffffffffff1684604001516120c391906142d0565b67ffffffffffffffff161115612105576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120945050505080806121af90614421565b915050611f38565b5061222d7f0000000000000000000000000000000000000000000000000000000000000000846121e56107f3565b6121ef9190614459565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691906135cb565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e7300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906122ff908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af115801561231e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123429190614063565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a250505050505050565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa6000876040516024016123b796959493929190614470565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060906000036125085760f9601f835161244c91906144d3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e4876040516020016124f297969594939291906144ee565b604051602081830303815290604052905061260c565b815161ffff1015612545576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96125546020836144d3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016125f997969594939291906145d1565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa15801561266d573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166126e5576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405160009061272b9084906405ca1ab1e090635ca1ab1e90601b907fff00000000000000000000000000000000000000000000000000000000000000906020016146b4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146127bf576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c63565b6040518060a00160405280606281526020016147a46062913981565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146128a5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036128b182826140c6565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c6391906139f3565b60085473ffffffffffffffffffffffffffffffffffffffff16801580159061291f575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612956576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129e59190614028565b15612a1c576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aad9190613f2a565b905082811115612ae9576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388841115612b25576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b6773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846136a4565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf89190613f2a565b6007805491925067ffffffffffffffff909116906000612c17836143fa565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051612c4e929190614710565b6040519081900390208142612c6460014361404a565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff1660009081526006909352912055323303612d5c57600754604080518381523360208201526060818301819052600090820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a261120b565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93190612da290849033908b908b90614720565b60405180910390a2505050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612e03576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003612e3f576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612e7b576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612ee357600080fd5b505af1158015612ef7573d6000803e3d6000fd5b5050505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f8c9190613f2a565b60075460055491925042916801000000000000000090910467ffffffffffffffff16908160005b868110156132b55760008a8a83818110612fcf57612fcf614304565b9050602002810190612fe19190614333565b612fea90614371565b8051805160209091012060408201519192509067ffffffffffffffff16156131cf5785613016816143fa565b9650506000818360200151846040015185606001516040516020016130799493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114613102576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209550600660008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060009055506132a0565b8151516201d4c0101561320e576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201526000609c82015260bc016040516020818303038152906040528051906020012094505b505080806132ad90614421565b915050612fb3565b5060075467ffffffffffffffff9081169084161115613300576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff848116908316146133b65760006133268386613f72565b905061333c67ffffffffffffffff82168361404a565b91506133757f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166121e56107f3565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b6134b4337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015613447573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061346b9190613f2a565b6134759190614459565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906136a4565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015613554573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135789190614063565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e766886040516135b691815260200190565b60405180910390a25050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261369f9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613708565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526137029085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161361d565b50505050565b600061376a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166138149092919063ffffffff16565b80519091501561369f57808060200190518101906137889190614028565b61369f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610dac565b60606127608484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516138489190614791565b60006040518083038185875af1925050503d8060008114613885576040519150601f19603f3d011682016040523d82523d6000602084013e61388a565b606091505b509150915061389b878383876138a6565b979650505050505050565b6060831561393c5782516000036139355773ffffffffffffffffffffffffffffffffffffffff85163b613935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610dac565b5081612760565b61276083838151156139515781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dac91906139f3565b60005b838110156139a0578181015183820152602001613988565b50506000910152565b600081518084526139c1816020860160208601613985565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613a0660208301846139a9565b9392505050565b67ffffffffffffffff81168114613a2357600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613a2357600080fd5b600080600060608486031215613a5d57600080fd5b8335613a6881613a0d565b9250602084013591506040840135613a7f81613a26565b809150509250925092565b600060208284031215613a9c57600080fd5b8135613a0681613a0d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613b1d57613b1d613aa7565b604052919050565b600067ffffffffffffffff821115613b3f57613b3f613aa7565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613b7c57600080fd5b8135613b8f613b8a82613b25565b613ad6565b818152846020838601011115613ba457600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215613bd957600080fd5b8535613be481613a26565b94506020860135613bf481613a26565b9350604086013567ffffffffffffffff80821115613c1157600080fd5b613c1d89838a01613b6b565b94506060880135915080821115613c3357600080fd5b50613c4088828901613b6b565b95989497509295608001359392505050565b600060208284031215613c6457600080fd5b8135613a0681613a26565b63ffffffff81168114613a2357600080fd5b60008060008060008060c08789031215613c9a57600080fd5b8635613ca581613a26565b95506020870135613cb581613a26565b94506040870135613cc581613c6f565b93506060870135613cd581613a26565b9250608087013567ffffffffffffffff80821115613cf257600080fd5b613cfe8a838b01613b6b565b935060a0890135915080821115613d1457600080fd5b50613d2189828a01613b6b565b9150509295509295509295565b60008083601f840112613d4057600080fd5b50813567ffffffffffffffff811115613d5857600080fd5b6020830191508360208260051b8501011115613d7357600080fd5b9250929050565b60008060208385031215613d8d57600080fd5b823567ffffffffffffffff811115613da457600080fd5b613db085828601613d2e565b90969095509350505050565b60008060008060808587031215613dd257600080fd5b8435613ddd81613c6f565b93506020850135613ded81613a26565b92506040850135613dfd81613c6f565b9150606085013567ffffffffffffffff811115613e1957600080fd5b613e2587828801613b6b565b91505092959194509250565b600060208284031215613e4357600080fd5b813567ffffffffffffffff811115613e5a57600080fd5b61276084828501613b6b565b600080600060408486031215613e7b57600080fd5b833567ffffffffffffffff80821115613e9357600080fd5b818601915086601f830112613ea757600080fd5b813581811115613eb657600080fd5b876020828501011115613ec857600080fd5b6020928301989097509590910135949350505050565b600080600060408486031215613ef357600080fd5b833567ffffffffffffffff811115613f0a57600080fd5b613f1686828701613d2e565b9094509250506020840135613a7f81613a26565b600060208284031215613f3c57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613f9357613f93613f43565b5092915050565b600082613fd0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613fe957607f821691505b602082108103614022577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561403a57600080fd5b81518015158114613a0657600080fd5b8181038181111561405d5761405d613f43565b92915050565b60006020828403121561407557600080fd5b8151613a0681613a0d565b601f82111561369f57600081815260208120601f850160051c810160208610156140a75750805b601f850160051c820191505b8181101561120b578281556001016140b3565b815167ffffffffffffffff8111156140e0576140e0613aa7565b6140f4816140ee8454613fd5565b84614080565b602080601f83116001811461414757600084156141115750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561120b565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561419457888601518255948401946001909101908401614175565b50858210156141d057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006141f360608301866139a9565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b60006020828403121561423157600080fd5b815167ffffffffffffffff81111561424857600080fd5b8201601f8101841361425957600080fd5b8051614267613b8a82613b25565b81815285602083850101111561427c57600080fd5b61428d826020830160208601613985565b95945050505050565b600080604083850312156142a957600080fd5b82516142b481613c6f565b60208401519092506142c581613a26565b809150509250929050565b67ffffffffffffffff818116838216019080821115613f9357613f93613f43565b8082018082111561405d5761405d613f43565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261436757600080fd5b9190910192915050565b60006080823603121561438357600080fd5b6040516080810167ffffffffffffffff82821081831117156143a7576143a7613aa7565b8160405284359150808211156143bc57600080fd5b506143c936828601613b6b565b8252506020830135602082015260408301356143e481613a0d565b6040820152606092830135928101929092525090565b600067ffffffffffffffff80831681810361441757614417613f43565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361445257614452613f43565b5060010190565b808202811582820484141761405d5761405d613f43565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a08301526144c760c08301846139a9565b98975050505050505050565b61ffff818116838216019080821115613f9357613f93613f43565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614557816003860160208c01613985565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161459a816017840160208b01613985565b808201915050818660f81b166017820152845191506145c0826018830160208801613985565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b166001840152875161463a816003860160208c01613985565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161467d816017840160208b01613985565b808201915050818660f01b166017820152845191506146a3826019830160208801613985565b016019019998505050505050505050565b600086516146c6818460208b01613985565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b6000825161436781846020870161398556fedf2a8080944d5cf5032b2a844602278b01199ed191a86c93ff8080821092808000000000000000000000000000000000000000000000000000000005ca1ab1e000000000000000000000000000000000000000000000000000000005ca1ab1e01bffa2646970667358221220c39d4ceac3389b4c581957c6bbf45ee11fe3be7d77ca0382c242f7bcc834a82564736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102f35760003560e01c80637a5460c511610191578063c7fffd4b116100e3578063e46761c411610097578063ecef3f9911610071578063ecef3f99146107b2578063f35dda47146107c5578063f851a440146107cd57600080fd5b8063e46761c414610764578063e7a7ed021461078b578063eaeb077b1461079f57600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610712578063d02103ca14610732578063d7bc90ff1461075957600080fd5b8063c7fffd4b146106f7578063c89e42df146106ff57600080fd5b8063a3c573eb11610145578063af7f3e021161011f578063af7f3e02146106bb578063b0afe154146106c3578063c754c7ed146106cf57600080fd5b8063a3c573eb1461066e578063a652f26c14610695578063ada8f919146106a857600080fd5b806391cafe321161017657806391cafe321461062d5780639e001877146106405780639f26f8401461065b57600080fd5b80637a5460c5146105e95780638c3d73011461062557600080fd5b8063456052671161024a5780635d6717a5116101fe5780636e05d2cd116101d85780636e05d2cd146105ba5780636ff512cc146105c357806371257022146105d657600080fd5b80635d6717a51461057f578063676870d2146105925780636b8616ce1461059a57600080fd5b80634e4877061161022f5780634e4877061461052857806352bdeb6d1461053b578063542028d51461057757600080fd5b806345605267146104c857806349b7b8021461050157600080fd5b806326782247116102ac5780633c351e10116102865780633c351e10146104135780633cbc795b1461043357806340b5de6c1461047057600080fd5b806326782247146103995780632c111c06146103de57806332c2d153146103fe57600080fd5b806305835f37116102dd57806305835f371461032e578063107bf28c1461037757806311e892d41461037f57600080fd5b8062d0295d146102f85780630350896314610313575b600080fd5b6103006107f3565b6040519081526020015b60405180910390f35b61031b602081565b60405161ffff909116815260200161030a565b61036a6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161030a91906139f3565b61036a6108ff565b61038760f981565b60405160ff909116815260200161030a565b6001546103b99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161030a565b6008546103b99073ffffffffffffffffffffffffffffffffffffffff1681565b61041161040c366004613a48565b61098d565b005b6009546103b99073ffffffffffffffffffffffffffffffffffffffff1681565b60095461045b9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161030a565b6104977fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161030a565b6007546104e89068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161030a565b6103b97f000000000000000000000000000000000000000000000000000000000000000081565b610411610536366004613a8a565b610a5c565b61036a6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61036a610c6e565b61041161058d366004613bc1565b610c7b565b61031b601f81565b6103006105a8366004613a8a565b60066020526000908152604090205481565b61030060055481565b6104116105d1366004613c52565b611213565b6104116105e4366004613c81565b6112dd565b61036a6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610411611afe565b61041161063b366004613c52565b611bd1565b6103b973a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b610411610669366004613d7a565b611cea565b6103b97f000000000000000000000000000000000000000000000000000000000000000081565b61036a6106a3366004613dbc565b612383565b6104116106b6366004613c52565b612768565b61036a612832565b6103006405ca1ab1e081565b6007546104e890700100000000000000000000000000000000900467ffffffffffffffff1681565b61038760e481565b61041161070d366004613e31565b61284e565b6002546103b99073ffffffffffffffffffffffffffffffffffffffff1681565b6103b97f000000000000000000000000000000000000000000000000000000000000000081565b610300635ca1ab1e81565b6103b97f000000000000000000000000000000000000000000000000000000000000000081565b6007546104e89067ffffffffffffffff1681565b6104116107ad366004613e66565b6128e1565b6104116107c0366004613ede565b612db2565b610387601b81565b6000546103b99062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610882573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a69190613f2a565b6007549091506000906108d19067ffffffffffffffff68010000000000000000820481169116613f72565b67ffffffffffffffff169050806000036108ee5760009250505090565b6108f88183613f9a565b9250505090565b6004805461090c90613fd5565b80601f016020809104026020016040519081016040528092919081815260200182805461093890613fd5565b80156109855780601f1061095a57610100808354040283529160200191610985565b820191906000526020600020905b81548152906001019060200180831161096857829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109fc576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a4f91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ab3576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610afa576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b899190614028565b610bea5760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610bea576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461090c90613fd5565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610cea576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610d0a5750600054600160ff909116105b80610d245750303b158015610d24575060005460ff166001145b610db5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e1357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60006040518060a00160405280606281526020016147a4606291399050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed29190613f2a565b90506000868483858d610ee660014361404a565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af115801561102f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110539190614063565b50600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8e81169190910291909117909155600280547fffffffffffffffffffffffff000000000000000000000000000000000000000016918c1691909117905560036110dc8a826140c6565b5060046110e989826140c6565b50600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8d16179055600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1672069780000000000000000000000000000000001790556040517f2bf779968f2cd549d28a94deec97630ab04362cb219c64664de7d2e21f3ccf469061119b90879085908e906141e0565b60405180910390a15050505050801561120b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461126a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c63565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461134c576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff161580801561136c5750600054600160ff909116105b806113865750303b158015611386575060005460ff166001145b611412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610dac565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561147057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff8516156116d7576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab90602401600060405180830381865afa15801561151a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611560919081019061421f565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015291925060009182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d9060240160408051808303816000875af11580156115f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161b9190614296565b915091508163ffffffff16600014611693576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff8416171790556116d4565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b60095460009061171f90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685612383565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561179f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c39190613f2a565b90506000808483858f6117d760014361404a565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611920573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119449190614063565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600390816119d691906140c6565b5060046119e389826140c6565b508c600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611a84939291906141e0565b60405180910390a15050505050508015611af557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611b4f576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611c28576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611c77576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c63565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590611d28575073ffffffffffffffffffffffffffffffffffffffff81163314155b15611d5f576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611dcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df39190614063565b611dfd91906142d0565b67ffffffffffffffff161115611e3f576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003611e7b576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611eb7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff80821691611edf918491680100000000000000009004166142f1565b1115611f17576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff169060005b838110156121b7576000878783818110611f5457611f54614304565b9050602002810190611f669190614333565b611f6f90614371565b905083611f7b816143fa565b825180516020918201208185015160408087015160608801519151959a50929550600094611fe8948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612071576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff861660009081526006602052604081205561209660018861404a565b84036121055742600760109054906101000a900467ffffffffffffffff1684604001516120c391906142d0565b67ffffffffffffffff161115612105576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120945050505080806121af90614421565b915050611f38565b5061222d7f0000000000000000000000000000000000000000000000000000000000000000846121e56107f3565b6121ef9190614459565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691906135cb565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e7300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906122ff908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af115801561231e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123429190614063565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a250505050505050565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa6000876040516024016123b796959493929190614470565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060906000036125085760f9601f835161244c91906144d3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e4876040516020016124f297969594939291906144ee565b604051602081830303815290604052905061260c565b815161ffff1015612545576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96125546020836144d3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016125f997969594939291906145d1565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa15801561266d573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166126e5576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405160009061272b9084906405ca1ab1e090635ca1ab1e90601b907fff00000000000000000000000000000000000000000000000000000000000000906020016146b4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146127bf576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c63565b6040518060a00160405280606281526020016147a46062913981565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146128a5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036128b182826140c6565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c6391906139f3565b60085473ffffffffffffffffffffffffffffffffffffffff16801580159061291f575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612956576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129e59190614028565b15612a1c576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aad9190613f2a565b905082811115612ae9576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388841115612b25576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b6773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846136a4565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf89190613f2a565b6007805491925067ffffffffffffffff909116906000612c17836143fa565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051612c4e929190614710565b6040519081900390208142612c6460014361404a565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff1660009081526006909352912055323303612d5c57600754604080518381523360208201526060818301819052600090820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a261120b565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93190612da290849033908b908b90614720565b60405180910390a2505050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612e03576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003612e3f576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612e7b576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612ee357600080fd5b505af1158015612ef7573d6000803e3d6000fd5b5050505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f8c9190613f2a565b60075460055491925042916801000000000000000090910467ffffffffffffffff16908160005b868110156132b55760008a8a83818110612fcf57612fcf614304565b9050602002810190612fe19190614333565b612fea90614371565b8051805160209091012060408201519192509067ffffffffffffffff16156131cf5785613016816143fa565b9650506000818360200151846040015185606001516040516020016130799493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114613102576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209550600660008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060009055506132a0565b8151516201d4c0101561320e576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201526000609c82015260bc016040516020818303038152906040528051906020012094505b505080806132ad90614421565b915050612fb3565b5060075467ffffffffffffffff9081169084161115613300576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff848116908316146133b65760006133268386613f72565b905061333c67ffffffffffffffff82168361404a565b91506133757f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166121e56107f3565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b6134b4337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015613447573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061346b9190613f2a565b6134759190614459565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906136a4565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015613554573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135789190614063565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e766886040516135b691815260200190565b60405180910390a25050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261369f9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613708565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526137029085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161361d565b50505050565b600061376a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166138149092919063ffffffff16565b80519091501561369f57808060200190518101906137889190614028565b61369f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610dac565b60606127608484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516138489190614791565b60006040518083038185875af1925050503d8060008114613885576040519150601f19603f3d011682016040523d82523d6000602084013e61388a565b606091505b509150915061389b878383876138a6565b979650505050505050565b6060831561393c5782516000036139355773ffffffffffffffffffffffffffffffffffffffff85163b613935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610dac565b5081612760565b61276083838151156139515781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dac91906139f3565b60005b838110156139a0578181015183820152602001613988565b50506000910152565b600081518084526139c1816020860160208601613985565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613a0660208301846139a9565b9392505050565b67ffffffffffffffff81168114613a2357600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613a2357600080fd5b600080600060608486031215613a5d57600080fd5b8335613a6881613a0d565b9250602084013591506040840135613a7f81613a26565b809150509250925092565b600060208284031215613a9c57600080fd5b8135613a0681613a0d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613b1d57613b1d613aa7565b604052919050565b600067ffffffffffffffff821115613b3f57613b3f613aa7565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613b7c57600080fd5b8135613b8f613b8a82613b25565b613ad6565b818152846020838601011115613ba457600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215613bd957600080fd5b8535613be481613a26565b94506020860135613bf481613a26565b9350604086013567ffffffffffffffff80821115613c1157600080fd5b613c1d89838a01613b6b565b94506060880135915080821115613c3357600080fd5b50613c4088828901613b6b565b95989497509295608001359392505050565b600060208284031215613c6457600080fd5b8135613a0681613a26565b63ffffffff81168114613a2357600080fd5b60008060008060008060c08789031215613c9a57600080fd5b8635613ca581613a26565b95506020870135613cb581613a26565b94506040870135613cc581613c6f565b93506060870135613cd581613a26565b9250608087013567ffffffffffffffff80821115613cf257600080fd5b613cfe8a838b01613b6b565b935060a0890135915080821115613d1457600080fd5b50613d2189828a01613b6b565b9150509295509295509295565b60008083601f840112613d4057600080fd5b50813567ffffffffffffffff811115613d5857600080fd5b6020830191508360208260051b8501011115613d7357600080fd5b9250929050565b60008060208385031215613d8d57600080fd5b823567ffffffffffffffff811115613da457600080fd5b613db085828601613d2e565b90969095509350505050565b60008060008060808587031215613dd257600080fd5b8435613ddd81613c6f565b93506020850135613ded81613a26565b92506040850135613dfd81613c6f565b9150606085013567ffffffffffffffff811115613e1957600080fd5b613e2587828801613b6b565b91505092959194509250565b600060208284031215613e4357600080fd5b813567ffffffffffffffff811115613e5a57600080fd5b61276084828501613b6b565b600080600060408486031215613e7b57600080fd5b833567ffffffffffffffff80821115613e9357600080fd5b818601915086601f830112613ea757600080fd5b813581811115613eb657600080fd5b876020828501011115613ec857600080fd5b6020928301989097509590910135949350505050565b600080600060408486031215613ef357600080fd5b833567ffffffffffffffff811115613f0a57600080fd5b613f1686828701613d2e565b9094509250506020840135613a7f81613a26565b600060208284031215613f3c57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613f9357613f93613f43565b5092915050565b600082613fd0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613fe957607f821691505b602082108103614022577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561403a57600080fd5b81518015158114613a0657600080fd5b8181038181111561405d5761405d613f43565b92915050565b60006020828403121561407557600080fd5b8151613a0681613a0d565b601f82111561369f57600081815260208120601f850160051c810160208610156140a75750805b601f850160051c820191505b8181101561120b578281556001016140b3565b815167ffffffffffffffff8111156140e0576140e0613aa7565b6140f4816140ee8454613fd5565b84614080565b602080601f83116001811461414757600084156141115750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561120b565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561419457888601518255948401946001909101908401614175565b50858210156141d057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006141f360608301866139a9565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b60006020828403121561423157600080fd5b815167ffffffffffffffff81111561424857600080fd5b8201601f8101841361425957600080fd5b8051614267613b8a82613b25565b81815285602083850101111561427c57600080fd5b61428d826020830160208601613985565b95945050505050565b600080604083850312156142a957600080fd5b82516142b481613c6f565b60208401519092506142c581613a26565b809150509250929050565b67ffffffffffffffff818116838216019080821115613f9357613f93613f43565b8082018082111561405d5761405d613f43565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261436757600080fd5b9190910192915050565b60006080823603121561438357600080fd5b6040516080810167ffffffffffffffff82821081831117156143a7576143a7613aa7565b8160405284359150808211156143bc57600080fd5b506143c936828601613b6b565b8252506020830135602082015260408301356143e481613a0d565b6040820152606092830135928101929092525090565b600067ffffffffffffffff80831681810361441757614417613f43565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361445257614452613f43565b5060010190565b808202811582820484141761405d5761405d613f43565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a08301526144c760c08301846139a9565b98975050505050505050565b61ffff818116838216019080821115613f9357613f93613f43565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614557816003860160208c01613985565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161459a816017840160208b01613985565b808201915050818660f81b166017820152845191506145c0826018830160208801613985565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b166001840152875161463a816003860160208c01613985565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161467d816017840160208b01613985565b808201915050818660f01b166017820152845191506146a3826019830160208801613985565b016019019998505050505050505050565b600086516146c6818460208b01613985565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b6000825161436781846020870161398556fedf2a8080944d5cf5032b2a844602278b01199ed191a86c93ff8080821092808000000000000000000000000000000000000000000000000000000005ca1ab1e000000000000000000000000000000000000000000000000000000005ca1ab1e01bffa2646970667358221220c39d4ceac3389b4c581957c6bbf45ee11fe3be7d77ca0382c242f7bcc834a82564736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/paris/PolygonZkEVMV2.json b/compiled-contracts/paris/PolygonZkEVMV2.json deleted file mode 100644 index c5024afa8..000000000 --- a/compiled-contracts/paris/PolygonZkEVMV2.json +++ /dev/null @@ -1,1144 +0,0 @@ -{ - "_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 IPolygonZkEVMBridgeV2", - "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": "ForceBatchesDescentralized", - "type": "error" - }, - { - "inputs": [], - "name": "ForceBatchesNotAllowedOnEmergencyState", - "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": "HaltTimeoutNotExpiredAfterEmergencyState", - "type": "error" - }, - { - "inputs": [], - "name": "HugeTokenMetadataNotSupported", - "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": [ - { - "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": "bytes", - "name": "transactions", - "type": "bytes" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "lastGlobalExitRoot", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "address", - "name": "sequencer", - "type": "address" - } - ], - "name": "InitialSequenceBatches", - "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": "address", - "name": "newForceBatchAddress", - "type": "address" - } - ], - "name": "SetForceBatchAddress", - "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": "GLOBAL_EXIT_ROOT_MANAGER_L2", - "outputs": [ - { - "internalType": "contract IBasePolygonZkEVMGlobalExitRoot", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INITIALIZE_TX_BRIDGE_LIST_LEN_LEN", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INITIALIZE_TX_BRIDGE_PARAMS", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS_EMPTY_METADATA", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INITIALIZE_TX_CONSTANT_BYTES", - "outputs": [ - { - "internalType": "uint16", - "name": "", - "type": "uint16" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INITIALIZE_TX_CONSTANT_BYTES_EMPTY_METADATA", - "outputs": [ - { - "internalType": "uint16", - "name": "", - "type": "uint16" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INITIALIZE_TX_DATA_LEN_EMPTY_METADATA", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "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": "admin", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "bridgeAddress", - "outputs": [ - { - "internalType": "contract IPolygonZkEVMBridgeV2", - "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": "forceBatchAddress", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "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" - }, - { - "internalType": "bytes", - "name": "_gasTokenMetadata", - "type": "bytes" - } - ], - "name": "generateInitializeTransaction", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "view", - "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": "string", - "name": "sequencerURL", - "type": "string" - }, - { - "internalType": "string", - "name": "_networkName", - "type": "string" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "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": "address", - "name": "newForceBatchAddress", - "type": "address" - } - ], - "name": "setForceBatchAddress", - "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": "0x6101006040523480156200001257600080fd5b50604051620049eb380380620049eb833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e051614830620001bb60003960008181610517015281816109ad01528181610b1a015281816112710152818161133a0152818161135c015281816114f30152818161168601528181611c11015281816125f801528181612a5101528181612b1f01528181612c440152612d0c01526000818161067101528181611434015281816118e00152818161213a015261224201526000818161073501528181610f9401528181611a670152612e5701526000818161077a01528181610845015281816112c40152818161140a0152612e2b01526148306000f3fe608060405234801561001057600080fd5b50600436106102e85760003560e01c80636ff512cc11610191578063c7fffd4b116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b146107bc578063f35dda47146107cf578063f851a440146107d757600080fd5b8063d8d1091b14610762578063e46761c414610775578063e7a7ed021461079c57600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610710578063d02103ca14610730578063d7bc90ff1461075757600080fd5b8063c7fffd4b146106f5578063c89e42df146106fd57600080fd5b80639e00187711610145578063ada8f9191161011f578063ada8f919146106a6578063b0afe154146106b9578063c754c7ed146106c557600080fd5b80639e00187714610651578063a3c573eb1461066c578063a652f26c1461069357600080fd5b80637a5460c5116101765780637a5460c5146105fa5780638c3d73011461063657806391cafe321461063e57600080fd5b80636ff512cc146105d457806371257022146105e757600080fd5b80633cbc795b1161024a57806352bdeb6d116101fe578063676870d2116101d8578063676870d2146105a35780636b8616ce146105ab5780636e05d2cd146105cb57600080fd5b806352bdeb6d1461054c578063542028d5146105885780635e9145c91461059057600080fd5b8063456052671161022f57806345605267146104ea57806349b7b802146105125780634e4877061461053957600080fd5b80633cbc795b1461045557806340b5de6c1461049257600080fd5b806319d8ac61116102a15780632c111c06116102865780632c111c061461040057806332c2d153146104205780633c351e101461043557600080fd5b806319d8ac611461038e57806326782247146103bb57600080fd5b806305835f37116102d257806305835f3714610323578063107bf28c1461036c57806311e892d41461037457600080fd5b8062d0295d146102ed5780630350896314610308575b600080fd5b6102f56107fd565b6040519081526020015b60405180910390f35b610310602081565b60405161ffff90911681526020016102ff565b61035f6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102ff91906139c3565b61035f61091d565b61037c60f981565b60405160ff90911681526020016102ff565b6007546103a29067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102ff565b6001546103db9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102ff565b6008546103db9073ffffffffffffffffffffffffffffffffffffffff1681565b61043361042e366004613a18565b6109ab565b005b6009546103db9073ffffffffffffffffffffffffffffffffffffffff1681565b60095461047d9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102ff565b6104b97fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102ff565b6007546103a290700100000000000000000000000000000000900467ffffffffffffffff1681565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b610433610547366004613a5a565b610a7a565b61035f6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61035f610c94565b61043361059e366004613ac3565b610ca1565b610310601f81565b6102f56105b9366004613a5a565b60066020526000908152604090205481565b6102f560055481565b6104336105e2366004613b0f565b6115ba565b6104336105f5366004613c58565b611684565b61035f6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610433611e4d565b61043361064c366004613b0f565b611f20565b6103db73a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b61035f6106a1366004613d05565b612039565b6104336106b4366004613b0f565b61241e565b6102f56405ca1ab1e081565b6007546103a2907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61037c60e481565b61043361070b366004613d7a565b6124e8565b6002546103db9073ffffffffffffffffffffffffffffffffffffffff1681565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6102f5635ca1ab1e81565b610433610770366004613daf565b61257b565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6007546103a29068010000000000000000900467ffffffffffffffff1681565b6104336107ca366004613df1565b612bcc565b61037c601b81565b6000546103db9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561088c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b09190613e69565b6007549091506000906108ef9067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613eb1565b67ffffffffffffffff1690508060000361090c5760009250505090565b6109168183613ed9565b9250505090565b6004805461092a90613f14565b80601f016020809104026020016040519081016040528092919081815260200182805461095690613f14565b80156109a35780601f10610978576101008083540402835291602001916109a3565b820191906000526020600020905b81548152906001019060200180831161098657829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a1a576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a6d91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ad1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b18576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba79190613f67565b610c105760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c10576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461092a90613f14565b60025473ffffffffffffffffffffffffffffffffffffffff163314610cf2576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003610d2e576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610d6a576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156111a6576000898983818110610db357610db3613f89565b9050602002810190610dc59190613fb8565b610dce90613ff6565b8051805160209091012060608201519192509067ffffffffffffffff1615610f515785610dfa81614087565b96505060008183602001518460600151604051602001610e5293929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114610edb576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015610f31576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff861660009081526006602052604081205561108e565b602082015115801590611018575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015610ff2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110169190613e69565b155b1561104f576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c0101561108e576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806110c1575042826040015167ffffffffffffffff16115b156110f8576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061119e906140ae565b915050610d97565b5060075467ffffffffffffffff68010000000000000000909104811690841611156111fd576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146113345760006112548386613eb1565b905061126a67ffffffffffffffff8216836140e6565b91506112eb7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166112a36107fd565b6112ad91906140f9565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691906130bb565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611432337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e99190613e69565b6113f391906140f9565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613194565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561149a57600080fd5b505af11580156114ae573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af1158015611552573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115769190614110565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611611576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c89565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146116f3576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156117135750600054600160ff909116105b8061172d5750303b15801561172d575060005460ff166001145b6117be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561181c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611a0857611843856131f8565b61184c86613308565b6118558761340f565b6040516020016118679392919061412d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611928573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194c9190614166565b915091508163ffffffff166000146119c4576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055611a05565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b600954600090611a5090889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685612039565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ad0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af49190613e69565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611c6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c939190614110565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611d2591906141ee565b506004611d3289826141ee565b508c600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611dd393929190614308565b60405180910390a15050505050508015611e4457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611e9e576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611f77576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611fc6576040517fd40d91c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c89565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa60008760405160240161206d96959493929190614347565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060906000036121be5760f9601f835161210291906143aa565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e4876040516020016121a897969594939291906143c5565b60405160208183030381529060405290506122c2565b815161ffff10156121fb576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f961220a6020836143aa565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016122af97969594939291906144a8565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015612323573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661239b576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906123e19084906405ca1ab1e090635ca1ab1e90601b907fff000000000000000000000000000000000000000000000000000000000000009060200161458b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612475576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c89565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461253f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361254b82826141ee565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c8991906139c3565b60085473ffffffffffffffffffffffffffffffffffffffff16158015906125ba575060085473ffffffffffffffffffffffffffffffffffffffff163314155b156125f1576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612661573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126859190614110565b61268f91906145e7565b67ffffffffffffffff1611156126d1576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081900361270d576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612749576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612784918491700100000000000000000000000000000000900416614608565b11156127bc576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015612a4b57600086868381811061280157612801613f89565b9050602002810190612813919061461b565b61281c9061464f565b90508361282881614087565b8251805160209182012081850151604080870151905194995091945060009361288a9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612913576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86166000908152600660205260408120556129386001886140e6565b84036129a75742600760189054906101000a900467ffffffffffffffff16846040015161296591906145e7565b67ffffffffffffffff1611156129a7576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080612a43906140ae565b9150506127e5565b50612a797f0000000000000000000000000000000000000000000000000000000000000000846112a36107fd565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612b68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b8c9190614110565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085473ffffffffffffffffffffffffffffffffffffffff1615801590612c0b575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15612c42576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd19190613f67565b15612d08576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d999190613e69565b905081811115612dd5576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612e11576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e5373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613194565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ec0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ee49190613e69565b600780549192506801000000000000000090910467ffffffffffffffff16906008612f0e83614087565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612f459291906146cd565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303613055576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26130b4565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931823388886040516130ab94939291906146dd565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261318f9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613502565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526131f29085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161310d565b50505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161327a919061474e565b600060405180830381855afa9150503d80600081146132b5576040519150601f19603f3d011682016040523d82523d6000602084013e6132ba565b606091505b5091509150816132ff576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250612416565b6124168161360e565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161338a919061474e565b600060405180830381855afa9150503d80600081146133c5576040519150601f19603f3d011682016040523d82523d6000602084013e6133ca565b606091505b5091509150816132ff576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250612416565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff861691613490919061474e565b600060405180830381855afa9150503d80600081146134cb576040519150601f19603f3d011682016040523d82523d6000602084013e6134d0565b606091505b50915091508180156134e3575080516020145b6134ee576012612416565b808060200190518101906124169190614760565b6000613564826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166137e49092919063ffffffff16565b80519091501561318f57808060200190518101906135829190613f67565b61318f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016117b5565b60606040825110613633578180602001905181019061362d9190614783565b92915050565b81516020036137ab5760005b602081108015613686575082818151811061365c5761365c613f89565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1561369d5780613695816140ae565b91505061363f565b806000036136e057505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff8111156136fb576136fb613b3e565b6040519080825280601f01601f191660200182016040528015613725576020820181803683370190505b50905060005b828110156137a35784818151811061374557613745613f89565b602001015160f81c60f81b82828151811061376257613762613f89565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061379b816140ae565b91505061372b565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60606124168484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051613818919061474e565b60006040518083038185875af1925050503d8060008114613855576040519150601f19603f3d011682016040523d82523d6000602084013e61385a565b606091505b509150915061386b87838387613876565b979650505050505050565b6060831561390c5782516000036139055773ffffffffffffffffffffffffffffffffffffffff85163b613905576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016117b5565b5081612416565b61241683838151156139215781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b591906139c3565b60005b83811015613970578181015183820152602001613958565b50506000910152565b60008151808452613991816020860160208601613955565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006139d66020830184613979565b9392505050565b67ffffffffffffffff811681146139f357600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff811681146139f357600080fd5b600080600060608486031215613a2d57600080fd5b8335613a38816139dd565b9250602084013591506040840135613a4f816139f6565b809150509250925092565b600060208284031215613a6c57600080fd5b81356139d6816139dd565b60008083601f840112613a8957600080fd5b50813567ffffffffffffffff811115613aa157600080fd5b6020830191508360208260051b8501011115613abc57600080fd5b9250929050565b600080600060408486031215613ad857600080fd5b833567ffffffffffffffff811115613aef57600080fd5b613afb86828701613a77565b9094509250506020840135613a4f816139f6565b600060208284031215613b2157600080fd5b81356139d6816139f6565b63ffffffff811681146139f357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613bb457613bb4613b3e565b604052919050565b600067ffffffffffffffff821115613bd657613bd6613b3e565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613c1357600080fd5b8135613c26613c2182613bbc565b613b6d565b818152846020838601011115613c3b57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613c7157600080fd5b8635613c7c816139f6565b95506020870135613c8c816139f6565b94506040870135613c9c81613b2c565b93506060870135613cac816139f6565b9250608087013567ffffffffffffffff80821115613cc957600080fd5b613cd58a838b01613c02565b935060a0890135915080821115613ceb57600080fd5b50613cf889828a01613c02565b9150509295509295509295565b60008060008060808587031215613d1b57600080fd5b8435613d2681613b2c565b93506020850135613d36816139f6565b92506040850135613d4681613b2c565b9150606085013567ffffffffffffffff811115613d6257600080fd5b613d6e87828801613c02565b91505092959194509250565b600060208284031215613d8c57600080fd5b813567ffffffffffffffff811115613da357600080fd5b61241684828501613c02565b60008060208385031215613dc257600080fd5b823567ffffffffffffffff811115613dd957600080fd5b613de585828601613a77565b90969095509350505050565b600080600060408486031215613e0657600080fd5b833567ffffffffffffffff80821115613e1e57600080fd5b818601915086601f830112613e3257600080fd5b813581811115613e4157600080fd5b876020828501011115613e5357600080fd5b6020928301989097509590910135949350505050565b600060208284031215613e7b57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613ed257613ed2613e82565b5092915050565b600082613f0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613f2857607f821691505b602082108103613f61577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215613f7957600080fd5b815180151581146139d657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613fec57600080fd5b9190910192915050565b60006080823603121561400857600080fd5b6040516080810167ffffffffffffffff828210818311171561402c5761402c613b3e565b81604052843591508082111561404157600080fd5b5061404e36828601613c02565b825250602083013560208201526040830135614069816139dd565b6040820152606083013561407c816139dd565b606082015292915050565b600067ffffffffffffffff8083168181036140a4576140a4613e82565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036140df576140df613e82565b5060010190565b8181038181111561362d5761362d613e82565b808202811582820484141761362d5761362d613e82565b60006020828403121561412257600080fd5b81516139d6816139dd565b6060815260006141406060830186613979565b82810360208401526141528186613979565b91505060ff83166040830152949350505050565b6000806040838503121561417957600080fd5b825161418481613b2c565b6020840151909250614195816139f6565b809150509250929050565b601f82111561318f57600081815260208120601f850160051c810160208610156141c75750805b601f850160051c820191505b818110156141e6578281556001016141d3565b505050505050565b815167ffffffffffffffff81111561420857614208613b3e565b61421c816142168454613f14565b846141a0565b602080601f83116001811461426f57600084156142395750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556141e6565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156142bc5788860151825594840194600190910190840161429d565b50858210156142f857878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60608152600061431b6060830186613979565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261439e60c0830184613979565b98975050505050505050565b61ffff818116838216019080821115613ed257613ed2613e82565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b166001840152875161442e816003860160208c01613955565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614471816017840160208b01613955565b808201915050818660f81b16601782015284519150614497826018830160208801613955565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614511816003860160208c01613955565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614554816017840160208b01613955565b808201915050818660f01b1660178201528451915061457a826019830160208801613955565b016019019998505050505050505050565b6000865161459d818460208b01613955565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b67ffffffffffffffff818116838216019080821115613ed257613ed2613e82565b8082018082111561362d5761362d613e82565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112613fec57600080fd5b60006060823603121561466157600080fd5b6040516060810167ffffffffffffffff828210818311171561468557614685613b3e565b81604052843591508082111561469a57600080fd5b506146a736828601613c02565b8252506020830135602082015260408301356146c2816139dd565b604082015292915050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b60008251613fec818460208701613955565b60006020828403121561477257600080fd5b815160ff811681146139d657600080fd5b60006020828403121561479557600080fd5b815167ffffffffffffffff8111156147ac57600080fd5b8201601f810184136147bd57600080fd5b80516147cb613c2182613bbc565b8181528560208385010111156147e057600080fd5b6147f1826020830160208601613955565b9594505050505056fea264697066735822122054d17ab62a9c80223317103957a799f93d742c7a9fb607c4af5b2f022a2d816e64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102e85760003560e01c80636ff512cc11610191578063c7fffd4b116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b146107bc578063f35dda47146107cf578063f851a440146107d757600080fd5b8063d8d1091b14610762578063e46761c414610775578063e7a7ed021461079c57600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610710578063d02103ca14610730578063d7bc90ff1461075757600080fd5b8063c7fffd4b146106f5578063c89e42df146106fd57600080fd5b80639e00187711610145578063ada8f9191161011f578063ada8f919146106a6578063b0afe154146106b9578063c754c7ed146106c557600080fd5b80639e00187714610651578063a3c573eb1461066c578063a652f26c1461069357600080fd5b80637a5460c5116101765780637a5460c5146105fa5780638c3d73011461063657806391cafe321461063e57600080fd5b80636ff512cc146105d457806371257022146105e757600080fd5b80633cbc795b1161024a57806352bdeb6d116101fe578063676870d2116101d8578063676870d2146105a35780636b8616ce146105ab5780636e05d2cd146105cb57600080fd5b806352bdeb6d1461054c578063542028d5146105885780635e9145c91461059057600080fd5b8063456052671161022f57806345605267146104ea57806349b7b802146105125780634e4877061461053957600080fd5b80633cbc795b1461045557806340b5de6c1461049257600080fd5b806319d8ac61116102a15780632c111c06116102865780632c111c061461040057806332c2d153146104205780633c351e101461043557600080fd5b806319d8ac611461038e57806326782247146103bb57600080fd5b806305835f37116102d257806305835f3714610323578063107bf28c1461036c57806311e892d41461037457600080fd5b8062d0295d146102ed5780630350896314610308575b600080fd5b6102f56107fd565b6040519081526020015b60405180910390f35b610310602081565b60405161ffff90911681526020016102ff565b61035f6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102ff91906139c3565b61035f61091d565b61037c60f981565b60405160ff90911681526020016102ff565b6007546103a29067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102ff565b6001546103db9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102ff565b6008546103db9073ffffffffffffffffffffffffffffffffffffffff1681565b61043361042e366004613a18565b6109ab565b005b6009546103db9073ffffffffffffffffffffffffffffffffffffffff1681565b60095461047d9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102ff565b6104b97fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102ff565b6007546103a290700100000000000000000000000000000000900467ffffffffffffffff1681565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b610433610547366004613a5a565b610a7a565b61035f6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61035f610c94565b61043361059e366004613ac3565b610ca1565b610310601f81565b6102f56105b9366004613a5a565b60066020526000908152604090205481565b6102f560055481565b6104336105e2366004613b0f565b6115ba565b6104336105f5366004613c58565b611684565b61035f6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610433611e4d565b61043361064c366004613b0f565b611f20565b6103db73a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b61035f6106a1366004613d05565b612039565b6104336106b4366004613b0f565b61241e565b6102f56405ca1ab1e081565b6007546103a2907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61037c60e481565b61043361070b366004613d7a565b6124e8565b6002546103db9073ffffffffffffffffffffffffffffffffffffffff1681565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6102f5635ca1ab1e81565b610433610770366004613daf565b61257b565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6007546103a29068010000000000000000900467ffffffffffffffff1681565b6104336107ca366004613df1565b612bcc565b61037c601b81565b6000546103db9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561088c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b09190613e69565b6007549091506000906108ef9067ffffffffffffffff700100000000000000000000000000000000820481169168010000000000000000900416613eb1565b67ffffffffffffffff1690508060000361090c5760009250505090565b6109168183613ed9565b9250505090565b6004805461092a90613f14565b80601f016020809104026020016040519081016040528092919081815260200182805461095690613f14565b80156109a35780601f10610978576101008083540402835291602001916109a3565b820191906000526020600020905b81548152906001019060200180831161098657829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a1a576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a6d91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ad1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b18576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba79190613f67565b610c105760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c10576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461092a90613f14565b60025473ffffffffffffffffffffffffffffffffffffffff163314610cf2576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003610d2e576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610d6a576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156111a6576000898983818110610db357610db3613f89565b9050602002810190610dc59190613fb8565b610dce90613ff6565b8051805160209091012060608201519192509067ffffffffffffffff1615610f515785610dfa81614087565b96505060008183602001518460600151604051602001610e5293929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114610edb576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015610f31576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff861660009081526006602052604081205561108e565b602082015115801590611018575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015610ff2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110169190613e69565b155b1561104f576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c0101561108e576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806110c1575042826040015167ffffffffffffffff16115b156110f8576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450816040015196505050808061119e906140ae565b915050610d97565b5060075467ffffffffffffffff68010000000000000000909104811690841611156111fd576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169190911790915560058390558590828116908516146113345760006112548386613eb1565b905061126a67ffffffffffffffff8216836140e6565b91506112eb7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166112a36107fd565b6112ad91906140f9565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691906130bb565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611432337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e99190613e69565b6113f391906140f9565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613194565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561149a57600080fd5b505af11580156114ae573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af1158015611552573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115769190614110565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611611576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c89565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146116f3576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156117135750600054600160ff909116105b8061172d5750303b15801561172d575060005460ff166001145b6117be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561181c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611a0857611843856131f8565b61184c86613308565b6118558761340f565b6040516020016118679392919061412d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611928573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194c9190614166565b915091508163ffffffff166000146119c4576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055611a05565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b600954600090611a5090889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685612039565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ad0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af49190613e69565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611c6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c939190614110565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611d2591906141ee565b506004611d3289826141ee565b508c600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611dd393929190614308565b60405180910390a15050505050508015611e4457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611e9e576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611f77576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611fc6576040517fd40d91c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c89565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa60008760405160240161206d96959493929190614347565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060906000036121be5760f9601f835161210291906143aa565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e4876040516020016121a897969594939291906143c5565b60405160208183030381529060405290506122c2565b815161ffff10156121fb576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f961220a6020836143aa565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016122af97969594939291906144a8565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015612323573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661239b576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906123e19084906405ca1ab1e090635ca1ab1e90601b907fff000000000000000000000000000000000000000000000000000000000000009060200161458b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612475576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c89565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461253f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361254b82826141ee565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c8991906139c3565b60085473ffffffffffffffffffffffffffffffffffffffff16158015906125ba575060085473ffffffffffffffffffffffffffffffffffffffff163314155b156125f1576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612661573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126859190614110565b61268f91906145e7565b67ffffffffffffffff1611156126d1576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081900361270d576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612749576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612784918491700100000000000000000000000000000000900416614608565b11156127bc576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015612a4b57600086868381811061280157612801613f89565b9050602002810190612813919061461b565b61281c9061464f565b90508361282881614087565b8251805160209182012081850151604080870151905194995091945060009361288a9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612913576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86166000908152600660205260408120556129386001886140e6565b84036129a75742600760189054906101000a900467ffffffffffffffff16846040015161296591906145e7565b67ffffffffffffffff1611156129a7576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080612a43906140ae565b9150506127e5565b50612a797f0000000000000000000000000000000000000000000000000000000000000000846112a36107fd565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612b68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b8c9190614110565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085473ffffffffffffffffffffffffffffffffffffffff1615801590612c0b575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15612c42576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd19190613f67565b15612d08576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d999190613e69565b905081811115612dd5576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612e11576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e5373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613194565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ec0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ee49190613e69565b600780549192506801000000000000000090910467ffffffffffffffff16906008612f0e83614087565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612f459291906146cd565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303613055576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26130b4565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931823388886040516130ab94939291906146dd565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261318f9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613502565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526131f29085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161310d565b50505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161327a919061474e565b600060405180830381855afa9150503d80600081146132b5576040519150601f19603f3d011682016040523d82523d6000602084013e6132ba565b606091505b5091509150816132ff576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250612416565b6124168161360e565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169161338a919061474e565b600060405180830381855afa9150503d80600081146133c5576040519150601f19603f3d011682016040523d82523d6000602084013e6133ca565b606091505b5091509150816132ff576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250612416565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff861691613490919061474e565b600060405180830381855afa9150503d80600081146134cb576040519150601f19603f3d011682016040523d82523d6000602084013e6134d0565b606091505b50915091508180156134e3575080516020145b6134ee576012612416565b808060200190518101906124169190614760565b6000613564826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166137e49092919063ffffffff16565b80519091501561318f57808060200190518101906135829190613f67565b61318f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016117b5565b60606040825110613633578180602001905181019061362d9190614783565b92915050565b81516020036137ab5760005b602081108015613686575082818151811061365c5761365c613f89565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1561369d5780613695816140ae565b91505061363f565b806000036136e057505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff8111156136fb576136fb613b3e565b6040519080825280601f01601f191660200182016040528015613725576020820181803683370190505b50905060005b828110156137a35784818151811061374557613745613f89565b602001015160f81c60f81b82828151811061376257613762613f89565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061379b816140ae565b91505061372b565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60606124168484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051613818919061474e565b60006040518083038185875af1925050503d8060008114613855576040519150601f19603f3d011682016040523d82523d6000602084013e61385a565b606091505b509150915061386b87838387613876565b979650505050505050565b6060831561390c5782516000036139055773ffffffffffffffffffffffffffffffffffffffff85163b613905576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016117b5565b5081612416565b61241683838151156139215781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b591906139c3565b60005b83811015613970578181015183820152602001613958565b50506000910152565b60008151808452613991816020860160208601613955565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006139d66020830184613979565b9392505050565b67ffffffffffffffff811681146139f357600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff811681146139f357600080fd5b600080600060608486031215613a2d57600080fd5b8335613a38816139dd565b9250602084013591506040840135613a4f816139f6565b809150509250925092565b600060208284031215613a6c57600080fd5b81356139d6816139dd565b60008083601f840112613a8957600080fd5b50813567ffffffffffffffff811115613aa157600080fd5b6020830191508360208260051b8501011115613abc57600080fd5b9250929050565b600080600060408486031215613ad857600080fd5b833567ffffffffffffffff811115613aef57600080fd5b613afb86828701613a77565b9094509250506020840135613a4f816139f6565b600060208284031215613b2157600080fd5b81356139d6816139f6565b63ffffffff811681146139f357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613bb457613bb4613b3e565b604052919050565b600067ffffffffffffffff821115613bd657613bd6613b3e565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613c1357600080fd5b8135613c26613c2182613bbc565b613b6d565b818152846020838601011115613c3b57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613c7157600080fd5b8635613c7c816139f6565b95506020870135613c8c816139f6565b94506040870135613c9c81613b2c565b93506060870135613cac816139f6565b9250608087013567ffffffffffffffff80821115613cc957600080fd5b613cd58a838b01613c02565b935060a0890135915080821115613ceb57600080fd5b50613cf889828a01613c02565b9150509295509295509295565b60008060008060808587031215613d1b57600080fd5b8435613d2681613b2c565b93506020850135613d36816139f6565b92506040850135613d4681613b2c565b9150606085013567ffffffffffffffff811115613d6257600080fd5b613d6e87828801613c02565b91505092959194509250565b600060208284031215613d8c57600080fd5b813567ffffffffffffffff811115613da357600080fd5b61241684828501613c02565b60008060208385031215613dc257600080fd5b823567ffffffffffffffff811115613dd957600080fd5b613de585828601613a77565b90969095509350505050565b600080600060408486031215613e0657600080fd5b833567ffffffffffffffff80821115613e1e57600080fd5b818601915086601f830112613e3257600080fd5b813581811115613e4157600080fd5b876020828501011115613e5357600080fd5b6020928301989097509590910135949350505050565b600060208284031215613e7b57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613ed257613ed2613e82565b5092915050565b600082613f0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613f2857607f821691505b602082108103613f61577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215613f7957600080fd5b815180151581146139d657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613fec57600080fd5b9190910192915050565b60006080823603121561400857600080fd5b6040516080810167ffffffffffffffff828210818311171561402c5761402c613b3e565b81604052843591508082111561404157600080fd5b5061404e36828601613c02565b825250602083013560208201526040830135614069816139dd565b6040820152606083013561407c816139dd565b606082015292915050565b600067ffffffffffffffff8083168181036140a4576140a4613e82565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036140df576140df613e82565b5060010190565b8181038181111561362d5761362d613e82565b808202811582820484141761362d5761362d613e82565b60006020828403121561412257600080fd5b81516139d6816139dd565b6060815260006141406060830186613979565b82810360208401526141528186613979565b91505060ff83166040830152949350505050565b6000806040838503121561417957600080fd5b825161418481613b2c565b6020840151909250614195816139f6565b809150509250929050565b601f82111561318f57600081815260208120601f850160051c810160208610156141c75750805b601f850160051c820191505b818110156141e6578281556001016141d3565b505050505050565b815167ffffffffffffffff81111561420857614208613b3e565b61421c816142168454613f14565b846141a0565b602080601f83116001811461426f57600084156142395750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556141e6565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156142bc5788860151825594840194600190910190840161429d565b50858210156142f857878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60608152600061431b6060830186613979565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261439e60c0830184613979565b98975050505050505050565b61ffff818116838216019080821115613ed257613ed2613e82565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b166001840152875161442e816003860160208c01613955565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614471816017840160208b01613955565b808201915050818660f81b16601782015284519150614497826018830160208801613955565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614511816003860160208c01613955565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614554816017840160208b01613955565b808201915050818660f01b1660178201528451915061457a826019830160208801613955565b016019019998505050505050505050565b6000865161459d818460208b01613955565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b67ffffffffffffffff818116838216019080821115613ed257613ed2613e82565b8082018082111561362d5761362d613e82565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112613fec57600080fd5b60006060823603121561466157600080fd5b6040516060810167ffffffffffffffff828210818311171561468557614685613b3e565b81604052843591508082111561469a57600080fd5b506146a736828601613c02565b8252506020830135602082015260408301356146c2816139dd565b604082015292915050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b60008251613fec818460208701613955565b60006020828403121561477257600080fd5b815160ff811681146139d657600080fd5b60006020828403121561479557600080fd5b815167ffffffffffffffff8111156147ac57600080fd5b8201601f810184136147bd57600080fd5b80516147cb613c2182613bbc565b8181528560208385010111156147e057600080fd5b6147f1826020830160208601613955565b9594505050505056fea264697066735822122054d17ab62a9c80223317103957a799f93d742c7a9fb607c4af5b2f022a2d816e64736f6c63430008140033", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/compiled-contracts/paris/PolygonZkEVMV2Existent.json b/compiled-contracts/paris/PolygonZkEVMV2Existent.json deleted file mode 100644 index 004282c72..000000000 --- a/compiled-contracts/paris/PolygonZkEVMV2Existent.json +++ /dev/null @@ -1,1182 +0,0 @@ -{ - "_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 IPolygonZkEVMBridgeV2", - "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": "ForceBatchesDescentralized", - "type": "error" - }, - { - "inputs": [], - "name": "ForceBatchesNotAllowedOnEmergencyState", - "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": "HaltTimeoutNotExpiredAfterEmergencyState", - "type": "error" - }, - { - "inputs": [], - "name": "HugeTokenMetadataNotSupported", - "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": [ - { - "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": "bytes", - "name": "transactions", - "type": "bytes" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "lastGlobalExitRoot", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "address", - "name": "sequencer", - "type": "address" - } - ], - "name": "InitialSequenceBatches", - "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": "address", - "name": "newForceBatchAddress", - "type": "address" - } - ], - "name": "SetForceBatchAddress", - "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": "GLOBAL_EXIT_ROOT_MANAGER_L2", - "outputs": [ - { - "internalType": "contract IBasePolygonZkEVMGlobalExitRoot", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INITIALIZE_TX_BRIDGE_LIST_LEN_LEN", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INITIALIZE_TX_BRIDGE_PARAMS", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS_EMPTY_METADATA", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INITIALIZE_TX_CONSTANT_BYTES", - "outputs": [ - { - "internalType": "uint16", - "name": "", - "type": "uint16" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INITIALIZE_TX_CONSTANT_BYTES_EMPTY_METADATA", - "outputs": [ - { - "internalType": "uint16", - "name": "", - "type": "uint16" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INITIALIZE_TX_DATA_LEN_EMPTY_METADATA", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "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": "admin", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "bridgeAddress", - "outputs": [ - { - "internalType": "contract IPolygonZkEVMBridgeV2", - "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": "forceBatchAddress", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "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" - }, - { - "internalType": "bytes", - "name": "_gasTokenMetadata", - "type": "bytes" - } - ], - "name": "generateInitializeTransaction", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "view", - "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": "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": "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": "address", - "name": "newForceBatchAddress", - "type": "address" - } - ], - "name": "setForceBatchAddress", - "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": "0x6101006040523480156200001257600080fd5b5060405162004dcf38038062004dcf833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e051614c0d620001c260003960008181610522015281816109cb01528181610b380152818161128f015281816113580152818161137a01528181611511015281816116a401528181611c2f015281816125090152818161292f01528181612d8801528181612e5601528181612f7b015261304301526000818161067c01528181611452015281816118fe01528181612159015261226101526000818161075301528181610fb201528181611a85015261318e01526000818161079801528181610863015281816112e20152818161142801526131620152614c0d6000f3fe608060405234801561001057600080fd5b50600436106102f35760003560e01c80637125702211610191578063c7fffd4b116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b146107da578063f35dda47146107ed578063f851a440146107f557600080fd5b8063d8d1091b14610780578063e46761c414610793578063e7a7ed02146107ba57600080fd5b8063cfa8ed47116100c8578063cfa8ed471461072e578063d02103ca1461074e578063d7bc90ff1461077557600080fd5b8063c7fffd4b14610713578063c89e42df1461071b57600080fd5b8063a3c573eb11610145578063b0afe1541161011f578063b0afe154146106c4578063bb590708146106d0578063c754c7ed146106e357600080fd5b8063a3c573eb14610677578063a652f26c1461069e578063ada8f919146106b157600080fd5b80638c3d7301116101765780638c3d73011461064157806391cafe32146106495780639e0018771461065c57600080fd5b806371257022146105f25780637a5460c51461060557600080fd5b806340b5de6c1161024a578063542028d5116101fe5780636b8616ce116101d85780636b8616ce146105b65780636e05d2cd146105d65780636ff512cc146105df57600080fd5b8063542028d5146105935780635e9145c91461059b578063676870d2146105ae57600080fd5b806349b7b8021161022f57806349b7b8021461051d5780634e4877061461054457806352bdeb6d1461055757600080fd5b806340b5de6c1461049d57806345605267146104f557600080fd5b806319d8ac61116102ac57806332c2d1531161028657806332c2d1531461042b5780633c351e10146104405780633cbc795b1461046057600080fd5b806319d8ac611461039957806326782247146103c65780632c111c061461040b57600080fd5b806305835f37116102dd57806305835f371461032e578063107bf28c1461037757806311e892d41461037f57600080fd5b8062d0295d146102f85780630350896314610313575b600080fd5b61030061081b565b6040519081526020015b60405180910390f35b61031b602081565b60405161ffff909116815260200161030a565b61036a6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161030a9190613cfa565b61036a61093b565b61038760f981565b60405160ff909116815260200161030a565b6007546103ad9067ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161030a565b6001546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161030a565b6008546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b61043e610439366004613d4f565b6109c9565b005b6009546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104889074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161030a565b6104c47fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161030a565b6007546103ad90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b61043e610552366004613d91565b610a98565b61036a6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61036a610cb2565b61043e6105a9366004613dfa565b610cbf565b61031b601f81565b6103006105c4366004613d91565b60066020526000908152604090205481565b61030060055481565b61043e6105ed366004613e46565b6115d8565b61043e610600366004613f8f565b6116a2565b61036a6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61043e611e6c565b61043e610657366004613e46565b611f3f565b6103e673a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b61036a6106ac36600461403c565b612058565b61043e6106bf366004613e46565b61243d565b6103006405ca1ab1e081565b61043e6106de3660046140b1565b612507565b6007546103ad907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61038760e481565b61043e610729366004614157565b61281f565b6002546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b610300635ca1ab1e81565b61043e61078e36600461418c565b6128b2565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b6007546103ad9068010000000000000000900467ffffffffffffffff1681565b61043e6107e83660046141ce565b612f03565b610387601b81565b6000546103e69062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156108aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ce9190614246565b60075490915060009061090d9067ffffffffffffffff70010000000000000000000000000000000082048116916801000000000000000090041661428e565b67ffffffffffffffff1690508060000361092a5760009250505090565b61093481836142b6565b9250505090565b60048054610948906142f1565b80601f0160208091040260200160405190810160405280929190818152602001828054610974906142f1565b80156109c15780601f10610996576101008083540402835291602001916109c1565b820191906000526020600020905b8154815290600101906020018083116109a457829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a38576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a8b91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610aef576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b36576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc59190614344565b610c2e5760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c2e576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b60038054610948906142f1565b60025473ffffffffffffffffffffffffffffffffffffffff163314610d10576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003610d4c576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610d88576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156111c4576000898983818110610dd157610dd1614366565b9050602002810190610de39190614395565b610dec906143d3565b8051805160209091012060608201519192509067ffffffffffffffff1615610f6f5785610e1881614464565b96505060008183602001518460600151604051602001610e7093929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114610ef9576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015610f4f576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86166000908152600660205260408120556110ac565b602082015115801590611036575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015611010573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110349190614246565b155b1561106d576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156110ac576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806110df575042826040015167ffffffffffffffff16115b15611116576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519650505080806111bc9061448b565b915050610db5565b5060075467ffffffffffffffff680100000000000000009091048116908416111561121b576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff868116919091179091556005839055859082811690851614611352576000611272838661428e565b905061128867ffffffffffffffff8216836144c3565b91506113097f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166112c161081b565b6112cb91906144d6565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691906133f2565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611450337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114079190614246565b61141191906144d6565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906134cb565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156114b857600080fd5b505af11580156114cc573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af1158015611570573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159491906144ed565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461162f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610ca7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611711576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156117315750600054600160ff909116105b8061174b5750303b15801561174b575060005460ff166001145b6117dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561183a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611a26576118618561352f565b61186a8661363f565b61187387613746565b6040516020016118859392919061450a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611946573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196a9190614543565b915091508163ffffffff166000146119e2576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055611a23565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b600954600090611a6e90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685612058565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611aee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b129190614246565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611c8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb191906144ed565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611d4391906145cb565b506004611d5089826145cb565b508c600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611df1939291906146e5565b60405180910390a15050505050508015611e6357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611ebd576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611f96576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611fe5576040517fd40d91c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610ca7565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa60008760405160240161208c96959493929190614724565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060906000036121dd5760f9601f83516121219190614787565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e4876040516020016121c797969594939291906147a2565b60405160208183030381529060405290506122e1565b815161ffff101561221a576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9612229602083614787565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016122ce9796959493929190614885565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015612342573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166123ba576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906124009084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614968565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612494576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610ca7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314612576576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156125965750600054600160ff909116105b806125b05750303b1580156125b0575060005460ff166001145b61263c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016117d3565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561269a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8a81169190910291909117909155600280547fffffffffffffffffffffffff000000000000000000000000000000000000000016918816919091179055600361272286826145cb565b50600461272f85826145cb565b50600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff891617905560058390556007805467ffffffffffffffff841677ffffffffffffffffffffffffffffffff0000000000000000909116177a0697800000000000000000000000000000000000000000000000001790558015611e6357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611e5a565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612876576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361288282826145cb565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610ca79190613cfa565b60085473ffffffffffffffffffffffffffffffffffffffff16158015906128f1575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15612928576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612998573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129bc91906144ed565b6129c691906149c4565b67ffffffffffffffff161115612a08576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003612a44576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612a80576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612abb9184917001000000000000000000000000000000009004166149e5565b1115612af3576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015612d82576000868683818110612b3857612b38614366565b9050602002810190612b4a91906149f8565b612b5390614a2c565b905083612b5f81614464565b82518051602091820120818501516040808701519051949950919450600093612bc19386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612c4a576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055612c6f6001886144c3565b8403612cde5742600760189054906101000a900467ffffffffffffffff168460400151612c9c91906149c4565b67ffffffffffffffff161115612cde576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080612d7a9061448b565b915050612b1c565b50612db07f0000000000000000000000000000000000000000000000000000000000000000846112c161081b565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612e9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec391906144ed565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085473ffffffffffffffffffffffffffffffffffffffff1615801590612f42575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15612f79576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fe4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130089190614344565b1561303f576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130d09190614246565b90508181111561310c576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115613148576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61318a73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846134cb565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061321b9190614246565b600780549192506801000000000000000090910467ffffffffffffffff1690600861324583614464565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050848460405161327c929190614aaa565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff166000908152600690935291205532330361338c576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26133eb565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931823388886040516133e29493929190614aba565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526134c69084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613839565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526135299085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613444565b50505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916135b19190614b2b565b600060405180830381855afa9150503d80600081146135ec576040519150601f19603f3d011682016040523d82523d6000602084013e6135f1565b606091505b509150915081613636576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250612435565b61243581613945565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916136c19190614b2b565b600060405180830381855afa9150503d80600081146136fc576040519150601f19603f3d011682016040523d82523d6000602084013e613701565b606091505b509150915081613636576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250612435565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8616916137c79190614b2b565b600060405180830381855afa9150503d8060008114613802576040519150601f19603f3d011682016040523d82523d6000602084013e613807565b606091505b509150915081801561381a575080516020145b613825576012612435565b808060200190518101906124359190614b3d565b600061389b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613b1b9092919063ffffffff16565b8051909150156134c657808060200190518101906138b99190614344565b6134c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016117d3565b6060604082511061396a57818060200190518101906139649190614b60565b92915050565b8151602003613ae25760005b6020811080156139bd575082818151811061399357613993614366565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b156139d457806139cc8161448b565b915050613976565b80600003613a1757505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115613a3257613a32613e75565b6040519080825280601f01601f191660200182016040528015613a5c576020820181803683370190505b50905060005b82811015613ada57848181518110613a7c57613a7c614366565b602001015160f81c60f81b828281518110613a9957613a99614366565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080613ad28161448b565b915050613a62565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60606124358484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051613b4f9190614b2b565b60006040518083038185875af1925050503d8060008114613b8c576040519150601f19603f3d011682016040523d82523d6000602084013e613b91565b606091505b5091509150613ba287838387613bad565b979650505050505050565b60608315613c43578251600003613c3c5773ffffffffffffffffffffffffffffffffffffffff85163b613c3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016117d3565b5081612435565b6124358383815115613c585781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d39190613cfa565b60005b83811015613ca7578181015183820152602001613c8f565b50506000910152565b60008151808452613cc8816020860160208601613c8c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613d0d6020830184613cb0565b9392505050565b67ffffffffffffffff81168114613d2a57600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613d2a57600080fd5b600080600060608486031215613d6457600080fd5b8335613d6f81613d14565b9250602084013591506040840135613d8681613d2d565b809150509250925092565b600060208284031215613da357600080fd5b8135613d0d81613d14565b60008083601f840112613dc057600080fd5b50813567ffffffffffffffff811115613dd857600080fd5b6020830191508360208260051b8501011115613df357600080fd5b9250929050565b600080600060408486031215613e0f57600080fd5b833567ffffffffffffffff811115613e2657600080fd5b613e3286828701613dae565b9094509250506020840135613d8681613d2d565b600060208284031215613e5857600080fd5b8135613d0d81613d2d565b63ffffffff81168114613d2a57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613eeb57613eeb613e75565b604052919050565b600067ffffffffffffffff821115613f0d57613f0d613e75565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613f4a57600080fd5b8135613f5d613f5882613ef3565b613ea4565b818152846020838601011115613f7257600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613fa857600080fd5b8635613fb381613d2d565b95506020870135613fc381613d2d565b94506040870135613fd381613e63565b93506060870135613fe381613d2d565b9250608087013567ffffffffffffffff8082111561400057600080fd5b61400c8a838b01613f39565b935060a089013591508082111561402257600080fd5b5061402f89828a01613f39565b9150509295509295509295565b6000806000806080858703121561405257600080fd5b843561405d81613e63565b9350602085013561406d81613d2d565b9250604085013561407d81613e63565b9150606085013567ffffffffffffffff81111561409957600080fd5b6140a587828801613f39565b91505092959194509250565b60008060008060008060c087890312156140ca57600080fd5b86356140d581613d2d565b955060208701356140e581613d2d565b9450604087013567ffffffffffffffff8082111561410257600080fd5b61410e8a838b01613f39565b9550606089013591508082111561412457600080fd5b5061413189828a01613f39565b9350506080870135915060a087013561414981613d14565b809150509295509295509295565b60006020828403121561416957600080fd5b813567ffffffffffffffff81111561418057600080fd5b61243584828501613f39565b6000806020838503121561419f57600080fd5b823567ffffffffffffffff8111156141b657600080fd5b6141c285828601613dae565b90969095509350505050565b6000806000604084860312156141e357600080fd5b833567ffffffffffffffff808211156141fb57600080fd5b818601915086601f83011261420f57600080fd5b81358181111561421e57600080fd5b87602082850101111561423057600080fd5b6020928301989097509590910135949350505050565b60006020828403121561425857600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8281168282160390808211156142af576142af61425f565b5092915050565b6000826142ec577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061430557607f821691505b60208210810361433e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561435657600080fd5b81518015158114613d0d57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126143c957600080fd5b9190910192915050565b6000608082360312156143e557600080fd5b6040516080810167ffffffffffffffff828210818311171561440957614409613e75565b81604052843591508082111561441e57600080fd5b5061442b36828601613f39565b82525060208301356020820152604083013561444681613d14565b6040820152606083013561445981613d14565b606082015292915050565b600067ffffffffffffffff8083168181036144815761448161425f565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144bc576144bc61425f565b5060010190565b818103818111156139645761396461425f565b80820281158282048414176139645761396461425f565b6000602082840312156144ff57600080fd5b8151613d0d81613d14565b60608152600061451d6060830186613cb0565b828103602084015261452f8186613cb0565b91505060ff83166040830152949350505050565b6000806040838503121561455657600080fd5b825161456181613e63565b602084015190925061457281613d2d565b809150509250929050565b601f8211156134c657600081815260208120601f850160051c810160208610156145a45750805b601f850160051c820191505b818110156145c3578281556001016145b0565b505050505050565b815167ffffffffffffffff8111156145e5576145e5613e75565b6145f9816145f384546142f1565b8461457d565b602080601f83116001811461464c57600084156146165750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556145c3565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156146995788860151825594840194600190910190840161467a565b50858210156146d557878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006146f86060830186613cb0565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261477b60c0830184613cb0565b98975050505050505050565b61ffff8181168382160190808211156142af576142af61425f565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b166001840152875161480b816003860160208c01613c8c565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161484e816017840160208b01613c8c565b808201915050818660f81b16601782015284519150614874826018830160208801613c8c565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b16600184015287516148ee816003860160208c01613c8c565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614931816017840160208b01613c8c565b808201915050818660f01b16601782015284519150614957826019830160208801613c8c565b016019019998505050505050505050565b6000865161497a818460208b01613c8c565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b67ffffffffffffffff8181168382160190808211156142af576142af61425f565b808201808211156139645761396461425f565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126143c957600080fd5b600060608236031215614a3e57600080fd5b6040516060810167ffffffffffffffff8282108183111715614a6257614a62613e75565b816040528435915080821115614a7757600080fd5b50614a8436828601613f39565b825250602083013560208201526040830135614a9f81613d14565b604082015292915050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b600082516143c9818460208701613c8c565b600060208284031215614b4f57600080fd5b815160ff81168114613d0d57600080fd5b600060208284031215614b7257600080fd5b815167ffffffffffffffff811115614b8957600080fd5b8201601f81018413614b9a57600080fd5b8051614ba8613f5882613ef3565b818152856020838501011115614bbd57600080fd5b614bce826020830160208601613c8c565b9594505050505056fea264697066735822122065654da33f4913d4e862eebcafeec80c738b7e1e3836f72c8aa73f3c6d8e76e364736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102f35760003560e01c80637125702211610191578063c7fffd4b116100e3578063d8d1091b11610097578063eaeb077b11610071578063eaeb077b146107da578063f35dda47146107ed578063f851a440146107f557600080fd5b8063d8d1091b14610780578063e46761c414610793578063e7a7ed02146107ba57600080fd5b8063cfa8ed47116100c8578063cfa8ed471461072e578063d02103ca1461074e578063d7bc90ff1461077557600080fd5b8063c7fffd4b14610713578063c89e42df1461071b57600080fd5b8063a3c573eb11610145578063b0afe1541161011f578063b0afe154146106c4578063bb590708146106d0578063c754c7ed146106e357600080fd5b8063a3c573eb14610677578063a652f26c1461069e578063ada8f919146106b157600080fd5b80638c3d7301116101765780638c3d73011461064157806391cafe32146106495780639e0018771461065c57600080fd5b806371257022146105f25780637a5460c51461060557600080fd5b806340b5de6c1161024a578063542028d5116101fe5780636b8616ce116101d85780636b8616ce146105b65780636e05d2cd146105d65780636ff512cc146105df57600080fd5b8063542028d5146105935780635e9145c91461059b578063676870d2146105ae57600080fd5b806349b7b8021161022f57806349b7b8021461051d5780634e4877061461054457806352bdeb6d1461055757600080fd5b806340b5de6c1461049d57806345605267146104f557600080fd5b806319d8ac61116102ac57806332c2d1531161028657806332c2d1531461042b5780633c351e10146104405780633cbc795b1461046057600080fd5b806319d8ac611461039957806326782247146103c65780632c111c061461040b57600080fd5b806305835f37116102dd57806305835f371461032e578063107bf28c1461037757806311e892d41461037f57600080fd5b8062d0295d146102f85780630350896314610313575b600080fd5b61030061081b565b6040519081526020015b60405180910390f35b61031b602081565b60405161ffff909116815260200161030a565b61036a6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161030a9190613cfa565b61036a61093b565b61038760f981565b60405160ff909116815260200161030a565b6007546103ad9067ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161030a565b6001546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161030a565b6008546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b61043e610439366004613d4f565b6109c9565b005b6009546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104889074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161030a565b6104c47fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161030a565b6007546103ad90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b61043e610552366004613d91565b610a98565b61036a6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61036a610cb2565b61043e6105a9366004613dfa565b610cbf565b61031b601f81565b6103006105c4366004613d91565b60066020526000908152604090205481565b61030060055481565b61043e6105ed366004613e46565b6115d8565b61043e610600366004613f8f565b6116a2565b61036a6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61043e611e6c565b61043e610657366004613e46565b611f3f565b6103e673a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b61036a6106ac36600461403c565b612058565b61043e6106bf366004613e46565b61243d565b6103006405ca1ab1e081565b61043e6106de3660046140b1565b612507565b6007546103ad907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61038760e481565b61043e610729366004614157565b61281f565b6002546103e69073ffffffffffffffffffffffffffffffffffffffff1681565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b610300635ca1ab1e81565b61043e61078e36600461418c565b6128b2565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b6007546103ad9068010000000000000000900467ffffffffffffffff1681565b61043e6107e83660046141ce565b612f03565b610387601b81565b6000546103e69062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156108aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ce9190614246565b60075490915060009061090d9067ffffffffffffffff70010000000000000000000000000000000082048116916801000000000000000090041661428e565b67ffffffffffffffff1690508060000361092a5760009250505090565b61093481836142b6565b9250505090565b60048054610948906142f1565b80601f0160208091040260200160405190810160405280929190818152602001828054610974906142f1565b80156109c15780601f10610996576101008083540402835291602001916109c1565b820191906000526020600020905b8154815290600101906020018083116109a457829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a38576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a8b91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610aef576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b36576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc59190614344565b610c2e5760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c2e576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b60038054610948906142f1565b60025473ffffffffffffffffffffffffffffffffffffffff163314610d10576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003610d4c576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610d88576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055467ffffffffffffffff80831692700100000000000000000000000000000000900416908160005b858110156111c4576000898983818110610dd157610dd1614366565b9050602002810190610de39190614395565b610dec906143d3565b8051805160209091012060608201519192509067ffffffffffffffff1615610f6f5785610e1881614464565b96505060008183602001518460600151604051602001610e7093929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114610ef9576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826060015167ffffffffffffffff16836040015167ffffffffffffffff161015610f4f576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff86166000908152600660205260408120556110ac565b602082015115801590611036575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303816000875af1158015611010573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110349190614246565b155b1561106d576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156110ac576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8667ffffffffffffffff16826040015167ffffffffffffffff1610806110df575042826040015167ffffffffffffffff16115b15611116576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519650505080806111bc9061448b565b915050610db5565b5060075467ffffffffffffffff680100000000000000009091048116908416111561121b576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff868116919091179091556005839055859082811690851614611352576000611272838661428e565b905061128867ffffffffffffffff8216836144c3565b91506113097f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166112c161081b565b6112cb91906144d6565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691906133f2565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611450337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114079190614246565b61141191906144d6565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906134cb565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156114b857600080fd5b505af11580156114cc573d6000803e3d6000fd5b50506040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015260248101869052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150639a908e73906044016020604051808303816000875af1158015611570573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159491906144ed565b60405190915067ffffffffffffffff8216907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461162f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610ca7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611711576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156117315750600054600160ff909116105b8061174b5750303b15801561174b575060005460ff166001145b6117dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561183a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611a26576118618561352f565b61186a8661363f565b61187387613746565b6040516020016118859392919061450a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611946573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196a9190614543565b915091508163ffffffff166000146119e2576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055611a23565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b600954600090611a6e90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685612058565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611aee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b129190614246565b60408051600060208201819052918101869052606080820184905260c086901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528e901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608882015291925090609c01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290528051602090910120600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905560058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611c8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb191906144ed565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611d4391906145cb565b506004611d5089826145cb565b508c600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611df1939291906146e5565b60405180910390a15050505050508015611e6357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611ebd576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611f96576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611fe5576040517fd40d91c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610ca7565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa60008760405160240161208c96959493929190614724565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060906000036121dd5760f9601f83516121219190614787565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e4876040516020016121c797969594939291906147a2565b60405160208183030381529060405290506122e1565b815161ffff101561221a576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9612229602083614787565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016122ce9796959493929190614885565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015612342573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166123ba576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906124009084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614968565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612494576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610ca7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314612576576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16158080156125965750600054600160ff909116105b806125b05750303b1580156125b0575060005460ff166001145b61263c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016117d3565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561269a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8a81169190910291909117909155600280547fffffffffffffffffffffffff000000000000000000000000000000000000000016918816919091179055600361272286826145cb565b50600461272f85826145cb565b50600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff891617905560058390556007805467ffffffffffffffff841677ffffffffffffffffffffffffffffffff0000000000000000909116177a0697800000000000000000000000000000000000000000000000001790558015611e6357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611e5a565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612876576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361288282826145cb565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610ca79190613cfa565b60085473ffffffffffffffffffffffffffffffffffffffff16158015906128f1575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15612928576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612998573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129bc91906144ed565b6129c691906149c4565b67ffffffffffffffff161115612a08576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819003612a44576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612a80576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff680100000000000000008204811691612abb9184917001000000000000000000000000000000009004166149e5565b1115612af3576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015612d82576000868683818110612b3857612b38614366565b9050602002810190612b4a91906149f8565b612b5390614a2c565b905083612b5f81614464565b82518051602091820120818501516040808701519051949950919450600093612bc19386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612c4a576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055612c6f6001886144c3565b8403612cde5742600760189054906101000a900467ffffffffffffffff168460400151612c9c91906149c4565b67ffffffffffffffff161115612cde576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094505050508080612d7a9061448b565b915050612b1c565b50612db07f0000000000000000000000000000000000000000000000000000000000000000846112c161081b565b60058190556007805467ffffffffffffffff848116700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffff000000000000000090921642821617919091179091556040517f9a908e7300000000000000000000000000000000000000000000000000000000815290841660048201526024810182905260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906044016020604051808303816000875af1158015612e9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec391906144ed565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b60085473ffffffffffffffffffffffffffffffffffffffff1615801590612f42575060085473ffffffffffffffffffffffffffffffffffffffff163314155b15612f79576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fe4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130089190614344565b1561303f576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130d09190614246565b90508181111561310c576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115613148576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61318a73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846134cb565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061321b9190614246565b600780549192506801000000000000000090910467ffffffffffffffff1690600861324583614464565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050848460405161327c929190614aaa565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff166000908152600690935291205532330361338c576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26133eb565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931823388886040516133e29493929190614aba565b60405180910390a25b5050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526134c69084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613839565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526135299085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613444565b50505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916135b19190614b2b565b600060405180830381855afa9150503d80600081146135ec576040519150601f19603f3d011682016040523d82523d6000602084013e6135f1565b606091505b509150915081613636576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250612435565b61243581613945565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916136c19190614b2b565b600060405180830381855afa9150503d80600081146136fc576040519150601f19603f3d011682016040523d82523d6000602084013e613701565b606091505b509150915081613636576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250612435565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8616916137c79190614b2b565b600060405180830381855afa9150503d8060008114613802576040519150601f19603f3d011682016040523d82523d6000602084013e613807565b606091505b509150915081801561381a575080516020145b613825576012612435565b808060200190518101906124359190614b3d565b600061389b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613b1b9092919063ffffffff16565b8051909150156134c657808060200190518101906138b99190614344565b6134c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016117d3565b6060604082511061396a57818060200190518101906139649190614b60565b92915050565b8151602003613ae25760005b6020811080156139bd575082818151811061399357613993614366565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b156139d457806139cc8161448b565b915050613976565b80600003613a1757505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115613a3257613a32613e75565b6040519080825280601f01601f191660200182016040528015613a5c576020820181803683370190505b50905060005b82811015613ada57848181518110613a7c57613a7c614366565b602001015160f81c60f81b828281518110613a9957613a99614366565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080613ad28161448b565b915050613a62565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b60606124358484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051613b4f9190614b2b565b60006040518083038185875af1925050503d8060008114613b8c576040519150601f19603f3d011682016040523d82523d6000602084013e613b91565b606091505b5091509150613ba287838387613bad565b979650505050505050565b60608315613c43578251600003613c3c5773ffffffffffffffffffffffffffffffffffffffff85163b613c3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016117d3565b5081612435565b6124358383815115613c585781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d39190613cfa565b60005b83811015613ca7578181015183820152602001613c8f565b50506000910152565b60008151808452613cc8816020860160208601613c8c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613d0d6020830184613cb0565b9392505050565b67ffffffffffffffff81168114613d2a57600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613d2a57600080fd5b600080600060608486031215613d6457600080fd5b8335613d6f81613d14565b9250602084013591506040840135613d8681613d2d565b809150509250925092565b600060208284031215613da357600080fd5b8135613d0d81613d14565b60008083601f840112613dc057600080fd5b50813567ffffffffffffffff811115613dd857600080fd5b6020830191508360208260051b8501011115613df357600080fd5b9250929050565b600080600060408486031215613e0f57600080fd5b833567ffffffffffffffff811115613e2657600080fd5b613e3286828701613dae565b9094509250506020840135613d8681613d2d565b600060208284031215613e5857600080fd5b8135613d0d81613d2d565b63ffffffff81168114613d2a57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613eeb57613eeb613e75565b604052919050565b600067ffffffffffffffff821115613f0d57613f0d613e75565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613f4a57600080fd5b8135613f5d613f5882613ef3565b613ea4565b818152846020838601011115613f7257600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613fa857600080fd5b8635613fb381613d2d565b95506020870135613fc381613d2d565b94506040870135613fd381613e63565b93506060870135613fe381613d2d565b9250608087013567ffffffffffffffff8082111561400057600080fd5b61400c8a838b01613f39565b935060a089013591508082111561402257600080fd5b5061402f89828a01613f39565b9150509295509295509295565b6000806000806080858703121561405257600080fd5b843561405d81613e63565b9350602085013561406d81613d2d565b9250604085013561407d81613e63565b9150606085013567ffffffffffffffff81111561409957600080fd5b6140a587828801613f39565b91505092959194509250565b60008060008060008060c087890312156140ca57600080fd5b86356140d581613d2d565b955060208701356140e581613d2d565b9450604087013567ffffffffffffffff8082111561410257600080fd5b61410e8a838b01613f39565b9550606089013591508082111561412457600080fd5b5061413189828a01613f39565b9350506080870135915060a087013561414981613d14565b809150509295509295509295565b60006020828403121561416957600080fd5b813567ffffffffffffffff81111561418057600080fd5b61243584828501613f39565b6000806020838503121561419f57600080fd5b823567ffffffffffffffff8111156141b657600080fd5b6141c285828601613dae565b90969095509350505050565b6000806000604084860312156141e357600080fd5b833567ffffffffffffffff808211156141fb57600080fd5b818601915086601f83011261420f57600080fd5b81358181111561421e57600080fd5b87602082850101111561423057600080fd5b6020928301989097509590910135949350505050565b60006020828403121561425857600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8281168282160390808211156142af576142af61425f565b5092915050565b6000826142ec577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061430557607f821691505b60208210810361433e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561435657600080fd5b81518015158114613d0d57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126143c957600080fd5b9190910192915050565b6000608082360312156143e557600080fd5b6040516080810167ffffffffffffffff828210818311171561440957614409613e75565b81604052843591508082111561441e57600080fd5b5061442b36828601613f39565b82525060208301356020820152604083013561444681613d14565b6040820152606083013561445981613d14565b606082015292915050565b600067ffffffffffffffff8083168181036144815761448161425f565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144bc576144bc61425f565b5060010190565b818103818111156139645761396461425f565b80820281158282048414176139645761396461425f565b6000602082840312156144ff57600080fd5b8151613d0d81613d14565b60608152600061451d6060830186613cb0565b828103602084015261452f8186613cb0565b91505060ff83166040830152949350505050565b6000806040838503121561455657600080fd5b825161456181613e63565b602084015190925061457281613d2d565b809150509250929050565b601f8211156134c657600081815260208120601f850160051c810160208610156145a45750805b601f850160051c820191505b818110156145c3578281556001016145b0565b505050505050565b815167ffffffffffffffff8111156145e5576145e5613e75565b6145f9816145f384546142f1565b8461457d565b602080601f83116001811461464c57600084156146165750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556145c3565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156146995788860151825594840194600190910190840161467a565b50858210156146d557878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006146f86060830186613cb0565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261477b60c0830184613cb0565b98975050505050505050565b61ffff8181168382160190808211156142af576142af61425f565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b166001840152875161480b816003860160208c01613c8c565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161484e816017840160208b01613c8c565b808201915050818660f81b16601782015284519150614874826018830160208801613c8c565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b16600184015287516148ee816003860160208c01613c8c565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614931816017840160208b01613c8c565b808201915050818660f01b16601782015284519150614957826019830160208801613c8c565b016019019998505050505050505050565b6000865161497a818460208b01613c8c565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b67ffffffffffffffff8181168382160190808211156142af576142af61425f565b808201808211156139645761396461425f565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126143c957600080fd5b600060608236031215614a3e57600080fd5b6040516060810167ffffffffffffffff8282108183111715614a6257614a62613e75565b816040528435915080821115614a7757600080fd5b50614a8436828601613f39565b825250602083013560208201526040830135614a9f81613d14565b604082015292915050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b600082516143c9818460208701613c8c565b600060208284031215614b4f57600080fd5b815160ff81168114613d0d57600080fd5b600060208284031215614b7257600080fd5b815167ffffffffffffffff811115614b8957600080fd5b8201601f81018413614b9a57600080fd5b8051614ba8613f5882613ef3565b818152856020838501011115614bbd57600080fd5b614bce826020830160208601613c8c565b9594505050505056fea264697066735822122065654da33f4913d4e862eebcafeec80c738b7e1e3836f72c8aa73f3c6d8e76e364736f6c63430008140033", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/compiled-contracts/paris/PolygonZkEVMV2ExistentEtrog.json b/compiled-contracts/paris/PolygonZkEVMV2ExistentEtrog.json deleted file mode 100644 index 6410216b3..000000000 --- a/compiled-contracts/paris/PolygonZkEVMV2ExistentEtrog.json +++ /dev/null @@ -1,1231 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "PolygonZkEVMV2ExistentEtrog", - "sourceName": "contracts/v2/consensus/zkEVM/PolygonZkEVMV2ExistentEtrog.sol", - "abi": [ - { - "inputs": [ - { - "internalType": "contract IPolygonZkEVMGlobalExitRootV2", - "name": "_globalExitRootManager", - "type": "address" - }, - { - "internalType": "contract IERC20Upgradeable", - "name": "_pol", - "type": "address" - }, - { - "internalType": "contract IPolygonZkEVMBridgeV2", - "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": "ForceBatchesDescentralized", - "type": "error" - }, - { - "inputs": [], - "name": "ForceBatchesNotAllowedOnEmergencyState", - "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": "HaltTimeoutNotExpiredAfterEmergencyState", - "type": "error" - }, - { - "inputs": [], - "name": "HugeTokenMetadataNotSupported", - "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": [ - { - "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": "bytes", - "name": "transactions", - "type": "bytes" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "lastGlobalExitRoot", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "address", - "name": "sequencer", - "type": "address" - } - ], - "name": "InitialSequenceBatches", - "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" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "l1InfoRoot", - "type": "bytes32" - } - ], - "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": "address", - "name": "newForceBatchAddress", - "type": "address" - } - ], - "name": "SetForceBatchAddress", - "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": false, - "internalType": "bytes", - "name": "transactions", - "type": "bytes" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "lastGlobalExitRoot", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "address", - "name": "sequencer", - "type": "address" - } - ], - "name": "UpdateEtrogSequence", - "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": "GLOBAL_EXIT_ROOT_MANAGER_L2", - "outputs": [ - { - "internalType": "contract IBasePolygonZkEVMGlobalExitRoot", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INITIALIZE_TX_BRIDGE_LIST_LEN_LEN", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INITIALIZE_TX_BRIDGE_PARAMS", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS_EMPTY_METADATA", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INITIALIZE_TX_CONSTANT_BYTES", - "outputs": [ - { - "internalType": "uint16", - "name": "", - "type": "uint16" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INITIALIZE_TX_CONSTANT_BYTES_EMPTY_METADATA", - "outputs": [ - { - "internalType": "uint16", - "name": "", - "type": "uint16" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INITIALIZE_TX_DATA_LEN_EMPTY_METADATA", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INITIALIZE_TX_EFFECTIVE_PERCENTAGE", - "outputs": [ - { - "internalType": "bytes1", - "name": "", - "type": "bytes1" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "SET_UP_ETROG_TX", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "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": "admin", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "bridgeAddress", - "outputs": [ - { - "internalType": "contract IPolygonZkEVMBridgeV2", - "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": "forceBatchAddress", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "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": "gapLastTimestamp", - "outputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], - "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" - }, - { - "internalType": "bytes", - "name": "_gasTokenMetadata", - "type": "bytes" - } - ], - "name": "generateInitializeTransaction", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "globalExitRootManager", - "outputs": [ - { - "internalType": "contract IPolygonZkEVMGlobalExitRootV2", - "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": "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": "", - "type": "uint64" - } - ], - "name": "initializeUpgrade", - "outputs": [], - "stateMutability": "nonpayable", - "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": "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": "forcedGlobalExitRoot", - "type": "bytes32" - }, - { - "internalType": "uint64", - "name": "forcedTimestamp", - "type": "uint64" - }, - { - "internalType": "bytes32", - "name": "forcedBlockHashL1", - "type": "bytes32" - } - ], - "internalType": "struct PolygonRollupBaseEtrog.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": "forcedGlobalExitRoot", - "type": "bytes32" - }, - { - "internalType": "uint64", - "name": "forcedTimestamp", - "type": "uint64" - }, - { - "internalType": "bytes32", - "name": "forcedBlockHashL1", - "type": "bytes32" - } - ], - "internalType": "struct PolygonRollupBaseEtrog.BatchData[]", - "name": "batches", - "type": "tuple[]" - } - ], - "name": "sequenceForceBatches", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newForceBatchAddress", - "type": "address" - } - ], - "name": "setForceBatchAddress", - "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": "0x6101006040523480156200001257600080fd5b5060405162004fa538038062004fa5833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e051614dd5620001d06000396000818161052d015281816109de01528181610b4b01528181610d9e0152818161130b015281816117b101528181611c2301528181611d21015281816122bd0152818161260c0152818161294d01528181612a15015281816133820152818161340301528181613425015261353d01526000818161068701528181610ff801528181611ef101528181611ff90152612ea80152600081816107660152818161117f0152818161248001528181612b600152612f2a0152600081816107980152818161087601528181611c6c01528181612b3401526134d30152614dd56000f3fe608060405234801561001057600080fd5b50600436106102fe5760003560e01c80637a5460c51161019c578063c754c7ed116100ee578063e46761c411610097578063ecef3f9911610071578063ecef3f99146107ed578063f35dda4714610800578063f851a4401461080857600080fd5b8063e46761c414610793578063e7a7ed02146107ba578063eaeb077b146107da57600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610741578063d02103ca14610761578063d7bc90ff1461078857600080fd5b8063c754c7ed146106f6578063c7fffd4b14610726578063c89e42df1461072e57600080fd5b8063a3c573eb11610150578063af7f3e021161012a578063af7f3e02146106cf578063b0afe154146106d7578063bb590708146106e357600080fd5b8063a3c573eb14610682578063a652f26c146106a9578063ada8f919146106bc57600080fd5b806391cafe321161018157806391cafe32146106415780639e001877146106545780639f26f8401461066f57600080fd5b80637a5460c5146105fd5780638c3d73011461063957600080fd5b806340b5de6c11610255578063542028d5116102095780636e05d2cd116101e35780636e05d2cd146105ce5780636ff512cc146105d757806371257022146105ea57600080fd5b8063542028d51461059e578063676870d2146105a65780636b8616ce146105ae57600080fd5b806349b7b8021161023a57806349b7b802146105285780634e4877061461054f57806352bdeb6d1461056257600080fd5b806340b5de6c146104a8578063456052671461050057600080fd5b806326782247116102b757806332c2d1531161029157806332c2d153146104365780633c351e101461044b5780633cbc795b1461046b57600080fd5b806326782247146103a45780632a9f208f146103e95780632c111c061461041657600080fd5b806305835f37116102e857806305835f3714610339578063107bf28c1461038257806311e892d41461038a57600080fd5b8062d0295d14610303578063035089631461031e575b600080fd5b61030b61082e565b6040519081526020015b60405180910390f35b610326602081565b60405161ffff9091168152602001610315565b6103756040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516103159190613f1a565b61037561094e565b61039260f981565b60405160ff9091168152602001610315565b6001546103c49073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610315565b6007546103fd9067ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610315565b6008546103c49073ffffffffffffffffffffffffffffffffffffffff1681565b610449610444366004613f6f565b6109dc565b005b6009546103c49073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104939074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610315565b6104cf7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff000000000000000000000000000000000000000000000000000000000000009091168152602001610315565b6007546103fd90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b61044961055d366004613fb1565b610aab565b6103756040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610375610cc5565b610326601f81565b61030b6105bc366004613fb1565b60066020526000908152604090205481565b61030b60055481565b6104496105e5366004613fce565b610cd2565b6104496105f8366004614117565b610d9c565b6103756040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610449611548565b61044961064f366004613fce565b61161b565b6103c473a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b61044961067d366004614210565b611734565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b6103756106b7366004614252565b611df0565b6104496106ca366004613fce565b6121d5565b61037561229f565b61030b6405ca1ab1e081565b6104496106f13660046142c7565b6122bb565b6007546103fd907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61039260e481565b61044961073c36600461436d565b612842565b6002546103c49073ffffffffffffffffffffffffffffffffffffffff1681565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b61030b635ca1ab1e81565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b6007546103fd9068010000000000000000900467ffffffffffffffff1681565b6104496107e83660046143a2565b6128d5565b6104496107fb36600461441a565b612ddd565b610392601b81565b6000546103c49062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156108bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e19190614466565b6007549091506000906109209067ffffffffffffffff7001000000000000000000000000000000008204811691680100000000000000009004166144ae565b67ffffffffffffffff1690508060000361093d5760009250505090565b61094781836144d6565b9250505090565b6004805461095b90614511565b80601f016020809104026020016040519081016040528092919081815260200182805461098790614511565b80156109d45780601f106109a9576101008083540402835291602001916109d4565b820191906000526020600020905b8154815290600101906020018083116109b757829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a4b576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a9e91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610b02576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b49576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd89190614564565b610c415760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c41576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461095b90614511565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610d29576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610cba565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610e0b576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610e2b5750600054600160ff909116105b80610e455750303b158015610e45575060005460ff166001145b610ed6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610f3457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff85161561112057610f5b85613612565b610f6486613722565b610f6d87613829565b604051602001610f7f93929190614586565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611040573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106491906145bf565b915091508163ffffffff166000146110dc576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff84161717905561111d565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b60095460009061116890889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685611df0565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120c9190614466565b90506000808483858f6112206001436145f9565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611369573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138d919061460c565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550886003908161141f9190614677565b50600461142c8982614677565b508c600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e6040516114cd93929190614791565b60405180910390a1505050505050801561153f57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611599576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611672576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff166116c1576040517fd40d91c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610cba565b60085473ffffffffffffffffffffffffffffffffffffffff1615801590611773575060085473ffffffffffffffffffffffffffffffffffffffff163314155b156117aa576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561181a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183e919061460c565b61184891906147d0565b67ffffffffffffffff16111561188a576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036118c6576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611902576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff68010000000000000000820481169161193d9184917001000000000000000000000000000000009004166147f1565b1115611975576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015611c1d5760008686838181106119ba576119ba614804565b90506020028101906119cc9190614833565b6119d590614871565b9050836119e1816148fa565b825180516020918201208185015160408087015160608801519151959a50929550600094611a4e948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114611ad7576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055611afc6001886145f9565b8403611b6b5742600760189054906101000a900467ffffffffffffffff168460400151611b2991906147d0565b67ffffffffffffffff161115611b6b576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc016040516020818303038152906040528051906020012094505050508080611c1590614921565b91505061199e565b50611c937f000000000000000000000000000000000000000000000000000000000000000084611c4b61082e565b611c559190614959565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016919061391c565b60058190556007805467ffffffffffffffff8416700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff9091161790556040517f9a908e7300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611d6d908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af1158015611d8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db0919061460c565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa600087604051602401611e2496959493929190614970565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff7000000000000000000000000000000000000000000000000000000001790528351909150606090600003611f755760f9601f8351611eb991906149d3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611f5f97969594939291906149ee565b6040516020818303038152906040529050612079565b815161ffff1015611fb2576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611fc16020836149d3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016120669796959493929190614ad1565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156120da573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612152576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906121989084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614bb4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461222c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610cba565b6040518060a0016040528060628152602001614d3e6062913981565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461232a576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff161580801561234a5750600054600160ff909116105b806123645750303b158015612364575060005460ff166001145b6123f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610ecd565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561244e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60006040518060a0016040528060628152602001614d3e606291399050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250d9190614466565b90506000878483858e6125216001436145f9565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af115801561266a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268e919061460c565b50600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8f81169190910291909117909155600280547fffffffffffffffffffffffff000000000000000000000000000000000000000016918d1691909117905560036127178b82614677565b5060046127248a82614677565b50600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8e161790556007805477ffffffffffffffffffffffffffffffffffffffffffffffff167a0697800000000000000000000000000000000000000000000000001790556040517f2bf779968f2cd549d28a94deec97630ab04362cb219c64664de7d2e21f3ccf46906127d690879085908f90614791565b60405180910390a15050505050801561153f57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611536565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612899576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036128a58282614677565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610cba9190613f1a565b60085473ffffffffffffffffffffffffffffffffffffffff1615801590612914575060085473ffffffffffffffffffffffffffffffffffffffff163314155b1561294b576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129da9190614564565b15612a11576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aa29190614466565b905081811115612ade576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612b1a576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b5c73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846139f5565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bed9190614466565b600780549192506801000000000000000090910467ffffffffffffffff16906008612c17836148fa565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612c4e929190614c10565b6040519081900390208142612c646001436145f9565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612d77576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612dd6565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612dcd9493929190614c20565b60405180910390a25b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612e2e576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003612e6a576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612ea6576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612f0e57600080fd5b505af1158015612f22573d6000803e3d6000fd5b5050505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fb79190614466565b600754600554919250429170010000000000000000000000000000000090910467ffffffffffffffff16908160005b868110156132e85760008a8a8381811061300257613002614804565b90506020028101906130149190614833565b61301d90614871565b8051805160209091012060408201519192509067ffffffffffffffff16156132025785613049816148fa565b9650506000818360200151846040015185606001516040516020016130ac9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114613135576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209550600660008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060009055506132d3565b8151516201d4c01015613241576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201526000609c82015260bc016040516020818303038152906040528051906020012094505b505080806132e090614921565b915050612fe6565b5060075467ffffffffffffffff680100000000000000009091048116908416111561333f576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff848116908316146133fd57600061336583866144ae565b905061337b67ffffffffffffffff8216836145f9565b91506133b47f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611c4b61082e565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6134fb337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa15801561348e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134b29190614466565b6134bc9190614959565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906139f5565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af115801561359b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135bf919061460c565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e766886040516135fd91815260200190565b60405180910390a25050505050505050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916136949190614c91565b600060405180830381855afa9150503d80600081146136cf576040519150601f19603f3d011682016040523d82523d6000602084013e6136d4565b606091505b509150915081613719576040518060400160405280600781526020017f4e4f5f4e414d45000000000000000000000000000000000000000000000000008152506121cd565b6121cd81613a59565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916137a49190614c91565b600060405180830381855afa9150503d80600081146137df576040519150601f19603f3d011682016040523d82523d6000602084013e6137e4565b606091505b509150915081613719576040518060400160405280600981526020017f4e4f5f53594d424f4c00000000000000000000000000000000000000000000008152506121cd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8616916138aa9190614c91565b600060405180830381855afa9150503d80600081146138e5576040519150601f19603f3d011682016040523d82523d6000602084013e6138ea565b606091505b50915091508180156138fd575080516020145b6139085760126121cd565b808060200190518101906121cd9190614ca3565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526139f09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613c2f565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052613a539085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161396e565b50505050565b60606040825110613a7e5781806020019051810190613a789190614cc6565b92915050565b8151602003613bf65760005b602081108015613ad15750828181518110613aa757613aa7614804565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613ae85780613ae081614921565b915050613a8a565b80600003613b2b57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115613b4657613b46613ffd565b6040519080825280601f01601f191660200182016040528015613b70576020820181803683370190505b50905060005b82811015613bee57848181518110613b9057613b90614804565b602001015160f81c60f81b828281518110613bad57613bad614804565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080613be681614921565b915050613b76565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b6000613c91826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613d3b9092919063ffffffff16565b8051909150156139f05780806020019051810190613caf9190614564565b6139f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610ecd565b60606121cd8484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051613d6f9190614c91565b60006040518083038185875af1925050503d8060008114613dac576040519150601f19603f3d011682016040523d82523d6000602084013e613db1565b606091505b5091509150613dc287838387613dcd565b979650505050505050565b60608315613e63578251600003613e5c5773ffffffffffffffffffffffffffffffffffffffff85163b613e5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ecd565b50816121cd565b6121cd8383815115613e785781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecd9190613f1a565b60005b83811015613ec7578181015183820152602001613eaf565b50506000910152565b60008151808452613ee8816020860160208601613eac565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613f2d6020830184613ed0565b9392505050565b67ffffffffffffffff81168114613f4a57600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613f4a57600080fd5b600080600060608486031215613f8457600080fd5b8335613f8f81613f34565b9250602084013591506040840135613fa681613f4d565b809150509250925092565b600060208284031215613fc357600080fd5b8135613f2d81613f34565b600060208284031215613fe057600080fd5b8135613f2d81613f4d565b63ffffffff81168114613f4a57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561407357614073613ffd565b604052919050565b600067ffffffffffffffff82111561409557614095613ffd565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126140d257600080fd5b81356140e56140e08261407b565b61402c565b8181528460208386010111156140fa57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561413057600080fd5b863561413b81613f4d565b9550602087013561414b81613f4d565b9450604087013561415b81613feb565b9350606087013561416b81613f4d565b9250608087013567ffffffffffffffff8082111561418857600080fd5b6141948a838b016140c1565b935060a08901359150808211156141aa57600080fd5b506141b789828a016140c1565b9150509295509295509295565b60008083601f8401126141d657600080fd5b50813567ffffffffffffffff8111156141ee57600080fd5b6020830191508360208260051b850101111561420957600080fd5b9250929050565b6000806020838503121561422357600080fd5b823567ffffffffffffffff81111561423a57600080fd5b614246858286016141c4565b90969095509350505050565b6000806000806080858703121561426857600080fd5b843561427381613feb565b9350602085013561428381613f4d565b9250604085013561429381613feb565b9150606085013567ffffffffffffffff8111156142af57600080fd5b6142bb878288016140c1565b91505092959194509250565b60008060008060008060c087890312156142e057600080fd5b86356142eb81613f4d565b955060208701356142fb81613f4d565b9450604087013567ffffffffffffffff8082111561431857600080fd5b6143248a838b016140c1565b9550606089013591508082111561433a57600080fd5b5061434789828a016140c1565b9350506080870135915060a087013561435f81613f34565b809150509295509295509295565b60006020828403121561437f57600080fd5b813567ffffffffffffffff81111561439657600080fd5b6121cd848285016140c1565b6000806000604084860312156143b757600080fd5b833567ffffffffffffffff808211156143cf57600080fd5b818601915086601f8301126143e357600080fd5b8135818111156143f257600080fd5b87602082850101111561440457600080fd5b6020928301989097509590910135949350505050565b60008060006040848603121561442f57600080fd5b833567ffffffffffffffff81111561444657600080fd5b614452868287016141c4565b9094509250506020840135613fa681613f4d565b60006020828403121561447857600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8281168282160390808211156144cf576144cf61447f565b5092915050565b60008261450c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061452557607f821691505b60208210810361455e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561457657600080fd5b81518015158114613f2d57600080fd5b6060815260006145996060830186613ed0565b82810360208401526145ab8186613ed0565b91505060ff83166040830152949350505050565b600080604083850312156145d257600080fd5b82516145dd81613feb565b60208401519092506145ee81613f4d565b809150509250929050565b81810381811115613a7857613a7861447f565b60006020828403121561461e57600080fd5b8151613f2d81613f34565b601f8211156139f057600081815260208120601f850160051c810160208610156146505750805b601f850160051c820191505b8181101561466f5782815560010161465c565b505050505050565b815167ffffffffffffffff81111561469157614691613ffd565b6146a58161469f8454614511565b84614629565b602080601f8311600181146146f857600084156146c25750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561466f565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561474557888601518255948401946001909101908401614726565b508582101561478157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006147a46060830186613ed0565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff8181168382160190808211156144cf576144cf61447f565b80820180821115613a7857613a7861447f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261486757600080fd5b9190910192915050565b60006080823603121561488357600080fd5b6040516080810167ffffffffffffffff82821081831117156148a7576148a7613ffd565b8160405284359150808211156148bc57600080fd5b506148c9368286016140c1565b8252506020830135602082015260408301356148e481613f34565b6040820152606092830135928101929092525090565b600067ffffffffffffffff8083168181036149175761491761447f565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149525761495261447f565b5060010190565b8082028115828204841417613a7857613a7861447f565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a08301526149c760c0830184613ed0565b98975050505050505050565b61ffff8181168382160190808211156144cf576144cf61447f565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614a57816003860160208c01613eac565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614a9a816017840160208b01613eac565b808201915050818660f81b16601782015284519150614ac0826018830160208801613eac565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614b3a816003860160208c01613eac565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614b7d816017840160208b01613eac565b808201915050818660f01b16601782015284519150614ba3826019830160208801613eac565b016019019998505050505050505050565b60008651614bc6818460208b01613eac565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b60008251614867818460208701613eac565b600060208284031215614cb557600080fd5b815160ff81168114613f2d57600080fd5b600060208284031215614cd857600080fd5b815167ffffffffffffffff811115614cef57600080fd5b8201601f81018413614d0057600080fd5b8051614d0e6140e08261407b565b818152856020838501011115614d2357600080fd5b614d34826020830160208601613eac565b9594505050505056fedf2a8080944d5cf5032b2a844602278b01199ed191a86c93ff80808210928080ba42034e163abcd726e65aac3b7c747e8d36cd473b2419910ffa3fb96c10b9df28e9b6f13e927dd66ab2281a5cdeb98cdb3d49d09be9ba1b1716535c650f012b1bffa264697066735822122009fb21d9c95081ff5eda7e3294010ff8501b88596d28a0c989dfb47c2a65229964736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102fe5760003560e01c80637a5460c51161019c578063c754c7ed116100ee578063e46761c411610097578063ecef3f9911610071578063ecef3f99146107ed578063f35dda4714610800578063f851a4401461080857600080fd5b8063e46761c414610793578063e7a7ed02146107ba578063eaeb077b146107da57600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610741578063d02103ca14610761578063d7bc90ff1461078857600080fd5b8063c754c7ed146106f6578063c7fffd4b14610726578063c89e42df1461072e57600080fd5b8063a3c573eb11610150578063af7f3e021161012a578063af7f3e02146106cf578063b0afe154146106d7578063bb590708146106e357600080fd5b8063a3c573eb14610682578063a652f26c146106a9578063ada8f919146106bc57600080fd5b806391cafe321161018157806391cafe32146106415780639e001877146106545780639f26f8401461066f57600080fd5b80637a5460c5146105fd5780638c3d73011461063957600080fd5b806340b5de6c11610255578063542028d5116102095780636e05d2cd116101e35780636e05d2cd146105ce5780636ff512cc146105d757806371257022146105ea57600080fd5b8063542028d51461059e578063676870d2146105a65780636b8616ce146105ae57600080fd5b806349b7b8021161023a57806349b7b802146105285780634e4877061461054f57806352bdeb6d1461056257600080fd5b806340b5de6c146104a8578063456052671461050057600080fd5b806326782247116102b757806332c2d1531161029157806332c2d153146104365780633c351e101461044b5780633cbc795b1461046b57600080fd5b806326782247146103a45780632a9f208f146103e95780632c111c061461041657600080fd5b806305835f37116102e857806305835f3714610339578063107bf28c1461038257806311e892d41461038a57600080fd5b8062d0295d14610303578063035089631461031e575b600080fd5b61030b61082e565b6040519081526020015b60405180910390f35b610326602081565b60405161ffff9091168152602001610315565b6103756040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516103159190613f1a565b61037561094e565b61039260f981565b60405160ff9091168152602001610315565b6001546103c49073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610315565b6007546103fd9067ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610315565b6008546103c49073ffffffffffffffffffffffffffffffffffffffff1681565b610449610444366004613f6f565b6109dc565b005b6009546103c49073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104939074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610315565b6104cf7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff000000000000000000000000000000000000000000000000000000000000009091168152602001610315565b6007546103fd90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b61044961055d366004613fb1565b610aab565b6103756040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610375610cc5565b610326601f81565b61030b6105bc366004613fb1565b60066020526000908152604090205481565b61030b60055481565b6104496105e5366004613fce565b610cd2565b6104496105f8366004614117565b610d9c565b6103756040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610449611548565b61044961064f366004613fce565b61161b565b6103c473a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b61044961067d366004614210565b611734565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b6103756106b7366004614252565b611df0565b6104496106ca366004613fce565b6121d5565b61037561229f565b61030b6405ca1ab1e081565b6104496106f13660046142c7565b6122bb565b6007546103fd907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b61039260e481565b61044961073c36600461436d565b612842565b6002546103c49073ffffffffffffffffffffffffffffffffffffffff1681565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b61030b635ca1ab1e81565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b6007546103fd9068010000000000000000900467ffffffffffffffff1681565b6104496107e83660046143a2565b6128d5565b6104496107fb36600461441a565b612ddd565b610392601b81565b6000546103c49062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156108bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e19190614466565b6007549091506000906109209067ffffffffffffffff7001000000000000000000000000000000008204811691680100000000000000009004166144ae565b67ffffffffffffffff1690508060000361093d5760009250505090565b61094781836144d6565b9250505090565b6004805461095b90614511565b80601f016020809104026020016040519081016040528092919081815260200182805461098790614511565b80156109d45780601f106109a9576101008083540402835291602001916109d4565b820191906000526020600020905b8154815290600101906020018083116109b757829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a4b576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a9e91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610b02576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b49576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd89190614564565b610c415760075467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610610c41576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461095b90614511565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610d29576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610cba565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610e0b576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610e2b5750600054600160ff909116105b80610e455750303b158015610e45575060005460ff166001145b610ed6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610f3457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff85161561112057610f5b85613612565b610f6486613722565b610f6d87613829565b604051602001610f7f93929190614586565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f318aee3d00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff878116600484015290925060009182917f0000000000000000000000000000000000000000000000000000000000000000169063318aee3d9060240160408051808303816000875af1158015611040573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106491906145bf565b915091508163ffffffff166000146110dc576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff84161717905561111d565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b60095460009061116890889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685611df0565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120c9190614466565b90506000808483858f6112206001436145f9565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611369573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138d919061460c565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550886003908161141f9190614677565b50600461142c8982614677565b508c600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e6040516114cd93929190614791565b60405180910390a1505050505050801561153f57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611599576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611672576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff166116c1576040517fd40d91c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610cba565b60085473ffffffffffffffffffffffffffffffffffffffff1615801590611773575060085473ffffffffffffffffffffffffffffffffffffffff163314155b156117aa576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561181a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183e919061460c565b61184891906147d0565b67ffffffffffffffff16111561188a576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190036118c6576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611902576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff68010000000000000000820481169161193d9184917001000000000000000000000000000000009004166147f1565b1115611975576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460055470010000000000000000000000000000000090910467ffffffffffffffff169060005b83811015611c1d5760008686838181106119ba576119ba614804565b90506020028101906119cc9190614833565b6119d590614871565b9050836119e1816148fa565b825180516020918201208185015160408087015160608801519151959a50929550600094611a4e948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114611ad7576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055611afc6001886145f9565b8403611b6b5742600760189054906101000a900467ffffffffffffffff168460400151611b2991906147d0565b67ffffffffffffffff161115611b6b576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc016040516020818303038152906040528051906020012094505050508080611c1590614921565b91505061199e565b50611c937f000000000000000000000000000000000000000000000000000000000000000084611c4b61082e565b611c559190614959565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016919061391c565b60058190556007805467ffffffffffffffff8416700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff9091161790556040517f9a908e7300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611d6d908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af1158015611d8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db0919061460c565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a2505050505050565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa600087604051602401611e2496959493929190614970565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff7000000000000000000000000000000000000000000000000000000001790528351909150606090600003611f755760f9601f8351611eb991906149d3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611f5f97969594939291906149ee565b6040516020818303038152906040529050612079565b815161ffff1015611fb2576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611fc16020836149d3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016120669796959493929190614ad1565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156120da573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612152576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516000906121989084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614bb4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461222c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610cba565b6040518060a0016040528060628152602001614d3e6062913981565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461232a576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff161580801561234a5750600054600160ff909116105b806123645750303b158015612364575060005460ff166001145b6123f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610ecd565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561244e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60006040518060a0016040528060628152602001614d3e606291399050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250d9190614466565b90506000878483858e6125216001436145f9565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af115801561266a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268e919061460c565b50600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8f81169190910291909117909155600280547fffffffffffffffffffffffff000000000000000000000000000000000000000016918d1691909117905560036127178b82614677565b5060046127248a82614677565b50600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8e161790556007805477ffffffffffffffffffffffffffffffffffffffffffffffff167a0697800000000000000000000000000000000000000000000000001790556040517f2bf779968f2cd549d28a94deec97630ab04362cb219c64664de7d2e21f3ccf46906127d690879085908f90614791565b60405180910390a15050505050801561153f57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611536565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314612899576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036128a58282614677565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610cba9190613f1a565b60085473ffffffffffffffffffffffffffffffffffffffff1615801590612914575060085473ffffffffffffffffffffffffffffffffffffffff163314155b1561294b576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129da9190614564565b15612a11576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aa29190614466565b905081811115612ade576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115612b1a576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b5c73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846139f5565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bed9190614466565b600780549192506801000000000000000090910467ffffffffffffffff16906008612c17836148fa565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051612c4e929190614c10565b6040519081900390208142612c646001436145f9565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152918152815160209283012060075468010000000000000000900467ffffffffffffffff1660009081526006909352912055323303612d77576007546040805183815233602082015260609181018290526000918101919091526801000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612dd6565b600760089054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612dcd9493929190614c20565b60405180910390a25b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612e2e576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003612e6a576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612ea6576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612f0e57600080fd5b505af1158015612f22573d6000803e3d6000fd5b5050505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fb79190614466565b600754600554919250429170010000000000000000000000000000000090910467ffffffffffffffff16908160005b868110156132e85760008a8a8381811061300257613002614804565b90506020028101906130149190614833565b61301d90614871565b8051805160209091012060408201519192509067ffffffffffffffff16156132025785613049816148fa565b9650506000818360200151846040015185606001516040516020016130ac9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114613135576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209550600660008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060009055506132d3565b8151516201d4c01015613241576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201526000609c82015260bc016040516020818303038152906040528051906020012094505b505080806132e090614921565b915050612fe6565b5060075467ffffffffffffffff680100000000000000009091048116908416111561333f576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff848116908316146133fd57600061336583866144ae565b905061337b67ffffffffffffffff8216836145f9565b91506133b47f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611c4b61082e565b50600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6134fb337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa15801561348e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134b29190614466565b6134bc9190614959565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906139f5565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af115801561359b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135bf919061460c565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e766886040516135fd91815260200190565b60405180910390a25050505050505050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916136949190614c91565b600060405180830381855afa9150503d80600081146136cf576040519150601f19603f3d011682016040523d82523d6000602084013e6136d4565b606091505b509150915081613719576040518060400160405280600781526020017f4e4f5f4e414d45000000000000000000000000000000000000000000000000008152506121cd565b6121cd81613a59565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916137a49190614c91565b600060405180830381855afa9150503d80600081146137df576040519150601f19603f3d011682016040523d82523d6000602084013e6137e4565b606091505b509150915081613719576040518060400160405280600981526020017f4e4f5f53594d424f4c00000000000000000000000000000000000000000000008152506121cd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8616916138aa9190614c91565b600060405180830381855afa9150503d80600081146138e5576040519150601f19603f3d011682016040523d82523d6000602084013e6138ea565b606091505b50915091508180156138fd575080516020145b6139085760126121cd565b808060200190518101906121cd9190614ca3565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526139f09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613c2f565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052613a539085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161396e565b50505050565b60606040825110613a7e5781806020019051810190613a789190614cc6565b92915050565b8151602003613bf65760005b602081108015613ad15750828181518110613aa757613aa7614804565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15613ae85780613ae081614921565b915050613a8a565b80600003613b2b57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff811115613b4657613b46613ffd565b6040519080825280601f01601f191660200182016040528015613b70576020820181803683370190505b50905060005b82811015613bee57848181518110613b9057613b90614804565b602001015160f81c60f81b828281518110613bad57613bad614804565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080613be681614921565b915050613b76565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b6000613c91826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613d3b9092919063ffffffff16565b8051909150156139f05780806020019051810190613caf9190614564565b6139f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610ecd565b60606121cd8484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051613d6f9190614c91565b60006040518083038185875af1925050503d8060008114613dac576040519150601f19603f3d011682016040523d82523d6000602084013e613db1565b606091505b5091509150613dc287838387613dcd565b979650505050505050565b60608315613e63578251600003613e5c5773ffffffffffffffffffffffffffffffffffffffff85163b613e5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ecd565b50816121cd565b6121cd8383815115613e785781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecd9190613f1a565b60005b83811015613ec7578181015183820152602001613eaf565b50506000910152565b60008151808452613ee8816020860160208601613eac565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613f2d6020830184613ed0565b9392505050565b67ffffffffffffffff81168114613f4a57600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613f4a57600080fd5b600080600060608486031215613f8457600080fd5b8335613f8f81613f34565b9250602084013591506040840135613fa681613f4d565b809150509250925092565b600060208284031215613fc357600080fd5b8135613f2d81613f34565b600060208284031215613fe057600080fd5b8135613f2d81613f4d565b63ffffffff81168114613f4a57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561407357614073613ffd565b604052919050565b600067ffffffffffffffff82111561409557614095613ffd565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126140d257600080fd5b81356140e56140e08261407b565b61402c565b8181528460208386010111156140fa57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561413057600080fd5b863561413b81613f4d565b9550602087013561414b81613f4d565b9450604087013561415b81613feb565b9350606087013561416b81613f4d565b9250608087013567ffffffffffffffff8082111561418857600080fd5b6141948a838b016140c1565b935060a08901359150808211156141aa57600080fd5b506141b789828a016140c1565b9150509295509295509295565b60008083601f8401126141d657600080fd5b50813567ffffffffffffffff8111156141ee57600080fd5b6020830191508360208260051b850101111561420957600080fd5b9250929050565b6000806020838503121561422357600080fd5b823567ffffffffffffffff81111561423a57600080fd5b614246858286016141c4565b90969095509350505050565b6000806000806080858703121561426857600080fd5b843561427381613feb565b9350602085013561428381613f4d565b9250604085013561429381613feb565b9150606085013567ffffffffffffffff8111156142af57600080fd5b6142bb878288016140c1565b91505092959194509250565b60008060008060008060c087890312156142e057600080fd5b86356142eb81613f4d565b955060208701356142fb81613f4d565b9450604087013567ffffffffffffffff8082111561431857600080fd5b6143248a838b016140c1565b9550606089013591508082111561433a57600080fd5b5061434789828a016140c1565b9350506080870135915060a087013561435f81613f34565b809150509295509295509295565b60006020828403121561437f57600080fd5b813567ffffffffffffffff81111561439657600080fd5b6121cd848285016140c1565b6000806000604084860312156143b757600080fd5b833567ffffffffffffffff808211156143cf57600080fd5b818601915086601f8301126143e357600080fd5b8135818111156143f257600080fd5b87602082850101111561440457600080fd5b6020928301989097509590910135949350505050565b60008060006040848603121561442f57600080fd5b833567ffffffffffffffff81111561444657600080fd5b614452868287016141c4565b9094509250506020840135613fa681613f4d565b60006020828403121561447857600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff8281168282160390808211156144cf576144cf61447f565b5092915050565b60008261450c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c9082168061452557607f821691505b60208210810361455e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561457657600080fd5b81518015158114613f2d57600080fd5b6060815260006145996060830186613ed0565b82810360208401526145ab8186613ed0565b91505060ff83166040830152949350505050565b600080604083850312156145d257600080fd5b82516145dd81613feb565b60208401519092506145ee81613f4d565b809150509250929050565b81810381811115613a7857613a7861447f565b60006020828403121561461e57600080fd5b8151613f2d81613f34565b601f8211156139f057600081815260208120601f850160051c810160208610156146505750805b601f850160051c820191505b8181101561466f5782815560010161465c565b505050505050565b815167ffffffffffffffff81111561469157614691613ffd565b6146a58161469f8454614511565b84614629565b602080601f8311600181146146f857600084156146c25750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561466f565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561474557888601518255948401946001909101908401614726565b508582101561478157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006147a46060830186613ed0565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff8181168382160190808211156144cf576144cf61447f565b80820180821115613a7857613a7861447f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261486757600080fd5b9190910192915050565b60006080823603121561488357600080fd5b6040516080810167ffffffffffffffff82821081831117156148a7576148a7613ffd565b8160405284359150808211156148bc57600080fd5b506148c9368286016140c1565b8252506020830135602082015260408301356148e481613f34565b6040820152606092830135928101929092525090565b600067ffffffffffffffff8083168181036149175761491761447f565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149525761495261447f565b5060010190565b8082028115828204841417613a7857613a7861447f565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a08301526149c760c0830184613ed0565b98975050505050505050565b61ffff8181168382160190808211156144cf576144cf61447f565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614a57816003860160208c01613eac565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614a9a816017840160208b01613eac565b808201915050818660f81b16601782015284519150614ac0826018830160208801613eac565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614b3a816003860160208c01613eac565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614b7d816017840160208b01613eac565b808201915050818660f01b16601782015284519150614ba3826019830160208801613eac565b016019019998505050505050505050565b60008651614bc6818460208b01613eac565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b60008251614867818460208701613eac565b600060208284031215614cb557600080fd5b815160ff81168114613f2d57600080fd5b600060208284031215614cd857600080fd5b815167ffffffffffffffff811115614cef57600080fd5b8201601f81018413614d0057600080fd5b8051614d0e6140e08261407b565b818152856020838501011115614d2357600080fd5b614d34826020830160208601613eac565b9594505050505056fedf2a8080944d5cf5032b2a844602278b01199ed191a86c93ff80808210928080ba42034e163abcd726e65aac3b7c747e8d36cd473b2419910ffa3fb96c10b9df28e9b6f13e927dd66ab2281a5cdeb98cdb3d49d09be9ba1b1716535c650f012b1bffa264697066735822122009fb21d9c95081ff5eda7e3294010ff8501b88596d28a0c989dfb47c2a65229964736f6c63430008140033", - "linkReferences": {}, - "deployedLinkReferences": {} -} From 9829c6f6bb8bb88f7d0a04d522a245556803e231 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 17 Jan 2024 13:31:18 +0100 Subject: [PATCH 151/230] update validium to sign only transactions --- .githooks/pre-commit | 2 +- .../paris/PolygonValidiumEtrog.json | 1262 +++++++++++++++++ .../validium/PolygonValidiumEtrog.sol | 40 +- contracts/v2/lib/PolygonRollupBaseEtrog.sol | 3 +- 4 files changed, 1292 insertions(+), 15 deletions(-) create mode 100644 compiled-contracts/paris/PolygonValidiumEtrog.json diff --git a/.githooks/pre-commit b/.githooks/pre-commit index 2bbaa264b..c58169835 100755 --- a/.githooks/pre-commit +++ b/.githooks/pre-commit @@ -34,7 +34,7 @@ if npm run lint; then cp artifacts/contracts/v2/consensus/zkEVM/PolygonZkEVMEtrog.sol/PolygonZkEVMEtrog.json compiled-contracts/ cp artifacts/contracts/v2/consensus/zkEVM/PolygonZkEVMExistentEtrog.sol/PolygonZkEVMExistentEtrog.json compiled-contracts/ - cp artifacts/contracts/v2/consensus/validium/PolygonValidium.sol/PolygonValidium.json compiled-contracts/ + cp artifacts/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol/PolygonValidiumEtrog.json compiled-contracts/ git add compiled-contracts exit 0 else diff --git a/compiled-contracts/paris/PolygonValidiumEtrog.json b/compiled-contracts/paris/PolygonValidiumEtrog.json new file mode 100644 index 000000000..b1f5559a7 --- /dev/null +++ b/compiled-contracts/paris/PolygonValidiumEtrog.json @@ -0,0 +1,1262 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonValidiumEtrog", + "sourceName": "contracts/v2/consensus/validium/PolygonValidiumEtrog.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRootV2", + "name": "_globalExitRootManager", + "type": "address" + }, + { + "internalType": "contract IERC20Upgradeable", + "name": "_pol", + "type": "address" + }, + { + "internalType": "contract IPolygonZkEVMBridgeV2", + "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": "ForceBatchesDecentralized", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchesNotAllowedOnEmergencyState", + "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": "HaltTimeoutNotExpiredAfterEmergencyState", + "type": "error" + }, + { + "inputs": [], + "name": "HugeTokenMetadataNotSupported", + "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": "SwitchToSameValue", + "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": [ + { + "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": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "lastGlobalExitRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "sequencer", + "type": "address" + } + ], + "name": "InitialSequenceBatches", + "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" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "l1InfoRoot", + "type": "bytes32" + } + ], + "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": "address", + "name": "newDataAvailabilityProtocol", + "type": "address" + } + ], + "name": "SetDataAvailabilityProtocol", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newForceBatchAddress", + "type": "address" + } + ], + "name": "SetForceBatchAddress", + "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": "GLOBAL_EXIT_ROOT_MANAGER_L2", + "outputs": [ + { + "internalType": "contract IBasePolygonZkEVMGlobalExitRoot", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_LIST_LEN_LEN", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS_EMPTY_METADATA", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_CONSTANT_BYTES", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_CONSTANT_BYTES_EMPTY_METADATA", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_DATA_LEN_EMPTY_METADATA", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "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": "admin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "bridgeAddress", + "outputs": [ + { + "internalType": "contract IPolygonZkEVMBridgeV2", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "calculatePolPerForceBatch", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "dataAvailabilityProtocol", + "outputs": [ + { + "internalType": "contract IDataAvailabilityProtocol", + "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": "forceBatchAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "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" + }, + { + "internalType": "bytes", + "name": "_gasTokenMetadata", + "type": "bytes" + } + ], + "name": "generateInitializeTransaction", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalExitRootManager", + "outputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRootV2", + "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": "string", + "name": "sequencerURL", + "type": "string" + }, + { + "internalType": "string", + "name": "_networkName", + "type": "string" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "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": "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": "forcedGlobalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "forcedTimestamp", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "forcedBlockHashL1", + "type": "bytes32" + } + ], + "internalType": "struct PolygonRollupBaseEtrog.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": "forcedGlobalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "forcedTimestamp", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "forcedBlockHashL1", + "type": "bytes32" + } + ], + "internalType": "struct PolygonValidiumEtrog.ValidiumBatchData[]", + "name": "batches", + "type": "tuple[]" + }, + { + "internalType": "address", + "name": "l2Coinbase", + "type": "address" + }, + { + "internalType": "bytes", + "name": "dataAvailabilityMessage", + "type": "bytes" + } + ], + "name": "sequenceBatchesValidium", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "forcedGlobalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "forcedTimestamp", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "forcedBlockHashL1", + "type": "bytes32" + } + ], + "internalType": "struct PolygonRollupBaseEtrog.BatchData[]", + "name": "batches", + "type": "tuple[]" + } + ], + "name": "sequenceForceBatches", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IDataAvailabilityProtocol", + "name": "newDataAvailabilityProtocol", + "type": "address" + } + ], + "name": "setDataAvailabilityProtocol", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newForceBatchAddress", + "type": "address" + } + ], + "name": "setForceBatchAddress", + "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": "0x61010060405234801562000011575f80fd5b5060405162004ea938038062004ea983398101604081905262000034916200006f565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d4565b6001600160a01b03811681146200006c575f80fd5b50565b5f805f806080858703121562000083575f80fd5b8451620000908162000057565b6020860151909450620000a38162000057565b6040860151909350620000b68162000057565b6060860151909250620000c98162000057565b939692955090935050565b60805160a05160c05160e051614cc8620001e15f395f818161052801528181610f8c015281816110880152818161111501528181611137015281816112e7015281816114530152818161169b01528181611c6e015281816121d201528181612621015281816126ce01528181612e1501528181612eda01528181613980015281816139f901528181613a1b0152613ac301525f81816106c901528181610ac40152818161188f0152818161196401528181612898015281816129a001526134cb01525f818161078d01528181610b4001528181611ae501528181613022015261354701525f81816107bf015281816108af01528181610fdf015281816111e30152612ff70152614cc85ff3fe608060405234801561000f575f80fd5b5060043610610303575f3560e01c80637a5460c51161019d578063c7fffd4b116100e8578063e57a0b4c11610093578063ecef3f991161006e578063ecef3f9914610828578063f35dda471461083b578063f851a44014610843575f80fd5b8063e57a0b4c146107e1578063e7a7ed0214610801578063eaeb077b14610815575f80fd5b8063d02103ca116100c3578063d02103ca14610788578063d7bc90ff146107af578063e46761c4146107ba575f80fd5b8063c7fffd4b1461074d578063c89e42df14610755578063cfa8ed4714610768575f80fd5b8063a3c573eb11610148578063ada8f91911610123578063ada8f91914610706578063b0afe15414610719578063c754c7ed14610725575f80fd5b8063a3c573eb146106c4578063a652f26c146106eb578063aa3587d3146106fe575f80fd5b806391cafe321161017857806391cafe32146106835780639e001877146106965780639f26f840146106b1575f80fd5b80637a5460c51461062c5780637cd76b8b146106685780638c3d73011461067b575f80fd5b806340b5de6c1161025d578063542028d5116102085780636e05d2cd116101e35780636e05d2cd146105fd5780636ff512cc146106065780637125702214610619575f80fd5b8063542028d5146105ce578063676870d2146105d65780636b8616ce146105de575f80fd5b80634c21fef3116102385780634c21fef31461054a5780634e4877061461057f57806352bdeb6d14610592575f80fd5b806340b5de6c1461049257806345605267146104ea57806349b7b80214610523575f80fd5b806326782247116102bd57806332c2d1531161029857806332c2d153146104225780633c351e10146104355780633cbc795b14610455575f80fd5b806326782247146103a85780632c111c06146103ed5780632d72c2481461040d575f80fd5b806305835f37116102ed57806305835f371461033d578063107bf28c1461038657806311e892d41461038e575f80fd5b8062d0295d146103075780630350896314610322575b5f80fd5b61030f610868565b6040519081526020015b60405180910390f35b61032a602081565b60405161ffff9091168152602001610319565b6103796040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516103199190613e76565b61037961096e565b61039660f981565b60405160ff9091168152602001610319565b6001546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610319565b6008546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b61042061041b366004613f08565b6109fa565b005b610420610430366004613fc6565b6112e5565b6009546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b60095461047d9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610319565b6104b97fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff000000000000000000000000000000000000000000000000000000000000009091168152602001610319565b60075461050a9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610319565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b600a5461056f9074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001610319565b61042061058d366004614005565b6113b4565b6103796040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b6103796115c3565b61032a601f81565b61030f6105ec366004614005565b60066020525f908152604090205481565b61030f60055481565b610420610614366004614020565b6115d0565b610420610627366004614188565b611699565b6103796040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610420610676366004614020565b611ea3565b610420611f6c565b610420610691366004614020565b61203e565b6103c873a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6104206106bf366004614270565b612156565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b6103796106f93660046142af565b61279a565b610420612b78565b610420610714366004614020565b612c43565b61030f6405ca1ab1e081565b60075461050a90700100000000000000000000000000000000900467ffffffffffffffff1681565b61039660e481565b610420610763366004614320565b612d0c565b6002546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b61030f635ca1ab1e81565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b600a546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b60075461050a9067ffffffffffffffff1681565b610420610823366004614352565b612d9e565b61042061083636600461439a565b613265565b610396601b81565b5f546103c89062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156108f4573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091891906143e2565b6007549091505f906109429067ffffffffffffffff68010000000000000000820481169116614426565b67ffffffffffffffff169050805f0361095d575f9250505090565b610967818361444e565b9250505090565b6004805461097b90614486565b80601f01602080910402602001604051908101604052809291908181526020018280546109a790614486565b80156109f25780601f106109c9576101008083540402835291602001916109f2565b820191905f5260205f20905b8154815290600101906020018083116109d557829003601f168201915b505050505081565b60025473ffffffffffffffffffffffffffffffffffffffff163314610a4b576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835f819003610a86576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610ac2576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610b27575f80fd5b505af1158015610b39573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ba7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bcb91906143e2565b60075460055491925068010000000000000000900467ffffffffffffffff1690815f805b86811015610eff575f8c8c83818110610c0a57610c0a6144d7565b905060800201803603810190610c209190614504565b604081015190915067ffffffffffffffff1615610e0d5785610c4181614550565b9650505f815f0151826020015183604001518460600151604051602001610ca69493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114610d2e576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85825f0151836020015184604001518f8660600151604051602001610dc7969594939291909586526020860194909452604085019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060808501919091521b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166068830152607c820152609c0190565b60405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550610eec565b8051604051610e29918591602001918252602082015260400190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152828252805160209182012084519184018990529183015260608083018a90524260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401528d901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888301525f609c830152935060bc016040516020818303038152906040528051906020012094505b5080610ef781614576565b915050610bef565b5060075467ffffffffffffffff9081169085161115610f4a576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058390558567ffffffffffffffff85811690841614611047575f610f6f8487614426565b9050610f8567ffffffffffffffff8216836145ad565b91506110067f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16610fbe610868565b610fc891906145c6565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691906132c9565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8816021790555b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018590525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af11580156110e3573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061110791906145dd565b905081156112925761120b337f0000000000000000000000000000000000000000000000000000000000000000847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa15801561119e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111c291906143e2565b6111cc91906145c6565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692919061339d565b600a546040517f3b51be4b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690633b51be4b906112659086908e908e9060040161463f565b5f6040518083038186803b15801561127b575f80fd5b505afa15801561128d573d5f803e3d5ffd5b505050505b8067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e766886040516112ce91815260200190565b60405180910390a250505050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611354576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966846040516113a791815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff16331461140a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611451576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114ba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114de9190614661565b61153f5760075467ffffffffffffffff70010000000000000000000000000000000090910481169082161061153f576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461097b90614486565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611626576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016115b8565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611708576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff161580801561172657505f54600160ff909116105b8061173f5750303b15801561173f57505f5460ff166001145b6117d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561182c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611a8a576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa1580156118d3573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526119189190810190614680565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d9060240160408051808303815f875af11580156119ab573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119cf91906146e9565b915091508163ffffffff165f14611a46576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055611a87565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b6009545f90611ad190889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff168561279a565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b7091906143e2565b90505f808483858f611b836001436145ad565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611cc9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ced91906145dd565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611d7d9190614766565b506004611d8a8982614766565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611e2a9392919061487e565b60405180910390a15050505050508015611e9a575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611ef9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fd331bd4c4cd1afecb94a225184bded161ff3213624ba4fb58c4f30c5a861144a906020016115b8565b60015473ffffffffffffffffffffffffffffffffffffffff163314611fbd576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612094576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff166120e3576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb906020016115b8565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590612194575073ffffffffffffffffffffffffffffffffffffffff81163314155b156121cb576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612239573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061225d91906145dd565b61226791906148bc565b67ffffffffffffffff1611156122a9576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f8190036122e4576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612320576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff80821691612348918491680100000000000000009004166148dd565b1115612380576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b8381101561261b575f8787838181106123bb576123bb6144d7565b90506020028101906123cd91906148f0565b6123d69061492c565b9050836123e281614550565b825180516020918201208185015160408087015160608801519151959a509295505f9461244e948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152600690935291205490915081146124d6576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f908152600660205260408120556124fa6001886145ad565b84036125695742600760109054906101000a900467ffffffffffffffff16846040015161252791906148bc565b67ffffffffffffffff161115612569576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209450505050808061261390614576565b9150506123a0565b506126497f000000000000000000000000000000000000000000000000000000000000000084610fbe610868565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e739061271a908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af1158015612736573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061275a91906145dd565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f876040516024016127cc96959493929190614997565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f0361291c5760f9601f835161286091906149f9565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e4876040516020016129069796959493929190614a14565b6040516020818303038152906040529050612a20565b815161ffff1015612959576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96129686020836149f9565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001612a0d9796959493929190614af6565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015612a7e573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612af6576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f90612b3b9084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614bd8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612bce576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff8116740100000000000000000000000000000000000000009182900460ff16159091021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f41905f90a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612c99576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016115b8565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612d62576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003612d6e8282614766565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516115b89190613e76565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590612ddc575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612e13576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e7c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ea09190614661565b15612ed7576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f41573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f6591906143e2565b905082811115612fa1576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388841115612fdd576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61301f73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308461339d565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613089573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130ad91906143e2565b6007805491925067ffffffffffffffff909116905f6130cb83614550565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051613102929190614c33565b60405190819003902081426131186001436145ad565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f908152600690935291205532330361320e576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a261325d565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319061325490849033908b908b90614c42565b60405180910390a25b505050505050565b600a5474010000000000000000000000000000000000000000900460ff166132b9576040517f821935b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6132c4838383613401565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526132c49084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613b95565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526133fb9085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161331b565b50505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314613452576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361348d576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156134c9576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561352e575f80fd5b505af1158015613540573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135d291906143e2565b60075460055491925042916801000000000000000090910467ffffffffffffffff1690815f5b868110156138f3575f8a8a83818110613613576136136144d7565b905060200281019061362591906148f0565b61362e9061492c565b8051805160209091012060408201519192509067ffffffffffffffff161561380e578561365a81614550565b9650505f818360200151846040015185606001516040516020016136bc9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114613744576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f9055506138de565b8151516201d4c0101561384d576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b505080806138eb90614576565b9150506135f8565b5060075467ffffffffffffffff908116908416111561393e576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff848116908316146139f3575f6139638386614426565b905061397967ffffffffffffffff8216836145ad565b91506139b27f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16610fbe610868565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b613a82337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa15801561119e573d5f803e3d5ffd5b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015613b1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b4291906145dd565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e76688604051613b8091815260200190565b60405180910390a25050505050505050505050565b5f613bf6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613ca09092919063ffffffff16565b8051909150156132c45780806020019051810190613c149190614661565b6132c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016117c7565b6060612b7084845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051613cd29190614c81565b5f6040518083038185875af1925050503d805f8114613d0c576040519150601f19603f3d011682016040523d82523d5f602084013e613d11565b606091505b5091509150613d2287838387613d2d565b979650505050505050565b60608315613dc25782515f03613dbb5773ffffffffffffffffffffffffffffffffffffffff85163b613dbb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016117c7565b5081612b70565b612b708383815115613dd75781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c79190613e76565b5f5b83811015613e25578181015183820152602001613e0d565b50505f910152565b5f8151808452613e44816020860160208601613e0b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f613e886020830184613e2d565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81168114613eb0575f80fd5b50565b8035613ebe81613e8f565b919050565b5f8083601f840112613ed3575f80fd5b50813567ffffffffffffffff811115613eea575f80fd5b602083019150836020828501011115613f01575f80fd5b9250929050565b5f805f805f60608688031215613f1c575f80fd5b853567ffffffffffffffff80821115613f33575f80fd5b818801915088601f830112613f46575f80fd5b813581811115613f54575f80fd5b8960208260071b8501011115613f68575f80fd5b60208301975080965050613f7e60208901613eb3565b94506040880135915080821115613f93575f80fd5b50613fa088828901613ec3565b969995985093965092949392505050565b67ffffffffffffffff81168114613eb0575f80fd5b5f805f60608486031215613fd8575f80fd5b8335613fe381613fb1565b9250602084013591506040840135613ffa81613e8f565b809150509250925092565b5f60208284031215614015575f80fd5b8135613e8881613fb1565b5f60208284031215614030575f80fd5b8135613e8881613e8f565b63ffffffff81168114613eb0575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516080810167ffffffffffffffff8111828210171561409c5761409c61404c565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156140e9576140e961404c565b604052919050565b5f67ffffffffffffffff82111561410a5761410a61404c565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112614145575f80fd5b8135614158614153826140f1565b6140a2565b81815284602083860101111561416c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c0878903121561419d575f80fd5b86356141a881613e8f565b955060208701356141b881613e8f565b945060408701356141c88161403b565b935060608701356141d881613e8f565b9250608087013567ffffffffffffffff808211156141f4575f80fd5b6142008a838b01614136565b935060a0890135915080821115614215575f80fd5b5061422289828a01614136565b9150509295509295509295565b5f8083601f84011261423f575f80fd5b50813567ffffffffffffffff811115614256575f80fd5b6020830191508360208260051b8501011115613f01575f80fd5b5f8060208385031215614281575f80fd5b823567ffffffffffffffff811115614297575f80fd5b6142a38582860161422f565b90969095509350505050565b5f805f80608085870312156142c2575f80fd5b84356142cd8161403b565b935060208501356142dd81613e8f565b925060408501356142ed8161403b565b9150606085013567ffffffffffffffff811115614308575f80fd5b61431487828801614136565b91505092959194509250565b5f60208284031215614330575f80fd5b813567ffffffffffffffff811115614346575f80fd5b612b7084828501614136565b5f805f60408486031215614364575f80fd5b833567ffffffffffffffff81111561437a575f80fd5b61438686828701613ec3565b909790965060209590950135949350505050565b5f805f604084860312156143ac575f80fd5b833567ffffffffffffffff8111156143c2575f80fd5b6143ce8682870161422f565b9094509250506020840135613ffa81613e8f565b5f602082840312156143f2575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff828116828216039080821115614447576144476143f9565b5092915050565b5f82614481577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c9082168061449a57607f821691505b6020821081036144d1577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60808284031215614514575f80fd5b61451c614079565b8235815260208301356020820152604083013561453881613fb1565b60408201526060928301359281019290925250919050565b5f67ffffffffffffffff80831681810361456c5761456c6143f9565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036145a6576145a66143f9565b5060010190565b818103818111156145c0576145c06143f9565b92915050565b80820281158282048414176145c0576145c06143f9565b5f602082840312156145ed575f80fd5b8151613e8881613fb1565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201525f6146586040830184866145f8565b95945050505050565b5f60208284031215614671575f80fd5b81518015158114613e88575f80fd5b5f60208284031215614690575f80fd5b815167ffffffffffffffff8111156146a6575f80fd5b8201601f810184136146b6575f80fd5b80516146c4614153826140f1565b8181528560208385010111156146d8575f80fd5b614658826020830160208601613e0b565b5f80604083850312156146fa575f80fd5b82516147058161403b565b602084015190925061471681613e8f565b809150509250929050565b601f8211156132c4575f81815260208120601f850160051c810160208610156147475750805b601f850160051c820191505b8181101561325d57828155600101614753565b815167ffffffffffffffff8111156147805761478061404c565b6147948161478e8454614486565b84614721565b602080601f8311600181146147e6575f84156147b05750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561325d565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561483257888601518255948401946001909101908401614813565b508582101561486e57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f6148906060830186613e2d565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff818116838216019080821115614447576144476143f9565b808201808211156145c0576145c06143f9565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112614922575f80fd5b9190910192915050565b5f6080823603121561493c575f80fd5b614944614079565b823567ffffffffffffffff81111561495a575f80fd5b61496636828601614136565b82525060208301356020820152604083013561498181613fb1565b6040820152606092830135928101929092525090565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a08301526149ed60c0830184613e2d565b98975050505050505050565b61ffff818116838216019080821115614447576144476143f9565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614a7c816003860160208c01613e0b565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614abf816017840160208b01613e0b565b808201915050818660f81b16601782015284519150614ae5826018830160208801613e0b565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614b5e816003860160208c01613e0b565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614ba1816017840160208b01613e0b565b808201915050818660f01b16601782015284519150614bc7826019830160208801613e0b565b016019019998505050505050505050565b5f8651614be9818460208b01613e0b565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f614c776060830184866145f8565b9695505050505050565b5f8251614922818460208701613e0b56fea264697066735822122083bc8bb96aaeda2496c47238debfe8c1a6420b24ae2e54109a8746c96a57b88964736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610303575f3560e01c80637a5460c51161019d578063c7fffd4b116100e8578063e57a0b4c11610093578063ecef3f991161006e578063ecef3f9914610828578063f35dda471461083b578063f851a44014610843575f80fd5b8063e57a0b4c146107e1578063e7a7ed0214610801578063eaeb077b14610815575f80fd5b8063d02103ca116100c3578063d02103ca14610788578063d7bc90ff146107af578063e46761c4146107ba575f80fd5b8063c7fffd4b1461074d578063c89e42df14610755578063cfa8ed4714610768575f80fd5b8063a3c573eb11610148578063ada8f91911610123578063ada8f91914610706578063b0afe15414610719578063c754c7ed14610725575f80fd5b8063a3c573eb146106c4578063a652f26c146106eb578063aa3587d3146106fe575f80fd5b806391cafe321161017857806391cafe32146106835780639e001877146106965780639f26f840146106b1575f80fd5b80637a5460c51461062c5780637cd76b8b146106685780638c3d73011461067b575f80fd5b806340b5de6c1161025d578063542028d5116102085780636e05d2cd116101e35780636e05d2cd146105fd5780636ff512cc146106065780637125702214610619575f80fd5b8063542028d5146105ce578063676870d2146105d65780636b8616ce146105de575f80fd5b80634c21fef3116102385780634c21fef31461054a5780634e4877061461057f57806352bdeb6d14610592575f80fd5b806340b5de6c1461049257806345605267146104ea57806349b7b80214610523575f80fd5b806326782247116102bd57806332c2d1531161029857806332c2d153146104225780633c351e10146104355780633cbc795b14610455575f80fd5b806326782247146103a85780632c111c06146103ed5780632d72c2481461040d575f80fd5b806305835f37116102ed57806305835f371461033d578063107bf28c1461038657806311e892d41461038e575f80fd5b8062d0295d146103075780630350896314610322575b5f80fd5b61030f610868565b6040519081526020015b60405180910390f35b61032a602081565b60405161ffff9091168152602001610319565b6103796040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516103199190613e76565b61037961096e565b61039660f981565b60405160ff9091168152602001610319565b6001546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610319565b6008546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b61042061041b366004613f08565b6109fa565b005b610420610430366004613fc6565b6112e5565b6009546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b60095461047d9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610319565b6104b97fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff000000000000000000000000000000000000000000000000000000000000009091168152602001610319565b60075461050a9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610319565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b600a5461056f9074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001610319565b61042061058d366004614005565b6113b4565b6103796040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b6103796115c3565b61032a601f81565b61030f6105ec366004614005565b60066020525f908152604090205481565b61030f60055481565b610420610614366004614020565b6115d0565b610420610627366004614188565b611699565b6103796040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610420610676366004614020565b611ea3565b610420611f6c565b610420610691366004614020565b61203e565b6103c873a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6104206106bf366004614270565b612156565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b6103796106f93660046142af565b61279a565b610420612b78565b610420610714366004614020565b612c43565b61030f6405ca1ab1e081565b60075461050a90700100000000000000000000000000000000900467ffffffffffffffff1681565b61039660e481565b610420610763366004614320565b612d0c565b6002546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b61030f635ca1ab1e81565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b600a546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b60075461050a9067ffffffffffffffff1681565b610420610823366004614352565b612d9e565b61042061083636600461439a565b613265565b610396601b81565b5f546103c89062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156108f4573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091891906143e2565b6007549091505f906109429067ffffffffffffffff68010000000000000000820481169116614426565b67ffffffffffffffff169050805f0361095d575f9250505090565b610967818361444e565b9250505090565b6004805461097b90614486565b80601f01602080910402602001604051908101604052809291908181526020018280546109a790614486565b80156109f25780601f106109c9576101008083540402835291602001916109f2565b820191905f5260205f20905b8154815290600101906020018083116109d557829003601f168201915b505050505081565b60025473ffffffffffffffffffffffffffffffffffffffff163314610a4b576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835f819003610a86576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610ac2576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610b27575f80fd5b505af1158015610b39573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ba7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bcb91906143e2565b60075460055491925068010000000000000000900467ffffffffffffffff1690815f805b86811015610eff575f8c8c83818110610c0a57610c0a6144d7565b905060800201803603810190610c209190614504565b604081015190915067ffffffffffffffff1615610e0d5785610c4181614550565b9650505f815f0151826020015183604001518460600151604051602001610ca69493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114610d2e576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85825f0151836020015184604001518f8660600151604051602001610dc7969594939291909586526020860194909452604085019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060808501919091521b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166068830152607c820152609c0190565b60405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550610eec565b8051604051610e29918591602001918252602082015260400190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152828252805160209182012084519184018990529183015260608083018a90524260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401528d901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888301525f609c830152935060bc016040516020818303038152906040528051906020012094505b5080610ef781614576565b915050610bef565b5060075467ffffffffffffffff9081169085161115610f4a576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058390558567ffffffffffffffff85811690841614611047575f610f6f8487614426565b9050610f8567ffffffffffffffff8216836145ad565b91506110067f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16610fbe610868565b610fc891906145c6565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691906132c9565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8816021790555b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018590525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af11580156110e3573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061110791906145dd565b905081156112925761120b337f0000000000000000000000000000000000000000000000000000000000000000847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa15801561119e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111c291906143e2565b6111cc91906145c6565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692919061339d565b600a546040517f3b51be4b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690633b51be4b906112659086908e908e9060040161463f565b5f6040518083038186803b15801561127b575f80fd5b505afa15801561128d573d5f803e3d5ffd5b505050505b8067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e766886040516112ce91815260200190565b60405180910390a250505050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611354576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966846040516113a791815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff16331461140a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611451576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114ba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114de9190614661565b61153f5760075467ffffffffffffffff70010000000000000000000000000000000090910481169082161061153f576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461097b90614486565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611626576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016115b8565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611708576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff161580801561172657505f54600160ff909116105b8061173f5750303b15801561173f57505f5460ff166001145b6117d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561182c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611a8a576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa1580156118d3573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526119189190810190614680565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d9060240160408051808303815f875af11580156119ab573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119cf91906146e9565b915091508163ffffffff165f14611a46576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055611a87565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b6009545f90611ad190889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff168561279a565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b7091906143e2565b90505f808483858f611b836001436145ad565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611cc9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ced91906145dd565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611d7d9190614766565b506004611d8a8982614766565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611e2a9392919061487e565b60405180910390a15050505050508015611e9a575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611ef9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fd331bd4c4cd1afecb94a225184bded161ff3213624ba4fb58c4f30c5a861144a906020016115b8565b60015473ffffffffffffffffffffffffffffffffffffffff163314611fbd576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612094576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff166120e3576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb906020016115b8565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590612194575073ffffffffffffffffffffffffffffffffffffffff81163314155b156121cb576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612239573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061225d91906145dd565b61226791906148bc565b67ffffffffffffffff1611156122a9576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f8190036122e4576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612320576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff80821691612348918491680100000000000000009004166148dd565b1115612380576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b8381101561261b575f8787838181106123bb576123bb6144d7565b90506020028101906123cd91906148f0565b6123d69061492c565b9050836123e281614550565b825180516020918201208185015160408087015160608801519151959a509295505f9461244e948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152600690935291205490915081146124d6576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f908152600660205260408120556124fa6001886145ad565b84036125695742600760109054906101000a900467ffffffffffffffff16846040015161252791906148bc565b67ffffffffffffffff161115612569576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209450505050808061261390614576565b9150506123a0565b506126497f000000000000000000000000000000000000000000000000000000000000000084610fbe610868565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e739061271a908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af1158015612736573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061275a91906145dd565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f876040516024016127cc96959493929190614997565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f0361291c5760f9601f835161286091906149f9565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e4876040516020016129069796959493929190614a14565b6040516020818303038152906040529050612a20565b815161ffff1015612959576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96129686020836149f9565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001612a0d9796959493929190614af6565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015612a7e573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612af6576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f90612b3b9084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614bd8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612bce576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff8116740100000000000000000000000000000000000000009182900460ff16159091021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f41905f90a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612c99576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016115b8565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612d62576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003612d6e8282614766565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516115b89190613e76565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590612ddc575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612e13576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e7c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ea09190614661565b15612ed7576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f41573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f6591906143e2565b905082811115612fa1576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388841115612fdd576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61301f73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308461339d565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613089573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130ad91906143e2565b6007805491925067ffffffffffffffff909116905f6130cb83614550565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051613102929190614c33565b60405190819003902081426131186001436145ad565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f908152600690935291205532330361320e576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a261325d565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319061325490849033908b908b90614c42565b60405180910390a25b505050505050565b600a5474010000000000000000000000000000000000000000900460ff166132b9576040517f821935b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6132c4838383613401565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526132c49084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613b95565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526133fb9085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161331b565b50505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314613452576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361348d576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156134c9576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561352e575f80fd5b505af1158015613540573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135d291906143e2565b60075460055491925042916801000000000000000090910467ffffffffffffffff1690815f5b868110156138f3575f8a8a83818110613613576136136144d7565b905060200281019061362591906148f0565b61362e9061492c565b8051805160209091012060408201519192509067ffffffffffffffff161561380e578561365a81614550565b9650505f818360200151846040015185606001516040516020016136bc9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114613744576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f9055506138de565b8151516201d4c0101561384d576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b505080806138eb90614576565b9150506135f8565b5060075467ffffffffffffffff908116908416111561393e576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff848116908316146139f3575f6139638386614426565b905061397967ffffffffffffffff8216836145ad565b91506139b27f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16610fbe610868565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b613a82337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa15801561119e573d5f803e3d5ffd5b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015613b1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b4291906145dd565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e76688604051613b8091815260200190565b60405180910390a25050505050505050505050565b5f613bf6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613ca09092919063ffffffff16565b8051909150156132c45780806020019051810190613c149190614661565b6132c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016117c7565b6060612b7084845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051613cd29190614c81565b5f6040518083038185875af1925050503d805f8114613d0c576040519150601f19603f3d011682016040523d82523d5f602084013e613d11565b606091505b5091509150613d2287838387613d2d565b979650505050505050565b60608315613dc25782515f03613dbb5773ffffffffffffffffffffffffffffffffffffffff85163b613dbb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016117c7565b5081612b70565b612b708383815115613dd75781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c79190613e76565b5f5b83811015613e25578181015183820152602001613e0d565b50505f910152565b5f8151808452613e44816020860160208601613e0b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f613e886020830184613e2d565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81168114613eb0575f80fd5b50565b8035613ebe81613e8f565b919050565b5f8083601f840112613ed3575f80fd5b50813567ffffffffffffffff811115613eea575f80fd5b602083019150836020828501011115613f01575f80fd5b9250929050565b5f805f805f60608688031215613f1c575f80fd5b853567ffffffffffffffff80821115613f33575f80fd5b818801915088601f830112613f46575f80fd5b813581811115613f54575f80fd5b8960208260071b8501011115613f68575f80fd5b60208301975080965050613f7e60208901613eb3565b94506040880135915080821115613f93575f80fd5b50613fa088828901613ec3565b969995985093965092949392505050565b67ffffffffffffffff81168114613eb0575f80fd5b5f805f60608486031215613fd8575f80fd5b8335613fe381613fb1565b9250602084013591506040840135613ffa81613e8f565b809150509250925092565b5f60208284031215614015575f80fd5b8135613e8881613fb1565b5f60208284031215614030575f80fd5b8135613e8881613e8f565b63ffffffff81168114613eb0575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516080810167ffffffffffffffff8111828210171561409c5761409c61404c565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156140e9576140e961404c565b604052919050565b5f67ffffffffffffffff82111561410a5761410a61404c565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112614145575f80fd5b8135614158614153826140f1565b6140a2565b81815284602083860101111561416c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c0878903121561419d575f80fd5b86356141a881613e8f565b955060208701356141b881613e8f565b945060408701356141c88161403b565b935060608701356141d881613e8f565b9250608087013567ffffffffffffffff808211156141f4575f80fd5b6142008a838b01614136565b935060a0890135915080821115614215575f80fd5b5061422289828a01614136565b9150509295509295509295565b5f8083601f84011261423f575f80fd5b50813567ffffffffffffffff811115614256575f80fd5b6020830191508360208260051b8501011115613f01575f80fd5b5f8060208385031215614281575f80fd5b823567ffffffffffffffff811115614297575f80fd5b6142a38582860161422f565b90969095509350505050565b5f805f80608085870312156142c2575f80fd5b84356142cd8161403b565b935060208501356142dd81613e8f565b925060408501356142ed8161403b565b9150606085013567ffffffffffffffff811115614308575f80fd5b61431487828801614136565b91505092959194509250565b5f60208284031215614330575f80fd5b813567ffffffffffffffff811115614346575f80fd5b612b7084828501614136565b5f805f60408486031215614364575f80fd5b833567ffffffffffffffff81111561437a575f80fd5b61438686828701613ec3565b909790965060209590950135949350505050565b5f805f604084860312156143ac575f80fd5b833567ffffffffffffffff8111156143c2575f80fd5b6143ce8682870161422f565b9094509250506020840135613ffa81613e8f565b5f602082840312156143f2575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff828116828216039080821115614447576144476143f9565b5092915050565b5f82614481577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c9082168061449a57607f821691505b6020821081036144d1577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60808284031215614514575f80fd5b61451c614079565b8235815260208301356020820152604083013561453881613fb1565b60408201526060928301359281019290925250919050565b5f67ffffffffffffffff80831681810361456c5761456c6143f9565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036145a6576145a66143f9565b5060010190565b818103818111156145c0576145c06143f9565b92915050565b80820281158282048414176145c0576145c06143f9565b5f602082840312156145ed575f80fd5b8151613e8881613fb1565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201525f6146586040830184866145f8565b95945050505050565b5f60208284031215614671575f80fd5b81518015158114613e88575f80fd5b5f60208284031215614690575f80fd5b815167ffffffffffffffff8111156146a6575f80fd5b8201601f810184136146b6575f80fd5b80516146c4614153826140f1565b8181528560208385010111156146d8575f80fd5b614658826020830160208601613e0b565b5f80604083850312156146fa575f80fd5b82516147058161403b565b602084015190925061471681613e8f565b809150509250929050565b601f8211156132c4575f81815260208120601f850160051c810160208610156147475750805b601f850160051c820191505b8181101561325d57828155600101614753565b815167ffffffffffffffff8111156147805761478061404c565b6147948161478e8454614486565b84614721565b602080601f8311600181146147e6575f84156147b05750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561325d565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561483257888601518255948401946001909101908401614813565b508582101561486e57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f6148906060830186613e2d565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff818116838216019080821115614447576144476143f9565b808201808211156145c0576145c06143f9565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112614922575f80fd5b9190910192915050565b5f6080823603121561493c575f80fd5b614944614079565b823567ffffffffffffffff81111561495a575f80fd5b61496636828601614136565b82525060208301356020820152604083013561498181613fb1565b6040820152606092830135928101929092525090565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a08301526149ed60c0830184613e2d565b98975050505050505050565b61ffff818116838216019080821115614447576144476143f9565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614a7c816003860160208c01613e0b565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614abf816017840160208b01613e0b565b808201915050818660f81b16601782015284519150614ae5826018830160208801613e0b565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614b5e816003860160208c01613e0b565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614ba1816017840160208b01613e0b565b808201915050818660f01b16601782015284519150614bc7826019830160208801613e0b565b016019019998505050505050505050565b5f8651614be9818460208b01613e0b565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f614c776060830184866145f8565b9695505050505050565b5f8251614922818460208701613e0b56fea264697066735822122083bc8bb96aaeda2496c47238debfe8c1a6420b24ae2e54109a8746c96a57b88964736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol b/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol index 2727ea8d4..8d812e641 100644 --- a/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol +++ b/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol @@ -80,6 +80,7 @@ contract PolygonValidiumEtrog is PolygonRollupBaseEtrog, IPolygonValidium { * @param dataAvailabilityMessage 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 + * note Pol is not a reentrant token */ function sequenceBatchesValidium( ValidiumBatchData[] calldata batches, @@ -100,7 +101,6 @@ contract PolygonValidiumEtrog is PolygonRollupBaseEtrog, IPolygonValidium { // Get global batch variables bytes32 l1InfoRoot = globalExitRootManager.getRoot(); - uint64 currentTimestamp = uint64(block.timestamp); // Store storage variables in memory, to save gas, because will be overrided multiple times uint64 currentLastForceBatchSequenced = lastForceBatchSequenced; @@ -109,6 +109,9 @@ contract PolygonValidiumEtrog is PolygonRollupBaseEtrog, IPolygonValidium { // Store in a temporal variable, for avoid access again the storage slot uint64 initLastForceBatchSequenced = currentLastForceBatchSequenced; + // Accumulated sequenced transaction hash to verify them afterward against the dataAvailabilityProtocol + bytes32 accumulatedNonForcedTransactionsHash = bytes32(0); + for (uint256 i = 0; i < batchesNum; i++) { // Load current sequence ValidiumBatchData memory currentBatch = batches[i]; @@ -149,6 +152,14 @@ contract PolygonValidiumEtrog is PolygonRollupBaseEtrog, IPolygonValidium { // Delete forceBatch data since won't be used anymore delete forcedBatches[currentLastForceBatchSequenced]; } else { + // Accumulate non forced transactions hash + accumulatedNonForcedTransactionsHash = keccak256( + abi.encodePacked( + accumulatedNonForcedTransactionsHash, + currentBatch.transactionsHash + ) + ); + // Note that forcedGlobalExitRoot and forcedBlockHashL1 remain unused and unchecked in this path // The synchronizer should be aware of that @@ -158,7 +169,7 @@ contract PolygonValidiumEtrog is PolygonRollupBaseEtrog, IPolygonValidium { currentAccInputHash, currentBatch.transactionsHash, l1InfoRoot, - currentTimestamp, + uint64(block.timestamp), l2Coinbase, bytes32(0) ) @@ -194,23 +205,26 @@ contract PolygonValidiumEtrog is PolygonRollupBaseEtrog, IPolygonValidium { } // Pay collateral for every non-forced batch submitted - pol.safeTransferFrom( - msg.sender, - address(rollupManager), - rollupManager.getBatchFee() * nonForcedBatchesSequenced - ); + if (nonForcedBatchesSequenced != 0) { + pol.safeTransferFrom( + msg.sender, + address(rollupManager), + rollupManager.getBatchFee() * nonForcedBatchesSequenced + ); + + // Validate that the data availability protocol accepts the dataAvailabilityMessage + // note This is a view function, so there's not much risk even if this contract was vulnerable to reentrant attacks + dataAvailabilityProtocol.verifyMessage( + accumulatedNonForcedTransactionsHash, + dataAvailabilityMessage + ); + } uint64 currentBatchSequenced = rollupManager.onSequenceBatches( uint64(batchesNum), currentAccInputHash ); - // Validate that the data availability protocol accepts the dataAvailabilityMessage - dataAvailabilityProtocol.verifyMessage( - currentAccInputHash, - dataAvailabilityMessage - ); - emit SequenceBatches(currentBatchSequenced, l1InfoRoot); } diff --git a/contracts/v2/lib/PolygonRollupBaseEtrog.sol b/contracts/v2/lib/PolygonRollupBaseEtrog.sol index 359ee0b52..89da97fc2 100644 --- a/contracts/v2/lib/PolygonRollupBaseEtrog.sol +++ b/contracts/v2/lib/PolygonRollupBaseEtrog.sol @@ -409,7 +409,8 @@ contract PolygonRollupBaseEtrog is /** * @notice Allows a sequencer to send multiple batches * @param batches Struct array which holds the necessary data to append new batches to the sequence - * @param l2Coinbase Address that will receive the fees from L2 + * @param l2Coinbase Address that will receive the fees from L2+ + * note Pol is not a reentrant token */ function sequenceBatches( BatchData[] calldata batches, From fdeeb85e93e809f71686b9a18bc32ac242e8d2d8 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 17 Jan 2024 14:28:45 +0100 Subject: [PATCH 152/230] small event fix etrog --- .../paris/PolygonZkEVMExistentEtrog.json | 10 ++++++++-- .../v2/consensus/zkEVM/PolygonZkEVMExistentEtrog.sol | 4 +++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/compiled-contracts/paris/PolygonZkEVMExistentEtrog.json b/compiled-contracts/paris/PolygonZkEVMExistentEtrog.json index f9f7fb76b..b1d2ddbdb 100644 --- a/compiled-contracts/paris/PolygonZkEVMExistentEtrog.json +++ b/compiled-contracts/paris/PolygonZkEVMExistentEtrog.json @@ -456,6 +456,12 @@ { "anonymous": false, "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "numBatch", + "type": "uint64" + }, { "indexed": false, "internalType": "bytes", @@ -1206,8 +1212,8 @@ "type": "function" } ], - "bytecode": "0x6101006040523480156200001257600080fd5b5060405162004a1238038062004a12833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e05161483b620001d7600039600081816105060152818161098f01528181610afc01528181610c7d01528181610fd1015281816112df015281816118c201528181611d66015281816121bd015281816122b30152818161295801528181612a2001528181613343015281816133bc015281816133de01526134f6015260008181610673015281816114d3015281816115ad015281816124840152818161258c0152612e7d01526000818161073701528181610e450152818161173601528181612b6b0152612eff0152600081816107690152818161083b0152818161220601528181612b3f015261348c015261483b6000f3fe608060405234801561001057600080fd5b50600436106102f35760003560e01c80637a5460c511610191578063c7fffd4b116100e3578063e46761c411610097578063ecef3f9911610071578063ecef3f99146107b2578063f35dda47146107c5578063f851a440146107cd57600080fd5b8063e46761c414610764578063e7a7ed021461078b578063eaeb077b1461079f57600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610712578063d02103ca14610732578063d7bc90ff1461075957600080fd5b8063c7fffd4b146106f7578063c89e42df146106ff57600080fd5b8063a3c573eb11610145578063af7f3e021161011f578063af7f3e02146106bb578063b0afe154146106c3578063c754c7ed146106cf57600080fd5b8063a3c573eb1461066e578063a652f26c14610695578063ada8f919146106a857600080fd5b806391cafe321161017657806391cafe321461062d5780639e001877146106405780639f26f8401461065b57600080fd5b80637a5460c5146105e95780638c3d73011461062557600080fd5b8063456052671161024a5780635d6717a5116101fe5780636e05d2cd116101d85780636e05d2cd146105ba5780636ff512cc146105c357806371257022146105d657600080fd5b80635d6717a51461057f578063676870d2146105925780636b8616ce1461059a57600080fd5b80634e4877061161022f5780634e4877061461052857806352bdeb6d1461053b578063542028d51461057757600080fd5b806345605267146104c857806349b7b8021461050157600080fd5b806326782247116102ac5780633c351e10116102865780633c351e10146104135780633cbc795b1461043357806340b5de6c1461047057600080fd5b806326782247146103995780632c111c06146103de57806332c2d153146103fe57600080fd5b806305835f37116102dd57806305835f371461032e578063107bf28c1461037757806311e892d41461037f57600080fd5b8062d0295d146102f85780630350896314610313575b600080fd5b6103006107f3565b6040519081526020015b60405180910390f35b61031b602081565b60405161ffff909116815260200161030a565b61036a6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161030a91906139f3565b61036a6108ff565b61038760f981565b60405160ff909116815260200161030a565b6001546103b99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161030a565b6008546103b99073ffffffffffffffffffffffffffffffffffffffff1681565b61041161040c366004613a48565b61098d565b005b6009546103b99073ffffffffffffffffffffffffffffffffffffffff1681565b60095461045b9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161030a565b6104977fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161030a565b6007546104e89068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161030a565b6103b97f000000000000000000000000000000000000000000000000000000000000000081565b610411610536366004613a8a565b610a5c565b61036a6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61036a610c6e565b61041161058d366004613bc1565b610c7b565b61031b601f81565b6103006105a8366004613a8a565b60066020526000908152604090205481565b61030060055481565b6104116105d1366004613c52565b611213565b6104116105e4366004613c81565b6112dd565b61036a6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610411611afe565b61041161063b366004613c52565b611bd1565b6103b973a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b610411610669366004613d7a565b611cea565b6103b97f000000000000000000000000000000000000000000000000000000000000000081565b61036a6106a3366004613dbc565b612383565b6104116106b6366004613c52565b612768565b61036a612832565b6103006405ca1ab1e081565b6007546104e890700100000000000000000000000000000000900467ffffffffffffffff1681565b61038760e481565b61041161070d366004613e31565b61284e565b6002546103b99073ffffffffffffffffffffffffffffffffffffffff1681565b6103b97f000000000000000000000000000000000000000000000000000000000000000081565b610300635ca1ab1e81565b6103b97f000000000000000000000000000000000000000000000000000000000000000081565b6007546104e89067ffffffffffffffff1681565b6104116107ad366004613e66565b6128e1565b6104116107c0366004613ede565b612db2565b610387601b81565b6000546103b99062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610882573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a69190613f2a565b6007549091506000906108d19067ffffffffffffffff68010000000000000000820481169116613f72565b67ffffffffffffffff169050806000036108ee5760009250505090565b6108f88183613f9a565b9250505090565b6004805461090c90613fd5565b80601f016020809104026020016040519081016040528092919081815260200182805461093890613fd5565b80156109855780601f1061095a57610100808354040283529160200191610985565b820191906000526020600020905b81548152906001019060200180831161096857829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109fc576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a4f91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ab3576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610afa576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b899190614028565b610bea5760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610bea576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461090c90613fd5565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610cea576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610d0a5750600054600160ff909116105b80610d245750303b158015610d24575060005460ff166001145b610db5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e1357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60006040518060a00160405280606281526020016147a4606291399050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed29190613f2a565b90506000868483858d610ee660014361404a565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af115801561102f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110539190614063565b50600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8e81169190910291909117909155600280547fffffffffffffffffffffffff000000000000000000000000000000000000000016918c1691909117905560036110dc8a826140c6565b5060046110e989826140c6565b50600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8d16179055600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1672069780000000000000000000000000000000001790556040517f2bf779968f2cd549d28a94deec97630ab04362cb219c64664de7d2e21f3ccf469061119b90879085908e906141e0565b60405180910390a15050505050801561120b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461126a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c63565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461134c576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff161580801561136c5750600054600160ff909116105b806113865750303b158015611386575060005460ff166001145b611412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610dac565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561147057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff8516156116d7576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab90602401600060405180830381865afa15801561151a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611560919081019061421f565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015291925060009182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d9060240160408051808303816000875af11580156115f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161b9190614296565b915091508163ffffffff16600014611693576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff8416171790556116d4565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b60095460009061171f90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685612383565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561179f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c39190613f2a565b90506000808483858f6117d760014361404a565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611920573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119449190614063565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600390816119d691906140c6565b5060046119e389826140c6565b508c600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611a84939291906141e0565b60405180910390a15050505050508015611af557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611b4f576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611c28576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611c77576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c63565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590611d28575073ffffffffffffffffffffffffffffffffffffffff81163314155b15611d5f576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611dcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df39190614063565b611dfd91906142d0565b67ffffffffffffffff161115611e3f576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003611e7b576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611eb7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff80821691611edf918491680100000000000000009004166142f1565b1115611f17576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff169060005b838110156121b7576000878783818110611f5457611f54614304565b9050602002810190611f669190614333565b611f6f90614371565b905083611f7b816143fa565b825180516020918201208185015160408087015160608801519151959a50929550600094611fe8948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612071576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff861660009081526006602052604081205561209660018861404a565b84036121055742600760109054906101000a900467ffffffffffffffff1684604001516120c391906142d0565b67ffffffffffffffff161115612105576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120945050505080806121af90614421565b915050611f38565b5061222d7f0000000000000000000000000000000000000000000000000000000000000000846121e56107f3565b6121ef9190614459565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691906135cb565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e7300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906122ff908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af115801561231e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123429190614063565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a250505050505050565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa6000876040516024016123b796959493929190614470565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060906000036125085760f9601f835161244c91906144d3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e4876040516020016124f297969594939291906144ee565b604051602081830303815290604052905061260c565b815161ffff1015612545576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96125546020836144d3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016125f997969594939291906145d1565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa15801561266d573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166126e5576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405160009061272b9084906405ca1ab1e090635ca1ab1e90601b907fff00000000000000000000000000000000000000000000000000000000000000906020016146b4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146127bf576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c63565b6040518060a00160405280606281526020016147a46062913981565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146128a5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036128b182826140c6565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c6391906139f3565b60085473ffffffffffffffffffffffffffffffffffffffff16801580159061291f575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612956576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129e59190614028565b15612a1c576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aad9190613f2a565b905082811115612ae9576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388841115612b25576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b6773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846136a4565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf89190613f2a565b6007805491925067ffffffffffffffff909116906000612c17836143fa565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051612c4e929190614710565b6040519081900390208142612c6460014361404a565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff1660009081526006909352912055323303612d5c57600754604080518381523360208201526060818301819052600090820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a261120b565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93190612da290849033908b908b90614720565b60405180910390a2505050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612e03576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003612e3f576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612e7b576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612ee357600080fd5b505af1158015612ef7573d6000803e3d6000fd5b5050505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f8c9190613f2a565b60075460055491925042916801000000000000000090910467ffffffffffffffff16908160005b868110156132b55760008a8a83818110612fcf57612fcf614304565b9050602002810190612fe19190614333565b612fea90614371565b8051805160209091012060408201519192509067ffffffffffffffff16156131cf5785613016816143fa565b9650506000818360200151846040015185606001516040516020016130799493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114613102576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209550600660008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060009055506132a0565b8151516201d4c0101561320e576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201526000609c82015260bc016040516020818303038152906040528051906020012094505b505080806132ad90614421565b915050612fb3565b5060075467ffffffffffffffff9081169084161115613300576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff848116908316146133b65760006133268386613f72565b905061333c67ffffffffffffffff82168361404a565b91506133757f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166121e56107f3565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b6134b4337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015613447573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061346b9190613f2a565b6134759190614459565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906136a4565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015613554573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135789190614063565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e766886040516135b691815260200190565b60405180910390a25050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261369f9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613708565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526137029085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161361d565b50505050565b600061376a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166138149092919063ffffffff16565b80519091501561369f57808060200190518101906137889190614028565b61369f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610dac565b60606127608484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516138489190614791565b60006040518083038185875af1925050503d8060008114613885576040519150601f19603f3d011682016040523d82523d6000602084013e61388a565b606091505b509150915061389b878383876138a6565b979650505050505050565b6060831561393c5782516000036139355773ffffffffffffffffffffffffffffffffffffffff85163b613935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610dac565b5081612760565b61276083838151156139515781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dac91906139f3565b60005b838110156139a0578181015183820152602001613988565b50506000910152565b600081518084526139c1816020860160208601613985565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613a0660208301846139a9565b9392505050565b67ffffffffffffffff81168114613a2357600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613a2357600080fd5b600080600060608486031215613a5d57600080fd5b8335613a6881613a0d565b9250602084013591506040840135613a7f81613a26565b809150509250925092565b600060208284031215613a9c57600080fd5b8135613a0681613a0d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613b1d57613b1d613aa7565b604052919050565b600067ffffffffffffffff821115613b3f57613b3f613aa7565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613b7c57600080fd5b8135613b8f613b8a82613b25565b613ad6565b818152846020838601011115613ba457600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215613bd957600080fd5b8535613be481613a26565b94506020860135613bf481613a26565b9350604086013567ffffffffffffffff80821115613c1157600080fd5b613c1d89838a01613b6b565b94506060880135915080821115613c3357600080fd5b50613c4088828901613b6b565b95989497509295608001359392505050565b600060208284031215613c6457600080fd5b8135613a0681613a26565b63ffffffff81168114613a2357600080fd5b60008060008060008060c08789031215613c9a57600080fd5b8635613ca581613a26565b95506020870135613cb581613a26565b94506040870135613cc581613c6f565b93506060870135613cd581613a26565b9250608087013567ffffffffffffffff80821115613cf257600080fd5b613cfe8a838b01613b6b565b935060a0890135915080821115613d1457600080fd5b50613d2189828a01613b6b565b9150509295509295509295565b60008083601f840112613d4057600080fd5b50813567ffffffffffffffff811115613d5857600080fd5b6020830191508360208260051b8501011115613d7357600080fd5b9250929050565b60008060208385031215613d8d57600080fd5b823567ffffffffffffffff811115613da457600080fd5b613db085828601613d2e565b90969095509350505050565b60008060008060808587031215613dd257600080fd5b8435613ddd81613c6f565b93506020850135613ded81613a26565b92506040850135613dfd81613c6f565b9150606085013567ffffffffffffffff811115613e1957600080fd5b613e2587828801613b6b565b91505092959194509250565b600060208284031215613e4357600080fd5b813567ffffffffffffffff811115613e5a57600080fd5b61276084828501613b6b565b600080600060408486031215613e7b57600080fd5b833567ffffffffffffffff80821115613e9357600080fd5b818601915086601f830112613ea757600080fd5b813581811115613eb657600080fd5b876020828501011115613ec857600080fd5b6020928301989097509590910135949350505050565b600080600060408486031215613ef357600080fd5b833567ffffffffffffffff811115613f0a57600080fd5b613f1686828701613d2e565b9094509250506020840135613a7f81613a26565b600060208284031215613f3c57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613f9357613f93613f43565b5092915050565b600082613fd0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613fe957607f821691505b602082108103614022577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561403a57600080fd5b81518015158114613a0657600080fd5b8181038181111561405d5761405d613f43565b92915050565b60006020828403121561407557600080fd5b8151613a0681613a0d565b601f82111561369f57600081815260208120601f850160051c810160208610156140a75750805b601f850160051c820191505b8181101561120b578281556001016140b3565b815167ffffffffffffffff8111156140e0576140e0613aa7565b6140f4816140ee8454613fd5565b84614080565b602080601f83116001811461414757600084156141115750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561120b565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561419457888601518255948401946001909101908401614175565b50858210156141d057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006141f360608301866139a9565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b60006020828403121561423157600080fd5b815167ffffffffffffffff81111561424857600080fd5b8201601f8101841361425957600080fd5b8051614267613b8a82613b25565b81815285602083850101111561427c57600080fd5b61428d826020830160208601613985565b95945050505050565b600080604083850312156142a957600080fd5b82516142b481613c6f565b60208401519092506142c581613a26565b809150509250929050565b67ffffffffffffffff818116838216019080821115613f9357613f93613f43565b8082018082111561405d5761405d613f43565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261436757600080fd5b9190910192915050565b60006080823603121561438357600080fd5b6040516080810167ffffffffffffffff82821081831117156143a7576143a7613aa7565b8160405284359150808211156143bc57600080fd5b506143c936828601613b6b565b8252506020830135602082015260408301356143e481613a0d565b6040820152606092830135928101929092525090565b600067ffffffffffffffff80831681810361441757614417613f43565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361445257614452613f43565b5060010190565b808202811582820484141761405d5761405d613f43565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a08301526144c760c08301846139a9565b98975050505050505050565b61ffff818116838216019080821115613f9357613f93613f43565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614557816003860160208c01613985565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161459a816017840160208b01613985565b808201915050818660f81b166017820152845191506145c0826018830160208801613985565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b166001840152875161463a816003860160208c01613985565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161467d816017840160208b01613985565b808201915050818660f01b166017820152845191506146a3826019830160208801613985565b016019019998505050505050505050565b600086516146c6818460208b01613985565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b6000825161436781846020870161398556fedf2a8080944d5cf5032b2a844602278b01199ed191a86c93ff8080821092808000000000000000000000000000000000000000000000000000000005ca1ab1e000000000000000000000000000000000000000000000000000000005ca1ab1e01bffa2646970667358221220c39d4ceac3389b4c581957c6bbf45ee11fe3be7d77ca0382c242f7bcc834a82564736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102f35760003560e01c80637a5460c511610191578063c7fffd4b116100e3578063e46761c411610097578063ecef3f9911610071578063ecef3f99146107b2578063f35dda47146107c5578063f851a440146107cd57600080fd5b8063e46761c414610764578063e7a7ed021461078b578063eaeb077b1461079f57600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610712578063d02103ca14610732578063d7bc90ff1461075957600080fd5b8063c7fffd4b146106f7578063c89e42df146106ff57600080fd5b8063a3c573eb11610145578063af7f3e021161011f578063af7f3e02146106bb578063b0afe154146106c3578063c754c7ed146106cf57600080fd5b8063a3c573eb1461066e578063a652f26c14610695578063ada8f919146106a857600080fd5b806391cafe321161017657806391cafe321461062d5780639e001877146106405780639f26f8401461065b57600080fd5b80637a5460c5146105e95780638c3d73011461062557600080fd5b8063456052671161024a5780635d6717a5116101fe5780636e05d2cd116101d85780636e05d2cd146105ba5780636ff512cc146105c357806371257022146105d657600080fd5b80635d6717a51461057f578063676870d2146105925780636b8616ce1461059a57600080fd5b80634e4877061161022f5780634e4877061461052857806352bdeb6d1461053b578063542028d51461057757600080fd5b806345605267146104c857806349b7b8021461050157600080fd5b806326782247116102ac5780633c351e10116102865780633c351e10146104135780633cbc795b1461043357806340b5de6c1461047057600080fd5b806326782247146103995780632c111c06146103de57806332c2d153146103fe57600080fd5b806305835f37116102dd57806305835f371461032e578063107bf28c1461037757806311e892d41461037f57600080fd5b8062d0295d146102f85780630350896314610313575b600080fd5b6103006107f3565b6040519081526020015b60405180910390f35b61031b602081565b60405161ffff909116815260200161030a565b61036a6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161030a91906139f3565b61036a6108ff565b61038760f981565b60405160ff909116815260200161030a565b6001546103b99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161030a565b6008546103b99073ffffffffffffffffffffffffffffffffffffffff1681565b61041161040c366004613a48565b61098d565b005b6009546103b99073ffffffffffffffffffffffffffffffffffffffff1681565b60095461045b9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161030a565b6104977fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161030a565b6007546104e89068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161030a565b6103b97f000000000000000000000000000000000000000000000000000000000000000081565b610411610536366004613a8a565b610a5c565b61036a6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61036a610c6e565b61041161058d366004613bc1565b610c7b565b61031b601f81565b6103006105a8366004613a8a565b60066020526000908152604090205481565b61030060055481565b6104116105d1366004613c52565b611213565b6104116105e4366004613c81565b6112dd565b61036a6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610411611afe565b61041161063b366004613c52565b611bd1565b6103b973a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b610411610669366004613d7a565b611cea565b6103b97f000000000000000000000000000000000000000000000000000000000000000081565b61036a6106a3366004613dbc565b612383565b6104116106b6366004613c52565b612768565b61036a612832565b6103006405ca1ab1e081565b6007546104e890700100000000000000000000000000000000900467ffffffffffffffff1681565b61038760e481565b61041161070d366004613e31565b61284e565b6002546103b99073ffffffffffffffffffffffffffffffffffffffff1681565b6103b97f000000000000000000000000000000000000000000000000000000000000000081565b610300635ca1ab1e81565b6103b97f000000000000000000000000000000000000000000000000000000000000000081565b6007546104e89067ffffffffffffffff1681565b6104116107ad366004613e66565b6128e1565b6104116107c0366004613ede565b612db2565b610387601b81565b6000546103b99062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610882573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a69190613f2a565b6007549091506000906108d19067ffffffffffffffff68010000000000000000820481169116613f72565b67ffffffffffffffff169050806000036108ee5760009250505090565b6108f88183613f9a565b9250505090565b6004805461090c90613fd5565b80601f016020809104026020016040519081016040528092919081815260200182805461093890613fd5565b80156109855780601f1061095a57610100808354040283529160200191610985565b820191906000526020600020905b81548152906001019060200180831161096857829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109fc576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a4f91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ab3576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610afa576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b899190614028565b610bea5760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610bea576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461090c90613fd5565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610cea576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610d0a5750600054600160ff909116105b80610d245750303b158015610d24575060005460ff166001145b610db5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e1357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60006040518060a00160405280606281526020016147a4606291399050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed29190613f2a565b90506000868483858d610ee660014361404a565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af115801561102f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110539190614063565b50600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8e81169190910291909117909155600280547fffffffffffffffffffffffff000000000000000000000000000000000000000016918c1691909117905560036110dc8a826140c6565b5060046110e989826140c6565b50600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8d16179055600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1672069780000000000000000000000000000000001790556040517f2bf779968f2cd549d28a94deec97630ab04362cb219c64664de7d2e21f3ccf469061119b90879085908e906141e0565b60405180910390a15050505050801561120b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461126a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c63565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461134c576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff161580801561136c5750600054600160ff909116105b806113865750303b158015611386575060005460ff166001145b611412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610dac565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561147057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff8516156116d7576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab90602401600060405180830381865afa15801561151a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611560919081019061421f565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015291925060009182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d9060240160408051808303816000875af11580156115f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161b9190614296565b915091508163ffffffff16600014611693576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff8416171790556116d4565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b60095460009061171f90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685612383565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561179f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c39190613f2a565b90506000808483858f6117d760014361404a565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611920573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119449190614063565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600390816119d691906140c6565b5060046119e389826140c6565b508c600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611a84939291906141e0565b60405180910390a15050505050508015611af557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611b4f576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611c28576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611c77576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c63565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590611d28575073ffffffffffffffffffffffffffffffffffffffff81163314155b15611d5f576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611dcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df39190614063565b611dfd91906142d0565b67ffffffffffffffff161115611e3f576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003611e7b576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611eb7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff80821691611edf918491680100000000000000009004166142f1565b1115611f17576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff169060005b838110156121b7576000878783818110611f5457611f54614304565b9050602002810190611f669190614333565b611f6f90614371565b905083611f7b816143fa565b825180516020918201208185015160408087015160608801519151959a50929550600094611fe8948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612071576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff861660009081526006602052604081205561209660018861404a565b84036121055742600760109054906101000a900467ffffffffffffffff1684604001516120c391906142d0565b67ffffffffffffffff161115612105576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120945050505080806121af90614421565b915050611f38565b5061222d7f0000000000000000000000000000000000000000000000000000000000000000846121e56107f3565b6121ef9190614459565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691906135cb565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e7300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906122ff908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af115801561231e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123429190614063565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a250505050505050565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa6000876040516024016123b796959493929190614470565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060906000036125085760f9601f835161244c91906144d3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e4876040516020016124f297969594939291906144ee565b604051602081830303815290604052905061260c565b815161ffff1015612545576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96125546020836144d3565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016125f997969594939291906145d1565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa15801561266d573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166126e5576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405160009061272b9084906405ca1ab1e090635ca1ab1e90601b907fff00000000000000000000000000000000000000000000000000000000000000906020016146b4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146127bf576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c63565b6040518060a00160405280606281526020016147a46062913981565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146128a5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036128b182826140c6565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c6391906139f3565b60085473ffffffffffffffffffffffffffffffffffffffff16801580159061291f575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612956576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129e59190614028565b15612a1c576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aad9190613f2a565b905082811115612ae9576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388841115612b25576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b6773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846136a4565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf89190613f2a565b6007805491925067ffffffffffffffff909116906000612c17836143fa565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051612c4e929190614710565b6040519081900390208142612c6460014361404a565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff1660009081526006909352912055323303612d5c57600754604080518381523360208201526060818301819052600090820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a261120b565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93190612da290849033908b908b90614720565b60405180910390a2505050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612e03576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003612e3f576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612e7b576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612ee357600080fd5b505af1158015612ef7573d6000803e3d6000fd5b5050505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f8c9190613f2a565b60075460055491925042916801000000000000000090910467ffffffffffffffff16908160005b868110156132b55760008a8a83818110612fcf57612fcf614304565b9050602002810190612fe19190614333565b612fea90614371565b8051805160209091012060408201519192509067ffffffffffffffff16156131cf5785613016816143fa565b9650506000818360200151846040015185606001516040516020016130799493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114613102576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209550600660008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060009055506132a0565b8151516201d4c0101561320e576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201526000609c82015260bc016040516020818303038152906040528051906020012094505b505080806132ad90614421565b915050612fb3565b5060075467ffffffffffffffff9081169084161115613300576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff848116908316146133b65760006133268386613f72565b905061333c67ffffffffffffffff82168361404a565b91506133757f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166121e56107f3565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b6134b4337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015613447573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061346b9190613f2a565b6134759190614459565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906136a4565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015613554573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135789190614063565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e766886040516135b691815260200190565b60405180910390a25050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261369f9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613708565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526137029085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161361d565b50505050565b600061376a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166138149092919063ffffffff16565b80519091501561369f57808060200190518101906137889190614028565b61369f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610dac565b60606127608484600085856000808673ffffffffffffffffffffffffffffffffffffffff1685876040516138489190614791565b60006040518083038185875af1925050503d8060008114613885576040519150601f19603f3d011682016040523d82523d6000602084013e61388a565b606091505b509150915061389b878383876138a6565b979650505050505050565b6060831561393c5782516000036139355773ffffffffffffffffffffffffffffffffffffffff85163b613935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610dac565b5081612760565b61276083838151156139515781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dac91906139f3565b60005b838110156139a0578181015183820152602001613988565b50506000910152565b600081518084526139c1816020860160208601613985565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613a0660208301846139a9565b9392505050565b67ffffffffffffffff81168114613a2357600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613a2357600080fd5b600080600060608486031215613a5d57600080fd5b8335613a6881613a0d565b9250602084013591506040840135613a7f81613a26565b809150509250925092565b600060208284031215613a9c57600080fd5b8135613a0681613a0d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613b1d57613b1d613aa7565b604052919050565b600067ffffffffffffffff821115613b3f57613b3f613aa7565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613b7c57600080fd5b8135613b8f613b8a82613b25565b613ad6565b818152846020838601011115613ba457600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215613bd957600080fd5b8535613be481613a26565b94506020860135613bf481613a26565b9350604086013567ffffffffffffffff80821115613c1157600080fd5b613c1d89838a01613b6b565b94506060880135915080821115613c3357600080fd5b50613c4088828901613b6b565b95989497509295608001359392505050565b600060208284031215613c6457600080fd5b8135613a0681613a26565b63ffffffff81168114613a2357600080fd5b60008060008060008060c08789031215613c9a57600080fd5b8635613ca581613a26565b95506020870135613cb581613a26565b94506040870135613cc581613c6f565b93506060870135613cd581613a26565b9250608087013567ffffffffffffffff80821115613cf257600080fd5b613cfe8a838b01613b6b565b935060a0890135915080821115613d1457600080fd5b50613d2189828a01613b6b565b9150509295509295509295565b60008083601f840112613d4057600080fd5b50813567ffffffffffffffff811115613d5857600080fd5b6020830191508360208260051b8501011115613d7357600080fd5b9250929050565b60008060208385031215613d8d57600080fd5b823567ffffffffffffffff811115613da457600080fd5b613db085828601613d2e565b90969095509350505050565b60008060008060808587031215613dd257600080fd5b8435613ddd81613c6f565b93506020850135613ded81613a26565b92506040850135613dfd81613c6f565b9150606085013567ffffffffffffffff811115613e1957600080fd5b613e2587828801613b6b565b91505092959194509250565b600060208284031215613e4357600080fd5b813567ffffffffffffffff811115613e5a57600080fd5b61276084828501613b6b565b600080600060408486031215613e7b57600080fd5b833567ffffffffffffffff80821115613e9357600080fd5b818601915086601f830112613ea757600080fd5b813581811115613eb657600080fd5b876020828501011115613ec857600080fd5b6020928301989097509590910135949350505050565b600080600060408486031215613ef357600080fd5b833567ffffffffffffffff811115613f0a57600080fd5b613f1686828701613d2e565b9094509250506020840135613a7f81613a26565b600060208284031215613f3c57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613f9357613f93613f43565b5092915050565b600082613fd0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613fe957607f821691505b602082108103614022577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561403a57600080fd5b81518015158114613a0657600080fd5b8181038181111561405d5761405d613f43565b92915050565b60006020828403121561407557600080fd5b8151613a0681613a0d565b601f82111561369f57600081815260208120601f850160051c810160208610156140a75750805b601f850160051c820191505b8181101561120b578281556001016140b3565b815167ffffffffffffffff8111156140e0576140e0613aa7565b6140f4816140ee8454613fd5565b84614080565b602080601f83116001811461414757600084156141115750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561120b565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561419457888601518255948401946001909101908401614175565b50858210156141d057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6060815260006141f360608301866139a9565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b60006020828403121561423157600080fd5b815167ffffffffffffffff81111561424857600080fd5b8201601f8101841361425957600080fd5b8051614267613b8a82613b25565b81815285602083850101111561427c57600080fd5b61428d826020830160208601613985565b95945050505050565b600080604083850312156142a957600080fd5b82516142b481613c6f565b60208401519092506142c581613a26565b809150509250929050565b67ffffffffffffffff818116838216019080821115613f9357613f93613f43565b8082018082111561405d5761405d613f43565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261436757600080fd5b9190910192915050565b60006080823603121561438357600080fd5b6040516080810167ffffffffffffffff82821081831117156143a7576143a7613aa7565b8160405284359150808211156143bc57600080fd5b506143c936828601613b6b565b8252506020830135602082015260408301356143e481613a0d565b6040820152606092830135928101929092525090565b600067ffffffffffffffff80831681810361441757614417613f43565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361445257614452613f43565b5060010190565b808202811582820484141761405d5761405d613f43565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a08301526144c760c08301846139a9565b98975050505050505050565b61ffff818116838216019080821115613f9357613f93613f43565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614557816003860160208c01613985565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161459a816017840160208b01613985565b808201915050818660f81b166017820152845191506145c0826018830160208801613985565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b166001840152875161463a816003860160208c01613985565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161467d816017840160208b01613985565b808201915050818660f01b166017820152845191506146a3826019830160208801613985565b016019019998505050505050505050565b600086516146c6818460208b01613985565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b6000825161436781846020870161398556fedf2a8080944d5cf5032b2a844602278b01199ed191a86c93ff8080821092808000000000000000000000000000000000000000000000000000000005ca1ab1e000000000000000000000000000000000000000000000000000000005ca1ab1e01bffa2646970667358221220c39d4ceac3389b4c581957c6bbf45ee11fe3be7d77ca0382c242f7bcc834a82564736f6c63430008140033", + "bytecode": "0x6101006040523480156200001257600080fd5b5060405162004a6138038062004a61833981016040819052620000359162000071565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e05161488a620001d7600039600081816105060152818161098f01528181610afc01528181610c7d01528181610fd4015281816112de015281816118c101528181611d65015281816121bc015281816122b20152818161295701528181612a1f01528181613342015281816133bb015281816133dd01526134f5015260008181610673015281816114d2015281816115ac015281816124830152818161258b0152612e7c01526000818161073701528181610e450152818161173501528181612b6a0152612efe0152600081816107690152818161083b0152818161220501528181612b3e015261348b015261488a6000f3fe608060405234801561001057600080fd5b50600436106102f35760003560e01c80637a5460c511610191578063c7fffd4b116100e3578063e46761c411610097578063ecef3f9911610071578063ecef3f99146107b2578063f35dda47146107c5578063f851a440146107cd57600080fd5b8063e46761c414610764578063e7a7ed021461078b578063eaeb077b1461079f57600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610712578063d02103ca14610732578063d7bc90ff1461075957600080fd5b8063c7fffd4b146106f7578063c89e42df146106ff57600080fd5b8063a3c573eb11610145578063af7f3e021161011f578063af7f3e02146106bb578063b0afe154146106c3578063c754c7ed146106cf57600080fd5b8063a3c573eb1461066e578063a652f26c14610695578063ada8f919146106a857600080fd5b806391cafe321161017657806391cafe321461062d5780639e001877146106405780639f26f8401461065b57600080fd5b80637a5460c5146105e95780638c3d73011461062557600080fd5b8063456052671161024a5780635d6717a5116101fe5780636e05d2cd116101d85780636e05d2cd146105ba5780636ff512cc146105c357806371257022146105d657600080fd5b80635d6717a51461057f578063676870d2146105925780636b8616ce1461059a57600080fd5b80634e4877061161022f5780634e4877061461052857806352bdeb6d1461053b578063542028d51461057757600080fd5b806345605267146104c857806349b7b8021461050157600080fd5b806326782247116102ac5780633c351e10116102865780633c351e10146104135780633cbc795b1461043357806340b5de6c1461047057600080fd5b806326782247146103995780632c111c06146103de57806332c2d153146103fe57600080fd5b806305835f37116102dd57806305835f371461032e578063107bf28c1461037757806311e892d41461037f57600080fd5b8062d0295d146102f85780630350896314610313575b600080fd5b6103006107f3565b6040519081526020015b60405180910390f35b61031b602081565b60405161ffff909116815260200161030a565b61036a6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161030a91906139f2565b61036a6108ff565b61038760f981565b60405160ff909116815260200161030a565b6001546103b99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161030a565b6008546103b99073ffffffffffffffffffffffffffffffffffffffff1681565b61041161040c366004613a47565b61098d565b005b6009546103b99073ffffffffffffffffffffffffffffffffffffffff1681565b60095461045b9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161030a565b6104977fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161030a565b6007546104e89068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161030a565b6103b97f000000000000000000000000000000000000000000000000000000000000000081565b610411610536366004613a89565b610a5c565b61036a6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61036a610c6e565b61041161058d366004613bc0565b610c7b565b61031b601f81565b6103006105a8366004613a89565b60066020526000908152604090205481565b61030060055481565b6104116105d1366004613c51565b611212565b6104116105e4366004613c80565b6112dc565b61036a6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610411611afd565b61041161063b366004613c51565b611bd0565b6103b973a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b610411610669366004613d79565b611ce9565b6103b97f000000000000000000000000000000000000000000000000000000000000000081565b61036a6106a3366004613dbb565b612382565b6104116106b6366004613c51565b612767565b61036a612831565b6103006405ca1ab1e081565b6007546104e890700100000000000000000000000000000000900467ffffffffffffffff1681565b61038760e481565b61041161070d366004613e30565b61284d565b6002546103b99073ffffffffffffffffffffffffffffffffffffffff1681565b6103b97f000000000000000000000000000000000000000000000000000000000000000081565b610300635ca1ab1e81565b6103b97f000000000000000000000000000000000000000000000000000000000000000081565b6007546104e89067ffffffffffffffff1681565b6104116107ad366004613e65565b6128e0565b6104116107c0366004613edd565b612db1565b610387601b81565b6000546103b99062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610882573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a69190613f29565b6007549091506000906108d19067ffffffffffffffff68010000000000000000820481169116613f71565b67ffffffffffffffff169050806000036108ee5760009250505090565b6108f88183613f99565b9250505090565b6004805461090c90613fd4565b80601f016020809104026020016040519081016040528092919081815260200182805461093890613fd4565b80156109855780601f1061095a57610100808354040283529160200191610985565b820191906000526020600020905b81548152906001019060200180831161096857829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109fc576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a4f91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ab3576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610afa576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b899190614027565b610bea5760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610bea576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461090c90613fd4565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610cea576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610d0a5750600054600160ff909116105b80610d245750303b158015610d24575060005460ff166001145b610db5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e1357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60006040518060a00160405280606281526020016147f3606291399050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed29190613f29565b90506000868483858d610ee6600143614049565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291506000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611032573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110569190614062565b90508b600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508a600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555089600390816110e991906140c5565b5060046110f68a826140c5565b508b600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fd2c80353fc15ef62c6affc7cd6b7ab5b42c43290c50be3372e55ae552cecd19c8187858e60405161119994939291906141df565b60405180910390a1505050505050801561120a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611269576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c63565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461134b576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff161580801561136b5750600054600160ff909116105b806113855750303b158015611385575060005460ff166001145b611411576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610dac565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561146f57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff8516156116d6576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab90602401600060405180830381865afa158015611519573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261155f919081019061422f565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015291925060009182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d9060240160408051808303816000875af11580156115f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161a91906142a6565b915091508163ffffffff16600014611692576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff8416171790556116d3565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b60095460009061171e90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685612382565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561179e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c29190613f29565b90506000808483858f6117d6600143614049565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af115801561191f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119439190614062565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600390816119d591906140c5565b5060046119e289826140c5565b508c600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611a83939291906142e0565b60405180910390a15050505050508015611af457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611b4e576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611c27576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611c76576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c63565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590611d27575073ffffffffffffffffffffffffffffffffffffffff81163314155b15611d5e576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611dce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df29190614062565b611dfc919061431f565b67ffffffffffffffff161115611e3e576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003611e7a576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611eb6576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff80821691611ede91849168010000000000000000900416614340565b1115611f16576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff169060005b838110156121b6576000878783818110611f5357611f53614353565b9050602002810190611f659190614382565b611f6e906143c0565b905083611f7a81614449565b825180516020918201208185015160408087015160608801519151959a50929550600094611fe7948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612070576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055612095600188614049565b84036121045742600760109054906101000a900467ffffffffffffffff1684604001516120c2919061431f565b67ffffffffffffffff161115612104576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120945050505080806121ae90614470565b915050611f37565b5061222c7f0000000000000000000000000000000000000000000000000000000000000000846121e46107f3565b6121ee91906144a8565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691906135ca565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e7300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906122fe908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af115801561231d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123419190614062565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a250505050505050565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa6000876040516024016123b6969594939291906144bf565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060906000036125075760f9601f835161244b9190614522565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e4876040516020016124f1979695949392919061453d565b604051602081830303815290604052905061260b565b815161ffff1015612544576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9612553602083614522565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016125f89796959493929190614620565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa15801561266c573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166126e4576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405160009061272a9084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614703565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146127be576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c63565b6040518060a00160405280606281526020016147f36062913981565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146128a4576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036128b082826140c5565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c6391906139f2565b60085473ffffffffffffffffffffffffffffffffffffffff16801580159061291e575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612955576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129e49190614027565b15612a1b576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aac9190613f29565b905082811115612ae8576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388841115612b24576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b6673ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846136a3565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf79190613f29565b6007805491925067ffffffffffffffff909116906000612c1683614449565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051612c4d92919061475f565b6040519081900390208142612c63600143614049565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff1660009081526006909352912055323303612d5b57600754604080518381523360208201526060818301819052600090820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a261120a565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93190612da190849033908b908b9061476f565b60405180910390a2505050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612e02576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003612e3e576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612e7a576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612ee257600080fd5b505af1158015612ef6573d6000803e3d6000fd5b5050505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f8b9190613f29565b60075460055491925042916801000000000000000090910467ffffffffffffffff16908160005b868110156132b45760008a8a83818110612fce57612fce614353565b9050602002810190612fe09190614382565b612fe9906143c0565b8051805160209091012060408201519192509067ffffffffffffffff16156131ce578561301581614449565b9650506000818360200151846040015185606001516040516020016130789493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114613101576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209550600660008867ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600090555061329f565b8151516201d4c0101561320d576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201526000609c82015260bc016040516020818303038152906040528051906020012094505b505080806132ac90614470565b915050612fb2565b5060075467ffffffffffffffff90811690841611156132ff576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff848116908316146133b55760006133258386613f71565b905061333b67ffffffffffffffff821683614049565b91506133747f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166121e46107f3565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b6134b3337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015613446573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061346a9190613f29565b61347491906144a8565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906136a3565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015613553573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135779190614062565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e766886040516135b591815260200190565b60405180910390a25050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261369e9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613707565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526137019085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161361c565b50505050565b6000613769826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166138139092919063ffffffff16565b80519091501561369e57808060200190518101906137879190614027565b61369e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610dac565b606061275f8484600085856000808673ffffffffffffffffffffffffffffffffffffffff16858760405161384791906147e0565b60006040518083038185875af1925050503d8060008114613884576040519150601f19603f3d011682016040523d82523d6000602084013e613889565b606091505b509150915061389a878383876138a5565b979650505050505050565b6060831561393b5782516000036139345773ffffffffffffffffffffffffffffffffffffffff85163b613934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610dac565b508161275f565b61275f83838151156139505781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dac91906139f2565b60005b8381101561399f578181015183820152602001613987565b50506000910152565b600081518084526139c0816020860160208601613984565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613a0560208301846139a8565b9392505050565b67ffffffffffffffff81168114613a2257600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613a2257600080fd5b600080600060608486031215613a5c57600080fd5b8335613a6781613a0c565b9250602084013591506040840135613a7e81613a25565b809150509250925092565b600060208284031215613a9b57600080fd5b8135613a0581613a0c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613b1c57613b1c613aa6565b604052919050565b600067ffffffffffffffff821115613b3e57613b3e613aa6565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613b7b57600080fd5b8135613b8e613b8982613b24565b613ad5565b818152846020838601011115613ba357600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215613bd857600080fd5b8535613be381613a25565b94506020860135613bf381613a25565b9350604086013567ffffffffffffffff80821115613c1057600080fd5b613c1c89838a01613b6a565b94506060880135915080821115613c3257600080fd5b50613c3f88828901613b6a565b95989497509295608001359392505050565b600060208284031215613c6357600080fd5b8135613a0581613a25565b63ffffffff81168114613a2257600080fd5b60008060008060008060c08789031215613c9957600080fd5b8635613ca481613a25565b95506020870135613cb481613a25565b94506040870135613cc481613c6e565b93506060870135613cd481613a25565b9250608087013567ffffffffffffffff80821115613cf157600080fd5b613cfd8a838b01613b6a565b935060a0890135915080821115613d1357600080fd5b50613d2089828a01613b6a565b9150509295509295509295565b60008083601f840112613d3f57600080fd5b50813567ffffffffffffffff811115613d5757600080fd5b6020830191508360208260051b8501011115613d7257600080fd5b9250929050565b60008060208385031215613d8c57600080fd5b823567ffffffffffffffff811115613da357600080fd5b613daf85828601613d2d565b90969095509350505050565b60008060008060808587031215613dd157600080fd5b8435613ddc81613c6e565b93506020850135613dec81613a25565b92506040850135613dfc81613c6e565b9150606085013567ffffffffffffffff811115613e1857600080fd5b613e2487828801613b6a565b91505092959194509250565b600060208284031215613e4257600080fd5b813567ffffffffffffffff811115613e5957600080fd5b61275f84828501613b6a565b600080600060408486031215613e7a57600080fd5b833567ffffffffffffffff80821115613e9257600080fd5b818601915086601f830112613ea657600080fd5b813581811115613eb557600080fd5b876020828501011115613ec757600080fd5b6020928301989097509590910135949350505050565b600080600060408486031215613ef257600080fd5b833567ffffffffffffffff811115613f0957600080fd5b613f1586828701613d2d565b9094509250506020840135613a7e81613a25565b600060208284031215613f3b57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613f9257613f92613f42565b5092915050565b600082613fcf577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613fe857607f821691505b602082108103614021577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561403957600080fd5b81518015158114613a0557600080fd5b8181038181111561405c5761405c613f42565b92915050565b60006020828403121561407457600080fd5b8151613a0581613a0c565b601f82111561369e57600081815260208120601f850160051c810160208610156140a65750805b601f850160051c820191505b8181101561120a578281556001016140b2565b815167ffffffffffffffff8111156140df576140df613aa6565b6140f3816140ed8454613fd4565b8461407f565b602080601f83116001811461414657600084156141105750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561120a565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561419357888601518255948401946001909101908401614174565b50858210156141cf57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff8516815260806020820152600061420260808301866139a8565b905083604083015273ffffffffffffffffffffffffffffffffffffffff8316606083015295945050505050565b60006020828403121561424157600080fd5b815167ffffffffffffffff81111561425857600080fd5b8201601f8101841361426957600080fd5b8051614277613b8982613b24565b81815285602083850101111561428c57600080fd5b61429d826020830160208601613984565b95945050505050565b600080604083850312156142b957600080fd5b82516142c481613c6e565b60208401519092506142d581613a25565b809150509250929050565b6060815260006142f360608301866139a8565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff818116838216019080821115613f9257613f92613f42565b8082018082111561405c5761405c613f42565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126143b657600080fd5b9190910192915050565b6000608082360312156143d257600080fd5b6040516080810167ffffffffffffffff82821081831117156143f6576143f6613aa6565b81604052843591508082111561440b57600080fd5b5061441836828601613b6a565b82525060208301356020820152604083013561443381613a0c565b6040820152606092830135928101929092525090565b600067ffffffffffffffff80831681810361446657614466613f42565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144a1576144a1613f42565b5060010190565b808202811582820484141761405c5761405c613f42565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261451660c08301846139a8565b98975050505050505050565b61ffff818116838216019080821115613f9257613f92613f42565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b16600184015287516145a6816003860160208c01613984565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516145e9816017840160208b01613984565b808201915050818660f81b1660178201528451915061460f826018830160208801613984565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614689816003860160208c01613984565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516146cc816017840160208b01613984565b808201915050818660f01b166017820152845191506146f2826019830160208801613984565b016019019998505050505050505050565b60008651614715818460208b01613984565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b600082516143b681846020870161398456fedf2a8080944d5cf5032b2a844602278b01199ed191a86c93ff8080821092808000000000000000000000000000000000000000000000000000000005ca1ab1e000000000000000000000000000000000000000000000000000000005ca1ab1e01bffa26469706673582212201221389ded8ea187a66f83d3bd052755e28647dbf3bc616c9e91e0a8b7ecf74364736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102f35760003560e01c80637a5460c511610191578063c7fffd4b116100e3578063e46761c411610097578063ecef3f9911610071578063ecef3f99146107b2578063f35dda47146107c5578063f851a440146107cd57600080fd5b8063e46761c414610764578063e7a7ed021461078b578063eaeb077b1461079f57600080fd5b8063cfa8ed47116100c8578063cfa8ed4714610712578063d02103ca14610732578063d7bc90ff1461075957600080fd5b8063c7fffd4b146106f7578063c89e42df146106ff57600080fd5b8063a3c573eb11610145578063af7f3e021161011f578063af7f3e02146106bb578063b0afe154146106c3578063c754c7ed146106cf57600080fd5b8063a3c573eb1461066e578063a652f26c14610695578063ada8f919146106a857600080fd5b806391cafe321161017657806391cafe321461062d5780639e001877146106405780639f26f8401461065b57600080fd5b80637a5460c5146105e95780638c3d73011461062557600080fd5b8063456052671161024a5780635d6717a5116101fe5780636e05d2cd116101d85780636e05d2cd146105ba5780636ff512cc146105c357806371257022146105d657600080fd5b80635d6717a51461057f578063676870d2146105925780636b8616ce1461059a57600080fd5b80634e4877061161022f5780634e4877061461052857806352bdeb6d1461053b578063542028d51461057757600080fd5b806345605267146104c857806349b7b8021461050157600080fd5b806326782247116102ac5780633c351e10116102865780633c351e10146104135780633cbc795b1461043357806340b5de6c1461047057600080fd5b806326782247146103995780632c111c06146103de57806332c2d153146103fe57600080fd5b806305835f37116102dd57806305835f371461032e578063107bf28c1461037757806311e892d41461037f57600080fd5b8062d0295d146102f85780630350896314610313575b600080fd5b6103006107f3565b6040519081526020015b60405180910390f35b61031b602081565b60405161ffff909116815260200161030a565b61036a6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161030a91906139f2565b61036a6108ff565b61038760f981565b60405160ff909116815260200161030a565b6001546103b99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161030a565b6008546103b99073ffffffffffffffffffffffffffffffffffffffff1681565b61041161040c366004613a47565b61098d565b005b6009546103b99073ffffffffffffffffffffffffffffffffffffffff1681565b60095461045b9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161030a565b6104977fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161030a565b6007546104e89068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161030a565b6103b97f000000000000000000000000000000000000000000000000000000000000000081565b610411610536366004613a89565b610a5c565b61036a6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61036a610c6e565b61041161058d366004613bc0565b610c7b565b61031b601f81565b6103006105a8366004613a89565b60066020526000908152604090205481565b61030060055481565b6104116105d1366004613c51565b611212565b6104116105e4366004613c80565b6112dc565b61036a6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610411611afd565b61041161063b366004613c51565b611bd0565b6103b973a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b610411610669366004613d79565b611ce9565b6103b97f000000000000000000000000000000000000000000000000000000000000000081565b61036a6106a3366004613dbb565b612382565b6104116106b6366004613c51565b612767565b61036a612831565b6103006405ca1ab1e081565b6007546104e890700100000000000000000000000000000000900467ffffffffffffffff1681565b61038760e481565b61041161070d366004613e30565b61284d565b6002546103b99073ffffffffffffffffffffffffffffffffffffffff1681565b6103b97f000000000000000000000000000000000000000000000000000000000000000081565b610300635ca1ab1e81565b6103b97f000000000000000000000000000000000000000000000000000000000000000081565b6007546104e89067ffffffffffffffff1681565b6104116107ad366004613e65565b6128e0565b6104116107c0366004613edd565b612db1565b610387601b81565b6000546103b99062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610882573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a69190613f29565b6007549091506000906108d19067ffffffffffffffff68010000000000000000820481169116613f71565b67ffffffffffffffff169050806000036108ee5760009250505090565b6108f88183613f99565b9250505090565b6004805461090c90613fd4565b80601f016020809104026020016040519081016040528092919081815260200182805461093890613fd4565b80156109855780601f1061095a57610100808354040283529160200191610985565b820191906000526020600020905b81548152906001019060200180831161096857829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109fc576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a4f91815260200190565b60405180910390a3505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ab3576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610afa576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b899190614027565b610bea5760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610bea576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461090c90613fd4565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610cea576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1615808015610d0a5750600054600160ff909116105b80610d245750303b158015610d24575060005460ff166001145b610db5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e1357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60006040518060a00160405280606281526020016147f3606291399050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed29190613f29565b90506000868483858d610ee6600143614049565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291506000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015611032573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110569190614062565b90508b600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508a600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555089600390816110e991906140c5565b5060046110f68a826140c5565b508b600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fd2c80353fc15ef62c6affc7cd6b7ab5b42c43290c50be3372e55ae552cecd19c8187858e60405161119994939291906141df565b60405180910390a1505050505050801561120a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611269576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c63565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461134b576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff161580801561136b5750600054600160ff909116105b806113855750303b158015611385575060005460ff166001145b611411576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610dac565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561146f57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff8516156116d6576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab90602401600060405180830381865afa158015611519573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261155f919081019061422f565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015291925060009182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d9060240160408051808303816000875af11580156115f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161a91906142a6565b915091508163ffffffff16600014611692576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff8416171790556116d3565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b60095460009061171e90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685612382565b9050600081805190602001209050600042905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561179e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c29190613f29565b90506000808483858f6117d6600143614049565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af115801561191f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119439190614062565b508c600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600390816119d591906140c5565b5060046119e289826140c5565b508c600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611a83939291906142e0565b60405180910390a15050505050508015611af457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611b4e576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611c27576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611c76576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c63565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590611d27575073ffffffffffffffffffffffffffffffffffffffff81163314155b15611d5e576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611dce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df29190614062565b611dfc919061431f565b67ffffffffffffffff161115611e3e576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003611e7a576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611eb6576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff80821691611ede91849168010000000000000000900416614340565b1115611f16576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff169060005b838110156121b6576000878783818110611f5357611f53614353565b9050602002810190611f659190614382565b611f6e906143c0565b905083611f7a81614449565b825180516020918201208185015160408087015160608801519151959a50929550600094611fe7948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8916600090815260069093529120549091508114612070576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8616600090815260066020526040812055612095600188614049565b84036121045742600760109054906101000a900467ffffffffffffffff1684604001516120c2919061431f565b67ffffffffffffffff161115612104576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120945050505080806121ae90614470565b915050611f37565b5061222c7f0000000000000000000000000000000000000000000000000000000000000000846121e46107f3565b6121ee91906144a8565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691906135ca565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e7300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906122fe908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af115801561231d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123419190614062565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a490600090a250505050505050565b6060600085858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa6000876040516024016123b6969594939291906144bf565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060906000036125075760f9601f835161244b9190614522565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e4876040516020016124f1979695949392919061453d565b604051602081830303815290604052905061260b565b815161ffff1015612544576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9612553602083614522565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016125f89796959493929190614620565b6040516020818303038152906040529150505b805160208083019190912060408051600080825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa15801561266c573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166126e4576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405160009061272a9084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614703565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146127be576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c63565b6040518060a00160405280606281526020016147f36062913981565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146128a4576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036128b082826140c5565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c6391906139f2565b60085473ffffffffffffffffffffffffffffffffffffffff16801580159061291e575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612955576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129e49190614027565b15612a1b576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aac9190613f29565b905082811115612ae8576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388841115612b24576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b6673ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846136a3565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf79190613f29565b6007805491925067ffffffffffffffff909116906000612c1683614449565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051612c4d92919061475f565b6040519081900390208142612c63600143614049565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff1660009081526006909352912055323303612d5b57600754604080518381523360208201526060818301819052600090820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a261120a565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93190612da190849033908b908b9061476f565b60405180910390a2505050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612e02576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000819003612e3e576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612e7a576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612ee257600080fd5b505af1158015612ef6573d6000803e3d6000fd5b5050505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f8b9190613f29565b60075460055491925042916801000000000000000090910467ffffffffffffffff16908160005b868110156132b45760008a8a83818110612fce57612fce614353565b9050602002810190612fe09190614382565b612fe9906143c0565b8051805160209091012060408201519192509067ffffffffffffffff16156131ce578561301581614449565b9650506000818360200151846040015185606001516040516020016130789493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a16600090815260069093529120549091508114613101576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209550600660008867ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600090555061329f565b8151516201d4c0101561320d576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201526000609c82015260bc016040516020818303038152906040528051906020012094505b505080806132ac90614470565b915050612fb2565b5060075467ffffffffffffffff90811690841611156132ff576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff848116908316146133b55760006133258386613f71565b905061333b67ffffffffffffffff821683614049565b91506133747f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166121e46107f3565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b6134b3337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015613446573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061346a9190613f29565b61347491906144a8565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906136a3565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303816000875af1158015613553573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135779190614062565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e766886040516135b591815260200190565b60405180910390a25050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261369e9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613707565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526137019085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161361c565b50505050565b6000613769826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166138139092919063ffffffff16565b80519091501561369e57808060200190518101906137879190614027565b61369e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610dac565b606061275f8484600085856000808673ffffffffffffffffffffffffffffffffffffffff16858760405161384791906147e0565b60006040518083038185875af1925050503d8060008114613884576040519150601f19603f3d011682016040523d82523d6000602084013e613889565b606091505b509150915061389a878383876138a5565b979650505050505050565b6060831561393b5782516000036139345773ffffffffffffffffffffffffffffffffffffffff85163b613934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610dac565b508161275f565b61275f83838151156139505781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dac91906139f2565b60005b8381101561399f578181015183820152602001613987565b50506000910152565b600081518084526139c0816020860160208601613984565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613a0560208301846139a8565b9392505050565b67ffffffffffffffff81168114613a2257600080fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613a2257600080fd5b600080600060608486031215613a5c57600080fd5b8335613a6781613a0c565b9250602084013591506040840135613a7e81613a25565b809150509250925092565b600060208284031215613a9b57600080fd5b8135613a0581613a0c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613b1c57613b1c613aa6565b604052919050565b600067ffffffffffffffff821115613b3e57613b3e613aa6565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613b7b57600080fd5b8135613b8e613b8982613b24565b613ad5565b818152846020838601011115613ba357600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215613bd857600080fd5b8535613be381613a25565b94506020860135613bf381613a25565b9350604086013567ffffffffffffffff80821115613c1057600080fd5b613c1c89838a01613b6a565b94506060880135915080821115613c3257600080fd5b50613c3f88828901613b6a565b95989497509295608001359392505050565b600060208284031215613c6357600080fd5b8135613a0581613a25565b63ffffffff81168114613a2257600080fd5b60008060008060008060c08789031215613c9957600080fd5b8635613ca481613a25565b95506020870135613cb481613a25565b94506040870135613cc481613c6e565b93506060870135613cd481613a25565b9250608087013567ffffffffffffffff80821115613cf157600080fd5b613cfd8a838b01613b6a565b935060a0890135915080821115613d1357600080fd5b50613d2089828a01613b6a565b9150509295509295509295565b60008083601f840112613d3f57600080fd5b50813567ffffffffffffffff811115613d5757600080fd5b6020830191508360208260051b8501011115613d7257600080fd5b9250929050565b60008060208385031215613d8c57600080fd5b823567ffffffffffffffff811115613da357600080fd5b613daf85828601613d2d565b90969095509350505050565b60008060008060808587031215613dd157600080fd5b8435613ddc81613c6e565b93506020850135613dec81613a25565b92506040850135613dfc81613c6e565b9150606085013567ffffffffffffffff811115613e1857600080fd5b613e2487828801613b6a565b91505092959194509250565b600060208284031215613e4257600080fd5b813567ffffffffffffffff811115613e5957600080fd5b61275f84828501613b6a565b600080600060408486031215613e7a57600080fd5b833567ffffffffffffffff80821115613e9257600080fd5b818601915086601f830112613ea657600080fd5b813581811115613eb557600080fd5b876020828501011115613ec757600080fd5b6020928301989097509590910135949350505050565b600080600060408486031215613ef257600080fd5b833567ffffffffffffffff811115613f0957600080fd5b613f1586828701613d2d565b9094509250506020840135613a7e81613a25565b600060208284031215613f3b57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff828116828216039080821115613f9257613f92613f42565b5092915050565b600082613fcf577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181811c90821680613fe857607f821691505b602082108103614021577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561403957600080fd5b81518015158114613a0557600080fd5b8181038181111561405c5761405c613f42565b92915050565b60006020828403121561407457600080fd5b8151613a0581613a0c565b601f82111561369e57600081815260208120601f850160051c810160208610156140a65750805b601f850160051c820191505b8181101561120a578281556001016140b2565b815167ffffffffffffffff8111156140df576140df613aa6565b6140f3816140ed8454613fd4565b8461407f565b602080601f83116001811461414657600084156141105750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561120a565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561419357888601518255948401946001909101908401614174565b50858210156141cf57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff8516815260806020820152600061420260808301866139a8565b905083604083015273ffffffffffffffffffffffffffffffffffffffff8316606083015295945050505050565b60006020828403121561424157600080fd5b815167ffffffffffffffff81111561425857600080fd5b8201601f8101841361426957600080fd5b8051614277613b8982613b24565b81815285602083850101111561428c57600080fd5b61429d826020830160208601613984565b95945050505050565b600080604083850312156142b957600080fd5b82516142c481613c6e565b60208401519092506142d581613a25565b809150509250929050565b6060815260006142f360608301866139a8565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff818116838216019080821115613f9257613f92613f42565b8082018082111561405c5761405c613f42565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126143b657600080fd5b9190910192915050565b6000608082360312156143d257600080fd5b6040516080810167ffffffffffffffff82821081831117156143f6576143f6613aa6565b81604052843591508082111561440b57600080fd5b5061441836828601613b6a565b82525060208301356020820152604083013561443381613a0c565b6040820152606092830135928101929092525090565b600067ffffffffffffffff80831681810361446657614466613f42565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144a1576144a1613f42565b5060010190565b808202811582820484141761405c5761405c613f42565b600063ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261451660c08301846139a8565b98975050505050505050565b61ffff818116838216019080821115613f9257613f92613f42565b60007fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b16600184015287516145a6816003860160208c01613984565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516145e9816017840160208b01613984565b808201915050818660f81b1660178201528451915061460f826018830160208801613984565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b16815260007fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614689816003860160208c01613984565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516146cc816017840160208b01613984565b808201915050818660f01b166017820152845191506146f2826019830160208801613984565b016019019998505050505050505050565b60008651614715818460208b01613984565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b8183823760009101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b600082516143b681846020870161398456fedf2a8080944d5cf5032b2a844602278b01199ed191a86c93ff8080821092808000000000000000000000000000000000000000000000000000000005ca1ab1e000000000000000000000000000000000000000000000000000000005ca1ab1e01bffa26469706673582212201221389ded8ea187a66f83d3bd052755e28647dbf3bc616c9e91e0a8b7ecf74364736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/contracts/v2/consensus/zkEVM/PolygonZkEVMExistentEtrog.sol b/contracts/v2/consensus/zkEVM/PolygonZkEVMExistentEtrog.sol index f13d02ea6..431519dda 100644 --- a/contracts/v2/consensus/zkEVM/PolygonZkEVMExistentEtrog.sol +++ b/contracts/v2/consensus/zkEVM/PolygonZkEVMExistentEtrog.sol @@ -38,6 +38,7 @@ contract PolygonZkEVMExistentEtrog is PolygonRollupBaseEtrog { * @dev Emitted when the system is updated to a etrog using this contract, contain the set up etrog transaction */ event UpdateEtrogSequence( + uint64 numBatch, bytes transactions, bytes32 lastGlobalExitRoot, address sequencer @@ -103,7 +104,7 @@ contract PolygonZkEVMExistentEtrog is PolygonRollupBaseEtrog { // Set acumulated input hash lastAccInputHash = newAccInputHash; - rollupManager.onSequenceBatches( + uint64 currentBatchSequenced = rollupManager.onSequenceBatches( uint64(1), // num total batches newAccInputHash ); @@ -124,6 +125,7 @@ contract PolygonZkEVMExistentEtrog is PolygonRollupBaseEtrog { // Therefore is not necessary to set the variables emit UpdateEtrogSequence( + currentBatchSequenced, transaction, lastGlobalExitRoot, _trustedSequencer From 3733c47db1ec4faaf7a4043ca1641053b4d8daaf Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 17 Jan 2024 18:02:18 +0100 Subject: [PATCH 153/230] adding tests --- .../mocks/PolygonRollupManagerEmptyMock.sol | 26 ++ test/contractsv2/BridgeV2.test.ts | 207 ++++++++++ ...VMV2.test.ts => PolygonZkEVMEtrog.test.ts} | 355 +++++++++++++++++- 3 files changed, 580 insertions(+), 8 deletions(-) rename test/contractsv2/{PolygonZkEVMV2.test.ts => PolygonZkEVMEtrog.test.ts} (66%) diff --git a/contracts/v2/mocks/PolygonRollupManagerEmptyMock.sol b/contracts/v2/mocks/PolygonRollupManagerEmptyMock.sol index ae9a44ba8..2722c9675 100644 --- a/contracts/v2/mocks/PolygonRollupManagerEmptyMock.sol +++ b/contracts/v2/mocks/PolygonRollupManagerEmptyMock.sol @@ -30,4 +30,30 @@ contract PolygonRollupManagerEmptyMock is EmergencyManager { function getForcedBatchFee() public view returns (uint256) { return 10; } + + /** + * @notice Function to deactivate emergency state on both PolygonZkEVM and PolygonZkEVMBridge contracts + */ + function activateEmergencyState() external { + // activate emergency state on this contract + super._activateEmergencyState(); + } + + /** + * @notice Function to deactivate emergency state on both PolygonZkEVM and PolygonZkEVMBridge contracts + */ + function lastDeactivatedEmergencyStateTimestamp() + external + returns (uint256) + { + return 0; + } + + /** + * @notice Function to deactivate emergency state on both PolygonZkEVM and PolygonZkEVMBridge contracts + */ + function deactivateEmergencyState() external { + // Deactivate emergency state on this contract + super._deactivateEmergencyState(); + } } diff --git a/test/contractsv2/BridgeV2.test.ts b/test/contractsv2/BridgeV2.test.ts index f7cbf63bf..88478354d 100644 --- a/test/contractsv2/BridgeV2.test.ts +++ b/test/contractsv2/BridgeV2.test.ts @@ -211,6 +211,100 @@ describe("PolygonZkEVMBridge Contract", () => { expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); }); + it("should PolygonZkEVM bridge asset and verify merkle proof", async () => { + const depositCount = await polygonZkEVMBridgeContract.depositCount(); + const originNetwork = networkIDMainnet; + const tokenAddress = polTokenContract.target; + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDRollup; + const destinationAddress = deployer.address; + + const metadata = metadataToken; + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + const balanceDeployer = await polTokenContract.balanceOf(deployer.address); + const balanceBridge = await polTokenContract.balanceOf(polygonZkEVMBridgeContract.target); + + const rollupExitRoot = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + + // create a new deposit + await expect(polTokenContract.approve(polygonZkEVMBridgeContract.target, amount)) + .to.emit(polTokenContract, "Approval") + .withArgs(deployer.address, polygonZkEVMBridgeContract.target, amount); + + // pre compute root merkle tree in Js + const height = 32; + const merkleTree = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + merkleTree.add(leafValue); + const rootJSMainnet = merkleTree.getRoot(); + + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount, + tokenAddress, + true, + "0x", + {value: 1} + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "MsgValueNotZero"); + + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount, + tokenAddress, + true, + "0x" + ) + ) + .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .withArgs( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata, + depositCount + ) + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .withArgs(rootJSMainnet, rollupExitRoot); + + expect(await polTokenContract.balanceOf(deployer.address)).to.be.equal(balanceDeployer - amount); + expect(await polTokenContract.balanceOf(polygonZkEVMBridgeContract.target)).to.be.equal(balanceBridge + amount); + expect(await polygonZkEVMBridgeContract.lastUpdatedDepositCount()).to.be.equal(1); + + // check merkle root with SC + const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); + expect(rootSCMainnet).to.be.equal(rootJSMainnet); + + // check merkle proof + const proof = merkleTree.getProofTreeByIndex(0); + const index = 0; + + // verify merkle proof + expect(verifyMerkleProof(leafValue, proof, index, rootSCMainnet)).to.be.equal(true); + expect(await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proof, index, rootSCMainnet)).to.be.equal( + true + ); + + const computedGlobalExitRoot = calculateGlobalExitRoot(rootJSMainnet, rollupExitRoot); + expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + }); + it("should PolygonZkEVMBridge message and verify merkle proof", async () => { const depositCount = await polygonZkEVMBridgeContract.depositCount(); const originNetwork = networkIDMainnet; @@ -1002,7 +1096,120 @@ describe("PolygonZkEVMBridge Contract", () => { const computedGlobalExitRoot2 = calculateGlobalExitRoot(rootJSMainnet, rollupExitRoot); expect(computedGlobalExitRoot2).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); }); + it("should claim tokens from Rollup to Mainnet, faling deploy wrapped", async () => { + const originNetwork = networkIDRollup; + const tokenAddress = polTokenContract.target; + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDMainnet; + const destinationAddress = deployer.address; + + const metadata = ethers.hexlify(ethers.randomBytes(40)); + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + const mainnetExitRoot = await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot(); + + // compute root merkle tree in Js + const height = 32; + const merkleTreeLocal = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + merkleTreeLocal.add(leafValue); + merkleTreeLocal.add(leafValue); + + const rootLocalRollup = merkleTreeLocal.getRoot(); + + // Try claim with 10 rollup leafs + const merkleTreeRollup = new MerkleTreeBridge(height); + for (let i = 0; i < 10; i++) { + merkleTreeRollup.add(rootLocalRollup); + } + + const rootRollup = merkleTreeRollup.getRoot(); + + // check only rollup account with update rollup exit root + await expect(polygonZkEVMGlobalExitRoot.updateExitRoot(rootRollup)).to.be.revertedWithCustomError( + polygonZkEVMGlobalExitRoot, + "OnlyAllowedContracts" + ); + + // add rollup Merkle root + await expect(polygonZkEVMGlobalExitRoot.connect(rollupManager).updateExitRoot(rootRollup)) + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .withArgs(mainnetExitRoot, rootRollup); + + // check roots + const rollupExitRootSC = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + expect(rollupExitRootSC).to.be.equal(rootRollup); + + const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC); + expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + + // check merkle proof + + // Merkle proof local + const indexLocal = 0; + const proofLocal = merkleTreeLocal.getProofTreeByIndex(indexLocal); + + // Merkle proof local + const indexRollup = 5; + const proofRollup = merkleTreeRollup.getProofTreeByIndex(indexRollup); + + // verify merkle proof + expect(verifyMerkleProof(leafValue, proofLocal, indexLocal, rootLocalRollup)).to.be.equal(true); + expect(verifyMerkleProof(rootLocalRollup, proofRollup, indexRollup, rootRollup)).to.be.equal(true); + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(rootLocalRollup, proofRollup, indexRollup, rootRollup) + ).to.be.equal(true); + const globalIndex = computeGlobalIndex(indexLocal, indexRollup, false); + + expect(false).to.be.equal(await polygonZkEVMBridgeContract.isClaimed(indexLocal, indexRollup + 1)); + // claim + const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); + // create2 parameters + const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]); + const minimalBytecodeProxy = await polygonZkEVMBridgeContract.BASE_INIT_BYTECODE_WRAPPED_TOKEN(); + const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]); + const precalculateWrappedErc20 = await ethers.getCreate2Address( + polygonZkEVMBridgeContract.target as string, + salt, + hashInitCode + ); + + // Use precalculatedWrapperAddress and check if matches + expect( + await polygonZkEVMBridgeContract.precalculatedWrapperAddress( + networkIDRollup, + tokenAddress, + tokenName, + tokenSymbol, + decimals + ) + ).to.be.equal(precalculateWrappedErc20); + + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofLocal, + proofRollup, + globalIndex, + mainnetExitRoot, + rollupExitRootSC, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "FailedTokenWrappedDeployment"); + }); it("should PolygonZkEVMBridge and sync the current root with events", async () => { const depositCount = await polygonZkEVMBridgeContract.depositCount(); const originNetwork = networkIDMainnet; diff --git a/test/contractsv2/PolygonZkEVMV2.test.ts b/test/contractsv2/PolygonZkEVMEtrog.test.ts similarity index 66% rename from test/contractsv2/PolygonZkEVMV2.test.ts rename to test/contractsv2/PolygonZkEVMEtrog.test.ts index db5556480..53a9f14e9 100644 --- a/test/contractsv2/PolygonZkEVMV2.test.ts +++ b/test/contractsv2/PolygonZkEVMEtrog.test.ts @@ -7,19 +7,17 @@ import { PolygonRollupManagerMock, PolygonZkEVMGlobalExitRootV2, PolygonZkEVMBridgeV2, - PolygonZkEVMV2, PolygonZkEVMEtrog, - PolygonRollupBase, PolygonRollupBaseEtrog, TokenWrapped, Address, + PolygonRollupManagerEmptyMock__factory, } from "../../typechain-types"; import {takeSnapshot, time} from "@nomicfoundation/hardhat-network-helpers"; import {processorUtils, contractUtils, MTBridge, mtBridgeUtils} from "@0xpolygonhermez/zkevm-commonjs"; +import {array} from "yargs"; const {calculateSnarkInput, calculateAccInputHash, calculateBatchHashData} = contractUtils; -type BatchDataStruct = PolygonRollupBase.BatchDataStruct; -type ForcedBatchDataStruct = PolygonRollupBase.ForcedBatchDataStruct; type BatchDataStructEtrog = PolygonRollupBaseEtrog.BatchDataStruct; const MerkleTreeBridge = MTBridge; @@ -42,8 +40,8 @@ describe("PolygonZkEVMEtrog", () => { let polygonZkEVMBridgeContract: PolygonZkEVMBridgeV2; let polTokenContract: ERC20PermitMock; let polygonZkEVMGlobalExitRoot: PolygonZkEVMGlobalExitRootV2; - let rollupManagerContract: PolygonRollupManagerEmptyMock; - let PolygonZKEVMV2Contract: PolygonZkEVMV2; + let rollupManagerContract: PolygonRollupManagerMock; + let PolygonZKEVMV2Contract: PolygonZkEVMEtrog; const polTokenName = "POL Token"; const polTokenSymbol = "POL"; @@ -52,7 +50,8 @@ describe("PolygonZkEVMEtrog", () => { const pendingStateTimeoutDefault = 100; const trustedAggregatorTimeout = 100; const FORCE_BATCH_TIMEOUT = 60 * 60 * 24 * 5; // 5 days - + const _MAX_VERIFY_BATCHES = 1000; + const _MAX_TRANSACTIONS_BYTE_LENGTH = 120000; // BRidge constants const networkIDMainnet = 0; const networkIDRollup = 1; @@ -202,12 +201,24 @@ describe("PolygonZkEVMEtrog", () => { ) ).to.emit(PolygonZKEVMV2Contract, "InitialSequenceBatches"); - const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; expect(await PolygonZKEVMV2Contract.admin()).to.be.equal(admin.address); expect(await PolygonZKEVMV2Contract.trustedSequencer()).to.be.equal(trustedSequencer.address); expect(await PolygonZKEVMV2Contract.trustedSequencerURL()).to.be.equal(urlSequencer); expect(await PolygonZKEVMV2Contract.networkName()).to.be.equal(networkName); expect(await PolygonZKEVMV2Contract.forceBatchTimeout()).to.be.equal(FORCE_BATCH_TIMEOUT); + + // initialize zkEVM + await expect( + PolygonZKEVMV2Contract.connect(rolllupManagerSigner).initialize( + admin.address, + trustedSequencer.address, + networkID, + gasTokenAddress, + urlSequencer, + networkName, + {gasPrice: 0} + ) + ).to.be.revertedWith("Initializable: contract is already initialized"); }); it("should check admin functions", async () => { @@ -248,6 +259,11 @@ describe("PolygonZkEVMEtrog", () => { "OnlyAdmin" ); + // Set Forcebatch timeout + await expect( + PolygonZKEVMV2Contract.connect(admin).setForceBatchTimeout(FORCE_BATCH_TIMEOUT + 1) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "InvalidRangeForceBatchTimeout"); + await expect( PolygonZKEVMV2Contract.connect(admin).setForceBatchTimeout(FORCE_BATCH_TIMEOUT) ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "InvalidRangeForceBatchTimeout"); @@ -256,6 +272,14 @@ describe("PolygonZkEVMEtrog", () => { .to.emit(PolygonZKEVMV2Contract, "SetForceBatchTimeout") .withArgs(0); + expect(await PolygonZKEVMV2Contract.forceBatchTimeout()).to.be.equal(0); + + await rollupManagerContract.activateEmergencyState(); + await expect(PolygonZKEVMV2Contract.connect(admin).setForceBatchTimeout(FORCE_BATCH_TIMEOUT)) + .to.emit(PolygonZKEVMV2Contract, "SetForceBatchTimeout") + .withArgs(FORCE_BATCH_TIMEOUT); + await rollupManagerContract.deactivateEmergencyState(); + await expect(PolygonZKEVMV2Contract.transferAdminRole(deployer.address)).to.be.revertedWithCustomError( PolygonZKEVMV2Contract, "OnlyAdmin" @@ -296,8 +320,19 @@ describe("PolygonZkEVMEtrog", () => { await expect( PolygonZKEVMV2Contract.connect(deployer).setForceBatchAddress(ethers.ZeroAddress) ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "ForceBatchesDecentralized"); + + // Check revert onVerifyBatches + await expect( + PolygonZKEVMV2Contract.connect(admin).onVerifyBatches(0, ethers.ZeroHash, trustedAggregator.address) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "OnlyRollupManager"); }); + it("should generateInitializeTransaction with huge metadata", async () => { + const hugeMetadata = `0x${"00".repeat(Number(2n ** 16n))}`; + await expect( + PolygonZKEVMV2Contract.generateInitializeTransaction(0, ethers.ZeroAddress, 1, hugeMetadata) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "HugeTokenMetadataNotSupported"); + }); it("should check full flow", async () => { // Initialzie using rollup manager await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); @@ -377,6 +412,56 @@ describe("PolygonZkEVMEtrog", () => { ).to.emit(polTokenContract, "Approval"); // Sequence Batches + + await expect( + PolygonZKEVMV2Contract.sequenceBatches([sequence], trustedSequencer.address) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "OnlyTrustedSequencer"); + + await expect( + PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatches([], trustedSequencer.address) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "SequenceZeroBatches"); + + const hugeBatchArray = new Array(_MAX_VERIFY_BATCHES + 1).fill({ + transactions: "0x", + forcedGlobalExitRoot: ethers.ZeroHash, + forcedTimestamp: 0, + forcedBlockHashL1: ethers.ZeroHash, + }); + + await expect( + PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatches(hugeBatchArray, trustedSequencer.address) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "ExceedMaxVerifyBatches"); + + // Create a huge sequence + await expect( + PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatches( + [ + { + transactions: `0x${"00".repeat(_MAX_TRANSACTIONS_BYTE_LENGTH + 1)}` as any, + forcedGlobalExitRoot: ethers.ZeroHash, + forcedTimestamp: 0, + forcedBlockHashL1: ethers.ZeroHash, + }, + ], + trustedSequencer.address + ) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "TransactionsLengthAboveMax"); + + // False forced batch + await expect( + PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatches( + [ + { + transactions: "0x", + forcedGlobalExitRoot: ethers.hexlify(ethers.randomBytes(32)), + forcedTimestamp: 1000, + forcedBlockHashL1: ethers.ZeroHash, + }, + ], + trustedSequencer.address + ) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "ForcedDataDoesNotMatch"); + await expect( PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address) ).to.emit(PolygonZKEVMV2Contract, "SequenceBatches"); @@ -696,6 +781,13 @@ describe("PolygonZkEVMEtrog", () => { "NotEnoughPOLAmount" ); + await expect( + PolygonZKEVMV2Contract.connect(admin).forceBatch( + `0x${"00".repeat(_MAX_TRANSACTIONS_BYTE_LENGTH + 1)}`, + maticAmount + ) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "TransactionsLengthAboveMax"); + await expect(PolygonZKEVMV2Contract.connect(admin).forceBatch(l2txData, maticAmount)) .to.emit(PolygonZKEVMV2Contract, "ForceBatch") .withArgs(1, globalExitRoot, admin.address, "0x"); @@ -704,6 +796,253 @@ describe("PolygonZkEVMEtrog", () => { await rollupManagerContract.getForcedBatchFee() ); }); + + it("should check forced batches from a contract", async () => { + // Initialzie using rollup manager + await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); + const rolllupManagerSigner = await ethers.getSigner(rollupManagerContract.target as any); + await expect( + PolygonZKEVMV2Contract.connect(rolllupManagerSigner).initialize( + admin.address, + trustedSequencer.address, + networkID, + gasTokenAddress, + urlSequencer, + networkName, + {gasPrice: 0} + ) + ).to.emit(PolygonZKEVMV2Contract, "InitialSequenceBatches"); + + const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; + const transaction = await PolygonZKEVMV2Contract.generateInitializeTransaction( + networkID, + gasTokenAddress, + gasTokenNetwork, + "0x" // empty metadata + ); + + // Check transaction + const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + const encodedData = bridgeL2Factory.interface.encodeFunctionData("initialize", [ + networkID, + gasTokenAddress, + gasTokenNetwork, + globalExitRootL2Address, + ethers.ZeroAddress, + "0x", // empty metadata + ]); + + const blockCreatedRollup = await ethers.provider.getBlock("latest"); + + const rawTx = processorUtils.customRawTxToRawTx(transaction); + const tx = ethers.Transaction.from(rawTx); + + const rlpSignData = transaction.slice(0, -(SIGNATURE_BYTES * 2 + EFFECTIVE_PERCENTAGE_BYTES * 2)); + expect(rlpSignData).to.be.equal(tx.unsignedSerialized); + + expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); + expect(tx.value).to.be.equal(0); + expect(tx.data).to.be.equal(encodedData); + expect(tx.gasPrice).to.be.equal(0); + expect(tx.gasLimit).to.be.equal(30000000); + expect(tx.nonce).to.be.equal(0); + expect(tx.chainId).to.be.equal(0); + + const expectedAccInputHash = calculateAccInputHashetrog( + ethers.ZeroHash, + ethers.keccak256(transaction), + await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), + timestampCreatedRollup, + trustedSequencer.address, + blockCreatedRollup?.parentHash + ); + + // calcualte accINputHash + expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash); + + // try verify batches + const l2txData = "0x123456"; + const maticAmount = ethers.parseEther("1"); + + expect(await PolygonZKEVMV2Contract.calculatePolPerForceBatch()).to.be.equal(0); + + // deploy sender SC + const sendDataFactory = await ethers.getContractFactory("SendData"); + const sendDataContract = await sendDataFactory.deploy(); + await sendDataContract.waitForDeployment(); + + // Approve matic + const approveTx = await polTokenContract.approve.populateTransaction( + PolygonZKEVMV2Contract.target, + maticAmount + ); + await sendDataContract.sendData(approveTx.to, approveTx.data); + + // Activate forced batches + await expect(PolygonZKEVMV2Contract.connect(admin).setForceBatchAddress(sendDataContract.target)).to.emit( + PolygonZKEVMV2Contract, + "SetForceBatchAddress" + ); + + await polTokenContract.transfer(sendDataContract.target, ethers.parseEther("1000")); + + const globalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); + const lastForcedBatch = (await PolygonZKEVMV2Contract.lastForceBatch()) + 1n; + + const forceBatchTx = await PolygonZKEVMV2Contract.forceBatch.populateTransaction(l2txData, maticAmount); + await expect(sendDataContract.sendData(forceBatchTx.to, forceBatchTx.data)) + .to.emit(PolygonZKEVMV2Contract, "ForceBatch") + .withArgs(lastForcedBatch, globalExitRoot, sendDataContract.target, l2txData); + + expect(await PolygonZKEVMV2Contract.calculatePolPerForceBatch()).to.be.equal( + await rollupManagerContract.getForcedBatchFee() + ); + }); + + it("should check forced batches from a contract", async () => { + // Initialzie using rollup manager + await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); + const rolllupManagerSigner = await ethers.getSigner(rollupManagerContract.target as any); + await expect( + PolygonZKEVMV2Contract.connect(rolllupManagerSigner).initialize( + admin.address, + trustedSequencer.address, + networkID, + gasTokenAddress, + urlSequencer, + networkName, + {gasPrice: 0} + ) + ).to.emit(PolygonZKEVMV2Contract, "InitialSequenceBatches"); + + const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; + const transaction = await PolygonZKEVMV2Contract.generateInitializeTransaction( + networkID, + gasTokenAddress, + gasTokenNetwork, + "0x" // empty metadata + ); + + // Check transaction + const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + const encodedData = bridgeL2Factory.interface.encodeFunctionData("initialize", [ + networkID, + gasTokenAddress, + gasTokenNetwork, + globalExitRootL2Address, + ethers.ZeroAddress, + "0x", // empty metadata + ]); + + const blockCreatedRollup = await ethers.provider.getBlock("latest"); + + const rawTx = processorUtils.customRawTxToRawTx(transaction); + const tx = ethers.Transaction.from(rawTx); + + const rlpSignData = transaction.slice(0, -(SIGNATURE_BYTES * 2 + EFFECTIVE_PERCENTAGE_BYTES * 2)); + expect(rlpSignData).to.be.equal(tx.unsignedSerialized); + + expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); + expect(tx.value).to.be.equal(0); + expect(tx.data).to.be.equal(encodedData); + expect(tx.gasPrice).to.be.equal(0); + expect(tx.gasLimit).to.be.equal(30000000); + expect(tx.nonce).to.be.equal(0); + expect(tx.chainId).to.be.equal(0); + + const expectedAccInputHash = calculateAccInputHashetrog( + ethers.ZeroHash, + ethers.keccak256(transaction), + await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), + timestampCreatedRollup, + trustedSequencer.address, + blockCreatedRollup?.parentHash + ); + + // calcualte accINputHash + expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash); + + // try verify batches + const l2txData = "0x123456"; + const maticAmount = ethers.parseEther("1"); + + // Approve tokens + await polTokenContract.transfer(admin.address, ethers.parseEther("1000")); + await expect(polTokenContract.connect(admin).approve(PolygonZKEVMV2Contract.target, maticAmount)).to.emit( + polTokenContract, + "Approval" + ); + + expect(await PolygonZKEVMV2Contract.calculatePolPerForceBatch()).to.be.equal(0); + const globalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); + + const adminPolBalance = await polTokenContract.balanceOf(admin.address); + const forceBatchFee = await rollupManagerContract.getForcedBatchFee(); + + await expect(PolygonZKEVMV2Contract.connect(admin).forceBatch(l2txData, maticAmount)) + .to.emit(PolygonZKEVMV2Contract, "ForceBatch") + .withArgs(1, globalExitRoot, admin.address, "0x"); + + const blockForced = await ethers.provider.getBlock("latest"); + const timestampForceBatch = blockForced?.timestamp as any; + + expect(await polTokenContract.balanceOf(admin.address)).to.be.equal(adminPolBalance - forceBatchFee); + + expect(await PolygonZKEVMV2Contract.calculatePolPerForceBatch()).to.be.equal( + await rollupManagerContract.getForcedBatchFee() + ); + + // Sequence force batches + const sequenceForced = { + transactions: l2txData, + forcedGlobalExitRoot: globalExitRoot, + forcedTimestamp: timestampForceBatch, + forcedBlockHashL1: blockForced?.parentHash, + } as BatchDataStructEtrog; + + // sequence force batch + await expect(PolygonZKEVMV2Contract.connect(admin).sequenceForceBatches([])).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "SequenceZeroBatches" + ); + + // sequence force batch + const sequencedArray = new Array(_MAX_VERIFY_BATCHES + 1).fill(sequenceForced); + + await expect( + PolygonZKEVMV2Contract.connect(admin).sequenceForceBatches(sequencedArray) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "ExceedMaxVerifyBatches"); + + // sequence force batch + await expect( + PolygonZKEVMV2Contract.connect(admin).sequenceForceBatches([sequenceForced, sequenceForced]) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "ForceBatchesOverflow"); + + // sequence force batch + await expect( + PolygonZKEVMV2Contract.connect(admin).sequenceForceBatches([sequenceForced]) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "ForceBatchTimeoutNotExpired"); + + // Increment timestamp + await ethers.provider.send("evm_setNextBlockTimestamp", [timestampForceBatch + FORCE_BATCH_TIMEOUT]); + + // sequence force batch + await expect(PolygonZKEVMV2Contract.connect(admin).sequenceForceBatches([sequenceForced])) + .to.emit(PolygonZKEVMV2Contract, "SequenceForceBatches") + .withArgs(1); + + const expectedAccInputHash3 = calculateAccInputHashetrog( + expectedAccInputHash, + ethers.keccak256(l2txData), + globalExitRoot, + timestampForceBatch, + admin.address, + blockForced?.parentHash + ); + + // calcualte accINputHash + expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash3); + }); }); /** From 5f0414269a112326e05e5e6a05e419615476d83e Mon Sep 17 00:00:00 2001 From: invocamanman Date: Thu, 18 Jan 2024 10:57:10 +0100 Subject: [PATCH 154/230] moar tests --- contracts/mocks/ERC20InvalidMetadata.sol | 390 ++++++++++++++++++ test/contractsv2/BridgeV2Metadata.test.ts | 188 +++++++++ .../PolygonRollupManagerUpgrade.test.ts | 17 + 3 files changed, 595 insertions(+) create mode 100644 contracts/mocks/ERC20InvalidMetadata.sol diff --git a/contracts/mocks/ERC20InvalidMetadata.sol b/contracts/mocks/ERC20InvalidMetadata.sol new file mode 100644 index 000000000..7f1d1be18 --- /dev/null +++ b/contracts/mocks/ERC20InvalidMetadata.sol @@ -0,0 +1,390 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol) + +pragma solidity ^0.8.0; + +/** + * @dev Implementation of the ERC20 with weird metadata. + */ +contract ERC20InvalidMetadata { + event Transfer(address indexed from, address indexed to, uint256 value); + event Approval( + address indexed owner, + address indexed spender, + uint256 value + ); + + mapping(address => uint256) private _balances; + + mapping(address => mapping(address => uint256)) private _allowances; + + uint256 private _totalSupply; + + bytes32 internal _name; + + bytes internal _symbol; + + uint256 internal _decimals; + + bool public isRevert; + + constructor(bytes32 name_, bytes memory symbol_, uint256 decimals_) { + _name = name_; + _symbol = symbol_; + _decimals = decimals_; + } + + function setDecimals(uint256 newDecimals) public { + _decimals = newDecimals; + } + + function toggleIsRevert() public { + isRevert = !isRevert; + } + + function name() public view virtual returns (bytes memory) { + assembly { + return(0, 10) + } + } + + function symbol() public view virtual returns (bytes memory) { + assembly { + return(0, 0) + } + } + + function decimals() public view virtual returns (uint256) { + if (isRevert) { + require(false); + } + return _decimals; + } + + function mint(address account, uint256 amount) public { + _mint(account, amount); + } + + /** + * @dev See {IERC20-totalSupply}. + */ + function totalSupply() public view virtual returns (uint256) { + return _totalSupply; + } + + /** + * @dev See {IERC20-balanceOf}. + */ + function balanceOf(address account) public view virtual returns (uint256) { + return _balances[account]; + } + + /** + * @dev See {IERC20-transfer}. + * + * Requirements: + * + * - `to` cannot be the zero address. + * - the caller must have a balance of at least `amount`. + */ + function transfer( + address to, + uint256 amount + ) public virtual returns (bool) { + address owner = msg.sender; + _transfer(owner, to, amount); + return true; + } + + /** + * @dev See {IERC20-allowance}. + */ + function allowance( + address owner, + address spender + ) public view virtual returns (uint256) { + return _allowances[owner][spender]; + } + + /** + * @dev See {IERC20-approve}. + * + * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on + * `transferFrom`. This is semantically equivalent to an infinite approval. + * + * Requirements: + * + * - `spender` cannot be the zero address. + */ + function approve( + address spender, + uint256 amount + ) public virtual returns (bool) { + address owner = msg.sender; + _approve(owner, spender, amount); + return true; + } + + /** + * @dev See {IERC20-transferFrom}. + * + * Emits an {Approval} event indicating the updated allowance. This is not + * required by the EIP. See the note at the beginning of {ERC20}. + * + * NOTE: Does not update the allowance if the current allowance + * is the maximum `uint256`. + * + * Requirements: + * + * - `from` and `to` cannot be the zero address. + * - `from` must have a balance of at least `amount`. + * - the caller must have allowance for ``from``'s tokens of at least + * `amount`. + */ + function transferFrom( + address from, + address to, + uint256 amount + ) public virtual returns (bool) { + address spender = msg.sender; + _spendAllowance(from, spender, amount); + _transfer(from, to, amount); + return true; + } + + /** + * @dev Atomically increases the allowance granted to `spender` by the caller. + * + * This is an alternative to {approve} that can be used as a mitigation for + * problems described in {IERC20-approve}. + * + * Emits an {Approval} event indicating the updated allowance. + * + * Requirements: + * + * - `spender` cannot be the zero address. + */ + function increaseAllowance( + address spender, + uint256 addedValue + ) public virtual returns (bool) { + address owner = msg.sender; + _approve(owner, spender, allowance(owner, spender) + addedValue); + return true; + } + + /** + * @dev Atomically decreases the allowance granted to `spender` by the caller. + * + * This is an alternative to {approve} that can be used as a mitigation for + * problems described in {IERC20-approve}. + * + * Emits an {Approval} event indicating the updated allowance. + * + * Requirements: + * + * - `spender` cannot be the zero address. + * - `spender` must have allowance for the caller of at least + * `subtractedValue`. + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) public virtual returns (bool) { + address owner = msg.sender; + uint256 currentAllowance = allowance(owner, spender); + require( + currentAllowance >= subtractedValue, + "ERC20: decreased allowance below zero" + ); + unchecked { + _approve(owner, spender, currentAllowance - subtractedValue); + } + + return true; + } + + /** + * @dev Moves `amount` of tokens from `from` to `to`. + * + * This internal function is equivalent to {transfer}, and can be used to + * e.g. implement automatic token fees, slashing mechanisms, etc. + * + * Emits a {Transfer} event. + * + * Requirements: + * + * - `from` cannot be the zero address. + * - `to` cannot be the zero address. + * - `from` must have a balance of at least `amount`. + */ + function _transfer( + address from, + address to, + uint256 amount + ) internal virtual { + require(from != address(0), "ERC20: transfer from the zero address"); + require(to != address(0), "ERC20: transfer to the zero address"); + + _beforeTokenTransfer(from, to, amount); + + uint256 fromBalance = _balances[from]; + require( + fromBalance >= amount, + "ERC20: transfer amount exceeds balance" + ); + unchecked { + _balances[from] = fromBalance - amount; + // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by + // decrementing then incrementing. + _balances[to] += amount; + } + + emit Transfer(from, to, amount); + + _afterTokenTransfer(from, to, amount); + } + + /** @dev Creates `amount` tokens and assigns them to `account`, increasing + * the total supply. + * + * Emits a {Transfer} event with `from` set to the zero address. + * + * Requirements: + * + * - `account` cannot be the zero address. + */ + function _mint(address account, uint256 amount) internal virtual { + require(account != address(0), "ERC20: mint to the zero address"); + + _beforeTokenTransfer(address(0), account, amount); + + _totalSupply += amount; + unchecked { + // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. + _balances[account] += amount; + } + emit Transfer(address(0), account, amount); + + _afterTokenTransfer(address(0), account, amount); + } + + /** + * @dev Destroys `amount` tokens from `account`, reducing the + * total supply. + * + * Emits a {Transfer} event with `to` set to the zero address. + * + * Requirements: + * + * - `account` cannot be the zero address. + * - `account` must have at least `amount` tokens. + */ + function _burn(address account, uint256 amount) internal virtual { + require(account != address(0), "ERC20: burn from the zero address"); + + _beforeTokenTransfer(account, address(0), amount); + + uint256 accountBalance = _balances[account]; + require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); + unchecked { + _balances[account] = accountBalance - amount; + // Overflow not possible: amount <= accountBalance <= totalSupply. + _totalSupply -= amount; + } + + emit Transfer(account, address(0), amount); + + _afterTokenTransfer(account, address(0), amount); + } + + /** + * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. + * + * This internal function is equivalent to `approve`, and can be used to + * e.g. set automatic allowances for certain subsystems, etc. + * + * Emits an {Approval} event. + * + * Requirements: + * + * - `owner` cannot be the zero address. + * - `spender` cannot be the zero address. + */ + function _approve( + address owner, + address spender, + uint256 amount + ) internal virtual { + require(owner != address(0), "ERC20: approve from the zero address"); + require(spender != address(0), "ERC20: approve to the zero address"); + + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + /** + * @dev Updates `owner` s allowance for `spender` based on spent `amount`. + * + * Does not update the allowance amount in case of infinite allowance. + * Revert if not enough allowance is available. + * + * Might emit an {Approval} event. + */ + function _spendAllowance( + address owner, + address spender, + uint256 amount + ) internal virtual { + uint256 currentAllowance = allowance(owner, spender); + if (currentAllowance != type(uint256).max) { + require( + currentAllowance >= amount, + "ERC20: insufficient allowance" + ); + unchecked { + _approve(owner, spender, currentAllowance - amount); + } + } + } + + /** + * @dev Hook that is called before any transfer of tokens. This includes + * minting and burning. + * + * Calling conditions: + * + * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens + * will be transferred to `to`. + * - when `from` is zero, `amount` tokens will be minted for `to`. + * - when `to` is zero, `amount` of ``from``'s tokens will be burned. + * - `from` and `to` are never both zero. + * + * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. + */ + function _beforeTokenTransfer( + address from, + address to, + uint256 amount + ) internal virtual {} + + /** + * @dev Hook that is called after any transfer of tokens. This includes + * minting and burning. + * + * Calling conditions: + * + * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens + * has been transferred to `to`. + * - when `from` is zero, `amount` tokens have been minted for `to`. + * - when `to` is zero, `amount` of ``from``'s tokens have been burned. + * - `from` and `to` are never both zero. + * + * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. + */ + function _afterTokenTransfer( + address from, + address to, + uint256 amount + ) internal virtual {} +} diff --git a/test/contractsv2/BridgeV2Metadata.test.ts b/test/contractsv2/BridgeV2Metadata.test.ts index 2cf5f502a..ccace9f1d 100644 --- a/test/contractsv2/BridgeV2Metadata.test.ts +++ b/test/contractsv2/BridgeV2Metadata.test.ts @@ -347,6 +347,85 @@ describe("PolygonZkEVMBridge Contract", () => { expect(await polygonZkEVMBridgeContract.getRoot()).to.be.equal(rootJSMainnet); }); + it("should PolygonZkEVMBridge with weird token metadata with invalid data", async () => { + const weirdErc20Metadata = await ethers.getContractFactory("ERC20InvalidMetadata"); + + const nameWeird = ""; + const symbolWeird = ""; + + const nameWeirdBytes32 = ethers.encodeBytes32String(nameWeird); + const symbolWeirdBytes = ethers.toUtf8Bytes(symbolWeird); + const decimalsWeird = 255; + + const weirdTokenContract = (await weirdErc20Metadata.deploy( + nameWeirdBytes32, // bytes32 + symbolWeirdBytes, // bytes + decimalsWeird + )) as any; + await weirdTokenContract.waitForDeployment(); + + // mint and approve tokens + await weirdTokenContract.mint(deployer.address, tokenInitialBalance); + await weirdTokenContract.approve(polygonZkEVMBridgeContract.target, tokenInitialBalance); + + const depositCount = await polygonZkEVMBridgeContract.depositCount(); + const originNetwork = networkIDMainnet; + const tokenAddress = weirdTokenContract.target; + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDRollup; + const destinationAddress = deployer.address; + + // Empty bytes32 is a not valid encoding + const nameEmpty = "NOT_VALID_ENCODING"; // bytes32 empty + const symbolEmpty = "NOT_VALID_ENCODING"; + + const metadata = ethers.AbiCoder.defaultAbiCoder().encode( + ["string", "string", "uint8"], + [nameEmpty, symbolEmpty, decimalsWeird] + ); + + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + // pre compute root merkle tree in Js + const height = 32; + const merkleTree = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + merkleTree.add(leafValue); + const rootJSMainnet = merkleTree.getRoot(); + + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount, + tokenAddress, + true, + "0x" + ) + ) + .to.emit(polygonZkEVMBridgeContract, "BridgeEvent") + .withArgs( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata, + depositCount + ); + + expect(await polygonZkEVMBridgeContract.getRoot()).to.be.equal(rootJSMainnet); + }); + it("should PolygonZkEVMBridge and with permit eip-2612 compilant", async () => { const depositCount = await polygonZkEVMBridgeContract.depositCount(); const originNetwork = networkIDMainnet; @@ -404,6 +483,74 @@ describe("PolygonZkEVMBridge Contract", () => { chainId ); + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount, + tokenAddress, + true, + ifacePermit.encodeFunctionData("permit", [ + acc1.address, + polygonZkEVMBridgeContract.target, + amount, + deadline, + v, + r, + s, + ]) + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "NotValidOwner"); + + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount, + tokenAddress, + true, + ifacePermit.encodeFunctionData("permit", [ + deployer.address, + deployer.address, + amount, + deadline, + v, + r, + s, + ]) + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "NotValidSpender"); + + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount, + tokenAddress, + true, + ifacePermit.encodeFunctionData("permit", [ + deployer.address, + polygonZkEVMBridgeContract.target, + amount + 1n, + deadline, + v, + r, + s, + ]) + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "NotValidAmount"); + + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount, + tokenAddress, + true, + ethers.ZeroHash + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "NotValidSignature"); + const dataPermit = ifacePermit.encodeFunctionData("permit", [ deployer.address, polygonZkEVMBridgeContract.target, @@ -522,6 +669,47 @@ describe("PolygonZkEVMBridge Contract", () => { deadline, chainId ); + + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount, + tokenAddress, + true, + ifacePermitDAI.encodeFunctionData("permit", [ + polygonZkEVMBridgeContract.target, + polygonZkEVMBridgeContract.target, + nonce, + deadline, + true, + v, + r, + s, + ]) + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "NotValidOwner"); + + await expect( + polygonZkEVMBridgeContract.bridgeAsset( + destinationNetwork, + destinationAddress, + amount, + tokenAddress, + true, + ifacePermitDAI.encodeFunctionData("permit", [ + deployer.address, + deployer.address, + nonce, + deadline, + true, + v, + r, + s, + ]) + ) + ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "NotValidSpender"); + const dataPermit = ifacePermitDAI.encodeFunctionData("permit", [ deployer.address, polygonZkEVMBridgeContract.target, diff --git a/test/contractsv2/PolygonRollupManagerUpgrade.test.ts b/test/contractsv2/PolygonRollupManagerUpgrade.test.ts index 84cceb640..19a050610 100644 --- a/test/contractsv2/PolygonRollupManagerUpgrade.test.ts +++ b/test/contractsv2/PolygonRollupManagerUpgrade.test.ts @@ -243,6 +243,23 @@ describe("Polygon Rollup manager upgraded", () => { }); }); + it("Cannot initialzie again", async () => { + await expect( + rollupManagerContract.initialize( + trustedAggregator.address, + pendingStateTimeoutDefault, + trustedAggregatorTimeout, + admin.address, + timelock.address, + emergencyCouncil.address, + timelock.address, + verifierContract.target, + forkID, + chainID + ) + ).to.be.revertedWith("Initializable: contract is already initialized"); + }); + it("should check the initalized parameters", async () => { expect(await rollupManagerContract.globalExitRootManager()).to.be.equal(polygonZkEVMGlobalExitRoot.target); expect(await rollupManagerContract.pol()).to.be.equal(polTokenContract.target); From 4a8204fc24f9c3a4949ccc78044d598afa262a13 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Sat, 20 Jan 2024 00:17:31 +0100 Subject: [PATCH 155/230] add tests --- test/contractsv2/PolygonRollupManager.test.ts | 86 ++++++++++++++++++- .../PolygonRollupManagerUpgrade.test.ts | 2 - 2 files changed, 85 insertions(+), 3 deletions(-) diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index 9724dea34..3ae967e3d 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -524,6 +524,14 @@ describe("Polygon Rollup Manager", () => { "Approval" ); + // Call onSequenceBatches with 0 batches + await ethers.provider.send("hardhat_impersonateAccount", [newZkEVMContract.target]); + const zkEVMContractSigner = await ethers.getSigner(newZkEVMContract.target as any); + + await expect( + rollupManagerContract.connect(zkEVMContractSigner).onSequenceBatches(0, ethers.ZeroHash, {gasPrice: 0}) + ).to.be.revertedWithCustomError(rollupManagerContract, "MustSequenceSomeBatch"); + // Sequence Batches await expect( newZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address) @@ -670,7 +678,6 @@ describe("Polygon Rollup Manager", () => { .withArgs(ethers.ZeroHash, rootRollups); const finalAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); - expect(finalAggregatorMatic).to.equal(initialAggregatorMatic + maticAmount); // Assert global exit root @@ -2108,6 +2115,31 @@ describe("Polygon Rollup Manager", () => { descirption ); + // Add a new rollup type with timelock + const randomType = 3; + await expect( + rollupManagerContract + .connect(timelock) + .addNewRollupType( + PolygonZKEVMEtrogContract.target, + verifierContract.target, + forkID, + randomType, + genesisRandom, + descirption + ) + ) + .to.emit(rollupManagerContract, "AddNewRollupType") + .withArgs( + randomType, + PolygonZKEVMEtrogContract.target, + verifierContract.target, + forkID, + randomType, + genesisRandom, + descirption + ); + // assert new rollup type const createdEtrogRollupType = await rollupManagerContract.rollupTypeMap(etrogRollupType); @@ -2132,6 +2164,45 @@ describe("Polygon Rollup Manager", () => { unsafeAllow: ["constructor", "state-variable-immutable"], } as any); + await expect( + rollupManagerContract.connect(admin).updateRollup(newZKEVMAddress, etrogRollupType, "0x") + ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole"); + + // Try update random address + await expect( + rollupManagerContract + .connect(timelock) + .updateRollup(polygonZkEVMGlobalExitRoot.target, etrogRollupType, "0x") + ).to.be.revertedWithCustomError(rollupManagerContract, "RollupMustExist"); + + // Try update same type + await expect( + rollupManagerContract.connect(timelock).updateRollup(newZKEVMAddress, 1, "0x") + ).to.be.revertedWithCustomError(rollupManagerContract, "UpdateToSameRollupTypeID"); + + // Try update invalid type + await expect( + rollupManagerContract.connect(timelock).updateRollup(newZKEVMAddress, 4, "0x") + ).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeDoesNotExist"); + + // Try update to not comaptible type + await expect( + rollupManagerContract.connect(timelock).updateRollup(newZKEVMAddress, randomType, "0x") + ).to.be.revertedWithCustomError(rollupManagerContract, "UpdateNotCompatible"); + + // obsoleteRollupType, take snapshot for it + const snapshotUpdateRollup = await takeSnapshot(); + + await expect(rollupManagerContract.connect(admin).obsoleteRollupType(etrogRollupType)) + .to.emit(rollupManagerContract, "ObsoleteRollupType") + .withArgs(etrogRollupType); + + await expect( + rollupManagerContract.connect(timelock).updateRollup(newZKEVMAddress, etrogRollupType, "0x") + ).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeObsolete"); + + await snapshotUpdateRollup.restore(); + await expect(rollupManagerContract.connect(timelock).updateRollup(newZKEVMAddress, etrogRollupType, "0x")) .to.emit(rollupManagerContract, "UpdateRollup") .withArgs(newRollupTypeID, etrogRollupType, newVerifiedBatch); @@ -2249,6 +2320,19 @@ describe("Polygon Rollup Manager", () => { ) ).to.be.revertedWithCustomError(rollupManagerContract, "ChainIDAlreadyExist"); + await expect( + rollupManagerContract + .connect(timelock) + .addExistingRollup( + PolygonZKEVMV2Contract.target, + verifierContract.target, + forkID, + chainID + 1, + genesisRandom, + rollupCompatibilityID + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "RollupAddressAlreadyExist"); + // Initialize upgrade await PolygonZKEVMV2Contract.connect(RollupManagerMock).initializeUpgrade( admin.address, diff --git a/test/contractsv2/PolygonRollupManagerUpgrade.test.ts b/test/contractsv2/PolygonRollupManagerUpgrade.test.ts index 19a050610..89381e89c 100644 --- a/test/contractsv2/PolygonRollupManagerUpgrade.test.ts +++ b/test/contractsv2/PolygonRollupManagerUpgrade.test.ts @@ -1291,8 +1291,6 @@ describe("Polygon Rollup manager upgraded", () => { ).to.emit(newZkEVMContract, "SequenceBatches"); const lastBlock = await ethers.provider.getBlock("latest"); - const lastBlockHash = lastBlock?.parentHash; - const lastGlobalExitRootS = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); const height = 32; const merkleTreeGLobalExitRoot = new MerkleTreeBridge(height); From aede678b4ce1cd5982c172bc992b83fc1af24834 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Sat, 20 Jan 2024 02:13:36 +0100 Subject: [PATCH 156/230] add tests, fix event --- contracts/v2/PolygonRollupManager.sol | 2 +- test/contractsv2/PolygonRollupManager.test.ts | 9 + .../PolygonRollupManagerUpgrade.test.ts | 466 +++++++++++++++++- 3 files changed, 473 insertions(+), 4 deletions(-) diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index bfc7743cb..7cd32139c 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -1261,7 +1261,7 @@ contract PolygonRollupManager is ); emit ProveNonDeterministicPendingState( - rollup.batchNumToStateRoot[finalNewBatch], + rollup.pendingStateTransitions[finalPendingStateNum].stateRoot, newStateRoot ); diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index 3ae967e3d..2d814532a 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -188,6 +188,7 @@ describe("Polygon Rollup Manager", () => { expect(await rollupManagerContract.getBatchFee()).to.be.equal(ethers.parseEther("0.1")); expect(await rollupManagerContract.getForcedBatchFee()).to.be.equal(ethers.parseEther("10")); + expect(await rollupManagerContract.calculateRewardPerBatch()).to.be.equal(0); // Check roles expect(await rollupManagerContract.hasRole(DEFAULT_ADMIN_ROLE, timelock.address)).to.be.equal(true); @@ -235,6 +236,12 @@ describe("Polygon Rollup Manager", () => { .to.emit(rollupManagerContract, "EmergencyStateDeactivated") .to.emit(polygonZkEVMBridgeContract, "EmergencyStateDeactivated"); + const timestampDeactivatedEmergency = (await ethers.provider.getBlock("latest"))?.timestamp; + + expect(await rollupManagerContract.lastDeactivatedEmergencyStateTimestamp()).to.be.equal( + timestampDeactivatedEmergency + ); + expect(await rollupManagerContract.isEmergencyState()).to.be.equal(false); expect(await polygonZkEVMBridgeContract.isEmergencyState()).to.be.equal(false); }); @@ -2720,6 +2727,8 @@ describe("Polygon Rollup Manager", () => { it("Should test global exit root", async () => { // In order to create a new rollup type, create an implementation of the contract + expect(await rollupManagerContract.getRollupExitRoot()).to.be.equal(ethers.ZeroHash); + async function testRollupExitRoot(rollupsRootsArray: any) { const height = 32; const merkleTree = new MerkleTreeBridge(height); diff --git a/test/contractsv2/PolygonRollupManagerUpgrade.test.ts b/test/contractsv2/PolygonRollupManagerUpgrade.test.ts index 89381e89c..2fa8145dc 100644 --- a/test/contractsv2/PolygonRollupManagerUpgrade.test.ts +++ b/test/contractsv2/PolygonRollupManagerUpgrade.test.ts @@ -38,6 +38,8 @@ function computeGlobalIndex(indexLocal: any, indexRollup: any, isMainnet: Boolea const SIGNATURE_BYTES = 32 + 32 + 1; const EFFECTIVE_PERCENTAGE_BYTES = 1; +const _MAX_VERIFY_BATCHES = 1000; +const _HALT_AGGREGATION_TIMEOUT = 60 * 60 * 24 * 7; describe("Polygon Rollup manager upgraded", () => { let deployer: any; @@ -294,6 +296,59 @@ describe("Polygon Rollup manager upgraded", () => { ); }); + it("Check admin parameters", async () => { + expect(await rollupManagerContract.multiplierBatchFee()).to.be.equal(1002); + await expect(rollupManagerContract.setMultiplierBatchFee(1023)).to.be.revertedWithCustomError( + rollupManagerContract, + "AddressDoNotHaveRequiredRole" + ); + await expect(rollupManagerContract.connect(admin).setMultiplierBatchFee(0)).to.be.revertedWithCustomError( + rollupManagerContract, + "InvalidRangeMultiplierBatchFee" + ); + + await expect(rollupManagerContract.connect(admin).setMultiplierBatchFee(1020)) + .to.emit(rollupManagerContract, "SetMultiplierBatchFee") + .withArgs(1020); + + expect(await rollupManagerContract.multiplierBatchFee()).to.be.equal(1020); + + // verifyBatchTImetarget + expect(await rollupManagerContract.verifyBatchTimeTarget()).to.be.equal(60 * 30); + + await expect(rollupManagerContract.setVerifyBatchTimeTarget(0)).to.be.revertedWithCustomError( + rollupManagerContract, + "AddressDoNotHaveRequiredRole" + ); + await expect( + rollupManagerContract.connect(admin).setVerifyBatchTimeTarget(60 * 60 * 24 + 1) + ).to.be.revertedWithCustomError(rollupManagerContract, "InvalidRangeBatchTimeTarget"); + + await expect(rollupManagerContract.connect(admin).setVerifyBatchTimeTarget(60)) + .to.emit(rollupManagerContract, "SetVerifyBatchTimeTarget") + .withArgs(60); + expect(await rollupManagerContract.verifyBatchTimeTarget()).to.be.equal(60); + + // batch Fee + // verifyBatchTImetarget + expect(await rollupManagerContract.getBatchFee()).to.be.equal(ethers.parseEther("0.1")); + + await expect(rollupManagerContract.setBatchFee(0)).to.be.revertedWithCustomError( + rollupManagerContract, + "AddressDoNotHaveRequiredRole" + ); + await expect(rollupManagerContract.connect(admin).setBatchFee(0)).to.be.revertedWithCustomError( + rollupManagerContract, + "BatchFeeOutOfRange" + ); + + await expect(rollupManagerContract.connect(admin).setBatchFee(ethers.parseEther("10"))) + .to.emit(rollupManagerContract, "SetBatchFee") + .withArgs(ethers.parseEther("10")); + + expect(await rollupManagerContract.getBatchFee()).to.be.equal(ethers.parseEther("10")); + }); + it("should check full flow etrog", async () => { const urlSequencer = "http://zkevm-json-rpc:8123"; const chainID2 = chainID + 1; @@ -305,7 +360,6 @@ describe("Polygon Rollup manager upgraded", () => { // Native token will be ether const gasTokenAddress = ethers.ZeroAddress; const gasTokenNetwork = 0; - // In order to create a new rollup type, create an implementation of the contract // Create zkEVM implementation @@ -1290,6 +1344,11 @@ describe("Polygon Rollup manager upgraded", () => { newZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address) ).to.emit(newZkEVMContract, "SequenceBatches"); + const sequencedBatchData2 = await rollupManagerContract.getRollupSequencedBatches(newCreatedRollupID, 2); + + const currnetRollup = await rollupManagerContract.rollupIDToRollupData(newCreatedRollupID); + expect(currnetRollup.lastBatchSequenced).to.be.equal(2); + const lastBlock = await ethers.provider.getBlock("latest"); const height = 32; @@ -1351,14 +1410,66 @@ describe("Polygon Rollup manager upgraded", () => { const pendingState = 0; const newLocalExitRoot = rootzkEVM; const newStateRoot = "0x0000000000000000000000000000000000000000000000000000000000000123"; - const newVerifiedBatch = newSequencedBatch + 1; + const newVerifiedBatch = newSequencedBatch; const zkProofFFlonk = new Array(24).fill(ethers.ZeroHash); const currentVerifiedBatch = 0; const initialAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); + await expect( + rollupManagerContract.getInputSnarkBytes( + newCreatedRollupID, + 3, + 4, + newLocalExitRoot, + ethers.ZeroHash, + newStateRoot + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "OldAccInputHashDoesNotExist"); + + await expect( + rollupManagerContract.getInputSnarkBytes( + newCreatedRollupID, + 2, + 3, + newLocalExitRoot, + ethers.ZeroHash, + newStateRoot + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "NewAccInputHashDoesNotExist"); + + await expect( + rollupManagerContract + .connect(trustedAggregator) + .verifyBatches( + newCreatedRollupID, + pendingState, + currentVerifiedBatch, + newVerifiedBatch, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "TrustedAggregatorTimeoutNotExpired"); + await rollupManagerContract.connect(admin).setTrustedAggregatorTimeout(0); + await expect( + rollupManagerContract + .connect(trustedAggregator) + .verifyBatches( + newCreatedRollupID, + pendingState, + currentVerifiedBatch, + currentVerifiedBatch + _MAX_VERIFY_BATCHES + 1, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "ExceedMaxVerifyBatches"); + await expect( rollupManagerContract .connect(trustedAggregator) @@ -1409,10 +1520,353 @@ describe("Polygon Rollup manager upgraded", () => { .to.emit(rollupManagerContract, "VerifyBatches") .withArgs(newCreatedRollupID, newVerifiedBatch, newStateRoot, newLocalExitRoot, deployer.address); + const timestampVerifyBatches = (await ethers.provider.getBlock("latest"))?.timestamp; const finalAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address); - expect(finalAggregatorMatic).to.equal(((initialAggregatorMatic + maticAmount) * 2n) / 3n); + expect(finalAggregatorMatic).to.equal(((initialAggregatorMatic + maticAmount) * 1n) / 3n); + const createdPendingState = 1; + + const snapshotVerify = await takeSnapshot(); + await rollupManagerContract.connect(admin).setPendingStateTimeout(0); + + await expect( + rollupManagerContract.verifyBatches( + newCreatedRollupID, + 0, + 5, + 6, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "OldStateRootDoesNotExist"); + + await expect( + rollupManagerContract.verifyBatches( + newCreatedRollupID, + 0, + newVerifiedBatch, + 0, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ).to.be.reverted; + + await expect( + rollupManagerContract.verifyBatches( + newCreatedRollupID, + createdPendingState + 1, + currentVerifiedBatch, + newVerifiedBatch + 1, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "PendingStateDoesNotExist"); + + await expect( + rollupManagerContract.verifyBatches( + newCreatedRollupID, + createdPendingState, + currentVerifiedBatch, + newVerifiedBatch + 1, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "InitNumBatchDoesNotMatchPendingState"); + + await expect( + rollupManagerContract.verifyBatches( + newCreatedRollupID, + createdPendingState, + newVerifiedBatch, + newVerifiedBatch + 1, + newLocalExitRoot, + ethers.toQuantity(ethers.MaxUint256), + beneficiary.address, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "NewStateRootNotInsidePrime"); + + await expect( + rollupManagerContract.verifyBatches( + newCreatedRollupID, + createdPendingState, + newVerifiedBatch, + newVerifiedBatch + 1, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ) + .to.emit(rollupManagerContract, "VerifyBatches") + .withArgs(newCreatedRollupID, newVerifiedBatch + 1, newStateRoot, newLocalExitRoot, deployer.address); + + let rollupDataV = await rollupManagerContract.rollupIDToRollupData(newCreatedRollupID); + expect(rollupDataV.lastPendingState).to.be.equal(0); + expect(rollupDataV.lastLocalExitRoot).to.be.equal(newLocalExitRoot); + expect(rollupDataV.lastBatchSequenced).to.be.equal(2); + expect(rollupDataV.lastVerifiedBatch).to.be.equal(newVerifiedBatch + 1); + expect(rollupDataV.lastPendingState).to.be.equal(0); + expect(rollupDataV.lastPendingStateConsolidated).to.be.equal(0); + expect(rollupDataV.lastVerifiedBatchBeforeUpgrade).to.be.equal(0); + + await expect( + rollupManagerContract + .connect(trustedAggregator) + .verifyBatchesTrustedAggregator( + newCreatedRollupID, + 0, + 0, + newVerifiedBatch, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "FinalNumBatchBelowLastVerifiedBatch"); + + await snapshotVerify.restore(); + await rollupManagerContract.connect(admin).setPendingStateTimeout(1); + + await expect( + rollupManagerContract.verifyBatches( + newCreatedRollupID, + createdPendingState, + newVerifiedBatch, + newVerifiedBatch + 1, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ) + .to.emit(rollupManagerContract, "VerifyBatches") + .withArgs(newCreatedRollupID, newVerifiedBatch + 1, newStateRoot, newLocalExitRoot, deployer.address); + + rollupDataV = await rollupManagerContract.rollupIDToRollupData(newCreatedRollupID); + expect(rollupDataV.lastPendingState).to.be.equal(2); + expect(rollupDataV.lastLocalExitRoot).to.be.equal(newLocalExitRoot); + expect(rollupDataV.lastBatchSequenced).to.be.equal(2); + expect(rollupDataV.lastVerifiedBatch).to.be.equal(newVerifiedBatch); + expect(rollupDataV.lastPendingStateConsolidated).to.be.equal(1); + expect(rollupDataV.lastVerifiedBatchBeforeUpgrade).to.be.equal(0); + + await snapshotVerify.restore(); + + await expect( + rollupManagerContract + .connect(trustedAggregator) + .verifyBatchesTrustedAggregator( + newCreatedRollupID, + pendingState, + currentVerifiedBatch, + newVerifiedBatch + 1, + newLocalExitRoot, + newStateRoot, + beneficiary.address, + zkProofFFlonk + ) + ) + .to.emit(rollupManagerContract, "VerifyBatchesTrustedAggregator") + .withArgs( + newCreatedRollupID, + newVerifiedBatch + 1, + newStateRoot, + newLocalExitRoot, + trustedAggregator.address + ); + + rollupDataV = await rollupManagerContract.rollupIDToRollupData(newCreatedRollupID); + expect(rollupDataV.lastPendingState).to.be.equal(0); + expect(rollupDataV.lastLocalExitRoot).to.be.equal(newLocalExitRoot); + expect(rollupDataV.lastBatchSequenced).to.be.equal(2); + expect(rollupDataV.lastVerifiedBatch).to.be.equal(newVerifiedBatch + 1); + expect(rollupDataV.lastPendingState).to.be.equal(0); + expect(rollupDataV.lastPendingStateConsolidated).to.be.equal(0); + expect(rollupDataV.lastVerifiedBatchBeforeUpgrade).to.be.equal(0); + + await snapshotVerify.restore(); + await expect( + rollupManagerContract.proveNonDeterministicPendingState( + newCreatedRollupID, + 0, + createdPendingState, + 0, + newVerifiedBatch, + newLocalExitRoot, + newStateRoot, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "StoredRootMustBeDifferentThanNewRoot"); + + await expect( + rollupManagerContract.proveNonDeterministicPendingState( + newCreatedRollupID, + 0, + createdPendingState, + 5, + newVerifiedBatch, + newLocalExitRoot, + newStateRoot, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "OldStateRootDoesNotExist"); + + await expect( + rollupManagerContract.proveNonDeterministicPendingState( + newCreatedRollupID, + 3, // init pending state + 2, + 0, + newVerifiedBatch, + newLocalExitRoot, + newStateRoot, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "PendingStateDoesNotExist"); + + await expect( + rollupManagerContract.proveNonDeterministicPendingState( + newCreatedRollupID, + createdPendingState, + createdPendingState, + 0, + newVerifiedBatch, + newLocalExitRoot, + newStateRoot, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "InitNumBatchDoesNotMatchPendingState"); + + await expect( + rollupManagerContract.proveNonDeterministicPendingState( + newCreatedRollupID, + createdPendingState, + createdPendingState, + newVerifiedBatch, + newVerifiedBatch, + newLocalExitRoot, + newStateRoot, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "FinalPendingStateNumInvalid"); + + await expect( + rollupManagerContract.proveNonDeterministicPendingState( + newCreatedRollupID, + 0, + createdPendingState, + 0, + newVerifiedBatch + 1, + newLocalExitRoot, + ethers.ZeroHash, + zkProofFFlonk + ) + ).to.be.revertedWithCustomError(rollupManagerContract, "FinalNumBatchDoesNotMatchPendingState"); + + await expect( + rollupManagerContract.proveNonDeterministicPendingState( + newCreatedRollupID, + 0, + createdPendingState, + 0, + newVerifiedBatch, + newLocalExitRoot, + ethers.ZeroHash, + zkProofFFlonk + ) + ) + .to.emit(rollupManagerContract, "ProveNonDeterministicPendingState") + .withArgs(newStateRoot, ethers.ZeroHash); + + expect(await rollupManagerContract.isEmergencyState()).to.be.equal(true); + + await snapshotVerify.restore(); + + const randomSTateRoot = ethers.hexlify(ethers.randomBytes(32)); + const randomlocalRoot = ethers.hexlify(ethers.randomBytes(32)); + + await expect( + rollupManagerContract.connect(trustedAggregator).overridePendingState( + newCreatedRollupID, + 0, + createdPendingState, + 0, + newVerifiedBatch, + randomlocalRoot, // local exit root + randomSTateRoot, // state root + zkProofFFlonk + ) + ) + .to.emit(rollupManagerContract, "OverridePendingState") + .withArgs( + newCreatedRollupID, + newVerifiedBatch, + randomSTateRoot, + randomlocalRoot, + trustedAggregator.address + ); + + expect( + await rollupManagerContract.getRollupBatchNumToStateRoot(newCreatedRollupID, newVerifiedBatch) + ).to.be.equal(randomSTateRoot); + + rollupDataV = await rollupManagerContract.rollupIDToRollupData(newCreatedRollupID); + expect(rollupDataV.lastPendingState).to.be.equal(0); + expect(rollupDataV.lastLocalExitRoot).to.be.equal(randomlocalRoot); + expect(rollupDataV.lastBatchSequenced).to.be.equal(2); + expect(rollupDataV.lastVerifiedBatch).to.be.equal(newVerifiedBatch); + expect(rollupDataV.lastPendingState).to.be.equal(0); + expect(rollupDataV.lastPendingStateConsolidated).to.be.equal(0); + + expect(await rollupManagerContract.isEmergencyState()).to.be.equal(false); + expect(await rollupManagerContract.trustedAggregatorTimeout()).to.be.equal(_HALT_AGGREGATION_TIMEOUT); + + await snapshotVerify.restore(); const pendingStateNum = 1; + // check revert reasons: + + expect( + await rollupManagerContract.isPendingStateConsolidable(newCreatedRollupID, createdPendingState) + ).to.be.equal(false); + + const currentPendingStateTransition = await rollupManagerContract.getRollupPendingStateTransitions( + newCreatedRollupID, + createdPendingState + ); + + expect(currentPendingStateTransition.timestamp).to.be.equal(timestampVerifyBatches); + expect(currentPendingStateTransition.lastVerifiedBatch).to.be.equal(newVerifiedBatch); + expect(currentPendingStateTransition.exitRoot).to.be.equal(newLocalExitRoot); + expect(currentPendingStateTransition.stateRoot).to.be.equal(newStateRoot); + + await expect( + rollupManagerContract.consolidatePendingState(newCreatedRollupID, pendingStateNum) + ).to.be.revertedWithCustomError(rollupManagerContract, "PendingStateNotConsolidable"); + + // try emergency + await rollupManagerContract.connect(emergencyCouncil).activateEmergencyState(); + await rollupManagerContract.connect(admin).setPendingStateTimeout(0); + + await expect( + rollupManagerContract.consolidatePendingState(newCreatedRollupID, pendingStateNum) + ).to.be.revertedWithCustomError(rollupManagerContract, "OnlyNotEmergencyState"); + await snapshotVerify.restore(); + + await expect( + rollupManagerContract + .connect(trustedAggregator) + .consolidatePendingState(newCreatedRollupID, pendingStateNum + 1) + ).to.be.revertedWithCustomError(rollupManagerContract, "PendingStateInvalid"); + await expect( rollupManagerContract .connect(trustedAggregator) @@ -1421,6 +1875,11 @@ describe("Polygon Rollup manager upgraded", () => { .to.emit(rollupManagerContract, "ConsolidatePendingState") .withArgs(newCreatedRollupID, newVerifiedBatch, newStateRoot, newLocalExitRoot, pendingStateNum); + // Assert new root + expect( + await rollupManagerContract.getRollupBatchNumToStateRoot(newCreatedRollupID, newVerifiedBatch) + ).to.be.equal(newStateRoot); + // Assert global exit root expect(await polygonZkEVMGlobalExitRoot.lastRollupExitRoot()).to.be.equal(rootRollups); expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(ethers.ZeroHash); @@ -1620,6 +2079,7 @@ describe("Polygon Rollup manager upgraded", () => { it("Should test global exit root", async () => { // In order to create a new rollup type, create an implementation of the contract + async function testRollupExitRoot(rollupsRootsArray: any) { const height = 32; const merkleTree = new MerkleTreeBridge(height); From dec03ccb60db649b78bcc7fbd7997537d6200ca5 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Sun, 21 Jan 2024 18:42:25 +0100 Subject: [PATCH 157/230] validium tests --- .../validium/PolygonDataCommittee.sol | 9 +- .../validium/PolygonValidiumEtrog.sol | 16 +- .../IPolygonDataCommitteeErrors.sol | 4 +- deployment/v2/4_createRollup.ts | 4 +- test/contractsv2/PolygonValidiumEtrog.test.ts | 1636 +++++++++++++++++ 5 files changed, 1661 insertions(+), 8 deletions(-) create mode 100644 test/contractsv2/PolygonValidiumEtrog.test.ts diff --git a/contracts/v2/consensus/validium/PolygonDataCommittee.sol b/contracts/v2/consensus/validium/PolygonDataCommittee.sol index a7338c625..611df1c8a 100644 --- a/contracts/v2/consensus/validium/PolygonDataCommittee.sol +++ b/contracts/v2/consensus/validium/PolygonDataCommittee.sol @@ -45,6 +45,13 @@ contract PolygonDataCommittee is */ event CommitteeUpdated(bytes32 committeeHash); + /** + * Disable initalizers on the implementation following the best practices + */ + constructor() { + _disableInitializers(); + } + function initialize() external initializer { // Initialize OZ contracts __Ownable_init_unchained(); @@ -165,7 +172,7 @@ contract PolygonDataCommittee is // If an address is not on the comittee, or not enough required signatures are provided // This verification reverts if (!currentSignerIsPartOfCommittee) { - revert CommitteeAddressDoesntExist(); + revert CommitteeAddressDoesNotExist(); } } } diff --git a/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol b/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol index 8d812e641..2bb9d7293 100644 --- a/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol +++ b/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol @@ -260,11 +260,19 @@ contract PolygonValidiumEtrog is PolygonRollupBaseEtrog, IPolygonValidium { } /** - * @notice Allow the admin to turn on the force batches - * This action is not reversible + * @notice Allow the admin to switch the sequence with data availability + * @param newIsSequenceWithDataAvailabilityAllowed Boolean to switch */ - function switchSequenceWithDataAvailability() external onlyAdmin { - isSequenceWithDataAvailabilityAllowed = !isSequenceWithDataAvailabilityAllowed; + function switchSequenceWithDataAvailability( + bool newIsSequenceWithDataAvailabilityAllowed + ) external onlyAdmin { + if ( + newIsSequenceWithDataAvailabilityAllowed == + isSequenceWithDataAvailabilityAllowed + ) { + revert SwitchToSameValue(); + } + isSequenceWithDataAvailabilityAllowed = newIsSequenceWithDataAvailabilityAllowed; emit SwitchSequenceWithDataAvailability(); } } diff --git a/contracts/v2/interfaces/IPolygonDataCommitteeErrors.sol b/contracts/v2/interfaces/IPolygonDataCommitteeErrors.sol index 9df1100c6..811919740 100644 --- a/contracts/v2/interfaces/IPolygonDataCommitteeErrors.sol +++ b/contracts/v2/interfaces/IPolygonDataCommitteeErrors.sol @@ -31,10 +31,10 @@ interface IPolygonDataCommitteeErrors { /** * @dev Thrown when the signature of a DA hash doesn't belong to any member of the committee */ - error CommitteeAddressDoesntExist(); + error CommitteeAddressDoesNotExist(); /** * @dev Thrown when the addresses and signatures byte array length has an unexpected size */ error UnexpectedAddrsAndSignaturesSize(); -} \ No newline at end of file +} diff --git a/deployment/v2/4_createRollup.ts b/deployment/v2/4_createRollup.ts index 890a501d7..d2edb5b33 100644 --- a/deployment/v2/4_createRollup.ts +++ b/deployment/v2/4_createRollup.ts @@ -255,7 +255,9 @@ async function main() { for (let i = 0; i < attemptsDeployProxy; i++) { try { - polygonDataCommittee = await upgrades.deployProxy(PolygonDataCommitteeContract, []); + polygonDataCommittee = await upgrades.deployProxy(PolygonDataCommitteeContract, [], { + unsafeAllow: ["constructor"], + }); break; } catch (error: any) { console.log(`attempt ${i}`); diff --git a/test/contractsv2/PolygonValidiumEtrog.test.ts b/test/contractsv2/PolygonValidiumEtrog.test.ts new file mode 100644 index 000000000..d24d74587 --- /dev/null +++ b/test/contractsv2/PolygonValidiumEtrog.test.ts @@ -0,0 +1,1636 @@ +/* eslint-disable no-plusplus, no-await-in-loop */ +import {expect} from "chai"; +import {ethers, network, upgrades} from "hardhat"; +import { + VerifierRollupHelperMock, + ERC20PermitMock, + PolygonRollupManagerMock, + PolygonZkEVMGlobalExitRootV2, + PolygonZkEVMBridgeV2, + PolygonValidiumEtrog, + PolygonRollupBaseEtrog, + TokenWrapped, + Address, + PolygonRollupManagerEmptyMock__factory, +} from "../../typechain-types"; +import {takeSnapshot, time} from "@nomicfoundation/hardhat-network-helpers"; +import {processorUtils, contractUtils, MTBridge, mtBridgeUtils} from "@0xpolygonhermez/zkevm-commonjs"; +import {array} from "yargs"; +import {PolygonDataCommittee} from "../../typechain-types/contracts/v2/consensus/dataComittee"; +const {calculateSnarkInput, calculateAccInputHash, calculateBatchHashData} = contractUtils; + +type BatchDataStructEtrog = PolygonRollupBaseEtrog.BatchDataStruct; +type ValidiumBatchData = PolygonValidiumEtrog.ValidiumBatchDataStruct; + +const MerkleTreeBridge = MTBridge; +const {verifyMerkleProof, getLeafValue} = mtBridgeUtils; + +function calculateGlobalExitRoot(mainnetExitRoot: any, rollupExitRoot: any) { + return ethers.solidityPackedKeccak256(["bytes32", "bytes32"], [mainnetExitRoot, rollupExitRoot]); +} + +describe("PolygonZkEVMEtrog", () => { + let deployer: any; + let timelock: any; + let emergencyCouncil: any; + let trustedAggregator: any; + let trustedSequencer: any; + let admin: any; + let beneficiary: any; + + let verifierContract: VerifierRollupHelperMock; + let polygonZkEVMBridgeContract: PolygonZkEVMBridgeV2; + let polTokenContract: ERC20PermitMock; + let polygonZkEVMGlobalExitRoot: PolygonZkEVMGlobalExitRootV2; + let rollupManagerContract: PolygonRollupManagerMock; + let PolygonZKEVMV2Contract: PolygonValidiumEtrog; + let PolygonDataCommitee: PolygonDataCommittee; + + const polTokenName = "POL Token"; + const polTokenSymbol = "POL"; + const polTokenInitialBalance = ethers.parseEther("20000000"); + + const pendingStateTimeoutDefault = 100; + const trustedAggregatorTimeout = 100; + const FORCE_BATCH_TIMEOUT = 60 * 60 * 24 * 5; // 5 days + const _MAX_VERIFY_BATCHES = 1000; + const _MAX_TRANSACTIONS_BYTE_LENGTH = 120000; + // BRidge constants + const networkIDMainnet = 0; + const networkIDRollup = 1; + + const LEAF_TYPE_ASSET = 0; + const LEAF_TYPE_MESSAGE = 1; + + const globalExitRootL2Address = "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa" as unknown as Address; + + let firstDeployment = true; + + const urlSequencer = "http://zkevm-json-rpc:8123"; + const chainID = 1000; + const networkName = "zkevm"; + const forkID = 0; + const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001"; + const rollupCompatibilityID = 0; + const descirption = "zkevm test"; + const networkID = 1; + + // Native token will be ether + const gasTokenAddress = ethers.ZeroAddress; + const gasTokenNetwork = 0; + + const SIGNATURE_BYTES = 32 + 32 + 1; + const EFFECTIVE_PERCENTAGE_BYTES = 1; + + beforeEach("Deploy contract", async () => { + upgrades.silenceWarnings(); + + // load signers + [deployer, trustedAggregator, trustedSequencer, admin, timelock, emergencyCouncil, beneficiary] = + await ethers.getSigners(); + + // deploy mock verifier + const VerifierRollupHelperFactory = await ethers.getContractFactory("VerifierRollupHelperMock"); + verifierContract = await VerifierRollupHelperFactory.deploy(); + + // deploy pol + const polTokenFactory = await ethers.getContractFactory("ERC20PermitMock"); + polTokenContract = await polTokenFactory.deploy( + polTokenName, + polTokenSymbol, + deployer.address, + polTokenInitialBalance + ); + + /* + * deploy global exit root manager + * In order to not have trouble with nonce deploy first proxy admin + */ + await upgrades.deployProxyAdmin(); + + if ((await upgrades.admin.getInstance()).target !== "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0") { + firstDeployment = false; + } + const nonceProxyBridge = + Number(await ethers.provider.getTransactionCount(deployer.address)) + (firstDeployment ? 3 : 2); + + const nonceProxyZkevm = nonceProxyBridge + 1; // Always have to redeploy impl since the polygonZkEVMGlobalExitRoot address changes + + const precalculateBridgeAddress = ethers.getCreateAddress({ + from: deployer.address, + nonce: nonceProxyBridge, + }); + const precalculateRollupManagerAddress = ethers.getCreateAddress({ + from: deployer.address, + nonce: nonceProxyZkevm, + }); + firstDeployment = false; + + // deploy globalExitRoot + const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRootV2"); + polygonZkEVMGlobalExitRoot = await upgrades.deployProxy(PolygonZkEVMGlobalExitRootFactory, [], { + initializer: false, + constructorArgs: [precalculateRollupManagerAddress, precalculateBridgeAddress], + unsafeAllow: ["constructor", "state-variable-immutable"], + }); + + // deploy PolygonZkEVMBridge + const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + polygonZkEVMBridgeContract = await upgrades.deployProxy(polygonZkEVMBridgeFactory, [], { + initializer: false, + unsafeAllow: ["constructor"], + }); + + // deploy mock verifier + const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManagerEmptyMock"); + + rollupManagerContract = await PolygonRollupManagerFactory.deploy(); + + await rollupManagerContract.waitForDeployment(); + + // check precalculated address + expect(precalculateBridgeAddress).to.be.equal(polygonZkEVMBridgeContract.target); + expect(precalculateRollupManagerAddress).to.be.equal(rollupManagerContract.target); + + await polygonZkEVMBridgeContract.initialize( + networkIDMainnet, + ethers.ZeroAddress, // zero for ether + ethers.ZeroAddress, // zero for ether + polygonZkEVMGlobalExitRoot.target, + rollupManagerContract.target, + "0x" + ); + + // fund sequencer address with Matic tokens + await polTokenContract.transfer(trustedSequencer.address, ethers.parseEther("1000")); + + // deploy consensus + // Create zkEVM implementation + const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonValidiumEtrog"); + PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy( + polygonZkEVMGlobalExitRoot.target, + polTokenContract.target, + polygonZkEVMBridgeContract.target, + rollupManagerContract.target + ); + await PolygonZKEVMV2Contract.waitForDeployment(); + + // Create CdkCommitee + const PolygonDataCommiteeFactory = await ethers.getContractFactory("PolygonDataCommittee"); + PolygonDataCommitee = (await upgrades.deployProxy(PolygonDataCommiteeFactory, [], { + unsafeAllow: ["constructor"], + })) as any as PolygonDataCommittee; + + await PolygonDataCommitee.waitForDeployment(); + }); + + it("should check the initalized parameters", async () => { + // initialize zkEVM + await expect( + PolygonZKEVMV2Contract.initialize( + admin.address, + trustedSequencer.address, + networkID, + gasTokenAddress, + urlSequencer, + networkName + ) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "OnlyRollupManager"); + + // Initialzie using rollup manager + await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); + const rolllupManagerSigner = await ethers.getSigner(rollupManagerContract.target as any); + await expect( + PolygonZKEVMV2Contract.connect(rolllupManagerSigner).initialize( + admin.address, + trustedSequencer.address, + networkID, + gasTokenAddress, + urlSequencer, + networkName, + {gasPrice: 0} + ) + ).to.emit(PolygonZKEVMV2Contract, "InitialSequenceBatches"); + + expect(await PolygonZKEVMV2Contract.admin()).to.be.equal(admin.address); + expect(await PolygonZKEVMV2Contract.trustedSequencer()).to.be.equal(trustedSequencer.address); + expect(await PolygonZKEVMV2Contract.trustedSequencerURL()).to.be.equal(urlSequencer); + expect(await PolygonZKEVMV2Contract.networkName()).to.be.equal(networkName); + expect(await PolygonZKEVMV2Contract.forceBatchTimeout()).to.be.equal(FORCE_BATCH_TIMEOUT); + + // initialize zkEVM + await expect( + PolygonZKEVMV2Contract.connect(rolllupManagerSigner).initialize( + admin.address, + trustedSequencer.address, + networkID, + gasTokenAddress, + urlSequencer, + networkName, + {gasPrice: 0} + ) + ).to.be.revertedWith("Initializable: contract is already initialized"); + }); + + it("should check the initalized parameters", async () => { + // initialize zkEVM + await expect( + PolygonZKEVMV2Contract.initialize( + admin.address, + trustedSequencer.address, + networkID, + gasTokenAddress, + urlSequencer, + networkName + ) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "OnlyRollupManager"); + + // Initialzie using rollup manager + await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); + const rolllupManagerSigner = await ethers.getSigner(rollupManagerContract.target as any); + await expect( + PolygonZKEVMV2Contract.connect(rolllupManagerSigner).initialize( + admin.address, + trustedSequencer.address, + networkID, + gasTokenAddress, + urlSequencer, + networkName, + {gasPrice: 0} + ) + ).to.emit(PolygonZKEVMV2Contract, "InitialSequenceBatches"); + + expect(await PolygonZKEVMV2Contract.admin()).to.be.equal(admin.address); + expect(await PolygonZKEVMV2Contract.trustedSequencer()).to.be.equal(trustedSequencer.address); + expect(await PolygonZKEVMV2Contract.trustedSequencerURL()).to.be.equal(urlSequencer); + expect(await PolygonZKEVMV2Contract.networkName()).to.be.equal(networkName); + expect(await PolygonZKEVMV2Contract.forceBatchTimeout()).to.be.equal(FORCE_BATCH_TIMEOUT); + + // initialize zkEVM + await expect( + PolygonZKEVMV2Contract.connect(rolllupManagerSigner).initialize( + admin.address, + trustedSequencer.address, + networkID, + gasTokenAddress, + urlSequencer, + networkName, + {gasPrice: 0} + ) + ).to.be.revertedWith("Initializable: contract is already initialized"); + }); + + it("should check admin functions", async () => { + // Initialzie using rollup manager + await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); + const rolllupManagerSigner = await ethers.getSigner(rollupManagerContract.target as any); + await expect( + PolygonZKEVMV2Contract.connect(rolllupManagerSigner).initialize( + admin.address, + trustedSequencer.address, + networkID, + gasTokenAddress, + urlSequencer, + networkName, + {gasPrice: 0} + ) + ).to.emit(PolygonZKEVMV2Contract, "InitialSequenceBatches"); + + expect(await PolygonZKEVMV2Contract.isSequenceWithDataAvailabilityAllowed()).to.be.equal(false); + + await expect(PolygonZKEVMV2Contract.switchSequenceWithDataAvailability(true)).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "OnlyAdmin" + ); + + await expect( + PolygonZKEVMV2Contract.connect(admin).switchSequenceWithDataAvailability(false) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "SwitchToSameValue"); + + await expect(PolygonZKEVMV2Contract.connect(admin).switchSequenceWithDataAvailability(true)).to.emit( + PolygonZKEVMV2Contract, + "SwitchSequenceWithDataAvailability" + ); + expect(await PolygonZKEVMV2Contract.isSequenceWithDataAvailabilityAllowed()).to.be.equal(true); + + expect(await PolygonZKEVMV2Contract.dataAvailabilityProtocol()).to.be.equal(ethers.ZeroAddress); + + await expect( + PolygonZKEVMV2Contract.setDataAvailabilityProtocol(deployer.address) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "OnlyAdmin"); + + await expect(PolygonZKEVMV2Contract.connect(admin).setDataAvailabilityProtocol(deployer.address)) + .to.emit(PolygonZKEVMV2Contract, "SetDataAvailabilityProtocol") + .withArgs(deployer.address); + + expect(await PolygonZKEVMV2Contract.dataAvailabilityProtocol()).to.be.equal(deployer.address); + + await expect(PolygonZKEVMV2Contract.connect(admin).setTrustedSequencerURL("0x1253")) + .to.emit(PolygonZKEVMV2Contract, "SetTrustedSequencerURL") + .withArgs("0x1253"); + + await expect(PolygonZKEVMV2Contract.setTrustedSequencer(deployer.address)).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "OnlyAdmin" + ); + await expect(PolygonZKEVMV2Contract.setForceBatchTimeout(0)).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "OnlyAdmin" + ); + + await expect(PolygonZKEVMV2Contract.setTrustedSequencer(deployer.address)).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "OnlyAdmin" + ); + + await expect(PolygonZKEVMV2Contract.connect(admin).setTrustedSequencer(deployer.address)) + .to.emit(PolygonZKEVMV2Contract, "SetTrustedSequencer") + .withArgs(deployer.address); + + await expect(PolygonZKEVMV2Contract.setTrustedSequencerURL("0x1253")).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "OnlyAdmin" + ); + await expect(PolygonZKEVMV2Contract.connect(admin).setTrustedSequencerURL("0x1253")) + .to.emit(PolygonZKEVMV2Contract, "SetTrustedSequencerURL") + .withArgs("0x1253"); + + await expect(PolygonZKEVMV2Contract.setForceBatchTimeout(0)).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "OnlyAdmin" + ); + + // Set Forcebatch timeout + await expect( + PolygonZKEVMV2Contract.connect(admin).setForceBatchTimeout(FORCE_BATCH_TIMEOUT + 1) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "InvalidRangeForceBatchTimeout"); + + await expect( + PolygonZKEVMV2Contract.connect(admin).setForceBatchTimeout(FORCE_BATCH_TIMEOUT) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "InvalidRangeForceBatchTimeout"); + + await expect(PolygonZKEVMV2Contract.connect(admin).setForceBatchTimeout(0)) + .to.emit(PolygonZKEVMV2Contract, "SetForceBatchTimeout") + .withArgs(0); + + expect(await PolygonZKEVMV2Contract.forceBatchTimeout()).to.be.equal(0); + + await rollupManagerContract.activateEmergencyState(); + await expect(PolygonZKEVMV2Contract.connect(admin).setForceBatchTimeout(FORCE_BATCH_TIMEOUT)) + .to.emit(PolygonZKEVMV2Contract, "SetForceBatchTimeout") + .withArgs(FORCE_BATCH_TIMEOUT); + await rollupManagerContract.deactivateEmergencyState(); + + await expect(PolygonZKEVMV2Contract.transferAdminRole(deployer.address)).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "OnlyAdmin" + ); + + await expect(PolygonZKEVMV2Contract.connect(admin).transferAdminRole(deployer.address)) + .to.emit(PolygonZKEVMV2Contract, "TransferAdminRole") + .withArgs(deployer.address); + + await expect(PolygonZKEVMV2Contract.connect(admin).acceptAdminRole()).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "OnlyPendingAdmin" + ); + + await expect(PolygonZKEVMV2Contract.connect(deployer).acceptAdminRole()) + .to.emit(PolygonZKEVMV2Contract, "AcceptAdminRole") + .withArgs(deployer.address); + + // Check force batches are unactive + await expect(PolygonZKEVMV2Contract.forceBatch("0x", 0)).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "ForceBatchNotAllowed" + ); + await expect(PolygonZKEVMV2Contract.sequenceForceBatches([])).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "ForceBatchNotAllowed" + ); + + // deployer now is the admin + await expect( + PolygonZKEVMV2Contract.connect(admin).setForceBatchAddress(ethers.ZeroAddress) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "OnlyAdmin"); + + await expect(PolygonZKEVMV2Contract.connect(deployer).setForceBatchAddress(ethers.ZeroAddress)) + .to.emit(PolygonZKEVMV2Contract, "SetForceBatchAddress") + .withArgs(ethers.ZeroAddress); + + await expect( + PolygonZKEVMV2Contract.connect(deployer).setForceBatchAddress(ethers.ZeroAddress) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "ForceBatchesDecentralized"); + + // Check revert onVerifyBatches + await expect( + PolygonZKEVMV2Contract.connect(admin).onVerifyBatches(0, ethers.ZeroHash, trustedAggregator.address) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "OnlyRollupManager"); + }); + + it("should check admin functions data commitee", async () => { + expect(await PolygonDataCommitee.requiredAmountOfSignatures()).to.be.equal(0); + expect(await PolygonDataCommitee.committeeHash()).to.be.equal(ethers.ZeroHash); + expect(await PolygonDataCommitee.getAmountOfMembers()).to.be.equal(0); + expect(await PolygonDataCommitee.getProcotolName()).to.be.equal("DataAvailabilityCommittee"); + + const requiredAmountOfSignatures = 3; + const urls = ["onurl", "twourl", "threeurl"]; + const walletsDataCommitee = [] as any; + let addrBytes = "0x"; + + for (let i = 0; i < 3; i++) { + const newWallet = ethers.HDNodeWallet.fromMnemonic( + ethers.Mnemonic.fromPhrase("test test test test test test test test test test test junk"), + `m/44'/60'/0'/0/${i}` + ); + walletsDataCommitee.push(newWallet); + addrBytes = addrBytes + newWallet.address.slice(2); + } + + await expect( + PolygonDataCommitee.connect(admin).setupCommittee(requiredAmountOfSignatures, urls, addrBytes) + ).to.be.revertedWith("Ownable: caller is not the owner"); + + await expect( + PolygonDataCommitee.setupCommittee(requiredAmountOfSignatures, urls.slice(1), addrBytes) + ).to.be.revertedWithCustomError(PolygonDataCommitee, "TooManyRequiredSignatures"); + + await expect( + PolygonDataCommitee.setupCommittee(requiredAmountOfSignatures, urls, "0x" + addrBytes.slice(4)) + ).to.be.revertedWithCustomError(PolygonDataCommitee, "UnexpectedAddrsBytesLength"); + + await expect(PolygonDataCommitee.setupCommittee(1, [""], deployer.address)).to.be.revertedWithCustomError( + PolygonDataCommitee, + "EmptyURLNotAllowed" + ); + + await expect( + PolygonDataCommitee.setupCommittee(requiredAmountOfSignatures, urls, addrBytes) + ).to.be.revertedWithCustomError(PolygonDataCommitee, "WrongAddrOrder"); + + // sort wallets + walletsDataCommitee.sort((walleta: any, walletb: any) => { + if (ethers.toBigInt(walleta.address) > ethers.toBigInt(walletb.address)) { + return 1; + } else { + return -1; + } + }); + addrBytes = "0x"; + + for (let i = 0; i < walletsDataCommitee.length; i++) { + addrBytes = addrBytes + walletsDataCommitee[i].address.slice(2); + } + + const commiteeHash = ethers.keccak256(addrBytes); + + await expect(PolygonDataCommitee.setupCommittee(requiredAmountOfSignatures, urls, addrBytes)) + .to.emit(PolygonDataCommitee, "CommitteeUpdated") + .withArgs(commiteeHash); + + expect(await PolygonDataCommitee.requiredAmountOfSignatures()).to.be.equal(3); + expect(await PolygonDataCommitee.committeeHash()).to.be.equal(commiteeHash); + expect(await PolygonDataCommitee.getAmountOfMembers()).to.be.equal(3); + }); + + it("should generateInitializeTransaction with huge metadata", async () => { + const hugeMetadata = `0x${"00".repeat(Number(2n ** 16n))}`; + await expect( + PolygonZKEVMV2Contract.generateInitializeTransaction(0, ethers.ZeroAddress, 1, hugeMetadata) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "HugeTokenMetadataNotSupported"); + }); + it("should check full flow", async () => { + // Initialzie using rollup manager + await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); + const rolllupManagerSigner = await ethers.getSigner(rollupManagerContract.target as any); + await expect( + PolygonZKEVMV2Contract.connect(rolllupManagerSigner).initialize( + admin.address, + trustedSequencer.address, + networkID, + gasTokenAddress, + urlSequencer, + networkName, + {gasPrice: 0} + ) + ).to.emit(PolygonZKEVMV2Contract, "InitialSequenceBatches"); + const blockCreatedRollup = await ethers.provider.getBlock("latest"); + const timestampCreatedRollup = blockCreatedRollup?.timestamp; + + const transaction = await PolygonZKEVMV2Contract.generateInitializeTransaction( + networkID, + gasTokenAddress, + gasTokenNetwork, + "0x" // empty metadata + ); + + // Check transaction + const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + const encodedData = bridgeL2Factory.interface.encodeFunctionData("initialize", [ + networkID, + gasTokenAddress, + gasTokenNetwork, + globalExitRootL2Address, + ethers.ZeroAddress, + "0x", // empty metadata + ]); + + const rawTx = processorUtils.customRawTxToRawTx(transaction); + const tx = ethers.Transaction.from(rawTx); + + const rlpSignData = transaction.slice(0, -(SIGNATURE_BYTES * 2 + EFFECTIVE_PERCENTAGE_BYTES * 2)); + expect(rlpSignData).to.be.equal(tx.unsignedSerialized); + + expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); + expect(tx.value).to.be.equal(0); + expect(tx.data).to.be.equal(encodedData); + expect(tx.gasPrice).to.be.equal(0); + expect(tx.gasLimit).to.be.equal(30000000); + expect(tx.nonce).to.be.equal(0); + expect(tx.chainId).to.be.equal(0); + + const expectedAccInputHash = calculateAccInputHashetrog( + ethers.ZeroHash, + ethers.keccak256(transaction), + await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), + timestampCreatedRollup, + trustedSequencer.address, + blockCreatedRollup?.parentHash + ); + + // calcualte accINputHash + expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash); + + // try verify batches + const l2txData = "0x123456"; + const maticAmount = await rollupManagerContract.getBatchFee(); + + const sequence = { + transactions: l2txData, + forcedGlobalExitRoot: ethers.ZeroHash, + forcedTimestamp: 0, + forcedBlockHashL1: ethers.ZeroHash, + } as BatchDataStructEtrog; + + // Approve tokens + await expect( + polTokenContract.connect(trustedSequencer).approve(PolygonZKEVMV2Contract.target, maticAmount) + ).to.emit(polTokenContract, "Approval"); + + // Sequence Batches + + await expect( + PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "SequenceWithDataAvailabilityNotAllowed"); + + await expect(PolygonZKEVMV2Contract.connect(admin).switchSequenceWithDataAvailability(true)).to.emit( + PolygonZKEVMV2Contract, + "SwitchSequenceWithDataAvailability" + ); + await expect( + PolygonZKEVMV2Contract.sequenceBatches([sequence], trustedSequencer.address) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "OnlyTrustedSequencer"); + + await expect( + PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatches([], trustedSequencer.address) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "SequenceZeroBatches"); + + const hugeBatchArray = new Array(_MAX_VERIFY_BATCHES + 1).fill({ + transactions: "0x", + forcedGlobalExitRoot: ethers.ZeroHash, + forcedTimestamp: 0, + forcedBlockHashL1: ethers.ZeroHash, + }); + + await expect( + PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatches(hugeBatchArray, trustedSequencer.address) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "ExceedMaxVerifyBatches"); + + // Create a huge sequence + await expect( + PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatches( + [ + { + transactions: `0x${"00".repeat(_MAX_TRANSACTIONS_BYTE_LENGTH + 1)}` as any, + forcedGlobalExitRoot: ethers.ZeroHash, + forcedTimestamp: 0, + forcedBlockHashL1: ethers.ZeroHash, + }, + ], + trustedSequencer.address + ) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "TransactionsLengthAboveMax"); + + // False forced batch + await expect( + PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatches( + [ + { + transactions: "0x", + forcedGlobalExitRoot: ethers.hexlify(ethers.randomBytes(32)), + forcedTimestamp: 1000, + forcedBlockHashL1: ethers.ZeroHash, + }, + ], + trustedSequencer.address + ) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "ForcedDataDoesNotMatch"); + + await expect( + PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address) + ).to.emit(PolygonZKEVMV2Contract, "SequenceBatches"); + + const currentTimestampSequenced = (await ethers.provider.getBlock("latest"))?.timestamp; + + const expectedAccInputHash2 = calculateAccInputHashetrog( + expectedAccInputHash, + ethers.keccak256(l2txData), + await polygonZkEVMGlobalExitRoot.getRoot(), + currentTimestampSequenced, + trustedSequencer.address, + ethers.ZeroHash + ); + + // calcualte accINputHash + expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash2); + }); + + it("should check full flow with data commitee", async () => { + // Initialzie using rollup manager + await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); + const rolllupManagerSigner = await ethers.getSigner(rollupManagerContract.target as any); + await expect( + PolygonZKEVMV2Contract.connect(rolllupManagerSigner).initialize( + admin.address, + trustedSequencer.address, + networkID, + gasTokenAddress, + urlSequencer, + networkName, + {gasPrice: 0} + ) + ).to.emit(PolygonZKEVMV2Contract, "InitialSequenceBatches"); + const blockCreatedRollup = await ethers.provider.getBlock("latest"); + const timestampCreatedRollup = blockCreatedRollup?.timestamp; + + await expect(PolygonZKEVMV2Contract.connect(admin).switchSequenceWithDataAvailability(true)).to.emit( + PolygonZKEVMV2Contract, + "SwitchSequenceWithDataAvailability" + ); + + const transaction = await PolygonZKEVMV2Contract.generateInitializeTransaction( + networkID, + gasTokenAddress, + gasTokenNetwork, + "0x" // empty metadata + ); + + // Check transaction + const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + const encodedData = bridgeL2Factory.interface.encodeFunctionData("initialize", [ + networkID, + gasTokenAddress, + gasTokenNetwork, + globalExitRootL2Address, + ethers.ZeroAddress, + "0x", // empty metadata + ]); + + const rawTx = processorUtils.customRawTxToRawTx(transaction); + const tx = ethers.Transaction.from(rawTx); + + const rlpSignData = transaction.slice(0, -(SIGNATURE_BYTES * 2 + EFFECTIVE_PERCENTAGE_BYTES * 2)); + expect(rlpSignData).to.be.equal(tx.unsignedSerialized); + + expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); + expect(tx.value).to.be.equal(0); + expect(tx.data).to.be.equal(encodedData); + expect(tx.gasPrice).to.be.equal(0); + expect(tx.gasLimit).to.be.equal(30000000); + expect(tx.nonce).to.be.equal(0); + expect(tx.chainId).to.be.equal(0); + + const expectedAccInputHash = calculateAccInputHashetrog( + ethers.ZeroHash, + ethers.keccak256(transaction), + await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), + timestampCreatedRollup, + trustedSequencer.address, + blockCreatedRollup?.parentHash + ); + + // calcualte accINputHash + expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash); + + // try verify batches + const l2txData = "0x123456"; + const hashedData = ethers.keccak256(l2txData) as any; + const maticAmount = await rollupManagerContract.getBatchFee(); + + const sequenceValidium = { + transactionsHash: hashedData, + forcedGlobalExitRoot: ethers.ZeroHash, + forcedTimestamp: 0, + forcedBlockHashL1: ethers.ZeroHash, + } as ValidiumBatchData; + + // Approve tokens + await expect( + polTokenContract.connect(trustedSequencer).approve(PolygonZKEVMV2Contract.target, maticAmount) + ).to.emit(polTokenContract, "Approval"); + + // Sequence Batches + + await expect( + PolygonZKEVMV2Contract.sequenceBatchesValidium([sequenceValidium], trustedSequencer.address, "0x1233") + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "OnlyTrustedSequencer"); + + await expect( + PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatchesValidium( + [], + trustedSequencer.address, + "0x1233" + ) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "SequenceZeroBatches"); + + const hugeBatchArray = new Array(_MAX_VERIFY_BATCHES + 1).fill({ + transactionsHash: hashedData, + forcedGlobalExitRoot: ethers.ZeroHash, + forcedTimestamp: 0, + forcedBlockHashL1: ethers.ZeroHash, + }); + + await expect( + PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatchesValidium( + hugeBatchArray, + trustedSequencer.address, + "0x" + ) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "ExceedMaxVerifyBatches"); + + // False forced batch + await expect( + PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatchesValidium( + [ + { + transactionsHash: hashedData, + forcedGlobalExitRoot: ethers.hexlify(ethers.randomBytes(32)), + forcedTimestamp: 1000, + forcedBlockHashL1: ethers.ZeroHash, + }, + ], + trustedSequencer.address, + "0x" + ) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "ForcedDataDoesNotMatch"); + + await expect( + PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatchesValidium( + [sequenceValidium], + trustedSequencer.address, + "0x1233" + ) + ).to.be.reverted; + + // Setup commitee + await PolygonZKEVMV2Contract.connect(admin).setDataAvailabilityProtocol(PolygonDataCommitee.target); + + const requiredAmountOfSignatures = 3; + const urls = ["onurl", "twourl", "threeurl"]; + const walletsDataCommitee = [] as any; + let unsortedAddrBytes = "0x"; + + for (let i = 0; i < 3; i++) { + const newWallet = ethers.HDNodeWallet.fromMnemonic( + ethers.Mnemonic.fromPhrase("test test test test test test test test test test test junk"), + `m/44'/60'/0'/0/${i}` + ); + walletsDataCommitee.push(newWallet); + unsortedAddrBytes = unsortedAddrBytes + newWallet.address.slice(2); + } + // sort wallets + walletsDataCommitee.sort((walleta: any, walletb: any) => { + if (ethers.toBigInt(walleta.address) > ethers.toBigInt(walletb.address)) { + return 1; + } else { + return -1; + } + }); + + let addrBytes = "0x"; + for (let i = 0; i < walletsDataCommitee.length; i++) { + addrBytes = addrBytes + walletsDataCommitee[i].address.slice(2); + } + + const commiteeHash = ethers.keccak256(addrBytes); + const signedData = ethers.solidityPackedKeccak256(["bytes32", "bytes32"], [ethers.ZeroHash, hashedData]); + let message = "0x"; + for (let i = 0; i < walletsDataCommitee.length; i++) { + const newSignature = walletsDataCommitee[i].signingKey.sign(signedData); + message = message + newSignature.serialized.slice(2); + } + await expect(PolygonDataCommitee.setupCommittee(requiredAmountOfSignatures, urls, addrBytes)) + .to.emit(PolygonDataCommitee, "CommitteeUpdated") + .withArgs(commiteeHash); + + let dataAvailabilityMessage = message + addrBytes.slice(2); + const badDataAvMessage = message + unsortedAddrBytes.slice(2); + await expect( + PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatchesValidium( + [sequenceValidium], + trustedSequencer.address, + badDataAvMessage + ) + ).to.be.revertedWithCustomError(PolygonDataCommitee, "UnexpectedCommitteeHash"); + + await expect( + PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatchesValidium( + [sequenceValidium], + trustedSequencer.address, + badDataAvMessage.slice(0, -2) + ) + ).to.be.revertedWithCustomError(PolygonDataCommitee, "UnexpectedAddrsAndSignaturesSize"); + + await expect( + PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatchesValidium( + [sequenceValidium], + trustedSequencer.address, + dataAvailabilityMessage + ) + ).to.emit(PolygonZKEVMV2Contract, "SequenceBatches"); + + const currentTimestampSequenced = (await ethers.provider.getBlock("latest"))?.timestamp; + const expectedAccInputHash2 = calculateAccInputHashetrog( + expectedAccInputHash, + hashedData, + await polygonZkEVMGlobalExitRoot.getRoot(), + currentTimestampSequenced, + trustedSequencer.address, + ethers.ZeroHash + ); + + // calcualte accINputHash + expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash2); + }); + + it("should check full flow with wrapped gas token", async () => { + // Create a new wrapped token mocking the bridge + const tokenName = "Matic Token L2"; + const tokenSymbol = "MATIC"; + const decimals = 18; + const metadataToken = ethers.AbiCoder.defaultAbiCoder().encode( + ["string", "string", "uint8"], + [tokenName, tokenSymbol, decimals] + ); + + const originNetwork = networkIDRollup; + const tokenAddress = ethers.getAddress(ethers.hexlify(ethers.randomBytes(20))); + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDMainnet; + const destinationAddress = beneficiary.address; + const metadata = metadataToken; // since we are inserting in the exit root can be anything + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + // compute root merkle tree in Js + const height = 32; + const merkleTreezkEVM = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + + // Add 2 leafs + merkleTreezkEVM.add(leafValue); + merkleTreezkEVM.add(leafValue); + + // check merkle root with SC + const rootzkEVM = merkleTreezkEVM.getRoot(); + + // Calcualte new globalExitroot + const merkleTreeRollups = new MerkleTreeBridge(height); + merkleTreeRollups.add(rootzkEVM); + const rootRollups = merkleTreeRollups.getRoot(); + + // Assert global exit root + await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); + const rolllupManagerSigner = await ethers.getSigner(rollupManagerContract.target as any); + await polygonZkEVMGlobalExitRoot.connect(rolllupManagerSigner).updateExitRoot(rootRollups, {gasPrice: 0}); + + expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(ethers.ZeroHash); + expect(await polygonZkEVMGlobalExitRoot.lastRollupExitRoot()).to.be.equal(rootRollups); + + expect(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()).to.be.equal( + calculateGlobalExitRoot(ethers.ZeroHash, rootRollups) + ); + + const indexLeaf = 0; + const proofZkEVM = merkleTreezkEVM.getProofTreeByIndex(indexLeaf); + const proofRollups = merkleTreeRollups.getProofTreeByIndex(indexLeaf); + + // verify merkle proof + expect(verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM)).to.be.equal(true); + expect(verifyMerkleProof(rootzkEVM, proofRollups, indexLeaf, rootRollups)).to.be.equal(true); + + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM) + ).to.be.equal(true); + + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(rootzkEVM, proofRollups, indexLeaf, rootRollups) + ).to.be.equal(true); + + // claim + const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); + // create2 parameters + const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]); + const minimalBytecodeProxy = await polygonZkEVMBridgeContract.BASE_INIT_BYTECODE_WRAPPED_TOKEN(); + const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]); + const precalculateWrappedErc20 = await ethers.getCreate2Address( + polygonZkEVMBridgeContract.target as string, + salt, + hashInitCode + ); + const newWrappedToken = tokenWrappedFactory.attach(precalculateWrappedErc20) as TokenWrapped; + + // Use precalculatedWrapperAddress and check if matches + expect( + await polygonZkEVMBridgeContract.precalculatedWrapperAddress( + networkIDRollup, + tokenAddress, + tokenName, + tokenSymbol, + decimals + ) + ).to.be.equal(precalculateWrappedErc20); + + // index leaf is 0 bc, does not have mainnet flag, and it's rollup 0 on leaf 0 + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofZkEVM, + proofRollups, + indexLeaf, + ethers.ZeroHash, + rootRollups, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ) + .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") + .withArgs(indexLeaf, originNetwork, tokenAddress, destinationAddress, amount) + .to.emit(polygonZkEVMBridgeContract, "NewWrappedToken") + .withArgs(originNetwork, tokenAddress, precalculateWrappedErc20, metadata) + .to.emit(newWrappedToken, "Transfer") + .withArgs(ethers.ZeroAddress, beneficiary.address, amount); + + // Assert maps created + const newTokenInfo = await polygonZkEVMBridgeContract.wrappedTokenToTokenInfo(precalculateWrappedErc20); + + expect(newTokenInfo.originNetwork).to.be.equal(networkIDRollup); + expect(newTokenInfo.originTokenAddress).to.be.equal(tokenAddress); + expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( + precalculateWrappedErc20 + ); + expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( + precalculateWrappedErc20 + ); + + expect(await polygonZkEVMBridgeContract.tokenInfoToWrappedToken(salt)).to.be.equal(precalculateWrappedErc20); + + // Check the wrapper info + expect(await newWrappedToken.name()).to.be.equal(tokenName); + expect(await newWrappedToken.symbol()).to.be.equal(tokenSymbol); + expect(await newWrappedToken.decimals()).to.be.equal(decimals); + + // Initialzie using rollup manager with gas token + await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); + await expect( + PolygonZKEVMV2Contract.connect(rolllupManagerSigner).initialize( + admin.address, + trustedSequencer.address, + networkID, + newWrappedToken.target, + urlSequencer, + networkName, + {gasPrice: 0} + ) + ).to.emit(PolygonZKEVMV2Contract, "InitialSequenceBatches"); + + const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; + + const transaction = await PolygonZKEVMV2Contract.generateInitializeTransaction( + networkID, + tokenAddress, + originNetwork, + metadata // empty metadata + ); + + // Check transaction + const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + const encodedData = bridgeL2Factory.interface.encodeFunctionData("initialize", [ + networkID, + tokenAddress, + originNetwork, + globalExitRootL2Address, + ethers.ZeroAddress, + metadata, // empty metadata + ]); + + const blockCreatedRollup = await ethers.provider.getBlock("latest"); + + const rawTx = processorUtils.customRawTxToRawTx(transaction); + const tx = ethers.Transaction.from(rawTx); + + const rlpSignData = transaction.slice(0, -(SIGNATURE_BYTES * 2 + EFFECTIVE_PERCENTAGE_BYTES * 2)); + expect(rlpSignData).to.be.equal(tx.unsignedSerialized); + + expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); + expect(tx.value).to.be.equal(0); + expect(tx.data).to.be.equal(encodedData); + expect(tx.gasPrice).to.be.equal(0); + expect(tx.gasLimit).to.be.equal(30000000); + expect(tx.nonce).to.be.equal(0); + expect(tx.chainId).to.be.equal(0); + + const expectedAccInputHash = calculateAccInputHashetrog( + ethers.ZeroHash, + ethers.keccak256(transaction), + await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), + timestampCreatedRollup, + trustedSequencer.address, + blockCreatedRollup?.parentHash + ); + + // calcualte accINputHash + expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash); + + expect(await PolygonZKEVMV2Contract.gasTokenAddress()).to.be.equal(tokenAddress); + expect(await PolygonZKEVMV2Contract.gasTokenNetwork()).to.be.equal(originNetwork); + }); + + it("should check forced batches and sequenced withou data commitee", async () => { + // Initialzie using rollup manager + await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); + const rolllupManagerSigner = await ethers.getSigner(rollupManagerContract.target as any); + await expect( + PolygonZKEVMV2Contract.connect(rolllupManagerSigner).initialize( + admin.address, + trustedSequencer.address, + networkID, + gasTokenAddress, + urlSequencer, + networkName, + {gasPrice: 0} + ) + ).to.emit(PolygonZKEVMV2Contract, "InitialSequenceBatches"); + + const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; + const transaction = await PolygonZKEVMV2Contract.generateInitializeTransaction( + networkID, + gasTokenAddress, + gasTokenNetwork, + "0x" // empty metadata + ); + + // Check transaction + const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + const encodedData = bridgeL2Factory.interface.encodeFunctionData("initialize", [ + networkID, + gasTokenAddress, + gasTokenNetwork, + globalExitRootL2Address, + ethers.ZeroAddress, + "0x", // empty metadata + ]); + + const blockCreatedRollup = await ethers.provider.getBlock("latest"); + + const rawTx = processorUtils.customRawTxToRawTx(transaction); + const tx = ethers.Transaction.from(rawTx); + + const rlpSignData = transaction.slice(0, -(SIGNATURE_BYTES * 2 + EFFECTIVE_PERCENTAGE_BYTES * 2)); + expect(rlpSignData).to.be.equal(tx.unsignedSerialized); + + expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); + expect(tx.value).to.be.equal(0); + expect(tx.data).to.be.equal(encodedData); + expect(tx.gasPrice).to.be.equal(0); + expect(tx.gasLimit).to.be.equal(30000000); + expect(tx.nonce).to.be.equal(0); + expect(tx.chainId).to.be.equal(0); + + const expectedAccInputHash = calculateAccInputHashetrog( + ethers.ZeroHash, + ethers.keccak256(transaction), + await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), + timestampCreatedRollup, + trustedSequencer.address, + blockCreatedRollup?.parentHash + ); + + // calcualte accINputHash + expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash); + + // try verify batches + const l2txData = "0x123456"; + const maticAmount = ethers.parseEther("1"); + + // Approve tokens + await expect(polTokenContract.connect(admin).approve(PolygonZKEVMV2Contract.target, maticAmount)).to.emit( + polTokenContract, + "Approval" + ); + + expect(await PolygonZKEVMV2Contract.calculatePolPerForceBatch()).to.be.equal(0); + + const globalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); + + // force Batches + await expect(PolygonZKEVMV2Contract.forceBatch(l2txData, maticAmount)).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "ForceBatchNotAllowed" + ); + + //await PolygonZKEVMV2Contract.connect(admin).activateForceBatches(); + await polTokenContract.transfer(admin.address, ethers.parseEther("1000")); + + // force Batches + await expect(PolygonZKEVMV2Contract.forceBatch(l2txData, 0)).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "ForceBatchNotAllowed" + ); + + await expect(PolygonZKEVMV2Contract.connect(admin).forceBatch(l2txData, 0)).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "NotEnoughPOLAmount" + ); + + await expect( + PolygonZKEVMV2Contract.connect(admin).forceBatch( + `0x${"00".repeat(_MAX_TRANSACTIONS_BYTE_LENGTH + 1)}`, + maticAmount + ) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "TransactionsLengthAboveMax"); + + await expect(PolygonZKEVMV2Contract.connect(admin).forceBatch(l2txData, maticAmount)) + .to.emit(PolygonZKEVMV2Contract, "ForceBatch") + .withArgs(1, globalExitRoot, admin.address, "0x"); + + const blockForced = await ethers.provider.getBlock("latest"); + const timestampForceBatch = blockForced?.timestamp as any; + + // Sequence force batches + const sequenceForced = { + transactionsHash: ethers.keccak256(l2txData), + forcedGlobalExitRoot: globalExitRoot, + forcedTimestamp: timestampForceBatch, + forcedBlockHashL1: blockForced?.parentHash, + } as ValidiumBatchData; + + // Even if a data commitee is not set it will work since it's not checked + await PolygonZKEVMV2Contract.connect(admin).setDataAvailabilityProtocol(PolygonDataCommitee.target); + + const requiredAmountOfSignatures = 3; + const urls = ["onurl", "twourl", "threeurl"]; + const walletsDataCommitee = [] as any; + let unsortedAddrBytes = "0x"; + + for (let i = 0; i < 3; i++) { + const newWallet = ethers.HDNodeWallet.fromMnemonic( + ethers.Mnemonic.fromPhrase("test test test test test test test test test test test junk"), + `m/44'/60'/0'/0/${i}` + ); + walletsDataCommitee.push(newWallet); + unsortedAddrBytes = unsortedAddrBytes + newWallet.address.slice(2); + } + // sort wallets + walletsDataCommitee.sort((walleta: any, walletb: any) => { + if (ethers.toBigInt(walleta.address) > ethers.toBigInt(walletb.address)) { + return 1; + } else { + return -1; + } + }); + + let addrBytes = "0x"; + for (let i = 0; i < walletsDataCommitee.length; i++) { + addrBytes = addrBytes + walletsDataCommitee[i].address.slice(2); + } + + const commiteeHash = ethers.keccak256(addrBytes); + const signedData = ethers.solidityPackedKeccak256( + ["bytes32", "bytes32"], + [ethers.ZeroHash, ethers.keccak256(l2txData)] + ); + let message = "0x"; + for (let i = 0; i < walletsDataCommitee.length; i++) { + const newSignature = walletsDataCommitee[i].signingKey.sign(signedData); + message = message + newSignature.serialized.slice(2); + } + await expect(PolygonDataCommitee.setupCommittee(requiredAmountOfSignatures, urls, addrBytes)) + .to.emit(PolygonDataCommitee, "CommitteeUpdated") + .withArgs(commiteeHash); + + await expect( + PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatchesValidium( + [sequenceForced], + trustedSequencer.address, + "0x12" + ) + ).to.emit(PolygonZKEVMV2Contract, "SequenceBatches"); + }); + + it("should check forced batches", async () => { + // Initialzie using rollup manager + await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); + const rolllupManagerSigner = await ethers.getSigner(rollupManagerContract.target as any); + await expect( + PolygonZKEVMV2Contract.connect(rolllupManagerSigner).initialize( + admin.address, + trustedSequencer.address, + networkID, + gasTokenAddress, + urlSequencer, + networkName, + {gasPrice: 0} + ) + ).to.emit(PolygonZKEVMV2Contract, "InitialSequenceBatches"); + + const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; + const transaction = await PolygonZKEVMV2Contract.generateInitializeTransaction( + networkID, + gasTokenAddress, + gasTokenNetwork, + "0x" // empty metadata + ); + + // Check transaction + const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + const encodedData = bridgeL2Factory.interface.encodeFunctionData("initialize", [ + networkID, + gasTokenAddress, + gasTokenNetwork, + globalExitRootL2Address, + ethers.ZeroAddress, + "0x", // empty metadata + ]); + + const blockCreatedRollup = await ethers.provider.getBlock("latest"); + + const rawTx = processorUtils.customRawTxToRawTx(transaction); + const tx = ethers.Transaction.from(rawTx); + + const rlpSignData = transaction.slice(0, -(SIGNATURE_BYTES * 2 + EFFECTIVE_PERCENTAGE_BYTES * 2)); + expect(rlpSignData).to.be.equal(tx.unsignedSerialized); + + expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); + expect(tx.value).to.be.equal(0); + expect(tx.data).to.be.equal(encodedData); + expect(tx.gasPrice).to.be.equal(0); + expect(tx.gasLimit).to.be.equal(30000000); + expect(tx.nonce).to.be.equal(0); + expect(tx.chainId).to.be.equal(0); + + const expectedAccInputHash = calculateAccInputHashetrog( + ethers.ZeroHash, + ethers.keccak256(transaction), + await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), + timestampCreatedRollup, + trustedSequencer.address, + blockCreatedRollup?.parentHash + ); + + // calcualte accINputHash + expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash); + + // try verify batches + const l2txData = "0x123456"; + const maticAmount = ethers.parseEther("1"); + + // Approve tokens + await expect(polTokenContract.connect(admin).approve(PolygonZKEVMV2Contract.target, maticAmount)).to.emit( + polTokenContract, + "Approval" + ); + + expect(await PolygonZKEVMV2Contract.calculatePolPerForceBatch()).to.be.equal(0); + + const globalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); + + // force Batches + await expect(PolygonZKEVMV2Contract.forceBatch(l2txData, maticAmount)).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "ForceBatchNotAllowed" + ); + + //await PolygonZKEVMV2Contract.connect(admin).activateForceBatches(); + await polTokenContract.transfer(admin.address, ethers.parseEther("1000")); + + // force Batches + await expect(PolygonZKEVMV2Contract.forceBatch(l2txData, 0)).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "ForceBatchNotAllowed" + ); + + await expect(PolygonZKEVMV2Contract.connect(admin).forceBatch(l2txData, 0)).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "NotEnoughPOLAmount" + ); + + await expect( + PolygonZKEVMV2Contract.connect(admin).forceBatch( + `0x${"00".repeat(_MAX_TRANSACTIONS_BYTE_LENGTH + 1)}`, + maticAmount + ) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "TransactionsLengthAboveMax"); + + await expect(PolygonZKEVMV2Contract.connect(admin).forceBatch(l2txData, maticAmount)) + .to.emit(PolygonZKEVMV2Contract, "ForceBatch") + .withArgs(1, globalExitRoot, admin.address, "0x"); + + expect(await PolygonZKEVMV2Contract.calculatePolPerForceBatch()).to.be.equal( + await rollupManagerContract.getForcedBatchFee() + ); + }); + + it("should check forced batches from a contract", async () => { + // Initialzie using rollup manager + await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); + const rolllupManagerSigner = await ethers.getSigner(rollupManagerContract.target as any); + await expect( + PolygonZKEVMV2Contract.connect(rolllupManagerSigner).initialize( + admin.address, + trustedSequencer.address, + networkID, + gasTokenAddress, + urlSequencer, + networkName, + {gasPrice: 0} + ) + ).to.emit(PolygonZKEVMV2Contract, "InitialSequenceBatches"); + + const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; + const transaction = await PolygonZKEVMV2Contract.generateInitializeTransaction( + networkID, + gasTokenAddress, + gasTokenNetwork, + "0x" // empty metadata + ); + + // Check transaction + const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + const encodedData = bridgeL2Factory.interface.encodeFunctionData("initialize", [ + networkID, + gasTokenAddress, + gasTokenNetwork, + globalExitRootL2Address, + ethers.ZeroAddress, + "0x", // empty metadata + ]); + + const blockCreatedRollup = await ethers.provider.getBlock("latest"); + + const rawTx = processorUtils.customRawTxToRawTx(transaction); + const tx = ethers.Transaction.from(rawTx); + + const rlpSignData = transaction.slice(0, -(SIGNATURE_BYTES * 2 + EFFECTIVE_PERCENTAGE_BYTES * 2)); + expect(rlpSignData).to.be.equal(tx.unsignedSerialized); + + expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); + expect(tx.value).to.be.equal(0); + expect(tx.data).to.be.equal(encodedData); + expect(tx.gasPrice).to.be.equal(0); + expect(tx.gasLimit).to.be.equal(30000000); + expect(tx.nonce).to.be.equal(0); + expect(tx.chainId).to.be.equal(0); + + const expectedAccInputHash = calculateAccInputHashetrog( + ethers.ZeroHash, + ethers.keccak256(transaction), + await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), + timestampCreatedRollup, + trustedSequencer.address, + blockCreatedRollup?.parentHash + ); + + // calcualte accINputHash + expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash); + + // try verify batches + const l2txData = "0x123456"; + const maticAmount = ethers.parseEther("1"); + + expect(await PolygonZKEVMV2Contract.calculatePolPerForceBatch()).to.be.equal(0); + + // deploy sender SC + const sendDataFactory = await ethers.getContractFactory("SendData"); + const sendDataContract = await sendDataFactory.deploy(); + await sendDataContract.waitForDeployment(); + + // Approve matic + const approveTx = await polTokenContract.approve.populateTransaction( + PolygonZKEVMV2Contract.target, + maticAmount + ); + await sendDataContract.sendData(approveTx.to, approveTx.data); + + // Activate forced batches + await expect(PolygonZKEVMV2Contract.connect(admin).setForceBatchAddress(sendDataContract.target)).to.emit( + PolygonZKEVMV2Contract, + "SetForceBatchAddress" + ); + + await polTokenContract.transfer(sendDataContract.target, ethers.parseEther("1000")); + + const globalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); + const lastForcedBatch = (await PolygonZKEVMV2Contract.lastForceBatch()) + 1n; + + const forceBatchTx = await PolygonZKEVMV2Contract.forceBatch.populateTransaction(l2txData, maticAmount); + await expect(sendDataContract.sendData(forceBatchTx.to, forceBatchTx.data)) + .to.emit(PolygonZKEVMV2Contract, "ForceBatch") + .withArgs(lastForcedBatch, globalExitRoot, sendDataContract.target, l2txData); + + expect(await PolygonZKEVMV2Contract.calculatePolPerForceBatch()).to.be.equal( + await rollupManagerContract.getForcedBatchFee() + ); + }); + + it("should check forced batches from a contract", async () => { + // Initialzie using rollup manager + await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); + const rolllupManagerSigner = await ethers.getSigner(rollupManagerContract.target as any); + await expect( + PolygonZKEVMV2Contract.connect(rolllupManagerSigner).initialize( + admin.address, + trustedSequencer.address, + networkID, + gasTokenAddress, + urlSequencer, + networkName, + {gasPrice: 0} + ) + ).to.emit(PolygonZKEVMV2Contract, "InitialSequenceBatches"); + + const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; + const transaction = await PolygonZKEVMV2Contract.generateInitializeTransaction( + networkID, + gasTokenAddress, + gasTokenNetwork, + "0x" // empty metadata + ); + + // Check transaction + const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + const encodedData = bridgeL2Factory.interface.encodeFunctionData("initialize", [ + networkID, + gasTokenAddress, + gasTokenNetwork, + globalExitRootL2Address, + ethers.ZeroAddress, + "0x", // empty metadata + ]); + + const blockCreatedRollup = await ethers.provider.getBlock("latest"); + + const rawTx = processorUtils.customRawTxToRawTx(transaction); + const tx = ethers.Transaction.from(rawTx); + + const rlpSignData = transaction.slice(0, -(SIGNATURE_BYTES * 2 + EFFECTIVE_PERCENTAGE_BYTES * 2)); + expect(rlpSignData).to.be.equal(tx.unsignedSerialized); + + expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); + expect(tx.value).to.be.equal(0); + expect(tx.data).to.be.equal(encodedData); + expect(tx.gasPrice).to.be.equal(0); + expect(tx.gasLimit).to.be.equal(30000000); + expect(tx.nonce).to.be.equal(0); + expect(tx.chainId).to.be.equal(0); + + const expectedAccInputHash = calculateAccInputHashetrog( + ethers.ZeroHash, + ethers.keccak256(transaction), + await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), + timestampCreatedRollup, + trustedSequencer.address, + blockCreatedRollup?.parentHash + ); + + // calcualte accINputHash + expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash); + + // try verify batches + const l2txData = "0x123456"; + const maticAmount = ethers.parseEther("1"); + + // Approve tokens + await polTokenContract.transfer(admin.address, ethers.parseEther("1000")); + await expect(polTokenContract.connect(admin).approve(PolygonZKEVMV2Contract.target, maticAmount)).to.emit( + polTokenContract, + "Approval" + ); + + expect(await PolygonZKEVMV2Contract.calculatePolPerForceBatch()).to.be.equal(0); + const globalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); + + const adminPolBalance = await polTokenContract.balanceOf(admin.address); + const forceBatchFee = await rollupManagerContract.getForcedBatchFee(); + + await expect(PolygonZKEVMV2Contract.connect(admin).forceBatch(l2txData, maticAmount)) + .to.emit(PolygonZKEVMV2Contract, "ForceBatch") + .withArgs(1, globalExitRoot, admin.address, "0x"); + + const blockForced = await ethers.provider.getBlock("latest"); + const timestampForceBatch = blockForced?.timestamp as any; + + expect(await polTokenContract.balanceOf(admin.address)).to.be.equal(adminPolBalance - forceBatchFee); + + expect(await PolygonZKEVMV2Contract.calculatePolPerForceBatch()).to.be.equal( + await rollupManagerContract.getForcedBatchFee() + ); + + // Sequence force batches + const sequenceForced = { + transactions: l2txData, + forcedGlobalExitRoot: globalExitRoot, + forcedTimestamp: timestampForceBatch, + forcedBlockHashL1: blockForced?.parentHash, + } as BatchDataStructEtrog; + + // sequence force batch + await expect(PolygonZKEVMV2Contract.connect(admin).sequenceForceBatches([])).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "SequenceZeroBatches" + ); + + // sequence force batch + const sequencedArray = new Array(_MAX_VERIFY_BATCHES + 1).fill(sequenceForced); + + await expect( + PolygonZKEVMV2Contract.connect(admin).sequenceForceBatches(sequencedArray) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "ExceedMaxVerifyBatches"); + + // sequence force batch + await expect( + PolygonZKEVMV2Contract.connect(admin).sequenceForceBatches([sequenceForced, sequenceForced]) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "ForceBatchesOverflow"); + + // sequence force batch + await expect( + PolygonZKEVMV2Contract.connect(admin).sequenceForceBatches([sequenceForced]) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "ForceBatchTimeoutNotExpired"); + + // Increment timestamp + await ethers.provider.send("evm_setNextBlockTimestamp", [timestampForceBatch + FORCE_BATCH_TIMEOUT]); + + // sequence force batch + await expect(PolygonZKEVMV2Contract.connect(admin).sequenceForceBatches([sequenceForced])) + .to.emit(PolygonZKEVMV2Contract, "SequenceForceBatches") + .withArgs(1); + + const expectedAccInputHash3 = calculateAccInputHashetrog( + expectedAccInputHash, + ethers.keccak256(l2txData), + globalExitRoot, + timestampForceBatch, + admin.address, + blockForced?.parentHash + ); + + // calcualte accINputHash + expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash3); + }); +}); + +/** + * Compute accumulateInputHash = Keccak256(oldAccInputHash, batchHashData, globalExitRoot, timestamp, seqAddress) + * @param {String} oldAccInputHash - old accumulateInputHash + * @param {String} batchHashData - Batch hash data + * @param {String} globalExitRoot - Global Exit Root + * @param {Number} timestamp - Block timestamp + * @param {String} sequencerAddress - Sequencer address + * @returns {String} - accumulateInputHash in hex encoding + */ +function calculateAccInputHashetrog( + oldAccInputHash: any, + batchHashData: any, + globalExitRoot: any, + timestamp: any, + sequencerAddress: any, + forcedBlockHash: any +) { + const hashKeccak = ethers.solidityPackedKeccak256( + ["bytes32", "bytes32", "bytes32", "uint64", "address", "bytes32"], + [oldAccInputHash, batchHashData, globalExitRoot, timestamp, sequencerAddress, forcedBlockHash] + ); + + return hashKeccak; +} From 278e6a82b25819ed3fed491805f35aebe47da8d7 Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Mon, 22 Jan 2024 12:05:12 +0000 Subject: [PATCH 158/230] update veriified generated with v.4.0.0-rc.5-fork.7 --- contracts/verifiers/FflonkVerifier.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/verifiers/FflonkVerifier.sol b/contracts/verifiers/FflonkVerifier.sol index 10ee75667..adf4e8f0b 100644 --- a/contracts/verifiers/FflonkVerifier.sol +++ b/contracts/verifiers/FflonkVerifier.sol @@ -48,8 +48,8 @@ contract FflonkVerifier { uint256 constant w8_7 = 8613538655231327379234925296132678673308827349856085326283699237864372525723; // Verifier preprocessed input C_0(x)·[1]_1 - uint256 constant C0x = 13740223412188786024382620276207902995170246026576302003212539499946277391680; - uint256 constant C0y = 5215376971112980485769354596643131749394956291061945857226755788999033966865; + uint256 constant C0x = 1399458405278693375564157845951119219674216315698518301618391005223961674672; + uint256 constant C0y = 4753339552187781629812877887300152778714353139514388879046795575382068591682; // Verifier preprocessed input x·[1]_2 uint256 constant X2x1 = 21831381940315734285607113342023901060522397560371972897001948545212302161822; From 99d76cbb1d4a94f6900c7c181629029bc1f9fa52 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Thu, 25 Jan 2024 16:24:33 +0100 Subject: [PATCH 159/230] rebase changes --- compiled-contracts/FflonkVerifier.json | 4 +- compiled-contracts/PolygonDataComittee.json | 1102 - compiled-contracts/PolygonRollupManager.json | 136 +- .../PolygonRollupManagerMock.json | 2023 ++ .../PolygonRollupManagerMockInternalTest.json | 1972 ++ compiled-contracts/PolygonValidiumEtrog.json | 1268 + compiled-contracts/PolygonZkEVM.json | 4 +- compiled-contracts/PolygonZkEVMBridge.json | 4 +- .../PolygonZkEVMBridgeMock.json | 4 +- compiled-contracts/PolygonZkEVMBridgeV2.json | 93 +- compiled-contracts/PolygonZkEVMEtrog.json | 1142 + .../PolygonZkEVMExistentEtrog.json | 1219 + .../PolygonZkEVMGlobalExitRootV2.json | 129 +- compiled-contracts/PolygonZkEVMMock.json | 4 +- compiled-contracts/PolygonZkEVMTimelock.json | 4 +- compiled-contracts/TokenWrapped.json | 4 +- .../VerifierRollupHelperMock.json | 4 +- deployment/v2/verifyContracts.js | 27 +- docs/mainnetUpgraded/PolygonZkEVMUpgraded.md | 1 - docs/v2/PolygonRollupManager.md | 203 +- docs/v2/PolygonZkEVMBridgeV2.md | 78 +- docs/v2/PolygonZkEVMGlobalExitRootV2.md | 31 +- .../validium/PolygonDataCommittee.md | 93 + .../validium/PolygonValidiumEtrog.md | 110 + docs/v2/consensus/zkEVM/PolygonZkEVMEtrog.md | 28 + .../zkEVM/PolygonZkEVMExistentEtrog.md | 60 + .../interfaces/IDataAvailabilityProtocol.md | 22 + .../interfaces/IPolygonDataCommitteeErrors.md | 3 + docs/v2/interfaces/IPolygonValidium.md | 3 + docs/v2/interfaces/IPolygonZkEVMBridgeV2.md | 72 + .../IPolygonZkEVMGlobalExitRootV2.md | 22 + .../interfaces/IPolygonZkEVMVEtrogErrors.md | 3 + docs/v2/lib/DepositContractBase.md | 2 +- docs/v2/lib/DepositContractV2.md | 4 +- docs/v2/lib/PolygonConstantsBase.md | 3 + docs/v2/lib/PolygonRollupBaseEtrog.md | 319 + docs/v2/lib/PolygonTransparentProxy.md | 1 - .../PolygonZkEVMGlobalExitRootBaseStorage.md | 4 + .../v2/mocks/PolygonRollupManagerEmptyMock.md | 67 + docs/v2/mocks/PolygonRollupManagerMock.md | 4 +- .../PolygonRollupManagerMockInternalTest.md | 30 + package-lock.json | 21517 +--------------- 42 files changed, 9032 insertions(+), 22791 deletions(-) delete mode 100644 compiled-contracts/PolygonDataComittee.json create mode 100644 compiled-contracts/PolygonRollupManagerMock.json create mode 100644 compiled-contracts/PolygonRollupManagerMockInternalTest.json create mode 100644 compiled-contracts/PolygonValidiumEtrog.json create mode 100644 compiled-contracts/PolygonZkEVMEtrog.json create mode 100644 compiled-contracts/PolygonZkEVMExistentEtrog.json create mode 100644 docs/v2/consensus/validium/PolygonDataCommittee.md create mode 100644 docs/v2/consensus/validium/PolygonValidiumEtrog.md create mode 100644 docs/v2/consensus/zkEVM/PolygonZkEVMEtrog.md create mode 100644 docs/v2/consensus/zkEVM/PolygonZkEVMExistentEtrog.md create mode 100644 docs/v2/interfaces/IDataAvailabilityProtocol.md create mode 100644 docs/v2/interfaces/IPolygonDataCommitteeErrors.md create mode 100644 docs/v2/interfaces/IPolygonValidium.md create mode 100644 docs/v2/interfaces/IPolygonZkEVMGlobalExitRootV2.md create mode 100644 docs/v2/interfaces/IPolygonZkEVMVEtrogErrors.md create mode 100644 docs/v2/lib/PolygonConstantsBase.md create mode 100644 docs/v2/lib/PolygonRollupBaseEtrog.md create mode 100644 docs/v2/lib/PolygonZkEVMGlobalExitRootBaseStorage.md create mode 100644 docs/v2/mocks/PolygonRollupManagerEmptyMock.md create mode 100644 docs/v2/mocks/PolygonRollupManagerMockInternalTest.md diff --git a/compiled-contracts/FflonkVerifier.json b/compiled-contracts/FflonkVerifier.json index c5d80d4ff..4c60d0a0b 100644 --- a/compiled-contracts/FflonkVerifier.json +++ b/compiled-contracts/FflonkVerifier.json @@ -28,8 +28,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561000f575f80fd5b506159c7806200001e5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c80639121da8a1461002d575b5f80fd5b61004061003b366004615950565b610054565b604051901515815260200160405180910390f35b5f6158e0565b6040516104c08201518082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610500840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610520840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610620840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760840151820990508082526102e4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830960011461050e575f805260205ff35b8091506020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161076085015183099150806107608501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001850151830991508060a06106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001850151830991508060806106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001850151830991508060606106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001850151830991508060406106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001850151830991508060206106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a085015183099150806106a08501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106200185015183099150806060610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106200185015183099150806040610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106200185015183099150806020610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161062085015183099150806106208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001850151830991508060e0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001850151830991508060c0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001850151830991508060a0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806105200185015183099150806080610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606105200185015183099150806060610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406105200185015183099150806040610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206105200185015183099150806020610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161052085015183099150806105208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161050085015183099150806105008501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e085015183099150806104e085015250806104c0840152505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110610d72575f805260205ff35b50565b803560208201357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760037f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478085860985090891507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478182099050808214610dfe575f805260205ff35b505050565b610e0d6004610d75565b610e176044610d75565b610e216084610d75565b610e2b60c4610d75565b610e3761010435610d43565b610e4361012435610d43565b610e4f61014435610d43565b610e5b61016435610d43565b610e6761018435610d43565b610e736101a435610d43565b610e7f6101c435610d43565b610e8b6101e435610d43565b610e9761020435610d43565b610ea361022435610d43565b610eaf61024435610d43565b610ebb61026435610d43565b610ec761028435610d43565b610ed36102a435610d43565b610edf6102c435610d43565b610eeb6102e435610d43565b565b7f10711a639fed66ba6cd6001188b8fe7285cb9bd01afc1f90598223550aa57e3661078082019081527f28c937a4cb758326763015d30fff3568f5cbed932cdc7c411a435d3de04549ef6107a0830190815283356107c084019081526004356107e085015260243561080085015260a083207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908190066020808701918252902081900660408601819052845260443590925260643590526060909120819006608083018190529081800960a0830181905260808301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001910960e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8060e0840151096101008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f70363660e0840151096101208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f1d59376149b959ccbd157ac850893a6f07c2d99b3852513ab8d01be8e846a56660e0840151096101408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000060e0840151096101608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0530d09118705106cbb4a786ead16926d5d174e181a26686af5448492e42a18160e0840151096101808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb60e0840151096101a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f130b17119778465cfb3acaee30f81dee20710ead41671f568b11d9ab07b95a9b60e0840151096101c083015260e08201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019080096101e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f7036366101e0840151096102008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006101e0840151096102208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb6101e0840151096102408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a08301516101e0840151096102608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f23610260840151096102808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd610260840151096102a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f283ce45a2e5b8e4e78f9fbaf5f6a348bfcfaf76dd28e5ca7121b74ef68fdec2e610260840151096102c08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f236102c0840151096102e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd6102c0840151096103008301526102608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081818009098060c08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018182097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000909101066104a084018190526104c0840152506107808201526101e06101046107a083013761020061078082019081207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081900680845282526084356107a084015260a4356107c08401526060918290200691015250565b60e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018160080960e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105208601526101c08501516101008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105408601526101a08501516101208601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105608601526101808501516101408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961058086015261016085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105a08601526101408501516101808601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105c08601526101208501516101a08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105e08601526101008501516101c08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830960e0610520018601525050505050565b6101e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001816004096101e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106208601526102408501516102008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961064086015261022085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106608601526102008501516102408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096060610620018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c0870151097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030660c0850151087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610260850151600309096102608301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181810381900684087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106a08601526102a08501516102808601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106c08601526102808501516102a08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960406106a0018601527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c08801517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103067f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08a015109087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c0880151600309096102c086015190935091507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001828103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107008601526103008501516102e08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107208601526102e08501516103008601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960a06106a0018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806101e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806104e08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102608501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102e08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016103008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806105008401526127f583611944565b6127fe83611d8c565b61280783611fa2565b505060c081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000083018190066301000000096107608401525050610d728161005a565b6104a08101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181610760840151096107608301525050565b5f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185356107608601510983030106905080610320830152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820860e08301519091505f9081807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000015f61052001890151880984098508935061010086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001890151880984098508935061012086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001890151880984098508935061014086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001890151880984098508935061016086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001890151880984098508935061018086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06105200189015188098409850893506101a086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c06105200189015188098409850893506101c086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e4350983089150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e0610520018801518709830984089250505080610340840152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820890505f6102043561022435610244357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183610104350993507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180836101243509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018486096101443509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161018435850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610320870151850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c087015185096101e08701519094505f908490827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160205f02610620018d01518c098509850893508692506102008a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600102610620018d01518c098509850893508692506102208a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600202610620018d01518c098509850893508692506102408a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001858509098408925050507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600302610620018b01518a09830983089150508061036088015250505050505050565b606081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309905060017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08901510908820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830860c08501519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190817f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b82090990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183089150505f91505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c085015160208601510960408501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828408610204350892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028709086102243508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160038709086102443508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161026435840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a43560208b01510908610204350894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c43560208c015109086102243508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101e43560208c015109086102443508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161028435860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151840992506001610264350394507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760870151860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151860961026087015190955091505f9050807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160205f026106a0018a0151880983098308915061028087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206001026106a0018a015188098309830891506102a087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206002026106a0018a015188098309830891506102c087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206003026106a0018a015188098309830891506102e087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206004026106a0018a0151880983098308915061030087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206005026106a0018a015188098309830891505080610380870152505050505050565b6040518151815260208201516020820152825160408201526020830151606082015260408260808360066107d05a03fa905080610dfe575f805260205ff35b5f604051833581526020840135602082015284604082015260408160608360076107d05a03fa915081615135575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa91505080615164575f805260205ff35b50505050565b5f60405183815284602082015285604082015260408160608360076107d05a03fa91508161519a575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa915050806151c9575f805260205ff35b5050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101608601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806104e0850151830984510991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180610500850151830984517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908009097f10711a639fed66ba6cd6001188b8fe7285cb9bd01afc1f90598223550aa57e366103a08501527f28c937a4cb758326763015d30fff3568f5cbed932cdc7c411a435d3de04549ef60206103a0018501526156208360046103a08701615100565b6156308160446103a08701615100565b6156bd7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161038088015185097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161036089015188090861034087015108600260016103e0880161516a565b50610dfe8160846104208601615100565b604051610400820180517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd479081038190069091526104408301805182039190910690525f906157256103e084016103a085016150c1565b61573761042084016103a085016150c1565b61574b606084015160c46103a08601615100565b6103a083015181526103c08301516020808301919091527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a083015260c43560c08301527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760e43581030660e08301527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6101008301527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6101208301527f1970ea81dd6992adfbc571effb03503adbbb6a857f578403c6c40e22d65b3c026101408301527f054793348f12c0cf5622c340573cb277586319de359ab9389778f689786b1e48610160830152816101808160086107d05a03fa90511692915050565b60405161078081016040526158f3610e03565b6158fd8382610eed565b615906816123ad565b61590f8161286e565b61591983826128a7565b61592281612906565b61592b81613e54565b61593481614549565b61593d816151d0565b615946816156ce565b9050805f5260205ff35b5f80610320808486031215615963575f80fd5b610300840185811115615974575f80fd5b849350858286011115615985575f80fd5b8092505050925092905056fea264697066735822122017ac3ee20924e49739418f6e80f40f856905b27907c6cdc4c03762dcf926582d64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610029575f3560e01c80639121da8a1461002d575b5f80fd5b61004061003b366004615950565b610054565b604051901515815260200160405180910390f35b5f6158e0565b6040516104c08201518082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610500840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610520840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610620840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760840151820990508082526102e4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830960011461050e575f805260205ff35b8091506020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161076085015183099150806107608501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001850151830991508060a06106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001850151830991508060806106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001850151830991508060606106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001850151830991508060406106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001850151830991508060206106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a085015183099150806106a08501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106200185015183099150806060610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106200185015183099150806040610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106200185015183099150806020610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161062085015183099150806106208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001850151830991508060e0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001850151830991508060c0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001850151830991508060a0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806105200185015183099150806080610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606105200185015183099150806060610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406105200185015183099150806040610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206105200185015183099150806020610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161052085015183099150806105208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161050085015183099150806105008501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e085015183099150806104e085015250806104c0840152505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110610d72575f805260205ff35b50565b803560208201357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760037f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478085860985090891507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478182099050808214610dfe575f805260205ff35b505050565b610e0d6004610d75565b610e176044610d75565b610e216084610d75565b610e2b60c4610d75565b610e3761010435610d43565b610e4361012435610d43565b610e4f61014435610d43565b610e5b61016435610d43565b610e6761018435610d43565b610e736101a435610d43565b610e7f6101c435610d43565b610e8b6101e435610d43565b610e9761020435610d43565b610ea361022435610d43565b610eaf61024435610d43565b610ebb61026435610d43565b610ec761028435610d43565b610ed36102a435610d43565b610edf6102c435610d43565b610eeb6102e435610d43565b565b7f10711a639fed66ba6cd6001188b8fe7285cb9bd01afc1f90598223550aa57e3661078082019081527f28c937a4cb758326763015d30fff3568f5cbed932cdc7c411a435d3de04549ef6107a0830190815283356107c084019081526004356107e085015260243561080085015260a083207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908190066020808701918252902081900660408601819052845260443590925260643590526060909120819006608083018190529081800960a0830181905260808301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001910960e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8060e0840151096101008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f70363660e0840151096101208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f1d59376149b959ccbd157ac850893a6f07c2d99b3852513ab8d01be8e846a56660e0840151096101408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000060e0840151096101608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0530d09118705106cbb4a786ead16926d5d174e181a26686af5448492e42a18160e0840151096101808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb60e0840151096101a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f130b17119778465cfb3acaee30f81dee20710ead41671f568b11d9ab07b95a9b60e0840151096101c083015260e08201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019080096101e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f7036366101e0840151096102008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006101e0840151096102208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb6101e0840151096102408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a08301516101e0840151096102608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f23610260840151096102808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd610260840151096102a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f283ce45a2e5b8e4e78f9fbaf5f6a348bfcfaf76dd28e5ca7121b74ef68fdec2e610260840151096102c08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f236102c0840151096102e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd6102c0840151096103008301526102608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081818009098060c08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018182097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000909101066104a084018190526104c0840152506107808201526101e06101046107a083013761020061078082019081207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081900680845282526084356107a084015260a4356107c08401526060918290200691015250565b60e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018160080960e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105208601526101c08501516101008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105408601526101a08501516101208601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105608601526101808501516101408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961058086015261016085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105a08601526101408501516101808601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105c08601526101208501516101a08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105e08601526101008501516101c08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830960e0610520018601525050505050565b6101e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001816004096101e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106208601526102408501516102008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961064086015261022085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106608601526102008501516102408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096060610620018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c0870151097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030660c0850151087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610260850151600309096102608301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181810381900684087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106a08601526102a08501516102808601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106c08601526102808501516102a08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960406106a0018601527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c08801517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103067f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08a015109087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c0880151600309096102c086015190935091507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001828103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107008601526103008501516102e08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107208601526102e08501516103008601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960a06106a0018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806101e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806104e08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102608501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102e08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016103008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806105008401526127f583611944565b6127fe83611d8c565b61280783611fa2565b505060c081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000083018190066301000000096107608401525050610d728161005a565b6104a08101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181610760840151096107608301525050565b5f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185356107608601510983030106905080610320830152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820860e08301519091505f9081807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000015f61052001890151880984098508935061010086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001890151880984098508935061012086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001890151880984098508935061014086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001890151880984098508935061016086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001890151880984098508935061018086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06105200189015188098409850893506101a086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c06105200189015188098409850893506101c086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e4350983089150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e0610520018801518709830984089250505080610340840152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820890505f6102043561022435610244357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183610104350993507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180836101243509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018486096101443509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161018435850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610320870151850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c087015185096101e08701519094505f908490827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160205f02610620018d01518c098509850893508692506102008a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600102610620018d01518c098509850893508692506102208a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600202610620018d01518c098509850893508692506102408a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001858509098408925050507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600302610620018b01518a09830983089150508061036088015250505050505050565b606081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309905060017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08901510908820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830860c08501519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190817f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b82090990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183089150505f91505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c085015160208601510960408501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828408610204350892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028709086102243508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160038709086102443508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161026435840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a43560208b01510908610204350894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c43560208c015109086102243508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101e43560208c015109086102443508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161028435860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151840992506001610264350394507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760870151860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151860961026087015190955091505f9050807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160205f026106a0018a0151880983098308915061028087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206001026106a0018a015188098309830891506102a087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206002026106a0018a015188098309830891506102c087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206003026106a0018a015188098309830891506102e087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206004026106a0018a0151880983098308915061030087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206005026106a0018a015188098309830891505080610380870152505050505050565b6040518151815260208201516020820152825160408201526020830151606082015260408260808360066107d05a03fa905080610dfe575f805260205ff35b5f604051833581526020840135602082015284604082015260408160608360076107d05a03fa915081615135575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa91505080615164575f805260205ff35b50505050565b5f60405183815284602082015285604082015260408160608360076107d05a03fa91508161519a575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa915050806151c9575f805260205ff35b5050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101608601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806104e0850151830984510991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180610500850151830984517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908009097f10711a639fed66ba6cd6001188b8fe7285cb9bd01afc1f90598223550aa57e366103a08501527f28c937a4cb758326763015d30fff3568f5cbed932cdc7c411a435d3de04549ef60206103a0018501526156208360046103a08701615100565b6156308160446103a08701615100565b6156bd7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161038088015185097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161036089015188090861034087015108600260016103e0880161516a565b50610dfe8160846104208601615100565b604051610400820180517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd479081038190069091526104408301805182039190910690525f906157256103e084016103a085016150c1565b61573761042084016103a085016150c1565b61574b606084015160c46103a08601615100565b6103a083015181526103c08301516020808301919091527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a083015260c43560c08301527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760e43581030660e08301527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6101008301527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6101208301527f1970ea81dd6992adfbc571effb03503adbbb6a857f578403c6c40e22d65b3c026101408301527f054793348f12c0cf5622c340573cb277586319de359ab9389778f689786b1e48610160830152816101808160086107d05a03fa90511692915050565b60405161078081016040526158f3610e03565b6158fd8382610eed565b615906816123ad565b61590f8161286e565b61591983826128a7565b61592281612906565b61592b81613e54565b61593481614549565b61593d816151d0565b615946816156ce565b9050805f5260205ff35b5f80610320808486031215615963575f80fd5b610300840185811115615974575f80fd5b849350858286011115615985575f80fd5b8092505050925092905056fea264697066735822122017ac3ee20924e49739418f6e80f40f856905b27907c6cdc4c03762dcf926582d64736f6c63430008140033", + "bytecode": "0x608060405234801561000f575f80fd5b506159c7806200001e5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c80639121da8a1461002d575b5f80fd5b61004061003b366004615950565b610054565b604051901515815260200160405180910390f35b5f6158e0565b6040516104c08201518082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610500840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610520840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610620840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760840151820990508082526102e4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830960011461050e575f805260205ff35b8091506020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161076085015183099150806107608501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001850151830991508060a06106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001850151830991508060806106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001850151830991508060606106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001850151830991508060406106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001850151830991508060206106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a085015183099150806106a08501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106200185015183099150806060610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106200185015183099150806040610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106200185015183099150806020610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161062085015183099150806106208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001850151830991508060e0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001850151830991508060c0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001850151830991508060a0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806105200185015183099150806080610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606105200185015183099150806060610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406105200185015183099150806040610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206105200185015183099150806020610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161052085015183099150806105208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161050085015183099150806105008501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e085015183099150806104e085015250806104c0840152505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110610d72575f805260205ff35b50565b803560208201357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760037f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478085860985090891507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478182099050808214610dfe575f805260205ff35b505050565b610e0d6004610d75565b610e176044610d75565b610e216084610d75565b610e2b60c4610d75565b610e3761010435610d43565b610e4361012435610d43565b610e4f61014435610d43565b610e5b61016435610d43565b610e6761018435610d43565b610e736101a435610d43565b610e7f6101c435610d43565b610e8b6101e435610d43565b610e9761020435610d43565b610ea361022435610d43565b610eaf61024435610d43565b610ebb61026435610d43565b610ec761028435610d43565b610ed36102a435610d43565b610edf6102c435610d43565b610eeb6102e435610d43565b565b7f031810bd3eb261d4f6f6035149756b217c40015a62d6eb86f08582b7e716c3b061078082019081527f0a824b7b08660c47778038b58f59e2a309342e15891c84720ee71f5457967c426107a0830190815283356107c084019081526004356107e085015260243561080085015260a083207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908190066020808701918252902081900660408601819052845260443590925260643590526060909120819006608083018190529081800960a0830181905260808301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001910960e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8060e0840151096101008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f70363660e0840151096101208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f1d59376149b959ccbd157ac850893a6f07c2d99b3852513ab8d01be8e846a56660e0840151096101408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000060e0840151096101608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0530d09118705106cbb4a786ead16926d5d174e181a26686af5448492e42a18160e0840151096101808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb60e0840151096101a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f130b17119778465cfb3acaee30f81dee20710ead41671f568b11d9ab07b95a9b60e0840151096101c083015260e08201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019080096101e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f7036366101e0840151096102008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006101e0840151096102208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb6101e0840151096102408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a08301516101e0840151096102608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f23610260840151096102808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd610260840151096102a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f283ce45a2e5b8e4e78f9fbaf5f6a348bfcfaf76dd28e5ca7121b74ef68fdec2e610260840151096102c08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f236102c0840151096102e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd6102c0840151096103008301526102608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081818009098060c08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018182097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000909101066104a084018190526104c0840152506107808201526101e06101046107a083013761020061078082019081207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081900680845282526084356107a084015260a4356107c08401526060918290200691015250565b60e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018160080960e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105208601526101c08501516101008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105408601526101a08501516101208601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105608601526101808501516101408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961058086015261016085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105a08601526101408501516101808601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105c08601526101208501516101a08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105e08601526101008501516101c08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830960e0610520018601525050505050565b6101e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001816004096101e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106208601526102408501516102008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961064086015261022085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106608601526102008501516102408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096060610620018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c0870151097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030660c0850151087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610260850151600309096102608301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181810381900684087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106a08601526102a08501516102808601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106c08601526102808501516102a08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960406106a0018601527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c08801517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103067f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08a015109087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c0880151600309096102c086015190935091507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001828103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107008601526103008501516102e08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107208601526102e08501516103008601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960a06106a0018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806101e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806104e08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102608501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102e08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016103008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806105008401526127f583611944565b6127fe83611d8c565b61280783611fa2565b505060c081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000083018190066301000000096107608401525050610d728161005a565b6104a08101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181610760840151096107608301525050565b5f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185356107608601510983030106905080610320830152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820860e08301519091505f9081807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000015f61052001890151880984098508935061010086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001890151880984098508935061012086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001890151880984098508935061014086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001890151880984098508935061016086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001890151880984098508935061018086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06105200189015188098409850893506101a086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c06105200189015188098409850893506101c086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e4350983089150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e0610520018801518709830984089250505080610340840152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820890505f6102043561022435610244357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183610104350993507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180836101243509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018486096101443509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161018435850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610320870151850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c087015185096101e08701519094505f908490827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160205f02610620018d01518c098509850893508692506102008a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600102610620018d01518c098509850893508692506102208a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600202610620018d01518c098509850893508692506102408a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001858509098408925050507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600302610620018b01518a09830983089150508061036088015250505050505050565b606081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309905060017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08901510908820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830860c08501519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190817f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b82090990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183089150505f91505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c085015160208601510960408501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828408610204350892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028709086102243508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160038709086102443508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161026435840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a43560208b01510908610204350894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c43560208c015109086102243508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101e43560208c015109086102443508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161028435860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151840992506001610264350394507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760870151860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151860961026087015190955091505f9050807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160205f026106a0018a0151880983098308915061028087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206001026106a0018a015188098309830891506102a087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206002026106a0018a015188098309830891506102c087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206003026106a0018a015188098309830891506102e087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206004026106a0018a0151880983098308915061030087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206005026106a0018a015188098309830891505080610380870152505050505050565b6040518151815260208201516020820152825160408201526020830151606082015260408260808360066107d05a03fa905080610dfe575f805260205ff35b5f604051833581526020840135602082015284604082015260408160608360076107d05a03fa915081615135575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa91505080615164575f805260205ff35b50505050565b5f60405183815284602082015285604082015260408160608360076107d05a03fa91508161519a575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa915050806151c9575f805260205ff35b5050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101608601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806104e0850151830984510991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180610500850151830984517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908009097f031810bd3eb261d4f6f6035149756b217c40015a62d6eb86f08582b7e716c3b06103a08501527f0a824b7b08660c47778038b58f59e2a309342e15891c84720ee71f5457967c4260206103a0018501526156208360046103a08701615100565b6156308160446103a08701615100565b6156bd7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161038088015185097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161036089015188090861034087015108600260016103e0880161516a565b50610dfe8160846104208601615100565b604051610400820180517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd479081038190069091526104408301805182039190910690525f906157256103e084016103a085016150c1565b61573761042084016103a085016150c1565b61574b606084015160c46103a08601615100565b6103a083015181526103c08301516020808301919091527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a083015260c43560c08301527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760e43581030660e08301527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6101008301527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6101208301527f1970ea81dd6992adfbc571effb03503adbbb6a857f578403c6c40e22d65b3c026101408301527f054793348f12c0cf5622c340573cb277586319de359ab9389778f689786b1e48610160830152816101808160086107d05a03fa90511692915050565b60405161078081016040526158f3610e03565b6158fd8382610eed565b615906816123ad565b61590f8161286e565b61591983826128a7565b61592281612906565b61592b81613e54565b61593481614549565b61593d816151d0565b615946816156ce565b9050805f5260205ff35b5f80610320808486031215615963575f80fd5b610300840185811115615974575f80fd5b849350858286011115615985575f80fd5b8092505050925092905056fea2646970667358221220ccf65fc4f412136c82261f86257c31a8caaf9a4a600b042f37f16303266cc8d864736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610029575f3560e01c80639121da8a1461002d575b5f80fd5b61004061003b366004615950565b610054565b604051901515815260200160405180910390f35b5f6158e0565b6040516104c08201518082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610500840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610520840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610620840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760840151820990508082526102e4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830960011461050e575f805260205ff35b8091506020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161076085015183099150806107608501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001850151830991508060a06106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001850151830991508060806106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001850151830991508060606106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001850151830991508060406106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001850151830991508060206106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a085015183099150806106a08501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106200185015183099150806060610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106200185015183099150806040610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106200185015183099150806020610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161062085015183099150806106208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001850151830991508060e0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001850151830991508060c0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001850151830991508060a0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806105200185015183099150806080610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606105200185015183099150806060610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406105200185015183099150806040610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206105200185015183099150806020610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161052085015183099150806105208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161050085015183099150806105008501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e085015183099150806104e085015250806104c0840152505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110610d72575f805260205ff35b50565b803560208201357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760037f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478085860985090891507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478182099050808214610dfe575f805260205ff35b505050565b610e0d6004610d75565b610e176044610d75565b610e216084610d75565b610e2b60c4610d75565b610e3761010435610d43565b610e4361012435610d43565b610e4f61014435610d43565b610e5b61016435610d43565b610e6761018435610d43565b610e736101a435610d43565b610e7f6101c435610d43565b610e8b6101e435610d43565b610e9761020435610d43565b610ea361022435610d43565b610eaf61024435610d43565b610ebb61026435610d43565b610ec761028435610d43565b610ed36102a435610d43565b610edf6102c435610d43565b610eeb6102e435610d43565b565b7f031810bd3eb261d4f6f6035149756b217c40015a62d6eb86f08582b7e716c3b061078082019081527f0a824b7b08660c47778038b58f59e2a309342e15891c84720ee71f5457967c426107a0830190815283356107c084019081526004356107e085015260243561080085015260a083207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908190066020808701918252902081900660408601819052845260443590925260643590526060909120819006608083018190529081800960a0830181905260808301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001910960e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8060e0840151096101008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f70363660e0840151096101208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f1d59376149b959ccbd157ac850893a6f07c2d99b3852513ab8d01be8e846a56660e0840151096101408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000060e0840151096101608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0530d09118705106cbb4a786ead16926d5d174e181a26686af5448492e42a18160e0840151096101808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb60e0840151096101a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f130b17119778465cfb3acaee30f81dee20710ead41671f568b11d9ab07b95a9b60e0840151096101c083015260e08201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019080096101e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f7036366101e0840151096102008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006101e0840151096102208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb6101e0840151096102408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a08301516101e0840151096102608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f23610260840151096102808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd610260840151096102a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f283ce45a2e5b8e4e78f9fbaf5f6a348bfcfaf76dd28e5ca7121b74ef68fdec2e610260840151096102c08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f236102c0840151096102e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd6102c0840151096103008301526102608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081818009098060c08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018182097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000909101066104a084018190526104c0840152506107808201526101e06101046107a083013761020061078082019081207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081900680845282526084356107a084015260a4356107c08401526060918290200691015250565b60e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018160080960e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105208601526101c08501516101008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105408601526101a08501516101208601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105608601526101808501516101408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961058086015261016085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105a08601526101408501516101808601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105c08601526101208501516101a08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105e08601526101008501516101c08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830960e0610520018601525050505050565b6101e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001816004096101e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106208601526102408501516102008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961064086015261022085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106608601526102008501516102408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096060610620018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c0870151097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030660c0850151087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610260850151600309096102608301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181810381900684087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106a08601526102a08501516102808601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106c08601526102808501516102a08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960406106a0018601527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c08801517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103067f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08a015109087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c0880151600309096102c086015190935091507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001828103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107008601526103008501516102e08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107208601526102e08501516103008601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960a06106a0018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806101e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806104e08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102608501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102e08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016103008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806105008401526127f583611944565b6127fe83611d8c565b61280783611fa2565b505060c081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000083018190066301000000096107608401525050610d728161005a565b6104a08101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181610760840151096107608301525050565b5f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185356107608601510983030106905080610320830152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820860e08301519091505f9081807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000015f61052001890151880984098508935061010086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001890151880984098508935061012086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001890151880984098508935061014086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001890151880984098508935061016086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001890151880984098508935061018086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06105200189015188098409850893506101a086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c06105200189015188098409850893506101c086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e4350983089150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e0610520018801518709830984089250505080610340840152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820890505f6102043561022435610244357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183610104350993507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180836101243509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018486096101443509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161018435850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610320870151850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c087015185096101e08701519094505f908490827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160205f02610620018d01518c098509850893508692506102008a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600102610620018d01518c098509850893508692506102208a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600202610620018d01518c098509850893508692506102408a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001858509098408925050507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600302610620018b01518a09830983089150508061036088015250505050505050565b606081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309905060017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08901510908820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830860c08501519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190817f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b82090990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183089150505f91505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c085015160208601510960408501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828408610204350892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028709086102243508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160038709086102443508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161026435840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a43560208b01510908610204350894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c43560208c015109086102243508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101e43560208c015109086102443508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161028435860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151840992506001610264350394507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760870151860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151860961026087015190955091505f9050807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160205f026106a0018a0151880983098308915061028087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206001026106a0018a015188098309830891506102a087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206002026106a0018a015188098309830891506102c087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206003026106a0018a015188098309830891506102e087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206004026106a0018a0151880983098308915061030087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206005026106a0018a015188098309830891505080610380870152505050505050565b6040518151815260208201516020820152825160408201526020830151606082015260408260808360066107d05a03fa905080610dfe575f805260205ff35b5f604051833581526020840135602082015284604082015260408160608360076107d05a03fa915081615135575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa91505080615164575f805260205ff35b50505050565b5f60405183815284602082015285604082015260408160608360076107d05a03fa91508161519a575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa915050806151c9575f805260205ff35b5050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101608601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806104e0850151830984510991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180610500850151830984517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908009097f031810bd3eb261d4f6f6035149756b217c40015a62d6eb86f08582b7e716c3b06103a08501527f0a824b7b08660c47778038b58f59e2a309342e15891c84720ee71f5457967c4260206103a0018501526156208360046103a08701615100565b6156308160446103a08701615100565b6156bd7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161038088015185097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161036089015188090861034087015108600260016103e0880161516a565b50610dfe8160846104208601615100565b604051610400820180517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd479081038190069091526104408301805182039190910690525f906157256103e084016103a085016150c1565b61573761042084016103a085016150c1565b61574b606084015160c46103a08601615100565b6103a083015181526103c08301516020808301919091527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a083015260c43560c08301527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760e43581030660e08301527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6101008301527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6101208301527f1970ea81dd6992adfbc571effb03503adbbb6a857f578403c6c40e22d65b3c026101408301527f054793348f12c0cf5622c340573cb277586319de359ab9389778f689786b1e48610160830152816101808160086107d05a03fa90511692915050565b60405161078081016040526158f3610e03565b6158fd8382610eed565b615906816123ad565b61590f8161286e565b61591983826128a7565b61592281612906565b61592b81613e54565b61593481614549565b61593d816151d0565b615946816156ce565b9050805f5260205ff35b5f80610320808486031215615963575f80fd5b610300840185811115615974575f80fd5b849350858286011115615985575f80fd5b8092505050925092905056fea2646970667358221220ccf65fc4f412136c82261f86257c31a8caaf9a4a600b042f37f16303266cc8d864736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonDataComittee.json b/compiled-contracts/PolygonDataComittee.json deleted file mode 100644 index a78aed2ea..000000000 --- a/compiled-contracts/PolygonDataComittee.json +++ /dev/null @@ -1,1102 +0,0 @@ -{ - "_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 index 59a7d86de..d53712bef 100644 --- a/compiled-contracts/PolygonRollupManager.json +++ b/compiled-contracts/PolygonRollupManager.json @@ -6,7 +6,7 @@ { "inputs": [ { - "internalType": "contract IPolygonZkEVMGlobalExitRoot", + "internalType": "contract IPolygonZkEVMGlobalExitRootV2", "name": "_globalExitRootManager", "type": "address" }, @@ -39,36 +39,16 @@ "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", @@ -89,16 +69,6 @@ "name": "FinalPendingStateNumInvalid", "type": "error" }, - { - "inputs": [], - "name": "ForceBatchNotAllowed", - "type": "error" - }, - { - "inputs": [], - "name": "ForceBatchesAlreadyActive", - "type": "error" - }, { "inputs": [], "name": "HaltTimeoutNotExpired", @@ -129,11 +99,6 @@ "name": "InvalidRangeBatchTimeTarget", "type": "error" }, - { - "inputs": [], - "name": "InvalidRangeForceBatchTimeout", - "type": "error" - }, { "inputs": [], "name": "InvalidRangeMultiplierBatchFee", @@ -154,11 +119,6 @@ "name": "NewPendingStateTimeoutMustBeLower", "type": "error" }, - { - "inputs": [], - "name": "NewSequencedBatchMustBeBigger", - "type": "error" - }, { "inputs": [], "name": "NewStateRootNotInsidePrime", @@ -169,11 +129,6 @@ "name": "NewTrustedAggregatorTimeoutMustBeLower", "type": "error" }, - { - "inputs": [], - "name": "NotSupportedCurrently", - "type": "error" - }, { "inputs": [], "name": "OldAccInputHashDoesNotExist", @@ -194,16 +149,6 @@ "name": "OnlyNotEmergencyState", "type": "error" }, - { - "inputs": [], - "name": "OnlyPendingGovernance", - "type": "error" - }, - { - "inputs": [], - "name": "OnlyTrustedAggregator", - "type": "error" - }, { "inputs": [], "name": "PendingStateDoesNotExist", @@ -221,7 +166,7 @@ }, { "inputs": [], - "name": "PendingStateTimeoutExceedHaltAggregationTimeout", + "name": "RollupAddressAlreadyExist", "type": "error" }, { @@ -249,11 +194,6 @@ "name": "StoredRootMustBeDifferentThanNewRoot", "type": "error" }, - { - "inputs": [], - "name": "TrustedAggregatorTimeoutExceedHaltAggregationTimeout", - "type": "error" - }, { "inputs": [], "name": "TrustedAggregatorTimeoutNotExpired", @@ -269,26 +209,6 @@ "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": [ @@ -321,6 +241,12 @@ "internalType": "uint8", "name": "rollupCompatibilityID", "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "lastVerifiedBatchBeforeUpgrade", + "type": "uint64" } ], "name": "AddExistingRollup", @@ -444,12 +370,6 @@ "internalType": "address", "name": "gasTokenAddress", "type": "address" - }, - { - "indexed": false, - "internalType": "uint32", - "name": "gasTokenNetwork", - "type": "uint32" } ], "name": "CreateNewRollup", @@ -1006,11 +926,6 @@ "name": "gasTokenAddress", "type": "address" }, - { - "internalType": "uint32", - "name": "gasTokenNetwork", - "type": "uint32" - }, { "internalType": "string", "name": "sequencerURL", @@ -1271,7 +1186,7 @@ "name": "globalExitRootManager", "outputs": [ { - "internalType": "contract IPolygonZkEVMGlobalExitRoot", + "internalType": "contract IPolygonZkEVMGlobalExitRootV2", "name": "", "type": "address" } @@ -1354,7 +1269,7 @@ "type": "address" }, { - "internalType": "contract PolygonZkEVMV2Existent", + "internalType": "contract PolygonZkEVMExistentEtrog", "name": "polygonZkEVM", "type": "address" }, @@ -1362,6 +1277,16 @@ "internalType": "contract IVerifierRollup", "name": "zkEVMVerifier", "type": "address" + }, + { + "internalType": "uint64", + "name": "zkEVMForkID", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "zkEVMChainID", + "type": "uint64" } ], "name": "initialize", @@ -1419,6 +1344,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "lastDeactivatedEmergencyStateTimestamp", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "multiplierBatchFee", @@ -1749,9 +1687,9 @@ { "inputs": [ { - "internalType": "uint64", + "internalType": "uint32", "name": "rollupTypeID", - "type": "uint64" + "type": "uint32" } ], "name": "rollupTypeMap", @@ -2027,8 +1965,8 @@ "type": "function" } ], - "bytecode": "0x60e060405234801562000010575f80fd5b5060405162005b7b38038062005b7b833981016040819052620000339162000069565b6001600160a01b0392831660805290821660c0521660a052620000ba565b6001600160a01b038116811462000066575f80fd5b50565b5f805f606084860312156200007c575f80fd5b8351620000898162000051565b60208501519093506200009c8162000051565b6040850151909250620000af8162000051565b809150509250925092565b60805160a05160c051615a5e6200011d5f395f81816109fc01528181611c44015261366301525f81816106f2015281816127a8015261391a01525f818161093f01528181610c4d01528181610df501528181611992015261380f0152615a5e5ff3fe608060405234801562000010575f80fd5b506004361062000300575f3560e01c806391d148541162000197578063ceee281d11620000e7578063dde0ff77116200009b578063dde0ff7714620009ad578063e0bfd3d214620009c8578063e136edf714620009df578063e46761c414620009f6578063f34eb8eb1462000a1e578063f4e926751462000a35578063f9c4c2ae1462000a46575f80fd5b8063ceee281d1462000911578063d02103ca1462000939578063d5073f6f1462000961578063d547741f1462000978578063d939b315146200098f578063dbc1697614620009a3575f80fd5b8063a2967d99116200014b578063a2967d9914620006e2578063a3c573eb14620006ec578063a4810bb2146200072d578063afd23cbe14620007db578063b99d0ad71462000805578063c1acbc3414620008df578063c4c928c214620008fa575f80fd5b806391d14854146200067457806399f5634e146200068b5780639a908e7314620006955780639c9f3dfe14620006ac578063a066215c14620006c3578063a217fddf14620006da575f80fd5b80632f2ff15d11620002535780636046916911620002075780636046916914620005bc5780637222020f14620005c65780637975fcfe14620005dd5780637fb6e76a1462000603578063841b24d7146200062b57806387c20c0114620006465780638bd4f071146200065d575f80fd5b80632f2ff15d146200051457806336568abe146200052b578063394218e91462000542578063477fa27014620005595780634d4d3338146200056257806355a71ee01462000579575f80fd5b806315064c9611620002b757806315064c9614620003bf5780631608859c14620003cd5780631796a1ae14620003e45780631816b7e5146200040b5780632072f6c51462000422578063248a9ca3146200042c578063252801691462000460575f80fd5b8063066ec0121462000304578063080b311114620003355780630a0d9fbe146200035d57806311f6b287146200037857806312b86e19146200038f5780631489ed1014620003a8575b5f80fd5b60845462000318906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b6200034c6200034636600462004592565b62000b5c565b60405190151581526020016200032c565b6085546200031890600160401b90046001600160401b031681565b6200031862000389366004620045c8565b62000b85565b620003a6620003a0366004620045f6565b62000ba4565b005b620003a6620003b93660046200469d565b62000d4c565b606f546200034c9060ff1681565b620003a6620003de36600462004592565b62000eda565b607e54620003f59063ffffffff1681565b60405163ffffffff90911681526020016200032c565b620003a66200041c36600462004722565b62000f6d565b620003a662001018565b620004516200043d3660046200474c565b5f9081526034602052604090206001015490565b6040519081526020016200032c565b620004e06200047136600462004592565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b039081169183019190915292820151909216908201526060016200032c565b620003a66200052536600462004764565b62001091565b620003a66200053c36600462004764565b620010b9565b620003a66200055336600462004795565b620010f3565b60865462000451565b620003a662000573366004620047b1565b620011a6565b620004516200058a36600462004592565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b62000451620016e1565b620003a6620005d7366004620045c8565b620016f8565b620005f4620005ee36600462004862565b620017f2565b6040516200032c919062004915565b620003f56200061436600462004795565b60836020525f908152604090205463ffffffff1681565b6084546200031890600160c01b90046001600160401b031681565b620003a6620006573660046200469d565b62001824565b620003a66200066e366004620045f6565b62001b45565b6200034c6200068536600462004764565b62001bf9565b6200045162001c23565b62000318620006a636600462004929565b62001d04565b620003a6620006bd36600462004795565b62001ed0565b620003a6620006d436600462004795565b62001f75565b620004515f81565b6200045162002018565b620007147f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016200032c565b620007916200073e36600462004795565b607f6020525f90815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c0016200032c565b608554620007f190600160801b900461ffff1681565b60405161ffff90911681526020016200032c565b6200089a6200081636600462004592565b60408051608080820183525f8083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b6040516200032c91905f6080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200031890600160801b90046001600160401b031681565b620003a66200090b36600462004954565b620023e0565b620003f562000922366004620049e5565b60826020525f908152604090205463ffffffff1681565b620007147f000000000000000000000000000000000000000000000000000000000000000081565b620003a6620009723660046200474c565b620026b6565b620003a66200098936600462004764565b62002752565b60855462000318906001600160401b031681565b620003a66200277a565b6084546200031890600160401b90046001600160401b031681565b620003a6620009d936600462004a14565b62002823565b620003a6620009f036600462004b30565b620028b9565b620007147f000000000000000000000000000000000000000000000000000000000000000081565b620003a662000a2f36600462004c09565b62002d22565b608054620003f59063ffffffff1681565b62000adc62000a57366004620045c8565b60816020525f9081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff16610160820152610180016200032c565b63ffffffff82165f90815260816020526040812062000b7c908362002f19565b90505b92915050565b63ffffffff81165f90815260816020526040812062000b7f9062002f5d565b5f8051602062005a0983398151915262000bbe8162002fcc565b63ffffffff89165f90815260816020526040902062000be4818a8a8a8a8a8a8a62002fd8565b600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562000c4b576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000c8462002018565b6040518263ffffffff1660e01b815260040162000ca391815260200190565b5f604051808303815f87803b15801562000cbb575f80fd5b505af115801562000cce573d5f803e3d5ffd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b5f8051602062005a0983398151915262000d668162002fcc565b63ffffffff89165f90815260816020526040902062000d8c818a8a8a8a8a8a8a62003366565b600681018054600160401b600160801b031916600160401b6001600160401b038a81169182029290921783555f9081526002840160205260409020879055600583018890559054600160801b9004161562000df3576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000e2c62002018565b6040518263ffffffff1660e01b815260040162000e4b91815260200190565b5f604051808303815f87803b15801562000e63575f80fd5b505af115801562000e76573d5f803e3d5ffd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff82165f90815260816020526040902062000f085f8051602062005a098339815191523362001bf9565b62000f5c57606f5460ff161562000f3257604051630bc011ff60e21b815260040160405180910390fd5b62000f3e818362002f19565b62000f5c57604051630674f25160e11b815260040160405180910390fd5b62000f6881836200372d565b505050565b5f80516020620059c983398151915262000f878162002fcc565b6103e88261ffff16108062000fa157506103ff8261ffff16115b1562000fc057604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620010325f80516020620059e98339815191523362001bf9565b620010855760845442906200105c9062093a8090600160801b90046001600160401b031662004caf565b6001600160401b03161115620010855760405163692baaad60e11b815260040160405180910390fd5b6200108f62003918565b565b5f82815260346020526040902060010154620010ad8162002fcc565b62000f68838362003992565b6001600160a01b0381163314620010e357604051630b4ad1cd60e31b815260040160405180910390fd5b620010ef8282620039fd565b5050565b5f80516020620059c98339815191526200110d8162002fcc565b606f5460ff166200114f576084546001600160401b03600160c01b9091048116908316106200114f5760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1906020016200100c565b5f54600290610100900460ff16158015620011c757505f5460ff8083169116105b620012305760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b179055620012b062003a66565b620012ca5f8051602062005a098339815191528a62003ad2565b620012d65f8662003ad2565b620013027fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908662003ad2565b6200132e7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8662003ad2565b6200135a7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8662003ad2565b620013867fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8762003ad2565b620013b27fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088762003ad2565b620013de7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48762003ad2565b620013f85f80516020620059c98339815191528762003ad2565b620014325f8051602062005a098339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062003ade565b6200145e7f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08762003ad2565b6200148a7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8762003ad2565b620014c45f80516020620059e98339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162003ade565b620014de5f80516020620059e98339815191528562003ad2565b6200150a7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518562003ad2565b5f6200151d8484600561044d5f62003b28565b6073546074549192506001600160401b03600160401b909104811691168082146200155b57604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b038181165f8181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb590708966200165c9695831695600160581b909104909216936076936077939192919091169060040162004d80565b5f604051808303815f87803b15801562001674575f80fd5b505af115801562001687573d5f803e3d5ffd5b50505f805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620016ce9050565b60405180910390a1505050505050505050565b5f6086546064620016f3919062004de4565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd620017248162002fcc565b63ffffffff82161580620017435750607e5463ffffffff908116908316115b156200176257604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f60205260409020600180820154600160e81b900460ff1615159003620017a857604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b63ffffffff86165f9081526081602052604090206060906200181990878787878762003d40565b979650505050505050565b606f5460ff16156200184957604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602090815260408083206084546001600160401b038a8116865260038301909452919093206001015442926200189792600160c01b90048116911662004caf565b6001600160401b03161115620018c057604051638a0704d360e01b815260040160405180910390fd5b6103e8620018cf888862004dfe565b6001600160401b03161115620018f857604051635acfba9d60e11b815260040160405180910390fd5b6200190a818989898989898962003366565b62001916818762003e7f565b6085546001600160401b03165f0362001a1d57600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562001990576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620019c962002018565b6040518263ffffffff1660e01b8152600401620019e891815260200190565b5f604051808303815f87803b15801562001a00575f80fd5b505af115801562001a13573d5f803e3d5ffd5b5050505062001ae6565b62001a288162004076565b600681018054600160801b90046001600160401b031690601062001a4c8362004e21565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b900487165f90815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff161562001b6a57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f90815260816020526040902062001b90818989898989898962002fd8565b6001600160401b0385165f9081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a162001bee62003918565b505050505050505050565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b81523060048201525f9081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562001c8a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001cb0919062004e49565b6084549091505f9062001cd6906001600160401b03600160401b82048116911662004dfe565b6001600160401b03169050805f0362001cf1575f9250505090565b62001cfd818362004e75565b9250505090565b606f545f9060ff161562001d2b57604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff169081900362001d62576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f0362001d8c57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f908152608160205260408120608480549192879262001dbe9084906001600160401b031662004caf565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f62001df3878362004caf565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f95865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b03199092169290931691909117179055905062001e828362004076565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b5f80516020620059c983398151915262001eea8162002fcc565b606f5460ff1662001f25576085546001600160401b039081169083161062001f255760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75906020016200100c565b5f80516020620059c983398151915262001f8f8162002fcc565b62015180826001600160401b0316111562001fbd57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28906020016200100c565b6080545f9063ffffffff168082036200203257505f919050565b5f816001600160401b038111156200204e576200204e62004a8c565b60405190808252806020026020018201604052801562002078578160200160208202803683370190505b5090505f5b82811015620020e85760815f6200209683600162004e8b565b63ffffffff1663ffffffff1681526020019081526020015f2060050154828281518110620020c857620020c862004ea1565b602090810291909101015280620020df8162004eb5565b9150506200207d565b505f60205b8360011462002340575f6200210460028662004ed0565b6200211160028762004e75565b6200211d919062004e8b565b90505f816001600160401b038111156200213b576200213b62004a8c565b60405190808252806020026020018201604052801562002165578160200160208202803683370190505b5090505f5b82811015620022ec576200218060018462004ee6565b811480156200219b57506200219760028862004ed0565b6001145b15620022235785620021af82600262004de4565b81518110620021c257620021c262004ea1565b602002602001015185604051602001620021e6929190918252602082015260400190565b6040516020818303038152906040528051906020012082828151811062002211576200221162004ea1565b602002602001018181525050620022d7565b856200223182600262004de4565b8151811062002244576200224462004ea1565b6020026020010151868260026200225c919062004de4565b6200226990600162004e8b565b815181106200227c576200227c62004ea1565b60200260200101516040516020016200229f929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620022ca57620022ca62004ea1565b6020026020010181815250505b80620022e38162004eb5565b9150506200216a565b50809450819550838460405160200162002310929190918252602082015260400190565b6040516020818303038152906040528051906020012093508280620023359062004efc565b9350505050620020ed565b5f835f8151811062002356576200235662004ea1565b602002602001015190505f5b82811015620023d657604080516020810184905290810185905260600160408051601f19818403018152828252805160209182012090830187905290820186905292506060016040516020818303038152906040528051906020012093508080620023cd9062004eb5565b91505062002362565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac6200240c8162002fcc565b63ffffffff841615806200242b5750607e5463ffffffff908116908516115b156200244a57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526082602052604081205463ffffffff16908190036200248a576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918716600160401b9091046001600160401b031603620024d857604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86165f908152607f60205260409020600180820154600160e81b900460ff16151590036200251e57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b90920416146200255c57604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790555f620025db8462000b85565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef28692620026319216908b908b9060040162004f14565b5f604051808303815f87803b15801562002649575f80fd5b505af11580156200265c573d5f803e3d5ffd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb620026e28162002fcc565b683635c9adc5dea00000821180620026fd5750633b9aca0082105b156200271c57604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b2906020016200100c565b5f828152603460205260409020600101546200276e8162002fcc565b62000f688383620039fd565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f4620027a68162002fcc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b158015620027ff575f80fd5b505af115801562002812573d5f803e3d5ffd5b50505050620028206200413f565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e6200284f8162002fcc565b6001600160401b0384165f9081526083602052604090205463ffffffff16156200288c576040516337c8fe0960e11b815260040160405180910390fd5b5f6200289c888888888762003b28565b5f8080526002909101602052604090209390935550505050505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08620028e58162002fcc565b63ffffffff89161580620029045750607e5463ffffffff908116908a16115b156200292357604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff89165f908152607f60205260409020600180820154600160e81b900460ff16151590036200296957604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b0389165f9081526083602052604090205463ffffffff1615620029a6576040516337c8fe0960e11b815260040160405180910390fd5b608080545f91908290620029c09063ffffffff1662004f53565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b0390921691309162002a0d9062004559565b62002a1b9392919062004f6e565b604051809103905ff08015801562002a35573d5f803e3d5ffd5b5090508160835f8d6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508b815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508c63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f9a84992ead4481f37097c7663e97ed883b31f216fae5685c6ee576a656483cd98e848f8d8d60405162002ca295949392919063ffffffff95861681526001600160a01b0394851660208201526001600160401b03939093166040840152921660608201529116608082015260a00190565b60405180910390a26040516308fd7e2160e31b81526001600160a01b038316906347ebf1089062002ce4908e908e9088908f908f908f908f9060040162004fa4565b5f604051808303815f87803b15801562002cfc575f80fd5b505af115801562002d0f573d5f803e3d5ffd5b5050505050505050505050505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002d4e8162002fcc565b607e80545f9190829062002d689063ffffffff1662004f53565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff1681526020015f1515815260200185815250607f5f8363ffffffff166001600160401b031681526020019081526020015f205f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002f079695949392919062005010565b60405180910390a25050505050505050565b6085546001600160401b038281165f9081526004850160205260408120549092429262002f4b92918116911662004caf565b6001600160401b031611159392505050565b60068101545f90600160801b90046001600160401b03161562002faf575060068101546001600160401b03600160801b90910481165f9081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002820813362004197565b60078801545f906001600160401b0390811690871610156200300d5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620030ad5760068901546001600160401b03600160801b90910481169089161115620030575760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f90815260048a0160205260409020600281015481549092888116600160401b9092041614620030a657604051632bd2e3e760e01b815260040160405180910390fd5b5062003121565b506001600160401b0385165f90815260028901602052604090205480620030e7576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b909104811690871611156200312157604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b909104811690881611806200315a5750876001600160401b0316876001600160401b031611155b806200317e575060068901546001600160401b03600160c01b909104811690881611155b156200319d5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260048b016020526040902054600160401b9004811690861614620031e3576040516332a2a77f60e01b815260040160405180910390fd5b5f620031f48a888888868962003d40565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516200322a919062005068565b602060405180830381855afa15801562003246573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200326b919062004e49565b62003277919062004ed0565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620032bb9188919060040162005085565b602060405180830381865afa158015620032d7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620032fd9190620050c1565b6200331b576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260048c016020526040902060020154859003620033595760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b5f80620033738a62002f5d565b60078b01549091506001600160401b039081169089161015620033a95760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038916156200344b5760068a01546001600160401b03600160801b9091048116908a161115620033f35760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a165f90815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200344457604051632bd2e3e760e01b815260040160405180910390fd5b50620034ba565b6001600160401b0388165f90815260028b01602052604090205491508162003486576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b03161115620034ba57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620034ed5760405163b9b18f5760e01b815260040160405180910390fd5b5f620034fe8b8a8a8a878b62003d40565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405162003534919062005068565b602060405180830381855afa15801562003550573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019062003575919062004e49565b62003581919062004ed0565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620035c59189919060040162005085565b602060405180830381865afa158015620035e1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620036079190620050c1565b62003625576040516309bde33960e01b815260040160405180910390fd5b5f62003632848b62004dfe565b90506200368b87826001600160401b03166200364d62001c23565b62003659919062004de4565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620041c1565b80608460088282829054906101000a90046001600160401b0316620036b1919062004caf565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d1539060640162002ce4565b60068201546001600160401b03600160c01b90910481169082161115806200376c575060068201546001600160401b03600160801b9091048116908216115b156200378b5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f81815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200384662002018565b6040518263ffffffff1660e01b81526004016200386591815260200190565b5f604051808303815f87803b1580156200387d575f80fd5b505af115801562003890573d5f803e3d5ffd5b505085546001600160a01b03165f90815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801562003971575f80fd5b505af115801562003984573d5f803e3d5ffd5b505050506200108f62004215565b6200399e828262001bf9565b620010ef575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003a09828262001bf9565b15620010ef575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b5f54610100900460ff166200108f5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162001227565b620010ef828262003992565b5f82815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080545f918291829062003b439063ffffffff1662004f53565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f866001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f896001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff16021790555060815f8263ffffffff1663ffffffff1681526020019081526020015f20915086825f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b0316021790555085826001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555083825f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003d2e94939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086165f818152600389016020526040808220549388168252902054606092911580159062003d75575081155b1562003d945760405163340c614f60e11b815260040160405180910390fd5b8062003db3576040516366385b5160e01b815260040160405180910390fd5b62003dbe8462004271565b62003ddc576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b5f62003e8b8362002f5d565b9050815f8062003e9c848462004dfe565b6085546001600160401b0391821692505f9162003ec291600160401b9004164262004ee6565b90505b846001600160401b0316846001600160401b03161462003f4b576001600160401b038085165f9081526003890160205260409020600181015490911682101562003f26576001810154600160401b90046001600160401b0316945062003f44565b62003f32868662004dfe565b6001600160401b031693505062003f4b565b5062003ec5565b5f62003f58848462004ee6565b90508381101562003fb657808403600c811162003f76578062003f79565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a608654028162003fab5762003fab62004e61565b04608655506200402d565b838103600c811162003fc9578062003fcc565b600c5b90505f816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162004005576200400562004e61565b04905080608654670de0b6b3a7640000028162004026576200402662004e61565b0460865550505b683635c9adc5dea0000060865411156200405457683635c9adc5dea000006086556200406c565b633b9aca0060865410156200406c57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b909204161115620028205760068101545f90620040c090600160c01b90046001600160401b0316600162004caf565b9050620040ce828262002f19565b15620010ef5760068201545f90600290620040fb908490600160801b90046001600160401b031662004dfe565b620041079190620050e2565b62004113908362004caf565b905062004121838262002f19565b15620041335762000f6883826200372d565b62000f6883836200372d565b606f5460ff166200416357604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b620041a3828262001bf9565b620010ef57604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905262000f68908490620042f5565b606f5460ff16156200423a57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff000000016001600160401b038316108015620042a7575067ffffffff00000001604083901c6001600160401b0316105b8015620042c8575067ffffffff00000001608083901c6001600160401b0316105b8015620042e0575067ffffffff0000000160c083901c105b15620042ee57506001919050565b505f919050565b5f6200434b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620043cd9092919063ffffffff16565b80519091501562000f6857808060200190518101906200436c9190620050c1565b62000f685760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162001227565b6060620043dd84845f85620043e5565b949350505050565b606082471015620044485760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162001227565b5f80866001600160a01b0316858760405162004465919062005068565b5f6040518083038185875af1925050503d805f8114620044a1576040519150601f19603f3d011682016040523d82523d5f602084013e620044a6565b606091505b5091509150620018198783838760608315620045265782515f036200451e576001600160a01b0385163b6200451e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001227565b5081620043dd565b620043dd83838151156200453d5781518083602001fd5b8060405162461bcd60e51b815260040162001227919062004915565b6108be806200510b83390190565b803563ffffffff8116811462002fc7575f80fd5b80356001600160401b038116811462002fc7575f80fd5b5f8060408385031215620045a4575f80fd5b620045af8362004567565b9150620045bf602084016200457b565b90509250929050565b5f60208284031215620045d9575f80fd5b62000b7c8262004567565b80610300810183101562000b7f575f80fd5b5f805f805f805f806103e0898b0312156200460f575f80fd5b6200461a8962004567565b97506200462a60208a016200457b565b96506200463a60408a016200457b565b95506200464a60608a016200457b565b94506200465a60808a016200457b565b935060a0890135925060c08901359150620046798a60e08b01620045e4565b90509295985092959890939650565b6001600160a01b038116811462002820575f80fd5b5f805f805f805f806103e0898b031215620046b6575f80fd5b620046c18962004567565b9750620046d160208a016200457b565b9650620046e160408a016200457b565b9550620046f160608a016200457b565b94506080890135935060a0890135925060c0890135620047118162004688565b9150620046798a60e08b01620045e4565b5f6020828403121562004733575f80fd5b813561ffff8116811462004745575f80fd5b9392505050565b5f602082840312156200475d575f80fd5b5035919050565b5f806040838503121562004776575f80fd5b8235915060208301356200478a8162004688565b809150509250929050565b5f60208284031215620047a6575f80fd5b62000b7c826200457b565b5f805f805f805f80610100898b031215620047ca575f80fd5b8835620047d78162004688565b9750620047e760208a016200457b565b9650620047f760408a016200457b565b95506060890135620048098162004688565b945060808901356200481b8162004688565b935060a08901356200482d8162004688565b925060c08901356200483f8162004688565b915060e0890135620048518162004688565b809150509295985092959890939650565b5f805f805f8060c0878903121562004878575f80fd5b620048838762004567565b955062004893602088016200457b565b9450620048a3604088016200457b565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b83811015620048e0578181015183820152602001620048c6565b50505f910152565b5f815180845262004901816020860160208601620048c4565b601f01601f19169290920160200192915050565b602081525f62000b7c6020830184620048e8565b5f80604083850312156200493b575f80fd5b62004946836200457b565b946020939093013593505050565b5f805f806060858703121562004968575f80fd5b8435620049758162004688565b9350620049856020860162004567565b925060408501356001600160401b0380821115620049a1575f80fd5b818701915087601f830112620049b5575f80fd5b813581811115620049c4575f80fd5b886020828501011115620049d6575f80fd5b95989497505060200194505050565b5f60208284031215620049f6575f80fd5b8135620047458162004688565b803560ff8116811462002fc7575f80fd5b5f805f805f8060c0878903121562004a2a575f80fd5b863562004a378162004688565b9550602087013562004a498162004688565b945062004a59604088016200457b565b935062004a69606088016200457b565b92506080870135915062004a8060a0880162004a03565b90509295509295509295565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011262004ab0575f80fd5b81356001600160401b038082111562004acd5762004acd62004a8c565b604051601f8301601f19908116603f0116810190828211818310171562004af85762004af862004a8c565b8160405283815286602085880101111562004b11575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f80610100898b03121562004b49575f80fd5b62004b548962004567565b975062004b6460208a016200457b565b9650604089013562004b768162004688565b9550606089013562004b888162004688565b9450608089013562004b9a8162004688565b935062004baa60a08a0162004567565b925060c08901356001600160401b038082111562004bc6575f80fd5b62004bd48c838d0162004aa0565b935060e08b013591508082111562004bea575f80fd5b5062004bf98b828c0162004aa0565b9150509295985092959890939650565b5f805f805f8060c0878903121562004c1f575f80fd5b863562004c2c8162004688565b9550602087013562004c3e8162004688565b945062004c4e604088016200457b565b935062004c5e6060880162004a03565b92506080870135915060a08701356001600160401b0381111562004c80575f80fd5b62004c8e89828a0162004aa0565b9150509295509295509295565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111562004cd25762004cd262004c9b565b5092915050565b80545f90600181811c908083168062004cf357607f831692505b6020808410820362004d1357634e487b7160e01b5f52602260045260245ffd5b8388526020880182801562004d31576001811462004d485762004d73565b60ff198716825285151560051b8201975062004d73565b5f898152602090205f5b8781101562004d6d5781548482015290860190840162004d52565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c0604082018190525f9062004dad9083018762004cd9565b828103606084015262004dc1818762004cd9565b9150508360808301526001600160401b03831660a0830152979650505050505050565b808202811582820484141762000b7f5762000b7f62004c9b565b6001600160401b0382811682821603908082111562004cd25762004cd262004c9b565b5f6001600160401b0380831681810362004e3f5762004e3f62004c9b565b6001019392505050565b5f6020828403121562004e5a575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8262004e865762004e8662004e61565b500490565b8082018082111562000b7f5762000b7f62004c9b565b634e487b7160e01b5f52603260045260245ffd5b5f6001820162004ec95762004ec962004c9b565b5060010190565b5f8262004ee15762004ee162004e61565b500690565b8181038181111562000b7f5762000b7f62004c9b565b5f8162004f0d5762004f0d62004c9b565b505f190190565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b5f63ffffffff80831681810362004e3f5762004e3f62004c9b565b6001600160a01b038481168252831660208201526060604082018190525f9062004f9b90830184620048e8565b95945050505050565b6001600160a01b038881168252878116602083015263ffffffff878116604084015290861660608301528416608082015260e060a082018190525f9062004fee90830185620048e8565b82810360c0840152620050028185620048e8565b9a9950505050505050505050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190525f906200505c90830184620048e8565b98975050505050505050565b5f82516200507b818460208701620048c4565b9190910192915050565b6103208101610300808584378201835f5b6001811015620050b757815183526020928301929091019060010162005096565b5050509392505050565b5f60208284031215620050d2575f80fd5b8151801515811462004745575f80fd5b5f6001600160401b0380841680620050fe57620050fe62004e61565b9216919091049291505056fe60a0604052604051620008be380380620008be8339810160408190526100249161034d565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b6565b505050610432565b61006182610124565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100aa576100a582826101a2565b505050565b6100b2610215565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f65f805160206200089e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161012181610236565b50565b806001600160a01b03163b5f0361015e57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516101be9190610417565b5f60405180830381855af49150503d805f81146101f6576040519150601f19603f3d011682016040523d82523d5f602084013e6101fb565b606091505b50909250905061020c858383610274565b95945050505050565b34156102345760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661025f57604051633173bdd160e11b81525f6004820152602401610155565b805f805160206200089e833981519152610181565b60608261028957610284826102d3565b6102cc565b81511580156102a057506001600160a01b0384163b155b156102c957604051639996b31560e01b81526001600160a01b0385166004820152602401610155565b50805b9392505050565b8051156102e35780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b0381168114610312575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561034557818101518382015260200161032d565b50505f910152565b5f805f6060848603121561035f575f80fd5b610368846102fc565b9250610376602085016102fc565b60408501519092506001600160401b0380821115610392575f80fd5b818601915086601f8301126103a5575f80fd5b8151818111156103b7576103b7610317565b604051601f8201601f19908116603f011681019083821181831017156103df576103df610317565b816040528281528960208487010111156103f7575f80fd5b61040883602083016020880161032b565b80955050505050509250925092565b5f825161042881846020870161032b565b9190910192915050565b6080516104546200044a5f395f601001526104545ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610069575f356001600160e01b03191663278f794360e11b146100615761005f61006d565b565b61005f61007d565b61005f5b61005f6100786100ab565b6100e2565b5f8061008c36600481846102ee565b8101906100999190610329565b915091506100a78282610100565b5050565b5f6100dd7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156100fc573d5ff35b3d5ffd5b6101098261015a565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101525761014d82826101d5565b505050565b6100a7610247565b806001600160a01b03163b5f0361019457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101f191906103f2565b5f60405180830381855af49150503d805f8114610229576040519150601f19603f3d011682016040523d82523d5f602084013e61022e565b606091505b509150915061023e858383610266565b95945050505050565b341561005f5760405163b398979f60e01b815260040160405180910390fd5b60608261027b57610276826102c5565b6102be565b815115801561029257506001600160a01b0384163b155b156102bb57604051639996b31560e01b81526001600160a01b038516600482015260240161018b565b50805b9392505050565b8051156102d55780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f80858511156102fc575f80fd5b83861115610308575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561033a575f80fd5b82356001600160a01b0381168114610350575f80fd5b9150602083013567ffffffffffffffff8082111561036c575f80fd5b818501915085601f83011261037f575f80fd5b81358181111561039157610391610315565b604051601f8201601f19908116603f011681019083821181831017156103b9576103b9610315565b816040528281528860208487010111156103d1575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b8181101561041157602081860181015185830152016103f7565b505f92019182525091905056fea2646970667358221220c49d991c000dd664fa67a05338f92aab4c71dc2b0db71e34e45488392b18ca4864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220b4c0235190db25024bb30303391a6c88badbf76da86f61db9b19b9f2ce467d3564736f6c63430008140033", - "deployedBytecode": "0x608060405234801562000010575f80fd5b506004361062000300575f3560e01c806391d148541162000197578063ceee281d11620000e7578063dde0ff77116200009b578063dde0ff7714620009ad578063e0bfd3d214620009c8578063e136edf714620009df578063e46761c414620009f6578063f34eb8eb1462000a1e578063f4e926751462000a35578063f9c4c2ae1462000a46575f80fd5b8063ceee281d1462000911578063d02103ca1462000939578063d5073f6f1462000961578063d547741f1462000978578063d939b315146200098f578063dbc1697614620009a3575f80fd5b8063a2967d99116200014b578063a2967d9914620006e2578063a3c573eb14620006ec578063a4810bb2146200072d578063afd23cbe14620007db578063b99d0ad71462000805578063c1acbc3414620008df578063c4c928c214620008fa575f80fd5b806391d14854146200067457806399f5634e146200068b5780639a908e7314620006955780639c9f3dfe14620006ac578063a066215c14620006c3578063a217fddf14620006da575f80fd5b80632f2ff15d11620002535780636046916911620002075780636046916914620005bc5780637222020f14620005c65780637975fcfe14620005dd5780637fb6e76a1462000603578063841b24d7146200062b57806387c20c0114620006465780638bd4f071146200065d575f80fd5b80632f2ff15d146200051457806336568abe146200052b578063394218e91462000542578063477fa27014620005595780634d4d3338146200056257806355a71ee01462000579575f80fd5b806315064c9611620002b757806315064c9614620003bf5780631608859c14620003cd5780631796a1ae14620003e45780631816b7e5146200040b5780632072f6c51462000422578063248a9ca3146200042c578063252801691462000460575f80fd5b8063066ec0121462000304578063080b311114620003355780630a0d9fbe146200035d57806311f6b287146200037857806312b86e19146200038f5780631489ed1014620003a8575b5f80fd5b60845462000318906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b6200034c6200034636600462004592565b62000b5c565b60405190151581526020016200032c565b6085546200031890600160401b90046001600160401b031681565b6200031862000389366004620045c8565b62000b85565b620003a6620003a0366004620045f6565b62000ba4565b005b620003a6620003b93660046200469d565b62000d4c565b606f546200034c9060ff1681565b620003a6620003de36600462004592565b62000eda565b607e54620003f59063ffffffff1681565b60405163ffffffff90911681526020016200032c565b620003a66200041c36600462004722565b62000f6d565b620003a662001018565b620004516200043d3660046200474c565b5f9081526034602052604090206001015490565b6040519081526020016200032c565b620004e06200047136600462004592565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b039081169183019190915292820151909216908201526060016200032c565b620003a66200052536600462004764565b62001091565b620003a66200053c36600462004764565b620010b9565b620003a66200055336600462004795565b620010f3565b60865462000451565b620003a662000573366004620047b1565b620011a6565b620004516200058a36600462004592565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b62000451620016e1565b620003a6620005d7366004620045c8565b620016f8565b620005f4620005ee36600462004862565b620017f2565b6040516200032c919062004915565b620003f56200061436600462004795565b60836020525f908152604090205463ffffffff1681565b6084546200031890600160c01b90046001600160401b031681565b620003a6620006573660046200469d565b62001824565b620003a66200066e366004620045f6565b62001b45565b6200034c6200068536600462004764565b62001bf9565b6200045162001c23565b62000318620006a636600462004929565b62001d04565b620003a6620006bd36600462004795565b62001ed0565b620003a6620006d436600462004795565b62001f75565b620004515f81565b6200045162002018565b620007147f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016200032c565b620007916200073e36600462004795565b607f6020525f90815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c0016200032c565b608554620007f190600160801b900461ffff1681565b60405161ffff90911681526020016200032c565b6200089a6200081636600462004592565b60408051608080820183525f8083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b6040516200032c91905f6080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200031890600160801b90046001600160401b031681565b620003a66200090b36600462004954565b620023e0565b620003f562000922366004620049e5565b60826020525f908152604090205463ffffffff1681565b620007147f000000000000000000000000000000000000000000000000000000000000000081565b620003a6620009723660046200474c565b620026b6565b620003a66200098936600462004764565b62002752565b60855462000318906001600160401b031681565b620003a66200277a565b6084546200031890600160401b90046001600160401b031681565b620003a6620009d936600462004a14565b62002823565b620003a6620009f036600462004b30565b620028b9565b620007147f000000000000000000000000000000000000000000000000000000000000000081565b620003a662000a2f36600462004c09565b62002d22565b608054620003f59063ffffffff1681565b62000adc62000a57366004620045c8565b60816020525f9081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff16610160820152610180016200032c565b63ffffffff82165f90815260816020526040812062000b7c908362002f19565b90505b92915050565b63ffffffff81165f90815260816020526040812062000b7f9062002f5d565b5f8051602062005a0983398151915262000bbe8162002fcc565b63ffffffff89165f90815260816020526040902062000be4818a8a8a8a8a8a8a62002fd8565b600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562000c4b576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000c8462002018565b6040518263ffffffff1660e01b815260040162000ca391815260200190565b5f604051808303815f87803b15801562000cbb575f80fd5b505af115801562000cce573d5f803e3d5ffd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b5f8051602062005a0983398151915262000d668162002fcc565b63ffffffff89165f90815260816020526040902062000d8c818a8a8a8a8a8a8a62003366565b600681018054600160401b600160801b031916600160401b6001600160401b038a81169182029290921783555f9081526002840160205260409020879055600583018890559054600160801b9004161562000df3576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000e2c62002018565b6040518263ffffffff1660e01b815260040162000e4b91815260200190565b5f604051808303815f87803b15801562000e63575f80fd5b505af115801562000e76573d5f803e3d5ffd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff82165f90815260816020526040902062000f085f8051602062005a098339815191523362001bf9565b62000f5c57606f5460ff161562000f3257604051630bc011ff60e21b815260040160405180910390fd5b62000f3e818362002f19565b62000f5c57604051630674f25160e11b815260040160405180910390fd5b62000f6881836200372d565b505050565b5f80516020620059c983398151915262000f878162002fcc565b6103e88261ffff16108062000fa157506103ff8261ffff16115b1562000fc057604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620010325f80516020620059e98339815191523362001bf9565b620010855760845442906200105c9062093a8090600160801b90046001600160401b031662004caf565b6001600160401b03161115620010855760405163692baaad60e11b815260040160405180910390fd5b6200108f62003918565b565b5f82815260346020526040902060010154620010ad8162002fcc565b62000f68838362003992565b6001600160a01b0381163314620010e357604051630b4ad1cd60e31b815260040160405180910390fd5b620010ef8282620039fd565b5050565b5f80516020620059c98339815191526200110d8162002fcc565b606f5460ff166200114f576084546001600160401b03600160c01b9091048116908316106200114f5760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1906020016200100c565b5f54600290610100900460ff16158015620011c757505f5460ff8083169116105b620012305760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038c8116919091029190911790915567016345785d8a00006086558a166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b179055620012b062003a66565b620012ca5f8051602062005a098339815191528a62003ad2565b620012d65f8662003ad2565b620013027fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908662003ad2565b6200132e7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8662003ad2565b6200135a7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8662003ad2565b620013867fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8762003ad2565b620013b27fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088762003ad2565b620013de7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48762003ad2565b620013f85f80516020620059c98339815191528762003ad2565b620014325f8051602062005a098339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062003ade565b6200145e7f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08762003ad2565b6200148a7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8762003ad2565b620014c45f80516020620059e98339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162003ade565b620014de5f80516020620059e98339815191528562003ad2565b6200150a7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518562003ad2565b5f6200151d8484600561044d5f62003b28565b6073546074549192506001600160401b03600160401b909104811691168082146200155b57604051632e4cc54360e11b815260040160405180910390fd5b6001600160401b038181165f8181526075602090815260408083205460028901835281842055868516808452607280845282852060038b018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b918290048c1682021790915560068d0180549092169094179388029390931790925560078a0180549092169095179055607a54606f54949092529154607354925163176b20e160e31b81526001600160a01b038c81169663bb590708966200165c9695831695600160581b909104909216936076936077939192919091169060040162004d80565b5f604051808303815f87803b15801562001674575f80fd5b505af115801562001687573d5f803e3d5ffd5b50505f805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620016ce9050565b60405180910390a1505050505050505050565b5f6086546064620016f3919062004de4565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd620017248162002fcc565b63ffffffff82161580620017435750607e5463ffffffff908116908316115b156200176257604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f60205260409020600180820154600160e81b900460ff1615159003620017a857604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b63ffffffff86165f9081526081602052604090206060906200181990878787878762003d40565b979650505050505050565b606f5460ff16156200184957604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602090815260408083206084546001600160401b038a8116865260038301909452919093206001015442926200189792600160c01b90048116911662004caf565b6001600160401b03161115620018c057604051638a0704d360e01b815260040160405180910390fd5b6103e8620018cf888862004dfe565b6001600160401b03161115620018f857604051635acfba9d60e11b815260040160405180910390fd5b6200190a818989898989898962003366565b62001916818762003e7f565b6085546001600160401b03165f0362001a1d57600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562001990576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620019c962002018565b6040518263ffffffff1660e01b8152600401620019e891815260200190565b5f604051808303815f87803b15801562001a00575f80fd5b505af115801562001a13573d5f803e3d5ffd5b5050505062001ae6565b62001a288162004076565b600681018054600160801b90046001600160401b031690601062001a4c8362004e21565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b900487165f90815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff161562001b6a57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f90815260816020526040902062001b90818989898989898962002fd8565b6001600160401b0385165f9081526002820160209081526040918290205482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a162001bee62003918565b505050505050505050565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b81523060048201525f9081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562001c8a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001cb0919062004e49565b6084549091505f9062001cd6906001600160401b03600160401b82048116911662004dfe565b6001600160401b03169050805f0362001cf1575f9250505090565b62001cfd818362004e75565b9250505090565b606f545f9060ff161562001d2b57604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff169081900362001d62576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f0362001d8c57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f908152608160205260408120608480549192879262001dbe9084906001600160401b031662004caf565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f62001df3878362004caf565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f95865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b03199092169290931691909117179055905062001e828362004076565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b5f80516020620059c983398151915262001eea8162002fcc565b606f5460ff1662001f25576085546001600160401b039081169083161062001f255760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75906020016200100c565b5f80516020620059c983398151915262001f8f8162002fcc565b62015180826001600160401b0316111562001fbd57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28906020016200100c565b6080545f9063ffffffff168082036200203257505f919050565b5f816001600160401b038111156200204e576200204e62004a8c565b60405190808252806020026020018201604052801562002078578160200160208202803683370190505b5090505f5b82811015620020e85760815f6200209683600162004e8b565b63ffffffff1663ffffffff1681526020019081526020015f2060050154828281518110620020c857620020c862004ea1565b602090810291909101015280620020df8162004eb5565b9150506200207d565b505f60205b8360011462002340575f6200210460028662004ed0565b6200211160028762004e75565b6200211d919062004e8b565b90505f816001600160401b038111156200213b576200213b62004a8c565b60405190808252806020026020018201604052801562002165578160200160208202803683370190505b5090505f5b82811015620022ec576200218060018462004ee6565b811480156200219b57506200219760028862004ed0565b6001145b15620022235785620021af82600262004de4565b81518110620021c257620021c262004ea1565b602002602001015185604051602001620021e6929190918252602082015260400190565b6040516020818303038152906040528051906020012082828151811062002211576200221162004ea1565b602002602001018181525050620022d7565b856200223182600262004de4565b8151811062002244576200224462004ea1565b6020026020010151868260026200225c919062004de4565b6200226990600162004e8b565b815181106200227c576200227c62004ea1565b60200260200101516040516020016200229f929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620022ca57620022ca62004ea1565b6020026020010181815250505b80620022e38162004eb5565b9150506200216a565b50809450819550838460405160200162002310929190918252602082015260400190565b6040516020818303038152906040528051906020012093508280620023359062004efc565b9350505050620020ed565b5f835f8151811062002356576200235662004ea1565b602002602001015190505f5b82811015620023d657604080516020810184905290810185905260600160408051601f19818403018152828252805160209182012090830187905290820186905292506060016040516020818303038152906040528051906020012093508080620023cd9062004eb5565b91505062002362565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac6200240c8162002fcc565b63ffffffff841615806200242b5750607e5463ffffffff908116908516115b156200244a57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526082602052604081205463ffffffff16908190036200248a576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918716600160401b9091046001600160401b031603620024d857604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86165f908152607f60205260409020600180820154600160e81b900460ff16151590036200251e57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b90920416146200255c57604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790555f620025db8462000b85565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef28692620026319216908b908b9060040162004f14565b5f604051808303815f87803b15801562002649575f80fd5b505af11580156200265c573d5f803e3d5ffd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb620026e28162002fcc565b683635c9adc5dea00000821180620026fd5750633b9aca0082105b156200271c57604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b2906020016200100c565b5f828152603460205260409020600101546200276e8162002fcc565b62000f688383620039fd565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f4620027a68162002fcc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b158015620027ff575f80fd5b505af115801562002812573d5f803e3d5ffd5b50505050620028206200413f565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e6200284f8162002fcc565b6001600160401b0384165f9081526083602052604090205463ffffffff16156200288c576040516337c8fe0960e11b815260040160405180910390fd5b5f6200289c888888888762003b28565b5f8080526002909101602052604090209390935550505050505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08620028e58162002fcc565b63ffffffff89161580620029045750607e5463ffffffff908116908a16115b156200292357604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff89165f908152607f60205260409020600180820154600160e81b900460ff16151590036200296957604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b0389165f9081526083602052604090205463ffffffff1615620029a6576040516337c8fe0960e11b815260040160405180910390fd5b608080545f91908290620029c09063ffffffff1662004f53565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b0390921691309162002a0d9062004559565b62002a1b9392919062004f6e565b604051809103905ff08015801562002a35573d5f803e3d5ffd5b5090508160835f8d6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508b815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508c63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f9a84992ead4481f37097c7663e97ed883b31f216fae5685c6ee576a656483cd98e848f8d8d60405162002ca295949392919063ffffffff95861681526001600160a01b0394851660208201526001600160401b03939093166040840152921660608201529116608082015260a00190565b60405180910390a26040516308fd7e2160e31b81526001600160a01b038316906347ebf1089062002ce4908e908e9088908f908f908f908f9060040162004fa4565b5f604051808303815f87803b15801562002cfc575f80fd5b505af115801562002d0f573d5f803e3d5ffd5b5050505050505050505050505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002d4e8162002fcc565b607e80545f9190829062002d689063ffffffff1662004f53565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff1681526020015f1515815260200185815250607f5f8363ffffffff166001600160401b031681526020019081526020015f205f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002f079695949392919062005010565b60405180910390a25050505050505050565b6085546001600160401b038281165f9081526004850160205260408120549092429262002f4b92918116911662004caf565b6001600160401b031611159392505050565b60068101545f90600160801b90046001600160401b03161562002faf575060068101546001600160401b03600160801b90910481165f9081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002820813362004197565b60078801545f906001600160401b0390811690871610156200300d5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620030ad5760068901546001600160401b03600160801b90910481169089161115620030575760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f90815260048a0160205260409020600281015481549092888116600160401b9092041614620030a657604051632bd2e3e760e01b815260040160405180910390fd5b5062003121565b506001600160401b0385165f90815260028901602052604090205480620030e7576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b909104811690871611156200312157604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b909104811690881611806200315a5750876001600160401b0316876001600160401b031611155b806200317e575060068901546001600160401b03600160c01b909104811690881611155b156200319d5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260048b016020526040902054600160401b9004811690861614620031e3576040516332a2a77f60e01b815260040160405180910390fd5b5f620031f48a888888868962003d40565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516200322a919062005068565b602060405180830381855afa15801562003246573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200326b919062004e49565b62003277919062004ed0565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620032bb9188919060040162005085565b602060405180830381865afa158015620032d7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620032fd9190620050c1565b6200331b576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260048c016020526040902060020154859003620033595760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b5f80620033738a62002f5d565b60078b01549091506001600160401b039081169089161015620033a95760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038916156200344b5760068a01546001600160401b03600160801b9091048116908a161115620033f35760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a165f90815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200344457604051632bd2e3e760e01b815260040160405180910390fd5b50620034ba565b6001600160401b0388165f90815260028b01602052604090205491508162003486576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b03161115620034ba57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620034ed5760405163b9b18f5760e01b815260040160405180910390fd5b5f620034fe8b8a8a8a878b62003d40565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405162003534919062005068565b602060405180830381855afa15801562003550573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019062003575919062004e49565b62003581919062004ed0565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620035c59189919060040162005085565b602060405180830381865afa158015620035e1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620036079190620050c1565b62003625576040516309bde33960e01b815260040160405180910390fd5b5f62003632848b62004dfe565b90506200368b87826001600160401b03166200364d62001c23565b62003659919062004de4565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620041c1565b80608460088282829054906101000a90046001600160401b0316620036b1919062004caf565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d1539060640162002ce4565b60068201546001600160401b03600160c01b90910481169082161115806200376c575060068201546001600160401b03600160801b9091048116908216115b156200378b5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f81815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200384662002018565b6040518263ffffffff1660e01b81526004016200386591815260200190565b5f604051808303815f87803b1580156200387d575f80fd5b505af115801562003890573d5f803e3d5ffd5b505085546001600160a01b03165f90815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801562003971575f80fd5b505af115801562003984573d5f803e3d5ffd5b505050506200108f62004215565b6200399e828262001bf9565b620010ef575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003a09828262001bf9565b15620010ef575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b5f54610100900460ff166200108f5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162001227565b620010ef828262003992565b5f82815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080545f918291829062003b439063ffffffff1662004f53565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f866001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f896001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff16021790555060815f8263ffffffff1663ffffffff1681526020019081526020015f20915086825f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550848260010160146101000a8154816001600160401b0302191690836001600160401b0316021790555085826001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555083825f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550828260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167f1c20c90adb9c53d1da3e79fb8531f2c13c52b73a31a2574202ec36fb449ab24a8689878760405162003d2e94939291906001600160401b0394851681526001600160a01b039390931660208401529216604082015260ff91909116606082015260800190565b60405180910390a25095945050505050565b6001600160401b038086165f818152600389016020526040808220549388168252902054606092911580159062003d75575081155b1562003d945760405163340c614f60e11b815260040160405180910390fd5b8062003db3576040516366385b5160e01b815260040160405180910390fd5b62003dbe8462004271565b62003ddc576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b5f62003e8b8362002f5d565b9050815f8062003e9c848462004dfe565b6085546001600160401b0391821692505f9162003ec291600160401b9004164262004ee6565b90505b846001600160401b0316846001600160401b03161462003f4b576001600160401b038085165f9081526003890160205260409020600181015490911682101562003f26576001810154600160401b90046001600160401b0316945062003f44565b62003f32868662004dfe565b6001600160401b031693505062003f4b565b5062003ec5565b5f62003f58848462004ee6565b90508381101562003fb657808403600c811162003f76578062003f79565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a608654028162003fab5762003fab62004e61565b04608655506200402d565b838103600c811162003fc9578062003fcc565b600c5b90505f816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162004005576200400562004e61565b04905080608654670de0b6b3a7640000028162004026576200402662004e61565b0460865550505b683635c9adc5dea0000060865411156200405457683635c9adc5dea000006086556200406c565b633b9aca0060865410156200406c57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b909204161115620028205760068101545f90620040c090600160c01b90046001600160401b0316600162004caf565b9050620040ce828262002f19565b15620010ef5760068201545f90600290620040fb908490600160801b90046001600160401b031662004dfe565b620041079190620050e2565b62004113908362004caf565b905062004121838262002f19565b15620041335762000f6883826200372d565b62000f6883836200372d565b606f5460ff166200416357604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b620041a3828262001bf9565b620010ef57604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905262000f68908490620042f5565b606f5460ff16156200423a57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff000000016001600160401b038316108015620042a7575067ffffffff00000001604083901c6001600160401b0316105b8015620042c8575067ffffffff00000001608083901c6001600160401b0316105b8015620042e0575067ffffffff0000000160c083901c105b15620042ee57506001919050565b505f919050565b5f6200434b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620043cd9092919063ffffffff16565b80519091501562000f6857808060200190518101906200436c9190620050c1565b62000f685760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162001227565b6060620043dd84845f85620043e5565b949350505050565b606082471015620044485760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162001227565b5f80866001600160a01b0316858760405162004465919062005068565b5f6040518083038185875af1925050503d805f8114620044a1576040519150601f19603f3d011682016040523d82523d5f602084013e620044a6565b606091505b5091509150620018198783838760608315620045265782515f036200451e576001600160a01b0385163b6200451e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001227565b5081620043dd565b620043dd83838151156200453d5781518083602001fd5b8060405162461bcd60e51b815260040162001227919062004915565b6108be806200510b83390190565b803563ffffffff8116811462002fc7575f80fd5b80356001600160401b038116811462002fc7575f80fd5b5f8060408385031215620045a4575f80fd5b620045af8362004567565b9150620045bf602084016200457b565b90509250929050565b5f60208284031215620045d9575f80fd5b62000b7c8262004567565b80610300810183101562000b7f575f80fd5b5f805f805f805f806103e0898b0312156200460f575f80fd5b6200461a8962004567565b97506200462a60208a016200457b565b96506200463a60408a016200457b565b95506200464a60608a016200457b565b94506200465a60808a016200457b565b935060a0890135925060c08901359150620046798a60e08b01620045e4565b90509295985092959890939650565b6001600160a01b038116811462002820575f80fd5b5f805f805f805f806103e0898b031215620046b6575f80fd5b620046c18962004567565b9750620046d160208a016200457b565b9650620046e160408a016200457b565b9550620046f160608a016200457b565b94506080890135935060a0890135925060c0890135620047118162004688565b9150620046798a60e08b01620045e4565b5f6020828403121562004733575f80fd5b813561ffff8116811462004745575f80fd5b9392505050565b5f602082840312156200475d575f80fd5b5035919050565b5f806040838503121562004776575f80fd5b8235915060208301356200478a8162004688565b809150509250929050565b5f60208284031215620047a6575f80fd5b62000b7c826200457b565b5f805f805f805f80610100898b031215620047ca575f80fd5b8835620047d78162004688565b9750620047e760208a016200457b565b9650620047f760408a016200457b565b95506060890135620048098162004688565b945060808901356200481b8162004688565b935060a08901356200482d8162004688565b925060c08901356200483f8162004688565b915060e0890135620048518162004688565b809150509295985092959890939650565b5f805f805f8060c0878903121562004878575f80fd5b620048838762004567565b955062004893602088016200457b565b9450620048a3604088016200457b565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b83811015620048e0578181015183820152602001620048c6565b50505f910152565b5f815180845262004901816020860160208601620048c4565b601f01601f19169290920160200192915050565b602081525f62000b7c6020830184620048e8565b5f80604083850312156200493b575f80fd5b62004946836200457b565b946020939093013593505050565b5f805f806060858703121562004968575f80fd5b8435620049758162004688565b9350620049856020860162004567565b925060408501356001600160401b0380821115620049a1575f80fd5b818701915087601f830112620049b5575f80fd5b813581811115620049c4575f80fd5b886020828501011115620049d6575f80fd5b95989497505060200194505050565b5f60208284031215620049f6575f80fd5b8135620047458162004688565b803560ff8116811462002fc7575f80fd5b5f805f805f8060c0878903121562004a2a575f80fd5b863562004a378162004688565b9550602087013562004a498162004688565b945062004a59604088016200457b565b935062004a69606088016200457b565b92506080870135915062004a8060a0880162004a03565b90509295509295509295565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011262004ab0575f80fd5b81356001600160401b038082111562004acd5762004acd62004a8c565b604051601f8301601f19908116603f0116810190828211818310171562004af85762004af862004a8c565b8160405283815286602085880101111562004b11575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f80610100898b03121562004b49575f80fd5b62004b548962004567565b975062004b6460208a016200457b565b9650604089013562004b768162004688565b9550606089013562004b888162004688565b9450608089013562004b9a8162004688565b935062004baa60a08a0162004567565b925060c08901356001600160401b038082111562004bc6575f80fd5b62004bd48c838d0162004aa0565b935060e08b013591508082111562004bea575f80fd5b5062004bf98b828c0162004aa0565b9150509295985092959890939650565b5f805f805f8060c0878903121562004c1f575f80fd5b863562004c2c8162004688565b9550602087013562004c3e8162004688565b945062004c4e604088016200457b565b935062004c5e6060880162004a03565b92506080870135915060a08701356001600160401b0381111562004c80575f80fd5b62004c8e89828a0162004aa0565b9150509295509295509295565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111562004cd25762004cd262004c9b565b5092915050565b80545f90600181811c908083168062004cf357607f831692505b6020808410820362004d1357634e487b7160e01b5f52602260045260245ffd5b8388526020880182801562004d31576001811462004d485762004d73565b60ff198716825285151560051b8201975062004d73565b5f898152602090205f5b8781101562004d6d5781548482015290860190840162004d52565b83019850505b5050505050505092915050565b6001600160a01b0387811682528616602082015260c0604082018190525f9062004dad9083018762004cd9565b828103606084015262004dc1818762004cd9565b9150508360808301526001600160401b03831660a0830152979650505050505050565b808202811582820484141762000b7f5762000b7f62004c9b565b6001600160401b0382811682821603908082111562004cd25762004cd262004c9b565b5f6001600160401b0380831681810362004e3f5762004e3f62004c9b565b6001019392505050565b5f6020828403121562004e5a575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8262004e865762004e8662004e61565b500490565b8082018082111562000b7f5762000b7f62004c9b565b634e487b7160e01b5f52603260045260245ffd5b5f6001820162004ec95762004ec962004c9b565b5060010190565b5f8262004ee15762004ee162004e61565b500690565b8181038181111562000b7f5762000b7f62004c9b565b5f8162004f0d5762004f0d62004c9b565b505f190190565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b5f63ffffffff80831681810362004e3f5762004e3f62004c9b565b6001600160a01b038481168252831660208201526060604082018190525f9062004f9b90830184620048e8565b95945050505050565b6001600160a01b038881168252878116602083015263ffffffff878116604084015290861660608301528416608082015260e060a082018190525f9062004fee90830185620048e8565b82810360c0840152620050028185620048e8565b9a9950505050505050505050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190525f906200505c90830184620048e8565b98975050505050505050565b5f82516200507b818460208701620048c4565b9190910192915050565b6103208101610300808584378201835f5b6001811015620050b757815183526020928301929091019060010162005096565b5050509392505050565b5f60208284031215620050d2575f80fd5b8151801515811462004745575f80fd5b5f6001600160401b0380841680620050fe57620050fe62004e61565b9216919091049291505056fe60a0604052604051620008be380380620008be8339810160408190526100249161034d565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b6565b505050610432565b61006182610124565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100aa576100a582826101a2565b505050565b6100b2610215565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f65f805160206200089e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161012181610236565b50565b806001600160a01b03163b5f0361015e57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516101be9190610417565b5f60405180830381855af49150503d805f81146101f6576040519150601f19603f3d011682016040523d82523d5f602084013e6101fb565b606091505b50909250905061020c858383610274565b95945050505050565b34156102345760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661025f57604051633173bdd160e11b81525f6004820152602401610155565b805f805160206200089e833981519152610181565b60608261028957610284826102d3565b6102cc565b81511580156102a057506001600160a01b0384163b155b156102c957604051639996b31560e01b81526001600160a01b0385166004820152602401610155565b50805b9392505050565b8051156102e35780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b0381168114610312575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561034557818101518382015260200161032d565b50505f910152565b5f805f6060848603121561035f575f80fd5b610368846102fc565b9250610376602085016102fc565b60408501519092506001600160401b0380821115610392575f80fd5b818601915086601f8301126103a5575f80fd5b8151818111156103b7576103b7610317565b604051601f8201601f19908116603f011681019083821181831017156103df576103df610317565b816040528281528960208487010111156103f7575f80fd5b61040883602083016020880161032b565b80955050505050509250925092565b5f825161042881846020870161032b565b9190910192915050565b6080516104546200044a5f395f601001526104545ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610069575f356001600160e01b03191663278f794360e11b146100615761005f61006d565b565b61005f61007d565b61005f5b61005f6100786100ab565b6100e2565b5f8061008c36600481846102ee565b8101906100999190610329565b915091506100a78282610100565b5050565b5f6100dd7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156100fc573d5ff35b3d5ffd5b6101098261015a565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101525761014d82826101d5565b505050565b6100a7610247565b806001600160a01b03163b5f0361019457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101f191906103f2565b5f60405180830381855af49150503d805f8114610229576040519150601f19603f3d011682016040523d82523d5f602084013e61022e565b606091505b509150915061023e858383610266565b95945050505050565b341561005f5760405163b398979f60e01b815260040160405180910390fd5b60608261027b57610276826102c5565b6102be565b815115801561029257506001600160a01b0384163b155b156102bb57604051639996b31560e01b81526001600160a01b038516600482015260240161018b565b50805b9392505050565b8051156102d55780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f80858511156102fc575f80fd5b83861115610308575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561033a575f80fd5b82356001600160a01b0381168114610350575f80fd5b9150602083013567ffffffffffffffff8082111561036c575f80fd5b818501915085601f83011261037f575f80fd5b81358181111561039157610391610315565b604051601f8201601f19908116603f011681019083821181831017156103b9576103b9610315565b816040528281528860208487010111156103d1575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b8181101561041157602081860181015185830152016103f7565b505f92019182525091905056fea2646970667358221220c49d991c000dd664fa67a05338f92aab4c71dc2b0db71e34e45488392b18ca4864736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220b4c0235190db25024bb30303391a6c88badbf76da86f61db9b19b9f2ce467d3564736f6c63430008140033", + "bytecode": "0x60e060405234801562000010575f80fd5b5060405162005d4f38038062005d4f833981016040819052620000339162000136565b6001600160a01b0380841660805282811660c052811660a052620000566200005f565b50505062000187565b5f54610100900460ff1615620000cb5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811610156200011c575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811462000133575f80fd5b50565b5f805f6060848603121562000149575f80fd5b835162000156816200011e565b602085015190935062000169816200011e565b60408501519092506200017c816200011e565b809150509250925092565b60805160a05160c051615b65620001ea5f395f8181610a1c0152818161211e0152613a1501525f81816107d701528181612cae0152613d0401525f8181610976015281816111b60152818161135e01528181611e690152613bf90152615b655ff3fe608060405234801562000010575f80fd5b50600436106200030c575f3560e01c8063841b24d711620001a3578063c1acbc3411620000f3578063dbc16976116200009b578063dbc1697614620009da578063dde0ff7714620009e4578063e0bfd3d214620009ff578063e46761c41462000a16578063f34eb8eb1462000a3e578063f4e926751462000a55578063f9c4c2ae1462000a66575f80fd5b8063c1acbc341462000916578063c4c928c21462000931578063ceee281d1462000948578063d02103ca1462000970578063d5073f6f1462000998578063d547741f14620009af578063d939b31514620009c6575f80fd5b80639c9f3dfe11620001575780639c9f3dfe1462000791578063a066215c14620007a8578063a217fddf14620007bf578063a2967d9914620007c7578063a3c573eb14620007d1578063afd23cbe1462000812578063b99d0ad7146200083c575f80fd5b8063841b24d7146200071057806387c20c01146200072b5780638bd4f071146200074257806391d14854146200075957806399f5634e14620007705780639a908e73146200077a575f80fd5b806325280169116200025f57806355a71ee0116200021357806355a71ee014620005995780636046916914620005dc57806365c0504d14620005e65780637222020f1462000694578063727885e914620006ab5780637975fcfe14620006c25780637fb6e76a14620006e8575f80fd5b80632528016914620004835780632f2ff15d146200053757806330c27dde146200054e57806336568abe1462000562578063394218e91462000579578063477fa2701462000590575f80fd5b80631489ed1011620002c35780631489ed1014620003cb57806315064c9614620003e25780631608859c14620003f05780631796a1ae14620004075780631816b7e5146200042e5780632072f6c51462000445578063248a9ca3146200044f575f80fd5b80630645af091462000310578063066ec0121462000329578063080b3111146200035a5780630a0d9fbe146200038257806311f6b287146200039d57806312b86e1914620003b4575b5f80fd5b6200032762000321366004620046a3565b62000b7c565b005b6084546200033d906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b620003716200036b3660046200478c565b620010c5565b604051901515815260200162000351565b6085546200033d90600160401b90046001600160401b031681565b6200033d620003ae366004620047c2565b620010ee565b62000327620003c5366004620047f0565b6200110d565b62000327620003dc36600462004882565b620012b5565b606f54620003719060ff1681565b62000327620004013660046200478c565b62001443565b607e54620004189063ffffffff1681565b60405163ffffffff909116815260200162000351565b620003276200043f36600462004907565b620014d6565b6200032762001581565b620004746200046036600462004931565b5f9081526034602052604090206001015490565b60405190815260200162000351565b62000503620004943660046200478c565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b0390811691830191909152928201519092169082015260600162000351565b620003276200054836600462004949565b62001646565b6087546200033d906001600160401b031681565b620003276200057336600462004949565b6200166e565b620003276200058a3660046200497a565b620016a8565b60865462000474565b62000474620005aa3660046200478c565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620004746200175b565b6200064a620005f7366004620047c2565b607f6020525f90815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c00162000351565b62000327620006a5366004620047c2565b62001772565b62000327620006bc36600462004a3a565b6200186c565b620006d9620006d336600462004b00565b62001cc9565b60405162000351919062004bb3565b62000418620006f93660046200497a565b60836020525f908152604090205463ffffffff1681565b6084546200033d90600160c01b90046001600160401b031681565b620003276200073c36600462004882565b62001cfb565b6200032762000753366004620047f0565b6200201c565b620003716200076a36600462004949565b620020d3565b62000474620020fd565b6200033d6200078b36600462004bc7565b620021de565b62000327620007a23660046200497a565b620023aa565b62000327620007b93660046200497a565b6200244f565b620004745f81565b62000474620024f2565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200162000351565b6085546200082890600160801b900461ffff1681565b60405161ffff909116815260200162000351565b620008d16200084d3660046200478c565b60408051608080820183525f8083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b6040516200035191905f6080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200033d90600160801b90046001600160401b031681565b620003276200094236600462004bf2565b620028ba565b620004186200095936600462004c83565b60826020525f908152604090205463ffffffff1681565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b62000327620009a936600462004931565b62002b90565b62000327620009c036600462004949565b62002c2c565b6085546200033d906001600160401b031681565b6200032762002c54565b6084546200033d90600160401b90046001600160401b031681565b6200032762000a1036600462004cb2565b62002d20565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b6200032762000a4f36600462004d2a565b62002df4565b608054620004189063ffffffff1681565b62000afc62000a77366004620047c2565b60816020525f9081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff166101608201526101800162000351565b5f54600290610100900460ff1615801562000b9d57505f5460ff8083169116105b62000c065760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c8662002fe8565b62000ca05f8051602062005b108339815191528c62003054565b62000cac5f8862003054565b62000cd87fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908862003054565b62000d047f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8862003054565b62000d307f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8862003054565b62000d5c7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8962003054565b62000d887fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088962003054565b62000db47f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48962003054565b62000dce5f8051602062005ad08339815191528962003054565b62000e085f8051602062005b108339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062003060565b62000e347f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08962003054565b62000e607f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8962003054565b62000e9a5f8051602062005af08339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162003060565b62000eb45f8051602062005af08339815191528762003054565b62000ee07f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518762003054565b6073546074546001600160401b03600160401b9092048216911680821462000f1b57604051632e4cc54360e11b815260040160405180910390fd5b5f62000f40888888885f60745f9054906101000a90046001600160401b0316620030aa565b6001600160401b038381165f81815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b91829004909b1681029a909a17905560068a01805490911690931797870297909717909155600787018054909616909417909455607a54606f549390915290549251635d6717a560e01b81529394506001600160a01b038c811694635d6717a5946200103e9493831693600160581b9004909216916076916077919060040162004e63565b5f604051808303815f87803b15801562001056575f80fd5b505af115801562001069573d5f803e3d5ffd5b50505f805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620010b09050565b60405180910390a15050505050505050505050565b63ffffffff82165f908152608160205260408120620010e59083620032cb565b90505b92915050565b63ffffffff81165f908152608160205260408120620010e8906200330f565b5f8051602062005b1083398151915262001127816200337e565b63ffffffff89165f9081526081602052604090206200114d818a8a8a8a8a8a8a6200338a565b600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b90041615620011b4576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620011ed620024f2565b6040518263ffffffff1660e01b81526004016200120c91815260200190565b5f604051808303815f87803b15801562001224575f80fd5b505af115801562001237573d5f803e3d5ffd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b5f8051602062005b10833981519152620012cf816200337e565b63ffffffff89165f908152608160205260409020620012f5818a8a8a8a8a8a8a62003718565b600681018054600160401b600160801b031916600160401b6001600160401b038a81169182029290921783555f9081526002840160205260409020879055600583018890559054600160801b900416156200135c576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001395620024f2565b6040518263ffffffff1660e01b8152600401620013b491815260200190565b5f604051808303815f87803b158015620013cc575f80fd5b505af1158015620013df573d5f803e3d5ffd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff82165f908152608160205260409020620014715f8051602062005b1083398151915233620020d3565b620014c557606f5460ff16156200149b57604051630bc011ff60e21b815260040160405180910390fd5b620014a78183620032cb565b620014c557604051630674f25160e11b815260040160405180910390fd5b620014d1818362003b17565b505050565b5f8051602062005ad0833981519152620014f0816200337e565b6103e88261ffff1610806200150a57506103ff8261ffff16115b156200152957604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200159b5f8051602062005af083398151915233620020d3565b6200163a57608454600160801b90046001600160401b03161580620015eb57506084544290620015e09062093a8090600160801b90046001600160401b031662004ecb565b6001600160401b0316115b806200161b57506087544290620016109062093a80906001600160401b031662004ecb565b6001600160401b0316115b156200163a5760405163692baaad60e11b815260040160405180910390fd5b6200164462003d02565b565b5f8281526034602052604090206001015462001662816200337e565b620014d1838362003d7c565b6001600160a01b03811633146200169857604051630b4ad1cd60e31b815260040160405180910390fd5b620016a4828262003de7565b5050565b5f8051602062005ad0833981519152620016c2816200337e565b606f5460ff1662001704576084546001600160401b03600160c01b909104811690831610620017045760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19060200162001575565b5f60865460646200176d919062004ef5565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd6200179e816200337e565b63ffffffff82161580620017bd5750607e5463ffffffff908116908316115b15620017dc57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f60205260409020600180820154600160e81b900460ff16151590036200182257604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd0862001898816200337e565b63ffffffff88161580620018b75750607e5463ffffffff908116908916115b15620018d657604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88165f908152607f60205260409020600180820154600160e81b900460ff16151590036200191c57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b0388165f9081526083602052604090205463ffffffff161562001959576040516337c8fe0960e11b815260040160405180910390fd5b608080545f91908290620019739063ffffffff1662004f0f565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b03909216913091620019c09062004669565b620019ce9392919062004f34565b604051809103905ff080158015620019e8573d5f803e3d5ffd5b5090508160835f8c6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508a815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001c4c949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001c8c908d908d9088908e908e908e9060040162004f6a565b5f604051808303815f87803b15801562001ca4575f80fd5b505af115801562001cb7573d5f803e3d5ffd5b50505050505050505050505050505050565b63ffffffff86165f90815260816020526040902060609062001cf090878787878762003e50565b979650505050505050565b606f5460ff161562001d2057604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001d6e92600160c01b90048116911662004ecb565b6001600160401b0316111562001d9757604051638a0704d360e01b815260040160405180910390fd5b6103e862001da6888862004fcc565b6001600160401b0316111562001dcf57604051635acfba9d60e11b815260040160405180910390fd5b62001de1818989898989898962003718565b62001ded818762003f8f565b6085546001600160401b03165f0362001ef457600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562001e67576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001ea0620024f2565b6040518263ffffffff1660e01b815260040162001ebf91815260200190565b5f604051808303815f87803b15801562001ed7575f80fd5b505af115801562001eea573d5f803e3d5ffd5b5050505062001fbd565b62001eff8162004186565b600681018054600160801b90046001600160401b031690601062001f238362004fef565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b900487165f90815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff16156200204157604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602052604090206200206781898989898989896200338a565b6001600160401b0387165f9081526004820160209081526040918290206002015482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620020c862003d02565b505050505050505050565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b81523060048201525f9081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562002164573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200218a91906200500d565b6084549091505f90620021b0906001600160401b03600160401b82048116911662004fcc565b6001600160401b03169050805f03620021cb575f9250505090565b620021d7818362005039565b9250505090565b606f545f9060ff16156200220557604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff16908190036200223c576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f036200226657604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f9081526081602052604081206084805491928792620022989084906001600160401b031662004ecb565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f620022cd878362004ecb565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f95865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200235c8362004186565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b5f8051602062005ad0833981519152620023c4816200337e565b606f5460ff16620023ff576085546001600160401b0390811690831610620023ff5760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759060200162001575565b5f8051602062005ad083398151915262002469816200337e565b62015180826001600160401b031611156200249757604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289060200162001575565b6080545f9063ffffffff168082036200250c57505f919050565b5f816001600160401b0381111562002528576200252862004996565b60405190808252806020026020018201604052801562002552578160200160208202803683370190505b5090505f5b82811015620025c25760815f620025708360016200504f565b63ffffffff1663ffffffff1681526020019081526020015f2060050154828281518110620025a257620025a262005065565b602090810291909101015280620025b98162005079565b91505062002557565b505f60205b836001146200281a575f620025de60028662005094565b620025eb60028762005039565b620025f791906200504f565b90505f816001600160401b0381111562002615576200261562004996565b6040519080825280602002602001820160405280156200263f578160200160208202803683370190505b5090505f5b82811015620027c6576200265a600184620050aa565b811480156200267557506200267160028862005094565b6001145b15620026fd57856200268982600262004ef5565b815181106200269c576200269c62005065565b602002602001015185604051602001620026c0929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620026eb57620026eb62005065565b602002602001018181525050620027b1565b856200270b82600262004ef5565b815181106200271e576200271e62005065565b60200260200101518682600262002736919062004ef5565b620027439060016200504f565b8151811062002756576200275662005065565b602002602001015160405160200162002779929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620027a457620027a462005065565b6020026020010181815250505b80620027bd8162005079565b91505062002644565b508094508195508384604051602001620027ea929190918252602082015260400190565b60405160208183030381529060405280519060200120935082806200280f90620050c0565b9350505050620025c7565b5f835f8151811062002830576200283062005065565b602002602001015190505f5b82811015620028b057604080516020810184905290810185905260600160408051601f19818403018152828252805160209182012090830187905290820186905292506060016040516020818303038152906040528051906020012093508080620028a79062005079565b9150506200283c565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac620028e6816200337e565b63ffffffff84161580620029055750607e5463ffffffff908116908516115b156200292457604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526082602052604081205463ffffffff169081900362002964576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918716600160401b9091046001600160401b031603620029b257604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86165f908152607f60205260409020600180820154600160e81b900460ff1615159003620029f857604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002a3657604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790555f62002ab584620010ee565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002b0b9216908b908b90600401620050d8565b5f604051808303815f87803b15801562002b23575f80fd5b505af115801562002b36573d5f803e3d5ffd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002bbc816200337e565b683635c9adc5dea0000082118062002bd75750633b9aca0082105b1562002bf657604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001575565b5f8281526034602052604090206001015462002c48816200337e565b620014d1838362003de7565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002c80816200337e565b6087805467ffffffffffffffff1916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc16976916004808301925f92919082900301818387803b15801562002cfc575f80fd5b505af115801562002d0f573d5f803e3d5ffd5b5050505062002d1d6200424f565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62002d4c816200337e565b6001600160401b0384165f9081526083602052604090205463ffffffff161562002d89576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b0387165f9081526082602052604090205463ffffffff161562002dc657604051630d409b9360e41b815260040160405180910390fd5b5f62002dd788888888875f620030aa565b5f8080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002e20816200337e565b607e80545f9190829062002e3a9063ffffffff1662004f0f565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff1681526020015f1515815260200185815250607f5f8363ffffffff1663ffffffff1681526020019081526020015f205f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002fd69695949392919062005117565b60405180910390a25050505050505050565b5f54610100900460ff16620016445760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000bfd565b620016a4828262003d7c565b5f82815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080545f9182918290620030c59063ffffffff1662004f0f565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f876001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff16021790555060815f8263ffffffff1663ffffffff1681526020019081526020015f20915087825f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b0316021790555086826001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555084825f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620032b89594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b038281165f90815260048501602052604081205490924292620032fd92918116911662004ecb565b6001600160401b031611159392505050565b60068101545f90600160801b90046001600160401b03161562003361575060068101546001600160401b03600160801b90910481165f9081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002d1d8133620042a7565b60078801545f906001600160401b039081169087161015620033bf5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038816156200345f5760068901546001600160401b03600160801b90910481169089161115620034095760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f90815260048a0160205260409020600281015481549092888116600160401b90920416146200345857604051632bd2e3e760e01b815260040160405180910390fd5b50620034d3565b506001600160401b0385165f9081526002890160205260409020548062003499576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620034d357604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b909104811690881611806200350c5750876001600160401b0316876001600160401b031611155b8062003530575060068901546001600160401b03600160c01b909104811690881611155b156200354f5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260048b016020526040902054600160401b900481169086161462003595576040516332a2a77f60e01b815260040160405180910390fd5b5f620035a68a888888868962003e50565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620035dc91906200516f565b602060405180830381855afa158015620035f8573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200361d91906200500d565b62003629919062005094565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200366d918891906004016200518c565b602060405180830381865afa15801562003689573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620036af9190620051c8565b620036cd576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260048c0160205260409020600201548590036200370b5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b5f80620037258a6200330f565b60078b01549091506001600160401b0390811690891610156200375b5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620037fd5760068a01546001600160401b03600160801b9091048116908a161115620037a55760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a165f90815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620037f657604051632bd2e3e760e01b815260040160405180910390fd5b506200386c565b6001600160401b0388165f90815260028b01602052604090205491508162003838576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200386c57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b0316116200389f5760405163b9b18f5760e01b815260040160405180910390fd5b5f620038b08b8a8a8a878b62003e50565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620038e691906200516f565b602060405180830381855afa15801562003902573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200392791906200500d565b62003933919062005094565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003977918991906004016200518c565b602060405180830381865afa15801562003993573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620039b99190620051c8565b620039d7576040516309bde33960e01b815260040160405180910390fd5b5f620039e4848b62004fcc565b905062003a3d87826001600160401b0316620039ff620020fd565b62003a0b919062004ef5565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620042d1565b80608460088282829054906101000a90046001600160401b031662003a63919062004ecb565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d153906064015f604051808303815f87803b15801562003af1575f80fd5b505af115801562003b04573d5f803e3d5ffd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003b56575060068201546001600160401b03600160801b9091048116908216115b1562003b755760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f81815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003c30620024f2565b6040518263ffffffff1660e01b815260040162003c4f91815260200190565b5f604051808303815f87803b15801562003c67575f80fd5b505af115801562003c7a573d5f803e3d5ffd5b505085546001600160a01b03165f90815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801562003d5b575f80fd5b505af115801562003d6e573d5f803e3d5ffd5b505050506200164462004325565b62003d888282620020d3565b620016a4575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003df38282620020d3565b15620016a4575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086165f818152600389016020526040808220549388168252902054606092911580159062003e85575081155b1562003ea45760405163340c614f60e11b815260040160405180910390fd5b8062003ec3576040516366385b5160e01b815260040160405180910390fd5b62003ece8462004381565b62003eec576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b5f62003f9b836200330f565b9050815f8062003fac848462004fcc565b6085546001600160401b0391821692505f9162003fd291600160401b90041642620050aa565b90505b846001600160401b0316846001600160401b0316146200405b576001600160401b038085165f9081526003890160205260409020600181015490911682101562004036576001810154600160401b90046001600160401b0316945062004054565b62004042868662004fcc565b6001600160401b03169350506200405b565b5062003fd5565b5f620040688484620050aa565b905083811015620040c657808403600c811162004086578062004089565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620040bb57620040bb62005025565b04608655506200413d565b838103600c8111620040d95780620040dc565b600c5b90505f816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162004115576200411562005025565b04905080608654670de0b6b3a7640000028162004136576200413662005025565b0460865550505b683635c9adc5dea0000060865411156200416457683635c9adc5dea000006086556200417c565b633b9aca0060865410156200417c57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002d1d5760068101545f90620041d090600160c01b90046001600160401b0316600162004ecb565b9050620041de8282620032cb565b15620016a45760068201545f906002906200420b908490600160801b90046001600160401b031662004fcc565b620042179190620051e9565b62004223908362004ecb565b9050620042318382620032cb565b156200424357620014d1838262003b17565b620014d1838362003b17565b606f5460ff166200427357604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b620042b38282620020d3565b620016a457604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620014d190849062004405565b606f5460ff16156200434a57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff000000016001600160401b038316108015620043b7575067ffffffff00000001604083901c6001600160401b0316105b8015620043d8575067ffffffff00000001608083901c6001600160401b0316105b8015620043f0575067ffffffff0000000160c083901c105b15620043fe57506001919050565b505f919050565b5f6200445b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620044dd9092919063ffffffff16565b805190915015620014d157808060200190518101906200447c9190620051c8565b620014d15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000bfd565b6060620044ed84845f85620044f5565b949350505050565b606082471015620045585760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000bfd565b5f80866001600160a01b031685876040516200457591906200516f565b5f6040518083038185875af1925050503d805f8114620045b1576040519150601f19603f3d011682016040523d82523d5f602084013e620045b6565b606091505b509150915062001cf08783838760608315620046365782515f036200462e576001600160a01b0385163b6200462e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000bfd565b5081620044ed565b620044ed83838151156200464d5781518083602001fd5b8060405162461bcd60e51b815260040162000bfd919062004bb3565b6108be806200521283390190565b6001600160a01b038116811462002d1d575f80fd5b80356001600160401b038116811462003379575f80fd5b5f805f805f805f805f806101408b8d031215620046be575f80fd5b8a35620046cb8162004677565b9950620046db60208c016200468c565b9850620046eb60408c016200468c565b975060608b0135620046fd8162004677565b965060808b01356200470f8162004677565b955060a08b0135620047218162004677565b945060c08b0135620047338162004677565b935060e08b0135620047458162004677565b9250620047566101008c016200468c565b9150620047676101208c016200468c565b90509295989b9194979a5092959850565b803563ffffffff8116811462003379575f80fd5b5f80604083850312156200479e575f80fd5b620047a98362004778565b9150620047b9602084016200468c565b90509250929050565b5f60208284031215620047d3575f80fd5b620010e58262004778565b806103008101831015620010e8575f80fd5b5f805f805f805f806103e0898b03121562004809575f80fd5b620048148962004778565b97506200482460208a016200468c565b96506200483460408a016200468c565b95506200484460608a016200468c565b94506200485460808a016200468c565b935060a0890135925060c08901359150620048738a60e08b01620047de565b90509295985092959890939650565b5f805f805f805f806103e0898b0312156200489b575f80fd5b620048a68962004778565b9750620048b660208a016200468c565b9650620048c660408a016200468c565b9550620048d660608a016200468c565b94506080890135935060a0890135925060c0890135620048f68162004677565b9150620048738a60e08b01620047de565b5f6020828403121562004918575f80fd5b813561ffff811681146200492a575f80fd5b9392505050565b5f6020828403121562004942575f80fd5b5035919050565b5f80604083850312156200495b575f80fd5b8235915060208301356200496f8162004677565b809150509250929050565b5f602082840312156200498b575f80fd5b620010e5826200468c565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620049ba575f80fd5b81356001600160401b0380821115620049d757620049d762004996565b604051601f8301601f19908116603f0116810190828211818310171562004a025762004a0262004996565b8160405283815286602085880101111562004a1b575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a03121562004a51575f80fd5b62004a5c8862004778565b965062004a6c602089016200468c565b9550604088013562004a7e8162004677565b9450606088013562004a908162004677565b9350608088013562004aa28162004677565b925060a08801356001600160401b038082111562004abe575f80fd5b62004acc8b838c01620049aa565b935060c08a013591508082111562004ae2575f80fd5b5062004af18a828b01620049aa565b91505092959891949750929550565b5f805f805f8060c0878903121562004b16575f80fd5b62004b218762004778565b955062004b31602088016200468c565b945062004b41604088016200468c565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b8381101562004b7e57818101518382015260200162004b64565b50505f910152565b5f815180845262004b9f81602086016020860162004b62565b601f01601f19169290920160200192915050565b602081525f620010e5602083018462004b86565b5f806040838503121562004bd9575f80fd5b62004be4836200468c565b946020939093013593505050565b5f805f806060858703121562004c06575f80fd5b843562004c138162004677565b935062004c236020860162004778565b925060408501356001600160401b038082111562004c3f575f80fd5b818701915087601f83011262004c53575f80fd5b81358181111562004c62575f80fd5b88602082850101111562004c74575f80fd5b95989497505060200194505050565b5f6020828403121562004c94575f80fd5b81356200492a8162004677565b803560ff8116811462003379575f80fd5b5f805f805f8060c0878903121562004cc8575f80fd5b863562004cd58162004677565b9550602087013562004ce78162004677565b945062004cf7604088016200468c565b935062004d07606088016200468c565b92506080870135915062004d1e60a0880162004ca1565b90509295509295509295565b5f805f805f8060c0878903121562004d40575f80fd5b863562004d4d8162004677565b9550602087013562004d5f8162004677565b945062004d6f604088016200468c565b935062004d7f6060880162004ca1565b92506080870135915060a08701356001600160401b0381111562004da1575f80fd5b62004daf89828a01620049aa565b9150509295509295509295565b80545f90600181811c908083168062004dd657607f831692505b6020808410820362004df657634e487b7160e01b5f52602260045260245ffd5b8388526020880182801562004e14576001811462004e2b5762004e56565b60ff198716825285151560051b8201975062004e56565b5f898152602090205f5b8781101562004e505781548482015290860190840162004e35565b83019850505b5050505050505092915050565b6001600160a01b0386811682528516602082015260a0604082018190525f9062004e909083018662004dbc565b828103606084015262004ea4818662004dbc565b9150508260808301529695505050505050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111562004eee5762004eee62004eb7565b5092915050565b8082028115828204841417620010e857620010e862004eb7565b5f63ffffffff80831681810362004f2a5762004f2a62004eb7565b6001019392505050565b6001600160a01b038481168252831660208201526060604082018190525f9062004f619083018462004b86565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190525f9062004fab9083018562004b86565b82810360a084015262004fbf818562004b86565b9998505050505050505050565b6001600160401b0382811682821603908082111562004eee5762004eee62004eb7565b5f6001600160401b0380831681810362004f2a5762004f2a62004eb7565b5f602082840312156200501e575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f826200504a576200504a62005025565b500490565b80820180821115620010e857620010e862004eb7565b634e487b7160e01b5f52603260045260245ffd5b5f600182016200508d576200508d62004eb7565b5060010190565b5f82620050a557620050a562005025565b500690565b81810381811115620010e857620010e862004eb7565b5f81620050d157620050d162004eb7565b505f190190565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190525f90620051639083018462004b86565b98975050505050505050565b5f82516200518281846020870162004b62565b9190910192915050565b6103208101610300808584378201835f5b6001811015620051be5781518352602092830192909101906001016200519d565b5050509392505050565b5f60208284031215620051d9575f80fd5b815180151581146200492a575f80fd5b5f6001600160401b038084168062005205576200520562005025565b9216919091049291505056fe60a0604052604051620008be380380620008be8339810160408190526100249161034d565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b6565b505050610432565b61006182610124565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100aa576100a582826101a2565b505050565b6100b2610215565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f65f805160206200089e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161012181610236565b50565b806001600160a01b03163b5f0361015e57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516101be9190610417565b5f60405180830381855af49150503d805f81146101f6576040519150601f19603f3d011682016040523d82523d5f602084013e6101fb565b606091505b50909250905061020c858383610274565b95945050505050565b34156102345760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661025f57604051633173bdd160e11b81525f6004820152602401610155565b805f805160206200089e833981519152610181565b60608261028957610284826102d3565b6102cc565b81511580156102a057506001600160a01b0384163b155b156102c957604051639996b31560e01b81526001600160a01b0385166004820152602401610155565b50805b9392505050565b8051156102e35780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b0381168114610312575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561034557818101518382015260200161032d565b50505f910152565b5f805f6060848603121561035f575f80fd5b610368846102fc565b9250610376602085016102fc565b60408501519092506001600160401b0380821115610392575f80fd5b818601915086601f8301126103a5575f80fd5b8151818111156103b7576103b7610317565b604051601f8201601f19908116603f011681019083821181831017156103df576103df610317565b816040528281528960208487010111156103f7575f80fd5b61040883602083016020880161032b565b80955050505050509250925092565b5f825161042881846020870161032b565b9190910192915050565b6080516104546200044a5f395f601001526104545ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610069575f356001600160e01b03191663278f794360e11b146100615761005f61006d565b565b61005f61007d565b61005f5b61005f6100786100ab565b6100e2565b5f8061008c36600481846102ee565b8101906100999190610329565b915091506100a78282610100565b5050565b5f6100dd7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156100fc573d5ff35b3d5ffd5b6101098261015a565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101525761014d82826101d5565b505050565b6100a7610247565b806001600160a01b03163b5f0361019457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101f191906103f2565b5f60405180830381855af49150503d805f8114610229576040519150601f19603f3d011682016040523d82523d5f602084013e61022e565b606091505b509150915061023e858383610266565b95945050505050565b341561005f5760405163b398979f60e01b815260040160405180910390fd5b60608261027b57610276826102c5565b6102be565b815115801561029257506001600160a01b0384163b155b156102bb57604051639996b31560e01b81526001600160a01b038516600482015260240161018b565b50805b9392505050565b8051156102d55780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f80858511156102fc575f80fd5b83861115610308575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561033a575f80fd5b82356001600160a01b0381168114610350575f80fd5b9150602083013567ffffffffffffffff8082111561036c575f80fd5b818501915085601f83011261037f575f80fd5b81358181111561039157610391610315565b604051601f8201601f19908116603f011681019083821181831017156103b9576103b9610315565b816040528281528860208487010111156103d1575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b8181101561041157602081860181015185830152016103f7565b505f92019182525091905056fea2646970667358221220c3817d11eb3dc87723342527d38da55b7b3b362f54567f56cf1ef4db2f8a430664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a264697066735822122007e10c372a0db7fc583e3a5f3da00fa16274fbf3032428aa7025177f0dee4cdf64736f6c63430008140033", + "deployedBytecode": "0x608060405234801562000010575f80fd5b50600436106200030c575f3560e01c8063841b24d711620001a3578063c1acbc3411620000f3578063dbc16976116200009b578063dbc1697614620009da578063dde0ff7714620009e4578063e0bfd3d214620009ff578063e46761c41462000a16578063f34eb8eb1462000a3e578063f4e926751462000a55578063f9c4c2ae1462000a66575f80fd5b8063c1acbc341462000916578063c4c928c21462000931578063ceee281d1462000948578063d02103ca1462000970578063d5073f6f1462000998578063d547741f14620009af578063d939b31514620009c6575f80fd5b80639c9f3dfe11620001575780639c9f3dfe1462000791578063a066215c14620007a8578063a217fddf14620007bf578063a2967d9914620007c7578063a3c573eb14620007d1578063afd23cbe1462000812578063b99d0ad7146200083c575f80fd5b8063841b24d7146200071057806387c20c01146200072b5780638bd4f071146200074257806391d14854146200075957806399f5634e14620007705780639a908e73146200077a575f80fd5b806325280169116200025f57806355a71ee0116200021357806355a71ee014620005995780636046916914620005dc57806365c0504d14620005e65780637222020f1462000694578063727885e914620006ab5780637975fcfe14620006c25780637fb6e76a14620006e8575f80fd5b80632528016914620004835780632f2ff15d146200053757806330c27dde146200054e57806336568abe1462000562578063394218e91462000579578063477fa2701462000590575f80fd5b80631489ed1011620002c35780631489ed1014620003cb57806315064c9614620003e25780631608859c14620003f05780631796a1ae14620004075780631816b7e5146200042e5780632072f6c51462000445578063248a9ca3146200044f575f80fd5b80630645af091462000310578063066ec0121462000329578063080b3111146200035a5780630a0d9fbe146200038257806311f6b287146200039d57806312b86e1914620003b4575b5f80fd5b6200032762000321366004620046a3565b62000b7c565b005b6084546200033d906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b620003716200036b3660046200478c565b620010c5565b604051901515815260200162000351565b6085546200033d90600160401b90046001600160401b031681565b6200033d620003ae366004620047c2565b620010ee565b62000327620003c5366004620047f0565b6200110d565b62000327620003dc36600462004882565b620012b5565b606f54620003719060ff1681565b62000327620004013660046200478c565b62001443565b607e54620004189063ffffffff1681565b60405163ffffffff909116815260200162000351565b620003276200043f36600462004907565b620014d6565b6200032762001581565b620004746200046036600462004931565b5f9081526034602052604090206001015490565b60405190815260200162000351565b62000503620004943660046200478c565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b0390811691830191909152928201519092169082015260600162000351565b620003276200054836600462004949565b62001646565b6087546200033d906001600160401b031681565b620003276200057336600462004949565b6200166e565b620003276200058a3660046200497a565b620016a8565b60865462000474565b62000474620005aa3660046200478c565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620004746200175b565b6200064a620005f7366004620047c2565b607f6020525f90815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c00162000351565b62000327620006a5366004620047c2565b62001772565b62000327620006bc36600462004a3a565b6200186c565b620006d9620006d336600462004b00565b62001cc9565b60405162000351919062004bb3565b62000418620006f93660046200497a565b60836020525f908152604090205463ffffffff1681565b6084546200033d90600160c01b90046001600160401b031681565b620003276200073c36600462004882565b62001cfb565b6200032762000753366004620047f0565b6200201c565b620003716200076a36600462004949565b620020d3565b62000474620020fd565b6200033d6200078b36600462004bc7565b620021de565b62000327620007a23660046200497a565b620023aa565b62000327620007b93660046200497a565b6200244f565b620004745f81565b62000474620024f2565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200162000351565b6085546200082890600160801b900461ffff1681565b60405161ffff909116815260200162000351565b620008d16200084d3660046200478c565b60408051608080820183525f8083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b6040516200035191905f6080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200033d90600160801b90046001600160401b031681565b620003276200094236600462004bf2565b620028ba565b620004186200095936600462004c83565b60826020525f908152604090205463ffffffff1681565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b62000327620009a936600462004931565b62002b90565b62000327620009c036600462004949565b62002c2c565b6085546200033d906001600160401b031681565b6200032762002c54565b6084546200033d90600160401b90046001600160401b031681565b6200032762000a1036600462004cb2565b62002d20565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b6200032762000a4f36600462004d2a565b62002df4565b608054620004189063ffffffff1681565b62000afc62000a77366004620047c2565b60816020525f9081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff166101608201526101800162000351565b5f54600290610100900460ff1615801562000b9d57505f5460ff8083169116105b62000c065760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c8662002fe8565b62000ca05f8051602062005b108339815191528c62003054565b62000cac5f8862003054565b62000cd87fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908862003054565b62000d047f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8862003054565b62000d307f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8862003054565b62000d5c7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8962003054565b62000d887fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088962003054565b62000db47f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48962003054565b62000dce5f8051602062005ad08339815191528962003054565b62000e085f8051602062005b108339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062003060565b62000e347f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08962003054565b62000e607f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8962003054565b62000e9a5f8051602062005af08339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162003060565b62000eb45f8051602062005af08339815191528762003054565b62000ee07f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518762003054565b6073546074546001600160401b03600160401b9092048216911680821462000f1b57604051632e4cc54360e11b815260040160405180910390fd5b5f62000f40888888885f60745f9054906101000a90046001600160401b0316620030aa565b6001600160401b038381165f81815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b91829004909b1681029a909a17905560068a01805490911690931797870297909717909155600787018054909616909417909455607a54606f549390915290549251635d6717a560e01b81529394506001600160a01b038c811694635d6717a5946200103e9493831693600160581b9004909216916076916077919060040162004e63565b5f604051808303815f87803b15801562001056575f80fd5b505af115801562001069573d5f803e3d5ffd5b50505f805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620010b09050565b60405180910390a15050505050505050505050565b63ffffffff82165f908152608160205260408120620010e59083620032cb565b90505b92915050565b63ffffffff81165f908152608160205260408120620010e8906200330f565b5f8051602062005b1083398151915262001127816200337e565b63ffffffff89165f9081526081602052604090206200114d818a8a8a8a8a8a8a6200338a565b600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b90041615620011b4576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620011ed620024f2565b6040518263ffffffff1660e01b81526004016200120c91815260200190565b5f604051808303815f87803b15801562001224575f80fd5b505af115801562001237573d5f803e3d5ffd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b5f8051602062005b10833981519152620012cf816200337e565b63ffffffff89165f908152608160205260409020620012f5818a8a8a8a8a8a8a62003718565b600681018054600160401b600160801b031916600160401b6001600160401b038a81169182029290921783555f9081526002840160205260409020879055600583018890559054600160801b900416156200135c576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001395620024f2565b6040518263ffffffff1660e01b8152600401620013b491815260200190565b5f604051808303815f87803b158015620013cc575f80fd5b505af1158015620013df573d5f803e3d5ffd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff82165f908152608160205260409020620014715f8051602062005b1083398151915233620020d3565b620014c557606f5460ff16156200149b57604051630bc011ff60e21b815260040160405180910390fd5b620014a78183620032cb565b620014c557604051630674f25160e11b815260040160405180910390fd5b620014d1818362003b17565b505050565b5f8051602062005ad0833981519152620014f0816200337e565b6103e88261ffff1610806200150a57506103ff8261ffff16115b156200152957604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200159b5f8051602062005af083398151915233620020d3565b6200163a57608454600160801b90046001600160401b03161580620015eb57506084544290620015e09062093a8090600160801b90046001600160401b031662004ecb565b6001600160401b0316115b806200161b57506087544290620016109062093a80906001600160401b031662004ecb565b6001600160401b0316115b156200163a5760405163692baaad60e11b815260040160405180910390fd5b6200164462003d02565b565b5f8281526034602052604090206001015462001662816200337e565b620014d1838362003d7c565b6001600160a01b03811633146200169857604051630b4ad1cd60e31b815260040160405180910390fd5b620016a4828262003de7565b5050565b5f8051602062005ad0833981519152620016c2816200337e565b606f5460ff1662001704576084546001600160401b03600160c01b909104811690831610620017045760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19060200162001575565b5f60865460646200176d919062004ef5565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd6200179e816200337e565b63ffffffff82161580620017bd5750607e5463ffffffff908116908316115b15620017dc57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f60205260409020600180820154600160e81b900460ff16151590036200182257604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd0862001898816200337e565b63ffffffff88161580620018b75750607e5463ffffffff908116908916115b15620018d657604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88165f908152607f60205260409020600180820154600160e81b900460ff16151590036200191c57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b0388165f9081526083602052604090205463ffffffff161562001959576040516337c8fe0960e11b815260040160405180910390fd5b608080545f91908290620019739063ffffffff1662004f0f565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b03909216913091620019c09062004669565b620019ce9392919062004f34565b604051809103905ff080158015620019e8573d5f803e3d5ffd5b5090508160835f8c6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508a815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001c4c949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001c8c908d908d9088908e908e908e9060040162004f6a565b5f604051808303815f87803b15801562001ca4575f80fd5b505af115801562001cb7573d5f803e3d5ffd5b50505050505050505050505050505050565b63ffffffff86165f90815260816020526040902060609062001cf090878787878762003e50565b979650505050505050565b606f5460ff161562001d2057604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001d6e92600160c01b90048116911662004ecb565b6001600160401b0316111562001d9757604051638a0704d360e01b815260040160405180910390fd5b6103e862001da6888862004fcc565b6001600160401b0316111562001dcf57604051635acfba9d60e11b815260040160405180910390fd5b62001de1818989898989898962003718565b62001ded818762003f8f565b6085546001600160401b03165f0362001ef457600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562001e67576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001ea0620024f2565b6040518263ffffffff1660e01b815260040162001ebf91815260200190565b5f604051808303815f87803b15801562001ed7575f80fd5b505af115801562001eea573d5f803e3d5ffd5b5050505062001fbd565b62001eff8162004186565b600681018054600160801b90046001600160401b031690601062001f238362004fef565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b900487165f90815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff16156200204157604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602052604090206200206781898989898989896200338a565b6001600160401b0387165f9081526004820160209081526040918290206002015482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620020c862003d02565b505050505050505050565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b81523060048201525f9081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562002164573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200218a91906200500d565b6084549091505f90620021b0906001600160401b03600160401b82048116911662004fcc565b6001600160401b03169050805f03620021cb575f9250505090565b620021d7818362005039565b9250505090565b606f545f9060ff16156200220557604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff16908190036200223c576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f036200226657604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f9081526081602052604081206084805491928792620022989084906001600160401b031662004ecb565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f620022cd878362004ecb565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f95865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200235c8362004186565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b5f8051602062005ad0833981519152620023c4816200337e565b606f5460ff16620023ff576085546001600160401b0390811690831610620023ff5760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759060200162001575565b5f8051602062005ad083398151915262002469816200337e565b62015180826001600160401b031611156200249757604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289060200162001575565b6080545f9063ffffffff168082036200250c57505f919050565b5f816001600160401b0381111562002528576200252862004996565b60405190808252806020026020018201604052801562002552578160200160208202803683370190505b5090505f5b82811015620025c25760815f620025708360016200504f565b63ffffffff1663ffffffff1681526020019081526020015f2060050154828281518110620025a257620025a262005065565b602090810291909101015280620025b98162005079565b91505062002557565b505f60205b836001146200281a575f620025de60028662005094565b620025eb60028762005039565b620025f791906200504f565b90505f816001600160401b0381111562002615576200261562004996565b6040519080825280602002602001820160405280156200263f578160200160208202803683370190505b5090505f5b82811015620027c6576200265a600184620050aa565b811480156200267557506200267160028862005094565b6001145b15620026fd57856200268982600262004ef5565b815181106200269c576200269c62005065565b602002602001015185604051602001620026c0929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620026eb57620026eb62005065565b602002602001018181525050620027b1565b856200270b82600262004ef5565b815181106200271e576200271e62005065565b60200260200101518682600262002736919062004ef5565b620027439060016200504f565b8151811062002756576200275662005065565b602002602001015160405160200162002779929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620027a457620027a462005065565b6020026020010181815250505b80620027bd8162005079565b91505062002644565b508094508195508384604051602001620027ea929190918252602082015260400190565b60405160208183030381529060405280519060200120935082806200280f90620050c0565b9350505050620025c7565b5f835f8151811062002830576200283062005065565b602002602001015190505f5b82811015620028b057604080516020810184905290810185905260600160408051601f19818403018152828252805160209182012090830187905290820186905292506060016040516020818303038152906040528051906020012093508080620028a79062005079565b9150506200283c565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac620028e6816200337e565b63ffffffff84161580620029055750607e5463ffffffff908116908516115b156200292457604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526082602052604081205463ffffffff169081900362002964576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918716600160401b9091046001600160401b031603620029b257604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86165f908152607f60205260409020600180820154600160e81b900460ff1615159003620029f857604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002a3657604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790555f62002ab584620010ee565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002b0b9216908b908b90600401620050d8565b5f604051808303815f87803b15801562002b23575f80fd5b505af115801562002b36573d5f803e3d5ffd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002bbc816200337e565b683635c9adc5dea0000082118062002bd75750633b9aca0082105b1562002bf657604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001575565b5f8281526034602052604090206001015462002c48816200337e565b620014d1838362003de7565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002c80816200337e565b6087805467ffffffffffffffff1916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc16976916004808301925f92919082900301818387803b15801562002cfc575f80fd5b505af115801562002d0f573d5f803e3d5ffd5b5050505062002d1d6200424f565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62002d4c816200337e565b6001600160401b0384165f9081526083602052604090205463ffffffff161562002d89576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b0387165f9081526082602052604090205463ffffffff161562002dc657604051630d409b9360e41b815260040160405180910390fd5b5f62002dd788888888875f620030aa565b5f8080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002e20816200337e565b607e80545f9190829062002e3a9063ffffffff1662004f0f565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff1681526020015f1515815260200185815250607f5f8363ffffffff1663ffffffff1681526020019081526020015f205f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002fd69695949392919062005117565b60405180910390a25050505050505050565b5f54610100900460ff16620016445760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000bfd565b620016a4828262003d7c565b5f82815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080545f9182918290620030c59063ffffffff1662004f0f565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f876001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff16021790555060815f8263ffffffff1663ffffffff1681526020019081526020015f20915087825f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b0316021790555086826001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555084825f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620032b89594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b038281165f90815260048501602052604081205490924292620032fd92918116911662004ecb565b6001600160401b031611159392505050565b60068101545f90600160801b90046001600160401b03161562003361575060068101546001600160401b03600160801b90910481165f9081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002d1d8133620042a7565b60078801545f906001600160401b039081169087161015620033bf5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038816156200345f5760068901546001600160401b03600160801b90910481169089161115620034095760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f90815260048a0160205260409020600281015481549092888116600160401b90920416146200345857604051632bd2e3e760e01b815260040160405180910390fd5b50620034d3565b506001600160401b0385165f9081526002890160205260409020548062003499576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620034d357604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b909104811690881611806200350c5750876001600160401b0316876001600160401b031611155b8062003530575060068901546001600160401b03600160c01b909104811690881611155b156200354f5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260048b016020526040902054600160401b900481169086161462003595576040516332a2a77f60e01b815260040160405180910390fd5b5f620035a68a888888868962003e50565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620035dc91906200516f565b602060405180830381855afa158015620035f8573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200361d91906200500d565b62003629919062005094565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200366d918891906004016200518c565b602060405180830381865afa15801562003689573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620036af9190620051c8565b620036cd576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260048c0160205260409020600201548590036200370b5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b5f80620037258a6200330f565b60078b01549091506001600160401b0390811690891610156200375b5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620037fd5760068a01546001600160401b03600160801b9091048116908a161115620037a55760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a165f90815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620037f657604051632bd2e3e760e01b815260040160405180910390fd5b506200386c565b6001600160401b0388165f90815260028b01602052604090205491508162003838576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200386c57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b0316116200389f5760405163b9b18f5760e01b815260040160405180910390fd5b5f620038b08b8a8a8a878b62003e50565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620038e691906200516f565b602060405180830381855afa15801562003902573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200392791906200500d565b62003933919062005094565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003977918991906004016200518c565b602060405180830381865afa15801562003993573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620039b99190620051c8565b620039d7576040516309bde33960e01b815260040160405180910390fd5b5f620039e4848b62004fcc565b905062003a3d87826001600160401b0316620039ff620020fd565b62003a0b919062004ef5565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620042d1565b80608460088282829054906101000a90046001600160401b031662003a63919062004ecb565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d153906064015f604051808303815f87803b15801562003af1575f80fd5b505af115801562003b04573d5f803e3d5ffd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003b56575060068201546001600160401b03600160801b9091048116908216115b1562003b755760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f81815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003c30620024f2565b6040518263ffffffff1660e01b815260040162003c4f91815260200190565b5f604051808303815f87803b15801562003c67575f80fd5b505af115801562003c7a573d5f803e3d5ffd5b505085546001600160a01b03165f90815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801562003d5b575f80fd5b505af115801562003d6e573d5f803e3d5ffd5b505050506200164462004325565b62003d888282620020d3565b620016a4575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003df38282620020d3565b15620016a4575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086165f818152600389016020526040808220549388168252902054606092911580159062003e85575081155b1562003ea45760405163340c614f60e11b815260040160405180910390fd5b8062003ec3576040516366385b5160e01b815260040160405180910390fd5b62003ece8462004381565b62003eec576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b5f62003f9b836200330f565b9050815f8062003fac848462004fcc565b6085546001600160401b0391821692505f9162003fd291600160401b90041642620050aa565b90505b846001600160401b0316846001600160401b0316146200405b576001600160401b038085165f9081526003890160205260409020600181015490911682101562004036576001810154600160401b90046001600160401b0316945062004054565b62004042868662004fcc565b6001600160401b03169350506200405b565b5062003fd5565b5f620040688484620050aa565b905083811015620040c657808403600c811162004086578062004089565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620040bb57620040bb62005025565b04608655506200413d565b838103600c8111620040d95780620040dc565b600c5b90505f816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162004115576200411562005025565b04905080608654670de0b6b3a7640000028162004136576200413662005025565b0460865550505b683635c9adc5dea0000060865411156200416457683635c9adc5dea000006086556200417c565b633b9aca0060865410156200417c57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002d1d5760068101545f90620041d090600160c01b90046001600160401b0316600162004ecb565b9050620041de8282620032cb565b15620016a45760068201545f906002906200420b908490600160801b90046001600160401b031662004fcc565b620042179190620051e9565b62004223908362004ecb565b9050620042318382620032cb565b156200424357620014d1838262003b17565b620014d1838362003b17565b606f5460ff166200427357604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b620042b38282620020d3565b620016a457604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620014d190849062004405565b606f5460ff16156200434a57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff000000016001600160401b038316108015620043b7575067ffffffff00000001604083901c6001600160401b0316105b8015620043d8575067ffffffff00000001608083901c6001600160401b0316105b8015620043f0575067ffffffff0000000160c083901c105b15620043fe57506001919050565b505f919050565b5f6200445b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620044dd9092919063ffffffff16565b805190915015620014d157808060200190518101906200447c9190620051c8565b620014d15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000bfd565b6060620044ed84845f85620044f5565b949350505050565b606082471015620045585760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000bfd565b5f80866001600160a01b031685876040516200457591906200516f565b5f6040518083038185875af1925050503d805f8114620045b1576040519150601f19603f3d011682016040523d82523d5f602084013e620045b6565b606091505b509150915062001cf08783838760608315620046365782515f036200462e576001600160a01b0385163b6200462e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000bfd565b5081620044ed565b620044ed83838151156200464d5781518083602001fd5b8060405162461bcd60e51b815260040162000bfd919062004bb3565b6108be806200521283390190565b6001600160a01b038116811462002d1d575f80fd5b80356001600160401b038116811462003379575f80fd5b5f805f805f805f805f806101408b8d031215620046be575f80fd5b8a35620046cb8162004677565b9950620046db60208c016200468c565b9850620046eb60408c016200468c565b975060608b0135620046fd8162004677565b965060808b01356200470f8162004677565b955060a08b0135620047218162004677565b945060c08b0135620047338162004677565b935060e08b0135620047458162004677565b9250620047566101008c016200468c565b9150620047676101208c016200468c565b90509295989b9194979a5092959850565b803563ffffffff8116811462003379575f80fd5b5f80604083850312156200479e575f80fd5b620047a98362004778565b9150620047b9602084016200468c565b90509250929050565b5f60208284031215620047d3575f80fd5b620010e58262004778565b806103008101831015620010e8575f80fd5b5f805f805f805f806103e0898b03121562004809575f80fd5b620048148962004778565b97506200482460208a016200468c565b96506200483460408a016200468c565b95506200484460608a016200468c565b94506200485460808a016200468c565b935060a0890135925060c08901359150620048738a60e08b01620047de565b90509295985092959890939650565b5f805f805f805f806103e0898b0312156200489b575f80fd5b620048a68962004778565b9750620048b660208a016200468c565b9650620048c660408a016200468c565b9550620048d660608a016200468c565b94506080890135935060a0890135925060c0890135620048f68162004677565b9150620048738a60e08b01620047de565b5f6020828403121562004918575f80fd5b813561ffff811681146200492a575f80fd5b9392505050565b5f6020828403121562004942575f80fd5b5035919050565b5f80604083850312156200495b575f80fd5b8235915060208301356200496f8162004677565b809150509250929050565b5f602082840312156200498b575f80fd5b620010e5826200468c565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620049ba575f80fd5b81356001600160401b0380821115620049d757620049d762004996565b604051601f8301601f19908116603f0116810190828211818310171562004a025762004a0262004996565b8160405283815286602085880101111562004a1b575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a03121562004a51575f80fd5b62004a5c8862004778565b965062004a6c602089016200468c565b9550604088013562004a7e8162004677565b9450606088013562004a908162004677565b9350608088013562004aa28162004677565b925060a08801356001600160401b038082111562004abe575f80fd5b62004acc8b838c01620049aa565b935060c08a013591508082111562004ae2575f80fd5b5062004af18a828b01620049aa565b91505092959891949750929550565b5f805f805f8060c0878903121562004b16575f80fd5b62004b218762004778565b955062004b31602088016200468c565b945062004b41604088016200468c565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b8381101562004b7e57818101518382015260200162004b64565b50505f910152565b5f815180845262004b9f81602086016020860162004b62565b601f01601f19169290920160200192915050565b602081525f620010e5602083018462004b86565b5f806040838503121562004bd9575f80fd5b62004be4836200468c565b946020939093013593505050565b5f805f806060858703121562004c06575f80fd5b843562004c138162004677565b935062004c236020860162004778565b925060408501356001600160401b038082111562004c3f575f80fd5b818701915087601f83011262004c53575f80fd5b81358181111562004c62575f80fd5b88602082850101111562004c74575f80fd5b95989497505060200194505050565b5f6020828403121562004c94575f80fd5b81356200492a8162004677565b803560ff8116811462003379575f80fd5b5f805f805f8060c0878903121562004cc8575f80fd5b863562004cd58162004677565b9550602087013562004ce78162004677565b945062004cf7604088016200468c565b935062004d07606088016200468c565b92506080870135915062004d1e60a0880162004ca1565b90509295509295509295565b5f805f805f8060c0878903121562004d40575f80fd5b863562004d4d8162004677565b9550602087013562004d5f8162004677565b945062004d6f604088016200468c565b935062004d7f6060880162004ca1565b92506080870135915060a08701356001600160401b0381111562004da1575f80fd5b62004daf89828a01620049aa565b9150509295509295509295565b80545f90600181811c908083168062004dd657607f831692505b6020808410820362004df657634e487b7160e01b5f52602260045260245ffd5b8388526020880182801562004e14576001811462004e2b5762004e56565b60ff198716825285151560051b8201975062004e56565b5f898152602090205f5b8781101562004e505781548482015290860190840162004e35565b83019850505b5050505050505092915050565b6001600160a01b0386811682528516602082015260a0604082018190525f9062004e909083018662004dbc565b828103606084015262004ea4818662004dbc565b9150508260808301529695505050505050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111562004eee5762004eee62004eb7565b5092915050565b8082028115828204841417620010e857620010e862004eb7565b5f63ffffffff80831681810362004f2a5762004f2a62004eb7565b6001019392505050565b6001600160a01b038481168252831660208201526060604082018190525f9062004f619083018462004b86565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190525f9062004fab9083018562004b86565b82810360a084015262004fbf818562004b86565b9998505050505050505050565b6001600160401b0382811682821603908082111562004eee5762004eee62004eb7565b5f6001600160401b0380831681810362004f2a5762004f2a62004eb7565b5f602082840312156200501e575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f826200504a576200504a62005025565b500490565b80820180821115620010e857620010e862004eb7565b634e487b7160e01b5f52603260045260245ffd5b5f600182016200508d576200508d62004eb7565b5060010190565b5f82620050a557620050a562005025565b500690565b81810381811115620010e857620010e862004eb7565b5f81620050d157620050d162004eb7565b505f190190565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190525f90620051639083018462004b86565b98975050505050505050565b5f82516200518281846020870162004b62565b9190910192915050565b6103208101610300808584378201835f5b6001811015620051be5781518352602092830192909101906001016200519d565b5050509392505050565b5f60208284031215620051d9575f80fd5b815180151581146200492a575f80fd5b5f6001600160401b038084168062005205576200520562005025565b9216919091049291505056fe60a0604052604051620008be380380620008be8339810160408190526100249161034d565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b6565b505050610432565b61006182610124565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100aa576100a582826101a2565b505050565b6100b2610215565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f65f805160206200089e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161012181610236565b50565b806001600160a01b03163b5f0361015e57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516101be9190610417565b5f60405180830381855af49150503d805f81146101f6576040519150601f19603f3d011682016040523d82523d5f602084013e6101fb565b606091505b50909250905061020c858383610274565b95945050505050565b34156102345760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661025f57604051633173bdd160e11b81525f6004820152602401610155565b805f805160206200089e833981519152610181565b60608261028957610284826102d3565b6102cc565b81511580156102a057506001600160a01b0384163b155b156102c957604051639996b31560e01b81526001600160a01b0385166004820152602401610155565b50805b9392505050565b8051156102e35780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b0381168114610312575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561034557818101518382015260200161032d565b50505f910152565b5f805f6060848603121561035f575f80fd5b610368846102fc565b9250610376602085016102fc565b60408501519092506001600160401b0380821115610392575f80fd5b818601915086601f8301126103a5575f80fd5b8151818111156103b7576103b7610317565b604051601f8201601f19908116603f011681019083821181831017156103df576103df610317565b816040528281528960208487010111156103f7575f80fd5b61040883602083016020880161032b565b80955050505050509250925092565b5f825161042881846020870161032b565b9190910192915050565b6080516104546200044a5f395f601001526104545ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610069575f356001600160e01b03191663278f794360e11b146100615761005f61006d565b565b61005f61007d565b61005f5b61005f6100786100ab565b6100e2565b5f8061008c36600481846102ee565b8101906100999190610329565b915091506100a78282610100565b5050565b5f6100dd7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156100fc573d5ff35b3d5ffd5b6101098261015a565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101525761014d82826101d5565b505050565b6100a7610247565b806001600160a01b03163b5f0361019457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101f191906103f2565b5f60405180830381855af49150503d805f8114610229576040519150601f19603f3d011682016040523d82523d5f602084013e61022e565b606091505b509150915061023e858383610266565b95945050505050565b341561005f5760405163b398979f60e01b815260040160405180910390fd5b60608261027b57610276826102c5565b6102be565b815115801561029257506001600160a01b0384163b155b156102bb57604051639996b31560e01b81526001600160a01b038516600482015260240161018b565b50805b9392505050565b8051156102d55780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f80858511156102fc575f80fd5b83861115610308575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561033a575f80fd5b82356001600160a01b0381168114610350575f80fd5b9150602083013567ffffffffffffffff8082111561036c575f80fd5b818501915085601f83011261037f575f80fd5b81358181111561039157610391610315565b604051601f8201601f19908116603f011681019083821181831017156103b9576103b9610315565b816040528281528860208487010111156103d1575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b8181101561041157602081860181015185830152016103f7565b505f92019182525091905056fea2646970667358221220c3817d11eb3dc87723342527d38da55b7b3b362f54567f56cf1ef4db2f8a430664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a264697066735822122007e10c372a0db7fc583e3a5f3da00fa16274fbf3032428aa7025177f0dee4cdf64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonRollupManagerMock.json b/compiled-contracts/PolygonRollupManagerMock.json new file mode 100644 index 000000000..9b644e974 --- /dev/null +++ b/compiled-contracts/PolygonRollupManagerMock.json @@ -0,0 +1,2023 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonRollupManagerMock", + "sourceName": "contracts/v2/mocks/PolygonRollupManagerMock.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRootV2", + "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": "BatchFeeOutOfRange", + "type": "error" + }, + { + "inputs": [], + "name": "ChainIDAlreadyExist", + "type": "error" + }, + { + "inputs": [], + "name": "ExceedMaxVerifyBatches", + "type": "error" + }, + { + "inputs": [], + "name": "FinalNumBatchBelowLastVerifiedBatch", + "type": "error" + }, + { + "inputs": [], + "name": "FinalNumBatchDoesNotMatchPendingState", + "type": "error" + }, + { + "inputs": [], + "name": "FinalPendingStateNumInvalid", + "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": "InvalidRangeMultiplierBatchFee", + "type": "error" + }, + { + "inputs": [], + "name": "MustSequenceSomeBatch", + "type": "error" + }, + { + "inputs": [], + "name": "NewAccInputHashDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "NewPendingStateTimeoutMustBeLower", + "type": "error" + }, + { + "inputs": [], + "name": "NewStateRootNotInsidePrime", + "type": "error" + }, + { + "inputs": [], + "name": "NewTrustedAggregatorTimeoutMustBeLower", + "type": "error" + }, + { + "inputs": [], + "name": "OldAccInputHashDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "OldStateRootDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyEmergencyState", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyNotEmergencyState", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateInvalid", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateNotConsolidable", + "type": "error" + }, + { + "inputs": [], + "name": "RollupAddressAlreadyExist", + "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": "TrustedAggregatorTimeoutNotExpired", + "type": "error" + }, + { + "inputs": [], + "name": "UpdateNotCompatible", + "type": "error" + }, + { + "inputs": [], + "name": "UpdateToSameRollupTypeID", + "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" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "lastVerifiedBatchBeforeUpgrade", + "type": "uint64" + } + ], + "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" + } + ], + "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": "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 IPolygonZkEVMGlobalExitRootV2", + "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 PolygonZkEVMExistentEtrog", + "name": "polygonZkEVM", + "type": "address" + }, + { + "internalType": "contract IVerifierRollup", + "name": "zkEVMVerifier", + "type": "address" + }, + { + "internalType": "uint64", + "name": "zkEVMForkID", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "zkEVMChainID", + "type": "uint64" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "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" + } + ], + "name": "initializeMock", + "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": "lastDeactivatedEmergencyStateTimestamp", + "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": "bytes32[]", + "name": "localExitRoots", + "type": "bytes32[]" + } + ], + "name": "prepareMockCalculateRoot", + "outputs": [], + "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": "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": "uint32", + "name": "rollupTypeID", + "type": "uint32" + } + ], + "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": "0x60e060405234801562000010575f80fd5b50604051620061893803806200618983398101604081905262000033916200013c565b6001600160a01b0380841660805280831660c052811660a0528282826200005962000065565b5050505050506200018d565b5f54610100900460ff1615620000d15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101562000122575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811462000139575f80fd5b50565b5f805f606084860312156200014f575f80fd5b83516200015c8162000124565b60208501519093506200016f8162000124565b6040850151909250620001828162000124565b809150509250925092565b60805160a05160c051615f99620001f05f395f81816109d2015281816122910152613b0d01525f818161079a01528181612de50152613dfb01525f818161092c015281816112e90152818161149101528181611f7b0152613cf00152615f995ff3fe608060405234801562000010575f80fd5b5060043610620002b4575f3560e01c80630645af0914620002b8578063066ec01214620002d1578063080b311114620002fd5780630a0d9fbe14620003255780630e36f582146200034057806311f6b287146200035757806312b86e19146200036e5780631489ed10146200038557806315064c96146200039c5780631608859c14620003aa5780631796a1ae14620003c15780631816b7e514620003e85780632072f6c514620003ff578063248a9ca3146200040957806325280169146200042f5780632f2ff15d14620004e357806330c27dde14620004fa57806336568abe146200050e578063394218e91462000525578063477fa270146200053c57806355a71ee0146200054557806360469169146200058857806365c0504d14620005925780637222020f1462000640578063727885e914620006575780637975fcfe146200066e5780637fb6e76a1462000694578063841b24d714620006bc57806387c20c0114620006d75780638bd4f07114620006ee5780638f698ec5146200070557806391d14854146200071c57806399f5634e14620007335780639a908e73146200073d5780639c9f3dfe1462000754578063a066215c146200076b578063a217fddf1462000782578063a2967d99146200078a578063a3c573eb1462000794578063afd23cbe14620007cb578063b99d0ad714620007f5578063c1acbc3414620008cc578063c4c928c214620008e7578063ceee281d14620008fe578063d02103ca1462000926578063d5073f6f146200094e578063d547741f1462000965578063d939b315146200097c578063dbc169761462000990578063dde0ff77146200099a578063e0bfd3d214620009b5578063e46761c414620009cc578063f34eb8eb14620009f4578063f4e926751462000a0b578063f9c4c2ae1462000a1c575b5f80fd5b620002cf620002c936600462004795565b62000b32565b005b608454620002e5906001600160401b031681565b604051620002f491906200486a565b60405180910390f35b620003146200030e36600462004892565b62000f61565b6040519015158152602001620002f4565b608554620002e590600160401b90046001600160401b031681565b620002cf62000351366004620048c8565b62000f8a565b620002e5620003683660046200494f565b62001221565b620002cf6200037f3660046200497d565b62001240565b620002cf6200039636600462004a0f565b620013e8565b606f54620003149060ff1681565b620002cf620003bb36600462004892565b62001570565b607e54620003d29063ffffffff1681565b60405163ffffffff9091168152602001620002f4565b620002cf620003f936600462004a94565b62001603565b620002cf620016ae565b620004206200041a36600462004abe565b62001773565b604051908152602001620002f4565b620004af6200044036600462004892565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002f4565b620002cf620004f436600462004ad6565b62001787565b608754620002e5906001600160401b031681565b620002cf6200051f36600462004ad6565b620017a9565b620002cf6200053636600462004b07565b620017e3565b60865462000420565b620004206200055636600462004892565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b6200042062001891565b620005f6620005a33660046200494f565b607f6020525f90815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002f4565b620002cf620006513660046200494f565b620018a8565b620002cf6200066836600462004bdc565b62001990565b620006856200067f36600462004ca2565b62001ddb565b604051620002f4919062004d55565b620003d2620006a536600462004b07565b60836020525f908152604090205463ffffffff1681565b608454620002e590600160c01b90046001600160401b031681565b620002cf620006e836600462004a0f565b62001e0d565b620002cf620006ff3660046200497d565b62002128565b620002cf6200071636600462004d69565b620021df565b620003146200072d36600462004ad6565b62002263565b620004206200228d565b620002e56200074e36600462004e14565b62002373565b620002cf6200076536600462004b07565b6200253a565b620002cf6200077c36600462004b07565b620025dc565b620004205f81565b620004206200267a565b620007bc7f000000000000000000000000000000000000000000000000000000000000000081565b604051620002f4919062004e3f565b608554620007e190600160801b900461ffff1681565b60405161ffff9091168152602001620002f4565b6200088a6200080636600462004892565b60408051608080820183525f8083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002f4919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002e590600160801b90046001600160401b031681565b620002cf620008f836600462004e53565b62002a2f565b620003d26200090f36600462004ee4565b60826020525f908152604090205463ffffffff1681565b620007bc7f000000000000000000000000000000000000000000000000000000000000000081565b620002cf6200095f36600462004abe565b62002cf2565b620002cf6200097636600462004ad6565b62002d7c565b608554620002e5906001600160401b031681565b620002cf62002d9e565b608454620002e590600160401b90046001600160401b031681565b620002cf620009c636600462004f13565b62002e57565b620007bc7f000000000000000000000000000000000000000000000000000000000000000081565b620002cf62000a0536600462004f8b565b62002f19565b608054620003d29063ffffffff1681565b62000ab262000a2d3660046200494f565b60816020525f9081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002f4565b5f54600290610100900460ff1615801562000b5357505f5460ff8083169116105b62000b7b5760405162461bcd60e51b815260040162000b72906200501d565b60405180910390fd5b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000bfb620030fb565b62000c155f8051602062005f448339815191528c62003167565b62000c215f8862003167565b62000c3b5f8051602062005e248339815191528862003167565b62000c555f8051602062005ea48339815191528862003167565b62000c6f5f8051602062005dc48339815191528862003167565b62000c895f8051602062005e048339815191528962003167565b62000ca35f8051602062005f248339815191528962003167565b62000cbd5f8051602062005e448339815191528962003167565b62000cd75f8051602062005ec48339815191528962003167565b62000cff5f8051602062005f448339815191525f8051602062005da483398151915262003173565b62000d195f8051602062005da48339815191528962003167565b62000d335f8051602062005de48339815191528962003167565b62000d5b5f8051602062005f048339815191525f8051602062005ee483398151915262003173565b62000d755f8051602062005f048339815191528762003167565b62000d8f5f8051602062005ee48339815191528762003167565b6073546074546001600160401b03600160401b9092048216911680821462000dca57604051632e4cc54360e11b815260040160405180910390fd5b5f62000def888888885f60745f9054906101000a90046001600160401b0316620031c6565b6001600160401b038381165f81815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b91829004909b1681029a909a17905560068a01805490911690931797870297909717909155600787018054909616909417909455607a54606f549390915290549251635d6717a560e01b81529394506001600160a01b038c811694635d6717a59462000eec9493831693600160581b9004909216916076916077919060040162005112565b5f604051808303815f87803b15801562000f04575f80fd5b505af115801562000f17573d5f803e3d5ffd5b50505f805461ff0019169055505060405160ff851681525f8051602062005e848339815191529350602001915062000f4c9050565b60405180910390a15050505050505050505050565b63ffffffff82165f90815260816020526040812062000f819083620033e7565b90505b92915050565b5f54600290610100900460ff1615801562000fab57505f5460ff8083169116105b62000fca5760405162461bcd60e51b815260040162000b72906200501d565b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200104a620030fb565b620010645f8051602062005f448339815191528862003167565b620010705f8462003167565b6200108a5f8051602062005e248339815191528462003167565b620010a45f8051602062005ea48339815191528462003167565b620010be5f8051602062005dc48339815191528462003167565b620010d85f8051602062005e048339815191528562003167565b620010f25f8051602062005f248339815191528562003167565b6200110c5f8051602062005e448339815191528562003167565b620011265f8051602062005ec48339815191528562003167565b6200114e5f8051602062005f448339815191525f8051602062005da483398151915262003173565b620011685f8051602062005da48339815191528562003167565b620011825f8051602062005de48339815191528562003167565b620011aa5f8051602062005f048339815191525f8051602062005ee483398151915262003173565b620011c45f8051602062005f048339815191528362003167565b620011de5f8051602062005ee48339815191528362003167565b620011ea5f3362003167565b5f805461ff001916905560405160ff821681525f8051602062005e848339815191529060200160405180910390a150505050505050565b63ffffffff81165f90815260816020526040812062000f84906200342b565b5f8051602062005f448339815191526200125a816200349a565b63ffffffff89165f90815260816020526040902062001280818a8a8a8a8a8a8a620034a6565b600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b90041615620012e7576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620013206200267a565b6040518263ffffffff1660e01b81526004016200133f91815260200190565b5f604051808303815f87803b15801562001357575f80fd5b505af11580156200136a573d5f803e3d5ffd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b5f8051602062005f4483398151915262001402816200349a565b63ffffffff89165f90815260816020526040902062001428818a8a8a8a8a8a8a62003822565b600681018054600160401b600160801b031916600160401b6001600160401b038a81169182029290921783555f9081526002840160205260409020879055600583018890559054600160801b900416156200148f576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620014c86200267a565b6040518263ffffffff1660e01b8152600401620014e791815260200190565b5f604051808303815f87803b158015620014ff575f80fd5b505af115801562001512573d5f803e3d5ffd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a6040516200155c9392919062005166565b60405180910390a350505050505050505050565b63ffffffff82165f9081526081602052604090206200159e5f8051602062005f448339815191523362002263565b620015f257606f5460ff1615620015c857604051630bc011ff60e21b815260040160405180910390fd5b620015d48183620033e7565b620015f257604051630674f25160e11b815260040160405180910390fd5b620015fe818362003c0e565b505050565b5f8051602062005ec48339815191526200161d816200349a565b6103e88261ffff1610806200163757506103ff8261ffff16115b156200165657604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620016c85f8051602062005f048339815191523362002263565b6200176757608454600160801b90046001600160401b0316158062001718575060845442906200170d9062093a8090600160801b90046001600160401b03166200519b565b6001600160401b0316115b8062001748575060875442906200173d9062093a80906001600160401b03166200519b565b6001600160401b0316115b15620017675760405163692baaad60e11b815260040160405180910390fd5b6200177162003df9565b565b5f9081526034602052604090206001015490565b620017928262001773565b6200179d816200349a565b620015fe838362003e73565b6001600160a01b0381163314620017d357604051630b4ad1cd60e31b815260040160405180910390fd5b620017df828262003ede565b5050565b5f8051602062005ec4833981519152620017fd816200349a565b606f5460ff166200183f576084546001600160401b03600160c01b9091048116908316106200183f5760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190620016a29084906200486a565b5f6086546064620018a39190620051c5565b905090565b5f8051602062005e04833981519152620018c2816200349a565b63ffffffff82161580620018e15750607e5463ffffffff908116908316115b156200190057604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f60205260409020600180820154600160e81b900460ff16151590036200194657604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b5f8051602062005f24833981519152620019aa816200349a565b63ffffffff88161580620019c95750607e5463ffffffff908116908916115b15620019e857604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88165f908152607f60205260409020600180820154600160e81b900460ff161515900362001a2e57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b0388165f9081526083602052604090205463ffffffff161562001a6b576040516337c8fe0960e11b815260040160405180910390fd5b608080545f9190829062001a859063ffffffff16620051df565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b0390921691309162001ad2906200475b565b62001ae09392919062005204565b604051809103905ff08015801562001afa573d5f803e3d5ffd5b5090508160835f8c6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508a815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001d5e949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001d9e908d908d9088908e908e908e906004016200523a565b5f604051808303815f87803b15801562001db6575f80fd5b505af115801562001dc9573d5f803e3d5ffd5b50505050505050505050505050505050565b63ffffffff86165f90815260816020526040902060609062001e0290878787878762003f47565b979650505050505050565b606f5460ff161562001e3257604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001e8092600160c01b9004811691166200519b565b6001600160401b0316111562001ea957604051638a0704d360e01b815260040160405180910390fd5b6103e862001eb888886200529c565b6001600160401b0316111562001ee157604051635acfba9d60e11b815260040160405180910390fd5b62001ef3818989898989898962003822565b62001eff818762004081565b6085546001600160401b03165f036200200657600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562001f79576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001fb26200267a565b6040518263ffffffff1660e01b815260040162001fd191815260200190565b5f604051808303815f87803b15801562001fe9575f80fd5b505af115801562001ffc573d5f803e3d5ffd5b50505050620020cf565b620020118162004278565b600681018054600160801b90046001600160401b03169060106200203583620052bf565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b900487165f90815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b4888789604051620021159392919062005166565b60405180910390a3505050505050505050565b606f5460ff16156200214d57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f908152608160205260409020620021738189898989898989620034a6565b6001600160401b0387165f9081526004820160209081526040918290206002015482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620021d462003df9565b505050505050505050565b80516080805463ffffffff191663ffffffff9092169190911790555f5b8151811015620017df578181815181106200221b576200221b620052e5565b602002602001015160815f836001620022359190620052f9565b63ffffffff16815260208101919091526040015f2060050155806200225a816200530f565b915050620021fc565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401620022dd919062004e3f565b602060405180830381865afa158015620022f9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200231f91906200532a565b6084549091505f9062002345906001600160401b03600160401b8204811691166200529c565b6001600160401b03169050805f0362002360575f9250505090565b6200236c818362005356565b9250505090565b606f545f9060ff16156200239a57604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff1690819003620023d1576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f03620023fb57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f90815260816020526040812060848054919287926200242d9084906001600160401b03166200519b565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f6200246287836200519b565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f95865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b031990921692909316919091171790559050620024f08362004278565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a25826040516200252891906200486a565b60405180910390a29695505050505050565b5f8051602062005ec483398151915262002554816200349a565b606f5460ff166200258f576085546001600160401b03908116908316106200258f5760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590620016a29084906200486a565b5f8051602062005ec4833981519152620025f6816200349a565b62015180826001600160401b031611156200262457604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890620016a29084906200486a565b6080545f9063ffffffff168082036200269457505f919050565b5f816001600160401b03811115620026b057620026b062004b23565b604051908082528060200260200182016040528015620026da578160200160208202803683370190505b5090505f5b828110156200274a5760815f620026f8836001620052f9565b63ffffffff1663ffffffff1681526020019081526020015f20600501548282815181106200272a576200272a620052e5565b60209081029190910101528062002741816200530f565b915050620026df565b505f60205b836001146200298a575f620027666002866200536c565b6200277360028762005356565b6200277f9190620052f9565b90505f816001600160401b038111156200279d576200279d62004b23565b604051908082528060200260200182016040528015620027c7578160200160208202803683370190505b5090505f5b828110156200293e57620027e260018462005382565b81148015620027fd5750620027f96002886200536c565b6001145b156200287d578562002811826002620051c5565b81518110620028245762002824620052e5565b6020026020010151856040516020016200284092919062005398565b604051602081830303815290604052805190602001208282815181106200286b576200286b620052e5565b60200260200101818152505062002929565b856200288b826002620051c5565b815181106200289e576200289e620052e5565b602002602001015186826002620028b69190620051c5565b620028c3906001620052f9565b81518110620028d657620028d6620052e5565b6020026020010151604051602001620028f192919062005398565b604051602081830303815290604052805190602001208282815181106200291c576200291c620052e5565b6020026020010181815250505b8062002935816200530f565b915050620027cc565b5080945081955083846040516020016200295a92919062005398565b60405160208183030381529060405280519060200120935082806200297f90620053a6565b93505050506200274f565b5f835f81518110620029a057620029a0620052e5565b602002602001015190505f5b8281101562002a25578184604051602001620029ca92919062005398565b6040516020818303038152906040528051906020012091508384604051602001620029f792919062005398565b604051602081830303815290604052805190602001209350808062002a1c906200530f565b915050620029ac565b5095945050505050565b5f8051602062005dc483398151915262002a49816200349a565b63ffffffff8416158062002a685750607e5463ffffffff908116908516115b1562002a8757604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526082602052604081205463ffffffff169081900362002ac7576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002b1557604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86165f908152607f60205260409020600180820154600160e81b900460ff161515900362002b5b57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002b9957604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790555f62002c188462001221565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002c6d9216908b908b90600401620053be565b5f604051808303815f87803b15801562002c85575f80fd5b505af115801562002c98573d5f803e3d5ffd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b5f8051602062005de483398151915262002d0c816200349a565b683635c9adc5dea0000082118062002d275750633b9aca0082105b1562002d4657604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620016a2565b62002d878262001773565b62002d92816200349a565b620015fe838362003ede565b5f8051602062005e4483398151915262002db8816200349a565b608780546001600160401b031916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc16976916004808301925f92919082900301818387803b15801562002e33575f80fd5b505af115801562002e46573d5f803e3d5ffd5b5050505062002e5462004341565b50565b5f8051602062005ea483398151915262002e71816200349a565b6001600160401b0384165f9081526083602052604090205463ffffffff161562002eae576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b0387165f9081526082602052604090205463ffffffff161562002eeb57604051630d409b9360e41b815260040160405180910390fd5b5f62002efc88888888875f620031c6565b5f8080526002909101602052604090209390935550505050505050565b5f8051602062005e2483398151915262002f33816200349a565b607e80545f9190829062002f4d9063ffffffff16620051df565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff1681526020015f1515815260200185815250607f5f8363ffffffff1663ffffffff1681526020019081526020015f205f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620030e996959493929190620053fd565b60405180910390a25050505050505050565b5f54610100900460ff16620017715760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b72565b620017df828262003e73565b5f6200317f8362001773565b5f84815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080545f9182918290620031e19063ffffffff16620051df565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f876001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff16021790555060815f8263ffffffff1663ffffffff1681526020019081526020015f20915087825f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b0316021790555086826001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555084825f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620033d49594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b038281165f90815260048501602052604081205490924292620034199291811691166200519b565b6001600160401b031611159392505050565b60068101545f90600160801b90046001600160401b0316156200347d575060068101546001600160401b03600160801b90910481165f9081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002e54813362004399565b60078801545f906001600160401b039081169087161015620034db5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038816156200357b5760068901546001600160401b03600160801b90910481169089161115620035255760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f90815260048a0160205260409020600281015481549092888116600160401b90920416146200357457604051632bd2e3e760e01b815260040160405180910390fd5b50620035ef565b506001600160401b0385165f90815260028901602052604090205480620035b5576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620035ef57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620036285750876001600160401b0316876001600160401b031611155b806200364c575060068901546001600160401b03600160c01b909104811690881611155b156200366b5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260048b016020526040902054600160401b9004811690861614620036b1576040516332a2a77f60e01b815260040160405180910390fd5b5f620036c28a888888868962003f47565b90505f5f8051602062005e64833981519152600283604051620036e6919062005449565b602060405180830381855afa15801562003702573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200372791906200532a565b6200373391906200536c565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620037779188919060040162005466565b602060405180830381865afa15801562003793573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620037b99190620054a2565b620037d7576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260048c016020526040902060020154859003620038155760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b5f806200382f8a6200342b565b60078b01549091506001600160401b039081169089161015620038655760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620039075760068a01546001600160401b03600160801b9091048116908a161115620038af5760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a165f90815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200390057604051632bd2e3e760e01b815260040160405180910390fd5b5062003976565b6001600160401b0388165f90815260028b01602052604090205491508162003942576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200397657604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620039a95760405163b9b18f5760e01b815260040160405180910390fd5b5f620039ba8b8a8a8a878b62003f47565b90505f5f8051602062005e64833981519152600283604051620039de919062005449565b602060405180830381855afa158015620039fa573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019062003a1f91906200532a565b62003a2b91906200536c565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003a6f9189919060040162005466565b602060405180830381865afa15801562003a8b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062003ab19190620054a2565b62003acf576040516309bde33960e01b815260040160405180910390fd5b5f62003adc848b6200529c565b905062003b3587826001600160401b031662003af76200228d565b62003b039190620051c5565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620043c3565b80608460088282829054906101000a90046001600160401b031662003b5b91906200519b565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d153906064015f604051808303815f87803b15801562003be8575f80fd5b505af115801562003bfb573d5f803e3d5ffd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003c4d575060068201546001600160401b03600160801b9091048116908216115b1562003c6c5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f81815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003d276200267a565b6040518263ffffffff1660e01b815260040162003d4691815260200190565b5f604051808303815f87803b15801562003d5e575f80fd5b505af115801562003d71573d5f803e3d5ffd5b505085546001600160a01b03165f90815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801562003e52575f80fd5b505af115801562003e65573d5f803e3d5ffd5b505050506200177162004417565b62003e7f828262002263565b620017df575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003eea828262002263565b15620017df575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086165f818152600389016020526040808220549388168252902054606092911580159062003f7c575081155b1562003f9b5760405163340c614f60e11b815260040160405180910390fd5b8062003fba576040516366385b5160e01b815260040160405180910390fd5b62003fc58462004473565b62003fe3576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b5f6200408d836200342b565b9050815f806200409e84846200529c565b6085546001600160401b0391821692505f91620040c491600160401b9004164262005382565b90505b846001600160401b0316846001600160401b0316146200414d576001600160401b038085165f9081526003890160205260409020600181015490911682101562004128576001810154600160401b90046001600160401b0316945062004146565b6200413486866200529c565b6001600160401b03169350506200414d565b50620040c7565b5f6200415a848462005382565b905083811015620041b857808403600c81116200417857806200417b565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620041ad57620041ad62005342565b04608655506200422f565b838103600c8111620041cb5780620041ce565b600c5b90505f816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162004207576200420762005342565b04905080608654670de0b6b3a7640000028162004228576200422862005342565b0460865550505b683635c9adc5dea0000060865411156200425657683635c9adc5dea000006086556200426e565b633b9aca0060865410156200426e57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002e545760068101545f90620042c290600160c01b90046001600160401b031660016200519b565b9050620042d08282620033e7565b15620017df5760068201545f90600290620042fd908490600160801b90046001600160401b03166200529c565b620043099190620054c3565b6200431590836200519b565b9050620043238382620033e7565b156200433557620015fe838262003c0e565b620015fe838362003c0e565b606f5460ff166200436557604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b620043a5828262002263565b620017df57604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620015fe908490620044f7565b606f5460ff16156200443c57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff000000016001600160401b038316108015620044a9575067ffffffff00000001604083901c6001600160401b0316105b8015620044ca575067ffffffff00000001608083901c6001600160401b0316105b8015620044e2575067ffffffff0000000160c083901c105b15620044f057506001919050565b505f919050565b5f6200454d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620045cf9092919063ffffffff16565b805190915015620015fe57808060200190518101906200456e9190620054a2565b620015fe5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b72565b6060620045df84845f85620045e7565b949350505050565b6060824710156200464a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b72565b5f80866001600160a01b0316858760405162004667919062005449565b5f6040518083038185875af1925050503d805f8114620046a3576040519150601f19603f3d011682016040523d82523d5f602084013e620046a8565b606091505b509150915062001e028783838760608315620047285782515f0362004720576001600160a01b0385163b620047205760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b72565b5081620045df565b620045df83838151156200473f5781518083602001fd5b8060405162461bcd60e51b815260040162000b72919062004d55565b6108b880620054ec83390190565b6001600160a01b038116811462002e54575f80fd5b80356001600160401b038116811462003495575f80fd5b5f805f805f805f805f806101408b8d031215620047b0575f80fd5b8a35620047bd8162004769565b9950620047cd60208c016200477e565b9850620047dd60408c016200477e565b975060608b0135620047ef8162004769565b965060808b0135620048018162004769565b955060a08b0135620048138162004769565b945060c08b0135620048258162004769565b935060e08b0135620048378162004769565b9250620048486101008c016200477e565b9150620048596101208c016200477e565b90509295989b9194979a5092959850565b6001600160401b0391909116815260200190565b803563ffffffff8116811462003495575f80fd5b5f8060408385031215620048a4575f80fd5b620048af836200487e565b9150620048bf602084016200477e565b90509250929050565b5f805f805f8060c08789031215620048de575f80fd5b8635620048eb8162004769565b9550620048fb602088016200477e565b94506200490b604088016200477e565b935060608701356200491d8162004769565b925060808701356200492f8162004769565b915060a0870135620049418162004769565b809150509295509295509295565b5f6020828403121562004960575f80fd5b62000f81826200487e565b80610300810183101562000f84575f80fd5b5f805f805f805f806103e0898b03121562004996575f80fd5b620049a1896200487e565b9750620049b160208a016200477e565b9650620049c160408a016200477e565b9550620049d160608a016200477e565b9450620049e160808a016200477e565b935060a0890135925060c0890135915062004a008a60e08b016200496b565b90509295985092959890939650565b5f805f805f805f806103e0898b03121562004a28575f80fd5b62004a33896200487e565b975062004a4360208a016200477e565b965062004a5360408a016200477e565b955062004a6360608a016200477e565b94506080890135935060a0890135925060c089013562004a838162004769565b915062004a008a60e08b016200496b565b5f6020828403121562004aa5575f80fd5b813561ffff8116811462004ab7575f80fd5b9392505050565b5f6020828403121562004acf575f80fd5b5035919050565b5f806040838503121562004ae8575f80fd5b82359150602083013562004afc8162004769565b809150509250929050565b5f6020828403121562004b18575f80fd5b62000f81826200477e565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171562004b625762004b6262004b23565b604052919050565b5f82601f83011262004b7a575f80fd5b81356001600160401b0381111562004b965762004b9662004b23565b62004bab601f8201601f191660200162004b37565b81815284602083860101111562004bc0575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f805f60e0888a03121562004bf3575f80fd5b62004bfe886200487e565b965062004c0e602089016200477e565b9550604088013562004c208162004769565b9450606088013562004c328162004769565b9350608088013562004c448162004769565b925060a08801356001600160401b038082111562004c60575f80fd5b62004c6e8b838c0162004b6a565b935060c08a013591508082111562004c84575f80fd5b5062004c938a828b0162004b6a565b91505092959891949750929550565b5f805f805f8060c0878903121562004cb8575f80fd5b62004cc3876200487e565b955062004cd3602088016200477e565b945062004ce3604088016200477e565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b8381101562004d2057818101518382015260200162004d06565b50505f910152565b5f815180845262004d4181602086016020860162004d04565b601f01601f19169290920160200192915050565b602081525f62000f81602083018462004d28565b5f602080838503121562004d7b575f80fd5b82356001600160401b038082111562004d92575f80fd5b818501915085601f83011262004da6575f80fd5b81358181111562004dbb5762004dbb62004b23565b8060051b915062004dce84830162004b37565b818152918301840191848101908884111562004de8575f80fd5b938501935b8385101562004e085784358252938501939085019062004ded565b98975050505050505050565b5f806040838503121562004e26575f80fd5b62004e31836200477e565b946020939093013593505050565b6001600160a01b0391909116815260200190565b5f805f806060858703121562004e67575f80fd5b843562004e748162004769565b935062004e84602086016200487e565b925060408501356001600160401b038082111562004ea0575f80fd5b818701915087601f83011262004eb4575f80fd5b81358181111562004ec3575f80fd5b88602082850101111562004ed5575f80fd5b95989497505060200194505050565b5f6020828403121562004ef5575f80fd5b813562004ab78162004769565b803560ff8116811462003495575f80fd5b5f805f805f8060c0878903121562004f29575f80fd5b863562004f368162004769565b9550602087013562004f488162004769565b945062004f58604088016200477e565b935062004f68606088016200477e565b92506080870135915062004f7f60a0880162004f02565b90509295509295509295565b5f805f805f8060c0878903121562004fa1575f80fd5b863562004fae8162004769565b9550602087013562004fc08162004769565b945062004fd0604088016200477e565b935062004fe06060880162004f02565b92506080870135915060a08701356001600160401b0381111562005002575f80fd5b6200501089828a0162004b6a565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b80545f90600181811c90808316806200508557607f831692505b60208084108203620050a557634e487b7160e01b5f52602260045260245ffd5b83885260208801828015620050c35760018114620050da5762005105565b60ff198716825285151560051b8201975062005105565b5f898152602090205f5b87811015620050ff57815484820152908601908401620050e4565b83019850505b5050505050505092915050565b6001600160a01b0386811682528516602082015260a0604082018190525f906200513f908301866200506b565b82810360608401526200515381866200506b565b9150508260808301529695505050505050565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03818116838216019080821115620051be57620051be62005187565b5092915050565b808202811582820484141762000f845762000f8462005187565b5f63ffffffff808316818103620051fa57620051fa62005187565b6001019392505050565b6001600160a01b038481168252831660208201526060604082018190525f90620052319083018462004d28565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190525f906200527b9083018562004d28565b82810360a08401526200528f818562004d28565b9998505050505050505050565b6001600160401b03828116828216039080821115620051be57620051be62005187565b5f6001600160401b038281166002600160401b03198101620051fa57620051fa62005187565b634e487b7160e01b5f52603260045260245ffd5b8082018082111562000f845762000f8462005187565b5f6001820162005323576200532362005187565b5060010190565b5f602082840312156200533b575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8262005367576200536762005342565b500490565b5f826200537d576200537d62005342565b500690565b8181038181111562000f845762000f8462005187565b918252602082015260400190565b5f81620053b757620053b762005187565b505f190190565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190525f9062004e089083018462004d28565b5f82516200545c81846020870162004d04565b9190910192915050565b6103208101610300808584378201835f5b60018110156200549857815183526020928301929091019060010162005477565b5050509392505050565b5f60208284031215620054b3575f80fd5b8151801515811462004ab7575f80fd5b5f6001600160401b0383811680620054df57620054df62005342565b9216919091049291505056fe60a06040526040516108b83803806108b883398101604081905261002291610349565b828161002e8282610056565b50506001600160a01b03821660805261004e61004960805190565b6100b4565b50505061042e565b61005f82610121565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100a8576100a3828261019f565b505050565b6100b0610212565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f35f80516020610898833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161011e81610233565b50565b806001600160a01b03163b5f0361015b57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516101bb9190610413565b5f60405180830381855af49150503d805f81146101f3576040519150601f19603f3d011682016040523d82523d5f602084013e6101f8565b606091505b509092509050610209858383610270565b95945050505050565b34156102315760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661025c57604051633173bdd160e11b81525f6004820152602401610152565b805f8051602061089883398151915261017e565b60608261028557610280826102cf565b6102c8565b815115801561029c57506001600160a01b0384163b155b156102c557604051639996b31560e01b81526001600160a01b0385166004820152602401610152565b50805b9392505050565b8051156102df5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461030e575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015610341578181015183820152602001610329565b50505f910152565b5f805f6060848603121561035b575f80fd5b610364846102f8565b9250610372602085016102f8565b60408501519092506001600160401b038082111561038e575f80fd5b818601915086601f8301126103a1575f80fd5b8151818111156103b3576103b3610313565b604051601f8201601f19908116603f011681019083821181831017156103db576103db610313565b816040528281528960208487010111156103f3575f80fd5b610404836020830160208801610327565b80955050505050509250925092565b5f8251610424818460208701610327565b9190910192915050565b6080516104536104455f395f601001526104535ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610069575f356001600160e01b03191663278f794360e11b146100615761005f61006d565b565b61005f61007d565b61005f5b61005f6100786100ab565b6100cf565b5f8061008c36600481846102ba565b81019061009991906102f5565b915091506100a782826100ed565b5050565b5f6100ca5f805160206103fe833981519152546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156100e9573d5ff35b3d5ffd5b6100f682610147565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561013f5761013a82826101aa565b505050565b6100a761021c565b806001600160a01b03163b5f0361017c5780604051634c9c8ce360e01b815260040161017391906103bd565b60405180910390fd5b5f805160206103fe83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101c691906103d1565b5f60405180830381855af49150503d805f81146101fe576040519150601f19603f3d011682016040523d82523d5f602084013e610203565b606091505b509150915061021385838361023b565b95945050505050565b341561005f5760405163b398979f60e01b815260040160405180910390fd5b6060826102505761024b82610291565b61028a565b815115801561026757506001600160a01b0384163b155b156102875783604051639996b31560e01b815260040161017391906103bd565b50805b9392505050565b8051156102a15780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f80858511156102c8575f80fd5b838611156102d4575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610306575f80fd5b82356001600160a01b038116811461031c575f80fd5b915060208301356001600160401b0380821115610337575f80fd5b818501915085601f83011261034a575f80fd5b81358181111561035c5761035c6102e1565b604051601f8201601f19908116603f01168101908382118183101715610384576103846102e1565b8160405282815288602084870101111561039c575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b5f82515f5b818110156103f057602081860181015185830152016103d6565b505f92019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220d3b91b386436af95579d7d767b3c6e83ae79b09bd8dd9344bddb95185404c56564736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a26469706673582212207e99d5f87d7f70d36ef1507ceaaad2e7eded13630b5d2250efa94776f41f581464736f6c63430008140033", + "deployedBytecode": "0x608060405234801562000010575f80fd5b5060043610620002b4575f3560e01c80630645af0914620002b8578063066ec01214620002d1578063080b311114620002fd5780630a0d9fbe14620003255780630e36f582146200034057806311f6b287146200035757806312b86e19146200036e5780631489ed10146200038557806315064c96146200039c5780631608859c14620003aa5780631796a1ae14620003c15780631816b7e514620003e85780632072f6c514620003ff578063248a9ca3146200040957806325280169146200042f5780632f2ff15d14620004e357806330c27dde14620004fa57806336568abe146200050e578063394218e91462000525578063477fa270146200053c57806355a71ee0146200054557806360469169146200058857806365c0504d14620005925780637222020f1462000640578063727885e914620006575780637975fcfe146200066e5780637fb6e76a1462000694578063841b24d714620006bc57806387c20c0114620006d75780638bd4f07114620006ee5780638f698ec5146200070557806391d14854146200071c57806399f5634e14620007335780639a908e73146200073d5780639c9f3dfe1462000754578063a066215c146200076b578063a217fddf1462000782578063a2967d99146200078a578063a3c573eb1462000794578063afd23cbe14620007cb578063b99d0ad714620007f5578063c1acbc3414620008cc578063c4c928c214620008e7578063ceee281d14620008fe578063d02103ca1462000926578063d5073f6f146200094e578063d547741f1462000965578063d939b315146200097c578063dbc169761462000990578063dde0ff77146200099a578063e0bfd3d214620009b5578063e46761c414620009cc578063f34eb8eb14620009f4578063f4e926751462000a0b578063f9c4c2ae1462000a1c575b5f80fd5b620002cf620002c936600462004795565b62000b32565b005b608454620002e5906001600160401b031681565b604051620002f491906200486a565b60405180910390f35b620003146200030e36600462004892565b62000f61565b6040519015158152602001620002f4565b608554620002e590600160401b90046001600160401b031681565b620002cf62000351366004620048c8565b62000f8a565b620002e5620003683660046200494f565b62001221565b620002cf6200037f3660046200497d565b62001240565b620002cf6200039636600462004a0f565b620013e8565b606f54620003149060ff1681565b620002cf620003bb36600462004892565b62001570565b607e54620003d29063ffffffff1681565b60405163ffffffff9091168152602001620002f4565b620002cf620003f936600462004a94565b62001603565b620002cf620016ae565b620004206200041a36600462004abe565b62001773565b604051908152602001620002f4565b620004af6200044036600462004892565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002f4565b620002cf620004f436600462004ad6565b62001787565b608754620002e5906001600160401b031681565b620002cf6200051f36600462004ad6565b620017a9565b620002cf6200053636600462004b07565b620017e3565b60865462000420565b620004206200055636600462004892565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b6200042062001891565b620005f6620005a33660046200494f565b607f6020525f90815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002f4565b620002cf620006513660046200494f565b620018a8565b620002cf6200066836600462004bdc565b62001990565b620006856200067f36600462004ca2565b62001ddb565b604051620002f4919062004d55565b620003d2620006a536600462004b07565b60836020525f908152604090205463ffffffff1681565b608454620002e590600160c01b90046001600160401b031681565b620002cf620006e836600462004a0f565b62001e0d565b620002cf620006ff3660046200497d565b62002128565b620002cf6200071636600462004d69565b620021df565b620003146200072d36600462004ad6565b62002263565b620004206200228d565b620002e56200074e36600462004e14565b62002373565b620002cf6200076536600462004b07565b6200253a565b620002cf6200077c36600462004b07565b620025dc565b620004205f81565b620004206200267a565b620007bc7f000000000000000000000000000000000000000000000000000000000000000081565b604051620002f4919062004e3f565b608554620007e190600160801b900461ffff1681565b60405161ffff9091168152602001620002f4565b6200088a6200080636600462004892565b60408051608080820183525f8083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002f4919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002e590600160801b90046001600160401b031681565b620002cf620008f836600462004e53565b62002a2f565b620003d26200090f36600462004ee4565b60826020525f908152604090205463ffffffff1681565b620007bc7f000000000000000000000000000000000000000000000000000000000000000081565b620002cf6200095f36600462004abe565b62002cf2565b620002cf6200097636600462004ad6565b62002d7c565b608554620002e5906001600160401b031681565b620002cf62002d9e565b608454620002e590600160401b90046001600160401b031681565b620002cf620009c636600462004f13565b62002e57565b620007bc7f000000000000000000000000000000000000000000000000000000000000000081565b620002cf62000a0536600462004f8b565b62002f19565b608054620003d29063ffffffff1681565b62000ab262000a2d3660046200494f565b60816020525f9081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002f4565b5f54600290610100900460ff1615801562000b5357505f5460ff8083169116105b62000b7b5760405162461bcd60e51b815260040162000b72906200501d565b60405180910390fd5b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000bfb620030fb565b62000c155f8051602062005f448339815191528c62003167565b62000c215f8862003167565b62000c3b5f8051602062005e248339815191528862003167565b62000c555f8051602062005ea48339815191528862003167565b62000c6f5f8051602062005dc48339815191528862003167565b62000c895f8051602062005e048339815191528962003167565b62000ca35f8051602062005f248339815191528962003167565b62000cbd5f8051602062005e448339815191528962003167565b62000cd75f8051602062005ec48339815191528962003167565b62000cff5f8051602062005f448339815191525f8051602062005da483398151915262003173565b62000d195f8051602062005da48339815191528962003167565b62000d335f8051602062005de48339815191528962003167565b62000d5b5f8051602062005f048339815191525f8051602062005ee483398151915262003173565b62000d755f8051602062005f048339815191528762003167565b62000d8f5f8051602062005ee48339815191528762003167565b6073546074546001600160401b03600160401b9092048216911680821462000dca57604051632e4cc54360e11b815260040160405180910390fd5b5f62000def888888885f60745f9054906101000a90046001600160401b0316620031c6565b6001600160401b038381165f81815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b91829004909b1681029a909a17905560068a01805490911690931797870297909717909155600787018054909616909417909455607a54606f549390915290549251635d6717a560e01b81529394506001600160a01b038c811694635d6717a59462000eec9493831693600160581b9004909216916076916077919060040162005112565b5f604051808303815f87803b15801562000f04575f80fd5b505af115801562000f17573d5f803e3d5ffd5b50505f805461ff0019169055505060405160ff851681525f8051602062005e848339815191529350602001915062000f4c9050565b60405180910390a15050505050505050505050565b63ffffffff82165f90815260816020526040812062000f819083620033e7565b90505b92915050565b5f54600290610100900460ff1615801562000fab57505f5460ff8083169116105b62000fca5760405162461bcd60e51b815260040162000b72906200501d565b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200104a620030fb565b620010645f8051602062005f448339815191528862003167565b620010705f8462003167565b6200108a5f8051602062005e248339815191528462003167565b620010a45f8051602062005ea48339815191528462003167565b620010be5f8051602062005dc48339815191528462003167565b620010d85f8051602062005e048339815191528562003167565b620010f25f8051602062005f248339815191528562003167565b6200110c5f8051602062005e448339815191528562003167565b620011265f8051602062005ec48339815191528562003167565b6200114e5f8051602062005f448339815191525f8051602062005da483398151915262003173565b620011685f8051602062005da48339815191528562003167565b620011825f8051602062005de48339815191528562003167565b620011aa5f8051602062005f048339815191525f8051602062005ee483398151915262003173565b620011c45f8051602062005f048339815191528362003167565b620011de5f8051602062005ee48339815191528362003167565b620011ea5f3362003167565b5f805461ff001916905560405160ff821681525f8051602062005e848339815191529060200160405180910390a150505050505050565b63ffffffff81165f90815260816020526040812062000f84906200342b565b5f8051602062005f448339815191526200125a816200349a565b63ffffffff89165f90815260816020526040902062001280818a8a8a8a8a8a8a620034a6565b600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b90041615620012e7576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620013206200267a565b6040518263ffffffff1660e01b81526004016200133f91815260200190565b5f604051808303815f87803b15801562001357575f80fd5b505af11580156200136a573d5f803e3d5ffd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b5f8051602062005f4483398151915262001402816200349a565b63ffffffff89165f90815260816020526040902062001428818a8a8a8a8a8a8a62003822565b600681018054600160401b600160801b031916600160401b6001600160401b038a81169182029290921783555f9081526002840160205260409020879055600583018890559054600160801b900416156200148f576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620014c86200267a565b6040518263ffffffff1660e01b8152600401620014e791815260200190565b5f604051808303815f87803b158015620014ff575f80fd5b505af115801562001512573d5f803e3d5ffd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a6040516200155c9392919062005166565b60405180910390a350505050505050505050565b63ffffffff82165f9081526081602052604090206200159e5f8051602062005f448339815191523362002263565b620015f257606f5460ff1615620015c857604051630bc011ff60e21b815260040160405180910390fd5b620015d48183620033e7565b620015f257604051630674f25160e11b815260040160405180910390fd5b620015fe818362003c0e565b505050565b5f8051602062005ec48339815191526200161d816200349a565b6103e88261ffff1610806200163757506103ff8261ffff16115b156200165657604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620016c85f8051602062005f048339815191523362002263565b6200176757608454600160801b90046001600160401b0316158062001718575060845442906200170d9062093a8090600160801b90046001600160401b03166200519b565b6001600160401b0316115b8062001748575060875442906200173d9062093a80906001600160401b03166200519b565b6001600160401b0316115b15620017675760405163692baaad60e11b815260040160405180910390fd5b6200177162003df9565b565b5f9081526034602052604090206001015490565b620017928262001773565b6200179d816200349a565b620015fe838362003e73565b6001600160a01b0381163314620017d357604051630b4ad1cd60e31b815260040160405180910390fd5b620017df828262003ede565b5050565b5f8051602062005ec4833981519152620017fd816200349a565b606f5460ff166200183f576084546001600160401b03600160c01b9091048116908316106200183f5760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190620016a29084906200486a565b5f6086546064620018a39190620051c5565b905090565b5f8051602062005e04833981519152620018c2816200349a565b63ffffffff82161580620018e15750607e5463ffffffff908116908316115b156200190057604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f60205260409020600180820154600160e81b900460ff16151590036200194657604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b5f8051602062005f24833981519152620019aa816200349a565b63ffffffff88161580620019c95750607e5463ffffffff908116908916115b15620019e857604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88165f908152607f60205260409020600180820154600160e81b900460ff161515900362001a2e57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b0388165f9081526083602052604090205463ffffffff161562001a6b576040516337c8fe0960e11b815260040160405180910390fd5b608080545f9190829062001a859063ffffffff16620051df565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b0390921691309162001ad2906200475b565b62001ae09392919062005204565b604051809103905ff08015801562001afa573d5f803e3d5ffd5b5090508160835f8c6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508a815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001d5e949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001d9e908d908d9088908e908e908e906004016200523a565b5f604051808303815f87803b15801562001db6575f80fd5b505af115801562001dc9573d5f803e3d5ffd5b50505050505050505050505050505050565b63ffffffff86165f90815260816020526040902060609062001e0290878787878762003f47565b979650505050505050565b606f5460ff161562001e3257604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001e8092600160c01b9004811691166200519b565b6001600160401b0316111562001ea957604051638a0704d360e01b815260040160405180910390fd5b6103e862001eb888886200529c565b6001600160401b0316111562001ee157604051635acfba9d60e11b815260040160405180910390fd5b62001ef3818989898989898962003822565b62001eff818762004081565b6085546001600160401b03165f036200200657600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562001f79576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001fb26200267a565b6040518263ffffffff1660e01b815260040162001fd191815260200190565b5f604051808303815f87803b15801562001fe9575f80fd5b505af115801562001ffc573d5f803e3d5ffd5b50505050620020cf565b620020118162004278565b600681018054600160801b90046001600160401b03169060106200203583620052bf565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b900487165f90815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b4888789604051620021159392919062005166565b60405180910390a3505050505050505050565b606f5460ff16156200214d57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f908152608160205260409020620021738189898989898989620034a6565b6001600160401b0387165f9081526004820160209081526040918290206002015482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620021d462003df9565b505050505050505050565b80516080805463ffffffff191663ffffffff9092169190911790555f5b8151811015620017df578181815181106200221b576200221b620052e5565b602002602001015160815f836001620022359190620052f9565b63ffffffff16815260208101919091526040015f2060050155806200225a816200530f565b915050620021fc565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401620022dd919062004e3f565b602060405180830381865afa158015620022f9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200231f91906200532a565b6084549091505f9062002345906001600160401b03600160401b8204811691166200529c565b6001600160401b03169050805f0362002360575f9250505090565b6200236c818362005356565b9250505090565b606f545f9060ff16156200239a57604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff1690819003620023d1576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f03620023fb57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f90815260816020526040812060848054919287926200242d9084906001600160401b03166200519b565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f6200246287836200519b565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f95865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b031990921692909316919091171790559050620024f08362004278565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a25826040516200252891906200486a565b60405180910390a29695505050505050565b5f8051602062005ec483398151915262002554816200349a565b606f5460ff166200258f576085546001600160401b03908116908316106200258f5760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590620016a29084906200486a565b5f8051602062005ec4833981519152620025f6816200349a565b62015180826001600160401b031611156200262457604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890620016a29084906200486a565b6080545f9063ffffffff168082036200269457505f919050565b5f816001600160401b03811115620026b057620026b062004b23565b604051908082528060200260200182016040528015620026da578160200160208202803683370190505b5090505f5b828110156200274a5760815f620026f8836001620052f9565b63ffffffff1663ffffffff1681526020019081526020015f20600501548282815181106200272a576200272a620052e5565b60209081029190910101528062002741816200530f565b915050620026df565b505f60205b836001146200298a575f620027666002866200536c565b6200277360028762005356565b6200277f9190620052f9565b90505f816001600160401b038111156200279d576200279d62004b23565b604051908082528060200260200182016040528015620027c7578160200160208202803683370190505b5090505f5b828110156200293e57620027e260018462005382565b81148015620027fd5750620027f96002886200536c565b6001145b156200287d578562002811826002620051c5565b81518110620028245762002824620052e5565b6020026020010151856040516020016200284092919062005398565b604051602081830303815290604052805190602001208282815181106200286b576200286b620052e5565b60200260200101818152505062002929565b856200288b826002620051c5565b815181106200289e576200289e620052e5565b602002602001015186826002620028b69190620051c5565b620028c3906001620052f9565b81518110620028d657620028d6620052e5565b6020026020010151604051602001620028f192919062005398565b604051602081830303815290604052805190602001208282815181106200291c576200291c620052e5565b6020026020010181815250505b8062002935816200530f565b915050620027cc565b5080945081955083846040516020016200295a92919062005398565b60405160208183030381529060405280519060200120935082806200297f90620053a6565b93505050506200274f565b5f835f81518110620029a057620029a0620052e5565b602002602001015190505f5b8281101562002a25578184604051602001620029ca92919062005398565b6040516020818303038152906040528051906020012091508384604051602001620029f792919062005398565b604051602081830303815290604052805190602001209350808062002a1c906200530f565b915050620029ac565b5095945050505050565b5f8051602062005dc483398151915262002a49816200349a565b63ffffffff8416158062002a685750607e5463ffffffff908116908516115b1562002a8757604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526082602052604081205463ffffffff169081900362002ac7576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002b1557604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86165f908152607f60205260409020600180820154600160e81b900460ff161515900362002b5b57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002b9957604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790555f62002c188462001221565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002c6d9216908b908b90600401620053be565b5f604051808303815f87803b15801562002c85575f80fd5b505af115801562002c98573d5f803e3d5ffd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b5f8051602062005de483398151915262002d0c816200349a565b683635c9adc5dea0000082118062002d275750633b9aca0082105b1562002d4657604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620016a2565b62002d878262001773565b62002d92816200349a565b620015fe838362003ede565b5f8051602062005e4483398151915262002db8816200349a565b608780546001600160401b031916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc16976916004808301925f92919082900301818387803b15801562002e33575f80fd5b505af115801562002e46573d5f803e3d5ffd5b5050505062002e5462004341565b50565b5f8051602062005ea483398151915262002e71816200349a565b6001600160401b0384165f9081526083602052604090205463ffffffff161562002eae576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b0387165f9081526082602052604090205463ffffffff161562002eeb57604051630d409b9360e41b815260040160405180910390fd5b5f62002efc88888888875f620031c6565b5f8080526002909101602052604090209390935550505050505050565b5f8051602062005e2483398151915262002f33816200349a565b607e80545f9190829062002f4d9063ffffffff16620051df565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff1681526020015f1515815260200185815250607f5f8363ffffffff1663ffffffff1681526020019081526020015f205f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620030e996959493929190620053fd565b60405180910390a25050505050505050565b5f54610100900460ff16620017715760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b72565b620017df828262003e73565b5f6200317f8362001773565b5f84815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080545f9182918290620031e19063ffffffff16620051df565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f876001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff16021790555060815f8263ffffffff1663ffffffff1681526020019081526020015f20915087825f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b0316021790555086826001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555084825f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620033d49594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b038281165f90815260048501602052604081205490924292620034199291811691166200519b565b6001600160401b031611159392505050565b60068101545f90600160801b90046001600160401b0316156200347d575060068101546001600160401b03600160801b90910481165f9081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002e54813362004399565b60078801545f906001600160401b039081169087161015620034db5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038816156200357b5760068901546001600160401b03600160801b90910481169089161115620035255760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f90815260048a0160205260409020600281015481549092888116600160401b90920416146200357457604051632bd2e3e760e01b815260040160405180910390fd5b50620035ef565b506001600160401b0385165f90815260028901602052604090205480620035b5576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620035ef57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620036285750876001600160401b0316876001600160401b031611155b806200364c575060068901546001600160401b03600160c01b909104811690881611155b156200366b5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260048b016020526040902054600160401b9004811690861614620036b1576040516332a2a77f60e01b815260040160405180910390fd5b5f620036c28a888888868962003f47565b90505f5f8051602062005e64833981519152600283604051620036e6919062005449565b602060405180830381855afa15801562003702573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200372791906200532a565b6200373391906200536c565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620037779188919060040162005466565b602060405180830381865afa15801562003793573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620037b99190620054a2565b620037d7576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260048c016020526040902060020154859003620038155760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b5f806200382f8a6200342b565b60078b01549091506001600160401b039081169089161015620038655760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620039075760068a01546001600160401b03600160801b9091048116908a161115620038af5760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a165f90815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200390057604051632bd2e3e760e01b815260040160405180910390fd5b5062003976565b6001600160401b0388165f90815260028b01602052604090205491508162003942576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200397657604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620039a95760405163b9b18f5760e01b815260040160405180910390fd5b5f620039ba8b8a8a8a878b62003f47565b90505f5f8051602062005e64833981519152600283604051620039de919062005449565b602060405180830381855afa158015620039fa573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019062003a1f91906200532a565b62003a2b91906200536c565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003a6f9189919060040162005466565b602060405180830381865afa15801562003a8b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062003ab19190620054a2565b62003acf576040516309bde33960e01b815260040160405180910390fd5b5f62003adc848b6200529c565b905062003b3587826001600160401b031662003af76200228d565b62003b039190620051c5565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620043c3565b80608460088282829054906101000a90046001600160401b031662003b5b91906200519b565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d153906064015f604051808303815f87803b15801562003be8575f80fd5b505af115801562003bfb573d5f803e3d5ffd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003c4d575060068201546001600160401b03600160801b9091048116908216115b1562003c6c5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f81815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003d276200267a565b6040518263ffffffff1660e01b815260040162003d4691815260200190565b5f604051808303815f87803b15801562003d5e575f80fd5b505af115801562003d71573d5f803e3d5ffd5b505085546001600160a01b03165f90815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801562003e52575f80fd5b505af115801562003e65573d5f803e3d5ffd5b505050506200177162004417565b62003e7f828262002263565b620017df575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003eea828262002263565b15620017df575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086165f818152600389016020526040808220549388168252902054606092911580159062003f7c575081155b1562003f9b5760405163340c614f60e11b815260040160405180910390fd5b8062003fba576040516366385b5160e01b815260040160405180910390fd5b62003fc58462004473565b62003fe3576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b5f6200408d836200342b565b9050815f806200409e84846200529c565b6085546001600160401b0391821692505f91620040c491600160401b9004164262005382565b90505b846001600160401b0316846001600160401b0316146200414d576001600160401b038085165f9081526003890160205260409020600181015490911682101562004128576001810154600160401b90046001600160401b0316945062004146565b6200413486866200529c565b6001600160401b03169350506200414d565b50620040c7565b5f6200415a848462005382565b905083811015620041b857808403600c81116200417857806200417b565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620041ad57620041ad62005342565b04608655506200422f565b838103600c8111620041cb5780620041ce565b600c5b90505f816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162004207576200420762005342565b04905080608654670de0b6b3a7640000028162004228576200422862005342565b0460865550505b683635c9adc5dea0000060865411156200425657683635c9adc5dea000006086556200426e565b633b9aca0060865410156200426e57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002e545760068101545f90620042c290600160c01b90046001600160401b031660016200519b565b9050620042d08282620033e7565b15620017df5760068201545f90600290620042fd908490600160801b90046001600160401b03166200529c565b620043099190620054c3565b6200431590836200519b565b9050620043238382620033e7565b156200433557620015fe838262003c0e565b620015fe838362003c0e565b606f5460ff166200436557604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b620043a5828262002263565b620017df57604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620015fe908490620044f7565b606f5460ff16156200443c57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff000000016001600160401b038316108015620044a9575067ffffffff00000001604083901c6001600160401b0316105b8015620044ca575067ffffffff00000001608083901c6001600160401b0316105b8015620044e2575067ffffffff0000000160c083901c105b15620044f057506001919050565b505f919050565b5f6200454d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620045cf9092919063ffffffff16565b805190915015620015fe57808060200190518101906200456e9190620054a2565b620015fe5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b72565b6060620045df84845f85620045e7565b949350505050565b6060824710156200464a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b72565b5f80866001600160a01b0316858760405162004667919062005449565b5f6040518083038185875af1925050503d805f8114620046a3576040519150601f19603f3d011682016040523d82523d5f602084013e620046a8565b606091505b509150915062001e028783838760608315620047285782515f0362004720576001600160a01b0385163b620047205760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b72565b5081620045df565b620045df83838151156200473f5781518083602001fd5b8060405162461bcd60e51b815260040162000b72919062004d55565b6108b880620054ec83390190565b6001600160a01b038116811462002e54575f80fd5b80356001600160401b038116811462003495575f80fd5b5f805f805f805f805f806101408b8d031215620047b0575f80fd5b8a35620047bd8162004769565b9950620047cd60208c016200477e565b9850620047dd60408c016200477e565b975060608b0135620047ef8162004769565b965060808b0135620048018162004769565b955060a08b0135620048138162004769565b945060c08b0135620048258162004769565b935060e08b0135620048378162004769565b9250620048486101008c016200477e565b9150620048596101208c016200477e565b90509295989b9194979a5092959850565b6001600160401b0391909116815260200190565b803563ffffffff8116811462003495575f80fd5b5f8060408385031215620048a4575f80fd5b620048af836200487e565b9150620048bf602084016200477e565b90509250929050565b5f805f805f8060c08789031215620048de575f80fd5b8635620048eb8162004769565b9550620048fb602088016200477e565b94506200490b604088016200477e565b935060608701356200491d8162004769565b925060808701356200492f8162004769565b915060a0870135620049418162004769565b809150509295509295509295565b5f6020828403121562004960575f80fd5b62000f81826200487e565b80610300810183101562000f84575f80fd5b5f805f805f805f806103e0898b03121562004996575f80fd5b620049a1896200487e565b9750620049b160208a016200477e565b9650620049c160408a016200477e565b9550620049d160608a016200477e565b9450620049e160808a016200477e565b935060a0890135925060c0890135915062004a008a60e08b016200496b565b90509295985092959890939650565b5f805f805f805f806103e0898b03121562004a28575f80fd5b62004a33896200487e565b975062004a4360208a016200477e565b965062004a5360408a016200477e565b955062004a6360608a016200477e565b94506080890135935060a0890135925060c089013562004a838162004769565b915062004a008a60e08b016200496b565b5f6020828403121562004aa5575f80fd5b813561ffff8116811462004ab7575f80fd5b9392505050565b5f6020828403121562004acf575f80fd5b5035919050565b5f806040838503121562004ae8575f80fd5b82359150602083013562004afc8162004769565b809150509250929050565b5f6020828403121562004b18575f80fd5b62000f81826200477e565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171562004b625762004b6262004b23565b604052919050565b5f82601f83011262004b7a575f80fd5b81356001600160401b0381111562004b965762004b9662004b23565b62004bab601f8201601f191660200162004b37565b81815284602083860101111562004bc0575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f805f60e0888a03121562004bf3575f80fd5b62004bfe886200487e565b965062004c0e602089016200477e565b9550604088013562004c208162004769565b9450606088013562004c328162004769565b9350608088013562004c448162004769565b925060a08801356001600160401b038082111562004c60575f80fd5b62004c6e8b838c0162004b6a565b935060c08a013591508082111562004c84575f80fd5b5062004c938a828b0162004b6a565b91505092959891949750929550565b5f805f805f8060c0878903121562004cb8575f80fd5b62004cc3876200487e565b955062004cd3602088016200477e565b945062004ce3604088016200477e565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b8381101562004d2057818101518382015260200162004d06565b50505f910152565b5f815180845262004d4181602086016020860162004d04565b601f01601f19169290920160200192915050565b602081525f62000f81602083018462004d28565b5f602080838503121562004d7b575f80fd5b82356001600160401b038082111562004d92575f80fd5b818501915085601f83011262004da6575f80fd5b81358181111562004dbb5762004dbb62004b23565b8060051b915062004dce84830162004b37565b818152918301840191848101908884111562004de8575f80fd5b938501935b8385101562004e085784358252938501939085019062004ded565b98975050505050505050565b5f806040838503121562004e26575f80fd5b62004e31836200477e565b946020939093013593505050565b6001600160a01b0391909116815260200190565b5f805f806060858703121562004e67575f80fd5b843562004e748162004769565b935062004e84602086016200487e565b925060408501356001600160401b038082111562004ea0575f80fd5b818701915087601f83011262004eb4575f80fd5b81358181111562004ec3575f80fd5b88602082850101111562004ed5575f80fd5b95989497505060200194505050565b5f6020828403121562004ef5575f80fd5b813562004ab78162004769565b803560ff8116811462003495575f80fd5b5f805f805f8060c0878903121562004f29575f80fd5b863562004f368162004769565b9550602087013562004f488162004769565b945062004f58604088016200477e565b935062004f68606088016200477e565b92506080870135915062004f7f60a0880162004f02565b90509295509295509295565b5f805f805f8060c0878903121562004fa1575f80fd5b863562004fae8162004769565b9550602087013562004fc08162004769565b945062004fd0604088016200477e565b935062004fe06060880162004f02565b92506080870135915060a08701356001600160401b0381111562005002575f80fd5b6200501089828a0162004b6a565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b80545f90600181811c90808316806200508557607f831692505b60208084108203620050a557634e487b7160e01b5f52602260045260245ffd5b83885260208801828015620050c35760018114620050da5762005105565b60ff198716825285151560051b8201975062005105565b5f898152602090205f5b87811015620050ff57815484820152908601908401620050e4565b83019850505b5050505050505092915050565b6001600160a01b0386811682528516602082015260a0604082018190525f906200513f908301866200506b565b82810360608401526200515381866200506b565b9150508260808301529695505050505050565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03818116838216019080821115620051be57620051be62005187565b5092915050565b808202811582820484141762000f845762000f8462005187565b5f63ffffffff808316818103620051fa57620051fa62005187565b6001019392505050565b6001600160a01b038481168252831660208201526060604082018190525f90620052319083018462004d28565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190525f906200527b9083018562004d28565b82810360a08401526200528f818562004d28565b9998505050505050505050565b6001600160401b03828116828216039080821115620051be57620051be62005187565b5f6001600160401b038281166002600160401b03198101620051fa57620051fa62005187565b634e487b7160e01b5f52603260045260245ffd5b8082018082111562000f845762000f8462005187565b5f6001820162005323576200532362005187565b5060010190565b5f602082840312156200533b575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8262005367576200536762005342565b500490565b5f826200537d576200537d62005342565b500690565b8181038181111562000f845762000f8462005187565b918252602082015260400190565b5f81620053b757620053b762005187565b505f190190565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190525f9062004e089083018462004d28565b5f82516200545c81846020870162004d04565b9190910192915050565b6103208101610300808584378201835f5b60018110156200549857815183526020928301929091019060010162005477565b5050509392505050565b5f60208284031215620054b3575f80fd5b8151801515811462004ab7575f80fd5b5f6001600160401b0383811680620054df57620054df62005342565b9216919091049291505056fe60a06040526040516108b83803806108b883398101604081905261002291610349565b828161002e8282610056565b50506001600160a01b03821660805261004e61004960805190565b6100b4565b50505061042e565b61005f82610121565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100a8576100a3828261019f565b505050565b6100b0610212565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f35f80516020610898833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161011e81610233565b50565b806001600160a01b03163b5f0361015b57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516101bb9190610413565b5f60405180830381855af49150503d805f81146101f3576040519150601f19603f3d011682016040523d82523d5f602084013e6101f8565b606091505b509092509050610209858383610270565b95945050505050565b34156102315760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661025c57604051633173bdd160e11b81525f6004820152602401610152565b805f8051602061089883398151915261017e565b60608261028557610280826102cf565b6102c8565b815115801561029c57506001600160a01b0384163b155b156102c557604051639996b31560e01b81526001600160a01b0385166004820152602401610152565b50805b9392505050565b8051156102df5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461030e575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015610341578181015183820152602001610329565b50505f910152565b5f805f6060848603121561035b575f80fd5b610364846102f8565b9250610372602085016102f8565b60408501519092506001600160401b038082111561038e575f80fd5b818601915086601f8301126103a1575f80fd5b8151818111156103b3576103b3610313565b604051601f8201601f19908116603f011681019083821181831017156103db576103db610313565b816040528281528960208487010111156103f3575f80fd5b610404836020830160208801610327565b80955050505050509250925092565b5f8251610424818460208701610327565b9190910192915050565b6080516104536104455f395f601001526104535ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610069575f356001600160e01b03191663278f794360e11b146100615761005f61006d565b565b61005f61007d565b61005f5b61005f6100786100ab565b6100cf565b5f8061008c36600481846102ba565b81019061009991906102f5565b915091506100a782826100ed565b5050565b5f6100ca5f805160206103fe833981519152546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156100e9573d5ff35b3d5ffd5b6100f682610147565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561013f5761013a82826101aa565b505050565b6100a761021c565b806001600160a01b03163b5f0361017c5780604051634c9c8ce360e01b815260040161017391906103bd565b60405180910390fd5b5f805160206103fe83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101c691906103d1565b5f60405180830381855af49150503d805f81146101fe576040519150601f19603f3d011682016040523d82523d5f602084013e610203565b606091505b509150915061021385838361023b565b95945050505050565b341561005f5760405163b398979f60e01b815260040160405180910390fd5b6060826102505761024b82610291565b61028a565b815115801561026757506001600160a01b0384163b155b156102875783604051639996b31560e01b815260040161017391906103bd565b50805b9392505050565b8051156102a15780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f80858511156102c8575f80fd5b838611156102d4575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610306575f80fd5b82356001600160a01b038116811461031c575f80fd5b915060208301356001600160401b0380821115610337575f80fd5b818501915085601f83011261034a575f80fd5b81358181111561035c5761035c6102e1565b604051601f8201601f19908116603f01168101908382118183101715610384576103846102e1565b8160405282815288602084870101111561039c575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b5f82515f5b818110156103f057602081860181015185830152016103d6565b505f92019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220d3b91b386436af95579d7d767b3c6e83ae79b09bd8dd9344bddb95185404c56564736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a26469706673582212207e99d5f87d7f70d36ef1507ceaaad2e7eded13630b5d2250efa94776f41f581464736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/PolygonRollupManagerMockInternalTest.json b/compiled-contracts/PolygonRollupManagerMockInternalTest.json new file mode 100644 index 000000000..2ed52d8cf --- /dev/null +++ b/compiled-contracts/PolygonRollupManagerMockInternalTest.json @@ -0,0 +1,1972 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonRollupManagerMockInternalTest", + "sourceName": "contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRootV2", + "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": "BatchFeeOutOfRange", + "type": "error" + }, + { + "inputs": [], + "name": "ChainIDAlreadyExist", + "type": "error" + }, + { + "inputs": [], + "name": "ExceedMaxVerifyBatches", + "type": "error" + }, + { + "inputs": [], + "name": "FinalNumBatchBelowLastVerifiedBatch", + "type": "error" + }, + { + "inputs": [], + "name": "FinalNumBatchDoesNotMatchPendingState", + "type": "error" + }, + { + "inputs": [], + "name": "FinalPendingStateNumInvalid", + "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": "InvalidRangeMultiplierBatchFee", + "type": "error" + }, + { + "inputs": [], + "name": "MustSequenceSomeBatch", + "type": "error" + }, + { + "inputs": [], + "name": "NewAccInputHashDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "NewPendingStateTimeoutMustBeLower", + "type": "error" + }, + { + "inputs": [], + "name": "NewStateRootNotInsidePrime", + "type": "error" + }, + { + "inputs": [], + "name": "NewTrustedAggregatorTimeoutMustBeLower", + "type": "error" + }, + { + "inputs": [], + "name": "OldAccInputHashDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "OldStateRootDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyEmergencyState", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyNotEmergencyState", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateInvalid", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateNotConsolidable", + "type": "error" + }, + { + "inputs": [], + "name": "RollupAddressAlreadyExist", + "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": "TrustedAggregatorTimeoutNotExpired", + "type": "error" + }, + { + "inputs": [], + "name": "UpdateNotCompatible", + "type": "error" + }, + { + "inputs": [], + "name": "UpdateToSameRollupTypeID", + "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" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "lastVerifiedBatchBeforeUpgrade", + "type": "uint64" + } + ], + "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" + } + ], + "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": "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 IPolygonZkEVMGlobalExitRootV2", + "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 PolygonZkEVMExistentEtrog", + "name": "polygonZkEVM", + "type": "address" + }, + { + "internalType": "contract IVerifierRollup", + "name": "zkEVMVerifier", + "type": "address" + }, + { + "internalType": "uint64", + "name": "zkEVMForkID", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "zkEVMChainID", + "type": "uint64" + } + ], + "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": "lastDeactivatedEmergencyStateTimestamp", + "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": "uint32", + "name": "rollupTypeID", + "type": "uint32" + } + ], + "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": "0x60e060405234801562000010575f80fd5b5060405162005ace38038062005ace83398101604081905262000033916200013c565b6001600160a01b0380841660805280831660c052811660a0528282826200005962000065565b5050505050506200018d565b5f54610100900460ff1615620000d15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101562000122575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811462000139575f80fd5b50565b5f805f606084860312156200014f575f80fd5b83516200015c8162000124565b60208501519093506200016f8162000124565b6040850151909250620001828162000124565b809150509250925092565b60805160a05160c0516158de620001f05f395f8181610a1c01528181611f92015261366801525f81816107d701528181612b22015261395701525f81816109760152818161102a015281816111d201528181611cdd015261384c01526158de5ff3fe608060405234801562000010575f80fd5b50600436106200030c575f3560e01c8063841b24d711620001a3578063c1acbc3411620000f3578063dbc16976116200009b578063dbc1697614620009da578063dde0ff7714620009e4578063e0bfd3d214620009ff578063e46761c41462000a16578063f34eb8eb1462000a3e578063f4e926751462000a55578063f9c4c2ae1462000a66575f80fd5b8063c1acbc341462000916578063c4c928c21462000931578063ceee281d1462000948578063d02103ca1462000970578063d5073f6f1462000998578063d547741f14620009af578063d939b31514620009c6575f80fd5b80639c9f3dfe11620001575780639c9f3dfe1462000791578063a066215c14620007a8578063a217fddf14620007bf578063a2967d9914620007c7578063a3c573eb14620007d1578063afd23cbe1462000812578063b99d0ad7146200083c575f80fd5b8063841b24d7146200071057806387c20c01146200072b5780638bd4f071146200074257806391d14854146200075957806399f5634e14620007705780639a908e73146200077a575f80fd5b806325280169116200025f57806355a71ee0116200021357806355a71ee014620005995780636046916914620005dc57806365c0504d14620005e65780637222020f1462000694578063727885e914620006ab5780637975fcfe14620006c25780637fb6e76a14620006e8575f80fd5b80632528016914620004835780632f2ff15d146200053757806330c27dde146200054e57806336568abe1462000562578063394218e91462000579578063477fa2701462000590575f80fd5b80631489ed1011620002c35780631489ed1014620003cb57806315064c9614620003e25780631608859c14620003f05780631796a1ae14620004075780631816b7e5146200042e5780632072f6c51462000445578063248a9ca3146200044f575f80fd5b80630645af091462000310578063066ec0121462000329578063080b3111146200035a5780630a0d9fbe146200038257806311f6b287146200039d57806312b86e1914620003b4575b5f80fd5b620003276200032136600462004517565b62000b7c565b005b6084546200033d906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b620003716200036b36600462004600565b62000f39565b604051901515815260200162000351565b6085546200033d90600160401b90046001600160401b031681565b6200033d620003ae36600462004636565b62000f62565b62000327620003c536600462004664565b62000f81565b62000327620003dc366004620046f6565b62001129565b606f54620003719060ff1681565b620003276200040136600462004600565b620012b7565b607e54620004189063ffffffff1681565b60405163ffffffff909116815260200162000351565b620003276200043f3660046200477b565b6200134a565b62000327620013f5565b6200047462000460366004620047a5565b5f9081526034602052604090206001015490565b60405190815260200162000351565b620005036200049436600462004600565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b0390811691830191909152928201519092169082015260600162000351565b6200032762000548366004620047bd565b620014ba565b6087546200033d906001600160401b031681565b6200032762000573366004620047bd565b620014e2565b620003276200058a366004620047ee565b6200151c565b60865462000474565b62000474620005aa36600462004600565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b62000474620015cf565b6200064a620005f736600462004636565b607f6020525f90815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c00162000351565b62000327620006a536600462004636565b620015e6565b62000327620006bc366004620048ae565b620016e0565b620006d9620006d336600462004974565b62001b3d565b60405162000351919062004a27565b62000418620006f9366004620047ee565b60836020525f908152604090205463ffffffff1681565b6084546200033d90600160c01b90046001600160401b031681565b620003276200073c366004620046f6565b62001b6f565b620003276200075336600462004664565b62001e90565b620003716200076a366004620047bd565b62001f47565b6200047462001f71565b6200033d6200078b36600462004a3b565b62002052565b62000327620007a2366004620047ee565b6200221e565b62000327620007b9366004620047ee565b620022c3565b620004745f81565b6200047462002366565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200162000351565b6085546200082890600160801b900461ffff1681565b60405161ffff909116815260200162000351565b620008d16200084d36600462004600565b60408051608080820183525f8083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b6040516200035191905f6080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200033d90600160801b90046001600160401b031681565b620003276200094236600462004a66565b6200272e565b620004186200095936600462004af7565b60826020525f908152604090205463ffffffff1681565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b62000327620009a9366004620047a5565b62002a04565b62000327620009c0366004620047bd565b62002aa0565b6085546200033d906001600160401b031681565b6200032762002ac8565b6084546200033d90600160401b90046001600160401b031681565b6200032762000a1036600462004b26565b62002b94565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b6200032762000a4f36600462004b9e565b62002c68565b608054620004189063ffffffff1681565b62000afc62000a7736600462004636565b60816020525f9081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff166101608201526101800162000351565b5f54600290610100900460ff1615801562000b9d57505f5460ff8083169116105b62000c065760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c8662002e5c565b62000ca05f80516020620058898339815191528c62002ec8565b62000cac5f8862002ec8565b62000cd87fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908862002ec8565b62000d047f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8862002ec8565b62000d307f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8862002ec8565b62000d5c7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8962002ec8565b62000d887fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088962002ec8565b62000db47f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48962002ec8565b62000dce5f80516020620058498339815191528962002ec8565b62000e085f80516020620058898339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062002ed4565b62000e347f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08962002ec8565b62000e607f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8962002ec8565b62000e9a5f80516020620058698339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162002ed4565b62000eb45f80516020620058698339815191528762002ec8565b62000ee07f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518762002ec8565b62000eec5f3362002ec8565b5f805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050505050565b63ffffffff82165f90815260816020526040812062000f59908362002f1e565b90505b92915050565b63ffffffff81165f90815260816020526040812062000f5c9062002f62565b5f805160206200588983398151915262000f9b8162002fd1565b63ffffffff89165f90815260816020526040902062000fc1818a8a8a8a8a8a8a62002fdd565b600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562001028576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200106162002366565b6040518263ffffffff1660e01b81526004016200108091815260200190565b5f604051808303815f87803b15801562001098575f80fd5b505af1158015620010ab573d5f803e3d5ffd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b5f8051602062005889833981519152620011438162002fd1565b63ffffffff89165f90815260816020526040902062001169818a8a8a8a8a8a8a6200336b565b600681018054600160401b600160801b031916600160401b6001600160401b038a81169182029290921783555f9081526002840160205260409020879055600583018890559054600160801b90041615620011d0576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200120962002366565b6040518263ffffffff1660e01b81526004016200122891815260200190565b5f604051808303815f87803b15801562001240575f80fd5b505af115801562001253573d5f803e3d5ffd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff82165f908152608160205260409020620012e55f80516020620058898339815191523362001f47565b6200133957606f5460ff16156200130f57604051630bc011ff60e21b815260040160405180910390fd5b6200131b818362002f1e565b6200133957604051630674f25160e11b815260040160405180910390fd5b6200134581836200376a565b505050565b5f8051602062005849833981519152620013648162002fd1565b6103e88261ffff1610806200137e57506103ff8261ffff16115b156200139d57604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200140f5f80516020620058698339815191523362001f47565b620014ae57608454600160801b90046001600160401b031615806200145f57506084544290620014549062093a8090600160801b90046001600160401b031662004c44565b6001600160401b0316115b806200148f57506087544290620014849062093a80906001600160401b031662004c44565b6001600160401b0316115b15620014ae5760405163692baaad60e11b815260040160405180910390fd5b620014b862003955565b565b5f82815260346020526040902060010154620014d68162002fd1565b620013458383620039cf565b6001600160a01b03811633146200150c57604051630b4ad1cd60e31b815260040160405180910390fd5b62001518828262003a3a565b5050565b5f8051602062005849833981519152620015368162002fd1565b606f5460ff1662001578576084546001600160401b03600160c01b909104811690831610620015785760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001620013e9565b5f6086546064620015e1919062004c6e565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd620016128162002fd1565b63ffffffff82161580620016315750607e5463ffffffff908116908316115b156200165057604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f60205260409020600180820154600160e81b900460ff16151590036200169657604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd086200170c8162002fd1565b63ffffffff881615806200172b5750607e5463ffffffff908116908916115b156200174a57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88165f908152607f60205260409020600180820154600160e81b900460ff16151590036200179057604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b0388165f9081526083602052604090205463ffffffff1615620017cd576040516337c8fe0960e11b815260040160405180910390fd5b608080545f91908290620017e79063ffffffff1662004c88565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b039092169130916200183490620044dd565b620018429392919062004cad565b604051809103905ff0801580156200185c573d5f803e3d5ffd5b5090508160835f8c6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508a815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001ac0949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001b00908d908d9088908e908e908e9060040162004ce3565b5f604051808303815f87803b15801562001b18575f80fd5b505af115801562001b2b573d5f803e3d5ffd5b50505050505050505050505050505050565b63ffffffff86165f90815260816020526040902060609062001b6490878787878762003aa3565b979650505050505050565b606f5460ff161562001b9457604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001be292600160c01b90048116911662004c44565b6001600160401b0316111562001c0b57604051638a0704d360e01b815260040160405180910390fd5b6103e862001c1a888862004d45565b6001600160401b0316111562001c4357604051635acfba9d60e11b815260040160405180910390fd5b62001c5581898989898989896200336b565b62001c61818762003be2565b6085546001600160401b03165f0362001d6857600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562001cdb576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001d1462002366565b6040518263ffffffff1660e01b815260040162001d3391815260200190565b5f604051808303815f87803b15801562001d4b575f80fd5b505af115801562001d5e573d5f803e3d5ffd5b5050505062001e31565b62001d738162003dd9565b600681018054600160801b90046001600160401b031690601062001d978362004d68565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b900487165f90815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff161562001eb557604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f90815260816020526040902062001edb818989898989898962002fdd565b6001600160401b0387165f9081526004820160209081526040918290206002015482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a162001f3c62003955565b505050505050505050565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b81523060048201525f9081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562001fd8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001ffe919062004d86565b6084549091505f9062002024906001600160401b03600160401b82048116911662004d45565b6001600160401b03169050805f036200203f575f9250505090565b6200204b818362004db2565b9250505090565b606f545f9060ff16156200207957604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff1690819003620020b0576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f03620020da57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f90815260816020526040812060848054919287926200210c9084906001600160401b031662004c44565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f62002141878362004c44565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f95865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b031990921692909316919091171790559050620021d08362003dd9565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b5f8051602062005849833981519152620022388162002fd1565b606f5460ff1662002273576085546001600160401b0390811690831610620022735760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001620013e9565b5f8051602062005849833981519152620022dd8162002fd1565b62015180826001600160401b031611156200230b57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001620013e9565b6080545f9063ffffffff168082036200238057505f919050565b5f816001600160401b038111156200239c576200239c6200480a565b604051908082528060200260200182016040528015620023c6578160200160208202803683370190505b5090505f5b82811015620024365760815f620023e483600162004dc8565b63ffffffff1663ffffffff1681526020019081526020015f206005015482828151811062002416576200241662004dde565b6020908102919091010152806200242d8162004df2565b915050620023cb565b505f60205b836001146200268e575f6200245260028662004e0d565b6200245f60028762004db2565b6200246b919062004dc8565b90505f816001600160401b038111156200248957620024896200480a565b604051908082528060200260200182016040528015620024b3578160200160208202803683370190505b5090505f5b828110156200263a57620024ce60018462004e23565b81148015620024e95750620024e560028862004e0d565b6001145b15620025715785620024fd82600262004c6e565b8151811062002510576200251062004dde565b60200260200101518560405160200162002534929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106200255f576200255f62004dde565b60200260200101818152505062002625565b856200257f82600262004c6e565b8151811062002592576200259262004dde565b602002602001015186826002620025aa919062004c6e565b620025b790600162004dc8565b81518110620025ca57620025ca62004dde565b6020026020010151604051602001620025ed929190918252602082015260400190565b6040516020818303038152906040528051906020012082828151811062002618576200261862004dde565b6020026020010181815250505b80620026318162004df2565b915050620024b8565b5080945081955083846040516020016200265e929190918252602082015260400190565b6040516020818303038152906040528051906020012093508280620026839062004e39565b93505050506200243b565b5f835f81518110620026a457620026a462004dde565b602002602001015190505f5b828110156200272457604080516020810184905290810185905260600160408051601f198184030181528282528051602091820120908301879052908201869052925060600160405160208183030381529060405280519060200120935080806200271b9062004df2565b915050620026b0565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac6200275a8162002fd1565b63ffffffff84161580620027795750607e5463ffffffff908116908516115b156200279857604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526082602052604081205463ffffffff1690819003620027d8576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918716600160401b9091046001600160401b0316036200282657604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86165f908152607f60205260409020600180820154600160e81b900460ff16151590036200286c57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b9092041614620028aa57604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790555f620029298462000f62565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef286926200297f9216908b908b9060040162004e51565b5f604051808303815f87803b15801562002997575f80fd5b505af1158015620029aa573d5f803e3d5ffd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002a308162002fd1565b683635c9adc5dea0000082118062002a4b5750633b9aca0082105b1562002a6a57604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620013e9565b5f8281526034602052604090206001015462002abc8162002fd1565b62001345838362003a3a565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002af48162002fd1565b6087805467ffffffffffffffff1916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc16976916004808301925f92919082900301818387803b15801562002b70575f80fd5b505af115801562002b83573d5f803e3d5ffd5b5050505062002b9162003ea2565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62002bc08162002fd1565b6001600160401b0384165f9081526083602052604090205463ffffffff161562002bfd576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b0387165f9081526082602052604090205463ffffffff161562002c3a57604051630d409b9360e41b815260040160405180910390fd5b5f62002c4b88888888875f62003efa565b5f8080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002c948162002fd1565b607e80545f9190829062002cae9063ffffffff1662004c88565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff1681526020015f1515815260200185815250607f5f8363ffffffff1663ffffffff1681526020019081526020015f205f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002e4a9695949392919062004e90565b60405180910390a25050505050505050565b5f54610100900460ff16620014b85760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000bfd565b620015188282620039cf565b5f82815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6085546001600160401b038281165f9081526004850160205260408120549092429262002f5092918116911662004c44565b6001600160401b031611159392505050565b60068101545f90600160801b90046001600160401b03161562002fb4575060068101546001600160401b03600160801b90910481165f9081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002b9181336200411b565b60078801545f906001600160401b039081169087161015620030125760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620030b25760068901546001600160401b03600160801b909104811690891611156200305c5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f90815260048a0160205260409020600281015481549092888116600160401b9092041614620030ab57604051632bd2e3e760e01b815260040160405180910390fd5b5062003126565b506001600160401b0385165f90815260028901602052604090205480620030ec576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b909104811690871611156200312657604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b909104811690881611806200315f5750876001600160401b0316876001600160401b031611155b8062003183575060068901546001600160401b03600160c01b909104811690881611155b15620031a25760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260048b016020526040902054600160401b9004811690861614620031e8576040516332a2a77f60e01b815260040160405180910390fd5b5f620031f98a888888868962003aa3565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516200322f919062004ee8565b602060405180830381855afa1580156200324b573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019062003270919062004d86565b6200327c919062004e0d565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620032c09188919060040162004f05565b602060405180830381865afa158015620032dc573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062003302919062004f41565b62003320576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260048c0160205260409020600201548590036200335e5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b5f80620033788a62002f62565b60078b01549091506001600160401b039081169089161015620033ae5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620034505760068a01546001600160401b03600160801b9091048116908a161115620033f85760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a165f90815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200344957604051632bd2e3e760e01b815260040160405180910390fd5b50620034bf565b6001600160401b0388165f90815260028b0160205260409020549150816200348b576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b03161115620034bf57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620034f25760405163b9b18f5760e01b815260040160405180910390fd5b5f620035038b8a8a8a878b62003aa3565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405162003539919062004ee8565b602060405180830381855afa15801562003555573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200357a919062004d86565b62003586919062004e0d565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620035ca9189919060040162004f05565b602060405180830381865afa158015620035e6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200360c919062004f41565b6200362a576040516309bde33960e01b815260040160405180910390fd5b5f62003637848b62004d45565b90506200369087826001600160401b03166200365262001f71565b6200365e919062004c6e565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004145565b80608460088282829054906101000a90046001600160401b0316620036b6919062004c44565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d153906064015f604051808303815f87803b15801562003744575f80fd5b505af115801562003757573d5f803e3d5ffd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b9091048116908216111580620037a9575060068201546001600160401b03600160801b9091048116908216115b15620037c85760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f81815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200388362002366565b6040518263ffffffff1660e01b8152600401620038a291815260200190565b5f604051808303815f87803b158015620038ba575f80fd5b505af1158015620038cd573d5f803e3d5ffd5b505085546001600160a01b03165f90815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015620039ae575f80fd5b505af1158015620039c1573d5f803e3d5ffd5b50505050620014b862004199565b620039db828262001f47565b62001518575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003a46828262001f47565b1562001518575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086165f818152600389016020526040808220549388168252902054606092911580159062003ad8575081155b1562003af75760405163340c614f60e11b815260040160405180910390fd5b8062003b16576040516366385b5160e01b815260040160405180910390fd5b62003b2184620041f5565b62003b3f576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b5f62003bee8362002f62565b9050815f8062003bff848462004d45565b6085546001600160401b0391821692505f9162003c2591600160401b9004164262004e23565b90505b846001600160401b0316846001600160401b03161462003cae576001600160401b038085165f9081526003890160205260409020600181015490911682101562003c89576001810154600160401b90046001600160401b0316945062003ca7565b62003c95868662004d45565b6001600160401b031693505062003cae565b5062003c28565b5f62003cbb848462004e23565b90508381101562003d1957808403600c811162003cd9578062003cdc565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a608654028162003d0e5762003d0e62004d9e565b046086555062003d90565b838103600c811162003d2c578062003d2f565b600c5b90505f816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162003d685762003d6862004d9e565b04905080608654670de0b6b3a7640000028162003d895762003d8962004d9e565b0460865550505b683635c9adc5dea00000608654111562003db757683635c9adc5dea0000060865562003dcf565b633b9aca00608654101562003dcf57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002b915760068101545f9062003e2390600160c01b90046001600160401b0316600162004c44565b905062003e31828262002f1e565b15620015185760068201545f9060029062003e5e908490600160801b90046001600160401b031662004d45565b62003e6a919062004f62565b62003e76908362004c44565b905062003e84838262002f1e565b1562003e96576200134583826200376a565b6200134583836200376a565b606f5460ff1662003ec657604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b608080545f918291829062003f159063ffffffff1662004c88565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f876001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff16021790555060815f8263ffffffff1663ffffffff1681526020019081526020015f20915087825f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b0316021790555086826001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555084825f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620041089594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b62004127828262001f47565b6200151857604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526200134590849062004279565b606f5460ff1615620041be57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff000000016001600160401b0383161080156200422b575067ffffffff00000001604083901c6001600160401b0316105b80156200424c575067ffffffff00000001608083901c6001600160401b0316105b801562004264575067ffffffff0000000160c083901c105b156200427257506001919050565b505f919050565b5f620042cf826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620043519092919063ffffffff16565b805190915015620013455780806020019051810190620042f0919062004f41565b620013455760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000bfd565b60606200436184845f8562004369565b949350505050565b606082471015620043cc5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000bfd565b5f80866001600160a01b03168587604051620043e9919062004ee8565b5f6040518083038185875af1925050503d805f811462004425576040519150601f19603f3d011682016040523d82523d5f602084013e6200442a565b606091505b509150915062001b648783838760608315620044aa5782515f03620044a2576001600160a01b0385163b620044a25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000bfd565b508162004361565b620043618383815115620044c15781518083602001fd5b8060405162461bcd60e51b815260040162000bfd919062004a27565b6108be8062004f8b83390190565b6001600160a01b038116811462002b91575f80fd5b80356001600160401b038116811462002fcc575f80fd5b5f805f805f805f805f806101408b8d03121562004532575f80fd5b8a356200453f81620044eb565b99506200454f60208c0162004500565b98506200455f60408c0162004500565b975060608b01356200457181620044eb565b965060808b01356200458381620044eb565b955060a08b01356200459581620044eb565b945060c08b0135620045a781620044eb565b935060e08b0135620045b981620044eb565b9250620045ca6101008c0162004500565b9150620045db6101208c0162004500565b90509295989b9194979a5092959850565b803563ffffffff8116811462002fcc575f80fd5b5f806040838503121562004612575f80fd5b6200461d83620045ec565b91506200462d6020840162004500565b90509250929050565b5f6020828403121562004647575f80fd5b62000f5982620045ec565b80610300810183101562000f5c575f80fd5b5f805f805f805f806103e0898b0312156200467d575f80fd5b6200468889620045ec565b97506200469860208a0162004500565b9650620046a860408a0162004500565b9550620046b860608a0162004500565b9450620046c860808a0162004500565b935060a0890135925060c08901359150620046e78a60e08b0162004652565b90509295985092959890939650565b5f805f805f805f806103e0898b0312156200470f575f80fd5b6200471a89620045ec565b97506200472a60208a0162004500565b96506200473a60408a0162004500565b95506200474a60608a0162004500565b94506080890135935060a0890135925060c08901356200476a81620044eb565b9150620046e78a60e08b0162004652565b5f602082840312156200478c575f80fd5b813561ffff811681146200479e575f80fd5b9392505050565b5f60208284031215620047b6575f80fd5b5035919050565b5f8060408385031215620047cf575f80fd5b823591506020830135620047e381620044eb565b809150509250929050565b5f60208284031215620047ff575f80fd5b62000f598262004500565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126200482e575f80fd5b81356001600160401b03808211156200484b576200484b6200480a565b604051601f8301601f19908116603f011681019082821181831017156200487657620048766200480a565b816040528381528660208588010111156200488f575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a031215620048c5575f80fd5b620048d088620045ec565b9650620048e06020890162004500565b95506040880135620048f281620044eb565b945060608801356200490481620044eb565b935060808801356200491681620044eb565b925060a08801356001600160401b038082111562004932575f80fd5b620049408b838c016200481e565b935060c08a013591508082111562004956575f80fd5b50620049658a828b016200481e565b91505092959891949750929550565b5f805f805f8060c087890312156200498a575f80fd5b6200499587620045ec565b9550620049a56020880162004500565b9450620049b56040880162004500565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b83811015620049f2578181015183820152602001620049d8565b50505f910152565b5f815180845262004a13816020860160208601620049d6565b601f01601f19169290920160200192915050565b602081525f62000f596020830184620049fa565b5f806040838503121562004a4d575f80fd5b62004a588362004500565b946020939093013593505050565b5f805f806060858703121562004a7a575f80fd5b843562004a8781620044eb565b935062004a9760208601620045ec565b925060408501356001600160401b038082111562004ab3575f80fd5b818701915087601f83011262004ac7575f80fd5b81358181111562004ad6575f80fd5b88602082850101111562004ae8575f80fd5b95989497505060200194505050565b5f6020828403121562004b08575f80fd5b81356200479e81620044eb565b803560ff8116811462002fcc575f80fd5b5f805f805f8060c0878903121562004b3c575f80fd5b863562004b4981620044eb565b9550602087013562004b5b81620044eb565b945062004b6b6040880162004500565b935062004b7b6060880162004500565b92506080870135915062004b9260a0880162004b15565b90509295509295509295565b5f805f805f8060c0878903121562004bb4575f80fd5b863562004bc181620044eb565b9550602087013562004bd381620044eb565b945062004be36040880162004500565b935062004bf36060880162004b15565b92506080870135915060a08701356001600160401b0381111562004c15575f80fd5b62004c2389828a016200481e565b9150509295509295509295565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111562004c675762004c6762004c30565b5092915050565b808202811582820484141762000f5c5762000f5c62004c30565b5f63ffffffff80831681810362004ca35762004ca362004c30565b6001019392505050565b6001600160a01b038481168252831660208201526060604082018190525f9062004cda90830184620049fa565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190525f9062004d2490830185620049fa565b82810360a084015262004d388185620049fa565b9998505050505050505050565b6001600160401b0382811682821603908082111562004c675762004c6762004c30565b5f6001600160401b0380831681810362004ca35762004ca362004c30565b5f6020828403121562004d97575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8262004dc35762004dc362004d9e565b500490565b8082018082111562000f5c5762000f5c62004c30565b634e487b7160e01b5f52603260045260245ffd5b5f6001820162004e065762004e0662004c30565b5060010190565b5f8262004e1e5762004e1e62004d9e565b500690565b8181038181111562000f5c5762000f5c62004c30565b5f8162004e4a5762004e4a62004c30565b505f190190565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190525f9062004edc90830184620049fa565b98975050505050505050565b5f825162004efb818460208701620049d6565b9190910192915050565b6103208101610300808584378201835f5b600181101562004f3757815183526020928301929091019060010162004f16565b5050509392505050565b5f6020828403121562004f52575f80fd5b815180151581146200479e575f80fd5b5f6001600160401b038084168062004f7e5762004f7e62004d9e565b9216919091049291505056fe60a0604052604051620008be380380620008be8339810160408190526100249161034d565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b6565b505050610432565b61006182610124565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100aa576100a582826101a2565b505050565b6100b2610215565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f65f805160206200089e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161012181610236565b50565b806001600160a01b03163b5f0361015e57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516101be9190610417565b5f60405180830381855af49150503d805f81146101f6576040519150601f19603f3d011682016040523d82523d5f602084013e6101fb565b606091505b50909250905061020c858383610274565b95945050505050565b34156102345760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661025f57604051633173bdd160e11b81525f6004820152602401610155565b805f805160206200089e833981519152610181565b60608261028957610284826102d3565b6102cc565b81511580156102a057506001600160a01b0384163b155b156102c957604051639996b31560e01b81526001600160a01b0385166004820152602401610155565b50805b9392505050565b8051156102e35780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b0381168114610312575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561034557818101518382015260200161032d565b50505f910152565b5f805f6060848603121561035f575f80fd5b610368846102fc565b9250610376602085016102fc565b60408501519092506001600160401b0380821115610392575f80fd5b818601915086601f8301126103a5575f80fd5b8151818111156103b7576103b7610317565b604051601f8201601f19908116603f011681019083821181831017156103df576103df610317565b816040528281528960208487010111156103f7575f80fd5b61040883602083016020880161032b565b80955050505050509250925092565b5f825161042881846020870161032b565b9190910192915050565b6080516104546200044a5f395f601001526104545ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610069575f356001600160e01b03191663278f794360e11b146100615761005f61006d565b565b61005f61007d565b61005f5b61005f6100786100ab565b6100e2565b5f8061008c36600481846102ee565b8101906100999190610329565b915091506100a78282610100565b5050565b5f6100dd7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156100fc573d5ff35b3d5ffd5b6101098261015a565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101525761014d82826101d5565b505050565b6100a7610247565b806001600160a01b03163b5f0361019457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101f191906103f2565b5f60405180830381855af49150503d805f8114610229576040519150601f19603f3d011682016040523d82523d5f602084013e61022e565b606091505b509150915061023e858383610266565b95945050505050565b341561005f5760405163b398979f60e01b815260040160405180910390fd5b60608261027b57610276826102c5565b6102be565b815115801561029257506001600160a01b0384163b155b156102bb57604051639996b31560e01b81526001600160a01b038516600482015260240161018b565b50805b9392505050565b8051156102d55780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f80858511156102fc575f80fd5b83861115610308575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561033a575f80fd5b82356001600160a01b0381168114610350575f80fd5b9150602083013567ffffffffffffffff8082111561036c575f80fd5b818501915085601f83011261037f575f80fd5b81358181111561039157610391610315565b604051601f8201601f19908116603f011681019083821181831017156103b9576103b9610315565b816040528281528860208487010111156103d1575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b8181101561041157602081860181015185830152016103f7565b505f92019182525091905056fea2646970667358221220c3817d11eb3dc87723342527d38da55b7b3b362f54567f56cf1ef4db2f8a430664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220a4110513306739c3c08cc22958bf1451aa1a4a1222df971c0412e1c1ab1b08c764736f6c63430008140033", + "deployedBytecode": "0x608060405234801562000010575f80fd5b50600436106200030c575f3560e01c8063841b24d711620001a3578063c1acbc3411620000f3578063dbc16976116200009b578063dbc1697614620009da578063dde0ff7714620009e4578063e0bfd3d214620009ff578063e46761c41462000a16578063f34eb8eb1462000a3e578063f4e926751462000a55578063f9c4c2ae1462000a66575f80fd5b8063c1acbc341462000916578063c4c928c21462000931578063ceee281d1462000948578063d02103ca1462000970578063d5073f6f1462000998578063d547741f14620009af578063d939b31514620009c6575f80fd5b80639c9f3dfe11620001575780639c9f3dfe1462000791578063a066215c14620007a8578063a217fddf14620007bf578063a2967d9914620007c7578063a3c573eb14620007d1578063afd23cbe1462000812578063b99d0ad7146200083c575f80fd5b8063841b24d7146200071057806387c20c01146200072b5780638bd4f071146200074257806391d14854146200075957806399f5634e14620007705780639a908e73146200077a575f80fd5b806325280169116200025f57806355a71ee0116200021357806355a71ee014620005995780636046916914620005dc57806365c0504d14620005e65780637222020f1462000694578063727885e914620006ab5780637975fcfe14620006c25780637fb6e76a14620006e8575f80fd5b80632528016914620004835780632f2ff15d146200053757806330c27dde146200054e57806336568abe1462000562578063394218e91462000579578063477fa2701462000590575f80fd5b80631489ed1011620002c35780631489ed1014620003cb57806315064c9614620003e25780631608859c14620003f05780631796a1ae14620004075780631816b7e5146200042e5780632072f6c51462000445578063248a9ca3146200044f575f80fd5b80630645af091462000310578063066ec0121462000329578063080b3111146200035a5780630a0d9fbe146200038257806311f6b287146200039d57806312b86e1914620003b4575b5f80fd5b620003276200032136600462004517565b62000b7c565b005b6084546200033d906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b620003716200036b36600462004600565b62000f39565b604051901515815260200162000351565b6085546200033d90600160401b90046001600160401b031681565b6200033d620003ae36600462004636565b62000f62565b62000327620003c536600462004664565b62000f81565b62000327620003dc366004620046f6565b62001129565b606f54620003719060ff1681565b620003276200040136600462004600565b620012b7565b607e54620004189063ffffffff1681565b60405163ffffffff909116815260200162000351565b620003276200043f3660046200477b565b6200134a565b62000327620013f5565b6200047462000460366004620047a5565b5f9081526034602052604090206001015490565b60405190815260200162000351565b620005036200049436600462004600565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b0390811691830191909152928201519092169082015260600162000351565b6200032762000548366004620047bd565b620014ba565b6087546200033d906001600160401b031681565b6200032762000573366004620047bd565b620014e2565b620003276200058a366004620047ee565b6200151c565b60865462000474565b62000474620005aa36600462004600565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b62000474620015cf565b6200064a620005f736600462004636565b607f6020525f90815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c00162000351565b62000327620006a536600462004636565b620015e6565b62000327620006bc366004620048ae565b620016e0565b620006d9620006d336600462004974565b62001b3d565b60405162000351919062004a27565b62000418620006f9366004620047ee565b60836020525f908152604090205463ffffffff1681565b6084546200033d90600160c01b90046001600160401b031681565b620003276200073c366004620046f6565b62001b6f565b620003276200075336600462004664565b62001e90565b620003716200076a366004620047bd565b62001f47565b6200047462001f71565b6200033d6200078b36600462004a3b565b62002052565b62000327620007a2366004620047ee565b6200221e565b62000327620007b9366004620047ee565b620022c3565b620004745f81565b6200047462002366565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200162000351565b6085546200082890600160801b900461ffff1681565b60405161ffff909116815260200162000351565b620008d16200084d36600462004600565b60408051608080820183525f8083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b6040516200035191905f6080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200033d90600160801b90046001600160401b031681565b620003276200094236600462004a66565b6200272e565b620004186200095936600462004af7565b60826020525f908152604090205463ffffffff1681565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b62000327620009a9366004620047a5565b62002a04565b62000327620009c0366004620047bd565b62002aa0565b6085546200033d906001600160401b031681565b6200032762002ac8565b6084546200033d90600160401b90046001600160401b031681565b6200032762000a1036600462004b26565b62002b94565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b6200032762000a4f36600462004b9e565b62002c68565b608054620004189063ffffffff1681565b62000afc62000a7736600462004636565b60816020525f9081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff166101608201526101800162000351565b5f54600290610100900460ff1615801562000b9d57505f5460ff8083169116105b62000c065760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c8662002e5c565b62000ca05f80516020620058898339815191528c62002ec8565b62000cac5f8862002ec8565b62000cd87fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908862002ec8565b62000d047f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8862002ec8565b62000d307f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8862002ec8565b62000d5c7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8962002ec8565b62000d887fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088962002ec8565b62000db47f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48962002ec8565b62000dce5f80516020620058498339815191528962002ec8565b62000e085f80516020620058898339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062002ed4565b62000e347f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08962002ec8565b62000e607f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8962002ec8565b62000e9a5f80516020620058698339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162002ed4565b62000eb45f80516020620058698339815191528762002ec8565b62000ee07f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518762002ec8565b62000eec5f3362002ec8565b5f805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050505050565b63ffffffff82165f90815260816020526040812062000f59908362002f1e565b90505b92915050565b63ffffffff81165f90815260816020526040812062000f5c9062002f62565b5f805160206200588983398151915262000f9b8162002fd1565b63ffffffff89165f90815260816020526040902062000fc1818a8a8a8a8a8a8a62002fdd565b600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562001028576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200106162002366565b6040518263ffffffff1660e01b81526004016200108091815260200190565b5f604051808303815f87803b15801562001098575f80fd5b505af1158015620010ab573d5f803e3d5ffd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b5f8051602062005889833981519152620011438162002fd1565b63ffffffff89165f90815260816020526040902062001169818a8a8a8a8a8a8a6200336b565b600681018054600160401b600160801b031916600160401b6001600160401b038a81169182029290921783555f9081526002840160205260409020879055600583018890559054600160801b90041615620011d0576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200120962002366565b6040518263ffffffff1660e01b81526004016200122891815260200190565b5f604051808303815f87803b15801562001240575f80fd5b505af115801562001253573d5f803e3d5ffd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff82165f908152608160205260409020620012e55f80516020620058898339815191523362001f47565b6200133957606f5460ff16156200130f57604051630bc011ff60e21b815260040160405180910390fd5b6200131b818362002f1e565b6200133957604051630674f25160e11b815260040160405180910390fd5b6200134581836200376a565b505050565b5f8051602062005849833981519152620013648162002fd1565b6103e88261ffff1610806200137e57506103ff8261ffff16115b156200139d57604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200140f5f80516020620058698339815191523362001f47565b620014ae57608454600160801b90046001600160401b031615806200145f57506084544290620014549062093a8090600160801b90046001600160401b031662004c44565b6001600160401b0316115b806200148f57506087544290620014849062093a80906001600160401b031662004c44565b6001600160401b0316115b15620014ae5760405163692baaad60e11b815260040160405180910390fd5b620014b862003955565b565b5f82815260346020526040902060010154620014d68162002fd1565b620013458383620039cf565b6001600160a01b03811633146200150c57604051630b4ad1cd60e31b815260040160405180910390fd5b62001518828262003a3a565b5050565b5f8051602062005849833981519152620015368162002fd1565b606f5460ff1662001578576084546001600160401b03600160c01b909104811690831610620015785760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001620013e9565b5f6086546064620015e1919062004c6e565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd620016128162002fd1565b63ffffffff82161580620016315750607e5463ffffffff908116908316115b156200165057604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f60205260409020600180820154600160e81b900460ff16151590036200169657604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd086200170c8162002fd1565b63ffffffff881615806200172b5750607e5463ffffffff908116908916115b156200174a57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88165f908152607f60205260409020600180820154600160e81b900460ff16151590036200179057604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b0388165f9081526083602052604090205463ffffffff1615620017cd576040516337c8fe0960e11b815260040160405180910390fd5b608080545f91908290620017e79063ffffffff1662004c88565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b039092169130916200183490620044dd565b620018429392919062004cad565b604051809103905ff0801580156200185c573d5f803e3d5ffd5b5090508160835f8c6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508a815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001ac0949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001b00908d908d9088908e908e908e9060040162004ce3565b5f604051808303815f87803b15801562001b18575f80fd5b505af115801562001b2b573d5f803e3d5ffd5b50505050505050505050505050505050565b63ffffffff86165f90815260816020526040902060609062001b6490878787878762003aa3565b979650505050505050565b606f5460ff161562001b9457604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001be292600160c01b90048116911662004c44565b6001600160401b0316111562001c0b57604051638a0704d360e01b815260040160405180910390fd5b6103e862001c1a888862004d45565b6001600160401b0316111562001c4357604051635acfba9d60e11b815260040160405180910390fd5b62001c5581898989898989896200336b565b62001c61818762003be2565b6085546001600160401b03165f0362001d6857600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562001cdb576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001d1462002366565b6040518263ffffffff1660e01b815260040162001d3391815260200190565b5f604051808303815f87803b15801562001d4b575f80fd5b505af115801562001d5e573d5f803e3d5ffd5b5050505062001e31565b62001d738162003dd9565b600681018054600160801b90046001600160401b031690601062001d978362004d68565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b900487165f90815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff161562001eb557604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f90815260816020526040902062001edb818989898989898962002fdd565b6001600160401b0387165f9081526004820160209081526040918290206002015482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a162001f3c62003955565b505050505050505050565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b81523060048201525f9081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562001fd8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001ffe919062004d86565b6084549091505f9062002024906001600160401b03600160401b82048116911662004d45565b6001600160401b03169050805f036200203f575f9250505090565b6200204b818362004db2565b9250505090565b606f545f9060ff16156200207957604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff1690819003620020b0576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f03620020da57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f90815260816020526040812060848054919287926200210c9084906001600160401b031662004c44565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f62002141878362004c44565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f95865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b031990921692909316919091171790559050620021d08362003dd9565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b5f8051602062005849833981519152620022388162002fd1565b606f5460ff1662002273576085546001600160401b0390811690831610620022735760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001620013e9565b5f8051602062005849833981519152620022dd8162002fd1565b62015180826001600160401b031611156200230b57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001620013e9565b6080545f9063ffffffff168082036200238057505f919050565b5f816001600160401b038111156200239c576200239c6200480a565b604051908082528060200260200182016040528015620023c6578160200160208202803683370190505b5090505f5b82811015620024365760815f620023e483600162004dc8565b63ffffffff1663ffffffff1681526020019081526020015f206005015482828151811062002416576200241662004dde565b6020908102919091010152806200242d8162004df2565b915050620023cb565b505f60205b836001146200268e575f6200245260028662004e0d565b6200245f60028762004db2565b6200246b919062004dc8565b90505f816001600160401b038111156200248957620024896200480a565b604051908082528060200260200182016040528015620024b3578160200160208202803683370190505b5090505f5b828110156200263a57620024ce60018462004e23565b81148015620024e95750620024e560028862004e0d565b6001145b15620025715785620024fd82600262004c6e565b8151811062002510576200251062004dde565b60200260200101518560405160200162002534929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106200255f576200255f62004dde565b60200260200101818152505062002625565b856200257f82600262004c6e565b8151811062002592576200259262004dde565b602002602001015186826002620025aa919062004c6e565b620025b790600162004dc8565b81518110620025ca57620025ca62004dde565b6020026020010151604051602001620025ed929190918252602082015260400190565b6040516020818303038152906040528051906020012082828151811062002618576200261862004dde565b6020026020010181815250505b80620026318162004df2565b915050620024b8565b5080945081955083846040516020016200265e929190918252602082015260400190565b6040516020818303038152906040528051906020012093508280620026839062004e39565b93505050506200243b565b5f835f81518110620026a457620026a462004dde565b602002602001015190505f5b828110156200272457604080516020810184905290810185905260600160408051601f198184030181528282528051602091820120908301879052908201869052925060600160405160208183030381529060405280519060200120935080806200271b9062004df2565b915050620026b0565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac6200275a8162002fd1565b63ffffffff84161580620027795750607e5463ffffffff908116908516115b156200279857604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526082602052604081205463ffffffff1690819003620027d8576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918716600160401b9091046001600160401b0316036200282657604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86165f908152607f60205260409020600180820154600160e81b900460ff16151590036200286c57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b9092041614620028aa57604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790555f620029298462000f62565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef286926200297f9216908b908b9060040162004e51565b5f604051808303815f87803b15801562002997575f80fd5b505af1158015620029aa573d5f803e3d5ffd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002a308162002fd1565b683635c9adc5dea0000082118062002a4b5750633b9aca0082105b1562002a6a57604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620013e9565b5f8281526034602052604090206001015462002abc8162002fd1565b62001345838362003a3a565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002af48162002fd1565b6087805467ffffffffffffffff1916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc16976916004808301925f92919082900301818387803b15801562002b70575f80fd5b505af115801562002b83573d5f803e3d5ffd5b5050505062002b9162003ea2565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62002bc08162002fd1565b6001600160401b0384165f9081526083602052604090205463ffffffff161562002bfd576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b0387165f9081526082602052604090205463ffffffff161562002c3a57604051630d409b9360e41b815260040160405180910390fd5b5f62002c4b88888888875f62003efa565b5f8080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002c948162002fd1565b607e80545f9190829062002cae9063ffffffff1662004c88565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff1681526020015f1515815260200185815250607f5f8363ffffffff1663ffffffff1681526020019081526020015f205f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002e4a9695949392919062004e90565b60405180910390a25050505050505050565b5f54610100900460ff16620014b85760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000bfd565b620015188282620039cf565b5f82815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6085546001600160401b038281165f9081526004850160205260408120549092429262002f5092918116911662004c44565b6001600160401b031611159392505050565b60068101545f90600160801b90046001600160401b03161562002fb4575060068101546001600160401b03600160801b90910481165f9081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002b9181336200411b565b60078801545f906001600160401b039081169087161015620030125760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620030b25760068901546001600160401b03600160801b909104811690891611156200305c5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f90815260048a0160205260409020600281015481549092888116600160401b9092041614620030ab57604051632bd2e3e760e01b815260040160405180910390fd5b5062003126565b506001600160401b0385165f90815260028901602052604090205480620030ec576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b909104811690871611156200312657604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b909104811690881611806200315f5750876001600160401b0316876001600160401b031611155b8062003183575060068901546001600160401b03600160c01b909104811690881611155b15620031a25760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260048b016020526040902054600160401b9004811690861614620031e8576040516332a2a77f60e01b815260040160405180910390fd5b5f620031f98a888888868962003aa3565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516200322f919062004ee8565b602060405180830381855afa1580156200324b573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019062003270919062004d86565b6200327c919062004e0d565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620032c09188919060040162004f05565b602060405180830381865afa158015620032dc573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062003302919062004f41565b62003320576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260048c0160205260409020600201548590036200335e5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b5f80620033788a62002f62565b60078b01549091506001600160401b039081169089161015620033ae5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620034505760068a01546001600160401b03600160801b9091048116908a161115620033f85760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a165f90815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200344957604051632bd2e3e760e01b815260040160405180910390fd5b50620034bf565b6001600160401b0388165f90815260028b0160205260409020549150816200348b576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b03161115620034bf57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620034f25760405163b9b18f5760e01b815260040160405180910390fd5b5f620035038b8a8a8a878b62003aa3565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405162003539919062004ee8565b602060405180830381855afa15801562003555573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200357a919062004d86565b62003586919062004e0d565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620035ca9189919060040162004f05565b602060405180830381865afa158015620035e6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200360c919062004f41565b6200362a576040516309bde33960e01b815260040160405180910390fd5b5f62003637848b62004d45565b90506200369087826001600160401b03166200365262001f71565b6200365e919062004c6e565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004145565b80608460088282829054906101000a90046001600160401b0316620036b6919062004c44565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d153906064015f604051808303815f87803b15801562003744575f80fd5b505af115801562003757573d5f803e3d5ffd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b9091048116908216111580620037a9575060068201546001600160401b03600160801b9091048116908216115b15620037c85760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f81815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200388362002366565b6040518263ffffffff1660e01b8152600401620038a291815260200190565b5f604051808303815f87803b158015620038ba575f80fd5b505af1158015620038cd573d5f803e3d5ffd5b505085546001600160a01b03165f90815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015620039ae575f80fd5b505af1158015620039c1573d5f803e3d5ffd5b50505050620014b862004199565b620039db828262001f47565b62001518575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003a46828262001f47565b1562001518575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086165f818152600389016020526040808220549388168252902054606092911580159062003ad8575081155b1562003af75760405163340c614f60e11b815260040160405180910390fd5b8062003b16576040516366385b5160e01b815260040160405180910390fd5b62003b2184620041f5565b62003b3f576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b5f62003bee8362002f62565b9050815f8062003bff848462004d45565b6085546001600160401b0391821692505f9162003c2591600160401b9004164262004e23565b90505b846001600160401b0316846001600160401b03161462003cae576001600160401b038085165f9081526003890160205260409020600181015490911682101562003c89576001810154600160401b90046001600160401b0316945062003ca7565b62003c95868662004d45565b6001600160401b031693505062003cae565b5062003c28565b5f62003cbb848462004e23565b90508381101562003d1957808403600c811162003cd9578062003cdc565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a608654028162003d0e5762003d0e62004d9e565b046086555062003d90565b838103600c811162003d2c578062003d2f565b600c5b90505f816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162003d685762003d6862004d9e565b04905080608654670de0b6b3a7640000028162003d895762003d8962004d9e565b0460865550505b683635c9adc5dea00000608654111562003db757683635c9adc5dea0000060865562003dcf565b633b9aca00608654101562003dcf57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002b915760068101545f9062003e2390600160c01b90046001600160401b0316600162004c44565b905062003e31828262002f1e565b15620015185760068201545f9060029062003e5e908490600160801b90046001600160401b031662004d45565b62003e6a919062004f62565b62003e76908362004c44565b905062003e84838262002f1e565b1562003e96576200134583826200376a565b6200134583836200376a565b606f5460ff1662003ec657604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b608080545f918291829062003f159063ffffffff1662004c88565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f876001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff16021790555060815f8263ffffffff1663ffffffff1681526020019081526020015f20915087825f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b0316021790555086826001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555084825f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620041089594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b62004127828262001f47565b6200151857604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526200134590849062004279565b606f5460ff1615620041be57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff000000016001600160401b0383161080156200422b575067ffffffff00000001604083901c6001600160401b0316105b80156200424c575067ffffffff00000001608083901c6001600160401b0316105b801562004264575067ffffffff0000000160c083901c105b156200427257506001919050565b505f919050565b5f620042cf826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620043519092919063ffffffff16565b805190915015620013455780806020019051810190620042f0919062004f41565b620013455760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000bfd565b60606200436184845f8562004369565b949350505050565b606082471015620043cc5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000bfd565b5f80866001600160a01b03168587604051620043e9919062004ee8565b5f6040518083038185875af1925050503d805f811462004425576040519150601f19603f3d011682016040523d82523d5f602084013e6200442a565b606091505b509150915062001b648783838760608315620044aa5782515f03620044a2576001600160a01b0385163b620044a25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000bfd565b508162004361565b620043618383815115620044c15781518083602001fd5b8060405162461bcd60e51b815260040162000bfd919062004a27565b6108be8062004f8b83390190565b6001600160a01b038116811462002b91575f80fd5b80356001600160401b038116811462002fcc575f80fd5b5f805f805f805f805f806101408b8d03121562004532575f80fd5b8a356200453f81620044eb565b99506200454f60208c0162004500565b98506200455f60408c0162004500565b975060608b01356200457181620044eb565b965060808b01356200458381620044eb565b955060a08b01356200459581620044eb565b945060c08b0135620045a781620044eb565b935060e08b0135620045b981620044eb565b9250620045ca6101008c0162004500565b9150620045db6101208c0162004500565b90509295989b9194979a5092959850565b803563ffffffff8116811462002fcc575f80fd5b5f806040838503121562004612575f80fd5b6200461d83620045ec565b91506200462d6020840162004500565b90509250929050565b5f6020828403121562004647575f80fd5b62000f5982620045ec565b80610300810183101562000f5c575f80fd5b5f805f805f805f806103e0898b0312156200467d575f80fd5b6200468889620045ec565b97506200469860208a0162004500565b9650620046a860408a0162004500565b9550620046b860608a0162004500565b9450620046c860808a0162004500565b935060a0890135925060c08901359150620046e78a60e08b0162004652565b90509295985092959890939650565b5f805f805f805f806103e0898b0312156200470f575f80fd5b6200471a89620045ec565b97506200472a60208a0162004500565b96506200473a60408a0162004500565b95506200474a60608a0162004500565b94506080890135935060a0890135925060c08901356200476a81620044eb565b9150620046e78a60e08b0162004652565b5f602082840312156200478c575f80fd5b813561ffff811681146200479e575f80fd5b9392505050565b5f60208284031215620047b6575f80fd5b5035919050565b5f8060408385031215620047cf575f80fd5b823591506020830135620047e381620044eb565b809150509250929050565b5f60208284031215620047ff575f80fd5b62000f598262004500565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126200482e575f80fd5b81356001600160401b03808211156200484b576200484b6200480a565b604051601f8301601f19908116603f011681019082821181831017156200487657620048766200480a565b816040528381528660208588010111156200488f575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a031215620048c5575f80fd5b620048d088620045ec565b9650620048e06020890162004500565b95506040880135620048f281620044eb565b945060608801356200490481620044eb565b935060808801356200491681620044eb565b925060a08801356001600160401b038082111562004932575f80fd5b620049408b838c016200481e565b935060c08a013591508082111562004956575f80fd5b50620049658a828b016200481e565b91505092959891949750929550565b5f805f805f8060c087890312156200498a575f80fd5b6200499587620045ec565b9550620049a56020880162004500565b9450620049b56040880162004500565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b83811015620049f2578181015183820152602001620049d8565b50505f910152565b5f815180845262004a13816020860160208601620049d6565b601f01601f19169290920160200192915050565b602081525f62000f596020830184620049fa565b5f806040838503121562004a4d575f80fd5b62004a588362004500565b946020939093013593505050565b5f805f806060858703121562004a7a575f80fd5b843562004a8781620044eb565b935062004a9760208601620045ec565b925060408501356001600160401b038082111562004ab3575f80fd5b818701915087601f83011262004ac7575f80fd5b81358181111562004ad6575f80fd5b88602082850101111562004ae8575f80fd5b95989497505060200194505050565b5f6020828403121562004b08575f80fd5b81356200479e81620044eb565b803560ff8116811462002fcc575f80fd5b5f805f805f8060c0878903121562004b3c575f80fd5b863562004b4981620044eb565b9550602087013562004b5b81620044eb565b945062004b6b6040880162004500565b935062004b7b6060880162004500565b92506080870135915062004b9260a0880162004b15565b90509295509295509295565b5f805f805f8060c0878903121562004bb4575f80fd5b863562004bc181620044eb565b9550602087013562004bd381620044eb565b945062004be36040880162004500565b935062004bf36060880162004b15565b92506080870135915060a08701356001600160401b0381111562004c15575f80fd5b62004c2389828a016200481e565b9150509295509295509295565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111562004c675762004c6762004c30565b5092915050565b808202811582820484141762000f5c5762000f5c62004c30565b5f63ffffffff80831681810362004ca35762004ca362004c30565b6001019392505050565b6001600160a01b038481168252831660208201526060604082018190525f9062004cda90830184620049fa565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190525f9062004d2490830185620049fa565b82810360a084015262004d388185620049fa565b9998505050505050505050565b6001600160401b0382811682821603908082111562004c675762004c6762004c30565b5f6001600160401b0380831681810362004ca35762004ca362004c30565b5f6020828403121562004d97575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8262004dc35762004dc362004d9e565b500490565b8082018082111562000f5c5762000f5c62004c30565b634e487b7160e01b5f52603260045260245ffd5b5f6001820162004e065762004e0662004c30565b5060010190565b5f8262004e1e5762004e1e62004d9e565b500690565b8181038181111562000f5c5762000f5c62004c30565b5f8162004e4a5762004e4a62004c30565b505f190190565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190525f9062004edc90830184620049fa565b98975050505050505050565b5f825162004efb818460208701620049d6565b9190910192915050565b6103208101610300808584378201835f5b600181101562004f3757815183526020928301929091019060010162004f16565b5050509392505050565b5f6020828403121562004f52575f80fd5b815180151581146200479e575f80fd5b5f6001600160401b038084168062004f7e5762004f7e62004d9e565b9216919091049291505056fe60a0604052604051620008be380380620008be8339810160408190526100249161034d565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b6565b505050610432565b61006182610124565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100aa576100a582826101a2565b505050565b6100b2610215565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f65f805160206200089e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161012181610236565b50565b806001600160a01b03163b5f0361015e57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516101be9190610417565b5f60405180830381855af49150503d805f81146101f6576040519150601f19603f3d011682016040523d82523d5f602084013e6101fb565b606091505b50909250905061020c858383610274565b95945050505050565b34156102345760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661025f57604051633173bdd160e11b81525f6004820152602401610155565b805f805160206200089e833981519152610181565b60608261028957610284826102d3565b6102cc565b81511580156102a057506001600160a01b0384163b155b156102c957604051639996b31560e01b81526001600160a01b0385166004820152602401610155565b50805b9392505050565b8051156102e35780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b0381168114610312575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561034557818101518382015260200161032d565b50505f910152565b5f805f6060848603121561035f575f80fd5b610368846102fc565b9250610376602085016102fc565b60408501519092506001600160401b0380821115610392575f80fd5b818601915086601f8301126103a5575f80fd5b8151818111156103b7576103b7610317565b604051601f8201601f19908116603f011681019083821181831017156103df576103df610317565b816040528281528960208487010111156103f7575f80fd5b61040883602083016020880161032b565b80955050505050509250925092565b5f825161042881846020870161032b565b9190910192915050565b6080516104546200044a5f395f601001526104545ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610069575f356001600160e01b03191663278f794360e11b146100615761005f61006d565b565b61005f61007d565b61005f5b61005f6100786100ab565b6100e2565b5f8061008c36600481846102ee565b8101906100999190610329565b915091506100a78282610100565b5050565b5f6100dd7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156100fc573d5ff35b3d5ffd5b6101098261015a565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101525761014d82826101d5565b505050565b6100a7610247565b806001600160a01b03163b5f0361019457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101f191906103f2565b5f60405180830381855af49150503d805f8114610229576040519150601f19603f3d011682016040523d82523d5f602084013e61022e565b606091505b509150915061023e858383610266565b95945050505050565b341561005f5760405163b398979f60e01b815260040160405180910390fd5b60608261027b57610276826102c5565b6102be565b815115801561029257506001600160a01b0384163b155b156102bb57604051639996b31560e01b81526001600160a01b038516600482015260240161018b565b50805b9392505050565b8051156102d55780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f80858511156102fc575f80fd5b83861115610308575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561033a575f80fd5b82356001600160a01b0381168114610350575f80fd5b9150602083013567ffffffffffffffff8082111561036c575f80fd5b818501915085601f83011261037f575f80fd5b81358181111561039157610391610315565b604051601f8201601f19908116603f011681019083821181831017156103b9576103b9610315565b816040528281528860208487010111156103d1575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b8181101561041157602081860181015185830152016103f7565b505f92019182525091905056fea2646970667358221220c3817d11eb3dc87723342527d38da55b7b3b362f54567f56cf1ef4db2f8a430664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220a4110513306739c3c08cc22958bf1451aa1a4a1222df971c0412e1c1ab1b08c764736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/PolygonValidiumEtrog.json b/compiled-contracts/PolygonValidiumEtrog.json new file mode 100644 index 000000000..754958a85 --- /dev/null +++ b/compiled-contracts/PolygonValidiumEtrog.json @@ -0,0 +1,1268 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonValidiumEtrog", + "sourceName": "contracts/v2/consensus/validium/PolygonValidiumEtrog.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRootV2", + "name": "_globalExitRootManager", + "type": "address" + }, + { + "internalType": "contract IERC20Upgradeable", + "name": "_pol", + "type": "address" + }, + { + "internalType": "contract IPolygonZkEVMBridgeV2", + "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": "ForceBatchesDecentralized", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchesNotAllowedOnEmergencyState", + "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": "HaltTimeoutNotExpiredAfterEmergencyState", + "type": "error" + }, + { + "inputs": [], + "name": "HugeTokenMetadataNotSupported", + "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": "SwitchToSameValue", + "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": [ + { + "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": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "lastGlobalExitRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "sequencer", + "type": "address" + } + ], + "name": "InitialSequenceBatches", + "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" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "l1InfoRoot", + "type": "bytes32" + } + ], + "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": "address", + "name": "newDataAvailabilityProtocol", + "type": "address" + } + ], + "name": "SetDataAvailabilityProtocol", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newForceBatchAddress", + "type": "address" + } + ], + "name": "SetForceBatchAddress", + "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": "GLOBAL_EXIT_ROOT_MANAGER_L2", + "outputs": [ + { + "internalType": "contract IBasePolygonZkEVMGlobalExitRoot", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_LIST_LEN_LEN", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS_EMPTY_METADATA", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_CONSTANT_BYTES", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_CONSTANT_BYTES_EMPTY_METADATA", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_DATA_LEN_EMPTY_METADATA", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "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": "admin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "bridgeAddress", + "outputs": [ + { + "internalType": "contract IPolygonZkEVMBridgeV2", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "calculatePolPerForceBatch", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "dataAvailabilityProtocol", + "outputs": [ + { + "internalType": "contract IDataAvailabilityProtocol", + "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": "forceBatchAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "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" + }, + { + "internalType": "bytes", + "name": "_gasTokenMetadata", + "type": "bytes" + } + ], + "name": "generateInitializeTransaction", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalExitRootManager", + "outputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRootV2", + "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": "string", + "name": "sequencerURL", + "type": "string" + }, + { + "internalType": "string", + "name": "_networkName", + "type": "string" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "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": "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": "forcedGlobalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "forcedTimestamp", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "forcedBlockHashL1", + "type": "bytes32" + } + ], + "internalType": "struct PolygonRollupBaseEtrog.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": "forcedGlobalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "forcedTimestamp", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "forcedBlockHashL1", + "type": "bytes32" + } + ], + "internalType": "struct PolygonValidiumEtrog.ValidiumBatchData[]", + "name": "batches", + "type": "tuple[]" + }, + { + "internalType": "address", + "name": "l2Coinbase", + "type": "address" + }, + { + "internalType": "bytes", + "name": "dataAvailabilityMessage", + "type": "bytes" + } + ], + "name": "sequenceBatchesValidium", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "forcedGlobalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "forcedTimestamp", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "forcedBlockHashL1", + "type": "bytes32" + } + ], + "internalType": "struct PolygonRollupBaseEtrog.BatchData[]", + "name": "batches", + "type": "tuple[]" + } + ], + "name": "sequenceForceBatches", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IDataAvailabilityProtocol", + "name": "newDataAvailabilityProtocol", + "type": "address" + } + ], + "name": "setDataAvailabilityProtocol", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newForceBatchAddress", + "type": "address" + } + ], + "name": "setForceBatchAddress", + "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": "bool", + "name": "newIsSequenceWithDataAvailabilityAllowed", + "type": "bool" + } + ], + "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": "0x61010060405234801562000011575f80fd5b5060405162004f2b38038062004f2b83398101604081905262000034916200006f565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d4565b6001600160a01b03811681146200006c575f80fd5b50565b5f805f806080858703121562000083575f80fd5b8451620000908162000057565b6020860151909450620000a38162000057565b6040860151909350620000b68162000057565b6060860151909250620000c98162000057565b939692955090935050565b60805160a05160c05160e051614d4a620001e15f395f818161053b015281816110b50152818161117c0152818161119e0152818161133a015281816114100152818161157c015281816117c401528181611d97015281816122fb0152818161274a015281816127f701528181612e7301528181612f38015281816139de01528181613a5701528181613a790152613b2101525f81816106dc01528181610bed015281816119b801528181611a8d015281816129c101528181612ac9015261352901525f818161079801528181610c6901528181611c0e0152818161308001526135a501525f81816107ca015281816108ba015281816111080152818161124a01526130550152614d4a5ff3fe608060405234801561000f575f80fd5b5060043610610303575f3560e01c8063712570221161019d578063c7fffd4b116100e8578063e57a0b4c11610093578063ecef3f991161006e578063ecef3f9914610833578063f35dda4714610846578063f851a4401461084e575f80fd5b8063e57a0b4c146107ec578063e7a7ed021461080c578063eaeb077b14610820575f80fd5b8063d02103ca116100c3578063d02103ca14610793578063d7bc90ff146107ba578063e46761c4146107c5575f80fd5b8063c7fffd4b14610758578063c89e42df14610760578063cfa8ed4714610773575f80fd5b80639f26f84011610148578063ada8f91911610123578063ada8f91914610711578063b0afe15414610724578063c754c7ed14610730575f80fd5b80639f26f840146106c4578063a3c573eb146106d7578063a652f26c146106fe575f80fd5b80638c3d7301116101785780638c3d73011461068e57806391cafe32146106965780639e001877146106a9575f80fd5b8063712570221461062c5780637a5460c51461063f5780637cd76b8b1461067b575f80fd5b80633cbc795b1161025d57806352bdeb6d116102085780636b8616ce116101e35780636b8616ce146105f15780636e05d2cd146106105780636ff512cc14610619575f80fd5b806352bdeb6d146105a5578063542028d5146105e1578063676870d2146105e9575f80fd5b806349b7b8021161023857806349b7b802146105365780634c21fef31461055d5780634e48770614610592575f80fd5b80633cbc795b1461046857806340b5de6c146104a557806345605267146104fd575f80fd5b806326782247116102bd5780632d72c248116102985780632d72c2481461042257806332c2d153146104355780633c351e1014610448575f80fd5b806326782247146103a85780632acdc2b6146103ed5780632c111c0614610402575f80fd5b806305835f37116102ed57806305835f371461033d578063107bf28c1461038657806311e892d41461038e575f80fd5b8062d0295d146103075780630350896314610322575b5f80fd5b61030f610873565b6040519081526020015b60405180910390f35b61032a602081565b60405161ffff9091168152602001610319565b6103796040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516103199190613ed4565b610379610979565b61039660f981565b60405160ff9091168152602001610319565b6001546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610319565b6104006103fb366004613efd565b610a05565b005b6008546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b610400610430366004613f8e565b610b23565b61040061044336600461404c565b61140e565b6009546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104909074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610319565b6104cc7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff000000000000000000000000000000000000000000000000000000000000009091168152602001610319565b60075461051d9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610319565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b600a546105829074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001610319565b6104006105a036600461408b565b6114dd565b6103796040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b6103796116ec565b61032a601f81565b61030f6105ff36600461408b565b60066020525f908152604090205481565b61030f60055481565b6104006106273660046140a6565b6116f9565b61040061063a36600461420e565b6117c2565b6103796040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b6104006106893660046140a6565b611fcc565b610400612095565b6104006106a43660046140a6565b612167565b6103c873a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6104006106d23660046142f6565b61227f565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b61037961070c366004614335565b6128c3565b61040061071f3660046140a6565b612ca1565b61030f6405ca1ab1e081565b60075461051d90700100000000000000000000000000000000900467ffffffffffffffff1681565b61039660e481565b61040061076e3660046143a6565b612d6a565b6002546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b61030f635ca1ab1e81565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b600a546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b60075461051d9067ffffffffffffffff1681565b61040061082e3660046143d8565b612dfc565b610400610841366004614420565b6132c3565b610396601b81565b5f546103c89062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156108ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109239190614468565b6007549091505f9061094d9067ffffffffffffffff680100000000000000008204811691166144ac565b67ffffffffffffffff169050805f03610968575f9250505090565b61097281836144d4565b9250505090565b600480546109869061450c565b80601f01602080910402602001604051908101604052809291908181526020018280546109b29061450c565b80156109fd5780601f106109d4576101008083540402835291602001916109fd565b820191905f5260205f20905b8154815290600101906020018083116109e057829003601f168201915b505050505081565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a5b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a5474010000000000000000000000000000000000000000900460ff16151581151503610ab5576040517f5f0e7abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000831515021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f41905f90a150565b60025473ffffffffffffffffffffffffffffffffffffffff163314610b74576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835f819003610baf576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610beb576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610c50575f80fd5b505af1158015610c62573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cd0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cf49190614468565b60075460055491925068010000000000000000900467ffffffffffffffff1690815f805b86811015611028575f8c8c83818110610d3357610d3361455d565b905060800201803603810190610d49919061458a565b604081015190915067ffffffffffffffff1615610f365785610d6a816145d6565b9650505f815f0151826020015183604001518460600151604051602001610dcf9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114610e57576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85825f0151836020015184604001518f8660600151604051602001610ef0969594939291909586526020860194909452604085019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060808501919091521b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166068830152607c820152609c0190565b60405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550611015565b8051604051610f52918591602001918252602082015260400190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152828252805160209182012084519184018990529183015260608083018a90524260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401528d901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888301525f609c830152935060bc016040516020818303038152906040528051906020012094505b5080611020816145fc565b915050610d18565b5060075467ffffffffffffffff9081169085161115611073576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058390558567ffffffffffffffff85811690841614611170575f61109884876144ac565b90506110ae67ffffffffffffffff821683614633565b915061112f7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166110e7610873565b6110f1919061464c565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613327565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8816021790555b80156112f957611272337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611205573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112299190614468565b611233919061464c565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906133fb565b600a546040517f3b51be4b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690633b51be4b906112cc9085908d908d906004016146aa565b5f6040518083038186803b1580156112e2575f80fd5b505afa1580156112f4573d5f803e3d5ffd5b505050505b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018590525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611395573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113b991906146cc565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e766886040516113f791815260200190565b60405180910390a250505050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461147d576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966846040516114d091815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611533576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561157a576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115e3573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061160791906146e7565b6116685760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610611668576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546109869061450c565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff16331461174f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016116e1565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611831576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff161580801561184f57505f54600160ff909116105b806118685750303b15801561186857505f5460ff166001145b6118f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611955575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611bb3576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa1580156119fc573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611a419190810190614702565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d9060240160408051808303815f875af1158015611ad4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611af8919061476b565b915091508163ffffffff165f14611b6f576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055611bb0565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b6009545f90611bfa90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff16856128c3565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c999190614468565b90505f808483858f611cac600143614633565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611df2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e1691906146cc565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611ea691906147e8565b506004611eb389826147e8565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611f5393929190614900565b60405180910390a15050505050508015611fc3575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612022576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fd331bd4c4cd1afecb94a225184bded161ff3213624ba4fb58c4f30c5a861144a906020016116e1565b60015473ffffffffffffffffffffffffffffffffffffffff1633146120e6576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146121bd576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff1661220c576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb906020016116e1565b60085473ffffffffffffffffffffffffffffffffffffffff1680158015906122bd575073ffffffffffffffffffffffffffffffffffffffff81163314155b156122f4576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612362573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061238691906146cc565b612390919061493e565b67ffffffffffffffff1611156123d2576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361240d576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612449576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff808216916124719184916801000000000000000090041661495f565b11156124a9576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b83811015612744575f8787838181106124e4576124e461455d565b90506020028101906124f69190614972565b6124ff906149ae565b90508361250b816145d6565b825180516020918201208185015160408087015160608801519151959a509295505f94612577948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152600690935291205490915081146125ff576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f90815260066020526040812055612623600188614633565b84036126925742600760109054906101000a900467ffffffffffffffff168460400151612650919061493e565b67ffffffffffffffff161115612692576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209450505050808061273c906145fc565b9150506124c9565b506127727f0000000000000000000000000000000000000000000000000000000000000000846110e7610873565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390612843908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af115801561285f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061288391906146cc565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f876040516024016128f596959493929190614a19565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f03612a455760f9601f83516129899190614a7b565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001612a2f9796959493929190614a96565b6040516020818303038152906040529050612b49565b815161ffff1015612a82576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9612a91602083614a7b565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001612b369796959493929190614b78565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015612ba7573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612c1f576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f90612c649084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614c5a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612cf7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016116e1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612dc0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003612dcc82826147e8565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516116e19190613ed4565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590612e3a575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612e71576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015612eda573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612efe91906146e7565b15612f35576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f9f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc39190614468565b905082811115612fff576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138884111561303b576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61307d73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846133fb565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061310b9190614468565b6007805491925067ffffffffffffffff909116905f613129836145d6565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051613160929190614cb5565b6040519081900390208142613176600143614633565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f908152600690935291205532330361326c576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a26132bb565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931906132b290849033908b908b90614cc4565b60405180910390a25b505050505050565b600a5474010000000000000000000000000000000000000000900460ff16613317576040517f821935b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61332283838361345f565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526133229084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613bf3565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526134599085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613379565b50505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146134b0576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f8190036134eb576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115613527576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561358c575f80fd5b505af115801561359e573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561360c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136309190614468565b60075460055491925042916801000000000000000090910467ffffffffffffffff1690815f5b86811015613951575f8a8a838181106136715761367161455d565b90506020028101906136839190614972565b61368c906149ae565b8051805160209091012060408201519192509067ffffffffffffffff161561386c57856136b8816145d6565b9650505f8183602001518460400151856060015160405160200161371a9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f908152600690935291205490915081146137a2576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f90555061393c565b8151516201d4c010156138ab576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b50508080613949906145fc565b915050613656565b5060075467ffffffffffffffff908116908416111561399c576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff84811690831614613a51575f6139c183866144ac565b90506139d767ffffffffffffffff821683614633565b9150613a107f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166110e7610873565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b613ae0337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611205573d5f803e3d5ffd5b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015613b7c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ba091906146cc565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e76688604051613bde91815260200190565b60405180910390a25050505050505050505050565b5f613c54826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613cfe9092919063ffffffff16565b8051909150156133225780806020019051810190613c7291906146e7565b613322576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016118f0565b6060612c9984845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051613d309190614d03565b5f6040518083038185875af1925050503d805f8114613d6a576040519150601f19603f3d011682016040523d82523d5f602084013e613d6f565b606091505b5091509150613d8087838387613d8b565b979650505050505050565b60608315613e205782515f03613e195773ffffffffffffffffffffffffffffffffffffffff85163b613e19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016118f0565b5081612c99565b612c998383815115613e355781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f09190613ed4565b5f5b83811015613e83578181015183820152602001613e6b565b50505f910152565b5f8151808452613ea2816020860160208601613e69565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f613ee66020830184613e8b565b9392505050565b8015158114613efa575f80fd5b50565b5f60208284031215613f0d575f80fd5b8135613ee681613eed565b73ffffffffffffffffffffffffffffffffffffffff81168114613efa575f80fd5b8035613f4481613f18565b919050565b5f8083601f840112613f59575f80fd5b50813567ffffffffffffffff811115613f70575f80fd5b602083019150836020828501011115613f87575f80fd5b9250929050565b5f805f805f60608688031215613fa2575f80fd5b853567ffffffffffffffff80821115613fb9575f80fd5b818801915088601f830112613fcc575f80fd5b813581811115613fda575f80fd5b8960208260071b8501011115613fee575f80fd5b6020830197508096505061400460208901613f39565b94506040880135915080821115614019575f80fd5b5061402688828901613f49565b969995985093965092949392505050565b67ffffffffffffffff81168114613efa575f80fd5b5f805f6060848603121561405e575f80fd5b833561406981614037565b925060208401359150604084013561408081613f18565b809150509250925092565b5f6020828403121561409b575f80fd5b8135613ee681614037565b5f602082840312156140b6575f80fd5b8135613ee681613f18565b63ffffffff81168114613efa575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516080810167ffffffffffffffff81118282101715614122576141226140d2565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561416f5761416f6140d2565b604052919050565b5f67ffffffffffffffff821115614190576141906140d2565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f8301126141cb575f80fd5b81356141de6141d982614177565b614128565b8181528460208386010111156141f2575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c08789031215614223575f80fd5b863561422e81613f18565b9550602087013561423e81613f18565b9450604087013561424e816140c1565b9350606087013561425e81613f18565b9250608087013567ffffffffffffffff8082111561427a575f80fd5b6142868a838b016141bc565b935060a089013591508082111561429b575f80fd5b506142a889828a016141bc565b9150509295509295509295565b5f8083601f8401126142c5575f80fd5b50813567ffffffffffffffff8111156142dc575f80fd5b6020830191508360208260051b8501011115613f87575f80fd5b5f8060208385031215614307575f80fd5b823567ffffffffffffffff81111561431d575f80fd5b614329858286016142b5565b90969095509350505050565b5f805f8060808587031215614348575f80fd5b8435614353816140c1565b9350602085013561436381613f18565b92506040850135614373816140c1565b9150606085013567ffffffffffffffff81111561438e575f80fd5b61439a878288016141bc565b91505092959194509250565b5f602082840312156143b6575f80fd5b813567ffffffffffffffff8111156143cc575f80fd5b612c99848285016141bc565b5f805f604084860312156143ea575f80fd5b833567ffffffffffffffff811115614400575f80fd5b61440c86828701613f49565b909790965060209590950135949350505050565b5f805f60408486031215614432575f80fd5b833567ffffffffffffffff811115614448575f80fd5b614454868287016142b5565b909450925050602084013561408081613f18565b5f60208284031215614478575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8281168282160390808211156144cd576144cd61447f565b5092915050565b5f82614507577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c9082168061452057607f821691505b602082108103614557577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6080828403121561459a575f80fd5b6145a26140ff565b823581526020830135602082015260408301356145be81614037565b60408201526060928301359281019290925250919050565b5f67ffffffffffffffff8083168181036145f2576145f261447f565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361462c5761462c61447f565b5060010190565b818103818111156146465761464661447f565b92915050565b80820281158282048414176146465761464661447f565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201525f6146c3604083018486614663565b95945050505050565b5f602082840312156146dc575f80fd5b8151613ee681614037565b5f602082840312156146f7575f80fd5b8151613ee681613eed565b5f60208284031215614712575f80fd5b815167ffffffffffffffff811115614728575f80fd5b8201601f81018413614738575f80fd5b80516147466141d982614177565b81815285602083850101111561475a575f80fd5b6146c3826020830160208601613e69565b5f806040838503121561477c575f80fd5b8251614787816140c1565b602084015190925061479881613f18565b809150509250929050565b601f821115613322575f81815260208120601f850160051c810160208610156147c95750805b601f850160051c820191505b818110156132bb578281556001016147d5565b815167ffffffffffffffff811115614802576148026140d2565b61481681614810845461450c565b846147a3565b602080601f831160018114614868575f84156148325750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556132bb565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156148b457888601518255948401946001909101908401614895565b50858210156148f057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f6149126060830186613e8b565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff8181168382160190808211156144cd576144cd61447f565b808201808211156146465761464661447f565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126149a4575f80fd5b9190910192915050565b5f608082360312156149be575f80fd5b6149c66140ff565b823567ffffffffffffffff8111156149dc575f80fd5b6149e8368286016141bc565b825250602083013560208201526040830135614a0381614037565b6040820152606092830135928101929092525090565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152614a6f60c0830184613e8b565b98975050505050505050565b61ffff8181168382160190808211156144cd576144cd61447f565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614afe816003860160208c01613e69565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614b41816017840160208b01613e69565b808201915050818660f81b16601782015284519150614b67826018830160208801613e69565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614be0816003860160208c01613e69565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614c23816017840160208b01613e69565b808201915050818660f01b16601782015284519150614c49826019830160208801613e69565b016019019998505050505050505050565b5f8651614c6b818460208b01613e69565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f614cf9606083018486614663565b9695505050505050565b5f82516149a4818460208701613e6956fea26469706673582212201281d4100452fbfedfff30c5ba9f475c64c3082f10f59c7afb3a0c4ed7777ac764736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610303575f3560e01c8063712570221161019d578063c7fffd4b116100e8578063e57a0b4c11610093578063ecef3f991161006e578063ecef3f9914610833578063f35dda4714610846578063f851a4401461084e575f80fd5b8063e57a0b4c146107ec578063e7a7ed021461080c578063eaeb077b14610820575f80fd5b8063d02103ca116100c3578063d02103ca14610793578063d7bc90ff146107ba578063e46761c4146107c5575f80fd5b8063c7fffd4b14610758578063c89e42df14610760578063cfa8ed4714610773575f80fd5b80639f26f84011610148578063ada8f91911610123578063ada8f91914610711578063b0afe15414610724578063c754c7ed14610730575f80fd5b80639f26f840146106c4578063a3c573eb146106d7578063a652f26c146106fe575f80fd5b80638c3d7301116101785780638c3d73011461068e57806391cafe32146106965780639e001877146106a9575f80fd5b8063712570221461062c5780637a5460c51461063f5780637cd76b8b1461067b575f80fd5b80633cbc795b1161025d57806352bdeb6d116102085780636b8616ce116101e35780636b8616ce146105f15780636e05d2cd146106105780636ff512cc14610619575f80fd5b806352bdeb6d146105a5578063542028d5146105e1578063676870d2146105e9575f80fd5b806349b7b8021161023857806349b7b802146105365780634c21fef31461055d5780634e48770614610592575f80fd5b80633cbc795b1461046857806340b5de6c146104a557806345605267146104fd575f80fd5b806326782247116102bd5780632d72c248116102985780632d72c2481461042257806332c2d153146104355780633c351e1014610448575f80fd5b806326782247146103a85780632acdc2b6146103ed5780632c111c0614610402575f80fd5b806305835f37116102ed57806305835f371461033d578063107bf28c1461038657806311e892d41461038e575f80fd5b8062d0295d146103075780630350896314610322575b5f80fd5b61030f610873565b6040519081526020015b60405180910390f35b61032a602081565b60405161ffff9091168152602001610319565b6103796040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516103199190613ed4565b610379610979565b61039660f981565b60405160ff9091168152602001610319565b6001546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610319565b6104006103fb366004613efd565b610a05565b005b6008546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b610400610430366004613f8e565b610b23565b61040061044336600461404c565b61140e565b6009546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104909074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610319565b6104cc7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff000000000000000000000000000000000000000000000000000000000000009091168152602001610319565b60075461051d9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610319565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b600a546105829074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001610319565b6104006105a036600461408b565b6114dd565b6103796040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b6103796116ec565b61032a601f81565b61030f6105ff36600461408b565b60066020525f908152604090205481565b61030f60055481565b6104006106273660046140a6565b6116f9565b61040061063a36600461420e565b6117c2565b6103796040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b6104006106893660046140a6565b611fcc565b610400612095565b6104006106a43660046140a6565b612167565b6103c873a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6104006106d23660046142f6565b61227f565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b61037961070c366004614335565b6128c3565b61040061071f3660046140a6565b612ca1565b61030f6405ca1ab1e081565b60075461051d90700100000000000000000000000000000000900467ffffffffffffffff1681565b61039660e481565b61040061076e3660046143a6565b612d6a565b6002546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b61030f635ca1ab1e81565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b600a546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b60075461051d9067ffffffffffffffff1681565b61040061082e3660046143d8565b612dfc565b610400610841366004614420565b6132c3565b610396601b81565b5f546103c89062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156108ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109239190614468565b6007549091505f9061094d9067ffffffffffffffff680100000000000000008204811691166144ac565b67ffffffffffffffff169050805f03610968575f9250505090565b61097281836144d4565b9250505090565b600480546109869061450c565b80601f01602080910402602001604051908101604052809291908181526020018280546109b29061450c565b80156109fd5780601f106109d4576101008083540402835291602001916109fd565b820191905f5260205f20905b8154815290600101906020018083116109e057829003601f168201915b505050505081565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a5b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a5474010000000000000000000000000000000000000000900460ff16151581151503610ab5576040517f5f0e7abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000831515021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f41905f90a150565b60025473ffffffffffffffffffffffffffffffffffffffff163314610b74576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835f819003610baf576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610beb576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610c50575f80fd5b505af1158015610c62573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cd0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cf49190614468565b60075460055491925068010000000000000000900467ffffffffffffffff1690815f805b86811015611028575f8c8c83818110610d3357610d3361455d565b905060800201803603810190610d49919061458a565b604081015190915067ffffffffffffffff1615610f365785610d6a816145d6565b9650505f815f0151826020015183604001518460600151604051602001610dcf9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114610e57576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85825f0151836020015184604001518f8660600151604051602001610ef0969594939291909586526020860194909452604085019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060808501919091521b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166068830152607c820152609c0190565b60405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550611015565b8051604051610f52918591602001918252602082015260400190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152828252805160209182012084519184018990529183015260608083018a90524260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401528d901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888301525f609c830152935060bc016040516020818303038152906040528051906020012094505b5080611020816145fc565b915050610d18565b5060075467ffffffffffffffff9081169085161115611073576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058390558567ffffffffffffffff85811690841614611170575f61109884876144ac565b90506110ae67ffffffffffffffff821683614633565b915061112f7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166110e7610873565b6110f1919061464c565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613327565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8816021790555b80156112f957611272337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611205573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112299190614468565b611233919061464c565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906133fb565b600a546040517f3b51be4b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690633b51be4b906112cc9085908d908d906004016146aa565b5f6040518083038186803b1580156112e2575f80fd5b505afa1580156112f4573d5f803e3d5ffd5b505050505b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018590525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611395573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113b991906146cc565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e766886040516113f791815260200190565b60405180910390a250505050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461147d576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966846040516114d091815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611533576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561157a576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115e3573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061160791906146e7565b6116685760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610611668576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546109869061450c565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff16331461174f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016116e1565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611831576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff161580801561184f57505f54600160ff909116105b806118685750303b15801561186857505f5460ff166001145b6118f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611955575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611bb3576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa1580156119fc573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611a419190810190614702565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d9060240160408051808303815f875af1158015611ad4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611af8919061476b565b915091508163ffffffff165f14611b6f576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055611bb0565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b6009545f90611bfa90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff16856128c3565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c999190614468565b90505f808483858f611cac600143614633565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611df2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e1691906146cc565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611ea691906147e8565b506004611eb389826147e8565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611f5393929190614900565b60405180910390a15050505050508015611fc3575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612022576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fd331bd4c4cd1afecb94a225184bded161ff3213624ba4fb58c4f30c5a861144a906020016116e1565b60015473ffffffffffffffffffffffffffffffffffffffff1633146120e6576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146121bd576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff1661220c576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb906020016116e1565b60085473ffffffffffffffffffffffffffffffffffffffff1680158015906122bd575073ffffffffffffffffffffffffffffffffffffffff81163314155b156122f4576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612362573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061238691906146cc565b612390919061493e565b67ffffffffffffffff1611156123d2576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361240d576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612449576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff808216916124719184916801000000000000000090041661495f565b11156124a9576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b83811015612744575f8787838181106124e4576124e461455d565b90506020028101906124f69190614972565b6124ff906149ae565b90508361250b816145d6565b825180516020918201208185015160408087015160608801519151959a509295505f94612577948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152600690935291205490915081146125ff576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f90815260066020526040812055612623600188614633565b84036126925742600760109054906101000a900467ffffffffffffffff168460400151612650919061493e565b67ffffffffffffffff161115612692576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209450505050808061273c906145fc565b9150506124c9565b506127727f0000000000000000000000000000000000000000000000000000000000000000846110e7610873565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390612843908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af115801561285f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061288391906146cc565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f876040516024016128f596959493929190614a19565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f03612a455760f9601f83516129899190614a7b565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001612a2f9796959493929190614a96565b6040516020818303038152906040529050612b49565b815161ffff1015612a82576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9612a91602083614a7b565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001612b369796959493929190614b78565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015612ba7573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612c1f576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f90612c649084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614c5a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612cf7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016116e1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612dc0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003612dcc82826147e8565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516116e19190613ed4565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590612e3a575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612e71576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015612eda573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612efe91906146e7565b15612f35576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f9f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc39190614468565b905082811115612fff576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138884111561303b576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61307d73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846133fb565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061310b9190614468565b6007805491925067ffffffffffffffff909116905f613129836145d6565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051613160929190614cb5565b6040519081900390208142613176600143614633565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f908152600690935291205532330361326c576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a26132bb565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931906132b290849033908b908b90614cc4565b60405180910390a25b505050505050565b600a5474010000000000000000000000000000000000000000900460ff16613317576040517f821935b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61332283838361345f565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526133229084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613bf3565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526134599085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613379565b50505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146134b0576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f8190036134eb576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115613527576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561358c575f80fd5b505af115801561359e573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561360c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136309190614468565b60075460055491925042916801000000000000000090910467ffffffffffffffff1690815f5b86811015613951575f8a8a838181106136715761367161455d565b90506020028101906136839190614972565b61368c906149ae565b8051805160209091012060408201519192509067ffffffffffffffff161561386c57856136b8816145d6565b9650505f8183602001518460400151856060015160405160200161371a9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f908152600690935291205490915081146137a2576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f90555061393c565b8151516201d4c010156138ab576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b50508080613949906145fc565b915050613656565b5060075467ffffffffffffffff908116908416111561399c576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff84811690831614613a51575f6139c183866144ac565b90506139d767ffffffffffffffff821683614633565b9150613a107f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166110e7610873565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b613ae0337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611205573d5f803e3d5ffd5b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015613b7c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ba091906146cc565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e76688604051613bde91815260200190565b60405180910390a25050505050505050505050565b5f613c54826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613cfe9092919063ffffffff16565b8051909150156133225780806020019051810190613c7291906146e7565b613322576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016118f0565b6060612c9984845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051613d309190614d03565b5f6040518083038185875af1925050503d805f8114613d6a576040519150601f19603f3d011682016040523d82523d5f602084013e613d6f565b606091505b5091509150613d8087838387613d8b565b979650505050505050565b60608315613e205782515f03613e195773ffffffffffffffffffffffffffffffffffffffff85163b613e19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016118f0565b5081612c99565b612c998383815115613e355781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f09190613ed4565b5f5b83811015613e83578181015183820152602001613e6b565b50505f910152565b5f8151808452613ea2816020860160208601613e69565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f613ee66020830184613e8b565b9392505050565b8015158114613efa575f80fd5b50565b5f60208284031215613f0d575f80fd5b8135613ee681613eed565b73ffffffffffffffffffffffffffffffffffffffff81168114613efa575f80fd5b8035613f4481613f18565b919050565b5f8083601f840112613f59575f80fd5b50813567ffffffffffffffff811115613f70575f80fd5b602083019150836020828501011115613f87575f80fd5b9250929050565b5f805f805f60608688031215613fa2575f80fd5b853567ffffffffffffffff80821115613fb9575f80fd5b818801915088601f830112613fcc575f80fd5b813581811115613fda575f80fd5b8960208260071b8501011115613fee575f80fd5b6020830197508096505061400460208901613f39565b94506040880135915080821115614019575f80fd5b5061402688828901613f49565b969995985093965092949392505050565b67ffffffffffffffff81168114613efa575f80fd5b5f805f6060848603121561405e575f80fd5b833561406981614037565b925060208401359150604084013561408081613f18565b809150509250925092565b5f6020828403121561409b575f80fd5b8135613ee681614037565b5f602082840312156140b6575f80fd5b8135613ee681613f18565b63ffffffff81168114613efa575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516080810167ffffffffffffffff81118282101715614122576141226140d2565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561416f5761416f6140d2565b604052919050565b5f67ffffffffffffffff821115614190576141906140d2565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f8301126141cb575f80fd5b81356141de6141d982614177565b614128565b8181528460208386010111156141f2575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c08789031215614223575f80fd5b863561422e81613f18565b9550602087013561423e81613f18565b9450604087013561424e816140c1565b9350606087013561425e81613f18565b9250608087013567ffffffffffffffff8082111561427a575f80fd5b6142868a838b016141bc565b935060a089013591508082111561429b575f80fd5b506142a889828a016141bc565b9150509295509295509295565b5f8083601f8401126142c5575f80fd5b50813567ffffffffffffffff8111156142dc575f80fd5b6020830191508360208260051b8501011115613f87575f80fd5b5f8060208385031215614307575f80fd5b823567ffffffffffffffff81111561431d575f80fd5b614329858286016142b5565b90969095509350505050565b5f805f8060808587031215614348575f80fd5b8435614353816140c1565b9350602085013561436381613f18565b92506040850135614373816140c1565b9150606085013567ffffffffffffffff81111561438e575f80fd5b61439a878288016141bc565b91505092959194509250565b5f602082840312156143b6575f80fd5b813567ffffffffffffffff8111156143cc575f80fd5b612c99848285016141bc565b5f805f604084860312156143ea575f80fd5b833567ffffffffffffffff811115614400575f80fd5b61440c86828701613f49565b909790965060209590950135949350505050565b5f805f60408486031215614432575f80fd5b833567ffffffffffffffff811115614448575f80fd5b614454868287016142b5565b909450925050602084013561408081613f18565b5f60208284031215614478575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8281168282160390808211156144cd576144cd61447f565b5092915050565b5f82614507577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c9082168061452057607f821691505b602082108103614557577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6080828403121561459a575f80fd5b6145a26140ff565b823581526020830135602082015260408301356145be81614037565b60408201526060928301359281019290925250919050565b5f67ffffffffffffffff8083168181036145f2576145f261447f565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361462c5761462c61447f565b5060010190565b818103818111156146465761464661447f565b92915050565b80820281158282048414176146465761464661447f565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201525f6146c3604083018486614663565b95945050505050565b5f602082840312156146dc575f80fd5b8151613ee681614037565b5f602082840312156146f7575f80fd5b8151613ee681613eed565b5f60208284031215614712575f80fd5b815167ffffffffffffffff811115614728575f80fd5b8201601f81018413614738575f80fd5b80516147466141d982614177565b81815285602083850101111561475a575f80fd5b6146c3826020830160208601613e69565b5f806040838503121561477c575f80fd5b8251614787816140c1565b602084015190925061479881613f18565b809150509250929050565b601f821115613322575f81815260208120601f850160051c810160208610156147c95750805b601f850160051c820191505b818110156132bb578281556001016147d5565b815167ffffffffffffffff811115614802576148026140d2565b61481681614810845461450c565b846147a3565b602080601f831160018114614868575f84156148325750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556132bb565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156148b457888601518255948401946001909101908401614895565b50858210156148f057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f6149126060830186613e8b565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff8181168382160190808211156144cd576144cd61447f565b808201808211156146465761464661447f565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126149a4575f80fd5b9190910192915050565b5f608082360312156149be575f80fd5b6149c66140ff565b823567ffffffffffffffff8111156149dc575f80fd5b6149e8368286016141bc565b825250602083013560208201526040830135614a0381614037565b6040820152606092830135928101929092525090565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152614a6f60c0830184613e8b565b98975050505050505050565b61ffff8181168382160190808211156144cd576144cd61447f565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614afe816003860160208c01613e69565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614b41816017840160208b01613e69565b808201915050818660f81b16601782015284519150614b67826018830160208801613e69565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614be0816003860160208c01613e69565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614c23816017840160208b01613e69565b808201915050818660f01b16601782015284519150614c49826019830160208801613e69565b016019019998505050505050505050565b5f8651614c6b818460208b01613e69565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f614cf9606083018486614663565b9695505050505050565b5f82516149a4818460208701613e6956fea26469706673582212201281d4100452fbfedfff30c5ba9f475c64c3082f10f59c7afb3a0c4ed7777ac764736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/PolygonZkEVM.json b/compiled-contracts/PolygonZkEVM.json index 981bf9bf9..4e967a181 100644 --- a/compiled-contracts/PolygonZkEVM.json +++ b/compiled-contracts/PolygonZkEVM.json @@ -1711,8 +1711,8 @@ "type": "function" } ], - "bytecode": "0x61014060405234801562000011575f80fd5b5060405162005f6438038062005f648339810160408190526200003491620000a2565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b039182166101005216610120526200012a565b6001600160a01b038116811462000083575f80fd5b50565b80516001600160401b03811681146200009d575f80fd5b919050565b5f805f805f8060c08789031215620000b8575f80fd5b8651620000c5816200006e565b6020880151909650620000d8816200006e565b6040880151909550620000eb816200006e565b6060880151909450620000fe816200006e565b92506200010e6080880162000086565b91506200011e60a0880162000086565b90509295509295509295565b60805160a05160c05160e0516101005161012051615d74620001f05f395f818161068201528181610dd3015261311d01525f81816107ee0152610da901525f81816107b401528181611d60015281816137ae0152614c0001525f818161095901528181610f45015281816111100152818161196d0152818161212e0152818161398f01526146d801525f8181610a0601528181614041015261448f01525f81816108a901528181611d2e0152818161261301528181613964015261412d0152615d745ff3fe608060405234801561000f575f80fd5b50600436106103a9575f3560e01c8063841b24d7116101ea578063c754c7ed11610114578063e7a7ed02116100a9578063f14916d611610079578063f14916d614610a68578063f2fde38b14610a7b578063f851a44014610a8e578063f8b823e414610aae575f80fd5b8063e7a7ed02146109d1578063e8bf92ed14610a01578063eaeb077b14610a28578063ed6b010414610a3b575f80fd5b8063d2e129f9116100e4578063d2e129f91461097b578063d8d1091b1461098e578063d939b315146109a1578063dbc16976146109c9575f80fd5b8063c754c7ed146108e6578063c89e42df14610912578063cfa8ed4714610925578063d02103ca14610954575f80fd5b8063a3c573eb1161018a578063b4d63f581161015a578063b4d63f581461083e578063b6b0b097146108a4578063ba58ae39146108cb578063c0ed84e0146108de575f80fd5b8063a3c573eb146107af578063ada8f919146107d6578063adc879e9146107e9578063afd23cbe14610810575f80fd5b806399f5634e116101c557806399f5634e1461076e5780639aa972a3146107765780639c9f3dfe14610789578063a066215c1461079c575f80fd5b8063841b24d7146107185780638c3d7301146107485780638da5cb5b14610750575f80fd5b80634a1a89a7116102d6578063621dd4111161026b5780637215541a1161023b5780637215541a146106565780637fcb365314610669578063831c7ead1461067d578063837a4738146106a4575f80fd5b8063621dd411146106095780636b8616ce1461061c5780636ff512cc1461063b578063715018a61461064e575f80fd5b8063542028d5116102a6578063542028d5146105de5780635e9145c9146105e65780635ec91958146105f95780636046916914610601575f80fd5b80634a1a89a71461056b5780634a910e6a1461058b5780634e4877061461059e5780635392c5e0146105b1575f80fd5b8063298789831161034c578063394218e91161031c578063394218e9146104fc578063423fa8561461050f578063456052671461052f578063458c047714610557575f80fd5b806329878983146104975780632b0006fa146104c35780632c1f816a146104d6578063383b3be8146104e9575f80fd5b80631816b7e5116103875780631816b7e51461041657806319d8ac611461042b578063220d78991461043f5780632678224714610452575f80fd5b80630a0d9fbe146103ad578063107bf28c146103e457806315064c96146103f9575b5f80fd5b606f546103c690610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6103ec610ab7565b6040516103db919061521a565b606f546104069060ff1681565b60405190151581526020016103db565b610429610424366004615233565b610b43565b005b6073546103c69067ffffffffffffffff1681565b6103ec61044d36600461526b565b610c5b565b607b546104729073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103db565b6074546104729068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104296104d13660046152cb565b610e31565b6104296104e436600461532f565b610ffb565b6104066104f73660046153a4565b611203565b61042961050a3660046153a4565b611258565b6073546103c69068010000000000000000900467ffffffffffffffff1681565b6073546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546103c69067ffffffffffffffff1681565b6079546103c69068010000000000000000900467ffffffffffffffff1681565b6104296105993660046153a4565b6113dc565b6104296105ac3660046153a4565b61148f565b6105d06105bf3660046153a4565b60756020525f908152604090205481565b6040519081526020016103db565b6103ec611613565b6104296105f4366004615428565b611620565b610429611e19565b6105d0611f18565b6104296106173660046152cb565b611f2d565b6105d061062a3660046153a4565b60716020525f908152604090205481565b610429610649366004615478565b6122ab565b610429612380565b6104296106643660046153a4565b612393565b6074546103c69067ffffffffffffffff1681565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b6106ec6106b2366004615491565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016103db565b6079546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b610429612500565b60335473ffffffffffffffffffffffffffffffffffffffff16610472565b6105d06125cc565b61042961078436600461532f565b61271f565b6104296107973660046153a4565b6127cf565b6104296107aa3660046153a4565b61294b565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104296107e4366004615478565b612a51565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b606f5461082b906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103db565b61087e61084c3660046153a4565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016103db565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104066108d9366004615491565b612b15565b6103c6612b9d565b607b546103c69074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b61042961092036600461557c565b612bf0565b606f54610472906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104296109893660046155ec565b612c7d565b61042961099c366004615697565b6131c0565b6079546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b61042961375b565b6073546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b610429610a363660046156d6565b61382f565b607b54610406907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b610429610a76366004615478565b613c1f565b610429610a89366004615478565b613cf1565b607a546104729073ffffffffffffffffffffffffffffffffffffffff1681565b6105d060705481565b60778054610ac49061571e565b80601f0160208091040260200160405190810160405280929190818152602001828054610af09061571e565b8015610b3b5780601f10610b1257610100808354040283529160200191610b3b565b820191905f5260205f20905b815481529060010190602001808311610b1e57829003601f168201915b505050505081565b607a5473ffffffffffffffffffffffffffffffffffffffff163314610b94576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff161080610bad57506103ff8161ffff16115b15610be4576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590610c8e575081155b15610cc5576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610cfc576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d0584612b15565b610d3b576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610e8e576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e9c868686868686613da5565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615610f1657607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015610f9b575f80fd5b505af1158015610fad573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611058576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61106787878787878787614160565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156110e157607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611166575f80fd5b505af1158015611178573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611246927001000000000000000000000000000000009092048116911661579c565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146112a9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156112f0576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661135f5760795467ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169082161061135f576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610c50565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461148357606f5460ff1615611444576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61144d81611203565b611483576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61148c8161458f565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146114e0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611527576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661159257607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610611592576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001610c50565b60768054610ac49061571e565b606f5460ff161561165d576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146116bd576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f8190036116f8576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611734576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f81815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b86811015611b7c575f8a8a8381811061179a5761179a6157c4565b90506020028101906117ac91906157f1565b6117b59061582d565b8051805160209091012060608201519192509067ffffffffffffffff161561192a57856117e1816158b7565b9650505f818360200151846060015160405160200161183893929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f908152607190935291205490915081146118c0576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088165f908152607160205260408082209190915560608501519085015190821691161015611924576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611a64565b6020820151158015906119ee575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af11580156119c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ec91906158dd565b155b15611a25576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611a64576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080611a97575042826040015167ffffffffffffffff16115b15611ace576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151975050508080611b74906158f4565b91505061177f565b50611b87868561579c565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115611bf0576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611bfb828561592b565b611c0f9067ffffffffffffffff168861594c565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611d0457607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611d56333083607054611d17919061595f565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692919061479c565b611d5e61487e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611dc3575f80fd5b505af1158015611dd5573d5f803e3d5ffd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611e6a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16611ec6576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f6070546064611f28919061595f565b905090565b606f5460ff1615611f6a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f908152607260205260409020600101544292611fb69278010000000000000000000000000000000000000000000000009091048116911661579c565b67ffffffffffffffff161115611ff8576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612005868661592b565b67ffffffffffffffff161115612047576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612055868686868686613da5565b61205e8461492d565b607954700100000000000000000000000000000000900467ffffffffffffffff165f0361219f57607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156120ff57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612184575f80fd5b505af1158015612196573d5f803e3d5ffd5b5050505061226d565b6121a761487e565b6079805467ffffffffffffffff16905f6121c0836158b7565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001610feb565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146122fc576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c50565b612388614b07565b6123915f614b88565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146124f8575f6123bb612b9d565b90508067ffffffffffffffff168267ffffffffffffffff161161240a576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000009091048116908316118061244f575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15612486576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916124b49162093a80911661579c565b67ffffffffffffffff1611156124f6576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61148c614bfe565b607b5473ffffffffffffffffffffffffffffffffffffffff163314612551576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015612658573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061267c91906158dd565b90505f612687612b9d565b60735467ffffffffffffffff6801000000000000000082048116916126df917001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041661592b565b6126e9919061579c565b6126f3919061592b565b67ffffffffffffffff169050805f0361270e575f9250505090565b61271881836159a3565b9250505090565b606f5460ff161561275c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61276b87878787878787614160565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16127c6614bfe565b50505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612820576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115612867576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166128ce5760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106128ce576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461299c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156129e3576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612aa2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c50565b5f67ffffffff0000000167ffffffffffffffff8316108015612b4c575067ffffffff00000001604083901c67ffffffffffffffff16105b8015612b6d575067ffffffff00000001608083901c67ffffffffffffffff16105b8015612b84575067ffffffff0000000160c083901c105b15612b9157506001919050565b505f919050565b919050565b6079545f9067ffffffffffffffff1615612bdf575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612c41576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6076612c4d8282615a03565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c50919061521a565b5f54610100900460ff1615808015612c9b57505f54600160ff909116105b80612cb45750303b158015612cb457505f5460ff166001145b612d45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612da1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b612dae6020880188615478565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612e036040880160208901615478565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055612e686080880160608901615478565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076612ef28682615a03565b506077612eff8582615a03565b5062093a80612f146060890160408a016153a4565b67ffffffffffffffff161115612f56576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f6660608801604089016153a4565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80612fc860a0890160808a016153a4565b67ffffffffffffffff16111561300a576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61301a60a08801608089016153a4565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c01000000000006978000000000000000000000000000000000000000001790556130f9614c81565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f0000000000000000000000000000000000000000000000000000000000000000858560405161314e9493929190615b62565b60405180910390a180156127c6575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561321d576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff161561325a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613295576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156132d1576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff7801000000000000000000000000000000000000000000000000820481169161331c918491700100000000000000000000000000000000900416615b99565b1115613354576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b848110156135f9575f8787838181106133b2576133b26157c4565b90506020028101906133c49190615bac565b6133cd90615bde565b9050836133d9816158b7565b825180516020918201208185015160408087015190519499509194505f9361343a9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146134c2576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f908152607160205260408120556134e660018961594c565b84036135555742607b60149054906101000a900467ffffffffffffffff168460400151613513919061579c565b67ffffffffffffffff161115613555576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806135f1906158f4565b915050613397565b50613604848461579c565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146137ac576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613811575f80fd5b505af1158015613823573d5f803e3d5ffd5b50505050612391614d20565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561388c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16156138c9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6138d2611f18565b90508181111561390e576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138883111561394a576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61398c73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308461479c565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139f6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a1a91906158dd565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16906018613a54836158b7565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051613a8b929190615c57565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303613bb9576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613c18565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613c0f9493929190615c66565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613c70576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610c50565b613cf9614b07565b73ffffffffffffffffffffffffffffffffffffffff8116613d9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401612d3c565b61148c81614b88565b5f80613daf612b9d565b905067ffffffffffffffff881615613e7e5760795467ffffffffffffffff9081169089161115613e0b576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614613e78576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50613f1e565b67ffffffffffffffff87165f90815260756020526040902054915081613ed0576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115613f1e576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611613f6b576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613f798888888689610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051613fad9190615c9b565b602060405180830381855afa158015613fc8573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613feb91906158dd565b613ff59190615cac565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161407791899190600401615cbf565b602060405180830381865afa158015614092573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140b69190615cf9565b6140ec576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614154336140fa858b61592b565b67ffffffffffffffff1661410c6125cc565b614116919061595f565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190614dae565b50505050505050505050565b5f67ffffffffffffffff88161561422c5760795467ffffffffffffffff90811690891611156141bb576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614614226576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506142c7565b5067ffffffffffffffff85165f908152607560205260409020548061427d576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff90811690871611156142c7576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff90811690881611806142f957508767ffffffffffffffff168767ffffffffffffffff1611155b80614320575060795467ffffffffffffffff68010000000000000000909104811690881611155b15614357576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f908152607860205260409020546801000000000000000090048116908616146143b9576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6143c78787878588610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516143fb9190615c9b565b602060405180830381855afa158015614416573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061443991906158dd565b6144439190615cac565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916144c591889190600401615cbf565b602060405180830381865afa1580156144e0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145049190615cf9565b61453a576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614154576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff6801000000000000000090910481169082161115806145c9575060795467ffffffffffffffff908116908216115b15614600576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b15801561472e575f80fd5b505af1158015614740573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161478f91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526148789085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614e09565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115612391576079545f906148c69068010000000000000000900467ffffffffffffffff16600161579c565b90506148d181611203565b1561148c576079545f906002906148f390849067ffffffffffffffff1661592b565b6148fd9190615d18565b614907908361579c565b905061491281611203565b15614924576149208161458f565b5050565b6149208261458f565b5f614936612b9d565b9050815f80614945848461592b565b606f5467ffffffffffffffff91821692505f91614968916101009004164261594c565b90505b8467ffffffffffffffff168467ffffffffffffffff16146149f25767ffffffffffffffff8085165f90815260726020526040902060018101549091168210156149d057600181015468010000000000000000900467ffffffffffffffff1694506149ec565b6149da868661592b565b67ffffffffffffffff169350506149f2565b5061496b565b5f6149fd848461594c565b905083811015614a5457808403600c8111614a185780614a1b565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281614a4a57614a4a615976565b0460705550614ac3565b838103600c8111614a655780614a68565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a76400000281614a9e57614a9e615976565b04905080607054670de0b6b3a76400000281614abc57614abc615976565b0460705550505b683635c9adc5dea000006070541115614ae857683635c9adc5dea000006070556127c6565b633b9aca0060705410156127c657633b9aca0060705550505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314612391576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612d3c565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015614c63575f80fd5b505af1158015614c75573d5f803e3d5ffd5b50505050612391614f14565b5f54610100900460ff16614d17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401612d3c565b61239133614b88565b606f5460ff16614d5c576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052614e049084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016147f6565b505050565b5f614e6a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16614fa69092919063ffffffff16565b805190915015614e045780806020019051810190614e889190615cf9565b614e04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401612d3c565b606f5460ff1615614f51576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b6060614fb484845f85614fbc565b949350505050565b60608247101561504e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401612d3c565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516150769190615c9b565b5f6040518083038185875af1925050503d805f81146150b0576040519150601f19603f3d011682016040523d82523d5f602084013e6150b5565b606091505b50915091506150c6878383876150d1565b979650505050505050565b606083156151665782515f0361515f5773ffffffffffffffffffffffffffffffffffffffff85163b61515f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612d3c565b5081614fb4565b614fb4838381511561517b5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3c919061521a565b5f5b838110156151c95781810151838201526020016151b1565b50505f910152565b5f81518084526151e88160208601602086016151af565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61522c60208301846151d1565b9392505050565b5f60208284031215615243575f80fd5b813561ffff8116811461522c575f80fd5b803567ffffffffffffffff81168114612b98575f80fd5b5f805f805f60a0868803121561527f575f80fd5b61528886615254565b945061529660208701615254565b94979496505050506040830135926060810135926080909101359150565b8061030081018310156152c5575f80fd5b92915050565b5f805f805f806103a087890312156152e1575f80fd5b6152ea87615254565b95506152f860208801615254565b945061530660408801615254565b935060608701359250608087013591506153238860a089016152b4565b90509295509295509295565b5f805f805f805f6103c0888a031215615346575f80fd5b61534f88615254565b965061535d60208901615254565b955061536b60408901615254565b945061537960608901615254565b93506080880135925060a088013591506153968960c08a016152b4565b905092959891949750929550565b5f602082840312156153b4575f80fd5b61522c82615254565b5f8083601f8401126153cd575f80fd5b50813567ffffffffffffffff8111156153e4575f80fd5b6020830191508360208260051b85010111156153fe575f80fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612b98575f80fd5b5f805f6040848603121561543a575f80fd5b833567ffffffffffffffff811115615450575f80fd5b61545c868287016153bd565b909450925061546f905060208501615405565b90509250925092565b5f60208284031215615488575f80fd5b61522c82615405565b5f602082840312156154a1575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126154e4575f80fd5b813567ffffffffffffffff808211156154ff576154ff6154a8565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715615545576155456154a8565b8160405283815286602085880101111561555d575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6020828403121561558c575f80fd5b813567ffffffffffffffff8111156155a2575f80fd5b614fb4848285016154d5565b5f8083601f8401126155be575f80fd5b50813567ffffffffffffffff8111156155d5575f80fd5b6020830191508360208285010111156153fe575f80fd5b5f805f805f80868803610120811215615603575f80fd5b60a0811215615610575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff80821115615635575f80fd5b6156418a838b016154d5565b955060e0890135915080821115615656575f80fd5b6156628a838b016154d5565b9450610100890135915080821115615678575f80fd5b5061568589828a016155ae565b979a9699509497509295939492505050565b5f80602083850312156156a8575f80fd5b823567ffffffffffffffff8111156156be575f80fd5b6156ca858286016153bd565b90969095509350505050565b5f805f604084860312156156e8575f80fd5b833567ffffffffffffffff8111156156fe575f80fd5b61570a868287016155ae565b909790965060209590950135949350505050565b600181811c9082168061573257607f821691505b602082108103615769577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156157bd576157bd61576f565b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112615823575f80fd5b9190910192915050565b5f6080823603121561583d575f80fd5b6040516080810167ffffffffffffffff8282108183111715615861576158616154a8565b816040528435915080821115615875575f80fd5b50615882368286016154d5565b8252506020830135602082015261589b60408401615254565b60408201526158ac60608401615254565b606082015292915050565b5f67ffffffffffffffff8083168181036158d3576158d361576f565b6001019392505050565b5f602082840312156158ed575f80fd5b5051919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036159245761592461576f565b5060010190565b67ffffffffffffffff8281168282160390808211156157bd576157bd61576f565b818103818111156152c5576152c561576f565b80820281158282048414176152c5576152c561576f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f826159b1576159b1615976565b500490565b601f821115614e04575f81815260208120601f850160051c810160208610156159dc5750805b601f850160051c820191505b818110156159fb578281556001016159e8565b505050505050565b815167ffffffffffffffff811115615a1d57615a1d6154a8565b615a3181615a2b845461571e565b846159b6565b602080601f831160018114615a83575f8415615a4d5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556159fb565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615acf57888601518255948401946001909101908401615ab0565b5085821015615b0b57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152615b8f606083018486615b1b565b9695505050505050565b808201808211156152c5576152c561576f565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112615823575f80fd5b5f60608236031215615bee575f80fd5b6040516060810167ffffffffffffffff8282108183111715615c1257615c126154a8565b816040528435915080821115615c26575f80fd5b50615c33368286016154d5565b82525060208301356020820152615c4c60408401615254565b604082015292915050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f615b8f606083018486615b1b565b5f82516158238184602087016151af565b5f82615cba57615cba615976565b500690565b6103208101610300808584378201835f5b6001811015615cef578151835260209283019290910190600101615cd0565b5050509392505050565b5f60208284031215615d09575f80fd5b8151801515811461522c575f80fd5b5f67ffffffffffffffff80841680615d3257615d32615976565b9216919091049291505056fea2646970667358221220a50e6fa85418d984e88c8f7daf5faf4ee5e483c8bc96c6d92f33fe24b3cf94f764736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106103a9575f3560e01c8063841b24d7116101ea578063c754c7ed11610114578063e7a7ed02116100a9578063f14916d611610079578063f14916d614610a68578063f2fde38b14610a7b578063f851a44014610a8e578063f8b823e414610aae575f80fd5b8063e7a7ed02146109d1578063e8bf92ed14610a01578063eaeb077b14610a28578063ed6b010414610a3b575f80fd5b8063d2e129f9116100e4578063d2e129f91461097b578063d8d1091b1461098e578063d939b315146109a1578063dbc16976146109c9575f80fd5b8063c754c7ed146108e6578063c89e42df14610912578063cfa8ed4714610925578063d02103ca14610954575f80fd5b8063a3c573eb1161018a578063b4d63f581161015a578063b4d63f581461083e578063b6b0b097146108a4578063ba58ae39146108cb578063c0ed84e0146108de575f80fd5b8063a3c573eb146107af578063ada8f919146107d6578063adc879e9146107e9578063afd23cbe14610810575f80fd5b806399f5634e116101c557806399f5634e1461076e5780639aa972a3146107765780639c9f3dfe14610789578063a066215c1461079c575f80fd5b8063841b24d7146107185780638c3d7301146107485780638da5cb5b14610750575f80fd5b80634a1a89a7116102d6578063621dd4111161026b5780637215541a1161023b5780637215541a146106565780637fcb365314610669578063831c7ead1461067d578063837a4738146106a4575f80fd5b8063621dd411146106095780636b8616ce1461061c5780636ff512cc1461063b578063715018a61461064e575f80fd5b8063542028d5116102a6578063542028d5146105de5780635e9145c9146105e65780635ec91958146105f95780636046916914610601575f80fd5b80634a1a89a71461056b5780634a910e6a1461058b5780634e4877061461059e5780635392c5e0146105b1575f80fd5b8063298789831161034c578063394218e91161031c578063394218e9146104fc578063423fa8561461050f578063456052671461052f578063458c047714610557575f80fd5b806329878983146104975780632b0006fa146104c35780632c1f816a146104d6578063383b3be8146104e9575f80fd5b80631816b7e5116103875780631816b7e51461041657806319d8ac611461042b578063220d78991461043f5780632678224714610452575f80fd5b80630a0d9fbe146103ad578063107bf28c146103e457806315064c96146103f9575b5f80fd5b606f546103c690610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6103ec610ab7565b6040516103db919061521a565b606f546104069060ff1681565b60405190151581526020016103db565b610429610424366004615233565b610b43565b005b6073546103c69067ffffffffffffffff1681565b6103ec61044d36600461526b565b610c5b565b607b546104729073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103db565b6074546104729068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104296104d13660046152cb565b610e31565b6104296104e436600461532f565b610ffb565b6104066104f73660046153a4565b611203565b61042961050a3660046153a4565b611258565b6073546103c69068010000000000000000900467ffffffffffffffff1681565b6073546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546103c69067ffffffffffffffff1681565b6079546103c69068010000000000000000900467ffffffffffffffff1681565b6104296105993660046153a4565b6113dc565b6104296105ac3660046153a4565b61148f565b6105d06105bf3660046153a4565b60756020525f908152604090205481565b6040519081526020016103db565b6103ec611613565b6104296105f4366004615428565b611620565b610429611e19565b6105d0611f18565b6104296106173660046152cb565b611f2d565b6105d061062a3660046153a4565b60716020525f908152604090205481565b610429610649366004615478565b6122ab565b610429612380565b6104296106643660046153a4565b612393565b6074546103c69067ffffffffffffffff1681565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b6106ec6106b2366004615491565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016103db565b6079546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b610429612500565b60335473ffffffffffffffffffffffffffffffffffffffff16610472565b6105d06125cc565b61042961078436600461532f565b61271f565b6104296107973660046153a4565b6127cf565b6104296107aa3660046153a4565b61294b565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104296107e4366004615478565b612a51565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b606f5461082b906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103db565b61087e61084c3660046153a4565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016103db565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104066108d9366004615491565b612b15565b6103c6612b9d565b607b546103c69074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b61042961092036600461557c565b612bf0565b606f54610472906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104296109893660046155ec565b612c7d565b61042961099c366004615697565b6131c0565b6079546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b61042961375b565b6073546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b610429610a363660046156d6565b61382f565b607b54610406907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b610429610a76366004615478565b613c1f565b610429610a89366004615478565b613cf1565b607a546104729073ffffffffffffffffffffffffffffffffffffffff1681565b6105d060705481565b60778054610ac49061571e565b80601f0160208091040260200160405190810160405280929190818152602001828054610af09061571e565b8015610b3b5780601f10610b1257610100808354040283529160200191610b3b565b820191905f5260205f20905b815481529060010190602001808311610b1e57829003601f168201915b505050505081565b607a5473ffffffffffffffffffffffffffffffffffffffff163314610b94576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff161080610bad57506103ff8161ffff16115b15610be4576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590610c8e575081155b15610cc5576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610cfc576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d0584612b15565b610d3b576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610e8e576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e9c868686868686613da5565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615610f1657607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015610f9b575f80fd5b505af1158015610fad573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611058576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61106787878787878787614160565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156110e157607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611166575f80fd5b505af1158015611178573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611246927001000000000000000000000000000000009092048116911661579c565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146112a9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156112f0576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661135f5760795467ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169082161061135f576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610c50565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461148357606f5460ff1615611444576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61144d81611203565b611483576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61148c8161458f565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146114e0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611527576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661159257607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610611592576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001610c50565b60768054610ac49061571e565b606f5460ff161561165d576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146116bd576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f8190036116f8576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611734576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f81815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b86811015611b7c575f8a8a8381811061179a5761179a6157c4565b90506020028101906117ac91906157f1565b6117b59061582d565b8051805160209091012060608201519192509067ffffffffffffffff161561192a57856117e1816158b7565b9650505f818360200151846060015160405160200161183893929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f908152607190935291205490915081146118c0576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088165f908152607160205260408082209190915560608501519085015190821691161015611924576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611a64565b6020820151158015906119ee575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af11580156119c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ec91906158dd565b155b15611a25576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611a64576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080611a97575042826040015167ffffffffffffffff16115b15611ace576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151975050508080611b74906158f4565b91505061177f565b50611b87868561579c565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115611bf0576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611bfb828561592b565b611c0f9067ffffffffffffffff168861594c565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611d0457607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611d56333083607054611d17919061595f565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692919061479c565b611d5e61487e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611dc3575f80fd5b505af1158015611dd5573d5f803e3d5ffd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611e6a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16611ec6576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f6070546064611f28919061595f565b905090565b606f5460ff1615611f6a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f908152607260205260409020600101544292611fb69278010000000000000000000000000000000000000000000000009091048116911661579c565b67ffffffffffffffff161115611ff8576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612005868661592b565b67ffffffffffffffff161115612047576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612055868686868686613da5565b61205e8461492d565b607954700100000000000000000000000000000000900467ffffffffffffffff165f0361219f57607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156120ff57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612184575f80fd5b505af1158015612196573d5f803e3d5ffd5b5050505061226d565b6121a761487e565b6079805467ffffffffffffffff16905f6121c0836158b7565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001610feb565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146122fc576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c50565b612388614b07565b6123915f614b88565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146124f8575f6123bb612b9d565b90508067ffffffffffffffff168267ffffffffffffffff161161240a576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000009091048116908316118061244f575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15612486576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916124b49162093a80911661579c565b67ffffffffffffffff1611156124f6576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61148c614bfe565b607b5473ffffffffffffffffffffffffffffffffffffffff163314612551576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015612658573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061267c91906158dd565b90505f612687612b9d565b60735467ffffffffffffffff6801000000000000000082048116916126df917001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041661592b565b6126e9919061579c565b6126f3919061592b565b67ffffffffffffffff169050805f0361270e575f9250505090565b61271881836159a3565b9250505090565b606f5460ff161561275c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61276b87878787878787614160565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16127c6614bfe565b50505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612820576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115612867576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166128ce5760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106128ce576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461299c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156129e3576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612aa2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c50565b5f67ffffffff0000000167ffffffffffffffff8316108015612b4c575067ffffffff00000001604083901c67ffffffffffffffff16105b8015612b6d575067ffffffff00000001608083901c67ffffffffffffffff16105b8015612b84575067ffffffff0000000160c083901c105b15612b9157506001919050565b505f919050565b919050565b6079545f9067ffffffffffffffff1615612bdf575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612c41576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6076612c4d8282615a03565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c50919061521a565b5f54610100900460ff1615808015612c9b57505f54600160ff909116105b80612cb45750303b158015612cb457505f5460ff166001145b612d45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612da1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b612dae6020880188615478565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612e036040880160208901615478565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055612e686080880160608901615478565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076612ef28682615a03565b506077612eff8582615a03565b5062093a80612f146060890160408a016153a4565b67ffffffffffffffff161115612f56576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f6660608801604089016153a4565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80612fc860a0890160808a016153a4565b67ffffffffffffffff16111561300a576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61301a60a08801608089016153a4565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c01000000000006978000000000000000000000000000000000000000001790556130f9614c81565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f0000000000000000000000000000000000000000000000000000000000000000858560405161314e9493929190615b62565b60405180910390a180156127c6575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561321d576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff161561325a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613295576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156132d1576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff7801000000000000000000000000000000000000000000000000820481169161331c918491700100000000000000000000000000000000900416615b99565b1115613354576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b848110156135f9575f8787838181106133b2576133b26157c4565b90506020028101906133c49190615bac565b6133cd90615bde565b9050836133d9816158b7565b825180516020918201208185015160408087015190519499509194505f9361343a9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146134c2576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f908152607160205260408120556134e660018961594c565b84036135555742607b60149054906101000a900467ffffffffffffffff168460400151613513919061579c565b67ffffffffffffffff161115613555576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806135f1906158f4565b915050613397565b50613604848461579c565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146137ac576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613811575f80fd5b505af1158015613823573d5f803e3d5ffd5b50505050612391614d20565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561388c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16156138c9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6138d2611f18565b90508181111561390e576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138883111561394a576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61398c73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308461479c565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139f6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a1a91906158dd565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16906018613a54836158b7565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051613a8b929190615c57565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303613bb9576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613c18565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613c0f9493929190615c66565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613c70576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610c50565b613cf9614b07565b73ffffffffffffffffffffffffffffffffffffffff8116613d9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401612d3c565b61148c81614b88565b5f80613daf612b9d565b905067ffffffffffffffff881615613e7e5760795467ffffffffffffffff9081169089161115613e0b576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614613e78576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50613f1e565b67ffffffffffffffff87165f90815260756020526040902054915081613ed0576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115613f1e576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611613f6b576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613f798888888689610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051613fad9190615c9b565b602060405180830381855afa158015613fc8573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613feb91906158dd565b613ff59190615cac565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161407791899190600401615cbf565b602060405180830381865afa158015614092573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140b69190615cf9565b6140ec576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614154336140fa858b61592b565b67ffffffffffffffff1661410c6125cc565b614116919061595f565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190614dae565b50505050505050505050565b5f67ffffffffffffffff88161561422c5760795467ffffffffffffffff90811690891611156141bb576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614614226576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506142c7565b5067ffffffffffffffff85165f908152607560205260409020548061427d576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff90811690871611156142c7576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff90811690881611806142f957508767ffffffffffffffff168767ffffffffffffffff1611155b80614320575060795467ffffffffffffffff68010000000000000000909104811690881611155b15614357576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f908152607860205260409020546801000000000000000090048116908616146143b9576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6143c78787878588610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516143fb9190615c9b565b602060405180830381855afa158015614416573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061443991906158dd565b6144439190615cac565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916144c591889190600401615cbf565b602060405180830381865afa1580156144e0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145049190615cf9565b61453a576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614154576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff6801000000000000000090910481169082161115806145c9575060795467ffffffffffffffff908116908216115b15614600576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b15801561472e575f80fd5b505af1158015614740573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161478f91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526148789085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614e09565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115612391576079545f906148c69068010000000000000000900467ffffffffffffffff16600161579c565b90506148d181611203565b1561148c576079545f906002906148f390849067ffffffffffffffff1661592b565b6148fd9190615d18565b614907908361579c565b905061491281611203565b15614924576149208161458f565b5050565b6149208261458f565b5f614936612b9d565b9050815f80614945848461592b565b606f5467ffffffffffffffff91821692505f91614968916101009004164261594c565b90505b8467ffffffffffffffff168467ffffffffffffffff16146149f25767ffffffffffffffff8085165f90815260726020526040902060018101549091168210156149d057600181015468010000000000000000900467ffffffffffffffff1694506149ec565b6149da868661592b565b67ffffffffffffffff169350506149f2565b5061496b565b5f6149fd848461594c565b905083811015614a5457808403600c8111614a185780614a1b565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281614a4a57614a4a615976565b0460705550614ac3565b838103600c8111614a655780614a68565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a76400000281614a9e57614a9e615976565b04905080607054670de0b6b3a76400000281614abc57614abc615976565b0460705550505b683635c9adc5dea000006070541115614ae857683635c9adc5dea000006070556127c6565b633b9aca0060705410156127c657633b9aca0060705550505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314612391576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612d3c565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015614c63575f80fd5b505af1158015614c75573d5f803e3d5ffd5b50505050612391614f14565b5f54610100900460ff16614d17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401612d3c565b61239133614b88565b606f5460ff16614d5c576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052614e049084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016147f6565b505050565b5f614e6a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16614fa69092919063ffffffff16565b805190915015614e045780806020019051810190614e889190615cf9565b614e04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401612d3c565b606f5460ff1615614f51576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b6060614fb484845f85614fbc565b949350505050565b60608247101561504e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401612d3c565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516150769190615c9b565b5f6040518083038185875af1925050503d805f81146150b0576040519150601f19603f3d011682016040523d82523d5f602084013e6150b5565b606091505b50915091506150c6878383876150d1565b979650505050505050565b606083156151665782515f0361515f5773ffffffffffffffffffffffffffffffffffffffff85163b61515f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612d3c565b5081614fb4565b614fb4838381511561517b5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3c919061521a565b5f5b838110156151c95781810151838201526020016151b1565b50505f910152565b5f81518084526151e88160208601602086016151af565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61522c60208301846151d1565b9392505050565b5f60208284031215615243575f80fd5b813561ffff8116811461522c575f80fd5b803567ffffffffffffffff81168114612b98575f80fd5b5f805f805f60a0868803121561527f575f80fd5b61528886615254565b945061529660208701615254565b94979496505050506040830135926060810135926080909101359150565b8061030081018310156152c5575f80fd5b92915050565b5f805f805f806103a087890312156152e1575f80fd5b6152ea87615254565b95506152f860208801615254565b945061530660408801615254565b935060608701359250608087013591506153238860a089016152b4565b90509295509295509295565b5f805f805f805f6103c0888a031215615346575f80fd5b61534f88615254565b965061535d60208901615254565b955061536b60408901615254565b945061537960608901615254565b93506080880135925060a088013591506153968960c08a016152b4565b905092959891949750929550565b5f602082840312156153b4575f80fd5b61522c82615254565b5f8083601f8401126153cd575f80fd5b50813567ffffffffffffffff8111156153e4575f80fd5b6020830191508360208260051b85010111156153fe575f80fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612b98575f80fd5b5f805f6040848603121561543a575f80fd5b833567ffffffffffffffff811115615450575f80fd5b61545c868287016153bd565b909450925061546f905060208501615405565b90509250925092565b5f60208284031215615488575f80fd5b61522c82615405565b5f602082840312156154a1575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126154e4575f80fd5b813567ffffffffffffffff808211156154ff576154ff6154a8565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715615545576155456154a8565b8160405283815286602085880101111561555d575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6020828403121561558c575f80fd5b813567ffffffffffffffff8111156155a2575f80fd5b614fb4848285016154d5565b5f8083601f8401126155be575f80fd5b50813567ffffffffffffffff8111156155d5575f80fd5b6020830191508360208285010111156153fe575f80fd5b5f805f805f80868803610120811215615603575f80fd5b60a0811215615610575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff80821115615635575f80fd5b6156418a838b016154d5565b955060e0890135915080821115615656575f80fd5b6156628a838b016154d5565b9450610100890135915080821115615678575f80fd5b5061568589828a016155ae565b979a9699509497509295939492505050565b5f80602083850312156156a8575f80fd5b823567ffffffffffffffff8111156156be575f80fd5b6156ca858286016153bd565b90969095509350505050565b5f805f604084860312156156e8575f80fd5b833567ffffffffffffffff8111156156fe575f80fd5b61570a868287016155ae565b909790965060209590950135949350505050565b600181811c9082168061573257607f821691505b602082108103615769577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156157bd576157bd61576f565b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112615823575f80fd5b9190910192915050565b5f6080823603121561583d575f80fd5b6040516080810167ffffffffffffffff8282108183111715615861576158616154a8565b816040528435915080821115615875575f80fd5b50615882368286016154d5565b8252506020830135602082015261589b60408401615254565b60408201526158ac60608401615254565b606082015292915050565b5f67ffffffffffffffff8083168181036158d3576158d361576f565b6001019392505050565b5f602082840312156158ed575f80fd5b5051919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036159245761592461576f565b5060010190565b67ffffffffffffffff8281168282160390808211156157bd576157bd61576f565b818103818111156152c5576152c561576f565b80820281158282048414176152c5576152c561576f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f826159b1576159b1615976565b500490565b601f821115614e04575f81815260208120601f850160051c810160208610156159dc5750805b601f850160051c820191505b818110156159fb578281556001016159e8565b505050505050565b815167ffffffffffffffff811115615a1d57615a1d6154a8565b615a3181615a2b845461571e565b846159b6565b602080601f831160018114615a83575f8415615a4d5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556159fb565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615acf57888601518255948401946001909101908401615ab0565b5085821015615b0b57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152615b8f606083018486615b1b565b9695505050505050565b808201808211156152c5576152c561576f565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112615823575f80fd5b5f60608236031215615bee575f80fd5b6040516060810167ffffffffffffffff8282108183111715615c1257615c126154a8565b816040528435915080821115615c26575f80fd5b50615c33368286016154d5565b82525060208301356020820152615c4c60408401615254565b604082015292915050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f615b8f606083018486615b1b565b5f82516158238184602087016151af565b5f82615cba57615cba615976565b500690565b6103208101610300808584378201835f5b6001811015615cef578151835260209283019290910190600101615cd0565b5050509392505050565b5f60208284031215615d09575f80fd5b8151801515811461522c575f80fd5b5f67ffffffffffffffff80841680615d3257615d32615976565b9216919091049291505056fea2646970667358221220a50e6fa85418d984e88c8f7daf5faf4ee5e483c8bc96c6d92f33fe24b3cf94f764736f6c63430008140033", + "bytecode": "0x61014060405234801562000011575f80fd5b5060405162005f6438038062005f648339810160408190526200003491620000a2565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b039182166101005216610120526200012a565b6001600160a01b038116811462000083575f80fd5b50565b80516001600160401b03811681146200009d575f80fd5b919050565b5f805f805f8060c08789031215620000b8575f80fd5b8651620000c5816200006e565b6020880151909650620000d8816200006e565b6040880151909550620000eb816200006e565b6060880151909450620000fe816200006e565b92506200010e6080880162000086565b91506200011e60a0880162000086565b90509295509295509295565b60805160a05160c05160e0516101005161012051615d74620001f05f395f818161068201528181610dd3015261311d01525f81816107ee0152610da901525f81816107b401528181611d60015281816137ae0152614c0001525f818161095901528181610f45015281816111100152818161196d0152818161212e0152818161398f01526146d801525f8181610a0601528181614041015261448f01525f81816108a901528181611d2e0152818161261301528181613964015261412d0152615d745ff3fe608060405234801561000f575f80fd5b50600436106103a9575f3560e01c8063841b24d7116101ea578063c754c7ed11610114578063e7a7ed02116100a9578063f14916d611610079578063f14916d614610a68578063f2fde38b14610a7b578063f851a44014610a8e578063f8b823e414610aae575f80fd5b8063e7a7ed02146109d1578063e8bf92ed14610a01578063eaeb077b14610a28578063ed6b010414610a3b575f80fd5b8063d2e129f9116100e4578063d2e129f91461097b578063d8d1091b1461098e578063d939b315146109a1578063dbc16976146109c9575f80fd5b8063c754c7ed146108e6578063c89e42df14610912578063cfa8ed4714610925578063d02103ca14610954575f80fd5b8063a3c573eb1161018a578063b4d63f581161015a578063b4d63f581461083e578063b6b0b097146108a4578063ba58ae39146108cb578063c0ed84e0146108de575f80fd5b8063a3c573eb146107af578063ada8f919146107d6578063adc879e9146107e9578063afd23cbe14610810575f80fd5b806399f5634e116101c557806399f5634e1461076e5780639aa972a3146107765780639c9f3dfe14610789578063a066215c1461079c575f80fd5b8063841b24d7146107185780638c3d7301146107485780638da5cb5b14610750575f80fd5b80634a1a89a7116102d6578063621dd4111161026b5780637215541a1161023b5780637215541a146106565780637fcb365314610669578063831c7ead1461067d578063837a4738146106a4575f80fd5b8063621dd411146106095780636b8616ce1461061c5780636ff512cc1461063b578063715018a61461064e575f80fd5b8063542028d5116102a6578063542028d5146105de5780635e9145c9146105e65780635ec91958146105f95780636046916914610601575f80fd5b80634a1a89a71461056b5780634a910e6a1461058b5780634e4877061461059e5780635392c5e0146105b1575f80fd5b8063298789831161034c578063394218e91161031c578063394218e9146104fc578063423fa8561461050f578063456052671461052f578063458c047714610557575f80fd5b806329878983146104975780632b0006fa146104c35780632c1f816a146104d6578063383b3be8146104e9575f80fd5b80631816b7e5116103875780631816b7e51461041657806319d8ac611461042b578063220d78991461043f5780632678224714610452575f80fd5b80630a0d9fbe146103ad578063107bf28c146103e457806315064c96146103f9575b5f80fd5b606f546103c690610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6103ec610ab7565b6040516103db919061521a565b606f546104069060ff1681565b60405190151581526020016103db565b610429610424366004615233565b610b43565b005b6073546103c69067ffffffffffffffff1681565b6103ec61044d36600461526b565b610c5b565b607b546104729073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103db565b6074546104729068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104296104d13660046152cb565b610e31565b6104296104e436600461532f565b610ffb565b6104066104f73660046153a4565b611203565b61042961050a3660046153a4565b611258565b6073546103c69068010000000000000000900467ffffffffffffffff1681565b6073546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546103c69067ffffffffffffffff1681565b6079546103c69068010000000000000000900467ffffffffffffffff1681565b6104296105993660046153a4565b6113dc565b6104296105ac3660046153a4565b61148f565b6105d06105bf3660046153a4565b60756020525f908152604090205481565b6040519081526020016103db565b6103ec611613565b6104296105f4366004615428565b611620565b610429611e19565b6105d0611f18565b6104296106173660046152cb565b611f2d565b6105d061062a3660046153a4565b60716020525f908152604090205481565b610429610649366004615478565b6122ab565b610429612380565b6104296106643660046153a4565b612393565b6074546103c69067ffffffffffffffff1681565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b6106ec6106b2366004615491565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016103db565b6079546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b610429612500565b60335473ffffffffffffffffffffffffffffffffffffffff16610472565b6105d06125cc565b61042961078436600461532f565b61271f565b6104296107973660046153a4565b6127cf565b6104296107aa3660046153a4565b61294b565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104296107e4366004615478565b612a51565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b606f5461082b906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103db565b61087e61084c3660046153a4565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016103db565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104066108d9366004615491565b612b15565b6103c6612b9d565b607b546103c69074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b61042961092036600461557c565b612bf0565b606f54610472906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104296109893660046155ec565b612c7d565b61042961099c366004615697565b6131c0565b6079546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b61042961375b565b6073546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b610429610a363660046156d6565b61382f565b607b54610406907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b610429610a76366004615478565b613c1f565b610429610a89366004615478565b613cf1565b607a546104729073ffffffffffffffffffffffffffffffffffffffff1681565b6105d060705481565b60778054610ac49061571e565b80601f0160208091040260200160405190810160405280929190818152602001828054610af09061571e565b8015610b3b5780601f10610b1257610100808354040283529160200191610b3b565b820191905f5260205f20905b815481529060010190602001808311610b1e57829003601f168201915b505050505081565b607a5473ffffffffffffffffffffffffffffffffffffffff163314610b94576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff161080610bad57506103ff8161ffff16115b15610be4576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590610c8e575081155b15610cc5576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610cfc576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d0584612b15565b610d3b576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610e8e576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e9c868686868686613da5565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615610f1657607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015610f9b575f80fd5b505af1158015610fad573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611058576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61106787878787878787614160565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156110e157607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611166575f80fd5b505af1158015611178573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611246927001000000000000000000000000000000009092048116911661579c565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146112a9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156112f0576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661135f5760795467ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169082161061135f576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610c50565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461148357606f5460ff1615611444576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61144d81611203565b611483576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61148c8161458f565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146114e0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611527576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661159257607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610611592576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001610c50565b60768054610ac49061571e565b606f5460ff161561165d576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146116bd576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f8190036116f8576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611734576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f81815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b86811015611b7c575f8a8a8381811061179a5761179a6157c4565b90506020028101906117ac91906157f1565b6117b59061582d565b8051805160209091012060608201519192509067ffffffffffffffff161561192a57856117e1816158b7565b9650505f818360200151846060015160405160200161183893929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f908152607190935291205490915081146118c0576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088165f908152607160205260408082209190915560608501519085015190821691161015611924576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611a64565b6020820151158015906119ee575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af11580156119c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ec91906158dd565b155b15611a25576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611a64576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080611a97575042826040015167ffffffffffffffff16115b15611ace576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151975050508080611b74906158f4565b91505061177f565b50611b87868561579c565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115611bf0576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611bfb828561592b565b611c0f9067ffffffffffffffff168861594c565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611d0457607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611d56333083607054611d17919061595f565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692919061479c565b611d5e61487e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611dc3575f80fd5b505af1158015611dd5573d5f803e3d5ffd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611e6a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16611ec6576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f6070546064611f28919061595f565b905090565b606f5460ff1615611f6a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f908152607260205260409020600101544292611fb69278010000000000000000000000000000000000000000000000009091048116911661579c565b67ffffffffffffffff161115611ff8576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612005868661592b565b67ffffffffffffffff161115612047576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612055868686868686613da5565b61205e8461492d565b607954700100000000000000000000000000000000900467ffffffffffffffff165f0361219f57607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156120ff57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612184575f80fd5b505af1158015612196573d5f803e3d5ffd5b5050505061226d565b6121a761487e565b6079805467ffffffffffffffff16905f6121c0836158b7565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001610feb565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146122fc576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c50565b612388614b07565b6123915f614b88565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146124f8575f6123bb612b9d565b90508067ffffffffffffffff168267ffffffffffffffff161161240a576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000009091048116908316118061244f575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15612486576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916124b49162093a80911661579c565b67ffffffffffffffff1611156124f6576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61148c614bfe565b607b5473ffffffffffffffffffffffffffffffffffffffff163314612551576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015612658573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061267c91906158dd565b90505f612687612b9d565b60735467ffffffffffffffff6801000000000000000082048116916126df917001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041661592b565b6126e9919061579c565b6126f3919061592b565b67ffffffffffffffff169050805f0361270e575f9250505090565b61271881836159a3565b9250505090565b606f5460ff161561275c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61276b87878787878787614160565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16127c6614bfe565b50505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612820576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115612867576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166128ce5760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106128ce576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461299c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156129e3576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612aa2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c50565b5f67ffffffff0000000167ffffffffffffffff8316108015612b4c575067ffffffff00000001604083901c67ffffffffffffffff16105b8015612b6d575067ffffffff00000001608083901c67ffffffffffffffff16105b8015612b84575067ffffffff0000000160c083901c105b15612b9157506001919050565b505f919050565b919050565b6079545f9067ffffffffffffffff1615612bdf575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612c41576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6076612c4d8282615a03565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c50919061521a565b5f54610100900460ff1615808015612c9b57505f54600160ff909116105b80612cb45750303b158015612cb457505f5460ff166001145b612d45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612da1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b612dae6020880188615478565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612e036040880160208901615478565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055612e686080880160608901615478565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076612ef28682615a03565b506077612eff8582615a03565b5062093a80612f146060890160408a016153a4565b67ffffffffffffffff161115612f56576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f6660608801604089016153a4565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80612fc860a0890160808a016153a4565b67ffffffffffffffff16111561300a576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61301a60a08801608089016153a4565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c01000000000006978000000000000000000000000000000000000000001790556130f9614c81565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f0000000000000000000000000000000000000000000000000000000000000000858560405161314e9493929190615b62565b60405180910390a180156127c6575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561321d576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff161561325a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613295576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156132d1576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff7801000000000000000000000000000000000000000000000000820481169161331c918491700100000000000000000000000000000000900416615b99565b1115613354576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b848110156135f9575f8787838181106133b2576133b26157c4565b90506020028101906133c49190615bac565b6133cd90615bde565b9050836133d9816158b7565b825180516020918201208185015160408087015190519499509194505f9361343a9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146134c2576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f908152607160205260408120556134e660018961594c565b84036135555742607b60149054906101000a900467ffffffffffffffff168460400151613513919061579c565b67ffffffffffffffff161115613555576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806135f1906158f4565b915050613397565b50613604848461579c565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146137ac576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613811575f80fd5b505af1158015613823573d5f803e3d5ffd5b50505050612391614d20565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561388c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16156138c9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6138d2611f18565b90508181111561390e576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138883111561394a576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61398c73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308461479c565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139f6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a1a91906158dd565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16906018613a54836158b7565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051613a8b929190615c57565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303613bb9576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613c18565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613c0f9493929190615c66565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613c70576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610c50565b613cf9614b07565b73ffffffffffffffffffffffffffffffffffffffff8116613d9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401612d3c565b61148c81614b88565b5f80613daf612b9d565b905067ffffffffffffffff881615613e7e5760795467ffffffffffffffff9081169089161115613e0b576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614613e78576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50613f1e565b67ffffffffffffffff87165f90815260756020526040902054915081613ed0576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115613f1e576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611613f6b576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613f798888888689610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051613fad9190615c9b565b602060405180830381855afa158015613fc8573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613feb91906158dd565b613ff59190615cac565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161407791899190600401615cbf565b602060405180830381865afa158015614092573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140b69190615cf9565b6140ec576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614154336140fa858b61592b565b67ffffffffffffffff1661410c6125cc565b614116919061595f565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190614dae565b50505050505050505050565b5f67ffffffffffffffff88161561422c5760795467ffffffffffffffff90811690891611156141bb576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614614226576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506142c7565b5067ffffffffffffffff85165f908152607560205260409020548061427d576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff90811690871611156142c7576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff90811690881611806142f957508767ffffffffffffffff168767ffffffffffffffff1611155b80614320575060795467ffffffffffffffff68010000000000000000909104811690881611155b15614357576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f908152607860205260409020546801000000000000000090048116908616146143b9576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6143c78787878588610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516143fb9190615c9b565b602060405180830381855afa158015614416573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061443991906158dd565b6144439190615cac565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916144c591889190600401615cbf565b602060405180830381865afa1580156144e0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145049190615cf9565b61453a576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614154576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff6801000000000000000090910481169082161115806145c9575060795467ffffffffffffffff908116908216115b15614600576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b15801561472e575f80fd5b505af1158015614740573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161478f91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526148789085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614e09565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115612391576079545f906148c69068010000000000000000900467ffffffffffffffff16600161579c565b90506148d181611203565b1561148c576079545f906002906148f390849067ffffffffffffffff1661592b565b6148fd9190615d18565b614907908361579c565b905061491281611203565b15614924576149208161458f565b5050565b6149208261458f565b5f614936612b9d565b9050815f80614945848461592b565b606f5467ffffffffffffffff91821692505f91614968916101009004164261594c565b90505b8467ffffffffffffffff168467ffffffffffffffff16146149f25767ffffffffffffffff8085165f90815260726020526040902060018101549091168210156149d057600181015468010000000000000000900467ffffffffffffffff1694506149ec565b6149da868661592b565b67ffffffffffffffff169350506149f2565b5061496b565b5f6149fd848461594c565b905083811015614a5457808403600c8111614a185780614a1b565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281614a4a57614a4a615976565b0460705550614ac3565b838103600c8111614a655780614a68565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a76400000281614a9e57614a9e615976565b04905080607054670de0b6b3a76400000281614abc57614abc615976565b0460705550505b683635c9adc5dea000006070541115614ae857683635c9adc5dea000006070556127c6565b633b9aca0060705410156127c657633b9aca0060705550505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314612391576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612d3c565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015614c63575f80fd5b505af1158015614c75573d5f803e3d5ffd5b50505050612391614f14565b5f54610100900460ff16614d17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401612d3c565b61239133614b88565b606f5460ff16614d5c576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052614e049084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016147f6565b505050565b5f614e6a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16614fa69092919063ffffffff16565b805190915015614e045780806020019051810190614e889190615cf9565b614e04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401612d3c565b606f5460ff1615614f51576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b6060614fb484845f85614fbc565b949350505050565b60608247101561504e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401612d3c565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516150769190615c9b565b5f6040518083038185875af1925050503d805f81146150b0576040519150601f19603f3d011682016040523d82523d5f602084013e6150b5565b606091505b50915091506150c6878383876150d1565b979650505050505050565b606083156151665782515f0361515f5773ffffffffffffffffffffffffffffffffffffffff85163b61515f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612d3c565b5081614fb4565b614fb4838381511561517b5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3c919061521a565b5f5b838110156151c95781810151838201526020016151b1565b50505f910152565b5f81518084526151e88160208601602086016151af565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61522c60208301846151d1565b9392505050565b5f60208284031215615243575f80fd5b813561ffff8116811461522c575f80fd5b803567ffffffffffffffff81168114612b98575f80fd5b5f805f805f60a0868803121561527f575f80fd5b61528886615254565b945061529660208701615254565b94979496505050506040830135926060810135926080909101359150565b8061030081018310156152c5575f80fd5b92915050565b5f805f805f806103a087890312156152e1575f80fd5b6152ea87615254565b95506152f860208801615254565b945061530660408801615254565b935060608701359250608087013591506153238860a089016152b4565b90509295509295509295565b5f805f805f805f6103c0888a031215615346575f80fd5b61534f88615254565b965061535d60208901615254565b955061536b60408901615254565b945061537960608901615254565b93506080880135925060a088013591506153968960c08a016152b4565b905092959891949750929550565b5f602082840312156153b4575f80fd5b61522c82615254565b5f8083601f8401126153cd575f80fd5b50813567ffffffffffffffff8111156153e4575f80fd5b6020830191508360208260051b85010111156153fe575f80fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612b98575f80fd5b5f805f6040848603121561543a575f80fd5b833567ffffffffffffffff811115615450575f80fd5b61545c868287016153bd565b909450925061546f905060208501615405565b90509250925092565b5f60208284031215615488575f80fd5b61522c82615405565b5f602082840312156154a1575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126154e4575f80fd5b813567ffffffffffffffff808211156154ff576154ff6154a8565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715615545576155456154a8565b8160405283815286602085880101111561555d575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6020828403121561558c575f80fd5b813567ffffffffffffffff8111156155a2575f80fd5b614fb4848285016154d5565b5f8083601f8401126155be575f80fd5b50813567ffffffffffffffff8111156155d5575f80fd5b6020830191508360208285010111156153fe575f80fd5b5f805f805f80868803610120811215615603575f80fd5b60a0811215615610575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff80821115615635575f80fd5b6156418a838b016154d5565b955060e0890135915080821115615656575f80fd5b6156628a838b016154d5565b9450610100890135915080821115615678575f80fd5b5061568589828a016155ae565b979a9699509497509295939492505050565b5f80602083850312156156a8575f80fd5b823567ffffffffffffffff8111156156be575f80fd5b6156ca858286016153bd565b90969095509350505050565b5f805f604084860312156156e8575f80fd5b833567ffffffffffffffff8111156156fe575f80fd5b61570a868287016155ae565b909790965060209590950135949350505050565b600181811c9082168061573257607f821691505b602082108103615769577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156157bd576157bd61576f565b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112615823575f80fd5b9190910192915050565b5f6080823603121561583d575f80fd5b6040516080810167ffffffffffffffff8282108183111715615861576158616154a8565b816040528435915080821115615875575f80fd5b50615882368286016154d5565b8252506020830135602082015261589b60408401615254565b60408201526158ac60608401615254565b606082015292915050565b5f67ffffffffffffffff8083168181036158d3576158d361576f565b6001019392505050565b5f602082840312156158ed575f80fd5b5051919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036159245761592461576f565b5060010190565b67ffffffffffffffff8281168282160390808211156157bd576157bd61576f565b818103818111156152c5576152c561576f565b80820281158282048414176152c5576152c561576f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f826159b1576159b1615976565b500490565b601f821115614e04575f81815260208120601f850160051c810160208610156159dc5750805b601f850160051c820191505b818110156159fb578281556001016159e8565b505050505050565b815167ffffffffffffffff811115615a1d57615a1d6154a8565b615a3181615a2b845461571e565b846159b6565b602080601f831160018114615a83575f8415615a4d5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556159fb565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615acf57888601518255948401946001909101908401615ab0565b5085821015615b0b57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152615b8f606083018486615b1b565b9695505050505050565b808201808211156152c5576152c561576f565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112615823575f80fd5b5f60608236031215615bee575f80fd5b6040516060810167ffffffffffffffff8282108183111715615c1257615c126154a8565b816040528435915080821115615c26575f80fd5b50615c33368286016154d5565b82525060208301356020820152615c4c60408401615254565b604082015292915050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f615b8f606083018486615b1b565b5f82516158238184602087016151af565b5f82615cba57615cba615976565b500690565b6103208101610300808584378201835f5b6001811015615cef578151835260209283019290910190600101615cd0565b5050509392505050565b5f60208284031215615d09575f80fd5b8151801515811461522c575f80fd5b5f67ffffffffffffffff80841680615d3257615d32615976565b9216919091049291505056fea2646970667358221220037883250178a4dbbb3550eba18a465d36ff27719a1da48e547cafff0383598464736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106103a9575f3560e01c8063841b24d7116101ea578063c754c7ed11610114578063e7a7ed02116100a9578063f14916d611610079578063f14916d614610a68578063f2fde38b14610a7b578063f851a44014610a8e578063f8b823e414610aae575f80fd5b8063e7a7ed02146109d1578063e8bf92ed14610a01578063eaeb077b14610a28578063ed6b010414610a3b575f80fd5b8063d2e129f9116100e4578063d2e129f91461097b578063d8d1091b1461098e578063d939b315146109a1578063dbc16976146109c9575f80fd5b8063c754c7ed146108e6578063c89e42df14610912578063cfa8ed4714610925578063d02103ca14610954575f80fd5b8063a3c573eb1161018a578063b4d63f581161015a578063b4d63f581461083e578063b6b0b097146108a4578063ba58ae39146108cb578063c0ed84e0146108de575f80fd5b8063a3c573eb146107af578063ada8f919146107d6578063adc879e9146107e9578063afd23cbe14610810575f80fd5b806399f5634e116101c557806399f5634e1461076e5780639aa972a3146107765780639c9f3dfe14610789578063a066215c1461079c575f80fd5b8063841b24d7146107185780638c3d7301146107485780638da5cb5b14610750575f80fd5b80634a1a89a7116102d6578063621dd4111161026b5780637215541a1161023b5780637215541a146106565780637fcb365314610669578063831c7ead1461067d578063837a4738146106a4575f80fd5b8063621dd411146106095780636b8616ce1461061c5780636ff512cc1461063b578063715018a61461064e575f80fd5b8063542028d5116102a6578063542028d5146105de5780635e9145c9146105e65780635ec91958146105f95780636046916914610601575f80fd5b80634a1a89a71461056b5780634a910e6a1461058b5780634e4877061461059e5780635392c5e0146105b1575f80fd5b8063298789831161034c578063394218e91161031c578063394218e9146104fc578063423fa8561461050f578063456052671461052f578063458c047714610557575f80fd5b806329878983146104975780632b0006fa146104c35780632c1f816a146104d6578063383b3be8146104e9575f80fd5b80631816b7e5116103875780631816b7e51461041657806319d8ac611461042b578063220d78991461043f5780632678224714610452575f80fd5b80630a0d9fbe146103ad578063107bf28c146103e457806315064c96146103f9575b5f80fd5b606f546103c690610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6103ec610ab7565b6040516103db919061521a565b606f546104069060ff1681565b60405190151581526020016103db565b610429610424366004615233565b610b43565b005b6073546103c69067ffffffffffffffff1681565b6103ec61044d36600461526b565b610c5b565b607b546104729073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103db565b6074546104729068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104296104d13660046152cb565b610e31565b6104296104e436600461532f565b610ffb565b6104066104f73660046153a4565b611203565b61042961050a3660046153a4565b611258565b6073546103c69068010000000000000000900467ffffffffffffffff1681565b6073546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546103c69067ffffffffffffffff1681565b6079546103c69068010000000000000000900467ffffffffffffffff1681565b6104296105993660046153a4565b6113dc565b6104296105ac3660046153a4565b61148f565b6105d06105bf3660046153a4565b60756020525f908152604090205481565b6040519081526020016103db565b6103ec611613565b6104296105f4366004615428565b611620565b610429611e19565b6105d0611f18565b6104296106173660046152cb565b611f2d565b6105d061062a3660046153a4565b60716020525f908152604090205481565b610429610649366004615478565b6122ab565b610429612380565b6104296106643660046153a4565b612393565b6074546103c69067ffffffffffffffff1681565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b6106ec6106b2366004615491565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016103db565b6079546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b610429612500565b60335473ffffffffffffffffffffffffffffffffffffffff16610472565b6105d06125cc565b61042961078436600461532f565b61271f565b6104296107973660046153a4565b6127cf565b6104296107aa3660046153a4565b61294b565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104296107e4366004615478565b612a51565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b606f5461082b906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103db565b61087e61084c3660046153a4565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016103db565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104066108d9366004615491565b612b15565b6103c6612b9d565b607b546103c69074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b61042961092036600461557c565b612bf0565b606f54610472906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104296109893660046155ec565b612c7d565b61042961099c366004615697565b6131c0565b6079546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b61042961375b565b6073546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b610429610a363660046156d6565b61382f565b607b54610406907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b610429610a76366004615478565b613c1f565b610429610a89366004615478565b613cf1565b607a546104729073ffffffffffffffffffffffffffffffffffffffff1681565b6105d060705481565b60778054610ac49061571e565b80601f0160208091040260200160405190810160405280929190818152602001828054610af09061571e565b8015610b3b5780601f10610b1257610100808354040283529160200191610b3b565b820191905f5260205f20905b815481529060010190602001808311610b1e57829003601f168201915b505050505081565b607a5473ffffffffffffffffffffffffffffffffffffffff163314610b94576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff161080610bad57506103ff8161ffff16115b15610be4576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590610c8e575081155b15610cc5576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610cfc576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d0584612b15565b610d3b576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610e8e576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e9c868686868686613da5565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615610f1657607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015610f9b575f80fd5b505af1158015610fad573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611058576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61106787878787878787614160565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156110e157607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611166575f80fd5b505af1158015611178573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611246927001000000000000000000000000000000009092048116911661579c565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146112a9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156112f0576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661135f5760795467ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169082161061135f576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610c50565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461148357606f5460ff1615611444576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61144d81611203565b611483576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61148c8161458f565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146114e0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611527576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661159257607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610611592576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001610c50565b60768054610ac49061571e565b606f5460ff161561165d576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146116bd576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f8190036116f8576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611734576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f81815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b86811015611b7c575f8a8a8381811061179a5761179a6157c4565b90506020028101906117ac91906157f1565b6117b59061582d565b8051805160209091012060608201519192509067ffffffffffffffff161561192a57856117e1816158b7565b9650505f818360200151846060015160405160200161183893929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f908152607190935291205490915081146118c0576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088165f908152607160205260408082209190915560608501519085015190821691161015611924576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611a64565b6020820151158015906119ee575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af11580156119c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ec91906158dd565b155b15611a25576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611a64576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080611a97575042826040015167ffffffffffffffff16115b15611ace576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151975050508080611b74906158f4565b91505061177f565b50611b87868561579c565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115611bf0576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611bfb828561592b565b611c0f9067ffffffffffffffff168861594c565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611d0457607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611d56333083607054611d17919061595f565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692919061479c565b611d5e61487e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611dc3575f80fd5b505af1158015611dd5573d5f803e3d5ffd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611e6a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16611ec6576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f6070546064611f28919061595f565b905090565b606f5460ff1615611f6a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f908152607260205260409020600101544292611fb69278010000000000000000000000000000000000000000000000009091048116911661579c565b67ffffffffffffffff161115611ff8576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612005868661592b565b67ffffffffffffffff161115612047576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612055868686868686613da5565b61205e8461492d565b607954700100000000000000000000000000000000900467ffffffffffffffff165f0361219f57607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156120ff57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612184575f80fd5b505af1158015612196573d5f803e3d5ffd5b5050505061226d565b6121a761487e565b6079805467ffffffffffffffff16905f6121c0836158b7565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001610feb565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146122fc576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c50565b612388614b07565b6123915f614b88565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146124f8575f6123bb612b9d565b90508067ffffffffffffffff168267ffffffffffffffff161161240a576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000009091048116908316118061244f575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15612486576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916124b49162093a80911661579c565b67ffffffffffffffff1611156124f6576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61148c614bfe565b607b5473ffffffffffffffffffffffffffffffffffffffff163314612551576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015612658573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061267c91906158dd565b90505f612687612b9d565b60735467ffffffffffffffff6801000000000000000082048116916126df917001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041661592b565b6126e9919061579c565b6126f3919061592b565b67ffffffffffffffff169050805f0361270e575f9250505090565b61271881836159a3565b9250505090565b606f5460ff161561275c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61276b87878787878787614160565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16127c6614bfe565b50505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612820576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115612867576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166128ce5760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106128ce576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461299c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156129e3576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612aa2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c50565b5f67ffffffff0000000167ffffffffffffffff8316108015612b4c575067ffffffff00000001604083901c67ffffffffffffffff16105b8015612b6d575067ffffffff00000001608083901c67ffffffffffffffff16105b8015612b84575067ffffffff0000000160c083901c105b15612b9157506001919050565b505f919050565b919050565b6079545f9067ffffffffffffffff1615612bdf575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612c41576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6076612c4d8282615a03565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c50919061521a565b5f54610100900460ff1615808015612c9b57505f54600160ff909116105b80612cb45750303b158015612cb457505f5460ff166001145b612d45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612da1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b612dae6020880188615478565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612e036040880160208901615478565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055612e686080880160608901615478565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076612ef28682615a03565b506077612eff8582615a03565b5062093a80612f146060890160408a016153a4565b67ffffffffffffffff161115612f56576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f6660608801604089016153a4565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80612fc860a0890160808a016153a4565b67ffffffffffffffff16111561300a576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61301a60a08801608089016153a4565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c01000000000006978000000000000000000000000000000000000000001790556130f9614c81565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f0000000000000000000000000000000000000000000000000000000000000000858560405161314e9493929190615b62565b60405180910390a180156127c6575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561321d576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff161561325a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613295576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156132d1576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff7801000000000000000000000000000000000000000000000000820481169161331c918491700100000000000000000000000000000000900416615b99565b1115613354576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b848110156135f9575f8787838181106133b2576133b26157c4565b90506020028101906133c49190615bac565b6133cd90615bde565b9050836133d9816158b7565b825180516020918201208185015160408087015190519499509194505f9361343a9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146134c2576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f908152607160205260408120556134e660018961594c565b84036135555742607b60149054906101000a900467ffffffffffffffff168460400151613513919061579c565b67ffffffffffffffff161115613555576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806135f1906158f4565b915050613397565b50613604848461579c565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146137ac576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613811575f80fd5b505af1158015613823573d5f803e3d5ffd5b50505050612391614d20565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561388c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16156138c9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6138d2611f18565b90508181111561390e576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138883111561394a576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61398c73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308461479c565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139f6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a1a91906158dd565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16906018613a54836158b7565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051613a8b929190615c57565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303613bb9576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613c18565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613c0f9493929190615c66565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613c70576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610c50565b613cf9614b07565b73ffffffffffffffffffffffffffffffffffffffff8116613d9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401612d3c565b61148c81614b88565b5f80613daf612b9d565b905067ffffffffffffffff881615613e7e5760795467ffffffffffffffff9081169089161115613e0b576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614613e78576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50613f1e565b67ffffffffffffffff87165f90815260756020526040902054915081613ed0576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115613f1e576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611613f6b576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613f798888888689610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051613fad9190615c9b565b602060405180830381855afa158015613fc8573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613feb91906158dd565b613ff59190615cac565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161407791899190600401615cbf565b602060405180830381865afa158015614092573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140b69190615cf9565b6140ec576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614154336140fa858b61592b565b67ffffffffffffffff1661410c6125cc565b614116919061595f565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190614dae565b50505050505050505050565b5f67ffffffffffffffff88161561422c5760795467ffffffffffffffff90811690891611156141bb576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614614226576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506142c7565b5067ffffffffffffffff85165f908152607560205260409020548061427d576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff90811690871611156142c7576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff90811690881611806142f957508767ffffffffffffffff168767ffffffffffffffff1611155b80614320575060795467ffffffffffffffff68010000000000000000909104811690881611155b15614357576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f908152607860205260409020546801000000000000000090048116908616146143b9576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6143c78787878588610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516143fb9190615c9b565b602060405180830381855afa158015614416573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061443991906158dd565b6144439190615cac565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916144c591889190600401615cbf565b602060405180830381865afa1580156144e0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145049190615cf9565b61453a576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614154576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff6801000000000000000090910481169082161115806145c9575060795467ffffffffffffffff908116908216115b15614600576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b15801561472e575f80fd5b505af1158015614740573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161478f91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526148789085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614e09565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115612391576079545f906148c69068010000000000000000900467ffffffffffffffff16600161579c565b90506148d181611203565b1561148c576079545f906002906148f390849067ffffffffffffffff1661592b565b6148fd9190615d18565b614907908361579c565b905061491281611203565b15614924576149208161458f565b5050565b6149208261458f565b5f614936612b9d565b9050815f80614945848461592b565b606f5467ffffffffffffffff91821692505f91614968916101009004164261594c565b90505b8467ffffffffffffffff168467ffffffffffffffff16146149f25767ffffffffffffffff8085165f90815260726020526040902060018101549091168210156149d057600181015468010000000000000000900467ffffffffffffffff1694506149ec565b6149da868661592b565b67ffffffffffffffff169350506149f2565b5061496b565b5f6149fd848461594c565b905083811015614a5457808403600c8111614a185780614a1b565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281614a4a57614a4a615976565b0460705550614ac3565b838103600c8111614a655780614a68565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a76400000281614a9e57614a9e615976565b04905080607054670de0b6b3a76400000281614abc57614abc615976565b0460705550505b683635c9adc5dea000006070541115614ae857683635c9adc5dea000006070556127c6565b633b9aca0060705410156127c657633b9aca0060705550505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314612391576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612d3c565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015614c63575f80fd5b505af1158015614c75573d5f803e3d5ffd5b50505050612391614f14565b5f54610100900460ff16614d17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401612d3c565b61239133614b88565b606f5460ff16614d5c576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052614e049084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016147f6565b505050565b5f614e6a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16614fa69092919063ffffffff16565b805190915015614e045780806020019051810190614e889190615cf9565b614e04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401612d3c565b606f5460ff1615614f51576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b6060614fb484845f85614fbc565b949350505050565b60608247101561504e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401612d3c565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516150769190615c9b565b5f6040518083038185875af1925050503d805f81146150b0576040519150601f19603f3d011682016040523d82523d5f602084013e6150b5565b606091505b50915091506150c6878383876150d1565b979650505050505050565b606083156151665782515f0361515f5773ffffffffffffffffffffffffffffffffffffffff85163b61515f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612d3c565b5081614fb4565b614fb4838381511561517b5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3c919061521a565b5f5b838110156151c95781810151838201526020016151b1565b50505f910152565b5f81518084526151e88160208601602086016151af565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61522c60208301846151d1565b9392505050565b5f60208284031215615243575f80fd5b813561ffff8116811461522c575f80fd5b803567ffffffffffffffff81168114612b98575f80fd5b5f805f805f60a0868803121561527f575f80fd5b61528886615254565b945061529660208701615254565b94979496505050506040830135926060810135926080909101359150565b8061030081018310156152c5575f80fd5b92915050565b5f805f805f806103a087890312156152e1575f80fd5b6152ea87615254565b95506152f860208801615254565b945061530660408801615254565b935060608701359250608087013591506153238860a089016152b4565b90509295509295509295565b5f805f805f805f6103c0888a031215615346575f80fd5b61534f88615254565b965061535d60208901615254565b955061536b60408901615254565b945061537960608901615254565b93506080880135925060a088013591506153968960c08a016152b4565b905092959891949750929550565b5f602082840312156153b4575f80fd5b61522c82615254565b5f8083601f8401126153cd575f80fd5b50813567ffffffffffffffff8111156153e4575f80fd5b6020830191508360208260051b85010111156153fe575f80fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612b98575f80fd5b5f805f6040848603121561543a575f80fd5b833567ffffffffffffffff811115615450575f80fd5b61545c868287016153bd565b909450925061546f905060208501615405565b90509250925092565b5f60208284031215615488575f80fd5b61522c82615405565b5f602082840312156154a1575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126154e4575f80fd5b813567ffffffffffffffff808211156154ff576154ff6154a8565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715615545576155456154a8565b8160405283815286602085880101111561555d575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6020828403121561558c575f80fd5b813567ffffffffffffffff8111156155a2575f80fd5b614fb4848285016154d5565b5f8083601f8401126155be575f80fd5b50813567ffffffffffffffff8111156155d5575f80fd5b6020830191508360208285010111156153fe575f80fd5b5f805f805f80868803610120811215615603575f80fd5b60a0811215615610575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff80821115615635575f80fd5b6156418a838b016154d5565b955060e0890135915080821115615656575f80fd5b6156628a838b016154d5565b9450610100890135915080821115615678575f80fd5b5061568589828a016155ae565b979a9699509497509295939492505050565b5f80602083850312156156a8575f80fd5b823567ffffffffffffffff8111156156be575f80fd5b6156ca858286016153bd565b90969095509350505050565b5f805f604084860312156156e8575f80fd5b833567ffffffffffffffff8111156156fe575f80fd5b61570a868287016155ae565b909790965060209590950135949350505050565b600181811c9082168061573257607f821691505b602082108103615769577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156157bd576157bd61576f565b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112615823575f80fd5b9190910192915050565b5f6080823603121561583d575f80fd5b6040516080810167ffffffffffffffff8282108183111715615861576158616154a8565b816040528435915080821115615875575f80fd5b50615882368286016154d5565b8252506020830135602082015261589b60408401615254565b60408201526158ac60608401615254565b606082015292915050565b5f67ffffffffffffffff8083168181036158d3576158d361576f565b6001019392505050565b5f602082840312156158ed575f80fd5b5051919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036159245761592461576f565b5060010190565b67ffffffffffffffff8281168282160390808211156157bd576157bd61576f565b818103818111156152c5576152c561576f565b80820281158282048414176152c5576152c561576f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f826159b1576159b1615976565b500490565b601f821115614e04575f81815260208120601f850160051c810160208610156159dc5750805b601f850160051c820191505b818110156159fb578281556001016159e8565b505050505050565b815167ffffffffffffffff811115615a1d57615a1d6154a8565b615a3181615a2b845461571e565b846159b6565b602080601f831160018114615a83575f8415615a4d5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556159fb565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615acf57888601518255948401946001909101908401615ab0565b5085821015615b0b57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152615b8f606083018486615b1b565b9695505050505050565b808201808211156152c5576152c561576f565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112615823575f80fd5b5f60608236031215615bee575f80fd5b6040516060810167ffffffffffffffff8282108183111715615c1257615c126154a8565b816040528435915080821115615c26575f80fd5b50615c33368286016154d5565b82525060208301356020820152615c4c60408401615254565b604082015292915050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f615b8f606083018486615b1b565b5f82516158238184602087016151af565b5f82615cba57615cba615976565b500690565b6103208101610300808584378201835f5b6001811015615cef578151835260209283019290910190600101615cd0565b5050509392505050565b5f60208284031215615d09575f80fd5b8151801515811461522c575f80fd5b5f67ffffffffffffffff80841680615d3257615d32615976565b9216919091049291505056fea2646970667358221220037883250178a4dbbb3550eba18a465d36ff27719a1da48e547cafff0383598464736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMBridge.json b/compiled-contracts/PolygonZkEVMBridge.json index a0d57e458..0a1bcd5c1 100644 --- a/compiled-contracts/PolygonZkEVMBridge.json +++ b/compiled-contracts/PolygonZkEVMBridge.json @@ -776,8 +776,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561000f575f80fd5b50615b1f8061001d5f395ff3fe60806040526004361062000197575f3560e01c8063647c576c11620000e2578063be5831c71162000086578063dbc16976116200005e578063dbc16976146200061a578063ee25560b1462000631578063fb5708341462000660575f80fd5b8063be5831c71462000591578063cd58657914620005cc578063d02103ca14620005e3575f80fd5b80639e34070f11620000ba5780639e34070f14620004f1578063aaa13cc21462000534578063bab161bf1462000558575f80fd5b8063647c576c146200047157806379e2cf97146200049557806381b1c17414620004ac575f80fd5b80632d2c9d94116200014a57806334ac9cf2116200012257806334ac9cf2146200033a5780633ae0504714620003685780633e197043146200037f575f80fd5b80632d2c9d9414620002695780632dfdf0b5146200028d578063318aee3d14620002b3575f80fd5b806322e95f2c116200017e57806322e95f2c14620001e4578063240ff378146200022e5780632cffd02e1462000245575f80fd5b806315064c96146200019b5780632072f6c514620001cb575b5f80fd5b348015620001a7575f80fd5b50606854620001b69060ff1681565b60405190151581526020015b60405180910390f35b348015620001d7575f80fd5b50620001e262000684565b005b348015620001f0575f80fd5b5062000208620002023660046200323f565b620006e2565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001c2565b620001e26200023f366004620032cf565b62000784565b34801562000251575f80fd5b50620001e26200026336600462003360565b620009ab565b34801562000275575f80fd5b50620001e26200028736600462003360565b62000f30565b34801562000299575f80fd5b50620002a460535481565b604051908152602001620001c2565b348015620002bf575f80fd5b5062000308620002d13660046200343e565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001c2565b34801562000346575f80fd5b50606c54620002089073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000374575f80fd5b50620002a462001130565b3480156200038b575f80fd5b50620002a46200039d36600462003472565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200047d575f80fd5b50620001e26200048f366004620034f7565b62001215565b348015620004a1575f80fd5b50620001e26200145e565b348015620004b8575f80fd5b5062000208620004ca36600462003544565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620004fd575f80fd5b50620001b66200050f36600462003544565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b34801562000540575f80fd5b5062000208620005523660046200355c565b62001498565b34801562000564575f80fd5b506068546200057b90610100900463ffffffff1681565b60405163ffffffff9091168152602001620001c2565b3480156200059d575f80fd5b506068546200057b90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001e2620005dd36600462003609565b62001682565b348015620005ef575f80fd5b50606854620002089065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000626575f80fd5b50620001e262001bd4565b3480156200063d575f80fd5b50620002a46200064f36600462003544565b60696020525f908152604090205481565b3480156200066c575f80fd5b50620001b66200067e366004620036a5565b62001c30565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006d6576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062001d18565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007c2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620007e85750600263ffffffff861610155b1562000820576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620008769998979695949392919062003736565b60405180910390a1620009936200098d6001606860019054906101000a900463ffffffff16338989348989604051620008b1929190620037b0565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001dab565b8215620009a457620009a462001ebf565b5050505050565b60685460ff1615620009e9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620009ff8b8b8b8b8b8b8b8b8b8b8b5f62001f8f565b73ffffffffffffffffffffffffffffffffffffffff861662000ad757604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a53919062003810565b5f6040518083038185875af1925050503d805f811462000a8f576040519150601f19603f3d011682016040523d82523d5f602084013e62000a94565b606091505b505090508062000ad0576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000eb8565b60685463ffffffff61010090910481169088160362000b195762000b1373ffffffffffffffffffffffffffffffffffffffff871685856200217a565b62000eb8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e2f575f808062000beb868801886200391f565b9250925092505f8584848460405162000c0490620031f8565b62000c1293929190620039db565b8190604051809103905ff590508015801562000c30573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000ca3575f80fd5b505af115801562000cb6573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e1d95949392919062003a17565b60405180910390a15050505062000eb5565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562000e9d575f80fd5b505af115801562000eb0573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000f6e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000f858b8b8b8b8b8b8b8b8b8b8b600162001f8f565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000fb7949392919062003a5e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200103a919062003810565b5f6040518083038185875af1925050503d805f811462001076576040519150601f19603f3d011682016040523d82523d5f602084013e6200107b565b606091505b5050905080620010b7576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200120c578083901c6001166001036200119d576033816020811062001169576200116962003aa5565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620011ca565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620012039062003aff565b9150506200113a565b50919392505050565b5f54610100900460ff16158080156200123457505f54600160ff909116105b806200124f5750303b1580156200124f57505f5460ff166001145b620012e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200133e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016918416919091179055620013f562002250565b801562001458575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620006e057620006e062001ebf565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b3083604051806020016200152c90620031f8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905262001577908d908d908d908d908d9060200162003b39565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052620015b5929160200162003b79565b604051602081830303815290604052805190602001206040516020016200163e94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff1615620016c0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620016ca620022f2565b60685463ffffffff888116610100909204161480620016f05750600263ffffffff881610155b1562001728576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff88166200178c5788341462001783576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f925062001a79565b3415620017c5576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620018ae576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b15801562001884575f80fd5b505af115801562001897573d5f803e3d5ffd5b5050505080602001519450805f0151935062001a77565b8515620018c357620018c3898b898962002367565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200192e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001954919062003bab565b90506200197a73ffffffffffffffffffffffffffffffffffffffff8b1633308e6200287a565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015620019e5573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001a0b919062003bab565b905062001a19828262003bc3565b6068548c9850610100900463ffffffff169650935062001a3987620028da565b62001a448c620029ee565b62001a4f8d62002af7565b60405160200162001a6393929190620039db565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e868860535460405162001aba98979695949392919062003bd9565b60405180910390a162001bac6200098d5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b861562001bbd5762001bbd62001ebf565b5050505062001bcb60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c26576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062002bf5565b5f84815b602081101562001d0a57600163ffffffff8616821c8116900362001ca65785816020811062001c675762001c6762003aa5565b60200201358260405160200162001c88929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001cf5565b8186826020811062001cbc5762001cbc62003aa5565b602002013560405160200162001cdc929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d018162003aff565b91505062001c34565b50821490505b949350505050565b60685460ff161562001d56576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001dbc6020600262003d88565b62001dc8919062003bc3565b6053541062001e03576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001e149062003aff565b918290555090505f5b602081101562001eaf578082901c60011660010362001e5557826033826020811062001e4d5762001e4d62003aa5565b015550505050565b6033816020811062001e6b5762001e6b62003aa5565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001ea69062003aff565b91505062001e1d565b5062001eba62003d95565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001f4562001130565b6040518263ffffffff1660e01b815260040162001f6491815260200190565b5f604051808303815f87803b15801562001f7c575f80fd5b505af115801562001458573d5f803e3d5ffd5b62001fa08b63ffffffff1662002c84565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af11580156200203f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002065919062003bab565b9050805f03620020a0576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8881166101009092041614620020ea576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff16620021075750896200210a565b508a5b620021336200212a848c8c8c8c8c8c8c604051620008b1929190620037b0565b8f8f8462001c30565b6200216a576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001eba9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002ce8565b5f54610100900460ff16620022e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b620006e062002dfa565b60026001540362002360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401620012d8565b6002600155565b5f62002377600482848662003dc2565b620023829162003deb565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620025fc575f808080808080620023e4896004818d62003dc2565b810190620023f3919062003e34565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002467576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff86163014620024b7576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a8514620024f1576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620025ac919062003810565b5f604051808303815f865af19150503d805f8114620025e7576040519150601f19603f3d011682016040523d82523d5f602084013e620025ec565b606091505b50505050505050505050620009a4565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002678576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806200268f8a6004818e62003dc2565b8101906200269e919062003e8a565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002714576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002764576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002828919062003810565b5f604051808303815f865af19150503d805f811462002863576040519150601f19603f3d011682016040523d82523d5f602084013e62002868565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014589085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401620021cd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff8616916200295d919062003810565b5f60405180830381855afa9150503d805f811462002997576040519150601f19603f3d011682016040523d82523d5f602084013e6200299c565b606091505b509150915081620029e3576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d10565b62001d108162002e92565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002a71919062003810565b5f60405180830381855afa9150503d805f811462002aab576040519150601f19603f3d011682016040523d82523d5f602084013e62002ab0565b606091505b509150915081620029e3576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d10565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff86169162002b79919062003810565b5f60405180830381855afa9150503d805f811462002bb3576040519150601f19603f3d011682016040523d82523d5f602084013e62002bb8565b606091505b509150915081801562002bcc575080516020145b62002bd957601262001d10565b8080602001905181019062001d10919062003f11565b60018055565b60685460ff1662002c32576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009a4576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002d4b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200307d9092919063ffffffff16565b80519091501562001eba578080602001905181019062002d6c919062003f2f565b62001eba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401620012d8565b5f54610100900460ff1662002bef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b6060604082511062002eb457818060200190518101906200077e919062003f4d565b81516020036200303f575f5b60208110801562002f0b575082818151811062002ee15762002ee162003aa5565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002f26578062002f1d8162003aff565b91505062002ec0565b805f0362002f6957505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff81111562002f865762002f86620037bf565b6040519080825280601f01601f19166020018201604052801562002fb1576020820181803683370190505b5090505f5b82811015620030375784818151811062002fd45762002fd462003aa5565b602001015160f81c60f81b82828151811062002ff45762002ff462003aa5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350806200302e8162003aff565b91505062002fb6565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d1084845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051620030b2919062003810565b5f6040518083038185875af1925050503d805f8114620030ee576040519150601f19603f3d011682016040523d82523d5f602084013e620030f3565b606091505b5091509150620031068783838762003111565b979650505050505050565b60608315620031ab5782515f03620031a35773ffffffffffffffffffffffffffffffffffffffff85163b620031a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620012d8565b508162001d10565b62001d108383815115620031c25781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620012d8919062003fc8565b611b0d8062003fdd83390190565b803563ffffffff8116811462003078575f80fd5b73ffffffffffffffffffffffffffffffffffffffff811681146200323c575f80fd5b50565b5f806040838503121562003251575f80fd5b6200325c8362003206565b915060208301356200326e816200321a565b809150509250929050565b80151581146200323c575f80fd5b5f8083601f84011262003298575f80fd5b50813567ffffffffffffffff811115620032b0575f80fd5b602083019150836020828501011115620032c8575f80fd5b9250929050565b5f805f805f60808688031215620032e4575f80fd5b620032ef8662003206565b9450602086013562003301816200321a565b93506040860135620033138162003279565b9250606086013567ffffffffffffffff8111156200332f575f80fd5b6200333d8882890162003287565b969995985093965092949392505050565b8061040081018310156200077e575f80fd5b5f805f805f805f805f805f6105208c8e0312156200337c575f80fd5b620033888d8d6200334e565b9a50620033996104008d0162003206565b99506104208c013598506104408c01359750620033ba6104608d0162003206565b96506104808c0135620033cd816200321a565b9550620033de6104a08d0162003206565b94506104c08c0135620033f1816200321a565b93506104e08c013592506105008c013567ffffffffffffffff81111562003416575f80fd5b620034248e828f0162003287565b915080935050809150509295989b509295989b9093969950565b5f602082840312156200344f575f80fd5b81356200345c816200321a565b9392505050565b60ff811681146200323c575f80fd5b5f805f805f805f60e0888a03121562003489575f80fd5b8735620034968162003463565b9650620034a66020890162003206565b95506040880135620034b8816200321a565b9450620034c86060890162003206565b93506080880135620034da816200321a565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156200350a575f80fd5b620035158462003206565b9250602084013562003527816200321a565b9150604084013562003539816200321a565b809150509250925092565b5f6020828403121562003555575f80fd5b5035919050565b5f805f805f805f60a0888a03121562003573575f80fd5b6200357e8862003206565b9650602088013562003590816200321a565b9550604088013567ffffffffffffffff80821115620035ad575f80fd5b620035bb8b838c0162003287565b909750955060608a0135915080821115620035d4575f80fd5b50620035e38a828b0162003287565b9094509250506080880135620035f98162003463565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003620575f80fd5b6200362b8862003206565b965060208801356200363d816200321a565b955060408801359450606088013562003656816200321a565b93506080880135620036688162003279565b925060a088013567ffffffffffffffff81111562003684575f80fd5b620036928a828b0162003287565b989b979a50959850939692959293505050565b5f805f806104608587031215620036ba575f80fd5b84359350620036cd86602087016200334e565b9250620036de610420860162003206565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620037968285018789620036ef565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003808578181015183820152602001620037ee565b50505f910152565b5f825162003823818460208701620037ec565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715620038775762003877620037bf565b604052919050565b5f67ffffffffffffffff8211156200389b576200389b620037bf565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112620038d7575f80fd5b8135620038ee620038e8826200387f565b6200382d565b81815284602083860101111562003903575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003932575f80fd5b833567ffffffffffffffff808211156200394a575f80fd5b6200395887838801620038c7565b945060208601359150808211156200396e575f80fd5b506200397d86828701620038c7565b9250506040840135620035398162003463565b5f8151808452620039a9816020860160208601620037ec565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f620039ef606083018662003990565b828103602084015262003a03818662003990565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff80871660208401528086166040840152506080606083015262003106608083018486620036ef565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003a9b606083018486620036ef565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003b325762003b3262003ad2565b5060010190565b606081525f62003b4e606083018789620036ef565b828103602084015262003b63818688620036ef565b91505060ff831660408301529695505050505050565b5f835162003b8c818460208801620037ec565b83519083019062003ba2818360208801620037ec565b01949350505050565b5f6020828403121562003bbc575f80fd5b5051919050565b818103818111156200077e576200077e62003ad2565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003c388285018762003990565b925080851660e085015250509998505050505050505050565b600181815b8085111562003cb057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003c945762003c9462003ad2565b8085161562003ca257918102915b93841c939080029062003c56565b509250929050565b5f8262003cc8575060016200077e565b8162003cd657505f6200077e565b816001811462003cef576002811462003cfa5762003d1a565b60019150506200077e565b60ff84111562003d0e5762003d0e62003ad2565b50506001821b6200077e565b5060208310610133831016604e8410600b841016171562003d3f575081810a6200077e565b62003d4b838362003c51565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d805762003d8062003ad2565b029392505050565b5f6200345c838362003cb8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f808585111562003dd1575f80fd5b8386111562003dde575f80fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003e2c5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562003e4b575f80fd5b873562003e58816200321a565b9650602088013562003e6a816200321a565b955060408801359450606088013593506080880135620034da8162003463565b5f805f805f805f80610100898b03121562003ea3575f80fd5b883562003eb0816200321a565b9750602089013562003ec2816200321a565b96506040890135955060608901359450608089013562003ee28162003279565b935060a089013562003ef48162003463565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562003f22575f80fd5b81516200345c8162003463565b5f6020828403121562003f40575f80fd5b81516200345c8162003279565b5f6020828403121562003f5e575f80fd5b815167ffffffffffffffff81111562003f75575f80fd5b8201601f8101841362003f86575f80fd5b805162003f97620038e8826200387f565b81815285602083850101111562003fac575f80fd5b62003fbf826020830160208601620037ec565b95945050505050565b602081525f6200345c60208301846200399056fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a2646970667358221220dc5d0800b73601716987991121b7cb66e16dc8428f7ecac637fad0c9c06ca6ed64736f6c63430008140033", - "deployedBytecode": "0x60806040526004361062000197575f3560e01c8063647c576c11620000e2578063be5831c71162000086578063dbc16976116200005e578063dbc16976146200061a578063ee25560b1462000631578063fb5708341462000660575f80fd5b8063be5831c71462000591578063cd58657914620005cc578063d02103ca14620005e3575f80fd5b80639e34070f11620000ba5780639e34070f14620004f1578063aaa13cc21462000534578063bab161bf1462000558575f80fd5b8063647c576c146200047157806379e2cf97146200049557806381b1c17414620004ac575f80fd5b80632d2c9d94116200014a57806334ac9cf2116200012257806334ac9cf2146200033a5780633ae0504714620003685780633e197043146200037f575f80fd5b80632d2c9d9414620002695780632dfdf0b5146200028d578063318aee3d14620002b3575f80fd5b806322e95f2c116200017e57806322e95f2c14620001e4578063240ff378146200022e5780632cffd02e1462000245575f80fd5b806315064c96146200019b5780632072f6c514620001cb575b5f80fd5b348015620001a7575f80fd5b50606854620001b69060ff1681565b60405190151581526020015b60405180910390f35b348015620001d7575f80fd5b50620001e262000684565b005b348015620001f0575f80fd5b5062000208620002023660046200323f565b620006e2565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001c2565b620001e26200023f366004620032cf565b62000784565b34801562000251575f80fd5b50620001e26200026336600462003360565b620009ab565b34801562000275575f80fd5b50620001e26200028736600462003360565b62000f30565b34801562000299575f80fd5b50620002a460535481565b604051908152602001620001c2565b348015620002bf575f80fd5b5062000308620002d13660046200343e565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001c2565b34801562000346575f80fd5b50606c54620002089073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000374575f80fd5b50620002a462001130565b3480156200038b575f80fd5b50620002a46200039d36600462003472565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200047d575f80fd5b50620001e26200048f366004620034f7565b62001215565b348015620004a1575f80fd5b50620001e26200145e565b348015620004b8575f80fd5b5062000208620004ca36600462003544565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620004fd575f80fd5b50620001b66200050f36600462003544565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b34801562000540575f80fd5b5062000208620005523660046200355c565b62001498565b34801562000564575f80fd5b506068546200057b90610100900463ffffffff1681565b60405163ffffffff9091168152602001620001c2565b3480156200059d575f80fd5b506068546200057b90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001e2620005dd36600462003609565b62001682565b348015620005ef575f80fd5b50606854620002089065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000626575f80fd5b50620001e262001bd4565b3480156200063d575f80fd5b50620002a46200064f36600462003544565b60696020525f908152604090205481565b3480156200066c575f80fd5b50620001b66200067e366004620036a5565b62001c30565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006d6576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062001d18565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007c2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620007e85750600263ffffffff861610155b1562000820576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620008769998979695949392919062003736565b60405180910390a1620009936200098d6001606860019054906101000a900463ffffffff16338989348989604051620008b1929190620037b0565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001dab565b8215620009a457620009a462001ebf565b5050505050565b60685460ff1615620009e9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620009ff8b8b8b8b8b8b8b8b8b8b8b5f62001f8f565b73ffffffffffffffffffffffffffffffffffffffff861662000ad757604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a53919062003810565b5f6040518083038185875af1925050503d805f811462000a8f576040519150601f19603f3d011682016040523d82523d5f602084013e62000a94565b606091505b505090508062000ad0576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000eb8565b60685463ffffffff61010090910481169088160362000b195762000b1373ffffffffffffffffffffffffffffffffffffffff871685856200217a565b62000eb8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e2f575f808062000beb868801886200391f565b9250925092505f8584848460405162000c0490620031f8565b62000c1293929190620039db565b8190604051809103905ff590508015801562000c30573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000ca3575f80fd5b505af115801562000cb6573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e1d95949392919062003a17565b60405180910390a15050505062000eb5565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562000e9d575f80fd5b505af115801562000eb0573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000f6e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000f858b8b8b8b8b8b8b8b8b8b8b600162001f8f565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000fb7949392919062003a5e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200103a919062003810565b5f6040518083038185875af1925050503d805f811462001076576040519150601f19603f3d011682016040523d82523d5f602084013e6200107b565b606091505b5050905080620010b7576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200120c578083901c6001166001036200119d576033816020811062001169576200116962003aa5565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620011ca565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620012039062003aff565b9150506200113a565b50919392505050565b5f54610100900460ff16158080156200123457505f54600160ff909116105b806200124f5750303b1580156200124f57505f5460ff166001145b620012e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200133e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016918416919091179055620013f562002250565b801562001458575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620006e057620006e062001ebf565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b3083604051806020016200152c90620031f8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905262001577908d908d908d908d908d9060200162003b39565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052620015b5929160200162003b79565b604051602081830303815290604052805190602001206040516020016200163e94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff1615620016c0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620016ca620022f2565b60685463ffffffff888116610100909204161480620016f05750600263ffffffff881610155b1562001728576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff88166200178c5788341462001783576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f925062001a79565b3415620017c5576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620018ae576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b15801562001884575f80fd5b505af115801562001897573d5f803e3d5ffd5b5050505080602001519450805f0151935062001a77565b8515620018c357620018c3898b898962002367565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200192e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001954919062003bab565b90506200197a73ffffffffffffffffffffffffffffffffffffffff8b1633308e6200287a565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015620019e5573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001a0b919062003bab565b905062001a19828262003bc3565b6068548c9850610100900463ffffffff169650935062001a3987620028da565b62001a448c620029ee565b62001a4f8d62002af7565b60405160200162001a6393929190620039db565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e868860535460405162001aba98979695949392919062003bd9565b60405180910390a162001bac6200098d5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b861562001bbd5762001bbd62001ebf565b5050505062001bcb60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c26576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062002bf5565b5f84815b602081101562001d0a57600163ffffffff8616821c8116900362001ca65785816020811062001c675762001c6762003aa5565b60200201358260405160200162001c88929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001cf5565b8186826020811062001cbc5762001cbc62003aa5565b602002013560405160200162001cdc929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d018162003aff565b91505062001c34565b50821490505b949350505050565b60685460ff161562001d56576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001dbc6020600262003d88565b62001dc8919062003bc3565b6053541062001e03576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001e149062003aff565b918290555090505f5b602081101562001eaf578082901c60011660010362001e5557826033826020811062001e4d5762001e4d62003aa5565b015550505050565b6033816020811062001e6b5762001e6b62003aa5565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001ea69062003aff565b91505062001e1d565b5062001eba62003d95565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001f4562001130565b6040518263ffffffff1660e01b815260040162001f6491815260200190565b5f604051808303815f87803b15801562001f7c575f80fd5b505af115801562001458573d5f803e3d5ffd5b62001fa08b63ffffffff1662002c84565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af11580156200203f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002065919062003bab565b9050805f03620020a0576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8881166101009092041614620020ea576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff16620021075750896200210a565b508a5b620021336200212a848c8c8c8c8c8c8c604051620008b1929190620037b0565b8f8f8462001c30565b6200216a576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001eba9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002ce8565b5f54610100900460ff16620022e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b620006e062002dfa565b60026001540362002360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401620012d8565b6002600155565b5f62002377600482848662003dc2565b620023829162003deb565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620025fc575f808080808080620023e4896004818d62003dc2565b810190620023f3919062003e34565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002467576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff86163014620024b7576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a8514620024f1576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620025ac919062003810565b5f604051808303815f865af19150503d805f8114620025e7576040519150601f19603f3d011682016040523d82523d5f602084013e620025ec565b606091505b50505050505050505050620009a4565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002678576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806200268f8a6004818e62003dc2565b8101906200269e919062003e8a565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002714576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002764576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002828919062003810565b5f604051808303815f865af19150503d805f811462002863576040519150601f19603f3d011682016040523d82523d5f602084013e62002868565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014589085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401620021cd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff8616916200295d919062003810565b5f60405180830381855afa9150503d805f811462002997576040519150601f19603f3d011682016040523d82523d5f602084013e6200299c565b606091505b509150915081620029e3576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d10565b62001d108162002e92565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002a71919062003810565b5f60405180830381855afa9150503d805f811462002aab576040519150601f19603f3d011682016040523d82523d5f602084013e62002ab0565b606091505b509150915081620029e3576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d10565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff86169162002b79919062003810565b5f60405180830381855afa9150503d805f811462002bb3576040519150601f19603f3d011682016040523d82523d5f602084013e62002bb8565b606091505b509150915081801562002bcc575080516020145b62002bd957601262001d10565b8080602001905181019062001d10919062003f11565b60018055565b60685460ff1662002c32576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009a4576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002d4b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200307d9092919063ffffffff16565b80519091501562001eba578080602001905181019062002d6c919062003f2f565b62001eba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401620012d8565b5f54610100900460ff1662002bef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b6060604082511062002eb457818060200190518101906200077e919062003f4d565b81516020036200303f575f5b60208110801562002f0b575082818151811062002ee15762002ee162003aa5565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002f26578062002f1d8162003aff565b91505062002ec0565b805f0362002f6957505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff81111562002f865762002f86620037bf565b6040519080825280601f01601f19166020018201604052801562002fb1576020820181803683370190505b5090505f5b82811015620030375784818151811062002fd45762002fd462003aa5565b602001015160f81c60f81b82828151811062002ff45762002ff462003aa5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350806200302e8162003aff565b91505062002fb6565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d1084845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051620030b2919062003810565b5f6040518083038185875af1925050503d805f8114620030ee576040519150601f19603f3d011682016040523d82523d5f602084013e620030f3565b606091505b5091509150620031068783838762003111565b979650505050505050565b60608315620031ab5782515f03620031a35773ffffffffffffffffffffffffffffffffffffffff85163b620031a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620012d8565b508162001d10565b62001d108383815115620031c25781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620012d8919062003fc8565b611b0d8062003fdd83390190565b803563ffffffff8116811462003078575f80fd5b73ffffffffffffffffffffffffffffffffffffffff811681146200323c575f80fd5b50565b5f806040838503121562003251575f80fd5b6200325c8362003206565b915060208301356200326e816200321a565b809150509250929050565b80151581146200323c575f80fd5b5f8083601f84011262003298575f80fd5b50813567ffffffffffffffff811115620032b0575f80fd5b602083019150836020828501011115620032c8575f80fd5b9250929050565b5f805f805f60808688031215620032e4575f80fd5b620032ef8662003206565b9450602086013562003301816200321a565b93506040860135620033138162003279565b9250606086013567ffffffffffffffff8111156200332f575f80fd5b6200333d8882890162003287565b969995985093965092949392505050565b8061040081018310156200077e575f80fd5b5f805f805f805f805f805f6105208c8e0312156200337c575f80fd5b620033888d8d6200334e565b9a50620033996104008d0162003206565b99506104208c013598506104408c01359750620033ba6104608d0162003206565b96506104808c0135620033cd816200321a565b9550620033de6104a08d0162003206565b94506104c08c0135620033f1816200321a565b93506104e08c013592506105008c013567ffffffffffffffff81111562003416575f80fd5b620034248e828f0162003287565b915080935050809150509295989b509295989b9093969950565b5f602082840312156200344f575f80fd5b81356200345c816200321a565b9392505050565b60ff811681146200323c575f80fd5b5f805f805f805f60e0888a03121562003489575f80fd5b8735620034968162003463565b9650620034a66020890162003206565b95506040880135620034b8816200321a565b9450620034c86060890162003206565b93506080880135620034da816200321a565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156200350a575f80fd5b620035158462003206565b9250602084013562003527816200321a565b9150604084013562003539816200321a565b809150509250925092565b5f6020828403121562003555575f80fd5b5035919050565b5f805f805f805f60a0888a03121562003573575f80fd5b6200357e8862003206565b9650602088013562003590816200321a565b9550604088013567ffffffffffffffff80821115620035ad575f80fd5b620035bb8b838c0162003287565b909750955060608a0135915080821115620035d4575f80fd5b50620035e38a828b0162003287565b9094509250506080880135620035f98162003463565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003620575f80fd5b6200362b8862003206565b965060208801356200363d816200321a565b955060408801359450606088013562003656816200321a565b93506080880135620036688162003279565b925060a088013567ffffffffffffffff81111562003684575f80fd5b620036928a828b0162003287565b989b979a50959850939692959293505050565b5f805f806104608587031215620036ba575f80fd5b84359350620036cd86602087016200334e565b9250620036de610420860162003206565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620037968285018789620036ef565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003808578181015183820152602001620037ee565b50505f910152565b5f825162003823818460208701620037ec565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715620038775762003877620037bf565b604052919050565b5f67ffffffffffffffff8211156200389b576200389b620037bf565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112620038d7575f80fd5b8135620038ee620038e8826200387f565b6200382d565b81815284602083860101111562003903575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003932575f80fd5b833567ffffffffffffffff808211156200394a575f80fd5b6200395887838801620038c7565b945060208601359150808211156200396e575f80fd5b506200397d86828701620038c7565b9250506040840135620035398162003463565b5f8151808452620039a9816020860160208601620037ec565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f620039ef606083018662003990565b828103602084015262003a03818662003990565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff80871660208401528086166040840152506080606083015262003106608083018486620036ef565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003a9b606083018486620036ef565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003b325762003b3262003ad2565b5060010190565b606081525f62003b4e606083018789620036ef565b828103602084015262003b63818688620036ef565b91505060ff831660408301529695505050505050565b5f835162003b8c818460208801620037ec565b83519083019062003ba2818360208801620037ec565b01949350505050565b5f6020828403121562003bbc575f80fd5b5051919050565b818103818111156200077e576200077e62003ad2565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003c388285018762003990565b925080851660e085015250509998505050505050505050565b600181815b8085111562003cb057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003c945762003c9462003ad2565b8085161562003ca257918102915b93841c939080029062003c56565b509250929050565b5f8262003cc8575060016200077e565b8162003cd657505f6200077e565b816001811462003cef576002811462003cfa5762003d1a565b60019150506200077e565b60ff84111562003d0e5762003d0e62003ad2565b50506001821b6200077e565b5060208310610133831016604e8410600b841016171562003d3f575081810a6200077e565b62003d4b838362003c51565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d805762003d8062003ad2565b029392505050565b5f6200345c838362003cb8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f808585111562003dd1575f80fd5b8386111562003dde575f80fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003e2c5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562003e4b575f80fd5b873562003e58816200321a565b9650602088013562003e6a816200321a565b955060408801359450606088013593506080880135620034da8162003463565b5f805f805f805f80610100898b03121562003ea3575f80fd5b883562003eb0816200321a565b9750602089013562003ec2816200321a565b96506040890135955060608901359450608089013562003ee28162003279565b935060a089013562003ef48162003463565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562003f22575f80fd5b81516200345c8162003463565b5f6020828403121562003f40575f80fd5b81516200345c8162003279565b5f6020828403121562003f5e575f80fd5b815167ffffffffffffffff81111562003f75575f80fd5b8201601f8101841362003f86575f80fd5b805162003f97620038e8826200387f565b81815285602083850101111562003fac575f80fd5b62003fbf826020830160208601620037ec565b95945050505050565b602081525f6200345c60208301846200399056fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a2646970667358221220dc5d0800b73601716987991121b7cb66e16dc8428f7ecac637fad0c9c06ca6ed64736f6c63430008140033", + "bytecode": "0x608060405234801561000f575f80fd5b50615b1f8061001d5f395ff3fe60806040526004361062000197575f3560e01c8063647c576c11620000e2578063be5831c71162000086578063dbc16976116200005e578063dbc16976146200061a578063ee25560b1462000631578063fb5708341462000660575f80fd5b8063be5831c71462000591578063cd58657914620005cc578063d02103ca14620005e3575f80fd5b80639e34070f11620000ba5780639e34070f14620004f1578063aaa13cc21462000534578063bab161bf1462000558575f80fd5b8063647c576c146200047157806379e2cf97146200049557806381b1c17414620004ac575f80fd5b80632d2c9d94116200014a57806334ac9cf2116200012257806334ac9cf2146200033a5780633ae0504714620003685780633e197043146200037f575f80fd5b80632d2c9d9414620002695780632dfdf0b5146200028d578063318aee3d14620002b3575f80fd5b806322e95f2c116200017e57806322e95f2c14620001e4578063240ff378146200022e5780632cffd02e1462000245575f80fd5b806315064c96146200019b5780632072f6c514620001cb575b5f80fd5b348015620001a7575f80fd5b50606854620001b69060ff1681565b60405190151581526020015b60405180910390f35b348015620001d7575f80fd5b50620001e262000684565b005b348015620001f0575f80fd5b5062000208620002023660046200323f565b620006e2565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001c2565b620001e26200023f366004620032cf565b62000784565b34801562000251575f80fd5b50620001e26200026336600462003360565b620009ab565b34801562000275575f80fd5b50620001e26200028736600462003360565b62000f30565b34801562000299575f80fd5b50620002a460535481565b604051908152602001620001c2565b348015620002bf575f80fd5b5062000308620002d13660046200343e565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001c2565b34801562000346575f80fd5b50606c54620002089073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000374575f80fd5b50620002a462001130565b3480156200038b575f80fd5b50620002a46200039d36600462003472565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200047d575f80fd5b50620001e26200048f366004620034f7565b62001215565b348015620004a1575f80fd5b50620001e26200145e565b348015620004b8575f80fd5b5062000208620004ca36600462003544565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620004fd575f80fd5b50620001b66200050f36600462003544565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b34801562000540575f80fd5b5062000208620005523660046200355c565b62001498565b34801562000564575f80fd5b506068546200057b90610100900463ffffffff1681565b60405163ffffffff9091168152602001620001c2565b3480156200059d575f80fd5b506068546200057b90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001e2620005dd36600462003609565b62001682565b348015620005ef575f80fd5b50606854620002089065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000626575f80fd5b50620001e262001bd4565b3480156200063d575f80fd5b50620002a46200064f36600462003544565b60696020525f908152604090205481565b3480156200066c575f80fd5b50620001b66200067e366004620036a5565b62001c30565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006d6576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062001d18565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007c2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620007e85750600263ffffffff861610155b1562000820576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620008769998979695949392919062003736565b60405180910390a1620009936200098d6001606860019054906101000a900463ffffffff16338989348989604051620008b1929190620037b0565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001dab565b8215620009a457620009a462001ebf565b5050505050565b60685460ff1615620009e9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620009ff8b8b8b8b8b8b8b8b8b8b8b5f62001f8f565b73ffffffffffffffffffffffffffffffffffffffff861662000ad757604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a53919062003810565b5f6040518083038185875af1925050503d805f811462000a8f576040519150601f19603f3d011682016040523d82523d5f602084013e62000a94565b606091505b505090508062000ad0576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000eb8565b60685463ffffffff61010090910481169088160362000b195762000b1373ffffffffffffffffffffffffffffffffffffffff871685856200217a565b62000eb8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e2f575f808062000beb868801886200391f565b9250925092505f8584848460405162000c0490620031f8565b62000c1293929190620039db565b8190604051809103905ff590508015801562000c30573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000ca3575f80fd5b505af115801562000cb6573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e1d95949392919062003a17565b60405180910390a15050505062000eb5565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562000e9d575f80fd5b505af115801562000eb0573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000f6e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000f858b8b8b8b8b8b8b8b8b8b8b600162001f8f565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000fb7949392919062003a5e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200103a919062003810565b5f6040518083038185875af1925050503d805f811462001076576040519150601f19603f3d011682016040523d82523d5f602084013e6200107b565b606091505b5050905080620010b7576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200120c578083901c6001166001036200119d576033816020811062001169576200116962003aa5565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620011ca565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620012039062003aff565b9150506200113a565b50919392505050565b5f54610100900460ff16158080156200123457505f54600160ff909116105b806200124f5750303b1580156200124f57505f5460ff166001145b620012e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200133e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016918416919091179055620013f562002250565b801562001458575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620006e057620006e062001ebf565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b3083604051806020016200152c90620031f8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905262001577908d908d908d908d908d9060200162003b39565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052620015b5929160200162003b79565b604051602081830303815290604052805190602001206040516020016200163e94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff1615620016c0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620016ca620022f2565b60685463ffffffff888116610100909204161480620016f05750600263ffffffff881610155b1562001728576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff88166200178c5788341462001783576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f925062001a79565b3415620017c5576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620018ae576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b15801562001884575f80fd5b505af115801562001897573d5f803e3d5ffd5b5050505080602001519450805f0151935062001a77565b8515620018c357620018c3898b898962002367565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200192e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001954919062003bab565b90506200197a73ffffffffffffffffffffffffffffffffffffffff8b1633308e6200287a565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015620019e5573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001a0b919062003bab565b905062001a19828262003bc3565b6068548c9850610100900463ffffffff169650935062001a3987620028da565b62001a448c620029ee565b62001a4f8d62002af7565b60405160200162001a6393929190620039db565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e868860535460405162001aba98979695949392919062003bd9565b60405180910390a162001bac6200098d5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b861562001bbd5762001bbd62001ebf565b5050505062001bcb60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c26576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062002bf5565b5f84815b602081101562001d0a57600163ffffffff8616821c8116900362001ca65785816020811062001c675762001c6762003aa5565b60200201358260405160200162001c88929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001cf5565b8186826020811062001cbc5762001cbc62003aa5565b602002013560405160200162001cdc929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d018162003aff565b91505062001c34565b50821490505b949350505050565b60685460ff161562001d56576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001dbc6020600262003d88565b62001dc8919062003bc3565b6053541062001e03576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001e149062003aff565b918290555090505f5b602081101562001eaf578082901c60011660010362001e5557826033826020811062001e4d5762001e4d62003aa5565b015550505050565b6033816020811062001e6b5762001e6b62003aa5565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001ea69062003aff565b91505062001e1d565b5062001eba62003d95565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001f4562001130565b6040518263ffffffff1660e01b815260040162001f6491815260200190565b5f604051808303815f87803b15801562001f7c575f80fd5b505af115801562001458573d5f803e3d5ffd5b62001fa08b63ffffffff1662002c84565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af11580156200203f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002065919062003bab565b9050805f03620020a0576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8881166101009092041614620020ea576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff16620021075750896200210a565b508a5b620021336200212a848c8c8c8c8c8c8c604051620008b1929190620037b0565b8f8f8462001c30565b6200216a576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001eba9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002ce8565b5f54610100900460ff16620022e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b620006e062002dfa565b60026001540362002360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401620012d8565b6002600155565b5f62002377600482848662003dc2565b620023829162003deb565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620025fc575f808080808080620023e4896004818d62003dc2565b810190620023f3919062003e34565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002467576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff86163014620024b7576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a8514620024f1576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620025ac919062003810565b5f604051808303815f865af19150503d805f8114620025e7576040519150601f19603f3d011682016040523d82523d5f602084013e620025ec565b606091505b50505050505050505050620009a4565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002678576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806200268f8a6004818e62003dc2565b8101906200269e919062003e8a565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002714576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002764576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002828919062003810565b5f604051808303815f865af19150503d805f811462002863576040519150601f19603f3d011682016040523d82523d5f602084013e62002868565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014589085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401620021cd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff8616916200295d919062003810565b5f60405180830381855afa9150503d805f811462002997576040519150601f19603f3d011682016040523d82523d5f602084013e6200299c565b606091505b509150915081620029e3576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d10565b62001d108162002e92565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002a71919062003810565b5f60405180830381855afa9150503d805f811462002aab576040519150601f19603f3d011682016040523d82523d5f602084013e62002ab0565b606091505b509150915081620029e3576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d10565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff86169162002b79919062003810565b5f60405180830381855afa9150503d805f811462002bb3576040519150601f19603f3d011682016040523d82523d5f602084013e62002bb8565b606091505b509150915081801562002bcc575080516020145b62002bd957601262001d10565b8080602001905181019062001d10919062003f11565b60018055565b60685460ff1662002c32576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009a4576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002d4b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200307d9092919063ffffffff16565b80519091501562001eba578080602001905181019062002d6c919062003f2f565b62001eba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401620012d8565b5f54610100900460ff1662002bef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b6060604082511062002eb457818060200190518101906200077e919062003f4d565b81516020036200303f575f5b60208110801562002f0b575082818151811062002ee15762002ee162003aa5565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002f26578062002f1d8162003aff565b91505062002ec0565b805f0362002f6957505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff81111562002f865762002f86620037bf565b6040519080825280601f01601f19166020018201604052801562002fb1576020820181803683370190505b5090505f5b82811015620030375784818151811062002fd45762002fd462003aa5565b602001015160f81c60f81b82828151811062002ff45762002ff462003aa5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350806200302e8162003aff565b91505062002fb6565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d1084845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051620030b2919062003810565b5f6040518083038185875af1925050503d805f8114620030ee576040519150601f19603f3d011682016040523d82523d5f602084013e620030f3565b606091505b5091509150620031068783838762003111565b979650505050505050565b60608315620031ab5782515f03620031a35773ffffffffffffffffffffffffffffffffffffffff85163b620031a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620012d8565b508162001d10565b62001d108383815115620031c25781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620012d8919062003fc8565b611b0d8062003fdd83390190565b803563ffffffff8116811462003078575f80fd5b73ffffffffffffffffffffffffffffffffffffffff811681146200323c575f80fd5b50565b5f806040838503121562003251575f80fd5b6200325c8362003206565b915060208301356200326e816200321a565b809150509250929050565b80151581146200323c575f80fd5b5f8083601f84011262003298575f80fd5b50813567ffffffffffffffff811115620032b0575f80fd5b602083019150836020828501011115620032c8575f80fd5b9250929050565b5f805f805f60808688031215620032e4575f80fd5b620032ef8662003206565b9450602086013562003301816200321a565b93506040860135620033138162003279565b9250606086013567ffffffffffffffff8111156200332f575f80fd5b6200333d8882890162003287565b969995985093965092949392505050565b8061040081018310156200077e575f80fd5b5f805f805f805f805f805f6105208c8e0312156200337c575f80fd5b620033888d8d6200334e565b9a50620033996104008d0162003206565b99506104208c013598506104408c01359750620033ba6104608d0162003206565b96506104808c0135620033cd816200321a565b9550620033de6104a08d0162003206565b94506104c08c0135620033f1816200321a565b93506104e08c013592506105008c013567ffffffffffffffff81111562003416575f80fd5b620034248e828f0162003287565b915080935050809150509295989b509295989b9093969950565b5f602082840312156200344f575f80fd5b81356200345c816200321a565b9392505050565b60ff811681146200323c575f80fd5b5f805f805f805f60e0888a03121562003489575f80fd5b8735620034968162003463565b9650620034a66020890162003206565b95506040880135620034b8816200321a565b9450620034c86060890162003206565b93506080880135620034da816200321a565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156200350a575f80fd5b620035158462003206565b9250602084013562003527816200321a565b9150604084013562003539816200321a565b809150509250925092565b5f6020828403121562003555575f80fd5b5035919050565b5f805f805f805f60a0888a03121562003573575f80fd5b6200357e8862003206565b9650602088013562003590816200321a565b9550604088013567ffffffffffffffff80821115620035ad575f80fd5b620035bb8b838c0162003287565b909750955060608a0135915080821115620035d4575f80fd5b50620035e38a828b0162003287565b9094509250506080880135620035f98162003463565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003620575f80fd5b6200362b8862003206565b965060208801356200363d816200321a565b955060408801359450606088013562003656816200321a565b93506080880135620036688162003279565b925060a088013567ffffffffffffffff81111562003684575f80fd5b620036928a828b0162003287565b989b979a50959850939692959293505050565b5f805f806104608587031215620036ba575f80fd5b84359350620036cd86602087016200334e565b9250620036de610420860162003206565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620037968285018789620036ef565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003808578181015183820152602001620037ee565b50505f910152565b5f825162003823818460208701620037ec565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715620038775762003877620037bf565b604052919050565b5f67ffffffffffffffff8211156200389b576200389b620037bf565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112620038d7575f80fd5b8135620038ee620038e8826200387f565b6200382d565b81815284602083860101111562003903575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003932575f80fd5b833567ffffffffffffffff808211156200394a575f80fd5b6200395887838801620038c7565b945060208601359150808211156200396e575f80fd5b506200397d86828701620038c7565b9250506040840135620035398162003463565b5f8151808452620039a9816020860160208601620037ec565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f620039ef606083018662003990565b828103602084015262003a03818662003990565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff80871660208401528086166040840152506080606083015262003106608083018486620036ef565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003a9b606083018486620036ef565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003b325762003b3262003ad2565b5060010190565b606081525f62003b4e606083018789620036ef565b828103602084015262003b63818688620036ef565b91505060ff831660408301529695505050505050565b5f835162003b8c818460208801620037ec565b83519083019062003ba2818360208801620037ec565b01949350505050565b5f6020828403121562003bbc575f80fd5b5051919050565b818103818111156200077e576200077e62003ad2565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003c388285018762003990565b925080851660e085015250509998505050505050505050565b600181815b8085111562003cb057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003c945762003c9462003ad2565b8085161562003ca257918102915b93841c939080029062003c56565b509250929050565b5f8262003cc8575060016200077e565b8162003cd657505f6200077e565b816001811462003cef576002811462003cfa5762003d1a565b60019150506200077e565b60ff84111562003d0e5762003d0e62003ad2565b50506001821b6200077e565b5060208310610133831016604e8410600b841016171562003d3f575081810a6200077e565b62003d4b838362003c51565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d805762003d8062003ad2565b029392505050565b5f6200345c838362003cb8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f808585111562003dd1575f80fd5b8386111562003dde575f80fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003e2c5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562003e4b575f80fd5b873562003e58816200321a565b9650602088013562003e6a816200321a565b955060408801359450606088013593506080880135620034da8162003463565b5f805f805f805f80610100898b03121562003ea3575f80fd5b883562003eb0816200321a565b9750602089013562003ec2816200321a565b96506040890135955060608901359450608089013562003ee28162003279565b935060a089013562003ef48162003463565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562003f22575f80fd5b81516200345c8162003463565b5f6020828403121562003f40575f80fd5b81516200345c8162003279565b5f6020828403121562003f5e575f80fd5b815167ffffffffffffffff81111562003f75575f80fd5b8201601f8101841362003f86575f80fd5b805162003f97620038e8826200387f565b81815285602083850101111562003fac575f80fd5b62003fbf826020830160208601620037ec565b95945050505050565b602081525f6200345c60208301846200399056fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a26469706673582212204bf5435ffe476836b9a1ac833105603f477cc35a320609487acf64f513eae07564736f6c63430008140033", + "deployedBytecode": "0x60806040526004361062000197575f3560e01c8063647c576c11620000e2578063be5831c71162000086578063dbc16976116200005e578063dbc16976146200061a578063ee25560b1462000631578063fb5708341462000660575f80fd5b8063be5831c71462000591578063cd58657914620005cc578063d02103ca14620005e3575f80fd5b80639e34070f11620000ba5780639e34070f14620004f1578063aaa13cc21462000534578063bab161bf1462000558575f80fd5b8063647c576c146200047157806379e2cf97146200049557806381b1c17414620004ac575f80fd5b80632d2c9d94116200014a57806334ac9cf2116200012257806334ac9cf2146200033a5780633ae0504714620003685780633e197043146200037f575f80fd5b80632d2c9d9414620002695780632dfdf0b5146200028d578063318aee3d14620002b3575f80fd5b806322e95f2c116200017e57806322e95f2c14620001e4578063240ff378146200022e5780632cffd02e1462000245575f80fd5b806315064c96146200019b5780632072f6c514620001cb575b5f80fd5b348015620001a7575f80fd5b50606854620001b69060ff1681565b60405190151581526020015b60405180910390f35b348015620001d7575f80fd5b50620001e262000684565b005b348015620001f0575f80fd5b5062000208620002023660046200323f565b620006e2565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001c2565b620001e26200023f366004620032cf565b62000784565b34801562000251575f80fd5b50620001e26200026336600462003360565b620009ab565b34801562000275575f80fd5b50620001e26200028736600462003360565b62000f30565b34801562000299575f80fd5b50620002a460535481565b604051908152602001620001c2565b348015620002bf575f80fd5b5062000308620002d13660046200343e565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001c2565b34801562000346575f80fd5b50606c54620002089073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000374575f80fd5b50620002a462001130565b3480156200038b575f80fd5b50620002a46200039d36600462003472565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200047d575f80fd5b50620001e26200048f366004620034f7565b62001215565b348015620004a1575f80fd5b50620001e26200145e565b348015620004b8575f80fd5b5062000208620004ca36600462003544565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620004fd575f80fd5b50620001b66200050f36600462003544565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b34801562000540575f80fd5b5062000208620005523660046200355c565b62001498565b34801562000564575f80fd5b506068546200057b90610100900463ffffffff1681565b60405163ffffffff9091168152602001620001c2565b3480156200059d575f80fd5b506068546200057b90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001e2620005dd36600462003609565b62001682565b348015620005ef575f80fd5b50606854620002089065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000626575f80fd5b50620001e262001bd4565b3480156200063d575f80fd5b50620002a46200064f36600462003544565b60696020525f908152604090205481565b3480156200066c575f80fd5b50620001b66200067e366004620036a5565b62001c30565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006d6576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062001d18565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007c2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620007e85750600263ffffffff861610155b1562000820576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620008769998979695949392919062003736565b60405180910390a1620009936200098d6001606860019054906101000a900463ffffffff16338989348989604051620008b1929190620037b0565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001dab565b8215620009a457620009a462001ebf565b5050505050565b60685460ff1615620009e9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620009ff8b8b8b8b8b8b8b8b8b8b8b5f62001f8f565b73ffffffffffffffffffffffffffffffffffffffff861662000ad757604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a53919062003810565b5f6040518083038185875af1925050503d805f811462000a8f576040519150601f19603f3d011682016040523d82523d5f602084013e62000a94565b606091505b505090508062000ad0576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000eb8565b60685463ffffffff61010090910481169088160362000b195762000b1373ffffffffffffffffffffffffffffffffffffffff871685856200217a565b62000eb8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e2f575f808062000beb868801886200391f565b9250925092505f8584848460405162000c0490620031f8565b62000c1293929190620039db565b8190604051809103905ff590508015801562000c30573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000ca3575f80fd5b505af115801562000cb6573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e1d95949392919062003a17565b60405180910390a15050505062000eb5565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562000e9d575f80fd5b505af115801562000eb0573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000f6e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000f858b8b8b8b8b8b8b8b8b8b8b600162001f8f565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000fb7949392919062003a5e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200103a919062003810565b5f6040518083038185875af1925050503d805f811462001076576040519150601f19603f3d011682016040523d82523d5f602084013e6200107b565b606091505b5050905080620010b7576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200120c578083901c6001166001036200119d576033816020811062001169576200116962003aa5565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620011ca565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620012039062003aff565b9150506200113a565b50919392505050565b5f54610100900460ff16158080156200123457505f54600160ff909116105b806200124f5750303b1580156200124f57505f5460ff166001145b620012e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200133e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016918416919091179055620013f562002250565b801562001458575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620006e057620006e062001ebf565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b3083604051806020016200152c90620031f8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905262001577908d908d908d908d908d9060200162003b39565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052620015b5929160200162003b79565b604051602081830303815290604052805190602001206040516020016200163e94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff1615620016c0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620016ca620022f2565b60685463ffffffff888116610100909204161480620016f05750600263ffffffff881610155b1562001728576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff88166200178c5788341462001783576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f925062001a79565b3415620017c5576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620018ae576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b15801562001884575f80fd5b505af115801562001897573d5f803e3d5ffd5b5050505080602001519450805f0151935062001a77565b8515620018c357620018c3898b898962002367565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200192e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001954919062003bab565b90506200197a73ffffffffffffffffffffffffffffffffffffffff8b1633308e6200287a565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015620019e5573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001a0b919062003bab565b905062001a19828262003bc3565b6068548c9850610100900463ffffffff169650935062001a3987620028da565b62001a448c620029ee565b62001a4f8d62002af7565b60405160200162001a6393929190620039db565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e868860535460405162001aba98979695949392919062003bd9565b60405180910390a162001bac6200098d5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b861562001bbd5762001bbd62001ebf565b5050505062001bcb60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c26576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062002bf5565b5f84815b602081101562001d0a57600163ffffffff8616821c8116900362001ca65785816020811062001c675762001c6762003aa5565b60200201358260405160200162001c88929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001cf5565b8186826020811062001cbc5762001cbc62003aa5565b602002013560405160200162001cdc929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d018162003aff565b91505062001c34565b50821490505b949350505050565b60685460ff161562001d56576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001dbc6020600262003d88565b62001dc8919062003bc3565b6053541062001e03576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001e149062003aff565b918290555090505f5b602081101562001eaf578082901c60011660010362001e5557826033826020811062001e4d5762001e4d62003aa5565b015550505050565b6033816020811062001e6b5762001e6b62003aa5565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001ea69062003aff565b91505062001e1d565b5062001eba62003d95565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001f4562001130565b6040518263ffffffff1660e01b815260040162001f6491815260200190565b5f604051808303815f87803b15801562001f7c575f80fd5b505af115801562001458573d5f803e3d5ffd5b62001fa08b63ffffffff1662002c84565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af11580156200203f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002065919062003bab565b9050805f03620020a0576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8881166101009092041614620020ea576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff16620021075750896200210a565b508a5b620021336200212a848c8c8c8c8c8c8c604051620008b1929190620037b0565b8f8f8462001c30565b6200216a576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001eba9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002ce8565b5f54610100900460ff16620022e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b620006e062002dfa565b60026001540362002360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401620012d8565b6002600155565b5f62002377600482848662003dc2565b620023829162003deb565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620025fc575f808080808080620023e4896004818d62003dc2565b810190620023f3919062003e34565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002467576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff86163014620024b7576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a8514620024f1576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620025ac919062003810565b5f604051808303815f865af19150503d805f8114620025e7576040519150601f19603f3d011682016040523d82523d5f602084013e620025ec565b606091505b50505050505050505050620009a4565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002678576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806200268f8a6004818e62003dc2565b8101906200269e919062003e8a565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002714576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002764576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002828919062003810565b5f604051808303815f865af19150503d805f811462002863576040519150601f19603f3d011682016040523d82523d5f602084013e62002868565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014589085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401620021cd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff8616916200295d919062003810565b5f60405180830381855afa9150503d805f811462002997576040519150601f19603f3d011682016040523d82523d5f602084013e6200299c565b606091505b509150915081620029e3576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d10565b62001d108162002e92565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002a71919062003810565b5f60405180830381855afa9150503d805f811462002aab576040519150601f19603f3d011682016040523d82523d5f602084013e62002ab0565b606091505b509150915081620029e3576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d10565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff86169162002b79919062003810565b5f60405180830381855afa9150503d805f811462002bb3576040519150601f19603f3d011682016040523d82523d5f602084013e62002bb8565b606091505b509150915081801562002bcc575080516020145b62002bd957601262001d10565b8080602001905181019062001d10919062003f11565b60018055565b60685460ff1662002c32576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009a4576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002d4b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200307d9092919063ffffffff16565b80519091501562001eba578080602001905181019062002d6c919062003f2f565b62001eba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401620012d8565b5f54610100900460ff1662002bef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b6060604082511062002eb457818060200190518101906200077e919062003f4d565b81516020036200303f575f5b60208110801562002f0b575082818151811062002ee15762002ee162003aa5565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002f26578062002f1d8162003aff565b91505062002ec0565b805f0362002f6957505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff81111562002f865762002f86620037bf565b6040519080825280601f01601f19166020018201604052801562002fb1576020820181803683370190505b5090505f5b82811015620030375784818151811062002fd45762002fd462003aa5565b602001015160f81c60f81b82828151811062002ff45762002ff462003aa5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350806200302e8162003aff565b91505062002fb6565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d1084845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051620030b2919062003810565b5f6040518083038185875af1925050503d805f8114620030ee576040519150601f19603f3d011682016040523d82523d5f602084013e620030f3565b606091505b5091509150620031068783838762003111565b979650505050505050565b60608315620031ab5782515f03620031a35773ffffffffffffffffffffffffffffffffffffffff85163b620031a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620012d8565b508162001d10565b62001d108383815115620031c25781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620012d8919062003fc8565b611b0d8062003fdd83390190565b803563ffffffff8116811462003078575f80fd5b73ffffffffffffffffffffffffffffffffffffffff811681146200323c575f80fd5b50565b5f806040838503121562003251575f80fd5b6200325c8362003206565b915060208301356200326e816200321a565b809150509250929050565b80151581146200323c575f80fd5b5f8083601f84011262003298575f80fd5b50813567ffffffffffffffff811115620032b0575f80fd5b602083019150836020828501011115620032c8575f80fd5b9250929050565b5f805f805f60808688031215620032e4575f80fd5b620032ef8662003206565b9450602086013562003301816200321a565b93506040860135620033138162003279565b9250606086013567ffffffffffffffff8111156200332f575f80fd5b6200333d8882890162003287565b969995985093965092949392505050565b8061040081018310156200077e575f80fd5b5f805f805f805f805f805f6105208c8e0312156200337c575f80fd5b620033888d8d6200334e565b9a50620033996104008d0162003206565b99506104208c013598506104408c01359750620033ba6104608d0162003206565b96506104808c0135620033cd816200321a565b9550620033de6104a08d0162003206565b94506104c08c0135620033f1816200321a565b93506104e08c013592506105008c013567ffffffffffffffff81111562003416575f80fd5b620034248e828f0162003287565b915080935050809150509295989b509295989b9093969950565b5f602082840312156200344f575f80fd5b81356200345c816200321a565b9392505050565b60ff811681146200323c575f80fd5b5f805f805f805f60e0888a03121562003489575f80fd5b8735620034968162003463565b9650620034a66020890162003206565b95506040880135620034b8816200321a565b9450620034c86060890162003206565b93506080880135620034da816200321a565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156200350a575f80fd5b620035158462003206565b9250602084013562003527816200321a565b9150604084013562003539816200321a565b809150509250925092565b5f6020828403121562003555575f80fd5b5035919050565b5f805f805f805f60a0888a03121562003573575f80fd5b6200357e8862003206565b9650602088013562003590816200321a565b9550604088013567ffffffffffffffff80821115620035ad575f80fd5b620035bb8b838c0162003287565b909750955060608a0135915080821115620035d4575f80fd5b50620035e38a828b0162003287565b9094509250506080880135620035f98162003463565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003620575f80fd5b6200362b8862003206565b965060208801356200363d816200321a565b955060408801359450606088013562003656816200321a565b93506080880135620036688162003279565b925060a088013567ffffffffffffffff81111562003684575f80fd5b620036928a828b0162003287565b989b979a50959850939692959293505050565b5f805f806104608587031215620036ba575f80fd5b84359350620036cd86602087016200334e565b9250620036de610420860162003206565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620037968285018789620036ef565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003808578181015183820152602001620037ee565b50505f910152565b5f825162003823818460208701620037ec565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715620038775762003877620037bf565b604052919050565b5f67ffffffffffffffff8211156200389b576200389b620037bf565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112620038d7575f80fd5b8135620038ee620038e8826200387f565b6200382d565b81815284602083860101111562003903575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003932575f80fd5b833567ffffffffffffffff808211156200394a575f80fd5b6200395887838801620038c7565b945060208601359150808211156200396e575f80fd5b506200397d86828701620038c7565b9250506040840135620035398162003463565b5f8151808452620039a9816020860160208601620037ec565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f620039ef606083018662003990565b828103602084015262003a03818662003990565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff80871660208401528086166040840152506080606083015262003106608083018486620036ef565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003a9b606083018486620036ef565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003b325762003b3262003ad2565b5060010190565b606081525f62003b4e606083018789620036ef565b828103602084015262003b63818688620036ef565b91505060ff831660408301529695505050505050565b5f835162003b8c818460208801620037ec565b83519083019062003ba2818360208801620037ec565b01949350505050565b5f6020828403121562003bbc575f80fd5b5051919050565b818103818111156200077e576200077e62003ad2565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003c388285018762003990565b925080851660e085015250509998505050505050505050565b600181815b8085111562003cb057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003c945762003c9462003ad2565b8085161562003ca257918102915b93841c939080029062003c56565b509250929050565b5f8262003cc8575060016200077e565b8162003cd657505f6200077e565b816001811462003cef576002811462003cfa5762003d1a565b60019150506200077e565b60ff84111562003d0e5762003d0e62003ad2565b50506001821b6200077e565b5060208310610133831016604e8410600b841016171562003d3f575081810a6200077e565b62003d4b838362003c51565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d805762003d8062003ad2565b029392505050565b5f6200345c838362003cb8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f808585111562003dd1575f80fd5b8386111562003dde575f80fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003e2c5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562003e4b575f80fd5b873562003e58816200321a565b9650602088013562003e6a816200321a565b955060408801359450606088013593506080880135620034da8162003463565b5f805f805f805f80610100898b03121562003ea3575f80fd5b883562003eb0816200321a565b9750602089013562003ec2816200321a565b96506040890135955060608901359450608089013562003ee28162003279565b935060a089013562003ef48162003463565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562003f22575f80fd5b81516200345c8162003463565b5f6020828403121562003f40575f80fd5b81516200345c8162003279565b5f6020828403121562003f5e575f80fd5b815167ffffffffffffffff81111562003f75575f80fd5b8201601f8101841362003f86575f80fd5b805162003f97620038e8826200387f565b81815285602083850101111562003fac575f80fd5b62003fbf826020830160208601620037ec565b95945050505050565b602081525f6200345c60208301846200399056fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a26469706673582212204bf5435ffe476836b9a1ac833105603f477cc35a320609487acf64f513eae07564736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMBridgeMock.json b/compiled-contracts/PolygonZkEVMBridgeMock.json index 92344c1f0..a39dd33d9 100644 --- a/compiled-contracts/PolygonZkEVMBridgeMock.json +++ b/compiled-contracts/PolygonZkEVMBridgeMock.json @@ -867,8 +867,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561000f575f80fd5b50615f348061001d5f395ff3fe608060405260043610620001df575f3560e01c8063715018a61162000106578063bab161bf116200009e578063dbc16976116200006a578063dbc169761462000704578063ee25560b146200071b578063f2fde38b146200074a578063fb570834146200076e575f80fd5b8063bab161bf1462000642578063be5831c7146200067b578063cd58657914620006b6578063d02103ca14620006cd575f80fd5b80638da5cb5b11620000de5780638da5cb5b146200059857806391e57e2d14620005c45780639e34070f14620005db578063aaa13cc2146200061e575f80fd5b8063715018a6146200052557806379e2cf97146200053c57806381b1c1741462000553575f80fd5b80632d2c9d94116200017a57806334ac9cf2116200015257806334ac9cf214620003ca5780633ae0504714620003f85780633e197043146200040f578063647c576c1462000501575f80fd5b80632d2c9d9414620002f95780632dfdf0b5146200031d578063318aee3d1462000343575f80fd5b8063240ff37811620001ba578063240ff37814620002765780632b5e42e7146200028d5780632c3f58cd14620002b15780632cffd02e14620002d5575f80fd5b806315064c9614620001e35780632072f6c5146200021357806322e95f2c146200022c575b5f80fd5b348015620001ef575f80fd5b50606854620001fe9060ff1681565b60405190151581526020015b60405180910390f35b3480156200021f575f80fd5b506200022a62000792565b005b34801562000238575f80fd5b50620002506200024a36600462003638565b620007f0565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016200020a565b6200022a62000287366004620036c8565b62000892565b34801562000299575f80fd5b506200022a620002ab36600462003747565b62000ab9565b348015620002bd575f80fd5b506200022a620002cf3660046200375f565b62000ac8565b348015620002e1575f80fd5b506200022a620002f336600462003794565b62000b0e565b34801562000305575f80fd5b506200022a6200031736600462003794565b62001093565b34801562000329575f80fd5b506200033460535481565b6040519081526020016200020a565b3480156200034f575f80fd5b50620003986200036136600462003872565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff9091166020830152016200020a565b348015620003d6575f80fd5b50606c54620002509073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000404575f80fd5b506200033462001293565b3480156200041b575f80fd5b50620003346200042d3660046200389f565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200050d575f80fd5b506200022a6200051f36600462003924565b62001378565b34801562000531575f80fd5b506200022a620015cd565b34801562000548575f80fd5b506200022a620015e2565b3480156200055f575f80fd5b50620002506200057136600462003747565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005a4575f80fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff1662000250565b348015620005d0575f80fd5b506200033460d15481565b348015620005e7575f80fd5b50620001fe620005f936600462003747565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b3480156200062a575f80fd5b50620002506200063c36600462003971565b6200161c565b3480156200064e575f80fd5b506068546200066590610100900463ffffffff1681565b60405163ffffffff90911681526020016200020a565b34801562000687575f80fd5b506068546200066590790100000000000000000000000000000000000000000000000000900463ffffffff1681565b6200022a620006c736600462003a1e565b62001806565b348015620006d9575f80fd5b50606854620002509065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000710575f80fd5b506200022a620018da565b34801562000727575f80fd5b50620003346200073936600462003747565b60696020525f908152604090205481565b34801562000756575f80fd5b506200022a6200076836600462003872565b62001936565b3480156200077a575f80fd5b50620001fe6200078c36600462003aba565b620019f3565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620007e4576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee62001adb565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620008d0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620008f65750600263ffffffff861610155b156200092e576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009849998979695949392919062003b4b565b60405180910390a162000aa162000a9b6001606860019054906101000a900463ffffffff16338989348989604051620009bf92919062003bc5565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001b6e565b821562000ab25762000ab262001c82565b5050505050565b62000ac362001d52565b60d155565b62000ad262001d52565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b4c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b628b8b8b8b8b8b8b8b8b8b8b5f62001dd5565b73ffffffffffffffffffffffffffffffffffffffff861662000c3a57604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000bb6919062003c25565b5f6040518083038185875af1925050503d805f811462000bf2576040519150601f19603f3d011682016040523d82523d5f602084013e62000bf7565b606091505b505090508062000c33576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506200101b565b60685463ffffffff61010090910481169088160362000c7c5762000c7673ffffffffffffffffffffffffffffffffffffffff8716858562001fc0565b6200101b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000f92575f808062000d4e8688018862003d34565b9250925092505f8584848460405162000d6790620035f4565b62000d759392919062003df0565b8190604051809103905ff590508015801562000d93573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000e06575f80fd5b505af115801562000e19573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000f8095949392919062003e2c565b60405180910390a15050505062001018565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562001000575f80fd5b505af115801562001013573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff1615620010d1576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620010e88b8b8b8b8b8b8b8b8b8b8b600162001dd5565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a86866040516024016200111a949392919062003e73565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200119d919062003c25565b5f6040518083038185875af1925050503d805f8114620011d9576040519150601f19603f3d011682016040523d82523d5f602084013e620011de565b606091505b50509050806200121a576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200136f578083901c600116600103620013005760338160208110620012cc57620012cc62003eba565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200132d565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013669062003f14565b9150506200129d565b50919392505050565b5f54610100900460ff16158080156200139757505f54600160ff909116105b80620013b25750303b158015620013b257505f5460ff166001145b62001444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014a1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d1556200156462002096565b8015620015c7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b620015d762001d52565b620007ee5f62002134565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620007ee57620007ee62001c82565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180602001620016b090620035f4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620016fb908d908d908d908d908d9060200162003f4e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001739929160200162003f8e565b60405160208183030381529060405280519060200120604051602001620017c294939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d154341115620018c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200143b565b620018d187878787878787620021aa565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff1633146200192c576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee620026f3565b6200194062001d52565b73ffffffffffffffffffffffffffffffffffffffff8116620019e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200143b565b620019f08162002134565b50565b5f84815b602081101562001acd57600163ffffffff8616821c8116900362001a695785816020811062001a2a5762001a2a62003eba565b60200201358260405160200162001a4b929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001ab8565b8186826020811062001a7f5762001a7f62003eba565b602002013560405160200162001a9f929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001ac48162003f14565b915050620019f7565b50821490505b949350505050565b60685460ff161562001b19576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001b7f60206002620040f7565b62001b8b919062004104565b6053541062001bc6576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001bd79062003f14565b918290555090505f5b602081101562001c72578082901c60011660010362001c1857826033826020811062001c105762001c1062003eba565b015550505050565b6033816020811062001c2e5762001c2e62003eba565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001c699062003f14565b91505062001be0565b5062001c7d6200411a565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001d0862001293565b6040518263ffffffff1660e01b815260040162001d2791815260200190565b5f604051808303815f87803b15801562001d3f575f80fd5b505af1158015620015c7573d5f803e3d5ffd5b609f5473ffffffffffffffffffffffffffffffffffffffff163314620007ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200143b565b62001de68b63ffffffff1662002782565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af115801562001e85573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001eab919062004147565b9050805f0362001ee6576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462001f30576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff1662001f4d57508962001f50565b508a5b62001f7962001f70848c8c8c8c8c8c8c604051620009bf92919062003bc5565b8f8f84620019f3565b62001fb0576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001c7d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152620027e6565b5f54610100900460ff166200212e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200143b565b620007ee335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60685460ff1615620021e8576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620021f2620028f8565b60685463ffffffff888116610100909204161480620022185750600263ffffffff881610155b1562002250576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff8816620022b457883414620022ab576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f9250620025a1565b3415620022ed576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620023d6576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b158015620023ac575f80fd5b505af1158015620023bf573d5f803e3d5ffd5b5050505080602001519450805f015193506200259f565b8515620023eb57620023eb898b89896200296d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa15801562002456573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200247c919062004147565b9050620024a273ffffffffffffffffffffffffffffffffffffffff8b1633308e62002e80565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa1580156200250d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002533919062004147565b905062002541828262004104565b6068548c9850610100900463ffffffff1696509350620025618762002ee0565b6200256c8c62002ff4565b620025778d620030fd565b6040516020016200258b9392919062003df0565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620025e29897969594939291906200415f565b60405180910390a1620026d462000a9b5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b8615620026e557620026e562001c82565b50505050620018d160018055565b60685460ff1662002730576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000ab2576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002849826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031f59092919063ffffffff16565b80519091501562001c7d57808060200190518101906200286a9190620041d7565b62001c7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200143b565b60026001540362002966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200143b565b6002600155565b5f6200297d6004828486620041f5565b62002988916200421e565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002c02575f808080808080620029ea896004818d620041f5565b810190620029f9919062004267565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002a6d576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002abd576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002af7576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002bb2919062003c25565b5f604051808303815f865af19150503d805f811462002bed576040519150601f19603f3d011682016040523d82523d5f602084013e62002bf2565b606091505b5050505050505050505062000ab2565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002c7e576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080808080808062002c958a6004818e620041f5565b81019062002ca49190620042bd565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002d1a576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002d6a576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002e2e919062003c25565b5f604051808303815f865af19150503d805f811462002e69576040519150601f19603f3d011682016040523d82523d5f602084013e62002e6e565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620015c79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002013565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002f63919062003c25565b5f60405180830381855afa9150503d805f811462002f9d576040519150601f19603f3d011682016040523d82523d5f602084013e62002fa2565b606091505b50915091508162002fe9576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001ad3565b62001ad38162003205565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162003077919062003c25565b5f60405180830381855afa9150503d805f8114620030b1576040519150601f19603f3d011682016040523d82523d5f602084013e620030b6565b606091505b50915091508162002fe9576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001ad3565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff8616916200317f919062003c25565b5f60405180830381855afa9150503d805f8114620031b9576040519150601f19603f3d011682016040523d82523d5f602084013e620031be565b606091505b5091509150818015620031d2575080516020145b620031df57601262001ad3565b8080602001905181019062001ad3919062004344565b606062001ad384845f85620033f0565b606060408251106200322757818060200190518101906200088c919062004362565b8151602003620033b2575f5b6020811080156200327e575082818151811062003254576200325462003eba565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620032995780620032908162003f14565b91505062003233565b805f03620032dc57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115620032f957620032f962003bd4565b6040519080825280601f01601f19166020018201604052801562003324576020820181803683370190505b5090505f5b82811015620033aa5784818151811062003347576200334762003eba565b602001015160f81c60f81b82828151811062003367576200336762003eba565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620033a18162003f14565b91505062003329565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200143b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051620034ae919062003c25565b5f6040518083038185875af1925050503d805f8114620034ea576040519150601f19603f3d011682016040523d82523d5f602084013e620034ef565b606091505b509150915062003502878383876200350d565b979650505050505050565b60608315620035a75782515f036200359f5773ffffffffffffffffffffffffffffffffffffffff85163b6200359f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200143b565b508162001ad3565b62001ad38383815115620035be5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200143b9190620043dd565b611b0d80620043f283390190565b803563ffffffff81168114620033eb575f80fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620019f0575f80fd5b5f80604083850312156200364a575f80fd5b620036558362003602565b91506020830135620036678162003616565b809150509250929050565b8015158114620019f0575f80fd5b5f8083601f84011262003691575f80fd5b50813567ffffffffffffffff811115620036a9575f80fd5b602083019150836020828501011115620036c1575f80fd5b9250929050565b5f805f805f60808688031215620036dd575f80fd5b620036e88662003602565b94506020860135620036fa8162003616565b935060408601356200370c8162003672565b9250606086013567ffffffffffffffff81111562003728575f80fd5b620037368882890162003680565b969995985093965092949392505050565b5f6020828403121562003758575f80fd5b5035919050565b5f6020828403121562003770575f80fd5b6200377b8262003602565b9392505050565b8061040081018310156200088c575f80fd5b5f805f805f805f805f805f6105208c8e031215620037b0575f80fd5b620037bc8d8d62003782565b9a50620037cd6104008d0162003602565b99506104208c013598506104408c01359750620037ee6104608d0162003602565b96506104808c0135620038018162003616565b9550620038126104a08d0162003602565b94506104c08c0135620038258162003616565b93506104e08c013592506105008c013567ffffffffffffffff8111156200384a575f80fd5b620038588e828f0162003680565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562003883575f80fd5b81356200377b8162003616565b60ff81168114620019f0575f80fd5b5f805f805f805f60e0888a031215620038b6575f80fd5b8735620038c38162003890565b9650620038d36020890162003602565b95506040880135620038e58162003616565b9450620038f56060890162003602565b93506080880135620039078162003616565b9699959850939692959460a0840135945060c09093013592915050565b5f805f6060848603121562003937575f80fd5b620039428462003602565b92506020840135620039548162003616565b91506040840135620039668162003616565b809150509250925092565b5f805f805f805f60a0888a03121562003988575f80fd5b620039938862003602565b96506020880135620039a58162003616565b9550604088013567ffffffffffffffff80821115620039c2575f80fd5b620039d08b838c0162003680565b909750955060608a0135915080821115620039e9575f80fd5b50620039f88a828b0162003680565b909450925050608088013562003a0e8162003890565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003a35575f80fd5b62003a408862003602565b9650602088013562003a528162003616565b955060408801359450606088013562003a6b8162003616565b9350608088013562003a7d8162003672565b925060a088013567ffffffffffffffff81111562003a99575f80fd5b62003aa78a828b0162003680565b989b979a50959850939692959293505050565b5f805f80610460858703121562003acf575f80fd5b8435935062003ae2866020870162003782565b925062003af3610420860162003602565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003bab828501878962003b04565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003c1d57818101518382015260200162003c03565b50505f910152565b5f825162003c3881846020870162003c01565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003c8c5762003c8c62003bd4565b604052919050565b5f67ffffffffffffffff82111562003cb05762003cb062003bd4565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011262003cec575f80fd5b813562003d0362003cfd8262003c94565b62003c42565b81815284602083860101111562003d18575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003d47575f80fd5b833567ffffffffffffffff8082111562003d5f575f80fd5b62003d6d8783880162003cdc565b9450602086013591508082111562003d83575f80fd5b5062003d928682870162003cdc565b9250506040840135620039668162003890565b5f815180845262003dbe81602086016020860162003c01565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f62003e04606083018662003da5565b828103602084015262003e18818662003da5565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200350260808301848662003b04565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003eb060608301848662003b04565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003f475762003f4762003ee7565b5060010190565b606081525f62003f6360608301878962003b04565b828103602084015262003f7881868862003b04565b91505060ff831660408301529695505050505050565b5f835162003fa181846020880162003c01565b83519083019062003fb781836020880162003c01565b01949350505050565b600181815b808511156200401f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562004003576200400362003ee7565b808516156200401157918102915b93841c939080029062003fc5565b509250929050565b5f8262004037575060016200088c565b816200404557505f6200088c565b81600181146200405e5760028114620040695762004089565b60019150506200088c565b60ff8411156200407d576200407d62003ee7565b50506001821b6200088c565b5060208310610133831016604e8410600b8410161715620040ae575081810a6200088c565b620040ba838362003fc0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620040ef57620040ef62003ee7565b029392505050565b5f6200377b838362004027565b818103818111156200088c576200088c62003ee7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6020828403121562004158575f80fd5b5051919050565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620041be8285018762003da5565b925080851660e085015250509998505050505050505050565b5f60208284031215620041e8575f80fd5b81516200377b8162003672565b5f808585111562004204575f80fd5b8386111562004211575f80fd5b5050820193919092039150565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156200425f5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a0312156200427e575f80fd5b87356200428b8162003616565b965060208801356200429d8162003616565b955060408801359450606088013593506080880135620039078162003890565b5f805f805f805f80610100898b031215620042d6575f80fd5b8835620042e38162003616565b97506020890135620042f58162003616565b965060408901359550606089013594506080890135620043158162003672565b935060a0890135620043278162003890565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004355575f80fd5b81516200377b8162003890565b5f6020828403121562004373575f80fd5b815167ffffffffffffffff8111156200438a575f80fd5b8201601f810184136200439b575f80fd5b8051620043ac62003cfd8262003c94565b818152856020838501011115620043c1575f80fd5b620043d482602083016020860162003c01565b95945050505050565b602081525f6200377b602083018462003da556fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a2646970667358221220b6bef336f4ffaee30246ce2daa5abeb49dede3d0b3bd216d94f3614697bc150b64736f6c63430008140033", - "deployedBytecode": "0x608060405260043610620001df575f3560e01c8063715018a61162000106578063bab161bf116200009e578063dbc16976116200006a578063dbc169761462000704578063ee25560b146200071b578063f2fde38b146200074a578063fb570834146200076e575f80fd5b8063bab161bf1462000642578063be5831c7146200067b578063cd58657914620006b6578063d02103ca14620006cd575f80fd5b80638da5cb5b11620000de5780638da5cb5b146200059857806391e57e2d14620005c45780639e34070f14620005db578063aaa13cc2146200061e575f80fd5b8063715018a6146200052557806379e2cf97146200053c57806381b1c1741462000553575f80fd5b80632d2c9d94116200017a57806334ac9cf2116200015257806334ac9cf214620003ca5780633ae0504714620003f85780633e197043146200040f578063647c576c1462000501575f80fd5b80632d2c9d9414620002f95780632dfdf0b5146200031d578063318aee3d1462000343575f80fd5b8063240ff37811620001ba578063240ff37814620002765780632b5e42e7146200028d5780632c3f58cd14620002b15780632cffd02e14620002d5575f80fd5b806315064c9614620001e35780632072f6c5146200021357806322e95f2c146200022c575b5f80fd5b348015620001ef575f80fd5b50606854620001fe9060ff1681565b60405190151581526020015b60405180910390f35b3480156200021f575f80fd5b506200022a62000792565b005b34801562000238575f80fd5b50620002506200024a36600462003638565b620007f0565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016200020a565b6200022a62000287366004620036c8565b62000892565b34801562000299575f80fd5b506200022a620002ab36600462003747565b62000ab9565b348015620002bd575f80fd5b506200022a620002cf3660046200375f565b62000ac8565b348015620002e1575f80fd5b506200022a620002f336600462003794565b62000b0e565b34801562000305575f80fd5b506200022a6200031736600462003794565b62001093565b34801562000329575f80fd5b506200033460535481565b6040519081526020016200020a565b3480156200034f575f80fd5b50620003986200036136600462003872565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff9091166020830152016200020a565b348015620003d6575f80fd5b50606c54620002509073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000404575f80fd5b506200033462001293565b3480156200041b575f80fd5b50620003346200042d3660046200389f565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200050d575f80fd5b506200022a6200051f36600462003924565b62001378565b34801562000531575f80fd5b506200022a620015cd565b34801562000548575f80fd5b506200022a620015e2565b3480156200055f575f80fd5b50620002506200057136600462003747565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005a4575f80fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff1662000250565b348015620005d0575f80fd5b506200033460d15481565b348015620005e7575f80fd5b50620001fe620005f936600462003747565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b3480156200062a575f80fd5b50620002506200063c36600462003971565b6200161c565b3480156200064e575f80fd5b506068546200066590610100900463ffffffff1681565b60405163ffffffff90911681526020016200020a565b34801562000687575f80fd5b506068546200066590790100000000000000000000000000000000000000000000000000900463ffffffff1681565b6200022a620006c736600462003a1e565b62001806565b348015620006d9575f80fd5b50606854620002509065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000710575f80fd5b506200022a620018da565b34801562000727575f80fd5b50620003346200073936600462003747565b60696020525f908152604090205481565b34801562000756575f80fd5b506200022a6200076836600462003872565b62001936565b3480156200077a575f80fd5b50620001fe6200078c36600462003aba565b620019f3565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620007e4576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee62001adb565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620008d0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620008f65750600263ffffffff861610155b156200092e576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009849998979695949392919062003b4b565b60405180910390a162000aa162000a9b6001606860019054906101000a900463ffffffff16338989348989604051620009bf92919062003bc5565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001b6e565b821562000ab25762000ab262001c82565b5050505050565b62000ac362001d52565b60d155565b62000ad262001d52565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b4c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b628b8b8b8b8b8b8b8b8b8b8b5f62001dd5565b73ffffffffffffffffffffffffffffffffffffffff861662000c3a57604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000bb6919062003c25565b5f6040518083038185875af1925050503d805f811462000bf2576040519150601f19603f3d011682016040523d82523d5f602084013e62000bf7565b606091505b505090508062000c33576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506200101b565b60685463ffffffff61010090910481169088160362000c7c5762000c7673ffffffffffffffffffffffffffffffffffffffff8716858562001fc0565b6200101b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000f92575f808062000d4e8688018862003d34565b9250925092505f8584848460405162000d6790620035f4565b62000d759392919062003df0565b8190604051809103905ff590508015801562000d93573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000e06575f80fd5b505af115801562000e19573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000f8095949392919062003e2c565b60405180910390a15050505062001018565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562001000575f80fd5b505af115801562001013573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff1615620010d1576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620010e88b8b8b8b8b8b8b8b8b8b8b600162001dd5565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a86866040516024016200111a949392919062003e73565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200119d919062003c25565b5f6040518083038185875af1925050503d805f8114620011d9576040519150601f19603f3d011682016040523d82523d5f602084013e620011de565b606091505b50509050806200121a576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200136f578083901c600116600103620013005760338160208110620012cc57620012cc62003eba565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200132d565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013669062003f14565b9150506200129d565b50919392505050565b5f54610100900460ff16158080156200139757505f54600160ff909116105b80620013b25750303b158015620013b257505f5460ff166001145b62001444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014a1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d1556200156462002096565b8015620015c7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b620015d762001d52565b620007ee5f62002134565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620007ee57620007ee62001c82565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180602001620016b090620035f4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620016fb908d908d908d908d908d9060200162003f4e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001739929160200162003f8e565b60405160208183030381529060405280519060200120604051602001620017c294939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d154341115620018c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200143b565b620018d187878787878787620021aa565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff1633146200192c576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee620026f3565b6200194062001d52565b73ffffffffffffffffffffffffffffffffffffffff8116620019e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200143b565b620019f08162002134565b50565b5f84815b602081101562001acd57600163ffffffff8616821c8116900362001a695785816020811062001a2a5762001a2a62003eba565b60200201358260405160200162001a4b929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001ab8565b8186826020811062001a7f5762001a7f62003eba565b602002013560405160200162001a9f929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001ac48162003f14565b915050620019f7565b50821490505b949350505050565b60685460ff161562001b19576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001b7f60206002620040f7565b62001b8b919062004104565b6053541062001bc6576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001bd79062003f14565b918290555090505f5b602081101562001c72578082901c60011660010362001c1857826033826020811062001c105762001c1062003eba565b015550505050565b6033816020811062001c2e5762001c2e62003eba565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001c699062003f14565b91505062001be0565b5062001c7d6200411a565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001d0862001293565b6040518263ffffffff1660e01b815260040162001d2791815260200190565b5f604051808303815f87803b15801562001d3f575f80fd5b505af1158015620015c7573d5f803e3d5ffd5b609f5473ffffffffffffffffffffffffffffffffffffffff163314620007ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200143b565b62001de68b63ffffffff1662002782565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af115801562001e85573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001eab919062004147565b9050805f0362001ee6576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462001f30576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff1662001f4d57508962001f50565b508a5b62001f7962001f70848c8c8c8c8c8c8c604051620009bf92919062003bc5565b8f8f84620019f3565b62001fb0576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001c7d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152620027e6565b5f54610100900460ff166200212e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200143b565b620007ee335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60685460ff1615620021e8576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620021f2620028f8565b60685463ffffffff888116610100909204161480620022185750600263ffffffff881610155b1562002250576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff8816620022b457883414620022ab576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f9250620025a1565b3415620022ed576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620023d6576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b158015620023ac575f80fd5b505af1158015620023bf573d5f803e3d5ffd5b5050505080602001519450805f015193506200259f565b8515620023eb57620023eb898b89896200296d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa15801562002456573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200247c919062004147565b9050620024a273ffffffffffffffffffffffffffffffffffffffff8b1633308e62002e80565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa1580156200250d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002533919062004147565b905062002541828262004104565b6068548c9850610100900463ffffffff1696509350620025618762002ee0565b6200256c8c62002ff4565b620025778d620030fd565b6040516020016200258b9392919062003df0565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620025e29897969594939291906200415f565b60405180910390a1620026d462000a9b5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b8615620026e557620026e562001c82565b50505050620018d160018055565b60685460ff1662002730576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000ab2576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002849826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031f59092919063ffffffff16565b80519091501562001c7d57808060200190518101906200286a9190620041d7565b62001c7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200143b565b60026001540362002966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200143b565b6002600155565b5f6200297d6004828486620041f5565b62002988916200421e565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002c02575f808080808080620029ea896004818d620041f5565b810190620029f9919062004267565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002a6d576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002abd576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002af7576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002bb2919062003c25565b5f604051808303815f865af19150503d805f811462002bed576040519150601f19603f3d011682016040523d82523d5f602084013e62002bf2565b606091505b5050505050505050505062000ab2565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002c7e576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080808080808062002c958a6004818e620041f5565b81019062002ca49190620042bd565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002d1a576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002d6a576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002e2e919062003c25565b5f604051808303815f865af19150503d805f811462002e69576040519150601f19603f3d011682016040523d82523d5f602084013e62002e6e565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620015c79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002013565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002f63919062003c25565b5f60405180830381855afa9150503d805f811462002f9d576040519150601f19603f3d011682016040523d82523d5f602084013e62002fa2565b606091505b50915091508162002fe9576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001ad3565b62001ad38162003205565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162003077919062003c25565b5f60405180830381855afa9150503d805f8114620030b1576040519150601f19603f3d011682016040523d82523d5f602084013e620030b6565b606091505b50915091508162002fe9576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001ad3565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff8616916200317f919062003c25565b5f60405180830381855afa9150503d805f8114620031b9576040519150601f19603f3d011682016040523d82523d5f602084013e620031be565b606091505b5091509150818015620031d2575080516020145b620031df57601262001ad3565b8080602001905181019062001ad3919062004344565b606062001ad384845f85620033f0565b606060408251106200322757818060200190518101906200088c919062004362565b8151602003620033b2575f5b6020811080156200327e575082818151811062003254576200325462003eba565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620032995780620032908162003f14565b91505062003233565b805f03620032dc57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115620032f957620032f962003bd4565b6040519080825280601f01601f19166020018201604052801562003324576020820181803683370190505b5090505f5b82811015620033aa5784818151811062003347576200334762003eba565b602001015160f81c60f81b82828151811062003367576200336762003eba565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620033a18162003f14565b91505062003329565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200143b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051620034ae919062003c25565b5f6040518083038185875af1925050503d805f8114620034ea576040519150601f19603f3d011682016040523d82523d5f602084013e620034ef565b606091505b509150915062003502878383876200350d565b979650505050505050565b60608315620035a75782515f036200359f5773ffffffffffffffffffffffffffffffffffffffff85163b6200359f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200143b565b508162001ad3565b62001ad38383815115620035be5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200143b9190620043dd565b611b0d80620043f283390190565b803563ffffffff81168114620033eb575f80fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620019f0575f80fd5b5f80604083850312156200364a575f80fd5b620036558362003602565b91506020830135620036678162003616565b809150509250929050565b8015158114620019f0575f80fd5b5f8083601f84011262003691575f80fd5b50813567ffffffffffffffff811115620036a9575f80fd5b602083019150836020828501011115620036c1575f80fd5b9250929050565b5f805f805f60808688031215620036dd575f80fd5b620036e88662003602565b94506020860135620036fa8162003616565b935060408601356200370c8162003672565b9250606086013567ffffffffffffffff81111562003728575f80fd5b620037368882890162003680565b969995985093965092949392505050565b5f6020828403121562003758575f80fd5b5035919050565b5f6020828403121562003770575f80fd5b6200377b8262003602565b9392505050565b8061040081018310156200088c575f80fd5b5f805f805f805f805f805f6105208c8e031215620037b0575f80fd5b620037bc8d8d62003782565b9a50620037cd6104008d0162003602565b99506104208c013598506104408c01359750620037ee6104608d0162003602565b96506104808c0135620038018162003616565b9550620038126104a08d0162003602565b94506104c08c0135620038258162003616565b93506104e08c013592506105008c013567ffffffffffffffff8111156200384a575f80fd5b620038588e828f0162003680565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562003883575f80fd5b81356200377b8162003616565b60ff81168114620019f0575f80fd5b5f805f805f805f60e0888a031215620038b6575f80fd5b8735620038c38162003890565b9650620038d36020890162003602565b95506040880135620038e58162003616565b9450620038f56060890162003602565b93506080880135620039078162003616565b9699959850939692959460a0840135945060c09093013592915050565b5f805f6060848603121562003937575f80fd5b620039428462003602565b92506020840135620039548162003616565b91506040840135620039668162003616565b809150509250925092565b5f805f805f805f60a0888a03121562003988575f80fd5b620039938862003602565b96506020880135620039a58162003616565b9550604088013567ffffffffffffffff80821115620039c2575f80fd5b620039d08b838c0162003680565b909750955060608a0135915080821115620039e9575f80fd5b50620039f88a828b0162003680565b909450925050608088013562003a0e8162003890565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003a35575f80fd5b62003a408862003602565b9650602088013562003a528162003616565b955060408801359450606088013562003a6b8162003616565b9350608088013562003a7d8162003672565b925060a088013567ffffffffffffffff81111562003a99575f80fd5b62003aa78a828b0162003680565b989b979a50959850939692959293505050565b5f805f80610460858703121562003acf575f80fd5b8435935062003ae2866020870162003782565b925062003af3610420860162003602565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003bab828501878962003b04565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003c1d57818101518382015260200162003c03565b50505f910152565b5f825162003c3881846020870162003c01565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003c8c5762003c8c62003bd4565b604052919050565b5f67ffffffffffffffff82111562003cb05762003cb062003bd4565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011262003cec575f80fd5b813562003d0362003cfd8262003c94565b62003c42565b81815284602083860101111562003d18575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003d47575f80fd5b833567ffffffffffffffff8082111562003d5f575f80fd5b62003d6d8783880162003cdc565b9450602086013591508082111562003d83575f80fd5b5062003d928682870162003cdc565b9250506040840135620039668162003890565b5f815180845262003dbe81602086016020860162003c01565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f62003e04606083018662003da5565b828103602084015262003e18818662003da5565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200350260808301848662003b04565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003eb060608301848662003b04565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003f475762003f4762003ee7565b5060010190565b606081525f62003f6360608301878962003b04565b828103602084015262003f7881868862003b04565b91505060ff831660408301529695505050505050565b5f835162003fa181846020880162003c01565b83519083019062003fb781836020880162003c01565b01949350505050565b600181815b808511156200401f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562004003576200400362003ee7565b808516156200401157918102915b93841c939080029062003fc5565b509250929050565b5f8262004037575060016200088c565b816200404557505f6200088c565b81600181146200405e5760028114620040695762004089565b60019150506200088c565b60ff8411156200407d576200407d62003ee7565b50506001821b6200088c565b5060208310610133831016604e8410600b8410161715620040ae575081810a6200088c565b620040ba838362003fc0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620040ef57620040ef62003ee7565b029392505050565b5f6200377b838362004027565b818103818111156200088c576200088c62003ee7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6020828403121562004158575f80fd5b5051919050565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620041be8285018762003da5565b925080851660e085015250509998505050505050505050565b5f60208284031215620041e8575f80fd5b81516200377b8162003672565b5f808585111562004204575f80fd5b8386111562004211575f80fd5b5050820193919092039150565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156200425f5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a0312156200427e575f80fd5b87356200428b8162003616565b965060208801356200429d8162003616565b955060408801359450606088013593506080880135620039078162003890565b5f805f805f805f80610100898b031215620042d6575f80fd5b8835620042e38162003616565b97506020890135620042f58162003616565b965060408901359550606089013594506080890135620043158162003672565b935060a0890135620043278162003890565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004355575f80fd5b81516200377b8162003890565b5f6020828403121562004373575f80fd5b815167ffffffffffffffff8111156200438a575f80fd5b8201601f810184136200439b575f80fd5b8051620043ac62003cfd8262003c94565b818152856020838501011115620043c1575f80fd5b620043d482602083016020860162003c01565b95945050505050565b602081525f6200377b602083018462003da556fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a2646970667358221220b6bef336f4ffaee30246ce2daa5abeb49dede3d0b3bd216d94f3614697bc150b64736f6c63430008140033", + "bytecode": "0x608060405234801561000f575f80fd5b50615f348061001d5f395ff3fe608060405260043610620001df575f3560e01c8063715018a61162000106578063bab161bf116200009e578063dbc16976116200006a578063dbc169761462000704578063ee25560b146200071b578063f2fde38b146200074a578063fb570834146200076e575f80fd5b8063bab161bf1462000642578063be5831c7146200067b578063cd58657914620006b6578063d02103ca14620006cd575f80fd5b80638da5cb5b11620000de5780638da5cb5b146200059857806391e57e2d14620005c45780639e34070f14620005db578063aaa13cc2146200061e575f80fd5b8063715018a6146200052557806379e2cf97146200053c57806381b1c1741462000553575f80fd5b80632d2c9d94116200017a57806334ac9cf2116200015257806334ac9cf214620003ca5780633ae0504714620003f85780633e197043146200040f578063647c576c1462000501575f80fd5b80632d2c9d9414620002f95780632dfdf0b5146200031d578063318aee3d1462000343575f80fd5b8063240ff37811620001ba578063240ff37814620002765780632b5e42e7146200028d5780632c3f58cd14620002b15780632cffd02e14620002d5575f80fd5b806315064c9614620001e35780632072f6c5146200021357806322e95f2c146200022c575b5f80fd5b348015620001ef575f80fd5b50606854620001fe9060ff1681565b60405190151581526020015b60405180910390f35b3480156200021f575f80fd5b506200022a62000792565b005b34801562000238575f80fd5b50620002506200024a36600462003638565b620007f0565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016200020a565b6200022a62000287366004620036c8565b62000892565b34801562000299575f80fd5b506200022a620002ab36600462003747565b62000ab9565b348015620002bd575f80fd5b506200022a620002cf3660046200375f565b62000ac8565b348015620002e1575f80fd5b506200022a620002f336600462003794565b62000b0e565b34801562000305575f80fd5b506200022a6200031736600462003794565b62001093565b34801562000329575f80fd5b506200033460535481565b6040519081526020016200020a565b3480156200034f575f80fd5b50620003986200036136600462003872565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff9091166020830152016200020a565b348015620003d6575f80fd5b50606c54620002509073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000404575f80fd5b506200033462001293565b3480156200041b575f80fd5b50620003346200042d3660046200389f565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200050d575f80fd5b506200022a6200051f36600462003924565b62001378565b34801562000531575f80fd5b506200022a620015cd565b34801562000548575f80fd5b506200022a620015e2565b3480156200055f575f80fd5b50620002506200057136600462003747565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005a4575f80fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff1662000250565b348015620005d0575f80fd5b506200033460d15481565b348015620005e7575f80fd5b50620001fe620005f936600462003747565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b3480156200062a575f80fd5b50620002506200063c36600462003971565b6200161c565b3480156200064e575f80fd5b506068546200066590610100900463ffffffff1681565b60405163ffffffff90911681526020016200020a565b34801562000687575f80fd5b506068546200066590790100000000000000000000000000000000000000000000000000900463ffffffff1681565b6200022a620006c736600462003a1e565b62001806565b348015620006d9575f80fd5b50606854620002509065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000710575f80fd5b506200022a620018da565b34801562000727575f80fd5b50620003346200073936600462003747565b60696020525f908152604090205481565b34801562000756575f80fd5b506200022a6200076836600462003872565b62001936565b3480156200077a575f80fd5b50620001fe6200078c36600462003aba565b620019f3565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620007e4576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee62001adb565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620008d0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620008f65750600263ffffffff861610155b156200092e576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009849998979695949392919062003b4b565b60405180910390a162000aa162000a9b6001606860019054906101000a900463ffffffff16338989348989604051620009bf92919062003bc5565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001b6e565b821562000ab25762000ab262001c82565b5050505050565b62000ac362001d52565b60d155565b62000ad262001d52565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b4c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b628b8b8b8b8b8b8b8b8b8b8b5f62001dd5565b73ffffffffffffffffffffffffffffffffffffffff861662000c3a57604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000bb6919062003c25565b5f6040518083038185875af1925050503d805f811462000bf2576040519150601f19603f3d011682016040523d82523d5f602084013e62000bf7565b606091505b505090508062000c33576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506200101b565b60685463ffffffff61010090910481169088160362000c7c5762000c7673ffffffffffffffffffffffffffffffffffffffff8716858562001fc0565b6200101b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000f92575f808062000d4e8688018862003d34565b9250925092505f8584848460405162000d6790620035f4565b62000d759392919062003df0565b8190604051809103905ff590508015801562000d93573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000e06575f80fd5b505af115801562000e19573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000f8095949392919062003e2c565b60405180910390a15050505062001018565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562001000575f80fd5b505af115801562001013573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff1615620010d1576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620010e88b8b8b8b8b8b8b8b8b8b8b600162001dd5565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a86866040516024016200111a949392919062003e73565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200119d919062003c25565b5f6040518083038185875af1925050503d805f8114620011d9576040519150601f19603f3d011682016040523d82523d5f602084013e620011de565b606091505b50509050806200121a576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200136f578083901c600116600103620013005760338160208110620012cc57620012cc62003eba565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200132d565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013669062003f14565b9150506200129d565b50919392505050565b5f54610100900460ff16158080156200139757505f54600160ff909116105b80620013b25750303b158015620013b257505f5460ff166001145b62001444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014a1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d1556200156462002096565b8015620015c7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b620015d762001d52565b620007ee5f62002134565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620007ee57620007ee62001c82565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180602001620016b090620035f4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620016fb908d908d908d908d908d9060200162003f4e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001739929160200162003f8e565b60405160208183030381529060405280519060200120604051602001620017c294939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d154341115620018c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200143b565b620018d187878787878787620021aa565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff1633146200192c576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee620026f3565b6200194062001d52565b73ffffffffffffffffffffffffffffffffffffffff8116620019e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200143b565b620019f08162002134565b50565b5f84815b602081101562001acd57600163ffffffff8616821c8116900362001a695785816020811062001a2a5762001a2a62003eba565b60200201358260405160200162001a4b929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001ab8565b8186826020811062001a7f5762001a7f62003eba565b602002013560405160200162001a9f929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001ac48162003f14565b915050620019f7565b50821490505b949350505050565b60685460ff161562001b19576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001b7f60206002620040f7565b62001b8b919062004104565b6053541062001bc6576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001bd79062003f14565b918290555090505f5b602081101562001c72578082901c60011660010362001c1857826033826020811062001c105762001c1062003eba565b015550505050565b6033816020811062001c2e5762001c2e62003eba565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001c699062003f14565b91505062001be0565b5062001c7d6200411a565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001d0862001293565b6040518263ffffffff1660e01b815260040162001d2791815260200190565b5f604051808303815f87803b15801562001d3f575f80fd5b505af1158015620015c7573d5f803e3d5ffd5b609f5473ffffffffffffffffffffffffffffffffffffffff163314620007ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200143b565b62001de68b63ffffffff1662002782565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af115801562001e85573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001eab919062004147565b9050805f0362001ee6576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462001f30576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff1662001f4d57508962001f50565b508a5b62001f7962001f70848c8c8c8c8c8c8c604051620009bf92919062003bc5565b8f8f84620019f3565b62001fb0576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001c7d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152620027e6565b5f54610100900460ff166200212e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200143b565b620007ee335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60685460ff1615620021e8576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620021f2620028f8565b60685463ffffffff888116610100909204161480620022185750600263ffffffff881610155b1562002250576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff8816620022b457883414620022ab576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f9250620025a1565b3415620022ed576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620023d6576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b158015620023ac575f80fd5b505af1158015620023bf573d5f803e3d5ffd5b5050505080602001519450805f015193506200259f565b8515620023eb57620023eb898b89896200296d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa15801562002456573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200247c919062004147565b9050620024a273ffffffffffffffffffffffffffffffffffffffff8b1633308e62002e80565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa1580156200250d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002533919062004147565b905062002541828262004104565b6068548c9850610100900463ffffffff1696509350620025618762002ee0565b6200256c8c62002ff4565b620025778d620030fd565b6040516020016200258b9392919062003df0565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620025e29897969594939291906200415f565b60405180910390a1620026d462000a9b5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b8615620026e557620026e562001c82565b50505050620018d160018055565b60685460ff1662002730576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000ab2576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002849826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031f59092919063ffffffff16565b80519091501562001c7d57808060200190518101906200286a9190620041d7565b62001c7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200143b565b60026001540362002966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200143b565b6002600155565b5f6200297d6004828486620041f5565b62002988916200421e565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002c02575f808080808080620029ea896004818d620041f5565b810190620029f9919062004267565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002a6d576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002abd576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002af7576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002bb2919062003c25565b5f604051808303815f865af19150503d805f811462002bed576040519150601f19603f3d011682016040523d82523d5f602084013e62002bf2565b606091505b5050505050505050505062000ab2565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002c7e576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080808080808062002c958a6004818e620041f5565b81019062002ca49190620042bd565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002d1a576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002d6a576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002e2e919062003c25565b5f604051808303815f865af19150503d805f811462002e69576040519150601f19603f3d011682016040523d82523d5f602084013e62002e6e565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620015c79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002013565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002f63919062003c25565b5f60405180830381855afa9150503d805f811462002f9d576040519150601f19603f3d011682016040523d82523d5f602084013e62002fa2565b606091505b50915091508162002fe9576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001ad3565b62001ad38162003205565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162003077919062003c25565b5f60405180830381855afa9150503d805f8114620030b1576040519150601f19603f3d011682016040523d82523d5f602084013e620030b6565b606091505b50915091508162002fe9576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001ad3565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff8616916200317f919062003c25565b5f60405180830381855afa9150503d805f8114620031b9576040519150601f19603f3d011682016040523d82523d5f602084013e620031be565b606091505b5091509150818015620031d2575080516020145b620031df57601262001ad3565b8080602001905181019062001ad3919062004344565b606062001ad384845f85620033f0565b606060408251106200322757818060200190518101906200088c919062004362565b8151602003620033b2575f5b6020811080156200327e575082818151811062003254576200325462003eba565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620032995780620032908162003f14565b91505062003233565b805f03620032dc57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115620032f957620032f962003bd4565b6040519080825280601f01601f19166020018201604052801562003324576020820181803683370190505b5090505f5b82811015620033aa5784818151811062003347576200334762003eba565b602001015160f81c60f81b82828151811062003367576200336762003eba565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620033a18162003f14565b91505062003329565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200143b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051620034ae919062003c25565b5f6040518083038185875af1925050503d805f8114620034ea576040519150601f19603f3d011682016040523d82523d5f602084013e620034ef565b606091505b509150915062003502878383876200350d565b979650505050505050565b60608315620035a75782515f036200359f5773ffffffffffffffffffffffffffffffffffffffff85163b6200359f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200143b565b508162001ad3565b62001ad38383815115620035be5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200143b9190620043dd565b611b0d80620043f283390190565b803563ffffffff81168114620033eb575f80fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620019f0575f80fd5b5f80604083850312156200364a575f80fd5b620036558362003602565b91506020830135620036678162003616565b809150509250929050565b8015158114620019f0575f80fd5b5f8083601f84011262003691575f80fd5b50813567ffffffffffffffff811115620036a9575f80fd5b602083019150836020828501011115620036c1575f80fd5b9250929050565b5f805f805f60808688031215620036dd575f80fd5b620036e88662003602565b94506020860135620036fa8162003616565b935060408601356200370c8162003672565b9250606086013567ffffffffffffffff81111562003728575f80fd5b620037368882890162003680565b969995985093965092949392505050565b5f6020828403121562003758575f80fd5b5035919050565b5f6020828403121562003770575f80fd5b6200377b8262003602565b9392505050565b8061040081018310156200088c575f80fd5b5f805f805f805f805f805f6105208c8e031215620037b0575f80fd5b620037bc8d8d62003782565b9a50620037cd6104008d0162003602565b99506104208c013598506104408c01359750620037ee6104608d0162003602565b96506104808c0135620038018162003616565b9550620038126104a08d0162003602565b94506104c08c0135620038258162003616565b93506104e08c013592506105008c013567ffffffffffffffff8111156200384a575f80fd5b620038588e828f0162003680565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562003883575f80fd5b81356200377b8162003616565b60ff81168114620019f0575f80fd5b5f805f805f805f60e0888a031215620038b6575f80fd5b8735620038c38162003890565b9650620038d36020890162003602565b95506040880135620038e58162003616565b9450620038f56060890162003602565b93506080880135620039078162003616565b9699959850939692959460a0840135945060c09093013592915050565b5f805f6060848603121562003937575f80fd5b620039428462003602565b92506020840135620039548162003616565b91506040840135620039668162003616565b809150509250925092565b5f805f805f805f60a0888a03121562003988575f80fd5b620039938862003602565b96506020880135620039a58162003616565b9550604088013567ffffffffffffffff80821115620039c2575f80fd5b620039d08b838c0162003680565b909750955060608a0135915080821115620039e9575f80fd5b50620039f88a828b0162003680565b909450925050608088013562003a0e8162003890565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003a35575f80fd5b62003a408862003602565b9650602088013562003a528162003616565b955060408801359450606088013562003a6b8162003616565b9350608088013562003a7d8162003672565b925060a088013567ffffffffffffffff81111562003a99575f80fd5b62003aa78a828b0162003680565b989b979a50959850939692959293505050565b5f805f80610460858703121562003acf575f80fd5b8435935062003ae2866020870162003782565b925062003af3610420860162003602565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003bab828501878962003b04565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003c1d57818101518382015260200162003c03565b50505f910152565b5f825162003c3881846020870162003c01565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003c8c5762003c8c62003bd4565b604052919050565b5f67ffffffffffffffff82111562003cb05762003cb062003bd4565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011262003cec575f80fd5b813562003d0362003cfd8262003c94565b62003c42565b81815284602083860101111562003d18575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003d47575f80fd5b833567ffffffffffffffff8082111562003d5f575f80fd5b62003d6d8783880162003cdc565b9450602086013591508082111562003d83575f80fd5b5062003d928682870162003cdc565b9250506040840135620039668162003890565b5f815180845262003dbe81602086016020860162003c01565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f62003e04606083018662003da5565b828103602084015262003e18818662003da5565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200350260808301848662003b04565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003eb060608301848662003b04565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003f475762003f4762003ee7565b5060010190565b606081525f62003f6360608301878962003b04565b828103602084015262003f7881868862003b04565b91505060ff831660408301529695505050505050565b5f835162003fa181846020880162003c01565b83519083019062003fb781836020880162003c01565b01949350505050565b600181815b808511156200401f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562004003576200400362003ee7565b808516156200401157918102915b93841c939080029062003fc5565b509250929050565b5f8262004037575060016200088c565b816200404557505f6200088c565b81600181146200405e5760028114620040695762004089565b60019150506200088c565b60ff8411156200407d576200407d62003ee7565b50506001821b6200088c565b5060208310610133831016604e8410600b8410161715620040ae575081810a6200088c565b620040ba838362003fc0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620040ef57620040ef62003ee7565b029392505050565b5f6200377b838362004027565b818103818111156200088c576200088c62003ee7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6020828403121562004158575f80fd5b5051919050565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620041be8285018762003da5565b925080851660e085015250509998505050505050505050565b5f60208284031215620041e8575f80fd5b81516200377b8162003672565b5f808585111562004204575f80fd5b8386111562004211575f80fd5b5050820193919092039150565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156200425f5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a0312156200427e575f80fd5b87356200428b8162003616565b965060208801356200429d8162003616565b955060408801359450606088013593506080880135620039078162003890565b5f805f805f805f80610100898b031215620042d6575f80fd5b8835620042e38162003616565b97506020890135620042f58162003616565b965060408901359550606089013594506080890135620043158162003672565b935060a0890135620043278162003890565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004355575f80fd5b81516200377b8162003890565b5f6020828403121562004373575f80fd5b815167ffffffffffffffff8111156200438a575f80fd5b8201601f810184136200439b575f80fd5b8051620043ac62003cfd8262003c94565b818152856020838501011115620043c1575f80fd5b620043d482602083016020860162003c01565b95945050505050565b602081525f6200377b602083018462003da556fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a26469706673582212205357fe4be099d7eba3ac721350adeffb75403935ecb3ea1a84747cf8b5f23c3564736f6c63430008140033", + "deployedBytecode": "0x608060405260043610620001df575f3560e01c8063715018a61162000106578063bab161bf116200009e578063dbc16976116200006a578063dbc169761462000704578063ee25560b146200071b578063f2fde38b146200074a578063fb570834146200076e575f80fd5b8063bab161bf1462000642578063be5831c7146200067b578063cd58657914620006b6578063d02103ca14620006cd575f80fd5b80638da5cb5b11620000de5780638da5cb5b146200059857806391e57e2d14620005c45780639e34070f14620005db578063aaa13cc2146200061e575f80fd5b8063715018a6146200052557806379e2cf97146200053c57806381b1c1741462000553575f80fd5b80632d2c9d94116200017a57806334ac9cf2116200015257806334ac9cf214620003ca5780633ae0504714620003f85780633e197043146200040f578063647c576c1462000501575f80fd5b80632d2c9d9414620002f95780632dfdf0b5146200031d578063318aee3d1462000343575f80fd5b8063240ff37811620001ba578063240ff37814620002765780632b5e42e7146200028d5780632c3f58cd14620002b15780632cffd02e14620002d5575f80fd5b806315064c9614620001e35780632072f6c5146200021357806322e95f2c146200022c575b5f80fd5b348015620001ef575f80fd5b50606854620001fe9060ff1681565b60405190151581526020015b60405180910390f35b3480156200021f575f80fd5b506200022a62000792565b005b34801562000238575f80fd5b50620002506200024a36600462003638565b620007f0565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016200020a565b6200022a62000287366004620036c8565b62000892565b34801562000299575f80fd5b506200022a620002ab36600462003747565b62000ab9565b348015620002bd575f80fd5b506200022a620002cf3660046200375f565b62000ac8565b348015620002e1575f80fd5b506200022a620002f336600462003794565b62000b0e565b34801562000305575f80fd5b506200022a6200031736600462003794565b62001093565b34801562000329575f80fd5b506200033460535481565b6040519081526020016200020a565b3480156200034f575f80fd5b50620003986200036136600462003872565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff9091166020830152016200020a565b348015620003d6575f80fd5b50606c54620002509073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000404575f80fd5b506200033462001293565b3480156200041b575f80fd5b50620003346200042d3660046200389f565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200050d575f80fd5b506200022a6200051f36600462003924565b62001378565b34801562000531575f80fd5b506200022a620015cd565b34801562000548575f80fd5b506200022a620015e2565b3480156200055f575f80fd5b50620002506200057136600462003747565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005a4575f80fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff1662000250565b348015620005d0575f80fd5b506200033460d15481565b348015620005e7575f80fd5b50620001fe620005f936600462003747565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b3480156200062a575f80fd5b50620002506200063c36600462003971565b6200161c565b3480156200064e575f80fd5b506068546200066590610100900463ffffffff1681565b60405163ffffffff90911681526020016200020a565b34801562000687575f80fd5b506068546200066590790100000000000000000000000000000000000000000000000000900463ffffffff1681565b6200022a620006c736600462003a1e565b62001806565b348015620006d9575f80fd5b50606854620002509065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000710575f80fd5b506200022a620018da565b34801562000727575f80fd5b50620003346200073936600462003747565b60696020525f908152604090205481565b34801562000756575f80fd5b506200022a6200076836600462003872565b62001936565b3480156200077a575f80fd5b50620001fe6200078c36600462003aba565b620019f3565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620007e4576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee62001adb565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620008d0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620008f65750600263ffffffff861610155b156200092e576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009849998979695949392919062003b4b565b60405180910390a162000aa162000a9b6001606860019054906101000a900463ffffffff16338989348989604051620009bf92919062003bc5565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001b6e565b821562000ab25762000ab262001c82565b5050505050565b62000ac362001d52565b60d155565b62000ad262001d52565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b4c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b628b8b8b8b8b8b8b8b8b8b8b5f62001dd5565b73ffffffffffffffffffffffffffffffffffffffff861662000c3a57604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000bb6919062003c25565b5f6040518083038185875af1925050503d805f811462000bf2576040519150601f19603f3d011682016040523d82523d5f602084013e62000bf7565b606091505b505090508062000c33576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506200101b565b60685463ffffffff61010090910481169088160362000c7c5762000c7673ffffffffffffffffffffffffffffffffffffffff8716858562001fc0565b6200101b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000f92575f808062000d4e8688018862003d34565b9250925092505f8584848460405162000d6790620035f4565b62000d759392919062003df0565b8190604051809103905ff590508015801562000d93573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000e06575f80fd5b505af115801562000e19573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000f8095949392919062003e2c565b60405180910390a15050505062001018565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562001000575f80fd5b505af115801562001013573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff1615620010d1576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620010e88b8b8b8b8b8b8b8b8b8b8b600162001dd5565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a86866040516024016200111a949392919062003e73565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200119d919062003c25565b5f6040518083038185875af1925050503d805f8114620011d9576040519150601f19603f3d011682016040523d82523d5f602084013e620011de565b606091505b50509050806200121a576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200136f578083901c600116600103620013005760338160208110620012cc57620012cc62003eba565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200132d565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013669062003f14565b9150506200129d565b50919392505050565b5f54610100900460ff16158080156200139757505f54600160ff909116105b80620013b25750303b158015620013b257505f5460ff166001145b62001444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014a1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d1556200156462002096565b8015620015c7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b620015d762001d52565b620007ee5f62002134565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620007ee57620007ee62001c82565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180602001620016b090620035f4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620016fb908d908d908d908d908d9060200162003f4e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001739929160200162003f8e565b60405160208183030381529060405280519060200120604051602001620017c294939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d154341115620018c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200143b565b620018d187878787878787620021aa565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff1633146200192c576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee620026f3565b6200194062001d52565b73ffffffffffffffffffffffffffffffffffffffff8116620019e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200143b565b620019f08162002134565b50565b5f84815b602081101562001acd57600163ffffffff8616821c8116900362001a695785816020811062001a2a5762001a2a62003eba565b60200201358260405160200162001a4b929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001ab8565b8186826020811062001a7f5762001a7f62003eba565b602002013560405160200162001a9f929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001ac48162003f14565b915050620019f7565b50821490505b949350505050565b60685460ff161562001b19576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001b7f60206002620040f7565b62001b8b919062004104565b6053541062001bc6576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001bd79062003f14565b918290555090505f5b602081101562001c72578082901c60011660010362001c1857826033826020811062001c105762001c1062003eba565b015550505050565b6033816020811062001c2e5762001c2e62003eba565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001c699062003f14565b91505062001be0565b5062001c7d6200411a565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001d0862001293565b6040518263ffffffff1660e01b815260040162001d2791815260200190565b5f604051808303815f87803b15801562001d3f575f80fd5b505af1158015620015c7573d5f803e3d5ffd5b609f5473ffffffffffffffffffffffffffffffffffffffff163314620007ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200143b565b62001de68b63ffffffff1662002782565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af115801562001e85573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001eab919062004147565b9050805f0362001ee6576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462001f30576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff1662001f4d57508962001f50565b508a5b62001f7962001f70848c8c8c8c8c8c8c604051620009bf92919062003bc5565b8f8f84620019f3565b62001fb0576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001c7d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152620027e6565b5f54610100900460ff166200212e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200143b565b620007ee335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60685460ff1615620021e8576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620021f2620028f8565b60685463ffffffff888116610100909204161480620022185750600263ffffffff881610155b1562002250576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff8816620022b457883414620022ab576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f9250620025a1565b3415620022ed576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620023d6576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b158015620023ac575f80fd5b505af1158015620023bf573d5f803e3d5ffd5b5050505080602001519450805f015193506200259f565b8515620023eb57620023eb898b89896200296d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa15801562002456573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200247c919062004147565b9050620024a273ffffffffffffffffffffffffffffffffffffffff8b1633308e62002e80565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa1580156200250d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002533919062004147565b905062002541828262004104565b6068548c9850610100900463ffffffff1696509350620025618762002ee0565b6200256c8c62002ff4565b620025778d620030fd565b6040516020016200258b9392919062003df0565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620025e29897969594939291906200415f565b60405180910390a1620026d462000a9b5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b8615620026e557620026e562001c82565b50505050620018d160018055565b60685460ff1662002730576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000ab2576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002849826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031f59092919063ffffffff16565b80519091501562001c7d57808060200190518101906200286a9190620041d7565b62001c7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200143b565b60026001540362002966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200143b565b6002600155565b5f6200297d6004828486620041f5565b62002988916200421e565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002c02575f808080808080620029ea896004818d620041f5565b810190620029f9919062004267565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002a6d576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002abd576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002af7576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002bb2919062003c25565b5f604051808303815f865af19150503d805f811462002bed576040519150601f19603f3d011682016040523d82523d5f602084013e62002bf2565b606091505b5050505050505050505062000ab2565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002c7e576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080808080808062002c958a6004818e620041f5565b81019062002ca49190620042bd565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002d1a576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002d6a576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002e2e919062003c25565b5f604051808303815f865af19150503d805f811462002e69576040519150601f19603f3d011682016040523d82523d5f602084013e62002e6e565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620015c79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002013565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002f63919062003c25565b5f60405180830381855afa9150503d805f811462002f9d576040519150601f19603f3d011682016040523d82523d5f602084013e62002fa2565b606091505b50915091508162002fe9576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001ad3565b62001ad38162003205565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162003077919062003c25565b5f60405180830381855afa9150503d805f8114620030b1576040519150601f19603f3d011682016040523d82523d5f602084013e620030b6565b606091505b50915091508162002fe9576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001ad3565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff8616916200317f919062003c25565b5f60405180830381855afa9150503d805f8114620031b9576040519150601f19603f3d011682016040523d82523d5f602084013e620031be565b606091505b5091509150818015620031d2575080516020145b620031df57601262001ad3565b8080602001905181019062001ad3919062004344565b606062001ad384845f85620033f0565b606060408251106200322757818060200190518101906200088c919062004362565b8151602003620033b2575f5b6020811080156200327e575082818151811062003254576200325462003eba565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620032995780620032908162003f14565b91505062003233565b805f03620032dc57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115620032f957620032f962003bd4565b6040519080825280601f01601f19166020018201604052801562003324576020820181803683370190505b5090505f5b82811015620033aa5784818151811062003347576200334762003eba565b602001015160f81c60f81b82828151811062003367576200336762003eba565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620033a18162003f14565b91505062003329565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200143b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051620034ae919062003c25565b5f6040518083038185875af1925050503d805f8114620034ea576040519150601f19603f3d011682016040523d82523d5f602084013e620034ef565b606091505b509150915062003502878383876200350d565b979650505050505050565b60608315620035a75782515f036200359f5773ffffffffffffffffffffffffffffffffffffffff85163b6200359f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200143b565b508162001ad3565b62001ad38383815115620035be5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200143b9190620043dd565b611b0d80620043f283390190565b803563ffffffff81168114620033eb575f80fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620019f0575f80fd5b5f80604083850312156200364a575f80fd5b620036558362003602565b91506020830135620036678162003616565b809150509250929050565b8015158114620019f0575f80fd5b5f8083601f84011262003691575f80fd5b50813567ffffffffffffffff811115620036a9575f80fd5b602083019150836020828501011115620036c1575f80fd5b9250929050565b5f805f805f60808688031215620036dd575f80fd5b620036e88662003602565b94506020860135620036fa8162003616565b935060408601356200370c8162003672565b9250606086013567ffffffffffffffff81111562003728575f80fd5b620037368882890162003680565b969995985093965092949392505050565b5f6020828403121562003758575f80fd5b5035919050565b5f6020828403121562003770575f80fd5b6200377b8262003602565b9392505050565b8061040081018310156200088c575f80fd5b5f805f805f805f805f805f6105208c8e031215620037b0575f80fd5b620037bc8d8d62003782565b9a50620037cd6104008d0162003602565b99506104208c013598506104408c01359750620037ee6104608d0162003602565b96506104808c0135620038018162003616565b9550620038126104a08d0162003602565b94506104c08c0135620038258162003616565b93506104e08c013592506105008c013567ffffffffffffffff8111156200384a575f80fd5b620038588e828f0162003680565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562003883575f80fd5b81356200377b8162003616565b60ff81168114620019f0575f80fd5b5f805f805f805f60e0888a031215620038b6575f80fd5b8735620038c38162003890565b9650620038d36020890162003602565b95506040880135620038e58162003616565b9450620038f56060890162003602565b93506080880135620039078162003616565b9699959850939692959460a0840135945060c09093013592915050565b5f805f6060848603121562003937575f80fd5b620039428462003602565b92506020840135620039548162003616565b91506040840135620039668162003616565b809150509250925092565b5f805f805f805f60a0888a03121562003988575f80fd5b620039938862003602565b96506020880135620039a58162003616565b9550604088013567ffffffffffffffff80821115620039c2575f80fd5b620039d08b838c0162003680565b909750955060608a0135915080821115620039e9575f80fd5b50620039f88a828b0162003680565b909450925050608088013562003a0e8162003890565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003a35575f80fd5b62003a408862003602565b9650602088013562003a528162003616565b955060408801359450606088013562003a6b8162003616565b9350608088013562003a7d8162003672565b925060a088013567ffffffffffffffff81111562003a99575f80fd5b62003aa78a828b0162003680565b989b979a50959850939692959293505050565b5f805f80610460858703121562003acf575f80fd5b8435935062003ae2866020870162003782565b925062003af3610420860162003602565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003bab828501878962003b04565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003c1d57818101518382015260200162003c03565b50505f910152565b5f825162003c3881846020870162003c01565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003c8c5762003c8c62003bd4565b604052919050565b5f67ffffffffffffffff82111562003cb05762003cb062003bd4565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011262003cec575f80fd5b813562003d0362003cfd8262003c94565b62003c42565b81815284602083860101111562003d18575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003d47575f80fd5b833567ffffffffffffffff8082111562003d5f575f80fd5b62003d6d8783880162003cdc565b9450602086013591508082111562003d83575f80fd5b5062003d928682870162003cdc565b9250506040840135620039668162003890565b5f815180845262003dbe81602086016020860162003c01565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f62003e04606083018662003da5565b828103602084015262003e18818662003da5565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200350260808301848662003b04565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003eb060608301848662003b04565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003f475762003f4762003ee7565b5060010190565b606081525f62003f6360608301878962003b04565b828103602084015262003f7881868862003b04565b91505060ff831660408301529695505050505050565b5f835162003fa181846020880162003c01565b83519083019062003fb781836020880162003c01565b01949350505050565b600181815b808511156200401f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562004003576200400362003ee7565b808516156200401157918102915b93841c939080029062003fc5565b509250929050565b5f8262004037575060016200088c565b816200404557505f6200088c565b81600181146200405e5760028114620040695762004089565b60019150506200088c565b60ff8411156200407d576200407d62003ee7565b50506001821b6200088c565b5060208310610133831016604e8410600b8410161715620040ae575081810a6200088c565b620040ba838362003fc0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620040ef57620040ef62003ee7565b029392505050565b5f6200377b838362004027565b818103818111156200088c576200088c62003ee7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6020828403121562004158575f80fd5b5051919050565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620041be8285018762003da5565b925080851660e085015250509998505050505050505050565b5f60208284031215620041e8575f80fd5b81516200377b8162003672565b5f808585111562004204575f80fd5b8386111562004211575f80fd5b5050820193919092039150565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156200425f5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a0312156200427e575f80fd5b87356200428b8162003616565b965060208801356200429d8162003616565b955060408801359450606088013593506080880135620039078162003890565b5f805f805f805f80610100898b031215620042d6575f80fd5b8835620042e38162003616565b97506020890135620042f58162003616565b965060408901359550606089013594506080890135620043158162003672565b935060a0890135620043278162003890565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004355575f80fd5b81516200377b8162003890565b5f6020828403121562004373575f80fd5b815167ffffffffffffffff8111156200438a575f80fd5b8201601f810184136200439b575f80fd5b8051620043ac62003cfd8262003c94565b818152856020838501011115620043c1575f80fd5b620043d482602083016020860162003c01565b95945050505050565b602081525f6200377b602083018462003da556fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a26469706673582212205357fe4be099d7eba3ac721350adeffb75403935ecb3ea1a84747cf8b5f23c3564736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMBridgeV2.json b/compiled-contracts/PolygonZkEVMBridgeV2.json index 99084e180..ef679b496 100644 --- a/compiled-contracts/PolygonZkEVMBridgeV2.json +++ b/compiled-contracts/PolygonZkEVMBridgeV2.json @@ -3,6 +3,11 @@ "contractName": "PolygonZkEVMBridgeV2", "sourceName": "contracts/v2/PolygonZkEVMBridgeV2.sol", "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, { "inputs": [], "name": "AlreadyClaimed", @@ -23,6 +28,11 @@ "name": "EtherTransferFailed", "type": "error" }, + { + "inputs": [], + "name": "FailedTokenWrappedDeployment", + "type": "error" + }, { "inputs": [], "name": "GasTokenNetworkMustBeZeroOnEther", @@ -246,6 +256,19 @@ "name": "NewWrappedToken", "type": "event" }, + { + "inputs": [], + "name": "BASE_INIT_BYTECODE_WRAPPED_TOKEN", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "WETHToken", @@ -394,6 +417,35 @@ "stateMutability": "pure", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "originNetwork", + "type": "uint32" + }, + { + "internalType": "address", + "name": "originTokenAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "calculateTokenWrapperAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -572,6 +624,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "gasTokenMetadata", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "gasTokenNetwork", @@ -647,6 +712,25 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "getTokenMetadata", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -710,6 +794,11 @@ "internalType": "address", "name": "_polygonRollupManager", "type": "address" + }, + { + "internalType": "bytes", + "name": "_gasTokenMetadata", + "type": "bytes" } ], "name": "initialize", @@ -917,8 +1006,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561000f575f80fd5b50615f898061001d5f395ff3fe608060405260043610620001d3575f3560e01c80638ed7e3f211620000fa578063cd5865791162000092578063dbc16976116200006a578063dbc169761462000685578063ee25560b146200069c578063f5efcd7914620006cb578063fb57083414620006ef575f80fd5b8063cd5865791462000620578063d02103ca1462000637578063d3476afe1462000661575f80fd5b8063bab161bf11620000d2578063bab161bf146200057a578063be5831c7146200059d578063cc46163214620005d8578063ccaa2d1114620005fc575f80fd5b80638ed7e3f21462000511578063aaa13cc21462000532578063b8b284d01462000556575f80fd5b80633cbc795b116200016e5780635ca1e16511620001465780635ca1e165146200048757806379e2cf97146200049e57806381b1c17414620004b557806383f2440314620004ed575f80fd5b80633cbc795b14620003285780633e19704314620003745780634b2f336d1462000466575f80fd5b8063240ff37811620001ae578063240ff378146200025d5780632dfdf0b51462000274578063318aee3d146200029a5780633c351e101462000307575f80fd5b806315064c9614620001d75780632072f6c5146200020757806322e95f2c1462000220575b5f80fd5b348015620001e3575f80fd5b50606854620001f29060ff1681565b60405190151581526020015b60405180910390f35b34801562000213575f80fd5b506200021e62000713565b005b3480156200022c575f80fd5b50620002446200023e36600462003723565b62000764565b6040516001600160a01b039091168152602001620001fe565b6200021e6200026e366004620037b3565b620007f9565b34801562000280575f80fd5b506200028b60535481565b604051908152602001620001fe565b348015620002a6575f80fd5b50620002e2620002b836600462003832565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201620001fe565b34801562000313575f80fd5b50606d5462000244906001600160a01b031681565b34801562000334575f80fd5b50606d546200035e9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001620001fe565b34801562000380575f80fd5b506200028b6200039236600462003866565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b34801562000472575f80fd5b50606e5462000244906001600160a01b031681565b34801562000493575f80fd5b506200028b62000862565b348015620004aa575f80fd5b506200021e62000947565b348015620004c1575f80fd5b5062000244620004d3366004620038eb565b606a6020525f90815260409020546001600160a01b031681565b348015620004f9575f80fd5b506200028b6200050b36600462003915565b62000981565b3480156200051d575f80fd5b50606c5462000244906001600160a01b031681565b3480156200053e575f80fd5b50620002446200055036600462003956565b62000a64565b34801562000562575f80fd5b506200021e6200057436600462003a03565b62000bf4565b34801562000586575f80fd5b506068546200035e90610100900463ffffffff1681565b348015620005a9575f80fd5b506068546200035e90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b348015620005e4575f80fd5b50620001f2620005f636600462003a8b565b62000cc9565b34801562000608575f80fd5b506200021e6200061a36600462003ac1565b62000d58565b6200021e6200063136600462003bb5565b6200144d565b34801562000643575f80fd5b5060685462000244906501000000000090046001600160a01b031681565b3480156200066d575f80fd5b506200021e6200067f36600462003c51565b62001a03565b34801562000691575f80fd5b506200021e62001dd7565b348015620006a8575f80fd5b506200028b620006ba366004620038eb565b60696020525f908152604090205481565b348015620006d7575f80fd5b506200021e620006e936600462003ac1565b62001e26565b348015620006fb575f80fd5b50620001f26200070d36600462003cc5565b620021aa565b606c546001600160a01b0316331462000758576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000762620021c5565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b3415801590620008135750606e546001600160a01b031615155b156200084b576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200085b85853486868662002258565b5050505050565b6053545f90819081805b60208110156200093e578083901c600116600103620008cf57603381602081106200089b576200089b62003d0f565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620008fc565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620009359062003d69565b9150506200086c565b50919392505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000762576200076262002340565b5f83815b602081101562000a5b57600163ffffffff8516821c81169003620009f757848160208110620009b857620009b862003d0f565b602002013582604051602001620009d9929190918252602082015260400190565b60405160208183030381529060405280519060200120915062000a46565b8185826020811062000a0d5762000a0d62003d0f565b602002013560405160200162000a2d929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062000a528162003d69565b91505062000985565b50949350505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b30836040518060200162000af890620036e9565b601f1982820381018352601f90910116604081905262000b25908d908d908d908d908d9060200162003dcc565b60408051601f198184030181529082905262000b45929160200162003e30565b6040516020818303038152906040528051906020012060405160200162000bce94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b606e546001600160a01b031662000c37576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606e546040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018690526001600160a01b0390911690639dc29fac906044015f604051808303815f87803b15801562000c9a575f80fd5b505af115801562000cad573d5f803e3d5ffd5b5050505062000cc186868686868662002258565b505050505050565b6068545f908190610100900463ffffffff1615801562000cef575063ffffffff83166001145b1562000d03575063ffffffff831662000d2f565b62000d1a64010000000063ffffffff851662003e62565b62000d2c9063ffffffff861662003e7c565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000d96576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161462000de0576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000ee78c8c8c8c8c62000ee15f8e8e8e8e8e8e8e60405162000e0592919062003e92565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62002409565b6001600160a01b0386166200105657606e546001600160a01b031662000fd4575f6001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000f40576020820181803683370190505b5060405162000f50919062003ece565b5f6040518083038185875af1925050503d805f811462000f8c576040519150601f19603f3d011682016040523d82523d5f602084013e62000f91565b606091505b505090508062000fcd576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50620013e3565b606e546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015260248201869052909116906340c10f19906044015f604051808303815f87803b15801562001039575f80fd5b505af11580156200104c573d5f803e3d5ffd5b50505050620013e3565b606d546001600160a01b038781169116148015620010965750606d5463ffffffff8881167401000000000000000000000000000000000000000090920416145b15620010af575f6001600160a01b038516848262000f15565b60685463ffffffff610100909104811690881603620010e457620010de6001600160a01b0387168585620025e1565b620013e3565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b03168062001367575f80806200118b8688018862003fa1565b9250925092505f85848484604051620011a490620036e9565b620011b2939291906200404a565b8190604051809103905ff5905080158015620011d0573d5f803e3d5ffd5b506040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562001236575f80fd5b505af115801562001249573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b6040516200135595949392919062004086565b60405180910390a150505050620013e0565b6040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b158015620013c8575f80fd5b505af1158015620013db573d5f803e3d5ffd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156200148b576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200149562002691565b60685463ffffffff610100909104811690881603620014e0576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f806060876001600160a01b03881662001563578834146200152e576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d546001600160a01b038116945074010000000000000000000000000000000000000000900463ffffffff169250620018a2565b34156200159c576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606e546001600160a01b03908116908916036200162f576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018a90526001600160a01b03891690639dc29fac906044015f604051808303815f87803b15801562001612575f80fd5b505af115801562001625573d5f803e3d5ffd5b50505050620018a2565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620016fe576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b90526001600160a01b038a1690639dc29fac906044015f604051808303815f87803b158015620016d4575f80fd5b505af1158015620016e7573d5f803e3d5ffd5b5050505080602001519450805f01519350620018a0565b8515620017135762001713898b898962002706565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa15801562001771573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620017979190620040c0565b9050620017b06001600160a01b038b1633308e62002bb1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa1580156200180e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620018349190620040c0565b9050620018428282620040d8565b6068548c9850610100900463ffffffff1696509350620018628762002c04565b6200186d8c62002d0b565b620018788d62002e07565b6040516020016200188c939291906200404a565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620018e3989796959493929190620040ee565b60405180910390a1620019db620019d55f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62002ef2565b8615620019ec57620019ec62002340565b50505050620019fa60018055565b50505050505050565b5f54610100900460ff161580801562001a2257505f54600160ff909116105b8062001a3d5750303b15801562001a3d57505f5460ff166001145b62001acf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801562001b2c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8916027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016848316179055606d541662001c3157606d5474010000000000000000000000000000000000000000900463ffffffff161562001c2b576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001d63565b606d805463ffffffff861674010000000000000000000000000000000000000000027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b038816171790556040515f9060129062001c9890620036e9565b6060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff909116604082015260e0018190604051809103905ff590508015801562001d29573d5f803e3d5ffd5b50606e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790555b62001d6d62003007565b801562000cc1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b606c546001600160a01b0316331462001e1c576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000762620030a9565b60685460ff161562001e64576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161462001eae576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001ed48c8c8c8c8c62000ee160018e8e8e8e8e8e8e60405162000e0592919062003e92565b606e545f906001600160a01b031662001fbd57846001600160a01b031684888a868660405160240162001f0b949392919062004159565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f2000000000000000000000000000000000000000000000000000000001790525162001f70919062003ece565b5f6040518083038185875af1925050503d805f811462001fac576040519150601f19603f3d011682016040523d82523d5f602084013e62001fb1565b606091505b50508091505062002107565b606e546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260248201879052909116906340c10f19906044015f604051808303815f87803b15801562002022575f80fd5b505af115801562002035573d5f803e3d5ffd5b50505050846001600160a01b0316878985856040516024016200205c949392919062004159565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f20000000000000000000000000000000000000000000000000000000017905251620020c1919062003ece565b5f604051808303815f865af19150503d805f8114620020fc576040519150601f19603f3d011682016040523d82523d5f602084013e62002101565b606091505b50909150505b806200213f576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f81620021b986868662000981565b1490505b949350505050565b60685460ff161562002203576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff610100909104811690871603620022a3576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051620022f99998979695949392919062004193565b60405180910390a162002334620019d56001606860019054906101000a900463ffffffff16338a8a8a898960405162000e0592919062003e92565b821562000cc15762000cc15b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d620023b962000862565b6040518263ffffffff1660e01b8152600401620023d891815260200190565b5f604051808303815f87803b158015620023f0575f80fd5b505af115801562002403573d5f803e3d5ffd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af11580156200249b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620024c19190620040c0565b9050805f03620024fc576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80680100000000000000008716600103620025605786915062002523848a8489620021aa565b6200255a576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620025ca565b602087901c6200257281600162004200565b91508792506200259162002588868c8662000981565b8a8389620021aa565b620025c8576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b620025d6828262003138565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526200268c9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262003200565b505050565b600260015403620026ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001ac6565b6002600155565b5f62002716600482848662004227565b620027219162004250565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002967575f80808080808062002783896004818d62004227565b81019062002792919062004299565b9650965096509650965096509650336001600160a01b0316876001600160a01b031614620027ec576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03861630146200282f576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002869576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002917919062003ece565b5f604051808303815f865af19150503d805f811462002952576040519150601f19603f3d011682016040523d82523d5f602084013e62002957565b606091505b505050505050505050506200085b565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c0000000000000000000000000000000000000000000000000000000014620029e3576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80808080808080620029fa8a6004818e62004227565b81019062002a099190620042ef565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462002a65576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038716301462002aa8576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002b5f919062003ece565b5f604051808303815f865af19150503d805f811462002b9a576040519150601f19603f3d011682016040523d82523d5f602084013e62002b9f565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052620024039085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002627565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b0386169162002c7a919062003ece565b5f60405180830381855afa9150503d805f811462002cb4576040519150601f19603f3d011682016040523d82523d5f602084013e62002cb9565b606091505b50915091508162002d00576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250620021bd565b620021bd8162003305565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b0386169162002d81919062003ece565b5f60405180830381855afa9150503d805f811462002dbb576040519150601f19603f3d011682016040523d82523d5f602084013e62002dc0565b606091505b50915091508162002d00576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250620021bd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b0386169162002e7c919062003ece565b5f60405180830381855afa9150503d805f811462002eb6576040519150601f19603f3d011682016040523d82523d5f602084013e62002ebb565b606091505b509150915081801562002ecf575080516020145b62002edc576012620021bd565b80806020019051810190620021bd919062004376565b80600162002f0360206002620044cb565b62002f0f9190620040d8565b6053541062002f4a576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462002f5b9062003d69565b918290555090505f5b602081101562002ff6578082901c60011660010362002f9c57826033826020811062002f945762002f9462003d0f565b015550505050565b6033816020811062002fb25762002fb262003d0f565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062002fed9062003d69565b91505062002f64565b506200268c620044d8565b60018055565b5f54610100900460ff166200309f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001ac6565b62000762620034f0565b60685460ff16620030e6576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b6068545f90610100900463ffffffff161580156200315c575063ffffffff82166001145b1562003170575063ffffffff82166200319c565b6200318764010000000063ffffffff841662003e62565b620031999063ffffffff851662003e7c565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620019fa576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62003256826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620035889092919063ffffffff16565b8051909150156200268c578080602001905181019062003277919062004505565b6200268c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001ac6565b60606040825110620033275781806020019051810190620007f3919062004523565b8151602003620034b2575f5b6020811080156200337e575082818151811062003354576200335462003d0f565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620033995780620033908162003d69565b91505062003333565b805f03620033dc57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115620033f957620033f962003ea1565b6040519080825280601f01601f19166020018201604052801562003424576020820181803683370190505b5090505f5b82811015620034aa5784818151811062003447576200344762003d0f565b602001015160f81c60f81b82828151811062003467576200346762003d0f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620034a18162003d69565b91505062003429565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b5f54610100900460ff1662003001576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001ac6565b6060620021bd84845f85855f80866001600160a01b03168587604051620035b0919062003ece565b5f6040518083038185875af1925050503d805f8114620035ec576040519150601f19603f3d011682016040523d82523d5f602084013e620035f1565b606091505b509150915062003604878383876200360f565b979650505050505050565b606083156200369c5782515f0362003694576001600160a01b0385163b62003694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001ac6565b5081620021bd565b620021bd8383815115620036b35781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001ac691906200459e565b6119a180620045b383390190565b803563ffffffff81168114620034eb575f80fd5b6001600160a01b038116811462003720575f80fd5b50565b5f806040838503121562003735575f80fd5b6200374083620036f7565b9150602083013562003752816200370b565b809150509250929050565b801515811462003720575f80fd5b5f8083601f8401126200377c575f80fd5b50813567ffffffffffffffff81111562003794575f80fd5b602083019150836020828501011115620037ac575f80fd5b9250929050565b5f805f805f60808688031215620037c8575f80fd5b620037d386620036f7565b94506020860135620037e5816200370b565b93506040860135620037f7816200375d565b9250606086013567ffffffffffffffff81111562003813575f80fd5b62003821888289016200376b565b969995985093965092949392505050565b5f6020828403121562003843575f80fd5b813562003850816200370b565b9392505050565b60ff8116811462003720575f80fd5b5f805f805f805f60e0888a0312156200387d575f80fd5b87356200388a8162003857565b96506200389a60208901620036f7565b95506040880135620038ac816200370b565b9450620038bc60608901620036f7565b93506080880135620038ce816200370b565b9699959850939692959460a0840135945060c09093013592915050565b5f60208284031215620038fc575f80fd5b5035919050565b806104008101831015620007f3575f80fd5b5f805f610440848603121562003929575f80fd5b833592506200393c856020860162003903565b91506200394d6104208501620036f7565b90509250925092565b5f805f805f805f60a0888a0312156200396d575f80fd5b6200397888620036f7565b965060208801356200398a816200370b565b9550604088013567ffffffffffffffff80821115620039a7575f80fd5b620039b58b838c016200376b565b909750955060608a0135915080821115620039ce575f80fd5b50620039dd8a828b016200376b565b9094509250506080880135620039f38162003857565b8091505092959891949750929550565b5f805f805f8060a0878903121562003a19575f80fd5b62003a2487620036f7565b9550602087013562003a36816200370b565b945060408701359350606087013562003a4f816200375d565b9250608087013567ffffffffffffffff81111562003a6b575f80fd5b62003a7989828a016200376b565b979a9699509497509295939492505050565b5f806040838503121562003a9d575f80fd5b62003aa883620036f7565b915062003ab860208401620036f7565b90509250929050565b5f805f805f805f805f805f806109208d8f03121562003ade575f80fd5b62003aea8e8e62003903565b9b5062003afc8e6104008f0162003903565b9a506108008d013599506108208d013598506108408d0135975062003b256108608e01620036f7565b965062003b376108808e01356200370b565b6108808d0135955062003b4e6108a08e01620036f7565b945062003b606108c08e01356200370b565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111562003b8a575f80fd5b62003b9d8e6109008f01358f016200376b565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121562003bcc575f80fd5b62003bd788620036f7565b9650602088013562003be9816200370b565b955060408801359450606088013562003c02816200370b565b9350608088013562003c14816200375d565b925060a088013567ffffffffffffffff81111562003c30575f80fd5b62003c3e8a828b016200376b565b989b979a50959850939692959293505050565b5f805f805f60a0868803121562003c66575f80fd5b62003c7186620036f7565b9450602086013562003c83816200370b565b935062003c9360408701620036f7565b9250606086013562003ca5816200370b565b9150608086013562003cb7816200370b565b809150509295509295909350565b5f805f80610460858703121562003cda575f80fd5b8435935062003ced866020870162003903565b925062003cfe6104208601620036f7565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003d9c5762003d9c62003d3c565b5060010190565b81835281816020850137505f602082840101525f6020601f19601f840116840101905092915050565b606081525f62003de160608301878962003da3565b828103602084015262003df681868862003da3565b91505060ff831660408301529695505050505050565b5f5b8381101562003e2857818101518382015260200162003e0e565b50505f910152565b5f835162003e4381846020880162003e0c565b83519083019062003e5981836020880162003e0c565b01949350505050565b8082028115828204841417620007f357620007f362003d3c565b80820180821115620007f357620007f362003d3c565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f825162003ee181846020870162003e0c565b9190910192915050565b604051601f8201601f1916810167ffffffffffffffff8111828210171562003f175762003f1762003ea1565b604052919050565b5f67ffffffffffffffff82111562003f3b5762003f3b62003ea1565b50601f01601f191660200190565b5f82601f83011262003f59575f80fd5b813562003f7062003f6a8262003f1f565b62003eeb565b81815284602083860101111562003f85575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003fb4575f80fd5b833567ffffffffffffffff8082111562003fcc575f80fd5b62003fda8783880162003f49565b9450602086013591508082111562003ff0575f80fd5b5062003fff8682870162003f49565b9250506040840135620040128162003857565b809150509250925092565b5f81518084526200403681602086016020860162003e0c565b601f01601f19169290920160200192915050565b606081525f6200405e60608301866200401d565b82810360208401526200407281866200401d565b91505060ff83166040830152949350505050565b63ffffffff861681525f6001600160a01b038087166020840152808616604084015250608060608301526200360460808301848662003da3565b5f60208284031215620040d1575f80fd5b5051919050565b81810381811115620007f357620007f362003d3c565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c085015262004140828501876200401d565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f6200418960608301848662003da3565b9695505050505050565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620041e6828501878962003da3565b925080851660e085015250509a9950505050505050505050565b63ffffffff81811683821601908082111562004220576200422062003d3c565b5092915050565b5f808585111562004236575f80fd5b8386111562004243575f80fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620042915780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215620042b0575f80fd5b8735620042bd816200370b565b96506020880135620042cf816200370b565b955060408801359450606088013593506080880135620038ce8162003857565b5f805f805f805f80610100898b03121562004308575f80fd5b883562004315816200370b565b9750602089013562004327816200370b565b96506040890135955060608901359450608089013562004347816200375d565b935060a0890135620043598162003857565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004387575f80fd5b8151620038508162003857565b600181815b80851115620043f357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620043d757620043d762003d3c565b80851615620043e557918102915b93841c939080029062004399565b509250929050565b5f826200440b57506001620007f3565b816200441957505f620007f3565b81600181146200443257600281146200443d576200445d565b6001915050620007f3565b60ff84111562004451576200445162003d3c565b50506001821b620007f3565b5060208310610133831016604e8410600b841016171562004482575081810a620007f3565b6200448e838362004394565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620044c357620044c362003d3c565b029392505050565b5f620038508383620043fb565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6020828403121562004516575f80fd5b815162003850816200375d565b5f6020828403121562004534575f80fd5b815167ffffffffffffffff8111156200454b575f80fd5b8201601f810184136200455c575f80fd5b80516200456d62003f6a8262003f1f565b81815285602083850101111562004582575f80fd5b6200459582602083016020860162003e0c565b95945050505050565b602081525f6200385060208301846200401d56fe61010060405234801562000011575f80fd5b50604051620019a1380380620019a1833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516115036200049e5f395f61022d01525f81816102fb015281816105ad015261067a01525f61052801525f818161036d01526104f201526115035ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b6040516101879190611255565b60405180910390f35b6101a361019e3660046112e6565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461130e565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d3660046112e6565b61054a565b6102856102803660046112e6565b610595565b005b6101b7610295366004611347565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca366004611347565b60056020525f908152604090205481565b61017a610653565b6102856102f13660046112e6565b610662565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a36103503660046112e6565b610717565b6101a36103633660046112e6565b6107cd565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d366004611367565b6107da565b6101b76103b03660046113d4565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611405565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611405565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610ad7565b60019150505b92915050565b5f336104d9858285610c56565b6104e4858585610d12565b506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146105255761052046610f31565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c09082908690610590908790611483565b610ad7565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106455760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61064f8282610ff8565b5050565b60606004805461043290611405565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461070d5760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d42726964676500000000000000000000000000000000606482015260840161063c565b61064f82826110cf565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107c05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161063c565b6104e48286868403610ad7565b5f336104c0818585610d12565b8342111561084f5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d697400000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866108a883611496565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6109126104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156109d3573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610a4e57508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610ac05760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e617475726500000000000000000000000000000000000000000000000000606482015260840161063c565b610acb8a8a8a610ad7565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610b5f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610be85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d0c5781811015610cff5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161063c565b610d0c8484848403610ad7565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610d9b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610e245760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610ebf5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610d0c565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610f5b610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff821661105b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161063c565b8060025f82825461106c9190611483565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166111585760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260208190526040902054818110156111f35760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610c49565b5f6020808352835180828501525f5b8181101561128057858101830151858201604001528201611264565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146112e1575f80fd5b919050565b5f80604083850312156112f7575f80fd5b611300836112be565b946020939093013593505050565b5f805f60608486031215611320575f80fd5b611329846112be565b9250611337602085016112be565b9150604084013590509250925092565b5f60208284031215611357575f80fd5b611360826112be565b9392505050565b5f805f805f805f60e0888a03121561137d575f80fd5b611386886112be565b9650611394602089016112be565b95506040880135945060608801359350608088013560ff811681146113b7575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f80604083850312156113e5575f80fd5b6113ee836112be565b91506113fc602084016112be565b90509250929050565b600181811c9082168061141957607f821691505b602082108103611450577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c6611456565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036114c6576114c6611456565b506001019056fea2646970667358221220176a1a9cf4a702d3853b858873fff4a6370c4e5d7d72d68593ec0ebe64fcc26964736f6c63430008140033a26469706673582212209002ffc0c7cb9056d22d47ac65cf05714a8ae8ce0af7e882f7e68b9fdede830e64736f6c63430008140033", - "deployedBytecode": "0x608060405260043610620001d3575f3560e01c80638ed7e3f211620000fa578063cd5865791162000092578063dbc16976116200006a578063dbc169761462000685578063ee25560b146200069c578063f5efcd7914620006cb578063fb57083414620006ef575f80fd5b8063cd5865791462000620578063d02103ca1462000637578063d3476afe1462000661575f80fd5b8063bab161bf11620000d2578063bab161bf146200057a578063be5831c7146200059d578063cc46163214620005d8578063ccaa2d1114620005fc575f80fd5b80638ed7e3f21462000511578063aaa13cc21462000532578063b8b284d01462000556575f80fd5b80633cbc795b116200016e5780635ca1e16511620001465780635ca1e165146200048757806379e2cf97146200049e57806381b1c17414620004b557806383f2440314620004ed575f80fd5b80633cbc795b14620003285780633e19704314620003745780634b2f336d1462000466575f80fd5b8063240ff37811620001ae578063240ff378146200025d5780632dfdf0b51462000274578063318aee3d146200029a5780633c351e101462000307575f80fd5b806315064c9614620001d75780632072f6c5146200020757806322e95f2c1462000220575b5f80fd5b348015620001e3575f80fd5b50606854620001f29060ff1681565b60405190151581526020015b60405180910390f35b34801562000213575f80fd5b506200021e62000713565b005b3480156200022c575f80fd5b50620002446200023e36600462003723565b62000764565b6040516001600160a01b039091168152602001620001fe565b6200021e6200026e366004620037b3565b620007f9565b34801562000280575f80fd5b506200028b60535481565b604051908152602001620001fe565b348015620002a6575f80fd5b50620002e2620002b836600462003832565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201620001fe565b34801562000313575f80fd5b50606d5462000244906001600160a01b031681565b34801562000334575f80fd5b50606d546200035e9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001620001fe565b34801562000380575f80fd5b506200028b6200039236600462003866565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b34801562000472575f80fd5b50606e5462000244906001600160a01b031681565b34801562000493575f80fd5b506200028b62000862565b348015620004aa575f80fd5b506200021e62000947565b348015620004c1575f80fd5b5062000244620004d3366004620038eb565b606a6020525f90815260409020546001600160a01b031681565b348015620004f9575f80fd5b506200028b6200050b36600462003915565b62000981565b3480156200051d575f80fd5b50606c5462000244906001600160a01b031681565b3480156200053e575f80fd5b50620002446200055036600462003956565b62000a64565b34801562000562575f80fd5b506200021e6200057436600462003a03565b62000bf4565b34801562000586575f80fd5b506068546200035e90610100900463ffffffff1681565b348015620005a9575f80fd5b506068546200035e90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b348015620005e4575f80fd5b50620001f2620005f636600462003a8b565b62000cc9565b34801562000608575f80fd5b506200021e6200061a36600462003ac1565b62000d58565b6200021e6200063136600462003bb5565b6200144d565b34801562000643575f80fd5b5060685462000244906501000000000090046001600160a01b031681565b3480156200066d575f80fd5b506200021e6200067f36600462003c51565b62001a03565b34801562000691575f80fd5b506200021e62001dd7565b348015620006a8575f80fd5b506200028b620006ba366004620038eb565b60696020525f908152604090205481565b348015620006d7575f80fd5b506200021e620006e936600462003ac1565b62001e26565b348015620006fb575f80fd5b50620001f26200070d36600462003cc5565b620021aa565b606c546001600160a01b0316331462000758576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000762620021c5565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b3415801590620008135750606e546001600160a01b031615155b156200084b576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200085b85853486868662002258565b5050505050565b6053545f90819081805b60208110156200093e578083901c600116600103620008cf57603381602081106200089b576200089b62003d0f565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620008fc565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620009359062003d69565b9150506200086c565b50919392505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000762576200076262002340565b5f83815b602081101562000a5b57600163ffffffff8516821c81169003620009f757848160208110620009b857620009b862003d0f565b602002013582604051602001620009d9929190918252602082015260400190565b60405160208183030381529060405280519060200120915062000a46565b8185826020811062000a0d5762000a0d62003d0f565b602002013560405160200162000a2d929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062000a528162003d69565b91505062000985565b50949350505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b30836040518060200162000af890620036e9565b601f1982820381018352601f90910116604081905262000b25908d908d908d908d908d9060200162003dcc565b60408051601f198184030181529082905262000b45929160200162003e30565b6040516020818303038152906040528051906020012060405160200162000bce94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b606e546001600160a01b031662000c37576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606e546040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018690526001600160a01b0390911690639dc29fac906044015f604051808303815f87803b15801562000c9a575f80fd5b505af115801562000cad573d5f803e3d5ffd5b5050505062000cc186868686868662002258565b505050505050565b6068545f908190610100900463ffffffff1615801562000cef575063ffffffff83166001145b1562000d03575063ffffffff831662000d2f565b62000d1a64010000000063ffffffff851662003e62565b62000d2c9063ffffffff861662003e7c565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000d96576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161462000de0576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000ee78c8c8c8c8c62000ee15f8e8e8e8e8e8e8e60405162000e0592919062003e92565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62002409565b6001600160a01b0386166200105657606e546001600160a01b031662000fd4575f6001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000f40576020820181803683370190505b5060405162000f50919062003ece565b5f6040518083038185875af1925050503d805f811462000f8c576040519150601f19603f3d011682016040523d82523d5f602084013e62000f91565b606091505b505090508062000fcd576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50620013e3565b606e546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015260248201869052909116906340c10f19906044015f604051808303815f87803b15801562001039575f80fd5b505af11580156200104c573d5f803e3d5ffd5b50505050620013e3565b606d546001600160a01b038781169116148015620010965750606d5463ffffffff8881167401000000000000000000000000000000000000000090920416145b15620010af575f6001600160a01b038516848262000f15565b60685463ffffffff610100909104811690881603620010e457620010de6001600160a01b0387168585620025e1565b620013e3565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b03168062001367575f80806200118b8688018862003fa1565b9250925092505f85848484604051620011a490620036e9565b620011b2939291906200404a565b8190604051809103905ff5905080158015620011d0573d5f803e3d5ffd5b506040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562001236575f80fd5b505af115801562001249573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b6040516200135595949392919062004086565b60405180910390a150505050620013e0565b6040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b158015620013c8575f80fd5b505af1158015620013db573d5f803e3d5ffd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156200148b576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200149562002691565b60685463ffffffff610100909104811690881603620014e0576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f806060876001600160a01b03881662001563578834146200152e576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d546001600160a01b038116945074010000000000000000000000000000000000000000900463ffffffff169250620018a2565b34156200159c576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606e546001600160a01b03908116908916036200162f576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018a90526001600160a01b03891690639dc29fac906044015f604051808303815f87803b15801562001612575f80fd5b505af115801562001625573d5f803e3d5ffd5b50505050620018a2565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620016fe576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b90526001600160a01b038a1690639dc29fac906044015f604051808303815f87803b158015620016d4575f80fd5b505af1158015620016e7573d5f803e3d5ffd5b5050505080602001519450805f01519350620018a0565b8515620017135762001713898b898962002706565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa15801562001771573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620017979190620040c0565b9050620017b06001600160a01b038b1633308e62002bb1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa1580156200180e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620018349190620040c0565b9050620018428282620040d8565b6068548c9850610100900463ffffffff1696509350620018628762002c04565b6200186d8c62002d0b565b620018788d62002e07565b6040516020016200188c939291906200404a565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620018e3989796959493929190620040ee565b60405180910390a1620019db620019d55f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62002ef2565b8615620019ec57620019ec62002340565b50505050620019fa60018055565b50505050505050565b5f54610100900460ff161580801562001a2257505f54600160ff909116105b8062001a3d5750303b15801562001a3d57505f5460ff166001145b62001acf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801562001b2c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8916027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016848316179055606d541662001c3157606d5474010000000000000000000000000000000000000000900463ffffffff161562001c2b576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001d63565b606d805463ffffffff861674010000000000000000000000000000000000000000027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b038816171790556040515f9060129062001c9890620036e9565b6060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff909116604082015260e0018190604051809103905ff590508015801562001d29573d5f803e3d5ffd5b50606e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790555b62001d6d62003007565b801562000cc1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b606c546001600160a01b0316331462001e1c576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000762620030a9565b60685460ff161562001e64576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161462001eae576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001ed48c8c8c8c8c62000ee160018e8e8e8e8e8e8e60405162000e0592919062003e92565b606e545f906001600160a01b031662001fbd57846001600160a01b031684888a868660405160240162001f0b949392919062004159565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f2000000000000000000000000000000000000000000000000000000001790525162001f70919062003ece565b5f6040518083038185875af1925050503d805f811462001fac576040519150601f19603f3d011682016040523d82523d5f602084013e62001fb1565b606091505b50508091505062002107565b606e546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260248201879052909116906340c10f19906044015f604051808303815f87803b15801562002022575f80fd5b505af115801562002035573d5f803e3d5ffd5b50505050846001600160a01b0316878985856040516024016200205c949392919062004159565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f20000000000000000000000000000000000000000000000000000000017905251620020c1919062003ece565b5f604051808303815f865af19150503d805f8114620020fc576040519150601f19603f3d011682016040523d82523d5f602084013e62002101565b606091505b50909150505b806200213f576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f81620021b986868662000981565b1490505b949350505050565b60685460ff161562002203576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff610100909104811690871603620022a3576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051620022f99998979695949392919062004193565b60405180910390a162002334620019d56001606860019054906101000a900463ffffffff16338a8a8a898960405162000e0592919062003e92565b821562000cc15762000cc15b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d620023b962000862565b6040518263ffffffff1660e01b8152600401620023d891815260200190565b5f604051808303815f87803b158015620023f0575f80fd5b505af115801562002403573d5f803e3d5ffd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af11580156200249b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620024c19190620040c0565b9050805f03620024fc576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80680100000000000000008716600103620025605786915062002523848a8489620021aa565b6200255a576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620025ca565b602087901c6200257281600162004200565b91508792506200259162002588868c8662000981565b8a8389620021aa565b620025c8576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b620025d6828262003138565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526200268c9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262003200565b505050565b600260015403620026ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001ac6565b6002600155565b5f62002716600482848662004227565b620027219162004250565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002967575f80808080808062002783896004818d62004227565b81019062002792919062004299565b9650965096509650965096509650336001600160a01b0316876001600160a01b031614620027ec576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03861630146200282f576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002869576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002917919062003ece565b5f604051808303815f865af19150503d805f811462002952576040519150601f19603f3d011682016040523d82523d5f602084013e62002957565b606091505b505050505050505050506200085b565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c0000000000000000000000000000000000000000000000000000000014620029e3576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80808080808080620029fa8a6004818e62004227565b81019062002a099190620042ef565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462002a65576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038716301462002aa8576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002b5f919062003ece565b5f604051808303815f865af19150503d805f811462002b9a576040519150601f19603f3d011682016040523d82523d5f602084013e62002b9f565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052620024039085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002627565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b0386169162002c7a919062003ece565b5f60405180830381855afa9150503d805f811462002cb4576040519150601f19603f3d011682016040523d82523d5f602084013e62002cb9565b606091505b50915091508162002d00576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250620021bd565b620021bd8162003305565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b0386169162002d81919062003ece565b5f60405180830381855afa9150503d805f811462002dbb576040519150601f19603f3d011682016040523d82523d5f602084013e62002dc0565b606091505b50915091508162002d00576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250620021bd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b0386169162002e7c919062003ece565b5f60405180830381855afa9150503d805f811462002eb6576040519150601f19603f3d011682016040523d82523d5f602084013e62002ebb565b606091505b509150915081801562002ecf575080516020145b62002edc576012620021bd565b80806020019051810190620021bd919062004376565b80600162002f0360206002620044cb565b62002f0f9190620040d8565b6053541062002f4a576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462002f5b9062003d69565b918290555090505f5b602081101562002ff6578082901c60011660010362002f9c57826033826020811062002f945762002f9462003d0f565b015550505050565b6033816020811062002fb25762002fb262003d0f565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062002fed9062003d69565b91505062002f64565b506200268c620044d8565b60018055565b5f54610100900460ff166200309f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001ac6565b62000762620034f0565b60685460ff16620030e6576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b6068545f90610100900463ffffffff161580156200315c575063ffffffff82166001145b1562003170575063ffffffff82166200319c565b6200318764010000000063ffffffff841662003e62565b620031999063ffffffff851662003e7c565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620019fa576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62003256826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620035889092919063ffffffff16565b8051909150156200268c578080602001905181019062003277919062004505565b6200268c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001ac6565b60606040825110620033275781806020019051810190620007f3919062004523565b8151602003620034b2575f5b6020811080156200337e575082818151811062003354576200335462003d0f565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620033995780620033908162003d69565b91505062003333565b805f03620033dc57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115620033f957620033f962003ea1565b6040519080825280601f01601f19166020018201604052801562003424576020820181803683370190505b5090505f5b82811015620034aa5784818151811062003447576200344762003d0f565b602001015160f81c60f81b82828151811062003467576200346762003d0f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620034a18162003d69565b91505062003429565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b5f54610100900460ff1662003001576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001ac6565b6060620021bd84845f85855f80866001600160a01b03168587604051620035b0919062003ece565b5f6040518083038185875af1925050503d805f8114620035ec576040519150601f19603f3d011682016040523d82523d5f602084013e620035f1565b606091505b509150915062003604878383876200360f565b979650505050505050565b606083156200369c5782515f0362003694576001600160a01b0385163b62003694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001ac6565b5081620021bd565b620021bd8383815115620036b35781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001ac691906200459e565b6119a180620045b383390190565b803563ffffffff81168114620034eb575f80fd5b6001600160a01b038116811462003720575f80fd5b50565b5f806040838503121562003735575f80fd5b6200374083620036f7565b9150602083013562003752816200370b565b809150509250929050565b801515811462003720575f80fd5b5f8083601f8401126200377c575f80fd5b50813567ffffffffffffffff81111562003794575f80fd5b602083019150836020828501011115620037ac575f80fd5b9250929050565b5f805f805f60808688031215620037c8575f80fd5b620037d386620036f7565b94506020860135620037e5816200370b565b93506040860135620037f7816200375d565b9250606086013567ffffffffffffffff81111562003813575f80fd5b62003821888289016200376b565b969995985093965092949392505050565b5f6020828403121562003843575f80fd5b813562003850816200370b565b9392505050565b60ff8116811462003720575f80fd5b5f805f805f805f60e0888a0312156200387d575f80fd5b87356200388a8162003857565b96506200389a60208901620036f7565b95506040880135620038ac816200370b565b9450620038bc60608901620036f7565b93506080880135620038ce816200370b565b9699959850939692959460a0840135945060c09093013592915050565b5f60208284031215620038fc575f80fd5b5035919050565b806104008101831015620007f3575f80fd5b5f805f610440848603121562003929575f80fd5b833592506200393c856020860162003903565b91506200394d6104208501620036f7565b90509250925092565b5f805f805f805f60a0888a0312156200396d575f80fd5b6200397888620036f7565b965060208801356200398a816200370b565b9550604088013567ffffffffffffffff80821115620039a7575f80fd5b620039b58b838c016200376b565b909750955060608a0135915080821115620039ce575f80fd5b50620039dd8a828b016200376b565b9094509250506080880135620039f38162003857565b8091505092959891949750929550565b5f805f805f8060a0878903121562003a19575f80fd5b62003a2487620036f7565b9550602087013562003a36816200370b565b945060408701359350606087013562003a4f816200375d565b9250608087013567ffffffffffffffff81111562003a6b575f80fd5b62003a7989828a016200376b565b979a9699509497509295939492505050565b5f806040838503121562003a9d575f80fd5b62003aa883620036f7565b915062003ab860208401620036f7565b90509250929050565b5f805f805f805f805f805f806109208d8f03121562003ade575f80fd5b62003aea8e8e62003903565b9b5062003afc8e6104008f0162003903565b9a506108008d013599506108208d013598506108408d0135975062003b256108608e01620036f7565b965062003b376108808e01356200370b565b6108808d0135955062003b4e6108a08e01620036f7565b945062003b606108c08e01356200370b565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111562003b8a575f80fd5b62003b9d8e6109008f01358f016200376b565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121562003bcc575f80fd5b62003bd788620036f7565b9650602088013562003be9816200370b565b955060408801359450606088013562003c02816200370b565b9350608088013562003c14816200375d565b925060a088013567ffffffffffffffff81111562003c30575f80fd5b62003c3e8a828b016200376b565b989b979a50959850939692959293505050565b5f805f805f60a0868803121562003c66575f80fd5b62003c7186620036f7565b9450602086013562003c83816200370b565b935062003c9360408701620036f7565b9250606086013562003ca5816200370b565b9150608086013562003cb7816200370b565b809150509295509295909350565b5f805f80610460858703121562003cda575f80fd5b8435935062003ced866020870162003903565b925062003cfe6104208601620036f7565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003d9c5762003d9c62003d3c565b5060010190565b81835281816020850137505f602082840101525f6020601f19601f840116840101905092915050565b606081525f62003de160608301878962003da3565b828103602084015262003df681868862003da3565b91505060ff831660408301529695505050505050565b5f5b8381101562003e2857818101518382015260200162003e0e565b50505f910152565b5f835162003e4381846020880162003e0c565b83519083019062003e5981836020880162003e0c565b01949350505050565b8082028115828204841417620007f357620007f362003d3c565b80820180821115620007f357620007f362003d3c565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f825162003ee181846020870162003e0c565b9190910192915050565b604051601f8201601f1916810167ffffffffffffffff8111828210171562003f175762003f1762003ea1565b604052919050565b5f67ffffffffffffffff82111562003f3b5762003f3b62003ea1565b50601f01601f191660200190565b5f82601f83011262003f59575f80fd5b813562003f7062003f6a8262003f1f565b62003eeb565b81815284602083860101111562003f85575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003fb4575f80fd5b833567ffffffffffffffff8082111562003fcc575f80fd5b62003fda8783880162003f49565b9450602086013591508082111562003ff0575f80fd5b5062003fff8682870162003f49565b9250506040840135620040128162003857565b809150509250925092565b5f81518084526200403681602086016020860162003e0c565b601f01601f19169290920160200192915050565b606081525f6200405e60608301866200401d565b82810360208401526200407281866200401d565b91505060ff83166040830152949350505050565b63ffffffff861681525f6001600160a01b038087166020840152808616604084015250608060608301526200360460808301848662003da3565b5f60208284031215620040d1575f80fd5b5051919050565b81810381811115620007f357620007f362003d3c565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c085015262004140828501876200401d565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f6200418960608301848662003da3565b9695505050505050565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620041e6828501878962003da3565b925080851660e085015250509a9950505050505050505050565b63ffffffff81811683821601908082111562004220576200422062003d3c565b5092915050565b5f808585111562004236575f80fd5b8386111562004243575f80fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620042915780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215620042b0575f80fd5b8735620042bd816200370b565b96506020880135620042cf816200370b565b955060408801359450606088013593506080880135620038ce8162003857565b5f805f805f805f80610100898b03121562004308575f80fd5b883562004315816200370b565b9750602089013562004327816200370b565b96506040890135955060608901359450608089013562004347816200375d565b935060a0890135620043598162003857565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004387575f80fd5b8151620038508162003857565b600181815b80851115620043f357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620043d757620043d762003d3c565b80851615620043e557918102915b93841c939080029062004399565b509250929050565b5f826200440b57506001620007f3565b816200441957505f620007f3565b81600181146200443257600281146200443d576200445d565b6001915050620007f3565b60ff84111562004451576200445162003d3c565b50506001821b620007f3565b5060208310610133831016604e8410600b841016171562004482575081810a620007f3565b6200448e838362004394565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620044c357620044c362003d3c565b029392505050565b5f620038508383620043fb565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6020828403121562004516575f80fd5b815162003850816200375d565b5f6020828403121562004534575f80fd5b815167ffffffffffffffff8111156200454b575f80fd5b8201601f810184136200455c575f80fd5b80516200456d62003f6a8262003f1f565b81815285602083850101111562004582575f80fd5b6200459582602083016020860162003e0c565b95945050505050565b602081525f6200385060208301846200401d56fe61010060405234801562000011575f80fd5b50604051620019a1380380620019a1833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516115036200049e5f395f61022d01525f81816102fb015281816105ad015261067a01525f61052801525f818161036d01526104f201526115035ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b6040516101879190611255565b60405180910390f35b6101a361019e3660046112e6565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461130e565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d3660046112e6565b61054a565b6102856102803660046112e6565b610595565b005b6101b7610295366004611347565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca366004611347565b60056020525f908152604090205481565b61017a610653565b6102856102f13660046112e6565b610662565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a36103503660046112e6565b610717565b6101a36103633660046112e6565b6107cd565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d366004611367565b6107da565b6101b76103b03660046113d4565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611405565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611405565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610ad7565b60019150505b92915050565b5f336104d9858285610c56565b6104e4858585610d12565b506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146105255761052046610f31565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c09082908690610590908790611483565b610ad7565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106455760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61064f8282610ff8565b5050565b60606004805461043290611405565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461070d5760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d42726964676500000000000000000000000000000000606482015260840161063c565b61064f82826110cf565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107c05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161063c565b6104e48286868403610ad7565b5f336104c0818585610d12565b8342111561084f5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d697400000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866108a883611496565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6109126104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156109d3573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610a4e57508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610ac05760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e617475726500000000000000000000000000000000000000000000000000606482015260840161063c565b610acb8a8a8a610ad7565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610b5f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610be85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d0c5781811015610cff5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161063c565b610d0c8484848403610ad7565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610d9b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610e245760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610ebf5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610d0c565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610f5b610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff821661105b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161063c565b8060025f82825461106c9190611483565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166111585760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260208190526040902054818110156111f35760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610c49565b5f6020808352835180828501525f5b8181101561128057858101830151858201604001528201611264565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146112e1575f80fd5b919050565b5f80604083850312156112f7575f80fd5b611300836112be565b946020939093013593505050565b5f805f60608486031215611320575f80fd5b611329846112be565b9250611337602085016112be565b9150604084013590509250925092565b5f60208284031215611357575f80fd5b611360826112be565b9392505050565b5f805f805f805f60e0888a03121561137d575f80fd5b611386886112be565b9650611394602089016112be565b95506040880135945060608801359350608088013560ff811681146113b7575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f80604083850312156113e5575f80fd5b6113ee836112be565b91506113fc602084016112be565b90509250929050565b600181811c9082168061141957607f821691505b602082108103611450577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c6611456565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036114c6576114c6611456565b506001019056fea2646970667358221220176a1a9cf4a702d3853b858873fff4a6370c4e5d7d72d68593ec0ebe64fcc26964736f6c63430008140033a26469706673582212209002ffc0c7cb9056d22d47ac65cf05714a8ae8ce0af7e882f7e68b9fdede830e64736f6c63430008140033", + "bytecode": "0x608060405234801562000010575f80fd5b506200001b62000021565b620000e0565b5f54610100900460ff16156200008d5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161015620000de575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b61591b80620000ee5f395ff3fe6080604052600436106101db575f3560e01c806383f24403116100fd578063ccaa2d1111610092578063ee25560b11610062578063ee25560b146105a9578063f5efcd79146105d4578063f811bff7146105f3578063fb57083414610612575f80fd5b8063ccaa2d111461053b578063cd5865791461055a578063d02103ca1461056d578063dbc1697614610595575f80fd5b8063bab161bf116100cd578063bab161bf146104b9578063be5831c7146104da578063c00f14ab146104fd578063cc4616321461051c575f80fd5b806383f244031461043d5780638ed7e3f21461045c578063aaa13cc21461047b578063b8b284d01461049a575f80fd5b80633cbc795b116101735780637843298b116101435780637843298b146103c257806379e2cf97146103e157806381b1c174146103f557806383c43a5514610429575f80fd5b80633cbc795b146103385780633e197043146103705780634b2f336d1461038f5780635ca1e165146103ae575f80fd5b806327aef4e8116101ae57806327aef4e81461026d5780632dfdf0b51461028e578063318aee3d146102b15780633c351e1014610319575f80fd5b806315064c96146101df5780632072f6c51461020d57806322e95f2c14610223578063240ff3781461025a575b5f80fd5b3480156101ea575f80fd5b506068546101f89060ff1681565b60405190151581526020015b60405180910390f35b348015610218575f80fd5b50610221610631565b005b34801561022e575f80fd5b5061024261023d366004612fb9565b610666565b6040516001600160a01b039091168152602001610204565b610221610268366004613040565b6106d0565b348015610278575f80fd5b50610281610759565b6040516102049190613102565b348015610299575f80fd5b506102a360535481565b604051908152602001610204565b3480156102bc575f80fd5b506102f56102cb36600461311b565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201610204565b348015610324575f80fd5b50606d54610242906001600160a01b031681565b348015610343575f80fd5b50606d5461035b90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610204565b34801561037b575f80fd5b506102a361038a366004613144565b6107e5565b34801561039a575f80fd5b50606f54610242906001600160a01b031681565b3480156103b9575f80fd5b506102a361088e565b3480156103cd575f80fd5b506102426103dc3660046131be565b61096a565b3480156103ec575f80fd5b50610221610993565b348015610400575f80fd5b5061024261040f366004613204565b606a6020525f90815260409020546001600160a01b031681565b348015610434575f80fd5b506102816109b4565b348015610448575f80fd5b506102a361045736600461322c565b6109d3565b348015610467575f80fd5b50606c54610242906001600160a01b031681565b348015610486575f80fd5b5061024261049536600461332d565b610aa8565b3480156104a5575f80fd5b506102216104b43660046133c3565b610be7565b3480156104c4575f80fd5b5060685461035b90610100900463ffffffff1681565b3480156104e5575f80fd5b5060685461035b90600160c81b900463ffffffff1681565b348015610508575f80fd5b5061028161051736600461311b565b610cc2565b348015610527575f80fd5b506101f8610536366004613441565b610d07565b348015610546575f80fd5b50610221610555366004613472565b610d8f565b610221610568366004613556565b6112c0565b348015610578575f80fd5b50606854610242906501000000000090046001600160a01b031681565b3480156105a0575f80fd5b5061022161172c565b3480156105b4575f80fd5b506102a36105c3366004613204565b60696020525f908152604090205481565b3480156105df575f80fd5b506102216105ee366004613472565b61175f565b3480156105fe575f80fd5b5061022161060d3660046135e6565b611a25565b34801561061d575f80fd5b506101f861062c366004613689565b611d40565b606c546001600160a01b0316331461065c57604051631736745960e31b815260040160405180910390fd5b610664611d57565b565b6040805160e084901b6001600160e01b031916602080830191909152606084901b6bffffffffffffffffffffffff1916602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b60685460ff16156106f457604051630bc011ff60e21b815260040160405180910390fd5b341580159061070d5750606f546001600160a01b031615155b15610744576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610752858534868686611db2565b5050505050565b606e8054610766906136ce565b80601f0160208091040260200160405190810160405280929190818152602001828054610792906136ce565b80156107dd5780601f106107b4576101008083540402835291602001916107dd565b820191905f5260205f20905b8154815290600101906020018083116107c057829003601f168201915b505050505081565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201526001600160e01b031960e088811b821660218401526bffffffffffffffffffffffff19606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b6053545f90819081805b6020811015610961578083901c6001166001036108f557603381602081106108c2576108c2613706565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610922565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806109599061372e565b915050610898565b50919392505050565b5f61098b848461097985611e7c565b61098286611f66565b61049587612047565b949350505050565b605354606854600160c81b900463ffffffff16101561066457610664612114565b60405180611ba00160405280611b668152602001613d80611b66913981565b5f83815b6020811015610a9f57600163ffffffff8516821c81169003610a4257848160208110610a0557610a05613706565b602002013582604051602001610a25929190918252602082015260400190565b604051602081830303815290604052805190602001209150610a8d565b81858260208110610a5557610a55613706565b6020020135604051602001610a74929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610a978161372e565b9150506109d7565b50949350505050565b6040516001600160e01b031960e087901b1660208201526bffffffffffffffffffffffff19606086901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180611ba00160405280611b668152602001613d80611b669139898989604051602001610b3093929190613746565b60408051601f1981840301815290829052610b4e929160200161377e565b60405160208183030381529060405280519060200120604051602001610bc394939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff1615610c0b57604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b0316610c4d576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f54604051632770a7eb60e21b8152336004820152602481018690526001600160a01b0390911690639dc29fac906044015f604051808303815f87803b158015610c96575f80fd5b505af1158015610ca8573d5f803e3d5ffd5b50505050610cba868686868686611db2565b505050505050565b6060610ccd82611e7c565b610cd683611f66565b610cdf84612047565b604051602001610cf193929190613746565b6040516020818303038152906040529050919050565b6068545f908190610100900463ffffffff16158015610d2c575063ffffffff83166001145b15610d3e575063ffffffff8316610d66565b610d5364010000000063ffffffff85166137ac565b610d639063ffffffff86166137c3565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff1615610db357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614610de3576040516302caf51760e11b815260040160405180910390fd5b610e168c8c8c8c8c610e115f8e8e8e8e8e8e8e604051610e049291906137d6565b60405180910390206107e5565b6121c2565b6001600160a01b038616610f6057606f546001600160a01b0316610efa575f6001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015610e6c576020820181803683370190505b50604051610e7a91906137e5565b5f6040518083038185875af1925050503d805f8114610eb4576040519150601f19603f3d011682016040523d82523d5f602084013e610eb9565b606091505b5050905080610ef4576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611256565b606f546040516340c10f1960e01b81526001600160a01b03868116600483015260248201869052909116906340c10f19906044015f604051808303815f87803b158015610f45575f80fd5b505af1158015610f57573d5f803e3d5ffd5b50505050611256565b606d546001600160a01b038781169116148015610f8e5750606d5463ffffffff888116600160a01b90920416145b15610fa5575f6001600160a01b0385168482610e42565b60685463ffffffff610100909104811690881603610fd657610fd16001600160a01b0387168585612354565b611256565b6040516001600160e01b031960e089901b1660208201526bffffffffffffffffffffffff19606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b0316806111f5575f6110808386868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506123d592505050565b6040516340c10f1960e01b81526001600160a01b03898116600483015260248201899052919250908216906340c10f19906044015f604051808303815f87803b1580156110cb575f80fd5b505af11580156110dd573d5f803e3d5ffd5b5050505080606a5f8581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a8388886040516111e7959493929190613828565b60405180910390a150611253565b6040516340c10f1960e01b81526001600160a01b038781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801561123c575f80fd5b505af115801561124e573d5f803e3d5ffd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156112e457604051630bc011ff60e21b815260040160405180910390fd5b6112ec612468565b60685463ffffffff61010090910481169088160361131d576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b03881661141957883414611369576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff16945090611396906136ce565b80601f01602080910402602001604051908101604052809291908181526020018280546113c2906136ce565b801561140d5780601f106113e45761010080835404028352916020019161140d565b820191905f5260205f20905b8154815290600101906020018083116113f057829003601f168201915b505050505091506116a3565b3415611451576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546001600160a01b03908116908916036114c757604051632770a7eb60e21b8152336004820152602481018a90526001600160a01b03891690639dc29fac906044015f604051808303815f87803b1580156114ac575f80fd5b505af11580156114be573d5f803e3d5ffd5b505050506116a3565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901561157957604051632770a7eb60e21b8152336004820152602481018b90526001600160a01b038a1690639dc29fac906044015f604051808303815f87803b158015611551575f80fd5b505af1158015611563573d5f803e3d5ffd5b5050505080602001519450805f01519350611696565b851561158b5761158b898b89896124c1565b6040516370a0823160e01b81523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa1580156115cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f39190613860565b905061160a6001600160a01b038b1633308e612860565b6040516370a0823160e01b81523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa15801561164e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116729190613860565b905061167e8282613877565b6068548c9850610100900463ffffffff169650935050505b61169f89610cc2565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e86886053546040516116e298979695949392919061388a565b60405180910390a16117086117035f85878f8f8789805190602001206107e5565b6128b1565b861561171657611716612114565b5050505061172360018055565b50505050505050565b606c546001600160a01b0316331461175757604051631736745960e31b815260040160405180910390fd5b6106646129b2565b60685460ff161561178357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146117b3576040516302caf51760e11b815260040160405180910390fd5b6117d58c8c8c8c8c610e1160018e8e8e8e8e8e8e604051610e049291906137d6565b606f545f906001600160a01b031661188857846001600160a01b031684888a868660405160240161180994939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161183e91906137e5565b5f6040518083038185875af1925050503d805f8114611878576040519150601f19603f3d011682016040523d82523d5f602084013e61187d565b606091505b505080915050611983565b606f546040516340c10f1960e01b81526001600160a01b03878116600483015260248201879052909116906340c10f19906044015f604051808303815f87803b1580156118d3575f80fd5b505af11580156118e5573d5f803e3d5ffd5b50505050846001600160a01b03168789858560405160240161190a94939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161193f91906137e5565b5f604051808303815f865af19150503d805f8114611978576040519150601f19603f3d011682016040523d82523d5f602084013e61197d565b606091505b50909150505b806119ba576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f54610100900460ff1615808015611a4357505f54600160ff909116105b80611a5c5750303b158015611a5c57505f5460ff166001145b611ad35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805460ff191660011790558015611af4575f805461ff0019166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8a16027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038781169190910291909117909155606c805473ffffffffffffffffffffffffffffffffffffffff19168583161790558616611bcf5763ffffffff851615611bca576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ceb565b606d805463ffffffff8716600160a01b027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b03891617179055606e611c1e8382613970565b50611cbd5f801b6012604051602001611ca991906060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff91909116604082015260e00190565b6040516020818303038152906040526123d5565b606f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790555b611cf3612a22565b8015611723575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b5f81611d4d8686866109d3565b1495945050505050565b60685460ff1615611d7b57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff610100909104811690871603611de3576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051611e3799989796959493929190613a2c565b60405180910390a1611e6e6117036001606860019054906101000a900463ffffffff16338a8a8a8989604051610e049291906137d6565b8215610cba57610cba612114565b60408051600481526024810182526020810180516001600160e01b03167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611edb91906137e5565b5f60405180830381855afa9150503d805f8114611f13576040519150601f19603f3d011682016040523d82523d5f602084013e611f18565b606091505b509150915081611f5d576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525061098b565b61098b81612a94565b60408051600481526024810182526020810180516001600160e01b03167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611fc591906137e5565b5f60405180830381855afa9150503d805f8114611ffd576040519150601f19603f3d011682016040523d82523d5f602084013e612002565b606091505b509150915081611f5d576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525061098b565b60408051600481526024810182526020810180516001600160e01b03167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b038616916120a591906137e5565b5f60405180830381855afa9150503d805f81146120dd576040519150601f19603f3d011682016040523d82523d5f602084013e6120e2565b606091505b50915091508180156120f5575080516020145b61210057601261098b565b8080602001905181019061098b9190613a97565b6053546068805463ffffffff909216600160c81b027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d61217561088e565b6040518263ffffffff1660e01b815260040161219391815260200190565b5f604051808303815f87803b1580156121aa575f80fd5b505af11580156121bc573d5f803e3d5ffd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af1158015612253573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122779190613860565b9050805f036122b1576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80680100000000000000008716156122f5578691506122d3848a8489611d40565b6122f0576040516338105f3b60e21b815260040160405180910390fd5b61233f565b602087901c612305816001613ab2565b9150879250612320612318868c866109d3565b8a8389611d40565b61233d576040516338105f3b60e21b815260040160405180910390fd5b505b6123498282612c64565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526123d09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612d24565b505050565b5f8060405180611ba00160405280611b668152602001613d80611b6691398360405160200161240592919061377e565b6040516020818303038152906040529050838151602083015ff591506001600160a01b038216612461576040517fbefb092000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5092915050565b6002600154036124ba5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611aca565b6002600155565b5f6124cf6004828486613acf565b6124d891613af6565b90507f2afa5331000000000000000000000000000000000000000000000000000000006001600160e01b03198216016126b2575f80808080808061251f896004818d613acf565b81019061252c9190613b26565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161461256c5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03861630146125955760405163750643af60e01b815260040160405180910390fd5b8a85146125ce576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b03167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169161266591906137e5565b5f604051808303815f865af19150503d805f811461269e576040519150601f19603f3d011682016040523d82523d5f602084013e6126a3565b606091505b50505050505050505050610752565b6001600160e01b031981166323f2ebc360e21b146126fc576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806127118a6004818e613acf565b81019061271e9190613b75565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146127605760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146127895760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169161281091906137e5565b5f604051808303815f865af19150503d805f8114612849576040519150601f19603f3d011682016040523d82523d5f602084013e61284e565b606091505b50505050505050505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526121bc9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612399565b8060016128c060206002613cd3565b6128ca9190613877565b60535410612904576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f81546129139061372e565b918290555090505f5b60208110156129a3578082901c60011660010361294f57826033826020811061294757612947613706565b015550505050565b6033816020811061296257612962613706565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061299b9061372e565b91505061291c565b506123d0613cde565b60018055565b60685460ff166129ee576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f54610100900460ff16612a8c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b610664612e08565b60606040825110612ab357818060200190518101906106ca9190613cf2565b8151602003612c26575f5b602081108015612b055750828181518110612adb57612adb613706565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15612b1c5780612b148161372e565b915050612abe565b805f03612b5e57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115612b7857612b78613268565b6040519080825280601f01601f191660200182016040528015612ba2576020820181803683370190505b5090505f5b82811015612c1e57848181518110612bc157612bc1613706565b602001015160f81c60f81b828281518110612bde57612bde613706565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080612c168161372e565b915050612ba7565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b6068545f90610100900463ffffffff16158015612c87575063ffffffff82166001145b15612c99575063ffffffff8216612cc1565b612cae64010000000063ffffffff84166137ac565b612cbe9063ffffffff85166137c3565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003611723576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612d78826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e729092919063ffffffff16565b8051909150156123d05780806020019051810190612d969190613d64565b6123d05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611aca565b5f54610100900460ff166129ac5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b606061098b84845f85855f80866001600160a01b03168587604051612e9791906137e5565b5f6040518083038185875af1925050503d805f8114612ed1576040519150601f19603f3d011682016040523d82523d5f602084013e612ed6565b606091505b5091509150612ee787838387612ef2565b979650505050505050565b60608315612f605782515f03612f59576001600160a01b0385163b612f595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611aca565b508161098b565b61098b8383815115612f755781518083602001fd5b8060405162461bcd60e51b8152600401611aca9190613102565b803563ffffffff81168114612c5f575f80fd5b6001600160a01b0381168114612fb6575f80fd5b50565b5f8060408385031215612fca575f80fd5b612fd383612f8f565b91506020830135612fe381612fa2565b809150509250929050565b8015158114612fb6575f80fd5b5f8083601f84011261300b575f80fd5b50813567ffffffffffffffff811115613022575f80fd5b602083019150836020828501011115613039575f80fd5b9250929050565b5f805f805f60808688031215613054575f80fd5b61305d86612f8f565b9450602086013561306d81612fa2565b9350604086013561307d81612fee565b9250606086013567ffffffffffffffff811115613098575f80fd5b6130a488828901612ffb565b969995985093965092949392505050565b5f5b838110156130cf5781810151838201526020016130b7565b50505f910152565b5f81518084526130ee8160208601602086016130b5565b601f01601f19169290920160200192915050565b602081525f61311460208301846130d7565b9392505050565b5f6020828403121561312b575f80fd5b813561311481612fa2565b60ff81168114612fb6575f80fd5b5f805f805f805f60e0888a03121561315a575f80fd5b873561316581613136565b965061317360208901612f8f565b9550604088013561318381612fa2565b945061319160608901612f8f565b935060808801356131a181612fa2565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156131d0575f80fd5b6131d984612f8f565b925060208401356131e981612fa2565b915060408401356131f981612fa2565b809150509250925092565b5f60208284031215613214575f80fd5b5035919050565b8061040081018310156106ca575f80fd5b5f805f610440848603121561323f575f80fd5b83359250613250856020860161321b565b915061325f6104208501612f8f565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156132a5576132a5613268565b604052919050565b5f67ffffffffffffffff8211156132c6576132c6613268565b50601f01601f191660200190565b5f6132e66132e1846132ad565b61327c565b90508281528383830111156132f9575f80fd5b828260208301375f602084830101529392505050565b5f82601f83011261331e575f80fd5b613114838335602085016132d4565b5f805f805f60a08688031215613341575f80fd5b61334a86612f8f565b9450602086013561335a81612fa2565b9350604086013567ffffffffffffffff80821115613376575f80fd5b61338289838a0161330f565b94506060880135915080821115613397575f80fd5b506133a48882890161330f565b92505060808601356133b581613136565b809150509295509295909350565b5f805f805f8060a087890312156133d8575f80fd5b6133e187612f8f565b955060208701356133f181612fa2565b945060408701359350606087013561340881612fee565b9250608087013567ffffffffffffffff811115613423575f80fd5b61342f89828a01612ffb565b979a9699509497509295939492505050565b5f8060408385031215613452575f80fd5b61345b83612f8f565b915061346960208401612f8f565b90509250929050565b5f805f805f805f805f805f806109208d8f03121561348e575f80fd5b6134988e8e61321b565b9b506134a88e6104008f0161321b565b9a506108008d013599506108208d013598506108408d013597506134cf6108608e01612f8f565b96506134df6108808e0135612fa2565b6108808d013595506134f46108a08e01612f8f565b94506135046108c08e0135612fa2565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111561352d575f80fd5b61353e8e6109008f01358f01612ffb565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121561356c575f80fd5b61357588612f8f565b9650602088013561358581612fa2565b955060408801359450606088013561359c81612fa2565b935060808801356135ac81612fee565b925060a088013567ffffffffffffffff8111156135c7575f80fd5b6135d38a828b01612ffb565b989b979a50959850939692959293505050565b5f805f805f8060c087890312156135fb575f80fd5b61360487612f8f565b9550602087013561361481612fa2565b945061362260408801612f8f565b9350606087013561363281612fa2565b9250608087013561364281612fa2565b915060a087013567ffffffffffffffff81111561365d575f80fd5b8701601f8101891361366d575f80fd5b61367c898235602084016132d4565b9150509295509295509295565b5f805f80610460858703121561369d575f80fd5b843593506136ae866020870161321b565b92506136bd6104208601612f8f565b939692955092936104400135925050565b600181811c908216806136e257607f821691505b60208210810361370057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f6001820161373f5761373f61371a565b5060010190565b606081525f61375860608301866130d7565b828103602084015261376a81866130d7565b91505060ff83166040830152949350505050565b5f835161378f8184602088016130b5565b8351908301906137a38183602088016130b5565b01949350505050565b80820281158282048414176106ca576106ca61371a565b808201808211156106ca576106ca61371a565b818382375f9101908152919050565b5f82516137f68184602087016130b5565b9190910192915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b63ffffffff861681525f6001600160a01b03808716602084015280861660408401525060806060830152612ee7608083018486613800565b5f60208284031215613870575f80fd5b5051919050565b818103818111156106ca576106ca61371a565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c08501526138da828501876130d7565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f613921606083018486613800565b9695505050505050565b601f8211156123d0575f81815260208120601f850160051c810160208610156139515750805b601f850160051c820191505b81811015610cba5782815560010161395d565b815167ffffffffffffffff81111561398a5761398a613268565b61399e8161399884546136ce565b8461392b565b602080601f8311600181146139d1575f84156139ba5750858301515b5f19600386901b1c1916600185901b178555610cba565b5f85815260208120601f198616915b828110156139ff578886015182559484019460019091019084016139e0565b5085821015613a1c57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c0850152613a7d8285018789613800565b925080851660e085015250509a9950505050505050505050565b5f60208284031215613aa7575f80fd5b815161311481613136565b63ffffffff8181168382160190808211156124615761246161371a565b5f8085851115613add575f80fd5b83861115613ae9575f80fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015613b1e5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215613b3c575f80fd5b8735613b4781612fa2565b96506020880135613b5781612fa2565b9550604088013594506060880135935060808801356131a181613136565b5f805f805f805f80610100898b031215613b8d575f80fd5b8835613b9881612fa2565b97506020890135613ba881612fa2565b965060408901359550606089013594506080890135613bc681612fee565b935060a0890135613bd681613136565b979a969950949793969295929450505060c08201359160e0013590565b600181815b80851115613c2d57815f1904821115613c1357613c1361371a565b80851615613c2057918102915b93841c9390800290613bf8565b509250929050565b5f82613c43575060016106ca565b81613c4f57505f6106ca565b8160018114613c655760028114613c6f57613c8b565b60019150506106ca565b60ff841115613c8057613c8061371a565b50506001821b6106ca565b5060208310610133831016604e8410600b8410161715613cae575081810a6106ca565b613cb88383613bf3565b805f1904821115613ccb57613ccb61371a565b029392505050565b5f6131148383613c35565b634e487b7160e01b5f52600160045260245ffd5b5f60208284031215613d02575f80fd5b815167ffffffffffffffff811115613d18575f80fd5b8201601f81018413613d28575f80fd5b8051613d366132e1826132ad565b818152856020838501011115613d4a575f80fd5b613d5b8260208301602086016130b5565b95945050505050565b5f60208284031215613d74575f80fd5b815161311481612fee56fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a26469706673582212209a1c026626524dd4419b6795fd817a860c25d29783cf84f8f0a4125cc4f9be6e64736f6c63430008140033", + "deployedBytecode": "0x6080604052600436106101db575f3560e01c806383f24403116100fd578063ccaa2d1111610092578063ee25560b11610062578063ee25560b146105a9578063f5efcd79146105d4578063f811bff7146105f3578063fb57083414610612575f80fd5b8063ccaa2d111461053b578063cd5865791461055a578063d02103ca1461056d578063dbc1697614610595575f80fd5b8063bab161bf116100cd578063bab161bf146104b9578063be5831c7146104da578063c00f14ab146104fd578063cc4616321461051c575f80fd5b806383f244031461043d5780638ed7e3f21461045c578063aaa13cc21461047b578063b8b284d01461049a575f80fd5b80633cbc795b116101735780637843298b116101435780637843298b146103c257806379e2cf97146103e157806381b1c174146103f557806383c43a5514610429575f80fd5b80633cbc795b146103385780633e197043146103705780634b2f336d1461038f5780635ca1e165146103ae575f80fd5b806327aef4e8116101ae57806327aef4e81461026d5780632dfdf0b51461028e578063318aee3d146102b15780633c351e1014610319575f80fd5b806315064c96146101df5780632072f6c51461020d57806322e95f2c14610223578063240ff3781461025a575b5f80fd5b3480156101ea575f80fd5b506068546101f89060ff1681565b60405190151581526020015b60405180910390f35b348015610218575f80fd5b50610221610631565b005b34801561022e575f80fd5b5061024261023d366004612fb9565b610666565b6040516001600160a01b039091168152602001610204565b610221610268366004613040565b6106d0565b348015610278575f80fd5b50610281610759565b6040516102049190613102565b348015610299575f80fd5b506102a360535481565b604051908152602001610204565b3480156102bc575f80fd5b506102f56102cb36600461311b565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201610204565b348015610324575f80fd5b50606d54610242906001600160a01b031681565b348015610343575f80fd5b50606d5461035b90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610204565b34801561037b575f80fd5b506102a361038a366004613144565b6107e5565b34801561039a575f80fd5b50606f54610242906001600160a01b031681565b3480156103b9575f80fd5b506102a361088e565b3480156103cd575f80fd5b506102426103dc3660046131be565b61096a565b3480156103ec575f80fd5b50610221610993565b348015610400575f80fd5b5061024261040f366004613204565b606a6020525f90815260409020546001600160a01b031681565b348015610434575f80fd5b506102816109b4565b348015610448575f80fd5b506102a361045736600461322c565b6109d3565b348015610467575f80fd5b50606c54610242906001600160a01b031681565b348015610486575f80fd5b5061024261049536600461332d565b610aa8565b3480156104a5575f80fd5b506102216104b43660046133c3565b610be7565b3480156104c4575f80fd5b5060685461035b90610100900463ffffffff1681565b3480156104e5575f80fd5b5060685461035b90600160c81b900463ffffffff1681565b348015610508575f80fd5b5061028161051736600461311b565b610cc2565b348015610527575f80fd5b506101f8610536366004613441565b610d07565b348015610546575f80fd5b50610221610555366004613472565b610d8f565b610221610568366004613556565b6112c0565b348015610578575f80fd5b50606854610242906501000000000090046001600160a01b031681565b3480156105a0575f80fd5b5061022161172c565b3480156105b4575f80fd5b506102a36105c3366004613204565b60696020525f908152604090205481565b3480156105df575f80fd5b506102216105ee366004613472565b61175f565b3480156105fe575f80fd5b5061022161060d3660046135e6565b611a25565b34801561061d575f80fd5b506101f861062c366004613689565b611d40565b606c546001600160a01b0316331461065c57604051631736745960e31b815260040160405180910390fd5b610664611d57565b565b6040805160e084901b6001600160e01b031916602080830191909152606084901b6bffffffffffffffffffffffff1916602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b60685460ff16156106f457604051630bc011ff60e21b815260040160405180910390fd5b341580159061070d5750606f546001600160a01b031615155b15610744576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610752858534868686611db2565b5050505050565b606e8054610766906136ce565b80601f0160208091040260200160405190810160405280929190818152602001828054610792906136ce565b80156107dd5780601f106107b4576101008083540402835291602001916107dd565b820191905f5260205f20905b8154815290600101906020018083116107c057829003601f168201915b505050505081565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201526001600160e01b031960e088811b821660218401526bffffffffffffffffffffffff19606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b6053545f90819081805b6020811015610961578083901c6001166001036108f557603381602081106108c2576108c2613706565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610922565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806109599061372e565b915050610898565b50919392505050565b5f61098b848461097985611e7c565b61098286611f66565b61049587612047565b949350505050565b605354606854600160c81b900463ffffffff16101561066457610664612114565b60405180611ba00160405280611b668152602001613d80611b66913981565b5f83815b6020811015610a9f57600163ffffffff8516821c81169003610a4257848160208110610a0557610a05613706565b602002013582604051602001610a25929190918252602082015260400190565b604051602081830303815290604052805190602001209150610a8d565b81858260208110610a5557610a55613706565b6020020135604051602001610a74929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610a978161372e565b9150506109d7565b50949350505050565b6040516001600160e01b031960e087901b1660208201526bffffffffffffffffffffffff19606086901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180611ba00160405280611b668152602001613d80611b669139898989604051602001610b3093929190613746565b60408051601f1981840301815290829052610b4e929160200161377e565b60405160208183030381529060405280519060200120604051602001610bc394939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff1615610c0b57604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b0316610c4d576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f54604051632770a7eb60e21b8152336004820152602481018690526001600160a01b0390911690639dc29fac906044015f604051808303815f87803b158015610c96575f80fd5b505af1158015610ca8573d5f803e3d5ffd5b50505050610cba868686868686611db2565b505050505050565b6060610ccd82611e7c565b610cd683611f66565b610cdf84612047565b604051602001610cf193929190613746565b6040516020818303038152906040529050919050565b6068545f908190610100900463ffffffff16158015610d2c575063ffffffff83166001145b15610d3e575063ffffffff8316610d66565b610d5364010000000063ffffffff85166137ac565b610d639063ffffffff86166137c3565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff1615610db357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614610de3576040516302caf51760e11b815260040160405180910390fd5b610e168c8c8c8c8c610e115f8e8e8e8e8e8e8e604051610e049291906137d6565b60405180910390206107e5565b6121c2565b6001600160a01b038616610f6057606f546001600160a01b0316610efa575f6001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015610e6c576020820181803683370190505b50604051610e7a91906137e5565b5f6040518083038185875af1925050503d805f8114610eb4576040519150601f19603f3d011682016040523d82523d5f602084013e610eb9565b606091505b5050905080610ef4576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611256565b606f546040516340c10f1960e01b81526001600160a01b03868116600483015260248201869052909116906340c10f19906044015f604051808303815f87803b158015610f45575f80fd5b505af1158015610f57573d5f803e3d5ffd5b50505050611256565b606d546001600160a01b038781169116148015610f8e5750606d5463ffffffff888116600160a01b90920416145b15610fa5575f6001600160a01b0385168482610e42565b60685463ffffffff610100909104811690881603610fd657610fd16001600160a01b0387168585612354565b611256565b6040516001600160e01b031960e089901b1660208201526bffffffffffffffffffffffff19606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b0316806111f5575f6110808386868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506123d592505050565b6040516340c10f1960e01b81526001600160a01b03898116600483015260248201899052919250908216906340c10f19906044015f604051808303815f87803b1580156110cb575f80fd5b505af11580156110dd573d5f803e3d5ffd5b5050505080606a5f8581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a8388886040516111e7959493929190613828565b60405180910390a150611253565b6040516340c10f1960e01b81526001600160a01b038781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801561123c575f80fd5b505af115801561124e573d5f803e3d5ffd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156112e457604051630bc011ff60e21b815260040160405180910390fd5b6112ec612468565b60685463ffffffff61010090910481169088160361131d576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b03881661141957883414611369576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff16945090611396906136ce565b80601f01602080910402602001604051908101604052809291908181526020018280546113c2906136ce565b801561140d5780601f106113e45761010080835404028352916020019161140d565b820191905f5260205f20905b8154815290600101906020018083116113f057829003601f168201915b505050505091506116a3565b3415611451576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546001600160a01b03908116908916036114c757604051632770a7eb60e21b8152336004820152602481018a90526001600160a01b03891690639dc29fac906044015f604051808303815f87803b1580156114ac575f80fd5b505af11580156114be573d5f803e3d5ffd5b505050506116a3565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901561157957604051632770a7eb60e21b8152336004820152602481018b90526001600160a01b038a1690639dc29fac906044015f604051808303815f87803b158015611551575f80fd5b505af1158015611563573d5f803e3d5ffd5b5050505080602001519450805f01519350611696565b851561158b5761158b898b89896124c1565b6040516370a0823160e01b81523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa1580156115cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f39190613860565b905061160a6001600160a01b038b1633308e612860565b6040516370a0823160e01b81523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa15801561164e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116729190613860565b905061167e8282613877565b6068548c9850610100900463ffffffff169650935050505b61169f89610cc2565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e86886053546040516116e298979695949392919061388a565b60405180910390a16117086117035f85878f8f8789805190602001206107e5565b6128b1565b861561171657611716612114565b5050505061172360018055565b50505050505050565b606c546001600160a01b0316331461175757604051631736745960e31b815260040160405180910390fd5b6106646129b2565b60685460ff161561178357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146117b3576040516302caf51760e11b815260040160405180910390fd5b6117d58c8c8c8c8c610e1160018e8e8e8e8e8e8e604051610e049291906137d6565b606f545f906001600160a01b031661188857846001600160a01b031684888a868660405160240161180994939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161183e91906137e5565b5f6040518083038185875af1925050503d805f8114611878576040519150601f19603f3d011682016040523d82523d5f602084013e61187d565b606091505b505080915050611983565b606f546040516340c10f1960e01b81526001600160a01b03878116600483015260248201879052909116906340c10f19906044015f604051808303815f87803b1580156118d3575f80fd5b505af11580156118e5573d5f803e3d5ffd5b50505050846001600160a01b03168789858560405160240161190a94939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161193f91906137e5565b5f604051808303815f865af19150503d805f8114611978576040519150601f19603f3d011682016040523d82523d5f602084013e61197d565b606091505b50909150505b806119ba576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f54610100900460ff1615808015611a4357505f54600160ff909116105b80611a5c5750303b158015611a5c57505f5460ff166001145b611ad35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805460ff191660011790558015611af4575f805461ff0019166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8a16027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038781169190910291909117909155606c805473ffffffffffffffffffffffffffffffffffffffff19168583161790558616611bcf5763ffffffff851615611bca576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ceb565b606d805463ffffffff8716600160a01b027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b03891617179055606e611c1e8382613970565b50611cbd5f801b6012604051602001611ca991906060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff91909116604082015260e00190565b6040516020818303038152906040526123d5565b606f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790555b611cf3612a22565b8015611723575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b5f81611d4d8686866109d3565b1495945050505050565b60685460ff1615611d7b57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff610100909104811690871603611de3576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051611e3799989796959493929190613a2c565b60405180910390a1611e6e6117036001606860019054906101000a900463ffffffff16338a8a8a8989604051610e049291906137d6565b8215610cba57610cba612114565b60408051600481526024810182526020810180516001600160e01b03167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611edb91906137e5565b5f60405180830381855afa9150503d805f8114611f13576040519150601f19603f3d011682016040523d82523d5f602084013e611f18565b606091505b509150915081611f5d576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525061098b565b61098b81612a94565b60408051600481526024810182526020810180516001600160e01b03167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611fc591906137e5565b5f60405180830381855afa9150503d805f8114611ffd576040519150601f19603f3d011682016040523d82523d5f602084013e612002565b606091505b509150915081611f5d576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525061098b565b60408051600481526024810182526020810180516001600160e01b03167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b038616916120a591906137e5565b5f60405180830381855afa9150503d805f81146120dd576040519150601f19603f3d011682016040523d82523d5f602084013e6120e2565b606091505b50915091508180156120f5575080516020145b61210057601261098b565b8080602001905181019061098b9190613a97565b6053546068805463ffffffff909216600160c81b027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d61217561088e565b6040518263ffffffff1660e01b815260040161219391815260200190565b5f604051808303815f87803b1580156121aa575f80fd5b505af11580156121bc573d5f803e3d5ffd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af1158015612253573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122779190613860565b9050805f036122b1576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80680100000000000000008716156122f5578691506122d3848a8489611d40565b6122f0576040516338105f3b60e21b815260040160405180910390fd5b61233f565b602087901c612305816001613ab2565b9150879250612320612318868c866109d3565b8a8389611d40565b61233d576040516338105f3b60e21b815260040160405180910390fd5b505b6123498282612c64565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526123d09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612d24565b505050565b5f8060405180611ba00160405280611b668152602001613d80611b6691398360405160200161240592919061377e565b6040516020818303038152906040529050838151602083015ff591506001600160a01b038216612461576040517fbefb092000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5092915050565b6002600154036124ba5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611aca565b6002600155565b5f6124cf6004828486613acf565b6124d891613af6565b90507f2afa5331000000000000000000000000000000000000000000000000000000006001600160e01b03198216016126b2575f80808080808061251f896004818d613acf565b81019061252c9190613b26565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161461256c5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03861630146125955760405163750643af60e01b815260040160405180910390fd5b8a85146125ce576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b03167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169161266591906137e5565b5f604051808303815f865af19150503d805f811461269e576040519150601f19603f3d011682016040523d82523d5f602084013e6126a3565b606091505b50505050505050505050610752565b6001600160e01b031981166323f2ebc360e21b146126fc576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806127118a6004818e613acf565b81019061271e9190613b75565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146127605760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146127895760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169161281091906137e5565b5f604051808303815f865af19150503d805f8114612849576040519150601f19603f3d011682016040523d82523d5f602084013e61284e565b606091505b50505050505050505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526121bc9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612399565b8060016128c060206002613cd3565b6128ca9190613877565b60535410612904576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f81546129139061372e565b918290555090505f5b60208110156129a3578082901c60011660010361294f57826033826020811061294757612947613706565b015550505050565b6033816020811061296257612962613706565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061299b9061372e565b91505061291c565b506123d0613cde565b60018055565b60685460ff166129ee576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f54610100900460ff16612a8c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b610664612e08565b60606040825110612ab357818060200190518101906106ca9190613cf2565b8151602003612c26575f5b602081108015612b055750828181518110612adb57612adb613706565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15612b1c5780612b148161372e565b915050612abe565b805f03612b5e57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115612b7857612b78613268565b6040519080825280601f01601f191660200182016040528015612ba2576020820181803683370190505b5090505f5b82811015612c1e57848181518110612bc157612bc1613706565b602001015160f81c60f81b828281518110612bde57612bde613706565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080612c168161372e565b915050612ba7565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b6068545f90610100900463ffffffff16158015612c87575063ffffffff82166001145b15612c99575063ffffffff8216612cc1565b612cae64010000000063ffffffff84166137ac565b612cbe9063ffffffff85166137c3565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003611723576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612d78826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e729092919063ffffffff16565b8051909150156123d05780806020019051810190612d969190613d64565b6123d05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611aca565b5f54610100900460ff166129ac5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b606061098b84845f85855f80866001600160a01b03168587604051612e9791906137e5565b5f6040518083038185875af1925050503d805f8114612ed1576040519150601f19603f3d011682016040523d82523d5f602084013e612ed6565b606091505b5091509150612ee787838387612ef2565b979650505050505050565b60608315612f605782515f03612f59576001600160a01b0385163b612f595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611aca565b508161098b565b61098b8383815115612f755781518083602001fd5b8060405162461bcd60e51b8152600401611aca9190613102565b803563ffffffff81168114612c5f575f80fd5b6001600160a01b0381168114612fb6575f80fd5b50565b5f8060408385031215612fca575f80fd5b612fd383612f8f565b91506020830135612fe381612fa2565b809150509250929050565b8015158114612fb6575f80fd5b5f8083601f84011261300b575f80fd5b50813567ffffffffffffffff811115613022575f80fd5b602083019150836020828501011115613039575f80fd5b9250929050565b5f805f805f60808688031215613054575f80fd5b61305d86612f8f565b9450602086013561306d81612fa2565b9350604086013561307d81612fee565b9250606086013567ffffffffffffffff811115613098575f80fd5b6130a488828901612ffb565b969995985093965092949392505050565b5f5b838110156130cf5781810151838201526020016130b7565b50505f910152565b5f81518084526130ee8160208601602086016130b5565b601f01601f19169290920160200192915050565b602081525f61311460208301846130d7565b9392505050565b5f6020828403121561312b575f80fd5b813561311481612fa2565b60ff81168114612fb6575f80fd5b5f805f805f805f60e0888a03121561315a575f80fd5b873561316581613136565b965061317360208901612f8f565b9550604088013561318381612fa2565b945061319160608901612f8f565b935060808801356131a181612fa2565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156131d0575f80fd5b6131d984612f8f565b925060208401356131e981612fa2565b915060408401356131f981612fa2565b809150509250925092565b5f60208284031215613214575f80fd5b5035919050565b8061040081018310156106ca575f80fd5b5f805f610440848603121561323f575f80fd5b83359250613250856020860161321b565b915061325f6104208501612f8f565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156132a5576132a5613268565b604052919050565b5f67ffffffffffffffff8211156132c6576132c6613268565b50601f01601f191660200190565b5f6132e66132e1846132ad565b61327c565b90508281528383830111156132f9575f80fd5b828260208301375f602084830101529392505050565b5f82601f83011261331e575f80fd5b613114838335602085016132d4565b5f805f805f60a08688031215613341575f80fd5b61334a86612f8f565b9450602086013561335a81612fa2565b9350604086013567ffffffffffffffff80821115613376575f80fd5b61338289838a0161330f565b94506060880135915080821115613397575f80fd5b506133a48882890161330f565b92505060808601356133b581613136565b809150509295509295909350565b5f805f805f8060a087890312156133d8575f80fd5b6133e187612f8f565b955060208701356133f181612fa2565b945060408701359350606087013561340881612fee565b9250608087013567ffffffffffffffff811115613423575f80fd5b61342f89828a01612ffb565b979a9699509497509295939492505050565b5f8060408385031215613452575f80fd5b61345b83612f8f565b915061346960208401612f8f565b90509250929050565b5f805f805f805f805f805f806109208d8f03121561348e575f80fd5b6134988e8e61321b565b9b506134a88e6104008f0161321b565b9a506108008d013599506108208d013598506108408d013597506134cf6108608e01612f8f565b96506134df6108808e0135612fa2565b6108808d013595506134f46108a08e01612f8f565b94506135046108c08e0135612fa2565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111561352d575f80fd5b61353e8e6109008f01358f01612ffb565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121561356c575f80fd5b61357588612f8f565b9650602088013561358581612fa2565b955060408801359450606088013561359c81612fa2565b935060808801356135ac81612fee565b925060a088013567ffffffffffffffff8111156135c7575f80fd5b6135d38a828b01612ffb565b989b979a50959850939692959293505050565b5f805f805f8060c087890312156135fb575f80fd5b61360487612f8f565b9550602087013561361481612fa2565b945061362260408801612f8f565b9350606087013561363281612fa2565b9250608087013561364281612fa2565b915060a087013567ffffffffffffffff81111561365d575f80fd5b8701601f8101891361366d575f80fd5b61367c898235602084016132d4565b9150509295509295509295565b5f805f80610460858703121561369d575f80fd5b843593506136ae866020870161321b565b92506136bd6104208601612f8f565b939692955092936104400135925050565b600181811c908216806136e257607f821691505b60208210810361370057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f6001820161373f5761373f61371a565b5060010190565b606081525f61375860608301866130d7565b828103602084015261376a81866130d7565b91505060ff83166040830152949350505050565b5f835161378f8184602088016130b5565b8351908301906137a38183602088016130b5565b01949350505050565b80820281158282048414176106ca576106ca61371a565b808201808211156106ca576106ca61371a565b818382375f9101908152919050565b5f82516137f68184602087016130b5565b9190910192915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b63ffffffff861681525f6001600160a01b03808716602084015280861660408401525060806060830152612ee7608083018486613800565b5f60208284031215613870575f80fd5b5051919050565b818103818111156106ca576106ca61371a565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c08501526138da828501876130d7565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f613921606083018486613800565b9695505050505050565b601f8211156123d0575f81815260208120601f850160051c810160208610156139515750805b601f850160051c820191505b81811015610cba5782815560010161395d565b815167ffffffffffffffff81111561398a5761398a613268565b61399e8161399884546136ce565b8461392b565b602080601f8311600181146139d1575f84156139ba5750858301515b5f19600386901b1c1916600185901b178555610cba565b5f85815260208120601f198616915b828110156139ff578886015182559484019460019091019084016139e0565b5085821015613a1c57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c0850152613a7d8285018789613800565b925080851660e085015250509a9950505050505050505050565b5f60208284031215613aa7575f80fd5b815161311481613136565b63ffffffff8181168382160190808211156124615761246161371a565b5f8085851115613add575f80fd5b83861115613ae9575f80fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015613b1e5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215613b3c575f80fd5b8735613b4781612fa2565b96506020880135613b5781612fa2565b9550604088013594506060880135935060808801356131a181613136565b5f805f805f805f80610100898b031215613b8d575f80fd5b8835613b9881612fa2565b97506020890135613ba881612fa2565b965060408901359550606089013594506080890135613bc681612fee565b935060a0890135613bd681613136565b979a969950949793969295929450505060c08201359160e0013590565b600181815b80851115613c2d57815f1904821115613c1357613c1361371a565b80851615613c2057918102915b93841c9390800290613bf8565b509250929050565b5f82613c43575060016106ca565b81613c4f57505f6106ca565b8160018114613c655760028114613c6f57613c8b565b60019150506106ca565b60ff841115613c8057613c8061371a565b50506001821b6106ca565b5060208310610133831016604e8410600b8410161715613cae575081810a6106ca565b613cb88383613bf3565b805f1904821115613ccb57613ccb61371a565b029392505050565b5f6131148383613c35565b634e487b7160e01b5f52600160045260245ffd5b5f60208284031215613d02575f80fd5b815167ffffffffffffffff811115613d18575f80fd5b8201601f81018413613d28575f80fd5b8051613d366132e1826132ad565b818152856020838501011115613d4a575f80fd5b613d5b8260208301602086016130b5565b95945050505050565b5f60208284031215613d74575f80fd5b815161311481612fee56fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a26469706673582212209a1c026626524dd4419b6795fd817a860c25d29783cf84f8f0a4125cc4f9be6e64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMEtrog.json b/compiled-contracts/PolygonZkEVMEtrog.json new file mode 100644 index 000000000..5332c3a74 --- /dev/null +++ b/compiled-contracts/PolygonZkEVMEtrog.json @@ -0,0 +1,1142 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonZkEVMEtrog", + "sourceName": "contracts/v2/consensus/zkEVM/PolygonZkEVMEtrog.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRootV2", + "name": "_globalExitRootManager", + "type": "address" + }, + { + "internalType": "contract IERC20Upgradeable", + "name": "_pol", + "type": "address" + }, + { + "internalType": "contract IPolygonZkEVMBridgeV2", + "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": "ForceBatchesDecentralized", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchesNotAllowedOnEmergencyState", + "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": "HaltTimeoutNotExpiredAfterEmergencyState", + "type": "error" + }, + { + "inputs": [], + "name": "HugeTokenMetadataNotSupported", + "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": [ + { + "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": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "lastGlobalExitRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "sequencer", + "type": "address" + } + ], + "name": "InitialSequenceBatches", + "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" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "l1InfoRoot", + "type": "bytes32" + } + ], + "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": "address", + "name": "newForceBatchAddress", + "type": "address" + } + ], + "name": "SetForceBatchAddress", + "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": "GLOBAL_EXIT_ROOT_MANAGER_L2", + "outputs": [ + { + "internalType": "contract IBasePolygonZkEVMGlobalExitRoot", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_LIST_LEN_LEN", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS_EMPTY_METADATA", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_CONSTANT_BYTES", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_CONSTANT_BYTES_EMPTY_METADATA", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_DATA_LEN_EMPTY_METADATA", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "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": "admin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "bridgeAddress", + "outputs": [ + { + "internalType": "contract IPolygonZkEVMBridgeV2", + "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": "forceBatchAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "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" + }, + { + "internalType": "bytes", + "name": "_gasTokenMetadata", + "type": "bytes" + } + ], + "name": "generateInitializeTransaction", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalExitRootManager", + "outputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRootV2", + "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": "string", + "name": "sequencerURL", + "type": "string" + }, + { + "internalType": "string", + "name": "_networkName", + "type": "string" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "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": "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": "forcedGlobalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "forcedTimestamp", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "forcedBlockHashL1", + "type": "bytes32" + } + ], + "internalType": "struct PolygonRollupBaseEtrog.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": "forcedGlobalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "forcedTimestamp", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "forcedBlockHashL1", + "type": "bytes32" + } + ], + "internalType": "struct PolygonRollupBaseEtrog.BatchData[]", + "name": "batches", + "type": "tuple[]" + } + ], + "name": "sequenceForceBatches", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newForceBatchAddress", + "type": "address" + } + ], + "name": "setForceBatchAddress", + "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": "0x61010060405234801562000011575f80fd5b50604051620042453803806200424583398101604081905262000034916200006f565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d4565b6001600160a01b03811681146200006c575f80fd5b50565b5f805f806080858703121562000083575f80fd5b8451620000908162000057565b6020860151909450620000a38162000057565b6040860151909350620000b68162000057565b6060860151909250620000c98162000057565b939692955090935050565b60805160a05160c05160e05161408e620001b75f395f81816104de0152818161094201528181610aae01528181610cf6015281816112c90152818161176401528181611bb301528181611ca801528181612324015281816123e901528181612cf301528181612d6c01528181612d8e0152612ea301525f818161063701528181610eea01528181610fbf01528181611e7201528181611f7a015261283e01525f81816106f3015281816111400152818161253101526128ba01525f8181610725015281816107f501528181611bfc015281816125060152612e3a015261408e5ff3fe608060405234801561000f575f80fd5b50600436106102cc575f3560e01c80637a5460c51161017c578063c7fffd4b116100dd578063e46761c411610093578063ecef3f991161006e578063ecef3f991461076e578063f35dda4714610781578063f851a44014610789575f80fd5b8063e46761c414610720578063e7a7ed0214610747578063eaeb077b1461075b575f80fd5b8063cfa8ed47116100c3578063cfa8ed47146106ce578063d02103ca146106ee578063d7bc90ff14610715575f80fd5b8063c7fffd4b146106b3578063c89e42df146106bb575f80fd5b8063a3c573eb11610132578063ada8f91911610118578063ada8f9191461066c578063b0afe1541461067f578063c754c7ed1461068b575f80fd5b8063a3c573eb14610632578063a652f26c14610659575f80fd5b806391cafe321161016257806391cafe32146105f15780639e001877146106045780639f26f8401461061f575f80fd5b80637a5460c5146105ad5780638c3d7301146105e9575f80fd5b806340b5de6c11610231578063542028d5116101e75780636e05d2cd116101c25780636e05d2cd1461057e5780636ff512cc14610587578063712570221461059a575f80fd5b8063542028d51461054f578063676870d2146105575780636b8616ce1461055f575f80fd5b806349b7b8021161021757806349b7b802146104d95780634e4877061461050057806352bdeb6d14610513575f80fd5b806340b5de6c1461044857806345605267146104a0575f80fd5b8063267822471161028657806332c2d1531161026c57806332c2d153146103d65780633c351e10146103eb5780633cbc795b1461040b575f80fd5b806326782247146103715780632c111c06146103b6575f80fd5b806305835f37116102b657806305835f3714610306578063107bf28c1461034f57806311e892d414610357575f80fd5b8062d0295d146102d057806303508963146102eb575b5f80fd5b6102d86107ae565b6040519081526020015b60405180910390f35b6102f3602081565b60405161ffff90911681526020016102e2565b6103426040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102e29190613393565b6103426108b4565b61035f60f981565b60405160ff90911681526020016102e2565b6001546103919073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102e2565b6008546103919073ffffffffffffffffffffffffffffffffffffffff1681565b6103e96103e43660046133e5565b610940565b005b6009546103919073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104339074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102e2565b61046f7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102e2565b6007546104c09068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102e2565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6103e961050e366004613424565b610a0f565b6103426040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610342610c1e565b6102f3601f81565b6102d861056d366004613424565b60066020525f908152604090205481565b6102d860055481565b6103e961059536600461343f565b610c2b565b6103e96105a836600461357e565b610cf4565b6103426040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b6103e96114fe565b6103e96105ff36600461343f565b6115d0565b61039173a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103e961062d36600461366d565b6116e8565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6103426106673660046136ac565b611d74565b6103e961067a36600461343f565b612152565b6102d86405ca1ab1e081565b6007546104c090700100000000000000000000000000000000900467ffffffffffffffff1681565b61035f60e481565b6103e96106c936600461371d565b61221b565b6002546103919073ffffffffffffffffffffffffffffffffffffffff1681565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6102d8635ca1ab1e81565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6007546104c09067ffffffffffffffff1681565b6103e961076936600461374f565b6122ad565b6103e961077c3660046137c0565b612774565b61035f601b81565b5f546103919062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561083a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085e9190613808565b6007549091505f906108889067ffffffffffffffff6801000000000000000082048116911661384c565b67ffffffffffffffff169050805f036108a3575f9250505090565b6108ad8183613874565b9250505090565b600480546108c1906138ac565b80601f01602080910402602001604051908101604052809291908181526020018280546108ed906138ac565b80156109385780601f1061090f57610100808354040283529160200191610938565b820191905f5260205f20905b81548152906001019060200180831161091b57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109af576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a0291815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a65576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610aac576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b15573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3991906138fd565b610b9a5760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610b9a576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546108c1906138ac565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610c81576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c13565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610d63576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff1615808015610d8157505f54600160ff909116105b80610d9a5750303b158015610d9a57505f5460ff166001145b610e2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e87575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff8516156110e5576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa158015610f2e573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610f73919081019061391c565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d9060240160408051808303815f875af1158015611006573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061102a919061398e565b915091508163ffffffff165f146110a1576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff8416171790556110e2565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b6009545f9061112c90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685611d74565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111a7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111cb9190613808565b90505f808483858f6111de6001436139c6565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611324573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061134891906139df565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600390816113d89190613a3f565b5060046113e58982613a3f565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e60405161148593929190613b57565b60405180910390a150505050505080156114f5575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461154f576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611626576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611675576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c13565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590611726575073ffffffffffffffffffffffffffffffffffffffff81163314155b1561175d576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117ef91906139df565b6117f99190613b95565b67ffffffffffffffff16111561183b576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003611876576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156118b2576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff808216916118da91849168010000000000000000900416613bb6565b1115611912576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b83811015611bad575f87878381811061194d5761194d613bc9565b905060200281019061195f9190613bf6565b61196890613c32565b90508361197481613cb8565b825180516020918201208185015160408087015160608801519151959a509295505f946119e0948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f90815260069093529120549091508114611a68576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f90815260066020526040812055611a8c6001886139c6565b8403611afb5742600760109054906101000a900467ffffffffffffffff168460400151611ab99190613b95565b67ffffffffffffffff161115611afb576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc016040516020818303038152906040528051906020012094505050508080611ba590613cde565b915050611932565b50611c237f000000000000000000000000000000000000000000000000000000000000000084611bdb6107ae565b611be59190613d15565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190612f75565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611cf4908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af1158015611d10573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d3491906139df565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f87604051602401611da696959493929190613d2c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f03611ef65760f9601f8351611e3a9190613d8e565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611ee09796959493929190613da9565b6040516020818303038152906040529050611ffa565b815161ffff1015611f33576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611f42602083613d8e565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001611fe79796959493929190613e8b565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015612058573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166120d0576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f906121159084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001613f6d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146121a8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c13565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612271576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361227d8282613a3f565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c139190613393565b60085473ffffffffffffffffffffffffffffffffffffffff1680158015906122eb575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612322576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa15801561238b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123af91906138fd565b156123e6576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612450573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124749190613808565b9050828111156124b0576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113888411156124ec576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61252e73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308461304e565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612598573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125bc9190613808565b6007805491925067ffffffffffffffff909116905f6125da83613cb8565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051612611929190613fc8565b60405190819003902081426126276001436139c6565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f908152600690935291205532330361271d576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a261276c565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319061276390849033908b908b90613fd7565b60405180910390a25b505050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146127c5576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003612800576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561283c576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156128a1575f80fd5b505af11580156128b3573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612921573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129459190613808565b60075460055491925042916801000000000000000090910467ffffffffffffffff1690815f5b86811015612c66575f8a8a8381811061298657612986613bc9565b90506020028101906129989190613bf6565b6129a190613c32565b8051805160209091012060408201519192509067ffffffffffffffff1615612b8157856129cd81613cb8565b9650505f81836020015184604001518560600151604051602001612a2f9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114612ab7576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550612c51565b8151516201d4c01015612bc0576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b50508080612c5e90613cde565b91505061296b565b5060075467ffffffffffffffff9081169084161115612cb1576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff84811690831614612d66575f612cd6838661384c565b9050612cec67ffffffffffffffff8216836139c6565b9150612d257f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611bdb6107ae565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b612e62337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612df5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e199190613808565b612e239190613d15565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692919061304e565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015612efe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f2291906139df565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e76688604051612f6091815260200190565b60405180910390a25050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526130499084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526130b2565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526130ac9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612fc7565b50505050565b5f613113826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166131bd9092919063ffffffff16565b805190915015613049578080602001905181019061313191906138fd565b613049576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610e22565b606061214a84845f85855f808673ffffffffffffffffffffffffffffffffffffffff1685876040516131ef9190614047565b5f6040518083038185875af1925050503d805f8114613229576040519150601f19603f3d011682016040523d82523d5f602084013e61322e565b606091505b509150915061323f8783838761324a565b979650505050505050565b606083156132df5782515f036132d85773ffffffffffffffffffffffffffffffffffffffff85163b6132d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e22565b508161214a565b61214a83838151156132f45781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e229190613393565b5f5b8381101561334257818101518382015260200161332a565b50505f910152565b5f8151808452613361816020860160208601613328565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6133a5602083018461334a565b9392505050565b67ffffffffffffffff811681146133c1575f80fd5b50565b73ffffffffffffffffffffffffffffffffffffffff811681146133c1575f80fd5b5f805f606084860312156133f7575f80fd5b8335613402816133ac565b9250602084013591506040840135613419816133c4565b809150509250925092565b5f60208284031215613434575f80fd5b81356133a5816133ac565b5f6020828403121561344f575f80fd5b81356133a5816133c4565b63ffffffff811681146133c1575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156134df576134df61346b565b604052919050565b5f67ffffffffffffffff8211156135005761350061346b565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011261353b575f80fd5b813561354e613549826134e7565b613498565b818152846020838601011115613562575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c08789031215613593575f80fd5b863561359e816133c4565b955060208701356135ae816133c4565b945060408701356135be8161345a565b935060608701356135ce816133c4565b9250608087013567ffffffffffffffff808211156135ea575f80fd5b6135f68a838b0161352c565b935060a089013591508082111561360b575f80fd5b5061361889828a0161352c565b9150509295509295509295565b5f8083601f840112613635575f80fd5b50813567ffffffffffffffff81111561364c575f80fd5b6020830191508360208260051b8501011115613666575f80fd5b9250929050565b5f806020838503121561367e575f80fd5b823567ffffffffffffffff811115613694575f80fd5b6136a085828601613625565b90969095509350505050565b5f805f80608085870312156136bf575f80fd5b84356136ca8161345a565b935060208501356136da816133c4565b925060408501356136ea8161345a565b9150606085013567ffffffffffffffff811115613705575f80fd5b6137118782880161352c565b91505092959194509250565b5f6020828403121561372d575f80fd5b813567ffffffffffffffff811115613743575f80fd5b61214a8482850161352c565b5f805f60408486031215613761575f80fd5b833567ffffffffffffffff80821115613778575f80fd5b818601915086601f83011261378b575f80fd5b813581811115613799575f80fd5b8760208285010111156137aa575f80fd5b6020928301989097509590910135949350505050565b5f805f604084860312156137d2575f80fd5b833567ffffffffffffffff8111156137e8575f80fd5b6137f486828701613625565b9094509250506020840135613419816133c4565b5f60208284031215613818575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff82811682821603908082111561386d5761386d61381f565b5092915050565b5f826138a7577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c908216806138c057607f821691505b6020821081036138f7577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b5f6020828403121561390d575f80fd5b815180151581146133a5575f80fd5b5f6020828403121561392c575f80fd5b815167ffffffffffffffff811115613942575f80fd5b8201601f81018413613952575f80fd5b8051613960613549826134e7565b818152856020838501011115613974575f80fd5b613985826020830160208601613328565b95945050505050565b5f806040838503121561399f575f80fd5b82516139aa8161345a565b60208401519092506139bb816133c4565b809150509250929050565b818103818111156139d9576139d961381f565b92915050565b5f602082840312156139ef575f80fd5b81516133a5816133ac565b601f821115613049575f81815260208120601f850160051c81016020861015613a205750805b601f850160051c820191505b8181101561276c57828155600101613a2c565b815167ffffffffffffffff811115613a5957613a5961346b565b613a6d81613a6784546138ac565b846139fa565b602080601f831160018114613abf575f8415613a895750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561276c565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613b0b57888601518255948401946001909101908401613aec565b5085821015613b4757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f613b69606083018661334a565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff81811683821601908082111561386d5761386d61381f565b808201808211156139d9576139d961381f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613c28575f80fd5b9190910192915050565b5f60808236031215613c42575f80fd5b6040516080810167ffffffffffffffff8282108183111715613c6657613c6661346b565b816040528435915080821115613c7a575f80fd5b50613c873682860161352c565b825250602083013560208201526040830135613ca2816133ac565b6040820152606092830135928101929092525090565b5f67ffffffffffffffff808316818103613cd457613cd461381f565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d0e57613d0e61381f565b5060010190565b80820281158282048414176139d9576139d961381f565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152613d8260c083018461334a565b98975050505050505050565b61ffff81811683821601908082111561386d5761386d61381f565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751613e11816003860160208c01613328565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651613e54816017840160208b01613328565b808201915050818660f81b16601782015284519150613e7a826018830160208801613328565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751613ef3816003860160208c01613328565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651613f36816017840160208b01613328565b808201915050818660f01b16601782015284519150613f5c826019830160208801613328565b016019019998505050505050505050565b5f8651613f7e818460208b01613328565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f8251613c2881846020870161332856fea2646970667358221220344c69c385326822d05960be112181a98251ecc843fad3de824d65830caab17764736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106102cc575f3560e01c80637a5460c51161017c578063c7fffd4b116100dd578063e46761c411610093578063ecef3f991161006e578063ecef3f991461076e578063f35dda4714610781578063f851a44014610789575f80fd5b8063e46761c414610720578063e7a7ed0214610747578063eaeb077b1461075b575f80fd5b8063cfa8ed47116100c3578063cfa8ed47146106ce578063d02103ca146106ee578063d7bc90ff14610715575f80fd5b8063c7fffd4b146106b3578063c89e42df146106bb575f80fd5b8063a3c573eb11610132578063ada8f91911610118578063ada8f9191461066c578063b0afe1541461067f578063c754c7ed1461068b575f80fd5b8063a3c573eb14610632578063a652f26c14610659575f80fd5b806391cafe321161016257806391cafe32146105f15780639e001877146106045780639f26f8401461061f575f80fd5b80637a5460c5146105ad5780638c3d7301146105e9575f80fd5b806340b5de6c11610231578063542028d5116101e75780636e05d2cd116101c25780636e05d2cd1461057e5780636ff512cc14610587578063712570221461059a575f80fd5b8063542028d51461054f578063676870d2146105575780636b8616ce1461055f575f80fd5b806349b7b8021161021757806349b7b802146104d95780634e4877061461050057806352bdeb6d14610513575f80fd5b806340b5de6c1461044857806345605267146104a0575f80fd5b8063267822471161028657806332c2d1531161026c57806332c2d153146103d65780633c351e10146103eb5780633cbc795b1461040b575f80fd5b806326782247146103715780632c111c06146103b6575f80fd5b806305835f37116102b657806305835f3714610306578063107bf28c1461034f57806311e892d414610357575f80fd5b8062d0295d146102d057806303508963146102eb575b5f80fd5b6102d86107ae565b6040519081526020015b60405180910390f35b6102f3602081565b60405161ffff90911681526020016102e2565b6103426040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102e29190613393565b6103426108b4565b61035f60f981565b60405160ff90911681526020016102e2565b6001546103919073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102e2565b6008546103919073ffffffffffffffffffffffffffffffffffffffff1681565b6103e96103e43660046133e5565b610940565b005b6009546103919073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104339074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102e2565b61046f7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102e2565b6007546104c09068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102e2565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6103e961050e366004613424565b610a0f565b6103426040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610342610c1e565b6102f3601f81565b6102d861056d366004613424565b60066020525f908152604090205481565b6102d860055481565b6103e961059536600461343f565b610c2b565b6103e96105a836600461357e565b610cf4565b6103426040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b6103e96114fe565b6103e96105ff36600461343f565b6115d0565b61039173a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103e961062d36600461366d565b6116e8565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6103426106673660046136ac565b611d74565b6103e961067a36600461343f565b612152565b6102d86405ca1ab1e081565b6007546104c090700100000000000000000000000000000000900467ffffffffffffffff1681565b61035f60e481565b6103e96106c936600461371d565b61221b565b6002546103919073ffffffffffffffffffffffffffffffffffffffff1681565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6102d8635ca1ab1e81565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6007546104c09067ffffffffffffffff1681565b6103e961076936600461374f565b6122ad565b6103e961077c3660046137c0565b612774565b61035f601b81565b5f546103919062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561083a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085e9190613808565b6007549091505f906108889067ffffffffffffffff6801000000000000000082048116911661384c565b67ffffffffffffffff169050805f036108a3575f9250505090565b6108ad8183613874565b9250505090565b600480546108c1906138ac565b80601f01602080910402602001604051908101604052809291908181526020018280546108ed906138ac565b80156109385780601f1061090f57610100808354040283529160200191610938565b820191905f5260205f20905b81548152906001019060200180831161091b57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109af576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a0291815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a65576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610aac576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b15573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3991906138fd565b610b9a5760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610b9a576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546108c1906138ac565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610c81576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c13565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610d63576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff1615808015610d8157505f54600160ff909116105b80610d9a5750303b158015610d9a57505f5460ff166001145b610e2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e87575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff8516156110e5576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa158015610f2e573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610f73919081019061391c565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d9060240160408051808303815f875af1158015611006573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061102a919061398e565b915091508163ffffffff165f146110a1576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff8416171790556110e2565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b6009545f9061112c90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685611d74565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111a7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111cb9190613808565b90505f808483858f6111de6001436139c6565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611324573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061134891906139df565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600390816113d89190613a3f565b5060046113e58982613a3f565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e60405161148593929190613b57565b60405180910390a150505050505080156114f5575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461154f576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611626576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611675576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c13565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590611726575073ffffffffffffffffffffffffffffffffffffffff81163314155b1561175d576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117ef91906139df565b6117f99190613b95565b67ffffffffffffffff16111561183b576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003611876576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156118b2576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff808216916118da91849168010000000000000000900416613bb6565b1115611912576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b83811015611bad575f87878381811061194d5761194d613bc9565b905060200281019061195f9190613bf6565b61196890613c32565b90508361197481613cb8565b825180516020918201208185015160408087015160608801519151959a509295505f946119e0948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f90815260069093529120549091508114611a68576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f90815260066020526040812055611a8c6001886139c6565b8403611afb5742600760109054906101000a900467ffffffffffffffff168460400151611ab99190613b95565b67ffffffffffffffff161115611afb576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc016040516020818303038152906040528051906020012094505050508080611ba590613cde565b915050611932565b50611c237f000000000000000000000000000000000000000000000000000000000000000084611bdb6107ae565b611be59190613d15565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190612f75565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611cf4908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af1158015611d10573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d3491906139df565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f87604051602401611da696959493929190613d2c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f03611ef65760f9601f8351611e3a9190613d8e565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611ee09796959493929190613da9565b6040516020818303038152906040529050611ffa565b815161ffff1015611f33576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611f42602083613d8e565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001611fe79796959493929190613e8b565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015612058573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166120d0576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f906121159084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001613f6d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146121a8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c13565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612271576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361227d8282613a3f565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c139190613393565b60085473ffffffffffffffffffffffffffffffffffffffff1680158015906122eb575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612322576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa15801561238b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123af91906138fd565b156123e6576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612450573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124749190613808565b9050828111156124b0576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113888411156124ec576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61252e73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308461304e565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612598573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125bc9190613808565b6007805491925067ffffffffffffffff909116905f6125da83613cb8565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051612611929190613fc8565b60405190819003902081426126276001436139c6565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f908152600690935291205532330361271d576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a261276c565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319061276390849033908b908b90613fd7565b60405180910390a25b505050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146127c5576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003612800576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561283c576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156128a1575f80fd5b505af11580156128b3573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612921573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129459190613808565b60075460055491925042916801000000000000000090910467ffffffffffffffff1690815f5b86811015612c66575f8a8a8381811061298657612986613bc9565b90506020028101906129989190613bf6565b6129a190613c32565b8051805160209091012060408201519192509067ffffffffffffffff1615612b8157856129cd81613cb8565b9650505f81836020015184604001518560600151604051602001612a2f9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114612ab7576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550612c51565b8151516201d4c01015612bc0576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b50508080612c5e90613cde565b91505061296b565b5060075467ffffffffffffffff9081169084161115612cb1576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff84811690831614612d66575f612cd6838661384c565b9050612cec67ffffffffffffffff8216836139c6565b9150612d257f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611bdb6107ae565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b612e62337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612df5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e199190613808565b612e239190613d15565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692919061304e565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015612efe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f2291906139df565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e76688604051612f6091815260200190565b60405180910390a25050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526130499084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526130b2565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526130ac9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612fc7565b50505050565b5f613113826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166131bd9092919063ffffffff16565b805190915015613049578080602001905181019061313191906138fd565b613049576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610e22565b606061214a84845f85855f808673ffffffffffffffffffffffffffffffffffffffff1685876040516131ef9190614047565b5f6040518083038185875af1925050503d805f8114613229576040519150601f19603f3d011682016040523d82523d5f602084013e61322e565b606091505b509150915061323f8783838761324a565b979650505050505050565b606083156132df5782515f036132d85773ffffffffffffffffffffffffffffffffffffffff85163b6132d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e22565b508161214a565b61214a83838151156132f45781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e229190613393565b5f5b8381101561334257818101518382015260200161332a565b50505f910152565b5f8151808452613361816020860160208601613328565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6133a5602083018461334a565b9392505050565b67ffffffffffffffff811681146133c1575f80fd5b50565b73ffffffffffffffffffffffffffffffffffffffff811681146133c1575f80fd5b5f805f606084860312156133f7575f80fd5b8335613402816133ac565b9250602084013591506040840135613419816133c4565b809150509250925092565b5f60208284031215613434575f80fd5b81356133a5816133ac565b5f6020828403121561344f575f80fd5b81356133a5816133c4565b63ffffffff811681146133c1575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156134df576134df61346b565b604052919050565b5f67ffffffffffffffff8211156135005761350061346b565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011261353b575f80fd5b813561354e613549826134e7565b613498565b818152846020838601011115613562575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c08789031215613593575f80fd5b863561359e816133c4565b955060208701356135ae816133c4565b945060408701356135be8161345a565b935060608701356135ce816133c4565b9250608087013567ffffffffffffffff808211156135ea575f80fd5b6135f68a838b0161352c565b935060a089013591508082111561360b575f80fd5b5061361889828a0161352c565b9150509295509295509295565b5f8083601f840112613635575f80fd5b50813567ffffffffffffffff81111561364c575f80fd5b6020830191508360208260051b8501011115613666575f80fd5b9250929050565b5f806020838503121561367e575f80fd5b823567ffffffffffffffff811115613694575f80fd5b6136a085828601613625565b90969095509350505050565b5f805f80608085870312156136bf575f80fd5b84356136ca8161345a565b935060208501356136da816133c4565b925060408501356136ea8161345a565b9150606085013567ffffffffffffffff811115613705575f80fd5b6137118782880161352c565b91505092959194509250565b5f6020828403121561372d575f80fd5b813567ffffffffffffffff811115613743575f80fd5b61214a8482850161352c565b5f805f60408486031215613761575f80fd5b833567ffffffffffffffff80821115613778575f80fd5b818601915086601f83011261378b575f80fd5b813581811115613799575f80fd5b8760208285010111156137aa575f80fd5b6020928301989097509590910135949350505050565b5f805f604084860312156137d2575f80fd5b833567ffffffffffffffff8111156137e8575f80fd5b6137f486828701613625565b9094509250506020840135613419816133c4565b5f60208284031215613818575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff82811682821603908082111561386d5761386d61381f565b5092915050565b5f826138a7577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c908216806138c057607f821691505b6020821081036138f7577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b5f6020828403121561390d575f80fd5b815180151581146133a5575f80fd5b5f6020828403121561392c575f80fd5b815167ffffffffffffffff811115613942575f80fd5b8201601f81018413613952575f80fd5b8051613960613549826134e7565b818152856020838501011115613974575f80fd5b613985826020830160208601613328565b95945050505050565b5f806040838503121561399f575f80fd5b82516139aa8161345a565b60208401519092506139bb816133c4565b809150509250929050565b818103818111156139d9576139d961381f565b92915050565b5f602082840312156139ef575f80fd5b81516133a5816133ac565b601f821115613049575f81815260208120601f850160051c81016020861015613a205750805b601f850160051c820191505b8181101561276c57828155600101613a2c565b815167ffffffffffffffff811115613a5957613a5961346b565b613a6d81613a6784546138ac565b846139fa565b602080601f831160018114613abf575f8415613a895750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561276c565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613b0b57888601518255948401946001909101908401613aec565b5085821015613b4757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f613b69606083018661334a565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff81811683821601908082111561386d5761386d61381f565b808201808211156139d9576139d961381f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613c28575f80fd5b9190910192915050565b5f60808236031215613c42575f80fd5b6040516080810167ffffffffffffffff8282108183111715613c6657613c6661346b565b816040528435915080821115613c7a575f80fd5b50613c873682860161352c565b825250602083013560208201526040830135613ca2816133ac565b6040820152606092830135928101929092525090565b5f67ffffffffffffffff808316818103613cd457613cd461381f565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d0e57613d0e61381f565b5060010190565b80820281158282048414176139d9576139d961381f565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152613d8260c083018461334a565b98975050505050505050565b61ffff81811683821601908082111561386d5761386d61381f565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751613e11816003860160208c01613328565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651613e54816017840160208b01613328565b808201915050818660f81b16601782015284519150613e7a826018830160208801613328565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751613ef3816003860160208c01613328565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651613f36816017840160208b01613328565b808201915050818660f01b16601782015284519150613f5c826019830160208801613328565b016019019998505050505050505050565b5f8651613f7e818460208b01613328565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f8251613c2881846020870161332856fea2646970667358221220344c69c385326822d05960be112181a98251ecc843fad3de824d65830caab17764736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/PolygonZkEVMExistentEtrog.json b/compiled-contracts/PolygonZkEVMExistentEtrog.json new file mode 100644 index 000000000..649928639 --- /dev/null +++ b/compiled-contracts/PolygonZkEVMExistentEtrog.json @@ -0,0 +1,1219 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonZkEVMExistentEtrog", + "sourceName": "contracts/v2/consensus/zkEVM/PolygonZkEVMExistentEtrog.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRootV2", + "name": "_globalExitRootManager", + "type": "address" + }, + { + "internalType": "contract IERC20Upgradeable", + "name": "_pol", + "type": "address" + }, + { + "internalType": "contract IPolygonZkEVMBridgeV2", + "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": "ForceBatchesDecentralized", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchesNotAllowedOnEmergencyState", + "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": "HaltTimeoutNotExpiredAfterEmergencyState", + "type": "error" + }, + { + "inputs": [], + "name": "HugeTokenMetadataNotSupported", + "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": [ + { + "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": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "lastGlobalExitRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "sequencer", + "type": "address" + } + ], + "name": "InitialSequenceBatches", + "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" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "l1InfoRoot", + "type": "bytes32" + } + ], + "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": "address", + "name": "newForceBatchAddress", + "type": "address" + } + ], + "name": "SetForceBatchAddress", + "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": false, + "internalType": "uint64", + "name": "numBatch", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "transactions", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "lastGlobalExitRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "sequencer", + "type": "address" + } + ], + "name": "UpdateEtrogSequence", + "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": "GLOBAL_EXIT_ROOT_MANAGER_L2", + "outputs": [ + { + "internalType": "contract IBasePolygonZkEVMGlobalExitRoot", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_LIST_LEN_LEN", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS_EMPTY_METADATA", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_CONSTANT_BYTES", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_CONSTANT_BYTES_EMPTY_METADATA", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_DATA_LEN_EMPTY_METADATA", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INITIALIZE_TX_EFFECTIVE_PERCENTAGE", + "outputs": [ + { + "internalType": "bytes1", + "name": "", + "type": "bytes1" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SET_UP_ETROG_TX", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "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": "admin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "bridgeAddress", + "outputs": [ + { + "internalType": "contract IPolygonZkEVMBridgeV2", + "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": "forceBatchAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "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" + }, + { + "internalType": "bytes", + "name": "_gasTokenMetadata", + "type": "bytes" + } + ], + "name": "generateInitializeTransaction", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "globalExitRootManager", + "outputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRootV2", + "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": "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" + } + ], + "name": "initializeUpgrade", + "outputs": [], + "stateMutability": "nonpayable", + "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": "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": "forcedGlobalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "forcedTimestamp", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "forcedBlockHashL1", + "type": "bytes32" + } + ], + "internalType": "struct PolygonRollupBaseEtrog.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": "forcedGlobalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "forcedTimestamp", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "forcedBlockHashL1", + "type": "bytes32" + } + ], + "internalType": "struct PolygonRollupBaseEtrog.BatchData[]", + "name": "batches", + "type": "tuple[]" + } + ], + "name": "sequenceForceBatches", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newForceBatchAddress", + "type": "address" + } + ], + "name": "setForceBatchAddress", + "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": "0x61010060405234801562000011575f80fd5b50604051620049603803806200496083398101604081905262000034916200006f565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d4565b6001600160a01b03811681146200006c575f80fd5b50565b5f805f806080858703121562000083575f80fd5b8451620000908162000057565b6020860151909450620000a38162000057565b6040860151909350620000b68162000057565b6060860151909250620000c98162000057565b939692955090935050565b60805160a05160c05160e051614794620001cc5f395f81816104f40152818161097301528181610adf01528181610c5e01528181610fa8015281816112aa0152818161187801528181611d130152818161216201528181612257015281816128ef015281816129b4015281816132bd0152818161333601528181613358015261346d01525f8181610660015281816114990152818161156e01528181612421015281816125290152612e0801525f818161072401528181610e1d015281816116ef01528181612afc0152612e8401525f818161075601528181610826015281816121ab01528181612ad1015261340401526147945ff3fe608060405234801561000f575f80fd5b50600436106102e2575f3560e01c80637a5460c511610187578063c7fffd4b116100dd578063e46761c411610093578063ecef3f991161006e578063ecef3f991461079f578063f35dda47146107b2578063f851a440146107ba575f80fd5b8063e46761c414610751578063e7a7ed0214610778578063eaeb077b1461078c575f80fd5b8063cfa8ed47116100c3578063cfa8ed47146106ff578063d02103ca1461071f578063d7bc90ff14610746575f80fd5b8063c7fffd4b146106e4578063c89e42df146106ec575f80fd5b8063a3c573eb1161013d578063af7f3e0211610118578063af7f3e02146106a8578063b0afe154146106b0578063c754c7ed146106bc575f80fd5b8063a3c573eb1461065b578063a652f26c14610682578063ada8f91914610695575f80fd5b806391cafe321161016d57806391cafe321461061a5780639e0018771461062d5780639f26f84014610648575f80fd5b80637a5460c5146105d65780638c3d730114610612575f80fd5b8063456052671161023c5780635d6717a5116101f25780636e05d2cd116101cd5780636e05d2cd146105a75780636ff512cc146105b057806371257022146105c3575f80fd5b80635d6717a51461056d578063676870d2146105805780636b8616ce14610588575f80fd5b80634e487706116102225780634e4877061461051657806352bdeb6d14610529578063542028d514610565575f80fd5b806345605267146104b657806349b7b802146104ef575f80fd5b8063267822471161029c5780633c351e10116102775780633c351e10146104015780633cbc795b1461042157806340b5de6c1461045e575f80fd5b806326782247146103875780632c111c06146103cc57806332c2d153146103ec575f80fd5b806305835f37116102cc57806305835f371461031c578063107bf28c1461036557806311e892d41461036d575f80fd5b8062d0295d146102e65780630350896314610301575b5f80fd5b6102ee6107df565b6040519081526020015b60405180910390f35b610309602081565b60405161ffff90911681526020016102f8565b6103586040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102f8919061395d565b6103586108e5565b61037560f981565b60405160ff90911681526020016102f8565b6001546103a79073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102f8565b6008546103a79073ffffffffffffffffffffffffffffffffffffffff1681565b6103ff6103fa3660046139af565b610971565b005b6009546103a79073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104499074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102f8565b6104857fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102f8565b6007546104d69068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102f8565b6103a77f000000000000000000000000000000000000000000000000000000000000000081565b6103ff6105243660046139ee565b610a40565b6103586040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610358610c4f565b6103ff61057b366004613b1c565b610c5c565b610309601f81565b6102ee6105963660046139ee565b60066020525f908152604090205481565b6102ee60055481565b6103ff6105be366004613ba7565b6111df565b6103ff6105d1366004613bd3565b6112a8565b6103586040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b6103ff611aad565b6103ff610628366004613ba7565b611b7f565b6103a773a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103ff610656366004613cc2565b611c97565b6103a77f000000000000000000000000000000000000000000000000000000000000000081565b610358610690366004613d01565b612323565b6103ff6106a3366004613ba7565b612701565b6103586127ca565b6102ee6405ca1ab1e081565b6007546104d690700100000000000000000000000000000000900467ffffffffffffffff1681565b61037560e481565b6103ff6106fa366004613d72565b6127e6565b6002546103a79073ffffffffffffffffffffffffffffffffffffffff1681565b6103a77f000000000000000000000000000000000000000000000000000000000000000081565b6102ee635ca1ab1e81565b6103a77f000000000000000000000000000000000000000000000000000000000000000081565b6007546104d69067ffffffffffffffff1681565b6103ff61079a366004613da4565b612878565b6103ff6107ad366004613e15565b612d3e565b610375601b81565b5f546103a79062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561086b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088f9190613e5d565b6007549091505f906108b99067ffffffffffffffff68010000000000000000820481169116613ea1565b67ffffffffffffffff169050805f036108d4575f9250505090565b6108de8183613ec9565b9250505090565b600480546108f290613f01565b80601f016020809104026020016040519081016040528092919081815260200182805461091e90613f01565b80156109695780601f1061094057610100808354040283529160200191610969565b820191905f5260205f20905b81548152906001019060200180831161094c57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109e0576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a3391815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a96576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610add576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b6a9190613f52565b610bcb5760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610bcb576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546108f290613f01565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610ccb576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff1615808015610ce957505f54600160ff909116105b80610d025750303b158015610d0257505f5460ff166001145b610d93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610def575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f6040518060a00160405280606281526020016146fd6062913990505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e84573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ea89190613e5d565b90505f868483858d610ebb600143613f71565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291505f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611003573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110279190613f8a565b90508b5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508a60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555089600390816110b89190613fea565b5060046110c58a82613fea565b508b60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fd2c80353fc15ef62c6affc7cd6b7ab5b42c43290c50be3372e55ae552cecd19c8187858e6040516111679493929190614102565b60405180910390a150505050505080156111d7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611235576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c44565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611317576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff161580801561133557505f54600160ff909116105b8061134e5750303b15801561134e57505f5460ff166001145b6113da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610d8a565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611436575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611694576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa1580156114dd573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526115229190810190614151565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d9060240160408051808303815f875af11580156115b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115d991906141c3565b915091508163ffffffff165f14611650576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055611691565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b6009545f906116db90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685612323565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611756573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061177a9190613e5d565b90505f808483858f61178d600143613f71565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af11580156118d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118f79190613f8a565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600390816119879190613fea565b5060046119948982613fea565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611a34939291906141fb565b60405180910390a15050505050508015611aa4575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611afe576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611bd5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611c24576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c44565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590611cd5575073ffffffffffffffffffffffffffffffffffffffff81163314155b15611d0c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d7a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d9e9190613f8a565b611da89190614239565b67ffffffffffffffff161115611dea576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003611e25576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611e61576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff80821691611e899184916801000000000000000090041661425a565b1115611ec1576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b8381101561215c575f878783818110611efc57611efc61426d565b9050602002810190611f0e919061429a565b611f17906142d6565b905083611f238161435c565b825180516020918201208185015160408087015160608801519151959a509295505f94611f8f948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f90815260069093529120549091508114612017576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f9081526006602052604081205561203b600188613f71565b84036120aa5742600760109054906101000a900467ffffffffffffffff1684604001516120689190614239565b67ffffffffffffffff1611156120aa576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209450505050808061215490614382565b915050611ee1565b506121d27f00000000000000000000000000000000000000000000000000000000000000008461218a6107df565b61219491906143b9565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016919061353f565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906122a3908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af11580156122bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122e39190613f8a565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f87604051602401612355969594939291906143d0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f036124a55760f9601f83516123e99190614432565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e48760405160200161248f979695949392919061444d565b60405160208183030381529060405290506125a9565b815161ffff10156124e2576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96124f1602083614432565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001612596979695949392919061452f565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015612607573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661267f576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f906126c49084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614611565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612757576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c44565b6040518060a00160405280606281526020016146fd6062913981565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff16331461283c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036128488282613fea565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c44919061395d565b60085473ffffffffffffffffffffffffffffffffffffffff1680158015906128b6575073ffffffffffffffffffffffffffffffffffffffff81163314155b156128ed576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015612956573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061297a9190613f52565b156129b1576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a1b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a3f9190613e5d565b905082811115612a7b576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388841115612ab7576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612af973ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613618565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b879190613e5d565b6007805491925067ffffffffffffffff909116905f612ba58361435c565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051612bdc92919061466c565b6040519081900390208142612bf2600143613f71565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f9081526006909352912055323303612ce8576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a26111d7565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93190612d2e90849033908b908b9061467b565b60405180910390a2505050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612d8f576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003612dca576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612e06576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612e6b575f80fd5b505af1158015612e7d573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612eeb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f0f9190613e5d565b60075460055491925042916801000000000000000090910467ffffffffffffffff1690815f5b86811015613230575f8a8a83818110612f5057612f5061426d565b9050602002810190612f62919061429a565b612f6b906142d6565b8051805160209091012060408201519192509067ffffffffffffffff161561314b5785612f978161435c565b9650505f81836020015184604001518560600151604051602001612ff99493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114613081576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f90555061321b565b8151516201d4c0101561318a576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b5050808061322890614382565b915050612f35565b5060075467ffffffffffffffff908116908416111561327b576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff84811690831614613330575f6132a08386613ea1565b90506132b667ffffffffffffffff821683613f71565b91506132ef7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661218a6107df565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b61342c337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133e39190613e5d565b6133ed91906143b9565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613618565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af11580156134c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134ec9190613f8a565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e7668860405161352a91815260200190565b60405180910390a25050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526136139084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261367c565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526136769085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613591565b50505050565b5f6136dd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166137879092919063ffffffff16565b80519091501561361357808060200190518101906136fb9190613f52565b613613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610d8a565b60606126f984845f85855f808673ffffffffffffffffffffffffffffffffffffffff1685876040516137b991906146eb565b5f6040518083038185875af1925050503d805f81146137f3576040519150601f19603f3d011682016040523d82523d5f602084013e6137f8565b606091505b509150915061380987838387613814565b979650505050505050565b606083156138a95782515f036138a25773ffffffffffffffffffffffffffffffffffffffff85163b6138a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d8a565b50816126f9565b6126f983838151156138be5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8a919061395d565b5f5b8381101561390c5781810151838201526020016138f4565b50505f910152565b5f815180845261392b8160208601602086016138f2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61396f6020830184613914565b9392505050565b67ffffffffffffffff8116811461398b575f80fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461398b575f80fd5b5f805f606084860312156139c1575f80fd5b83356139cc81613976565b92506020840135915060408401356139e38161398e565b809150509250925092565b5f602082840312156139fe575f80fd5b813561396f81613976565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613a7d57613a7d613a09565b604052919050565b5f67ffffffffffffffff821115613a9e57613a9e613a09565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112613ad9575f80fd5b8135613aec613ae782613a85565b613a36565b818152846020838601011115613b00575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f60a08688031215613b30575f80fd5b8535613b3b8161398e565b94506020860135613b4b8161398e565b9350604086013567ffffffffffffffff80821115613b67575f80fd5b613b7389838a01613aca565b94506060880135915080821115613b88575f80fd5b50613b9588828901613aca565b95989497509295608001359392505050565b5f60208284031215613bb7575f80fd5b813561396f8161398e565b63ffffffff8116811461398b575f80fd5b5f805f805f8060c08789031215613be8575f80fd5b8635613bf38161398e565b95506020870135613c038161398e565b94506040870135613c1381613bc2565b93506060870135613c238161398e565b9250608087013567ffffffffffffffff80821115613c3f575f80fd5b613c4b8a838b01613aca565b935060a0890135915080821115613c60575f80fd5b50613c6d89828a01613aca565b9150509295509295509295565b5f8083601f840112613c8a575f80fd5b50813567ffffffffffffffff811115613ca1575f80fd5b6020830191508360208260051b8501011115613cbb575f80fd5b9250929050565b5f8060208385031215613cd3575f80fd5b823567ffffffffffffffff811115613ce9575f80fd5b613cf585828601613c7a565b90969095509350505050565b5f805f8060808587031215613d14575f80fd5b8435613d1f81613bc2565b93506020850135613d2f8161398e565b92506040850135613d3f81613bc2565b9150606085013567ffffffffffffffff811115613d5a575f80fd5b613d6687828801613aca565b91505092959194509250565b5f60208284031215613d82575f80fd5b813567ffffffffffffffff811115613d98575f80fd5b6126f984828501613aca565b5f805f60408486031215613db6575f80fd5b833567ffffffffffffffff80821115613dcd575f80fd5b818601915086601f830112613de0575f80fd5b813581811115613dee575f80fd5b876020828501011115613dff575f80fd5b6020928301989097509590910135949350505050565b5f805f60408486031215613e27575f80fd5b833567ffffffffffffffff811115613e3d575f80fd5b613e4986828701613c7a565b90945092505060208401356139e38161398e565b5f60208284031215613e6d575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff828116828216039080821115613ec257613ec2613e74565b5092915050565b5f82613efc577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c90821680613f1557607f821691505b602082108103613f4c577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b5f60208284031215613f62575f80fd5b8151801515811461396f575f80fd5b81810381811115613f8457613f84613e74565b92915050565b5f60208284031215613f9a575f80fd5b815161396f81613976565b601f821115613613575f81815260208120601f850160051c81016020861015613fcb5750805b601f850160051c820191505b818110156111d757828155600101613fd7565b815167ffffffffffffffff81111561400457614004613a09565b614018816140128454613f01565b84613fa5565b602080601f83116001811461406a575f84156140345750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556111d7565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156140b657888601518255948401946001909101908401614097565b50858210156140f257878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff85168152608060208201525f6141246080830186613914565b905083604083015273ffffffffffffffffffffffffffffffffffffffff8316606083015295945050505050565b5f60208284031215614161575f80fd5b815167ffffffffffffffff811115614177575f80fd5b8201601f81018413614187575f80fd5b8051614195613ae782613a85565b8181528560208385010111156141a9575f80fd5b6141ba8260208301602086016138f2565b95945050505050565b5f80604083850312156141d4575f80fd5b82516141df81613bc2565b60208401519092506141f08161398e565b809150509250929050565b606081525f61420d6060830186613914565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff818116838216019080821115613ec257613ec2613e74565b80820180821115613f8457613f84613e74565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126142cc575f80fd5b9190910192915050565b5f608082360312156142e6575f80fd5b6040516080810167ffffffffffffffff828210818311171561430a5761430a613a09565b81604052843591508082111561431e575f80fd5b5061432b36828601613aca565b82525060208301356020820152604083013561434681613976565b6040820152606092830135928101929092525090565b5f67ffffffffffffffff80831681810361437857614378613e74565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143b2576143b2613e74565b5060010190565b8082028115828204841417613f8457613f84613e74565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261442660c0830184613914565b98975050505050505050565b61ffff818116838216019080821115613ec257613ec2613e74565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b16600184015287516144b5816003860160208c016138f2565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516144f8816017840160208b016138f2565b808201915050818660f81b1660178201528451915061451e8260188301602088016138f2565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614597816003860160208c016138f2565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516145da816017840160208b016138f2565b808201915050818660f01b166017820152845191506146008260198301602088016138f2565b016019019998505050505050505050565b5f8651614622818460208b016138f2565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f82516142cc8184602087016138f256fedf2a8080944d5cf5032b2a844602278b01199ed191a86c93ff8080821092808000000000000000000000000000000000000000000000000000000005ca1ab1e000000000000000000000000000000000000000000000000000000005ca1ab1e01bffa2646970667358221220922931e5d0570d6de206da26a8cb6cc8865aa3a1e27df595ba4f321c371781f664736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106102e2575f3560e01c80637a5460c511610187578063c7fffd4b116100dd578063e46761c411610093578063ecef3f991161006e578063ecef3f991461079f578063f35dda47146107b2578063f851a440146107ba575f80fd5b8063e46761c414610751578063e7a7ed0214610778578063eaeb077b1461078c575f80fd5b8063cfa8ed47116100c3578063cfa8ed47146106ff578063d02103ca1461071f578063d7bc90ff14610746575f80fd5b8063c7fffd4b146106e4578063c89e42df146106ec575f80fd5b8063a3c573eb1161013d578063af7f3e0211610118578063af7f3e02146106a8578063b0afe154146106b0578063c754c7ed146106bc575f80fd5b8063a3c573eb1461065b578063a652f26c14610682578063ada8f91914610695575f80fd5b806391cafe321161016d57806391cafe321461061a5780639e0018771461062d5780639f26f84014610648575f80fd5b80637a5460c5146105d65780638c3d730114610612575f80fd5b8063456052671161023c5780635d6717a5116101f25780636e05d2cd116101cd5780636e05d2cd146105a75780636ff512cc146105b057806371257022146105c3575f80fd5b80635d6717a51461056d578063676870d2146105805780636b8616ce14610588575f80fd5b80634e487706116102225780634e4877061461051657806352bdeb6d14610529578063542028d514610565575f80fd5b806345605267146104b657806349b7b802146104ef575f80fd5b8063267822471161029c5780633c351e10116102775780633c351e10146104015780633cbc795b1461042157806340b5de6c1461045e575f80fd5b806326782247146103875780632c111c06146103cc57806332c2d153146103ec575f80fd5b806305835f37116102cc57806305835f371461031c578063107bf28c1461036557806311e892d41461036d575f80fd5b8062d0295d146102e65780630350896314610301575b5f80fd5b6102ee6107df565b6040519081526020015b60405180910390f35b610309602081565b60405161ffff90911681526020016102f8565b6103586040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102f8919061395d565b6103586108e5565b61037560f981565b60405160ff90911681526020016102f8565b6001546103a79073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102f8565b6008546103a79073ffffffffffffffffffffffffffffffffffffffff1681565b6103ff6103fa3660046139af565b610971565b005b6009546103a79073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104499074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102f8565b6104857fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102f8565b6007546104d69068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102f8565b6103a77f000000000000000000000000000000000000000000000000000000000000000081565b6103ff6105243660046139ee565b610a40565b6103586040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610358610c4f565b6103ff61057b366004613b1c565b610c5c565b610309601f81565b6102ee6105963660046139ee565b60066020525f908152604090205481565b6102ee60055481565b6103ff6105be366004613ba7565b6111df565b6103ff6105d1366004613bd3565b6112a8565b6103586040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b6103ff611aad565b6103ff610628366004613ba7565b611b7f565b6103a773a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103ff610656366004613cc2565b611c97565b6103a77f000000000000000000000000000000000000000000000000000000000000000081565b610358610690366004613d01565b612323565b6103ff6106a3366004613ba7565b612701565b6103586127ca565b6102ee6405ca1ab1e081565b6007546104d690700100000000000000000000000000000000900467ffffffffffffffff1681565b61037560e481565b6103ff6106fa366004613d72565b6127e6565b6002546103a79073ffffffffffffffffffffffffffffffffffffffff1681565b6103a77f000000000000000000000000000000000000000000000000000000000000000081565b6102ee635ca1ab1e81565b6103a77f000000000000000000000000000000000000000000000000000000000000000081565b6007546104d69067ffffffffffffffff1681565b6103ff61079a366004613da4565b612878565b6103ff6107ad366004613e15565b612d3e565b610375601b81565b5f546103a79062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561086b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088f9190613e5d565b6007549091505f906108b99067ffffffffffffffff68010000000000000000820481169116613ea1565b67ffffffffffffffff169050805f036108d4575f9250505090565b6108de8183613ec9565b9250505090565b600480546108f290613f01565b80601f016020809104026020016040519081016040528092919081815260200182805461091e90613f01565b80156109695780601f1061094057610100808354040283529160200191610969565b820191905f5260205f20905b81548152906001019060200180831161094c57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109e0576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a3391815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a96576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610add576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b6a9190613f52565b610bcb5760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610bcb576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546108f290613f01565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610ccb576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff1615808015610ce957505f54600160ff909116105b80610d025750303b158015610d0257505f5460ff166001145b610d93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610def575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f6040518060a00160405280606281526020016146fd6062913990505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e84573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ea89190613e5d565b90505f868483858d610ebb600143613f71565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291505f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611003573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110279190613f8a565b90508b5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508a60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555089600390816110b89190613fea565b5060046110c58a82613fea565b508b60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fd2c80353fc15ef62c6affc7cd6b7ab5b42c43290c50be3372e55ae552cecd19c8187858e6040516111679493929190614102565b60405180910390a150505050505080156111d7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611235576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c44565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611317576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff161580801561133557505f54600160ff909116105b8061134e5750303b15801561134e57505f5460ff166001145b6113da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610d8a565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611436575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611694576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa1580156114dd573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526115229190810190614151565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d9060240160408051808303815f875af11580156115b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115d991906141c3565b915091508163ffffffff165f14611650576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055611691565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b6009545f906116db90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685612323565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611756573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061177a9190613e5d565b90505f808483858f61178d600143613f71565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af11580156118d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118f79190613f8a565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600390816119879190613fea565b5060046119948982613fea565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611a34939291906141fb565b60405180910390a15050505050508015611aa4575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611afe576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611bd5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611c24576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c44565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590611cd5575073ffffffffffffffffffffffffffffffffffffffff81163314155b15611d0c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d7a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d9e9190613f8a565b611da89190614239565b67ffffffffffffffff161115611dea576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003611e25576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611e61576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff80821691611e899184916801000000000000000090041661425a565b1115611ec1576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b8381101561215c575f878783818110611efc57611efc61426d565b9050602002810190611f0e919061429a565b611f17906142d6565b905083611f238161435c565b825180516020918201208185015160408087015160608801519151959a509295505f94611f8f948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f90815260069093529120549091508114612017576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f9081526006602052604081205561203b600188613f71565b84036120aa5742600760109054906101000a900467ffffffffffffffff1684604001516120689190614239565b67ffffffffffffffff1611156120aa576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209450505050808061215490614382565b915050611ee1565b506121d27f00000000000000000000000000000000000000000000000000000000000000008461218a6107df565b61219491906143b9565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016919061353f565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906122a3908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af11580156122bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122e39190613f8a565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f87604051602401612355969594939291906143d0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f036124a55760f9601f83516123e99190614432565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e48760405160200161248f979695949392919061444d565b60405160208183030381529060405290506125a9565b815161ffff10156124e2576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96124f1602083614432565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001612596979695949392919061452f565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015612607573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661267f576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f906126c49084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614611565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612757576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c44565b6040518060a00160405280606281526020016146fd6062913981565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff16331461283c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036128488282613fea565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c44919061395d565b60085473ffffffffffffffffffffffffffffffffffffffff1680158015906128b6575073ffffffffffffffffffffffffffffffffffffffff81163314155b156128ed576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015612956573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061297a9190613f52565b156129b1576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a1b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a3f9190613e5d565b905082811115612a7b576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388841115612ab7576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612af973ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613618565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b879190613e5d565b6007805491925067ffffffffffffffff909116905f612ba58361435c565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051612bdc92919061466c565b6040519081900390208142612bf2600143613f71565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f9081526006909352912055323303612ce8576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a26111d7565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93190612d2e90849033908b908b9061467b565b60405180910390a2505050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612d8f576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003612dca576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612e06576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612e6b575f80fd5b505af1158015612e7d573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612eeb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f0f9190613e5d565b60075460055491925042916801000000000000000090910467ffffffffffffffff1690815f5b86811015613230575f8a8a83818110612f5057612f5061426d565b9050602002810190612f62919061429a565b612f6b906142d6565b8051805160209091012060408201519192509067ffffffffffffffff161561314b5785612f978161435c565b9650505f81836020015184604001518560600151604051602001612ff99493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114613081576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f90555061321b565b8151516201d4c0101561318a576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b5050808061322890614382565b915050612f35565b5060075467ffffffffffffffff908116908416111561327b576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff84811690831614613330575f6132a08386613ea1565b90506132b667ffffffffffffffff821683613f71565b91506132ef7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661218a6107df565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b61342c337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133e39190613e5d565b6133ed91906143b9565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613618565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af11580156134c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134ec9190613f8a565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e7668860405161352a91815260200190565b60405180910390a25050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526136139084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261367c565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526136769085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613591565b50505050565b5f6136dd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166137879092919063ffffffff16565b80519091501561361357808060200190518101906136fb9190613f52565b613613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610d8a565b60606126f984845f85855f808673ffffffffffffffffffffffffffffffffffffffff1685876040516137b991906146eb565b5f6040518083038185875af1925050503d805f81146137f3576040519150601f19603f3d011682016040523d82523d5f602084013e6137f8565b606091505b509150915061380987838387613814565b979650505050505050565b606083156138a95782515f036138a25773ffffffffffffffffffffffffffffffffffffffff85163b6138a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d8a565b50816126f9565b6126f983838151156138be5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8a919061395d565b5f5b8381101561390c5781810151838201526020016138f4565b50505f910152565b5f815180845261392b8160208601602086016138f2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61396f6020830184613914565b9392505050565b67ffffffffffffffff8116811461398b575f80fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461398b575f80fd5b5f805f606084860312156139c1575f80fd5b83356139cc81613976565b92506020840135915060408401356139e38161398e565b809150509250925092565b5f602082840312156139fe575f80fd5b813561396f81613976565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613a7d57613a7d613a09565b604052919050565b5f67ffffffffffffffff821115613a9e57613a9e613a09565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112613ad9575f80fd5b8135613aec613ae782613a85565b613a36565b818152846020838601011115613b00575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f60a08688031215613b30575f80fd5b8535613b3b8161398e565b94506020860135613b4b8161398e565b9350604086013567ffffffffffffffff80821115613b67575f80fd5b613b7389838a01613aca565b94506060880135915080821115613b88575f80fd5b50613b9588828901613aca565b95989497509295608001359392505050565b5f60208284031215613bb7575f80fd5b813561396f8161398e565b63ffffffff8116811461398b575f80fd5b5f805f805f8060c08789031215613be8575f80fd5b8635613bf38161398e565b95506020870135613c038161398e565b94506040870135613c1381613bc2565b93506060870135613c238161398e565b9250608087013567ffffffffffffffff80821115613c3f575f80fd5b613c4b8a838b01613aca565b935060a0890135915080821115613c60575f80fd5b50613c6d89828a01613aca565b9150509295509295509295565b5f8083601f840112613c8a575f80fd5b50813567ffffffffffffffff811115613ca1575f80fd5b6020830191508360208260051b8501011115613cbb575f80fd5b9250929050565b5f8060208385031215613cd3575f80fd5b823567ffffffffffffffff811115613ce9575f80fd5b613cf585828601613c7a565b90969095509350505050565b5f805f8060808587031215613d14575f80fd5b8435613d1f81613bc2565b93506020850135613d2f8161398e565b92506040850135613d3f81613bc2565b9150606085013567ffffffffffffffff811115613d5a575f80fd5b613d6687828801613aca565b91505092959194509250565b5f60208284031215613d82575f80fd5b813567ffffffffffffffff811115613d98575f80fd5b6126f984828501613aca565b5f805f60408486031215613db6575f80fd5b833567ffffffffffffffff80821115613dcd575f80fd5b818601915086601f830112613de0575f80fd5b813581811115613dee575f80fd5b876020828501011115613dff575f80fd5b6020928301989097509590910135949350505050565b5f805f60408486031215613e27575f80fd5b833567ffffffffffffffff811115613e3d575f80fd5b613e4986828701613c7a565b90945092505060208401356139e38161398e565b5f60208284031215613e6d575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff828116828216039080821115613ec257613ec2613e74565b5092915050565b5f82613efc577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c90821680613f1557607f821691505b602082108103613f4c577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b5f60208284031215613f62575f80fd5b8151801515811461396f575f80fd5b81810381811115613f8457613f84613e74565b92915050565b5f60208284031215613f9a575f80fd5b815161396f81613976565b601f821115613613575f81815260208120601f850160051c81016020861015613fcb5750805b601f850160051c820191505b818110156111d757828155600101613fd7565b815167ffffffffffffffff81111561400457614004613a09565b614018816140128454613f01565b84613fa5565b602080601f83116001811461406a575f84156140345750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556111d7565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156140b657888601518255948401946001909101908401614097565b50858210156140f257878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff85168152608060208201525f6141246080830186613914565b905083604083015273ffffffffffffffffffffffffffffffffffffffff8316606083015295945050505050565b5f60208284031215614161575f80fd5b815167ffffffffffffffff811115614177575f80fd5b8201601f81018413614187575f80fd5b8051614195613ae782613a85565b8181528560208385010111156141a9575f80fd5b6141ba8260208301602086016138f2565b95945050505050565b5f80604083850312156141d4575f80fd5b82516141df81613bc2565b60208401519092506141f08161398e565b809150509250929050565b606081525f61420d6060830186613914565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff818116838216019080821115613ec257613ec2613e74565b80820180821115613f8457613f84613e74565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126142cc575f80fd5b9190910192915050565b5f608082360312156142e6575f80fd5b6040516080810167ffffffffffffffff828210818311171561430a5761430a613a09565b81604052843591508082111561431e575f80fd5b5061432b36828601613aca565b82525060208301356020820152604083013561434681613976565b6040820152606092830135928101929092525090565b5f67ffffffffffffffff80831681810361437857614378613e74565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143b2576143b2613e74565b5060010190565b8082028115828204841417613f8457613f84613e74565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261442660c0830184613914565b98975050505050505050565b61ffff818116838216019080821115613ec257613ec2613e74565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b16600184015287516144b5816003860160208c016138f2565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516144f8816017840160208b016138f2565b808201915050818660f81b1660178201528451915061451e8260188301602088016138f2565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614597816003860160208c016138f2565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516145da816017840160208b016138f2565b808201915050818660f01b166017820152845191506146008260198301602088016138f2565b016019019998505050505050505050565b5f8651614622818460208b016138f2565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f82516142cc8184602087016138f256fedf2a8080944d5cf5032b2a844602278b01199ed191a86c93ff8080821092808000000000000000000000000000000000000000000000000000000005ca1ab1e000000000000000000000000000000000000000000000000000000005ca1ab1e01bffa2646970667358221220922931e5d0570d6de206da26a8cb6cc8865aa3a1e27df595ba4f321c371781f664736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/compiled-contracts/PolygonZkEVMGlobalExitRootV2.json b/compiled-contracts/PolygonZkEVMGlobalExitRootV2.json index 966061935..9edc24b29 100644 --- a/compiled-contracts/PolygonZkEVMGlobalExitRootV2.json +++ b/compiled-contracts/PolygonZkEVMGlobalExitRootV2.json @@ -19,6 +19,11 @@ "stateMutability": "nonpayable", "type": "constructor" }, + { + "inputs": [], + "name": "MerkleTreeFull", + "type": "error" + }, { "inputs": [], "name": "OnlyAllowedContracts", @@ -40,7 +45,7 @@ "type": "bytes32" } ], - "name": "UpdateGlobalExitRoot", + "name": "UpdateL1InfoTree", "type": "event" }, { @@ -56,6 +61,48 @@ "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", @@ -69,6 +116,48 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "newGlobalExitRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "lastBlockHash", + "type": "uint256" + }, + { + "internalType": "uint64", + "name": "timestamp", + "type": "uint64" + } + ], + "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": [ { @@ -139,10 +228,44 @@ "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": "0x60c060405234801561000f575f80fd5b506040516103e13803806103e183398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a0516103226100bf5f395f818160e301526101b601525f818161012f015261016d01526103225ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c806333d6247d1161005857806333d6247d146100c15780633ed691ef146100d657806349b7b802146100de578063a3c573eb1461012a575f80fd5b806301fd90441461007e578063257b363214610099578063319cf735146100b8575b5f80fd5b6100865f5481565b6040519081526020015b60405180910390f35b6100866100a73660046102d5565b60026020525f908152604090205481565b61008660015481565b6100d46100cf3660046102d5565b610151565b005b61008661029b565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610090565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361019f575060018290558161021a565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101e8575f83905582915061021a565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f8181526002602052604081205491925003610295575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6102d06001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f602082840312156102e5575f80fd5b503591905056fea2646970667358221220a6860101da9fdfdd9dccc38f11bb64c2a59c78d3dbf1187f9fc9e656fe3043c964736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061007a575f3560e01c806333d6247d1161005857806333d6247d146100c15780633ed691ef146100d657806349b7b802146100de578063a3c573eb1461012a575f80fd5b806301fd90441461007e578063257b363214610099578063319cf735146100b8575b5f80fd5b6100865f5481565b6040519081526020015b60405180910390f35b6100866100a73660046102d5565b60026020525f908152604090205481565b61008660015481565b6100d46100cf3660046102d5565b610151565b005b61008661029b565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610090565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361019f575060018290558161021a565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101e8575f83905582915061021a565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f8181526002602052604081205491925003610295575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6102d06001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f602082840312156102e5575f80fd5b503591905056fea2646970667358221220a6860101da9fdfdd9dccc38f11bb64c2a59c78d3dbf1187f9fc9e656fe3043c964736f6c63430008140033", + "bytecode": "0x60c060405234801561000f575f80fd5b50604051610b03380380610b0383398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a051610a436100c05f395f818161014101526102ba01525f8181610210015261026e0152610a435ff3fe608060405234801561000f575f80fd5b50600436106100cf575f3560e01c806349b7b8021161007d57806383f244031161005857806383f24403146101f8578063a3c573eb1461020b578063fb57083414610232575f80fd5b806349b7b8021461013c5780635ca1e165146101885780635d81050114610190575f80fd5b8063319cf735116100ad578063319cf7351461011657806333d6247d1461011f5780633ed691ef14610134575f80fd5b806301fd9044146100d3578063257b3632146100ee5780632dfdf0b51461010d575b5f80fd5b6100db5f5481565b6040519081526020015b60405180910390f35b6100db6100fc366004610709565b60026020525f908152604090205481565b6100db60235481565b6100db60015481565b61013261012d366004610709565b610255565b005b6100db6103f6565b6101637f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e5565b6100db610409565b6100db61019e366004610720565b604080516020808201959095528082019390935260c09190911b7fffffffffffffffff0000000000000000000000000000000000000000000000001660608301528051604881840301815260689092019052805191012090565b6100db61020636600461078b565b610412565b6101637f000000000000000000000000000000000000000000000000000000000000000081565b6102456102403660046107c7565b6104e7565b60405190151581526020016100e5565b5f8073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102a357505060018190555f5481610322565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102f05750505f8190556001548190610322565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61032d82846104fe565b5f81815260026020526040812054919250036103f0575f61034f600143610839565b5f8381526002602090815260409182902092409283905581518082018690528083018490527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b16606082015282518082036048018152606890910190925281519101209091506103c29061052d565b604051849084907fda61aa7823fcd807e37b95aabcbe17f03a6f3efd514176444dae191d27fd66b3905f90a3505b50505050565b5f6104046001545f546104fe565b905090565b5f61040461062d565b5f83815b60208110156104de57600163ffffffff8516821c81169003610481578481602081106104445761044461084c565b602002013582604051602001610464929190918252602082015260400190565b6040516020818303038152906040528051906020012091506104cc565b818582602081106104945761049461084c565b60200201356040516020016104b3929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806104d681610879565b915050610416565b50949350505050565b5f816104f4868686610412565b1495945050505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b80600161053c602060026109ce565b6105469190610839565b60235410610580576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60235f815461058f90610879565b918290555090505f5b602081101561061f578082901c6001166001036105cb5782600382602081106105c3576105c361084c565b015550505050565b600381602081106105de576105de61084c565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061061790610879565b915050610598565b506106286109e0565b505050565b6023545f90819081805b6020811015610700578083901c60011660010361069457600381602081106106615761066161084c565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506106c1565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806106f890610879565b915050610637565b50919392505050565b5f60208284031215610719575f80fd5b5035919050565b5f805f60608486031215610732575f80fd5b8335925060208401359150604084013567ffffffffffffffff81168114610757575f80fd5b809150509250925092565b806104008101831015610527575f80fd5b803563ffffffff81168114610786575f80fd5b919050565b5f805f610440848603121561079e575f80fd5b833592506107af8560208601610762565b91506107be6104208501610773565b90509250925092565b5f805f8061046085870312156107db575f80fd5b843593506107ec8660208701610762565b92506107fb6104208601610773565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156105275761052761080c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036108a9576108a961080c565b5060010190565b600181815b8085111561090957817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156108ef576108ef61080c565b808516156108fc57918102915b93841c93908002906108b5565b509250929050565b5f8261091f57506001610527565b8161092b57505f610527565b8160018114610941576002811461094b57610967565b6001915050610527565b60ff84111561095c5761095c61080c565b50506001821b610527565b5060208310610133831016604e8410600b841016171561098a575081810a610527565b61099483836108b0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109c6576109c661080c565b029392505050565b5f6109d98383610911565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea2646970667358221220a1a389f08a07b9fd272cd0baaf253440b508b79131978be4696b2c15b2091f3364736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106100cf575f3560e01c806349b7b8021161007d57806383f244031161005857806383f24403146101f8578063a3c573eb1461020b578063fb57083414610232575f80fd5b806349b7b8021461013c5780635ca1e165146101885780635d81050114610190575f80fd5b8063319cf735116100ad578063319cf7351461011657806333d6247d1461011f5780633ed691ef14610134575f80fd5b806301fd9044146100d3578063257b3632146100ee5780632dfdf0b51461010d575b5f80fd5b6100db5f5481565b6040519081526020015b60405180910390f35b6100db6100fc366004610709565b60026020525f908152604090205481565b6100db60235481565b6100db60015481565b61013261012d366004610709565b610255565b005b6100db6103f6565b6101637f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e5565b6100db610409565b6100db61019e366004610720565b604080516020808201959095528082019390935260c09190911b7fffffffffffffffff0000000000000000000000000000000000000000000000001660608301528051604881840301815260689092019052805191012090565b6100db61020636600461078b565b610412565b6101637f000000000000000000000000000000000000000000000000000000000000000081565b6102456102403660046107c7565b6104e7565b60405190151581526020016100e5565b5f8073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102a357505060018190555f5481610322565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102f05750505f8190556001548190610322565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61032d82846104fe565b5f81815260026020526040812054919250036103f0575f61034f600143610839565b5f8381526002602090815260409182902092409283905581518082018690528083018490527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b16606082015282518082036048018152606890910190925281519101209091506103c29061052d565b604051849084907fda61aa7823fcd807e37b95aabcbe17f03a6f3efd514176444dae191d27fd66b3905f90a3505b50505050565b5f6104046001545f546104fe565b905090565b5f61040461062d565b5f83815b60208110156104de57600163ffffffff8516821c81169003610481578481602081106104445761044461084c565b602002013582604051602001610464929190918252602082015260400190565b6040516020818303038152906040528051906020012091506104cc565b818582602081106104945761049461084c565b60200201356040516020016104b3929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806104d681610879565b915050610416565b50949350505050565b5f816104f4868686610412565b1495945050505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b80600161053c602060026109ce565b6105469190610839565b60235410610580576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60235f815461058f90610879565b918290555090505f5b602081101561061f578082901c6001166001036105cb5782600382602081106105c3576105c361084c565b015550505050565b600381602081106105de576105de61084c565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061061790610879565b915050610598565b506106286109e0565b505050565b6023545f90819081805b6020811015610700578083901c60011660010361069457600381602081106106615761066161084c565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506106c1565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806106f890610879565b915050610637565b50919392505050565b5f60208284031215610719575f80fd5b5035919050565b5f805f60608486031215610732575f80fd5b8335925060208401359150604084013567ffffffffffffffff81168114610757575f80fd5b809150509250925092565b806104008101831015610527575f80fd5b803563ffffffff81168114610786575f80fd5b919050565b5f805f610440848603121561079e575f80fd5b833592506107af8560208601610762565b91506107be6104208501610773565b90509250925092565b5f805f8061046085870312156107db575f80fd5b843593506107ec8660208701610762565b92506107fb6104208601610773565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156105275761052761080c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036108a9576108a961080c565b5060010190565b600181815b8085111561090957817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156108ef576108ef61080c565b808516156108fc57918102915b93841c93908002906108b5565b509250929050565b5f8261091f57506001610527565b8161092b57505f610527565b8160018114610941576002811461094b57610967565b6001915050610527565b60ff84111561095c5761095c61080c565b50506001821b610527565b5060208310610133831016604e8410600b841016171561098a575081810a610527565b61099483836108b0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109c6576109c661080c565b029392505050565b5f6109d98383610911565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea2646970667358221220a1a389f08a07b9fd272cd0baaf253440b508b79131978be4696b2c15b2091f3364736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMMock.json b/compiled-contracts/PolygonZkEVMMock.json index e122b9b6b..e64320ada 100644 --- a/compiled-contracts/PolygonZkEVMMock.json +++ b/compiled-contracts/PolygonZkEVMMock.json @@ -1935,8 +1935,8 @@ "type": "function" } ], - "bytecode": "0x61014060405234801562000011575f80fd5b5060405162006f2038038062006f208339810160408190526200003491620000a2565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b039182166101005216610120526200012a565b6001600160a01b038116811462000083575f80fd5b50565b80516001600160401b03811681146200009d575f80fd5b919050565b5f805f805f8060c08789031215620000b8575f80fd5b8651620000c5816200006e565b6020880151909650620000d8816200006e565b6040880151909550620000eb816200006e565b6060880151909450620000fe816200006e565b92506200010e6080880162000086565b91506200011e60a0880162000086565b90509295509295509295565b60805160a05160c05160e0516101005161012051616d29620001f75f395f818161081501528181611a560152613e5601525f81816109a70152611a2c01525f818161096d015281816129e3015281816144e701526159e601525f8181610b380152818161170c01528181611bc801528181611d93015281816125f001528181612db101528181614757015261554301525f8181610bf801528181614eac01526152fa01525f8181610a75015281816129b1015281816132d90152818161472c0152614f980152616d295ff3fe608060405234801561000f575f80fd5b5060043610610475575f3560e01c80638c3d73011161025d578063c754c7ed11610148578063e7a7ed02116100c3578063f14916d611610093578063f851a44011610079578063f851a44014610c80578063f8b823e414610ca0578063fe16564f14610ca9575f80fd5b8063f14916d614610c5a578063f2fde38b14610c6d575f80fd5b8063e7a7ed0214610bc3578063e8bf92ed14610bf3578063eaeb077b14610c1a578063ed6b010414610c2d575f80fd5b8063d2e129f911610118578063d939b315116100fe578063d939b31514610b80578063dbc1697614610ba8578063e0d1744114610bb0575f80fd5b8063d2e129f914610b5a578063d8d1091b14610b6d575f80fd5b8063c754c7ed14610ac5578063c89e42df14610af1578063cfa8ed4714610b04578063d02103ca14610b33575f80fd5b8063ada8f919116101d8578063b4f77ea9116101a8578063ba58ae391161018e578063ba58ae3914610a97578063c0cad30214610aaa578063c0ed84e014610abd575f80fd5b8063b4f77ea914610a5d578063b6b0b09714610a70575f80fd5b8063ada8f9191461098f578063adc879e9146109a2578063afd23cbe146109c9578063b4d63f58146109f7575f80fd5b80639aa972a31161022d5780639c9f3dfe116102135780639c9f3dfe14610942578063a066215c14610955578063a3c573eb14610968575f80fd5b80639aa972a31461091c5780639b7967601461092f575f80fd5b80638c3d7301146108db5780638da5cb5b146108e357806396dc3d391461090157806399f5634e14610914575f80fd5b80634a1a89a71161037d578063621dd411116102f85780637215541a116102c8578063831c7ead116102ae578063831c7ead14610810578063837a473814610837578063841b24d7146108ab575f80fd5b80637215541a146107e95780637fcb3653146107fc575f80fd5b8063621dd4111461079c5780636b8616ce146107af5780636ff512cc146107ce578063715018a6146107e1575f80fd5b8063542028d51161034d5780635e9145c9116103335780635e9145c9146107795780635ec919581461078c5780636046916914610794575f80fd5b8063542028d5146106d0578063574f649e146106d8575f80fd5b80634a1a89a71461066b5780634a910e6a1461068b5780634e4877061461069e5780635392c5e0146106b1575f80fd5b8063267822471161040d578063383b3be8116103dd578063423fa856116103c3578063423fa8561461060f578063456052671461062f578063458c047714610657575f80fd5b8063383b3be8146105e9578063394218e9146105fc575f80fd5b8063267822471461055257806329878983146105975780632b0006fa146105c35780632c1f816a146105d6575f80fd5b806315064c961161044857806315064c96146104fb5780631816b7e51461051857806319d8ac611461052b578063220d78991461053f575f80fd5b80630a0d9fbe146104795780630eaa86ea146104b0578063107bf28c146104d157806310a01a72146104e6575b5f80fd5b606f5461049290610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6104c36104be366004615fac565b610cbc565b6040519081526020016104a7565b6104d961118c565b6040516104a79190616068565b6104f96104f4366004616097565b611218565b005b606f546105089060ff1681565b60405190151581526020016104a7565b6104f9610526366004616124565b6117c6565b6073546104929067ffffffffffffffff1681565b6104d961054d366004616145565b6118de565b607b546105729073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104a7565b6074546105729068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104f96105d136600461619f565b611ab4565b6104f96105e4366004616203565b611c7e565b6105086105f7366004616278565b611e86565b6104f961060a366004616278565b611edb565b6073546104929068010000000000000000900467ffffffffffffffff1681565b60735461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546104929067ffffffffffffffff1681565b6079546104929068010000000000000000900467ffffffffffffffff1681565b6104f9610699366004616278565b61205f565b6104f96106ac366004616278565b612112565b6104c36106bf366004616278565b60756020525f908152604090205481565b6104d9612296565b6104c36106e6366004616388565b835160209485012060408051808701979097528681019190915260608087019490945260c09290921b7fffffffffffffffff00000000000000000000000000000000000000000000000016608086015290911b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888401528051808403607c018152609c9093019052815191012090565b6104f961078736600461643d565b6122a3565b6104f9612a9c565b6104c3612b9b565b6104f96107aa36600461619f565b612bb0565b6104c36107bd366004616278565b60716020525f908152604090205481565b6104f96107dc36600461648d565b612f2e565b6104f9613003565b6104f96107f7366004616278565b613016565b6074546104929067ffffffffffffffff1681565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b61087f6108453660046164a6565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016104a7565b607954610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9613183565b60335473ffffffffffffffffffffffffffffffffffffffff16610572565b6104f961090f366004616278565b61324f565b6104c3613292565b6104f961092a366004616203565b6133e5565b6104f961093d366004616278565b613495565b6104f9610950366004616278565b6134e4565b6104f9610963366004616278565b613660565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f961099d36600461648d565b613766565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b606f546109e4906901000000000000000000900461ffff1681565b60405161ffff90911681526020016104a7565b610a37610a05366004616278565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016104a7565b6104f9610a6b366004616278565b61382a565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b610508610aa53660046164a6565b61383b565b6104f9610ab83660046164bd565b6138c3565b6104926138db565b607b546104929074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9610aff3660046164bd565b61392e565b606f54610572906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610b6836600461652d565b6139bb565b6104f9610b7b3660046165d8565b613ef9565b60795461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6104f9614494565b6104f9610bbe366004616617565b614568565b607354610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610c28366004616661565b6145f7565b607b54610508907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b6104f9610c6836600461648d565b6149e7565b6104f9610c7b36600461648d565b614ab9565b607a546105729073ffffffffffffffffffffffffffffffffffffffff1681565b6104c360705481565b6104f9610cb73660046166a9565b614b6d565b5f805f610cc76138db565b905067ffffffffffffffff881615610e935760795467ffffffffffffffff9081169089161115610da4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a4015b60405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614610e8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610d9b565b5061102b565b67ffffffffffffffff87165f90815260756020526040902054915081610f61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610d9b565b8067ffffffffffffffff168767ffffffffffffffff16111561102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610d9b565b8067ffffffffffffffff168667ffffffffffffffff16116110f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610d9b565b5f61110288888886896118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161113691906166d3565b602060405180830381855afa158015611151573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061117491906166ee565b61117e9190616732565b9a9950505050505050505050565b6077805461119990616745565b80601f01602080910402602001604051908101604052809291908181526020018280546111c590616745565b80156112105780601f106111e757610100808354040283529160200191611210565b820191905f5260205f20905b8154815290600101906020018083116111f357829003601f168201915b505050505081565b611220614b8f565b5f8061122a6138db565b905067ffffffffffffffff8a16156113f15760795467ffffffffffffffff908116908b161115611302576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a401610d9b565b67ffffffffffffffff808b165f9081526078602052604090206002810154815490945090918b81166801000000000000000090920416146113eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610d9b565b50611589565b67ffffffffffffffff89165f908152607560205260409020549150816114bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610d9b565b8067ffffffffffffffff168967ffffffffffffffff161115611589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610d9b565b8067ffffffffffffffff168867ffffffffffffffff1611611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610d9b565b5f6116608a8a8a868b6118de565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8c81169182179092555f90815260756020526040902089905560795491925016156116dd57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018990527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611762575f80fd5b505af1158015611774573d5f803e3d5ffd5b505060405189815233925067ffffffffffffffff8c1691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe9060200160405180910390a35050505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611817576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff16108061183057506103ff8161ffff16115b15611867576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590611911575081155b15611948576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8061197f576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119888461383b565b6119be576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611b11576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b1f868686868686614c10565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611b9957607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611c1e575f80fd5b505af1158015611c30573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611cdb576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cea87878787878787614fcb565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611d6457607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611de9575f80fd5b505af1158015611dfb573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611ec992700100000000000000000000000000000000909204811691166167c3565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611f2c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611f73576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16611fe25760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611fe2576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1906020016118d3565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461210657606f5460ff16156120c7576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120d081611e86565b612106576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61210f816153fa565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612163576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156121aa576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661221557607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610612215576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020016118d3565b6076805461119990616745565b606f5460ff16156122e0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314612340576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361237b576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156123b7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f81815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b868110156127ff575f8a8a8381811061241d5761241d6167eb565b905060200281019061242f9190616818565b6124389061684a565b8051805160209091012060608201519192509067ffffffffffffffff16156125ad5785612464816168d4565b9650505f81836020015184606001516040516020016124bb93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260719093529120549091508114612543576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088165f9081526071602052604080822091909155606085015190850151908216911610156125a7576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506126e7565b602082015115801590612671575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af115801561264b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061266f91906166ee565b155b156126a8576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156126e7576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff16108061271a575042826040015167ffffffffffffffff16115b15612751576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519750505080806127f7906168fa565b915050612402565b5061280a86856167c3565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115612873576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61287e8285616931565b6128929067ffffffffffffffff1688616952565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c841691161793029290921790559091508281169085161461298757607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6129d933308360705461299a9190616965565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190615607565b6129e16156e9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612a46575f80fd5b505af1158015612a58573d5f803e3d5ffd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612aed576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16612b49576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f6070546064612bab9190616965565b905090565b606f5460ff1615612bed576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f908152607260205260409020600101544292612c39927801000000000000000000000000000000000000000000000000909104811691166167c3565b67ffffffffffffffff161115612c7b576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612c888686616931565b67ffffffffffffffff161115612cca576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cd8868686868686614c10565b612ce184615794565b607954700100000000000000000000000000000000900467ffffffffffffffff165f03612e2257607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615612d8257607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612e07575f80fd5b505af1158015612e19573d5f803e3d5ffd5b50505050612ef0565b612e2a6156e9565b6079805467ffffffffffffffff16905f612e43836168d4565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001611c6e565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612f7f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016118d3565b61300b614b8f565b6130145f61596e565b565b60335473ffffffffffffffffffffffffffffffffffffffff16331461317b575f61303e6138db565b90508067ffffffffffffffff168267ffffffffffffffff161161308d576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000909104811690831611806130d2575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15613109576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916131379162093a8091166167c3565b67ffffffffffffffff161115613179576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61210f6159e4565b607b5473ffffffffffffffffffffffffffffffffffffffff1633146131d4576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b613257614b8f565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561331e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061334291906166ee565b90505f61334d6138db565b60735467ffffffffffffffff6801000000000000000082048116916133a59170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416616931565b6133af91906167c3565b6133b99190616931565b67ffffffffffffffff169050805f036133d4575f9250505090565b6133de818361697c565b9250505090565b606f5460ff1615613422576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61343187878787878787614fcb565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a161348c6159e4565b50505050505050565b61349d614b8f565b6073805467ffffffffffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613535576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561357c576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166135e35760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106135e3576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75906020016118d3565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146136b1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156136f8576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28906020016118d3565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146137b7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016118d3565b613832614b8f565b61210f81615794565b5f67ffffffff0000000167ffffffffffffffff8316108015613872575067ffffffff00000001604083901c67ffffffffffffffff16105b8015613893575067ffffffff00000001608083901c67ffffffffffffffff16105b80156138aa575067ffffffff0000000160c083901c105b156138b757506001919050565b505f919050565b919050565b6138cb614b8f565b60776138d782826169dc565b5050565b6079545f9067ffffffffffffffff161561391d575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461397f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607661398b82826169dc565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516118d39190616068565b5f54610100900460ff16158080156139d957505f54600160ff909116105b806139f25750303b1580156139f257505f5460ff166001145b613a7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610d9b565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015613ada575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b613ae7602088018861648d565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055613b3c604088016020890161648d565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055613ba1608088016060890161648d565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076613c2b86826169dc565b506077613c3885826169dc565b5062093a80613c4d6060890160408a01616278565b67ffffffffffffffff161115613c8f576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613c9f6060880160408901616278565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80613d0160a0890160808a01616278565b67ffffffffffffffff161115613d43576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d5360a0880160808901616278565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613e32615a67565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f00000000000000000000000000000000000000000000000000000000000000008585604051613e879493929190616b3b565b60405180910390a1801561348c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613f56576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615613f93576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613fce576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561400a576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff78010000000000000000000000000000000000000000000000008204811691614055918491700100000000000000000000000000000000900416616b72565b111561408d576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b84811015614332575f8787838181106140eb576140eb6167eb565b90506020028101906140fd9190616b85565b61410690616bb7565b905083614112816168d4565b825180516020918201208185015160408087015190519499509194505f936141739386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146141fb576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f9081526071602052604081205561421f600189616952565b840361428e5742607b60149054906101000a900467ffffffffffffffff16846040015161424c91906167c3565b67ffffffffffffffff16111561428e576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450505050808061432a906168fa565b9150506140d0565b5061433d84846167c3565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146144e5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561454a575f80fd5b505af115801561455c573d5f803e3d5ffd5b50505050613014615b06565b614570614b8f565b6040805160608101825293845267ffffffffffffffff92831660208086019182529284168583019081529584165f908152607290935291209251835551600190920180549351821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169290911691909117919091179055565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615614654576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614691576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61469a612b9b565b9050818111156146d6576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115614712576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61475473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084615607565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156147be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147e291906166ee565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff1690601861481c836168d4565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051614853929190616c30565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303614981576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26149e0565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931823388886040516149d79493929190616c3f565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314614a38576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca906020016118d3565b614ac1614b8f565b73ffffffffffffffffffffffffffffffffffffffff8116614b64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610d9b565b61210f8161596e565b614b75614b8f565b67ffffffffffffffff165f90815260756020526040902055565b60335473ffffffffffffffffffffffffffffffffffffffff163314613014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d9b565b5f80614c1a6138db565b905067ffffffffffffffff881615614ce95760795467ffffffffffffffff9081169089161115614c76576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614614ce3576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614d89565b67ffffffffffffffff87165f90815260756020526040902054915081614d3b576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115614d89576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611614dd6576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f614de488888886896118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051614e1891906166d3565b602060405180830381855afa158015614e33573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614e5691906166ee565b614e609190616732565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91614ee291899190600401616c74565b602060405180830381865afa158015614efd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614f219190616cae565b614f57576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614fbf33614f65858b616931565b67ffffffffffffffff16614f77613292565b614f819190616965565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190615b94565b50505050505050505050565b5f67ffffffffffffffff8816156150975760795467ffffffffffffffff9081169089161115615026576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614615091576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50615132565b5067ffffffffffffffff85165f90815260756020526040902054806150e8576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff9081169087161115615132576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff908116908816118061516457508767ffffffffffffffff168767ffffffffffffffff1611155b8061518b575060795467ffffffffffffffff68010000000000000000909104811690881611155b156151c2576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f90815260786020526040902054680100000000000000009004811690861614615224576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61523287878785886118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161526691906166d3565b602060405180830381855afa158015615281573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906152a491906166ee565b6152ae9190616732565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161533091889190600401616c74565b602060405180830381865afa15801561534b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061536f9190616cae565b6153a5576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614fbf576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff680100000000000000009091048116908216111580615434575060795467ffffffffffffffff908116908216115b1561546b576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015615599575f80fd5b505af11580156155ab573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e84600201546040516155fa91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526156e39085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152615bef565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115613014576079545f906157319068010000000000000000900467ffffffffffffffff1660016167c3565b905061573c81611e86565b1561210f576079545f9060029061575e90849067ffffffffffffffff16616931565b6157689190616ccd565b61577290836167c3565b905061577d81611e86565b1561578b576138d7816153fa565b6138d7826153fa565b5f61579d6138db565b9050815f806157ac8484616931565b606f5467ffffffffffffffff91821692505f916157cf9161010090041642616952565b90505b8467ffffffffffffffff168467ffffffffffffffff16146158595767ffffffffffffffff8085165f908152607260205260409020600181015490911682101561583757600181015468010000000000000000900467ffffffffffffffff169450615853565b6158418686616931565b67ffffffffffffffff16935050615859565b506157d2565b5f6158648484616952565b9050838110156158bb57808403600c811161587f5780615882565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a60705402816158b1576158b1616705565b046070555061592a565b838103600c81116158cc57806158cf565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a7640000028161590557615905616705565b04905080607054670de0b6b3a7640000028161592357615923616705565b0460705550505b683635c9adc5dea00000607054111561594f57683635c9adc5dea0000060705561348c565b633b9aca00607054101561348c57633b9aca0060705550505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015615a49575f80fd5b505af1158015615a5b573d5f803e3d5ffd5b50505050613014615cfa565b5f54610100900460ff16615afd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610d9b565b6130143361596e565b606f5460ff16615b42576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052615bea9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401615661565b505050565b5f615c50826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615d8c9092919063ffffffff16565b805190915015615bea5780806020019051810190615c6e9190616cae565b615bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610d9b565b606f5460ff1615615d37576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b6060615d9a84845f85615da2565b949350505050565b606082471015615e34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610d9b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051615e5c91906166d3565b5f6040518083038185875af1925050503d805f8114615e96576040519150601f19603f3d011682016040523d82523d5f602084013e615e9b565b606091505b5091509150615eac87838387615eb7565b979650505050505050565b60608315615f4c5782515f03615f455773ffffffffffffffffffffffffffffffffffffffff85163b615f45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d9b565b5081615d9a565b615d9a8383815115615f615781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9b9190616068565b803567ffffffffffffffff811681146138be575f80fd5b5f805f805f60a08688031215615fc0575f80fd5b615fc986615f95565b9450615fd760208701615f95565b9350615fe560408701615f95565b94979396509394606081013594506080013592915050565b5f5b83811015616017578181015183820152602001615fff565b50505f910152565b5f8151808452616036816020860160208601615ffd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61607a602083018461601f565b9392505050565b8060408101831015616091575f80fd5b92915050565b5f805f805f805f806101a0898b0312156160af575f80fd5b6160b889615f95565b97506160c660208a01615f95565b96506160d460408a01615f95565b955060608901359450608089013593506160f18a60a08b01616081565b925061016089018a811115616104575f80fd5b60e08a0192506161148b82616081565b9150509295985092959890939650565b5f60208284031215616134575f80fd5b813561ffff8116811461607a575f80fd5b5f805f805f60a08688031215616159575f80fd5b61616286615f95565b945061617060208701615f95565b94979496505050506040830135926060810135926080909101359150565b806103008101831015616091575f80fd5b5f805f805f806103a087890312156161b5575f80fd5b6161be87615f95565b95506161cc60208801615f95565b94506161da60408801615f95565b935060608701359250608087013591506161f78860a0890161618e565b90509295509295509295565b5f805f805f805f6103c0888a03121561621a575f80fd5b61622388615f95565b965061623160208901615f95565b955061623f60408901615f95565b945061624d60608901615f95565b93506080880135925060a0880135915061626a8960c08a0161618e565b905092959891949750929550565b5f60208284031215616288575f80fd5b61607a82615f95565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126162cd575f80fd5b813567ffffffffffffffff808211156162e8576162e8616291565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561632e5761632e616291565b81604052838152866020858801011115616346575f80fd5b836020870160208301375f602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146138be575f80fd5b5f805f805f60a0868803121561639c575f80fd5b85359450602086013567ffffffffffffffff8111156163b9575f80fd5b6163c5888289016162be565b945050604086013592506163db60608701615f95565b91506163e960808701616365565b90509295509295909350565b5f8083601f840112616405575f80fd5b50813567ffffffffffffffff81111561641c575f80fd5b6020830191508360208260051b8501011115616436575f80fd5b9250929050565b5f805f6040848603121561644f575f80fd5b833567ffffffffffffffff811115616465575f80fd5b616471868287016163f5565b9094509250616484905060208501616365565b90509250925092565b5f6020828403121561649d575f80fd5b61607a82616365565b5f602082840312156164b6575f80fd5b5035919050565b5f602082840312156164cd575f80fd5b813567ffffffffffffffff8111156164e3575f80fd5b615d9a848285016162be565b5f8083601f8401126164ff575f80fd5b50813567ffffffffffffffff811115616516575f80fd5b602083019150836020828501011115616436575f80fd5b5f805f805f80868803610120811215616544575f80fd5b60a0811215616551575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff80821115616576575f80fd5b6165828a838b016162be565b955060e0890135915080821115616597575f80fd5b6165a38a838b016162be565b94506101008901359150808211156165b9575f80fd5b506165c689828a016164ef565b979a9699509497509295939492505050565b5f80602083850312156165e9575f80fd5b823567ffffffffffffffff8111156165ff575f80fd5b61660b858286016163f5565b90969095509350505050565b5f805f806080858703121561662a575f80fd5b61663385615f95565b93506020850135925061664860408601615f95565b915061665660608601615f95565b905092959194509250565b5f805f60408486031215616673575f80fd5b833567ffffffffffffffff811115616689575f80fd5b616695868287016164ef565b909790965060209590950135949350505050565b5f80604083850312156166ba575f80fd5b823591506166ca60208401615f95565b90509250929050565b5f82516166e4818460208701615ffd565b9190910192915050565b5f602082840312156166fe575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f8261674057616740616705565b500690565b600181811c9082168061675957607f821691505b602082108103616790577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156167e4576167e4616796565b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126166e4575f80fd5b5f6080823603121561685a575f80fd5b6040516080810167ffffffffffffffff828210818311171561687e5761687e616291565b816040528435915080821115616892575f80fd5b5061689f368286016162be565b825250602083013560208201526168b860408401615f95565b60408201526168c960608401615f95565b606082015292915050565b5f67ffffffffffffffff8083168181036168f0576168f0616796565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361692a5761692a616796565b5060010190565b67ffffffffffffffff8281168282160390808211156167e4576167e4616796565b8181038181111561609157616091616796565b808202811582820484141761609157616091616796565b5f8261698a5761698a616705565b500490565b601f821115615bea575f81815260208120601f850160051c810160208610156169b55750805b601f850160051c820191505b818110156169d4578281556001016169c1565b505050505050565b815167ffffffffffffffff8111156169f6576169f6616291565b616a0a81616a048454616745565b8461698f565b602080601f831160018114616a5c575f8415616a265750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556169d4565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015616aa857888601518255948401946001909101908401616a89565b5085821015616ae457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152616b68606083018486616af4565b9695505050505050565b8082018082111561609157616091616796565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126166e4575f80fd5b5f60608236031215616bc7575f80fd5b6040516060810167ffffffffffffffff8282108183111715616beb57616beb616291565b816040528435915080821115616bff575f80fd5b50616c0c368286016162be565b82525060208301356020820152616c2560408401615f95565b604082015292915050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f616b68606083018486616af4565b6103208101610300808584378201835f5b6001811015616ca4578151835260209283019290910190600101616c85565b5050509392505050565b5f60208284031215616cbe575f80fd5b8151801515811461607a575f80fd5b5f67ffffffffffffffff80841680616ce757616ce7616705565b9216919091049291505056fea26469706673582212203d78dd0bda59d6322d20458734dd51eab51ad00e93348cf59380a0e5731cf93a64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610475575f3560e01c80638c3d73011161025d578063c754c7ed11610148578063e7a7ed02116100c3578063f14916d611610093578063f851a44011610079578063f851a44014610c80578063f8b823e414610ca0578063fe16564f14610ca9575f80fd5b8063f14916d614610c5a578063f2fde38b14610c6d575f80fd5b8063e7a7ed0214610bc3578063e8bf92ed14610bf3578063eaeb077b14610c1a578063ed6b010414610c2d575f80fd5b8063d2e129f911610118578063d939b315116100fe578063d939b31514610b80578063dbc1697614610ba8578063e0d1744114610bb0575f80fd5b8063d2e129f914610b5a578063d8d1091b14610b6d575f80fd5b8063c754c7ed14610ac5578063c89e42df14610af1578063cfa8ed4714610b04578063d02103ca14610b33575f80fd5b8063ada8f919116101d8578063b4f77ea9116101a8578063ba58ae391161018e578063ba58ae3914610a97578063c0cad30214610aaa578063c0ed84e014610abd575f80fd5b8063b4f77ea914610a5d578063b6b0b09714610a70575f80fd5b8063ada8f9191461098f578063adc879e9146109a2578063afd23cbe146109c9578063b4d63f58146109f7575f80fd5b80639aa972a31161022d5780639c9f3dfe116102135780639c9f3dfe14610942578063a066215c14610955578063a3c573eb14610968575f80fd5b80639aa972a31461091c5780639b7967601461092f575f80fd5b80638c3d7301146108db5780638da5cb5b146108e357806396dc3d391461090157806399f5634e14610914575f80fd5b80634a1a89a71161037d578063621dd411116102f85780637215541a116102c8578063831c7ead116102ae578063831c7ead14610810578063837a473814610837578063841b24d7146108ab575f80fd5b80637215541a146107e95780637fcb3653146107fc575f80fd5b8063621dd4111461079c5780636b8616ce146107af5780636ff512cc146107ce578063715018a6146107e1575f80fd5b8063542028d51161034d5780635e9145c9116103335780635e9145c9146107795780635ec919581461078c5780636046916914610794575f80fd5b8063542028d5146106d0578063574f649e146106d8575f80fd5b80634a1a89a71461066b5780634a910e6a1461068b5780634e4877061461069e5780635392c5e0146106b1575f80fd5b8063267822471161040d578063383b3be8116103dd578063423fa856116103c3578063423fa8561461060f578063456052671461062f578063458c047714610657575f80fd5b8063383b3be8146105e9578063394218e9146105fc575f80fd5b8063267822471461055257806329878983146105975780632b0006fa146105c35780632c1f816a146105d6575f80fd5b806315064c961161044857806315064c96146104fb5780631816b7e51461051857806319d8ac611461052b578063220d78991461053f575f80fd5b80630a0d9fbe146104795780630eaa86ea146104b0578063107bf28c146104d157806310a01a72146104e6575b5f80fd5b606f5461049290610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6104c36104be366004615fac565b610cbc565b6040519081526020016104a7565b6104d961118c565b6040516104a79190616068565b6104f96104f4366004616097565b611218565b005b606f546105089060ff1681565b60405190151581526020016104a7565b6104f9610526366004616124565b6117c6565b6073546104929067ffffffffffffffff1681565b6104d961054d366004616145565b6118de565b607b546105729073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104a7565b6074546105729068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104f96105d136600461619f565b611ab4565b6104f96105e4366004616203565b611c7e565b6105086105f7366004616278565b611e86565b6104f961060a366004616278565b611edb565b6073546104929068010000000000000000900467ffffffffffffffff1681565b60735461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546104929067ffffffffffffffff1681565b6079546104929068010000000000000000900467ffffffffffffffff1681565b6104f9610699366004616278565b61205f565b6104f96106ac366004616278565b612112565b6104c36106bf366004616278565b60756020525f908152604090205481565b6104d9612296565b6104c36106e6366004616388565b835160209485012060408051808701979097528681019190915260608087019490945260c09290921b7fffffffffffffffff00000000000000000000000000000000000000000000000016608086015290911b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888401528051808403607c018152609c9093019052815191012090565b6104f961078736600461643d565b6122a3565b6104f9612a9c565b6104c3612b9b565b6104f96107aa36600461619f565b612bb0565b6104c36107bd366004616278565b60716020525f908152604090205481565b6104f96107dc36600461648d565b612f2e565b6104f9613003565b6104f96107f7366004616278565b613016565b6074546104929067ffffffffffffffff1681565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b61087f6108453660046164a6565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016104a7565b607954610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9613183565b60335473ffffffffffffffffffffffffffffffffffffffff16610572565b6104f961090f366004616278565b61324f565b6104c3613292565b6104f961092a366004616203565b6133e5565b6104f961093d366004616278565b613495565b6104f9610950366004616278565b6134e4565b6104f9610963366004616278565b613660565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f961099d36600461648d565b613766565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b606f546109e4906901000000000000000000900461ffff1681565b60405161ffff90911681526020016104a7565b610a37610a05366004616278565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016104a7565b6104f9610a6b366004616278565b61382a565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b610508610aa53660046164a6565b61383b565b6104f9610ab83660046164bd565b6138c3565b6104926138db565b607b546104929074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9610aff3660046164bd565b61392e565b606f54610572906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610b6836600461652d565b6139bb565b6104f9610b7b3660046165d8565b613ef9565b60795461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6104f9614494565b6104f9610bbe366004616617565b614568565b607354610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610c28366004616661565b6145f7565b607b54610508907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b6104f9610c6836600461648d565b6149e7565b6104f9610c7b36600461648d565b614ab9565b607a546105729073ffffffffffffffffffffffffffffffffffffffff1681565b6104c360705481565b6104f9610cb73660046166a9565b614b6d565b5f805f610cc76138db565b905067ffffffffffffffff881615610e935760795467ffffffffffffffff9081169089161115610da4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a4015b60405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614610e8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610d9b565b5061102b565b67ffffffffffffffff87165f90815260756020526040902054915081610f61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610d9b565b8067ffffffffffffffff168767ffffffffffffffff16111561102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610d9b565b8067ffffffffffffffff168667ffffffffffffffff16116110f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610d9b565b5f61110288888886896118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161113691906166d3565b602060405180830381855afa158015611151573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061117491906166ee565b61117e9190616732565b9a9950505050505050505050565b6077805461119990616745565b80601f01602080910402602001604051908101604052809291908181526020018280546111c590616745565b80156112105780601f106111e757610100808354040283529160200191611210565b820191905f5260205f20905b8154815290600101906020018083116111f357829003601f168201915b505050505081565b611220614b8f565b5f8061122a6138db565b905067ffffffffffffffff8a16156113f15760795467ffffffffffffffff908116908b161115611302576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a401610d9b565b67ffffffffffffffff808b165f9081526078602052604090206002810154815490945090918b81166801000000000000000090920416146113eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610d9b565b50611589565b67ffffffffffffffff89165f908152607560205260409020549150816114bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610d9b565b8067ffffffffffffffff168967ffffffffffffffff161115611589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610d9b565b8067ffffffffffffffff168867ffffffffffffffff1611611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610d9b565b5f6116608a8a8a868b6118de565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8c81169182179092555f90815260756020526040902089905560795491925016156116dd57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018990527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611762575f80fd5b505af1158015611774573d5f803e3d5ffd5b505060405189815233925067ffffffffffffffff8c1691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe9060200160405180910390a35050505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611817576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff16108061183057506103ff8161ffff16115b15611867576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590611911575081155b15611948576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8061197f576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119888461383b565b6119be576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611b11576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b1f868686868686614c10565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611b9957607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611c1e575f80fd5b505af1158015611c30573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611cdb576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cea87878787878787614fcb565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611d6457607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611de9575f80fd5b505af1158015611dfb573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611ec992700100000000000000000000000000000000909204811691166167c3565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611f2c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611f73576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16611fe25760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611fe2576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1906020016118d3565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461210657606f5460ff16156120c7576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120d081611e86565b612106576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61210f816153fa565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612163576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156121aa576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661221557607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610612215576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020016118d3565b6076805461119990616745565b606f5460ff16156122e0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314612340576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361237b576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156123b7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f81815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b868110156127ff575f8a8a8381811061241d5761241d6167eb565b905060200281019061242f9190616818565b6124389061684a565b8051805160209091012060608201519192509067ffffffffffffffff16156125ad5785612464816168d4565b9650505f81836020015184606001516040516020016124bb93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260719093529120549091508114612543576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088165f9081526071602052604080822091909155606085015190850151908216911610156125a7576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506126e7565b602082015115801590612671575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af115801561264b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061266f91906166ee565b155b156126a8576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156126e7576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff16108061271a575042826040015167ffffffffffffffff16115b15612751576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519750505080806127f7906168fa565b915050612402565b5061280a86856167c3565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115612873576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61287e8285616931565b6128929067ffffffffffffffff1688616952565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c841691161793029290921790559091508281169085161461298757607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6129d933308360705461299a9190616965565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190615607565b6129e16156e9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612a46575f80fd5b505af1158015612a58573d5f803e3d5ffd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612aed576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16612b49576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f6070546064612bab9190616965565b905090565b606f5460ff1615612bed576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f908152607260205260409020600101544292612c39927801000000000000000000000000000000000000000000000000909104811691166167c3565b67ffffffffffffffff161115612c7b576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612c888686616931565b67ffffffffffffffff161115612cca576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cd8868686868686614c10565b612ce184615794565b607954700100000000000000000000000000000000900467ffffffffffffffff165f03612e2257607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615612d8257607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612e07575f80fd5b505af1158015612e19573d5f803e3d5ffd5b50505050612ef0565b612e2a6156e9565b6079805467ffffffffffffffff16905f612e43836168d4565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001611c6e565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612f7f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016118d3565b61300b614b8f565b6130145f61596e565b565b60335473ffffffffffffffffffffffffffffffffffffffff16331461317b575f61303e6138db565b90508067ffffffffffffffff168267ffffffffffffffff161161308d576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000909104811690831611806130d2575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15613109576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916131379162093a8091166167c3565b67ffffffffffffffff161115613179576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61210f6159e4565b607b5473ffffffffffffffffffffffffffffffffffffffff1633146131d4576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b613257614b8f565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561331e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061334291906166ee565b90505f61334d6138db565b60735467ffffffffffffffff6801000000000000000082048116916133a59170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416616931565b6133af91906167c3565b6133b99190616931565b67ffffffffffffffff169050805f036133d4575f9250505090565b6133de818361697c565b9250505090565b606f5460ff1615613422576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61343187878787878787614fcb565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a161348c6159e4565b50505050505050565b61349d614b8f565b6073805467ffffffffffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613535576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561357c576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166135e35760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106135e3576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75906020016118d3565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146136b1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156136f8576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28906020016118d3565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146137b7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016118d3565b613832614b8f565b61210f81615794565b5f67ffffffff0000000167ffffffffffffffff8316108015613872575067ffffffff00000001604083901c67ffffffffffffffff16105b8015613893575067ffffffff00000001608083901c67ffffffffffffffff16105b80156138aa575067ffffffff0000000160c083901c105b156138b757506001919050565b505f919050565b919050565b6138cb614b8f565b60776138d782826169dc565b5050565b6079545f9067ffffffffffffffff161561391d575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461397f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607661398b82826169dc565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516118d39190616068565b5f54610100900460ff16158080156139d957505f54600160ff909116105b806139f25750303b1580156139f257505f5460ff166001145b613a7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610d9b565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015613ada575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b613ae7602088018861648d565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055613b3c604088016020890161648d565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055613ba1608088016060890161648d565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076613c2b86826169dc565b506077613c3885826169dc565b5062093a80613c4d6060890160408a01616278565b67ffffffffffffffff161115613c8f576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613c9f6060880160408901616278565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80613d0160a0890160808a01616278565b67ffffffffffffffff161115613d43576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d5360a0880160808901616278565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613e32615a67565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f00000000000000000000000000000000000000000000000000000000000000008585604051613e879493929190616b3b565b60405180910390a1801561348c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613f56576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615613f93576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613fce576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561400a576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff78010000000000000000000000000000000000000000000000008204811691614055918491700100000000000000000000000000000000900416616b72565b111561408d576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b84811015614332575f8787838181106140eb576140eb6167eb565b90506020028101906140fd9190616b85565b61410690616bb7565b905083614112816168d4565b825180516020918201208185015160408087015190519499509194505f936141739386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146141fb576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f9081526071602052604081205561421f600189616952565b840361428e5742607b60149054906101000a900467ffffffffffffffff16846040015161424c91906167c3565b67ffffffffffffffff16111561428e576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450505050808061432a906168fa565b9150506140d0565b5061433d84846167c3565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146144e5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561454a575f80fd5b505af115801561455c573d5f803e3d5ffd5b50505050613014615b06565b614570614b8f565b6040805160608101825293845267ffffffffffffffff92831660208086019182529284168583019081529584165f908152607290935291209251835551600190920180549351821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169290911691909117919091179055565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615614654576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614691576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61469a612b9b565b9050818111156146d6576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115614712576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61475473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084615607565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156147be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147e291906166ee565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff1690601861481c836168d4565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051614853929190616c30565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303614981576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26149e0565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931823388886040516149d79493929190616c3f565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314614a38576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca906020016118d3565b614ac1614b8f565b73ffffffffffffffffffffffffffffffffffffffff8116614b64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610d9b565b61210f8161596e565b614b75614b8f565b67ffffffffffffffff165f90815260756020526040902055565b60335473ffffffffffffffffffffffffffffffffffffffff163314613014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d9b565b5f80614c1a6138db565b905067ffffffffffffffff881615614ce95760795467ffffffffffffffff9081169089161115614c76576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614614ce3576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614d89565b67ffffffffffffffff87165f90815260756020526040902054915081614d3b576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115614d89576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611614dd6576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f614de488888886896118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051614e1891906166d3565b602060405180830381855afa158015614e33573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614e5691906166ee565b614e609190616732565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91614ee291899190600401616c74565b602060405180830381865afa158015614efd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614f219190616cae565b614f57576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614fbf33614f65858b616931565b67ffffffffffffffff16614f77613292565b614f819190616965565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190615b94565b50505050505050505050565b5f67ffffffffffffffff8816156150975760795467ffffffffffffffff9081169089161115615026576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614615091576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50615132565b5067ffffffffffffffff85165f90815260756020526040902054806150e8576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff9081169087161115615132576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff908116908816118061516457508767ffffffffffffffff168767ffffffffffffffff1611155b8061518b575060795467ffffffffffffffff68010000000000000000909104811690881611155b156151c2576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f90815260786020526040902054680100000000000000009004811690861614615224576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61523287878785886118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161526691906166d3565b602060405180830381855afa158015615281573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906152a491906166ee565b6152ae9190616732565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161533091889190600401616c74565b602060405180830381865afa15801561534b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061536f9190616cae565b6153a5576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614fbf576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff680100000000000000009091048116908216111580615434575060795467ffffffffffffffff908116908216115b1561546b576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015615599575f80fd5b505af11580156155ab573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e84600201546040516155fa91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526156e39085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152615bef565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115613014576079545f906157319068010000000000000000900467ffffffffffffffff1660016167c3565b905061573c81611e86565b1561210f576079545f9060029061575e90849067ffffffffffffffff16616931565b6157689190616ccd565b61577290836167c3565b905061577d81611e86565b1561578b576138d7816153fa565b6138d7826153fa565b5f61579d6138db565b9050815f806157ac8484616931565b606f5467ffffffffffffffff91821692505f916157cf9161010090041642616952565b90505b8467ffffffffffffffff168467ffffffffffffffff16146158595767ffffffffffffffff8085165f908152607260205260409020600181015490911682101561583757600181015468010000000000000000900467ffffffffffffffff169450615853565b6158418686616931565b67ffffffffffffffff16935050615859565b506157d2565b5f6158648484616952565b9050838110156158bb57808403600c811161587f5780615882565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a60705402816158b1576158b1616705565b046070555061592a565b838103600c81116158cc57806158cf565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a7640000028161590557615905616705565b04905080607054670de0b6b3a7640000028161592357615923616705565b0460705550505b683635c9adc5dea00000607054111561594f57683635c9adc5dea0000060705561348c565b633b9aca00607054101561348c57633b9aca0060705550505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015615a49575f80fd5b505af1158015615a5b573d5f803e3d5ffd5b50505050613014615cfa565b5f54610100900460ff16615afd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610d9b565b6130143361596e565b606f5460ff16615b42576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052615bea9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401615661565b505050565b5f615c50826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615d8c9092919063ffffffff16565b805190915015615bea5780806020019051810190615c6e9190616cae565b615bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610d9b565b606f5460ff1615615d37576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b6060615d9a84845f85615da2565b949350505050565b606082471015615e34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610d9b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051615e5c91906166d3565b5f6040518083038185875af1925050503d805f8114615e96576040519150601f19603f3d011682016040523d82523d5f602084013e615e9b565b606091505b5091509150615eac87838387615eb7565b979650505050505050565b60608315615f4c5782515f03615f455773ffffffffffffffffffffffffffffffffffffffff85163b615f45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d9b565b5081615d9a565b615d9a8383815115615f615781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9b9190616068565b803567ffffffffffffffff811681146138be575f80fd5b5f805f805f60a08688031215615fc0575f80fd5b615fc986615f95565b9450615fd760208701615f95565b9350615fe560408701615f95565b94979396509394606081013594506080013592915050565b5f5b83811015616017578181015183820152602001615fff565b50505f910152565b5f8151808452616036816020860160208601615ffd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61607a602083018461601f565b9392505050565b8060408101831015616091575f80fd5b92915050565b5f805f805f805f806101a0898b0312156160af575f80fd5b6160b889615f95565b97506160c660208a01615f95565b96506160d460408a01615f95565b955060608901359450608089013593506160f18a60a08b01616081565b925061016089018a811115616104575f80fd5b60e08a0192506161148b82616081565b9150509295985092959890939650565b5f60208284031215616134575f80fd5b813561ffff8116811461607a575f80fd5b5f805f805f60a08688031215616159575f80fd5b61616286615f95565b945061617060208701615f95565b94979496505050506040830135926060810135926080909101359150565b806103008101831015616091575f80fd5b5f805f805f806103a087890312156161b5575f80fd5b6161be87615f95565b95506161cc60208801615f95565b94506161da60408801615f95565b935060608701359250608087013591506161f78860a0890161618e565b90509295509295509295565b5f805f805f805f6103c0888a03121561621a575f80fd5b61622388615f95565b965061623160208901615f95565b955061623f60408901615f95565b945061624d60608901615f95565b93506080880135925060a0880135915061626a8960c08a0161618e565b905092959891949750929550565b5f60208284031215616288575f80fd5b61607a82615f95565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126162cd575f80fd5b813567ffffffffffffffff808211156162e8576162e8616291565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561632e5761632e616291565b81604052838152866020858801011115616346575f80fd5b836020870160208301375f602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146138be575f80fd5b5f805f805f60a0868803121561639c575f80fd5b85359450602086013567ffffffffffffffff8111156163b9575f80fd5b6163c5888289016162be565b945050604086013592506163db60608701615f95565b91506163e960808701616365565b90509295509295909350565b5f8083601f840112616405575f80fd5b50813567ffffffffffffffff81111561641c575f80fd5b6020830191508360208260051b8501011115616436575f80fd5b9250929050565b5f805f6040848603121561644f575f80fd5b833567ffffffffffffffff811115616465575f80fd5b616471868287016163f5565b9094509250616484905060208501616365565b90509250925092565b5f6020828403121561649d575f80fd5b61607a82616365565b5f602082840312156164b6575f80fd5b5035919050565b5f602082840312156164cd575f80fd5b813567ffffffffffffffff8111156164e3575f80fd5b615d9a848285016162be565b5f8083601f8401126164ff575f80fd5b50813567ffffffffffffffff811115616516575f80fd5b602083019150836020828501011115616436575f80fd5b5f805f805f80868803610120811215616544575f80fd5b60a0811215616551575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff80821115616576575f80fd5b6165828a838b016162be565b955060e0890135915080821115616597575f80fd5b6165a38a838b016162be565b94506101008901359150808211156165b9575f80fd5b506165c689828a016164ef565b979a9699509497509295939492505050565b5f80602083850312156165e9575f80fd5b823567ffffffffffffffff8111156165ff575f80fd5b61660b858286016163f5565b90969095509350505050565b5f805f806080858703121561662a575f80fd5b61663385615f95565b93506020850135925061664860408601615f95565b915061665660608601615f95565b905092959194509250565b5f805f60408486031215616673575f80fd5b833567ffffffffffffffff811115616689575f80fd5b616695868287016164ef565b909790965060209590950135949350505050565b5f80604083850312156166ba575f80fd5b823591506166ca60208401615f95565b90509250929050565b5f82516166e4818460208701615ffd565b9190910192915050565b5f602082840312156166fe575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f8261674057616740616705565b500690565b600181811c9082168061675957607f821691505b602082108103616790577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156167e4576167e4616796565b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126166e4575f80fd5b5f6080823603121561685a575f80fd5b6040516080810167ffffffffffffffff828210818311171561687e5761687e616291565b816040528435915080821115616892575f80fd5b5061689f368286016162be565b825250602083013560208201526168b860408401615f95565b60408201526168c960608401615f95565b606082015292915050565b5f67ffffffffffffffff8083168181036168f0576168f0616796565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361692a5761692a616796565b5060010190565b67ffffffffffffffff8281168282160390808211156167e4576167e4616796565b8181038181111561609157616091616796565b808202811582820484141761609157616091616796565b5f8261698a5761698a616705565b500490565b601f821115615bea575f81815260208120601f850160051c810160208610156169b55750805b601f850160051c820191505b818110156169d4578281556001016169c1565b505050505050565b815167ffffffffffffffff8111156169f6576169f6616291565b616a0a81616a048454616745565b8461698f565b602080601f831160018114616a5c575f8415616a265750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556169d4565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015616aa857888601518255948401946001909101908401616a89565b5085821015616ae457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152616b68606083018486616af4565b9695505050505050565b8082018082111561609157616091616796565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126166e4575f80fd5b5f60608236031215616bc7575f80fd5b6040516060810167ffffffffffffffff8282108183111715616beb57616beb616291565b816040528435915080821115616bff575f80fd5b50616c0c368286016162be565b82525060208301356020820152616c2560408401615f95565b604082015292915050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f616b68606083018486616af4565b6103208101610300808584378201835f5b6001811015616ca4578151835260209283019290910190600101616c85565b5050509392505050565b5f60208284031215616cbe575f80fd5b8151801515811461607a575f80fd5b5f67ffffffffffffffff80841680616ce757616ce7616705565b9216919091049291505056fea26469706673582212203d78dd0bda59d6322d20458734dd51eab51ad00e93348cf59380a0e5731cf93a64736f6c63430008140033", + "bytecode": "0x61014060405234801562000011575f80fd5b5060405162006f2038038062006f208339810160408190526200003491620000a2565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b039182166101005216610120526200012a565b6001600160a01b038116811462000083575f80fd5b50565b80516001600160401b03811681146200009d575f80fd5b919050565b5f805f805f8060c08789031215620000b8575f80fd5b8651620000c5816200006e565b6020880151909650620000d8816200006e565b6040880151909550620000eb816200006e565b6060880151909450620000fe816200006e565b92506200010e6080880162000086565b91506200011e60a0880162000086565b90509295509295509295565b60805160a05160c05160e0516101005161012051616d29620001f75f395f818161081501528181611a560152613e5601525f81816109a70152611a2c01525f818161096d015281816129e3015281816144e701526159e601525f8181610b380152818161170c01528181611bc801528181611d93015281816125f001528181612db101528181614757015261554301525f8181610bf801528181614eac01526152fa01525f8181610a75015281816129b1015281816132d90152818161472c0152614f980152616d295ff3fe608060405234801561000f575f80fd5b5060043610610475575f3560e01c80638c3d73011161025d578063c754c7ed11610148578063e7a7ed02116100c3578063f14916d611610093578063f851a44011610079578063f851a44014610c80578063f8b823e414610ca0578063fe16564f14610ca9575f80fd5b8063f14916d614610c5a578063f2fde38b14610c6d575f80fd5b8063e7a7ed0214610bc3578063e8bf92ed14610bf3578063eaeb077b14610c1a578063ed6b010414610c2d575f80fd5b8063d2e129f911610118578063d939b315116100fe578063d939b31514610b80578063dbc1697614610ba8578063e0d1744114610bb0575f80fd5b8063d2e129f914610b5a578063d8d1091b14610b6d575f80fd5b8063c754c7ed14610ac5578063c89e42df14610af1578063cfa8ed4714610b04578063d02103ca14610b33575f80fd5b8063ada8f919116101d8578063b4f77ea9116101a8578063ba58ae391161018e578063ba58ae3914610a97578063c0cad30214610aaa578063c0ed84e014610abd575f80fd5b8063b4f77ea914610a5d578063b6b0b09714610a70575f80fd5b8063ada8f9191461098f578063adc879e9146109a2578063afd23cbe146109c9578063b4d63f58146109f7575f80fd5b80639aa972a31161022d5780639c9f3dfe116102135780639c9f3dfe14610942578063a066215c14610955578063a3c573eb14610968575f80fd5b80639aa972a31461091c5780639b7967601461092f575f80fd5b80638c3d7301146108db5780638da5cb5b146108e357806396dc3d391461090157806399f5634e14610914575f80fd5b80634a1a89a71161037d578063621dd411116102f85780637215541a116102c8578063831c7ead116102ae578063831c7ead14610810578063837a473814610837578063841b24d7146108ab575f80fd5b80637215541a146107e95780637fcb3653146107fc575f80fd5b8063621dd4111461079c5780636b8616ce146107af5780636ff512cc146107ce578063715018a6146107e1575f80fd5b8063542028d51161034d5780635e9145c9116103335780635e9145c9146107795780635ec919581461078c5780636046916914610794575f80fd5b8063542028d5146106d0578063574f649e146106d8575f80fd5b80634a1a89a71461066b5780634a910e6a1461068b5780634e4877061461069e5780635392c5e0146106b1575f80fd5b8063267822471161040d578063383b3be8116103dd578063423fa856116103c3578063423fa8561461060f578063456052671461062f578063458c047714610657575f80fd5b8063383b3be8146105e9578063394218e9146105fc575f80fd5b8063267822471461055257806329878983146105975780632b0006fa146105c35780632c1f816a146105d6575f80fd5b806315064c961161044857806315064c96146104fb5780631816b7e51461051857806319d8ac611461052b578063220d78991461053f575f80fd5b80630a0d9fbe146104795780630eaa86ea146104b0578063107bf28c146104d157806310a01a72146104e6575b5f80fd5b606f5461049290610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6104c36104be366004615fac565b610cbc565b6040519081526020016104a7565b6104d961118c565b6040516104a79190616068565b6104f96104f4366004616097565b611218565b005b606f546105089060ff1681565b60405190151581526020016104a7565b6104f9610526366004616124565b6117c6565b6073546104929067ffffffffffffffff1681565b6104d961054d366004616145565b6118de565b607b546105729073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104a7565b6074546105729068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104f96105d136600461619f565b611ab4565b6104f96105e4366004616203565b611c7e565b6105086105f7366004616278565b611e86565b6104f961060a366004616278565b611edb565b6073546104929068010000000000000000900467ffffffffffffffff1681565b60735461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546104929067ffffffffffffffff1681565b6079546104929068010000000000000000900467ffffffffffffffff1681565b6104f9610699366004616278565b61205f565b6104f96106ac366004616278565b612112565b6104c36106bf366004616278565b60756020525f908152604090205481565b6104d9612296565b6104c36106e6366004616388565b835160209485012060408051808701979097528681019190915260608087019490945260c09290921b7fffffffffffffffff00000000000000000000000000000000000000000000000016608086015290911b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888401528051808403607c018152609c9093019052815191012090565b6104f961078736600461643d565b6122a3565b6104f9612a9c565b6104c3612b9b565b6104f96107aa36600461619f565b612bb0565b6104c36107bd366004616278565b60716020525f908152604090205481565b6104f96107dc36600461648d565b612f2e565b6104f9613003565b6104f96107f7366004616278565b613016565b6074546104929067ffffffffffffffff1681565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b61087f6108453660046164a6565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016104a7565b607954610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9613183565b60335473ffffffffffffffffffffffffffffffffffffffff16610572565b6104f961090f366004616278565b61324f565b6104c3613292565b6104f961092a366004616203565b6133e5565b6104f961093d366004616278565b613495565b6104f9610950366004616278565b6134e4565b6104f9610963366004616278565b613660565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f961099d36600461648d565b613766565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b606f546109e4906901000000000000000000900461ffff1681565b60405161ffff90911681526020016104a7565b610a37610a05366004616278565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016104a7565b6104f9610a6b366004616278565b61382a565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b610508610aa53660046164a6565b61383b565b6104f9610ab83660046164bd565b6138c3565b6104926138db565b607b546104929074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9610aff3660046164bd565b61392e565b606f54610572906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610b6836600461652d565b6139bb565b6104f9610b7b3660046165d8565b613ef9565b60795461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6104f9614494565b6104f9610bbe366004616617565b614568565b607354610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610c28366004616661565b6145f7565b607b54610508907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b6104f9610c6836600461648d565b6149e7565b6104f9610c7b36600461648d565b614ab9565b607a546105729073ffffffffffffffffffffffffffffffffffffffff1681565b6104c360705481565b6104f9610cb73660046166a9565b614b6d565b5f805f610cc76138db565b905067ffffffffffffffff881615610e935760795467ffffffffffffffff9081169089161115610da4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a4015b60405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614610e8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610d9b565b5061102b565b67ffffffffffffffff87165f90815260756020526040902054915081610f61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610d9b565b8067ffffffffffffffff168767ffffffffffffffff16111561102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610d9b565b8067ffffffffffffffff168667ffffffffffffffff16116110f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610d9b565b5f61110288888886896118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161113691906166d3565b602060405180830381855afa158015611151573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061117491906166ee565b61117e9190616732565b9a9950505050505050505050565b6077805461119990616745565b80601f01602080910402602001604051908101604052809291908181526020018280546111c590616745565b80156112105780601f106111e757610100808354040283529160200191611210565b820191905f5260205f20905b8154815290600101906020018083116111f357829003601f168201915b505050505081565b611220614b8f565b5f8061122a6138db565b905067ffffffffffffffff8a16156113f15760795467ffffffffffffffff908116908b161115611302576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a401610d9b565b67ffffffffffffffff808b165f9081526078602052604090206002810154815490945090918b81166801000000000000000090920416146113eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610d9b565b50611589565b67ffffffffffffffff89165f908152607560205260409020549150816114bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610d9b565b8067ffffffffffffffff168967ffffffffffffffff161115611589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610d9b565b8067ffffffffffffffff168867ffffffffffffffff1611611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610d9b565b5f6116608a8a8a868b6118de565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8c81169182179092555f90815260756020526040902089905560795491925016156116dd57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018990527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611762575f80fd5b505af1158015611774573d5f803e3d5ffd5b505060405189815233925067ffffffffffffffff8c1691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe9060200160405180910390a35050505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611817576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff16108061183057506103ff8161ffff16115b15611867576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590611911575081155b15611948576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8061197f576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119888461383b565b6119be576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611b11576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b1f868686868686614c10565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611b9957607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611c1e575f80fd5b505af1158015611c30573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611cdb576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cea87878787878787614fcb565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611d6457607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611de9575f80fd5b505af1158015611dfb573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611ec992700100000000000000000000000000000000909204811691166167c3565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611f2c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611f73576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16611fe25760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611fe2576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1906020016118d3565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461210657606f5460ff16156120c7576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120d081611e86565b612106576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61210f816153fa565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612163576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156121aa576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661221557607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610612215576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020016118d3565b6076805461119990616745565b606f5460ff16156122e0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314612340576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361237b576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156123b7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f81815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b868110156127ff575f8a8a8381811061241d5761241d6167eb565b905060200281019061242f9190616818565b6124389061684a565b8051805160209091012060608201519192509067ffffffffffffffff16156125ad5785612464816168d4565b9650505f81836020015184606001516040516020016124bb93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260719093529120549091508114612543576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088165f9081526071602052604080822091909155606085015190850151908216911610156125a7576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506126e7565b602082015115801590612671575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af115801561264b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061266f91906166ee565b155b156126a8576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156126e7576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff16108061271a575042826040015167ffffffffffffffff16115b15612751576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519750505080806127f7906168fa565b915050612402565b5061280a86856167c3565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115612873576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61287e8285616931565b6128929067ffffffffffffffff1688616952565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c841691161793029290921790559091508281169085161461298757607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6129d933308360705461299a9190616965565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190615607565b6129e16156e9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612a46575f80fd5b505af1158015612a58573d5f803e3d5ffd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612aed576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16612b49576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f6070546064612bab9190616965565b905090565b606f5460ff1615612bed576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f908152607260205260409020600101544292612c39927801000000000000000000000000000000000000000000000000909104811691166167c3565b67ffffffffffffffff161115612c7b576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612c888686616931565b67ffffffffffffffff161115612cca576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cd8868686868686614c10565b612ce184615794565b607954700100000000000000000000000000000000900467ffffffffffffffff165f03612e2257607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615612d8257607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612e07575f80fd5b505af1158015612e19573d5f803e3d5ffd5b50505050612ef0565b612e2a6156e9565b6079805467ffffffffffffffff16905f612e43836168d4565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001611c6e565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612f7f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016118d3565b61300b614b8f565b6130145f61596e565b565b60335473ffffffffffffffffffffffffffffffffffffffff16331461317b575f61303e6138db565b90508067ffffffffffffffff168267ffffffffffffffff161161308d576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000909104811690831611806130d2575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15613109576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916131379162093a8091166167c3565b67ffffffffffffffff161115613179576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61210f6159e4565b607b5473ffffffffffffffffffffffffffffffffffffffff1633146131d4576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b613257614b8f565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561331e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061334291906166ee565b90505f61334d6138db565b60735467ffffffffffffffff6801000000000000000082048116916133a59170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416616931565b6133af91906167c3565b6133b99190616931565b67ffffffffffffffff169050805f036133d4575f9250505090565b6133de818361697c565b9250505090565b606f5460ff1615613422576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61343187878787878787614fcb565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a161348c6159e4565b50505050505050565b61349d614b8f565b6073805467ffffffffffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613535576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561357c576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166135e35760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106135e3576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75906020016118d3565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146136b1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156136f8576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28906020016118d3565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146137b7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016118d3565b613832614b8f565b61210f81615794565b5f67ffffffff0000000167ffffffffffffffff8316108015613872575067ffffffff00000001604083901c67ffffffffffffffff16105b8015613893575067ffffffff00000001608083901c67ffffffffffffffff16105b80156138aa575067ffffffff0000000160c083901c105b156138b757506001919050565b505f919050565b919050565b6138cb614b8f565b60776138d782826169dc565b5050565b6079545f9067ffffffffffffffff161561391d575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461397f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607661398b82826169dc565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516118d39190616068565b5f54610100900460ff16158080156139d957505f54600160ff909116105b806139f25750303b1580156139f257505f5460ff166001145b613a7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610d9b565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015613ada575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b613ae7602088018861648d565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055613b3c604088016020890161648d565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055613ba1608088016060890161648d565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076613c2b86826169dc565b506077613c3885826169dc565b5062093a80613c4d6060890160408a01616278565b67ffffffffffffffff161115613c8f576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613c9f6060880160408901616278565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80613d0160a0890160808a01616278565b67ffffffffffffffff161115613d43576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d5360a0880160808901616278565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613e32615a67565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f00000000000000000000000000000000000000000000000000000000000000008585604051613e879493929190616b3b565b60405180910390a1801561348c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613f56576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615613f93576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613fce576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561400a576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff78010000000000000000000000000000000000000000000000008204811691614055918491700100000000000000000000000000000000900416616b72565b111561408d576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b84811015614332575f8787838181106140eb576140eb6167eb565b90506020028101906140fd9190616b85565b61410690616bb7565b905083614112816168d4565b825180516020918201208185015160408087015190519499509194505f936141739386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146141fb576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f9081526071602052604081205561421f600189616952565b840361428e5742607b60149054906101000a900467ffffffffffffffff16846040015161424c91906167c3565b67ffffffffffffffff16111561428e576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450505050808061432a906168fa565b9150506140d0565b5061433d84846167c3565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146144e5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561454a575f80fd5b505af115801561455c573d5f803e3d5ffd5b50505050613014615b06565b614570614b8f565b6040805160608101825293845267ffffffffffffffff92831660208086019182529284168583019081529584165f908152607290935291209251835551600190920180549351821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169290911691909117919091179055565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615614654576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614691576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61469a612b9b565b9050818111156146d6576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115614712576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61475473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084615607565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156147be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147e291906166ee565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff1690601861481c836168d4565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051614853929190616c30565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303614981576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26149e0565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931823388886040516149d79493929190616c3f565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314614a38576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca906020016118d3565b614ac1614b8f565b73ffffffffffffffffffffffffffffffffffffffff8116614b64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610d9b565b61210f8161596e565b614b75614b8f565b67ffffffffffffffff165f90815260756020526040902055565b60335473ffffffffffffffffffffffffffffffffffffffff163314613014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d9b565b5f80614c1a6138db565b905067ffffffffffffffff881615614ce95760795467ffffffffffffffff9081169089161115614c76576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614614ce3576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614d89565b67ffffffffffffffff87165f90815260756020526040902054915081614d3b576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115614d89576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611614dd6576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f614de488888886896118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051614e1891906166d3565b602060405180830381855afa158015614e33573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614e5691906166ee565b614e609190616732565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91614ee291899190600401616c74565b602060405180830381865afa158015614efd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614f219190616cae565b614f57576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614fbf33614f65858b616931565b67ffffffffffffffff16614f77613292565b614f819190616965565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190615b94565b50505050505050505050565b5f67ffffffffffffffff8816156150975760795467ffffffffffffffff9081169089161115615026576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614615091576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50615132565b5067ffffffffffffffff85165f90815260756020526040902054806150e8576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff9081169087161115615132576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff908116908816118061516457508767ffffffffffffffff168767ffffffffffffffff1611155b8061518b575060795467ffffffffffffffff68010000000000000000909104811690881611155b156151c2576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f90815260786020526040902054680100000000000000009004811690861614615224576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61523287878785886118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161526691906166d3565b602060405180830381855afa158015615281573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906152a491906166ee565b6152ae9190616732565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161533091889190600401616c74565b602060405180830381865afa15801561534b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061536f9190616cae565b6153a5576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614fbf576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff680100000000000000009091048116908216111580615434575060795467ffffffffffffffff908116908216115b1561546b576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015615599575f80fd5b505af11580156155ab573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e84600201546040516155fa91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526156e39085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152615bef565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115613014576079545f906157319068010000000000000000900467ffffffffffffffff1660016167c3565b905061573c81611e86565b1561210f576079545f9060029061575e90849067ffffffffffffffff16616931565b6157689190616ccd565b61577290836167c3565b905061577d81611e86565b1561578b576138d7816153fa565b6138d7826153fa565b5f61579d6138db565b9050815f806157ac8484616931565b606f5467ffffffffffffffff91821692505f916157cf9161010090041642616952565b90505b8467ffffffffffffffff168467ffffffffffffffff16146158595767ffffffffffffffff8085165f908152607260205260409020600181015490911682101561583757600181015468010000000000000000900467ffffffffffffffff169450615853565b6158418686616931565b67ffffffffffffffff16935050615859565b506157d2565b5f6158648484616952565b9050838110156158bb57808403600c811161587f5780615882565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a60705402816158b1576158b1616705565b046070555061592a565b838103600c81116158cc57806158cf565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a7640000028161590557615905616705565b04905080607054670de0b6b3a7640000028161592357615923616705565b0460705550505b683635c9adc5dea00000607054111561594f57683635c9adc5dea0000060705561348c565b633b9aca00607054101561348c57633b9aca0060705550505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015615a49575f80fd5b505af1158015615a5b573d5f803e3d5ffd5b50505050613014615cfa565b5f54610100900460ff16615afd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610d9b565b6130143361596e565b606f5460ff16615b42576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052615bea9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401615661565b505050565b5f615c50826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615d8c9092919063ffffffff16565b805190915015615bea5780806020019051810190615c6e9190616cae565b615bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610d9b565b606f5460ff1615615d37576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b6060615d9a84845f85615da2565b949350505050565b606082471015615e34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610d9b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051615e5c91906166d3565b5f6040518083038185875af1925050503d805f8114615e96576040519150601f19603f3d011682016040523d82523d5f602084013e615e9b565b606091505b5091509150615eac87838387615eb7565b979650505050505050565b60608315615f4c5782515f03615f455773ffffffffffffffffffffffffffffffffffffffff85163b615f45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d9b565b5081615d9a565b615d9a8383815115615f615781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9b9190616068565b803567ffffffffffffffff811681146138be575f80fd5b5f805f805f60a08688031215615fc0575f80fd5b615fc986615f95565b9450615fd760208701615f95565b9350615fe560408701615f95565b94979396509394606081013594506080013592915050565b5f5b83811015616017578181015183820152602001615fff565b50505f910152565b5f8151808452616036816020860160208601615ffd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61607a602083018461601f565b9392505050565b8060408101831015616091575f80fd5b92915050565b5f805f805f805f806101a0898b0312156160af575f80fd5b6160b889615f95565b97506160c660208a01615f95565b96506160d460408a01615f95565b955060608901359450608089013593506160f18a60a08b01616081565b925061016089018a811115616104575f80fd5b60e08a0192506161148b82616081565b9150509295985092959890939650565b5f60208284031215616134575f80fd5b813561ffff8116811461607a575f80fd5b5f805f805f60a08688031215616159575f80fd5b61616286615f95565b945061617060208701615f95565b94979496505050506040830135926060810135926080909101359150565b806103008101831015616091575f80fd5b5f805f805f806103a087890312156161b5575f80fd5b6161be87615f95565b95506161cc60208801615f95565b94506161da60408801615f95565b935060608701359250608087013591506161f78860a0890161618e565b90509295509295509295565b5f805f805f805f6103c0888a03121561621a575f80fd5b61622388615f95565b965061623160208901615f95565b955061623f60408901615f95565b945061624d60608901615f95565b93506080880135925060a0880135915061626a8960c08a0161618e565b905092959891949750929550565b5f60208284031215616288575f80fd5b61607a82615f95565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126162cd575f80fd5b813567ffffffffffffffff808211156162e8576162e8616291565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561632e5761632e616291565b81604052838152866020858801011115616346575f80fd5b836020870160208301375f602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146138be575f80fd5b5f805f805f60a0868803121561639c575f80fd5b85359450602086013567ffffffffffffffff8111156163b9575f80fd5b6163c5888289016162be565b945050604086013592506163db60608701615f95565b91506163e960808701616365565b90509295509295909350565b5f8083601f840112616405575f80fd5b50813567ffffffffffffffff81111561641c575f80fd5b6020830191508360208260051b8501011115616436575f80fd5b9250929050565b5f805f6040848603121561644f575f80fd5b833567ffffffffffffffff811115616465575f80fd5b616471868287016163f5565b9094509250616484905060208501616365565b90509250925092565b5f6020828403121561649d575f80fd5b61607a82616365565b5f602082840312156164b6575f80fd5b5035919050565b5f602082840312156164cd575f80fd5b813567ffffffffffffffff8111156164e3575f80fd5b615d9a848285016162be565b5f8083601f8401126164ff575f80fd5b50813567ffffffffffffffff811115616516575f80fd5b602083019150836020828501011115616436575f80fd5b5f805f805f80868803610120811215616544575f80fd5b60a0811215616551575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff80821115616576575f80fd5b6165828a838b016162be565b955060e0890135915080821115616597575f80fd5b6165a38a838b016162be565b94506101008901359150808211156165b9575f80fd5b506165c689828a016164ef565b979a9699509497509295939492505050565b5f80602083850312156165e9575f80fd5b823567ffffffffffffffff8111156165ff575f80fd5b61660b858286016163f5565b90969095509350505050565b5f805f806080858703121561662a575f80fd5b61663385615f95565b93506020850135925061664860408601615f95565b915061665660608601615f95565b905092959194509250565b5f805f60408486031215616673575f80fd5b833567ffffffffffffffff811115616689575f80fd5b616695868287016164ef565b909790965060209590950135949350505050565b5f80604083850312156166ba575f80fd5b823591506166ca60208401615f95565b90509250929050565b5f82516166e4818460208701615ffd565b9190910192915050565b5f602082840312156166fe575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f8261674057616740616705565b500690565b600181811c9082168061675957607f821691505b602082108103616790577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156167e4576167e4616796565b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126166e4575f80fd5b5f6080823603121561685a575f80fd5b6040516080810167ffffffffffffffff828210818311171561687e5761687e616291565b816040528435915080821115616892575f80fd5b5061689f368286016162be565b825250602083013560208201526168b860408401615f95565b60408201526168c960608401615f95565b606082015292915050565b5f67ffffffffffffffff8083168181036168f0576168f0616796565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361692a5761692a616796565b5060010190565b67ffffffffffffffff8281168282160390808211156167e4576167e4616796565b8181038181111561609157616091616796565b808202811582820484141761609157616091616796565b5f8261698a5761698a616705565b500490565b601f821115615bea575f81815260208120601f850160051c810160208610156169b55750805b601f850160051c820191505b818110156169d4578281556001016169c1565b505050505050565b815167ffffffffffffffff8111156169f6576169f6616291565b616a0a81616a048454616745565b8461698f565b602080601f831160018114616a5c575f8415616a265750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556169d4565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015616aa857888601518255948401946001909101908401616a89565b5085821015616ae457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152616b68606083018486616af4565b9695505050505050565b8082018082111561609157616091616796565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126166e4575f80fd5b5f60608236031215616bc7575f80fd5b6040516060810167ffffffffffffffff8282108183111715616beb57616beb616291565b816040528435915080821115616bff575f80fd5b50616c0c368286016162be565b82525060208301356020820152616c2560408401615f95565b604082015292915050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f616b68606083018486616af4565b6103208101610300808584378201835f5b6001811015616ca4578151835260209283019290910190600101616c85565b5050509392505050565b5f60208284031215616cbe575f80fd5b8151801515811461607a575f80fd5b5f67ffffffffffffffff80841680616ce757616ce7616705565b9216919091049291505056fea2646970667358221220038c52f3bb0c2a50a3bf05e72805503f2e253770ce557d1b39af4a50601925ef64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610475575f3560e01c80638c3d73011161025d578063c754c7ed11610148578063e7a7ed02116100c3578063f14916d611610093578063f851a44011610079578063f851a44014610c80578063f8b823e414610ca0578063fe16564f14610ca9575f80fd5b8063f14916d614610c5a578063f2fde38b14610c6d575f80fd5b8063e7a7ed0214610bc3578063e8bf92ed14610bf3578063eaeb077b14610c1a578063ed6b010414610c2d575f80fd5b8063d2e129f911610118578063d939b315116100fe578063d939b31514610b80578063dbc1697614610ba8578063e0d1744114610bb0575f80fd5b8063d2e129f914610b5a578063d8d1091b14610b6d575f80fd5b8063c754c7ed14610ac5578063c89e42df14610af1578063cfa8ed4714610b04578063d02103ca14610b33575f80fd5b8063ada8f919116101d8578063b4f77ea9116101a8578063ba58ae391161018e578063ba58ae3914610a97578063c0cad30214610aaa578063c0ed84e014610abd575f80fd5b8063b4f77ea914610a5d578063b6b0b09714610a70575f80fd5b8063ada8f9191461098f578063adc879e9146109a2578063afd23cbe146109c9578063b4d63f58146109f7575f80fd5b80639aa972a31161022d5780639c9f3dfe116102135780639c9f3dfe14610942578063a066215c14610955578063a3c573eb14610968575f80fd5b80639aa972a31461091c5780639b7967601461092f575f80fd5b80638c3d7301146108db5780638da5cb5b146108e357806396dc3d391461090157806399f5634e14610914575f80fd5b80634a1a89a71161037d578063621dd411116102f85780637215541a116102c8578063831c7ead116102ae578063831c7ead14610810578063837a473814610837578063841b24d7146108ab575f80fd5b80637215541a146107e95780637fcb3653146107fc575f80fd5b8063621dd4111461079c5780636b8616ce146107af5780636ff512cc146107ce578063715018a6146107e1575f80fd5b8063542028d51161034d5780635e9145c9116103335780635e9145c9146107795780635ec919581461078c5780636046916914610794575f80fd5b8063542028d5146106d0578063574f649e146106d8575f80fd5b80634a1a89a71461066b5780634a910e6a1461068b5780634e4877061461069e5780635392c5e0146106b1575f80fd5b8063267822471161040d578063383b3be8116103dd578063423fa856116103c3578063423fa8561461060f578063456052671461062f578063458c047714610657575f80fd5b8063383b3be8146105e9578063394218e9146105fc575f80fd5b8063267822471461055257806329878983146105975780632b0006fa146105c35780632c1f816a146105d6575f80fd5b806315064c961161044857806315064c96146104fb5780631816b7e51461051857806319d8ac611461052b578063220d78991461053f575f80fd5b80630a0d9fbe146104795780630eaa86ea146104b0578063107bf28c146104d157806310a01a72146104e6575b5f80fd5b606f5461049290610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6104c36104be366004615fac565b610cbc565b6040519081526020016104a7565b6104d961118c565b6040516104a79190616068565b6104f96104f4366004616097565b611218565b005b606f546105089060ff1681565b60405190151581526020016104a7565b6104f9610526366004616124565b6117c6565b6073546104929067ffffffffffffffff1681565b6104d961054d366004616145565b6118de565b607b546105729073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104a7565b6074546105729068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104f96105d136600461619f565b611ab4565b6104f96105e4366004616203565b611c7e565b6105086105f7366004616278565b611e86565b6104f961060a366004616278565b611edb565b6073546104929068010000000000000000900467ffffffffffffffff1681565b60735461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546104929067ffffffffffffffff1681565b6079546104929068010000000000000000900467ffffffffffffffff1681565b6104f9610699366004616278565b61205f565b6104f96106ac366004616278565b612112565b6104c36106bf366004616278565b60756020525f908152604090205481565b6104d9612296565b6104c36106e6366004616388565b835160209485012060408051808701979097528681019190915260608087019490945260c09290921b7fffffffffffffffff00000000000000000000000000000000000000000000000016608086015290911b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888401528051808403607c018152609c9093019052815191012090565b6104f961078736600461643d565b6122a3565b6104f9612a9c565b6104c3612b9b565b6104f96107aa36600461619f565b612bb0565b6104c36107bd366004616278565b60716020525f908152604090205481565b6104f96107dc36600461648d565b612f2e565b6104f9613003565b6104f96107f7366004616278565b613016565b6074546104929067ffffffffffffffff1681565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b61087f6108453660046164a6565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016104a7565b607954610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9613183565b60335473ffffffffffffffffffffffffffffffffffffffff16610572565b6104f961090f366004616278565b61324f565b6104c3613292565b6104f961092a366004616203565b6133e5565b6104f961093d366004616278565b613495565b6104f9610950366004616278565b6134e4565b6104f9610963366004616278565b613660565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f961099d36600461648d565b613766565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b606f546109e4906901000000000000000000900461ffff1681565b60405161ffff90911681526020016104a7565b610a37610a05366004616278565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016104a7565b6104f9610a6b366004616278565b61382a565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b610508610aa53660046164a6565b61383b565b6104f9610ab83660046164bd565b6138c3565b6104926138db565b607b546104929074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9610aff3660046164bd565b61392e565b606f54610572906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610b6836600461652d565b6139bb565b6104f9610b7b3660046165d8565b613ef9565b60795461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6104f9614494565b6104f9610bbe366004616617565b614568565b607354610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610c28366004616661565b6145f7565b607b54610508907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b6104f9610c6836600461648d565b6149e7565b6104f9610c7b36600461648d565b614ab9565b607a546105729073ffffffffffffffffffffffffffffffffffffffff1681565b6104c360705481565b6104f9610cb73660046166a9565b614b6d565b5f805f610cc76138db565b905067ffffffffffffffff881615610e935760795467ffffffffffffffff9081169089161115610da4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a4015b60405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614610e8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610d9b565b5061102b565b67ffffffffffffffff87165f90815260756020526040902054915081610f61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610d9b565b8067ffffffffffffffff168767ffffffffffffffff16111561102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610d9b565b8067ffffffffffffffff168667ffffffffffffffff16116110f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610d9b565b5f61110288888886896118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161113691906166d3565b602060405180830381855afa158015611151573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061117491906166ee565b61117e9190616732565b9a9950505050505050505050565b6077805461119990616745565b80601f01602080910402602001604051908101604052809291908181526020018280546111c590616745565b80156112105780601f106111e757610100808354040283529160200191611210565b820191905f5260205f20905b8154815290600101906020018083116111f357829003601f168201915b505050505081565b611220614b8f565b5f8061122a6138db565b905067ffffffffffffffff8a16156113f15760795467ffffffffffffffff908116908b161115611302576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a401610d9b565b67ffffffffffffffff808b165f9081526078602052604090206002810154815490945090918b81166801000000000000000090920416146113eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610d9b565b50611589565b67ffffffffffffffff89165f908152607560205260409020549150816114bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610d9b565b8067ffffffffffffffff168967ffffffffffffffff161115611589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610d9b565b8067ffffffffffffffff168867ffffffffffffffff1611611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610d9b565b5f6116608a8a8a868b6118de565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8c81169182179092555f90815260756020526040902089905560795491925016156116dd57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018990527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611762575f80fd5b505af1158015611774573d5f803e3d5ffd5b505060405189815233925067ffffffffffffffff8c1691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe9060200160405180910390a35050505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611817576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff16108061183057506103ff8161ffff16115b15611867576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590611911575081155b15611948576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8061197f576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119888461383b565b6119be576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611b11576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b1f868686868686614c10565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611b9957607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611c1e575f80fd5b505af1158015611c30573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611cdb576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cea87878787878787614fcb565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611d6457607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611de9575f80fd5b505af1158015611dfb573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611ec992700100000000000000000000000000000000909204811691166167c3565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611f2c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611f73576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16611fe25760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611fe2576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1906020016118d3565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461210657606f5460ff16156120c7576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120d081611e86565b612106576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61210f816153fa565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612163576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156121aa576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661221557607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610612215576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020016118d3565b6076805461119990616745565b606f5460ff16156122e0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314612340576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361237b576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156123b7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f81815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b868110156127ff575f8a8a8381811061241d5761241d6167eb565b905060200281019061242f9190616818565b6124389061684a565b8051805160209091012060608201519192509067ffffffffffffffff16156125ad5785612464816168d4565b9650505f81836020015184606001516040516020016124bb93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260719093529120549091508114612543576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088165f9081526071602052604080822091909155606085015190850151908216911610156125a7576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506126e7565b602082015115801590612671575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af115801561264b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061266f91906166ee565b155b156126a8576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156126e7576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff16108061271a575042826040015167ffffffffffffffff16115b15612751576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519750505080806127f7906168fa565b915050612402565b5061280a86856167c3565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115612873576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61287e8285616931565b6128929067ffffffffffffffff1688616952565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c841691161793029290921790559091508281169085161461298757607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6129d933308360705461299a9190616965565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190615607565b6129e16156e9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612a46575f80fd5b505af1158015612a58573d5f803e3d5ffd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612aed576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16612b49576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f6070546064612bab9190616965565b905090565b606f5460ff1615612bed576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f908152607260205260409020600101544292612c39927801000000000000000000000000000000000000000000000000909104811691166167c3565b67ffffffffffffffff161115612c7b576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612c888686616931565b67ffffffffffffffff161115612cca576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cd8868686868686614c10565b612ce184615794565b607954700100000000000000000000000000000000900467ffffffffffffffff165f03612e2257607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615612d8257607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612e07575f80fd5b505af1158015612e19573d5f803e3d5ffd5b50505050612ef0565b612e2a6156e9565b6079805467ffffffffffffffff16905f612e43836168d4565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001611c6e565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612f7f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016118d3565b61300b614b8f565b6130145f61596e565b565b60335473ffffffffffffffffffffffffffffffffffffffff16331461317b575f61303e6138db565b90508067ffffffffffffffff168267ffffffffffffffff161161308d576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000909104811690831611806130d2575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15613109576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916131379162093a8091166167c3565b67ffffffffffffffff161115613179576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61210f6159e4565b607b5473ffffffffffffffffffffffffffffffffffffffff1633146131d4576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b613257614b8f565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561331e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061334291906166ee565b90505f61334d6138db565b60735467ffffffffffffffff6801000000000000000082048116916133a59170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416616931565b6133af91906167c3565b6133b99190616931565b67ffffffffffffffff169050805f036133d4575f9250505090565b6133de818361697c565b9250505090565b606f5460ff1615613422576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61343187878787878787614fcb565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a161348c6159e4565b50505050505050565b61349d614b8f565b6073805467ffffffffffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613535576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561357c576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166135e35760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106135e3576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75906020016118d3565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146136b1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156136f8576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28906020016118d3565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146137b7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016118d3565b613832614b8f565b61210f81615794565b5f67ffffffff0000000167ffffffffffffffff8316108015613872575067ffffffff00000001604083901c67ffffffffffffffff16105b8015613893575067ffffffff00000001608083901c67ffffffffffffffff16105b80156138aa575067ffffffff0000000160c083901c105b156138b757506001919050565b505f919050565b919050565b6138cb614b8f565b60776138d782826169dc565b5050565b6079545f9067ffffffffffffffff161561391d575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461397f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607661398b82826169dc565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516118d39190616068565b5f54610100900460ff16158080156139d957505f54600160ff909116105b806139f25750303b1580156139f257505f5460ff166001145b613a7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610d9b565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015613ada575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b613ae7602088018861648d565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055613b3c604088016020890161648d565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055613ba1608088016060890161648d565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076613c2b86826169dc565b506077613c3885826169dc565b5062093a80613c4d6060890160408a01616278565b67ffffffffffffffff161115613c8f576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613c9f6060880160408901616278565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80613d0160a0890160808a01616278565b67ffffffffffffffff161115613d43576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d5360a0880160808901616278565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613e32615a67565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f00000000000000000000000000000000000000000000000000000000000000008585604051613e879493929190616b3b565b60405180910390a1801561348c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613f56576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615613f93576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613fce576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561400a576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff78010000000000000000000000000000000000000000000000008204811691614055918491700100000000000000000000000000000000900416616b72565b111561408d576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b84811015614332575f8787838181106140eb576140eb6167eb565b90506020028101906140fd9190616b85565b61410690616bb7565b905083614112816168d4565b825180516020918201208185015160408087015190519499509194505f936141739386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146141fb576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f9081526071602052604081205561421f600189616952565b840361428e5742607b60149054906101000a900467ffffffffffffffff16846040015161424c91906167c3565b67ffffffffffffffff16111561428e576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450505050808061432a906168fa565b9150506140d0565b5061433d84846167c3565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146144e5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561454a575f80fd5b505af115801561455c573d5f803e3d5ffd5b50505050613014615b06565b614570614b8f565b6040805160608101825293845267ffffffffffffffff92831660208086019182529284168583019081529584165f908152607290935291209251835551600190920180549351821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169290911691909117919091179055565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615614654576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614691576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61469a612b9b565b9050818111156146d6576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115614712576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61475473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084615607565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156147be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147e291906166ee565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff1690601861481c836168d4565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051614853929190616c30565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303614981576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26149e0565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931823388886040516149d79493929190616c3f565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314614a38576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca906020016118d3565b614ac1614b8f565b73ffffffffffffffffffffffffffffffffffffffff8116614b64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610d9b565b61210f8161596e565b614b75614b8f565b67ffffffffffffffff165f90815260756020526040902055565b60335473ffffffffffffffffffffffffffffffffffffffff163314613014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d9b565b5f80614c1a6138db565b905067ffffffffffffffff881615614ce95760795467ffffffffffffffff9081169089161115614c76576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614614ce3576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614d89565b67ffffffffffffffff87165f90815260756020526040902054915081614d3b576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115614d89576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611614dd6576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f614de488888886896118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051614e1891906166d3565b602060405180830381855afa158015614e33573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614e5691906166ee565b614e609190616732565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91614ee291899190600401616c74565b602060405180830381865afa158015614efd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614f219190616cae565b614f57576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614fbf33614f65858b616931565b67ffffffffffffffff16614f77613292565b614f819190616965565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190615b94565b50505050505050505050565b5f67ffffffffffffffff8816156150975760795467ffffffffffffffff9081169089161115615026576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614615091576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50615132565b5067ffffffffffffffff85165f90815260756020526040902054806150e8576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff9081169087161115615132576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff908116908816118061516457508767ffffffffffffffff168767ffffffffffffffff1611155b8061518b575060795467ffffffffffffffff68010000000000000000909104811690881611155b156151c2576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f90815260786020526040902054680100000000000000009004811690861614615224576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61523287878785886118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161526691906166d3565b602060405180830381855afa158015615281573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906152a491906166ee565b6152ae9190616732565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161533091889190600401616c74565b602060405180830381865afa15801561534b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061536f9190616cae565b6153a5576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614fbf576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff680100000000000000009091048116908216111580615434575060795467ffffffffffffffff908116908216115b1561546b576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015615599575f80fd5b505af11580156155ab573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e84600201546040516155fa91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526156e39085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152615bef565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115613014576079545f906157319068010000000000000000900467ffffffffffffffff1660016167c3565b905061573c81611e86565b1561210f576079545f9060029061575e90849067ffffffffffffffff16616931565b6157689190616ccd565b61577290836167c3565b905061577d81611e86565b1561578b576138d7816153fa565b6138d7826153fa565b5f61579d6138db565b9050815f806157ac8484616931565b606f5467ffffffffffffffff91821692505f916157cf9161010090041642616952565b90505b8467ffffffffffffffff168467ffffffffffffffff16146158595767ffffffffffffffff8085165f908152607260205260409020600181015490911682101561583757600181015468010000000000000000900467ffffffffffffffff169450615853565b6158418686616931565b67ffffffffffffffff16935050615859565b506157d2565b5f6158648484616952565b9050838110156158bb57808403600c811161587f5780615882565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a60705402816158b1576158b1616705565b046070555061592a565b838103600c81116158cc57806158cf565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a7640000028161590557615905616705565b04905080607054670de0b6b3a7640000028161592357615923616705565b0460705550505b683635c9adc5dea00000607054111561594f57683635c9adc5dea0000060705561348c565b633b9aca00607054101561348c57633b9aca0060705550505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015615a49575f80fd5b505af1158015615a5b573d5f803e3d5ffd5b50505050613014615cfa565b5f54610100900460ff16615afd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610d9b565b6130143361596e565b606f5460ff16615b42576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052615bea9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401615661565b505050565b5f615c50826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615d8c9092919063ffffffff16565b805190915015615bea5780806020019051810190615c6e9190616cae565b615bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610d9b565b606f5460ff1615615d37576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b6060615d9a84845f85615da2565b949350505050565b606082471015615e34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610d9b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051615e5c91906166d3565b5f6040518083038185875af1925050503d805f8114615e96576040519150601f19603f3d011682016040523d82523d5f602084013e615e9b565b606091505b5091509150615eac87838387615eb7565b979650505050505050565b60608315615f4c5782515f03615f455773ffffffffffffffffffffffffffffffffffffffff85163b615f45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d9b565b5081615d9a565b615d9a8383815115615f615781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9b9190616068565b803567ffffffffffffffff811681146138be575f80fd5b5f805f805f60a08688031215615fc0575f80fd5b615fc986615f95565b9450615fd760208701615f95565b9350615fe560408701615f95565b94979396509394606081013594506080013592915050565b5f5b83811015616017578181015183820152602001615fff565b50505f910152565b5f8151808452616036816020860160208601615ffd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61607a602083018461601f565b9392505050565b8060408101831015616091575f80fd5b92915050565b5f805f805f805f806101a0898b0312156160af575f80fd5b6160b889615f95565b97506160c660208a01615f95565b96506160d460408a01615f95565b955060608901359450608089013593506160f18a60a08b01616081565b925061016089018a811115616104575f80fd5b60e08a0192506161148b82616081565b9150509295985092959890939650565b5f60208284031215616134575f80fd5b813561ffff8116811461607a575f80fd5b5f805f805f60a08688031215616159575f80fd5b61616286615f95565b945061617060208701615f95565b94979496505050506040830135926060810135926080909101359150565b806103008101831015616091575f80fd5b5f805f805f806103a087890312156161b5575f80fd5b6161be87615f95565b95506161cc60208801615f95565b94506161da60408801615f95565b935060608701359250608087013591506161f78860a0890161618e565b90509295509295509295565b5f805f805f805f6103c0888a03121561621a575f80fd5b61622388615f95565b965061623160208901615f95565b955061623f60408901615f95565b945061624d60608901615f95565b93506080880135925060a0880135915061626a8960c08a0161618e565b905092959891949750929550565b5f60208284031215616288575f80fd5b61607a82615f95565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126162cd575f80fd5b813567ffffffffffffffff808211156162e8576162e8616291565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561632e5761632e616291565b81604052838152866020858801011115616346575f80fd5b836020870160208301375f602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146138be575f80fd5b5f805f805f60a0868803121561639c575f80fd5b85359450602086013567ffffffffffffffff8111156163b9575f80fd5b6163c5888289016162be565b945050604086013592506163db60608701615f95565b91506163e960808701616365565b90509295509295909350565b5f8083601f840112616405575f80fd5b50813567ffffffffffffffff81111561641c575f80fd5b6020830191508360208260051b8501011115616436575f80fd5b9250929050565b5f805f6040848603121561644f575f80fd5b833567ffffffffffffffff811115616465575f80fd5b616471868287016163f5565b9094509250616484905060208501616365565b90509250925092565b5f6020828403121561649d575f80fd5b61607a82616365565b5f602082840312156164b6575f80fd5b5035919050565b5f602082840312156164cd575f80fd5b813567ffffffffffffffff8111156164e3575f80fd5b615d9a848285016162be565b5f8083601f8401126164ff575f80fd5b50813567ffffffffffffffff811115616516575f80fd5b602083019150836020828501011115616436575f80fd5b5f805f805f80868803610120811215616544575f80fd5b60a0811215616551575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff80821115616576575f80fd5b6165828a838b016162be565b955060e0890135915080821115616597575f80fd5b6165a38a838b016162be565b94506101008901359150808211156165b9575f80fd5b506165c689828a016164ef565b979a9699509497509295939492505050565b5f80602083850312156165e9575f80fd5b823567ffffffffffffffff8111156165ff575f80fd5b61660b858286016163f5565b90969095509350505050565b5f805f806080858703121561662a575f80fd5b61663385615f95565b93506020850135925061664860408601615f95565b915061665660608601615f95565b905092959194509250565b5f805f60408486031215616673575f80fd5b833567ffffffffffffffff811115616689575f80fd5b616695868287016164ef565b909790965060209590950135949350505050565b5f80604083850312156166ba575f80fd5b823591506166ca60208401615f95565b90509250929050565b5f82516166e4818460208701615ffd565b9190910192915050565b5f602082840312156166fe575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f8261674057616740616705565b500690565b600181811c9082168061675957607f821691505b602082108103616790577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156167e4576167e4616796565b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126166e4575f80fd5b5f6080823603121561685a575f80fd5b6040516080810167ffffffffffffffff828210818311171561687e5761687e616291565b816040528435915080821115616892575f80fd5b5061689f368286016162be565b825250602083013560208201526168b860408401615f95565b60408201526168c960608401615f95565b606082015292915050565b5f67ffffffffffffffff8083168181036168f0576168f0616796565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361692a5761692a616796565b5060010190565b67ffffffffffffffff8281168282160390808211156167e4576167e4616796565b8181038181111561609157616091616796565b808202811582820484141761609157616091616796565b5f8261698a5761698a616705565b500490565b601f821115615bea575f81815260208120601f850160051c810160208610156169b55750805b601f850160051c820191505b818110156169d4578281556001016169c1565b505050505050565b815167ffffffffffffffff8111156169f6576169f6616291565b616a0a81616a048454616745565b8461698f565b602080601f831160018114616a5c575f8415616a265750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556169d4565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015616aa857888601518255948401946001909101908401616a89565b5085821015616ae457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152616b68606083018486616af4565b9695505050505050565b8082018082111561609157616091616796565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126166e4575f80fd5b5f60608236031215616bc7575f80fd5b6040516060810167ffffffffffffffff8282108183111715616beb57616beb616291565b816040528435915080821115616bff575f80fd5b50616c0c368286016162be565b82525060208301356020820152616c2560408401615f95565b604082015292915050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f616b68606083018486616af4565b6103208101610300808584378201835f5b6001811015616ca4578151835260209283019290910190600101616c85565b5050509392505050565b5f60208284031215616cbe575f80fd5b8151801515811461607a575f80fd5b5f67ffffffffffffffff80841680616ce757616ce7616705565b9216919091049291505056fea2646970667358221220038c52f3bb0c2a50a3bf05e72805503f2e253770ce557d1b39af4a50601925ef64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMTimelock.json b/compiled-contracts/PolygonZkEVMTimelock.json index 701df5c31..36a06c6db 100644 --- a/compiled-contracts/PolygonZkEVMTimelock.json +++ b/compiled-contracts/PolygonZkEVMTimelock.json @@ -892,8 +892,8 @@ "type": "receive" } ], - "bytecode": "0x60a060405234801562000010575f80fd5b5060405162002c4d38038062002c4d833981016040819052620000339162000412565b84848484620000515f8051602062002bcd8339815191528062000232565b620000795f8051602062002bed8339815191525f8051602062002bcd83398151915262000232565b620000a15f8051602062002c0d8339815191525f8051602062002bcd83398151915262000232565b620000c95f8051602062002c2d8339815191525f8051602062002bcd83398151915262000232565b620000e35f8051602062002bcd833981519152306200027c565b6001600160a01b038116156200010d576200010d5f8051602062002bcd833981519152826200027c565b5f5b83518110156200019057620001555f8051602062002bed833981519152858381518110620001415762000141620004ad565b60200260200101516200027c60201b60201c565b6200017d5f8051602062002c2d833981519152858381518110620001415762000141620004ad565b6200018881620004c1565b90506200010f565b505f5b8251811015620001d857620001c55f8051602062002c0d833981519152848381518110620001415762000141620004ad565b620001d081620004c1565b905062000193565b506002849055604080515f8152602081018690527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1505050506001600160a01b031660805250620004e692505050565b5f82815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6200028882826200028c565b5050565b5f828152602081815260408083206001600160a01b038516845290915290205460ff1662000288575f828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620002e63390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b634e487b7160e01b5f52604160045260245ffd5b6001600160a01b038116811462000353575f80fd5b50565b805162000363816200033e565b919050565b5f82601f83011262000378575f80fd5b815160206001600160401b03808311156200039757620003976200032a565b8260051b604051601f19603f83011681018181108482111715620003bf57620003bf6200032a565b604052938452858101830193838101925087851115620003dd575f80fd5b83870191505b848210156200040757620003f78262000356565b83529183019190830190620003e3565b979650505050505050565b5f805f805f60a0868803121562000427575f80fd5b855160208701519095506001600160401b038082111562000446575f80fd5b6200045489838a0162000368565b955060408801519150808211156200046a575f80fd5b50620004798882890162000368565b93505060608601516200048c816200033e565b60808701519092506200049f816200033e565b809150509295509295909350565b634e487b7160e01b5f52603260045260245ffd5b5f60018201620004df57634e487b7160e01b5f52601160045260245ffd5b5060010190565b6080516126c06200050d5f395f818161040201528181611124015261116401526126c05ff3fe6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220d904e0b10230579952f8427a107aa4349f9a1f5799108d399b11e28b578463e464736f6c634300081400335f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63fd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783", - "deployedBytecode": "0x6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220d904e0b10230579952f8427a107aa4349f9a1f5799108d399b11e28b578463e464736f6c63430008140033", + "bytecode": "0x60a060405234801562000010575f80fd5b5060405162002c4d38038062002c4d833981016040819052620000339162000412565b84848484620000515f8051602062002bcd8339815191528062000232565b620000795f8051602062002bed8339815191525f8051602062002bcd83398151915262000232565b620000a15f8051602062002c0d8339815191525f8051602062002bcd83398151915262000232565b620000c95f8051602062002c2d8339815191525f8051602062002bcd83398151915262000232565b620000e35f8051602062002bcd833981519152306200027c565b6001600160a01b038116156200010d576200010d5f8051602062002bcd833981519152826200027c565b5f5b83518110156200019057620001555f8051602062002bed833981519152858381518110620001415762000141620004ad565b60200260200101516200027c60201b60201c565b6200017d5f8051602062002c2d833981519152858381518110620001415762000141620004ad565b6200018881620004c1565b90506200010f565b505f5b8251811015620001d857620001c55f8051602062002c0d833981519152848381518110620001415762000141620004ad565b620001d081620004c1565b905062000193565b506002849055604080515f8152602081018690527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1505050506001600160a01b031660805250620004e692505050565b5f82815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6200028882826200028c565b5050565b5f828152602081815260408083206001600160a01b038516845290915290205460ff1662000288575f828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620002e63390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b634e487b7160e01b5f52604160045260245ffd5b6001600160a01b038116811462000353575f80fd5b50565b805162000363816200033e565b919050565b5f82601f83011262000378575f80fd5b815160206001600160401b03808311156200039757620003976200032a565b8260051b604051601f19603f83011681018181108482111715620003bf57620003bf6200032a565b604052938452858101830193838101925087851115620003dd575f80fd5b83870191505b848210156200040757620003f78262000356565b83529183019190830190620003e3565b979650505050505050565b5f805f805f60a0868803121562000427575f80fd5b855160208701519095506001600160401b038082111562000446575f80fd5b6200045489838a0162000368565b955060408801519150808211156200046a575f80fd5b50620004798882890162000368565b93505060608601516200048c816200033e565b60808701519092506200049f816200033e565b809150509295509295909350565b634e487b7160e01b5f52603260045260245ffd5b5f60018201620004df57634e487b7160e01b5f52601160045260245ffd5b5060010190565b6080516126c06200050d5f395f818161040201528181611124015261116401526126c05ff3fe6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220e28ae7494480ab1c619fd775dc5ff665588c808a910d66178a982c2e7c76a1e664736f6c634300081400335f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63fd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783", + "deployedBytecode": "0x6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220e28ae7494480ab1c619fd775dc5ff665588c808a910d66178a982c2e7c76a1e664736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/TokenWrapped.json b/compiled-contracts/TokenWrapped.json index 72e165a2a..b690c2af6 100644 --- a/compiled-contracts/TokenWrapped.json +++ b/compiled-contracts/TokenWrapped.json @@ -471,8 +471,8 @@ "type": "function" } ], - "bytecode": "0x61010060405234801562000011575f80fd5b50604051620019a1380380620019a1833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516115036200049e5f395f61022d01525f81816102fb015281816105ad015261067a01525f61052801525f818161036d01526104f201526115035ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b6040516101879190611255565b60405180910390f35b6101a361019e3660046112e6565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461130e565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d3660046112e6565b61054a565b6102856102803660046112e6565b610595565b005b6101b7610295366004611347565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca366004611347565b60056020525f908152604090205481565b61017a610653565b6102856102f13660046112e6565b610662565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a36103503660046112e6565b610717565b6101a36103633660046112e6565b6107cd565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d366004611367565b6107da565b6101b76103b03660046113d4565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611405565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611405565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610ad7565b60019150505b92915050565b5f336104d9858285610c56565b6104e4858585610d12565b506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146105255761052046610f31565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c09082908690610590908790611483565b610ad7565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106455760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61064f8282610ff8565b5050565b60606004805461043290611405565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461070d5760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d42726964676500000000000000000000000000000000606482015260840161063c565b61064f82826110cf565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107c05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161063c565b6104e48286868403610ad7565b5f336104c0818585610d12565b8342111561084f5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d697400000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866108a883611496565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6109126104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156109d3573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610a4e57508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610ac05760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e617475726500000000000000000000000000000000000000000000000000606482015260840161063c565b610acb8a8a8a610ad7565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610b5f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610be85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d0c5781811015610cff5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161063c565b610d0c8484848403610ad7565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610d9b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610e245760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610ebf5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610d0c565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610f5b610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff821661105b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161063c565b8060025f82825461106c9190611483565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166111585760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260208190526040902054818110156111f35760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610c49565b5f6020808352835180828501525f5b8181101561128057858101830151858201604001528201611264565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146112e1575f80fd5b919050565b5f80604083850312156112f7575f80fd5b611300836112be565b946020939093013593505050565b5f805f60608486031215611320575f80fd5b611329846112be565b9250611337602085016112be565b9150604084013590509250925092565b5f60208284031215611357575f80fd5b611360826112be565b9392505050565b5f805f805f805f60e0888a03121561137d575f80fd5b611386886112be565b9650611394602089016112be565b95506040880135945060608801359350608088013560ff811681146113b7575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f80604083850312156113e5575f80fd5b6113ee836112be565b91506113fc602084016112be565b90509250929050565b600181811c9082168061141957607f821691505b602082108103611450577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c6611456565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036114c6576114c6611456565b506001019056fea2646970667358221220176a1a9cf4a702d3853b858873fff4a6370c4e5d7d72d68593ec0ebe64fcc26964736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b6040516101879190611255565b60405180910390f35b6101a361019e3660046112e6565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461130e565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d3660046112e6565b61054a565b6102856102803660046112e6565b610595565b005b6101b7610295366004611347565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca366004611347565b60056020525f908152604090205481565b61017a610653565b6102856102f13660046112e6565b610662565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a36103503660046112e6565b610717565b6101a36103633660046112e6565b6107cd565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d366004611367565b6107da565b6101b76103b03660046113d4565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611405565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611405565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610ad7565b60019150505b92915050565b5f336104d9858285610c56565b6104e4858585610d12565b506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146105255761052046610f31565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c09082908690610590908790611483565b610ad7565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106455760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61064f8282610ff8565b5050565b60606004805461043290611405565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461070d5760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d42726964676500000000000000000000000000000000606482015260840161063c565b61064f82826110cf565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107c05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161063c565b6104e48286868403610ad7565b5f336104c0818585610d12565b8342111561084f5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d697400000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866108a883611496565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6109126104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156109d3573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610a4e57508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610ac05760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e617475726500000000000000000000000000000000000000000000000000606482015260840161063c565b610acb8a8a8a610ad7565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610b5f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610be85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d0c5781811015610cff5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161063c565b610d0c8484848403610ad7565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610d9b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610e245760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610ebf5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610d0c565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610f5b610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff821661105b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161063c565b8060025f82825461106c9190611483565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166111585760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260208190526040902054818110156111f35760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610c49565b5f6020808352835180828501525f5b8181101561128057858101830151858201604001528201611264565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146112e1575f80fd5b919050565b5f80604083850312156112f7575f80fd5b611300836112be565b946020939093013593505050565b5f805f60608486031215611320575f80fd5b611329846112be565b9250611337602085016112be565b9150604084013590509250925092565b5f60208284031215611357575f80fd5b611360826112be565b9392505050565b5f805f805f805f60e0888a03121561137d575f80fd5b611386886112be565b9650611394602089016112be565b95506040880135945060608801359350608088013560ff811681146113b7575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f80604083850312156113e5575f80fd5b6113ee836112be565b91506113fc602084016112be565b90509250929050565b600181811c9082168061141957607f821691505b602082108103611450577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c6611456565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036114c6576114c6611456565b506001019056fea2646970667358221220176a1a9cf4a702d3853b858873fff4a6370c4e5d7d72d68593ec0ebe64fcc26964736f6c63430008140033", + "bytecode": "0x61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/VerifierRollupHelperMock.json b/compiled-contracts/VerifierRollupHelperMock.json index fcfa7ed2a..38a3b45b6 100644 --- a/compiled-contracts/VerifierRollupHelperMock.json +++ b/compiled-contracts/VerifierRollupHelperMock.json @@ -28,8 +28,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561000f575f80fd5b5061014e8061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c80639121da8a1461002d575b5f80fd5b61004361003b366004610084565b600192915050565b604051901515815260200160405180910390f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f80610320808486031215610097575f80fd5b6103008401858111156100a8575f80fd5b8493508561031f8601126100ba575f80fd5b604051602080820182811067ffffffffffffffff821117156100de576100de610057565b6040529286019281888511156100f2575f80fd5b5b8484101561010a57833581529281019281016100f3565b50949790965094505050505056fea26469706673582212200c852f4a1d01c92e0fb5e8f4280798a001f24ebd189c2b9b048aabb0266d233764736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610029575f3560e01c80639121da8a1461002d575b5f80fd5b61004361003b366004610084565b600192915050565b604051901515815260200160405180910390f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f80610320808486031215610097575f80fd5b6103008401858111156100a8575f80fd5b8493508561031f8601126100ba575f80fd5b604051602080820182811067ffffffffffffffff821117156100de576100de610057565b6040529286019281888511156100f2575f80fd5b5b8484101561010a57833581529281019281016100f3565b50949790965094505050505056fea26469706673582212200c852f4a1d01c92e0fb5e8f4280798a001f24ebd189c2b9b048aabb0266d233764736f6c63430008140033", + "bytecode": "0x608060405234801561000f575f80fd5b5061014e8061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c80639121da8a1461002d575b5f80fd5b61004361003b366004610084565b600192915050565b604051901515815260200160405180910390f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f80610320808486031215610097575f80fd5b6103008401858111156100a8575f80fd5b8493508561031f8601126100ba575f80fd5b604051602080820182811067ffffffffffffffff821117156100de576100de610057565b6040529286019281888511156100f2575f80fd5b5b8484101561010a57833581529281019281016100f3565b50949790965094505050505056fea2646970667358221220cd116917bfb356f793a2cef2885c134856a021af9708cf6e35bd8e053205c63b64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610029575f3560e01c80639121da8a1461002d575b5f80fd5b61004361003b366004610084565b600192915050565b604051901515815260200160405180910390f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f80610320808486031215610097575f80fd5b6103008401858111156100a8575f80fd5b8493508561031f8601126100ba575f80fd5b604051602080820182811067ffffffffffffffff821117156100de576100de610057565b6040529286019281888511156100f2575f80fd5b5b8484101561010a57833581529281019281016100f3565b50949790965094505050505056fea2646970667358221220cd116917bfb356f793a2cef2885c134856a021af9708cf6e35bd8e053205c63b64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/deployment/v2/verifyContracts.js b/deployment/v2/verifyContracts.js index fb67a027a..32724e331 100644 --- a/deployment/v2/verifyContracts.js +++ b/deployment/v2/verifyContracts.js @@ -90,7 +90,7 @@ async function main() { }, ); } catch (error) { - //expect(error.message.toLowerCase().includes('proxyadmin')).to.be.equal(true); + // expect(error.message.toLowerCase().includes('proxyadmin')).to.be.equal(true); } // verify global exit root address @@ -106,7 +106,7 @@ async function main() { }, ); } catch (error) { - //expect(error.message.toLowerCase().includes('proxyadmin')).to.be.equal(true); + // expect(error.message.toLowerCase().includes('proxyadmin')).to.be.equal(true); } try { @@ -154,18 +154,17 @@ async function main() { // expect(error.message.toLowerCase().includes('proxyadmin')).to.be.equal(true); } - // verify verifier - try { - await hre.run( - 'verify:verify', - { - address: createRollupOutputParameters.verifierAddress, - }, - ); - } catch (error) { - expect(error.message.toLowerCase().includes('already verified')).to.be.equal(true); - } - + // verify verifier + try { + await hre.run( + 'verify:verify', + { + address: createRollupOutputParameters.verifierAddress, + }, + ); + } catch (error) { + expect(error.message.toLowerCase().includes('already verified')).to.be.equal(true); + } // verify zkEVM address try { diff --git a/docs/mainnetUpgraded/PolygonZkEVMUpgraded.md b/docs/mainnetUpgraded/PolygonZkEVMUpgraded.md index d54b0070d..c06fe830a 100644 --- a/docs/mainnetUpgraded/PolygonZkEVMUpgraded.md +++ b/docs/mainnetUpgraded/PolygonZkEVMUpgraded.md @@ -1,5 +1,4 @@ Contract responsible for managing the state and the updates of the L2 network -This contract will NOT BE USED IN PRODUCTION, will be used only in testnet enviroment ## Functions diff --git a/docs/v2/PolygonRollupManager.md b/docs/v2/PolygonRollupManager.md index 243665578..a4d987575 100644 --- a/docs/v2/PolygonRollupManager.md +++ b/docs/v2/PolygonRollupManager.md @@ -5,7 +5,7 @@ Contract responsible for managing the exit roots across multiple Rollups ### constructor ```solidity function constructor( - contract IPolygonZkEVMGlobalExitRoot _globalExitRootManager, + contract IPolygonZkEVMGlobalExitRootV2 _globalExitRootManager, contract IERC20Upgradeable _pol, contract IPolygonZkEVMBridge _bridgeAddress ) public @@ -15,8 +15,8 @@ Contract responsible for managing the exit roots across multiple Rollups #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`_globalExitRootManager` | contract IPolygonZkEVMGlobalExitRoot | Global exit root manager address -|`_pol` | contract IERC20Upgradeable | MATIC token address +|`_globalExitRootManager` | contract IPolygonZkEVMGlobalExitRootV2 | Global exit root manager address +|`_pol` | contract IERC20Upgradeable | POL token address |`_bridgeAddress` | contract IPolygonZkEVMBridge | Bridge address ### initialize @@ -28,8 +28,10 @@ Contract responsible for managing the exit roots across multiple Rollups address admin, address timelock, address emergencyCouncil, - contract PolygonZkEVMV2Existent polygonZkEVM, - contract IVerifierRollup zkEVMVerifier + contract PolygonZkEVMExistentEtrog polygonZkEVM, + contract IVerifierRollup zkEVMVerifier, + uint64 zkEVMForkID, + uint64 zkEVMChainID ) external ``` @@ -43,8 +45,10 @@ Contract responsible for managing the exit roots across multiple Rollups |`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 +|`polygonZkEVM` | contract PolygonZkEVMExistentEtrog | New deployed Polygon zkEVM which will be initialized wiht previous values |`zkEVMVerifier` | contract IVerifierRollup | Verifier of the new zkEVM deployed +|`zkEVMForkID` | uint64 | Fork id of the new zkEVM deployed +|`zkEVMChainID` | uint64 | Chain id of the new zkEVM deployed ### addNewRollupType ```solidity @@ -62,11 +66,11 @@ Add a new rollup type #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`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 +|`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 ### obsoleteRollupType ```solidity @@ -90,7 +94,6 @@ Obsolete Rollup type address admin, address sequencer, address gasTokenAddress, - uint32 gasTokenNetwork, string sequencerURL, string networkName ) external @@ -102,13 +105,13 @@ Create a new rollup | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | |`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 +|`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 +Note if a wrapped token of the bridge is used, the original network and address of this wrapped will be used instead +|`sequencerURL` | string | Sequencer URL of the new created rollup +|`networkName` | string | Network name of the new created rollup ### addExistingRollup ```solidity @@ -128,12 +131,12 @@ note that this rollup does not follow any rollupType #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`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 +|`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 ### _addExistingRollup ```solidity @@ -142,7 +145,8 @@ note that this rollup does not follow any rollupType contract IVerifierRollup verifier, uint64 forkID, uint64 chainID, - uint8 rollupCompatibilityID + uint8 rollupCompatibilityID, + uint64 lastVerifiedBatch ) internal returns (struct PolygonRollupManager.RollupData rollup) ``` Add an already deployed rollup @@ -152,11 +156,12 @@ note that this rollup does not follow any rollupType #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`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 +|`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 +|`lastVerifiedBatch` | uint64 | Last verified batch before adding the rollup ### updateRollup ```solidity @@ -189,8 +194,8 @@ Sequence batches, callback called by one of the consensus managed by this contra #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`newSequencedBatches` | uint64 | how many sequenced batches were sequenced -|`newAccInputHash` | bytes32 | new accumualted input hash +|`newSequencedBatches` | uint64 | Number of batches sequenced +|`newAccInputHash` | bytes32 | New accumulate input hash ### verifyBatches ```solidity @@ -215,10 +220,10 @@ Allows an aggregator to verify multiple batches |`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` | bytes32 | 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 |`beneficiary` | address | Address that will receive the verification reward -|`proof` | bytes32[24] | fflonk proof +|`proof` | bytes32[24] | Fflonk proof ### verifyBatchesTrustedAggregator ```solidity @@ -243,10 +248,10 @@ Allows an aggregator to verify multiple batches |`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` | bytes32 | 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 |`beneficiary` | address | Address that will receive the verification reward -|`proof` | bytes32[24] | fflonk proof +|`proof` | bytes32[24] | Fflonk proof ### _verifyAndRewardBatches ```solidity @@ -266,13 +271,13 @@ Verify and reward batches internal function #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`rollup` | struct PolygonRollupManager.RollupData | Rollup Data struct that will be used to the verification +|`rollup` | struct PolygonRollupManager.RollupData | Rollup Data storage pointer 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` | bytes32 | 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` | address | fflonk proof +|`proof` | address | Fflonk proof ### _tryConsolidatePendingState ```solidity @@ -287,7 +292,8 @@ It tries to consolidate the first and the middle pending state in the queue ### consolidatePendingState ```solidity function consolidatePendingState( - uint32 pendingStateNum + uint32 rollupID, + uint64 pendingStateNum ) external ``` Allows to consolidate any pending state that has already exceed the pendingStateTimeout @@ -297,12 +303,14 @@ Can be called by the trusted aggregator, which can consolidate any state without #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`pendingStateNum` | uint32 | Pending state to consolidate +|`rollupID` | uint32 | Rollup identifier +|`pendingStateNum` | uint64 | Pending state to consolidate ### _consolidatePendingState ```solidity function _consolidatePendingState( - struct PolygonRollupManager.RollupData pendingStateNum + struct PolygonRollupManager.RollupData rollup, + uint64 pendingStateNum ) internal ``` Internal function to consolidate any pending state that has already exceed the pendingStateTimeout @@ -311,7 +319,8 @@ Internal function to consolidate any pending state that has already exceed the p #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`pendingStateNum` | struct PolygonRollupManager.RollupData | Pending state to consolidate +|`rollup` | struct PolygonRollupManager.RollupData | Rollup data storage pointer +|`pendingStateNum` | uint64 | Pending state to consolidate ### overridePendingState ```solidity @@ -340,7 +349,7 @@ if it's possible to prove a different state root given the same batches |`finalNewBatch` | uint64 | Last batch aggregator intends to verify |`newLocalExitRoot` | bytes32 | New local exit root once the batch is processed |`newStateRoot` | bytes32 | New State root once the batch is processed -|`proof` | bytes32[24] | fflonk proof +|`proof` | bytes32[24] | Fflonk proof ### proveNonDeterministicPendingState ```solidity @@ -368,7 +377,7 @@ Allows to halt the PolygonZkEVM if its possible to prove a different state root |`finalNewBatch` | uint64 | Last batch aggregator intends to verify |`newLocalExitRoot` | bytes32 | New local exit root once the batch is processed |`newStateRoot` | bytes32 | New State root once the batch is processed -|`proof` | bytes32[24] | fflonk proof +|`proof` | bytes32[24] | Fflonk proof ### _proveDistinctPendingState ```solidity @@ -396,7 +405,7 @@ Internal function that proves a different state root given the same batches to v |`finalNewBatch` | uint64 | Last batch aggregator intends to verify |`newLocalExitRoot` | bytes32 | New local exit root once the batch is processed |`newStateRoot` | bytes32 | New State root once the batch is processed -|`proof` | bytes32[24] | fflonk proof +|`proof` | bytes32[24] | Fflonk proof ### _updateBatchFee ```solidity @@ -419,7 +428,7 @@ The batch fee will not be updated when the trusted aggregator verifies batches ) 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 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 and an emergency state was not happened in the same period @@ -447,7 +456,7 @@ Internal function to activate emergency state on both PolygonZkEVM and PolygonZk uint64 newTrustedAggregatorTimeout ) external ``` -Allow the admin to set a new pending state timeout +Set a new pending state timeout The timeout can only be lowered, except if emergency state is active @@ -462,7 +471,7 @@ The timeout can only be lowered, except if emergency state is active uint64 newPendingStateTimeout ) external ``` -Allow the admin to set a new trusted aggregator timeout +Set a new trusted aggregator timeout The timeout can only be lowered, except if emergency state is active @@ -477,7 +486,7 @@ The timeout can only be lowered, except if emergency state is active uint16 newMultiplierBatchFee ) external ``` -Allow the admin to set a new multiplier batch fee +Set a new multiplier batch fee #### Parameters: @@ -491,7 +500,7 @@ Allow the admin to set a new multiplier batch fee uint64 newVerifyBatchTimeTarget ) external ``` -Allow the admin to set a new verify batch time target +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 @@ -507,7 +516,7 @@ the trustedAggregatorTimeout should be zero or very close to zero uint256 newBatchFee ) external ``` -Allow to corresponding role to set the current batch fee +Set the current batch fee #### Parameters: @@ -549,22 +558,36 @@ Get the last verified batch ### isPendingStateConsolidable ```solidity function isPendingStateConsolidable( + uint32 rollupID, + uint64 pendingStateNum ) public returns (bool) ``` Returns a boolean that indicates if the pendingStateNum is or not consolidable -Note that his function does not check if the pending state currently exists, or if it's consolidated already +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`rollupID` | uint32 | Rollup id +|`pendingStateNum` | uint64 | Pending state number to check +Note that his function does not check if the pending state currently exists, or if it's consolidated already ### _isPendingStateConsolidable ```solidity function _isPendingStateConsolidable( + struct PolygonRollupManager.RollupData rollup, + uint64 pendingStateNum ) internal returns (bool) ``` Returns a boolean that indicates if the pendingStateNum is or not consolidable -Note that his function does not check if the pending state currently exists, or if it's consolidated already +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`rollup` | struct PolygonRollupManager.RollupData | Rollup data storage pointer +|`pendingStateNum` | uint64 | Pending state number to check +Note that his function does not check if the pending state currently exists, or if it's consolidated already ### calculateRewardPerBatch ```solidity @@ -598,9 +621,10 @@ Get forced batch fee ### getInputSnarkBytes ```solidity function getInputSnarkBytes( - uint32 initNumBatch, + uint32 rollupID, + uint64 initNumBatch, uint64 finalNewBatch, - uint64 newLocalExitRoot, + bytes32 newLocalExitRoot, bytes32 oldStateRoot, bytes32 newStateRoot ) public returns (bytes) @@ -611,18 +635,20 @@ Function to calculate the input snark bytes #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`initNumBatch` | uint32 | Batch which the aggregator starts the verification +|`rollupID` | uint32 | Rollup id used to calculate the input snark bytes +|`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 |`oldStateRoot` | bytes32 | State root before batch is processed |`newStateRoot` | bytes32 | New State root once the batch is processed ### _getInputSnarkBytes ```solidity function _getInputSnarkBytes( - struct PolygonRollupManager.RollupData initNumBatch, + struct PolygonRollupManager.RollupData rollup, + uint64 initNumBatch, uint64 finalNewBatch, - uint64 newLocalExitRoot, + bytes32 newLocalExitRoot, bytes32 oldStateRoot, bytes32 newStateRoot ) internal returns (bytes) @@ -633,47 +659,74 @@ Function to calculate the input snark bytes #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`initNumBatch` | struct PolygonRollupManager.RollupData | Batch which the aggregator starts the verification +|`rollup` | struct PolygonRollupManager.RollupData | Rollup data storage pointer +|`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 |`oldStateRoot` | bytes32 | State root before batch is processed |`newStateRoot` | bytes32 | New State root once the batch is processed ### _checkStateRootInsidePrime ```solidity function _checkStateRootInsidePrime( + uint256 newStateRoot ) internal returns (bool) ``` +Function to check if the state root is inside of the prime field - +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`newStateRoot` | uint256 | New State root once the batch is processed ### getRollupBatchNumToStateRoot ```solidity function getRollupBatchNumToStateRoot( + uint32 rollupID, + uint64 batchNum ) public returns (bytes32) ``` -Get the last verified batch +Get rollup state root given a batch number +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`rollupID` | uint32 | Rollup identifier +|`batchNum` | uint64 | Batch number ### getRollupSequencedBatches ```solidity function getRollupSequencedBatches( + uint32 rollupID, + uint64 batchNum ) public returns (struct LegacyZKEVMStateVariables.SequencedBatchData) ``` -Get the last verified batch +Get rollup sequence batches struct given a batch number +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`rollupID` | uint32 | Rollup identifier +|`batchNum` | uint64 | Batch number ### getRollupPendingStateTransitions ```solidity function getRollupPendingStateTransitions( + uint32 rollupID, + uint64 batchNum ) public returns (struct LegacyZKEVMStateVariables.PendingState) ``` -Get the last verified batch +Get rollup sequence pending state struct given a batch number +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`rollupID` | uint32 | Rollup identifier +|`batchNum` | uint64 | Batch number ## Events ### AddNewRollupType @@ -690,7 +743,7 @@ Emitted when a new rollup type is added ) ``` -Emitted when a a rolup type is deleted +Emitted when a a rolup type is obsoleted ### CreateNewRollup ```solidity @@ -730,7 +783,7 @@ Emitted when a new verifier is added ) ``` -Emitted when a aggregator verifies batches +Emitted when an aggregator verifies batches ### VerifyBatchesTrustedAggregator ```solidity @@ -738,7 +791,7 @@ Emitted when a aggregator verifies batches ) ``` -Emitted when a aggregator verifies batches +Emitted when the trusted aggregator verifies batches ### ConsolidatePendingState ```solidity @@ -770,7 +823,7 @@ Emitted when the trusted aggregator overrides pending state ) ``` -Emitted when the admin updates the trusted aggregator timeout +Emitted when is updated the trusted aggregator timeout ### SetPendingStateTimeout ```solidity @@ -778,7 +831,7 @@ Emitted when the admin updates the trusted aggregator timeout ) ``` -Emitted when the admin updates the pending state timeout +Emitted when is updated the pending state timeout ### SetMultiplierBatchFee ```solidity @@ -786,7 +839,7 @@ Emitted when the admin updates the pending state timeout ) ``` -Emitted when the admin updates the multiplier batch fee +Emitted when is updated the multiplier batch fee ### SetVerifyBatchTimeTarget ```solidity @@ -794,7 +847,7 @@ Emitted when the admin updates the multiplier batch fee ) ``` -Emitted when the admin updates the verify batch timeout +Emitted when is updated the verify batch timeout ### SetTrustedAggregator ```solidity @@ -802,7 +855,7 @@ Emitted when the admin updates the verify batch timeout ) ``` -Emitted when the admin updates the trusted aggregator address +Emitted when is updated the trusted aggregator address ### SetBatchFee ```solidity @@ -810,5 +863,5 @@ Emitted when the admin updates the trusted aggregator address ) ``` -Emitted when the batch fee is set +Emitted when is updated the batch fee diff --git a/docs/v2/PolygonZkEVMBridgeV2.md b/docs/v2/PolygonZkEVMBridgeV2.md index 5a033b0b8..d6c70a974 100644 --- a/docs/v2/PolygonZkEVMBridgeV2.md +++ b/docs/v2/PolygonZkEVMBridgeV2.md @@ -3,6 +3,15 @@ Contract responsible to manage the token interactions with other networks ## Functions +### constructor +```solidity + function constructor( + ) public +``` +Disable initalizers on the implementation following the best practices + + + ### initialize ```solidity function initialize( @@ -42,6 +51,7 @@ note If this function is called with a reentrant token, it would be possible to 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 +note User/UI must be aware of the existing/available networks when choosing the destination network #### Parameters: @@ -64,6 +74,7 @@ do not call any external address in that case ) external ``` Bridge message and send ETH value +note User/UI must be aware of the existing/available networks when choosing the destination network #### Parameters: @@ -85,6 +96,7 @@ Bridge message and send ETH value ) external ``` Bridge message and send ETH value +note User/UI must be aware of the existing/available networks when choosing the destination network #### Parameters: @@ -143,11 +155,12 @@ Verify merkle proof and withdraw tokens/ether |`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] +| 191 bits | 1 bit | 32 bits | 32 bits | +| 0 | mainnetFlag | rollupIndex | localRootIndex | 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 +to avoid possible synch attacks |`mainnetExitRoot` | bytes32 | Mainnet exit root |`rollupExitRoot` | bytes32 | Rollup exit root |`originNetwork` | uint32 | Origin network @@ -185,11 +198,12 @@ will not trigger any execution |`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] +| 191 bits | 1 bit | 32 bits | 32 bits | +| 0 | mainnetFlag | rollupIndex | localRootIndex | 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 +to avoid possible synch attacks |`mainnetExitRoot` | bytes32 | Mainnet exit root |`rollupExitRoot` | bytes32 | Rollup exit root |`originNetwork` | uint32 | Origin network @@ -207,7 +221,7 @@ To avoid possible synch attacks string name, string symbol, uint8 decimals - ) external returns (address) + ) public returns (address) ``` Returns the precalculated address of a wrapper using the token information Note Updating the metadata of a token is not supported. @@ -298,7 +312,7 @@ Function to check if an index is claimed or not | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | |`leafIndex` | uint32 | Index -|`sourceBridgeNetwork` | uint32 | origin network +|`sourceBridgeNetwork` | uint32 | Origin network ### updateGlobalExitRoot ```solidity @@ -335,6 +349,23 @@ Function to call token permit method of extended ERC20 |`amount` | address | Quantity that is expected to be allowed |`permitData` | uint256 | Raw data of the call `permit` of the token +### _deployWrappedToken +```solidity + function _deployWrappedToken( + bytes32 salt, + bytes constructorArgs + ) internal returns (contract TokenWrapped newWrappedToken) +``` +Internal function that uses create2 to deploy the wrapped tokens + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`salt` | bytes32 | Salt used in create2 params, +tokenInfoHash will be used as salt for all wrappeds except for bridge native WETH, that will be bytes32(0) +|`constructorArgs` | bytes | Encoded constructor args for the wrapped token + ### _safeSymbol ```solidity function _safeSymbol( @@ -393,6 +424,41 @@ returns 'NOT_VALID_ENCODING' as fallback value. | :--- | :--- | :------------------------------------------------------------------- | |`data` | bytes | returned data +### getTokenMetadata +```solidity + function getTokenMetadata( + address token + ) public returns (bytes) +``` +Returns the encoded token metadata + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`token` | address | Address of the token + +### calculateTokenWrapperAddress +```solidity + function calculateTokenWrapperAddress( + uint32 originNetwork, + address originTokenAddress, + address token + ) external returns (address) +``` +Returns the precalculated address of a wrapper using the token address +Note Updating the metadata of a token is not supported. +Since the metadata has relevance in the address deployed, this function will not return a valid +wrapped address if the metadata provided is not the original one. + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`originNetwork` | uint32 | Origin network +|`originTokenAddress` | address | Origin token address, 0 address is reserved for ether +|`token` | address | Address of the token to calculate the wrapper address + ## Events ### BridgeEvent ```solidity diff --git a/docs/v2/PolygonZkEVMGlobalExitRootV2.md b/docs/v2/PolygonZkEVMGlobalExitRootV2.md index d6127a2e9..12d927980 100644 --- a/docs/v2/PolygonZkEVMGlobalExitRootV2.md +++ b/docs/v2/PolygonZkEVMGlobalExitRootV2.md @@ -40,10 +40,37 @@ Return last global exit root +### getRoot +```solidity + function getRoot( + ) public returns (bytes32) +``` +Computes and returns the merkle root of the L1InfoTree + + + +### getLeafValue +```solidity + function getLeafValue( + bytes32 newGlobalExitRoot, + uint256 lastBlockHash, + uint64 timestamp + ) public returns (bytes32) +``` +Given the leaf data returns the leaf hash + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`newGlobalExitRoot` | bytes32 | Last global exit root +|`lastBlockHash` | uint256 | Last accesible block hash +|`timestamp` | uint64 | Ethereum timestamp in seconds + ## Events -### UpdateGlobalExitRoot +### UpdateL1InfoTree ```solidity - event UpdateGlobalExitRoot( + event UpdateL1InfoTree( ) ``` diff --git a/docs/v2/consensus/validium/PolygonDataCommittee.md b/docs/v2/consensus/validium/PolygonDataCommittee.md new file mode 100644 index 000000000..a136252c1 --- /dev/null +++ b/docs/v2/consensus/validium/PolygonDataCommittee.md @@ -0,0 +1,93 @@ + + + +## Functions +### constructor +```solidity + function constructor( + ) public +``` +Disable initalizers on the implementation following the best practices + + + +### 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 + +### verifyMessage +```solidity + function verifyMessage( + 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 + +### getAmountOfMembers +```solidity + function getAmountOfMembers( + ) public returns (uint256) +``` +Return the amount of committee members + + + +### getProcotolName +```solidity + function getProcotolName( + ) external returns (string) +``` +Return the protocol name + + + +## 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/validium/PolygonValidiumEtrog.md b/docs/v2/consensus/validium/PolygonValidiumEtrog.md new file mode 100644 index 000000000..98f51394b --- /dev/null +++ b/docs/v2/consensus/validium/PolygonValidiumEtrog.md @@ -0,0 +1,110 @@ +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 IPolygonZkEVMGlobalExitRootV2 _globalExitRootManager, + contract IERC20Upgradeable _pol, + contract IPolygonZkEVMBridgeV2 _bridgeAddress, + contract PolygonRollupManager _rollupManager + ) public +``` + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`_globalExitRootManager` | contract IPolygonZkEVMGlobalExitRootV2 | Global exit root manager address +|`_pol` | contract IERC20Upgradeable | POL token address +|`_bridgeAddress` | contract IPolygonZkEVMBridgeV2 | Bridge address +|`_rollupManager` | contract PolygonRollupManager | Global exit root manager address + +### sequenceBatchesValidium +```solidity + function sequenceBatchesValidium( + struct PolygonValidiumEtrog.ValidiumBatchData[] batches, + address l2Coinbase, + bytes dataAvailabilityMessage + ) external +``` +Allows a sequencer to send multiple batches + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`batches` | struct PolygonValidiumEtrog.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 +note Pol is not a reentrant token + +### sequenceBatches +```solidity + function sequenceBatches( + struct PolygonRollupBaseEtrog.BatchData[] batches, + address l2Coinbase + ) public +``` +Allows a sequencer to send multiple batches sending all the data, and without using the dataAvailabilityProtocol + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`batches` | struct PolygonRollupBaseEtrog.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 + +### setDataAvailabilityProtocol +```solidity + function setDataAvailabilityProtocol( + contract IDataAvailabilityProtocol newDataAvailabilityProtocol + ) external +``` +Allow the admin to set a new data availability protocol + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`newDataAvailabilityProtocol` | contract IDataAvailabilityProtocol | Address of the new data availability protocol + +### switchSequenceWithDataAvailability +```solidity + function switchSequenceWithDataAvailability( + bool newIsSequenceWithDataAvailabilityAllowed + ) external +``` +Allow the admin to switch the sequence with data availability + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`newIsSequenceWithDataAvailabilityAllowed` | bool | Boolean to switch + +## Events +### SetDataAvailabilityProtocol +```solidity + event SetDataAvailabilityProtocol( + ) +``` + +Emitted when the admin updates the data availability protocol + +### SwitchSequenceWithDataAvailability +```solidity + event SwitchSequenceWithDataAvailability( + ) +``` + +Emitted when switch the ability to sequence with data availability + diff --git a/docs/v2/consensus/zkEVM/PolygonZkEVMEtrog.md b/docs/v2/consensus/zkEVM/PolygonZkEVMEtrog.md new file mode 100644 index 000000000..8a7082a6e --- /dev/null +++ b/docs/v2/consensus/zkEVM/PolygonZkEVMEtrog.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 IPolygonZkEVMGlobalExitRootV2 _globalExitRootManager, + contract IERC20Upgradeable _pol, + contract IPolygonZkEVMBridgeV2 _bridgeAddress, + contract PolygonRollupManager _rollupManager + ) public +``` + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`_globalExitRootManager` | contract IPolygonZkEVMGlobalExitRootV2 | Global exit root manager address +|`_pol` | contract IERC20Upgradeable | POL token address +|`_bridgeAddress` | contract IPolygonZkEVMBridgeV2 | Bridge address +|`_rollupManager` | contract PolygonRollupManager | Global exit root manager address + diff --git a/docs/v2/consensus/zkEVM/PolygonZkEVMExistentEtrog.md b/docs/v2/consensus/zkEVM/PolygonZkEVMExistentEtrog.md new file mode 100644 index 000000000..426eb2d4c --- /dev/null +++ b/docs/v2/consensus/zkEVM/PolygonZkEVMExistentEtrog.md @@ -0,0 +1,60 @@ +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 IPolygonZkEVMGlobalExitRootV2 _globalExitRootManager, + contract IERC20Upgradeable _pol, + contract IPolygonZkEVMBridgeV2 _bridgeAddress, + contract PolygonRollupManager _rollupManager + ) public +``` + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`_globalExitRootManager` | contract IPolygonZkEVMGlobalExitRootV2 | Global exit root manager address +|`_pol` | contract IERC20Upgradeable | POL token address +|`_bridgeAddress` | contract IPolygonZkEVMBridgeV2 | Bridge address +|`_rollupManager` | contract PolygonRollupManager | Global exit root manager address + +### initializeUpgrade +```solidity + function initializeUpgrade( + address _admin, + address _trustedSequencer, + string _trustedSequencerURL, + string _networkName, + bytes32 _lastAccInputHash + ) 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 + +## Events +### UpdateEtrogSequence +```solidity + event UpdateEtrogSequence( + ) +``` + +Emitted when the system is updated to a etrog using this contract, contain the set up etrog transaction + diff --git a/docs/v2/interfaces/IDataAvailabilityProtocol.md b/docs/v2/interfaces/IDataAvailabilityProtocol.md new file mode 100644 index 000000000..29a982770 --- /dev/null +++ b/docs/v2/interfaces/IDataAvailabilityProtocol.md @@ -0,0 +1,22 @@ + + + +## Functions +### getProcotolName +```solidity + function getProcotolName( + ) external returns (string) +``` + + + + +### verifyMessage +```solidity + function verifyMessage( + ) external +``` + + + + diff --git a/docs/v2/interfaces/IPolygonDataCommitteeErrors.md b/docs/v2/interfaces/IPolygonDataCommitteeErrors.md new file mode 100644 index 000000000..b28b04f64 --- /dev/null +++ b/docs/v2/interfaces/IPolygonDataCommitteeErrors.md @@ -0,0 +1,3 @@ + + + diff --git a/docs/v2/interfaces/IPolygonValidium.md b/docs/v2/interfaces/IPolygonValidium.md new file mode 100644 index 000000000..b28b04f64 --- /dev/null +++ b/docs/v2/interfaces/IPolygonValidium.md @@ -0,0 +1,3 @@ + + + diff --git a/docs/v2/interfaces/IPolygonZkEVMBridgeV2.md b/docs/v2/interfaces/IPolygonZkEVMBridgeV2.md index 765f09ec5..42e4f5fd4 100644 --- a/docs/v2/interfaces/IPolygonZkEVMBridgeV2.md +++ b/docs/v2/interfaces/IPolygonZkEVMBridgeV2.md @@ -2,6 +2,24 @@ ## Functions +### wrappedTokenToTokenInfo +```solidity + function wrappedTokenToTokenInfo( + ) external returns (uint32, address) +``` + + + + +### updateGlobalExitRoot +```solidity + function updateGlobalExitRoot( + ) external +``` + + + + ### activateEmergencyState ```solidity function activateEmergencyState( @@ -20,6 +38,24 @@ +### bridgeAsset +```solidity + function bridgeAsset( + ) external +``` + + + + +### bridgeMessage +```solidity + function bridgeMessage( + ) external +``` + + + + ### bridgeMessageWETH ```solidity function bridgeMessageWETH( @@ -29,3 +65,39 @@ +### claimAsset +```solidity + function claimAsset( + ) external +``` + + + + +### claimMessage +```solidity + function claimMessage( + ) external +``` + + + + +### initialize +```solidity + function initialize( + ) external +``` + + + + +### getTokenMetadata +```solidity + function getTokenMetadata( + ) external returns (bytes) +``` + + + + diff --git a/docs/v2/interfaces/IPolygonZkEVMGlobalExitRootV2.md b/docs/v2/interfaces/IPolygonZkEVMGlobalExitRootV2.md new file mode 100644 index 000000000..492ce7346 --- /dev/null +++ b/docs/v2/interfaces/IPolygonZkEVMGlobalExitRootV2.md @@ -0,0 +1,22 @@ + + + +## Functions +### getLastGlobalExitRoot +```solidity + function getLastGlobalExitRoot( + ) external returns (bytes32) +``` + + + + +### getRoot +```solidity + function getRoot( + ) external returns (bytes32) +``` + + + + diff --git a/docs/v2/interfaces/IPolygonZkEVMVEtrogErrors.md b/docs/v2/interfaces/IPolygonZkEVMVEtrogErrors.md new file mode 100644 index 000000000..b28b04f64 --- /dev/null +++ b/docs/v2/interfaces/IPolygonZkEVMVEtrogErrors.md @@ -0,0 +1,3 @@ + + + diff --git a/docs/v2/lib/DepositContractBase.md b/docs/v2/lib/DepositContractBase.md index 98d0b10b3..adb725ac8 100644 --- a/docs/v2/lib/DepositContractBase.md +++ b/docs/v2/lib/DepositContractBase.md @@ -54,7 +54,7 @@ Verify merkle proof uint32 index ) public returns (bytes32) ``` -calcualte root from merkle proof +Calculate root from merkle proof #### Parameters: diff --git a/docs/v2/lib/DepositContractV2.md b/docs/v2/lib/DepositContractV2.md index 9b73756b0..1357d1199 100644 --- a/docs/v2/lib/DepositContractV2.md +++ b/docs/v2/lib/DepositContractV2.md @@ -1,5 +1,5 @@ -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 +This contract will be used in the PolygonZkEVMBridge contract, it inherits the DepositContractBase and adds the logic +to calculate the leaf of the tree ## Functions diff --git a/docs/v2/lib/PolygonConstantsBase.md b/docs/v2/lib/PolygonConstantsBase.md new file mode 100644 index 000000000..f50060aa8 --- /dev/null +++ b/docs/v2/lib/PolygonConstantsBase.md @@ -0,0 +1,3 @@ +This contract will contain the constants used across different contracts + + diff --git a/docs/v2/lib/PolygonRollupBaseEtrog.md b/docs/v2/lib/PolygonRollupBaseEtrog.md new file mode 100644 index 000000000..eea8dc792 --- /dev/null +++ b/docs/v2/lib/PolygonRollupBaseEtrog.md @@ -0,0 +1,319 @@ +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 IPolygonZkEVMGlobalExitRootV2 _globalExitRootManager, + contract IERC20Upgradeable _pol, + contract IPolygonZkEVMBridgeV2 _bridgeAddress, + contract PolygonRollupManager _rollupManager + ) public +``` + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`_globalExitRootManager` | contract IPolygonZkEVMGlobalExitRootV2 | Global exit root manager address +|`_pol` | contract IERC20Upgradeable | POL token address +|`_bridgeAddress` | contract IPolygonZkEVMBridgeV2 | Bridge address +|`_rollupManager` | contract PolygonRollupManager | Global exit root manager address + +### initialize +```solidity + function initialize( + address _admin, + address sequencer, + uint32 networkID, + address _gasTokenAddress, + 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 in mainnet that will be used as a gas token +Note if a wrapped token of the bridge is used, the original network and address of this wrapped are used instead +|`sequencerURL` | string | Trusted sequencer URL +|`_networkName` | string | L2 network name + +### sequenceBatches +```solidity + function sequenceBatches( + struct PolygonRollupBaseEtrog.BatchData[] batches, + address l2Coinbase + ) public +``` +Allows a sequencer to send multiple batches + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`batches` | struct PolygonRollupBaseEtrog.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+ +note Pol is not a reentrant token + +### 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 PolygonRollupBaseEtrog.BatchData[] 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 PolygonRollupBaseEtrog.BatchData[] | 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 + +### setForceBatchAddress +```solidity + function setForceBatchAddress( + address newForceBatchAddress + ) external +``` +Allow the admin to change the force batch address, that will be allowed to force batches +If address 0 is set, then everyone is able to force batches, this action is irreversible + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`newForceBatchAddress` | address | New force batch address + +### 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 + +### 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 + +### InitialSequenceBatches +```solidity + event InitialSequenceBatches( + ) +``` + +Emitted when the contract is initialized, contain the first sequenced transaction + +### 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 + +### SetForceBatchAddress +```solidity + event SetForceBatchAddress( + ) +``` + +Emitted when the admin update the force batch address + +### 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 index c185c41e4..47a1a0f56 100644 --- a/docs/v2/lib/PolygonTransparentProxy.md +++ b/docs/v2/lib/PolygonTransparentProxy.md @@ -2,7 +2,6 @@ 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 diff --git a/docs/v2/lib/PolygonZkEVMGlobalExitRootBaseStorage.md b/docs/v2/lib/PolygonZkEVMGlobalExitRootBaseStorage.md new file mode 100644 index 000000000..025a902f6 --- /dev/null +++ b/docs/v2/lib/PolygonZkEVMGlobalExitRootBaseStorage.md @@ -0,0 +1,4 @@ +Since the current contract of PolygonZkEVMGlobalExitRoot will be upgraded to a PolygonZkEVMGlobalExitRootV2, and it will implement +the DepositContractBase, this base is needed to preserve the previous storage slots + + diff --git a/docs/v2/mocks/PolygonRollupManagerEmptyMock.md b/docs/v2/mocks/PolygonRollupManagerEmptyMock.md new file mode 100644 index 000000000..cc8bc863f --- /dev/null +++ b/docs/v2/mocks/PolygonRollupManagerEmptyMock.md @@ -0,0 +1,67 @@ +PolygonRollupManager used only to test conensus contracts + + +## Functions +### onSequenceBatches +```solidity + function onSequenceBatches( + ) external returns (uint64) +``` + + + + +### onVerifyBatches +```solidity + function onVerifyBatches( + ) external returns (uint64) +``` + + + + +### getBatchFee +```solidity + function getBatchFee( + ) public returns (uint256) +``` + + + + +### getForcedBatchFee +```solidity + function getForcedBatchFee( + ) public returns (uint256) +``` + + + + +### activateEmergencyState +```solidity + function activateEmergencyState( + ) external +``` +Function to deactivate emergency state on both PolygonZkEVM and PolygonZkEVMBridge contracts + + + +### lastDeactivatedEmergencyStateTimestamp +```solidity + function lastDeactivatedEmergencyStateTimestamp( + ) external returns (uint256) +``` +Function to deactivate emergency state on both PolygonZkEVM and PolygonZkEVMBridge contracts + + + +### deactivateEmergencyState +```solidity + function deactivateEmergencyState( + ) external +``` +Function to deactivate emergency state on both PolygonZkEVM and PolygonZkEVMBridge contracts + + + diff --git a/docs/v2/mocks/PolygonRollupManagerMock.md b/docs/v2/mocks/PolygonRollupManagerMock.md index 003c764d9..4ef467459 100644 --- a/docs/v2/mocks/PolygonRollupManagerMock.md +++ b/docs/v2/mocks/PolygonRollupManagerMock.md @@ -5,7 +5,7 @@ PolygonRollupManager mock ### constructor ```solidity function constructor( - contract IPolygonZkEVMGlobalExitRoot _globalExitRootManager, + contract IPolygonZkEVMGlobalExitRootV2 _globalExitRootManager, contract IERC20Upgradeable _pol, contract IPolygonZkEVMBridge _bridgeAddress ) public @@ -15,7 +15,7 @@ PolygonRollupManager mock #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`_globalExitRootManager` | contract IPolygonZkEVMGlobalExitRoot | Global exit root manager address +|`_globalExitRootManager` | contract IPolygonZkEVMGlobalExitRootV2 | Global exit root manager address |`_pol` | contract IERC20Upgradeable | MATIC token address |`_bridgeAddress` | contract IPolygonZkEVMBridge | Bridge address diff --git a/docs/v2/mocks/PolygonRollupManagerMockInternalTest.md b/docs/v2/mocks/PolygonRollupManagerMockInternalTest.md new file mode 100644 index 000000000..dd333a250 --- /dev/null +++ b/docs/v2/mocks/PolygonRollupManagerMockInternalTest.md @@ -0,0 +1,30 @@ +PolygonRollupManager Test + + +## Functions +### constructor +```solidity + function constructor( + contract IPolygonZkEVMGlobalExitRootV2 _globalExitRootManager, + contract IERC20Upgradeable _pol, + contract IPolygonZkEVMBridge _bridgeAddress + ) public +``` + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`_globalExitRootManager` | contract IPolygonZkEVMGlobalExitRootV2 | Global exit root manager address +|`_pol` | contract IERC20Upgradeable | MATIC token address +|`_bridgeAddress` | contract IPolygonZkEVMBridge | Bridge address + +### initialize +```solidity + function initialize( + ) external +``` + + + + diff --git a/package-lock.json b/package-lock.json index d7ed0d6a6..8d7f98dd7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -105,10 +105,17 @@ "node": ">=0.10.0" } }, - "node_modules/@babel/runtime": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz", - "integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==", + "node_modules/@adraffy/ens-normalize": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz", + "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==", + "dev": true, + "peer": true + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.2.2.tgz", + "integrity": "sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g==", "dev": true, "dependencies": { "@aws-crypto/util": "^1.2.2", @@ -3452,9 +3459,9 @@ } }, "node_modules/@openzeppelin/upgrades-core": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.28.0.tgz", - "integrity": "sha512-8RKlyg98Adv+46GxDaR0awL3R8bVCcQ27DcSEwrgWOp6siHh8sZg4a2l+2dhPl1510S6uBfhHSydMH5VX2BV5g==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.32.0.tgz", + "integrity": "sha512-ZjYB5Ks5Haz8yzJDd9VzTtJyqm746+WYFOi8jeVljyGxC4Xm2wuizf/n1lw0CmCw9seNhD1J1tA4fA6ScXYPDg==", "dev": true, "dependencies": { "cbor": "^9.0.0", @@ -4175,10 +4182,13 @@ "peer": true }, "node_modules/@types/node": { - "version": "20.5.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", - "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==", - "dev": true + "version": "20.8.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.6.tgz", + "integrity": "sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ==", + "dev": true, + "dependencies": { + "undici-types": "~5.25.1" + } }, "node_modules/@types/node-fetch": { "version": "2.6.6", @@ -5121,19 +5131,6 @@ "safe-buffer": "^5.1.1" } }, - "node_modules/bufferutil": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", - "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", - "devOptional": true, - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -5919,6 +5916,20 @@ "node": ">=6" } }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-properties": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", @@ -16966,9 +16977,9 @@ } }, "node_modules/hardhat": { - "version": "2.17.2", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.17.2.tgz", - "integrity": "sha512-oUv40jBeHw0dKpbyQ+iH9cmNMziweLoTW3MnkNxJ2Gc0KGLrQR/1n4vV4xY60zn2LdmRgnwPqy3CgtY0mfwIIA==", + "version": "2.19.2", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.19.2.tgz", + "integrity": "sha512-CRU3+0Cc8Qh9UpxKd8cLADDPes7ZDtKj4dTK+ERtLBomEzhRPLWklJn4VKOwjre9/k8GNd/e9DYxpfuzcxbXPQ==", "dev": true, "dependencies": { "@ethersproject/abi": "^5.1.2", @@ -18778,6 +18789,8 @@ "version": "2.3.7", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "peer": true, "dependencies": { "get-func-name": "^2.0.1" } @@ -20617,9 +20630,9 @@ "dev": true }, "node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "dependencies": { "is-core-module": "^2.13.0", @@ -22634,9 +22647,9 @@ } }, "node_modules/undici": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.24.0.tgz", - "integrity": "sha512-OKlckxBjFl0oXxcj9FU6oB8fDAaiRUq+D8jrFWGmOfI/gIyjk/IeS75LMzgYKUaeHzLUcYvf9bbJGSrUwTfwwQ==", + "version": "5.26.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.3.tgz", + "integrity": "sha512-H7n2zmKEWgOllKkIUkLvFmsJQj062lSm3uA4EYApG8gLuiOM0/go9bIoC3HVaSnfg4xunowDE2i9p8drkXuvDw==", "dev": true, "dependencies": { "@fastify/busboy": "^2.0.0" @@ -22651,6 +22664,12 @@ "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==", "dev": true }, + "node_modules/unfetch": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", + "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==", + "dev": true + }, "node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -23194,21437 +23213,5 @@ "url": "https://github.com/sponsors/sindresorhus" } } - }, - "dependencies": { - "@0xpolygonhermez/zkevm-commonjs": { - "version": "git+ssh://git@github.com/0xPolygonHermez/zkevm-commonjs.git#035c6ae54ebdf2164bf8a97bb7fc38cb8127c9dd", - "dev": true, - "from": "@0xpolygonhermez/zkevm-commonjs@github:0xPolygonHermez/zkevm-commonjs#v2.0.0-fork.5", - "requires": { - "@ethereumjs/block": "^3.6.2", - "@ethereumjs/tx": "^3.4.0", - "@polygon-hermez/common": "2.6.4", - "@polygon-hermez/vm": "5.7.36", - "ethereumjs-util": "^7.1.4", - "ethers": "^5.5.4", - "ffjavascript": "^0.2.55", - "lodash": "^4.17.21", - "pg": "^8.7.1" - } - }, - "@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true - }, - "@babel/runtime": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz", - "integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.14.0" - } - }, - "@chainsafe/as-sha256": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz", - "integrity": "sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==", - "dev": true - }, - "@chainsafe/persistent-merkle-tree": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz", - "integrity": "sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==", - "dev": true, - "requires": { - "@chainsafe/as-sha256": "^0.3.1" - } - }, - "@chainsafe/ssz": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.9.4.tgz", - "integrity": "sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==", - "dev": true, - "requires": { - "@chainsafe/as-sha256": "^0.3.1", - "@chainsafe/persistent-merkle-tree": "^0.4.2", - "case": "^1.6.3" - } - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - } - }, - "@ensdomains/address-encoder": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@ensdomains/address-encoder/-/address-encoder-0.1.9.tgz", - "integrity": "sha512-E2d2gP4uxJQnDu2Kfg1tHNspefzbLT8Tyjrm5sEuim32UkU2sm5xL4VXtgc2X33fmPEw9+jUMpGs4veMbf+PYg==", - "dev": true, - "requires": { - "bech32": "^1.1.3", - "blakejs": "^1.1.0", - "bn.js": "^4.11.8", - "bs58": "^4.0.1", - "crypto-addr-codec": "^0.1.7", - "nano-base32": "^1.0.1", - "ripemd160": "^2.0.2" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "@ensdomains/ens": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/@ensdomains/ens/-/ens-0.4.5.tgz", - "integrity": "sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==", - "dev": true, - "requires": { - "bluebird": "^3.5.2", - "eth-ens-namehash": "^2.0.8", - "solc": "^0.4.20", - "testrpc": "0.0.1", - "web3-utils": "^1.0.0-beta.31" - } - }, - "@ensdomains/ensjs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@ensdomains/ensjs/-/ensjs-2.1.0.tgz", - "integrity": "sha512-GRbGPT8Z/OJMDuxs75U/jUNEC0tbL0aj7/L/QQznGYKm/tiasp+ndLOaoULy9kKJFC0TBByqfFliEHDgoLhyog==", - "dev": true, - "requires": { - "@babel/runtime": "^7.4.4", - "@ensdomains/address-encoder": "^0.1.7", - "@ensdomains/ens": "0.4.5", - "@ensdomains/resolver": "0.2.4", - "content-hash": "^2.5.2", - "eth-ens-namehash": "^2.0.8", - "ethers": "^5.0.13", - "js-sha3": "^0.8.0" - } - }, - "@ensdomains/resolver": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz", - "integrity": "sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==", - "dev": true - }, - "@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" - } - }, - "@eslint-community/regexpp": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", - "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - } - }, - "@eslint/js": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", - "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", - "dev": true - }, - "@ethereum-waffle/chai": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@ethereum-waffle/chai/-/chai-3.4.4.tgz", - "integrity": "sha512-/K8czydBtXXkcM9X6q29EqEkc5dN3oYenyH2a9hF7rGAApAJUpH8QBtojxOY/xQ2up5W332jqgxwp0yPiYug1g==", - "dev": true, - "requires": { - "@ethereum-waffle/provider": "^3.4.4", - "ethers": "^5.5.2" - } - }, - "@ethereum-waffle/compiler": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@ethereum-waffle/compiler/-/compiler-3.4.4.tgz", - "integrity": "sha512-RUK3axJ8IkD5xpWjWoJgyHclOeEzDLQFga6gKpeGxiS/zBu+HB0W2FvsrrLalTFIaPw/CGYACRBSIxqiCqwqTQ==", - "dev": true, - "requires": { - "@resolver-engine/imports": "^0.3.3", - "@resolver-engine/imports-fs": "^0.3.3", - "@typechain/ethers-v5": "^2.0.0", - "@types/mkdirp": "^0.5.2", - "@types/node-fetch": "^2.5.5", - "ethers": "^5.0.1", - "mkdirp": "^0.5.1", - "node-fetch": "^2.6.1", - "solc": "^0.6.3", - "ts-generator": "^0.1.1", - "typechain": "^3.0.0" - }, - "dependencies": { - "commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", - "dev": true - }, - "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - }, - "solc": { - "version": "0.6.12", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.6.12.tgz", - "integrity": "sha512-Lm0Ql2G9Qc7yPP2Ba+WNmzw2jwsrd3u4PobHYlSOxaut3TtUbj9+5ZrT6f4DUpNPEoBaFUOEg9Op9C0mk7ge9g==", - "dev": true, - "requires": { - "command-exists": "^1.2.8", - "commander": "3.0.2", - "fs-extra": "^0.30.0", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "require-from-string": "^2.0.0", - "semver": "^5.5.0", - "tmp": "0.0.33" - } - } - } - }, - "@ethereum-waffle/ens": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@ethereum-waffle/ens/-/ens-3.4.4.tgz", - "integrity": "sha512-0m4NdwWxliy3heBYva1Wr4WbJKLnwXizmy5FfSSr5PMbjI7SIGCdCB59U7/ZzY773/hY3bLnzLwvG5mggVjJWg==", - "dev": true, - "requires": { - "@ensdomains/ens": "^0.4.4", - "@ensdomains/resolver": "^0.2.4", - "ethers": "^5.5.2" - } - }, - "@ethereum-waffle/mock-contract": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-3.4.4.tgz", - "integrity": "sha512-Mp0iB2YNWYGUV+VMl5tjPsaXKbKo8MDH9wSJ702l9EBjdxFf/vBvnMBAC1Fub1lLtmD0JHtp1pq+mWzg/xlLnA==", - "dev": true, - "requires": { - "@ethersproject/abi": "^5.5.0", - "ethers": "^5.5.2" - } - }, - "@ethereum-waffle/provider": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@ethereum-waffle/provider/-/provider-3.4.4.tgz", - "integrity": "sha512-GK8oKJAM8+PKy2nK08yDgl4A80mFuI8zBkE0C9GqTRYQqvuxIyXoLmJ5NZU9lIwyWVv5/KsoA11BgAv2jXE82g==", - "dev": true, - "requires": { - "@ethereum-waffle/ens": "^3.4.4", - "ethers": "^5.5.2", - "ganache-core": "^2.13.2", - "patch-package": "^6.2.2", - "postinstall-postinstall": "^2.1.0" - } - }, - "@ethereumjs/block": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@ethereumjs/block/-/block-3.6.3.tgz", - "integrity": "sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg==", - "dev": true, - "requires": { - "@ethereumjs/common": "^2.6.5", - "@ethereumjs/tx": "^3.5.2", - "ethereumjs-util": "^7.1.5", - "merkle-patricia-tree": "^4.2.4" - } - }, - "@ethereumjs/blockchain": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/@ethereumjs/blockchain/-/blockchain-5.5.3.tgz", - "integrity": "sha512-bi0wuNJ1gw4ByNCV56H0Z4Q7D+SxUbwyG12Wxzbvqc89PXLRNR20LBcSUZRKpN0+YCPo6m0XZL/JLio3B52LTw==", - "dev": true, - "requires": { - "@ethereumjs/block": "^3.6.2", - "@ethereumjs/common": "^2.6.4", - "@ethereumjs/ethash": "^1.1.0", - "debug": "^4.3.3", - "ethereumjs-util": "^7.1.5", - "level-mem": "^5.0.1", - "lru-cache": "^5.1.1", - "semaphore-async-await": "^1.5.1" - } - }, - "@ethereumjs/common": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", - "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", - "dev": true, - "requires": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.5" - } - }, - "@ethereumjs/ethash": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/ethash/-/ethash-1.1.0.tgz", - "integrity": "sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA==", - "dev": true, - "requires": { - "@ethereumjs/block": "^3.5.0", - "@types/levelup": "^4.3.0", - "buffer-xor": "^2.0.1", - "ethereumjs-util": "^7.1.1", - "miller-rabin": "^4.0.0" - } - }, - "@ethereumjs/rlp": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", - "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", - "dev": true - }, - "@ethereumjs/tx": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", - "integrity": "sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==", - "dev": true, - "requires": { - "@ethereumjs/common": "^2.6.4", - "ethereumjs-util": "^7.1.5" - } - }, - "@ethereumjs/util": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", - "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", - "dev": true, - "requires": { - "@ethereumjs/rlp": "^4.0.1", - "ethereum-cryptography": "^2.0.0", - "micro-ftch": "^0.3.1" - }, - "dependencies": { - "ethereum-cryptography": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz", - "integrity": "sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==", - "dev": true, - "requires": { - "@noble/curves": "1.1.0", - "@noble/hashes": "1.3.1", - "@scure/bip32": "1.3.1", - "@scure/bip39": "1.2.1" - } - } - } - }, - "@ethersproject/abi": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", - "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "requires": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "@ethersproject/abstract-provider": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", - "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", - "requires": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0" - } - }, - "@ethersproject/abstract-signer": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", - "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", - "requires": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "requires": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" - } - }, - "@ethersproject/base64": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", - "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", - "requires": { - "@ethersproject/bytes": "^5.7.0" - } - }, - "@ethersproject/basex": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", - "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "@ethersproject/bignumber": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", - "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "bn.js": "^5.2.1" - } - }, - "@ethersproject/bytes": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", - "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", - "requires": { - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/constants": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", - "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", - "requires": { - "@ethersproject/bignumber": "^5.7.0" - } - }, - "@ethersproject/contracts": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", - "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", - "requires": { - "@ethersproject/abi": "^5.7.0", - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0" - } - }, - "@ethersproject/hash": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", - "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", - "requires": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "@ethersproject/hdnode": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", - "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", - "requires": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "@ethersproject/json-wallets": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", - "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", - "requires": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "aes-js": "3.0.0", - "scrypt-js": "3.0.1" - } - }, - "@ethersproject/keccak256": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", - "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "js-sha3": "0.8.0" - } - }, - "@ethersproject/logger": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", - "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==" - }, - "@ethersproject/networks": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", - "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", - "requires": { - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/pbkdf2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", - "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/sha2": "^5.7.0" - } - }, - "@ethersproject/properties": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", - "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", - "requires": { - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/providers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", - "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", - "requires": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0", - "bech32": "1.1.4", - "ws": "7.4.6" - } - }, - "@ethersproject/random": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", - "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/rlp": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", - "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/sha2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", - "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "hash.js": "1.1.7" - } - }, - "@ethersproject/signing-key": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", - "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "bn.js": "^5.2.1", - "elliptic": "6.5.4", - "hash.js": "1.1.7" - } - }, - "@ethersproject/solidity": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", - "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", - "requires": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "@ethersproject/strings": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", - "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/transactions": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", - "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", - "requires": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0" - } - }, - "@ethersproject/units": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", - "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", - "requires": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/wallet": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", - "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", - "requires": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/json-wallets": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "@ethersproject/web": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", - "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", - "requires": { - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "@ethersproject/wordlists": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", - "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@metamask/eth-sig-util": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", - "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", - "dev": true, - "requires": { - "ethereumjs-abi": "^0.6.8", - "ethereumjs-util": "^6.2.1", - "ethjs-util": "^0.1.6", - "tweetnacl": "^1.0.3", - "tweetnacl-util": "^0.15.1" - }, - "dependencies": { - "@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "ethereumjs-util": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", - "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", - "dev": true, - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - } - } - }, - "@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, - "requires": { - "@noble/hashes": "1.3.1" - } - }, - "@noble/hashes": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", - "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", - "dev": true - }, - "@noble/secp256k1": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", - "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", - "dev": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@nomicfoundation/ethereumjs-block": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.2.tgz", - "integrity": "sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q==", - "dev": true, - "requires": { - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-trie": "6.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "ethereum-cryptography": "0.1.3", - "ethers": "^5.7.1" - } - }, - "@nomicfoundation/ethereumjs-blockchain": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.2.tgz", - "integrity": "sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w==", - "dev": true, - "requires": { - "@nomicfoundation/ethereumjs-block": "5.0.2", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-ethash": "3.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-trie": "6.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "abstract-level": "^1.0.3", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "level": "^8.0.0", - "lru-cache": "^5.1.1", - "memory-level": "^1.0.0" - } - }, - "@nomicfoundation/ethereumjs-common": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.2.tgz", - "integrity": "sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg==", - "dev": true, - "requires": { - "@nomicfoundation/ethereumjs-util": "9.0.2", - "crc-32": "^1.2.0" - } - }, - "@nomicfoundation/ethereumjs-ethash": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.2.tgz", - "integrity": "sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg==", - "dev": true, - "requires": { - "@nomicfoundation/ethereumjs-block": "5.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "abstract-level": "^1.0.3", - "bigint-crypto-utils": "^3.0.23", - "ethereum-cryptography": "0.1.3" - } - }, - "@nomicfoundation/ethereumjs-evm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.2.tgz", - "integrity": "sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ==", - "dev": true, - "requires": { - "@ethersproject/providers": "^5.7.1", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" - } - }, - "@nomicfoundation/ethereumjs-rlp": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.2.tgz", - "integrity": "sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA==", - "dev": true - }, - "@nomicfoundation/ethereumjs-statemanager": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.2.tgz", - "integrity": "sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA==", - "dev": true, - "requires": { - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "ethers": "^5.7.1", - "js-sdsl": "^4.1.4" - } - }, - "@nomicfoundation/ethereumjs-trie": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.2.tgz", - "integrity": "sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ==", - "dev": true, - "requires": { - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "@types/readable-stream": "^2.3.13", - "ethereum-cryptography": "0.1.3", - "readable-stream": "^3.6.0" - } - }, - "@nomicfoundation/ethereumjs-tx": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.2.tgz", - "integrity": "sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g==", - "dev": true, - "requires": { - "@chainsafe/ssz": "^0.9.2", - "@ethersproject/providers": "^5.7.2", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "ethereum-cryptography": "0.1.3" - } - }, - "@nomicfoundation/ethereumjs-util": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.2.tgz", - "integrity": "sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ==", - "dev": true, - "requires": { - "@chainsafe/ssz": "^0.10.0", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "ethereum-cryptography": "0.1.3" - }, - "dependencies": { - "@chainsafe/persistent-merkle-tree": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz", - "integrity": "sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==", - "dev": true, - "requires": { - "@chainsafe/as-sha256": "^0.3.1" - } - }, - "@chainsafe/ssz": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.10.2.tgz", - "integrity": "sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==", - "dev": true, - "requires": { - "@chainsafe/as-sha256": "^0.3.1", - "@chainsafe/persistent-merkle-tree": "^0.5.0" - } - } - } - }, - "@nomicfoundation/ethereumjs-vm": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.2.tgz", - "integrity": "sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA==", - "dev": true, - "requires": { - "@nomicfoundation/ethereumjs-block": "5.0.2", - "@nomicfoundation/ethereumjs-blockchain": "7.0.2", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-evm": "2.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-statemanager": "2.0.2", - "@nomicfoundation/ethereumjs-trie": "6.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" - } - }, - "@nomicfoundation/solidity-analyzer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz", - "integrity": "sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==", - "dev": true, - "requires": { - "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.1", - "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.1", - "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.1" - } - }, - "@nomicfoundation/solidity-analyzer-darwin-arm64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz", - "integrity": "sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==", - "dev": true, - "optional": true - }, - "@nomicfoundation/solidity-analyzer-darwin-x64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz", - "integrity": "sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==", - "dev": true, - "optional": true - }, - "@nomicfoundation/solidity-analyzer-freebsd-x64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz", - "integrity": "sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==", - "dev": true, - "optional": true - }, - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz", - "integrity": "sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==", - "dev": true, - "optional": true - }, - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz", - "integrity": "sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==", - "dev": true, - "optional": true - }, - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz", - "integrity": "sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==", - "dev": true, - "optional": true - }, - "@nomicfoundation/solidity-analyzer-linux-x64-musl": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz", - "integrity": "sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==", - "dev": true, - "optional": true - }, - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz", - "integrity": "sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==", - "dev": true, - "optional": true - }, - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz", - "integrity": "sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==", - "dev": true, - "optional": true - }, - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz", - "integrity": "sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==", - "dev": true, - "optional": true - }, - "@nomiclabs/hardhat-ethers": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz", - "integrity": "sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==", - "dev": true, - "requires": {} - }, - "@nomiclabs/hardhat-etherscan": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.7.tgz", - "integrity": "sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ==", - "dev": true, - "requires": { - "@ethersproject/abi": "^5.1.2", - "@ethersproject/address": "^5.0.2", - "cbor": "^8.1.0", - "chalk": "^2.4.2", - "debug": "^4.1.1", - "fs-extra": "^7.0.1", - "lodash": "^4.17.11", - "semver": "^6.3.0", - "table": "^6.8.0", - "undici": "^5.14.0" - } - }, - "@nomiclabs/hardhat-waffle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.6.tgz", - "integrity": "sha512-+Wz0hwmJGSI17B+BhU/qFRZ1l6/xMW82QGXE/Gi+WTmwgJrQefuBs1lIf7hzQ1hLk6hpkvb/zwcNkpVKRYTQYg==", - "dev": true, - "requires": {} - }, - "@oclif/command": { - "version": "1.8.36", - "resolved": "https://registry.npmjs.org/@oclif/command/-/command-1.8.36.tgz", - "integrity": "sha512-/zACSgaYGtAQRzc7HjzrlIs14FuEYAZrMOEwicRoUnZVyRunG4+t5iSEeQu0Xy2bgbCD0U1SP/EdeNZSTXRwjQ==", - "dev": true, - "requires": { - "@oclif/config": "^1.18.2", - "@oclif/errors": "^1.3.6", - "@oclif/help": "^1.0.1", - "@oclif/parser": "^3.8.17", - "debug": "^4.1.1", - "semver": "^7.5.4" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@oclif/config": { - "version": "1.18.17", - "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.18.17.tgz", - "integrity": "sha512-k77qyeUvjU8qAJ3XK3fr/QVAqsZO8QOBuESnfeM5HHtPNLSyfVcwiMM2zveSW5xRdLSG3MfV8QnLVkuyCL2ENg==", - "dev": true, - "requires": { - "@oclif/errors": "^1.3.6", - "@oclif/parser": "^3.8.17", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-wsl": "^2.1.1", - "tslib": "^2.6.1" - }, - "dependencies": { - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - } - } - }, - "@oclif/core": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-2.15.0.tgz", - "integrity": "sha512-fNEMG5DzJHhYmI3MgpByTvltBOMyFcnRIUMxbiz2ai8rhaYgaTHMG3Q38HcosfIvtw9nCjxpcQtC8MN8QtVCcA==", - "dev": true, - "requires": { - "@types/cli-progress": "^3.11.0", - "ansi-escapes": "^4.3.2", - "ansi-styles": "^4.3.0", - "cardinal": "^2.1.1", - "chalk": "^4.1.2", - "clean-stack": "^3.0.1", - "cli-progress": "^3.12.0", - "debug": "^4.3.4", - "ejs": "^3.1.8", - "get-package-type": "^0.1.0", - "globby": "^11.1.0", - "hyperlinker": "^1.0.0", - "indent-string": "^4.0.0", - "is-wsl": "^2.2.0", - "js-yaml": "^3.14.1", - "natural-orderby": "^2.0.3", - "object-treeify": "^1.1.33", - "password-prompt": "^1.1.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "supports-color": "^8.1.1", - "supports-hyperlinks": "^2.2.0", - "ts-node": "^10.9.1", - "tslib": "^2.5.0", - "widest-line": "^3.1.0", - "wordwrap": "^1.0.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "clean-stack": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", - "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==", - "dev": true, - "requires": { - "escape-string-regexp": "4.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - } - } - }, - "@oclif/errors": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/@oclif/errors/-/errors-1.3.6.tgz", - "integrity": "sha512-fYaU4aDceETd89KXP+3cLyg9EHZsLD3RxF2IU9yxahhBpspWjkWi3Dy3bTgcwZ3V47BgxQaGapzJWDM33XIVDQ==", - "dev": true, - "requires": { - "clean-stack": "^3.0.0", - "fs-extra": "^8.1", - "indent-string": "^4.0.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "clean-stack": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", - "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==", - "dev": true, - "requires": { - "escape-string-regexp": "4.0.0" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "@oclif/help": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/@oclif/help/-/help-1.0.15.tgz", - "integrity": "sha512-Yt8UHoetk/XqohYX76DfdrUYLsPKMc5pgkzsZVHDyBSkLiGRzujVaGZdjr32ckVZU9q3a47IjhWxhip7Dz5W/g==", - "dev": true, - "requires": { - "@oclif/config": "1.18.16", - "@oclif/errors": "1.3.6", - "chalk": "^4.1.2", - "indent-string": "^4.0.0", - "lodash": "^4.17.21", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "widest-line": "^3.1.0", - "wrap-ansi": "^6.2.0" - }, - "dependencies": { - "@oclif/config": { - "version": "1.18.16", - "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.18.16.tgz", - "integrity": "sha512-VskIxVcN22qJzxRUq+raalq6Q3HUde7sokB7/xk5TqRZGEKRVbFeqdQBxDWwQeudiJEgcNiMvIFbMQ43dY37FA==", - "dev": true, - "requires": { - "@oclif/errors": "^1.3.6", - "@oclif/parser": "^3.8.16", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-wsl": "^2.1.1", - "tslib": "^2.6.1" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } - } - }, - "@oclif/linewrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@oclif/linewrap/-/linewrap-1.0.0.tgz", - "integrity": "sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw==", - "dev": true - }, - "@oclif/parser": { - "version": "3.8.17", - "resolved": "https://registry.npmjs.org/@oclif/parser/-/parser-3.8.17.tgz", - "integrity": "sha512-l04iSd0xoh/16TGVpXb81Gg3z7tlQGrEup16BrVLsZBK6SEYpYHRJZnM32BwZrHI97ZSFfuSwVlzoo6HdsaK8A==", - "dev": true, - "requires": { - "@oclif/errors": "^1.3.6", - "@oclif/linewrap": "^1.0.0", - "chalk": "^4.1.0", - "tslib": "^2.6.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - } - } - }, - "@oclif/plugin-help": { - "version": "5.2.19", - "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-5.2.19.tgz", - "integrity": "sha512-gf6/dFtzMJ8RA4ovlBCBGJsZsd4jPXhYWJho+Gh6KmA+Ev9LupoExbE0qT+a2uHJyHEvIg4uX/MBW3qdERD/8g==", - "dev": true, - "requires": { - "@oclif/core": "^2.15.0" - } - }, - "@openzeppelin/contract-loader": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@openzeppelin/contract-loader/-/contract-loader-0.6.3.tgz", - "integrity": "sha512-cOFIjBjwbGgZhDZsitNgJl0Ye1rd5yu/Yx5LMgeq3u0ZYzldm4uObzHDFq4gjDdoypvyORjjJa3BlFA7eAnVIg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "fs-extra": "^8.1.0" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } - } - }, - "@openzeppelin/contracts": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.8.2.tgz", - "integrity": "sha512-kEUOgPQszC0fSYWpbh2kT94ltOJwj1qfT2DWo+zVttmGmf97JZ99LspePNaeeaLhCImaHVeBbjaQFZQn7+Zc5g==", - "dev": true - }, - "@openzeppelin/contracts-upgradeable": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.8.2.tgz", - "integrity": "sha512-zIggnBwemUmmt9IS73qxi+tumALxCY4QEs3zLCII78k0Gfse2hAOdAkuAeLUzvWUpneMUfFE5sGHzEUSTvn4Ag==", - "dev": true - }, - "@openzeppelin/hardhat-upgrades": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-1.22.1.tgz", - "integrity": "sha512-MdoitCTLl4zwMU8MeE/bCj+7JMWBEvd38XqJkw36PkJrXlbv6FedDVCPoumMAhpmtymm0nTwTYYklYG+L6WiiQ==", - "dev": true, - "requires": { - "@openzeppelin/upgrades-core": "^1.20.0", - "chalk": "^4.1.0", - "debug": "^4.1.1", - "proper-lockfile": "^4.1.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@openzeppelin/test-helpers": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/@openzeppelin/test-helpers/-/test-helpers-0.5.16.tgz", - "integrity": "sha512-T1EvspSfH1qQO/sgGlskLfYVBbqzJR23SZzYl/6B2JnT4EhThcI85UpvDk0BkLWKaDScQTabGHt4GzHW+3SfZg==", - "dev": true, - "requires": { - "@openzeppelin/contract-loader": "^0.6.2", - "@truffle/contract": "^4.0.35", - "ansi-colors": "^3.2.3", - "chai": "^4.2.0", - "chai-bn": "^0.2.1", - "ethjs-abi": "^0.2.1", - "lodash.flatten": "^4.4.0", - "semver": "^5.6.0", - "web3": "^1.2.5", - "web3-utils": "^1.2.5" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true, - "peer": true - }, - "chai-bn": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/chai-bn/-/chai-bn-0.2.2.tgz", - "integrity": "sha512-MzjelH0p8vWn65QKmEq/DLBG1Hle4WeyqT79ANhXZhn/UxRWO0OogkAxi5oGGtfzwU9bZR8mvbvYdoqNVWQwFg==", - "dev": true, - "requires": {} - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - } - } - }, - "@openzeppelin/upgrades-core": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.28.0.tgz", - "integrity": "sha512-8RKlyg98Adv+46GxDaR0awL3R8bVCcQ27DcSEwrgWOp6siHh8sZg4a2l+2dhPl1510S6uBfhHSydMH5VX2BV5g==", - "dev": true, - "requires": { - "cbor": "^9.0.0", - "chalk": "^4.1.0", - "compare-versions": "^6.0.0", - "debug": "^4.1.1", - "ethereumjs-util": "^7.0.3", - "minimist": "^1.2.7", - "proper-lockfile": "^4.1.1", - "solidity-ast": "^0.4.26" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "cbor": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-9.0.1.tgz", - "integrity": "sha512-/TQOWyamDxvVIv+DY9cOLNuABkoyz8K/F3QE56539pGVYohx0+MEA1f4lChFTX79dBTBS7R1PF6ovH7G+VtBfQ==", - "dev": true, - "requires": { - "nofilter": "^3.1.0" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@polygon-hermez/common": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/@polygon-hermez/common/-/common-2.6.4.tgz", - "integrity": "sha512-ZGl/K1MaXHaDagqKCqkQgCRu9EfJ+mbK+t4GeVnDywMYGCyi7jF1u71Pyh4Rch3XFd/8rW/eVL4x4jkGwN16JQ==", - "dev": true, - "requires": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.4" - } - }, - "@polygon-hermez/vm": { - "version": "5.7.36", - "resolved": "https://registry.npmjs.org/@polygon-hermez/vm/-/vm-5.7.36.tgz", - "integrity": "sha512-BN/42g7NbQZYz1+f2uEaVvZOxf1eCjFKkT/mTCdTK5ARpxDOzBwIVnt3WTjzgUsj7BzDU4btB0ifPNaKKR2Dpw==", - "dev": true, - "requires": { - "@ethereumjs/block": "^3.6.1", - "@ethereumjs/blockchain": "^5.5.1", - "@ethereumjs/common": "^2.6.2", - "@ethereumjs/tx": "^3.5.0", - "@polygon-hermez/zkevm-commonjs": "github:hermeznetwork/zkevm-commonjs#v1.0.0", - "async-eventemitter": "^0.2.4", - "core-js-pure": "^3.0.1", - "debug": "^4.3.3", - "ethereumjs-util": "^7.1.4", - "ethers": "^5.6.2", - "functional-red-black-tree": "^1.0.1", - "lodash": "^4.17.21", - "mcl-wasm": "^0.7.1", - "merkle-patricia-tree": "^4.2.3", - "rustbn.js": "~0.2.0" - } - }, - "@polygon-hermez/zkevm-commonjs": { - "version": "git+ssh://git@github.com/hermeznetwork/zkevm-commonjs.git#34f72fe9f7a4c3c45965742476a87148c9e05c0f", - "dev": true, - "from": "@polygon-hermez/zkevm-commonjs@github:hermeznetwork/zkevm-commonjs#v1.0.0", - "requires": { - "@ethereumjs/block": "^3.6.2", - "@ethereumjs/tx": "^3.4.0", - "@polygon-hermez/common": "2.6.4", - "@polygon-hermez/vm": "5.7.30", - "ethereumjs-util": "^7.1.4", - "ethers": "^5.5.4", - "ffjavascript": "^0.2.55", - "lodash": "^4.17.21", - "pg": "^8.7.1" - }, - "dependencies": { - "@polygon-hermez/vm": { - "version": "5.7.30", - "resolved": "https://registry.npmjs.org/@polygon-hermez/vm/-/vm-5.7.30.tgz", - "integrity": "sha512-HxmrGuRpYsgwd4rnvYNQ4OR77OKdAbUsAD1Z6PoEvV18NHsMv6JGpMnvnSAseiCBCyqTHjnFqWynoQ1nl0Qr6g==", - "dev": true, - "requires": { - "@ethereumjs/block": "^3.6.1", - "@ethereumjs/blockchain": "^5.5.1", - "@ethereumjs/common": "^2.6.2", - "@ethereumjs/tx": "^3.5.0", - "@polygon-hermez/zkevm-commonjs": "github:hermeznetwork/zkevm-commonjs#v0.5.0.1", - "async-eventemitter": "^0.2.4", - "core-js-pure": "^3.0.1", - "debug": "^4.3.3", - "ethereumjs-util": "^7.1.4", - "ethers": "^5.6.2", - "functional-red-black-tree": "^1.0.1", - "lodash": "^4.17.21", - "mcl-wasm": "^0.7.1", - "merkle-patricia-tree": "^4.2.3", - "rustbn.js": "~0.2.0" - } - } - } - }, - "@resolver-engine/core": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@resolver-engine/core/-/core-0.3.3.tgz", - "integrity": "sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ==", - "dev": true, - "requires": { - "debug": "^3.1.0", - "is-url": "^1.2.4", - "request": "^2.85.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "@resolver-engine/fs": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@resolver-engine/fs/-/fs-0.3.3.tgz", - "integrity": "sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ==", - "dev": true, - "requires": { - "@resolver-engine/core": "^0.3.3", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "@resolver-engine/imports": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@resolver-engine/imports/-/imports-0.3.3.tgz", - "integrity": "sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q==", - "dev": true, - "requires": { - "@resolver-engine/core": "^0.3.3", - "debug": "^3.1.0", - "hosted-git-info": "^2.6.0", - "path-browserify": "^1.0.0", - "url": "^0.11.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "@resolver-engine/imports-fs": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz", - "integrity": "sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA==", - "dev": true, - "requires": { - "@resolver-engine/fs": "^0.3.3", - "@resolver-engine/imports": "^0.3.3", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "@scure/base": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.3.tgz", - "integrity": "sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==", - "dev": true - }, - "@scure/bip32": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.1.tgz", - "integrity": "sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==", - "dev": true, - "requires": { - "@noble/curves": "~1.1.0", - "@noble/hashes": "~1.3.1", - "@scure/base": "~1.1.0" - } - }, - "@scure/bip39": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz", - "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==", - "dev": true, - "requires": { - "@noble/hashes": "~1.3.0", - "@scure/base": "~1.1.0" - } - }, - "@sentry/core": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", - "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", - "dev": true, - "requires": { - "@sentry/hub": "5.30.0", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - } - }, - "@sentry/hub": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", - "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", - "dev": true, - "requires": { - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - } - }, - "@sentry/minimal": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", - "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", - "dev": true, - "requires": { - "@sentry/hub": "5.30.0", - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" - } - }, - "@sentry/node": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", - "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", - "dev": true, - "requires": { - "@sentry/core": "5.30.0", - "@sentry/hub": "5.30.0", - "@sentry/tracing": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "cookie": "^0.4.1", - "https-proxy-agent": "^5.0.0", - "lru_map": "^0.3.3", - "tslib": "^1.9.3" - } - }, - "@sentry/tracing": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", - "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", - "dev": true, - "requires": { - "@sentry/hub": "5.30.0", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - } - }, - "@sentry/types": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", - "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", - "dev": true - }, - "@sentry/utils": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", - "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", - "dev": true, - "requires": { - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" - } - }, - "@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true - }, - "@solidity-parser/parser": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz", - "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==", - "dev": true, - "requires": { - "antlr4ts": "^0.5.0-alpha.4" - } - }, - "@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "requires": { - "defer-to-connect": "^2.0.1" - } - }, - "@truffle/abi-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-1.0.3.tgz", - "integrity": "sha512-AWhs01HCShaVKjml7Z4AbVREr/u4oiWxCcoR7Cktm0mEvtT04pvnxW5xB/cI4znRkrbPdFQlFt67kgrAjesYkw==", - "dev": true, - "requires": { - "change-case": "3.0.2", - "fast-check": "3.1.1", - "web3-utils": "1.10.0" - }, - "dependencies": { - "web3-utils": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", - "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - } - } - } - }, - "@truffle/blockchain-utils": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.1.9.tgz", - "integrity": "sha512-RHfumgbIVo68Rv9ofDYfynjnYZIfP/f1vZy4RoqkfYAO+fqfc58PDRzB1WAGq2U6GPuOnipOJxQhnqNnffORZg==", - "dev": true - }, - "@truffle/codec": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.17.3.tgz", - "integrity": "sha512-Ko/+dsnntNyrJa57jUD9u4qx9nQby+H4GsUO6yjiCPSX0TQnEHK08XWqBSg0WdmCH2+h0y1nr2CXSx8gbZapxg==", - "dev": true, - "requires": { - "@truffle/abi-utils": "^1.0.3", - "@truffle/compile-common": "^0.9.8", - "big.js": "^6.0.3", - "bn.js": "^5.1.3", - "cbor": "^5.2.0", - "debug": "^4.3.1", - "lodash": "^4.17.21", - "semver": "^7.5.4", - "utf8": "^3.0.0", - "web3-utils": "1.10.0" - }, - "dependencies": { - "bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "dev": true - }, - "cbor": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", - "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", - "dev": true, - "requires": { - "bignumber.js": "^9.0.1", - "nofilter": "^1.0.4" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "nofilter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", - "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==", - "dev": true - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "web3-utils": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", - "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@truffle/compile-common": { - "version": "0.9.8", - "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.9.8.tgz", - "integrity": "sha512-DTpiyo32t/YhLI1spn84D3MHYHrnoVqO+Gp7ZHrYNwDs86mAxtNiH5lsVzSb8cPgiqlvNsRCU9nm9R0YmKMTBQ==", - "dev": true, - "requires": { - "@truffle/error": "^0.2.2", - "colors": "1.4.0" - } - }, - "@truffle/contract": { - "version": "4.6.30", - "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.6.30.tgz", - "integrity": "sha512-B7cQECm0WPda0/Q6kX720+LfkPits7hytNMlBzpgopgySPhgSycAAKNGPBFGhd824aBqeAvO6KrjWme6E+MU+A==", - "dev": true, - "requires": { - "@ensdomains/ensjs": "^2.1.0", - "@truffle/blockchain-utils": "^0.1.9", - "@truffle/contract-schema": "^3.4.16", - "@truffle/debug-utils": "^6.0.57", - "@truffle/error": "^0.2.2", - "@truffle/interface-adapter": "^0.5.37", - "bignumber.js": "^7.2.1", - "debug": "^4.3.1", - "ethers": "^4.0.32", - "web3": "1.10.0", - "web3-core-helpers": "1.10.0", - "web3-core-promievent": "1.10.0", - "web3-eth-abi": "1.10.0", - "web3-utils": "1.10.0" - }, - "dependencies": { - "@ethereumjs/common": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", - "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", - "dev": true, - "requires": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.1" - } - }, - "@ethereumjs/tx": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", - "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", - "dev": true, - "requires": { - "@ethereumjs/common": "^2.5.0", - "ethereumjs-util": "^7.1.2" - } - }, - "@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "cross-fetch": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", - "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", - "dev": true, - "requires": { - "node-fetch": "^2.6.12" - } - }, - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "ethers": { - "version": "4.0.49", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", - "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", - "dev": true, - "requires": { - "aes-js": "3.0.0", - "bn.js": "^4.11.9", - "elliptic": "6.5.4", - "hash.js": "1.1.3", - "js-sha3": "0.5.7", - "scrypt-js": "2.0.4", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - } - }, - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", - "dev": true - }, - "scrypt-js": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", - "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==", - "dev": true - }, - "setimmediate": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==", - "dev": true - }, - "uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", - "dev": true - }, - "web3": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.10.0.tgz", - "integrity": "sha512-YfKY9wSkGcM8seO+daR89oVTcbu18NsVfvOngzqMYGUU0pPSQmE57qQDvQzUeoIOHAnXEBNzrhjQJmm8ER0rng==", - "dev": true, - "requires": { - "web3-bzz": "1.10.0", - "web3-core": "1.10.0", - "web3-eth": "1.10.0", - "web3-eth-personal": "1.10.0", - "web3-net": "1.10.0", - "web3-shh": "1.10.0", - "web3-utils": "1.10.0" - } - }, - "web3-bzz": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.10.0.tgz", - "integrity": "sha512-o9IR59io3pDUsXTsps5pO5hW1D5zBmg46iNc2t4j2DkaYHNdDLwk2IP9ukoM2wg47QILfPEJYzhTfkS/CcX0KA==", - "dev": true, - "requires": { - "@types/node": "^12.12.6", - "got": "12.1.0", - "swarm-js": "^0.1.40" - } - }, - "web3-core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.10.0.tgz", - "integrity": "sha512-fWySwqy2hn3TL89w5TM8wXF1Z2Q6frQTKHWmP0ppRQorEK8NcHJRfeMiv/mQlSKoTS1F6n/nv2uyZsixFycjYQ==", - "dev": true, - "requires": { - "@types/bn.js": "^5.1.1", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.10.0", - "web3-core-method": "1.10.0", - "web3-core-requestmanager": "1.10.0", - "web3-utils": "1.10.0" - }, - "dependencies": { - "bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "dev": true - } - } - }, - "web3-core-method": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.10.0.tgz", - "integrity": "sha512-4R700jTLAMKDMhQ+nsVfIXvH6IGJlJzGisIfMKWAIswH31h5AZz7uDUW2YctI+HrYd+5uOAlS4OJeeT9bIpvkA==", - "dev": true, - "requires": { - "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.10.0", - "web3-core-promievent": "1.10.0", - "web3-core-subscriptions": "1.10.0", - "web3-utils": "1.10.0" - } - }, - "web3-core-requestmanager": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.10.0.tgz", - "integrity": "sha512-3z/JKE++Os62APml4dvBM+GAuId4h3L9ckUrj7ebEtS2AR0ixyQPbrBodgL91Sv7j7cQ3Y+hllaluqjguxvSaQ==", - "dev": true, - "requires": { - "util": "^0.12.5", - "web3-core-helpers": "1.10.0", - "web3-providers-http": "1.10.0", - "web3-providers-ipc": "1.10.0", - "web3-providers-ws": "1.10.0" - } - }, - "web3-core-subscriptions": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.10.0.tgz", - "integrity": "sha512-HGm1PbDqsxejI075gxBc5OSkwymilRWZufIy9zEpnWKNmfbuv5FfHgW1/chtJP6aP3Uq2vHkvTDl3smQBb8l+g==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.10.0" - } - }, - "web3-eth": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.10.0.tgz", - "integrity": "sha512-Z5vT6slNMLPKuwRyKGbqeGYC87OAy8bOblaqRTgg94CXcn/mmqU7iPIlG4506YdcdK3x6cfEDG7B6w+jRxypKA==", - "dev": true, - "requires": { - "web3-core": "1.10.0", - "web3-core-helpers": "1.10.0", - "web3-core-method": "1.10.0", - "web3-core-subscriptions": "1.10.0", - "web3-eth-abi": "1.10.0", - "web3-eth-accounts": "1.10.0", - "web3-eth-contract": "1.10.0", - "web3-eth-ens": "1.10.0", - "web3-eth-iban": "1.10.0", - "web3-eth-personal": "1.10.0", - "web3-net": "1.10.0", - "web3-utils": "1.10.0" - } - }, - "web3-eth-accounts": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.10.0.tgz", - "integrity": "sha512-wiq39Uc3mOI8rw24wE2n15hboLE0E9BsQLdlmsL4Zua9diDS6B5abXG0XhFcoNsXIGMWXVZz4TOq3u4EdpXF/Q==", - "dev": true, - "requires": { - "@ethereumjs/common": "2.5.0", - "@ethereumjs/tx": "3.3.2", - "eth-lib": "0.2.8", - "ethereumjs-util": "^7.1.5", - "scrypt-js": "^3.0.1", - "uuid": "^9.0.0", - "web3-core": "1.10.0", - "web3-core-helpers": "1.10.0", - "web3-core-method": "1.10.0", - "web3-utils": "1.10.0" - }, - "dependencies": { - "scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "dev": true - }, - "uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "dev": true - } - } - }, - "web3-eth-contract": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.10.0.tgz", - "integrity": "sha512-MIC5FOzP/+2evDksQQ/dpcXhSqa/2hFNytdl/x61IeWxhh6vlFeSjq0YVTAyIzdjwnL7nEmZpjfI6y6/Ufhy7w==", - "dev": true, - "requires": { - "@types/bn.js": "^5.1.1", - "web3-core": "1.10.0", - "web3-core-helpers": "1.10.0", - "web3-core-method": "1.10.0", - "web3-core-promievent": "1.10.0", - "web3-core-subscriptions": "1.10.0", - "web3-eth-abi": "1.10.0", - "web3-utils": "1.10.0" - } - }, - "web3-eth-ens": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.10.0.tgz", - "integrity": "sha512-3hpGgzX3qjgxNAmqdrC2YUQMTfnZbs4GeLEmy8aCWziVwogbuqQZ+Gzdfrym45eOZodk+lmXyLuAdqkNlvkc1g==", - "dev": true, - "requires": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.10.0", - "web3-core-helpers": "1.10.0", - "web3-core-promievent": "1.10.0", - "web3-eth-abi": "1.10.0", - "web3-eth-contract": "1.10.0", - "web3-utils": "1.10.0" - } - }, - "web3-eth-personal": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.10.0.tgz", - "integrity": "sha512-anseKn98w/d703eWq52uNuZi7GhQeVjTC5/svrBWEKob0WZ5kPdo+EZoFN0sp5a5ubbrk/E0xSl1/M5yORMtpg==", - "dev": true, - "requires": { - "@types/node": "^12.12.6", - "web3-core": "1.10.0", - "web3-core-helpers": "1.10.0", - "web3-core-method": "1.10.0", - "web3-net": "1.10.0", - "web3-utils": "1.10.0" - } - }, - "web3-net": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.10.0.tgz", - "integrity": "sha512-NLH/N3IshYWASpxk4/18Ge6n60GEvWBVeM8inx2dmZJVmRI6SJIlUxbL8jySgiTn3MMZlhbdvrGo8fpUW7a1GA==", - "dev": true, - "requires": { - "web3-core": "1.10.0", - "web3-core-method": "1.10.0", - "web3-utils": "1.10.0" - } - }, - "web3-providers-http": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.10.0.tgz", - "integrity": "sha512-eNr965YB8a9mLiNrkjAWNAPXgmQWfpBfkkn7tpEFlghfww0u3I0tktMZiaToJVcL2+Xq+81cxbkpeWJ5XQDwOA==", - "dev": true, - "requires": { - "abortcontroller-polyfill": "^1.7.3", - "cross-fetch": "^3.1.4", - "es6-promise": "^4.2.8", - "web3-core-helpers": "1.10.0" - } - }, - "web3-providers-ipc": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.10.0.tgz", - "integrity": "sha512-OfXG1aWN8L1OUqppshzq8YISkWrYHaATW9H8eh0p89TlWMc1KZOL9vttBuaBEi96D/n0eYDn2trzt22bqHWfXA==", - "dev": true, - "requires": { - "oboe": "2.1.5", - "web3-core-helpers": "1.10.0" - } - }, - "web3-providers-ws": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.10.0.tgz", - "integrity": "sha512-sK0fNcglW36yD5xjnjtSGBnEtf59cbw4vZzJ+CmOWIKGIR96mP5l684g0WD0Eo+f4NQc2anWWXG74lRc9OVMCQ==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.10.0", - "websocket": "^1.0.32" - } - }, - "web3-shh": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.10.0.tgz", - "integrity": "sha512-uNUUuNsO2AjX41GJARV9zJibs11eq6HtOe6Wr0FtRUcj8SN6nHeYIzwstAvJ4fXA53gRqFMTxdntHEt9aXVjpg==", - "dev": true, - "requires": { - "web3-core": "1.10.0", - "web3-core-method": "1.10.0", - "web3-core-subscriptions": "1.10.0", - "web3-net": "1.10.0" - } - }, - "web3-utils": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", - "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - } - } - } - }, - "@truffle/contract-schema": { - "version": "3.4.16", - "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.16.tgz", - "integrity": "sha512-g0WNYR/J327DqtJPI70ubS19K1Fth/1wxt2jFqLsPmz5cGZVjCwuhiie+LfBde4/Mc9QR8G+L3wtmT5cyoBxAg==", - "dev": true, - "requires": { - "ajv": "^6.10.0", - "debug": "^4.3.1" - } - }, - "@truffle/debug-utils": { - "version": "6.0.57", - "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.57.tgz", - "integrity": "sha512-Q6oI7zLaeNLB69ixjwZk2UZEWBY6b2OD1sjLMGDKBGR7GaHYiw96GLR2PFgPH1uwEeLmV4N78LYaQCrDsHbNeA==", - "dev": true, - "requires": { - "@truffle/codec": "^0.17.3", - "@trufflesuite/chromafi": "^3.0.0", - "bn.js": "^5.1.3", - "chalk": "^2.4.2", - "debug": "^4.3.1", - "highlightjs-solidity": "^2.0.6" - } - }, - "@truffle/error": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.2.2.tgz", - "integrity": "sha512-TqbzJ0O8DHh34cu8gDujnYl4dUl6o2DE4PR6iokbybvnIm/L2xl6+Gv1VC+YJS45xfH83Yo3/Zyg/9Oq8/xZWg==", - "dev": true - }, - "@truffle/interface-adapter": { - "version": "0.5.37", - "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.37.tgz", - "integrity": "sha512-lPH9MDgU+7sNDlJSClwyOwPCfuOimqsCx0HfGkznL3mcFRymc1pukAR1k17zn7ErHqBwJjiKAZ6Ri72KkS+IWw==", - "dev": true, - "requires": { - "bn.js": "^5.1.3", - "ethers": "^4.0.32", - "web3": "1.10.0" - }, - "dependencies": { - "@ethereumjs/common": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", - "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", - "dev": true, - "requires": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.1" - } - }, - "@ethereumjs/tx": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", - "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", - "dev": true, - "requires": { - "@ethereumjs/common": "^2.5.0", - "ethereumjs-util": "^7.1.2" - } - }, - "@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "dev": true - }, - "cross-fetch": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", - "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", - "dev": true, - "requires": { - "node-fetch": "^2.6.12" - } - }, - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "ethers": { - "version": "4.0.49", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", - "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", - "dev": true, - "requires": { - "aes-js": "3.0.0", - "bn.js": "^4.11.9", - "elliptic": "6.5.4", - "hash.js": "1.1.3", - "js-sha3": "0.5.7", - "scrypt-js": "2.0.4", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - } - }, - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", - "dev": true - }, - "scrypt-js": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", - "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==", - "dev": true - }, - "setimmediate": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==", - "dev": true - }, - "uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", - "dev": true - }, - "web3": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.10.0.tgz", - "integrity": "sha512-YfKY9wSkGcM8seO+daR89oVTcbu18NsVfvOngzqMYGUU0pPSQmE57qQDvQzUeoIOHAnXEBNzrhjQJmm8ER0rng==", - "dev": true, - "requires": { - "web3-bzz": "1.10.0", - "web3-core": "1.10.0", - "web3-eth": "1.10.0", - "web3-eth-personal": "1.10.0", - "web3-net": "1.10.0", - "web3-shh": "1.10.0", - "web3-utils": "1.10.0" - } - }, - "web3-bzz": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.10.0.tgz", - "integrity": "sha512-o9IR59io3pDUsXTsps5pO5hW1D5zBmg46iNc2t4j2DkaYHNdDLwk2IP9ukoM2wg47QILfPEJYzhTfkS/CcX0KA==", - "dev": true, - "requires": { - "@types/node": "^12.12.6", - "got": "12.1.0", - "swarm-js": "^0.1.40" - } - }, - "web3-core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.10.0.tgz", - "integrity": "sha512-fWySwqy2hn3TL89w5TM8wXF1Z2Q6frQTKHWmP0ppRQorEK8NcHJRfeMiv/mQlSKoTS1F6n/nv2uyZsixFycjYQ==", - "dev": true, - "requires": { - "@types/bn.js": "^5.1.1", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.10.0", - "web3-core-method": "1.10.0", - "web3-core-requestmanager": "1.10.0", - "web3-utils": "1.10.0" - } - }, - "web3-core-method": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.10.0.tgz", - "integrity": "sha512-4R700jTLAMKDMhQ+nsVfIXvH6IGJlJzGisIfMKWAIswH31h5AZz7uDUW2YctI+HrYd+5uOAlS4OJeeT9bIpvkA==", - "dev": true, - "requires": { - "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.10.0", - "web3-core-promievent": "1.10.0", - "web3-core-subscriptions": "1.10.0", - "web3-utils": "1.10.0" - } - }, - "web3-core-requestmanager": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.10.0.tgz", - "integrity": "sha512-3z/JKE++Os62APml4dvBM+GAuId4h3L9ckUrj7ebEtS2AR0ixyQPbrBodgL91Sv7j7cQ3Y+hllaluqjguxvSaQ==", - "dev": true, - "requires": { - "util": "^0.12.5", - "web3-core-helpers": "1.10.0", - "web3-providers-http": "1.10.0", - "web3-providers-ipc": "1.10.0", - "web3-providers-ws": "1.10.0" - } - }, - "web3-core-subscriptions": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.10.0.tgz", - "integrity": "sha512-HGm1PbDqsxejI075gxBc5OSkwymilRWZufIy9zEpnWKNmfbuv5FfHgW1/chtJP6aP3Uq2vHkvTDl3smQBb8l+g==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.10.0" - } - }, - "web3-eth": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.10.0.tgz", - "integrity": "sha512-Z5vT6slNMLPKuwRyKGbqeGYC87OAy8bOblaqRTgg94CXcn/mmqU7iPIlG4506YdcdK3x6cfEDG7B6w+jRxypKA==", - "dev": true, - "requires": { - "web3-core": "1.10.0", - "web3-core-helpers": "1.10.0", - "web3-core-method": "1.10.0", - "web3-core-subscriptions": "1.10.0", - "web3-eth-abi": "1.10.0", - "web3-eth-accounts": "1.10.0", - "web3-eth-contract": "1.10.0", - "web3-eth-ens": "1.10.0", - "web3-eth-iban": "1.10.0", - "web3-eth-personal": "1.10.0", - "web3-net": "1.10.0", - "web3-utils": "1.10.0" - } - }, - "web3-eth-accounts": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.10.0.tgz", - "integrity": "sha512-wiq39Uc3mOI8rw24wE2n15hboLE0E9BsQLdlmsL4Zua9diDS6B5abXG0XhFcoNsXIGMWXVZz4TOq3u4EdpXF/Q==", - "dev": true, - "requires": { - "@ethereumjs/common": "2.5.0", - "@ethereumjs/tx": "3.3.2", - "eth-lib": "0.2.8", - "ethereumjs-util": "^7.1.5", - "scrypt-js": "^3.0.1", - "uuid": "^9.0.0", - "web3-core": "1.10.0", - "web3-core-helpers": "1.10.0", - "web3-core-method": "1.10.0", - "web3-utils": "1.10.0" - }, - "dependencies": { - "scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "dev": true - }, - "uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "dev": true - } - } - }, - "web3-eth-contract": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.10.0.tgz", - "integrity": "sha512-MIC5FOzP/+2evDksQQ/dpcXhSqa/2hFNytdl/x61IeWxhh6vlFeSjq0YVTAyIzdjwnL7nEmZpjfI6y6/Ufhy7w==", - "dev": true, - "requires": { - "@types/bn.js": "^5.1.1", - "web3-core": "1.10.0", - "web3-core-helpers": "1.10.0", - "web3-core-method": "1.10.0", - "web3-core-promievent": "1.10.0", - "web3-core-subscriptions": "1.10.0", - "web3-eth-abi": "1.10.0", - "web3-utils": "1.10.0" - } - }, - "web3-eth-ens": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.10.0.tgz", - "integrity": "sha512-3hpGgzX3qjgxNAmqdrC2YUQMTfnZbs4GeLEmy8aCWziVwogbuqQZ+Gzdfrym45eOZodk+lmXyLuAdqkNlvkc1g==", - "dev": true, - "requires": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.10.0", - "web3-core-helpers": "1.10.0", - "web3-core-promievent": "1.10.0", - "web3-eth-abi": "1.10.0", - "web3-eth-contract": "1.10.0", - "web3-utils": "1.10.0" - } - }, - "web3-eth-personal": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.10.0.tgz", - "integrity": "sha512-anseKn98w/d703eWq52uNuZi7GhQeVjTC5/svrBWEKob0WZ5kPdo+EZoFN0sp5a5ubbrk/E0xSl1/M5yORMtpg==", - "dev": true, - "requires": { - "@types/node": "^12.12.6", - "web3-core": "1.10.0", - "web3-core-helpers": "1.10.0", - "web3-core-method": "1.10.0", - "web3-net": "1.10.0", - "web3-utils": "1.10.0" - } - }, - "web3-net": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.10.0.tgz", - "integrity": "sha512-NLH/N3IshYWASpxk4/18Ge6n60GEvWBVeM8inx2dmZJVmRI6SJIlUxbL8jySgiTn3MMZlhbdvrGo8fpUW7a1GA==", - "dev": true, - "requires": { - "web3-core": "1.10.0", - "web3-core-method": "1.10.0", - "web3-utils": "1.10.0" - } - }, - "web3-providers-http": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.10.0.tgz", - "integrity": "sha512-eNr965YB8a9mLiNrkjAWNAPXgmQWfpBfkkn7tpEFlghfww0u3I0tktMZiaToJVcL2+Xq+81cxbkpeWJ5XQDwOA==", - "dev": true, - "requires": { - "abortcontroller-polyfill": "^1.7.3", - "cross-fetch": "^3.1.4", - "es6-promise": "^4.2.8", - "web3-core-helpers": "1.10.0" - } - }, - "web3-providers-ipc": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.10.0.tgz", - "integrity": "sha512-OfXG1aWN8L1OUqppshzq8YISkWrYHaATW9H8eh0p89TlWMc1KZOL9vttBuaBEi96D/n0eYDn2trzt22bqHWfXA==", - "dev": true, - "requires": { - "oboe": "2.1.5", - "web3-core-helpers": "1.10.0" - } - }, - "web3-providers-ws": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.10.0.tgz", - "integrity": "sha512-sK0fNcglW36yD5xjnjtSGBnEtf59cbw4vZzJ+CmOWIKGIR96mP5l684g0WD0Eo+f4NQc2anWWXG74lRc9OVMCQ==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.10.0", - "websocket": "^1.0.32" - } - }, - "web3-shh": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.10.0.tgz", - "integrity": "sha512-uNUUuNsO2AjX41GJARV9zJibs11eq6HtOe6Wr0FtRUcj8SN6nHeYIzwstAvJ4fXA53gRqFMTxdntHEt9aXVjpg==", - "dev": true, - "requires": { - "web3-core": "1.10.0", - "web3-core-method": "1.10.0", - "web3-core-subscriptions": "1.10.0", - "web3-net": "1.10.0" - } - }, - "web3-utils": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", - "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - } - } - } - }, - "@truffle/provider": { - "version": "0.2.64", - "resolved": "https://registry.npmjs.org/@truffle/provider/-/provider-0.2.64.tgz", - "integrity": "sha512-ZwPsofw4EsCq/2h0t73SPnnFezu4YQWBmK4FxFaOUX0F+o8NsZuHKyfJzuZwyZbiktYmefM3yD9rM0Dj4BhNbw==", - "dev": true, - "requires": { - "@truffle/error": "^0.1.1", - "@truffle/interface-adapter": "^0.5.25", - "debug": "^4.3.1", - "web3": "1.7.4" - }, - "dependencies": { - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "@truffle/error": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.1.1.tgz", - "integrity": "sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA==", - "dev": true - }, - "@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "dev": true - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } - } - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", - "dev": true - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", - "dev": true, - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - }, - "web3": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.7.4.tgz", - "integrity": "sha512-iFGK5jO32vnXM/ASaJBaI0+gVR6uHozvYdxkdhaeOCD6HIQ4iIXadbO2atVpE9oc/H8l2MovJ4LtPhG7lIBN8A==", - "dev": true, - "requires": { - "web3-bzz": "1.7.4", - "web3-core": "1.7.4", - "web3-eth": "1.7.4", - "web3-eth-personal": "1.7.4", - "web3-net": "1.7.4", - "web3-shh": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-bzz": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.7.4.tgz", - "integrity": "sha512-w9zRhyEqTK/yi0LGRHjZMcPCfP24LBjYXI/9YxFw9VqsIZ9/G0CRCnUt12lUx0A56LRAMpF7iQ8eA73aBcO29Q==", - "dev": true, - "requires": { - "@types/node": "^12.12.6", - "got": "9.6.0", - "swarm-js": "^0.1.40" - } - }, - "web3-core": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.7.4.tgz", - "integrity": "sha512-L0DCPlIh9bgIED37tYbe7bsWrddoXYc897ANGvTJ6MFkSNGiMwDkTLWSgYd9Mf8qu8b4iuPqXZHMwIo4atoh7Q==", - "dev": true, - "requires": { - "@types/bn.js": "^5.1.0", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-requestmanager": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-core-helpers": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.7.4.tgz", - "integrity": "sha512-F8PH11qIkE/LpK4/h1fF/lGYgt4B6doeMi8rukeV/s4ivseZHHslv1L6aaijLX/g/j4PsFmR42byynBI/MIzFg==", - "dev": true, - "requires": { - "web3-eth-iban": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-core-method": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.7.4.tgz", - "integrity": "sha512-56K7pq+8lZRkxJyzf5MHQPI9/VL3IJLoy4L/+q8HRdZJ3CkB1DkXYaXGU2PeylG1GosGiSzgIfu1ljqS7CP9xQ==", - "dev": true, - "requires": { - "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-core-promievent": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.7.4.tgz", - "integrity": "sha512-o4uxwXKDldN7ER7VUvDfWsqTx9nQSP1aDssi1XYXeYC2xJbVo0n+z6ryKtmcoWoRdRj7uSpVzal3nEmlr480mA==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4" - } - }, - "web3-core-requestmanager": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.7.4.tgz", - "integrity": "sha512-IuXdAm65BQtPL4aI6LZJJOrKAs0SM5IK2Cqo2/lMNvVMT9Kssq6qOk68Uf7EBDH0rPuINi+ReLP+uH+0g3AnPA==", - "dev": true, - "requires": { - "util": "^0.12.0", - "web3-core-helpers": "1.7.4", - "web3-providers-http": "1.7.4", - "web3-providers-ipc": "1.7.4", - "web3-providers-ws": "1.7.4" - } - }, - "web3-core-subscriptions": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.7.4.tgz", - "integrity": "sha512-VJvKWaXRyxk2nFWumOR94ut9xvjzMrRtS38c4qj8WBIRSsugrZr5lqUwgndtj0qx4F+50JhnU++QEqUEAtKm3g==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.4" - } - }, - "web3-eth": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.7.4.tgz", - "integrity": "sha512-JG0tTMv0Ijj039emXNHi07jLb0OiWSA9O24MRSk5vToTQyDNXihdF2oyq85LfHuF690lXZaAXrjhtLNlYqb7Ug==", - "dev": true, - "requires": { - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-eth-accounts": "1.7.4", - "web3-eth-contract": "1.7.4", - "web3-eth-ens": "1.7.4", - "web3-eth-iban": "1.7.4", - "web3-eth-personal": "1.7.4", - "web3-net": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-eth-abi": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.7.4.tgz", - "integrity": "sha512-eMZr8zgTbqyL9MCTCAvb67RbVyN5ZX7DvA0jbLOqRWCiw+KlJKTGnymKO6jPE8n5yjk4w01e165Qb11hTDwHgg==", - "dev": true, - "requires": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.7.4" - } - }, - "web3-eth-accounts": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.7.4.tgz", - "integrity": "sha512-Y9vYLRKP7VU7Cgq6wG1jFaG2k3/eIuiTKAG8RAuQnb6Cd9k5BRqTm5uPIiSo0AP/u11jDomZ8j7+WEgkU9+Btw==", - "dev": true, - "requires": { - "@ethereumjs/common": "^2.5.0", - "@ethereumjs/tx": "^3.3.2", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-util": "^7.0.10", - "scrypt-js": "^3.0.1", - "uuid": "3.3.2", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-eth-contract": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.7.4.tgz", - "integrity": "sha512-ZgSZMDVI1pE9uMQpK0T0HDT2oewHcfTCv0osEqf5qyn5KrcQDg1GT96/+S0dfqZ4HKj4lzS5O0rFyQiLPQ8LzQ==", - "dev": true, - "requires": { - "@types/bn.js": "^5.1.0", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-eth-ens": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.7.4.tgz", - "integrity": "sha512-Gw5CVU1+bFXP5RVXTCqJOmHn71X2ghNk9VcEH+9PchLr0PrKbHTA3hySpsPco1WJAyK4t8SNQVlNr3+bJ6/WZA==", - "dev": true, - "requires": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-promievent": "1.7.4", - "web3-eth-abi": "1.7.4", - "web3-eth-contract": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-eth-iban": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.7.4.tgz", - "integrity": "sha512-XyrsgWlZQMv5gRcjXMsNvAoCRvV5wN7YCfFV5+tHUCqN8g9T/o4XUS20vDWD0k4HNiAcWGFqT1nrls02MGZ08w==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "web3-utils": "1.7.4" - } - }, - "web3-eth-personal": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.7.4.tgz", - "integrity": "sha512-O10C1Hln5wvLQsDhlhmV58RhXo+GPZ5+W76frSsyIrkJWLtYQTCr5WxHtRC9sMD1idXLqODKKgI2DL+7xeZ0/g==", - "dev": true, - "requires": { - "@types/node": "^12.12.6", - "web3-core": "1.7.4", - "web3-core-helpers": "1.7.4", - "web3-core-method": "1.7.4", - "web3-net": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-net": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.7.4.tgz", - "integrity": "sha512-d2Gj+DIARHvwIdmxFQ4PwAAXZVxYCR2lET0cxz4KXbE5Og3DNjJi+MoPkX+WqoUXqimu/EOd4Cd+7gefqVAFDg==", - "dev": true, - "requires": { - "web3-core": "1.7.4", - "web3-core-method": "1.7.4", - "web3-utils": "1.7.4" - } - }, - "web3-providers-http": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.7.4.tgz", - "integrity": "sha512-AU+/S+49rcogUER99TlhW+UBMk0N2DxvN54CJ2pK7alc2TQ7+cprNPLHJu4KREe8ndV0fT6JtWUfOMyTvl+FRA==", - "dev": true, - "requires": { - "web3-core-helpers": "1.7.4", - "xhr2-cookies": "1.1.0" - } - }, - "web3-providers-ipc": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.7.4.tgz", - "integrity": "sha512-jhArOZ235dZy8fS8090t60nTxbd1ap92ibQw5xIrAQ9m7LcZKNfmLAQUVsD+3dTFvadRMi6z1vCO7zRi84gWHw==", - "dev": true, - "requires": { - "oboe": "2.1.5", - "web3-core-helpers": "1.7.4" - } - }, - "web3-providers-ws": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.7.4.tgz", - "integrity": "sha512-g72X77nrcHMFU8hRzQJzfgi/072n8dHwRCoTw+WQrGp+XCQ71fsk2qIu3Tp+nlp5BPn8bRudQbPblVm2uT4myQ==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.7.4", - "websocket": "^1.0.32" - } - }, - "web3-shh": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.7.4.tgz", - "integrity": "sha512-mlSZxSYcMkuMCxqhTYnZkUdahZ11h+bBv/8TlkXp/IHpEe4/Gg+KAbmfudakq3EzG/04z70XQmPgWcUPrsEJ+A==", - "dev": true, - "requires": { - "web3-core": "1.7.4", - "web3-core-method": "1.7.4", - "web3-core-subscriptions": "1.7.4", - "web3-net": "1.7.4" - } - }, - "web3-utils": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz", - "integrity": "sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - } - } - } - }, - "@trufflesuite/chromafi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@trufflesuite/chromafi/-/chromafi-3.0.0.tgz", - "integrity": "sha512-oqWcOqn8nT1bwlPPfidfzS55vqcIDdpfzo3HbU9EnUmcSTX+I8z0UyUFI3tZQjByVJulbzxHxUGS3ZJPwK/GPQ==", - "dev": true, - "requires": { - "camelcase": "^4.1.0", - "chalk": "^2.3.2", - "cheerio": "^1.0.0-rc.2", - "detect-indent": "^5.0.0", - "highlight.js": "^10.4.1", - "lodash.merge": "^4.6.2", - "strip-ansi": "^4.0.0", - "strip-indent": "^2.0.0" - } - }, - "@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "@typechain/ethers-v5": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-2.0.0.tgz", - "integrity": "sha512-0xdCkyGOzdqh4h5JSf+zoWx85IusEjDcPIwNEHP8mrWSnCae4rvrqB+/gtpdNfX7zjlFlZiMeePn2r63EI3Lrw==", - "dev": true, - "requires": { - "ethers": "^5.0.2" - } - }, - "@types/abstract-leveldown": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@types/abstract-leveldown/-/abstract-leveldown-7.2.2.tgz", - "integrity": "sha512-EVVYLp4D3zwP5/sS2S5x70t1w0BDrjbv0x0d0znngFKX/YExe+il/JAlHOEpo0cTdtY4Ohnllen32hPganG20w==", - "dev": true - }, - "@types/bn.js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dev": true, - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "@types/chai": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.6.tgz", - "integrity": "sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==", - "dev": true, - "peer": true - }, - "@types/cli-progress": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/@types/cli-progress/-/cli-progress-3.11.2.tgz", - "integrity": "sha512-Yt/8rEJalfa9ve2SbfQnwFHrc9QF52JIZYHW3FDaTMpkCvnns26ueKiPHDxyJ0CS//IqjMINTx7R5Xa7k7uFHQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/concat-stream": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", - "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/form-data": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", - "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true, - "peer": true - }, - "@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/level-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/level-errors/-/level-errors-3.0.0.tgz", - "integrity": "sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ==", - "dev": true - }, - "@types/levelup": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@types/levelup/-/levelup-4.3.3.tgz", - "integrity": "sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA==", - "dev": true, - "requires": { - "@types/abstract-leveldown": "*", - "@types/level-errors": "*", - "@types/node": "*" - } - }, - "@types/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", - "dev": true - }, - "@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true - }, - "@types/mkdirp": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz", - "integrity": "sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/node": { - "version": "20.5.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", - "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==", - "dev": true - }, - "@types/node-fetch": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", - "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", - "dev": true, - "requires": { - "@types/node": "*", - "form-data": "^3.0.0" - } - }, - "@types/pbkdf2": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", - "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", - "dev": true - }, - "@types/qs": { - "version": "6.9.8", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", - "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==", - "dev": true - }, - "@types/readable-stream": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", - "integrity": "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==", - "dev": true, - "requires": { - "@types/node": "*", - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "@types/resolve": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", - "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/sinon": { - "version": "10.0.16", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.16.tgz", - "integrity": "sha512-j2Du5SYpXZjJVJtXBokASpPRj+e2z+VUhCPHmM6WMfe3dpHu6iVKJMU6AiBcMp/XTAYnEj6Wc1trJUWwZ0QaAQ==", - "dev": true, - "peer": true, - "requires": { - "@types/sinonjs__fake-timers": "*" - } - }, - "@types/sinon-chai": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.9.tgz", - "integrity": "sha512-/19t63pFYU0ikrdbXKBWj9PCdnKyTd0Qkz0X91Ta081cYsq90OxYdcWwK/dwEoDa6dtXgj2HJfmzgq+QZTHdmQ==", - "dev": true, - "peer": true, - "requires": { - "@types/chai": "*", - "@types/sinon": "*" - } - }, - "@types/sinonjs__fake-timers": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz", - "integrity": "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==", - "dev": true, - "peer": true - }, - "@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true - }, - "abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", - "dev": true - }, - "abortcontroller-polyfill": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", - "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==", - "dev": true - }, - "abstract-level": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", - "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", - "dev": true, - "requires": { - "buffer": "^6.0.3", - "catering": "^2.1.0", - "is-buffer": "^2.0.5", - "level-supports": "^4.0.0", - "level-transcoder": "^1.0.1", - "module-error": "^1.0.1", - "queue-microtask": "^1.2.3" - }, - "dependencies": { - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - } - } - }, - "abstract-leveldown": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz", - "integrity": "sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - }, - "dependencies": { - "level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "dev": true, - "requires": { - "xtend": "^4.0.2" - } - } - } - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "dev": true - }, - "adm-zip": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", - "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", - "dev": true - }, - "aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", - "dev": true, - "optional": true - }, - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } - } - }, - "ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", - "dev": true - }, - "antlr4ts": { - "version": "0.5.0-alpha.4", - "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", - "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", - "dev": true - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "array-back": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", - "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", - "dev": true, - "requires": { - "typical": "^2.6.1" - } - }, - "array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", - "dev": true - }, - "array.prototype.findlast": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.3.tgz", - "integrity": "sha512-kcBubumjciBg4JKp5KTKtI7ec7tRefPk88yjkWJwaVKYd9QfTaxcsOxoMNKd7iBr447zCfDV0z1kOF47umv42g==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - } - }, - "array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - } - }, - "array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.reduce": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz", - "integrity": "sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - } - }, - "arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" - } - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true - }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "async-eventemitter": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", - "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", - "dev": true, - "requires": { - "async": "^2.4.0" - } - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true - }, - "aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", - "dev": true - }, - "b4a": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", - "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - }, - "dependencies": { - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true - } - } - }, - "bech32": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" - }, - "big-integer": { - "version": "1.6.36", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz", - "integrity": "sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==", - "dev": true - }, - "big.js": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.1.tgz", - "integrity": "sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==", - "dev": true - }, - "bigint-crypto-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz", - "integrity": "sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==", - "dev": true - }, - "bignumber.js": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", - "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "blake-hash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/blake-hash/-/blake-hash-2.0.0.tgz", - "integrity": "sha512-Igj8YowDu1PRkRsxZA7NVkdFNxH5rKv5cpLxQ0CVXSIA77pVYwCPRQJ2sMew/oneUpfuYRyjG6r8SmmmnbZb1w==", - "dev": true, - "requires": { - "node-addon-api": "^3.0.0", - "node-gyp-build": "^4.2.2", - "readable-stream": "^3.6.0" - } - }, - "blake2b": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/blake2b/-/blake2b-2.1.4.tgz", - "integrity": "sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A==", - "dev": true, - "requires": { - "blake2b-wasm": "^2.4.0", - "nanoassert": "^2.0.0" - } - }, - "blake2b-wasm": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz", - "integrity": "sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==", - "dev": true, - "requires": { - "b4a": "^1.0.1", - "nanoassert": "^2.0.0" - } - }, - "blakejs": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", - "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", - "dev": true - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - } - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" - }, - "browser-level": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", - "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", - "dev": true, - "requires": { - "abstract-level": "^1.0.2", - "catering": "^2.1.1", - "module-error": "^1.0.2", - "run-parallel-limit": "^1.1.0" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "dependencies": { - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "dev": true - } - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, - "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "dev": true, - "requires": { - "base-x": "^3.0.2" - } - }, - "bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "dev": true, - "requires": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "buffer-to-arraybuffer": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", - "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==", - "dev": true - }, - "buffer-writer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", - "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", - "dev": true - }, - "buffer-xor": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-2.0.2.tgz", - "integrity": "sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.1" - } - }, - "bufferutil": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", - "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", - "devOptional": true, - "requires": { - "node-gyp-build": "^4.3.0" - } - }, - "busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dev": true, - "requires": { - "streamsearch": "^1.1.0" - } - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - }, - "cacheable-lookup": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", - "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", - "dev": true - }, - "cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", - "dev": true, - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", - "dev": true - }, - "cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", - "dev": true, - "requires": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - } - }, - "case": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", - "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true - }, - "catering": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", - "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", - "dev": true - }, - "cbor": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", - "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", - "dev": true, - "requires": { - "nofilter": "^3.1.0" - } - }, - "chai": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.8.tgz", - "integrity": "sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ==", - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "change-case": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.0.2.tgz", - "integrity": "sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==", - "dev": true, - "requires": { - "camel-case": "^3.0.0", - "constant-case": "^2.0.0", - "dot-case": "^2.1.0", - "header-case": "^1.0.0", - "is-lower-case": "^1.1.0", - "is-upper-case": "^1.1.0", - "lower-case": "^1.1.1", - "lower-case-first": "^1.0.0", - "no-case": "^2.3.2", - "param-case": "^2.1.0", - "pascal-case": "^2.0.0", - "path-case": "^2.1.0", - "sentence-case": "^2.1.0", - "snake-case": "^2.1.0", - "swap-case": "^1.1.0", - "title-case": "^2.1.0", - "upper-case": "^1.1.1", - "upper-case-first": "^1.1.0" - } - }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", - "dev": true - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==" - }, - "cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", - "dev": true, - "requires": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" - } - }, - "cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "cids": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", - "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "class-is": "^1.1.0", - "multibase": "~0.6.0", - "multicodec": "^1.0.0", - "multihashes": "~0.4.15" - }, - "dependencies": { - "multicodec": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", - "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", - "dev": true, - "requires": { - "buffer": "^5.6.0", - "varint": "^5.0.0" - } - } - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "circomlibjs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/circomlibjs/-/circomlibjs-0.1.1.tgz", - "integrity": "sha512-Bl7Mylf/VERdI5bRTIQ4hpi2EgbfIvEyJrn/MPh2pEqScbCkatX44RF8fuNGigoiQGdhItaIikgHKLTdlPPLPQ==", - "dev": true, - "requires": { - "blake-hash": "^2.0.0", - "blake2b": "^2.1.3", - "ethers": "^5.5.1", - "ffjavascript": "^0.2.45" - } - }, - "class-is": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", - "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==", - "dev": true - }, - "classic-level": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.3.0.tgz", - "integrity": "sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==", - "dev": true, - "requires": { - "abstract-level": "^1.0.2", - "catering": "^2.1.0", - "module-error": "^1.0.1", - "napi-macros": "^2.2.2", - "node-gyp-build": "^4.3.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-progress": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", - "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==", - "dev": true, - "requires": { - "string-width": "^4.2.3" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "cli-table3": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", - "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", - "dev": true, - "requires": { - "colors": "^1.1.2", - "object-assign": "^4.1.0", - "string-width": "^2.1.1" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", - "dev": true - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "command-exists": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", - "dev": true - }, - "command-line-args": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-4.0.7.tgz", - "integrity": "sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA==", - "dev": true, - "requires": { - "array-back": "^2.0.0", - "find-replace": "^1.0.3", - "typical": "^2.6.1" - } - }, - "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true - }, - "compare-versions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.0.tgz", - "integrity": "sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true - }, - "constant-case": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", - "integrity": "sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==", - "dev": true, - "requires": { - "snake-case": "^2.1.0", - "upper-case": "^1.1.1" - } - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "requires": { - "safe-buffer": "5.2.1" - } - }, - "content-hash": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", - "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", - "dev": true, - "requires": { - "cids": "^0.7.1", - "multicodec": "^0.5.5", - "multihashes": "^0.4.15" - } - }, - "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true - }, - "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "cookiejar": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", - "dev": true - }, - "core-js-pure": { - "version": "3.32.2", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.32.2.tgz", - "integrity": "sha512-Y2rxThOuNywTjnX/PgA5vWM6CZ9QB9sz9oGeCixV8MqXZO70z/5SHzf9EeBrEBK0PN36DnEBBu9O/aGWzKuMZQ==", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "dev": true - }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "dev": true, - "requires": { - "node-fetch": "^2.6.12" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", - "dev": true - }, - "crypto-addr-codec": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/crypto-addr-codec/-/crypto-addr-codec-0.1.8.tgz", - "integrity": "sha512-GqAK90iLLgP3FvhNmHbpT3wR6dEdaM8hZyZtLX29SPardh3OA13RFLHDR6sntGCgRWOfiHqW6sIyohpNqOtV/g==", - "dev": true, - "requires": { - "base-x": "^3.0.8", - "big-integer": "1.6.36", - "blakejs": "^1.1.0", - "bs58": "^4.0.1", - "ripemd160-min": "0.0.6", - "safe-buffer": "^5.2.0", - "sha3": "^2.1.1" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "death": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", - "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "dev": true - }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "requires": { - "mimic-response": "^3.1.0" - }, - "dependencies": { - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true - } - } - }, - "deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true - }, - "deferred-leveldown": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz", - "integrity": "sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==", - "dev": true, - "requires": { - "abstract-leveldown": "~6.2.1", - "inherits": "^2.0.3" - }, - "dependencies": { - "abstract-leveldown": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", - "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - } - }, - "level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "dev": true, - "requires": { - "xtend": "^4.0.2" - } - } - } - }, - "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "des.js": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", - "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true - }, - "detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", - "dev": true - }, - "detect-port": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", - "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", - "dev": true, - "requires": { - "address": "^1.0.1", - "debug": "4" - } - }, - "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", - "dev": true - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0" - } - }, - "domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dev": true, - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - } - }, - "dot-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", - "integrity": "sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==", - "dev": true, - "requires": { - "no-case": "^2.2.0" - } - }, - "dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", - "dev": true - }, - "duplexer3": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", - "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", - "dev": true - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", - "dev": true, - "requires": { - "jake": "^10.8.5" - } - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true - }, - "encoding-down": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz", - "integrity": "sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==", - "dev": true, - "requires": { - "abstract-leveldown": "^6.2.1", - "inherits": "^2.0.3", - "level-codec": "^9.0.0", - "level-errors": "^2.0.0" - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true - }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true - }, - "errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", - "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.1", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.1", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "safe-array-concat": "^1.0.0", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.10" - } - }, - "es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true - }, - "es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - } - }, - "es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", - "dev": true, - "requires": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dev": true, - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", - "dev": true, - "requires": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.2.0" - }, - "dependencies": { - "estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - } - } - }, - "eslint": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", - "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.48.0", - "@humanwhocodes/config-array": "^0.11.10", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "eslint-config-airbnb-base": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", - "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", - "dev": true, - "requires": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5", - "semver": "^6.3.0" - } - }, - "eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "peer": true, - "requires": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "peer": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", - "dev": true, - "peer": true, - "requires": { - "debug": "^3.2.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "peer": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-plugin-import": { - "version": "2.28.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", - "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", - "dev": true, - "peer": true, - "requires": { - "array-includes": "^3.1.6", - "array.prototype.findlastindex": "^1.2.2", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.8.0", - "has": "^1.0.3", - "is-core-module": "^2.13.0", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.6", - "object.groupby": "^1.0.0", - "object.values": "^1.1.6", - "semver": "^6.3.1", - "tsconfig-paths": "^3.14.2" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "peer": true, - "requires": { - "ms": "^2.1.1" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "peer": true, - "requires": { - "esutils": "^2.0.2" - } - } - } - }, - "eslint-plugin-mocha": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-9.0.0.tgz", - "integrity": "sha512-d7knAcQj1jPCzZf3caeBIn3BnW6ikcvfz0kSqQpwPYcVGLoJV5sz0l0OJB2LR8I7dvTDbqq1oV6ylhSgzA10zg==", - "dev": true, - "requires": { - "eslint-utils": "^3.0.0", - "ramda": "^0.27.1" - } - }, - "eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true - }, - "espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "requires": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - } - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", - "dev": true - }, - "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true - }, - "eth-ens-namehash": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", - "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==", - "dev": true, - "requires": { - "idna-uts46-hx": "^2.3.1", - "js-sha3": "^0.5.7" - }, - "dependencies": { - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", - "dev": true - } - } - }, - "eth-gas-reporter": { - "version": "0.2.25", - "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz", - "integrity": "sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ==", - "dev": true, - "requires": { - "@ethersproject/abi": "^5.0.0-beta.146", - "@solidity-parser/parser": "^0.14.0", - "cli-table3": "^0.5.0", - "colors": "1.4.0", - "ethereum-cryptography": "^1.0.3", - "ethers": "^4.0.40", - "fs-readdir-recursive": "^1.1.0", - "lodash": "^4.17.14", - "markdown-table": "^1.1.3", - "mocha": "^7.1.1", - "req-cwd": "^2.0.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.5", - "sha1": "^1.1.1", - "sync-request": "^6.0.0" - }, - "dependencies": { - "@noble/hashes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", - "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", - "dev": true - }, - "@scure/bip32": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", - "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", - "dev": true, - "requires": { - "@noble/hashes": "~1.2.0", - "@noble/secp256k1": "~1.7.0", - "@scure/base": "~1.1.0" - } - }, - "@scure/bip39": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", - "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", - "dev": true, - "requires": { - "@noble/hashes": "~1.2.0", - "@scure/base": "~1.1.0" - } - }, - "ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "chokidar": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", - "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.2.0" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "ethereum-cryptography": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", - "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", - "dev": true, - "requires": { - "@noble/hashes": "1.2.0", - "@noble/secp256k1": "1.7.1", - "@scure/bip32": "1.1.5", - "@scure/bip39": "1.1.1" - } - }, - "ethers": { - "version": "4.0.49", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", - "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", - "dev": true, - "requires": { - "aes-js": "3.0.0", - "bn.js": "^4.11.9", - "elliptic": "6.5.4", - "hash.js": "1.1.3", - "js-sha3": "0.5.7", - "scrypt-js": "2.0.4", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "flat": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", - "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", - "dev": true, - "requires": { - "is-buffer": "~2.0.3" - } - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true - }, - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "mocha": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", - "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", - "dev": true, - "requires": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "chokidar": "3.3.0", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "3.0.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.5", - "ms": "2.1.1", - "node-environment-flags": "1.0.6", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true - }, - "readdirp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", - "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", - "dev": true, - "requires": { - "picomatch": "^2.0.4" - } - }, - "scrypt-js": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", - "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==", - "dev": true - }, - "setimmediate": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true - }, - "supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "yargs-unparser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", - "dev": true, - "requires": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - } - } - } - }, - "eth-lib": { - "version": "0.1.29", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", - "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "nano-json-stream-parser": "^0.1.2", - "servify": "^0.1.12", - "ws": "^3.0.0", - "xhr-request-promise": "^0.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } - } - } - }, - "ethereum-bloom-filters": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", - "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", - "dev": true, - "requires": { - "js-sha3": "^0.8.0" - } - }, - "ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, - "requires": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "ethereum-waffle": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/ethereum-waffle/-/ethereum-waffle-3.4.4.tgz", - "integrity": "sha512-PA9+jCjw4WC3Oc5ocSMBj5sXvueWQeAbvCA+hUlb6oFgwwKyq5ka3bWQ7QZcjzIX+TdFkxP4IbFmoY2D8Dkj9Q==", - "dev": true, - "requires": { - "@ethereum-waffle/chai": "^3.4.4", - "@ethereum-waffle/compiler": "^3.4.4", - "@ethereum-waffle/mock-contract": "^3.4.4", - "@ethereum-waffle/provider": "^3.4.4", - "ethers": "^5.0.1" - } - }, - "ethereumjs-abi": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", - "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", - "dev": true, - "requires": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - }, - "dependencies": { - "@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "ethereumjs-util": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", - "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", - "dev": true, - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - } - } - }, - "ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dev": true, - "requires": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - } - }, - "ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "requires": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" - } - }, - "ethjs-abi": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ethjs-abi/-/ethjs-abi-0.2.1.tgz", - "integrity": "sha512-g2AULSDYI6nEJyJaEVEXtTimRY2aPC2fi7ddSy0W+LXvEVL8Fe1y76o43ecbgdUKwZD+xsmEgX1yJr1Ia3r1IA==", - "dev": true, - "requires": { - "bn.js": "4.11.6", - "js-sha3": "0.5.5", - "number-to-bn": "1.7.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", - "dev": true - }, - "js-sha3": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.5.tgz", - "integrity": "sha512-yLLwn44IVeunwjpDVTDZmQeVbB0h+dZpY2eO68B/Zik8hu6dH+rKeLxwua79GGIvW6xr8NBAcrtiUbYrTjEFTA==", - "dev": true - } - } - }, - "ethjs-unit": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", - "dev": true, - "requires": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", - "dev": true - } - } - }, - "ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "dev": true, - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - }, - "eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dev": true, - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - } - }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - } - } - }, - "ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", - "dev": true, - "requires": { - "type": "^2.7.2" - }, - "dependencies": { - "type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true - }, - "fast-check": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.1.1.tgz", - "integrity": "sha512-3vtXinVyuUKCKFKYcwXhGE6NtGWkqF8Yh3rvMZNzmwz8EPrgoc/v4pDdLHyLnCyCI5MZpZZkDEwFyXyEONOxpA==", - "dev": true, - "requires": { - "pure-rand": "^5.0.1" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "ffjavascript": { - "version": "0.2.60", - "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.60.tgz", - "integrity": "sha512-T/9bnEL5xAZRDbQoEMf+pM9nrhK+C3JyZNmqiWub26EQorW7Jt+jR54gpqDhceA4Nj0YctPQwYnl8xa52/A26A==", - "dev": true, - "requires": { - "wasmbuilder": "0.0.16", - "wasmcurves": "0.2.2", - "web-worker": "^1.2.0" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "requires": { - "minimatch": "^5.0.1" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "find-replace": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz", - "integrity": "sha512-KrUnjzDCD9426YnCP56zGYy/eieTnhtK6Vn++j+JJzmlsWWwEkDnsyVF575spT6HJ6Ow9tlbT3TQTDsa+O4UWA==", - "dev": true, - "requires": { - "array-back": "^1.0.4", - "test-value": "^2.1.0" - }, - "dependencies": { - "array-back": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", - "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==", - "dev": true, - "requires": { - "typical": "^2.6.0" - } - } - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "find-yarn-workspace-root": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", - "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", - "dev": true, - "requires": { - "micromatch": "^4.0.2" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "flat-cache": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", - "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", - "dev": true, - "requires": { - "flatted": "^3.2.7", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "requires": { - "is-callable": "^1.1.3" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true - }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "form-data-encoder": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz", - "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==", - "dev": true - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true - }, - "fp-ts": { - "version": "1.19.3", - "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", - "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", - "dev": true - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - } - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "ganache-core": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/ganache-core/-/ganache-core-2.13.2.tgz", - "integrity": "sha512-tIF5cR+ANQz0+3pHWxHjIwHqFXcVo0Mb+kcsNhglNFALcYo49aQpnS9dqHartqPfMFjiHh/qFoD3mYK0d/qGgw==", - "dev": true, - "requires": { - "abstract-leveldown": "3.0.0", - "async": "2.6.2", - "bip39": "2.5.0", - "cachedown": "1.0.0", - "clone": "2.1.2", - "debug": "3.2.6", - "encoding-down": "5.0.4", - "eth-sig-util": "3.0.0", - "ethereumjs-abi": "0.6.8", - "ethereumjs-account": "3.0.0", - "ethereumjs-block": "2.2.2", - "ethereumjs-common": "1.5.0", - "ethereumjs-tx": "2.1.2", - "ethereumjs-util": "6.2.1", - "ethereumjs-vm": "4.2.0", - "ethereumjs-wallet": "0.6.5", - "heap": "0.2.6", - "keccak": "3.0.1", - "level-sublevel": "6.6.4", - "levelup": "3.1.1", - "lodash": "4.17.20", - "lru-cache": "5.1.1", - "merkle-patricia-tree": "3.0.0", - "patch-package": "6.2.2", - "seedrandom": "3.0.1", - "source-map-support": "0.5.12", - "tmp": "0.1.0", - "web3": "1.2.11", - "web3-provider-engine": "14.2.1", - "websocket": "1.0.32" - }, - "dependencies": { - "@ethersproject/abi": { - "version": "5.0.0-beta.153", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/address": ">=5.0.0-beta.128", - "@ethersproject/bignumber": ">=5.0.0-beta.130", - "@ethersproject/bytes": ">=5.0.0-beta.129", - "@ethersproject/constants": ">=5.0.0-beta.128", - "@ethersproject/hash": ">=5.0.0-beta.128", - "@ethersproject/keccak256": ">=5.0.0-beta.127", - "@ethersproject/logger": ">=5.0.0-beta.129", - "@ethersproject/properties": ">=5.0.0-beta.131", - "@ethersproject/strings": ">=5.0.0-beta.130" - } - }, - "@ethersproject/abstract-provider": { - "version": "5.0.8", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/bignumber": "^5.0.13", - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/logger": "^5.0.8", - "@ethersproject/networks": "^5.0.7", - "@ethersproject/properties": "^5.0.7", - "@ethersproject/transactions": "^5.0.9", - "@ethersproject/web": "^5.0.12" - } - }, - "@ethersproject/abstract-signer": { - "version": "5.0.10", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/abstract-provider": "^5.0.8", - "@ethersproject/bignumber": "^5.0.13", - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/logger": "^5.0.8", - "@ethersproject/properties": "^5.0.7" - } - }, - "@ethersproject/address": { - "version": "5.0.9", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/bignumber": "^5.0.13", - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/keccak256": "^5.0.7", - "@ethersproject/logger": "^5.0.8", - "@ethersproject/rlp": "^5.0.7" - } - }, - "@ethersproject/base64": { - "version": "5.0.7", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/bytes": "^5.0.9" - } - }, - "@ethersproject/bignumber": { - "version": "5.0.13", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/logger": "^5.0.8", - "bn.js": "^4.4.0" - } - }, - "@ethersproject/bytes": { - "version": "5.0.9", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/logger": "^5.0.8" - } - }, - "@ethersproject/constants": { - "version": "5.0.8", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/bignumber": "^5.0.13" - } - }, - "@ethersproject/hash": { - "version": "5.0.10", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/abstract-signer": "^5.0.10", - "@ethersproject/address": "^5.0.9", - "@ethersproject/bignumber": "^5.0.13", - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/keccak256": "^5.0.7", - "@ethersproject/logger": "^5.0.8", - "@ethersproject/properties": "^5.0.7", - "@ethersproject/strings": "^5.0.8" - } - }, - "@ethersproject/keccak256": { - "version": "5.0.7", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/bytes": "^5.0.9", - "js-sha3": "0.5.7" - } - }, - "@ethersproject/logger": { - "version": "5.0.8", - "dev": true, - "optional": true - }, - "@ethersproject/networks": { - "version": "5.0.7", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/logger": "^5.0.8" - } - }, - "@ethersproject/properties": { - "version": "5.0.7", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/logger": "^5.0.8" - } - }, - "@ethersproject/rlp": { - "version": "5.0.7", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/logger": "^5.0.8" - } - }, - "@ethersproject/signing-key": { - "version": "5.0.8", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/logger": "^5.0.8", - "@ethersproject/properties": "^5.0.7", - "elliptic": "6.5.3" - } - }, - "@ethersproject/strings": { - "version": "5.0.8", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/constants": "^5.0.8", - "@ethersproject/logger": "^5.0.8" - } - }, - "@ethersproject/transactions": { - "version": "5.0.9", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/address": "^5.0.9", - "@ethersproject/bignumber": "^5.0.13", - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/constants": "^5.0.8", - "@ethersproject/keccak256": "^5.0.7", - "@ethersproject/logger": "^5.0.8", - "@ethersproject/properties": "^5.0.7", - "@ethersproject/rlp": "^5.0.7", - "@ethersproject/signing-key": "^5.0.8" - } - }, - "@ethersproject/web": { - "version": "5.0.12", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/base64": "^5.0.7", - "@ethersproject/bytes": "^5.0.9", - "@ethersproject/logger": "^5.0.8", - "@ethersproject/properties": "^5.0.7", - "@ethersproject/strings": "^5.0.8" - } - }, - "@sindresorhus/is": { - "version": "0.14.0", - "dev": true, - "optional": true - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "dev": true, - "optional": true, - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "@types/bn.js": { - "version": "4.11.6", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/node": { - "version": "14.14.20", - "dev": true - }, - "@types/pbkdf2": { - "version": "3.1.0", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/secp256k1": { - "version": "4.0.1", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@yarnpkg/lockfile": { - "version": "1.1.0", - "dev": true - }, - "abstract-leveldown": { - "version": "3.0.0", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - }, - "accepts": { - "version": "1.3.7", - "dev": true, - "optional": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "aes-js": { - "version": "3.1.2", - "dev": true, - "optional": true - }, - "ajv": { - "version": "6.12.6", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-styles": { - "version": "3.2.1", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "arr-diff": { - "version": "4.0.0", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "dev": true, - "optional": true - }, - "array-unique": { - "version": "0.3.2", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "5.4.1", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "dev": true - }, - "async": { - "version": "2.6.2", - "dev": true, - "requires": { - "lodash": "^4.17.11" - } - }, - "async-eventemitter": { - "version": "0.2.4", - "dev": true, - "requires": { - "async": "^2.4.0" - } - }, - "async-limiter": { - "version": "1.0.1", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "dev": true - }, - "atob": { - "version": "2.1.2", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "dev": true - }, - "aws4": { - "version": "1.11.0", - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "js-tokens": { - "version": "3.0.2", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "dev": true - } - } - }, - "babel-core": { - "version": "6.26.3", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "json5": { - "version": "0.5.1", - "dev": true - }, - "ms": { - "version": "2.0.0", - "dev": true - }, - "slash": { - "version": "1.0.0", - "dev": true - } - } - }, - "babel-generator": { - "version": "6.26.1", - "dev": true, - "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "1.3.0", - "dev": true - } - } - }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-define-map": { - "version": "6.26.0", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-regex": { - "version": "6.26.0", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helpers": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-messages": { - "version": "6.23.0", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "dev": true - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "dev": true - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "dev": true - }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" - } - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", - "babel-plugin-syntax-exponentiation-operator": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "dev": true, - "requires": { - "regenerator-transform": "^0.10.0" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-preset-env": { - "version": "1.7.0", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-to-generator": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.23.0", - "babel-plugin-transform-es2015-classes": "^6.23.0", - "babel-plugin-transform-es2015-computed-properties": "^6.22.0", - "babel-plugin-transform-es2015-destructuring": "^6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", - "babel-plugin-transform-es2015-for-of": "^6.23.0", - "babel-plugin-transform-es2015-function-name": "^6.22.0", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.22.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-umd": "^6.23.0", - "babel-plugin-transform-es2015-object-super": "^6.22.0", - "babel-plugin-transform-es2015-parameters": "^6.23.0", - "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", - "babel-plugin-transform-exponentiation-operator": "^6.22.0", - "babel-plugin-transform-regenerator": "^6.22.0", - "browserslist": "^3.2.6", - "invariant": "^2.2.2", - "semver": "^5.3.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "dev": true - } - } - }, - "babel-register": { - "version": "6.26.0", - "dev": true, - "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - }, - "dependencies": { - "source-map-support": { - "version": "0.4.18", - "dev": true, - "requires": { - "source-map": "^0.5.6" - } - } - } - }, - "babel-runtime": { - "version": "6.26.0", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-template": { - "version": "6.26.0", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "babel-traverse": { - "version": "6.26.0", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "globals": { - "version": "9.18.0", - "dev": true - }, - "ms": { - "version": "2.0.0", - "dev": true - } - } - }, - "babel-types": { - "version": "6.26.0", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "to-fast-properties": { - "version": "1.0.3", - "dev": true - } - } - }, - "babelify": { - "version": "7.3.0", - "dev": true, - "requires": { - "babel-core": "^6.0.14", - "object-assign": "^4.0.0" - } - }, - "babylon": { - "version": "6.18.0", - "dev": true - }, - "backoff": { - "version": "2.5.0", - "dev": true, - "requires": { - "precond": "0.2" - } - }, - "balanced-match": { - "version": "1.0.0", - "dev": true - }, - "base": { - "version": "0.11.2", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "base-x": { - "version": "3.0.8", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "base64-js": { - "version": "1.5.1", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - }, - "dependencies": { - "tweetnacl": { - "version": "0.14.5", - "dev": true - } - } - }, - "bignumber.js": { - "version": "9.0.1", - "dev": true, - "optional": true - }, - "bip39": { - "version": "2.5.0", - "dev": true, - "requires": { - "create-hash": "^1.1.0", - "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1", - "safe-buffer": "^5.0.1", - "unorm": "^1.3.3" - } - }, - "blakejs": { - "version": "1.1.0", - "dev": true - }, - "bluebird": { - "version": "3.7.2", - "dev": true, - "optional": true - }, - "bn.js": { - "version": "4.11.9", - "dev": true - }, - "body-parser": { - "version": "1.19.0", - "dev": true, - "optional": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "dev": true, - "optional": true - }, - "qs": { - "version": "6.7.0", - "dev": true, - "optional": true - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "brorand": { - "version": "1.1.0", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "dev": true, - "optional": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "dev": true, - "optional": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.1.0", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - }, - "dependencies": { - "bn.js": { - "version": "5.1.3", - "dev": true, - "optional": true - } - } - }, - "browserify-sign": { - "version": "4.2.1", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "bn.js": { - "version": "5.1.3", - "dev": true, - "optional": true - }, - "readable-stream": { - "version": "3.6.0", - "dev": true, - "optional": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "browserslist": { - "version": "3.2.8", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30000844", - "electron-to-chromium": "^1.3.47" - } - }, - "bs58": { - "version": "4.0.1", - "dev": true, - "requires": { - "base-x": "^3.0.2" - } - }, - "bs58check": { - "version": "2.1.2", - "dev": true, - "requires": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "buffer": { - "version": "5.7.1", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-from": { - "version": "1.1.1", - "dev": true - }, - "buffer-to-arraybuffer": { - "version": "0.0.5", - "dev": true, - "optional": true - }, - "buffer-xor": { - "version": "1.0.3", - "dev": true - }, - "bufferutil": { - "version": "4.0.3", - "dev": true, - "requires": { - "node-gyp-build": "^4.2.0" - } - }, - "bytes": { - "version": "3.1.0", - "dev": true, - "optional": true - }, - "bytewise": { - "version": "1.1.0", - "dev": true, - "requires": { - "bytewise-core": "^1.2.2", - "typewise": "^1.0.3" - } - }, - "bytewise-core": { - "version": "1.2.3", - "dev": true, - "requires": { - "typewise-core": "^1.2" - } - }, - "cache-base": { - "version": "1.0.1", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "cacheable-request": { - "version": "6.1.0", - "dev": true, - "optional": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "lowercase-keys": { - "version": "2.0.0", - "dev": true, - "optional": true - } - } - }, - "cachedown": { - "version": "1.0.0", - "dev": true, - "requires": { - "abstract-leveldown": "^2.4.1", - "lru-cache": "^3.2.0" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.7.2", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - }, - "lru-cache": { - "version": "3.2.0", - "dev": true, - "requires": { - "pseudomap": "^1.0.1" - } - } - } - }, - "call-bind": { - "version": "1.0.2", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "caniuse-lite": { - "version": "1.0.30001174", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "checkpoint-store": { - "version": "1.1.0", - "dev": true, - "requires": { - "functional-red-black-tree": "^1.0.1" - } - }, - "chownr": { - "version": "1.1.4", - "dev": true, - "optional": true - }, - "ci-info": { - "version": "2.0.0", - "dev": true - }, - "cids": { - "version": "0.7.5", - "dev": true, - "optional": true, - "requires": { - "buffer": "^5.5.0", - "class-is": "^1.1.0", - "multibase": "~0.6.0", - "multicodec": "^1.0.0", - "multihashes": "~0.4.15" - }, - "dependencies": { - "multicodec": { - "version": "1.0.4", - "dev": true, - "optional": true, - "requires": { - "buffer": "^5.6.0", - "varint": "^5.0.0" - } - } - } - }, - "cipher-base": { - "version": "1.0.4", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-is": { - "version": "1.1.0", - "dev": true, - "optional": true - }, - "class-utils": { - "version": "0.3.6", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-buffer": { - "version": "1.1.6", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "dev": true - } - } - }, - "clone": { - "version": "2.1.2", - "dev": true - }, - "clone-response": { - "version": "1.0.2", - "dev": true, - "optional": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "collection-visit": { - "version": "1.0.0", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "component-emitter": { - "version": "1.3.0", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "content-disposition": { - "version": "0.5.3", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "dev": true, - "optional": true - } - } - }, - "content-hash": { - "version": "2.5.2", - "dev": true, - "optional": true, - "requires": { - "cids": "^0.7.1", - "multicodec": "^0.5.5", - "multihashes": "^0.4.15" - } - }, - "content-type": { - "version": "1.0.4", - "dev": true, - "optional": true - }, - "convert-source-map": { - "version": "1.7.0", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "dev": true - } - } - }, - "cookie": { - "version": "0.4.0", - "dev": true, - "optional": true - }, - "cookie-signature": { - "version": "1.0.6", - "dev": true, - "optional": true - }, - "cookiejar": { - "version": "2.1.2", - "dev": true, - "optional": true - }, - "copy-descriptor": { - "version": "0.1.1", - "dev": true - }, - "core-js": { - "version": "2.6.12", - "dev": true - }, - "core-js-pure": { - "version": "3.8.2", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "dev": true - }, - "cors": { - "version": "2.8.5", - "dev": true, - "optional": true, - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "create-ecdh": { - "version": "4.0.4", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "create-hash": { - "version": "1.2.0", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-fetch": { - "version": "2.2.3", - "dev": true, - "requires": { - "node-fetch": "2.1.2", - "whatwg-fetch": "2.0.4" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "dev": true, - "optional": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "d": { - "version": "1.0.1", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "dashdash": { - "version": "1.14.1", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "debug": { - "version": "3.2.6", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "decode-uri-component": { - "version": "0.2.0", - "dev": true - }, - "decompress-response": { - "version": "3.3.0", - "dev": true, - "optional": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "deep-equal": { - "version": "1.1.1", - "dev": true, - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "defer-to-connect": { - "version": "1.1.3", - "dev": true, - "optional": true - }, - "deferred-leveldown": { - "version": "4.0.2", - "dev": true, - "requires": { - "abstract-leveldown": "~5.0.0", - "inherits": "^2.0.3" - }, - "dependencies": { - "abstract-leveldown": { - "version": "5.0.0", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - } - } - }, - "define-properties": { - "version": "1.1.3", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "defined": { - "version": "1.0.0", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "dev": true - }, - "depd": { - "version": "1.1.2", - "dev": true, - "optional": true - }, - "des.js": { - "version": "1.0.1", - "dev": true, - "optional": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "dev": true, - "optional": true - }, - "detect-indent": { - "version": "4.0.0", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "diffie-hellman": { - "version": "5.0.3", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "dom-walk": { - "version": "0.1.2", - "dev": true - }, - "dotignore": { - "version": "0.1.2", - "dev": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "duplexer3": { - "version": "0.1.4", - "dev": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.2", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "dev": true, - "optional": true - }, - "electron-to-chromium": { - "version": "1.3.636", - "dev": true - }, - "elliptic": { - "version": "6.5.3", - "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, - "encodeurl": { - "version": "1.0.2", - "dev": true, - "optional": true - }, - "encoding": { - "version": "0.1.13", - "dev": true, - "requires": { - "iconv-lite": "^0.6.2" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.2", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "encoding-down": { - "version": "5.0.4", - "dev": true, - "requires": { - "abstract-leveldown": "^5.0.0", - "inherits": "^2.0.3", - "level-codec": "^9.0.0", - "level-errors": "^2.0.0", - "xtend": "^4.0.1" - }, - "dependencies": { - "abstract-leveldown": { - "version": "5.0.0", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - } - } - }, - "end-of-stream": { - "version": "1.4.4", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "errno": { - "version": "0.1.8", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "es-abstract": { - "version": "1.18.0-next.1", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-ext": { - "version": "0.10.53", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-symbol": { - "version": "3.1.3", - "dev": true, - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "escape-html": { - "version": "1.0.3", - "dev": true, - "optional": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "dev": true - }, - "etag": { - "version": "1.8.1", - "dev": true, - "optional": true - }, - "eth-block-tracker": { - "version": "3.0.1", - "dev": true, - "requires": { - "eth-query": "^2.1.0", - "ethereumjs-tx": "^1.3.3", - "ethereumjs-util": "^5.1.3", - "ethjs-util": "^0.1.3", - "json-rpc-engine": "^3.6.0", - "pify": "^2.3.0", - "tape": "^4.6.3" - }, - "dependencies": { - "ethereumjs-tx": { - "version": "1.3.7", - "dev": true, - "requires": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" - } - }, - "ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "pify": { - "version": "2.3.0", - "dev": true - } - } - }, - "eth-ens-namehash": { - "version": "2.0.8", - "dev": true, - "optional": true, - "requires": { - "idna-uts46-hx": "^2.3.1", - "js-sha3": "^0.5.7" - } - }, - "eth-json-rpc-infura": { - "version": "3.2.1", - "dev": true, - "requires": { - "cross-fetch": "^2.1.1", - "eth-json-rpc-middleware": "^1.5.0", - "json-rpc-engine": "^3.4.0", - "json-rpc-error": "^2.0.0" - } - }, - "eth-json-rpc-middleware": { - "version": "1.6.0", - "dev": true, - "requires": { - "async": "^2.5.0", - "eth-query": "^2.1.2", - "eth-tx-summary": "^3.1.2", - "ethereumjs-block": "^1.6.0", - "ethereumjs-tx": "^1.3.3", - "ethereumjs-util": "^5.1.2", - "ethereumjs-vm": "^2.1.0", - "fetch-ponyfill": "^4.0.0", - "json-rpc-engine": "^3.6.0", - "json-rpc-error": "^2.0.0", - "json-stable-stringify": "^1.0.1", - "promise-to-callback": "^1.0.0", - "tape": "^4.6.3" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.6.3", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - }, - "deferred-leveldown": { - "version": "1.2.2", - "dev": true, - "requires": { - "abstract-leveldown": "~2.6.0" - } - }, - "ethereumjs-account": { - "version": "2.0.5", - "dev": true, - "requires": { - "ethereumjs-util": "^5.0.0", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "ethereumjs-block": { - "version": "1.7.1", - "dev": true, - "requires": { - "async": "^2.0.1", - "ethereum-common": "0.2.0", - "ethereumjs-tx": "^1.2.2", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - }, - "dependencies": { - "ethereum-common": { - "version": "0.2.0", - "dev": true - } - } - }, - "ethereumjs-tx": { - "version": "1.3.7", - "dev": true, - "requires": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" - } - }, - "ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "ethereumjs-vm": { - "version": "2.6.0", - "dev": true, - "requires": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "ethereumjs-account": "^2.0.3", - "ethereumjs-block": "~2.2.0", - "ethereumjs-common": "^1.1.0", - "ethereumjs-util": "^6.0.0", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.3.2", - "rustbn.js": "~0.2.0", - "safe-buffer": "^5.1.1" - }, - "dependencies": { - "ethereumjs-block": { - "version": "2.2.2", - "dev": true, - "requires": { - "async": "^2.0.1", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.1", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - } - } - }, - "ethereumjs-tx": { - "version": "2.1.2", - "dev": true, - "requires": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" - } - }, - "ethereumjs-util": { - "version": "6.2.1", - "dev": true, - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - } - } - }, - "isarray": { - "version": "0.0.1", - "dev": true - }, - "level-codec": { - "version": "7.0.1", - "dev": true - }, - "level-errors": { - "version": "1.0.5", - "dev": true, - "requires": { - "errno": "~0.1.1" - } - }, - "level-iterator-stream": { - "version": "1.3.1", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - } - } - }, - "level-ws": { - "version": "0.0.0", - "dev": true, - "requires": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "xtend": { - "version": "2.1.2", - "dev": true, - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, - "levelup": { - "version": "1.3.9", - "dev": true, - "requires": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" - } - }, - "ltgt": { - "version": "2.2.1", - "dev": true - }, - "memdown": { - "version": "1.4.1", - "dev": true, - "requires": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.7.2", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - } - } - }, - "merkle-patricia-tree": { - "version": "2.3.2", - "dev": true, - "requires": { - "async": "^1.4.2", - "ethereumjs-util": "^5.0.0", - "level-ws": "0.0.0", - "levelup": "^1.2.1", - "memdown": "^1.0.0", - "readable-stream": "^2.0.0", - "rlp": "^2.0.0", - "semaphore": ">=1.0.1" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "dev": true - } - } - }, - "object-keys": { - "version": "0.4.0", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "dev": true - }, - "semver": { - "version": "5.4.1", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "dev": true - } - } - }, - "eth-lib": { - "version": "0.1.29", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "nano-json-stream-parser": "^0.1.2", - "servify": "^0.1.12", - "ws": "^3.0.0", - "xhr-request-promise": "^0.1.2" - } - }, - "eth-query": { - "version": "2.1.2", - "dev": true, - "requires": { - "json-rpc-random-id": "^1.0.0", - "xtend": "^4.0.1" - } - }, - "eth-sig-util": { - "version": "3.0.0", - "dev": true, - "requires": { - "buffer": "^5.2.1", - "elliptic": "^6.4.0", - "ethereumjs-abi": "0.6.5", - "ethereumjs-util": "^5.1.1", - "tweetnacl": "^1.0.0", - "tweetnacl-util": "^0.15.0" - }, - "dependencies": { - "ethereumjs-abi": { - "version": "0.6.5", - "dev": true, - "requires": { - "bn.js": "^4.10.0", - "ethereumjs-util": "^4.3.0" - }, - "dependencies": { - "ethereumjs-util": { - "version": "4.5.1", - "dev": true, - "requires": { - "bn.js": "^4.8.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.0.0" - } - } - } - }, - "ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - } - } - }, - "eth-tx-summary": { - "version": "3.2.4", - "dev": true, - "requires": { - "async": "^2.1.2", - "clone": "^2.0.0", - "concat-stream": "^1.5.1", - "end-of-stream": "^1.1.0", - "eth-query": "^2.0.2", - "ethereumjs-block": "^1.4.1", - "ethereumjs-tx": "^1.1.1", - "ethereumjs-util": "^5.0.1", - "ethereumjs-vm": "^2.6.0", - "through2": "^2.0.3" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.6.3", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - }, - "deferred-leveldown": { - "version": "1.2.2", - "dev": true, - "requires": { - "abstract-leveldown": "~2.6.0" - } - }, - "ethereumjs-account": { - "version": "2.0.5", - "dev": true, - "requires": { - "ethereumjs-util": "^5.0.0", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "ethereumjs-block": { - "version": "1.7.1", - "dev": true, - "requires": { - "async": "^2.0.1", - "ethereum-common": "0.2.0", - "ethereumjs-tx": "^1.2.2", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - }, - "dependencies": { - "ethereum-common": { - "version": "0.2.0", - "dev": true - } - } - }, - "ethereumjs-tx": { - "version": "1.3.7", - "dev": true, - "requires": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" - } - }, - "ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "ethereumjs-vm": { - "version": "2.6.0", - "dev": true, - "requires": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "ethereumjs-account": "^2.0.3", - "ethereumjs-block": "~2.2.0", - "ethereumjs-common": "^1.1.0", - "ethereumjs-util": "^6.0.0", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.3.2", - "rustbn.js": "~0.2.0", - "safe-buffer": "^5.1.1" - }, - "dependencies": { - "ethereumjs-block": { - "version": "2.2.2", - "dev": true, - "requires": { - "async": "^2.0.1", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.1", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - } - } - }, - "ethereumjs-tx": { - "version": "2.1.2", - "dev": true, - "requires": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" - } - }, - "ethereumjs-util": { - "version": "6.2.1", - "dev": true, - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - } - } - }, - "isarray": { - "version": "0.0.1", - "dev": true - }, - "level-codec": { - "version": "7.0.1", - "dev": true - }, - "level-errors": { - "version": "1.0.5", - "dev": true, - "requires": { - "errno": "~0.1.1" - } - }, - "level-iterator-stream": { - "version": "1.3.1", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - } - } - }, - "level-ws": { - "version": "0.0.0", - "dev": true, - "requires": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "xtend": { - "version": "2.1.2", - "dev": true, - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, - "levelup": { - "version": "1.3.9", - "dev": true, - "requires": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" - } - }, - "ltgt": { - "version": "2.2.1", - "dev": true - }, - "memdown": { - "version": "1.4.1", - "dev": true, - "requires": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.7.2", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - } - } - }, - "merkle-patricia-tree": { - "version": "2.3.2", - "dev": true, - "requires": { - "async": "^1.4.2", - "ethereumjs-util": "^5.0.0", - "level-ws": "0.0.0", - "levelup": "^1.2.1", - "memdown": "^1.0.0", - "readable-stream": "^2.0.0", - "rlp": "^2.0.0", - "semaphore": ">=1.0.1" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "dev": true - } - } - }, - "object-keys": { - "version": "0.4.0", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "dev": true - }, - "semver": { - "version": "5.4.1", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "dev": true - } - } - }, - "ethashjs": { - "version": "0.0.8", - "dev": true, - "requires": { - "async": "^2.1.2", - "buffer-xor": "^2.0.1", - "ethereumjs-util": "^7.0.2", - "miller-rabin": "^4.0.0" - }, - "dependencies": { - "bn.js": { - "version": "5.1.3", - "dev": true - }, - "buffer-xor": { - "version": "2.0.2", - "dev": true, - "requires": { - "safe-buffer": "^5.1.1" - } - }, - "ethereumjs-util": { - "version": "7.0.7", - "dev": true, - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.4" - } - } - } - }, - "ethereum-bloom-filters": { - "version": "1.0.7", - "dev": true, - "optional": true, - "requires": { - "js-sha3": "^0.8.0" - }, - "dependencies": { - "js-sha3": { - "version": "0.8.0", - "dev": true, - "optional": true - } - } - }, - "ethereum-common": { - "version": "0.0.18", - "dev": true - }, - "ethereum-cryptography": { - "version": "0.1.3", - "dev": true, - "requires": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "ethereumjs-abi": { - "version": "0.6.8", - "dev": true, - "requires": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - } - }, - "ethereumjs-account": { - "version": "3.0.0", - "dev": true, - "requires": { - "ethereumjs-util": "^6.0.0", - "rlp": "^2.2.1", - "safe-buffer": "^5.1.1" - } - }, - "ethereumjs-block": { - "version": "2.2.2", - "dev": true, - "requires": { - "async": "^2.0.1", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.1", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.6.3", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - }, - "deferred-leveldown": { - "version": "1.2.2", - "dev": true, - "requires": { - "abstract-leveldown": "~2.6.0" - } - }, - "ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "isarray": { - "version": "0.0.1", - "dev": true - }, - "level-codec": { - "version": "7.0.1", - "dev": true - }, - "level-errors": { - "version": "1.0.5", - "dev": true, - "requires": { - "errno": "~0.1.1" - } - }, - "level-iterator-stream": { - "version": "1.3.1", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - } - } - }, - "level-ws": { - "version": "0.0.0", - "dev": true, - "requires": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "xtend": { - "version": "2.1.2", - "dev": true, - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, - "levelup": { - "version": "1.3.9", - "dev": true, - "requires": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" - } - }, - "ltgt": { - "version": "2.2.1", - "dev": true - }, - "memdown": { - "version": "1.4.1", - "dev": true, - "requires": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.7.2", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - } - } - }, - "merkle-patricia-tree": { - "version": "2.3.2", - "dev": true, - "requires": { - "async": "^1.4.2", - "ethereumjs-util": "^5.0.0", - "level-ws": "0.0.0", - "levelup": "^1.2.1", - "memdown": "^1.0.0", - "readable-stream": "^2.0.0", - "rlp": "^2.0.0", - "semaphore": ">=1.0.1" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "dev": true - } - } - }, - "object-keys": { - "version": "0.4.0", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "dev": true - }, - "semver": { - "version": "5.4.1", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "dev": true - } - } - }, - "ethereumjs-blockchain": { - "version": "4.0.4", - "dev": true, - "requires": { - "async": "^2.6.1", - "ethashjs": "~0.0.7", - "ethereumjs-block": "~2.2.2", - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.1.0", - "flow-stoplight": "^1.0.0", - "level-mem": "^3.0.1", - "lru-cache": "^5.1.1", - "rlp": "^2.2.2", - "semaphore": "^1.1.0" - } - }, - "ethereumjs-common": { - "version": "1.5.0", - "dev": true - }, - "ethereumjs-tx": { - "version": "2.1.2", - "dev": true, - "requires": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" - } - }, - "ethereumjs-util": { - "version": "6.2.1", - "dev": true, - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - }, - "ethereumjs-vm": { - "version": "4.2.0", - "dev": true, - "requires": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "core-js-pure": "^3.0.1", - "ethereumjs-account": "^3.0.0", - "ethereumjs-block": "^2.2.2", - "ethereumjs-blockchain": "^4.0.3", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.2", - "ethereumjs-util": "^6.2.0", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.3.2", - "rustbn.js": "~0.2.0", - "safe-buffer": "^5.1.1", - "util.promisify": "^1.0.0" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.6.3", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - }, - "deferred-leveldown": { - "version": "1.2.2", - "dev": true, - "requires": { - "abstract-leveldown": "~2.6.0" - } - }, - "isarray": { - "version": "0.0.1", - "dev": true - }, - "level-codec": { - "version": "7.0.1", - "dev": true - }, - "level-errors": { - "version": "1.0.5", - "dev": true, - "requires": { - "errno": "~0.1.1" - } - }, - "level-iterator-stream": { - "version": "1.3.1", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - } - } - }, - "level-ws": { - "version": "0.0.0", - "dev": true, - "requires": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "xtend": { - "version": "2.1.2", - "dev": true, - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, - "levelup": { - "version": "1.3.9", - "dev": true, - "requires": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" - } - }, - "ltgt": { - "version": "2.2.1", - "dev": true - }, - "memdown": { - "version": "1.4.1", - "dev": true, - "requires": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.7.2", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - } - } - }, - "merkle-patricia-tree": { - "version": "2.3.2", - "dev": true, - "requires": { - "async": "^1.4.2", - "ethereumjs-util": "^5.0.0", - "level-ws": "0.0.0", - "levelup": "^1.2.1", - "memdown": "^1.0.0", - "readable-stream": "^2.0.0", - "rlp": "^2.0.0", - "semaphore": ">=1.0.1" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "dev": true - }, - "ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - } - } - }, - "object-keys": { - "version": "0.4.0", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "dev": true - }, - "semver": { - "version": "5.4.1", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "dev": true - } - } - }, - "ethereumjs-wallet": { - "version": "0.6.5", - "dev": true, - "optional": true, - "requires": { - "aes-js": "^3.1.1", - "bs58check": "^2.1.2", - "ethereum-cryptography": "^0.1.3", - "ethereumjs-util": "^6.0.0", - "randombytes": "^2.0.6", - "safe-buffer": "^5.1.2", - "scryptsy": "^1.2.1", - "utf8": "^3.0.0", - "uuid": "^3.3.2" - } - }, - "ethjs-unit": { - "version": "0.1.6", - "dev": true, - "optional": true, - "requires": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "dev": true, - "optional": true - } - } - }, - "ethjs-util": { - "version": "0.1.6", - "dev": true, - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - }, - "eventemitter3": { - "version": "4.0.4", - "dev": true, - "optional": true - }, - "events": { - "version": "3.2.0", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "expand-brackets": { - "version": "2.1.4", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-buffer": { - "version": "1.1.6", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "dev": true - }, - "ms": { - "version": "2.0.0", - "dev": true - } - } - }, - "express": { - "version": "4.17.1", - "dev": true, - "optional": true, - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "dev": true, - "optional": true - }, - "qs": { - "version": "6.7.0", - "dev": true, - "optional": true - }, - "safe-buffer": { - "version": "5.1.2", - "dev": true, - "optional": true - } - } - }, - "ext": { - "version": "1.4.0", - "dev": true, - "requires": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.1.0", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "extglob": { - "version": "2.0.4", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "dev": true - } - } - }, - "extsprintf": { - "version": "1.3.0", - "dev": true - }, - "fake-merkle-patricia-tree": { - "version": "1.0.1", - "dev": true, - "requires": { - "checkpoint-store": "^1.1.0" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "dev": true - }, - "fetch-ponyfill": { - "version": "4.1.0", - "dev": true, - "requires": { - "node-fetch": "~1.7.1" - }, - "dependencies": { - "is-stream": { - "version": "1.1.0", - "dev": true - }, - "node-fetch": { - "version": "1.7.3", - "dev": true, - "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } - } - } - }, - "finalhandler": { - "version": "1.1.2", - "dev": true, - "optional": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "dev": true, - "optional": true - } - } - }, - "find-yarn-workspace-root": { - "version": "1.2.1", - "dev": true, - "requires": { - "fs-extra": "^4.0.3", - "micromatch": "^3.1.4" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fs-extra": { - "version": "4.0.3", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "flow-stoplight": { - "version": "1.0.0", - "dev": true - }, - "for-each": { - "version": "0.3.3", - "dev": true, - "requires": { - "is-callable": "^1.1.3" - } - }, - "for-in": { - "version": "1.0.2", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.1.2", - "dev": true, - "optional": true - }, - "fragment-cache": { - "version": "0.2.1", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "dev": true, - "optional": true - }, - "fs-extra": { - "version": "7.0.1", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "dev": true - }, - "get-intrinsic": { - "version": "1.0.2", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-stream": { - "version": "5.2.0", - "dev": true, - "optional": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.3", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "global": { - "version": "4.4.0", - "dev": true, - "requires": { - "min-document": "^2.19.0", - "process": "^0.11.10" - } - }, - "got": { - "version": "9.6.0", - "dev": true, - "optional": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "dependencies": { - "get-stream": { - "version": "4.1.0", - "dev": true, - "optional": true, - "requires": { - "pump": "^3.0.0" - } - } - } - }, - "graceful-fs": { - "version": "4.2.4", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "dev": true - } - } - }, - "has-flag": { - "version": "3.0.0", - "dev": true - }, - "has-symbol-support-x": { - "version": "1.4.2", - "dev": true, - "optional": true - }, - "has-symbols": { - "version": "1.0.1", - "dev": true - }, - "has-to-string-tag-x": { - "version": "1.4.1", - "dev": true, - "optional": true, - "requires": { - "has-symbol-support-x": "^1.4.1" - } - }, - "has-value": { - "version": "1.0.0", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.1.0", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "hash.js": { - "version": "1.1.7", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "heap": { - "version": "0.2.6", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "home-or-tmp": { - "version": "2.0.0", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, - "http-cache-semantics": { - "version": "4.1.0", - "dev": true, - "optional": true - }, - "http-errors": { - "version": "1.7.2", - "dev": true, - "optional": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "dev": true, - "optional": true - } - } - }, - "http-https": { - "version": "1.0.0", - "dev": true, - "optional": true - }, - "http-signature": { - "version": "1.2.0", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "idna-uts46-hx": { - "version": "2.3.1", - "dev": true, - "optional": true, - "requires": { - "punycode": "2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.0", - "dev": true, - "optional": true - } - } - }, - "ieee754": { - "version": "1.2.1", - "dev": true - }, - "immediate": { - "version": "3.2.3", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "dev": true - }, - "invariant": { - "version": "2.2.4", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "ipaddr.js": { - "version": "1.9.1", - "dev": true, - "optional": true - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-arguments": { - "version": "1.1.0", - "dev": true, - "requires": { - "call-bind": "^1.0.0" - } - }, - "is-callable": { - "version": "1.2.2", - "dev": true - }, - "is-ci": { - "version": "2.0.0", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-date-object": { - "version": "1.0.2", - "dev": true - }, - "is-descriptor": { - "version": "1.0.2", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-extendable": { - "version": "1.0.1", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "is-finite": { - "version": "1.1.0", - "dev": true - }, - "is-fn": { - "version": "1.0.0", - "dev": true - }, - "is-function": { - "version": "1.0.2", - "dev": true - }, - "is-hex-prefixed": { - "version": "1.0.0", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.1", - "dev": true - }, - "is-object": { - "version": "1.0.2", - "dev": true, - "optional": true - }, - "is-plain-obj": { - "version": "1.1.0", - "dev": true, - "optional": true - }, - "is-plain-object": { - "version": "2.0.4", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-regex": { - "version": "1.1.1", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-retry-allowed": { - "version": "1.2.0", - "dev": true, - "optional": true - }, - "is-symbol": { - "version": "1.0.3", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "dev": true - }, - "isurl": { - "version": "1.0.0", - "dev": true, - "optional": true, - "requires": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" - } - }, - "js-sha3": { - "version": "0.5.7", - "dev": true, - "optional": true - }, - "js-tokens": { - "version": "4.0.0", - "dev": true - }, - "jsbn": { - "version": "0.1.1", - "dev": true - }, - "json-buffer": { - "version": "3.0.0", - "dev": true, - "optional": true - }, - "json-rpc-engine": { - "version": "3.8.0", - "dev": true, - "requires": { - "async": "^2.0.1", - "babel-preset-env": "^1.7.0", - "babelify": "^7.3.0", - "json-rpc-error": "^2.0.0", - "promise-to-callback": "^1.0.0", - "safe-event-emitter": "^1.0.1" - } - }, - "json-rpc-error": { - "version": "2.0.0", - "dev": true, - "requires": { - "inherits": "^2.0.1" - } - }, - "json-rpc-random-id": { - "version": "1.0.1", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "dev": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonify": { - "version": "0.0.0", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "keccak": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - } - }, - "keyv": { - "version": "3.1.0", - "dev": true, - "optional": true, - "requires": { - "json-buffer": "3.0.0" - } - }, - "kind-of": { - "version": "6.0.3", - "dev": true - }, - "klaw-sync": { - "version": "6.0.0", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11" - } - }, - "level-codec": { - "version": "9.0.2", - "dev": true, - "requires": { - "buffer": "^5.6.0" - } - }, - "level-errors": { - "version": "2.0.1", - "dev": true, - "requires": { - "errno": "~0.1.1" - } - }, - "level-iterator-stream": { - "version": "2.0.3", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.5", - "xtend": "^4.0.0" - } - }, - "level-mem": { - "version": "3.0.1", - "dev": true, - "requires": { - "level-packager": "~4.0.0", - "memdown": "~3.0.0" - }, - "dependencies": { - "abstract-leveldown": { - "version": "5.0.0", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - }, - "ltgt": { - "version": "2.2.1", - "dev": true - }, - "memdown": { - "version": "3.0.0", - "dev": true, - "requires": { - "abstract-leveldown": "~5.0.0", - "functional-red-black-tree": "~1.0.1", - "immediate": "~3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "dev": true - } - } - }, - "level-packager": { - "version": "4.0.1", - "dev": true, - "requires": { - "encoding-down": "~5.0.0", - "levelup": "^3.0.0" - } - }, - "level-post": { - "version": "1.0.7", - "dev": true, - "requires": { - "ltgt": "^2.1.2" - } - }, - "level-sublevel": { - "version": "6.6.4", - "dev": true, - "requires": { - "bytewise": "~1.1.0", - "level-codec": "^9.0.0", - "level-errors": "^2.0.0", - "level-iterator-stream": "^2.0.3", - "ltgt": "~2.1.1", - "pull-defer": "^0.2.2", - "pull-level": "^2.0.3", - "pull-stream": "^3.6.8", - "typewiselite": "~1.0.0", - "xtend": "~4.0.0" - } - }, - "level-ws": { - "version": "1.0.0", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.2.8", - "xtend": "^4.0.1" - } - }, - "levelup": { - "version": "3.1.1", - "dev": true, - "requires": { - "deferred-leveldown": "~4.0.0", - "level-errors": "~2.0.0", - "level-iterator-stream": "~3.0.0", - "xtend": "~4.0.0" - }, - "dependencies": { - "level-iterator-stream": { - "version": "3.0.1", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "xtend": "^4.0.0" - } - } - } - }, - "lodash": { - "version": "4.17.20", - "dev": true - }, - "looper": { - "version": "2.0.0", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "dev": true, - "optional": true - }, - "lru-cache": { - "version": "5.1.1", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "ltgt": { - "version": "2.1.3", - "dev": true - }, - "map-cache": { - "version": "0.2.2", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "md5.js": { - "version": "1.3.5", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "media-typer": { - "version": "0.3.0", - "dev": true, - "optional": true - }, - "merge-descriptors": { - "version": "1.0.1", - "dev": true, - "optional": true - }, - "merkle-patricia-tree": { - "version": "3.0.0", - "dev": true, - "requires": { - "async": "^2.6.1", - "ethereumjs-util": "^5.2.0", - "level-mem": "^3.0.1", - "level-ws": "^1.0.0", - "readable-stream": "^3.0.6", - "rlp": "^2.0.0", - "semaphore": ">=1.0.1" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "readable-stream": { - "version": "3.6.0", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "methods": { - "version": "1.1.2", - "dev": true, - "optional": true - }, - "miller-rabin": { - "version": "4.0.1", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime": { - "version": "1.6.0", - "dev": true, - "optional": true - }, - "mime-db": { - "version": "1.45.0", - "dev": true - }, - "mime-types": { - "version": "2.1.28", - "dev": true, - "requires": { - "mime-db": "1.45.0" - } - }, - "mimic-response": { - "version": "1.0.1", - "dev": true, - "optional": true - }, - "min-document": { - "version": "2.19.0", - "dev": true, - "requires": { - "dom-walk": "^0.1.0" - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "dev": true - }, - "minizlib": { - "version": "1.3.3", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - }, - "dependencies": { - "minipass": { - "version": "2.9.0", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - } - } - }, - "mixin-deep": { - "version": "1.3.2", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - } - }, - "mkdirp": { - "version": "0.5.5", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "mkdirp-promise": { - "version": "5.0.1", - "dev": true, - "optional": true, - "requires": { - "mkdirp": "*" - } - }, - "mock-fs": { - "version": "4.13.0", - "dev": true, - "optional": true - }, - "ms": { - "version": "2.1.3", - "dev": true - }, - "multibase": { - "version": "0.6.1", - "dev": true, - "optional": true, - "requires": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" - } - }, - "multicodec": { - "version": "0.5.7", - "dev": true, - "optional": true, - "requires": { - "varint": "^5.0.0" - } - }, - "multihashes": { - "version": "0.4.21", - "dev": true, - "optional": true, - "requires": { - "buffer": "^5.5.0", - "multibase": "^0.7.0", - "varint": "^5.0.0" - }, - "dependencies": { - "multibase": { - "version": "0.7.0", - "dev": true, - "optional": true, - "requires": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" - } - } - } - }, - "nano-json-stream-parser": { - "version": "0.1.2", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "negotiator": { - "version": "0.6.2", - "dev": true, - "optional": true - }, - "next-tick": { - "version": "1.0.0", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "dev": true - }, - "node-addon-api": { - "version": "2.0.2", - "bundled": true, - "dev": true - }, - "node-fetch": { - "version": "2.1.2", - "dev": true - }, - "node-gyp-build": { - "version": "4.2.3", - "bundled": true, - "dev": true - }, - "normalize-url": { - "version": "4.5.0", - "dev": true, - "optional": true - }, - "number-to-bn": { - "version": "1.7.0", - "dev": true, - "optional": true, - "requires": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "dev": true, - "optional": true - } - } - }, - "oauth-sign": { - "version": "0.9.0", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-buffer": { - "version": "1.1.6", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "dev": true - } - } - }, - "kind-of": { - "version": "3.2.2", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-inspect": { - "version": "1.9.0", - "dev": true - }, - "object-is": { - "version": "1.1.4", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, - "object-keys": { - "version": "1.1.1", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.2", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.1", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - } - }, - "object.pick": { - "version": "1.3.0", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "oboe": { - "version": "2.1.4", - "dev": true, - "optional": true, - "requires": { - "http-https": "^1.0.0" - } - }, - "on-finished": { - "version": "2.3.0", - "dev": true, - "optional": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "dev": true - }, - "p-cancelable": { - "version": "1.1.0", - "dev": true, - "optional": true - }, - "p-timeout": { - "version": "1.2.1", - "dev": true, - "optional": true, - "requires": { - "p-finally": "^1.0.0" - }, - "dependencies": { - "p-finally": { - "version": "1.0.0", - "dev": true, - "optional": true - } - } - }, - "parse-asn1": { - "version": "5.1.6", - "dev": true, - "optional": true, - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-headers": { - "version": "2.0.3", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "dev": true, - "optional": true - }, - "pascalcase": { - "version": "0.1.1", - "dev": true - }, - "patch-package": { - "version": "6.2.2", - "dev": true, - "requires": { - "@yarnpkg/lockfile": "^1.1.0", - "chalk": "^2.4.2", - "cross-spawn": "^6.0.5", - "find-yarn-workspace-root": "^1.2.1", - "fs-extra": "^7.0.1", - "is-ci": "^2.0.0", - "klaw-sync": "^6.0.0", - "minimist": "^1.2.0", - "rimraf": "^2.6.3", - "semver": "^5.6.0", - "slash": "^2.0.0", - "tmp": "^0.0.33" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "path-key": { - "version": "2.0.1", - "dev": true - }, - "semver": { - "version": "5.7.1", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "dev": true - }, - "slash": { - "version": "2.0.0", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "which": { - "version": "1.3.1", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "path-is-absolute": { - "version": "1.0.1", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "dev": true, - "optional": true - }, - "pbkdf2": { - "version": "3.1.1", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "performance-now": { - "version": "2.1.0", - "dev": true - }, - "posix-character-classes": { - "version": "0.1.1", - "dev": true - }, - "precond": { - "version": "0.2.3", - "dev": true - }, - "prepend-http": { - "version": "2.0.0", - "dev": true, - "optional": true - }, - "private": { - "version": "0.1.8", - "dev": true - }, - "process": { - "version": "0.11.10", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "dev": true - }, - "promise-to-callback": { - "version": "1.0.0", - "dev": true, - "requires": { - "is-fn": "^1.0.0", - "set-immediate-shim": "^1.0.1" - } - }, - "proxy-addr": { - "version": "2.0.6", - "dev": true, - "optional": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.1" - } - }, - "prr": { - "version": "1.0.1", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "dev": true - }, - "psl": { - "version": "1.8.0", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "pull-cat": { - "version": "1.1.11", - "dev": true - }, - "pull-defer": { - "version": "0.2.3", - "dev": true - }, - "pull-level": { - "version": "2.0.4", - "dev": true, - "requires": { - "level-post": "^1.0.7", - "pull-cat": "^1.1.9", - "pull-live": "^1.0.1", - "pull-pushable": "^2.0.0", - "pull-stream": "^3.4.0", - "pull-window": "^2.1.4", - "stream-to-pull-stream": "^1.7.1" - } - }, - "pull-live": { - "version": "1.0.1", - "dev": true, - "requires": { - "pull-cat": "^1.1.9", - "pull-stream": "^3.4.0" - } - }, - "pull-pushable": { - "version": "2.2.0", - "dev": true - }, - "pull-stream": { - "version": "3.6.14", - "dev": true - }, - "pull-window": { - "version": "2.1.4", - "dev": true, - "requires": { - "looper": "^2.0.0" - } - }, - "pump": { - "version": "3.0.0", - "dev": true, - "optional": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "dev": true - }, - "qs": { - "version": "6.5.2", - "dev": true - }, - "query-string": { - "version": "5.1.1", - "dev": true, - "optional": true, - "requires": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "randombytes": { - "version": "2.1.0", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "dev": true, - "optional": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "dev": true, - "optional": true - }, - "raw-body": { - "version": "2.4.0", - "dev": true, - "optional": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "readable-stream": { - "version": "2.3.7", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "dev": true - } - } - }, - "regenerate": { - "version": "1.4.2", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.1", - "dev": true - }, - "regenerator-transform": { - "version": "0.10.1", - "dev": true, - "requires": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" - } - }, - "regex-not": { - "version": "1.0.2", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexp.prototype.flags": { - "version": "1.3.0", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } - } - }, - "regexpu-core": { - "version": "2.0.0", - "dev": true, - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "regjsgen": { - "version": "0.2.0", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "dev": true - } - } - }, - "repeat-element": { - "version": "1.1.3", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "request": { - "version": "2.88.2", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "resolve-url": { - "version": "0.2.1", - "dev": true - }, - "responselike": { - "version": "1.0.2", - "dev": true, - "optional": true, - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "resumer": { - "version": "0.0.0", - "dev": true, - "requires": { - "through": "~2.3.4" - } - }, - "ret": { - "version": "0.1.15", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rlp": { - "version": "2.2.6", - "dev": true, - "requires": { - "bn.js": "^4.11.1" - } - }, - "rustbn.js": { - "version": "0.2.0", - "dev": true - }, - "safe-buffer": { - "version": "5.2.1", - "dev": true - }, - "safe-event-emitter": { - "version": "1.0.1", - "dev": true, - "requires": { - "events": "^3.0.0" - } - }, - "safe-regex": { - "version": "1.1.0", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "dev": true - }, - "scrypt-js": { - "version": "3.0.1", - "dev": true - }, - "scryptsy": { - "version": "1.2.1", - "dev": true, - "optional": true, - "requires": { - "pbkdf2": "^3.0.3" - } - }, - "secp256k1": { - "version": "4.0.2", - "dev": true, - "requires": { - "elliptic": "^6.5.2", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - } - }, - "seedrandom": { - "version": "3.0.1", - "dev": true - }, - "semaphore": { - "version": "1.1.0", - "dev": true - }, - "send": { - "version": "0.17.1", - "dev": true, - "optional": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "dev": true, - "optional": true - } - } - }, - "ms": { - "version": "2.1.1", - "dev": true, - "optional": true - } - } - }, - "serve-static": { - "version": "1.14.1", - "dev": true, - "optional": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "servify": { - "version": "0.1.12", - "dev": true, - "optional": true, - "requires": { - "body-parser": "^1.16.0", - "cors": "^2.8.1", - "express": "^4.14.0", - "request": "^2.79.0", - "xhr": "^2.3.3" - } - }, - "set-immediate-shim": { - "version": "1.0.1", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "dev": true - } - } - }, - "setimmediate": { - "version": "1.0.5", - "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "dev": true, - "optional": true - }, - "sha.js": { - "version": "2.4.11", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "simple-concat": { - "version": "1.0.1", - "dev": true, - "optional": true - }, - "simple-get": { - "version": "2.8.1", - "dev": true, - "optional": true, - "requires": { - "decompress-response": "^3.3.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "snapdragon": { - "version": "0.8.2", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-buffer": { - "version": "1.1.6", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "dev": true - }, - "ms": { - "version": "2.0.0", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-map": { - "version": "0.5.7", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.12", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "dev": true - } - } - }, - "source-map-url": { - "version": "0.4.0", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sshpk": { - "version": "1.16.1", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "dependencies": { - "tweetnacl": { - "version": "0.14.5", - "dev": true - } - } - }, - "static-extend": { - "version": "0.1.2", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-buffer": { - "version": "1.1.6", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "dev": true - } - } - }, - "statuses": { - "version": "1.5.0", - "dev": true, - "optional": true - }, - "stream-to-pull-stream": { - "version": "1.7.3", - "dev": true, - "requires": { - "looper": "^3.0.0", - "pull-stream": "^3.2.3" - }, - "dependencies": { - "looper": { - "version": "3.0.0", - "dev": true - } - } - }, - "strict-uri-encode": { - "version": "1.1.0", - "dev": true, - "optional": true - }, - "string_decoder": { - "version": "1.1.1", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "dev": true - } - } - }, - "string.prototype.trim": { - "version": "1.2.3", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - } - }, - "string.prototype.trimend": { - "version": "1.0.3", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.3", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, - "strip-hex-prefix": { - "version": "1.0.0", - "dev": true, - "requires": { - "is-hex-prefixed": "1.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "swarm-js": { - "version": "0.1.40", - "dev": true, - "optional": true, - "requires": { - "bluebird": "^3.5.0", - "buffer": "^5.0.5", - "eth-lib": "^0.1.26", - "fs-extra": "^4.0.2", - "got": "^7.1.0", - "mime-types": "^2.1.16", - "mkdirp-promise": "^5.0.1", - "mock-fs": "^4.1.0", - "setimmediate": "^1.0.5", - "tar": "^4.0.2", - "xhr-request": "^1.0.1" - }, - "dependencies": { - "fs-extra": { - "version": "4.0.3", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "get-stream": { - "version": "3.0.0", - "dev": true, - "optional": true - }, - "got": { - "version": "7.1.0", - "dev": true, - "optional": true, - "requires": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" - } - }, - "is-stream": { - "version": "1.1.0", - "dev": true, - "optional": true - }, - "p-cancelable": { - "version": "0.3.0", - "dev": true, - "optional": true - }, - "prepend-http": { - "version": "1.0.4", - "dev": true, - "optional": true - }, - "url-parse-lax": { - "version": "1.0.0", - "dev": true, - "optional": true, - "requires": { - "prepend-http": "^1.0.1" - } - } - } - }, - "tape": { - "version": "4.13.3", - "dev": true, - "requires": { - "deep-equal": "~1.1.1", - "defined": "~1.0.0", - "dotignore": "~0.1.2", - "for-each": "~0.3.3", - "function-bind": "~1.1.1", - "glob": "~7.1.6", - "has": "~1.0.3", - "inherits": "~2.0.4", - "is-regex": "~1.0.5", - "minimist": "~1.2.5", - "object-inspect": "~1.7.0", - "resolve": "~1.17.0", - "resumer": "~0.0.0", - "string.prototype.trim": "~1.2.1", - "through": "~2.3.8" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "is-regex": { - "version": "1.0.5", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "object-inspect": { - "version": "1.7.0", - "dev": true - }, - "resolve": { - "version": "1.17.0", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "tar": { - "version": "4.4.13", - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - }, - "dependencies": { - "fs-minipass": { - "version": "1.2.7", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "minipass": { - "version": "2.9.0", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - } - } - }, - "through": { - "version": "2.3.8", - "dev": true - }, - "through2": { - "version": "2.0.5", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "timed-out": { - "version": "4.0.1", - "dev": true, - "optional": true - }, - "tmp": { - "version": "0.1.0", - "dev": true, - "requires": { - "rimraf": "^2.6.3" - } - }, - "to-object-path": { - "version": "0.3.0", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-readable-stream": { - "version": "1.0.0", - "dev": true, - "optional": true - }, - "to-regex": { - "version": "3.0.2", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "toidentifier": { - "version": "1.0.0", - "dev": true, - "optional": true - }, - "tough-cookie": { - "version": "2.5.0", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "trim-right": { - "version": "1.0.1", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "1.0.3", - "dev": true - }, - "tweetnacl-util": { - "version": "0.15.1", - "dev": true - }, - "type": { - "version": "1.2.0", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "dev": true, - "optional": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typewise": { - "version": "1.0.3", - "dev": true, - "requires": { - "typewise-core": "^1.2.0" - } - }, - "typewise-core": { - "version": "1.2.0", - "dev": true - }, - "typewiselite": { - "version": "1.0.0", - "dev": true - }, - "ultron": { - "version": "1.1.1", - "dev": true, - "optional": true - }, - "underscore": { - "version": "1.9.1", - "dev": true, - "optional": true - }, - "union-value": { - "version": "1.0.1", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "0.1.1", - "dev": true - } - } - }, - "universalify": { - "version": "0.1.2", - "dev": true - }, - "unorm": { - "version": "1.6.0", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "dev": true, - "optional": true - }, - "unset-value": { - "version": "1.0.0", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "dev": true - } - } - }, - "uri-js": { - "version": "4.4.1", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "dev": true - }, - "url-parse-lax": { - "version": "3.0.0", - "dev": true, - "optional": true, - "requires": { - "prepend-http": "^2.0.0" - } - }, - "url-set-query": { - "version": "1.0.0", - "dev": true, - "optional": true - }, - "url-to-options": { - "version": "1.0.1", - "dev": true, - "optional": true - }, - "use": { - "version": "3.1.1", - "dev": true - }, - "utf-8-validate": { - "version": "5.0.4", - "dev": true, - "requires": { - "node-gyp-build": "^4.2.0" - } - }, - "utf8": { - "version": "3.0.0", - "dev": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "dev": true - }, - "util.promisify": { - "version": "1.1.1", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "for-each": "^0.3.3", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.1" - } - }, - "utils-merge": { - "version": "1.0.1", - "dev": true, - "optional": true - }, - "uuid": { - "version": "3.4.0", - "dev": true - }, - "varint": { - "version": "5.0.2", - "dev": true, - "optional": true - }, - "vary": { - "version": "1.1.2", - "dev": true, - "optional": true - }, - "verror": { - "version": "1.10.0", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "web3": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "web3-bzz": "1.2.11", - "web3-core": "1.2.11", - "web3-eth": "1.2.11", - "web3-eth-personal": "1.2.11", - "web3-net": "1.2.11", - "web3-shh": "1.2.11", - "web3-utils": "1.2.11" - } - }, - "web3-bzz": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "@types/node": "^12.12.6", - "got": "9.6.0", - "swarm-js": "^0.1.40", - "underscore": "1.9.1" - }, - "dependencies": { - "@types/node": { - "version": "12.19.12", - "dev": true, - "optional": true - } - } - }, - "web3-core": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "@types/bn.js": "^4.11.5", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-core-requestmanager": "1.2.11", - "web3-utils": "1.2.11" - }, - "dependencies": { - "@types/node": { - "version": "12.19.12", - "dev": true, - "optional": true - } - } - }, - "web3-core-helpers": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "underscore": "1.9.1", - "web3-eth-iban": "1.2.11", - "web3-utils": "1.2.11" - } - }, - "web3-core-method": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/transactions": "^5.0.0-beta.135", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.11", - "web3-core-promievent": "1.2.11", - "web3-core-subscriptions": "1.2.11", - "web3-utils": "1.2.11" - } - }, - "web3-core-promievent": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "eventemitter3": "4.0.4" - } - }, - "web3-core-requestmanager": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "underscore": "1.9.1", - "web3-core-helpers": "1.2.11", - "web3-providers-http": "1.2.11", - "web3-providers-ipc": "1.2.11", - "web3-providers-ws": "1.2.11" - } - }, - "web3-core-subscriptions": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "eventemitter3": "4.0.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.11" - } - }, - "web3-eth": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "underscore": "1.9.1", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-core-subscriptions": "1.2.11", - "web3-eth-abi": "1.2.11", - "web3-eth-accounts": "1.2.11", - "web3-eth-contract": "1.2.11", - "web3-eth-ens": "1.2.11", - "web3-eth-iban": "1.2.11", - "web3-eth-personal": "1.2.11", - "web3-net": "1.2.11", - "web3-utils": "1.2.11" - } - }, - "web3-eth-abi": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "@ethersproject/abi": "5.0.0-beta.153", - "underscore": "1.9.1", - "web3-utils": "1.2.11" - } - }, - "web3-eth-accounts": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-common": "^1.3.2", - "ethereumjs-tx": "^2.1.1", - "scrypt-js": "^3.0.1", - "underscore": "1.9.1", - "uuid": "3.3.2", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-utils": "1.2.11" - }, - "dependencies": { - "eth-lib": { - "version": "0.2.8", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "uuid": { - "version": "3.3.2", - "dev": true, - "optional": true - } - } - }, - "web3-eth-contract": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "@types/bn.js": "^4.11.5", - "underscore": "1.9.1", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-core-promievent": "1.2.11", - "web3-core-subscriptions": "1.2.11", - "web3-eth-abi": "1.2.11", - "web3-utils": "1.2.11" - } - }, - "web3-eth-ens": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "underscore": "1.9.1", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-promievent": "1.2.11", - "web3-eth-abi": "1.2.11", - "web3-eth-contract": "1.2.11", - "web3-utils": "1.2.11" - } - }, - "web3-eth-iban": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^4.11.9", - "web3-utils": "1.2.11" - } - }, - "web3-eth-personal": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "@types/node": "^12.12.6", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-net": "1.2.11", - "web3-utils": "1.2.11" - }, - "dependencies": { - "@types/node": { - "version": "12.19.12", - "dev": true, - "optional": true - } - } - }, - "web3-net": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "web3-core": "1.2.11", - "web3-core-method": "1.2.11", - "web3-utils": "1.2.11" - } - }, - "web3-provider-engine": { - "version": "14.2.1", - "dev": true, - "requires": { - "async": "^2.5.0", - "backoff": "^2.5.0", - "clone": "^2.0.0", - "cross-fetch": "^2.1.0", - "eth-block-tracker": "^3.0.0", - "eth-json-rpc-infura": "^3.1.0", - "eth-sig-util": "3.0.0", - "ethereumjs-block": "^1.2.2", - "ethereumjs-tx": "^1.2.0", - "ethereumjs-util": "^5.1.5", - "ethereumjs-vm": "^2.3.4", - "json-rpc-error": "^2.0.0", - "json-stable-stringify": "^1.0.1", - "promise-to-callback": "^1.0.0", - "readable-stream": "^2.2.9", - "request": "^2.85.0", - "semaphore": "^1.0.3", - "ws": "^5.1.1", - "xhr": "^2.2.0", - "xtend": "^4.0.1" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.6.3", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - }, - "deferred-leveldown": { - "version": "1.2.2", - "dev": true, - "requires": { - "abstract-leveldown": "~2.6.0" - } - }, - "eth-sig-util": { - "version": "1.4.2", - "dev": true, - "requires": { - "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git", - "ethereumjs-util": "^5.1.1" - } - }, - "ethereumjs-account": { - "version": "2.0.5", - "dev": true, - "requires": { - "ethereumjs-util": "^5.0.0", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "ethereumjs-block": { - "version": "1.7.1", - "dev": true, - "requires": { - "async": "^2.0.1", - "ethereum-common": "0.2.0", - "ethereumjs-tx": "^1.2.2", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - }, - "dependencies": { - "ethereum-common": { - "version": "0.2.0", - "dev": true - } - } - }, - "ethereumjs-tx": { - "version": "1.3.7", - "dev": true, - "requires": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" - } - }, - "ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "ethereumjs-vm": { - "version": "2.6.0", - "dev": true, - "requires": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "ethereumjs-account": "^2.0.3", - "ethereumjs-block": "~2.2.0", - "ethereumjs-common": "^1.1.0", - "ethereumjs-util": "^6.0.0", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.3.2", - "rustbn.js": "~0.2.0", - "safe-buffer": "^5.1.1" - }, - "dependencies": { - "ethereumjs-block": { - "version": "2.2.2", - "dev": true, - "requires": { - "async": "^2.0.1", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.1", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.1", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - } - } - }, - "ethereumjs-tx": { - "version": "2.1.2", - "dev": true, - "requires": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" - } - }, - "ethereumjs-util": { - "version": "6.2.1", - "dev": true, - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - } - } - }, - "isarray": { - "version": "0.0.1", - "dev": true - }, - "level-codec": { - "version": "7.0.1", - "dev": true - }, - "level-errors": { - "version": "1.0.5", - "dev": true, - "requires": { - "errno": "~0.1.1" - } - }, - "level-iterator-stream": { - "version": "1.3.1", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - } - } - }, - "level-ws": { - "version": "0.0.0", - "dev": true, - "requires": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "xtend": { - "version": "2.1.2", - "dev": true, - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, - "levelup": { - "version": "1.3.9", - "dev": true, - "requires": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" - } - }, - "ltgt": { - "version": "2.2.1", - "dev": true - }, - "memdown": { - "version": "1.4.1", - "dev": true, - "requires": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.7.2", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - } - } - }, - "merkle-patricia-tree": { - "version": "2.3.2", - "dev": true, - "requires": { - "async": "^1.4.2", - "ethereumjs-util": "^5.0.0", - "level-ws": "0.0.0", - "levelup": "^1.2.1", - "memdown": "^1.0.0", - "readable-stream": "^2.0.0", - "rlp": "^2.0.0", - "semaphore": ">=1.0.1" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "dev": true - } - } - }, - "object-keys": { - "version": "0.4.0", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "dev": true - }, - "semver": { - "version": "5.4.1", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "dev": true - }, - "ws": { - "version": "5.2.2", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "web3-providers-http": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "web3-core-helpers": "1.2.11", - "xhr2-cookies": "1.1.0" - } - }, - "web3-providers-ipc": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "oboe": "2.1.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.11" - } - }, - "web3-providers-ws": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "eventemitter3": "4.0.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.11", - "websocket": "^1.0.31" - } - }, - "web3-shh": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "web3-core": "1.2.11", - "web3-core-method": "1.2.11", - "web3-core-subscriptions": "1.2.11", - "web3-net": "1.2.11" - } - }, - "web3-utils": { - "version": "1.2.11", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^4.11.9", - "eth-lib": "0.2.8", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - }, - "dependencies": { - "eth-lib": { - "version": "0.2.8", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - } - } - }, - "websocket": { - "version": "1.0.32", - "dev": true, - "requires": { - "bufferutil": "^4.0.1", - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "typedarray-to-buffer": "^3.1.5", - "utf-8-validate": "^5.0.2", - "yaeti": "^0.0.6" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "dev": true - } - } - }, - "whatwg-fetch": { - "version": "2.0.4", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "dev": true - }, - "ws": { - "version": "3.3.3", - "dev": true, - "optional": true, - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "dev": true, - "optional": true - } - } - }, - "xhr": { - "version": "2.6.0", - "dev": true, - "requires": { - "global": "~4.4.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "xhr-request": { - "version": "1.1.0", - "dev": true, - "optional": true, - "requires": { - "buffer-to-arraybuffer": "^0.0.5", - "object-assign": "^4.1.1", - "query-string": "^5.0.1", - "simple-get": "^2.7.0", - "timed-out": "^4.0.1", - "url-set-query": "^1.0.0", - "xhr": "^2.0.4" - } - }, - "xhr-request-promise": { - "version": "0.1.3", - "dev": true, - "optional": true, - "requires": { - "xhr-request": "^1.1.0" - } - }, - "xhr2-cookies": { - "version": "1.1.0", - "dev": true, - "optional": true, - "requires": { - "cookiejar": "^2.1.1" - } - }, - "xtend": { - "version": "4.0.2", - "dev": true - }, - "yaeti": { - "version": "0.0.6", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "dev": true - } - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==" - }, - "get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - } - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-port": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "ghost-testrpc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", - "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "node-emoji": "^1.10.0" - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "global": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", - "dev": true, - "requires": { - "min-document": "^2.19.0", - "process": "^0.11.10" - } - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3" - } - }, - "globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - }, - "dependencies": { - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - } - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "got": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", - "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", - "dev": true, - "requires": { - "@sindresorhus/is": "^4.6.0", - "@szmarczak/http-timer": "^5.0.1", - "@types/cacheable-request": "^6.0.2", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^6.0.4", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "form-data-encoder": "1.7.1", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^2.0.0" - } - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "hardhat": { - "version": "2.17.2", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.17.2.tgz", - "integrity": "sha512-oUv40jBeHw0dKpbyQ+iH9cmNMziweLoTW3MnkNxJ2Gc0KGLrQR/1n4vV4xY60zn2LdmRgnwPqy3CgtY0mfwIIA==", - "dev": true, - "requires": { - "@ethersproject/abi": "^5.1.2", - "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "5.0.2", - "@nomicfoundation/ethereumjs-blockchain": "7.0.2", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-evm": "2.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-statemanager": "2.0.2", - "@nomicfoundation/ethereumjs-trie": "6.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "@nomicfoundation/ethereumjs-vm": "7.0.2", - "@nomicfoundation/solidity-analyzer": "^0.1.0", - "@sentry/node": "^5.18.1", - "@types/bn.js": "^5.1.0", - "@types/lru-cache": "^5.1.0", - "adm-zip": "^0.4.16", - "aggregate-error": "^3.0.0", - "ansi-escapes": "^4.3.0", - "chalk": "^2.4.2", - "chokidar": "^3.4.0", - "ci-info": "^2.0.0", - "debug": "^4.1.1", - "enquirer": "^2.3.0", - "env-paths": "^2.2.0", - "ethereum-cryptography": "^1.0.3", - "ethereumjs-abi": "^0.6.8", - "find-up": "^2.1.0", - "fp-ts": "1.19.3", - "fs-extra": "^7.0.1", - "glob": "7.2.0", - "immutable": "^4.0.0-rc.12", - "io-ts": "1.10.4", - "keccak": "^3.0.2", - "lodash": "^4.17.11", - "mnemonist": "^0.38.0", - "mocha": "^10.0.0", - "p-map": "^4.0.0", - "raw-body": "^2.4.1", - "resolve": "1.17.0", - "semver": "^6.3.0", - "solc": "0.7.3", - "source-map-support": "^0.5.13", - "stacktrace-parser": "^0.1.10", - "tsort": "0.0.1", - "undici": "^5.14.0", - "uuid": "^8.3.2", - "ws": "^7.4.6" - }, - "dependencies": { - "@noble/hashes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", - "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", - "dev": true - }, - "@scure/bip32": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", - "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", - "dev": true, - "requires": { - "@noble/hashes": "~1.2.0", - "@noble/secp256k1": "~1.7.0", - "@scure/base": "~1.1.0" - } - }, - "@scure/bip39": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", - "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", - "dev": true, - "requires": { - "@noble/hashes": "~1.2.0", - "@scure/base": "~1.1.0" - } - }, - "commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", - "dev": true - }, - "ethereum-cryptography": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", - "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", - "dev": true, - "requires": { - "@noble/hashes": "1.2.0", - "@noble/secp256k1": "1.7.1", - "@scure/bip32": "1.1.5", - "@scure/bip39": "1.1.1" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "solc": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", - "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", - "dev": true, - "requires": { - "command-exists": "^1.2.8", - "commander": "3.0.2", - "follow-redirects": "^1.12.1", - "fs-extra": "^0.30.0", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "require-from-string": "^2.0.0", - "semver": "^5.5.0", - "tmp": "0.0.33" - }, - "dependencies": { - "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - } - } - } - } - }, - "hardhat-dependency-compiler": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hardhat-dependency-compiler/-/hardhat-dependency-compiler-1.1.3.tgz", - "integrity": "sha512-bCDqsOxGST6WkbMvj4lPchYWidNSSBm5CFnkyAex1T11cGmr9otZTGl81W6f9pmrtBXbKCvr3OSuNJ6Q394sAw==", - "dev": true, - "requires": {} - }, - "hardhat-gas-reporter": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz", - "integrity": "sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==", - "dev": true, - "requires": { - "array-uniq": "1.0.3", - "eth-gas-reporter": "^0.2.25", - "sha1": "^1.1.1" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "header-case": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", - "integrity": "sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==", - "dev": true, - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.3" - } - }, - "highlight.js": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", - "dev": true - }, - "highlightjs-solidity": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/highlightjs-solidity/-/highlightjs-solidity-2.0.6.tgz", - "integrity": "sha512-DySXWfQghjm2l6a/flF+cteroJqD4gI8GSdL4PtvxZSsAHie8m3yVe2JFoRg03ROKT6hp2Lc/BxXkqerNmtQYg==", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, - "http-basic": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", - "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", - "dev": true, - "requires": { - "caseless": "^0.12.0", - "concat-stream": "^1.6.2", - "http-response-object": "^3.0.1", - "parse-cache-control": "^1.0.1" - } - }, - "http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "http-https": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", - "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==", - "dev": true - }, - "http-response-object": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", - "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", - "dev": true, - "requires": { - "@types/node": "^10.0.3" - }, - "dependencies": { - "@types/node": { - "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", - "dev": true - } - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", - "dev": true, - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "hyperlinker": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hyperlinker/-/hyperlinker-1.0.0.tgz", - "integrity": "sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "idna-uts46-hx": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", - "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", - "dev": true, - "requires": { - "punycode": "2.1.0" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - }, - "immediate": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", - "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", - "dev": true - }, - "immutable": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", - "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", - "dev": true - }, - "io-ts": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", - "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", - "dev": true, - "requires": { - "fp-ts": "^1.0.0" - } - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", - "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==", - "dev": true - }, - "is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-hex-prefixed": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", - "dev": true - }, - "is-lower-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", - "integrity": "sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==", - "dev": true, - "requires": { - "lower-case": "^1.1.0" - } - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", - "dev": true, - "requires": { - "which-typed-array": "^1.1.11" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "is-upper-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", - "integrity": "sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==", - "dev": true, - "requires": { - "upper-case": "^1.1.0" - } - }, - "is-url": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", - "dev": true - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true - }, - "jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", - "dev": true, - "requires": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-sdsl": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.2.tgz", - "integrity": "sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==", - "dev": true - }, - "js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonschema": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", - "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", - "dev": true - }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "keccak": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz", - "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==", - "dev": true, - "requires": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" - }, - "dependencies": { - "node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "dev": true - } - } - }, - "keyv": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", - "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", - "dev": true, - "requires": { - "json-buffer": "3.0.1" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.9" - } - }, - "klaw-sync": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", - "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "level": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", - "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", - "dev": true, - "requires": { - "browser-level": "^1.0.1", - "classic-level": "^1.2.0" - } - }, - "level-codec": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz", - "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==", - "dev": true, - "requires": { - "buffer": "^5.6.0" - } - }, - "level-concat-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", - "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==", - "dev": true - }, - "level-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", - "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==", - "dev": true, - "requires": { - "errno": "~0.1.1" - } - }, - "level-iterator-stream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz", - "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.4.0", - "xtend": "^4.0.2" - } - }, - "level-mem": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/level-mem/-/level-mem-5.0.1.tgz", - "integrity": "sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg==", - "dev": true, - "requires": { - "level-packager": "^5.0.3", - "memdown": "^5.0.0" - } - }, - "level-packager": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-5.1.1.tgz", - "integrity": "sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==", - "dev": true, - "requires": { - "encoding-down": "^6.3.0", - "levelup": "^4.3.2" - } - }, - "level-supports": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", - "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", - "dev": true - }, - "level-transcoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", - "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", - "dev": true, - "requires": { - "buffer": "^6.0.3", - "module-error": "^1.0.1" - }, - "dependencies": { - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - } - } - }, - "level-ws": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-2.0.0.tgz", - "integrity": "sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^3.1.0", - "xtend": "^4.0.1" - } - }, - "levelup": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz", - "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==", - "dev": true, - "requires": { - "deferred-leveldown": "~5.3.0", - "level-errors": "~2.0.0", - "level-iterator-stream": "~4.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - }, - "dependencies": { - "level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "dev": true, - "requires": { - "xtend": "^4.0.2" - } - } - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - } - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==", - "dev": true - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", - "requires": { - "get-func-name": "^2.0.0" - } - }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", - "dev": true - }, - "lower-case-first": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", - "integrity": "sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==", - "dev": true, - "requires": { - "lower-case": "^1.1.2" - } - }, - "lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true - }, - "lru_map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "ltgt": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==", - "dev": true - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "markdown-table": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", - "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", - "dev": true - }, - "mcl-wasm": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", - "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", - "dev": true - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true - }, - "memdown": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz", - "integrity": "sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==", - "dev": true, - "requires": { - "abstract-leveldown": "~6.2.1", - "functional-red-black-tree": "~1.0.1", - "immediate": "~3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "abstract-leveldown": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", - "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - } - }, - "immediate": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", - "integrity": "sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg==", - "dev": true - }, - "level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "dev": true, - "requires": { - "xtend": "^4.0.2" - } - } - } - }, - "memory-level": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", - "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", - "dev": true, - "requires": { - "abstract-level": "^1.0.0", - "functional-red-black-tree": "^1.0.1", - "module-error": "^1.0.1" - } - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "dev": true - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "merkle-patricia-tree": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz", - "integrity": "sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w==", - "dev": true, - "requires": { - "@types/levelup": "^4.3.0", - "ethereumjs-util": "^7.1.4", - "level-mem": "^5.0.1", - "level-ws": "^2.0.0", - "readable-stream": "^3.6.0", - "semaphore-async-await": "^1.5.1" - } - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true - }, - "micro-ftch": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", - "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", - "dev": true, - "requires": { - "dom-walk": "^0.1.0" - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "dev": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - }, - "mkdirp-promise": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", - "integrity": "sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==", - "dev": true, - "requires": { - "mkdirp": "*" - } - }, - "mnemonist": { - "version": "0.38.5", - "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", - "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", - "dev": true, - "requires": { - "obliterator": "^2.0.0" - } - }, - "mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dev": true, - "requires": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "dependencies": { - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "mock-fs": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", - "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==", - "dev": true - }, - "module-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", - "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "multibase": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", - "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", - "dev": true, - "requires": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" - } - }, - "multicodec": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", - "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", - "dev": true, - "requires": { - "varint": "^5.0.0" - } - }, - "multihashes": { - "version": "0.4.21", - "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", - "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "multibase": "^0.7.0", - "varint": "^5.0.0" - }, - "dependencies": { - "multibase": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", - "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", - "dev": true, - "requires": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" - } - } - } - }, - "nano-base32": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nano-base32/-/nano-base32-1.0.1.tgz", - "integrity": "sha512-sxEtoTqAPdjWVGv71Q17koMFGsOMSiHsIFEvzOM7cNp8BXB4AnEwmDabm5dorusJf/v1z7QxaZYxUorU9RKaAw==", - "dev": true - }, - "nano-json-stream-parser": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", - "integrity": "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==", - "dev": true - }, - "nanoassert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", - "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==", - "dev": true - }, - "nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true - }, - "napi-macros": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", - "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "natural-orderby": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-2.0.3.tgz", - "integrity": "sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dev": true, - "requires": { - "lower-case": "^1.1.1" - } - }, - "node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true - }, - "node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "dev": true, - "requires": { - "lodash": "^4.17.21" - } - }, - "node-environment-flags": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", - "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", - "dev": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - }, - "dependencies": { - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - } - } - }, - "node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-gyp-build": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.1.tgz", - "integrity": "sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==", - "devOptional": true - }, - "nofilter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", - "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", - "dev": true - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true - }, - "nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", - "dev": true - }, - "number-to-bn": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", - "dev": true, - "requires": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", - "dev": true - } - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true - }, - "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-treeify": { - "version": "1.1.33", - "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.33.tgz", - "integrity": "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==", - "dev": true - }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz", - "integrity": "sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==", - "dev": true, - "requires": { - "array.prototype.reduce": "^1.0.6", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "safe-array-concat": "^1.0.0" - } - }, - "object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" - } - }, - "object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "obliterator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", - "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==", - "dev": true - }, - "oboe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", - "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", - "dev": true, - "requires": { - "http-https": "^1.0.0" - } - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dev": true, - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - } - }, - "optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "requires": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - } - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true - }, - "p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "packet-reader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", - "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==", - "dev": true - }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", - "dev": true, - "requires": { - "no-case": "^2.2.0" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-cache-control": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", - "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", - "dev": true - }, - "parse-headers": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", - "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==", - "dev": true - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dev": true, - "requires": { - "entities": "^4.4.0" - } - }, - "parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", - "dev": true, - "requires": { - "domhandler": "^5.0.2", - "parse5": "^7.0.0" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascal-case": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", - "integrity": "sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==", - "dev": true, - "requires": { - "camel-case": "^3.0.0", - "upper-case-first": "^1.1.0" - } - }, - "password-prompt": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/password-prompt/-/password-prompt-1.1.3.tgz", - "integrity": "sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw==", - "dev": true, - "requires": { - "ansi-escapes": "^4.3.2", - "cross-spawn": "^7.0.3" - } - }, - "patch-package": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.5.1.tgz", - "integrity": "sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA==", - "dev": true, - "requires": { - "@yarnpkg/lockfile": "^1.1.0", - "chalk": "^4.1.2", - "cross-spawn": "^6.0.5", - "find-yarn-workspace-root": "^2.0.0", - "fs-extra": "^9.0.0", - "is-ci": "^2.0.0", - "klaw-sync": "^6.0.0", - "minimist": "^1.2.6", - "open": "^7.4.2", - "rimraf": "^2.6.3", - "semver": "^5.6.0", - "slash": "^2.0.0", - "tmp": "^0.0.33", - "yaml": "^1.10.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true - }, - "path-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", - "integrity": "sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==", - "dev": true, - "requires": { - "no-case": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==" - }, - "pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true - }, - "pg": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.3.tgz", - "integrity": "sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==", - "dev": true, - "requires": { - "buffer-writer": "2.0.0", - "packet-reader": "1.0.0", - "pg-cloudflare": "^1.1.1", - "pg-connection-string": "^2.6.2", - "pg-pool": "^3.6.1", - "pg-protocol": "^1.6.0", - "pg-types": "^2.1.0", - "pgpass": "1.x" - } - }, - "pg-cloudflare": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", - "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", - "dev": true, - "optional": true - }, - "pg-connection-string": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", - "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==", - "dev": true - }, - "pg-int8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", - "dev": true - }, - "pg-pool": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz", - "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==", - "dev": true, - "requires": {} - }, - "pg-protocol": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", - "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==", - "dev": true - }, - "pg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", - "dev": true, - "requires": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" - } - }, - "pgpass": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", - "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", - "dev": true, - "requires": { - "split2": "^4.1.0" - } - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", - "dev": true - }, - "postgres-bytea": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", - "dev": true - }, - "postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", - "dev": true - }, - "postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", - "dev": true, - "requires": { - "xtend": "^4.0.0" - } - }, - "postinstall-postinstall": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz", - "integrity": "sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", - "dev": true - }, - "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true - }, - "prettier-plugin-solidity": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.3.tgz", - "integrity": "sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg==", - "dev": true, - "requires": { - "@solidity-parser/parser": "^0.16.0", - "semver": "^7.3.8", - "solidity-comments-extractor": "^0.0.7" - }, - "dependencies": { - "@solidity-parser/parser": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.1.tgz", - "integrity": "sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw==", - "dev": true, - "requires": { - "antlr4ts": "^0.5.0-alpha.4" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "promise": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", - "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", - "dev": true, - "requires": { - "asap": "~2.0.6" - } - }, - "proper-lockfile": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", - "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "retry": "^0.12.0", - "signal-exit": "^3.0.2" - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true - }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", - "dev": true - }, - "pure-rand": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-5.0.5.tgz", - "integrity": "sha512-BwQpbqxSCBJVpamI6ydzcKqyFmnd5msMWUGvzXLm1aXvusbbgkbOto/EUPM00hjveJEaJtdbhUjKSzWRhQVkaw==", - "dev": true - }, - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true - }, - "query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", - "dev": true, - "requires": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true - }, - "ramda": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", - "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "dependencies": { - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - } - } - }, - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", - "dev": true, - "requires": { - "minimatch": "^3.0.5" - } - }, - "redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", - "dev": true, - "requires": { - "esprima": "~4.0.0" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - } - } - }, - "regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", - "dev": true - }, - "regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" - } - }, - "req-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", - "integrity": "sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==", - "dev": true, - "requires": { - "req-from": "^2.0.0" - } - }, - "req-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz", - "integrity": "sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "dev": true - } - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } - } - }, - "request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "dev": true, - "requires": { - "lodash": "^4.17.19" - } - }, - "request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "dev": true, - "requires": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", - "dev": true, - "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "requires": { - "lowercase-keys": "^2.0.0" - }, - "dependencies": { - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } - } - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "ripemd160-min": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/ripemd160-min/-/ripemd160-min-0.0.6.tgz", - "integrity": "sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A==", - "dev": true - }, - "rlp": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", - "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", - "dev": true, - "requires": { - "bn.js": "^5.2.0" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "run-parallel-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", - "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rustbn.js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", - "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==", - "dev": true - }, - "safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sc-istanbul": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz", - "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==", - "dev": true, - "requires": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.8.x", - "esprima": "2.7.x", - "glob": "^5.0.15", - "handlebars": "^4.0.1", - "js-yaml": "3.x", - "mkdirp": "0.5.x", - "nopt": "3.x", - "once": "1.x", - "resolve": "1.1.x", - "supports-color": "^3.1.0", - "which": "^1.1.1", - "wordwrap": "^1.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", - "dev": true - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - } - } - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" - }, - "secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", - "dev": true, - "requires": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - }, - "dependencies": { - "node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "dev": true - } - } - }, - "semaphore-async-await": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz", - "integrity": "sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg==", - "dev": true - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "sentence-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", - "integrity": "sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==", - "dev": true, - "requires": { - "no-case": "^2.2.0", - "upper-case-first": "^1.1.2" - } - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "servify": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", - "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", - "dev": true, - "requires": { - "body-parser": "^1.16.0", - "cors": "^2.8.1", - "express": "^4.14.0", - "request": "^2.79.0", - "xhr": "^2.3.3" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "sha1": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", - "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", - "dev": true, - "requires": { - "charenc": ">= 0.0.1", - "crypt": ">= 0.0.1" - } - }, - "sha3": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/sha3/-/sha3-2.1.4.tgz", - "integrity": "sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==", - "dev": true, - "requires": { - "buffer": "6.0.3" - }, - "dependencies": { - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - } - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true - }, - "simple-get": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz", - "integrity": "sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==", - "dev": true, - "requires": { - "decompress-response": "^3.3.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - }, - "dependencies": { - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - } - } - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, - "snake-case": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", - "integrity": "sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==", - "dev": true, - "requires": { - "no-case": "^2.2.0" - } - }, - "solc": { - "version": "0.4.26", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz", - "integrity": "sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==", - "dev": true, - "requires": { - "fs-extra": "^0.30.0", - "memorystream": "^0.3.1", - "require-from-string": "^1.1.0", - "semver": "^5.3.0", - "yargs": "^4.7.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true - }, - "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, - "y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, - "yargs": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", - "integrity": "sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==", - "dev": true, - "requires": { - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "lodash.assign": "^4.0.3", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.1", - "which-module": "^1.0.0", - "window-size": "^0.2.0", - "y18n": "^3.2.1", - "yargs-parser": "^2.4.1" - } - }, - "yargs-parser": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", - "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "lodash.assign": "^4.0.6" - } - } - } - }, - "solc-0.8": { - "version": "npm:solc@0.8.20", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.20.tgz", - "integrity": "sha512-fPRnGspIEqmhu63RFO3pc79sLA7ZmzO0Uy0L5l6hEt2wAsq0o7UV6pXkAp3Mfv9IBhg7Px/oTu3a+y4gs3BWrQ==", - "dev": true, - "requires": { - "command-exists": "^1.2.8", - "commander": "^8.1.0", - "follow-redirects": "^1.12.1", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "semver": "^5.5.0", - "tmp": "0.0.33" - }, - "dependencies": { - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - } - } - }, - "solidity-ast": { - "version": "0.4.52", - "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.52.tgz", - "integrity": "sha512-iOya9BSiB9jhM8Vf40n8lGELGzwrUc57rl5BhfNtJ5cvAaMvRcNlHeAMNvqJJyjoUnczqRbHqdivEqK89du3Cw==", - "dev": true, - "requires": { - "array.prototype.findlast": "^1.2.2" - } - }, - "solidity-comments-extractor": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz", - "integrity": "sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==", - "dev": true - }, - "solidity-coverage": { - "version": "0.7.22", - "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.7.22.tgz", - "integrity": "sha512-I6Zd5tsFY+gmj1FDIp6w7OrUePx6ZpMgKQZg7dWgPaQHePLi3Jk+iJ8lwZxsWEoNy2Lcv91rMxATWHqRaFdQpw==", - "dev": true, - "requires": { - "@solidity-parser/parser": "^0.14.0", - "@truffle/provider": "^0.2.24", - "chalk": "^2.4.2", - "death": "^1.1.0", - "detect-port": "^1.3.0", - "fs-extra": "^8.1.0", - "ghost-testrpc": "^0.0.2", - "global-modules": "^2.0.0", - "globby": "^10.0.1", - "jsonschema": "^1.2.4", - "lodash": "^4.17.15", - "node-emoji": "^1.10.0", - "pify": "^4.0.1", - "recursive-readdir": "^2.2.2", - "sc-istanbul": "^0.4.5", - "semver": "^7.3.4", - "shelljs": "^0.8.3", - "web3-utils": "^1.3.0" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "solidity-docgen": { - "version": "0.5.17", - "resolved": "https://registry.npmjs.org/solidity-docgen/-/solidity-docgen-0.5.17.tgz", - "integrity": "sha512-RX5SPLFL9z0ZVBcZ/o5l/TKXMgSjNhWdumLuuv+Dy1O/66sThpHYd0HVpzdwAjVff0Ajk76bYM2zZYiMnqBfng==", - "dev": true, - "requires": { - "@oclif/command": "^1.8.0", - "@oclif/config": "^1.17.0", - "@oclif/errors": "^1.3.3", - "@oclif/plugin-help": "^5.0.0", - "globby": "^11.0.0", - "handlebars": "^4.7.6", - "json5": "^2.1.3", - "lodash": "^4.17.15", - "micromatch": "^4.0.2", - "minimatch": "^5.0.0", - "semver": "^7.3.2", - "solc": "^0.6.7" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", - "dev": true - }, - "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "solc": { - "version": "0.6.12", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.6.12.tgz", - "integrity": "sha512-Lm0Ql2G9Qc7yPP2Ba+WNmzw2jwsrd3u4PobHYlSOxaut3TtUbj9+5ZrT6f4DUpNPEoBaFUOEg9Op9C0mk7ge9g==", - "dev": true, - "requires": { - "command-exists": "^1.2.8", - "commander": "3.0.2", - "fs-extra": "^0.30.0", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "require-from-string": "^2.0.0", - "semver": "^5.5.0", - "tmp": "0.0.33" - }, - "dependencies": { - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - } - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", - "dev": true, - "optional": true, - "requires": { - "amdefine": ">=0.0.4" - } - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", - "dev": true - }, - "split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "dependencies": { - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true - } - } - }, - "stacktrace-parser": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", - "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", - "dev": true, - "requires": { - "type-fest": "^0.7.1" - }, - "dependencies": { - "type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "dev": true - } - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", - "dev": true - }, - "streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "dev": true - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true - } - } - }, - "string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "peer": true - }, - "strip-hex-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", - "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", - "dev": true, - "requires": { - "is-hex-prefixed": "1.0.0" - } - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "swap-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", - "integrity": "sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==", - "dev": true, - "requires": { - "lower-case": "^1.1.1", - "upper-case": "^1.1.1" - } - }, - "swarm-js": { - "version": "0.1.42", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.42.tgz", - "integrity": "sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.0", - "buffer": "^5.0.5", - "eth-lib": "^0.1.26", - "fs-extra": "^4.0.2", - "got": "^11.8.5", - "mime-types": "^2.1.16", - "mkdirp-promise": "^5.0.1", - "mock-fs": "^4.1.0", - "setimmediate": "^1.0.5", - "tar": "^4.0.2", - "xhr-request": "^1.0.1" - }, - "dependencies": { - "@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dev": true, - "requires": { - "defer-to-connect": "^2.0.0" - } - }, - "cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "dev": true - }, - "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "dev": true, - "requires": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - } - }, - "http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dev": true, - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - }, - "p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true - } - } - }, - "sync-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", - "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", - "dev": true, - "requires": { - "http-response-object": "^3.0.1", - "sync-rpc": "^1.2.1", - "then-request": "^6.0.0" - } - }, - "sync-rpc": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", - "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", - "dev": true, - "requires": { - "get-port": "^3.1.0" - } - }, - "table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "tar": { - "version": "4.4.19", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", - "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", - "dev": true, - "requires": { - "chownr": "^1.1.4", - "fs-minipass": "^1.2.7", - "minipass": "^2.9.0", - "minizlib": "^1.3.3", - "mkdirp": "^0.5.5", - "safe-buffer": "^5.2.1", - "yallist": "^3.1.1" - } - }, - "test-value": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz", - "integrity": "sha512-+1epbAxtKeXttkGFMTX9H42oqzOTufR1ceCF+GYA5aOmvaPq9wd4PUS8329fn2RRLGNeUkgRLnVpycjx8DsO2w==", - "dev": true, - "requires": { - "array-back": "^1.0.3", - "typical": "^2.6.0" - }, - "dependencies": { - "array-back": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", - "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==", - "dev": true, - "requires": { - "typical": "^2.6.0" - } - } - } - }, - "testrpc": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz", - "integrity": "sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==", - "dev": true - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "then-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", - "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", - "dev": true, - "requires": { - "@types/concat-stream": "^1.6.0", - "@types/form-data": "0.0.33", - "@types/node": "^8.0.0", - "@types/qs": "^6.2.31", - "caseless": "~0.12.0", - "concat-stream": "^1.6.0", - "form-data": "^2.2.0", - "http-basic": "^8.1.1", - "http-response-object": "^3.0.1", - "promise": "^8.0.0", - "qs": "^6.4.0" - }, - "dependencies": { - "@types/node": { - "version": "8.10.66", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", - "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", - "dev": true - }, - "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - } - } - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", - "dev": true - }, - "title-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", - "integrity": "sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==", - "dev": true, - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.0.3" - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "dependencies": { - "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true - } - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "ts-essentials": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-1.0.4.tgz", - "integrity": "sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ==", - "dev": true - }, - "ts-generator": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ts-generator/-/ts-generator-0.1.1.tgz", - "integrity": "sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ==", - "dev": true, - "requires": { - "@types/mkdirp": "^0.5.2", - "@types/prettier": "^2.1.1", - "@types/resolve": "^0.0.8", - "chalk": "^2.4.1", - "glob": "^7.1.2", - "mkdirp": "^0.5.1", - "prettier": "^2.1.2", - "resolve": "^1.8.1", - "ts-essentials": "^1.0.0" - } - }, - "ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - } - } - }, - "tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", - "dev": true, - "peer": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "peer": true, - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsort": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", - "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", - "dev": true - }, - "tweetnacl-util": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", - "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==", - "dev": true - }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "dev": true - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typechain": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/typechain/-/typechain-3.0.0.tgz", - "integrity": "sha512-ft4KVmiN3zH4JUFu2WJBrwfHeDf772Tt2d8bssDTo/YcckKW2D+OwFrHXRC6hJvO3mHjFQTihoMV6fJOi0Hngg==", - "dev": true, - "requires": { - "command-line-args": "^4.0.7", - "debug": "^4.1.1", - "fs-extra": "^7.0.0", - "js-sha3": "^0.8.0", - "lodash": "^4.17.15", - "ts-essentials": "^6.0.3", - "ts-generator": "^0.1.1" - }, - "dependencies": { - "ts-essentials": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-6.0.7.tgz", - "integrity": "sha512-2E4HIIj4tQJlIHuATRHayv0EfMGK3ris/GRk1E3CFnsZzeNV+hUmelbaTZHLtXaZppM5oLhHRtO04gINC4Jusw==", - "dev": true, - "requires": {} - } - } - }, - "typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" - } - }, - "typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - } - }, - "typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - } - }, - "typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true, - "peer": true - }, - "typical": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", - "integrity": "sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==", - "dev": true - }, - "uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true, - "optional": true - }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", - "dev": true - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "undici": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.24.0.tgz", - "integrity": "sha512-OKlckxBjFl0oXxcj9FU6oB8fDAaiRUq+D8jrFWGmOfI/gIyjk/IeS75LMzgYKUaeHzLUcYvf9bbJGSrUwTfwwQ==", - "dev": true, - "requires": { - "busboy": "^1.6.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true - }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", - "dev": true - }, - "upper-case-first": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", - "integrity": "sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==", - "dev": true, - "requires": { - "upper-case": "^1.1.1" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "url": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.1.tgz", - "integrity": "sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA==", - "dev": true, - "requires": { - "punycode": "^1.4.1", - "qs": "^6.11.0" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true - }, - "qs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", - "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - } - } - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - } - }, - "url-set-query": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", - "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==", - "dev": true - }, - "utf-8-validate": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", - "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", - "devOptional": true, - "requires": { - "node-gyp-build": "^4.3.0" - } - }, - "utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", - "dev": true - }, - "util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "varint": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", - "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==", - "dev": true - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "wasmbuilder": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz", - "integrity": "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA==", - "dev": true - }, - "wasmcurves": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.2.tgz", - "integrity": "sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ==", - "dev": true, - "requires": { - "wasmbuilder": "0.0.16" - } - }, - "web-worker": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", - "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==", - "dev": true - }, - "web3": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.10.2.tgz", - "integrity": "sha512-DAtZ3a3ruPziE80uZ3Ob0YDZxt6Vk2un/F5BcBrxO70owJ9Z1Y2+loZmbh1MoAmoLGjA/SUSHeUtid3fYmBaog==", - "dev": true, - "requires": { - "web3-bzz": "1.10.2", - "web3-core": "1.10.2", - "web3-eth": "1.10.2", - "web3-eth-personal": "1.10.2", - "web3-net": "1.10.2", - "web3-shh": "1.10.2", - "web3-utils": "1.10.2" - } - }, - "web3-bzz": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.10.2.tgz", - "integrity": "sha512-vLOfDCj6198Qc7esDrCKeFA/M3ZLbowsaHQ0hIL4NmIHoq7lU8aSRTa5AI+JBh8cKN1gVryJsuW2ZCc5bM4I4Q==", - "dev": true, - "requires": { - "@types/node": "^12.12.6", - "got": "12.1.0", - "swarm-js": "^0.1.40" - }, - "dependencies": { - "@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - } - } - }, - "web3-core": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.10.2.tgz", - "integrity": "sha512-qTn2UmtE8tvwMRsC5pXVdHxrQ4uZ6jiLgF5DRUVtdi7dPUmX18Dp9uxKfIfhGcA011EAn8P6+X7r3pvi2YRxBw==", - "dev": true, - "requires": { - "@types/bn.js": "^5.1.1", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.10.2", - "web3-core-method": "1.10.2", - "web3-core-requestmanager": "1.10.2", - "web3-utils": "1.10.2" - }, - "dependencies": { - "@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "dev": true - }, - "web3-core-helpers": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.2.tgz", - "integrity": "sha512-1JfaNtox6/ZYJHNoI+QVc2ObgwEPeGF+YdxHZQ7aF5605BmlwM1Bk3A8xv6mg64jIRvEq1xX6k9oG6x7p1WgXQ==", - "dev": true, - "requires": { - "web3-eth-iban": "1.10.2", - "web3-utils": "1.10.2" - } - }, - "web3-eth-iban": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.2.tgz", - "integrity": "sha512-y8+Ii2XXdyHQMFNL2NWpBnXe+TVJ4ryvPlzNhObRRnIo4O4nLIXS010olLDMayozDzoUlmzCmBZJYc9Eev1g7A==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "web3-utils": "1.10.2" - } - } - } - }, - "web3-core-helpers": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.0.tgz", - "integrity": "sha512-pIxAzFDS5vnbXvfvLSpaA1tfRykAe9adw43YCKsEYQwH0gCLL0kMLkaCX3q+Q8EVmAh+e1jWL/nl9U0de1+++g==", - "dev": true, - "requires": { - "web3-eth-iban": "1.10.0", - "web3-utils": "1.10.0" - }, - "dependencies": { - "web3-utils": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", - "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - } - } - } - }, - "web3-core-method": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.10.2.tgz", - "integrity": "sha512-gG6ES+LOuo01MJHML4gnEt702M8lcPGMYZoX8UjZzmEebGrPYOY9XccpCrsFgCeKgQzM12SVnlwwpMod1+lcLg==", - "dev": true, - "requires": { - "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.10.2", - "web3-core-promievent": "1.10.2", - "web3-core-subscriptions": "1.10.2", - "web3-utils": "1.10.2" - }, - "dependencies": { - "web3-core-helpers": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.2.tgz", - "integrity": "sha512-1JfaNtox6/ZYJHNoI+QVc2ObgwEPeGF+YdxHZQ7aF5605BmlwM1Bk3A8xv6mg64jIRvEq1xX6k9oG6x7p1WgXQ==", - "dev": true, - "requires": { - "web3-eth-iban": "1.10.2", - "web3-utils": "1.10.2" - } - }, - "web3-core-promievent": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.10.2.tgz", - "integrity": "sha512-Qkkb1dCDOU8dZeORkcwJBQRAX+mdsjx8LqFBB+P4W9QgwMqyJ6LXda+y1XgyeEVeKEmY1RCeTq9Y94q1v62Sfw==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4" - } - }, - "web3-eth-iban": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.2.tgz", - "integrity": "sha512-y8+Ii2XXdyHQMFNL2NWpBnXe+TVJ4ryvPlzNhObRRnIo4O4nLIXS010olLDMayozDzoUlmzCmBZJYc9Eev1g7A==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "web3-utils": "1.10.2" - } - } - } - }, - "web3-core-promievent": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.10.0.tgz", - "integrity": "sha512-68N7k5LWL5R38xRaKFrTFT2pm2jBNFaM4GioS00YjAKXRQ3KjmhijOMG3TICz6Aa5+6GDWYelDNx21YAeZ4YTg==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4" - } - }, - "web3-core-requestmanager": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.10.2.tgz", - "integrity": "sha512-nlLeNJUu6fR+ZbJr2k9Du/nN3VWwB4AJPY4r6nxUODAmykgJq57T21cLP/BEk6mbiFQYGE9TrrPhh4qWxQEtAw==", - "dev": true, - "requires": { - "util": "^0.12.5", - "web3-core-helpers": "1.10.2", - "web3-providers-http": "1.10.2", - "web3-providers-ipc": "1.10.2", - "web3-providers-ws": "1.10.2" - }, - "dependencies": { - "web3-core-helpers": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.2.tgz", - "integrity": "sha512-1JfaNtox6/ZYJHNoI+QVc2ObgwEPeGF+YdxHZQ7aF5605BmlwM1Bk3A8xv6mg64jIRvEq1xX6k9oG6x7p1WgXQ==", - "dev": true, - "requires": { - "web3-eth-iban": "1.10.2", - "web3-utils": "1.10.2" - } - }, - "web3-eth-iban": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.2.tgz", - "integrity": "sha512-y8+Ii2XXdyHQMFNL2NWpBnXe+TVJ4ryvPlzNhObRRnIo4O4nLIXS010olLDMayozDzoUlmzCmBZJYc9Eev1g7A==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "web3-utils": "1.10.2" - } - } - } - }, - "web3-core-subscriptions": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.10.2.tgz", - "integrity": "sha512-MiWcKjz4tco793EPPPLc/YOJmYUV3zAfxeQH/UVTfBejMfnNvmfwKa2SBKfPIvKQHz/xI5bV2TF15uvJEucU7w==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.10.2" - }, - "dependencies": { - "web3-core-helpers": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.2.tgz", - "integrity": "sha512-1JfaNtox6/ZYJHNoI+QVc2ObgwEPeGF+YdxHZQ7aF5605BmlwM1Bk3A8xv6mg64jIRvEq1xX6k9oG6x7p1WgXQ==", - "dev": true, - "requires": { - "web3-eth-iban": "1.10.2", - "web3-utils": "1.10.2" - } - }, - "web3-eth-iban": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.2.tgz", - "integrity": "sha512-y8+Ii2XXdyHQMFNL2NWpBnXe+TVJ4ryvPlzNhObRRnIo4O4nLIXS010olLDMayozDzoUlmzCmBZJYc9Eev1g7A==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "web3-utils": "1.10.2" - } - } - } - }, - "web3-eth": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.10.2.tgz", - "integrity": "sha512-s38rhrntyhGShmXC4R/aQtfkpcmev9c7iZwgb9CDIBFo7K8nrEJvqIOyajeZTxnDIiGzTJmrHxiKSadii5qTRg==", - "dev": true, - "requires": { - "web3-core": "1.10.2", - "web3-core-helpers": "1.10.2", - "web3-core-method": "1.10.2", - "web3-core-subscriptions": "1.10.2", - "web3-eth-abi": "1.10.2", - "web3-eth-accounts": "1.10.2", - "web3-eth-contract": "1.10.2", - "web3-eth-ens": "1.10.2", - "web3-eth-iban": "1.10.2", - "web3-eth-personal": "1.10.2", - "web3-net": "1.10.2", - "web3-utils": "1.10.2" - }, - "dependencies": { - "web3-core-helpers": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.2.tgz", - "integrity": "sha512-1JfaNtox6/ZYJHNoI+QVc2ObgwEPeGF+YdxHZQ7aF5605BmlwM1Bk3A8xv6mg64jIRvEq1xX6k9oG6x7p1WgXQ==", - "dev": true, - "requires": { - "web3-eth-iban": "1.10.2", - "web3-utils": "1.10.2" - } - }, - "web3-eth-abi": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.10.2.tgz", - "integrity": "sha512-pY4fQUio7W7ZRSLf+vsYkaxJqaT/jHcALZjIxy+uBQaYAJ3t6zpQqMZkJB3Dw7HUODRJ1yI0NPEFGTnkYf/17A==", - "dev": true, - "requires": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.10.2" - } - }, - "web3-eth-iban": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.2.tgz", - "integrity": "sha512-y8+Ii2XXdyHQMFNL2NWpBnXe+TVJ4ryvPlzNhObRRnIo4O4nLIXS010olLDMayozDzoUlmzCmBZJYc9Eev1g7A==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "web3-utils": "1.10.2" - } - } - } - }, - "web3-eth-abi": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.10.0.tgz", - "integrity": "sha512-cwS+qRBWpJ43aI9L3JS88QYPfFcSJJ3XapxOQ4j40v6mk7ATpA8CVK1vGTzpihNlOfMVRBkR95oAj7oL6aiDOg==", - "dev": true, - "requires": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.10.0" - }, - "dependencies": { - "web3-utils": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", - "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - } - } - } - }, - "web3-eth-accounts": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.10.2.tgz", - "integrity": "sha512-6/HhCBYAXN/f553/SyxS9gY62NbLgpD1zJpENcvRTDpJN3Znvli1cmpl5Q3ZIUJkvHnG//48EWfWh0cbb3fbKQ==", - "dev": true, - "requires": { - "@ethereumjs/common": "2.5.0", - "@ethereumjs/tx": "3.3.2", - "@ethereumjs/util": "^8.1.0", - "eth-lib": "0.2.8", - "scrypt-js": "^3.0.1", - "uuid": "^9.0.0", - "web3-core": "1.10.2", - "web3-core-helpers": "1.10.2", - "web3-core-method": "1.10.2", - "web3-utils": "1.10.2" - }, - "dependencies": { - "@ethereumjs/common": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", - "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", - "dev": true, - "requires": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.1" - } - }, - "@ethereumjs/tx": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", - "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", - "dev": true, - "requires": { - "@ethereumjs/common": "^2.5.0", - "ethereumjs-util": "^7.1.2" - } - }, - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "dev": true - }, - "web3-core-helpers": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.2.tgz", - "integrity": "sha512-1JfaNtox6/ZYJHNoI+QVc2ObgwEPeGF+YdxHZQ7aF5605BmlwM1Bk3A8xv6mg64jIRvEq1xX6k9oG6x7p1WgXQ==", - "dev": true, - "requires": { - "web3-eth-iban": "1.10.2", - "web3-utils": "1.10.2" - } - }, - "web3-eth-iban": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.2.tgz", - "integrity": "sha512-y8+Ii2XXdyHQMFNL2NWpBnXe+TVJ4ryvPlzNhObRRnIo4O4nLIXS010olLDMayozDzoUlmzCmBZJYc9Eev1g7A==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "web3-utils": "1.10.2" - }, - "dependencies": { - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - } - } - } - } - }, - "web3-eth-contract": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.10.2.tgz", - "integrity": "sha512-CZLKPQRmupP/+OZ5A/CBwWWkBiz5B/foOpARz0upMh1yjb0dEud4YzRW2gJaeNu0eGxDLsWVaXhUimJVGYprQw==", - "dev": true, - "requires": { - "@types/bn.js": "^5.1.1", - "web3-core": "1.10.2", - "web3-core-helpers": "1.10.2", - "web3-core-method": "1.10.2", - "web3-core-promievent": "1.10.2", - "web3-core-subscriptions": "1.10.2", - "web3-eth-abi": "1.10.2", - "web3-utils": "1.10.2" - }, - "dependencies": { - "web3-core-helpers": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.2.tgz", - "integrity": "sha512-1JfaNtox6/ZYJHNoI+QVc2ObgwEPeGF+YdxHZQ7aF5605BmlwM1Bk3A8xv6mg64jIRvEq1xX6k9oG6x7p1WgXQ==", - "dev": true, - "requires": { - "web3-eth-iban": "1.10.2", - "web3-utils": "1.10.2" - } - }, - "web3-core-promievent": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.10.2.tgz", - "integrity": "sha512-Qkkb1dCDOU8dZeORkcwJBQRAX+mdsjx8LqFBB+P4W9QgwMqyJ6LXda+y1XgyeEVeKEmY1RCeTq9Y94q1v62Sfw==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4" - } - }, - "web3-eth-abi": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.10.2.tgz", - "integrity": "sha512-pY4fQUio7W7ZRSLf+vsYkaxJqaT/jHcALZjIxy+uBQaYAJ3t6zpQqMZkJB3Dw7HUODRJ1yI0NPEFGTnkYf/17A==", - "dev": true, - "requires": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.10.2" - } - }, - "web3-eth-iban": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.2.tgz", - "integrity": "sha512-y8+Ii2XXdyHQMFNL2NWpBnXe+TVJ4ryvPlzNhObRRnIo4O4nLIXS010olLDMayozDzoUlmzCmBZJYc9Eev1g7A==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "web3-utils": "1.10.2" - } - } - } - }, - "web3-eth-ens": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.10.2.tgz", - "integrity": "sha512-kTQ42UdNHy4BQJHgWe97bHNMkc3zCMBKKY7t636XOMxdI/lkRdIjdE5nQzt97VjQvSVasgIWYKRAtd8aRaiZiQ==", - "dev": true, - "requires": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.10.2", - "web3-core-helpers": "1.10.2", - "web3-core-promievent": "1.10.2", - "web3-eth-abi": "1.10.2", - "web3-eth-contract": "1.10.2", - "web3-utils": "1.10.2" - }, - "dependencies": { - "web3-core-helpers": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.2.tgz", - "integrity": "sha512-1JfaNtox6/ZYJHNoI+QVc2ObgwEPeGF+YdxHZQ7aF5605BmlwM1Bk3A8xv6mg64jIRvEq1xX6k9oG6x7p1WgXQ==", - "dev": true, - "requires": { - "web3-eth-iban": "1.10.2", - "web3-utils": "1.10.2" - } - }, - "web3-core-promievent": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.10.2.tgz", - "integrity": "sha512-Qkkb1dCDOU8dZeORkcwJBQRAX+mdsjx8LqFBB+P4W9QgwMqyJ6LXda+y1XgyeEVeKEmY1RCeTq9Y94q1v62Sfw==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4" - } - }, - "web3-eth-abi": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.10.2.tgz", - "integrity": "sha512-pY4fQUio7W7ZRSLf+vsYkaxJqaT/jHcALZjIxy+uBQaYAJ3t6zpQqMZkJB3Dw7HUODRJ1yI0NPEFGTnkYf/17A==", - "dev": true, - "requires": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.10.2" - } - }, - "web3-eth-iban": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.2.tgz", - "integrity": "sha512-y8+Ii2XXdyHQMFNL2NWpBnXe+TVJ4ryvPlzNhObRRnIo4O4nLIXS010olLDMayozDzoUlmzCmBZJYc9Eev1g7A==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "web3-utils": "1.10.2" - } - } - } - }, - "web3-eth-iban": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.0.tgz", - "integrity": "sha512-0l+SP3IGhInw7Q20LY3IVafYEuufo4Dn75jAHT7c2aDJsIolvf2Lc6ugHkBajlwUneGfbRQs/ccYPQ9JeMUbrg==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "web3-utils": "1.10.0" - }, - "dependencies": { - "web3-utils": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", - "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - } - } - } - }, - "web3-eth-personal": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.10.2.tgz", - "integrity": "sha512-+vEbJsPUJc5J683y0c2aN645vXC+gPVlFVCQu4IjPvXzJrAtUfz26+IZ6AUOth4fDJPT0f1uSLS5W2yrUdw9BQ==", - "dev": true, - "requires": { - "@types/node": "^12.12.6", - "web3-core": "1.10.2", - "web3-core-helpers": "1.10.2", - "web3-core-method": "1.10.2", - "web3-net": "1.10.2", - "web3-utils": "1.10.2" - }, - "dependencies": { - "@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "web3-core-helpers": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.2.tgz", - "integrity": "sha512-1JfaNtox6/ZYJHNoI+QVc2ObgwEPeGF+YdxHZQ7aF5605BmlwM1Bk3A8xv6mg64jIRvEq1xX6k9oG6x7p1WgXQ==", - "dev": true, - "requires": { - "web3-eth-iban": "1.10.2", - "web3-utils": "1.10.2" - } - }, - "web3-eth-iban": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.2.tgz", - "integrity": "sha512-y8+Ii2XXdyHQMFNL2NWpBnXe+TVJ4ryvPlzNhObRRnIo4O4nLIXS010olLDMayozDzoUlmzCmBZJYc9Eev1g7A==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "web3-utils": "1.10.2" - } - } - } - }, - "web3-net": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.10.2.tgz", - "integrity": "sha512-w9i1t2z7dItagfskhaCKwpp6W3ylUR88gs68u820y5f8yfK5EbPmHc6c2lD8X9ZrTnmDoeOpIRCN/RFPtZCp+g==", - "dev": true, - "requires": { - "web3-core": "1.10.2", - "web3-core-method": "1.10.2", - "web3-utils": "1.10.2" - } - }, - "web3-providers-http": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.10.2.tgz", - "integrity": "sha512-G8abKtpkyKGpRVKvfjIF3I4O/epHP7mxXWN8mNMQLkQj1cjMFiZBZ13f+qI77lNJN7QOf6+LtNdKrhsTGU72TA==", - "dev": true, - "requires": { - "abortcontroller-polyfill": "^1.7.5", - "cross-fetch": "^4.0.0", - "es6-promise": "^4.2.8", - "web3-core-helpers": "1.10.2" - }, - "dependencies": { - "web3-core-helpers": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.2.tgz", - "integrity": "sha512-1JfaNtox6/ZYJHNoI+QVc2ObgwEPeGF+YdxHZQ7aF5605BmlwM1Bk3A8xv6mg64jIRvEq1xX6k9oG6x7p1WgXQ==", - "dev": true, - "requires": { - "web3-eth-iban": "1.10.2", - "web3-utils": "1.10.2" - } - }, - "web3-eth-iban": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.2.tgz", - "integrity": "sha512-y8+Ii2XXdyHQMFNL2NWpBnXe+TVJ4ryvPlzNhObRRnIo4O4nLIXS010olLDMayozDzoUlmzCmBZJYc9Eev1g7A==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "web3-utils": "1.10.2" - } - } - } - }, - "web3-providers-ipc": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.10.2.tgz", - "integrity": "sha512-lWbn6c+SgvhLymU8u4Ea/WOVC0Gqs7OJUvauejWz+iLycxeF0xFNyXnHVAi42ZJDPVI3vnfZotafoxcNNL7Sug==", - "dev": true, - "requires": { - "oboe": "2.1.5", - "web3-core-helpers": "1.10.2" - }, - "dependencies": { - "web3-core-helpers": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.2.tgz", - "integrity": "sha512-1JfaNtox6/ZYJHNoI+QVc2ObgwEPeGF+YdxHZQ7aF5605BmlwM1Bk3A8xv6mg64jIRvEq1xX6k9oG6x7p1WgXQ==", - "dev": true, - "requires": { - "web3-eth-iban": "1.10.2", - "web3-utils": "1.10.2" - } - }, - "web3-eth-iban": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.2.tgz", - "integrity": "sha512-y8+Ii2XXdyHQMFNL2NWpBnXe+TVJ4ryvPlzNhObRRnIo4O4nLIXS010olLDMayozDzoUlmzCmBZJYc9Eev1g7A==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "web3-utils": "1.10.2" - } - } - } - }, - "web3-providers-ws": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.10.2.tgz", - "integrity": "sha512-3nYSiP6grI5GvpkSoehctSywfCTodU21VY8bUtXyFHK/IVfDooNtMpd5lVIMvXVAlaxwwrCfjebokaJtKH2Iag==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.10.2", - "websocket": "^1.0.32" - }, - "dependencies": { - "web3-core-helpers": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.2.tgz", - "integrity": "sha512-1JfaNtox6/ZYJHNoI+QVc2ObgwEPeGF+YdxHZQ7aF5605BmlwM1Bk3A8xv6mg64jIRvEq1xX6k9oG6x7p1WgXQ==", - "dev": true, - "requires": { - "web3-eth-iban": "1.10.2", - "web3-utils": "1.10.2" - } - }, - "web3-eth-iban": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.2.tgz", - "integrity": "sha512-y8+Ii2XXdyHQMFNL2NWpBnXe+TVJ4ryvPlzNhObRRnIo4O4nLIXS010olLDMayozDzoUlmzCmBZJYc9Eev1g7A==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "web3-utils": "1.10.2" - } - } - } - }, - "web3-shh": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.10.2.tgz", - "integrity": "sha512-UP0Kc3pHv9uULFu0+LOVfPwKBSJ6B+sJ5KflF7NyBk6TvNRxlpF3hUhuaVDCjjB/dDUR6T0EQeg25FA2uzJbag==", - "dev": true, - "requires": { - "web3-core": "1.10.2", - "web3-core-method": "1.10.2", - "web3-core-subscriptions": "1.10.2", - "web3-net": "1.10.2" - } - }, - "web3-utils": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.2.tgz", - "integrity": "sha512-TdApdzdse5YR+5GCX/b/vQnhhbj1KSAtfrDtRW7YS0kcWp1gkJsN62gw6GzCaNTeXookB7UrLtmDUuMv65qgow==", - "dev": true, - "requires": { - "@ethereumjs/util": "^8.1.0", - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereum-cryptography": "^2.1.2", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "dependencies": { - "ethereum-cryptography": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz", - "integrity": "sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==", - "dev": true, - "requires": { - "@noble/curves": "1.1.0", - "@noble/hashes": "1.3.1", - "@scure/bip32": "1.3.1", - "@scure/bip39": "1.2.1" - } - } - } - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "websocket": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", - "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", - "dev": true, - "requires": { - "bufferutil": "^4.0.1", - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "typedarray-to-buffer": "^3.1.5", - "utf-8-validate": "^5.0.2", - "yaeti": "^0.0.6" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true - }, - "which-typed-array": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", - "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - } - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "requires": { - "string-width": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "window-size": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", - "integrity": "sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==", - "dev": true - }, - "word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, - "workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "requires": {} - }, - "xhr": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", - "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", - "dev": true, - "requires": { - "global": "~4.4.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "xhr-request": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", - "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", - "dev": true, - "requires": { - "buffer-to-arraybuffer": "^0.0.5", - "object-assign": "^4.1.1", - "query-string": "^5.0.1", - "simple-get": "^2.7.0", - "timed-out": "^4.0.1", - "url-set-query": "^1.0.0", - "xhr": "^2.0.4" - } - }, - "xhr-request-promise": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz", - "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==", - "dev": true, - "requires": { - "xhr-request": "^1.1.0" - } - }, - "xhr2-cookies": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz", - "integrity": "sha512-hjXUA6q+jl/bd8ADHcVfFsSPIf+tyLIjuO9TwJC9WI6JP2zKcS7C+p56I9kCLLsaCiNT035iYvEUUzdEFj/8+g==", - "dev": true, - "requires": { - "cookiejar": "^2.1.1" - } - }, - "xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", - "dev": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yaeti": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true - }, - "yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "requires": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - } - } - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } } } From db52cdb2f44986a301778b0b7fa81708f755b2ed Mon Sep 17 00:00:00 2001 From: laisolizq Date: Thu, 6 Jul 2023 23:02:52 +0200 Subject: [PATCH 160/230] update tests and fixes --- compiled-contracts/PolygonZkEVM.json | 6 +- compiled-contracts/PolygonZkEVMMock.json | 7 +- contracts/PolygonZkEVM.sol | 7 +- contracts/mocks/PolygonZkEVMMock.sol | 6 +- docs/PolygonZkEVM.md | 4 +- docs/PolygonZkEVMGlobalExitRoot.md | 9 ++ docs/lib/DepositContract.md | 43 ------- test/contracts/bridge.test.js | 10 +- test/contracts/bridgeMock.test.js | 2 +- test/contracts/bridge_metadata.test.js | 6 +- test/contracts/bridge_permit.test.js | 6 +- test/contracts/depositContractMock.test.js | 12 +- test/contracts/emergencyManager.test.js | 1 - test/contracts/globalExitRootManager.test.js | 54 ++++++++- test/contracts/polygonZkEVM.test.js | 114 ++++++++----------- test/contracts/snark_stark_input.test.js | 4 +- 16 files changed, 147 insertions(+), 144 deletions(-) diff --git a/compiled-contracts/PolygonZkEVM.json b/compiled-contracts/PolygonZkEVM.json index 4e967a181..62f44986d 100644 --- a/compiled-contracts/PolygonZkEVM.json +++ b/compiled-contracts/PolygonZkEVM.json @@ -1351,7 +1351,7 @@ }, { "internalType": "bytes32", - "name": "globalExitRoot", + "name": "historicGlobalExitRoot", "type": "bytes32" }, { @@ -1391,7 +1391,7 @@ }, { "internalType": "bytes32", - "name": "globalExitRoot", + "name": "historicGlobalExitRoot", "type": "bytes32" }, { @@ -1400,7 +1400,7 @@ "type": "uint64" } ], - "internalType": "struct PolygonZkEVM.ForcedBatchData[]", + "internalType": "struct PolygonZkEVM.BatchData[]", "name": "batches", "type": "tuple[]" } diff --git a/compiled-contracts/PolygonZkEVMMock.json b/compiled-contracts/PolygonZkEVMMock.json index e64320ada..47ba21a19 100644 --- a/compiled-contracts/PolygonZkEVMMock.json +++ b/compiled-contracts/PolygonZkEVMMock.json @@ -746,6 +746,11 @@ "internalType": "address", "name": "sequencerAddress", "type": "address" + }, + { + "internalType": "bool", + "name": "isForced", + "type": "bool" } ], "name": "calculateAccInputHash", @@ -1478,7 +1483,7 @@ "type": "uint64" } ], - "internalType": "struct PolygonZkEVM.ForcedBatchData[]", + "internalType": "struct PolygonZkEVM.BatchData[]", "name": "batches", "type": "tuple[]" } diff --git a/contracts/PolygonZkEVM.sol b/contracts/PolygonZkEVM.sol index 4bc4a1826..0132fbb9e 100644 --- a/contracts/PolygonZkEVM.sol +++ b/contracts/PolygonZkEVM.sol @@ -29,8 +29,7 @@ contract PolygonZkEVM is * @param transactions L2 ethereum transactions EIP-155 or pre-EIP-155 with signature: * EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data, chainid, 0, 0,) || v || r || s * pre-EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data) || v || r || s - * @param globalExitRoot Global exit root of the batch - * @param timestamp Sequenced timestamp of the batch + * @param forcedHistoricGlobalExitRoot Global exit root of the batch * @param minForcedTimestamp Minimum timestamp of the force batch data, empty when non forced batch */ struct BatchData { @@ -1067,7 +1066,7 @@ contract PolygonZkEVM is * @param batches Struct array which holds the necessary data to append force batches */ function sequenceForceBatches( - ForcedBatchData[] calldata batches + BatchData[] calldata batches ) external isForceBatchAllowed ifNotEmergencyState { uint256 batchesNum = batches.length; @@ -1095,7 +1094,7 @@ contract PolygonZkEVM is // Sequence force batches for (uint256 i = 0; i < batchesNum; i++) { // Load current sequence - ForcedBatchData memory currentBatch = batches[i]; + BatchData memory currentBatch = batches[i]; currentLastForceBatchSequenced++; // Store the current transactions hash since it's used more than once for gas saving diff --git a/contracts/mocks/PolygonZkEVMMock.sol b/contracts/mocks/PolygonZkEVMMock.sol index 23282e96c..23721b8b9 100644 --- a/contracts/mocks/PolygonZkEVMMock.sol +++ b/contracts/mocks/PolygonZkEVMMock.sol @@ -48,7 +48,8 @@ contract PolygonZkEVMMock is PolygonZkEVM { bytes memory transactions, bytes32 globalExitRoot, uint64 timestamp, - address sequencerAddress + address sequencerAddress, + bool isForced ) public pure returns (bytes32) { return keccak256( @@ -57,7 +58,8 @@ contract PolygonZkEVMMock is PolygonZkEVM { keccak256(transactions), globalExitRoot, timestamp, - sequencerAddress + sequencerAddress, + isForced ) ); } diff --git a/docs/PolygonZkEVM.md b/docs/PolygonZkEVM.md index 748e23b83..6a41864a1 100644 --- a/docs/PolygonZkEVM.md +++ b/docs/PolygonZkEVM.md @@ -214,7 +214,7 @@ with the same nonce ### sequenceForceBatches ```solidity function sequenceForceBatches( - struct PolygonZkEVM.ForcedBatchData[] batches + struct PolygonZkEVM.BatchData[] 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.ForcedBatchData[] | Struct array which holds the necessary data to append force batches +|`batches` | struct PolygonZkEVM.BatchData[] | Struct array which holds the necessary data to append force batches ### setTrustedSequencer ```solidity diff --git a/docs/PolygonZkEVMGlobalExitRoot.md b/docs/PolygonZkEVMGlobalExitRoot.md index dd9e76c09..4156d1be2 100644 --- a/docs/PolygonZkEVMGlobalExitRoot.md +++ b/docs/PolygonZkEVMGlobalExitRoot.md @@ -40,6 +40,15 @@ 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 09007366e..9b73756b0 100644 --- a/docs/lib/DepositContract.md +++ b/docs/lib/DepositContract.md @@ -3,49 +3,6 @@ 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/test/contracts/bridge.test.js b/test/contracts/bridge.test.js index d88714fda..6f3e8ce61 100644 --- a/test/contracts/bridge.test.js +++ b/test/contracts/bridge.test.js @@ -133,7 +133,7 @@ describe('PolygonZkEVMBridge Contract', () => { expect(await polygonZkEVMBridgeContract.lastUpdatedDepositCount()).to.be.equal(1); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); + const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); expect(rootSCMainnet).to.be.equal(rootJSMainnet); // check merkle proof @@ -194,7 +194,7 @@ describe('PolygonZkEVMBridge Contract', () => { ); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); + const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); expect(rootSCMainnet).to.be.equal(rootJSMainnet); // check merkle proof @@ -260,7 +260,7 @@ describe('PolygonZkEVMBridge Contract', () => { expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(ethers.ZeroHash); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); + const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); expect(rootSCMainnet).to.be.equal(rootJSMainnet); // Update global exit root @@ -666,7 +666,7 @@ describe('PolygonZkEVMBridge Contract', () => { expect(await newWrappedToken.balanceOf(polygonZkEVMBridgeContract.target)).to.be.equal(0); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); + const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); expect(rootSCMainnet).to.be.equal(rootJSMainnet); // check merkle proof @@ -797,7 +797,7 @@ describe('PolygonZkEVMBridge Contract', () => { }); // Check merkle root with SC - const rootSC = await polygonZkEVMBridgeContract.getDepositRoot(); + const rootSC = await polygonZkEVMBridgeContract.getRoot(); const rootJS = merkleTree.getRoot(); expect(rootSC).to.be.equal(rootJS); diff --git a/test/contracts/bridgeMock.test.js b/test/contracts/bridgeMock.test.js index 7c3c583c1..b34c8fa68 100644 --- a/test/contracts/bridgeMock.test.js +++ b/test/contracts/bridgeMock.test.js @@ -110,7 +110,7 @@ describe('PolygonZkEVMBridge Mock Contract', () => { expect(await tokenContract.balanceOf(polygonZkEVMBridgeContract.address)).to.be.equal(balanceBridge.add(amount)); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); + const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); expect(rootSCMainnet).to.be.equal(rootJSMainnet); // check merkle proof diff --git a/test/contracts/bridge_metadata.test.js b/test/contracts/bridge_metadata.test.js index 25e2c1d1a..d77a424da 100644 --- a/test/contracts/bridge_metadata.test.js +++ b/test/contracts/bridge_metadata.test.js @@ -104,7 +104,7 @@ describe('PolygonZkEVMBridge Contract werid metadata', () => { .to.emit(polygonZkEVMBridgeContract, 'BridgeEvent') .withArgs(LEAF_TYPE_ASSET, originNetwork, tokenAddress, destinationNetwork, destinationAddress, amount, metadata, depositCount); - expect(await polygonZkEVMBridgeContract.getDepositRoot()).to.be.equal(rootJSMainnet); + expect(await polygonZkEVMBridgeContract.getRoot()).to.be.equal(rootJSMainnet); }); it('should PolygonZkEVMBridge with weird token metadata with reverts', async () => { @@ -170,7 +170,7 @@ describe('PolygonZkEVMBridge Contract werid metadata', () => { .to.emit(polygonZkEVMBridgeContract, 'BridgeEvent') .withArgs(LEAF_TYPE_ASSET, originNetwork, tokenAddress, destinationNetwork, destinationAddress, amount, metadata, depositCount); - expect(await polygonZkEVMBridgeContract.getDepositRoot()).to.be.equal(rootJSMainnet); + expect(await polygonZkEVMBridgeContract.getRoot()).to.be.equal(rootJSMainnet); }); it('should PolygonZkEVMBridge with weird token metadata with empty data', async () => { @@ -231,6 +231,6 @@ describe('PolygonZkEVMBridge Contract werid metadata', () => { .to.emit(polygonZkEVMBridgeContract, 'BridgeEvent') .withArgs(LEAF_TYPE_ASSET, originNetwork, tokenAddress, destinationNetwork, destinationAddress, amount, metadata, depositCount); - expect(await polygonZkEVMBridgeContract.getDepositRoot()).to.be.equal(rootJSMainnet); + expect(await polygonZkEVMBridgeContract.getRoot()).to.be.equal(rootJSMainnet); }); }); diff --git a/test/contracts/bridge_permit.test.js b/test/contracts/bridge_permit.test.js index e2f817a6a..93e43412f 100644 --- a/test/contracts/bridge_permit.test.js +++ b/test/contracts/bridge_permit.test.js @@ -136,7 +136,7 @@ describe('PolygonZkEVMBridge Contract Permit tests', () => { expect(await tokenContract.balanceOf(polygonZkEVMBridgeContract.address)).to.be.equal(balanceBridge.add(amount)); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); + const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); expect(rootSCMainnet).to.be.equal(rootJSMainnet); // check merkle proof @@ -234,7 +234,7 @@ describe('PolygonZkEVMBridge Contract Permit tests', () => { expect(await daiContract.balanceOf(polygonZkEVMBridgeContract.address)).to.be.equal(balanceBridge.add(amount)); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); + const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); expect(rootSCMainnet).to.be.equal(rootJSMainnet); // check merkle proof @@ -334,7 +334,7 @@ describe('PolygonZkEVMBridge Contract Permit tests', () => { expect(await uniContract.balanceOf(polygonZkEVMBridgeContract.address)).to.be.equal(balanceBridge.add(amount)); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); + const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); expect(rootSCMainnet).to.be.equal(rootJSMainnet); // check merkle proof diff --git a/test/contracts/depositContractMock.test.js b/test/contracts/depositContractMock.test.js index b40cee38a..ce150c087 100644 --- a/test/contracts/depositContractMock.test.js +++ b/test/contracts/depositContractMock.test.js @@ -66,7 +66,7 @@ describe('Deposit Contract', () => { merkleTree.add(leafValueJs); - const rootSC = await depositContractMock.getDepositRoot(); + const rootSC = await depositContractMock.getRoot(); const rootJS = merkleTree.getRoot(); expect(rootSC).to.be.equal(rootJS); @@ -159,7 +159,7 @@ describe('Deposit Contract', () => { merkleTree.add(leafValueJs); merkleTree.add(leafValueJs2); - const rootSC = await depositContractMock.getDepositRoot(); + const rootSC = await depositContractMock.getRoot(); const rootJS = merkleTree.getRoot(); expect(rootSC).to.be.equal(rootJS); @@ -226,7 +226,7 @@ describe('Deposit Contract', () => { merkleTree.add(leafValue); - let rootSC = await depositContractMock.getDepositRoot(); + let rootSC = await depositContractMock.getRoot(); let rootJS = merkleTree.getRoot(); expect(rootSC).to.be.equal(rootJS); @@ -279,7 +279,7 @@ describe('Deposit Contract', () => { ); merkleTree.add(leafValue); - rootSC = await depositContractMock.getDepositRoot(); + rootSC = await depositContractMock.getRoot(); rootJS = merkleTree.getRoot(); expect(rootSC).to.be.equal(rootJS); @@ -327,7 +327,7 @@ describe('Deposit Contract', () => { ); merkleTree.add(leafValue); - rootSC = await depositContractMock.getDepositRoot(); + rootSC = await depositContractMock.getRoot(); rootJS = merkleTree.getRoot(); expect(rootSC).to.be.equal(rootJS); @@ -375,7 +375,7 @@ describe('Deposit Contract', () => { } await Promise.all(results); // Check roots - rootSC = await depositContractMock.getDepositRoot(); + rootSC = await depositContractMock.getRoot(); rootJS = merkleTree.getRoot(); expect(rootSC).to.be.equal(rootJS); diff --git a/test/contracts/emergencyManager.test.js b/test/contracts/emergencyManager.test.js index 5daeb7b71..d41d11d1e 100644 --- a/test/contracts/emergencyManager.test.js +++ b/test/contracts/emergencyManager.test.js @@ -144,7 +144,6 @@ describe('Emergency mode test', () => { // Once in emergency state no sequenceBatches/forceBatches can be done const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.batchFee(); - const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const sequence = { transactions: l2txData, diff --git a/test/contracts/globalExitRootManager.test.js b/test/contracts/globalExitRootManager.test.js index 17f5bc2a7..1392d914c 100644 --- a/test/contracts/globalExitRootManager.test.js +++ b/test/contracts/globalExitRootManager.test.js @@ -5,6 +5,10 @@ function calculateGlobalExitRoot(mainnetExitRoot, rollupExitRoot) { return ethers.solidityPackedKeccak256(['bytes32', 'bytes32'], [mainnetExitRoot, rollupExitRoot]); } const zero32bytes = '0x0000000000000000000000000000000000000000000000000000000000000000'; +const MerkleTreeBridge = require('@0xpolygonhermez/zkevm-commonjs').MTBridge; +const { + verifyMerkleProof, +} = require('@0xpolygonhermez/zkevm-commonjs').mtBridgeUtils; describe('Global Exit Root', () => { let rollup; @@ -30,6 +34,7 @@ describe('Global Exit Root', () => { expect(await polygonZkEVMGlobalExitRoot.bridgeAddress()).to.be.equal(PolygonZkEVMBridge.address); expect(await polygonZkEVMGlobalExitRoot.lastRollupExitRoot()).to.be.equal(zero32bytes); expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(zero32bytes); + expect(await polygonZkEVMGlobalExitRoot.depositCount()).to.be.equal(0); }); it('should update root and check global exit root', async () => { @@ -44,7 +49,31 @@ describe('Global Exit Root', () => { .withArgs(zero32bytes, newRootRollup); expect(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()) - .to.be.equal(calculateGlobalExitRoot(zero32bytes, newRootRollup)); + .to.be.equal(newRootGlobalExitRoot); + + // compute root merkle tree in Js + const height = 32; + const merkleTree = new MerkleTreeBridge(height); + merkleTree.add(newRootGlobalExitRoot); + + const rootSC = await polygonZkEVMGlobalExitRoot.getRoot(); + const rootJS = merkleTree.getRoot(); + + expect(rootSC).to.be.equal(rootJS); + + // check merkle proof + const index = 0; + const proof = merkleTree.getProofTreeByIndex(index); + + // verify merkle proof + expect(verifyMerkleProof(newRootGlobalExitRoot, proof, index, rootSC)).to.be.equal(true); + + expect(await polygonZkEVMGlobalExitRoot.verifyMerkleProof( + newRootGlobalExitRoot, + proof, + index, + rootSC, + )).to.be.equal(true); // Update root from the PolygonZkEVMBridge const newRootBridge = ethers.hexlify(ethers.randomBytes(32)); @@ -53,7 +82,28 @@ describe('Global Exit Root', () => { .withArgs(newRootBridge, newRootRollup); expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(newRootBridge); + const newRootGlobalExitRoot2 = calculateGlobalExitRoot(newRootBridge, newRootRollup); expect(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()) - .to.be.equal(calculateGlobalExitRoot(newRootBridge, newRootRollup)); + .to.be.equal(newRootGlobalExitRoot2); + + // compute root merkle tree in Js + merkleTree.add(newRootGlobalExitRoot2); + const rootSC2 = await polygonZkEVMGlobalExitRoot.getRoot(); + const rootJS2 = merkleTree.getRoot(); + expect(rootSC2).to.be.equal(rootJS2); + + // check merkle proof + const index2 = 1; + const proof2 = merkleTree.getProofTreeByIndex(index2); + + // verify merkle proof + expect(verifyMerkleProof(newRootGlobalExitRoot2, proof2, index2, rootSC2)).to.be.equal(true); + + expect(await polygonZkEVMGlobalExitRoot.verifyMerkleProof( + newRootGlobalExitRoot2, + proof2, + index2, + rootSC2, + )).to.be.equal(true); }); }); diff --git a/test/contracts/polygonZkEVM.test.js b/test/contracts/polygonZkEVM.test.js index 4d3855225..a405c6f3f 100644 --- a/test/contracts/polygonZkEVM.test.js +++ b/test/contracts/polygonZkEVM.test.js @@ -389,7 +389,6 @@ describe('Polygon ZK-EVM', () => { it('should sequence a batch as trusted sequencer', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.batchFee(); - const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const sequence = { transactions: l2txData, @@ -431,8 +430,7 @@ describe('Polygon ZK-EVM', () => { .to.emit(polygonZkEVMContract, 'SequenceBatches') .withArgs(lastBatchSequenced + 1); - const sequencedTimestamp = (await ethers.provider.getBlock()).timestamp; - + const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const finalOwnerBalance = await maticTokenContract.balanceOf( await trustedSequencer.address, ); @@ -447,12 +445,12 @@ describe('Polygon ZK-EVM', () => { const batchAccInputHashJs = calculateAccInputHash( (await polygonZkEVMContract.sequencedBatches(0)).accInputHash, calculateBatchHashData(sequence.transactions), - sequence.globalExitRoot, - sequence.timestamp, + await polygonZkEVMGlobalExitRoot.getRoot(), + currentTimestamp, deployer.address, + '0x00', ); expect(batchAccInputHash).to.be.equal(batchAccInputHashJs); - expect(sequencedBatchData.sequencedTimestamp).to.be.equal(sequencedTimestamp); expect(sequencedBatchData.previousLastBatchSequenced).to.be.equal(0); }); @@ -460,8 +458,6 @@ describe('Polygon ZK-EVM', () => { const l2txData = '0x1234'; const maticAmount = (await polygonZkEVMContract.batchFee()).mul(2); - const currentTimestamp = (await ethers.provider.getBlock()).timestamp; - const sequence = { transactions: l2txData, globalExitRoot: ethers.HashZero, @@ -492,6 +488,8 @@ describe('Polygon ZK-EVM', () => { .to.emit(polygonZkEVMContract, 'SequenceBatches') .withArgs(lastBatchSequenced + 2); + const currentTimestamp = (await ethers.provider.getBlock()).timestamp; + const finalOwnerBalance = await maticTokenContract.balanceOf( await trustedSequencer.address, ); @@ -510,21 +508,21 @@ describe('Polygon ZK-EVM', () => { const sequencedBatchData2 = await polygonZkEVMContract.sequencedBatches(2); const batchAccInputHash2 = sequencedBatchData2.accInputHash; - // Calcultate input Hahs for batch 1 + // Calcultate input Hash for batch 1 let batchAccInputHashJs = calculateAccInputHash( ethers.HashZero, calculateBatchHashData(sequence.transactions), - sequence.globalExitRoot, - sequence.timestamp, + await polygonZkEVMGlobalExitRoot.getRoot(), + currentTimestamp, trustedSequencer.address, ); - // Calcultate input Hahs for batch 2 + // Calcultate input Hash for batch 2 batchAccInputHashJs = calculateAccInputHash( batchAccInputHashJs, calculateBatchHashData(sequence2.transactions), - sequence2.globalExitRoot, - sequence2.timestamp, + await polygonZkEVMGlobalExitRoot.getRoot(), + currentTimestamp, trustedSequencer.address, ); expect(batchAccInputHash2).to.be.equal(batchAccInputHashJs); @@ -533,7 +531,7 @@ describe('Polygon ZK-EVM', () => { it('force batches through smart contract', async () => { const l2txDataForceBatch = '0x123456'; const maticAmount = await polygonZkEVMContract.getForcedBatchFee(); - const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); + const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getRoot(); // deploy sender SC const sendDataFactory = await ethers.getContractFactory('SendData'); @@ -564,7 +562,7 @@ describe('Polygon ZK-EVM', () => { it('sequenceBatches should sequence multiple batches and force batches', async () => { const l2txDataForceBatch = '0x123456'; const maticAmount = await polygonZkEVMContract.getForcedBatchFee(); - const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); + const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getRoot(); await expect( maticTokenContract.approve(polygonZkEVMContract.address, maticAmount), @@ -586,12 +584,11 @@ describe('Polygon ZK-EVM', () => { const l2txData = '0x1234'; const maticAmountSequence = (await polygonZkEVMContract.batchFee()).mul(1); - const currentTimestamp = (await ethers.provider.getBlock()).timestamp; + let currentTimestamp = (await ethers.provider.getBlock()).timestamp; const sequence = { transactions: l2txDataForceBatch, - globalExitRoot: lastGlobalExitRoot, - timestamp: currentTimestamp, + forcedHistoricGlobalExitRoot: lastGlobalExitRoot, minForcedTimestamp: currentTimestamp, }; @@ -619,28 +616,11 @@ describe('Polygon ZK-EVM', () => { .to.be.revertedWith('ForcedDataDoesNotMatch'); sequence.minForcedTimestamp -= 1; - sequence.timestamp -= 1; - await expect(polygonZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence, sequence2], trustedSequencer.address)) - .to.be.revertedWith('SequencedTimestampBelowForcedTimestamp'); - sequence.timestamp += 1; - - sequence.timestamp = currentTimestamp + 10; - await expect(polygonZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence, sequence2], trustedSequencer.address)) - .to.be.revertedWith('SequencedTimestampInvalid'); - sequence.timestamp = currentTimestamp; - - sequence2.timestamp -= 1; - await expect(polygonZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence, sequence2], trustedSequencer.address)) - .to.be.revertedWith('SequencedTimestampInvalid'); - sequence2.timestamp += 1; - // Sequence Bathces await expect(polygonZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence, sequence2], trustedSequencer.address)) .to.emit(polygonZkEVMContract, 'SequenceBatches') .withArgs(Number(lastBatchSequenced) + 2); - const sequencedTimestamp = (await ethers.provider.getBlock()).timestamp; - const finalOwnerBalance = await maticTokenContract.balanceOf( await trustedSequencer.address, ); @@ -656,27 +636,32 @@ describe('Polygon ZK-EVM', () => { /* * Check batch mapping - * Calcultate input Hahs for batch 1 + * Calcultate input Hash for batch 1 */ + currentTimestamp = (await ethers.provider.getBlock()).timestamp; + let batchAccInputHashJs = calculateAccInputHash( ethers.HashZero, calculateBatchHashData(sequence.transactions), - sequence.globalExitRoot, - sequence.timestamp, + await polygonZkEVMGlobalExitRoot.getRoot(), + sequence.minForcedTimestamp, trustedSequencer.address, + '0x01', ); - // Calcultate input Hahs for batch 2 + // Calcultate input Hash for batch 2 batchAccInputHashJs = calculateAccInputHash( batchAccInputHashJs, calculateBatchHashData(sequence2.transactions), - sequence2.globalExitRoot, - sequence2.timestamp, + await polygonZkEVMGlobalExitRoot.getRoot(), + currentTimestamp, trustedSequencer.address, + '0x00', ); + const batchData2 = await polygonZkEVMContract.sequencedBatches(2); expect(batchData2.accInputHash).to.be.equal(batchAccInputHashJs); - expect(batchData2.sequencedTimestamp).to.be.equal(sequencedTimestamp); + expect(batchData2.sequencedTimestamp).to.be.equal(currentTimestamp); expect(batchData2.previousLastBatchSequenced).to.be.equal(0); }); @@ -750,7 +735,7 @@ describe('Polygon ZK-EVM', () => { it('should force a batch of transactions', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.getForcedBatchFee(); - const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); + const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getRoot(); expect(maticAmount.toString()).to.be.equal((await polygonZkEVMContract.getForcedBatchFee()).toString()); @@ -806,7 +791,7 @@ describe('Polygon ZK-EVM', () => { it('should sequence force batches using sequenceForceBatches', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.getForcedBatchFee(); - const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); + const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getRoot(); await expect( maticTokenContract.approve(polygonZkEVMContract.address, maticAmount), @@ -844,7 +829,7 @@ describe('Polygon ZK-EVM', () => { const forceBatchStruct = { transactions: l2txData, - globalExitRoot: lastGlobalExitRoot, + forcedHistoricGlobalExitRoot: lastGlobalExitRoot, minForcedTimestamp: timestampForceBatch, }; @@ -862,7 +847,7 @@ describe('Polygon ZK-EVM', () => { const forceBatchStructBad = { transactions: l2txData, - globalExitRoot: lastGlobalExitRoot, + forcedHistoricGlobalExitRoot: lastGlobalExitRoot, minForcedTimestamp: timestampForceBatch, }; @@ -874,7 +859,7 @@ describe('Polygon ZK-EVM', () => { forceBatchStructBad.globalExitRoot = ethers.HashZero; await expect(polygonZkEVMContract.sequenceForceBatches([forceBatchStructBad])) .to.be.revertedWith('ForcedDataDoesNotMatch'); - forceBatchStructBad.globalExitRoot = lastGlobalExitRoot; + forceBatchStructBad.forcedHistoricGlobalExitRoot = lastGlobalExitRoot; forceBatchStructBad.transactions = '0x1111'; await expect(polygonZkEVMContract.sequenceForceBatches([forceBatchStructBad])) @@ -889,8 +874,6 @@ describe('Polygon ZK-EVM', () => { .to.emit(polygonZkEVMContract, 'SequenceForceBatches') .withArgs(1); - const timestampSequenceBatch = (await ethers.provider.getBlock()).timestamp; - expect(await polygonZkEVMContract.lastForceBatchSequenced()).to.be.equal(1); expect(await polygonZkEVMContract.lastForceBatch()).to.be.equal(1); expect(await polygonZkEVMContract.lastBatchSequenced()).to.be.equal(1); @@ -901,9 +884,10 @@ describe('Polygon ZK-EVM', () => { const batchAccInputHashJs = calculateAccInputHash( ethers.HashZero, calculateBatchHashData(l2txData), - lastGlobalExitRoot, - timestampSequenceBatch, + await polygonZkEVMGlobalExitRoot.getRoot(), + forceBatchStruct.minForcedTimestamp, deployer.address, + '0x01', ); expect(batchAccInputHash).to.be.equal(batchAccInputHashJs); }); @@ -911,7 +895,6 @@ describe('Polygon ZK-EVM', () => { it('should verify a sequenced batch using verifyBatchesTrustedAggregator', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.batchFee(); - const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const sequence = { transactions: l2txData, @@ -999,7 +982,7 @@ describe('Polygon ZK-EVM', () => { it('should verify forced sequenced batch using verifyBatchesTrustedAggregator', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.getForcedBatchFee(); - const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); + const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getRoot(); await expect( maticTokenContract.approve(polygonZkEVMContract.address, maticAmount), @@ -1021,7 +1004,7 @@ describe('Polygon ZK-EVM', () => { const forceBatchStruct = { transactions: l2txData, - globalExitRoot: lastGlobalExitRoot, + forcedHistoricGlobalExitRoot: lastGlobalExitRoot, minForcedTimestamp: timestampForceBatch, }; @@ -1068,7 +1051,6 @@ describe('Polygon ZK-EVM', () => { it('should match the computed SC input with the Js input', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.batchFee(); - const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const sequence = { transactions: l2txData, @@ -1091,13 +1073,15 @@ describe('Polygon ZK-EVM', () => { const sentBatchHash = (await polygonZkEVMContract.sequencedBatches(lastBatchSequenced + 1)).accInputHash; const oldAccInputHash = (await polygonZkEVMContract.sequencedBatches(0)).accInputHash; + const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const batchAccInputHashJs = calculateAccInputHash( oldAccInputHash, calculateBatchHashData(sequence.transactions), - sequence.globalExitRoot, - sequence.timestamp, + await polygonZkEVMGlobalExitRoot.getRoot(), + currentTimestamp, trustedSequencer.address, + '0x00', ); expect(sentBatchHash).to.be.equal(batchAccInputHashJs); @@ -1137,7 +1121,7 @@ describe('Polygon ZK-EVM', () => { it('should match the computed SC input with the Js input in force batches', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.getForcedBatchFee(); - const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); + const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getRoot(); await expect( maticTokenContract.approve(polygonZkEVMContract.address, maticAmount), @@ -1160,7 +1144,7 @@ describe('Polygon ZK-EVM', () => { const forceBatchStruct = { transactions: l2txData, - globalExitRoot: lastGlobalExitRoot, + forcedHistoricGlobalExitRoot: lastGlobalExitRoot, minForcedTimestamp: timestampForceBatch, }; @@ -1169,16 +1153,16 @@ describe('Polygon ZK-EVM', () => { .to.emit(polygonZkEVMContract, 'SequenceForceBatches') .withArgs(lastForcedBatch); - const sequencedTimestmap = (await ethers.provider.getBlock()).timestamp; const oldAccInputHash = (await polygonZkEVMContract.sequencedBatches(0)).accInputHash; const batchAccInputHash = (await polygonZkEVMContract.sequencedBatches(1)).accInputHash; const batchAccInputHashJs = calculateAccInputHash( oldAccInputHash, calculateBatchHashData(l2txData), - lastGlobalExitRoot, - sequencedTimestmap, + await polygonZkEVMGlobalExitRoot.getRoot(), + forceBatchStruct.minForcedTimestamp, deployer.address, + '0x01', ); expect(batchAccInputHash).to.be.equal(batchAccInputHashJs); @@ -1218,7 +1202,6 @@ describe('Polygon ZK-EVM', () => { it('should verify a sequenced batch using verifyBatches', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.batchFee(); - const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const sequence = { transactions: l2txData, @@ -1376,7 +1359,6 @@ describe('Polygon ZK-EVM', () => { it('should test the pending state properly', async () => { const l2txData = '0x123456'; - const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const batchesForSequence = 5; const sequence = { @@ -1755,7 +1737,6 @@ describe('Polygon ZK-EVM', () => { it('Activate emergency state due halt timeout', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.batchFee(); - const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const sequence = { transactions: l2txData, @@ -1803,7 +1784,6 @@ describe('Polygon ZK-EVM', () => { it('Test overridePendingState properly', async () => { const l2txData = '0x123456'; - const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const batchesForSequence = 5; const sequence = { diff --git a/test/contracts/snark_stark_input.test.js b/test/contracts/snark_stark_input.test.js index b46f0f2cf..61ae51c87 100644 --- a/test/contracts/snark_stark_input.test.js +++ b/test/contracts/snark_stark_input.test.js @@ -56,7 +56,7 @@ describe('Polygon ZK-EVM snark stark input test', () => { const globalExitRoot = '0x090bcaf734c4f06c93954a827b45a6e8c67b8e0fd1e0a35a1c5982d6961828f9'; const timestamp = 1944498031; const sequencerAddr = '0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D'; - const expectedStarkHashExecutor = '0x704d5cfd3e44b82028f7f8cae31168267a7422c5a447b90a65134116da5a8432'; + const expectedStarkHashExecutor = '0xef046bcaca930591f7c941cad928406dd1402a4e33b4dc704c519d130a05dd9f'; const batchL2DataHash = contractUtils.calculateBatchHashData(batchL2Data); const accumulateInputHashJs = await contractUtils.calculateAccInputHash( @@ -65,6 +65,7 @@ describe('Polygon ZK-EVM snark stark input test', () => { globalExitRoot, timestamp, sequencerAddr, + '0x00', ); const accumulateInputHashSC = await polygonZkEVMContract.calculateAccInputHash( oldAccInputHash, @@ -72,6 +73,7 @@ describe('Polygon ZK-EVM snark stark input test', () => { globalExitRoot, timestamp, sequencerAddr, + false, ); expect(accumulateInputHashJs).to.be.equal(accumulateInputHashSC); expect(accumulateInputHashSC).to.be.equal(expectedStarkHashExecutor); From ecc063e008afb90f9f93436115413f71c50a05f6 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Sat, 23 Sep 2023 15:21:20 +0200 Subject: [PATCH 161/230] it does compile :D --- compiled-contracts/PolygonZkEVM.json | 31 +- compiled-contracts/PolygonZkEVMBridge.json | 55 ++- .../PolygonZkEVMBridgeMock.json | 55 ++- .../PolygonZkEVMGlobalExitRoot.json | 98 +++++- .../PolygonZkEVMGlobalExitRootMock.json | 98 +++++- compiled-contracts/PolygonZkEVMMock.json | 35 +- contracts/v2/PolygonZkEVMBridgeV2.sol | 22 ++ contracts/v2/lib/DepositContractBase.sol | 27 ++ docs/v2/PolygonZkEVMBridgeV2.md | 321 ++++++++++-------- 9 files changed, 535 insertions(+), 207 deletions(-) diff --git a/compiled-contracts/PolygonZkEVM.json b/compiled-contracts/PolygonZkEVM.json index 62f44986d..a7172defd 100644 --- a/compiled-contracts/PolygonZkEVM.json +++ b/compiled-contracts/PolygonZkEVM.json @@ -848,6 +848,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "gapLastTimestamp", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "getForcedBatchFee", @@ -1096,19 +1109,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "lastTimestamp", - "outputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "lastVerifiedBatch", @@ -1354,11 +1354,6 @@ "name": "historicGlobalExitRoot", "type": "bytes32" }, - { - "internalType": "uint64", - "name": "timestamp", - "type": "uint64" - }, { "internalType": "uint64", "name": "minForcedTimestamp", diff --git a/compiled-contracts/PolygonZkEVMBridge.json b/compiled-contracts/PolygonZkEVMBridge.json index 0a1bcd5c1..120851c09 100644 --- a/compiled-contracts/PolygonZkEVMBridge.json +++ b/compiled-contracts/PolygonZkEVMBridge.json @@ -304,6 +304,35 @@ "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": [ { @@ -459,19 +488,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "getDepositRoot", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -521,6 +537,19 @@ "stateMutability": "pure", "type": "function" }, + { + "inputs": [], + "name": "getRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { diff --git a/compiled-contracts/PolygonZkEVMBridgeMock.json b/compiled-contracts/PolygonZkEVMBridgeMock.json index a39dd33d9..d0a4eb8d1 100644 --- a/compiled-contracts/PolygonZkEVMBridgeMock.json +++ b/compiled-contracts/PolygonZkEVMBridgeMock.json @@ -323,6 +323,35 @@ "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": [ { @@ -478,19 +507,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "getDepositRoot", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -540,6 +556,19 @@ "stateMutability": "pure", "type": "function" }, + { + "inputs": [], + "name": "getRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { diff --git a/compiled-contracts/PolygonZkEVMGlobalExitRoot.json b/compiled-contracts/PolygonZkEVMGlobalExitRoot.json index a2d289423..08bcf6da5 100644 --- a/compiled-contracts/PolygonZkEVMGlobalExitRoot.json +++ b/compiled-contracts/PolygonZkEVMGlobalExitRoot.json @@ -19,6 +19,11 @@ "stateMutability": "nonpayable", "type": "constructor" }, + { + "inputs": [], + "name": "MerkleTreeFull", + "type": "error" + }, { "inputs": [], "name": "OnlyAllowedContracts", @@ -56,6 +61,48 @@ "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", @@ -69,6 +116,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "getRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -139,10 +199,44 @@ "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": "0x60c060405234801561000f575f80fd5b506040516103e13803806103e183398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a0516103226100bf5f395f818160e301526101b601525f818161012f015261016d01526103225ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c806333d6247d1161005857806333d6247d146100c15780633ed691ef146100d65780635ec6a8df146100de578063a3c573eb1461012a575f80fd5b806301fd90441461007e578063257b363214610099578063319cf735146100b8575b5f80fd5b6100865f5481565b6040519081526020015b60405180910390f35b6100866100a73660046102d5565b60026020525f908152604090205481565b61008660015481565b6100d46100cf3660046102d5565b610151565b005b61008661029b565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610090565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361019f575060018290558161021a565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101e8575f83905582915061021a565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f8181526002602052604081205491925003610295575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6102d06001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f602082840312156102e5575f80fd5b503591905056fea26469706673582212205b8fae68ff3c2dfc257497be9184a2e772688dbece1343c3dc2e8c1923291be864736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061007a575f3560e01c806333d6247d1161005857806333d6247d146100c15780633ed691ef146100d65780635ec6a8df146100de578063a3c573eb1461012a575f80fd5b806301fd90441461007e578063257b363214610099578063319cf735146100b8575b5f80fd5b6100865f5481565b6040519081526020015b60405180910390f35b6100866100a73660046102d5565b60026020525f908152604090205481565b61008660015481565b6100d46100cf3660046102d5565b610151565b005b61008661029b565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610090565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361019f575060018290558161021a565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101e8575f83905582915061021a565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f8181526002602052604081205491925003610295575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6102d06001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f602082840312156102e5575f80fd5b503591905056fea26469706673582212205b8fae68ff3c2dfc257497be9184a2e772688dbece1343c3dc2e8c1923291be864736f6c63430008140033", + "bytecode": "0x60c060405234801561000f575f80fd5b50604051610aa2380380610aa283398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a0516109e26100c05f395f818161013f015261024901525f818161019e015261020001526109e25ff3fe608060405234801561000f575f80fd5b50600436106100c4575f3560e01c80633ed691ef1161007d57806383f244031161005857806383f2440314610186578063a3c573eb14610199578063fb570834146101c0575f80fd5b80633ed691ef1461012a5780635ca1e165146101325780635ec6a8df1461013a575f80fd5b80632dfdf0b5116100ad5780632dfdf0b514610103578063319cf7351461010c57806333d6247d14610115575f80fd5b806301fd9044146100c8578063257b3632146100e4575b5f80fd5b6100d1602b5481565b6040519081526020015b60405180910390f35b6100d16100f23660046106ea565b602d6020525f908152604090205481565b6100d160205481565b6100d1602c5481565b6101286101233660046106ea565b6101e3565b005b6100d1610318565b6100d161032c565b6101617f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100db565b6100d161019436600461072a565b610335565b6101617f000000000000000000000000000000000000000000000000000000000000000081565b6101d36101ce366004610766565b61040a565b60405190151581526020016100db565b602b54602c5473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102325750602c829055816102ae565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361027c57602b8390558291506102ae565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6102b982846104e2565b5f818152602d602052604081205491925003610312575f818152602d602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a361031281610511565b50505050565b5f610327602c54602b546104e2565b905090565b5f61032761060f565b5f83815b602081101561040157600163ffffffff8516821c811690036103a457848160208110610367576103676107ab565b602002013582604051602001610387929190918252602082015260400190565b6040516020818303038152906040528051906020012091506103ef565b818582602081106103b7576103b76107ab565b60200201356040516020016103d6929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806103f981610805565b915050610339565b50949350505050565b5f84815b60208110156104d657600163ffffffff8616821c811690036104795785816020811061043c5761043c6107ab565b60200201358260405160200161045c929190918252602082015260400190565b6040516020818303038152906040528051906020012091506104c4565b8186826020811061048c5761048c6107ab565b60200201356040516020016104ab929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806104ce81610805565b91505061040e565b50909114949350505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b8060016105206020600261095a565b61052a919061096c565b60205410610564576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60205f815461057390610805565b918290555090505f5b6020811015610601578082901c6001166001036105ae57825f82602081106105a6576105a66107ab565b015550505050565b5f81602081106105c0576105c06107ab565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925080806105f990610805565b91505061057c565b5061060a61097f565b505050565b6020545f90819081805b60208110156106e1578083901c600116600103610675575f8160208110610642576106426107ab565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506106a2565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806106d990610805565b915050610619565b50919392505050565b5f602082840312156106fa575f80fd5b5035919050565b80610400810183101561050b575f80fd5b803563ffffffff81168114610725575f80fd5b919050565b5f805f610440848603121561073d575f80fd5b8335925061074e8560208601610701565b915061075d6104208501610712565b90509250925092565b5f805f80610460858703121561077a575f80fd5b8435935061078b8660208701610701565b925061079a6104208601610712565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610835576108356107d8565b5060010190565b600181815b8085111561089557817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561087b5761087b6107d8565b8085161561088857918102915b93841c9390800290610841565b509250929050565b5f826108ab5750600161050b565b816108b757505f61050b565b81600181146108cd57600281146108d7576108f3565b600191505061050b565b60ff8411156108e8576108e86107d8565b50506001821b61050b565b5060208310610133831016604e8410600b8410161715610916575081810a61050b565b610920838361083c565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610952576109526107d8565b029392505050565b5f610965838361089d565b9392505050565b8181038181111561050b5761050b6107d8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea2646970667358221220620178600a1135c1880ab6872ead11bab365c627812a5c5944b802aa54e9004364736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106100c4575f3560e01c80633ed691ef1161007d57806383f244031161005857806383f2440314610186578063a3c573eb14610199578063fb570834146101c0575f80fd5b80633ed691ef1461012a5780635ca1e165146101325780635ec6a8df1461013a575f80fd5b80632dfdf0b5116100ad5780632dfdf0b514610103578063319cf7351461010c57806333d6247d14610115575f80fd5b806301fd9044146100c8578063257b3632146100e4575b5f80fd5b6100d1602b5481565b6040519081526020015b60405180910390f35b6100d16100f23660046106ea565b602d6020525f908152604090205481565b6100d160205481565b6100d1602c5481565b6101286101233660046106ea565b6101e3565b005b6100d1610318565b6100d161032c565b6101617f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100db565b6100d161019436600461072a565b610335565b6101617f000000000000000000000000000000000000000000000000000000000000000081565b6101d36101ce366004610766565b61040a565b60405190151581526020016100db565b602b54602c5473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102325750602c829055816102ae565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361027c57602b8390558291506102ae565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6102b982846104e2565b5f818152602d602052604081205491925003610312575f818152602d602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a361031281610511565b50505050565b5f610327602c54602b546104e2565b905090565b5f61032761060f565b5f83815b602081101561040157600163ffffffff8516821c811690036103a457848160208110610367576103676107ab565b602002013582604051602001610387929190918252602082015260400190565b6040516020818303038152906040528051906020012091506103ef565b818582602081106103b7576103b76107ab565b60200201356040516020016103d6929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806103f981610805565b915050610339565b50949350505050565b5f84815b60208110156104d657600163ffffffff8616821c811690036104795785816020811061043c5761043c6107ab565b60200201358260405160200161045c929190918252602082015260400190565b6040516020818303038152906040528051906020012091506104c4565b8186826020811061048c5761048c6107ab565b60200201356040516020016104ab929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806104ce81610805565b91505061040e565b50909114949350505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b8060016105206020600261095a565b61052a919061096c565b60205410610564576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60205f815461057390610805565b918290555090505f5b6020811015610601578082901c6001166001036105ae57825f82602081106105a6576105a66107ab565b015550505050565b5f81602081106105c0576105c06107ab565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925080806105f990610805565b91505061057c565b5061060a61097f565b505050565b6020545f90819081805b60208110156106e1578083901c600116600103610675575f8160208110610642576106426107ab565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506106a2565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806106d990610805565b915050610619565b50919392505050565b5f602082840312156106fa575f80fd5b5035919050565b80610400810183101561050b575f80fd5b803563ffffffff81168114610725575f80fd5b919050565b5f805f610440848603121561073d575f80fd5b8335925061074e8560208601610701565b915061075d6104208501610712565b90509250925092565b5f805f80610460858703121561077a575f80fd5b8435935061078b8660208701610701565b925061079a6104208601610712565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610835576108356107d8565b5060010190565b600181815b8085111561089557817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561087b5761087b6107d8565b8085161561088857918102915b93841c9390800290610841565b509250929050565b5f826108ab5750600161050b565b816108b757505f61050b565b81600181146108cd57600281146108d7576108f3565b600191505061050b565b60ff8411156108e8576108e86107d8565b50506001821b61050b565b5060208310610133831016604e8410600b8410161715610916575081810a61050b565b610920838361083c565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610952576109526107d8565b029392505050565b5f610965838361089d565b9392505050565b8181038181111561050b5761050b6107d8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea2646970667358221220620178600a1135c1880ab6872ead11bab365c627812a5c5944b802aa54e9004364736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMGlobalExitRootMock.json b/compiled-contracts/PolygonZkEVMGlobalExitRootMock.json index 6bde95a70..1ddb328bc 100644 --- a/compiled-contracts/PolygonZkEVMGlobalExitRootMock.json +++ b/compiled-contracts/PolygonZkEVMGlobalExitRootMock.json @@ -19,6 +19,11 @@ "stateMutability": "nonpayable", "type": "constructor" }, + { + "inputs": [], + "name": "MerkleTreeFull", + "type": "error" + }, { "inputs": [], "name": "OnlyAllowedContracts", @@ -56,6 +61,48 @@ "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", @@ -69,6 +116,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "getRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -170,10 +230,44 @@ "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": "0x60c060405234801561000f575f80fd5b5060405161047838038061047883398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a0516103b86100c05f395f818161013a015261022c01525f818161018601526101e301526103b85ff3fe608060405234801561000f575f80fd5b506004361061009f575f3560e01c806333d6247d116100725780635bcef673116100585780635bcef673146101165780635ec6a8df14610135578063a3c573eb14610181575f80fd5b806333d6247d146100fb5780633ed691ef1461010e575f80fd5b806301fd9044146100a3578063051a9e28146100be578063257b3632146100d3578063319cf735146100f2575b5f80fd5b6100ab5f5481565b6040519081526020015b60405180910390f35b6100d16100cc36600461034b565b6101a8565b005b6100ab6100e136600461034b565b60026020525f908152604090205481565b6100ab60015481565b6100d161010936600461034b565b6101c7565b6100ab610311565b6100d1610124366004610362565b5f9182526002602052604090912055565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b8060025f6101b4610311565b815260208101919091526040015f205550565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102155750600182905581610290565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361025e575f839055829150610290565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f818152600260205260408120549192500361030b575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6103466001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f6020828403121561035b575f80fd5b5035919050565b5f8060408385031215610373575f80fd5b5050803592602090910135915056fea26469706673582212200799b5f60aa8eaf6d49205025cc41bfba78ce4f6ad614164e5da3c0bdc94810464736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061009f575f3560e01c806333d6247d116100725780635bcef673116100585780635bcef673146101165780635ec6a8df14610135578063a3c573eb14610181575f80fd5b806333d6247d146100fb5780633ed691ef1461010e575f80fd5b806301fd9044146100a3578063051a9e28146100be578063257b3632146100d3578063319cf735146100f2575b5f80fd5b6100ab5f5481565b6040519081526020015b60405180910390f35b6100d16100cc36600461034b565b6101a8565b005b6100ab6100e136600461034b565b60026020525f908152604090205481565b6100ab60015481565b6100d161010936600461034b565b6101c7565b6100ab610311565b6100d1610124366004610362565b5f9182526002602052604090912055565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b8060025f6101b4610311565b815260208101919091526040015f205550565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102155750600182905581610290565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361025e575f839055829150610290565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f818152600260205260408120549192500361030b575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6103466001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f6020828403121561035b575f80fd5b5035919050565b5f8060408385031215610373575f80fd5b5050803592602090910135915056fea26469706673582212200799b5f60aa8eaf6d49205025cc41bfba78ce4f6ad614164e5da3c0bdc94810464736f6c63430008140033", + "bytecode": "0x60c060405234801561000f575f80fd5b50604051610b29380380610b2983398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a051610a696100c05f395f818161018701526102b001525f81816101e601526102670152610a695ff3fe608060405234801561000f575f80fd5b50600436106100da575f3560e01c80633ed691ef116100885780635ec6a8df116100635780635ec6a8df1461018257806383f24403146101ce578063a3c573eb146101e1578063fb57083414610208575f80fd5b80633ed691ef146101535780635bcef6731461015b5780635ca1e1651461017a575f80fd5b80632dfdf0b5116100b85780632dfdf0b51461012e578063319cf7351461013757806333d6247d14610140575f80fd5b806301fd9044146100de578063051a9e28146100fa578063257b36321461010f575b5f80fd5b6100e7602b5481565b6040519081526020015b60405180910390f35b61010d610108366004610751565b61022b565b005b6100e761011d366004610751565b602d6020525f908152604090205481565b6100e760205481565b6100e7602c5481565b61010d61014e366004610751565b61024a565b6100e761037f565b61010d610169366004610768565b5f918252602d602052604090912055565b6100e7610393565b6101a97f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f1565b6100e76101dc3660046107b1565b61039c565b6101a97f000000000000000000000000000000000000000000000000000000000000000081565b61021b6102163660046107ed565b610471565b60405190151581526020016100f1565b80602d5f61023761037f565b815260208101919091526040015f205550565b602b54602c5473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102995750602c82905581610315565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102e357602b839055829150610315565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6103208284610549565b5f818152602d602052604081205491925003610379575f818152602d602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a361037981610578565b50505050565b5f61038e602c54602b54610549565b905090565b5f61038e610676565b5f83815b602081101561046857600163ffffffff8516821c8116900361040b578481602081106103ce576103ce610832565b6020020135826040516020016103ee929190918252602082015260400190565b604051602081830303815290604052805190602001209150610456565b8185826020811061041e5761041e610832565b602002013560405160200161043d929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806104608161088c565b9150506103a0565b50949350505050565b5f84815b602081101561053d57600163ffffffff8616821c811690036104e0578581602081106104a3576104a3610832565b6020020135826040516020016104c3929190918252602082015260400190565b60405160208183030381529060405280519060200120915061052b565b818682602081106104f3576104f3610832565b6020020135604051602001610512929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806105358161088c565b915050610475565b50909114949350505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b806001610587602060026109e1565b61059191906109f3565b602054106105cb576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60205f81546105da9061088c565b918290555090505f5b6020811015610668578082901c60011660010361061557825f826020811061060d5761060d610832565b015550505050565b5f816020811061062757610627610832565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925080806106609061088c565b9150506105e3565b50610671610a06565b505050565b6020545f90819081805b6020811015610748578083901c6001166001036106dc575f81602081106106a9576106a9610832565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610709565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806107409061088c565b915050610680565b50919392505050565b5f60208284031215610761575f80fd5b5035919050565b5f8060408385031215610779575f80fd5b50508035926020909101359150565b806104008101831015610572575f80fd5b803563ffffffff811681146107ac575f80fd5b919050565b5f805f61044084860312156107c4575f80fd5b833592506107d58560208601610788565b91506107e46104208501610799565b90509250925092565b5f805f806104608587031215610801575f80fd5b843593506108128660208701610788565b92506108216104208601610799565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036108bc576108bc61085f565b5060010190565b600181815b8085111561091c57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109025761090261085f565b8085161561090f57918102915b93841c93908002906108c8565b509250929050565b5f8261093257506001610572565b8161093e57505f610572565b8160018114610954576002811461095e5761097a565b6001915050610572565b60ff84111561096f5761096f61085f565b50506001821b610572565b5060208310610133831016604e8410600b841016171561099d575081810a610572565b6109a783836108c3565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109d9576109d961085f565b029392505050565b5f6109ec8383610924565b9392505050565b818103818111156105725761057261085f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea2646970667358221220a98316094c188d66989b6db4315ee6329349bd8b58d17fd810172d0b0fb51ee264736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106100da575f3560e01c80633ed691ef116100885780635ec6a8df116100635780635ec6a8df1461018257806383f24403146101ce578063a3c573eb146101e1578063fb57083414610208575f80fd5b80633ed691ef146101535780635bcef6731461015b5780635ca1e1651461017a575f80fd5b80632dfdf0b5116100b85780632dfdf0b51461012e578063319cf7351461013757806333d6247d14610140575f80fd5b806301fd9044146100de578063051a9e28146100fa578063257b36321461010f575b5f80fd5b6100e7602b5481565b6040519081526020015b60405180910390f35b61010d610108366004610751565b61022b565b005b6100e761011d366004610751565b602d6020525f908152604090205481565b6100e760205481565b6100e7602c5481565b61010d61014e366004610751565b61024a565b6100e761037f565b61010d610169366004610768565b5f918252602d602052604090912055565b6100e7610393565b6101a97f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f1565b6100e76101dc3660046107b1565b61039c565b6101a97f000000000000000000000000000000000000000000000000000000000000000081565b61021b6102163660046107ed565b610471565b60405190151581526020016100f1565b80602d5f61023761037f565b815260208101919091526040015f205550565b602b54602c5473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102995750602c82905581610315565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102e357602b839055829150610315565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6103208284610549565b5f818152602d602052604081205491925003610379575f818152602d602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a361037981610578565b50505050565b5f61038e602c54602b54610549565b905090565b5f61038e610676565b5f83815b602081101561046857600163ffffffff8516821c8116900361040b578481602081106103ce576103ce610832565b6020020135826040516020016103ee929190918252602082015260400190565b604051602081830303815290604052805190602001209150610456565b8185826020811061041e5761041e610832565b602002013560405160200161043d929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806104608161088c565b9150506103a0565b50949350505050565b5f84815b602081101561053d57600163ffffffff8616821c811690036104e0578581602081106104a3576104a3610832565b6020020135826040516020016104c3929190918252602082015260400190565b60405160208183030381529060405280519060200120915061052b565b818682602081106104f3576104f3610832565b6020020135604051602001610512929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806105358161088c565b915050610475565b50909114949350505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b806001610587602060026109e1565b61059191906109f3565b602054106105cb576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60205f81546105da9061088c565b918290555090505f5b6020811015610668578082901c60011660010361061557825f826020811061060d5761060d610832565b015550505050565b5f816020811061062757610627610832565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925080806106609061088c565b9150506105e3565b50610671610a06565b505050565b6020545f90819081805b6020811015610748578083901c6001166001036106dc575f81602081106106a9576106a9610832565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610709565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806107409061088c565b915050610680565b50919392505050565b5f60208284031215610761575f80fd5b5035919050565b5f8060408385031215610779575f80fd5b50508035926020909101359150565b806104008101831015610572575f80fd5b803563ffffffff811681146107ac575f80fd5b919050565b5f805f61044084860312156107c4575f80fd5b833592506107d58560208601610788565b91506107e46104208501610799565b90509250925092565b5f805f806104608587031215610801575f80fd5b843593506108128660208701610788565b92506108216104208601610799565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036108bc576108bc61085f565b5060010190565b600181815b8085111561091c57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109025761090261085f565b8085161561090f57918102915b93841c93908002906108c8565b509250929050565b5f8261093257506001610572565b8161093e57505f610572565b8160018114610954576002811461095e5761097a565b6001915050610572565b60ff84111561096f5761096f61085f565b50506001821b610572565b5060208310610133831016604e8410600b841016171561099d575081810a610572565b6109a783836108c3565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109d9576109d961085f565b029392505050565b5f6109ec8383610924565b9392505050565b818103818111156105725761057261085f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea2646970667358221220a98316094c188d66989b6db4315ee6329349bd8b58d17fd810172d0b0fb51ee264736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMMock.json b/compiled-contracts/PolygonZkEVMMock.json index 47ba21a19..57aa3a103 100644 --- a/compiled-contracts/PolygonZkEVMMock.json +++ b/compiled-contracts/PolygonZkEVMMock.json @@ -892,6 +892,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "gapLastTimestamp", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "getForcedBatchFee", @@ -1179,19 +1192,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "lastTimestamp", - "outputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "lastVerifiedBatch", @@ -1434,14 +1434,9 @@ }, { "internalType": "bytes32", - "name": "globalExitRoot", + "name": "forcedHistoricGlobalExitRoot", "type": "bytes32" }, - { - "internalType": "uint64", - "name": "timestamp", - "type": "uint64" - }, { "internalType": "uint64", "name": "minForcedTimestamp", @@ -1474,7 +1469,7 @@ }, { "internalType": "bytes32", - "name": "globalExitRoot", + "name": "forcedHistoricGlobalExitRoot", "type": "bytes32" }, { diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index 9e1c86624..b06d49f73 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -423,6 +423,7 @@ contract PolygonZkEVMBridgeV2 is } } + // Maitain previous approach?¿ /** * @notice Verify merkle proof and withdraw tokens/ether * @param smtProofLocalExitRoot Smt proof to proof the leaf agains the exit root @@ -813,8 +814,29 @@ contract PolygonZkEVMBridgeV2 is ) { revert InvalidSmtProof(); } + } else { + // it's a rollup, therefore we have to infer the origin network + uint32 indexRollup = uint32(globalIndex >> 32); + originNetwork = indexRollup + 1; + + // last 32 bits are leafIndex + leafIndex = uint32(globalIndex); + + // verify merkle proof agains rollup exit root + if ( + !verifyMerkleProof( + calculateRoot(leafValue, smtProofLocalExitRoot, leafIndex), + smtProofRollupExitRoot, + indexRollup, + rollupExitRoot + ) + ) { + revert InvalidSmtProof(); + } } + // TODO must calcualte TRUE origin network + // Set and check nullifier _setAndCheckClaimed(leafIndex, sourceBridgeNetwork); } diff --git a/contracts/v2/lib/DepositContractBase.sol b/contracts/v2/lib/DepositContractBase.sol index a93f0a90f..fa23e5c69 100644 --- a/contracts/v2/lib/DepositContractBase.sol +++ b/contracts/v2/lib/DepositContractBase.sol @@ -128,4 +128,31 @@ contract DepositContractBase { return node; } + + /** + * @notice calcualte root from merkle proof + * @param leafHash Leaf hash + * @param smtProof Smt proof + * @param index Index of the leaf + */ + function calculateRoot( + bytes32 leafHash, + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, + uint32 index + ) public pure returns (bytes32) { + bytes32 node = leafHash; + + // Check merkle proof + for ( + uint256 height = 0; + height < _DEPOSIT_CONTRACT_TREE_DEPTH; + height++ + ) { + if (((index >> height) & 1) == 1) + node = keccak256(abi.encodePacked(smtProof[height], node)); + else node = keccak256(abi.encodePacked(node, smtProof[height])); + } + + return node; + } } diff --git a/docs/v2/PolygonZkEVMBridgeV2.md b/docs/v2/PolygonZkEVMBridgeV2.md index d6c70a974..45cd21c9e 100644 --- a/docs/v2/PolygonZkEVMBridgeV2.md +++ b/docs/v2/PolygonZkEVMBridgeV2.md @@ -1,18 +1,19 @@ PolygonZkEVMBridge that will be deployed on both networks Ethereum and Polygon zkEVM Contract responsible to manage the token interactions with other networks - ## Functions + ### constructor + ```solidity function constructor( ) public ``` -Disable initalizers on the implementation following the best practices - +Disable initalizers on the implementation following the best practices ### initialize + ```solidity function initialize( uint32 _networkID, @@ -22,20 +23,22 @@ Disable initalizers on the implementation following the best practices address _polygonRollupManager ) external ``` + The value of `_polygonRollupManager` on the L2 deployment of the contract will be address(0), so emergency state is not possible for the L2 deployment of the bridge, intentionally #### Parameters: -| 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 +| 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 | ### bridgeAsset + ```solidity function bridgeAsset( uint32 destinationNetwork, @@ -46,6 +49,7 @@ emergency state is not possible for the L2 deployment of the bridge, intentional bytes permitData ) 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. @@ -53,18 +57,19 @@ Therefore we recommend to third parties bridges that if they do implement reentr do not call any external address in that case note User/UI must be aware of the existing/available networks when choosing the destination network - #### Parameters: -| Name | Type | Description | -| :--- | :--- | :------------------------------------------------------------------- | -|`destinationNetwork` | uint32 | Network destination -|`destinationAddress` | address | Address destination -|`amount` | uint256 | Amount of tokens -|`token` | address | Token address, 0 address is reserved for ether -|`forceUpdateGlobalExitRoot` | bool | Indicates if the new global exit root is updated or not -|`permitData` | bytes | Raw data of the call `permit` of the token + +| Name | Type | Description | +| :-------------------------- | :------ | :------------------------------------------------------ | +| `destinationNetwork` | uint32 | Network destination | +| `destinationAddress` | address | Address destination | +| `amount` | uint256 | Amount of tokens | +| `token` | address | Token address, 0 address is reserved for ether | +| `forceUpdateGlobalExitRoot` | bool | Indicates if the new global exit root is updated or not | +| `permitData` | bytes | Raw data of the call `permit` of the token | ### bridgeMessage + ```solidity function bridgeMessage( uint32 destinationNetwork, @@ -73,19 +78,21 @@ note User/UI must be aware of the existing/available networks when choosing the bytes metadata ) external ``` + Bridge message and send ETH value note User/UI must be aware of the existing/available networks when choosing the destination network - #### Parameters: -| Name | Type | Description | -| :--- | :--- | :------------------------------------------------------------------- | -|`destinationNetwork` | uint32 | Network destination -|`destinationAddress` | address | Address destination -|`forceUpdateGlobalExitRoot` | bool | Indicates if the new global exit root is updated or not -|`metadata` | bytes | Message metadata + +| Name | Type | Description | +| :-------------------------- | :------ | :------------------------------------------------------ | +| `destinationNetwork` | uint32 | Network destination | +| `destinationAddress` | address | Address destination | +| `forceUpdateGlobalExitRoot` | bool | Indicates if the new global exit root is updated or not | +| `metadata` | bytes | Message metadata | ### bridgeMessageWETH + ```solidity function bridgeMessageWETH( uint32 destinationNetwork, @@ -95,20 +102,22 @@ note User/UI must be aware of the existing/available networks when choosing the bytes metadata ) external ``` + Bridge message and send ETH value note User/UI must be aware of the existing/available networks when choosing the destination network - #### 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 +| 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, @@ -118,19 +127,21 @@ note User/UI must be aware of the existing/available networks when choosing the bytes metadata ) internal ``` -Bridge message and send ETH value +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 + +| 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( bytes32[32] smtProofLocalExitRoot, @@ -146,17 +157,19 @@ Bridge message and send ETH value bytes metadata ) external ``` -Verify merkle proof and withdraw tokens/ether +Verify merkle proof and withdraw tokens/ether #### Parameters: -| Name | Type | Description | -| :--- | :--- | :------------------------------------------------------------------- | -|`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: -| 191 bits | 1 bit | 32 bits | 32 bits | -| 0 | mainnetFlag | rollupIndex | localRootIndex | + +| Name | Type | Description | +| :----------------------- | :---------- | :------------------------------------------------------------------- | -------------- | +| `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: | +| 191 bits | 1 bit | 32 bits | 32 bits | +| 0 | mainnetFlag | rollupIndex | localRootIndex | + 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 @@ -164,13 +177,14 @@ to avoid possible synch attacks |`mainnetExitRoot` | bytes32 | Mainnet exit root |`rollupExitRoot` | bytes32 | Rollup exit root |`originNetwork` | uint32 | Origin network -|`originTokenAddress` | address | Origin token address, 0 address is reserved for ether +|`originTokenAddress` | address | Origin token address, 0 address is reserved for ether |`destinationNetwork` | uint32 | Network destination |`destinationAddress` | address | Address destination |`amount` | uint256 | Amount of tokens |`metadata` | bytes | Abi encoded metadata if any, empty otherwise ### claimMessage + ```solidity function claimMessage( bytes32[32] smtProofLocalExitRoot, @@ -186,20 +200,22 @@ to avoid possible synch attacks bytes metadata ) external ``` + Verify merkle proof and execute message If the receiving address is an EOA, the call will result as a success Which means that the amount of ether will be transferred correctly, but the message will not trigger any execution - #### Parameters: -| Name | Type | Description | -| :--- | :--- | :------------------------------------------------------------------- | -|`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: -| 191 bits | 1 bit | 32 bits | 32 bits | -| 0 | mainnetFlag | rollupIndex | localRootIndex | + +| Name | Type | Description | +| :----------------------- | :---------- | :------------------------------------------------------------------- | -------------- | +| `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: | +| 191 bits | 1 bit | 32 bits | 32 bits | +| 0 | mainnetFlag | rollupIndex | localRootIndex | + 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 @@ -214,6 +230,7 @@ to avoid possible synch attacks |`metadata` | bytes | Abi encoded metadata if any, empty otherwise ### precalculatedWrapperAddress + ```solidity function precalculatedWrapperAddress( uint32 originNetwork, @@ -223,58 +240,62 @@ to avoid possible synch attacks uint8 decimals ) public returns (address) ``` + Returns the precalculated address of a wrapper using the token information Note Updating the metadata of a token is not supported. Since the metadata has relevance in the address deployed, this function will not return a valid wrapped address if the metadata provided is not the original one. - #### Parameters: -| Name | Type | Description | -| :--- | :--- | :------------------------------------------------------------------- | -|`originNetwork` | uint32 | Origin network -|`originTokenAddress` | address | Origin token address, 0 address is reserved for ether -|`name` | string | Name of the token -|`symbol` | string | Symbol of the token -|`decimals` | uint8 | Decimals of the token + +| Name | Type | Description | +| :------------------- | :------ | :---------------------------------------------------- | +| `originNetwork` | uint32 | Origin network | +| `originTokenAddress` | address | Origin token address, 0 address is reserved for ether | +| `name` | string | Name of the token | +| `symbol` | string | Symbol of the token | +| `decimals` | uint8 | Decimals of the token | ### getTokenWrappedAddress + ```solidity function getTokenWrappedAddress( uint32 originNetwork, address originTokenAddress ) external returns (address) ``` -Returns the address of a wrapper using the token information if already exist +Returns the address of a wrapper using the token information if already exist #### Parameters: -| Name | Type | Description | -| :--- | :--- | :------------------------------------------------------------------- | -|`originNetwork` | uint32 | Origin network -|`originTokenAddress` | address | Origin token address, 0 address is reserved for ether + +| Name | Type | Description | +| :------------------- | :------ | :---------------------------------------------------- | +| `originNetwork` | uint32 | Origin network | +| `originTokenAddress` | address | Origin token address, 0 address is reserved for ether | ### activateEmergencyState + ```solidity function activateEmergencyState( ) external ``` -Function to activate the emergency state - " Only can be called by the Polygon ZK-EVM in extreme situations - +Function to activate the emergency state +" Only can be called by the Polygon ZK-EVM in extreme situations ### deactivateEmergencyState + ```solidity function deactivateEmergencyState( ) external ``` -Function to deactivate the emergency state - " Only can be called by the Polygon ZK-EVM +Function to deactivate the emergency state +" Only can be called by the Polygon ZK-EVM +### \_verifyLeaf -### _verifyLeaf ```solidity function _verifyLeaf( bytes32[32] smtProofLocalExitRoot, @@ -285,160 +306,178 @@ Function to deactivate the emergency state bytes32 leafValue ) internal ``` -Verify leaf and checks that it has not been claimed +Verify leaf and checks that it has not been claimed #### Parameters: -| Name | Type | Description | -| :--- | :--- | :------------------------------------------------------------------- | -|`smtProofLocalExitRoot` | bytes32[32] | Smt proof -|`smtProofRollupExitRoot` | bytes32[32] | Smt proof -|`globalIndex` | uint256 | Index of the leaf -|`mainnetExitRoot` | bytes32 | Mainnet exit root -|`rollupExitRoot` | bytes32 | Rollup exit root -|`leafValue` | bytes32 | leaf value + +| Name | Type | Description | +| :----------------------- | :---------- | :---------------- | +| `smtProofLocalExitRoot` | bytes32[32] | Smt proof | +| `smtProofRollupExitRoot` | bytes32[32] | Smt proof | +| `globalIndex` | uint256 | Index of the leaf | +| `mainnetExitRoot` | bytes32 | Mainnet exit root | +| `rollupExitRoot` | bytes32 | Rollup exit root | +| `leafValue` | bytes32 | leaf value | ### isClaimed + ```solidity function isClaimed( uint32 leafIndex, uint32 sourceBridgeNetwork ) external returns (bool) ``` -Function to check if an index is claimed or not +Function to check if an index is claimed or not #### Parameters: -| Name | Type | Description | -| :--- | :--- | :------------------------------------------------------------------- | -|`leafIndex` | uint32 | Index -|`sourceBridgeNetwork` | uint32 | Origin network + +| Name | Type | Description | +| :-------------------- | :----- | :------------- | +| `leafIndex` | uint32 | Index | +| `sourceBridgeNetwork` | uint32 | Origin network | ### updateGlobalExitRoot + ```solidity function updateGlobalExitRoot( ) external ``` -Function to update the globalExitRoot if the last deposit is not submitted +Function to update the globalExitRoot if the last deposit is not submitted +### \_updateGlobalExitRoot -### _updateGlobalExitRoot ```solidity function _updateGlobalExitRoot( ) internal ``` -Function to update the globalExitRoot +Function to update the globalExitRoot +### \_permit -### _permit ```solidity function _permit( address amount, uint256 permitData ) internal ``` -Function to call token permit method of extended ERC20 - + @param token ERC20 token address +Function to call token permit method of extended ERC20 + @param token ERC20 token address #### Parameters: -| Name | Type | Description | -| :--- | :--- | :------------------------------------------------------------------- | -|`amount` | address | Quantity that is expected to be allowed -|`permitData` | uint256 | Raw data of the call `permit` of the token -### _deployWrappedToken +| Name | Type | Description | +| :----------- | :------ | :----------------------------------------- | +| `amount` | address | Quantity that is expected to be allowed | +| `permitData` | uint256 | Raw data of the call `permit` of the token | + +### \_deployWrappedToken + ```solidity function _deployWrappedToken( bytes32 salt, bytes constructorArgs ) internal returns (contract TokenWrapped newWrappedToken) ``` -Internal function that uses create2 to deploy the wrapped tokens +Internal function that uses create2 to deploy the wrapped tokens #### Parameters: -| Name | Type | Description | -| :--- | :--- | :------------------------------------------------------------------- | -|`salt` | bytes32 | Salt used in create2 params, + +| Name | Type | Description | +| :----- | :------ | :--------------------------- | +| `salt` | bytes32 | Salt used in create2 params, | + tokenInfoHash will be used as salt for all wrappeds except for bridge native WETH, that will be bytes32(0) |`constructorArgs` | bytes | Encoded constructor args for the wrapped token -### _safeSymbol +### \_safeSymbol + ```solidity function _safeSymbol( address token ) internal returns (string) ``` -Provides a safe ERC20.symbol version which returns 'NO_SYMBOL' as fallback string +Provides a safe ERC20.symbol version which returns 'NO_SYMBOL' as fallback string #### Parameters: -| Name | Type | Description | -| :--- | :--- | :------------------------------------------------------------------- | -|`token` | address | The address of the ERC-20 token contract -### _safeName +| Name | Type | Description | +| :------ | :------ | :--------------------------------------- | +| `token` | address | The address of the ERC-20 token contract | + +### \_safeName + ```solidity function _safeName( address token ) internal returns (string) ``` - Provides a safe ERC20.name version which returns 'NO_NAME' as fallback string. +Provides a safe ERC20.name version which returns 'NO_NAME' as fallback string. #### Parameters: -| Name | Type | Description | -| :--- | :--- | :------------------------------------------------------------------- | -|`token` | address | The address of the ERC-20 token contract. -### _safeDecimals +| Name | Type | Description | +| :------ | :------ | :---------------------------------------- | +| `token` | address | The address of the ERC-20 token contract. | + +### \_safeDecimals + ```solidity function _safeDecimals( address token ) internal returns (uint8) ``` + Provides a safe ERC20.decimals version which returns '18' as fallback value. Note Tokens with (decimals > 255) are not supported - #### Parameters: -| Name | Type | Description | -| :--- | :--- | :------------------------------------------------------------------- | -|`token` | address | The address of the ERC-20 token contract -### _returnDataToString +| Name | Type | Description | +| :------ | :------ | :--------------------------------------- | +| `token` | address | The address of the ERC-20 token contract | + +### \_returnDataToString + ```solidity function _returnDataToString( bytes data ) internal returns (string) ``` + Function to convert returned data to string returns 'NOT_VALID_ENCODING' as fallback value. - #### Parameters: -| Name | Type | Description | -| :--- | :--- | :------------------------------------------------------------------- | -|`data` | bytes | returned data + +| Name | Type | Description | +| :----- | :---- | :------------ | +| `data` | bytes | returned data | ### getTokenMetadata + ```solidity function getTokenMetadata( address token ) public returns (bytes) ``` -Returns the encoded token metadata +Returns the encoded token metadata #### Parameters: -| Name | Type | Description | -| :--- | :--- | :------------------------------------------------------------------- | -|`token` | address | Address of the token + +| Name | Type | Description | +| :------ | :------ | :------------------- | +| `token` | address | Address of the token | ### calculateTokenWrapperAddress + ```solidity function calculateTokenWrapperAddress( uint32 originNetwork, @@ -446,21 +485,24 @@ Returns the encoded token metadata address token ) external returns (address) ``` + Returns the precalculated address of a wrapper using the token address Note Updating the metadata of a token is not supported. Since the metadata has relevance in the address deployed, this function will not return a valid wrapped address if the metadata provided is not the original one. - #### Parameters: -| Name | Type | Description | -| :--- | :--- | :------------------------------------------------------------------- | -|`originNetwork` | uint32 | Origin network -|`originTokenAddress` | address | Origin token address, 0 address is reserved for ether -|`token` | address | Address of the token to calculate the wrapper address + +| Name | Type | Description | +| :------------------- | :------ | :---------------------------------------------------- | +| `originNetwork` | uint32 | Origin network | +| `originTokenAddress` | address | Origin token address, 0 address is reserved for ether | +| `token` | address | Address of the token to calculate the wrapper address | ## Events + ### BridgeEvent + ```solidity event BridgeEvent( ) @@ -469,6 +511,7 @@ wrapped address if the metadata provided is not the original one. Emitted when bridge assets or messages to another network ### ClaimEvent + ```solidity event ClaimEvent( ) @@ -477,10 +520,10 @@ Emitted when bridge assets or messages to another network Emitted when a claim is done from another network ### NewWrappedToken + ```solidity event NewWrappedToken( ) ``` Emitted when a new wrapped token is created - From 6e656c9cabbc8b600887edb2b99eed8454625171 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Sun, 8 Oct 2023 09:10:56 +0200 Subject: [PATCH 162/230] update package json --- package-lock.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package-lock.json b/package-lock.json index 8d7f98dd7..11e9b0459 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6917,6 +6917,7 @@ "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", From 54fbdb8a03e235efbbbb134e0646bd5f33ed59b0 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Sun, 8 Oct 2023 13:15:10 +0200 Subject: [PATCH 163/230] start ts migration --- .gitignore | 2 +- package-lock.json | 31 +++- package.json | 2 +- test/contracts/bridge.test.js | 6 +- test/contractsv2/PolygonRollupManager.test.js | 166 ++++++++++++++++++ 5 files changed, 199 insertions(+), 8 deletions(-) create mode 100644 test/contractsv2/PolygonRollupManager.test.js diff --git a/.gitignore b/.gitignore index 4f37d8194..9c02e765d 100644 --- a/.gitignore +++ b/.gitignore @@ -19,4 +19,4 @@ upgrade_parameters.json docker/gethData/ *.ignore/ typechain-types/ -create_rollup_parameters.json \ No newline at end of file +create_rollup_parameters.json diff --git a/package-lock.json b/package-lock.json index 11e9b0459..73063a650 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1920,6 +1920,19 @@ "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", @@ -3870,6 +3883,18 @@ "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", @@ -21214,9 +21239,9 @@ }, "node_modules/solc-0.8": { "name": "solc", - "version": "0.8.20", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.20.tgz", - "integrity": "sha512-fPRnGspIEqmhu63RFO3pc79sLA7ZmzO0Uy0L5l6hEt2wAsq0o7UV6pXkAp3Mfv9IBhg7Px/oTu3a+y4gs3BWrQ==", + "version": "0.8.21", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.21.tgz", + "integrity": "sha512-N55ogy2dkTRwiONbj4e6wMZqUNaLZkiRcjGyeafjLYzo/tf/IvhHY5P5wpe+H3Fubh9idu071i8eOGO31s1ylg==", "dev": true, "dependencies": { "command-exists": "^1.2.8", diff --git a/package.json b/package.json index 03e6df0c7..95c56cc04 100644 --- a/package.json +++ b/package.json @@ -97,4 +97,4 @@ "dockerv2:v1ToV2:contracts": "sudo ./docker/scripts/v1ToV2/deploy-dockerv2.sh", "saveDeployment:sepolia": "mkdir -p deployments/sepolia_$(date +%s) && cp -r deployment/v2/deploy_*.json deployments/sepolia_$(date +%s) && cp .openzeppelin/sepolia.json deployments/sepolia_$(date +%s) && cp deployment/v2/genesis.json deployments/sepolia_$(date +%s) && cp deployment/v2/create_rollup_output.json deployments/sepolia_$(date +%s)" } -} +} \ No newline at end of file diff --git a/test/contracts/bridge.test.js b/test/contracts/bridge.test.js index 6f3e8ce61..27574370c 100644 --- a/test/contracts/bridge.test.js +++ b/test/contracts/bridge.test.js @@ -451,8 +451,8 @@ describe('PolygonZkEVMBridge Contract', () => { ); // Add 2 leafs - merkleTreeRollup.add(leafValue); - merkleTreeRollup.add(leafValue); + merkleTreeRollup + (leafValue); + merkleTreeRollup + (leafValue); // check merkle root with SC const rootJSRollup = merkleTreeRollup.getRoot(); @@ -637,7 +637,7 @@ describe('PolygonZkEVMBridge Contract', () => { ); expect(leafValueMainnet).to.be.equal(leafValueMainnetSC); - merkleTreeMainnet.add(leafValueMainnet); + merkleTreeMainnet + (leafValueMainnet); const rootJSMainnet = merkleTreeMainnet.getRoot(); // Tokens are burnt diff --git a/test/contractsv2/PolygonRollupManager.test.js b/test/contractsv2/PolygonRollupManager.test.js new file mode 100644 index 000000000..5fadbb033 --- /dev/null +++ b/test/contractsv2/PolygonRollupManager.test.js @@ -0,0 +1,166 @@ +/* eslint-disable no-plusplus, no-await-in-loop */ +const { expect } = require('chai'); +const { ethers, upgrades } = require('hardhat'); + +describe('Polygon ZK-EVM TestnetV2', () => { + let deployer; + let trustedAggregator; + let trustedSequencer; + let admin; + + let verifierContract; + let polygonZkEVMBridgeContract; + let polygonZkEVMContract; + let polTokenContract; + let polygonZkEVMGlobalExitRoot; + let rollupManagerContract; + + const polTokenName = 'POL Token'; + const polTokenSymbol = 'POL'; + const polTokenInitialBalance = ethers.parseEther('20000000'); + + const networkIDMainnet = 0; + const urlSequencer = 'http://zkevm-json-rpc:8123'; + const chainID = 1000; + const networkName = 'zkevm'; + const version = '0.0.1'; + const forkID = 0; + + const pendingStateTimeoutDefault = 100; + const trustedAggregatorTimeout = 100; + + let firstDeployment = true; + + //roles + const DEFAULT_ADMIN_ROLE = ethers.HashZero; + const ADD_ROLLUP_TYPE_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("ADD_ROLLUP_TYPE_ROLE")]); + const OBSOLETE_ROLLUP_TYPE_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("OBSOLETE_ROLLUP_TYPE_ROLE")]); + const CREATE_ROLLUP_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("CREATE_ROLLUP_ROLE")]); + const ADD_EXISTING_ROLLUP_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("ADD_EXISTING_ROLLUP_ROLE")]); + const UPDATE_ROLLUP_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("UPDATE_ROLLUP_ROLE")]); + const TRUSTED_AGGREGATOR_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("TRUSTED_AGGREGATOR_ROLE")]); + const TWEAK_PARAMETERS_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("TWEAK_PARAMETERS_ROLE")]); + const SET_FEE_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("SET_FEE_ROLE")]); + const STOP_EMERGENCY_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("STOP_EMERGENCY_ROLE")]); + const EMERGENCY_COUNCIL_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("EMERGENCY_COUNCIL_ROLE")]); + const EMERGENCY_COUNCIL_ADMIN = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("EMERGENCY_COUNCIL_ADMIN")]); + + + beforeEach('Deploy contract', async () => { + upgrades.silenceWarnings(); + + // load signers + [deployer, trustedAggregator, trustedSequencer, admin, timelock, emergencyCouncil] = await ethers.getSigners(); + + + // deploy mock verifier + const VerifierRollupHelperFactory = await ethers.getContractFactory( + 'VerifierRollupHelperMock', + ); + verifierContract = await VerifierRollupHelperFactory.deploy(); + + // deploy pol + const polTokenFactory = await ethers.getContractFactory('ERC20PermitMock'); + polTokenContract = await polTokenFactory.deploy( + polTokenName, + polTokenSymbol, + deployer.address, + polTokenInitialBalance, + ); + await polTokenContract.deployed(); + + /* + * deploy global exit root manager + * In order to not have trouble with nonce deploy first proxy admin + */ + await upgrades.deployProxyAdmin(); + if ((await upgrades.admin.getInstance()).address !== '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0') { + firstDeployment = false; + } + const nonceProxyBridge = Number((await ethers.provider.getTransactionCount(deployer.address))) + (firstDeployment ? 3 : 2); + const nonceProxyZkevm = nonceProxyBridge + 2; // Always have to redeploy impl since the polygonZkEVMGlobalExitRoot address changes + + const precalculateBridgeAddress = ethers.getContractAddress({ from: deployer.address, nonce: nonceProxyBridge }); + const precalculateRollupManagerAddress = ethers.getContractAddress({ from: deployer.address, nonce: nonceProxyZkevm }); + firstDeployment = false; + + // deploy globalExitRoot + const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory('PolygonZkEVMGlobalExitRoot'); + polygonZkEVMGlobalExitRoot = await upgrades.deployProxy(PolygonZkEVMGlobalExitRootFactory, [], { + initializer: false, + constructorArgs: [precalculateRollupManagerAddress, precalculateBridgeAddress], + unsafeAllow: ['constructor', 'state-variable-immutable'], + }); + + // deploy PolygonZkEVMBridge + const polygonZkEVMBridgeFactory = await ethers.getContractFactory('PolygonZkEVMBridgeV2'); + polygonZkEVMBridgeContract = await upgrades.deployProxy(polygonZkEVMBridgeFactory, [], { initializer: false }); + + // deploy mock verifier + const PolygonRollupManagerFactory = await ethers.getContractFactory( + 'PolygonRollupManagerMock', + ); + + rollupManagerContract = await upgrades.deployProxy(PolygonRollupManagerFactory, [], { + initializer: false, + constructorArgs: [polygonZkEVMGlobalExitRoot.address, + polTokenContract.address, + polygonZkEVMBridgeContract.address], + unsafeAllow: ['constructor', 'state-variable-immutable'], + }); + + await rollupManagerContract.deployed(); + + // check precalculated address + expect(precalculateBridgeAddress).to.be.equal(polygonZkEVMBridgeContract.address); + expect(precalculateRollupManagerAddress).to.be.equal(rollupManagerContract.address); + + await polygonZkEVMBridgeContract.initialize(networkIDMainnet, polygonZkEVMGlobalExitRoot.address, rollupManagerContract.address); + + // Initialize Mock + await rollupManagerContract.initializeMock(trustedAggregator.address, + pendingStateTimeoutDefault, + trustedAggregatorTimeout, + admin.address, + timelock.address, + emergencyCouncil.address); + + + // fund sequencer address with Matic tokens + await polTokenContract.transfer(trustedSequencer.address, ethers.parseEther('1000')); + }); + + it('should check the initalized parameters', async () => { + expect(await rollupManagerContract.globalExitRootManager()).to.be.equal(polygonZkEVMGlobalExitRoot.address); + expect(await rollupManagerContract.pol()).to.be.equal(polTokenContract.address); + expect(await rollupManagerContract.bridgeAddress()).to.be.equal(polygonZkEVMBridgeContract.address); + + expect(await rollupManagerContract.pendingStateTimeout()).to.be.equal(pendingStateTimeoutDefault); + expect(await rollupManagerContract.trustedAggregator()).to.be.equal(trustedAggregator.address); + expect(await rollupManagerContract.trustedAggregatorTimeout()).to.be.equal(trustedAggregatorTimeout); + + expect(await rollupManagerContract.getBatchFee()).to.be.equal(ethers.parseEther('0.1')); + expect(await rollupManagerContract.getForcedBatchFee()).to.be.equal(ethers.parseEther('10')); + + // Check roles + + expect(await rollupManagerContract.hasRole(DEFAULT_ADMIN_ROLE, timelock.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(ADD_ROLLUP_TYPE_ROLE, timelock.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(UPDATE_ROLLUP_ROLE, timelock.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(OBSOLETE_ROLLUP_TYPE_ROLE, admin.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(CREATE_ROLLUP_ROLE, admin.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(TRUSTED_AGGREGATOR_ROLE, admin.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(TWEAK_PARAMETERS_ROLE, admin.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(SET_FEE_ROLE, admin.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(STOP_EMERGENCY_ROLE, admin.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(EMERGENCY_COUNCIL_ROLE, emergencyCouncil.address)).to.be.equal(true); + expect(await rollupManagerContract.hasRole(EMERGENCY_COUNCIL_ADMIN, emergencyCouncil.address)).to.be.equal(true); + }); + + it('should add a new rollup type', async () => { + + + }); +}); + + From d563d1df6e84c3489f3590ecd3cfa4a3435bf88e Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 16 Oct 2023 12:14:26 +0200 Subject: [PATCH 164/230] add compiled contracts and docs --- compiled-contracts/PolygonDataComittee.json | 1102 +++++++++++++++++ compiled-contracts/PolygonZkEVM.json | 33 +- compiled-contracts/PolygonZkEVMBridge.json | 55 +- .../PolygonZkEVMBridgeMock.json | 55 +- .../PolygonZkEVMGlobalExitRoot.json | 98 +- .../PolygonZkEVMGlobalExitRootMock.json | 98 +- compiled-contracts/PolygonZkEVMMock.json | 42 +- compiled-contracts/PolygonZkEVMV2.json | 1008 +++++++++++++++ .../PolygonZkEVMV2Existent.json | 1046 ++++++++++++++++ compiled-contracts/TokenWrapped.json | 4 +- docs/PolygonZkEVM.md | 4 +- docs/PolygonZkEVMGlobalExitRoot.md | 9 - docs/lib/DepositContract.md | 43 + docs/v2/PolygonRollupManager.md | 56 + docs/v2/PolygonZkEVMBridgeV2.md | 44 + package-lock.json | 32 +- test/contracts/bridge.test.js | 6 +- 17 files changed, 3379 insertions(+), 356 deletions(-) create mode 100644 compiled-contracts/PolygonDataComittee.json create mode 100644 compiled-contracts/PolygonZkEVMV2.json create mode 100644 compiled-contracts/PolygonZkEVMV2Existent.json 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/PolygonZkEVM.json b/compiled-contracts/PolygonZkEVM.json index a7172defd..bc61d9a1a 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", @@ -1354,6 +1354,11 @@ "name": "historicGlobalExitRoot", "type": "bytes32" }, + { + "internalType": "uint64", + "name": "timestamp", + "type": "uint64" + }, { "internalType": "uint64", "name": "minForcedTimestamp", @@ -1395,7 +1400,7 @@ "type": "uint64" } ], - "internalType": "struct PolygonZkEVM.BatchData[]", + "internalType": "struct PolygonZkEVM.ForcedBatchData[]", "name": "batches", "type": "tuple[]" } diff --git a/compiled-contracts/PolygonZkEVMBridge.json b/compiled-contracts/PolygonZkEVMBridge.json index 120851c09..0a1bcd5c1 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": [ { diff --git a/compiled-contracts/PolygonZkEVMBridgeMock.json b/compiled-contracts/PolygonZkEVMBridgeMock.json index d0a4eb8d1..a39dd33d9 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": [ { 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/PolygonZkEVMMock.json b/compiled-contracts/PolygonZkEVMMock.json index 57aa3a103..e64320ada 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[]" } 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/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/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 a4d987575..aafc2bdc8 100644 --- a/docs/v2/PolygonRollupManager.md +++ b/docs/v2/PolygonRollupManager.md @@ -618,6 +618,35 @@ Get forced batch fee +### 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( @@ -728,6 +757,33 @@ Get rollup sequence pending state struct given a batch number |`rollupID` | uint32 | Rollup identifier |`batchNum` | uint64 | Batch number +### getRollupBatchNumToStateRoot +```solidity + 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 + + + ## Events ### AddNewRollupType ```solidity diff --git a/docs/v2/PolygonZkEVMBridgeV2.md b/docs/v2/PolygonZkEVMBridgeV2.md index 45cd21c9e..448789fe8 100644 --- a/docs/v2/PolygonZkEVMBridgeV2.md +++ b/docs/v2/PolygonZkEVMBridgeV2.md @@ -140,6 +140,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 diff --git a/package-lock.json b/package-lock.json index 73063a650..8d7f98dd7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1920,19 +1920,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", @@ -3883,18 +3870,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", @@ -6942,7 +6917,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", @@ -21239,9 +21213,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", diff --git a/test/contracts/bridge.test.js b/test/contracts/bridge.test.js index 27574370c..6f3e8ce61 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 From d5f9bde54521215c9ee01b4fa9dd1448e771c4f5 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Thu, 26 Oct 2023 12:17:40 +0200 Subject: [PATCH 165/230] add comments --- contracts/verifiers/FflonkVerifier.sol | 1760 ++++++++++++++++++------ 1 file changed, 1337 insertions(+), 423 deletions(-) diff --git a/contracts/verifiers/FflonkVerifier.sol b/contracts/verifiers/FflonkVerifier.sol index adf4e8f0b..a23d92437 100644 --- a/contracts/verifiers/FflonkVerifier.sol +++ b/contracts/verifiers/FflonkVerifier.sol @@ -21,91 +21,117 @@ pragma solidity >=0.7.0 <0.9.0; contract FflonkVerifier { - uint32 constant n = 16777216; // Domain size + uint32 constant n = 16777216; // Domain size // Verification Key data - uint256 constant k1 = 2; // Plonk k1 multiplicative factor to force distinct cosets of H - uint256 constant k2 = 3; // Plonk k2 multiplicative factor to force distinct cosets of H + uint256 constant k1 = 2; // Plonk k1 multiplicative factor to force distinct cosets of H + uint256 constant k2 = 3; // Plonk k2 multiplicative factor to force distinct cosets of H // OMEGAS // Omega, Omega^{1/3} - uint256 constant w1 = 5709868443893258075976348696661355716898495876243883251619397131511003808859; - uint256 constant wr = 18200100796661656210024324131237448517259556535315737226009542456080026430510; + uint256 constant w1 = + 5709868443893258075976348696661355716898495876243883251619397131511003808859; + uint256 constant wr = + 18200100796661656210024324131237448517259556535315737226009542456080026430510; // Omega_3, Omega_3^2 - uint256 constant w3 = 21888242871839275217838484774961031246154997185409878258781734729429964517155; - uint256 constant w3_2 = 4407920970296243842393367215006156084916469457145843978461; + uint256 constant w3 = + 21888242871839275217838484774961031246154997185409878258781734729429964517155; + uint256 constant w3_2 = + 4407920970296243842393367215006156084916469457145843978461; // Omega_4, Omega_4^2, Omega_4^3 - uint256 constant w4 = 21888242871839275217838484774961031246007050428528088939761107053157389710902; - uint256 constant w4_2 = 21888242871839275222246405745257275088548364400416034343698204186575808495616; - uint256 constant w4_3 = 4407920970296243842541313971887945403937097133418418784715; + uint256 constant w4 = + 21888242871839275217838484774961031246007050428528088939761107053157389710902; + uint256 constant w4_2 = + 21888242871839275222246405745257275088548364400416034343698204186575808495616; + uint256 constant w4_3 = + 4407920970296243842541313971887945403937097133418418784715; // Omega_8, Omega_8^2, Omega_8^3, Omega_8^4, Omega_8^5, Omega_8^6, Omega_8^7 - uint256 constant w8_1 = 19540430494807482326159819597004422086093766032135589407132600596362845576832; - uint256 constant w8_2 = 21888242871839275217838484774961031246007050428528088939761107053157389710902; - uint256 constant w8_3 = 13274704216607947843011480449124596415239537050559949017414504948711435969894; - uint256 constant w8_4 = 21888242871839275222246405745257275088548364400416034343698204186575808495616; - uint256 constant w8_5 = 2347812377031792896086586148252853002454598368280444936565603590212962918785; - uint256 constant w8_6 = 4407920970296243842541313971887945403937097133418418784715; - uint256 constant w8_7 = 8613538655231327379234925296132678673308827349856085326283699237864372525723; + uint256 constant w8_1 = + 19540430494807482326159819597004422086093766032135589407132600596362845576832; + uint256 constant w8_2 = + 21888242871839275217838484774961031246007050428528088939761107053157389710902; + uint256 constant w8_3 = + 13274704216607947843011480449124596415239537050559949017414504948711435969894; + uint256 constant w8_4 = + 21888242871839275222246405745257275088548364400416034343698204186575808495616; + uint256 constant w8_5 = + 2347812377031792896086586148252853002454598368280444936565603590212962918785; + uint256 constant w8_6 = + 4407920970296243842541313971887945403937097133418418784715; + uint256 constant w8_7 = + 8613538655231327379234925296132678673308827349856085326283699237864372525723; // Verifier preprocessed input C_0(x)·[1]_1 - uint256 constant C0x = 1399458405278693375564157845951119219674216315698518301618391005223961674672; - uint256 constant C0y = 4753339552187781629812877887300152778714353139514388879046795575382068591682; + uint256 constant C0x = + 1399458405278693375564157845951119219674216315698518301618391005223961674672; + uint256 constant C0y = + 4753339552187781629812877887300152778714353139514388879046795575382068591682; // Verifier preprocessed input x·[1]_2 - uint256 constant X2x1 = 21831381940315734285607113342023901060522397560371972897001948545212302161822; - uint256 constant X2x2 = 17231025384763736816414546592865244497437017442647097510447326538965263639101; - uint256 constant X2y1 = 2388026358213174446665280700919698872609886601280537296205114254867301080648; - uint256 constant X2y2 = 11507326595632554467052522095592665270651932854513688777769618397986436103170; + uint256 constant X2x1 = + 21831381940315734285607113342023901060522397560371972897001948545212302161822; + uint256 constant X2x2 = + 17231025384763736816414546592865244497437017442647097510447326538965263639101; + uint256 constant X2y1 = + 2388026358213174446665280700919698872609886601280537296205114254867301080648; + uint256 constant X2y2 = + 11507326595632554467052522095592665270651932854513688777769618397986436103170; // Scalar field size - uint256 constant q = 21888242871839275222246405745257275088548364400416034343698204186575808495617; + uint256 constant q = + 21888242871839275222246405745257275088548364400416034343698204186575808495617; // Base field size - uint256 constant qf = 21888242871839275222246405745257275088696311157297823662689037894645226208583; + uint256 constant qf = + 21888242871839275222246405745257275088696311157297823662689037894645226208583; // [1]_1 - uint256 constant G1x = 1; - uint256 constant G1y = 2; + uint256 constant G1x = 1; + uint256 constant G1y = 2; // [1]_2 - uint256 constant G2x1 = 10857046999023057135944570762232829481370756359578518086990519993285655852781; - uint256 constant G2x2 = 11559732032986387107991004021392285783925812861821192530917403151452391805634; - uint256 constant G2y1 = 8495653923123431417604973247489272438418190587263600148770280649306958101930; - uint256 constant G2y2 = 4082367875863433681332203403145435568316851327593401208105741076214120093531; + uint256 constant G2x1 = + 10857046999023057135944570762232829481370756359578518086990519993285655852781; + uint256 constant G2x2 = + 11559732032986387107991004021392285783925812861821192530917403151452391805634; + uint256 constant G2y1 = + 8495653923123431417604973247489272438418190587263600148770280649306958101930; + uint256 constant G2y2 = + 4082367875863433681332203403145435568316851327593401208105741076214120093531; // Proof calldata // Byte offset of every parameter of the calldata // Polynomial commitments - uint16 constant pC1 = 4 + 0; // [C1]_1 - uint16 constant pC2 = 4 + 32*2; // [C2]_1 - uint16 constant pW1 = 4 + 32*4; // [W]_1 - uint16 constant pW2 = 4 + 32*6; // [W']_1 + uint16 constant pC1 = 4 + 0; // [C1]_1 + uint16 constant pC2 = 4 + 32 * 2; // [C2]_1 + uint16 constant pW1 = 4 + 32 * 4; // [W]_1 + uint16 constant pW2 = 4 + 32 * 6; // [W']_1 // Opening evaluations - uint16 constant pEval_ql = 4 + 32*8; // q_L(xi) - uint16 constant pEval_qr = 4 + 32*9; // q_R(xi) - uint16 constant pEval_qm = 4 + 32*10; // q_M(xi) - uint16 constant pEval_qo = 4 + 32*11; // q_O(xi) - uint16 constant pEval_qc = 4 + 32*12; // q_C(xi) - uint16 constant pEval_s1 = 4 + 32*13; // S_{sigma_1}(xi) - uint16 constant pEval_s2 = 4 + 32*14; // S_{sigma_2}(xi) - uint16 constant pEval_s3 = 4 + 32*15; // S_{sigma_3}(xi) - uint16 constant pEval_a = 4 + 32*16; // a(xi) - uint16 constant pEval_b = 4 + 32*17; // b(xi) - uint16 constant pEval_c = 4 + 32*18; // c(xi) - uint16 constant pEval_z = 4 + 32*19; // z(xi) - uint16 constant pEval_zw = 4 + 32*20; // z_omega(xi) - uint16 constant pEval_t1w = 4 + 32*21; // T_1(xi omega) - uint16 constant pEval_t2w = 4 + 32*22; // T_2(xi omega) - uint16 constant pEval_inv = 4 + 32*23; // inv(batch) sent by the prover to avoid any inverse calculation to save gas, - // we check the correctness of the inv(batch) by computing batch - // and checking inv(batch) * batch == 1 + uint16 constant pEval_ql = 4 + 32 * 8; // q_L(xi) + uint16 constant pEval_qr = 4 + 32 * 9; // q_R(xi) + uint16 constant pEval_qm = 4 + 32 * 10; // q_M(xi) + uint16 constant pEval_qo = 4 + 32 * 11; // q_O(xi) + uint16 constant pEval_qc = 4 + 32 * 12; // q_C(xi) + uint16 constant pEval_s1 = 4 + 32 * 13; // S_{sigma_1}(xi) + uint16 constant pEval_s2 = 4 + 32 * 14; // S_{sigma_2}(xi) + uint16 constant pEval_s3 = 4 + 32 * 15; // S_{sigma_3}(xi) + uint16 constant pEval_a = 4 + 32 * 16; // a(xi) + uint16 constant pEval_b = 4 + 32 * 17; // b(xi) + uint16 constant pEval_c = 4 + 32 * 18; // c(xi) + uint16 constant pEval_z = 4 + 32 * 19; // z(xi) + uint16 constant pEval_zw = 4 + 32 * 20; // z_omega(xi) + uint16 constant pEval_t1w = 4 + 32 * 21; // T_1(xi omega) + uint16 constant pEval_t2w = 4 + 32 * 22; // T_2(xi omega) + uint16 constant pEval_inv = 4 + 32 * 23; // inv(batch) sent by the prover to avoid any inverse calculation to save gas, + // we check the correctness of the inv(batch) by computing batch + // and checking inv(batch) * batch == 1 // Memory data // Challenges - uint16 constant pAlpha = 0; // alpha challenge - uint16 constant pBeta = 32; // beta challenge - uint16 constant pGamma = 64; // gamma challenge - uint16 constant pY = 96; // y challenge - uint16 constant pXiSeed = 128; // xi seed, from this value we compute xi = xiSeed^24 + uint16 constant pAlpha = 0; // alpha challenge + uint16 constant pBeta = 32; // beta challenge + uint16 constant pGamma = 64; // gamma challenge + uint16 constant pY = 96; // y challenge + uint16 constant pXiSeed = 128; // xi seed, from this value we compute xi = xiSeed^24 uint16 constant pXiSeed2 = 160; // (xi seed)^2 - uint16 constant pXi = 192; // xi challenge + uint16 constant pXi = 192; // xi challenge // Roots // S_0 = roots_8(xi) = { h_0, h_0w_8, h_0w_8^2, h_0w_8^3, h_0w_8^4, h_0w_8^5, h_0w_8^6, h_0w_8^7 } @@ -134,40 +160,40 @@ contract FflonkVerifier { uint16 constant pH3w3_1 = 736; uint16 constant pH3w3_2 = 768; - uint16 constant pPi = 800; // PI(xi) - uint16 constant pR0 = 832; // r0(y) - uint16 constant pR1 = 864; // r1(y) - uint16 constant pR2 = 896; // r2(y) + uint16 constant pPi = 800; // PI(xi) + uint16 constant pR0 = 832; // r0(y) + uint16 constant pR1 = 864; // r1(y) + uint16 constant pR2 = 896; // r2(y) - uint16 constant pF = 928; // [F]_1, 64 bytes - uint16 constant pE = 992; // [E]_1, 64 bytes - uint16 constant pJ = 1056; // [J]_1, 64 bytes + uint16 constant pF = 928; // [F]_1, 64 bytes + uint16 constant pE = 992; // [E]_1, 64 bytes + uint16 constant pJ = 1056; // [J]_1, 64 bytes - uint16 constant pZh = 1184; // Z_H(xi) + uint16 constant pZh = 1184; // Z_H(xi) // From this point we write all the variables that must be computed using the Montgomery batch inversion - uint16 constant pZhInv = 1216; // 1/Z_H(xi) - uint16 constant pDenH1 = 1248; // 1/( (y-h_1w_4) (y-h_1w_4^2) (y-h_1w_4^3) (y-h_1w_4^4) ) - uint16 constant pDenH2 = 1280; // 1/( (y-h_2w_3) (y-h_2w_3^2) (y-h_2w_3^3) (y-h_3w_3) (y-h_3w_3^2) (y-h_3w_3^3) ) + uint16 constant pZhInv = 1216; // 1/Z_H(xi) + uint16 constant pDenH1 = 1248; // 1/( (y-h_1w_4) (y-h_1w_4^2) (y-h_1w_4^3) (y-h_1w_4^4) ) + uint16 constant pDenH2 = 1280; // 1/( (y-h_2w_3) (y-h_2w_3^2) (y-h_2w_3^3) (y-h_3w_3) (y-h_3w_3^2) (y-h_3w_3^3) ) uint16 constant pLiS0Inv = 1312; // Reserve 8 * 32 bytes to compute r_0(X) uint16 constant pLiS1Inv = 1568; // Reserve 4 * 32 bytes to compute r_1(X) uint16 constant pLiS2Inv = 1696; // Reserve 6 * 32 bytes to compute r_2(X) // Lagrange evaluations - + uint16 constant pEval_l1 = 1888; - - + uint16 constant lastMem = 1920; - - function verifyProof(bytes32[24] calldata proof, uint256[1] calldata pubSignals) public view returns (bool) { + function verifyProof( + bytes32[24] calldata proof, + uint256[1] calldata pubSignals + ) public view returns (bool) { assembly { // Computes the inverse of an array of values // See https://vitalik.ca/general/2018/07/21/starks_part_3.html in section where explain fields operations // To save the inverse to be computed on chain the prover sends the inverse as an evaluation in commits.eval_inv function inverseArray(pMem) { - - let pAux := mload(0x40) // Point to the next free position - let acc := mload(add(pMem,pZhInv)) // Read the first element + let pAux := mload(0x40) // Point to the next free position + let acc := mload(add(pMem, pZhInv)) // Read the first element mstore(pAux, acc) pAux := add(pAux, 32) @@ -254,13 +280,12 @@ contract FflonkVerifier { acc := mulmod(acc, mload(add(pMem, pEval_l1)), q) mstore(pAux, acc) - let inv := calldataload(pEval_inv) // Before using the inverse sent by the prover the verifier checks inv(batch) * batch === 1 if iszero(eq(1, mulmod(acc, inv, q))) { mstore(0, 0) - return(0,0x20) + return(0, 0x20) } acc := inv @@ -373,8 +398,8 @@ contract FflonkVerifier { mstore(0, 0) return(0, 0x20) } - } - + } + // Validate all the evaluations sent by the prover ∈ F function checkInput() { // Check proof commitments fullfill bn128 curve equation Y^2 = X^3 + 3 @@ -405,18 +430,22 @@ contract FflonkVerifier { function computeChallenges(pMem, pPublic) { // Compute challenge.beta & challenge.gamma - mstore(add(pMem, 1920 ), C0x) - mstore(add(pMem, 1952 ), C0y) + mstore(add(pMem, 1920), C0x) + mstore(add(pMem, 1952), C0y) mstore(add(pMem, 1984), calldataload(pPublic)) - - - mstore(add(pMem, 2016 ), calldataload(pC1)) - mstore(add(pMem, 2048 ), calldataload(add(pC1, 32))) + mstore(add(pMem, 2016), calldataload(pC1)) + mstore(add(pMem, 2048), calldataload(add(pC1, 32))) - mstore(add(pMem, pBeta), mod(keccak256(add(pMem, lastMem), 160), q)) - mstore(add(pMem, pGamma), mod(keccak256(add(pMem, pBeta), 32), q)) + mstore( + add(pMem, pBeta), + mod(keccak256(add(pMem, lastMem), 160), q) + ) + mstore( + add(pMem, pGamma), + mod(keccak256(add(pMem, pBeta), 32), q) + ) // Get xiSeed & xiSeed2 mstore(add(pMem, lastMem), mload(add(pMem, pGamma))) @@ -428,99 +457,175 @@ contract FflonkVerifier { mstore(add(pMem, pXiSeed2), mulmod(xiSeed, xiSeed, q)) // Compute roots.S0.h0w8 - mstore(add(pMem, pH0w8_0), mulmod(mload(add(pMem, pXiSeed2)), mload(add(pMem, pXiSeed)), q)) - mstore(add(pMem, pH0w8_1), mulmod(mload(add(pMem, pH0w8_0)), w8_1, q)) - mstore(add(pMem, pH0w8_2), mulmod(mload(add(pMem, pH0w8_0)), w8_2, q)) - mstore(add(pMem, pH0w8_3), mulmod(mload(add(pMem, pH0w8_0)), w8_3, q)) - mstore(add(pMem, pH0w8_4), mulmod(mload(add(pMem, pH0w8_0)), w8_4, q)) - mstore(add(pMem, pH0w8_5), mulmod(mload(add(pMem, pH0w8_0)), w8_5, q)) - mstore(add(pMem, pH0w8_6), mulmod(mload(add(pMem, pH0w8_0)), w8_6, q)) - mstore(add(pMem, pH0w8_7), mulmod(mload(add(pMem, pH0w8_0)), w8_7, q)) + mstore( + add(pMem, pH0w8_0), + mulmod( + mload(add(pMem, pXiSeed2)), + mload(add(pMem, pXiSeed)), + q + ) + ) + mstore( + add(pMem, pH0w8_1), + mulmod(mload(add(pMem, pH0w8_0)), w8_1, q) + ) + mstore( + add(pMem, pH0w8_2), + mulmod(mload(add(pMem, pH0w8_0)), w8_2, q) + ) + mstore( + add(pMem, pH0w8_3), + mulmod(mload(add(pMem, pH0w8_0)), w8_3, q) + ) + mstore( + add(pMem, pH0w8_4), + mulmod(mload(add(pMem, pH0w8_0)), w8_4, q) + ) + mstore( + add(pMem, pH0w8_5), + mulmod(mload(add(pMem, pH0w8_0)), w8_5, q) + ) + mstore( + add(pMem, pH0w8_6), + mulmod(mload(add(pMem, pH0w8_0)), w8_6, q) + ) + mstore( + add(pMem, pH0w8_7), + mulmod(mload(add(pMem, pH0w8_0)), w8_7, q) + ) // Compute roots.S1.h1w4 - mstore(add(pMem, pH1w4_0), mulmod(mload(add(pMem, pH0w8_0)), mload(add(pMem, pH0w8_0)), q)) - mstore(add(pMem, pH1w4_1), mulmod(mload(add(pMem, pH1w4_0)), w4, q)) - mstore(add(pMem, pH1w4_2), mulmod(mload(add(pMem, pH1w4_0)), w4_2, q)) - mstore(add(pMem, pH1w4_3), mulmod(mload(add(pMem, pH1w4_0)), w4_3, q)) + mstore( + add(pMem, pH1w4_0), + mulmod( + mload(add(pMem, pH0w8_0)), + mload(add(pMem, pH0w8_0)), + q + ) + ) + mstore( + add(pMem, pH1w4_1), + mulmod(mload(add(pMem, pH1w4_0)), w4, q) + ) + mstore( + add(pMem, pH1w4_2), + mulmod(mload(add(pMem, pH1w4_0)), w4_2, q) + ) + mstore( + add(pMem, pH1w4_3), + mulmod(mload(add(pMem, pH1w4_0)), w4_3, q) + ) // Compute roots.S2.h2w3 - mstore(add(pMem, pH2w3_0), mulmod(mload(add(pMem, pH1w4_0)), mload(add(pMem, pXiSeed2)), q)) - mstore(add(pMem, pH2w3_1), mulmod(mload(add(pMem, pH2w3_0)), w3, q)) - mstore(add(pMem, pH2w3_2), mulmod(mload(add(pMem, pH2w3_0)), w3_2, q)) + mstore( + add(pMem, pH2w3_0), + mulmod( + mload(add(pMem, pH1w4_0)), + mload(add(pMem, pXiSeed2)), + q + ) + ) + mstore( + add(pMem, pH2w3_1), + mulmod(mload(add(pMem, pH2w3_0)), w3, q) + ) + mstore( + add(pMem, pH2w3_2), + mulmod(mload(add(pMem, pH2w3_0)), w3_2, q) + ) // Compute roots.S2.h2w3 - mstore(add(pMem, pH3w3_0), mulmod(mload(add(pMem, pH2w3_0)), wr, q)) - mstore(add(pMem, pH3w3_1), mulmod(mload(add(pMem, pH3w3_0)), w3, q)) - mstore(add(pMem, pH3w3_2), mulmod(mload(add(pMem, pH3w3_0)), w3_2, q)) - - let xin := mulmod(mulmod(mload(add(pMem, pH2w3_0)), mload(add(pMem, pH2w3_0)), q), mload(add(pMem, pH2w3_0)), q) + mstore( + add(pMem, pH3w3_0), + mulmod(mload(add(pMem, pH2w3_0)), wr, q) + ) + mstore( + add(pMem, pH3w3_1), + mulmod(mload(add(pMem, pH3w3_0)), w3, q) + ) + mstore( + add(pMem, pH3w3_2), + mulmod(mload(add(pMem, pH3w3_0)), w3_2, q) + ) + + let xin := mulmod( + mulmod( + mload(add(pMem, pH2w3_0)), + mload(add(pMem, pH2w3_0)), + q + ), + mload(add(pMem, pH2w3_0)), + q + ) mstore(add(pMem, pXi), xin) // Compute xi^n - - xin:= mulmod(xin, xin, q) - - xin:= mulmod(xin, xin, q) - - xin:= mulmod(xin, xin, q) - - xin:= mulmod(xin, xin, q) - - xin:= mulmod(xin, xin, q) - - xin:= mulmod(xin, xin, q) - - xin:= mulmod(xin, xin, q) - - xin:= mulmod(xin, xin, q) - - xin:= mulmod(xin, xin, q) - - xin:= mulmod(xin, xin, q) - - xin:= mulmod(xin, xin, q) - - xin:= mulmod(xin, xin, q) - - xin:= mulmod(xin, xin, q) - - xin:= mulmod(xin, xin, q) - - xin:= mulmod(xin, xin, q) - - xin:= mulmod(xin, xin, q) - - xin:= mulmod(xin, xin, q) - - xin:= mulmod(xin, xin, q) - - xin:= mulmod(xin, xin, q) - - xin:= mulmod(xin, xin, q) - - xin:= mulmod(xin, xin, q) - - xin:= mulmod(xin, xin, q) - - xin:= mulmod(xin, xin, q) - - xin:= mulmod(xin, xin, q) - - - xin:= mod(add(sub(xin, 1), q), q) + + xin := mulmod(xin, xin, q) + + xin := mulmod(xin, xin, q) + + xin := mulmod(xin, xin, q) + + xin := mulmod(xin, xin, q) + + xin := mulmod(xin, xin, q) + + xin := mulmod(xin, xin, q) + + xin := mulmod(xin, xin, q) + + xin := mulmod(xin, xin, q) + + xin := mulmod(xin, xin, q) + + xin := mulmod(xin, xin, q) + + xin := mulmod(xin, xin, q) + + xin := mulmod(xin, xin, q) + + xin := mulmod(xin, xin, q) + + xin := mulmod(xin, xin, q) + + xin := mulmod(xin, xin, q) + + xin := mulmod(xin, xin, q) + + xin := mulmod(xin, xin, q) + + xin := mulmod(xin, xin, q) + + xin := mulmod(xin, xin, q) + + xin := mulmod(xin, xin, q) + + xin := mulmod(xin, xin, q) + + xin := mulmod(xin, xin, q) + + xin := mulmod(xin, xin, q) + + xin := mulmod(xin, xin, q) + + xin := mod(add(sub(xin, 1), q), q) mstore(add(pMem, pZh), xin) - mstore(add(pMem, pZhInv), xin) // We will invert later together with lagrange pols + mstore(add(pMem, pZhInv), xin) // We will invert later together with lagrange pols // Compute challenge.alpha mstore(add(pMem, lastMem), xiSeed) calldatacopy(add(pMem, 1952), pEval_ql, 480) - mstore(add(pMem, pAlpha), mod(keccak256(add(pMem, lastMem), 512), q)) + mstore( + add(pMem, pAlpha), + mod(keccak256(add(pMem, lastMem), 512), q) + ) // Compute challenge.y mstore(add(pMem, lastMem), mload(add(pMem, pAlpha))) - mstore(add(pMem, 1952 ), calldataload(pW1)) - mstore(add(pMem, 1984 ), calldataload(add(pW1, 32))) + mstore(add(pMem, 1952), calldataload(pW1)) + mstore(add(pMem, 1984), calldataload(add(pW1, 32))) mstore(add(pMem, pY), mod(keccak256(add(pMem, lastMem), 96), q)) } @@ -534,49 +639,120 @@ contract FflonkVerifier { den1 := mulmod(den1, root0, q) den1 := mulmod(den1, root0, q) den1 := mulmod(den1, root0, q) - - den1 := mulmod(8, den1, q) - - let den2 := mload(add(pMem, add(pH0w8_0, mul(mod(mul(7, 0), 8), 32)))) - let den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(0, 32))))), q), q) - - mstore(add(pMem, add(pLiS0Inv, 0)), mulmod(den1, mulmod(den2, den3, q), q)) - - den2 := mload(add(pMem, add(pH0w8_0, mul(mod(mul(7, 1), 8), 32)))) - den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(1, 32))))), q), q) - - mstore(add(pMem, add(pLiS0Inv, 32)), mulmod(den1, mulmod(den2, den3, q), q)) - - den2 := mload(add(pMem, add(pH0w8_0, mul(mod(mul(7, 2), 8), 32)))) - den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(2, 32))))), q), q) - - mstore(add(pMem, add(pLiS0Inv, 64)), mulmod(den1, mulmod(den2, den3, q), q)) - - den2 := mload(add(pMem, add(pH0w8_0, mul(mod(mul(7, 3), 8), 32)))) - den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(3, 32))))), q), q) - - mstore(add(pMem, add(pLiS0Inv, 96)), mulmod(den1, mulmod(den2, den3, q), q)) - - den2 := mload(add(pMem, add(pH0w8_0, mul(mod(mul(7, 4), 8), 32)))) - den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(4, 32))))), q), q) - - mstore(add(pMem, add(pLiS0Inv, 128)), mulmod(den1, mulmod(den2, den3, q), q)) - - den2 := mload(add(pMem, add(pH0w8_0, mul(mod(mul(7, 5), 8), 32)))) - den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(5, 32))))), q), q) - - mstore(add(pMem, add(pLiS0Inv, 160)), mulmod(den1, mulmod(den2, den3, q), q)) - den2 := mload(add(pMem, add(pH0w8_0, mul(mod(mul(7, 6), 8), 32)))) - den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(6, 32))))), q), q) - - mstore(add(pMem, add(pLiS0Inv, 192)), mulmod(den1, mulmod(den2, den3, q), q)) - - den2 := mload(add(pMem, add(pH0w8_0, mul(mod(mul(7, 7), 8), 32)))) - den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(7, 32))))), q), q) + den1 := mulmod(8, den1, q) - mstore(add(pMem, add(pLiS0Inv, 224)), mulmod(den1, mulmod(den2, den3, q), q)) - + let den2 := mload( + add(pMem, add(pH0w8_0, mul(mod(mul(7, 0), 8), 32))) + ) + let den3 := addmod( + y, + mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(0, 32))))), q), + q + ) + + mstore( + add(pMem, add(pLiS0Inv, 0)), + mulmod(den1, mulmod(den2, den3, q), q) + ) + + den2 := mload( + add(pMem, add(pH0w8_0, mul(mod(mul(7, 1), 8), 32))) + ) + den3 := addmod( + y, + mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(1, 32))))), q), + q + ) + + mstore( + add(pMem, add(pLiS0Inv, 32)), + mulmod(den1, mulmod(den2, den3, q), q) + ) + + den2 := mload( + add(pMem, add(pH0w8_0, mul(mod(mul(7, 2), 8), 32))) + ) + den3 := addmod( + y, + mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(2, 32))))), q), + q + ) + + mstore( + add(pMem, add(pLiS0Inv, 64)), + mulmod(den1, mulmod(den2, den3, q), q) + ) + + den2 := mload( + add(pMem, add(pH0w8_0, mul(mod(mul(7, 3), 8), 32))) + ) + den3 := addmod( + y, + mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(3, 32))))), q), + q + ) + + mstore( + add(pMem, add(pLiS0Inv, 96)), + mulmod(den1, mulmod(den2, den3, q), q) + ) + + den2 := mload( + add(pMem, add(pH0w8_0, mul(mod(mul(7, 4), 8), 32))) + ) + den3 := addmod( + y, + mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(4, 32))))), q), + q + ) + + mstore( + add(pMem, add(pLiS0Inv, 128)), + mulmod(den1, mulmod(den2, den3, q), q) + ) + + den2 := mload( + add(pMem, add(pH0w8_0, mul(mod(mul(7, 5), 8), 32))) + ) + den3 := addmod( + y, + mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(5, 32))))), q), + q + ) + + mstore( + add(pMem, add(pLiS0Inv, 160)), + mulmod(den1, mulmod(den2, den3, q), q) + ) + + den2 := mload( + add(pMem, add(pH0w8_0, mul(mod(mul(7, 6), 8), 32))) + ) + den3 := addmod( + y, + mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(6, 32))))), q), + q + ) + + mstore( + add(pMem, add(pLiS0Inv, 192)), + mulmod(den1, mulmod(den2, den3, q), q) + ) + + den2 := mload( + add(pMem, add(pH0w8_0, mul(mod(mul(7, 7), 8), 32))) + ) + den3 := addmod( + y, + mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(7, 32))))), q), + q + ) + + mstore( + add(pMem, add(pLiS0Inv, 224)), + mulmod(den1, mulmod(den2, den3, q), q) + ) } function computeLiS1(pMem) { @@ -585,67 +761,172 @@ contract FflonkVerifier { let den1 := 1 den1 := mulmod(den1, root0, q) den1 := mulmod(den1, root0, q) - - den1 := mulmod(4, den1, q) - - let den2 := mload(add(pMem, add(pH1w4_0, mul(mod(mul(3, 0), 4), 32)))) - let den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(0, 32))))), q), q) - - mstore(add(pMem, add(pLiS1Inv, 0)), mulmod(den1, mulmod(den2, den3, q), q)) - den2 := mload(add(pMem, add(pH1w4_0, mul(mod(mul(3, 1), 4), 32)))) - den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(1, 32))))), q), q) - - mstore(add(pMem, add(pLiS1Inv, 32)), mulmod(den1, mulmod(den2, den3, q), q)) - - den2 := mload(add(pMem, add(pH1w4_0, mul(mod(mul(3, 2), 4), 32)))) - den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(2, 32))))), q), q) - - mstore(add(pMem, add(pLiS1Inv, 64)), mulmod(den1, mulmod(den2, den3, q), q)) - - den2 := mload(add(pMem, add(pH1w4_0, mul(mod(mul(3, 3), 4), 32)))) - den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(3, 32))))), q), q) + den1 := mulmod(4, den1, q) - mstore(add(pMem, add(pLiS1Inv, 96)), mulmod(den1, mulmod(den2, den3, q), q)) + let den2 := mload( + add(pMem, add(pH1w4_0, mul(mod(mul(3, 0), 4), 32))) + ) + let den3 := addmod( + y, + mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(0, 32))))), q), + q + ) + + mstore( + add(pMem, add(pLiS1Inv, 0)), + mulmod(den1, mulmod(den2, den3, q), q) + ) + + den2 := mload( + add(pMem, add(pH1w4_0, mul(mod(mul(3, 1), 4), 32))) + ) + den3 := addmod( + y, + mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(1, 32))))), q), + q + ) + + mstore( + add(pMem, add(pLiS1Inv, 32)), + mulmod(den1, mulmod(den2, den3, q), q) + ) + + den2 := mload( + add(pMem, add(pH1w4_0, mul(mod(mul(3, 2), 4), 32))) + ) + den3 := addmod( + y, + mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(2, 32))))), q), + q + ) + + mstore( + add(pMem, add(pLiS1Inv, 64)), + mulmod(den1, mulmod(den2, den3, q), q) + ) + + den2 := mload( + add(pMem, add(pH1w4_0, mul(mod(mul(3, 3), 4), 32))) + ) + den3 := addmod( + y, + mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(3, 32))))), q), + q + ) + + mstore( + add(pMem, add(pLiS1Inv, 96)), + mulmod(den1, mulmod(den2, den3, q), q) + ) } function computeLiS2(pMem) { - let y := mload(add(pMem, pY)) - let den1 := mulmod(mulmod(3,mload(add(pMem, pH2w3_0)),q), addmod(mload(add(pMem, pXi)) ,mod(sub(q, mulmod(mload(add(pMem, pXi)), w1 ,q)), q), q), q) - - let den2 := mload(add(pMem, add(pH2w3_0, mul(mod(mul(2, 0), 3), 32)))) - let den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH2w3_0, mul(0, 32))))), q), q) - - mstore(add(pMem, add(pLiS2Inv, 0)), mulmod(den1, mulmod(den2, den3, q), q)) - - den2 := mload(add(pMem, add(pH2w3_0, mul(mod(mul(2, 1), 3), 32)))) - den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH2w3_0, mul(1, 32))))), q), q) - - mstore(add(pMem, add(pLiS2Inv, 32)), mulmod(den1, mulmod(den2, den3, q), q)) - - den2 := mload(add(pMem, add(pH2w3_0, mul(mod(mul(2, 2), 3), 32)))) - den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH2w3_0, mul(2, 32))))), q), q) - - mstore(add(pMem, add(pLiS2Inv, 64)), mulmod(den1, mulmod(den2, den3, q), q)) - - den1 := mulmod(mulmod(3,mload(add(pMem, pH3w3_0)),q), addmod(mulmod(mload(add(pMem, pXi)), w1 ,q),mod(sub(q, mload(add(pMem, pXi))), q), q), q) - - den2 := mload(add(pMem, add(pH3w3_0, mul(mod(mul(2, 0), 3), 32)))) - den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH3w3_0, mul(0, 32))))), q), q) - - mstore(add(pMem, add(pLiS2Inv, 96)), mulmod(den1, mulmod(den2, den3, q), q)) - - den2 := mload(add(pMem, add(pH3w3_0, mul(mod(mul(2, 1), 3), 32)))) - den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH3w3_0, mul(1, 32))))), q), q) - - mstore(add(pMem, add(pLiS2Inv, 128)), mulmod(den1, mulmod(den2, den3, q), q)) - - den2 := mload(add(pMem, add(pH3w3_0, mul(mod(mul(2, 2), 3), 32)))) - den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH3w3_0, mul(2, 32))))), q), q) - - mstore(add(pMem, add(pLiS2Inv, 160)), mulmod(den1, mulmod(den2, den3, q), q)) + let den1 := mulmod( + mulmod(3, mload(add(pMem, pH2w3_0)), q), + addmod( + mload(add(pMem, pXi)), + mod(sub(q, mulmod(mload(add(pMem, pXi)), w1, q)), q), + q + ), + q + ) + + let den2 := mload( + add(pMem, add(pH2w3_0, mul(mod(mul(2, 0), 3), 32))) + ) + let den3 := addmod( + y, + mod(sub(q, mload(add(pMem, add(pH2w3_0, mul(0, 32))))), q), + q + ) + + mstore( + add(pMem, add(pLiS2Inv, 0)), + mulmod(den1, mulmod(den2, den3, q), q) + ) + + den2 := mload( + add(pMem, add(pH2w3_0, mul(mod(mul(2, 1), 3), 32))) + ) + den3 := addmod( + y, + mod(sub(q, mload(add(pMem, add(pH2w3_0, mul(1, 32))))), q), + q + ) + + mstore( + add(pMem, add(pLiS2Inv, 32)), + mulmod(den1, mulmod(den2, den3, q), q) + ) + + den2 := mload( + add(pMem, add(pH2w3_0, mul(mod(mul(2, 2), 3), 32))) + ) + den3 := addmod( + y, + mod(sub(q, mload(add(pMem, add(pH2w3_0, mul(2, 32))))), q), + q + ) + + mstore( + add(pMem, add(pLiS2Inv, 64)), + mulmod(den1, mulmod(den2, den3, q), q) + ) + + den1 := mulmod( + mulmod(3, mload(add(pMem, pH3w3_0)), q), + addmod( + mulmod(mload(add(pMem, pXi)), w1, q), + mod(sub(q, mload(add(pMem, pXi))), q), + q + ), + q + ) + + den2 := mload( + add(pMem, add(pH3w3_0, mul(mod(mul(2, 0), 3), 32))) + ) + den3 := addmod( + y, + mod(sub(q, mload(add(pMem, add(pH3w3_0, mul(0, 32))))), q), + q + ) + + mstore( + add(pMem, add(pLiS2Inv, 96)), + mulmod(den1, mulmod(den2, den3, q), q) + ) + + den2 := mload( + add(pMem, add(pH3w3_0, mul(mod(mul(2, 1), 3), 32))) + ) + den3 := addmod( + y, + mod(sub(q, mload(add(pMem, add(pH3w3_0, mul(1, 32))))), q), + q + ) + + mstore( + add(pMem, add(pLiS2Inv, 128)), + mulmod(den1, mulmod(den2, den3, q), q) + ) + + den2 := mload( + add(pMem, add(pH3w3_0, mul(mod(mul(2, 2), 3), 32))) + ) + den3 := addmod( + y, + mod(sub(q, mload(add(pMem, add(pH3w3_0, mul(2, 32))))), q), + q + ) + + mstore( + add(pMem, add(pLiS2Inv, 160)), + mulmod(den1, mulmod(den2, den3, q), q) + ) } // Prepare all the denominators that must be inverted, placed them in consecutive memory addresses @@ -657,23 +938,55 @@ contract FflonkVerifier { // used in steps 10 and 11 of the verifier let y := mload(add(pMem, pY)) let w := addmod(y, mod(sub(q, mload(add(pMem, pH1w4_0))), q), q) - w := mulmod(w, addmod(y, mod(sub(q, mload(add(pMem, pH1w4_1))), q), q), q) - w := mulmod(w, addmod(y, mod(sub(q, mload(add(pMem, pH1w4_2))), q), q), q) - w := mulmod(w, addmod(y, mod(sub(q, mload(add(pMem, pH1w4_3))), q), q), q) + w := mulmod( + w, + addmod(y, mod(sub(q, mload(add(pMem, pH1w4_1))), q), q), + q + ) + w := mulmod( + w, + addmod(y, mod(sub(q, mload(add(pMem, pH1w4_2))), q), q), + q + ) + w := mulmod( + w, + addmod(y, mod(sub(q, mload(add(pMem, pH1w4_3))), q), q), + q + ) mstore(add(pMem, pDenH1), w) // 1/((y - h2) (y - h2w3) (y - h2w3_2) (y - h3) (y - h3w3) (y - h3w3_2)) w := addmod(y, mod(sub(q, mload(add(pMem, pH2w3_0))), q), q) - w := mulmod(w, addmod(y, mod(sub(q, mload(add(pMem, pH2w3_1))), q), q), q) - w := mulmod(w, addmod(y, mod(sub(q, mload(add(pMem, pH2w3_2))), q), q), q) - w := mulmod(w, addmod(y, mod(sub(q, mload(add(pMem, pH3w3_0))), q), q), q) - w := mulmod(w, addmod(y, mod(sub(q, mload(add(pMem, pH3w3_1))), q), q), q) - w := mulmod(w, addmod(y, mod(sub(q, mload(add(pMem, pH3w3_2))), q), q), q) + w := mulmod( + w, + addmod(y, mod(sub(q, mload(add(pMem, pH2w3_1))), q), q), + q + ) + w := mulmod( + w, + addmod(y, mod(sub(q, mload(add(pMem, pH2w3_2))), q), q), + q + ) + w := mulmod( + w, + addmod(y, mod(sub(q, mload(add(pMem, pH3w3_0))), q), q), + q + ) + w := mulmod( + w, + addmod(y, mod(sub(q, mload(add(pMem, pH3w3_1))), q), q), + q + ) + w := mulmod( + w, + addmod(y, mod(sub(q, mload(add(pMem, pH3w3_2))), q), q), + q + ) mstore(add(pMem, pDenH2), w) // Denominator needed in the verifier when computing L_i^{S0}(X) computeLiS0(pMem) - + // Denominator needed in the verifier when computing L_i^{S1}(X) computeLiS1(pMem) @@ -683,27 +996,45 @@ contract FflonkVerifier { // L_i where i from 1 to num public inputs, needed in step 6 and 7 of the verifier to compute L_1(xi) and PI(xi) w := 1 let xi := mload(add(pMem, pXi)) - - mstore(add(pMem, pEval_l1), mulmod(n, mod(add(sub(xi, w), q), q), q)) - + + mstore( + add(pMem, pEval_l1), + mulmod(n, mod(add(sub(xi, w), q), q), q) + ) // Execute Montgomery batched inversions of the previous prepared values - inverseArray(pMem) } + inverseArray(pMem) + } // Compute Lagrange polynomial evaluation L_i(xi) function computeLagrange(pMem) { let zh := mload(add(pMem, pZh)) let w := 1 - - mstore(add(pMem, pEval_l1 ), mulmod(mload(add(pMem, pEval_l1 )), zh, q)) - + + mstore( + add(pMem, pEval_l1), + mulmod(mload(add(pMem, pEval_l1)), zh, q) + ) } // Compute public input polynomial evaluation PI(xi) function computePi(pMem, pPub) { let pi := 0 - pi := mod(add(sub(pi, mulmod(mload(add(pMem, pEval_l1)), calldataload(pPub), q)), q), q) - + pi := mod( + add( + sub( + pi, + mulmod( + mload(add(pMem, pEval_l1)), + calldataload(pPub), + q + ) + ), + q + ), + q + ) + mstore(add(pMem, pPi), pi) } @@ -729,166 +1060,446 @@ contract FflonkVerifier { let h0w80 let c0Value let h0w8i - + // Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc + // + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3 h0w80 := mload(add(pMem, pH0w8_0)) - c0Value := addmod(calldataload(pEval_ql), mulmod(calldataload(pEval_qr), h0w80, q), q) + c0Value := addmod( + calldataload(pEval_ql), + mulmod(calldataload(pEval_qr), h0w80, q), + q + ) h0w8i := mulmod(h0w80, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_qo), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_qo), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_qm), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_qm), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_qc), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_qc), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_s1), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_s1), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_s2), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_s2), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_s3), h0w8i, q), q) - - res := addmod(res, mulmod(c0Value, mulmod(num, mload(add(pMem, add(pLiS0Inv, 0))), q), q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_s3), h0w8i, q), + q + ) + + res := addmod( + res, + mulmod( + c0Value, + mulmod(num, mload(add(pMem, add(pLiS0Inv, 0))), q), + q + ), + q + ) - // Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc + // + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3 h0w80 := mload(add(pMem, pH0w8_1)) - c0Value := addmod(calldataload(pEval_ql), mulmod(calldataload(pEval_qr), h0w80, q), q) + c0Value := addmod( + calldataload(pEval_ql), + mulmod(calldataload(pEval_qr), h0w80, q), + q + ) h0w8i := mulmod(h0w80, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_qo), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_qo), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_qm), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_qm), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_qc), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_qc), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_s1), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_s1), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_s2), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_s2), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_s3), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_s3), h0w8i, q), + q + ) + + res := addmod( + res, + mulmod( + c0Value, + mulmod(num, mload(add(pMem, add(pLiS0Inv, 32))), q), + q + ), + q + ) - res := addmod(res, mulmod(c0Value, mulmod(num, mload(add(pMem, add(pLiS0Inv, 32))), q), q), q) - - // Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc + // + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3 h0w80 := mload(add(pMem, pH0w8_2)) - c0Value := addmod(calldataload(pEval_ql), mulmod(calldataload(pEval_qr), h0w80, q), q) + c0Value := addmod( + calldataload(pEval_ql), + mulmod(calldataload(pEval_qr), h0w80, q), + q + ) h0w8i := mulmod(h0w80, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_qo), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_qo), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_qm), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_qm), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_qc), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_qc), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_s1), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_s1), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_s2), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_s2), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_s3), h0w8i, q), q) - - res := addmod(res, mulmod(c0Value, mulmod(num, mload(add(pMem, add(pLiS0Inv, 64))), q), q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_s3), h0w8i, q), + q + ) + + res := addmod( + res, + mulmod( + c0Value, + mulmod(num, mload(add(pMem, add(pLiS0Inv, 64))), q), + q + ), + q + ) - // Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc + // + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3 h0w80 := mload(add(pMem, pH0w8_3)) - c0Value := addmod(calldataload(pEval_ql), mulmod(calldataload(pEval_qr), h0w80, q), q) + c0Value := addmod( + calldataload(pEval_ql), + mulmod(calldataload(pEval_qr), h0w80, q), + q + ) h0w8i := mulmod(h0w80, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_qo), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_qo), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_qm), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_qm), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_qc), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_qc), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_s1), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_s1), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_s2), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_s2), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_s3), h0w8i, q), q) - - res := addmod(res, mulmod(c0Value, mulmod(num, mload(add(pMem, add(pLiS0Inv, 96))), q), q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_s3), h0w8i, q), + q + ) + + res := addmod( + res, + mulmod( + c0Value, + mulmod(num, mload(add(pMem, add(pLiS0Inv, 96))), q), + q + ), + q + ) - // Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc + // + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3 h0w80 := mload(add(pMem, pH0w8_4)) - c0Value := addmod(calldataload(pEval_ql), mulmod(calldataload(pEval_qr), h0w80, q), q) + c0Value := addmod( + calldataload(pEval_ql), + mulmod(calldataload(pEval_qr), h0w80, q), + q + ) h0w8i := mulmod(h0w80, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_qo), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_qo), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_qm), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_qm), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_qc), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_qc), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_s1), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_s1), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_s2), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_s2), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_s3), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_s3), h0w8i, q), + q + ) + + res := addmod( + res, + mulmod( + c0Value, + mulmod(num, mload(add(pMem, add(pLiS0Inv, 128))), q), + q + ), + q + ) - res := addmod(res, mulmod(c0Value, mulmod(num, mload(add(pMem, add(pLiS0Inv, 128))), q), q), q) - - // Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc + // + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3 h0w80 := mload(add(pMem, pH0w8_5)) - c0Value := addmod(calldataload(pEval_ql), mulmod(calldataload(pEval_qr), h0w80, q), q) + c0Value := addmod( + calldataload(pEval_ql), + mulmod(calldataload(pEval_qr), h0w80, q), + q + ) h0w8i := mulmod(h0w80, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_qo), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_qo), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_qm), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_qm), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_qc), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_qc), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_s1), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_s1), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_s2), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_s2), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_s3), h0w8i, q), q) - - res := addmod(res, mulmod(c0Value, mulmod(num, mload(add(pMem, add(pLiS0Inv, 160))), q), q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_s3), h0w8i, q), + q + ) + + res := addmod( + res, + mulmod( + c0Value, + mulmod(num, mload(add(pMem, add(pLiS0Inv, 160))), q), + q + ), + q + ) - // Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc + // + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3 h0w80 := mload(add(pMem, pH0w8_6)) - c0Value := addmod(calldataload(pEval_ql), mulmod(calldataload(pEval_qr), h0w80, q), q) + c0Value := addmod( + calldataload(pEval_ql), + mulmod(calldataload(pEval_qr), h0w80, q), + q + ) h0w8i := mulmod(h0w80, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_qo), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_qo), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_qm), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_qm), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_qc), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_qc), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_s1), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_s1), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_s2), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_s2), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_s3), h0w8i, q), q) - - res := addmod(res, mulmod(c0Value, mulmod(num, mload(add(pMem, add(pLiS0Inv, 192))), q), q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_s3), h0w8i, q), + q + ) + + res := addmod( + res, + mulmod( + c0Value, + mulmod(num, mload(add(pMem, add(pLiS0Inv, 192))), q), + q + ), + q + ) - // Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc + // + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3 h0w80 := mload(add(pMem, pH0w8_7)) - c0Value := addmod(calldataload(pEval_ql), mulmod(calldataload(pEval_qr), h0w80, q), q) + c0Value := addmod( + calldataload(pEval_ql), + mulmod(calldataload(pEval_qr), h0w80, q), + q + ) h0w8i := mulmod(h0w80, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_qo), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_qo), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_qm), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_qm), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_qc), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_qc), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_s1), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_s1), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_s2), h0w8i, q), q) + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_s2), h0w8i, q), + q + ) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod(c0Value, mulmod(calldataload(pEval_s3), h0w8i, q), q) - - res := addmod(res, mulmod(c0Value, mulmod(num, mload(add(pMem, add(pLiS0Inv, 224))), q), q), q) - + c0Value := addmod( + c0Value, + mulmod(calldataload(pEval_s3), h0w8i, q), + q + ) + + res := addmod( + res, + mulmod( + c0Value, + mulmod(num, mload(add(pMem, add(pLiS0Inv, 224))), q), + q + ), + q + ) mstore(add(pMem, pR0), res) } @@ -913,10 +1524,14 @@ contract FflonkVerifier { let evalC := calldataload(pEval_c) t0 := mulmod(calldataload(pEval_ql), evalA, q) - t0 := addmod(t0, mulmod(calldataload(pEval_qr), evalB, q) ,q) - t0 := addmod(t0, mulmod(calldataload(pEval_qm), mulmod(evalA, evalB, q), q) ,q) - t0 := addmod(t0, mulmod(calldataload(pEval_qo), evalC, q) ,q) - t0 := addmod(t0, calldataload(pEval_qc) ,q) + t0 := addmod(t0, mulmod(calldataload(pEval_qr), evalB, q), q) + t0 := addmod( + t0, + mulmod(calldataload(pEval_qm), mulmod(evalA, evalB, q), q), + q + ) + t0 := addmod(t0, mulmod(calldataload(pEval_qo), evalC, q), q) + t0 := addmod(t0, calldataload(pEval_qc), q) t0 := addmod(t0, mload(add(pMem, pPi)), q) t0 := mulmod(t0, mload(add(pMem, pZhInv)), q) @@ -930,9 +1545,25 @@ contract FflonkVerifier { c1Value := addmod(c1Value, mulmod(h1w4, evalB, q), q) square := mulmod(h1w4, h1w4, q) c1Value := addmod(c1Value, mulmod(square, evalC, q), q) - c1Value := addmod(c1Value, mulmod(mulmod(square, h1w4, q), t0, q), q) - - res := addmod(res, mulmod(c1Value, mulmod(num, mload(add(pMem, add(pLiS1Inv, mul(0, 32)))), q), q), q) + c1Value := addmod( + c1Value, + mulmod(mulmod(square, h1w4, q), t0, q), + q + ) + + res := addmod( + res, + mulmod( + c1Value, + mulmod( + num, + mload(add(pMem, add(pLiS1Inv, mul(0, 32)))), + q + ), + q + ), + q + ) c1Value := evalA h1w4 := mload(add(pMem, pH1w4_1)) @@ -940,9 +1571,25 @@ contract FflonkVerifier { c1Value := addmod(c1Value, mulmod(h1w4, evalB, q), q) square := mulmod(h1w4, h1w4, q) c1Value := addmod(c1Value, mulmod(square, evalC, q), q) - c1Value := addmod(c1Value, mulmod(mulmod(square, h1w4, q), t0, q), q) - - res := addmod(res, mulmod(c1Value, mulmod(num, mload(add(pMem, add(pLiS1Inv, mul(1, 32)))), q), q), q) + c1Value := addmod( + c1Value, + mulmod(mulmod(square, h1w4, q), t0, q), + q + ) + + res := addmod( + res, + mulmod( + c1Value, + mulmod( + num, + mload(add(pMem, add(pLiS1Inv, mul(1, 32)))), + q + ), + q + ), + q + ) c1Value := evalA h1w4 := mload(add(pMem, pH1w4_2)) @@ -950,9 +1597,25 @@ contract FflonkVerifier { c1Value := addmod(c1Value, mulmod(h1w4, evalB, q), q) square := mulmod(h1w4, h1w4, q) c1Value := addmod(c1Value, mulmod(square, evalC, q), q) - c1Value := addmod(c1Value, mulmod(mulmod(square, h1w4, q), t0, q), q) - - res := addmod(res, mulmod(c1Value, mulmod(num, mload(add(pMem, add(pLiS1Inv, mul(2, 32)))), q), q), q) + c1Value := addmod( + c1Value, + mulmod(mulmod(square, h1w4, q), t0, q), + q + ) + + res := addmod( + res, + mulmod( + c1Value, + mulmod( + num, + mload(add(pMem, add(pLiS1Inv, mul(2, 32)))), + q + ), + q + ), + q + ) c1Value := evalA h1w4 := mload(add(pMem, pH1w4_3)) @@ -960,10 +1623,25 @@ contract FflonkVerifier { c1Value := addmod(c1Value, mulmod(h1w4, evalB, q), q) square := mulmod(h1w4, h1w4, q) c1Value := addmod(c1Value, mulmod(square, evalC, q), q) - c1Value := addmod(c1Value, mulmod(mulmod(square, h1w4, q), t0, q), q) - - res := addmod(res, mulmod(c1Value, mulmod(num, mload(add(pMem, add(pLiS1Inv, mul(3, 32)))), q), q), q) - + c1Value := addmod( + c1Value, + mulmod(mulmod(square, h1w4, q), t0, q), + q + ) + + res := addmod( + res, + mulmod( + c1Value, + mulmod( + num, + mload(add(pMem, add(pLiS1Inv, mul(3, 32)))), + q + ), + q + ), + q + ) mstore(add(pMem, pR1), res) } @@ -986,79 +1664,245 @@ contract FflonkVerifier { num2 := mulmod(y, num2, q) num2 := mulmod(y, num2, q) num2 := mulmod(y, num2, q) - num2 := mulmod(num2, addmod(mulmod(mload(add(pMem, pXi)), w1 ,q), mload(add(pMem, pXi)), q), q) + num2 := mulmod( + num2, + addmod( + mulmod(mload(add(pMem, pXi)), w1, q), + mload(add(pMem, pXi)), + q + ), + q + ) num := addmod(num, mod(sub(q, num2), q), q) - num2 := mulmod(mulmod(mload(add(pMem, pXi)), w1 ,q), mload(add(pMem, pXi)), q) + num2 := mulmod( + mulmod(mload(add(pMem, pXi)), w1, q), + mload(add(pMem, pXi)), + q + ) num := addmod(num, num2, q) let t1 let t2 - let betaXi := mulmod(mload(add(pMem, pBeta)), mload(add(pMem, pXi)), q) + let betaXi := mulmod( + mload(add(pMem, pBeta)), + mload(add(pMem, pXi)), + q + ) let gamma := mload(add(pMem, pGamma)) - t2 := addmod(calldataload( pEval_a), addmod(betaXi, gamma, q) ,q) - t2 := mulmod(t2, - addmod(calldataload( pEval_b), - addmod(mulmod(betaXi, k1, q), gamma, q) ,q), q) - t2 := mulmod(t2, - addmod(calldataload( pEval_c), - addmod(mulmod(betaXi, k2, q), gamma, q) ,q), q) + t2 := addmod(calldataload(pEval_a), addmod(betaXi, gamma, q), q) + t2 := mulmod( + t2, + addmod( + calldataload(pEval_b), + addmod(mulmod(betaXi, k1, q), gamma, q), + q + ), + q + ) + t2 := mulmod( + t2, + addmod( + calldataload(pEval_c), + addmod(mulmod(betaXi, k2, q), gamma, q), + q + ), + q + ) t2 := mulmod(t2, calldataload(pEval_z), q) //Let's use t1 as a temporal variable to save one local - t1 := addmod(calldataload(pEval_a), addmod(mulmod(mload(add(pMem, pBeta)), calldataload(pEval_s1), q), gamma, q) ,q) - t1 := mulmod(t1, - addmod(calldataload(pEval_b), addmod(mulmod(mload(add(pMem, pBeta)), calldataload(pEval_s2), q), gamma, q) ,q), q) - t1 := mulmod(t1, - addmod(calldataload(pEval_c), addmod(mulmod(mload(add(pMem, pBeta)), calldataload(pEval_s3), q), gamma, q) ,q), q) + t1 := addmod( + calldataload(pEval_a), + addmod( + mulmod( + mload(add(pMem, pBeta)), + calldataload(pEval_s1), + q + ), + gamma, + q + ), + q + ) + t1 := mulmod( + t1, + addmod( + calldataload(pEval_b), + addmod( + mulmod( + mload(add(pMem, pBeta)), + calldataload(pEval_s2), + q + ), + gamma, + q + ), + q + ), + q + ) + t1 := mulmod( + t1, + addmod( + calldataload(pEval_c), + addmod( + mulmod( + mload(add(pMem, pBeta)), + calldataload(pEval_s3), + q + ), + gamma, + q + ), + q + ), + q + ) t1 := mulmod(t1, calldataload(pEval_zw), q) - t2:= addmod(t2, mod(sub(q, t1), q), q) + t2 := addmod(t2, mod(sub(q, t1), q), q) t2 := mulmod(t2, mload(add(pMem, pZhInv)), q) // Compute T1(xi) t1 := sub(calldataload(pEval_z), 1) - t1 := mulmod(t1, mload(add(pMem, pEval_l1)) ,q) - t1 := mulmod(t1, mload(add(pMem, pZhInv)) ,q) + t1 := mulmod(t1, mload(add(pMem, pEval_l1)), q) + t1 := mulmod(t1, mload(add(pMem, pZhInv)), q) // Let's use local variable gamma to save the result - gamma:=0 - + gamma := 0 + let hw - let c2Value + let c2Value hw := mload(add(pMem, pH2w3_0)) c2Value := addmod(calldataload(pEval_z), mulmod(hw, t1, q), q) c2Value := addmod(c2Value, mulmod(mulmod(hw, hw, q), t2, q), q) - gamma := addmod(gamma, mulmod(c2Value, mulmod(num, mload(add(pMem, add(pLiS2Inv, mul(0, 32)))), q), q), q) + gamma := addmod( + gamma, + mulmod( + c2Value, + mulmod( + num, + mload(add(pMem, add(pLiS2Inv, mul(0, 32)))), + q + ), + q + ), + q + ) hw := mload(add(pMem, pH2w3_1)) c2Value := addmod(calldataload(pEval_z), mulmod(hw, t1, q), q) c2Value := addmod(c2Value, mulmod(mulmod(hw, hw, q), t2, q), q) - gamma := addmod(gamma, mulmod(c2Value, mulmod(num, mload(add(pMem, add(pLiS2Inv, mul(1, 32)))), q), q), q) + gamma := addmod( + gamma, + mulmod( + c2Value, + mulmod( + num, + mload(add(pMem, add(pLiS2Inv, mul(1, 32)))), + q + ), + q + ), + q + ) hw := mload(add(pMem, pH2w3_2)) c2Value := addmod(calldataload(pEval_z), mulmod(hw, t1, q), q) c2Value := addmod(c2Value, mulmod(mulmod(hw, hw, q), t2, q), q) - gamma := addmod(gamma, mulmod(c2Value, mulmod(num, mload(add(pMem, add(pLiS2Inv, mul(2, 32)))), q), q), q) + gamma := addmod( + gamma, + mulmod( + c2Value, + mulmod( + num, + mload(add(pMem, add(pLiS2Inv, mul(2, 32)))), + q + ), + q + ), + q + ) hw := mload(add(pMem, pH3w3_0)) - c2Value := addmod(calldataload(pEval_zw), mulmod(hw, calldataload(pEval_t1w), q), q) - c2Value := addmod(c2Value, mulmod(mulmod(hw, hw, q), calldataload(pEval_t2w), q), q) - gamma := addmod(gamma, mulmod(c2Value, mulmod(num, mload(add(pMem, add(pLiS2Inv, mul(3, 32)))), q), q), q) + c2Value := addmod( + calldataload(pEval_zw), + mulmod(hw, calldataload(pEval_t1w), q), + q + ) + c2Value := addmod( + c2Value, + mulmod(mulmod(hw, hw, q), calldataload(pEval_t2w), q), + q + ) + gamma := addmod( + gamma, + mulmod( + c2Value, + mulmod( + num, + mload(add(pMem, add(pLiS2Inv, mul(3, 32)))), + q + ), + q + ), + q + ) hw := mload(add(pMem, pH3w3_1)) - c2Value := addmod(calldataload(pEval_zw), mulmod(hw, calldataload(pEval_t1w), q), q) - c2Value := addmod(c2Value, mulmod(mulmod(hw, hw, q), calldataload(pEval_t2w), q), q) - gamma := addmod(gamma, mulmod(c2Value, mulmod(num, mload(add(pMem, add(pLiS2Inv, mul(4, 32)))), q), q), q) + c2Value := addmod( + calldataload(pEval_zw), + mulmod(hw, calldataload(pEval_t1w), q), + q + ) + c2Value := addmod( + c2Value, + mulmod(mulmod(hw, hw, q), calldataload(pEval_t2w), q), + q + ) + gamma := addmod( + gamma, + mulmod( + c2Value, + mulmod( + num, + mload(add(pMem, add(pLiS2Inv, mul(4, 32)))), + q + ), + q + ), + q + ) hw := mload(add(pMem, pH3w3_2)) - c2Value := addmod(calldataload(pEval_zw), mulmod(hw, calldataload(pEval_t1w), q), q) - c2Value := addmod(c2Value, mulmod(mulmod(hw, hw, q), calldataload(pEval_t2w), q), q) - gamma := addmod(gamma, mulmod(c2Value, mulmod(num, mload(add(pMem, add(pLiS2Inv, mul(5, 32)))), q), q), q) + c2Value := addmod( + calldataload(pEval_zw), + mulmod(hw, calldataload(pEval_t1w), q), + q + ) + c2Value := addmod( + c2Value, + mulmod(mulmod(hw, hw, q), calldataload(pEval_t2w), q), + q + ) + gamma := addmod( + gamma, + mulmod( + c2Value, + mulmod( + num, + mload(add(pMem, add(pLiS2Inv, mul(5, 32)))), + q + ), + q + ), + q + ) mstore(add(pMem, pR2), gamma) } @@ -1134,18 +1978,62 @@ contract FflonkVerifier { function computeFEJ(pMem) { // Prepare shared numerator between F, E and J to reuse it let y := mload(add(pMem, pY)) - let numerator := addmod(y, mod(sub(q, mload(add(pMem, pH0w8_0))), q), q) - numerator := mulmod(numerator, addmod(y, mod(sub(q, mload(add(pMem, pH0w8_1))), q), q), q) - numerator := mulmod(numerator, addmod(y, mod(sub(q, mload(add(pMem, pH0w8_2))), q), q), q) - numerator := mulmod(numerator, addmod(y, mod(sub(q, mload(add(pMem, pH0w8_3))), q), q), q) - numerator := mulmod(numerator, addmod(y, mod(sub(q, mload(add(pMem, pH0w8_4))), q), q), q) - numerator := mulmod(numerator, addmod(y, mod(sub(q, mload(add(pMem, pH0w8_5))), q), q), q) - numerator := mulmod(numerator, addmod(y, mod(sub(q, mload(add(pMem, pH0w8_6))), q), q), q) - numerator := mulmod(numerator, addmod(y, mod(sub(q, mload(add(pMem, pH0w8_7))), q), q), q) + let numerator := addmod( + y, + mod(sub(q, mload(add(pMem, pH0w8_0))), q), + q + ) + numerator := mulmod( + numerator, + addmod(y, mod(sub(q, mload(add(pMem, pH0w8_1))), q), q), + q + ) + numerator := mulmod( + numerator, + addmod(y, mod(sub(q, mload(add(pMem, pH0w8_2))), q), q), + q + ) + numerator := mulmod( + numerator, + addmod(y, mod(sub(q, mload(add(pMem, pH0w8_3))), q), q), + q + ) + numerator := mulmod( + numerator, + addmod(y, mod(sub(q, mload(add(pMem, pH0w8_4))), q), q), + q + ) + numerator := mulmod( + numerator, + addmod(y, mod(sub(q, mload(add(pMem, pH0w8_5))), q), q), + q + ) + numerator := mulmod( + numerator, + addmod(y, mod(sub(q, mload(add(pMem, pH0w8_6))), q), q), + q + ) + numerator := mulmod( + numerator, + addmod(y, mod(sub(q, mload(add(pMem, pH0w8_7))), q), q), + q + ) // Prepare shared quotient between F and E to reuse it - let quotient1 := mulmod(mload(add(pMem, pAlpha)), mulmod(numerator, mload(add(pMem, pDenH1)), q), q) - let quotient2 := mulmod(mulmod(mload(add(pMem, pAlpha)), mload(add(pMem, pAlpha)), q), mulmod(numerator, mload(add(pMem, pDenH2)), q), q) + let quotient1 := mulmod( + mload(add(pMem, pAlpha)), + mulmod(numerator, mload(add(pMem, pDenH1)), q), + q + ) + let quotient2 := mulmod( + mulmod( + mload(add(pMem, pAlpha)), + mload(add(pMem, pAlpha)), + q + ), + mulmod(numerator, mload(add(pMem, pDenH2)), q), + q + ) // Compute full batched polynomial commitment [F]_1 mstore(add(pMem, pF), C0x) @@ -1154,7 +2042,20 @@ contract FflonkVerifier { g1_mulAcc(add(pMem, pF), pC2, quotient2) // Compute group-encoded batch evaluation [E]_1 - g1_mulAccC(add(pMem, pE), G1x, G1y, addmod(mload(add(pMem, pR0)), addmod(mulmod(quotient1, mload(add(pMem, pR1)),q), mulmod(quotient2, mload(add(pMem, pR2)),q), q), q)) + g1_mulAccC( + add(pMem, pE), + G1x, + G1y, + addmod( + mload(add(pMem, pR0)), + addmod( + mulmod(quotient1, mload(add(pMem, pR1)), q), + mulmod(quotient2, mload(add(pMem, pR2)), q), + q + ), + q + ) + ) // Compute the full difference [J]_1 g1_mulAcc(add(pMem, pJ), pW1, numerator) @@ -1166,9 +2067,15 @@ contract FflonkVerifier { // First pairing value // Compute -E - mstore(add(add(pMem, pE), 32), mod(sub(qf, mload(add(add(pMem, pE), 32))), qf)) + mstore( + add(add(pMem, pE), 32), + mod(sub(qf, mload(add(add(pMem, pE), 32))), qf) + ) // Compute -J - mstore(add(add(pMem, pJ), 32), mod(sub(qf, mload(add(add(pMem, pJ), 32))), qf)) + mstore( + add(add(pMem, pJ), 32), + mod(sub(qf, mload(add(add(pMem, pJ), 32))), qf) + ) // F = F - E - J + y·W2 g1_acc(add(pMem, pF), add(pMem, pE)) g1_acc(add(pMem, pF), add(pMem, pJ)) @@ -1196,7 +2103,14 @@ contract FflonkVerifier { mstore(add(mIn, 320), X2y2) mstore(add(mIn, 352), X2y1) - let success := staticcall(sub(gas(), 2000), 8, mIn, 384, mIn, 0x20) + let success := staticcall( + sub(gas(), 2000), + 8, + mIn, + 384, + mIn, + 0x20 + ) isOk := and(success, mload(mIn)) } From cdbf86b7fdba1dc3e476ef6b8277878064562748 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Thu, 26 Oct 2023 18:58:33 +0200 Subject: [PATCH 166/230] fix comments and interfaces --- contracts/v2/PolygonZkEVMBridgeV2.sol | 2 +- contracts/v2/lib/DepositContractBase.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index b06d49f73..428c0f7c0 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -822,7 +822,7 @@ contract PolygonZkEVMBridgeV2 is // last 32 bits are leafIndex leafIndex = uint32(globalIndex); - // verify merkle proof agains rollup exit root + // Verify merkle proof agains rollup exit root if ( !verifyMerkleProof( calculateRoot(leafValue, smtProofLocalExitRoot, leafIndex), diff --git a/contracts/v2/lib/DepositContractBase.sol b/contracts/v2/lib/DepositContractBase.sol index fa23e5c69..7f7f353b3 100644 --- a/contracts/v2/lib/DepositContractBase.sol +++ b/contracts/v2/lib/DepositContractBase.sol @@ -142,7 +142,7 @@ contract DepositContractBase { ) public pure returns (bytes32) { bytes32 node = leafHash; - // Check merkle proof + // Compute root for ( uint256 height = 0; height < _DEPOSIT_CONTRACT_TREE_DEPTH; From dee575cfb79330fea83c73e515374c7366223bbb Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 13 Dec 2023 14:06:57 +0100 Subject: [PATCH 167/230] update bridge tests, update hardhat upgrade dependency --- test/contractsv2/PolygonZkEVMV2.test.ts | 693 ++++++++++++++++++++++++ 1 file changed, 693 insertions(+) create mode 100644 test/contractsv2/PolygonZkEVMV2.test.ts diff --git a/test/contractsv2/PolygonZkEVMV2.test.ts b/test/contractsv2/PolygonZkEVMV2.test.ts new file mode 100644 index 000000000..97c573b3d --- /dev/null +++ b/test/contractsv2/PolygonZkEVMV2.test.ts @@ -0,0 +1,693 @@ +/* eslint-disable no-plusplus, no-await-in-loop */ +import {expect} from "chai"; +import {ethers, network, upgrades} from "hardhat"; +import { + VerifierRollupHelperMock, + ERC20PermitMock, + PolygonRollupManagerMock, + PolygonZkEVMGlobalExitRootV2, + PolygonZkEVMBridgeV2, + PolygonZkEVMV2, + PolygonZkEVMEtrog, + PolygonRollupBase, + PolygonRollupBaseEtrog, + TokenWrapped, + Address, +} from "../../typechain-types"; +import {takeSnapshot, time} from "@nomicfoundation/hardhat-network-helpers"; +import {processorUtils, contractUtils, MTBridge, mtBridgeUtils} from "@0xpolygonhermez/zkevm-commonjs"; +const {calculateSnarkInput, calculateAccInputHash, calculateBatchHashData} = contractUtils; + +type BatchDataStruct = PolygonRollupBase.BatchDataStruct; +type ForcedBatchDataStruct = PolygonRollupBase.ForcedBatchDataStruct; +type BatchDataStructEtrog = PolygonRollupBaseEtrog.BatchDataStruct; + +const MerkleTreeBridge = MTBridge; +const {verifyMerkleProof, getLeafValue} = mtBridgeUtils; + +function calculateGlobalExitRoot(mainnetExitRoot: any, rollupExitRoot: any) { + return ethers.solidityPackedKeccak256(["bytes32", "bytes32"], [mainnetExitRoot, rollupExitRoot]); +} + +describe("Polygon ZK-EVM TestnetV2", () => { + let deployer: any; + let timelock: any; + let emergencyCouncil: any; + let trustedAggregator: any; + let trustedSequencer: any; + let admin: any; + let beneficiary: any; + + let verifierContract: VerifierRollupHelperMock; + let polygonZkEVMBridgeContract: PolygonZkEVMBridgeV2; + let polTokenContract: ERC20PermitMock; + let polygonZkEVMGlobalExitRoot: PolygonZkEVMGlobalExitRootV2; + let rollupManagerContract: PolygonRollupManagerEmptyMock; + let PolygonZKEVMV2Contract: PolygonZkEVMV2; + + const polTokenName = "POL Token"; + const polTokenSymbol = "POL"; + const polTokenInitialBalance = ethers.parseEther("20000000"); + + const pendingStateTimeoutDefault = 100; + const trustedAggregatorTimeout = 100; + const FORCE_BATCH_TIMEOUT = 60 * 60 * 24 * 5; // 5 days + + // BRidge constants + const networkIDMainnet = 0; + const networkIDRollup = 1; + + const LEAF_TYPE_ASSET = 0; + const LEAF_TYPE_MESSAGE = 1; + + const globalExitRootL2Address = "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa" as unknown as Address; + + let firstDeployment = true; + + const urlSequencer = "http://zkevm-json-rpc:8123"; + const chainID = 1000; + const networkName = "zkevm"; + const forkID = 0; + const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001"; + const rollupCompatibilityID = 0; + const descirption = "zkevm test"; + const networkID = 1; + + // Native token will be ether + const gasTokenAddress = ethers.ZeroAddress; + const gasTokenNetwork = 0; + + const SIGNATURE_BYTES = 32 + 32 + 1; + const EFFECTIVE_PERCENTAGE_BYTES = 1; + + beforeEach("Deploy contract", async () => { + upgrades.silenceWarnings(); + + // load signers + [deployer, trustedAggregator, trustedSequencer, admin, timelock, emergencyCouncil, beneficiary] = + await ethers.getSigners(); + + // deploy mock verifier + const VerifierRollupHelperFactory = await ethers.getContractFactory("VerifierRollupHelperMock"); + verifierContract = await VerifierRollupHelperFactory.deploy(); + + // deploy pol + const polTokenFactory = await ethers.getContractFactory("ERC20PermitMock"); + polTokenContract = await polTokenFactory.deploy( + polTokenName, + polTokenSymbol, + deployer.address, + polTokenInitialBalance + ); + + /* + * deploy global exit root manager + * In order to not have trouble with nonce deploy first proxy admin + */ + await upgrades.deployProxyAdmin(); + + if ((await upgrades.admin.getInstance()).target !== "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0") { + firstDeployment = false; + } + const nonceProxyBridge = + Number(await ethers.provider.getTransactionCount(deployer.address)) + (firstDeployment ? 3 : 2); + + const nonceProxyZkevm = nonceProxyBridge + 1; // Always have to redeploy impl since the polygonZkEVMGlobalExitRoot address changes + + const precalculateBridgeAddress = ethers.getCreateAddress({ + from: deployer.address, + nonce: nonceProxyBridge, + }); + const precalculateRollupManagerAddress = ethers.getCreateAddress({ + from: deployer.address, + nonce: nonceProxyZkevm, + }); + firstDeployment = false; + + // deploy globalExitRoot + const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRootV2"); + polygonZkEVMGlobalExitRoot = await upgrades.deployProxy(PolygonZkEVMGlobalExitRootFactory, [], { + initializer: false, + constructorArgs: [precalculateRollupManagerAddress, precalculateBridgeAddress], + unsafeAllow: ["constructor", "state-variable-immutable"], + }); + + // deploy PolygonZkEVMBridge + const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + polygonZkEVMBridgeContract = await upgrades.deployProxy(polygonZkEVMBridgeFactory, [], {initializer: false}); + + // deploy mock verifier + const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManagerEmptyMock"); + + rollupManagerContract = await PolygonRollupManagerFactory.deploy(); + + await rollupManagerContract.waitForDeployment(); + + // check precalculated address + expect(precalculateBridgeAddress).to.be.equal(polygonZkEVMBridgeContract.target); + expect(precalculateRollupManagerAddress).to.be.equal(rollupManagerContract.target); + + await polygonZkEVMBridgeContract.initialize( + networkIDMainnet, + ethers.ZeroAddress, // zero for ether + ethers.ZeroAddress, // zero for ether + polygonZkEVMGlobalExitRoot.target, + rollupManagerContract.target, + "0x" + ); + + // fund sequencer address with Matic tokens + await polTokenContract.transfer(trustedSequencer.address, ethers.parseEther("1000")); + + // deploy consensus + // Create zkEVM implementation + const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMV2"); + PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy( + polygonZkEVMGlobalExitRoot.target, + polTokenContract.target, + polygonZkEVMBridgeContract.target, + rollupManagerContract.target + ); + await PolygonZKEVMV2Contract.waitForDeployment(); + }); + + it("should check the initalized parameters", async () => { + // initialize zkEVM + await expect( + PolygonZKEVMV2Contract.initialize( + admin.address, + trustedSequencer.address, + networkID, + gasTokenAddress, + urlSequencer, + networkName + ) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "OnlyRollupManager"); + + // Initialzie using rollup manager + await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); + const rolllupManagerSigner = await ethers.getSigner(rollupManagerContract.target as any); + await expect( + PolygonZKEVMV2Contract.connect(rolllupManagerSigner).initialize( + admin.address, + trustedSequencer.address, + networkID, + gasTokenAddress, + urlSequencer, + networkName, + {gasPrice: 0} + ) + ).to.emit(PolygonZKEVMV2Contract, "InitialSequenceBatches"); + + const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; + expect(await PolygonZKEVMV2Contract.admin()).to.be.equal(admin.address); + expect(await PolygonZKEVMV2Contract.trustedSequencer()).to.be.equal(trustedSequencer.address); + expect(await PolygonZKEVMV2Contract.trustedSequencerURL()).to.be.equal(urlSequencer); + expect(await PolygonZKEVMV2Contract.networkName()).to.be.equal(networkName); + expect(await PolygonZKEVMV2Contract.forceBatchTimeout()).to.be.equal(FORCE_BATCH_TIMEOUT); + expect(await PolygonZKEVMV2Contract.lastTimestamp()).to.be.equal(timestampCreatedRollup); + }); + + it("should check admin functions", async () => { + // Initialzie using rollup manager + await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); + const rolllupManagerSigner = await ethers.getSigner(rollupManagerContract.target as any); + await expect( + PolygonZKEVMV2Contract.connect(rolllupManagerSigner).initialize( + admin.address, + trustedSequencer.address, + networkID, + gasTokenAddress, + urlSequencer, + networkName, + {gasPrice: 0} + ) + ).to.emit(PolygonZKEVMV2Contract, "InitialSequenceBatches"); + + await expect(PolygonZKEVMV2Contract.setTrustedSequencer(deployer.address)).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "OnlyAdmin" + ); + + await expect(PolygonZKEVMV2Contract.connect(admin).setTrustedSequencer(deployer.address)) + .to.emit(PolygonZKEVMV2Contract, "SetTrustedSequencer") + .withArgs(deployer.address); + + await expect(PolygonZKEVMV2Contract.setTrustedSequencerURL("0x1253")).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "OnlyAdmin" + ); + await expect(PolygonZKEVMV2Contract.connect(admin).setTrustedSequencerURL("0x1253")) + .to.emit(PolygonZKEVMV2Contract, "SetTrustedSequencerURL") + .withArgs("0x1253"); + + await expect(PolygonZKEVMV2Contract.setForceBatchTimeout(0)).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "OnlyAdmin" + ); + + await expect( + PolygonZKEVMV2Contract.connect(admin).setForceBatchTimeout(FORCE_BATCH_TIMEOUT) + ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "InvalidRangeForceBatchTimeout"); + + await expect(PolygonZKEVMV2Contract.connect(admin).setForceBatchTimeout(0)) + .to.emit(PolygonZKEVMV2Contract, "SetForceBatchTimeout") + .withArgs(0); + + await expect(PolygonZKEVMV2Contract.transferAdminRole(deployer.address)).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "OnlyAdmin" + ); + + await expect(PolygonZKEVMV2Contract.connect(admin).transferAdminRole(deployer.address)) + .to.emit(PolygonZKEVMV2Contract, "TransferAdminRole") + .withArgs(deployer.address); + + await expect(PolygonZKEVMV2Contract.connect(admin).acceptAdminRole()).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "OnlyPendingAdmin" + ); + + await expect(PolygonZKEVMV2Contract.connect(deployer).acceptAdminRole()) + .to.emit(PolygonZKEVMV2Contract, "AcceptAdminRole") + .withArgs(deployer.address); + + // Check force batches are unactive + await expect(PolygonZKEVMV2Contract.forceBatch("0x", 0)).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "ForceBatchNotAllowed" + ); + await expect(PolygonZKEVMV2Contract.sequenceForceBatches([])).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "ForceBatchNotAllowed" + ); + + // deployer now is the admin + await expect(PolygonZKEVMV2Contract.connect(admin).activateForceBatches()).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "OnlyAdmin" + ); + + await expect(PolygonZKEVMV2Contract.connect(deployer).activateForceBatches()).to.emit( + PolygonZKEVMV2Contract, + "ActivateForceBatches" + ); + + await expect(PolygonZKEVMV2Contract.connect(deployer).activateForceBatches()).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "ForceBatchesAlreadyActive" + ); + }); + + it("should check full flow", async () => { + // Initialzie using rollup manager + await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); + const rolllupManagerSigner = await ethers.getSigner(rollupManagerContract.target as any); + await expect( + PolygonZKEVMV2Contract.connect(rolllupManagerSigner).initialize( + admin.address, + trustedSequencer.address, + networkID, + gasTokenAddress, + urlSequencer, + networkName, + {gasPrice: 0} + ) + ).to.emit(PolygonZKEVMV2Contract, "InitialSequenceBatches"); + const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; + + const transaction = await PolygonZKEVMV2Contract.generateInitializeTransaction( + networkID, + gasTokenAddress, + gasTokenNetwork, + "0x" // empty metadata + ); + + // Check transaction + const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + const encodedData = bridgeL2Factory.interface.encodeFunctionData("initialize", [ + networkID, + gasTokenAddress, + gasTokenNetwork, + globalExitRootL2Address, + ethers.ZeroAddress, + "0x", // empty metadata + ]); + + const rawTx = processorUtils.customRawTxToRawTx(transaction); + const tx = ethers.Transaction.from(rawTx); + + const rlpSignData = transaction.slice(0, -(SIGNATURE_BYTES * 2 + EFFECTIVE_PERCENTAGE_BYTES * 2)); + expect(rlpSignData).to.be.equal(tx.unsignedSerialized); + + expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); + expect(tx.value).to.be.equal(0); + expect(tx.data).to.be.equal(encodedData); + expect(tx.gasPrice).to.be.equal(0); + expect(tx.gasLimit).to.be.equal(30000000); + expect(tx.nonce).to.be.equal(0); + expect(tx.chainId).to.be.equal(0); + + const expectedAccInputHash = calculateAccInputHash( + ethers.ZeroHash, + ethers.keccak256(transaction), + await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), + timestampCreatedRollup, + trustedSequencer.address + ); + // calcualte accINputHash + expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash); + + // try verify batches + const l2txData = "0x123456"; + const maticAmount = ethers.parseEther("1"); + const currentTimestamp = (await ethers.provider.getBlock("latest"))?.timestamp; + + const sequence = { + transactions: l2txData, + globalExitRoot: ethers.ZeroHash, + timestamp: currentTimestamp, + minForcedTimestamp: 0, + } as BatchDataStruct; + + // Approve tokens + await expect( + polTokenContract.connect(trustedSequencer).approve(PolygonZKEVMV2Contract.target, maticAmount) + ).to.emit(polTokenContract, "Approval"); + + // Sequence Batches + await expect( + PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address) + ) + .to.emit(PolygonZKEVMV2Contract, "SequenceBatches") + .withArgs(1); + + const expectedAccInputHash2 = calculateAccInputHash( + expectedAccInputHash, + ethers.keccak256(l2txData), + ethers.ZeroHash, + currentTimestamp, + trustedSequencer.address + ); + // calcualte accINputHash + expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash2); + }); + + it("should check full flow with wrapped gas token", async () => { + // Create a new wrapped token mocking the bridge + const tokenName = "Matic Token L2"; + const tokenSymbol = "MATIC"; + const decimals = 18; + const metadataToken = ethers.AbiCoder.defaultAbiCoder().encode( + ["string", "string", "uint8"], + [tokenName, tokenSymbol, decimals] + ); + + const originNetwork = networkIDRollup; + const tokenAddress = ethers.getAddress(ethers.hexlify(ethers.randomBytes(20))); + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDMainnet; + const destinationAddress = beneficiary.address; + const metadata = metadataToken; // since we are inserting in the exit root can be anything + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + // compute root merkle tree in Js + const height = 32; + const merkleTreezkEVM = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + + // Add 2 leafs + merkleTreezkEVM.add(leafValue); + merkleTreezkEVM.add(leafValue); + + // check merkle root with SC + const rootzkEVM = merkleTreezkEVM.getRoot(); + + // Calcualte new globalExitroot + const merkleTreeRollups = new MerkleTreeBridge(height); + merkleTreeRollups.add(rootzkEVM); + const rootRollups = merkleTreeRollups.getRoot(); + + // Assert global exit root + // TODO + await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); + const rolllupManagerSigner = await ethers.getSigner(rollupManagerContract.target as any); + await polygonZkEVMGlobalExitRoot.connect(rolllupManagerSigner).updateExitRoot(rootRollups, {gasPrice: 0}); + + expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(ethers.ZeroHash); + expect(await polygonZkEVMGlobalExitRoot.lastRollupExitRoot()).to.be.equal(rootRollups); + + expect(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()).to.be.equal( + calculateGlobalExitRoot(ethers.ZeroHash, rootRollups) + ); + + const indexLeaf = 0; + const proofZkEVM = merkleTreezkEVM.getProofTreeByIndex(indexLeaf); + const proofRollups = merkleTreeRollups.getProofTreeByIndex(indexLeaf); + + // verify merkle proof + expect(verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM)).to.be.equal(true); + expect(verifyMerkleProof(rootzkEVM, proofRollups, indexLeaf, rootRollups)).to.be.equal(true); + + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM) + ).to.be.equal(true); + + expect( + await polygonZkEVMBridgeContract.verifyMerkleProof(rootzkEVM, proofRollups, indexLeaf, rootRollups) + ).to.be.equal(true); + + // claim + const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); + // create2 parameters + const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]); + const minimalBytecodeProxy = tokenWrappedFactory.bytecode; + const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]); + const precalculateWrappedErc20 = await ethers.getCreate2Address( + polygonZkEVMBridgeContract.target as string, + salt, + hashInitCode + ); + const newWrappedToken = tokenWrappedFactory.attach(precalculateWrappedErc20) as TokenWrapped; + + // Use precalculatedWrapperAddress and check if matches + expect( + await polygonZkEVMBridgeContract.precalculatedWrapperAddress( + networkIDRollup, + tokenAddress, + tokenName, + tokenSymbol, + decimals + ) + ).to.be.equal(precalculateWrappedErc20); + + // index leaf is 0 bc, does not have mainnet flag, and it's rollup 0 on leaf 0 + await expect( + polygonZkEVMBridgeContract.claimAsset( + proofZkEVM, + proofRollups, + indexLeaf, + ethers.ZeroHash, + rootRollups, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ) + ) + .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") + .withArgs(indexLeaf, originNetwork, tokenAddress, destinationAddress, amount) + .to.emit(polygonZkEVMBridgeContract, "NewWrappedToken") + .withArgs(originNetwork, tokenAddress, precalculateWrappedErc20, metadata) + .to.emit(newWrappedToken, "Transfer") + .withArgs(ethers.ZeroAddress, beneficiary.address, amount); + + // Assert maps created + const newTokenInfo = await polygonZkEVMBridgeContract.wrappedTokenToTokenInfo(precalculateWrappedErc20); + + expect(newTokenInfo.originNetwork).to.be.equal(networkIDRollup); + expect(newTokenInfo.originTokenAddress).to.be.equal(tokenAddress); + expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( + precalculateWrappedErc20 + ); + expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( + precalculateWrappedErc20 + ); + + expect(await polygonZkEVMBridgeContract.tokenInfoToWrappedToken(salt)).to.be.equal(precalculateWrappedErc20); + + // Check the wrapper info + expect(await newWrappedToken.name()).to.be.equal(tokenName); + expect(await newWrappedToken.symbol()).to.be.equal(tokenSymbol); + expect(await newWrappedToken.decimals()).to.be.equal(decimals); + + // Initialzie using rollup manager with gas token + await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); + await expect( + PolygonZKEVMV2Contract.connect(rolllupManagerSigner).initialize( + admin.address, + trustedSequencer.address, + networkID, + newWrappedToken.target, + urlSequencer, + networkName, + {gasPrice: 0} + ) + ).to.emit(PolygonZKEVMV2Contract, "InitialSequenceBatches"); + + const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; + + const transaction = await PolygonZKEVMV2Contract.generateInitializeTransaction( + networkID, + tokenAddress, + originNetwork, + metadata // empty metadata + ); + + // Check transaction + const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + const encodedData = bridgeL2Factory.interface.encodeFunctionData("initialize", [ + networkID, + tokenAddress, + originNetwork, + globalExitRootL2Address, + ethers.ZeroAddress, + metadata, // empty metadata + ]); + + const rawTx = processorUtils.customRawTxToRawTx(transaction); + const tx = ethers.Transaction.from(rawTx); + + const rlpSignData = transaction.slice(0, -(SIGNATURE_BYTES * 2 + EFFECTIVE_PERCENTAGE_BYTES * 2)); + expect(rlpSignData).to.be.equal(tx.unsignedSerialized); + + expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); + expect(tx.value).to.be.equal(0); + expect(tx.data).to.be.equal(encodedData); + expect(tx.gasPrice).to.be.equal(0); + expect(tx.gasLimit).to.be.equal(30000000); + expect(tx.nonce).to.be.equal(0); + expect(tx.chainId).to.be.equal(0); + + const expectedAccInputHash = calculateAccInputHash( + ethers.ZeroHash, + ethers.keccak256(transaction), + await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), + timestampCreatedRollup, + trustedSequencer.address + ); + + // calcualte accINputHash + expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash); + + expect(await PolygonZKEVMV2Contract.gasTokenAddress()).to.be.equal(tokenAddress); + expect(await PolygonZKEVMV2Contract.gasTokenNetwork()).to.be.equal(originNetwork); + }); + + it("should check forced batches", async () => { + // Initialzie using rollup manager + await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); + const rolllupManagerSigner = await ethers.getSigner(rollupManagerContract.target as any); + await expect( + PolygonZKEVMV2Contract.connect(rolllupManagerSigner).initialize( + admin.address, + trustedSequencer.address, + networkID, + gasTokenAddress, + urlSequencer, + networkName, + {gasPrice: 0} + ) + ).to.emit(PolygonZKEVMV2Contract, "InitialSequenceBatches"); + + const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; + const transaction = await PolygonZKEVMV2Contract.generateInitializeTransaction( + networkID, + gasTokenAddress, + gasTokenNetwork, + "0x" // empty metadata + ); + + // Check transaction + const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + const encodedData = bridgeL2Factory.interface.encodeFunctionData("initialize", [ + networkID, + gasTokenAddress, + gasTokenNetwork, + globalExitRootL2Address, + ethers.ZeroAddress, + "0x", // empty metadata + ]); + + const rawTx = processorUtils.customRawTxToRawTx(transaction); + const tx = ethers.Transaction.from(rawTx); + + const rlpSignData = transaction.slice(0, -(SIGNATURE_BYTES * 2 + EFFECTIVE_PERCENTAGE_BYTES * 2)); + expect(rlpSignData).to.be.equal(tx.unsignedSerialized); + + expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); + expect(tx.value).to.be.equal(0); + expect(tx.data).to.be.equal(encodedData); + expect(tx.gasPrice).to.be.equal(0); + expect(tx.gasLimit).to.be.equal(30000000); + expect(tx.nonce).to.be.equal(0); + expect(tx.chainId).to.be.equal(0); + + const expectedAccInputHash = calculateAccInputHash( + ethers.ZeroHash, + ethers.keccak256(transaction), + await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), + timestampCreatedRollup, + trustedSequencer.address + ); + // calcualte accINputHash + expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash); + + // try verify batches + const l2txData = "0x123456"; + const maticAmount = ethers.parseEther("1"); + + // Approve tokens + await expect(polTokenContract.connect(deployer).approve(PolygonZKEVMV2Contract.target, maticAmount)).to.emit( + polTokenContract, + "Approval" + ); + + expect(await PolygonZKEVMV2Contract.calculatePolPerForceBatch()).to.be.equal(0); + + const globalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); + + // force Batches + await expect(PolygonZKEVMV2Contract.forceBatch(l2txData, maticAmount)).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "ForceBatchNotAllowed" + ); + + // deployer now is the admin + await PolygonZKEVMV2Contract.connect(admin).activateForceBatches(); + + // force Batches + await expect(PolygonZKEVMV2Contract.forceBatch(l2txData, 0)).to.be.revertedWithCustomError( + PolygonZKEVMV2Contract, + "NotEnoughPOLAmount" + ); + + await expect(PolygonZKEVMV2Contract.forceBatch(l2txData, maticAmount)) + .to.emit(PolygonZKEVMV2Contract, "ForceBatch") + .withArgs(1, globalExitRoot, deployer.address, "0x"); + + expect(await PolygonZKEVMV2Contract.calculatePolPerForceBatch()).to.be.equal( + await rollupManagerContract.getForcedBatchFee() + ); + }); +}); From 44b92d5d2bd4c30031ef3232028ffb1d9f66efa3 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 22 Jan 2024 17:11:11 +0100 Subject: [PATCH 168/230] upgrade scripts small fixes small updates refine upgrade scripts add testnet folder --- package.json | 5 +- upgrade/tool-regen-upgrade-info/input.json | 13 + .../tool-regen-upgrade-info/regen_input.ts | 26 ++ .../upgradeToV2/testnet/deployTestnetPol.ts | 115 +++++++ upgrade/upgradeToV2/upgradeL2ToV2.ts | 149 +++++++++ upgrade/upgradeToV2/upgradeToV2.ts | 303 ++++++++++++++++++ .../upgrade_parameters.json.example | 7 + 7 files changed, 617 insertions(+), 1 deletion(-) create mode 100644 upgrade/tool-regen-upgrade-info/input.json create mode 100644 upgrade/tool-regen-upgrade-info/regen_input.ts create mode 100644 upgrade/upgradeToV2/testnet/deployTestnetPol.ts create mode 100644 upgrade/upgradeToV2/upgradeL2ToV2.ts create mode 100644 upgrade/upgradeToV2/upgradeToV2.ts create mode 100644 upgrade/upgradeToV2/upgrade_parameters.json.example diff --git a/package.json b/package.json index 95c56cc04..d2042275d 100644 --- a/package.json +++ b/package.json @@ -95,6 +95,9 @@ "deploy:testnet:v1ToV2:localhost": "npx hardhat compile && rm -f deployment/v1ToV2/deploy_ongoing.json && npm run prepare:v1ToV2:ZkEVM:localhost && npm run deploy:v1ToV2:localhost", "docker:v1ToV2:contracts": "./docker/scripts/v1ToV2/deploy-docker.sh", "dockerv2:v1ToV2:contracts": "sudo ./docker/scripts/v1ToV2/deploy-dockerv2.sh", - "saveDeployment:sepolia": "mkdir -p deployments/sepolia_$(date +%s) && cp -r deployment/v2/deploy_*.json deployments/sepolia_$(date +%s) && cp .openzeppelin/sepolia.json deployments/sepolia_$(date +%s) && cp deployment/v2/genesis.json deployments/sepolia_$(date +%s) && cp deployment/v2/create_rollup_output.json deployments/sepolia_$(date +%s)" + "saveDeployment:sepolia": "mkdir -p deployments/sepolia_$(date +%s) && cp -r deployment/v2/deploy_*.json deployments/sepolia_$(date +%s) && cp .openzeppelin/sepolia.json deployments/sepolia_$(date +%s) && cp deployment/v2/genesis.json deployments/sepolia_$(date +%s) && cp deployment/v2/create_rollup_output.json deployments/sepolia_$(date +%s)", + "upgradev2:timelock:goerli": "npx hardhat run upgrade/upgradeToV2/upgradeToV2.ts --network goerli", + "upgradev2L2:timelock:goerli": "npx hardhat run upgrade/upgradeToV2/upgradeL2ToV2.ts --network zkevm" + } } \ No newline at end of file diff --git a/upgrade/tool-regen-upgrade-info/input.json b/upgrade/tool-regen-upgrade-info/input.json new file mode 100644 index 000000000..c1550483b --- /dev/null +++ b/upgrade/tool-regen-upgrade-info/input.json @@ -0,0 +1,13 @@ +{ + "proxyAddress": "0xaddress", + "implementationName": "PolygonZkEVMUpgraded", + "constructorArgs": [ + "0xaddress", + "0xaddress", + "0xaddress", + "0xaddress", + 0, + 0, + 0 + ] +} \ No newline at end of file diff --git a/upgrade/tool-regen-upgrade-info/regen_input.ts b/upgrade/tool-regen-upgrade-info/regen_input.ts new file mode 100644 index 000000000..1642b93dd --- /dev/null +++ b/upgrade/tool-regen-upgrade-info/regen_input.ts @@ -0,0 +1,26 @@ +/* eslint-disable no-await-in-loop */ +/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */ +import {expect} from "chai"; +import path = require("path"); +import fs = require("fs"); + +import {ethers, upgrades} from "hardhat"; +const input = require("./input.json"); + +async function main() { + // load input file + + // Load implementation contract + const PolygonZkEVMFactory = (await ethers.getContractFactory(input.implementationName)) as any; + + // Import OZ upgrades + await upgrades.forceImport(input.proxyAddress, PolygonZkEVMFactory, { + kind: "transparent", + constructorArgs: input.constructorArgs, + }); +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/upgrade/upgradeToV2/testnet/deployTestnetPol.ts b/upgrade/upgradeToV2/testnet/deployTestnetPol.ts new file mode 100644 index 000000000..682fad26d --- /dev/null +++ b/upgrade/upgradeToV2/testnet/deployTestnetPol.ts @@ -0,0 +1,115 @@ +/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if */ +/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */ +import {expect} from "chai"; +import path = require("path"); +import fs = require("fs"); + +import * as dotenv from "dotenv"; +dotenv.config({path: path.resolve(__dirname, "../../../.env")}); +import {ethers, upgrades} from "hardhat"; +const deployParameters = require("../deploy_parameters.json"); + +async function main() { + const {trustedSequencer} = deployParameters; + + // Load provider + let currentProvider = ethers.provider; + if (deployParameters.multiplierGas || deployParameters.maxFeePerGas) { + if (process.env.HARDHAT_NETWORK !== "hardhat") { + currentProvider = ethers.getDefaultProvider( + `https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}` + ) as any; + if (deployParameters.maxPriorityFeePerGas && deployParameters.maxFeePerGas) { + console.log( + `Hardcoded gas used: MaxPriority${deployParameters.maxPriorityFeePerGas} gwei, MaxFee${deployParameters.maxFeePerGas} gwei` + ); + const FEE_DATA = new ethers.FeeData( + null, + ethers.parseUnits(deployParameters.maxFeePerGas, "gwei"), + ethers.parseUnits(deployParameters.maxPriorityFeePerGas, "gwei") + ); + + currentProvider.getFeeData = async () => FEE_DATA; + } else { + console.log("Multiplier gas used: ", deployParameters.multiplierGas); + async function overrideFeeData() { + const feedata = await ethers.provider.getFeeData(); + return new ethers.FeeData( + null, + ((feedata.maxFeePerGas as bigint) * BigInt(deployParameters.multiplierGas)) / 1000n, + ((feedata.maxPriorityFeePerGas as bigint) * BigInt(deployParameters.multiplierGas)) / 1000n + ); + } + currentProvider.getFeeData = overrideFeeData; + } + } + } + + // Load deployer + let deployer; + if (deployParameters.deployerPvtKey) { + deployer = new ethers.Wallet(deployParameters.deployerPvtKey, currentProvider); + } else if (process.env.MNEMONIC) { + deployer = ethers.HDNodeWallet.fromMnemonic( + ethers.Mnemonic.fromPhrase(process.env.MNEMONIC), + "m/44'/60'/0'/0/0" + ).connect(currentProvider); + } else { + [deployer] = await ethers.getSigners(); + } + + console.log("deploying with: ", deployer.address); + + /* + *Deployment pol + */ + const polTokenName = "Pol Token"; + const polTokenSymbol = "POL"; + const polTokenInitialBalance = ethers.parseEther("20000000"); + + const polTokenFactory = await ethers.getContractFactory("ERC20PermitMock", deployer); + const polTokenContract = await polTokenFactory.deploy( + polTokenName, + polTokenSymbol, + deployer.address, + polTokenInitialBalance + ); + await polTokenContract.waitForDeployment(); + + console.log("#######################\n"); + console.log("pol deployed to:", polTokenContract.target); + console.log("you can verify the new impl address with:"); + console.log( + `npx hardhat verify --constructor-args upgrade/arguments.js ${polTokenContract.target} --network ${process.env.HARDHAT_NETWORK}\n` + ); + console.log("Copy the following constructor arguments on: upgrade/arguments.js \n", [ + polTokenName, + polTokenSymbol, + deployer.address, + polTokenInitialBalance, + ]); + + const tokensBalance = ethers.parseEther("100000"); + await (await polTokenContract.transfer(trustedSequencer, tokensBalance)).wait(); +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); + +// OZ test functions +function genOperation(target: any, value: any, data: any, predecessor: any, salt: any) { + const id = ethers.solidityPackedKeccak256( + ["address", "uint256", "bytes", "uint256", "bytes32"], + [target, value, data, predecessor, salt] + ); + return { + id, + target, + value, + data, + predecessor, + salt, + }; +} diff --git a/upgrade/upgradeToV2/upgradeL2ToV2.ts b/upgrade/upgradeToV2/upgradeL2ToV2.ts new file mode 100644 index 000000000..d8cbaed16 --- /dev/null +++ b/upgrade/upgradeToV2/upgradeL2ToV2.ts @@ -0,0 +1,149 @@ +/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if */ +/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */ +import {expect} from "chai"; +import path = require("path"); +import fs = require("fs"); + +import * as dotenv from "dotenv"; +dotenv.config({path: path.resolve(__dirname, "../../.env")}); +import {ethers, upgrades} from "hardhat"; + +const pathOutputJson = path.join(__dirname, "./upgrade_outputL2.json"); +const deployParameters = require("./deploy_parameters.json"); +const deployOutputParameters = require("./deploy_output.json"); +const upgradeParameters = require("./upgrade_parameters.json"); + +async function main() { + const salt = upgradeParameters.timelockSalt || ethers.ZeroHash; + const timelockDelay = deployParameters.minDelayTimelock; + const currentBridgeAddress = deployOutputParameters.polygonZkEVMBridgeAddress; + + // Load provider + let currentProvider = ethers.provider; + if (deployParameters.multiplierGas || deployParameters.maxFeePerGas) { + if (process.env.HARDHAT_NETWORK !== "hardhat") { + currentProvider = ethers.getDefaultProvider( + `https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}` + ) as any; + if (deployParameters.maxPriorityFeePerGas && deployParameters.maxFeePerGas) { + console.log( + `Hardcoded gas used: MaxPriority${deployParameters.maxPriorityFeePerGas} gwei, MaxFee${deployParameters.maxFeePerGas} gwei` + ); + const FEE_DATA = new ethers.FeeData( + null, + ethers.parseUnits(deployParameters.maxFeePerGas, "gwei"), + ethers.parseUnits(deployParameters.maxPriorityFeePerGas, "gwei") + ); + + currentProvider.getFeeData = async () => FEE_DATA; + } else { + console.log("Multiplier gas used: ", deployParameters.multiplierGas); + async function overrideFeeData() { + const feedata = await ethers.provider.getFeeData(); + return new ethers.FeeData( + null, + ((feedata.maxFeePerGas as bigint) * BigInt(deployParameters.multiplierGas)) / 1000n, + ((feedata.maxPriorityFeePerGas as bigint) * BigInt(deployParameters.multiplierGas)) / 1000n + ); + } + currentProvider.getFeeData = overrideFeeData; + } + } + } + + // Load deployer + let deployer; + if (deployParameters.deployerPvtKey) { + deployer = new ethers.Wallet(deployParameters.deployerPvtKey, currentProvider); + } else if (process.env.MNEMONIC) { + deployer = ethers.HDNodeWallet.fromMnemonic( + ethers.Mnemonic.fromPhrase(process.env.MNEMONIC), + "m/44'/60'/0'/0/0" + ).connect(currentProvider); + } else { + [deployer] = await ethers.getSigners(); + } + + console.log("deploying with: ", deployer.address); + + // Prepare Upgrade PolygonZkEVMBridge + const PreviousBridgeFactory = (await ethers.getContractFactory("PolygonZkEVMBridge")) as any; + + // Import OZ upgrades + await upgrades.forceImport(currentBridgeAddress as string, PreviousBridgeFactory, "transparent" as any); + + const proxyAdmin = await upgrades.admin.getInstance(); + + // load timelock + const timelockContractFactory = await ethers.getContractFactory("PolygonZkEVMTimelock", deployer); + + // prapare upgrades + const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2", deployer); + + const newBridgeImpl = await upgrades.prepareUpgrade(currentBridgeAddress, polygonZkEVMBridgeFactory, { + unsafeAllow: ["constructor"], + }); + + console.log("#######################\n"); + console.log(`PolygonZkEVMBridge impl: ${newBridgeImpl}`); + + console.log("you can verify the new impl address with:"); + console.log(`npx hardhat verify ${newBridgeImpl} --network ${process.env.HARDHAT_NETWORK}`); + + const operationBridge = genOperation( + proxyAdmin.target, + 0, // value + proxyAdmin.interface.encodeFunctionData("upgrade", [currentBridgeAddress, newBridgeImpl]), + ethers.ZeroHash, // predecesoor + salt // salt + ); + + // Schedule operation + const scheduleData = timelockContractFactory.interface.encodeFunctionData("schedule", [ + operationBridge.target, + operationBridge.value, + operationBridge.data, + ethers.ZeroHash, // predecesoor + salt, // salt + timelockDelay, + ]); + + // Execute operation + const executeData = timelockContractFactory.interface.encodeFunctionData("execute", [ + operationBridge.target, + operationBridge.value, + operationBridge.data, + ethers.ZeroHash, // predecesoor + salt, // salt + ]); + + console.log({scheduleData}); + console.log({executeData}); + + const outputJson = { + scheduleData, + executeData, + }; + fs.writeFileSync(pathOutputJson, JSON.stringify(outputJson, null, 1)); +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); + +// OZ test functions +function genOperation(target: any, value: any, data: any, predecessor: any, salt: any) { + const id = ethers.solidityPackedKeccak256( + ["address", "uint256", "bytes", "uint256", "bytes32"], + [target, value, data, predecessor, salt] + ); + return { + id, + target, + value, + data, + predecessor, + salt, + }; +} diff --git a/upgrade/upgradeToV2/upgradeToV2.ts b/upgrade/upgradeToV2/upgradeToV2.ts new file mode 100644 index 000000000..218494308 --- /dev/null +++ b/upgrade/upgradeToV2/upgradeToV2.ts @@ -0,0 +1,303 @@ +/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if */ +/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */ +import {expect} from "chai"; +import path = require("path"); +import fs = require("fs"); + +import * as dotenv from "dotenv"; +dotenv.config({path: path.resolve(__dirname, "../../.env")}); +import {ethers, upgrades} from "hardhat"; + +const pathOutputJson = path.join(__dirname, "./upgrade_output.json"); + +const deployParameters = require("./deploy_parameters.json"); +const deployOutputParameters = require("./deploy_output.json"); +const upgradeParameters = require("./upgrade_parameters.json"); + +const pathOZUpgradability = path.join(__dirname, `../../.openzeppelin/${process.env.HARDHAT_NETWORK}.json`); + +async function main() { + const { + admin, + trustedAggregator, + trustedAggregatorTimeout, + pendingStateTimeout, + zkEVMOwner, + chainID, + } = deployParameters; + + + const emergencyCouncilAddress = zkEVMOwner; + + const {realVerifier, newForkID, timelockDelay, polTokenAddress} = upgradeParameters; + + const salt = upgradeParameters.timelockSalt || ethers.ZeroHash; + + const currentBridgeAddress = deployOutputParameters.polygonZkEVMBridgeAddress; + const currentGlobalExitRootAddress = deployOutputParameters.polygonZkEVMGlobalExitRootAddress; + const currentPolygonZkEVMAddress = deployOutputParameters.; + const currentTimelockAddress = deployOutputParameters.timelockContrapolygonZkEVMAddressctAddress; + + // Load provider + let currentProvider = ethers.provider; + if (deployParameters.multiplierGas || deployParameters.maxFeePerGas) { + if (process.env.HARDHAT_NETWORK !== "hardhat") { + currentProvider = ethers.getDefaultProvider( + `https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}` + ) as any; + if (deployParameters.maxPriorityFeePerGas && deployParameters.maxFeePerGas) { + console.log( + `Hardcoded gas used: MaxPriority${deployParameters.maxPriorityFeePerGas} gwei, MaxFee${deployParameters.maxFeePerGas} gwei` + ); + const FEE_DATA = new ethers.FeeData( + null, + ethers.parseUnits(deployParameters.maxFeePerGas, "gwei"), + ethers.parseUnits(deployParameters.maxPriorityFeePerGas, "gwei") + ); + + currentProvider.getFeeData = async () => FEE_DATA; + } else { + console.log("Multiplier gas used: ", deployParameters.multiplierGas); + async function overrideFeeData() { + const feedata = await ethers.provider.getFeeData(); + return new ethers.FeeData( + null, + ((feedata.maxFeePerGas as bigint) * BigInt(deployParameters.multiplierGas)) / 1000n, + ((feedata.maxPriorityFeePerGas as bigint) * BigInt(deployParameters.multiplierGas)) / 1000n + ); + } + currentProvider.getFeeData = overrideFeeData; + } + } + } + + // Load deployer + let deployer; + if (deployParameters.deployerPvtKey) { + deployer = new ethers.Wallet(deployParameters.deployerPvtKey, currentProvider); + } else if (process.env.MNEMONIC) { + deployer = ethers.HDNodeWallet.fromMnemonic( + ethers.Mnemonic.fromPhrase(process.env.MNEMONIC), + "m/44'/60'/0'/0/0" + ).connect(currentProvider); + } else { + [deployer] = await ethers.getSigners(); + } + + console.log("deploying with: ", deployer.address); + + const proxyAdmin = await upgrades.admin.getInstance(); + + + // deploy new verifier + let verifierContract; + if (realVerifier === true) { + const VerifierRollup = await ethers.getContractFactory("FflonkVerifier", deployer); + verifierContract = await VerifierRollup.deploy(); + await verifierContract.waitForDeployment(); + } else { + const VerifierRollupHelperFactory = await ethers.getContractFactory("VerifierRollupHelperMock", deployer); + verifierContract = await VerifierRollupHelperFactory.deploy(); + await verifierContract.waitForDeployment(); + } + console.log("#######################\n"); + console.log("Verifier deployed to:", verifierContract.target); + console.log(`npx hardhat verify ${verifierContract.target} --network ${process.env.HARDHAT_NETWORK}`); + + // load timelock + const timelockContractFactory = await ethers.getContractFactory("PolygonZkEVMTimelock", deployer); + const timelockContract = timelockContractFactory.attach(currentTimelockAddress); + + // prapare upgrades + + // Prepare Upgrade PolygonZkEVMBridge + const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2", deployer); + + const newBridgeImpl = await upgrades.prepareUpgrade(currentBridgeAddress, polygonZkEVMBridgeFactory, { + unsafeAllow: ["constructor"], + }); + + console.log("#######################\n"); + console.log(`PolygonZkEVMBridge impl: ${newBridgeImpl}`); + + console.log("you can verify the new impl address with:"); + console.log(`npx hardhat verify ${newBridgeImpl} --network ${process.env.HARDHAT_NETWORK}`); + + const operationBridge = genOperation( + proxyAdmin.target, + 0, // value + proxyAdmin.interface.encodeFunctionData("upgrade", [currentBridgeAddress, newBridgeImpl]), + ethers.ZeroHash, // predecesoor + salt // salt + ); + + // prepare upgrade global exit root + // Prepare Upgrade PolygonZkEVMBridge + const polygonGlobalExitRootV2 = await ethers.getContractFactory("PolygonZkEVMGlobalExitRootV2", deployer); + + const newGlobalExitRoortImpl = await upgrades.prepareUpgrade( + currentGlobalExitRootAddress, + polygonGlobalExitRootV2, + { + constructorArgs: [currentPolygonZkEVMAddress, currentBridgeAddress], + unsafeAllow: ["constructor", "state-variable-immutable"], + } + ); + + console.log("#######################\n"); + console.log(`polygonGlobalExitRootV2 impl: ${newGlobalExitRoortImpl}`); + + console.log("you can verify the new impl address with:"); + console.log( + `npx hardhat verify --constructor-args upgrade/arguments.js ${newGlobalExitRoortImpl} --network ${process.env.HARDHAT_NETWORK}\n` + ); + console.log("Copy the following constructor arguments on: upgrade/arguments.js \n", [ + currentPolygonZkEVMAddress, + currentBridgeAddress, + ]); + + const operationGlobalExitRoot = genOperation( + proxyAdmin.target, + 0, // value + proxyAdmin.interface.encodeFunctionData("upgrade", [currentGlobalExitRootAddress, newGlobalExitRoortImpl]), + ethers.ZeroHash, // predecesoor + salt // salt + ); + + // Update current system to rollup manager + + // deploy polygon + const PolygonZkEVMV2ExistentFactory = await ethers.getContractFactory("PolygonZkEVMExistentEtrog"); + const polygonZkEVMEtrogImpl = await PolygonZkEVMV2ExistentFactory.deploy( + currentGlobalExitRootAddress, + polTokenAddress, + currentBridgeAddress, + currentPolygonZkEVMAddress, + ); + await polygonZkEVMEtrogImpl.waitForDeployment(); + + console.log("#######################\n"); + console.log(`new PolygonZkEVM impl: ${polygonZkEVMEtrogImpl.target}`); + + console.log("you can verify the new impl address with:"); + console.log( + `npx hardhat verify --constructor-args upgrade/arguments.js ${polygonZkEVMEtrogImpl.target} --network ${process.env.HARDHAT_NETWORK}\n` + ); + console.log("Copy the following constructor arguments on: upgrade/arguments.js \n", [ + currentGlobalExitRootAddress, + polTokenAddress, + currentBridgeAddress, + currentPolygonZkEVMAddress, + ]); + + const PolygonTransparentProxy = await ethers.getContractFactory("PolygonTransparentProxy"); + const newPolygonZkEVMContract = await PolygonTransparentProxy.deploy(polygonZkEVMEtrogImpl, currentPolygonZkEVMAddress, "0x"); + await newPolygonZkEVMContract.waitForDeployment(); + console.log("#######################\n"); + console.log(`new PolygonZkEVM Proxy: ${newPolygonZkEVMContract.target}`); + + console.log("you can verify the new impl address with:"); + console.log( + `npx hardhat verify --constructor-args upgrade/arguments.js ${newPolygonZkEVMContract.target} --network ${process.env.HARDHAT_NETWORK}\n` + ); + console.log("Copy the following constructor arguments on: upgrade/arguments.js \n", [ + polygonZkEVMEtrogImpl, currentPolygonZkEVMAddress, "0x" + ]); + + // Upgrade to rollup manager previous polygonZKEVM + const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager"); + const implRollupManager = await upgrades.prepareUpgrade(currentPolygonZkEVMAddress, PolygonRollupManagerFactory, { + constructorArgs: [currentGlobalExitRootAddress, polTokenAddress, currentBridgeAddress], + unsafeAllow: ["constructor", "state-variable-immutable"], + }); + + console.log("#######################\n"); + console.log(`Polygon rollup manager: ${implRollupManager}`); + + console.log("you can verify the new impl address with:"); + console.log( + `npx hardhat verify --constructor-args upgrade/arguments.js ${implRollupManager} --network ${process.env.HARDHAT_NETWORK}\n` + ); + console.log("Copy the following constructor arguments on: upgrade/arguments.js \n", [ + currentGlobalExitRootAddress, + polTokenAddress, + currentBridgeAddress, + ]); + + const operationRollupManager = genOperation( + proxyAdmin.target, + 0, // value + proxyAdmin.interface.encodeFunctionData("upgradeAndCall", [ + currentPolygonZkEVMAddress, + implRollupManager, + PolygonRollupManagerFactory.interface.encodeFunctionData("initialize", [ + trustedAggregator, + pendingStateTimeout, + trustedAggregatorTimeout, + admin, + timelockContract.target, + emergencyCouncilAddress, + newPolygonZkEVMContract.target, + verifierContract.target, + newForkID, + chainID, + ]), + ]), + ethers.ZeroHash, // predecesoor + salt // salt + ); + + // Schedule operation + const scheduleData = timelockContractFactory.interface.encodeFunctionData("scheduleBatch", [ + [operationGlobalExitRoot.target, operationBridge.target, operationRollupManager.target], + [operationGlobalExitRoot.value, operationBridge.value, operationRollupManager.value], + [operationGlobalExitRoot.data, operationBridge.data, operationRollupManager.data], + ethers.ZeroHash, // predecesoor + salt, // salt + timelockDelay, + ]); + + // Execute operation + const executeData = timelockContractFactory.interface.encodeFunctionData("executeBatch", [ + [operationGlobalExitRoot.target, operationBridge.target, operationRollupManager.target], + [operationGlobalExitRoot.value, operationBridge.value, operationRollupManager.value], + [operationGlobalExitRoot.data, operationBridge.data, operationRollupManager.data], + ethers.ZeroHash, // predecesoor + salt, // salt + ]); + + console.log({scheduleData}); + console.log({executeData}); + + const outputJson = { + scheduleData, + executeData, + verifierAddress: verifierContract.target, + newPolygonZKEVM: newPolygonZkEVMContract.target + }; + fs.writeFileSync(pathOutputJson, JSON.stringify(outputJson, null, 1)); +} + +// TODO script verify contracts + +main().catch((e) => { + console.error(e); + process.exit(1); +}); + +// OZ test functions +function genOperation(target: any, value: any, data: any, predecessor: any, salt: any) { + const id = ethers.solidityPackedKeccak256( + ["address", "uint256", "bytes", "uint256", "bytes32"], + [target, value, data, predecessor, salt] + ); + return { + id, + target, + value, + data, + predecessor, + salt, + }; +} + diff --git a/upgrade/upgradeToV2/upgrade_parameters.json.example b/upgrade/upgradeToV2/upgrade_parameters.json.example new file mode 100644 index 000000000..55af7c026 --- /dev/null +++ b/upgrade/upgradeToV2/upgrade_parameters.json.example @@ -0,0 +1,7 @@ +{ + "realVerifier": true, + "newForkID": 7, + "timelockDelay": 0, + "timelockSalt": "", + "polTokenAddress": "0xaddress" +} \ No newline at end of file From 7b13891b8d1439a0e008b2ff22e27635892c8117 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Thu, 25 Jan 2024 17:09:32 +0100 Subject: [PATCH 169/230] rebase fixes --- .gitignore | 2 +- compiled-contracts/PolygonZkEVM.json | 4 +- compiled-contracts/TokenWrapped.json | 4 +- contracts/PolygonZkEVM.sol | 7 +- contracts/mocks/PolygonZkEVMMock.sol | 6 +- contracts/v2/PolygonZkEVMBridgeV2.sol | 22 - contracts/v2/lib/DepositContractBase.sol | 27 - contracts/verifiers/FflonkVerifier.sol | 1760 ++++------------- docs/v2/PolygonRollupManager.md | 56 - docs/v2/PolygonZkEVMBridgeV2.md | 331 ++-- test/contracts/bridge.test.js | 10 +- test/contracts/bridgeMock.test.js | 2 +- test/contracts/bridge_metadata.test.js | 6 +- test/contracts/bridge_permit.test.js | 6 +- test/contracts/depositContractMock.test.js | 12 +- test/contracts/emergencyManager.test.js | 1 + test/contracts/globalExitRootManager.test.js | 54 +- test/contracts/polygonZkEVM.test.js | 114 +- test/contracts/snark_stark_input.test.js | 4 +- test/contractsv2/PolygonRollupManager.test.js | 166 -- test/contractsv2/PolygonZkEVMV2.test.ts | 693 ------- .../regen-upgrade-info.js | 25 - 22 files changed, 645 insertions(+), 2667 deletions(-) delete mode 100644 test/contractsv2/PolygonRollupManager.test.js delete mode 100644 test/contractsv2/PolygonZkEVMV2.test.ts delete mode 100644 upgrade/tool-regen-upgrade-info/regen-upgrade-info.js diff --git a/.gitignore b/.gitignore index 9c02e765d..4f37d8194 100644 --- a/.gitignore +++ b/.gitignore @@ -19,4 +19,4 @@ upgrade_parameters.json docker/gethData/ *.ignore/ typechain-types/ -create_rollup_parameters.json +create_rollup_parameters.json \ No newline at end of file diff --git a/compiled-contracts/PolygonZkEVM.json b/compiled-contracts/PolygonZkEVM.json index bc61d9a1a..4e967a181 100644 --- a/compiled-contracts/PolygonZkEVM.json +++ b/compiled-contracts/PolygonZkEVM.json @@ -1351,7 +1351,7 @@ }, { "internalType": "bytes32", - "name": "historicGlobalExitRoot", + "name": "globalExitRoot", "type": "bytes32" }, { @@ -1391,7 +1391,7 @@ }, { "internalType": "bytes32", - "name": "historicGlobalExitRoot", + "name": "globalExitRoot", "type": "bytes32" }, { diff --git a/compiled-contracts/TokenWrapped.json b/compiled-contracts/TokenWrapped.json index 72e165a2a..b690c2af6 100644 --- a/compiled-contracts/TokenWrapped.json +++ b/compiled-contracts/TokenWrapped.json @@ -471,8 +471,8 @@ "type": "function" } ], - "bytecode": "0x61010060405234801562000011575f80fd5b50604051620019a1380380620019a1833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516115036200049e5f395f61022d01525f81816102fb015281816105ad015261067a01525f61052801525f818161036d01526104f201526115035ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b6040516101879190611255565b60405180910390f35b6101a361019e3660046112e6565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461130e565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d3660046112e6565b61054a565b6102856102803660046112e6565b610595565b005b6101b7610295366004611347565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca366004611347565b60056020525f908152604090205481565b61017a610653565b6102856102f13660046112e6565b610662565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a36103503660046112e6565b610717565b6101a36103633660046112e6565b6107cd565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d366004611367565b6107da565b6101b76103b03660046113d4565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611405565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611405565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610ad7565b60019150505b92915050565b5f336104d9858285610c56565b6104e4858585610d12565b506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146105255761052046610f31565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c09082908690610590908790611483565b610ad7565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106455760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61064f8282610ff8565b5050565b60606004805461043290611405565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461070d5760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d42726964676500000000000000000000000000000000606482015260840161063c565b61064f82826110cf565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107c05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161063c565b6104e48286868403610ad7565b5f336104c0818585610d12565b8342111561084f5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d697400000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866108a883611496565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6109126104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156109d3573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610a4e57508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610ac05760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e617475726500000000000000000000000000000000000000000000000000606482015260840161063c565b610acb8a8a8a610ad7565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610b5f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610be85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d0c5781811015610cff5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161063c565b610d0c8484848403610ad7565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610d9b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610e245760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610ebf5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610d0c565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610f5b610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff821661105b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161063c565b8060025f82825461106c9190611483565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166111585760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260208190526040902054818110156111f35760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610c49565b5f6020808352835180828501525f5b8181101561128057858101830151858201604001528201611264565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146112e1575f80fd5b919050565b5f80604083850312156112f7575f80fd5b611300836112be565b946020939093013593505050565b5f805f60608486031215611320575f80fd5b611329846112be565b9250611337602085016112be565b9150604084013590509250925092565b5f60208284031215611357575f80fd5b611360826112be565b9392505050565b5f805f805f805f60e0888a03121561137d575f80fd5b611386886112be565b9650611394602089016112be565b95506040880135945060608801359350608088013560ff811681146113b7575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f80604083850312156113e5575f80fd5b6113ee836112be565b91506113fc602084016112be565b90509250929050565b600181811c9082168061141957607f821691505b602082108103611450577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c6611456565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036114c6576114c6611456565b506001019056fea2646970667358221220176a1a9cf4a702d3853b858873fff4a6370c4e5d7d72d68593ec0ebe64fcc26964736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b6040516101879190611255565b60405180910390f35b6101a361019e3660046112e6565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461130e565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d3660046112e6565b61054a565b6102856102803660046112e6565b610595565b005b6101b7610295366004611347565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca366004611347565b60056020525f908152604090205481565b61017a610653565b6102856102f13660046112e6565b610662565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a36103503660046112e6565b610717565b6101a36103633660046112e6565b6107cd565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d366004611367565b6107da565b6101b76103b03660046113d4565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611405565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611405565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610ad7565b60019150505b92915050565b5f336104d9858285610c56565b6104e4858585610d12565b506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146105255761052046610f31565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c09082908690610590908790611483565b610ad7565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106455760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61064f8282610ff8565b5050565b60606004805461043290611405565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461070d5760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d42726964676500000000000000000000000000000000606482015260840161063c565b61064f82826110cf565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107c05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161063c565b6104e48286868403610ad7565b5f336104c0818585610d12565b8342111561084f5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d697400000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866108a883611496565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6109126104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156109d3573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610a4e57508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610ac05760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e617475726500000000000000000000000000000000000000000000000000606482015260840161063c565b610acb8a8a8a610ad7565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610b5f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610be85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d0c5781811015610cff5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161063c565b610d0c8484848403610ad7565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610d9b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610e245760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610ebf5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610d0c565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610f5b610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff821661105b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161063c565b8060025f82825461106c9190611483565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166111585760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260208190526040902054818110156111f35760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610c49565b5f6020808352835180828501525f5b8181101561128057858101830151858201604001528201611264565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146112e1575f80fd5b919050565b5f80604083850312156112f7575f80fd5b611300836112be565b946020939093013593505050565b5f805f60608486031215611320575f80fd5b611329846112be565b9250611337602085016112be565b9150604084013590509250925092565b5f60208284031215611357575f80fd5b611360826112be565b9392505050565b5f805f805f805f60e0888a03121561137d575f80fd5b611386886112be565b9650611394602089016112be565b95506040880135945060608801359350608088013560ff811681146113b7575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f80604083850312156113e5575f80fd5b6113ee836112be565b91506113fc602084016112be565b90509250929050565b600181811c9082168061141957607f821691505b602082108103611450577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c6611456565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036114c6576114c6611456565b506001019056fea2646970667358221220176a1a9cf4a702d3853b858873fff4a6370c4e5d7d72d68593ec0ebe64fcc26964736f6c63430008140033", + "bytecode": "0x61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/contracts/PolygonZkEVM.sol b/contracts/PolygonZkEVM.sol index 0132fbb9e..4bc4a1826 100644 --- a/contracts/PolygonZkEVM.sol +++ b/contracts/PolygonZkEVM.sol @@ -29,7 +29,8 @@ contract PolygonZkEVM is * @param transactions L2 ethereum transactions EIP-155 or pre-EIP-155 with signature: * EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data, chainid, 0, 0,) || v || r || s * pre-EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data) || v || r || s - * @param forcedHistoricGlobalExitRoot Global exit root of the batch + * @param globalExitRoot Global exit root of the batch + * @param timestamp Sequenced timestamp of the batch * @param minForcedTimestamp Minimum timestamp of the force batch data, empty when non forced batch */ struct BatchData { @@ -1066,7 +1067,7 @@ contract PolygonZkEVM is * @param batches Struct array which holds the necessary data to append force batches */ function sequenceForceBatches( - BatchData[] calldata batches + ForcedBatchData[] calldata batches ) external isForceBatchAllowed ifNotEmergencyState { uint256 batchesNum = batches.length; @@ -1094,7 +1095,7 @@ contract PolygonZkEVM is // Sequence force batches for (uint256 i = 0; i < batchesNum; i++) { // Load current sequence - BatchData memory currentBatch = batches[i]; + ForcedBatchData memory currentBatch = batches[i]; currentLastForceBatchSequenced++; // Store the current transactions hash since it's used more than once for gas saving diff --git a/contracts/mocks/PolygonZkEVMMock.sol b/contracts/mocks/PolygonZkEVMMock.sol index 23721b8b9..23282e96c 100644 --- a/contracts/mocks/PolygonZkEVMMock.sol +++ b/contracts/mocks/PolygonZkEVMMock.sol @@ -48,8 +48,7 @@ contract PolygonZkEVMMock is PolygonZkEVM { bytes memory transactions, bytes32 globalExitRoot, uint64 timestamp, - address sequencerAddress, - bool isForced + address sequencerAddress ) public pure returns (bytes32) { return keccak256( @@ -58,8 +57,7 @@ contract PolygonZkEVMMock is PolygonZkEVM { keccak256(transactions), globalExitRoot, timestamp, - sequencerAddress, - isForced + sequencerAddress ) ); } diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index 428c0f7c0..9e1c86624 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -423,7 +423,6 @@ contract PolygonZkEVMBridgeV2 is } } - // Maitain previous approach?¿ /** * @notice Verify merkle proof and withdraw tokens/ether * @param smtProofLocalExitRoot Smt proof to proof the leaf agains the exit root @@ -803,25 +802,6 @@ contract PolygonZkEVMBridgeV2 is // Last 32 bits are leafIndex leafIndex = uint32(globalIndex); - // Verify merkle proof agains rollup exit root - if ( - !verifyMerkleProof( - calculateRoot(leafValue, smtProofLocalExitRoot, leafIndex), - smtProofRollupExitRoot, - indexRollup, - rollupExitRoot - ) - ) { - revert InvalidSmtProof(); - } - } else { - // it's a rollup, therefore we have to infer the origin network - uint32 indexRollup = uint32(globalIndex >> 32); - originNetwork = indexRollup + 1; - - // last 32 bits are leafIndex - leafIndex = uint32(globalIndex); - // Verify merkle proof agains rollup exit root if ( !verifyMerkleProof( @@ -835,8 +815,6 @@ contract PolygonZkEVMBridgeV2 is } } - // TODO must calcualte TRUE origin network - // Set and check nullifier _setAndCheckClaimed(leafIndex, sourceBridgeNetwork); } diff --git a/contracts/v2/lib/DepositContractBase.sol b/contracts/v2/lib/DepositContractBase.sol index 7f7f353b3..a93f0a90f 100644 --- a/contracts/v2/lib/DepositContractBase.sol +++ b/contracts/v2/lib/DepositContractBase.sol @@ -128,31 +128,4 @@ contract DepositContractBase { return node; } - - /** - * @notice calcualte root from merkle proof - * @param leafHash Leaf hash - * @param smtProof Smt proof - * @param index Index of the leaf - */ - function calculateRoot( - bytes32 leafHash, - bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, - uint32 index - ) public pure returns (bytes32) { - bytes32 node = leafHash; - - // Compute root - for ( - uint256 height = 0; - height < _DEPOSIT_CONTRACT_TREE_DEPTH; - height++ - ) { - if (((index >> height) & 1) == 1) - node = keccak256(abi.encodePacked(smtProof[height], node)); - else node = keccak256(abi.encodePacked(node, smtProof[height])); - } - - return node; - } } diff --git a/contracts/verifiers/FflonkVerifier.sol b/contracts/verifiers/FflonkVerifier.sol index a23d92437..adf4e8f0b 100644 --- a/contracts/verifiers/FflonkVerifier.sol +++ b/contracts/verifiers/FflonkVerifier.sol @@ -21,117 +21,91 @@ pragma solidity >=0.7.0 <0.9.0; contract FflonkVerifier { - uint32 constant n = 16777216; // Domain size + uint32 constant n = 16777216; // Domain size // Verification Key data - uint256 constant k1 = 2; // Plonk k1 multiplicative factor to force distinct cosets of H - uint256 constant k2 = 3; // Plonk k2 multiplicative factor to force distinct cosets of H + uint256 constant k1 = 2; // Plonk k1 multiplicative factor to force distinct cosets of H + uint256 constant k2 = 3; // Plonk k2 multiplicative factor to force distinct cosets of H // OMEGAS // Omega, Omega^{1/3} - uint256 constant w1 = - 5709868443893258075976348696661355716898495876243883251619397131511003808859; - uint256 constant wr = - 18200100796661656210024324131237448517259556535315737226009542456080026430510; + uint256 constant w1 = 5709868443893258075976348696661355716898495876243883251619397131511003808859; + uint256 constant wr = 18200100796661656210024324131237448517259556535315737226009542456080026430510; // Omega_3, Omega_3^2 - uint256 constant w3 = - 21888242871839275217838484774961031246154997185409878258781734729429964517155; - uint256 constant w3_2 = - 4407920970296243842393367215006156084916469457145843978461; + uint256 constant w3 = 21888242871839275217838484774961031246154997185409878258781734729429964517155; + uint256 constant w3_2 = 4407920970296243842393367215006156084916469457145843978461; // Omega_4, Omega_4^2, Omega_4^3 - uint256 constant w4 = - 21888242871839275217838484774961031246007050428528088939761107053157389710902; - uint256 constant w4_2 = - 21888242871839275222246405745257275088548364400416034343698204186575808495616; - uint256 constant w4_3 = - 4407920970296243842541313971887945403937097133418418784715; + uint256 constant w4 = 21888242871839275217838484774961031246007050428528088939761107053157389710902; + uint256 constant w4_2 = 21888242871839275222246405745257275088548364400416034343698204186575808495616; + uint256 constant w4_3 = 4407920970296243842541313971887945403937097133418418784715; // Omega_8, Omega_8^2, Omega_8^3, Omega_8^4, Omega_8^5, Omega_8^6, Omega_8^7 - uint256 constant w8_1 = - 19540430494807482326159819597004422086093766032135589407132600596362845576832; - uint256 constant w8_2 = - 21888242871839275217838484774961031246007050428528088939761107053157389710902; - uint256 constant w8_3 = - 13274704216607947843011480449124596415239537050559949017414504948711435969894; - uint256 constant w8_4 = - 21888242871839275222246405745257275088548364400416034343698204186575808495616; - uint256 constant w8_5 = - 2347812377031792896086586148252853002454598368280444936565603590212962918785; - uint256 constant w8_6 = - 4407920970296243842541313971887945403937097133418418784715; - uint256 constant w8_7 = - 8613538655231327379234925296132678673308827349856085326283699237864372525723; + uint256 constant w8_1 = 19540430494807482326159819597004422086093766032135589407132600596362845576832; + uint256 constant w8_2 = 21888242871839275217838484774961031246007050428528088939761107053157389710902; + uint256 constant w8_3 = 13274704216607947843011480449124596415239537050559949017414504948711435969894; + uint256 constant w8_4 = 21888242871839275222246405745257275088548364400416034343698204186575808495616; + uint256 constant w8_5 = 2347812377031792896086586148252853002454598368280444936565603590212962918785; + uint256 constant w8_6 = 4407920970296243842541313971887945403937097133418418784715; + uint256 constant w8_7 = 8613538655231327379234925296132678673308827349856085326283699237864372525723; // Verifier preprocessed input C_0(x)·[1]_1 - uint256 constant C0x = - 1399458405278693375564157845951119219674216315698518301618391005223961674672; - uint256 constant C0y = - 4753339552187781629812877887300152778714353139514388879046795575382068591682; + uint256 constant C0x = 1399458405278693375564157845951119219674216315698518301618391005223961674672; + uint256 constant C0y = 4753339552187781629812877887300152778714353139514388879046795575382068591682; // Verifier preprocessed input x·[1]_2 - uint256 constant X2x1 = - 21831381940315734285607113342023901060522397560371972897001948545212302161822; - uint256 constant X2x2 = - 17231025384763736816414546592865244497437017442647097510447326538965263639101; - uint256 constant X2y1 = - 2388026358213174446665280700919698872609886601280537296205114254867301080648; - uint256 constant X2y2 = - 11507326595632554467052522095592665270651932854513688777769618397986436103170; + uint256 constant X2x1 = 21831381940315734285607113342023901060522397560371972897001948545212302161822; + uint256 constant X2x2 = 17231025384763736816414546592865244497437017442647097510447326538965263639101; + uint256 constant X2y1 = 2388026358213174446665280700919698872609886601280537296205114254867301080648; + uint256 constant X2y2 = 11507326595632554467052522095592665270651932854513688777769618397986436103170; // Scalar field size - uint256 constant q = - 21888242871839275222246405745257275088548364400416034343698204186575808495617; + uint256 constant q = 21888242871839275222246405745257275088548364400416034343698204186575808495617; // Base field size - uint256 constant qf = - 21888242871839275222246405745257275088696311157297823662689037894645226208583; + uint256 constant qf = 21888242871839275222246405745257275088696311157297823662689037894645226208583; // [1]_1 - uint256 constant G1x = 1; - uint256 constant G1y = 2; + uint256 constant G1x = 1; + uint256 constant G1y = 2; // [1]_2 - uint256 constant G2x1 = - 10857046999023057135944570762232829481370756359578518086990519993285655852781; - uint256 constant G2x2 = - 11559732032986387107991004021392285783925812861821192530917403151452391805634; - uint256 constant G2y1 = - 8495653923123431417604973247489272438418190587263600148770280649306958101930; - uint256 constant G2y2 = - 4082367875863433681332203403145435568316851327593401208105741076214120093531; + uint256 constant G2x1 = 10857046999023057135944570762232829481370756359578518086990519993285655852781; + uint256 constant G2x2 = 11559732032986387107991004021392285783925812861821192530917403151452391805634; + uint256 constant G2y1 = 8495653923123431417604973247489272438418190587263600148770280649306958101930; + uint256 constant G2y2 = 4082367875863433681332203403145435568316851327593401208105741076214120093531; // Proof calldata // Byte offset of every parameter of the calldata // Polynomial commitments - uint16 constant pC1 = 4 + 0; // [C1]_1 - uint16 constant pC2 = 4 + 32 * 2; // [C2]_1 - uint16 constant pW1 = 4 + 32 * 4; // [W]_1 - uint16 constant pW2 = 4 + 32 * 6; // [W']_1 + uint16 constant pC1 = 4 + 0; // [C1]_1 + uint16 constant pC2 = 4 + 32*2; // [C2]_1 + uint16 constant pW1 = 4 + 32*4; // [W]_1 + uint16 constant pW2 = 4 + 32*6; // [W']_1 // Opening evaluations - uint16 constant pEval_ql = 4 + 32 * 8; // q_L(xi) - uint16 constant pEval_qr = 4 + 32 * 9; // q_R(xi) - uint16 constant pEval_qm = 4 + 32 * 10; // q_M(xi) - uint16 constant pEval_qo = 4 + 32 * 11; // q_O(xi) - uint16 constant pEval_qc = 4 + 32 * 12; // q_C(xi) - uint16 constant pEval_s1 = 4 + 32 * 13; // S_{sigma_1}(xi) - uint16 constant pEval_s2 = 4 + 32 * 14; // S_{sigma_2}(xi) - uint16 constant pEval_s3 = 4 + 32 * 15; // S_{sigma_3}(xi) - uint16 constant pEval_a = 4 + 32 * 16; // a(xi) - uint16 constant pEval_b = 4 + 32 * 17; // b(xi) - uint16 constant pEval_c = 4 + 32 * 18; // c(xi) - uint16 constant pEval_z = 4 + 32 * 19; // z(xi) - uint16 constant pEval_zw = 4 + 32 * 20; // z_omega(xi) - uint16 constant pEval_t1w = 4 + 32 * 21; // T_1(xi omega) - uint16 constant pEval_t2w = 4 + 32 * 22; // T_2(xi omega) - uint16 constant pEval_inv = 4 + 32 * 23; // inv(batch) sent by the prover to avoid any inverse calculation to save gas, - // we check the correctness of the inv(batch) by computing batch - // and checking inv(batch) * batch == 1 + uint16 constant pEval_ql = 4 + 32*8; // q_L(xi) + uint16 constant pEval_qr = 4 + 32*9; // q_R(xi) + uint16 constant pEval_qm = 4 + 32*10; // q_M(xi) + uint16 constant pEval_qo = 4 + 32*11; // q_O(xi) + uint16 constant pEval_qc = 4 + 32*12; // q_C(xi) + uint16 constant pEval_s1 = 4 + 32*13; // S_{sigma_1}(xi) + uint16 constant pEval_s2 = 4 + 32*14; // S_{sigma_2}(xi) + uint16 constant pEval_s3 = 4 + 32*15; // S_{sigma_3}(xi) + uint16 constant pEval_a = 4 + 32*16; // a(xi) + uint16 constant pEval_b = 4 + 32*17; // b(xi) + uint16 constant pEval_c = 4 + 32*18; // c(xi) + uint16 constant pEval_z = 4 + 32*19; // z(xi) + uint16 constant pEval_zw = 4 + 32*20; // z_omega(xi) + uint16 constant pEval_t1w = 4 + 32*21; // T_1(xi omega) + uint16 constant pEval_t2w = 4 + 32*22; // T_2(xi omega) + uint16 constant pEval_inv = 4 + 32*23; // inv(batch) sent by the prover to avoid any inverse calculation to save gas, + // we check the correctness of the inv(batch) by computing batch + // and checking inv(batch) * batch == 1 // Memory data // Challenges - uint16 constant pAlpha = 0; // alpha challenge - uint16 constant pBeta = 32; // beta challenge - uint16 constant pGamma = 64; // gamma challenge - uint16 constant pY = 96; // y challenge - uint16 constant pXiSeed = 128; // xi seed, from this value we compute xi = xiSeed^24 + uint16 constant pAlpha = 0; // alpha challenge + uint16 constant pBeta = 32; // beta challenge + uint16 constant pGamma = 64; // gamma challenge + uint16 constant pY = 96; // y challenge + uint16 constant pXiSeed = 128; // xi seed, from this value we compute xi = xiSeed^24 uint16 constant pXiSeed2 = 160; // (xi seed)^2 - uint16 constant pXi = 192; // xi challenge + uint16 constant pXi = 192; // xi challenge // Roots // S_0 = roots_8(xi) = { h_0, h_0w_8, h_0w_8^2, h_0w_8^3, h_0w_8^4, h_0w_8^5, h_0w_8^6, h_0w_8^7 } @@ -160,40 +134,40 @@ contract FflonkVerifier { uint16 constant pH3w3_1 = 736; uint16 constant pH3w3_2 = 768; - uint16 constant pPi = 800; // PI(xi) - uint16 constant pR0 = 832; // r0(y) - uint16 constant pR1 = 864; // r1(y) - uint16 constant pR2 = 896; // r2(y) + uint16 constant pPi = 800; // PI(xi) + uint16 constant pR0 = 832; // r0(y) + uint16 constant pR1 = 864; // r1(y) + uint16 constant pR2 = 896; // r2(y) - uint16 constant pF = 928; // [F]_1, 64 bytes - uint16 constant pE = 992; // [E]_1, 64 bytes - uint16 constant pJ = 1056; // [J]_1, 64 bytes + uint16 constant pF = 928; // [F]_1, 64 bytes + uint16 constant pE = 992; // [E]_1, 64 bytes + uint16 constant pJ = 1056; // [J]_1, 64 bytes - uint16 constant pZh = 1184; // Z_H(xi) + uint16 constant pZh = 1184; // Z_H(xi) // From this point we write all the variables that must be computed using the Montgomery batch inversion - uint16 constant pZhInv = 1216; // 1/Z_H(xi) - uint16 constant pDenH1 = 1248; // 1/( (y-h_1w_4) (y-h_1w_4^2) (y-h_1w_4^3) (y-h_1w_4^4) ) - uint16 constant pDenH2 = 1280; // 1/( (y-h_2w_3) (y-h_2w_3^2) (y-h_2w_3^3) (y-h_3w_3) (y-h_3w_3^2) (y-h_3w_3^3) ) + uint16 constant pZhInv = 1216; // 1/Z_H(xi) + uint16 constant pDenH1 = 1248; // 1/( (y-h_1w_4) (y-h_1w_4^2) (y-h_1w_4^3) (y-h_1w_4^4) ) + uint16 constant pDenH2 = 1280; // 1/( (y-h_2w_3) (y-h_2w_3^2) (y-h_2w_3^3) (y-h_3w_3) (y-h_3w_3^2) (y-h_3w_3^3) ) uint16 constant pLiS0Inv = 1312; // Reserve 8 * 32 bytes to compute r_0(X) uint16 constant pLiS1Inv = 1568; // Reserve 4 * 32 bytes to compute r_1(X) uint16 constant pLiS2Inv = 1696; // Reserve 6 * 32 bytes to compute r_2(X) // Lagrange evaluations - + uint16 constant pEval_l1 = 1888; - + + uint16 constant lastMem = 1920; + - function verifyProof( - bytes32[24] calldata proof, - uint256[1] calldata pubSignals - ) public view returns (bool) { + function verifyProof(bytes32[24] calldata proof, uint256[1] calldata pubSignals) public view returns (bool) { assembly { // Computes the inverse of an array of values // See https://vitalik.ca/general/2018/07/21/starks_part_3.html in section where explain fields operations // To save the inverse to be computed on chain the prover sends the inverse as an evaluation in commits.eval_inv function inverseArray(pMem) { - let pAux := mload(0x40) // Point to the next free position - let acc := mload(add(pMem, pZhInv)) // Read the first element + + let pAux := mload(0x40) // Point to the next free position + let acc := mload(add(pMem,pZhInv)) // Read the first element mstore(pAux, acc) pAux := add(pAux, 32) @@ -280,12 +254,13 @@ contract FflonkVerifier { acc := mulmod(acc, mload(add(pMem, pEval_l1)), q) mstore(pAux, acc) + let inv := calldataload(pEval_inv) // Before using the inverse sent by the prover the verifier checks inv(batch) * batch === 1 if iszero(eq(1, mulmod(acc, inv, q))) { mstore(0, 0) - return(0, 0x20) + return(0,0x20) } acc := inv @@ -398,8 +373,8 @@ contract FflonkVerifier { mstore(0, 0) return(0, 0x20) } - } - + } + // Validate all the evaluations sent by the prover ∈ F function checkInput() { // Check proof commitments fullfill bn128 curve equation Y^2 = X^3 + 3 @@ -430,22 +405,18 @@ contract FflonkVerifier { function computeChallenges(pMem, pPublic) { // Compute challenge.beta & challenge.gamma - mstore(add(pMem, 1920), C0x) - mstore(add(pMem, 1952), C0y) + mstore(add(pMem, 1920 ), C0x) + mstore(add(pMem, 1952 ), C0y) mstore(add(pMem, 1984), calldataload(pPublic)) + + - mstore(add(pMem, 2016), calldataload(pC1)) - mstore(add(pMem, 2048), calldataload(add(pC1, 32))) + mstore(add(pMem, 2016 ), calldataload(pC1)) + mstore(add(pMem, 2048 ), calldataload(add(pC1, 32))) - mstore( - add(pMem, pBeta), - mod(keccak256(add(pMem, lastMem), 160), q) - ) - mstore( - add(pMem, pGamma), - mod(keccak256(add(pMem, pBeta), 32), q) - ) + mstore(add(pMem, pBeta), mod(keccak256(add(pMem, lastMem), 160), q)) + mstore(add(pMem, pGamma), mod(keccak256(add(pMem, pBeta), 32), q)) // Get xiSeed & xiSeed2 mstore(add(pMem, lastMem), mload(add(pMem, pGamma))) @@ -457,175 +428,99 @@ contract FflonkVerifier { mstore(add(pMem, pXiSeed2), mulmod(xiSeed, xiSeed, q)) // Compute roots.S0.h0w8 - mstore( - add(pMem, pH0w8_0), - mulmod( - mload(add(pMem, pXiSeed2)), - mload(add(pMem, pXiSeed)), - q - ) - ) - mstore( - add(pMem, pH0w8_1), - mulmod(mload(add(pMem, pH0w8_0)), w8_1, q) - ) - mstore( - add(pMem, pH0w8_2), - mulmod(mload(add(pMem, pH0w8_0)), w8_2, q) - ) - mstore( - add(pMem, pH0w8_3), - mulmod(mload(add(pMem, pH0w8_0)), w8_3, q) - ) - mstore( - add(pMem, pH0w8_4), - mulmod(mload(add(pMem, pH0w8_0)), w8_4, q) - ) - mstore( - add(pMem, pH0w8_5), - mulmod(mload(add(pMem, pH0w8_0)), w8_5, q) - ) - mstore( - add(pMem, pH0w8_6), - mulmod(mload(add(pMem, pH0w8_0)), w8_6, q) - ) - mstore( - add(pMem, pH0w8_7), - mulmod(mload(add(pMem, pH0w8_0)), w8_7, q) - ) + mstore(add(pMem, pH0w8_0), mulmod(mload(add(pMem, pXiSeed2)), mload(add(pMem, pXiSeed)), q)) + mstore(add(pMem, pH0w8_1), mulmod(mload(add(pMem, pH0w8_0)), w8_1, q)) + mstore(add(pMem, pH0w8_2), mulmod(mload(add(pMem, pH0w8_0)), w8_2, q)) + mstore(add(pMem, pH0w8_3), mulmod(mload(add(pMem, pH0w8_0)), w8_3, q)) + mstore(add(pMem, pH0w8_4), mulmod(mload(add(pMem, pH0w8_0)), w8_4, q)) + mstore(add(pMem, pH0w8_5), mulmod(mload(add(pMem, pH0w8_0)), w8_5, q)) + mstore(add(pMem, pH0w8_6), mulmod(mload(add(pMem, pH0w8_0)), w8_6, q)) + mstore(add(pMem, pH0w8_7), mulmod(mload(add(pMem, pH0w8_0)), w8_7, q)) // Compute roots.S1.h1w4 - mstore( - add(pMem, pH1w4_0), - mulmod( - mload(add(pMem, pH0w8_0)), - mload(add(pMem, pH0w8_0)), - q - ) - ) - mstore( - add(pMem, pH1w4_1), - mulmod(mload(add(pMem, pH1w4_0)), w4, q) - ) - mstore( - add(pMem, pH1w4_2), - mulmod(mload(add(pMem, pH1w4_0)), w4_2, q) - ) - mstore( - add(pMem, pH1w4_3), - mulmod(mload(add(pMem, pH1w4_0)), w4_3, q) - ) + mstore(add(pMem, pH1w4_0), mulmod(mload(add(pMem, pH0w8_0)), mload(add(pMem, pH0w8_0)), q)) + mstore(add(pMem, pH1w4_1), mulmod(mload(add(pMem, pH1w4_0)), w4, q)) + mstore(add(pMem, pH1w4_2), mulmod(mload(add(pMem, pH1w4_0)), w4_2, q)) + mstore(add(pMem, pH1w4_3), mulmod(mload(add(pMem, pH1w4_0)), w4_3, q)) // Compute roots.S2.h2w3 - mstore( - add(pMem, pH2w3_0), - mulmod( - mload(add(pMem, pH1w4_0)), - mload(add(pMem, pXiSeed2)), - q - ) - ) - mstore( - add(pMem, pH2w3_1), - mulmod(mload(add(pMem, pH2w3_0)), w3, q) - ) - mstore( - add(pMem, pH2w3_2), - mulmod(mload(add(pMem, pH2w3_0)), w3_2, q) - ) + mstore(add(pMem, pH2w3_0), mulmod(mload(add(pMem, pH1w4_0)), mload(add(pMem, pXiSeed2)), q)) + mstore(add(pMem, pH2w3_1), mulmod(mload(add(pMem, pH2w3_0)), w3, q)) + mstore(add(pMem, pH2w3_2), mulmod(mload(add(pMem, pH2w3_0)), w3_2, q)) // Compute roots.S2.h2w3 - mstore( - add(pMem, pH3w3_0), - mulmod(mload(add(pMem, pH2w3_0)), wr, q) - ) - mstore( - add(pMem, pH3w3_1), - mulmod(mload(add(pMem, pH3w3_0)), w3, q) - ) - mstore( - add(pMem, pH3w3_2), - mulmod(mload(add(pMem, pH3w3_0)), w3_2, q) - ) - - let xin := mulmod( - mulmod( - mload(add(pMem, pH2w3_0)), - mload(add(pMem, pH2w3_0)), - q - ), - mload(add(pMem, pH2w3_0)), - q - ) + mstore(add(pMem, pH3w3_0), mulmod(mload(add(pMem, pH2w3_0)), wr, q)) + mstore(add(pMem, pH3w3_1), mulmod(mload(add(pMem, pH3w3_0)), w3, q)) + mstore(add(pMem, pH3w3_2), mulmod(mload(add(pMem, pH3w3_0)), w3_2, q)) + + let xin := mulmod(mulmod(mload(add(pMem, pH2w3_0)), mload(add(pMem, pH2w3_0)), q), mload(add(pMem, pH2w3_0)), q) mstore(add(pMem, pXi), xin) // Compute xi^n - - xin := mulmod(xin, xin, q) - - xin := mulmod(xin, xin, q) - - xin := mulmod(xin, xin, q) - - xin := mulmod(xin, xin, q) - - xin := mulmod(xin, xin, q) - - xin := mulmod(xin, xin, q) - - xin := mulmod(xin, xin, q) - - xin := mulmod(xin, xin, q) - - xin := mulmod(xin, xin, q) - - xin := mulmod(xin, xin, q) - - xin := mulmod(xin, xin, q) - - xin := mulmod(xin, xin, q) - - xin := mulmod(xin, xin, q) - - xin := mulmod(xin, xin, q) - - xin := mulmod(xin, xin, q) - - xin := mulmod(xin, xin, q) - - xin := mulmod(xin, xin, q) - - xin := mulmod(xin, xin, q) - - xin := mulmod(xin, xin, q) - - xin := mulmod(xin, xin, q) - - xin := mulmod(xin, xin, q) - - xin := mulmod(xin, xin, q) - - xin := mulmod(xin, xin, q) - - xin := mulmod(xin, xin, q) - - xin := mod(add(sub(xin, 1), q), q) + + xin:= mulmod(xin, xin, q) + + xin:= mulmod(xin, xin, q) + + xin:= mulmod(xin, xin, q) + + xin:= mulmod(xin, xin, q) + + xin:= mulmod(xin, xin, q) + + xin:= mulmod(xin, xin, q) + + xin:= mulmod(xin, xin, q) + + xin:= mulmod(xin, xin, q) + + xin:= mulmod(xin, xin, q) + + xin:= mulmod(xin, xin, q) + + xin:= mulmod(xin, xin, q) + + xin:= mulmod(xin, xin, q) + + xin:= mulmod(xin, xin, q) + + xin:= mulmod(xin, xin, q) + + xin:= mulmod(xin, xin, q) + + xin:= mulmod(xin, xin, q) + + xin:= mulmod(xin, xin, q) + + xin:= mulmod(xin, xin, q) + + xin:= mulmod(xin, xin, q) + + xin:= mulmod(xin, xin, q) + + xin:= mulmod(xin, xin, q) + + xin:= mulmod(xin, xin, q) + + xin:= mulmod(xin, xin, q) + + xin:= mulmod(xin, xin, q) + + + xin:= mod(add(sub(xin, 1), q), q) mstore(add(pMem, pZh), xin) - mstore(add(pMem, pZhInv), xin) // We will invert later together with lagrange pols + mstore(add(pMem, pZhInv), xin) // We will invert later together with lagrange pols // Compute challenge.alpha mstore(add(pMem, lastMem), xiSeed) calldatacopy(add(pMem, 1952), pEval_ql, 480) - mstore( - add(pMem, pAlpha), - mod(keccak256(add(pMem, lastMem), 512), q) - ) + mstore(add(pMem, pAlpha), mod(keccak256(add(pMem, lastMem), 512), q)) // Compute challenge.y mstore(add(pMem, lastMem), mload(add(pMem, pAlpha))) - mstore(add(pMem, 1952), calldataload(pW1)) - mstore(add(pMem, 1984), calldataload(add(pW1, 32))) + mstore(add(pMem, 1952 ), calldataload(pW1)) + mstore(add(pMem, 1984 ), calldataload(add(pW1, 32))) mstore(add(pMem, pY), mod(keccak256(add(pMem, lastMem), 96), q)) } @@ -639,120 +534,49 @@ contract FflonkVerifier { den1 := mulmod(den1, root0, q) den1 := mulmod(den1, root0, q) den1 := mulmod(den1, root0, q) - + den1 := mulmod(8, den1, q) - let den2 := mload( - add(pMem, add(pH0w8_0, mul(mod(mul(7, 0), 8), 32))) - ) - let den3 := addmod( - y, - mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(0, 32))))), q), - q - ) - - mstore( - add(pMem, add(pLiS0Inv, 0)), - mulmod(den1, mulmod(den2, den3, q), q) - ) - - den2 := mload( - add(pMem, add(pH0w8_0, mul(mod(mul(7, 1), 8), 32))) - ) - den3 := addmod( - y, - mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(1, 32))))), q), - q - ) - - mstore( - add(pMem, add(pLiS0Inv, 32)), - mulmod(den1, mulmod(den2, den3, q), q) - ) - - den2 := mload( - add(pMem, add(pH0w8_0, mul(mod(mul(7, 2), 8), 32))) - ) - den3 := addmod( - y, - mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(2, 32))))), q), - q - ) - - mstore( - add(pMem, add(pLiS0Inv, 64)), - mulmod(den1, mulmod(den2, den3, q), q) - ) - - den2 := mload( - add(pMem, add(pH0w8_0, mul(mod(mul(7, 3), 8), 32))) - ) - den3 := addmod( - y, - mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(3, 32))))), q), - q - ) - - mstore( - add(pMem, add(pLiS0Inv, 96)), - mulmod(den1, mulmod(den2, den3, q), q) - ) - - den2 := mload( - add(pMem, add(pH0w8_0, mul(mod(mul(7, 4), 8), 32))) - ) - den3 := addmod( - y, - mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(4, 32))))), q), - q - ) - - mstore( - add(pMem, add(pLiS0Inv, 128)), - mulmod(den1, mulmod(den2, den3, q), q) - ) - - den2 := mload( - add(pMem, add(pH0w8_0, mul(mod(mul(7, 5), 8), 32))) - ) - den3 := addmod( - y, - mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(5, 32))))), q), - q - ) - - mstore( - add(pMem, add(pLiS0Inv, 160)), - mulmod(den1, mulmod(den2, den3, q), q) - ) - - den2 := mload( - add(pMem, add(pH0w8_0, mul(mod(mul(7, 6), 8), 32))) - ) - den3 := addmod( - y, - mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(6, 32))))), q), - q - ) - - mstore( - add(pMem, add(pLiS0Inv, 192)), - mulmod(den1, mulmod(den2, den3, q), q) - ) - - den2 := mload( - add(pMem, add(pH0w8_0, mul(mod(mul(7, 7), 8), 32))) - ) - den3 := addmod( - y, - mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(7, 32))))), q), - q - ) - - mstore( - add(pMem, add(pLiS0Inv, 224)), - mulmod(den1, mulmod(den2, den3, q), q) - ) + let den2 := mload(add(pMem, add(pH0w8_0, mul(mod(mul(7, 0), 8), 32)))) + let den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(0, 32))))), q), q) + + mstore(add(pMem, add(pLiS0Inv, 0)), mulmod(den1, mulmod(den2, den3, q), q)) + + den2 := mload(add(pMem, add(pH0w8_0, mul(mod(mul(7, 1), 8), 32)))) + den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(1, 32))))), q), q) + + mstore(add(pMem, add(pLiS0Inv, 32)), mulmod(den1, mulmod(den2, den3, q), q)) + + den2 := mload(add(pMem, add(pH0w8_0, mul(mod(mul(7, 2), 8), 32)))) + den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(2, 32))))), q), q) + + mstore(add(pMem, add(pLiS0Inv, 64)), mulmod(den1, mulmod(den2, den3, q), q)) + + den2 := mload(add(pMem, add(pH0w8_0, mul(mod(mul(7, 3), 8), 32)))) + den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(3, 32))))), q), q) + + mstore(add(pMem, add(pLiS0Inv, 96)), mulmod(den1, mulmod(den2, den3, q), q)) + + den2 := mload(add(pMem, add(pH0w8_0, mul(mod(mul(7, 4), 8), 32)))) + den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(4, 32))))), q), q) + + mstore(add(pMem, add(pLiS0Inv, 128)), mulmod(den1, mulmod(den2, den3, q), q)) + + den2 := mload(add(pMem, add(pH0w8_0, mul(mod(mul(7, 5), 8), 32)))) + den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(5, 32))))), q), q) + + mstore(add(pMem, add(pLiS0Inv, 160)), mulmod(den1, mulmod(den2, den3, q), q)) + + den2 := mload(add(pMem, add(pH0w8_0, mul(mod(mul(7, 6), 8), 32)))) + den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(6, 32))))), q), q) + + mstore(add(pMem, add(pLiS0Inv, 192)), mulmod(den1, mulmod(den2, den3, q), q)) + + den2 := mload(add(pMem, add(pH0w8_0, mul(mod(mul(7, 7), 8), 32)))) + den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(7, 32))))), q), q) + + mstore(add(pMem, add(pLiS0Inv, 224)), mulmod(den1, mulmod(den2, den3, q), q)) + } function computeLiS1(pMem) { @@ -761,172 +585,67 @@ contract FflonkVerifier { let den1 := 1 den1 := mulmod(den1, root0, q) den1 := mulmod(den1, root0, q) - + den1 := mulmod(4, den1, q) - let den2 := mload( - add(pMem, add(pH1w4_0, mul(mod(mul(3, 0), 4), 32))) - ) - let den3 := addmod( - y, - mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(0, 32))))), q), - q - ) - - mstore( - add(pMem, add(pLiS1Inv, 0)), - mulmod(den1, mulmod(den2, den3, q), q) - ) - - den2 := mload( - add(pMem, add(pH1w4_0, mul(mod(mul(3, 1), 4), 32))) - ) - den3 := addmod( - y, - mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(1, 32))))), q), - q - ) - - mstore( - add(pMem, add(pLiS1Inv, 32)), - mulmod(den1, mulmod(den2, den3, q), q) - ) - - den2 := mload( - add(pMem, add(pH1w4_0, mul(mod(mul(3, 2), 4), 32))) - ) - den3 := addmod( - y, - mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(2, 32))))), q), - q - ) - - mstore( - add(pMem, add(pLiS1Inv, 64)), - mulmod(den1, mulmod(den2, den3, q), q) - ) - - den2 := mload( - add(pMem, add(pH1w4_0, mul(mod(mul(3, 3), 4), 32))) - ) - den3 := addmod( - y, - mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(3, 32))))), q), - q - ) - - mstore( - add(pMem, add(pLiS1Inv, 96)), - mulmod(den1, mulmod(den2, den3, q), q) - ) + let den2 := mload(add(pMem, add(pH1w4_0, mul(mod(mul(3, 0), 4), 32)))) + let den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(0, 32))))), q), q) + + mstore(add(pMem, add(pLiS1Inv, 0)), mulmod(den1, mulmod(den2, den3, q), q)) + + den2 := mload(add(pMem, add(pH1w4_0, mul(mod(mul(3, 1), 4), 32)))) + den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(1, 32))))), q), q) + + mstore(add(pMem, add(pLiS1Inv, 32)), mulmod(den1, mulmod(den2, den3, q), q)) + + den2 := mload(add(pMem, add(pH1w4_0, mul(mod(mul(3, 2), 4), 32)))) + den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(2, 32))))), q), q) + + mstore(add(pMem, add(pLiS1Inv, 64)), mulmod(den1, mulmod(den2, den3, q), q)) + + den2 := mload(add(pMem, add(pH1w4_0, mul(mod(mul(3, 3), 4), 32)))) + den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(3, 32))))), q), q) + + mstore(add(pMem, add(pLiS1Inv, 96)), mulmod(den1, mulmod(den2, den3, q), q)) } function computeLiS2(pMem) { + let y := mload(add(pMem, pY)) - let den1 := mulmod( - mulmod(3, mload(add(pMem, pH2w3_0)), q), - addmod( - mload(add(pMem, pXi)), - mod(sub(q, mulmod(mload(add(pMem, pXi)), w1, q)), q), - q - ), - q - ) - - let den2 := mload( - add(pMem, add(pH2w3_0, mul(mod(mul(2, 0), 3), 32))) - ) - let den3 := addmod( - y, - mod(sub(q, mload(add(pMem, add(pH2w3_0, mul(0, 32))))), q), - q - ) - - mstore( - add(pMem, add(pLiS2Inv, 0)), - mulmod(den1, mulmod(den2, den3, q), q) - ) - - den2 := mload( - add(pMem, add(pH2w3_0, mul(mod(mul(2, 1), 3), 32))) - ) - den3 := addmod( - y, - mod(sub(q, mload(add(pMem, add(pH2w3_0, mul(1, 32))))), q), - q - ) - - mstore( - add(pMem, add(pLiS2Inv, 32)), - mulmod(den1, mulmod(den2, den3, q), q) - ) - - den2 := mload( - add(pMem, add(pH2w3_0, mul(mod(mul(2, 2), 3), 32))) - ) - den3 := addmod( - y, - mod(sub(q, mload(add(pMem, add(pH2w3_0, mul(2, 32))))), q), - q - ) - - mstore( - add(pMem, add(pLiS2Inv, 64)), - mulmod(den1, mulmod(den2, den3, q), q) - ) - - den1 := mulmod( - mulmod(3, mload(add(pMem, pH3w3_0)), q), - addmod( - mulmod(mload(add(pMem, pXi)), w1, q), - mod(sub(q, mload(add(pMem, pXi))), q), - q - ), - q - ) - - den2 := mload( - add(pMem, add(pH3w3_0, mul(mod(mul(2, 0), 3), 32))) - ) - den3 := addmod( - y, - mod(sub(q, mload(add(pMem, add(pH3w3_0, mul(0, 32))))), q), - q - ) - - mstore( - add(pMem, add(pLiS2Inv, 96)), - mulmod(den1, mulmod(den2, den3, q), q) - ) - - den2 := mload( - add(pMem, add(pH3w3_0, mul(mod(mul(2, 1), 3), 32))) - ) - den3 := addmod( - y, - mod(sub(q, mload(add(pMem, add(pH3w3_0, mul(1, 32))))), q), - q - ) - - mstore( - add(pMem, add(pLiS2Inv, 128)), - mulmod(den1, mulmod(den2, den3, q), q) - ) - - den2 := mload( - add(pMem, add(pH3w3_0, mul(mod(mul(2, 2), 3), 32))) - ) - den3 := addmod( - y, - mod(sub(q, mload(add(pMem, add(pH3w3_0, mul(2, 32))))), q), - q - ) - - mstore( - add(pMem, add(pLiS2Inv, 160)), - mulmod(den1, mulmod(den2, den3, q), q) - ) + let den1 := mulmod(mulmod(3,mload(add(pMem, pH2w3_0)),q), addmod(mload(add(pMem, pXi)) ,mod(sub(q, mulmod(mload(add(pMem, pXi)), w1 ,q)), q), q), q) + + let den2 := mload(add(pMem, add(pH2w3_0, mul(mod(mul(2, 0), 3), 32)))) + let den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH2w3_0, mul(0, 32))))), q), q) + + mstore(add(pMem, add(pLiS2Inv, 0)), mulmod(den1, mulmod(den2, den3, q), q)) + + den2 := mload(add(pMem, add(pH2w3_0, mul(mod(mul(2, 1), 3), 32)))) + den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH2w3_0, mul(1, 32))))), q), q) + + mstore(add(pMem, add(pLiS2Inv, 32)), mulmod(den1, mulmod(den2, den3, q), q)) + + den2 := mload(add(pMem, add(pH2w3_0, mul(mod(mul(2, 2), 3), 32)))) + den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH2w3_0, mul(2, 32))))), q), q) + + mstore(add(pMem, add(pLiS2Inv, 64)), mulmod(den1, mulmod(den2, den3, q), q)) + + den1 := mulmod(mulmod(3,mload(add(pMem, pH3w3_0)),q), addmod(mulmod(mload(add(pMem, pXi)), w1 ,q),mod(sub(q, mload(add(pMem, pXi))), q), q), q) + + den2 := mload(add(pMem, add(pH3w3_0, mul(mod(mul(2, 0), 3), 32)))) + den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH3w3_0, mul(0, 32))))), q), q) + + mstore(add(pMem, add(pLiS2Inv, 96)), mulmod(den1, mulmod(den2, den3, q), q)) + + den2 := mload(add(pMem, add(pH3w3_0, mul(mod(mul(2, 1), 3), 32)))) + den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH3w3_0, mul(1, 32))))), q), q) + + mstore(add(pMem, add(pLiS2Inv, 128)), mulmod(den1, mulmod(den2, den3, q), q)) + + den2 := mload(add(pMem, add(pH3w3_0, mul(mod(mul(2, 2), 3), 32)))) + den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH3w3_0, mul(2, 32))))), q), q) + + mstore(add(pMem, add(pLiS2Inv, 160)), mulmod(den1, mulmod(den2, den3, q), q)) } // Prepare all the denominators that must be inverted, placed them in consecutive memory addresses @@ -938,55 +657,23 @@ contract FflonkVerifier { // used in steps 10 and 11 of the verifier let y := mload(add(pMem, pY)) let w := addmod(y, mod(sub(q, mload(add(pMem, pH1w4_0))), q), q) - w := mulmod( - w, - addmod(y, mod(sub(q, mload(add(pMem, pH1w4_1))), q), q), - q - ) - w := mulmod( - w, - addmod(y, mod(sub(q, mload(add(pMem, pH1w4_2))), q), q), - q - ) - w := mulmod( - w, - addmod(y, mod(sub(q, mload(add(pMem, pH1w4_3))), q), q), - q - ) + w := mulmod(w, addmod(y, mod(sub(q, mload(add(pMem, pH1w4_1))), q), q), q) + w := mulmod(w, addmod(y, mod(sub(q, mload(add(pMem, pH1w4_2))), q), q), q) + w := mulmod(w, addmod(y, mod(sub(q, mload(add(pMem, pH1w4_3))), q), q), q) mstore(add(pMem, pDenH1), w) // 1/((y - h2) (y - h2w3) (y - h2w3_2) (y - h3) (y - h3w3) (y - h3w3_2)) w := addmod(y, mod(sub(q, mload(add(pMem, pH2w3_0))), q), q) - w := mulmod( - w, - addmod(y, mod(sub(q, mload(add(pMem, pH2w3_1))), q), q), - q - ) - w := mulmod( - w, - addmod(y, mod(sub(q, mload(add(pMem, pH2w3_2))), q), q), - q - ) - w := mulmod( - w, - addmod(y, mod(sub(q, mload(add(pMem, pH3w3_0))), q), q), - q - ) - w := mulmod( - w, - addmod(y, mod(sub(q, mload(add(pMem, pH3w3_1))), q), q), - q - ) - w := mulmod( - w, - addmod(y, mod(sub(q, mload(add(pMem, pH3w3_2))), q), q), - q - ) + w := mulmod(w, addmod(y, mod(sub(q, mload(add(pMem, pH2w3_1))), q), q), q) + w := mulmod(w, addmod(y, mod(sub(q, mload(add(pMem, pH2w3_2))), q), q), q) + w := mulmod(w, addmod(y, mod(sub(q, mload(add(pMem, pH3w3_0))), q), q), q) + w := mulmod(w, addmod(y, mod(sub(q, mload(add(pMem, pH3w3_1))), q), q), q) + w := mulmod(w, addmod(y, mod(sub(q, mload(add(pMem, pH3w3_2))), q), q), q) mstore(add(pMem, pDenH2), w) // Denominator needed in the verifier when computing L_i^{S0}(X) computeLiS0(pMem) - + // Denominator needed in the verifier when computing L_i^{S1}(X) computeLiS1(pMem) @@ -996,45 +683,27 @@ contract FflonkVerifier { // L_i where i from 1 to num public inputs, needed in step 6 and 7 of the verifier to compute L_1(xi) and PI(xi) w := 1 let xi := mload(add(pMem, pXi)) - - mstore( - add(pMem, pEval_l1), - mulmod(n, mod(add(sub(xi, w), q), q), q) - ) + + mstore(add(pMem, pEval_l1), mulmod(n, mod(add(sub(xi, w), q), q), q)) + // Execute Montgomery batched inversions of the previous prepared values - inverseArray(pMem) - } + inverseArray(pMem) } // Compute Lagrange polynomial evaluation L_i(xi) function computeLagrange(pMem) { let zh := mload(add(pMem, pZh)) let w := 1 - - mstore( - add(pMem, pEval_l1), - mulmod(mload(add(pMem, pEval_l1)), zh, q) - ) + + mstore(add(pMem, pEval_l1 ), mulmod(mload(add(pMem, pEval_l1 )), zh, q)) + } // Compute public input polynomial evaluation PI(xi) function computePi(pMem, pPub) { let pi := 0 - pi := mod( - add( - sub( - pi, - mulmod( - mload(add(pMem, pEval_l1)), - calldataload(pPub), - q - ) - ), - q - ), - q - ) - + pi := mod(add(sub(pi, mulmod(mload(add(pMem, pEval_l1)), calldataload(pPub), q)), q), q) + mstore(add(pMem, pPi), pi) } @@ -1060,446 +729,166 @@ contract FflonkVerifier { let h0w80 let c0Value let h0w8i - + // Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc + // + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3 h0w80 := mload(add(pMem, pH0w8_0)) - c0Value := addmod( - calldataload(pEval_ql), - mulmod(calldataload(pEval_qr), h0w80, q), - q - ) + c0Value := addmod(calldataload(pEval_ql), mulmod(calldataload(pEval_qr), h0w80, q), q) h0w8i := mulmod(h0w80, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_qo), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_qo), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_qm), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_qm), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_qc), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_qc), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_s1), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_s1), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_s2), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_s2), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_s3), h0w8i, q), - q - ) - - res := addmod( - res, - mulmod( - c0Value, - mulmod(num, mload(add(pMem, add(pLiS0Inv, 0))), q), - q - ), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_s3), h0w8i, q), q) + + res := addmod(res, mulmod(c0Value, mulmod(num, mload(add(pMem, add(pLiS0Inv, 0))), q), q), q) + // Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc + // + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3 h0w80 := mload(add(pMem, pH0w8_1)) - c0Value := addmod( - calldataload(pEval_ql), - mulmod(calldataload(pEval_qr), h0w80, q), - q - ) + c0Value := addmod(calldataload(pEval_ql), mulmod(calldataload(pEval_qr), h0w80, q), q) h0w8i := mulmod(h0w80, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_qo), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_qo), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_qm), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_qm), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_qc), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_qc), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_s1), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_s1), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_s2), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_s2), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_s3), h0w8i, q), - q - ) - - res := addmod( - res, - mulmod( - c0Value, - mulmod(num, mload(add(pMem, add(pLiS0Inv, 32))), q), - q - ), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_s3), h0w8i, q), q) + res := addmod(res, mulmod(c0Value, mulmod(num, mload(add(pMem, add(pLiS0Inv, 32))), q), q), q) + + // Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc + // + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3 h0w80 := mload(add(pMem, pH0w8_2)) - c0Value := addmod( - calldataload(pEval_ql), - mulmod(calldataload(pEval_qr), h0w80, q), - q - ) + c0Value := addmod(calldataload(pEval_ql), mulmod(calldataload(pEval_qr), h0w80, q), q) h0w8i := mulmod(h0w80, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_qo), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_qo), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_qm), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_qm), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_qc), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_qc), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_s1), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_s1), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_s2), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_s2), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_s3), h0w8i, q), - q - ) - - res := addmod( - res, - mulmod( - c0Value, - mulmod(num, mload(add(pMem, add(pLiS0Inv, 64))), q), - q - ), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_s3), h0w8i, q), q) + + res := addmod(res, mulmod(c0Value, mulmod(num, mload(add(pMem, add(pLiS0Inv, 64))), q), q), q) + // Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc + // + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3 h0w80 := mload(add(pMem, pH0w8_3)) - c0Value := addmod( - calldataload(pEval_ql), - mulmod(calldataload(pEval_qr), h0w80, q), - q - ) + c0Value := addmod(calldataload(pEval_ql), mulmod(calldataload(pEval_qr), h0w80, q), q) h0w8i := mulmod(h0w80, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_qo), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_qo), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_qm), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_qm), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_qc), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_qc), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_s1), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_s1), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_s2), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_s2), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_s3), h0w8i, q), - q - ) - - res := addmod( - res, - mulmod( - c0Value, - mulmod(num, mload(add(pMem, add(pLiS0Inv, 96))), q), - q - ), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_s3), h0w8i, q), q) + + res := addmod(res, mulmod(c0Value, mulmod(num, mload(add(pMem, add(pLiS0Inv, 96))), q), q), q) + // Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc + // + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3 h0w80 := mload(add(pMem, pH0w8_4)) - c0Value := addmod( - calldataload(pEval_ql), - mulmod(calldataload(pEval_qr), h0w80, q), - q - ) + c0Value := addmod(calldataload(pEval_ql), mulmod(calldataload(pEval_qr), h0w80, q), q) h0w8i := mulmod(h0w80, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_qo), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_qo), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_qm), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_qm), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_qc), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_qc), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_s1), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_s1), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_s2), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_s2), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_s3), h0w8i, q), - q - ) - - res := addmod( - res, - mulmod( - c0Value, - mulmod(num, mload(add(pMem, add(pLiS0Inv, 128))), q), - q - ), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_s3), h0w8i, q), q) + res := addmod(res, mulmod(c0Value, mulmod(num, mload(add(pMem, add(pLiS0Inv, 128))), q), q), q) + + // Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc + // + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3 h0w80 := mload(add(pMem, pH0w8_5)) - c0Value := addmod( - calldataload(pEval_ql), - mulmod(calldataload(pEval_qr), h0w80, q), - q - ) + c0Value := addmod(calldataload(pEval_ql), mulmod(calldataload(pEval_qr), h0w80, q), q) h0w8i := mulmod(h0w80, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_qo), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_qo), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_qm), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_qm), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_qc), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_qc), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_s1), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_s1), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_s2), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_s2), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_s3), h0w8i, q), - q - ) - - res := addmod( - res, - mulmod( - c0Value, - mulmod(num, mload(add(pMem, add(pLiS0Inv, 160))), q), - q - ), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_s3), h0w8i, q), q) + + res := addmod(res, mulmod(c0Value, mulmod(num, mload(add(pMem, add(pLiS0Inv, 160))), q), q), q) + // Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc + // + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3 h0w80 := mload(add(pMem, pH0w8_6)) - c0Value := addmod( - calldataload(pEval_ql), - mulmod(calldataload(pEval_qr), h0w80, q), - q - ) + c0Value := addmod(calldataload(pEval_ql), mulmod(calldataload(pEval_qr), h0w80, q), q) h0w8i := mulmod(h0w80, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_qo), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_qo), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_qm), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_qm), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_qc), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_qc), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_s1), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_s1), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_s2), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_s2), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_s3), h0w8i, q), - q - ) - - res := addmod( - res, - mulmod( - c0Value, - mulmod(num, mload(add(pMem, add(pLiS0Inv, 192))), q), - q - ), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_s3), h0w8i, q), q) + + res := addmod(res, mulmod(c0Value, mulmod(num, mload(add(pMem, add(pLiS0Inv, 192))), q), q), q) + // Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc + // + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3 h0w80 := mload(add(pMem, pH0w8_7)) - c0Value := addmod( - calldataload(pEval_ql), - mulmod(calldataload(pEval_qr), h0w80, q), - q - ) + c0Value := addmod(calldataload(pEval_ql), mulmod(calldataload(pEval_qr), h0w80, q), q) h0w8i := mulmod(h0w80, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_qo), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_qo), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_qm), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_qm), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_qc), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_qc), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_s1), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_s1), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_s2), h0w8i, q), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_s2), h0w8i, q), q) h0w8i := mulmod(h0w8i, h0w80, q) - c0Value := addmod( - c0Value, - mulmod(calldataload(pEval_s3), h0w8i, q), - q - ) - - res := addmod( - res, - mulmod( - c0Value, - mulmod(num, mload(add(pMem, add(pLiS0Inv, 224))), q), - q - ), - q - ) + c0Value := addmod(c0Value, mulmod(calldataload(pEval_s3), h0w8i, q), q) + + res := addmod(res, mulmod(c0Value, mulmod(num, mload(add(pMem, add(pLiS0Inv, 224))), q), q), q) + mstore(add(pMem, pR0), res) } @@ -1524,14 +913,10 @@ contract FflonkVerifier { let evalC := calldataload(pEval_c) t0 := mulmod(calldataload(pEval_ql), evalA, q) - t0 := addmod(t0, mulmod(calldataload(pEval_qr), evalB, q), q) - t0 := addmod( - t0, - mulmod(calldataload(pEval_qm), mulmod(evalA, evalB, q), q), - q - ) - t0 := addmod(t0, mulmod(calldataload(pEval_qo), evalC, q), q) - t0 := addmod(t0, calldataload(pEval_qc), q) + t0 := addmod(t0, mulmod(calldataload(pEval_qr), evalB, q) ,q) + t0 := addmod(t0, mulmod(calldataload(pEval_qm), mulmod(evalA, evalB, q), q) ,q) + t0 := addmod(t0, mulmod(calldataload(pEval_qo), evalC, q) ,q) + t0 := addmod(t0, calldataload(pEval_qc) ,q) t0 := addmod(t0, mload(add(pMem, pPi)), q) t0 := mulmod(t0, mload(add(pMem, pZhInv)), q) @@ -1545,25 +930,9 @@ contract FflonkVerifier { c1Value := addmod(c1Value, mulmod(h1w4, evalB, q), q) square := mulmod(h1w4, h1w4, q) c1Value := addmod(c1Value, mulmod(square, evalC, q), q) - c1Value := addmod( - c1Value, - mulmod(mulmod(square, h1w4, q), t0, q), - q - ) - - res := addmod( - res, - mulmod( - c1Value, - mulmod( - num, - mload(add(pMem, add(pLiS1Inv, mul(0, 32)))), - q - ), - q - ), - q - ) + c1Value := addmod(c1Value, mulmod(mulmod(square, h1w4, q), t0, q), q) + + res := addmod(res, mulmod(c1Value, mulmod(num, mload(add(pMem, add(pLiS1Inv, mul(0, 32)))), q), q), q) c1Value := evalA h1w4 := mload(add(pMem, pH1w4_1)) @@ -1571,25 +940,9 @@ contract FflonkVerifier { c1Value := addmod(c1Value, mulmod(h1w4, evalB, q), q) square := mulmod(h1w4, h1w4, q) c1Value := addmod(c1Value, mulmod(square, evalC, q), q) - c1Value := addmod( - c1Value, - mulmod(mulmod(square, h1w4, q), t0, q), - q - ) - - res := addmod( - res, - mulmod( - c1Value, - mulmod( - num, - mload(add(pMem, add(pLiS1Inv, mul(1, 32)))), - q - ), - q - ), - q - ) + c1Value := addmod(c1Value, mulmod(mulmod(square, h1w4, q), t0, q), q) + + res := addmod(res, mulmod(c1Value, mulmod(num, mload(add(pMem, add(pLiS1Inv, mul(1, 32)))), q), q), q) c1Value := evalA h1w4 := mload(add(pMem, pH1w4_2)) @@ -1597,25 +950,9 @@ contract FflonkVerifier { c1Value := addmod(c1Value, mulmod(h1w4, evalB, q), q) square := mulmod(h1w4, h1w4, q) c1Value := addmod(c1Value, mulmod(square, evalC, q), q) - c1Value := addmod( - c1Value, - mulmod(mulmod(square, h1w4, q), t0, q), - q - ) - - res := addmod( - res, - mulmod( - c1Value, - mulmod( - num, - mload(add(pMem, add(pLiS1Inv, mul(2, 32)))), - q - ), - q - ), - q - ) + c1Value := addmod(c1Value, mulmod(mulmod(square, h1w4, q), t0, q), q) + + res := addmod(res, mulmod(c1Value, mulmod(num, mload(add(pMem, add(pLiS1Inv, mul(2, 32)))), q), q), q) c1Value := evalA h1w4 := mload(add(pMem, pH1w4_3)) @@ -1623,25 +960,10 @@ contract FflonkVerifier { c1Value := addmod(c1Value, mulmod(h1w4, evalB, q), q) square := mulmod(h1w4, h1w4, q) c1Value := addmod(c1Value, mulmod(square, evalC, q), q) - c1Value := addmod( - c1Value, - mulmod(mulmod(square, h1w4, q), t0, q), - q - ) - - res := addmod( - res, - mulmod( - c1Value, - mulmod( - num, - mload(add(pMem, add(pLiS1Inv, mul(3, 32)))), - q - ), - q - ), - q - ) + c1Value := addmod(c1Value, mulmod(mulmod(square, h1w4, q), t0, q), q) + + res := addmod(res, mulmod(c1Value, mulmod(num, mload(add(pMem, add(pLiS1Inv, mul(3, 32)))), q), q), q) + mstore(add(pMem, pR1), res) } @@ -1664,245 +986,79 @@ contract FflonkVerifier { num2 := mulmod(y, num2, q) num2 := mulmod(y, num2, q) num2 := mulmod(y, num2, q) - num2 := mulmod( - num2, - addmod( - mulmod(mload(add(pMem, pXi)), w1, q), - mload(add(pMem, pXi)), - q - ), - q - ) + num2 := mulmod(num2, addmod(mulmod(mload(add(pMem, pXi)), w1 ,q), mload(add(pMem, pXi)), q), q) num := addmod(num, mod(sub(q, num2), q), q) - num2 := mulmod( - mulmod(mload(add(pMem, pXi)), w1, q), - mload(add(pMem, pXi)), - q - ) + num2 := mulmod(mulmod(mload(add(pMem, pXi)), w1 ,q), mload(add(pMem, pXi)), q) num := addmod(num, num2, q) let t1 let t2 - let betaXi := mulmod( - mload(add(pMem, pBeta)), - mload(add(pMem, pXi)), - q - ) + let betaXi := mulmod(mload(add(pMem, pBeta)), mload(add(pMem, pXi)), q) let gamma := mload(add(pMem, pGamma)) - t2 := addmod(calldataload(pEval_a), addmod(betaXi, gamma, q), q) - t2 := mulmod( - t2, - addmod( - calldataload(pEval_b), - addmod(mulmod(betaXi, k1, q), gamma, q), - q - ), - q - ) - t2 := mulmod( - t2, - addmod( - calldataload(pEval_c), - addmod(mulmod(betaXi, k2, q), gamma, q), - q - ), - q - ) + t2 := addmod(calldataload( pEval_a), addmod(betaXi, gamma, q) ,q) + t2 := mulmod(t2, + addmod(calldataload( pEval_b), + addmod(mulmod(betaXi, k1, q), gamma, q) ,q), q) + t2 := mulmod(t2, + addmod(calldataload( pEval_c), + addmod(mulmod(betaXi, k2, q), gamma, q) ,q), q) t2 := mulmod(t2, calldataload(pEval_z), q) //Let's use t1 as a temporal variable to save one local - t1 := addmod( - calldataload(pEval_a), - addmod( - mulmod( - mload(add(pMem, pBeta)), - calldataload(pEval_s1), - q - ), - gamma, - q - ), - q - ) - t1 := mulmod( - t1, - addmod( - calldataload(pEval_b), - addmod( - mulmod( - mload(add(pMem, pBeta)), - calldataload(pEval_s2), - q - ), - gamma, - q - ), - q - ), - q - ) - t1 := mulmod( - t1, - addmod( - calldataload(pEval_c), - addmod( - mulmod( - mload(add(pMem, pBeta)), - calldataload(pEval_s3), - q - ), - gamma, - q - ), - q - ), - q - ) + t1 := addmod(calldataload(pEval_a), addmod(mulmod(mload(add(pMem, pBeta)), calldataload(pEval_s1), q), gamma, q) ,q) + t1 := mulmod(t1, + addmod(calldataload(pEval_b), addmod(mulmod(mload(add(pMem, pBeta)), calldataload(pEval_s2), q), gamma, q) ,q), q) + t1 := mulmod(t1, + addmod(calldataload(pEval_c), addmod(mulmod(mload(add(pMem, pBeta)), calldataload(pEval_s3), q), gamma, q) ,q), q) t1 := mulmod(t1, calldataload(pEval_zw), q) - t2 := addmod(t2, mod(sub(q, t1), q), q) + t2:= addmod(t2, mod(sub(q, t1), q), q) t2 := mulmod(t2, mload(add(pMem, pZhInv)), q) // Compute T1(xi) t1 := sub(calldataload(pEval_z), 1) - t1 := mulmod(t1, mload(add(pMem, pEval_l1)), q) - t1 := mulmod(t1, mload(add(pMem, pZhInv)), q) + t1 := mulmod(t1, mload(add(pMem, pEval_l1)) ,q) + t1 := mulmod(t1, mload(add(pMem, pZhInv)) ,q) // Let's use local variable gamma to save the result - gamma := 0 - + gamma:=0 + let hw - let c2Value + let c2Value hw := mload(add(pMem, pH2w3_0)) c2Value := addmod(calldataload(pEval_z), mulmod(hw, t1, q), q) c2Value := addmod(c2Value, mulmod(mulmod(hw, hw, q), t2, q), q) - gamma := addmod( - gamma, - mulmod( - c2Value, - mulmod( - num, - mload(add(pMem, add(pLiS2Inv, mul(0, 32)))), - q - ), - q - ), - q - ) + gamma := addmod(gamma, mulmod(c2Value, mulmod(num, mload(add(pMem, add(pLiS2Inv, mul(0, 32)))), q), q), q) hw := mload(add(pMem, pH2w3_1)) c2Value := addmod(calldataload(pEval_z), mulmod(hw, t1, q), q) c2Value := addmod(c2Value, mulmod(mulmod(hw, hw, q), t2, q), q) - gamma := addmod( - gamma, - mulmod( - c2Value, - mulmod( - num, - mload(add(pMem, add(pLiS2Inv, mul(1, 32)))), - q - ), - q - ), - q - ) + gamma := addmod(gamma, mulmod(c2Value, mulmod(num, mload(add(pMem, add(pLiS2Inv, mul(1, 32)))), q), q), q) hw := mload(add(pMem, pH2w3_2)) c2Value := addmod(calldataload(pEval_z), mulmod(hw, t1, q), q) c2Value := addmod(c2Value, mulmod(mulmod(hw, hw, q), t2, q), q) - gamma := addmod( - gamma, - mulmod( - c2Value, - mulmod( - num, - mload(add(pMem, add(pLiS2Inv, mul(2, 32)))), - q - ), - q - ), - q - ) + gamma := addmod(gamma, mulmod(c2Value, mulmod(num, mload(add(pMem, add(pLiS2Inv, mul(2, 32)))), q), q), q) hw := mload(add(pMem, pH3w3_0)) - c2Value := addmod( - calldataload(pEval_zw), - mulmod(hw, calldataload(pEval_t1w), q), - q - ) - c2Value := addmod( - c2Value, - mulmod(mulmod(hw, hw, q), calldataload(pEval_t2w), q), - q - ) - gamma := addmod( - gamma, - mulmod( - c2Value, - mulmod( - num, - mload(add(pMem, add(pLiS2Inv, mul(3, 32)))), - q - ), - q - ), - q - ) + c2Value := addmod(calldataload(pEval_zw), mulmod(hw, calldataload(pEval_t1w), q), q) + c2Value := addmod(c2Value, mulmod(mulmod(hw, hw, q), calldataload(pEval_t2w), q), q) + gamma := addmod(gamma, mulmod(c2Value, mulmod(num, mload(add(pMem, add(pLiS2Inv, mul(3, 32)))), q), q), q) hw := mload(add(pMem, pH3w3_1)) - c2Value := addmod( - calldataload(pEval_zw), - mulmod(hw, calldataload(pEval_t1w), q), - q - ) - c2Value := addmod( - c2Value, - mulmod(mulmod(hw, hw, q), calldataload(pEval_t2w), q), - q - ) - gamma := addmod( - gamma, - mulmod( - c2Value, - mulmod( - num, - mload(add(pMem, add(pLiS2Inv, mul(4, 32)))), - q - ), - q - ), - q - ) + c2Value := addmod(calldataload(pEval_zw), mulmod(hw, calldataload(pEval_t1w), q), q) + c2Value := addmod(c2Value, mulmod(mulmod(hw, hw, q), calldataload(pEval_t2w), q), q) + gamma := addmod(gamma, mulmod(c2Value, mulmod(num, mload(add(pMem, add(pLiS2Inv, mul(4, 32)))), q), q), q) hw := mload(add(pMem, pH3w3_2)) - c2Value := addmod( - calldataload(pEval_zw), - mulmod(hw, calldataload(pEval_t1w), q), - q - ) - c2Value := addmod( - c2Value, - mulmod(mulmod(hw, hw, q), calldataload(pEval_t2w), q), - q - ) - gamma := addmod( - gamma, - mulmod( - c2Value, - mulmod( - num, - mload(add(pMem, add(pLiS2Inv, mul(5, 32)))), - q - ), - q - ), - q - ) + c2Value := addmod(calldataload(pEval_zw), mulmod(hw, calldataload(pEval_t1w), q), q) + c2Value := addmod(c2Value, mulmod(mulmod(hw, hw, q), calldataload(pEval_t2w), q), q) + gamma := addmod(gamma, mulmod(c2Value, mulmod(num, mload(add(pMem, add(pLiS2Inv, mul(5, 32)))), q), q), q) mstore(add(pMem, pR2), gamma) } @@ -1978,62 +1134,18 @@ contract FflonkVerifier { function computeFEJ(pMem) { // Prepare shared numerator between F, E and J to reuse it let y := mload(add(pMem, pY)) - let numerator := addmod( - y, - mod(sub(q, mload(add(pMem, pH0w8_0))), q), - q - ) - numerator := mulmod( - numerator, - addmod(y, mod(sub(q, mload(add(pMem, pH0w8_1))), q), q), - q - ) - numerator := mulmod( - numerator, - addmod(y, mod(sub(q, mload(add(pMem, pH0w8_2))), q), q), - q - ) - numerator := mulmod( - numerator, - addmod(y, mod(sub(q, mload(add(pMem, pH0w8_3))), q), q), - q - ) - numerator := mulmod( - numerator, - addmod(y, mod(sub(q, mload(add(pMem, pH0w8_4))), q), q), - q - ) - numerator := mulmod( - numerator, - addmod(y, mod(sub(q, mload(add(pMem, pH0w8_5))), q), q), - q - ) - numerator := mulmod( - numerator, - addmod(y, mod(sub(q, mload(add(pMem, pH0w8_6))), q), q), - q - ) - numerator := mulmod( - numerator, - addmod(y, mod(sub(q, mload(add(pMem, pH0w8_7))), q), q), - q - ) + let numerator := addmod(y, mod(sub(q, mload(add(pMem, pH0w8_0))), q), q) + numerator := mulmod(numerator, addmod(y, mod(sub(q, mload(add(pMem, pH0w8_1))), q), q), q) + numerator := mulmod(numerator, addmod(y, mod(sub(q, mload(add(pMem, pH0w8_2))), q), q), q) + numerator := mulmod(numerator, addmod(y, mod(sub(q, mload(add(pMem, pH0w8_3))), q), q), q) + numerator := mulmod(numerator, addmod(y, mod(sub(q, mload(add(pMem, pH0w8_4))), q), q), q) + numerator := mulmod(numerator, addmod(y, mod(sub(q, mload(add(pMem, pH0w8_5))), q), q), q) + numerator := mulmod(numerator, addmod(y, mod(sub(q, mload(add(pMem, pH0w8_6))), q), q), q) + numerator := mulmod(numerator, addmod(y, mod(sub(q, mload(add(pMem, pH0w8_7))), q), q), q) // Prepare shared quotient between F and E to reuse it - let quotient1 := mulmod( - mload(add(pMem, pAlpha)), - mulmod(numerator, mload(add(pMem, pDenH1)), q), - q - ) - let quotient2 := mulmod( - mulmod( - mload(add(pMem, pAlpha)), - mload(add(pMem, pAlpha)), - q - ), - mulmod(numerator, mload(add(pMem, pDenH2)), q), - q - ) + let quotient1 := mulmod(mload(add(pMem, pAlpha)), mulmod(numerator, mload(add(pMem, pDenH1)), q), q) + let quotient2 := mulmod(mulmod(mload(add(pMem, pAlpha)), mload(add(pMem, pAlpha)), q), mulmod(numerator, mload(add(pMem, pDenH2)), q), q) // Compute full batched polynomial commitment [F]_1 mstore(add(pMem, pF), C0x) @@ -2042,20 +1154,7 @@ contract FflonkVerifier { g1_mulAcc(add(pMem, pF), pC2, quotient2) // Compute group-encoded batch evaluation [E]_1 - g1_mulAccC( - add(pMem, pE), - G1x, - G1y, - addmod( - mload(add(pMem, pR0)), - addmod( - mulmod(quotient1, mload(add(pMem, pR1)), q), - mulmod(quotient2, mload(add(pMem, pR2)), q), - q - ), - q - ) - ) + g1_mulAccC(add(pMem, pE), G1x, G1y, addmod(mload(add(pMem, pR0)), addmod(mulmod(quotient1, mload(add(pMem, pR1)),q), mulmod(quotient2, mload(add(pMem, pR2)),q), q), q)) // Compute the full difference [J]_1 g1_mulAcc(add(pMem, pJ), pW1, numerator) @@ -2067,15 +1166,9 @@ contract FflonkVerifier { // First pairing value // Compute -E - mstore( - add(add(pMem, pE), 32), - mod(sub(qf, mload(add(add(pMem, pE), 32))), qf) - ) + mstore(add(add(pMem, pE), 32), mod(sub(qf, mload(add(add(pMem, pE), 32))), qf)) // Compute -J - mstore( - add(add(pMem, pJ), 32), - mod(sub(qf, mload(add(add(pMem, pJ), 32))), qf) - ) + mstore(add(add(pMem, pJ), 32), mod(sub(qf, mload(add(add(pMem, pJ), 32))), qf)) // F = F - E - J + y·W2 g1_acc(add(pMem, pF), add(pMem, pE)) g1_acc(add(pMem, pF), add(pMem, pJ)) @@ -2103,14 +1196,7 @@ contract FflonkVerifier { mstore(add(mIn, 320), X2y2) mstore(add(mIn, 352), X2y1) - let success := staticcall( - sub(gas(), 2000), - 8, - mIn, - 384, - mIn, - 0x20 - ) + let success := staticcall(sub(gas(), 2000), 8, mIn, 384, mIn, 0x20) isOk := and(success, mload(mIn)) } diff --git a/docs/v2/PolygonRollupManager.md b/docs/v2/PolygonRollupManager.md index aafc2bdc8..a4d987575 100644 --- a/docs/v2/PolygonRollupManager.md +++ b/docs/v2/PolygonRollupManager.md @@ -618,35 +618,6 @@ Get forced batch fee -### 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( @@ -757,33 +728,6 @@ Get rollup sequence pending state struct given a batch number |`rollupID` | uint32 | Rollup identifier |`batchNum` | uint64 | Batch number -### getRollupBatchNumToStateRoot -```solidity - 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 - - - ## Events ### AddNewRollupType ```solidity diff --git a/docs/v2/PolygonZkEVMBridgeV2.md b/docs/v2/PolygonZkEVMBridgeV2.md index 448789fe8..d6c70a974 100644 --- a/docs/v2/PolygonZkEVMBridgeV2.md +++ b/docs/v2/PolygonZkEVMBridgeV2.md @@ -1,19 +1,18 @@ PolygonZkEVMBridge that will be deployed on both networks Ethereum and Polygon zkEVM Contract responsible to manage the token interactions with other networks -## Functions +## Functions ### constructor - ```solidity function constructor( ) public ``` - Disable initalizers on the implementation following the best practices -### initialize + +### initialize ```solidity function initialize( uint32 _networkID, @@ -23,22 +22,20 @@ Disable initalizers on the implementation following the best practices address _polygonRollupManager ) external ``` - The value of `_polygonRollupManager` on the L2 deployment of the contract will be address(0), so emergency state is not possible for the L2 deployment of the bridge, intentionally #### Parameters: +| 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 -| 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 | ### bridgeAsset - ```solidity function bridgeAsset( uint32 destinationNetwork, @@ -49,7 +46,6 @@ emergency state is not possible for the L2 deployment of the bridge, intentional bytes permitData ) 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. @@ -57,19 +53,18 @@ Therefore we recommend to third parties bridges that if they do implement reentr do not call any external address in that case note User/UI must be aware of the existing/available networks when choosing the destination network -#### Parameters: -| Name | Type | Description | -| :-------------------------- | :------ | :------------------------------------------------------ | -| `destinationNetwork` | uint32 | Network destination | -| `destinationAddress` | address | Address destination | -| `amount` | uint256 | Amount of tokens | -| `token` | address | Token address, 0 address is reserved for ether | -| `forceUpdateGlobalExitRoot` | bool | Indicates if the new global exit root is updated or not | -| `permitData` | bytes | Raw data of the call `permit` of the token | +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`destinationNetwork` | uint32 | Network destination +|`destinationAddress` | address | Address destination +|`amount` | uint256 | Amount of tokens +|`token` | address | Token address, 0 address is reserved for ether +|`forceUpdateGlobalExitRoot` | bool | Indicates if the new global exit root is updated or not +|`permitData` | bytes | Raw data of the call `permit` of the token ### bridgeMessage - ```solidity function bridgeMessage( uint32 destinationNetwork, @@ -78,67 +73,17 @@ note User/UI must be aware of the existing/available networks when choosing the bytes metadata ) external ``` - Bridge message and send ETH value note User/UI must be aware of the existing/available networks when choosing the destination network -#### Parameters: - -| Name | Type | Description | -| :-------------------------- | :------ | :------------------------------------------------------ | -| `destinationNetwork` | uint32 | Network destination | -| `destinationAddress` | address | Address destination | -| `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 -note User/UI must be aware of the existing/available networks when choosing the destination network #### 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 | +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`destinationNetwork` | uint32 | Network destination +|`destinationAddress` | address | Address destination +|`forceUpdateGlobalExitRoot` | bool | Indicates if the new global exit root is updated or not +|`metadata` | bytes | Message metadata ### bridgeMessageWETH ```solidity @@ -151,6 +96,7 @@ Bridge message and send ETH value ) external ``` Bridge message and send ETH value +note User/UI must be aware of the existing/available networks when choosing the destination network #### Parameters: @@ -185,7 +131,6 @@ Bridge message and send ETH value |`metadata` | bytes | Message metadata ### claimAsset - ```solidity function claimAsset( bytes32[32] smtProofLocalExitRoot, @@ -201,19 +146,17 @@ Bridge message and send ETH value bytes metadata ) external ``` - Verify merkle proof and withdraw tokens/ether -#### Parameters: - -| Name | Type | Description | -| :----------------------- | :---------- | :------------------------------------------------------------------- | -------------- | -| `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: | -| 191 bits | 1 bit | 32 bits | 32 bits | -| 0 | mainnetFlag | rollupIndex | localRootIndex | +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`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: +| 191 bits | 1 bit | 32 bits | 32 bits | +| 0 | mainnetFlag | rollupIndex | localRootIndex | 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 @@ -221,14 +164,13 @@ to avoid possible synch attacks |`mainnetExitRoot` | bytes32 | Mainnet exit root |`rollupExitRoot` | bytes32 | Rollup exit root |`originNetwork` | uint32 | Origin network -|`originTokenAddress` | address | Origin token address, 0 address is reserved for ether +|`originTokenAddress` | address | Origin token address, 0 address is reserved for ether |`destinationNetwork` | uint32 | Network destination |`destinationAddress` | address | Address destination |`amount` | uint256 | Amount of tokens |`metadata` | bytes | Abi encoded metadata if any, empty otherwise ### claimMessage - ```solidity function claimMessage( bytes32[32] smtProofLocalExitRoot, @@ -244,22 +186,20 @@ to avoid possible synch attacks bytes metadata ) external ``` - Verify merkle proof and execute message If the receiving address is an EOA, the call will result as a success Which means that the amount of ether will be transferred correctly, but the message will not trigger any execution -#### Parameters: - -| Name | Type | Description | -| :----------------------- | :---------- | :------------------------------------------------------------------- | -------------- | -| `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: | -| 191 bits | 1 bit | 32 bits | 32 bits | -| 0 | mainnetFlag | rollupIndex | localRootIndex | +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`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: +| 191 bits | 1 bit | 32 bits | 32 bits | +| 0 | mainnetFlag | rollupIndex | localRootIndex | 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 @@ -274,7 +214,6 @@ to avoid possible synch attacks |`metadata` | bytes | Abi encoded metadata if any, empty otherwise ### precalculatedWrapperAddress - ```solidity function precalculatedWrapperAddress( uint32 originNetwork, @@ -284,62 +223,58 @@ to avoid possible synch attacks uint8 decimals ) public returns (address) ``` - Returns the precalculated address of a wrapper using the token information Note Updating the metadata of a token is not supported. Since the metadata has relevance in the address deployed, this function will not return a valid wrapped address if the metadata provided is not the original one. -#### Parameters: -| Name | Type | Description | -| :------------------- | :------ | :---------------------------------------------------- | -| `originNetwork` | uint32 | Origin network | -| `originTokenAddress` | address | Origin token address, 0 address is reserved for ether | -| `name` | string | Name of the token | -| `symbol` | string | Symbol of the token | -| `decimals` | uint8 | Decimals of the token | +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`originNetwork` | uint32 | Origin network +|`originTokenAddress` | address | Origin token address, 0 address is reserved for ether +|`name` | string | Name of the token +|`symbol` | string | Symbol of the token +|`decimals` | uint8 | Decimals of the token ### getTokenWrappedAddress - ```solidity function getTokenWrappedAddress( uint32 originNetwork, address originTokenAddress ) external returns (address) ``` - Returns the address of a wrapper using the token information if already exist -#### Parameters: -| Name | Type | Description | -| :------------------- | :------ | :---------------------------------------------------- | -| `originNetwork` | uint32 | Origin network | -| `originTokenAddress` | address | Origin token address, 0 address is reserved for ether | +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`originNetwork` | uint32 | Origin network +|`originTokenAddress` | address | Origin token address, 0 address is reserved for ether ### activateEmergencyState - ```solidity function activateEmergencyState( ) external ``` - Function to activate the emergency state -" Only can be called by the Polygon ZK-EVM in extreme situations + " Only can be called by the Polygon ZK-EVM in extreme situations + -### deactivateEmergencyState +### deactivateEmergencyState ```solidity function deactivateEmergencyState( ) external ``` - Function to deactivate the emergency state -" Only can be called by the Polygon ZK-EVM + " Only can be called by the Polygon ZK-EVM + -### \_verifyLeaf +### _verifyLeaf ```solidity function _verifyLeaf( bytes32[32] smtProofLocalExitRoot, @@ -350,178 +285,160 @@ Function to deactivate the emergency state bytes32 leafValue ) internal ``` - Verify leaf and checks that it has not been claimed -#### Parameters: -| Name | Type | Description | -| :----------------------- | :---------- | :---------------- | -| `smtProofLocalExitRoot` | bytes32[32] | Smt proof | -| `smtProofRollupExitRoot` | bytes32[32] | Smt proof | -| `globalIndex` | uint256 | Index of the leaf | -| `mainnetExitRoot` | bytes32 | Mainnet exit root | -| `rollupExitRoot` | bytes32 | Rollup exit root | -| `leafValue` | bytes32 | leaf value | +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`smtProofLocalExitRoot` | bytes32[32] | Smt proof +|`smtProofRollupExitRoot` | bytes32[32] | Smt proof +|`globalIndex` | uint256 | Index of the leaf +|`mainnetExitRoot` | bytes32 | Mainnet exit root +|`rollupExitRoot` | bytes32 | Rollup exit root +|`leafValue` | bytes32 | leaf value ### isClaimed - ```solidity function isClaimed( uint32 leafIndex, uint32 sourceBridgeNetwork ) external returns (bool) ``` - Function to check if an index is claimed or not -#### Parameters: -| Name | Type | Description | -| :-------------------- | :----- | :------------- | -| `leafIndex` | uint32 | Index | -| `sourceBridgeNetwork` | uint32 | Origin network | +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`leafIndex` | uint32 | Index +|`sourceBridgeNetwork` | uint32 | Origin network ### updateGlobalExitRoot - ```solidity function updateGlobalExitRoot( ) external ``` - Function to update the globalExitRoot if the last deposit is not submitted -### \_updateGlobalExitRoot + +### _updateGlobalExitRoot ```solidity function _updateGlobalExitRoot( ) internal ``` - Function to update the globalExitRoot -### \_permit + +### _permit ```solidity function _permit( address amount, uint256 permitData ) internal ``` +Function to call token permit method of extended ERC20 + + @param token ERC20 token address -Function to call token permit method of extended ERC20 + @param token ERC20 token address #### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`amount` | address | Quantity that is expected to be allowed +|`permitData` | uint256 | Raw data of the call `permit` of the token -| Name | Type | Description | -| :----------- | :------ | :----------------------------------------- | -| `amount` | address | Quantity that is expected to be allowed | -| `permitData` | uint256 | Raw data of the call `permit` of the token | - -### \_deployWrappedToken - +### _deployWrappedToken ```solidity function _deployWrappedToken( bytes32 salt, bytes constructorArgs ) internal returns (contract TokenWrapped newWrappedToken) ``` - Internal function that uses create2 to deploy the wrapped tokens -#### Parameters: - -| Name | Type | Description | -| :----- | :------ | :--------------------------- | -| `salt` | bytes32 | Salt used in create2 params, | +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`salt` | bytes32 | Salt used in create2 params, tokenInfoHash will be used as salt for all wrappeds except for bridge native WETH, that will be bytes32(0) |`constructorArgs` | bytes | Encoded constructor args for the wrapped token -### \_safeSymbol - +### _safeSymbol ```solidity function _safeSymbol( address token ) internal returns (string) ``` - Provides a safe ERC20.symbol version which returns 'NO_SYMBOL' as fallback string -#### Parameters: - -| Name | Type | Description | -| :------ | :------ | :--------------------------------------- | -| `token` | address | The address of the ERC-20 token contract | -### \_safeName +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`token` | address | The address of the ERC-20 token contract +### _safeName ```solidity function _safeName( address token ) internal returns (string) ``` + Provides a safe ERC20.name version which returns 'NO_NAME' as fallback string. -Provides a safe ERC20.name version which returns 'NO_NAME' as fallback string. #### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`token` | address | The address of the ERC-20 token contract. -| Name | Type | Description | -| :------ | :------ | :---------------------------------------- | -| `token` | address | The address of the ERC-20 token contract. | - -### \_safeDecimals - +### _safeDecimals ```solidity function _safeDecimals( address token ) internal returns (uint8) ``` - Provides a safe ERC20.decimals version which returns '18' as fallback value. Note Tokens with (decimals > 255) are not supported -#### Parameters: -| Name | Type | Description | -| :------ | :------ | :--------------------------------------- | -| `token` | address | The address of the ERC-20 token contract | - -### \_returnDataToString +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`token` | address | The address of the ERC-20 token contract +### _returnDataToString ```solidity function _returnDataToString( bytes data ) internal returns (string) ``` - Function to convert returned data to string returns 'NOT_VALID_ENCODING' as fallback value. -#### Parameters: -| Name | Type | Description | -| :----- | :---- | :------------ | -| `data` | bytes | returned data | +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`data` | bytes | returned data ### getTokenMetadata - ```solidity function getTokenMetadata( address token ) public returns (bytes) ``` - Returns the encoded token metadata -#### Parameters: -| Name | Type | Description | -| :------ | :------ | :------------------- | -| `token` | address | Address of the token | +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`token` | address | Address of the token ### calculateTokenWrapperAddress - ```solidity function calculateTokenWrapperAddress( uint32 originNetwork, @@ -529,24 +446,21 @@ Returns the encoded token metadata address token ) external returns (address) ``` - Returns the precalculated address of a wrapper using the token address Note Updating the metadata of a token is not supported. Since the metadata has relevance in the address deployed, this function will not return a valid wrapped address if the metadata provided is not the original one. -#### Parameters: -| Name | Type | Description | -| :------------------- | :------ | :---------------------------------------------------- | -| `originNetwork` | uint32 | Origin network | -| `originTokenAddress` | address | Origin token address, 0 address is reserved for ether | -| `token` | address | Address of the token to calculate the wrapper address | +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`originNetwork` | uint32 | Origin network +|`originTokenAddress` | address | Origin token address, 0 address is reserved for ether +|`token` | address | Address of the token to calculate the wrapper address ## Events - ### BridgeEvent - ```solidity event BridgeEvent( ) @@ -555,7 +469,6 @@ wrapped address if the metadata provided is not the original one. Emitted when bridge assets or messages to another network ### ClaimEvent - ```solidity event ClaimEvent( ) @@ -564,10 +477,10 @@ Emitted when bridge assets or messages to another network Emitted when a claim is done from another network ### NewWrappedToken - ```solidity event NewWrappedToken( ) ``` Emitted when a new wrapped token is created + diff --git a/test/contracts/bridge.test.js b/test/contracts/bridge.test.js index 6f3e8ce61..d88714fda 100644 --- a/test/contracts/bridge.test.js +++ b/test/contracts/bridge.test.js @@ -133,7 +133,7 @@ describe('PolygonZkEVMBridge Contract', () => { expect(await polygonZkEVMBridgeContract.lastUpdatedDepositCount()).to.be.equal(1); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); + const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); expect(rootSCMainnet).to.be.equal(rootJSMainnet); // check merkle proof @@ -194,7 +194,7 @@ describe('PolygonZkEVMBridge Contract', () => { ); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); + const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); expect(rootSCMainnet).to.be.equal(rootJSMainnet); // check merkle proof @@ -260,7 +260,7 @@ describe('PolygonZkEVMBridge Contract', () => { expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(ethers.ZeroHash); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); + const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); expect(rootSCMainnet).to.be.equal(rootJSMainnet); // Update global exit root @@ -666,7 +666,7 @@ describe('PolygonZkEVMBridge Contract', () => { expect(await newWrappedToken.balanceOf(polygonZkEVMBridgeContract.target)).to.be.equal(0); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); + const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); expect(rootSCMainnet).to.be.equal(rootJSMainnet); // check merkle proof @@ -797,7 +797,7 @@ describe('PolygonZkEVMBridge Contract', () => { }); // Check merkle root with SC - const rootSC = await polygonZkEVMBridgeContract.getRoot(); + const rootSC = await polygonZkEVMBridgeContract.getDepositRoot(); const rootJS = merkleTree.getRoot(); expect(rootSC).to.be.equal(rootJS); diff --git a/test/contracts/bridgeMock.test.js b/test/contracts/bridgeMock.test.js index b34c8fa68..7c3c583c1 100644 --- a/test/contracts/bridgeMock.test.js +++ b/test/contracts/bridgeMock.test.js @@ -110,7 +110,7 @@ describe('PolygonZkEVMBridge Mock Contract', () => { expect(await tokenContract.balanceOf(polygonZkEVMBridgeContract.address)).to.be.equal(balanceBridge.add(amount)); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); + const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); expect(rootSCMainnet).to.be.equal(rootJSMainnet); // check merkle proof diff --git a/test/contracts/bridge_metadata.test.js b/test/contracts/bridge_metadata.test.js index d77a424da..25e2c1d1a 100644 --- a/test/contracts/bridge_metadata.test.js +++ b/test/contracts/bridge_metadata.test.js @@ -104,7 +104,7 @@ describe('PolygonZkEVMBridge Contract werid metadata', () => { .to.emit(polygonZkEVMBridgeContract, 'BridgeEvent') .withArgs(LEAF_TYPE_ASSET, originNetwork, tokenAddress, destinationNetwork, destinationAddress, amount, metadata, depositCount); - expect(await polygonZkEVMBridgeContract.getRoot()).to.be.equal(rootJSMainnet); + expect(await polygonZkEVMBridgeContract.getDepositRoot()).to.be.equal(rootJSMainnet); }); it('should PolygonZkEVMBridge with weird token metadata with reverts', async () => { @@ -170,7 +170,7 @@ describe('PolygonZkEVMBridge Contract werid metadata', () => { .to.emit(polygonZkEVMBridgeContract, 'BridgeEvent') .withArgs(LEAF_TYPE_ASSET, originNetwork, tokenAddress, destinationNetwork, destinationAddress, amount, metadata, depositCount); - expect(await polygonZkEVMBridgeContract.getRoot()).to.be.equal(rootJSMainnet); + expect(await polygonZkEVMBridgeContract.getDepositRoot()).to.be.equal(rootJSMainnet); }); it('should PolygonZkEVMBridge with weird token metadata with empty data', async () => { @@ -231,6 +231,6 @@ describe('PolygonZkEVMBridge Contract werid metadata', () => { .to.emit(polygonZkEVMBridgeContract, 'BridgeEvent') .withArgs(LEAF_TYPE_ASSET, originNetwork, tokenAddress, destinationNetwork, destinationAddress, amount, metadata, depositCount); - expect(await polygonZkEVMBridgeContract.getRoot()).to.be.equal(rootJSMainnet); + expect(await polygonZkEVMBridgeContract.getDepositRoot()).to.be.equal(rootJSMainnet); }); }); diff --git a/test/contracts/bridge_permit.test.js b/test/contracts/bridge_permit.test.js index 93e43412f..e2f817a6a 100644 --- a/test/contracts/bridge_permit.test.js +++ b/test/contracts/bridge_permit.test.js @@ -136,7 +136,7 @@ describe('PolygonZkEVMBridge Contract Permit tests', () => { expect(await tokenContract.balanceOf(polygonZkEVMBridgeContract.address)).to.be.equal(balanceBridge.add(amount)); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); + const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); expect(rootSCMainnet).to.be.equal(rootJSMainnet); // check merkle proof @@ -234,7 +234,7 @@ describe('PolygonZkEVMBridge Contract Permit tests', () => { expect(await daiContract.balanceOf(polygonZkEVMBridgeContract.address)).to.be.equal(balanceBridge.add(amount)); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); + const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); expect(rootSCMainnet).to.be.equal(rootJSMainnet); // check merkle proof @@ -334,7 +334,7 @@ describe('PolygonZkEVMBridge Contract Permit tests', () => { expect(await uniContract.balanceOf(polygonZkEVMBridgeContract.address)).to.be.equal(balanceBridge.add(amount)); // check merkle root with SC - const rootSCMainnet = await polygonZkEVMBridgeContract.getRoot(); + const rootSCMainnet = await polygonZkEVMBridgeContract.getDepositRoot(); expect(rootSCMainnet).to.be.equal(rootJSMainnet); // check merkle proof diff --git a/test/contracts/depositContractMock.test.js b/test/contracts/depositContractMock.test.js index ce150c087..b40cee38a 100644 --- a/test/contracts/depositContractMock.test.js +++ b/test/contracts/depositContractMock.test.js @@ -66,7 +66,7 @@ describe('Deposit Contract', () => { merkleTree.add(leafValueJs); - const rootSC = await depositContractMock.getRoot(); + const rootSC = await depositContractMock.getDepositRoot(); const rootJS = merkleTree.getRoot(); expect(rootSC).to.be.equal(rootJS); @@ -159,7 +159,7 @@ describe('Deposit Contract', () => { merkleTree.add(leafValueJs); merkleTree.add(leafValueJs2); - const rootSC = await depositContractMock.getRoot(); + const rootSC = await depositContractMock.getDepositRoot(); const rootJS = merkleTree.getRoot(); expect(rootSC).to.be.equal(rootJS); @@ -226,7 +226,7 @@ describe('Deposit Contract', () => { merkleTree.add(leafValue); - let rootSC = await depositContractMock.getRoot(); + let rootSC = await depositContractMock.getDepositRoot(); let rootJS = merkleTree.getRoot(); expect(rootSC).to.be.equal(rootJS); @@ -279,7 +279,7 @@ describe('Deposit Contract', () => { ); merkleTree.add(leafValue); - rootSC = await depositContractMock.getRoot(); + rootSC = await depositContractMock.getDepositRoot(); rootJS = merkleTree.getRoot(); expect(rootSC).to.be.equal(rootJS); @@ -327,7 +327,7 @@ describe('Deposit Contract', () => { ); merkleTree.add(leafValue); - rootSC = await depositContractMock.getRoot(); + rootSC = await depositContractMock.getDepositRoot(); rootJS = merkleTree.getRoot(); expect(rootSC).to.be.equal(rootJS); @@ -375,7 +375,7 @@ describe('Deposit Contract', () => { } await Promise.all(results); // Check roots - rootSC = await depositContractMock.getRoot(); + rootSC = await depositContractMock.getDepositRoot(); rootJS = merkleTree.getRoot(); expect(rootSC).to.be.equal(rootJS); diff --git a/test/contracts/emergencyManager.test.js b/test/contracts/emergencyManager.test.js index d41d11d1e..5daeb7b71 100644 --- a/test/contracts/emergencyManager.test.js +++ b/test/contracts/emergencyManager.test.js @@ -144,6 +144,7 @@ describe('Emergency mode test', () => { // Once in emergency state no sequenceBatches/forceBatches can be done const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.batchFee(); + const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const sequence = { transactions: l2txData, diff --git a/test/contracts/globalExitRootManager.test.js b/test/contracts/globalExitRootManager.test.js index 1392d914c..17f5bc2a7 100644 --- a/test/contracts/globalExitRootManager.test.js +++ b/test/contracts/globalExitRootManager.test.js @@ -5,10 +5,6 @@ function calculateGlobalExitRoot(mainnetExitRoot, rollupExitRoot) { return ethers.solidityPackedKeccak256(['bytes32', 'bytes32'], [mainnetExitRoot, rollupExitRoot]); } const zero32bytes = '0x0000000000000000000000000000000000000000000000000000000000000000'; -const MerkleTreeBridge = require('@0xpolygonhermez/zkevm-commonjs').MTBridge; -const { - verifyMerkleProof, -} = require('@0xpolygonhermez/zkevm-commonjs').mtBridgeUtils; describe('Global Exit Root', () => { let rollup; @@ -34,7 +30,6 @@ describe('Global Exit Root', () => { expect(await polygonZkEVMGlobalExitRoot.bridgeAddress()).to.be.equal(PolygonZkEVMBridge.address); expect(await polygonZkEVMGlobalExitRoot.lastRollupExitRoot()).to.be.equal(zero32bytes); expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(zero32bytes); - expect(await polygonZkEVMGlobalExitRoot.depositCount()).to.be.equal(0); }); it('should update root and check global exit root', async () => { @@ -49,31 +44,7 @@ describe('Global Exit Root', () => { .withArgs(zero32bytes, newRootRollup); expect(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()) - .to.be.equal(newRootGlobalExitRoot); - - // compute root merkle tree in Js - const height = 32; - const merkleTree = new MerkleTreeBridge(height); - merkleTree.add(newRootGlobalExitRoot); - - const rootSC = await polygonZkEVMGlobalExitRoot.getRoot(); - const rootJS = merkleTree.getRoot(); - - expect(rootSC).to.be.equal(rootJS); - - // check merkle proof - const index = 0; - const proof = merkleTree.getProofTreeByIndex(index); - - // verify merkle proof - expect(verifyMerkleProof(newRootGlobalExitRoot, proof, index, rootSC)).to.be.equal(true); - - expect(await polygonZkEVMGlobalExitRoot.verifyMerkleProof( - newRootGlobalExitRoot, - proof, - index, - rootSC, - )).to.be.equal(true); + .to.be.equal(calculateGlobalExitRoot(zero32bytes, newRootRollup)); // Update root from the PolygonZkEVMBridge const newRootBridge = ethers.hexlify(ethers.randomBytes(32)); @@ -82,28 +53,7 @@ describe('Global Exit Root', () => { .withArgs(newRootBridge, newRootRollup); expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(newRootBridge); - const newRootGlobalExitRoot2 = calculateGlobalExitRoot(newRootBridge, newRootRollup); expect(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()) - .to.be.equal(newRootGlobalExitRoot2); - - // compute root merkle tree in Js - merkleTree.add(newRootGlobalExitRoot2); - const rootSC2 = await polygonZkEVMGlobalExitRoot.getRoot(); - const rootJS2 = merkleTree.getRoot(); - expect(rootSC2).to.be.equal(rootJS2); - - // check merkle proof - const index2 = 1; - const proof2 = merkleTree.getProofTreeByIndex(index2); - - // verify merkle proof - expect(verifyMerkleProof(newRootGlobalExitRoot2, proof2, index2, rootSC2)).to.be.equal(true); - - expect(await polygonZkEVMGlobalExitRoot.verifyMerkleProof( - newRootGlobalExitRoot2, - proof2, - index2, - rootSC2, - )).to.be.equal(true); + .to.be.equal(calculateGlobalExitRoot(newRootBridge, newRootRollup)); }); }); diff --git a/test/contracts/polygonZkEVM.test.js b/test/contracts/polygonZkEVM.test.js index a405c6f3f..4d3855225 100644 --- a/test/contracts/polygonZkEVM.test.js +++ b/test/contracts/polygonZkEVM.test.js @@ -389,6 +389,7 @@ describe('Polygon ZK-EVM', () => { it('should sequence a batch as trusted sequencer', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.batchFee(); + const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const sequence = { transactions: l2txData, @@ -430,7 +431,8 @@ describe('Polygon ZK-EVM', () => { .to.emit(polygonZkEVMContract, 'SequenceBatches') .withArgs(lastBatchSequenced + 1); - const currentTimestamp = (await ethers.provider.getBlock()).timestamp; + const sequencedTimestamp = (await ethers.provider.getBlock()).timestamp; + const finalOwnerBalance = await maticTokenContract.balanceOf( await trustedSequencer.address, ); @@ -445,12 +447,12 @@ describe('Polygon ZK-EVM', () => { const batchAccInputHashJs = calculateAccInputHash( (await polygonZkEVMContract.sequencedBatches(0)).accInputHash, calculateBatchHashData(sequence.transactions), - await polygonZkEVMGlobalExitRoot.getRoot(), - currentTimestamp, + sequence.globalExitRoot, + sequence.timestamp, deployer.address, - '0x00', ); expect(batchAccInputHash).to.be.equal(batchAccInputHashJs); + expect(sequencedBatchData.sequencedTimestamp).to.be.equal(sequencedTimestamp); expect(sequencedBatchData.previousLastBatchSequenced).to.be.equal(0); }); @@ -458,6 +460,8 @@ describe('Polygon ZK-EVM', () => { const l2txData = '0x1234'; const maticAmount = (await polygonZkEVMContract.batchFee()).mul(2); + const currentTimestamp = (await ethers.provider.getBlock()).timestamp; + const sequence = { transactions: l2txData, globalExitRoot: ethers.HashZero, @@ -488,8 +492,6 @@ describe('Polygon ZK-EVM', () => { .to.emit(polygonZkEVMContract, 'SequenceBatches') .withArgs(lastBatchSequenced + 2); - const currentTimestamp = (await ethers.provider.getBlock()).timestamp; - const finalOwnerBalance = await maticTokenContract.balanceOf( await trustedSequencer.address, ); @@ -508,21 +510,21 @@ describe('Polygon ZK-EVM', () => { const sequencedBatchData2 = await polygonZkEVMContract.sequencedBatches(2); const batchAccInputHash2 = sequencedBatchData2.accInputHash; - // Calcultate input Hash for batch 1 + // Calcultate input Hahs for batch 1 let batchAccInputHashJs = calculateAccInputHash( ethers.HashZero, calculateBatchHashData(sequence.transactions), - await polygonZkEVMGlobalExitRoot.getRoot(), - currentTimestamp, + sequence.globalExitRoot, + sequence.timestamp, trustedSequencer.address, ); - // Calcultate input Hash for batch 2 + // Calcultate input Hahs for batch 2 batchAccInputHashJs = calculateAccInputHash( batchAccInputHashJs, calculateBatchHashData(sequence2.transactions), - await polygonZkEVMGlobalExitRoot.getRoot(), - currentTimestamp, + sequence2.globalExitRoot, + sequence2.timestamp, trustedSequencer.address, ); expect(batchAccInputHash2).to.be.equal(batchAccInputHashJs); @@ -531,7 +533,7 @@ describe('Polygon ZK-EVM', () => { it('force batches through smart contract', async () => { const l2txDataForceBatch = '0x123456'; const maticAmount = await polygonZkEVMContract.getForcedBatchFee(); - const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getRoot(); + const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); // deploy sender SC const sendDataFactory = await ethers.getContractFactory('SendData'); @@ -562,7 +564,7 @@ describe('Polygon ZK-EVM', () => { it('sequenceBatches should sequence multiple batches and force batches', async () => { const l2txDataForceBatch = '0x123456'; const maticAmount = await polygonZkEVMContract.getForcedBatchFee(); - const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getRoot(); + const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); await expect( maticTokenContract.approve(polygonZkEVMContract.address, maticAmount), @@ -584,11 +586,12 @@ describe('Polygon ZK-EVM', () => { const l2txData = '0x1234'; const maticAmountSequence = (await polygonZkEVMContract.batchFee()).mul(1); - let currentTimestamp = (await ethers.provider.getBlock()).timestamp; + const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const sequence = { transactions: l2txDataForceBatch, - forcedHistoricGlobalExitRoot: lastGlobalExitRoot, + globalExitRoot: lastGlobalExitRoot, + timestamp: currentTimestamp, minForcedTimestamp: currentTimestamp, }; @@ -616,11 +619,28 @@ describe('Polygon ZK-EVM', () => { .to.be.revertedWith('ForcedDataDoesNotMatch'); sequence.minForcedTimestamp -= 1; + sequence.timestamp -= 1; + await expect(polygonZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence, sequence2], trustedSequencer.address)) + .to.be.revertedWith('SequencedTimestampBelowForcedTimestamp'); + sequence.timestamp += 1; + + sequence.timestamp = currentTimestamp + 10; + await expect(polygonZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence, sequence2], trustedSequencer.address)) + .to.be.revertedWith('SequencedTimestampInvalid'); + sequence.timestamp = currentTimestamp; + + sequence2.timestamp -= 1; + await expect(polygonZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence, sequence2], trustedSequencer.address)) + .to.be.revertedWith('SequencedTimestampInvalid'); + sequence2.timestamp += 1; + // Sequence Bathces await expect(polygonZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence, sequence2], trustedSequencer.address)) .to.emit(polygonZkEVMContract, 'SequenceBatches') .withArgs(Number(lastBatchSequenced) + 2); + const sequencedTimestamp = (await ethers.provider.getBlock()).timestamp; + const finalOwnerBalance = await maticTokenContract.balanceOf( await trustedSequencer.address, ); @@ -636,32 +656,27 @@ describe('Polygon ZK-EVM', () => { /* * Check batch mapping - * Calcultate input Hash for batch 1 + * Calcultate input Hahs for batch 1 */ - currentTimestamp = (await ethers.provider.getBlock()).timestamp; - let batchAccInputHashJs = calculateAccInputHash( ethers.HashZero, calculateBatchHashData(sequence.transactions), - await polygonZkEVMGlobalExitRoot.getRoot(), - sequence.minForcedTimestamp, + sequence.globalExitRoot, + sequence.timestamp, trustedSequencer.address, - '0x01', ); - // Calcultate input Hash for batch 2 + // Calcultate input Hahs for batch 2 batchAccInputHashJs = calculateAccInputHash( batchAccInputHashJs, calculateBatchHashData(sequence2.transactions), - await polygonZkEVMGlobalExitRoot.getRoot(), - currentTimestamp, + sequence2.globalExitRoot, + sequence2.timestamp, trustedSequencer.address, - '0x00', ); - const batchData2 = await polygonZkEVMContract.sequencedBatches(2); expect(batchData2.accInputHash).to.be.equal(batchAccInputHashJs); - expect(batchData2.sequencedTimestamp).to.be.equal(currentTimestamp); + expect(batchData2.sequencedTimestamp).to.be.equal(sequencedTimestamp); expect(batchData2.previousLastBatchSequenced).to.be.equal(0); }); @@ -735,7 +750,7 @@ describe('Polygon ZK-EVM', () => { it('should force a batch of transactions', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.getForcedBatchFee(); - const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getRoot(); + const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); expect(maticAmount.toString()).to.be.equal((await polygonZkEVMContract.getForcedBatchFee()).toString()); @@ -791,7 +806,7 @@ describe('Polygon ZK-EVM', () => { it('should sequence force batches using sequenceForceBatches', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.getForcedBatchFee(); - const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getRoot(); + const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); await expect( maticTokenContract.approve(polygonZkEVMContract.address, maticAmount), @@ -829,7 +844,7 @@ describe('Polygon ZK-EVM', () => { const forceBatchStruct = { transactions: l2txData, - forcedHistoricGlobalExitRoot: lastGlobalExitRoot, + globalExitRoot: lastGlobalExitRoot, minForcedTimestamp: timestampForceBatch, }; @@ -847,7 +862,7 @@ describe('Polygon ZK-EVM', () => { const forceBatchStructBad = { transactions: l2txData, - forcedHistoricGlobalExitRoot: lastGlobalExitRoot, + globalExitRoot: lastGlobalExitRoot, minForcedTimestamp: timestampForceBatch, }; @@ -859,7 +874,7 @@ describe('Polygon ZK-EVM', () => { forceBatchStructBad.globalExitRoot = ethers.HashZero; await expect(polygonZkEVMContract.sequenceForceBatches([forceBatchStructBad])) .to.be.revertedWith('ForcedDataDoesNotMatch'); - forceBatchStructBad.forcedHistoricGlobalExitRoot = lastGlobalExitRoot; + forceBatchStructBad.globalExitRoot = lastGlobalExitRoot; forceBatchStructBad.transactions = '0x1111'; await expect(polygonZkEVMContract.sequenceForceBatches([forceBatchStructBad])) @@ -874,6 +889,8 @@ describe('Polygon ZK-EVM', () => { .to.emit(polygonZkEVMContract, 'SequenceForceBatches') .withArgs(1); + const timestampSequenceBatch = (await ethers.provider.getBlock()).timestamp; + expect(await polygonZkEVMContract.lastForceBatchSequenced()).to.be.equal(1); expect(await polygonZkEVMContract.lastForceBatch()).to.be.equal(1); expect(await polygonZkEVMContract.lastBatchSequenced()).to.be.equal(1); @@ -884,10 +901,9 @@ describe('Polygon ZK-EVM', () => { const batchAccInputHashJs = calculateAccInputHash( ethers.HashZero, calculateBatchHashData(l2txData), - await polygonZkEVMGlobalExitRoot.getRoot(), - forceBatchStruct.minForcedTimestamp, + lastGlobalExitRoot, + timestampSequenceBatch, deployer.address, - '0x01', ); expect(batchAccInputHash).to.be.equal(batchAccInputHashJs); }); @@ -895,6 +911,7 @@ describe('Polygon ZK-EVM', () => { it('should verify a sequenced batch using verifyBatchesTrustedAggregator', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.batchFee(); + const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const sequence = { transactions: l2txData, @@ -982,7 +999,7 @@ describe('Polygon ZK-EVM', () => { it('should verify forced sequenced batch using verifyBatchesTrustedAggregator', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.getForcedBatchFee(); - const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getRoot(); + const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); await expect( maticTokenContract.approve(polygonZkEVMContract.address, maticAmount), @@ -1004,7 +1021,7 @@ describe('Polygon ZK-EVM', () => { const forceBatchStruct = { transactions: l2txData, - forcedHistoricGlobalExitRoot: lastGlobalExitRoot, + globalExitRoot: lastGlobalExitRoot, minForcedTimestamp: timestampForceBatch, }; @@ -1051,6 +1068,7 @@ describe('Polygon ZK-EVM', () => { it('should match the computed SC input with the Js input', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.batchFee(); + const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const sequence = { transactions: l2txData, @@ -1073,15 +1091,13 @@ describe('Polygon ZK-EVM', () => { const sentBatchHash = (await polygonZkEVMContract.sequencedBatches(lastBatchSequenced + 1)).accInputHash; const oldAccInputHash = (await polygonZkEVMContract.sequencedBatches(0)).accInputHash; - const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const batchAccInputHashJs = calculateAccInputHash( oldAccInputHash, calculateBatchHashData(sequence.transactions), - await polygonZkEVMGlobalExitRoot.getRoot(), - currentTimestamp, + sequence.globalExitRoot, + sequence.timestamp, trustedSequencer.address, - '0x00', ); expect(sentBatchHash).to.be.equal(batchAccInputHashJs); @@ -1121,7 +1137,7 @@ describe('Polygon ZK-EVM', () => { it('should match the computed SC input with the Js input in force batches', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.getForcedBatchFee(); - const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getRoot(); + const lastGlobalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); await expect( maticTokenContract.approve(polygonZkEVMContract.address, maticAmount), @@ -1144,7 +1160,7 @@ describe('Polygon ZK-EVM', () => { const forceBatchStruct = { transactions: l2txData, - forcedHistoricGlobalExitRoot: lastGlobalExitRoot, + globalExitRoot: lastGlobalExitRoot, minForcedTimestamp: timestampForceBatch, }; @@ -1153,16 +1169,16 @@ describe('Polygon ZK-EVM', () => { .to.emit(polygonZkEVMContract, 'SequenceForceBatches') .withArgs(lastForcedBatch); + const sequencedTimestmap = (await ethers.provider.getBlock()).timestamp; const oldAccInputHash = (await polygonZkEVMContract.sequencedBatches(0)).accInputHash; const batchAccInputHash = (await polygonZkEVMContract.sequencedBatches(1)).accInputHash; const batchAccInputHashJs = calculateAccInputHash( oldAccInputHash, calculateBatchHashData(l2txData), - await polygonZkEVMGlobalExitRoot.getRoot(), - forceBatchStruct.minForcedTimestamp, + lastGlobalExitRoot, + sequencedTimestmap, deployer.address, - '0x01', ); expect(batchAccInputHash).to.be.equal(batchAccInputHashJs); @@ -1202,6 +1218,7 @@ describe('Polygon ZK-EVM', () => { it('should verify a sequenced batch using verifyBatches', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.batchFee(); + const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const sequence = { transactions: l2txData, @@ -1359,6 +1376,7 @@ describe('Polygon ZK-EVM', () => { it('should test the pending state properly', async () => { const l2txData = '0x123456'; + const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const batchesForSequence = 5; const sequence = { @@ -1737,6 +1755,7 @@ describe('Polygon ZK-EVM', () => { it('Activate emergency state due halt timeout', async () => { const l2txData = '0x123456'; const maticAmount = await polygonZkEVMContract.batchFee(); + const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const sequence = { transactions: l2txData, @@ -1784,6 +1803,7 @@ describe('Polygon ZK-EVM', () => { it('Test overridePendingState properly', async () => { const l2txData = '0x123456'; + const currentTimestamp = (await ethers.provider.getBlock()).timestamp; const batchesForSequence = 5; const sequence = { diff --git a/test/contracts/snark_stark_input.test.js b/test/contracts/snark_stark_input.test.js index 61ae51c87..b46f0f2cf 100644 --- a/test/contracts/snark_stark_input.test.js +++ b/test/contracts/snark_stark_input.test.js @@ -56,7 +56,7 @@ describe('Polygon ZK-EVM snark stark input test', () => { const globalExitRoot = '0x090bcaf734c4f06c93954a827b45a6e8c67b8e0fd1e0a35a1c5982d6961828f9'; const timestamp = 1944498031; const sequencerAddr = '0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D'; - const expectedStarkHashExecutor = '0xef046bcaca930591f7c941cad928406dd1402a4e33b4dc704c519d130a05dd9f'; + const expectedStarkHashExecutor = '0x704d5cfd3e44b82028f7f8cae31168267a7422c5a447b90a65134116da5a8432'; const batchL2DataHash = contractUtils.calculateBatchHashData(batchL2Data); const accumulateInputHashJs = await contractUtils.calculateAccInputHash( @@ -65,7 +65,6 @@ describe('Polygon ZK-EVM snark stark input test', () => { globalExitRoot, timestamp, sequencerAddr, - '0x00', ); const accumulateInputHashSC = await polygonZkEVMContract.calculateAccInputHash( oldAccInputHash, @@ -73,7 +72,6 @@ describe('Polygon ZK-EVM snark stark input test', () => { globalExitRoot, timestamp, sequencerAddr, - false, ); expect(accumulateInputHashJs).to.be.equal(accumulateInputHashSC); expect(accumulateInputHashSC).to.be.equal(expectedStarkHashExecutor); diff --git a/test/contractsv2/PolygonRollupManager.test.js b/test/contractsv2/PolygonRollupManager.test.js deleted file mode 100644 index 5fadbb033..000000000 --- a/test/contractsv2/PolygonRollupManager.test.js +++ /dev/null @@ -1,166 +0,0 @@ -/* eslint-disable no-plusplus, no-await-in-loop */ -const { expect } = require('chai'); -const { ethers, upgrades } = require('hardhat'); - -describe('Polygon ZK-EVM TestnetV2', () => { - let deployer; - let trustedAggregator; - let trustedSequencer; - let admin; - - let verifierContract; - let polygonZkEVMBridgeContract; - let polygonZkEVMContract; - let polTokenContract; - let polygonZkEVMGlobalExitRoot; - let rollupManagerContract; - - const polTokenName = 'POL Token'; - const polTokenSymbol = 'POL'; - const polTokenInitialBalance = ethers.parseEther('20000000'); - - const networkIDMainnet = 0; - const urlSequencer = 'http://zkevm-json-rpc:8123'; - const chainID = 1000; - const networkName = 'zkevm'; - const version = '0.0.1'; - const forkID = 0; - - const pendingStateTimeoutDefault = 100; - const trustedAggregatorTimeout = 100; - - let firstDeployment = true; - - //roles - const DEFAULT_ADMIN_ROLE = ethers.HashZero; - const ADD_ROLLUP_TYPE_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("ADD_ROLLUP_TYPE_ROLE")]); - const OBSOLETE_ROLLUP_TYPE_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("OBSOLETE_ROLLUP_TYPE_ROLE")]); - const CREATE_ROLLUP_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("CREATE_ROLLUP_ROLE")]); - const ADD_EXISTING_ROLLUP_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("ADD_EXISTING_ROLLUP_ROLE")]); - const UPDATE_ROLLUP_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("UPDATE_ROLLUP_ROLE")]); - const TRUSTED_AGGREGATOR_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("TRUSTED_AGGREGATOR_ROLE")]); - const TWEAK_PARAMETERS_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("TWEAK_PARAMETERS_ROLE")]); - const SET_FEE_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("SET_FEE_ROLE")]); - const STOP_EMERGENCY_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("STOP_EMERGENCY_ROLE")]); - const EMERGENCY_COUNCIL_ROLE = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("EMERGENCY_COUNCIL_ROLE")]); - const EMERGENCY_COUNCIL_ADMIN = ethers.solidityPackedKeccak256(["bytes"], [ethers.toUtf8Bytes("EMERGENCY_COUNCIL_ADMIN")]); - - - beforeEach('Deploy contract', async () => { - upgrades.silenceWarnings(); - - // load signers - [deployer, trustedAggregator, trustedSequencer, admin, timelock, emergencyCouncil] = await ethers.getSigners(); - - - // deploy mock verifier - const VerifierRollupHelperFactory = await ethers.getContractFactory( - 'VerifierRollupHelperMock', - ); - verifierContract = await VerifierRollupHelperFactory.deploy(); - - // deploy pol - const polTokenFactory = await ethers.getContractFactory('ERC20PermitMock'); - polTokenContract = await polTokenFactory.deploy( - polTokenName, - polTokenSymbol, - deployer.address, - polTokenInitialBalance, - ); - await polTokenContract.deployed(); - - /* - * deploy global exit root manager - * In order to not have trouble with nonce deploy first proxy admin - */ - await upgrades.deployProxyAdmin(); - if ((await upgrades.admin.getInstance()).address !== '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0') { - firstDeployment = false; - } - const nonceProxyBridge = Number((await ethers.provider.getTransactionCount(deployer.address))) + (firstDeployment ? 3 : 2); - const nonceProxyZkevm = nonceProxyBridge + 2; // Always have to redeploy impl since the polygonZkEVMGlobalExitRoot address changes - - const precalculateBridgeAddress = ethers.getContractAddress({ from: deployer.address, nonce: nonceProxyBridge }); - const precalculateRollupManagerAddress = ethers.getContractAddress({ from: deployer.address, nonce: nonceProxyZkevm }); - firstDeployment = false; - - // deploy globalExitRoot - const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory('PolygonZkEVMGlobalExitRoot'); - polygonZkEVMGlobalExitRoot = await upgrades.deployProxy(PolygonZkEVMGlobalExitRootFactory, [], { - initializer: false, - constructorArgs: [precalculateRollupManagerAddress, precalculateBridgeAddress], - unsafeAllow: ['constructor', 'state-variable-immutable'], - }); - - // deploy PolygonZkEVMBridge - const polygonZkEVMBridgeFactory = await ethers.getContractFactory('PolygonZkEVMBridgeV2'); - polygonZkEVMBridgeContract = await upgrades.deployProxy(polygonZkEVMBridgeFactory, [], { initializer: false }); - - // deploy mock verifier - const PolygonRollupManagerFactory = await ethers.getContractFactory( - 'PolygonRollupManagerMock', - ); - - rollupManagerContract = await upgrades.deployProxy(PolygonRollupManagerFactory, [], { - initializer: false, - constructorArgs: [polygonZkEVMGlobalExitRoot.address, - polTokenContract.address, - polygonZkEVMBridgeContract.address], - unsafeAllow: ['constructor', 'state-variable-immutable'], - }); - - await rollupManagerContract.deployed(); - - // check precalculated address - expect(precalculateBridgeAddress).to.be.equal(polygonZkEVMBridgeContract.address); - expect(precalculateRollupManagerAddress).to.be.equal(rollupManagerContract.address); - - await polygonZkEVMBridgeContract.initialize(networkIDMainnet, polygonZkEVMGlobalExitRoot.address, rollupManagerContract.address); - - // Initialize Mock - await rollupManagerContract.initializeMock(trustedAggregator.address, - pendingStateTimeoutDefault, - trustedAggregatorTimeout, - admin.address, - timelock.address, - emergencyCouncil.address); - - - // fund sequencer address with Matic tokens - await polTokenContract.transfer(trustedSequencer.address, ethers.parseEther('1000')); - }); - - it('should check the initalized parameters', async () => { - expect(await rollupManagerContract.globalExitRootManager()).to.be.equal(polygonZkEVMGlobalExitRoot.address); - expect(await rollupManagerContract.pol()).to.be.equal(polTokenContract.address); - expect(await rollupManagerContract.bridgeAddress()).to.be.equal(polygonZkEVMBridgeContract.address); - - expect(await rollupManagerContract.pendingStateTimeout()).to.be.equal(pendingStateTimeoutDefault); - expect(await rollupManagerContract.trustedAggregator()).to.be.equal(trustedAggregator.address); - expect(await rollupManagerContract.trustedAggregatorTimeout()).to.be.equal(trustedAggregatorTimeout); - - expect(await rollupManagerContract.getBatchFee()).to.be.equal(ethers.parseEther('0.1')); - expect(await rollupManagerContract.getForcedBatchFee()).to.be.equal(ethers.parseEther('10')); - - // Check roles - - expect(await rollupManagerContract.hasRole(DEFAULT_ADMIN_ROLE, timelock.address)).to.be.equal(true); - expect(await rollupManagerContract.hasRole(ADD_ROLLUP_TYPE_ROLE, timelock.address)).to.be.equal(true); - expect(await rollupManagerContract.hasRole(UPDATE_ROLLUP_ROLE, timelock.address)).to.be.equal(true); - expect(await rollupManagerContract.hasRole(OBSOLETE_ROLLUP_TYPE_ROLE, admin.address)).to.be.equal(true); - expect(await rollupManagerContract.hasRole(CREATE_ROLLUP_ROLE, admin.address)).to.be.equal(true); - expect(await rollupManagerContract.hasRole(TRUSTED_AGGREGATOR_ROLE, admin.address)).to.be.equal(true); - expect(await rollupManagerContract.hasRole(TWEAK_PARAMETERS_ROLE, admin.address)).to.be.equal(true); - expect(await rollupManagerContract.hasRole(SET_FEE_ROLE, admin.address)).to.be.equal(true); - expect(await rollupManagerContract.hasRole(STOP_EMERGENCY_ROLE, admin.address)).to.be.equal(true); - expect(await rollupManagerContract.hasRole(EMERGENCY_COUNCIL_ROLE, emergencyCouncil.address)).to.be.equal(true); - expect(await rollupManagerContract.hasRole(EMERGENCY_COUNCIL_ADMIN, emergencyCouncil.address)).to.be.equal(true); - }); - - it('should add a new rollup type', async () => { - - - }); -}); - - diff --git a/test/contractsv2/PolygonZkEVMV2.test.ts b/test/contractsv2/PolygonZkEVMV2.test.ts deleted file mode 100644 index 97c573b3d..000000000 --- a/test/contractsv2/PolygonZkEVMV2.test.ts +++ /dev/null @@ -1,693 +0,0 @@ -/* eslint-disable no-plusplus, no-await-in-loop */ -import {expect} from "chai"; -import {ethers, network, upgrades} from "hardhat"; -import { - VerifierRollupHelperMock, - ERC20PermitMock, - PolygonRollupManagerMock, - PolygonZkEVMGlobalExitRootV2, - PolygonZkEVMBridgeV2, - PolygonZkEVMV2, - PolygonZkEVMEtrog, - PolygonRollupBase, - PolygonRollupBaseEtrog, - TokenWrapped, - Address, -} from "../../typechain-types"; -import {takeSnapshot, time} from "@nomicfoundation/hardhat-network-helpers"; -import {processorUtils, contractUtils, MTBridge, mtBridgeUtils} from "@0xpolygonhermez/zkevm-commonjs"; -const {calculateSnarkInput, calculateAccInputHash, calculateBatchHashData} = contractUtils; - -type BatchDataStruct = PolygonRollupBase.BatchDataStruct; -type ForcedBatchDataStruct = PolygonRollupBase.ForcedBatchDataStruct; -type BatchDataStructEtrog = PolygonRollupBaseEtrog.BatchDataStruct; - -const MerkleTreeBridge = MTBridge; -const {verifyMerkleProof, getLeafValue} = mtBridgeUtils; - -function calculateGlobalExitRoot(mainnetExitRoot: any, rollupExitRoot: any) { - return ethers.solidityPackedKeccak256(["bytes32", "bytes32"], [mainnetExitRoot, rollupExitRoot]); -} - -describe("Polygon ZK-EVM TestnetV2", () => { - let deployer: any; - let timelock: any; - let emergencyCouncil: any; - let trustedAggregator: any; - let trustedSequencer: any; - let admin: any; - let beneficiary: any; - - let verifierContract: VerifierRollupHelperMock; - let polygonZkEVMBridgeContract: PolygonZkEVMBridgeV2; - let polTokenContract: ERC20PermitMock; - let polygonZkEVMGlobalExitRoot: PolygonZkEVMGlobalExitRootV2; - let rollupManagerContract: PolygonRollupManagerEmptyMock; - let PolygonZKEVMV2Contract: PolygonZkEVMV2; - - const polTokenName = "POL Token"; - const polTokenSymbol = "POL"; - const polTokenInitialBalance = ethers.parseEther("20000000"); - - const pendingStateTimeoutDefault = 100; - const trustedAggregatorTimeout = 100; - const FORCE_BATCH_TIMEOUT = 60 * 60 * 24 * 5; // 5 days - - // BRidge constants - const networkIDMainnet = 0; - const networkIDRollup = 1; - - const LEAF_TYPE_ASSET = 0; - const LEAF_TYPE_MESSAGE = 1; - - const globalExitRootL2Address = "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa" as unknown as Address; - - let firstDeployment = true; - - const urlSequencer = "http://zkevm-json-rpc:8123"; - const chainID = 1000; - const networkName = "zkevm"; - const forkID = 0; - const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001"; - const rollupCompatibilityID = 0; - const descirption = "zkevm test"; - const networkID = 1; - - // Native token will be ether - const gasTokenAddress = ethers.ZeroAddress; - const gasTokenNetwork = 0; - - const SIGNATURE_BYTES = 32 + 32 + 1; - const EFFECTIVE_PERCENTAGE_BYTES = 1; - - beforeEach("Deploy contract", async () => { - upgrades.silenceWarnings(); - - // load signers - [deployer, trustedAggregator, trustedSequencer, admin, timelock, emergencyCouncil, beneficiary] = - await ethers.getSigners(); - - // deploy mock verifier - const VerifierRollupHelperFactory = await ethers.getContractFactory("VerifierRollupHelperMock"); - verifierContract = await VerifierRollupHelperFactory.deploy(); - - // deploy pol - const polTokenFactory = await ethers.getContractFactory("ERC20PermitMock"); - polTokenContract = await polTokenFactory.deploy( - polTokenName, - polTokenSymbol, - deployer.address, - polTokenInitialBalance - ); - - /* - * deploy global exit root manager - * In order to not have trouble with nonce deploy first proxy admin - */ - await upgrades.deployProxyAdmin(); - - if ((await upgrades.admin.getInstance()).target !== "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0") { - firstDeployment = false; - } - const nonceProxyBridge = - Number(await ethers.provider.getTransactionCount(deployer.address)) + (firstDeployment ? 3 : 2); - - const nonceProxyZkevm = nonceProxyBridge + 1; // Always have to redeploy impl since the polygonZkEVMGlobalExitRoot address changes - - const precalculateBridgeAddress = ethers.getCreateAddress({ - from: deployer.address, - nonce: nonceProxyBridge, - }); - const precalculateRollupManagerAddress = ethers.getCreateAddress({ - from: deployer.address, - nonce: nonceProxyZkevm, - }); - firstDeployment = false; - - // deploy globalExitRoot - const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRootV2"); - polygonZkEVMGlobalExitRoot = await upgrades.deployProxy(PolygonZkEVMGlobalExitRootFactory, [], { - initializer: false, - constructorArgs: [precalculateRollupManagerAddress, precalculateBridgeAddress], - unsafeAllow: ["constructor", "state-variable-immutable"], - }); - - // deploy PolygonZkEVMBridge - const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); - polygonZkEVMBridgeContract = await upgrades.deployProxy(polygonZkEVMBridgeFactory, [], {initializer: false}); - - // deploy mock verifier - const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManagerEmptyMock"); - - rollupManagerContract = await PolygonRollupManagerFactory.deploy(); - - await rollupManagerContract.waitForDeployment(); - - // check precalculated address - expect(precalculateBridgeAddress).to.be.equal(polygonZkEVMBridgeContract.target); - expect(precalculateRollupManagerAddress).to.be.equal(rollupManagerContract.target); - - await polygonZkEVMBridgeContract.initialize( - networkIDMainnet, - ethers.ZeroAddress, // zero for ether - ethers.ZeroAddress, // zero for ether - polygonZkEVMGlobalExitRoot.target, - rollupManagerContract.target, - "0x" - ); - - // fund sequencer address with Matic tokens - await polTokenContract.transfer(trustedSequencer.address, ethers.parseEther("1000")); - - // deploy consensus - // Create zkEVM implementation - const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMV2"); - PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy( - polygonZkEVMGlobalExitRoot.target, - polTokenContract.target, - polygonZkEVMBridgeContract.target, - rollupManagerContract.target - ); - await PolygonZKEVMV2Contract.waitForDeployment(); - }); - - it("should check the initalized parameters", async () => { - // initialize zkEVM - await expect( - PolygonZKEVMV2Contract.initialize( - admin.address, - trustedSequencer.address, - networkID, - gasTokenAddress, - urlSequencer, - networkName - ) - ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "OnlyRollupManager"); - - // Initialzie using rollup manager - await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); - const rolllupManagerSigner = await ethers.getSigner(rollupManagerContract.target as any); - await expect( - PolygonZKEVMV2Contract.connect(rolllupManagerSigner).initialize( - admin.address, - trustedSequencer.address, - networkID, - gasTokenAddress, - urlSequencer, - networkName, - {gasPrice: 0} - ) - ).to.emit(PolygonZKEVMV2Contract, "InitialSequenceBatches"); - - const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; - expect(await PolygonZKEVMV2Contract.admin()).to.be.equal(admin.address); - expect(await PolygonZKEVMV2Contract.trustedSequencer()).to.be.equal(trustedSequencer.address); - expect(await PolygonZKEVMV2Contract.trustedSequencerURL()).to.be.equal(urlSequencer); - expect(await PolygonZKEVMV2Contract.networkName()).to.be.equal(networkName); - expect(await PolygonZKEVMV2Contract.forceBatchTimeout()).to.be.equal(FORCE_BATCH_TIMEOUT); - expect(await PolygonZKEVMV2Contract.lastTimestamp()).to.be.equal(timestampCreatedRollup); - }); - - it("should check admin functions", async () => { - // Initialzie using rollup manager - await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); - const rolllupManagerSigner = await ethers.getSigner(rollupManagerContract.target as any); - await expect( - PolygonZKEVMV2Contract.connect(rolllupManagerSigner).initialize( - admin.address, - trustedSequencer.address, - networkID, - gasTokenAddress, - urlSequencer, - networkName, - {gasPrice: 0} - ) - ).to.emit(PolygonZKEVMV2Contract, "InitialSequenceBatches"); - - await expect(PolygonZKEVMV2Contract.setTrustedSequencer(deployer.address)).to.be.revertedWithCustomError( - PolygonZKEVMV2Contract, - "OnlyAdmin" - ); - - await expect(PolygonZKEVMV2Contract.connect(admin).setTrustedSequencer(deployer.address)) - .to.emit(PolygonZKEVMV2Contract, "SetTrustedSequencer") - .withArgs(deployer.address); - - await expect(PolygonZKEVMV2Contract.setTrustedSequencerURL("0x1253")).to.be.revertedWithCustomError( - PolygonZKEVMV2Contract, - "OnlyAdmin" - ); - await expect(PolygonZKEVMV2Contract.connect(admin).setTrustedSequencerURL("0x1253")) - .to.emit(PolygonZKEVMV2Contract, "SetTrustedSequencerURL") - .withArgs("0x1253"); - - await expect(PolygonZKEVMV2Contract.setForceBatchTimeout(0)).to.be.revertedWithCustomError( - PolygonZKEVMV2Contract, - "OnlyAdmin" - ); - - await expect( - PolygonZKEVMV2Contract.connect(admin).setForceBatchTimeout(FORCE_BATCH_TIMEOUT) - ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "InvalidRangeForceBatchTimeout"); - - await expect(PolygonZKEVMV2Contract.connect(admin).setForceBatchTimeout(0)) - .to.emit(PolygonZKEVMV2Contract, "SetForceBatchTimeout") - .withArgs(0); - - await expect(PolygonZKEVMV2Contract.transferAdminRole(deployer.address)).to.be.revertedWithCustomError( - PolygonZKEVMV2Contract, - "OnlyAdmin" - ); - - await expect(PolygonZKEVMV2Contract.connect(admin).transferAdminRole(deployer.address)) - .to.emit(PolygonZKEVMV2Contract, "TransferAdminRole") - .withArgs(deployer.address); - - await expect(PolygonZKEVMV2Contract.connect(admin).acceptAdminRole()).to.be.revertedWithCustomError( - PolygonZKEVMV2Contract, - "OnlyPendingAdmin" - ); - - await expect(PolygonZKEVMV2Contract.connect(deployer).acceptAdminRole()) - .to.emit(PolygonZKEVMV2Contract, "AcceptAdminRole") - .withArgs(deployer.address); - - // Check force batches are unactive - await expect(PolygonZKEVMV2Contract.forceBatch("0x", 0)).to.be.revertedWithCustomError( - PolygonZKEVMV2Contract, - "ForceBatchNotAllowed" - ); - await expect(PolygonZKEVMV2Contract.sequenceForceBatches([])).to.be.revertedWithCustomError( - PolygonZKEVMV2Contract, - "ForceBatchNotAllowed" - ); - - // deployer now is the admin - await expect(PolygonZKEVMV2Contract.connect(admin).activateForceBatches()).to.be.revertedWithCustomError( - PolygonZKEVMV2Contract, - "OnlyAdmin" - ); - - await expect(PolygonZKEVMV2Contract.connect(deployer).activateForceBatches()).to.emit( - PolygonZKEVMV2Contract, - "ActivateForceBatches" - ); - - await expect(PolygonZKEVMV2Contract.connect(deployer).activateForceBatches()).to.be.revertedWithCustomError( - PolygonZKEVMV2Contract, - "ForceBatchesAlreadyActive" - ); - }); - - it("should check full flow", async () => { - // Initialzie using rollup manager - await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); - const rolllupManagerSigner = await ethers.getSigner(rollupManagerContract.target as any); - await expect( - PolygonZKEVMV2Contract.connect(rolllupManagerSigner).initialize( - admin.address, - trustedSequencer.address, - networkID, - gasTokenAddress, - urlSequencer, - networkName, - {gasPrice: 0} - ) - ).to.emit(PolygonZKEVMV2Contract, "InitialSequenceBatches"); - const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; - - const transaction = await PolygonZKEVMV2Contract.generateInitializeTransaction( - networkID, - gasTokenAddress, - gasTokenNetwork, - "0x" // empty metadata - ); - - // Check transaction - const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); - const encodedData = bridgeL2Factory.interface.encodeFunctionData("initialize", [ - networkID, - gasTokenAddress, - gasTokenNetwork, - globalExitRootL2Address, - ethers.ZeroAddress, - "0x", // empty metadata - ]); - - const rawTx = processorUtils.customRawTxToRawTx(transaction); - const tx = ethers.Transaction.from(rawTx); - - const rlpSignData = transaction.slice(0, -(SIGNATURE_BYTES * 2 + EFFECTIVE_PERCENTAGE_BYTES * 2)); - expect(rlpSignData).to.be.equal(tx.unsignedSerialized); - - expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); - expect(tx.value).to.be.equal(0); - expect(tx.data).to.be.equal(encodedData); - expect(tx.gasPrice).to.be.equal(0); - expect(tx.gasLimit).to.be.equal(30000000); - expect(tx.nonce).to.be.equal(0); - expect(tx.chainId).to.be.equal(0); - - const expectedAccInputHash = calculateAccInputHash( - ethers.ZeroHash, - ethers.keccak256(transaction), - await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), - timestampCreatedRollup, - trustedSequencer.address - ); - // calcualte accINputHash - expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash); - - // try verify batches - const l2txData = "0x123456"; - const maticAmount = ethers.parseEther("1"); - const currentTimestamp = (await ethers.provider.getBlock("latest"))?.timestamp; - - const sequence = { - transactions: l2txData, - globalExitRoot: ethers.ZeroHash, - timestamp: currentTimestamp, - minForcedTimestamp: 0, - } as BatchDataStruct; - - // Approve tokens - await expect( - polTokenContract.connect(trustedSequencer).approve(PolygonZKEVMV2Contract.target, maticAmount) - ).to.emit(polTokenContract, "Approval"); - - // Sequence Batches - await expect( - PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address) - ) - .to.emit(PolygonZKEVMV2Contract, "SequenceBatches") - .withArgs(1); - - const expectedAccInputHash2 = calculateAccInputHash( - expectedAccInputHash, - ethers.keccak256(l2txData), - ethers.ZeroHash, - currentTimestamp, - trustedSequencer.address - ); - // calcualte accINputHash - expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash2); - }); - - it("should check full flow with wrapped gas token", async () => { - // Create a new wrapped token mocking the bridge - const tokenName = "Matic Token L2"; - const tokenSymbol = "MATIC"; - const decimals = 18; - const metadataToken = ethers.AbiCoder.defaultAbiCoder().encode( - ["string", "string", "uint8"], - [tokenName, tokenSymbol, decimals] - ); - - const originNetwork = networkIDRollup; - const tokenAddress = ethers.getAddress(ethers.hexlify(ethers.randomBytes(20))); - const amount = ethers.parseEther("10"); - const destinationNetwork = networkIDMainnet; - const destinationAddress = beneficiary.address; - const metadata = metadataToken; // since we are inserting in the exit root can be anything - const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); - - // compute root merkle tree in Js - const height = 32; - const merkleTreezkEVM = new MerkleTreeBridge(height); - const leafValue = getLeafValue( - LEAF_TYPE_ASSET, - originNetwork, - tokenAddress, - destinationNetwork, - destinationAddress, - amount, - metadataHash - ); - - // Add 2 leafs - merkleTreezkEVM.add(leafValue); - merkleTreezkEVM.add(leafValue); - - // check merkle root with SC - const rootzkEVM = merkleTreezkEVM.getRoot(); - - // Calcualte new globalExitroot - const merkleTreeRollups = new MerkleTreeBridge(height); - merkleTreeRollups.add(rootzkEVM); - const rootRollups = merkleTreeRollups.getRoot(); - - // Assert global exit root - // TODO - await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); - const rolllupManagerSigner = await ethers.getSigner(rollupManagerContract.target as any); - await polygonZkEVMGlobalExitRoot.connect(rolllupManagerSigner).updateExitRoot(rootRollups, {gasPrice: 0}); - - expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(ethers.ZeroHash); - expect(await polygonZkEVMGlobalExitRoot.lastRollupExitRoot()).to.be.equal(rootRollups); - - expect(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()).to.be.equal( - calculateGlobalExitRoot(ethers.ZeroHash, rootRollups) - ); - - const indexLeaf = 0; - const proofZkEVM = merkleTreezkEVM.getProofTreeByIndex(indexLeaf); - const proofRollups = merkleTreeRollups.getProofTreeByIndex(indexLeaf); - - // verify merkle proof - expect(verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM)).to.be.equal(true); - expect(verifyMerkleProof(rootzkEVM, proofRollups, indexLeaf, rootRollups)).to.be.equal(true); - - expect( - await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM) - ).to.be.equal(true); - - expect( - await polygonZkEVMBridgeContract.verifyMerkleProof(rootzkEVM, proofRollups, indexLeaf, rootRollups) - ).to.be.equal(true); - - // claim - const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped"); - // create2 parameters - const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]); - const minimalBytecodeProxy = tokenWrappedFactory.bytecode; - const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]); - const precalculateWrappedErc20 = await ethers.getCreate2Address( - polygonZkEVMBridgeContract.target as string, - salt, - hashInitCode - ); - const newWrappedToken = tokenWrappedFactory.attach(precalculateWrappedErc20) as TokenWrapped; - - // Use precalculatedWrapperAddress and check if matches - expect( - await polygonZkEVMBridgeContract.precalculatedWrapperAddress( - networkIDRollup, - tokenAddress, - tokenName, - tokenSymbol, - decimals - ) - ).to.be.equal(precalculateWrappedErc20); - - // index leaf is 0 bc, does not have mainnet flag, and it's rollup 0 on leaf 0 - await expect( - polygonZkEVMBridgeContract.claimAsset( - proofZkEVM, - proofRollups, - indexLeaf, - ethers.ZeroHash, - rootRollups, - originNetwork, - tokenAddress, - destinationNetwork, - destinationAddress, - amount, - metadata - ) - ) - .to.emit(polygonZkEVMBridgeContract, "ClaimEvent") - .withArgs(indexLeaf, originNetwork, tokenAddress, destinationAddress, amount) - .to.emit(polygonZkEVMBridgeContract, "NewWrappedToken") - .withArgs(originNetwork, tokenAddress, precalculateWrappedErc20, metadata) - .to.emit(newWrappedToken, "Transfer") - .withArgs(ethers.ZeroAddress, beneficiary.address, amount); - - // Assert maps created - const newTokenInfo = await polygonZkEVMBridgeContract.wrappedTokenToTokenInfo(precalculateWrappedErc20); - - expect(newTokenInfo.originNetwork).to.be.equal(networkIDRollup); - expect(newTokenInfo.originTokenAddress).to.be.equal(tokenAddress); - expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( - precalculateWrappedErc20 - ); - expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal( - precalculateWrappedErc20 - ); - - expect(await polygonZkEVMBridgeContract.tokenInfoToWrappedToken(salt)).to.be.equal(precalculateWrappedErc20); - - // Check the wrapper info - expect(await newWrappedToken.name()).to.be.equal(tokenName); - expect(await newWrappedToken.symbol()).to.be.equal(tokenSymbol); - expect(await newWrappedToken.decimals()).to.be.equal(decimals); - - // Initialzie using rollup manager with gas token - await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); - await expect( - PolygonZKEVMV2Contract.connect(rolllupManagerSigner).initialize( - admin.address, - trustedSequencer.address, - networkID, - newWrappedToken.target, - urlSequencer, - networkName, - {gasPrice: 0} - ) - ).to.emit(PolygonZKEVMV2Contract, "InitialSequenceBatches"); - - const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; - - const transaction = await PolygonZKEVMV2Contract.generateInitializeTransaction( - networkID, - tokenAddress, - originNetwork, - metadata // empty metadata - ); - - // Check transaction - const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); - const encodedData = bridgeL2Factory.interface.encodeFunctionData("initialize", [ - networkID, - tokenAddress, - originNetwork, - globalExitRootL2Address, - ethers.ZeroAddress, - metadata, // empty metadata - ]); - - const rawTx = processorUtils.customRawTxToRawTx(transaction); - const tx = ethers.Transaction.from(rawTx); - - const rlpSignData = transaction.slice(0, -(SIGNATURE_BYTES * 2 + EFFECTIVE_PERCENTAGE_BYTES * 2)); - expect(rlpSignData).to.be.equal(tx.unsignedSerialized); - - expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); - expect(tx.value).to.be.equal(0); - expect(tx.data).to.be.equal(encodedData); - expect(tx.gasPrice).to.be.equal(0); - expect(tx.gasLimit).to.be.equal(30000000); - expect(tx.nonce).to.be.equal(0); - expect(tx.chainId).to.be.equal(0); - - const expectedAccInputHash = calculateAccInputHash( - ethers.ZeroHash, - ethers.keccak256(transaction), - await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), - timestampCreatedRollup, - trustedSequencer.address - ); - - // calcualte accINputHash - expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash); - - expect(await PolygonZKEVMV2Contract.gasTokenAddress()).to.be.equal(tokenAddress); - expect(await PolygonZKEVMV2Contract.gasTokenNetwork()).to.be.equal(originNetwork); - }); - - it("should check forced batches", async () => { - // Initialzie using rollup manager - await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerContract.target]); - const rolllupManagerSigner = await ethers.getSigner(rollupManagerContract.target as any); - await expect( - PolygonZKEVMV2Contract.connect(rolllupManagerSigner).initialize( - admin.address, - trustedSequencer.address, - networkID, - gasTokenAddress, - urlSequencer, - networkName, - {gasPrice: 0} - ) - ).to.emit(PolygonZKEVMV2Contract, "InitialSequenceBatches"); - - const timestampCreatedRollup = (await ethers.provider.getBlock("latest"))?.timestamp; - const transaction = await PolygonZKEVMV2Contract.generateInitializeTransaction( - networkID, - gasTokenAddress, - gasTokenNetwork, - "0x" // empty metadata - ); - - // Check transaction - const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); - const encodedData = bridgeL2Factory.interface.encodeFunctionData("initialize", [ - networkID, - gasTokenAddress, - gasTokenNetwork, - globalExitRootL2Address, - ethers.ZeroAddress, - "0x", // empty metadata - ]); - - const rawTx = processorUtils.customRawTxToRawTx(transaction); - const tx = ethers.Transaction.from(rawTx); - - const rlpSignData = transaction.slice(0, -(SIGNATURE_BYTES * 2 + EFFECTIVE_PERCENTAGE_BYTES * 2)); - expect(rlpSignData).to.be.equal(tx.unsignedSerialized); - - expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target); - expect(tx.value).to.be.equal(0); - expect(tx.data).to.be.equal(encodedData); - expect(tx.gasPrice).to.be.equal(0); - expect(tx.gasLimit).to.be.equal(30000000); - expect(tx.nonce).to.be.equal(0); - expect(tx.chainId).to.be.equal(0); - - const expectedAccInputHash = calculateAccInputHash( - ethers.ZeroHash, - ethers.keccak256(transaction), - await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(), - timestampCreatedRollup, - trustedSequencer.address - ); - // calcualte accINputHash - expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash); - - // try verify batches - const l2txData = "0x123456"; - const maticAmount = ethers.parseEther("1"); - - // Approve tokens - await expect(polTokenContract.connect(deployer).approve(PolygonZKEVMV2Contract.target, maticAmount)).to.emit( - polTokenContract, - "Approval" - ); - - expect(await PolygonZKEVMV2Contract.calculatePolPerForceBatch()).to.be.equal(0); - - const globalExitRoot = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(); - - // force Batches - await expect(PolygonZKEVMV2Contract.forceBatch(l2txData, maticAmount)).to.be.revertedWithCustomError( - PolygonZKEVMV2Contract, - "ForceBatchNotAllowed" - ); - - // deployer now is the admin - await PolygonZKEVMV2Contract.connect(admin).activateForceBatches(); - - // force Batches - await expect(PolygonZKEVMV2Contract.forceBatch(l2txData, 0)).to.be.revertedWithCustomError( - PolygonZKEVMV2Contract, - "NotEnoughPOLAmount" - ); - - await expect(PolygonZKEVMV2Contract.forceBatch(l2txData, maticAmount)) - .to.emit(PolygonZKEVMV2Contract, "ForceBatch") - .withArgs(1, globalExitRoot, deployer.address, "0x"); - - expect(await PolygonZKEVMV2Contract.calculatePolPerForceBatch()).to.be.equal( - await rollupManagerContract.getForcedBatchFee() - ); - }); -}); diff --git a/upgrade/tool-regen-upgrade-info/regen-upgrade-info.js b/upgrade/tool-regen-upgrade-info/regen-upgrade-info.js deleted file mode 100644 index d23576f38..000000000 --- a/upgrade/tool-regen-upgrade-info/regen-upgrade-info.js +++ /dev/null @@ -1,25 +0,0 @@ -/* eslint-disable no-await-in-loop */ -/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */ -const { ethers, upgrades } = require('hardhat'); -const path = require('path'); -const fs = require('fs'); -// require('dotenv').config({ path: path.resolve(__dirname, '../.env') }); - -async function main() { - // load input file - const input = JSON.parse(fs.readFileSync(path.resolve(__dirname, './input.json'))); - - // Load implementation contract - const PolygonZkEVMFactory = await ethers.getContractFactory(input.implementationName, ethers.provider); - - // Import OZ upgrades - await upgrades.forceImport(input.proxyAddress, PolygonZkEVMFactory, { - kind: 'transparent', - constructorArgs: input.constructorArgs, - }); -} - -main().catch((e) => { - console.error(e); - process.exit(1); -}); From 868ede477ff6d3fa627b5c6dfa00325ab8adc785 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Thu, 25 Jan 2024 17:11:19 +0100 Subject: [PATCH 170/230] remove unused compiled --- compiled-contracts/PolygonDataComittee.json | 1102 ----------------- compiled-contracts/PolygonZkEVMV2.json | 1008 --------------- .../PolygonZkEVMV2Existent.json | 1046 ---------------- 3 files changed, 3156 deletions(-) delete mode 100644 compiled-contracts/PolygonDataComittee.json delete mode 100644 compiled-contracts/PolygonZkEVMV2.json delete mode 100644 compiled-contracts/PolygonZkEVMV2Existent.json diff --git a/compiled-contracts/PolygonDataComittee.json b/compiled-contracts/PolygonDataComittee.json deleted file mode 100644 index a78aed2ea..000000000 --- a/compiled-contracts/PolygonDataComittee.json +++ /dev/null @@ -1,1102 +0,0 @@ -{ - "_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/PolygonZkEVMV2.json b/compiled-contracts/PolygonZkEVMV2.json deleted file mode 100644 index e82c6c44a..000000000 --- a/compiled-contracts/PolygonZkEVMV2.json +++ /dev/null @@ -1,1008 +0,0 @@ -{ - "_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 deleted file mode 100644 index 5459198ed..000000000 --- a/compiled-contracts/PolygonZkEVMV2Existent.json +++ /dev/null @@ -1,1046 +0,0 @@ -{ - "_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": {} -} From c95a6decf7dc1f8085ddbd4247c5469548121821 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Thu, 25 Jan 2024 22:25:04 +0100 Subject: [PATCH 171/230] fix script --- upgrade/upgradeToV2/upgradeToV2.ts | 33 ++++++++++++++---------------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/upgrade/upgradeToV2/upgradeToV2.ts b/upgrade/upgradeToV2/upgradeToV2.ts index 218494308..5d9a5f5dc 100644 --- a/upgrade/upgradeToV2/upgradeToV2.ts +++ b/upgrade/upgradeToV2/upgradeToV2.ts @@ -17,16 +17,9 @@ const upgradeParameters = require("./upgrade_parameters.json"); const pathOZUpgradability = path.join(__dirname, `../../.openzeppelin/${process.env.HARDHAT_NETWORK}.json`); async function main() { - const { - admin, - trustedAggregator, - trustedAggregatorTimeout, - pendingStateTimeout, - zkEVMOwner, - chainID, - } = deployParameters; - - + const {admin, trustedAggregator, trustedAggregatorTimeout, pendingStateTimeout, zkEVMOwner, chainID} = + deployParameters; + const emergencyCouncilAddress = zkEVMOwner; const {realVerifier, newForkID, timelockDelay, polTokenAddress} = upgradeParameters; @@ -35,8 +28,8 @@ async function main() { const currentBridgeAddress = deployOutputParameters.polygonZkEVMBridgeAddress; const currentGlobalExitRootAddress = deployOutputParameters.polygonZkEVMGlobalExitRootAddress; - const currentPolygonZkEVMAddress = deployOutputParameters.; - const currentTimelockAddress = deployOutputParameters.timelockContrapolygonZkEVMAddressctAddress; + const currentPolygonZkEVMAddress = deployOutputParameters.polygonZkEVMAddress; + const currentTimelockAddress = deployOutputParameters.timelockContractAddress; // Load provider let currentProvider = ethers.provider; @@ -88,7 +81,6 @@ async function main() { const proxyAdmin = await upgrades.admin.getInstance(); - // deploy new verifier let verifierContract; if (realVerifier === true) { @@ -172,7 +164,7 @@ async function main() { currentGlobalExitRootAddress, polTokenAddress, currentBridgeAddress, - currentPolygonZkEVMAddress, + currentPolygonZkEVMAddress ); await polygonZkEVMEtrogImpl.waitForDeployment(); @@ -191,7 +183,11 @@ async function main() { ]); const PolygonTransparentProxy = await ethers.getContractFactory("PolygonTransparentProxy"); - const newPolygonZkEVMContract = await PolygonTransparentProxy.deploy(polygonZkEVMEtrogImpl, currentPolygonZkEVMAddress, "0x"); + const newPolygonZkEVMContract = await PolygonTransparentProxy.deploy( + polygonZkEVMEtrogImpl.target, + currentPolygonZkEVMAddress, + "0x" + ); await newPolygonZkEVMContract.waitForDeployment(); console.log("#######################\n"); console.log(`new PolygonZkEVM Proxy: ${newPolygonZkEVMContract.target}`); @@ -201,7 +197,9 @@ async function main() { `npx hardhat verify --constructor-args upgrade/arguments.js ${newPolygonZkEVMContract.target} --network ${process.env.HARDHAT_NETWORK}\n` ); console.log("Copy the following constructor arguments on: upgrade/arguments.js \n", [ - polygonZkEVMEtrogImpl, currentPolygonZkEVMAddress, "0x" + polygonZkEVMEtrogImpl.target, + currentPolygonZkEVMAddress, + "0x", ]); // Upgrade to rollup manager previous polygonZKEVM @@ -273,7 +271,7 @@ async function main() { scheduleData, executeData, verifierAddress: verifierContract.target, - newPolygonZKEVM: newPolygonZkEVMContract.target + newPolygonZKEVM: newPolygonZkEVMContract.target, }; fs.writeFileSync(pathOutputJson, JSON.stringify(outputJson, null, 1)); } @@ -300,4 +298,3 @@ function genOperation(target: any, value: any, data: any, predecessor: any, salt salt, }; } - From 3f9d4d638c37083ee20e86b7fddea59f325cc04a Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Thu, 25 Jan 2024 21:46:24 +0000 Subject: [PATCH 172/230] add contract generated with v4.0.0-rc.6-fork.7 --- contracts/verifiers/FflonkVerifier.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/verifiers/FflonkVerifier.sol b/contracts/verifiers/FflonkVerifier.sol index adf4e8f0b..6441e26b2 100644 --- a/contracts/verifiers/FflonkVerifier.sol +++ b/contracts/verifiers/FflonkVerifier.sol @@ -48,8 +48,8 @@ contract FflonkVerifier { uint256 constant w8_7 = 8613538655231327379234925296132678673308827349856085326283699237864372525723; // Verifier preprocessed input C_0(x)·[1]_1 - uint256 constant C0x = 1399458405278693375564157845951119219674216315698518301618391005223961674672; - uint256 constant C0y = 4753339552187781629812877887300152778714353139514388879046795575382068591682; + uint256 constant C0x = 7005013949998269612234996630658580519456097203281734268590713858661772481668; + uint256 constant C0y = 869093939501355406318588453775243436758538662501260653214950591532352435323; // Verifier preprocessed input x·[1]_2 uint256 constant X2x1 = 21831381940315734285607113342023901060522397560371972897001948545212302161822; From 44b80863033aa391a4fb828cdc978e92838a4078 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Thu, 25 Jan 2024 23:14:29 +0100 Subject: [PATCH 173/230] update precommit --- .githooks/pre-commit | 1 + compiled-contracts/PolygonDataCommittee.json | 253 +++++++++++++++++++ 2 files changed, 254 insertions(+) create mode 100644 compiled-contracts/PolygonDataCommittee.json diff --git a/.githooks/pre-commit b/.githooks/pre-commit index c58169835..312223d17 100755 --- a/.githooks/pre-commit +++ b/.githooks/pre-commit @@ -35,6 +35,7 @@ if npm run lint; then cp artifacts/contracts/v2/consensus/zkEVM/PolygonZkEVMExistentEtrog.sol/PolygonZkEVMExistentEtrog.json compiled-contracts/ cp artifacts/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol/PolygonValidiumEtrog.json compiled-contracts/ + cp artifacts/contracts/v2/consensus/validium/PolygonDataCommittee.sol/PolygonDataCommittee.json compiled-contracts/ git add compiled-contracts exit 0 else diff --git a/compiled-contracts/PolygonDataCommittee.json b/compiled-contracts/PolygonDataCommittee.json new file mode 100644 index 000000000..533df028a --- /dev/null +++ b/compiled-contracts/PolygonDataCommittee.json @@ -0,0 +1,253 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonDataCommittee", + "sourceName": "contracts/v2/consensus/validium/PolygonDataCommittee.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "CommitteeAddressDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "EmptyURLNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "TooManyRequiredSignatures", + "type": "error" + }, + { + "inputs": [], + "name": "UnexpectedAddrsAndSignaturesSize", + "type": "error" + }, + { + "inputs": [], + "name": "UnexpectedAddrsBytesLength", + "type": "error" + }, + { + "inputs": [], + "name": "UnexpectedCommitteeHash", + "type": "error" + }, + { + "inputs": [], + "name": "WrongAddrOrder", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "committeeHash", + "type": "bytes32" + } + ], + "name": "CommitteeUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "committeeHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAmountOfMembers", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProcotolName", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "members", + "outputs": [ + { + "internalType": "string", + "name": "url", + "type": "string" + }, + { + "internalType": "address", + "name": "addr", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "requiredAmountOfSignatures", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_requiredAmountOfSignatures", + "type": "uint256" + }, + { + "internalType": "string[]", + "name": "urls", + "type": "string[]" + }, + { + "internalType": "bytes", + "name": "addrsBytes", + "type": "bytes" + } + ], + "name": "setupCommittee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "signedHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "signaturesAndAddrs", + "type": "bytes" + } + ], + "name": "verifyMessage", + "outputs": [], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x608060405234801561000f575f80fd5b5061001861001d565b6100da565b5f54610100900460ff16156100885760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811610156100d8575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6115d7806100e75f395ff3fe608060405234801561000f575f80fd5b50600436106100c4575f3560e01c8063715018a61161007d578063dce1e2b611610058578063dce1e2b614610172578063e4f171201461017a578063f2fde38b146101b9575f80fd5b8063715018a61461013a5780638129fc1c146101425780638da5cb5b1461014a575f80fd5b80635daf08ca116100ad5780635daf08ca146100f0578063609d45441461011a5780636beedd3914610131575f80fd5b8063078fba2a146100c85780633b51be4b146100dd575b5f80fd5b6100db6100d6366004610fab565b6101cc565b005b6100db6100eb36600461104d565b6104c8565b6101036100fe366004611095565b61070a565b60405161011192919061110d565b60405180910390f35b61012360665481565b604051908152602001610111565b61012360655481565b6100db6107d5565b6100db6107e8565b60335460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610111565b606754610123565b604080518082018252601981527f44617461417661696c6162696c697479436f6d6d697474656500000000000000602082015290516101119190611144565b6100db6101c736600461115d565b610979565b6101d4610a2d565b828581101561020f576040517f2e7dcd6e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61021a6014826111bd565b8214610252576040517f2ab6a12900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61025d60675f610ec3565b5f805b8281101561046c575f6102746014836111bd565b90505f8682876102856014836111d4565b92610292939291906111e7565b61029b9161120e565b60601c90508888848181106102b2576102b2611256565b90506020028101906102c49190611283565b90505f036102fe576040517fb54b70e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610610363576040517fd53cfbe000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606760405180604001604052808b8b8781811061038257610382611256565b90506020028101906103949190611283565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92018290525093855250505073ffffffffffffffffffffffffffffffffffffffff8516602092830152835460018101855593815220815191926002020190819061040790826113b0565b5060209190910151600190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911790559250819050610464816114c8565b915050610260565b50838360405161047d9291906114ff565b6040519081900381206066819055606589905581527f831403fd381b3e6ac875d912ec2eee0e0203d0d29f7b3e0c96fc8f582d6db6579060200160405180910390a150505050505050565b6065545f6104d78260416111bd565b9050808310806104fb575060146104ee828561150e565b6104f8919061154e565b15155b15610532576040517f6b8eec4600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606654610541848381886111e7565b60405161054f9291906114ff565b60405180910390201461058e576040517f6b156b2800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80601461059c848761150e565b6105a69190611561565b90505f5b84811015610700575f6105be6041836111bd565b90505f6106198a8a848b6105d36041836111d4565b926105e0939291906111e7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610aae92505050565b90505f855b858110156106b2575f6106326014836111bd565b61063c908a6111d4565b90505f8c828d61064d6014836111d4565b9261065a939291906111e7565b6106639161120e565b60601c905073ffffffffffffffffffffffffffffffffffffffff8516810361069d576106908360016111d4565b98506001935050506106b2565b505080806106aa906114c8565b91505061061e565b50806106ea576040517fe12afaf500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505080806106f8906114c8565b9150506105aa565b5050505050505050565b60678181548110610719575f80fd5b905f5260205f2090600202015f91509050805f01805461073890611311565b80601f016020809104026020016040519081016040528092919081815260200182805461076490611311565b80156107af5780601f10610786576101008083540402835291602001916107af565b820191905f5260205f20905b81548152906001019060200180831161079257829003601f168201915b5050506001909301549192505073ffffffffffffffffffffffffffffffffffffffff1682565b6107dd610a2d565b6107e65f610ad2565b565b5f54610100900460ff161580801561080657505f54600160ff909116105b8061081f5750303b15801561081f57505f5460ff166001145b6108b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561090c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610914610b48565b8015610976575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b610981610a2d565b73ffffffffffffffffffffffffffffffffffffffff8116610a24576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108a7565b61097681610ad2565b60335473ffffffffffffffffffffffffffffffffffffffff1633146107e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108a7565b5f805f610abb8585610be7565b91509150610ac881610c29565b5090505b92915050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff16610bde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108a7565b6107e633610ad2565b5f808251604103610c1b576020830151604084015160608501515f1a610c0f87828585610ddb565b94509450505050610c22565b505f905060025b9250929050565b5f816004811115610c3c57610c3c611574565b03610c445750565b6001816004811115610c5857610c58611574565b03610cbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016108a7565b6002816004811115610cd357610cd3611574565b03610d3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016108a7565b6003816004811115610d4e57610d4e611574565b03610976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016108a7565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610e1057505f90506003610eba565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610e61573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116610eb4575f60019250925050610eba565b91505f90505b94509492505050565b5080545f8255600202905f5260205f209081019061097691905b80821115610f23575f610ef08282610f27565b506001810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055600201610edd565b5090565b508054610f3390611311565b5f825580601f10610f42575050565b601f0160209004905f5260205f209081019061097691905b80821115610f23575f8155600101610f5a565b5f8083601f840112610f7d575f80fd5b50813567ffffffffffffffff811115610f94575f80fd5b602083019150836020828501011115610c22575f80fd5b5f805f805f60608688031215610fbf575f80fd5b85359450602086013567ffffffffffffffff80821115610fdd575f80fd5b818801915088601f830112610ff0575f80fd5b813581811115610ffe575f80fd5b8960208260051b8501011115611012575f80fd5b60208301965080955050604088013591508082111561102f575f80fd5b5061103c88828901610f6d565b969995985093965092949392505050565b5f805f6040848603121561105f575f80fd5b83359250602084013567ffffffffffffffff81111561107c575f80fd5b61108886828701610f6d565b9497909650939450505050565b5f602082840312156110a5575f80fd5b5035919050565b5f81518084525f5b818110156110d0576020818501810151868301820152016110b4565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b604081525f61111f60408301856110ac565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b602081525f61115660208301846110ac565b9392505050565b5f6020828403121561116d575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114611156575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082028115828204841417610acc57610acc611190565b80820180821115610acc57610acc611190565b5f80858511156111f5575f80fd5b83861115611201575f80fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000813581811691601485101561124e5780818660140360031b1b83161692505b505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126112b6575f80fd5b83018035915067ffffffffffffffff8211156112d0575f80fd5b602001915036819003821315610c22575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b600181811c9082168061132557607f821691505b60208210810361135c577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f8211156113ab575f81815260208120601f850160051c810160208610156113885750805b601f850160051c820191505b818110156113a757828155600101611394565b5050505b505050565b815167ffffffffffffffff8111156113ca576113ca6112e4565b6113de816113d88454611311565b84611362565b602080601f831160018114611430575f84156113fa5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556113a7565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561147c5788860151825594840194600190910190840161145d565b50858210156114b857878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036114f8576114f8611190565b5060010190565b818382375f9101908152919050565b81810381811115610acc57610acc611190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f8261155c5761155c611521565b500690565b5f8261156f5761156f611521565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffdfea2646970667358221220c5b9be0f0bb23e7a751c29d209c8012b88e672b5c9d6b5f36034c020fec6ecec64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106100c4575f3560e01c8063715018a61161007d578063dce1e2b611610058578063dce1e2b614610172578063e4f171201461017a578063f2fde38b146101b9575f80fd5b8063715018a61461013a5780638129fc1c146101425780638da5cb5b1461014a575f80fd5b80635daf08ca116100ad5780635daf08ca146100f0578063609d45441461011a5780636beedd3914610131575f80fd5b8063078fba2a146100c85780633b51be4b146100dd575b5f80fd5b6100db6100d6366004610fab565b6101cc565b005b6100db6100eb36600461104d565b6104c8565b6101036100fe366004611095565b61070a565b60405161011192919061110d565b60405180910390f35b61012360665481565b604051908152602001610111565b61012360655481565b6100db6107d5565b6100db6107e8565b60335460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610111565b606754610123565b604080518082018252601981527f44617461417661696c6162696c697479436f6d6d697474656500000000000000602082015290516101119190611144565b6100db6101c736600461115d565b610979565b6101d4610a2d565b828581101561020f576040517f2e7dcd6e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61021a6014826111bd565b8214610252576040517f2ab6a12900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61025d60675f610ec3565b5f805b8281101561046c575f6102746014836111bd565b90505f8682876102856014836111d4565b92610292939291906111e7565b61029b9161120e565b60601c90508888848181106102b2576102b2611256565b90506020028101906102c49190611283565b90505f036102fe576040517fb54b70e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610610363576040517fd53cfbe000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606760405180604001604052808b8b8781811061038257610382611256565b90506020028101906103949190611283565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92018290525093855250505073ffffffffffffffffffffffffffffffffffffffff8516602092830152835460018101855593815220815191926002020190819061040790826113b0565b5060209190910151600190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911790559250819050610464816114c8565b915050610260565b50838360405161047d9291906114ff565b6040519081900381206066819055606589905581527f831403fd381b3e6ac875d912ec2eee0e0203d0d29f7b3e0c96fc8f582d6db6579060200160405180910390a150505050505050565b6065545f6104d78260416111bd565b9050808310806104fb575060146104ee828561150e565b6104f8919061154e565b15155b15610532576040517f6b8eec4600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606654610541848381886111e7565b60405161054f9291906114ff565b60405180910390201461058e576040517f6b156b2800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80601461059c848761150e565b6105a69190611561565b90505f5b84811015610700575f6105be6041836111bd565b90505f6106198a8a848b6105d36041836111d4565b926105e0939291906111e7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610aae92505050565b90505f855b858110156106b2575f6106326014836111bd565b61063c908a6111d4565b90505f8c828d61064d6014836111d4565b9261065a939291906111e7565b6106639161120e565b60601c905073ffffffffffffffffffffffffffffffffffffffff8516810361069d576106908360016111d4565b98506001935050506106b2565b505080806106aa906114c8565b91505061061e565b50806106ea576040517fe12afaf500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505080806106f8906114c8565b9150506105aa565b5050505050505050565b60678181548110610719575f80fd5b905f5260205f2090600202015f91509050805f01805461073890611311565b80601f016020809104026020016040519081016040528092919081815260200182805461076490611311565b80156107af5780601f10610786576101008083540402835291602001916107af565b820191905f5260205f20905b81548152906001019060200180831161079257829003601f168201915b5050506001909301549192505073ffffffffffffffffffffffffffffffffffffffff1682565b6107dd610a2d565b6107e65f610ad2565b565b5f54610100900460ff161580801561080657505f54600160ff909116105b8061081f5750303b15801561081f57505f5460ff166001145b6108b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561090c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610914610b48565b8015610976575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b610981610a2d565b73ffffffffffffffffffffffffffffffffffffffff8116610a24576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108a7565b61097681610ad2565b60335473ffffffffffffffffffffffffffffffffffffffff1633146107e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108a7565b5f805f610abb8585610be7565b91509150610ac881610c29565b5090505b92915050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff16610bde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108a7565b6107e633610ad2565b5f808251604103610c1b576020830151604084015160608501515f1a610c0f87828585610ddb565b94509450505050610c22565b505f905060025b9250929050565b5f816004811115610c3c57610c3c611574565b03610c445750565b6001816004811115610c5857610c58611574565b03610cbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016108a7565b6002816004811115610cd357610cd3611574565b03610d3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016108a7565b6003816004811115610d4e57610d4e611574565b03610976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016108a7565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610e1057505f90506003610eba565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610e61573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116610eb4575f60019250925050610eba565b91505f90505b94509492505050565b5080545f8255600202905f5260205f209081019061097691905b80821115610f23575f610ef08282610f27565b506001810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055600201610edd565b5090565b508054610f3390611311565b5f825580601f10610f42575050565b601f0160209004905f5260205f209081019061097691905b80821115610f23575f8155600101610f5a565b5f8083601f840112610f7d575f80fd5b50813567ffffffffffffffff811115610f94575f80fd5b602083019150836020828501011115610c22575f80fd5b5f805f805f60608688031215610fbf575f80fd5b85359450602086013567ffffffffffffffff80821115610fdd575f80fd5b818801915088601f830112610ff0575f80fd5b813581811115610ffe575f80fd5b8960208260051b8501011115611012575f80fd5b60208301965080955050604088013591508082111561102f575f80fd5b5061103c88828901610f6d565b969995985093965092949392505050565b5f805f6040848603121561105f575f80fd5b83359250602084013567ffffffffffffffff81111561107c575f80fd5b61108886828701610f6d565b9497909650939450505050565b5f602082840312156110a5575f80fd5b5035919050565b5f81518084525f5b818110156110d0576020818501810151868301820152016110b4565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b604081525f61111f60408301856110ac565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b602081525f61115660208301846110ac565b9392505050565b5f6020828403121561116d575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114611156575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082028115828204841417610acc57610acc611190565b80820180821115610acc57610acc611190565b5f80858511156111f5575f80fd5b83861115611201575f80fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000813581811691601485101561124e5780818660140360031b1b83161692505b505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126112b6575f80fd5b83018035915067ffffffffffffffff8211156112d0575f80fd5b602001915036819003821315610c22575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b600181811c9082168061132557607f821691505b60208210810361135c577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f8211156113ab575f81815260208120601f850160051c810160208610156113885750805b601f850160051c820191505b818110156113a757828155600101611394565b5050505b505050565b815167ffffffffffffffff8111156113ca576113ca6112e4565b6113de816113d88454611311565b84611362565b602080601f831160018114611430575f84156113fa5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556113a7565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561147c5788860151825594840194600190910190840161145d565b50858210156114b857878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036114f8576114f8611190565b5060010190565b818382375f9101908152919050565b81810381811115610acc57610acc611190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f8261155c5761155c611521565b500690565b5f8261156f5761156f611521565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffdfea2646970667358221220c5b9be0f0bb23e7a751c29d209c8012b88e672b5c9d6b5f36034c020fec6ecec64736f6c63430008140033", + "linkReferences": {}, + "deployedLinkReferences": {} +} From 125b6164c0148d441ec5f481f7e4d65672951ade Mon Sep 17 00:00:00 2001 From: invocamanman Date: Thu, 25 Jan 2024 23:43:00 +0100 Subject: [PATCH 174/230] verifier script --- hardhat.config.ts | 18 +++++ package.json | 7 +- upgrade/upgradeToV2/upgradeToV2.ts | 55 ++++++++++++- upgrade/upgradeToV2/verifyContracts.ts | 108 +++++++++++++++++++++++++ 4 files changed, 182 insertions(+), 6 deletions(-) create mode 100644 upgrade/upgradeToV2/verifyContracts.ts diff --git a/hardhat.config.ts b/hardhat.config.ts index 07c6270f4..51fb887b6 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -222,6 +222,15 @@ const config: HardhatUserConfig = { count: 20, }, }, + zkevmDevnet: { + url: "http://123:123:123:123:123", + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, + }, }, gasReporter: { enabled: !!process.env.REPORT_GAS, @@ -235,6 +244,7 @@ const config: HardhatUserConfig = { goerli: `${process.env.ETHERSCAN_API_KEY}`, sepolia: `${process.env.ETHERSCAN_API_KEY}`, mainnet: `${process.env.ETHERSCAN_API_KEY}`, + zkevmDevnet: `${process.env.ETHERSCAN_API_KEY}`, }, customChains: [ { @@ -253,6 +263,14 @@ const config: HardhatUserConfig = { browserURL: "https://testnet-zkevm.polygonscan.com/", }, }, + { + network: "zkevmDevnet", + chainId: 123, + urls: { + apiURL: "http://123:123:123:123:123/api", + browserURL: "http://123:123:123:123:123", + }, + }, ], }, }; diff --git a/package.json b/package.json index d2042275d..5f09cb661 100644 --- a/package.json +++ b/package.json @@ -96,8 +96,11 @@ "docker:v1ToV2:contracts": "./docker/scripts/v1ToV2/deploy-docker.sh", "dockerv2:v1ToV2:contracts": "sudo ./docker/scripts/v1ToV2/deploy-dockerv2.sh", "saveDeployment:sepolia": "mkdir -p deployments/sepolia_$(date +%s) && cp -r deployment/v2/deploy_*.json deployments/sepolia_$(date +%s) && cp .openzeppelin/sepolia.json deployments/sepolia_$(date +%s) && cp deployment/v2/genesis.json deployments/sepolia_$(date +%s) && cp deployment/v2/create_rollup_output.json deployments/sepolia_$(date +%s)", + "testnetPol:upgradeV2:sepolia": "npx hardhat run upgrade/upgradeToV2/testnet/deployTestnetPol.ts --network sepolia", "upgradev2:timelock:goerli": "npx hardhat run upgrade/upgradeToV2/upgradeToV2.ts --network goerli", - "upgradev2L2:timelock:goerli": "npx hardhat run upgrade/upgradeToV2/upgradeL2ToV2.ts --network zkevm" - + "upgradev2:timelock:sepolia": "npx hardhat run upgrade/upgradeToV2/upgradeToV2.ts --network sepolia", + "verify:upgradeV2:sepolia": "npx hardhat run upgrade/upgradeToV2/verifyContracts.ts --network sepolia", + "verify:upgradeV2:goerli": "npx hardhat run upgrade/upgradeToV2/verifyContracts.ts --network goerli", + "upgradev2L2:timelock:zkevmDevnet": "npx hardhat run upgrade/upgradeToV2/upgradeL2ToV2.ts --network zkevmDevnet" } } \ No newline at end of file diff --git a/upgrade/upgradeToV2/upgradeToV2.ts b/upgrade/upgradeToV2/upgradeToV2.ts index 5d9a5f5dc..f9dad8e47 100644 --- a/upgrade/upgradeToV2/upgradeToV2.ts +++ b/upgrade/upgradeToV2/upgradeToV2.ts @@ -14,18 +14,64 @@ const deployParameters = require("./deploy_parameters.json"); const deployOutputParameters = require("./deploy_output.json"); const upgradeParameters = require("./upgrade_parameters.json"); -const pathOZUpgradability = path.join(__dirname, `../../.openzeppelin/${process.env.HARDHAT_NETWORK}.json`); - async function main() { + /* + * Check deploy parameters + * Check that every necessary parameter is fullfilled + */ + const mandatoryDeploymentParameters = [ + "admin", + "trustedAggregator", + "trustedAggregatorTimeout", + "pendingStateTimeout", + "zkEVMOwner", + "chainID", + ]; + + for (const parameterName of mandatoryDeploymentParameters) { + if (deployParameters[parameterName] === undefined || deployParameters[parameterName] === "") { + throw new Error(`Missing parameter: ${parameterName}`); + } + } + const {admin, trustedAggregator, trustedAggregatorTimeout, pendingStateTimeout, zkEVMOwner, chainID} = deployParameters; const emergencyCouncilAddress = zkEVMOwner; + /* + * Check upgrade parameters + * Check that every necessary parameter is fullfilled + */ + const mandatoryUpgradeParameters = ["realVerifier", "newForkID", "timelockDelay", "polTokenAddress"]; + + for (const parameterName of mandatoryUpgradeParameters) { + if (upgradeParameters[parameterName] === undefined || upgradeParameters[parameterName] === "") { + throw new Error(`Missing parameter: ${parameterName}`); + } + } + const {realVerifier, newForkID, timelockDelay, polTokenAddress} = upgradeParameters; const salt = upgradeParameters.timelockSalt || ethers.ZeroHash; + /* + * Check output parameters + * Check that every necessary parameter is fullfilled + */ + const mandatoryOutputParameters = [ + "polygonZkEVMBridgeAddress", + "polygonZkEVMGlobalExitRootAddress", + "polygonZkEVMAddress", + "timelockContractAddress", + ]; + + for (const parameterName of mandatoryOutputParameters) { + if (deployOutputParameters[parameterName] === undefined || deployOutputParameters[parameterName] === "") { + throw new Error(`Missing parameter: ${parameterName}`); + } + } + const currentBridgeAddress = deployOutputParameters.polygonZkEVMBridgeAddress; const currentGlobalExitRootAddress = deployOutputParameters.polygonZkEVMGlobalExitRootAddress; const currentPolygonZkEVMAddress = deployOutputParameters.polygonZkEVMAddress; @@ -124,7 +170,7 @@ async function main() { ); // prepare upgrade global exit root - // Prepare Upgrade PolygonZkEVMBridge + // Prepare Upgrade PolygonZkEVMGlobalExitRootV2 const polygonGlobalExitRootV2 = await ethers.getContractFactory("PolygonZkEVMGlobalExitRootV2", deployer); const newGlobalExitRoortImpl = await upgrades.prepareUpgrade( @@ -158,7 +204,7 @@ async function main() { // Update current system to rollup manager - // deploy polygon + // deploy polygon zkEVM impl const PolygonZkEVMV2ExistentFactory = await ethers.getContractFactory("PolygonZkEVMExistentEtrog"); const polygonZkEVMEtrogImpl = await PolygonZkEVMV2ExistentFactory.deploy( currentGlobalExitRootAddress, @@ -182,6 +228,7 @@ async function main() { currentPolygonZkEVMAddress, ]); + // deploy polygon zkEVM proxy const PolygonTransparentProxy = await ethers.getContractFactory("PolygonTransparentProxy"); const newPolygonZkEVMContract = await PolygonTransparentProxy.deploy( polygonZkEVMEtrogImpl.target, diff --git a/upgrade/upgradeToV2/verifyContracts.ts b/upgrade/upgradeToV2/verifyContracts.ts new file mode 100644 index 000000000..631c65069 --- /dev/null +++ b/upgrade/upgradeToV2/verifyContracts.ts @@ -0,0 +1,108 @@ +/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if */ +/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */ +import {expect} from "chai"; +import path = require("path"); +import fs = require("fs"); + +import * as dotenv from "dotenv"; +dotenv.config({path: path.resolve(__dirname, "../../.env")}); +import {ethers, upgrades, run} from "hardhat"; + +const outputJson = require("./upgrade_output.json"); + +const deployParameters = require("./deploy_parameters.json"); +const deployOutputParameters = require("./deploy_output.json"); +const upgradeParameters = require("./upgrade_parameters.json"); + +async function main() { + // load deployer account + if (typeof process.env.ETHERSCAN_API_KEY === "undefined") { + throw new Error("Etherscan API KEY has not been defined"); + } + + const {polTokenAddress} = upgradeParameters; + const currentBridgeAddress = deployOutputParameters.polygonZkEVMBridgeAddress; + const currentGlobalExitRootAddress = deployOutputParameters.polygonZkEVMGlobalExitRootAddress; + const currentPolygonZkEVMAddress = deployOutputParameters.polygonZkEVMAddress; + + try { + // verify verifier + await run("verify:verify", { + address: outputJson.verifierAddress, + }); + } catch (error: any) { + // expect(error.message.toLowerCase().includes("already verified")).to.be.equal(true); + } + + // Verify bridge + try { + await run("verify:verify", { + address: currentBridgeAddress, + }); + } catch (error: any) { + // expect(error.message.toLowerCase().includes("already verified")).to.be.equal(true); + } + + // verify global exit root + try { + await run("verify:verify", { + address: currentGlobalExitRootAddress, + constructorArguments: [currentPolygonZkEVMAddress, currentBridgeAddress], + }); + } catch (error: any) { + // expect(error.message.toLowerCase().includes("already verified")).to.be.equal(true); + } + + // verify zkEVM implementation + const implNewZkEVM = await upgrades.erc1967.getImplementationAddress(outputJson.newPolygonZKEVM); + try { + await run("verify:verify", { + address: implNewZkEVM, + constructorArguments: [ + currentGlobalExitRootAddress, + polTokenAddress, + currentBridgeAddress, + currentPolygonZkEVMAddress, + ], + }); + } catch (error: any) { + // expect(error.message.toLowerCase().includes("proxyadmin")).to.be.equal(true); + } + + // verify zkEVM proxy + try { + await run("verify:verify", { + address: outputJson.newPolygonZKEVM, + constructorArguments: [implNewZkEVM, currentPolygonZkEVMAddress, "0x"], + }); + } catch (error: any) { + // expect(error.message.toLowerCase().includes("proxyadmin")).to.be.equal(true); + } + + // verify zkEVM proxy + try { + await run("verify:verify", { + address: outputJson.newPolygonZKEVM, + constructorArguments: [implNewZkEVM, currentPolygonZkEVMAddress, "0x"], + }); + } catch (error: any) { + // expect(error.message.toLowerCase().includes("proxyadmin")).to.be.equal(true); + } + + // verify rollup manager + try { + await run("verify:verify", { + address: currentPolygonZkEVMAddress, + constructorArguments: [currentGlobalExitRootAddress, polTokenAddress, currentBridgeAddress], + }); + } catch (error: any) { + // expect(error.message.toLowerCase().includes("proxyadmin")).to.be.equal(true); + } +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); From 38faecb1c24b2d906fbec78bef7f082055cb45a6 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Fri, 26 Jan 2024 10:56:53 +0100 Subject: [PATCH 175/230] fix version of some contracts --- contracts/v2/consensus/validium/PolygonValidiumEtrog.sol | 2 +- contracts/v2/consensus/zkEVM/PolygonZkEVMEtrog.sol | 2 +- contracts/v2/consensus/zkEVM/PolygonZkEVMExistentEtrog.sol | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol b/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol index 2bb9d7293..4bb67660e 100644 --- a/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol +++ b/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.20; +pragma solidity 0.8.20; import "../../lib/PolygonRollupBaseEtrog.sol"; import "../../interfaces/IDataAvailabilityProtocol.sol"; diff --git a/contracts/v2/consensus/zkEVM/PolygonZkEVMEtrog.sol b/contracts/v2/consensus/zkEVM/PolygonZkEVMEtrog.sol index 402e604b4..efb4ef8ab 100644 --- a/contracts/v2/consensus/zkEVM/PolygonZkEVMEtrog.sol +++ b/contracts/v2/consensus/zkEVM/PolygonZkEVMEtrog.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.20; +pragma solidity 0.8.20; import "../../lib/PolygonRollupBaseEtrog.sol"; diff --git a/contracts/v2/consensus/zkEVM/PolygonZkEVMExistentEtrog.sol b/contracts/v2/consensus/zkEVM/PolygonZkEVMExistentEtrog.sol index 431519dda..2d0105268 100644 --- a/contracts/v2/consensus/zkEVM/PolygonZkEVMExistentEtrog.sol +++ b/contracts/v2/consensus/zkEVM/PolygonZkEVMExistentEtrog.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity ^0.8.20; +pragma solidity 0.8.20; import "../../lib/PolygonRollupBaseEtrog.sol"; From 85091cf53e57b887176412929d308d4730b0754b Mon Sep 17 00:00:00 2001 From: invocamanman Date: Fri, 26 Jan 2024 13:20:10 +0100 Subject: [PATCH 176/230] slince warnings --- upgrade/upgradeToV2/upgradeL2ToV2.ts | 2 ++ upgrade/upgradeToV2/upgradeToV2.ts | 2 ++ 2 files changed, 4 insertions(+) diff --git a/upgrade/upgradeToV2/upgradeL2ToV2.ts b/upgrade/upgradeToV2/upgradeL2ToV2.ts index d8cbaed16..70e7b8bb4 100644 --- a/upgrade/upgradeToV2/upgradeL2ToV2.ts +++ b/upgrade/upgradeToV2/upgradeL2ToV2.ts @@ -14,6 +14,8 @@ const deployOutputParameters = require("./deploy_output.json"); const upgradeParameters = require("./upgrade_parameters.json"); async function main() { + upgrades.silenceWarnings(); + const salt = upgradeParameters.timelockSalt || ethers.ZeroHash; const timelockDelay = deployParameters.minDelayTimelock; const currentBridgeAddress = deployOutputParameters.polygonZkEVMBridgeAddress; diff --git a/upgrade/upgradeToV2/upgradeToV2.ts b/upgrade/upgradeToV2/upgradeToV2.ts index f9dad8e47..49946bb9c 100644 --- a/upgrade/upgradeToV2/upgradeToV2.ts +++ b/upgrade/upgradeToV2/upgradeToV2.ts @@ -15,6 +15,8 @@ const deployOutputParameters = require("./deploy_output.json"); const upgradeParameters = require("./upgrade_parameters.json"); async function main() { + upgrades.silenceWarnings(); + /* * Check deploy parameters * Check that every necessary parameter is fullfilled From 6f400cf6254d58dc1a1fd34e716c551b357ae63c Mon Sep 17 00:00:00 2001 From: invocamanman Date: Fri, 26 Jan 2024 13:33:17 +0100 Subject: [PATCH 177/230] update scripts, save updates --- package.json | 9 ++++++--- upgrade/{ => timelockTransaction}/README.md | 0 upgrade/{ => timelockTransaction}/deployVerifier.js | 0 upgrade/{ => timelockTransaction}/simpleUpgrade.js | 0 upgrade/{ => timelockTransaction}/timeLockUpgrade.js | 0 .../upgrade_parameters.json.example | 0 6 files changed, 6 insertions(+), 3 deletions(-) rename upgrade/{ => timelockTransaction}/README.md (100%) rename upgrade/{ => timelockTransaction}/deployVerifier.js (100%) rename upgrade/{ => timelockTransaction}/simpleUpgrade.js (100%) rename upgrade/{ => timelockTransaction}/timeLockUpgrade.js (100%) rename upgrade/{ => timelockTransaction}/upgrade_parameters.json.example (100%) diff --git a/package.json b/package.json index 5f09cb661..aa3a01692 100644 --- a/package.json +++ b/package.json @@ -97,10 +97,13 @@ "dockerv2:v1ToV2:contracts": "sudo ./docker/scripts/v1ToV2/deploy-dockerv2.sh", "saveDeployment:sepolia": "mkdir -p deployments/sepolia_$(date +%s) && cp -r deployment/v2/deploy_*.json deployments/sepolia_$(date +%s) && cp .openzeppelin/sepolia.json deployments/sepolia_$(date +%s) && cp deployment/v2/genesis.json deployments/sepolia_$(date +%s) && cp deployment/v2/create_rollup_output.json deployments/sepolia_$(date +%s)", "testnetPol:upgradeV2:sepolia": "npx hardhat run upgrade/upgradeToV2/testnet/deployTestnetPol.ts --network sepolia", - "upgradev2:timelock:goerli": "npx hardhat run upgrade/upgradeToV2/upgradeToV2.ts --network goerli", - "upgradev2:timelock:sepolia": "npx hardhat run upgrade/upgradeToV2/upgradeToV2.ts --network sepolia", + "upgradev2:timelock:goerli": "npx hardhat run upgrade/upgradeToV2/upgradeToV2.ts --network goerli && saveUpgradeV2:goerli", + "upgradev2:timelock:sepolia": "npx hardhat run upgrade/upgradeToV2/upgradeToV2.ts --network sepolia && saveUpgradeV2:sepolia", "verify:upgradeV2:sepolia": "npx hardhat run upgrade/upgradeToV2/verifyContracts.ts --network sepolia", "verify:upgradeV2:goerli": "npx hardhat run upgrade/upgradeToV2/verifyContracts.ts --network goerli", - "upgradev2L2:timelock:zkevmDevnet": "npx hardhat run upgrade/upgradeToV2/upgradeL2ToV2.ts --network zkevmDevnet" + "upgradev2L2:timelock:zkevmDevnet": "npx hardhat run upgrade/upgradeToV2/upgradeL2ToV2.ts --network zkevmDevnet", + "saveUpgradeV2:sepolia": "mkdir -p upgrade/upgradeToV2/sepolia_$(date +%s) && cp -r upgrade/upgradeToV2/upgrade_*.json upgrade/upgradeToV2/sepolia_$(date +%s) && cp -r upgrade/upgradeToV2/deploy_*.json upgrade/upgradeToV2/sepolia_$(date +%s) && cp .openzeppelin/sepolia.json upgrade/upgradeToV2/sepolia_$(date +%s)", + "saveUpgradeV2:goerli": "mkdir -p upgrade/upgradeToV2/goerli_$(date +%s) && cp -r upgrade/upgradeToV2/upgrade_*.json upgrade/upgradeToV2/goerli_$(date +%s) && cp -r upgrade/upgradeToV2/deploy_*.json upgrade/upgradeToV2/goerli_$(date +%s) && cp .openzeppelin/goerli.json upgrade/upgradeToV2/goerli_$(date +%s)" + } } \ No newline at end of file diff --git a/upgrade/README.md b/upgrade/timelockTransaction/README.md similarity index 100% rename from upgrade/README.md rename to upgrade/timelockTransaction/README.md diff --git a/upgrade/deployVerifier.js b/upgrade/timelockTransaction/deployVerifier.js similarity index 100% rename from upgrade/deployVerifier.js rename to upgrade/timelockTransaction/deployVerifier.js diff --git a/upgrade/simpleUpgrade.js b/upgrade/timelockTransaction/simpleUpgrade.js similarity index 100% rename from upgrade/simpleUpgrade.js rename to upgrade/timelockTransaction/simpleUpgrade.js diff --git a/upgrade/timeLockUpgrade.js b/upgrade/timelockTransaction/timeLockUpgrade.js similarity index 100% rename from upgrade/timeLockUpgrade.js rename to upgrade/timelockTransaction/timeLockUpgrade.js diff --git a/upgrade/upgrade_parameters.json.example b/upgrade/timelockTransaction/upgrade_parameters.json.example similarity index 100% rename from upgrade/upgrade_parameters.json.example rename to upgrade/timelockTransaction/upgrade_parameters.json.example From b1d01f1348455d246a0c9b9f5c4e42587d37c2c5 Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Fri, 26 Jan 2024 17:57:21 +0000 Subject: [PATCH 178/230] update verifier deployment document --- .../verifyMainnetProofVerifier.md | 236 ++++++++++-------- 1 file changed, 135 insertions(+), 101 deletions(-) diff --git a/verifyMainnetDeployment/verifyMainnetProofVerifier.md b/verifyMainnetDeployment/verifyMainnetProofVerifier.md index d43d7447a..f27c0c79d 100644 --- a/verifyMainnetDeployment/verifyMainnetProofVerifier.md +++ b/verifyMainnetDeployment/verifyMainnetProofVerifier.md @@ -1,4 +1,4 @@ -# Verify Deployment of Proof Verifier Smart Contract +# Verify deployment on testnet Sepolia of the proof verifier smart contract (etrog-fork.7) In order to verify the smart contract, you will need a machine with at least 256GB of RAM and 16 cores. @@ -30,7 +30,7 @@ sudo bash nodesource_setup.sh sudo apt install -y nodejs node -v ```` -The version of node should be: 18 (e.g. 18.14.0 ) +The version of node should be: 18 (e.g. 18.19.0 ) ## Download and prepare circom To compile circuits, we need circom installed. @@ -38,10 +38,10 @@ To compile circuits, we need circom installed. cd ~ git clone https://github.com/iden3/circom.git cd circom -git checkout v2.1.5 +git checkout v2.1.8 git log --pretty=format:'%H' -n 1 ```` -The hash of the commit should be: 127414e9088cc017a357233f30f3fd7d91a8906c +The hash of the commit should be: f0deda416abe91e5dd906c55507c737cd9986ab5 Install and compile circom (RUST) @@ -54,7 +54,7 @@ export PATH=$PATH:~/.cargo/bin echo 'PATH=$PATH:~/.cargo/bin' >> ~/.profile circom --version ```` -The version of circom should be: 2.1.5 +The version of circom should be: 2.1.8 ## Prepare fast build constant tree tool @@ -63,13 +63,13 @@ The version of circom should be: 2.1.5 cd ~ git clone https://github.com/0xPolygonHermez/zkevm-prover.git cd zkevm-prover -git checkout 221bafe31ee6a6e23d8f2853088ac27ee71deb8a +git checkout 40cde45deacede2b10a91ce2dd926abd2ba67541 git submodule init git submodule update sudo apt install -y build-essential libomp-dev libgmp-dev nlohmann-json3-dev libpqxx-dev nasm libgrpc++-dev libprotobuf-dev grpc-proto libsodium-dev uuid-dev libsecp256k1-dev make -j bctree ```` -this step takes less than 5 minutes. +this step takes less than 1 minute. ## Prepare and launch setup (zkevm-proverjs) @@ -77,7 +77,7 @@ this step takes less than 5 minutes. cd ~ git clone https://github.com/0xPolygonHermez/zkevm-proverjs.git cd zkevm-proverjs -git checkout fbe6b37a00d87ac6e4607ab9b91f4d514f7c72c1 +git checkout ede545493ca4ab6cbd136dbcc452c7794d01bb08 npm install tmux -c "npm run buildsetup --bctree=../zkevm-prover/build/bctree" ```` @@ -94,7 +94,34 @@ cd contract npm init -y npm install hardhat mkdir -p contracts/verifiers -echo -e "module.exports={solidity:{compilers:[{version: \"0.8.20\",settings:{optimizer:{enabled:true,runs:999999}}}]}}" > hardhat.config.js +```` +To generate the same bycode it's important recover exactlly same options used during compilation, we found this information with contract information on etherscan (Settings). For this smartcode compilation settings are: +```jsonld +{ + "optimizer": { + "enabled": true, + "runs": 999999 + }, + "evmVersion": "shanghai", + "outputSelection": { + "*": { + "*": [ + "evm.bytecode", + "evm.deployedBytecode", + "devdoc", + "userdoc", + "metadata", + "abi" + ] + } + }, + "libraries": {} +} +``` +Copy this information inside the file ~/contract/settings.json. To do it, use the editor as nano or vi. After that, execute the following commands. +````bash +cd ~/contract +echo -e "module.exports={solidity:{compilers:[{version: \"0.8.20\",settings:$(cat settings.json)}]}}" > hardhat.config.js ```` Once the project structure is created, we proceed to copy the smart contract generated in the previous step. This smart contract was saved on *~/zkevm-proverjs/build/proof*, and must be copied to *contracts/verifiers* with exactly the name *Verifier.sol*. If the name or the path changes, the hash of metadata changes too, for this reason, is essential to respect the name and the path. To do it could execute these commands ````bash @@ -104,30 +131,40 @@ sha256sum contracts/verifiers/FflonkVerifier.sol ```` The result should be: ```` -43e64ada9b72b53740f9ddb5a2c0d30be47f92628593fae247b95c6999861703 +8ae7baadd9f2ffb07862b0a74c20e1ad1cc2d4136e416ce5beac82a4e9a44923 ```` To compile smartcontract execute following command: ````bash npx hardhat compile ```` +> NOTE: During compilation warning is shown: +> Warning: Unused function parameter. Remove or comment out the variable name to silence this warning. +> --> contracts/verifiers/FflonkVerifier.sol:162:26: + Bytecode of smartcontract was on bytecode property of json file *Verifier.json* generated on path *artifacts/contracts/verifiers/FflonkVerifier.sol* ```` -608060405234801561001057600080fd5b50612b -a9806100206000396000f3fe6080604052348015 -61001057600080fd5b506004361061002b576000 +608060405234801561000f575f80fd5b506159c7 +806200001e5f395ff3fe60806040523480156100 +0f575f80fd5b5060043610610029575f3560e01c +80639121da8a1461002d575b5f80fd5b61004061 +003b366004615950565b610054565b6040519015 +15815260200160405180910390f35b5f6158e056 +5b6040516104c08201518082526020820191507f +30644e72e131a029b85045b68181585d2833e848 +79b9709143e1f593f00000016104e08401518209 +90508082526020820191507f30644e72e131a029 : : -612ae357612ae3612a4c565b604051601f82017f -ffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffe0908116603f011681 -01908382118183101715612b2957612b29612a4c -565b81604052828152886020848701011115612b -4257600080fd5b82602086016020830137600060 -2084830101528096505050505050612b6a846020 -8501612a7b565b9050925092905056fea2646970 -6673582212205b7f4daf66d2ec28ca29e86ee127 -0f601bb1fc509b9d879770258508d85a03676473 -6f6c63430008110033 +5b61590f8161286e565b61591983826128a7565b +61592281612906565b61592b81613e54565b6159 +3481614549565b61593d816151d0565b61594681 +6156ce565b9050805f5260205ff35b5f80610320 +808486031215615963575f80fd5b610300840185 +811115615974575f80fd5b849350858286011115 +615985575f80fd5b8092505050925092905056fe +a2646970667358221220761b1f07d5034592f204 +cb3439dbfabc28fb771c6e1bc6c8016e3d7b42ad +5a2164736f6c63430008140033 ```` To extract bytecode on file in one line. If you prefer do it , you cold copy and paste in a file. ````bash @@ -135,36 +172,36 @@ cd ~/contract grep bytecode artifacts/contracts/verifiers/FflonkVerifier.sol/FflonkVerifier.json |sed 's/.*"\(0x.*\)".*/\1/' > ~/contract/FflonkVerifier.sol.compiled.bytecode ```` > NOTE: if you prefer you can copy by hand the content of the bytecode of the file *artifacts/contracts/verifiers/FflonkVerifier.sol/FflonkVerifier.json* over files *FflonkVerifier.sol.compiled.bytecode*. Remember to copy only the content inside the double quotes (without double quotes). -> + +> NOTE: to see bytecode divided by lines could use following commands. +> sed "s/^0x//;s/\([0-9a-f]\{40\}\)/\1\n/g" ~/contract/FflonkVerifier.sol.compiled.bytecode | head +> sed "s/^0x//;s/\([0-9a-f]\{40\}\)/\1\n/g" ~/contract/FflonkVerifier.sol.compiled.bytecode | tail + Verify bytecode compiled: ```` sha256sum ~/contract/FflonkVerifier.sol.compiled.bytecode ```` The result should be: ```` -071fa7699cfe7be2516209373e148d1c306b7b12059b2d39779596c86d48a2c8 +34c11f41d424eb821b42630183c4b97dc8689163276ca50095e5918202950703 ```` ## Download bytecode of deployed smartcontract -To download bytecode of deployed smartcontract, need the address of smart contract, in this case it's *0x4F9A0e7FD2Bf6067db6994CF12E4495Df938E6e9*. Go to Etherscan, Blockscout or Beaconcha to get transaction bytecode. +To download bytecode of deployed smartcontract, need the address of smart contract, in this case it's *0x8d0aAd785905c5c9f942CB18a3AC1e50c4F52786*. Go to Etherscan or Beaconcha to get transaction bytecode. -Associated with address *0x4F9A0e7FD2Bf6067db6994CF12E4495Df938E6e9* found the transacction *0x3ed835c4a7677dae8e7a22b981be03a86540c10fec7953eaa1f979355513adbc*. +Associated with address *0x8d0aAd785905c5c9f942CB18a3AC1e50c4F52786* found the transacction *0xed0f103dc5e5f5bb8aa5df90a2bfb1949ad41dec8b04e5acc0747dbc1c26e837*. -- ### Etherscan (https://etherscan.io) - https://etherscan.io/address/0x4F9A0e7FD2Bf6067db6994CF12E4495Df938E6e9 -https://etherscan.io/tx/0x3ed835c4a7677dae8e7a22b981be03a86540c10fec7953eaa1f979355513adbc +- ### Etherscan (https://sepolia.etherscan.io) + https://sepolia.etherscan.io/address/0x8d0aAd785905c5c9f942CB18a3AC1e50c4F52786 + https://sepolia.etherscan.io/tx/0xed0f103dc5e5f5bb8aa5df90a2bfb1949ad41dec8b04e5acc0747dbc1c26e837 Click to see more > Input Data > Select all data and copy to clipboard. -- ### Blockscout (https://blockscout.com/eth/mainnet) - https://blockscout.com/eth/mainnet/address/0x4F9A0e7FD2Bf6067db6994CF12E4495Df938E6e9 -https://blockscout.com/eth/mainnet/tx/0x3ed835c4a7677dae8e7a22b981be03a86540c10fec7953eaa1f979355513adbc -View details > Raw input > Copy to clipboard - -- ### Beacocha (https://beaconcha.in) - https://beaconcha.in/address/0x4F9A0e7FD2Bf6067db6994CF12E4495Df938E6e9 -https://beaconcha.in/tx/0x3ed835c4a7677dae8e7a22b981be03a86540c10fec7953eaa1f979355513adbc +- ### Beacocha (https://sepolia.beaconcha.in) + https://sepolia.beaconcha.in/address/8d0aAd785905c5c9f942CB18a3AC1e50c4F52786 + https://sepolia.beaconcha.in/tx/0xed0f103dc5e5f5bb8aa5df90a2bfb1949ad41dec8b04e5acc0747dbc1c26e837 Advanced Info > Call Data > Select all data and copy to clipboard. + *NOTE: Don't use button "Copy Raw Data" because it generated non compatible format.* Some applications running on the terminal may limit the amount of input they will accept before their input buffers overflow. To avoid this situation create file *FflonkVerifier.sol.explorer.bytecode* with editor as nano or vi. @@ -185,8 +222,8 @@ sha256sum FflonkVerifier.sol.*.bytecode ```` The result should be: ```` -071fa7699cfe7be2516209373e148d1c306b7b12059b2d39779596c86d48a2c8 FflonkVerifier.sol.compiled.bytecode -071fa7699cfe7be2516209373e148d1c306b7b12059b2d39779596c86d48a2c8 FflonkVerifier.sol.explorer.bytecode +34c11f41d424eb821b42630183c4b97dc8689163276ca50095e5918202950703 FflonkVerifier.sol.compiled.bytecode +34c11f41d424eb821b42630183c4b97dc8689163276ca50095e5918202950703 FflonkVerifier.sol.explorer.bytecode ```` ## Generated files hash @@ -194,99 +231,96 @@ The result should be: - + - + - + - + - + - - + + - + - - + + - - - + + + - - + + - - + + - + - + - - + + - - - + + + - - + + - - + + - + - + - - + + - - - + + + - + - - + + - + - + - - + + - - - + + + - - + + - - + + - + - + - - + + - + - - + + - +
step/filesha256
buildrom
rom.jsoncc14764543db4c81ca6ce53b19d075f3a2c2a72783e6e8d2931698bd77321740
rom.json676c3f58263fc284bc53ef949dd1acedcfb090f3287ee080b2a277ed2157894a
buildpil
main.pil.jsond6559b5db541b18ec9e510eac3cb8a565b776f1e5fc3ff4797dda5e2b5841698
main.pil.jsone6220953585202f5ecfaa8d7bb2fe3d06bf85fb0af22c2fe46a97abd39ae9aa7
buildstoragerom
storage_sm_rom.json7443b587be9ad40b536adaa678f505450938095ce8175f663b22d3c0d03c0414
storage_sm_rom.json676c3f58263fc284bc53ef949dd1acedcfb090f3287ee080b2a277ed2157894a
buildconstants
zkevm.constf00d5df0a0e218ee6e3e90829e9e6ae4511e91e437b35a3b8e7ea539931ab34c
zkevm.const3d0c910c9bfa143209e8f545e23e2e98b29f4f5a40c04001fc8254aee9f121c7
buildstarkinfo
zkevm.starkstruct.json284b6ce275c637af4a0b4b10cd83a881c6f1b21e21ad7ea2276379ed8393b099
zkevm.starkinfo.jsonf2462a5e85bd6cb8e5348ce77a647b6d9695897e427119ce0baef71e638b0f91
zkevm.starkinfo.jsoncd4615be096817d14b3b19780897ad39f5cd26f83e5d17518dae7688563fcb54
buildconstanttree
zkevm.verkey.jsonda2a98e3a30c5ec8e2782297c98897803eac663b97cc43bd4808789e2b330932
zkevm.consttree66617503a2cc05c3ca05051d7ebb950c5b6f017eaf8315959ecbb5bc92eb770f
zkevm.verkey.json7d024c2295c3bc478de5a71c4006ede5731420236651e29a384609c913c8eee9
zkevm.consttree3d0c910c9bfa143209e8f545e23e2e98b29f4f5a40c04001fc8254aee9f121c7
gencircom
zkevm.verifier.circomf33ffebda25aca8bae1a43853a9903a923d981f5014dc0bb195121a6a162da32
zkevm.verifier.circome832840aa97ca0e47a448f24ac7019ea80bfb6e9354cbe2fd7a6dada1d5d807b
compilecircom
zkevm.verifier.r1csc875b3684b4d61e7e5301c028c46414797865502a1d3688d388dc8ec6f96a6fe
zkevm.verifier.symee4cd368c8c167cf7375bcfe437d048c1dd8c5e3088b247059b26f54f3568b9c
zkevm.verifier.r1cs25f656f632964f8c7800c4d222f34a6e94a576c9b4f3b81fbc2ba6f03889719f
zkevm.verifier.syme32fc039e6bb550f7d2e375804b0679c6761d488111e6aa9b3b3a638af08ec36
c12a_setup
c12a.pild1aa48508d82fccf82d3aeb2447aa0d5a696125710a1a1203ceb84acac9b4ec5
c12a.constea0f88c3bdd7116c14138f78396f5a87c8fcffc6708f4016b547cd83eb49b80b
c12a.exec30ebe05a0450a19e4534b81c09360776ae9384520f6f442d342e48f6428d7c13
c12a.pil13b74f6e33dcbfcb9aa1a5eb7a93691635f51f33aa91e7c867dec11509c93f4d
c12a.const5fffa6480307f60c9c1202539ae39051cbcb72863bb8e2db5bebf74a2d048f9b
c12a.exec6fe8e529645f1b72de3851ecd50dde6b830846c4cd3af0b83267151b11ec45e1
c12a_buildstarkinfo
c12a.starkstruct.json920b777dc3d6998c99514761d35d04bc4d129e3799d6ab1d0400eab19988ac6f
c12a.starkinfo.json9fc0fb3083069dc4a41501adf05423d9a44dd30e980847afcd5130435be96ea3
c12a.starkstruct.jsonc8ceea75f0aa05fdbdb20ac41b224355fde07a0dbeecd6649ff8c2636b9a759c
c12a.starkinfo.jsonc05b27f4538e8071a0e8045faeb8a6de8771053587ad657b07c9401b9597a663
c12a_buildconstanttree
c12a.verkey.json32d300ee8d19c8fa7ea66f153aedc4e017791f5a3ed60d728b7c24ab23529743
c12a.consttree8523301542c87b970e6e0f05d3ba91c521dfaf1e3cc30154455679966705e71c
c12a.verkey.jsone6a963de090b49ce93c058ffe5438f209091186987b5fc162d6e9122bf86f333
c12a.consttree5fffa6480307f60c9c1202539ae39051cbcb72863bb8e2db5bebf74a2d048f9b
c12a_gencircom
c12a.verifier.circomfa255fda3de38565e365045d8c85576f5420a0a6b1254ea8ce0498085eaf4990
c12a.verifier.circom306ef5102ad64e14cb385e7e888dce3fccd73dbd55aa443c1561152779fdf9dd
recursive1_gencircom
recursive1.circom9e3c2a901a9340481bca1e2d5793e6893cc6e4ece4ccde1c593c1e413263c44b
recursive1.circom83543e99e0a1f660761fa8a06310dfd9b69d0c0a358a73b6baec55d9587234e5
recursive1_compile
recursive1.r1cs6212b555400157c9bebf48c10776e087032e352950fb30fd83001b3be1d2b0a8
recursive1.sym90cea97ef99766a62c5e5c010c50cbf262c6bfe39f192bf1aeab0d0b2097c13f
recursive1.r1csbf748272be6aeba8eb8dc3146e68a9eb938c7139d690be1e94a506a4d756eec8
recursive1.sym646bc2e3ca5da30c1221039c1e37af2ed46a2f8f7023d65a41cb80c7de5882a9
recursive1_setup
recursive1.pil600aaf142766eb473fcc3b7171f6afa306e09faf37f77a6ac4214c8890e3a55d
recursive1.const5567e53b906d5129d692f2656529758305d5b5140add9e967169894463b6b539
recursive1.execad048f4119b4b1541092cd57aa4a255ae68bb530dfc2f1fe222567343fc8abe4
recursive1.pil94ea2856942dd0745e2d6443c6988a4fdc65ac2c3173633e897e02b6d7eaad8b
recursive1.constbba22272d800b85e67e3b0360dbd67f972804129a8f5ee4a434a26976a3bc8a4
recursive1.exec359e6e221cefd35827960ff5cf9cd506ba5e2a5ec92c33312a5903ce087aa155
recursive1_buildstarkinfo
recursive.starkstruct.json7ae67d5411a2de84e9b50e8797270a054f116fdbed6f327acb9d93628ee7549c
recursive1.starkinfo.json9e5433af9baf24e5570d780f58ef5b857c2ca5a84709489e7f322220af549cca
recursive.starkstruct.json8bc8b44a7e493e447af7c04d1a362c2198f3e9b29e425248b7646c36b67fd02c
recursive1.starkinfo.jsonab63b4008c2b2e769519ff3df4ba6130d66b8d6778c0ba0fb7724d5a4a9e2841
recursive1_buildconstanttree
recursive1.verkey.jsonacab2f616d0d25c65de4628feadfe49407a31c293b4f1d1f1087a1d2f0bf5412
recursive1.consttree9a418145a27edf2cc3c40b578f5abf82da00ba6632f32afea7d6ad88085bb492
recursive1.verkey.json44f3b6afb36a458031e327d2119a15689ec38eb10ccff729dfda0bae3bf16921
recursive1.consttreebba22272d800b85e67e3b0360dbd67f972804129a8f5ee4a434a26976a3bc8a4
recursive1_verifier_gencircom
recursive1.verifier.circom40db564e271fb931992afa2d9a75fd35f37c851acf0170074aba7233fdcb4ffc
recursive1.verifier.circom835cf0a8c4706ced7395957a8bef1e00b70d1007586c9fccf107f12b4936dea5
recursive2_gencircom
recursive2.circomb223861020d28e3db7017d5af0143e8c01c917414d5ff9c7fd184dadfd5d50a7
recursive2.circom0c03000a9a56601a086fc5c91e9119e2e63fa699fe9d5f362b506c2d3602449f
recursive2_compile
recursive2.r1cs46e3d53079476fed62af5a9f7838b52cddb33a4fc1ab9447763d534ae88b0084
recursive2.symb38319f2aa8dbc6cf4519fc5ea4bc07212d66177279bdbff331feeb150612d70
recursive2.r1cs2fdd9f433b07c90a367dbc2335b7921c1ef242e6466fc5a25b8ebcf8660ff77a
recursive2.syma47d475bcb09309b2100bfc19ce4c4baa9cee2699373290569617d71fcf51a64
recursive2_setup
recursive2.pil600aaf142766eb473fcc3b7171f6afa306e09faf37f77a6ac4214c8890e3a55d
recursive2.constff9590f79b8d5540a117b9f6086df1cbededf5a1bb97d570696217c02868dee5
recursive2.exec7f2479956334a00a61900491a267c50ac6953d3d3bda871a01d3471bbe4029d5
recursive2.pil94ea2856942dd0745e2d6443c6988a4fdc65ac2c3173633e897e02b6d7eaad8b
recursive2.const7ee905f3949c67af84f417ce2b996b2946b7bf1d4557f8a67f9d7f7ab9540902
recursive2.execf32201da15042d9167dc8dd6707c2920d7d2e772d411566739ac874bdbf269fb
recursive2_buildstarkinfo
recursive2.starkinfo.json9e5433af9baf24e5570d780f58ef5b857c2ca5a84709489e7f322220af549cca
recursive2.starkinfo.jsonab63b4008c2b2e769519ff3df4ba6130d66b8d6778c0ba0fb7724d5a4a9e2841
recursive2_buildconstanttree
recursive2.verkey.json3f11b10a807da2ae7fb36f5f6111c9f4855c84d43cf53dcb594028d7a93a6a90
recursive2.consttree6dfbd47f9676f1b1b1f428015c6e698dd588a66edb0ec5fe6a09931a8a9fa49f
recursive2.verkey.jsonfc3f0d4aaf11bb001102a37e397262aa62a02b6ca001b5c00ba9fccdfb06dda6
recursive2.consttree7ee905f3949c67af84f417ce2b996b2946b7bf1d4557f8a67f9d7f7ab9540902
recursive2_verifier_gencircom
recursive2.verifier.circom40db564e271fb931992afa2d9a75fd35f37c851acf0170074aba7233fdcb4ffc
recursive2.verifier.circom835cf0a8c4706ced7395957a8bef1e00b70d1007586c9fccf107f12b4936dea5
recursivef_gencircom
recursivef.circomaf70e17e347042831270806d08b8473f8c27013e0edd9b3f1f91d27a8a6e9f26
recursivef.circom84f7538268a29a67e7836691b1706f9228fe73f4d890eee7f65f3ddcfc3aafc3
recursivef_compile
recursivef.r1cs3cebbbf05717b393a29be0cdf241fab82e34bca4ae7940172da10fd5bac4bcb6
recursivef.sym19bbc1b3f6835ccf0ce10741599039b8d7f5d8c0fe8a7ac53197c36c33ff66d4
recursivef.r1cs2861953db44082184ee7a1dcff9b37ab131e3d58cc5539cfe258c6d23f505f8c
recursivef.symfcbe9cd852065f1224a82f8b595d2c7aaa9fdbc616ef9048714105d69d988cd7
recursivef_setup
recursivef.pil90285d359be25e81bbbf7f7713fceed9874730ae6d233b757dab884b5c88b643
recursivef.const2a5286933a664c1736c6ee91b9da2eb694d923bacf86f3309913a6cbdf132096
recursivef.exec8cf9b7ff7ca623cc50807a917ee30ca99de6692db89baa315d60e5d09462090b
recursivef.pil62527bfc12f535e8fa3a6dd7055bc595b27fc491f7203987108ee3d13283dbfe
recursivef.const0f32c1d45e2e7390cd21bcfadb1be399ea02f6c91c76aaca963a7ee1f131ba41
recursivef.exec1751c8a070d68cc64aa7d932a1785330da24139e547805e583f5407c5600715e
recursivef_buildstarkinfo
recursivef.starkstruct.json5176f80126963cfac8f7956963aae3c17f4842382327a9e1de066e52bb058718
recursivef.starkinfo.json30c96563c8476073759660db21c767726b2ad78aacea0c5007c17972a74a3a6d
recursivef.starkstruct.jsonba99ad986178db98b1a867bb9d8592fa6ba5c29d9233fd939d01424425ce6cba
recursivef.starkinfo.json8d6e9503550ad8bdde303af5b37ad0320171d4f180fc11323b58fbf8d82bb1a6
recursivef_buildconstanttree
recursivef.verkey.json04a55ebcd79b27908a33a66569d3bf0ad7aeaff62fc92566f6a0fc0c3e94beea
recursivef.consttree40dffd42ef14085954bf58ac2fac193799c7cde032380db826bfb1d601d9919a
recursivef.verkey.json3e16829b5af0ea65a5f49724d96ed429e1d4da088d4b0c1556093632f94e6bbc
recursivef.consttree0f32c1d45e2e7390cd21bcfadb1be399ea02f6c91c76aaca963a7ee1f131ba41
recursivef_verifier_gencircom
recursivef.verifier.circomc2773fc4db2427b9e192fe4e29cc77cd83289155661efdcd6985c80863a7a685
recursivef.verifier.circom68406381a2d730ede86e41ce80f4c214cabb83fd307768b43d5b407978f94c04
final_gencircom
final.circom2c8261d66bef060b17a15829e30ea11b8e4659bea27aa92eb36dcbf18613c1dc
final.circom74a06304ce73b282a520c358baead152dad790b0aa6b7031f6ba8c00166be459
final_compile
final.r1cs5cc2a9a9842a136ea5fb079519338be1fc3830a726d0f99b3cec461ba0fab90c
final.sym19fde910362aaf69622b33d432ad92b91409eb851fc8f1691e4255b6e364b868
final.r1csbf28b9d2adff923fbf2505a116bf5c29f116b1187fcae972bc78d1f254963380
final.sym9c20071021039f3f82b3ecb471402949cbbc290812da97f47aae4b13ad73342d
fflonk_setup
final.fflonk.zkeyce55fe5c5a453583bac00b7c89344cf167a8354f0a115d52f3eb59434f78ffcc
final.fflonk.zkeyb0a674854e811c9d935cfae6fa0cc4b0efbba7014365b06d026b0bc3667a0c7b
fflonk_evk
final.fflonk.verkey.jsonebe2a955e9fddcb57d50c65b505dea7b20ad2991010cea0b9368aa5a21336cbf
dependencies.txta75792a5c60069ffb6c61124c58850fb54390efa4fe895ba2f1dbce2d7018c24
final.fflonk.verkey.json44b4d3ac1331dd17246611687f7c65f659d377c34467df1d49e2e558c3aad1ad
dependencies.txtbb198945774e109721e2bde02a369edf96d21a0533f4bf9882a472dadd90d117
fflonk_solidity
final.fflonk.verifier.sol43e64ada9b72b53740f9ddb5a2c0d30be47f92628593fae247b95c6999861703
final.fflonk.verifier.sol8ae7baadd9f2ffb07862b0a74c20e1ad1cc2d4136e416ce5beac82a4e9a44923
- - - From d4714dd36eabab6a24c0f628cf71c168977a3c47 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Sat, 27 Jan 2024 00:48:11 +0100 Subject: [PATCH 179/230] check SC scripts --- package.json | 9 +++-- upgrade/upgradeToV2/upgradeL2ToV2.ts | 16 ++++++-- upgrade/upgradeToV2/upgradeToV2.ts | 55 +++++++++++++--------------- 3 files changed, 45 insertions(+), 35 deletions(-) diff --git a/package.json b/package.json index aa3a01692..80e8cff97 100644 --- a/package.json +++ b/package.json @@ -97,13 +97,16 @@ "dockerv2:v1ToV2:contracts": "sudo ./docker/scripts/v1ToV2/deploy-dockerv2.sh", "saveDeployment:sepolia": "mkdir -p deployments/sepolia_$(date +%s) && cp -r deployment/v2/deploy_*.json deployments/sepolia_$(date +%s) && cp .openzeppelin/sepolia.json deployments/sepolia_$(date +%s) && cp deployment/v2/genesis.json deployments/sepolia_$(date +%s) && cp deployment/v2/create_rollup_output.json deployments/sepolia_$(date +%s)", "testnetPol:upgradeV2:sepolia": "npx hardhat run upgrade/upgradeToV2/testnet/deployTestnetPol.ts --network sepolia", - "upgradev2:timelock:goerli": "npx hardhat run upgrade/upgradeToV2/upgradeToV2.ts --network goerli && saveUpgradeV2:goerli", - "upgradev2:timelock:sepolia": "npx hardhat run upgrade/upgradeToV2/upgradeToV2.ts --network sepolia && saveUpgradeV2:sepolia", + "testnetPol:upgradeV2:goerli": "npx hardhat run upgrade/upgradeToV2/testnet/deployTestnetPol.ts --network goerli", + "upgradev2:timelock:goerli": "npx hardhat run upgrade/upgradeToV2/upgradeToV2.ts --network goerli && npm run saveUpgradeV2:goerli", + "upgradev2:timelock:sepolia": "npx hardhat run upgrade/upgradeToV2/upgradeToV2.ts --network sepolia && npm run saveUpgradeV2:sepolia", "verify:upgradeV2:sepolia": "npx hardhat run upgrade/upgradeToV2/verifyContracts.ts --network sepolia", "verify:upgradeV2:goerli": "npx hardhat run upgrade/upgradeToV2/verifyContracts.ts --network goerli", "upgradev2L2:timelock:zkevmDevnet": "npx hardhat run upgrade/upgradeToV2/upgradeL2ToV2.ts --network zkevmDevnet", "saveUpgradeV2:sepolia": "mkdir -p upgrade/upgradeToV2/sepolia_$(date +%s) && cp -r upgrade/upgradeToV2/upgrade_*.json upgrade/upgradeToV2/sepolia_$(date +%s) && cp -r upgrade/upgradeToV2/deploy_*.json upgrade/upgradeToV2/sepolia_$(date +%s) && cp .openzeppelin/sepolia.json upgrade/upgradeToV2/sepolia_$(date +%s)", - "saveUpgradeV2:goerli": "mkdir -p upgrade/upgradeToV2/goerli_$(date +%s) && cp -r upgrade/upgradeToV2/upgrade_*.json upgrade/upgradeToV2/goerli_$(date +%s) && cp -r upgrade/upgradeToV2/deploy_*.json upgrade/upgradeToV2/goerli_$(date +%s) && cp .openzeppelin/goerli.json upgrade/upgradeToV2/goerli_$(date +%s)" + "saveUpgradeV2:goerli": "mkdir -p upgrade/upgradeToV2/goerli_$(date +%s) && cp -r upgrade/upgradeToV2/upgrade_*.json upgrade/upgradeToV2/goerli_$(date +%s) && cp -r upgrade/upgradeToV2/deploy_*.json upgrade/upgradeToV2/goerli_$(date +%s) && cp .openzeppelin/goerli.json upgrade/upgradeToV2/goerli_$(date +%s)", + "upgradev2L2:timelock:polygonZKEVMTestnet": "npx hardhat run upgrade/upgradeToV2/upgradeL2ToV2.ts --network polygonZKEVMTestnet", + "upgradev2L2:timelock:polygonZKEVMMainnet": "npx hardhat run upgrade/upgradeToV2/upgradeL2ToV2.ts --network polygonZKEVMMainnet" } } \ No newline at end of file diff --git a/upgrade/upgradeToV2/upgradeL2ToV2.ts b/upgrade/upgradeToV2/upgradeL2ToV2.ts index 70e7b8bb4..94a317e78 100644 --- a/upgrade/upgradeToV2/upgradeL2ToV2.ts +++ b/upgrade/upgradeToV2/upgradeL2ToV2.ts @@ -7,6 +7,7 @@ import fs = require("fs"); import * as dotenv from "dotenv"; dotenv.config({path: path.resolve(__dirname, "../../.env")}); import {ethers, upgrades} from "hardhat"; +import {PolygonZkEVMTimelock} from "../../typechain-types"; const pathOutputJson = path.join(__dirname, "./upgrade_outputL2.json"); const deployParameters = require("./deploy_parameters.json"); @@ -17,7 +18,6 @@ async function main() { upgrades.silenceWarnings(); const salt = upgradeParameters.timelockSalt || ethers.ZeroHash; - const timelockDelay = deployParameters.minDelayTimelock; const currentBridgeAddress = deployOutputParameters.polygonZkEVMBridgeAddress; // Load provider @@ -73,11 +73,20 @@ async function main() { // Import OZ upgrades await upgrades.forceImport(currentBridgeAddress as string, PreviousBridgeFactory, "transparent" as any); - const proxyAdmin = await upgrades.admin.getInstance(); + // Assert correct admin + expect(await upgrades.erc1967.getAdminAddress(currentBridgeAddress as string)).to.be.equal(proxyAdmin.target); + + // Check current timelock address and delay + const timelockL2Address = await proxyAdmin.owner(); + // load timelock - const timelockContractFactory = await ethers.getContractFactory("PolygonZkEVMTimelock", deployer); + const timelockContractFactory = await ethers.getContractFactory("PolygonZkEVMTimelock"); + const timelockContract = (await timelockContractFactory.attach(timelockL2Address)) as PolygonZkEVMTimelock; + const timelockDelay = timelockContract.getMinDelay(); + + console.log("timelockAddress: ", timelockContract.target, {timelockDelay}); // prapare upgrades const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2", deployer); @@ -125,6 +134,7 @@ async function main() { const outputJson = { scheduleData, executeData, + timelockL2Address, }; fs.writeFileSync(pathOutputJson, JSON.stringify(outputJson, null, 1)); } diff --git a/upgrade/upgradeToV2/upgradeToV2.ts b/upgrade/upgradeToV2/upgradeToV2.ts index 49946bb9c..17a23aa35 100644 --- a/upgrade/upgradeToV2/upgradeToV2.ts +++ b/upgrade/upgradeToV2/upgradeToV2.ts @@ -7,6 +7,7 @@ import fs = require("fs"); import * as dotenv from "dotenv"; dotenv.config({path: path.resolve(__dirname, "../../.env")}); import {ethers, upgrades} from "hardhat"; +import {PolygonZkEVM} from "../../typechain-types"; const pathOutputJson = path.join(__dirname, "./upgrade_output.json"); @@ -17,30 +18,6 @@ const upgradeParameters = require("./upgrade_parameters.json"); async function main() { upgrades.silenceWarnings(); - /* - * Check deploy parameters - * Check that every necessary parameter is fullfilled - */ - const mandatoryDeploymentParameters = [ - "admin", - "trustedAggregator", - "trustedAggregatorTimeout", - "pendingStateTimeout", - "zkEVMOwner", - "chainID", - ]; - - for (const parameterName of mandatoryDeploymentParameters) { - if (deployParameters[parameterName] === undefined || deployParameters[parameterName] === "") { - throw new Error(`Missing parameter: ${parameterName}`); - } - } - - const {admin, trustedAggregator, trustedAggregatorTimeout, pendingStateTimeout, zkEVMOwner, chainID} = - deployParameters; - - const emergencyCouncilAddress = zkEVMOwner; - /* * Check upgrade parameters * Check that every necessary parameter is fullfilled @@ -54,7 +31,6 @@ async function main() { } const {realVerifier, newForkID, timelockDelay, polTokenAddress} = upgradeParameters; - const salt = upgradeParameters.timelockSalt || ethers.ZeroHash; /* @@ -79,6 +55,26 @@ async function main() { const currentPolygonZkEVMAddress = deployOutputParameters.polygonZkEVMAddress; const currentTimelockAddress = deployOutputParameters.timelockContractAddress; + // Load onchain parameters + const polygonZkEVMFactory = await ethers.getContractFactory("PolygonZkEVM"); + const polygonZkEVMContract = (await polygonZkEVMFactory.attach(currentPolygonZkEVMAddress)) as PolygonZkEVM; + + const admin = await polygonZkEVMContract.admin(); + const trustedAggregator = await polygonZkEVMContract.trustedAggregator(); + const trustedAggregatorTimeout = await polygonZkEVMContract.trustedAggregatorTimeout(); + const pendingStateTimeout = await polygonZkEVMContract.pendingStateTimeout(); + const chainID = await polygonZkEVMContract.chainID(); + const emergencyCouncilAddress = await polygonZkEVMContract.owner(); + + console.log( + {admin}, + {trustedAggregator}, + {trustedAggregatorTimeout}, + {pendingStateTimeout}, + {chainID}, + {emergencyCouncilAddress} + ); + // Load provider let currentProvider = ethers.provider; if (deployParameters.multiplierGas || deployParameters.maxFeePerGas) { @@ -129,6 +125,9 @@ async function main() { const proxyAdmin = await upgrades.admin.getInstance(); + // Assert correct admin + expect(await upgrades.erc1967.getAdminAddress(currentPolygonZkEVMAddress as string)).to.be.equal(proxyAdmin.target); + // deploy new verifier let verifierContract; if (realVerifier === true) { @@ -146,7 +145,6 @@ async function main() { // load timelock const timelockContractFactory = await ethers.getContractFactory("PolygonZkEVMTimelock", deployer); - const timelockContract = timelockContractFactory.attach(currentTimelockAddress); // prapare upgrades @@ -282,7 +280,7 @@ async function main() { pendingStateTimeout, trustedAggregatorTimeout, admin, - timelockContract.target, + currentTimelockAddress, emergencyCouncilAddress, newPolygonZkEVMContract.target, verifierContract.target, @@ -321,12 +319,11 @@ async function main() { executeData, verifierAddress: verifierContract.target, newPolygonZKEVM: newPolygonZkEVMContract.target, + timelockContractAdress: currentTimelockAddress, }; fs.writeFileSync(pathOutputJson, JSON.stringify(outputJson, null, 1)); } -// TODO script verify contracts - main().catch((e) => { console.error(e); process.exit(1); From 924a9266f2d1928dbd64a1a575aeddb2089c313e Mon Sep 17 00:00:00 2001 From: invocamanman Date: Sat, 27 Jan 2024 00:54:17 +0100 Subject: [PATCH 180/230] update compiled contracts --- compiled-contracts/FflonkVerifier.json | 4 ++-- compiled-contracts/PolygonDataCommittee.json | 4 ++-- compiled-contracts/PolygonRollupManager.json | 4 ++-- compiled-contracts/PolygonRollupManagerMock.json | 4 ++-- compiled-contracts/PolygonRollupManagerMockInternalTest.json | 4 ++-- compiled-contracts/PolygonValidiumEtrog.json | 4 ++-- compiled-contracts/PolygonZkEVMBridgeV2.json | 4 ++-- compiled-contracts/PolygonZkEVMEtrog.json | 4 ++-- compiled-contracts/PolygonZkEVMExistentEtrog.json | 4 ++-- compiled-contracts/PolygonZkEVMGlobalExitRootV2.json | 4 ++-- contracts/v2/interfaces/IDataAvailabilityProtocol.sol | 2 +- contracts/v2/interfaces/IPolygonRollupBase.sol | 2 +- contracts/v2/interfaces/IPolygonRollupManager.sol | 2 +- contracts/v2/lib/DepositContractBase.sol | 2 +- contracts/v2/lib/DepositContractV2.sol | 2 +- contracts/v2/lib/LegacyZKEVMStateVariables.sol | 2 +- contracts/v2/lib/PolygonAccessControlUpgradeable.sol | 2 +- contracts/v2/lib/PolygonConstantsBase.sol | 2 +- contracts/v2/lib/PolygonZkEVMGlobalExitRootBaseStorage.sol | 2 +- 19 files changed, 29 insertions(+), 29 deletions(-) diff --git a/compiled-contracts/FflonkVerifier.json b/compiled-contracts/FflonkVerifier.json index 4c60d0a0b..67587436d 100644 --- a/compiled-contracts/FflonkVerifier.json +++ b/compiled-contracts/FflonkVerifier.json @@ -28,8 +28,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561000f575f80fd5b506159c7806200001e5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c80639121da8a1461002d575b5f80fd5b61004061003b366004615950565b610054565b604051901515815260200160405180910390f35b5f6158e0565b6040516104c08201518082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610500840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610520840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610620840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760840151820990508082526102e4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830960011461050e575f805260205ff35b8091506020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161076085015183099150806107608501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001850151830991508060a06106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001850151830991508060806106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001850151830991508060606106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001850151830991508060406106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001850151830991508060206106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a085015183099150806106a08501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106200185015183099150806060610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106200185015183099150806040610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106200185015183099150806020610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161062085015183099150806106208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001850151830991508060e0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001850151830991508060c0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001850151830991508060a0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806105200185015183099150806080610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606105200185015183099150806060610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406105200185015183099150806040610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206105200185015183099150806020610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161052085015183099150806105208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161050085015183099150806105008501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e085015183099150806104e085015250806104c0840152505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110610d72575f805260205ff35b50565b803560208201357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760037f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478085860985090891507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478182099050808214610dfe575f805260205ff35b505050565b610e0d6004610d75565b610e176044610d75565b610e216084610d75565b610e2b60c4610d75565b610e3761010435610d43565b610e4361012435610d43565b610e4f61014435610d43565b610e5b61016435610d43565b610e6761018435610d43565b610e736101a435610d43565b610e7f6101c435610d43565b610e8b6101e435610d43565b610e9761020435610d43565b610ea361022435610d43565b610eaf61024435610d43565b610ebb61026435610d43565b610ec761028435610d43565b610ed36102a435610d43565b610edf6102c435610d43565b610eeb6102e435610d43565b565b7f031810bd3eb261d4f6f6035149756b217c40015a62d6eb86f08582b7e716c3b061078082019081527f0a824b7b08660c47778038b58f59e2a309342e15891c84720ee71f5457967c426107a0830190815283356107c084019081526004356107e085015260243561080085015260a083207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908190066020808701918252902081900660408601819052845260443590925260643590526060909120819006608083018190529081800960a0830181905260808301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001910960e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8060e0840151096101008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f70363660e0840151096101208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f1d59376149b959ccbd157ac850893a6f07c2d99b3852513ab8d01be8e846a56660e0840151096101408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000060e0840151096101608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0530d09118705106cbb4a786ead16926d5d174e181a26686af5448492e42a18160e0840151096101808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb60e0840151096101a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f130b17119778465cfb3acaee30f81dee20710ead41671f568b11d9ab07b95a9b60e0840151096101c083015260e08201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019080096101e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f7036366101e0840151096102008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006101e0840151096102208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb6101e0840151096102408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a08301516101e0840151096102608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f23610260840151096102808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd610260840151096102a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f283ce45a2e5b8e4e78f9fbaf5f6a348bfcfaf76dd28e5ca7121b74ef68fdec2e610260840151096102c08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f236102c0840151096102e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd6102c0840151096103008301526102608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081818009098060c08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018182097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000909101066104a084018190526104c0840152506107808201526101e06101046107a083013761020061078082019081207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081900680845282526084356107a084015260a4356107c08401526060918290200691015250565b60e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018160080960e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105208601526101c08501516101008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105408601526101a08501516101208601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105608601526101808501516101408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961058086015261016085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105a08601526101408501516101808601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105c08601526101208501516101a08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105e08601526101008501516101c08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830960e0610520018601525050505050565b6101e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001816004096101e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106208601526102408501516102008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961064086015261022085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106608601526102008501516102408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096060610620018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c0870151097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030660c0850151087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610260850151600309096102608301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181810381900684087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106a08601526102a08501516102808601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106c08601526102808501516102a08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960406106a0018601527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c08801517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103067f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08a015109087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c0880151600309096102c086015190935091507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001828103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107008601526103008501516102e08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107208601526102e08501516103008601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960a06106a0018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806101e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806104e08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102608501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102e08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016103008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806105008401526127f583611944565b6127fe83611d8c565b61280783611fa2565b505060c081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000083018190066301000000096107608401525050610d728161005a565b6104a08101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181610760840151096107608301525050565b5f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185356107608601510983030106905080610320830152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820860e08301519091505f9081807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000015f61052001890151880984098508935061010086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001890151880984098508935061012086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001890151880984098508935061014086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001890151880984098508935061016086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001890151880984098508935061018086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06105200189015188098409850893506101a086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c06105200189015188098409850893506101c086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e4350983089150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e0610520018801518709830984089250505080610340840152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820890505f6102043561022435610244357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183610104350993507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180836101243509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018486096101443509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161018435850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610320870151850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c087015185096101e08701519094505f908490827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160205f02610620018d01518c098509850893508692506102008a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600102610620018d01518c098509850893508692506102208a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600202610620018d01518c098509850893508692506102408a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001858509098408925050507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600302610620018b01518a09830983089150508061036088015250505050505050565b606081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309905060017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08901510908820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830860c08501519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190817f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b82090990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183089150505f91505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c085015160208601510960408501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828408610204350892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028709086102243508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160038709086102443508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161026435840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a43560208b01510908610204350894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c43560208c015109086102243508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101e43560208c015109086102443508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161028435860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151840992506001610264350394507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760870151860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151860961026087015190955091505f9050807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160205f026106a0018a0151880983098308915061028087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206001026106a0018a015188098309830891506102a087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206002026106a0018a015188098309830891506102c087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206003026106a0018a015188098309830891506102e087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206004026106a0018a0151880983098308915061030087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206005026106a0018a015188098309830891505080610380870152505050505050565b6040518151815260208201516020820152825160408201526020830151606082015260408260808360066107d05a03fa905080610dfe575f805260205ff35b5f604051833581526020840135602082015284604082015260408160608360076107d05a03fa915081615135575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa91505080615164575f805260205ff35b50505050565b5f60405183815284602082015285604082015260408160608360076107d05a03fa91508161519a575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa915050806151c9575f805260205ff35b5050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101608601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806104e0850151830984510991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180610500850151830984517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908009097f031810bd3eb261d4f6f6035149756b217c40015a62d6eb86f08582b7e716c3b06103a08501527f0a824b7b08660c47778038b58f59e2a309342e15891c84720ee71f5457967c4260206103a0018501526156208360046103a08701615100565b6156308160446103a08701615100565b6156bd7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161038088015185097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161036089015188090861034087015108600260016103e0880161516a565b50610dfe8160846104208601615100565b604051610400820180517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd479081038190069091526104408301805182039190910690525f906157256103e084016103a085016150c1565b61573761042084016103a085016150c1565b61574b606084015160c46103a08601615100565b6103a083015181526103c08301516020808301919091527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a083015260c43560c08301527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760e43581030660e08301527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6101008301527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6101208301527f1970ea81dd6992adfbc571effb03503adbbb6a857f578403c6c40e22d65b3c026101408301527f054793348f12c0cf5622c340573cb277586319de359ab9389778f689786b1e48610160830152816101808160086107d05a03fa90511692915050565b60405161078081016040526158f3610e03565b6158fd8382610eed565b615906816123ad565b61590f8161286e565b61591983826128a7565b61592281612906565b61592b81613e54565b61593481614549565b61593d816151d0565b615946816156ce565b9050805f5260205ff35b5f80610320808486031215615963575f80fd5b610300840185811115615974575f80fd5b849350858286011115615985575f80fd5b8092505050925092905056fea2646970667358221220ccf65fc4f412136c82261f86257c31a8caaf9a4a600b042f37f16303266cc8d864736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610029575f3560e01c80639121da8a1461002d575b5f80fd5b61004061003b366004615950565b610054565b604051901515815260200160405180910390f35b5f6158e0565b6040516104c08201518082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610500840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610520840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610620840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760840151820990508082526102e4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830960011461050e575f805260205ff35b8091506020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161076085015183099150806107608501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001850151830991508060a06106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001850151830991508060806106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001850151830991508060606106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001850151830991508060406106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001850151830991508060206106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a085015183099150806106a08501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106200185015183099150806060610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106200185015183099150806040610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106200185015183099150806020610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161062085015183099150806106208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001850151830991508060e0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001850151830991508060c0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001850151830991508060a0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806105200185015183099150806080610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606105200185015183099150806060610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406105200185015183099150806040610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206105200185015183099150806020610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161052085015183099150806105208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161050085015183099150806105008501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e085015183099150806104e085015250806104c0840152505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110610d72575f805260205ff35b50565b803560208201357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760037f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478085860985090891507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478182099050808214610dfe575f805260205ff35b505050565b610e0d6004610d75565b610e176044610d75565b610e216084610d75565b610e2b60c4610d75565b610e3761010435610d43565b610e4361012435610d43565b610e4f61014435610d43565b610e5b61016435610d43565b610e6761018435610d43565b610e736101a435610d43565b610e7f6101c435610d43565b610e8b6101e435610d43565b610e9761020435610d43565b610ea361022435610d43565b610eaf61024435610d43565b610ebb61026435610d43565b610ec761028435610d43565b610ed36102a435610d43565b610edf6102c435610d43565b610eeb6102e435610d43565b565b7f031810bd3eb261d4f6f6035149756b217c40015a62d6eb86f08582b7e716c3b061078082019081527f0a824b7b08660c47778038b58f59e2a309342e15891c84720ee71f5457967c426107a0830190815283356107c084019081526004356107e085015260243561080085015260a083207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908190066020808701918252902081900660408601819052845260443590925260643590526060909120819006608083018190529081800960a0830181905260808301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001910960e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8060e0840151096101008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f70363660e0840151096101208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f1d59376149b959ccbd157ac850893a6f07c2d99b3852513ab8d01be8e846a56660e0840151096101408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000060e0840151096101608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0530d09118705106cbb4a786ead16926d5d174e181a26686af5448492e42a18160e0840151096101808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb60e0840151096101a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f130b17119778465cfb3acaee30f81dee20710ead41671f568b11d9ab07b95a9b60e0840151096101c083015260e08201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019080096101e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f7036366101e0840151096102008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006101e0840151096102208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb6101e0840151096102408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a08301516101e0840151096102608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f23610260840151096102808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd610260840151096102a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f283ce45a2e5b8e4e78f9fbaf5f6a348bfcfaf76dd28e5ca7121b74ef68fdec2e610260840151096102c08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f236102c0840151096102e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd6102c0840151096103008301526102608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081818009098060c08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018182097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000909101066104a084018190526104c0840152506107808201526101e06101046107a083013761020061078082019081207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081900680845282526084356107a084015260a4356107c08401526060918290200691015250565b60e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018160080960e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105208601526101c08501516101008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105408601526101a08501516101208601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105608601526101808501516101408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961058086015261016085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105a08601526101408501516101808601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105c08601526101208501516101a08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105e08601526101008501516101c08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830960e0610520018601525050505050565b6101e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001816004096101e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106208601526102408501516102008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961064086015261022085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106608601526102008501516102408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096060610620018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c0870151097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030660c0850151087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610260850151600309096102608301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181810381900684087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106a08601526102a08501516102808601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106c08601526102808501516102a08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960406106a0018601527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c08801517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103067f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08a015109087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c0880151600309096102c086015190935091507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001828103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107008601526103008501516102e08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107208601526102e08501516103008601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960a06106a0018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806101e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806104e08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102608501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102e08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016103008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806105008401526127f583611944565b6127fe83611d8c565b61280783611fa2565b505060c081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000083018190066301000000096107608401525050610d728161005a565b6104a08101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181610760840151096107608301525050565b5f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185356107608601510983030106905080610320830152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820860e08301519091505f9081807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000015f61052001890151880984098508935061010086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001890151880984098508935061012086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001890151880984098508935061014086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001890151880984098508935061016086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001890151880984098508935061018086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06105200189015188098409850893506101a086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c06105200189015188098409850893506101c086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e4350983089150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e0610520018801518709830984089250505080610340840152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820890505f6102043561022435610244357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183610104350993507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180836101243509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018486096101443509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161018435850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610320870151850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c087015185096101e08701519094505f908490827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160205f02610620018d01518c098509850893508692506102008a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600102610620018d01518c098509850893508692506102208a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600202610620018d01518c098509850893508692506102408a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001858509098408925050507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600302610620018b01518a09830983089150508061036088015250505050505050565b606081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309905060017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08901510908820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830860c08501519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190817f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b82090990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183089150505f91505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c085015160208601510960408501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828408610204350892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028709086102243508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160038709086102443508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161026435840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a43560208b01510908610204350894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c43560208c015109086102243508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101e43560208c015109086102443508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161028435860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151840992506001610264350394507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760870151860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151860961026087015190955091505f9050807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160205f026106a0018a0151880983098308915061028087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206001026106a0018a015188098309830891506102a087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206002026106a0018a015188098309830891506102c087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206003026106a0018a015188098309830891506102e087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206004026106a0018a0151880983098308915061030087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206005026106a0018a015188098309830891505080610380870152505050505050565b6040518151815260208201516020820152825160408201526020830151606082015260408260808360066107d05a03fa905080610dfe575f805260205ff35b5f604051833581526020840135602082015284604082015260408160608360076107d05a03fa915081615135575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa91505080615164575f805260205ff35b50505050565b5f60405183815284602082015285604082015260408160608360076107d05a03fa91508161519a575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa915050806151c9575f805260205ff35b5050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101608601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806104e0850151830984510991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180610500850151830984517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908009097f031810bd3eb261d4f6f6035149756b217c40015a62d6eb86f08582b7e716c3b06103a08501527f0a824b7b08660c47778038b58f59e2a309342e15891c84720ee71f5457967c4260206103a0018501526156208360046103a08701615100565b6156308160446103a08701615100565b6156bd7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161038088015185097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161036089015188090861034087015108600260016103e0880161516a565b50610dfe8160846104208601615100565b604051610400820180517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd479081038190069091526104408301805182039190910690525f906157256103e084016103a085016150c1565b61573761042084016103a085016150c1565b61574b606084015160c46103a08601615100565b6103a083015181526103c08301516020808301919091527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a083015260c43560c08301527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760e43581030660e08301527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6101008301527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6101208301527f1970ea81dd6992adfbc571effb03503adbbb6a857f578403c6c40e22d65b3c026101408301527f054793348f12c0cf5622c340573cb277586319de359ab9389778f689786b1e48610160830152816101808160086107d05a03fa90511692915050565b60405161078081016040526158f3610e03565b6158fd8382610eed565b615906816123ad565b61590f8161286e565b61591983826128a7565b61592281612906565b61592b81613e54565b61593481614549565b61593d816151d0565b615946816156ce565b9050805f5260205ff35b5f80610320808486031215615963575f80fd5b610300840185811115615974575f80fd5b849350858286011115615985575f80fd5b8092505050925092905056fea2646970667358221220ccf65fc4f412136c82261f86257c31a8caaf9a4a600b042f37f16303266cc8d864736f6c63430008140033", + "bytecode": "0x608060405234801561000f575f80fd5b506159c7806200001e5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c80639121da8a1461002d575b5f80fd5b61004061003b366004615950565b610054565b604051901515815260200160405180910390f35b5f6158e0565b6040516104c08201518082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610500840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610520840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610620840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760840151820990508082526102e4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830960011461050e575f805260205ff35b8091506020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161076085015183099150806107608501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001850151830991508060a06106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001850151830991508060806106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001850151830991508060606106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001850151830991508060406106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001850151830991508060206106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a085015183099150806106a08501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106200185015183099150806060610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106200185015183099150806040610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106200185015183099150806020610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161062085015183099150806106208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001850151830991508060e0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001850151830991508060c0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001850151830991508060a0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806105200185015183099150806080610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606105200185015183099150806060610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406105200185015183099150806040610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206105200185015183099150806020610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161052085015183099150806105208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161050085015183099150806105008501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e085015183099150806104e085015250806104c0840152505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110610d72575f805260205ff35b50565b803560208201357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760037f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478085860985090891507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478182099050808214610dfe575f805260205ff35b505050565b610e0d6004610d75565b610e176044610d75565b610e216084610d75565b610e2b60c4610d75565b610e3761010435610d43565b610e4361012435610d43565b610e4f61014435610d43565b610e5b61016435610d43565b610e6761018435610d43565b610e736101a435610d43565b610e7f6101c435610d43565b610e8b6101e435610d43565b610e9761020435610d43565b610ea361022435610d43565b610eaf61024435610d43565b610ebb61026435610d43565b610ec761028435610d43565b610ed36102a435610d43565b610edf6102c435610d43565b610eeb6102e435610d43565b565b7f0f7cb2884a33758f278d754cd0667e6908d3055bfc2417d6449b1d9590c0d48461078082019081527f01ebe3c5dbf6e22642144201f8fa6b89fc1fded7a2d3a47322d0e88c2c14747b6107a0830190815283356107c084019081526004356107e085015260243561080085015260a083207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908190066020808701918252902081900660408601819052845260443590925260643590526060909120819006608083018190529081800960a0830181905260808301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001910960e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8060e0840151096101008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f70363660e0840151096101208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f1d59376149b959ccbd157ac850893a6f07c2d99b3852513ab8d01be8e846a56660e0840151096101408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000060e0840151096101608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0530d09118705106cbb4a786ead16926d5d174e181a26686af5448492e42a18160e0840151096101808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb60e0840151096101a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f130b17119778465cfb3acaee30f81dee20710ead41671f568b11d9ab07b95a9b60e0840151096101c083015260e08201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019080096101e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f7036366101e0840151096102008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006101e0840151096102208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb6101e0840151096102408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a08301516101e0840151096102608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f23610260840151096102808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd610260840151096102a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f283ce45a2e5b8e4e78f9fbaf5f6a348bfcfaf76dd28e5ca7121b74ef68fdec2e610260840151096102c08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f236102c0840151096102e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd6102c0840151096103008301526102608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081818009098060c08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018182097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000909101066104a084018190526104c0840152506107808201526101e06101046107a083013761020061078082019081207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081900680845282526084356107a084015260a4356107c08401526060918290200691015250565b60e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018160080960e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105208601526101c08501516101008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105408601526101a08501516101208601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105608601526101808501516101408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961058086015261016085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105a08601526101408501516101808601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105c08601526101208501516101a08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105e08601526101008501516101c08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830960e0610520018601525050505050565b6101e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001816004096101e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106208601526102408501516102008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961064086015261022085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106608601526102008501516102408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096060610620018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c0870151097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030660c0850151087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610260850151600309096102608301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181810381900684087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106a08601526102a08501516102808601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106c08601526102808501516102a08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960406106a0018601527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c08801517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103067f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08a015109087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c0880151600309096102c086015190935091507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001828103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107008601526103008501516102e08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107208601526102e08501516103008601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960a06106a0018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806101e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806104e08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102608501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102e08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016103008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806105008401526127f583611944565b6127fe83611d8c565b61280783611fa2565b505060c081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000083018190066301000000096107608401525050610d728161005a565b6104a08101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181610760840151096107608301525050565b5f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185356107608601510983030106905080610320830152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820860e08301519091505f9081807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000015f61052001890151880984098508935061010086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001890151880984098508935061012086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001890151880984098508935061014086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001890151880984098508935061016086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001890151880984098508935061018086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06105200189015188098409850893506101a086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c06105200189015188098409850893506101c086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e4350983089150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e0610520018801518709830984089250505080610340840152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820890505f6102043561022435610244357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183610104350993507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180836101243509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018486096101443509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161018435850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610320870151850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c087015185096101e08701519094505f908490827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160205f02610620018d01518c098509850893508692506102008a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600102610620018d01518c098509850893508692506102208a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600202610620018d01518c098509850893508692506102408a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001858509098408925050507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600302610620018b01518a09830983089150508061036088015250505050505050565b606081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309905060017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08901510908820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830860c08501519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190817f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b82090990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183089150505f91505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c085015160208601510960408501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828408610204350892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028709086102243508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160038709086102443508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161026435840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a43560208b01510908610204350894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c43560208c015109086102243508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101e43560208c015109086102443508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161028435860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151840992506001610264350394507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760870151860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151860961026087015190955091505f9050807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160205f026106a0018a0151880983098308915061028087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206001026106a0018a015188098309830891506102a087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206002026106a0018a015188098309830891506102c087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206003026106a0018a015188098309830891506102e087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206004026106a0018a0151880983098308915061030087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206005026106a0018a015188098309830891505080610380870152505050505050565b6040518151815260208201516020820152825160408201526020830151606082015260408260808360066107d05a03fa905080610dfe575f805260205ff35b5f604051833581526020840135602082015284604082015260408160608360076107d05a03fa915081615135575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa91505080615164575f805260205ff35b50505050565b5f60405183815284602082015285604082015260408160608360076107d05a03fa91508161519a575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa915050806151c9575f805260205ff35b5050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101608601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806104e0850151830984510991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180610500850151830984517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908009097f0f7cb2884a33758f278d754cd0667e6908d3055bfc2417d6449b1d9590c0d4846103a08501527f01ebe3c5dbf6e22642144201f8fa6b89fc1fded7a2d3a47322d0e88c2c14747b60206103a0018501526156208360046103a08701615100565b6156308160446103a08701615100565b6156bd7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161038088015185097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161036089015188090861034087015108600260016103e0880161516a565b50610dfe8160846104208601615100565b604051610400820180517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd479081038190069091526104408301805182039190910690525f906157256103e084016103a085016150c1565b61573761042084016103a085016150c1565b61574b606084015160c46103a08601615100565b6103a083015181526103c08301516020808301919091527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a083015260c43560c08301527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760e43581030660e08301527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6101008301527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6101208301527f1970ea81dd6992adfbc571effb03503adbbb6a857f578403c6c40e22d65b3c026101408301527f054793348f12c0cf5622c340573cb277586319de359ab9389778f689786b1e48610160830152816101808160086107d05a03fa90511692915050565b60405161078081016040526158f3610e03565b6158fd8382610eed565b615906816123ad565b61590f8161286e565b61591983826128a7565b61592281612906565b61592b81613e54565b61593481614549565b61593d816151d0565b615946816156ce565b9050805f5260205ff35b5f80610320808486031215615963575f80fd5b610300840185811115615974575f80fd5b849350858286011115615985575f80fd5b8092505050925092905056fea2646970667358221220761b1f07d5034592f204cb3439dbfabc28fb771c6e1bc6c8016e3d7b42ad5a2164736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610029575f3560e01c80639121da8a1461002d575b5f80fd5b61004061003b366004615950565b610054565b604051901515815260200160405180910390f35b5f6158e0565b6040516104c08201518082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610500840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610520840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610620840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760840151820990508082526102e4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830960011461050e575f805260205ff35b8091506020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161076085015183099150806107608501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001850151830991508060a06106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001850151830991508060806106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001850151830991508060606106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001850151830991508060406106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001850151830991508060206106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a085015183099150806106a08501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106200185015183099150806060610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106200185015183099150806040610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106200185015183099150806020610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161062085015183099150806106208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001850151830991508060e0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001850151830991508060c0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001850151830991508060a0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806105200185015183099150806080610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606105200185015183099150806060610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406105200185015183099150806040610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206105200185015183099150806020610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161052085015183099150806105208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161050085015183099150806105008501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e085015183099150806104e085015250806104c0840152505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110610d72575f805260205ff35b50565b803560208201357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760037f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478085860985090891507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478182099050808214610dfe575f805260205ff35b505050565b610e0d6004610d75565b610e176044610d75565b610e216084610d75565b610e2b60c4610d75565b610e3761010435610d43565b610e4361012435610d43565b610e4f61014435610d43565b610e5b61016435610d43565b610e6761018435610d43565b610e736101a435610d43565b610e7f6101c435610d43565b610e8b6101e435610d43565b610e9761020435610d43565b610ea361022435610d43565b610eaf61024435610d43565b610ebb61026435610d43565b610ec761028435610d43565b610ed36102a435610d43565b610edf6102c435610d43565b610eeb6102e435610d43565b565b7f0f7cb2884a33758f278d754cd0667e6908d3055bfc2417d6449b1d9590c0d48461078082019081527f01ebe3c5dbf6e22642144201f8fa6b89fc1fded7a2d3a47322d0e88c2c14747b6107a0830190815283356107c084019081526004356107e085015260243561080085015260a083207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908190066020808701918252902081900660408601819052845260443590925260643590526060909120819006608083018190529081800960a0830181905260808301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001910960e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8060e0840151096101008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f70363660e0840151096101208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f1d59376149b959ccbd157ac850893a6f07c2d99b3852513ab8d01be8e846a56660e0840151096101408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000060e0840151096101608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0530d09118705106cbb4a786ead16926d5d174e181a26686af5448492e42a18160e0840151096101808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb60e0840151096101a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f130b17119778465cfb3acaee30f81dee20710ead41671f568b11d9ab07b95a9b60e0840151096101c083015260e08201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019080096101e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f7036366101e0840151096102008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006101e0840151096102208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb6101e0840151096102408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a08301516101e0840151096102608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f23610260840151096102808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd610260840151096102a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f283ce45a2e5b8e4e78f9fbaf5f6a348bfcfaf76dd28e5ca7121b74ef68fdec2e610260840151096102c08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f236102c0840151096102e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd6102c0840151096103008301526102608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081818009098060c08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018182097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000909101066104a084018190526104c0840152506107808201526101e06101046107a083013761020061078082019081207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081900680845282526084356107a084015260a4356107c08401526060918290200691015250565b60e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018160080960e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105208601526101c08501516101008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105408601526101a08501516101208601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105608601526101808501516101408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961058086015261016085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105a08601526101408501516101808601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105c08601526101208501516101a08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105e08601526101008501516101c08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830960e0610520018601525050505050565b6101e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001816004096101e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106208601526102408501516102008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961064086015261022085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106608601526102008501516102408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096060610620018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c0870151097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030660c0850151087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610260850151600309096102608301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181810381900684087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106a08601526102a08501516102808601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106c08601526102808501516102a08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960406106a0018601527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c08801517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103067f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08a015109087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c0880151600309096102c086015190935091507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001828103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107008601526103008501516102e08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107208601526102e08501516103008601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960a06106a0018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806101e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806104e08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102608501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102e08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016103008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806105008401526127f583611944565b6127fe83611d8c565b61280783611fa2565b505060c081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000083018190066301000000096107608401525050610d728161005a565b6104a08101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181610760840151096107608301525050565b5f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185356107608601510983030106905080610320830152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820860e08301519091505f9081807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000015f61052001890151880984098508935061010086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001890151880984098508935061012086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001890151880984098508935061014086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001890151880984098508935061016086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001890151880984098508935061018086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06105200189015188098409850893506101a086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c06105200189015188098409850893506101c086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e4350983089150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e0610520018801518709830984089250505080610340840152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820890505f6102043561022435610244357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183610104350993507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180836101243509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018486096101443509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161018435850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610320870151850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c087015185096101e08701519094505f908490827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160205f02610620018d01518c098509850893508692506102008a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600102610620018d01518c098509850893508692506102208a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600202610620018d01518c098509850893508692506102408a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001858509098408925050507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600302610620018b01518a09830983089150508061036088015250505050505050565b606081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309905060017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08901510908820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830860c08501519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190817f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b82090990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183089150505f91505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c085015160208601510960408501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828408610204350892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028709086102243508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160038709086102443508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161026435840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a43560208b01510908610204350894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c43560208c015109086102243508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101e43560208c015109086102443508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161028435860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151840992506001610264350394507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760870151860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151860961026087015190955091505f9050807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160205f026106a0018a0151880983098308915061028087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206001026106a0018a015188098309830891506102a087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206002026106a0018a015188098309830891506102c087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206003026106a0018a015188098309830891506102e087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206004026106a0018a0151880983098308915061030087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206005026106a0018a015188098309830891505080610380870152505050505050565b6040518151815260208201516020820152825160408201526020830151606082015260408260808360066107d05a03fa905080610dfe575f805260205ff35b5f604051833581526020840135602082015284604082015260408160608360076107d05a03fa915081615135575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa91505080615164575f805260205ff35b50505050565b5f60405183815284602082015285604082015260408160608360076107d05a03fa91508161519a575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa915050806151c9575f805260205ff35b5050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101608601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806104e0850151830984510991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180610500850151830984517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908009097f0f7cb2884a33758f278d754cd0667e6908d3055bfc2417d6449b1d9590c0d4846103a08501527f01ebe3c5dbf6e22642144201f8fa6b89fc1fded7a2d3a47322d0e88c2c14747b60206103a0018501526156208360046103a08701615100565b6156308160446103a08701615100565b6156bd7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161038088015185097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161036089015188090861034087015108600260016103e0880161516a565b50610dfe8160846104208601615100565b604051610400820180517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd479081038190069091526104408301805182039190910690525f906157256103e084016103a085016150c1565b61573761042084016103a085016150c1565b61574b606084015160c46103a08601615100565b6103a083015181526103c08301516020808301919091527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a083015260c43560c08301527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760e43581030660e08301527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6101008301527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6101208301527f1970ea81dd6992adfbc571effb03503adbbb6a857f578403c6c40e22d65b3c026101408301527f054793348f12c0cf5622c340573cb277586319de359ab9389778f689786b1e48610160830152816101808160086107d05a03fa90511692915050565b60405161078081016040526158f3610e03565b6158fd8382610eed565b615906816123ad565b61590f8161286e565b61591983826128a7565b61592281612906565b61592b81613e54565b61593481614549565b61593d816151d0565b615946816156ce565b9050805f5260205ff35b5f80610320808486031215615963575f80fd5b610300840185811115615974575f80fd5b849350858286011115615985575f80fd5b8092505050925092905056fea2646970667358221220761b1f07d5034592f204cb3439dbfabc28fb771c6e1bc6c8016e3d7b42ad5a2164736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonDataCommittee.json b/compiled-contracts/PolygonDataCommittee.json index 533df028a..a49910d09 100644 --- a/compiled-contracts/PolygonDataCommittee.json +++ b/compiled-contracts/PolygonDataCommittee.json @@ -246,8 +246,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561000f575f80fd5b5061001861001d565b6100da565b5f54610100900460ff16156100885760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811610156100d8575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6115d7806100e75f395ff3fe608060405234801561000f575f80fd5b50600436106100c4575f3560e01c8063715018a61161007d578063dce1e2b611610058578063dce1e2b614610172578063e4f171201461017a578063f2fde38b146101b9575f80fd5b8063715018a61461013a5780638129fc1c146101425780638da5cb5b1461014a575f80fd5b80635daf08ca116100ad5780635daf08ca146100f0578063609d45441461011a5780636beedd3914610131575f80fd5b8063078fba2a146100c85780633b51be4b146100dd575b5f80fd5b6100db6100d6366004610fab565b6101cc565b005b6100db6100eb36600461104d565b6104c8565b6101036100fe366004611095565b61070a565b60405161011192919061110d565b60405180910390f35b61012360665481565b604051908152602001610111565b61012360655481565b6100db6107d5565b6100db6107e8565b60335460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610111565b606754610123565b604080518082018252601981527f44617461417661696c6162696c697479436f6d6d697474656500000000000000602082015290516101119190611144565b6100db6101c736600461115d565b610979565b6101d4610a2d565b828581101561020f576040517f2e7dcd6e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61021a6014826111bd565b8214610252576040517f2ab6a12900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61025d60675f610ec3565b5f805b8281101561046c575f6102746014836111bd565b90505f8682876102856014836111d4565b92610292939291906111e7565b61029b9161120e565b60601c90508888848181106102b2576102b2611256565b90506020028101906102c49190611283565b90505f036102fe576040517fb54b70e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610610363576040517fd53cfbe000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606760405180604001604052808b8b8781811061038257610382611256565b90506020028101906103949190611283565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92018290525093855250505073ffffffffffffffffffffffffffffffffffffffff8516602092830152835460018101855593815220815191926002020190819061040790826113b0565b5060209190910151600190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911790559250819050610464816114c8565b915050610260565b50838360405161047d9291906114ff565b6040519081900381206066819055606589905581527f831403fd381b3e6ac875d912ec2eee0e0203d0d29f7b3e0c96fc8f582d6db6579060200160405180910390a150505050505050565b6065545f6104d78260416111bd565b9050808310806104fb575060146104ee828561150e565b6104f8919061154e565b15155b15610532576040517f6b8eec4600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606654610541848381886111e7565b60405161054f9291906114ff565b60405180910390201461058e576040517f6b156b2800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80601461059c848761150e565b6105a69190611561565b90505f5b84811015610700575f6105be6041836111bd565b90505f6106198a8a848b6105d36041836111d4565b926105e0939291906111e7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610aae92505050565b90505f855b858110156106b2575f6106326014836111bd565b61063c908a6111d4565b90505f8c828d61064d6014836111d4565b9261065a939291906111e7565b6106639161120e565b60601c905073ffffffffffffffffffffffffffffffffffffffff8516810361069d576106908360016111d4565b98506001935050506106b2565b505080806106aa906114c8565b91505061061e565b50806106ea576040517fe12afaf500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505080806106f8906114c8565b9150506105aa565b5050505050505050565b60678181548110610719575f80fd5b905f5260205f2090600202015f91509050805f01805461073890611311565b80601f016020809104026020016040519081016040528092919081815260200182805461076490611311565b80156107af5780601f10610786576101008083540402835291602001916107af565b820191905f5260205f20905b81548152906001019060200180831161079257829003601f168201915b5050506001909301549192505073ffffffffffffffffffffffffffffffffffffffff1682565b6107dd610a2d565b6107e65f610ad2565b565b5f54610100900460ff161580801561080657505f54600160ff909116105b8061081f5750303b15801561081f57505f5460ff166001145b6108b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561090c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610914610b48565b8015610976575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b610981610a2d565b73ffffffffffffffffffffffffffffffffffffffff8116610a24576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108a7565b61097681610ad2565b60335473ffffffffffffffffffffffffffffffffffffffff1633146107e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108a7565b5f805f610abb8585610be7565b91509150610ac881610c29565b5090505b92915050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff16610bde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108a7565b6107e633610ad2565b5f808251604103610c1b576020830151604084015160608501515f1a610c0f87828585610ddb565b94509450505050610c22565b505f905060025b9250929050565b5f816004811115610c3c57610c3c611574565b03610c445750565b6001816004811115610c5857610c58611574565b03610cbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016108a7565b6002816004811115610cd357610cd3611574565b03610d3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016108a7565b6003816004811115610d4e57610d4e611574565b03610976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016108a7565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610e1057505f90506003610eba565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610e61573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116610eb4575f60019250925050610eba565b91505f90505b94509492505050565b5080545f8255600202905f5260205f209081019061097691905b80821115610f23575f610ef08282610f27565b506001810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055600201610edd565b5090565b508054610f3390611311565b5f825580601f10610f42575050565b601f0160209004905f5260205f209081019061097691905b80821115610f23575f8155600101610f5a565b5f8083601f840112610f7d575f80fd5b50813567ffffffffffffffff811115610f94575f80fd5b602083019150836020828501011115610c22575f80fd5b5f805f805f60608688031215610fbf575f80fd5b85359450602086013567ffffffffffffffff80821115610fdd575f80fd5b818801915088601f830112610ff0575f80fd5b813581811115610ffe575f80fd5b8960208260051b8501011115611012575f80fd5b60208301965080955050604088013591508082111561102f575f80fd5b5061103c88828901610f6d565b969995985093965092949392505050565b5f805f6040848603121561105f575f80fd5b83359250602084013567ffffffffffffffff81111561107c575f80fd5b61108886828701610f6d565b9497909650939450505050565b5f602082840312156110a5575f80fd5b5035919050565b5f81518084525f5b818110156110d0576020818501810151868301820152016110b4565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b604081525f61111f60408301856110ac565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b602081525f61115660208301846110ac565b9392505050565b5f6020828403121561116d575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114611156575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082028115828204841417610acc57610acc611190565b80820180821115610acc57610acc611190565b5f80858511156111f5575f80fd5b83861115611201575f80fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000813581811691601485101561124e5780818660140360031b1b83161692505b505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126112b6575f80fd5b83018035915067ffffffffffffffff8211156112d0575f80fd5b602001915036819003821315610c22575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b600181811c9082168061132557607f821691505b60208210810361135c577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f8211156113ab575f81815260208120601f850160051c810160208610156113885750805b601f850160051c820191505b818110156113a757828155600101611394565b5050505b505050565b815167ffffffffffffffff8111156113ca576113ca6112e4565b6113de816113d88454611311565b84611362565b602080601f831160018114611430575f84156113fa5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556113a7565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561147c5788860151825594840194600190910190840161145d565b50858210156114b857878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036114f8576114f8611190565b5060010190565b818382375f9101908152919050565b81810381811115610acc57610acc611190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f8261155c5761155c611521565b500690565b5f8261156f5761156f611521565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffdfea2646970667358221220c5b9be0f0bb23e7a751c29d209c8012b88e672b5c9d6b5f36034c020fec6ecec64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106100c4575f3560e01c8063715018a61161007d578063dce1e2b611610058578063dce1e2b614610172578063e4f171201461017a578063f2fde38b146101b9575f80fd5b8063715018a61461013a5780638129fc1c146101425780638da5cb5b1461014a575f80fd5b80635daf08ca116100ad5780635daf08ca146100f0578063609d45441461011a5780636beedd3914610131575f80fd5b8063078fba2a146100c85780633b51be4b146100dd575b5f80fd5b6100db6100d6366004610fab565b6101cc565b005b6100db6100eb36600461104d565b6104c8565b6101036100fe366004611095565b61070a565b60405161011192919061110d565b60405180910390f35b61012360665481565b604051908152602001610111565b61012360655481565b6100db6107d5565b6100db6107e8565b60335460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610111565b606754610123565b604080518082018252601981527f44617461417661696c6162696c697479436f6d6d697474656500000000000000602082015290516101119190611144565b6100db6101c736600461115d565b610979565b6101d4610a2d565b828581101561020f576040517f2e7dcd6e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61021a6014826111bd565b8214610252576040517f2ab6a12900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61025d60675f610ec3565b5f805b8281101561046c575f6102746014836111bd565b90505f8682876102856014836111d4565b92610292939291906111e7565b61029b9161120e565b60601c90508888848181106102b2576102b2611256565b90506020028101906102c49190611283565b90505f036102fe576040517fb54b70e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610610363576040517fd53cfbe000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606760405180604001604052808b8b8781811061038257610382611256565b90506020028101906103949190611283565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92018290525093855250505073ffffffffffffffffffffffffffffffffffffffff8516602092830152835460018101855593815220815191926002020190819061040790826113b0565b5060209190910151600190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911790559250819050610464816114c8565b915050610260565b50838360405161047d9291906114ff565b6040519081900381206066819055606589905581527f831403fd381b3e6ac875d912ec2eee0e0203d0d29f7b3e0c96fc8f582d6db6579060200160405180910390a150505050505050565b6065545f6104d78260416111bd565b9050808310806104fb575060146104ee828561150e565b6104f8919061154e565b15155b15610532576040517f6b8eec4600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606654610541848381886111e7565b60405161054f9291906114ff565b60405180910390201461058e576040517f6b156b2800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80601461059c848761150e565b6105a69190611561565b90505f5b84811015610700575f6105be6041836111bd565b90505f6106198a8a848b6105d36041836111d4565b926105e0939291906111e7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610aae92505050565b90505f855b858110156106b2575f6106326014836111bd565b61063c908a6111d4565b90505f8c828d61064d6014836111d4565b9261065a939291906111e7565b6106639161120e565b60601c905073ffffffffffffffffffffffffffffffffffffffff8516810361069d576106908360016111d4565b98506001935050506106b2565b505080806106aa906114c8565b91505061061e565b50806106ea576040517fe12afaf500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505080806106f8906114c8565b9150506105aa565b5050505050505050565b60678181548110610719575f80fd5b905f5260205f2090600202015f91509050805f01805461073890611311565b80601f016020809104026020016040519081016040528092919081815260200182805461076490611311565b80156107af5780601f10610786576101008083540402835291602001916107af565b820191905f5260205f20905b81548152906001019060200180831161079257829003601f168201915b5050506001909301549192505073ffffffffffffffffffffffffffffffffffffffff1682565b6107dd610a2d565b6107e65f610ad2565b565b5f54610100900460ff161580801561080657505f54600160ff909116105b8061081f5750303b15801561081f57505f5460ff166001145b6108b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561090c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610914610b48565b8015610976575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b610981610a2d565b73ffffffffffffffffffffffffffffffffffffffff8116610a24576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108a7565b61097681610ad2565b60335473ffffffffffffffffffffffffffffffffffffffff1633146107e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108a7565b5f805f610abb8585610be7565b91509150610ac881610c29565b5090505b92915050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff16610bde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108a7565b6107e633610ad2565b5f808251604103610c1b576020830151604084015160608501515f1a610c0f87828585610ddb565b94509450505050610c22565b505f905060025b9250929050565b5f816004811115610c3c57610c3c611574565b03610c445750565b6001816004811115610c5857610c58611574565b03610cbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016108a7565b6002816004811115610cd357610cd3611574565b03610d3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016108a7565b6003816004811115610d4e57610d4e611574565b03610976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016108a7565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610e1057505f90506003610eba565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610e61573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116610eb4575f60019250925050610eba565b91505f90505b94509492505050565b5080545f8255600202905f5260205f209081019061097691905b80821115610f23575f610ef08282610f27565b506001810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055600201610edd565b5090565b508054610f3390611311565b5f825580601f10610f42575050565b601f0160209004905f5260205f209081019061097691905b80821115610f23575f8155600101610f5a565b5f8083601f840112610f7d575f80fd5b50813567ffffffffffffffff811115610f94575f80fd5b602083019150836020828501011115610c22575f80fd5b5f805f805f60608688031215610fbf575f80fd5b85359450602086013567ffffffffffffffff80821115610fdd575f80fd5b818801915088601f830112610ff0575f80fd5b813581811115610ffe575f80fd5b8960208260051b8501011115611012575f80fd5b60208301965080955050604088013591508082111561102f575f80fd5b5061103c88828901610f6d565b969995985093965092949392505050565b5f805f6040848603121561105f575f80fd5b83359250602084013567ffffffffffffffff81111561107c575f80fd5b61108886828701610f6d565b9497909650939450505050565b5f602082840312156110a5575f80fd5b5035919050565b5f81518084525f5b818110156110d0576020818501810151868301820152016110b4565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b604081525f61111f60408301856110ac565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b602081525f61115660208301846110ac565b9392505050565b5f6020828403121561116d575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114611156575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082028115828204841417610acc57610acc611190565b80820180821115610acc57610acc611190565b5f80858511156111f5575f80fd5b83861115611201575f80fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000813581811691601485101561124e5780818660140360031b1b83161692505b505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126112b6575f80fd5b83018035915067ffffffffffffffff8211156112d0575f80fd5b602001915036819003821315610c22575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b600181811c9082168061132557607f821691505b60208210810361135c577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f8211156113ab575f81815260208120601f850160051c810160208610156113885750805b601f850160051c820191505b818110156113a757828155600101611394565b5050505b505050565b815167ffffffffffffffff8111156113ca576113ca6112e4565b6113de816113d88454611311565b84611362565b602080601f831160018114611430575f84156113fa5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556113a7565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561147c5788860151825594840194600190910190840161145d565b50858210156114b857878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036114f8576114f8611190565b5060010190565b818382375f9101908152919050565b81810381811115610acc57610acc611190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f8261155c5761155c611521565b500690565b5f8261156f5761156f611521565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffdfea2646970667358221220c5b9be0f0bb23e7a751c29d209c8012b88e672b5c9d6b5f36034c020fec6ecec64736f6c63430008140033", + "bytecode": "0x608060405234801561000f575f80fd5b5061001861001d565b6100da565b5f54610100900460ff16156100885760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811610156100d8575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6115d7806100e75f395ff3fe608060405234801561000f575f80fd5b50600436106100c4575f3560e01c8063715018a61161007d578063dce1e2b611610058578063dce1e2b614610172578063e4f171201461017a578063f2fde38b146101b9575f80fd5b8063715018a61461013a5780638129fc1c146101425780638da5cb5b1461014a575f80fd5b80635daf08ca116100ad5780635daf08ca146100f0578063609d45441461011a5780636beedd3914610131575f80fd5b8063078fba2a146100c85780633b51be4b146100dd575b5f80fd5b6100db6100d6366004610fab565b6101cc565b005b6100db6100eb36600461104d565b6104c8565b6101036100fe366004611095565b61070a565b60405161011192919061110d565b60405180910390f35b61012360665481565b604051908152602001610111565b61012360655481565b6100db6107d5565b6100db6107e8565b60335460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610111565b606754610123565b604080518082018252601981527f44617461417661696c6162696c697479436f6d6d697474656500000000000000602082015290516101119190611144565b6100db6101c736600461115d565b610979565b6101d4610a2d565b828581101561020f576040517f2e7dcd6e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61021a6014826111bd565b8214610252576040517f2ab6a12900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61025d60675f610ec3565b5f805b8281101561046c575f6102746014836111bd565b90505f8682876102856014836111d4565b92610292939291906111e7565b61029b9161120e565b60601c90508888848181106102b2576102b2611256565b90506020028101906102c49190611283565b90505f036102fe576040517fb54b70e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610610363576040517fd53cfbe000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606760405180604001604052808b8b8781811061038257610382611256565b90506020028101906103949190611283565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92018290525093855250505073ffffffffffffffffffffffffffffffffffffffff8516602092830152835460018101855593815220815191926002020190819061040790826113b0565b5060209190910151600190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911790559250819050610464816114c8565b915050610260565b50838360405161047d9291906114ff565b6040519081900381206066819055606589905581527f831403fd381b3e6ac875d912ec2eee0e0203d0d29f7b3e0c96fc8f582d6db6579060200160405180910390a150505050505050565b6065545f6104d78260416111bd565b9050808310806104fb575060146104ee828561150e565b6104f8919061154e565b15155b15610532576040517f6b8eec4600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606654610541848381886111e7565b60405161054f9291906114ff565b60405180910390201461058e576040517f6b156b2800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80601461059c848761150e565b6105a69190611561565b90505f5b84811015610700575f6105be6041836111bd565b90505f6106198a8a848b6105d36041836111d4565b926105e0939291906111e7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610aae92505050565b90505f855b858110156106b2575f6106326014836111bd565b61063c908a6111d4565b90505f8c828d61064d6014836111d4565b9261065a939291906111e7565b6106639161120e565b60601c905073ffffffffffffffffffffffffffffffffffffffff8516810361069d576106908360016111d4565b98506001935050506106b2565b505080806106aa906114c8565b91505061061e565b50806106ea576040517fe12afaf500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505080806106f8906114c8565b9150506105aa565b5050505050505050565b60678181548110610719575f80fd5b905f5260205f2090600202015f91509050805f01805461073890611311565b80601f016020809104026020016040519081016040528092919081815260200182805461076490611311565b80156107af5780601f10610786576101008083540402835291602001916107af565b820191905f5260205f20905b81548152906001019060200180831161079257829003601f168201915b5050506001909301549192505073ffffffffffffffffffffffffffffffffffffffff1682565b6107dd610a2d565b6107e65f610ad2565b565b5f54610100900460ff161580801561080657505f54600160ff909116105b8061081f5750303b15801561081f57505f5460ff166001145b6108b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561090c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610914610b48565b8015610976575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b610981610a2d565b73ffffffffffffffffffffffffffffffffffffffff8116610a24576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108a7565b61097681610ad2565b60335473ffffffffffffffffffffffffffffffffffffffff1633146107e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108a7565b5f805f610abb8585610be7565b91509150610ac881610c29565b5090505b92915050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff16610bde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108a7565b6107e633610ad2565b5f808251604103610c1b576020830151604084015160608501515f1a610c0f87828585610ddb565b94509450505050610c22565b505f905060025b9250929050565b5f816004811115610c3c57610c3c611574565b03610c445750565b6001816004811115610c5857610c58611574565b03610cbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016108a7565b6002816004811115610cd357610cd3611574565b03610d3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016108a7565b6003816004811115610d4e57610d4e611574565b03610976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016108a7565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610e1057505f90506003610eba565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610e61573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116610eb4575f60019250925050610eba565b91505f90505b94509492505050565b5080545f8255600202905f5260205f209081019061097691905b80821115610f23575f610ef08282610f27565b506001810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055600201610edd565b5090565b508054610f3390611311565b5f825580601f10610f42575050565b601f0160209004905f5260205f209081019061097691905b80821115610f23575f8155600101610f5a565b5f8083601f840112610f7d575f80fd5b50813567ffffffffffffffff811115610f94575f80fd5b602083019150836020828501011115610c22575f80fd5b5f805f805f60608688031215610fbf575f80fd5b85359450602086013567ffffffffffffffff80821115610fdd575f80fd5b818801915088601f830112610ff0575f80fd5b813581811115610ffe575f80fd5b8960208260051b8501011115611012575f80fd5b60208301965080955050604088013591508082111561102f575f80fd5b5061103c88828901610f6d565b969995985093965092949392505050565b5f805f6040848603121561105f575f80fd5b83359250602084013567ffffffffffffffff81111561107c575f80fd5b61108886828701610f6d565b9497909650939450505050565b5f602082840312156110a5575f80fd5b5035919050565b5f81518084525f5b818110156110d0576020818501810151868301820152016110b4565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b604081525f61111f60408301856110ac565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b602081525f61115660208301846110ac565b9392505050565b5f6020828403121561116d575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114611156575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082028115828204841417610acc57610acc611190565b80820180821115610acc57610acc611190565b5f80858511156111f5575f80fd5b83861115611201575f80fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000813581811691601485101561124e5780818660140360031b1b83161692505b505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126112b6575f80fd5b83018035915067ffffffffffffffff8211156112d0575f80fd5b602001915036819003821315610c22575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b600181811c9082168061132557607f821691505b60208210810361135c577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f8211156113ab575f81815260208120601f850160051c810160208610156113885750805b601f850160051c820191505b818110156113a757828155600101611394565b5050505b505050565b815167ffffffffffffffff8111156113ca576113ca6112e4565b6113de816113d88454611311565b84611362565b602080601f831160018114611430575f84156113fa5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556113a7565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561147c5788860151825594840194600190910190840161145d565b50858210156114b857878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036114f8576114f8611190565b5060010190565b818382375f9101908152919050565b81810381811115610acc57610acc611190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f8261155c5761155c611521565b500690565b5f8261156f5761156f611521565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffdfea264697066735822122058d7887c9b288c248c4266fd0e6022b67f031a42a97ee65f97a7995b12f2e50d64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106100c4575f3560e01c8063715018a61161007d578063dce1e2b611610058578063dce1e2b614610172578063e4f171201461017a578063f2fde38b146101b9575f80fd5b8063715018a61461013a5780638129fc1c146101425780638da5cb5b1461014a575f80fd5b80635daf08ca116100ad5780635daf08ca146100f0578063609d45441461011a5780636beedd3914610131575f80fd5b8063078fba2a146100c85780633b51be4b146100dd575b5f80fd5b6100db6100d6366004610fab565b6101cc565b005b6100db6100eb36600461104d565b6104c8565b6101036100fe366004611095565b61070a565b60405161011192919061110d565b60405180910390f35b61012360665481565b604051908152602001610111565b61012360655481565b6100db6107d5565b6100db6107e8565b60335460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610111565b606754610123565b604080518082018252601981527f44617461417661696c6162696c697479436f6d6d697474656500000000000000602082015290516101119190611144565b6100db6101c736600461115d565b610979565b6101d4610a2d565b828581101561020f576040517f2e7dcd6e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61021a6014826111bd565b8214610252576040517f2ab6a12900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61025d60675f610ec3565b5f805b8281101561046c575f6102746014836111bd565b90505f8682876102856014836111d4565b92610292939291906111e7565b61029b9161120e565b60601c90508888848181106102b2576102b2611256565b90506020028101906102c49190611283565b90505f036102fe576040517fb54b70e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610610363576040517fd53cfbe000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606760405180604001604052808b8b8781811061038257610382611256565b90506020028101906103949190611283565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92018290525093855250505073ffffffffffffffffffffffffffffffffffffffff8516602092830152835460018101855593815220815191926002020190819061040790826113b0565b5060209190910151600190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911790559250819050610464816114c8565b915050610260565b50838360405161047d9291906114ff565b6040519081900381206066819055606589905581527f831403fd381b3e6ac875d912ec2eee0e0203d0d29f7b3e0c96fc8f582d6db6579060200160405180910390a150505050505050565b6065545f6104d78260416111bd565b9050808310806104fb575060146104ee828561150e565b6104f8919061154e565b15155b15610532576040517f6b8eec4600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606654610541848381886111e7565b60405161054f9291906114ff565b60405180910390201461058e576040517f6b156b2800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80601461059c848761150e565b6105a69190611561565b90505f5b84811015610700575f6105be6041836111bd565b90505f6106198a8a848b6105d36041836111d4565b926105e0939291906111e7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610aae92505050565b90505f855b858110156106b2575f6106326014836111bd565b61063c908a6111d4565b90505f8c828d61064d6014836111d4565b9261065a939291906111e7565b6106639161120e565b60601c905073ffffffffffffffffffffffffffffffffffffffff8516810361069d576106908360016111d4565b98506001935050506106b2565b505080806106aa906114c8565b91505061061e565b50806106ea576040517fe12afaf500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505080806106f8906114c8565b9150506105aa565b5050505050505050565b60678181548110610719575f80fd5b905f5260205f2090600202015f91509050805f01805461073890611311565b80601f016020809104026020016040519081016040528092919081815260200182805461076490611311565b80156107af5780601f10610786576101008083540402835291602001916107af565b820191905f5260205f20905b81548152906001019060200180831161079257829003601f168201915b5050506001909301549192505073ffffffffffffffffffffffffffffffffffffffff1682565b6107dd610a2d565b6107e65f610ad2565b565b5f54610100900460ff161580801561080657505f54600160ff909116105b8061081f5750303b15801561081f57505f5460ff166001145b6108b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561090c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610914610b48565b8015610976575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b610981610a2d565b73ffffffffffffffffffffffffffffffffffffffff8116610a24576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108a7565b61097681610ad2565b60335473ffffffffffffffffffffffffffffffffffffffff1633146107e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108a7565b5f805f610abb8585610be7565b91509150610ac881610c29565b5090505b92915050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff16610bde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108a7565b6107e633610ad2565b5f808251604103610c1b576020830151604084015160608501515f1a610c0f87828585610ddb565b94509450505050610c22565b505f905060025b9250929050565b5f816004811115610c3c57610c3c611574565b03610c445750565b6001816004811115610c5857610c58611574565b03610cbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016108a7565b6002816004811115610cd357610cd3611574565b03610d3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016108a7565b6003816004811115610d4e57610d4e611574565b03610976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016108a7565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610e1057505f90506003610eba565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610e61573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116610eb4575f60019250925050610eba565b91505f90505b94509492505050565b5080545f8255600202905f5260205f209081019061097691905b80821115610f23575f610ef08282610f27565b506001810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055600201610edd565b5090565b508054610f3390611311565b5f825580601f10610f42575050565b601f0160209004905f5260205f209081019061097691905b80821115610f23575f8155600101610f5a565b5f8083601f840112610f7d575f80fd5b50813567ffffffffffffffff811115610f94575f80fd5b602083019150836020828501011115610c22575f80fd5b5f805f805f60608688031215610fbf575f80fd5b85359450602086013567ffffffffffffffff80821115610fdd575f80fd5b818801915088601f830112610ff0575f80fd5b813581811115610ffe575f80fd5b8960208260051b8501011115611012575f80fd5b60208301965080955050604088013591508082111561102f575f80fd5b5061103c88828901610f6d565b969995985093965092949392505050565b5f805f6040848603121561105f575f80fd5b83359250602084013567ffffffffffffffff81111561107c575f80fd5b61108886828701610f6d565b9497909650939450505050565b5f602082840312156110a5575f80fd5b5035919050565b5f81518084525f5b818110156110d0576020818501810151868301820152016110b4565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b604081525f61111f60408301856110ac565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b602081525f61115660208301846110ac565b9392505050565b5f6020828403121561116d575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114611156575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082028115828204841417610acc57610acc611190565b80820180821115610acc57610acc611190565b5f80858511156111f5575f80fd5b83861115611201575f80fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000813581811691601485101561124e5780818660140360031b1b83161692505b505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126112b6575f80fd5b83018035915067ffffffffffffffff8211156112d0575f80fd5b602001915036819003821315610c22575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b600181811c9082168061132557607f821691505b60208210810361135c577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f8211156113ab575f81815260208120601f850160051c810160208610156113885750805b601f850160051c820191505b818110156113a757828155600101611394565b5050505b505050565b815167ffffffffffffffff8111156113ca576113ca6112e4565b6113de816113d88454611311565b84611362565b602080601f831160018114611430575f84156113fa5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556113a7565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561147c5788860151825594840194600190910190840161145d565b50858210156114b857878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036114f8576114f8611190565b5060010190565b818382375f9101908152919050565b81810381811115610acc57610acc611190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f8261155c5761155c611521565b500690565b5f8261156f5761156f611521565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffdfea264697066735822122058d7887c9b288c248c4266fd0e6022b67f031a42a97ee65f97a7995b12f2e50d64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonRollupManager.json b/compiled-contracts/PolygonRollupManager.json index d53712bef..7be9724da 100644 --- a/compiled-contracts/PolygonRollupManager.json +++ b/compiled-contracts/PolygonRollupManager.json @@ -1965,8 +1965,8 @@ "type": "function" } ], - "bytecode": "0x60e060405234801562000010575f80fd5b5060405162005d4f38038062005d4f833981016040819052620000339162000136565b6001600160a01b0380841660805282811660c052811660a052620000566200005f565b50505062000187565b5f54610100900460ff1615620000cb5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811610156200011c575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811462000133575f80fd5b50565b5f805f6060848603121562000149575f80fd5b835162000156816200011e565b602085015190935062000169816200011e565b60408501519092506200017c816200011e565b809150509250925092565b60805160a05160c051615b65620001ea5f395f8181610a1c0152818161211e0152613a1501525f81816107d701528181612cae0152613d0401525f8181610976015281816111b60152818161135e01528181611e690152613bf90152615b655ff3fe608060405234801562000010575f80fd5b50600436106200030c575f3560e01c8063841b24d711620001a3578063c1acbc3411620000f3578063dbc16976116200009b578063dbc1697614620009da578063dde0ff7714620009e4578063e0bfd3d214620009ff578063e46761c41462000a16578063f34eb8eb1462000a3e578063f4e926751462000a55578063f9c4c2ae1462000a66575f80fd5b8063c1acbc341462000916578063c4c928c21462000931578063ceee281d1462000948578063d02103ca1462000970578063d5073f6f1462000998578063d547741f14620009af578063d939b31514620009c6575f80fd5b80639c9f3dfe11620001575780639c9f3dfe1462000791578063a066215c14620007a8578063a217fddf14620007bf578063a2967d9914620007c7578063a3c573eb14620007d1578063afd23cbe1462000812578063b99d0ad7146200083c575f80fd5b8063841b24d7146200071057806387c20c01146200072b5780638bd4f071146200074257806391d14854146200075957806399f5634e14620007705780639a908e73146200077a575f80fd5b806325280169116200025f57806355a71ee0116200021357806355a71ee014620005995780636046916914620005dc57806365c0504d14620005e65780637222020f1462000694578063727885e914620006ab5780637975fcfe14620006c25780637fb6e76a14620006e8575f80fd5b80632528016914620004835780632f2ff15d146200053757806330c27dde146200054e57806336568abe1462000562578063394218e91462000579578063477fa2701462000590575f80fd5b80631489ed1011620002c35780631489ed1014620003cb57806315064c9614620003e25780631608859c14620003f05780631796a1ae14620004075780631816b7e5146200042e5780632072f6c51462000445578063248a9ca3146200044f575f80fd5b80630645af091462000310578063066ec0121462000329578063080b3111146200035a5780630a0d9fbe146200038257806311f6b287146200039d57806312b86e1914620003b4575b5f80fd5b6200032762000321366004620046a3565b62000b7c565b005b6084546200033d906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b620003716200036b3660046200478c565b620010c5565b604051901515815260200162000351565b6085546200033d90600160401b90046001600160401b031681565b6200033d620003ae366004620047c2565b620010ee565b62000327620003c5366004620047f0565b6200110d565b62000327620003dc36600462004882565b620012b5565b606f54620003719060ff1681565b62000327620004013660046200478c565b62001443565b607e54620004189063ffffffff1681565b60405163ffffffff909116815260200162000351565b620003276200043f36600462004907565b620014d6565b6200032762001581565b620004746200046036600462004931565b5f9081526034602052604090206001015490565b60405190815260200162000351565b62000503620004943660046200478c565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b0390811691830191909152928201519092169082015260600162000351565b620003276200054836600462004949565b62001646565b6087546200033d906001600160401b031681565b620003276200057336600462004949565b6200166e565b620003276200058a3660046200497a565b620016a8565b60865462000474565b62000474620005aa3660046200478c565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620004746200175b565b6200064a620005f7366004620047c2565b607f6020525f90815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c00162000351565b62000327620006a5366004620047c2565b62001772565b62000327620006bc36600462004a3a565b6200186c565b620006d9620006d336600462004b00565b62001cc9565b60405162000351919062004bb3565b62000418620006f93660046200497a565b60836020525f908152604090205463ffffffff1681565b6084546200033d90600160c01b90046001600160401b031681565b620003276200073c36600462004882565b62001cfb565b6200032762000753366004620047f0565b6200201c565b620003716200076a36600462004949565b620020d3565b62000474620020fd565b6200033d6200078b36600462004bc7565b620021de565b62000327620007a23660046200497a565b620023aa565b62000327620007b93660046200497a565b6200244f565b620004745f81565b62000474620024f2565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200162000351565b6085546200082890600160801b900461ffff1681565b60405161ffff909116815260200162000351565b620008d16200084d3660046200478c565b60408051608080820183525f8083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b6040516200035191905f6080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200033d90600160801b90046001600160401b031681565b620003276200094236600462004bf2565b620028ba565b620004186200095936600462004c83565b60826020525f908152604090205463ffffffff1681565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b62000327620009a936600462004931565b62002b90565b62000327620009c036600462004949565b62002c2c565b6085546200033d906001600160401b031681565b6200032762002c54565b6084546200033d90600160401b90046001600160401b031681565b6200032762000a1036600462004cb2565b62002d20565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b6200032762000a4f36600462004d2a565b62002df4565b608054620004189063ffffffff1681565b62000afc62000a77366004620047c2565b60816020525f9081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff166101608201526101800162000351565b5f54600290610100900460ff1615801562000b9d57505f5460ff8083169116105b62000c065760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c8662002fe8565b62000ca05f8051602062005b108339815191528c62003054565b62000cac5f8862003054565b62000cd87fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908862003054565b62000d047f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8862003054565b62000d307f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8862003054565b62000d5c7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8962003054565b62000d887fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088962003054565b62000db47f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48962003054565b62000dce5f8051602062005ad08339815191528962003054565b62000e085f8051602062005b108339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062003060565b62000e347f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08962003054565b62000e607f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8962003054565b62000e9a5f8051602062005af08339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162003060565b62000eb45f8051602062005af08339815191528762003054565b62000ee07f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518762003054565b6073546074546001600160401b03600160401b9092048216911680821462000f1b57604051632e4cc54360e11b815260040160405180910390fd5b5f62000f40888888885f60745f9054906101000a90046001600160401b0316620030aa565b6001600160401b038381165f81815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b91829004909b1681029a909a17905560068a01805490911690931797870297909717909155600787018054909616909417909455607a54606f549390915290549251635d6717a560e01b81529394506001600160a01b038c811694635d6717a5946200103e9493831693600160581b9004909216916076916077919060040162004e63565b5f604051808303815f87803b15801562001056575f80fd5b505af115801562001069573d5f803e3d5ffd5b50505f805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620010b09050565b60405180910390a15050505050505050505050565b63ffffffff82165f908152608160205260408120620010e59083620032cb565b90505b92915050565b63ffffffff81165f908152608160205260408120620010e8906200330f565b5f8051602062005b1083398151915262001127816200337e565b63ffffffff89165f9081526081602052604090206200114d818a8a8a8a8a8a8a6200338a565b600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b90041615620011b4576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620011ed620024f2565b6040518263ffffffff1660e01b81526004016200120c91815260200190565b5f604051808303815f87803b15801562001224575f80fd5b505af115801562001237573d5f803e3d5ffd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b5f8051602062005b10833981519152620012cf816200337e565b63ffffffff89165f908152608160205260409020620012f5818a8a8a8a8a8a8a62003718565b600681018054600160401b600160801b031916600160401b6001600160401b038a81169182029290921783555f9081526002840160205260409020879055600583018890559054600160801b900416156200135c576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001395620024f2565b6040518263ffffffff1660e01b8152600401620013b491815260200190565b5f604051808303815f87803b158015620013cc575f80fd5b505af1158015620013df573d5f803e3d5ffd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff82165f908152608160205260409020620014715f8051602062005b1083398151915233620020d3565b620014c557606f5460ff16156200149b57604051630bc011ff60e21b815260040160405180910390fd5b620014a78183620032cb565b620014c557604051630674f25160e11b815260040160405180910390fd5b620014d1818362003b17565b505050565b5f8051602062005ad0833981519152620014f0816200337e565b6103e88261ffff1610806200150a57506103ff8261ffff16115b156200152957604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200159b5f8051602062005af083398151915233620020d3565b6200163a57608454600160801b90046001600160401b03161580620015eb57506084544290620015e09062093a8090600160801b90046001600160401b031662004ecb565b6001600160401b0316115b806200161b57506087544290620016109062093a80906001600160401b031662004ecb565b6001600160401b0316115b156200163a5760405163692baaad60e11b815260040160405180910390fd5b6200164462003d02565b565b5f8281526034602052604090206001015462001662816200337e565b620014d1838362003d7c565b6001600160a01b03811633146200169857604051630b4ad1cd60e31b815260040160405180910390fd5b620016a4828262003de7565b5050565b5f8051602062005ad0833981519152620016c2816200337e565b606f5460ff1662001704576084546001600160401b03600160c01b909104811690831610620017045760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19060200162001575565b5f60865460646200176d919062004ef5565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd6200179e816200337e565b63ffffffff82161580620017bd5750607e5463ffffffff908116908316115b15620017dc57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f60205260409020600180820154600160e81b900460ff16151590036200182257604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd0862001898816200337e565b63ffffffff88161580620018b75750607e5463ffffffff908116908916115b15620018d657604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88165f908152607f60205260409020600180820154600160e81b900460ff16151590036200191c57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b0388165f9081526083602052604090205463ffffffff161562001959576040516337c8fe0960e11b815260040160405180910390fd5b608080545f91908290620019739063ffffffff1662004f0f565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b03909216913091620019c09062004669565b620019ce9392919062004f34565b604051809103905ff080158015620019e8573d5f803e3d5ffd5b5090508160835f8c6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508a815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001c4c949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001c8c908d908d9088908e908e908e9060040162004f6a565b5f604051808303815f87803b15801562001ca4575f80fd5b505af115801562001cb7573d5f803e3d5ffd5b50505050505050505050505050505050565b63ffffffff86165f90815260816020526040902060609062001cf090878787878762003e50565b979650505050505050565b606f5460ff161562001d2057604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001d6e92600160c01b90048116911662004ecb565b6001600160401b0316111562001d9757604051638a0704d360e01b815260040160405180910390fd5b6103e862001da6888862004fcc565b6001600160401b0316111562001dcf57604051635acfba9d60e11b815260040160405180910390fd5b62001de1818989898989898962003718565b62001ded818762003f8f565b6085546001600160401b03165f0362001ef457600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562001e67576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001ea0620024f2565b6040518263ffffffff1660e01b815260040162001ebf91815260200190565b5f604051808303815f87803b15801562001ed7575f80fd5b505af115801562001eea573d5f803e3d5ffd5b5050505062001fbd565b62001eff8162004186565b600681018054600160801b90046001600160401b031690601062001f238362004fef565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b900487165f90815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff16156200204157604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602052604090206200206781898989898989896200338a565b6001600160401b0387165f9081526004820160209081526040918290206002015482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620020c862003d02565b505050505050505050565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b81523060048201525f9081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562002164573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200218a91906200500d565b6084549091505f90620021b0906001600160401b03600160401b82048116911662004fcc565b6001600160401b03169050805f03620021cb575f9250505090565b620021d7818362005039565b9250505090565b606f545f9060ff16156200220557604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff16908190036200223c576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f036200226657604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f9081526081602052604081206084805491928792620022989084906001600160401b031662004ecb565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f620022cd878362004ecb565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f95865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200235c8362004186565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b5f8051602062005ad0833981519152620023c4816200337e565b606f5460ff16620023ff576085546001600160401b0390811690831610620023ff5760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759060200162001575565b5f8051602062005ad083398151915262002469816200337e565b62015180826001600160401b031611156200249757604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289060200162001575565b6080545f9063ffffffff168082036200250c57505f919050565b5f816001600160401b0381111562002528576200252862004996565b60405190808252806020026020018201604052801562002552578160200160208202803683370190505b5090505f5b82811015620025c25760815f620025708360016200504f565b63ffffffff1663ffffffff1681526020019081526020015f2060050154828281518110620025a257620025a262005065565b602090810291909101015280620025b98162005079565b91505062002557565b505f60205b836001146200281a575f620025de60028662005094565b620025eb60028762005039565b620025f791906200504f565b90505f816001600160401b0381111562002615576200261562004996565b6040519080825280602002602001820160405280156200263f578160200160208202803683370190505b5090505f5b82811015620027c6576200265a600184620050aa565b811480156200267557506200267160028862005094565b6001145b15620026fd57856200268982600262004ef5565b815181106200269c576200269c62005065565b602002602001015185604051602001620026c0929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620026eb57620026eb62005065565b602002602001018181525050620027b1565b856200270b82600262004ef5565b815181106200271e576200271e62005065565b60200260200101518682600262002736919062004ef5565b620027439060016200504f565b8151811062002756576200275662005065565b602002602001015160405160200162002779929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620027a457620027a462005065565b6020026020010181815250505b80620027bd8162005079565b91505062002644565b508094508195508384604051602001620027ea929190918252602082015260400190565b60405160208183030381529060405280519060200120935082806200280f90620050c0565b9350505050620025c7565b5f835f8151811062002830576200283062005065565b602002602001015190505f5b82811015620028b057604080516020810184905290810185905260600160408051601f19818403018152828252805160209182012090830187905290820186905292506060016040516020818303038152906040528051906020012093508080620028a79062005079565b9150506200283c565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac620028e6816200337e565b63ffffffff84161580620029055750607e5463ffffffff908116908516115b156200292457604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526082602052604081205463ffffffff169081900362002964576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918716600160401b9091046001600160401b031603620029b257604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86165f908152607f60205260409020600180820154600160e81b900460ff1615159003620029f857604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002a3657604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790555f62002ab584620010ee565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002b0b9216908b908b90600401620050d8565b5f604051808303815f87803b15801562002b23575f80fd5b505af115801562002b36573d5f803e3d5ffd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002bbc816200337e565b683635c9adc5dea0000082118062002bd75750633b9aca0082105b1562002bf657604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001575565b5f8281526034602052604090206001015462002c48816200337e565b620014d1838362003de7565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002c80816200337e565b6087805467ffffffffffffffff1916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc16976916004808301925f92919082900301818387803b15801562002cfc575f80fd5b505af115801562002d0f573d5f803e3d5ffd5b5050505062002d1d6200424f565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62002d4c816200337e565b6001600160401b0384165f9081526083602052604090205463ffffffff161562002d89576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b0387165f9081526082602052604090205463ffffffff161562002dc657604051630d409b9360e41b815260040160405180910390fd5b5f62002dd788888888875f620030aa565b5f8080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002e20816200337e565b607e80545f9190829062002e3a9063ffffffff1662004f0f565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff1681526020015f1515815260200185815250607f5f8363ffffffff1663ffffffff1681526020019081526020015f205f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002fd69695949392919062005117565b60405180910390a25050505050505050565b5f54610100900460ff16620016445760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000bfd565b620016a4828262003d7c565b5f82815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080545f9182918290620030c59063ffffffff1662004f0f565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f876001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff16021790555060815f8263ffffffff1663ffffffff1681526020019081526020015f20915087825f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b0316021790555086826001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555084825f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620032b89594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b038281165f90815260048501602052604081205490924292620032fd92918116911662004ecb565b6001600160401b031611159392505050565b60068101545f90600160801b90046001600160401b03161562003361575060068101546001600160401b03600160801b90910481165f9081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002d1d8133620042a7565b60078801545f906001600160401b039081169087161015620033bf5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038816156200345f5760068901546001600160401b03600160801b90910481169089161115620034095760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f90815260048a0160205260409020600281015481549092888116600160401b90920416146200345857604051632bd2e3e760e01b815260040160405180910390fd5b50620034d3565b506001600160401b0385165f9081526002890160205260409020548062003499576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620034d357604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b909104811690881611806200350c5750876001600160401b0316876001600160401b031611155b8062003530575060068901546001600160401b03600160c01b909104811690881611155b156200354f5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260048b016020526040902054600160401b900481169086161462003595576040516332a2a77f60e01b815260040160405180910390fd5b5f620035a68a888888868962003e50565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620035dc91906200516f565b602060405180830381855afa158015620035f8573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200361d91906200500d565b62003629919062005094565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200366d918891906004016200518c565b602060405180830381865afa15801562003689573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620036af9190620051c8565b620036cd576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260048c0160205260409020600201548590036200370b5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b5f80620037258a6200330f565b60078b01549091506001600160401b0390811690891610156200375b5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620037fd5760068a01546001600160401b03600160801b9091048116908a161115620037a55760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a165f90815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620037f657604051632bd2e3e760e01b815260040160405180910390fd5b506200386c565b6001600160401b0388165f90815260028b01602052604090205491508162003838576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200386c57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b0316116200389f5760405163b9b18f5760e01b815260040160405180910390fd5b5f620038b08b8a8a8a878b62003e50565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620038e691906200516f565b602060405180830381855afa15801562003902573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200392791906200500d565b62003933919062005094565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003977918991906004016200518c565b602060405180830381865afa15801562003993573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620039b99190620051c8565b620039d7576040516309bde33960e01b815260040160405180910390fd5b5f620039e4848b62004fcc565b905062003a3d87826001600160401b0316620039ff620020fd565b62003a0b919062004ef5565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620042d1565b80608460088282829054906101000a90046001600160401b031662003a63919062004ecb565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d153906064015f604051808303815f87803b15801562003af1575f80fd5b505af115801562003b04573d5f803e3d5ffd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003b56575060068201546001600160401b03600160801b9091048116908216115b1562003b755760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f81815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003c30620024f2565b6040518263ffffffff1660e01b815260040162003c4f91815260200190565b5f604051808303815f87803b15801562003c67575f80fd5b505af115801562003c7a573d5f803e3d5ffd5b505085546001600160a01b03165f90815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801562003d5b575f80fd5b505af115801562003d6e573d5f803e3d5ffd5b505050506200164462004325565b62003d888282620020d3565b620016a4575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003df38282620020d3565b15620016a4575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086165f818152600389016020526040808220549388168252902054606092911580159062003e85575081155b1562003ea45760405163340c614f60e11b815260040160405180910390fd5b8062003ec3576040516366385b5160e01b815260040160405180910390fd5b62003ece8462004381565b62003eec576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b5f62003f9b836200330f565b9050815f8062003fac848462004fcc565b6085546001600160401b0391821692505f9162003fd291600160401b90041642620050aa565b90505b846001600160401b0316846001600160401b0316146200405b576001600160401b038085165f9081526003890160205260409020600181015490911682101562004036576001810154600160401b90046001600160401b0316945062004054565b62004042868662004fcc565b6001600160401b03169350506200405b565b5062003fd5565b5f620040688484620050aa565b905083811015620040c657808403600c811162004086578062004089565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620040bb57620040bb62005025565b04608655506200413d565b838103600c8111620040d95780620040dc565b600c5b90505f816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162004115576200411562005025565b04905080608654670de0b6b3a7640000028162004136576200413662005025565b0460865550505b683635c9adc5dea0000060865411156200416457683635c9adc5dea000006086556200417c565b633b9aca0060865410156200417c57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002d1d5760068101545f90620041d090600160c01b90046001600160401b0316600162004ecb565b9050620041de8282620032cb565b15620016a45760068201545f906002906200420b908490600160801b90046001600160401b031662004fcc565b620042179190620051e9565b62004223908362004ecb565b9050620042318382620032cb565b156200424357620014d1838262003b17565b620014d1838362003b17565b606f5460ff166200427357604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b620042b38282620020d3565b620016a457604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620014d190849062004405565b606f5460ff16156200434a57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff000000016001600160401b038316108015620043b7575067ffffffff00000001604083901c6001600160401b0316105b8015620043d8575067ffffffff00000001608083901c6001600160401b0316105b8015620043f0575067ffffffff0000000160c083901c105b15620043fe57506001919050565b505f919050565b5f6200445b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620044dd9092919063ffffffff16565b805190915015620014d157808060200190518101906200447c9190620051c8565b620014d15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000bfd565b6060620044ed84845f85620044f5565b949350505050565b606082471015620045585760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000bfd565b5f80866001600160a01b031685876040516200457591906200516f565b5f6040518083038185875af1925050503d805f8114620045b1576040519150601f19603f3d011682016040523d82523d5f602084013e620045b6565b606091505b509150915062001cf08783838760608315620046365782515f036200462e576001600160a01b0385163b6200462e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000bfd565b5081620044ed565b620044ed83838151156200464d5781518083602001fd5b8060405162461bcd60e51b815260040162000bfd919062004bb3565b6108be806200521283390190565b6001600160a01b038116811462002d1d575f80fd5b80356001600160401b038116811462003379575f80fd5b5f805f805f805f805f806101408b8d031215620046be575f80fd5b8a35620046cb8162004677565b9950620046db60208c016200468c565b9850620046eb60408c016200468c565b975060608b0135620046fd8162004677565b965060808b01356200470f8162004677565b955060a08b0135620047218162004677565b945060c08b0135620047338162004677565b935060e08b0135620047458162004677565b9250620047566101008c016200468c565b9150620047676101208c016200468c565b90509295989b9194979a5092959850565b803563ffffffff8116811462003379575f80fd5b5f80604083850312156200479e575f80fd5b620047a98362004778565b9150620047b9602084016200468c565b90509250929050565b5f60208284031215620047d3575f80fd5b620010e58262004778565b806103008101831015620010e8575f80fd5b5f805f805f805f806103e0898b03121562004809575f80fd5b620048148962004778565b97506200482460208a016200468c565b96506200483460408a016200468c565b95506200484460608a016200468c565b94506200485460808a016200468c565b935060a0890135925060c08901359150620048738a60e08b01620047de565b90509295985092959890939650565b5f805f805f805f806103e0898b0312156200489b575f80fd5b620048a68962004778565b9750620048b660208a016200468c565b9650620048c660408a016200468c565b9550620048d660608a016200468c565b94506080890135935060a0890135925060c0890135620048f68162004677565b9150620048738a60e08b01620047de565b5f6020828403121562004918575f80fd5b813561ffff811681146200492a575f80fd5b9392505050565b5f6020828403121562004942575f80fd5b5035919050565b5f80604083850312156200495b575f80fd5b8235915060208301356200496f8162004677565b809150509250929050565b5f602082840312156200498b575f80fd5b620010e5826200468c565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620049ba575f80fd5b81356001600160401b0380821115620049d757620049d762004996565b604051601f8301601f19908116603f0116810190828211818310171562004a025762004a0262004996565b8160405283815286602085880101111562004a1b575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a03121562004a51575f80fd5b62004a5c8862004778565b965062004a6c602089016200468c565b9550604088013562004a7e8162004677565b9450606088013562004a908162004677565b9350608088013562004aa28162004677565b925060a08801356001600160401b038082111562004abe575f80fd5b62004acc8b838c01620049aa565b935060c08a013591508082111562004ae2575f80fd5b5062004af18a828b01620049aa565b91505092959891949750929550565b5f805f805f8060c0878903121562004b16575f80fd5b62004b218762004778565b955062004b31602088016200468c565b945062004b41604088016200468c565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b8381101562004b7e57818101518382015260200162004b64565b50505f910152565b5f815180845262004b9f81602086016020860162004b62565b601f01601f19169290920160200192915050565b602081525f620010e5602083018462004b86565b5f806040838503121562004bd9575f80fd5b62004be4836200468c565b946020939093013593505050565b5f805f806060858703121562004c06575f80fd5b843562004c138162004677565b935062004c236020860162004778565b925060408501356001600160401b038082111562004c3f575f80fd5b818701915087601f83011262004c53575f80fd5b81358181111562004c62575f80fd5b88602082850101111562004c74575f80fd5b95989497505060200194505050565b5f6020828403121562004c94575f80fd5b81356200492a8162004677565b803560ff8116811462003379575f80fd5b5f805f805f8060c0878903121562004cc8575f80fd5b863562004cd58162004677565b9550602087013562004ce78162004677565b945062004cf7604088016200468c565b935062004d07606088016200468c565b92506080870135915062004d1e60a0880162004ca1565b90509295509295509295565b5f805f805f8060c0878903121562004d40575f80fd5b863562004d4d8162004677565b9550602087013562004d5f8162004677565b945062004d6f604088016200468c565b935062004d7f6060880162004ca1565b92506080870135915060a08701356001600160401b0381111562004da1575f80fd5b62004daf89828a01620049aa565b9150509295509295509295565b80545f90600181811c908083168062004dd657607f831692505b6020808410820362004df657634e487b7160e01b5f52602260045260245ffd5b8388526020880182801562004e14576001811462004e2b5762004e56565b60ff198716825285151560051b8201975062004e56565b5f898152602090205f5b8781101562004e505781548482015290860190840162004e35565b83019850505b5050505050505092915050565b6001600160a01b0386811682528516602082015260a0604082018190525f9062004e909083018662004dbc565b828103606084015262004ea4818662004dbc565b9150508260808301529695505050505050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111562004eee5762004eee62004eb7565b5092915050565b8082028115828204841417620010e857620010e862004eb7565b5f63ffffffff80831681810362004f2a5762004f2a62004eb7565b6001019392505050565b6001600160a01b038481168252831660208201526060604082018190525f9062004f619083018462004b86565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190525f9062004fab9083018562004b86565b82810360a084015262004fbf818562004b86565b9998505050505050505050565b6001600160401b0382811682821603908082111562004eee5762004eee62004eb7565b5f6001600160401b0380831681810362004f2a5762004f2a62004eb7565b5f602082840312156200501e575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f826200504a576200504a62005025565b500490565b80820180821115620010e857620010e862004eb7565b634e487b7160e01b5f52603260045260245ffd5b5f600182016200508d576200508d62004eb7565b5060010190565b5f82620050a557620050a562005025565b500690565b81810381811115620010e857620010e862004eb7565b5f81620050d157620050d162004eb7565b505f190190565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190525f90620051639083018462004b86565b98975050505050505050565b5f82516200518281846020870162004b62565b9190910192915050565b6103208101610300808584378201835f5b6001811015620051be5781518352602092830192909101906001016200519d565b5050509392505050565b5f60208284031215620051d9575f80fd5b815180151581146200492a575f80fd5b5f6001600160401b038084168062005205576200520562005025565b9216919091049291505056fe60a0604052604051620008be380380620008be8339810160408190526100249161034d565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b6565b505050610432565b61006182610124565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100aa576100a582826101a2565b505050565b6100b2610215565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f65f805160206200089e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161012181610236565b50565b806001600160a01b03163b5f0361015e57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516101be9190610417565b5f60405180830381855af49150503d805f81146101f6576040519150601f19603f3d011682016040523d82523d5f602084013e6101fb565b606091505b50909250905061020c858383610274565b95945050505050565b34156102345760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661025f57604051633173bdd160e11b81525f6004820152602401610155565b805f805160206200089e833981519152610181565b60608261028957610284826102d3565b6102cc565b81511580156102a057506001600160a01b0384163b155b156102c957604051639996b31560e01b81526001600160a01b0385166004820152602401610155565b50805b9392505050565b8051156102e35780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b0381168114610312575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561034557818101518382015260200161032d565b50505f910152565b5f805f6060848603121561035f575f80fd5b610368846102fc565b9250610376602085016102fc565b60408501519092506001600160401b0380821115610392575f80fd5b818601915086601f8301126103a5575f80fd5b8151818111156103b7576103b7610317565b604051601f8201601f19908116603f011681019083821181831017156103df576103df610317565b816040528281528960208487010111156103f7575f80fd5b61040883602083016020880161032b565b80955050505050509250925092565b5f825161042881846020870161032b565b9190910192915050565b6080516104546200044a5f395f601001526104545ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610069575f356001600160e01b03191663278f794360e11b146100615761005f61006d565b565b61005f61007d565b61005f5b61005f6100786100ab565b6100e2565b5f8061008c36600481846102ee565b8101906100999190610329565b915091506100a78282610100565b5050565b5f6100dd7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156100fc573d5ff35b3d5ffd5b6101098261015a565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101525761014d82826101d5565b505050565b6100a7610247565b806001600160a01b03163b5f0361019457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101f191906103f2565b5f60405180830381855af49150503d805f8114610229576040519150601f19603f3d011682016040523d82523d5f602084013e61022e565b606091505b509150915061023e858383610266565b95945050505050565b341561005f5760405163b398979f60e01b815260040160405180910390fd5b60608261027b57610276826102c5565b6102be565b815115801561029257506001600160a01b0384163b155b156102bb57604051639996b31560e01b81526001600160a01b038516600482015260240161018b565b50805b9392505050565b8051156102d55780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f80858511156102fc575f80fd5b83861115610308575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561033a575f80fd5b82356001600160a01b0381168114610350575f80fd5b9150602083013567ffffffffffffffff8082111561036c575f80fd5b818501915085601f83011261037f575f80fd5b81358181111561039157610391610315565b604051601f8201601f19908116603f011681019083821181831017156103b9576103b9610315565b816040528281528860208487010111156103d1575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b8181101561041157602081860181015185830152016103f7565b505f92019182525091905056fea2646970667358221220c3817d11eb3dc87723342527d38da55b7b3b362f54567f56cf1ef4db2f8a430664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a264697066735822122007e10c372a0db7fc583e3a5f3da00fa16274fbf3032428aa7025177f0dee4cdf64736f6c63430008140033", - "deployedBytecode": "0x608060405234801562000010575f80fd5b50600436106200030c575f3560e01c8063841b24d711620001a3578063c1acbc3411620000f3578063dbc16976116200009b578063dbc1697614620009da578063dde0ff7714620009e4578063e0bfd3d214620009ff578063e46761c41462000a16578063f34eb8eb1462000a3e578063f4e926751462000a55578063f9c4c2ae1462000a66575f80fd5b8063c1acbc341462000916578063c4c928c21462000931578063ceee281d1462000948578063d02103ca1462000970578063d5073f6f1462000998578063d547741f14620009af578063d939b31514620009c6575f80fd5b80639c9f3dfe11620001575780639c9f3dfe1462000791578063a066215c14620007a8578063a217fddf14620007bf578063a2967d9914620007c7578063a3c573eb14620007d1578063afd23cbe1462000812578063b99d0ad7146200083c575f80fd5b8063841b24d7146200071057806387c20c01146200072b5780638bd4f071146200074257806391d14854146200075957806399f5634e14620007705780639a908e73146200077a575f80fd5b806325280169116200025f57806355a71ee0116200021357806355a71ee014620005995780636046916914620005dc57806365c0504d14620005e65780637222020f1462000694578063727885e914620006ab5780637975fcfe14620006c25780637fb6e76a14620006e8575f80fd5b80632528016914620004835780632f2ff15d146200053757806330c27dde146200054e57806336568abe1462000562578063394218e91462000579578063477fa2701462000590575f80fd5b80631489ed1011620002c35780631489ed1014620003cb57806315064c9614620003e25780631608859c14620003f05780631796a1ae14620004075780631816b7e5146200042e5780632072f6c51462000445578063248a9ca3146200044f575f80fd5b80630645af091462000310578063066ec0121462000329578063080b3111146200035a5780630a0d9fbe146200038257806311f6b287146200039d57806312b86e1914620003b4575b5f80fd5b6200032762000321366004620046a3565b62000b7c565b005b6084546200033d906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b620003716200036b3660046200478c565b620010c5565b604051901515815260200162000351565b6085546200033d90600160401b90046001600160401b031681565b6200033d620003ae366004620047c2565b620010ee565b62000327620003c5366004620047f0565b6200110d565b62000327620003dc36600462004882565b620012b5565b606f54620003719060ff1681565b62000327620004013660046200478c565b62001443565b607e54620004189063ffffffff1681565b60405163ffffffff909116815260200162000351565b620003276200043f36600462004907565b620014d6565b6200032762001581565b620004746200046036600462004931565b5f9081526034602052604090206001015490565b60405190815260200162000351565b62000503620004943660046200478c565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b0390811691830191909152928201519092169082015260600162000351565b620003276200054836600462004949565b62001646565b6087546200033d906001600160401b031681565b620003276200057336600462004949565b6200166e565b620003276200058a3660046200497a565b620016a8565b60865462000474565b62000474620005aa3660046200478c565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620004746200175b565b6200064a620005f7366004620047c2565b607f6020525f90815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c00162000351565b62000327620006a5366004620047c2565b62001772565b62000327620006bc36600462004a3a565b6200186c565b620006d9620006d336600462004b00565b62001cc9565b60405162000351919062004bb3565b62000418620006f93660046200497a565b60836020525f908152604090205463ffffffff1681565b6084546200033d90600160c01b90046001600160401b031681565b620003276200073c36600462004882565b62001cfb565b6200032762000753366004620047f0565b6200201c565b620003716200076a36600462004949565b620020d3565b62000474620020fd565b6200033d6200078b36600462004bc7565b620021de565b62000327620007a23660046200497a565b620023aa565b62000327620007b93660046200497a565b6200244f565b620004745f81565b62000474620024f2565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200162000351565b6085546200082890600160801b900461ffff1681565b60405161ffff909116815260200162000351565b620008d16200084d3660046200478c565b60408051608080820183525f8083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b6040516200035191905f6080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200033d90600160801b90046001600160401b031681565b620003276200094236600462004bf2565b620028ba565b620004186200095936600462004c83565b60826020525f908152604090205463ffffffff1681565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b62000327620009a936600462004931565b62002b90565b62000327620009c036600462004949565b62002c2c565b6085546200033d906001600160401b031681565b6200032762002c54565b6084546200033d90600160401b90046001600160401b031681565b6200032762000a1036600462004cb2565b62002d20565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b6200032762000a4f36600462004d2a565b62002df4565b608054620004189063ffffffff1681565b62000afc62000a77366004620047c2565b60816020525f9081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff166101608201526101800162000351565b5f54600290610100900460ff1615801562000b9d57505f5460ff8083169116105b62000c065760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c8662002fe8565b62000ca05f8051602062005b108339815191528c62003054565b62000cac5f8862003054565b62000cd87fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908862003054565b62000d047f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8862003054565b62000d307f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8862003054565b62000d5c7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8962003054565b62000d887fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088962003054565b62000db47f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48962003054565b62000dce5f8051602062005ad08339815191528962003054565b62000e085f8051602062005b108339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062003060565b62000e347f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08962003054565b62000e607f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8962003054565b62000e9a5f8051602062005af08339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162003060565b62000eb45f8051602062005af08339815191528762003054565b62000ee07f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518762003054565b6073546074546001600160401b03600160401b9092048216911680821462000f1b57604051632e4cc54360e11b815260040160405180910390fd5b5f62000f40888888885f60745f9054906101000a90046001600160401b0316620030aa565b6001600160401b038381165f81815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b91829004909b1681029a909a17905560068a01805490911690931797870297909717909155600787018054909616909417909455607a54606f549390915290549251635d6717a560e01b81529394506001600160a01b038c811694635d6717a5946200103e9493831693600160581b9004909216916076916077919060040162004e63565b5f604051808303815f87803b15801562001056575f80fd5b505af115801562001069573d5f803e3d5ffd5b50505f805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620010b09050565b60405180910390a15050505050505050505050565b63ffffffff82165f908152608160205260408120620010e59083620032cb565b90505b92915050565b63ffffffff81165f908152608160205260408120620010e8906200330f565b5f8051602062005b1083398151915262001127816200337e565b63ffffffff89165f9081526081602052604090206200114d818a8a8a8a8a8a8a6200338a565b600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b90041615620011b4576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620011ed620024f2565b6040518263ffffffff1660e01b81526004016200120c91815260200190565b5f604051808303815f87803b15801562001224575f80fd5b505af115801562001237573d5f803e3d5ffd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b5f8051602062005b10833981519152620012cf816200337e565b63ffffffff89165f908152608160205260409020620012f5818a8a8a8a8a8a8a62003718565b600681018054600160401b600160801b031916600160401b6001600160401b038a81169182029290921783555f9081526002840160205260409020879055600583018890559054600160801b900416156200135c576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001395620024f2565b6040518263ffffffff1660e01b8152600401620013b491815260200190565b5f604051808303815f87803b158015620013cc575f80fd5b505af1158015620013df573d5f803e3d5ffd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff82165f908152608160205260409020620014715f8051602062005b1083398151915233620020d3565b620014c557606f5460ff16156200149b57604051630bc011ff60e21b815260040160405180910390fd5b620014a78183620032cb565b620014c557604051630674f25160e11b815260040160405180910390fd5b620014d1818362003b17565b505050565b5f8051602062005ad0833981519152620014f0816200337e565b6103e88261ffff1610806200150a57506103ff8261ffff16115b156200152957604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200159b5f8051602062005af083398151915233620020d3565b6200163a57608454600160801b90046001600160401b03161580620015eb57506084544290620015e09062093a8090600160801b90046001600160401b031662004ecb565b6001600160401b0316115b806200161b57506087544290620016109062093a80906001600160401b031662004ecb565b6001600160401b0316115b156200163a5760405163692baaad60e11b815260040160405180910390fd5b6200164462003d02565b565b5f8281526034602052604090206001015462001662816200337e565b620014d1838362003d7c565b6001600160a01b03811633146200169857604051630b4ad1cd60e31b815260040160405180910390fd5b620016a4828262003de7565b5050565b5f8051602062005ad0833981519152620016c2816200337e565b606f5460ff1662001704576084546001600160401b03600160c01b909104811690831610620017045760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19060200162001575565b5f60865460646200176d919062004ef5565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd6200179e816200337e565b63ffffffff82161580620017bd5750607e5463ffffffff908116908316115b15620017dc57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f60205260409020600180820154600160e81b900460ff16151590036200182257604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd0862001898816200337e565b63ffffffff88161580620018b75750607e5463ffffffff908116908916115b15620018d657604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88165f908152607f60205260409020600180820154600160e81b900460ff16151590036200191c57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b0388165f9081526083602052604090205463ffffffff161562001959576040516337c8fe0960e11b815260040160405180910390fd5b608080545f91908290620019739063ffffffff1662004f0f565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b03909216913091620019c09062004669565b620019ce9392919062004f34565b604051809103905ff080158015620019e8573d5f803e3d5ffd5b5090508160835f8c6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508a815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001c4c949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001c8c908d908d9088908e908e908e9060040162004f6a565b5f604051808303815f87803b15801562001ca4575f80fd5b505af115801562001cb7573d5f803e3d5ffd5b50505050505050505050505050505050565b63ffffffff86165f90815260816020526040902060609062001cf090878787878762003e50565b979650505050505050565b606f5460ff161562001d2057604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001d6e92600160c01b90048116911662004ecb565b6001600160401b0316111562001d9757604051638a0704d360e01b815260040160405180910390fd5b6103e862001da6888862004fcc565b6001600160401b0316111562001dcf57604051635acfba9d60e11b815260040160405180910390fd5b62001de1818989898989898962003718565b62001ded818762003f8f565b6085546001600160401b03165f0362001ef457600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562001e67576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001ea0620024f2565b6040518263ffffffff1660e01b815260040162001ebf91815260200190565b5f604051808303815f87803b15801562001ed7575f80fd5b505af115801562001eea573d5f803e3d5ffd5b5050505062001fbd565b62001eff8162004186565b600681018054600160801b90046001600160401b031690601062001f238362004fef565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b900487165f90815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff16156200204157604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602052604090206200206781898989898989896200338a565b6001600160401b0387165f9081526004820160209081526040918290206002015482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620020c862003d02565b505050505050505050565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b81523060048201525f9081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562002164573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200218a91906200500d565b6084549091505f90620021b0906001600160401b03600160401b82048116911662004fcc565b6001600160401b03169050805f03620021cb575f9250505090565b620021d7818362005039565b9250505090565b606f545f9060ff16156200220557604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff16908190036200223c576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f036200226657604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f9081526081602052604081206084805491928792620022989084906001600160401b031662004ecb565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f620022cd878362004ecb565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f95865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200235c8362004186565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b5f8051602062005ad0833981519152620023c4816200337e565b606f5460ff16620023ff576085546001600160401b0390811690831610620023ff5760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759060200162001575565b5f8051602062005ad083398151915262002469816200337e565b62015180826001600160401b031611156200249757604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289060200162001575565b6080545f9063ffffffff168082036200250c57505f919050565b5f816001600160401b0381111562002528576200252862004996565b60405190808252806020026020018201604052801562002552578160200160208202803683370190505b5090505f5b82811015620025c25760815f620025708360016200504f565b63ffffffff1663ffffffff1681526020019081526020015f2060050154828281518110620025a257620025a262005065565b602090810291909101015280620025b98162005079565b91505062002557565b505f60205b836001146200281a575f620025de60028662005094565b620025eb60028762005039565b620025f791906200504f565b90505f816001600160401b0381111562002615576200261562004996565b6040519080825280602002602001820160405280156200263f578160200160208202803683370190505b5090505f5b82811015620027c6576200265a600184620050aa565b811480156200267557506200267160028862005094565b6001145b15620026fd57856200268982600262004ef5565b815181106200269c576200269c62005065565b602002602001015185604051602001620026c0929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620026eb57620026eb62005065565b602002602001018181525050620027b1565b856200270b82600262004ef5565b815181106200271e576200271e62005065565b60200260200101518682600262002736919062004ef5565b620027439060016200504f565b8151811062002756576200275662005065565b602002602001015160405160200162002779929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620027a457620027a462005065565b6020026020010181815250505b80620027bd8162005079565b91505062002644565b508094508195508384604051602001620027ea929190918252602082015260400190565b60405160208183030381529060405280519060200120935082806200280f90620050c0565b9350505050620025c7565b5f835f8151811062002830576200283062005065565b602002602001015190505f5b82811015620028b057604080516020810184905290810185905260600160408051601f19818403018152828252805160209182012090830187905290820186905292506060016040516020818303038152906040528051906020012093508080620028a79062005079565b9150506200283c565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac620028e6816200337e565b63ffffffff84161580620029055750607e5463ffffffff908116908516115b156200292457604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526082602052604081205463ffffffff169081900362002964576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918716600160401b9091046001600160401b031603620029b257604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86165f908152607f60205260409020600180820154600160e81b900460ff1615159003620029f857604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002a3657604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790555f62002ab584620010ee565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002b0b9216908b908b90600401620050d8565b5f604051808303815f87803b15801562002b23575f80fd5b505af115801562002b36573d5f803e3d5ffd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002bbc816200337e565b683635c9adc5dea0000082118062002bd75750633b9aca0082105b1562002bf657604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001575565b5f8281526034602052604090206001015462002c48816200337e565b620014d1838362003de7565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002c80816200337e565b6087805467ffffffffffffffff1916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc16976916004808301925f92919082900301818387803b15801562002cfc575f80fd5b505af115801562002d0f573d5f803e3d5ffd5b5050505062002d1d6200424f565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62002d4c816200337e565b6001600160401b0384165f9081526083602052604090205463ffffffff161562002d89576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b0387165f9081526082602052604090205463ffffffff161562002dc657604051630d409b9360e41b815260040160405180910390fd5b5f62002dd788888888875f620030aa565b5f8080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002e20816200337e565b607e80545f9190829062002e3a9063ffffffff1662004f0f565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff1681526020015f1515815260200185815250607f5f8363ffffffff1663ffffffff1681526020019081526020015f205f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002fd69695949392919062005117565b60405180910390a25050505050505050565b5f54610100900460ff16620016445760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000bfd565b620016a4828262003d7c565b5f82815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080545f9182918290620030c59063ffffffff1662004f0f565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f876001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff16021790555060815f8263ffffffff1663ffffffff1681526020019081526020015f20915087825f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b0316021790555086826001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555084825f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620032b89594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b038281165f90815260048501602052604081205490924292620032fd92918116911662004ecb565b6001600160401b031611159392505050565b60068101545f90600160801b90046001600160401b03161562003361575060068101546001600160401b03600160801b90910481165f9081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002d1d8133620042a7565b60078801545f906001600160401b039081169087161015620033bf5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038816156200345f5760068901546001600160401b03600160801b90910481169089161115620034095760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f90815260048a0160205260409020600281015481549092888116600160401b90920416146200345857604051632bd2e3e760e01b815260040160405180910390fd5b50620034d3565b506001600160401b0385165f9081526002890160205260409020548062003499576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620034d357604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b909104811690881611806200350c5750876001600160401b0316876001600160401b031611155b8062003530575060068901546001600160401b03600160c01b909104811690881611155b156200354f5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260048b016020526040902054600160401b900481169086161462003595576040516332a2a77f60e01b815260040160405180910390fd5b5f620035a68a888888868962003e50565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620035dc91906200516f565b602060405180830381855afa158015620035f8573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200361d91906200500d565b62003629919062005094565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200366d918891906004016200518c565b602060405180830381865afa15801562003689573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620036af9190620051c8565b620036cd576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260048c0160205260409020600201548590036200370b5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b5f80620037258a6200330f565b60078b01549091506001600160401b0390811690891610156200375b5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620037fd5760068a01546001600160401b03600160801b9091048116908a161115620037a55760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a165f90815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620037f657604051632bd2e3e760e01b815260040160405180910390fd5b506200386c565b6001600160401b0388165f90815260028b01602052604090205491508162003838576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200386c57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b0316116200389f5760405163b9b18f5760e01b815260040160405180910390fd5b5f620038b08b8a8a8a878b62003e50565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620038e691906200516f565b602060405180830381855afa15801562003902573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200392791906200500d565b62003933919062005094565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003977918991906004016200518c565b602060405180830381865afa15801562003993573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620039b99190620051c8565b620039d7576040516309bde33960e01b815260040160405180910390fd5b5f620039e4848b62004fcc565b905062003a3d87826001600160401b0316620039ff620020fd565b62003a0b919062004ef5565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620042d1565b80608460088282829054906101000a90046001600160401b031662003a63919062004ecb565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d153906064015f604051808303815f87803b15801562003af1575f80fd5b505af115801562003b04573d5f803e3d5ffd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003b56575060068201546001600160401b03600160801b9091048116908216115b1562003b755760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f81815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003c30620024f2565b6040518263ffffffff1660e01b815260040162003c4f91815260200190565b5f604051808303815f87803b15801562003c67575f80fd5b505af115801562003c7a573d5f803e3d5ffd5b505085546001600160a01b03165f90815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801562003d5b575f80fd5b505af115801562003d6e573d5f803e3d5ffd5b505050506200164462004325565b62003d888282620020d3565b620016a4575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003df38282620020d3565b15620016a4575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086165f818152600389016020526040808220549388168252902054606092911580159062003e85575081155b1562003ea45760405163340c614f60e11b815260040160405180910390fd5b8062003ec3576040516366385b5160e01b815260040160405180910390fd5b62003ece8462004381565b62003eec576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b5f62003f9b836200330f565b9050815f8062003fac848462004fcc565b6085546001600160401b0391821692505f9162003fd291600160401b90041642620050aa565b90505b846001600160401b0316846001600160401b0316146200405b576001600160401b038085165f9081526003890160205260409020600181015490911682101562004036576001810154600160401b90046001600160401b0316945062004054565b62004042868662004fcc565b6001600160401b03169350506200405b565b5062003fd5565b5f620040688484620050aa565b905083811015620040c657808403600c811162004086578062004089565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620040bb57620040bb62005025565b04608655506200413d565b838103600c8111620040d95780620040dc565b600c5b90505f816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162004115576200411562005025565b04905080608654670de0b6b3a7640000028162004136576200413662005025565b0460865550505b683635c9adc5dea0000060865411156200416457683635c9adc5dea000006086556200417c565b633b9aca0060865410156200417c57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002d1d5760068101545f90620041d090600160c01b90046001600160401b0316600162004ecb565b9050620041de8282620032cb565b15620016a45760068201545f906002906200420b908490600160801b90046001600160401b031662004fcc565b620042179190620051e9565b62004223908362004ecb565b9050620042318382620032cb565b156200424357620014d1838262003b17565b620014d1838362003b17565b606f5460ff166200427357604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b620042b38282620020d3565b620016a457604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620014d190849062004405565b606f5460ff16156200434a57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff000000016001600160401b038316108015620043b7575067ffffffff00000001604083901c6001600160401b0316105b8015620043d8575067ffffffff00000001608083901c6001600160401b0316105b8015620043f0575067ffffffff0000000160c083901c105b15620043fe57506001919050565b505f919050565b5f6200445b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620044dd9092919063ffffffff16565b805190915015620014d157808060200190518101906200447c9190620051c8565b620014d15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000bfd565b6060620044ed84845f85620044f5565b949350505050565b606082471015620045585760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000bfd565b5f80866001600160a01b031685876040516200457591906200516f565b5f6040518083038185875af1925050503d805f8114620045b1576040519150601f19603f3d011682016040523d82523d5f602084013e620045b6565b606091505b509150915062001cf08783838760608315620046365782515f036200462e576001600160a01b0385163b6200462e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000bfd565b5081620044ed565b620044ed83838151156200464d5781518083602001fd5b8060405162461bcd60e51b815260040162000bfd919062004bb3565b6108be806200521283390190565b6001600160a01b038116811462002d1d575f80fd5b80356001600160401b038116811462003379575f80fd5b5f805f805f805f805f806101408b8d031215620046be575f80fd5b8a35620046cb8162004677565b9950620046db60208c016200468c565b9850620046eb60408c016200468c565b975060608b0135620046fd8162004677565b965060808b01356200470f8162004677565b955060a08b0135620047218162004677565b945060c08b0135620047338162004677565b935060e08b0135620047458162004677565b9250620047566101008c016200468c565b9150620047676101208c016200468c565b90509295989b9194979a5092959850565b803563ffffffff8116811462003379575f80fd5b5f80604083850312156200479e575f80fd5b620047a98362004778565b9150620047b9602084016200468c565b90509250929050565b5f60208284031215620047d3575f80fd5b620010e58262004778565b806103008101831015620010e8575f80fd5b5f805f805f805f806103e0898b03121562004809575f80fd5b620048148962004778565b97506200482460208a016200468c565b96506200483460408a016200468c565b95506200484460608a016200468c565b94506200485460808a016200468c565b935060a0890135925060c08901359150620048738a60e08b01620047de565b90509295985092959890939650565b5f805f805f805f806103e0898b0312156200489b575f80fd5b620048a68962004778565b9750620048b660208a016200468c565b9650620048c660408a016200468c565b9550620048d660608a016200468c565b94506080890135935060a0890135925060c0890135620048f68162004677565b9150620048738a60e08b01620047de565b5f6020828403121562004918575f80fd5b813561ffff811681146200492a575f80fd5b9392505050565b5f6020828403121562004942575f80fd5b5035919050565b5f80604083850312156200495b575f80fd5b8235915060208301356200496f8162004677565b809150509250929050565b5f602082840312156200498b575f80fd5b620010e5826200468c565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620049ba575f80fd5b81356001600160401b0380821115620049d757620049d762004996565b604051601f8301601f19908116603f0116810190828211818310171562004a025762004a0262004996565b8160405283815286602085880101111562004a1b575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a03121562004a51575f80fd5b62004a5c8862004778565b965062004a6c602089016200468c565b9550604088013562004a7e8162004677565b9450606088013562004a908162004677565b9350608088013562004aa28162004677565b925060a08801356001600160401b038082111562004abe575f80fd5b62004acc8b838c01620049aa565b935060c08a013591508082111562004ae2575f80fd5b5062004af18a828b01620049aa565b91505092959891949750929550565b5f805f805f8060c0878903121562004b16575f80fd5b62004b218762004778565b955062004b31602088016200468c565b945062004b41604088016200468c565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b8381101562004b7e57818101518382015260200162004b64565b50505f910152565b5f815180845262004b9f81602086016020860162004b62565b601f01601f19169290920160200192915050565b602081525f620010e5602083018462004b86565b5f806040838503121562004bd9575f80fd5b62004be4836200468c565b946020939093013593505050565b5f805f806060858703121562004c06575f80fd5b843562004c138162004677565b935062004c236020860162004778565b925060408501356001600160401b038082111562004c3f575f80fd5b818701915087601f83011262004c53575f80fd5b81358181111562004c62575f80fd5b88602082850101111562004c74575f80fd5b95989497505060200194505050565b5f6020828403121562004c94575f80fd5b81356200492a8162004677565b803560ff8116811462003379575f80fd5b5f805f805f8060c0878903121562004cc8575f80fd5b863562004cd58162004677565b9550602087013562004ce78162004677565b945062004cf7604088016200468c565b935062004d07606088016200468c565b92506080870135915062004d1e60a0880162004ca1565b90509295509295509295565b5f805f805f8060c0878903121562004d40575f80fd5b863562004d4d8162004677565b9550602087013562004d5f8162004677565b945062004d6f604088016200468c565b935062004d7f6060880162004ca1565b92506080870135915060a08701356001600160401b0381111562004da1575f80fd5b62004daf89828a01620049aa565b9150509295509295509295565b80545f90600181811c908083168062004dd657607f831692505b6020808410820362004df657634e487b7160e01b5f52602260045260245ffd5b8388526020880182801562004e14576001811462004e2b5762004e56565b60ff198716825285151560051b8201975062004e56565b5f898152602090205f5b8781101562004e505781548482015290860190840162004e35565b83019850505b5050505050505092915050565b6001600160a01b0386811682528516602082015260a0604082018190525f9062004e909083018662004dbc565b828103606084015262004ea4818662004dbc565b9150508260808301529695505050505050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111562004eee5762004eee62004eb7565b5092915050565b8082028115828204841417620010e857620010e862004eb7565b5f63ffffffff80831681810362004f2a5762004f2a62004eb7565b6001019392505050565b6001600160a01b038481168252831660208201526060604082018190525f9062004f619083018462004b86565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190525f9062004fab9083018562004b86565b82810360a084015262004fbf818562004b86565b9998505050505050505050565b6001600160401b0382811682821603908082111562004eee5762004eee62004eb7565b5f6001600160401b0380831681810362004f2a5762004f2a62004eb7565b5f602082840312156200501e575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f826200504a576200504a62005025565b500490565b80820180821115620010e857620010e862004eb7565b634e487b7160e01b5f52603260045260245ffd5b5f600182016200508d576200508d62004eb7565b5060010190565b5f82620050a557620050a562005025565b500690565b81810381811115620010e857620010e862004eb7565b5f81620050d157620050d162004eb7565b505f190190565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190525f90620051639083018462004b86565b98975050505050505050565b5f82516200518281846020870162004b62565b9190910192915050565b6103208101610300808584378201835f5b6001811015620051be5781518352602092830192909101906001016200519d565b5050509392505050565b5f60208284031215620051d9575f80fd5b815180151581146200492a575f80fd5b5f6001600160401b038084168062005205576200520562005025565b9216919091049291505056fe60a0604052604051620008be380380620008be8339810160408190526100249161034d565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b6565b505050610432565b61006182610124565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100aa576100a582826101a2565b505050565b6100b2610215565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f65f805160206200089e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161012181610236565b50565b806001600160a01b03163b5f0361015e57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516101be9190610417565b5f60405180830381855af49150503d805f81146101f6576040519150601f19603f3d011682016040523d82523d5f602084013e6101fb565b606091505b50909250905061020c858383610274565b95945050505050565b34156102345760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661025f57604051633173bdd160e11b81525f6004820152602401610155565b805f805160206200089e833981519152610181565b60608261028957610284826102d3565b6102cc565b81511580156102a057506001600160a01b0384163b155b156102c957604051639996b31560e01b81526001600160a01b0385166004820152602401610155565b50805b9392505050565b8051156102e35780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b0381168114610312575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561034557818101518382015260200161032d565b50505f910152565b5f805f6060848603121561035f575f80fd5b610368846102fc565b9250610376602085016102fc565b60408501519092506001600160401b0380821115610392575f80fd5b818601915086601f8301126103a5575f80fd5b8151818111156103b7576103b7610317565b604051601f8201601f19908116603f011681019083821181831017156103df576103df610317565b816040528281528960208487010111156103f7575f80fd5b61040883602083016020880161032b565b80955050505050509250925092565b5f825161042881846020870161032b565b9190910192915050565b6080516104546200044a5f395f601001526104545ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610069575f356001600160e01b03191663278f794360e11b146100615761005f61006d565b565b61005f61007d565b61005f5b61005f6100786100ab565b6100e2565b5f8061008c36600481846102ee565b8101906100999190610329565b915091506100a78282610100565b5050565b5f6100dd7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156100fc573d5ff35b3d5ffd5b6101098261015a565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101525761014d82826101d5565b505050565b6100a7610247565b806001600160a01b03163b5f0361019457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101f191906103f2565b5f60405180830381855af49150503d805f8114610229576040519150601f19603f3d011682016040523d82523d5f602084013e61022e565b606091505b509150915061023e858383610266565b95945050505050565b341561005f5760405163b398979f60e01b815260040160405180910390fd5b60608261027b57610276826102c5565b6102be565b815115801561029257506001600160a01b0384163b155b156102bb57604051639996b31560e01b81526001600160a01b038516600482015260240161018b565b50805b9392505050565b8051156102d55780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f80858511156102fc575f80fd5b83861115610308575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561033a575f80fd5b82356001600160a01b0381168114610350575f80fd5b9150602083013567ffffffffffffffff8082111561036c575f80fd5b818501915085601f83011261037f575f80fd5b81358181111561039157610391610315565b604051601f8201601f19908116603f011681019083821181831017156103b9576103b9610315565b816040528281528860208487010111156103d1575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b8181101561041157602081860181015185830152016103f7565b505f92019182525091905056fea2646970667358221220c3817d11eb3dc87723342527d38da55b7b3b362f54567f56cf1ef4db2f8a430664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a264697066735822122007e10c372a0db7fc583e3a5f3da00fa16274fbf3032428aa7025177f0dee4cdf64736f6c63430008140033", + "bytecode": "0x60e060405234801562000010575f80fd5b5060405162005d4f38038062005d4f833981016040819052620000339162000136565b6001600160a01b0380841660805282811660c052811660a052620000566200005f565b50505062000187565b5f54610100900460ff1615620000cb5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811610156200011c575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811462000133575f80fd5b50565b5f805f6060848603121562000149575f80fd5b835162000156816200011e565b602085015190935062000169816200011e565b60408501519092506200017c816200011e565b809150509250925092565b60805160a05160c051615b65620001ea5f395f8181610a1c0152818161211e0152613a1501525f81816107d701528181612cae0152613d0401525f8181610976015281816111b60152818161135e01528181611e690152613bf90152615b655ff3fe608060405234801562000010575f80fd5b50600436106200030c575f3560e01c8063841b24d711620001a3578063c1acbc3411620000f3578063dbc16976116200009b578063dbc1697614620009da578063dde0ff7714620009e4578063e0bfd3d214620009ff578063e46761c41462000a16578063f34eb8eb1462000a3e578063f4e926751462000a55578063f9c4c2ae1462000a66575f80fd5b8063c1acbc341462000916578063c4c928c21462000931578063ceee281d1462000948578063d02103ca1462000970578063d5073f6f1462000998578063d547741f14620009af578063d939b31514620009c6575f80fd5b80639c9f3dfe11620001575780639c9f3dfe1462000791578063a066215c14620007a8578063a217fddf14620007bf578063a2967d9914620007c7578063a3c573eb14620007d1578063afd23cbe1462000812578063b99d0ad7146200083c575f80fd5b8063841b24d7146200071057806387c20c01146200072b5780638bd4f071146200074257806391d14854146200075957806399f5634e14620007705780639a908e73146200077a575f80fd5b806325280169116200025f57806355a71ee0116200021357806355a71ee014620005995780636046916914620005dc57806365c0504d14620005e65780637222020f1462000694578063727885e914620006ab5780637975fcfe14620006c25780637fb6e76a14620006e8575f80fd5b80632528016914620004835780632f2ff15d146200053757806330c27dde146200054e57806336568abe1462000562578063394218e91462000579578063477fa2701462000590575f80fd5b80631489ed1011620002c35780631489ed1014620003cb57806315064c9614620003e25780631608859c14620003f05780631796a1ae14620004075780631816b7e5146200042e5780632072f6c51462000445578063248a9ca3146200044f575f80fd5b80630645af091462000310578063066ec0121462000329578063080b3111146200035a5780630a0d9fbe146200038257806311f6b287146200039d57806312b86e1914620003b4575b5f80fd5b6200032762000321366004620046a3565b62000b7c565b005b6084546200033d906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b620003716200036b3660046200478c565b620010c5565b604051901515815260200162000351565b6085546200033d90600160401b90046001600160401b031681565b6200033d620003ae366004620047c2565b620010ee565b62000327620003c5366004620047f0565b6200110d565b62000327620003dc36600462004882565b620012b5565b606f54620003719060ff1681565b62000327620004013660046200478c565b62001443565b607e54620004189063ffffffff1681565b60405163ffffffff909116815260200162000351565b620003276200043f36600462004907565b620014d6565b6200032762001581565b620004746200046036600462004931565b5f9081526034602052604090206001015490565b60405190815260200162000351565b62000503620004943660046200478c565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b0390811691830191909152928201519092169082015260600162000351565b620003276200054836600462004949565b62001646565b6087546200033d906001600160401b031681565b620003276200057336600462004949565b6200166e565b620003276200058a3660046200497a565b620016a8565b60865462000474565b62000474620005aa3660046200478c565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620004746200175b565b6200064a620005f7366004620047c2565b607f6020525f90815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c00162000351565b62000327620006a5366004620047c2565b62001772565b62000327620006bc36600462004a3a565b6200186c565b620006d9620006d336600462004b00565b62001cc9565b60405162000351919062004bb3565b62000418620006f93660046200497a565b60836020525f908152604090205463ffffffff1681565b6084546200033d90600160c01b90046001600160401b031681565b620003276200073c36600462004882565b62001cfb565b6200032762000753366004620047f0565b6200201c565b620003716200076a36600462004949565b620020d3565b62000474620020fd565b6200033d6200078b36600462004bc7565b620021de565b62000327620007a23660046200497a565b620023aa565b62000327620007b93660046200497a565b6200244f565b620004745f81565b62000474620024f2565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200162000351565b6085546200082890600160801b900461ffff1681565b60405161ffff909116815260200162000351565b620008d16200084d3660046200478c565b60408051608080820183525f8083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b6040516200035191905f6080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200033d90600160801b90046001600160401b031681565b620003276200094236600462004bf2565b620028ba565b620004186200095936600462004c83565b60826020525f908152604090205463ffffffff1681565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b62000327620009a936600462004931565b62002b90565b62000327620009c036600462004949565b62002c2c565b6085546200033d906001600160401b031681565b6200032762002c54565b6084546200033d90600160401b90046001600160401b031681565b6200032762000a1036600462004cb2565b62002d20565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b6200032762000a4f36600462004d2a565b62002df4565b608054620004189063ffffffff1681565b62000afc62000a77366004620047c2565b60816020525f9081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff166101608201526101800162000351565b5f54600290610100900460ff1615801562000b9d57505f5460ff8083169116105b62000c065760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c8662002fe8565b62000ca05f8051602062005b108339815191528c62003054565b62000cac5f8862003054565b62000cd87fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908862003054565b62000d047f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8862003054565b62000d307f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8862003054565b62000d5c7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8962003054565b62000d887fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088962003054565b62000db47f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48962003054565b62000dce5f8051602062005ad08339815191528962003054565b62000e085f8051602062005b108339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062003060565b62000e347f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08962003054565b62000e607f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8962003054565b62000e9a5f8051602062005af08339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162003060565b62000eb45f8051602062005af08339815191528762003054565b62000ee07f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518762003054565b6073546074546001600160401b03600160401b9092048216911680821462000f1b57604051632e4cc54360e11b815260040160405180910390fd5b5f62000f40888888885f60745f9054906101000a90046001600160401b0316620030aa565b6001600160401b038381165f81815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b91829004909b1681029a909a17905560068a01805490911690931797870297909717909155600787018054909616909417909455607a54606f549390915290549251635d6717a560e01b81529394506001600160a01b038c811694635d6717a5946200103e9493831693600160581b9004909216916076916077919060040162004e63565b5f604051808303815f87803b15801562001056575f80fd5b505af115801562001069573d5f803e3d5ffd5b50505f805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620010b09050565b60405180910390a15050505050505050505050565b63ffffffff82165f908152608160205260408120620010e59083620032cb565b90505b92915050565b63ffffffff81165f908152608160205260408120620010e8906200330f565b5f8051602062005b1083398151915262001127816200337e565b63ffffffff89165f9081526081602052604090206200114d818a8a8a8a8a8a8a6200338a565b600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b90041615620011b4576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620011ed620024f2565b6040518263ffffffff1660e01b81526004016200120c91815260200190565b5f604051808303815f87803b15801562001224575f80fd5b505af115801562001237573d5f803e3d5ffd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b5f8051602062005b10833981519152620012cf816200337e565b63ffffffff89165f908152608160205260409020620012f5818a8a8a8a8a8a8a62003718565b600681018054600160401b600160801b031916600160401b6001600160401b038a81169182029290921783555f9081526002840160205260409020879055600583018890559054600160801b900416156200135c576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001395620024f2565b6040518263ffffffff1660e01b8152600401620013b491815260200190565b5f604051808303815f87803b158015620013cc575f80fd5b505af1158015620013df573d5f803e3d5ffd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff82165f908152608160205260409020620014715f8051602062005b1083398151915233620020d3565b620014c557606f5460ff16156200149b57604051630bc011ff60e21b815260040160405180910390fd5b620014a78183620032cb565b620014c557604051630674f25160e11b815260040160405180910390fd5b620014d1818362003b17565b505050565b5f8051602062005ad0833981519152620014f0816200337e565b6103e88261ffff1610806200150a57506103ff8261ffff16115b156200152957604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200159b5f8051602062005af083398151915233620020d3565b6200163a57608454600160801b90046001600160401b03161580620015eb57506084544290620015e09062093a8090600160801b90046001600160401b031662004ecb565b6001600160401b0316115b806200161b57506087544290620016109062093a80906001600160401b031662004ecb565b6001600160401b0316115b156200163a5760405163692baaad60e11b815260040160405180910390fd5b6200164462003d02565b565b5f8281526034602052604090206001015462001662816200337e565b620014d1838362003d7c565b6001600160a01b03811633146200169857604051630b4ad1cd60e31b815260040160405180910390fd5b620016a4828262003de7565b5050565b5f8051602062005ad0833981519152620016c2816200337e565b606f5460ff1662001704576084546001600160401b03600160c01b909104811690831610620017045760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19060200162001575565b5f60865460646200176d919062004ef5565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd6200179e816200337e565b63ffffffff82161580620017bd5750607e5463ffffffff908116908316115b15620017dc57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f60205260409020600180820154600160e81b900460ff16151590036200182257604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd0862001898816200337e565b63ffffffff88161580620018b75750607e5463ffffffff908116908916115b15620018d657604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88165f908152607f60205260409020600180820154600160e81b900460ff16151590036200191c57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b0388165f9081526083602052604090205463ffffffff161562001959576040516337c8fe0960e11b815260040160405180910390fd5b608080545f91908290620019739063ffffffff1662004f0f565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b03909216913091620019c09062004669565b620019ce9392919062004f34565b604051809103905ff080158015620019e8573d5f803e3d5ffd5b5090508160835f8c6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508a815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001c4c949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001c8c908d908d9088908e908e908e9060040162004f6a565b5f604051808303815f87803b15801562001ca4575f80fd5b505af115801562001cb7573d5f803e3d5ffd5b50505050505050505050505050505050565b63ffffffff86165f90815260816020526040902060609062001cf090878787878762003e50565b979650505050505050565b606f5460ff161562001d2057604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001d6e92600160c01b90048116911662004ecb565b6001600160401b0316111562001d9757604051638a0704d360e01b815260040160405180910390fd5b6103e862001da6888862004fcc565b6001600160401b0316111562001dcf57604051635acfba9d60e11b815260040160405180910390fd5b62001de1818989898989898962003718565b62001ded818762003f8f565b6085546001600160401b03165f0362001ef457600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562001e67576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001ea0620024f2565b6040518263ffffffff1660e01b815260040162001ebf91815260200190565b5f604051808303815f87803b15801562001ed7575f80fd5b505af115801562001eea573d5f803e3d5ffd5b5050505062001fbd565b62001eff8162004186565b600681018054600160801b90046001600160401b031690601062001f238362004fef565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b900487165f90815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff16156200204157604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602052604090206200206781898989898989896200338a565b6001600160401b0387165f9081526004820160209081526040918290206002015482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620020c862003d02565b505050505050505050565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b81523060048201525f9081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562002164573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200218a91906200500d565b6084549091505f90620021b0906001600160401b03600160401b82048116911662004fcc565b6001600160401b03169050805f03620021cb575f9250505090565b620021d7818362005039565b9250505090565b606f545f9060ff16156200220557604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff16908190036200223c576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f036200226657604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f9081526081602052604081206084805491928792620022989084906001600160401b031662004ecb565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f620022cd878362004ecb565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f95865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200235c8362004186565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b5f8051602062005ad0833981519152620023c4816200337e565b606f5460ff16620023ff576085546001600160401b0390811690831610620023ff5760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759060200162001575565b5f8051602062005ad083398151915262002469816200337e565b62015180826001600160401b031611156200249757604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289060200162001575565b6080545f9063ffffffff168082036200250c57505f919050565b5f816001600160401b0381111562002528576200252862004996565b60405190808252806020026020018201604052801562002552578160200160208202803683370190505b5090505f5b82811015620025c25760815f620025708360016200504f565b63ffffffff1663ffffffff1681526020019081526020015f2060050154828281518110620025a257620025a262005065565b602090810291909101015280620025b98162005079565b91505062002557565b505f60205b836001146200281a575f620025de60028662005094565b620025eb60028762005039565b620025f791906200504f565b90505f816001600160401b0381111562002615576200261562004996565b6040519080825280602002602001820160405280156200263f578160200160208202803683370190505b5090505f5b82811015620027c6576200265a600184620050aa565b811480156200267557506200267160028862005094565b6001145b15620026fd57856200268982600262004ef5565b815181106200269c576200269c62005065565b602002602001015185604051602001620026c0929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620026eb57620026eb62005065565b602002602001018181525050620027b1565b856200270b82600262004ef5565b815181106200271e576200271e62005065565b60200260200101518682600262002736919062004ef5565b620027439060016200504f565b8151811062002756576200275662005065565b602002602001015160405160200162002779929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620027a457620027a462005065565b6020026020010181815250505b80620027bd8162005079565b91505062002644565b508094508195508384604051602001620027ea929190918252602082015260400190565b60405160208183030381529060405280519060200120935082806200280f90620050c0565b9350505050620025c7565b5f835f8151811062002830576200283062005065565b602002602001015190505f5b82811015620028b057604080516020810184905290810185905260600160408051601f19818403018152828252805160209182012090830187905290820186905292506060016040516020818303038152906040528051906020012093508080620028a79062005079565b9150506200283c565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac620028e6816200337e565b63ffffffff84161580620029055750607e5463ffffffff908116908516115b156200292457604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526082602052604081205463ffffffff169081900362002964576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918716600160401b9091046001600160401b031603620029b257604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86165f908152607f60205260409020600180820154600160e81b900460ff1615159003620029f857604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002a3657604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790555f62002ab584620010ee565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002b0b9216908b908b90600401620050d8565b5f604051808303815f87803b15801562002b23575f80fd5b505af115801562002b36573d5f803e3d5ffd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002bbc816200337e565b683635c9adc5dea0000082118062002bd75750633b9aca0082105b1562002bf657604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001575565b5f8281526034602052604090206001015462002c48816200337e565b620014d1838362003de7565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002c80816200337e565b6087805467ffffffffffffffff1916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc16976916004808301925f92919082900301818387803b15801562002cfc575f80fd5b505af115801562002d0f573d5f803e3d5ffd5b5050505062002d1d6200424f565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62002d4c816200337e565b6001600160401b0384165f9081526083602052604090205463ffffffff161562002d89576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b0387165f9081526082602052604090205463ffffffff161562002dc657604051630d409b9360e41b815260040160405180910390fd5b5f62002dd788888888875f620030aa565b5f8080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002e20816200337e565b607e80545f9190829062002e3a9063ffffffff1662004f0f565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff1681526020015f1515815260200185815250607f5f8363ffffffff1663ffffffff1681526020019081526020015f205f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002fd69695949392919062005117565b60405180910390a25050505050505050565b5f54610100900460ff16620016445760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000bfd565b620016a4828262003d7c565b5f82815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080545f9182918290620030c59063ffffffff1662004f0f565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f876001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff16021790555060815f8263ffffffff1663ffffffff1681526020019081526020015f20915087825f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b0316021790555086826001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555084825f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620032b89594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b038281165f90815260048501602052604081205490924292620032fd92918116911662004ecb565b6001600160401b031611159392505050565b60068101545f90600160801b90046001600160401b03161562003361575060068101546001600160401b03600160801b90910481165f9081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002d1d8133620042a7565b60078801545f906001600160401b039081169087161015620033bf5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038816156200345f5760068901546001600160401b03600160801b90910481169089161115620034095760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f90815260048a0160205260409020600281015481549092888116600160401b90920416146200345857604051632bd2e3e760e01b815260040160405180910390fd5b50620034d3565b506001600160401b0385165f9081526002890160205260409020548062003499576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620034d357604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b909104811690881611806200350c5750876001600160401b0316876001600160401b031611155b8062003530575060068901546001600160401b03600160c01b909104811690881611155b156200354f5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260048b016020526040902054600160401b900481169086161462003595576040516332a2a77f60e01b815260040160405180910390fd5b5f620035a68a888888868962003e50565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620035dc91906200516f565b602060405180830381855afa158015620035f8573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200361d91906200500d565b62003629919062005094565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200366d918891906004016200518c565b602060405180830381865afa15801562003689573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620036af9190620051c8565b620036cd576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260048c0160205260409020600201548590036200370b5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b5f80620037258a6200330f565b60078b01549091506001600160401b0390811690891610156200375b5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620037fd5760068a01546001600160401b03600160801b9091048116908a161115620037a55760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a165f90815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620037f657604051632bd2e3e760e01b815260040160405180910390fd5b506200386c565b6001600160401b0388165f90815260028b01602052604090205491508162003838576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200386c57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b0316116200389f5760405163b9b18f5760e01b815260040160405180910390fd5b5f620038b08b8a8a8a878b62003e50565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620038e691906200516f565b602060405180830381855afa15801562003902573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200392791906200500d565b62003933919062005094565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003977918991906004016200518c565b602060405180830381865afa15801562003993573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620039b99190620051c8565b620039d7576040516309bde33960e01b815260040160405180910390fd5b5f620039e4848b62004fcc565b905062003a3d87826001600160401b0316620039ff620020fd565b62003a0b919062004ef5565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620042d1565b80608460088282829054906101000a90046001600160401b031662003a63919062004ecb565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d153906064015f604051808303815f87803b15801562003af1575f80fd5b505af115801562003b04573d5f803e3d5ffd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003b56575060068201546001600160401b03600160801b9091048116908216115b1562003b755760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f81815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003c30620024f2565b6040518263ffffffff1660e01b815260040162003c4f91815260200190565b5f604051808303815f87803b15801562003c67575f80fd5b505af115801562003c7a573d5f803e3d5ffd5b505085546001600160a01b03165f90815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801562003d5b575f80fd5b505af115801562003d6e573d5f803e3d5ffd5b505050506200164462004325565b62003d888282620020d3565b620016a4575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003df38282620020d3565b15620016a4575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086165f818152600389016020526040808220549388168252902054606092911580159062003e85575081155b1562003ea45760405163340c614f60e11b815260040160405180910390fd5b8062003ec3576040516366385b5160e01b815260040160405180910390fd5b62003ece8462004381565b62003eec576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b5f62003f9b836200330f565b9050815f8062003fac848462004fcc565b6085546001600160401b0391821692505f9162003fd291600160401b90041642620050aa565b90505b846001600160401b0316846001600160401b0316146200405b576001600160401b038085165f9081526003890160205260409020600181015490911682101562004036576001810154600160401b90046001600160401b0316945062004054565b62004042868662004fcc565b6001600160401b03169350506200405b565b5062003fd5565b5f620040688484620050aa565b905083811015620040c657808403600c811162004086578062004089565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620040bb57620040bb62005025565b04608655506200413d565b838103600c8111620040d95780620040dc565b600c5b90505f816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162004115576200411562005025565b04905080608654670de0b6b3a7640000028162004136576200413662005025565b0460865550505b683635c9adc5dea0000060865411156200416457683635c9adc5dea000006086556200417c565b633b9aca0060865410156200417c57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002d1d5760068101545f90620041d090600160c01b90046001600160401b0316600162004ecb565b9050620041de8282620032cb565b15620016a45760068201545f906002906200420b908490600160801b90046001600160401b031662004fcc565b620042179190620051e9565b62004223908362004ecb565b9050620042318382620032cb565b156200424357620014d1838262003b17565b620014d1838362003b17565b606f5460ff166200427357604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b620042b38282620020d3565b620016a457604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620014d190849062004405565b606f5460ff16156200434a57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff000000016001600160401b038316108015620043b7575067ffffffff00000001604083901c6001600160401b0316105b8015620043d8575067ffffffff00000001608083901c6001600160401b0316105b8015620043f0575067ffffffff0000000160c083901c105b15620043fe57506001919050565b505f919050565b5f6200445b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620044dd9092919063ffffffff16565b805190915015620014d157808060200190518101906200447c9190620051c8565b620014d15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000bfd565b6060620044ed84845f85620044f5565b949350505050565b606082471015620045585760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000bfd565b5f80866001600160a01b031685876040516200457591906200516f565b5f6040518083038185875af1925050503d805f8114620045b1576040519150601f19603f3d011682016040523d82523d5f602084013e620045b6565b606091505b509150915062001cf08783838760608315620046365782515f036200462e576001600160a01b0385163b6200462e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000bfd565b5081620044ed565b620044ed83838151156200464d5781518083602001fd5b8060405162461bcd60e51b815260040162000bfd919062004bb3565b6108be806200521283390190565b6001600160a01b038116811462002d1d575f80fd5b80356001600160401b038116811462003379575f80fd5b5f805f805f805f805f806101408b8d031215620046be575f80fd5b8a35620046cb8162004677565b9950620046db60208c016200468c565b9850620046eb60408c016200468c565b975060608b0135620046fd8162004677565b965060808b01356200470f8162004677565b955060a08b0135620047218162004677565b945060c08b0135620047338162004677565b935060e08b0135620047458162004677565b9250620047566101008c016200468c565b9150620047676101208c016200468c565b90509295989b9194979a5092959850565b803563ffffffff8116811462003379575f80fd5b5f80604083850312156200479e575f80fd5b620047a98362004778565b9150620047b9602084016200468c565b90509250929050565b5f60208284031215620047d3575f80fd5b620010e58262004778565b806103008101831015620010e8575f80fd5b5f805f805f805f806103e0898b03121562004809575f80fd5b620048148962004778565b97506200482460208a016200468c565b96506200483460408a016200468c565b95506200484460608a016200468c565b94506200485460808a016200468c565b935060a0890135925060c08901359150620048738a60e08b01620047de565b90509295985092959890939650565b5f805f805f805f806103e0898b0312156200489b575f80fd5b620048a68962004778565b9750620048b660208a016200468c565b9650620048c660408a016200468c565b9550620048d660608a016200468c565b94506080890135935060a0890135925060c0890135620048f68162004677565b9150620048738a60e08b01620047de565b5f6020828403121562004918575f80fd5b813561ffff811681146200492a575f80fd5b9392505050565b5f6020828403121562004942575f80fd5b5035919050565b5f80604083850312156200495b575f80fd5b8235915060208301356200496f8162004677565b809150509250929050565b5f602082840312156200498b575f80fd5b620010e5826200468c565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620049ba575f80fd5b81356001600160401b0380821115620049d757620049d762004996565b604051601f8301601f19908116603f0116810190828211818310171562004a025762004a0262004996565b8160405283815286602085880101111562004a1b575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a03121562004a51575f80fd5b62004a5c8862004778565b965062004a6c602089016200468c565b9550604088013562004a7e8162004677565b9450606088013562004a908162004677565b9350608088013562004aa28162004677565b925060a08801356001600160401b038082111562004abe575f80fd5b62004acc8b838c01620049aa565b935060c08a013591508082111562004ae2575f80fd5b5062004af18a828b01620049aa565b91505092959891949750929550565b5f805f805f8060c0878903121562004b16575f80fd5b62004b218762004778565b955062004b31602088016200468c565b945062004b41604088016200468c565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b8381101562004b7e57818101518382015260200162004b64565b50505f910152565b5f815180845262004b9f81602086016020860162004b62565b601f01601f19169290920160200192915050565b602081525f620010e5602083018462004b86565b5f806040838503121562004bd9575f80fd5b62004be4836200468c565b946020939093013593505050565b5f805f806060858703121562004c06575f80fd5b843562004c138162004677565b935062004c236020860162004778565b925060408501356001600160401b038082111562004c3f575f80fd5b818701915087601f83011262004c53575f80fd5b81358181111562004c62575f80fd5b88602082850101111562004c74575f80fd5b95989497505060200194505050565b5f6020828403121562004c94575f80fd5b81356200492a8162004677565b803560ff8116811462003379575f80fd5b5f805f805f8060c0878903121562004cc8575f80fd5b863562004cd58162004677565b9550602087013562004ce78162004677565b945062004cf7604088016200468c565b935062004d07606088016200468c565b92506080870135915062004d1e60a0880162004ca1565b90509295509295509295565b5f805f805f8060c0878903121562004d40575f80fd5b863562004d4d8162004677565b9550602087013562004d5f8162004677565b945062004d6f604088016200468c565b935062004d7f6060880162004ca1565b92506080870135915060a08701356001600160401b0381111562004da1575f80fd5b62004daf89828a01620049aa565b9150509295509295509295565b80545f90600181811c908083168062004dd657607f831692505b6020808410820362004df657634e487b7160e01b5f52602260045260245ffd5b8388526020880182801562004e14576001811462004e2b5762004e56565b60ff198716825285151560051b8201975062004e56565b5f898152602090205f5b8781101562004e505781548482015290860190840162004e35565b83019850505b5050505050505092915050565b6001600160a01b0386811682528516602082015260a0604082018190525f9062004e909083018662004dbc565b828103606084015262004ea4818662004dbc565b9150508260808301529695505050505050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111562004eee5762004eee62004eb7565b5092915050565b8082028115828204841417620010e857620010e862004eb7565b5f63ffffffff80831681810362004f2a5762004f2a62004eb7565b6001019392505050565b6001600160a01b038481168252831660208201526060604082018190525f9062004f619083018462004b86565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190525f9062004fab9083018562004b86565b82810360a084015262004fbf818562004b86565b9998505050505050505050565b6001600160401b0382811682821603908082111562004eee5762004eee62004eb7565b5f6001600160401b0380831681810362004f2a5762004f2a62004eb7565b5f602082840312156200501e575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f826200504a576200504a62005025565b500490565b80820180821115620010e857620010e862004eb7565b634e487b7160e01b5f52603260045260245ffd5b5f600182016200508d576200508d62004eb7565b5060010190565b5f82620050a557620050a562005025565b500690565b81810381811115620010e857620010e862004eb7565b5f81620050d157620050d162004eb7565b505f190190565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190525f90620051639083018462004b86565b98975050505050505050565b5f82516200518281846020870162004b62565b9190910192915050565b6103208101610300808584378201835f5b6001811015620051be5781518352602092830192909101906001016200519d565b5050509392505050565b5f60208284031215620051d9575f80fd5b815180151581146200492a575f80fd5b5f6001600160401b038084168062005205576200520562005025565b9216919091049291505056fe60a0604052604051620008be380380620008be8339810160408190526100249161034d565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b6565b505050610432565b61006182610124565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100aa576100a582826101a2565b505050565b6100b2610215565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f65f805160206200089e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161012181610236565b50565b806001600160a01b03163b5f0361015e57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516101be9190610417565b5f60405180830381855af49150503d805f81146101f6576040519150601f19603f3d011682016040523d82523d5f602084013e6101fb565b606091505b50909250905061020c858383610274565b95945050505050565b34156102345760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661025f57604051633173bdd160e11b81525f6004820152602401610155565b805f805160206200089e833981519152610181565b60608261028957610284826102d3565b6102cc565b81511580156102a057506001600160a01b0384163b155b156102c957604051639996b31560e01b81526001600160a01b0385166004820152602401610155565b50805b9392505050565b8051156102e35780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b0381168114610312575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561034557818101518382015260200161032d565b50505f910152565b5f805f6060848603121561035f575f80fd5b610368846102fc565b9250610376602085016102fc565b60408501519092506001600160401b0380821115610392575f80fd5b818601915086601f8301126103a5575f80fd5b8151818111156103b7576103b7610317565b604051601f8201601f19908116603f011681019083821181831017156103df576103df610317565b816040528281528960208487010111156103f7575f80fd5b61040883602083016020880161032b565b80955050505050509250925092565b5f825161042881846020870161032b565b9190910192915050565b6080516104546200044a5f395f601001526104545ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610069575f356001600160e01b03191663278f794360e11b146100615761005f61006d565b565b61005f61007d565b61005f5b61005f6100786100ab565b6100e2565b5f8061008c36600481846102ee565b8101906100999190610329565b915091506100a78282610100565b5050565b5f6100dd7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156100fc573d5ff35b3d5ffd5b6101098261015a565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101525761014d82826101d5565b505050565b6100a7610247565b806001600160a01b03163b5f0361019457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101f191906103f2565b5f60405180830381855af49150503d805f8114610229576040519150601f19603f3d011682016040523d82523d5f602084013e61022e565b606091505b509150915061023e858383610266565b95945050505050565b341561005f5760405163b398979f60e01b815260040160405180910390fd5b60608261027b57610276826102c5565b6102be565b815115801561029257506001600160a01b0384163b155b156102bb57604051639996b31560e01b81526001600160a01b038516600482015260240161018b565b50805b9392505050565b8051156102d55780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f80858511156102fc575f80fd5b83861115610308575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561033a575f80fd5b82356001600160a01b0381168114610350575f80fd5b9150602083013567ffffffffffffffff8082111561036c575f80fd5b818501915085601f83011261037f575f80fd5b81358181111561039157610391610315565b604051601f8201601f19908116603f011681019083821181831017156103b9576103b9610315565b816040528281528860208487010111156103d1575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b8181101561041157602081860181015185830152016103f7565b505f92019182525091905056fea2646970667358221220c3817d11eb3dc87723342527d38da55b7b3b362f54567f56cf1ef4db2f8a430664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220f5b4edeecd967c55e442ebe839120ce9697fb5df4a4e12b411001a0a4195e48964736f6c63430008140033", + "deployedBytecode": "0x608060405234801562000010575f80fd5b50600436106200030c575f3560e01c8063841b24d711620001a3578063c1acbc3411620000f3578063dbc16976116200009b578063dbc1697614620009da578063dde0ff7714620009e4578063e0bfd3d214620009ff578063e46761c41462000a16578063f34eb8eb1462000a3e578063f4e926751462000a55578063f9c4c2ae1462000a66575f80fd5b8063c1acbc341462000916578063c4c928c21462000931578063ceee281d1462000948578063d02103ca1462000970578063d5073f6f1462000998578063d547741f14620009af578063d939b31514620009c6575f80fd5b80639c9f3dfe11620001575780639c9f3dfe1462000791578063a066215c14620007a8578063a217fddf14620007bf578063a2967d9914620007c7578063a3c573eb14620007d1578063afd23cbe1462000812578063b99d0ad7146200083c575f80fd5b8063841b24d7146200071057806387c20c01146200072b5780638bd4f071146200074257806391d14854146200075957806399f5634e14620007705780639a908e73146200077a575f80fd5b806325280169116200025f57806355a71ee0116200021357806355a71ee014620005995780636046916914620005dc57806365c0504d14620005e65780637222020f1462000694578063727885e914620006ab5780637975fcfe14620006c25780637fb6e76a14620006e8575f80fd5b80632528016914620004835780632f2ff15d146200053757806330c27dde146200054e57806336568abe1462000562578063394218e91462000579578063477fa2701462000590575f80fd5b80631489ed1011620002c35780631489ed1014620003cb57806315064c9614620003e25780631608859c14620003f05780631796a1ae14620004075780631816b7e5146200042e5780632072f6c51462000445578063248a9ca3146200044f575f80fd5b80630645af091462000310578063066ec0121462000329578063080b3111146200035a5780630a0d9fbe146200038257806311f6b287146200039d57806312b86e1914620003b4575b5f80fd5b6200032762000321366004620046a3565b62000b7c565b005b6084546200033d906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b620003716200036b3660046200478c565b620010c5565b604051901515815260200162000351565b6085546200033d90600160401b90046001600160401b031681565b6200033d620003ae366004620047c2565b620010ee565b62000327620003c5366004620047f0565b6200110d565b62000327620003dc36600462004882565b620012b5565b606f54620003719060ff1681565b62000327620004013660046200478c565b62001443565b607e54620004189063ffffffff1681565b60405163ffffffff909116815260200162000351565b620003276200043f36600462004907565b620014d6565b6200032762001581565b620004746200046036600462004931565b5f9081526034602052604090206001015490565b60405190815260200162000351565b62000503620004943660046200478c565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b0390811691830191909152928201519092169082015260600162000351565b620003276200054836600462004949565b62001646565b6087546200033d906001600160401b031681565b620003276200057336600462004949565b6200166e565b620003276200058a3660046200497a565b620016a8565b60865462000474565b62000474620005aa3660046200478c565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620004746200175b565b6200064a620005f7366004620047c2565b607f6020525f90815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c00162000351565b62000327620006a5366004620047c2565b62001772565b62000327620006bc36600462004a3a565b6200186c565b620006d9620006d336600462004b00565b62001cc9565b60405162000351919062004bb3565b62000418620006f93660046200497a565b60836020525f908152604090205463ffffffff1681565b6084546200033d90600160c01b90046001600160401b031681565b620003276200073c36600462004882565b62001cfb565b6200032762000753366004620047f0565b6200201c565b620003716200076a36600462004949565b620020d3565b62000474620020fd565b6200033d6200078b36600462004bc7565b620021de565b62000327620007a23660046200497a565b620023aa565b62000327620007b93660046200497a565b6200244f565b620004745f81565b62000474620024f2565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200162000351565b6085546200082890600160801b900461ffff1681565b60405161ffff909116815260200162000351565b620008d16200084d3660046200478c565b60408051608080820183525f8083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b6040516200035191905f6080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200033d90600160801b90046001600160401b031681565b620003276200094236600462004bf2565b620028ba565b620004186200095936600462004c83565b60826020525f908152604090205463ffffffff1681565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b62000327620009a936600462004931565b62002b90565b62000327620009c036600462004949565b62002c2c565b6085546200033d906001600160401b031681565b6200032762002c54565b6084546200033d90600160401b90046001600160401b031681565b6200032762000a1036600462004cb2565b62002d20565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b6200032762000a4f36600462004d2a565b62002df4565b608054620004189063ffffffff1681565b62000afc62000a77366004620047c2565b60816020525f9081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff166101608201526101800162000351565b5f54600290610100900460ff1615801562000b9d57505f5460ff8083169116105b62000c065760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c8662002fe8565b62000ca05f8051602062005b108339815191528c62003054565b62000cac5f8862003054565b62000cd87fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908862003054565b62000d047f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8862003054565b62000d307f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8862003054565b62000d5c7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8962003054565b62000d887fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088962003054565b62000db47f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48962003054565b62000dce5f8051602062005ad08339815191528962003054565b62000e085f8051602062005b108339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062003060565b62000e347f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08962003054565b62000e607f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8962003054565b62000e9a5f8051602062005af08339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162003060565b62000eb45f8051602062005af08339815191528762003054565b62000ee07f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518762003054565b6073546074546001600160401b03600160401b9092048216911680821462000f1b57604051632e4cc54360e11b815260040160405180910390fd5b5f62000f40888888885f60745f9054906101000a90046001600160401b0316620030aa565b6001600160401b038381165f81815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b91829004909b1681029a909a17905560068a01805490911690931797870297909717909155600787018054909616909417909455607a54606f549390915290549251635d6717a560e01b81529394506001600160a01b038c811694635d6717a5946200103e9493831693600160581b9004909216916076916077919060040162004e63565b5f604051808303815f87803b15801562001056575f80fd5b505af115801562001069573d5f803e3d5ffd5b50505f805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620010b09050565b60405180910390a15050505050505050505050565b63ffffffff82165f908152608160205260408120620010e59083620032cb565b90505b92915050565b63ffffffff81165f908152608160205260408120620010e8906200330f565b5f8051602062005b1083398151915262001127816200337e565b63ffffffff89165f9081526081602052604090206200114d818a8a8a8a8a8a8a6200338a565b600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b90041615620011b4576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620011ed620024f2565b6040518263ffffffff1660e01b81526004016200120c91815260200190565b5f604051808303815f87803b15801562001224575f80fd5b505af115801562001237573d5f803e3d5ffd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b5f8051602062005b10833981519152620012cf816200337e565b63ffffffff89165f908152608160205260409020620012f5818a8a8a8a8a8a8a62003718565b600681018054600160401b600160801b031916600160401b6001600160401b038a81169182029290921783555f9081526002840160205260409020879055600583018890559054600160801b900416156200135c576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001395620024f2565b6040518263ffffffff1660e01b8152600401620013b491815260200190565b5f604051808303815f87803b158015620013cc575f80fd5b505af1158015620013df573d5f803e3d5ffd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff82165f908152608160205260409020620014715f8051602062005b1083398151915233620020d3565b620014c557606f5460ff16156200149b57604051630bc011ff60e21b815260040160405180910390fd5b620014a78183620032cb565b620014c557604051630674f25160e11b815260040160405180910390fd5b620014d1818362003b17565b505050565b5f8051602062005ad0833981519152620014f0816200337e565b6103e88261ffff1610806200150a57506103ff8261ffff16115b156200152957604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200159b5f8051602062005af083398151915233620020d3565b6200163a57608454600160801b90046001600160401b03161580620015eb57506084544290620015e09062093a8090600160801b90046001600160401b031662004ecb565b6001600160401b0316115b806200161b57506087544290620016109062093a80906001600160401b031662004ecb565b6001600160401b0316115b156200163a5760405163692baaad60e11b815260040160405180910390fd5b6200164462003d02565b565b5f8281526034602052604090206001015462001662816200337e565b620014d1838362003d7c565b6001600160a01b03811633146200169857604051630b4ad1cd60e31b815260040160405180910390fd5b620016a4828262003de7565b5050565b5f8051602062005ad0833981519152620016c2816200337e565b606f5460ff1662001704576084546001600160401b03600160c01b909104811690831610620017045760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19060200162001575565b5f60865460646200176d919062004ef5565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd6200179e816200337e565b63ffffffff82161580620017bd5750607e5463ffffffff908116908316115b15620017dc57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f60205260409020600180820154600160e81b900460ff16151590036200182257604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd0862001898816200337e565b63ffffffff88161580620018b75750607e5463ffffffff908116908916115b15620018d657604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88165f908152607f60205260409020600180820154600160e81b900460ff16151590036200191c57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b0388165f9081526083602052604090205463ffffffff161562001959576040516337c8fe0960e11b815260040160405180910390fd5b608080545f91908290620019739063ffffffff1662004f0f565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b03909216913091620019c09062004669565b620019ce9392919062004f34565b604051809103905ff080158015620019e8573d5f803e3d5ffd5b5090508160835f8c6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508a815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001c4c949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001c8c908d908d9088908e908e908e9060040162004f6a565b5f604051808303815f87803b15801562001ca4575f80fd5b505af115801562001cb7573d5f803e3d5ffd5b50505050505050505050505050505050565b63ffffffff86165f90815260816020526040902060609062001cf090878787878762003e50565b979650505050505050565b606f5460ff161562001d2057604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001d6e92600160c01b90048116911662004ecb565b6001600160401b0316111562001d9757604051638a0704d360e01b815260040160405180910390fd5b6103e862001da6888862004fcc565b6001600160401b0316111562001dcf57604051635acfba9d60e11b815260040160405180910390fd5b62001de1818989898989898962003718565b62001ded818762003f8f565b6085546001600160401b03165f0362001ef457600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562001e67576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001ea0620024f2565b6040518263ffffffff1660e01b815260040162001ebf91815260200190565b5f604051808303815f87803b15801562001ed7575f80fd5b505af115801562001eea573d5f803e3d5ffd5b5050505062001fbd565b62001eff8162004186565b600681018054600160801b90046001600160401b031690601062001f238362004fef565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b900487165f90815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff16156200204157604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602052604090206200206781898989898989896200338a565b6001600160401b0387165f9081526004820160209081526040918290206002015482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620020c862003d02565b505050505050505050565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b81523060048201525f9081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562002164573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200218a91906200500d565b6084549091505f90620021b0906001600160401b03600160401b82048116911662004fcc565b6001600160401b03169050805f03620021cb575f9250505090565b620021d7818362005039565b9250505090565b606f545f9060ff16156200220557604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff16908190036200223c576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f036200226657604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f9081526081602052604081206084805491928792620022989084906001600160401b031662004ecb565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f620022cd878362004ecb565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f95865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b0319909216929093169190911717905590506200235c8362004186565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b5f8051602062005ad0833981519152620023c4816200337e565b606f5460ff16620023ff576085546001600160401b0390811690831610620023ff5760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759060200162001575565b5f8051602062005ad083398151915262002469816200337e565b62015180826001600160401b031611156200249757604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289060200162001575565b6080545f9063ffffffff168082036200250c57505f919050565b5f816001600160401b0381111562002528576200252862004996565b60405190808252806020026020018201604052801562002552578160200160208202803683370190505b5090505f5b82811015620025c25760815f620025708360016200504f565b63ffffffff1663ffffffff1681526020019081526020015f2060050154828281518110620025a257620025a262005065565b602090810291909101015280620025b98162005079565b91505062002557565b505f60205b836001146200281a575f620025de60028662005094565b620025eb60028762005039565b620025f791906200504f565b90505f816001600160401b0381111562002615576200261562004996565b6040519080825280602002602001820160405280156200263f578160200160208202803683370190505b5090505f5b82811015620027c6576200265a600184620050aa565b811480156200267557506200267160028862005094565b6001145b15620026fd57856200268982600262004ef5565b815181106200269c576200269c62005065565b602002602001015185604051602001620026c0929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620026eb57620026eb62005065565b602002602001018181525050620027b1565b856200270b82600262004ef5565b815181106200271e576200271e62005065565b60200260200101518682600262002736919062004ef5565b620027439060016200504f565b8151811062002756576200275662005065565b602002602001015160405160200162002779929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620027a457620027a462005065565b6020026020010181815250505b80620027bd8162005079565b91505062002644565b508094508195508384604051602001620027ea929190918252602082015260400190565b60405160208183030381529060405280519060200120935082806200280f90620050c0565b9350505050620025c7565b5f835f8151811062002830576200283062005065565b602002602001015190505f5b82811015620028b057604080516020810184905290810185905260600160408051601f19818403018152828252805160209182012090830187905290820186905292506060016040516020818303038152906040528051906020012093508080620028a79062005079565b9150506200283c565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac620028e6816200337e565b63ffffffff84161580620029055750607e5463ffffffff908116908516115b156200292457604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526082602052604081205463ffffffff169081900362002964576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918716600160401b9091046001600160401b031603620029b257604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86165f908152607f60205260409020600180820154600160e81b900460ff1615159003620029f857604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002a3657604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790555f62002ab584620010ee565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002b0b9216908b908b90600401620050d8565b5f604051808303815f87803b15801562002b23575f80fd5b505af115801562002b36573d5f803e3d5ffd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002bbc816200337e565b683635c9adc5dea0000082118062002bd75750633b9aca0082105b1562002bf657604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001575565b5f8281526034602052604090206001015462002c48816200337e565b620014d1838362003de7565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002c80816200337e565b6087805467ffffffffffffffff1916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc16976916004808301925f92919082900301818387803b15801562002cfc575f80fd5b505af115801562002d0f573d5f803e3d5ffd5b5050505062002d1d6200424f565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62002d4c816200337e565b6001600160401b0384165f9081526083602052604090205463ffffffff161562002d89576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b0387165f9081526082602052604090205463ffffffff161562002dc657604051630d409b9360e41b815260040160405180910390fd5b5f62002dd788888888875f620030aa565b5f8080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002e20816200337e565b607e80545f9190829062002e3a9063ffffffff1662004f0f565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff1681526020015f1515815260200185815250607f5f8363ffffffff1663ffffffff1681526020019081526020015f205f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002fd69695949392919062005117565b60405180910390a25050505050505050565b5f54610100900460ff16620016445760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000bfd565b620016a4828262003d7c565b5f82815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080545f9182918290620030c59063ffffffff1662004f0f565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f876001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff16021790555060815f8263ffffffff1663ffffffff1681526020019081526020015f20915087825f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b0316021790555086826001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555084825f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620032b89594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b038281165f90815260048501602052604081205490924292620032fd92918116911662004ecb565b6001600160401b031611159392505050565b60068101545f90600160801b90046001600160401b03161562003361575060068101546001600160401b03600160801b90910481165f9081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002d1d8133620042a7565b60078801545f906001600160401b039081169087161015620033bf5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038816156200345f5760068901546001600160401b03600160801b90910481169089161115620034095760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f90815260048a0160205260409020600281015481549092888116600160401b90920416146200345857604051632bd2e3e760e01b815260040160405180910390fd5b50620034d3565b506001600160401b0385165f9081526002890160205260409020548062003499576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620034d357604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b909104811690881611806200350c5750876001600160401b0316876001600160401b031611155b8062003530575060068901546001600160401b03600160c01b909104811690881611155b156200354f5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260048b016020526040902054600160401b900481169086161462003595576040516332a2a77f60e01b815260040160405180910390fd5b5f620035a68a888888868962003e50565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620035dc91906200516f565b602060405180830381855afa158015620035f8573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200361d91906200500d565b62003629919062005094565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200366d918891906004016200518c565b602060405180830381865afa15801562003689573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620036af9190620051c8565b620036cd576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260048c0160205260409020600201548590036200370b5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b5f80620037258a6200330f565b60078b01549091506001600160401b0390811690891610156200375b5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620037fd5760068a01546001600160401b03600160801b9091048116908a161115620037a55760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a165f90815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620037f657604051632bd2e3e760e01b815260040160405180910390fd5b506200386c565b6001600160401b0388165f90815260028b01602052604090205491508162003838576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200386c57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b0316116200389f5760405163b9b18f5760e01b815260040160405180910390fd5b5f620038b08b8a8a8a878b62003e50565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620038e691906200516f565b602060405180830381855afa15801562003902573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200392791906200500d565b62003933919062005094565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003977918991906004016200518c565b602060405180830381865afa15801562003993573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620039b99190620051c8565b620039d7576040516309bde33960e01b815260040160405180910390fd5b5f620039e4848b62004fcc565b905062003a3d87826001600160401b0316620039ff620020fd565b62003a0b919062004ef5565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620042d1565b80608460088282829054906101000a90046001600160401b031662003a63919062004ecb565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d153906064015f604051808303815f87803b15801562003af1575f80fd5b505af115801562003b04573d5f803e3d5ffd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003b56575060068201546001600160401b03600160801b9091048116908216115b1562003b755760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f81815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003c30620024f2565b6040518263ffffffff1660e01b815260040162003c4f91815260200190565b5f604051808303815f87803b15801562003c67575f80fd5b505af115801562003c7a573d5f803e3d5ffd5b505085546001600160a01b03165f90815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801562003d5b575f80fd5b505af115801562003d6e573d5f803e3d5ffd5b505050506200164462004325565b62003d888282620020d3565b620016a4575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003df38282620020d3565b15620016a4575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086165f818152600389016020526040808220549388168252902054606092911580159062003e85575081155b1562003ea45760405163340c614f60e11b815260040160405180910390fd5b8062003ec3576040516366385b5160e01b815260040160405180910390fd5b62003ece8462004381565b62003eec576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b5f62003f9b836200330f565b9050815f8062003fac848462004fcc565b6085546001600160401b0391821692505f9162003fd291600160401b90041642620050aa565b90505b846001600160401b0316846001600160401b0316146200405b576001600160401b038085165f9081526003890160205260409020600181015490911682101562004036576001810154600160401b90046001600160401b0316945062004054565b62004042868662004fcc565b6001600160401b03169350506200405b565b5062003fd5565b5f620040688484620050aa565b905083811015620040c657808403600c811162004086578062004089565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620040bb57620040bb62005025565b04608655506200413d565b838103600c8111620040d95780620040dc565b600c5b90505f816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162004115576200411562005025565b04905080608654670de0b6b3a7640000028162004136576200413662005025565b0460865550505b683635c9adc5dea0000060865411156200416457683635c9adc5dea000006086556200417c565b633b9aca0060865410156200417c57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002d1d5760068101545f90620041d090600160c01b90046001600160401b0316600162004ecb565b9050620041de8282620032cb565b15620016a45760068201545f906002906200420b908490600160801b90046001600160401b031662004fcc565b620042179190620051e9565b62004223908362004ecb565b9050620042318382620032cb565b156200424357620014d1838262003b17565b620014d1838362003b17565b606f5460ff166200427357604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b620042b38282620020d3565b620016a457604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620014d190849062004405565b606f5460ff16156200434a57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff000000016001600160401b038316108015620043b7575067ffffffff00000001604083901c6001600160401b0316105b8015620043d8575067ffffffff00000001608083901c6001600160401b0316105b8015620043f0575067ffffffff0000000160c083901c105b15620043fe57506001919050565b505f919050565b5f6200445b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620044dd9092919063ffffffff16565b805190915015620014d157808060200190518101906200447c9190620051c8565b620014d15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000bfd565b6060620044ed84845f85620044f5565b949350505050565b606082471015620045585760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000bfd565b5f80866001600160a01b031685876040516200457591906200516f565b5f6040518083038185875af1925050503d805f8114620045b1576040519150601f19603f3d011682016040523d82523d5f602084013e620045b6565b606091505b509150915062001cf08783838760608315620046365782515f036200462e576001600160a01b0385163b6200462e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000bfd565b5081620044ed565b620044ed83838151156200464d5781518083602001fd5b8060405162461bcd60e51b815260040162000bfd919062004bb3565b6108be806200521283390190565b6001600160a01b038116811462002d1d575f80fd5b80356001600160401b038116811462003379575f80fd5b5f805f805f805f805f806101408b8d031215620046be575f80fd5b8a35620046cb8162004677565b9950620046db60208c016200468c565b9850620046eb60408c016200468c565b975060608b0135620046fd8162004677565b965060808b01356200470f8162004677565b955060a08b0135620047218162004677565b945060c08b0135620047338162004677565b935060e08b0135620047458162004677565b9250620047566101008c016200468c565b9150620047676101208c016200468c565b90509295989b9194979a5092959850565b803563ffffffff8116811462003379575f80fd5b5f80604083850312156200479e575f80fd5b620047a98362004778565b9150620047b9602084016200468c565b90509250929050565b5f60208284031215620047d3575f80fd5b620010e58262004778565b806103008101831015620010e8575f80fd5b5f805f805f805f806103e0898b03121562004809575f80fd5b620048148962004778565b97506200482460208a016200468c565b96506200483460408a016200468c565b95506200484460608a016200468c565b94506200485460808a016200468c565b935060a0890135925060c08901359150620048738a60e08b01620047de565b90509295985092959890939650565b5f805f805f805f806103e0898b0312156200489b575f80fd5b620048a68962004778565b9750620048b660208a016200468c565b9650620048c660408a016200468c565b9550620048d660608a016200468c565b94506080890135935060a0890135925060c0890135620048f68162004677565b9150620048738a60e08b01620047de565b5f6020828403121562004918575f80fd5b813561ffff811681146200492a575f80fd5b9392505050565b5f6020828403121562004942575f80fd5b5035919050565b5f80604083850312156200495b575f80fd5b8235915060208301356200496f8162004677565b809150509250929050565b5f602082840312156200498b575f80fd5b620010e5826200468c565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620049ba575f80fd5b81356001600160401b0380821115620049d757620049d762004996565b604051601f8301601f19908116603f0116810190828211818310171562004a025762004a0262004996565b8160405283815286602085880101111562004a1b575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a03121562004a51575f80fd5b62004a5c8862004778565b965062004a6c602089016200468c565b9550604088013562004a7e8162004677565b9450606088013562004a908162004677565b9350608088013562004aa28162004677565b925060a08801356001600160401b038082111562004abe575f80fd5b62004acc8b838c01620049aa565b935060c08a013591508082111562004ae2575f80fd5b5062004af18a828b01620049aa565b91505092959891949750929550565b5f805f805f8060c0878903121562004b16575f80fd5b62004b218762004778565b955062004b31602088016200468c565b945062004b41604088016200468c565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b8381101562004b7e57818101518382015260200162004b64565b50505f910152565b5f815180845262004b9f81602086016020860162004b62565b601f01601f19169290920160200192915050565b602081525f620010e5602083018462004b86565b5f806040838503121562004bd9575f80fd5b62004be4836200468c565b946020939093013593505050565b5f805f806060858703121562004c06575f80fd5b843562004c138162004677565b935062004c236020860162004778565b925060408501356001600160401b038082111562004c3f575f80fd5b818701915087601f83011262004c53575f80fd5b81358181111562004c62575f80fd5b88602082850101111562004c74575f80fd5b95989497505060200194505050565b5f6020828403121562004c94575f80fd5b81356200492a8162004677565b803560ff8116811462003379575f80fd5b5f805f805f8060c0878903121562004cc8575f80fd5b863562004cd58162004677565b9550602087013562004ce78162004677565b945062004cf7604088016200468c565b935062004d07606088016200468c565b92506080870135915062004d1e60a0880162004ca1565b90509295509295509295565b5f805f805f8060c0878903121562004d40575f80fd5b863562004d4d8162004677565b9550602087013562004d5f8162004677565b945062004d6f604088016200468c565b935062004d7f6060880162004ca1565b92506080870135915060a08701356001600160401b0381111562004da1575f80fd5b62004daf89828a01620049aa565b9150509295509295509295565b80545f90600181811c908083168062004dd657607f831692505b6020808410820362004df657634e487b7160e01b5f52602260045260245ffd5b8388526020880182801562004e14576001811462004e2b5762004e56565b60ff198716825285151560051b8201975062004e56565b5f898152602090205f5b8781101562004e505781548482015290860190840162004e35565b83019850505b5050505050505092915050565b6001600160a01b0386811682528516602082015260a0604082018190525f9062004e909083018662004dbc565b828103606084015262004ea4818662004dbc565b9150508260808301529695505050505050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111562004eee5762004eee62004eb7565b5092915050565b8082028115828204841417620010e857620010e862004eb7565b5f63ffffffff80831681810362004f2a5762004f2a62004eb7565b6001019392505050565b6001600160a01b038481168252831660208201526060604082018190525f9062004f619083018462004b86565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190525f9062004fab9083018562004b86565b82810360a084015262004fbf818562004b86565b9998505050505050505050565b6001600160401b0382811682821603908082111562004eee5762004eee62004eb7565b5f6001600160401b0380831681810362004f2a5762004f2a62004eb7565b5f602082840312156200501e575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f826200504a576200504a62005025565b500490565b80820180821115620010e857620010e862004eb7565b634e487b7160e01b5f52603260045260245ffd5b5f600182016200508d576200508d62004eb7565b5060010190565b5f82620050a557620050a562005025565b500690565b81810381811115620010e857620010e862004eb7565b5f81620050d157620050d162004eb7565b505f190190565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190525f90620051639083018462004b86565b98975050505050505050565b5f82516200518281846020870162004b62565b9190910192915050565b6103208101610300808584378201835f5b6001811015620051be5781518352602092830192909101906001016200519d565b5050509392505050565b5f60208284031215620051d9575f80fd5b815180151581146200492a575f80fd5b5f6001600160401b038084168062005205576200520562005025565b9216919091049291505056fe60a0604052604051620008be380380620008be8339810160408190526100249161034d565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b6565b505050610432565b61006182610124565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100aa576100a582826101a2565b505050565b6100b2610215565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f65f805160206200089e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161012181610236565b50565b806001600160a01b03163b5f0361015e57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516101be9190610417565b5f60405180830381855af49150503d805f81146101f6576040519150601f19603f3d011682016040523d82523d5f602084013e6101fb565b606091505b50909250905061020c858383610274565b95945050505050565b34156102345760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661025f57604051633173bdd160e11b81525f6004820152602401610155565b805f805160206200089e833981519152610181565b60608261028957610284826102d3565b6102cc565b81511580156102a057506001600160a01b0384163b155b156102c957604051639996b31560e01b81526001600160a01b0385166004820152602401610155565b50805b9392505050565b8051156102e35780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b0381168114610312575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561034557818101518382015260200161032d565b50505f910152565b5f805f6060848603121561035f575f80fd5b610368846102fc565b9250610376602085016102fc565b60408501519092506001600160401b0380821115610392575f80fd5b818601915086601f8301126103a5575f80fd5b8151818111156103b7576103b7610317565b604051601f8201601f19908116603f011681019083821181831017156103df576103df610317565b816040528281528960208487010111156103f7575f80fd5b61040883602083016020880161032b565b80955050505050509250925092565b5f825161042881846020870161032b565b9190910192915050565b6080516104546200044a5f395f601001526104545ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610069575f356001600160e01b03191663278f794360e11b146100615761005f61006d565b565b61005f61007d565b61005f5b61005f6100786100ab565b6100e2565b5f8061008c36600481846102ee565b8101906100999190610329565b915091506100a78282610100565b5050565b5f6100dd7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156100fc573d5ff35b3d5ffd5b6101098261015a565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101525761014d82826101d5565b505050565b6100a7610247565b806001600160a01b03163b5f0361019457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101f191906103f2565b5f60405180830381855af49150503d805f8114610229576040519150601f19603f3d011682016040523d82523d5f602084013e61022e565b606091505b509150915061023e858383610266565b95945050505050565b341561005f5760405163b398979f60e01b815260040160405180910390fd5b60608261027b57610276826102c5565b6102be565b815115801561029257506001600160a01b0384163b155b156102bb57604051639996b31560e01b81526001600160a01b038516600482015260240161018b565b50805b9392505050565b8051156102d55780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f80858511156102fc575f80fd5b83861115610308575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561033a575f80fd5b82356001600160a01b0381168114610350575f80fd5b9150602083013567ffffffffffffffff8082111561036c575f80fd5b818501915085601f83011261037f575f80fd5b81358181111561039157610391610315565b604051601f8201601f19908116603f011681019083821181831017156103b9576103b9610315565b816040528281528860208487010111156103d1575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b8181101561041157602081860181015185830152016103f7565b505f92019182525091905056fea2646970667358221220c3817d11eb3dc87723342527d38da55b7b3b362f54567f56cf1ef4db2f8a430664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220f5b4edeecd967c55e442ebe839120ce9697fb5df4a4e12b411001a0a4195e48964736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonRollupManagerMock.json b/compiled-contracts/PolygonRollupManagerMock.json index 9b644e974..759091702 100644 --- a/compiled-contracts/PolygonRollupManagerMock.json +++ b/compiled-contracts/PolygonRollupManagerMock.json @@ -2016,8 +2016,8 @@ "type": "function" } ], - "bytecode": "0x60e060405234801562000010575f80fd5b50604051620061893803806200618983398101604081905262000033916200013c565b6001600160a01b0380841660805280831660c052811660a0528282826200005962000065565b5050505050506200018d565b5f54610100900460ff1615620000d15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101562000122575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811462000139575f80fd5b50565b5f805f606084860312156200014f575f80fd5b83516200015c8162000124565b60208501519093506200016f8162000124565b6040850151909250620001828162000124565b809150509250925092565b60805160a05160c051615f99620001f05f395f81816109d2015281816122910152613b0d01525f818161079a01528181612de50152613dfb01525f818161092c015281816112e90152818161149101528181611f7b0152613cf00152615f995ff3fe608060405234801562000010575f80fd5b5060043610620002b4575f3560e01c80630645af0914620002b8578063066ec01214620002d1578063080b311114620002fd5780630a0d9fbe14620003255780630e36f582146200034057806311f6b287146200035757806312b86e19146200036e5780631489ed10146200038557806315064c96146200039c5780631608859c14620003aa5780631796a1ae14620003c15780631816b7e514620003e85780632072f6c514620003ff578063248a9ca3146200040957806325280169146200042f5780632f2ff15d14620004e357806330c27dde14620004fa57806336568abe146200050e578063394218e91462000525578063477fa270146200053c57806355a71ee0146200054557806360469169146200058857806365c0504d14620005925780637222020f1462000640578063727885e914620006575780637975fcfe146200066e5780637fb6e76a1462000694578063841b24d714620006bc57806387c20c0114620006d75780638bd4f07114620006ee5780638f698ec5146200070557806391d14854146200071c57806399f5634e14620007335780639a908e73146200073d5780639c9f3dfe1462000754578063a066215c146200076b578063a217fddf1462000782578063a2967d99146200078a578063a3c573eb1462000794578063afd23cbe14620007cb578063b99d0ad714620007f5578063c1acbc3414620008cc578063c4c928c214620008e7578063ceee281d14620008fe578063d02103ca1462000926578063d5073f6f146200094e578063d547741f1462000965578063d939b315146200097c578063dbc169761462000990578063dde0ff77146200099a578063e0bfd3d214620009b5578063e46761c414620009cc578063f34eb8eb14620009f4578063f4e926751462000a0b578063f9c4c2ae1462000a1c575b5f80fd5b620002cf620002c936600462004795565b62000b32565b005b608454620002e5906001600160401b031681565b604051620002f491906200486a565b60405180910390f35b620003146200030e36600462004892565b62000f61565b6040519015158152602001620002f4565b608554620002e590600160401b90046001600160401b031681565b620002cf62000351366004620048c8565b62000f8a565b620002e5620003683660046200494f565b62001221565b620002cf6200037f3660046200497d565b62001240565b620002cf6200039636600462004a0f565b620013e8565b606f54620003149060ff1681565b620002cf620003bb36600462004892565b62001570565b607e54620003d29063ffffffff1681565b60405163ffffffff9091168152602001620002f4565b620002cf620003f936600462004a94565b62001603565b620002cf620016ae565b620004206200041a36600462004abe565b62001773565b604051908152602001620002f4565b620004af6200044036600462004892565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002f4565b620002cf620004f436600462004ad6565b62001787565b608754620002e5906001600160401b031681565b620002cf6200051f36600462004ad6565b620017a9565b620002cf6200053636600462004b07565b620017e3565b60865462000420565b620004206200055636600462004892565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b6200042062001891565b620005f6620005a33660046200494f565b607f6020525f90815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002f4565b620002cf620006513660046200494f565b620018a8565b620002cf6200066836600462004bdc565b62001990565b620006856200067f36600462004ca2565b62001ddb565b604051620002f4919062004d55565b620003d2620006a536600462004b07565b60836020525f908152604090205463ffffffff1681565b608454620002e590600160c01b90046001600160401b031681565b620002cf620006e836600462004a0f565b62001e0d565b620002cf620006ff3660046200497d565b62002128565b620002cf6200071636600462004d69565b620021df565b620003146200072d36600462004ad6565b62002263565b620004206200228d565b620002e56200074e36600462004e14565b62002373565b620002cf6200076536600462004b07565b6200253a565b620002cf6200077c36600462004b07565b620025dc565b620004205f81565b620004206200267a565b620007bc7f000000000000000000000000000000000000000000000000000000000000000081565b604051620002f4919062004e3f565b608554620007e190600160801b900461ffff1681565b60405161ffff9091168152602001620002f4565b6200088a6200080636600462004892565b60408051608080820183525f8083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002f4919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002e590600160801b90046001600160401b031681565b620002cf620008f836600462004e53565b62002a2f565b620003d26200090f36600462004ee4565b60826020525f908152604090205463ffffffff1681565b620007bc7f000000000000000000000000000000000000000000000000000000000000000081565b620002cf6200095f36600462004abe565b62002cf2565b620002cf6200097636600462004ad6565b62002d7c565b608554620002e5906001600160401b031681565b620002cf62002d9e565b608454620002e590600160401b90046001600160401b031681565b620002cf620009c636600462004f13565b62002e57565b620007bc7f000000000000000000000000000000000000000000000000000000000000000081565b620002cf62000a0536600462004f8b565b62002f19565b608054620003d29063ffffffff1681565b62000ab262000a2d3660046200494f565b60816020525f9081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002f4565b5f54600290610100900460ff1615801562000b5357505f5460ff8083169116105b62000b7b5760405162461bcd60e51b815260040162000b72906200501d565b60405180910390fd5b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000bfb620030fb565b62000c155f8051602062005f448339815191528c62003167565b62000c215f8862003167565b62000c3b5f8051602062005e248339815191528862003167565b62000c555f8051602062005ea48339815191528862003167565b62000c6f5f8051602062005dc48339815191528862003167565b62000c895f8051602062005e048339815191528962003167565b62000ca35f8051602062005f248339815191528962003167565b62000cbd5f8051602062005e448339815191528962003167565b62000cd75f8051602062005ec48339815191528962003167565b62000cff5f8051602062005f448339815191525f8051602062005da483398151915262003173565b62000d195f8051602062005da48339815191528962003167565b62000d335f8051602062005de48339815191528962003167565b62000d5b5f8051602062005f048339815191525f8051602062005ee483398151915262003173565b62000d755f8051602062005f048339815191528762003167565b62000d8f5f8051602062005ee48339815191528762003167565b6073546074546001600160401b03600160401b9092048216911680821462000dca57604051632e4cc54360e11b815260040160405180910390fd5b5f62000def888888885f60745f9054906101000a90046001600160401b0316620031c6565b6001600160401b038381165f81815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b91829004909b1681029a909a17905560068a01805490911690931797870297909717909155600787018054909616909417909455607a54606f549390915290549251635d6717a560e01b81529394506001600160a01b038c811694635d6717a59462000eec9493831693600160581b9004909216916076916077919060040162005112565b5f604051808303815f87803b15801562000f04575f80fd5b505af115801562000f17573d5f803e3d5ffd5b50505f805461ff0019169055505060405160ff851681525f8051602062005e848339815191529350602001915062000f4c9050565b60405180910390a15050505050505050505050565b63ffffffff82165f90815260816020526040812062000f819083620033e7565b90505b92915050565b5f54600290610100900460ff1615801562000fab57505f5460ff8083169116105b62000fca5760405162461bcd60e51b815260040162000b72906200501d565b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200104a620030fb565b620010645f8051602062005f448339815191528862003167565b620010705f8462003167565b6200108a5f8051602062005e248339815191528462003167565b620010a45f8051602062005ea48339815191528462003167565b620010be5f8051602062005dc48339815191528462003167565b620010d85f8051602062005e048339815191528562003167565b620010f25f8051602062005f248339815191528562003167565b6200110c5f8051602062005e448339815191528562003167565b620011265f8051602062005ec48339815191528562003167565b6200114e5f8051602062005f448339815191525f8051602062005da483398151915262003173565b620011685f8051602062005da48339815191528562003167565b620011825f8051602062005de48339815191528562003167565b620011aa5f8051602062005f048339815191525f8051602062005ee483398151915262003173565b620011c45f8051602062005f048339815191528362003167565b620011de5f8051602062005ee48339815191528362003167565b620011ea5f3362003167565b5f805461ff001916905560405160ff821681525f8051602062005e848339815191529060200160405180910390a150505050505050565b63ffffffff81165f90815260816020526040812062000f84906200342b565b5f8051602062005f448339815191526200125a816200349a565b63ffffffff89165f90815260816020526040902062001280818a8a8a8a8a8a8a620034a6565b600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b90041615620012e7576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620013206200267a565b6040518263ffffffff1660e01b81526004016200133f91815260200190565b5f604051808303815f87803b15801562001357575f80fd5b505af11580156200136a573d5f803e3d5ffd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b5f8051602062005f4483398151915262001402816200349a565b63ffffffff89165f90815260816020526040902062001428818a8a8a8a8a8a8a62003822565b600681018054600160401b600160801b031916600160401b6001600160401b038a81169182029290921783555f9081526002840160205260409020879055600583018890559054600160801b900416156200148f576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620014c86200267a565b6040518263ffffffff1660e01b8152600401620014e791815260200190565b5f604051808303815f87803b158015620014ff575f80fd5b505af115801562001512573d5f803e3d5ffd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a6040516200155c9392919062005166565b60405180910390a350505050505050505050565b63ffffffff82165f9081526081602052604090206200159e5f8051602062005f448339815191523362002263565b620015f257606f5460ff1615620015c857604051630bc011ff60e21b815260040160405180910390fd5b620015d48183620033e7565b620015f257604051630674f25160e11b815260040160405180910390fd5b620015fe818362003c0e565b505050565b5f8051602062005ec48339815191526200161d816200349a565b6103e88261ffff1610806200163757506103ff8261ffff16115b156200165657604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620016c85f8051602062005f048339815191523362002263565b6200176757608454600160801b90046001600160401b0316158062001718575060845442906200170d9062093a8090600160801b90046001600160401b03166200519b565b6001600160401b0316115b8062001748575060875442906200173d9062093a80906001600160401b03166200519b565b6001600160401b0316115b15620017675760405163692baaad60e11b815260040160405180910390fd5b6200177162003df9565b565b5f9081526034602052604090206001015490565b620017928262001773565b6200179d816200349a565b620015fe838362003e73565b6001600160a01b0381163314620017d357604051630b4ad1cd60e31b815260040160405180910390fd5b620017df828262003ede565b5050565b5f8051602062005ec4833981519152620017fd816200349a565b606f5460ff166200183f576084546001600160401b03600160c01b9091048116908316106200183f5760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190620016a29084906200486a565b5f6086546064620018a39190620051c5565b905090565b5f8051602062005e04833981519152620018c2816200349a565b63ffffffff82161580620018e15750607e5463ffffffff908116908316115b156200190057604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f60205260409020600180820154600160e81b900460ff16151590036200194657604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b5f8051602062005f24833981519152620019aa816200349a565b63ffffffff88161580620019c95750607e5463ffffffff908116908916115b15620019e857604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88165f908152607f60205260409020600180820154600160e81b900460ff161515900362001a2e57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b0388165f9081526083602052604090205463ffffffff161562001a6b576040516337c8fe0960e11b815260040160405180910390fd5b608080545f9190829062001a859063ffffffff16620051df565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b0390921691309162001ad2906200475b565b62001ae09392919062005204565b604051809103905ff08015801562001afa573d5f803e3d5ffd5b5090508160835f8c6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508a815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001d5e949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001d9e908d908d9088908e908e908e906004016200523a565b5f604051808303815f87803b15801562001db6575f80fd5b505af115801562001dc9573d5f803e3d5ffd5b50505050505050505050505050505050565b63ffffffff86165f90815260816020526040902060609062001e0290878787878762003f47565b979650505050505050565b606f5460ff161562001e3257604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001e8092600160c01b9004811691166200519b565b6001600160401b0316111562001ea957604051638a0704d360e01b815260040160405180910390fd5b6103e862001eb888886200529c565b6001600160401b0316111562001ee157604051635acfba9d60e11b815260040160405180910390fd5b62001ef3818989898989898962003822565b62001eff818762004081565b6085546001600160401b03165f036200200657600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562001f79576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001fb26200267a565b6040518263ffffffff1660e01b815260040162001fd191815260200190565b5f604051808303815f87803b15801562001fe9575f80fd5b505af115801562001ffc573d5f803e3d5ffd5b50505050620020cf565b620020118162004278565b600681018054600160801b90046001600160401b03169060106200203583620052bf565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b900487165f90815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b4888789604051620021159392919062005166565b60405180910390a3505050505050505050565b606f5460ff16156200214d57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f908152608160205260409020620021738189898989898989620034a6565b6001600160401b0387165f9081526004820160209081526040918290206002015482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620021d462003df9565b505050505050505050565b80516080805463ffffffff191663ffffffff9092169190911790555f5b8151811015620017df578181815181106200221b576200221b620052e5565b602002602001015160815f836001620022359190620052f9565b63ffffffff16815260208101919091526040015f2060050155806200225a816200530f565b915050620021fc565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401620022dd919062004e3f565b602060405180830381865afa158015620022f9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200231f91906200532a565b6084549091505f9062002345906001600160401b03600160401b8204811691166200529c565b6001600160401b03169050805f0362002360575f9250505090565b6200236c818362005356565b9250505090565b606f545f9060ff16156200239a57604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff1690819003620023d1576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f03620023fb57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f90815260816020526040812060848054919287926200242d9084906001600160401b03166200519b565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f6200246287836200519b565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f95865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b031990921692909316919091171790559050620024f08362004278565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a25826040516200252891906200486a565b60405180910390a29695505050505050565b5f8051602062005ec483398151915262002554816200349a565b606f5460ff166200258f576085546001600160401b03908116908316106200258f5760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590620016a29084906200486a565b5f8051602062005ec4833981519152620025f6816200349a565b62015180826001600160401b031611156200262457604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890620016a29084906200486a565b6080545f9063ffffffff168082036200269457505f919050565b5f816001600160401b03811115620026b057620026b062004b23565b604051908082528060200260200182016040528015620026da578160200160208202803683370190505b5090505f5b828110156200274a5760815f620026f8836001620052f9565b63ffffffff1663ffffffff1681526020019081526020015f20600501548282815181106200272a576200272a620052e5565b60209081029190910101528062002741816200530f565b915050620026df565b505f60205b836001146200298a575f620027666002866200536c565b6200277360028762005356565b6200277f9190620052f9565b90505f816001600160401b038111156200279d576200279d62004b23565b604051908082528060200260200182016040528015620027c7578160200160208202803683370190505b5090505f5b828110156200293e57620027e260018462005382565b81148015620027fd5750620027f96002886200536c565b6001145b156200287d578562002811826002620051c5565b81518110620028245762002824620052e5565b6020026020010151856040516020016200284092919062005398565b604051602081830303815290604052805190602001208282815181106200286b576200286b620052e5565b60200260200101818152505062002929565b856200288b826002620051c5565b815181106200289e576200289e620052e5565b602002602001015186826002620028b69190620051c5565b620028c3906001620052f9565b81518110620028d657620028d6620052e5565b6020026020010151604051602001620028f192919062005398565b604051602081830303815290604052805190602001208282815181106200291c576200291c620052e5565b6020026020010181815250505b8062002935816200530f565b915050620027cc565b5080945081955083846040516020016200295a92919062005398565b60405160208183030381529060405280519060200120935082806200297f90620053a6565b93505050506200274f565b5f835f81518110620029a057620029a0620052e5565b602002602001015190505f5b8281101562002a25578184604051602001620029ca92919062005398565b6040516020818303038152906040528051906020012091508384604051602001620029f792919062005398565b604051602081830303815290604052805190602001209350808062002a1c906200530f565b915050620029ac565b5095945050505050565b5f8051602062005dc483398151915262002a49816200349a565b63ffffffff8416158062002a685750607e5463ffffffff908116908516115b1562002a8757604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526082602052604081205463ffffffff169081900362002ac7576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002b1557604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86165f908152607f60205260409020600180820154600160e81b900460ff161515900362002b5b57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002b9957604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790555f62002c188462001221565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002c6d9216908b908b90600401620053be565b5f604051808303815f87803b15801562002c85575f80fd5b505af115801562002c98573d5f803e3d5ffd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b5f8051602062005de483398151915262002d0c816200349a565b683635c9adc5dea0000082118062002d275750633b9aca0082105b1562002d4657604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620016a2565b62002d878262001773565b62002d92816200349a565b620015fe838362003ede565b5f8051602062005e4483398151915262002db8816200349a565b608780546001600160401b031916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc16976916004808301925f92919082900301818387803b15801562002e33575f80fd5b505af115801562002e46573d5f803e3d5ffd5b5050505062002e5462004341565b50565b5f8051602062005ea483398151915262002e71816200349a565b6001600160401b0384165f9081526083602052604090205463ffffffff161562002eae576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b0387165f9081526082602052604090205463ffffffff161562002eeb57604051630d409b9360e41b815260040160405180910390fd5b5f62002efc88888888875f620031c6565b5f8080526002909101602052604090209390935550505050505050565b5f8051602062005e2483398151915262002f33816200349a565b607e80545f9190829062002f4d9063ffffffff16620051df565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff1681526020015f1515815260200185815250607f5f8363ffffffff1663ffffffff1681526020019081526020015f205f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620030e996959493929190620053fd565b60405180910390a25050505050505050565b5f54610100900460ff16620017715760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b72565b620017df828262003e73565b5f6200317f8362001773565b5f84815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080545f9182918290620031e19063ffffffff16620051df565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f876001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff16021790555060815f8263ffffffff1663ffffffff1681526020019081526020015f20915087825f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b0316021790555086826001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555084825f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620033d49594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b038281165f90815260048501602052604081205490924292620034199291811691166200519b565b6001600160401b031611159392505050565b60068101545f90600160801b90046001600160401b0316156200347d575060068101546001600160401b03600160801b90910481165f9081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002e54813362004399565b60078801545f906001600160401b039081169087161015620034db5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038816156200357b5760068901546001600160401b03600160801b90910481169089161115620035255760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f90815260048a0160205260409020600281015481549092888116600160401b90920416146200357457604051632bd2e3e760e01b815260040160405180910390fd5b50620035ef565b506001600160401b0385165f90815260028901602052604090205480620035b5576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620035ef57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620036285750876001600160401b0316876001600160401b031611155b806200364c575060068901546001600160401b03600160c01b909104811690881611155b156200366b5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260048b016020526040902054600160401b9004811690861614620036b1576040516332a2a77f60e01b815260040160405180910390fd5b5f620036c28a888888868962003f47565b90505f5f8051602062005e64833981519152600283604051620036e6919062005449565b602060405180830381855afa15801562003702573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200372791906200532a565b6200373391906200536c565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620037779188919060040162005466565b602060405180830381865afa15801562003793573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620037b99190620054a2565b620037d7576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260048c016020526040902060020154859003620038155760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b5f806200382f8a6200342b565b60078b01549091506001600160401b039081169089161015620038655760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620039075760068a01546001600160401b03600160801b9091048116908a161115620038af5760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a165f90815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200390057604051632bd2e3e760e01b815260040160405180910390fd5b5062003976565b6001600160401b0388165f90815260028b01602052604090205491508162003942576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200397657604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620039a95760405163b9b18f5760e01b815260040160405180910390fd5b5f620039ba8b8a8a8a878b62003f47565b90505f5f8051602062005e64833981519152600283604051620039de919062005449565b602060405180830381855afa158015620039fa573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019062003a1f91906200532a565b62003a2b91906200536c565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003a6f9189919060040162005466565b602060405180830381865afa15801562003a8b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062003ab19190620054a2565b62003acf576040516309bde33960e01b815260040160405180910390fd5b5f62003adc848b6200529c565b905062003b3587826001600160401b031662003af76200228d565b62003b039190620051c5565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620043c3565b80608460088282829054906101000a90046001600160401b031662003b5b91906200519b565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d153906064015f604051808303815f87803b15801562003be8575f80fd5b505af115801562003bfb573d5f803e3d5ffd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003c4d575060068201546001600160401b03600160801b9091048116908216115b1562003c6c5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f81815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003d276200267a565b6040518263ffffffff1660e01b815260040162003d4691815260200190565b5f604051808303815f87803b15801562003d5e575f80fd5b505af115801562003d71573d5f803e3d5ffd5b505085546001600160a01b03165f90815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801562003e52575f80fd5b505af115801562003e65573d5f803e3d5ffd5b505050506200177162004417565b62003e7f828262002263565b620017df575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003eea828262002263565b15620017df575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086165f818152600389016020526040808220549388168252902054606092911580159062003f7c575081155b1562003f9b5760405163340c614f60e11b815260040160405180910390fd5b8062003fba576040516366385b5160e01b815260040160405180910390fd5b62003fc58462004473565b62003fe3576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b5f6200408d836200342b565b9050815f806200409e84846200529c565b6085546001600160401b0391821692505f91620040c491600160401b9004164262005382565b90505b846001600160401b0316846001600160401b0316146200414d576001600160401b038085165f9081526003890160205260409020600181015490911682101562004128576001810154600160401b90046001600160401b0316945062004146565b6200413486866200529c565b6001600160401b03169350506200414d565b50620040c7565b5f6200415a848462005382565b905083811015620041b857808403600c81116200417857806200417b565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620041ad57620041ad62005342565b04608655506200422f565b838103600c8111620041cb5780620041ce565b600c5b90505f816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162004207576200420762005342565b04905080608654670de0b6b3a7640000028162004228576200422862005342565b0460865550505b683635c9adc5dea0000060865411156200425657683635c9adc5dea000006086556200426e565b633b9aca0060865410156200426e57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002e545760068101545f90620042c290600160c01b90046001600160401b031660016200519b565b9050620042d08282620033e7565b15620017df5760068201545f90600290620042fd908490600160801b90046001600160401b03166200529c565b620043099190620054c3565b6200431590836200519b565b9050620043238382620033e7565b156200433557620015fe838262003c0e565b620015fe838362003c0e565b606f5460ff166200436557604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b620043a5828262002263565b620017df57604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620015fe908490620044f7565b606f5460ff16156200443c57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff000000016001600160401b038316108015620044a9575067ffffffff00000001604083901c6001600160401b0316105b8015620044ca575067ffffffff00000001608083901c6001600160401b0316105b8015620044e2575067ffffffff0000000160c083901c105b15620044f057506001919050565b505f919050565b5f6200454d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620045cf9092919063ffffffff16565b805190915015620015fe57808060200190518101906200456e9190620054a2565b620015fe5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b72565b6060620045df84845f85620045e7565b949350505050565b6060824710156200464a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b72565b5f80866001600160a01b0316858760405162004667919062005449565b5f6040518083038185875af1925050503d805f8114620046a3576040519150601f19603f3d011682016040523d82523d5f602084013e620046a8565b606091505b509150915062001e028783838760608315620047285782515f0362004720576001600160a01b0385163b620047205760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b72565b5081620045df565b620045df83838151156200473f5781518083602001fd5b8060405162461bcd60e51b815260040162000b72919062004d55565b6108b880620054ec83390190565b6001600160a01b038116811462002e54575f80fd5b80356001600160401b038116811462003495575f80fd5b5f805f805f805f805f806101408b8d031215620047b0575f80fd5b8a35620047bd8162004769565b9950620047cd60208c016200477e565b9850620047dd60408c016200477e565b975060608b0135620047ef8162004769565b965060808b0135620048018162004769565b955060a08b0135620048138162004769565b945060c08b0135620048258162004769565b935060e08b0135620048378162004769565b9250620048486101008c016200477e565b9150620048596101208c016200477e565b90509295989b9194979a5092959850565b6001600160401b0391909116815260200190565b803563ffffffff8116811462003495575f80fd5b5f8060408385031215620048a4575f80fd5b620048af836200487e565b9150620048bf602084016200477e565b90509250929050565b5f805f805f8060c08789031215620048de575f80fd5b8635620048eb8162004769565b9550620048fb602088016200477e565b94506200490b604088016200477e565b935060608701356200491d8162004769565b925060808701356200492f8162004769565b915060a0870135620049418162004769565b809150509295509295509295565b5f6020828403121562004960575f80fd5b62000f81826200487e565b80610300810183101562000f84575f80fd5b5f805f805f805f806103e0898b03121562004996575f80fd5b620049a1896200487e565b9750620049b160208a016200477e565b9650620049c160408a016200477e565b9550620049d160608a016200477e565b9450620049e160808a016200477e565b935060a0890135925060c0890135915062004a008a60e08b016200496b565b90509295985092959890939650565b5f805f805f805f806103e0898b03121562004a28575f80fd5b62004a33896200487e565b975062004a4360208a016200477e565b965062004a5360408a016200477e565b955062004a6360608a016200477e565b94506080890135935060a0890135925060c089013562004a838162004769565b915062004a008a60e08b016200496b565b5f6020828403121562004aa5575f80fd5b813561ffff8116811462004ab7575f80fd5b9392505050565b5f6020828403121562004acf575f80fd5b5035919050565b5f806040838503121562004ae8575f80fd5b82359150602083013562004afc8162004769565b809150509250929050565b5f6020828403121562004b18575f80fd5b62000f81826200477e565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171562004b625762004b6262004b23565b604052919050565b5f82601f83011262004b7a575f80fd5b81356001600160401b0381111562004b965762004b9662004b23565b62004bab601f8201601f191660200162004b37565b81815284602083860101111562004bc0575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f805f60e0888a03121562004bf3575f80fd5b62004bfe886200487e565b965062004c0e602089016200477e565b9550604088013562004c208162004769565b9450606088013562004c328162004769565b9350608088013562004c448162004769565b925060a08801356001600160401b038082111562004c60575f80fd5b62004c6e8b838c0162004b6a565b935060c08a013591508082111562004c84575f80fd5b5062004c938a828b0162004b6a565b91505092959891949750929550565b5f805f805f8060c0878903121562004cb8575f80fd5b62004cc3876200487e565b955062004cd3602088016200477e565b945062004ce3604088016200477e565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b8381101562004d2057818101518382015260200162004d06565b50505f910152565b5f815180845262004d4181602086016020860162004d04565b601f01601f19169290920160200192915050565b602081525f62000f81602083018462004d28565b5f602080838503121562004d7b575f80fd5b82356001600160401b038082111562004d92575f80fd5b818501915085601f83011262004da6575f80fd5b81358181111562004dbb5762004dbb62004b23565b8060051b915062004dce84830162004b37565b818152918301840191848101908884111562004de8575f80fd5b938501935b8385101562004e085784358252938501939085019062004ded565b98975050505050505050565b5f806040838503121562004e26575f80fd5b62004e31836200477e565b946020939093013593505050565b6001600160a01b0391909116815260200190565b5f805f806060858703121562004e67575f80fd5b843562004e748162004769565b935062004e84602086016200487e565b925060408501356001600160401b038082111562004ea0575f80fd5b818701915087601f83011262004eb4575f80fd5b81358181111562004ec3575f80fd5b88602082850101111562004ed5575f80fd5b95989497505060200194505050565b5f6020828403121562004ef5575f80fd5b813562004ab78162004769565b803560ff8116811462003495575f80fd5b5f805f805f8060c0878903121562004f29575f80fd5b863562004f368162004769565b9550602087013562004f488162004769565b945062004f58604088016200477e565b935062004f68606088016200477e565b92506080870135915062004f7f60a0880162004f02565b90509295509295509295565b5f805f805f8060c0878903121562004fa1575f80fd5b863562004fae8162004769565b9550602087013562004fc08162004769565b945062004fd0604088016200477e565b935062004fe06060880162004f02565b92506080870135915060a08701356001600160401b0381111562005002575f80fd5b6200501089828a0162004b6a565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b80545f90600181811c90808316806200508557607f831692505b60208084108203620050a557634e487b7160e01b5f52602260045260245ffd5b83885260208801828015620050c35760018114620050da5762005105565b60ff198716825285151560051b8201975062005105565b5f898152602090205f5b87811015620050ff57815484820152908601908401620050e4565b83019850505b5050505050505092915050565b6001600160a01b0386811682528516602082015260a0604082018190525f906200513f908301866200506b565b82810360608401526200515381866200506b565b9150508260808301529695505050505050565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03818116838216019080821115620051be57620051be62005187565b5092915050565b808202811582820484141762000f845762000f8462005187565b5f63ffffffff808316818103620051fa57620051fa62005187565b6001019392505050565b6001600160a01b038481168252831660208201526060604082018190525f90620052319083018462004d28565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190525f906200527b9083018562004d28565b82810360a08401526200528f818562004d28565b9998505050505050505050565b6001600160401b03828116828216039080821115620051be57620051be62005187565b5f6001600160401b038281166002600160401b03198101620051fa57620051fa62005187565b634e487b7160e01b5f52603260045260245ffd5b8082018082111562000f845762000f8462005187565b5f6001820162005323576200532362005187565b5060010190565b5f602082840312156200533b575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8262005367576200536762005342565b500490565b5f826200537d576200537d62005342565b500690565b8181038181111562000f845762000f8462005187565b918252602082015260400190565b5f81620053b757620053b762005187565b505f190190565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190525f9062004e089083018462004d28565b5f82516200545c81846020870162004d04565b9190910192915050565b6103208101610300808584378201835f5b60018110156200549857815183526020928301929091019060010162005477565b5050509392505050565b5f60208284031215620054b3575f80fd5b8151801515811462004ab7575f80fd5b5f6001600160401b0383811680620054df57620054df62005342565b9216919091049291505056fe60a06040526040516108b83803806108b883398101604081905261002291610349565b828161002e8282610056565b50506001600160a01b03821660805261004e61004960805190565b6100b4565b50505061042e565b61005f82610121565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100a8576100a3828261019f565b505050565b6100b0610212565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f35f80516020610898833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161011e81610233565b50565b806001600160a01b03163b5f0361015b57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516101bb9190610413565b5f60405180830381855af49150503d805f81146101f3576040519150601f19603f3d011682016040523d82523d5f602084013e6101f8565b606091505b509092509050610209858383610270565b95945050505050565b34156102315760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661025c57604051633173bdd160e11b81525f6004820152602401610152565b805f8051602061089883398151915261017e565b60608261028557610280826102cf565b6102c8565b815115801561029c57506001600160a01b0384163b155b156102c557604051639996b31560e01b81526001600160a01b0385166004820152602401610152565b50805b9392505050565b8051156102df5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461030e575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015610341578181015183820152602001610329565b50505f910152565b5f805f6060848603121561035b575f80fd5b610364846102f8565b9250610372602085016102f8565b60408501519092506001600160401b038082111561038e575f80fd5b818601915086601f8301126103a1575f80fd5b8151818111156103b3576103b3610313565b604051601f8201601f19908116603f011681019083821181831017156103db576103db610313565b816040528281528960208487010111156103f3575f80fd5b610404836020830160208801610327565b80955050505050509250925092565b5f8251610424818460208701610327565b9190910192915050565b6080516104536104455f395f601001526104535ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610069575f356001600160e01b03191663278f794360e11b146100615761005f61006d565b565b61005f61007d565b61005f5b61005f6100786100ab565b6100cf565b5f8061008c36600481846102ba565b81019061009991906102f5565b915091506100a782826100ed565b5050565b5f6100ca5f805160206103fe833981519152546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156100e9573d5ff35b3d5ffd5b6100f682610147565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561013f5761013a82826101aa565b505050565b6100a761021c565b806001600160a01b03163b5f0361017c5780604051634c9c8ce360e01b815260040161017391906103bd565b60405180910390fd5b5f805160206103fe83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101c691906103d1565b5f60405180830381855af49150503d805f81146101fe576040519150601f19603f3d011682016040523d82523d5f602084013e610203565b606091505b509150915061021385838361023b565b95945050505050565b341561005f5760405163b398979f60e01b815260040160405180910390fd5b6060826102505761024b82610291565b61028a565b815115801561026757506001600160a01b0384163b155b156102875783604051639996b31560e01b815260040161017391906103bd565b50805b9392505050565b8051156102a15780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f80858511156102c8575f80fd5b838611156102d4575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610306575f80fd5b82356001600160a01b038116811461031c575f80fd5b915060208301356001600160401b0380821115610337575f80fd5b818501915085601f83011261034a575f80fd5b81358181111561035c5761035c6102e1565b604051601f8201601f19908116603f01168101908382118183101715610384576103846102e1565b8160405282815288602084870101111561039c575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b5f82515f5b818110156103f057602081860181015185830152016103d6565b505f92019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220d3b91b386436af95579d7d767b3c6e83ae79b09bd8dd9344bddb95185404c56564736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a26469706673582212207e99d5f87d7f70d36ef1507ceaaad2e7eded13630b5d2250efa94776f41f581464736f6c63430008140033", - "deployedBytecode": "0x608060405234801562000010575f80fd5b5060043610620002b4575f3560e01c80630645af0914620002b8578063066ec01214620002d1578063080b311114620002fd5780630a0d9fbe14620003255780630e36f582146200034057806311f6b287146200035757806312b86e19146200036e5780631489ed10146200038557806315064c96146200039c5780631608859c14620003aa5780631796a1ae14620003c15780631816b7e514620003e85780632072f6c514620003ff578063248a9ca3146200040957806325280169146200042f5780632f2ff15d14620004e357806330c27dde14620004fa57806336568abe146200050e578063394218e91462000525578063477fa270146200053c57806355a71ee0146200054557806360469169146200058857806365c0504d14620005925780637222020f1462000640578063727885e914620006575780637975fcfe146200066e5780637fb6e76a1462000694578063841b24d714620006bc57806387c20c0114620006d75780638bd4f07114620006ee5780638f698ec5146200070557806391d14854146200071c57806399f5634e14620007335780639a908e73146200073d5780639c9f3dfe1462000754578063a066215c146200076b578063a217fddf1462000782578063a2967d99146200078a578063a3c573eb1462000794578063afd23cbe14620007cb578063b99d0ad714620007f5578063c1acbc3414620008cc578063c4c928c214620008e7578063ceee281d14620008fe578063d02103ca1462000926578063d5073f6f146200094e578063d547741f1462000965578063d939b315146200097c578063dbc169761462000990578063dde0ff77146200099a578063e0bfd3d214620009b5578063e46761c414620009cc578063f34eb8eb14620009f4578063f4e926751462000a0b578063f9c4c2ae1462000a1c575b5f80fd5b620002cf620002c936600462004795565b62000b32565b005b608454620002e5906001600160401b031681565b604051620002f491906200486a565b60405180910390f35b620003146200030e36600462004892565b62000f61565b6040519015158152602001620002f4565b608554620002e590600160401b90046001600160401b031681565b620002cf62000351366004620048c8565b62000f8a565b620002e5620003683660046200494f565b62001221565b620002cf6200037f3660046200497d565b62001240565b620002cf6200039636600462004a0f565b620013e8565b606f54620003149060ff1681565b620002cf620003bb36600462004892565b62001570565b607e54620003d29063ffffffff1681565b60405163ffffffff9091168152602001620002f4565b620002cf620003f936600462004a94565b62001603565b620002cf620016ae565b620004206200041a36600462004abe565b62001773565b604051908152602001620002f4565b620004af6200044036600462004892565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002f4565b620002cf620004f436600462004ad6565b62001787565b608754620002e5906001600160401b031681565b620002cf6200051f36600462004ad6565b620017a9565b620002cf6200053636600462004b07565b620017e3565b60865462000420565b620004206200055636600462004892565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b6200042062001891565b620005f6620005a33660046200494f565b607f6020525f90815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002f4565b620002cf620006513660046200494f565b620018a8565b620002cf6200066836600462004bdc565b62001990565b620006856200067f36600462004ca2565b62001ddb565b604051620002f4919062004d55565b620003d2620006a536600462004b07565b60836020525f908152604090205463ffffffff1681565b608454620002e590600160c01b90046001600160401b031681565b620002cf620006e836600462004a0f565b62001e0d565b620002cf620006ff3660046200497d565b62002128565b620002cf6200071636600462004d69565b620021df565b620003146200072d36600462004ad6565b62002263565b620004206200228d565b620002e56200074e36600462004e14565b62002373565b620002cf6200076536600462004b07565b6200253a565b620002cf6200077c36600462004b07565b620025dc565b620004205f81565b620004206200267a565b620007bc7f000000000000000000000000000000000000000000000000000000000000000081565b604051620002f4919062004e3f565b608554620007e190600160801b900461ffff1681565b60405161ffff9091168152602001620002f4565b6200088a6200080636600462004892565b60408051608080820183525f8083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002f4919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002e590600160801b90046001600160401b031681565b620002cf620008f836600462004e53565b62002a2f565b620003d26200090f36600462004ee4565b60826020525f908152604090205463ffffffff1681565b620007bc7f000000000000000000000000000000000000000000000000000000000000000081565b620002cf6200095f36600462004abe565b62002cf2565b620002cf6200097636600462004ad6565b62002d7c565b608554620002e5906001600160401b031681565b620002cf62002d9e565b608454620002e590600160401b90046001600160401b031681565b620002cf620009c636600462004f13565b62002e57565b620007bc7f000000000000000000000000000000000000000000000000000000000000000081565b620002cf62000a0536600462004f8b565b62002f19565b608054620003d29063ffffffff1681565b62000ab262000a2d3660046200494f565b60816020525f9081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002f4565b5f54600290610100900460ff1615801562000b5357505f5460ff8083169116105b62000b7b5760405162461bcd60e51b815260040162000b72906200501d565b60405180910390fd5b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000bfb620030fb565b62000c155f8051602062005f448339815191528c62003167565b62000c215f8862003167565b62000c3b5f8051602062005e248339815191528862003167565b62000c555f8051602062005ea48339815191528862003167565b62000c6f5f8051602062005dc48339815191528862003167565b62000c895f8051602062005e048339815191528962003167565b62000ca35f8051602062005f248339815191528962003167565b62000cbd5f8051602062005e448339815191528962003167565b62000cd75f8051602062005ec48339815191528962003167565b62000cff5f8051602062005f448339815191525f8051602062005da483398151915262003173565b62000d195f8051602062005da48339815191528962003167565b62000d335f8051602062005de48339815191528962003167565b62000d5b5f8051602062005f048339815191525f8051602062005ee483398151915262003173565b62000d755f8051602062005f048339815191528762003167565b62000d8f5f8051602062005ee48339815191528762003167565b6073546074546001600160401b03600160401b9092048216911680821462000dca57604051632e4cc54360e11b815260040160405180910390fd5b5f62000def888888885f60745f9054906101000a90046001600160401b0316620031c6565b6001600160401b038381165f81815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b91829004909b1681029a909a17905560068a01805490911690931797870297909717909155600787018054909616909417909455607a54606f549390915290549251635d6717a560e01b81529394506001600160a01b038c811694635d6717a59462000eec9493831693600160581b9004909216916076916077919060040162005112565b5f604051808303815f87803b15801562000f04575f80fd5b505af115801562000f17573d5f803e3d5ffd5b50505f805461ff0019169055505060405160ff851681525f8051602062005e848339815191529350602001915062000f4c9050565b60405180910390a15050505050505050505050565b63ffffffff82165f90815260816020526040812062000f819083620033e7565b90505b92915050565b5f54600290610100900460ff1615801562000fab57505f5460ff8083169116105b62000fca5760405162461bcd60e51b815260040162000b72906200501d565b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200104a620030fb565b620010645f8051602062005f448339815191528862003167565b620010705f8462003167565b6200108a5f8051602062005e248339815191528462003167565b620010a45f8051602062005ea48339815191528462003167565b620010be5f8051602062005dc48339815191528462003167565b620010d85f8051602062005e048339815191528562003167565b620010f25f8051602062005f248339815191528562003167565b6200110c5f8051602062005e448339815191528562003167565b620011265f8051602062005ec48339815191528562003167565b6200114e5f8051602062005f448339815191525f8051602062005da483398151915262003173565b620011685f8051602062005da48339815191528562003167565b620011825f8051602062005de48339815191528562003167565b620011aa5f8051602062005f048339815191525f8051602062005ee483398151915262003173565b620011c45f8051602062005f048339815191528362003167565b620011de5f8051602062005ee48339815191528362003167565b620011ea5f3362003167565b5f805461ff001916905560405160ff821681525f8051602062005e848339815191529060200160405180910390a150505050505050565b63ffffffff81165f90815260816020526040812062000f84906200342b565b5f8051602062005f448339815191526200125a816200349a565b63ffffffff89165f90815260816020526040902062001280818a8a8a8a8a8a8a620034a6565b600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b90041615620012e7576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620013206200267a565b6040518263ffffffff1660e01b81526004016200133f91815260200190565b5f604051808303815f87803b15801562001357575f80fd5b505af11580156200136a573d5f803e3d5ffd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b5f8051602062005f4483398151915262001402816200349a565b63ffffffff89165f90815260816020526040902062001428818a8a8a8a8a8a8a62003822565b600681018054600160401b600160801b031916600160401b6001600160401b038a81169182029290921783555f9081526002840160205260409020879055600583018890559054600160801b900416156200148f576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620014c86200267a565b6040518263ffffffff1660e01b8152600401620014e791815260200190565b5f604051808303815f87803b158015620014ff575f80fd5b505af115801562001512573d5f803e3d5ffd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a6040516200155c9392919062005166565b60405180910390a350505050505050505050565b63ffffffff82165f9081526081602052604090206200159e5f8051602062005f448339815191523362002263565b620015f257606f5460ff1615620015c857604051630bc011ff60e21b815260040160405180910390fd5b620015d48183620033e7565b620015f257604051630674f25160e11b815260040160405180910390fd5b620015fe818362003c0e565b505050565b5f8051602062005ec48339815191526200161d816200349a565b6103e88261ffff1610806200163757506103ff8261ffff16115b156200165657604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620016c85f8051602062005f048339815191523362002263565b6200176757608454600160801b90046001600160401b0316158062001718575060845442906200170d9062093a8090600160801b90046001600160401b03166200519b565b6001600160401b0316115b8062001748575060875442906200173d9062093a80906001600160401b03166200519b565b6001600160401b0316115b15620017675760405163692baaad60e11b815260040160405180910390fd5b6200177162003df9565b565b5f9081526034602052604090206001015490565b620017928262001773565b6200179d816200349a565b620015fe838362003e73565b6001600160a01b0381163314620017d357604051630b4ad1cd60e31b815260040160405180910390fd5b620017df828262003ede565b5050565b5f8051602062005ec4833981519152620017fd816200349a565b606f5460ff166200183f576084546001600160401b03600160c01b9091048116908316106200183f5760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190620016a29084906200486a565b5f6086546064620018a39190620051c5565b905090565b5f8051602062005e04833981519152620018c2816200349a565b63ffffffff82161580620018e15750607e5463ffffffff908116908316115b156200190057604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f60205260409020600180820154600160e81b900460ff16151590036200194657604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b5f8051602062005f24833981519152620019aa816200349a565b63ffffffff88161580620019c95750607e5463ffffffff908116908916115b15620019e857604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88165f908152607f60205260409020600180820154600160e81b900460ff161515900362001a2e57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b0388165f9081526083602052604090205463ffffffff161562001a6b576040516337c8fe0960e11b815260040160405180910390fd5b608080545f9190829062001a859063ffffffff16620051df565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b0390921691309162001ad2906200475b565b62001ae09392919062005204565b604051809103905ff08015801562001afa573d5f803e3d5ffd5b5090508160835f8c6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508a815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001d5e949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001d9e908d908d9088908e908e908e906004016200523a565b5f604051808303815f87803b15801562001db6575f80fd5b505af115801562001dc9573d5f803e3d5ffd5b50505050505050505050505050505050565b63ffffffff86165f90815260816020526040902060609062001e0290878787878762003f47565b979650505050505050565b606f5460ff161562001e3257604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001e8092600160c01b9004811691166200519b565b6001600160401b0316111562001ea957604051638a0704d360e01b815260040160405180910390fd5b6103e862001eb888886200529c565b6001600160401b0316111562001ee157604051635acfba9d60e11b815260040160405180910390fd5b62001ef3818989898989898962003822565b62001eff818762004081565b6085546001600160401b03165f036200200657600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562001f79576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001fb26200267a565b6040518263ffffffff1660e01b815260040162001fd191815260200190565b5f604051808303815f87803b15801562001fe9575f80fd5b505af115801562001ffc573d5f803e3d5ffd5b50505050620020cf565b620020118162004278565b600681018054600160801b90046001600160401b03169060106200203583620052bf565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b900487165f90815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b4888789604051620021159392919062005166565b60405180910390a3505050505050505050565b606f5460ff16156200214d57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f908152608160205260409020620021738189898989898989620034a6565b6001600160401b0387165f9081526004820160209081526040918290206002015482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620021d462003df9565b505050505050505050565b80516080805463ffffffff191663ffffffff9092169190911790555f5b8151811015620017df578181815181106200221b576200221b620052e5565b602002602001015160815f836001620022359190620052f9565b63ffffffff16815260208101919091526040015f2060050155806200225a816200530f565b915050620021fc565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401620022dd919062004e3f565b602060405180830381865afa158015620022f9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200231f91906200532a565b6084549091505f9062002345906001600160401b03600160401b8204811691166200529c565b6001600160401b03169050805f0362002360575f9250505090565b6200236c818362005356565b9250505090565b606f545f9060ff16156200239a57604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff1690819003620023d1576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f03620023fb57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f90815260816020526040812060848054919287926200242d9084906001600160401b03166200519b565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f6200246287836200519b565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f95865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b031990921692909316919091171790559050620024f08362004278565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a25826040516200252891906200486a565b60405180910390a29695505050505050565b5f8051602062005ec483398151915262002554816200349a565b606f5460ff166200258f576085546001600160401b03908116908316106200258f5760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590620016a29084906200486a565b5f8051602062005ec4833981519152620025f6816200349a565b62015180826001600160401b031611156200262457604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890620016a29084906200486a565b6080545f9063ffffffff168082036200269457505f919050565b5f816001600160401b03811115620026b057620026b062004b23565b604051908082528060200260200182016040528015620026da578160200160208202803683370190505b5090505f5b828110156200274a5760815f620026f8836001620052f9565b63ffffffff1663ffffffff1681526020019081526020015f20600501548282815181106200272a576200272a620052e5565b60209081029190910101528062002741816200530f565b915050620026df565b505f60205b836001146200298a575f620027666002866200536c565b6200277360028762005356565b6200277f9190620052f9565b90505f816001600160401b038111156200279d576200279d62004b23565b604051908082528060200260200182016040528015620027c7578160200160208202803683370190505b5090505f5b828110156200293e57620027e260018462005382565b81148015620027fd5750620027f96002886200536c565b6001145b156200287d578562002811826002620051c5565b81518110620028245762002824620052e5565b6020026020010151856040516020016200284092919062005398565b604051602081830303815290604052805190602001208282815181106200286b576200286b620052e5565b60200260200101818152505062002929565b856200288b826002620051c5565b815181106200289e576200289e620052e5565b602002602001015186826002620028b69190620051c5565b620028c3906001620052f9565b81518110620028d657620028d6620052e5565b6020026020010151604051602001620028f192919062005398565b604051602081830303815290604052805190602001208282815181106200291c576200291c620052e5565b6020026020010181815250505b8062002935816200530f565b915050620027cc565b5080945081955083846040516020016200295a92919062005398565b60405160208183030381529060405280519060200120935082806200297f90620053a6565b93505050506200274f565b5f835f81518110620029a057620029a0620052e5565b602002602001015190505f5b8281101562002a25578184604051602001620029ca92919062005398565b6040516020818303038152906040528051906020012091508384604051602001620029f792919062005398565b604051602081830303815290604052805190602001209350808062002a1c906200530f565b915050620029ac565b5095945050505050565b5f8051602062005dc483398151915262002a49816200349a565b63ffffffff8416158062002a685750607e5463ffffffff908116908516115b1562002a8757604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526082602052604081205463ffffffff169081900362002ac7576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002b1557604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86165f908152607f60205260409020600180820154600160e81b900460ff161515900362002b5b57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002b9957604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790555f62002c188462001221565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002c6d9216908b908b90600401620053be565b5f604051808303815f87803b15801562002c85575f80fd5b505af115801562002c98573d5f803e3d5ffd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b5f8051602062005de483398151915262002d0c816200349a565b683635c9adc5dea0000082118062002d275750633b9aca0082105b1562002d4657604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620016a2565b62002d878262001773565b62002d92816200349a565b620015fe838362003ede565b5f8051602062005e4483398151915262002db8816200349a565b608780546001600160401b031916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc16976916004808301925f92919082900301818387803b15801562002e33575f80fd5b505af115801562002e46573d5f803e3d5ffd5b5050505062002e5462004341565b50565b5f8051602062005ea483398151915262002e71816200349a565b6001600160401b0384165f9081526083602052604090205463ffffffff161562002eae576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b0387165f9081526082602052604090205463ffffffff161562002eeb57604051630d409b9360e41b815260040160405180910390fd5b5f62002efc88888888875f620031c6565b5f8080526002909101602052604090209390935550505050505050565b5f8051602062005e2483398151915262002f33816200349a565b607e80545f9190829062002f4d9063ffffffff16620051df565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff1681526020015f1515815260200185815250607f5f8363ffffffff1663ffffffff1681526020019081526020015f205f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620030e996959493929190620053fd565b60405180910390a25050505050505050565b5f54610100900460ff16620017715760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b72565b620017df828262003e73565b5f6200317f8362001773565b5f84815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080545f9182918290620031e19063ffffffff16620051df565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f876001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff16021790555060815f8263ffffffff1663ffffffff1681526020019081526020015f20915087825f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b0316021790555086826001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555084825f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620033d49594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b038281165f90815260048501602052604081205490924292620034199291811691166200519b565b6001600160401b031611159392505050565b60068101545f90600160801b90046001600160401b0316156200347d575060068101546001600160401b03600160801b90910481165f9081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002e54813362004399565b60078801545f906001600160401b039081169087161015620034db5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038816156200357b5760068901546001600160401b03600160801b90910481169089161115620035255760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f90815260048a0160205260409020600281015481549092888116600160401b90920416146200357457604051632bd2e3e760e01b815260040160405180910390fd5b50620035ef565b506001600160401b0385165f90815260028901602052604090205480620035b5576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620035ef57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620036285750876001600160401b0316876001600160401b031611155b806200364c575060068901546001600160401b03600160c01b909104811690881611155b156200366b5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260048b016020526040902054600160401b9004811690861614620036b1576040516332a2a77f60e01b815260040160405180910390fd5b5f620036c28a888888868962003f47565b90505f5f8051602062005e64833981519152600283604051620036e6919062005449565b602060405180830381855afa15801562003702573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200372791906200532a565b6200373391906200536c565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620037779188919060040162005466565b602060405180830381865afa15801562003793573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620037b99190620054a2565b620037d7576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260048c016020526040902060020154859003620038155760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b5f806200382f8a6200342b565b60078b01549091506001600160401b039081169089161015620038655760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620039075760068a01546001600160401b03600160801b9091048116908a161115620038af5760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a165f90815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200390057604051632bd2e3e760e01b815260040160405180910390fd5b5062003976565b6001600160401b0388165f90815260028b01602052604090205491508162003942576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200397657604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620039a95760405163b9b18f5760e01b815260040160405180910390fd5b5f620039ba8b8a8a8a878b62003f47565b90505f5f8051602062005e64833981519152600283604051620039de919062005449565b602060405180830381855afa158015620039fa573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019062003a1f91906200532a565b62003a2b91906200536c565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003a6f9189919060040162005466565b602060405180830381865afa15801562003a8b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062003ab19190620054a2565b62003acf576040516309bde33960e01b815260040160405180910390fd5b5f62003adc848b6200529c565b905062003b3587826001600160401b031662003af76200228d565b62003b039190620051c5565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620043c3565b80608460088282829054906101000a90046001600160401b031662003b5b91906200519b565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d153906064015f604051808303815f87803b15801562003be8575f80fd5b505af115801562003bfb573d5f803e3d5ffd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003c4d575060068201546001600160401b03600160801b9091048116908216115b1562003c6c5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f81815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003d276200267a565b6040518263ffffffff1660e01b815260040162003d4691815260200190565b5f604051808303815f87803b15801562003d5e575f80fd5b505af115801562003d71573d5f803e3d5ffd5b505085546001600160a01b03165f90815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801562003e52575f80fd5b505af115801562003e65573d5f803e3d5ffd5b505050506200177162004417565b62003e7f828262002263565b620017df575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003eea828262002263565b15620017df575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086165f818152600389016020526040808220549388168252902054606092911580159062003f7c575081155b1562003f9b5760405163340c614f60e11b815260040160405180910390fd5b8062003fba576040516366385b5160e01b815260040160405180910390fd5b62003fc58462004473565b62003fe3576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b5f6200408d836200342b565b9050815f806200409e84846200529c565b6085546001600160401b0391821692505f91620040c491600160401b9004164262005382565b90505b846001600160401b0316846001600160401b0316146200414d576001600160401b038085165f9081526003890160205260409020600181015490911682101562004128576001810154600160401b90046001600160401b0316945062004146565b6200413486866200529c565b6001600160401b03169350506200414d565b50620040c7565b5f6200415a848462005382565b905083811015620041b857808403600c81116200417857806200417b565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620041ad57620041ad62005342565b04608655506200422f565b838103600c8111620041cb5780620041ce565b600c5b90505f816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162004207576200420762005342565b04905080608654670de0b6b3a7640000028162004228576200422862005342565b0460865550505b683635c9adc5dea0000060865411156200425657683635c9adc5dea000006086556200426e565b633b9aca0060865410156200426e57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002e545760068101545f90620042c290600160c01b90046001600160401b031660016200519b565b9050620042d08282620033e7565b15620017df5760068201545f90600290620042fd908490600160801b90046001600160401b03166200529c565b620043099190620054c3565b6200431590836200519b565b9050620043238382620033e7565b156200433557620015fe838262003c0e565b620015fe838362003c0e565b606f5460ff166200436557604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b620043a5828262002263565b620017df57604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620015fe908490620044f7565b606f5460ff16156200443c57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff000000016001600160401b038316108015620044a9575067ffffffff00000001604083901c6001600160401b0316105b8015620044ca575067ffffffff00000001608083901c6001600160401b0316105b8015620044e2575067ffffffff0000000160c083901c105b15620044f057506001919050565b505f919050565b5f6200454d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620045cf9092919063ffffffff16565b805190915015620015fe57808060200190518101906200456e9190620054a2565b620015fe5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b72565b6060620045df84845f85620045e7565b949350505050565b6060824710156200464a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b72565b5f80866001600160a01b0316858760405162004667919062005449565b5f6040518083038185875af1925050503d805f8114620046a3576040519150601f19603f3d011682016040523d82523d5f602084013e620046a8565b606091505b509150915062001e028783838760608315620047285782515f0362004720576001600160a01b0385163b620047205760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b72565b5081620045df565b620045df83838151156200473f5781518083602001fd5b8060405162461bcd60e51b815260040162000b72919062004d55565b6108b880620054ec83390190565b6001600160a01b038116811462002e54575f80fd5b80356001600160401b038116811462003495575f80fd5b5f805f805f805f805f806101408b8d031215620047b0575f80fd5b8a35620047bd8162004769565b9950620047cd60208c016200477e565b9850620047dd60408c016200477e565b975060608b0135620047ef8162004769565b965060808b0135620048018162004769565b955060a08b0135620048138162004769565b945060c08b0135620048258162004769565b935060e08b0135620048378162004769565b9250620048486101008c016200477e565b9150620048596101208c016200477e565b90509295989b9194979a5092959850565b6001600160401b0391909116815260200190565b803563ffffffff8116811462003495575f80fd5b5f8060408385031215620048a4575f80fd5b620048af836200487e565b9150620048bf602084016200477e565b90509250929050565b5f805f805f8060c08789031215620048de575f80fd5b8635620048eb8162004769565b9550620048fb602088016200477e565b94506200490b604088016200477e565b935060608701356200491d8162004769565b925060808701356200492f8162004769565b915060a0870135620049418162004769565b809150509295509295509295565b5f6020828403121562004960575f80fd5b62000f81826200487e565b80610300810183101562000f84575f80fd5b5f805f805f805f806103e0898b03121562004996575f80fd5b620049a1896200487e565b9750620049b160208a016200477e565b9650620049c160408a016200477e565b9550620049d160608a016200477e565b9450620049e160808a016200477e565b935060a0890135925060c0890135915062004a008a60e08b016200496b565b90509295985092959890939650565b5f805f805f805f806103e0898b03121562004a28575f80fd5b62004a33896200487e565b975062004a4360208a016200477e565b965062004a5360408a016200477e565b955062004a6360608a016200477e565b94506080890135935060a0890135925060c089013562004a838162004769565b915062004a008a60e08b016200496b565b5f6020828403121562004aa5575f80fd5b813561ffff8116811462004ab7575f80fd5b9392505050565b5f6020828403121562004acf575f80fd5b5035919050565b5f806040838503121562004ae8575f80fd5b82359150602083013562004afc8162004769565b809150509250929050565b5f6020828403121562004b18575f80fd5b62000f81826200477e565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171562004b625762004b6262004b23565b604052919050565b5f82601f83011262004b7a575f80fd5b81356001600160401b0381111562004b965762004b9662004b23565b62004bab601f8201601f191660200162004b37565b81815284602083860101111562004bc0575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f805f60e0888a03121562004bf3575f80fd5b62004bfe886200487e565b965062004c0e602089016200477e565b9550604088013562004c208162004769565b9450606088013562004c328162004769565b9350608088013562004c448162004769565b925060a08801356001600160401b038082111562004c60575f80fd5b62004c6e8b838c0162004b6a565b935060c08a013591508082111562004c84575f80fd5b5062004c938a828b0162004b6a565b91505092959891949750929550565b5f805f805f8060c0878903121562004cb8575f80fd5b62004cc3876200487e565b955062004cd3602088016200477e565b945062004ce3604088016200477e565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b8381101562004d2057818101518382015260200162004d06565b50505f910152565b5f815180845262004d4181602086016020860162004d04565b601f01601f19169290920160200192915050565b602081525f62000f81602083018462004d28565b5f602080838503121562004d7b575f80fd5b82356001600160401b038082111562004d92575f80fd5b818501915085601f83011262004da6575f80fd5b81358181111562004dbb5762004dbb62004b23565b8060051b915062004dce84830162004b37565b818152918301840191848101908884111562004de8575f80fd5b938501935b8385101562004e085784358252938501939085019062004ded565b98975050505050505050565b5f806040838503121562004e26575f80fd5b62004e31836200477e565b946020939093013593505050565b6001600160a01b0391909116815260200190565b5f805f806060858703121562004e67575f80fd5b843562004e748162004769565b935062004e84602086016200487e565b925060408501356001600160401b038082111562004ea0575f80fd5b818701915087601f83011262004eb4575f80fd5b81358181111562004ec3575f80fd5b88602082850101111562004ed5575f80fd5b95989497505060200194505050565b5f6020828403121562004ef5575f80fd5b813562004ab78162004769565b803560ff8116811462003495575f80fd5b5f805f805f8060c0878903121562004f29575f80fd5b863562004f368162004769565b9550602087013562004f488162004769565b945062004f58604088016200477e565b935062004f68606088016200477e565b92506080870135915062004f7f60a0880162004f02565b90509295509295509295565b5f805f805f8060c0878903121562004fa1575f80fd5b863562004fae8162004769565b9550602087013562004fc08162004769565b945062004fd0604088016200477e565b935062004fe06060880162004f02565b92506080870135915060a08701356001600160401b0381111562005002575f80fd5b6200501089828a0162004b6a565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b80545f90600181811c90808316806200508557607f831692505b60208084108203620050a557634e487b7160e01b5f52602260045260245ffd5b83885260208801828015620050c35760018114620050da5762005105565b60ff198716825285151560051b8201975062005105565b5f898152602090205f5b87811015620050ff57815484820152908601908401620050e4565b83019850505b5050505050505092915050565b6001600160a01b0386811682528516602082015260a0604082018190525f906200513f908301866200506b565b82810360608401526200515381866200506b565b9150508260808301529695505050505050565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03818116838216019080821115620051be57620051be62005187565b5092915050565b808202811582820484141762000f845762000f8462005187565b5f63ffffffff808316818103620051fa57620051fa62005187565b6001019392505050565b6001600160a01b038481168252831660208201526060604082018190525f90620052319083018462004d28565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190525f906200527b9083018562004d28565b82810360a08401526200528f818562004d28565b9998505050505050505050565b6001600160401b03828116828216039080821115620051be57620051be62005187565b5f6001600160401b038281166002600160401b03198101620051fa57620051fa62005187565b634e487b7160e01b5f52603260045260245ffd5b8082018082111562000f845762000f8462005187565b5f6001820162005323576200532362005187565b5060010190565b5f602082840312156200533b575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8262005367576200536762005342565b500490565b5f826200537d576200537d62005342565b500690565b8181038181111562000f845762000f8462005187565b918252602082015260400190565b5f81620053b757620053b762005187565b505f190190565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190525f9062004e089083018462004d28565b5f82516200545c81846020870162004d04565b9190910192915050565b6103208101610300808584378201835f5b60018110156200549857815183526020928301929091019060010162005477565b5050509392505050565b5f60208284031215620054b3575f80fd5b8151801515811462004ab7575f80fd5b5f6001600160401b0383811680620054df57620054df62005342565b9216919091049291505056fe60a06040526040516108b83803806108b883398101604081905261002291610349565b828161002e8282610056565b50506001600160a01b03821660805261004e61004960805190565b6100b4565b50505061042e565b61005f82610121565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100a8576100a3828261019f565b505050565b6100b0610212565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f35f80516020610898833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161011e81610233565b50565b806001600160a01b03163b5f0361015b57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516101bb9190610413565b5f60405180830381855af49150503d805f81146101f3576040519150601f19603f3d011682016040523d82523d5f602084013e6101f8565b606091505b509092509050610209858383610270565b95945050505050565b34156102315760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661025c57604051633173bdd160e11b81525f6004820152602401610152565b805f8051602061089883398151915261017e565b60608261028557610280826102cf565b6102c8565b815115801561029c57506001600160a01b0384163b155b156102c557604051639996b31560e01b81526001600160a01b0385166004820152602401610152565b50805b9392505050565b8051156102df5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461030e575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015610341578181015183820152602001610329565b50505f910152565b5f805f6060848603121561035b575f80fd5b610364846102f8565b9250610372602085016102f8565b60408501519092506001600160401b038082111561038e575f80fd5b818601915086601f8301126103a1575f80fd5b8151818111156103b3576103b3610313565b604051601f8201601f19908116603f011681019083821181831017156103db576103db610313565b816040528281528960208487010111156103f3575f80fd5b610404836020830160208801610327565b80955050505050509250925092565b5f8251610424818460208701610327565b9190910192915050565b6080516104536104455f395f601001526104535ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610069575f356001600160e01b03191663278f794360e11b146100615761005f61006d565b565b61005f61007d565b61005f5b61005f6100786100ab565b6100cf565b5f8061008c36600481846102ba565b81019061009991906102f5565b915091506100a782826100ed565b5050565b5f6100ca5f805160206103fe833981519152546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156100e9573d5ff35b3d5ffd5b6100f682610147565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561013f5761013a82826101aa565b505050565b6100a761021c565b806001600160a01b03163b5f0361017c5780604051634c9c8ce360e01b815260040161017391906103bd565b60405180910390fd5b5f805160206103fe83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101c691906103d1565b5f60405180830381855af49150503d805f81146101fe576040519150601f19603f3d011682016040523d82523d5f602084013e610203565b606091505b509150915061021385838361023b565b95945050505050565b341561005f5760405163b398979f60e01b815260040160405180910390fd5b6060826102505761024b82610291565b61028a565b815115801561026757506001600160a01b0384163b155b156102875783604051639996b31560e01b815260040161017391906103bd565b50805b9392505050565b8051156102a15780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f80858511156102c8575f80fd5b838611156102d4575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610306575f80fd5b82356001600160a01b038116811461031c575f80fd5b915060208301356001600160401b0380821115610337575f80fd5b818501915085601f83011261034a575f80fd5b81358181111561035c5761035c6102e1565b604051601f8201601f19908116603f01168101908382118183101715610384576103846102e1565b8160405282815288602084870101111561039c575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b5f82515f5b818110156103f057602081860181015185830152016103d6565b505f92019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220d3b91b386436af95579d7d767b3c6e83ae79b09bd8dd9344bddb95185404c56564736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a26469706673582212207e99d5f87d7f70d36ef1507ceaaad2e7eded13630b5d2250efa94776f41f581464736f6c63430008140033", + "bytecode": "0x60e060405234801562000010575f80fd5b50604051620061893803806200618983398101604081905262000033916200013c565b6001600160a01b0380841660805280831660c052811660a0528282826200005962000065565b5050505050506200018d565b5f54610100900460ff1615620000d15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101562000122575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811462000139575f80fd5b50565b5f805f606084860312156200014f575f80fd5b83516200015c8162000124565b60208501519093506200016f8162000124565b6040850151909250620001828162000124565b809150509250925092565b60805160a05160c051615f99620001f05f395f81816109d2015281816122910152613b0d01525f818161079a01528181612de50152613dfb01525f818161092c015281816112e90152818161149101528181611f7b0152613cf00152615f995ff3fe608060405234801562000010575f80fd5b5060043610620002b4575f3560e01c80630645af0914620002b8578063066ec01214620002d1578063080b311114620002fd5780630a0d9fbe14620003255780630e36f582146200034057806311f6b287146200035757806312b86e19146200036e5780631489ed10146200038557806315064c96146200039c5780631608859c14620003aa5780631796a1ae14620003c15780631816b7e514620003e85780632072f6c514620003ff578063248a9ca3146200040957806325280169146200042f5780632f2ff15d14620004e357806330c27dde14620004fa57806336568abe146200050e578063394218e91462000525578063477fa270146200053c57806355a71ee0146200054557806360469169146200058857806365c0504d14620005925780637222020f1462000640578063727885e914620006575780637975fcfe146200066e5780637fb6e76a1462000694578063841b24d714620006bc57806387c20c0114620006d75780638bd4f07114620006ee5780638f698ec5146200070557806391d14854146200071c57806399f5634e14620007335780639a908e73146200073d5780639c9f3dfe1462000754578063a066215c146200076b578063a217fddf1462000782578063a2967d99146200078a578063a3c573eb1462000794578063afd23cbe14620007cb578063b99d0ad714620007f5578063c1acbc3414620008cc578063c4c928c214620008e7578063ceee281d14620008fe578063d02103ca1462000926578063d5073f6f146200094e578063d547741f1462000965578063d939b315146200097c578063dbc169761462000990578063dde0ff77146200099a578063e0bfd3d214620009b5578063e46761c414620009cc578063f34eb8eb14620009f4578063f4e926751462000a0b578063f9c4c2ae1462000a1c575b5f80fd5b620002cf620002c936600462004795565b62000b32565b005b608454620002e5906001600160401b031681565b604051620002f491906200486a565b60405180910390f35b620003146200030e36600462004892565b62000f61565b6040519015158152602001620002f4565b608554620002e590600160401b90046001600160401b031681565b620002cf62000351366004620048c8565b62000f8a565b620002e5620003683660046200494f565b62001221565b620002cf6200037f3660046200497d565b62001240565b620002cf6200039636600462004a0f565b620013e8565b606f54620003149060ff1681565b620002cf620003bb36600462004892565b62001570565b607e54620003d29063ffffffff1681565b60405163ffffffff9091168152602001620002f4565b620002cf620003f936600462004a94565b62001603565b620002cf620016ae565b620004206200041a36600462004abe565b62001773565b604051908152602001620002f4565b620004af6200044036600462004892565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002f4565b620002cf620004f436600462004ad6565b62001787565b608754620002e5906001600160401b031681565b620002cf6200051f36600462004ad6565b620017a9565b620002cf6200053636600462004b07565b620017e3565b60865462000420565b620004206200055636600462004892565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b6200042062001891565b620005f6620005a33660046200494f565b607f6020525f90815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002f4565b620002cf620006513660046200494f565b620018a8565b620002cf6200066836600462004bdc565b62001990565b620006856200067f36600462004ca2565b62001ddb565b604051620002f4919062004d55565b620003d2620006a536600462004b07565b60836020525f908152604090205463ffffffff1681565b608454620002e590600160c01b90046001600160401b031681565b620002cf620006e836600462004a0f565b62001e0d565b620002cf620006ff3660046200497d565b62002128565b620002cf6200071636600462004d69565b620021df565b620003146200072d36600462004ad6565b62002263565b620004206200228d565b620002e56200074e36600462004e14565b62002373565b620002cf6200076536600462004b07565b6200253a565b620002cf6200077c36600462004b07565b620025dc565b620004205f81565b620004206200267a565b620007bc7f000000000000000000000000000000000000000000000000000000000000000081565b604051620002f4919062004e3f565b608554620007e190600160801b900461ffff1681565b60405161ffff9091168152602001620002f4565b6200088a6200080636600462004892565b60408051608080820183525f8083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002f4919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002e590600160801b90046001600160401b031681565b620002cf620008f836600462004e53565b62002a2f565b620003d26200090f36600462004ee4565b60826020525f908152604090205463ffffffff1681565b620007bc7f000000000000000000000000000000000000000000000000000000000000000081565b620002cf6200095f36600462004abe565b62002cf2565b620002cf6200097636600462004ad6565b62002d7c565b608554620002e5906001600160401b031681565b620002cf62002d9e565b608454620002e590600160401b90046001600160401b031681565b620002cf620009c636600462004f13565b62002e57565b620007bc7f000000000000000000000000000000000000000000000000000000000000000081565b620002cf62000a0536600462004f8b565b62002f19565b608054620003d29063ffffffff1681565b62000ab262000a2d3660046200494f565b60816020525f9081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002f4565b5f54600290610100900460ff1615801562000b5357505f5460ff8083169116105b62000b7b5760405162461bcd60e51b815260040162000b72906200501d565b60405180910390fd5b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000bfb620030fb565b62000c155f8051602062005f448339815191528c62003167565b62000c215f8862003167565b62000c3b5f8051602062005e248339815191528862003167565b62000c555f8051602062005ea48339815191528862003167565b62000c6f5f8051602062005dc48339815191528862003167565b62000c895f8051602062005e048339815191528962003167565b62000ca35f8051602062005f248339815191528962003167565b62000cbd5f8051602062005e448339815191528962003167565b62000cd75f8051602062005ec48339815191528962003167565b62000cff5f8051602062005f448339815191525f8051602062005da483398151915262003173565b62000d195f8051602062005da48339815191528962003167565b62000d335f8051602062005de48339815191528962003167565b62000d5b5f8051602062005f048339815191525f8051602062005ee483398151915262003173565b62000d755f8051602062005f048339815191528762003167565b62000d8f5f8051602062005ee48339815191528762003167565b6073546074546001600160401b03600160401b9092048216911680821462000dca57604051632e4cc54360e11b815260040160405180910390fd5b5f62000def888888885f60745f9054906101000a90046001600160401b0316620031c6565b6001600160401b038381165f81815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b91829004909b1681029a909a17905560068a01805490911690931797870297909717909155600787018054909616909417909455607a54606f549390915290549251635d6717a560e01b81529394506001600160a01b038c811694635d6717a59462000eec9493831693600160581b9004909216916076916077919060040162005112565b5f604051808303815f87803b15801562000f04575f80fd5b505af115801562000f17573d5f803e3d5ffd5b50505f805461ff0019169055505060405160ff851681525f8051602062005e848339815191529350602001915062000f4c9050565b60405180910390a15050505050505050505050565b63ffffffff82165f90815260816020526040812062000f819083620033e7565b90505b92915050565b5f54600290610100900460ff1615801562000fab57505f5460ff8083169116105b62000fca5760405162461bcd60e51b815260040162000b72906200501d565b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200104a620030fb565b620010645f8051602062005f448339815191528862003167565b620010705f8462003167565b6200108a5f8051602062005e248339815191528462003167565b620010a45f8051602062005ea48339815191528462003167565b620010be5f8051602062005dc48339815191528462003167565b620010d85f8051602062005e048339815191528562003167565b620010f25f8051602062005f248339815191528562003167565b6200110c5f8051602062005e448339815191528562003167565b620011265f8051602062005ec48339815191528562003167565b6200114e5f8051602062005f448339815191525f8051602062005da483398151915262003173565b620011685f8051602062005da48339815191528562003167565b620011825f8051602062005de48339815191528562003167565b620011aa5f8051602062005f048339815191525f8051602062005ee483398151915262003173565b620011c45f8051602062005f048339815191528362003167565b620011de5f8051602062005ee48339815191528362003167565b620011ea5f3362003167565b5f805461ff001916905560405160ff821681525f8051602062005e848339815191529060200160405180910390a150505050505050565b63ffffffff81165f90815260816020526040812062000f84906200342b565b5f8051602062005f448339815191526200125a816200349a565b63ffffffff89165f90815260816020526040902062001280818a8a8a8a8a8a8a620034a6565b600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b90041615620012e7576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620013206200267a565b6040518263ffffffff1660e01b81526004016200133f91815260200190565b5f604051808303815f87803b15801562001357575f80fd5b505af11580156200136a573d5f803e3d5ffd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b5f8051602062005f4483398151915262001402816200349a565b63ffffffff89165f90815260816020526040902062001428818a8a8a8a8a8a8a62003822565b600681018054600160401b600160801b031916600160401b6001600160401b038a81169182029290921783555f9081526002840160205260409020879055600583018890559054600160801b900416156200148f576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620014c86200267a565b6040518263ffffffff1660e01b8152600401620014e791815260200190565b5f604051808303815f87803b158015620014ff575f80fd5b505af115801562001512573d5f803e3d5ffd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a6040516200155c9392919062005166565b60405180910390a350505050505050505050565b63ffffffff82165f9081526081602052604090206200159e5f8051602062005f448339815191523362002263565b620015f257606f5460ff1615620015c857604051630bc011ff60e21b815260040160405180910390fd5b620015d48183620033e7565b620015f257604051630674f25160e11b815260040160405180910390fd5b620015fe818362003c0e565b505050565b5f8051602062005ec48339815191526200161d816200349a565b6103e88261ffff1610806200163757506103ff8261ffff16115b156200165657604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620016c85f8051602062005f048339815191523362002263565b6200176757608454600160801b90046001600160401b0316158062001718575060845442906200170d9062093a8090600160801b90046001600160401b03166200519b565b6001600160401b0316115b8062001748575060875442906200173d9062093a80906001600160401b03166200519b565b6001600160401b0316115b15620017675760405163692baaad60e11b815260040160405180910390fd5b6200177162003df9565b565b5f9081526034602052604090206001015490565b620017928262001773565b6200179d816200349a565b620015fe838362003e73565b6001600160a01b0381163314620017d357604051630b4ad1cd60e31b815260040160405180910390fd5b620017df828262003ede565b5050565b5f8051602062005ec4833981519152620017fd816200349a565b606f5460ff166200183f576084546001600160401b03600160c01b9091048116908316106200183f5760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190620016a29084906200486a565b5f6086546064620018a39190620051c5565b905090565b5f8051602062005e04833981519152620018c2816200349a565b63ffffffff82161580620018e15750607e5463ffffffff908116908316115b156200190057604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f60205260409020600180820154600160e81b900460ff16151590036200194657604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b5f8051602062005f24833981519152620019aa816200349a565b63ffffffff88161580620019c95750607e5463ffffffff908116908916115b15620019e857604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88165f908152607f60205260409020600180820154600160e81b900460ff161515900362001a2e57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b0388165f9081526083602052604090205463ffffffff161562001a6b576040516337c8fe0960e11b815260040160405180910390fd5b608080545f9190829062001a859063ffffffff16620051df565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b0390921691309162001ad2906200475b565b62001ae09392919062005204565b604051809103905ff08015801562001afa573d5f803e3d5ffd5b5090508160835f8c6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508a815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001d5e949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001d9e908d908d9088908e908e908e906004016200523a565b5f604051808303815f87803b15801562001db6575f80fd5b505af115801562001dc9573d5f803e3d5ffd5b50505050505050505050505050505050565b63ffffffff86165f90815260816020526040902060609062001e0290878787878762003f47565b979650505050505050565b606f5460ff161562001e3257604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001e8092600160c01b9004811691166200519b565b6001600160401b0316111562001ea957604051638a0704d360e01b815260040160405180910390fd5b6103e862001eb888886200529c565b6001600160401b0316111562001ee157604051635acfba9d60e11b815260040160405180910390fd5b62001ef3818989898989898962003822565b62001eff818762004081565b6085546001600160401b03165f036200200657600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562001f79576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001fb26200267a565b6040518263ffffffff1660e01b815260040162001fd191815260200190565b5f604051808303815f87803b15801562001fe9575f80fd5b505af115801562001ffc573d5f803e3d5ffd5b50505050620020cf565b620020118162004278565b600681018054600160801b90046001600160401b03169060106200203583620052bf565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b900487165f90815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b4888789604051620021159392919062005166565b60405180910390a3505050505050505050565b606f5460ff16156200214d57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f908152608160205260409020620021738189898989898989620034a6565b6001600160401b0387165f9081526004820160209081526040918290206002015482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620021d462003df9565b505050505050505050565b80516080805463ffffffff191663ffffffff9092169190911790555f5b8151811015620017df578181815181106200221b576200221b620052e5565b602002602001015160815f836001620022359190620052f9565b63ffffffff16815260208101919091526040015f2060050155806200225a816200530f565b915050620021fc565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401620022dd919062004e3f565b602060405180830381865afa158015620022f9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200231f91906200532a565b6084549091505f9062002345906001600160401b03600160401b8204811691166200529c565b6001600160401b03169050805f0362002360575f9250505090565b6200236c818362005356565b9250505090565b606f545f9060ff16156200239a57604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff1690819003620023d1576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f03620023fb57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f90815260816020526040812060848054919287926200242d9084906001600160401b03166200519b565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f6200246287836200519b565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f95865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b031990921692909316919091171790559050620024f08362004278565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a25826040516200252891906200486a565b60405180910390a29695505050505050565b5f8051602062005ec483398151915262002554816200349a565b606f5460ff166200258f576085546001600160401b03908116908316106200258f5760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590620016a29084906200486a565b5f8051602062005ec4833981519152620025f6816200349a565b62015180826001600160401b031611156200262457604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890620016a29084906200486a565b6080545f9063ffffffff168082036200269457505f919050565b5f816001600160401b03811115620026b057620026b062004b23565b604051908082528060200260200182016040528015620026da578160200160208202803683370190505b5090505f5b828110156200274a5760815f620026f8836001620052f9565b63ffffffff1663ffffffff1681526020019081526020015f20600501548282815181106200272a576200272a620052e5565b60209081029190910101528062002741816200530f565b915050620026df565b505f60205b836001146200298a575f620027666002866200536c565b6200277360028762005356565b6200277f9190620052f9565b90505f816001600160401b038111156200279d576200279d62004b23565b604051908082528060200260200182016040528015620027c7578160200160208202803683370190505b5090505f5b828110156200293e57620027e260018462005382565b81148015620027fd5750620027f96002886200536c565b6001145b156200287d578562002811826002620051c5565b81518110620028245762002824620052e5565b6020026020010151856040516020016200284092919062005398565b604051602081830303815290604052805190602001208282815181106200286b576200286b620052e5565b60200260200101818152505062002929565b856200288b826002620051c5565b815181106200289e576200289e620052e5565b602002602001015186826002620028b69190620051c5565b620028c3906001620052f9565b81518110620028d657620028d6620052e5565b6020026020010151604051602001620028f192919062005398565b604051602081830303815290604052805190602001208282815181106200291c576200291c620052e5565b6020026020010181815250505b8062002935816200530f565b915050620027cc565b5080945081955083846040516020016200295a92919062005398565b60405160208183030381529060405280519060200120935082806200297f90620053a6565b93505050506200274f565b5f835f81518110620029a057620029a0620052e5565b602002602001015190505f5b8281101562002a25578184604051602001620029ca92919062005398565b6040516020818303038152906040528051906020012091508384604051602001620029f792919062005398565b604051602081830303815290604052805190602001209350808062002a1c906200530f565b915050620029ac565b5095945050505050565b5f8051602062005dc483398151915262002a49816200349a565b63ffffffff8416158062002a685750607e5463ffffffff908116908516115b1562002a8757604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526082602052604081205463ffffffff169081900362002ac7576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002b1557604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86165f908152607f60205260409020600180820154600160e81b900460ff161515900362002b5b57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002b9957604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790555f62002c188462001221565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002c6d9216908b908b90600401620053be565b5f604051808303815f87803b15801562002c85575f80fd5b505af115801562002c98573d5f803e3d5ffd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b5f8051602062005de483398151915262002d0c816200349a565b683635c9adc5dea0000082118062002d275750633b9aca0082105b1562002d4657604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620016a2565b62002d878262001773565b62002d92816200349a565b620015fe838362003ede565b5f8051602062005e4483398151915262002db8816200349a565b608780546001600160401b031916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc16976916004808301925f92919082900301818387803b15801562002e33575f80fd5b505af115801562002e46573d5f803e3d5ffd5b5050505062002e5462004341565b50565b5f8051602062005ea483398151915262002e71816200349a565b6001600160401b0384165f9081526083602052604090205463ffffffff161562002eae576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b0387165f9081526082602052604090205463ffffffff161562002eeb57604051630d409b9360e41b815260040160405180910390fd5b5f62002efc88888888875f620031c6565b5f8080526002909101602052604090209390935550505050505050565b5f8051602062005e2483398151915262002f33816200349a565b607e80545f9190829062002f4d9063ffffffff16620051df565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff1681526020015f1515815260200185815250607f5f8363ffffffff1663ffffffff1681526020019081526020015f205f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620030e996959493929190620053fd565b60405180910390a25050505050505050565b5f54610100900460ff16620017715760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b72565b620017df828262003e73565b5f6200317f8362001773565b5f84815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080545f9182918290620031e19063ffffffff16620051df565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f876001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff16021790555060815f8263ffffffff1663ffffffff1681526020019081526020015f20915087825f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b0316021790555086826001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555084825f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620033d49594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b038281165f90815260048501602052604081205490924292620034199291811691166200519b565b6001600160401b031611159392505050565b60068101545f90600160801b90046001600160401b0316156200347d575060068101546001600160401b03600160801b90910481165f9081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002e54813362004399565b60078801545f906001600160401b039081169087161015620034db5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038816156200357b5760068901546001600160401b03600160801b90910481169089161115620035255760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f90815260048a0160205260409020600281015481549092888116600160401b90920416146200357457604051632bd2e3e760e01b815260040160405180910390fd5b50620035ef565b506001600160401b0385165f90815260028901602052604090205480620035b5576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620035ef57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620036285750876001600160401b0316876001600160401b031611155b806200364c575060068901546001600160401b03600160c01b909104811690881611155b156200366b5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260048b016020526040902054600160401b9004811690861614620036b1576040516332a2a77f60e01b815260040160405180910390fd5b5f620036c28a888888868962003f47565b90505f5f8051602062005e64833981519152600283604051620036e6919062005449565b602060405180830381855afa15801562003702573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200372791906200532a565b6200373391906200536c565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620037779188919060040162005466565b602060405180830381865afa15801562003793573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620037b99190620054a2565b620037d7576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260048c016020526040902060020154859003620038155760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b5f806200382f8a6200342b565b60078b01549091506001600160401b039081169089161015620038655760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620039075760068a01546001600160401b03600160801b9091048116908a161115620038af5760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a165f90815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200390057604051632bd2e3e760e01b815260040160405180910390fd5b5062003976565b6001600160401b0388165f90815260028b01602052604090205491508162003942576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200397657604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620039a95760405163b9b18f5760e01b815260040160405180910390fd5b5f620039ba8b8a8a8a878b62003f47565b90505f5f8051602062005e64833981519152600283604051620039de919062005449565b602060405180830381855afa158015620039fa573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019062003a1f91906200532a565b62003a2b91906200536c565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003a6f9189919060040162005466565b602060405180830381865afa15801562003a8b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062003ab19190620054a2565b62003acf576040516309bde33960e01b815260040160405180910390fd5b5f62003adc848b6200529c565b905062003b3587826001600160401b031662003af76200228d565b62003b039190620051c5565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620043c3565b80608460088282829054906101000a90046001600160401b031662003b5b91906200519b565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d153906064015f604051808303815f87803b15801562003be8575f80fd5b505af115801562003bfb573d5f803e3d5ffd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003c4d575060068201546001600160401b03600160801b9091048116908216115b1562003c6c5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f81815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003d276200267a565b6040518263ffffffff1660e01b815260040162003d4691815260200190565b5f604051808303815f87803b15801562003d5e575f80fd5b505af115801562003d71573d5f803e3d5ffd5b505085546001600160a01b03165f90815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801562003e52575f80fd5b505af115801562003e65573d5f803e3d5ffd5b505050506200177162004417565b62003e7f828262002263565b620017df575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003eea828262002263565b15620017df575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086165f818152600389016020526040808220549388168252902054606092911580159062003f7c575081155b1562003f9b5760405163340c614f60e11b815260040160405180910390fd5b8062003fba576040516366385b5160e01b815260040160405180910390fd5b62003fc58462004473565b62003fe3576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b5f6200408d836200342b565b9050815f806200409e84846200529c565b6085546001600160401b0391821692505f91620040c491600160401b9004164262005382565b90505b846001600160401b0316846001600160401b0316146200414d576001600160401b038085165f9081526003890160205260409020600181015490911682101562004128576001810154600160401b90046001600160401b0316945062004146565b6200413486866200529c565b6001600160401b03169350506200414d565b50620040c7565b5f6200415a848462005382565b905083811015620041b857808403600c81116200417857806200417b565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620041ad57620041ad62005342565b04608655506200422f565b838103600c8111620041cb5780620041ce565b600c5b90505f816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162004207576200420762005342565b04905080608654670de0b6b3a7640000028162004228576200422862005342565b0460865550505b683635c9adc5dea0000060865411156200425657683635c9adc5dea000006086556200426e565b633b9aca0060865410156200426e57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002e545760068101545f90620042c290600160c01b90046001600160401b031660016200519b565b9050620042d08282620033e7565b15620017df5760068201545f90600290620042fd908490600160801b90046001600160401b03166200529c565b620043099190620054c3565b6200431590836200519b565b9050620043238382620033e7565b156200433557620015fe838262003c0e565b620015fe838362003c0e565b606f5460ff166200436557604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b620043a5828262002263565b620017df57604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620015fe908490620044f7565b606f5460ff16156200443c57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff000000016001600160401b038316108015620044a9575067ffffffff00000001604083901c6001600160401b0316105b8015620044ca575067ffffffff00000001608083901c6001600160401b0316105b8015620044e2575067ffffffff0000000160c083901c105b15620044f057506001919050565b505f919050565b5f6200454d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620045cf9092919063ffffffff16565b805190915015620015fe57808060200190518101906200456e9190620054a2565b620015fe5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b72565b6060620045df84845f85620045e7565b949350505050565b6060824710156200464a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b72565b5f80866001600160a01b0316858760405162004667919062005449565b5f6040518083038185875af1925050503d805f8114620046a3576040519150601f19603f3d011682016040523d82523d5f602084013e620046a8565b606091505b509150915062001e028783838760608315620047285782515f0362004720576001600160a01b0385163b620047205760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b72565b5081620045df565b620045df83838151156200473f5781518083602001fd5b8060405162461bcd60e51b815260040162000b72919062004d55565b6108b880620054ec83390190565b6001600160a01b038116811462002e54575f80fd5b80356001600160401b038116811462003495575f80fd5b5f805f805f805f805f806101408b8d031215620047b0575f80fd5b8a35620047bd8162004769565b9950620047cd60208c016200477e565b9850620047dd60408c016200477e565b975060608b0135620047ef8162004769565b965060808b0135620048018162004769565b955060a08b0135620048138162004769565b945060c08b0135620048258162004769565b935060e08b0135620048378162004769565b9250620048486101008c016200477e565b9150620048596101208c016200477e565b90509295989b9194979a5092959850565b6001600160401b0391909116815260200190565b803563ffffffff8116811462003495575f80fd5b5f8060408385031215620048a4575f80fd5b620048af836200487e565b9150620048bf602084016200477e565b90509250929050565b5f805f805f8060c08789031215620048de575f80fd5b8635620048eb8162004769565b9550620048fb602088016200477e565b94506200490b604088016200477e565b935060608701356200491d8162004769565b925060808701356200492f8162004769565b915060a0870135620049418162004769565b809150509295509295509295565b5f6020828403121562004960575f80fd5b62000f81826200487e565b80610300810183101562000f84575f80fd5b5f805f805f805f806103e0898b03121562004996575f80fd5b620049a1896200487e565b9750620049b160208a016200477e565b9650620049c160408a016200477e565b9550620049d160608a016200477e565b9450620049e160808a016200477e565b935060a0890135925060c0890135915062004a008a60e08b016200496b565b90509295985092959890939650565b5f805f805f805f806103e0898b03121562004a28575f80fd5b62004a33896200487e565b975062004a4360208a016200477e565b965062004a5360408a016200477e565b955062004a6360608a016200477e565b94506080890135935060a0890135925060c089013562004a838162004769565b915062004a008a60e08b016200496b565b5f6020828403121562004aa5575f80fd5b813561ffff8116811462004ab7575f80fd5b9392505050565b5f6020828403121562004acf575f80fd5b5035919050565b5f806040838503121562004ae8575f80fd5b82359150602083013562004afc8162004769565b809150509250929050565b5f6020828403121562004b18575f80fd5b62000f81826200477e565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171562004b625762004b6262004b23565b604052919050565b5f82601f83011262004b7a575f80fd5b81356001600160401b0381111562004b965762004b9662004b23565b62004bab601f8201601f191660200162004b37565b81815284602083860101111562004bc0575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f805f60e0888a03121562004bf3575f80fd5b62004bfe886200487e565b965062004c0e602089016200477e565b9550604088013562004c208162004769565b9450606088013562004c328162004769565b9350608088013562004c448162004769565b925060a08801356001600160401b038082111562004c60575f80fd5b62004c6e8b838c0162004b6a565b935060c08a013591508082111562004c84575f80fd5b5062004c938a828b0162004b6a565b91505092959891949750929550565b5f805f805f8060c0878903121562004cb8575f80fd5b62004cc3876200487e565b955062004cd3602088016200477e565b945062004ce3604088016200477e565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b8381101562004d2057818101518382015260200162004d06565b50505f910152565b5f815180845262004d4181602086016020860162004d04565b601f01601f19169290920160200192915050565b602081525f62000f81602083018462004d28565b5f602080838503121562004d7b575f80fd5b82356001600160401b038082111562004d92575f80fd5b818501915085601f83011262004da6575f80fd5b81358181111562004dbb5762004dbb62004b23565b8060051b915062004dce84830162004b37565b818152918301840191848101908884111562004de8575f80fd5b938501935b8385101562004e085784358252938501939085019062004ded565b98975050505050505050565b5f806040838503121562004e26575f80fd5b62004e31836200477e565b946020939093013593505050565b6001600160a01b0391909116815260200190565b5f805f806060858703121562004e67575f80fd5b843562004e748162004769565b935062004e84602086016200487e565b925060408501356001600160401b038082111562004ea0575f80fd5b818701915087601f83011262004eb4575f80fd5b81358181111562004ec3575f80fd5b88602082850101111562004ed5575f80fd5b95989497505060200194505050565b5f6020828403121562004ef5575f80fd5b813562004ab78162004769565b803560ff8116811462003495575f80fd5b5f805f805f8060c0878903121562004f29575f80fd5b863562004f368162004769565b9550602087013562004f488162004769565b945062004f58604088016200477e565b935062004f68606088016200477e565b92506080870135915062004f7f60a0880162004f02565b90509295509295509295565b5f805f805f8060c0878903121562004fa1575f80fd5b863562004fae8162004769565b9550602087013562004fc08162004769565b945062004fd0604088016200477e565b935062004fe06060880162004f02565b92506080870135915060a08701356001600160401b0381111562005002575f80fd5b6200501089828a0162004b6a565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b80545f90600181811c90808316806200508557607f831692505b60208084108203620050a557634e487b7160e01b5f52602260045260245ffd5b83885260208801828015620050c35760018114620050da5762005105565b60ff198716825285151560051b8201975062005105565b5f898152602090205f5b87811015620050ff57815484820152908601908401620050e4565b83019850505b5050505050505092915050565b6001600160a01b0386811682528516602082015260a0604082018190525f906200513f908301866200506b565b82810360608401526200515381866200506b565b9150508260808301529695505050505050565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03818116838216019080821115620051be57620051be62005187565b5092915050565b808202811582820484141762000f845762000f8462005187565b5f63ffffffff808316818103620051fa57620051fa62005187565b6001019392505050565b6001600160a01b038481168252831660208201526060604082018190525f90620052319083018462004d28565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190525f906200527b9083018562004d28565b82810360a08401526200528f818562004d28565b9998505050505050505050565b6001600160401b03828116828216039080821115620051be57620051be62005187565b5f6001600160401b038281166002600160401b03198101620051fa57620051fa62005187565b634e487b7160e01b5f52603260045260245ffd5b8082018082111562000f845762000f8462005187565b5f6001820162005323576200532362005187565b5060010190565b5f602082840312156200533b575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8262005367576200536762005342565b500490565b5f826200537d576200537d62005342565b500690565b8181038181111562000f845762000f8462005187565b918252602082015260400190565b5f81620053b757620053b762005187565b505f190190565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190525f9062004e089083018462004d28565b5f82516200545c81846020870162004d04565b9190910192915050565b6103208101610300808584378201835f5b60018110156200549857815183526020928301929091019060010162005477565b5050509392505050565b5f60208284031215620054b3575f80fd5b8151801515811462004ab7575f80fd5b5f6001600160401b0383811680620054df57620054df62005342565b9216919091049291505056fe60a06040526040516108b83803806108b883398101604081905261002291610349565b828161002e8282610056565b50506001600160a01b03821660805261004e61004960805190565b6100b4565b50505061042e565b61005f82610121565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100a8576100a3828261019f565b505050565b6100b0610212565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f35f80516020610898833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161011e81610233565b50565b806001600160a01b03163b5f0361015b57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516101bb9190610413565b5f60405180830381855af49150503d805f81146101f3576040519150601f19603f3d011682016040523d82523d5f602084013e6101f8565b606091505b509092509050610209858383610270565b95945050505050565b34156102315760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661025c57604051633173bdd160e11b81525f6004820152602401610152565b805f8051602061089883398151915261017e565b60608261028557610280826102cf565b6102c8565b815115801561029c57506001600160a01b0384163b155b156102c557604051639996b31560e01b81526001600160a01b0385166004820152602401610152565b50805b9392505050565b8051156102df5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461030e575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015610341578181015183820152602001610329565b50505f910152565b5f805f6060848603121561035b575f80fd5b610364846102f8565b9250610372602085016102f8565b60408501519092506001600160401b038082111561038e575f80fd5b818601915086601f8301126103a1575f80fd5b8151818111156103b3576103b3610313565b604051601f8201601f19908116603f011681019083821181831017156103db576103db610313565b816040528281528960208487010111156103f3575f80fd5b610404836020830160208801610327565b80955050505050509250925092565b5f8251610424818460208701610327565b9190910192915050565b6080516104536104455f395f601001526104535ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610069575f356001600160e01b03191663278f794360e11b146100615761005f61006d565b565b61005f61007d565b61005f5b61005f6100786100ab565b6100cf565b5f8061008c36600481846102ba565b81019061009991906102f5565b915091506100a782826100ed565b5050565b5f6100ca5f805160206103fe833981519152546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156100e9573d5ff35b3d5ffd5b6100f682610147565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561013f5761013a82826101aa565b505050565b6100a761021c565b806001600160a01b03163b5f0361017c5780604051634c9c8ce360e01b815260040161017391906103bd565b60405180910390fd5b5f805160206103fe83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101c691906103d1565b5f60405180830381855af49150503d805f81146101fe576040519150601f19603f3d011682016040523d82523d5f602084013e610203565b606091505b509150915061021385838361023b565b95945050505050565b341561005f5760405163b398979f60e01b815260040160405180910390fd5b6060826102505761024b82610291565b61028a565b815115801561026757506001600160a01b0384163b155b156102875783604051639996b31560e01b815260040161017391906103bd565b50805b9392505050565b8051156102a15780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f80858511156102c8575f80fd5b838611156102d4575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610306575f80fd5b82356001600160a01b038116811461031c575f80fd5b915060208301356001600160401b0380821115610337575f80fd5b818501915085601f83011261034a575f80fd5b81358181111561035c5761035c6102e1565b604051601f8201601f19908116603f01168101908382118183101715610384576103846102e1565b8160405282815288602084870101111561039c575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b5f82515f5b818110156103f057602081860181015185830152016103d6565b505f92019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220d3b91b386436af95579d7d767b3c6e83ae79b09bd8dd9344bddb95185404c56564736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220539899ae68a90ad0286a138b16dbd746c29dc4221aaf7194e411a67a40ef8ad064736f6c63430008140033", + "deployedBytecode": "0x608060405234801562000010575f80fd5b5060043610620002b4575f3560e01c80630645af0914620002b8578063066ec01214620002d1578063080b311114620002fd5780630a0d9fbe14620003255780630e36f582146200034057806311f6b287146200035757806312b86e19146200036e5780631489ed10146200038557806315064c96146200039c5780631608859c14620003aa5780631796a1ae14620003c15780631816b7e514620003e85780632072f6c514620003ff578063248a9ca3146200040957806325280169146200042f5780632f2ff15d14620004e357806330c27dde14620004fa57806336568abe146200050e578063394218e91462000525578063477fa270146200053c57806355a71ee0146200054557806360469169146200058857806365c0504d14620005925780637222020f1462000640578063727885e914620006575780637975fcfe146200066e5780637fb6e76a1462000694578063841b24d714620006bc57806387c20c0114620006d75780638bd4f07114620006ee5780638f698ec5146200070557806391d14854146200071c57806399f5634e14620007335780639a908e73146200073d5780639c9f3dfe1462000754578063a066215c146200076b578063a217fddf1462000782578063a2967d99146200078a578063a3c573eb1462000794578063afd23cbe14620007cb578063b99d0ad714620007f5578063c1acbc3414620008cc578063c4c928c214620008e7578063ceee281d14620008fe578063d02103ca1462000926578063d5073f6f146200094e578063d547741f1462000965578063d939b315146200097c578063dbc169761462000990578063dde0ff77146200099a578063e0bfd3d214620009b5578063e46761c414620009cc578063f34eb8eb14620009f4578063f4e926751462000a0b578063f9c4c2ae1462000a1c575b5f80fd5b620002cf620002c936600462004795565b62000b32565b005b608454620002e5906001600160401b031681565b604051620002f491906200486a565b60405180910390f35b620003146200030e36600462004892565b62000f61565b6040519015158152602001620002f4565b608554620002e590600160401b90046001600160401b031681565b620002cf62000351366004620048c8565b62000f8a565b620002e5620003683660046200494f565b62001221565b620002cf6200037f3660046200497d565b62001240565b620002cf6200039636600462004a0f565b620013e8565b606f54620003149060ff1681565b620002cf620003bb36600462004892565b62001570565b607e54620003d29063ffffffff1681565b60405163ffffffff9091168152602001620002f4565b620002cf620003f936600462004a94565b62001603565b620002cf620016ae565b620004206200041a36600462004abe565b62001773565b604051908152602001620002f4565b620004af6200044036600462004892565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002f4565b620002cf620004f436600462004ad6565b62001787565b608754620002e5906001600160401b031681565b620002cf6200051f36600462004ad6565b620017a9565b620002cf6200053636600462004b07565b620017e3565b60865462000420565b620004206200055636600462004892565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b6200042062001891565b620005f6620005a33660046200494f565b607f6020525f90815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002f4565b620002cf620006513660046200494f565b620018a8565b620002cf6200066836600462004bdc565b62001990565b620006856200067f36600462004ca2565b62001ddb565b604051620002f4919062004d55565b620003d2620006a536600462004b07565b60836020525f908152604090205463ffffffff1681565b608454620002e590600160c01b90046001600160401b031681565b620002cf620006e836600462004a0f565b62001e0d565b620002cf620006ff3660046200497d565b62002128565b620002cf6200071636600462004d69565b620021df565b620003146200072d36600462004ad6565b62002263565b620004206200228d565b620002e56200074e36600462004e14565b62002373565b620002cf6200076536600462004b07565b6200253a565b620002cf6200077c36600462004b07565b620025dc565b620004205f81565b620004206200267a565b620007bc7f000000000000000000000000000000000000000000000000000000000000000081565b604051620002f4919062004e3f565b608554620007e190600160801b900461ffff1681565b60405161ffff9091168152602001620002f4565b6200088a6200080636600462004892565b60408051608080820183525f8083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002f4919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002e590600160801b90046001600160401b031681565b620002cf620008f836600462004e53565b62002a2f565b620003d26200090f36600462004ee4565b60826020525f908152604090205463ffffffff1681565b620007bc7f000000000000000000000000000000000000000000000000000000000000000081565b620002cf6200095f36600462004abe565b62002cf2565b620002cf6200097636600462004ad6565b62002d7c565b608554620002e5906001600160401b031681565b620002cf62002d9e565b608454620002e590600160401b90046001600160401b031681565b620002cf620009c636600462004f13565b62002e57565b620007bc7f000000000000000000000000000000000000000000000000000000000000000081565b620002cf62000a0536600462004f8b565b62002f19565b608054620003d29063ffffffff1681565b62000ab262000a2d3660046200494f565b60816020525f9081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002f4565b5f54600290610100900460ff1615801562000b5357505f5460ff8083169116105b62000b7b5760405162461bcd60e51b815260040162000b72906200501d565b60405180910390fd5b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000bfb620030fb565b62000c155f8051602062005f448339815191528c62003167565b62000c215f8862003167565b62000c3b5f8051602062005e248339815191528862003167565b62000c555f8051602062005ea48339815191528862003167565b62000c6f5f8051602062005dc48339815191528862003167565b62000c895f8051602062005e048339815191528962003167565b62000ca35f8051602062005f248339815191528962003167565b62000cbd5f8051602062005e448339815191528962003167565b62000cd75f8051602062005ec48339815191528962003167565b62000cff5f8051602062005f448339815191525f8051602062005da483398151915262003173565b62000d195f8051602062005da48339815191528962003167565b62000d335f8051602062005de48339815191528962003167565b62000d5b5f8051602062005f048339815191525f8051602062005ee483398151915262003173565b62000d755f8051602062005f048339815191528762003167565b62000d8f5f8051602062005ee48339815191528762003167565b6073546074546001600160401b03600160401b9092048216911680821462000dca57604051632e4cc54360e11b815260040160405180910390fd5b5f62000def888888885f60745f9054906101000a90046001600160401b0316620031c6565b6001600160401b038381165f81815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b91829004909b1681029a909a17905560068a01805490911690931797870297909717909155600787018054909616909417909455607a54606f549390915290549251635d6717a560e01b81529394506001600160a01b038c811694635d6717a59462000eec9493831693600160581b9004909216916076916077919060040162005112565b5f604051808303815f87803b15801562000f04575f80fd5b505af115801562000f17573d5f803e3d5ffd5b50505f805461ff0019169055505060405160ff851681525f8051602062005e848339815191529350602001915062000f4c9050565b60405180910390a15050505050505050505050565b63ffffffff82165f90815260816020526040812062000f819083620033e7565b90505b92915050565b5f54600290610100900460ff1615801562000fab57505f5460ff8083169116105b62000fca5760405162461bcd60e51b815260040162000b72906200501d565b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200104a620030fb565b620010645f8051602062005f448339815191528862003167565b620010705f8462003167565b6200108a5f8051602062005e248339815191528462003167565b620010a45f8051602062005ea48339815191528462003167565b620010be5f8051602062005dc48339815191528462003167565b620010d85f8051602062005e048339815191528562003167565b620010f25f8051602062005f248339815191528562003167565b6200110c5f8051602062005e448339815191528562003167565b620011265f8051602062005ec48339815191528562003167565b6200114e5f8051602062005f448339815191525f8051602062005da483398151915262003173565b620011685f8051602062005da48339815191528562003167565b620011825f8051602062005de48339815191528562003167565b620011aa5f8051602062005f048339815191525f8051602062005ee483398151915262003173565b620011c45f8051602062005f048339815191528362003167565b620011de5f8051602062005ee48339815191528362003167565b620011ea5f3362003167565b5f805461ff001916905560405160ff821681525f8051602062005e848339815191529060200160405180910390a150505050505050565b63ffffffff81165f90815260816020526040812062000f84906200342b565b5f8051602062005f448339815191526200125a816200349a565b63ffffffff89165f90815260816020526040902062001280818a8a8a8a8a8a8a620034a6565b600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b90041615620012e7576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620013206200267a565b6040518263ffffffff1660e01b81526004016200133f91815260200190565b5f604051808303815f87803b15801562001357575f80fd5b505af11580156200136a573d5f803e3d5ffd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b5f8051602062005f4483398151915262001402816200349a565b63ffffffff89165f90815260816020526040902062001428818a8a8a8a8a8a8a62003822565b600681018054600160401b600160801b031916600160401b6001600160401b038a81169182029290921783555f9081526002840160205260409020879055600583018890559054600160801b900416156200148f576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620014c86200267a565b6040518263ffffffff1660e01b8152600401620014e791815260200190565b5f604051808303815f87803b158015620014ff575f80fd5b505af115801562001512573d5f803e3d5ffd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a6040516200155c9392919062005166565b60405180910390a350505050505050505050565b63ffffffff82165f9081526081602052604090206200159e5f8051602062005f448339815191523362002263565b620015f257606f5460ff1615620015c857604051630bc011ff60e21b815260040160405180910390fd5b620015d48183620033e7565b620015f257604051630674f25160e11b815260040160405180910390fd5b620015fe818362003c0e565b505050565b5f8051602062005ec48339815191526200161d816200349a565b6103e88261ffff1610806200163757506103ff8261ffff16115b156200165657604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620016c85f8051602062005f048339815191523362002263565b6200176757608454600160801b90046001600160401b0316158062001718575060845442906200170d9062093a8090600160801b90046001600160401b03166200519b565b6001600160401b0316115b8062001748575060875442906200173d9062093a80906001600160401b03166200519b565b6001600160401b0316115b15620017675760405163692baaad60e11b815260040160405180910390fd5b6200177162003df9565b565b5f9081526034602052604090206001015490565b620017928262001773565b6200179d816200349a565b620015fe838362003e73565b6001600160a01b0381163314620017d357604051630b4ad1cd60e31b815260040160405180910390fd5b620017df828262003ede565b5050565b5f8051602062005ec4833981519152620017fd816200349a565b606f5460ff166200183f576084546001600160401b03600160c01b9091048116908316106200183f5760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190620016a29084906200486a565b5f6086546064620018a39190620051c5565b905090565b5f8051602062005e04833981519152620018c2816200349a565b63ffffffff82161580620018e15750607e5463ffffffff908116908316115b156200190057604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f60205260409020600180820154600160e81b900460ff16151590036200194657604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b5f8051602062005f24833981519152620019aa816200349a565b63ffffffff88161580620019c95750607e5463ffffffff908116908916115b15620019e857604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88165f908152607f60205260409020600180820154600160e81b900460ff161515900362001a2e57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b0388165f9081526083602052604090205463ffffffff161562001a6b576040516337c8fe0960e11b815260040160405180910390fd5b608080545f9190829062001a859063ffffffff16620051df565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b0390921691309162001ad2906200475b565b62001ae09392919062005204565b604051809103905ff08015801562001afa573d5f803e3d5ffd5b5090508160835f8c6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508a815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001d5e949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001d9e908d908d9088908e908e908e906004016200523a565b5f604051808303815f87803b15801562001db6575f80fd5b505af115801562001dc9573d5f803e3d5ffd5b50505050505050505050505050505050565b63ffffffff86165f90815260816020526040902060609062001e0290878787878762003f47565b979650505050505050565b606f5460ff161562001e3257604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001e8092600160c01b9004811691166200519b565b6001600160401b0316111562001ea957604051638a0704d360e01b815260040160405180910390fd5b6103e862001eb888886200529c565b6001600160401b0316111562001ee157604051635acfba9d60e11b815260040160405180910390fd5b62001ef3818989898989898962003822565b62001eff818762004081565b6085546001600160401b03165f036200200657600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562001f79576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001fb26200267a565b6040518263ffffffff1660e01b815260040162001fd191815260200190565b5f604051808303815f87803b15801562001fe9575f80fd5b505af115801562001ffc573d5f803e3d5ffd5b50505050620020cf565b620020118162004278565b600681018054600160801b90046001600160401b03169060106200203583620052bf565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b900487165f90815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b4888789604051620021159392919062005166565b60405180910390a3505050505050505050565b606f5460ff16156200214d57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f908152608160205260409020620021738189898989898989620034a6565b6001600160401b0387165f9081526004820160209081526040918290206002015482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620021d462003df9565b505050505050505050565b80516080805463ffffffff191663ffffffff9092169190911790555f5b8151811015620017df578181815181106200221b576200221b620052e5565b602002602001015160815f836001620022359190620052f9565b63ffffffff16815260208101919091526040015f2060050155806200225a816200530f565b915050620021fc565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401620022dd919062004e3f565b602060405180830381865afa158015620022f9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200231f91906200532a565b6084549091505f9062002345906001600160401b03600160401b8204811691166200529c565b6001600160401b03169050805f0362002360575f9250505090565b6200236c818362005356565b9250505090565b606f545f9060ff16156200239a57604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff1690819003620023d1576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f03620023fb57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f90815260816020526040812060848054919287926200242d9084906001600160401b03166200519b565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f6200246287836200519b565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f95865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b031990921692909316919091171790559050620024f08362004278565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a25826040516200252891906200486a565b60405180910390a29695505050505050565b5f8051602062005ec483398151915262002554816200349a565b606f5460ff166200258f576085546001600160401b03908116908316106200258f5760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590620016a29084906200486a565b5f8051602062005ec4833981519152620025f6816200349a565b62015180826001600160401b031611156200262457604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890620016a29084906200486a565b6080545f9063ffffffff168082036200269457505f919050565b5f816001600160401b03811115620026b057620026b062004b23565b604051908082528060200260200182016040528015620026da578160200160208202803683370190505b5090505f5b828110156200274a5760815f620026f8836001620052f9565b63ffffffff1663ffffffff1681526020019081526020015f20600501548282815181106200272a576200272a620052e5565b60209081029190910101528062002741816200530f565b915050620026df565b505f60205b836001146200298a575f620027666002866200536c565b6200277360028762005356565b6200277f9190620052f9565b90505f816001600160401b038111156200279d576200279d62004b23565b604051908082528060200260200182016040528015620027c7578160200160208202803683370190505b5090505f5b828110156200293e57620027e260018462005382565b81148015620027fd5750620027f96002886200536c565b6001145b156200287d578562002811826002620051c5565b81518110620028245762002824620052e5565b6020026020010151856040516020016200284092919062005398565b604051602081830303815290604052805190602001208282815181106200286b576200286b620052e5565b60200260200101818152505062002929565b856200288b826002620051c5565b815181106200289e576200289e620052e5565b602002602001015186826002620028b69190620051c5565b620028c3906001620052f9565b81518110620028d657620028d6620052e5565b6020026020010151604051602001620028f192919062005398565b604051602081830303815290604052805190602001208282815181106200291c576200291c620052e5565b6020026020010181815250505b8062002935816200530f565b915050620027cc565b5080945081955083846040516020016200295a92919062005398565b60405160208183030381529060405280519060200120935082806200297f90620053a6565b93505050506200274f565b5f835f81518110620029a057620029a0620052e5565b602002602001015190505f5b8281101562002a25578184604051602001620029ca92919062005398565b6040516020818303038152906040528051906020012091508384604051602001620029f792919062005398565b604051602081830303815290604052805190602001209350808062002a1c906200530f565b915050620029ac565b5095945050505050565b5f8051602062005dc483398151915262002a49816200349a565b63ffffffff8416158062002a685750607e5463ffffffff908116908516115b1562002a8757604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526082602052604081205463ffffffff169081900362002ac7576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002b1557604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86165f908152607f60205260409020600180820154600160e81b900460ff161515900362002b5b57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002b9957604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790555f62002c188462001221565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002c6d9216908b908b90600401620053be565b5f604051808303815f87803b15801562002c85575f80fd5b505af115801562002c98573d5f803e3d5ffd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b5f8051602062005de483398151915262002d0c816200349a565b683635c9adc5dea0000082118062002d275750633b9aca0082105b1562002d4657604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620016a2565b62002d878262001773565b62002d92816200349a565b620015fe838362003ede565b5f8051602062005e4483398151915262002db8816200349a565b608780546001600160401b031916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc16976916004808301925f92919082900301818387803b15801562002e33575f80fd5b505af115801562002e46573d5f803e3d5ffd5b5050505062002e5462004341565b50565b5f8051602062005ea483398151915262002e71816200349a565b6001600160401b0384165f9081526083602052604090205463ffffffff161562002eae576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b0387165f9081526082602052604090205463ffffffff161562002eeb57604051630d409b9360e41b815260040160405180910390fd5b5f62002efc88888888875f620031c6565b5f8080526002909101602052604090209390935550505050505050565b5f8051602062005e2483398151915262002f33816200349a565b607e80545f9190829062002f4d9063ffffffff16620051df565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff1681526020015f1515815260200185815250607f5f8363ffffffff1663ffffffff1681526020019081526020015f205f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620030e996959493929190620053fd565b60405180910390a25050505050505050565b5f54610100900460ff16620017715760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b72565b620017df828262003e73565b5f6200317f8362001773565b5f84815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080545f9182918290620031e19063ffffffff16620051df565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f876001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff16021790555060815f8263ffffffff1663ffffffff1681526020019081526020015f20915087825f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b0316021790555086826001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555084825f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620033d49594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b038281165f90815260048501602052604081205490924292620034199291811691166200519b565b6001600160401b031611159392505050565b60068101545f90600160801b90046001600160401b0316156200347d575060068101546001600160401b03600160801b90910481165f9081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002e54813362004399565b60078801545f906001600160401b039081169087161015620034db5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038816156200357b5760068901546001600160401b03600160801b90910481169089161115620035255760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f90815260048a0160205260409020600281015481549092888116600160401b90920416146200357457604051632bd2e3e760e01b815260040160405180910390fd5b50620035ef565b506001600160401b0385165f90815260028901602052604090205480620035b5576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620035ef57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620036285750876001600160401b0316876001600160401b031611155b806200364c575060068901546001600160401b03600160c01b909104811690881611155b156200366b5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260048b016020526040902054600160401b9004811690861614620036b1576040516332a2a77f60e01b815260040160405180910390fd5b5f620036c28a888888868962003f47565b90505f5f8051602062005e64833981519152600283604051620036e6919062005449565b602060405180830381855afa15801562003702573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200372791906200532a565b6200373391906200536c565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620037779188919060040162005466565b602060405180830381865afa15801562003793573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620037b99190620054a2565b620037d7576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260048c016020526040902060020154859003620038155760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b5f806200382f8a6200342b565b60078b01549091506001600160401b039081169089161015620038655760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620039075760068a01546001600160401b03600160801b9091048116908a161115620038af5760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a165f90815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200390057604051632bd2e3e760e01b815260040160405180910390fd5b5062003976565b6001600160401b0388165f90815260028b01602052604090205491508162003942576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200397657604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620039a95760405163b9b18f5760e01b815260040160405180910390fd5b5f620039ba8b8a8a8a878b62003f47565b90505f5f8051602062005e64833981519152600283604051620039de919062005449565b602060405180830381855afa158015620039fa573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019062003a1f91906200532a565b62003a2b91906200536c565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003a6f9189919060040162005466565b602060405180830381865afa15801562003a8b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062003ab19190620054a2565b62003acf576040516309bde33960e01b815260040160405180910390fd5b5f62003adc848b6200529c565b905062003b3587826001600160401b031662003af76200228d565b62003b039190620051c5565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620043c3565b80608460088282829054906101000a90046001600160401b031662003b5b91906200519b565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d153906064015f604051808303815f87803b15801562003be8575f80fd5b505af115801562003bfb573d5f803e3d5ffd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003c4d575060068201546001600160401b03600160801b9091048116908216115b1562003c6c5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f81815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003d276200267a565b6040518263ffffffff1660e01b815260040162003d4691815260200190565b5f604051808303815f87803b15801562003d5e575f80fd5b505af115801562003d71573d5f803e3d5ffd5b505085546001600160a01b03165f90815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801562003e52575f80fd5b505af115801562003e65573d5f803e3d5ffd5b505050506200177162004417565b62003e7f828262002263565b620017df575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003eea828262002263565b15620017df575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086165f818152600389016020526040808220549388168252902054606092911580159062003f7c575081155b1562003f9b5760405163340c614f60e11b815260040160405180910390fd5b8062003fba576040516366385b5160e01b815260040160405180910390fd5b62003fc58462004473565b62003fe3576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b5f6200408d836200342b565b9050815f806200409e84846200529c565b6085546001600160401b0391821692505f91620040c491600160401b9004164262005382565b90505b846001600160401b0316846001600160401b0316146200414d576001600160401b038085165f9081526003890160205260409020600181015490911682101562004128576001810154600160401b90046001600160401b0316945062004146565b6200413486866200529c565b6001600160401b03169350506200414d565b50620040c7565b5f6200415a848462005382565b905083811015620041b857808403600c81116200417857806200417b565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620041ad57620041ad62005342565b04608655506200422f565b838103600c8111620041cb5780620041ce565b600c5b90505f816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162004207576200420762005342565b04905080608654670de0b6b3a7640000028162004228576200422862005342565b0460865550505b683635c9adc5dea0000060865411156200425657683635c9adc5dea000006086556200426e565b633b9aca0060865410156200426e57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002e545760068101545f90620042c290600160c01b90046001600160401b031660016200519b565b9050620042d08282620033e7565b15620017df5760068201545f90600290620042fd908490600160801b90046001600160401b03166200529c565b620043099190620054c3565b6200431590836200519b565b9050620043238382620033e7565b156200433557620015fe838262003c0e565b620015fe838362003c0e565b606f5460ff166200436557604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b620043a5828262002263565b620017df57604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620015fe908490620044f7565b606f5460ff16156200443c57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff000000016001600160401b038316108015620044a9575067ffffffff00000001604083901c6001600160401b0316105b8015620044ca575067ffffffff00000001608083901c6001600160401b0316105b8015620044e2575067ffffffff0000000160c083901c105b15620044f057506001919050565b505f919050565b5f6200454d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620045cf9092919063ffffffff16565b805190915015620015fe57808060200190518101906200456e9190620054a2565b620015fe5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b72565b6060620045df84845f85620045e7565b949350505050565b6060824710156200464a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b72565b5f80866001600160a01b0316858760405162004667919062005449565b5f6040518083038185875af1925050503d805f8114620046a3576040519150601f19603f3d011682016040523d82523d5f602084013e620046a8565b606091505b509150915062001e028783838760608315620047285782515f0362004720576001600160a01b0385163b620047205760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b72565b5081620045df565b620045df83838151156200473f5781518083602001fd5b8060405162461bcd60e51b815260040162000b72919062004d55565b6108b880620054ec83390190565b6001600160a01b038116811462002e54575f80fd5b80356001600160401b038116811462003495575f80fd5b5f805f805f805f805f806101408b8d031215620047b0575f80fd5b8a35620047bd8162004769565b9950620047cd60208c016200477e565b9850620047dd60408c016200477e565b975060608b0135620047ef8162004769565b965060808b0135620048018162004769565b955060a08b0135620048138162004769565b945060c08b0135620048258162004769565b935060e08b0135620048378162004769565b9250620048486101008c016200477e565b9150620048596101208c016200477e565b90509295989b9194979a5092959850565b6001600160401b0391909116815260200190565b803563ffffffff8116811462003495575f80fd5b5f8060408385031215620048a4575f80fd5b620048af836200487e565b9150620048bf602084016200477e565b90509250929050565b5f805f805f8060c08789031215620048de575f80fd5b8635620048eb8162004769565b9550620048fb602088016200477e565b94506200490b604088016200477e565b935060608701356200491d8162004769565b925060808701356200492f8162004769565b915060a0870135620049418162004769565b809150509295509295509295565b5f6020828403121562004960575f80fd5b62000f81826200487e565b80610300810183101562000f84575f80fd5b5f805f805f805f806103e0898b03121562004996575f80fd5b620049a1896200487e565b9750620049b160208a016200477e565b9650620049c160408a016200477e565b9550620049d160608a016200477e565b9450620049e160808a016200477e565b935060a0890135925060c0890135915062004a008a60e08b016200496b565b90509295985092959890939650565b5f805f805f805f806103e0898b03121562004a28575f80fd5b62004a33896200487e565b975062004a4360208a016200477e565b965062004a5360408a016200477e565b955062004a6360608a016200477e565b94506080890135935060a0890135925060c089013562004a838162004769565b915062004a008a60e08b016200496b565b5f6020828403121562004aa5575f80fd5b813561ffff8116811462004ab7575f80fd5b9392505050565b5f6020828403121562004acf575f80fd5b5035919050565b5f806040838503121562004ae8575f80fd5b82359150602083013562004afc8162004769565b809150509250929050565b5f6020828403121562004b18575f80fd5b62000f81826200477e565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171562004b625762004b6262004b23565b604052919050565b5f82601f83011262004b7a575f80fd5b81356001600160401b0381111562004b965762004b9662004b23565b62004bab601f8201601f191660200162004b37565b81815284602083860101111562004bc0575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f805f60e0888a03121562004bf3575f80fd5b62004bfe886200487e565b965062004c0e602089016200477e565b9550604088013562004c208162004769565b9450606088013562004c328162004769565b9350608088013562004c448162004769565b925060a08801356001600160401b038082111562004c60575f80fd5b62004c6e8b838c0162004b6a565b935060c08a013591508082111562004c84575f80fd5b5062004c938a828b0162004b6a565b91505092959891949750929550565b5f805f805f8060c0878903121562004cb8575f80fd5b62004cc3876200487e565b955062004cd3602088016200477e565b945062004ce3604088016200477e565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b8381101562004d2057818101518382015260200162004d06565b50505f910152565b5f815180845262004d4181602086016020860162004d04565b601f01601f19169290920160200192915050565b602081525f62000f81602083018462004d28565b5f602080838503121562004d7b575f80fd5b82356001600160401b038082111562004d92575f80fd5b818501915085601f83011262004da6575f80fd5b81358181111562004dbb5762004dbb62004b23565b8060051b915062004dce84830162004b37565b818152918301840191848101908884111562004de8575f80fd5b938501935b8385101562004e085784358252938501939085019062004ded565b98975050505050505050565b5f806040838503121562004e26575f80fd5b62004e31836200477e565b946020939093013593505050565b6001600160a01b0391909116815260200190565b5f805f806060858703121562004e67575f80fd5b843562004e748162004769565b935062004e84602086016200487e565b925060408501356001600160401b038082111562004ea0575f80fd5b818701915087601f83011262004eb4575f80fd5b81358181111562004ec3575f80fd5b88602082850101111562004ed5575f80fd5b95989497505060200194505050565b5f6020828403121562004ef5575f80fd5b813562004ab78162004769565b803560ff8116811462003495575f80fd5b5f805f805f8060c0878903121562004f29575f80fd5b863562004f368162004769565b9550602087013562004f488162004769565b945062004f58604088016200477e565b935062004f68606088016200477e565b92506080870135915062004f7f60a0880162004f02565b90509295509295509295565b5f805f805f8060c0878903121562004fa1575f80fd5b863562004fae8162004769565b9550602087013562004fc08162004769565b945062004fd0604088016200477e565b935062004fe06060880162004f02565b92506080870135915060a08701356001600160401b0381111562005002575f80fd5b6200501089828a0162004b6a565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b80545f90600181811c90808316806200508557607f831692505b60208084108203620050a557634e487b7160e01b5f52602260045260245ffd5b83885260208801828015620050c35760018114620050da5762005105565b60ff198716825285151560051b8201975062005105565b5f898152602090205f5b87811015620050ff57815484820152908601908401620050e4565b83019850505b5050505050505092915050565b6001600160a01b0386811682528516602082015260a0604082018190525f906200513f908301866200506b565b82810360608401526200515381866200506b565b9150508260808301529695505050505050565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03818116838216019080821115620051be57620051be62005187565b5092915050565b808202811582820484141762000f845762000f8462005187565b5f63ffffffff808316818103620051fa57620051fa62005187565b6001019392505050565b6001600160a01b038481168252831660208201526060604082018190525f90620052319083018462004d28565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190525f906200527b9083018562004d28565b82810360a08401526200528f818562004d28565b9998505050505050505050565b6001600160401b03828116828216039080821115620051be57620051be62005187565b5f6001600160401b038281166002600160401b03198101620051fa57620051fa62005187565b634e487b7160e01b5f52603260045260245ffd5b8082018082111562000f845762000f8462005187565b5f6001820162005323576200532362005187565b5060010190565b5f602082840312156200533b575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8262005367576200536762005342565b500490565b5f826200537d576200537d62005342565b500690565b8181038181111562000f845762000f8462005187565b918252602082015260400190565b5f81620053b757620053b762005187565b505f190190565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190525f9062004e089083018462004d28565b5f82516200545c81846020870162004d04565b9190910192915050565b6103208101610300808584378201835f5b60018110156200549857815183526020928301929091019060010162005477565b5050509392505050565b5f60208284031215620054b3575f80fd5b8151801515811462004ab7575f80fd5b5f6001600160401b0383811680620054df57620054df62005342565b9216919091049291505056fe60a06040526040516108b83803806108b883398101604081905261002291610349565b828161002e8282610056565b50506001600160a01b03821660805261004e61004960805190565b6100b4565b50505061042e565b61005f82610121565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100a8576100a3828261019f565b505050565b6100b0610212565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f35f80516020610898833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161011e81610233565b50565b806001600160a01b03163b5f0361015b57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516101bb9190610413565b5f60405180830381855af49150503d805f81146101f3576040519150601f19603f3d011682016040523d82523d5f602084013e6101f8565b606091505b509092509050610209858383610270565b95945050505050565b34156102315760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661025c57604051633173bdd160e11b81525f6004820152602401610152565b805f8051602061089883398151915261017e565b60608261028557610280826102cf565b6102c8565b815115801561029c57506001600160a01b0384163b155b156102c557604051639996b31560e01b81526001600160a01b0385166004820152602401610152565b50805b9392505050565b8051156102df5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461030e575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015610341578181015183820152602001610329565b50505f910152565b5f805f6060848603121561035b575f80fd5b610364846102f8565b9250610372602085016102f8565b60408501519092506001600160401b038082111561038e575f80fd5b818601915086601f8301126103a1575f80fd5b8151818111156103b3576103b3610313565b604051601f8201601f19908116603f011681019083821181831017156103db576103db610313565b816040528281528960208487010111156103f3575f80fd5b610404836020830160208801610327565b80955050505050509250925092565b5f8251610424818460208701610327565b9190910192915050565b6080516104536104455f395f601001526104535ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610069575f356001600160e01b03191663278f794360e11b146100615761005f61006d565b565b61005f61007d565b61005f5b61005f6100786100ab565b6100cf565b5f8061008c36600481846102ba565b81019061009991906102f5565b915091506100a782826100ed565b5050565b5f6100ca5f805160206103fe833981519152546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156100e9573d5ff35b3d5ffd5b6100f682610147565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561013f5761013a82826101aa565b505050565b6100a761021c565b806001600160a01b03163b5f0361017c5780604051634c9c8ce360e01b815260040161017391906103bd565b60405180910390fd5b5f805160206103fe83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101c691906103d1565b5f60405180830381855af49150503d805f81146101fe576040519150601f19603f3d011682016040523d82523d5f602084013e610203565b606091505b509150915061021385838361023b565b95945050505050565b341561005f5760405163b398979f60e01b815260040160405180910390fd5b6060826102505761024b82610291565b61028a565b815115801561026757506001600160a01b0384163b155b156102875783604051639996b31560e01b815260040161017391906103bd565b50805b9392505050565b8051156102a15780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f80858511156102c8575f80fd5b838611156102d4575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610306575f80fd5b82356001600160a01b038116811461031c575f80fd5b915060208301356001600160401b0380821115610337575f80fd5b818501915085601f83011261034a575f80fd5b81358181111561035c5761035c6102e1565b604051601f8201601f19908116603f01168101908382118183101715610384576103846102e1565b8160405282815288602084870101111561039c575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b5f82515f5b818110156103f057602081860181015185830152016103d6565b505f92019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220d3b91b386436af95579d7d767b3c6e83ae79b09bd8dd9344bddb95185404c56564736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220539899ae68a90ad0286a138b16dbd746c29dc4221aaf7194e411a67a40ef8ad064736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonRollupManagerMockInternalTest.json b/compiled-contracts/PolygonRollupManagerMockInternalTest.json index 2ed52d8cf..74375c068 100644 --- a/compiled-contracts/PolygonRollupManagerMockInternalTest.json +++ b/compiled-contracts/PolygonRollupManagerMockInternalTest.json @@ -1965,8 +1965,8 @@ "type": "function" } ], - "bytecode": "0x60e060405234801562000010575f80fd5b5060405162005ace38038062005ace83398101604081905262000033916200013c565b6001600160a01b0380841660805280831660c052811660a0528282826200005962000065565b5050505050506200018d565b5f54610100900460ff1615620000d15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101562000122575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811462000139575f80fd5b50565b5f805f606084860312156200014f575f80fd5b83516200015c8162000124565b60208501519093506200016f8162000124565b6040850151909250620001828162000124565b809150509250925092565b60805160a05160c0516158de620001f05f395f8181610a1c01528181611f92015261366801525f81816107d701528181612b22015261395701525f81816109760152818161102a015281816111d201528181611cdd015261384c01526158de5ff3fe608060405234801562000010575f80fd5b50600436106200030c575f3560e01c8063841b24d711620001a3578063c1acbc3411620000f3578063dbc16976116200009b578063dbc1697614620009da578063dde0ff7714620009e4578063e0bfd3d214620009ff578063e46761c41462000a16578063f34eb8eb1462000a3e578063f4e926751462000a55578063f9c4c2ae1462000a66575f80fd5b8063c1acbc341462000916578063c4c928c21462000931578063ceee281d1462000948578063d02103ca1462000970578063d5073f6f1462000998578063d547741f14620009af578063d939b31514620009c6575f80fd5b80639c9f3dfe11620001575780639c9f3dfe1462000791578063a066215c14620007a8578063a217fddf14620007bf578063a2967d9914620007c7578063a3c573eb14620007d1578063afd23cbe1462000812578063b99d0ad7146200083c575f80fd5b8063841b24d7146200071057806387c20c01146200072b5780638bd4f071146200074257806391d14854146200075957806399f5634e14620007705780639a908e73146200077a575f80fd5b806325280169116200025f57806355a71ee0116200021357806355a71ee014620005995780636046916914620005dc57806365c0504d14620005e65780637222020f1462000694578063727885e914620006ab5780637975fcfe14620006c25780637fb6e76a14620006e8575f80fd5b80632528016914620004835780632f2ff15d146200053757806330c27dde146200054e57806336568abe1462000562578063394218e91462000579578063477fa2701462000590575f80fd5b80631489ed1011620002c35780631489ed1014620003cb57806315064c9614620003e25780631608859c14620003f05780631796a1ae14620004075780631816b7e5146200042e5780632072f6c51462000445578063248a9ca3146200044f575f80fd5b80630645af091462000310578063066ec0121462000329578063080b3111146200035a5780630a0d9fbe146200038257806311f6b287146200039d57806312b86e1914620003b4575b5f80fd5b620003276200032136600462004517565b62000b7c565b005b6084546200033d906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b620003716200036b36600462004600565b62000f39565b604051901515815260200162000351565b6085546200033d90600160401b90046001600160401b031681565b6200033d620003ae36600462004636565b62000f62565b62000327620003c536600462004664565b62000f81565b62000327620003dc366004620046f6565b62001129565b606f54620003719060ff1681565b620003276200040136600462004600565b620012b7565b607e54620004189063ffffffff1681565b60405163ffffffff909116815260200162000351565b620003276200043f3660046200477b565b6200134a565b62000327620013f5565b6200047462000460366004620047a5565b5f9081526034602052604090206001015490565b60405190815260200162000351565b620005036200049436600462004600565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b0390811691830191909152928201519092169082015260600162000351565b6200032762000548366004620047bd565b620014ba565b6087546200033d906001600160401b031681565b6200032762000573366004620047bd565b620014e2565b620003276200058a366004620047ee565b6200151c565b60865462000474565b62000474620005aa36600462004600565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b62000474620015cf565b6200064a620005f736600462004636565b607f6020525f90815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c00162000351565b62000327620006a536600462004636565b620015e6565b62000327620006bc366004620048ae565b620016e0565b620006d9620006d336600462004974565b62001b3d565b60405162000351919062004a27565b62000418620006f9366004620047ee565b60836020525f908152604090205463ffffffff1681565b6084546200033d90600160c01b90046001600160401b031681565b620003276200073c366004620046f6565b62001b6f565b620003276200075336600462004664565b62001e90565b620003716200076a366004620047bd565b62001f47565b6200047462001f71565b6200033d6200078b36600462004a3b565b62002052565b62000327620007a2366004620047ee565b6200221e565b62000327620007b9366004620047ee565b620022c3565b620004745f81565b6200047462002366565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200162000351565b6085546200082890600160801b900461ffff1681565b60405161ffff909116815260200162000351565b620008d16200084d36600462004600565b60408051608080820183525f8083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b6040516200035191905f6080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200033d90600160801b90046001600160401b031681565b620003276200094236600462004a66565b6200272e565b620004186200095936600462004af7565b60826020525f908152604090205463ffffffff1681565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b62000327620009a9366004620047a5565b62002a04565b62000327620009c0366004620047bd565b62002aa0565b6085546200033d906001600160401b031681565b6200032762002ac8565b6084546200033d90600160401b90046001600160401b031681565b6200032762000a1036600462004b26565b62002b94565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b6200032762000a4f36600462004b9e565b62002c68565b608054620004189063ffffffff1681565b62000afc62000a7736600462004636565b60816020525f9081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff166101608201526101800162000351565b5f54600290610100900460ff1615801562000b9d57505f5460ff8083169116105b62000c065760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c8662002e5c565b62000ca05f80516020620058898339815191528c62002ec8565b62000cac5f8862002ec8565b62000cd87fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908862002ec8565b62000d047f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8862002ec8565b62000d307f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8862002ec8565b62000d5c7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8962002ec8565b62000d887fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088962002ec8565b62000db47f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48962002ec8565b62000dce5f80516020620058498339815191528962002ec8565b62000e085f80516020620058898339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062002ed4565b62000e347f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08962002ec8565b62000e607f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8962002ec8565b62000e9a5f80516020620058698339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162002ed4565b62000eb45f80516020620058698339815191528762002ec8565b62000ee07f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518762002ec8565b62000eec5f3362002ec8565b5f805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050505050565b63ffffffff82165f90815260816020526040812062000f59908362002f1e565b90505b92915050565b63ffffffff81165f90815260816020526040812062000f5c9062002f62565b5f805160206200588983398151915262000f9b8162002fd1565b63ffffffff89165f90815260816020526040902062000fc1818a8a8a8a8a8a8a62002fdd565b600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562001028576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200106162002366565b6040518263ffffffff1660e01b81526004016200108091815260200190565b5f604051808303815f87803b15801562001098575f80fd5b505af1158015620010ab573d5f803e3d5ffd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b5f8051602062005889833981519152620011438162002fd1565b63ffffffff89165f90815260816020526040902062001169818a8a8a8a8a8a8a6200336b565b600681018054600160401b600160801b031916600160401b6001600160401b038a81169182029290921783555f9081526002840160205260409020879055600583018890559054600160801b90041615620011d0576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200120962002366565b6040518263ffffffff1660e01b81526004016200122891815260200190565b5f604051808303815f87803b15801562001240575f80fd5b505af115801562001253573d5f803e3d5ffd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff82165f908152608160205260409020620012e55f80516020620058898339815191523362001f47565b6200133957606f5460ff16156200130f57604051630bc011ff60e21b815260040160405180910390fd5b6200131b818362002f1e565b6200133957604051630674f25160e11b815260040160405180910390fd5b6200134581836200376a565b505050565b5f8051602062005849833981519152620013648162002fd1565b6103e88261ffff1610806200137e57506103ff8261ffff16115b156200139d57604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200140f5f80516020620058698339815191523362001f47565b620014ae57608454600160801b90046001600160401b031615806200145f57506084544290620014549062093a8090600160801b90046001600160401b031662004c44565b6001600160401b0316115b806200148f57506087544290620014849062093a80906001600160401b031662004c44565b6001600160401b0316115b15620014ae5760405163692baaad60e11b815260040160405180910390fd5b620014b862003955565b565b5f82815260346020526040902060010154620014d68162002fd1565b620013458383620039cf565b6001600160a01b03811633146200150c57604051630b4ad1cd60e31b815260040160405180910390fd5b62001518828262003a3a565b5050565b5f8051602062005849833981519152620015368162002fd1565b606f5460ff1662001578576084546001600160401b03600160c01b909104811690831610620015785760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001620013e9565b5f6086546064620015e1919062004c6e565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd620016128162002fd1565b63ffffffff82161580620016315750607e5463ffffffff908116908316115b156200165057604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f60205260409020600180820154600160e81b900460ff16151590036200169657604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd086200170c8162002fd1565b63ffffffff881615806200172b5750607e5463ffffffff908116908916115b156200174a57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88165f908152607f60205260409020600180820154600160e81b900460ff16151590036200179057604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b0388165f9081526083602052604090205463ffffffff1615620017cd576040516337c8fe0960e11b815260040160405180910390fd5b608080545f91908290620017e79063ffffffff1662004c88565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b039092169130916200183490620044dd565b620018429392919062004cad565b604051809103905ff0801580156200185c573d5f803e3d5ffd5b5090508160835f8c6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508a815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001ac0949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001b00908d908d9088908e908e908e9060040162004ce3565b5f604051808303815f87803b15801562001b18575f80fd5b505af115801562001b2b573d5f803e3d5ffd5b50505050505050505050505050505050565b63ffffffff86165f90815260816020526040902060609062001b6490878787878762003aa3565b979650505050505050565b606f5460ff161562001b9457604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001be292600160c01b90048116911662004c44565b6001600160401b0316111562001c0b57604051638a0704d360e01b815260040160405180910390fd5b6103e862001c1a888862004d45565b6001600160401b0316111562001c4357604051635acfba9d60e11b815260040160405180910390fd5b62001c5581898989898989896200336b565b62001c61818762003be2565b6085546001600160401b03165f0362001d6857600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562001cdb576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001d1462002366565b6040518263ffffffff1660e01b815260040162001d3391815260200190565b5f604051808303815f87803b15801562001d4b575f80fd5b505af115801562001d5e573d5f803e3d5ffd5b5050505062001e31565b62001d738162003dd9565b600681018054600160801b90046001600160401b031690601062001d978362004d68565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b900487165f90815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff161562001eb557604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f90815260816020526040902062001edb818989898989898962002fdd565b6001600160401b0387165f9081526004820160209081526040918290206002015482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a162001f3c62003955565b505050505050505050565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b81523060048201525f9081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562001fd8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001ffe919062004d86565b6084549091505f9062002024906001600160401b03600160401b82048116911662004d45565b6001600160401b03169050805f036200203f575f9250505090565b6200204b818362004db2565b9250505090565b606f545f9060ff16156200207957604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff1690819003620020b0576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f03620020da57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f90815260816020526040812060848054919287926200210c9084906001600160401b031662004c44565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f62002141878362004c44565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f95865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b031990921692909316919091171790559050620021d08362003dd9565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b5f8051602062005849833981519152620022388162002fd1565b606f5460ff1662002273576085546001600160401b0390811690831610620022735760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001620013e9565b5f8051602062005849833981519152620022dd8162002fd1565b62015180826001600160401b031611156200230b57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001620013e9565b6080545f9063ffffffff168082036200238057505f919050565b5f816001600160401b038111156200239c576200239c6200480a565b604051908082528060200260200182016040528015620023c6578160200160208202803683370190505b5090505f5b82811015620024365760815f620023e483600162004dc8565b63ffffffff1663ffffffff1681526020019081526020015f206005015482828151811062002416576200241662004dde565b6020908102919091010152806200242d8162004df2565b915050620023cb565b505f60205b836001146200268e575f6200245260028662004e0d565b6200245f60028762004db2565b6200246b919062004dc8565b90505f816001600160401b038111156200248957620024896200480a565b604051908082528060200260200182016040528015620024b3578160200160208202803683370190505b5090505f5b828110156200263a57620024ce60018462004e23565b81148015620024e95750620024e560028862004e0d565b6001145b15620025715785620024fd82600262004c6e565b8151811062002510576200251062004dde565b60200260200101518560405160200162002534929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106200255f576200255f62004dde565b60200260200101818152505062002625565b856200257f82600262004c6e565b8151811062002592576200259262004dde565b602002602001015186826002620025aa919062004c6e565b620025b790600162004dc8565b81518110620025ca57620025ca62004dde565b6020026020010151604051602001620025ed929190918252602082015260400190565b6040516020818303038152906040528051906020012082828151811062002618576200261862004dde565b6020026020010181815250505b80620026318162004df2565b915050620024b8565b5080945081955083846040516020016200265e929190918252602082015260400190565b6040516020818303038152906040528051906020012093508280620026839062004e39565b93505050506200243b565b5f835f81518110620026a457620026a462004dde565b602002602001015190505f5b828110156200272457604080516020810184905290810185905260600160408051601f198184030181528282528051602091820120908301879052908201869052925060600160405160208183030381529060405280519060200120935080806200271b9062004df2565b915050620026b0565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac6200275a8162002fd1565b63ffffffff84161580620027795750607e5463ffffffff908116908516115b156200279857604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526082602052604081205463ffffffff1690819003620027d8576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918716600160401b9091046001600160401b0316036200282657604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86165f908152607f60205260409020600180820154600160e81b900460ff16151590036200286c57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b9092041614620028aa57604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790555f620029298462000f62565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef286926200297f9216908b908b9060040162004e51565b5f604051808303815f87803b15801562002997575f80fd5b505af1158015620029aa573d5f803e3d5ffd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002a308162002fd1565b683635c9adc5dea0000082118062002a4b5750633b9aca0082105b1562002a6a57604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620013e9565b5f8281526034602052604090206001015462002abc8162002fd1565b62001345838362003a3a565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002af48162002fd1565b6087805467ffffffffffffffff1916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc16976916004808301925f92919082900301818387803b15801562002b70575f80fd5b505af115801562002b83573d5f803e3d5ffd5b5050505062002b9162003ea2565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62002bc08162002fd1565b6001600160401b0384165f9081526083602052604090205463ffffffff161562002bfd576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b0387165f9081526082602052604090205463ffffffff161562002c3a57604051630d409b9360e41b815260040160405180910390fd5b5f62002c4b88888888875f62003efa565b5f8080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002c948162002fd1565b607e80545f9190829062002cae9063ffffffff1662004c88565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff1681526020015f1515815260200185815250607f5f8363ffffffff1663ffffffff1681526020019081526020015f205f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002e4a9695949392919062004e90565b60405180910390a25050505050505050565b5f54610100900460ff16620014b85760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000bfd565b620015188282620039cf565b5f82815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6085546001600160401b038281165f9081526004850160205260408120549092429262002f5092918116911662004c44565b6001600160401b031611159392505050565b60068101545f90600160801b90046001600160401b03161562002fb4575060068101546001600160401b03600160801b90910481165f9081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002b9181336200411b565b60078801545f906001600160401b039081169087161015620030125760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620030b25760068901546001600160401b03600160801b909104811690891611156200305c5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f90815260048a0160205260409020600281015481549092888116600160401b9092041614620030ab57604051632bd2e3e760e01b815260040160405180910390fd5b5062003126565b506001600160401b0385165f90815260028901602052604090205480620030ec576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b909104811690871611156200312657604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b909104811690881611806200315f5750876001600160401b0316876001600160401b031611155b8062003183575060068901546001600160401b03600160c01b909104811690881611155b15620031a25760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260048b016020526040902054600160401b9004811690861614620031e8576040516332a2a77f60e01b815260040160405180910390fd5b5f620031f98a888888868962003aa3565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516200322f919062004ee8565b602060405180830381855afa1580156200324b573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019062003270919062004d86565b6200327c919062004e0d565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620032c09188919060040162004f05565b602060405180830381865afa158015620032dc573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062003302919062004f41565b62003320576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260048c0160205260409020600201548590036200335e5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b5f80620033788a62002f62565b60078b01549091506001600160401b039081169089161015620033ae5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620034505760068a01546001600160401b03600160801b9091048116908a161115620033f85760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a165f90815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200344957604051632bd2e3e760e01b815260040160405180910390fd5b50620034bf565b6001600160401b0388165f90815260028b0160205260409020549150816200348b576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b03161115620034bf57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620034f25760405163b9b18f5760e01b815260040160405180910390fd5b5f620035038b8a8a8a878b62003aa3565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405162003539919062004ee8565b602060405180830381855afa15801562003555573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200357a919062004d86565b62003586919062004e0d565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620035ca9189919060040162004f05565b602060405180830381865afa158015620035e6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200360c919062004f41565b6200362a576040516309bde33960e01b815260040160405180910390fd5b5f62003637848b62004d45565b90506200369087826001600160401b03166200365262001f71565b6200365e919062004c6e565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004145565b80608460088282829054906101000a90046001600160401b0316620036b6919062004c44565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d153906064015f604051808303815f87803b15801562003744575f80fd5b505af115801562003757573d5f803e3d5ffd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b9091048116908216111580620037a9575060068201546001600160401b03600160801b9091048116908216115b15620037c85760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f81815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200388362002366565b6040518263ffffffff1660e01b8152600401620038a291815260200190565b5f604051808303815f87803b158015620038ba575f80fd5b505af1158015620038cd573d5f803e3d5ffd5b505085546001600160a01b03165f90815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015620039ae575f80fd5b505af1158015620039c1573d5f803e3d5ffd5b50505050620014b862004199565b620039db828262001f47565b62001518575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003a46828262001f47565b1562001518575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086165f818152600389016020526040808220549388168252902054606092911580159062003ad8575081155b1562003af75760405163340c614f60e11b815260040160405180910390fd5b8062003b16576040516366385b5160e01b815260040160405180910390fd5b62003b2184620041f5565b62003b3f576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b5f62003bee8362002f62565b9050815f8062003bff848462004d45565b6085546001600160401b0391821692505f9162003c2591600160401b9004164262004e23565b90505b846001600160401b0316846001600160401b03161462003cae576001600160401b038085165f9081526003890160205260409020600181015490911682101562003c89576001810154600160401b90046001600160401b0316945062003ca7565b62003c95868662004d45565b6001600160401b031693505062003cae565b5062003c28565b5f62003cbb848462004e23565b90508381101562003d1957808403600c811162003cd9578062003cdc565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a608654028162003d0e5762003d0e62004d9e565b046086555062003d90565b838103600c811162003d2c578062003d2f565b600c5b90505f816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162003d685762003d6862004d9e565b04905080608654670de0b6b3a7640000028162003d895762003d8962004d9e565b0460865550505b683635c9adc5dea00000608654111562003db757683635c9adc5dea0000060865562003dcf565b633b9aca00608654101562003dcf57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002b915760068101545f9062003e2390600160c01b90046001600160401b0316600162004c44565b905062003e31828262002f1e565b15620015185760068201545f9060029062003e5e908490600160801b90046001600160401b031662004d45565b62003e6a919062004f62565b62003e76908362004c44565b905062003e84838262002f1e565b1562003e96576200134583826200376a565b6200134583836200376a565b606f5460ff1662003ec657604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b608080545f918291829062003f159063ffffffff1662004c88565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f876001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff16021790555060815f8263ffffffff1663ffffffff1681526020019081526020015f20915087825f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b0316021790555086826001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555084825f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620041089594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b62004127828262001f47565b6200151857604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526200134590849062004279565b606f5460ff1615620041be57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff000000016001600160401b0383161080156200422b575067ffffffff00000001604083901c6001600160401b0316105b80156200424c575067ffffffff00000001608083901c6001600160401b0316105b801562004264575067ffffffff0000000160c083901c105b156200427257506001919050565b505f919050565b5f620042cf826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620043519092919063ffffffff16565b805190915015620013455780806020019051810190620042f0919062004f41565b620013455760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000bfd565b60606200436184845f8562004369565b949350505050565b606082471015620043cc5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000bfd565b5f80866001600160a01b03168587604051620043e9919062004ee8565b5f6040518083038185875af1925050503d805f811462004425576040519150601f19603f3d011682016040523d82523d5f602084013e6200442a565b606091505b509150915062001b648783838760608315620044aa5782515f03620044a2576001600160a01b0385163b620044a25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000bfd565b508162004361565b620043618383815115620044c15781518083602001fd5b8060405162461bcd60e51b815260040162000bfd919062004a27565b6108be8062004f8b83390190565b6001600160a01b038116811462002b91575f80fd5b80356001600160401b038116811462002fcc575f80fd5b5f805f805f805f805f806101408b8d03121562004532575f80fd5b8a356200453f81620044eb565b99506200454f60208c0162004500565b98506200455f60408c0162004500565b975060608b01356200457181620044eb565b965060808b01356200458381620044eb565b955060a08b01356200459581620044eb565b945060c08b0135620045a781620044eb565b935060e08b0135620045b981620044eb565b9250620045ca6101008c0162004500565b9150620045db6101208c0162004500565b90509295989b9194979a5092959850565b803563ffffffff8116811462002fcc575f80fd5b5f806040838503121562004612575f80fd5b6200461d83620045ec565b91506200462d6020840162004500565b90509250929050565b5f6020828403121562004647575f80fd5b62000f5982620045ec565b80610300810183101562000f5c575f80fd5b5f805f805f805f806103e0898b0312156200467d575f80fd5b6200468889620045ec565b97506200469860208a0162004500565b9650620046a860408a0162004500565b9550620046b860608a0162004500565b9450620046c860808a0162004500565b935060a0890135925060c08901359150620046e78a60e08b0162004652565b90509295985092959890939650565b5f805f805f805f806103e0898b0312156200470f575f80fd5b6200471a89620045ec565b97506200472a60208a0162004500565b96506200473a60408a0162004500565b95506200474a60608a0162004500565b94506080890135935060a0890135925060c08901356200476a81620044eb565b9150620046e78a60e08b0162004652565b5f602082840312156200478c575f80fd5b813561ffff811681146200479e575f80fd5b9392505050565b5f60208284031215620047b6575f80fd5b5035919050565b5f8060408385031215620047cf575f80fd5b823591506020830135620047e381620044eb565b809150509250929050565b5f60208284031215620047ff575f80fd5b62000f598262004500565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126200482e575f80fd5b81356001600160401b03808211156200484b576200484b6200480a565b604051601f8301601f19908116603f011681019082821181831017156200487657620048766200480a565b816040528381528660208588010111156200488f575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a031215620048c5575f80fd5b620048d088620045ec565b9650620048e06020890162004500565b95506040880135620048f281620044eb565b945060608801356200490481620044eb565b935060808801356200491681620044eb565b925060a08801356001600160401b038082111562004932575f80fd5b620049408b838c016200481e565b935060c08a013591508082111562004956575f80fd5b50620049658a828b016200481e565b91505092959891949750929550565b5f805f805f8060c087890312156200498a575f80fd5b6200499587620045ec565b9550620049a56020880162004500565b9450620049b56040880162004500565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b83811015620049f2578181015183820152602001620049d8565b50505f910152565b5f815180845262004a13816020860160208601620049d6565b601f01601f19169290920160200192915050565b602081525f62000f596020830184620049fa565b5f806040838503121562004a4d575f80fd5b62004a588362004500565b946020939093013593505050565b5f805f806060858703121562004a7a575f80fd5b843562004a8781620044eb565b935062004a9760208601620045ec565b925060408501356001600160401b038082111562004ab3575f80fd5b818701915087601f83011262004ac7575f80fd5b81358181111562004ad6575f80fd5b88602082850101111562004ae8575f80fd5b95989497505060200194505050565b5f6020828403121562004b08575f80fd5b81356200479e81620044eb565b803560ff8116811462002fcc575f80fd5b5f805f805f8060c0878903121562004b3c575f80fd5b863562004b4981620044eb565b9550602087013562004b5b81620044eb565b945062004b6b6040880162004500565b935062004b7b6060880162004500565b92506080870135915062004b9260a0880162004b15565b90509295509295509295565b5f805f805f8060c0878903121562004bb4575f80fd5b863562004bc181620044eb565b9550602087013562004bd381620044eb565b945062004be36040880162004500565b935062004bf36060880162004b15565b92506080870135915060a08701356001600160401b0381111562004c15575f80fd5b62004c2389828a016200481e565b9150509295509295509295565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111562004c675762004c6762004c30565b5092915050565b808202811582820484141762000f5c5762000f5c62004c30565b5f63ffffffff80831681810362004ca35762004ca362004c30565b6001019392505050565b6001600160a01b038481168252831660208201526060604082018190525f9062004cda90830184620049fa565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190525f9062004d2490830185620049fa565b82810360a084015262004d388185620049fa565b9998505050505050505050565b6001600160401b0382811682821603908082111562004c675762004c6762004c30565b5f6001600160401b0380831681810362004ca35762004ca362004c30565b5f6020828403121562004d97575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8262004dc35762004dc362004d9e565b500490565b8082018082111562000f5c5762000f5c62004c30565b634e487b7160e01b5f52603260045260245ffd5b5f6001820162004e065762004e0662004c30565b5060010190565b5f8262004e1e5762004e1e62004d9e565b500690565b8181038181111562000f5c5762000f5c62004c30565b5f8162004e4a5762004e4a62004c30565b505f190190565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190525f9062004edc90830184620049fa565b98975050505050505050565b5f825162004efb818460208701620049d6565b9190910192915050565b6103208101610300808584378201835f5b600181101562004f3757815183526020928301929091019060010162004f16565b5050509392505050565b5f6020828403121562004f52575f80fd5b815180151581146200479e575f80fd5b5f6001600160401b038084168062004f7e5762004f7e62004d9e565b9216919091049291505056fe60a0604052604051620008be380380620008be8339810160408190526100249161034d565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b6565b505050610432565b61006182610124565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100aa576100a582826101a2565b505050565b6100b2610215565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f65f805160206200089e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161012181610236565b50565b806001600160a01b03163b5f0361015e57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516101be9190610417565b5f60405180830381855af49150503d805f81146101f6576040519150601f19603f3d011682016040523d82523d5f602084013e6101fb565b606091505b50909250905061020c858383610274565b95945050505050565b34156102345760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661025f57604051633173bdd160e11b81525f6004820152602401610155565b805f805160206200089e833981519152610181565b60608261028957610284826102d3565b6102cc565b81511580156102a057506001600160a01b0384163b155b156102c957604051639996b31560e01b81526001600160a01b0385166004820152602401610155565b50805b9392505050565b8051156102e35780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b0381168114610312575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561034557818101518382015260200161032d565b50505f910152565b5f805f6060848603121561035f575f80fd5b610368846102fc565b9250610376602085016102fc565b60408501519092506001600160401b0380821115610392575f80fd5b818601915086601f8301126103a5575f80fd5b8151818111156103b7576103b7610317565b604051601f8201601f19908116603f011681019083821181831017156103df576103df610317565b816040528281528960208487010111156103f7575f80fd5b61040883602083016020880161032b565b80955050505050509250925092565b5f825161042881846020870161032b565b9190910192915050565b6080516104546200044a5f395f601001526104545ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610069575f356001600160e01b03191663278f794360e11b146100615761005f61006d565b565b61005f61007d565b61005f5b61005f6100786100ab565b6100e2565b5f8061008c36600481846102ee565b8101906100999190610329565b915091506100a78282610100565b5050565b5f6100dd7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156100fc573d5ff35b3d5ffd5b6101098261015a565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101525761014d82826101d5565b505050565b6100a7610247565b806001600160a01b03163b5f0361019457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101f191906103f2565b5f60405180830381855af49150503d805f8114610229576040519150601f19603f3d011682016040523d82523d5f602084013e61022e565b606091505b509150915061023e858383610266565b95945050505050565b341561005f5760405163b398979f60e01b815260040160405180910390fd5b60608261027b57610276826102c5565b6102be565b815115801561029257506001600160a01b0384163b155b156102bb57604051639996b31560e01b81526001600160a01b038516600482015260240161018b565b50805b9392505050565b8051156102d55780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f80858511156102fc575f80fd5b83861115610308575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561033a575f80fd5b82356001600160a01b0381168114610350575f80fd5b9150602083013567ffffffffffffffff8082111561036c575f80fd5b818501915085601f83011261037f575f80fd5b81358181111561039157610391610315565b604051601f8201601f19908116603f011681019083821181831017156103b9576103b9610315565b816040528281528860208487010111156103d1575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b8181101561041157602081860181015185830152016103f7565b505f92019182525091905056fea2646970667358221220c3817d11eb3dc87723342527d38da55b7b3b362f54567f56cf1ef4db2f8a430664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220a4110513306739c3c08cc22958bf1451aa1a4a1222df971c0412e1c1ab1b08c764736f6c63430008140033", - "deployedBytecode": "0x608060405234801562000010575f80fd5b50600436106200030c575f3560e01c8063841b24d711620001a3578063c1acbc3411620000f3578063dbc16976116200009b578063dbc1697614620009da578063dde0ff7714620009e4578063e0bfd3d214620009ff578063e46761c41462000a16578063f34eb8eb1462000a3e578063f4e926751462000a55578063f9c4c2ae1462000a66575f80fd5b8063c1acbc341462000916578063c4c928c21462000931578063ceee281d1462000948578063d02103ca1462000970578063d5073f6f1462000998578063d547741f14620009af578063d939b31514620009c6575f80fd5b80639c9f3dfe11620001575780639c9f3dfe1462000791578063a066215c14620007a8578063a217fddf14620007bf578063a2967d9914620007c7578063a3c573eb14620007d1578063afd23cbe1462000812578063b99d0ad7146200083c575f80fd5b8063841b24d7146200071057806387c20c01146200072b5780638bd4f071146200074257806391d14854146200075957806399f5634e14620007705780639a908e73146200077a575f80fd5b806325280169116200025f57806355a71ee0116200021357806355a71ee014620005995780636046916914620005dc57806365c0504d14620005e65780637222020f1462000694578063727885e914620006ab5780637975fcfe14620006c25780637fb6e76a14620006e8575f80fd5b80632528016914620004835780632f2ff15d146200053757806330c27dde146200054e57806336568abe1462000562578063394218e91462000579578063477fa2701462000590575f80fd5b80631489ed1011620002c35780631489ed1014620003cb57806315064c9614620003e25780631608859c14620003f05780631796a1ae14620004075780631816b7e5146200042e5780632072f6c51462000445578063248a9ca3146200044f575f80fd5b80630645af091462000310578063066ec0121462000329578063080b3111146200035a5780630a0d9fbe146200038257806311f6b287146200039d57806312b86e1914620003b4575b5f80fd5b620003276200032136600462004517565b62000b7c565b005b6084546200033d906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b620003716200036b36600462004600565b62000f39565b604051901515815260200162000351565b6085546200033d90600160401b90046001600160401b031681565b6200033d620003ae36600462004636565b62000f62565b62000327620003c536600462004664565b62000f81565b62000327620003dc366004620046f6565b62001129565b606f54620003719060ff1681565b620003276200040136600462004600565b620012b7565b607e54620004189063ffffffff1681565b60405163ffffffff909116815260200162000351565b620003276200043f3660046200477b565b6200134a565b62000327620013f5565b6200047462000460366004620047a5565b5f9081526034602052604090206001015490565b60405190815260200162000351565b620005036200049436600462004600565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b0390811691830191909152928201519092169082015260600162000351565b6200032762000548366004620047bd565b620014ba565b6087546200033d906001600160401b031681565b6200032762000573366004620047bd565b620014e2565b620003276200058a366004620047ee565b6200151c565b60865462000474565b62000474620005aa36600462004600565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b62000474620015cf565b6200064a620005f736600462004636565b607f6020525f90815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c00162000351565b62000327620006a536600462004636565b620015e6565b62000327620006bc366004620048ae565b620016e0565b620006d9620006d336600462004974565b62001b3d565b60405162000351919062004a27565b62000418620006f9366004620047ee565b60836020525f908152604090205463ffffffff1681565b6084546200033d90600160c01b90046001600160401b031681565b620003276200073c366004620046f6565b62001b6f565b620003276200075336600462004664565b62001e90565b620003716200076a366004620047bd565b62001f47565b6200047462001f71565b6200033d6200078b36600462004a3b565b62002052565b62000327620007a2366004620047ee565b6200221e565b62000327620007b9366004620047ee565b620022c3565b620004745f81565b6200047462002366565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200162000351565b6085546200082890600160801b900461ffff1681565b60405161ffff909116815260200162000351565b620008d16200084d36600462004600565b60408051608080820183525f8083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b6040516200035191905f6080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200033d90600160801b90046001600160401b031681565b620003276200094236600462004a66565b6200272e565b620004186200095936600462004af7565b60826020525f908152604090205463ffffffff1681565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b62000327620009a9366004620047a5565b62002a04565b62000327620009c0366004620047bd565b62002aa0565b6085546200033d906001600160401b031681565b6200032762002ac8565b6084546200033d90600160401b90046001600160401b031681565b6200032762000a1036600462004b26565b62002b94565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b6200032762000a4f36600462004b9e565b62002c68565b608054620004189063ffffffff1681565b62000afc62000a7736600462004636565b60816020525f9081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff166101608201526101800162000351565b5f54600290610100900460ff1615801562000b9d57505f5460ff8083169116105b62000c065760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c8662002e5c565b62000ca05f80516020620058898339815191528c62002ec8565b62000cac5f8862002ec8565b62000cd87fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908862002ec8565b62000d047f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8862002ec8565b62000d307f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8862002ec8565b62000d5c7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8962002ec8565b62000d887fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088962002ec8565b62000db47f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48962002ec8565b62000dce5f80516020620058498339815191528962002ec8565b62000e085f80516020620058898339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062002ed4565b62000e347f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08962002ec8565b62000e607f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8962002ec8565b62000e9a5f80516020620058698339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162002ed4565b62000eb45f80516020620058698339815191528762002ec8565b62000ee07f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518762002ec8565b62000eec5f3362002ec8565b5f805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050505050565b63ffffffff82165f90815260816020526040812062000f59908362002f1e565b90505b92915050565b63ffffffff81165f90815260816020526040812062000f5c9062002f62565b5f805160206200588983398151915262000f9b8162002fd1565b63ffffffff89165f90815260816020526040902062000fc1818a8a8a8a8a8a8a62002fdd565b600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562001028576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200106162002366565b6040518263ffffffff1660e01b81526004016200108091815260200190565b5f604051808303815f87803b15801562001098575f80fd5b505af1158015620010ab573d5f803e3d5ffd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b5f8051602062005889833981519152620011438162002fd1565b63ffffffff89165f90815260816020526040902062001169818a8a8a8a8a8a8a6200336b565b600681018054600160401b600160801b031916600160401b6001600160401b038a81169182029290921783555f9081526002840160205260409020879055600583018890559054600160801b90041615620011d0576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200120962002366565b6040518263ffffffff1660e01b81526004016200122891815260200190565b5f604051808303815f87803b15801562001240575f80fd5b505af115801562001253573d5f803e3d5ffd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff82165f908152608160205260409020620012e55f80516020620058898339815191523362001f47565b6200133957606f5460ff16156200130f57604051630bc011ff60e21b815260040160405180910390fd5b6200131b818362002f1e565b6200133957604051630674f25160e11b815260040160405180910390fd5b6200134581836200376a565b505050565b5f8051602062005849833981519152620013648162002fd1565b6103e88261ffff1610806200137e57506103ff8261ffff16115b156200139d57604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200140f5f80516020620058698339815191523362001f47565b620014ae57608454600160801b90046001600160401b031615806200145f57506084544290620014549062093a8090600160801b90046001600160401b031662004c44565b6001600160401b0316115b806200148f57506087544290620014849062093a80906001600160401b031662004c44565b6001600160401b0316115b15620014ae5760405163692baaad60e11b815260040160405180910390fd5b620014b862003955565b565b5f82815260346020526040902060010154620014d68162002fd1565b620013458383620039cf565b6001600160a01b03811633146200150c57604051630b4ad1cd60e31b815260040160405180910390fd5b62001518828262003a3a565b5050565b5f8051602062005849833981519152620015368162002fd1565b606f5460ff1662001578576084546001600160401b03600160c01b909104811690831610620015785760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001620013e9565b5f6086546064620015e1919062004c6e565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd620016128162002fd1565b63ffffffff82161580620016315750607e5463ffffffff908116908316115b156200165057604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f60205260409020600180820154600160e81b900460ff16151590036200169657604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd086200170c8162002fd1565b63ffffffff881615806200172b5750607e5463ffffffff908116908916115b156200174a57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88165f908152607f60205260409020600180820154600160e81b900460ff16151590036200179057604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b0388165f9081526083602052604090205463ffffffff1615620017cd576040516337c8fe0960e11b815260040160405180910390fd5b608080545f91908290620017e79063ffffffff1662004c88565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b039092169130916200183490620044dd565b620018429392919062004cad565b604051809103905ff0801580156200185c573d5f803e3d5ffd5b5090508160835f8c6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508a815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001ac0949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001b00908d908d9088908e908e908e9060040162004ce3565b5f604051808303815f87803b15801562001b18575f80fd5b505af115801562001b2b573d5f803e3d5ffd5b50505050505050505050505050505050565b63ffffffff86165f90815260816020526040902060609062001b6490878787878762003aa3565b979650505050505050565b606f5460ff161562001b9457604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001be292600160c01b90048116911662004c44565b6001600160401b0316111562001c0b57604051638a0704d360e01b815260040160405180910390fd5b6103e862001c1a888862004d45565b6001600160401b0316111562001c4357604051635acfba9d60e11b815260040160405180910390fd5b62001c5581898989898989896200336b565b62001c61818762003be2565b6085546001600160401b03165f0362001d6857600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562001cdb576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001d1462002366565b6040518263ffffffff1660e01b815260040162001d3391815260200190565b5f604051808303815f87803b15801562001d4b575f80fd5b505af115801562001d5e573d5f803e3d5ffd5b5050505062001e31565b62001d738162003dd9565b600681018054600160801b90046001600160401b031690601062001d978362004d68565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b900487165f90815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff161562001eb557604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f90815260816020526040902062001edb818989898989898962002fdd565b6001600160401b0387165f9081526004820160209081526040918290206002015482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a162001f3c62003955565b505050505050505050565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b81523060048201525f9081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562001fd8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001ffe919062004d86565b6084549091505f9062002024906001600160401b03600160401b82048116911662004d45565b6001600160401b03169050805f036200203f575f9250505090565b6200204b818362004db2565b9250505090565b606f545f9060ff16156200207957604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff1690819003620020b0576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f03620020da57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f90815260816020526040812060848054919287926200210c9084906001600160401b031662004c44565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f62002141878362004c44565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f95865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b031990921692909316919091171790559050620021d08362003dd9565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b5f8051602062005849833981519152620022388162002fd1565b606f5460ff1662002273576085546001600160401b0390811690831610620022735760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001620013e9565b5f8051602062005849833981519152620022dd8162002fd1565b62015180826001600160401b031611156200230b57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001620013e9565b6080545f9063ffffffff168082036200238057505f919050565b5f816001600160401b038111156200239c576200239c6200480a565b604051908082528060200260200182016040528015620023c6578160200160208202803683370190505b5090505f5b82811015620024365760815f620023e483600162004dc8565b63ffffffff1663ffffffff1681526020019081526020015f206005015482828151811062002416576200241662004dde565b6020908102919091010152806200242d8162004df2565b915050620023cb565b505f60205b836001146200268e575f6200245260028662004e0d565b6200245f60028762004db2565b6200246b919062004dc8565b90505f816001600160401b038111156200248957620024896200480a565b604051908082528060200260200182016040528015620024b3578160200160208202803683370190505b5090505f5b828110156200263a57620024ce60018462004e23565b81148015620024e95750620024e560028862004e0d565b6001145b15620025715785620024fd82600262004c6e565b8151811062002510576200251062004dde565b60200260200101518560405160200162002534929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106200255f576200255f62004dde565b60200260200101818152505062002625565b856200257f82600262004c6e565b8151811062002592576200259262004dde565b602002602001015186826002620025aa919062004c6e565b620025b790600162004dc8565b81518110620025ca57620025ca62004dde565b6020026020010151604051602001620025ed929190918252602082015260400190565b6040516020818303038152906040528051906020012082828151811062002618576200261862004dde565b6020026020010181815250505b80620026318162004df2565b915050620024b8565b5080945081955083846040516020016200265e929190918252602082015260400190565b6040516020818303038152906040528051906020012093508280620026839062004e39565b93505050506200243b565b5f835f81518110620026a457620026a462004dde565b602002602001015190505f5b828110156200272457604080516020810184905290810185905260600160408051601f198184030181528282528051602091820120908301879052908201869052925060600160405160208183030381529060405280519060200120935080806200271b9062004df2565b915050620026b0565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac6200275a8162002fd1565b63ffffffff84161580620027795750607e5463ffffffff908116908516115b156200279857604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526082602052604081205463ffffffff1690819003620027d8576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918716600160401b9091046001600160401b0316036200282657604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86165f908152607f60205260409020600180820154600160e81b900460ff16151590036200286c57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b9092041614620028aa57604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790555f620029298462000f62565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef286926200297f9216908b908b9060040162004e51565b5f604051808303815f87803b15801562002997575f80fd5b505af1158015620029aa573d5f803e3d5ffd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002a308162002fd1565b683635c9adc5dea0000082118062002a4b5750633b9aca0082105b1562002a6a57604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620013e9565b5f8281526034602052604090206001015462002abc8162002fd1565b62001345838362003a3a565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002af48162002fd1565b6087805467ffffffffffffffff1916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc16976916004808301925f92919082900301818387803b15801562002b70575f80fd5b505af115801562002b83573d5f803e3d5ffd5b5050505062002b9162003ea2565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62002bc08162002fd1565b6001600160401b0384165f9081526083602052604090205463ffffffff161562002bfd576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b0387165f9081526082602052604090205463ffffffff161562002c3a57604051630d409b9360e41b815260040160405180910390fd5b5f62002c4b88888888875f62003efa565b5f8080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002c948162002fd1565b607e80545f9190829062002cae9063ffffffff1662004c88565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff1681526020015f1515815260200185815250607f5f8363ffffffff1663ffffffff1681526020019081526020015f205f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002e4a9695949392919062004e90565b60405180910390a25050505050505050565b5f54610100900460ff16620014b85760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000bfd565b620015188282620039cf565b5f82815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6085546001600160401b038281165f9081526004850160205260408120549092429262002f5092918116911662004c44565b6001600160401b031611159392505050565b60068101545f90600160801b90046001600160401b03161562002fb4575060068101546001600160401b03600160801b90910481165f9081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002b9181336200411b565b60078801545f906001600160401b039081169087161015620030125760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620030b25760068901546001600160401b03600160801b909104811690891611156200305c5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f90815260048a0160205260409020600281015481549092888116600160401b9092041614620030ab57604051632bd2e3e760e01b815260040160405180910390fd5b5062003126565b506001600160401b0385165f90815260028901602052604090205480620030ec576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b909104811690871611156200312657604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b909104811690881611806200315f5750876001600160401b0316876001600160401b031611155b8062003183575060068901546001600160401b03600160c01b909104811690881611155b15620031a25760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260048b016020526040902054600160401b9004811690861614620031e8576040516332a2a77f60e01b815260040160405180910390fd5b5f620031f98a888888868962003aa3565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516200322f919062004ee8565b602060405180830381855afa1580156200324b573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019062003270919062004d86565b6200327c919062004e0d565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620032c09188919060040162004f05565b602060405180830381865afa158015620032dc573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062003302919062004f41565b62003320576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260048c0160205260409020600201548590036200335e5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b5f80620033788a62002f62565b60078b01549091506001600160401b039081169089161015620033ae5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620034505760068a01546001600160401b03600160801b9091048116908a161115620033f85760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a165f90815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200344957604051632bd2e3e760e01b815260040160405180910390fd5b50620034bf565b6001600160401b0388165f90815260028b0160205260409020549150816200348b576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b03161115620034bf57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620034f25760405163b9b18f5760e01b815260040160405180910390fd5b5f620035038b8a8a8a878b62003aa3565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405162003539919062004ee8565b602060405180830381855afa15801562003555573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200357a919062004d86565b62003586919062004e0d565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620035ca9189919060040162004f05565b602060405180830381865afa158015620035e6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200360c919062004f41565b6200362a576040516309bde33960e01b815260040160405180910390fd5b5f62003637848b62004d45565b90506200369087826001600160401b03166200365262001f71565b6200365e919062004c6e565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004145565b80608460088282829054906101000a90046001600160401b0316620036b6919062004c44565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d153906064015f604051808303815f87803b15801562003744575f80fd5b505af115801562003757573d5f803e3d5ffd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b9091048116908216111580620037a9575060068201546001600160401b03600160801b9091048116908216115b15620037c85760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f81815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200388362002366565b6040518263ffffffff1660e01b8152600401620038a291815260200190565b5f604051808303815f87803b158015620038ba575f80fd5b505af1158015620038cd573d5f803e3d5ffd5b505085546001600160a01b03165f90815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015620039ae575f80fd5b505af1158015620039c1573d5f803e3d5ffd5b50505050620014b862004199565b620039db828262001f47565b62001518575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003a46828262001f47565b1562001518575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086165f818152600389016020526040808220549388168252902054606092911580159062003ad8575081155b1562003af75760405163340c614f60e11b815260040160405180910390fd5b8062003b16576040516366385b5160e01b815260040160405180910390fd5b62003b2184620041f5565b62003b3f576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b5f62003bee8362002f62565b9050815f8062003bff848462004d45565b6085546001600160401b0391821692505f9162003c2591600160401b9004164262004e23565b90505b846001600160401b0316846001600160401b03161462003cae576001600160401b038085165f9081526003890160205260409020600181015490911682101562003c89576001810154600160401b90046001600160401b0316945062003ca7565b62003c95868662004d45565b6001600160401b031693505062003cae565b5062003c28565b5f62003cbb848462004e23565b90508381101562003d1957808403600c811162003cd9578062003cdc565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a608654028162003d0e5762003d0e62004d9e565b046086555062003d90565b838103600c811162003d2c578062003d2f565b600c5b90505f816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162003d685762003d6862004d9e565b04905080608654670de0b6b3a7640000028162003d895762003d8962004d9e565b0460865550505b683635c9adc5dea00000608654111562003db757683635c9adc5dea0000060865562003dcf565b633b9aca00608654101562003dcf57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002b915760068101545f9062003e2390600160c01b90046001600160401b0316600162004c44565b905062003e31828262002f1e565b15620015185760068201545f9060029062003e5e908490600160801b90046001600160401b031662004d45565b62003e6a919062004f62565b62003e76908362004c44565b905062003e84838262002f1e565b1562003e96576200134583826200376a565b6200134583836200376a565b606f5460ff1662003ec657604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b608080545f918291829062003f159063ffffffff1662004c88565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f876001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff16021790555060815f8263ffffffff1663ffffffff1681526020019081526020015f20915087825f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b0316021790555086826001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555084825f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620041089594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b62004127828262001f47565b6200151857604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526200134590849062004279565b606f5460ff1615620041be57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff000000016001600160401b0383161080156200422b575067ffffffff00000001604083901c6001600160401b0316105b80156200424c575067ffffffff00000001608083901c6001600160401b0316105b801562004264575067ffffffff0000000160c083901c105b156200427257506001919050565b505f919050565b5f620042cf826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620043519092919063ffffffff16565b805190915015620013455780806020019051810190620042f0919062004f41565b620013455760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000bfd565b60606200436184845f8562004369565b949350505050565b606082471015620043cc5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000bfd565b5f80866001600160a01b03168587604051620043e9919062004ee8565b5f6040518083038185875af1925050503d805f811462004425576040519150601f19603f3d011682016040523d82523d5f602084013e6200442a565b606091505b509150915062001b648783838760608315620044aa5782515f03620044a2576001600160a01b0385163b620044a25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000bfd565b508162004361565b620043618383815115620044c15781518083602001fd5b8060405162461bcd60e51b815260040162000bfd919062004a27565b6108be8062004f8b83390190565b6001600160a01b038116811462002b91575f80fd5b80356001600160401b038116811462002fcc575f80fd5b5f805f805f805f805f806101408b8d03121562004532575f80fd5b8a356200453f81620044eb565b99506200454f60208c0162004500565b98506200455f60408c0162004500565b975060608b01356200457181620044eb565b965060808b01356200458381620044eb565b955060a08b01356200459581620044eb565b945060c08b0135620045a781620044eb565b935060e08b0135620045b981620044eb565b9250620045ca6101008c0162004500565b9150620045db6101208c0162004500565b90509295989b9194979a5092959850565b803563ffffffff8116811462002fcc575f80fd5b5f806040838503121562004612575f80fd5b6200461d83620045ec565b91506200462d6020840162004500565b90509250929050565b5f6020828403121562004647575f80fd5b62000f5982620045ec565b80610300810183101562000f5c575f80fd5b5f805f805f805f806103e0898b0312156200467d575f80fd5b6200468889620045ec565b97506200469860208a0162004500565b9650620046a860408a0162004500565b9550620046b860608a0162004500565b9450620046c860808a0162004500565b935060a0890135925060c08901359150620046e78a60e08b0162004652565b90509295985092959890939650565b5f805f805f805f806103e0898b0312156200470f575f80fd5b6200471a89620045ec565b97506200472a60208a0162004500565b96506200473a60408a0162004500565b95506200474a60608a0162004500565b94506080890135935060a0890135925060c08901356200476a81620044eb565b9150620046e78a60e08b0162004652565b5f602082840312156200478c575f80fd5b813561ffff811681146200479e575f80fd5b9392505050565b5f60208284031215620047b6575f80fd5b5035919050565b5f8060408385031215620047cf575f80fd5b823591506020830135620047e381620044eb565b809150509250929050565b5f60208284031215620047ff575f80fd5b62000f598262004500565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126200482e575f80fd5b81356001600160401b03808211156200484b576200484b6200480a565b604051601f8301601f19908116603f011681019082821181831017156200487657620048766200480a565b816040528381528660208588010111156200488f575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a031215620048c5575f80fd5b620048d088620045ec565b9650620048e06020890162004500565b95506040880135620048f281620044eb565b945060608801356200490481620044eb565b935060808801356200491681620044eb565b925060a08801356001600160401b038082111562004932575f80fd5b620049408b838c016200481e565b935060c08a013591508082111562004956575f80fd5b50620049658a828b016200481e565b91505092959891949750929550565b5f805f805f8060c087890312156200498a575f80fd5b6200499587620045ec565b9550620049a56020880162004500565b9450620049b56040880162004500565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b83811015620049f2578181015183820152602001620049d8565b50505f910152565b5f815180845262004a13816020860160208601620049d6565b601f01601f19169290920160200192915050565b602081525f62000f596020830184620049fa565b5f806040838503121562004a4d575f80fd5b62004a588362004500565b946020939093013593505050565b5f805f806060858703121562004a7a575f80fd5b843562004a8781620044eb565b935062004a9760208601620045ec565b925060408501356001600160401b038082111562004ab3575f80fd5b818701915087601f83011262004ac7575f80fd5b81358181111562004ad6575f80fd5b88602082850101111562004ae8575f80fd5b95989497505060200194505050565b5f6020828403121562004b08575f80fd5b81356200479e81620044eb565b803560ff8116811462002fcc575f80fd5b5f805f805f8060c0878903121562004b3c575f80fd5b863562004b4981620044eb565b9550602087013562004b5b81620044eb565b945062004b6b6040880162004500565b935062004b7b6060880162004500565b92506080870135915062004b9260a0880162004b15565b90509295509295509295565b5f805f805f8060c0878903121562004bb4575f80fd5b863562004bc181620044eb565b9550602087013562004bd381620044eb565b945062004be36040880162004500565b935062004bf36060880162004b15565b92506080870135915060a08701356001600160401b0381111562004c15575f80fd5b62004c2389828a016200481e565b9150509295509295509295565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111562004c675762004c6762004c30565b5092915050565b808202811582820484141762000f5c5762000f5c62004c30565b5f63ffffffff80831681810362004ca35762004ca362004c30565b6001019392505050565b6001600160a01b038481168252831660208201526060604082018190525f9062004cda90830184620049fa565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190525f9062004d2490830185620049fa565b82810360a084015262004d388185620049fa565b9998505050505050505050565b6001600160401b0382811682821603908082111562004c675762004c6762004c30565b5f6001600160401b0380831681810362004ca35762004ca362004c30565b5f6020828403121562004d97575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8262004dc35762004dc362004d9e565b500490565b8082018082111562000f5c5762000f5c62004c30565b634e487b7160e01b5f52603260045260245ffd5b5f6001820162004e065762004e0662004c30565b5060010190565b5f8262004e1e5762004e1e62004d9e565b500690565b8181038181111562000f5c5762000f5c62004c30565b5f8162004e4a5762004e4a62004c30565b505f190190565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190525f9062004edc90830184620049fa565b98975050505050505050565b5f825162004efb818460208701620049d6565b9190910192915050565b6103208101610300808584378201835f5b600181101562004f3757815183526020928301929091019060010162004f16565b5050509392505050565b5f6020828403121562004f52575f80fd5b815180151581146200479e575f80fd5b5f6001600160401b038084168062004f7e5762004f7e62004d9e565b9216919091049291505056fe60a0604052604051620008be380380620008be8339810160408190526100249161034d565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b6565b505050610432565b61006182610124565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100aa576100a582826101a2565b505050565b6100b2610215565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f65f805160206200089e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161012181610236565b50565b806001600160a01b03163b5f0361015e57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516101be9190610417565b5f60405180830381855af49150503d805f81146101f6576040519150601f19603f3d011682016040523d82523d5f602084013e6101fb565b606091505b50909250905061020c858383610274565b95945050505050565b34156102345760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661025f57604051633173bdd160e11b81525f6004820152602401610155565b805f805160206200089e833981519152610181565b60608261028957610284826102d3565b6102cc565b81511580156102a057506001600160a01b0384163b155b156102c957604051639996b31560e01b81526001600160a01b0385166004820152602401610155565b50805b9392505050565b8051156102e35780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b0381168114610312575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561034557818101518382015260200161032d565b50505f910152565b5f805f6060848603121561035f575f80fd5b610368846102fc565b9250610376602085016102fc565b60408501519092506001600160401b0380821115610392575f80fd5b818601915086601f8301126103a5575f80fd5b8151818111156103b7576103b7610317565b604051601f8201601f19908116603f011681019083821181831017156103df576103df610317565b816040528281528960208487010111156103f7575f80fd5b61040883602083016020880161032b565b80955050505050509250925092565b5f825161042881846020870161032b565b9190910192915050565b6080516104546200044a5f395f601001526104545ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610069575f356001600160e01b03191663278f794360e11b146100615761005f61006d565b565b61005f61007d565b61005f5b61005f6100786100ab565b6100e2565b5f8061008c36600481846102ee565b8101906100999190610329565b915091506100a78282610100565b5050565b5f6100dd7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156100fc573d5ff35b3d5ffd5b6101098261015a565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101525761014d82826101d5565b505050565b6100a7610247565b806001600160a01b03163b5f0361019457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101f191906103f2565b5f60405180830381855af49150503d805f8114610229576040519150601f19603f3d011682016040523d82523d5f602084013e61022e565b606091505b509150915061023e858383610266565b95945050505050565b341561005f5760405163b398979f60e01b815260040160405180910390fd5b60608261027b57610276826102c5565b6102be565b815115801561029257506001600160a01b0384163b155b156102bb57604051639996b31560e01b81526001600160a01b038516600482015260240161018b565b50805b9392505050565b8051156102d55780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f80858511156102fc575f80fd5b83861115610308575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561033a575f80fd5b82356001600160a01b0381168114610350575f80fd5b9150602083013567ffffffffffffffff8082111561036c575f80fd5b818501915085601f83011261037f575f80fd5b81358181111561039157610391610315565b604051601f8201601f19908116603f011681019083821181831017156103b9576103b9610315565b816040528281528860208487010111156103d1575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b8181101561041157602081860181015185830152016103f7565b505f92019182525091905056fea2646970667358221220c3817d11eb3dc87723342527d38da55b7b3b362f54567f56cf1ef4db2f8a430664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a2646970667358221220a4110513306739c3c08cc22958bf1451aa1a4a1222df971c0412e1c1ab1b08c764736f6c63430008140033", + "bytecode": "0x60e060405234801562000010575f80fd5b5060405162005ace38038062005ace83398101604081905262000033916200013c565b6001600160a01b0380841660805280831660c052811660a0528282826200005962000065565b5050505050506200018d565b5f54610100900460ff1615620000d15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101562000122575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811462000139575f80fd5b50565b5f805f606084860312156200014f575f80fd5b83516200015c8162000124565b60208501519093506200016f8162000124565b6040850151909250620001828162000124565b809150509250925092565b60805160a05160c0516158de620001f05f395f8181610a1c01528181611f92015261366801525f81816107d701528181612b22015261395701525f81816109760152818161102a015281816111d201528181611cdd015261384c01526158de5ff3fe608060405234801562000010575f80fd5b50600436106200030c575f3560e01c8063841b24d711620001a3578063c1acbc3411620000f3578063dbc16976116200009b578063dbc1697614620009da578063dde0ff7714620009e4578063e0bfd3d214620009ff578063e46761c41462000a16578063f34eb8eb1462000a3e578063f4e926751462000a55578063f9c4c2ae1462000a66575f80fd5b8063c1acbc341462000916578063c4c928c21462000931578063ceee281d1462000948578063d02103ca1462000970578063d5073f6f1462000998578063d547741f14620009af578063d939b31514620009c6575f80fd5b80639c9f3dfe11620001575780639c9f3dfe1462000791578063a066215c14620007a8578063a217fddf14620007bf578063a2967d9914620007c7578063a3c573eb14620007d1578063afd23cbe1462000812578063b99d0ad7146200083c575f80fd5b8063841b24d7146200071057806387c20c01146200072b5780638bd4f071146200074257806391d14854146200075957806399f5634e14620007705780639a908e73146200077a575f80fd5b806325280169116200025f57806355a71ee0116200021357806355a71ee014620005995780636046916914620005dc57806365c0504d14620005e65780637222020f1462000694578063727885e914620006ab5780637975fcfe14620006c25780637fb6e76a14620006e8575f80fd5b80632528016914620004835780632f2ff15d146200053757806330c27dde146200054e57806336568abe1462000562578063394218e91462000579578063477fa2701462000590575f80fd5b80631489ed1011620002c35780631489ed1014620003cb57806315064c9614620003e25780631608859c14620003f05780631796a1ae14620004075780631816b7e5146200042e5780632072f6c51462000445578063248a9ca3146200044f575f80fd5b80630645af091462000310578063066ec0121462000329578063080b3111146200035a5780630a0d9fbe146200038257806311f6b287146200039d57806312b86e1914620003b4575b5f80fd5b620003276200032136600462004517565b62000b7c565b005b6084546200033d906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b620003716200036b36600462004600565b62000f39565b604051901515815260200162000351565b6085546200033d90600160401b90046001600160401b031681565b6200033d620003ae36600462004636565b62000f62565b62000327620003c536600462004664565b62000f81565b62000327620003dc366004620046f6565b62001129565b606f54620003719060ff1681565b620003276200040136600462004600565b620012b7565b607e54620004189063ffffffff1681565b60405163ffffffff909116815260200162000351565b620003276200043f3660046200477b565b6200134a565b62000327620013f5565b6200047462000460366004620047a5565b5f9081526034602052604090206001015490565b60405190815260200162000351565b620005036200049436600462004600565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b0390811691830191909152928201519092169082015260600162000351565b6200032762000548366004620047bd565b620014ba565b6087546200033d906001600160401b031681565b6200032762000573366004620047bd565b620014e2565b620003276200058a366004620047ee565b6200151c565b60865462000474565b62000474620005aa36600462004600565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b62000474620015cf565b6200064a620005f736600462004636565b607f6020525f90815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c00162000351565b62000327620006a536600462004636565b620015e6565b62000327620006bc366004620048ae565b620016e0565b620006d9620006d336600462004974565b62001b3d565b60405162000351919062004a27565b62000418620006f9366004620047ee565b60836020525f908152604090205463ffffffff1681565b6084546200033d90600160c01b90046001600160401b031681565b620003276200073c366004620046f6565b62001b6f565b620003276200075336600462004664565b62001e90565b620003716200076a366004620047bd565b62001f47565b6200047462001f71565b6200033d6200078b36600462004a3b565b62002052565b62000327620007a2366004620047ee565b6200221e565b62000327620007b9366004620047ee565b620022c3565b620004745f81565b6200047462002366565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200162000351565b6085546200082890600160801b900461ffff1681565b60405161ffff909116815260200162000351565b620008d16200084d36600462004600565b60408051608080820183525f8083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b6040516200035191905f6080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200033d90600160801b90046001600160401b031681565b620003276200094236600462004a66565b6200272e565b620004186200095936600462004af7565b60826020525f908152604090205463ffffffff1681565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b62000327620009a9366004620047a5565b62002a04565b62000327620009c0366004620047bd565b62002aa0565b6085546200033d906001600160401b031681565b6200032762002ac8565b6084546200033d90600160401b90046001600160401b031681565b6200032762000a1036600462004b26565b62002b94565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b6200032762000a4f36600462004b9e565b62002c68565b608054620004189063ffffffff1681565b62000afc62000a7736600462004636565b60816020525f9081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff166101608201526101800162000351565b5f54600290610100900460ff1615801562000b9d57505f5460ff8083169116105b62000c065760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c8662002e5c565b62000ca05f80516020620058898339815191528c62002ec8565b62000cac5f8862002ec8565b62000cd87fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908862002ec8565b62000d047f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8862002ec8565b62000d307f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8862002ec8565b62000d5c7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8962002ec8565b62000d887fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088962002ec8565b62000db47f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48962002ec8565b62000dce5f80516020620058498339815191528962002ec8565b62000e085f80516020620058898339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062002ed4565b62000e347f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08962002ec8565b62000e607f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8962002ec8565b62000e9a5f80516020620058698339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162002ed4565b62000eb45f80516020620058698339815191528762002ec8565b62000ee07f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518762002ec8565b62000eec5f3362002ec8565b5f805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050505050565b63ffffffff82165f90815260816020526040812062000f59908362002f1e565b90505b92915050565b63ffffffff81165f90815260816020526040812062000f5c9062002f62565b5f805160206200588983398151915262000f9b8162002fd1565b63ffffffff89165f90815260816020526040902062000fc1818a8a8a8a8a8a8a62002fdd565b600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562001028576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200106162002366565b6040518263ffffffff1660e01b81526004016200108091815260200190565b5f604051808303815f87803b15801562001098575f80fd5b505af1158015620010ab573d5f803e3d5ffd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b5f8051602062005889833981519152620011438162002fd1565b63ffffffff89165f90815260816020526040902062001169818a8a8a8a8a8a8a6200336b565b600681018054600160401b600160801b031916600160401b6001600160401b038a81169182029290921783555f9081526002840160205260409020879055600583018890559054600160801b90041615620011d0576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200120962002366565b6040518263ffffffff1660e01b81526004016200122891815260200190565b5f604051808303815f87803b15801562001240575f80fd5b505af115801562001253573d5f803e3d5ffd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff82165f908152608160205260409020620012e55f80516020620058898339815191523362001f47565b6200133957606f5460ff16156200130f57604051630bc011ff60e21b815260040160405180910390fd5b6200131b818362002f1e565b6200133957604051630674f25160e11b815260040160405180910390fd5b6200134581836200376a565b505050565b5f8051602062005849833981519152620013648162002fd1565b6103e88261ffff1610806200137e57506103ff8261ffff16115b156200139d57604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200140f5f80516020620058698339815191523362001f47565b620014ae57608454600160801b90046001600160401b031615806200145f57506084544290620014549062093a8090600160801b90046001600160401b031662004c44565b6001600160401b0316115b806200148f57506087544290620014849062093a80906001600160401b031662004c44565b6001600160401b0316115b15620014ae5760405163692baaad60e11b815260040160405180910390fd5b620014b862003955565b565b5f82815260346020526040902060010154620014d68162002fd1565b620013458383620039cf565b6001600160a01b03811633146200150c57604051630b4ad1cd60e31b815260040160405180910390fd5b62001518828262003a3a565b5050565b5f8051602062005849833981519152620015368162002fd1565b606f5460ff1662001578576084546001600160401b03600160c01b909104811690831610620015785760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001620013e9565b5f6086546064620015e1919062004c6e565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd620016128162002fd1565b63ffffffff82161580620016315750607e5463ffffffff908116908316115b156200165057604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f60205260409020600180820154600160e81b900460ff16151590036200169657604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd086200170c8162002fd1565b63ffffffff881615806200172b5750607e5463ffffffff908116908916115b156200174a57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88165f908152607f60205260409020600180820154600160e81b900460ff16151590036200179057604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b0388165f9081526083602052604090205463ffffffff1615620017cd576040516337c8fe0960e11b815260040160405180910390fd5b608080545f91908290620017e79063ffffffff1662004c88565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b039092169130916200183490620044dd565b620018429392919062004cad565b604051809103905ff0801580156200185c573d5f803e3d5ffd5b5090508160835f8c6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508a815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001ac0949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001b00908d908d9088908e908e908e9060040162004ce3565b5f604051808303815f87803b15801562001b18575f80fd5b505af115801562001b2b573d5f803e3d5ffd5b50505050505050505050505050505050565b63ffffffff86165f90815260816020526040902060609062001b6490878787878762003aa3565b979650505050505050565b606f5460ff161562001b9457604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001be292600160c01b90048116911662004c44565b6001600160401b0316111562001c0b57604051638a0704d360e01b815260040160405180910390fd5b6103e862001c1a888862004d45565b6001600160401b0316111562001c4357604051635acfba9d60e11b815260040160405180910390fd5b62001c5581898989898989896200336b565b62001c61818762003be2565b6085546001600160401b03165f0362001d6857600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562001cdb576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001d1462002366565b6040518263ffffffff1660e01b815260040162001d3391815260200190565b5f604051808303815f87803b15801562001d4b575f80fd5b505af115801562001d5e573d5f803e3d5ffd5b5050505062001e31565b62001d738162003dd9565b600681018054600160801b90046001600160401b031690601062001d978362004d68565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b900487165f90815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff161562001eb557604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f90815260816020526040902062001edb818989898989898962002fdd565b6001600160401b0387165f9081526004820160209081526040918290206002015482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a162001f3c62003955565b505050505050505050565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b81523060048201525f9081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562001fd8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001ffe919062004d86565b6084549091505f9062002024906001600160401b03600160401b82048116911662004d45565b6001600160401b03169050805f036200203f575f9250505090565b6200204b818362004db2565b9250505090565b606f545f9060ff16156200207957604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff1690819003620020b0576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f03620020da57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f90815260816020526040812060848054919287926200210c9084906001600160401b031662004c44565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f62002141878362004c44565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f95865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b031990921692909316919091171790559050620021d08362003dd9565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b5f8051602062005849833981519152620022388162002fd1565b606f5460ff1662002273576085546001600160401b0390811690831610620022735760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001620013e9565b5f8051602062005849833981519152620022dd8162002fd1565b62015180826001600160401b031611156200230b57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001620013e9565b6080545f9063ffffffff168082036200238057505f919050565b5f816001600160401b038111156200239c576200239c6200480a565b604051908082528060200260200182016040528015620023c6578160200160208202803683370190505b5090505f5b82811015620024365760815f620023e483600162004dc8565b63ffffffff1663ffffffff1681526020019081526020015f206005015482828151811062002416576200241662004dde565b6020908102919091010152806200242d8162004df2565b915050620023cb565b505f60205b836001146200268e575f6200245260028662004e0d565b6200245f60028762004db2565b6200246b919062004dc8565b90505f816001600160401b038111156200248957620024896200480a565b604051908082528060200260200182016040528015620024b3578160200160208202803683370190505b5090505f5b828110156200263a57620024ce60018462004e23565b81148015620024e95750620024e560028862004e0d565b6001145b15620025715785620024fd82600262004c6e565b8151811062002510576200251062004dde565b60200260200101518560405160200162002534929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106200255f576200255f62004dde565b60200260200101818152505062002625565b856200257f82600262004c6e565b8151811062002592576200259262004dde565b602002602001015186826002620025aa919062004c6e565b620025b790600162004dc8565b81518110620025ca57620025ca62004dde565b6020026020010151604051602001620025ed929190918252602082015260400190565b6040516020818303038152906040528051906020012082828151811062002618576200261862004dde565b6020026020010181815250505b80620026318162004df2565b915050620024b8565b5080945081955083846040516020016200265e929190918252602082015260400190565b6040516020818303038152906040528051906020012093508280620026839062004e39565b93505050506200243b565b5f835f81518110620026a457620026a462004dde565b602002602001015190505f5b828110156200272457604080516020810184905290810185905260600160408051601f198184030181528282528051602091820120908301879052908201869052925060600160405160208183030381529060405280519060200120935080806200271b9062004df2565b915050620026b0565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac6200275a8162002fd1565b63ffffffff84161580620027795750607e5463ffffffff908116908516115b156200279857604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526082602052604081205463ffffffff1690819003620027d8576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918716600160401b9091046001600160401b0316036200282657604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86165f908152607f60205260409020600180820154600160e81b900460ff16151590036200286c57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b9092041614620028aa57604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790555f620029298462000f62565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef286926200297f9216908b908b9060040162004e51565b5f604051808303815f87803b15801562002997575f80fd5b505af1158015620029aa573d5f803e3d5ffd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002a308162002fd1565b683635c9adc5dea0000082118062002a4b5750633b9aca0082105b1562002a6a57604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620013e9565b5f8281526034602052604090206001015462002abc8162002fd1565b62001345838362003a3a565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002af48162002fd1565b6087805467ffffffffffffffff1916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc16976916004808301925f92919082900301818387803b15801562002b70575f80fd5b505af115801562002b83573d5f803e3d5ffd5b5050505062002b9162003ea2565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62002bc08162002fd1565b6001600160401b0384165f9081526083602052604090205463ffffffff161562002bfd576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b0387165f9081526082602052604090205463ffffffff161562002c3a57604051630d409b9360e41b815260040160405180910390fd5b5f62002c4b88888888875f62003efa565b5f8080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002c948162002fd1565b607e80545f9190829062002cae9063ffffffff1662004c88565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff1681526020015f1515815260200185815250607f5f8363ffffffff1663ffffffff1681526020019081526020015f205f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002e4a9695949392919062004e90565b60405180910390a25050505050505050565b5f54610100900460ff16620014b85760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000bfd565b620015188282620039cf565b5f82815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6085546001600160401b038281165f9081526004850160205260408120549092429262002f5092918116911662004c44565b6001600160401b031611159392505050565b60068101545f90600160801b90046001600160401b03161562002fb4575060068101546001600160401b03600160801b90910481165f9081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002b9181336200411b565b60078801545f906001600160401b039081169087161015620030125760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620030b25760068901546001600160401b03600160801b909104811690891611156200305c5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f90815260048a0160205260409020600281015481549092888116600160401b9092041614620030ab57604051632bd2e3e760e01b815260040160405180910390fd5b5062003126565b506001600160401b0385165f90815260028901602052604090205480620030ec576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b909104811690871611156200312657604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b909104811690881611806200315f5750876001600160401b0316876001600160401b031611155b8062003183575060068901546001600160401b03600160c01b909104811690881611155b15620031a25760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260048b016020526040902054600160401b9004811690861614620031e8576040516332a2a77f60e01b815260040160405180910390fd5b5f620031f98a888888868962003aa3565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516200322f919062004ee8565b602060405180830381855afa1580156200324b573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019062003270919062004d86565b6200327c919062004e0d565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620032c09188919060040162004f05565b602060405180830381865afa158015620032dc573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062003302919062004f41565b62003320576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260048c0160205260409020600201548590036200335e5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b5f80620033788a62002f62565b60078b01549091506001600160401b039081169089161015620033ae5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620034505760068a01546001600160401b03600160801b9091048116908a161115620033f85760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a165f90815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200344957604051632bd2e3e760e01b815260040160405180910390fd5b50620034bf565b6001600160401b0388165f90815260028b0160205260409020549150816200348b576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b03161115620034bf57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620034f25760405163b9b18f5760e01b815260040160405180910390fd5b5f620035038b8a8a8a878b62003aa3565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405162003539919062004ee8565b602060405180830381855afa15801562003555573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200357a919062004d86565b62003586919062004e0d565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620035ca9189919060040162004f05565b602060405180830381865afa158015620035e6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200360c919062004f41565b6200362a576040516309bde33960e01b815260040160405180910390fd5b5f62003637848b62004d45565b90506200369087826001600160401b03166200365262001f71565b6200365e919062004c6e565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004145565b80608460088282829054906101000a90046001600160401b0316620036b6919062004c44565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d153906064015f604051808303815f87803b15801562003744575f80fd5b505af115801562003757573d5f803e3d5ffd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b9091048116908216111580620037a9575060068201546001600160401b03600160801b9091048116908216115b15620037c85760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f81815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200388362002366565b6040518263ffffffff1660e01b8152600401620038a291815260200190565b5f604051808303815f87803b158015620038ba575f80fd5b505af1158015620038cd573d5f803e3d5ffd5b505085546001600160a01b03165f90815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015620039ae575f80fd5b505af1158015620039c1573d5f803e3d5ffd5b50505050620014b862004199565b620039db828262001f47565b62001518575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003a46828262001f47565b1562001518575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086165f818152600389016020526040808220549388168252902054606092911580159062003ad8575081155b1562003af75760405163340c614f60e11b815260040160405180910390fd5b8062003b16576040516366385b5160e01b815260040160405180910390fd5b62003b2184620041f5565b62003b3f576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b5f62003bee8362002f62565b9050815f8062003bff848462004d45565b6085546001600160401b0391821692505f9162003c2591600160401b9004164262004e23565b90505b846001600160401b0316846001600160401b03161462003cae576001600160401b038085165f9081526003890160205260409020600181015490911682101562003c89576001810154600160401b90046001600160401b0316945062003ca7565b62003c95868662004d45565b6001600160401b031693505062003cae565b5062003c28565b5f62003cbb848462004e23565b90508381101562003d1957808403600c811162003cd9578062003cdc565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a608654028162003d0e5762003d0e62004d9e565b046086555062003d90565b838103600c811162003d2c578062003d2f565b600c5b90505f816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162003d685762003d6862004d9e565b04905080608654670de0b6b3a7640000028162003d895762003d8962004d9e565b0460865550505b683635c9adc5dea00000608654111562003db757683635c9adc5dea0000060865562003dcf565b633b9aca00608654101562003dcf57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002b915760068101545f9062003e2390600160c01b90046001600160401b0316600162004c44565b905062003e31828262002f1e565b15620015185760068201545f9060029062003e5e908490600160801b90046001600160401b031662004d45565b62003e6a919062004f62565b62003e76908362004c44565b905062003e84838262002f1e565b1562003e96576200134583826200376a565b6200134583836200376a565b606f5460ff1662003ec657604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b608080545f918291829062003f159063ffffffff1662004c88565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f876001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff16021790555060815f8263ffffffff1663ffffffff1681526020019081526020015f20915087825f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b0316021790555086826001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555084825f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620041089594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b62004127828262001f47565b6200151857604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526200134590849062004279565b606f5460ff1615620041be57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff000000016001600160401b0383161080156200422b575067ffffffff00000001604083901c6001600160401b0316105b80156200424c575067ffffffff00000001608083901c6001600160401b0316105b801562004264575067ffffffff0000000160c083901c105b156200427257506001919050565b505f919050565b5f620042cf826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620043519092919063ffffffff16565b805190915015620013455780806020019051810190620042f0919062004f41565b620013455760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000bfd565b60606200436184845f8562004369565b949350505050565b606082471015620043cc5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000bfd565b5f80866001600160a01b03168587604051620043e9919062004ee8565b5f6040518083038185875af1925050503d805f811462004425576040519150601f19603f3d011682016040523d82523d5f602084013e6200442a565b606091505b509150915062001b648783838760608315620044aa5782515f03620044a2576001600160a01b0385163b620044a25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000bfd565b508162004361565b620043618383815115620044c15781518083602001fd5b8060405162461bcd60e51b815260040162000bfd919062004a27565b6108be8062004f8b83390190565b6001600160a01b038116811462002b91575f80fd5b80356001600160401b038116811462002fcc575f80fd5b5f805f805f805f805f806101408b8d03121562004532575f80fd5b8a356200453f81620044eb565b99506200454f60208c0162004500565b98506200455f60408c0162004500565b975060608b01356200457181620044eb565b965060808b01356200458381620044eb565b955060a08b01356200459581620044eb565b945060c08b0135620045a781620044eb565b935060e08b0135620045b981620044eb565b9250620045ca6101008c0162004500565b9150620045db6101208c0162004500565b90509295989b9194979a5092959850565b803563ffffffff8116811462002fcc575f80fd5b5f806040838503121562004612575f80fd5b6200461d83620045ec565b91506200462d6020840162004500565b90509250929050565b5f6020828403121562004647575f80fd5b62000f5982620045ec565b80610300810183101562000f5c575f80fd5b5f805f805f805f806103e0898b0312156200467d575f80fd5b6200468889620045ec565b97506200469860208a0162004500565b9650620046a860408a0162004500565b9550620046b860608a0162004500565b9450620046c860808a0162004500565b935060a0890135925060c08901359150620046e78a60e08b0162004652565b90509295985092959890939650565b5f805f805f805f806103e0898b0312156200470f575f80fd5b6200471a89620045ec565b97506200472a60208a0162004500565b96506200473a60408a0162004500565b95506200474a60608a0162004500565b94506080890135935060a0890135925060c08901356200476a81620044eb565b9150620046e78a60e08b0162004652565b5f602082840312156200478c575f80fd5b813561ffff811681146200479e575f80fd5b9392505050565b5f60208284031215620047b6575f80fd5b5035919050565b5f8060408385031215620047cf575f80fd5b823591506020830135620047e381620044eb565b809150509250929050565b5f60208284031215620047ff575f80fd5b62000f598262004500565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126200482e575f80fd5b81356001600160401b03808211156200484b576200484b6200480a565b604051601f8301601f19908116603f011681019082821181831017156200487657620048766200480a565b816040528381528660208588010111156200488f575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a031215620048c5575f80fd5b620048d088620045ec565b9650620048e06020890162004500565b95506040880135620048f281620044eb565b945060608801356200490481620044eb565b935060808801356200491681620044eb565b925060a08801356001600160401b038082111562004932575f80fd5b620049408b838c016200481e565b935060c08a013591508082111562004956575f80fd5b50620049658a828b016200481e565b91505092959891949750929550565b5f805f805f8060c087890312156200498a575f80fd5b6200499587620045ec565b9550620049a56020880162004500565b9450620049b56040880162004500565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b83811015620049f2578181015183820152602001620049d8565b50505f910152565b5f815180845262004a13816020860160208601620049d6565b601f01601f19169290920160200192915050565b602081525f62000f596020830184620049fa565b5f806040838503121562004a4d575f80fd5b62004a588362004500565b946020939093013593505050565b5f805f806060858703121562004a7a575f80fd5b843562004a8781620044eb565b935062004a9760208601620045ec565b925060408501356001600160401b038082111562004ab3575f80fd5b818701915087601f83011262004ac7575f80fd5b81358181111562004ad6575f80fd5b88602082850101111562004ae8575f80fd5b95989497505060200194505050565b5f6020828403121562004b08575f80fd5b81356200479e81620044eb565b803560ff8116811462002fcc575f80fd5b5f805f805f8060c0878903121562004b3c575f80fd5b863562004b4981620044eb565b9550602087013562004b5b81620044eb565b945062004b6b6040880162004500565b935062004b7b6060880162004500565b92506080870135915062004b9260a0880162004b15565b90509295509295509295565b5f805f805f8060c0878903121562004bb4575f80fd5b863562004bc181620044eb565b9550602087013562004bd381620044eb565b945062004be36040880162004500565b935062004bf36060880162004b15565b92506080870135915060a08701356001600160401b0381111562004c15575f80fd5b62004c2389828a016200481e565b9150509295509295509295565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111562004c675762004c6762004c30565b5092915050565b808202811582820484141762000f5c5762000f5c62004c30565b5f63ffffffff80831681810362004ca35762004ca362004c30565b6001019392505050565b6001600160a01b038481168252831660208201526060604082018190525f9062004cda90830184620049fa565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190525f9062004d2490830185620049fa565b82810360a084015262004d388185620049fa565b9998505050505050505050565b6001600160401b0382811682821603908082111562004c675762004c6762004c30565b5f6001600160401b0380831681810362004ca35762004ca362004c30565b5f6020828403121562004d97575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8262004dc35762004dc362004d9e565b500490565b8082018082111562000f5c5762000f5c62004c30565b634e487b7160e01b5f52603260045260245ffd5b5f6001820162004e065762004e0662004c30565b5060010190565b5f8262004e1e5762004e1e62004d9e565b500690565b8181038181111562000f5c5762000f5c62004c30565b5f8162004e4a5762004e4a62004c30565b505f190190565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190525f9062004edc90830184620049fa565b98975050505050505050565b5f825162004efb818460208701620049d6565b9190910192915050565b6103208101610300808584378201835f5b600181101562004f3757815183526020928301929091019060010162004f16565b5050509392505050565b5f6020828403121562004f52575f80fd5b815180151581146200479e575f80fd5b5f6001600160401b038084168062004f7e5762004f7e62004d9e565b9216919091049291505056fe60a0604052604051620008be380380620008be8339810160408190526100249161034d565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b6565b505050610432565b61006182610124565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100aa576100a582826101a2565b505050565b6100b2610215565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f65f805160206200089e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161012181610236565b50565b806001600160a01b03163b5f0361015e57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516101be9190610417565b5f60405180830381855af49150503d805f81146101f6576040519150601f19603f3d011682016040523d82523d5f602084013e6101fb565b606091505b50909250905061020c858383610274565b95945050505050565b34156102345760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661025f57604051633173bdd160e11b81525f6004820152602401610155565b805f805160206200089e833981519152610181565b60608261028957610284826102d3565b6102cc565b81511580156102a057506001600160a01b0384163b155b156102c957604051639996b31560e01b81526001600160a01b0385166004820152602401610155565b50805b9392505050565b8051156102e35780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b0381168114610312575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561034557818101518382015260200161032d565b50505f910152565b5f805f6060848603121561035f575f80fd5b610368846102fc565b9250610376602085016102fc565b60408501519092506001600160401b0380821115610392575f80fd5b818601915086601f8301126103a5575f80fd5b8151818111156103b7576103b7610317565b604051601f8201601f19908116603f011681019083821181831017156103df576103df610317565b816040528281528960208487010111156103f7575f80fd5b61040883602083016020880161032b565b80955050505050509250925092565b5f825161042881846020870161032b565b9190910192915050565b6080516104546200044a5f395f601001526104545ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610069575f356001600160e01b03191663278f794360e11b146100615761005f61006d565b565b61005f61007d565b61005f5b61005f6100786100ab565b6100e2565b5f8061008c36600481846102ee565b8101906100999190610329565b915091506100a78282610100565b5050565b5f6100dd7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156100fc573d5ff35b3d5ffd5b6101098261015a565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101525761014d82826101d5565b505050565b6100a7610247565b806001600160a01b03163b5f0361019457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101f191906103f2565b5f60405180830381855af49150503d805f8114610229576040519150601f19603f3d011682016040523d82523d5f602084013e61022e565b606091505b509150915061023e858383610266565b95945050505050565b341561005f5760405163b398979f60e01b815260040160405180910390fd5b60608261027b57610276826102c5565b6102be565b815115801561029257506001600160a01b0384163b155b156102bb57604051639996b31560e01b81526001600160a01b038516600482015260240161018b565b50805b9392505050565b8051156102d55780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f80858511156102fc575f80fd5b83861115610308575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561033a575f80fd5b82356001600160a01b0381168114610350575f80fd5b9150602083013567ffffffffffffffff8082111561036c575f80fd5b818501915085601f83011261037f575f80fd5b81358181111561039157610391610315565b604051601f8201601f19908116603f011681019083821181831017156103b9576103b9610315565b816040528281528860208487010111156103d1575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b8181101561041157602081860181015185830152016103f7565b505f92019182525091905056fea2646970667358221220c3817d11eb3dc87723342527d38da55b7b3b362f54567f56cf1ef4db2f8a430664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a264697066735822122044bd5c88caa97e7d9ea1bedd17562eaa2510cdf7ce4b0dce5dddb3e2c3abc93064736f6c63430008140033", + "deployedBytecode": "0x608060405234801562000010575f80fd5b50600436106200030c575f3560e01c8063841b24d711620001a3578063c1acbc3411620000f3578063dbc16976116200009b578063dbc1697614620009da578063dde0ff7714620009e4578063e0bfd3d214620009ff578063e46761c41462000a16578063f34eb8eb1462000a3e578063f4e926751462000a55578063f9c4c2ae1462000a66575f80fd5b8063c1acbc341462000916578063c4c928c21462000931578063ceee281d1462000948578063d02103ca1462000970578063d5073f6f1462000998578063d547741f14620009af578063d939b31514620009c6575f80fd5b80639c9f3dfe11620001575780639c9f3dfe1462000791578063a066215c14620007a8578063a217fddf14620007bf578063a2967d9914620007c7578063a3c573eb14620007d1578063afd23cbe1462000812578063b99d0ad7146200083c575f80fd5b8063841b24d7146200071057806387c20c01146200072b5780638bd4f071146200074257806391d14854146200075957806399f5634e14620007705780639a908e73146200077a575f80fd5b806325280169116200025f57806355a71ee0116200021357806355a71ee014620005995780636046916914620005dc57806365c0504d14620005e65780637222020f1462000694578063727885e914620006ab5780637975fcfe14620006c25780637fb6e76a14620006e8575f80fd5b80632528016914620004835780632f2ff15d146200053757806330c27dde146200054e57806336568abe1462000562578063394218e91462000579578063477fa2701462000590575f80fd5b80631489ed1011620002c35780631489ed1014620003cb57806315064c9614620003e25780631608859c14620003f05780631796a1ae14620004075780631816b7e5146200042e5780632072f6c51462000445578063248a9ca3146200044f575f80fd5b80630645af091462000310578063066ec0121462000329578063080b3111146200035a5780630a0d9fbe146200038257806311f6b287146200039d57806312b86e1914620003b4575b5f80fd5b620003276200032136600462004517565b62000b7c565b005b6084546200033d906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b620003716200036b36600462004600565b62000f39565b604051901515815260200162000351565b6085546200033d90600160401b90046001600160401b031681565b6200033d620003ae36600462004636565b62000f62565b62000327620003c536600462004664565b62000f81565b62000327620003dc366004620046f6565b62001129565b606f54620003719060ff1681565b620003276200040136600462004600565b620012b7565b607e54620004189063ffffffff1681565b60405163ffffffff909116815260200162000351565b620003276200043f3660046200477b565b6200134a565b62000327620013f5565b6200047462000460366004620047a5565b5f9081526034602052604090206001015490565b60405190815260200162000351565b620005036200049436600462004600565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b0390811691830191909152928201519092169082015260600162000351565b6200032762000548366004620047bd565b620014ba565b6087546200033d906001600160401b031681565b6200032762000573366004620047bd565b620014e2565b620003276200058a366004620047ee565b6200151c565b60865462000474565b62000474620005aa36600462004600565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b62000474620015cf565b6200064a620005f736600462004636565b607f6020525f90815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c00162000351565b62000327620006a536600462004636565b620015e6565b62000327620006bc366004620048ae565b620016e0565b620006d9620006d336600462004974565b62001b3d565b60405162000351919062004a27565b62000418620006f9366004620047ee565b60836020525f908152604090205463ffffffff1681565b6084546200033d90600160c01b90046001600160401b031681565b620003276200073c366004620046f6565b62001b6f565b620003276200075336600462004664565b62001e90565b620003716200076a366004620047bd565b62001f47565b6200047462001f71565b6200033d6200078b36600462004a3b565b62002052565b62000327620007a2366004620047ee565b6200221e565b62000327620007b9366004620047ee565b620022c3565b620004745f81565b6200047462002366565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200162000351565b6085546200082890600160801b900461ffff1681565b60405161ffff909116815260200162000351565b620008d16200084d36600462004600565b60408051608080820183525f8083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b6040516200035191905f6080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b6084546200033d90600160801b90046001600160401b031681565b620003276200094236600462004a66565b6200272e565b620004186200095936600462004af7565b60826020525f908152604090205463ffffffff1681565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b62000327620009a9366004620047a5565b62002a04565b62000327620009c0366004620047bd565b62002aa0565b6085546200033d906001600160401b031681565b6200032762002ac8565b6084546200033d90600160401b90046001600160401b031681565b6200032762000a1036600462004b26565b62002b94565b620007f97f000000000000000000000000000000000000000000000000000000000000000081565b6200032762000a4f36600462004b9e565b62002c68565b608054620004189063ffffffff1681565b62000afc62000a7736600462004636565b60816020525f9081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff166101608201526101800162000351565b5f54600290610100900460ff1615801562000b9d57505f5460ff8083169116105b62000c065760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000c8662002e5c565b62000ca05f80516020620058898339815191528c62002ec8565b62000cac5f8862002ec8565b62000cd87fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908862002ec8565b62000d047f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8862002ec8565b62000d307f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8862002ec8565b62000d5c7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8962002ec8565b62000d887fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088962002ec8565b62000db47f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48962002ec8565b62000dce5f80516020620058498339815191528962002ec8565b62000e085f80516020620058898339815191527f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062002ed4565b62000e347f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08962002ec8565b62000e607f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8962002ec8565b62000e9a5f80516020620058698339815191527f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162002ed4565b62000eb45f80516020620058698339815191528762002ec8565b62000ee07f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518762002ec8565b62000eec5f3362002ec8565b5f805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050505050565b63ffffffff82165f90815260816020526040812062000f59908362002f1e565b90505b92915050565b63ffffffff81165f90815260816020526040812062000f5c9062002f62565b5f805160206200588983398151915262000f9b8162002fd1565b63ffffffff89165f90815260816020526040902062000fc1818a8a8a8a8a8a8a62002fdd565b600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562001028576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200106162002366565b6040518263ffffffff1660e01b81526004016200108091815260200190565b5f604051808303815f87803b15801562001098575f80fd5b505af1158015620010ab573d5f803e3d5ffd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b5f8051602062005889833981519152620011438162002fd1565b63ffffffff89165f90815260816020526040902062001169818a8a8a8a8a8a8a6200336b565b600681018054600160401b600160801b031916600160401b6001600160401b038a81169182029290921783555f9081526002840160205260409020879055600583018890559054600160801b90041615620011d0576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200120962002366565b6040518263ffffffff1660e01b81526004016200122891815260200190565b5f604051808303815f87803b15801562001240575f80fd5b505af115801562001253573d5f803e3d5ffd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff82165f908152608160205260409020620012e55f80516020620058898339815191523362001f47565b6200133957606f5460ff16156200130f57604051630bc011ff60e21b815260040160405180910390fd5b6200131b818362002f1e565b6200133957604051630674f25160e11b815260040160405180910390fd5b6200134581836200376a565b505050565b5f8051602062005849833981519152620013648162002fd1565b6103e88261ffff1610806200137e57506103ff8261ffff16115b156200139d57604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b6200140f5f80516020620058698339815191523362001f47565b620014ae57608454600160801b90046001600160401b031615806200145f57506084544290620014549062093a8090600160801b90046001600160401b031662004c44565b6001600160401b0316115b806200148f57506087544290620014849062093a80906001600160401b031662004c44565b6001600160401b0316115b15620014ae5760405163692baaad60e11b815260040160405180910390fd5b620014b862003955565b565b5f82815260346020526040902060010154620014d68162002fd1565b620013458383620039cf565b6001600160a01b03811633146200150c57604051630b4ad1cd60e31b815260040160405180910390fd5b62001518828262003a3a565b5050565b5f8051602062005849833981519152620015368162002fd1565b606f5460ff1662001578576084546001600160401b03600160c01b909104811690831610620015785760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001620013e9565b5f6086546064620015e1919062004c6e565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd620016128162002fd1565b63ffffffff82161580620016315750607e5463ffffffff908116908316115b156200165057604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f60205260409020600180820154600160e81b900460ff16151590036200169657604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd086200170c8162002fd1565b63ffffffff881615806200172b5750607e5463ffffffff908116908916115b156200174a57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88165f908152607f60205260409020600180820154600160e81b900460ff16151590036200179057604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b0388165f9081526083602052604090205463ffffffff1615620017cd576040516337c8fe0960e11b815260040160405180910390fd5b608080545f91908290620017e79063ffffffff1662004c88565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b039092169130916200183490620044dd565b620018429392919062004cad565b604051809103905ff0801580156200185c573d5f803e3d5ffd5b5090508160835f8c6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508a815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001ac0949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001b00908d908d9088908e908e908e9060040162004ce3565b5f604051808303815f87803b15801562001b18575f80fd5b505af115801562001b2b573d5f803e3d5ffd5b50505050505050505050505050505050565b63ffffffff86165f90815260816020526040902060609062001b6490878787878762003aa3565b979650505050505050565b606f5460ff161562001b9457604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001be292600160c01b90048116911662004c44565b6001600160401b0316111562001c0b57604051638a0704d360e01b815260040160405180910390fd5b6103e862001c1a888862004d45565b6001600160401b0316111562001c4357604051635acfba9d60e11b815260040160405180910390fd5b62001c5581898989898989896200336b565b62001c61818762003be2565b6085546001600160401b03165f0362001d6857600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562001cdb576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001d1462002366565b6040518263ffffffff1660e01b815260040162001d3391815260200190565b5f604051808303815f87803b15801562001d4b575f80fd5b505af115801562001d5e573d5f803e3d5ffd5b5050505062001e31565b62001d738162003dd9565b600681018054600160801b90046001600160401b031690601062001d978362004d68565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b900487165f90815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff161562001eb557604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f90815260816020526040902062001edb818989898989898962002fdd565b6001600160401b0387165f9081526004820160209081526040918290206002015482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a162001f3c62003955565b505050505050505050565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6040516370a0823160e01b81523060048201525f9081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562001fd8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001ffe919062004d86565b6084549091505f9062002024906001600160401b03600160401b82048116911662004d45565b6001600160401b03169050805f036200203f575f9250505090565b6200204b818362004db2565b9250505090565b606f545f9060ff16156200207957604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff1690819003620020b0576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f03620020da57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f90815260816020526040812060848054919287926200210c9084906001600160401b031662004c44565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f62002141878362004c44565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f95865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b031990921692909316919091171790559050620021d08362003dd9565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b5f8051602062005849833981519152620022388162002fd1565b606f5460ff1662002273576085546001600160401b0390811690831610620022735760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001620013e9565b5f8051602062005849833981519152620022dd8162002fd1565b62015180826001600160401b031611156200230b57604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001620013e9565b6080545f9063ffffffff168082036200238057505f919050565b5f816001600160401b038111156200239c576200239c6200480a565b604051908082528060200260200182016040528015620023c6578160200160208202803683370190505b5090505f5b82811015620024365760815f620023e483600162004dc8565b63ffffffff1663ffffffff1681526020019081526020015f206005015482828151811062002416576200241662004dde565b6020908102919091010152806200242d8162004df2565b915050620023cb565b505f60205b836001146200268e575f6200245260028662004e0d565b6200245f60028762004db2565b6200246b919062004dc8565b90505f816001600160401b038111156200248957620024896200480a565b604051908082528060200260200182016040528015620024b3578160200160208202803683370190505b5090505f5b828110156200263a57620024ce60018462004e23565b81148015620024e95750620024e560028862004e0d565b6001145b15620025715785620024fd82600262004c6e565b8151811062002510576200251062004dde565b60200260200101518560405160200162002534929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106200255f576200255f62004dde565b60200260200101818152505062002625565b856200257f82600262004c6e565b8151811062002592576200259262004dde565b602002602001015186826002620025aa919062004c6e565b620025b790600162004dc8565b81518110620025ca57620025ca62004dde565b6020026020010151604051602001620025ed929190918252602082015260400190565b6040516020818303038152906040528051906020012082828151811062002618576200261862004dde565b6020026020010181815250505b80620026318162004df2565b915050620024b8565b5080945081955083846040516020016200265e929190918252602082015260400190565b6040516020818303038152906040528051906020012093508280620026839062004e39565b93505050506200243b565b5f835f81518110620026a457620026a462004dde565b602002602001015190505f5b828110156200272457604080516020810184905290810185905260600160408051601f198184030181528282528051602091820120908301879052908201869052925060600160405160208183030381529060405280519060200120935080806200271b9062004df2565b915050620026b0565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac6200275a8162002fd1565b63ffffffff84161580620027795750607e5463ffffffff908116908516115b156200279857604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526082602052604081205463ffffffff1690819003620027d8576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918716600160401b9091046001600160401b0316036200282657604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86165f908152607f60205260409020600180820154600160e81b900460ff16151590036200286c57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b9092041614620028aa57604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790555f620029298462000f62565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef286926200297f9216908b908b9060040162004e51565b5f604051808303815f87803b15801562002997575f80fd5b505af1158015620029aa573d5f803e3d5ffd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002a308162002fd1565b683635c9adc5dea0000082118062002a4b5750633b9aca0082105b1562002a6a57604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620013e9565b5f8281526034602052604090206001015462002abc8162002fd1565b62001345838362003a3a565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002af48162002fd1565b6087805467ffffffffffffffff1916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc16976916004808301925f92919082900301818387803b15801562002b70575f80fd5b505af115801562002b83573d5f803e3d5ffd5b5050505062002b9162003ea2565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62002bc08162002fd1565b6001600160401b0384165f9081526083602052604090205463ffffffff161562002bfd576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b0387165f9081526082602052604090205463ffffffff161562002c3a57604051630d409b9360e41b815260040160405180910390fd5b5f62002c4b88888888875f62003efa565b5f8080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002c948162002fd1565b607e80545f9190829062002cae9063ffffffff1662004c88565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff1681526020015f1515815260200185815250607f5f8363ffffffff1663ffffffff1681526020019081526020015f205f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b5289898989898960405162002e4a9695949392919062004e90565b60405180910390a25050505050505050565b5f54610100900460ff16620014b85760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000bfd565b620015188282620039cf565b5f82815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6085546001600160401b038281165f9081526004850160205260408120549092429262002f5092918116911662004c44565b6001600160401b031611159392505050565b60068101545f90600160801b90046001600160401b03161562002fb4575060068101546001600160401b03600160801b90910481165f9081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002b9181336200411b565b60078801545f906001600160401b039081169087161015620030125760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03881615620030b25760068901546001600160401b03600160801b909104811690891611156200305c5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f90815260048a0160205260409020600281015481549092888116600160401b9092041614620030ab57604051632bd2e3e760e01b815260040160405180910390fd5b5062003126565b506001600160401b0385165f90815260028901602052604090205480620030ec576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b909104811690871611156200312657604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b909104811690881611806200315f5750876001600160401b0316876001600160401b031611155b8062003183575060068901546001600160401b03600160c01b909104811690881611155b15620031a25760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260048b016020526040902054600160401b9004811690861614620031e8576040516332a2a77f60e01b815260040160405180910390fd5b5f620031f98a888888868962003aa3565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516200322f919062004ee8565b602060405180830381855afa1580156200324b573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019062003270919062004d86565b6200327c919062004e0d565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620032c09188919060040162004f05565b602060405180830381865afa158015620032dc573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062003302919062004f41565b62003320576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260048c0160205260409020600201548590036200335e5760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b5f80620033788a62002f62565b60078b01549091506001600160401b039081169089161015620033ae5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620034505760068a01546001600160401b03600160801b9091048116908a161115620033f85760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a165f90815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200344957604051632bd2e3e760e01b815260040160405180910390fd5b50620034bf565b6001600160401b0388165f90815260028b0160205260409020549150816200348b576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b03161115620034bf57604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620034f25760405163b9b18f5760e01b815260040160405180910390fd5b5f620035038b8a8a8a878b62003aa3565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405162003539919062004ee8565b602060405180830381855afa15801562003555573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200357a919062004d86565b62003586919062004e0d565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620035ca9189919060040162004f05565b602060405180830381865afa158015620035e6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200360c919062004f41565b6200362a576040516309bde33960e01b815260040160405180910390fd5b5f62003637848b62004d45565b90506200369087826001600160401b03166200365262001f71565b6200365e919062004c6e565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004145565b80608460088282829054906101000a90046001600160401b0316620036b6919062004c44565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d153906064015f604051808303815f87803b15801562003744575f80fd5b505af115801562003757573d5f803e3d5ffd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b9091048116908216111580620037a9575060068201546001600160401b03600160801b9091048116908216115b15620037c85760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f81815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200388362002366565b6040518263ffffffff1660e01b8152600401620038a291815260200190565b5f604051808303815f87803b158015620038ba575f80fd5b505af1158015620038cd573d5f803e3d5ffd5b505085546001600160a01b03165f90815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015620039ae575f80fd5b505af1158015620039c1573d5f803e3d5ffd5b50505050620014b862004199565b620039db828262001f47565b62001518575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003a46828262001f47565b1562001518575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086165f818152600389016020526040808220549388168252902054606092911580159062003ad8575081155b1562003af75760405163340c614f60e11b815260040160405180910390fd5b8062003b16576040516366385b5160e01b815260040160405180910390fd5b62003b2184620041f5565b62003b3f576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b5f62003bee8362002f62565b9050815f8062003bff848462004d45565b6085546001600160401b0391821692505f9162003c2591600160401b9004164262004e23565b90505b846001600160401b0316846001600160401b03161462003cae576001600160401b038085165f9081526003890160205260409020600181015490911682101562003c89576001810154600160401b90046001600160401b0316945062003ca7565b62003c95868662004d45565b6001600160401b031693505062003cae565b5062003c28565b5f62003cbb848462004e23565b90508381101562003d1957808403600c811162003cd9578062003cdc565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a608654028162003d0e5762003d0e62004d9e565b046086555062003d90565b838103600c811162003d2c578062003d2f565b600c5b90505f816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162003d685762003d6862004d9e565b04905080608654670de0b6b3a7640000028162003d895762003d8962004d9e565b0460865550505b683635c9adc5dea00000608654111562003db757683635c9adc5dea0000060865562003dcf565b633b9aca00608654101562003dcf57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002b915760068101545f9062003e2390600160c01b90046001600160401b0316600162004c44565b905062003e31828262002f1e565b15620015185760068201545f9060029062003e5e908490600160801b90046001600160401b031662004d45565b62003e6a919062004f62565b62003e76908362004c44565b905062003e84838262002f1e565b1562003e96576200134583826200376a565b6200134583836200376a565b606f5460ff1662003ec657604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b608080545f918291829062003f159063ffffffff1662004c88565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f876001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff16021790555060815f8263ffffffff1663ffffffff1681526020019081526020015f20915087825f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b0316021790555086826001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555084825f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620041089594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b62004127828262001f47565b6200151857604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526200134590849062004279565b606f5460ff1615620041be57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff000000016001600160401b0383161080156200422b575067ffffffff00000001604083901c6001600160401b0316105b80156200424c575067ffffffff00000001608083901c6001600160401b0316105b801562004264575067ffffffff0000000160c083901c105b156200427257506001919050565b505f919050565b5f620042cf826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620043519092919063ffffffff16565b805190915015620013455780806020019051810190620042f0919062004f41565b620013455760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000bfd565b60606200436184845f8562004369565b949350505050565b606082471015620043cc5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000bfd565b5f80866001600160a01b03168587604051620043e9919062004ee8565b5f6040518083038185875af1925050503d805f811462004425576040519150601f19603f3d011682016040523d82523d5f602084013e6200442a565b606091505b509150915062001b648783838760608315620044aa5782515f03620044a2576001600160a01b0385163b620044a25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000bfd565b508162004361565b620043618383815115620044c15781518083602001fd5b8060405162461bcd60e51b815260040162000bfd919062004a27565b6108be8062004f8b83390190565b6001600160a01b038116811462002b91575f80fd5b80356001600160401b038116811462002fcc575f80fd5b5f805f805f805f805f806101408b8d03121562004532575f80fd5b8a356200453f81620044eb565b99506200454f60208c0162004500565b98506200455f60408c0162004500565b975060608b01356200457181620044eb565b965060808b01356200458381620044eb565b955060a08b01356200459581620044eb565b945060c08b0135620045a781620044eb565b935060e08b0135620045b981620044eb565b9250620045ca6101008c0162004500565b9150620045db6101208c0162004500565b90509295989b9194979a5092959850565b803563ffffffff8116811462002fcc575f80fd5b5f806040838503121562004612575f80fd5b6200461d83620045ec565b91506200462d6020840162004500565b90509250929050565b5f6020828403121562004647575f80fd5b62000f5982620045ec565b80610300810183101562000f5c575f80fd5b5f805f805f805f806103e0898b0312156200467d575f80fd5b6200468889620045ec565b97506200469860208a0162004500565b9650620046a860408a0162004500565b9550620046b860608a0162004500565b9450620046c860808a0162004500565b935060a0890135925060c08901359150620046e78a60e08b0162004652565b90509295985092959890939650565b5f805f805f805f806103e0898b0312156200470f575f80fd5b6200471a89620045ec565b97506200472a60208a0162004500565b96506200473a60408a0162004500565b95506200474a60608a0162004500565b94506080890135935060a0890135925060c08901356200476a81620044eb565b9150620046e78a60e08b0162004652565b5f602082840312156200478c575f80fd5b813561ffff811681146200479e575f80fd5b9392505050565b5f60208284031215620047b6575f80fd5b5035919050565b5f8060408385031215620047cf575f80fd5b823591506020830135620047e381620044eb565b809150509250929050565b5f60208284031215620047ff575f80fd5b62000f598262004500565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126200482e575f80fd5b81356001600160401b03808211156200484b576200484b6200480a565b604051601f8301601f19908116603f011681019082821181831017156200487657620048766200480a565b816040528381528660208588010111156200488f575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a031215620048c5575f80fd5b620048d088620045ec565b9650620048e06020890162004500565b95506040880135620048f281620044eb565b945060608801356200490481620044eb565b935060808801356200491681620044eb565b925060a08801356001600160401b038082111562004932575f80fd5b620049408b838c016200481e565b935060c08a013591508082111562004956575f80fd5b50620049658a828b016200481e565b91505092959891949750929550565b5f805f805f8060c087890312156200498a575f80fd5b6200499587620045ec565b9550620049a56020880162004500565b9450620049b56040880162004500565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b83811015620049f2578181015183820152602001620049d8565b50505f910152565b5f815180845262004a13816020860160208601620049d6565b601f01601f19169290920160200192915050565b602081525f62000f596020830184620049fa565b5f806040838503121562004a4d575f80fd5b62004a588362004500565b946020939093013593505050565b5f805f806060858703121562004a7a575f80fd5b843562004a8781620044eb565b935062004a9760208601620045ec565b925060408501356001600160401b038082111562004ab3575f80fd5b818701915087601f83011262004ac7575f80fd5b81358181111562004ad6575f80fd5b88602082850101111562004ae8575f80fd5b95989497505060200194505050565b5f6020828403121562004b08575f80fd5b81356200479e81620044eb565b803560ff8116811462002fcc575f80fd5b5f805f805f8060c0878903121562004b3c575f80fd5b863562004b4981620044eb565b9550602087013562004b5b81620044eb565b945062004b6b6040880162004500565b935062004b7b6060880162004500565b92506080870135915062004b9260a0880162004b15565b90509295509295509295565b5f805f805f8060c0878903121562004bb4575f80fd5b863562004bc181620044eb565b9550602087013562004bd381620044eb565b945062004be36040880162004500565b935062004bf36060880162004b15565b92506080870135915060a08701356001600160401b0381111562004c15575f80fd5b62004c2389828a016200481e565b9150509295509295509295565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111562004c675762004c6762004c30565b5092915050565b808202811582820484141762000f5c5762000f5c62004c30565b5f63ffffffff80831681810362004ca35762004ca362004c30565b6001019392505050565b6001600160a01b038481168252831660208201526060604082018190525f9062004cda90830184620049fa565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190525f9062004d2490830185620049fa565b82810360a084015262004d388185620049fa565b9998505050505050505050565b6001600160401b0382811682821603908082111562004c675762004c6762004c30565b5f6001600160401b0380831681810362004ca35762004ca362004c30565b5f6020828403121562004d97575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8262004dc35762004dc362004d9e565b500490565b8082018082111562000f5c5762000f5c62004c30565b634e487b7160e01b5f52603260045260245ffd5b5f6001820162004e065762004e0662004c30565b5060010190565b5f8262004e1e5762004e1e62004d9e565b500690565b8181038181111562000f5c5762000f5c62004c30565b5f8162004e4a5762004e4a62004c30565b505f190190565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190525f9062004edc90830184620049fa565b98975050505050505050565b5f825162004efb818460208701620049d6565b9190910192915050565b6103208101610300808584378201835f5b600181101562004f3757815183526020928301929091019060010162004f16565b5050509392505050565b5f6020828403121562004f52575f80fd5b815180151581146200479e575f80fd5b5f6001600160401b038084168062004f7e5762004f7e62004d9e565b9216919091049291505056fe60a0604052604051620008be380380620008be8339810160408190526100249161034d565b82816100308282610058565b50506001600160a01b03821660805261005061004b60805190565b6100b6565b505050610432565b61006182610124565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100aa576100a582826101a2565b505050565b6100b2610215565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f65f805160206200089e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161012181610236565b50565b806001600160a01b03163b5f0361015e57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516101be9190610417565b5f60405180830381855af49150503d805f81146101f6576040519150601f19603f3d011682016040523d82523d5f602084013e6101fb565b606091505b50909250905061020c858383610274565b95945050505050565b34156102345760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661025f57604051633173bdd160e11b81525f6004820152602401610155565b805f805160206200089e833981519152610181565b60608261028957610284826102d3565b6102cc565b81511580156102a057506001600160a01b0384163b155b156102c957604051639996b31560e01b81526001600160a01b0385166004820152602401610155565b50805b9392505050565b8051156102e35780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b0381168114610312575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561034557818101518382015260200161032d565b50505f910152565b5f805f6060848603121561035f575f80fd5b610368846102fc565b9250610376602085016102fc565b60408501519092506001600160401b0380821115610392575f80fd5b818601915086601f8301126103a5575f80fd5b8151818111156103b7576103b7610317565b604051601f8201601f19908116603f011681019083821181831017156103df576103df610317565b816040528281528960208487010111156103f7575f80fd5b61040883602083016020880161032b565b80955050505050509250925092565b5f825161042881846020870161032b565b9190910192915050565b6080516104546200044a5f395f601001526104545ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610069575f356001600160e01b03191663278f794360e11b146100615761005f61006d565b565b61005f61007d565b61005f5b61005f6100786100ab565b6100e2565b5f8061008c36600481846102ee565b8101906100999190610329565b915091506100a78282610100565b5050565b5f6100dd7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156100fc573d5ff35b3d5ffd5b6101098261015a565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101525761014d82826101d5565b505050565b6100a7610247565b806001600160a01b03163b5f0361019457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101f191906103f2565b5f60405180830381855af49150503d805f8114610229576040519150601f19603f3d011682016040523d82523d5f602084013e61022e565b606091505b509150915061023e858383610266565b95945050505050565b341561005f5760405163b398979f60e01b815260040160405180910390fd5b60608261027b57610276826102c5565b6102be565b815115801561029257506001600160a01b0384163b155b156102bb57604051639996b31560e01b81526001600160a01b038516600482015260240161018b565b50805b9392505050565b8051156102d55780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f80858511156102fc575f80fd5b83861115610308575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561033a575f80fd5b82356001600160a01b0381168114610350575f80fd5b9150602083013567ffffffffffffffff8082111561036c575f80fd5b818501915085601f83011261037f575f80fd5b81358181111561039157610391610315565b604051601f8201601f19908116603f011681019083821181831017156103b9576103b9610315565b816040528281528860208487010111156103d1575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b8181101561041157602081860181015185830152016103f7565b505f92019182525091905056fea2646970667358221220c3817d11eb3dc87723342527d38da55b7b3b362f54567f56cf1ef4db2f8a430664736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a264697066735822122044bd5c88caa97e7d9ea1bedd17562eaa2510cdf7ce4b0dce5dddb3e2c3abc93064736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonValidiumEtrog.json b/compiled-contracts/PolygonValidiumEtrog.json index 754958a85..37ea48b33 100644 --- a/compiled-contracts/PolygonValidiumEtrog.json +++ b/compiled-contracts/PolygonValidiumEtrog.json @@ -1261,8 +1261,8 @@ "type": "function" } ], - "bytecode": "0x61010060405234801562000011575f80fd5b5060405162004f2b38038062004f2b83398101604081905262000034916200006f565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d4565b6001600160a01b03811681146200006c575f80fd5b50565b5f805f806080858703121562000083575f80fd5b8451620000908162000057565b6020860151909450620000a38162000057565b6040860151909350620000b68162000057565b6060860151909250620000c98162000057565b939692955090935050565b60805160a05160c05160e051614d4a620001e15f395f818161053b015281816110b50152818161117c0152818161119e0152818161133a015281816114100152818161157c015281816117c401528181611d97015281816122fb0152818161274a015281816127f701528181612e7301528181612f38015281816139de01528181613a5701528181613a790152613b2101525f81816106dc01528181610bed015281816119b801528181611a8d015281816129c101528181612ac9015261352901525f818161079801528181610c6901528181611c0e0152818161308001526135a501525f81816107ca015281816108ba015281816111080152818161124a01526130550152614d4a5ff3fe608060405234801561000f575f80fd5b5060043610610303575f3560e01c8063712570221161019d578063c7fffd4b116100e8578063e57a0b4c11610093578063ecef3f991161006e578063ecef3f9914610833578063f35dda4714610846578063f851a4401461084e575f80fd5b8063e57a0b4c146107ec578063e7a7ed021461080c578063eaeb077b14610820575f80fd5b8063d02103ca116100c3578063d02103ca14610793578063d7bc90ff146107ba578063e46761c4146107c5575f80fd5b8063c7fffd4b14610758578063c89e42df14610760578063cfa8ed4714610773575f80fd5b80639f26f84011610148578063ada8f91911610123578063ada8f91914610711578063b0afe15414610724578063c754c7ed14610730575f80fd5b80639f26f840146106c4578063a3c573eb146106d7578063a652f26c146106fe575f80fd5b80638c3d7301116101785780638c3d73011461068e57806391cafe32146106965780639e001877146106a9575f80fd5b8063712570221461062c5780637a5460c51461063f5780637cd76b8b1461067b575f80fd5b80633cbc795b1161025d57806352bdeb6d116102085780636b8616ce116101e35780636b8616ce146105f15780636e05d2cd146106105780636ff512cc14610619575f80fd5b806352bdeb6d146105a5578063542028d5146105e1578063676870d2146105e9575f80fd5b806349b7b8021161023857806349b7b802146105365780634c21fef31461055d5780634e48770614610592575f80fd5b80633cbc795b1461046857806340b5de6c146104a557806345605267146104fd575f80fd5b806326782247116102bd5780632d72c248116102985780632d72c2481461042257806332c2d153146104355780633c351e1014610448575f80fd5b806326782247146103a85780632acdc2b6146103ed5780632c111c0614610402575f80fd5b806305835f37116102ed57806305835f371461033d578063107bf28c1461038657806311e892d41461038e575f80fd5b8062d0295d146103075780630350896314610322575b5f80fd5b61030f610873565b6040519081526020015b60405180910390f35b61032a602081565b60405161ffff9091168152602001610319565b6103796040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516103199190613ed4565b610379610979565b61039660f981565b60405160ff9091168152602001610319565b6001546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610319565b6104006103fb366004613efd565b610a05565b005b6008546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b610400610430366004613f8e565b610b23565b61040061044336600461404c565b61140e565b6009546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104909074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610319565b6104cc7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff000000000000000000000000000000000000000000000000000000000000009091168152602001610319565b60075461051d9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610319565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b600a546105829074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001610319565b6104006105a036600461408b565b6114dd565b6103796040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b6103796116ec565b61032a601f81565b61030f6105ff36600461408b565b60066020525f908152604090205481565b61030f60055481565b6104006106273660046140a6565b6116f9565b61040061063a36600461420e565b6117c2565b6103796040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b6104006106893660046140a6565b611fcc565b610400612095565b6104006106a43660046140a6565b612167565b6103c873a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6104006106d23660046142f6565b61227f565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b61037961070c366004614335565b6128c3565b61040061071f3660046140a6565b612ca1565b61030f6405ca1ab1e081565b60075461051d90700100000000000000000000000000000000900467ffffffffffffffff1681565b61039660e481565b61040061076e3660046143a6565b612d6a565b6002546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b61030f635ca1ab1e81565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b600a546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b60075461051d9067ffffffffffffffff1681565b61040061082e3660046143d8565b612dfc565b610400610841366004614420565b6132c3565b610396601b81565b5f546103c89062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156108ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109239190614468565b6007549091505f9061094d9067ffffffffffffffff680100000000000000008204811691166144ac565b67ffffffffffffffff169050805f03610968575f9250505090565b61097281836144d4565b9250505090565b600480546109869061450c565b80601f01602080910402602001604051908101604052809291908181526020018280546109b29061450c565b80156109fd5780601f106109d4576101008083540402835291602001916109fd565b820191905f5260205f20905b8154815290600101906020018083116109e057829003601f168201915b505050505081565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a5b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a5474010000000000000000000000000000000000000000900460ff16151581151503610ab5576040517f5f0e7abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000831515021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f41905f90a150565b60025473ffffffffffffffffffffffffffffffffffffffff163314610b74576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835f819003610baf576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610beb576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610c50575f80fd5b505af1158015610c62573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cd0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cf49190614468565b60075460055491925068010000000000000000900467ffffffffffffffff1690815f805b86811015611028575f8c8c83818110610d3357610d3361455d565b905060800201803603810190610d49919061458a565b604081015190915067ffffffffffffffff1615610f365785610d6a816145d6565b9650505f815f0151826020015183604001518460600151604051602001610dcf9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114610e57576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85825f0151836020015184604001518f8660600151604051602001610ef0969594939291909586526020860194909452604085019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060808501919091521b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166068830152607c820152609c0190565b60405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550611015565b8051604051610f52918591602001918252602082015260400190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152828252805160209182012084519184018990529183015260608083018a90524260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401528d901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888301525f609c830152935060bc016040516020818303038152906040528051906020012094505b5080611020816145fc565b915050610d18565b5060075467ffffffffffffffff9081169085161115611073576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058390558567ffffffffffffffff85811690841614611170575f61109884876144ac565b90506110ae67ffffffffffffffff821683614633565b915061112f7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166110e7610873565b6110f1919061464c565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613327565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8816021790555b80156112f957611272337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611205573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112299190614468565b611233919061464c565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906133fb565b600a546040517f3b51be4b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690633b51be4b906112cc9085908d908d906004016146aa565b5f6040518083038186803b1580156112e2575f80fd5b505afa1580156112f4573d5f803e3d5ffd5b505050505b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018590525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611395573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113b991906146cc565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e766886040516113f791815260200190565b60405180910390a250505050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461147d576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966846040516114d091815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611533576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561157a576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115e3573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061160791906146e7565b6116685760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610611668576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546109869061450c565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff16331461174f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016116e1565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611831576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff161580801561184f57505f54600160ff909116105b806118685750303b15801561186857505f5460ff166001145b6118f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611955575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611bb3576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa1580156119fc573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611a419190810190614702565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d9060240160408051808303815f875af1158015611ad4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611af8919061476b565b915091508163ffffffff165f14611b6f576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055611bb0565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b6009545f90611bfa90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff16856128c3565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c999190614468565b90505f808483858f611cac600143614633565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611df2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e1691906146cc565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611ea691906147e8565b506004611eb389826147e8565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611f5393929190614900565b60405180910390a15050505050508015611fc3575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612022576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fd331bd4c4cd1afecb94a225184bded161ff3213624ba4fb58c4f30c5a861144a906020016116e1565b60015473ffffffffffffffffffffffffffffffffffffffff1633146120e6576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146121bd576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff1661220c576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb906020016116e1565b60085473ffffffffffffffffffffffffffffffffffffffff1680158015906122bd575073ffffffffffffffffffffffffffffffffffffffff81163314155b156122f4576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612362573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061238691906146cc565b612390919061493e565b67ffffffffffffffff1611156123d2576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361240d576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612449576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff808216916124719184916801000000000000000090041661495f565b11156124a9576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b83811015612744575f8787838181106124e4576124e461455d565b90506020028101906124f69190614972565b6124ff906149ae565b90508361250b816145d6565b825180516020918201208185015160408087015160608801519151959a509295505f94612577948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152600690935291205490915081146125ff576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f90815260066020526040812055612623600188614633565b84036126925742600760109054906101000a900467ffffffffffffffff168460400151612650919061493e565b67ffffffffffffffff161115612692576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209450505050808061273c906145fc565b9150506124c9565b506127727f0000000000000000000000000000000000000000000000000000000000000000846110e7610873565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390612843908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af115801561285f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061288391906146cc565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f876040516024016128f596959493929190614a19565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f03612a455760f9601f83516129899190614a7b565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001612a2f9796959493929190614a96565b6040516020818303038152906040529050612b49565b815161ffff1015612a82576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9612a91602083614a7b565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001612b369796959493929190614b78565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015612ba7573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612c1f576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f90612c649084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614c5a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612cf7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016116e1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612dc0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003612dcc82826147e8565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516116e19190613ed4565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590612e3a575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612e71576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015612eda573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612efe91906146e7565b15612f35576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f9f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc39190614468565b905082811115612fff576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138884111561303b576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61307d73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846133fb565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061310b9190614468565b6007805491925067ffffffffffffffff909116905f613129836145d6565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051613160929190614cb5565b6040519081900390208142613176600143614633565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f908152600690935291205532330361326c576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a26132bb565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931906132b290849033908b908b90614cc4565b60405180910390a25b505050505050565b600a5474010000000000000000000000000000000000000000900460ff16613317576040517f821935b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61332283838361345f565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526133229084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613bf3565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526134599085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613379565b50505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146134b0576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f8190036134eb576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115613527576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561358c575f80fd5b505af115801561359e573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561360c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136309190614468565b60075460055491925042916801000000000000000090910467ffffffffffffffff1690815f5b86811015613951575f8a8a838181106136715761367161455d565b90506020028101906136839190614972565b61368c906149ae565b8051805160209091012060408201519192509067ffffffffffffffff161561386c57856136b8816145d6565b9650505f8183602001518460400151856060015160405160200161371a9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f908152600690935291205490915081146137a2576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f90555061393c565b8151516201d4c010156138ab576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b50508080613949906145fc565b915050613656565b5060075467ffffffffffffffff908116908416111561399c576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff84811690831614613a51575f6139c183866144ac565b90506139d767ffffffffffffffff821683614633565b9150613a107f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166110e7610873565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b613ae0337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611205573d5f803e3d5ffd5b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015613b7c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ba091906146cc565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e76688604051613bde91815260200190565b60405180910390a25050505050505050505050565b5f613c54826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613cfe9092919063ffffffff16565b8051909150156133225780806020019051810190613c7291906146e7565b613322576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016118f0565b6060612c9984845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051613d309190614d03565b5f6040518083038185875af1925050503d805f8114613d6a576040519150601f19603f3d011682016040523d82523d5f602084013e613d6f565b606091505b5091509150613d8087838387613d8b565b979650505050505050565b60608315613e205782515f03613e195773ffffffffffffffffffffffffffffffffffffffff85163b613e19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016118f0565b5081612c99565b612c998383815115613e355781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f09190613ed4565b5f5b83811015613e83578181015183820152602001613e6b565b50505f910152565b5f8151808452613ea2816020860160208601613e69565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f613ee66020830184613e8b565b9392505050565b8015158114613efa575f80fd5b50565b5f60208284031215613f0d575f80fd5b8135613ee681613eed565b73ffffffffffffffffffffffffffffffffffffffff81168114613efa575f80fd5b8035613f4481613f18565b919050565b5f8083601f840112613f59575f80fd5b50813567ffffffffffffffff811115613f70575f80fd5b602083019150836020828501011115613f87575f80fd5b9250929050565b5f805f805f60608688031215613fa2575f80fd5b853567ffffffffffffffff80821115613fb9575f80fd5b818801915088601f830112613fcc575f80fd5b813581811115613fda575f80fd5b8960208260071b8501011115613fee575f80fd5b6020830197508096505061400460208901613f39565b94506040880135915080821115614019575f80fd5b5061402688828901613f49565b969995985093965092949392505050565b67ffffffffffffffff81168114613efa575f80fd5b5f805f6060848603121561405e575f80fd5b833561406981614037565b925060208401359150604084013561408081613f18565b809150509250925092565b5f6020828403121561409b575f80fd5b8135613ee681614037565b5f602082840312156140b6575f80fd5b8135613ee681613f18565b63ffffffff81168114613efa575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516080810167ffffffffffffffff81118282101715614122576141226140d2565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561416f5761416f6140d2565b604052919050565b5f67ffffffffffffffff821115614190576141906140d2565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f8301126141cb575f80fd5b81356141de6141d982614177565b614128565b8181528460208386010111156141f2575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c08789031215614223575f80fd5b863561422e81613f18565b9550602087013561423e81613f18565b9450604087013561424e816140c1565b9350606087013561425e81613f18565b9250608087013567ffffffffffffffff8082111561427a575f80fd5b6142868a838b016141bc565b935060a089013591508082111561429b575f80fd5b506142a889828a016141bc565b9150509295509295509295565b5f8083601f8401126142c5575f80fd5b50813567ffffffffffffffff8111156142dc575f80fd5b6020830191508360208260051b8501011115613f87575f80fd5b5f8060208385031215614307575f80fd5b823567ffffffffffffffff81111561431d575f80fd5b614329858286016142b5565b90969095509350505050565b5f805f8060808587031215614348575f80fd5b8435614353816140c1565b9350602085013561436381613f18565b92506040850135614373816140c1565b9150606085013567ffffffffffffffff81111561438e575f80fd5b61439a878288016141bc565b91505092959194509250565b5f602082840312156143b6575f80fd5b813567ffffffffffffffff8111156143cc575f80fd5b612c99848285016141bc565b5f805f604084860312156143ea575f80fd5b833567ffffffffffffffff811115614400575f80fd5b61440c86828701613f49565b909790965060209590950135949350505050565b5f805f60408486031215614432575f80fd5b833567ffffffffffffffff811115614448575f80fd5b614454868287016142b5565b909450925050602084013561408081613f18565b5f60208284031215614478575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8281168282160390808211156144cd576144cd61447f565b5092915050565b5f82614507577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c9082168061452057607f821691505b602082108103614557577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6080828403121561459a575f80fd5b6145a26140ff565b823581526020830135602082015260408301356145be81614037565b60408201526060928301359281019290925250919050565b5f67ffffffffffffffff8083168181036145f2576145f261447f565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361462c5761462c61447f565b5060010190565b818103818111156146465761464661447f565b92915050565b80820281158282048414176146465761464661447f565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201525f6146c3604083018486614663565b95945050505050565b5f602082840312156146dc575f80fd5b8151613ee681614037565b5f602082840312156146f7575f80fd5b8151613ee681613eed565b5f60208284031215614712575f80fd5b815167ffffffffffffffff811115614728575f80fd5b8201601f81018413614738575f80fd5b80516147466141d982614177565b81815285602083850101111561475a575f80fd5b6146c3826020830160208601613e69565b5f806040838503121561477c575f80fd5b8251614787816140c1565b602084015190925061479881613f18565b809150509250929050565b601f821115613322575f81815260208120601f850160051c810160208610156147c95750805b601f850160051c820191505b818110156132bb578281556001016147d5565b815167ffffffffffffffff811115614802576148026140d2565b61481681614810845461450c565b846147a3565b602080601f831160018114614868575f84156148325750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556132bb565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156148b457888601518255948401946001909101908401614895565b50858210156148f057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f6149126060830186613e8b565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff8181168382160190808211156144cd576144cd61447f565b808201808211156146465761464661447f565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126149a4575f80fd5b9190910192915050565b5f608082360312156149be575f80fd5b6149c66140ff565b823567ffffffffffffffff8111156149dc575f80fd5b6149e8368286016141bc565b825250602083013560208201526040830135614a0381614037565b6040820152606092830135928101929092525090565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152614a6f60c0830184613e8b565b98975050505050505050565b61ffff8181168382160190808211156144cd576144cd61447f565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614afe816003860160208c01613e69565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614b41816017840160208b01613e69565b808201915050818660f81b16601782015284519150614b67826018830160208801613e69565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614be0816003860160208c01613e69565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614c23816017840160208b01613e69565b808201915050818660f01b16601782015284519150614c49826019830160208801613e69565b016019019998505050505050505050565b5f8651614c6b818460208b01613e69565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f614cf9606083018486614663565b9695505050505050565b5f82516149a4818460208701613e6956fea26469706673582212201281d4100452fbfedfff30c5ba9f475c64c3082f10f59c7afb3a0c4ed7777ac764736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610303575f3560e01c8063712570221161019d578063c7fffd4b116100e8578063e57a0b4c11610093578063ecef3f991161006e578063ecef3f9914610833578063f35dda4714610846578063f851a4401461084e575f80fd5b8063e57a0b4c146107ec578063e7a7ed021461080c578063eaeb077b14610820575f80fd5b8063d02103ca116100c3578063d02103ca14610793578063d7bc90ff146107ba578063e46761c4146107c5575f80fd5b8063c7fffd4b14610758578063c89e42df14610760578063cfa8ed4714610773575f80fd5b80639f26f84011610148578063ada8f91911610123578063ada8f91914610711578063b0afe15414610724578063c754c7ed14610730575f80fd5b80639f26f840146106c4578063a3c573eb146106d7578063a652f26c146106fe575f80fd5b80638c3d7301116101785780638c3d73011461068e57806391cafe32146106965780639e001877146106a9575f80fd5b8063712570221461062c5780637a5460c51461063f5780637cd76b8b1461067b575f80fd5b80633cbc795b1161025d57806352bdeb6d116102085780636b8616ce116101e35780636b8616ce146105f15780636e05d2cd146106105780636ff512cc14610619575f80fd5b806352bdeb6d146105a5578063542028d5146105e1578063676870d2146105e9575f80fd5b806349b7b8021161023857806349b7b802146105365780634c21fef31461055d5780634e48770614610592575f80fd5b80633cbc795b1461046857806340b5de6c146104a557806345605267146104fd575f80fd5b806326782247116102bd5780632d72c248116102985780632d72c2481461042257806332c2d153146104355780633c351e1014610448575f80fd5b806326782247146103a85780632acdc2b6146103ed5780632c111c0614610402575f80fd5b806305835f37116102ed57806305835f371461033d578063107bf28c1461038657806311e892d41461038e575f80fd5b8062d0295d146103075780630350896314610322575b5f80fd5b61030f610873565b6040519081526020015b60405180910390f35b61032a602081565b60405161ffff9091168152602001610319565b6103796040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516103199190613ed4565b610379610979565b61039660f981565b60405160ff9091168152602001610319565b6001546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610319565b6104006103fb366004613efd565b610a05565b005b6008546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b610400610430366004613f8e565b610b23565b61040061044336600461404c565b61140e565b6009546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104909074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610319565b6104cc7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff000000000000000000000000000000000000000000000000000000000000009091168152602001610319565b60075461051d9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610319565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b600a546105829074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001610319565b6104006105a036600461408b565b6114dd565b6103796040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b6103796116ec565b61032a601f81565b61030f6105ff36600461408b565b60066020525f908152604090205481565b61030f60055481565b6104006106273660046140a6565b6116f9565b61040061063a36600461420e565b6117c2565b6103796040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b6104006106893660046140a6565b611fcc565b610400612095565b6104006106a43660046140a6565b612167565b6103c873a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6104006106d23660046142f6565b61227f565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b61037961070c366004614335565b6128c3565b61040061071f3660046140a6565b612ca1565b61030f6405ca1ab1e081565b60075461051d90700100000000000000000000000000000000900467ffffffffffffffff1681565b61039660e481565b61040061076e3660046143a6565b612d6a565b6002546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b61030f635ca1ab1e81565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b600a546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b60075461051d9067ffffffffffffffff1681565b61040061082e3660046143d8565b612dfc565b610400610841366004614420565b6132c3565b610396601b81565b5f546103c89062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156108ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109239190614468565b6007549091505f9061094d9067ffffffffffffffff680100000000000000008204811691166144ac565b67ffffffffffffffff169050805f03610968575f9250505090565b61097281836144d4565b9250505090565b600480546109869061450c565b80601f01602080910402602001604051908101604052809291908181526020018280546109b29061450c565b80156109fd5780601f106109d4576101008083540402835291602001916109fd565b820191905f5260205f20905b8154815290600101906020018083116109e057829003601f168201915b505050505081565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a5b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a5474010000000000000000000000000000000000000000900460ff16151581151503610ab5576040517f5f0e7abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000831515021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f41905f90a150565b60025473ffffffffffffffffffffffffffffffffffffffff163314610b74576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835f819003610baf576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610beb576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610c50575f80fd5b505af1158015610c62573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cd0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cf49190614468565b60075460055491925068010000000000000000900467ffffffffffffffff1690815f805b86811015611028575f8c8c83818110610d3357610d3361455d565b905060800201803603810190610d49919061458a565b604081015190915067ffffffffffffffff1615610f365785610d6a816145d6565b9650505f815f0151826020015183604001518460600151604051602001610dcf9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114610e57576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85825f0151836020015184604001518f8660600151604051602001610ef0969594939291909586526020860194909452604085019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060808501919091521b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166068830152607c820152609c0190565b60405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550611015565b8051604051610f52918591602001918252602082015260400190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152828252805160209182012084519184018990529183015260608083018a90524260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401528d901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888301525f609c830152935060bc016040516020818303038152906040528051906020012094505b5080611020816145fc565b915050610d18565b5060075467ffffffffffffffff9081169085161115611073576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058390558567ffffffffffffffff85811690841614611170575f61109884876144ac565b90506110ae67ffffffffffffffff821683614633565b915061112f7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166110e7610873565b6110f1919061464c565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613327565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8816021790555b80156112f957611272337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611205573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112299190614468565b611233919061464c565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906133fb565b600a546040517f3b51be4b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690633b51be4b906112cc9085908d908d906004016146aa565b5f6040518083038186803b1580156112e2575f80fd5b505afa1580156112f4573d5f803e3d5ffd5b505050505b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018590525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611395573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113b991906146cc565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e766886040516113f791815260200190565b60405180910390a250505050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461147d576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966846040516114d091815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611533576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561157a576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115e3573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061160791906146e7565b6116685760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610611668576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546109869061450c565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff16331461174f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016116e1565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611831576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff161580801561184f57505f54600160ff909116105b806118685750303b15801561186857505f5460ff166001145b6118f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611955575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611bb3576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa1580156119fc573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611a419190810190614702565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d9060240160408051808303815f875af1158015611ad4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611af8919061476b565b915091508163ffffffff165f14611b6f576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055611bb0565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b6009545f90611bfa90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff16856128c3565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c999190614468565b90505f808483858f611cac600143614633565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611df2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e1691906146cc565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611ea691906147e8565b506004611eb389826147e8565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611f5393929190614900565b60405180910390a15050505050508015611fc3575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612022576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fd331bd4c4cd1afecb94a225184bded161ff3213624ba4fb58c4f30c5a861144a906020016116e1565b60015473ffffffffffffffffffffffffffffffffffffffff1633146120e6576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146121bd576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff1661220c576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb906020016116e1565b60085473ffffffffffffffffffffffffffffffffffffffff1680158015906122bd575073ffffffffffffffffffffffffffffffffffffffff81163314155b156122f4576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612362573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061238691906146cc565b612390919061493e565b67ffffffffffffffff1611156123d2576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361240d576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612449576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff808216916124719184916801000000000000000090041661495f565b11156124a9576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b83811015612744575f8787838181106124e4576124e461455d565b90506020028101906124f69190614972565b6124ff906149ae565b90508361250b816145d6565b825180516020918201208185015160408087015160608801519151959a509295505f94612577948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152600690935291205490915081146125ff576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f90815260066020526040812055612623600188614633565b84036126925742600760109054906101000a900467ffffffffffffffff168460400151612650919061493e565b67ffffffffffffffff161115612692576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209450505050808061273c906145fc565b9150506124c9565b506127727f0000000000000000000000000000000000000000000000000000000000000000846110e7610873565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390612843908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af115801561285f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061288391906146cc565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f876040516024016128f596959493929190614a19565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f03612a455760f9601f83516129899190614a7b565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001612a2f9796959493929190614a96565b6040516020818303038152906040529050612b49565b815161ffff1015612a82576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9612a91602083614a7b565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001612b369796959493929190614b78565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015612ba7573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612c1f576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f90612c649084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614c5a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612cf7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016116e1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612dc0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003612dcc82826147e8565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516116e19190613ed4565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590612e3a575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612e71576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015612eda573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612efe91906146e7565b15612f35576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f9f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc39190614468565b905082811115612fff576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138884111561303b576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61307d73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846133fb565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061310b9190614468565b6007805491925067ffffffffffffffff909116905f613129836145d6565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051613160929190614cb5565b6040519081900390208142613176600143614633565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f908152600690935291205532330361326c576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a26132bb565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931906132b290849033908b908b90614cc4565b60405180910390a25b505050505050565b600a5474010000000000000000000000000000000000000000900460ff16613317576040517f821935b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61332283838361345f565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526133229084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613bf3565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526134599085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613379565b50505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146134b0576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f8190036134eb576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115613527576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561358c575f80fd5b505af115801561359e573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561360c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136309190614468565b60075460055491925042916801000000000000000090910467ffffffffffffffff1690815f5b86811015613951575f8a8a838181106136715761367161455d565b90506020028101906136839190614972565b61368c906149ae565b8051805160209091012060408201519192509067ffffffffffffffff161561386c57856136b8816145d6565b9650505f8183602001518460400151856060015160405160200161371a9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f908152600690935291205490915081146137a2576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f90555061393c565b8151516201d4c010156138ab576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b50508080613949906145fc565b915050613656565b5060075467ffffffffffffffff908116908416111561399c576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff84811690831614613a51575f6139c183866144ac565b90506139d767ffffffffffffffff821683614633565b9150613a107f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166110e7610873565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b613ae0337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611205573d5f803e3d5ffd5b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015613b7c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ba091906146cc565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e76688604051613bde91815260200190565b60405180910390a25050505050505050505050565b5f613c54826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613cfe9092919063ffffffff16565b8051909150156133225780806020019051810190613c7291906146e7565b613322576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016118f0565b6060612c9984845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051613d309190614d03565b5f6040518083038185875af1925050503d805f8114613d6a576040519150601f19603f3d011682016040523d82523d5f602084013e613d6f565b606091505b5091509150613d8087838387613d8b565b979650505050505050565b60608315613e205782515f03613e195773ffffffffffffffffffffffffffffffffffffffff85163b613e19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016118f0565b5081612c99565b612c998383815115613e355781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f09190613ed4565b5f5b83811015613e83578181015183820152602001613e6b565b50505f910152565b5f8151808452613ea2816020860160208601613e69565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f613ee66020830184613e8b565b9392505050565b8015158114613efa575f80fd5b50565b5f60208284031215613f0d575f80fd5b8135613ee681613eed565b73ffffffffffffffffffffffffffffffffffffffff81168114613efa575f80fd5b8035613f4481613f18565b919050565b5f8083601f840112613f59575f80fd5b50813567ffffffffffffffff811115613f70575f80fd5b602083019150836020828501011115613f87575f80fd5b9250929050565b5f805f805f60608688031215613fa2575f80fd5b853567ffffffffffffffff80821115613fb9575f80fd5b818801915088601f830112613fcc575f80fd5b813581811115613fda575f80fd5b8960208260071b8501011115613fee575f80fd5b6020830197508096505061400460208901613f39565b94506040880135915080821115614019575f80fd5b5061402688828901613f49565b969995985093965092949392505050565b67ffffffffffffffff81168114613efa575f80fd5b5f805f6060848603121561405e575f80fd5b833561406981614037565b925060208401359150604084013561408081613f18565b809150509250925092565b5f6020828403121561409b575f80fd5b8135613ee681614037565b5f602082840312156140b6575f80fd5b8135613ee681613f18565b63ffffffff81168114613efa575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516080810167ffffffffffffffff81118282101715614122576141226140d2565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561416f5761416f6140d2565b604052919050565b5f67ffffffffffffffff821115614190576141906140d2565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f8301126141cb575f80fd5b81356141de6141d982614177565b614128565b8181528460208386010111156141f2575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c08789031215614223575f80fd5b863561422e81613f18565b9550602087013561423e81613f18565b9450604087013561424e816140c1565b9350606087013561425e81613f18565b9250608087013567ffffffffffffffff8082111561427a575f80fd5b6142868a838b016141bc565b935060a089013591508082111561429b575f80fd5b506142a889828a016141bc565b9150509295509295509295565b5f8083601f8401126142c5575f80fd5b50813567ffffffffffffffff8111156142dc575f80fd5b6020830191508360208260051b8501011115613f87575f80fd5b5f8060208385031215614307575f80fd5b823567ffffffffffffffff81111561431d575f80fd5b614329858286016142b5565b90969095509350505050565b5f805f8060808587031215614348575f80fd5b8435614353816140c1565b9350602085013561436381613f18565b92506040850135614373816140c1565b9150606085013567ffffffffffffffff81111561438e575f80fd5b61439a878288016141bc565b91505092959194509250565b5f602082840312156143b6575f80fd5b813567ffffffffffffffff8111156143cc575f80fd5b612c99848285016141bc565b5f805f604084860312156143ea575f80fd5b833567ffffffffffffffff811115614400575f80fd5b61440c86828701613f49565b909790965060209590950135949350505050565b5f805f60408486031215614432575f80fd5b833567ffffffffffffffff811115614448575f80fd5b614454868287016142b5565b909450925050602084013561408081613f18565b5f60208284031215614478575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8281168282160390808211156144cd576144cd61447f565b5092915050565b5f82614507577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c9082168061452057607f821691505b602082108103614557577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6080828403121561459a575f80fd5b6145a26140ff565b823581526020830135602082015260408301356145be81614037565b60408201526060928301359281019290925250919050565b5f67ffffffffffffffff8083168181036145f2576145f261447f565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361462c5761462c61447f565b5060010190565b818103818111156146465761464661447f565b92915050565b80820281158282048414176146465761464661447f565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201525f6146c3604083018486614663565b95945050505050565b5f602082840312156146dc575f80fd5b8151613ee681614037565b5f602082840312156146f7575f80fd5b8151613ee681613eed565b5f60208284031215614712575f80fd5b815167ffffffffffffffff811115614728575f80fd5b8201601f81018413614738575f80fd5b80516147466141d982614177565b81815285602083850101111561475a575f80fd5b6146c3826020830160208601613e69565b5f806040838503121561477c575f80fd5b8251614787816140c1565b602084015190925061479881613f18565b809150509250929050565b601f821115613322575f81815260208120601f850160051c810160208610156147c95750805b601f850160051c820191505b818110156132bb578281556001016147d5565b815167ffffffffffffffff811115614802576148026140d2565b61481681614810845461450c565b846147a3565b602080601f831160018114614868575f84156148325750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556132bb565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156148b457888601518255948401946001909101908401614895565b50858210156148f057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f6149126060830186613e8b565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff8181168382160190808211156144cd576144cd61447f565b808201808211156146465761464661447f565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126149a4575f80fd5b9190910192915050565b5f608082360312156149be575f80fd5b6149c66140ff565b823567ffffffffffffffff8111156149dc575f80fd5b6149e8368286016141bc565b825250602083013560208201526040830135614a0381614037565b6040820152606092830135928101929092525090565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152614a6f60c0830184613e8b565b98975050505050505050565b61ffff8181168382160190808211156144cd576144cd61447f565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614afe816003860160208c01613e69565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614b41816017840160208b01613e69565b808201915050818660f81b16601782015284519150614b67826018830160208801613e69565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614be0816003860160208c01613e69565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614c23816017840160208b01613e69565b808201915050818660f01b16601782015284519150614c49826019830160208801613e69565b016019019998505050505050505050565b5f8651614c6b818460208b01613e69565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f614cf9606083018486614663565b9695505050505050565b5f82516149a4818460208701613e6956fea26469706673582212201281d4100452fbfedfff30c5ba9f475c64c3082f10f59c7afb3a0c4ed7777ac764736f6c63430008140033", + "bytecode": "0x61010060405234801562000011575f80fd5b5060405162004f2b38038062004f2b83398101604081905262000034916200006f565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d4565b6001600160a01b03811681146200006c575f80fd5b50565b5f805f806080858703121562000083575f80fd5b8451620000908162000057565b6020860151909450620000a38162000057565b6040860151909350620000b68162000057565b6060860151909250620000c98162000057565b939692955090935050565b60805160a05160c05160e051614d4a620001e15f395f818161053b015281816110b50152818161117c0152818161119e0152818161133a015281816114100152818161157c015281816117c401528181611d97015281816122fb0152818161274a015281816127f701528181612e7301528181612f38015281816139de01528181613a5701528181613a790152613b2101525f81816106dc01528181610bed015281816119b801528181611a8d015281816129c101528181612ac9015261352901525f818161079801528181610c6901528181611c0e0152818161308001526135a501525f81816107ca015281816108ba015281816111080152818161124a01526130550152614d4a5ff3fe608060405234801561000f575f80fd5b5060043610610303575f3560e01c8063712570221161019d578063c7fffd4b116100e8578063e57a0b4c11610093578063ecef3f991161006e578063ecef3f9914610833578063f35dda4714610846578063f851a4401461084e575f80fd5b8063e57a0b4c146107ec578063e7a7ed021461080c578063eaeb077b14610820575f80fd5b8063d02103ca116100c3578063d02103ca14610793578063d7bc90ff146107ba578063e46761c4146107c5575f80fd5b8063c7fffd4b14610758578063c89e42df14610760578063cfa8ed4714610773575f80fd5b80639f26f84011610148578063ada8f91911610123578063ada8f91914610711578063b0afe15414610724578063c754c7ed14610730575f80fd5b80639f26f840146106c4578063a3c573eb146106d7578063a652f26c146106fe575f80fd5b80638c3d7301116101785780638c3d73011461068e57806391cafe32146106965780639e001877146106a9575f80fd5b8063712570221461062c5780637a5460c51461063f5780637cd76b8b1461067b575f80fd5b80633cbc795b1161025d57806352bdeb6d116102085780636b8616ce116101e35780636b8616ce146105f15780636e05d2cd146106105780636ff512cc14610619575f80fd5b806352bdeb6d146105a5578063542028d5146105e1578063676870d2146105e9575f80fd5b806349b7b8021161023857806349b7b802146105365780634c21fef31461055d5780634e48770614610592575f80fd5b80633cbc795b1461046857806340b5de6c146104a557806345605267146104fd575f80fd5b806326782247116102bd5780632d72c248116102985780632d72c2481461042257806332c2d153146104355780633c351e1014610448575f80fd5b806326782247146103a85780632acdc2b6146103ed5780632c111c0614610402575f80fd5b806305835f37116102ed57806305835f371461033d578063107bf28c1461038657806311e892d41461038e575f80fd5b8062d0295d146103075780630350896314610322575b5f80fd5b61030f610873565b6040519081526020015b60405180910390f35b61032a602081565b60405161ffff9091168152602001610319565b6103796040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516103199190613ed4565b610379610979565b61039660f981565b60405160ff9091168152602001610319565b6001546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610319565b6104006103fb366004613efd565b610a05565b005b6008546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b610400610430366004613f8e565b610b23565b61040061044336600461404c565b61140e565b6009546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104909074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610319565b6104cc7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff000000000000000000000000000000000000000000000000000000000000009091168152602001610319565b60075461051d9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610319565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b600a546105829074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001610319565b6104006105a036600461408b565b6114dd565b6103796040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b6103796116ec565b61032a601f81565b61030f6105ff36600461408b565b60066020525f908152604090205481565b61030f60055481565b6104006106273660046140a6565b6116f9565b61040061063a36600461420e565b6117c2565b6103796040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b6104006106893660046140a6565b611fcc565b610400612095565b6104006106a43660046140a6565b612167565b6103c873a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6104006106d23660046142f6565b61227f565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b61037961070c366004614335565b6128c3565b61040061071f3660046140a6565b612ca1565b61030f6405ca1ab1e081565b60075461051d90700100000000000000000000000000000000900467ffffffffffffffff1681565b61039660e481565b61040061076e3660046143a6565b612d6a565b6002546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b61030f635ca1ab1e81565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b600a546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b60075461051d9067ffffffffffffffff1681565b61040061082e3660046143d8565b612dfc565b610400610841366004614420565b6132c3565b610396601b81565b5f546103c89062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156108ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109239190614468565b6007549091505f9061094d9067ffffffffffffffff680100000000000000008204811691166144ac565b67ffffffffffffffff169050805f03610968575f9250505090565b61097281836144d4565b9250505090565b600480546109869061450c565b80601f01602080910402602001604051908101604052809291908181526020018280546109b29061450c565b80156109fd5780601f106109d4576101008083540402835291602001916109fd565b820191905f5260205f20905b8154815290600101906020018083116109e057829003601f168201915b505050505081565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a5b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a5474010000000000000000000000000000000000000000900460ff16151581151503610ab5576040517f5f0e7abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000831515021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f41905f90a150565b60025473ffffffffffffffffffffffffffffffffffffffff163314610b74576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835f819003610baf576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610beb576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610c50575f80fd5b505af1158015610c62573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cd0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cf49190614468565b60075460055491925068010000000000000000900467ffffffffffffffff1690815f805b86811015611028575f8c8c83818110610d3357610d3361455d565b905060800201803603810190610d49919061458a565b604081015190915067ffffffffffffffff1615610f365785610d6a816145d6565b9650505f815f0151826020015183604001518460600151604051602001610dcf9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114610e57576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85825f0151836020015184604001518f8660600151604051602001610ef0969594939291909586526020860194909452604085019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060808501919091521b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166068830152607c820152609c0190565b60405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550611015565b8051604051610f52918591602001918252602082015260400190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152828252805160209182012084519184018990529183015260608083018a90524260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401528d901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888301525f609c830152935060bc016040516020818303038152906040528051906020012094505b5080611020816145fc565b915050610d18565b5060075467ffffffffffffffff9081169085161115611073576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058390558567ffffffffffffffff85811690841614611170575f61109884876144ac565b90506110ae67ffffffffffffffff821683614633565b915061112f7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166110e7610873565b6110f1919061464c565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613327565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8816021790555b80156112f957611272337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611205573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112299190614468565b611233919061464c565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906133fb565b600a546040517f3b51be4b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690633b51be4b906112cc9085908d908d906004016146aa565b5f6040518083038186803b1580156112e2575f80fd5b505afa1580156112f4573d5f803e3d5ffd5b505050505b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018590525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611395573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113b991906146cc565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e766886040516113f791815260200190565b60405180910390a250505050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461147d576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966846040516114d091815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611533576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561157a576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115e3573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061160791906146e7565b6116685760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610611668576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546109869061450c565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff16331461174f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016116e1565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611831576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff161580801561184f57505f54600160ff909116105b806118685750303b15801561186857505f5460ff166001145b6118f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611955575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611bb3576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa1580156119fc573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611a419190810190614702565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d9060240160408051808303815f875af1158015611ad4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611af8919061476b565b915091508163ffffffff165f14611b6f576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055611bb0565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b6009545f90611bfa90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff16856128c3565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c999190614468565b90505f808483858f611cac600143614633565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611df2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e1691906146cc565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611ea691906147e8565b506004611eb389826147e8565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611f5393929190614900565b60405180910390a15050505050508015611fc3575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612022576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fd331bd4c4cd1afecb94a225184bded161ff3213624ba4fb58c4f30c5a861144a906020016116e1565b60015473ffffffffffffffffffffffffffffffffffffffff1633146120e6576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146121bd576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff1661220c576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb906020016116e1565b60085473ffffffffffffffffffffffffffffffffffffffff1680158015906122bd575073ffffffffffffffffffffffffffffffffffffffff81163314155b156122f4576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612362573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061238691906146cc565b612390919061493e565b67ffffffffffffffff1611156123d2576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361240d576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612449576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff808216916124719184916801000000000000000090041661495f565b11156124a9576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b83811015612744575f8787838181106124e4576124e461455d565b90506020028101906124f69190614972565b6124ff906149ae565b90508361250b816145d6565b825180516020918201208185015160408087015160608801519151959a509295505f94612577948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152600690935291205490915081146125ff576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f90815260066020526040812055612623600188614633565b84036126925742600760109054906101000a900467ffffffffffffffff168460400151612650919061493e565b67ffffffffffffffff161115612692576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209450505050808061273c906145fc565b9150506124c9565b506127727f0000000000000000000000000000000000000000000000000000000000000000846110e7610873565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390612843908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af115801561285f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061288391906146cc565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f876040516024016128f596959493929190614a19565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f03612a455760f9601f83516129899190614a7b565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001612a2f9796959493929190614a96565b6040516020818303038152906040529050612b49565b815161ffff1015612a82576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9612a91602083614a7b565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001612b369796959493929190614b78565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015612ba7573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612c1f576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f90612c649084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614c5a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612cf7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016116e1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612dc0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003612dcc82826147e8565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516116e19190613ed4565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590612e3a575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612e71576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015612eda573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612efe91906146e7565b15612f35576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f9f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc39190614468565b905082811115612fff576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138884111561303b576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61307d73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846133fb565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061310b9190614468565b6007805491925067ffffffffffffffff909116905f613129836145d6565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051613160929190614cb5565b6040519081900390208142613176600143614633565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f908152600690935291205532330361326c576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a26132bb565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931906132b290849033908b908b90614cc4565b60405180910390a25b505050505050565b600a5474010000000000000000000000000000000000000000900460ff16613317576040517f821935b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61332283838361345f565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526133229084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613bf3565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526134599085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613379565b50505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146134b0576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f8190036134eb576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115613527576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561358c575f80fd5b505af115801561359e573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561360c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136309190614468565b60075460055491925042916801000000000000000090910467ffffffffffffffff1690815f5b86811015613951575f8a8a838181106136715761367161455d565b90506020028101906136839190614972565b61368c906149ae565b8051805160209091012060408201519192509067ffffffffffffffff161561386c57856136b8816145d6565b9650505f8183602001518460400151856060015160405160200161371a9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f908152600690935291205490915081146137a2576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f90555061393c565b8151516201d4c010156138ab576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b50508080613949906145fc565b915050613656565b5060075467ffffffffffffffff908116908416111561399c576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff84811690831614613a51575f6139c183866144ac565b90506139d767ffffffffffffffff821683614633565b9150613a107f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166110e7610873565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b613ae0337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611205573d5f803e3d5ffd5b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015613b7c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ba091906146cc565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e76688604051613bde91815260200190565b60405180910390a25050505050505050505050565b5f613c54826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613cfe9092919063ffffffff16565b8051909150156133225780806020019051810190613c7291906146e7565b613322576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016118f0565b6060612c9984845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051613d309190614d03565b5f6040518083038185875af1925050503d805f8114613d6a576040519150601f19603f3d011682016040523d82523d5f602084013e613d6f565b606091505b5091509150613d8087838387613d8b565b979650505050505050565b60608315613e205782515f03613e195773ffffffffffffffffffffffffffffffffffffffff85163b613e19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016118f0565b5081612c99565b612c998383815115613e355781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f09190613ed4565b5f5b83811015613e83578181015183820152602001613e6b565b50505f910152565b5f8151808452613ea2816020860160208601613e69565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f613ee66020830184613e8b565b9392505050565b8015158114613efa575f80fd5b50565b5f60208284031215613f0d575f80fd5b8135613ee681613eed565b73ffffffffffffffffffffffffffffffffffffffff81168114613efa575f80fd5b8035613f4481613f18565b919050565b5f8083601f840112613f59575f80fd5b50813567ffffffffffffffff811115613f70575f80fd5b602083019150836020828501011115613f87575f80fd5b9250929050565b5f805f805f60608688031215613fa2575f80fd5b853567ffffffffffffffff80821115613fb9575f80fd5b818801915088601f830112613fcc575f80fd5b813581811115613fda575f80fd5b8960208260071b8501011115613fee575f80fd5b6020830197508096505061400460208901613f39565b94506040880135915080821115614019575f80fd5b5061402688828901613f49565b969995985093965092949392505050565b67ffffffffffffffff81168114613efa575f80fd5b5f805f6060848603121561405e575f80fd5b833561406981614037565b925060208401359150604084013561408081613f18565b809150509250925092565b5f6020828403121561409b575f80fd5b8135613ee681614037565b5f602082840312156140b6575f80fd5b8135613ee681613f18565b63ffffffff81168114613efa575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516080810167ffffffffffffffff81118282101715614122576141226140d2565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561416f5761416f6140d2565b604052919050565b5f67ffffffffffffffff821115614190576141906140d2565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f8301126141cb575f80fd5b81356141de6141d982614177565b614128565b8181528460208386010111156141f2575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c08789031215614223575f80fd5b863561422e81613f18565b9550602087013561423e81613f18565b9450604087013561424e816140c1565b9350606087013561425e81613f18565b9250608087013567ffffffffffffffff8082111561427a575f80fd5b6142868a838b016141bc565b935060a089013591508082111561429b575f80fd5b506142a889828a016141bc565b9150509295509295509295565b5f8083601f8401126142c5575f80fd5b50813567ffffffffffffffff8111156142dc575f80fd5b6020830191508360208260051b8501011115613f87575f80fd5b5f8060208385031215614307575f80fd5b823567ffffffffffffffff81111561431d575f80fd5b614329858286016142b5565b90969095509350505050565b5f805f8060808587031215614348575f80fd5b8435614353816140c1565b9350602085013561436381613f18565b92506040850135614373816140c1565b9150606085013567ffffffffffffffff81111561438e575f80fd5b61439a878288016141bc565b91505092959194509250565b5f602082840312156143b6575f80fd5b813567ffffffffffffffff8111156143cc575f80fd5b612c99848285016141bc565b5f805f604084860312156143ea575f80fd5b833567ffffffffffffffff811115614400575f80fd5b61440c86828701613f49565b909790965060209590950135949350505050565b5f805f60408486031215614432575f80fd5b833567ffffffffffffffff811115614448575f80fd5b614454868287016142b5565b909450925050602084013561408081613f18565b5f60208284031215614478575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8281168282160390808211156144cd576144cd61447f565b5092915050565b5f82614507577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c9082168061452057607f821691505b602082108103614557577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6080828403121561459a575f80fd5b6145a26140ff565b823581526020830135602082015260408301356145be81614037565b60408201526060928301359281019290925250919050565b5f67ffffffffffffffff8083168181036145f2576145f261447f565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361462c5761462c61447f565b5060010190565b818103818111156146465761464661447f565b92915050565b80820281158282048414176146465761464661447f565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201525f6146c3604083018486614663565b95945050505050565b5f602082840312156146dc575f80fd5b8151613ee681614037565b5f602082840312156146f7575f80fd5b8151613ee681613eed565b5f60208284031215614712575f80fd5b815167ffffffffffffffff811115614728575f80fd5b8201601f81018413614738575f80fd5b80516147466141d982614177565b81815285602083850101111561475a575f80fd5b6146c3826020830160208601613e69565b5f806040838503121561477c575f80fd5b8251614787816140c1565b602084015190925061479881613f18565b809150509250929050565b601f821115613322575f81815260208120601f850160051c810160208610156147c95750805b601f850160051c820191505b818110156132bb578281556001016147d5565b815167ffffffffffffffff811115614802576148026140d2565b61481681614810845461450c565b846147a3565b602080601f831160018114614868575f84156148325750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556132bb565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156148b457888601518255948401946001909101908401614895565b50858210156148f057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f6149126060830186613e8b565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff8181168382160190808211156144cd576144cd61447f565b808201808211156146465761464661447f565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126149a4575f80fd5b9190910192915050565b5f608082360312156149be575f80fd5b6149c66140ff565b823567ffffffffffffffff8111156149dc575f80fd5b6149e8368286016141bc565b825250602083013560208201526040830135614a0381614037565b6040820152606092830135928101929092525090565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152614a6f60c0830184613e8b565b98975050505050505050565b61ffff8181168382160190808211156144cd576144cd61447f565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614afe816003860160208c01613e69565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614b41816017840160208b01613e69565b808201915050818660f81b16601782015284519150614b67826018830160208801613e69565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614be0816003860160208c01613e69565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614c23816017840160208b01613e69565b808201915050818660f01b16601782015284519150614c49826019830160208801613e69565b016019019998505050505050505050565b5f8651614c6b818460208b01613e69565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f614cf9606083018486614663565b9695505050505050565b5f82516149a4818460208701613e6956fea2646970667358221220eb8161a53a6d76f2a412ed09d7ae0ab27b933f8945e62f86e299f2f7589c431864736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610303575f3560e01c8063712570221161019d578063c7fffd4b116100e8578063e57a0b4c11610093578063ecef3f991161006e578063ecef3f9914610833578063f35dda4714610846578063f851a4401461084e575f80fd5b8063e57a0b4c146107ec578063e7a7ed021461080c578063eaeb077b14610820575f80fd5b8063d02103ca116100c3578063d02103ca14610793578063d7bc90ff146107ba578063e46761c4146107c5575f80fd5b8063c7fffd4b14610758578063c89e42df14610760578063cfa8ed4714610773575f80fd5b80639f26f84011610148578063ada8f91911610123578063ada8f91914610711578063b0afe15414610724578063c754c7ed14610730575f80fd5b80639f26f840146106c4578063a3c573eb146106d7578063a652f26c146106fe575f80fd5b80638c3d7301116101785780638c3d73011461068e57806391cafe32146106965780639e001877146106a9575f80fd5b8063712570221461062c5780637a5460c51461063f5780637cd76b8b1461067b575f80fd5b80633cbc795b1161025d57806352bdeb6d116102085780636b8616ce116101e35780636b8616ce146105f15780636e05d2cd146106105780636ff512cc14610619575f80fd5b806352bdeb6d146105a5578063542028d5146105e1578063676870d2146105e9575f80fd5b806349b7b8021161023857806349b7b802146105365780634c21fef31461055d5780634e48770614610592575f80fd5b80633cbc795b1461046857806340b5de6c146104a557806345605267146104fd575f80fd5b806326782247116102bd5780632d72c248116102985780632d72c2481461042257806332c2d153146104355780633c351e1014610448575f80fd5b806326782247146103a85780632acdc2b6146103ed5780632c111c0614610402575f80fd5b806305835f37116102ed57806305835f371461033d578063107bf28c1461038657806311e892d41461038e575f80fd5b8062d0295d146103075780630350896314610322575b5f80fd5b61030f610873565b6040519081526020015b60405180910390f35b61032a602081565b60405161ffff9091168152602001610319565b6103796040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516103199190613ed4565b610379610979565b61039660f981565b60405160ff9091168152602001610319565b6001546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610319565b6104006103fb366004613efd565b610a05565b005b6008546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b610400610430366004613f8e565b610b23565b61040061044336600461404c565b61140e565b6009546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104909074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610319565b6104cc7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff000000000000000000000000000000000000000000000000000000000000009091168152602001610319565b60075461051d9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610319565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b600a546105829074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001610319565b6104006105a036600461408b565b6114dd565b6103796040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b6103796116ec565b61032a601f81565b61030f6105ff36600461408b565b60066020525f908152604090205481565b61030f60055481565b6104006106273660046140a6565b6116f9565b61040061063a36600461420e565b6117c2565b6103796040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b6104006106893660046140a6565b611fcc565b610400612095565b6104006106a43660046140a6565b612167565b6103c873a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6104006106d23660046142f6565b61227f565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b61037961070c366004614335565b6128c3565b61040061071f3660046140a6565b612ca1565b61030f6405ca1ab1e081565b60075461051d90700100000000000000000000000000000000900467ffffffffffffffff1681565b61039660e481565b61040061076e3660046143a6565b612d6a565b6002546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b61030f635ca1ab1e81565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b600a546103c89073ffffffffffffffffffffffffffffffffffffffff1681565b60075461051d9067ffffffffffffffff1681565b61040061082e3660046143d8565b612dfc565b610400610841366004614420565b6132c3565b610396601b81565b5f546103c89062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156108ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109239190614468565b6007549091505f9061094d9067ffffffffffffffff680100000000000000008204811691166144ac565b67ffffffffffffffff169050805f03610968575f9250505090565b61097281836144d4565b9250505090565b600480546109869061450c565b80601f01602080910402602001604051908101604052809291908181526020018280546109b29061450c565b80156109fd5780601f106109d4576101008083540402835291602001916109fd565b820191905f5260205f20905b8154815290600101906020018083116109e057829003601f168201915b505050505081565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a5b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a5474010000000000000000000000000000000000000000900460ff16151581151503610ab5576040517f5f0e7abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000831515021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f41905f90a150565b60025473ffffffffffffffffffffffffffffffffffffffff163314610b74576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835f819003610baf576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610beb576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610c50575f80fd5b505af1158015610c62573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cd0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cf49190614468565b60075460055491925068010000000000000000900467ffffffffffffffff1690815f805b86811015611028575f8c8c83818110610d3357610d3361455d565b905060800201803603810190610d49919061458a565b604081015190915067ffffffffffffffff1615610f365785610d6a816145d6565b9650505f815f0151826020015183604001518460600151604051602001610dcf9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114610e57576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85825f0151836020015184604001518f8660600151604051602001610ef0969594939291909586526020860194909452604085019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060808501919091521b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166068830152607c820152609c0190565b60405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550611015565b8051604051610f52918591602001918252602082015260400190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152828252805160209182012084519184018990529183015260608083018a90524260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401528d901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888301525f609c830152935060bc016040516020818303038152906040528051906020012094505b5080611020816145fc565b915050610d18565b5060075467ffffffffffffffff9081169085161115611073576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058390558567ffffffffffffffff85811690841614611170575f61109884876144ac565b90506110ae67ffffffffffffffff821683614633565b915061112f7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166110e7610873565b6110f1919061464c565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613327565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8816021790555b80156112f957611272337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611205573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112299190614468565b611233919061464c565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906133fb565b600a546040517f3b51be4b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690633b51be4b906112cc9085908d908d906004016146aa565b5f6040518083038186803b1580156112e2575f80fd5b505afa1580156112f4573d5f803e3d5ffd5b505050505b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018590525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611395573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113b991906146cc565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e766886040516113f791815260200190565b60405180910390a250505050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461147d576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966846040516114d091815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611533576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561157a576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115e3573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061160791906146e7565b6116685760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610611668576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546109869061450c565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff16331461174f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016116e1565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611831576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff161580801561184f57505f54600160ff909116105b806118685750303b15801561186857505f5460ff166001145b6118f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611955575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611bb3576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa1580156119fc573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611a419190810190614702565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d9060240160408051808303815f875af1158015611ad4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611af8919061476b565b915091508163ffffffff165f14611b6f576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055611bb0565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b6009545f90611bfa90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff16856128c3565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c999190614468565b90505f808483858f611cac600143614633565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611df2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e1691906146cc565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611ea691906147e8565b506004611eb389826147e8565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611f5393929190614900565b60405180910390a15050505050508015611fc3575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612022576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fd331bd4c4cd1afecb94a225184bded161ff3213624ba4fb58c4f30c5a861144a906020016116e1565b60015473ffffffffffffffffffffffffffffffffffffffff1633146120e6576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146121bd576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff1661220c576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb906020016116e1565b60085473ffffffffffffffffffffffffffffffffffffffff1680158015906122bd575073ffffffffffffffffffffffffffffffffffffffff81163314155b156122f4576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612362573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061238691906146cc565b612390919061493e565b67ffffffffffffffff1611156123d2576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361240d576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612449576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff808216916124719184916801000000000000000090041661495f565b11156124a9576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b83811015612744575f8787838181106124e4576124e461455d565b90506020028101906124f69190614972565b6124ff906149ae565b90508361250b816145d6565b825180516020918201208185015160408087015160608801519151959a509295505f94612577948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152600690935291205490915081146125ff576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f90815260066020526040812055612623600188614633565b84036126925742600760109054906101000a900467ffffffffffffffff168460400151612650919061493e565b67ffffffffffffffff161115612692576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209450505050808061273c906145fc565b9150506124c9565b506127727f0000000000000000000000000000000000000000000000000000000000000000846110e7610873565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390612843908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af115801561285f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061288391906146cc565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f876040516024016128f596959493929190614a19565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f03612a455760f9601f83516129899190614a7b565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001612a2f9796959493929190614a96565b6040516020818303038152906040529050612b49565b815161ffff1015612a82576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9612a91602083614a7b565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001612b369796959493929190614b78565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015612ba7573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612c1f576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f90612c649084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614c5a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612cf7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016116e1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612dc0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003612dcc82826147e8565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516116e19190613ed4565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590612e3a575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612e71576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015612eda573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612efe91906146e7565b15612f35576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f9f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fc39190614468565b905082811115612fff576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138884111561303b576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61307d73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846133fb565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061310b9190614468565b6007805491925067ffffffffffffffff909116905f613129836145d6565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051613160929190614cb5565b6040519081900390208142613176600143614633565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f908152600690935291205532330361326c576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a26132bb565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931906132b290849033908b908b90614cc4565b60405180910390a25b505050505050565b600a5474010000000000000000000000000000000000000000900460ff16613317576040517f821935b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61332283838361345f565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526133229084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613bf3565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526134599085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613379565b50505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146134b0576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f8190036134eb576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115613527576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561358c575f80fd5b505af115801561359e573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561360c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136309190614468565b60075460055491925042916801000000000000000090910467ffffffffffffffff1690815f5b86811015613951575f8a8a838181106136715761367161455d565b90506020028101906136839190614972565b61368c906149ae565b8051805160209091012060408201519192509067ffffffffffffffff161561386c57856136b8816145d6565b9650505f8183602001518460400151856060015160405160200161371a9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f908152600690935291205490915081146137a2576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f90555061393c565b8151516201d4c010156138ab576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b50508080613949906145fc565b915050613656565b5060075467ffffffffffffffff908116908416111561399c576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff84811690831614613a51575f6139c183866144ac565b90506139d767ffffffffffffffff821683614633565b9150613a107f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166110e7610873565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b613ae0337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611205573d5f803e3d5ffd5b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015613b7c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ba091906146cc565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e76688604051613bde91815260200190565b60405180910390a25050505050505050505050565b5f613c54826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613cfe9092919063ffffffff16565b8051909150156133225780806020019051810190613c7291906146e7565b613322576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016118f0565b6060612c9984845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051613d309190614d03565b5f6040518083038185875af1925050503d805f8114613d6a576040519150601f19603f3d011682016040523d82523d5f602084013e613d6f565b606091505b5091509150613d8087838387613d8b565b979650505050505050565b60608315613e205782515f03613e195773ffffffffffffffffffffffffffffffffffffffff85163b613e19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016118f0565b5081612c99565b612c998383815115613e355781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f09190613ed4565b5f5b83811015613e83578181015183820152602001613e6b565b50505f910152565b5f8151808452613ea2816020860160208601613e69565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f613ee66020830184613e8b565b9392505050565b8015158114613efa575f80fd5b50565b5f60208284031215613f0d575f80fd5b8135613ee681613eed565b73ffffffffffffffffffffffffffffffffffffffff81168114613efa575f80fd5b8035613f4481613f18565b919050565b5f8083601f840112613f59575f80fd5b50813567ffffffffffffffff811115613f70575f80fd5b602083019150836020828501011115613f87575f80fd5b9250929050565b5f805f805f60608688031215613fa2575f80fd5b853567ffffffffffffffff80821115613fb9575f80fd5b818801915088601f830112613fcc575f80fd5b813581811115613fda575f80fd5b8960208260071b8501011115613fee575f80fd5b6020830197508096505061400460208901613f39565b94506040880135915080821115614019575f80fd5b5061402688828901613f49565b969995985093965092949392505050565b67ffffffffffffffff81168114613efa575f80fd5b5f805f6060848603121561405e575f80fd5b833561406981614037565b925060208401359150604084013561408081613f18565b809150509250925092565b5f6020828403121561409b575f80fd5b8135613ee681614037565b5f602082840312156140b6575f80fd5b8135613ee681613f18565b63ffffffff81168114613efa575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516080810167ffffffffffffffff81118282101715614122576141226140d2565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561416f5761416f6140d2565b604052919050565b5f67ffffffffffffffff821115614190576141906140d2565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f8301126141cb575f80fd5b81356141de6141d982614177565b614128565b8181528460208386010111156141f2575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c08789031215614223575f80fd5b863561422e81613f18565b9550602087013561423e81613f18565b9450604087013561424e816140c1565b9350606087013561425e81613f18565b9250608087013567ffffffffffffffff8082111561427a575f80fd5b6142868a838b016141bc565b935060a089013591508082111561429b575f80fd5b506142a889828a016141bc565b9150509295509295509295565b5f8083601f8401126142c5575f80fd5b50813567ffffffffffffffff8111156142dc575f80fd5b6020830191508360208260051b8501011115613f87575f80fd5b5f8060208385031215614307575f80fd5b823567ffffffffffffffff81111561431d575f80fd5b614329858286016142b5565b90969095509350505050565b5f805f8060808587031215614348575f80fd5b8435614353816140c1565b9350602085013561436381613f18565b92506040850135614373816140c1565b9150606085013567ffffffffffffffff81111561438e575f80fd5b61439a878288016141bc565b91505092959194509250565b5f602082840312156143b6575f80fd5b813567ffffffffffffffff8111156143cc575f80fd5b612c99848285016141bc565b5f805f604084860312156143ea575f80fd5b833567ffffffffffffffff811115614400575f80fd5b61440c86828701613f49565b909790965060209590950135949350505050565b5f805f60408486031215614432575f80fd5b833567ffffffffffffffff811115614448575f80fd5b614454868287016142b5565b909450925050602084013561408081613f18565b5f60208284031215614478575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8281168282160390808211156144cd576144cd61447f565b5092915050565b5f82614507577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c9082168061452057607f821691505b602082108103614557577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6080828403121561459a575f80fd5b6145a26140ff565b823581526020830135602082015260408301356145be81614037565b60408201526060928301359281019290925250919050565b5f67ffffffffffffffff8083168181036145f2576145f261447f565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361462c5761462c61447f565b5060010190565b818103818111156146465761464661447f565b92915050565b80820281158282048414176146465761464661447f565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201525f6146c3604083018486614663565b95945050505050565b5f602082840312156146dc575f80fd5b8151613ee681614037565b5f602082840312156146f7575f80fd5b8151613ee681613eed565b5f60208284031215614712575f80fd5b815167ffffffffffffffff811115614728575f80fd5b8201601f81018413614738575f80fd5b80516147466141d982614177565b81815285602083850101111561475a575f80fd5b6146c3826020830160208601613e69565b5f806040838503121561477c575f80fd5b8251614787816140c1565b602084015190925061479881613f18565b809150509250929050565b601f821115613322575f81815260208120601f850160051c810160208610156147c95750805b601f850160051c820191505b818110156132bb578281556001016147d5565b815167ffffffffffffffff811115614802576148026140d2565b61481681614810845461450c565b846147a3565b602080601f831160018114614868575f84156148325750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556132bb565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156148b457888601518255948401946001909101908401614895565b50858210156148f057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f6149126060830186613e8b565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff8181168382160190808211156144cd576144cd61447f565b808201808211156146465761464661447f565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126149a4575f80fd5b9190910192915050565b5f608082360312156149be575f80fd5b6149c66140ff565b823567ffffffffffffffff8111156149dc575f80fd5b6149e8368286016141bc565b825250602083013560208201526040830135614a0381614037565b6040820152606092830135928101929092525090565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152614a6f60c0830184613e8b565b98975050505050505050565b61ffff8181168382160190808211156144cd576144cd61447f565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614afe816003860160208c01613e69565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614b41816017840160208b01613e69565b808201915050818660f81b16601782015284519150614b67826018830160208801613e69565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614be0816003860160208c01613e69565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614c23816017840160208b01613e69565b808201915050818660f01b16601782015284519150614c49826019830160208801613e69565b016019019998505050505050505050565b5f8651614c6b818460208b01613e69565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f614cf9606083018486614663565b9695505050505050565b5f82516149a4818460208701613e6956fea2646970667358221220eb8161a53a6d76f2a412ed09d7ae0ab27b933f8945e62f86e299f2f7589c431864736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMBridgeV2.json b/compiled-contracts/PolygonZkEVMBridgeV2.json index ef679b496..c8e8a2aa1 100644 --- a/compiled-contracts/PolygonZkEVMBridgeV2.json +++ b/compiled-contracts/PolygonZkEVMBridgeV2.json @@ -1006,8 +1006,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801562000010575f80fd5b506200001b62000021565b620000e0565b5f54610100900460ff16156200008d5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161015620000de575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b61591b80620000ee5f395ff3fe6080604052600436106101db575f3560e01c806383f24403116100fd578063ccaa2d1111610092578063ee25560b11610062578063ee25560b146105a9578063f5efcd79146105d4578063f811bff7146105f3578063fb57083414610612575f80fd5b8063ccaa2d111461053b578063cd5865791461055a578063d02103ca1461056d578063dbc1697614610595575f80fd5b8063bab161bf116100cd578063bab161bf146104b9578063be5831c7146104da578063c00f14ab146104fd578063cc4616321461051c575f80fd5b806383f244031461043d5780638ed7e3f21461045c578063aaa13cc21461047b578063b8b284d01461049a575f80fd5b80633cbc795b116101735780637843298b116101435780637843298b146103c257806379e2cf97146103e157806381b1c174146103f557806383c43a5514610429575f80fd5b80633cbc795b146103385780633e197043146103705780634b2f336d1461038f5780635ca1e165146103ae575f80fd5b806327aef4e8116101ae57806327aef4e81461026d5780632dfdf0b51461028e578063318aee3d146102b15780633c351e1014610319575f80fd5b806315064c96146101df5780632072f6c51461020d57806322e95f2c14610223578063240ff3781461025a575b5f80fd5b3480156101ea575f80fd5b506068546101f89060ff1681565b60405190151581526020015b60405180910390f35b348015610218575f80fd5b50610221610631565b005b34801561022e575f80fd5b5061024261023d366004612fb9565b610666565b6040516001600160a01b039091168152602001610204565b610221610268366004613040565b6106d0565b348015610278575f80fd5b50610281610759565b6040516102049190613102565b348015610299575f80fd5b506102a360535481565b604051908152602001610204565b3480156102bc575f80fd5b506102f56102cb36600461311b565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201610204565b348015610324575f80fd5b50606d54610242906001600160a01b031681565b348015610343575f80fd5b50606d5461035b90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610204565b34801561037b575f80fd5b506102a361038a366004613144565b6107e5565b34801561039a575f80fd5b50606f54610242906001600160a01b031681565b3480156103b9575f80fd5b506102a361088e565b3480156103cd575f80fd5b506102426103dc3660046131be565b61096a565b3480156103ec575f80fd5b50610221610993565b348015610400575f80fd5b5061024261040f366004613204565b606a6020525f90815260409020546001600160a01b031681565b348015610434575f80fd5b506102816109b4565b348015610448575f80fd5b506102a361045736600461322c565b6109d3565b348015610467575f80fd5b50606c54610242906001600160a01b031681565b348015610486575f80fd5b5061024261049536600461332d565b610aa8565b3480156104a5575f80fd5b506102216104b43660046133c3565b610be7565b3480156104c4575f80fd5b5060685461035b90610100900463ffffffff1681565b3480156104e5575f80fd5b5060685461035b90600160c81b900463ffffffff1681565b348015610508575f80fd5b5061028161051736600461311b565b610cc2565b348015610527575f80fd5b506101f8610536366004613441565b610d07565b348015610546575f80fd5b50610221610555366004613472565b610d8f565b610221610568366004613556565b6112c0565b348015610578575f80fd5b50606854610242906501000000000090046001600160a01b031681565b3480156105a0575f80fd5b5061022161172c565b3480156105b4575f80fd5b506102a36105c3366004613204565b60696020525f908152604090205481565b3480156105df575f80fd5b506102216105ee366004613472565b61175f565b3480156105fe575f80fd5b5061022161060d3660046135e6565b611a25565b34801561061d575f80fd5b506101f861062c366004613689565b611d40565b606c546001600160a01b0316331461065c57604051631736745960e31b815260040160405180910390fd5b610664611d57565b565b6040805160e084901b6001600160e01b031916602080830191909152606084901b6bffffffffffffffffffffffff1916602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b60685460ff16156106f457604051630bc011ff60e21b815260040160405180910390fd5b341580159061070d5750606f546001600160a01b031615155b15610744576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610752858534868686611db2565b5050505050565b606e8054610766906136ce565b80601f0160208091040260200160405190810160405280929190818152602001828054610792906136ce565b80156107dd5780601f106107b4576101008083540402835291602001916107dd565b820191905f5260205f20905b8154815290600101906020018083116107c057829003601f168201915b505050505081565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201526001600160e01b031960e088811b821660218401526bffffffffffffffffffffffff19606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b6053545f90819081805b6020811015610961578083901c6001166001036108f557603381602081106108c2576108c2613706565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610922565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806109599061372e565b915050610898565b50919392505050565b5f61098b848461097985611e7c565b61098286611f66565b61049587612047565b949350505050565b605354606854600160c81b900463ffffffff16101561066457610664612114565b60405180611ba00160405280611b668152602001613d80611b66913981565b5f83815b6020811015610a9f57600163ffffffff8516821c81169003610a4257848160208110610a0557610a05613706565b602002013582604051602001610a25929190918252602082015260400190565b604051602081830303815290604052805190602001209150610a8d565b81858260208110610a5557610a55613706565b6020020135604051602001610a74929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610a978161372e565b9150506109d7565b50949350505050565b6040516001600160e01b031960e087901b1660208201526bffffffffffffffffffffffff19606086901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180611ba00160405280611b668152602001613d80611b669139898989604051602001610b3093929190613746565b60408051601f1981840301815290829052610b4e929160200161377e565b60405160208183030381529060405280519060200120604051602001610bc394939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff1615610c0b57604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b0316610c4d576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f54604051632770a7eb60e21b8152336004820152602481018690526001600160a01b0390911690639dc29fac906044015f604051808303815f87803b158015610c96575f80fd5b505af1158015610ca8573d5f803e3d5ffd5b50505050610cba868686868686611db2565b505050505050565b6060610ccd82611e7c565b610cd683611f66565b610cdf84612047565b604051602001610cf193929190613746565b6040516020818303038152906040529050919050565b6068545f908190610100900463ffffffff16158015610d2c575063ffffffff83166001145b15610d3e575063ffffffff8316610d66565b610d5364010000000063ffffffff85166137ac565b610d639063ffffffff86166137c3565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff1615610db357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614610de3576040516302caf51760e11b815260040160405180910390fd5b610e168c8c8c8c8c610e115f8e8e8e8e8e8e8e604051610e049291906137d6565b60405180910390206107e5565b6121c2565b6001600160a01b038616610f6057606f546001600160a01b0316610efa575f6001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015610e6c576020820181803683370190505b50604051610e7a91906137e5565b5f6040518083038185875af1925050503d805f8114610eb4576040519150601f19603f3d011682016040523d82523d5f602084013e610eb9565b606091505b5050905080610ef4576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611256565b606f546040516340c10f1960e01b81526001600160a01b03868116600483015260248201869052909116906340c10f19906044015f604051808303815f87803b158015610f45575f80fd5b505af1158015610f57573d5f803e3d5ffd5b50505050611256565b606d546001600160a01b038781169116148015610f8e5750606d5463ffffffff888116600160a01b90920416145b15610fa5575f6001600160a01b0385168482610e42565b60685463ffffffff610100909104811690881603610fd657610fd16001600160a01b0387168585612354565b611256565b6040516001600160e01b031960e089901b1660208201526bffffffffffffffffffffffff19606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b0316806111f5575f6110808386868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506123d592505050565b6040516340c10f1960e01b81526001600160a01b03898116600483015260248201899052919250908216906340c10f19906044015f604051808303815f87803b1580156110cb575f80fd5b505af11580156110dd573d5f803e3d5ffd5b5050505080606a5f8581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a8388886040516111e7959493929190613828565b60405180910390a150611253565b6040516340c10f1960e01b81526001600160a01b038781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801561123c575f80fd5b505af115801561124e573d5f803e3d5ffd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156112e457604051630bc011ff60e21b815260040160405180910390fd5b6112ec612468565b60685463ffffffff61010090910481169088160361131d576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b03881661141957883414611369576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff16945090611396906136ce565b80601f01602080910402602001604051908101604052809291908181526020018280546113c2906136ce565b801561140d5780601f106113e45761010080835404028352916020019161140d565b820191905f5260205f20905b8154815290600101906020018083116113f057829003601f168201915b505050505091506116a3565b3415611451576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546001600160a01b03908116908916036114c757604051632770a7eb60e21b8152336004820152602481018a90526001600160a01b03891690639dc29fac906044015f604051808303815f87803b1580156114ac575f80fd5b505af11580156114be573d5f803e3d5ffd5b505050506116a3565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901561157957604051632770a7eb60e21b8152336004820152602481018b90526001600160a01b038a1690639dc29fac906044015f604051808303815f87803b158015611551575f80fd5b505af1158015611563573d5f803e3d5ffd5b5050505080602001519450805f01519350611696565b851561158b5761158b898b89896124c1565b6040516370a0823160e01b81523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa1580156115cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f39190613860565b905061160a6001600160a01b038b1633308e612860565b6040516370a0823160e01b81523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa15801561164e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116729190613860565b905061167e8282613877565b6068548c9850610100900463ffffffff169650935050505b61169f89610cc2565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e86886053546040516116e298979695949392919061388a565b60405180910390a16117086117035f85878f8f8789805190602001206107e5565b6128b1565b861561171657611716612114565b5050505061172360018055565b50505050505050565b606c546001600160a01b0316331461175757604051631736745960e31b815260040160405180910390fd5b6106646129b2565b60685460ff161561178357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146117b3576040516302caf51760e11b815260040160405180910390fd5b6117d58c8c8c8c8c610e1160018e8e8e8e8e8e8e604051610e049291906137d6565b606f545f906001600160a01b031661188857846001600160a01b031684888a868660405160240161180994939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161183e91906137e5565b5f6040518083038185875af1925050503d805f8114611878576040519150601f19603f3d011682016040523d82523d5f602084013e61187d565b606091505b505080915050611983565b606f546040516340c10f1960e01b81526001600160a01b03878116600483015260248201879052909116906340c10f19906044015f604051808303815f87803b1580156118d3575f80fd5b505af11580156118e5573d5f803e3d5ffd5b50505050846001600160a01b03168789858560405160240161190a94939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161193f91906137e5565b5f604051808303815f865af19150503d805f8114611978576040519150601f19603f3d011682016040523d82523d5f602084013e61197d565b606091505b50909150505b806119ba576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f54610100900460ff1615808015611a4357505f54600160ff909116105b80611a5c5750303b158015611a5c57505f5460ff166001145b611ad35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805460ff191660011790558015611af4575f805461ff0019166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8a16027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038781169190910291909117909155606c805473ffffffffffffffffffffffffffffffffffffffff19168583161790558616611bcf5763ffffffff851615611bca576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ceb565b606d805463ffffffff8716600160a01b027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b03891617179055606e611c1e8382613970565b50611cbd5f801b6012604051602001611ca991906060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff91909116604082015260e00190565b6040516020818303038152906040526123d5565b606f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790555b611cf3612a22565b8015611723575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b5f81611d4d8686866109d3565b1495945050505050565b60685460ff1615611d7b57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff610100909104811690871603611de3576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051611e3799989796959493929190613a2c565b60405180910390a1611e6e6117036001606860019054906101000a900463ffffffff16338a8a8a8989604051610e049291906137d6565b8215610cba57610cba612114565b60408051600481526024810182526020810180516001600160e01b03167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611edb91906137e5565b5f60405180830381855afa9150503d805f8114611f13576040519150601f19603f3d011682016040523d82523d5f602084013e611f18565b606091505b509150915081611f5d576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525061098b565b61098b81612a94565b60408051600481526024810182526020810180516001600160e01b03167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611fc591906137e5565b5f60405180830381855afa9150503d805f8114611ffd576040519150601f19603f3d011682016040523d82523d5f602084013e612002565b606091505b509150915081611f5d576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525061098b565b60408051600481526024810182526020810180516001600160e01b03167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b038616916120a591906137e5565b5f60405180830381855afa9150503d805f81146120dd576040519150601f19603f3d011682016040523d82523d5f602084013e6120e2565b606091505b50915091508180156120f5575080516020145b61210057601261098b565b8080602001905181019061098b9190613a97565b6053546068805463ffffffff909216600160c81b027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d61217561088e565b6040518263ffffffff1660e01b815260040161219391815260200190565b5f604051808303815f87803b1580156121aa575f80fd5b505af11580156121bc573d5f803e3d5ffd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af1158015612253573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122779190613860565b9050805f036122b1576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80680100000000000000008716156122f5578691506122d3848a8489611d40565b6122f0576040516338105f3b60e21b815260040160405180910390fd5b61233f565b602087901c612305816001613ab2565b9150879250612320612318868c866109d3565b8a8389611d40565b61233d576040516338105f3b60e21b815260040160405180910390fd5b505b6123498282612c64565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526123d09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612d24565b505050565b5f8060405180611ba00160405280611b668152602001613d80611b6691398360405160200161240592919061377e565b6040516020818303038152906040529050838151602083015ff591506001600160a01b038216612461576040517fbefb092000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5092915050565b6002600154036124ba5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611aca565b6002600155565b5f6124cf6004828486613acf565b6124d891613af6565b90507f2afa5331000000000000000000000000000000000000000000000000000000006001600160e01b03198216016126b2575f80808080808061251f896004818d613acf565b81019061252c9190613b26565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161461256c5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03861630146125955760405163750643af60e01b815260040160405180910390fd5b8a85146125ce576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b03167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169161266591906137e5565b5f604051808303815f865af19150503d805f811461269e576040519150601f19603f3d011682016040523d82523d5f602084013e6126a3565b606091505b50505050505050505050610752565b6001600160e01b031981166323f2ebc360e21b146126fc576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806127118a6004818e613acf565b81019061271e9190613b75565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146127605760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146127895760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169161281091906137e5565b5f604051808303815f865af19150503d805f8114612849576040519150601f19603f3d011682016040523d82523d5f602084013e61284e565b606091505b50505050505050505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526121bc9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612399565b8060016128c060206002613cd3565b6128ca9190613877565b60535410612904576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f81546129139061372e565b918290555090505f5b60208110156129a3578082901c60011660010361294f57826033826020811061294757612947613706565b015550505050565b6033816020811061296257612962613706565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061299b9061372e565b91505061291c565b506123d0613cde565b60018055565b60685460ff166129ee576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f54610100900460ff16612a8c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b610664612e08565b60606040825110612ab357818060200190518101906106ca9190613cf2565b8151602003612c26575f5b602081108015612b055750828181518110612adb57612adb613706565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15612b1c5780612b148161372e565b915050612abe565b805f03612b5e57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115612b7857612b78613268565b6040519080825280601f01601f191660200182016040528015612ba2576020820181803683370190505b5090505f5b82811015612c1e57848181518110612bc157612bc1613706565b602001015160f81c60f81b828281518110612bde57612bde613706565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080612c168161372e565b915050612ba7565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b6068545f90610100900463ffffffff16158015612c87575063ffffffff82166001145b15612c99575063ffffffff8216612cc1565b612cae64010000000063ffffffff84166137ac565b612cbe9063ffffffff85166137c3565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003611723576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612d78826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e729092919063ffffffff16565b8051909150156123d05780806020019051810190612d969190613d64565b6123d05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611aca565b5f54610100900460ff166129ac5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b606061098b84845f85855f80866001600160a01b03168587604051612e9791906137e5565b5f6040518083038185875af1925050503d805f8114612ed1576040519150601f19603f3d011682016040523d82523d5f602084013e612ed6565b606091505b5091509150612ee787838387612ef2565b979650505050505050565b60608315612f605782515f03612f59576001600160a01b0385163b612f595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611aca565b508161098b565b61098b8383815115612f755781518083602001fd5b8060405162461bcd60e51b8152600401611aca9190613102565b803563ffffffff81168114612c5f575f80fd5b6001600160a01b0381168114612fb6575f80fd5b50565b5f8060408385031215612fca575f80fd5b612fd383612f8f565b91506020830135612fe381612fa2565b809150509250929050565b8015158114612fb6575f80fd5b5f8083601f84011261300b575f80fd5b50813567ffffffffffffffff811115613022575f80fd5b602083019150836020828501011115613039575f80fd5b9250929050565b5f805f805f60808688031215613054575f80fd5b61305d86612f8f565b9450602086013561306d81612fa2565b9350604086013561307d81612fee565b9250606086013567ffffffffffffffff811115613098575f80fd5b6130a488828901612ffb565b969995985093965092949392505050565b5f5b838110156130cf5781810151838201526020016130b7565b50505f910152565b5f81518084526130ee8160208601602086016130b5565b601f01601f19169290920160200192915050565b602081525f61311460208301846130d7565b9392505050565b5f6020828403121561312b575f80fd5b813561311481612fa2565b60ff81168114612fb6575f80fd5b5f805f805f805f60e0888a03121561315a575f80fd5b873561316581613136565b965061317360208901612f8f565b9550604088013561318381612fa2565b945061319160608901612f8f565b935060808801356131a181612fa2565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156131d0575f80fd5b6131d984612f8f565b925060208401356131e981612fa2565b915060408401356131f981612fa2565b809150509250925092565b5f60208284031215613214575f80fd5b5035919050565b8061040081018310156106ca575f80fd5b5f805f610440848603121561323f575f80fd5b83359250613250856020860161321b565b915061325f6104208501612f8f565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156132a5576132a5613268565b604052919050565b5f67ffffffffffffffff8211156132c6576132c6613268565b50601f01601f191660200190565b5f6132e66132e1846132ad565b61327c565b90508281528383830111156132f9575f80fd5b828260208301375f602084830101529392505050565b5f82601f83011261331e575f80fd5b613114838335602085016132d4565b5f805f805f60a08688031215613341575f80fd5b61334a86612f8f565b9450602086013561335a81612fa2565b9350604086013567ffffffffffffffff80821115613376575f80fd5b61338289838a0161330f565b94506060880135915080821115613397575f80fd5b506133a48882890161330f565b92505060808601356133b581613136565b809150509295509295909350565b5f805f805f8060a087890312156133d8575f80fd5b6133e187612f8f565b955060208701356133f181612fa2565b945060408701359350606087013561340881612fee565b9250608087013567ffffffffffffffff811115613423575f80fd5b61342f89828a01612ffb565b979a9699509497509295939492505050565b5f8060408385031215613452575f80fd5b61345b83612f8f565b915061346960208401612f8f565b90509250929050565b5f805f805f805f805f805f806109208d8f03121561348e575f80fd5b6134988e8e61321b565b9b506134a88e6104008f0161321b565b9a506108008d013599506108208d013598506108408d013597506134cf6108608e01612f8f565b96506134df6108808e0135612fa2565b6108808d013595506134f46108a08e01612f8f565b94506135046108c08e0135612fa2565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111561352d575f80fd5b61353e8e6109008f01358f01612ffb565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121561356c575f80fd5b61357588612f8f565b9650602088013561358581612fa2565b955060408801359450606088013561359c81612fa2565b935060808801356135ac81612fee565b925060a088013567ffffffffffffffff8111156135c7575f80fd5b6135d38a828b01612ffb565b989b979a50959850939692959293505050565b5f805f805f8060c087890312156135fb575f80fd5b61360487612f8f565b9550602087013561361481612fa2565b945061362260408801612f8f565b9350606087013561363281612fa2565b9250608087013561364281612fa2565b915060a087013567ffffffffffffffff81111561365d575f80fd5b8701601f8101891361366d575f80fd5b61367c898235602084016132d4565b9150509295509295509295565b5f805f80610460858703121561369d575f80fd5b843593506136ae866020870161321b565b92506136bd6104208601612f8f565b939692955092936104400135925050565b600181811c908216806136e257607f821691505b60208210810361370057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f6001820161373f5761373f61371a565b5060010190565b606081525f61375860608301866130d7565b828103602084015261376a81866130d7565b91505060ff83166040830152949350505050565b5f835161378f8184602088016130b5565b8351908301906137a38183602088016130b5565b01949350505050565b80820281158282048414176106ca576106ca61371a565b808201808211156106ca576106ca61371a565b818382375f9101908152919050565b5f82516137f68184602087016130b5565b9190910192915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b63ffffffff861681525f6001600160a01b03808716602084015280861660408401525060806060830152612ee7608083018486613800565b5f60208284031215613870575f80fd5b5051919050565b818103818111156106ca576106ca61371a565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c08501526138da828501876130d7565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f613921606083018486613800565b9695505050505050565b601f8211156123d0575f81815260208120601f850160051c810160208610156139515750805b601f850160051c820191505b81811015610cba5782815560010161395d565b815167ffffffffffffffff81111561398a5761398a613268565b61399e8161399884546136ce565b8461392b565b602080601f8311600181146139d1575f84156139ba5750858301515b5f19600386901b1c1916600185901b178555610cba565b5f85815260208120601f198616915b828110156139ff578886015182559484019460019091019084016139e0565b5085821015613a1c57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c0850152613a7d8285018789613800565b925080851660e085015250509a9950505050505050505050565b5f60208284031215613aa7575f80fd5b815161311481613136565b63ffffffff8181168382160190808211156124615761246161371a565b5f8085851115613add575f80fd5b83861115613ae9575f80fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015613b1e5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215613b3c575f80fd5b8735613b4781612fa2565b96506020880135613b5781612fa2565b9550604088013594506060880135935060808801356131a181613136565b5f805f805f805f80610100898b031215613b8d575f80fd5b8835613b9881612fa2565b97506020890135613ba881612fa2565b965060408901359550606089013594506080890135613bc681612fee565b935060a0890135613bd681613136565b979a969950949793969295929450505060c08201359160e0013590565b600181815b80851115613c2d57815f1904821115613c1357613c1361371a565b80851615613c2057918102915b93841c9390800290613bf8565b509250929050565b5f82613c43575060016106ca565b81613c4f57505f6106ca565b8160018114613c655760028114613c6f57613c8b565b60019150506106ca565b60ff841115613c8057613c8061371a565b50506001821b6106ca565b5060208310610133831016604e8410600b8410161715613cae575081810a6106ca565b613cb88383613bf3565b805f1904821115613ccb57613ccb61371a565b029392505050565b5f6131148383613c35565b634e487b7160e01b5f52600160045260245ffd5b5f60208284031215613d02575f80fd5b815167ffffffffffffffff811115613d18575f80fd5b8201601f81018413613d28575f80fd5b8051613d366132e1826132ad565b818152856020838501011115613d4a575f80fd5b613d5b8260208301602086016130b5565b95945050505050565b5f60208284031215613d74575f80fd5b815161311481612fee56fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a26469706673582212209a1c026626524dd4419b6795fd817a860c25d29783cf84f8f0a4125cc4f9be6e64736f6c63430008140033", - "deployedBytecode": "0x6080604052600436106101db575f3560e01c806383f24403116100fd578063ccaa2d1111610092578063ee25560b11610062578063ee25560b146105a9578063f5efcd79146105d4578063f811bff7146105f3578063fb57083414610612575f80fd5b8063ccaa2d111461053b578063cd5865791461055a578063d02103ca1461056d578063dbc1697614610595575f80fd5b8063bab161bf116100cd578063bab161bf146104b9578063be5831c7146104da578063c00f14ab146104fd578063cc4616321461051c575f80fd5b806383f244031461043d5780638ed7e3f21461045c578063aaa13cc21461047b578063b8b284d01461049a575f80fd5b80633cbc795b116101735780637843298b116101435780637843298b146103c257806379e2cf97146103e157806381b1c174146103f557806383c43a5514610429575f80fd5b80633cbc795b146103385780633e197043146103705780634b2f336d1461038f5780635ca1e165146103ae575f80fd5b806327aef4e8116101ae57806327aef4e81461026d5780632dfdf0b51461028e578063318aee3d146102b15780633c351e1014610319575f80fd5b806315064c96146101df5780632072f6c51461020d57806322e95f2c14610223578063240ff3781461025a575b5f80fd5b3480156101ea575f80fd5b506068546101f89060ff1681565b60405190151581526020015b60405180910390f35b348015610218575f80fd5b50610221610631565b005b34801561022e575f80fd5b5061024261023d366004612fb9565b610666565b6040516001600160a01b039091168152602001610204565b610221610268366004613040565b6106d0565b348015610278575f80fd5b50610281610759565b6040516102049190613102565b348015610299575f80fd5b506102a360535481565b604051908152602001610204565b3480156102bc575f80fd5b506102f56102cb36600461311b565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201610204565b348015610324575f80fd5b50606d54610242906001600160a01b031681565b348015610343575f80fd5b50606d5461035b90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610204565b34801561037b575f80fd5b506102a361038a366004613144565b6107e5565b34801561039a575f80fd5b50606f54610242906001600160a01b031681565b3480156103b9575f80fd5b506102a361088e565b3480156103cd575f80fd5b506102426103dc3660046131be565b61096a565b3480156103ec575f80fd5b50610221610993565b348015610400575f80fd5b5061024261040f366004613204565b606a6020525f90815260409020546001600160a01b031681565b348015610434575f80fd5b506102816109b4565b348015610448575f80fd5b506102a361045736600461322c565b6109d3565b348015610467575f80fd5b50606c54610242906001600160a01b031681565b348015610486575f80fd5b5061024261049536600461332d565b610aa8565b3480156104a5575f80fd5b506102216104b43660046133c3565b610be7565b3480156104c4575f80fd5b5060685461035b90610100900463ffffffff1681565b3480156104e5575f80fd5b5060685461035b90600160c81b900463ffffffff1681565b348015610508575f80fd5b5061028161051736600461311b565b610cc2565b348015610527575f80fd5b506101f8610536366004613441565b610d07565b348015610546575f80fd5b50610221610555366004613472565b610d8f565b610221610568366004613556565b6112c0565b348015610578575f80fd5b50606854610242906501000000000090046001600160a01b031681565b3480156105a0575f80fd5b5061022161172c565b3480156105b4575f80fd5b506102a36105c3366004613204565b60696020525f908152604090205481565b3480156105df575f80fd5b506102216105ee366004613472565b61175f565b3480156105fe575f80fd5b5061022161060d3660046135e6565b611a25565b34801561061d575f80fd5b506101f861062c366004613689565b611d40565b606c546001600160a01b0316331461065c57604051631736745960e31b815260040160405180910390fd5b610664611d57565b565b6040805160e084901b6001600160e01b031916602080830191909152606084901b6bffffffffffffffffffffffff1916602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b60685460ff16156106f457604051630bc011ff60e21b815260040160405180910390fd5b341580159061070d5750606f546001600160a01b031615155b15610744576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610752858534868686611db2565b5050505050565b606e8054610766906136ce565b80601f0160208091040260200160405190810160405280929190818152602001828054610792906136ce565b80156107dd5780601f106107b4576101008083540402835291602001916107dd565b820191905f5260205f20905b8154815290600101906020018083116107c057829003601f168201915b505050505081565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201526001600160e01b031960e088811b821660218401526bffffffffffffffffffffffff19606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b6053545f90819081805b6020811015610961578083901c6001166001036108f557603381602081106108c2576108c2613706565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610922565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806109599061372e565b915050610898565b50919392505050565b5f61098b848461097985611e7c565b61098286611f66565b61049587612047565b949350505050565b605354606854600160c81b900463ffffffff16101561066457610664612114565b60405180611ba00160405280611b668152602001613d80611b66913981565b5f83815b6020811015610a9f57600163ffffffff8516821c81169003610a4257848160208110610a0557610a05613706565b602002013582604051602001610a25929190918252602082015260400190565b604051602081830303815290604052805190602001209150610a8d565b81858260208110610a5557610a55613706565b6020020135604051602001610a74929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610a978161372e565b9150506109d7565b50949350505050565b6040516001600160e01b031960e087901b1660208201526bffffffffffffffffffffffff19606086901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180611ba00160405280611b668152602001613d80611b669139898989604051602001610b3093929190613746565b60408051601f1981840301815290829052610b4e929160200161377e565b60405160208183030381529060405280519060200120604051602001610bc394939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff1615610c0b57604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b0316610c4d576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f54604051632770a7eb60e21b8152336004820152602481018690526001600160a01b0390911690639dc29fac906044015f604051808303815f87803b158015610c96575f80fd5b505af1158015610ca8573d5f803e3d5ffd5b50505050610cba868686868686611db2565b505050505050565b6060610ccd82611e7c565b610cd683611f66565b610cdf84612047565b604051602001610cf193929190613746565b6040516020818303038152906040529050919050565b6068545f908190610100900463ffffffff16158015610d2c575063ffffffff83166001145b15610d3e575063ffffffff8316610d66565b610d5364010000000063ffffffff85166137ac565b610d639063ffffffff86166137c3565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff1615610db357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614610de3576040516302caf51760e11b815260040160405180910390fd5b610e168c8c8c8c8c610e115f8e8e8e8e8e8e8e604051610e049291906137d6565b60405180910390206107e5565b6121c2565b6001600160a01b038616610f6057606f546001600160a01b0316610efa575f6001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015610e6c576020820181803683370190505b50604051610e7a91906137e5565b5f6040518083038185875af1925050503d805f8114610eb4576040519150601f19603f3d011682016040523d82523d5f602084013e610eb9565b606091505b5050905080610ef4576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611256565b606f546040516340c10f1960e01b81526001600160a01b03868116600483015260248201869052909116906340c10f19906044015f604051808303815f87803b158015610f45575f80fd5b505af1158015610f57573d5f803e3d5ffd5b50505050611256565b606d546001600160a01b038781169116148015610f8e5750606d5463ffffffff888116600160a01b90920416145b15610fa5575f6001600160a01b0385168482610e42565b60685463ffffffff610100909104811690881603610fd657610fd16001600160a01b0387168585612354565b611256565b6040516001600160e01b031960e089901b1660208201526bffffffffffffffffffffffff19606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b0316806111f5575f6110808386868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506123d592505050565b6040516340c10f1960e01b81526001600160a01b03898116600483015260248201899052919250908216906340c10f19906044015f604051808303815f87803b1580156110cb575f80fd5b505af11580156110dd573d5f803e3d5ffd5b5050505080606a5f8581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a8388886040516111e7959493929190613828565b60405180910390a150611253565b6040516340c10f1960e01b81526001600160a01b038781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801561123c575f80fd5b505af115801561124e573d5f803e3d5ffd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156112e457604051630bc011ff60e21b815260040160405180910390fd5b6112ec612468565b60685463ffffffff61010090910481169088160361131d576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b03881661141957883414611369576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff16945090611396906136ce565b80601f01602080910402602001604051908101604052809291908181526020018280546113c2906136ce565b801561140d5780601f106113e45761010080835404028352916020019161140d565b820191905f5260205f20905b8154815290600101906020018083116113f057829003601f168201915b505050505091506116a3565b3415611451576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546001600160a01b03908116908916036114c757604051632770a7eb60e21b8152336004820152602481018a90526001600160a01b03891690639dc29fac906044015f604051808303815f87803b1580156114ac575f80fd5b505af11580156114be573d5f803e3d5ffd5b505050506116a3565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901561157957604051632770a7eb60e21b8152336004820152602481018b90526001600160a01b038a1690639dc29fac906044015f604051808303815f87803b158015611551575f80fd5b505af1158015611563573d5f803e3d5ffd5b5050505080602001519450805f01519350611696565b851561158b5761158b898b89896124c1565b6040516370a0823160e01b81523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa1580156115cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f39190613860565b905061160a6001600160a01b038b1633308e612860565b6040516370a0823160e01b81523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa15801561164e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116729190613860565b905061167e8282613877565b6068548c9850610100900463ffffffff169650935050505b61169f89610cc2565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e86886053546040516116e298979695949392919061388a565b60405180910390a16117086117035f85878f8f8789805190602001206107e5565b6128b1565b861561171657611716612114565b5050505061172360018055565b50505050505050565b606c546001600160a01b0316331461175757604051631736745960e31b815260040160405180910390fd5b6106646129b2565b60685460ff161561178357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146117b3576040516302caf51760e11b815260040160405180910390fd5b6117d58c8c8c8c8c610e1160018e8e8e8e8e8e8e604051610e049291906137d6565b606f545f906001600160a01b031661188857846001600160a01b031684888a868660405160240161180994939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161183e91906137e5565b5f6040518083038185875af1925050503d805f8114611878576040519150601f19603f3d011682016040523d82523d5f602084013e61187d565b606091505b505080915050611983565b606f546040516340c10f1960e01b81526001600160a01b03878116600483015260248201879052909116906340c10f19906044015f604051808303815f87803b1580156118d3575f80fd5b505af11580156118e5573d5f803e3d5ffd5b50505050846001600160a01b03168789858560405160240161190a94939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161193f91906137e5565b5f604051808303815f865af19150503d805f8114611978576040519150601f19603f3d011682016040523d82523d5f602084013e61197d565b606091505b50909150505b806119ba576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f54610100900460ff1615808015611a4357505f54600160ff909116105b80611a5c5750303b158015611a5c57505f5460ff166001145b611ad35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805460ff191660011790558015611af4575f805461ff0019166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8a16027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038781169190910291909117909155606c805473ffffffffffffffffffffffffffffffffffffffff19168583161790558616611bcf5763ffffffff851615611bca576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ceb565b606d805463ffffffff8716600160a01b027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b03891617179055606e611c1e8382613970565b50611cbd5f801b6012604051602001611ca991906060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff91909116604082015260e00190565b6040516020818303038152906040526123d5565b606f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790555b611cf3612a22565b8015611723575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b5f81611d4d8686866109d3565b1495945050505050565b60685460ff1615611d7b57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff610100909104811690871603611de3576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051611e3799989796959493929190613a2c565b60405180910390a1611e6e6117036001606860019054906101000a900463ffffffff16338a8a8a8989604051610e049291906137d6565b8215610cba57610cba612114565b60408051600481526024810182526020810180516001600160e01b03167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611edb91906137e5565b5f60405180830381855afa9150503d805f8114611f13576040519150601f19603f3d011682016040523d82523d5f602084013e611f18565b606091505b509150915081611f5d576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525061098b565b61098b81612a94565b60408051600481526024810182526020810180516001600160e01b03167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611fc591906137e5565b5f60405180830381855afa9150503d805f8114611ffd576040519150601f19603f3d011682016040523d82523d5f602084013e612002565b606091505b509150915081611f5d576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525061098b565b60408051600481526024810182526020810180516001600160e01b03167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b038616916120a591906137e5565b5f60405180830381855afa9150503d805f81146120dd576040519150601f19603f3d011682016040523d82523d5f602084013e6120e2565b606091505b50915091508180156120f5575080516020145b61210057601261098b565b8080602001905181019061098b9190613a97565b6053546068805463ffffffff909216600160c81b027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d61217561088e565b6040518263ffffffff1660e01b815260040161219391815260200190565b5f604051808303815f87803b1580156121aa575f80fd5b505af11580156121bc573d5f803e3d5ffd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af1158015612253573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122779190613860565b9050805f036122b1576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80680100000000000000008716156122f5578691506122d3848a8489611d40565b6122f0576040516338105f3b60e21b815260040160405180910390fd5b61233f565b602087901c612305816001613ab2565b9150879250612320612318868c866109d3565b8a8389611d40565b61233d576040516338105f3b60e21b815260040160405180910390fd5b505b6123498282612c64565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526123d09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612d24565b505050565b5f8060405180611ba00160405280611b668152602001613d80611b6691398360405160200161240592919061377e565b6040516020818303038152906040529050838151602083015ff591506001600160a01b038216612461576040517fbefb092000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5092915050565b6002600154036124ba5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611aca565b6002600155565b5f6124cf6004828486613acf565b6124d891613af6565b90507f2afa5331000000000000000000000000000000000000000000000000000000006001600160e01b03198216016126b2575f80808080808061251f896004818d613acf565b81019061252c9190613b26565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161461256c5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03861630146125955760405163750643af60e01b815260040160405180910390fd5b8a85146125ce576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b03167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169161266591906137e5565b5f604051808303815f865af19150503d805f811461269e576040519150601f19603f3d011682016040523d82523d5f602084013e6126a3565b606091505b50505050505050505050610752565b6001600160e01b031981166323f2ebc360e21b146126fc576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806127118a6004818e613acf565b81019061271e9190613b75565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146127605760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146127895760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169161281091906137e5565b5f604051808303815f865af19150503d805f8114612849576040519150601f19603f3d011682016040523d82523d5f602084013e61284e565b606091505b50505050505050505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526121bc9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612399565b8060016128c060206002613cd3565b6128ca9190613877565b60535410612904576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f81546129139061372e565b918290555090505f5b60208110156129a3578082901c60011660010361294f57826033826020811061294757612947613706565b015550505050565b6033816020811061296257612962613706565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061299b9061372e565b91505061291c565b506123d0613cde565b60018055565b60685460ff166129ee576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f54610100900460ff16612a8c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b610664612e08565b60606040825110612ab357818060200190518101906106ca9190613cf2565b8151602003612c26575f5b602081108015612b055750828181518110612adb57612adb613706565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15612b1c5780612b148161372e565b915050612abe565b805f03612b5e57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115612b7857612b78613268565b6040519080825280601f01601f191660200182016040528015612ba2576020820181803683370190505b5090505f5b82811015612c1e57848181518110612bc157612bc1613706565b602001015160f81c60f81b828281518110612bde57612bde613706565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080612c168161372e565b915050612ba7565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b6068545f90610100900463ffffffff16158015612c87575063ffffffff82166001145b15612c99575063ffffffff8216612cc1565b612cae64010000000063ffffffff84166137ac565b612cbe9063ffffffff85166137c3565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003611723576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612d78826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e729092919063ffffffff16565b8051909150156123d05780806020019051810190612d969190613d64565b6123d05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611aca565b5f54610100900460ff166129ac5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b606061098b84845f85855f80866001600160a01b03168587604051612e9791906137e5565b5f6040518083038185875af1925050503d805f8114612ed1576040519150601f19603f3d011682016040523d82523d5f602084013e612ed6565b606091505b5091509150612ee787838387612ef2565b979650505050505050565b60608315612f605782515f03612f59576001600160a01b0385163b612f595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611aca565b508161098b565b61098b8383815115612f755781518083602001fd5b8060405162461bcd60e51b8152600401611aca9190613102565b803563ffffffff81168114612c5f575f80fd5b6001600160a01b0381168114612fb6575f80fd5b50565b5f8060408385031215612fca575f80fd5b612fd383612f8f565b91506020830135612fe381612fa2565b809150509250929050565b8015158114612fb6575f80fd5b5f8083601f84011261300b575f80fd5b50813567ffffffffffffffff811115613022575f80fd5b602083019150836020828501011115613039575f80fd5b9250929050565b5f805f805f60808688031215613054575f80fd5b61305d86612f8f565b9450602086013561306d81612fa2565b9350604086013561307d81612fee565b9250606086013567ffffffffffffffff811115613098575f80fd5b6130a488828901612ffb565b969995985093965092949392505050565b5f5b838110156130cf5781810151838201526020016130b7565b50505f910152565b5f81518084526130ee8160208601602086016130b5565b601f01601f19169290920160200192915050565b602081525f61311460208301846130d7565b9392505050565b5f6020828403121561312b575f80fd5b813561311481612fa2565b60ff81168114612fb6575f80fd5b5f805f805f805f60e0888a03121561315a575f80fd5b873561316581613136565b965061317360208901612f8f565b9550604088013561318381612fa2565b945061319160608901612f8f565b935060808801356131a181612fa2565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156131d0575f80fd5b6131d984612f8f565b925060208401356131e981612fa2565b915060408401356131f981612fa2565b809150509250925092565b5f60208284031215613214575f80fd5b5035919050565b8061040081018310156106ca575f80fd5b5f805f610440848603121561323f575f80fd5b83359250613250856020860161321b565b915061325f6104208501612f8f565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156132a5576132a5613268565b604052919050565b5f67ffffffffffffffff8211156132c6576132c6613268565b50601f01601f191660200190565b5f6132e66132e1846132ad565b61327c565b90508281528383830111156132f9575f80fd5b828260208301375f602084830101529392505050565b5f82601f83011261331e575f80fd5b613114838335602085016132d4565b5f805f805f60a08688031215613341575f80fd5b61334a86612f8f565b9450602086013561335a81612fa2565b9350604086013567ffffffffffffffff80821115613376575f80fd5b61338289838a0161330f565b94506060880135915080821115613397575f80fd5b506133a48882890161330f565b92505060808601356133b581613136565b809150509295509295909350565b5f805f805f8060a087890312156133d8575f80fd5b6133e187612f8f565b955060208701356133f181612fa2565b945060408701359350606087013561340881612fee565b9250608087013567ffffffffffffffff811115613423575f80fd5b61342f89828a01612ffb565b979a9699509497509295939492505050565b5f8060408385031215613452575f80fd5b61345b83612f8f565b915061346960208401612f8f565b90509250929050565b5f805f805f805f805f805f806109208d8f03121561348e575f80fd5b6134988e8e61321b565b9b506134a88e6104008f0161321b565b9a506108008d013599506108208d013598506108408d013597506134cf6108608e01612f8f565b96506134df6108808e0135612fa2565b6108808d013595506134f46108a08e01612f8f565b94506135046108c08e0135612fa2565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111561352d575f80fd5b61353e8e6109008f01358f01612ffb565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121561356c575f80fd5b61357588612f8f565b9650602088013561358581612fa2565b955060408801359450606088013561359c81612fa2565b935060808801356135ac81612fee565b925060a088013567ffffffffffffffff8111156135c7575f80fd5b6135d38a828b01612ffb565b989b979a50959850939692959293505050565b5f805f805f8060c087890312156135fb575f80fd5b61360487612f8f565b9550602087013561361481612fa2565b945061362260408801612f8f565b9350606087013561363281612fa2565b9250608087013561364281612fa2565b915060a087013567ffffffffffffffff81111561365d575f80fd5b8701601f8101891361366d575f80fd5b61367c898235602084016132d4565b9150509295509295509295565b5f805f80610460858703121561369d575f80fd5b843593506136ae866020870161321b565b92506136bd6104208601612f8f565b939692955092936104400135925050565b600181811c908216806136e257607f821691505b60208210810361370057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f6001820161373f5761373f61371a565b5060010190565b606081525f61375860608301866130d7565b828103602084015261376a81866130d7565b91505060ff83166040830152949350505050565b5f835161378f8184602088016130b5565b8351908301906137a38183602088016130b5565b01949350505050565b80820281158282048414176106ca576106ca61371a565b808201808211156106ca576106ca61371a565b818382375f9101908152919050565b5f82516137f68184602087016130b5565b9190910192915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b63ffffffff861681525f6001600160a01b03808716602084015280861660408401525060806060830152612ee7608083018486613800565b5f60208284031215613870575f80fd5b5051919050565b818103818111156106ca576106ca61371a565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c08501526138da828501876130d7565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f613921606083018486613800565b9695505050505050565b601f8211156123d0575f81815260208120601f850160051c810160208610156139515750805b601f850160051c820191505b81811015610cba5782815560010161395d565b815167ffffffffffffffff81111561398a5761398a613268565b61399e8161399884546136ce565b8461392b565b602080601f8311600181146139d1575f84156139ba5750858301515b5f19600386901b1c1916600185901b178555610cba565b5f85815260208120601f198616915b828110156139ff578886015182559484019460019091019084016139e0565b5085821015613a1c57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c0850152613a7d8285018789613800565b925080851660e085015250509a9950505050505050505050565b5f60208284031215613aa7575f80fd5b815161311481613136565b63ffffffff8181168382160190808211156124615761246161371a565b5f8085851115613add575f80fd5b83861115613ae9575f80fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015613b1e5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215613b3c575f80fd5b8735613b4781612fa2565b96506020880135613b5781612fa2565b9550604088013594506060880135935060808801356131a181613136565b5f805f805f805f80610100898b031215613b8d575f80fd5b8835613b9881612fa2565b97506020890135613ba881612fa2565b965060408901359550606089013594506080890135613bc681612fee565b935060a0890135613bd681613136565b979a969950949793969295929450505060c08201359160e0013590565b600181815b80851115613c2d57815f1904821115613c1357613c1361371a565b80851615613c2057918102915b93841c9390800290613bf8565b509250929050565b5f82613c43575060016106ca565b81613c4f57505f6106ca565b8160018114613c655760028114613c6f57613c8b565b60019150506106ca565b60ff841115613c8057613c8061371a565b50506001821b6106ca565b5060208310610133831016604e8410600b8410161715613cae575081810a6106ca565b613cb88383613bf3565b805f1904821115613ccb57613ccb61371a565b029392505050565b5f6131148383613c35565b634e487b7160e01b5f52600160045260245ffd5b5f60208284031215613d02575f80fd5b815167ffffffffffffffff811115613d18575f80fd5b8201601f81018413613d28575f80fd5b8051613d366132e1826132ad565b818152856020838501011115613d4a575f80fd5b613d5b8260208301602086016130b5565b95945050505050565b5f60208284031215613d74575f80fd5b815161311481612fee56fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a26469706673582212209a1c026626524dd4419b6795fd817a860c25d29783cf84f8f0a4125cc4f9be6e64736f6c63430008140033", + "bytecode": "0x608060405234801562000010575f80fd5b506200001b62000021565b620000e0565b5f54610100900460ff16156200008d5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161015620000de575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b61591b80620000ee5f395ff3fe6080604052600436106101db575f3560e01c806383f24403116100fd578063ccaa2d1111610092578063ee25560b11610062578063ee25560b146105a9578063f5efcd79146105d4578063f811bff7146105f3578063fb57083414610612575f80fd5b8063ccaa2d111461053b578063cd5865791461055a578063d02103ca1461056d578063dbc1697614610595575f80fd5b8063bab161bf116100cd578063bab161bf146104b9578063be5831c7146104da578063c00f14ab146104fd578063cc4616321461051c575f80fd5b806383f244031461043d5780638ed7e3f21461045c578063aaa13cc21461047b578063b8b284d01461049a575f80fd5b80633cbc795b116101735780637843298b116101435780637843298b146103c257806379e2cf97146103e157806381b1c174146103f557806383c43a5514610429575f80fd5b80633cbc795b146103385780633e197043146103705780634b2f336d1461038f5780635ca1e165146103ae575f80fd5b806327aef4e8116101ae57806327aef4e81461026d5780632dfdf0b51461028e578063318aee3d146102b15780633c351e1014610319575f80fd5b806315064c96146101df5780632072f6c51461020d57806322e95f2c14610223578063240ff3781461025a575b5f80fd5b3480156101ea575f80fd5b506068546101f89060ff1681565b60405190151581526020015b60405180910390f35b348015610218575f80fd5b50610221610631565b005b34801561022e575f80fd5b5061024261023d366004612fb9565b610666565b6040516001600160a01b039091168152602001610204565b610221610268366004613040565b6106d0565b348015610278575f80fd5b50610281610759565b6040516102049190613102565b348015610299575f80fd5b506102a360535481565b604051908152602001610204565b3480156102bc575f80fd5b506102f56102cb36600461311b565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201610204565b348015610324575f80fd5b50606d54610242906001600160a01b031681565b348015610343575f80fd5b50606d5461035b90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610204565b34801561037b575f80fd5b506102a361038a366004613144565b6107e5565b34801561039a575f80fd5b50606f54610242906001600160a01b031681565b3480156103b9575f80fd5b506102a361088e565b3480156103cd575f80fd5b506102426103dc3660046131be565b61096a565b3480156103ec575f80fd5b50610221610993565b348015610400575f80fd5b5061024261040f366004613204565b606a6020525f90815260409020546001600160a01b031681565b348015610434575f80fd5b506102816109b4565b348015610448575f80fd5b506102a361045736600461322c565b6109d3565b348015610467575f80fd5b50606c54610242906001600160a01b031681565b348015610486575f80fd5b5061024261049536600461332d565b610aa8565b3480156104a5575f80fd5b506102216104b43660046133c3565b610be7565b3480156104c4575f80fd5b5060685461035b90610100900463ffffffff1681565b3480156104e5575f80fd5b5060685461035b90600160c81b900463ffffffff1681565b348015610508575f80fd5b5061028161051736600461311b565b610cc2565b348015610527575f80fd5b506101f8610536366004613441565b610d07565b348015610546575f80fd5b50610221610555366004613472565b610d8f565b610221610568366004613556565b6112c0565b348015610578575f80fd5b50606854610242906501000000000090046001600160a01b031681565b3480156105a0575f80fd5b5061022161172c565b3480156105b4575f80fd5b506102a36105c3366004613204565b60696020525f908152604090205481565b3480156105df575f80fd5b506102216105ee366004613472565b61175f565b3480156105fe575f80fd5b5061022161060d3660046135e6565b611a25565b34801561061d575f80fd5b506101f861062c366004613689565b611d40565b606c546001600160a01b0316331461065c57604051631736745960e31b815260040160405180910390fd5b610664611d57565b565b6040805160e084901b6001600160e01b031916602080830191909152606084901b6bffffffffffffffffffffffff1916602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b60685460ff16156106f457604051630bc011ff60e21b815260040160405180910390fd5b341580159061070d5750606f546001600160a01b031615155b15610744576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610752858534868686611db2565b5050505050565b606e8054610766906136ce565b80601f0160208091040260200160405190810160405280929190818152602001828054610792906136ce565b80156107dd5780601f106107b4576101008083540402835291602001916107dd565b820191905f5260205f20905b8154815290600101906020018083116107c057829003601f168201915b505050505081565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201526001600160e01b031960e088811b821660218401526bffffffffffffffffffffffff19606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b6053545f90819081805b6020811015610961578083901c6001166001036108f557603381602081106108c2576108c2613706565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610922565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806109599061372e565b915050610898565b50919392505050565b5f61098b848461097985611e7c565b61098286611f66565b61049587612047565b949350505050565b605354606854600160c81b900463ffffffff16101561066457610664612114565b60405180611ba00160405280611b668152602001613d80611b66913981565b5f83815b6020811015610a9f57600163ffffffff8516821c81169003610a4257848160208110610a0557610a05613706565b602002013582604051602001610a25929190918252602082015260400190565b604051602081830303815290604052805190602001209150610a8d565b81858260208110610a5557610a55613706565b6020020135604051602001610a74929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610a978161372e565b9150506109d7565b50949350505050565b6040516001600160e01b031960e087901b1660208201526bffffffffffffffffffffffff19606086901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180611ba00160405280611b668152602001613d80611b669139898989604051602001610b3093929190613746565b60408051601f1981840301815290829052610b4e929160200161377e565b60405160208183030381529060405280519060200120604051602001610bc394939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff1615610c0b57604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b0316610c4d576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f54604051632770a7eb60e21b8152336004820152602481018690526001600160a01b0390911690639dc29fac906044015f604051808303815f87803b158015610c96575f80fd5b505af1158015610ca8573d5f803e3d5ffd5b50505050610cba868686868686611db2565b505050505050565b6060610ccd82611e7c565b610cd683611f66565b610cdf84612047565b604051602001610cf193929190613746565b6040516020818303038152906040529050919050565b6068545f908190610100900463ffffffff16158015610d2c575063ffffffff83166001145b15610d3e575063ffffffff8316610d66565b610d5364010000000063ffffffff85166137ac565b610d639063ffffffff86166137c3565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff1615610db357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614610de3576040516302caf51760e11b815260040160405180910390fd5b610e168c8c8c8c8c610e115f8e8e8e8e8e8e8e604051610e049291906137d6565b60405180910390206107e5565b6121c2565b6001600160a01b038616610f6057606f546001600160a01b0316610efa575f6001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015610e6c576020820181803683370190505b50604051610e7a91906137e5565b5f6040518083038185875af1925050503d805f8114610eb4576040519150601f19603f3d011682016040523d82523d5f602084013e610eb9565b606091505b5050905080610ef4576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611256565b606f546040516340c10f1960e01b81526001600160a01b03868116600483015260248201869052909116906340c10f19906044015f604051808303815f87803b158015610f45575f80fd5b505af1158015610f57573d5f803e3d5ffd5b50505050611256565b606d546001600160a01b038781169116148015610f8e5750606d5463ffffffff888116600160a01b90920416145b15610fa5575f6001600160a01b0385168482610e42565b60685463ffffffff610100909104811690881603610fd657610fd16001600160a01b0387168585612354565b611256565b6040516001600160e01b031960e089901b1660208201526bffffffffffffffffffffffff19606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b0316806111f5575f6110808386868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506123d592505050565b6040516340c10f1960e01b81526001600160a01b03898116600483015260248201899052919250908216906340c10f19906044015f604051808303815f87803b1580156110cb575f80fd5b505af11580156110dd573d5f803e3d5ffd5b5050505080606a5f8581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a8388886040516111e7959493929190613828565b60405180910390a150611253565b6040516340c10f1960e01b81526001600160a01b038781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801561123c575f80fd5b505af115801561124e573d5f803e3d5ffd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156112e457604051630bc011ff60e21b815260040160405180910390fd5b6112ec612468565b60685463ffffffff61010090910481169088160361131d576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b03881661141957883414611369576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff16945090611396906136ce565b80601f01602080910402602001604051908101604052809291908181526020018280546113c2906136ce565b801561140d5780601f106113e45761010080835404028352916020019161140d565b820191905f5260205f20905b8154815290600101906020018083116113f057829003601f168201915b505050505091506116a3565b3415611451576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546001600160a01b03908116908916036114c757604051632770a7eb60e21b8152336004820152602481018a90526001600160a01b03891690639dc29fac906044015f604051808303815f87803b1580156114ac575f80fd5b505af11580156114be573d5f803e3d5ffd5b505050506116a3565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901561157957604051632770a7eb60e21b8152336004820152602481018b90526001600160a01b038a1690639dc29fac906044015f604051808303815f87803b158015611551575f80fd5b505af1158015611563573d5f803e3d5ffd5b5050505080602001519450805f01519350611696565b851561158b5761158b898b89896124c1565b6040516370a0823160e01b81523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa1580156115cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f39190613860565b905061160a6001600160a01b038b1633308e612860565b6040516370a0823160e01b81523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa15801561164e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116729190613860565b905061167e8282613877565b6068548c9850610100900463ffffffff169650935050505b61169f89610cc2565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e86886053546040516116e298979695949392919061388a565b60405180910390a16117086117035f85878f8f8789805190602001206107e5565b6128b1565b861561171657611716612114565b5050505061172360018055565b50505050505050565b606c546001600160a01b0316331461175757604051631736745960e31b815260040160405180910390fd5b6106646129b2565b60685460ff161561178357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146117b3576040516302caf51760e11b815260040160405180910390fd5b6117d58c8c8c8c8c610e1160018e8e8e8e8e8e8e604051610e049291906137d6565b606f545f906001600160a01b031661188857846001600160a01b031684888a868660405160240161180994939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161183e91906137e5565b5f6040518083038185875af1925050503d805f8114611878576040519150601f19603f3d011682016040523d82523d5f602084013e61187d565b606091505b505080915050611983565b606f546040516340c10f1960e01b81526001600160a01b03878116600483015260248201879052909116906340c10f19906044015f604051808303815f87803b1580156118d3575f80fd5b505af11580156118e5573d5f803e3d5ffd5b50505050846001600160a01b03168789858560405160240161190a94939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161193f91906137e5565b5f604051808303815f865af19150503d805f8114611978576040519150601f19603f3d011682016040523d82523d5f602084013e61197d565b606091505b50909150505b806119ba576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f54610100900460ff1615808015611a4357505f54600160ff909116105b80611a5c5750303b158015611a5c57505f5460ff166001145b611ad35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805460ff191660011790558015611af4575f805461ff0019166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8a16027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038781169190910291909117909155606c805473ffffffffffffffffffffffffffffffffffffffff19168583161790558616611bcf5763ffffffff851615611bca576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ceb565b606d805463ffffffff8716600160a01b027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b03891617179055606e611c1e8382613970565b50611cbd5f801b6012604051602001611ca991906060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff91909116604082015260e00190565b6040516020818303038152906040526123d5565b606f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790555b611cf3612a22565b8015611723575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b5f81611d4d8686866109d3565b1495945050505050565b60685460ff1615611d7b57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff610100909104811690871603611de3576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051611e3799989796959493929190613a2c565b60405180910390a1611e6e6117036001606860019054906101000a900463ffffffff16338a8a8a8989604051610e049291906137d6565b8215610cba57610cba612114565b60408051600481526024810182526020810180516001600160e01b03167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611edb91906137e5565b5f60405180830381855afa9150503d805f8114611f13576040519150601f19603f3d011682016040523d82523d5f602084013e611f18565b606091505b509150915081611f5d576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525061098b565b61098b81612a94565b60408051600481526024810182526020810180516001600160e01b03167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611fc591906137e5565b5f60405180830381855afa9150503d805f8114611ffd576040519150601f19603f3d011682016040523d82523d5f602084013e612002565b606091505b509150915081611f5d576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525061098b565b60408051600481526024810182526020810180516001600160e01b03167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b038616916120a591906137e5565b5f60405180830381855afa9150503d805f81146120dd576040519150601f19603f3d011682016040523d82523d5f602084013e6120e2565b606091505b50915091508180156120f5575080516020145b61210057601261098b565b8080602001905181019061098b9190613a97565b6053546068805463ffffffff909216600160c81b027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d61217561088e565b6040518263ffffffff1660e01b815260040161219391815260200190565b5f604051808303815f87803b1580156121aa575f80fd5b505af11580156121bc573d5f803e3d5ffd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af1158015612253573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122779190613860565b9050805f036122b1576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80680100000000000000008716156122f5578691506122d3848a8489611d40565b6122f0576040516338105f3b60e21b815260040160405180910390fd5b61233f565b602087901c612305816001613ab2565b9150879250612320612318868c866109d3565b8a8389611d40565b61233d576040516338105f3b60e21b815260040160405180910390fd5b505b6123498282612c64565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526123d09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612d24565b505050565b5f8060405180611ba00160405280611b668152602001613d80611b6691398360405160200161240592919061377e565b6040516020818303038152906040529050838151602083015ff591506001600160a01b038216612461576040517fbefb092000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5092915050565b6002600154036124ba5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611aca565b6002600155565b5f6124cf6004828486613acf565b6124d891613af6565b90507f2afa5331000000000000000000000000000000000000000000000000000000006001600160e01b03198216016126b2575f80808080808061251f896004818d613acf565b81019061252c9190613b26565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161461256c5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03861630146125955760405163750643af60e01b815260040160405180910390fd5b8a85146125ce576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b03167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169161266591906137e5565b5f604051808303815f865af19150503d805f811461269e576040519150601f19603f3d011682016040523d82523d5f602084013e6126a3565b606091505b50505050505050505050610752565b6001600160e01b031981166323f2ebc360e21b146126fc576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806127118a6004818e613acf565b81019061271e9190613b75565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146127605760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146127895760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169161281091906137e5565b5f604051808303815f865af19150503d805f8114612849576040519150601f19603f3d011682016040523d82523d5f602084013e61284e565b606091505b50505050505050505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526121bc9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612399565b8060016128c060206002613cd3565b6128ca9190613877565b60535410612904576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f81546129139061372e565b918290555090505f5b60208110156129a3578082901c60011660010361294f57826033826020811061294757612947613706565b015550505050565b6033816020811061296257612962613706565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061299b9061372e565b91505061291c565b506123d0613cde565b60018055565b60685460ff166129ee576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f54610100900460ff16612a8c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b610664612e08565b60606040825110612ab357818060200190518101906106ca9190613cf2565b8151602003612c26575f5b602081108015612b055750828181518110612adb57612adb613706565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15612b1c5780612b148161372e565b915050612abe565b805f03612b5e57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115612b7857612b78613268565b6040519080825280601f01601f191660200182016040528015612ba2576020820181803683370190505b5090505f5b82811015612c1e57848181518110612bc157612bc1613706565b602001015160f81c60f81b828281518110612bde57612bde613706565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080612c168161372e565b915050612ba7565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b6068545f90610100900463ffffffff16158015612c87575063ffffffff82166001145b15612c99575063ffffffff8216612cc1565b612cae64010000000063ffffffff84166137ac565b612cbe9063ffffffff85166137c3565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003611723576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612d78826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e729092919063ffffffff16565b8051909150156123d05780806020019051810190612d969190613d64565b6123d05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611aca565b5f54610100900460ff166129ac5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b606061098b84845f85855f80866001600160a01b03168587604051612e9791906137e5565b5f6040518083038185875af1925050503d805f8114612ed1576040519150601f19603f3d011682016040523d82523d5f602084013e612ed6565b606091505b5091509150612ee787838387612ef2565b979650505050505050565b60608315612f605782515f03612f59576001600160a01b0385163b612f595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611aca565b508161098b565b61098b8383815115612f755781518083602001fd5b8060405162461bcd60e51b8152600401611aca9190613102565b803563ffffffff81168114612c5f575f80fd5b6001600160a01b0381168114612fb6575f80fd5b50565b5f8060408385031215612fca575f80fd5b612fd383612f8f565b91506020830135612fe381612fa2565b809150509250929050565b8015158114612fb6575f80fd5b5f8083601f84011261300b575f80fd5b50813567ffffffffffffffff811115613022575f80fd5b602083019150836020828501011115613039575f80fd5b9250929050565b5f805f805f60808688031215613054575f80fd5b61305d86612f8f565b9450602086013561306d81612fa2565b9350604086013561307d81612fee565b9250606086013567ffffffffffffffff811115613098575f80fd5b6130a488828901612ffb565b969995985093965092949392505050565b5f5b838110156130cf5781810151838201526020016130b7565b50505f910152565b5f81518084526130ee8160208601602086016130b5565b601f01601f19169290920160200192915050565b602081525f61311460208301846130d7565b9392505050565b5f6020828403121561312b575f80fd5b813561311481612fa2565b60ff81168114612fb6575f80fd5b5f805f805f805f60e0888a03121561315a575f80fd5b873561316581613136565b965061317360208901612f8f565b9550604088013561318381612fa2565b945061319160608901612f8f565b935060808801356131a181612fa2565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156131d0575f80fd5b6131d984612f8f565b925060208401356131e981612fa2565b915060408401356131f981612fa2565b809150509250925092565b5f60208284031215613214575f80fd5b5035919050565b8061040081018310156106ca575f80fd5b5f805f610440848603121561323f575f80fd5b83359250613250856020860161321b565b915061325f6104208501612f8f565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156132a5576132a5613268565b604052919050565b5f67ffffffffffffffff8211156132c6576132c6613268565b50601f01601f191660200190565b5f6132e66132e1846132ad565b61327c565b90508281528383830111156132f9575f80fd5b828260208301375f602084830101529392505050565b5f82601f83011261331e575f80fd5b613114838335602085016132d4565b5f805f805f60a08688031215613341575f80fd5b61334a86612f8f565b9450602086013561335a81612fa2565b9350604086013567ffffffffffffffff80821115613376575f80fd5b61338289838a0161330f565b94506060880135915080821115613397575f80fd5b506133a48882890161330f565b92505060808601356133b581613136565b809150509295509295909350565b5f805f805f8060a087890312156133d8575f80fd5b6133e187612f8f565b955060208701356133f181612fa2565b945060408701359350606087013561340881612fee565b9250608087013567ffffffffffffffff811115613423575f80fd5b61342f89828a01612ffb565b979a9699509497509295939492505050565b5f8060408385031215613452575f80fd5b61345b83612f8f565b915061346960208401612f8f565b90509250929050565b5f805f805f805f805f805f806109208d8f03121561348e575f80fd5b6134988e8e61321b565b9b506134a88e6104008f0161321b565b9a506108008d013599506108208d013598506108408d013597506134cf6108608e01612f8f565b96506134df6108808e0135612fa2565b6108808d013595506134f46108a08e01612f8f565b94506135046108c08e0135612fa2565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111561352d575f80fd5b61353e8e6109008f01358f01612ffb565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121561356c575f80fd5b61357588612f8f565b9650602088013561358581612fa2565b955060408801359450606088013561359c81612fa2565b935060808801356135ac81612fee565b925060a088013567ffffffffffffffff8111156135c7575f80fd5b6135d38a828b01612ffb565b989b979a50959850939692959293505050565b5f805f805f8060c087890312156135fb575f80fd5b61360487612f8f565b9550602087013561361481612fa2565b945061362260408801612f8f565b9350606087013561363281612fa2565b9250608087013561364281612fa2565b915060a087013567ffffffffffffffff81111561365d575f80fd5b8701601f8101891361366d575f80fd5b61367c898235602084016132d4565b9150509295509295509295565b5f805f80610460858703121561369d575f80fd5b843593506136ae866020870161321b565b92506136bd6104208601612f8f565b939692955092936104400135925050565b600181811c908216806136e257607f821691505b60208210810361370057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f6001820161373f5761373f61371a565b5060010190565b606081525f61375860608301866130d7565b828103602084015261376a81866130d7565b91505060ff83166040830152949350505050565b5f835161378f8184602088016130b5565b8351908301906137a38183602088016130b5565b01949350505050565b80820281158282048414176106ca576106ca61371a565b808201808211156106ca576106ca61371a565b818382375f9101908152919050565b5f82516137f68184602087016130b5565b9190910192915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b63ffffffff861681525f6001600160a01b03808716602084015280861660408401525060806060830152612ee7608083018486613800565b5f60208284031215613870575f80fd5b5051919050565b818103818111156106ca576106ca61371a565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c08501526138da828501876130d7565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f613921606083018486613800565b9695505050505050565b601f8211156123d0575f81815260208120601f850160051c810160208610156139515750805b601f850160051c820191505b81811015610cba5782815560010161395d565b815167ffffffffffffffff81111561398a5761398a613268565b61399e8161399884546136ce565b8461392b565b602080601f8311600181146139d1575f84156139ba5750858301515b5f19600386901b1c1916600185901b178555610cba565b5f85815260208120601f198616915b828110156139ff578886015182559484019460019091019084016139e0565b5085821015613a1c57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c0850152613a7d8285018789613800565b925080851660e085015250509a9950505050505050505050565b5f60208284031215613aa7575f80fd5b815161311481613136565b63ffffffff8181168382160190808211156124615761246161371a565b5f8085851115613add575f80fd5b83861115613ae9575f80fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015613b1e5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215613b3c575f80fd5b8735613b4781612fa2565b96506020880135613b5781612fa2565b9550604088013594506060880135935060808801356131a181613136565b5f805f805f805f80610100898b031215613b8d575f80fd5b8835613b9881612fa2565b97506020890135613ba881612fa2565b965060408901359550606089013594506080890135613bc681612fee565b935060a0890135613bd681613136565b979a969950949793969295929450505060c08201359160e0013590565b600181815b80851115613c2d57815f1904821115613c1357613c1361371a565b80851615613c2057918102915b93841c9390800290613bf8565b509250929050565b5f82613c43575060016106ca565b81613c4f57505f6106ca565b8160018114613c655760028114613c6f57613c8b565b60019150506106ca565b60ff841115613c8057613c8061371a565b50506001821b6106ca565b5060208310610133831016604e8410600b8410161715613cae575081810a6106ca565b613cb88383613bf3565b805f1904821115613ccb57613ccb61371a565b029392505050565b5f6131148383613c35565b634e487b7160e01b5f52600160045260245ffd5b5f60208284031215613d02575f80fd5b815167ffffffffffffffff811115613d18575f80fd5b8201601f81018413613d28575f80fd5b8051613d366132e1826132ad565b818152856020838501011115613d4a575f80fd5b613d5b8260208301602086016130b5565b95945050505050565b5f60208284031215613d74575f80fd5b815161311481612fee56fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a264697066735822122092f4705bd744f1f460410f55ce346df87f7754f31079a73babd92c81416ac66a64736f6c63430008140033", + "deployedBytecode": "0x6080604052600436106101db575f3560e01c806383f24403116100fd578063ccaa2d1111610092578063ee25560b11610062578063ee25560b146105a9578063f5efcd79146105d4578063f811bff7146105f3578063fb57083414610612575f80fd5b8063ccaa2d111461053b578063cd5865791461055a578063d02103ca1461056d578063dbc1697614610595575f80fd5b8063bab161bf116100cd578063bab161bf146104b9578063be5831c7146104da578063c00f14ab146104fd578063cc4616321461051c575f80fd5b806383f244031461043d5780638ed7e3f21461045c578063aaa13cc21461047b578063b8b284d01461049a575f80fd5b80633cbc795b116101735780637843298b116101435780637843298b146103c257806379e2cf97146103e157806381b1c174146103f557806383c43a5514610429575f80fd5b80633cbc795b146103385780633e197043146103705780634b2f336d1461038f5780635ca1e165146103ae575f80fd5b806327aef4e8116101ae57806327aef4e81461026d5780632dfdf0b51461028e578063318aee3d146102b15780633c351e1014610319575f80fd5b806315064c96146101df5780632072f6c51461020d57806322e95f2c14610223578063240ff3781461025a575b5f80fd5b3480156101ea575f80fd5b506068546101f89060ff1681565b60405190151581526020015b60405180910390f35b348015610218575f80fd5b50610221610631565b005b34801561022e575f80fd5b5061024261023d366004612fb9565b610666565b6040516001600160a01b039091168152602001610204565b610221610268366004613040565b6106d0565b348015610278575f80fd5b50610281610759565b6040516102049190613102565b348015610299575f80fd5b506102a360535481565b604051908152602001610204565b3480156102bc575f80fd5b506102f56102cb36600461311b565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201610204565b348015610324575f80fd5b50606d54610242906001600160a01b031681565b348015610343575f80fd5b50606d5461035b90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610204565b34801561037b575f80fd5b506102a361038a366004613144565b6107e5565b34801561039a575f80fd5b50606f54610242906001600160a01b031681565b3480156103b9575f80fd5b506102a361088e565b3480156103cd575f80fd5b506102426103dc3660046131be565b61096a565b3480156103ec575f80fd5b50610221610993565b348015610400575f80fd5b5061024261040f366004613204565b606a6020525f90815260409020546001600160a01b031681565b348015610434575f80fd5b506102816109b4565b348015610448575f80fd5b506102a361045736600461322c565b6109d3565b348015610467575f80fd5b50606c54610242906001600160a01b031681565b348015610486575f80fd5b5061024261049536600461332d565b610aa8565b3480156104a5575f80fd5b506102216104b43660046133c3565b610be7565b3480156104c4575f80fd5b5060685461035b90610100900463ffffffff1681565b3480156104e5575f80fd5b5060685461035b90600160c81b900463ffffffff1681565b348015610508575f80fd5b5061028161051736600461311b565b610cc2565b348015610527575f80fd5b506101f8610536366004613441565b610d07565b348015610546575f80fd5b50610221610555366004613472565b610d8f565b610221610568366004613556565b6112c0565b348015610578575f80fd5b50606854610242906501000000000090046001600160a01b031681565b3480156105a0575f80fd5b5061022161172c565b3480156105b4575f80fd5b506102a36105c3366004613204565b60696020525f908152604090205481565b3480156105df575f80fd5b506102216105ee366004613472565b61175f565b3480156105fe575f80fd5b5061022161060d3660046135e6565b611a25565b34801561061d575f80fd5b506101f861062c366004613689565b611d40565b606c546001600160a01b0316331461065c57604051631736745960e31b815260040160405180910390fd5b610664611d57565b565b6040805160e084901b6001600160e01b031916602080830191909152606084901b6bffffffffffffffffffffffff1916602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b60685460ff16156106f457604051630bc011ff60e21b815260040160405180910390fd5b341580159061070d5750606f546001600160a01b031615155b15610744576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610752858534868686611db2565b5050505050565b606e8054610766906136ce565b80601f0160208091040260200160405190810160405280929190818152602001828054610792906136ce565b80156107dd5780601f106107b4576101008083540402835291602001916107dd565b820191905f5260205f20905b8154815290600101906020018083116107c057829003601f168201915b505050505081565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201526001600160e01b031960e088811b821660218401526bffffffffffffffffffffffff19606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b6053545f90819081805b6020811015610961578083901c6001166001036108f557603381602081106108c2576108c2613706565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610922565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806109599061372e565b915050610898565b50919392505050565b5f61098b848461097985611e7c565b61098286611f66565b61049587612047565b949350505050565b605354606854600160c81b900463ffffffff16101561066457610664612114565b60405180611ba00160405280611b668152602001613d80611b66913981565b5f83815b6020811015610a9f57600163ffffffff8516821c81169003610a4257848160208110610a0557610a05613706565b602002013582604051602001610a25929190918252602082015260400190565b604051602081830303815290604052805190602001209150610a8d565b81858260208110610a5557610a55613706565b6020020135604051602001610a74929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610a978161372e565b9150506109d7565b50949350505050565b6040516001600160e01b031960e087901b1660208201526bffffffffffffffffffffffff19606086901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180611ba00160405280611b668152602001613d80611b669139898989604051602001610b3093929190613746565b60408051601f1981840301815290829052610b4e929160200161377e565b60405160208183030381529060405280519060200120604051602001610bc394939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff1615610c0b57604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b0316610c4d576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f54604051632770a7eb60e21b8152336004820152602481018690526001600160a01b0390911690639dc29fac906044015f604051808303815f87803b158015610c96575f80fd5b505af1158015610ca8573d5f803e3d5ffd5b50505050610cba868686868686611db2565b505050505050565b6060610ccd82611e7c565b610cd683611f66565b610cdf84612047565b604051602001610cf193929190613746565b6040516020818303038152906040529050919050565b6068545f908190610100900463ffffffff16158015610d2c575063ffffffff83166001145b15610d3e575063ffffffff8316610d66565b610d5364010000000063ffffffff85166137ac565b610d639063ffffffff86166137c3565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff1615610db357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614610de3576040516302caf51760e11b815260040160405180910390fd5b610e168c8c8c8c8c610e115f8e8e8e8e8e8e8e604051610e049291906137d6565b60405180910390206107e5565b6121c2565b6001600160a01b038616610f6057606f546001600160a01b0316610efa575f6001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015610e6c576020820181803683370190505b50604051610e7a91906137e5565b5f6040518083038185875af1925050503d805f8114610eb4576040519150601f19603f3d011682016040523d82523d5f602084013e610eb9565b606091505b5050905080610ef4576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611256565b606f546040516340c10f1960e01b81526001600160a01b03868116600483015260248201869052909116906340c10f19906044015f604051808303815f87803b158015610f45575f80fd5b505af1158015610f57573d5f803e3d5ffd5b50505050611256565b606d546001600160a01b038781169116148015610f8e5750606d5463ffffffff888116600160a01b90920416145b15610fa5575f6001600160a01b0385168482610e42565b60685463ffffffff610100909104811690881603610fd657610fd16001600160a01b0387168585612354565b611256565b6040516001600160e01b031960e089901b1660208201526bffffffffffffffffffffffff19606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b0316806111f5575f6110808386868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506123d592505050565b6040516340c10f1960e01b81526001600160a01b03898116600483015260248201899052919250908216906340c10f19906044015f604051808303815f87803b1580156110cb575f80fd5b505af11580156110dd573d5f803e3d5ffd5b5050505080606a5f8581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a8388886040516111e7959493929190613828565b60405180910390a150611253565b6040516340c10f1960e01b81526001600160a01b038781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801561123c575f80fd5b505af115801561124e573d5f803e3d5ffd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156112e457604051630bc011ff60e21b815260040160405180910390fd5b6112ec612468565b60685463ffffffff61010090910481169088160361131d576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b03881661141957883414611369576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff16945090611396906136ce565b80601f01602080910402602001604051908101604052809291908181526020018280546113c2906136ce565b801561140d5780601f106113e45761010080835404028352916020019161140d565b820191905f5260205f20905b8154815290600101906020018083116113f057829003601f168201915b505050505091506116a3565b3415611451576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546001600160a01b03908116908916036114c757604051632770a7eb60e21b8152336004820152602481018a90526001600160a01b03891690639dc29fac906044015f604051808303815f87803b1580156114ac575f80fd5b505af11580156114be573d5f803e3d5ffd5b505050506116a3565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901561157957604051632770a7eb60e21b8152336004820152602481018b90526001600160a01b038a1690639dc29fac906044015f604051808303815f87803b158015611551575f80fd5b505af1158015611563573d5f803e3d5ffd5b5050505080602001519450805f01519350611696565b851561158b5761158b898b89896124c1565b6040516370a0823160e01b81523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa1580156115cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f39190613860565b905061160a6001600160a01b038b1633308e612860565b6040516370a0823160e01b81523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa15801561164e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116729190613860565b905061167e8282613877565b6068548c9850610100900463ffffffff169650935050505b61169f89610cc2565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e86886053546040516116e298979695949392919061388a565b60405180910390a16117086117035f85878f8f8789805190602001206107e5565b6128b1565b861561171657611716612114565b5050505061172360018055565b50505050505050565b606c546001600160a01b0316331461175757604051631736745960e31b815260040160405180910390fd5b6106646129b2565b60685460ff161561178357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146117b3576040516302caf51760e11b815260040160405180910390fd5b6117d58c8c8c8c8c610e1160018e8e8e8e8e8e8e604051610e049291906137d6565b606f545f906001600160a01b031661188857846001600160a01b031684888a868660405160240161180994939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161183e91906137e5565b5f6040518083038185875af1925050503d805f8114611878576040519150601f19603f3d011682016040523d82523d5f602084013e61187d565b606091505b505080915050611983565b606f546040516340c10f1960e01b81526001600160a01b03878116600483015260248201879052909116906340c10f19906044015f604051808303815f87803b1580156118d3575f80fd5b505af11580156118e5573d5f803e3d5ffd5b50505050846001600160a01b03168789858560405160240161190a94939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161193f91906137e5565b5f604051808303815f865af19150503d805f8114611978576040519150601f19603f3d011682016040523d82523d5f602084013e61197d565b606091505b50909150505b806119ba576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f54610100900460ff1615808015611a4357505f54600160ff909116105b80611a5c5750303b158015611a5c57505f5460ff166001145b611ad35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805460ff191660011790558015611af4575f805461ff0019166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8a16027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038781169190910291909117909155606c805473ffffffffffffffffffffffffffffffffffffffff19168583161790558616611bcf5763ffffffff851615611bca576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ceb565b606d805463ffffffff8716600160a01b027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b03891617179055606e611c1e8382613970565b50611cbd5f801b6012604051602001611ca991906060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff91909116604082015260e00190565b6040516020818303038152906040526123d5565b606f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790555b611cf3612a22565b8015611723575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b5f81611d4d8686866109d3565b1495945050505050565b60685460ff1615611d7b57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff610100909104811690871603611de3576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051611e3799989796959493929190613a2c565b60405180910390a1611e6e6117036001606860019054906101000a900463ffffffff16338a8a8a8989604051610e049291906137d6565b8215610cba57610cba612114565b60408051600481526024810182526020810180516001600160e01b03167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611edb91906137e5565b5f60405180830381855afa9150503d805f8114611f13576040519150601f19603f3d011682016040523d82523d5f602084013e611f18565b606091505b509150915081611f5d576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525061098b565b61098b81612a94565b60408051600481526024810182526020810180516001600160e01b03167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611fc591906137e5565b5f60405180830381855afa9150503d805f8114611ffd576040519150601f19603f3d011682016040523d82523d5f602084013e612002565b606091505b509150915081611f5d576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525061098b565b60408051600481526024810182526020810180516001600160e01b03167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b038616916120a591906137e5565b5f60405180830381855afa9150503d805f81146120dd576040519150601f19603f3d011682016040523d82523d5f602084013e6120e2565b606091505b50915091508180156120f5575080516020145b61210057601261098b565b8080602001905181019061098b9190613a97565b6053546068805463ffffffff909216600160c81b027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d61217561088e565b6040518263ffffffff1660e01b815260040161219391815260200190565b5f604051808303815f87803b1580156121aa575f80fd5b505af11580156121bc573d5f803e3d5ffd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af1158015612253573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122779190613860565b9050805f036122b1576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80680100000000000000008716156122f5578691506122d3848a8489611d40565b6122f0576040516338105f3b60e21b815260040160405180910390fd5b61233f565b602087901c612305816001613ab2565b9150879250612320612318868c866109d3565b8a8389611d40565b61233d576040516338105f3b60e21b815260040160405180910390fd5b505b6123498282612c64565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526123d09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612d24565b505050565b5f8060405180611ba00160405280611b668152602001613d80611b6691398360405160200161240592919061377e565b6040516020818303038152906040529050838151602083015ff591506001600160a01b038216612461576040517fbefb092000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5092915050565b6002600154036124ba5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611aca565b6002600155565b5f6124cf6004828486613acf565b6124d891613af6565b90507f2afa5331000000000000000000000000000000000000000000000000000000006001600160e01b03198216016126b2575f80808080808061251f896004818d613acf565b81019061252c9190613b26565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161461256c5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03861630146125955760405163750643af60e01b815260040160405180910390fd5b8a85146125ce576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b03167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169161266591906137e5565b5f604051808303815f865af19150503d805f811461269e576040519150601f19603f3d011682016040523d82523d5f602084013e6126a3565b606091505b50505050505050505050610752565b6001600160e01b031981166323f2ebc360e21b146126fc576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806127118a6004818e613acf565b81019061271e9190613b75565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146127605760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146127895760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169161281091906137e5565b5f604051808303815f865af19150503d805f8114612849576040519150601f19603f3d011682016040523d82523d5f602084013e61284e565b606091505b50505050505050505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526121bc9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612399565b8060016128c060206002613cd3565b6128ca9190613877565b60535410612904576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f81546129139061372e565b918290555090505f5b60208110156129a3578082901c60011660010361294f57826033826020811061294757612947613706565b015550505050565b6033816020811061296257612962613706565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061299b9061372e565b91505061291c565b506123d0613cde565b60018055565b60685460ff166129ee576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f54610100900460ff16612a8c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b610664612e08565b60606040825110612ab357818060200190518101906106ca9190613cf2565b8151602003612c26575f5b602081108015612b055750828181518110612adb57612adb613706565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15612b1c5780612b148161372e565b915050612abe565b805f03612b5e57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115612b7857612b78613268565b6040519080825280601f01601f191660200182016040528015612ba2576020820181803683370190505b5090505f5b82811015612c1e57848181518110612bc157612bc1613706565b602001015160f81c60f81b828281518110612bde57612bde613706565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080612c168161372e565b915050612ba7565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b6068545f90610100900463ffffffff16158015612c87575063ffffffff82166001145b15612c99575063ffffffff8216612cc1565b612cae64010000000063ffffffff84166137ac565b612cbe9063ffffffff85166137c3565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003611723576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612d78826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e729092919063ffffffff16565b8051909150156123d05780806020019051810190612d969190613d64565b6123d05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611aca565b5f54610100900460ff166129ac5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b606061098b84845f85855f80866001600160a01b03168587604051612e9791906137e5565b5f6040518083038185875af1925050503d805f8114612ed1576040519150601f19603f3d011682016040523d82523d5f602084013e612ed6565b606091505b5091509150612ee787838387612ef2565b979650505050505050565b60608315612f605782515f03612f59576001600160a01b0385163b612f595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611aca565b508161098b565b61098b8383815115612f755781518083602001fd5b8060405162461bcd60e51b8152600401611aca9190613102565b803563ffffffff81168114612c5f575f80fd5b6001600160a01b0381168114612fb6575f80fd5b50565b5f8060408385031215612fca575f80fd5b612fd383612f8f565b91506020830135612fe381612fa2565b809150509250929050565b8015158114612fb6575f80fd5b5f8083601f84011261300b575f80fd5b50813567ffffffffffffffff811115613022575f80fd5b602083019150836020828501011115613039575f80fd5b9250929050565b5f805f805f60808688031215613054575f80fd5b61305d86612f8f565b9450602086013561306d81612fa2565b9350604086013561307d81612fee565b9250606086013567ffffffffffffffff811115613098575f80fd5b6130a488828901612ffb565b969995985093965092949392505050565b5f5b838110156130cf5781810151838201526020016130b7565b50505f910152565b5f81518084526130ee8160208601602086016130b5565b601f01601f19169290920160200192915050565b602081525f61311460208301846130d7565b9392505050565b5f6020828403121561312b575f80fd5b813561311481612fa2565b60ff81168114612fb6575f80fd5b5f805f805f805f60e0888a03121561315a575f80fd5b873561316581613136565b965061317360208901612f8f565b9550604088013561318381612fa2565b945061319160608901612f8f565b935060808801356131a181612fa2565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156131d0575f80fd5b6131d984612f8f565b925060208401356131e981612fa2565b915060408401356131f981612fa2565b809150509250925092565b5f60208284031215613214575f80fd5b5035919050565b8061040081018310156106ca575f80fd5b5f805f610440848603121561323f575f80fd5b83359250613250856020860161321b565b915061325f6104208501612f8f565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156132a5576132a5613268565b604052919050565b5f67ffffffffffffffff8211156132c6576132c6613268565b50601f01601f191660200190565b5f6132e66132e1846132ad565b61327c565b90508281528383830111156132f9575f80fd5b828260208301375f602084830101529392505050565b5f82601f83011261331e575f80fd5b613114838335602085016132d4565b5f805f805f60a08688031215613341575f80fd5b61334a86612f8f565b9450602086013561335a81612fa2565b9350604086013567ffffffffffffffff80821115613376575f80fd5b61338289838a0161330f565b94506060880135915080821115613397575f80fd5b506133a48882890161330f565b92505060808601356133b581613136565b809150509295509295909350565b5f805f805f8060a087890312156133d8575f80fd5b6133e187612f8f565b955060208701356133f181612fa2565b945060408701359350606087013561340881612fee565b9250608087013567ffffffffffffffff811115613423575f80fd5b61342f89828a01612ffb565b979a9699509497509295939492505050565b5f8060408385031215613452575f80fd5b61345b83612f8f565b915061346960208401612f8f565b90509250929050565b5f805f805f805f805f805f806109208d8f03121561348e575f80fd5b6134988e8e61321b565b9b506134a88e6104008f0161321b565b9a506108008d013599506108208d013598506108408d013597506134cf6108608e01612f8f565b96506134df6108808e0135612fa2565b6108808d013595506134f46108a08e01612f8f565b94506135046108c08e0135612fa2565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111561352d575f80fd5b61353e8e6109008f01358f01612ffb565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121561356c575f80fd5b61357588612f8f565b9650602088013561358581612fa2565b955060408801359450606088013561359c81612fa2565b935060808801356135ac81612fee565b925060a088013567ffffffffffffffff8111156135c7575f80fd5b6135d38a828b01612ffb565b989b979a50959850939692959293505050565b5f805f805f8060c087890312156135fb575f80fd5b61360487612f8f565b9550602087013561361481612fa2565b945061362260408801612f8f565b9350606087013561363281612fa2565b9250608087013561364281612fa2565b915060a087013567ffffffffffffffff81111561365d575f80fd5b8701601f8101891361366d575f80fd5b61367c898235602084016132d4565b9150509295509295509295565b5f805f80610460858703121561369d575f80fd5b843593506136ae866020870161321b565b92506136bd6104208601612f8f565b939692955092936104400135925050565b600181811c908216806136e257607f821691505b60208210810361370057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f6001820161373f5761373f61371a565b5060010190565b606081525f61375860608301866130d7565b828103602084015261376a81866130d7565b91505060ff83166040830152949350505050565b5f835161378f8184602088016130b5565b8351908301906137a38183602088016130b5565b01949350505050565b80820281158282048414176106ca576106ca61371a565b808201808211156106ca576106ca61371a565b818382375f9101908152919050565b5f82516137f68184602087016130b5565b9190910192915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b63ffffffff861681525f6001600160a01b03808716602084015280861660408401525060806060830152612ee7608083018486613800565b5f60208284031215613870575f80fd5b5051919050565b818103818111156106ca576106ca61371a565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c08501526138da828501876130d7565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f613921606083018486613800565b9695505050505050565b601f8211156123d0575f81815260208120601f850160051c810160208610156139515750805b601f850160051c820191505b81811015610cba5782815560010161395d565b815167ffffffffffffffff81111561398a5761398a613268565b61399e8161399884546136ce565b8461392b565b602080601f8311600181146139d1575f84156139ba5750858301515b5f19600386901b1c1916600185901b178555610cba565b5f85815260208120601f198616915b828110156139ff578886015182559484019460019091019084016139e0565b5085821015613a1c57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c0850152613a7d8285018789613800565b925080851660e085015250509a9950505050505050505050565b5f60208284031215613aa7575f80fd5b815161311481613136565b63ffffffff8181168382160190808211156124615761246161371a565b5f8085851115613add575f80fd5b83861115613ae9575f80fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015613b1e5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215613b3c575f80fd5b8735613b4781612fa2565b96506020880135613b5781612fa2565b9550604088013594506060880135935060808801356131a181613136565b5f805f805f805f80610100898b031215613b8d575f80fd5b8835613b9881612fa2565b97506020890135613ba881612fa2565b965060408901359550606089013594506080890135613bc681612fee565b935060a0890135613bd681613136565b979a969950949793969295929450505060c08201359160e0013590565b600181815b80851115613c2d57815f1904821115613c1357613c1361371a565b80851615613c2057918102915b93841c9390800290613bf8565b509250929050565b5f82613c43575060016106ca565b81613c4f57505f6106ca565b8160018114613c655760028114613c6f57613c8b565b60019150506106ca565b60ff841115613c8057613c8061371a565b50506001821b6106ca565b5060208310610133831016604e8410600b8410161715613cae575081810a6106ca565b613cb88383613bf3565b805f1904821115613ccb57613ccb61371a565b029392505050565b5f6131148383613c35565b634e487b7160e01b5f52600160045260245ffd5b5f60208284031215613d02575f80fd5b815167ffffffffffffffff811115613d18575f80fd5b8201601f81018413613d28575f80fd5b8051613d366132e1826132ad565b818152856020838501011115613d4a575f80fd5b613d5b8260208301602086016130b5565b95945050505050565b5f60208284031215613d74575f80fd5b815161311481612fee56fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a264697066735822122092f4705bd744f1f460410f55ce346df87f7754f31079a73babd92c81416ac66a64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMEtrog.json b/compiled-contracts/PolygonZkEVMEtrog.json index 5332c3a74..d3ec66928 100644 --- a/compiled-contracts/PolygonZkEVMEtrog.json +++ b/compiled-contracts/PolygonZkEVMEtrog.json @@ -1135,8 +1135,8 @@ "type": "function" } ], - "bytecode": "0x61010060405234801562000011575f80fd5b50604051620042453803806200424583398101604081905262000034916200006f565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d4565b6001600160a01b03811681146200006c575f80fd5b50565b5f805f806080858703121562000083575f80fd5b8451620000908162000057565b6020860151909450620000a38162000057565b6040860151909350620000b68162000057565b6060860151909250620000c98162000057565b939692955090935050565b60805160a05160c05160e05161408e620001b75f395f81816104de0152818161094201528181610aae01528181610cf6015281816112c90152818161176401528181611bb301528181611ca801528181612324015281816123e901528181612cf301528181612d6c01528181612d8e0152612ea301525f818161063701528181610eea01528181610fbf01528181611e7201528181611f7a015261283e01525f81816106f3015281816111400152818161253101526128ba01525f8181610725015281816107f501528181611bfc015281816125060152612e3a015261408e5ff3fe608060405234801561000f575f80fd5b50600436106102cc575f3560e01c80637a5460c51161017c578063c7fffd4b116100dd578063e46761c411610093578063ecef3f991161006e578063ecef3f991461076e578063f35dda4714610781578063f851a44014610789575f80fd5b8063e46761c414610720578063e7a7ed0214610747578063eaeb077b1461075b575f80fd5b8063cfa8ed47116100c3578063cfa8ed47146106ce578063d02103ca146106ee578063d7bc90ff14610715575f80fd5b8063c7fffd4b146106b3578063c89e42df146106bb575f80fd5b8063a3c573eb11610132578063ada8f91911610118578063ada8f9191461066c578063b0afe1541461067f578063c754c7ed1461068b575f80fd5b8063a3c573eb14610632578063a652f26c14610659575f80fd5b806391cafe321161016257806391cafe32146105f15780639e001877146106045780639f26f8401461061f575f80fd5b80637a5460c5146105ad5780638c3d7301146105e9575f80fd5b806340b5de6c11610231578063542028d5116101e75780636e05d2cd116101c25780636e05d2cd1461057e5780636ff512cc14610587578063712570221461059a575f80fd5b8063542028d51461054f578063676870d2146105575780636b8616ce1461055f575f80fd5b806349b7b8021161021757806349b7b802146104d95780634e4877061461050057806352bdeb6d14610513575f80fd5b806340b5de6c1461044857806345605267146104a0575f80fd5b8063267822471161028657806332c2d1531161026c57806332c2d153146103d65780633c351e10146103eb5780633cbc795b1461040b575f80fd5b806326782247146103715780632c111c06146103b6575f80fd5b806305835f37116102b657806305835f3714610306578063107bf28c1461034f57806311e892d414610357575f80fd5b8062d0295d146102d057806303508963146102eb575b5f80fd5b6102d86107ae565b6040519081526020015b60405180910390f35b6102f3602081565b60405161ffff90911681526020016102e2565b6103426040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102e29190613393565b6103426108b4565b61035f60f981565b60405160ff90911681526020016102e2565b6001546103919073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102e2565b6008546103919073ffffffffffffffffffffffffffffffffffffffff1681565b6103e96103e43660046133e5565b610940565b005b6009546103919073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104339074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102e2565b61046f7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102e2565b6007546104c09068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102e2565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6103e961050e366004613424565b610a0f565b6103426040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610342610c1e565b6102f3601f81565b6102d861056d366004613424565b60066020525f908152604090205481565b6102d860055481565b6103e961059536600461343f565b610c2b565b6103e96105a836600461357e565b610cf4565b6103426040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b6103e96114fe565b6103e96105ff36600461343f565b6115d0565b61039173a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103e961062d36600461366d565b6116e8565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6103426106673660046136ac565b611d74565b6103e961067a36600461343f565b612152565b6102d86405ca1ab1e081565b6007546104c090700100000000000000000000000000000000900467ffffffffffffffff1681565b61035f60e481565b6103e96106c936600461371d565b61221b565b6002546103919073ffffffffffffffffffffffffffffffffffffffff1681565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6102d8635ca1ab1e81565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6007546104c09067ffffffffffffffff1681565b6103e961076936600461374f565b6122ad565b6103e961077c3660046137c0565b612774565b61035f601b81565b5f546103919062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561083a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085e9190613808565b6007549091505f906108889067ffffffffffffffff6801000000000000000082048116911661384c565b67ffffffffffffffff169050805f036108a3575f9250505090565b6108ad8183613874565b9250505090565b600480546108c1906138ac565b80601f01602080910402602001604051908101604052809291908181526020018280546108ed906138ac565b80156109385780601f1061090f57610100808354040283529160200191610938565b820191905f5260205f20905b81548152906001019060200180831161091b57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109af576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a0291815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a65576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610aac576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b15573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3991906138fd565b610b9a5760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610b9a576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546108c1906138ac565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610c81576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c13565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610d63576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff1615808015610d8157505f54600160ff909116105b80610d9a5750303b158015610d9a57505f5460ff166001145b610e2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e87575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff8516156110e5576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa158015610f2e573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610f73919081019061391c565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d9060240160408051808303815f875af1158015611006573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061102a919061398e565b915091508163ffffffff165f146110a1576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff8416171790556110e2565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b6009545f9061112c90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685611d74565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111a7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111cb9190613808565b90505f808483858f6111de6001436139c6565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611324573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061134891906139df565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600390816113d89190613a3f565b5060046113e58982613a3f565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e60405161148593929190613b57565b60405180910390a150505050505080156114f5575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461154f576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611626576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611675576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c13565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590611726575073ffffffffffffffffffffffffffffffffffffffff81163314155b1561175d576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117ef91906139df565b6117f99190613b95565b67ffffffffffffffff16111561183b576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003611876576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156118b2576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff808216916118da91849168010000000000000000900416613bb6565b1115611912576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b83811015611bad575f87878381811061194d5761194d613bc9565b905060200281019061195f9190613bf6565b61196890613c32565b90508361197481613cb8565b825180516020918201208185015160408087015160608801519151959a509295505f946119e0948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f90815260069093529120549091508114611a68576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f90815260066020526040812055611a8c6001886139c6565b8403611afb5742600760109054906101000a900467ffffffffffffffff168460400151611ab99190613b95565b67ffffffffffffffff161115611afb576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc016040516020818303038152906040528051906020012094505050508080611ba590613cde565b915050611932565b50611c237f000000000000000000000000000000000000000000000000000000000000000084611bdb6107ae565b611be59190613d15565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190612f75565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611cf4908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af1158015611d10573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d3491906139df565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f87604051602401611da696959493929190613d2c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f03611ef65760f9601f8351611e3a9190613d8e565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611ee09796959493929190613da9565b6040516020818303038152906040529050611ffa565b815161ffff1015611f33576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611f42602083613d8e565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001611fe79796959493929190613e8b565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015612058573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166120d0576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f906121159084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001613f6d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146121a8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c13565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612271576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361227d8282613a3f565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c139190613393565b60085473ffffffffffffffffffffffffffffffffffffffff1680158015906122eb575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612322576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa15801561238b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123af91906138fd565b156123e6576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612450573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124749190613808565b9050828111156124b0576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113888411156124ec576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61252e73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308461304e565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612598573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125bc9190613808565b6007805491925067ffffffffffffffff909116905f6125da83613cb8565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051612611929190613fc8565b60405190819003902081426126276001436139c6565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f908152600690935291205532330361271d576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a261276c565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319061276390849033908b908b90613fd7565b60405180910390a25b505050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146127c5576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003612800576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561283c576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156128a1575f80fd5b505af11580156128b3573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612921573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129459190613808565b60075460055491925042916801000000000000000090910467ffffffffffffffff1690815f5b86811015612c66575f8a8a8381811061298657612986613bc9565b90506020028101906129989190613bf6565b6129a190613c32565b8051805160209091012060408201519192509067ffffffffffffffff1615612b8157856129cd81613cb8565b9650505f81836020015184604001518560600151604051602001612a2f9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114612ab7576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550612c51565b8151516201d4c01015612bc0576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b50508080612c5e90613cde565b91505061296b565b5060075467ffffffffffffffff9081169084161115612cb1576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff84811690831614612d66575f612cd6838661384c565b9050612cec67ffffffffffffffff8216836139c6565b9150612d257f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611bdb6107ae565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b612e62337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612df5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e199190613808565b612e239190613d15565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692919061304e565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015612efe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f2291906139df565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e76688604051612f6091815260200190565b60405180910390a25050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526130499084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526130b2565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526130ac9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612fc7565b50505050565b5f613113826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166131bd9092919063ffffffff16565b805190915015613049578080602001905181019061313191906138fd565b613049576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610e22565b606061214a84845f85855f808673ffffffffffffffffffffffffffffffffffffffff1685876040516131ef9190614047565b5f6040518083038185875af1925050503d805f8114613229576040519150601f19603f3d011682016040523d82523d5f602084013e61322e565b606091505b509150915061323f8783838761324a565b979650505050505050565b606083156132df5782515f036132d85773ffffffffffffffffffffffffffffffffffffffff85163b6132d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e22565b508161214a565b61214a83838151156132f45781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e229190613393565b5f5b8381101561334257818101518382015260200161332a565b50505f910152565b5f8151808452613361816020860160208601613328565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6133a5602083018461334a565b9392505050565b67ffffffffffffffff811681146133c1575f80fd5b50565b73ffffffffffffffffffffffffffffffffffffffff811681146133c1575f80fd5b5f805f606084860312156133f7575f80fd5b8335613402816133ac565b9250602084013591506040840135613419816133c4565b809150509250925092565b5f60208284031215613434575f80fd5b81356133a5816133ac565b5f6020828403121561344f575f80fd5b81356133a5816133c4565b63ffffffff811681146133c1575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156134df576134df61346b565b604052919050565b5f67ffffffffffffffff8211156135005761350061346b565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011261353b575f80fd5b813561354e613549826134e7565b613498565b818152846020838601011115613562575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c08789031215613593575f80fd5b863561359e816133c4565b955060208701356135ae816133c4565b945060408701356135be8161345a565b935060608701356135ce816133c4565b9250608087013567ffffffffffffffff808211156135ea575f80fd5b6135f68a838b0161352c565b935060a089013591508082111561360b575f80fd5b5061361889828a0161352c565b9150509295509295509295565b5f8083601f840112613635575f80fd5b50813567ffffffffffffffff81111561364c575f80fd5b6020830191508360208260051b8501011115613666575f80fd5b9250929050565b5f806020838503121561367e575f80fd5b823567ffffffffffffffff811115613694575f80fd5b6136a085828601613625565b90969095509350505050565b5f805f80608085870312156136bf575f80fd5b84356136ca8161345a565b935060208501356136da816133c4565b925060408501356136ea8161345a565b9150606085013567ffffffffffffffff811115613705575f80fd5b6137118782880161352c565b91505092959194509250565b5f6020828403121561372d575f80fd5b813567ffffffffffffffff811115613743575f80fd5b61214a8482850161352c565b5f805f60408486031215613761575f80fd5b833567ffffffffffffffff80821115613778575f80fd5b818601915086601f83011261378b575f80fd5b813581811115613799575f80fd5b8760208285010111156137aa575f80fd5b6020928301989097509590910135949350505050565b5f805f604084860312156137d2575f80fd5b833567ffffffffffffffff8111156137e8575f80fd5b6137f486828701613625565b9094509250506020840135613419816133c4565b5f60208284031215613818575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff82811682821603908082111561386d5761386d61381f565b5092915050565b5f826138a7577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c908216806138c057607f821691505b6020821081036138f7577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b5f6020828403121561390d575f80fd5b815180151581146133a5575f80fd5b5f6020828403121561392c575f80fd5b815167ffffffffffffffff811115613942575f80fd5b8201601f81018413613952575f80fd5b8051613960613549826134e7565b818152856020838501011115613974575f80fd5b613985826020830160208601613328565b95945050505050565b5f806040838503121561399f575f80fd5b82516139aa8161345a565b60208401519092506139bb816133c4565b809150509250929050565b818103818111156139d9576139d961381f565b92915050565b5f602082840312156139ef575f80fd5b81516133a5816133ac565b601f821115613049575f81815260208120601f850160051c81016020861015613a205750805b601f850160051c820191505b8181101561276c57828155600101613a2c565b815167ffffffffffffffff811115613a5957613a5961346b565b613a6d81613a6784546138ac565b846139fa565b602080601f831160018114613abf575f8415613a895750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561276c565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613b0b57888601518255948401946001909101908401613aec565b5085821015613b4757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f613b69606083018661334a565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff81811683821601908082111561386d5761386d61381f565b808201808211156139d9576139d961381f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613c28575f80fd5b9190910192915050565b5f60808236031215613c42575f80fd5b6040516080810167ffffffffffffffff8282108183111715613c6657613c6661346b565b816040528435915080821115613c7a575f80fd5b50613c873682860161352c565b825250602083013560208201526040830135613ca2816133ac565b6040820152606092830135928101929092525090565b5f67ffffffffffffffff808316818103613cd457613cd461381f565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d0e57613d0e61381f565b5060010190565b80820281158282048414176139d9576139d961381f565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152613d8260c083018461334a565b98975050505050505050565b61ffff81811683821601908082111561386d5761386d61381f565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751613e11816003860160208c01613328565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651613e54816017840160208b01613328565b808201915050818660f81b16601782015284519150613e7a826018830160208801613328565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751613ef3816003860160208c01613328565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651613f36816017840160208b01613328565b808201915050818660f01b16601782015284519150613f5c826019830160208801613328565b016019019998505050505050505050565b5f8651613f7e818460208b01613328565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f8251613c2881846020870161332856fea2646970667358221220344c69c385326822d05960be112181a98251ecc843fad3de824d65830caab17764736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106102cc575f3560e01c80637a5460c51161017c578063c7fffd4b116100dd578063e46761c411610093578063ecef3f991161006e578063ecef3f991461076e578063f35dda4714610781578063f851a44014610789575f80fd5b8063e46761c414610720578063e7a7ed0214610747578063eaeb077b1461075b575f80fd5b8063cfa8ed47116100c3578063cfa8ed47146106ce578063d02103ca146106ee578063d7bc90ff14610715575f80fd5b8063c7fffd4b146106b3578063c89e42df146106bb575f80fd5b8063a3c573eb11610132578063ada8f91911610118578063ada8f9191461066c578063b0afe1541461067f578063c754c7ed1461068b575f80fd5b8063a3c573eb14610632578063a652f26c14610659575f80fd5b806391cafe321161016257806391cafe32146105f15780639e001877146106045780639f26f8401461061f575f80fd5b80637a5460c5146105ad5780638c3d7301146105e9575f80fd5b806340b5de6c11610231578063542028d5116101e75780636e05d2cd116101c25780636e05d2cd1461057e5780636ff512cc14610587578063712570221461059a575f80fd5b8063542028d51461054f578063676870d2146105575780636b8616ce1461055f575f80fd5b806349b7b8021161021757806349b7b802146104d95780634e4877061461050057806352bdeb6d14610513575f80fd5b806340b5de6c1461044857806345605267146104a0575f80fd5b8063267822471161028657806332c2d1531161026c57806332c2d153146103d65780633c351e10146103eb5780633cbc795b1461040b575f80fd5b806326782247146103715780632c111c06146103b6575f80fd5b806305835f37116102b657806305835f3714610306578063107bf28c1461034f57806311e892d414610357575f80fd5b8062d0295d146102d057806303508963146102eb575b5f80fd5b6102d86107ae565b6040519081526020015b60405180910390f35b6102f3602081565b60405161ffff90911681526020016102e2565b6103426040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102e29190613393565b6103426108b4565b61035f60f981565b60405160ff90911681526020016102e2565b6001546103919073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102e2565b6008546103919073ffffffffffffffffffffffffffffffffffffffff1681565b6103e96103e43660046133e5565b610940565b005b6009546103919073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104339074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102e2565b61046f7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102e2565b6007546104c09068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102e2565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6103e961050e366004613424565b610a0f565b6103426040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610342610c1e565b6102f3601f81565b6102d861056d366004613424565b60066020525f908152604090205481565b6102d860055481565b6103e961059536600461343f565b610c2b565b6103e96105a836600461357e565b610cf4565b6103426040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b6103e96114fe565b6103e96105ff36600461343f565b6115d0565b61039173a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103e961062d36600461366d565b6116e8565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6103426106673660046136ac565b611d74565b6103e961067a36600461343f565b612152565b6102d86405ca1ab1e081565b6007546104c090700100000000000000000000000000000000900467ffffffffffffffff1681565b61035f60e481565b6103e96106c936600461371d565b61221b565b6002546103919073ffffffffffffffffffffffffffffffffffffffff1681565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6102d8635ca1ab1e81565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6007546104c09067ffffffffffffffff1681565b6103e961076936600461374f565b6122ad565b6103e961077c3660046137c0565b612774565b61035f601b81565b5f546103919062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561083a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085e9190613808565b6007549091505f906108889067ffffffffffffffff6801000000000000000082048116911661384c565b67ffffffffffffffff169050805f036108a3575f9250505090565b6108ad8183613874565b9250505090565b600480546108c1906138ac565b80601f01602080910402602001604051908101604052809291908181526020018280546108ed906138ac565b80156109385780601f1061090f57610100808354040283529160200191610938565b820191905f5260205f20905b81548152906001019060200180831161091b57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109af576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a0291815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a65576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610aac576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b15573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3991906138fd565b610b9a5760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610b9a576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546108c1906138ac565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610c81576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c13565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610d63576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff1615808015610d8157505f54600160ff909116105b80610d9a5750303b158015610d9a57505f5460ff166001145b610e2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e87575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff8516156110e5576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa158015610f2e573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610f73919081019061391c565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d9060240160408051808303815f875af1158015611006573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061102a919061398e565b915091508163ffffffff165f146110a1576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff8416171790556110e2565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b6009545f9061112c90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685611d74565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111a7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111cb9190613808565b90505f808483858f6111de6001436139c6565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611324573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061134891906139df565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600390816113d89190613a3f565b5060046113e58982613a3f565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e60405161148593929190613b57565b60405180910390a150505050505080156114f5575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461154f576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611626576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611675576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c13565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590611726575073ffffffffffffffffffffffffffffffffffffffff81163314155b1561175d576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117ef91906139df565b6117f99190613b95565b67ffffffffffffffff16111561183b576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003611876576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156118b2576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff808216916118da91849168010000000000000000900416613bb6565b1115611912576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b83811015611bad575f87878381811061194d5761194d613bc9565b905060200281019061195f9190613bf6565b61196890613c32565b90508361197481613cb8565b825180516020918201208185015160408087015160608801519151959a509295505f946119e0948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f90815260069093529120549091508114611a68576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f90815260066020526040812055611a8c6001886139c6565b8403611afb5742600760109054906101000a900467ffffffffffffffff168460400151611ab99190613b95565b67ffffffffffffffff161115611afb576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc016040516020818303038152906040528051906020012094505050508080611ba590613cde565b915050611932565b50611c237f000000000000000000000000000000000000000000000000000000000000000084611bdb6107ae565b611be59190613d15565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190612f75565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611cf4908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af1158015611d10573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d3491906139df565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f87604051602401611da696959493929190613d2c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f03611ef65760f9601f8351611e3a9190613d8e565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611ee09796959493929190613da9565b6040516020818303038152906040529050611ffa565b815161ffff1015611f33576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611f42602083613d8e565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001611fe79796959493929190613e8b565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015612058573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166120d0576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f906121159084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001613f6d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146121a8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c13565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612271576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361227d8282613a3f565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c139190613393565b60085473ffffffffffffffffffffffffffffffffffffffff1680158015906122eb575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612322576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa15801561238b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123af91906138fd565b156123e6576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612450573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124749190613808565b9050828111156124b0576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113888411156124ec576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61252e73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308461304e565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612598573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125bc9190613808565b6007805491925067ffffffffffffffff909116905f6125da83613cb8565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051612611929190613fc8565b60405190819003902081426126276001436139c6565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f908152600690935291205532330361271d576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a261276c565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319061276390849033908b908b90613fd7565b60405180910390a25b505050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146127c5576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003612800576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561283c576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156128a1575f80fd5b505af11580156128b3573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612921573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129459190613808565b60075460055491925042916801000000000000000090910467ffffffffffffffff1690815f5b86811015612c66575f8a8a8381811061298657612986613bc9565b90506020028101906129989190613bf6565b6129a190613c32565b8051805160209091012060408201519192509067ffffffffffffffff1615612b8157856129cd81613cb8565b9650505f81836020015184604001518560600151604051602001612a2f9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114612ab7576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550612c51565b8151516201d4c01015612bc0576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b50508080612c5e90613cde565b91505061296b565b5060075467ffffffffffffffff9081169084161115612cb1576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff84811690831614612d66575f612cd6838661384c565b9050612cec67ffffffffffffffff8216836139c6565b9150612d257f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611bdb6107ae565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b612e62337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612df5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e199190613808565b612e239190613d15565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692919061304e565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015612efe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f2291906139df565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e76688604051612f6091815260200190565b60405180910390a25050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526130499084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526130b2565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526130ac9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612fc7565b50505050565b5f613113826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166131bd9092919063ffffffff16565b805190915015613049578080602001905181019061313191906138fd565b613049576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610e22565b606061214a84845f85855f808673ffffffffffffffffffffffffffffffffffffffff1685876040516131ef9190614047565b5f6040518083038185875af1925050503d805f8114613229576040519150601f19603f3d011682016040523d82523d5f602084013e61322e565b606091505b509150915061323f8783838761324a565b979650505050505050565b606083156132df5782515f036132d85773ffffffffffffffffffffffffffffffffffffffff85163b6132d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e22565b508161214a565b61214a83838151156132f45781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e229190613393565b5f5b8381101561334257818101518382015260200161332a565b50505f910152565b5f8151808452613361816020860160208601613328565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6133a5602083018461334a565b9392505050565b67ffffffffffffffff811681146133c1575f80fd5b50565b73ffffffffffffffffffffffffffffffffffffffff811681146133c1575f80fd5b5f805f606084860312156133f7575f80fd5b8335613402816133ac565b9250602084013591506040840135613419816133c4565b809150509250925092565b5f60208284031215613434575f80fd5b81356133a5816133ac565b5f6020828403121561344f575f80fd5b81356133a5816133c4565b63ffffffff811681146133c1575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156134df576134df61346b565b604052919050565b5f67ffffffffffffffff8211156135005761350061346b565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011261353b575f80fd5b813561354e613549826134e7565b613498565b818152846020838601011115613562575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c08789031215613593575f80fd5b863561359e816133c4565b955060208701356135ae816133c4565b945060408701356135be8161345a565b935060608701356135ce816133c4565b9250608087013567ffffffffffffffff808211156135ea575f80fd5b6135f68a838b0161352c565b935060a089013591508082111561360b575f80fd5b5061361889828a0161352c565b9150509295509295509295565b5f8083601f840112613635575f80fd5b50813567ffffffffffffffff81111561364c575f80fd5b6020830191508360208260051b8501011115613666575f80fd5b9250929050565b5f806020838503121561367e575f80fd5b823567ffffffffffffffff811115613694575f80fd5b6136a085828601613625565b90969095509350505050565b5f805f80608085870312156136bf575f80fd5b84356136ca8161345a565b935060208501356136da816133c4565b925060408501356136ea8161345a565b9150606085013567ffffffffffffffff811115613705575f80fd5b6137118782880161352c565b91505092959194509250565b5f6020828403121561372d575f80fd5b813567ffffffffffffffff811115613743575f80fd5b61214a8482850161352c565b5f805f60408486031215613761575f80fd5b833567ffffffffffffffff80821115613778575f80fd5b818601915086601f83011261378b575f80fd5b813581811115613799575f80fd5b8760208285010111156137aa575f80fd5b6020928301989097509590910135949350505050565b5f805f604084860312156137d2575f80fd5b833567ffffffffffffffff8111156137e8575f80fd5b6137f486828701613625565b9094509250506020840135613419816133c4565b5f60208284031215613818575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff82811682821603908082111561386d5761386d61381f565b5092915050565b5f826138a7577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c908216806138c057607f821691505b6020821081036138f7577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b5f6020828403121561390d575f80fd5b815180151581146133a5575f80fd5b5f6020828403121561392c575f80fd5b815167ffffffffffffffff811115613942575f80fd5b8201601f81018413613952575f80fd5b8051613960613549826134e7565b818152856020838501011115613974575f80fd5b613985826020830160208601613328565b95945050505050565b5f806040838503121561399f575f80fd5b82516139aa8161345a565b60208401519092506139bb816133c4565b809150509250929050565b818103818111156139d9576139d961381f565b92915050565b5f602082840312156139ef575f80fd5b81516133a5816133ac565b601f821115613049575f81815260208120601f850160051c81016020861015613a205750805b601f850160051c820191505b8181101561276c57828155600101613a2c565b815167ffffffffffffffff811115613a5957613a5961346b565b613a6d81613a6784546138ac565b846139fa565b602080601f831160018114613abf575f8415613a895750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561276c565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613b0b57888601518255948401946001909101908401613aec565b5085821015613b4757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f613b69606083018661334a565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff81811683821601908082111561386d5761386d61381f565b808201808211156139d9576139d961381f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613c28575f80fd5b9190910192915050565b5f60808236031215613c42575f80fd5b6040516080810167ffffffffffffffff8282108183111715613c6657613c6661346b565b816040528435915080821115613c7a575f80fd5b50613c873682860161352c565b825250602083013560208201526040830135613ca2816133ac565b6040820152606092830135928101929092525090565b5f67ffffffffffffffff808316818103613cd457613cd461381f565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d0e57613d0e61381f565b5060010190565b80820281158282048414176139d9576139d961381f565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152613d8260c083018461334a565b98975050505050505050565b61ffff81811683821601908082111561386d5761386d61381f565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751613e11816003860160208c01613328565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651613e54816017840160208b01613328565b808201915050818660f81b16601782015284519150613e7a826018830160208801613328565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751613ef3816003860160208c01613328565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651613f36816017840160208b01613328565b808201915050818660f01b16601782015284519150613f5c826019830160208801613328565b016019019998505050505050505050565b5f8651613f7e818460208b01613328565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f8251613c2881846020870161332856fea2646970667358221220344c69c385326822d05960be112181a98251ecc843fad3de824d65830caab17764736f6c63430008140033", + "bytecode": "0x61010060405234801562000011575f80fd5b50604051620042453803806200424583398101604081905262000034916200006f565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d4565b6001600160a01b03811681146200006c575f80fd5b50565b5f805f806080858703121562000083575f80fd5b8451620000908162000057565b6020860151909450620000a38162000057565b6040860151909350620000b68162000057565b6060860151909250620000c98162000057565b939692955090935050565b60805160a05160c05160e05161408e620001b75f395f81816104de0152818161094201528181610aae01528181610cf6015281816112c90152818161176401528181611bb301528181611ca801528181612324015281816123e901528181612cf301528181612d6c01528181612d8e0152612ea301525f818161063701528181610eea01528181610fbf01528181611e7201528181611f7a015261283e01525f81816106f3015281816111400152818161253101526128ba01525f8181610725015281816107f501528181611bfc015281816125060152612e3a015261408e5ff3fe608060405234801561000f575f80fd5b50600436106102cc575f3560e01c80637a5460c51161017c578063c7fffd4b116100dd578063e46761c411610093578063ecef3f991161006e578063ecef3f991461076e578063f35dda4714610781578063f851a44014610789575f80fd5b8063e46761c414610720578063e7a7ed0214610747578063eaeb077b1461075b575f80fd5b8063cfa8ed47116100c3578063cfa8ed47146106ce578063d02103ca146106ee578063d7bc90ff14610715575f80fd5b8063c7fffd4b146106b3578063c89e42df146106bb575f80fd5b8063a3c573eb11610132578063ada8f91911610118578063ada8f9191461066c578063b0afe1541461067f578063c754c7ed1461068b575f80fd5b8063a3c573eb14610632578063a652f26c14610659575f80fd5b806391cafe321161016257806391cafe32146105f15780639e001877146106045780639f26f8401461061f575f80fd5b80637a5460c5146105ad5780638c3d7301146105e9575f80fd5b806340b5de6c11610231578063542028d5116101e75780636e05d2cd116101c25780636e05d2cd1461057e5780636ff512cc14610587578063712570221461059a575f80fd5b8063542028d51461054f578063676870d2146105575780636b8616ce1461055f575f80fd5b806349b7b8021161021757806349b7b802146104d95780634e4877061461050057806352bdeb6d14610513575f80fd5b806340b5de6c1461044857806345605267146104a0575f80fd5b8063267822471161028657806332c2d1531161026c57806332c2d153146103d65780633c351e10146103eb5780633cbc795b1461040b575f80fd5b806326782247146103715780632c111c06146103b6575f80fd5b806305835f37116102b657806305835f3714610306578063107bf28c1461034f57806311e892d414610357575f80fd5b8062d0295d146102d057806303508963146102eb575b5f80fd5b6102d86107ae565b6040519081526020015b60405180910390f35b6102f3602081565b60405161ffff90911681526020016102e2565b6103426040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102e29190613393565b6103426108b4565b61035f60f981565b60405160ff90911681526020016102e2565b6001546103919073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102e2565b6008546103919073ffffffffffffffffffffffffffffffffffffffff1681565b6103e96103e43660046133e5565b610940565b005b6009546103919073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104339074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102e2565b61046f7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102e2565b6007546104c09068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102e2565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6103e961050e366004613424565b610a0f565b6103426040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610342610c1e565b6102f3601f81565b6102d861056d366004613424565b60066020525f908152604090205481565b6102d860055481565b6103e961059536600461343f565b610c2b565b6103e96105a836600461357e565b610cf4565b6103426040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b6103e96114fe565b6103e96105ff36600461343f565b6115d0565b61039173a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103e961062d36600461366d565b6116e8565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6103426106673660046136ac565b611d74565b6103e961067a36600461343f565b612152565b6102d86405ca1ab1e081565b6007546104c090700100000000000000000000000000000000900467ffffffffffffffff1681565b61035f60e481565b6103e96106c936600461371d565b61221b565b6002546103919073ffffffffffffffffffffffffffffffffffffffff1681565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6102d8635ca1ab1e81565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6007546104c09067ffffffffffffffff1681565b6103e961076936600461374f565b6122ad565b6103e961077c3660046137c0565b612774565b61035f601b81565b5f546103919062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561083a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085e9190613808565b6007549091505f906108889067ffffffffffffffff6801000000000000000082048116911661384c565b67ffffffffffffffff169050805f036108a3575f9250505090565b6108ad8183613874565b9250505090565b600480546108c1906138ac565b80601f01602080910402602001604051908101604052809291908181526020018280546108ed906138ac565b80156109385780601f1061090f57610100808354040283529160200191610938565b820191905f5260205f20905b81548152906001019060200180831161091b57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109af576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a0291815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a65576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610aac576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b15573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3991906138fd565b610b9a5760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610b9a576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546108c1906138ac565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610c81576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c13565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610d63576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff1615808015610d8157505f54600160ff909116105b80610d9a5750303b158015610d9a57505f5460ff166001145b610e2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e87575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff8516156110e5576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa158015610f2e573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610f73919081019061391c565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d9060240160408051808303815f875af1158015611006573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061102a919061398e565b915091508163ffffffff165f146110a1576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff8416171790556110e2565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b6009545f9061112c90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685611d74565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111a7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111cb9190613808565b90505f808483858f6111de6001436139c6565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611324573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061134891906139df565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600390816113d89190613a3f565b5060046113e58982613a3f565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e60405161148593929190613b57565b60405180910390a150505050505080156114f5575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461154f576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611626576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611675576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c13565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590611726575073ffffffffffffffffffffffffffffffffffffffff81163314155b1561175d576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117ef91906139df565b6117f99190613b95565b67ffffffffffffffff16111561183b576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003611876576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156118b2576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff808216916118da91849168010000000000000000900416613bb6565b1115611912576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b83811015611bad575f87878381811061194d5761194d613bc9565b905060200281019061195f9190613bf6565b61196890613c32565b90508361197481613cb8565b825180516020918201208185015160408087015160608801519151959a509295505f946119e0948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f90815260069093529120549091508114611a68576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f90815260066020526040812055611a8c6001886139c6565b8403611afb5742600760109054906101000a900467ffffffffffffffff168460400151611ab99190613b95565b67ffffffffffffffff161115611afb576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc016040516020818303038152906040528051906020012094505050508080611ba590613cde565b915050611932565b50611c237f000000000000000000000000000000000000000000000000000000000000000084611bdb6107ae565b611be59190613d15565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190612f75565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611cf4908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af1158015611d10573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d3491906139df565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f87604051602401611da696959493929190613d2c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f03611ef65760f9601f8351611e3a9190613d8e565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611ee09796959493929190613da9565b6040516020818303038152906040529050611ffa565b815161ffff1015611f33576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611f42602083613d8e565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001611fe79796959493929190613e8b565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015612058573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166120d0576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f906121159084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001613f6d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146121a8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c13565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612271576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361227d8282613a3f565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c139190613393565b60085473ffffffffffffffffffffffffffffffffffffffff1680158015906122eb575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612322576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa15801561238b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123af91906138fd565b156123e6576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612450573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124749190613808565b9050828111156124b0576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113888411156124ec576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61252e73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308461304e565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612598573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125bc9190613808565b6007805491925067ffffffffffffffff909116905f6125da83613cb8565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051612611929190613fc8565b60405190819003902081426126276001436139c6565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f908152600690935291205532330361271d576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a261276c565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319061276390849033908b908b90613fd7565b60405180910390a25b505050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146127c5576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003612800576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561283c576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156128a1575f80fd5b505af11580156128b3573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612921573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129459190613808565b60075460055491925042916801000000000000000090910467ffffffffffffffff1690815f5b86811015612c66575f8a8a8381811061298657612986613bc9565b90506020028101906129989190613bf6565b6129a190613c32565b8051805160209091012060408201519192509067ffffffffffffffff1615612b8157856129cd81613cb8565b9650505f81836020015184604001518560600151604051602001612a2f9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114612ab7576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550612c51565b8151516201d4c01015612bc0576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b50508080612c5e90613cde565b91505061296b565b5060075467ffffffffffffffff9081169084161115612cb1576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff84811690831614612d66575f612cd6838661384c565b9050612cec67ffffffffffffffff8216836139c6565b9150612d257f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611bdb6107ae565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b612e62337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612df5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e199190613808565b612e239190613d15565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692919061304e565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015612efe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f2291906139df565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e76688604051612f6091815260200190565b60405180910390a25050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526130499084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526130b2565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526130ac9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612fc7565b50505050565b5f613113826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166131bd9092919063ffffffff16565b805190915015613049578080602001905181019061313191906138fd565b613049576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610e22565b606061214a84845f85855f808673ffffffffffffffffffffffffffffffffffffffff1685876040516131ef9190614047565b5f6040518083038185875af1925050503d805f8114613229576040519150601f19603f3d011682016040523d82523d5f602084013e61322e565b606091505b509150915061323f8783838761324a565b979650505050505050565b606083156132df5782515f036132d85773ffffffffffffffffffffffffffffffffffffffff85163b6132d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e22565b508161214a565b61214a83838151156132f45781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e229190613393565b5f5b8381101561334257818101518382015260200161332a565b50505f910152565b5f8151808452613361816020860160208601613328565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6133a5602083018461334a565b9392505050565b67ffffffffffffffff811681146133c1575f80fd5b50565b73ffffffffffffffffffffffffffffffffffffffff811681146133c1575f80fd5b5f805f606084860312156133f7575f80fd5b8335613402816133ac565b9250602084013591506040840135613419816133c4565b809150509250925092565b5f60208284031215613434575f80fd5b81356133a5816133ac565b5f6020828403121561344f575f80fd5b81356133a5816133c4565b63ffffffff811681146133c1575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156134df576134df61346b565b604052919050565b5f67ffffffffffffffff8211156135005761350061346b565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011261353b575f80fd5b813561354e613549826134e7565b613498565b818152846020838601011115613562575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c08789031215613593575f80fd5b863561359e816133c4565b955060208701356135ae816133c4565b945060408701356135be8161345a565b935060608701356135ce816133c4565b9250608087013567ffffffffffffffff808211156135ea575f80fd5b6135f68a838b0161352c565b935060a089013591508082111561360b575f80fd5b5061361889828a0161352c565b9150509295509295509295565b5f8083601f840112613635575f80fd5b50813567ffffffffffffffff81111561364c575f80fd5b6020830191508360208260051b8501011115613666575f80fd5b9250929050565b5f806020838503121561367e575f80fd5b823567ffffffffffffffff811115613694575f80fd5b6136a085828601613625565b90969095509350505050565b5f805f80608085870312156136bf575f80fd5b84356136ca8161345a565b935060208501356136da816133c4565b925060408501356136ea8161345a565b9150606085013567ffffffffffffffff811115613705575f80fd5b6137118782880161352c565b91505092959194509250565b5f6020828403121561372d575f80fd5b813567ffffffffffffffff811115613743575f80fd5b61214a8482850161352c565b5f805f60408486031215613761575f80fd5b833567ffffffffffffffff80821115613778575f80fd5b818601915086601f83011261378b575f80fd5b813581811115613799575f80fd5b8760208285010111156137aa575f80fd5b6020928301989097509590910135949350505050565b5f805f604084860312156137d2575f80fd5b833567ffffffffffffffff8111156137e8575f80fd5b6137f486828701613625565b9094509250506020840135613419816133c4565b5f60208284031215613818575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff82811682821603908082111561386d5761386d61381f565b5092915050565b5f826138a7577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c908216806138c057607f821691505b6020821081036138f7577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b5f6020828403121561390d575f80fd5b815180151581146133a5575f80fd5b5f6020828403121561392c575f80fd5b815167ffffffffffffffff811115613942575f80fd5b8201601f81018413613952575f80fd5b8051613960613549826134e7565b818152856020838501011115613974575f80fd5b613985826020830160208601613328565b95945050505050565b5f806040838503121561399f575f80fd5b82516139aa8161345a565b60208401519092506139bb816133c4565b809150509250929050565b818103818111156139d9576139d961381f565b92915050565b5f602082840312156139ef575f80fd5b81516133a5816133ac565b601f821115613049575f81815260208120601f850160051c81016020861015613a205750805b601f850160051c820191505b8181101561276c57828155600101613a2c565b815167ffffffffffffffff811115613a5957613a5961346b565b613a6d81613a6784546138ac565b846139fa565b602080601f831160018114613abf575f8415613a895750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561276c565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613b0b57888601518255948401946001909101908401613aec565b5085821015613b4757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f613b69606083018661334a565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff81811683821601908082111561386d5761386d61381f565b808201808211156139d9576139d961381f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613c28575f80fd5b9190910192915050565b5f60808236031215613c42575f80fd5b6040516080810167ffffffffffffffff8282108183111715613c6657613c6661346b565b816040528435915080821115613c7a575f80fd5b50613c873682860161352c565b825250602083013560208201526040830135613ca2816133ac565b6040820152606092830135928101929092525090565b5f67ffffffffffffffff808316818103613cd457613cd461381f565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d0e57613d0e61381f565b5060010190565b80820281158282048414176139d9576139d961381f565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152613d8260c083018461334a565b98975050505050505050565b61ffff81811683821601908082111561386d5761386d61381f565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751613e11816003860160208c01613328565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651613e54816017840160208b01613328565b808201915050818660f81b16601782015284519150613e7a826018830160208801613328565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751613ef3816003860160208c01613328565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651613f36816017840160208b01613328565b808201915050818660f01b16601782015284519150613f5c826019830160208801613328565b016019019998505050505050505050565b5f8651613f7e818460208b01613328565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f8251613c2881846020870161332856fea2646970667358221220a8046869a3f4543e0426643908c43641e429b0cdcf0958aa07b07804a194bfcd64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106102cc575f3560e01c80637a5460c51161017c578063c7fffd4b116100dd578063e46761c411610093578063ecef3f991161006e578063ecef3f991461076e578063f35dda4714610781578063f851a44014610789575f80fd5b8063e46761c414610720578063e7a7ed0214610747578063eaeb077b1461075b575f80fd5b8063cfa8ed47116100c3578063cfa8ed47146106ce578063d02103ca146106ee578063d7bc90ff14610715575f80fd5b8063c7fffd4b146106b3578063c89e42df146106bb575f80fd5b8063a3c573eb11610132578063ada8f91911610118578063ada8f9191461066c578063b0afe1541461067f578063c754c7ed1461068b575f80fd5b8063a3c573eb14610632578063a652f26c14610659575f80fd5b806391cafe321161016257806391cafe32146105f15780639e001877146106045780639f26f8401461061f575f80fd5b80637a5460c5146105ad5780638c3d7301146105e9575f80fd5b806340b5de6c11610231578063542028d5116101e75780636e05d2cd116101c25780636e05d2cd1461057e5780636ff512cc14610587578063712570221461059a575f80fd5b8063542028d51461054f578063676870d2146105575780636b8616ce1461055f575f80fd5b806349b7b8021161021757806349b7b802146104d95780634e4877061461050057806352bdeb6d14610513575f80fd5b806340b5de6c1461044857806345605267146104a0575f80fd5b8063267822471161028657806332c2d1531161026c57806332c2d153146103d65780633c351e10146103eb5780633cbc795b1461040b575f80fd5b806326782247146103715780632c111c06146103b6575f80fd5b806305835f37116102b657806305835f3714610306578063107bf28c1461034f57806311e892d414610357575f80fd5b8062d0295d146102d057806303508963146102eb575b5f80fd5b6102d86107ae565b6040519081526020015b60405180910390f35b6102f3602081565b60405161ffff90911681526020016102e2565b6103426040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102e29190613393565b6103426108b4565b61035f60f981565b60405160ff90911681526020016102e2565b6001546103919073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102e2565b6008546103919073ffffffffffffffffffffffffffffffffffffffff1681565b6103e96103e43660046133e5565b610940565b005b6009546103919073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104339074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102e2565b61046f7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102e2565b6007546104c09068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102e2565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6103e961050e366004613424565b610a0f565b6103426040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610342610c1e565b6102f3601f81565b6102d861056d366004613424565b60066020525f908152604090205481565b6102d860055481565b6103e961059536600461343f565b610c2b565b6103e96105a836600461357e565b610cf4565b6103426040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b6103e96114fe565b6103e96105ff36600461343f565b6115d0565b61039173a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103e961062d36600461366d565b6116e8565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6103426106673660046136ac565b611d74565b6103e961067a36600461343f565b612152565b6102d86405ca1ab1e081565b6007546104c090700100000000000000000000000000000000900467ffffffffffffffff1681565b61035f60e481565b6103e96106c936600461371d565b61221b565b6002546103919073ffffffffffffffffffffffffffffffffffffffff1681565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6102d8635ca1ab1e81565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6007546104c09067ffffffffffffffff1681565b6103e961076936600461374f565b6122ad565b6103e961077c3660046137c0565b612774565b61035f601b81565b5f546103919062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561083a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085e9190613808565b6007549091505f906108889067ffffffffffffffff6801000000000000000082048116911661384c565b67ffffffffffffffff169050805f036108a3575f9250505090565b6108ad8183613874565b9250505090565b600480546108c1906138ac565b80601f01602080910402602001604051908101604052809291908181526020018280546108ed906138ac565b80156109385780601f1061090f57610100808354040283529160200191610938565b820191905f5260205f20905b81548152906001019060200180831161091b57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109af576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a0291815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a65576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610aac576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b15573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3991906138fd565b610b9a5760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610b9a576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546108c1906138ac565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610c81576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c13565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610d63576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff1615808015610d8157505f54600160ff909116105b80610d9a5750303b158015610d9a57505f5460ff166001145b610e2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e87575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff8516156110e5576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa158015610f2e573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610f73919081019061391c565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d9060240160408051808303815f875af1158015611006573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061102a919061398e565b915091508163ffffffff165f146110a1576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff8416171790556110e2565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b6009545f9061112c90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685611d74565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111a7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111cb9190613808565b90505f808483858f6111de6001436139c6565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611324573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061134891906139df565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600390816113d89190613a3f565b5060046113e58982613a3f565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e60405161148593929190613b57565b60405180910390a150505050505080156114f5575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461154f576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611626576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611675576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c13565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590611726575073ffffffffffffffffffffffffffffffffffffffff81163314155b1561175d576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117ef91906139df565b6117f99190613b95565b67ffffffffffffffff16111561183b576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003611876576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156118b2576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff808216916118da91849168010000000000000000900416613bb6565b1115611912576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b83811015611bad575f87878381811061194d5761194d613bc9565b905060200281019061195f9190613bf6565b61196890613c32565b90508361197481613cb8565b825180516020918201208185015160408087015160608801519151959a509295505f946119e0948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f90815260069093529120549091508114611a68576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f90815260066020526040812055611a8c6001886139c6565b8403611afb5742600760109054906101000a900467ffffffffffffffff168460400151611ab99190613b95565b67ffffffffffffffff161115611afb576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc016040516020818303038152906040528051906020012094505050508080611ba590613cde565b915050611932565b50611c237f000000000000000000000000000000000000000000000000000000000000000084611bdb6107ae565b611be59190613d15565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190612f75565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611cf4908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af1158015611d10573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d3491906139df565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f87604051602401611da696959493929190613d2c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f03611ef65760f9601f8351611e3a9190613d8e565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611ee09796959493929190613da9565b6040516020818303038152906040529050611ffa565b815161ffff1015611f33576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611f42602083613d8e565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001611fe79796959493929190613e8b565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015612058573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166120d0576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f906121159084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001613f6d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146121a8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c13565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612271576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361227d8282613a3f565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c139190613393565b60085473ffffffffffffffffffffffffffffffffffffffff1680158015906122eb575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612322576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa15801561238b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123af91906138fd565b156123e6576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612450573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124749190613808565b9050828111156124b0576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113888411156124ec576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61252e73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308461304e565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612598573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125bc9190613808565b6007805491925067ffffffffffffffff909116905f6125da83613cb8565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051612611929190613fc8565b60405190819003902081426126276001436139c6565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f908152600690935291205532330361271d576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a261276c565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319061276390849033908b908b90613fd7565b60405180910390a25b505050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146127c5576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003612800576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561283c576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156128a1575f80fd5b505af11580156128b3573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612921573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129459190613808565b60075460055491925042916801000000000000000090910467ffffffffffffffff1690815f5b86811015612c66575f8a8a8381811061298657612986613bc9565b90506020028101906129989190613bf6565b6129a190613c32565b8051805160209091012060408201519192509067ffffffffffffffff1615612b8157856129cd81613cb8565b9650505f81836020015184604001518560600151604051602001612a2f9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114612ab7576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550612c51565b8151516201d4c01015612bc0576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b50508080612c5e90613cde565b91505061296b565b5060075467ffffffffffffffff9081169084161115612cb1576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff84811690831614612d66575f612cd6838661384c565b9050612cec67ffffffffffffffff8216836139c6565b9150612d257f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611bdb6107ae565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b612e62337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612df5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e199190613808565b612e239190613d15565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692919061304e565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015612efe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f2291906139df565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e76688604051612f6091815260200190565b60405180910390a25050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526130499084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526130b2565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526130ac9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612fc7565b50505050565b5f613113826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166131bd9092919063ffffffff16565b805190915015613049578080602001905181019061313191906138fd565b613049576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610e22565b606061214a84845f85855f808673ffffffffffffffffffffffffffffffffffffffff1685876040516131ef9190614047565b5f6040518083038185875af1925050503d805f8114613229576040519150601f19603f3d011682016040523d82523d5f602084013e61322e565b606091505b509150915061323f8783838761324a565b979650505050505050565b606083156132df5782515f036132d85773ffffffffffffffffffffffffffffffffffffffff85163b6132d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e22565b508161214a565b61214a83838151156132f45781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e229190613393565b5f5b8381101561334257818101518382015260200161332a565b50505f910152565b5f8151808452613361816020860160208601613328565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6133a5602083018461334a565b9392505050565b67ffffffffffffffff811681146133c1575f80fd5b50565b73ffffffffffffffffffffffffffffffffffffffff811681146133c1575f80fd5b5f805f606084860312156133f7575f80fd5b8335613402816133ac565b9250602084013591506040840135613419816133c4565b809150509250925092565b5f60208284031215613434575f80fd5b81356133a5816133ac565b5f6020828403121561344f575f80fd5b81356133a5816133c4565b63ffffffff811681146133c1575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156134df576134df61346b565b604052919050565b5f67ffffffffffffffff8211156135005761350061346b565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011261353b575f80fd5b813561354e613549826134e7565b613498565b818152846020838601011115613562575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c08789031215613593575f80fd5b863561359e816133c4565b955060208701356135ae816133c4565b945060408701356135be8161345a565b935060608701356135ce816133c4565b9250608087013567ffffffffffffffff808211156135ea575f80fd5b6135f68a838b0161352c565b935060a089013591508082111561360b575f80fd5b5061361889828a0161352c565b9150509295509295509295565b5f8083601f840112613635575f80fd5b50813567ffffffffffffffff81111561364c575f80fd5b6020830191508360208260051b8501011115613666575f80fd5b9250929050565b5f806020838503121561367e575f80fd5b823567ffffffffffffffff811115613694575f80fd5b6136a085828601613625565b90969095509350505050565b5f805f80608085870312156136bf575f80fd5b84356136ca8161345a565b935060208501356136da816133c4565b925060408501356136ea8161345a565b9150606085013567ffffffffffffffff811115613705575f80fd5b6137118782880161352c565b91505092959194509250565b5f6020828403121561372d575f80fd5b813567ffffffffffffffff811115613743575f80fd5b61214a8482850161352c565b5f805f60408486031215613761575f80fd5b833567ffffffffffffffff80821115613778575f80fd5b818601915086601f83011261378b575f80fd5b813581811115613799575f80fd5b8760208285010111156137aa575f80fd5b6020928301989097509590910135949350505050565b5f805f604084860312156137d2575f80fd5b833567ffffffffffffffff8111156137e8575f80fd5b6137f486828701613625565b9094509250506020840135613419816133c4565b5f60208284031215613818575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff82811682821603908082111561386d5761386d61381f565b5092915050565b5f826138a7577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c908216806138c057607f821691505b6020821081036138f7577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b5f6020828403121561390d575f80fd5b815180151581146133a5575f80fd5b5f6020828403121561392c575f80fd5b815167ffffffffffffffff811115613942575f80fd5b8201601f81018413613952575f80fd5b8051613960613549826134e7565b818152856020838501011115613974575f80fd5b613985826020830160208601613328565b95945050505050565b5f806040838503121561399f575f80fd5b82516139aa8161345a565b60208401519092506139bb816133c4565b809150509250929050565b818103818111156139d9576139d961381f565b92915050565b5f602082840312156139ef575f80fd5b81516133a5816133ac565b601f821115613049575f81815260208120601f850160051c81016020861015613a205750805b601f850160051c820191505b8181101561276c57828155600101613a2c565b815167ffffffffffffffff811115613a5957613a5961346b565b613a6d81613a6784546138ac565b846139fa565b602080601f831160018114613abf575f8415613a895750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561276c565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613b0b57888601518255948401946001909101908401613aec565b5085821015613b4757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f613b69606083018661334a565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff81811683821601908082111561386d5761386d61381f565b808201808211156139d9576139d961381f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613c28575f80fd5b9190910192915050565b5f60808236031215613c42575f80fd5b6040516080810167ffffffffffffffff8282108183111715613c6657613c6661346b565b816040528435915080821115613c7a575f80fd5b50613c873682860161352c565b825250602083013560208201526040830135613ca2816133ac565b6040820152606092830135928101929092525090565b5f67ffffffffffffffff808316818103613cd457613cd461381f565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d0e57613d0e61381f565b5060010190565b80820281158282048414176139d9576139d961381f565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152613d8260c083018461334a565b98975050505050505050565b61ffff81811683821601908082111561386d5761386d61381f565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751613e11816003860160208c01613328565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651613e54816017840160208b01613328565b808201915050818660f81b16601782015284519150613e7a826018830160208801613328565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751613ef3816003860160208c01613328565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651613f36816017840160208b01613328565b808201915050818660f01b16601782015284519150613f5c826019830160208801613328565b016019019998505050505050505050565b5f8651613f7e818460208b01613328565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f8251613c2881846020870161332856fea2646970667358221220a8046869a3f4543e0426643908c43641e429b0cdcf0958aa07b07804a194bfcd64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMExistentEtrog.json b/compiled-contracts/PolygonZkEVMExistentEtrog.json index 649928639..49f55a2e0 100644 --- a/compiled-contracts/PolygonZkEVMExistentEtrog.json +++ b/compiled-contracts/PolygonZkEVMExistentEtrog.json @@ -1212,8 +1212,8 @@ "type": "function" } ], - "bytecode": "0x61010060405234801562000011575f80fd5b50604051620049603803806200496083398101604081905262000034916200006f565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d4565b6001600160a01b03811681146200006c575f80fd5b50565b5f805f806080858703121562000083575f80fd5b8451620000908162000057565b6020860151909450620000a38162000057565b6040860151909350620000b68162000057565b6060860151909250620000c98162000057565b939692955090935050565b60805160a05160c05160e051614794620001cc5f395f81816104f40152818161097301528181610adf01528181610c5e01528181610fa8015281816112aa0152818161187801528181611d130152818161216201528181612257015281816128ef015281816129b4015281816132bd0152818161333601528181613358015261346d01525f8181610660015281816114990152818161156e01528181612421015281816125290152612e0801525f818161072401528181610e1d015281816116ef01528181612afc0152612e8401525f818161075601528181610826015281816121ab01528181612ad1015261340401526147945ff3fe608060405234801561000f575f80fd5b50600436106102e2575f3560e01c80637a5460c511610187578063c7fffd4b116100dd578063e46761c411610093578063ecef3f991161006e578063ecef3f991461079f578063f35dda47146107b2578063f851a440146107ba575f80fd5b8063e46761c414610751578063e7a7ed0214610778578063eaeb077b1461078c575f80fd5b8063cfa8ed47116100c3578063cfa8ed47146106ff578063d02103ca1461071f578063d7bc90ff14610746575f80fd5b8063c7fffd4b146106e4578063c89e42df146106ec575f80fd5b8063a3c573eb1161013d578063af7f3e0211610118578063af7f3e02146106a8578063b0afe154146106b0578063c754c7ed146106bc575f80fd5b8063a3c573eb1461065b578063a652f26c14610682578063ada8f91914610695575f80fd5b806391cafe321161016d57806391cafe321461061a5780639e0018771461062d5780639f26f84014610648575f80fd5b80637a5460c5146105d65780638c3d730114610612575f80fd5b8063456052671161023c5780635d6717a5116101f25780636e05d2cd116101cd5780636e05d2cd146105a75780636ff512cc146105b057806371257022146105c3575f80fd5b80635d6717a51461056d578063676870d2146105805780636b8616ce14610588575f80fd5b80634e487706116102225780634e4877061461051657806352bdeb6d14610529578063542028d514610565575f80fd5b806345605267146104b657806349b7b802146104ef575f80fd5b8063267822471161029c5780633c351e10116102775780633c351e10146104015780633cbc795b1461042157806340b5de6c1461045e575f80fd5b806326782247146103875780632c111c06146103cc57806332c2d153146103ec575f80fd5b806305835f37116102cc57806305835f371461031c578063107bf28c1461036557806311e892d41461036d575f80fd5b8062d0295d146102e65780630350896314610301575b5f80fd5b6102ee6107df565b6040519081526020015b60405180910390f35b610309602081565b60405161ffff90911681526020016102f8565b6103586040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102f8919061395d565b6103586108e5565b61037560f981565b60405160ff90911681526020016102f8565b6001546103a79073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102f8565b6008546103a79073ffffffffffffffffffffffffffffffffffffffff1681565b6103ff6103fa3660046139af565b610971565b005b6009546103a79073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104499074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102f8565b6104857fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102f8565b6007546104d69068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102f8565b6103a77f000000000000000000000000000000000000000000000000000000000000000081565b6103ff6105243660046139ee565b610a40565b6103586040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610358610c4f565b6103ff61057b366004613b1c565b610c5c565b610309601f81565b6102ee6105963660046139ee565b60066020525f908152604090205481565b6102ee60055481565b6103ff6105be366004613ba7565b6111df565b6103ff6105d1366004613bd3565b6112a8565b6103586040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b6103ff611aad565b6103ff610628366004613ba7565b611b7f565b6103a773a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103ff610656366004613cc2565b611c97565b6103a77f000000000000000000000000000000000000000000000000000000000000000081565b610358610690366004613d01565b612323565b6103ff6106a3366004613ba7565b612701565b6103586127ca565b6102ee6405ca1ab1e081565b6007546104d690700100000000000000000000000000000000900467ffffffffffffffff1681565b61037560e481565b6103ff6106fa366004613d72565b6127e6565b6002546103a79073ffffffffffffffffffffffffffffffffffffffff1681565b6103a77f000000000000000000000000000000000000000000000000000000000000000081565b6102ee635ca1ab1e81565b6103a77f000000000000000000000000000000000000000000000000000000000000000081565b6007546104d69067ffffffffffffffff1681565b6103ff61079a366004613da4565b612878565b6103ff6107ad366004613e15565b612d3e565b610375601b81565b5f546103a79062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561086b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088f9190613e5d565b6007549091505f906108b99067ffffffffffffffff68010000000000000000820481169116613ea1565b67ffffffffffffffff169050805f036108d4575f9250505090565b6108de8183613ec9565b9250505090565b600480546108f290613f01565b80601f016020809104026020016040519081016040528092919081815260200182805461091e90613f01565b80156109695780601f1061094057610100808354040283529160200191610969565b820191905f5260205f20905b81548152906001019060200180831161094c57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109e0576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a3391815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a96576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610add576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b6a9190613f52565b610bcb5760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610bcb576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546108f290613f01565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610ccb576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff1615808015610ce957505f54600160ff909116105b80610d025750303b158015610d0257505f5460ff166001145b610d93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610def575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f6040518060a00160405280606281526020016146fd6062913990505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e84573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ea89190613e5d565b90505f868483858d610ebb600143613f71565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291505f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611003573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110279190613f8a565b90508b5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508a60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555089600390816110b89190613fea565b5060046110c58a82613fea565b508b60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fd2c80353fc15ef62c6affc7cd6b7ab5b42c43290c50be3372e55ae552cecd19c8187858e6040516111679493929190614102565b60405180910390a150505050505080156111d7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611235576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c44565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611317576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff161580801561133557505f54600160ff909116105b8061134e5750303b15801561134e57505f5460ff166001145b6113da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610d8a565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611436575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611694576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa1580156114dd573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526115229190810190614151565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d9060240160408051808303815f875af11580156115b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115d991906141c3565b915091508163ffffffff165f14611650576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055611691565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b6009545f906116db90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685612323565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611756573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061177a9190613e5d565b90505f808483858f61178d600143613f71565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af11580156118d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118f79190613f8a565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600390816119879190613fea565b5060046119948982613fea565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611a34939291906141fb565b60405180910390a15050505050508015611aa4575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611afe576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611bd5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611c24576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c44565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590611cd5575073ffffffffffffffffffffffffffffffffffffffff81163314155b15611d0c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d7a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d9e9190613f8a565b611da89190614239565b67ffffffffffffffff161115611dea576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003611e25576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611e61576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff80821691611e899184916801000000000000000090041661425a565b1115611ec1576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b8381101561215c575f878783818110611efc57611efc61426d565b9050602002810190611f0e919061429a565b611f17906142d6565b905083611f238161435c565b825180516020918201208185015160408087015160608801519151959a509295505f94611f8f948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f90815260069093529120549091508114612017576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f9081526006602052604081205561203b600188613f71565b84036120aa5742600760109054906101000a900467ffffffffffffffff1684604001516120689190614239565b67ffffffffffffffff1611156120aa576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209450505050808061215490614382565b915050611ee1565b506121d27f00000000000000000000000000000000000000000000000000000000000000008461218a6107df565b61219491906143b9565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016919061353f565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906122a3908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af11580156122bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122e39190613f8a565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f87604051602401612355969594939291906143d0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f036124a55760f9601f83516123e99190614432565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e48760405160200161248f979695949392919061444d565b60405160208183030381529060405290506125a9565b815161ffff10156124e2576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96124f1602083614432565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001612596979695949392919061452f565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015612607573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661267f576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f906126c49084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614611565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612757576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c44565b6040518060a00160405280606281526020016146fd6062913981565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff16331461283c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036128488282613fea565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c44919061395d565b60085473ffffffffffffffffffffffffffffffffffffffff1680158015906128b6575073ffffffffffffffffffffffffffffffffffffffff81163314155b156128ed576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015612956573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061297a9190613f52565b156129b1576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a1b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a3f9190613e5d565b905082811115612a7b576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388841115612ab7576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612af973ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613618565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b879190613e5d565b6007805491925067ffffffffffffffff909116905f612ba58361435c565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051612bdc92919061466c565b6040519081900390208142612bf2600143613f71565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f9081526006909352912055323303612ce8576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a26111d7565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93190612d2e90849033908b908b9061467b565b60405180910390a2505050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612d8f576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003612dca576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612e06576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612e6b575f80fd5b505af1158015612e7d573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612eeb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f0f9190613e5d565b60075460055491925042916801000000000000000090910467ffffffffffffffff1690815f5b86811015613230575f8a8a83818110612f5057612f5061426d565b9050602002810190612f62919061429a565b612f6b906142d6565b8051805160209091012060408201519192509067ffffffffffffffff161561314b5785612f978161435c565b9650505f81836020015184604001518560600151604051602001612ff99493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114613081576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f90555061321b565b8151516201d4c0101561318a576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b5050808061322890614382565b915050612f35565b5060075467ffffffffffffffff908116908416111561327b576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff84811690831614613330575f6132a08386613ea1565b90506132b667ffffffffffffffff821683613f71565b91506132ef7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661218a6107df565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b61342c337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133e39190613e5d565b6133ed91906143b9565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613618565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af11580156134c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134ec9190613f8a565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e7668860405161352a91815260200190565b60405180910390a25050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526136139084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261367c565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526136769085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613591565b50505050565b5f6136dd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166137879092919063ffffffff16565b80519091501561361357808060200190518101906136fb9190613f52565b613613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610d8a565b60606126f984845f85855f808673ffffffffffffffffffffffffffffffffffffffff1685876040516137b991906146eb565b5f6040518083038185875af1925050503d805f81146137f3576040519150601f19603f3d011682016040523d82523d5f602084013e6137f8565b606091505b509150915061380987838387613814565b979650505050505050565b606083156138a95782515f036138a25773ffffffffffffffffffffffffffffffffffffffff85163b6138a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d8a565b50816126f9565b6126f983838151156138be5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8a919061395d565b5f5b8381101561390c5781810151838201526020016138f4565b50505f910152565b5f815180845261392b8160208601602086016138f2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61396f6020830184613914565b9392505050565b67ffffffffffffffff8116811461398b575f80fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461398b575f80fd5b5f805f606084860312156139c1575f80fd5b83356139cc81613976565b92506020840135915060408401356139e38161398e565b809150509250925092565b5f602082840312156139fe575f80fd5b813561396f81613976565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613a7d57613a7d613a09565b604052919050565b5f67ffffffffffffffff821115613a9e57613a9e613a09565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112613ad9575f80fd5b8135613aec613ae782613a85565b613a36565b818152846020838601011115613b00575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f60a08688031215613b30575f80fd5b8535613b3b8161398e565b94506020860135613b4b8161398e565b9350604086013567ffffffffffffffff80821115613b67575f80fd5b613b7389838a01613aca565b94506060880135915080821115613b88575f80fd5b50613b9588828901613aca565b95989497509295608001359392505050565b5f60208284031215613bb7575f80fd5b813561396f8161398e565b63ffffffff8116811461398b575f80fd5b5f805f805f8060c08789031215613be8575f80fd5b8635613bf38161398e565b95506020870135613c038161398e565b94506040870135613c1381613bc2565b93506060870135613c238161398e565b9250608087013567ffffffffffffffff80821115613c3f575f80fd5b613c4b8a838b01613aca565b935060a0890135915080821115613c60575f80fd5b50613c6d89828a01613aca565b9150509295509295509295565b5f8083601f840112613c8a575f80fd5b50813567ffffffffffffffff811115613ca1575f80fd5b6020830191508360208260051b8501011115613cbb575f80fd5b9250929050565b5f8060208385031215613cd3575f80fd5b823567ffffffffffffffff811115613ce9575f80fd5b613cf585828601613c7a565b90969095509350505050565b5f805f8060808587031215613d14575f80fd5b8435613d1f81613bc2565b93506020850135613d2f8161398e565b92506040850135613d3f81613bc2565b9150606085013567ffffffffffffffff811115613d5a575f80fd5b613d6687828801613aca565b91505092959194509250565b5f60208284031215613d82575f80fd5b813567ffffffffffffffff811115613d98575f80fd5b6126f984828501613aca565b5f805f60408486031215613db6575f80fd5b833567ffffffffffffffff80821115613dcd575f80fd5b818601915086601f830112613de0575f80fd5b813581811115613dee575f80fd5b876020828501011115613dff575f80fd5b6020928301989097509590910135949350505050565b5f805f60408486031215613e27575f80fd5b833567ffffffffffffffff811115613e3d575f80fd5b613e4986828701613c7a565b90945092505060208401356139e38161398e565b5f60208284031215613e6d575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff828116828216039080821115613ec257613ec2613e74565b5092915050565b5f82613efc577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c90821680613f1557607f821691505b602082108103613f4c577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b5f60208284031215613f62575f80fd5b8151801515811461396f575f80fd5b81810381811115613f8457613f84613e74565b92915050565b5f60208284031215613f9a575f80fd5b815161396f81613976565b601f821115613613575f81815260208120601f850160051c81016020861015613fcb5750805b601f850160051c820191505b818110156111d757828155600101613fd7565b815167ffffffffffffffff81111561400457614004613a09565b614018816140128454613f01565b84613fa5565b602080601f83116001811461406a575f84156140345750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556111d7565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156140b657888601518255948401946001909101908401614097565b50858210156140f257878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff85168152608060208201525f6141246080830186613914565b905083604083015273ffffffffffffffffffffffffffffffffffffffff8316606083015295945050505050565b5f60208284031215614161575f80fd5b815167ffffffffffffffff811115614177575f80fd5b8201601f81018413614187575f80fd5b8051614195613ae782613a85565b8181528560208385010111156141a9575f80fd5b6141ba8260208301602086016138f2565b95945050505050565b5f80604083850312156141d4575f80fd5b82516141df81613bc2565b60208401519092506141f08161398e565b809150509250929050565b606081525f61420d6060830186613914565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff818116838216019080821115613ec257613ec2613e74565b80820180821115613f8457613f84613e74565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126142cc575f80fd5b9190910192915050565b5f608082360312156142e6575f80fd5b6040516080810167ffffffffffffffff828210818311171561430a5761430a613a09565b81604052843591508082111561431e575f80fd5b5061432b36828601613aca565b82525060208301356020820152604083013561434681613976565b6040820152606092830135928101929092525090565b5f67ffffffffffffffff80831681810361437857614378613e74565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143b2576143b2613e74565b5060010190565b8082028115828204841417613f8457613f84613e74565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261442660c0830184613914565b98975050505050505050565b61ffff818116838216019080821115613ec257613ec2613e74565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b16600184015287516144b5816003860160208c016138f2565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516144f8816017840160208b016138f2565b808201915050818660f81b1660178201528451915061451e8260188301602088016138f2565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614597816003860160208c016138f2565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516145da816017840160208b016138f2565b808201915050818660f01b166017820152845191506146008260198301602088016138f2565b016019019998505050505050505050565b5f8651614622818460208b016138f2565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f82516142cc8184602087016138f256fedf2a8080944d5cf5032b2a844602278b01199ed191a86c93ff8080821092808000000000000000000000000000000000000000000000000000000005ca1ab1e000000000000000000000000000000000000000000000000000000005ca1ab1e01bffa2646970667358221220922931e5d0570d6de206da26a8cb6cc8865aa3a1e27df595ba4f321c371781f664736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106102e2575f3560e01c80637a5460c511610187578063c7fffd4b116100dd578063e46761c411610093578063ecef3f991161006e578063ecef3f991461079f578063f35dda47146107b2578063f851a440146107ba575f80fd5b8063e46761c414610751578063e7a7ed0214610778578063eaeb077b1461078c575f80fd5b8063cfa8ed47116100c3578063cfa8ed47146106ff578063d02103ca1461071f578063d7bc90ff14610746575f80fd5b8063c7fffd4b146106e4578063c89e42df146106ec575f80fd5b8063a3c573eb1161013d578063af7f3e0211610118578063af7f3e02146106a8578063b0afe154146106b0578063c754c7ed146106bc575f80fd5b8063a3c573eb1461065b578063a652f26c14610682578063ada8f91914610695575f80fd5b806391cafe321161016d57806391cafe321461061a5780639e0018771461062d5780639f26f84014610648575f80fd5b80637a5460c5146105d65780638c3d730114610612575f80fd5b8063456052671161023c5780635d6717a5116101f25780636e05d2cd116101cd5780636e05d2cd146105a75780636ff512cc146105b057806371257022146105c3575f80fd5b80635d6717a51461056d578063676870d2146105805780636b8616ce14610588575f80fd5b80634e487706116102225780634e4877061461051657806352bdeb6d14610529578063542028d514610565575f80fd5b806345605267146104b657806349b7b802146104ef575f80fd5b8063267822471161029c5780633c351e10116102775780633c351e10146104015780633cbc795b1461042157806340b5de6c1461045e575f80fd5b806326782247146103875780632c111c06146103cc57806332c2d153146103ec575f80fd5b806305835f37116102cc57806305835f371461031c578063107bf28c1461036557806311e892d41461036d575f80fd5b8062d0295d146102e65780630350896314610301575b5f80fd5b6102ee6107df565b6040519081526020015b60405180910390f35b610309602081565b60405161ffff90911681526020016102f8565b6103586040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102f8919061395d565b6103586108e5565b61037560f981565b60405160ff90911681526020016102f8565b6001546103a79073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102f8565b6008546103a79073ffffffffffffffffffffffffffffffffffffffff1681565b6103ff6103fa3660046139af565b610971565b005b6009546103a79073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104499074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102f8565b6104857fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102f8565b6007546104d69068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102f8565b6103a77f000000000000000000000000000000000000000000000000000000000000000081565b6103ff6105243660046139ee565b610a40565b6103586040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610358610c4f565b6103ff61057b366004613b1c565b610c5c565b610309601f81565b6102ee6105963660046139ee565b60066020525f908152604090205481565b6102ee60055481565b6103ff6105be366004613ba7565b6111df565b6103ff6105d1366004613bd3565b6112a8565b6103586040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b6103ff611aad565b6103ff610628366004613ba7565b611b7f565b6103a773a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103ff610656366004613cc2565b611c97565b6103a77f000000000000000000000000000000000000000000000000000000000000000081565b610358610690366004613d01565b612323565b6103ff6106a3366004613ba7565b612701565b6103586127ca565b6102ee6405ca1ab1e081565b6007546104d690700100000000000000000000000000000000900467ffffffffffffffff1681565b61037560e481565b6103ff6106fa366004613d72565b6127e6565b6002546103a79073ffffffffffffffffffffffffffffffffffffffff1681565b6103a77f000000000000000000000000000000000000000000000000000000000000000081565b6102ee635ca1ab1e81565b6103a77f000000000000000000000000000000000000000000000000000000000000000081565b6007546104d69067ffffffffffffffff1681565b6103ff61079a366004613da4565b612878565b6103ff6107ad366004613e15565b612d3e565b610375601b81565b5f546103a79062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561086b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088f9190613e5d565b6007549091505f906108b99067ffffffffffffffff68010000000000000000820481169116613ea1565b67ffffffffffffffff169050805f036108d4575f9250505090565b6108de8183613ec9565b9250505090565b600480546108f290613f01565b80601f016020809104026020016040519081016040528092919081815260200182805461091e90613f01565b80156109695780601f1061094057610100808354040283529160200191610969565b820191905f5260205f20905b81548152906001019060200180831161094c57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109e0576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a3391815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a96576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610add576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b6a9190613f52565b610bcb5760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610bcb576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546108f290613f01565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610ccb576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff1615808015610ce957505f54600160ff909116105b80610d025750303b158015610d0257505f5460ff166001145b610d93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610def575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f6040518060a00160405280606281526020016146fd6062913990505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e84573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ea89190613e5d565b90505f868483858d610ebb600143613f71565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291505f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611003573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110279190613f8a565b90508b5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508a60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555089600390816110b89190613fea565b5060046110c58a82613fea565b508b60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fd2c80353fc15ef62c6affc7cd6b7ab5b42c43290c50be3372e55ae552cecd19c8187858e6040516111679493929190614102565b60405180910390a150505050505080156111d7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611235576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c44565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611317576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff161580801561133557505f54600160ff909116105b8061134e5750303b15801561134e57505f5460ff166001145b6113da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610d8a565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611436575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611694576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa1580156114dd573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526115229190810190614151565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d9060240160408051808303815f875af11580156115b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115d991906141c3565b915091508163ffffffff165f14611650576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055611691565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b6009545f906116db90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685612323565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611756573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061177a9190613e5d565b90505f808483858f61178d600143613f71565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af11580156118d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118f79190613f8a565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600390816119879190613fea565b5060046119948982613fea565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611a34939291906141fb565b60405180910390a15050505050508015611aa4575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611afe576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611bd5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611c24576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c44565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590611cd5575073ffffffffffffffffffffffffffffffffffffffff81163314155b15611d0c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d7a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d9e9190613f8a565b611da89190614239565b67ffffffffffffffff161115611dea576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003611e25576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611e61576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff80821691611e899184916801000000000000000090041661425a565b1115611ec1576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b8381101561215c575f878783818110611efc57611efc61426d565b9050602002810190611f0e919061429a565b611f17906142d6565b905083611f238161435c565b825180516020918201208185015160408087015160608801519151959a509295505f94611f8f948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f90815260069093529120549091508114612017576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f9081526006602052604081205561203b600188613f71565b84036120aa5742600760109054906101000a900467ffffffffffffffff1684604001516120689190614239565b67ffffffffffffffff1611156120aa576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209450505050808061215490614382565b915050611ee1565b506121d27f00000000000000000000000000000000000000000000000000000000000000008461218a6107df565b61219491906143b9565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016919061353f565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906122a3908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af11580156122bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122e39190613f8a565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f87604051602401612355969594939291906143d0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f036124a55760f9601f83516123e99190614432565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e48760405160200161248f979695949392919061444d565b60405160208183030381529060405290506125a9565b815161ffff10156124e2576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96124f1602083614432565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001612596979695949392919061452f565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015612607573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661267f576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f906126c49084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614611565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612757576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c44565b6040518060a00160405280606281526020016146fd6062913981565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff16331461283c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036128488282613fea565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c44919061395d565b60085473ffffffffffffffffffffffffffffffffffffffff1680158015906128b6575073ffffffffffffffffffffffffffffffffffffffff81163314155b156128ed576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015612956573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061297a9190613f52565b156129b1576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a1b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a3f9190613e5d565b905082811115612a7b576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388841115612ab7576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612af973ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613618565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b879190613e5d565b6007805491925067ffffffffffffffff909116905f612ba58361435c565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051612bdc92919061466c565b6040519081900390208142612bf2600143613f71565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f9081526006909352912055323303612ce8576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a26111d7565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93190612d2e90849033908b908b9061467b565b60405180910390a2505050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612d8f576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003612dca576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612e06576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612e6b575f80fd5b505af1158015612e7d573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612eeb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f0f9190613e5d565b60075460055491925042916801000000000000000090910467ffffffffffffffff1690815f5b86811015613230575f8a8a83818110612f5057612f5061426d565b9050602002810190612f62919061429a565b612f6b906142d6565b8051805160209091012060408201519192509067ffffffffffffffff161561314b5785612f978161435c565b9650505f81836020015184604001518560600151604051602001612ff99493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114613081576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f90555061321b565b8151516201d4c0101561318a576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b5050808061322890614382565b915050612f35565b5060075467ffffffffffffffff908116908416111561327b576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff84811690831614613330575f6132a08386613ea1565b90506132b667ffffffffffffffff821683613f71565b91506132ef7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661218a6107df565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b61342c337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133e39190613e5d565b6133ed91906143b9565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613618565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af11580156134c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134ec9190613f8a565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e7668860405161352a91815260200190565b60405180910390a25050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526136139084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261367c565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526136769085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613591565b50505050565b5f6136dd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166137879092919063ffffffff16565b80519091501561361357808060200190518101906136fb9190613f52565b613613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610d8a565b60606126f984845f85855f808673ffffffffffffffffffffffffffffffffffffffff1685876040516137b991906146eb565b5f6040518083038185875af1925050503d805f81146137f3576040519150601f19603f3d011682016040523d82523d5f602084013e6137f8565b606091505b509150915061380987838387613814565b979650505050505050565b606083156138a95782515f036138a25773ffffffffffffffffffffffffffffffffffffffff85163b6138a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d8a565b50816126f9565b6126f983838151156138be5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8a919061395d565b5f5b8381101561390c5781810151838201526020016138f4565b50505f910152565b5f815180845261392b8160208601602086016138f2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61396f6020830184613914565b9392505050565b67ffffffffffffffff8116811461398b575f80fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461398b575f80fd5b5f805f606084860312156139c1575f80fd5b83356139cc81613976565b92506020840135915060408401356139e38161398e565b809150509250925092565b5f602082840312156139fe575f80fd5b813561396f81613976565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613a7d57613a7d613a09565b604052919050565b5f67ffffffffffffffff821115613a9e57613a9e613a09565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112613ad9575f80fd5b8135613aec613ae782613a85565b613a36565b818152846020838601011115613b00575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f60a08688031215613b30575f80fd5b8535613b3b8161398e565b94506020860135613b4b8161398e565b9350604086013567ffffffffffffffff80821115613b67575f80fd5b613b7389838a01613aca565b94506060880135915080821115613b88575f80fd5b50613b9588828901613aca565b95989497509295608001359392505050565b5f60208284031215613bb7575f80fd5b813561396f8161398e565b63ffffffff8116811461398b575f80fd5b5f805f805f8060c08789031215613be8575f80fd5b8635613bf38161398e565b95506020870135613c038161398e565b94506040870135613c1381613bc2565b93506060870135613c238161398e565b9250608087013567ffffffffffffffff80821115613c3f575f80fd5b613c4b8a838b01613aca565b935060a0890135915080821115613c60575f80fd5b50613c6d89828a01613aca565b9150509295509295509295565b5f8083601f840112613c8a575f80fd5b50813567ffffffffffffffff811115613ca1575f80fd5b6020830191508360208260051b8501011115613cbb575f80fd5b9250929050565b5f8060208385031215613cd3575f80fd5b823567ffffffffffffffff811115613ce9575f80fd5b613cf585828601613c7a565b90969095509350505050565b5f805f8060808587031215613d14575f80fd5b8435613d1f81613bc2565b93506020850135613d2f8161398e565b92506040850135613d3f81613bc2565b9150606085013567ffffffffffffffff811115613d5a575f80fd5b613d6687828801613aca565b91505092959194509250565b5f60208284031215613d82575f80fd5b813567ffffffffffffffff811115613d98575f80fd5b6126f984828501613aca565b5f805f60408486031215613db6575f80fd5b833567ffffffffffffffff80821115613dcd575f80fd5b818601915086601f830112613de0575f80fd5b813581811115613dee575f80fd5b876020828501011115613dff575f80fd5b6020928301989097509590910135949350505050565b5f805f60408486031215613e27575f80fd5b833567ffffffffffffffff811115613e3d575f80fd5b613e4986828701613c7a565b90945092505060208401356139e38161398e565b5f60208284031215613e6d575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff828116828216039080821115613ec257613ec2613e74565b5092915050565b5f82613efc577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c90821680613f1557607f821691505b602082108103613f4c577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b5f60208284031215613f62575f80fd5b8151801515811461396f575f80fd5b81810381811115613f8457613f84613e74565b92915050565b5f60208284031215613f9a575f80fd5b815161396f81613976565b601f821115613613575f81815260208120601f850160051c81016020861015613fcb5750805b601f850160051c820191505b818110156111d757828155600101613fd7565b815167ffffffffffffffff81111561400457614004613a09565b614018816140128454613f01565b84613fa5565b602080601f83116001811461406a575f84156140345750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556111d7565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156140b657888601518255948401946001909101908401614097565b50858210156140f257878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff85168152608060208201525f6141246080830186613914565b905083604083015273ffffffffffffffffffffffffffffffffffffffff8316606083015295945050505050565b5f60208284031215614161575f80fd5b815167ffffffffffffffff811115614177575f80fd5b8201601f81018413614187575f80fd5b8051614195613ae782613a85565b8181528560208385010111156141a9575f80fd5b6141ba8260208301602086016138f2565b95945050505050565b5f80604083850312156141d4575f80fd5b82516141df81613bc2565b60208401519092506141f08161398e565b809150509250929050565b606081525f61420d6060830186613914565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff818116838216019080821115613ec257613ec2613e74565b80820180821115613f8457613f84613e74565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126142cc575f80fd5b9190910192915050565b5f608082360312156142e6575f80fd5b6040516080810167ffffffffffffffff828210818311171561430a5761430a613a09565b81604052843591508082111561431e575f80fd5b5061432b36828601613aca565b82525060208301356020820152604083013561434681613976565b6040820152606092830135928101929092525090565b5f67ffffffffffffffff80831681810361437857614378613e74565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143b2576143b2613e74565b5060010190565b8082028115828204841417613f8457613f84613e74565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261442660c0830184613914565b98975050505050505050565b61ffff818116838216019080821115613ec257613ec2613e74565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b16600184015287516144b5816003860160208c016138f2565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516144f8816017840160208b016138f2565b808201915050818660f81b1660178201528451915061451e8260188301602088016138f2565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614597816003860160208c016138f2565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516145da816017840160208b016138f2565b808201915050818660f01b166017820152845191506146008260198301602088016138f2565b016019019998505050505050505050565b5f8651614622818460208b016138f2565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f82516142cc8184602087016138f256fedf2a8080944d5cf5032b2a844602278b01199ed191a86c93ff8080821092808000000000000000000000000000000000000000000000000000000005ca1ab1e000000000000000000000000000000000000000000000000000000005ca1ab1e01bffa2646970667358221220922931e5d0570d6de206da26a8cb6cc8865aa3a1e27df595ba4f321c371781f664736f6c63430008140033", + "bytecode": "0x61010060405234801562000011575f80fd5b50604051620049603803806200496083398101604081905262000034916200006f565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d4565b6001600160a01b03811681146200006c575f80fd5b50565b5f805f806080858703121562000083575f80fd5b8451620000908162000057565b6020860151909450620000a38162000057565b6040860151909350620000b68162000057565b6060860151909250620000c98162000057565b939692955090935050565b60805160a05160c05160e051614794620001cc5f395f81816104f40152818161097301528181610adf01528181610c5e01528181610fa8015281816112aa0152818161187801528181611d130152818161216201528181612257015281816128ef015281816129b4015281816132bd0152818161333601528181613358015261346d01525f8181610660015281816114990152818161156e01528181612421015281816125290152612e0801525f818161072401528181610e1d015281816116ef01528181612afc0152612e8401525f818161075601528181610826015281816121ab01528181612ad1015261340401526147945ff3fe608060405234801561000f575f80fd5b50600436106102e2575f3560e01c80637a5460c511610187578063c7fffd4b116100dd578063e46761c411610093578063ecef3f991161006e578063ecef3f991461079f578063f35dda47146107b2578063f851a440146107ba575f80fd5b8063e46761c414610751578063e7a7ed0214610778578063eaeb077b1461078c575f80fd5b8063cfa8ed47116100c3578063cfa8ed47146106ff578063d02103ca1461071f578063d7bc90ff14610746575f80fd5b8063c7fffd4b146106e4578063c89e42df146106ec575f80fd5b8063a3c573eb1161013d578063af7f3e0211610118578063af7f3e02146106a8578063b0afe154146106b0578063c754c7ed146106bc575f80fd5b8063a3c573eb1461065b578063a652f26c14610682578063ada8f91914610695575f80fd5b806391cafe321161016d57806391cafe321461061a5780639e0018771461062d5780639f26f84014610648575f80fd5b80637a5460c5146105d65780638c3d730114610612575f80fd5b8063456052671161023c5780635d6717a5116101f25780636e05d2cd116101cd5780636e05d2cd146105a75780636ff512cc146105b057806371257022146105c3575f80fd5b80635d6717a51461056d578063676870d2146105805780636b8616ce14610588575f80fd5b80634e487706116102225780634e4877061461051657806352bdeb6d14610529578063542028d514610565575f80fd5b806345605267146104b657806349b7b802146104ef575f80fd5b8063267822471161029c5780633c351e10116102775780633c351e10146104015780633cbc795b1461042157806340b5de6c1461045e575f80fd5b806326782247146103875780632c111c06146103cc57806332c2d153146103ec575f80fd5b806305835f37116102cc57806305835f371461031c578063107bf28c1461036557806311e892d41461036d575f80fd5b8062d0295d146102e65780630350896314610301575b5f80fd5b6102ee6107df565b6040519081526020015b60405180910390f35b610309602081565b60405161ffff90911681526020016102f8565b6103586040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102f8919061395d565b6103586108e5565b61037560f981565b60405160ff90911681526020016102f8565b6001546103a79073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102f8565b6008546103a79073ffffffffffffffffffffffffffffffffffffffff1681565b6103ff6103fa3660046139af565b610971565b005b6009546103a79073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104499074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102f8565b6104857fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102f8565b6007546104d69068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102f8565b6103a77f000000000000000000000000000000000000000000000000000000000000000081565b6103ff6105243660046139ee565b610a40565b6103586040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610358610c4f565b6103ff61057b366004613b1c565b610c5c565b610309601f81565b6102ee6105963660046139ee565b60066020525f908152604090205481565b6102ee60055481565b6103ff6105be366004613ba7565b6111df565b6103ff6105d1366004613bd3565b6112a8565b6103586040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b6103ff611aad565b6103ff610628366004613ba7565b611b7f565b6103a773a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103ff610656366004613cc2565b611c97565b6103a77f000000000000000000000000000000000000000000000000000000000000000081565b610358610690366004613d01565b612323565b6103ff6106a3366004613ba7565b612701565b6103586127ca565b6102ee6405ca1ab1e081565b6007546104d690700100000000000000000000000000000000900467ffffffffffffffff1681565b61037560e481565b6103ff6106fa366004613d72565b6127e6565b6002546103a79073ffffffffffffffffffffffffffffffffffffffff1681565b6103a77f000000000000000000000000000000000000000000000000000000000000000081565b6102ee635ca1ab1e81565b6103a77f000000000000000000000000000000000000000000000000000000000000000081565b6007546104d69067ffffffffffffffff1681565b6103ff61079a366004613da4565b612878565b6103ff6107ad366004613e15565b612d3e565b610375601b81565b5f546103a79062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561086b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088f9190613e5d565b6007549091505f906108b99067ffffffffffffffff68010000000000000000820481169116613ea1565b67ffffffffffffffff169050805f036108d4575f9250505090565b6108de8183613ec9565b9250505090565b600480546108f290613f01565b80601f016020809104026020016040519081016040528092919081815260200182805461091e90613f01565b80156109695780601f1061094057610100808354040283529160200191610969565b820191905f5260205f20905b81548152906001019060200180831161094c57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109e0576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a3391815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a96576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610add576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b6a9190613f52565b610bcb5760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610bcb576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546108f290613f01565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610ccb576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff1615808015610ce957505f54600160ff909116105b80610d025750303b158015610d0257505f5460ff166001145b610d93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610def575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f6040518060a00160405280606281526020016146fd6062913990505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e84573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ea89190613e5d565b90505f868483858d610ebb600143613f71565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291505f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611003573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110279190613f8a565b90508b5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508a60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555089600390816110b89190613fea565b5060046110c58a82613fea565b508b60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fd2c80353fc15ef62c6affc7cd6b7ab5b42c43290c50be3372e55ae552cecd19c8187858e6040516111679493929190614102565b60405180910390a150505050505080156111d7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611235576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c44565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611317576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff161580801561133557505f54600160ff909116105b8061134e5750303b15801561134e57505f5460ff166001145b6113da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610d8a565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611436575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611694576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa1580156114dd573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526115229190810190614151565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d9060240160408051808303815f875af11580156115b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115d991906141c3565b915091508163ffffffff165f14611650576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055611691565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b6009545f906116db90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685612323565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611756573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061177a9190613e5d565b90505f808483858f61178d600143613f71565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af11580156118d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118f79190613f8a565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600390816119879190613fea565b5060046119948982613fea565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611a34939291906141fb565b60405180910390a15050505050508015611aa4575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611afe576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611bd5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611c24576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c44565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590611cd5575073ffffffffffffffffffffffffffffffffffffffff81163314155b15611d0c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d7a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d9e9190613f8a565b611da89190614239565b67ffffffffffffffff161115611dea576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003611e25576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611e61576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff80821691611e899184916801000000000000000090041661425a565b1115611ec1576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b8381101561215c575f878783818110611efc57611efc61426d565b9050602002810190611f0e919061429a565b611f17906142d6565b905083611f238161435c565b825180516020918201208185015160408087015160608801519151959a509295505f94611f8f948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f90815260069093529120549091508114612017576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f9081526006602052604081205561203b600188613f71565b84036120aa5742600760109054906101000a900467ffffffffffffffff1684604001516120689190614239565b67ffffffffffffffff1611156120aa576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209450505050808061215490614382565b915050611ee1565b506121d27f00000000000000000000000000000000000000000000000000000000000000008461218a6107df565b61219491906143b9565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016919061353f565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906122a3908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af11580156122bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122e39190613f8a565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f87604051602401612355969594939291906143d0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f036124a55760f9601f83516123e99190614432565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e48760405160200161248f979695949392919061444d565b60405160208183030381529060405290506125a9565b815161ffff10156124e2576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96124f1602083614432565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001612596979695949392919061452f565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015612607573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661267f576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f906126c49084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614611565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612757576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c44565b6040518060a00160405280606281526020016146fd6062913981565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff16331461283c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036128488282613fea565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c44919061395d565b60085473ffffffffffffffffffffffffffffffffffffffff1680158015906128b6575073ffffffffffffffffffffffffffffffffffffffff81163314155b156128ed576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015612956573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061297a9190613f52565b156129b1576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a1b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a3f9190613e5d565b905082811115612a7b576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388841115612ab7576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612af973ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613618565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b879190613e5d565b6007805491925067ffffffffffffffff909116905f612ba58361435c565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051612bdc92919061466c565b6040519081900390208142612bf2600143613f71565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f9081526006909352912055323303612ce8576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a26111d7565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93190612d2e90849033908b908b9061467b565b60405180910390a2505050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612d8f576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003612dca576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612e06576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612e6b575f80fd5b505af1158015612e7d573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612eeb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f0f9190613e5d565b60075460055491925042916801000000000000000090910467ffffffffffffffff1690815f5b86811015613230575f8a8a83818110612f5057612f5061426d565b9050602002810190612f62919061429a565b612f6b906142d6565b8051805160209091012060408201519192509067ffffffffffffffff161561314b5785612f978161435c565b9650505f81836020015184604001518560600151604051602001612ff99493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114613081576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f90555061321b565b8151516201d4c0101561318a576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b5050808061322890614382565b915050612f35565b5060075467ffffffffffffffff908116908416111561327b576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff84811690831614613330575f6132a08386613ea1565b90506132b667ffffffffffffffff821683613f71565b91506132ef7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661218a6107df565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b61342c337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133e39190613e5d565b6133ed91906143b9565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613618565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af11580156134c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134ec9190613f8a565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e7668860405161352a91815260200190565b60405180910390a25050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526136139084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261367c565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526136769085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613591565b50505050565b5f6136dd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166137879092919063ffffffff16565b80519091501561361357808060200190518101906136fb9190613f52565b613613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610d8a565b60606126f984845f85855f808673ffffffffffffffffffffffffffffffffffffffff1685876040516137b991906146eb565b5f6040518083038185875af1925050503d805f81146137f3576040519150601f19603f3d011682016040523d82523d5f602084013e6137f8565b606091505b509150915061380987838387613814565b979650505050505050565b606083156138a95782515f036138a25773ffffffffffffffffffffffffffffffffffffffff85163b6138a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d8a565b50816126f9565b6126f983838151156138be5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8a919061395d565b5f5b8381101561390c5781810151838201526020016138f4565b50505f910152565b5f815180845261392b8160208601602086016138f2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61396f6020830184613914565b9392505050565b67ffffffffffffffff8116811461398b575f80fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461398b575f80fd5b5f805f606084860312156139c1575f80fd5b83356139cc81613976565b92506020840135915060408401356139e38161398e565b809150509250925092565b5f602082840312156139fe575f80fd5b813561396f81613976565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613a7d57613a7d613a09565b604052919050565b5f67ffffffffffffffff821115613a9e57613a9e613a09565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112613ad9575f80fd5b8135613aec613ae782613a85565b613a36565b818152846020838601011115613b00575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f60a08688031215613b30575f80fd5b8535613b3b8161398e565b94506020860135613b4b8161398e565b9350604086013567ffffffffffffffff80821115613b67575f80fd5b613b7389838a01613aca565b94506060880135915080821115613b88575f80fd5b50613b9588828901613aca565b95989497509295608001359392505050565b5f60208284031215613bb7575f80fd5b813561396f8161398e565b63ffffffff8116811461398b575f80fd5b5f805f805f8060c08789031215613be8575f80fd5b8635613bf38161398e565b95506020870135613c038161398e565b94506040870135613c1381613bc2565b93506060870135613c238161398e565b9250608087013567ffffffffffffffff80821115613c3f575f80fd5b613c4b8a838b01613aca565b935060a0890135915080821115613c60575f80fd5b50613c6d89828a01613aca565b9150509295509295509295565b5f8083601f840112613c8a575f80fd5b50813567ffffffffffffffff811115613ca1575f80fd5b6020830191508360208260051b8501011115613cbb575f80fd5b9250929050565b5f8060208385031215613cd3575f80fd5b823567ffffffffffffffff811115613ce9575f80fd5b613cf585828601613c7a565b90969095509350505050565b5f805f8060808587031215613d14575f80fd5b8435613d1f81613bc2565b93506020850135613d2f8161398e565b92506040850135613d3f81613bc2565b9150606085013567ffffffffffffffff811115613d5a575f80fd5b613d6687828801613aca565b91505092959194509250565b5f60208284031215613d82575f80fd5b813567ffffffffffffffff811115613d98575f80fd5b6126f984828501613aca565b5f805f60408486031215613db6575f80fd5b833567ffffffffffffffff80821115613dcd575f80fd5b818601915086601f830112613de0575f80fd5b813581811115613dee575f80fd5b876020828501011115613dff575f80fd5b6020928301989097509590910135949350505050565b5f805f60408486031215613e27575f80fd5b833567ffffffffffffffff811115613e3d575f80fd5b613e4986828701613c7a565b90945092505060208401356139e38161398e565b5f60208284031215613e6d575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff828116828216039080821115613ec257613ec2613e74565b5092915050565b5f82613efc577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c90821680613f1557607f821691505b602082108103613f4c577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b5f60208284031215613f62575f80fd5b8151801515811461396f575f80fd5b81810381811115613f8457613f84613e74565b92915050565b5f60208284031215613f9a575f80fd5b815161396f81613976565b601f821115613613575f81815260208120601f850160051c81016020861015613fcb5750805b601f850160051c820191505b818110156111d757828155600101613fd7565b815167ffffffffffffffff81111561400457614004613a09565b614018816140128454613f01565b84613fa5565b602080601f83116001811461406a575f84156140345750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556111d7565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156140b657888601518255948401946001909101908401614097565b50858210156140f257878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff85168152608060208201525f6141246080830186613914565b905083604083015273ffffffffffffffffffffffffffffffffffffffff8316606083015295945050505050565b5f60208284031215614161575f80fd5b815167ffffffffffffffff811115614177575f80fd5b8201601f81018413614187575f80fd5b8051614195613ae782613a85565b8181528560208385010111156141a9575f80fd5b6141ba8260208301602086016138f2565b95945050505050565b5f80604083850312156141d4575f80fd5b82516141df81613bc2565b60208401519092506141f08161398e565b809150509250929050565b606081525f61420d6060830186613914565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff818116838216019080821115613ec257613ec2613e74565b80820180821115613f8457613f84613e74565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126142cc575f80fd5b9190910192915050565b5f608082360312156142e6575f80fd5b6040516080810167ffffffffffffffff828210818311171561430a5761430a613a09565b81604052843591508082111561431e575f80fd5b5061432b36828601613aca565b82525060208301356020820152604083013561434681613976565b6040820152606092830135928101929092525090565b5f67ffffffffffffffff80831681810361437857614378613e74565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143b2576143b2613e74565b5060010190565b8082028115828204841417613f8457613f84613e74565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261442660c0830184613914565b98975050505050505050565b61ffff818116838216019080821115613ec257613ec2613e74565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b16600184015287516144b5816003860160208c016138f2565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516144f8816017840160208b016138f2565b808201915050818660f81b1660178201528451915061451e8260188301602088016138f2565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614597816003860160208c016138f2565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516145da816017840160208b016138f2565b808201915050818660f01b166017820152845191506146008260198301602088016138f2565b016019019998505050505050505050565b5f8651614622818460208b016138f2565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f82516142cc8184602087016138f256fedf2a8080944d5cf5032b2a844602278b01199ed191a86c93ff8080821092808000000000000000000000000000000000000000000000000000000005ca1ab1e000000000000000000000000000000000000000000000000000000005ca1ab1e01bffa26469706673582212206697eafa21fba8a031d4ac93c3dcdfd36f3e0b6f94d82844d97899e0769dcbda64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106102e2575f3560e01c80637a5460c511610187578063c7fffd4b116100dd578063e46761c411610093578063ecef3f991161006e578063ecef3f991461079f578063f35dda47146107b2578063f851a440146107ba575f80fd5b8063e46761c414610751578063e7a7ed0214610778578063eaeb077b1461078c575f80fd5b8063cfa8ed47116100c3578063cfa8ed47146106ff578063d02103ca1461071f578063d7bc90ff14610746575f80fd5b8063c7fffd4b146106e4578063c89e42df146106ec575f80fd5b8063a3c573eb1161013d578063af7f3e0211610118578063af7f3e02146106a8578063b0afe154146106b0578063c754c7ed146106bc575f80fd5b8063a3c573eb1461065b578063a652f26c14610682578063ada8f91914610695575f80fd5b806391cafe321161016d57806391cafe321461061a5780639e0018771461062d5780639f26f84014610648575f80fd5b80637a5460c5146105d65780638c3d730114610612575f80fd5b8063456052671161023c5780635d6717a5116101f25780636e05d2cd116101cd5780636e05d2cd146105a75780636ff512cc146105b057806371257022146105c3575f80fd5b80635d6717a51461056d578063676870d2146105805780636b8616ce14610588575f80fd5b80634e487706116102225780634e4877061461051657806352bdeb6d14610529578063542028d514610565575f80fd5b806345605267146104b657806349b7b802146104ef575f80fd5b8063267822471161029c5780633c351e10116102775780633c351e10146104015780633cbc795b1461042157806340b5de6c1461045e575f80fd5b806326782247146103875780632c111c06146103cc57806332c2d153146103ec575f80fd5b806305835f37116102cc57806305835f371461031c578063107bf28c1461036557806311e892d41461036d575f80fd5b8062d0295d146102e65780630350896314610301575b5f80fd5b6102ee6107df565b6040519081526020015b60405180910390f35b610309602081565b60405161ffff90911681526020016102f8565b6103586040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102f8919061395d565b6103586108e5565b61037560f981565b60405160ff90911681526020016102f8565b6001546103a79073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102f8565b6008546103a79073ffffffffffffffffffffffffffffffffffffffff1681565b6103ff6103fa3660046139af565b610971565b005b6009546103a79073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104499074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102f8565b6104857fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102f8565b6007546104d69068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102f8565b6103a77f000000000000000000000000000000000000000000000000000000000000000081565b6103ff6105243660046139ee565b610a40565b6103586040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610358610c4f565b6103ff61057b366004613b1c565b610c5c565b610309601f81565b6102ee6105963660046139ee565b60066020525f908152604090205481565b6102ee60055481565b6103ff6105be366004613ba7565b6111df565b6103ff6105d1366004613bd3565b6112a8565b6103586040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b6103ff611aad565b6103ff610628366004613ba7565b611b7f565b6103a773a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103ff610656366004613cc2565b611c97565b6103a77f000000000000000000000000000000000000000000000000000000000000000081565b610358610690366004613d01565b612323565b6103ff6106a3366004613ba7565b612701565b6103586127ca565b6102ee6405ca1ab1e081565b6007546104d690700100000000000000000000000000000000900467ffffffffffffffff1681565b61037560e481565b6103ff6106fa366004613d72565b6127e6565b6002546103a79073ffffffffffffffffffffffffffffffffffffffff1681565b6103a77f000000000000000000000000000000000000000000000000000000000000000081565b6102ee635ca1ab1e81565b6103a77f000000000000000000000000000000000000000000000000000000000000000081565b6007546104d69067ffffffffffffffff1681565b6103ff61079a366004613da4565b612878565b6103ff6107ad366004613e15565b612d3e565b610375601b81565b5f546103a79062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561086b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088f9190613e5d565b6007549091505f906108b99067ffffffffffffffff68010000000000000000820481169116613ea1565b67ffffffffffffffff169050805f036108d4575f9250505090565b6108de8183613ec9565b9250505090565b600480546108f290613f01565b80601f016020809104026020016040519081016040528092919081815260200182805461091e90613f01565b80156109695780601f1061094057610100808354040283529160200191610969565b820191905f5260205f20905b81548152906001019060200180831161094c57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109e0576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a3391815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a96576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610add576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b6a9190613f52565b610bcb5760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610bcb576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546108f290613f01565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610ccb576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff1615808015610ce957505f54600160ff909116105b80610d025750303b158015610d0257505f5460ff166001145b610d93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610def575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f6040518060a00160405280606281526020016146fd6062913990505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e84573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ea89190613e5d565b90505f868483858d610ebb600143613f71565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291505f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611003573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110279190613f8a565b90508b5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508a60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555089600390816110b89190613fea565b5060046110c58a82613fea565b508b60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fd2c80353fc15ef62c6affc7cd6b7ab5b42c43290c50be3372e55ae552cecd19c8187858e6040516111679493929190614102565b60405180910390a150505050505080156111d7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611235576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c44565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611317576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff161580801561133557505f54600160ff909116105b8061134e5750303b15801561134e57505f5460ff166001145b6113da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610d8a565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611436575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff851615611694576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa1580156114dd573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526115229190810190614151565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d9060240160408051808303815f875af11580156115b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115d991906141c3565b915091508163ffffffff165f14611650576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055611691565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b6009545f906116db90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685612323565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611756573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061177a9190613e5d565b90505f808483858f61178d600143613f71565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af11580156118d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118f79190613f8a565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600390816119879190613fea565b5060046119948982613fea565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611a34939291906141fb565b60405180910390a15050505050508015611aa4575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611afe576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611bd5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611c24576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c44565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590611cd5575073ffffffffffffffffffffffffffffffffffffffff81163314155b15611d0c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d7a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d9e9190613f8a565b611da89190614239565b67ffffffffffffffff161115611dea576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003611e25576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611e61576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff80821691611e899184916801000000000000000090041661425a565b1115611ec1576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b8381101561215c575f878783818110611efc57611efc61426d565b9050602002810190611f0e919061429a565b611f17906142d6565b905083611f238161435c565b825180516020918201208185015160408087015160608801519151959a509295505f94611f8f948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f90815260069093529120549091508114612017576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f9081526006602052604081205561203b600188613f71565b84036120aa5742600760109054906101000a900467ffffffffffffffff1684604001516120689190614239565b67ffffffffffffffff1611156120aa576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209450505050808061215490614382565b915050611ee1565b506121d27f00000000000000000000000000000000000000000000000000000000000000008461218a6107df565b61219491906143b9565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016919061353f565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e73906122a3908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af11580156122bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122e39190613f8a565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f87604051602401612355969594939291906143d0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f036124a55760f9601f83516123e99190614432565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e48760405160200161248f979695949392919061444d565b60405160208183030381529060405290506125a9565b815161ffff10156124e2576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96124f1602083614432565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001612596979695949392919061452f565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015612607573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661267f576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f906126c49084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614611565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612757576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c44565b6040518060a00160405280606281526020016146fd6062913981565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff16331461283c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036128488282613fea565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c44919061395d565b60085473ffffffffffffffffffffffffffffffffffffffff1680158015906128b6575073ffffffffffffffffffffffffffffffffffffffff81163314155b156128ed576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015612956573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061297a9190613f52565b156129b1576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a1b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a3f9190613e5d565b905082811115612a7b576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388841115612ab7576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612af973ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613618565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b879190613e5d565b6007805491925067ffffffffffffffff909116905f612ba58361435c565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051612bdc92919061466c565b6040519081900390208142612bf2600143613f71565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f9081526006909352912055323303612ce8576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a26111d7565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93190612d2e90849033908b908b9061467b565b60405180910390a2505050505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314612d8f576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003612dca576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612e06576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612e6b575f80fd5b505af1158015612e7d573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612eeb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f0f9190613e5d565b60075460055491925042916801000000000000000090910467ffffffffffffffff1690815f5b86811015613230575f8a8a83818110612f5057612f5061426d565b9050602002810190612f62919061429a565b612f6b906142d6565b8051805160209091012060408201519192509067ffffffffffffffff161561314b5785612f978161435c565b9650505f81836020015184604001518560600151604051602001612ff99493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114613081576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f90555061321b565b8151516201d4c0101561318a576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b5050808061322890614382565b915050612f35565b5060075467ffffffffffffffff908116908416111561327b576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff84811690831614613330575f6132a08386613ea1565b90506132b667ffffffffffffffff821683613f71565b91506132ef7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661218a6107df565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b61342c337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133e39190613e5d565b6133ed91906143b9565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613618565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af11580156134c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134ec9190613f8a565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e7668860405161352a91815260200190565b60405180910390a25050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526136139084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261367c565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526136769085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613591565b50505050565b5f6136dd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166137879092919063ffffffff16565b80519091501561361357808060200190518101906136fb9190613f52565b613613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610d8a565b60606126f984845f85855f808673ffffffffffffffffffffffffffffffffffffffff1685876040516137b991906146eb565b5f6040518083038185875af1925050503d805f81146137f3576040519150601f19603f3d011682016040523d82523d5f602084013e6137f8565b606091505b509150915061380987838387613814565b979650505050505050565b606083156138a95782515f036138a25773ffffffffffffffffffffffffffffffffffffffff85163b6138a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d8a565b50816126f9565b6126f983838151156138be5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8a919061395d565b5f5b8381101561390c5781810151838201526020016138f4565b50505f910152565b5f815180845261392b8160208601602086016138f2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61396f6020830184613914565b9392505050565b67ffffffffffffffff8116811461398b575f80fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461398b575f80fd5b5f805f606084860312156139c1575f80fd5b83356139cc81613976565b92506020840135915060408401356139e38161398e565b809150509250925092565b5f602082840312156139fe575f80fd5b813561396f81613976565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613a7d57613a7d613a09565b604052919050565b5f67ffffffffffffffff821115613a9e57613a9e613a09565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112613ad9575f80fd5b8135613aec613ae782613a85565b613a36565b818152846020838601011115613b00575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f60a08688031215613b30575f80fd5b8535613b3b8161398e565b94506020860135613b4b8161398e565b9350604086013567ffffffffffffffff80821115613b67575f80fd5b613b7389838a01613aca565b94506060880135915080821115613b88575f80fd5b50613b9588828901613aca565b95989497509295608001359392505050565b5f60208284031215613bb7575f80fd5b813561396f8161398e565b63ffffffff8116811461398b575f80fd5b5f805f805f8060c08789031215613be8575f80fd5b8635613bf38161398e565b95506020870135613c038161398e565b94506040870135613c1381613bc2565b93506060870135613c238161398e565b9250608087013567ffffffffffffffff80821115613c3f575f80fd5b613c4b8a838b01613aca565b935060a0890135915080821115613c60575f80fd5b50613c6d89828a01613aca565b9150509295509295509295565b5f8083601f840112613c8a575f80fd5b50813567ffffffffffffffff811115613ca1575f80fd5b6020830191508360208260051b8501011115613cbb575f80fd5b9250929050565b5f8060208385031215613cd3575f80fd5b823567ffffffffffffffff811115613ce9575f80fd5b613cf585828601613c7a565b90969095509350505050565b5f805f8060808587031215613d14575f80fd5b8435613d1f81613bc2565b93506020850135613d2f8161398e565b92506040850135613d3f81613bc2565b9150606085013567ffffffffffffffff811115613d5a575f80fd5b613d6687828801613aca565b91505092959194509250565b5f60208284031215613d82575f80fd5b813567ffffffffffffffff811115613d98575f80fd5b6126f984828501613aca565b5f805f60408486031215613db6575f80fd5b833567ffffffffffffffff80821115613dcd575f80fd5b818601915086601f830112613de0575f80fd5b813581811115613dee575f80fd5b876020828501011115613dff575f80fd5b6020928301989097509590910135949350505050565b5f805f60408486031215613e27575f80fd5b833567ffffffffffffffff811115613e3d575f80fd5b613e4986828701613c7a565b90945092505060208401356139e38161398e565b5f60208284031215613e6d575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff828116828216039080821115613ec257613ec2613e74565b5092915050565b5f82613efc577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c90821680613f1557607f821691505b602082108103613f4c577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b5f60208284031215613f62575f80fd5b8151801515811461396f575f80fd5b81810381811115613f8457613f84613e74565b92915050565b5f60208284031215613f9a575f80fd5b815161396f81613976565b601f821115613613575f81815260208120601f850160051c81016020861015613fcb5750805b601f850160051c820191505b818110156111d757828155600101613fd7565b815167ffffffffffffffff81111561400457614004613a09565b614018816140128454613f01565b84613fa5565b602080601f83116001811461406a575f84156140345750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556111d7565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156140b657888601518255948401946001909101908401614097565b50858210156140f257878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff85168152608060208201525f6141246080830186613914565b905083604083015273ffffffffffffffffffffffffffffffffffffffff8316606083015295945050505050565b5f60208284031215614161575f80fd5b815167ffffffffffffffff811115614177575f80fd5b8201601f81018413614187575f80fd5b8051614195613ae782613a85565b8181528560208385010111156141a9575f80fd5b6141ba8260208301602086016138f2565b95945050505050565b5f80604083850312156141d4575f80fd5b82516141df81613bc2565b60208401519092506141f08161398e565b809150509250929050565b606081525f61420d6060830186613914565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff818116838216019080821115613ec257613ec2613e74565b80820180821115613f8457613f84613e74565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126142cc575f80fd5b9190910192915050565b5f608082360312156142e6575f80fd5b6040516080810167ffffffffffffffff828210818311171561430a5761430a613a09565b81604052843591508082111561431e575f80fd5b5061432b36828601613aca565b82525060208301356020820152604083013561434681613976565b6040820152606092830135928101929092525090565b5f67ffffffffffffffff80831681810361437857614378613e74565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143b2576143b2613e74565b5060010190565b8082028115828204841417613f8457613f84613e74565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261442660c0830184613914565b98975050505050505050565b61ffff818116838216019080821115613ec257613ec2613e74565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b16600184015287516144b5816003860160208c016138f2565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516144f8816017840160208b016138f2565b808201915050818660f81b1660178201528451915061451e8260188301602088016138f2565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614597816003860160208c016138f2565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516145da816017840160208b016138f2565b808201915050818660f01b166017820152845191506146008260198301602088016138f2565b016019019998505050505050505050565b5f8651614622818460208b016138f2565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f82516142cc8184602087016138f256fedf2a8080944d5cf5032b2a844602278b01199ed191a86c93ff8080821092808000000000000000000000000000000000000000000000000000000005ca1ab1e000000000000000000000000000000000000000000000000000000005ca1ab1e01bffa26469706673582212206697eafa21fba8a031d4ac93c3dcdfd36f3e0b6f94d82844d97899e0769dcbda64736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/compiled-contracts/PolygonZkEVMGlobalExitRootV2.json b/compiled-contracts/PolygonZkEVMGlobalExitRootV2.json index 9edc24b29..ad6c5bf25 100644 --- a/compiled-contracts/PolygonZkEVMGlobalExitRootV2.json +++ b/compiled-contracts/PolygonZkEVMGlobalExitRootV2.json @@ -264,8 +264,8 @@ "type": "function" } ], - "bytecode": "0x60c060405234801561000f575f80fd5b50604051610b03380380610b0383398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a051610a436100c05f395f818161014101526102ba01525f8181610210015261026e0152610a435ff3fe608060405234801561000f575f80fd5b50600436106100cf575f3560e01c806349b7b8021161007d57806383f244031161005857806383f24403146101f8578063a3c573eb1461020b578063fb57083414610232575f80fd5b806349b7b8021461013c5780635ca1e165146101885780635d81050114610190575f80fd5b8063319cf735116100ad578063319cf7351461011657806333d6247d1461011f5780633ed691ef14610134575f80fd5b806301fd9044146100d3578063257b3632146100ee5780632dfdf0b51461010d575b5f80fd5b6100db5f5481565b6040519081526020015b60405180910390f35b6100db6100fc366004610709565b60026020525f908152604090205481565b6100db60235481565b6100db60015481565b61013261012d366004610709565b610255565b005b6100db6103f6565b6101637f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e5565b6100db610409565b6100db61019e366004610720565b604080516020808201959095528082019390935260c09190911b7fffffffffffffffff0000000000000000000000000000000000000000000000001660608301528051604881840301815260689092019052805191012090565b6100db61020636600461078b565b610412565b6101637f000000000000000000000000000000000000000000000000000000000000000081565b6102456102403660046107c7565b6104e7565b60405190151581526020016100e5565b5f8073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102a357505060018190555f5481610322565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102f05750505f8190556001548190610322565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61032d82846104fe565b5f81815260026020526040812054919250036103f0575f61034f600143610839565b5f8381526002602090815260409182902092409283905581518082018690528083018490527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b16606082015282518082036048018152606890910190925281519101209091506103c29061052d565b604051849084907fda61aa7823fcd807e37b95aabcbe17f03a6f3efd514176444dae191d27fd66b3905f90a3505b50505050565b5f6104046001545f546104fe565b905090565b5f61040461062d565b5f83815b60208110156104de57600163ffffffff8516821c81169003610481578481602081106104445761044461084c565b602002013582604051602001610464929190918252602082015260400190565b6040516020818303038152906040528051906020012091506104cc565b818582602081106104945761049461084c565b60200201356040516020016104b3929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806104d681610879565b915050610416565b50949350505050565b5f816104f4868686610412565b1495945050505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b80600161053c602060026109ce565b6105469190610839565b60235410610580576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60235f815461058f90610879565b918290555090505f5b602081101561061f578082901c6001166001036105cb5782600382602081106105c3576105c361084c565b015550505050565b600381602081106105de576105de61084c565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061061790610879565b915050610598565b506106286109e0565b505050565b6023545f90819081805b6020811015610700578083901c60011660010361069457600381602081106106615761066161084c565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506106c1565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806106f890610879565b915050610637565b50919392505050565b5f60208284031215610719575f80fd5b5035919050565b5f805f60608486031215610732575f80fd5b8335925060208401359150604084013567ffffffffffffffff81168114610757575f80fd5b809150509250925092565b806104008101831015610527575f80fd5b803563ffffffff81168114610786575f80fd5b919050565b5f805f610440848603121561079e575f80fd5b833592506107af8560208601610762565b91506107be6104208501610773565b90509250925092565b5f805f8061046085870312156107db575f80fd5b843593506107ec8660208701610762565b92506107fb6104208601610773565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156105275761052761080c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036108a9576108a961080c565b5060010190565b600181815b8085111561090957817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156108ef576108ef61080c565b808516156108fc57918102915b93841c93908002906108b5565b509250929050565b5f8261091f57506001610527565b8161092b57505f610527565b8160018114610941576002811461094b57610967565b6001915050610527565b60ff84111561095c5761095c61080c565b50506001821b610527565b5060208310610133831016604e8410600b841016171561098a575081810a610527565b61099483836108b0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109c6576109c661080c565b029392505050565b5f6109d98383610911565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea2646970667358221220a1a389f08a07b9fd272cd0baaf253440b508b79131978be4696b2c15b2091f3364736f6c63430008140033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106100cf575f3560e01c806349b7b8021161007d57806383f244031161005857806383f24403146101f8578063a3c573eb1461020b578063fb57083414610232575f80fd5b806349b7b8021461013c5780635ca1e165146101885780635d81050114610190575f80fd5b8063319cf735116100ad578063319cf7351461011657806333d6247d1461011f5780633ed691ef14610134575f80fd5b806301fd9044146100d3578063257b3632146100ee5780632dfdf0b51461010d575b5f80fd5b6100db5f5481565b6040519081526020015b60405180910390f35b6100db6100fc366004610709565b60026020525f908152604090205481565b6100db60235481565b6100db60015481565b61013261012d366004610709565b610255565b005b6100db6103f6565b6101637f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e5565b6100db610409565b6100db61019e366004610720565b604080516020808201959095528082019390935260c09190911b7fffffffffffffffff0000000000000000000000000000000000000000000000001660608301528051604881840301815260689092019052805191012090565b6100db61020636600461078b565b610412565b6101637f000000000000000000000000000000000000000000000000000000000000000081565b6102456102403660046107c7565b6104e7565b60405190151581526020016100e5565b5f8073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102a357505060018190555f5481610322565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102f05750505f8190556001548190610322565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61032d82846104fe565b5f81815260026020526040812054919250036103f0575f61034f600143610839565b5f8381526002602090815260409182902092409283905581518082018690528083018490527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b16606082015282518082036048018152606890910190925281519101209091506103c29061052d565b604051849084907fda61aa7823fcd807e37b95aabcbe17f03a6f3efd514176444dae191d27fd66b3905f90a3505b50505050565b5f6104046001545f546104fe565b905090565b5f61040461062d565b5f83815b60208110156104de57600163ffffffff8516821c81169003610481578481602081106104445761044461084c565b602002013582604051602001610464929190918252602082015260400190565b6040516020818303038152906040528051906020012091506104cc565b818582602081106104945761049461084c565b60200201356040516020016104b3929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806104d681610879565b915050610416565b50949350505050565b5f816104f4868686610412565b1495945050505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b80600161053c602060026109ce565b6105469190610839565b60235410610580576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60235f815461058f90610879565b918290555090505f5b602081101561061f578082901c6001166001036105cb5782600382602081106105c3576105c361084c565b015550505050565b600381602081106105de576105de61084c565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061061790610879565b915050610598565b506106286109e0565b505050565b6023545f90819081805b6020811015610700578083901c60011660010361069457600381602081106106615761066161084c565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506106c1565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806106f890610879565b915050610637565b50919392505050565b5f60208284031215610719575f80fd5b5035919050565b5f805f60608486031215610732575f80fd5b8335925060208401359150604084013567ffffffffffffffff81168114610757575f80fd5b809150509250925092565b806104008101831015610527575f80fd5b803563ffffffff81168114610786575f80fd5b919050565b5f805f610440848603121561079e575f80fd5b833592506107af8560208601610762565b91506107be6104208501610773565b90509250925092565b5f805f8061046085870312156107db575f80fd5b843593506107ec8660208701610762565b92506107fb6104208601610773565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156105275761052761080c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036108a9576108a961080c565b5060010190565b600181815b8085111561090957817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156108ef576108ef61080c565b808516156108fc57918102915b93841c93908002906108b5565b509250929050565b5f8261091f57506001610527565b8161092b57505f610527565b8160018114610941576002811461094b57610967565b6001915050610527565b60ff84111561095c5761095c61080c565b50506001821b610527565b5060208310610133831016604e8410600b841016171561098a575081810a610527565b61099483836108b0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109c6576109c661080c565b029392505050565b5f6109d98383610911565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea2646970667358221220a1a389f08a07b9fd272cd0baaf253440b508b79131978be4696b2c15b2091f3364736f6c63430008140033", + "bytecode": "0x60c060405234801561000f575f80fd5b50604051610b03380380610b0383398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a051610a436100c05f395f818161014101526102ba01525f8181610210015261026e0152610a435ff3fe608060405234801561000f575f80fd5b50600436106100cf575f3560e01c806349b7b8021161007d57806383f244031161005857806383f24403146101f8578063a3c573eb1461020b578063fb57083414610232575f80fd5b806349b7b8021461013c5780635ca1e165146101885780635d81050114610190575f80fd5b8063319cf735116100ad578063319cf7351461011657806333d6247d1461011f5780633ed691ef14610134575f80fd5b806301fd9044146100d3578063257b3632146100ee5780632dfdf0b51461010d575b5f80fd5b6100db5f5481565b6040519081526020015b60405180910390f35b6100db6100fc366004610709565b60026020525f908152604090205481565b6100db60235481565b6100db60015481565b61013261012d366004610709565b610255565b005b6100db6103f6565b6101637f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e5565b6100db610409565b6100db61019e366004610720565b604080516020808201959095528082019390935260c09190911b7fffffffffffffffff0000000000000000000000000000000000000000000000001660608301528051604881840301815260689092019052805191012090565b6100db61020636600461078b565b610412565b6101637f000000000000000000000000000000000000000000000000000000000000000081565b6102456102403660046107c7565b6104e7565b60405190151581526020016100e5565b5f8073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102a357505060018190555f5481610322565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102f05750505f8190556001548190610322565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61032d82846104fe565b5f81815260026020526040812054919250036103f0575f61034f600143610839565b5f8381526002602090815260409182902092409283905581518082018690528083018490527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b16606082015282518082036048018152606890910190925281519101209091506103c29061052d565b604051849084907fda61aa7823fcd807e37b95aabcbe17f03a6f3efd514176444dae191d27fd66b3905f90a3505b50505050565b5f6104046001545f546104fe565b905090565b5f61040461062d565b5f83815b60208110156104de57600163ffffffff8516821c81169003610481578481602081106104445761044461084c565b602002013582604051602001610464929190918252602082015260400190565b6040516020818303038152906040528051906020012091506104cc565b818582602081106104945761049461084c565b60200201356040516020016104b3929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806104d681610879565b915050610416565b50949350505050565b5f816104f4868686610412565b1495945050505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b80600161053c602060026109ce565b6105469190610839565b60235410610580576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60235f815461058f90610879565b918290555090505f5b602081101561061f578082901c6001166001036105cb5782600382602081106105c3576105c361084c565b015550505050565b600381602081106105de576105de61084c565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061061790610879565b915050610598565b506106286109e0565b505050565b6023545f90819081805b6020811015610700578083901c60011660010361069457600381602081106106615761066161084c565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506106c1565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806106f890610879565b915050610637565b50919392505050565b5f60208284031215610719575f80fd5b5035919050565b5f805f60608486031215610732575f80fd5b8335925060208401359150604084013567ffffffffffffffff81168114610757575f80fd5b809150509250925092565b806104008101831015610527575f80fd5b803563ffffffff81168114610786575f80fd5b919050565b5f805f610440848603121561079e575f80fd5b833592506107af8560208601610762565b91506107be6104208501610773565b90509250925092565b5f805f8061046085870312156107db575f80fd5b843593506107ec8660208701610762565b92506107fb6104208601610773565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156105275761052761080c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036108a9576108a961080c565b5060010190565b600181815b8085111561090957817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156108ef576108ef61080c565b808516156108fc57918102915b93841c93908002906108b5565b509250929050565b5f8261091f57506001610527565b8161092b57505f610527565b8160018114610941576002811461094b57610967565b6001915050610527565b60ff84111561095c5761095c61080c565b50506001821b610527565b5060208310610133831016604e8410600b841016171561098a575081810a610527565b61099483836108b0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109c6576109c661080c565b029392505050565b5f6109d98383610911565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea2646970667358221220953e84c75d31ad6f589ac4d27c5dcbb1a540ad1cc461d3fdfbae34f10fde439364736f6c63430008140033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106100cf575f3560e01c806349b7b8021161007d57806383f244031161005857806383f24403146101f8578063a3c573eb1461020b578063fb57083414610232575f80fd5b806349b7b8021461013c5780635ca1e165146101885780635d81050114610190575f80fd5b8063319cf735116100ad578063319cf7351461011657806333d6247d1461011f5780633ed691ef14610134575f80fd5b806301fd9044146100d3578063257b3632146100ee5780632dfdf0b51461010d575b5f80fd5b6100db5f5481565b6040519081526020015b60405180910390f35b6100db6100fc366004610709565b60026020525f908152604090205481565b6100db60235481565b6100db60015481565b61013261012d366004610709565b610255565b005b6100db6103f6565b6101637f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e5565b6100db610409565b6100db61019e366004610720565b604080516020808201959095528082019390935260c09190911b7fffffffffffffffff0000000000000000000000000000000000000000000000001660608301528051604881840301815260689092019052805191012090565b6100db61020636600461078b565b610412565b6101637f000000000000000000000000000000000000000000000000000000000000000081565b6102456102403660046107c7565b6104e7565b60405190151581526020016100e5565b5f8073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102a357505060018190555f5481610322565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102f05750505f8190556001548190610322565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61032d82846104fe565b5f81815260026020526040812054919250036103f0575f61034f600143610839565b5f8381526002602090815260409182902092409283905581518082018690528083018490527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b16606082015282518082036048018152606890910190925281519101209091506103c29061052d565b604051849084907fda61aa7823fcd807e37b95aabcbe17f03a6f3efd514176444dae191d27fd66b3905f90a3505b50505050565b5f6104046001545f546104fe565b905090565b5f61040461062d565b5f83815b60208110156104de57600163ffffffff8516821c81169003610481578481602081106104445761044461084c565b602002013582604051602001610464929190918252602082015260400190565b6040516020818303038152906040528051906020012091506104cc565b818582602081106104945761049461084c565b60200201356040516020016104b3929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806104d681610879565b915050610416565b50949350505050565b5f816104f4868686610412565b1495945050505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b80600161053c602060026109ce565b6105469190610839565b60235410610580576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60235f815461058f90610879565b918290555090505f5b602081101561061f578082901c6001166001036105cb5782600382602081106105c3576105c361084c565b015550505050565b600381602081106105de576105de61084c565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061061790610879565b915050610598565b506106286109e0565b505050565b6023545f90819081805b6020811015610700578083901c60011660010361069457600381602081106106615761066161084c565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506106c1565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806106f890610879565b915050610637565b50919392505050565b5f60208284031215610719575f80fd5b5035919050565b5f805f60608486031215610732575f80fd5b8335925060208401359150604084013567ffffffffffffffff81168114610757575f80fd5b809150509250925092565b806104008101831015610527575f80fd5b803563ffffffff81168114610786575f80fd5b919050565b5f805f610440848603121561079e575f80fd5b833592506107af8560208601610762565b91506107be6104208501610773565b90509250925092565b5f805f8061046085870312156107db575f80fd5b843593506107ec8660208701610762565b92506107fb6104208601610773565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156105275761052761080c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036108a9576108a961080c565b5060010190565b600181815b8085111561090957817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156108ef576108ef61080c565b808516156108fc57918102915b93841c93908002906108b5565b509250929050565b5f8261091f57506001610527565b8161092b57505f610527565b8160018114610941576002811461094b57610967565b6001915050610527565b60ff84111561095c5761095c61080c565b50506001821b610527565b5060208310610133831016604e8410600b841016171561098a575081810a610527565b61099483836108b0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109c6576109c661080c565b029392505050565b5f6109d98383610911565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea2646970667358221220953e84c75d31ad6f589ac4d27c5dcbb1a540ad1cc461d3fdfbae34f10fde439364736f6c63430008140033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/contracts/v2/interfaces/IDataAvailabilityProtocol.sol b/contracts/v2/interfaces/IDataAvailabilityProtocol.sol index 21d812143..284e9de93 100644 --- a/contracts/v2/interfaces/IDataAvailabilityProtocol.sol +++ b/contracts/v2/interfaces/IDataAvailabilityProtocol.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.20; +pragma solidity ^0.8.20; interface IDataAvailabilityProtocol { function getProcotolName() external view returns (string memory); diff --git a/contracts/v2/interfaces/IPolygonRollupBase.sol b/contracts/v2/interfaces/IPolygonRollupBase.sol index cd95f9a9b..cd373f428 100644 --- a/contracts/v2/interfaces/IPolygonRollupBase.sol +++ b/contracts/v2/interfaces/IPolygonRollupBase.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.20; +pragma solidity ^0.8.20; interface IPolygonRollupBase { function initialize( diff --git a/contracts/v2/interfaces/IPolygonRollupManager.sol b/contracts/v2/interfaces/IPolygonRollupManager.sol index 0e2de7332..b841f0383 100644 --- a/contracts/v2/interfaces/IPolygonRollupManager.sol +++ b/contracts/v2/interfaces/IPolygonRollupManager.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.20; +pragma solidity ^0.8.20; interface IPolygonRollupManager { /** diff --git a/contracts/v2/lib/DepositContractBase.sol b/contracts/v2/lib/DepositContractBase.sol index a93f0a90f..9faecc97b 100644 --- a/contracts/v2/lib/DepositContractBase.sol +++ b/contracts/v2/lib/DepositContractBase.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.20; +pragma solidity ^0.8.20; /** * This contract will be used as a helper for all the sparse merkle tree related functions diff --git a/contracts/v2/lib/DepositContractV2.sol b/contracts/v2/lib/DepositContractV2.sol index 57995dfb4..2a2313fec 100644 --- a/contracts/v2/lib/DepositContractV2.sol +++ b/contracts/v2/lib/DepositContractV2.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.20; +pragma solidity ^0.8.20; import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; import "./DepositContractBase.sol"; diff --git a/contracts/v2/lib/LegacyZKEVMStateVariables.sol b/contracts/v2/lib/LegacyZKEVMStateVariables.sol index 3802a9865..377e79dfd 100644 --- a/contracts/v2/lib/LegacyZKEVMStateVariables.sol +++ b/contracts/v2/lib/LegacyZKEVMStateVariables.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.20; +pragma solidity ^0.8.20; /** * Since the current contract of PolygonZkEVM will be upgraded to a PolygonRollupManager there's defined diff --git a/contracts/v2/lib/PolygonAccessControlUpgradeable.sol b/contracts/v2/lib/PolygonAccessControlUpgradeable.sol index d0ed7d030..0807d5d4c 100644 --- a/contracts/v2/lib/PolygonAccessControlUpgradeable.sol +++ b/contracts/v2/lib/PolygonAccessControlUpgradeable.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol) -pragma solidity 0.8.20; +pragma solidity ^0.8.20; import "@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"; diff --git a/contracts/v2/lib/PolygonConstantsBase.sol b/contracts/v2/lib/PolygonConstantsBase.sol index 6050be9c1..fe65fbaf7 100644 --- a/contracts/v2/lib/PolygonConstantsBase.sol +++ b/contracts/v2/lib/PolygonConstantsBase.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.20; +pragma solidity ^0.8.20; /** * This contract will contain the constants used across different contracts diff --git a/contracts/v2/lib/PolygonZkEVMGlobalExitRootBaseStorage.sol b/contracts/v2/lib/PolygonZkEVMGlobalExitRootBaseStorage.sol index 2f8b48c7e..f4226dfdd 100644 --- a/contracts/v2/lib/PolygonZkEVMGlobalExitRootBaseStorage.sol +++ b/contracts/v2/lib/PolygonZkEVMGlobalExitRootBaseStorage.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: AGPL-3.0 -pragma solidity 0.8.20; +pragma solidity ^0.8.20; import "../interfaces/IPolygonZkEVMGlobalExitRootV2.sol"; /** From 9eeb0fb19baf28c4d8db051ad9c994dc91ba05d8 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Sat, 27 Jan 2024 14:45:28 +0100 Subject: [PATCH 181/230] update commmnets --- contracts/v2/PolygonRollupManager.sol | 25 +++++++++++-------- contracts/v2/PolygonZkEVMBridgeV2.sol | 12 ++++----- contracts/v2/PolygonZkEVMGlobalExitRootV2.sol | 3 +-- .../v2/interfaces/IPolygonZkEVMBridgeV2.sol | 2 +- contracts/v2/lib/PolygonRollupBaseEtrog.sol | 10 +++----- .../v2/create_rollup_parameters.json.example | 2 +- hardhat.config.ts | 4 +-- test/contractsv2/PolygonRollupManager.test.ts | 8 ++++++ 8 files changed, 36 insertions(+), 30 deletions(-) diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol index 7cd32139c..dd8240b9c 100644 --- a/contracts/v2/PolygonRollupManager.sol +++ b/contracts/v2/PolygonRollupManager.sol @@ -15,9 +15,11 @@ import "./lib/LegacyZKEVMStateVariables.sol"; import "./consensus/zkEVM/PolygonZkEVMExistentEtrog.sol"; import "./lib/PolygonConstantsBase.sol"; -// review Possible renaming to PolygonL2Manager /** - * Contract responsible for managing the exit roots across multiple Rollups + * Contract responsible for managing rollups and the verification of their batches. + * This contract will create and update rollups and store all the hashed sequenced data from them. + * The logic for sequence batches is moved to the `consensus` contracts, while the verification of all of + * them will be done in this one. In this way, the proof aggregation of the rollups will be easier on a close future. */ contract PolygonRollupManager is PolygonAccessControlUpgradeable, @@ -200,14 +202,14 @@ contract PolygonRollupManager is uint64 public pendingStateTimeout; // Time target of the verification of a batch - // Adaptatly the batchFee will be updated to achieve this target + // Adaptively the batchFee will be updated to achieve this target uint64 public verifyBatchTimeTarget; // Batch fee multiplier with 3 decimals that goes from 1000 - 1023 uint16 public multiplierBatchFee; // Current POL fee per batch sequenced - // note This variable is internal, since the view function getBatchFee is likely to be ugpraded + // note This variable is internal, since the view function getBatchFee is likely to be upgraded uint256 internal _batchFee; // Timestamp when the last emergency state was deactivated @@ -369,7 +371,7 @@ contract PolygonRollupManager is } /** - * @param trustedAggregator Trusted aggregatot address + * @param trustedAggregator Trusted aggregator address * @param _pendingStateTimeout Pending state timeout * @param _trustedAggregatorTimeout Trusted aggregator timeout * @param admin Admin of the rollup manager @@ -423,7 +425,7 @@ contract PolygonRollupManager is _setupRole(_STOP_EMERGENCY_ROLE, admin); _setupRole(_TWEAK_PARAMETERS_ROLE, admin); - // admin should be able to update the trsuted aggregator address + // admin should be able to update the trusted aggregator address _setRoleAdmin(_TRUSTED_AGGREGATOR_ROLE, _TRUSTED_AGGREGATOR_ROLE_ADMIN); _setupRole(_TRUSTED_AGGREGATOR_ROLE_ADMIN, admin); _setupRole(_SET_FEE_ROLE, admin); @@ -908,7 +910,7 @@ contract PolygonRollupManager is } /** - * @notice Allows an aggregator to verify multiple batches + * @notice Allows a trusted aggregator to verify multiple batches * @param rollupID Rollup identifier * @param pendingStateNum Init pending state, 0 if consolidated state is used * @param initNumBatch Batch which the aggregator starts the verification @@ -972,6 +974,7 @@ contract PolygonRollupManager is * @param finalNewBatch Last batch aggregator intends to verify * @param newLocalExitRoot New local exit root once the batch is processed * @param newStateRoot New State root once the batch is processed + * @param beneficiary Address that will receive the verification reward * @param proof Fflonk proof */ function _verifyAndRewardBatches( @@ -1227,7 +1230,7 @@ contract PolygonRollupManager is } /** - * @notice Allows to halt the PolygonZkEVM if its possible to prove a different state root given the same batches + * @notice Allows activate the emergency state if its possible to prove a different state root given the same batches * @param rollupID Rollup identifier * @param initPendingStateNum Init pending state, 0 if consolidated state is used * @param finalPendingStateNum Final pending state, that will be used to compare with the newStateRoot @@ -1475,7 +1478,7 @@ contract PolygonRollupManager is //////////////////////// /** - * @notice Function to activate emergency state, which also enables the emergency mode on both PolygonZkEVM and PolygonZkEVMBridge contracts + * @notice Function to activate emergency state, which also enables the emergency mode on both PolygonRollupManager and PolygonZkEVMBridge contracts * If not called by the owner must not have been aggregated in a _HALT_AGGREGATION_TIMEOUT period and an emergency state was not happened in the same period */ function activateEmergencyState() external { @@ -1495,7 +1498,7 @@ contract PolygonRollupManager is } /** - * @notice Function to deactivate emergency state on both PolygonZkEVM and PolygonZkEVMBridge contracts + * @notice Function to deactivate emergency state on both PolygonRollupManager and PolygonZkEVMBridge contracts */ function deactivateEmergencyState() external @@ -1512,7 +1515,7 @@ contract PolygonRollupManager is } /** - * @notice Internal function to activate emergency state on both PolygonZkEVM and PolygonZkEVMBridge contracts + * @notice Internal function to activate emergency state on both PolygonRollupManager and PolygonZkEVMBridge contracts */ function _activateEmergencyState() internal override { // Activate emergency state on PolygonZkEVM Bridge diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol index 9e1c86624..8f88fa8e5 100644 --- a/contracts/v2/PolygonZkEVMBridgeV2.sol +++ b/contracts/v2/PolygonZkEVMBridgeV2.sol @@ -12,9 +12,8 @@ import "./interfaces/IPolygonZkEVMBridgeV2.sol"; import "../lib/EmergencyManager.sol"; import "../lib/GlobalExitRootLib.sol"; -// review Possible renaming to PolygonBridge /** - * PolygonZkEVMBridge that will be deployed on both networks Ethereum and Polygon zkEVM + * PolygonZkEVMBridge that will be deployed on Ethereum and all Polygon rollups * Contract responsible to manage the token interactions with other networks */ contract PolygonZkEVMBridgeV2 is @@ -142,6 +141,7 @@ contract PolygonZkEVMBridgeV2 is * @param _polygonRollupManager polygonZkEVM address * @notice The value of `_polygonRollupManager` on the L2 deployment of the contract will be address(0), so * emergency state is not possible for the L2 deployment of the bridge, intentionally + * @param _gasTokenMetadata Abi encoded gas token metadata */ function initialize( uint32 _networkID, @@ -425,8 +425,8 @@ contract PolygonZkEVMBridgeV2 is /** * @notice Verify merkle proof and withdraw tokens/ether - * @param smtProofLocalExitRoot Smt proof to proof the leaf agains the exit root - * @param smtProofRollupExitRoot Smt proof to proof the rollupLocalExitRoot agains the RollupExitRoot + * @param smtProofLocalExitRoot Smt proof to proof the leaf against the network exit root + * @param smtProofRollupExitRoot Smt proof to proof the rollupLocalExitRoot against the rollups exit root * @param globalIndex Global index is defined as: * | 191 bits | 1 bit | 32 bits | 32 bits | * | 0 | mainnetFlag | rollupIndex | localRootIndex | @@ -578,8 +578,8 @@ contract PolygonZkEVMBridgeV2 is * If the receiving address is an EOA, the call will result as a success * Which means that the amount of ether will be transferred correctly, but the message * will not trigger any execution - * @param smtProofLocalExitRoot Smt proof to proof the leaf agains the exit root - * @param smtProofRollupExitRoot Smt proof to proof the rollupLocalExitRoot agains the RollupExitRoot + * @param smtProofLocalExitRoot Smt proof to proof the leaf against the exit root + * @param smtProofRollupExitRoot Smt proof to proof the rollupLocalExitRoot against the rollups exit root * @param globalIndex Global index is defined as: * | 191 bits | 1 bit | 32 bits | 32 bits | * | 0 | mainnetFlag | rollupIndex | localRootIndex | diff --git a/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol b/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol index f0c8da74b..824ac3e8f 100644 --- a/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol +++ b/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol @@ -7,7 +7,6 @@ import "./lib/PolygonZkEVMGlobalExitRootBaseStorage.sol"; import "../lib/GlobalExitRootLib.sol"; import "./lib/DepositContractBase.sol"; -/// review Possible renaming to PolygonGlobalExitRootManager /** * Contract responsible for managing the exit roots across multiple networks */ @@ -30,7 +29,7 @@ contract PolygonZkEVMGlobalExitRootV2 is ); /** - * @param _rollupManager Rollup contract address + * @param _rollupManager Rollup manager contract address * @param _bridgeAddress PolygonZkEVMBridge contract address */ constructor(address _rollupManager, address _bridgeAddress) { diff --git a/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol b/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol index 389ef54dd..aab8c6af8 100644 --- a/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol +++ b/contracts/v2/interfaces/IPolygonZkEVMBridgeV2.sol @@ -91,7 +91,7 @@ interface IPolygonZkEVMBridgeV2 { function wrappedTokenToTokenInfo( address destinationAddress - ) external returns (uint32, address); + ) external view returns (uint32, address); function updateGlobalExitRoot() external; diff --git a/contracts/v2/lib/PolygonRollupBaseEtrog.sol b/contracts/v2/lib/PolygonRollupBaseEtrog.sol index 89da97fc2..09c59e003 100644 --- a/contracts/v2/lib/PolygonRollupBaseEtrog.sol +++ b/contracts/v2/lib/PolygonRollupBaseEtrog.sol @@ -12,8 +12,6 @@ import "../interfaces/IPolygonZkEVMBridgeV2.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol"; import "./PolygonConstantsBase.sol"; -// review Possible renaming to PolygonL2BaseEtrog - /** * Contract responsible for managing the states and the updates of L2 network. * There will be a trusted sequencer, which is able to send transactions. @@ -28,7 +26,6 @@ contract PolygonRollupBaseEtrog is IPolygonZkEVMVEtrogErrors, IPolygonRollupBase { - // Interface cehcks renaming using SafeERC20Upgradeable for IERC20Upgradeable; /** @@ -148,7 +145,7 @@ contract PolygonRollupBaseEtrog is // Rollup manager PolygonRollupManager public immutable rollupManager; - // Address that will be able to adjust contract parameters or stop the emergency state + // Address that will be able to adjust contract parameters address public admin; // This account will be able to accept the admin role @@ -169,7 +166,7 @@ contract PolygonRollupBaseEtrog is // Queue of forced batches with their associated data // ForceBatchNum --> hashedForcedBatchData // hashedForcedBatchData: hash containing the necessary information to force a batch: - // keccak256(keccak256(bytes transactions), bytes32 globalExitRoot, unint64 minForcedTimestamp) + // keccak256(keccak256(bytes transactions), bytes32 forcedGlobalExitRoot, unint64 forcedTimestamp, bytes32 forcedBlockHashL1) mapping(uint64 => bytes32) public forcedBatches; // Last forced batch @@ -848,6 +845,7 @@ contract PolygonRollupBaseEtrog is * @param networkID Indicates the network identifier that will be used in the bridge * @param _gasTokenAddress Indicates the token address that will be used to pay gas fees in the new rollup * @param _gasTokenNetwork Indicates the native network of the token address + * @param _gasTokenMetadata Abi encoded gas token metadata */ function generateInitializeTransaction( uint32 networkID, @@ -855,8 +853,6 @@ contract PolygonRollupBaseEtrog is uint32 _gasTokenNetwork, bytes memory _gasTokenMetadata ) public view returns (bytes memory) { - // Check the ecrecover, as a sanity check, to not allow invalid transactions - bytes memory initializeBrigeData = abi.encodeCall( IPolygonZkEVMBridgeV2.initialize, ( diff --git a/deployment/v2/create_rollup_parameters.json.example b/deployment/v2/create_rollup_parameters.json.example index dc6dd2f8e..c37fbcdd4 100644 --- a/deployment/v2/create_rollup_parameters.json.example +++ b/deployment/v2/create_rollup_parameters.json.example @@ -6,7 +6,7 @@ "trustedSequencer":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", "chainID": 1001, "adminZkEVM":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", - "forkID": 1, + "forkID": 7, "consensusContract": "PolygonZkEVMEtrog", "gasTokenAddress":"", "deployerPvtKey": "", diff --git a/hardhat.config.ts b/hardhat.config.ts index 51fb887b6..30d4cdf4c 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -80,7 +80,7 @@ const config: HardhatUserConfig = { settings: { optimizer: { enabled: true, - runs: 99, + runs: 500, }, evmVersion: "shanghai", }, // try yul optimizer @@ -121,7 +121,7 @@ const config: HardhatUserConfig = { settings: { optimizer: { enabled: true, - runs: 99, + runs: 500, }, evmVersion: "shanghai", }, // try yul optimizer diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts index 2d814532a..2eaec4d78 100644 --- a/test/contractsv2/PolygonRollupManager.test.ts +++ b/test/contractsv2/PolygonRollupManager.test.ts @@ -2210,6 +2210,10 @@ describe("Polygon Rollup Manager", () => { await snapshotUpdateRollup.restore(); + expect(await upgrades.erc1967.getImplementationAddress(newZKEVMAddress as string)).to.be.equal( + PolygonZKEVMV2Contract.target + ); + await expect(rollupManagerContract.connect(timelock).updateRollup(newZKEVMAddress, etrogRollupType, "0x")) .to.emit(rollupManagerContract, "UpdateRollup") .withArgs(newRollupTypeID, etrogRollupType, newVerifiedBatch); @@ -2228,6 +2232,10 @@ describe("Polygon Rollup Manager", () => { expect(rollupDataFinal.lastVerifiedBatchBeforeUpgrade).to.be.equal(newVerifiedBatch); expect(rollupDataFinal.rollupTypeID).to.be.equal(etrogRollupType); expect(rollupDataFinal.rollupCompatibilityID).to.be.equal(0); + + expect(await upgrades.erc1967.getImplementationAddress(newZKEVMAddress as string)).to.be.equal( + PolygonZKEVMEtrogContract.target + ); }); it("should add existing rollup and test full flow", async () => { From 37ad23db709be2c2309dd3f4b39512d634d75e5b Mon Sep 17 00:00:00 2001 From: invocamanman Date: Sat, 27 Jan 2024 14:58:40 +0100 Subject: [PATCH 182/230] package json mainnet scripts --- package.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 80e8cff97..3f14ed55f 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,9 @@ "saveUpgradeV2:sepolia": "mkdir -p upgrade/upgradeToV2/sepolia_$(date +%s) && cp -r upgrade/upgradeToV2/upgrade_*.json upgrade/upgradeToV2/sepolia_$(date +%s) && cp -r upgrade/upgradeToV2/deploy_*.json upgrade/upgradeToV2/sepolia_$(date +%s) && cp .openzeppelin/sepolia.json upgrade/upgradeToV2/sepolia_$(date +%s)", "saveUpgradeV2:goerli": "mkdir -p upgrade/upgradeToV2/goerli_$(date +%s) && cp -r upgrade/upgradeToV2/upgrade_*.json upgrade/upgradeToV2/goerli_$(date +%s) && cp -r upgrade/upgradeToV2/deploy_*.json upgrade/upgradeToV2/goerli_$(date +%s) && cp .openzeppelin/goerli.json upgrade/upgradeToV2/goerli_$(date +%s)", "upgradev2L2:timelock:polygonZKEVMTestnet": "npx hardhat run upgrade/upgradeToV2/upgradeL2ToV2.ts --network polygonZKEVMTestnet", - "upgradev2L2:timelock:polygonZKEVMMainnet": "npx hardhat run upgrade/upgradeToV2/upgradeL2ToV2.ts --network polygonZKEVMMainnet" - + "upgradev2L2:timelock:polygonZKEVMMainnet": "npx hardhat run upgrade/upgradeToV2/upgradeL2ToV2.ts --network polygonZKEVMMainnet", + "upgradev2:timelock:mainnet": "npx hardhat run upgrade/upgradeToV2/upgradeToV2.ts --network mainnet && npm run saveUpgradeV2:mainnet", + "verify:upgradeV2:mainnet": "npx hardhat run upgrade/upgradeToV2/verifyContracts.ts --network mainnet", + "saveUpgradeV2:mainnet": "mkdir -p upgrade/upgradeToV2/mainnet_$(date +%s) && cp -r upgrade/upgradeToV2/upgrade_*.json upgrade/upgradeToV2/mainnet_$(date +%s) && cp -r upgrade/upgradeToV2/deploy_*.json upgrade/upgradeToV2/mainnet_$(date +%s) && cp .openzeppelin/mainnet.json upgrade/upgradeToV2/mainnet_$(date +%s)" } } \ No newline at end of file From df92e462c353077018fa42d18d659bf06f90bc1d Mon Sep 17 00:00:00 2001 From: invocamanman Date: Sat, 27 Jan 2024 18:24:29 +0100 Subject: [PATCH 183/230] update mainnet upgrade --- .../deploy_output_mainnet.json | 22 + .../deploy_parameters_mainnet.json | 20 + .../mainnet_1706364989/mainnet.json | 2489 +++++++++++++++++ .../mainnet_1706364989/upgrade_output.json | 7 + .../mainnet_1706364989/upgrade_outputL2.json | 5 + .../upgrade_parameters_mainnet.json | 7 + upgrade/upgradeToV2/upgradeL2ToV2.ts | 2 +- 7 files changed, 2551 insertions(+), 1 deletion(-) create mode 100644 upgrade/upgradeToV2/mainnet_1706364989/deploy_output_mainnet.json create mode 100644 upgrade/upgradeToV2/mainnet_1706364989/deploy_parameters_mainnet.json create mode 100644 upgrade/upgradeToV2/mainnet_1706364989/mainnet.json create mode 100644 upgrade/upgradeToV2/mainnet_1706364989/upgrade_output.json create mode 100644 upgrade/upgradeToV2/mainnet_1706364989/upgrade_outputL2.json create mode 100644 upgrade/upgradeToV2/mainnet_1706364989/upgrade_parameters_mainnet.json diff --git a/upgrade/upgradeToV2/mainnet_1706364989/deploy_output_mainnet.json b/upgrade/upgradeToV2/mainnet_1706364989/deploy_output_mainnet.json new file mode 100644 index 000000000..b26e1454d --- /dev/null +++ b/upgrade/upgradeToV2/mainnet_1706364989/deploy_output_mainnet.json @@ -0,0 +1,22 @@ +{ + "polygonZkEVMAddress": "0x5132A183E9F3CB7C848b0AAC5Ae0c4f0491B7aB2", + "polygonZkEVMBridgeAddress": "0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe", + "polygonZkEVMGlobalExitRootAddress": "0x580bda1e7A0CFAe92Fa7F6c20A3794F169CE3CFb", + "maticTokenAddress": "0x7D1AfA7B718fb893dB30A3aBc0Cfc608AaCfeBB0", + "verifierAddress": "0x4F9A0e7FD2Bf6067db6994CF12E4495Df938E6e9", + "zkEVMDeployerContract": "0xCB19eDdE626906eB1EE52357a27F62dd519608C2", + "deployerAddress": "0x7c280C055CBf830F77D6DA3a6363e961E0B91C7d", + "timelockContractAddress": "0xEf1462451C30Ea7aD8555386226059Fe837CA4EF", + "deploymentBlockNumber": 16896721, + "genesisRoot": "0x3f86b09b43e3e49a41fc20a07579b79eba044253367817d5c241d23c0e2bc5c9", + "trustedSequencer": "0x148Ee7dAF16574cD020aFa34CC658f8F3fbd2800", + "trustedSequencerURL": "https://zkevm-rpc.com/", + "chainID": 1101, + "networkName": "polygon zkEVM", + "admin": "0x242daE44F5d8fb54B198D03a94dA45B5a4413e21", + "trustedAggregator": "0xdA87c4a76922598Ac0272F4D9503a35071D686eA", + "proxyAdminAddress": "0x0F99738B2Fc14D77308337f3e2596b63aE7BCC4A", + "forkID": 4, + "salt": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", + "version": "v1.1.0-fork.4" + } \ No newline at end of file diff --git a/upgrade/upgradeToV2/mainnet_1706364989/deploy_parameters_mainnet.json b/upgrade/upgradeToV2/mainnet_1706364989/deploy_parameters_mainnet.json new file mode 100644 index 000000000..12fcc2ecf --- /dev/null +++ b/upgrade/upgradeToV2/mainnet_1706364989/deploy_parameters_mainnet.json @@ -0,0 +1,20 @@ +{ + "realVerifier": true, + "trustedSequencerURL": "https://zkevm-rpc.com/", + "networkName": "polygon zkEVM", + "version": "v1.1.0-fork.4", + "trustedSequencer": "0x148Ee7dAF16574cD020aFa34CC658f8F3fbd2800", + "chainID": 1101, + "trustedAggregator": "0xdA87c4a76922598Ac0272F4D9503a35071D686eA", + "trustedAggregatorTimeout": 432000, + "pendingStateTimeout": 432000, + "forkID": 4, + "admin": "0x242daE44F5d8fb54B198D03a94dA45B5a4413e21", + "zkEVMOwner": "0x242daE44F5d8fb54B198D03a94dA45B5a4413e21", + "timelockAddress": "0x4c1665d6651ecEfa59B9B3041951608468b18891", + "minDelayTimelock": 864000, + "salt": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", + "zkEVMDeployerAddress": "0xCB19eDdE626906eB1EE52357a27F62dd519608C2", + "initialZkEVMDeployerOwner": "0x4c1665d6651ecEfa59B9B3041951608468b18891", + "maticTokenAddress": "0x7D1AfA7B718fb893dB30A3aBc0Cfc608AaCfeBB0" + } \ No newline at end of file diff --git a/upgrade/upgradeToV2/mainnet_1706364989/mainnet.json b/upgrade/upgradeToV2/mainnet_1706364989/mainnet.json new file mode 100644 index 000000000..be3d0f8b0 --- /dev/null +++ b/upgrade/upgradeToV2/mainnet_1706364989/mainnet.json @@ -0,0 +1,2489 @@ +{ + "manifestVersion": "3.2", + "admin": { + "address": "0x0F99738B2Fc14D77308337f3e2596b63aE7BCC4A" + }, + "proxies": [ + { + "address": "0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe", + "kind": "transparent" + }, + { + "address": "0x580bda1e7A0CFAe92Fa7F6c20A3794F169CE3CFb", + "txHash": "0x9946be78d6c6d19dd1c6c7134a8fac27e76d32cad36dae2398d28fe6ff838f10", + "kind": "transparent" + }, + { + "address": "0x5132A183E9F3CB7C848b0AAC5Ae0c4f0491B7aB2", + "txHash": "0xe34243804e1f7257acb09c97d0d6f023663200c39ee85a1e6927b0b391710bbb", + "kind": "transparent" + } + ], + "impls": { + "7d81d3d49439b439759dc4a136c30bff477402e06213014f3132a9b83751e779": { + "address": "0x5ac4182A1dd41AeEf465E40B82fd326BF66AB82C", + "layout": { + "solcVersion": "0.8.17", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67" + }, + { + "label": "_status", + "offset": 0, + "slot": "1", + "type": "t_uint256", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:38" + }, + { + "label": "__gap", + "offset": 0, + "slot": "2", + "type": "t_array(t_uint256)49_storage", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:80" + }, + { + "label": "_branch", + "offset": 0, + "slot": "51", + "type": "t_array(t_bytes32)32_storage", + "contract": "DepositContract", + "src": "contracts/lib/DepositContract.sol:25" + }, + { + "label": "depositCount", + "offset": 0, + "slot": "83", + "type": "t_uint256", + "contract": "DepositContract", + "src": "contracts/lib/DepositContract.sol:28" + }, + { + "label": "_gap", + "offset": 0, + "slot": "84", + "type": "t_array(t_uint256)10_storage", + "contract": "DepositContract", + "src": "contracts/lib/DepositContract.sol:34" + }, + { + "label": "_gap", + "offset": 0, + "slot": "94", + "type": "t_array(t_uint256)10_storage", + "contract": "EmergencyManager", + "src": "contracts/lib/EmergencyManager.sol:23" + }, + { + "label": "isEmergencyState", + "offset": 0, + "slot": "104", + "type": "t_bool", + "contract": "EmergencyManager", + "src": "contracts/lib/EmergencyManager.sol:26" + }, + { + "label": "networkID", + "offset": 1, + "slot": "104", + "type": "t_uint32", + "contract": "PolygonZkEVMBridge", + "src": "contracts/PolygonZkEVMBridge.sol:51" + }, + { + "label": "globalExitRootManager", + "offset": 5, + "slot": "104", + "type": "t_contract(IBasePolygonZkEVMGlobalExitRoot)10065", + "contract": "PolygonZkEVMBridge", + "src": "contracts/PolygonZkEVMBridge.sol:54" + }, + { + "label": "lastUpdatedDepositCount", + "offset": 25, + "slot": "104", + "type": "t_uint32", + "contract": "PolygonZkEVMBridge", + "src": "contracts/PolygonZkEVMBridge.sol:57" + }, + { + "label": "claimedBitMap", + "offset": 0, + "slot": "105", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "PolygonZkEVMBridge", + "src": "contracts/PolygonZkEVMBridge.sol:60" + }, + { + "label": "tokenInfoToWrappedToken", + "offset": 0, + "slot": "106", + "type": "t_mapping(t_bytes32,t_address)", + "contract": "PolygonZkEVMBridge", + "src": "contracts/PolygonZkEVMBridge.sol:63" + }, + { + "label": "wrappedTokenToTokenInfo", + "offset": 0, + "slot": "107", + "type": "t_mapping(t_address,t_struct(TokenInformation)8241_storage)", + "contract": "PolygonZkEVMBridge", + "src": "contracts/PolygonZkEVMBridge.sol:66" + }, + { + "label": "polygonZkEVMaddress", + "offset": 0, + "slot": "108", + "type": "t_address", + "contract": "PolygonZkEVMBridge", + "src": "contracts/PolygonZkEVMBridge.sol:69" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_bytes32)32_storage": { + "label": "bytes32[32]", + "numberOfBytes": "1024" + }, + "t_array(t_uint256)10_storage": { + "label": "uint256[10]", + "numberOfBytes": "320" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_contract(IBasePolygonZkEVMGlobalExitRoot)10065": { + "label": "contract IBasePolygonZkEVMGlobalExitRoot", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_struct(TokenInformation)8241_storage)": { + "label": "mapping(address => struct PolygonZkEVMBridge.TokenInformation)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_address)": { + "label": "mapping(bytes32 => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(TokenInformation)8241_storage": { + "label": "struct PolygonZkEVMBridge.TokenInformation", + "members": [ + { + "label": "originNetwork", + "type": "t_uint32", + "offset": 0, + "slot": "0" + }, + { + "label": "originTokenAddress", + "type": "t_address", + "offset": 4, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "label": "uint32", + "numberOfBytes": "4" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } + }, + "ce5f0c71bed14342c9985301ac01d3f106aecc5e1faee3ca7b5845eede57422f": { + "address": "0xbc1ea504fC54D078514eFCCA1F6860B5219B6BC3", + "txHash": "0x56b5e9a0955c816edefa8ab4cc057b7a41ef97c472c9027049c9353a01a8bea4", + "layout": { + "solcVersion": "0.8.17", + "storage": [ + { + "label": "lastRollupExitRoot", + "offset": 0, + "slot": "0", + "type": "t_bytes32", + "contract": "PolygonZkEVMGlobalExitRoot", + "src": "contracts/PolygonZkEVMGlobalExitRoot.sol:19" + }, + { + "label": "lastMainnetExitRoot", + "offset": 0, + "slot": "1", + "type": "t_bytes32", + "contract": "PolygonZkEVMGlobalExitRoot", + "src": "contracts/PolygonZkEVMGlobalExitRoot.sol:22" + }, + { + "label": "globalExitRootMap", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_bytes32,t_uint256)", + "contract": "PolygonZkEVMGlobalExitRoot", + "src": "contracts/PolygonZkEVMGlobalExitRoot.sol:25" + } + ], + "types": { + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_uint256)": { + "label": "mapping(bytes32 => uint256)", + "numberOfBytes": "32" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + } + } + } + }, + "4c7ed8ca43394b0ba1dd706ad28512fc2a3a8db4899762861bf5582c75c8b607": { + "address": "0xe262Ea2782e2e8dbFe354048c3B5d6DE9603EfEF", + "txHash": "0xc93e7884d6c7f6bf332cf154977f58840b1b0e82be46b2ee3ec04fd979e9a2bc", + "layout": { + "solcVersion": "0.8.17", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" + }, + { + "label": "_owner", + "offset": 0, + "slot": "51", + "type": "t_address", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "52", + "type": "t_array(t_uint256)49_storage", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94" + }, + { + "label": "_gap", + "offset": 0, + "slot": "101", + "type": "t_array(t_uint256)10_storage", + "contract": "EmergencyManager", + "src": "contracts/lib/EmergencyManager.sol:23" + }, + { + "label": "isEmergencyState", + "offset": 0, + "slot": "111", + "type": "t_bool", + "contract": "EmergencyManager", + "src": "contracts/lib/EmergencyManager.sol:26" + }, + { + "label": "verifyBatchTimeTarget", + "offset": 1, + "slot": "111", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:167" + }, + { + "label": "multiplierBatchFee", + "offset": 9, + "slot": "111", + "type": "t_uint16", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:170" + }, + { + "label": "trustedSequencer", + "offset": 11, + "slot": "111", + "type": "t_address", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:173" + }, + { + "label": "batchFee", + "offset": 0, + "slot": "112", + "type": "t_uint256", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:176" + }, + { + "label": "forcedBatches", + "offset": 0, + "slot": "113", + "type": "t_mapping(t_uint64,t_bytes32)", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:182" + }, + { + "label": "sequencedBatches", + "offset": 0, + "slot": "114", + "type": "t_mapping(t_uint64,t_struct(SequencedBatchData)5680_storage)", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:186" + }, + { + "label": "lastTimestamp", + "offset": 0, + "slot": "115", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:189" + }, + { + "label": "lastBatchSequenced", + "offset": 8, + "slot": "115", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:192" + }, + { + "label": "lastForceBatchSequenced", + "offset": 16, + "slot": "115", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:195" + }, + { + "label": "lastForceBatch", + "offset": 24, + "slot": "115", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:198" + }, + { + "label": "lastVerifiedBatch", + "offset": 0, + "slot": "116", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:201" + }, + { + "label": "trustedAggregator", + "offset": 8, + "slot": "116", + "type": "t_address", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:204" + }, + { + "label": "batchNumToStateRoot", + "offset": 0, + "slot": "117", + "type": "t_mapping(t_uint64,t_bytes32)", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:208" + }, + { + "label": "trustedSequencerURL", + "offset": 0, + "slot": "118", + "type": "t_string_storage", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:211" + }, + { + "label": "networkName", + "offset": 0, + "slot": "119", + "type": "t_string_storage", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:214" + }, + { + "label": "pendingStateTransitions", + "offset": 0, + "slot": "120", + "type": "t_mapping(t_uint256,t_struct(PendingState)5689_storage)", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:218" + }, + { + "label": "lastPendingState", + "offset": 0, + "slot": "121", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:221" + }, + { + "label": "lastPendingStateConsolidated", + "offset": 8, + "slot": "121", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:224" + }, + { + "label": "pendingStateTimeout", + "offset": 16, + "slot": "121", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:227" + }, + { + "label": "trustedAggregatorTimeout", + "offset": 24, + "slot": "121", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:231" + }, + { + "label": "admin", + "offset": 0, + "slot": "122", + "type": "t_address", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:234" + }, + { + "label": "pendingAdmin", + "offset": 0, + "slot": "123", + "type": "t_address", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:237" + }, + { + "label": "forceBatchTimeout", + "offset": 20, + "slot": "123", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:240" + }, + { + "label": "isForcedBatchDisallowed", + "offset": 28, + "slot": "123", + "type": "t_bool", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:243" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_uint256)10_storage": { + "label": "uint256[10]", + "numberOfBytes": "320" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(PendingState)5689_storage)": { + "label": "mapping(uint256 => struct PolygonZkEVM.PendingState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint64,t_bytes32)": { + "label": "mapping(uint64 => bytes32)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint64,t_struct(SequencedBatchData)5680_storage)": { + "label": "mapping(uint64 => struct PolygonZkEVM.SequencedBatchData)", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(PendingState)5689_storage": { + "label": "struct PolygonZkEVM.PendingState", + "members": [ + { + "label": "timestamp", + "type": "t_uint64", + "offset": 0, + "slot": "0" + }, + { + "label": "lastVerifiedBatch", + "type": "t_uint64", + "offset": 8, + "slot": "0" + }, + { + "label": "exitRoot", + "type": "t_bytes32", + "offset": 0, + "slot": "1" + }, + { + "label": "stateRoot", + "type": "t_bytes32", + "offset": 0, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_struct(SequencedBatchData)5680_storage": { + "label": "struct PolygonZkEVM.SequencedBatchData", + "members": [ + { + "label": "accInputHash", + "type": "t_bytes32", + "offset": 0, + "slot": "0" + }, + { + "label": "sequencedTimestamp", + "type": "t_uint64", + "offset": 0, + "slot": "1" + }, + { + "label": "previousLastBatchSequenced", + "type": "t_uint64", + "offset": 8, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint16": { + "label": "uint16", + "numberOfBytes": "2" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint64": { + "label": "uint64", + "numberOfBytes": "8" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } + }, + "e0de5cb0e66c4e74b3f8f18ec5f07b6d781194a34a618b25f6325b5fe1ebfba3": { + "address": "0x301442aA888701c8B86727d42F3C55Fb0dd9eF7F", + "txHash": "0xeb9e883290a29cd74f2c8097b1f85b6b95d52733a9b6361b6c9f59a5513e0ec7", + "layout": { + "solcVersion": "0.8.20", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" + }, + { + "label": "_owner", + "offset": 0, + "slot": "51", + "type": "t_address", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "52", + "type": "t_array(t_uint256)49_storage", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94" + }, + { + "label": "_gap", + "offset": 0, + "slot": "101", + "type": "t_array(t_uint256)10_storage", + "contract": "EmergencyManager", + "src": "contracts/lib/EmergencyManager.sol:23" + }, + { + "label": "isEmergencyState", + "offset": 0, + "slot": "111", + "type": "t_bool", + "contract": "EmergencyManager", + "src": "contracts/lib/EmergencyManager.sol:26" + }, + { + "label": "verifyBatchTimeTarget", + "offset": 1, + "slot": "111", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:167" + }, + { + "label": "multiplierBatchFee", + "offset": 9, + "slot": "111", + "type": "t_uint16", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:170" + }, + { + "label": "trustedSequencer", + "offset": 11, + "slot": "111", + "type": "t_address", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:173" + }, + { + "label": "batchFee", + "offset": 0, + "slot": "112", + "type": "t_uint256", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:176" + }, + { + "label": "forcedBatches", + "offset": 0, + "slot": "113", + "type": "t_mapping(t_uint64,t_bytes32)", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:182" + }, + { + "label": "sequencedBatches", + "offset": 0, + "slot": "114", + "type": "t_mapping(t_uint64,t_struct(SequencedBatchData)5683_storage)", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:186" + }, + { + "label": "lastTimestamp", + "offset": 0, + "slot": "115", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:189" + }, + { + "label": "lastBatchSequenced", + "offset": 8, + "slot": "115", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:192" + }, + { + "label": "lastForceBatchSequenced", + "offset": 16, + "slot": "115", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:195" + }, + { + "label": "lastForceBatch", + "offset": 24, + "slot": "115", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:198" + }, + { + "label": "lastVerifiedBatch", + "offset": 0, + "slot": "116", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:201" + }, + { + "label": "trustedAggregator", + "offset": 8, + "slot": "116", + "type": "t_address", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:204" + }, + { + "label": "batchNumToStateRoot", + "offset": 0, + "slot": "117", + "type": "t_mapping(t_uint64,t_bytes32)", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:208" + }, + { + "label": "trustedSequencerURL", + "offset": 0, + "slot": "118", + "type": "t_string_storage", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:211" + }, + { + "label": "networkName", + "offset": 0, + "slot": "119", + "type": "t_string_storage", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:214" + }, + { + "label": "pendingStateTransitions", + "offset": 0, + "slot": "120", + "type": "t_mapping(t_uint256,t_struct(PendingState)5693_storage)", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:218" + }, + { + "label": "lastPendingState", + "offset": 0, + "slot": "121", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:221" + }, + { + "label": "lastPendingStateConsolidated", + "offset": 8, + "slot": "121", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:224" + }, + { + "label": "pendingStateTimeout", + "offset": 16, + "slot": "121", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:227" + }, + { + "label": "trustedAggregatorTimeout", + "offset": 24, + "slot": "121", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:231" + }, + { + "label": "admin", + "offset": 0, + "slot": "122", + "type": "t_address", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:234" + }, + { + "label": "pendingAdmin", + "offset": 0, + "slot": "123", + "type": "t_address", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:237" + }, + { + "label": "forceBatchTimeout", + "offset": 20, + "slot": "123", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:240" + }, + { + "label": "isForcedBatchDisallowed", + "offset": 28, + "slot": "123", + "type": "t_bool", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:243" + }, + { + "label": "version", + "offset": 0, + "slot": "124", + "type": "t_uint256", + "contract": "PolygonZkEVMUpgraded", + "src": "contracts/mainnetUpgraded/PolygonZkEVMUpgraded.sol:15" + }, + { + "label": "lastVerifiedBatchBeforeUpgrade", + "offset": 0, + "slot": "125", + "type": "t_uint256", + "contract": "PolygonZkEVMUpgraded", + "src": "contracts/mainnetUpgraded/PolygonZkEVMUpgraded.sol:18" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_uint256)10_storage": { + "label": "uint256[10]", + "numberOfBytes": "320" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(PendingState)5693_storage)": { + "label": "mapping(uint256 => struct PolygonZkEVM.PendingState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint64,t_bytes32)": { + "label": "mapping(uint64 => bytes32)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint64,t_struct(SequencedBatchData)5683_storage)": { + "label": "mapping(uint64 => struct PolygonZkEVM.SequencedBatchData)", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(PendingState)5693_storage": { + "label": "struct PolygonZkEVM.PendingState", + "members": [ + { + "label": "timestamp", + "type": "t_uint64", + "offset": 0, + "slot": "0" + }, + { + "label": "lastVerifiedBatch", + "type": "t_uint64", + "offset": 8, + "slot": "0" + }, + { + "label": "exitRoot", + "type": "t_bytes32", + "offset": 0, + "slot": "1" + }, + { + "label": "stateRoot", + "type": "t_bytes32", + "offset": 0, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_struct(SequencedBatchData)5683_storage": { + "label": "struct PolygonZkEVM.SequencedBatchData", + "members": [ + { + "label": "accInputHash", + "type": "t_bytes32", + "offset": 0, + "slot": "0" + }, + { + "label": "sequencedTimestamp", + "type": "t_uint64", + "offset": 0, + "slot": "1" + }, + { + "label": "previousLastBatchSequenced", + "type": "t_uint64", + "offset": 8, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint16": { + "label": "uint16", + "numberOfBytes": "2" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint64": { + "label": "uint64", + "numberOfBytes": "8" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } + }, + "5cd0db59b0eeb57c4ea1d368b5b6558e055166c8d2d5b6a32c78020af986fb5e": { + "address": "0xb1585916487AcEdD99952086f2950763D253b923", + "txHash": "0x1e28f164ca48acc0766d1ef801f2852804a24704cda619ab762254ac22957612", + "layout": { + "solcVersion": "0.8.20", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" + }, + { + "label": "_owner", + "offset": 0, + "slot": "51", + "type": "t_address", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "52", + "type": "t_array(t_uint256)49_storage", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94" + }, + { + "label": "_gap", + "offset": 0, + "slot": "101", + "type": "t_array(t_uint256)10_storage", + "contract": "EmergencyManager", + "src": "contracts/lib/EmergencyManager.sol:23" + }, + { + "label": "isEmergencyState", + "offset": 0, + "slot": "111", + "type": "t_bool", + "contract": "EmergencyManager", + "src": "contracts/lib/EmergencyManager.sol:26" + }, + { + "label": "verifyBatchTimeTarget", + "offset": 1, + "slot": "111", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:167" + }, + { + "label": "multiplierBatchFee", + "offset": 9, + "slot": "111", + "type": "t_uint16", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:170" + }, + { + "label": "trustedSequencer", + "offset": 11, + "slot": "111", + "type": "t_address", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:173" + }, + { + "label": "batchFee", + "offset": 0, + "slot": "112", + "type": "t_uint256", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:176" + }, + { + "label": "forcedBatches", + "offset": 0, + "slot": "113", + "type": "t_mapping(t_uint64,t_bytes32)", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:182" + }, + { + "label": "sequencedBatches", + "offset": 0, + "slot": "114", + "type": "t_mapping(t_uint64,t_struct(SequencedBatchData)5683_storage)", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:186" + }, + { + "label": "lastTimestamp", + "offset": 0, + "slot": "115", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:189" + }, + { + "label": "lastBatchSequenced", + "offset": 8, + "slot": "115", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:192" + }, + { + "label": "lastForceBatchSequenced", + "offset": 16, + "slot": "115", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:195" + }, + { + "label": "lastForceBatch", + "offset": 24, + "slot": "115", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:198" + }, + { + "label": "lastVerifiedBatch", + "offset": 0, + "slot": "116", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:201" + }, + { + "label": "trustedAggregator", + "offset": 8, + "slot": "116", + "type": "t_address", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:204" + }, + { + "label": "batchNumToStateRoot", + "offset": 0, + "slot": "117", + "type": "t_mapping(t_uint64,t_bytes32)", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:208" + }, + { + "label": "trustedSequencerURL", + "offset": 0, + "slot": "118", + "type": "t_string_storage", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:211" + }, + { + "label": "networkName", + "offset": 0, + "slot": "119", + "type": "t_string_storage", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:214" + }, + { + "label": "pendingStateTransitions", + "offset": 0, + "slot": "120", + "type": "t_mapping(t_uint256,t_struct(PendingState)5693_storage)", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:218" + }, + { + "label": "lastPendingState", + "offset": 0, + "slot": "121", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:221" + }, + { + "label": "lastPendingStateConsolidated", + "offset": 8, + "slot": "121", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:224" + }, + { + "label": "pendingStateTimeout", + "offset": 16, + "slot": "121", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:227" + }, + { + "label": "trustedAggregatorTimeout", + "offset": 24, + "slot": "121", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:231" + }, + { + "label": "admin", + "offset": 0, + "slot": "122", + "type": "t_address", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:234" + }, + { + "label": "pendingAdmin", + "offset": 0, + "slot": "123", + "type": "t_address", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:237" + }, + { + "label": "forceBatchTimeout", + "offset": 20, + "slot": "123", + "type": "t_uint64", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:240" + }, + { + "label": "isForcedBatchDisallowed", + "offset": 28, + "slot": "123", + "type": "t_bool", + "contract": "PolygonZkEVM", + "src": "contracts/PolygonZkEVM.sol:243" + }, + { + "label": "version", + "offset": 0, + "slot": "124", + "type": "t_uint256", + "contract": "PolygonZkEVMUpgraded", + "src": "contracts/mainnetUpgraded/PolygonZkEVMUpgraded.sol:15" + }, + { + "label": "lastVerifiedBatchBeforeUpgrade", + "offset": 0, + "slot": "125", + "type": "t_uint256", + "contract": "PolygonZkEVMUpgraded", + "src": "contracts/mainnetUpgraded/PolygonZkEVMUpgraded.sol:18" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_uint256)10_storage": { + "label": "uint256[10]", + "numberOfBytes": "320" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(PendingState)5693_storage)": { + "label": "mapping(uint256 => struct PolygonZkEVM.PendingState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint64,t_bytes32)": { + "label": "mapping(uint64 => bytes32)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint64,t_struct(SequencedBatchData)5683_storage)": { + "label": "mapping(uint64 => struct PolygonZkEVM.SequencedBatchData)", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(PendingState)5693_storage": { + "label": "struct PolygonZkEVM.PendingState", + "members": [ + { + "label": "timestamp", + "type": "t_uint64", + "offset": 0, + "slot": "0" + }, + { + "label": "lastVerifiedBatch", + "type": "t_uint64", + "offset": 8, + "slot": "0" + }, + { + "label": "exitRoot", + "type": "t_bytes32", + "offset": 0, + "slot": "1" + }, + { + "label": "stateRoot", + "type": "t_bytes32", + "offset": 0, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_struct(SequencedBatchData)5683_storage": { + "label": "struct PolygonZkEVM.SequencedBatchData", + "members": [ + { + "label": "accInputHash", + "type": "t_bytes32", + "offset": 0, + "slot": "0" + }, + { + "label": "sequencedTimestamp", + "type": "t_uint64", + "offset": 0, + "slot": "1" + }, + { + "label": "previousLastBatchSequenced", + "type": "t_uint64", + "offset": 8, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint16": { + "label": "uint16", + "numberOfBytes": "2" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint64": { + "label": "uint64", + "numberOfBytes": "8" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + } + }, + "79801cf42fb30168bed48ec167efe6a64d9c46e15685898f72431bb91455bb0a": { + "address": "0x0FeB850B183C57534b56b7d56520133C8f9BDB65", + "txHash": "0x4b0fb5c86ce3a7ba42a2ad487f838c50c1dd3102b9009d8d1b3dbc1d0ccbf98a", + "layout": { + "solcVersion": "0.8.20", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67" + }, + { + "label": "_status", + "offset": 0, + "slot": "1", + "type": "t_uint256", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:38" + }, + { + "label": "__gap", + "offset": 0, + "slot": "2", + "type": "t_array(t_uint256)49_storage", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:80" + }, + { + "label": "_branch", + "offset": 0, + "slot": "51", + "type": "t_array(t_bytes32)32_storage", + "contract": "DepositContractBase", + "src": "contracts/v2/lib/DepositContractBase.sol:23" + }, + { + "label": "depositCount", + "offset": 0, + "slot": "83", + "type": "t_uint256", + "contract": "DepositContractBase", + "src": "contracts/v2/lib/DepositContractBase.sol:26" + }, + { + "label": "_gap", + "offset": 0, + "slot": "84", + "type": "t_array(t_uint256)10_storage", + "contract": "DepositContractBase", + "src": "contracts/v2/lib/DepositContractBase.sol:32" + }, + { + "label": "_gap", + "offset": 0, + "slot": "94", + "type": "t_array(t_uint256)10_storage", + "contract": "EmergencyManager", + "src": "contracts/lib/EmergencyManager.sol:23" + }, + { + "label": "isEmergencyState", + "offset": 0, + "slot": "104", + "type": "t_bool", + "contract": "EmergencyManager", + "src": "contracts/lib/EmergencyManager.sol:26" + }, + { + "label": "networkID", + "offset": 1, + "slot": "104", + "type": "t_uint32", + "contract": "PolygonZkEVMBridgeV2", + "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:61" + }, + { + "label": "globalExitRootManager", + "offset": 5, + "slot": "104", + "type": "t_contract(IBasePolygonZkEVMGlobalExitRoot)1675", + "contract": "PolygonZkEVMBridgeV2", + "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:64" + }, + { + "label": "lastUpdatedDepositCount", + "offset": 25, + "slot": "104", + "type": "t_uint32", + "contract": "PolygonZkEVMBridgeV2", + "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:67" + }, + { + "label": "claimedBitMap", + "offset": 0, + "slot": "105", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "PolygonZkEVMBridgeV2", + "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:70" + }, + { + "label": "tokenInfoToWrappedToken", + "offset": 0, + "slot": "106", + "type": "t_mapping(t_bytes32,t_address)", + "contract": "PolygonZkEVMBridgeV2", + "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:73" + }, + { + "label": "wrappedTokenToTokenInfo", + "offset": 0, + "slot": "107", + "type": "t_mapping(t_address,t_struct(TokenInformation)2064_storage)", + "contract": "PolygonZkEVMBridgeV2", + "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:76" + }, + { + "label": "polygonRollupManager", + "offset": 0, + "slot": "108", + "type": "t_address", + "contract": "PolygonZkEVMBridgeV2", + "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:80", + "renamedFrom": "polygonZkEVMaddress" + }, + { + "label": "gasTokenAddress", + "offset": 0, + "slot": "109", + "type": "t_address", + "contract": "PolygonZkEVMBridgeV2", + "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:83" + }, + { + "label": "gasTokenNetwork", + "offset": 20, + "slot": "109", + "type": "t_uint32", + "contract": "PolygonZkEVMBridgeV2", + "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:86" + }, + { + "label": "gasTokenMetadata", + "offset": 0, + "slot": "110", + "type": "t_bytes_storage", + "contract": "PolygonZkEVMBridgeV2", + "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:89" + }, + { + "label": "WETHToken", + "offset": 0, + "slot": "111", + "type": "t_contract(TokenWrapped)2037", + "contract": "PolygonZkEVMBridgeV2", + "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:92" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_bytes32)32_storage": { + "label": "bytes32[32]", + "numberOfBytes": "1024" + }, + "t_array(t_uint256)10_storage": { + "label": "uint256[10]", + "numberOfBytes": "320" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_bytes_storage": { + "label": "bytes", + "numberOfBytes": "32" + }, + "t_contract(IBasePolygonZkEVMGlobalExitRoot)1675": { + "label": "contract IBasePolygonZkEVMGlobalExitRoot", + "numberOfBytes": "20" + }, + "t_contract(TokenWrapped)2037": { + "label": "contract TokenWrapped", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_struct(TokenInformation)2064_storage)": { + "label": "mapping(address => struct PolygonZkEVMBridgeV2.TokenInformation)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_address)": { + "label": "mapping(bytes32 => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(TokenInformation)2064_storage": { + "label": "struct PolygonZkEVMBridgeV2.TokenInformation", + "members": [ + { + "label": "originNetwork", + "type": "t_uint32", + "offset": 0, + "slot": "0" + }, + { + "label": "originTokenAddress", + "type": "t_address", + "offset": 4, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "label": "uint32", + "numberOfBytes": "4" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + } + }, + "0276720dd07b80a08f307a7d10b2a30c8973b8dad1bb0fef986ed1e3b6a2a9c4": { + "address": "0x2E38cD55163137483E30580Cb468C2dFf1d85077", + "txHash": "0xe15832f3a7bac8245a57bf658f49b60fb06e91b6c60645ac1489c5e04a76decf", + "layout": { + "solcVersion": "0.8.20", + "storage": [ + { + "label": "lastRollupExitRoot", + "offset": 0, + "slot": "0", + "type": "t_bytes32", + "contract": "PolygonZkEVMGlobalExitRootBaseStorage", + "src": "contracts/v2/lib/PolygonZkEVMGlobalExitRootBaseStorage.sol:14" + }, + { + "label": "lastMainnetExitRoot", + "offset": 0, + "slot": "1", + "type": "t_bytes32", + "contract": "PolygonZkEVMGlobalExitRootBaseStorage", + "src": "contracts/v2/lib/PolygonZkEVMGlobalExitRootBaseStorage.sol:17" + }, + { + "label": "globalExitRootMap", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_bytes32,t_uint256)", + "contract": "PolygonZkEVMGlobalExitRootBaseStorage", + "src": "contracts/v2/lib/PolygonZkEVMGlobalExitRootBaseStorage.sol:21" + }, + { + "label": "_branch", + "offset": 0, + "slot": "3", + "type": "t_array(t_bytes32)32_storage", + "contract": "DepositContractBase", + "src": "contracts/v2/lib/DepositContractBase.sol:23" + }, + { + "label": "depositCount", + "offset": 0, + "slot": "35", + "type": "t_uint256", + "contract": "DepositContractBase", + "src": "contracts/v2/lib/DepositContractBase.sol:26" + }, + { + "label": "_gap", + "offset": 0, + "slot": "36", + "type": "t_array(t_uint256)10_storage", + "contract": "DepositContractBase", + "src": "contracts/v2/lib/DepositContractBase.sol:32" + } + ], + "types": { + "t_array(t_bytes32)32_storage": { + "label": "bytes32[32]", + "numberOfBytes": "1024" + }, + "t_array(t_uint256)10_storage": { + "label": "uint256[10]", + "numberOfBytes": "320" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_uint256)": { + "label": "mapping(bytes32 => uint256)", + "numberOfBytes": "32" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + } + }, + "namespaces": {} + } + }, + "55d2f394d0399c9e6e9a2e9773726fe47025d9e46193ddce8361a97fc7a550a6": { + "address": "0x3b82Da772c825283d85d5d6717A77C6Ff582053b", + "txHash": "0x19d27fa6f277e99c64a02af1a3d7532c24cabe58505f334ab98f8a5b7ac5d565", + "layout": { + "solcVersion": "0.8.20", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" + }, + { + "label": "_legacyOwner", + "offset": 0, + "slot": "51", + "type": "t_address", + "contract": "PolygonAccessControlUpgradeable", + "src": "contracts/v2/lib/PolygonAccessControlUpgradeable.sol:29", + "renamedFrom": "_owner" + }, + { + "label": "_roles", + "offset": 0, + "slot": "52", + "type": "t_mapping(t_bytes32,t_struct(RoleData)7463_storage)", + "contract": "PolygonAccessControlUpgradeable", + "src": "contracts/v2/lib/PolygonAccessControlUpgradeable.sol:36" + }, + { + "label": "__gap", + "offset": 0, + "slot": "53", + "type": "t_array(t_uint256)48_storage", + "contract": "PolygonAccessControlUpgradeable", + "src": "contracts/v2/lib/PolygonAccessControlUpgradeable.sol:244" + }, + { + "label": "_gap", + "offset": 0, + "slot": "101", + "type": "t_array(t_uint256)10_storage", + "contract": "EmergencyManager", + "src": "contracts/lib/EmergencyManager.sol:23" + }, + { + "label": "isEmergencyState", + "offset": 0, + "slot": "111", + "type": "t_bool", + "contract": "EmergencyManager", + "src": "contracts/lib/EmergencyManager.sol:26" + }, + { + "label": "_legacyVerifyBatchTimeTarget", + "offset": 1, + "slot": "111", + "type": "t_uint64", + "contract": "LegacyZKEVMStateVariables", + "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:45", + "renamedFrom": "verifyBatchTimeTarget" + }, + { + "label": "_legacyMultiplierBatchFee", + "offset": 9, + "slot": "111", + "type": "t_uint16", + "contract": "LegacyZKEVMStateVariables", + "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:49", + "renamedFrom": "multiplierBatchFee" + }, + { + "label": "_legacyTrustedSequencer", + "offset": 11, + "slot": "111", + "type": "t_address", + "contract": "LegacyZKEVMStateVariables", + "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:53", + "renamedFrom": "trustedSequencer" + }, + { + "label": "_legacyBatchFee", + "offset": 0, + "slot": "112", + "type": "t_uint256", + "contract": "LegacyZKEVMStateVariables", + "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:57", + "renamedFrom": "batchFee" + }, + { + "label": "_legacyForcedBatches", + "offset": 0, + "slot": "113", + "type": "t_mapping(t_uint64,t_bytes32)", + "contract": "LegacyZKEVMStateVariables", + "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:64", + "renamedFrom": "forcedBatches" + }, + { + "label": "_legacySequencedBatches", + "offset": 0, + "slot": "114", + "type": "t_mapping(t_uint64,t_struct(SequencedBatchData)7334_storage)", + "contract": "LegacyZKEVMStateVariables", + "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:69", + "renamedFrom": "sequencedBatches" + }, + { + "label": "_legacyLastTimestamp", + "offset": 0, + "slot": "115", + "type": "t_uint64", + "contract": "LegacyZKEVMStateVariables", + "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:73", + "renamedFrom": "lastTimestamp" + }, + { + "label": "_legacylastBatchSequenced", + "offset": 8, + "slot": "115", + "type": "t_uint64", + "contract": "LegacyZKEVMStateVariables", + "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:77", + "renamedFrom": "lastBatchSequenced" + }, + { + "label": "_legacyLastForceBatchSequenced", + "offset": 16, + "slot": "115", + "type": "t_uint64", + "contract": "LegacyZKEVMStateVariables", + "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:81", + "renamedFrom": "lastForceBatchSequenced" + }, + { + "label": "_legacyLastForceBatch", + "offset": 24, + "slot": "115", + "type": "t_uint64", + "contract": "LegacyZKEVMStateVariables", + "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:85", + "renamedFrom": "lastForceBatch" + }, + { + "label": "_legacyLastVerifiedBatch", + "offset": 0, + "slot": "116", + "type": "t_uint64", + "contract": "LegacyZKEVMStateVariables", + "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:89", + "renamedFrom": "lastVerifiedBatch" + }, + { + "label": "_legacyTrustedAggregator", + "offset": 8, + "slot": "116", + "type": "t_address", + "contract": "LegacyZKEVMStateVariables", + "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:93", + "renamedFrom": "trustedAggregator" + }, + { + "label": "_legacyBatchNumToStateRoot", + "offset": 0, + "slot": "117", + "type": "t_mapping(t_uint64,t_bytes32)", + "contract": "LegacyZKEVMStateVariables", + "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:98", + "renamedFrom": "batchNumToStateRoot" + }, + { + "label": "_legacyTrustedSequencerURL", + "offset": 0, + "slot": "118", + "type": "t_string_storage", + "contract": "LegacyZKEVMStateVariables", + "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:102", + "renamedFrom": "trustedSequencerURL" + }, + { + "label": "_legacyNetworkName", + "offset": 0, + "slot": "119", + "type": "t_string_storage", + "contract": "LegacyZKEVMStateVariables", + "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:106", + "renamedFrom": "networkName" + }, + { + "label": "_legacyPendingStateTransitions", + "offset": 0, + "slot": "120", + "type": "t_mapping(t_uint256,t_struct(PendingState)7344_storage)", + "contract": "LegacyZKEVMStateVariables", + "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:111", + "renamedFrom": "pendingStateTransitions" + }, + { + "label": "_legacyLastPendingState", + "offset": 0, + "slot": "121", + "type": "t_uint64", + "contract": "LegacyZKEVMStateVariables", + "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:115", + "renamedFrom": "lastPendingState" + }, + { + "label": "_legacyLastPendingStateConsolidated", + "offset": 8, + "slot": "121", + "type": "t_uint64", + "contract": "LegacyZKEVMStateVariables", + "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:119", + "renamedFrom": "lastPendingStateConsolidated" + }, + { + "label": "_legacyPendingStateTimeout", + "offset": 16, + "slot": "121", + "type": "t_uint64", + "contract": "LegacyZKEVMStateVariables", + "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:123", + "renamedFrom": "pendingStateTimeout" + }, + { + "label": "_legacyTrustedAggregatorTimeout", + "offset": 24, + "slot": "121", + "type": "t_uint64", + "contract": "LegacyZKEVMStateVariables", + "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:128", + "renamedFrom": "trustedAggregatorTimeout" + }, + { + "label": "_legacyAdmin", + "offset": 0, + "slot": "122", + "type": "t_address", + "contract": "LegacyZKEVMStateVariables", + "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:132", + "renamedFrom": "admin" + }, + { + "label": "_legacyPendingAdmin", + "offset": 0, + "slot": "123", + "type": "t_address", + "contract": "LegacyZKEVMStateVariables", + "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:136", + "renamedFrom": "pendingAdmin" + }, + { + "label": "_legacyForceBatchTimeout", + "offset": 20, + "slot": "123", + "type": "t_uint64", + "contract": "LegacyZKEVMStateVariables", + "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:140", + "renamedFrom": "forceBatchTimeout" + }, + { + "label": "_legacyIsForcedBatchDisallowed", + "offset": 28, + "slot": "123", + "type": "t_bool", + "contract": "LegacyZKEVMStateVariables", + "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:144", + "renamedFrom": "isForcedBatchDisallowed" + }, + { + "label": "_legacyVersion", + "offset": 0, + "slot": "124", + "type": "t_uint256", + "contract": "LegacyZKEVMStateVariables", + "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:148", + "renamedFrom": "version" + }, + { + "label": "_legacyLastVerifiedBatchBeforeUpgrade", + "offset": 0, + "slot": "125", + "type": "t_uint256", + "contract": "LegacyZKEVMStateVariables", + "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:152", + "renamedFrom": "lastVerifiedBatchBeforeUpgrade" + }, + { + "label": "rollupTypeCount", + "offset": 0, + "slot": "126", + "type": "t_uint32", + "contract": "PolygonRollupManager", + "src": "contracts/v2/PolygonRollupManager.sol:170" + }, + { + "label": "rollupTypeMap", + "offset": 0, + "slot": "127", + "type": "t_mapping(t_uint32,t_struct(RollupType)3613_storage)", + "contract": "PolygonRollupManager", + "src": "contracts/v2/PolygonRollupManager.sol:173" + }, + { + "label": "rollupCount", + "offset": 0, + "slot": "128", + "type": "t_uint32", + "contract": "PolygonRollupManager", + "src": "contracts/v2/PolygonRollupManager.sol:176" + }, + { + "label": "rollupIDToRollupData", + "offset": 0, + "slot": "129", + "type": "t_mapping(t_uint32,t_struct(RollupData)3655_storage)", + "contract": "PolygonRollupManager", + "src": "contracts/v2/PolygonRollupManager.sol:179" + }, + { + "label": "rollupAddressToID", + "offset": 0, + "slot": "130", + "type": "t_mapping(t_address,t_uint32)", + "contract": "PolygonRollupManager", + "src": "contracts/v2/PolygonRollupManager.sol:182" + }, + { + "label": "chainIDToRollupID", + "offset": 0, + "slot": "131", + "type": "t_mapping(t_uint64,t_uint32)", + "contract": "PolygonRollupManager", + "src": "contracts/v2/PolygonRollupManager.sol:186" + }, + { + "label": "totalSequencedBatches", + "offset": 0, + "slot": "132", + "type": "t_uint64", + "contract": "PolygonRollupManager", + "src": "contracts/v2/PolygonRollupManager.sol:189" + }, + { + "label": "totalVerifiedBatches", + "offset": 8, + "slot": "132", + "type": "t_uint64", + "contract": "PolygonRollupManager", + "src": "contracts/v2/PolygonRollupManager.sol:192" + }, + { + "label": "lastAggregationTimestamp", + "offset": 16, + "slot": "132", + "type": "t_uint64", + "contract": "PolygonRollupManager", + "src": "contracts/v2/PolygonRollupManager.sol:195" + }, + { + "label": "trustedAggregatorTimeout", + "offset": 24, + "slot": "132", + "type": "t_uint64", + "contract": "PolygonRollupManager", + "src": "contracts/v2/PolygonRollupManager.sol:199" + }, + { + "label": "pendingStateTimeout", + "offset": 0, + "slot": "133", + "type": "t_uint64", + "contract": "PolygonRollupManager", + "src": "contracts/v2/PolygonRollupManager.sol:202" + }, + { + "label": "verifyBatchTimeTarget", + "offset": 8, + "slot": "133", + "type": "t_uint64", + "contract": "PolygonRollupManager", + "src": "contracts/v2/PolygonRollupManager.sol:206" + }, + { + "label": "multiplierBatchFee", + "offset": 16, + "slot": "133", + "type": "t_uint16", + "contract": "PolygonRollupManager", + "src": "contracts/v2/PolygonRollupManager.sol:209" + }, + { + "label": "_batchFee", + "offset": 0, + "slot": "134", + "type": "t_uint256", + "contract": "PolygonRollupManager", + "src": "contracts/v2/PolygonRollupManager.sol:213" + }, + { + "label": "lastDeactivatedEmergencyStateTimestamp", + "offset": 0, + "slot": "135", + "type": "t_uint64", + "contract": "PolygonRollupManager", + "src": "contracts/v2/PolygonRollupManager.sol:216" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_uint256)10_storage": { + "label": "uint256[10]", + "numberOfBytes": "320" + }, + "t_array(t_uint256)48_storage": { + "label": "uint256[48]", + "numberOfBytes": "1536" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_contract(IPolygonRollupBase)6982": { + "label": "contract IPolygonRollupBase", + "numberOfBytes": "20" + }, + "t_contract(IVerifierRollup)3495": { + "label": "contract IVerifierRollup", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_uint32)": { + "label": "mapping(address => uint32)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_struct(RoleData)7463_storage)": { + "label": "mapping(bytes32 => struct PolygonAccessControlUpgradeable.RoleData)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(PendingState)7344_storage)": { + "label": "mapping(uint256 => struct LegacyZKEVMStateVariables.PendingState)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint32,t_struct(RollupData)3655_storage)": { + "label": "mapping(uint32 => struct PolygonRollupManager.RollupData)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint32,t_struct(RollupType)3613_storage)": { + "label": "mapping(uint32 => struct PolygonRollupManager.RollupType)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint64,t_bytes32)": { + "label": "mapping(uint64 => bytes32)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint64,t_struct(SequencedBatchData)7334_storage)": { + "label": "mapping(uint64 => struct LegacyZKEVMStateVariables.SequencedBatchData)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint64,t_uint32)": { + "label": "mapping(uint64 => uint32)", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(PendingState)7344_storage": { + "label": "struct LegacyZKEVMStateVariables.PendingState", + "members": [ + { + "label": "timestamp", + "type": "t_uint64", + "offset": 0, + "slot": "0" + }, + { + "label": "lastVerifiedBatch", + "type": "t_uint64", + "offset": 8, + "slot": "0" + }, + { + "label": "exitRoot", + "type": "t_bytes32", + "offset": 0, + "slot": "1" + }, + { + "label": "stateRoot", + "type": "t_bytes32", + "offset": 0, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_struct(RoleData)7463_storage": { + "label": "struct PolygonAccessControlUpgradeable.RoleData", + "members": [ + { + "label": "members", + "type": "t_mapping(t_address,t_bool)", + "offset": 0, + "slot": "0" + }, + { + "label": "adminRole", + "type": "t_bytes32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(RollupData)3655_storage": { + "label": "struct PolygonRollupManager.RollupData", + "members": [ + { + "label": "rollupContract", + "type": "t_contract(IPolygonRollupBase)6982", + "offset": 0, + "slot": "0" + }, + { + "label": "chainID", + "type": "t_uint64", + "offset": 20, + "slot": "0" + }, + { + "label": "verifier", + "type": "t_contract(IVerifierRollup)3495", + "offset": 0, + "slot": "1" + }, + { + "label": "forkID", + "type": "t_uint64", + "offset": 20, + "slot": "1" + }, + { + "label": "batchNumToStateRoot", + "type": "t_mapping(t_uint64,t_bytes32)", + "offset": 0, + "slot": "2" + }, + { + "label": "sequencedBatches", + "type": "t_mapping(t_uint64,t_struct(SequencedBatchData)7334_storage)", + "offset": 0, + "slot": "3" + }, + { + "label": "pendingStateTransitions", + "type": "t_mapping(t_uint256,t_struct(PendingState)7344_storage)", + "offset": 0, + "slot": "4" + }, + { + "label": "lastLocalExitRoot", + "type": "t_bytes32", + "offset": 0, + "slot": "5" + }, + { + "label": "lastBatchSequenced", + "type": "t_uint64", + "offset": 0, + "slot": "6" + }, + { + "label": "lastVerifiedBatch", + "type": "t_uint64", + "offset": 8, + "slot": "6" + }, + { + "label": "lastPendingState", + "type": "t_uint64", + "offset": 16, + "slot": "6" + }, + { + "label": "lastPendingStateConsolidated", + "type": "t_uint64", + "offset": 24, + "slot": "6" + }, + { + "label": "lastVerifiedBatchBeforeUpgrade", + "type": "t_uint64", + "offset": 0, + "slot": "7" + }, + { + "label": "rollupTypeID", + "type": "t_uint64", + "offset": 8, + "slot": "7" + }, + { + "label": "rollupCompatibilityID", + "type": "t_uint8", + "offset": 16, + "slot": "7" + } + ], + "numberOfBytes": "256" + }, + "t_struct(RollupType)3613_storage": { + "label": "struct PolygonRollupManager.RollupType", + "members": [ + { + "label": "consensusImplementation", + "type": "t_address", + "offset": 0, + "slot": "0" + }, + { + "label": "verifier", + "type": "t_contract(IVerifierRollup)3495", + "offset": 0, + "slot": "1" + }, + { + "label": "forkID", + "type": "t_uint64", + "offset": 20, + "slot": "1" + }, + { + "label": "rollupCompatibilityID", + "type": "t_uint8", + "offset": 28, + "slot": "1" + }, + { + "label": "obsolete", + "type": "t_bool", + "offset": 29, + "slot": "1" + }, + { + "label": "genesis", + "type": "t_bytes32", + "offset": 0, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_struct(SequencedBatchData)7334_storage": { + "label": "struct LegacyZKEVMStateVariables.SequencedBatchData", + "members": [ + { + "label": "accInputHash", + "type": "t_bytes32", + "offset": 0, + "slot": "0" + }, + { + "label": "sequencedTimestamp", + "type": "t_uint64", + "offset": 0, + "slot": "1" + }, + { + "label": "previousLastBatchSequenced", + "type": "t_uint64", + "offset": 8, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint16": { + "label": "uint16", + "numberOfBytes": "2" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "label": "uint32", + "numberOfBytes": "4" + }, + "t_uint64": { + "label": "uint64", + "numberOfBytes": "8" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + } + } + } +} diff --git a/upgrade/upgradeToV2/mainnet_1706364989/upgrade_output.json b/upgrade/upgradeToV2/mainnet_1706364989/upgrade_output.json new file mode 100644 index 000000000..05fecdc24 --- /dev/null +++ b/upgrade/upgradeToV2/mainnet_1706364989/upgrade_output.json @@ -0,0 +1,7 @@ +{ + "scheduleData": "0x8f2a0bb000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d2f0000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a0000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a0000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000004499a88ec4000000000000000000000000580bda1e7a0cfae92fa7f6c20a3794f169ce3cfb0000000000000000000000002e38cd55163137483e30580cb468c2dff1d8507700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004499a88ec40000000000000000000000002a3dd3eb832af982ec71669e178424b10dca2ede0000000000000000000000000feb850b183c57534b56b7d56520133c8f9bdb650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e49623609d0000000000000000000000005132a183e9f3cb7c848b0aac5ae0c4f0491b7ab20000000000000000000000003b82da772c825283d85d5d6717a77c6ff582053b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001440645af090000000000000000000000006329fe417621925c81c16f9f9a18c203c21af7ab00000000000000000000000000000000000000000000000000000000000697800000000000000000000000000000000000000000000000000000000000069780000000000000000000000000242dae44f5d8fb54b198d03a94da45b5a4413e21000000000000000000000000ef1462451c30ea7ad8555386226059fe837ca4ef00000000000000000000000037c58dfa7bf0a165c5aaeddf3e2edb475ac6dcb6000000000000000000000000519e42c24163192dca44cd3fbdcebf6be91309870000000000000000000000001c3a3da552b8662cd69538356b1e7c2e9cc1ebd80000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000044d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "executeData": "0xe38335e500000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a0000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a0000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000004499a88ec4000000000000000000000000580bda1e7a0cfae92fa7f6c20a3794f169ce3cfb0000000000000000000000002e38cd55163137483e30580cb468c2dff1d8507700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004499a88ec40000000000000000000000002a3dd3eb832af982ec71669e178424b10dca2ede0000000000000000000000000feb850b183c57534b56b7d56520133c8f9bdb650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e49623609d0000000000000000000000005132a183e9f3cb7c848b0aac5ae0c4f0491b7ab20000000000000000000000003b82da772c825283d85d5d6717a77c6ff582053b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001440645af090000000000000000000000006329fe417621925c81c16f9f9a18c203c21af7ab00000000000000000000000000000000000000000000000000000000000697800000000000000000000000000000000000000000000000000000000000069780000000000000000000000000242dae44f5d8fb54b198d03a94da45b5a4413e21000000000000000000000000ef1462451c30ea7ad8555386226059fe837ca4ef00000000000000000000000037c58dfa7bf0a165c5aaeddf3e2edb475ac6dcb6000000000000000000000000519e42c24163192dca44cd3fbdcebf6be91309870000000000000000000000001c3a3da552b8662cd69538356b1e7c2e9cc1ebd80000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000044d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "verifierAddress": "0x1C3A3da552b8662CD69538356b1E7c2E9CC1EBD8", + "newPolygonZKEVM": "0x519E42c24163192Dca44CD3fBDCEBF6be9130987", + "timelockContractAdress": "0xEf1462451C30Ea7aD8555386226059Fe837CA4EF" +} \ No newline at end of file diff --git a/upgrade/upgradeToV2/mainnet_1706364989/upgrade_outputL2.json b/upgrade/upgradeToV2/mainnet_1706364989/upgrade_outputL2.json new file mode 100644 index 000000000..0e59d4398 --- /dev/null +++ b/upgrade/upgradeToV2/mainnet_1706364989/upgrade_outputL2.json @@ -0,0 +1,5 @@ +{ + "scheduleData": "0x01d5062a0000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d2f00000000000000000000000000000000000000000000000000000000000000004499a88ec40000000000000000000000002a3dd3eb832af982ec71669e178424b10dca2ede0000000000000000000000005f411584e02964a028e3123c833c352cd2f5cbd500000000000000000000000000000000000000000000000000000000", + "executeData": "0x134008d30000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004499a88ec40000000000000000000000002a3dd3eb832af982ec71669e178424b10dca2ede0000000000000000000000005f411584e02964a028e3123c833c352cd2f5cbd500000000000000000000000000000000000000000000000000000000", + "timelockL2Address": "0xBBa0935Fa93Eb23de7990b47F0D96a8f75766d13" +} \ No newline at end of file diff --git a/upgrade/upgradeToV2/mainnet_1706364989/upgrade_parameters_mainnet.json b/upgrade/upgradeToV2/mainnet_1706364989/upgrade_parameters_mainnet.json new file mode 100644 index 000000000..e8705efc9 --- /dev/null +++ b/upgrade/upgradeToV2/mainnet_1706364989/upgrade_parameters_mainnet.json @@ -0,0 +1,7 @@ +{ + "realVerifier": true, + "newForkID": 7, + "timelockDelay": 864000, + "timelockSalt": "", + "polTokenAddress": "0x455e53CBB86018Ac2B8092FdCd39d8444aFFC3F6" +} \ No newline at end of file diff --git a/upgrade/upgradeToV2/upgradeL2ToV2.ts b/upgrade/upgradeToV2/upgradeL2ToV2.ts index 94a317e78..0031f3ec5 100644 --- a/upgrade/upgradeToV2/upgradeL2ToV2.ts +++ b/upgrade/upgradeToV2/upgradeL2ToV2.ts @@ -84,7 +84,7 @@ async function main() { // load timelock const timelockContractFactory = await ethers.getContractFactory("PolygonZkEVMTimelock"); const timelockContract = (await timelockContractFactory.attach(timelockL2Address)) as PolygonZkEVMTimelock; - const timelockDelay = timelockContract.getMinDelay(); + const timelockDelay = await timelockContract.getMinDelay(); console.log("timelockAddress: ", timelockContract.target, {timelockDelay}); From afdca9e9f8d3d1b5a246eef4089889188b333bb8 Mon Sep 17 00:00:00 2001 From: zkronos73 Date: Sat, 27 Jan 2024 17:31:03 +0000 Subject: [PATCH 184/230] update verifier document --- .../verifyMainnetProofVerifier.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/verifyMainnetDeployment/verifyMainnetProofVerifier.md b/verifyMainnetDeployment/verifyMainnetProofVerifier.md index f27c0c79d..dc028a11b 100644 --- a/verifyMainnetDeployment/verifyMainnetProofVerifier.md +++ b/verifyMainnetDeployment/verifyMainnetProofVerifier.md @@ -1,4 +1,4 @@ -# Verify deployment on testnet Sepolia of the proof verifier smart contract (etrog-fork.7) +# Verify deployment on Mainnet the proof verifier smart contract (etrog-fork.7) In order to verify the smart contract, you will need a machine with at least 256GB of RAM and 16 cores. @@ -188,18 +188,18 @@ The result should be: ## Download bytecode of deployed smartcontract -To download bytecode of deployed smartcontract, need the address of smart contract, in this case it's *0x8d0aAd785905c5c9f942CB18a3AC1e50c4F52786*. Go to Etherscan or Beaconcha to get transaction bytecode. +To download bytecode of deployed smartcontract, need the address of smart contract, in this case it's *0x1C3A3da552b8662CD69538356b1E7c2E9CC1EBD8*. Go to Etherscan or Beaconcha to get transaction bytecode. -Associated with address *0x8d0aAd785905c5c9f942CB18a3AC1e50c4F52786* found the transacction *0xed0f103dc5e5f5bb8aa5df90a2bfb1949ad41dec8b04e5acc0747dbc1c26e837*. +Associated with address *0x1C3A3da552b8662CD69538356b1E7c2E9CC1EBD8* found the transacction *0x2f0ce26dd454211f84df373e7b37be2d683cb71532bc6d0ec63d6fcdbaa4c5e3*. -- ### Etherscan (https://sepolia.etherscan.io) - https://sepolia.etherscan.io/address/0x8d0aAd785905c5c9f942CB18a3AC1e50c4F52786 - https://sepolia.etherscan.io/tx/0xed0f103dc5e5f5bb8aa5df90a2bfb1949ad41dec8b04e5acc0747dbc1c26e837 +- ### Etherscan (https://etherscan.io) + https://etherscan.io/address/0x1C3A3da552b8662CD69538356b1E7c2E9CC1EBD8 + https://etherscan.io/tx/0x2f0ce26dd454211f84df373e7b37be2d683cb71532bc6d0ec63d6fcdbaa4c5e3 Click to see more > Input Data > Select all data and copy to clipboard. -- ### Beacocha (https://sepolia.beaconcha.in) - https://sepolia.beaconcha.in/address/8d0aAd785905c5c9f942CB18a3AC1e50c4F52786 - https://sepolia.beaconcha.in/tx/0xed0f103dc5e5f5bb8aa5df90a2bfb1949ad41dec8b04e5acc0747dbc1c26e837 +- ### Beacocha (https://beaconcha.in) + https://beaconcha.in/address/0x1C3A3da552b8662CD69538356b1E7c2E9CC1EBD8 + https://beaconcha.in/tx/0x2f0ce26dd454211f84df373e7b37be2d683cb71532bc6d0ec63d6fcdbaa4c5e3 Advanced Info > Call Data > Select all data and copy to clipboard. *NOTE: Don't use button "Copy Raw Data" because it generated non compatible format.* From 74722f1db1b98c899cc3fa29c278e732e1c6b837 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Sat, 27 Jan 2024 20:49:08 +0100 Subject: [PATCH 185/230] remove --test --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3f14ed55f..6e3263063 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "deploy:testnet:v2:goerli": "npx hardhat compile && rm -f deployment/v2/deploy_ongoing.json && npm run prepare:testnet:ZkEVM:goerli && npm run deploy:v2:goerli", "verify:v2:goerli": "npx hardhat run deployment/v2/verifyContracts.js --network goerli", "prepare:testnet:ZkEVM:sepolia": "npx hardhat run deployment/testnet/prepareTestnet.ts --network sepolia", - "deploy:v2:sepolia": "npx hardhat compile && npx ts-node deployment/v2/1_createGenesis.ts --test && npx hardhat run deployment/v2/2_deployPolygonZKEVMDeployer.ts --network sepolia && npx hardhat run deployment/v2/3_deployContracts.ts --network sepolia && npx hardhat run deployment/v2/4_createRollup.ts --network sepolia && npm run saveDeployment:sepolia", + "deploy:v2:sepolia": "npx hardhat compile && npx ts-node deployment/v2/1_createGenesis.ts && npx hardhat run deployment/v2/2_deployPolygonZKEVMDeployer.ts --network sepolia && npx hardhat run deployment/v2/3_deployContracts.ts --network sepolia && npx hardhat run deployment/v2/4_createRollup.ts --network sepolia && npm run saveDeployment:sepolia", "deploy:testnet:v2:sepolia": "npx hardhat compile && rm -f deployment/v2/deploy_ongoing.json && npm run prepare:testnet:ZkEVM:sepolia && npm run deploy:v2:sepolia", "verify:v2:sepolia": "npx hardhat run deployment/v2/verifyContracts.js --network sepolia", "prepare:v1ToV2:ZkEVM:localhost": "npx hardhat run deployment/v1ToV2/prepareTestnet.ts --network localhost", From 36ca0481ec50dc762232fe1c7166d23f8c677dd2 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 29 Jan 2024 17:58:26 +0100 Subject: [PATCH 186/230] update verify contracts --- deployment/v2/4_createRollup.ts | 1 + deployment/v2/verifyContracts.js | 58 ++++++++++++++++++++++---------- 2 files changed, 42 insertions(+), 17 deletions(-) diff --git a/deployment/v2/4_createRollup.ts b/deployment/v2/4_createRollup.ts index d2edb5b33..0e16b57ee 100644 --- a/deployment/v2/4_createRollup.ts +++ b/deployment/v2/4_createRollup.ts @@ -319,6 +319,7 @@ async function main() { outputJson.createRollupBlock = blockDeploymentRollup.number; outputJson.rollupAddress = newZKEVMAddress; outputJson.verifierAddress = verifierContract.target; + outputJson.consensusContract = consensusContract; fs.writeFileSync(pathOutputJson, JSON.stringify(outputJson, null, 1)); } diff --git a/deployment/v2/verifyContracts.js b/deployment/v2/verifyContracts.js index 32724e331..8c5390ae3 100644 --- a/deployment/v2/verifyContracts.js +++ b/deployment/v2/verifyContracts.js @@ -166,24 +166,48 @@ async function main() { expect(error.message.toLowerCase().includes('already verified')).to.be.equal(true); } - // verify zkEVM address - try { - await hre.run( - 'verify:verify', - { - contract: 'contracts/v2/consensus/zkEVM/PolygonZkEVMEtrog.sol:PolygonZkEVMEtrog', - address: createRollupOutputParameters.rollupAddress, - constructorArguments: [ - deployOutputParameters.polygonZkEVMGlobalExitRootAddress, - deployOutputParameters.polTokenAddress, - deployOutputParameters.polygonZkEVMBridgeAddress, - deployOutputParameters.polygonRollupManager, - ], - }, - ); - } catch (error) { - // expect(error.message.toLowerCase().includes('proxyadmin')).to.be.equal(true); + // verify zkEVM address or validium + + if (createRollupOutputParameters.consensusContract == "PolygonZkEVMEtrog") { + try { + await hre.run( + 'verify:verify', + { + contract: 'contracts/v2/consensus/zkEVM/PolygonZkEVMEtrog.sol:PolygonZkEVMEtrog', + address: createRollupOutputParameters.rollupAddress, + constructorArguments: [ + deployOutputParameters.polygonZkEVMGlobalExitRootAddress, + deployOutputParameters.polTokenAddress, + deployOutputParameters.polygonZkEVMBridgeAddress, + deployOutputParameters.polygonRollupManager, + ], + }, + ); + } catch (error) { + // expect(error.message.toLowerCase().includes('proxyadmin')).to.be.equal(true); + } + } else { + if(createRollupOutputParameters.consensusContract == "PolygonValidiumEtrog") { + try { + await hre.run( + 'verify:verify', + { + contract: 'contracts/v2/consensus/validium/PolygonValidiumEtrog.sol:PolygonValidiumEtrog', + address: createRollupOutputParameters.rollupAddress, + constructorArguments: [ + deployOutputParameters.polygonZkEVMGlobalExitRootAddress, + deployOutputParameters.polTokenAddress, + deployOutputParameters.polygonZkEVMBridgeAddress, + deployOutputParameters.polygonRollupManager, + ], + }, + ); + } catch (error) { + // expect(error.message.toLowerCase().includes('proxyadmin')).to.be.equal(true); + } + } } + } main() From c4976ac0c6e20f070d413e24f6773f0fc3fd06a5 Mon Sep 17 00:00:00 2001 From: Alejandro Date: Mon, 29 Jan 2024 18:25:09 +0100 Subject: [PATCH 187/230] Removed non-existing files --- deployment/README.md | 88 -------------------------------------------- upgrade/README.md | 54 --------------------------- 2 files changed, 142 deletions(-) delete mode 100644 deployment/README.md delete mode 100644 upgrade/README.md diff --git a/deployment/README.md b/deployment/README.md deleted file mode 100644 index b96ac825c..000000000 --- a/deployment/README.md +++ /dev/null @@ -1,88 +0,0 @@ -## Requirements - -- node version: 14.x -- npm version: 7.x - -## Deployment - -In project root execute: - -``` -npm i -cp .env.example .env -``` - -Fill `.env` with your `MNEMONIC` and `INFURA_PROJECT_ID` -If you want to verify the contracts also fill the `ETHERSCAN_API_KEY` - -``` -cd deployment -cp deploy_parameters.json.example deploy_parameters.json -``` - -Fill created `deploy_parameters.json` with appropriate parameters. -See below for more information about the `deploy_parameters.json` - -The first step is deploying and verifying the `PolygonZkEVMDeployer`, this will be the factory for deterministic contracts, the address of the contracts will depend on the `salt` and the `initialZkEVMDeployerOwner` - -This contrat is deployed using a keyless deployment, therefore the gasPrice is hardcoded. -The value is on `100 gweis`, if it's necessary to update it go to `helpers/deployment-helpers.js` and update the `gasPriceKeylessDeployment` constant. -Note that this operation will change all the deterministic address deployed. - -``` -npm run deploy:deployer:ZkEVM:goerli -npm run verify:deployer:ZkEVM:goerli -``` - -To deploy on testnet is necessary a token MATIC contract, therefore, there's another script that previously to the actual deployment, deploys a matic contracts and adds it automatically to the `deploy_parameters.json` - -To deploy on testnet use:`deploy:testnet:ZkEVM:${network}` - -In other cases use fullfill `maticTokenAddress` in the `deploy_parameters.json` and run `deploy:ZkEVM:${network}` - -``` -npm run deploy:testnet:ZkEVM:goerli - -``` - -To verify contracts use `npm run verify:ZkEVM:${network}` - -``` -npm run verify:ZkEVM:goerli -``` - -A new folder will be created with the following name `deployments/${network}_$(date +%s)` with all the output information and the OZ proxy information. - -## deploy-parameters.json - -- `realVerifier`: bool, Indicates whether deploy a real verifier or not -- `trustedSequencerURL`: string, trustedSequencer URL -- `networkName`: string, networkName -- `version`:string, will just be emitted at initialization of the contract, useful just for synchronizer -- `trustedSequencer`: address, trusted sequencer addresss -- `chainID`: uint64, chainID of the zkEVM -- `trustedAggregator`:address, Trusted aggregator address -- `trustedAggregatorTimeout`: uint64, If a sequence is not verified in this timeout everyone can verify it -- `pendingStateTimeout`: uint64, Once a pending state exceeds this timeout it can be consolidated -- `forkID`: uint64, Fork ID of the zkEVM, indicates the prover (zkROM/executor) version -- `admin`:address, Admin address, can adjust PolygonZkEVM parameters or stop the emergency state -- `zkEVMOwner`: address, Able to put the PolygonZkEVM into emergency state (kill switch) -- `timelockAddress`: address, Timelock owner address, able to send start an upgradability process via timelock -- `minDelayTimelock`: number, Minimum timelock delay, -- `salt`: bytes32, Salt used in `PolygonZkEVMDeployer` to deploy deterministic contracts, such as the PolygonZkEVMBridge -- `initialZkEVMDeployerOwner`: address, Initial owner of the `PolygonZkEVMDeployer` -- `maticTokenAddress`: address, Matic token address, only if deploy on testnet can be left blank and will fullfilled by the scripts. -- `zkEVMDeployerAddress`: address, Address of the `PolygonZkEVMDeployer`. Can be left blank, will be fullfilled automatically with the `deploy:deployer:ZkEVM:goerli` script. - -### Optional Parameters - -- `deployerPvtKey`: string, pvtKey of the deployer, overrides the address in `MNEMONIC` of `.env` if exist -- `maxFeePerGas`:string, Set `maxFeePerGas`, must define as well `maxPriorityFeePerGas` to use it -- `maxPriorityFeePerGas`:string, Set `maxPriorityFeePerGas`, must define as well `maxFeePerGas` to use it -- `multiplierGas`: number, Gas multiplier with 3 decimals. If `maxFeePerGas` and `maxPriorityFeePerGas` are set, this will not take effect - -## Notes - -- Since there are deterministic address you cannot deploy twice on the same network using the same `salt` and `initialZkEVMDeployerOwner`. Changing one of them is enough to make a new deployment. -- It's mandatory to delete the `.openzeppelin` upgradebility information in order to make a new deployment -- `genesis.json` has been generated using the tool: `1_createGenesis`, this script depends on the `deploy_parameters` as well. diff --git a/upgrade/README.md b/upgrade/README.md deleted file mode 100644 index 573afcccb..000000000 --- a/upgrade/README.md +++ /dev/null @@ -1,54 +0,0 @@ -## Requirements - -- node version: 14.x -- npm version: 7.x - -## Upgrade - -``` -npm i -cp .env.example .env -``` - -Fill `.env` with your `MNEMONIC` and `INFURA_PROJECT_ID` - -In order to upgrade the contracts we will need the information on `deployments/${network}_$(date +%s)` - -In project root, copy the `${network}.json` of the deployment that you want to upgrade and copy it on the `./.openzeppelin` -e.g. `cp deployments/${network}_$(date +%s)/${network}.json ./.openzeppelin` - -Then fill the upgrade parameters: - -``` -cd deployment -cp upgrade_parameters.json.example upgrade_parameters.json -``` - -Fill created `upgrade_parameters.json` with appropriate parameters. -You should fulfill the upgrades array, with all the updates that you intend to do ( more information in `upgrade-parameters.json` section) - -if the deployment was deployed without a timelock you can use the `simpleUpgradeScript.js`: - -- Run the script - -Otherwise, in case of timelock use `timeLockUpgrade.js` - -- Run the script -- Now the necessary transactions to interact with the timelock are printed in the screen `schedule` and `execute`, also will be saved in - `./upgrade_output_${new Date().getTime() / 1000}.json` file -- With the owner of the timelock (multisig or account), send the data printed by `schedule` to the `Timelock` contract. -- Once the necessary `timelockMinDelay` has expired, with the same account you can now send the data printed by `execute` to the `Timelock` contract and the contracts will be upgraded. - -## upgrade-parameters.json - -- `timelockMinDelay`: number, timelock delay between the schedule and execution, must be bigger than current min delay -- `upgrades`: Object, Indicates which address and to which implementation must upgrade - - address: address of the current proxy - - contractName: string, contract name that the proxy will be updated to - - constructorArgs: Array, optional, constructor arguments of the new implementation deployed - -### Optional Parameters - -- `multiplierGas`: number, Gas multiplier. If maxFeePerGas and maxPriorityFeePerGas are set, will not take effect -- `deployerPvtKey`: string, deployerPvtKey of the deployer -- `timelockSalt`: string, Optional salt for the timelock From 1359a7650a7b5acde4d1125a83ca81f4cf42dbce Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 29 Jan 2024 18:52:13 +0100 Subject: [PATCH 188/230] update optimizations on mockInternalTestnet --- hardhat.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hardhat.config.ts b/hardhat.config.ts index 30d4cdf4c..f21732c18 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -100,7 +100,7 @@ const config: HardhatUserConfig = { settings: { optimizer: { enabled: true, - runs: 99, + runs: 500, }, evmVersion: "shanghai", }, // try yul optimizer From 3dfdda54587077b4d7902984ae47e7eadaa28c99 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 29 Jan 2024 19:29:42 +0100 Subject: [PATCH 189/230] rename to testV1toV2 --- .../{v1ToV2 => testV1ToV2}/1_createGenesis.ts | 0 .../2_deployPolygonZKEVMDeployer.ts | 0 .../3_deployContracts.ts | 0 deployment/{v1ToV2 => testV1ToV2}/README.md | 0 .../deploy_parameters.json.example | 0 .../{v1ToV2 => testV1ToV2}/prepareTestnet.ts | 0 deployment/v2/genesis.json | 98 ------------------- docker/scripts/v1ToV2/deploy-docker.sh | 8 +- docker/scripts/v1ToV2/deploy-dockerv2.sh | 8 +- package.json | 10 +- 10 files changed, 13 insertions(+), 111 deletions(-) rename deployment/{v1ToV2 => testV1ToV2}/1_createGenesis.ts (100%) rename deployment/{v1ToV2 => testV1ToV2}/2_deployPolygonZKEVMDeployer.ts (100%) rename deployment/{v1ToV2 => testV1ToV2}/3_deployContracts.ts (100%) rename deployment/{v1ToV2 => testV1ToV2}/README.md (100%) rename deployment/{v1ToV2 => testV1ToV2}/deploy_parameters.json.example (100%) rename deployment/{v1ToV2 => testV1ToV2}/prepareTestnet.ts (100%) delete mode 100644 deployment/v2/genesis.json diff --git a/deployment/v1ToV2/1_createGenesis.ts b/deployment/testV1ToV2/1_createGenesis.ts similarity index 100% rename from deployment/v1ToV2/1_createGenesis.ts rename to deployment/testV1ToV2/1_createGenesis.ts diff --git a/deployment/v1ToV2/2_deployPolygonZKEVMDeployer.ts b/deployment/testV1ToV2/2_deployPolygonZKEVMDeployer.ts similarity index 100% rename from deployment/v1ToV2/2_deployPolygonZKEVMDeployer.ts rename to deployment/testV1ToV2/2_deployPolygonZKEVMDeployer.ts diff --git a/deployment/v1ToV2/3_deployContracts.ts b/deployment/testV1ToV2/3_deployContracts.ts similarity index 100% rename from deployment/v1ToV2/3_deployContracts.ts rename to deployment/testV1ToV2/3_deployContracts.ts diff --git a/deployment/v1ToV2/README.md b/deployment/testV1ToV2/README.md similarity index 100% rename from deployment/v1ToV2/README.md rename to deployment/testV1ToV2/README.md diff --git a/deployment/v1ToV2/deploy_parameters.json.example b/deployment/testV1ToV2/deploy_parameters.json.example similarity index 100% rename from deployment/v1ToV2/deploy_parameters.json.example rename to deployment/testV1ToV2/deploy_parameters.json.example diff --git a/deployment/v1ToV2/prepareTestnet.ts b/deployment/testV1ToV2/prepareTestnet.ts similarity index 100% rename from deployment/v1ToV2/prepareTestnet.ts rename to deployment/testV1ToV2/prepareTestnet.ts diff --git a/deployment/v2/genesis.json b/deployment/v2/genesis.json deleted file mode 100644 index f563ec296..000000000 --- a/deployment/v2/genesis.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "root": "0x40bdab77c40f497be8a427027b336f7a51a0692c3fb20ff36519bc5a79dc60fd", - "genesis": [ - { - "contractName": "PolygonZkEVMDeployer", - "balance": "0", - "nonce": "4", - "address": "0xFbD07134824dDEa24E4ae414c18ecbFa98169A24", - "bytecode": "0x60806040526004361061006e575f3560e01c8063715018a61161004c578063715018a6146100e25780638da5cb5b146100f6578063e11ae6cb1461011f578063f2fde38b14610132575f80fd5b80632b79805a146100725780634a94d487146100875780636d07dbf81461009a575b5f80fd5b610085610080366004610908565b610151565b005b6100856100953660046109a2565b6101c2565b3480156100a5575f80fd5b506100b96100b43660046109f5565b610203565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ed575f80fd5b50610085610215565b348015610101575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff166100b9565b61008561012d366004610a15565b610228565b34801561013d575f80fd5b5061008561014c366004610a61565b61028e565b61015961034a565b5f6101658585856103ca565b90506101718183610527565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a15050505050565b6101ca61034a565b6101d583838361056a565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b905f90a1505050565b5f61020e8383610598565b9392505050565b61021d61034a565b6102265f6105a4565b565b61023061034a565b5f61023c8484846103ca565b60405173ffffffffffffffffffffffffffffffffffffffff821681529091507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a150505050565b61029661034a565b73ffffffffffffffffffffffffffffffffffffffff811661033e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610347816105a4565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610335565b5f83471015610435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610335565b81515f0361049f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610335565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff811661020e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610335565b606061020e83835f6040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c65640000815250610618565b6060610590848484604051806060016040528060298152602001610b0860299139610618565b949350505050565b5f61020e83833061072d565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156106aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610335565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516106d29190610a9c565b5f6040518083038185875af1925050503d805f811461070c576040519150601f19603f3d011682016040523d82523d5f602084013e610711565b606091505b509150915061072287838387610756565b979650505050505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b606083156107eb5782515f036107e45773ffffffffffffffffffffffffffffffffffffffff85163b6107e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610335565b5081610590565b61059083838151156108005781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103359190610ab7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112610870575f80fd5b813567ffffffffffffffff8082111561088b5761088b610834565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156108d1576108d1610834565b816040528381528660208588010111156108e9575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f806080858703121561091b575f80fd5b8435935060208501359250604085013567ffffffffffffffff80821115610940575f80fd5b61094c88838901610861565b93506060870135915080821115610961575f80fd5b5061096e87828801610861565b91505092959194509250565b803573ffffffffffffffffffffffffffffffffffffffff8116811461099d575f80fd5b919050565b5f805f606084860312156109b4575f80fd5b6109bd8461097a565b9250602084013567ffffffffffffffff8111156109d8575f80fd5b6109e486828701610861565b925050604084013590509250925092565b5f8060408385031215610a06575f80fd5b50508035926020909101359150565b5f805f60608486031215610a27575f80fd5b8335925060208401359150604084013567ffffffffffffffff811115610a4b575f80fd5b610a5786828701610861565b9150509250925092565b5f60208284031215610a71575f80fd5b61020e8261097a565b5f5b83811015610a94578181015183820152602001610a7c565b50505f910152565b5f8251610aad818460208701610a7a565b9190910192915050565b602081525f8251806020840152610ad5816040850160208701610a7a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220330b94dc698c4d290bf55c23f13b473cde6a6bae0030cb902de18af54e35839f64736f6c63430008140033", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" - } - }, - { - "contractName": "ProxyAdmin", - "balance": "0", - "nonce": "1", - "address": "0xfADB60b5059e31614e02083fF6C021a24C31c891", - "bytecode": "0x608060405260043610610079575f3560e01c80639623609d1161004c5780639623609d1461012357806399a88ec414610136578063f2fde38b14610155578063f3b7dead14610174575f80fd5b8063204e1c7a1461007d578063715018a6146100c55780637eff275e146100db5780638da5cb5b146100fa575b5f80fd5b348015610088575f80fd5b5061009c6100973660046105e8565b610193565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100d0575f80fd5b506100d9610244565b005b3480156100e6575f80fd5b506100d96100f536600461060a565b610257565b348015610105575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff1661009c565b6100d961013136600461066e565b6102e0565b348015610141575f80fd5b506100d961015036600461060a565b610371565b348015610160575f80fd5b506100d961016f3660046105e8565b6103cd565b34801561017f575f80fd5b5061009c61018e3660046105e8565b610489565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907f5c60da1b00000000000000000000000000000000000000000000000000000000815260040190565b5f60405180830381855afa9150503d805f8114610215576040519150601f19603f3d011682016040523d82523d5f602084013e61021a565b606091505b509150915081610228575f80fd5b8080602001905181019061023c919061075b565b949350505050565b61024c6104d3565b6102555f610553565b565b61025f6104d3565b6040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690638f283970906024015b5f604051808303815f87803b1580156102c6575f80fd5b505af11580156102d8573d5f803e3d5ffd5b505050505050565b6102e86104d3565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef28690349061033e9086908690600401610776565b5f604051808303818588803b158015610355575f80fd5b505af1158015610367573d5f803e3d5ffd5b5050505050505050565b6103796104d3565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690633659cfe6906024016102af565b6103d56104d3565b73ffffffffffffffffffffffffffffffffffffffff811661047d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61048681610553565b50565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907ff851a44000000000000000000000000000000000000000000000000000000000815260040190565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610474565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610486575f80fd5b5f602082840312156105f8575f80fd5b8135610603816105c7565b9392505050565b5f806040838503121561061b575f80fd5b8235610626816105c7565b91506020830135610636816105c7565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f805f60608486031215610680575f80fd5b833561068b816105c7565b9250602084013561069b816105c7565b9150604084013567ffffffffffffffff808211156106b7575f80fd5b818601915086601f8301126106ca575f80fd5b8135818111156106dc576106dc610641565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561072257610722610641565b8160405282815289602084870101111561073a575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f6020828403121561076b575f80fd5b8151610603816105c7565b73ffffffffffffffffffffffffffffffffffffffff831681525f602060408184015283518060408501525f5b818110156107be578581018301518582016060015282016107a2565b505f6060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050939250505056fea26469706673582212203083a4ccc2e42eed60bd19037f2efa77ed086dc7a5403f75bebb995dcba2221c64736f6c63430008140033", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f" - } - }, - { - "contractName": "PolygonZkEVMBridge implementation", - "balance": "0", - "nonce": "1", - "address": "0x7Cd6d5063c7782d34E2b1b03ED89ecf4A1412148", - "bytecode": "0x608060405260043610620001d3575f3560e01c80638ed7e3f211620000fa578063cd5865791162000092578063dbc16976116200006a578063dbc169761462000685578063ee25560b146200069c578063f5efcd7914620006cb578063fb57083414620006ef575f80fd5b8063cd5865791462000620578063d02103ca1462000637578063d3476afe1462000661575f80fd5b8063bab161bf11620000d2578063bab161bf146200057a578063be5831c7146200059d578063cc46163214620005d8578063ccaa2d1114620005fc575f80fd5b80638ed7e3f21462000511578063aaa13cc21462000532578063b8b284d01462000556575f80fd5b80633cbc795b116200016e5780635ca1e16511620001465780635ca1e165146200048757806379e2cf97146200049e57806381b1c17414620004b557806383f2440314620004ed575f80fd5b80633cbc795b14620003285780633e19704314620003745780634b2f336d1462000466575f80fd5b8063240ff37811620001ae578063240ff378146200025d5780632dfdf0b51462000274578063318aee3d146200029a5780633c351e101462000307575f80fd5b806315064c9614620001d75780632072f6c5146200020757806322e95f2c1462000220575b5f80fd5b348015620001e3575f80fd5b50606854620001f29060ff1681565b60405190151581526020015b60405180910390f35b34801562000213575f80fd5b506200021e62000713565b005b3480156200022c575f80fd5b50620002446200023e36600462003723565b62000764565b6040516001600160a01b039091168152602001620001fe565b6200021e6200026e366004620037b3565b620007f9565b34801562000280575f80fd5b506200028b60535481565b604051908152602001620001fe565b348015620002a6575f80fd5b50620002e2620002b836600462003832565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201620001fe565b34801562000313575f80fd5b50606d5462000244906001600160a01b031681565b34801562000334575f80fd5b50606d546200035e9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001620001fe565b34801562000380575f80fd5b506200028b6200039236600462003866565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b34801562000472575f80fd5b50606e5462000244906001600160a01b031681565b34801562000493575f80fd5b506200028b62000862565b348015620004aa575f80fd5b506200021e62000947565b348015620004c1575f80fd5b5062000244620004d3366004620038eb565b606a6020525f90815260409020546001600160a01b031681565b348015620004f9575f80fd5b506200028b6200050b36600462003915565b62000981565b3480156200051d575f80fd5b50606c5462000244906001600160a01b031681565b3480156200053e575f80fd5b50620002446200055036600462003956565b62000a64565b34801562000562575f80fd5b506200021e6200057436600462003a03565b62000bf4565b34801562000586575f80fd5b506068546200035e90610100900463ffffffff1681565b348015620005a9575f80fd5b506068546200035e90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b348015620005e4575f80fd5b50620001f2620005f636600462003a8b565b62000cc9565b34801562000608575f80fd5b506200021e6200061a36600462003ac1565b62000d58565b6200021e6200063136600462003bb5565b6200144d565b34801562000643575f80fd5b5060685462000244906501000000000090046001600160a01b031681565b3480156200066d575f80fd5b506200021e6200067f36600462003c51565b62001a03565b34801562000691575f80fd5b506200021e62001dd7565b348015620006a8575f80fd5b506200028b620006ba366004620038eb565b60696020525f908152604090205481565b348015620006d7575f80fd5b506200021e620006e936600462003ac1565b62001e26565b348015620006fb575f80fd5b50620001f26200070d36600462003cc5565b620021aa565b606c546001600160a01b0316331462000758576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000762620021c5565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b3415801590620008135750606e546001600160a01b031615155b156200084b576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200085b85853486868662002258565b5050505050565b6053545f90819081805b60208110156200093e578083901c600116600103620008cf57603381602081106200089b576200089b62003d0f565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620008fc565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620009359062003d69565b9150506200086c565b50919392505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000762576200076262002340565b5f83815b602081101562000a5b57600163ffffffff8516821c81169003620009f757848160208110620009b857620009b862003d0f565b602002013582604051602001620009d9929190918252602082015260400190565b60405160208183030381529060405280519060200120915062000a46565b8185826020811062000a0d5762000a0d62003d0f565b602002013560405160200162000a2d929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062000a528162003d69565b91505062000985565b50949350505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b30836040518060200162000af890620036e9565b601f1982820381018352601f90910116604081905262000b25908d908d908d908d908d9060200162003dcc565b60408051601f198184030181529082905262000b45929160200162003e30565b6040516020818303038152906040528051906020012060405160200162000bce94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b606e546001600160a01b031662000c37576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606e546040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018690526001600160a01b0390911690639dc29fac906044015f604051808303815f87803b15801562000c9a575f80fd5b505af115801562000cad573d5f803e3d5ffd5b5050505062000cc186868686868662002258565b505050505050565b6068545f908190610100900463ffffffff1615801562000cef575063ffffffff83166001145b1562000d03575063ffffffff831662000d2f565b62000d1a64010000000063ffffffff851662003e62565b62000d2c9063ffffffff861662003e7c565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff161562000d96576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161462000de0576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000ee78c8c8c8c8c62000ee15f8e8e8e8e8e8e8e60405162000e0592919062003e92565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62002409565b6001600160a01b0386166200105657606e546001600160a01b031662000fd4575f6001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801562000f40576020820181803683370190505b5060405162000f50919062003ece565b5f6040518083038185875af1925050503d805f811462000f8c576040519150601f19603f3d011682016040523d82523d5f602084013e62000f91565b606091505b505090508062000fcd576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50620013e3565b606e546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015260248201869052909116906340c10f19906044015f604051808303815f87803b15801562001039575f80fd5b505af11580156200104c573d5f803e3d5ffd5b50505050620013e3565b606d546001600160a01b038781169116148015620010965750606d5463ffffffff8881167401000000000000000000000000000000000000000090920416145b15620010af575f6001600160a01b038516848262000f15565b60685463ffffffff610100909104811690881603620010e457620010de6001600160a01b0387168585620025e1565b620013e3565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b03168062001367575f80806200118b8688018862003fa1565b9250925092505f85848484604051620011a490620036e9565b620011b2939291906200404a565b8190604051809103905ff5905080158015620011d0573d5f803e3d5ffd5b506040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562001236575f80fd5b505af115801562001249573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b6040516200135595949392919062004086565b60405180910390a150505050620013e0565b6040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b158015620013c8575f80fd5b505af1158015620013db573d5f803e3d5ffd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156200148b576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200149562002691565b60685463ffffffff610100909104811690881603620014e0576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f806060876001600160a01b03881662001563578834146200152e576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d546001600160a01b038116945074010000000000000000000000000000000000000000900463ffffffff169250620018a2565b34156200159c576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606e546001600160a01b03908116908916036200162f576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018a90526001600160a01b03891690639dc29fac906044015f604051808303815f87803b15801562001612575f80fd5b505af115801562001625573d5f803e3d5ffd5b50505050620018a2565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620016fe576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b90526001600160a01b038a1690639dc29fac906044015f604051808303815f87803b158015620016d4575f80fd5b505af1158015620016e7573d5f803e3d5ffd5b5050505080602001519450805f01519350620018a0565b8515620017135762001713898b898962002706565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa15801562001771573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620017979190620040c0565b9050620017b06001600160a01b038b1633308e62002bb1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa1580156200180e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620018349190620040c0565b9050620018428282620040d8565b6068548c9850610100900463ffffffff1696509350620018628762002c04565b6200186d8c62002d0b565b620018788d62002e07565b6040516020016200188c939291906200404a565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620018e3989796959493929190620040ee565b60405180910390a1620019db620019d55f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62002ef2565b8615620019ec57620019ec62002340565b50505050620019fa60018055565b50505050505050565b5f54610100900460ff161580801562001a2257505f54600160ff909116105b8062001a3d5750303b15801562001a3d57505f5460ff166001145b62001acf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801562001b2c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8916027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016848316179055606d541662001c3157606d5474010000000000000000000000000000000000000000900463ffffffff161562001c2b576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001d63565b606d805463ffffffff861674010000000000000000000000000000000000000000027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b038816171790556040515f9060129062001c9890620036e9565b6060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff909116604082015260e0018190604051809103905ff590508015801562001d29573d5f803e3d5ffd5b50606e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790555b62001d6d62003007565b801562000cc1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b606c546001600160a01b0316331462001e1c576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000762620030a9565b60685460ff161562001e64576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161462001eae576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001ed48c8c8c8c8c62000ee160018e8e8e8e8e8e8e60405162000e0592919062003e92565b606e545f906001600160a01b031662001fbd57846001600160a01b031684888a868660405160240162001f0b949392919062004159565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f2000000000000000000000000000000000000000000000000000000001790525162001f70919062003ece565b5f6040518083038185875af1925050503d805f811462001fac576040519150601f19603f3d011682016040523d82523d5f602084013e62001fb1565b606091505b50508091505062002107565b606e546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260248201879052909116906340c10f19906044015f604051808303815f87803b15801562002022575f80fd5b505af115801562002035573d5f803e3d5ffd5b50505050846001600160a01b0316878985856040516024016200205c949392919062004159565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f20000000000000000000000000000000000000000000000000000000017905251620020c1919062003ece565b5f604051808303815f865af19150503d805f8114620020fc576040519150601f19603f3d011682016040523d82523d5f602084013e62002101565b606091505b50909150505b806200213f576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f81620021b986868662000981565b1490505b949350505050565b60685460ff161562002203576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff610100909104811690871603620022a3576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051620022f99998979695949392919062004193565b60405180910390a162002334620019d56001606860019054906101000a900463ffffffff16338a8a8a898960405162000e0592919062003e92565b821562000cc15762000cc15b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d620023b962000862565b6040518263ffffffff1660e01b8152600401620023d891815260200190565b5f604051808303815f87803b158015620023f0575f80fd5b505af115801562002403573d5f803e3d5ffd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af11580156200249b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620024c19190620040c0565b9050805f03620024fc576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80680100000000000000008716600103620025605786915062002523848a8489620021aa565b6200255a576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620025ca565b602087901c6200257281600162004200565b91508792506200259162002588868c8662000981565b8a8389620021aa565b620025c8576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b620025d6828262003138565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526200268c9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262003200565b505050565b600260015403620026ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001ac6565b6002600155565b5f62002716600482848662004227565b620027219162004250565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002967575f80808080808062002783896004818d62004227565b81019062002792919062004299565b9650965096509650965096509650336001600160a01b0316876001600160a01b031614620027ec576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03861630146200282f576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002869576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002917919062003ece565b5f604051808303815f865af19150503d805f811462002952576040519150601f19603f3d011682016040523d82523d5f602084013e62002957565b606091505b505050505050505050506200085b565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c0000000000000000000000000000000000000000000000000000000014620029e3576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80808080808080620029fa8a6004818e62004227565b81019062002a099190620042ef565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462002a65576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038716301462002aa8576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002b5f919062003ece565b5f604051808303815f865af19150503d805f811462002b9a576040519150601f19603f3d011682016040523d82523d5f602084013e62002b9f565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052620024039085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002627565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b0386169162002c7a919062003ece565b5f60405180830381855afa9150503d805f811462002cb4576040519150601f19603f3d011682016040523d82523d5f602084013e62002cb9565b606091505b50915091508162002d00576040518060400160405280600781526020017f4e4f5f4e414d4500000000000000000000000000000000000000000000000000815250620021bd565b620021bd8162003305565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b0386169162002d81919062003ece565b5f60405180830381855afa9150503d805f811462002dbb576040519150601f19603f3d011682016040523d82523d5f602084013e62002dc0565b606091505b50915091508162002d00576040518060400160405280600981526020017f4e4f5f53594d424f4c0000000000000000000000000000000000000000000000815250620021bd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b0386169162002e7c919062003ece565b5f60405180830381855afa9150503d805f811462002eb6576040519150601f19603f3d011682016040523d82523d5f602084013e62002ebb565b606091505b509150915081801562002ecf575080516020145b62002edc576012620021bd565b80806020019051810190620021bd919062004376565b80600162002f0360206002620044cb565b62002f0f9190620040d8565b6053541062002f4a576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462002f5b9062003d69565b918290555090505f5b602081101562002ff6578082901c60011660010362002f9c57826033826020811062002f945762002f9462003d0f565b015550505050565b6033816020811062002fb25762002fb262003d0f565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062002fed9062003d69565b91505062002f64565b506200268c620044d8565b60018055565b5f54610100900460ff166200309f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001ac6565b62000762620034f0565b60685460ff16620030e6576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b6068545f90610100900463ffffffff161580156200315c575063ffffffff82166001145b1562003170575063ffffffff82166200319c565b6200318764010000000063ffffffff841662003e62565b620031999063ffffffff851662003e7c565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620019fa576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62003256826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620035889092919063ffffffff16565b8051909150156200268c578080602001905181019062003277919062004505565b6200268c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001ac6565b60606040825110620033275781806020019051810190620007f3919062004523565b8151602003620034b2575f5b6020811080156200337e575082818151811062003354576200335462003d0f565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620033995780620033908162003d69565b91505062003333565b805f03620033dc57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115620033f957620033f962003ea1565b6040519080825280601f01601f19166020018201604052801562003424576020820181803683370190505b5090505f5b82811015620034aa5784818151811062003447576200344762003d0f565b602001015160f81c60f81b82828151811062003467576200346762003d0f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620034a18162003d69565b91505062003429565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b5f54610100900460ff1662003001576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001ac6565b6060620021bd84845f85855f80866001600160a01b03168587604051620035b0919062003ece565b5f6040518083038185875af1925050503d805f8114620035ec576040519150601f19603f3d011682016040523d82523d5f602084013e620035f1565b606091505b509150915062003604878383876200360f565b979650505050505050565b606083156200369c5782515f0362003694576001600160a01b0385163b62003694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001ac6565b5081620021bd565b620021bd8383815115620036b35781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001ac691906200459e565b6119a180620045b383390190565b803563ffffffff81168114620034eb575f80fd5b6001600160a01b038116811462003720575f80fd5b50565b5f806040838503121562003735575f80fd5b6200374083620036f7565b9150602083013562003752816200370b565b809150509250929050565b801515811462003720575f80fd5b5f8083601f8401126200377c575f80fd5b50813567ffffffffffffffff81111562003794575f80fd5b602083019150836020828501011115620037ac575f80fd5b9250929050565b5f805f805f60808688031215620037c8575f80fd5b620037d386620036f7565b94506020860135620037e5816200370b565b93506040860135620037f7816200375d565b9250606086013567ffffffffffffffff81111562003813575f80fd5b62003821888289016200376b565b969995985093965092949392505050565b5f6020828403121562003843575f80fd5b813562003850816200370b565b9392505050565b60ff8116811462003720575f80fd5b5f805f805f805f60e0888a0312156200387d575f80fd5b87356200388a8162003857565b96506200389a60208901620036f7565b95506040880135620038ac816200370b565b9450620038bc60608901620036f7565b93506080880135620038ce816200370b565b9699959850939692959460a0840135945060c09093013592915050565b5f60208284031215620038fc575f80fd5b5035919050565b806104008101831015620007f3575f80fd5b5f805f610440848603121562003929575f80fd5b833592506200393c856020860162003903565b91506200394d6104208501620036f7565b90509250925092565b5f805f805f805f60a0888a0312156200396d575f80fd5b6200397888620036f7565b965060208801356200398a816200370b565b9550604088013567ffffffffffffffff80821115620039a7575f80fd5b620039b58b838c016200376b565b909750955060608a0135915080821115620039ce575f80fd5b50620039dd8a828b016200376b565b9094509250506080880135620039f38162003857565b8091505092959891949750929550565b5f805f805f8060a0878903121562003a19575f80fd5b62003a2487620036f7565b9550602087013562003a36816200370b565b945060408701359350606087013562003a4f816200375d565b9250608087013567ffffffffffffffff81111562003a6b575f80fd5b62003a7989828a016200376b565b979a9699509497509295939492505050565b5f806040838503121562003a9d575f80fd5b62003aa883620036f7565b915062003ab860208401620036f7565b90509250929050565b5f805f805f805f805f805f806109208d8f03121562003ade575f80fd5b62003aea8e8e62003903565b9b5062003afc8e6104008f0162003903565b9a506108008d013599506108208d013598506108408d0135975062003b256108608e01620036f7565b965062003b376108808e01356200370b565b6108808d0135955062003b4e6108a08e01620036f7565b945062003b606108c08e01356200370b565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111562003b8a575f80fd5b62003b9d8e6109008f01358f016200376b565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121562003bcc575f80fd5b62003bd788620036f7565b9650602088013562003be9816200370b565b955060408801359450606088013562003c02816200370b565b9350608088013562003c14816200375d565b925060a088013567ffffffffffffffff81111562003c30575f80fd5b62003c3e8a828b016200376b565b989b979a50959850939692959293505050565b5f805f805f60a0868803121562003c66575f80fd5b62003c7186620036f7565b9450602086013562003c83816200370b565b935062003c9360408701620036f7565b9250606086013562003ca5816200370b565b9150608086013562003cb7816200370b565b809150509295509295909350565b5f805f80610460858703121562003cda575f80fd5b8435935062003ced866020870162003903565b925062003cfe6104208601620036f7565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003d9c5762003d9c62003d3c565b5060010190565b81835281816020850137505f602082840101525f6020601f19601f840116840101905092915050565b606081525f62003de160608301878962003da3565b828103602084015262003df681868862003da3565b91505060ff831660408301529695505050505050565b5f5b8381101562003e2857818101518382015260200162003e0e565b50505f910152565b5f835162003e4381846020880162003e0c565b83519083019062003e5981836020880162003e0c565b01949350505050565b8082028115828204841417620007f357620007f362003d3c565b80820180821115620007f357620007f362003d3c565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f825162003ee181846020870162003e0c565b9190910192915050565b604051601f8201601f1916810167ffffffffffffffff8111828210171562003f175762003f1762003ea1565b604052919050565b5f67ffffffffffffffff82111562003f3b5762003f3b62003ea1565b50601f01601f191660200190565b5f82601f83011262003f59575f80fd5b813562003f7062003f6a8262003f1f565b62003eeb565b81815284602083860101111562003f85575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003fb4575f80fd5b833567ffffffffffffffff8082111562003fcc575f80fd5b62003fda8783880162003f49565b9450602086013591508082111562003ff0575f80fd5b5062003fff8682870162003f49565b9250506040840135620040128162003857565b809150509250925092565b5f81518084526200403681602086016020860162003e0c565b601f01601f19169290920160200192915050565b606081525f6200405e60608301866200401d565b82810360208401526200407281866200401d565b91505060ff83166040830152949350505050565b63ffffffff861681525f6001600160a01b038087166020840152808616604084015250608060608301526200360460808301848662003da3565b5f60208284031215620040d1575f80fd5b5051919050565b81810381811115620007f357620007f362003d3c565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c085015262004140828501876200401d565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f6200418960608301848662003da3565b9695505050505050565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620041e6828501878962003da3565b925080851660e085015250509a9950505050505050505050565b63ffffffff81811683821601908082111562004220576200422062003d3c565b5092915050565b5f808585111562004236575f80fd5b8386111562004243575f80fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620042915780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215620042b0575f80fd5b8735620042bd816200370b565b96506020880135620042cf816200370b565b955060408801359450606088013593506080880135620038ce8162003857565b5f805f805f805f80610100898b03121562004308575f80fd5b883562004315816200370b565b9750602089013562004327816200370b565b96506040890135955060608901359450608089013562004347816200375d565b935060a0890135620043598162003857565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004387575f80fd5b8151620038508162003857565b600181815b80851115620043f357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620043d757620043d762003d3c565b80851615620043e557918102915b93841c939080029062004399565b509250929050565b5f826200440b57506001620007f3565b816200441957505f620007f3565b81600181146200443257600281146200443d576200445d565b6001915050620007f3565b60ff84111562004451576200445162003d3c565b50506001821b620007f3565b5060208310610133831016604e8410600b841016171562004482575081810a620007f3565b6200448e838362004394565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620044c357620044c362003d3c565b029392505050565b5f620038508383620043fb565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6020828403121562004516575f80fd5b815162003850816200375d565b5f6020828403121562004534575f80fd5b815167ffffffffffffffff8111156200454b575f80fd5b8201601f810184136200455c575f80fd5b80516200456d62003f6a8262003f1f565b81815285602083850101111562004582575f80fd5b6200459582602083016020860162003e0c565b95945050505050565b602081525f6200385060208301846200401d56fe61010060405234801562000011575f80fd5b50604051620019a1380380620019a1833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516115036200049e5f395f61022d01525f81816102fb015281816105ad015261067a01525f61052801525f818161036d01526104f201526115035ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b6040516101879190611255565b60405180910390f35b6101a361019e3660046112e6565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461130e565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d3660046112e6565b61054a565b6102856102803660046112e6565b610595565b005b6101b7610295366004611347565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca366004611347565b60056020525f908152604090205481565b61017a610653565b6102856102f13660046112e6565b610662565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a36103503660046112e6565b610717565b6101a36103633660046112e6565b6107cd565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d366004611367565b6107da565b6101b76103b03660046113d4565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611405565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611405565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610ad7565b60019150505b92915050565b5f336104d9858285610c56565b6104e4858585610d12565b506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000046146105255761052046610f31565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c09082908690610590908790611483565b610ad7565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106455760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61064f8282610ff8565b5050565b60606004805461043290611405565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461070d5760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d42726964676500000000000000000000000000000000606482015260840161063c565b61064f82826110cf565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107c05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161063c565b6104e48286868403610ad7565b5f336104c0818585610d12565b8342111561084f5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d697400000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866108a883611496565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6109126104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156109d3573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610a4e57508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610ac05760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e617475726500000000000000000000000000000000000000000000000000606482015260840161063c565b610acb8a8a8a610ad7565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610b5f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610be85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d0c5781811015610cff5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161063c565b610d0c8484848403610ad7565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610d9b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8216610e245760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610ebf5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610d0c565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610f5b610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff821661105b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161063c565b8060025f82825461106c9190611483565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166111585760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260208190526040902054818110156111f35760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161063c565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610c49565b5f6020808352835180828501525f5b8181101561128057858101830151858201604001528201611264565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146112e1575f80fd5b919050565b5f80604083850312156112f7575f80fd5b611300836112be565b946020939093013593505050565b5f805f60608486031215611320575f80fd5b611329846112be565b9250611337602085016112be565b9150604084013590509250925092565b5f60208284031215611357575f80fd5b611360826112be565b9392505050565b5f805f805f805f60e0888a03121561137d575f80fd5b611386886112be565b9650611394602089016112be565b95506040880135945060608801359350608088013560ff811681146113b7575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f80604083850312156113e5575f80fd5b6113ee836112be565b91506113fc602084016112be565b90509250929050565b600181811c9082168061141957607f821691505b602082108103611450577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c6611456565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036114c6576114c6611456565b506001019056fea2646970667358221220176a1a9cf4a702d3853b858873fff4a6370c4e5d7d72d68593ec0ebe64fcc26964736f6c63430008140033a26469706673582212209002ffc0c7cb9056d22d47ac65cf05714a8ae8ce0af7e882f7e68b9fdede830e64736f6c63430008140033" - }, - { - "contractName": "PolygonZkEVMBridge proxy", - "balance": "340282366920938463463374607431768211455", - "nonce": "1", - "address": "0x40E0576c0A7dff9dc460B29ba73e79aBf73dD2a9", - "bytecode": "0x60806040526004361061005d575f3560e01c80635c60da1b116100425780635c60da1b146100a65780638f283970146100e3578063f851a440146101025761006c565b80633659cfe6146100745780634f1ef286146100935761006c565b3661006c5761006a610116565b005b61006a610116565b34801561007f575f80fd5b5061006a61008e366004610854565b610130565b61006a6100a136600461086d565b610178565b3480156100b1575f80fd5b506100ba6101eb565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee575f80fd5b5061006a6100fd366004610854565b610228565b34801561010d575f80fd5b506100ba610255565b61011e610282565b61012e610129610359565b610362565b565b610138610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d8160405180602001604052805f8152505f6103bf565b50565b61016d610116565b610180610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101e3576101de8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250600192506103bf915050565b505050565b6101de610116565b5f6101f4610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610359565b905090565b610225610116565b90565b610230610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d816103e9565b5f61025e610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610380565b61028a610380565b73ffffffffffffffffffffffffffffffffffffffff16330361012e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b5f61021861044a565b365f80375f80365f845af43d5f803e80801561037c573d5ff35b3d5ffd5b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b6103c883610471565b5f825111806103d45750805b156101de576103e383836104bd565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f610412610380565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a161016d816104e9565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103a3565b61047a816105f5565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606104e28383604051806060016040528060278152602001610977602791396106c0565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811661058c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610350565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b73ffffffffffffffffffffffffffffffffffffffff81163b610699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610350565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105af565b60605f808573ffffffffffffffffffffffffffffffffffffffff16856040516106e9919061090b565b5f60405180830381855af49150503d805f8114610721576040519150601f19603f3d011682016040523d82523d5f602084013e610726565b606091505b509150915061073786838387610741565b9695505050505050565b606083156107d65782515f036107cf5773ffffffffffffffffffffffffffffffffffffffff85163b6107cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610350565b50816107e0565b6107e083836107e8565b949350505050565b8151156107f85781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103509190610926565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f575f80fd5b919050565b5f60208284031215610864575f80fd5b6104e28261082c565b5f805f6040848603121561087f575f80fd5b6108888461082c565b9250602084013567ffffffffffffffff808211156108a4575f80fd5b818601915086601f8301126108b7575f80fd5b8135818111156108c5575f80fd5b8760208285010111156108d6575f80fd5b6020830194508093505050509250925092565b5f5b838110156109035781810151838201526020016108eb565b50505f910152565b5f825161091c8184602087016108e9565b9190910192915050565b602081525f82518060208401526109448160408501602087016108e9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212202ac98acbfbb3d3ac1b74050e18c4e76db25a3ff2801ec69bf85d0c61414d502b64736f6c63430008140033", - "storage": { - "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000fadb60b5059e31614e02083ff6c021a24c31c891", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000007cd6d5063c7782d34e2b1b03ed89ecf4a1412148" - } - }, - { - "contractName": "PolygonZkEVMGlobalExitRootL2 implementation", - "balance": "0", - "nonce": "1", - "address": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9", - "bytecode": "0x608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301fd90441461004e578063257b36321461006a57806333d6247d14610089578063a3c573eb1461009e575b5f80fd5b61005760015481565b6040519081526020015b60405180910390f35b61005761007836600461015e565b5f6020819052908152604090205481565b61009c61009736600461015e565b6100ea565b005b6100c57f00000000000000000000000040e0576c0a7dff9dc460b29ba73e79abf73dd2a981565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610061565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000040e0576c0a7dff9dc460b29ba73e79abf73dd2a91614610159576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b5f6020828403121561016e575f80fd5b503591905056fea26469706673582212205108c6c4f924146b736832a1bdf696e20d900450207b7452462368d150f2c71c64736f6c63430008140033" - }, - { - "contractName": "PolygonZkEVMGlobalExitRootL2 proxy", - "balance": "0", - "nonce": "1", - "address": "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa", - "bytecode": "0x60806040523661001357610011610017565b005b6100115b61001f6101b7565b6001600160a01b0316336001600160a01b0316141561016f5760606001600160e01b031960003516631b2ce7f360e11b8114156100655761005e6101ea565b9150610167565b6001600160e01b0319811663278f794360e11b14156100865761005e610241565b6001600160e01b031981166308f2839760e41b14156100a75761005e610287565b6001600160e01b031981166303e1469160e61b14156100c85761005e6102b8565b6001600160e01b03198116635c60da1b60e01b14156100e95761005e6102f8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b61017761030c565b565b606061019e83836040518060600160405280602781526020016108576027913961031c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101f4610394565b600061020336600481846106a2565b81019061021091906106e8565b905061022d8160405180602001604052806000815250600061039f565b505060408051602081019091526000815290565b606060008061025336600481846106a2565b8101906102609190610719565b915091506102708282600161039f565b604051806020016040528060008152509250505090565b6060610291610394565b60006102a036600481846106a2565b8101906102ad91906106e8565b905061022d816103cb565b60606102c2610394565b60006102cc6101b7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b6060610302610394565b60006102cc610422565b610177610317610422565b610431565b6060600080856001600160a01b0316856040516103399190610807565b600060405180830381855af49150503d8060008114610374576040519150601f19603f3d011682016040523d82523d6000602084013e610379565b606091505b509150915061038a86838387610455565b9695505050505050565b341561017757600080fd5b6103a8836104d3565b6000825111806103b55750805b156103c6576103c48383610179565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103f46101b7565b604080516001600160a01b03928316815291841660208301520160405180910390a161041f81610513565b50565b600061042c6105bc565b905090565b3660008037600080366000845af43d6000803e808015610450573d6000f35b3d6000fd5b606083156104c15782516104ba576001600160a01b0385163b6104ba5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161015e565b50816104cb565b6104cb83836105e4565b949350505050565b6104dc8161060e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105785760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161015e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101db565b8151156105f45781518083602001fd5b8060405162461bcd60e51b815260040161015e9190610823565b6001600160a01b0381163b61067b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161015e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61059b565b600080858511156106b257600080fd5b838611156106bf57600080fd5b5050820193919092039150565b80356001600160a01b03811681146106e357600080fd5b919050565b6000602082840312156106fa57600080fd5b61019e826106cc565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561072c57600080fd5b610735836106cc565b9150602083013567ffffffffffffffff8082111561075257600080fd5b818501915085601f83011261076657600080fd5b81358181111561077857610778610703565b604051601f8201601f19908116603f011681019083821181831017156107a0576107a0610703565b816040528281528860208487010111156107b957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107f65781810151838201526020016107de565b838111156103c45750506000910152565b600082516108198184602087016107db565b9190910192915050565b60208152600082518060208401526108428160408501602087016107db565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122012bb4f564f73959a03513dc74fc3c6e40e8386e6f02c16b78d6db00ce0aa16af64736f6c63430008090033", - "storage": { - "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000fadb60b5059e31614e02083ff6c021a24c31c891", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9" - } - }, - { - "contractName": "PolygonZkEVMTimelock", - "balance": "0", - "nonce": "1", - "address": "0x0165878A594ca255338adfa4d48449f69242Eb8F", - "bytecode": "0x6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220d904e0b10230579952f8427a107aa4349f9a1f5799108d399b11e28b578463e464736f6c63430008140033", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000e10", - "0xaedcc9e7897c0d335bdc5d92fe3a8b4f23727fe558cd1c19f332b28716a30559": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0xf5e61edb9c9cc6bfbae4463e9a2b1dd6ac3b44ddef38f18016e56ba0363910d9": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x64494413541ff93b31aa309254e3fed72a7456e9845988b915b4c7a7ceba8814": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", - "0x60b9d94c75b7b3f721925089391e4644cd890cb5e6466f9596dfbd2c54e0b280": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x3412d5605ac6cd444957cedb533e5dacad6378b4bc819ebe3652188a665066d6": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", - "0x4b63b79f1e338a49559dcd3193ac9eecc50d0f275d24e97cc8c319e5a31a8bd0": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0xdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d706a": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", - "0x800d5dfe4bba53eedee06cd4546a27da8de00f12db83f56062976d4493fda899": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0xc3ad33e20b0c56a223ad5104fff154aa010f8715b9c981fd38fdc60a4d1a52fc": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5" - } - }, - { - "accountName": "keyless Deployer", - "balance": "0", - "nonce": "1", - "address": "0x694AB5383a002a4796f95530c14Cf0C25ec3EA03" - }, - { - "accountName": "deployer", - "balance": "100000000000000000000000", - "nonce": "8", - "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" - } - ], - "firstBatchData": { - "transactions": "0xf8c380808401c9c380942a3dd3eb832af982ec71669e178424b10dca2ede80b8a4d3476afe000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a40d5f56745a118d0906a34e69aec8c0db1cb8fa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ca1ab1e0000000000000000000000000000000000000000000000000000000005ca1ab1e1bff", - "globalExitRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", - "timestamp": 1697640780, - "sequencer": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" - } -} \ No newline at end of file diff --git a/docker/scripts/v1ToV2/deploy-docker.sh b/docker/scripts/v1ToV2/deploy-docker.sh index 09e41b5d3..6e9fe02ee 100755 --- a/docker/scripts/v1ToV2/deploy-docker.sh +++ b/docker/scripts/v1ToV2/deploy-docker.sh @@ -3,11 +3,11 @@ sudo rm -rf docker/gethData/geth_data DEV_PERIOD=1 docker-compose -f docker/docker-compose.geth.yml up -d geth sleep 5 node docker/scripts/fund-accounts.js -cp docker/scripts/v1ToV2/deploy_parameters_docker.json deployment/v1ToV2/deploy_parameters.json -npm run deploy:testnet:v1ToV2:localhost +cp docker/scripts/testV1ToV2/deploy_parameters_docker.json deployment/testV1ToV2/deploy_parameters.json +npm run deploy:testnet:testV1ToV2:localhost mkdir docker/deploymentOutput -mv deployment/v1ToV2/deploy_output.json docker/deploymentOutput -mv deployment/v1ToV2/genesis.json docker/deploymentOutput +mv deployment/testV1ToV2/deploy_output.json docker/deploymentOutput +mv deployment/testV1ToV2/genesis.json docker/deploymentOutput DEV_PERIOD=1 docker-compose -f docker/docker-compose.geth.yml down sudo docker build -t hermeznetwork/geth-zkevm-contracts -f docker/Dockerfile.geth . # Let it readable for the multiplatform build coming later! diff --git a/docker/scripts/v1ToV2/deploy-dockerv2.sh b/docker/scripts/v1ToV2/deploy-dockerv2.sh index 839ede133..47a15b7a7 100755 --- a/docker/scripts/v1ToV2/deploy-dockerv2.sh +++ b/docker/scripts/v1ToV2/deploy-dockerv2.sh @@ -3,11 +3,11 @@ sudo rm -rf docker/gethData/geth_data DEV_PERIOD=1 docker compose -f docker/docker-compose.geth.yml up -d geth sleep 5 node docker/scripts/fund-accounts.js -cp docker/scripts/v1ToV2/deploy_parameters_docker.json deployment/v1ToV2/deploy_parameters.json -npm run deploy:testnet:v1ToV2:localhost +cp docker/scripts/testV1ToV2/deploy_parameters_docker.json deployment/testV1ToV2/deploy_parameters.json +npm run deploy:testnet:testV1ToV2:localhost mkdir docker/deploymentOutput -mv deployment/v1ToV2/deploy_output.json docker/deploymentOutput -mv deployment/v1ToV2/genesis.json docker/deploymentOutput +mv deployment/testV1ToV2/deploy_output.json docker/deploymentOutput +mv deployment/testV1ToV2/genesis.json docker/deploymentOutput DEV_PERIOD=1 docker compose -f docker/docker-compose.geth.yml down sudo docker build -t hermeznetwork/geth-zkevm-contracts -f docker/Dockerfile.geth . # Let it readable for the multiplatform build coming later! diff --git a/package.json b/package.json index 01cdca746..0432c33b2 100644 --- a/package.json +++ b/package.json @@ -90,11 +90,11 @@ "deploy:v2:sepolia": "npx hardhat compile && npx ts-node deployment/v2/1_createGenesis.ts && npx hardhat run deployment/v2/2_deployPolygonZKEVMDeployer.ts --network sepolia && npx hardhat run deployment/v2/3_deployContracts.ts --network sepolia && npx hardhat run deployment/v2/4_createRollup.ts --network sepolia && npm run saveDeployment:sepolia", "deploy:testnet:v2:sepolia": "npx hardhat compile && rm -f deployment/v2/deploy_ongoing.json && npm run prepare:testnet:ZkEVM:sepolia && npm run deploy:v2:sepolia", "verify:v2:sepolia": "npx hardhat run deployment/v2/verifyContracts.js --network sepolia", - "prepare:v1ToV2:ZkEVM:localhost": "npx hardhat run deployment/v1ToV2/prepareTestnet.ts --network localhost", - "deploy:v1ToV2:localhost": "npx hardhat compile && rm -f .openzeppelin/unknown-*.json && npx ts-node deployment/v1ToV2/1_createGenesis.ts --test && npx hardhat run deployment/v1ToV2/2_deployPolygonZKEVMDeployer.ts --network localhost && npx hardhat run deployment/v1ToV2/3_deployContracts.ts --network localhost", - "deploy:testnet:v1ToV2:localhost": "npx hardhat compile && rm -f deployment/v1ToV2/deploy_ongoing.json && npm run prepare:v1ToV2:ZkEVM:localhost && npm run deploy:v1ToV2:localhost", - "docker:v1ToV2:contracts": "./docker/scripts/v1ToV2/deploy-docker.sh", - "dockerv2:v1ToV2:contracts": "sudo ./docker/scripts/v1ToV2/deploy-dockerv2.sh", + "prepare:testV1ToV2:ZkEVM:localhost": "npx hardhat run deployment/testV1ToV2/prepareTestnet.ts --network localhost", + "deploy:testV1ToV2:localhost": "npx hardhat compile && rm -f .openzeppelin/unknown-*.json && npx ts-node deployment/testV1ToV2/1_createGenesis.ts --test && npx hardhat run deployment/testV1ToV2/2_deployPolygonZKEVMDeployer.ts --network localhost && npx hardhat run deployment/testV1ToV2/3_deployContracts.ts --network localhost", + "deploy:testnet:testV1ToV2:localhost": "npx hardhat compile && rm -f deployment/testV1ToV2/deploy_ongoing.json && npm run prepare:testV1ToV2:ZkEVM:localhost && npm run deploy:testV1ToV2:localhost", + "docker:testV1ToV2:contracts": "./docker/scripts/testV1ToV2/deploy-docker.sh", + "dockerv2:testV1ToV2:contracts": "sudo ./docker/scripts/testV1ToV2/deploy-dockerv2.sh", "saveDeployment:sepolia": "mkdir -p deployments/sepolia_$(date +%s) && cp -r deployment/v2/deploy_*.json deployments/sepolia_$(date +%s) && cp .openzeppelin/sepolia.json deployments/sepolia_$(date +%s) && cp deployment/v2/genesis.json deployments/sepolia_$(date +%s) && cp deployment/v2/create_rollup_output.json deployments/sepolia_$(date +%s)", "testnetPol:upgradeV2:sepolia": "npx hardhat run upgrade/upgradeToV2/testnet/deployTestnetPol.ts --network sepolia", "testnetPol:upgradeV2:goerli": "npx hardhat run upgrade/upgradeToV2/testnet/deployTestnetPol.ts --network goerli", From 540ad31a2c8c5893e8369051fd372f9d39aaae71 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 30 Jan 2024 01:13:58 +0100 Subject: [PATCH 190/230] rename polygon internal testnet --- .../PolygonRollupManagerNotUpgraded.sol | 72 +++++++++++++++++++ deployment/v2/3_deployContracts.ts | 5 +- docker/scripts/v1ToV2/hardhat.example.paris | 2 +- docker/scripts/v2/hardhat.example.paris | 2 +- hardhat.config.ts | 2 +- 5 files changed, 76 insertions(+), 7 deletions(-) create mode 100644 contracts/v2/newDeployments/PolygonRollupManagerNotUpgraded.sol diff --git a/contracts/v2/newDeployments/PolygonRollupManagerNotUpgraded.sol b/contracts/v2/newDeployments/PolygonRollupManagerNotUpgraded.sol new file mode 100644 index 000000000..bb5f932ea --- /dev/null +++ b/contracts/v2/newDeployments/PolygonRollupManagerNotUpgraded.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.20; +import "../PolygonRollupManager.sol"; + +/** + * PolygonRollupManager Test + */ +contract PolygonRollupManagerNotUpgraded is PolygonRollupManager { + /** + * @param _globalExitRootManager Global exit root manager address + * @param _pol MATIC token address + * @param _bridgeAddress Bridge address + */ + constructor( + IPolygonZkEVMGlobalExitRootV2 _globalExitRootManager, + IERC20Upgradeable _pol, + IPolygonZkEVMBridge _bridgeAddress + ) PolygonRollupManager(_globalExitRootManager, _pol, _bridgeAddress) {} + + function initialize( + address trustedAggregator, + uint64 _pendingStateTimeout, + uint64 _trustedAggregatorTimeout, + address admin, + address timelock, + address emergencyCouncil, + PolygonZkEVMExistentEtrog /*polygonZkEVM*/, + IVerifierRollup /*zkEVMVerifier*/, + uint64 /*zkEVMForkID*/, + uint64 /*zkEVMChainID*/ + ) external override reinitializer(2) { + pendingStateTimeout = _pendingStateTimeout; + trustedAggregatorTimeout = _trustedAggregatorTimeout; + + // Constant deployment variables + _batchFee = 0.1 ether; // 0.1 Matic + verifyBatchTimeTarget = 30 minutes; + multiplierBatchFee = 1002; + + // Initialize OZ contracts + __AccessControl_init(); + + // setup roles + + // trusted aggregator role + _setupRole(_TRUSTED_AGGREGATOR_ROLE, trustedAggregator); + + // Timelock roles + _setupRole(DEFAULT_ADMIN_ROLE, timelock); + _setupRole(_ADD_ROLLUP_TYPE_ROLE, timelock); + _setupRole(_ADD_EXISTING_ROLLUP_ROLE, timelock); + + // Even this role can only update to an already added verifier/consensus + // Could break the compatibility of them, changing the virtual state + _setupRole(_UPDATE_ROLLUP_ROLE, timelock); + + // Admin roles + _setupRole(_OBSOLETE_ROLLUP_TYPE_ROLE, admin); + _setupRole(_CREATE_ROLLUP_ROLE, admin); + _setupRole(_STOP_EMERGENCY_ROLE, admin); + _setupRole(_TWEAK_PARAMETERS_ROLE, admin); + _setRoleAdmin(_TRUSTED_AGGREGATOR_ROLE, _TRUSTED_AGGREGATOR_ROLE_ADMIN); + _setupRole(_TRUSTED_AGGREGATOR_ROLE_ADMIN, admin); + + _setupRole(_SET_FEE_ROLE, admin); + + // Emergency council roles + _setRoleAdmin(_EMERGENCY_COUNCIL_ROLE, _EMERGENCY_COUNCIL_ADMIN); + _setupRole(_EMERGENCY_COUNCIL_ROLE, emergencyCouncil); + _setupRole(_EMERGENCY_COUNCIL_ADMIN, emergencyCouncil); + } +} diff --git a/deployment/v2/3_deployContracts.ts b/deployment/v2/3_deployContracts.ts index ca48ff162..d86320923 100644 --- a/deployment/v2/3_deployContracts.ts +++ b/deployment/v2/3_deployContracts.ts @@ -406,10 +406,7 @@ async function main() { console.log("timelockContract:", timelockContract.target); console.log("emergencyCouncilAddress:", emergencyCouncilAddress); - const PolygonRollupManagerFactory = await ethers.getContractFactory( - "PolygonRollupManagerMockInternalTest", - deployer - ); + const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManagerNotUpgraded", deployer); let polygonRollupManagerContract: any; let deploymentBlockNumber; diff --git a/docker/scripts/v1ToV2/hardhat.example.paris b/docker/scripts/v1ToV2/hardhat.example.paris index 41037f816..4bb241106 100644 --- a/docker/scripts/v1ToV2/hardhat.example.paris +++ b/docker/scripts/v1ToV2/hardhat.example.paris @@ -126,7 +126,7 @@ const config: HardhatUserConfig = { evmVersion: "paris", }, // try yul optimizer }, - "contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol": { + "contracts/v2/newDeployments/PolygonRollupManagerNotUpgraded.sol": { version: "0.8.20", settings: { optimizer: { diff --git a/docker/scripts/v2/hardhat.example.paris b/docker/scripts/v2/hardhat.example.paris index 41037f816..4bb241106 100644 --- a/docker/scripts/v2/hardhat.example.paris +++ b/docker/scripts/v2/hardhat.example.paris @@ -126,7 +126,7 @@ const config: HardhatUserConfig = { evmVersion: "paris", }, // try yul optimizer }, - "contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol": { + "contracts/v2/newDeployments/PolygonRollupManagerNotUpgraded.sol": { version: "0.8.20", settings: { optimizer: { diff --git a/hardhat.config.ts b/hardhat.config.ts index f21732c18..3a207099d 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -95,7 +95,7 @@ const config: HardhatUserConfig = { evmVersion: "shanghai", }, }, - "contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol": { + "contracts/v2/newDeployments/PolygonRollupManagerNotUpgraded.sol": { version: "0.8.20", settings: { optimizer: { From dcad2b677be272a55a5a73077cb2944b55635064 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 30 Jan 2024 01:17:46 +0100 Subject: [PATCH 191/230] test flag --- deployment/v2/1_createGenesis.ts | 2 +- deployment/v2/3_deployContracts.ts | 20 ++++++++++++++------ deployment/v2/deploy_parameters.json.example | 1 + 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/deployment/v2/1_createGenesis.ts b/deployment/v2/1_createGenesis.ts index 8668b626c..702003af8 100644 --- a/deployment/v2/1_createGenesis.ts +++ b/deployment/v2/1_createGenesis.ts @@ -422,7 +422,7 @@ async function main() { address: finalDeployer, }); - if (argv.test) { + if (deployParameters.test) { // Add tester account with ether genesis[genesis.length - 1].balance = "100000000000000000000000"; } diff --git a/deployment/v2/3_deployContracts.ts b/deployment/v2/3_deployContracts.ts index d86320923..e5aaabd1d 100644 --- a/deployment/v2/3_deployContracts.ts +++ b/deployment/v2/3_deployContracts.ts @@ -390,6 +390,8 @@ async function main() { expect(precalculateRollupManager).to.be.equal(await polygonZkEVMGlobalExitRoot.rollupManager()); } + const timelockAddressRollupManager = deployParameters.test ? deployer.address : timelockContract.target; + // deploy Rollup Manager console.log("\n#######################"); console.log("##### Deployment Rollup Manager #####"); @@ -403,7 +405,7 @@ async function main() { console.log("pendingStateTimeout:", pendingStateTimeout); console.log("trustedAggregatorTimeout:", trustedAggregatorTimeout); console.log("admin:", admin); - console.log("timelockContract:", timelockContract.target); + console.log("timelockContract:", timelockAddressRollupManager); console.log("emergencyCouncilAddress:", emergencyCouncilAddress); const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManagerNotUpgraded", deployer); @@ -420,7 +422,7 @@ async function main() { pendingStateTimeout, trustedAggregatorTimeout, admin, - timelockContract.target, + timelockAddressRollupManager, emergencyCouncilAddress, ethers.ZeroAddress, // unused parameter ethers.ZeroAddress, // unused parameter @@ -493,12 +495,18 @@ async function main() { console.log("trustedAggregatorTimeout:", await polygonRollupManagerContract.trustedAggregatorTimeout()); // Check roles - expect(await polygonRollupManagerContract.hasRole(DEFAULT_ADMIN_ROLE, timelockContract.target)).to.be.equal(true); - expect(await polygonRollupManagerContract.hasRole(ADD_ROLLUP_TYPE_ROLE, timelockContract.target)).to.be.equal(true); - expect(await polygonRollupManagerContract.hasRole(UPDATE_ROLLUP_ROLE, timelockContract.target)).to.be.equal(true); - expect(await polygonRollupManagerContract.hasRole(ADD_EXISTING_ROLLUP_ROLE, timelockContract.target)).to.be.equal( + expect(await polygonRollupManagerContract.hasRole(DEFAULT_ADMIN_ROLE, timelockAddressRollupManager)).to.be.equal( + true + ); + expect(await polygonRollupManagerContract.hasRole(ADD_ROLLUP_TYPE_ROLE, timelockAddressRollupManager)).to.be.equal( + true + ); + expect(await polygonRollupManagerContract.hasRole(UPDATE_ROLLUP_ROLE, timelockAddressRollupManager)).to.be.equal( true ); + expect( + await polygonRollupManagerContract.hasRole(ADD_EXISTING_ROLLUP_ROLE, timelockAddressRollupManager) + ).to.be.equal(true); expect(await polygonRollupManagerContract.hasRole(TRUSTED_AGGREGATOR_ROLE, trustedAggregator)).to.be.equal(true); expect(await polygonRollupManagerContract.hasRole(OBSOLETE_ROLLUP_TYPE_ROLE, admin)).to.be.equal(true); diff --git a/deployment/v2/deploy_parameters.json.example b/deployment/v2/deploy_parameters.json.example index f0540f510..db9962e4f 100644 --- a/deployment/v2/deploy_parameters.json.example +++ b/deployment/v2/deploy_parameters.json.example @@ -1,4 +1,5 @@ { + "test": false, "timelockAdminAddress": "0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", "minDelayTimelock": 3600, "salt": "0x0000000000000000000000000000000000000000000000000000000000000000", From 6d1728600cc321f2f2938545da7398e65da55f0e Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 30 Jan 2024 01:22:23 +0100 Subject: [PATCH 192/230] fix typos tesntet contracts --- .../PolygonZkEVMTestnetClearStorage.sol | 6 +- contracts/testnet/PolygonZkEVMTestnetV2.sol | 2 +- docs/testnet/PolygonZkEVMTestnet.md | 82 ------------------- 3 files changed, 4 insertions(+), 86 deletions(-) delete mode 100644 docs/testnet/PolygonZkEVMTestnet.md diff --git a/contracts/testnet/PolygonZkEVMTestnetClearStorage.sol b/contracts/testnet/PolygonZkEVMTestnetClearStorage.sol index dbcf64f85..9d999e436 100644 --- a/contracts/testnet/PolygonZkEVMTestnetClearStorage.sol +++ b/contracts/testnet/PolygonZkEVMTestnetClearStorage.sol @@ -5,7 +5,7 @@ import "../PolygonZkEVM.sol"; /** * Contract responsible for managing the state and the updates of the L2 network - * This contract will NOT BE USED IN PRODUCTION, will be used only in testnet enviroment + * This contract will NOT BE USED IN PRODUCTION, will be used only in testnet environment */ contract PolygonZkEVMTestnetClearStorage is PolygonZkEVM { // Indicates the current version @@ -49,8 +49,8 @@ contract PolygonZkEVMTestnetClearStorage is PolygonZkEVM { isForcedBatchDisallowed = true; assembly { sstore(version.slot, 0) - sstore(add(version.slot,1), 0) - sstore(add(version.slot,2), 0) + sstore(add(version.slot, 1), 0) + sstore(add(version.slot, 2), 0) } } } diff --git a/contracts/testnet/PolygonZkEVMTestnetV2.sol b/contracts/testnet/PolygonZkEVMTestnetV2.sol index 71c2dd2ee..36d47538d 100644 --- a/contracts/testnet/PolygonZkEVMTestnetV2.sol +++ b/contracts/testnet/PolygonZkEVMTestnetV2.sol @@ -5,7 +5,7 @@ import "../PolygonZkEVM.sol"; /** * Contract responsible for managing the state and the updates of the L2 network - * This contract will NOT BE USED IN PRODUCTION, will be used only in testnet enviroment + * This contract will NOT BE USED IN PRODUCTION, will be used only in testnet environment */ contract PolygonZkEVMTestnetV2 is PolygonZkEVM { // Indicates the current version diff --git a/docs/testnet/PolygonZkEVMTestnet.md b/docs/testnet/PolygonZkEVMTestnet.md deleted file mode 100644 index 18b2857e1..000000000 --- a/docs/testnet/PolygonZkEVMTestnet.md +++ /dev/null @@ -1,82 +0,0 @@ -Contract responsible for managing the state and the updates of the L2 network -This contract will NOT BE USED IN PRODUCTION, will be used only in testnet environment - - -## Functions -### constructor -```solidity - function constructor( - contract IPolygonZkEVMGlobalExitRoot _globalExitRootManager, - contract IERC20Upgradeable _matic, - contract IVerifierRollup _rollupVerifier, - contract IPolygonZkEVMBridge _bridgeAddress, - uint64 _chainID - ) public -``` - - -#### Parameters: -| Name | Type | Description | -| :--- | :--- | :------------------------------------------------------------------- | -|`_globalExitRootManager` | contract IPolygonZkEVMGlobalExitRoot | Global exit root manager address -|`_matic` | contract IERC20Upgradeable | MATIC token address -|`_rollupVerifier` | contract IVerifierRollup | Rollup verifier address -|`_bridgeAddress` | contract IPolygonZkEVMBridge | Bridge address -|`_chainID` | uint64 | L2 chainID - -### forceBatch -```solidity - function forceBatch( - ) public -``` - - - - -### sequenceForceBatches -```solidity - function sequenceForceBatches( - ) external -``` - - - - -### getForceBatchTimeout -```solidity - function getForceBatchTimeout( - ) public returns (uint64) -``` - - - - -### setForceBatchTimeout -```solidity - function setForceBatchTimeout( - uint64 newforceBatchTimeout - ) public -``` -Set new forcedBatchTimeout - - -#### Parameters: -| Name | Type | Description | -| :--- | :--- | :------------------------------------------------------------------- | -|`newforceBatchTimeout` | uint64 | new forced batches timeout - -### setForcedBatchesAllowed -```solidity - function setForcedBatchesAllowed( - uint256 newForcedBatchesAllowed - ) public -``` -Set new forced batches allowed -Defined as a uint256 because it will be easy to upgrade afterwards - - -#### Parameters: -| Name | Type | Description | -| :--- | :--- | :------------------------------------------------------------------- | -|`newForcedBatchesAllowed` | uint256 | new forced batches allowed - From 64668066a8ddab657ef195893e4dcaa4757d3b92 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 30 Jan 2024 10:40:56 +0100 Subject: [PATCH 193/230] small scirpts fixes --- deployment/v2/4_createRollup.ts | 8 ++++++++ deployment/v2/deploy_parameters.json.example | 2 +- docker/scripts/v2/deploy_parameters_docker.json | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/deployment/v2/4_createRollup.ts b/deployment/v2/4_createRollup.ts index 0e16b57ee..393c52934 100644 --- a/deployment/v2/4_createRollup.ts +++ b/deployment/v2/4_createRollup.ts @@ -137,6 +137,13 @@ async function main() { deployOutput.polygonRollupManager ) as PolygonRollupManager; + const DEFAULT_ADMIN_ROLE = ethers.ZeroHash; + if ((await rollupManagerContract.hasRole(DEFAULT_ADMIN_ROLE, deployer.address)) == false) { + throw new Error( + `Deployer does not have admin role. Use the test flag on deploy_parameters if this is a test deployment` + ); + } + let verifierContract; if (realVerifier === true) { const VerifierRollup = await ethers.getContractFactory("FflonkVerifier", deployer); @@ -155,6 +162,7 @@ async function main() { const CREATE_ROLLUP_ROLE = ethers.id("CREATE_ROLLUP_ROLE"); // Check role: + if ((await rollupManagerContract.hasRole(ADD_ROLLUP_TYPE_ROLE, deployer.address)) == false) await rollupManagerContract.grantRole(ADD_ROLLUP_TYPE_ROLE, deployer.address); diff --git a/deployment/v2/deploy_parameters.json.example b/deployment/v2/deploy_parameters.json.example index db9962e4f..d57ad7c80 100644 --- a/deployment/v2/deploy_parameters.json.example +++ b/deployment/v2/deploy_parameters.json.example @@ -1,5 +1,5 @@ { - "test": false, + "test": true, "timelockAdminAddress": "0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", "minDelayTimelock": 3600, "salt": "0x0000000000000000000000000000000000000000000000000000000000000000", diff --git a/docker/scripts/v2/deploy_parameters_docker.json b/docker/scripts/v2/deploy_parameters_docker.json index 982a581da..b58f28476 100644 --- a/docker/scripts/v2/deploy_parameters_docker.json +++ b/docker/scripts/v2/deploy_parameters_docker.json @@ -1,4 +1,5 @@ { + "test": true, "timelockAdminAddress": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "minDelayTimelock": 3600, "salt": "0x0000000000000000000000000000000000000000000000000000000000000000", From 018a87da2e0f3e9df79a4981a03611350c8ff8c6 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 22 Jan 2024 12:57:24 +0100 Subject: [PATCH 194/230] first approach claim comrpessor --- contracts/utils/ClaimCompressor.sol | 159 ++++++++++++++++++ hardhat.config.ts | 10 ++ test/contractsv2/ClaimCompressor.test.ts | 199 +++++++++++++++++++++++ 3 files changed, 368 insertions(+) create mode 100644 contracts/utils/ClaimCompressor.sol create mode 100644 test/contractsv2/ClaimCompressor.test.ts diff --git a/contracts/utils/ClaimCompressor.sol b/contracts/utils/ClaimCompressor.sol new file mode 100644 index 000000000..4f4d50b0b --- /dev/null +++ b/contracts/utils/ClaimCompressor.sol @@ -0,0 +1,159 @@ +// SPDX-License-Identifier: AGPL-3.0 + +//import "../PolygonZkEVMBridge.sol"; + +pragma solidity 0.8.23; + +/** + * Contract for compressing and decompressing claim data + */ +contract ClaimCompressor { + uint256 internal constant _DEPOSIT_CONTRACT_TREE_DEPTH = 32; + + // Leaf type asset + uint8 private constant _LEAF_TYPE_ASSET = 0; + + // Leaf type message + uint8 private constant _LEAF_TYPE_MESSAGE = 1; + + // Mainnet identifier + uint32 private constant _MAINNET_NETWORK_ID = 0; + + // // Bytes that will be added to the snark input for every rollup aggregated + // // 32*32 bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof + // // 32*8 REst constant parameters + // // 32 bytes position, 32 bytes length, + length bytes = metadata + // uint256 internal constant BYTES_PER_CLAIM = + // 32*32 + 8*32 + + + // bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, + // uint32 index, + // bytes32 mainnetExitRoot, + // bytes32 rollupExitRoot, + // uint32 originNetwork, + // address originAddress, + // uint32 destinationNetwork, + // address destinationAddress, + // uint256 amount, + // bytes calldata metadata + + // PolygonZkEVMBridge address + address public immutable bridgeAddress; + + // Mainnet identifier + uint32 private immutable networkID; + + /** + * @param _bridgeAddress PolygonZkEVMBridge contract address + */ + constructor(address _bridgeAddress, uint32 _networkID) { + bridgeAddress = _bridgeAddress; + networkID = _networkID; + } + + /** + * @notice Foward all the claim parameters to compress them inside the contrat + * @param smtProof Smt proof + * @param index Index of the leaf + * @param mainnetExitRoot Mainnet exit root + * @param rollupExitRoot Rollup exit root + * param originNetwork Origin network + * @param originAddress Origin address + * param destinationNetwork Network destination + * @param destinationAddress Address destination + * @param amount message value + * @param metadata Abi encoded metadata if any, empty otherwise + * @param isMessage Bool indicating if it's a message + */ + function compressClaimCall( + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH][] calldata smtProof, + uint32[] calldata index, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + //uint32 calldata originNetwork, + address[] calldata originAddress, + //uint32[] calldata destinationNetwork, + address[] calldata destinationAddress, + uint256[] calldata amount, + bytes[] calldata metadata, + bool[] calldata isMessage + ) public view returns (bytes memory) { + // common parameters for all the claims + bytes memory totalCompressedClaim = abi.encodePacked( + smtProof[0], + mainnetExitRoot, + rollupExitRoot + ); + + // If the memory cost goes crazy, might need to do it in assembly D: + for (uint256 i = 0; i < isMessage.length; i++) { + // Byte array that will be returned + + // compare smt proof against the first one + uint256 lastDifferentLevel = 0; + for (uint256 j = 0; j < _DEPOSIT_CONTRACT_TREE_DEPTH; j++) { + if (smtProof[i][j] != smtProof[0][j]) { + lastDifferentLevel = j; + } + } + + bytes memory smtProofCompressed; + + for (uint256 j = 0; j < lastDifferentLevel; j++) { + smtProofCompressed = abi.encodePacked( + smtProofCompressed, + smtProof[0][i] + ); + } + + bytes memory compressedClaimCall = abi.encodePacked( + isMessage[i], + uint8(lastDifferentLevel), + smtProofCompressed, + index[i], + // mainnetExitRoot, + // rollupExitRoot, + // originNetwork, // for first version this is ok + originAddress[i], + // destinationNetwork + destinationAddress[i], + amount[i], // could compress to 128 bits + uint32(metadata[i].length), + metadata[i] + ); + + // Accumulate all claim calls + totalCompressedClaim = abi.encodePacked( + totalCompressedClaim, + compressedClaimCall + ); + } + return totalCompressedClaim; + } + + function decompressClaimCall(bytes calldata compressedClaimCalls) public { + // // This pointer will be the current position to write on accumulateSnarkBytes + // uint256 ptrCompressedClaimCall; + // // Total length of the accumulateSnarkBytes, ByesPerRollup * rollupToVerify + 20 bytes (msg.sender) + // uint256 totalSnarkLength = _SNARK_BYTES_PER_ROLLUP_AGGREGATED * + // verifyBatchesData.length + + // 20; + // // Use assembly to rever memory and get the memory pointer + // assembly { + // // Set accumulateSnarkBytes to the next free memory space + // accumulateSnarkBytes := mload(0x40) + // // Reserve the memory: 32 bytes for the byte array length + 32 bytes extra for byte manipulation (0x40) + + // // the length of the input snark bytes + // mstore(0x40, add(add(accumulateSnarkBytes, 0x40), totalSnarkLength)) + // // Set the length of the input bytes + // mstore(accumulateSnarkBytes, totalSnarkLength) + // // Set the pointer on the start of the actual byte array + // ptrAccumulateInputSnarkBytes := add(accumulateSnarkBytes, 0x20) + // } + // assembly { + // // store oldStateRoot + // mstore(ptr, oldStateRoot) + // ptr := add(ptr, 32) + // } + } +} diff --git a/hardhat.config.ts b/hardhat.config.ts index 3a207099d..9134169f1 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -27,6 +27,16 @@ const config: HardhatUserConfig = { }, solidity: { compilers: [ + { + version: "0.8.23", + settings: { + optimizer: { + enabled: true, + runs: 999999, + }, + viaIR: true, + }, + }, { version: "0.8.17", settings: { diff --git a/test/contractsv2/ClaimCompressor.test.ts b/test/contractsv2/ClaimCompressor.test.ts new file mode 100644 index 000000000..c2defe9fa --- /dev/null +++ b/test/contractsv2/ClaimCompressor.test.ts @@ -0,0 +1,199 @@ +import {expect} from "chai"; +import {ethers, upgrades} from "hardhat"; +import { + VerifierRollupHelperMock, + ERC20PermitMock, + PolygonRollupManagerMock, + PolygonZkEVMGlobalExitRoot, + PolygonZkEVMBridgeV2, + PolygonZkEVMV2, + PolygonRollupBase, + TokenWrapped, + ClaimCompressor, +} from "../../typechain-types"; +import {takeSnapshot, time} from "@nomicfoundation/hardhat-network-helpers"; +import {processorUtils, contractUtils, MTBridge, mtBridgeUtils} from "@0xpolygonhermez/zkevm-commonjs"; +const {calculateSnarkInput, calculateAccInputHash, calculateBatchHashData} = contractUtils; +const MerkleTreeBridge = MTBridge; +const {verifyMerkleProof, getLeafValue} = mtBridgeUtils; +import {MemDB, ZkEVMDB, getPoseidon, smtUtils, processorUtils} from "@0xpolygonhermez/zkevm-commonjs"; + +describe("PolygonZkEVMBridge Contract", () => { + upgrades.silenceWarnings(); + + let claimCompressor: ClaimCompressor; + + const networkID = 1; + + const tokenName = "Matic Token"; + const tokenSymbol = "MATIC"; + const decimals = 18; + const tokenInitialBalance = ethers.parseEther("20000000"); + const metadataToken = ethers.AbiCoder.defaultAbiCoder().encode( + ["string", "string", "uint8"], + [tokenName, tokenSymbol, decimals] + ); + const networkIDMainnet = 0; + const networkIDRollup = 1; + + const LEAF_TYPE_ASSET = 0; + const LEAF_TYPE_MESSAGE = 1; + + let deployer: any; + let rollupManager: any; + let acc1: any; + let bridge: any; + + beforeEach("Deploy contracts", async () => { + // load signers + [deployer, rollupManager, acc1, bridge] = await ethers.getSigners(); + + // deploy global exit root manager + const ClaimCompressorFactory = await ethers.getContractFactory("ClaimCompressor"); + claimCompressor = await ClaimCompressorFactory.deploy(bridge.address, networkID); + await claimCompressor.waitForDeployment(); + }); + + it("should check Compression", async () => { + const BridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridge"); + + const originNetwork = networkIDMainnet; + const tokenAddress = ethers.hexlify(ethers.randomBytes(20)); + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDMainnet; + const destinationAddress = acc1.address; + const metadata = metadataToken; + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + // compute root merkle tree in Js + const height = 32; + const merkleTreeLocal = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + for (let i = 0; i < 8; i++) { + merkleTreeLocal.add(leafValue); + } + + const mainnetExitRoot = merkleTreeLocal.getRoot(); + + const index = 0; + const proofLocal = merkleTreeLocal.getProofTreeByIndex(index); + + const encodedCall = BridgeFactory.interface.encodeFunctionData("claimAsset", [ + proofLocal, + index, + mainnetExitRoot, + ethers.ZeroHash, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata, + ]); + + const newWallet = ethers.HDNodeWallet.fromMnemonic( + ethers.Mnemonic.fromPhrase("test test test test test test test test test test test junk"), + `m/44'/60'/0'/0/0` + ); + + const tx = { + data: encodedCall, + to: bridge.address, + nonce: 1, + gasLimit: 200000, + gasPrice: ethers.parseUnits("10", "gwei"), + chainId: 5, + }; + + const txSigned = await newWallet.signTransaction(tx); + + // Get claim tx bytes calldata + const customSignedTx = processorUtils.rawTxToCustomRawTx(txSigned); + + // Compute calldatas + for (let i = 1; i < 20; i++) { + const proofs = [] as any; + const indexes = [] as any; + const tokenAddresses = []; + const destinationAddresses = []; + const amounts = []; + const metadatas = []; + const isClaimeds = []; + + for (let j = 0; j < i; j++) { + const index = i; + const proofLocal = merkleTreeLocal.getProofTreeByIndex(i); + + proofs.push(proofLocal); + indexes.push(index); + tokenAddresses.push(tokenAddress); + destinationAddresses.push(destinationAddress); + amounts.push(amount); + metadatas.push(metadata); + isClaimeds.push(false); + } + + const compressedMultipleBytes = await claimCompressor.compressClaimCall( + proofs, + indexes, + mainnetExitRoot, + ethers.ZeroHash, + tokenAddresses, + destinationAddresses, + amounts, + metadatas, + isClaimeds + ); + + const txCompressedMultiple = { + data: compressedMultipleBytes, + to: bridge.address, + nonce: 1, + gasLimit: 200000, + gasPrice: ethers.parseUnits("10", "gwei"), + chainId: 5, + }; + + const txCompressedMultipleSigned = await newWallet.signTransaction(txCompressedMultiple); + const customtxCompressedMultipleSigned = processorUtils.rawTxToCustomRawTx(txCompressedMultipleSigned); + + const customSignedCost = calculateCallDataCost(customSignedTx); + const customCompressedMultipleCost = calculateCallDataCost(customtxCompressedMultipleSigned); + + console.log({ + numClaims: i, + dataClaimCall: encodedCall.length * i, + dataCompressedCall: compressedMultipleBytes.length, + ratioData: compressedMultipleBytes.length / (encodedCall.length * i), + dataTotalTxClaimCall: customSignedTx.length * i, + costCalldataTxClaimCall: customSignedCost * i, + dataTotalTxCompressedCall: customtxCompressedMultipleSigned.length, + calldataCostTxCompressed: customCompressedMultipleCost, + ratioTxData: customtxCompressedMultipleSigned.length / (customSignedTx.length * i), + ratioTxDataCost: customCompressedMultipleCost / (customSignedCost * i), + }); + } + }); +}); + +function calculateCallDataCost(calldataBytes: string): number { + const bytesArray = ethers.getBytes(calldataBytes); + let totalCost = 0; + for (const bytes of bytesArray) { + if (bytes == 0) { + totalCost += 4; + } else { + totalCost += 16; + } + } + + return totalCost; +} From 822f133fc5a0afbab3019717d12c38534bbca77e Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 31 Jan 2024 10:48:06 +0100 Subject: [PATCH 195/230] claimCompressor ongoing --- contracts/utils/ClaimCompressor.sol | 159 ------------- contracts/v2/utils/ClaimCompressor.sol | 304 +++++++++++++++++++++++++ hardhat.config.ts | 21 +- 3 files changed, 315 insertions(+), 169 deletions(-) delete mode 100644 contracts/utils/ClaimCompressor.sol create mode 100644 contracts/v2/utils/ClaimCompressor.sol diff --git a/contracts/utils/ClaimCompressor.sol b/contracts/utils/ClaimCompressor.sol deleted file mode 100644 index 4f4d50b0b..000000000 --- a/contracts/utils/ClaimCompressor.sol +++ /dev/null @@ -1,159 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 - -//import "../PolygonZkEVMBridge.sol"; - -pragma solidity 0.8.23; - -/** - * Contract for compressing and decompressing claim data - */ -contract ClaimCompressor { - uint256 internal constant _DEPOSIT_CONTRACT_TREE_DEPTH = 32; - - // Leaf type asset - uint8 private constant _LEAF_TYPE_ASSET = 0; - - // Leaf type message - uint8 private constant _LEAF_TYPE_MESSAGE = 1; - - // Mainnet identifier - uint32 private constant _MAINNET_NETWORK_ID = 0; - - // // Bytes that will be added to the snark input for every rollup aggregated - // // 32*32 bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof - // // 32*8 REst constant parameters - // // 32 bytes position, 32 bytes length, + length bytes = metadata - // uint256 internal constant BYTES_PER_CLAIM = - // 32*32 + 8*32 + - - // bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProof, - // uint32 index, - // bytes32 mainnetExitRoot, - // bytes32 rollupExitRoot, - // uint32 originNetwork, - // address originAddress, - // uint32 destinationNetwork, - // address destinationAddress, - // uint256 amount, - // bytes calldata metadata - - // PolygonZkEVMBridge address - address public immutable bridgeAddress; - - // Mainnet identifier - uint32 private immutable networkID; - - /** - * @param _bridgeAddress PolygonZkEVMBridge contract address - */ - constructor(address _bridgeAddress, uint32 _networkID) { - bridgeAddress = _bridgeAddress; - networkID = _networkID; - } - - /** - * @notice Foward all the claim parameters to compress them inside the contrat - * @param smtProof Smt proof - * @param index Index of the leaf - * @param mainnetExitRoot Mainnet exit root - * @param rollupExitRoot Rollup exit root - * param originNetwork Origin network - * @param originAddress Origin address - * param destinationNetwork Network destination - * @param destinationAddress Address destination - * @param amount message value - * @param metadata Abi encoded metadata if any, empty otherwise - * @param isMessage Bool indicating if it's a message - */ - function compressClaimCall( - bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH][] calldata smtProof, - uint32[] calldata index, - bytes32 mainnetExitRoot, - bytes32 rollupExitRoot, - //uint32 calldata originNetwork, - address[] calldata originAddress, - //uint32[] calldata destinationNetwork, - address[] calldata destinationAddress, - uint256[] calldata amount, - bytes[] calldata metadata, - bool[] calldata isMessage - ) public view returns (bytes memory) { - // common parameters for all the claims - bytes memory totalCompressedClaim = abi.encodePacked( - smtProof[0], - mainnetExitRoot, - rollupExitRoot - ); - - // If the memory cost goes crazy, might need to do it in assembly D: - for (uint256 i = 0; i < isMessage.length; i++) { - // Byte array that will be returned - - // compare smt proof against the first one - uint256 lastDifferentLevel = 0; - for (uint256 j = 0; j < _DEPOSIT_CONTRACT_TREE_DEPTH; j++) { - if (smtProof[i][j] != smtProof[0][j]) { - lastDifferentLevel = j; - } - } - - bytes memory smtProofCompressed; - - for (uint256 j = 0; j < lastDifferentLevel; j++) { - smtProofCompressed = abi.encodePacked( - smtProofCompressed, - smtProof[0][i] - ); - } - - bytes memory compressedClaimCall = abi.encodePacked( - isMessage[i], - uint8(lastDifferentLevel), - smtProofCompressed, - index[i], - // mainnetExitRoot, - // rollupExitRoot, - // originNetwork, // for first version this is ok - originAddress[i], - // destinationNetwork - destinationAddress[i], - amount[i], // could compress to 128 bits - uint32(metadata[i].length), - metadata[i] - ); - - // Accumulate all claim calls - totalCompressedClaim = abi.encodePacked( - totalCompressedClaim, - compressedClaimCall - ); - } - return totalCompressedClaim; - } - - function decompressClaimCall(bytes calldata compressedClaimCalls) public { - // // This pointer will be the current position to write on accumulateSnarkBytes - // uint256 ptrCompressedClaimCall; - // // Total length of the accumulateSnarkBytes, ByesPerRollup * rollupToVerify + 20 bytes (msg.sender) - // uint256 totalSnarkLength = _SNARK_BYTES_PER_ROLLUP_AGGREGATED * - // verifyBatchesData.length + - // 20; - // // Use assembly to rever memory and get the memory pointer - // assembly { - // // Set accumulateSnarkBytes to the next free memory space - // accumulateSnarkBytes := mload(0x40) - // // Reserve the memory: 32 bytes for the byte array length + 32 bytes extra for byte manipulation (0x40) + - // // the length of the input snark bytes - // mstore(0x40, add(add(accumulateSnarkBytes, 0x40), totalSnarkLength)) - // // Set the length of the input bytes - // mstore(accumulateSnarkBytes, totalSnarkLength) - // // Set the pointer on the start of the actual byte array - // ptrAccumulateInputSnarkBytes := add(accumulateSnarkBytes, 0x20) - // } - // assembly { - // // store oldStateRoot - // mstore(ptr, oldStateRoot) - // ptr := add(ptr, 32) - // } - } -} diff --git a/contracts/v2/utils/ClaimCompressor.sol b/contracts/v2/utils/ClaimCompressor.sol new file mode 100644 index 000000000..9d3bcc07f --- /dev/null +++ b/contracts/v2/utils/ClaimCompressor.sol @@ -0,0 +1,304 @@ +// SPDX-License-Identifier: AGPL-3.0 + +import "../PolygonZkEVMBridgeV2.sol"; + +pragma solidity 0.8.20; + +/** + * Contract for compressing and decompressing claim data + */ +contract ClaimCompressor { + uint256 internal constant _DEPOSIT_CONTRACT_TREE_DEPTH = 32; + + // Leaf type asset + uint8 private constant _LEAF_TYPE_ASSET = 0; + + // Leaf type message + uint8 private constant _LEAF_TYPE_MESSAGE = 1; + + // Mainnet identifier + uint32 private constant _MAINNET_NETWORK_ID = 0; + + bytes4 private constant _CLAIM_ASSET_SIGNATURE = + PolygonZkEVMBridgeV2.claimAsset.selector; + + bytes4 private constant _CLAIM_MESSAGE_SIGNATURE = + PolygonZkEVMBridgeV2.claimMessage.selector; + + // Bytes that will be added to the snark input for every rollup aggregated + // 32*32 bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofLocalExitRoot + // 32*32 bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot + // 32*8 Rest constant parameters + // 32 bytes position, 32 bytes length, + length bytes = 32*32*2 + 32*8 + 32*2 + length metadata = totalLen + uint256 internal constant _CONSTANT_BYTES_PER_CLAIM = + 32 * 32 * 2 + 8 * 32 + 32 * 2; + + // Bytes len of arrays of 32 positions, of 32 bytes bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] + uint256 internal constant _BYTE_LEN_CONSTANT_ARRAYS = 32 * 32; + + // The following parameters are constant in the encoded compressed claim call + // smtProofLocalExitRoots[0], + // smtProofRollupExitRoots, + // mainnetExitRoot, + // rollupExitRoot + uint256 internal constant _CONSTANT_VARIABLES_LENGTH = 32 * 32 * 2 + 32 * 2; + + // function claimAsset( + // bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofLocalExitRoot, + // bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot, + // uint256 globalIndex, + // bytes32 mainnetExitRoot, + // bytes32 rollupExitRoot, + // uint32 originNetwork, + // address originTokenAddress, + // uint32 destinationNetwork, + // address destinationAddress, + // uint256 amount, + // bytes calldata metadata + // ) + + // function claimMessage( + // bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofLocalExitRoot, + // bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot, + // uint256 globalIndex, + // bytes32 mainnetExitRoot, + // bytes32 rollupExitRoot, + // uint32 originNetwork, + // address originAddress, + // uint32 destinationNetwork, + // address destinationAddress, + // uint256 amount, + // bytes calldata metadata + // ) + + // PolygonZkEVMBridge address + address private immutable _bridgeAddress; + + // Mainnet identifier + uint32 private immutable _networkID; + + /** + * @param __bridgeAddress PolygonZkEVMBridge contract address + * @param __networkID Network ID + */ + constructor(address __bridgeAddress, uint32 __networkID) { + _bridgeAddress = __bridgeAddress; + _networkID = __networkID; + } + + /** + * @notice Foward all the claim parameters to compress them inside the contrat + * @param smtProofLocalExitRoots Smt proof + * @param smtProofRollupExitRoots Smt proof + * @param globalIndex Index of the leaf + * @param mainnetExitRoot Mainnet exit root + * @param rollupExitRoot Rollup exit root + * @param originNetwork Origin network + * @param originAddress Origin address + * param destinationNetwork Network destination + * @param destinationAddress Address destination + * @param amount message value + * @param metadata Abi encoded metadata if any, empty otherwise + * @param isMessage Bool indicating if it's a message + */ + function compressClaimCall( + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoots, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH][] calldata smtProofLocalExitRoots, // struct + uint256[] calldata globalIndex, + uint32[] calldata originNetwork, + address[] calldata originAddress, + address[] calldata destinationAddress, + uint256[] calldata amount, + bytes[] calldata metadata, + bool[] calldata isMessage + ) external pure returns (bytes memory) { + // common parameters for all the claims + bytes memory totalCompressedClaim = abi.encodePacked( + smtProofLocalExitRoots[0], + smtProofRollupExitRoots, + mainnetExitRoot, + rollupExitRoot + ); + + // If the memory cost goes crazy, might need to do it in assembly D: + for (uint256 i = 0; i < isMessage.length; i++) { + // Byte array that will be returned + + // compare smt proof against the first one + uint256 lastDifferentLevel = 0; + for (uint256 j = 0; j < _DEPOSIT_CONTRACT_TREE_DEPTH; j++) { + if ( + smtProofLocalExitRoots[i][j] != smtProofLocalExitRoots[0][j] + ) { + lastDifferentLevel = j; + } + } + + bytes memory smtProofCompressed; + + for (uint256 j = 0; j < lastDifferentLevel; j++) { + smtProofCompressed = abi.encodePacked( + smtProofCompressed, + smtProofLocalExitRoots[0][i] + ); + } + + bytes memory compressedClaimCall = abi.encodePacked( + isMessage[i], + uint8(lastDifferentLevel), + smtProofCompressed, + bytes1(bytes32(globalIndex[i] << 191)), // get the 65th bit, so 256 - 65 = 191 + uint64(globalIndex[i]), + // mainnetExitRoot, + // rollupExitRoot, + originNetwork[i], // for first version this is ok + originAddress[i], + // destinationNetwork + destinationAddress[i], + amount[i], // could compress to 128 bits + uint32(metadata[i].length), + metadata[i] + ); + + // Accumulate all claim calls + totalCompressedClaim = abi.encodePacked( + totalCompressedClaim, + compressedClaimCall + ); + } + return totalCompressedClaim; + } + + function decompressClaimCall(bytes calldata compressedClaimCalls) external { + // Starts with the common parameters for all the claims: + + // smtProofLocalExitRoots bytes32[32] + // smtProofRollupExitRoots bytes32[32] + // mainnetExitRoot bytes32 + // rollupExitRoot bytes32 + + // will copy them afterwards when needed, the idea will be to reacraete the call in assembly + + // // This pointer will be the current position to write on accumulateSnarkBytes + // uint256 ptrCompressedClaimCall; + // // Total length of the accumulateSnarkBytes, ByesPerRollup * rollupToVerify + 20 bytes (msg.sender) + // uint256 totalSnarkLength = _SNARK_BYTES_PER_ROLLUP_AGGREGATED * + // verifyBatchesData.length + + // 20; + + uint256 destinationAddress = _networkID; + + // no need to be memory-safe, since the rest of the function will happen on assembly ¿? + assembly ("memory-safe") { + // Get the last free memory pointer ( i might use 0 aswell) + //let freeMemPointer := mload(0x40) + + // no need to reserve memory since the rest of the funcion will happen on assembly + let compressedClaimCallsOffset := compressedClaimCalls.offset + let compressedClaimCallsLen := compressedClaimCalls.length + + // Calldata claimMessage + // function claimMessage( + // bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofLocalExitRoot, + // bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot, --> constant + // uint256 globalIndex, + // bytes32 mainnetExitRoot, --> constant + // bytes32 rollupExitRoot, --> constant + // uint32 originNetwork, + // address originAddress, + // uint32 destinationNetwork, --> constant + // address destinationAddress, + // uint256 amount, + // bytes calldata metadata + // ) + + // Encoded compressed Data: + + // Constant parameters: + // smtProofLocalExitRoots[0], + // smtProofRollupExitRoots, + // mainnetExitRoot, + // rollupExitRoot + + // Parameters per claim tx + // [ + // isMessage[i], + // uint8(lastDifferentLevel), + // smtProofCompressed, + // bytes1(bytes32(globalIndex[i] << 191)), // get the 65th bit, so 256 - 65 = 191 + // uint64(globalIndex[i]), + // originNetwork[i], // for first version this is ok + // originAddress[i], + // destinationAddress[i], + // amount[i], // could compress to 128 bits + // uint32(metadata[i].length), + // metadata[i] + // ] + // Write the constant parameters for all claims in this call + + // Copy smtProofRollupExitRoot + calldatacopy( + add(4, _BYTE_LEN_CONSTANT_ARRAYS), // Memory offset, signature + smtProofLocalExitRoot = 32 * 32 bytes + 4 bytes + add(compressedClaimCallsOffset, _BYTE_LEN_CONSTANT_ARRAYS), // calldata offset + _BYTE_LEN_CONSTANT_ARRAYS // Copy smtProofRollupExitRoot len + ) + + // Copy mainnetExitRoot + calldatacopy( + add(4, mul(65, 32)), // Memory offset, signature + smtProofLocalExitRoot + smtProofRollupExitRoot + globalIndex = 65 * 32 bytes + 4 bytes + add(compressedClaimCallsOffset, mul(64, 32)), // calldata offset, smtProofLocalExitRoots[0] + smtProofRollupExitRoots = 64*32 + 32 // Copy mainnetExitRoot len + ) + + // Copy rollupExitRoot + calldatacopy( + add(4, mul(66, 32)), // Memory offset, signature + smtProofLocalExitRoot + smtProofRollupExitRoot + globalIndex + mainnetExitRoot = 66 * 32 bytes + 4 bytes + add(compressedClaimCallsOffset, mul(65, 32)), // calldata offset, smtProofLocalExitRoots[0] + smtProofRollupExitRoots + mainnetExitRoot = 65*32 + 32 // Copy rollupExitRoot len + ) + + // Copy destinationAddress, since is constant, just use mstore + + // Memory offset, signature + smtProofLocalExitRoot + smtProofRollupExitRoot + + // globalIndex + mainnetExitRoot + rollupExitRoot + originNetwork + originAddress = 69 * 32 bytes + 4 bytes + mstore(add(4, mul(69, 32)), destinationAddress) + + // Skip constant parameters + + // smtProofLocalExitRoots[0], + // smtProofRollupExitRoots, + // mainnetExitRoot, + // rollupExitRoot + let currentCalldataPointer := _CONSTANT_VARIABLES_LENGTH + + for { + // initialization block, empty + } lt(currentCalldataPointer, compressedClaimCallsLen) { + // after iteration block, empty + } { + // loop block, non empty ;) + // x := add(x, mload(i)) + // i := add(i, 0x20) + } + + // Set the pointer on the start of the actual byte array + //ptrAccumulateInputSnarkBytes := add(accumulateSnarkBytes, 0x20) + + //call(gas(), bridgeAddress, 0, 0, add(_CONSTANT_BYTES_PER_CLAIM, metadataLen), 0, 0) + } + // gas + // address + // value + // argsOffset + // argsSize + // retOffset + // retSize + // assembly { + // // store oldStateRoot + // mstore(ptr, oldStateRoot) + // ptr := add(ptr, 32) + // } + } +} diff --git a/hardhat.config.ts b/hardhat.config.ts index 9134169f1..43062876b 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -27,16 +27,6 @@ const config: HardhatUserConfig = { }, solidity: { compilers: [ - { - version: "0.8.23", - settings: { - optimizer: { - enabled: true, - runs: 999999, - }, - viaIR: true, - }, - }, { version: "0.8.17", settings: { @@ -136,6 +126,17 @@ const config: HardhatUserConfig = { evmVersion: "shanghai", }, // try yul optimizer }, + "contracts/v2/utils/ClaimCompressor.sol": { + version: "0.8.20", + settings: { + optimizer: { + enabled: true, + runs: 999999, + }, + evmVersion: "shanghai", + viaIR: true, + }, + }, }, }, networks: { From f0c48ce20dec87e17be4f8c9cef0d93fe794e81b Mon Sep 17 00:00:00 2001 From: begmaroman Date: Thu, 1 Feb 2024 14:49:56 +0000 Subject: [PATCH 196/230] Added deployment output files to the container and serve them via nginx --- .github/workflows/build-docker.yml | 2 +- .gitignore | 4 +- docker/Dockerfile | 19 ++++++ docker/Dockerfile.geth | 8 --- ...er-compose.geth.yml => docker-compose.yml} | 0 docker/entrypoint.sh | 7 ++ docker/nginx.conf | 35 ++++++++++ docker/scripts/v1ToV2/deploy-docker.sh | 6 +- docker/scripts/v1ToV2/deploy-dockerv2.sh | 6 +- docker/scripts/v2/deploy-docker.sh | 6 +- docker/scripts/v2/deploy-dockerv2.sh | 6 +- hardhat.config.ts | 68 +++++++------------ package-lock.json | 4 +- 13 files changed, 103 insertions(+), 68 deletions(-) create mode 100644 docker/Dockerfile delete mode 100644 docker/Dockerfile.geth rename docker/{docker-compose.geth.yml => docker-compose.yml} (100%) create mode 100755 docker/entrypoint.sh create mode 100644 docker/nginx.conf diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index a8bfa1c2b..84f77df6c 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -56,5 +56,5 @@ jobs: platforms: linux/amd64,linux/arm64 push: true tags: hermeznetwork/geth-zkevm-contracts:1.5-integration - file: docker/Dockerfile.geth + file: docker/Dockerfile context: . diff --git a/.gitignore b/.gitignore index 4f37d8194..ccfa57616 100644 --- a/.gitignore +++ b/.gitignore @@ -19,4 +19,6 @@ upgrade_parameters.json docker/gethData/ *.ignore/ typechain-types/ -create_rollup_parameters.json \ No newline at end of file +create_rollup_parameters.json + +docker/deploymentOutput \ No newline at end of file diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 000000000..1bf7bf17f --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,19 @@ +FROM ethereum/client-go:v1.12.0 + +RUN apk update +RUN apk add --no-cache nginx + +RUN nginx -v + +COPY docker/entrypoint.sh /usr/local/bin/entrypoint.sh +COPY docker/nginx.conf /etc/nginx/nginx.conf + +EXPOSE 8545 +EXPOSE 9545 + +COPY docker/gethData / +COPY docker/deploymentOutput /config/ + +ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] + +CMD ["--rpc.allow-unprotected-txs", "--http", "--http.addr", "0.0.0.0", "--http.corsdomain", "*", "--http.vhosts", "*", "--ws", "--ws.origins", "*", "--ws.addr", "0.0.0.0", "--dev", "--dev.period", "1", "--datadir", "/geth_data"] diff --git a/docker/Dockerfile.geth b/docker/Dockerfile.geth deleted file mode 100644 index 4788debaa..000000000 --- a/docker/Dockerfile.geth +++ /dev/null @@ -1,8 +0,0 @@ -FROM ethereum/client-go:v1.12.0 - -EXPOSE 8545 - -COPY docker/gethData / - -ENTRYPOINT ["geth"] -CMD ["--rpc.allow-unprotected-txs", "--http", "--http.addr", "0.0.0.0","--http.corsdomain", "*", "--http.vhosts" ,"*", "--ws", "--ws.origins", "*", "--ws.addr", "0.0.0.0", "--dev", "--dev.period", "1", "--datadir", "/geth_data"] \ No newline at end of file diff --git a/docker/docker-compose.geth.yml b/docker/docker-compose.yml similarity index 100% rename from docker/docker-compose.geth.yml rename to docker/docker-compose.yml diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh new file mode 100755 index 000000000..7a29a3c72 --- /dev/null +++ b/docker/entrypoint.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env sh + +set -xeuo + +nginx -g 'daemon off;' & + +geth "$@" diff --git a/docker/nginx.conf b/docker/nginx.conf new file mode 100644 index 000000000..6b1e8c094 --- /dev/null +++ b/docker/nginx.conf @@ -0,0 +1,35 @@ +user nginx; +worker_processes auto; +error_log /var/log/nginx/error.log; +pid /run/nginx.pid; + +include /usr/share/nginx/modules/*.conf; + +events { + worker_connections 1024; +} + +http { + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + access_log /var/log/nginx/access.log main; + + include /etc/nginx/mime.types; + default_type application/json; + + server { + listen 9545 default_server; + listen [::]:9545 default_server; + + server_name _; + root /config; + + location / { + alias /config/; + default_type application/json; + index deploy_output.json; + } + } +} diff --git a/docker/scripts/v1ToV2/deploy-docker.sh b/docker/scripts/v1ToV2/deploy-docker.sh index 6e9fe02ee..fd3049549 100755 --- a/docker/scripts/v1ToV2/deploy-docker.sh +++ b/docker/scripts/v1ToV2/deploy-docker.sh @@ -1,6 +1,6 @@ #!/bin/bash sudo rm -rf docker/gethData/geth_data -DEV_PERIOD=1 docker-compose -f docker/docker-compose.geth.yml up -d geth +DEV_PERIOD=1 docker-compose -f docker/docker-compose.yml up -d geth sleep 5 node docker/scripts/fund-accounts.js cp docker/scripts/testV1ToV2/deploy_parameters_docker.json deployment/testV1ToV2/deploy_parameters.json @@ -8,7 +8,7 @@ npm run deploy:testnet:testV1ToV2:localhost mkdir docker/deploymentOutput mv deployment/testV1ToV2/deploy_output.json docker/deploymentOutput mv deployment/testV1ToV2/genesis.json docker/deploymentOutput -DEV_PERIOD=1 docker-compose -f docker/docker-compose.geth.yml down -sudo docker build -t hermeznetwork/geth-zkevm-contracts -f docker/Dockerfile.geth . +DEV_PERIOD=1 docker-compose -f docker/docker-compose.yml down +docker build -t hermeznetwork/geth-zkevm-contracts -f docker/Dockerfile . # Let it readable for the multiplatform build coming later! sudo chmod -R go+rxw docker/gethData diff --git a/docker/scripts/v1ToV2/deploy-dockerv2.sh b/docker/scripts/v1ToV2/deploy-dockerv2.sh index 47a15b7a7..edc4ec44a 100755 --- a/docker/scripts/v1ToV2/deploy-dockerv2.sh +++ b/docker/scripts/v1ToV2/deploy-dockerv2.sh @@ -1,6 +1,6 @@ #!/bin/bash sudo rm -rf docker/gethData/geth_data -DEV_PERIOD=1 docker compose -f docker/docker-compose.geth.yml up -d geth +DEV_PERIOD=1 docker compose -f docker/docker-compose.yml up -d geth sleep 5 node docker/scripts/fund-accounts.js cp docker/scripts/testV1ToV2/deploy_parameters_docker.json deployment/testV1ToV2/deploy_parameters.json @@ -8,7 +8,7 @@ npm run deploy:testnet:testV1ToV2:localhost mkdir docker/deploymentOutput mv deployment/testV1ToV2/deploy_output.json docker/deploymentOutput mv deployment/testV1ToV2/genesis.json docker/deploymentOutput -DEV_PERIOD=1 docker compose -f docker/docker-compose.geth.yml down -sudo docker build -t hermeznetwork/geth-zkevm-contracts -f docker/Dockerfile.geth . +DEV_PERIOD=1 docker compose -f docker/docker-compose.yml down +docker build -t hermeznetwork/geth-zkevm-contracts -f docker/Dockerfile . # Let it readable for the multiplatform build coming later! sudo chmod -R go+rxw docker/gethData \ No newline at end of file diff --git a/docker/scripts/v2/deploy-docker.sh b/docker/scripts/v2/deploy-docker.sh index b7c330d2a..77f305a83 100755 --- a/docker/scripts/v2/deploy-docker.sh +++ b/docker/scripts/v2/deploy-docker.sh @@ -1,6 +1,6 @@ #!/bin/bash sudo rm -rf docker/gethData/geth_data -DEV_PERIOD=1 docker-compose -f docker/docker-compose.geth.yml up -d geth +DEV_PERIOD=1 docker-compose -f docker/docker-compose.yml up -d geth sleep 5 node docker/scripts/fund-accounts.js cp docker/scripts/v2/deploy_parameters_docker.json deployment/v2/deploy_parameters.json @@ -10,7 +10,7 @@ mkdir docker/deploymentOutput mv deployment/v2/deploy_output.json docker/deploymentOutput mv deployment/v2/genesis.json docker/deploymentOutput mv deployment/v2/create_rollup_output.json docker/deploymentOutput -DEV_PERIOD=1 docker-compose -f docker/docker-compose.geth.yml down -sudo docker build -t hermeznetwork/geth-zkevm-contracts -f docker/Dockerfile.geth . +DEV_PERIOD=1 docker-compose -f docker/docker-compose.yml down +docker build -t hermeznetwork/geth-zkevm-contracts -f docker/Dockerfile --progress . # Let it readable for the multiplatform build coming later! sudo chmod -R go+rxw docker/gethData diff --git a/docker/scripts/v2/deploy-dockerv2.sh b/docker/scripts/v2/deploy-dockerv2.sh index feabb0a87..75dba6775 100755 --- a/docker/scripts/v2/deploy-dockerv2.sh +++ b/docker/scripts/v2/deploy-dockerv2.sh @@ -1,6 +1,6 @@ #!/bin/bash sudo rm -rf docker/gethData/geth_data -DEV_PERIOD=1 docker compose -f docker/docker-compose.geth.yml up -d geth +DEV_PERIOD=1 docker compose -f docker/docker-compose.yml up -d geth sleep 5 node docker/scripts/fund-accounts.js cp docker/scripts/v2/deploy_parameters_docker.json deployment/v2/deploy_parameters.json @@ -10,7 +10,7 @@ mkdir docker/deploymentOutput mv deployment/v2/deploy_output.json docker/deploymentOutput mv deployment/v2/genesis.json docker/deploymentOutput mv deployment/v2/create_rollup_output.json docker/deploymentOutput -DEV_PERIOD=1 docker compose -f docker/docker-compose.geth.yml down -sudo docker build -t hermeznetwork/geth-zkevm-contracts -f docker/Dockerfile.geth . +DEV_PERIOD=1 docker compose -f docker/docker-compose.yml down +docker build -t hermeznetwork/geth-zkevm-contracts -f docker/Dockerfile . # Let it readable for the multiplatform build coming later! sudo chmod -R go+rxw docker/gethData \ No newline at end of file diff --git a/hardhat.config.ts b/hardhat.config.ts index 3a207099d..ea1982a00 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -43,7 +43,7 @@ const config: HardhatUserConfig = { enabled: true, runs: 999999, }, - evmVersion: "shanghai", + evmVersion: "paris", }, }, { @@ -80,9 +80,9 @@ const config: HardhatUserConfig = { settings: { optimizer: { enabled: true, - runs: 500, + runs: 99, }, - evmVersion: "shanghai", + evmVersion: "paris", }, // try yul optimizer }, "contracts/v2/PolygonZkEVMBridgeV2.sol": { @@ -90,20 +90,20 @@ const config: HardhatUserConfig = { settings: { optimizer: { enabled: true, - runs: 999, + runs: 99, }, - evmVersion: "shanghai", + evmVersion: "paris", }, }, - "contracts/v2/newDeployments/PolygonRollupManagerNotUpgraded.sol": { + "contracts/lib/TokenWrapped.sol": { version: "0.8.20", settings: { optimizer: { enabled: true, - runs: 500, + runs: 9999, // must be the same as bridge, for testing porpuses }, - evmVersion: "shanghai", - }, // try yul optimizer + evmVersion: "paris", + }, }, "contracts/v2/mocks/PolygonRollupManagerMock.sol": { version: "0.8.20", @@ -112,7 +112,7 @@ const config: HardhatUserConfig = { enabled: true, runs: 10, }, - evmVersion: "shanghai", + evmVersion: "paris", }, // try yul optimizer }, // Should have the same optimizations than the RollupManager to verify @@ -121,9 +121,19 @@ const config: HardhatUserConfig = { settings: { optimizer: { enabled: true, - runs: 500, + runs: 10, + }, + evmVersion: "paris", + }, // try yul optimizer + }, + "contracts/v2/newDeployments/PolygonRollupManagerNotUpgraded.sol": { + version: "0.8.20", + settings: { + optimizer: { + enabled: true, + runs: 10, }, - evmVersion: "shanghai", + evmVersion: "paris", }, // try yul optimizer }, }, @@ -173,17 +183,6 @@ const config: HardhatUserConfig = { count: 20, }, }, - sepolia: { - url: process.env.SEPOLIA_PROVIDER - ? process.env.SEPOLIA_PROVIDER - : `https://sepolia.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, - accounts: { - mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, - path: "m/44'/60'/0'/0", - initialIndex: 0, - count: 20, - }, - }, localhost: { url: "http://127.0.0.1:8545", accounts: { @@ -195,7 +194,7 @@ const config: HardhatUserConfig = { }, hardhat: { initialDate: "0", - allowUnlimitedContractSize: true, + //allowUnlimitedContractSize: true, initialBaseFeePerGas: 0, accounts: { mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, @@ -222,15 +221,6 @@ const config: HardhatUserConfig = { count: 20, }, }, - zkevmDevnet: { - url: "http://123:123:123:123:123", - accounts: { - mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, - path: "m/44'/60'/0'/0", - initialIndex: 0, - count: 20, - }, - }, }, gasReporter: { enabled: !!process.env.REPORT_GAS, @@ -242,9 +232,7 @@ const config: HardhatUserConfig = { polygonZKEVMTestnet: `${process.env.ETHERSCAN_ZKEVM_API_KEY}`, polygonZKEVMMainnet: `${process.env.ETHERSCAN_ZKEVM_API_KEY}`, goerli: `${process.env.ETHERSCAN_API_KEY}`, - sepolia: `${process.env.ETHERSCAN_API_KEY}`, mainnet: `${process.env.ETHERSCAN_API_KEY}`, - zkevmDevnet: `${process.env.ETHERSCAN_API_KEY}`, }, customChains: [ { @@ -263,16 +251,8 @@ const config: HardhatUserConfig = { browserURL: "https://testnet-zkevm.polygonscan.com/", }, }, - { - network: "zkevmDevnet", - chainId: 123, - urls: { - apiURL: "http://123:123:123:123:123/api", - browserURL: "http://123:123:123:123:123", - }, - }, ], }, }; -export default config; +export default config; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 8d7f98dd7..2fc51a05d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@0xpolygonhermez/zkevm-contracts", - "version": "2.0.0", + "version": "3.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@0xpolygonhermez/zkevm-contracts", - "version": "2.0.0", + "version": "3.0.0", "license": "pending", "devDependencies": { "@0xpolygonhermez/zkevm-commonjs": "github:0xPolygonHermez/zkevm-commonjs#main", From cf8860740c61b37a3fdb82464fbbc34df70f627b Mon Sep 17 00:00:00 2001 From: begmaroman Date: Thu, 1 Feb 2024 14:52:54 +0000 Subject: [PATCH 197/230] Minor update --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index ccfa57616..ca2367c8b 100644 --- a/.gitignore +++ b/.gitignore @@ -21,4 +21,4 @@ docker/gethData/ typechain-types/ create_rollup_parameters.json -docker/deploymentOutput \ No newline at end of file +docker/deploymentOutput From cdc459614267d0d726026a8eec324b861d762258 Mon Sep 17 00:00:00 2001 From: begmaroman Date: Thu, 1 Feb 2024 14:53:16 +0000 Subject: [PATCH 198/230] Minor update --- docker/nginx.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/nginx.conf b/docker/nginx.conf index 6b1e8c094..ce924bb55 100644 --- a/docker/nginx.conf +++ b/docker/nginx.conf @@ -31,5 +31,5 @@ http { default_type application/json; index deploy_output.json; } - } + } } From 7d5a203d696d29dcca643e2a9a45cd5b64f67f5b Mon Sep 17 00:00:00 2001 From: begmaroman Date: Thu, 1 Feb 2024 14:53:59 +0000 Subject: [PATCH 199/230] Minor update --- hardhat.config.ts | 68 ++++++++++++++++++++++++++++++----------------- package-lock.json | 4 +-- 2 files changed, 46 insertions(+), 26 deletions(-) diff --git a/hardhat.config.ts b/hardhat.config.ts index ea1982a00..3a207099d 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -43,7 +43,7 @@ const config: HardhatUserConfig = { enabled: true, runs: 999999, }, - evmVersion: "paris", + evmVersion: "shanghai", }, }, { @@ -80,9 +80,9 @@ const config: HardhatUserConfig = { settings: { optimizer: { enabled: true, - runs: 99, + runs: 500, }, - evmVersion: "paris", + evmVersion: "shanghai", }, // try yul optimizer }, "contracts/v2/PolygonZkEVMBridgeV2.sol": { @@ -90,20 +90,20 @@ const config: HardhatUserConfig = { settings: { optimizer: { enabled: true, - runs: 99, + runs: 999, }, - evmVersion: "paris", + evmVersion: "shanghai", }, }, - "contracts/lib/TokenWrapped.sol": { + "contracts/v2/newDeployments/PolygonRollupManagerNotUpgraded.sol": { version: "0.8.20", settings: { optimizer: { enabled: true, - runs: 9999, // must be the same as bridge, for testing porpuses + runs: 500, }, - evmVersion: "paris", - }, + evmVersion: "shanghai", + }, // try yul optimizer }, "contracts/v2/mocks/PolygonRollupManagerMock.sol": { version: "0.8.20", @@ -112,7 +112,7 @@ const config: HardhatUserConfig = { enabled: true, runs: 10, }, - evmVersion: "paris", + evmVersion: "shanghai", }, // try yul optimizer }, // Should have the same optimizations than the RollupManager to verify @@ -121,19 +121,9 @@ const config: HardhatUserConfig = { settings: { optimizer: { enabled: true, - runs: 10, - }, - evmVersion: "paris", - }, // try yul optimizer - }, - "contracts/v2/newDeployments/PolygonRollupManagerNotUpgraded.sol": { - version: "0.8.20", - settings: { - optimizer: { - enabled: true, - runs: 10, + runs: 500, }, - evmVersion: "paris", + evmVersion: "shanghai", }, // try yul optimizer }, }, @@ -183,6 +173,17 @@ const config: HardhatUserConfig = { count: 20, }, }, + sepolia: { + url: process.env.SEPOLIA_PROVIDER + ? process.env.SEPOLIA_PROVIDER + : `https://sepolia.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, + }, localhost: { url: "http://127.0.0.1:8545", accounts: { @@ -194,7 +195,7 @@ const config: HardhatUserConfig = { }, hardhat: { initialDate: "0", - //allowUnlimitedContractSize: true, + allowUnlimitedContractSize: true, initialBaseFeePerGas: 0, accounts: { mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, @@ -221,6 +222,15 @@ const config: HardhatUserConfig = { count: 20, }, }, + zkevmDevnet: { + url: "http://123:123:123:123:123", + accounts: { + mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, + path: "m/44'/60'/0'/0", + initialIndex: 0, + count: 20, + }, + }, }, gasReporter: { enabled: !!process.env.REPORT_GAS, @@ -232,7 +242,9 @@ const config: HardhatUserConfig = { polygonZKEVMTestnet: `${process.env.ETHERSCAN_ZKEVM_API_KEY}`, polygonZKEVMMainnet: `${process.env.ETHERSCAN_ZKEVM_API_KEY}`, goerli: `${process.env.ETHERSCAN_API_KEY}`, + sepolia: `${process.env.ETHERSCAN_API_KEY}`, mainnet: `${process.env.ETHERSCAN_API_KEY}`, + zkevmDevnet: `${process.env.ETHERSCAN_API_KEY}`, }, customChains: [ { @@ -251,8 +263,16 @@ const config: HardhatUserConfig = { browserURL: "https://testnet-zkevm.polygonscan.com/", }, }, + { + network: "zkevmDevnet", + chainId: 123, + urls: { + apiURL: "http://123:123:123:123:123/api", + browserURL: "http://123:123:123:123:123", + }, + }, ], }, }; -export default config; \ No newline at end of file +export default config; diff --git a/package-lock.json b/package-lock.json index 2fc51a05d..8d7f98dd7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@0xpolygonhermez/zkevm-contracts", - "version": "3.0.0", + "version": "2.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@0xpolygonhermez/zkevm-contracts", - "version": "3.0.0", + "version": "2.0.0", "license": "pending", "devDependencies": { "@0xpolygonhermez/zkevm-commonjs": "github:0xPolygonHermez/zkevm-commonjs#main", From 9f4be2272fd308b0b5f38388265662ffa30fc60d Mon Sep 17 00:00:00 2001 From: invocamanman Date: Thu, 1 Feb 2024 18:52:24 +0100 Subject: [PATCH 200/230] small changes --- contracts/v2/lib/PolygonRollupBaseEtrog.sol | 2 +- contracts/v2/utils/ClaimCompressor.sol | 2 +- deployment/v2/4_createRollup.ts | 2 ++ deployment/v2/README.md | 1 + 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/contracts/v2/lib/PolygonRollupBaseEtrog.sol b/contracts/v2/lib/PolygonRollupBaseEtrog.sol index 09c59e003..00eb9e6c6 100644 --- a/contracts/v2/lib/PolygonRollupBaseEtrog.sol +++ b/contracts/v2/lib/PolygonRollupBaseEtrog.sol @@ -406,7 +406,7 @@ contract PolygonRollupBaseEtrog is /** * @notice Allows a sequencer to send multiple batches * @param batches Struct array which holds the necessary data to append new batches to the sequence - * @param l2Coinbase Address that will receive the fees from L2+ + * @param l2Coinbase Address that will receive the fees from L2 * note Pol is not a reentrant token */ function sequenceBatches( diff --git a/contracts/v2/utils/ClaimCompressor.sol b/contracts/v2/utils/ClaimCompressor.sol index 9d3bcc07f..6515334b9 100644 --- a/contracts/v2/utils/ClaimCompressor.sol +++ b/contracts/v2/utils/ClaimCompressor.sol @@ -153,7 +153,7 @@ contract ClaimCompressor { uint64(globalIndex[i]), // mainnetExitRoot, // rollupExitRoot, - originNetwork[i], // for first version this is ok + originNetwork[i], originAddress[i], // destinationNetwork destinationAddress[i], diff --git a/deployment/v2/4_createRollup.ts b/deployment/v2/4_createRollup.ts index 393c52934..daadd02fb 100644 --- a/deployment/v2/4_createRollup.ts +++ b/deployment/v2/4_createRollup.ts @@ -286,6 +286,8 @@ async function main() { // Setup data commitee to 0 await (await polygonDataCommittee?.setupCommittee(0, [], "0x")).wait(); + } else { + await (await polygonDataCommittee?.transferOwnership(adminZkEVM)).wait(); } outputJson.polygonDataCommittee = polygonDataCommittee?.target; diff --git a/deployment/v2/README.md b/deployment/v2/README.md index 4fee2f052..62e1c68ed 100644 --- a/deployment/v2/README.md +++ b/deployment/v2/README.md @@ -55,6 +55,7 @@ A new folder will be created witth the following name `deployments/${network}_$( ## deploy-parameters.json +- `test` : bool, Indicate if it's a test deployment, which will fund the deployer address with pre minted ether and will give more powers to the deployer address to make easier the flow. - `timelockAdminAddress`: address, Timelock owner address, able to send start an upgradability process via timelock - `minDelayTimelock`: number, Minimum timelock delay, - `salt`: bytes32, Salt used in `PolygonZkEVMDeployer` to deploy deterministic contracts, such as the PolygonZkEVMBridge From 94e723f0bbff7991114a3178a3cccc5dc2637312 Mon Sep 17 00:00:00 2001 From: begmaroman Date: Fri, 2 Feb 2024 12:46:37 +0000 Subject: [PATCH 201/230] Minor update --- docker/scripts/v2/deploy-docker.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/scripts/v2/deploy-docker.sh b/docker/scripts/v2/deploy-docker.sh index 77f305a83..54e679e68 100755 --- a/docker/scripts/v2/deploy-docker.sh +++ b/docker/scripts/v2/deploy-docker.sh @@ -11,6 +11,6 @@ mv deployment/v2/deploy_output.json docker/deploymentOutput mv deployment/v2/genesis.json docker/deploymentOutput mv deployment/v2/create_rollup_output.json docker/deploymentOutput DEV_PERIOD=1 docker-compose -f docker/docker-compose.yml down -docker build -t hermeznetwork/geth-zkevm-contracts -f docker/Dockerfile --progress . +docker build -t hermeznetwork/geth-zkevm-contracts -f docker/Dockerfile . # Let it readable for the multiplatform build coming later! sudo chmod -R go+rxw docker/gethData From 8bc56084523a7879d6809f92e1c46acd51be4b8a Mon Sep 17 00:00:00 2001 From: invocamanman Date: Fri, 2 Feb 2024 19:12:10 +0100 Subject: [PATCH 202/230] steps --- contracts/v2/mocks/BridgeReceiverMock.sol | 165 ++++++++++++++ contracts/v2/utils/ClaimCompressor.sol | 260 ++++++++++++++++++---- test/contractsv2/ClaimCompressor.test.ts | 146 +++++++++++- 3 files changed, 524 insertions(+), 47 deletions(-) create mode 100644 contracts/v2/mocks/BridgeReceiverMock.sol diff --git a/contracts/v2/mocks/BridgeReceiverMock.sol b/contracts/v2/mocks/BridgeReceiverMock.sol new file mode 100644 index 000000000..0ab52dc66 --- /dev/null +++ b/contracts/v2/mocks/BridgeReceiverMock.sol @@ -0,0 +1,165 @@ +// SPDX-License-Identifier: AGPL-3.0 + +import "../PolygonZkEVMBridgeV2.sol"; + +pragma solidity 0.8.20; + +/** + * Contract for compressing and decompressing claim data + */ +contract BridgeReceiverMock { + uint256 internal constant _DEPOSIT_CONTRACT_TREE_DEPTH = 32; + + event FallbackEvent(bytes calldataBytes); + + /** + * @dev Emitted when bridge assets or messages to another network + */ + event ClaimAsset( + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] smtProofLocalExitRoot, + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] smtProofRollupExitRoot, + uint256 globalIndex, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + uint32 originNetwork, + address originTokenAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes metadata + ); + + /** + * @dev Emitted when bridge assets or messages to another network + */ + event ClaimMessage( + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] smtProofLocalExitRoot, + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] smtProofRollupExitRoot, + uint256 globalIndex, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + uint32 originNetwork, + address originTokenAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes metadata + ); + + /** + * @notice Verify merkle proof and withdraw tokens/ether + * @param smtProofLocalExitRoot Smt proof to proof the leaf against the network exit root + * @param smtProofRollupExitRoot Smt proof to proof the rollupLocalExitRoot against the rollups exit root + * @param globalIndex Global index is defined as: + * | 191 bits | 1 bit | 32 bits | 32 bits | + * | 0 | mainnetFlag | rollupIndex | localRootIndex | + * 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 + * @param mainnetExitRoot Mainnet exit root + * @param rollupExitRoot Rollup exit root + * @param originNetwork Origin network + * @param originTokenAddress Origin token address, 0 address is reserved for ether + * @param destinationNetwork Network destination + * @param destinationAddress Address destination + * @param amount Amount of tokens + * @param metadata Abi encoded metadata if any, empty otherwise + */ + function claimAssetAA( + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofLocalExitRoot, + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot, + uint256 globalIndex, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + uint32 originNetwork, + address originTokenAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes calldata metadata + ) external { + emit ClaimAsset( + smtProofLocalExitRoot, + smtProofRollupExitRoot, + globalIndex, + mainnetExitRoot, + rollupExitRoot, + originNetwork, + originTokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ); + } + + /** + * @notice Verify merkle proof and execute message + * If the receiving address is an EOA, the call will result as a success + * Which means that the amount of ether will be transferred correctly, but the message + * will not trigger any execution + * @param smtProofLocalExitRoot Smt proof to proof the leaf against the exit root + * @param smtProofRollupExitRoot Smt proof to proof the rollupLocalExitRoot against the rollups exit root + * @param globalIndex Global index is defined as: + * | 191 bits | 1 bit | 32 bits | 32 bits | + * | 0 | mainnetFlag | rollupIndex | localRootIndex | + * 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 + * @param mainnetExitRoot Mainnet exit root + * @param rollupExitRoot Rollup exit root + * @param originNetwork Origin network + * @param originAddress Origin address + * @param destinationNetwork Network destination + * @param destinationAddress Address destination + * @param amount message value + * @param metadata Abi encoded metadata if any, empty otherwise + */ + function claimMessageBB( + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofLocalExitRoot, + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot, + uint256 globalIndex, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + uint32 originNetwork, + address originAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes calldata metadata + ) external { + // assembly { + // let ptr := mload(0x40) + + // let size := add(calldatasize(), 28) // 4 bytes calldata + + // mstore(ptr, 0x20) // dataPos + + // mstore(add(ptr, 0x20), size) // data len + + // calldatacopy(add(ptr, 0x40), 0, size) // data + + // return(ptr, add(size, 0x40)) + // } + + emit ClaimMessage( + smtProofLocalExitRoot, + smtProofRollupExitRoot, + globalIndex, + mainnetExitRoot, + rollupExitRoot, + originNetwork, + originAddress, + destinationNetwork, + destinationAddress, + amount, + metadata + ); + } + + fallback(bytes calldata input) external returns (bytes memory) { + emit FallbackEvent(input); + } +} diff --git a/contracts/v2/utils/ClaimCompressor.sol b/contracts/v2/utils/ClaimCompressor.sol index 6515334b9..5a17a1556 100644 --- a/contracts/v2/utils/ClaimCompressor.sol +++ b/contracts/v2/utils/ClaimCompressor.sol @@ -19,10 +19,13 @@ contract ClaimCompressor { // Mainnet identifier uint32 private constant _MAINNET_NETWORK_ID = 0; - bytes4 private constant _CLAIM_ASSET_SIGNATURE = + // Indicate where's the mainnet flag bit in the global index + uint256 private constant _GLOBAL_INDEX_MAINNET_FLAG = 2 ** 64; + + bytes32 private constant _CLAIM_ASSET_SIGNATURE = PolygonZkEVMBridgeV2.claimAsset.selector; - bytes4 private constant _CLAIM_MESSAGE_SIGNATURE = + bytes32 private constant _CLAIM_MESSAGE_SIGNATURE = PolygonZkEVMBridgeV2.claimMessage.selector; // Bytes that will be added to the snark input for every rollup aggregated @@ -43,6 +46,12 @@ contract ClaimCompressor { // rollupExitRoot uint256 internal constant _CONSTANT_VARIABLES_LENGTH = 32 * 32 * 2 + 32 * 2; + // 32*32 bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofLocalExitRoot + // 32*32 bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot + // 32*8 Rest constant parameters + // 32 bytes position + uint256 internal constant _METADATA_OFSSET = 32 * 32 * 2 + 8 * 32 + 32; + // function claimAsset( // bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofLocalExitRoot, // bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot, @@ -77,6 +86,22 @@ contract ClaimCompressor { // Mainnet identifier uint32 private immutable _networkID; + /** + * @notice Struct which will be used to call sequenceBatches + * @param transactions L2 ethereum transactions EIP-155 or pre-EIP-155 with signature: + * EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data, chainid, 0, 0,) || v || r || s + * pre-EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data) || v || r || s + * @param globalExitRoot Global exit root of the batch + * @param timestamp Sequenced timestamp of the batch + * @param minForcedTimestamp Minimum timestamp of the force batch data, empty when non forced batch + */ + struct BatchData { + bytes transactions; + bytes32 globalExitRoot; + uint64 timestamp; + uint64 minForcedTimestamp; + } + /** * @param __bridgeAddress PolygonZkEVMBridge contract address * @param __networkID Network ID @@ -117,7 +142,7 @@ contract ClaimCompressor { // common parameters for all the claims bytes memory totalCompressedClaim = abi.encodePacked( smtProofLocalExitRoots[0], - smtProofRollupExitRoots, + smtProofRollupExitRoots, // coudl be encoded like (uint8 len, first len []) mainnetExitRoot, rollupExitRoot ); @@ -146,10 +171,11 @@ contract ClaimCompressor { } bytes memory compressedClaimCall = abi.encodePacked( - isMessage[i], + uint8(isMessage[i] ? 1 : 0), // define byte with all small values TODO uint8(lastDifferentLevel), smtProofCompressed, - bytes1(bytes32(globalIndex[i] << 191)), // get the 65th bit, so 256 - 65 = 191 + uint8(globalIndex[i] >> 64), // define byte with all small values TODO + //bool(globalIndex[i] & _GLOBAL_INDEX_MAINNET_FLAG != 0), // get isMainnet bool uint64(globalIndex[i]), // mainnetExitRoot, // rollupExitRoot, @@ -179,27 +205,24 @@ contract ClaimCompressor { // mainnetExitRoot bytes32 // rollupExitRoot bytes32 - // will copy them afterwards when needed, the idea will be to reacraete the call in assembly + // Load "dynamic" constant and immutables since are not accesible from assembly + uint256 destinationNetwork = _networkID; + address bridgeAddress = _bridgeAddress; - // // This pointer will be the current position to write on accumulateSnarkBytes - // uint256 ptrCompressedClaimCall; - // // Total length of the accumulateSnarkBytes, ByesPerRollup * rollupToVerify + 20 bytes (msg.sender) - // uint256 totalSnarkLength = _SNARK_BYTES_PER_ROLLUP_AGGREGATED * - // verifyBatchesData.length + - // 20; - - uint256 destinationAddress = _networkID; + bytes32 claimAssetSignature = _CLAIM_ASSET_SIGNATURE; + bytes32 claimMessageSignature = _CLAIM_MESSAGE_SIGNATURE; // no need to be memory-safe, since the rest of the function will happen on assembly ¿? assembly ("memory-safe") { // Get the last free memory pointer ( i might use 0 aswell) - //let freeMemPointer := mload(0x40) + let freeMemPointer := mload(0x40) // no need to reserve memory since the rest of the funcion will happen on assembly let compressedClaimCallsOffset := compressedClaimCalls.offset let compressedClaimCallsLen := compressedClaimCalls.length - // Calldata claimMessage + // THe final calldata should be something like: + // Calldata claimMessage /claimAsset // function claimMessage( // bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofLocalExitRoot, // bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot, --> constant @@ -217,6 +240,7 @@ contract ClaimCompressor { // Encoded compressed Data: // Constant parameters: + // smtProofLocalExitRoots[0], // smtProofRollupExitRoots, // mainnetExitRoot, @@ -224,18 +248,19 @@ contract ClaimCompressor { // Parameters per claim tx // [ - // isMessage[i], + // uint8(isMessage[i] ? 1 : 0), // define byte with all small values TODO // uint8(lastDifferentLevel), // smtProofCompressed, - // bytes1(bytes32(globalIndex[i] << 191)), // get the 65th bit, so 256 - 65 = 191 + // uint8(globalIndex[i] >> 64), // define byte with all small values TODO // uint64(globalIndex[i]), - // originNetwork[i], // for first version this is ok + // originNetwork[i], // originAddress[i], // destinationAddress[i], // amount[i], // could compress to 128 bits // uint32(metadata[i].length), // metadata[i] // ] + // Write the constant parameters for all claims in this call // Copy smtProofRollupExitRoot @@ -263,7 +288,13 @@ contract ClaimCompressor { // Memory offset, signature + smtProofLocalExitRoot + smtProofRollupExitRoot + // globalIndex + mainnetExitRoot + rollupExitRoot + originNetwork + originAddress = 69 * 32 bytes + 4 bytes - mstore(add(4, mul(69, 32)), destinationAddress) + mstore(add(4, mul(69, 32)), destinationNetwork) + + // Copy metadata offset + // Memory offset, signature + smtProofLocalExitRoot + smtProofRollupExitRoot + + // globalIndex + mainnetExitRoot + rollupExitRoot + originNetwork + originAddress + + //destinationNetwork + destinationAddress + amount = 72 * 32 bytes + 4 bytes + mstore(add(4, mul(72, 32)), _METADATA_OFSSET) // Skip constant parameters @@ -279,26 +310,179 @@ contract ClaimCompressor { // after iteration block, empty } { // loop block, non empty ;) - // x := add(x, mload(i)) - // i := add(i, 0x20) - } - // Set the pointer on the start of the actual byte array - //ptrAccumulateInputSnarkBytes := add(accumulateSnarkBytes, 0x20) + // Read uint8 isMessageBool + switch shr(248, calldataload(currentCalldataPointer)) + case 0 { + // Write asset signature + mstore8(0, claimAssetSignature) + mstore8(1, shr(1, claimAssetSignature)) + mstore8(2, shr(2, claimAssetSignature)) + mstore8(3, shr(3, claimAssetSignature)) + } + case 1 { + mstore8(0, claimMessageSignature) + mstore8(1, shr(1, claimMessageSignature)) + mstore8(2, shr(2, claimMessageSignature)) + mstore8(3, shr(3, claimMessageSignature)) + } - //call(gas(), bridgeAddress, 0, 0, add(_CONSTANT_BYTES_PER_CLAIM, metadataLen), 0, 0) + // Add 1 byte of isMessage TODO + currentCalldataPointer := add(currentCalldataPointer, 1) + + // Mem pointer where the current data must be written + let memPointer := 4 + + // load lastDifferentLevel + let smtProofBytesToCopy := mul( + shr( + 248, // 256 - 8(lastDifferentLevel) = 248 + calldataload(currentCalldataPointer) + ), + 32 + ) + + // Add 1 byte of lastDifferentLevel + currentCalldataPointer := add(currentCalldataPointer, 1) + + calldatacopy( + 4, // Memory offset = 4 bytes + currentCalldataPointer, // calldata offset + smtProofBytesToCopy // Copy smtProofBytesToCopy len + ) + + // Add smtProofBytesToCopy bits of smtProofCompressed + currentCalldataPointer := add( + currentCalldataPointer, + smtProofBytesToCopy + ) + // mem pointer, add smtProofLocalExitRoot(current) + smtProofRollupExitRoot(constant) + memPointer := add(memPointer, mul(32, 64)) + + // Copy global index + // bool(globalIndex[i] & _GLOBAL_INDEX_MAINNET_FLAG != 0), // get isMainnet bool + // uint64(globalIndex[i]), + + // Since we cannot copy 65 bits, copy first mainnet flag + + // global exit root --> first 23 bytes to 0 + // | 191 bits | 1 bit | 32 bits | 32 bits | + // | mainnetFlag | rollupIndex | localRootIndex | + mstore8( + add(memPointer, 23), // 23 bytes globalIndex Offset + shr(255, calldataload(currentCalldataPointer)) + ) + + // Add 1 bytes of uint8(globalIndex[i] >> 64 + currentCalldataPointer := add(currentCalldataPointer, 1) + + // Copy the next 64 bytes for the uint64(globalIndex[i]), + calldatacopy( + add(memPointer, 23), // 24 bytes globalIndex Offset + currentCalldataPointer, // calldata offset + 8 // Copy uint64(globalIndex[i]) + ) + currentCalldataPointer := add(currentCalldataPointer, 8) + + // mem pointer, add globalIndex(current) + mainnetExitRoot(constant) + rollupExitRoot(constant) = 32*3 bytes + memPointer := add(memPointer, 96) + + // Copy the next 4 bytes for the originNetwork[i] + calldatacopy( + add(memPointer, 28), // 28 uint32 offset + currentCalldataPointer, // calldata offset + 4 // Copy originNetwork[i] + ) + currentCalldataPointer := add(currentCalldataPointer, 4) + + // mem pointer, add originNetwork(current) + memPointer := add(memPointer, 32) + + // Copy the next 20 bytes for the originAddress[i] + calldatacopy( + add(memPointer, 12), // 12 address offset + currentCalldataPointer, // calldata offset + 20 // Copy originAddress[i] + ) + currentCalldataPointer := add(currentCalldataPointer, 20) + + // mem pointer, add originAddress(current) + destinationNetwork (constant) + memPointer := add(memPointer, 64) + + // amount[i], // could compress to 128 bits + // uint32(metadata[i].length), + // metadata[i] + + // Copy the next 20 bytes for the destinationAddress[i] + calldatacopy( + add(memPointer, 12), // 12 address offset + currentCalldataPointer, // calldata offset + 20 // Copy destinationAddress[i] + ) + currentCalldataPointer := add(currentCalldataPointer, 20) + + // mem pointer, add destinationAddress(current) + memPointer := add(memPointer, 32) + + // Copy the next 32 bytes for the amount[i] + calldatacopy( + memPointer, // 0 uint256 offset + currentCalldataPointer, // calldata offset + 32 // Copy amount[i] + ) + currentCalldataPointer := add(currentCalldataPointer, 32) + + // mem pointer, add amount(current), add metadataOffset (constant) + memPointer := add(memPointer, 64) + + // Copy the next 4 bytes for the uint32(metadata[i].length) + + // load metadataLen + let metadataLen := shr( + 248, // 256 - 32(uint32(metadata[i].length)) = 224 + calldataload(currentCalldataPointer) + ) + + mstore(memPointer, metadataLen) + + currentCalldataPointer := add(currentCalldataPointer, 4) + + // mem pointer, add originNetwork(current) + memPointer := add(memPointer, 32) + + // Write metadata + + // Copy the next metadataLen bytes for themetadata + calldatacopy( + memPointer, // mem offset + currentCalldataPointer, // calldata offset + metadataLen // Copy metadataLen bytes + ) + + currentCalldataPointer := add( + currentCalldataPointer, + metadataLen + ) + + memPointer := add(memPointer, metadataLen) + + // clean mem just in case + mstore(memPointer, 0) + + // len args should be a multiple of 32 bytes + metadataLen := add(metadataLen, mod(metadataLen, 32)) + + // SHould i limit the gas TODO or the call + let success := call( + gas(), // gas + bridgeAddress, // address + 0, // value + 0, // args offset + add(_CONSTANT_BYTES_PER_CLAIM, metadataLen), // argsSize + 0, // retOffset + 0 // retSize + ) + } } - // gas - // address - // value - // argsOffset - // argsSize - // retOffset - // retSize - // assembly { - // // store oldStateRoot - // mstore(ptr, oldStateRoot) - // ptr := add(ptr, 32) - // } } } diff --git a/test/contractsv2/ClaimCompressor.test.ts b/test/contractsv2/ClaimCompressor.test.ts index c2defe9fa..04624eb57 100644 --- a/test/contractsv2/ClaimCompressor.test.ts +++ b/test/contractsv2/ClaimCompressor.test.ts @@ -10,6 +10,7 @@ import { PolygonRollupBase, TokenWrapped, ClaimCompressor, + BridgeReceiverMock, } from "../../typechain-types"; import {takeSnapshot, time} from "@nomicfoundation/hardhat-network-helpers"; import {processorUtils, contractUtils, MTBridge, mtBridgeUtils} from "@0xpolygonhermez/zkevm-commonjs"; @@ -22,6 +23,7 @@ describe("PolygonZkEVMBridge Contract", () => { upgrades.silenceWarnings(); let claimCompressor: ClaimCompressor; + let bridgeReceiverMock: BridgeReceiverMock; const networkID = 1; @@ -48,14 +50,133 @@ describe("PolygonZkEVMBridge Contract", () => { // load signers [deployer, rollupManager, acc1, bridge] = await ethers.getSigners(); + // deploy receiver + const BridgeReceiverFactory = await ethers.getContractFactory("BridgeReceiverMock"); + bridgeReceiverMock = await BridgeReceiverFactory.deploy(); + await bridgeReceiverMock.waitForDeployment(); + // deploy global exit root manager const ClaimCompressorFactory = await ethers.getContractFactory("ClaimCompressor"); - claimCompressor = await ClaimCompressorFactory.deploy(bridge.address, networkID); + claimCompressor = await ClaimCompressorFactory.deploy(bridgeReceiverMock.target, networkID); await claimCompressor.waitForDeployment(); }); + it("should check it works", async () => { + const BridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + + const originNetwork = networkIDMainnet; + const tokenAddress = ethers.hexlify(ethers.randomBytes(20)); + const amount = ethers.parseEther("10"); + const destinationNetwork = networkIDMainnet; + const destinationAddress = acc1.address; + const metadata = metadataToken; + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + // compute root merkle tree in Js + const height = 32; + const merkleTreeLocal = new MerkleTreeBridge(height); + const leafValue = getLeafValue( + LEAF_TYPE_ASSET, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + for (let i = 0; i < 8; i++) { + merkleTreeLocal.add(leafValue); + } + + const mainnetExitRoot = merkleTreeLocal.getRoot(); + + const index = 0; + const proofLocal = merkleTreeLocal.getProofTreeByIndex(index); + + const indexRandom = 3; + + const encodedCall = BridgeFactory.interface.encodeFunctionData("claimAsset", [ + proofLocal, + proofLocal, + indexRandom, + mainnetExitRoot, + ethers.ZeroHash, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata, + ]); + + const newWallet = ethers.HDNodeWallet.fromMnemonic( + ethers.Mnemonic.fromPhrase("test test test test test test test test test test test junk"), + `m/44'/60'/0'/0/0` + ); + + const tx = { + data: encodedCall, + to: bridge.address, + nonce: 1, + gasLimit: 200000, + gasPrice: ethers.parseUnits("10", "gwei"), + chainId: 5, + }; + + const txSigned = await newWallet.signTransaction(tx); + + // Get claim tx bytes calldata + const customSignedTx = processorUtils.rawTxToCustomRawTx(txSigned); + + const proofs = [proofLocal]; + const indexes = [index]; + const originNetworks = [originNetwork]; + const tokenAddresses = [tokenAddress]; + const destinationAddresses = [destinationAddress]; + const amounts = [amount]; + const metadatas = [metadata]; + const isMessage = [false]; + + const compressedMultipleBytes = await claimCompressor.compressClaimCall( + proofs[0], + mainnetExitRoot, + ethers.ZeroHash, + proofs, + indexes, + originNetworks, + tokenAddresses, + destinationAddresses, + amounts, + metadatas, + isMessage + ); + + const receipt = await (await claimCompressor.decompressClaimCall(compressedMultipleBytes)).wait(); + + for (const log of receipt?.logs) { + const parsedLog = bridgeReceiverMock.interface.parseLog(log); + console.log({parsedLog}); + } + await expect(claimCompressor.decompressClaimCall(compressedMultipleBytes)) + .to.emit(bridgeReceiverMock, "FallbackEvent") + .withArgs("0x"); + // .to.emit(bridgeReceiverMock, "ClaimAsset") + // .withArgs( + // proofs[0], + // mainnetExitRoot, + // ethers.ZeroHash, + // proofs[0], + // indexes[0], + // originNetworks[0], + // tokenAddresses[0], + // destinationAddresses[0], + // amounts[0], + // metadatas[0], + // isMessage[0] + // ); + }); it("should check Compression", async () => { - const BridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridge"); + const BridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); const originNetwork = networkIDMainnet; const tokenAddress = ethers.hexlify(ethers.randomBytes(20)); @@ -86,9 +207,12 @@ describe("PolygonZkEVMBridge Contract", () => { const index = 0; const proofLocal = merkleTreeLocal.getProofTreeByIndex(index); + const indexRandom = 3; + const encodedCall = BridgeFactory.interface.encodeFunctionData("claimAsset", [ proofLocal, - index, + proofLocal, + indexRandom, mainnetExitRoot, ethers.ZeroHash, originNetwork, @@ -119,14 +243,15 @@ describe("PolygonZkEVMBridge Contract", () => { const customSignedTx = processorUtils.rawTxToCustomRawTx(txSigned); // Compute calldatas - for (let i = 1; i < 20; i++) { + for (let i = 1; i < 0; i++) { const proofs = [] as any; const indexes = [] as any; + const originNetworks = []; const tokenAddresses = []; const destinationAddresses = []; const amounts = []; const metadatas = []; - const isClaimeds = []; + const isMessage = []; for (let j = 0; j < i; j++) { const index = i; @@ -134,23 +259,26 @@ describe("PolygonZkEVMBridge Contract", () => { proofs.push(proofLocal); indexes.push(index); + originNetworks.push(originNetwork); tokenAddresses.push(tokenAddress); destinationAddresses.push(destinationAddress); amounts.push(amount); metadatas.push(metadata); - isClaimeds.push(false); + isMessage.push(false); } const compressedMultipleBytes = await claimCompressor.compressClaimCall( - proofs, - indexes, + proofs[0], mainnetExitRoot, ethers.ZeroHash, + proofs, + indexes, + originNetworks, tokenAddresses, destinationAddresses, amounts, metadatas, - isClaimeds + isMessage ); const txCompressedMultiple = { From 0e41f8dd3ea805c9ac5211548301072fd7133ba1 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Fri, 2 Feb 2024 19:12:44 +0100 Subject: [PATCH 203/230] another step --- contracts/v2/mocks/BridgeReceiverMock.sol | 5 +- contracts/v2/utils/ClaimCompressor.sol | 106 +++++++++++----------- hardhat.config.ts | 2 +- test/contractsv2/ClaimCompressor.test.ts | 22 +++-- 4 files changed, 68 insertions(+), 67 deletions(-) diff --git a/contracts/v2/mocks/BridgeReceiverMock.sol b/contracts/v2/mocks/BridgeReceiverMock.sol index 0ab52dc66..cf1954fa3 100644 --- a/contracts/v2/mocks/BridgeReceiverMock.sol +++ b/contracts/v2/mocks/BridgeReceiverMock.sol @@ -1,7 +1,6 @@ // SPDX-License-Identifier: AGPL-3.0 import "../PolygonZkEVMBridgeV2.sol"; - pragma solidity 0.8.20; /** @@ -159,7 +158,7 @@ contract BridgeReceiverMock { ); } - fallback(bytes calldata input) external returns (bytes memory) { - emit FallbackEvent(input); + fallback() external { + emit FallbackEvent(msg.data); } } diff --git a/contracts/v2/utils/ClaimCompressor.sol b/contracts/v2/utils/ClaimCompressor.sol index 5a17a1556..3b51111bd 100644 --- a/contracts/v2/utils/ClaimCompressor.sol +++ b/contracts/v2/utils/ClaimCompressor.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: AGPL-3.0 import "../PolygonZkEVMBridgeV2.sol"; +import "hardhat/console.sol"; pragma solidity 0.8.20; @@ -22,10 +23,10 @@ contract ClaimCompressor { // Indicate where's the mainnet flag bit in the global index uint256 private constant _GLOBAL_INDEX_MAINNET_FLAG = 2 ** 64; - bytes32 private constant _CLAIM_ASSET_SIGNATURE = + bytes4 private constant _CLAIM_ASSET_SIGNATURE = PolygonZkEVMBridgeV2.claimAsset.selector; - bytes32 private constant _CLAIM_MESSAGE_SIGNATURE = + bytes4 private constant _CLAIM_MESSAGE_SIGNATURE = PolygonZkEVMBridgeV2.claimMessage.selector; // Bytes that will be added to the snark input for every rollup aggregated @@ -87,19 +88,27 @@ contract ClaimCompressor { uint32 private immutable _networkID; /** - * @notice Struct which will be used to call sequenceBatches - * @param transactions L2 ethereum transactions EIP-155 or pre-EIP-155 with signature: - * EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data, chainid, 0, 0,) || v || r || s - * pre-EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data) || v || r || s - * @param globalExitRoot Global exit root of the batch - * @param timestamp Sequenced timestamp of the batch - * @param minForcedTimestamp Minimum timestamp of the force batch data, empty when non forced batch + * @param smtProofRollupExitRoots Smt proof + * @param globalIndex Index of the leaf + * @param mainnetExitRoot Mainnet exit root + * @param rollupExitRoot Rollup exit root + * @param originNetwork Origin network + * @param originAddress Origin address + * param destinationNetwork Network destination + * @param destinationAddress Address destination + * @param amount message value + * @param metadata Abi encoded metadata if any, empty otherwise + * @param isMessage Bool indicating if it's a message */ - struct BatchData { - bytes transactions; - bytes32 globalExitRoot; - uint64 timestamp; - uint64 minForcedTimestamp; + struct CompressClaimCallData { + bytes32[32] smtProofLocalExitRoot; + uint256 globalIndex; + uint32 originNetwork; + address originAddress; + address destinationAddress; + uint256 amount; + bytes metadata; + bool isMessage; } /** @@ -113,49 +122,36 @@ contract ClaimCompressor { /** * @notice Foward all the claim parameters to compress them inside the contrat - * @param smtProofLocalExitRoots Smt proof - * @param smtProofRollupExitRoots Smt proof - * @param globalIndex Index of the leaf + * @param smtProofRollupExitRoot Smt proof * @param mainnetExitRoot Mainnet exit root * @param rollupExitRoot Rollup exit root - * @param originNetwork Origin network - * @param originAddress Origin address - * param destinationNetwork Network destination - * @param destinationAddress Address destination - * @param amount message value - * @param metadata Abi encoded metadata if any, empty otherwise - * @param isMessage Bool indicating if it's a message - */ + * @param compressClaimCalldata compress claim calldata + **/ function compressClaimCall( - bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoots, + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, - bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH][] calldata smtProofLocalExitRoots, // struct - uint256[] calldata globalIndex, - uint32[] calldata originNetwork, - address[] calldata originAddress, - address[] calldata destinationAddress, - uint256[] calldata amount, - bytes[] calldata metadata, - bool[] calldata isMessage + CompressClaimCallData[] calldata compressClaimCalldata ) external pure returns (bytes memory) { // common parameters for all the claims bytes memory totalCompressedClaim = abi.encodePacked( - smtProofLocalExitRoots[0], - smtProofRollupExitRoots, // coudl be encoded like (uint8 len, first len []) + compressClaimCalldata[0].smtProofLocalExitRoot, + smtProofRollupExitRoot, // coudl be encoded like (uint8 len, first len []) mainnetExitRoot, rollupExitRoot ); // If the memory cost goes crazy, might need to do it in assembly D: - for (uint256 i = 0; i < isMessage.length; i++) { + for (uint256 i = 0; i < compressClaimCalldata.length; i++) { // Byte array that will be returned - + CompressClaimCallData + memory currentCompressClaimCalldata = compressClaimCalldata[i]; // compare smt proof against the first one uint256 lastDifferentLevel = 0; for (uint256 j = 0; j < _DEPOSIT_CONTRACT_TREE_DEPTH; j++) { if ( - smtProofLocalExitRoots[i][j] != smtProofLocalExitRoots[0][j] + currentCompressClaimCalldata.smtProofLocalExitRoot[j] != + compressClaimCalldata[0].smtProofLocalExitRoot[j] ) { lastDifferentLevel = j; } @@ -166,26 +162,26 @@ contract ClaimCompressor { for (uint256 j = 0; j < lastDifferentLevel; j++) { smtProofCompressed = abi.encodePacked( smtProofCompressed, - smtProofLocalExitRoots[0][i] + currentCompressClaimCalldata.smtProofLocalExitRoot[i] ); } bytes memory compressedClaimCall = abi.encodePacked( - uint8(isMessage[i] ? 1 : 0), // define byte with all small values TODO + uint8(currentCompressClaimCalldata.isMessage ? 1 : 0), // define byte with all small values TODO uint8(lastDifferentLevel), smtProofCompressed, - uint8(globalIndex[i] >> 64), // define byte with all small values TODO - //bool(globalIndex[i] & _GLOBAL_INDEX_MAINNET_FLAG != 0), // get isMainnet bool - uint64(globalIndex[i]), + uint8(currentCompressClaimCalldata.globalIndex >> 64), // define byte with all small values TODO + //bool(globalIndex & _GLOBAL_INDEX_MAINNET_FLAG != 0), // get isMainnet bool + uint64(currentCompressClaimCalldata.globalIndex), // mainnetExitRoot, // rollupExitRoot, - originNetwork[i], - originAddress[i], + currentCompressClaimCalldata.originNetwork, + currentCompressClaimCalldata.originAddress, // destinationNetwork - destinationAddress[i], - amount[i], // could compress to 128 bits - uint32(metadata[i].length), - metadata[i] + currentCompressClaimCalldata.destinationAddress, + currentCompressClaimCalldata.amount, // could compress to 128 bits + uint32(currentCompressClaimCalldata.metadata.length), + currentCompressClaimCalldata.metadata ); // Accumulate all claim calls @@ -201,7 +197,7 @@ contract ClaimCompressor { // Starts with the common parameters for all the claims: // smtProofLocalExitRoots bytes32[32] - // smtProofRollupExitRoots bytes32[32] + // smtProofRollupExitRoot bytes32[32] // mainnetExitRoot bytes32 // rollupExitRoot bytes32 @@ -209,13 +205,13 @@ contract ClaimCompressor { uint256 destinationNetwork = _networkID; address bridgeAddress = _bridgeAddress; - bytes32 claimAssetSignature = _CLAIM_ASSET_SIGNATURE; - bytes32 claimMessageSignature = _CLAIM_MESSAGE_SIGNATURE; + uint256 claimAssetSignature = uint32(_CLAIM_ASSET_SIGNATURE); + uint256 claimMessageSignature = uint32(_CLAIM_MESSAGE_SIGNATURE); // no need to be memory-safe, since the rest of the function will happen on assembly ¿? - assembly ("memory-safe") { + assembly { // Get the last free memory pointer ( i might use 0 aswell) - let freeMemPointer := mload(0x40) + // let freeMemPointer := mload(0x40) // no need to reserve memory since the rest of the funcion will happen on assembly let compressedClaimCallsOffset := compressedClaimCalls.offset diff --git a/hardhat.config.ts b/hardhat.config.ts index 43062876b..42b6c9a73 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -134,7 +134,7 @@ const config: HardhatUserConfig = { runs: 999999, }, evmVersion: "shanghai", - viaIR: true, + //viaIR: true, }, }, }, diff --git a/test/contractsv2/ClaimCompressor.test.ts b/test/contractsv2/ClaimCompressor.test.ts index 04624eb57..394e386b1 100644 --- a/test/contractsv2/ClaimCompressor.test.ts +++ b/test/contractsv2/ClaimCompressor.test.ts @@ -137,19 +137,25 @@ describe("PolygonZkEVMBridge Contract", () => { const metadatas = [metadata]; const isMessage = [false]; + const sequenceForced = { + smtProofLocalExitRoot: proofLocal, + globalIndex: index, + originNetwork: originNetwork, + originAddress: tokenAddress, + destinationAddress: destinationAddress, + amount: amount, + metadata: metadata, + isMessage: false, + } as any; + + console.log(proofs[0], mainnetExitRoot, ethers.ZeroHash, [sequenceForced]); const compressedMultipleBytes = await claimCompressor.compressClaimCall( proofs[0], mainnetExitRoot, ethers.ZeroHash, - proofs, - indexes, - originNetworks, - tokenAddresses, - destinationAddresses, - amounts, - metadatas, - isMessage + [sequenceForced] ); + console.log({compressedMultipleBytes}); const receipt = await (await claimCompressor.decompressClaimCall(compressedMultipleBytes)).wait(); From c25913acaa5ebc5dae8d27974b46aa6722785925 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Sat, 3 Feb 2024 03:19:08 +0100 Subject: [PATCH 204/230] first try :D --- contracts/v2/utils/ClaimCompressor.sol | 53 ++++++--- test/contractsv2/ClaimCompressor.test.ts | 133 ++++++++++++----------- 2 files changed, 102 insertions(+), 84 deletions(-) diff --git a/contracts/v2/utils/ClaimCompressor.sol b/contracts/v2/utils/ClaimCompressor.sol index 3b51111bd..4e95a0395 100644 --- a/contracts/v2/utils/ClaimCompressor.sol +++ b/contracts/v2/utils/ClaimCompressor.sol @@ -30,12 +30,13 @@ contract ClaimCompressor { PolygonZkEVMBridgeV2.claimMessage.selector; // Bytes that will be added to the snark input for every rollup aggregated + // 4 bytes signature // 32*32 bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofLocalExitRoot // 32*32 bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot // 32*8 Rest constant parameters - // 32 bytes position, 32 bytes length, + length bytes = 32*32*2 + 32*8 + 32*2 + length metadata = totalLen + // 32 bytes position, 32 bytes length, + length bytes = 4 + 32*32*2 + 32*8 + 32*2 + length metadata = totalLen uint256 internal constant _CONSTANT_BYTES_PER_CLAIM = - 32 * 32 * 2 + 8 * 32 + 32 * 2; + 4 + 32 * 32 * 2 + 8 * 32 + 32 * 2; // Bytes len of arrays of 32 positions, of 32 bytes bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] uint256 internal constant _BYTE_LEN_CONSTANT_ARRAYS = 32 * 32; @@ -259,6 +260,13 @@ contract ClaimCompressor { // Write the constant parameters for all claims in this call + // Copy smtProofLocalExitRoot + calldatacopy( + 4, // Memory offset, signature = 4 bytes + compressedClaimCallsOffset, // calldata offset + _BYTE_LEN_CONSTANT_ARRAYS // Copy smtProofRollupExitRoot len + ) + // Copy smtProofRollupExitRoot calldatacopy( add(4, _BYTE_LEN_CONSTANT_ARRAYS), // Memory offset, signature + smtProofLocalExitRoot = 32 * 32 bytes + 4 bytes @@ -298,11 +306,17 @@ contract ClaimCompressor { // smtProofRollupExitRoots, // mainnetExitRoot, // rollupExitRoot - let currentCalldataPointer := _CONSTANT_VARIABLES_LENGTH + let currentCalldataPointer := add( + compressedClaimCallsOffset, + _CONSTANT_VARIABLES_LENGTH + ) for { // initialization block, empty - } lt(currentCalldataPointer, compressedClaimCallsLen) { + } lt( + currentCalldataPointer, + add(compressedClaimCallsOffset, compressedClaimCallsLen) + ) { // after iteration block, empty } { // loop block, non empty ;) @@ -311,16 +325,16 @@ contract ClaimCompressor { switch shr(248, calldataload(currentCalldataPointer)) case 0 { // Write asset signature - mstore8(0, claimAssetSignature) - mstore8(1, shr(1, claimAssetSignature)) - mstore8(2, shr(2, claimAssetSignature)) - mstore8(3, shr(3, claimAssetSignature)) + mstore8(3, claimAssetSignature) + mstore8(2, shr(8, claimAssetSignature)) + mstore8(1, shr(16, claimAssetSignature)) + mstore8(0, shr(24, claimAssetSignature)) } case 1 { - mstore8(0, claimMessageSignature) - mstore8(1, shr(1, claimMessageSignature)) - mstore8(2, shr(2, claimMessageSignature)) - mstore8(3, shr(3, claimMessageSignature)) + mstore8(3, claimMessageSignature) + mstore8(2, shr(8, claimMessageSignature)) + mstore8(1, shr(16, claimMessageSignature)) + mstore8(0, shr(24, claimMessageSignature)) } // Add 1 byte of isMessage TODO @@ -374,7 +388,7 @@ contract ClaimCompressor { // Copy the next 64 bytes for the uint64(globalIndex[i]), calldatacopy( - add(memPointer, 23), // 24 bytes globalIndex Offset + add(memPointer, 24), // 24 bytes globalIndex Offset currentCalldataPointer, // calldata offset 8 // Copy uint64(globalIndex[i]) ) @@ -435,7 +449,7 @@ contract ClaimCompressor { // load metadataLen let metadataLen := shr( - 248, // 256 - 32(uint32(metadata[i].length)) = 224 + 224, // 256 - 32(uint32(metadata[i].length)) = 224 calldataload(currentCalldataPointer) ) @@ -443,7 +457,7 @@ contract ClaimCompressor { currentCalldataPointer := add(currentCalldataPointer, 4) - // mem pointer, add originNetwork(current) + // mem pointer, add metadata len memPointer := add(memPointer, 32) // Write metadata @@ -462,11 +476,14 @@ contract ClaimCompressor { memPointer := add(memPointer, metadataLen) - // clean mem just in case + // clean mem mstore(memPointer, 0) // len args should be a multiple of 32 bytes - metadataLen := add(metadataLen, mod(metadataLen, 32)) + let totalLenCall := add( + _CONSTANT_BYTES_PER_CLAIM, + add(metadataLen, mod(metadataLen, 32)) + ) // SHould i limit the gas TODO or the call let success := call( @@ -474,7 +491,7 @@ contract ClaimCompressor { bridgeAddress, // address 0, // value 0, // args offset - add(_CONSTANT_BYTES_PER_CLAIM, metadataLen), // argsSize + totalLenCall, // argsSize 0, // retOffset 0 // retSize ) diff --git a/test/contractsv2/ClaimCompressor.test.ts b/test/contractsv2/ClaimCompressor.test.ts index 394e386b1..8558c6880 100644 --- a/test/contractsv2/ClaimCompressor.test.ts +++ b/test/contractsv2/ClaimCompressor.test.ts @@ -67,7 +67,7 @@ describe("PolygonZkEVMBridge Contract", () => { const originNetwork = networkIDMainnet; const tokenAddress = ethers.hexlify(ethers.randomBytes(20)); const amount = ethers.parseEther("10"); - const destinationNetwork = networkIDMainnet; + const destinationNetwork = networkID; const destinationAddress = acc1.address; const metadata = metadataToken; const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); @@ -95,39 +95,6 @@ describe("PolygonZkEVMBridge Contract", () => { const indexRandom = 3; - const encodedCall = BridgeFactory.interface.encodeFunctionData("claimAsset", [ - proofLocal, - proofLocal, - indexRandom, - mainnetExitRoot, - ethers.ZeroHash, - originNetwork, - tokenAddress, - destinationNetwork, - destinationAddress, - amount, - metadata, - ]); - - const newWallet = ethers.HDNodeWallet.fromMnemonic( - ethers.Mnemonic.fromPhrase("test test test test test test test test test test test junk"), - `m/44'/60'/0'/0/0` - ); - - const tx = { - data: encodedCall, - to: bridge.address, - nonce: 1, - gasLimit: 200000, - gasPrice: ethers.parseUnits("10", "gwei"), - chainId: 5, - }; - - const txSigned = await newWallet.signTransaction(tx); - - // Get claim tx bytes calldata - const customSignedTx = processorUtils.rawTxToCustomRawTx(txSigned); - const proofs = [proofLocal]; const indexes = [index]; const originNetworks = [originNetwork]; @@ -139,7 +106,7 @@ describe("PolygonZkEVMBridge Contract", () => { const sequenceForced = { smtProofLocalExitRoot: proofLocal, - globalIndex: index, + globalIndex: indexRandom, originNetwork: originNetwork, originAddress: tokenAddress, destinationAddress: destinationAddress, @@ -148,24 +115,40 @@ describe("PolygonZkEVMBridge Contract", () => { isMessage: false, } as any; - console.log(proofs[0], mainnetExitRoot, ethers.ZeroHash, [sequenceForced]); + const encodedCall = BridgeFactory.interface.encodeFunctionData("claimAsset", [ + proofLocal, + proofLocal, + indexRandom, + mainnetExitRoot, + ethers.ZeroHash, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata, + ]); + + //console.log(proofs[0], mainnetExitRoot, ethers.ZeroHash, [sequenceForced]); const compressedMultipleBytes = await claimCompressor.compressClaimCall( proofs[0], mainnetExitRoot, ethers.ZeroHash, [sequenceForced] ); - console.log({compressedMultipleBytes}); + //console.log({compressedMultipleBytes}); + //console.log(await claimCompressor.decompressClaimCall(compressedMultipleBytes)); const receipt = await (await claimCompressor.decompressClaimCall(compressedMultipleBytes)).wait(); for (const log of receipt?.logs) { const parsedLog = bridgeReceiverMock.interface.parseLog(log); - console.log({parsedLog}); + //console.log({parsedLog}); + expect(parsedLog?.args[0]).to.be.equal(encodedCall); } await expect(claimCompressor.decompressClaimCall(compressedMultipleBytes)) .to.emit(bridgeReceiverMock, "FallbackEvent") - .withArgs("0x"); + .withArgs(encodedCall); // .to.emit(bridgeReceiverMock, "ClaimAsset") // .withArgs( // proofs[0], @@ -181,13 +164,14 @@ describe("PolygonZkEVMBridge Contract", () => { // isMessage[0] // ); }); + it("should check Compression", async () => { const BridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); const originNetwork = networkIDMainnet; const tokenAddress = ethers.hexlify(ethers.randomBytes(20)); const amount = ethers.parseEther("10"); - const destinationNetwork = networkIDMainnet; + const destinationNetwork = networkID; const destinationAddress = acc1.address; const metadata = metadataToken; const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); @@ -249,44 +233,60 @@ describe("PolygonZkEVMBridge Contract", () => { const customSignedTx = processorUtils.rawTxToCustomRawTx(txSigned); // Compute calldatas - for (let i = 1; i < 0; i++) { - const proofs = [] as any; - const indexes = [] as any; - const originNetworks = []; - const tokenAddresses = []; - const destinationAddresses = []; - const amounts = []; - const metadatas = []; - const isMessage = []; + for (let i = 1; i < 20; i++) { + const sequenceForcedStructs = [] as any; for (let j = 0; j < i; j++) { const index = i; const proofLocal = merkleTreeLocal.getProofTreeByIndex(i); - proofs.push(proofLocal); - indexes.push(index); - originNetworks.push(originNetwork); - tokenAddresses.push(tokenAddress); - destinationAddresses.push(destinationAddress); - amounts.push(amount); - metadatas.push(metadata); - isMessage.push(false); + const sequenceForced = { + smtProofLocalExitRoot: proofLocal, + globalIndex: index, + originNetwork: originNetwork, + originAddress: tokenAddress, + destinationAddress: destinationAddress, + amount: amount, + metadata: metadata, + isMessage: false, + } as any; + + sequenceForcedStructs.push(sequenceForced); } const compressedMultipleBytes = await claimCompressor.compressClaimCall( - proofs[0], + proofLocal, mainnetExitRoot, ethers.ZeroHash, - proofs, - indexes, - originNetworks, - tokenAddresses, - destinationAddresses, - amounts, - metadatas, - isMessage + sequenceForcedStructs ); + // ASsert correctness + const receipt = await (await claimCompressor.decompressClaimCall(compressedMultipleBytes)).wait(); + for (let k = 0; k < receipt?.logs.length; k++) { + const currentLog = receipt?.logs[k]; + const currenSequenceForcedStructs = sequenceForcedStructs[k]; + + const decodeFunctionName = currenSequenceForcedStructs.isMessage ? "claimMessage" : "claimAsset"; + + const encodedCall = BridgeFactory.interface.encodeFunctionData(decodeFunctionName, [ + currenSequenceForcedStructs.smtProofLocalExitRoot, + proofLocal, + currenSequenceForcedStructs.globalIndex, + mainnetExitRoot, + ethers.ZeroHash, + currenSequenceForcedStructs.originNetwork, + currenSequenceForcedStructs.originAddress, + destinationNetwork, // constant + currenSequenceForcedStructs.destinationAddress, + currenSequenceForcedStructs.amount, + currenSequenceForcedStructs.metadata, + ]); + + const parsedLog = bridgeReceiverMock.interface.parseLog(currentLog); + expect(parsedLog?.args[0]).to.be.equal(encodedCall); + } + const txCompressedMultiple = { data: compressedMultipleBytes, to: bridge.address, @@ -304,6 +304,7 @@ describe("PolygonZkEVMBridge Contract", () => { console.log({ numClaims: i, + gasUsed: receipt?.gasUsed, dataClaimCall: encodedCall.length * i, dataCompressedCall: compressedMultipleBytes.length, ratioData: compressedMultipleBytes.length / (encodedCall.length * i), From 11a02d499eacb9a14943e6ddfed366db4293fca6 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Sat, 3 Feb 2024 22:58:00 +0100 Subject: [PATCH 205/230] it wooorks --- contracts/v2/mocks/BridgeReceiverMock.sol | 4 +- contracts/v2/utils/ClaimCompressor.sol | 16 +- package-lock.json | 4 +- test/contractsv2/ClaimCompressor.test.ts | 208 +++++++++++++--------- 4 files changed, 138 insertions(+), 94 deletions(-) diff --git a/contracts/v2/mocks/BridgeReceiverMock.sol b/contracts/v2/mocks/BridgeReceiverMock.sol index cf1954fa3..11364419b 100644 --- a/contracts/v2/mocks/BridgeReceiverMock.sol +++ b/contracts/v2/mocks/BridgeReceiverMock.sol @@ -65,7 +65,7 @@ contract BridgeReceiverMock { * @param amount Amount of tokens * @param metadata Abi encoded metadata if any, empty otherwise */ - function claimAssetAA( + function claimAsset( bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofLocalExitRoot, bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot, uint256 globalIndex, @@ -116,7 +116,7 @@ contract BridgeReceiverMock { * @param amount message value * @param metadata Abi encoded metadata if any, empty otherwise */ - function claimMessageBB( + function claimMessage( bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofLocalExitRoot, bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot, uint256 globalIndex, diff --git a/contracts/v2/utils/ClaimCompressor.sol b/contracts/v2/utils/ClaimCompressor.sol index 4e95a0395..9d01a5a5f 100644 --- a/contracts/v2/utils/ClaimCompressor.sol +++ b/contracts/v2/utils/ClaimCompressor.sol @@ -154,7 +154,7 @@ contract ClaimCompressor { currentCompressClaimCalldata.smtProofLocalExitRoot[j] != compressClaimCalldata[0].smtProofLocalExitRoot[j] ) { - lastDifferentLevel = j; + lastDifferentLevel = j + 1; } } @@ -163,7 +163,7 @@ contract ClaimCompressor { for (uint256 j = 0; j < lastDifferentLevel; j++) { smtProofCompressed = abi.encodePacked( smtProofCompressed, - currentCompressClaimCalldata.smtProofLocalExitRoot[i] + currentCompressClaimCalldata.smtProofLocalExitRoot[j] ); } @@ -324,6 +324,7 @@ contract ClaimCompressor { // Read uint8 isMessageBool switch shr(248, calldataload(currentCalldataPointer)) case 0 { + // TODO optimization // Write asset signature mstore8(3, claimAssetSignature) mstore8(2, shr(8, claimAssetSignature)) @@ -482,10 +483,10 @@ contract ClaimCompressor { // len args should be a multiple of 32 bytes let totalLenCall := add( _CONSTANT_BYTES_PER_CLAIM, - add(metadataLen, mod(metadataLen, 32)) + add(metadataLen, mod(sub(32, mod(metadataLen, 32)), 32)) ) - // SHould i limit the gas TODO or the call + // SHould i limit the gas TODO of the call let success := call( gas(), // gas bridgeAddress, // address @@ -495,6 +496,13 @@ contract ClaimCompressor { 0, // retOffset 0 // retSize ) + + // Reset smtProofLocalExitRoot + calldatacopy( + 4, // Memory offset = 4 bytes + compressedClaimCallsOffset, // calldata offset + smtProofBytesToCopy // Copy smtProofBytesToCopy len + ) } } } diff --git a/package-lock.json b/package-lock.json index 8d7f98dd7..2fc51a05d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@0xpolygonhermez/zkevm-contracts", - "version": "2.0.0", + "version": "3.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@0xpolygonhermez/zkevm-contracts", - "version": "2.0.0", + "version": "3.0.0", "license": "pending", "devDependencies": { "@0xpolygonhermez/zkevm-commonjs": "github:0xPolygonHermez/zkevm-commonjs#main", diff --git a/test/contractsv2/ClaimCompressor.test.ts b/test/contractsv2/ClaimCompressor.test.ts index 8558c6880..3d5cfebe2 100644 --- a/test/contractsv2/ClaimCompressor.test.ts +++ b/test/contractsv2/ClaimCompressor.test.ts @@ -61,108 +61,126 @@ describe("PolygonZkEVMBridge Contract", () => { await claimCompressor.waitForDeployment(); }); - it("should check it works", async () => { + it("should check random values", async () => { const BridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); - const originNetwork = networkIDMainnet; - const tokenAddress = ethers.hexlify(ethers.randomBytes(20)); - const amount = ethers.parseEther("10"); - const destinationNetwork = networkID; - const destinationAddress = acc1.address; - const metadata = metadataToken; - const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); - // compute root merkle tree in Js const height = 32; const merkleTreeLocal = new MerkleTreeBridge(height); - const leafValue = getLeafValue( - LEAF_TYPE_ASSET, - originNetwork, - tokenAddress, - destinationNetwork, - destinationAddress, - amount, - metadataHash - ); - for (let i = 0; i < 8; i++) { + + const totalLeafsMerkleTree = 20; + + const leafs = []; + for (let i = 0; i < totalLeafsMerkleTree; i++) { + // Create a random merkle tree + const originNetwork = ethers.hexlify(ethers.randomBytes(4)); + const tokenAddress = ethers.hexlify(ethers.randomBytes(20)); + const amount = ethers.parseEther("10"); + const destinationNetwork = networkID; // fixed by contract + const destinationAddress = ethers.hexlify(ethers.randomBytes(20)); + const metadata = ethers.hexlify(ethers.randomBytes(Math.floor(Math.random() * 1000))); + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + const leafType = Math.floor(Math.random() * 2); + const leafValue = getLeafValue( + leafType, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); merkleTreeLocal.add(leafValue); + leafs.push({ + leafType, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata, + }); } const mainnetExitRoot = merkleTreeLocal.getRoot(); + const rollupExitRoot = ethers.hexlify(ethers.randomBytes(32)); - const index = 0; - const proofLocal = merkleTreeLocal.getProofTreeByIndex(index); + // Mock rollup root, not necessary now + const randomIndex = 10; + const proofLocal = merkleTreeLocal.getProofTreeByIndex(randomIndex); - const indexRandom = 3; + // Compute calldatas + for (let i = 1; i < totalLeafsMerkleTree; i++) { + const sequenceForcedStructs = [] as any; - const proofs = [proofLocal]; - const indexes = [index]; - const originNetworks = [originNetwork]; - const tokenAddresses = [tokenAddress]; - const destinationAddresses = [destinationAddress]; - const amounts = [amount]; - const metadatas = [metadata]; - const isMessage = [false]; - - const sequenceForced = { - smtProofLocalExitRoot: proofLocal, - globalIndex: indexRandom, - originNetwork: originNetwork, - originAddress: tokenAddress, - destinationAddress: destinationAddress, - amount: amount, - metadata: metadata, - isMessage: false, - } as any; + for (let j = 0; j < i; j++) { + const index = j; + const currentLeaf = leafs[j]; + const proofLocal = merkleTreeLocal.getProofTreeByIndex(j); - const encodedCall = BridgeFactory.interface.encodeFunctionData("claimAsset", [ - proofLocal, - proofLocal, - indexRandom, - mainnetExitRoot, - ethers.ZeroHash, - originNetwork, - tokenAddress, - destinationNetwork, - destinationAddress, - amount, - metadata, - ]); + const sequenceForced = { + smtProofLocalExitRoot: proofLocal, + globalIndex: index, + originNetwork: currentLeaf.originNetwork, + originAddress: currentLeaf.tokenAddress, + destinationAddress: currentLeaf.destinationAddress, + amount: currentLeaf.amount, + metadata: currentLeaf.metadata, + isMessage: currentLeaf.leafType, + } as any; - //console.log(proofs[0], mainnetExitRoot, ethers.ZeroHash, [sequenceForced]); - const compressedMultipleBytes = await claimCompressor.compressClaimCall( - proofs[0], - mainnetExitRoot, - ethers.ZeroHash, - [sequenceForced] - ); - //console.log({compressedMultipleBytes}); + sequenceForcedStructs.push(sequenceForced); + } + + const compressedMultipleBytes = await claimCompressor.compressClaimCall( + proofLocal, + mainnetExitRoot, + rollupExitRoot, + sequenceForcedStructs + ); + + // ASsert correctness + const receipt = await (await claimCompressor.decompressClaimCall(compressedMultipleBytes)).wait(); + for (let k = 0; k < receipt?.logs.length; k++) { + const currentLog = receipt?.logs[k]; + const currenSequenceForcedStructs = sequenceForcedStructs[k]; - //console.log(await claimCompressor.decompressClaimCall(compressedMultipleBytes)); - const receipt = await (await claimCompressor.decompressClaimCall(compressedMultipleBytes)).wait(); + const decodeFunctionName = currenSequenceForcedStructs.isMessage ? "claimMessage" : "claimAsset"; - for (const log of receipt?.logs) { - const parsedLog = bridgeReceiverMock.interface.parseLog(log); - //console.log({parsedLog}); - expect(parsedLog?.args[0]).to.be.equal(encodedCall); + const encodedCall = BridgeFactory.interface.encodeFunctionData(decodeFunctionName, [ + currenSequenceForcedStructs.smtProofLocalExitRoot, + proofLocal, + currenSequenceForcedStructs.globalIndex, + mainnetExitRoot, + rollupExitRoot, + currenSequenceForcedStructs.originNetwork, + currenSequenceForcedStructs.originAddress, + networkID, // constant + currenSequenceForcedStructs.destinationAddress, + currenSequenceForcedStructs.amount, + currenSequenceForcedStructs.metadata, + ]); + + const parsedLog = bridgeReceiverMock.interface.parseLog(currentLog); + expect(parsedLog?.args.smtProofLocalExitRoot).to.be.deep.equal( + currenSequenceForcedStructs.smtProofLocalExitRoot + ); + expect(parsedLog?.args.smtProofRollupExitRoot).to.be.deep.equal(proofLocal); + expect(parsedLog?.args.globalIndex).to.be.equal(currenSequenceForcedStructs.globalIndex); + expect(parsedLog?.args.mainnetExitRoot).to.be.equal(mainnetExitRoot); + expect(parsedLog?.args.rollupExitRoot).to.be.equal(rollupExitRoot); + expect(parsedLog?.args.originNetwork).to.be.equal(currenSequenceForcedStructs.originNetwork); + expect(parsedLog?.args.originTokenAddress.toLowerCase()).to.be.equal( + currenSequenceForcedStructs.originAddress + ); + expect(parsedLog?.args.destinationNetwork).to.be.equal(networkID); + expect(parsedLog?.args.destinationAddress.toLowerCase()).to.be.equal( + currenSequenceForcedStructs.destinationAddress + ); + expect(parsedLog?.args.amount).to.be.equal(currenSequenceForcedStructs.amount); + expect(parsedLog?.args.metadata).to.be.equal(currenSequenceForcedStructs.metadata); + } } - await expect(claimCompressor.decompressClaimCall(compressedMultipleBytes)) - .to.emit(bridgeReceiverMock, "FallbackEvent") - .withArgs(encodedCall); - // .to.emit(bridgeReceiverMock, "ClaimAsset") - // .withArgs( - // proofs[0], - // mainnetExitRoot, - // ethers.ZeroHash, - // proofs[0], - // indexes[0], - // originNetworks[0], - // tokenAddresses[0], - // destinationAddresses[0], - // amounts[0], - // metadatas[0], - // isMessage[0] - // ); }); it("should check Compression", async () => { @@ -284,7 +302,25 @@ describe("PolygonZkEVMBridge Contract", () => { ]); const parsedLog = bridgeReceiverMock.interface.parseLog(currentLog); - expect(parsedLog?.args[0]).to.be.equal(encodedCall); + //expect(parsedLog?.args[0]).to.be.equal(encodedCall); + + expect(parsedLog?.args.smtProofLocalExitRoot).to.be.deep.equal( + currenSequenceForcedStructs.smtProofLocalExitRoot + ); + expect(parsedLog?.args.smtProofRollupExitRoot).to.be.deep.equal(proofLocal); + expect(parsedLog?.args.globalIndex).to.be.equal(currenSequenceForcedStructs.globalIndex); + expect(parsedLog?.args.mainnetExitRoot).to.be.equal(mainnetExitRoot); + expect(parsedLog?.args.rollupExitRoot).to.be.equal(ethers.ZeroHash); + expect(parsedLog?.args.originNetwork).to.be.equal(currenSequenceForcedStructs.originNetwork); + expect(parsedLog?.args.originTokenAddress.toLowerCase()).to.be.equal( + currenSequenceForcedStructs.originAddress + ); + expect(parsedLog?.args.destinationNetwork).to.be.equal(networkID); + expect(parsedLog?.args.destinationAddress.toLowerCase()).to.be.equal( + currenSequenceForcedStructs.destinationAddress.toLowerCase() + ); + expect(parsedLog?.args.amount).to.be.equal(currenSequenceForcedStructs.amount); + expect(parsedLog?.args.metadata).to.be.equal(currenSequenceForcedStructs.metadata); } const txCompressedMultiple = { From 5ceb05b8147ea27bc87c4cb17394ddd7f82b4db5 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 5 Feb 2024 01:59:47 +0100 Subject: [PATCH 206/230] it wworks --- contracts/v2/utils/ClaimCompressor.sol | 137 +++++--------- test/contractsv2/ClaimCompressor.test.ts | 227 ++++++++++++++++++++++- 2 files changed, 269 insertions(+), 95 deletions(-) diff --git a/contracts/v2/utils/ClaimCompressor.sol b/contracts/v2/utils/ClaimCompressor.sol index 9d01a5a5f..86c639669 100644 --- a/contracts/v2/utils/ClaimCompressor.sol +++ b/contracts/v2/utils/ClaimCompressor.sol @@ -11,15 +11,6 @@ pragma solidity 0.8.20; contract ClaimCompressor { uint256 internal constant _DEPOSIT_CONTRACT_TREE_DEPTH = 32; - // Leaf type asset - uint8 private constant _LEAF_TYPE_ASSET = 0; - - // Leaf type message - uint8 private constant _LEAF_TYPE_MESSAGE = 1; - - // Mainnet identifier - uint32 private constant _MAINNET_NETWORK_ID = 0; - // Indicate where's the mainnet flag bit in the global index uint256 private constant _GLOBAL_INDEX_MAINNET_FLAG = 2 ** 64; @@ -54,34 +45,6 @@ contract ClaimCompressor { // 32 bytes position uint256 internal constant _METADATA_OFSSET = 32 * 32 * 2 + 8 * 32 + 32; - // function claimAsset( - // bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofLocalExitRoot, - // bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot, - // uint256 globalIndex, - // bytes32 mainnetExitRoot, - // bytes32 rollupExitRoot, - // uint32 originNetwork, - // address originTokenAddress, - // uint32 destinationNetwork, - // address destinationAddress, - // uint256 amount, - // bytes calldata metadata - // ) - - // function claimMessage( - // bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofLocalExitRoot, - // bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot, - // uint256 globalIndex, - // bytes32 mainnetExitRoot, - // bytes32 rollupExitRoot, - // uint32 originNetwork, - // address originAddress, - // uint32 destinationNetwork, - // address destinationAddress, - // uint256 amount, - // bytes calldata metadata - // ) - // PolygonZkEVMBridge address address private immutable _bridgeAddress; @@ -129,7 +92,7 @@ contract ClaimCompressor { * @param compressClaimCalldata compress claim calldata **/ function compressClaimCall( - bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot, + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot, // TODO remove, is not unique bytes32 mainnetExitRoot, bytes32 rollupExitRoot, CompressClaimCallData[] calldata compressClaimCalldata @@ -172,13 +135,9 @@ contract ClaimCompressor { uint8(lastDifferentLevel), smtProofCompressed, uint8(currentCompressClaimCalldata.globalIndex >> 64), // define byte with all small values TODO - //bool(globalIndex & _GLOBAL_INDEX_MAINNET_FLAG != 0), // get isMainnet bool uint64(currentCompressClaimCalldata.globalIndex), - // mainnetExitRoot, - // rollupExitRoot, currentCompressClaimCalldata.originNetwork, currentCompressClaimCalldata.originAddress, - // destinationNetwork currentCompressClaimCalldata.destinationAddress, currentCompressClaimCalldata.amount, // could compress to 128 bits uint32(currentCompressClaimCalldata.metadata.length), @@ -194,14 +153,11 @@ contract ClaimCompressor { return totalCompressedClaim; } - function decompressClaimCall(bytes calldata compressedClaimCalls) external { - // Starts with the common parameters for all the claims: - - // smtProofLocalExitRoots bytes32[32] - // smtProofRollupExitRoot bytes32[32] - // mainnetExitRoot bytes32 - // rollupExitRoot bytes32 - + function sendCompressedClaims( + bytes calldata compressedClaimCalls + ) external { + // TODO first rollupExitRoot, instead of zeroes, could be zero hashes + // Codecopy?¿ // Load "dynamic" constant and immutables since are not accesible from assembly uint256 destinationNetwork = _networkID; address bridgeAddress = _bridgeAddress; @@ -209,31 +165,15 @@ contract ClaimCompressor { uint256 claimAssetSignature = uint32(_CLAIM_ASSET_SIGNATURE); uint256 claimMessageSignature = uint32(_CLAIM_MESSAGE_SIGNATURE); - // no need to be memory-safe, since the rest of the function will happen on assembly ¿? + // no need to be memory-safe, since the rest of the function will happen on assembly assembly { - // Get the last free memory pointer ( i might use 0 aswell) + // Get the last free memory pointer // let freeMemPointer := mload(0x40) - // no need to reserve memory since the rest of the funcion will happen on assembly + let compressedClaimCallsOffset := compressedClaimCalls.offset let compressedClaimCallsLen := compressedClaimCalls.length - // THe final calldata should be something like: - // Calldata claimMessage /claimAsset - // function claimMessage( - // bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofLocalExitRoot, - // bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot, --> constant - // uint256 globalIndex, - // bytes32 mainnetExitRoot, --> constant - // bytes32 rollupExitRoot, --> constant - // uint32 originNetwork, - // address originAddress, - // uint32 destinationNetwork, --> constant - // address destinationAddress, - // uint256 amount, - // bytes calldata metadata - // ) - // Encoded compressed Data: // Constant parameters: @@ -243,19 +183,19 @@ contract ClaimCompressor { // mainnetExitRoot, // rollupExitRoot - // Parameters per claim tx + // Parameters per claim tx: // [ - // uint8(isMessage[i] ? 1 : 0), // define byte with all small values TODO - // uint8(lastDifferentLevel), - // smtProofCompressed, - // uint8(globalIndex[i] >> 64), // define byte with all small values TODO - // uint64(globalIndex[i]), - // originNetwork[i], - // originAddress[i], - // destinationAddress[i], - // amount[i], // could compress to 128 bits - // uint32(metadata[i].length), - // metadata[i] + // uint8(currentCompressClaimCalldata.isMessage ? 1 : 0), + // uint8(lastDifferentLevel), + // smtProofCompressed, + // uint8(currentCompressClaimCalldata.globalIndex >> 64), + // uint64(currentCompressClaimCalldata.globalIndex), + // currentCompressClaimCalldata.originNetwork, + // currentCompressClaimCalldata.originAddress, + // currentCompressClaimCalldata.destinationAddress, + // currentCompressClaimCalldata.amount, // could compress to 128 bits + // uint32(currentCompressClaimCalldata.metadata.length), + // currentCompressClaimCalldata.metadata // ] // Write the constant parameters for all claims in this call @@ -288,24 +228,20 @@ contract ClaimCompressor { 32 // Copy rollupExitRoot len ) - // Copy destinationAddress, since is constant, just use mstore + // Copy destinationNetwork // Memory offset, signature + smtProofLocalExitRoot + smtProofRollupExitRoot + // globalIndex + mainnetExitRoot + rollupExitRoot + originNetwork + originAddress = 69 * 32 bytes + 4 bytes mstore(add(4, mul(69, 32)), destinationNetwork) // Copy metadata offset + // Memory offset, signature + smtProofLocalExitRoot + smtProofRollupExitRoot + // globalIndex + mainnetExitRoot + rollupExitRoot + originNetwork + originAddress + //destinationNetwork + destinationAddress + amount = 72 * 32 bytes + 4 bytes mstore(add(4, mul(72, 32)), _METADATA_OFSSET) - // Skip constant parameters - - // smtProofLocalExitRoots[0], - // smtProofRollupExitRoots, - // mainnetExitRoot, - // rollupExitRoot + // Start the calldata pointer after the constant parameters let currentCalldataPointer := add( compressedClaimCallsOffset, _CONSTANT_VARIABLES_LENGTH @@ -321,6 +257,21 @@ contract ClaimCompressor { } { // loop block, non empty ;) + // THe final calldata should be something like: + // function claimMessage/claimAsset( + // bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofLocalExitRoot, + // bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot, --> constant + // uint256 globalIndex, + // bytes32 mainnetExitRoot, --> constant + // bytes32 rollupExitRoot, --> constant + // uint32 originNetwork, + // address originAddress, + // uint32 destinationNetwork, --> constant + // address destinationAddress, + // uint256 amount, + // bytes calldata metadata + // ) + // Read uint8 isMessageBool switch shr(248, calldataload(currentCalldataPointer)) case 0 { @@ -378,16 +329,16 @@ contract ClaimCompressor { // global exit root --> first 23 bytes to 0 // | 191 bits | 1 bit | 32 bits | 32 bits | - // | mainnetFlag | rollupIndex | localRootIndex | + // | 0 | mainnetFlag | rollupIndex | localRootIndex | mstore8( add(memPointer, 23), // 23 bytes globalIndex Offset - shr(255, calldataload(currentCalldataPointer)) + shr(248, calldataload(currentCalldataPointer)) // 256 - 8(lastDifferentLevel) = 248 ) - // Add 1 bytes of uint8(globalIndex[i] >> 64 + // Add 1 bytes of uint8(globalIndex[i] >> 64) currentCalldataPointer := add(currentCalldataPointer, 1) - // Copy the next 64 bytes for the uint64(globalIndex[i]), + // Copy the next 64 bits for the uint64(globalIndex[i]), calldatacopy( add(memPointer, 24), // 24 bytes globalIndex Offset currentCalldataPointer, // calldata offset @@ -480,7 +431,7 @@ contract ClaimCompressor { // clean mem mstore(memPointer, 0) - // len args should be a multiple of 32 bytes + // metadata len should be a multiple of 32 bytes let totalLenCall := add( _CONSTANT_BYTES_PER_CLAIM, add(metadataLen, mod(sub(32, mod(metadataLen, 32)), 32)) diff --git a/test/contractsv2/ClaimCompressor.test.ts b/test/contractsv2/ClaimCompressor.test.ts index 3d5cfebe2..0772e5177 100644 --- a/test/contractsv2/ClaimCompressor.test.ts +++ b/test/contractsv2/ClaimCompressor.test.ts @@ -18,12 +18,17 @@ const {calculateSnarkInput, calculateAccInputHash, calculateBatchHashData} = con const MerkleTreeBridge = MTBridge; const {verifyMerkleProof, getLeafValue} = mtBridgeUtils; import {MemDB, ZkEVMDB, getPoseidon, smtUtils, processorUtils} from "@0xpolygonhermez/zkevm-commonjs"; +import {deploy} from "@openzeppelin/hardhat-upgrades/dist/utils"; +import {parse} from "yargs"; describe("PolygonZkEVMBridge Contract", () => { upgrades.silenceWarnings(); let claimCompressor: ClaimCompressor; let bridgeReceiverMock: BridgeReceiverMock; + let polygonZkEVMBridgeContract: PolygonZkEVMBridgeV2; + let polTokenContract: ERC20PermitMock; + let polygonZkEVMGlobalExitRoot: PolygonZkEVMGlobalExitRoot; const networkID = 1; @@ -59,6 +64,39 @@ describe("PolygonZkEVMBridge Contract", () => { const ClaimCompressorFactory = await ethers.getContractFactory("ClaimCompressor"); claimCompressor = await ClaimCompressorFactory.deploy(bridgeReceiverMock.target, networkID); await claimCompressor.waitForDeployment(); + + // Deploy bridge contracts + // deploy PolygonZkEVMBridge + const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + polygonZkEVMBridgeContract = (await upgrades.deployProxy(polygonZkEVMBridgeFactory, [], { + initializer: false, + unsafeAllow: ["constructor"], + })) as unknown as PolygonZkEVMBridgeV2; + + // deploy global exit root manager + const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRoot"); + polygonZkEVMGlobalExitRoot = await PolygonZkEVMGlobalExitRootFactory.deploy( + rollupManager.address, + polygonZkEVMBridgeContract.target + ); + + await polygonZkEVMBridgeContract.initialize( + networkID, + ethers.ZeroAddress, // zero for ether + ethers.ZeroAddress, // zero for ether + polygonZkEVMGlobalExitRoot.target, + rollupManager.address, + "0x" + ); + + // deploy token + const maticTokenFactory = await ethers.getContractFactory("ERC20PermitMock"); + polTokenContract = await maticTokenFactory.deploy( + tokenName, + tokenSymbol, + deployer.address, + tokenInitialBalance + ); }); it("should check random values", async () => { @@ -140,7 +178,7 @@ describe("PolygonZkEVMBridge Contract", () => { ); // ASsert correctness - const receipt = await (await claimCompressor.decompressClaimCall(compressedMultipleBytes)).wait(); + const receipt = await (await claimCompressor.sendCompressedClaims(compressedMultipleBytes)).wait(); for (let k = 0; k < receipt?.logs.length; k++) { const currentLog = receipt?.logs[k]; const currenSequenceForcedStructs = sequenceForcedStructs[k]; @@ -183,6 +221,178 @@ describe("PolygonZkEVMBridge Contract", () => { } }); + it("should test against bridge", async () => { + const BridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); + + const ClaimCompressorFactory = await ethers.getContractFactory("ClaimCompressor"); + const realClaimCompressor = await ClaimCompressorFactory.deploy(polygonZkEVMBridgeContract.target, networkID); + await realClaimCompressor.waitForDeployment(); + + // compute root merkle tree in Js + const height = 32; + const merkleTreeLocal = new MerkleTreeBridge(height); + + const totalLeafsMerkleTree = 20; + + const leafs = []; + for (let i = 0; i < totalLeafsMerkleTree; i++) { + // Create a random merkle tree + const leafType = Math.floor(Math.random() * 2); + const originNetwork = ethers.hexlify(ethers.randomBytes(4)); + const tokenAddress = ethers.hexlify(ethers.randomBytes(20)); + const amount = leafType == 0 ? ethers.hexlify(ethers.randomBytes(32)) : 0; + const destinationNetwork = networkID; // fixed by contract + const destinationAddress = ethers.hexlify(ethers.randomBytes(20)); + const metadata = metadataToken; + const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]); + + const leafValue = getLeafValue( + leafType, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadataHash + ); + merkleTreeLocal.add(leafValue); + leafs.push({ + leafType, + originNetwork, + tokenAddress, + destinationNetwork, + destinationAddress, + amount, + metadata, + }); + } + + const rollupExitRoot = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + const mainnetExitRoot = merkleTreeLocal.getRoot(); + + // add rollup Merkle root + await ethers.provider.send("hardhat_impersonateAccount", [polygonZkEVMBridgeContract.target]); + const bridgemoCK = await ethers.getSigner(polygonZkEVMBridgeContract.target as any); + + await expect(polygonZkEVMGlobalExitRoot.connect(bridgemoCK).updateExitRoot(mainnetExitRoot, {gasPrice: 0})) + .to.emit(polygonZkEVMGlobalExitRoot, "UpdateGlobalExitRoot") + .withArgs(mainnetExitRoot, rollupExitRoot); + + // check roots + const rollupExitRootSC = await polygonZkEVMGlobalExitRoot.lastRollupExitRoot(); + expect(rollupExitRootSC).to.be.equal(rollupExitRoot); + const mainnetExitRootSC = await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot(); + expect(mainnetExitRootSC).to.be.equal(mainnetExitRoot); + const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC); + expect(computedGlobalExitRoot).to.be.equal(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()); + + // Merkle proof local + const proofLocalFirst = merkleTreeLocal.getProofTreeByIndex(0); + + const snapshot = await takeSnapshot(); + + // Compute calldatas + for (let i = 1; i < totalLeafsMerkleTree; i++) { + await snapshot.restore(); + + const sequenceForcedStructs = [] as any; + + for (let j = 0; j < i; j++) { + const index = j; + const currentLeaf = leafs[j]; + const proofLocal = merkleTreeLocal.getProofTreeByIndex(j); + + const globalIndex = computeGlobalIndex(index, 0, true); + + const sequenceForced = { + smtProofLocalExitRoot: proofLocal, + globalIndex: globalIndex, + originNetwork: currentLeaf.originNetwork, + originAddress: currentLeaf.tokenAddress, + destinationAddress: currentLeaf.destinationAddress, + amount: currentLeaf.amount, + metadata: currentLeaf.metadata, + isMessage: currentLeaf.leafType, + } as any; + + sequenceForcedStructs.push(sequenceForced); + + if (currentLeaf.leafType == 0) { + await polygonZkEVMBridgeContract.claimAsset.estimateGas( + proofLocal, + proofLocalFirst, + globalIndex, + mainnetExitRoot, + rollupExitRootSC, + currentLeaf.originNetwork, + currentLeaf.tokenAddress, + networkID, + currentLeaf.destinationAddress, + currentLeaf.amount, + currentLeaf.metadata + ); + } else { + await polygonZkEVMBridgeContract.claimMessage.estimateGas( + proofLocal, + proofLocalFirst, + globalIndex, + mainnetExitRoot, + rollupExitRootSC, + currentLeaf.originNetwork, + currentLeaf.tokenAddress, + networkID, + currentLeaf.destinationAddress, + currentLeaf.amount, + currentLeaf.metadata + ); + } + } + + const compressedMultipleBytes = await realClaimCompressor.compressClaimCall( + proofLocalFirst, + mainnetExitRoot, + rollupExitRootSC, + sequenceForcedStructs + ); + + // ASsert correctness + const receipt = await (await realClaimCompressor.sendCompressedClaims(compressedMultipleBytes)).wait(); + + console.log({ + numClaims: i, + gasUsed: receipt?.gasUsed, + }); + + let currentSequenceForcedStructs = 0; + for (let k = 0; k < receipt?.logs.length; k++) { + const currentLog = receipt?.logs[k]; + if (currentLog?.address != polygonZkEVMBridgeContract.target) { + continue; + } else { + const parsedLog = BridgeFactory.interface.parseLog(currentLog); + if (parsedLog.name == "NewWrappedToken") { + continue; + } + } + const currenSequenceForcedStructs = sequenceForcedStructs[currentSequenceForcedStructs]; + + const parsedLog = BridgeFactory.interface.parseLog(currentLog); + + expect(parsedLog?.args.globalIndex).to.be.deep.equal(currenSequenceForcedStructs.globalIndex); + expect(parsedLog?.args.originNetwork).to.be.equal(currenSequenceForcedStructs.originNetwork); + expect(parsedLog?.args.originAddress.toLowerCase()).to.be.equal( + currenSequenceForcedStructs.originAddress + ); + expect(parsedLog?.args.destinationAddress.toLowerCase()).to.be.equal( + currenSequenceForcedStructs.destinationAddress + ); + expect(parsedLog?.args.amount).to.be.equal(currenSequenceForcedStructs.amount); + currentSequenceForcedStructs++; + } + + expect(currentSequenceForcedStructs).to.be.equal(sequenceForcedStructs.length); + } + }).timeout(1000000); it("should check Compression", async () => { const BridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2"); @@ -280,7 +490,7 @@ describe("PolygonZkEVMBridge Contract", () => { ); // ASsert correctness - const receipt = await (await claimCompressor.decompressClaimCall(compressedMultipleBytes)).wait(); + const receipt = await (await claimCompressor.sendCompressedClaims(compressedMultipleBytes)).wait(); for (let k = 0; k < receipt?.logs.length; k++) { const currentLog = receipt?.logs[k]; const currenSequenceForcedStructs = sequenceForcedStructs[k]; @@ -368,3 +578,16 @@ function calculateCallDataCost(calldataBytes: string): number { return totalCost; } + +function calculateGlobalExitRoot(mainnetExitRoot: any, rollupExitRoot: any) { + return ethers.solidityPackedKeccak256(["bytes32", "bytes32"], [mainnetExitRoot, rollupExitRoot]); +} +const _GLOBAL_INDEX_MAINNET_FLAG = 2n ** 64n; + +function computeGlobalIndex(indexLocal: any, indexRollup: any, isMainnet: Boolean) { + if (isMainnet === true) { + return BigInt(indexLocal) + _GLOBAL_INDEX_MAINNET_FLAG; + } else { + return BigInt(indexLocal) + BigInt(indexRollup) * 2n ** 32n; + } +} From d2b9972f0bc99cdabf23dbc2638c4fef091a2313 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 5 Feb 2024 03:38:48 +0100 Subject: [PATCH 207/230] finish --- contracts/v2/utils/ClaimCompressor.sol | 181 ++++++++++++++++------- test/contractsv2/ClaimCompressor.test.ts | 40 +++-- 2 files changed, 157 insertions(+), 64 deletions(-) diff --git a/contracts/v2/utils/ClaimCompressor.sol b/contracts/v2/utils/ClaimCompressor.sol index 86c639669..1d63c462b 100644 --- a/contracts/v2/utils/ClaimCompressor.sol +++ b/contracts/v2/utils/ClaimCompressor.sol @@ -33,11 +33,9 @@ contract ClaimCompressor { uint256 internal constant _BYTE_LEN_CONSTANT_ARRAYS = 32 * 32; // The following parameters are constant in the encoded compressed claim call - // smtProofLocalExitRoots[0], - // smtProofRollupExitRoots, // mainnetExitRoot, // rollupExitRoot - uint256 internal constant _CONSTANT_VARIABLES_LENGTH = 32 * 32 * 2 + 32 * 2; + uint256 internal constant _CONSTANT_VARIABLES_LENGTH = 32 * 2; // 32*32 bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofLocalExitRoot // 32*32 bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot @@ -52,7 +50,8 @@ contract ClaimCompressor { uint32 private immutable _networkID; /** - * @param smtProofRollupExitRoots Smt proof + * @param smtProofLocalExitRoot Smt proof + * @param smtProofRollupExitRoot Smt proof * @param globalIndex Index of the leaf * @param mainnetExitRoot Mainnet exit root * @param rollupExitRoot Rollup exit root @@ -66,6 +65,7 @@ contract ClaimCompressor { */ struct CompressClaimCallData { bytes32[32] smtProofLocalExitRoot; + bytes32[32] smtProofRollupExitRoot; uint256 globalIndex; uint32 originNetwork; address originAddress; @@ -86,54 +86,101 @@ contract ClaimCompressor { /** * @notice Foward all the claim parameters to compress them inside the contrat - * @param smtProofRollupExitRoot Smt proof * @param mainnetExitRoot Mainnet exit root * @param rollupExitRoot Rollup exit root * @param compressClaimCalldata compress claim calldata **/ function compressClaimCall( - bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot, // TODO remove, is not unique bytes32 mainnetExitRoot, bytes32 rollupExitRoot, CompressClaimCallData[] calldata compressClaimCalldata ) external pure returns (bytes memory) { // common parameters for all the claims bytes memory totalCompressedClaim = abi.encodePacked( - compressClaimCalldata[0].smtProofLocalExitRoot, - smtProofRollupExitRoot, // coudl be encoded like (uint8 len, first len []) mainnetExitRoot, rollupExitRoot ); + bool isRollupSmtSet; // If the memory cost goes crazy, might need to do it in assembly D: for (uint256 i = 0; i < compressClaimCalldata.length; i++) { - // Byte array that will be returned CompressClaimCallData memory currentCompressClaimCalldata = compressClaimCalldata[i]; - // compare smt proof against the first one + + // Compute Local Root compressed + + // compare smt proof against the last one uint256 lastDifferentLevel = 0; - for (uint256 j = 0; j < _DEPOSIT_CONTRACT_TREE_DEPTH; j++) { - if ( - currentCompressClaimCalldata.smtProofLocalExitRoot[j] != - compressClaimCalldata[0].smtProofLocalExitRoot[j] - ) { - lastDifferentLevel = j + 1; + if (i == 0) { + // compare against hashes of zeroes, TODO, set hashes zeroes on start + lastDifferentLevel = 32; + } else { + for (uint256 j = 0; j < _DEPOSIT_CONTRACT_TREE_DEPTH; j++) { + if ( + currentCompressClaimCalldata.smtProofLocalExitRoot[j] != + compressClaimCalldata[i - 1].smtProofLocalExitRoot[j] + ) { + lastDifferentLevel = j + 1; + } + } + } + bytes memory currentSmtCompressed = abi.encodePacked( + uint8(lastDifferentLevel) + ); + for (uint256 j = 0; j < lastDifferentLevel; j++) { + currentSmtCompressed = abi.encodePacked( + currentSmtCompressed, + currentCompressClaimCalldata.smtProofLocalExitRoot[j] + ); + } + + // Compute Rollup Root compressed + lastDifferentLevel = 0; + if ( + currentCompressClaimCalldata.smtProofRollupExitRoot[0] != + bytes32(0) + ) { + if (i == 0 || !isRollupSmtSet) { + // compare against hashes of zeroes, TODO + lastDifferentLevel = 32; + } else { + for (uint256 j = 0; j < _DEPOSIT_CONTRACT_TREE_DEPTH; j++) { + if ( + currentCompressClaimCalldata.smtProofRollupExitRoot[ + j + ] != + compressClaimCalldata[i - 1].smtProofRollupExitRoot[ + j + ] + ) { + lastDifferentLevel = j + 1; + } + } } + isRollupSmtSet = true; } - bytes memory smtProofCompressed; + currentSmtCompressed = abi.encodePacked( + currentSmtCompressed, + uint8(lastDifferentLevel) + ); for (uint256 j = 0; j < lastDifferentLevel; j++) { - smtProofCompressed = abi.encodePacked( - smtProofCompressed, - currentCompressClaimCalldata.smtProofLocalExitRoot[j] + currentSmtCompressed = abi.encodePacked( + currentSmtCompressed, + currentCompressClaimCalldata.smtProofRollupExitRoot[j] ); } + // currentSmtCompressed: + // uint8(lastDifferentLevelLocal) + // smtProofCompressedLocal + // uint8(lastDifferentLevelRollup) + // smtProofCompressedRollup + bytes memory compressedClaimCall = abi.encodePacked( uint8(currentCompressClaimCalldata.isMessage ? 1 : 0), // define byte with all small values TODO - uint8(lastDifferentLevel), - smtProofCompressed, + currentSmtCompressed, uint8(currentCompressClaimCalldata.globalIndex >> 64), // define byte with all small values TODO uint64(currentCompressClaimCalldata.globalIndex), currentCompressClaimCalldata.originNetwork, @@ -156,8 +203,8 @@ contract ClaimCompressor { function sendCompressedClaims( bytes calldata compressedClaimCalls ) external { - // TODO first rollupExitRoot, instead of zeroes, could be zero hashes - // Codecopy?¿ + // TODO first rollupExitRoot, instead of zeroes, could be zero hashes, Codecopy?¿ + // Load "dynamic" constant and immutables since are not accesible from assembly uint256 destinationNetwork = _networkID; address bridgeAddress = _bridgeAddress; @@ -178,8 +225,6 @@ contract ClaimCompressor { // Constant parameters: - // smtProofLocalExitRoots[0], - // smtProofRollupExitRoots, // mainnetExitRoot, // rollupExitRoot @@ -187,7 +232,11 @@ contract ClaimCompressor { // [ // uint8(currentCompressClaimCalldata.isMessage ? 1 : 0), // uint8(lastDifferentLevel), - // smtProofCompressed, + // smtProofCompressed: + // uint8(lastDifferentLevelLocal) + // smtProofCompressedLocal + // uint8(lastDifferentLevelRollup) + // smtProofCompressedRollup // uint8(currentCompressClaimCalldata.globalIndex >> 64), // uint64(currentCompressClaimCalldata.globalIndex), // currentCompressClaimCalldata.originNetwork, @@ -200,31 +249,33 @@ contract ClaimCompressor { // Write the constant parameters for all claims in this call - // Copy smtProofLocalExitRoot - calldatacopy( - 4, // Memory offset, signature = 4 bytes - compressedClaimCallsOffset, // calldata offset - _BYTE_LEN_CONSTANT_ARRAYS // Copy smtProofRollupExitRoot len - ) - - // Copy smtProofRollupExitRoot - calldatacopy( - add(4, _BYTE_LEN_CONSTANT_ARRAYS), // Memory offset, signature + smtProofLocalExitRoot = 32 * 32 bytes + 4 bytes - add(compressedClaimCallsOffset, _BYTE_LEN_CONSTANT_ARRAYS), // calldata offset - _BYTE_LEN_CONSTANT_ARRAYS // Copy smtProofRollupExitRoot len - ) + // TODO set both arrays to zero hashes + // Trick to emtpy the memory, copyng calldata out of bounds, + // set smtProofLocalExitRoot to all zeroes + // calldatacopy( + // 4, // Memory offset, signature = 4 bytes + // calldatasize(), // calldata size + // _BYTE_LEN_CONSTANT_ARRAYS // Copy smtProofRollupExitRoot len + // ) + + // // Copy smtProofRollupExitRoot + // calldatacopy( + // add(4, _BYTE_LEN_CONSTANT_ARRAYS), // Memory offset, signature + smtProofLocalExitRoot = 32 * 32 bytes + 4 bytes + // add(compressedClaimCallsOffset, _BYTE_LEN_CONSTANT_ARRAYS), // calldata offset + // _BYTE_LEN_CONSTANT_ARRAYS // Copy smtProofRollupExitRoot len + // ) // Copy mainnetExitRoot calldatacopy( add(4, mul(65, 32)), // Memory offset, signature + smtProofLocalExitRoot + smtProofRollupExitRoot + globalIndex = 65 * 32 bytes + 4 bytes - add(compressedClaimCallsOffset, mul(64, 32)), // calldata offset, smtProofLocalExitRoots[0] + smtProofRollupExitRoots = 64*32 + compressedClaimCallsOffset, // calldata offset 32 // Copy mainnetExitRoot len ) // Copy rollupExitRoot calldatacopy( add(4, mul(66, 32)), // Memory offset, signature + smtProofLocalExitRoot + smtProofRollupExitRoot + globalIndex + mainnetExitRoot = 66 * 32 bytes + 4 bytes - add(compressedClaimCallsOffset, mul(65, 32)), // calldata offset, smtProofLocalExitRoots[0] + smtProofRollupExitRoots + mainnetExitRoot = 65*32 + add(compressedClaimCallsOffset, 32), // calldata offset, mainnetExitRoot = 32 32 // Copy rollupExitRoot len ) @@ -295,20 +346,20 @@ contract ClaimCompressor { // Mem pointer where the current data must be written let memPointer := 4 - // load lastDifferentLevel + // load lastDifferentLevelLocal let smtProofBytesToCopy := mul( shr( - 248, // 256 - 8(lastDifferentLevel) = 248 + 248, // 256 - 8(lastDifferentLevelLocal) = 248 calldataload(currentCalldataPointer) ), 32 ) - // Add 1 byte of lastDifferentLevel + // Add 1 byte of lastDifferentLevelLocal currentCalldataPointer := add(currentCalldataPointer, 1) calldatacopy( - 4, // Memory offset = 4 bytes + memPointer, // Memory offset currentCalldataPointer, // calldata offset smtProofBytesToCopy // Copy smtProofBytesToCopy len ) @@ -318,8 +369,35 @@ contract ClaimCompressor { currentCalldataPointer, smtProofBytesToCopy ) - // mem pointer, add smtProofLocalExitRoot(current) + smtProofRollupExitRoot(constant) - memPointer := add(memPointer, mul(32, 64)) + // mem pointer, add smtProofLocalExitRoot(current) + memPointer := add(memPointer, mul(32, 32)) + + // load lastDifferentLevelRollup + smtProofBytesToCopy := mul( + shr( + 248, // 256 - 8(lastDifferentLevelRollup) = 248 + calldataload(currentCalldataPointer) + ), + 32 + ) + + // Add 1 byte of lastDifferentLevelRollup + currentCalldataPointer := add(currentCalldataPointer, 1) + + calldatacopy( + memPointer, // Memory offset + currentCalldataPointer, // calldata offset + smtProofBytesToCopy // Copy smtProofBytesToCopy len + ) + + // Add smtProofBytesToCopy bits of smtProofCompressed + currentCalldataPointer := add( + currentCalldataPointer, + smtProofBytesToCopy + ) + + // mem pointer, add smtProofRollupExitRoot(current) + memPointer := add(memPointer, mul(32, 32)) // Copy global index // bool(globalIndex[i] & _GLOBAL_INDEX_MAINNET_FLAG != 0), // get isMainnet bool @@ -447,13 +525,6 @@ contract ClaimCompressor { 0, // retOffset 0 // retSize ) - - // Reset smtProofLocalExitRoot - calldatacopy( - 4, // Memory offset = 4 bytes - compressedClaimCallsOffset, // calldata offset - smtProofBytesToCopy // Copy smtProofBytesToCopy len - ) } } } diff --git a/test/contractsv2/ClaimCompressor.test.ts b/test/contractsv2/ClaimCompressor.test.ts index 0772e5177..29c79a0b3 100644 --- a/test/contractsv2/ClaimCompressor.test.ts +++ b/test/contractsv2/ClaimCompressor.test.ts @@ -157,6 +157,7 @@ describe("PolygonZkEVMBridge Contract", () => { const proofLocal = merkleTreeLocal.getProofTreeByIndex(j); const sequenceForced = { + smtProofRollupExitRoot: proofLocal, smtProofLocalExitRoot: proofLocal, globalIndex: index, originNetwork: currentLeaf.originNetwork, @@ -171,7 +172,6 @@ describe("PolygonZkEVMBridge Contract", () => { } const compressedMultipleBytes = await claimCompressor.compressClaimCall( - proofLocal, mainnetExitRoot, rollupExitRoot, sequenceForcedStructs @@ -203,7 +203,9 @@ describe("PolygonZkEVMBridge Contract", () => { expect(parsedLog?.args.smtProofLocalExitRoot).to.be.deep.equal( currenSequenceForcedStructs.smtProofLocalExitRoot ); - expect(parsedLog?.args.smtProofRollupExitRoot).to.be.deep.equal(proofLocal); + expect(parsedLog?.args.smtProofRollupExitRoot).to.be.deep.equal( + currenSequenceForcedStructs.smtProofRollupExitRoot + ); expect(parsedLog?.args.globalIndex).to.be.equal(currenSequenceForcedStructs.globalIndex); expect(parsedLog?.args.mainnetExitRoot).to.be.equal(mainnetExitRoot); expect(parsedLog?.args.rollupExitRoot).to.be.equal(rollupExitRoot); @@ -232,7 +234,7 @@ describe("PolygonZkEVMBridge Contract", () => { const height = 32; const merkleTreeLocal = new MerkleTreeBridge(height); - const totalLeafsMerkleTree = 20; + const totalLeafsMerkleTree = 10; const leafs = []; for (let i = 0; i < totalLeafsMerkleTree; i++) { @@ -305,6 +307,7 @@ describe("PolygonZkEVMBridge Contract", () => { const globalIndex = computeGlobalIndex(index, 0, true); const sequenceForced = { + smtProofRollupExitRoot: proofLocal, smtProofLocalExitRoot: proofLocal, globalIndex: globalIndex, originNetwork: currentLeaf.originNetwork, @@ -349,7 +352,6 @@ describe("PolygonZkEVMBridge Contract", () => { } const compressedMultipleBytes = await realClaimCompressor.compressClaimCall( - proofLocalFirst, mainnetExitRoot, rollupExitRootSC, sequenceForcedStructs @@ -427,9 +429,10 @@ describe("PolygonZkEVMBridge Contract", () => { const indexRandom = 3; + const proofZeroes = new Array(32).fill(ethers.ZeroHash); const encodedCall = BridgeFactory.interface.encodeFunctionData("claimAsset", [ proofLocal, - proofLocal, + proofZeroes, indexRandom, mainnetExitRoot, ethers.ZeroHash, @@ -470,6 +473,7 @@ describe("PolygonZkEVMBridge Contract", () => { const sequenceForced = { smtProofLocalExitRoot: proofLocal, + smtProofRollupExitRoot: proofZeroes, globalIndex: index, originNetwork: originNetwork, originAddress: tokenAddress, @@ -483,13 +487,14 @@ describe("PolygonZkEVMBridge Contract", () => { } const compressedMultipleBytes = await claimCompressor.compressClaimCall( - proofLocal, mainnetExitRoot, ethers.ZeroHash, sequenceForcedStructs ); // ASsert correctness + let lastSmtRollupCopied = new Array(32).fill(ethers.ZeroHash); // TODO could be set to zero hashes + const receipt = await (await claimCompressor.sendCompressedClaims(compressedMultipleBytes)).wait(); for (let k = 0; k < receipt?.logs.length; k++) { const currentLog = receipt?.logs[k]; @@ -517,7 +522,24 @@ describe("PolygonZkEVMBridge Contract", () => { expect(parsedLog?.args.smtProofLocalExitRoot).to.be.deep.equal( currenSequenceForcedStructs.smtProofLocalExitRoot ); - expect(parsedLog?.args.smtProofRollupExitRoot).to.be.deep.equal(proofLocal); + + let isZeroArray = true; + + for (const element of parsedLog?.args.smtProofRollupExitRoot) { + if (element != ethers.ZeroHash) { + isZeroArray = false; + } + } + + if (isZeroArray) { + expect(parsedLog?.args.smtProofRollupExitRoot).to.be.deep.equal(lastSmtRollupCopied); + } else { + expect(parsedLog?.args.smtProofRollupExitRoot).to.be.deep.equal( + currenSequenceForcedStructs.smtProofRollupExitRoot + ); + lastSmtRollupCopied = currenSequenceForcedStructs.smtProofRollupExitRoot; + } + expect(parsedLog?.args.globalIndex).to.be.equal(currenSequenceForcedStructs.globalIndex); expect(parsedLog?.args.mainnetExitRoot).to.be.equal(mainnetExitRoot); expect(parsedLog?.args.rollupExitRoot).to.be.equal(ethers.ZeroHash); @@ -554,9 +576,9 @@ describe("PolygonZkEVMBridge Contract", () => { dataClaimCall: encodedCall.length * i, dataCompressedCall: compressedMultipleBytes.length, ratioData: compressedMultipleBytes.length / (encodedCall.length * i), - dataTotalTxClaimCall: customSignedTx.length * i, + dataTotalTxClaimCall: (customSignedTx.length / 2) * i, costCalldataTxClaimCall: customSignedCost * i, - dataTotalTxCompressedCall: customtxCompressedMultipleSigned.length, + dataTotalTxCompressedCall: customtxCompressedMultipleSigned.length / 2, calldataCostTxCompressed: customCompressedMultipleCost, ratioTxData: customtxCompressedMultipleSigned.length / (customSignedTx.length * i), ratioTxDataCost: customCompressedMultipleCost / (customSignedCost * i), From 585d99c65a32a868c84f5f3c39950e6cb3b76556 Mon Sep 17 00:00:00 2001 From: Xavier Romero Date: Mon, 5 Feb 2024 10:15:37 +0100 Subject: [PATCH 208/230] Improve verifyMainnetProofVerifier.md --- .../verifyMainnetProofVerifier.md | 194 +++++++++++------- 1 file changed, 118 insertions(+), 76 deletions(-) diff --git a/verifyMainnetDeployment/verifyMainnetProofVerifier.md b/verifyMainnetDeployment/verifyMainnetProofVerifier.md index aa76513a4..cb55609dc 100644 --- a/verifyMainnetDeployment/verifyMainnetProofVerifier.md +++ b/verifyMainnetDeployment/verifyMainnetProofVerifier.md @@ -4,48 +4,52 @@ In order to verify the smart contract, you will need a machine with at least 256 In this tutorial we will give instructions for a r6a.8xlarge aws instance. This instance has 16 cores 32 threads, 512GB of SSD. The instance will use Ubuntu 22.04 LTS and the cost of the instance is about 1.82 $/h. This process is quite long, it takes approximately 5-6 hours. -So lets start by launching and instance. +So lets start by launching and instance. ## Basic OS preparation -````bash +```bash sudo apt update -sudo apt install -y tmux git curl -```` +sudo apt install -y tmux git curl jq +``` ## Tweaking the OS to accept high amount of memory. -````bash +```bash echo "vm.max_map_count=655300" | sudo tee -a /etc/sysctl.conf sudo sysctl -w vm.max_map_count=655300 export NODE_OPTIONS="--max-old-space-size=230000" -```` +``` ## Install version of node and npm - -````bash +```bash curl -sL https://deb.nodesource.com/setup_18.x -o nodesource_setup.sh sudo bash nodesource_setup.sh sudo apt install -y nodejs node -v -```` +``` + The version of node should be: 18 (e.g. 18.19.0 ) ## Download and prepare circom + To compile circuits, we need circom installed. -````bash + +```bash cd ~ git clone https://github.com/iden3/circom.git cd circom git checkout v2.1.8 git log --pretty=format:'%H' -n 1 -```` -The hash of the commit should be: f0deda416abe91e5dd906c55507c737cd9986ab5 +``` +The hash of the commit should be: f0deda416abe91e5dd906c55507c737cd9986ab5 Install and compile circom (RUST) -````bash + +```bash +cd ~ sudo apt install -y cargo cd circom cargo build --release @@ -53,13 +57,13 @@ cargo install --path circom export PATH=$PATH:~/.cargo/bin echo 'PATH=$PATH:~/.cargo/bin' >> ~/.profile circom --version -```` -The version of circom should be: 2.1.8 +``` +The version of circom should be: 2.1.8 ## Prepare fast build constant tree tool -````bash +```bash cd ~ git clone https://github.com/0xPolygonHermez/zkevm-prover.git cd zkevm-prover @@ -68,35 +72,43 @@ git submodule init git submodule update sudo apt install -y build-essential libomp-dev libgmp-dev nlohmann-json3-dev libpqxx-dev nasm libgrpc++-dev libprotobuf-dev grpc-proto libsodium-dev uuid-dev libsecp256k1-dev make -j bctree -```` +``` + this step takes less than 1 minute. ## Prepare and launch setup (zkevm-proverjs) -````bash +```bash cd ~ git clone https://github.com/0xPolygonHermez/zkevm-proverjs.git cd zkevm-proverjs git checkout ede545493ca4ab6cbd136dbcc452c7794d01bb08 npm install tmux -c "npm run buildsetup --bctree=../zkevm-prover/build/bctree" -```` +``` + This step is quite long, it takes approximately 4.5 hours. 2 out of 4.5 hours are for the powersOfTau28_hez_final.ptau download, a file of 288GB that it's loaded only once. -> NOTE: At the end of the document there is a table with all the hashes of the files generated during this process. + +> NOTE: At the end of the document there is a table with all the hashes of the files generated during this process. ## Compile generated verifier smartcontract (solidity) -As a final result of the previous steps, the smart contract that verifies the test has been generated. This file is *final.fflonk.verifier.sol*. At this point, it is possible to verify the smart contract using the source code or verify that the bytecode is the same. **To verify the bytecode**, you must compile with the precisely same version, compiler, and parameters to be sure that even the metadata hash contained in the bytecode is exactly the same. The following instructions generate a project to build using the **hardhat** tool. -````bash +As a final result of the previous steps, the smart contract that verifies the test has been generated. This file is _final.fflonk.verifier.sol_. At this point, it is possible to verify the smart contract using the source code or verify that the bytecode is the same. **To verify the bytecode**, you must compile with the precisely same version, compiler, and parameters to be sure that even the metadata hash contained in the bytecode is exactly the same. The following instructions generate a project to build using the **hardhat** tool. + +```bash cd ~ mkdir contract cd contract -npm init -y +npm init -y npm install hardhat mkdir -p contracts/verifiers -```` -To generate the same bycode it's important recover exactlly same options used during compilation, we found this information with contract information on etherscan (Settings). For this smartcode compilation settings are: -```jsonld +``` + +To generate the same bycode it's important recover exactlly same options used during compilation, we found this information with contract information on etherscan (Settings). Copy this information inside the file ~/contract/settings.json, as follows: + +```bash +cd ~/contract +cat <settings.json { "optimizer": { "enabled": true, @@ -117,32 +129,43 @@ To generate the same bycode it's important recover exactlly same options used du }, "libraries": {} } +EOF ``` -Copy this information inside the file ~/contract/settings.json. To do it, use the editor as nano or vi. After that, execute the following commands. -````bash + +After that, execute the following commands. + +```bash cd ~/contract echo -e "module.exports={solidity:{compilers:[{version: \"0.8.20\",settings:$(cat settings.json)}]}}" > hardhat.config.js -```` -Once the project structure is created, we proceed to copy the smart contract generated in the previous step. This smart contract was saved on *~/zkevm-proverjs/build/proof*, and must be copied to *contracts/verifiers* with exactly the name *Verifier.sol*. If the name or the path changes, the hash of metadata changes too, for this reason, is essential to respect the name and the path. To do it could execute these commands -````bash +``` + +Once the project structure is created, we proceed to copy the smart contract generated in the previous step. This smart contract was saved on _~/zkevm-proverjs/build/proof_, and must be copied to _contracts/verifiers_ with exactly the name _Verifier.sol_. If the name or the path changes, the hash of metadata changes too, for this reason, is essential to respect the name and the path. To do it could execute these commands + +```bash cd ~/contract cp ~/zkevm-proverjs/build/proof/final.fflonk.verifier.sol contracts/verifiers/FflonkVerifier.sol sha256sum contracts/verifiers/FflonkVerifier.sol -```` +``` + The result should be: -```` + +``` 8ae7baadd9f2ffb07862b0a74c20e1ad1cc2d4136e416ce5beac82a4e9a44923 -```` +``` + To compile smartcontract execute following command: -````bash + +```bash npx hardhat compile -```` +``` + > NOTE: During compilation warning is shown: > Warning: Unused function parameter. Remove or comment out the variable name to silence this warning. -> --> contracts/verifiers/FflonkVerifier.sol:162:26: +> --> contracts/verifiers/FflonkVerifier.sol:162:26: + +Bytecode of smartcontract was on bytecode property of json file _FflonkVerifier_ generated on path _artifacts/contracts/verifiers/FflonkVerifier.sol/_ -Bytecode of smartcontract was on bytecode property of json file *Verifier.json* generated on path *artifacts/contracts/verifiers/FflonkVerifier.sol* -```` +``` 608060405234801561000f575f80fd5b506159c7 806200001e5f395ff3fe60806040523480156100 0f575f80fd5b5060043610610029575f3560e01c @@ -165,68 +188,87 @@ Bytecode of smartcontract was on bytecode property of json file *Verifier.json* a2646970667358221220761b1f07d5034592f204 cb3439dbfabc28fb771c6e1bc6c8016e3d7b42ad 5a2164736f6c63430008140033 -```` -To extract bytecode on file in one line. If you prefer do it , you cold copy and paste in a file. -````bash -cd ~/contract -grep bytecode artifacts/contracts/verifiers/FflonkVerifier.sol/FflonkVerifier.json |sed 's/.*"\(0x.*\)".*/\1/' > ~/contract/FflonkVerifier.sol.compiled.bytecode -```` -> NOTE: if you prefer you can copy by hand the content of the bytecode of the file *artifacts/contracts/verifiers/FflonkVerifier.sol/FflonkVerifier.json* over files *FflonkVerifier.sol.compiled.bytecode*. Remember to copy only the content inside the double quotes (without double quotes). - -> NOTE: to see bytecode divided by lines could use following commands. -> sed "s/^0x//;s/\([0-9a-f]\{40\}\)/\1\n/g" ~/contract/FflonkVerifier.sol.compiled.bytecode | head -> sed "s/^0x//;s/\([0-9a-f]\{40\}\)/\1\n/g" ~/contract/FflonkVerifier.sol.compiled.bytecode | tail +``` Verify bytecode compiled: -```` -sha256sum ~/contract/FflonkVerifier.sol.compiled.bytecode -```` + +``` +cd ~/contract +cat ./artifacts/contracts/verifiers/FflonkVerifier.sol/FflonkVerifier.json | jq .bytecode -r | tee FflonkVerifier.sol.compiled.bytecode | sha256sum +``` + The result should be: -```` + +``` 34c11f41d424eb821b42630183c4b97dc8689163276ca50095e5918202950703 -```` +``` ## Download bytecode of deployed smartcontract -To download bytecode of deployed smartcontract, need the address of smart contract, in this case it's *0x1C3A3da552b8662CD69538356b1E7c2E9CC1EBD8*. Go to Etherscan or Beaconcha to get transaction bytecode. +To download bytecode of deployed smartcontract, need the address of smart contract, in this case it's _0x1C3A3da552b8662CD69538356b1E7c2E9CC1EBD8_. + +### Download by copying data manually + +Go to Etherscan or Beaconcha to get transaction bytecode. + +Associated with address _0x1C3A3da552b8662CD69538356b1E7c2E9CC1EBD8_ found the transacction _0x2f0ce26dd454211f84df373e7b37be2d683cb71532bc6d0ec63d6fcdbaa4c5e3_. + +- ### Etherscan (https://etherscan.io) -Associated with address *0x1C3A3da552b8662CD69538356b1E7c2E9CC1EBD8* found the transacction *0x2f0ce26dd454211f84df373e7b37be2d683cb71532bc6d0ec63d6fcdbaa4c5e3*. + https://etherscan.io/address/0x1C3A3da552b8662CD69538356b1E7c2E9CC1EBD8 + https://etherscan.io/tx/0x2f0ce26dd454211f84df373e7b37be2d683cb71532bc6d0ec63d6fcdbaa4c5e3 -- ### Etherscan (https://etherscan.io) - https://etherscan.io/address/0x1C3A3da552b8662CD69538356b1E7c2E9CC1EBD8 - https://etherscan.io/tx/0x2f0ce26dd454211f84df373e7b37be2d683cb71532bc6d0ec63d6fcdbaa4c5e3 -Click to see more > Input Data > Select all data and copy to clipboard. + Click to see more > Input Data > Select all data and copy to clipboard. -- ### Beacocha (https://beaconcha.in) - https://beaconcha.in/address/0x1C3A3da552b8662CD69538356b1E7c2E9CC1EBD8 - https://beaconcha.in/tx/0x2f0ce26dd454211f84df373e7b37be2d683cb71532bc6d0ec63d6fcdbaa4c5e3 -Advanced Info > Call Data > Select all data and copy to clipboard. +- ### Beacocha (https://beaconcha.in) + https://beaconcha.in/address/0x1C3A3da552b8662CD69538356b1E7c2E9CC1EBD8 + https://beaconcha.in/tx/0x2f0ce26dd454211f84df373e7b37be2d683cb71532bc6d0ec63d6fcdbaa4c5e3 + Advanced Info > Call Data > Select all data and copy to clipboard. -*NOTE: Don't use button "Copy Raw Data" because it generated non compatible format.* +_NOTE: Don't use button "Copy Raw Data" because it generated non compatible format._ -Some applications running on the terminal may limit the amount of input they will accept before their input buffers overflow. To avoid this situation create file *FflonkVerifier.sol.explorer.bytecode* with editor as nano or vi. +Some applications running on the terminal may limit the amount of input they will accept before their input buffers overflow. To avoid this situation create file _FflonkVerifier.sol.explorer.bytecode_ with editor as nano or vi. -````bash +```bash cd ~/contract nano FflonkVerifier.sol.explorer.bytecode -```` -In nano, to paste the clipboard to the file use CTRL+P, save content using CTRL+X, and finally press Y. To compare if two files are the same, you could use diff. -````bash +``` + +In nano, to paste the clipboard to the file use CTRL+P, save content using CTRL+X, and finally press Y. + +### Download through L1 endpoint call + +```bash +cd ~/contract +L1_ENDPOINT= + curl -s -X POST -H "Content-Type: application/json" --data '{"method":"eth_getTransactionByHash","params":["0x2f0ce26dd454211f84df373e7b37be2d683cb71532bc6d0ec63d6fcdbaa4c5e3"], "id":1,"jsonrpc":"2.0"}' $L1_ENDPOINT | jq .result.input -r > FflonkVerifier.sol.explorer.bytecode +``` + +## Compare bytecodes + +To compare if two files are the same, you could use diff. + +```bash cd ~/contract diff FflonkVerifier.sol.compiled.bytecode FflonkVerifier.sol.explorer.bytecode -```` +``` + Alternatively, you could check content using sha256sum: -````bash + +```bash cd ~/contract sha256sum FflonkVerifier.sol.*.bytecode -```` +``` + The result should be: -```` + +``` 34c11f41d424eb821b42630183c4b97dc8689163276ca50095e5918202950703 FflonkVerifier.sol.compiled.bytecode 34c11f41d424eb821b42630183c4b97dc8689163276ca50095e5918202950703 FflonkVerifier.sol.explorer.bytecode -```` +``` ## Generated files hash + From 5a141524839f8068a7d2b759b36adc870e6c2758 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 5 Feb 2024 12:20:53 +0100 Subject: [PATCH 209/230] TODO --- contracts/v2/utils/ClaimCompressor.sol | 1 + deployment/v2/verifyContracts.js | 39 ++++++++++++-------------- 2 files changed, 19 insertions(+), 21 deletions(-) diff --git a/contracts/v2/utils/ClaimCompressor.sol b/contracts/v2/utils/ClaimCompressor.sol index 1d63c462b..f6dfc47f8 100644 --- a/contracts/v2/utils/ClaimCompressor.sol +++ b/contracts/v2/utils/ClaimCompressor.sol @@ -203,6 +203,7 @@ contract ClaimCompressor { function sendCompressedClaims( bytes calldata compressedClaimCalls ) external { + // TODO get metadata tokens ( max len metadata) // TODO first rollupExitRoot, instead of zeroes, could be zero hashes, Codecopy?¿ // Load "dynamic" constant and immutables since are not accesible from assembly diff --git a/deployment/v2/verifyContracts.js b/deployment/v2/verifyContracts.js index 8c5390ae3..6a583b0f1 100644 --- a/deployment/v2/verifyContracts.js +++ b/deployment/v2/verifyContracts.js @@ -168,7 +168,7 @@ async function main() { // verify zkEVM address or validium - if (createRollupOutputParameters.consensusContract == "PolygonZkEVMEtrog") { + if (createRollupOutputParameters.consensusContract === 'PolygonZkEVMEtrog') { try { await hre.run( 'verify:verify', @@ -186,28 +186,25 @@ async function main() { } catch (error) { // expect(error.message.toLowerCase().includes('proxyadmin')).to.be.equal(true); } - } else { - if(createRollupOutputParameters.consensusContract == "PolygonValidiumEtrog") { - try { - await hre.run( - 'verify:verify', - { - contract: 'contracts/v2/consensus/validium/PolygonValidiumEtrog.sol:PolygonValidiumEtrog', - address: createRollupOutputParameters.rollupAddress, - constructorArguments: [ - deployOutputParameters.polygonZkEVMGlobalExitRootAddress, - deployOutputParameters.polTokenAddress, - deployOutputParameters.polygonZkEVMBridgeAddress, - deployOutputParameters.polygonRollupManager, - ], - }, - ); - } catch (error) { - // expect(error.message.toLowerCase().includes('proxyadmin')).to.be.equal(true); - } + } else if (createRollupOutputParameters.consensusContract === 'PolygonValidiumEtrog') { + try { + await hre.run( + 'verify:verify', + { + contract: 'contracts/v2/consensus/validium/PolygonValidiumEtrog.sol:PolygonValidiumEtrog', + address: createRollupOutputParameters.rollupAddress, + constructorArguments: [ + deployOutputParameters.polygonZkEVMGlobalExitRootAddress, + deployOutputParameters.polTokenAddress, + deployOutputParameters.polygonZkEVMBridgeAddress, + deployOutputParameters.polygonRollupManager, + ], + }, + ); + } catch (error) { + // expect(error.message.toLowerCase().includes('proxyadmin')).to.be.equal(true); } } - } main() From 485d5aac9aca1cda044daf5808f5b4d39b3f4ccc Mon Sep 17 00:00:00 2001 From: Xavier Romero Date: Tue, 6 Feb 2024 16:24:49 +0100 Subject: [PATCH 210/230] Add verifyTestnetProofVerifier.md --- .../verifyMainnetProofVerifier.md | 3 +- .../verifyTestnetProofVerifier.md | 369 ++++++++++++++++++ 2 files changed, 371 insertions(+), 1 deletion(-) create mode 100644 verifyMainnetDeployment/verifyTestnetProofVerifier.md diff --git a/verifyMainnetDeployment/verifyMainnetProofVerifier.md b/verifyMainnetDeployment/verifyMainnetProofVerifier.md index cb55609dc..0a7959f8f 100644 --- a/verifyMainnetDeployment/verifyMainnetProofVerifier.md +++ b/verifyMainnetDeployment/verifyMainnetProofVerifier.md @@ -104,7 +104,8 @@ npm install hardhat mkdir -p contracts/verifiers ``` -To generate the same bycode it's important recover exactlly same options used during compilation, we found this information with contract information on etherscan (Settings). Copy this information inside the file ~/contract/settings.json, as follows: +To generate the same bycode it's important recover exactlly same options used during compilation, we found this information with contract information on etherscan (Settings). +Copy this information inside the file ~/contract/settings.json, as follows: ```bash cd ~/contract diff --git a/verifyMainnetDeployment/verifyTestnetProofVerifier.md b/verifyMainnetDeployment/verifyTestnetProofVerifier.md new file mode 100644 index 000000000..bf402ca25 --- /dev/null +++ b/verifyMainnetDeployment/verifyTestnetProofVerifier.md @@ -0,0 +1,369 @@ +# Verify deployment on testnet Sepolia of the proof verifier smart contract (etrog-fork.7) + +In order to verify the smart contract, you will need a machine with at least 256GB of RAM and 16 cores. + +In this tutorial we will give instructions for a r6a.8xlarge aws instance. This instance has 16 cores 32 threads, 512GB of SSD. The instance will use Ubuntu 22.04 LTS and the cost of the instance is about 1.82 $/h. This process is quite long, it takes approximately 5-6 hours. + +So lets start by launching and instance. + +## Basic OS preparation + +```bash +sudo apt update +sudo apt install -y tmux git curl jq +``` + +## Tweeking the OS to accept high amount of memory. + +```bash +echo "vm.max_map_count=655300" | sudo tee -a /etc/sysctl.conf +sudo sysctl -w vm.max_map_count=655300 +export NODE_OPTIONS="--max-old-space-size=230000" +``` + +## Install version of node and npm + +```bash +curl -sL https://deb.nodesource.com/setup_18.x -o nodesource_setup.sh +sudo bash nodesource_setup.sh +sudo apt install -y nodejs +node -v +``` + +The version of node should be: 18 (e.g. 18.19.0 ) + +## Download and prepare circom + +To compile circuits, we need circom installed. + +```bash +cd ~ +git clone https://github.com/iden3/circom.git +cd circom +git checkout v2.1.8 +git log --pretty=format:'%H' -n 1 +``` + +The hash of the commit should be: f0deda416abe91e5dd906c55507c737cd9986ab5 + +Install and compile circom (RUST) + +```bash +cd ~ +sudo apt install -y cargo +cd circom +cargo build --release +cargo install --path circom +export PATH=$PATH:~/.cargo/bin +echo 'PATH=$PATH:~/.cargo/bin' >> ~/.profile +circom --version +``` + +The version of circom should be: 2.1.8 + +## Prepare fast build constant tree tool + +```bash +cd ~ +git clone https://github.com/0xPolygonHermez/zkevm-prover.git +cd zkevm-prover +git checkout 40cde45deacede2b10a91ce2dd926abd2ba67541 +git submodule init +git submodule update +sudo apt install -y build-essential libomp-dev libgmp-dev nlohmann-json3-dev libpqxx-dev nasm libgrpc++-dev libprotobuf-dev grpc-proto libsodium-dev uuid-dev libsecp256k1-dev +make -j bctree +``` + +This step takes less than 1 minute. + +## Prepare and launch setup (zkevm-proverjs) + +```bash +cd ~ +git clone https://github.com/0xPolygonHermez/zkevm-proverjs.git +cd zkevm-proverjs +git checkout ede545493ca4ab6cbd136dbcc452c7794d01bb08 +npm install +tmux -c "npm run buildsetup --bctree=../zkevm-prover/build/bctree" +``` + +This step is quite long, it takes approximately 4.5 hours. 2 out of 4.5 hours are for the powersOfTau28_hez_final.ptau download, a file of 288GB that it's loaded only once. + +> NOTE: At the end of the document there is a table with all the hashes of the files generated during this process. + +## Compile generated verifier smartcontract (solidity) + +As a final result of the previous steps, the smart contract that verifies the test has been generated. This file is _final.fflonk.verifier.sol_. At this point, it is possible to verify the smart contract using the source code or verify that the bytecode is the same. **To verify the bytecode**, you must compile with the precisely same version, compiler, and parameters to be sure that even the metadata hash contained in the bytecode is exactly the same. The following instructions generate a project to build using the **hardhat** tool. + +```bash +cd ~ +mkdir contract +cd contract +npm init -y +npm install hardhat +mkdir -p contracts/verifiers +``` + +To generate the same bycode it's important recover exactlly same options used during compilation, we found this information with contract information on etherscan (Settings). +Copy this information inside the file ~/contract/settings.json, as follows: + +```bash +cd ~/contract +cat <settings.json +{ + "optimizer": { + "enabled": true, + "runs": 999999 + }, + "evmVersion": "shanghai", + "outputSelection": { + "*": { + "*": [ + "evm.bytecode", + "evm.deployedBytecode", + "devdoc", + "userdoc", + "metadata", + "abi" + ] + } + }, + "libraries": {} +} +EOF +``` + +After that, execute the following commands. + +```bash +cd ~/contract +echo -e "module.exports={solidity:{compilers:[{version: \"0.8.20\",settings:$(cat settings.json)}]}}" > hardhat.config.js +``` + +Once the project structure is created, we proceed to copy the smart contract generated in the previous step. This smart contract was saved on _~/zkevm-proverjs/build/proof_, and must be copied to _contracts/verifiers_ with exactly the name _Verifier.sol_. If the name or the path changes, the hash of metadata changes too, for this reason, is essential to respect the name and the path. To do it could execute these commands + +```bash +cd ~/contract +cp ~/zkevm-proverjs/build/proof/final.fflonk.verifier.sol contracts/verifiers/FflonkVerifier.sol +sha256sum contracts/verifiers/FflonkVerifier.sol +``` + +The result should be: + +``` +8ae7baadd9f2ffb07862b0a74c20e1ad1cc2d4136e416ce5beac82a4e9a44923 +``` + +To compile smartcontract execute following command: + +```bash +npx hardhat compile +``` + +> NOTE: During compilation warning is shown: +> Warning: Unused function parameter. Remove or comment out the variable name to silence this warning. +> --> contracts/verifiers/FflonkVerifier.sol:162:26: + +Bytecode of smartcontract was on bytecode property of json file _FflonkVerifier.json_ generated on path _artifacts/contracts/verifiers/FflonkVerifier.sol/_ + +``` +608060405234801561000f575f80fd5b506159c7 +806200001e5f395ff3fe60806040523480156100 +0f575f80fd5b5060043610610029575f3560e01c +80639121da8a1461002d575b5f80fd5b61004061 +003b366004615950565b610054565b6040519015 +15815260200160405180910390f35b5f6158e056 +5b6040516104c08201518082526020820191507f +30644e72e131a029b85045b68181585d2833e848 +79b9709143e1f593f00000016104e08401518209 +90508082526020820191507f30644e72e131a029 +: +: +5b61590f8161286e565b61591983826128a7565b +61592281612906565b61592b81613e54565b6159 +3481614549565b61593d816151d0565b61594681 +6156ce565b9050805f5260205ff35b5f80610320 +808486031215615963575f80fd5b610300840185 +811115615974575f80fd5b849350858286011115 +615985575f80fd5b8092505050925092905056fe +a2646970667358221220761b1f07d5034592f204 +cb3439dbfabc28fb771c6e1bc6c8016e3d7b42ad +5a2164736f6c63430008140033 +``` + +Verify bytecode compiled: + +```bash +cd ~/contract +cat ./artifacts/contracts/verifiers/FflonkVerifier.sol/FflonkVerifier.json | jq .bytecode -r | sha256sum +``` + +The result should be: + +``` +34c11f41d424eb821b42630183c4b97dc8689163276ca50095e5918202950703 +``` + +## Download bytecode of deployed smartcontract + +To download bytecode of deployed smartcontract, need the address of smart contract, in this case it's _0x8d0aAd785905c5c9f942CB18a3AC1e50c4F52786_. + +### Download by copying data manually + +Go to Etherscan or Beaconcha to get transaction bytecode. + +Associated with address _0x8d0aAd785905c5c9f942CB18a3AC1e50c4F52786_ found the transacction _0xed0f103dc5e5f5bb8aa5df90a2bfb1949ad41dec8b04e5acc0747dbc1c26e837_. + +- ### Etherscan (https://sepolia.etherscan.io) + + https://sepolia.etherscan.io/address/0x8d0aAd785905c5c9f942CB18a3AC1e50c4F52786 + https://sepolia.etherscan.io/tx/0xed0f103dc5e5f5bb8aa5df90a2bfb1949ad41dec8b04e5acc0747dbc1c26e837 + + Click to see more > Input Data > Select all data and copy to clipboard. + +- ### Beacocha (https://sepolia.beaconcha.in) + https://sepolia.beaconcha.in/address/8d0aAd785905c5c9f942CB18a3AC1e50c4F52786 + https://sepolia.beaconcha.in/tx/0xed0f103dc5e5f5bb8aa5df90a2bfb1949ad41dec8b04e5acc0747dbc1c26e837 + Advanced Info > Call Data > Select all data and copy to clipboard. + +_NOTE: Don't use button "Copy Raw Data" because it generated non compatible format._ + +Some applications running on the terminal may limit the amount of input they will accept before their input buffers overflow. To avoid this situation create file _FflonkVerifier.sol.explorer.bytecode_ with editor as nano or vi. + +```bash +cd ~/contract +nano FflonkVerifier.sol.explorer.bytecode +``` + +In nano, to paste the clipboard to the file use CTRL+P, save content using CTRL+X, and finally press Y. + +### Download through L1 endpoint call + +```bash +cd ~/contract +L1_ENDPOINT= + curl -s -X POST -H "Content-Type: application/json" --data '{"method":"eth_getTransactionByHash","params":["0xed0f103dc5e5f5bb8aa5df90a2bfb1949ad41dec8b04e5acc0747dbc1c26e837"], "id":1,"jsonrpc":"2.0"}' $L1_ENDPOINT | jq .result.input -r > FflonkVerifier.sol.explorer.bytecode +``` + +## Compare bytecodes + +To compare if two files are the same, you could use diff. + +```bash +cd ~/contract +diff FflonkVerifier.sol.compiled.bytecode FflonkVerifier.sol.explorer.bytecode +``` + +Alternatively, you could check content using sha256sum: + +```bash +cd ~/contract +sha256sum FflonkVerifier.sol.*.bytecode +``` + +The result should be: + +``` +34c11f41d424eb821b42630183c4b97dc8689163276ca50095e5918202950703 FflonkVerifier.sol.compiled.bytecode +34c11f41d424eb821b42630183c4b97dc8689163276ca50095e5918202950703 FflonkVerifier.sol.explorer.bytecode +``` + +## Generated files hash + + +
step/filesha256
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
step/filesha256
buildrom
rom.json676c3f58263fc284bc53ef949dd1acedcfb090f3287ee080b2a277ed2157894a
buildpil
main.pil.jsone6220953585202f5ecfaa8d7bb2fe3d06bf85fb0af22c2fe46a97abd39ae9aa7
buildstoragerom
storage_sm_rom.json676c3f58263fc284bc53ef949dd1acedcfb090f3287ee080b2a277ed2157894a
buildconstants
zkevm.const3d0c910c9bfa143209e8f545e23e2e98b29f4f5a40c04001fc8254aee9f121c7
buildstarkinfo
zkevm.starkstruct.json284b6ce275c637af4a0b4b10cd83a881c6f1b21e21ad7ea2276379ed8393b099
zkevm.starkinfo.jsoncd4615be096817d14b3b19780897ad39f5cd26f83e5d17518dae7688563fcb54
buildconstanttree
zkevm.verkey.json7d024c2295c3bc478de5a71c4006ede5731420236651e29a384609c913c8eee9
zkevm.consttree3d0c910c9bfa143209e8f545e23e2e98b29f4f5a40c04001fc8254aee9f121c7
gencircom
zkevm.verifier.circome832840aa97ca0e47a448f24ac7019ea80bfb6e9354cbe2fd7a6dada1d5d807b
compilecircom
zkevm.verifier.r1cs25f656f632964f8c7800c4d222f34a6e94a576c9b4f3b81fbc2ba6f03889719f
zkevm.verifier.syme32fc039e6bb550f7d2e375804b0679c6761d488111e6aa9b3b3a638af08ec36
c12a_setup
c12a.pil13b74f6e33dcbfcb9aa1a5eb7a93691635f51f33aa91e7c867dec11509c93f4d
c12a.const5fffa6480307f60c9c1202539ae39051cbcb72863bb8e2db5bebf74a2d048f9b
c12a.exec6fe8e529645f1b72de3851ecd50dde6b830846c4cd3af0b83267151b11ec45e1
c12a_buildstarkinfo
c12a.starkstruct.jsonc8ceea75f0aa05fdbdb20ac41b224355fde07a0dbeecd6649ff8c2636b9a759c
c12a.starkinfo.jsonc05b27f4538e8071a0e8045faeb8a6de8771053587ad657b07c9401b9597a663
c12a_buildconstanttree
c12a.verkey.jsone6a963de090b49ce93c058ffe5438f209091186987b5fc162d6e9122bf86f333
c12a.consttree5fffa6480307f60c9c1202539ae39051cbcb72863bb8e2db5bebf74a2d048f9b
c12a_gencircom
c12a.verifier.circom306ef5102ad64e14cb385e7e888dce3fccd73dbd55aa443c1561152779fdf9dd
recursive1_gencircom
recursive1.circom83543e99e0a1f660761fa8a06310dfd9b69d0c0a358a73b6baec55d9587234e5
recursive1_compile
recursive1.r1csbf748272be6aeba8eb8dc3146e68a9eb938c7139d690be1e94a506a4d756eec8
recursive1.sym646bc2e3ca5da30c1221039c1e37af2ed46a2f8f7023d65a41cb80c7de5882a9
recursive1_setup
recursive1.pil94ea2856942dd0745e2d6443c6988a4fdc65ac2c3173633e897e02b6d7eaad8b
recursive1.constbba22272d800b85e67e3b0360dbd67f972804129a8f5ee4a434a26976a3bc8a4
recursive1.exec359e6e221cefd35827960ff5cf9cd506ba5e2a5ec92c33312a5903ce087aa155
recursive1_buildstarkinfo
recursive.starkstruct.json8bc8b44a7e493e447af7c04d1a362c2198f3e9b29e425248b7646c36b67fd02c
recursive1.starkinfo.jsonab63b4008c2b2e769519ff3df4ba6130d66b8d6778c0ba0fb7724d5a4a9e2841
recursive1_buildconstanttree
recursive1.verkey.json44f3b6afb36a458031e327d2119a15689ec38eb10ccff729dfda0bae3bf16921
recursive1.consttreebba22272d800b85e67e3b0360dbd67f972804129a8f5ee4a434a26976a3bc8a4
recursive1_verifier_gencircom
recursive1.verifier.circom835cf0a8c4706ced7395957a8bef1e00b70d1007586c9fccf107f12b4936dea5
recursive2_gencircom
recursive2.circom0c03000a9a56601a086fc5c91e9119e2e63fa699fe9d5f362b506c2d3602449f
recursive2_compile
recursive2.r1cs2fdd9f433b07c90a367dbc2335b7921c1ef242e6466fc5a25b8ebcf8660ff77a
recursive2.syma47d475bcb09309b2100bfc19ce4c4baa9cee2699373290569617d71fcf51a64
recursive2_setup
recursive2.pil94ea2856942dd0745e2d6443c6988a4fdc65ac2c3173633e897e02b6d7eaad8b
recursive2.const7ee905f3949c67af84f417ce2b996b2946b7bf1d4557f8a67f9d7f7ab9540902
recursive2.execf32201da15042d9167dc8dd6707c2920d7d2e772d411566739ac874bdbf269fb
recursive2_buildstarkinfo
recursive2.starkinfo.jsonab63b4008c2b2e769519ff3df4ba6130d66b8d6778c0ba0fb7724d5a4a9e2841
recursive2_buildconstanttree
recursive2.verkey.jsonfc3f0d4aaf11bb001102a37e397262aa62a02b6ca001b5c00ba9fccdfb06dda6
recursive2.consttree7ee905f3949c67af84f417ce2b996b2946b7bf1d4557f8a67f9d7f7ab9540902
recursive2_verifier_gencircom
recursive2.verifier.circom835cf0a8c4706ced7395957a8bef1e00b70d1007586c9fccf107f12b4936dea5
recursivef_gencircom
recursivef.circom84f7538268a29a67e7836691b1706f9228fe73f4d890eee7f65f3ddcfc3aafc3
recursivef_compile
recursivef.r1cs2861953db44082184ee7a1dcff9b37ab131e3d58cc5539cfe258c6d23f505f8c
recursivef.symfcbe9cd852065f1224a82f8b595d2c7aaa9fdbc616ef9048714105d69d988cd7
recursivef_setup
recursivef.pil62527bfc12f535e8fa3a6dd7055bc595b27fc491f7203987108ee3d13283dbfe
recursivef.const0f32c1d45e2e7390cd21bcfadb1be399ea02f6c91c76aaca963a7ee1f131ba41
recursivef.exec1751c8a070d68cc64aa7d932a1785330da24139e547805e583f5407c5600715e
recursivef_buildstarkinfo
recursivef.starkstruct.jsonba99ad986178db98b1a867bb9d8592fa6ba5c29d9233fd939d01424425ce6cba
recursivef.starkinfo.json8d6e9503550ad8bdde303af5b37ad0320171d4f180fc11323b58fbf8d82bb1a6
recursivef_buildconstanttree
recursivef.verkey.json3e16829b5af0ea65a5f49724d96ed429e1d4da088d4b0c1556093632f94e6bbc
recursivef.consttree0f32c1d45e2e7390cd21bcfadb1be399ea02f6c91c76aaca963a7ee1f131ba41
recursivef_verifier_gencircom
recursivef.verifier.circom68406381a2d730ede86e41ce80f4c214cabb83fd307768b43d5b407978f94c04
final_gencircom
final.circom74a06304ce73b282a520c358baead152dad790b0aa6b7031f6ba8c00166be459
final_compile
final.r1csbf28b9d2adff923fbf2505a116bf5c29f116b1187fcae972bc78d1f254963380
final.sym9c20071021039f3f82b3ecb471402949cbbc290812da97f47aae4b13ad73342d
fflonk_setup
final.fflonk.zkeyb0a674854e811c9d935cfae6fa0cc4b0efbba7014365b06d026b0bc3667a0c7b
fflonk_evk
final.fflonk.verkey.json44b4d3ac1331dd17246611687f7c65f659d377c34467df1d49e2e558c3aad1ad
dependencies.txtbb198945774e109721e2bde02a369edf96d21a0533f4bf9882a472dadd90d117
fflonk_solidity
final.fflonk.verifier.sol8ae7baadd9f2ffb07862b0a74c20e1ad1cc2d4136e416ce5beac82a4e9a44923
From 73b1efa71b271011952cd563ab421956b799d801 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Wed, 7 Feb 2024 12:33:51 +0100 Subject: [PATCH 211/230] add mainnet fork test --- .../mainnet_1706364989/testFork.ts | 153 ++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 upgrade/upgradeToV2/mainnet_1706364989/testFork.ts diff --git a/upgrade/upgradeToV2/mainnet_1706364989/testFork.ts b/upgrade/upgradeToV2/mainnet_1706364989/testFork.ts new file mode 100644 index 000000000..4725c6355 --- /dev/null +++ b/upgrade/upgradeToV2/mainnet_1706364989/testFork.ts @@ -0,0 +1,153 @@ +/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if */ +/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */ +import {expect} from "chai"; +import path = require("path"); +import fs = require("fs"); + +import * as dotenv from "dotenv"; +dotenv.config({path: path.resolve(__dirname, "../../../.env")}); +import {ethers, upgrades} from "hardhat"; +import {PolygonRollupManager, PolygonZkEVMTimelock} from "../../../typechain-types"; + +import {takeSnapshot, time, reset, setBalance, setStorageAt} from "@nomicfoundation/hardhat-network-helpers"; + +const deployParameters = require("./deploy_parameters_mainnet.json"); +const deployOutputParameters = require("./deploy_output_mainnet.json"); +const upgradeOutput = require("./upgrade_output.json"); + +async function main() { + const polTokenAddress = "0x455e53CBB86018Ac2B8092FdCd39d8444aFFC3F6"; // mainnet address + const deployer = (await ethers.getSigners())[0]; + console.log("using signer: ", deployer.address); + + // hard fork + const rpc = `https://mainnet.infura.io/v3/${process.env.INFURA_PROJECT_ID}`; + await reset(rpc); + await setBalance(deployer.address, 100n ** 18n); + + // Get timelock multisig + const timelockMultisig = "0x242daE44F5d8fb54B198D03a94dA45B5a4413e21"; + await ethers.provider.send("hardhat_impersonateAccount", [timelockMultisig]); + const multisigSigner = await ethers.getSigner(timelockMultisig as any); + await setBalance(timelockMultisig, 100n ** 18n); + + const timelockContractFactory = await ethers.getContractFactory("PolygonZkEVMTimelock"); + const timelockContract = (await timelockContractFactory.attach( + deployOutputParameters.timelockContractAddress + )) as PolygonZkEVMTimelock; + + const timelockDelay = await timelockContract.getMinDelay(); + + const polygonZkEVMFactory = await ethers.getContractFactory("PolygonZkEVM"); + const polygonZkEVMContract = (await polygonZkEVMFactory.attach( + deployOutputParameters.polygonZkEVMAddress + )) as PolygonZkEVM; + + const lastBatchSequenced = await polygonZkEVMContract.lastBatchSequenced(); + + await setStorageAt(polygonZkEVMContract.target, 116, lastBatchSequenced); + + const lastBatchVerified = await polygonZkEVMContract.lastVerifiedBatch(); + console.log({lastBatchSequenced}); + console.log({lastBatchVerified}); + + await time.increase(timelockDelay); + + // Set storage slot + + // send mutlsig transaction + const txUpgrade = { + to: timelockContract.target, + data: upgradeOutput.executeData, + }; + + const receipt = await (await multisigSigner.sendTransaction(txUpgrade)).wait(); + + const RollupMangerFactory = await ethers.getContractFactory("PolygonRollupManager"); + const rollupManager = (await RollupMangerFactory.attach( + deployOutputParameters.polygonZkEVMAddress + )) as PolygonRollupManager; + + expect(await rollupManager.rollupCount()).to.be.equal(1); + + console.log("Contracts upgraded"); + + // Deploy a validium + const verifierAddress = upgradeOutput.verifierAddress; + + // impersonate timelock + await ethers.provider.send("hardhat_impersonateAccount", [deployOutputParameters.timelockContractAddress]); + const tiemelockSigner = await ethers.getSigner(deployOutputParameters.timelockContractAddress as any); + await setBalance(deployOutputParameters.timelockContractAddress, 100n ** 18n); + + // Create consensus implementation + const PolygonconsensusFactory = (await ethers.getContractFactory("PolygonValidiumEtrog", deployer)) as any; + let PolygonconsensusContract = await PolygonconsensusFactory.deploy( + deployOutputParameters.polygonZkEVMGlobalExitRootAddress, + polTokenAddress, + deployOutputParameters.polygonZkEVMBridgeAddress, + deployOutputParameters.polygonZkEVMAddress + ); + await PolygonconsensusContract.waitForDeployment(); + + // Add a new rollup type with timelock + const rollupCompatibilityID = 0; + await ( + await rollupManager.connect(tiemelockSigner).addNewRollupType( + PolygonconsensusContract.target, + verifierAddress, + 7, + rollupCompatibilityID, + deployOutputParameters.genesisRoot, // should recalculate root!!! + "super description" + ) + ).wait(); + + expect(await rollupManager.rollupTypeCount()).to.be.equal(1); + + // Create new rollup + const chainID = 123213; + const txDeployRollup = await rollupManager.connect(multisigSigner).createNewRollup( + 1, + chainID, + deployer.address, // admin + deployer.address, // sequencer + ethers.ZeroAddress, + "trustedsequencer url", + "network name" + ); + + console.log("Validum deployed"); + + const receiptDeployRollup = (await txDeployRollup.wait()) as any; + expect(await rollupManager.rollupCount()).to.be.equal(2); + + // Update rollup to this type: this is just a test is NOT intended to update our zkevm to a validium + const txUpdateRollup = await rollupManager.connect(tiemelockSigner).updateRollup( + upgradeOutput.newPolygonZKEVM, //new poylgon zkevm + 1, // new rollupTypeID + "0x" // upgradeData + ); + + const receiptUpdateRollup = (await txUpdateRollup.wait()) as any; + + const rollupDataFinal = await rollupManager.rollupIDToRollupData(1); + expect(rollupDataFinal.rollupContract).to.be.equal(upgradeOutput.newPolygonZKEVM); + expect(rollupDataFinal.chainID).to.be.equal(1101); + expect(rollupDataFinal.verifier).to.be.equal(verifierAddress); + expect(rollupDataFinal.forkID).to.be.equal(3); + expect(rollupDataFinal.lastBatchSequenced).to.be.equal(lastBatchSequenced); + expect(rollupDataFinal.lastVerifiedBatch).to.be.equal(lastBatchSequenced); + expect(rollupDataFinal.lastPendingState).to.be.equal(0); + expect(rollupDataFinal.lastPendingStateConsolidated).to.be.equal(0); + expect(rollupDataFinal.lastVerifiedBatchBeforeUpgrade).to.be.equal(lastBatchSequenced); + expect(rollupDataFinal.rollupTypeID).to.be.equal(1); + expect(rollupDataFinal.rollupCompatibilityID).to.be.equal(0); + + console.log("Updated zkevm Succedd"); +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); From cd99b3a734a45149d3c149b7c94162c194ec9d03 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Thu, 8 Feb 2024 02:56:09 +0100 Subject: [PATCH 212/230] add tools --- deployment/testnet/prepareTestnet.ts | 4 +- deployment/v2/4_createRollup.ts | 2 + tools/addRollupType/addRollupType.ts | 175 +++++++ tools/addRollupType/addRollupTypeTimelock.ts | 199 ++++++++ tools/addRollupType/add_rollup_type.json | 18 + .../add_rollup_type.json.example | 18 + tools/addRollupType/readme.md | 54 +++ tools/createGenesis/generateGenesis.ts | 453 ++++++++++++++++++ tools/createGenesis/genesis_base.json | 95 ++++ tools/createGenesis/new_genesis_mainnet.json | 92 ++++ tools/deployVerifier/deployVerifier.ts | 101 ++++ .../deploy_parameters.json.example | 7 + upgrade/timelockTransaction/README.md | 54 --- upgrade/timelockTransaction/deployVerifier.js | 34 -- upgrade/timelockTransaction/simpleUpgrade.js | 71 --- .../timelockTransaction/timeLockUpgrade.js | 179 ------- .../upgrade_parameters.json.example | 27 -- 17 files changed, 1216 insertions(+), 367 deletions(-) create mode 100644 tools/addRollupType/addRollupType.ts create mode 100644 tools/addRollupType/addRollupTypeTimelock.ts create mode 100644 tools/addRollupType/add_rollup_type.json create mode 100644 tools/addRollupType/add_rollup_type.json.example create mode 100644 tools/addRollupType/readme.md create mode 100644 tools/createGenesis/generateGenesis.ts create mode 100644 tools/createGenesis/genesis_base.json create mode 100644 tools/createGenesis/new_genesis_mainnet.json create mode 100644 tools/deployVerifier/deployVerifier.ts create mode 100644 tools/deployVerifier/deploy_parameters.json.example delete mode 100644 upgrade/timelockTransaction/README.md delete mode 100644 upgrade/timelockTransaction/deployVerifier.js delete mode 100644 upgrade/timelockTransaction/simpleUpgrade.js delete mode 100644 upgrade/timelockTransaction/timeLockUpgrade.js delete mode 100644 upgrade/timelockTransaction/upgrade_parameters.json.example diff --git a/deployment/testnet/prepareTestnet.ts b/deployment/testnet/prepareTestnet.ts index fdeb47244..5f208fb87 100644 --- a/deployment/testnet/prepareTestnet.ts +++ b/deployment/testnet/prepareTestnet.ts @@ -116,7 +116,7 @@ async function main() { to: trustedSequencer, value: minEtherBalance, }; - await deployer.sendTransaction(params); + await (await deployer.sendTransaction(params)).wait(); } const tokensBalance = ethers.parseEther("100000"); await (await polTokenContract.transfer(trustedSequencer, tokensBalance)).wait(); @@ -128,7 +128,7 @@ async function main() { to: trustedAggregator, value: minEtherBalance, }; - await deployer.sendTransaction(params); + await (await deployer.sendTransaction(params)).wait(); } deployParameters.polTokenAddress = polTokenContract.target; diff --git a/deployment/v2/4_createRollup.ts b/deployment/v2/4_createRollup.ts index daadd02fb..fb5471f30 100644 --- a/deployment/v2/4_createRollup.ts +++ b/deployment/v2/4_createRollup.ts @@ -276,6 +276,8 @@ async function main() { throw new Error("polygonDataCommittee contract has not been deployed"); } } + await polygonDataCommittee?.waitForDeployment(); + // Load data commitee const PolygonValidiumContract = (await PolygonconsensusFactory.attach(newZKEVMAddress)) as PolygonValidium; // add data commitee to the consensus contract diff --git a/tools/addRollupType/addRollupType.ts b/tools/addRollupType/addRollupType.ts new file mode 100644 index 000000000..3776c0211 --- /dev/null +++ b/tools/addRollupType/addRollupType.ts @@ -0,0 +1,175 @@ +/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if */ +/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */ +import {expect} from "chai"; +import path = require("path"); +import fs = require("fs"); + +import * as dotenv from "dotenv"; +dotenv.config({path: path.resolve(__dirname, "../../.env")}); +import {ethers, upgrades} from "hardhat"; +import {HardhatEthersSigner} from "@nomicfoundation/hardhat-ethers/signers"; + +const addRollupParameters = require("./add_rollup_type.json"); +const genesis = require("./genesis.json"); + +const pathOutputJson = path.join(__dirname, "./add_rollup_type_output.json"); + +import {PolygonRollupManager} from "../../typechain-types"; + +async function main() { + const attemptsDeployProxy = 20; + + const outputJson = {} as any; + + /* + * Check deploy parameters + * Check that every necessary parameter is fullfilled + */ + const mandatoryDeploymentParameters = [ + "realVerifier", + "trustedSequencerURL", + "networkName", + "description", + "trustedSequencer", + "chainID", + "adminZkEVM", + "forkID", + "consensusContract", + "polygonRollupManagerAddress", + "polygonZkEVMBridgeAddress", + "polygonZkEVMGlobalExitRootAddress", + "polTokenAddress", + "verifierAddress", + ]; + + for (const parameterName of mandatoryDeploymentParameters) { + if (addRollupParameters[parameterName] === undefined || addRollupParameters[parameterName] === "") { + throw new Error(`Missing parameter: ${parameterName}`); + } + } + + const { + realVerifier, + description, + forkID, + consensusContract, + polygonRollupManagerAddress, + polygonZkEVMBridgeAddress, + polygonZkEVMGlobalExitRootAddress, + polTokenAddress, + verifierAddress, + } = addRollupParameters; + + const supportedConensus = ["PolygonZkEVMEtrog", "PolygonValidiumEtrog"]; + + if (!supportedConensus.includes(consensusContract)) { + throw new Error(`Consensus contract not supported, supported contracts are: ${supportedConensus}`); + } + + // Load provider + let currentProvider = ethers.provider; + if (addRollupParameters.multiplierGas || addRollupParameters.maxFeePerGas) { + if (process.env.HARDHAT_NETWORK !== "hardhat") { + currentProvider = ethers.getDefaultProvider( + `https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}` + ) as any; + if (addRollupParameters.maxPriorityFeePerGas && addRollupParameters.maxFeePerGas) { + console.log( + `Hardcoded gas used: MaxPriority${addRollupParameters.maxPriorityFeePerGas} gwei, MaxFee${addRollupParameters.maxFeePerGas} gwei` + ); + const FEE_DATA = new ethers.FeeData( + null, + ethers.parseUnits(addRollupParameters.maxFeePerGas, "gwei"), + ethers.parseUnits(addRollupParameters.maxPriorityFeePerGas, "gwei") + ); + + currentProvider.getFeeData = async () => FEE_DATA; + } else { + console.log("Multiplier gas used: ", addRollupParameters.multiplierGas); + async function overrideFeeData() { + const feedata = await ethers.provider.getFeeData(); + return new ethers.FeeData( + null, + ((feedata.maxFeePerGas as bigint) * BigInt(addRollupParameters.multiplierGas)) / 1000n, + ((feedata.maxPriorityFeePerGas as bigint) * BigInt(addRollupParameters.multiplierGas)) / 1000n + ); + } + currentProvider.getFeeData = overrideFeeData; + } + } + } + + // Load deployer + let deployer; + if (addRollupParameters.deployerPvtKey) { + deployer = new ethers.Wallet(addRollupParameters.deployerPvtKey, currentProvider); + } else if (process.env.MNEMONIC) { + deployer = ethers.HDNodeWallet.fromMnemonic( + ethers.Mnemonic.fromPhrase(process.env.MNEMONIC), + "m/44'/60'/0'/0/0" + ).connect(currentProvider); + } else { + [deployer] = await ethers.getSigners(); + } + + // Load Rollup manager + const PolgonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager", deployer); + const rollupManagerContract = PolgonRollupManagerFactory.attach( + polygonRollupManagerAddress + ) as PolygonRollupManager; + + const DEFAULT_ADMIN_ROLE = ethers.ZeroHash; + if ((await rollupManagerContract.hasRole(DEFAULT_ADMIN_ROLE, deployer.address)) == false) { + throw new Error( + `Deployer does not have admin role. Use the test flag on deploy_parameters if this is a test deployment` + ); + } + + // Since it's a mock deployment deployer has all the rights + const ADD_ROLLUP_TYPE_ROLE = ethers.id("ADD_ROLLUP_TYPE_ROLE"); + + // Check role: + if ((await rollupManagerContract.hasRole(ADD_ROLLUP_TYPE_ROLE, deployer.address)) == false) + await rollupManagerContract.grantRole(ADD_ROLLUP_TYPE_ROLE, deployer.address); + + // Create consensus implementation + const PolygonconsensusFactory = (await ethers.getContractFactory(consensusContract, deployer)) as any; + let PolygonconsensusContract; + + PolygonconsensusContract = await PolygonconsensusFactory.deploy( + polygonZkEVMGlobalExitRootAddress, + polTokenAddress, + polygonZkEVMBridgeAddress, + polygonRollupManagerAddress + ); + await PolygonconsensusContract.waitForDeployment(); + + // Add a new rollup type with timelock + const rollupCompatibilityID = 0; + await ( + await rollupManagerContract.addNewRollupType( + PolygonconsensusContract.target, + verifierAddress, + forkID, + rollupCompatibilityID, + genesis.root, + description + ) + ).wait(); + + console.log("#######################\n"); + console.log("Added new Rollup Type deployed"); + const newRollupTypeID = await rollupManagerContract.rollupTypeCount(); + + outputJson.genesis = genesis.root; + outputJson.verifierAddress = verifierAddress; + outputJson.consensusContract = consensusContract; + outputJson.rollupTypeID = newRollupTypeID; + + fs.writeFileSync(pathOutputJson, JSON.stringify(outputJson, null, 1)); +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/tools/addRollupType/addRollupTypeTimelock.ts b/tools/addRollupType/addRollupTypeTimelock.ts new file mode 100644 index 000000000..ed00dc337 --- /dev/null +++ b/tools/addRollupType/addRollupTypeTimelock.ts @@ -0,0 +1,199 @@ +/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if */ +/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */ +import {expect} from "chai"; +import path = require("path"); +import fs = require("fs"); + +import * as dotenv from "dotenv"; +dotenv.config({path: path.resolve(__dirname, "../../.env")}); +import {ethers, upgrades} from "hardhat"; +import {HardhatEthersSigner} from "@nomicfoundation/hardhat-ethers/signers"; + +const addRollupParameters = require("./add_rollup_type.json"); +const genesis = require("./genesis.json"); + +const pathOutputJson = path.join(__dirname, "./add_rollup_type_output.json"); + +import {PolygonRollupManager} from "../../typechain-types"; + +async function main() { + const outputJson = {} as any; + + /* + * Check deploy parameters + * Check that every necessary parameter is fullfilled + */ + const mandatoryDeploymentParameters = [ + "realVerifier", + "trustedSequencerURL", + "networkName", + "description", + "trustedSequencer", + "chainID", + "adminZkEVM", + "forkID", + "consensusContract", + "polygonRollupManagerAddress", + "polygonZkEVMBridgeAddress", + "polygonZkEVMGlobalExitRootAddress", + "polTokenAddress", + "verifierAddress", + "timelockDelay", + ]; + + for (const parameterName of mandatoryDeploymentParameters) { + if (addRollupParameters[parameterName] === undefined || addRollupParameters[parameterName] === "") { + throw new Error(`Missing parameter: ${parameterName}`); + } + } + + const { + description, + forkID, + consensusContract, + polygonRollupManagerAddress, + polygonZkEVMBridgeAddress, + polygonZkEVMGlobalExitRootAddress, + polTokenAddress, + verifierAddress, + timelockDelay, + } = addRollupParameters; + + const salt = addRollupParameters.timelockSalt || ethers.ZeroHash; + + const supportedConensus = ["PolygonZkEVMEtrog", "PolygonValidiumEtrog"]; + + if (!supportedConensus.includes(consensusContract)) { + throw new Error(`Consensus contract not supported, supported contracts are: ${supportedConensus}`); + } + + // Load provider + let currentProvider = ethers.provider; + if (addRollupParameters.multiplierGas || addRollupParameters.maxFeePerGas) { + if (process.env.HARDHAT_NETWORK !== "hardhat") { + currentProvider = ethers.getDefaultProvider( + `https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}` + ) as any; + if (addRollupParameters.maxPriorityFeePerGas && addRollupParameters.maxFeePerGas) { + console.log( + `Hardcoded gas used: MaxPriority${addRollupParameters.maxPriorityFeePerGas} gwei, MaxFee${addRollupParameters.maxFeePerGas} gwei` + ); + const FEE_DATA = new ethers.FeeData( + null, + ethers.parseUnits(addRollupParameters.maxFeePerGas, "gwei"), + ethers.parseUnits(addRollupParameters.maxPriorityFeePerGas, "gwei") + ); + + currentProvider.getFeeData = async () => FEE_DATA; + } else { + console.log("Multiplier gas used: ", addRollupParameters.multiplierGas); + async function overrideFeeData() { + const feedata = await ethers.provider.getFeeData(); + return new ethers.FeeData( + null, + ((feedata.maxFeePerGas as bigint) * BigInt(addRollupParameters.multiplierGas)) / 1000n, + ((feedata.maxPriorityFeePerGas as bigint) * BigInt(addRollupParameters.multiplierGas)) / 1000n + ); + } + currentProvider.getFeeData = overrideFeeData; + } + } + } + + // Load deployer + let deployer; + if (addRollupParameters.deployerPvtKey) { + deployer = new ethers.Wallet(addRollupParameters.deployerPvtKey, currentProvider); + } else if (process.env.MNEMONIC) { + deployer = ethers.HDNodeWallet.fromMnemonic( + ethers.Mnemonic.fromPhrase(process.env.MNEMONIC), + "m/44'/60'/0'/0/0" + ).connect(currentProvider); + } else { + [deployer] = await ethers.getSigners(); + } + + // Load Rollup manager + const PolgonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager", deployer); + + // Create consensus implementation + const PolygonconsensusFactory = (await ethers.getContractFactory(consensusContract, deployer)) as any; + let PolygonconsensusContract; + + PolygonconsensusContract = await PolygonconsensusFactory.deploy( + polygonZkEVMGlobalExitRootAddress, + polTokenAddress, + polygonZkEVMBridgeAddress, + polygonRollupManagerAddress + ); + await PolygonconsensusContract.waitForDeployment(); + + // load timelock + const timelockContractFactory = await ethers.getContractFactory("PolygonZkEVMTimelock", deployer); + + const rollupCompatibilityID = 0; + const operation = genOperation( + polygonRollupManagerAddress, + 0, // value + PolgonRollupManagerFactory.interface.encodeFunctionData("addNewRollupType", [ + PolygonconsensusContract.target, + verifierAddress, + forkID, + rollupCompatibilityID, + genesis.root, + description, + ]), + ethers.ZeroHash, // predecesoor + salt // salt + ); + + // Schedule operation + const scheduleData = timelockContractFactory.interface.encodeFunctionData("schedule", [ + operation.target, + operation.value, + operation.data, + operation.predecessor, + operation.salt, + timelockDelay, + ]); + // Execute operation + const executeData = timelockContractFactory.interface.encodeFunctionData("execute", [ + operation.target, + operation.value, + operation.data, + operation.predecessor, + operation.salt, + ]); + + console.log({scheduleData}); + console.log({executeData}); + + outputJson.genesis = genesis.root; + outputJson.verifierAddress = verifierAddress; + outputJson.consensusContract = consensusContract; + outputJson.scheduleData = scheduleData; + outputJson.executeData = executeData; + + fs.writeFileSync(pathOutputJson, JSON.stringify(outputJson, null, 1)); +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); + +// OZ test functions +function genOperation(target: any, value: any, data: any, predecessor: any, salt: any) { + const id = ethers.solidityPackedKeccak256( + ["address", "uint256", "bytes", "uint256", "bytes32"], + [target, value, data, predecessor, salt] + ); + return { + id, + target, + value, + data, + predecessor, + salt, + }; +} diff --git a/tools/addRollupType/add_rollup_type.json b/tools/addRollupType/add_rollup_type.json new file mode 100644 index 000000000..bca0af8d6 --- /dev/null +++ b/tools/addRollupType/add_rollup_type.json @@ -0,0 +1,18 @@ +{ + "consensusContract": "PolygonZkEVMEtrog", + "polygonRollupManagerAddress": "0x5132A183E9F3CB7C848b0AAC5Ae0c4f0491B7aB2", + "polygonZkEVMBridgeAddress": "0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe", + "polygonZkEVMGlobalExitRootAddress": "0x580bda1e7A0CFAe92Fa7F6c20A3794F169CE3CFb", + "polTokenAddress": "0x455e53CBB86018Ac2B8092FdCd39d8444aFFC3F6", + "verifierAddress": "0x1C3A3da552b8662CD69538356b1E7c2E9CC1EBD8", + "description": "0.0.1", + "forkID": 7, + "rollupCompatibilityID": 0, + "timelockDelay": 0, + "timelockSalt": "", + "gasTokenAddress":"", + "deployerPvtKey": "", + "maxFeePerGas":"", + "maxPriorityFeePerGas":"", + "multiplierGas": "" +} diff --git a/tools/addRollupType/add_rollup_type.json.example b/tools/addRollupType/add_rollup_type.json.example new file mode 100644 index 000000000..bca0af8d6 --- /dev/null +++ b/tools/addRollupType/add_rollup_type.json.example @@ -0,0 +1,18 @@ +{ + "consensusContract": "PolygonZkEVMEtrog", + "polygonRollupManagerAddress": "0x5132A183E9F3CB7C848b0AAC5Ae0c4f0491B7aB2", + "polygonZkEVMBridgeAddress": "0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe", + "polygonZkEVMGlobalExitRootAddress": "0x580bda1e7A0CFAe92Fa7F6c20A3794F169CE3CFb", + "polTokenAddress": "0x455e53CBB86018Ac2B8092FdCd39d8444aFFC3F6", + "verifierAddress": "0x1C3A3da552b8662CD69538356b1E7c2E9CC1EBD8", + "description": "0.0.1", + "forkID": 7, + "rollupCompatibilityID": 0, + "timelockDelay": 0, + "timelockSalt": "", + "gasTokenAddress":"", + "deployerPvtKey": "", + "maxFeePerGas":"", + "maxPriorityFeePerGas":"", + "multiplierGas": "" +} diff --git a/tools/addRollupType/readme.md b/tools/addRollupType/readme.md new file mode 100644 index 000000000..1c8028335 --- /dev/null +++ b/tools/addRollupType/readme.md @@ -0,0 +1,54 @@ +## Requirements + +- node version: 14.x +- npm version: 7.x + +## Upgrade + +``` +npm i +cp .env.example .env +``` + +Fill `.env` with your `MNEMONIC` and `INFURA_PROJECT_ID` + +In order to upgrade the contracts we will need the information on `deployments/${network}_$(date +%s)` + +In project root, copy the `${network}.json` of the deployment that you want to upgrade and copy it on the `./.openzeppelin` +e.g. `cp deployments/${network}_$(date +%s)/${network}.json ./.openzeppelin` + +Then fill the upgrade parameters: + +``` +cd deployment +cp upgrade_parameters.json.example upgrade_parameters.json +``` + +Fill created `upgrade_parameters.json` with appropiate parameters. +You should fullfill the upgrades array, with all the updates that you intend to do ( more information in `upgrade-parameters.json` section) + +if the deployment was deployed without a timelock you can use the `simpleUpgradeScript.js`: + +- Run the script + +Otherwise, in case of timelock use `timeLockUpgrade.js` + +- Run the script +- Now the necessary transactions to interact with the timelock are printed in the screen `schedule` and `execute`, also will be saved in + `./upgrade_output_${new Date().getTime() / 1000}.json` file +- With the owner of the timelock (multisig or account), send the data printed by `schedule` to the `Timelock` contract. +- Once the necessary `timelockMinDelay` has expired, with the same account you can now send the data printed by `execute` to the `Timelock` contract and the contracts will be upgraded. + +## upgrade-parameters.json + +- `timelockMinDelay`: number, timelock delay between the schedule and execution, must be bigger than current min delay +- `upgrades`: Object, Indicates which address and to which implementation must upgrade + - address: address of the current proxy + - contractName: string, contract name that the proxy will be updated to + - constructorArgs: Array, optional, constructor arguments of the new implementation deployed + +### Optional Parameters + +- `multiplierGas`: number, Gas multiplier. If maxFeePerGas and maxPriorityFeePerGas are set, will not take effect +- `deployerPvtKey`: string, deployerPvtKey of the deployer +- `timelockSalt`: string, Optional salt for the timelock diff --git a/tools/createGenesis/generateGenesis.ts b/tools/createGenesis/generateGenesis.ts new file mode 100644 index 000000000..591c01396 --- /dev/null +++ b/tools/createGenesis/generateGenesis.ts @@ -0,0 +1,453 @@ +/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if, import/no-dynamic-require */ +/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved, no-restricted-syntax */ +import {expect} from "chai"; +import path = require("path"); +import fs = require("fs"); + +import * as dotenv from "dotenv"; +dotenv.config({path: path.resolve(__dirname, "../../.env")}); +import yargs from "yargs/yargs"; + +const argv = yargs(process.argv.slice(2)) + .options({ + out: {type: "string", default: "./new_genesis.json"}, + }) + .parse() as any; + +const DEFAULT_MNEMONIC = "test test test test test test test test test test test junk"; +process.env.HARDHAT_NETWORK = "hardhat"; +process.env.MNEMONIC = DEFAULT_MNEMONIC; +import {ethers, upgrades} from "hardhat"; +import {MemDB, ZkEVMDB, getPoseidon, smtUtils} from "@0xpolygonhermez/zkevm-commonjs"; + +import { + deployPolygonZkEVMDeployer, + create2Deployment, + getCreate2Address, +} from "../../deployment/helpers/deployment-helpers"; +import {ProxyAdmin} from "../../typechain-types"; +import {Addressable} from "ethers"; +import "../../deployment/helpers/utils"; + +const deployParameters = require("./deploy_parameters.json"); +const genesisBase = require("./genesis_base.json"); + +const pathOutputJson = path.join(__dirname, argv.out); + +/* + * bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; + * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; + */ +const _ADMIN_SLOT = "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" as any; +const _IMPLEMENTATION_SLOT = "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" as any; + +const baseGenesisInfo = genesisBase.genesis; + +// Genesis mainnet address: +const mainnetZkEVMDeployerAddress = baseGenesisInfo.find( + (account: any) => account.contractName === "PolygonZkEVMDeployer" +).address; + +const mainnetZkEVMTimelockAddress = baseGenesisInfo.find( + (account: any) => account.contractName === "PolygonZkEVMTimelock" +).address; + +const mainnetProxyAdminAddress = baseGenesisInfo.find((account: any) => account.contractName === "ProxyAdmin").address; + +const mainnetZkEVMBridgeImplementationAddress = baseGenesisInfo.find( + (account: any) => account.contractName === "PolygonZkEVMBridge implementation" +).address; + +const mainnetZkEVMBridgeProxyAddress = baseGenesisInfo.find( + (account: any) => account.contractName === "PolygonZkEVMBridge proxy" +).address; + +const mainnetGlobalExitRootL2ImplementationAddress = baseGenesisInfo.find( + (account: any) => account.contractName === "PolygonZkEVMGlobalExitRootL2 implementation" +).address; + +const keylessDeployerMainnet = baseGenesisInfo.find( + (account: any) => account.accountName === "keyless Deployer" +).address; + +const deployerMainnet = baseGenesisInfo.find((account: any) => account.accountName === "deployer").address; + +const mainnetMultisig = deployParameters.timelockAddress; +const mainnetInitialZkEVMDeployerOwner = deployParameters.initialZkEVMDeployerOwner; +const mainnetMinDelayTimelock = deployParameters.minDelayTimelock; + +const globalExitRootL2Address = "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa"; +const zkevmAddressL2 = ethers.ZeroAddress; + +async function main() { + // Constant variables + const attemptsDeployProxy = 20; + const balanceBrige = BigInt("0xffffffffffffffffffffffffffffffff"); // 128 bits // TODO review + + const finalGlobalExitRootL2ProxyAddress = globalExitRootL2Address; + const genesis = []; + + const timelockAdminAddress = mainnetMultisig; + const minDelayTimelock = mainnetMinDelayTimelock; + const salt = "0x0000000000000000000000000000000000000000000000000000000000000000"; // salt mock + const initialZkEVMDeployerOwner = mainnetInitialZkEVMDeployerOwner; + + const finalzkEVMDeployerAdress = mainnetZkEVMDeployerAddress; + const finalTimelockContractAdress = mainnetZkEVMTimelockAddress; + const finalProxyAdminAddress = mainnetProxyAdminAddress; + const finalBridgeImplAddress = mainnetZkEVMBridgeImplementationAddress; + const finalBridgeProxyAddress = mainnetZkEVMBridgeProxyAddress; + const finalGlobalExitRootL2ImplAddress = mainnetGlobalExitRootL2ImplementationAddress; + const finalKeylessDeployer = keylessDeployerMainnet; + const finalDeployer = deployerMainnet; + + let bridgeImplementationAddress; + let proxyBridgeAddress; + let proxyAdminAddress; + + // Load deployer + await ethers.provider.send("hardhat_impersonateAccount", [initialZkEVMDeployerOwner]); + await ethers.provider.send("hardhat_setBalance", [initialZkEVMDeployerOwner, "0xffffffffffffffff"]); // 18 ethers aprox + const deployer = await ethers.getSigner(initialZkEVMDeployerOwner); + + // Deploy PolygonZkEVMDeployer if is not deployed already + const [zkEVMDeployerContract, keylessDeployer] = await deployPolygonZkEVMDeployer( + initialZkEVMDeployerOwner, + deployer + ); + + /* + * Deploy Bridge + * Deploy admin --> implementation --> proxy + */ + + // Deploy proxy admin: + const proxyAdminFactory = await ethers.getContractFactory( + "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol:ProxyAdmin", + deployer + ); + const deployTransactionAdmin = (await proxyAdminFactory.getDeployTransaction()).data; + const dataCallAdmin = proxyAdminFactory.interface.encodeFunctionData("transferOwnership", [deployer.address]); + [proxyAdminAddress] = await create2Deployment( + zkEVMDeployerContract, + salt, + deployTransactionAdmin, + dataCallAdmin, + deployer, + null + ); + + // Deploy implementation PolygonZkEVMBridge + const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2", deployer); + const deployTransactionBridge = (await polygonZkEVMBridgeFactory.getDeployTransaction()).data; + // Mandatory to override the gasLimit since the estimation with create are mess up D: + const overrideGasLimit = BigInt(5500000); + [bridgeImplementationAddress] = await create2Deployment( + zkEVMDeployerContract, + salt, + deployTransactionBridge, + null, + deployer, + overrideGasLimit + ); + + // Do not initialize the bridge! + + /* + * deploy proxy + * Do not initialize directly the proxy since we want to deploy the same code on L2 and this will alter the bytecode deployed of the proxy + */ + const transparentProxyFactory = await ethers.getContractFactory( + "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol:TransparentUpgradeableProxy", + deployer + ); + const initializeEmptyDataProxy = "0x"; + const deployTransactionProxy = ( + await transparentProxyFactory.getDeployTransaction( + bridgeImplementationAddress as string, // must have bytecode + proxyAdminAddress as string, + initializeEmptyDataProxy + ) + ).data; + + [proxyBridgeAddress] = await create2Deployment( + zkEVMDeployerContract, + salt, + deployTransactionProxy, + null, + deployer, + null + ); + + // Import OZ manifest the deployed contracts, its enough to import just the proyx, the rest are imported automatically ( admin/impl) + await upgrades.forceImport(proxyBridgeAddress as string, polygonZkEVMBridgeFactory, "transparent" as any); + + /* + *Deployment Global exit root manager + */ + const PolygonZkEVMGlobalExitRootL2Factory = await ethers.getContractFactory( + "PolygonZkEVMGlobalExitRootL2", + deployer + ); + let polygonZkEVMGlobalExitRootL2; + for (let i = 0; i < attemptsDeployProxy; i++) { + try { + polygonZkEVMGlobalExitRootL2 = await upgrades.deployProxy(PolygonZkEVMGlobalExitRootL2Factory, [], { + initializer: false, + constructorArgs: [finalBridgeProxyAddress], + unsafeAllow: ["constructor", "state-variable-immutable"], + }); + break; + } catch (error: any) { + console.log(`attempt ${i}`); + console.log("upgrades.deployProxy of polygonZkEVMGlobalExitRootL2 ", error.message); + } + + // reach limits of attempts + if (i + 1 === attemptsDeployProxy) { + throw new Error("polygonZkEVMGlobalExitRootL2 contract has not been deployed"); + } + } + + // Assert admin address + expect(await upgrades.erc1967.getAdminAddress(polygonZkEVMGlobalExitRootL2?.target as string)).to.be.equal( + proxyAdminAddress + ); + expect(await upgrades.erc1967.getAdminAddress(proxyBridgeAddress as string)).to.be.equal(proxyAdminAddress); + + const timelockContractFactory = await ethers.getContractFactory("PolygonZkEVMTimelock", deployer); + const timelockContract = await timelockContractFactory.deploy( + minDelayTimelock, + [timelockAdminAddress], + [timelockAdminAddress], + timelockAdminAddress, + zkevmAddressL2 + ); + await timelockContract.waitForDeployment(); + + // Transfer ownership of the proxyAdmin to timelock + const proxyAdminInstance = proxyAdminFactory.attach(proxyAdminAddress as string) as ProxyAdmin; + await (await proxyAdminInstance.connect(deployer).transferOwnership(finalTimelockContractAdress as string)).wait(); + + // Recreate genesis with the current information: + + // ZKEVMDeployer + const zkEVMDeployerInfo = await getAddressInfo(zkEVMDeployerContract.target); + genesis.push({ + contractName: "PolygonZkEVMDeployer", + balance: "0", + nonce: zkEVMDeployerInfo.nonce.toString(), + address: finalzkEVMDeployerAdress, + bytecode: zkEVMDeployerInfo.bytecode, + storage: zkEVMDeployerInfo.storage, + }); + + // Proxy Admin + const proxyAdminInfo = await getAddressInfo(proxyAdminAddress as string); + genesis.push({ + contractName: "ProxyAdmin", + balance: "0", + nonce: proxyAdminInfo.nonce.toString(), + address: finalProxyAdminAddress, + bytecode: proxyAdminInfo.bytecode, + storage: proxyAdminInfo.storage, + }); + + // Bridge implementation + const bridgeImplementationInfo = await getAddressInfo(bridgeImplementationAddress as string); + genesis.push({ + contractName: "PolygonZkEVMBridge implementation", + balance: "0", + nonce: bridgeImplementationInfo.nonce.toString(), + address: finalBridgeImplAddress, + bytecode: bridgeImplementationInfo.bytecode, + // storage: bridgeImplementationInfo.storage, implementation do not have storage + }); + + // Bridge proxy + const bridgeProxyInfo = await getAddressInfo(proxyBridgeAddress as string); + // Override admin and implementation slots: + bridgeProxyInfo.storage[_ADMIN_SLOT] = ethers.zeroPadValue(finalProxyAdminAddress as string, 32); + bridgeProxyInfo.storage[_IMPLEMENTATION_SLOT] = ethers.zeroPadValue(finalBridgeImplAddress as string, 32); + + genesis.push({ + contractName: "PolygonZkEVMBridge proxy", + balance: balanceBrige, + nonce: bridgeProxyInfo.nonce.toString(), + address: finalBridgeProxyAddress, + bytecode: bridgeProxyInfo.bytecode, + storage: bridgeProxyInfo.storage, + }); + + // polygonZkEVMGlobalExitRootL2 implementation + const implGlobalExitRootL2 = await upgrades.erc1967.getImplementationAddress( + polygonZkEVMGlobalExitRootL2?.target as string + ); + const implGlobalExitRootL2Info = await getAddressInfo(implGlobalExitRootL2); + + genesis.push({ + contractName: "PolygonZkEVMGlobalExitRootL2 implementation", + balance: "0", + nonce: implGlobalExitRootL2Info.nonce.toString(), + address: finalGlobalExitRootL2ImplAddress, + bytecode: implGlobalExitRootL2Info.bytecode, + // storage: implGlobalExitRootL2Info.storage, , implementation do not have storage + }); + + // polygonZkEVMGlobalExitRootL2 proxy + const proxyGlobalExitRootL2Info = await getAddressInfo(polygonZkEVMGlobalExitRootL2?.target as string); + + proxyGlobalExitRootL2Info.storage[_ADMIN_SLOT] = ethers.zeroPadValue(finalProxyAdminAddress as string, 32); + proxyGlobalExitRootL2Info.storage[_IMPLEMENTATION_SLOT] = ethers.zeroPadValue( + finalGlobalExitRootL2ImplAddress as string, + 32 + ); + + genesis.push({ + contractName: "PolygonZkEVMGlobalExitRootL2 proxy", + balance: "0", + nonce: proxyGlobalExitRootL2Info.nonce.toString(), + address: finalGlobalExitRootL2ProxyAddress, + bytecode: proxyGlobalExitRootL2Info.bytecode, + storage: proxyGlobalExitRootL2Info.storage, + }); + + // Timelock + const timelockInfo = await getAddressInfo(timelockContract.target); + + /* + * Since roles are used, most storage are writted in peusdoRandom storage slots + * bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256("TIMELOCK_ADMIN_ROLE"); + * bytes32 public constant PROPOSER_ROLE = keccak256("PROPOSER_ROLE"); + * bytes32 public constant EXECUTOR_ROLE = keccak256("EXECUTOR_ROLE"); + * bytes32 public constant CANCELLER_ROLE = keccak256("CANCELLER_ROLE"); + */ + const timelockRolesHash = [ + ethers.id("TIMELOCK_ADMIN_ROLE"), + ethers.id("PROPOSER_ROLE"), + ethers.id("EXECUTOR_ROLE"), + ethers.id("CANCELLER_ROLE"), + ]; + + for (let i = 0; i < timelockRolesHash.length; i++) { + const rolesMappingStoragePositionStruct = 0; + const storagePosition = ethers.solidityPackedKeccak256( + ["uint256", "uint256"], + [timelockRolesHash[i], rolesMappingStoragePositionStruct] + ); + + // check timelock address manager, and timelock address itself + const addressArray = [timelockAdminAddress, timelockContract.target]; + for (let j = 0; j < addressArray.length; j++) { + const storagePositionRole = ethers.solidityPackedKeccak256( + ["uint256", "uint256"], + [addressArray[j], storagePosition] + ); + const valueRole = await ethers.provider.getStorage(timelockContract.target, storagePositionRole); + if (valueRole !== "0x0000000000000000000000000000000000000000000000000000000000000000") { + timelockInfo.storage[storagePositionRole] = valueRole; + } + } + const roleAdminSlot = ethers.zeroPadValue(ethers.toQuantity(ethers.toBigInt(storagePosition) + 1n), 32); + const valueRoleAdminSlot = await ethers.provider.getStorage(timelockContract.target, roleAdminSlot); + if (valueRoleAdminSlot !== "0x0000000000000000000000000000000000000000000000000000000000000000") { + timelockInfo.storage[roleAdminSlot] = valueRoleAdminSlot; + } + } + + genesis.push({ + contractName: "PolygonZkEVMTimelock", + balance: "0", + nonce: timelockInfo.nonce.toString(), + address: finalTimelockContractAdress, + bytecode: timelockInfo.bytecode, + storage: timelockInfo.storage, + }); + + // Put nonces on deployers + + // Keyless deployer + genesis.push({ + accountName: "keyless Deployer", + balance: "0", + nonce: "1", + address: finalKeylessDeployer, + }); + + // deployer + const deployerInfo = await getAddressInfo(deployer.address); + genesis.push({ + accountName: "deployer", + balance: "0", + nonce: deployerInfo.nonce.toString(), + address: finalDeployer, + }); + + if (deployParameters.test) { + // Add tester account with ether + genesis[genesis.length - 1].balance = "100000000000000000000000"; + } + + // calculate root + const poseidon = await getPoseidon(); + const {F} = poseidon; + const db = new MemDB(F); + const genesisRoot = [F.zero, F.zero, F.zero, F.zero]; + const accHashInput = [F.zero, F.zero, F.zero, F.zero]; + const defaultChainId = 1000; + + const zkEVMDB = await ZkEVMDB.newZkEVM( + db, + poseidon, + genesisRoot, + accHashInput, + genesis, + null, + null, + defaultChainId + ); + + fs.writeFileSync( + pathOutputJson, + JSON.stringify( + { + root: smtUtils.h4toString(zkEVMDB.stateRoot), + genesis, + }, + null, + 1 + ) + ); +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); + +async function getAddressInfo(address: string | Addressable) { + const nonce = await ethers.provider.getTransactionCount(address); + const bytecode = await ethers.provider.getCode(address); + + const storage = {} as { + [key: string]: number | string; + }; + + for (let i = 0; i < 200; i++) { + const storageValue = await ethers.provider.getStorage(address, i); + if (storageValue !== "0x0000000000000000000000000000000000000000000000000000000000000000") { + storage[ethers.toBeHex(i, 32)] = storageValue; + } + } + + const valueAdminSlot = await ethers.provider.getStorage(address, _ADMIN_SLOT); + if (valueAdminSlot !== "0x0000000000000000000000000000000000000000000000000000000000000000") { + storage[_ADMIN_SLOT] = valueAdminSlot; + } + const valuImplementationSlot = await ethers.provider.getStorage(address, _IMPLEMENTATION_SLOT); + if (valuImplementationSlot !== "0x0000000000000000000000000000000000000000000000000000000000000000") { + storage[_IMPLEMENTATION_SLOT] = valuImplementationSlot; + } + + return {nonce, bytecode, storage}; +} diff --git a/tools/createGenesis/genesis_base.json b/tools/createGenesis/genesis_base.json new file mode 100644 index 000000000..24a6ff953 --- /dev/null +++ b/tools/createGenesis/genesis_base.json @@ -0,0 +1,95 @@ +{ + "root": "0x3f86b09b43e3e49a41fc20a07579b79eba044253367817d5c241d23c0e2bc5c9", + "genesis": [ + { + "contractName": "PolygonZkEVMDeployer", + "balance": "0", + "nonce": "4", + "address": "0xCB19eDdE626906eB1EE52357a27F62dd519608C2", + "bytecode": "0x6080604052600436106100705760003560e01c8063715018a61161004e578063715018a6146100e65780638da5cb5b146100fb578063e11ae6cb14610126578063f2fde38b1461013957600080fd5b80632b79805a146100755780634a94d4871461008a5780636d07dbf81461009d575b600080fd5b610088610083366004610927565b610159565b005b6100886100983660046109c7565b6101cb565b3480156100a957600080fd5b506100bd6100b8366004610a1e565b61020d565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b50610088610220565b34801561010757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166100bd565b610088610134366004610a40565b610234565b34801561014557600080fd5b50610088610154366004610a90565b61029b565b610161610357565b600061016e8585856103d8565b905061017a8183610537565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a15050505050565b6101d3610357565b6101de83838361057b565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b90600090a1505050565b600061021983836105a9565b9392505050565b610228610357565b61023260006105b6565b565b61023c610357565b60006102498484846103d8565b60405173ffffffffffffffffffffffffffffffffffffffff821681529091507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a150505050565b6102a3610357565b73ffffffffffffffffffffffffffffffffffffffff811661034b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610354816105b6565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610232576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610342565b600083471015610444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610342565b81516000036104af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610342565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116610219576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610342565b6060610219838360006040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c6564000081525061062b565b60606105a1848484604051806060016040528060298152602001610b3d6029913961062b565b949350505050565b6000610219838330610744565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156106bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610342565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516106e69190610acf565b60006040518083038185875af1925050503d8060008114610723576040519150601f19603f3d011682016040523d82523d6000602084013e610728565b606091505b50915091506107398783838761076e565b979650505050505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b606083156108045782516000036107fd5773ffffffffffffffffffffffffffffffffffffffff85163b6107fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610342565b50816105a1565b6105a183838151156108195781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103429190610aeb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261088d57600080fd5b813567ffffffffffffffff808211156108a8576108a861084d565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156108ee576108ee61084d565b8160405283815286602085880101111561090757600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806080858703121561093d57600080fd5b8435935060208501359250604085013567ffffffffffffffff8082111561096357600080fd5b61096f8883890161087c565b9350606087013591508082111561098557600080fd5b506109928782880161087c565b91505092959194509250565b803573ffffffffffffffffffffffffffffffffffffffff811681146109c257600080fd5b919050565b6000806000606084860312156109dc57600080fd5b6109e58461099e565b9250602084013567ffffffffffffffff811115610a0157600080fd5b610a0d8682870161087c565b925050604084013590509250925092565b60008060408385031215610a3157600080fd5b50508035926020909101359150565b600080600060608486031215610a5557600080fd5b8335925060208401359150604084013567ffffffffffffffff811115610a7a57600080fd5b610a868682870161087c565b9150509250925092565b600060208284031215610aa257600080fd5b6102198261099e565b60005b83811015610ac6578181015183820152602001610aae565b50506000910152565b60008251610ae1818460208701610aab565b9190910192915050565b6020815260008251806020840152610b0a816040850160208701610aab565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a26469706673582212203e70ce334e8ec9d8d03e87415afd36dce4e82633bd277b08937095a6bd66367764736f6c63430008110033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000004c1665d6651ecefa59b9b3041951608468b18891" + } + }, + { + "contractName": "ProxyAdmin", + "balance": "0", + "nonce": "1", + "address": "0x0F99738B2Fc14D77308337f3e2596b63aE7BCC4A", + "bytecode": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461012b57806399a88ec41461013e578063f2fde38b1461015e578063f3b7dead1461017e57600080fd5b8063204e1c7a14610080578063715018a6146100c95780637eff275e146100e05780638da5cb5b14610100575b600080fd5b34801561008c57600080fd5b506100a061009b366004610608565b61019e565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100d557600080fd5b506100de610255565b005b3480156100ec57600080fd5b506100de6100fb36600461062c565b610269565b34801561010c57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166100a0565b6100de610139366004610694565b6102f7565b34801561014a57600080fd5b506100de61015936600461062c565b61038c565b34801561016a57600080fd5b506100de610179366004610608565b6103e8565b34801561018a57600080fd5b506100a0610199366004610608565b6104a4565b60008060008373ffffffffffffffffffffffffffffffffffffffff166040516101ea907f5c60da1b00000000000000000000000000000000000000000000000000000000815260040190565b600060405180830381855afa9150503d8060008114610225576040519150601f19603f3d011682016040523d82523d6000602084013e61022a565b606091505b50915091508161023957600080fd5b8080602001905181019061024d9190610788565b949350505050565b61025d6104f0565b6102676000610571565b565b6102716104f0565b6040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690638f283970906024015b600060405180830381600087803b1580156102db57600080fd5b505af11580156102ef573d6000803e3d6000fd5b505050505050565b6102ff6104f0565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef28690349061035590869086906004016107a5565b6000604051808303818588803b15801561036e57600080fd5b505af1158015610382573d6000803e3d6000fd5b5050505050505050565b6103946104f0565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690633659cfe6906024016102c1565b6103f06104f0565b73ffffffffffffffffffffffffffffffffffffffff8116610498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6104a181610571565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff166040516101ea907ff851a44000000000000000000000000000000000000000000000000000000000815260040190565b60005473ffffffffffffffffffffffffffffffffffffffff163314610267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161048f565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff811681146104a157600080fd5b60006020828403121561061a57600080fd5b8135610625816105e6565b9392505050565b6000806040838503121561063f57600080fd5b823561064a816105e6565b9150602083013561065a816105e6565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156106a957600080fd5b83356106b4816105e6565b925060208401356106c4816105e6565b9150604084013567ffffffffffffffff808211156106e157600080fd5b818601915086601f8301126106f557600080fd5b81358181111561070757610707610665565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561074d5761074d610665565b8160405282815289602084870101111561076657600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b60006020828403121561079a57600080fd5b8151610625816105e6565b73ffffffffffffffffffffffffffffffffffffffff8316815260006020604081840152835180604085015260005b818110156107ef578581018301518582016060015282016107d3565b5060006060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050939250505056fea2646970667358221220372a0e10eebea1b7fa43ae4c976994e6ed01d85eedc3637b83f01d3f06be442064736f6c63430008110033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000bba0935fa93eb23de7990b47f0d96a8f75766d13" + } + }, + { + "contractName": "PolygonZkEVMBridge implementation", + "balance": "0", + "nonce": "1", + "address": "0x5ac4182A1dd41AeEf465E40B82fd326BF66AB82C", + "bytecode": "0x6080604052600436106200019f5760003560e01c8063647c576c11620000e7578063be5831c71162000089578063dbc169761162000060578063dbc169761462000639578063ee25560b1462000651578063fb570834146200068257600080fd5b8063be5831c714620005ae578063cd58657914620005ea578063d02103ca146200060157600080fd5b80639e34070f11620000be5780639e34070f146200050a578063aaa13cc2146200054f578063bab161bf146200057457600080fd5b8063647c576c146200048657806379e2cf9714620004ab57806381b1c17414620004c357600080fd5b80632d2c9d94116200015157806334ac9cf2116200012857806334ac9cf2146200034b5780633ae05047146200037a5780633e197043146200039257600080fd5b80632d2c9d9414620002765780632dfdf0b5146200029b578063318aee3d14620002c257600080fd5b806322e95f2c116200018657806322e95f2c14620001ef578063240ff378146200023a5780632cffd02e146200025157600080fd5b806315064c9614620001a45780632072f6c514620001d5575b600080fd5b348015620001b157600080fd5b50606854620001c09060ff1681565b60405190151581526020015b60405180910390f35b348015620001e257600080fd5b50620001ed620006a7565b005b348015620001fc57600080fd5b50620002146200020e366004620032db565b62000705565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001cc565b620001ed6200024b36600462003372565b620007a8565b3480156200025e57600080fd5b50620001ed6200027036600462003409565b620009d0565b3480156200028357600080fd5b50620001ed6200029536600462003409565b62000f74565b348015620002a857600080fd5b50620002b360535481565b604051908152602001620001cc565b348015620002cf57600080fd5b5062000319620002e1366004620034ef565b606b6020526000908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001cc565b3480156200035857600080fd5b50606c54620002149073ffffffffffffffffffffffffffffffffffffffff1681565b3480156200038757600080fd5b50620002b362001178565b3480156200039f57600080fd5b50620002b3620003b136600462003526565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200049357600080fd5b50620001ed620004a5366004620035b0565b6200125e565b348015620004b857600080fd5b50620001ed620014ad565b348015620004d057600080fd5b5062000214620004e236600462003600565b606a6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200051757600080fd5b50620001c06200052936600462003600565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b3480156200055c57600080fd5b50620002146200056e3660046200361a565b620014e7565b3480156200058157600080fd5b506068546200059890610100900463ffffffff1681565b60405163ffffffff9091168152602001620001cc565b348015620005bb57600080fd5b506068546200059890790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001ed620005fb366004620036ce565b620016d3565b3480156200060e57600080fd5b50606854620002149065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200064657600080fd5b50620001ed62001c37565b3480156200065e57600080fd5b50620002b36200067036600462003600565b60696020526000908152604090205481565b3480156200068f57600080fd5b50620001c0620006a136600462003770565b62001c93565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006f9576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200070362001d7c565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091206000908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007e6576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8681166101009092041614806200080c5750600263ffffffff861610155b1562000844576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff163388883488886053546040516200089a9998979695949392919062003806565b60405180910390a1620009b8620009b26001606860019054906101000a900463ffffffff16338989348989604051620008d592919062003881565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b62001e10565b8215620009c957620009c962001f27565b5050505050565b60685460ff161562000a0e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000a258b8b8b8b8b8b8b8b8b8b8b600062001ffc565b73ffffffffffffffffffffffffffffffffffffffff861662000b01576040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a7a9190620038e6565b60006040518083038185875af1925050503d806000811462000ab9576040519150601f19603f3d011682016040523d82523d6000602084013e62000abe565b606091505b505090508062000afa576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000efc565b60685463ffffffff61010090910481169088160362000b435762000b3d73ffffffffffffffffffffffffffffffffffffffff87168585620021ed565b62000efc565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b166024820152600090603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e6e576000808062000c1886880188620039fb565b92509250925060008584848460405162000c329062003292565b62000c409392919062003abd565b8190604051809103906000f590508015801562000c61573d6000803e3d6000fd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f1990604401600060405180830381600087803b15801562000cd757600080fd5b505af115801562000cec573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e5c95949392919062003afa565b60405180910390a15050505062000ef9565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f1990604401600060405180830381600087803b15801562000edf57600080fd5b505af115801562000ef4573d6000803e3d6000fd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000fb2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000fc98b8b8b8b8b8b8b8b8b8b8b600162001ffc565b60008473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000ffc949392919062003b42565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200107f9190620038e6565b60006040518083038185875af1925050503d8060008114620010be576040519150601f19603f3d011682016040523d82523d6000602084013e620010c3565b606091505b5050905080620010ff576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b605354600090819081805b602081101562001255578083901c600116600103620011e65760338160208110620011b257620011b262003b8a565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062001213565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806200124c9062003be8565b91505062001183565b50919392505050565b600054610100900460ff16158080156200127f5750600054600160ff909116105b806200129b5750303b1580156200129b575060005460ff166001145b6200132d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200138c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001691841691909117905562001443620022c3565b8015620014a757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff16101562000703576200070362001f27565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201526000908190603801604051602081830303815290604052805190602001209050600060ff60f81b3083604051806020016200157d9062003292565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620015c8908d908d908d908d908d9060200162003c23565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001606929160200162003c64565b604051602081830303815290604052805190602001206040516020016200168f94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff161562001711576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200171b62002366565b60685463ffffffff888116610100909204161480620017415750600263ffffffff881610155b1562001779576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060608773ffffffffffffffffffffffffffffffffffffffff8816620017df57883414620017d5576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000925062001ad9565b341562001818576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089166000908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901562001908576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac90604401600060405180830381600087803b158015620018db57600080fd5b505af1158015620018f0573d6000803e3d6000fd5b50505050806020015194508060000151935062001ad7565b85156200191d576200191d898b8989620023db565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200198b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620019b1919062003c97565b9050620019d773ffffffffffffffffffffffffffffffffffffffff8b1633308e620028f9565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa15801562001a45573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a6b919062003c97565b905062001a79828262003cb1565b6068548c9850610100900463ffffffff169650935062001a998762002959565b62001aa48c62002a71565b62001aaf8d62002b7e565b60405160200162001ac39392919062003abd565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e868860535460405162001b1b98979695949392919062003cc7565b60405180910390a162001c0f620009b2600085878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b861562001c205762001c2062001f27565b5050505062001c2e60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c89576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200070362002c80565b600084815b602081101562001d6e57600163ffffffff8616821c8116900362001d0a5785816020811062001ccb5762001ccb62003b8a565b60200201358260405160200162001cec929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001d59565b8186826020811062001d205762001d2062003b8a565b602002013560405160200162001d40929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d658162003be8565b91505062001c98565b50821490505b949350505050565b60685460ff161562001dba576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b80600162001e216020600262003e79565b62001e2d919062003cb1565b6053541062001e68576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060536000815462001e7b9062003be8565b9182905550905060005b602081101562001f17578082901c60011660010362001ebd57826033826020811062001eb55762001eb562003b8a565b015550505050565b6033816020811062001ed35762001ed362003b8a565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001f0e9062003be8565b91505062001e85565b5062001f2262003e87565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001fad62001178565b6040518263ffffffff1660e01b815260040162001fcc91815260200190565b600060405180830381600087803b15801562001fe757600080fd5b505af1158015620014a7573d6000803e3d6000fd5b6200200d8b63ffffffff1662002d10565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b363200000000000000000000000000000000000000000000000000000000909252606481019190915260009165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303816000875af1158015620020b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620020d6919062003c97565b90508060000362002112576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff88811661010090920416146200215c576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606854600090610100900463ffffffff166200217a5750896200217d565b508a5b620021a66200219d848c8c8c8c8c8c8c604051620008d592919062003881565b8f8f8462001c93565b620021dd576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001f229084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002d75565b600054610100900460ff166200235c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001324565b6200070362002e88565b600260015403620023d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001324565b6002600155565b6000620023ec600482848662003eb6565b620023f79162003ee2565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620026765760008080808080806200245a896004818d62003eb6565b81019062002469919062003f2b565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614620024dd576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff861630146200252d576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002567576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620026229190620038e6565b6000604051808303816000865af19150503d806000811462002661576040519150601f19603f3d011682016040523d82523d6000602084013e62002666565b606091505b50505050505050505050620009c9565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c0000000000000000000000000000000000000000000000000000000014620026f2576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808080808080806200270a8a6004818e62003eb6565b81019062002719919062003f86565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146200278f576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87163014620027df576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f1691620028a39190620038e6565b6000604051808303816000865af19150503d8060008114620028e2576040519150601f19603f3d011682016040523d82523d6000602084013e620028e7565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014a79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002240565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde03000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff861691620029dd9190620038e6565b600060405180830381855afa9150503d806000811462002a1a576040519150601f19603f3d011682016040523d82523d6000602084013e62002a1f565b606091505b50915091508162002a66576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d74565b62001d748162002f21565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff86169162002af59190620038e6565b600060405180830381855afa9150503d806000811462002b32576040519150601f19603f3d011682016040523d82523d6000602084013e62002b37565b606091505b50915091508162002a66576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d74565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff86169162002c019190620038e6565b600060405180830381855afa9150503d806000811462002c3e576040519150601f19603f3d011682016040523d82523d6000602084013e62002c43565b606091505b509150915081801562002c57575080516020145b62002c6457601262001d74565b8080602001905181019062001d74919062004012565b60018055565b60685460ff1662002cbd576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600881901c60008181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009c9576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600062002dd9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031119092919063ffffffff16565b80519091501562001f22578080602001905181019062002dfa919062004032565b62001f22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001324565b600054610100900460ff1662002c7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162001324565b6060604082511062002f435781806020019051810190620007a2919062004052565b8151602003620030d35760005b60208110801562002f9b575082818151811062002f715762002f7162003b8a565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002fb6578062002fad8162003be8565b91505062002f50565b8060000362002ffa57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111562003018576200301862003891565b6040519080825280601f01601f19166020018201604052801562003043576020820181803683370190505b50905060005b82811015620030cb5784818151811062003067576200306762003b8a565b602001015160f81c60f81b82828151811062003087576200308762003b8a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080620030c28162003be8565b91505062003049565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d748484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051620031489190620038e6565b60006040518083038185875af1925050503d806000811462003187576040519150601f19603f3d011682016040523d82523d6000602084013e6200318c565b606091505b50915091506200319f87838387620031aa565b979650505050505050565b60608315620032455782516000036200323d5773ffffffffffffffffffffffffffffffffffffffff85163b6200323d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001324565b508162001d74565b62001d7483838151156200325c5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620013249190620040d2565b611b6680620040e883390190565b803563ffffffff811681146200310c57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620032d857600080fd5b50565b60008060408385031215620032ef57600080fd5b620032fa83620032a0565b915060208301356200330c81620032b5565b809150509250929050565b8015158114620032d857600080fd5b60008083601f8401126200333957600080fd5b50813567ffffffffffffffff8111156200335257600080fd5b6020830191508360208285010111156200336b57600080fd5b9250929050565b6000806000806000608086880312156200338b57600080fd5b6200339686620032a0565b94506020860135620033a881620032b5565b93506040860135620033ba8162003317565b9250606086013567ffffffffffffffff811115620033d757600080fd5b620033e58882890162003326565b969995985093965092949392505050565b806104008101831015620007a257600080fd5b60008060008060008060008060008060006105208c8e0312156200342c57600080fd5b620034388d8d620033f6565b9a50620034496104008d01620032a0565b99506104208c013598506104408c013597506200346a6104608d01620032a0565b96506104808c01356200347d81620032b5565b95506200348e6104a08d01620032a0565b94506104c08c0135620034a181620032b5565b93506104e08c013592506105008c013567ffffffffffffffff811115620034c757600080fd5b620034d58e828f0162003326565b915080935050809150509295989b509295989b9093969950565b6000602082840312156200350257600080fd5b81356200350f81620032b5565b9392505050565b60ff81168114620032d857600080fd5b600080600080600080600060e0888a0312156200354257600080fd5b87356200354f8162003516565b96506200355f60208901620032a0565b955060408801356200357181620032b5565b94506200358160608901620032a0565b935060808801356200359381620032b5565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215620035c657600080fd5b620035d184620032a0565b92506020840135620035e381620032b5565b91506040840135620035f581620032b5565b809150509250925092565b6000602082840312156200361357600080fd5b5035919050565b600080600080600080600060a0888a0312156200363657600080fd5b6200364188620032a0565b965060208801356200365381620032b5565b9550604088013567ffffffffffffffff808211156200367157600080fd5b6200367f8b838c0162003326565b909750955060608a01359150808211156200369957600080fd5b50620036a88a828b0162003326565b9094509250506080880135620036be8162003516565b8091505092959891949750929550565b600080600080600080600060c0888a031215620036ea57600080fd5b620036f588620032a0565b965060208801356200370781620032b5565b95506040880135945060608801356200372081620032b5565b93506080880135620037328162003317565b925060a088013567ffffffffffffffff8111156200374f57600080fd5b6200375d8a828b0162003326565b989b979a50959850939692959293505050565b60008060008061046085870312156200378857600080fd5b843593506200379b8660208701620033f6565b9250620037ac6104208601620032a0565b939692955092936104400135925050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600061010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620038678285018789620037bd565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b83811015620038dd578181015183820152602001620038c3565b50506000910152565b60008251620038fa818460208701620038c0565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156200394e576200394e62003891565b604052919050565b600067ffffffffffffffff82111562003973576200397362003891565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112620039b157600080fd5b8135620039c8620039c28262003956565b62003904565b818152846020838601011115620039de57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562003a1157600080fd5b833567ffffffffffffffff8082111562003a2a57600080fd5b62003a38878388016200399f565b9450602086013591508082111562003a4f57600080fd5b5062003a5e868287016200399f565b9250506040840135620035f58162003516565b6000815180845262003a8b816020860160208601620038c0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60608152600062003ad2606083018662003a71565b828103602084015262003ae6818662003a71565b91505060ff83166040830152949350505050565b63ffffffff86168152600073ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200319f608083018486620037bd565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff8416602082015260606040820152600062003b80606083018486620037bd565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003c1c5762003c1c62003bb9565b5060010190565b60608152600062003c39606083018789620037bd565b828103602084015262003c4e818688620037bd565b91505060ff831660408301529695505050505050565b6000835162003c78818460208801620038c0565b83519083019062003c8e818360208801620038c0565b01949350505050565b60006020828403121562003caa57600080fd5b5051919050565b81810381811115620007a257620007a262003bb9565b600061010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003d278285018762003a71565b925080851660e085015250509998505050505050505050565b600181815b8085111562003d9f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d835762003d8362003bb9565b8085161562003d9157918102915b93841c939080029062003d45565b509250929050565b60008262003db857506001620007a2565b8162003dc757506000620007a2565b816001811462003de0576002811462003deb5762003e0b565b6001915050620007a2565b60ff84111562003dff5762003dff62003bb9565b50506001821b620007a2565b5060208310610133831016604e8410600b841016171562003e30575081810a620007a2565b62003e3c838362003d40565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003e715762003e7162003bb9565b029392505050565b60006200350f838362003da7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000808585111562003ec757600080fd5b8386111562003ed557600080fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003f235780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a03121562003f4757600080fd5b873562003f5481620032b5565b9650602088013562003f6681620032b5565b955060408801359450606088013593506080880135620035938162003516565b600080600080600080600080610100898b03121562003fa457600080fd5b883562003fb181620032b5565b9750602089013562003fc381620032b5565b96506040890135955060608901359450608089013562003fe38162003317565b935060a089013562003ff58162003516565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200402557600080fd5b81516200350f8162003516565b6000602082840312156200404557600080fd5b81516200350f8162003317565b6000602082840312156200406557600080fd5b815167ffffffffffffffff8111156200407d57600080fd5b8201601f810184136200408f57600080fd5b8051620040a0620039c28262003956565b818152856020838501011115620040b657600080fd5b620040c9826020830160208601620038c0565b95945050505050565b6020815260006200350f602083018462003a7156fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a2646970667358221220d9b3ca7b13ec80ac58634ddf0ecebe71e209a71f532614949b9e720413f50c8364736f6c63430008110033" + }, + { + "contractName": "PolygonZkEVMBridge proxy", + "balance": "200000000000000000000000000", + "nonce": "1", + "address": "0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe", + "bytecode": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100a85780638f283970146100e6578063f851a440146101065761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61011b565b005b61006b61011b565b34801561008157600080fd5b5061006b61009036600461088b565b610135565b61006b6100a33660046108a6565b61017f565b3480156100b457600080fd5b506100bd6101f3565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b5061006b61010136600461088b565b610231565b34801561011257600080fd5b506100bd61025e565b6101236102d4565b61013361012e6103ab565b6103b5565b565b61013d6103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481604051806020016040528060008152506000610419565b50565b61017461011b565b6101876103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101eb576101e68383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250610419915050565b505050565b6101e661011b565b60006101fd6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103ab565b905090565b61022e61011b565b90565b6102396103d9565b73ffffffffffffffffffffffffffffffffffffffff1633036101775761017481610444565b60006102686103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610226576102216103d9565b60606102b183836040518060600160405280602781526020016109bb602791396104a5565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6102dc6103d9565b73ffffffffffffffffffffffffffffffffffffffff163303610133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600061022161052a565b3660008037600080366000845af43d6000803e8080156103d4573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b61042283610552565b60008251118061042f5750805b156101e65761043e838361028c565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61046d6103d9565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a16101748161059f565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516104cf919061094d565b600060405180830381855af49150503d806000811461050a576040519150601f19603f3d011682016040523d82523d6000602084013e61050f565b606091505b5091509150610520868383876106ab565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103fd565b61055b81610753565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b73ffffffffffffffffffffffffffffffffffffffff8116610642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103a2565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b6060831561074157825160000361073a5773ffffffffffffffffffffffffffffffffffffffff85163b61073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103a2565b508161074b565b61074b838361081e565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff81163b6107f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e74726163740000000000000000000000000000000000000060648201526084016103a2565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610665565b81511561082e5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a29190610969565b803573ffffffffffffffffffffffffffffffffffffffff8116811461088657600080fd5b919050565b60006020828403121561089d57600080fd5b6102b182610862565b6000806000604084860312156108bb57600080fd5b6108c484610862565b9250602084013567ffffffffffffffff808211156108e157600080fd5b818601915086601f8301126108f557600080fd5b81358181111561090457600080fd5b87602082850101111561091657600080fd5b6020830194508093505050509250925092565b60005b8381101561094457818101518382015260200161092c565b50506000910152565b6000825161095f818460208701610929565b9190910192915050565b6020815260008251806020840152610988816040850160208701610929565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220a1af0d6cb4f1e31496a4c5c1448913bce4bd6ad3a39e47c6f7190c114d6f9bf464736f6c63430008110033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000068": "0x00000000000000a40d5f56745a118d0906a34e69aec8c0db1cb8fa0000000100", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x0000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000005ac4182a1dd41aeef465e40b82fd326bf66ab82c" + } + }, + { + "contractName": "PolygonZkEVMGlobalExitRootL2 implementation", + "balance": "0", + "nonce": "1", + "address": "0x0200143Fa295EE4dffEF22eE2616c2E008D81688", + "bytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806301fd904414610051578063257b36321461006d57806333d6247d1461008d578063a3c573eb146100a2575b600080fd5b61005a60015481565b6040519081526020015b60405180910390f35b61005a61007b366004610162565b60006020819052908152604090205481565b6100a061009b366004610162565b6100ee565b005b6100c97f0000000000000000000000002a3dd3eb832af982ec71669e178424b10dca2ede81565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610064565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000002a3dd3eb832af982ec71669e178424b10dca2ede161461015d576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b60006020828403121561017457600080fd5b503591905056fea2646970667358221220a187fc278346c1b61c449ea3641002b6eac2bda3351a122a12c35099f933696864736f6c63430008110033" + }, + { + "contractName": "PolygonZkEVMGlobalExitRootL2 proxy", + "balance": "0", + "nonce": "1", + "address": "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa", + "bytecode": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106ca565b610118565b61005b6100933660046106e5565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106ca565b61020b565b3480156100f557600080fd5b506100ad610235565b610106610292565b610116610111610331565b61033b565b565b61012061035f565b6001600160a01b0316336001600160a01b031614156101575761015481604051806020016040528060008152506000610392565b50565b6101546100fe565b61016761035f565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250610392915050565b505050565b6101c36100fe565b60006101da61035f565b6001600160a01b0316336001600160a01b03161415610200576101fb610331565b905090565b6102086100fe565b90565b61021361035f565b6001600160a01b0316336001600160a01b0316141561015757610154816103f1565b600061023f61035f565b6001600160a01b0316336001600160a01b03161415610200576101fb61035f565b606061028583836040518060600160405280602781526020016107e460279139610445565b9392505050565b3b151590565b61029a61035f565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb610519565b3660008037600080366000845af43d6000803e80801561035a573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b61039b83610541565b6040516001600160a01b038416907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a26000825111806103dc5750805b156101c3576103eb8383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61041a61035f565b604080516001600160a01b03928316815291841660208301520160405180910390a1610154816105e9565b6060833b6104a45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610328565b600080856001600160a01b0316856040516104bf9190610794565b600060405180830381855af49150503d80600081146104fa576040519150601f19603f3d011682016040523d82523d6000602084013e6104ff565b606091505b509150915061050f828286610675565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610383565b803b6105a55760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610328565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b03811661064e5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610328565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61036105c8565b60608315610684575081610285565b8251156106945782518084602001fd5b8160405162461bcd60e51b815260040161032891906107b0565b80356001600160a01b03811681146106c557600080fd5b919050565b6000602082840312156106dc57600080fd5b610285826106ae565b6000806000604084860312156106fa57600080fd5b610703846106ae565b9250602084013567ffffffffffffffff8082111561072057600080fd5b818601915086601f83011261073457600080fd5b81358181111561074357600080fd5b87602082850101111561075557600080fd5b6020830194508093505050509250925092565b60005b8381101561078357818101518382015260200161076b565b838111156103eb5750506000910152565b600082516107a6818460208701610768565b9190910192915050565b60208152600082518060208401526107cf816040850160208701610768565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212204675187caf3a43285d9a2c1844a981e977bd52a85ff073e7fc649f73847d70a464736f6c63430008090033", + "storage": { + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x0000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000000200143fa295ee4dffef22ee2616c2e008d81688" + } + }, + { + "contractName": "PolygonZkEVMTimelock", + "balance": "0", + "nonce": "1", + "address": "0xBBa0935Fa93Eb23de7990b47F0D96a8f75766d13", + "bytecode": "0x6080604052600436106101c65760003560e01c806364d62353116100f7578063b1c5f42711610095578063d547741f11610064578063d547741f14610661578063e38335e514610681578063f23a6e6114610694578063f27a0c92146106d957600080fd5b8063b1c5f427146105af578063bc197c81146105cf578063c4d252f514610614578063d45c44351461063457600080fd5b80638f61f4f5116100d15780638f61f4f5146104e157806391d1485414610515578063a217fddf14610566578063b08e51c01461057b57600080fd5b806364d62353146104815780638065657f146104a15780638f2a0bb0146104c157600080fd5b8063248a9ca31161016457806331d507501161013e57806331d50750146103c857806336568abe146103e85780633a6aae7214610408578063584b153e1461046157600080fd5b8063248a9ca3146103475780632ab0f529146103775780632f2ff15d146103a857600080fd5b80630d3cf6fc116101a05780630d3cf6fc1461026b578063134008d31461029f57806313bc9f20146102b2578063150b7a02146102d257600080fd5b806301d5062a146101d257806301ffc9a7146101f457806307bd02651461022957600080fd5b366101cd57005b600080fd5b3480156101de57600080fd5b506101f26101ed366004611c52565b6106ee565b005b34801561020057600080fd5b5061021461020f366004611cc7565b610783565b60405190151581526020015b60405180910390f35b34801561023557600080fd5b5061025d7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610220565b34801561027757600080fd5b5061025d7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101f26102ad366004611d09565b6107df565b3480156102be57600080fd5b506102146102cd366004611d75565b6108d7565b3480156102de57600080fd5b506103166102ed366004611e9a565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610220565b34801561035357600080fd5b5061025d610362366004611d75565b60009081526020819052604090206001015490565b34801561038357600080fd5b50610214610392366004611d75565b6000908152600160208190526040909120541490565b3480156103b457600080fd5b506101f26103c3366004611f02565b6108fd565b3480156103d457600080fd5b506102146103e3366004611d75565b610927565b3480156103f457600080fd5b506101f2610403366004611f02565b610940565b34801561041457600080fd5b5061043c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610220565b34801561046d57600080fd5b5061021461047c366004611d75565b6109f8565b34801561048d57600080fd5b506101f261049c366004611d75565b610a0e565b3480156104ad57600080fd5b5061025d6104bc366004611d09565b610ade565b3480156104cd57600080fd5b506101f26104dc366004611f73565b610b1d565b3480156104ed57600080fd5b5061025d7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b34801561052157600080fd5b50610214610530366004611f02565b60009182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b34801561057257600080fd5b5061025d600081565b34801561058757600080fd5b5061025d7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b3480156105bb57600080fd5b5061025d6105ca366004612025565b610d4f565b3480156105db57600080fd5b506103166105ea36600461214e565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b34801561062057600080fd5b506101f261062f366004611d75565b610d94565b34801561064057600080fd5b5061025d61064f366004611d75565b60009081526001602052604090205490565b34801561066d57600080fd5b506101f261067c366004611f02565b610e8f565b6101f261068f366004612025565b610eb4565b3480156106a057600080fd5b506103166106af3660046121f8565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106e557600080fd5b5061025d611161565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161071881611244565b6000610728898989898989610ade565b90506107348184611251565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a604051610770969594939291906122a6565b60405180910390a3505050505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107d957506107d98261139e565b92915050565b600080527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661085c5761085c8133611435565b600061086c888888888888610ade565b905061087881856114ed565b6108848888888861162a565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a6040516108bc94939291906122f1565b60405180910390a36108cd8161172e565b5050505050505050565b6000818152600160205260408120546001811180156108f65750428111155b9392505050565b60008281526020819052604090206001015461091881611244565b61092283836117d7565b505050565b60008181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109f482826118c7565b5050565b6000818152600160208190526040822054610939565b333014610a9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109e1565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b6000868686868686604051602001610afb969594939291906122a6565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b4781611244565b888714610bd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b888514610c65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b6000610c778b8b8b8b8b8b8b8b610d4f565b9050610c838184611251565b60005b8a811015610d415780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610cc357610cc3612331565b9050602002016020810190610cd89190612360565b8d8d86818110610cea57610cea612331565b905060200201358c8c87818110610d0357610d03612331565b9050602002810190610d15919061237b565b8c8b604051610d29969594939291906122a6565b60405180910390a3610d3a8161240f565b9050610c86565b505050505050505050505050565b60008888888888888888604051602001610d709897969594939291906124f7565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610dbe81611244565b610dc7826109f8565b610e53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109e1565b6000828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b600082815260208190526040902060010154610eaa81611244565b61092283836118c7565b600080527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610f3157610f318133611435565b878614610fc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b87841461104f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b60006110618a8a8a8a8a8a8a8a610d4f565b905061106d81856114ed565b60005b8981101561114b5760008b8b8381811061108c5761108c612331565b90506020020160208101906110a19190612360565b905060008a8a848181106110b7576110b7612331565b9050602002013590503660008a8a868181106110d5576110d5612331565b90506020028101906110e7919061237b565b915091506110f78484848461162a565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588686868660405161112e94939291906122f1565b60405180910390a350505050806111449061240f565b9050611070565b506111558161172e565b50505050505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161580159061123257507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123291906125be565b1561123d5750600090565b5060025490565b61124e8133611435565b50565b61125a82610927565b156112e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109e1565b6112ef611161565b81101561137e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109e1565b61138881426125e0565b6000928352600160205260409092209190915550565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107d957507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107d9565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109f4576114738161197e565b61147e83602061199d565b60405160200161148f929190612617565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109e191600401612698565b6114f6826108d7565b611582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109e1565b80158061159e5750600081815260016020819052604090912054145b6109f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109e1565b60008473ffffffffffffffffffffffffffffffffffffffff168484846040516116549291906126e9565b60006040518083038185875af1925050503d8060008114611691576040519150601f19603f3d011682016040523d82523d6000602084013e611696565b606091505b5050905080611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109e1565b5050505050565b611737816108d7565b6117c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109e1565b600090815260016020819052604090912055565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109f45760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556118693390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109f45760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107d973ffffffffffffffffffffffffffffffffffffffff831660145b606060006119ac8360026126f9565b6119b79060026125e0565b67ffffffffffffffff8111156119cf576119cf611d8e565b6040519080825280601f01601f1916602001820160405280156119f9576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611a3057611a30612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a9357611a93612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000611acf8460026126f9565b611ada9060016125e0565b90505b6001811115611b77577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611b1b57611b1b612331565b1a60f81b828281518110611b3157611b31612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c93611b7081612710565b9050611add565b5083156108f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109e1565b803573ffffffffffffffffffffffffffffffffffffffff81168114611c0457600080fd5b919050565b60008083601f840112611c1b57600080fd5b50813567ffffffffffffffff811115611c3357600080fd5b602083019150836020828501011115611c4b57600080fd5b9250929050565b600080600080600080600060c0888a031215611c6d57600080fd5b611c7688611be0565b965060208801359550604088013567ffffffffffffffff811115611c9957600080fd5b611ca58a828b01611c09565b989b979a50986060810135976080820135975060a09091013595509350505050565b600060208284031215611cd957600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108f657600080fd5b60008060008060008060a08789031215611d2257600080fd5b611d2b87611be0565b955060208701359450604087013567ffffffffffffffff811115611d4e57600080fd5b611d5a89828a01611c09565b979a9699509760608101359660809091013595509350505050565b600060208284031215611d8757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611e0457611e04611d8e565b604052919050565b600082601f830112611e1d57600080fd5b813567ffffffffffffffff811115611e3757611e37611d8e565b611e6860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611dbd565b818152846020838601011115611e7d57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611eb057600080fd5b611eb985611be0565b9350611ec760208601611be0565b925060408501359150606085013567ffffffffffffffff811115611eea57600080fd5b611ef687828801611e0c565b91505092959194509250565b60008060408385031215611f1557600080fd5b82359150611f2560208401611be0565b90509250929050565b60008083601f840112611f4057600080fd5b50813567ffffffffffffffff811115611f5857600080fd5b6020830191508360208260051b8501011115611c4b57600080fd5b600080600080600080600080600060c08a8c031215611f9157600080fd5b893567ffffffffffffffff80821115611fa957600080fd5b611fb58d838e01611f2e565b909b50995060208c0135915080821115611fce57600080fd5b611fda8d838e01611f2e565b909950975060408c0135915080821115611ff357600080fd5b506120008c828d01611f2e565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b60008060008060008060008060a0898b03121561204157600080fd5b883567ffffffffffffffff8082111561205957600080fd5b6120658c838d01611f2e565b909a50985060208b013591508082111561207e57600080fd5b61208a8c838d01611f2e565b909850965060408b01359150808211156120a357600080fd5b506120b08b828c01611f2e565b999c989b509699959896976060870135966080013595509350505050565b600082601f8301126120df57600080fd5b8135602067ffffffffffffffff8211156120fb576120fb611d8e565b8160051b61210a828201611dbd565b928352848101820192828101908785111561212457600080fd5b83870192505b848310156121435782358252918301919083019061212a565b979650505050505050565b600080600080600060a0868803121561216657600080fd5b61216f86611be0565b945061217d60208701611be0565b9350604086013567ffffffffffffffff8082111561219a57600080fd5b6121a689838a016120ce565b945060608801359150808211156121bc57600080fd5b6121c889838a016120ce565b935060808801359150808211156121de57600080fd5b506121eb88828901611e0c565b9150509295509295909350565b600080600080600060a0868803121561221057600080fd5b61221986611be0565b945061222760208701611be0565b93506040860135925060608601359150608086013567ffffffffffffffff81111561225157600080fd5b6121eb88828901611e0c565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a0604082015260006122dc60a08301868861225d565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260606040820152600061232760608301848661225d565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561237257600080fd5b6108f682611be0565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126123b057600080fd5b83018035915067ffffffffffffffff8211156123cb57600080fd5b602001915036819003821315611c4b57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612440576124406123e0565b5060010190565b81835260006020808501808196508560051b810191508460005b878110156124ea57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126124a057600080fd5b8701858101903567ffffffffffffffff8111156124bc57600080fd5b8036038213156124cb57600080fd5b6124d686828461225d565b9a87019a9550505090840190600101612461565b5091979650505050505050565b60a0808252810188905260008960c08301825b8b8110156125455773ffffffffffffffffffffffffffffffffffffffff61253084611be0565b1682526020928301929091019060010161250a565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff89111561257e57600080fd5b8860051b9150818a602083013701828103602090810160408501526125a69082018789612447565b60608401959095525050608001529695505050505050565b6000602082840312156125d057600080fd5b815180151581146108f657600080fd5b808201808211156107d9576107d96123e0565b60005b8381101561260e5781810151838201526020016125f6565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161264f8160178501602088016125f3565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000601791840191820152835161268c8160288401602088016125f3565b01602801949350505050565b60208152600082518060208401526126b78160408501602087016125f3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b8183823760009101908152919050565b80820281158282048414176107d9576107d96123e0565b60008161271f5761271f6123e0565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea26469706673582212206416c4e08f97752b4bb06159524dac058d3dccd8775e57ef1b01505751ebf7af64736f6c63430008110033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x00000000000000000000000000000000000000000000000000000000000d2f00", + "0x33d4aa03df3f12c4f615b40676f67fdafecd3edb5a9c0ca2a47a923dae33a023": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x9fa2d8034dbcb437bee38d61fbd100910e1342ffc07f128aa1b8e6790b7f3f68": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x64494413541ff93b31aa309254e3fed72a7456e9845988b915b4c7a7ceba8814": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x531a7c25761aa4b0f2310edca9bb25e1e3ceb49ad4b0422aec866b3ce7567c87": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x3412d5605ac6cd444957cedb533e5dacad6378b4bc819ebe3652188a665066d6": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0xedbedc78c4240c7613622a35de050b48bd6c6d9a31b3d485b68fbbed54a4802d": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d706a": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x76616448da8d124a07383c26a6b2433b3259de946aa40f51524ec96ee05e871a": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xc3ad33e20b0c56a223ad5104fff154aa010f8715b9c981fd38fdc60a4d1a52fc": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5" + } + }, + { + "accountName": "keyless Deployer", + "balance": "0", + "nonce": "1", + "address": "0x9d90066e7478496e2284E54c3548106bb4F90E50" + }, + { + "accountName": "deployer", + "balance": "0", + "nonce": "8", + "address": "0x4c1665d6651ecEfa59B9B3041951608468b18891" + } + ] +} \ No newline at end of file diff --git a/tools/createGenesis/new_genesis_mainnet.json b/tools/createGenesis/new_genesis_mainnet.json new file mode 100644 index 000000000..3605ddf86 --- /dev/null +++ b/tools/createGenesis/new_genesis_mainnet.json @@ -0,0 +1,92 @@ +{ + "root": "0xe3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f272", + "genesis": [ + { + "contractName": "PolygonZkEVMDeployer", + "balance": "0", + "nonce": "4", + "address": "0xCB19eDdE626906eB1EE52357a27F62dd519608C2", + "bytecode": "0x60806040526004361061006e575f3560e01c8063715018a61161004c578063715018a6146100e25780638da5cb5b146100f6578063e11ae6cb1461011f578063f2fde38b14610132575f80fd5b80632b79805a146100725780634a94d487146100875780636d07dbf81461009a575b5f80fd5b610085610080366004610908565b610151565b005b6100856100953660046109a2565b6101c2565b3480156100a5575f80fd5b506100b96100b43660046109f5565b610203565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ed575f80fd5b50610085610215565b348015610101575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff166100b9565b61008561012d366004610a15565b610228565b34801561013d575f80fd5b5061008561014c366004610a61565b61028e565b61015961034a565b5f6101658585856103ca565b90506101718183610527565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a15050505050565b6101ca61034a565b6101d583838361056a565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b905f90a1505050565b5f61020e8383610598565b9392505050565b61021d61034a565b6102265f6105a4565b565b61023061034a565b5f61023c8484846103ca565b60405173ffffffffffffffffffffffffffffffffffffffff821681529091507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a150505050565b61029661034a565b73ffffffffffffffffffffffffffffffffffffffff811661033e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610347816105a4565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610335565b5f83471015610435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610335565b81515f0361049f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610335565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff811661020e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610335565b606061020e83835f6040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c65640000815250610618565b6060610590848484604051806060016040528060298152602001610b0860299139610618565b949350505050565b5f61020e83833061072d565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156106aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610335565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516106d29190610a9c565b5f6040518083038185875af1925050503d805f811461070c576040519150601f19603f3d011682016040523d82523d5f602084013e610711565b606091505b509150915061072287838387610756565b979650505050505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b606083156107eb5782515f036107e45773ffffffffffffffffffffffffffffffffffffffff85163b6107e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610335565b5081610590565b61059083838151156108005781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103359190610ab7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112610870575f80fd5b813567ffffffffffffffff8082111561088b5761088b610834565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156108d1576108d1610834565b816040528381528660208588010111156108e9575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f806080858703121561091b575f80fd5b8435935060208501359250604085013567ffffffffffffffff80821115610940575f80fd5b61094c88838901610861565b93506060870135915080821115610961575f80fd5b5061096e87828801610861565b91505092959194509250565b803573ffffffffffffffffffffffffffffffffffffffff8116811461099d575f80fd5b919050565b5f805f606084860312156109b4575f80fd5b6109bd8461097a565b9250602084013567ffffffffffffffff8111156109d8575f80fd5b6109e486828701610861565b925050604084013590509250925092565b5f8060408385031215610a06575f80fd5b50508035926020909101359150565b5f805f60608486031215610a27575f80fd5b8335925060208401359150604084013567ffffffffffffffff811115610a4b575f80fd5b610a5786828701610861565b9150509250925092565b5f60208284031215610a71575f80fd5b61020e8261097a565b5f5b83811015610a94578181015183820152602001610a7c565b50505f910152565b5f8251610aad818460208701610a7a565b9190910192915050565b602081525f8251806020840152610ad5816040850160208701610a7a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220330b94dc698c4d290bf55c23f13b473cde6a6bae0030cb902de18af54e35839f64736f6c63430008140033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000004c1665d6651ecefa59b9b3041951608468b18891" + } + }, + { + "contractName": "ProxyAdmin", + "balance": "0", + "nonce": "1", + "address": "0x0F99738B2Fc14D77308337f3e2596b63aE7BCC4A", + "bytecode": "0x608060405260043610610079575f3560e01c80639623609d1161004c5780639623609d1461012357806399a88ec414610136578063f2fde38b14610155578063f3b7dead14610174575f80fd5b8063204e1c7a1461007d578063715018a6146100c55780637eff275e146100db5780638da5cb5b146100fa575b5f80fd5b348015610088575f80fd5b5061009c6100973660046105e8565b610193565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100d0575f80fd5b506100d9610244565b005b3480156100e6575f80fd5b506100d96100f536600461060a565b610257565b348015610105575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff1661009c565b6100d961013136600461066e565b6102e0565b348015610141575f80fd5b506100d961015036600461060a565b610371565b348015610160575f80fd5b506100d961016f3660046105e8565b6103cd565b34801561017f575f80fd5b5061009c61018e3660046105e8565b610489565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907f5c60da1b00000000000000000000000000000000000000000000000000000000815260040190565b5f60405180830381855afa9150503d805f8114610215576040519150601f19603f3d011682016040523d82523d5f602084013e61021a565b606091505b509150915081610228575f80fd5b8080602001905181019061023c919061075b565b949350505050565b61024c6104d3565b6102555f610553565b565b61025f6104d3565b6040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690638f283970906024015b5f604051808303815f87803b1580156102c6575f80fd5b505af11580156102d8573d5f803e3d5ffd5b505050505050565b6102e86104d3565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef28690349061033e9086908690600401610776565b5f604051808303818588803b158015610355575f80fd5b505af1158015610367573d5f803e3d5ffd5b5050505050505050565b6103796104d3565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690633659cfe6906024016102af565b6103d56104d3565b73ffffffffffffffffffffffffffffffffffffffff811661047d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61048681610553565b50565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907ff851a44000000000000000000000000000000000000000000000000000000000815260040190565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610474565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610486575f80fd5b5f602082840312156105f8575f80fd5b8135610603816105c7565b9392505050565b5f806040838503121561061b575f80fd5b8235610626816105c7565b91506020830135610636816105c7565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f805f60608486031215610680575f80fd5b833561068b816105c7565b9250602084013561069b816105c7565b9150604084013567ffffffffffffffff808211156106b7575f80fd5b818601915086601f8301126106ca575f80fd5b8135818111156106dc576106dc610641565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561072257610722610641565b8160405282815289602084870101111561073a575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f6020828403121561076b575f80fd5b8151610603816105c7565b73ffffffffffffffffffffffffffffffffffffffff831681525f602060408184015283518060408501525f5b818110156107be578581018301518582016060015282016107a2565b505f6060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050939250505056fea26469706673582212203083a4ccc2e42eed60bd19037f2efa77ed086dc7a5403f75bebb995dcba2221c64736f6c63430008140033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000bba0935fa93eb23de7990b47f0d96a8f75766d13" + } + }, + { + "contractName": "PolygonZkEVMBridge implementation", + "balance": "0", + "nonce": "1", + "address": "0x5ac4182A1dd41AeEf465E40B82fd326BF66AB82C", + "bytecode": "0x6080604052600436106101db575f3560e01c806383f24403116100fd578063ccaa2d1111610092578063ee25560b11610062578063ee25560b146105a9578063f5efcd79146105d4578063f811bff7146105f3578063fb57083414610612575f80fd5b8063ccaa2d111461053b578063cd5865791461055a578063d02103ca1461056d578063dbc1697614610595575f80fd5b8063bab161bf116100cd578063bab161bf146104b9578063be5831c7146104da578063c00f14ab146104fd578063cc4616321461051c575f80fd5b806383f244031461043d5780638ed7e3f21461045c578063aaa13cc21461047b578063b8b284d01461049a575f80fd5b80633cbc795b116101735780637843298b116101435780637843298b146103c257806379e2cf97146103e157806381b1c174146103f557806383c43a5514610429575f80fd5b80633cbc795b146103385780633e197043146103705780634b2f336d1461038f5780635ca1e165146103ae575f80fd5b806327aef4e8116101ae57806327aef4e81461026d5780632dfdf0b51461028e578063318aee3d146102b15780633c351e1014610319575f80fd5b806315064c96146101df5780632072f6c51461020d57806322e95f2c14610223578063240ff3781461025a575b5f80fd5b3480156101ea575f80fd5b506068546101f89060ff1681565b60405190151581526020015b60405180910390f35b348015610218575f80fd5b50610221610631565b005b34801561022e575f80fd5b5061024261023d366004612fb9565b610666565b6040516001600160a01b039091168152602001610204565b610221610268366004613040565b6106d0565b348015610278575f80fd5b50610281610759565b6040516102049190613102565b348015610299575f80fd5b506102a360535481565b604051908152602001610204565b3480156102bc575f80fd5b506102f56102cb36600461311b565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201610204565b348015610324575f80fd5b50606d54610242906001600160a01b031681565b348015610343575f80fd5b50606d5461035b90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610204565b34801561037b575f80fd5b506102a361038a366004613144565b6107e5565b34801561039a575f80fd5b50606f54610242906001600160a01b031681565b3480156103b9575f80fd5b506102a361088e565b3480156103cd575f80fd5b506102426103dc3660046131be565b61096a565b3480156103ec575f80fd5b50610221610993565b348015610400575f80fd5b5061024261040f366004613204565b606a6020525f90815260409020546001600160a01b031681565b348015610434575f80fd5b506102816109b4565b348015610448575f80fd5b506102a361045736600461322c565b6109d3565b348015610467575f80fd5b50606c54610242906001600160a01b031681565b348015610486575f80fd5b5061024261049536600461332d565b610aa8565b3480156104a5575f80fd5b506102216104b43660046133c3565b610be7565b3480156104c4575f80fd5b5060685461035b90610100900463ffffffff1681565b3480156104e5575f80fd5b5060685461035b90600160c81b900463ffffffff1681565b348015610508575f80fd5b5061028161051736600461311b565b610cc2565b348015610527575f80fd5b506101f8610536366004613441565b610d07565b348015610546575f80fd5b50610221610555366004613472565b610d8f565b610221610568366004613556565b6112c0565b348015610578575f80fd5b50606854610242906501000000000090046001600160a01b031681565b3480156105a0575f80fd5b5061022161172c565b3480156105b4575f80fd5b506102a36105c3366004613204565b60696020525f908152604090205481565b3480156105df575f80fd5b506102216105ee366004613472565b61175f565b3480156105fe575f80fd5b5061022161060d3660046135e6565b611a25565b34801561061d575f80fd5b506101f861062c366004613689565b611d40565b606c546001600160a01b0316331461065c57604051631736745960e31b815260040160405180910390fd5b610664611d57565b565b6040805160e084901b6001600160e01b031916602080830191909152606084901b6bffffffffffffffffffffffff1916602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b60685460ff16156106f457604051630bc011ff60e21b815260040160405180910390fd5b341580159061070d5750606f546001600160a01b031615155b15610744576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610752858534868686611db2565b5050505050565b606e8054610766906136ce565b80601f0160208091040260200160405190810160405280929190818152602001828054610792906136ce565b80156107dd5780601f106107b4576101008083540402835291602001916107dd565b820191905f5260205f20905b8154815290600101906020018083116107c057829003601f168201915b505050505081565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201526001600160e01b031960e088811b821660218401526bffffffffffffffffffffffff19606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b6053545f90819081805b6020811015610961578083901c6001166001036108f557603381602081106108c2576108c2613706565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610922565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806109599061372e565b915050610898565b50919392505050565b5f61098b848461097985611e7c565b61098286611f66565b61049587612047565b949350505050565b605354606854600160c81b900463ffffffff16101561066457610664612114565b60405180611ba00160405280611b668152602001613d80611b66913981565b5f83815b6020811015610a9f57600163ffffffff8516821c81169003610a4257848160208110610a0557610a05613706565b602002013582604051602001610a25929190918252602082015260400190565b604051602081830303815290604052805190602001209150610a8d565b81858260208110610a5557610a55613706565b6020020135604051602001610a74929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610a978161372e565b9150506109d7565b50949350505050565b6040516001600160e01b031960e087901b1660208201526bffffffffffffffffffffffff19606086901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180611ba00160405280611b668152602001613d80611b669139898989604051602001610b3093929190613746565b60408051601f1981840301815290829052610b4e929160200161377e565b60405160208183030381529060405280519060200120604051602001610bc394939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff1615610c0b57604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b0316610c4d576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f54604051632770a7eb60e21b8152336004820152602481018690526001600160a01b0390911690639dc29fac906044015f604051808303815f87803b158015610c96575f80fd5b505af1158015610ca8573d5f803e3d5ffd5b50505050610cba868686868686611db2565b505050505050565b6060610ccd82611e7c565b610cd683611f66565b610cdf84612047565b604051602001610cf193929190613746565b6040516020818303038152906040529050919050565b6068545f908190610100900463ffffffff16158015610d2c575063ffffffff83166001145b15610d3e575063ffffffff8316610d66565b610d5364010000000063ffffffff85166137ac565b610d639063ffffffff86166137c3565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff1615610db357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614610de3576040516302caf51760e11b815260040160405180910390fd5b610e168c8c8c8c8c610e115f8e8e8e8e8e8e8e604051610e049291906137d6565b60405180910390206107e5565b6121c2565b6001600160a01b038616610f6057606f546001600160a01b0316610efa575f6001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015610e6c576020820181803683370190505b50604051610e7a91906137e5565b5f6040518083038185875af1925050503d805f8114610eb4576040519150601f19603f3d011682016040523d82523d5f602084013e610eb9565b606091505b5050905080610ef4576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611256565b606f546040516340c10f1960e01b81526001600160a01b03868116600483015260248201869052909116906340c10f19906044015f604051808303815f87803b158015610f45575f80fd5b505af1158015610f57573d5f803e3d5ffd5b50505050611256565b606d546001600160a01b038781169116148015610f8e5750606d5463ffffffff888116600160a01b90920416145b15610fa5575f6001600160a01b0385168482610e42565b60685463ffffffff610100909104811690881603610fd657610fd16001600160a01b0387168585612354565b611256565b6040516001600160e01b031960e089901b1660208201526bffffffffffffffffffffffff19606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b0316806111f5575f6110808386868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506123d592505050565b6040516340c10f1960e01b81526001600160a01b03898116600483015260248201899052919250908216906340c10f19906044015f604051808303815f87803b1580156110cb575f80fd5b505af11580156110dd573d5f803e3d5ffd5b5050505080606a5f8581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a8388886040516111e7959493929190613828565b60405180910390a150611253565b6040516340c10f1960e01b81526001600160a01b038781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801561123c575f80fd5b505af115801561124e573d5f803e3d5ffd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156112e457604051630bc011ff60e21b815260040160405180910390fd5b6112ec612468565b60685463ffffffff61010090910481169088160361131d576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b03881661141957883414611369576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff16945090611396906136ce565b80601f01602080910402602001604051908101604052809291908181526020018280546113c2906136ce565b801561140d5780601f106113e45761010080835404028352916020019161140d565b820191905f5260205f20905b8154815290600101906020018083116113f057829003601f168201915b505050505091506116a3565b3415611451576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546001600160a01b03908116908916036114c757604051632770a7eb60e21b8152336004820152602481018a90526001600160a01b03891690639dc29fac906044015f604051808303815f87803b1580156114ac575f80fd5b505af11580156114be573d5f803e3d5ffd5b505050506116a3565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901561157957604051632770a7eb60e21b8152336004820152602481018b90526001600160a01b038a1690639dc29fac906044015f604051808303815f87803b158015611551575f80fd5b505af1158015611563573d5f803e3d5ffd5b5050505080602001519450805f01519350611696565b851561158b5761158b898b89896124c1565b6040516370a0823160e01b81523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa1580156115cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f39190613860565b905061160a6001600160a01b038b1633308e612860565b6040516370a0823160e01b81523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa15801561164e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116729190613860565b905061167e8282613877565b6068548c9850610100900463ffffffff169650935050505b61169f89610cc2565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e86886053546040516116e298979695949392919061388a565b60405180910390a16117086117035f85878f8f8789805190602001206107e5565b6128b1565b861561171657611716612114565b5050505061172360018055565b50505050505050565b606c546001600160a01b0316331461175757604051631736745960e31b815260040160405180910390fd5b6106646129b2565b60685460ff161561178357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146117b3576040516302caf51760e11b815260040160405180910390fd5b6117d58c8c8c8c8c610e1160018e8e8e8e8e8e8e604051610e049291906137d6565b606f545f906001600160a01b031661188857846001600160a01b031684888a868660405160240161180994939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161183e91906137e5565b5f6040518083038185875af1925050503d805f8114611878576040519150601f19603f3d011682016040523d82523d5f602084013e61187d565b606091505b505080915050611983565b606f546040516340c10f1960e01b81526001600160a01b03878116600483015260248201879052909116906340c10f19906044015f604051808303815f87803b1580156118d3575f80fd5b505af11580156118e5573d5f803e3d5ffd5b50505050846001600160a01b03168789858560405160240161190a94939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161193f91906137e5565b5f604051808303815f865af19150503d805f8114611978576040519150601f19603f3d011682016040523d82523d5f602084013e61197d565b606091505b50909150505b806119ba576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f54610100900460ff1615808015611a4357505f54600160ff909116105b80611a5c5750303b158015611a5c57505f5460ff166001145b611ad35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805460ff191660011790558015611af4575f805461ff0019166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8a16027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038781169190910291909117909155606c805473ffffffffffffffffffffffffffffffffffffffff19168583161790558616611bcf5763ffffffff851615611bca576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ceb565b606d805463ffffffff8716600160a01b027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b03891617179055606e611c1e8382613970565b50611cbd5f801b6012604051602001611ca991906060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff91909116604082015260e00190565b6040516020818303038152906040526123d5565b606f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790555b611cf3612a22565b8015611723575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b5f81611d4d8686866109d3565b1495945050505050565b60685460ff1615611d7b57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff610100909104811690871603611de3576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051611e3799989796959493929190613a2c565b60405180910390a1611e6e6117036001606860019054906101000a900463ffffffff16338a8a8a8989604051610e049291906137d6565b8215610cba57610cba612114565b60408051600481526024810182526020810180516001600160e01b03167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611edb91906137e5565b5f60405180830381855afa9150503d805f8114611f13576040519150601f19603f3d011682016040523d82523d5f602084013e611f18565b606091505b509150915081611f5d576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525061098b565b61098b81612a94565b60408051600481526024810182526020810180516001600160e01b03167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611fc591906137e5565b5f60405180830381855afa9150503d805f8114611ffd576040519150601f19603f3d011682016040523d82523d5f602084013e612002565b606091505b509150915081611f5d576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525061098b565b60408051600481526024810182526020810180516001600160e01b03167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b038616916120a591906137e5565b5f60405180830381855afa9150503d805f81146120dd576040519150601f19603f3d011682016040523d82523d5f602084013e6120e2565b606091505b50915091508180156120f5575080516020145b61210057601261098b565b8080602001905181019061098b9190613a97565b6053546068805463ffffffff909216600160c81b027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d61217561088e565b6040518263ffffffff1660e01b815260040161219391815260200190565b5f604051808303815f87803b1580156121aa575f80fd5b505af11580156121bc573d5f803e3d5ffd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af1158015612253573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122779190613860565b9050805f036122b1576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80680100000000000000008716156122f5578691506122d3848a8489611d40565b6122f0576040516338105f3b60e21b815260040160405180910390fd5b61233f565b602087901c612305816001613ab2565b9150879250612320612318868c866109d3565b8a8389611d40565b61233d576040516338105f3b60e21b815260040160405180910390fd5b505b6123498282612c64565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526123d09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612d24565b505050565b5f8060405180611ba00160405280611b668152602001613d80611b6691398360405160200161240592919061377e565b6040516020818303038152906040529050838151602083015ff591506001600160a01b038216612461576040517fbefb092000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5092915050565b6002600154036124ba5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611aca565b6002600155565b5f6124cf6004828486613acf565b6124d891613af6565b90507f2afa5331000000000000000000000000000000000000000000000000000000006001600160e01b03198216016126b2575f80808080808061251f896004818d613acf565b81019061252c9190613b26565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161461256c5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03861630146125955760405163750643af60e01b815260040160405180910390fd5b8a85146125ce576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b03167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169161266591906137e5565b5f604051808303815f865af19150503d805f811461269e576040519150601f19603f3d011682016040523d82523d5f602084013e6126a3565b606091505b50505050505050505050610752565b6001600160e01b031981166323f2ebc360e21b146126fc576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806127118a6004818e613acf565b81019061271e9190613b75565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146127605760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146127895760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169161281091906137e5565b5f604051808303815f865af19150503d805f8114612849576040519150601f19603f3d011682016040523d82523d5f602084013e61284e565b606091505b50505050505050505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526121bc9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612399565b8060016128c060206002613cd3565b6128ca9190613877565b60535410612904576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f81546129139061372e565b918290555090505f5b60208110156129a3578082901c60011660010361294f57826033826020811061294757612947613706565b015550505050565b6033816020811061296257612962613706565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061299b9061372e565b91505061291c565b506123d0613cde565b60018055565b60685460ff166129ee576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f54610100900460ff16612a8c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b610664612e08565b60606040825110612ab357818060200190518101906106ca9190613cf2565b8151602003612c26575f5b602081108015612b055750828181518110612adb57612adb613706565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15612b1c5780612b148161372e565b915050612abe565b805f03612b5e57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115612b7857612b78613268565b6040519080825280601f01601f191660200182016040528015612ba2576020820181803683370190505b5090505f5b82811015612c1e57848181518110612bc157612bc1613706565b602001015160f81c60f81b828281518110612bde57612bde613706565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080612c168161372e565b915050612ba7565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b6068545f90610100900463ffffffff16158015612c87575063ffffffff82166001145b15612c99575063ffffffff8216612cc1565b612cae64010000000063ffffffff84166137ac565b612cbe9063ffffffff85166137c3565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003611723576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612d78826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e729092919063ffffffff16565b8051909150156123d05780806020019051810190612d969190613d64565b6123d05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611aca565b5f54610100900460ff166129ac5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b606061098b84845f85855f80866001600160a01b03168587604051612e9791906137e5565b5f6040518083038185875af1925050503d805f8114612ed1576040519150601f19603f3d011682016040523d82523d5f602084013e612ed6565b606091505b5091509150612ee787838387612ef2565b979650505050505050565b60608315612f605782515f03612f59576001600160a01b0385163b612f595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611aca565b508161098b565b61098b8383815115612f755781518083602001fd5b8060405162461bcd60e51b8152600401611aca9190613102565b803563ffffffff81168114612c5f575f80fd5b6001600160a01b0381168114612fb6575f80fd5b50565b5f8060408385031215612fca575f80fd5b612fd383612f8f565b91506020830135612fe381612fa2565b809150509250929050565b8015158114612fb6575f80fd5b5f8083601f84011261300b575f80fd5b50813567ffffffffffffffff811115613022575f80fd5b602083019150836020828501011115613039575f80fd5b9250929050565b5f805f805f60808688031215613054575f80fd5b61305d86612f8f565b9450602086013561306d81612fa2565b9350604086013561307d81612fee565b9250606086013567ffffffffffffffff811115613098575f80fd5b6130a488828901612ffb565b969995985093965092949392505050565b5f5b838110156130cf5781810151838201526020016130b7565b50505f910152565b5f81518084526130ee8160208601602086016130b5565b601f01601f19169290920160200192915050565b602081525f61311460208301846130d7565b9392505050565b5f6020828403121561312b575f80fd5b813561311481612fa2565b60ff81168114612fb6575f80fd5b5f805f805f805f60e0888a03121561315a575f80fd5b873561316581613136565b965061317360208901612f8f565b9550604088013561318381612fa2565b945061319160608901612f8f565b935060808801356131a181612fa2565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156131d0575f80fd5b6131d984612f8f565b925060208401356131e981612fa2565b915060408401356131f981612fa2565b809150509250925092565b5f60208284031215613214575f80fd5b5035919050565b8061040081018310156106ca575f80fd5b5f805f610440848603121561323f575f80fd5b83359250613250856020860161321b565b915061325f6104208501612f8f565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156132a5576132a5613268565b604052919050565b5f67ffffffffffffffff8211156132c6576132c6613268565b50601f01601f191660200190565b5f6132e66132e1846132ad565b61327c565b90508281528383830111156132f9575f80fd5b828260208301375f602084830101529392505050565b5f82601f83011261331e575f80fd5b613114838335602085016132d4565b5f805f805f60a08688031215613341575f80fd5b61334a86612f8f565b9450602086013561335a81612fa2565b9350604086013567ffffffffffffffff80821115613376575f80fd5b61338289838a0161330f565b94506060880135915080821115613397575f80fd5b506133a48882890161330f565b92505060808601356133b581613136565b809150509295509295909350565b5f805f805f8060a087890312156133d8575f80fd5b6133e187612f8f565b955060208701356133f181612fa2565b945060408701359350606087013561340881612fee565b9250608087013567ffffffffffffffff811115613423575f80fd5b61342f89828a01612ffb565b979a9699509497509295939492505050565b5f8060408385031215613452575f80fd5b61345b83612f8f565b915061346960208401612f8f565b90509250929050565b5f805f805f805f805f805f806109208d8f03121561348e575f80fd5b6134988e8e61321b565b9b506134a88e6104008f0161321b565b9a506108008d013599506108208d013598506108408d013597506134cf6108608e01612f8f565b96506134df6108808e0135612fa2565b6108808d013595506134f46108a08e01612f8f565b94506135046108c08e0135612fa2565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111561352d575f80fd5b61353e8e6109008f01358f01612ffb565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121561356c575f80fd5b61357588612f8f565b9650602088013561358581612fa2565b955060408801359450606088013561359c81612fa2565b935060808801356135ac81612fee565b925060a088013567ffffffffffffffff8111156135c7575f80fd5b6135d38a828b01612ffb565b989b979a50959850939692959293505050565b5f805f805f8060c087890312156135fb575f80fd5b61360487612f8f565b9550602087013561361481612fa2565b945061362260408801612f8f565b9350606087013561363281612fa2565b9250608087013561364281612fa2565b915060a087013567ffffffffffffffff81111561365d575f80fd5b8701601f8101891361366d575f80fd5b61367c898235602084016132d4565b9150509295509295509295565b5f805f80610460858703121561369d575f80fd5b843593506136ae866020870161321b565b92506136bd6104208601612f8f565b939692955092936104400135925050565b600181811c908216806136e257607f821691505b60208210810361370057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f6001820161373f5761373f61371a565b5060010190565b606081525f61375860608301866130d7565b828103602084015261376a81866130d7565b91505060ff83166040830152949350505050565b5f835161378f8184602088016130b5565b8351908301906137a38183602088016130b5565b01949350505050565b80820281158282048414176106ca576106ca61371a565b808201808211156106ca576106ca61371a565b818382375f9101908152919050565b5f82516137f68184602087016130b5565b9190910192915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b63ffffffff861681525f6001600160a01b03808716602084015280861660408401525060806060830152612ee7608083018486613800565b5f60208284031215613870575f80fd5b5051919050565b818103818111156106ca576106ca61371a565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c08501526138da828501876130d7565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f613921606083018486613800565b9695505050505050565b601f8211156123d0575f81815260208120601f850160051c810160208610156139515750805b601f850160051c820191505b81811015610cba5782815560010161395d565b815167ffffffffffffffff81111561398a5761398a613268565b61399e8161399884546136ce565b8461392b565b602080601f8311600181146139d1575f84156139ba5750858301515b5f19600386901b1c1916600185901b178555610cba565b5f85815260208120601f198616915b828110156139ff578886015182559484019460019091019084016139e0565b5085821015613a1c57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c0850152613a7d8285018789613800565b925080851660e085015250509a9950505050505050505050565b5f60208284031215613aa7575f80fd5b815161311481613136565b63ffffffff8181168382160190808211156124615761246161371a565b5f8085851115613add575f80fd5b83861115613ae9575f80fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015613b1e5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215613b3c575f80fd5b8735613b4781612fa2565b96506020880135613b5781612fa2565b9550604088013594506060880135935060808801356131a181613136565b5f805f805f805f80610100898b031215613b8d575f80fd5b8835613b9881612fa2565b97506020890135613ba881612fa2565b965060408901359550606089013594506080890135613bc681612fee565b935060a0890135613bd681613136565b979a969950949793969295929450505060c08201359160e0013590565b600181815b80851115613c2d57815f1904821115613c1357613c1361371a565b80851615613c2057918102915b93841c9390800290613bf8565b509250929050565b5f82613c43575060016106ca565b81613c4f57505f6106ca565b8160018114613c655760028114613c6f57613c8b565b60019150506106ca565b60ff841115613c8057613c8061371a565b50506001821b6106ca565b5060208310610133831016604e8410600b8410161715613cae575081810a6106ca565b613cb88383613bf3565b805f1904821115613ccb57613ccb61371a565b029392505050565b5f6131148383613c35565b634e487b7160e01b5f52600160045260245ffd5b5f60208284031215613d02575f80fd5b815167ffffffffffffffff811115613d18575f80fd5b8201601f81018413613d28575f80fd5b8051613d366132e1826132ad565b818152856020838501011115613d4a575f80fd5b613d5b8260208301602086016130b5565b95945050505050565b5f60208284031215613d74575f80fd5b815161311481612fee56fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a2646970667358221220432f6d6b4446edbe1f73c19fd2115454d5c35d8b03b98a74fd46724151d7672264736f6c63430008140033" + }, + { + "contractName": "PolygonZkEVMBridge proxy", + "balance": "340282366920938463463374607431768211455", + "nonce": "1", + "address": "0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe", + "bytecode": "0x60806040526004361061005d575f3560e01c80635c60da1b116100425780635c60da1b146100a65780638f283970146100e3578063f851a440146101025761006c565b80633659cfe6146100745780634f1ef286146100935761006c565b3661006c5761006a610116565b005b61006a610116565b34801561007f575f80fd5b5061006a61008e366004610854565b610130565b61006a6100a136600461086d565b610178565b3480156100b1575f80fd5b506100ba6101eb565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee575f80fd5b5061006a6100fd366004610854565b610228565b34801561010d575f80fd5b506100ba610255565b61011e610282565b61012e610129610359565b610362565b565b610138610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d8160405180602001604052805f8152505f6103bf565b50565b61016d610116565b610180610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101e3576101de8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250600192506103bf915050565b505050565b6101de610116565b5f6101f4610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610359565b905090565b610225610116565b90565b610230610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d816103e9565b5f61025e610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610380565b61028a610380565b73ffffffffffffffffffffffffffffffffffffffff16330361012e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b5f61021861044a565b365f80375f80365f845af43d5f803e80801561037c573d5ff35b3d5ffd5b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b6103c883610471565b5f825111806103d45750805b156101de576103e383836104bd565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f610412610380565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a161016d816104e9565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103a3565b61047a816105f5565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606104e28383604051806060016040528060278152602001610977602791396106c0565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811661058c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610350565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b73ffffffffffffffffffffffffffffffffffffffff81163b610699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610350565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105af565b60605f808573ffffffffffffffffffffffffffffffffffffffff16856040516106e9919061090b565b5f60405180830381855af49150503d805f8114610721576040519150601f19603f3d011682016040523d82523d5f602084013e610726565b606091505b509150915061073786838387610741565b9695505050505050565b606083156107d65782515f036107cf5773ffffffffffffffffffffffffffffffffffffffff85163b6107cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610350565b50816107e0565b6107e083836107e8565b949350505050565b8151156107f85781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103509190610926565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f575f80fd5b919050565b5f60208284031215610864575f80fd5b6104e28261082c565b5f805f6040848603121561087f575f80fd5b6108888461082c565b9250602084013567ffffffffffffffff808211156108a4575f80fd5b818601915086601f8301126108b7575f80fd5b8135818111156108c5575f80fd5b8760208285010111156108d6575f80fd5b6020830194508093505050509250925092565b5f5b838110156109035781810151838201526020016108eb565b50505f910152565b5f825161091c8184602087016108e9565b9190910192915050565b602081525f82518060208401526109448160408501602087016108e9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212202ac98acbfbb3d3ac1b74050e18c4e76db25a3ff2801ec69bf85d0c61414d502b64736f6c63430008140033", + "storage": { + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x0000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000005ac4182a1dd41aeef465e40b82fd326bf66ab82c" + } + }, + { + "contractName": "PolygonZkEVMGlobalExitRootL2 implementation", + "balance": "0", + "nonce": "1", + "address": "0x0200143Fa295EE4dffEF22eE2616c2E008D81688", + "bytecode": "0x608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301fd90441461004e578063257b36321461006a57806333d6247d14610089578063a3c573eb1461009e575b5f80fd5b61005760015481565b6040519081526020015b60405180910390f35b61005761007836600461015e565b5f6020819052908152604090205481565b61009c61009736600461015e565b6100ea565b005b6100c57f0000000000000000000000002a3dd3eb832af982ec71669e178424b10dca2ede81565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610061565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000002a3dd3eb832af982ec71669e178424b10dca2ede1614610159576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b5f6020828403121561016e575f80fd5b503591905056fea26469706673582212205108c6c4f924146b736832a1bdf696e20d900450207b7452462368d150f2c71c64736f6c63430008140033" + }, + { + "contractName": "PolygonZkEVMGlobalExitRootL2 proxy", + "balance": "0", + "nonce": "1", + "address": "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa", + "bytecode": "0x60806040523661001357610011610017565b005b6100115b61001f6101b7565b6001600160a01b0316336001600160a01b0316141561016f5760606001600160e01b031960003516631b2ce7f360e11b8114156100655761005e6101ea565b9150610167565b6001600160e01b0319811663278f794360e11b14156100865761005e610241565b6001600160e01b031981166308f2839760e41b14156100a75761005e610287565b6001600160e01b031981166303e1469160e61b14156100c85761005e6102b8565b6001600160e01b03198116635c60da1b60e01b14156100e95761005e6102f8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b61017761030c565b565b606061019e83836040518060600160405280602781526020016108576027913961031c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101f4610394565b600061020336600481846106a2565b81019061021091906106e8565b905061022d8160405180602001604052806000815250600061039f565b505060408051602081019091526000815290565b606060008061025336600481846106a2565b8101906102609190610719565b915091506102708282600161039f565b604051806020016040528060008152509250505090565b6060610291610394565b60006102a036600481846106a2565b8101906102ad91906106e8565b905061022d816103cb565b60606102c2610394565b60006102cc6101b7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b6060610302610394565b60006102cc610422565b610177610317610422565b610431565b6060600080856001600160a01b0316856040516103399190610807565b600060405180830381855af49150503d8060008114610374576040519150601f19603f3d011682016040523d82523d6000602084013e610379565b606091505b509150915061038a86838387610455565b9695505050505050565b341561017757600080fd5b6103a8836104d3565b6000825111806103b55750805b156103c6576103c48383610179565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103f46101b7565b604080516001600160a01b03928316815291841660208301520160405180910390a161041f81610513565b50565b600061042c6105bc565b905090565b3660008037600080366000845af43d6000803e808015610450573d6000f35b3d6000fd5b606083156104c15782516104ba576001600160a01b0385163b6104ba5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161015e565b50816104cb565b6104cb83836105e4565b949350505050565b6104dc8161060e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105785760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161015e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101db565b8151156105f45781518083602001fd5b8060405162461bcd60e51b815260040161015e9190610823565b6001600160a01b0381163b61067b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161015e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61059b565b600080858511156106b257600080fd5b838611156106bf57600080fd5b5050820193919092039150565b80356001600160a01b03811681146106e357600080fd5b919050565b6000602082840312156106fa57600080fd5b61019e826106cc565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561072c57600080fd5b610735836106cc565b9150602083013567ffffffffffffffff8082111561075257600080fd5b818501915085601f83011261076657600080fd5b81358181111561077857610778610703565b604051601f8201601f19908116603f011681019083821181831017156107a0576107a0610703565b816040528281528860208487010111156107b957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107f65781810151838201526020016107de565b838111156103c45750506000910152565b600082516108198184602087016107db565b9190910192915050565b60208152600082518060208401526108428160408501602087016107db565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122012bb4f564f73959a03513dc74fc3c6e40e8386e6f02c16b78d6db00ce0aa16af64736f6c63430008090033", + "storage": { + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x0000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000000200143fa295ee4dffef22ee2616c2e008d81688" + } + }, + { + "contractName": "PolygonZkEVMTimelock", + "balance": "0", + "nonce": "1", + "address": "0xBBa0935Fa93Eb23de7990b47F0D96a8f75766d13", + "bytecode": "0x6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220e28ae7494480ab1c619fd775dc5ff665588c808a910d66178a982c2e7c76a1e664736f6c63430008140033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x00000000000000000000000000000000000000000000000000000000000d2f00", + "0xb7dfbbca55dd7b7b40403b7620ec95da956b60d562518460548c310b9ba22ee5": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x9fa2d8034dbcb437bee38d61fbd100910e1342ffc07f128aa1b8e6790b7f3f68": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x64494413541ff93b31aa309254e3fed72a7456e9845988b915b4c7a7ceba8814": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x8af78a811b91830f719aeb3279e6ef47b4b581bcf168d6d9015d376b23a240bc": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x3412d5605ac6cd444957cedb533e5dacad6378b4bc819ebe3652188a665066d6": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x9b56cc8bdadd190ab692f9895be09d0edc2ddf428710bebe53c4911e5bc08f42": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d706a": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x74be529e918f2e5719738045bde8f05a9e9498aace6df8d886a992d046f546a1": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xc3ad33e20b0c56a223ad5104fff154aa010f8715b9c981fd38fdc60a4d1a52fc": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5" + } + }, + { + "accountName": "keyless Deployer", + "balance": "0", + "nonce": "1", + "address": "0x9d90066e7478496e2284E54c3548106bb4F90E50" + }, + { + "accountName": "deployer", + "balance": "0", + "nonce": "8", + "address": "0x4c1665d6651ecEfa59B9B3041951608468b18891" + } + ] +} \ No newline at end of file diff --git a/tools/deployVerifier/deployVerifier.ts b/tools/deployVerifier/deployVerifier.ts new file mode 100644 index 000000000..63556cc76 --- /dev/null +++ b/tools/deployVerifier/deployVerifier.ts @@ -0,0 +1,101 @@ +/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if */ +/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */ +import {expect} from "chai"; +import path = require("path"); +import fs = require("fs"); + +import * as dotenv from "dotenv"; +dotenv.config({path: path.resolve(__dirname, "../../../.env")}); +import {ethers, upgrades} from "hardhat"; +const deployParameters = require("../deploy_verifier_parameters.json"); + +async function main() { + // Load provider + let currentProvider = ethers.provider; + if (deployParameters.multiplierGas || deployParameters.maxFeePerGas) { + if (process.env.HARDHAT_NETWORK !== "hardhat") { + currentProvider = ethers.getDefaultProvider( + `https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}` + ) as any; + if (deployParameters.maxPriorityFeePerGas && deployParameters.maxFeePerGas) { + console.log( + `Hardcoded gas used: MaxPriority${deployParameters.maxPriorityFeePerGas} gwei, MaxFee${deployParameters.maxFeePerGas} gwei` + ); + const FEE_DATA = new ethers.FeeData( + null, + ethers.parseUnits(deployParameters.maxFeePerGas, "gwei"), + ethers.parseUnits(deployParameters.maxPriorityFeePerGas, "gwei") + ); + + currentProvider.getFeeData = async () => FEE_DATA; + } else { + console.log("Multiplier gas used: ", deployParameters.multiplierGas); + async function overrideFeeData() { + const feedata = await ethers.provider.getFeeData(); + return new ethers.FeeData( + null, + ((feedata.maxFeePerGas as bigint) * BigInt(deployParameters.multiplierGas)) / 1000n, + ((feedata.maxPriorityFeePerGas as bigint) * BigInt(deployParameters.multiplierGas)) / 1000n + ); + } + currentProvider.getFeeData = overrideFeeData; + } + } + } + + // Load deployer + let deployer; + if (deployParameters.deployerPvtKey) { + deployer = new ethers.Wallet(deployParameters.deployerPvtKey, currentProvider); + } else if (process.env.MNEMONIC) { + deployer = ethers.HDNodeWallet.fromMnemonic( + ethers.Mnemonic.fromPhrase(process.env.MNEMONIC), + "m/44'/60'/0'/0/0" + ).connect(currentProvider); + } else { + [deployer] = await ethers.getSigners(); + } + + console.log("deploying with: ", deployer.address); + + /* + *Deployment pol + */ + let verifierContract; + if (deployParameters.realVerifier === true) { + const VerifierRollup = await ethers.getContractFactory("FflonkVerifier", deployer); + verifierContract = await VerifierRollup.deploy(); + await verifierContract.waitForDeployment(); + } else { + const VerifierRollupHelperFactory = await ethers.getContractFactory("VerifierRollupHelperMock", deployer); + verifierContract = await VerifierRollupHelperFactory.deploy(); + await verifierContract.waitForDeployment(); + } + console.log("#######################\n"); + console.log("Verifier deployed to:", verifierContract.target); + console.log("#######################\n"); + console.log("verifierContract deployed to:", verifierContract.target); + console.log("you can verify the new verifierContract address with:"); + console.log(`npx hardhat ${verifierContract.target} --network ${process.env.HARDHAT_NETWORK}\n`); +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); + +// OZ test functions +function genOperation(target: any, value: any, data: any, predecessor: any, salt: any) { + const id = ethers.solidityPackedKeccak256( + ["address", "uint256", "bytes", "uint256", "bytes32"], + [target, value, data, predecessor, salt] + ); + return { + id, + target, + value, + data, + predecessor, + salt, + }; +} diff --git a/tools/deployVerifier/deploy_parameters.json.example b/tools/deployVerifier/deploy_parameters.json.example new file mode 100644 index 000000000..82d313e24 --- /dev/null +++ b/tools/deployVerifier/deploy_parameters.json.example @@ -0,0 +1,7 @@ +{ + "realVerifier": true, + "deployerPvtKey": "", + "maxFeePerGas":"", + "maxPriorityFeePerGas":"", + "multiplierGas": "" +} diff --git a/upgrade/timelockTransaction/README.md b/upgrade/timelockTransaction/README.md deleted file mode 100644 index 9e9cd7fa5..000000000 --- a/upgrade/timelockTransaction/README.md +++ /dev/null @@ -1,54 +0,0 @@ -## Requirements - -- node version: 14.x -- npm version: 7.x - -## Upgrade - -``` -npm i -cp .env.example .env -``` - -Fill `.env` with your `MNEMONIC` and `INFURA_PROJECT_ID` - -In order to upgrade the contracts we will need the information on `deployments/${network}_$(date +%s)` - -In project root, copy the `${network}.json` of the deployment that you want to upgrade and copy it on the `./.openzeppelin` -e.g. `cp deployments/${network}_$(date +%s)/${network}.json ./.openzeppelin` - -Then fill the upgrade parameters: - -``` -cd deployment -cp upgrade_parameters.json.example upgrade_parameters.json -``` - -Fill created `upgrade_parameters.json` with appropiate parameters. -You should fullfill the upgrades array, with all the updates that you intend to do ( more information in `upgrade-parameters.json` section) - -if the deployment was deployed without a timelock you can use the `simpleUpgradeScript.js`: - -- Run the script - -Otherwise, in case of timelock use `timeLockUpgrade.js` - -- Run the script -- Now the necessary transactions to interact with the timelock are printed in the screen `schedule` and `execute`, also will be saved in - `./upgrade_output_${new Date().getTime() / 1000}.json` file -- With the owner of the timelock (multisig or account), send the data printed by `schedule` to the `Timelock` contract. -- Once the necessary `timelockMinDelay` has expired, with the same account you can now send the data printed by `execute` to the `Timelock` contract and the contracts will be upgraded. - -## upgrade-parameters.json - -- `timelockMinDelay`: number, timelock delay between the schedule and execution, must be bigger than current min delay -- `upgrades`: Object, Indicates which address and to which implementation must upgrade - - address: address of the current proxy - - contractName: string, contract name that the proxy will be updated to - - constructorArgs: Array, optional, constructor arguments of the new implementation deployed - -### Optional Parameters - -- `multiplierGas`: number, Gas multiplier. If maxFeePerGas and maxPriorityFeePerGas are set, will not take effect -- `deployerPvtKey`: string, deployerPvtKey of the deployer -- `timelockSalt`: string, Optional salt for the timelock diff --git a/upgrade/timelockTransaction/deployVerifier.js b/upgrade/timelockTransaction/deployVerifier.js deleted file mode 100644 index 3f096f6da..000000000 --- a/upgrade/timelockTransaction/deployVerifier.js +++ /dev/null @@ -1,34 +0,0 @@ -/* eslint-disable no-await-in-loop */ -/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */ - -const { ethers } = require('hardhat'); -const path = require('path'); -require('dotenv').config({ path: path.resolve(__dirname, '../.env') }); -async function main() { - let currentProvider = ethers.provider; - let deployer; - if (process.env.MNEMONIC) { - deployer = ethers.Wallet.fromMnemonic(process.env.MNEMONIC, 'm/44\'/60\'/0\'/0/0').connect(currentProvider); - console.log("using mnemonic", deployer.address) - } else { - [deployer] = (await ethers.getSigners()); - } - - /* - * Deploy verifier - */ - const VerifierRollup = await ethers.getContractFactory('FflonkVerifier', deployer); - const verifierContract = await VerifierRollup.deploy(); - await verifierContract.deployed(); - - console.log('#######################\n'); - console.log('Verifier deployed to:', verifierContract.address); - - console.log("you can verify the new verifier address with:") - console.log(`npx hardhat verify ${verifierContract.address} --network ${process.env.HARDHAT_NETWORK}`); -} - -main().catch((e) => { - console.error(e); - process.exit(1); -}); diff --git a/upgrade/timelockTransaction/simpleUpgrade.js b/upgrade/timelockTransaction/simpleUpgrade.js deleted file mode 100644 index 9d639ba68..000000000 --- a/upgrade/timelockTransaction/simpleUpgrade.js +++ /dev/null @@ -1,71 +0,0 @@ -/* eslint-disable no-console, no-unused-vars */ -const hre = require('hardhat'); -const { ethers, upgrades } = require('hardhat'); -const path = require('path'); -require('dotenv').config({ path: path.resolve(__dirname, '../.env') }); -const upgradeParameters = require('./upgrade_parameters.json'); - -async function main() { - // Set multiplier Gas - let currentProvider = ethers.provider; - if (upgradeParameters.multiplierGas) { - if (process.env.HARDHAT_NETWORK !== 'hardhat') { - const multiplierGas = upgradeParameters.multiplierGas; - currentProvider = new ethers.providers.JsonRpcProvider(`https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}`); - async function overrideFeeData() { - const feedata = await ethers.provider.getFeeData(); - return { - maxFeePerGas: feedata.maxFeePerGas.mul(multiplierGas), - maxPriorityFeePerGas: feedata.maxPriorityFeePerGas.mul(multiplierGas), - }; - } - currentProvider.getFeeData = overrideFeeData; - } - } - let deployer; - if (upgradeParameters.deployerPvtKey) { - deployer = new ethers.Wallet(upgradeParameters.deployerPvtKey, currentProvider); - } else if (process.env.MNEMONIC) { - deployer = ethers.Wallet.fromMnemonic(process.env.MNEMONIC, 'm/44\'/60\'/0\'/0/0').connect(currentProvider); - } else { - [deployer] = (await ethers.getSigners()); - } - - // compìle contracts - await hre.run('compile'); - - for (const upgrade of upgradeParameters.upgrades) { - const proxyPolygonAddress = upgrade.address; - const polygonZkEVMFactory = await ethers.getContractFactory(upgrade.contractName, deployer); - - if (upgrade.constructorArgs) { - const txZKEVM = await upgrades.upgradeProxy(proxyPolygonAddress, polygonZkEVMFactory, - { - constructorArgs: upgrade.constructorArgs, - unsafeAllow: ['constructor', 'state-variable-immutable'], - call: {fn: upgrade.callAfterUpgrade.functionName, args: upgrade.callAfterUpgrade.arguments} - }); - - console.log(txZKEVM.deployTransaction); - console.log(await txZKEVM.deployTransaction.wait()); - console.log('upgrade succesfull', upgrade.contractName); - - console.log(txZKEVM.address); - console.log("you can verify the new impl address with:") - console.log(`npx hardhat verify --constructor-args upgrade/arguments.js ${txZKEVM.address} --network ${process.env.HARDHAT_NETWORK}\n`); - console.log("Copy the following constructor arguments on: upgrade/arguments.js \n", upgrade.constructorArgs) - } else { - const txZKEVM = await upgrades.upgradeProxy(proxyPolygonAddress, polygonZkEVMFactory) - - console.log(txZKEVM.address); - console.log("you can verify the new impl address with:") - console.log(`npx hardhat verify ${txZKEVM.address} --network ${process.env.HARDHAT_NETWORK}`); - } - } -} -main() - .then(() => process.exit(0)) - .catch((error) => { - console.error(error); - process.exit(1); - }); diff --git a/upgrade/timelockTransaction/timeLockUpgrade.js b/upgrade/timelockTransaction/timeLockUpgrade.js deleted file mode 100644 index c0c9114a1..000000000 --- a/upgrade/timelockTransaction/timeLockUpgrade.js +++ /dev/null @@ -1,179 +0,0 @@ -/* eslint-disable no-console, no-unused-vars, no-use-before-define */ -const hre = require('hardhat'); -const { ethers, upgrades } = require('hardhat'); -const path = require('path'); -require('dotenv').config({ path: path.resolve(__dirname, '../.env') }); -const fs = require('fs'); - -const upgradeParameters = require('./upgrade_parameters.json'); - -const pathOutputJson = path.join(__dirname, `./upgrade_output_${new Date().getTime() / 1000}.json`); - -async function main() { - // Set multiplier Gas - let currentProvider = ethers.provider; - if (upgradeParameters.multiplierGas) { - if (process.env.HARDHAT_NETWORK !== 'hardhat') { - const { multiplierGas } = upgradeParameters; - currentProvider = new ethers.providers.JsonRpcProvider(`https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}`); - async function overrideFeeData() { - const feedata = await ethers.provider.getFeeData(); - return { - maxFeePerGas: feedata.maxFeePerGas.mul(multiplierGas), - maxPriorityFeePerGas: feedata.maxPriorityFeePerGas.mul(multiplierGas), - }; - } - currentProvider.getFeeData = overrideFeeData; - } - } - - // Check contract name existence - for (const upgrade of upgradeParameters.upgrades) { - await ethers.getContractFactory(upgrade.contractName); - } - - let deployer; - if (upgradeParameters.deployerPvtKey) { - deployer = new ethers.Wallet(upgradeParameters.deployerPvtKey, currentProvider); - } else if (process.env.MNEMONIC) { - deployer = ethers.Wallet.fromMnemonic(process.env.MNEMONIC, 'm/44\'/60\'/0\'/0/0').connect(currentProvider); - console.log('using mnemonic', deployer.address); - } else { - [deployer] = (await ethers.getSigners()); - } - // compìle contracts - await hre.run('compile'); - - const proxyAdmin = await upgrades.admin.getInstance(); - const output = []; - - // Upgrade zkevm - for (const upgrade of upgradeParameters.upgrades) { - const proxyPolygonAddress = upgrade.address; - const polygonZkEVMFactory = await ethers.getContractFactory(upgrade.contractName, deployer); - - let newImplPolygonAddress; - - if (upgrade.constructorArgs) { - newImplPolygonAddress = await upgrades.prepareUpgrade( - proxyPolygonAddress, - polygonZkEVMFactory, - { - constructorArgs: upgrade.constructorArgs, - unsafeAllow: ['constructor', 'state-variable-immutable'], - }, - ); - - console.log({ newImplPolygonAddress }); - console.log('you can verify the new impl address with:'); - console.log(`npx hardhat verify --constructor-args upgrade/arguments.js ${newImplPolygonAddress} --network ${process.env.HARDHAT_NETWORK}\n`); - console.log('Copy the following constructor arguments on: upgrade/arguments.js \n', upgrade.constructorArgs); - } else { - newImplPolygonAddress = await upgrades.prepareUpgrade(proxyPolygonAddress, polygonZkEVMFactory); - - console.log({ newImplPolygonAddress }); - console.log('you can verify the new impl address with:'); - console.log(`npx hardhat verify ${newImplPolygonAddress} --network ${process.env.HARDHAT_NETWORK}`); - } - - // Use timelock - const salt = upgradeParameters.timelockSalt || ethers.HashZero; - - let operation; - if (upgrade.callAfterUpgrade) { - operation = genOperation( - proxyAdmin.address, - 0, // value - proxyAdmin.interface.encodeFunctionData( - 'upgradeAndCall', - [ - proxyPolygonAddress, - newImplPolygonAddress, - polygonZkEVMFactory.interface.encodeFunctionData( - upgrade.callAfterUpgrade.functionName, - upgrade.callAfterUpgrade.arguments, - ), - ], - ), - ethers.HashZero, // predecesoor - salt, // salt - ); - } else { - operation = genOperation( - proxyAdmin.address, - 0, // value - proxyAdmin.interface.encodeFunctionData( - 'upgrade', - [proxyPolygonAddress, - newImplPolygonAddress], - ), - ethers.HashZero, // predecesoor - salt, // salt - ); - } - - // Timelock operations - const TimelockFactory = await ethers.getContractFactory('PolygonZkEVMTimelock', deployer); - const minDelay = upgradeParameters.timelockMinDelay || 0; - - // Schedule operation - const scheduleData = TimelockFactory.interface.encodeFunctionData( - 'schedule', - [ - operation.target, - operation.value, - operation.data, - operation.predecessor, - operation.salt, - minDelay, - ], - ); - // Execute operation - const executeData = TimelockFactory.interface.encodeFunctionData( - 'execute', - [ - operation.target, - operation.value, - operation.data, - operation.predecessor, - operation.salt, - ], - ); - - console.log({ scheduleData }); - console.log({ executeData }); - output.push({ - contractName: upgrade.contractName, - scheduleData, - executeData, - }); - } - - fs.writeFileSync(pathOutputJson, JSON.stringify(output, null, 1)); -} -main() - .then(() => process.exit(0)) - .catch((error) => { - console.error(error); - process.exit(1); - }); - -// OZ test functions -function genOperation(target, value, data, predecessor, salt) { - const id = ethers.solidityPackedKeccak256([ - 'address', - 'uint256', - 'bytes', - 'uint256', - 'bytes32', - ], [ - target, - value, - data, - predecessor, - salt, - ]); - return { - id, target, value, data, predecessor, salt, - }; -} diff --git a/upgrade/timelockTransaction/upgrade_parameters.json.example b/upgrade/timelockTransaction/upgrade_parameters.json.example deleted file mode 100644 index 4732f4905..000000000 --- a/upgrade/timelockTransaction/upgrade_parameters.json.example +++ /dev/null @@ -1,27 +0,0 @@ -{ - "timelockMinDelay":10, - "upgrades": [ - { - "address": "0xEfF10DB3c6445FB06411c6fc74fDCC8D1019aC7d", - "contractName": "PolygonZkEVMTestnetV2", - "constructorArgs": [ - "0x6407cf296a27B38fd29c401518504D388F1DFB3d", - "0xF1b13757bcF3EF902a7847f409A6068BA43a89D4", - "0x4ceB990D2E2ee6d0e163fa80d12bac72C0F28D52", - "0xcFA773Cc48FBde3CA4D24eeCb19D224d697026b2", - 1440, - 2 - ], - "callAfterUpgrade": - { - "functionName": "updateVersion", - "arguments": [ - "v0.8.0.0-rc.2-forkid.2" - ] - } - } - ], - "multiplierGas": 0, - "deployerPvtKey": "", - "timelockSalt": "" -} \ No newline at end of file From e9ac8337217236ce017cd684d0b1676d14069fba Mon Sep 17 00:00:00 2001 From: invocamanman Date: Thu, 8 Feb 2024 11:30:08 +0100 Subject: [PATCH 213/230] udpate genesis name --- .../createGenesis/{new_genesis_mainnet.json => new_genesis.json} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tools/createGenesis/{new_genesis_mainnet.json => new_genesis.json} (100%) diff --git a/tools/createGenesis/new_genesis_mainnet.json b/tools/createGenesis/new_genesis.json similarity index 100% rename from tools/createGenesis/new_genesis_mainnet.json rename to tools/createGenesis/new_genesis.json From 4abf68712ca680ce745aae52a0c39e34ba336f4d Mon Sep 17 00:00:00 2001 From: invocamanman Date: Thu, 8 Feb 2024 15:04:02 +0100 Subject: [PATCH 214/230] update addRollup type --- tools/addRollupType/addRollupType.ts | 38 +++----- tools/addRollupType/addRollupTypeTimelock.ts | 17 +--- .../add_rollup_type.json.example | 2 - tools/addRollupType/genesis.json | 92 +++++++++++++++++++ 4 files changed, 111 insertions(+), 38 deletions(-) create mode 100644 tools/addRollupType/genesis.json diff --git a/tools/addRollupType/addRollupType.ts b/tools/addRollupType/addRollupType.ts index 3776c0211..a725aa0c6 100644 --- a/tools/addRollupType/addRollupType.ts +++ b/tools/addRollupType/addRollupType.ts @@ -7,7 +7,6 @@ import fs = require("fs"); import * as dotenv from "dotenv"; dotenv.config({path: path.resolve(__dirname, "../../.env")}); import {ethers, upgrades} from "hardhat"; -import {HardhatEthersSigner} from "@nomicfoundation/hardhat-ethers/signers"; const addRollupParameters = require("./add_rollup_type.json"); const genesis = require("./genesis.json"); @@ -15,10 +14,9 @@ const genesis = require("./genesis.json"); const pathOutputJson = path.join(__dirname, "./add_rollup_type_output.json"); import {PolygonRollupManager} from "../../typechain-types"; +import "../../deployment/helpers/utils"; async function main() { - const attemptsDeployProxy = 20; - const outputJson = {} as any; /* @@ -26,13 +24,6 @@ async function main() { * Check that every necessary parameter is fullfilled */ const mandatoryDeploymentParameters = [ - "realVerifier", - "trustedSequencerURL", - "networkName", - "description", - "trustedSequencer", - "chainID", - "adminZkEVM", "forkID", "consensusContract", "polygonRollupManagerAddress", @@ -40,6 +31,7 @@ async function main() { "polygonZkEVMGlobalExitRootAddress", "polTokenAddress", "verifierAddress", + "rollupCompatibilityID", ]; for (const parameterName of mandatoryDeploymentParameters) { @@ -49,8 +41,7 @@ async function main() { } const { - realVerifier, - description, + rollupCompatibilityID, forkID, consensusContract, polygonRollupManagerAddress, @@ -145,17 +136,18 @@ async function main() { await PolygonconsensusContract.waitForDeployment(); // Add a new rollup type with timelock - const rollupCompatibilityID = 0; - await ( - await rollupManagerContract.addNewRollupType( - PolygonconsensusContract.target, - verifierAddress, - forkID, - rollupCompatibilityID, - genesis.root, - description - ) - ).wait(); + console.log( + await ( + await rollupManagerContract.addNewRollupType( + PolygonconsensusContract.target, + verifierAddress, + forkID, + rollupCompatibilityID, + genesis.root, + JSON.stringify(genesis) + ) + ).wait() + ); console.log("#######################\n"); console.log("Added new Rollup Type deployed"); diff --git a/tools/addRollupType/addRollupTypeTimelock.ts b/tools/addRollupType/addRollupTypeTimelock.ts index ed00dc337..9c2cc3eee 100644 --- a/tools/addRollupType/addRollupTypeTimelock.ts +++ b/tools/addRollupType/addRollupTypeTimelock.ts @@ -7,14 +7,12 @@ import fs = require("fs"); import * as dotenv from "dotenv"; dotenv.config({path: path.resolve(__dirname, "../../.env")}); import {ethers, upgrades} from "hardhat"; -import {HardhatEthersSigner} from "@nomicfoundation/hardhat-ethers/signers"; const addRollupParameters = require("./add_rollup_type.json"); const genesis = require("./genesis.json"); const pathOutputJson = path.join(__dirname, "./add_rollup_type_output.json"); - -import {PolygonRollupManager} from "../../typechain-types"; +import "../../deployment/helpers/utils"; async function main() { const outputJson = {} as any; @@ -24,13 +22,6 @@ async function main() { * Check that every necessary parameter is fullfilled */ const mandatoryDeploymentParameters = [ - "realVerifier", - "trustedSequencerURL", - "networkName", - "description", - "trustedSequencer", - "chainID", - "adminZkEVM", "forkID", "consensusContract", "polygonRollupManagerAddress", @@ -38,6 +29,7 @@ async function main() { "polygonZkEVMGlobalExitRootAddress", "polTokenAddress", "verifierAddress", + "rollupCompatibilityID", "timelockDelay", ]; @@ -48,7 +40,7 @@ async function main() { } const { - description, + rollupCompatibilityID, forkID, consensusContract, polygonRollupManagerAddress, @@ -131,7 +123,6 @@ async function main() { // load timelock const timelockContractFactory = await ethers.getContractFactory("PolygonZkEVMTimelock", deployer); - const rollupCompatibilityID = 0; const operation = genOperation( polygonRollupManagerAddress, 0, // value @@ -141,7 +132,7 @@ async function main() { forkID, rollupCompatibilityID, genesis.root, - description, + JSON.stringify(genesis), ]), ethers.ZeroHash, // predecesoor salt // salt diff --git a/tools/addRollupType/add_rollup_type.json.example b/tools/addRollupType/add_rollup_type.json.example index bca0af8d6..51610db1d 100644 --- a/tools/addRollupType/add_rollup_type.json.example +++ b/tools/addRollupType/add_rollup_type.json.example @@ -5,12 +5,10 @@ "polygonZkEVMGlobalExitRootAddress": "0x580bda1e7A0CFAe92Fa7F6c20A3794F169CE3CFb", "polTokenAddress": "0x455e53CBB86018Ac2B8092FdCd39d8444aFFC3F6", "verifierAddress": "0x1C3A3da552b8662CD69538356b1E7c2E9CC1EBD8", - "description": "0.0.1", "forkID": 7, "rollupCompatibilityID": 0, "timelockDelay": 0, "timelockSalt": "", - "gasTokenAddress":"", "deployerPvtKey": "", "maxFeePerGas":"", "maxPriorityFeePerGas":"", diff --git a/tools/addRollupType/genesis.json b/tools/addRollupType/genesis.json new file mode 100644 index 000000000..3605ddf86 --- /dev/null +++ b/tools/addRollupType/genesis.json @@ -0,0 +1,92 @@ +{ + "root": "0xe3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f272", + "genesis": [ + { + "contractName": "PolygonZkEVMDeployer", + "balance": "0", + "nonce": "4", + "address": "0xCB19eDdE626906eB1EE52357a27F62dd519608C2", + "bytecode": "0x60806040526004361061006e575f3560e01c8063715018a61161004c578063715018a6146100e25780638da5cb5b146100f6578063e11ae6cb1461011f578063f2fde38b14610132575f80fd5b80632b79805a146100725780634a94d487146100875780636d07dbf81461009a575b5f80fd5b610085610080366004610908565b610151565b005b6100856100953660046109a2565b6101c2565b3480156100a5575f80fd5b506100b96100b43660046109f5565b610203565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ed575f80fd5b50610085610215565b348015610101575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff166100b9565b61008561012d366004610a15565b610228565b34801561013d575f80fd5b5061008561014c366004610a61565b61028e565b61015961034a565b5f6101658585856103ca565b90506101718183610527565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a15050505050565b6101ca61034a565b6101d583838361056a565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b905f90a1505050565b5f61020e8383610598565b9392505050565b61021d61034a565b6102265f6105a4565b565b61023061034a565b5f61023c8484846103ca565b60405173ffffffffffffffffffffffffffffffffffffffff821681529091507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a150505050565b61029661034a565b73ffffffffffffffffffffffffffffffffffffffff811661033e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610347816105a4565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610335565b5f83471015610435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610335565b81515f0361049f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610335565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff811661020e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610335565b606061020e83835f6040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c65640000815250610618565b6060610590848484604051806060016040528060298152602001610b0860299139610618565b949350505050565b5f61020e83833061072d565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156106aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610335565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516106d29190610a9c565b5f6040518083038185875af1925050503d805f811461070c576040519150601f19603f3d011682016040523d82523d5f602084013e610711565b606091505b509150915061072287838387610756565b979650505050505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b606083156107eb5782515f036107e45773ffffffffffffffffffffffffffffffffffffffff85163b6107e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610335565b5081610590565b61059083838151156108005781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103359190610ab7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112610870575f80fd5b813567ffffffffffffffff8082111561088b5761088b610834565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156108d1576108d1610834565b816040528381528660208588010111156108e9575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f806080858703121561091b575f80fd5b8435935060208501359250604085013567ffffffffffffffff80821115610940575f80fd5b61094c88838901610861565b93506060870135915080821115610961575f80fd5b5061096e87828801610861565b91505092959194509250565b803573ffffffffffffffffffffffffffffffffffffffff8116811461099d575f80fd5b919050565b5f805f606084860312156109b4575f80fd5b6109bd8461097a565b9250602084013567ffffffffffffffff8111156109d8575f80fd5b6109e486828701610861565b925050604084013590509250925092565b5f8060408385031215610a06575f80fd5b50508035926020909101359150565b5f805f60608486031215610a27575f80fd5b8335925060208401359150604084013567ffffffffffffffff811115610a4b575f80fd5b610a5786828701610861565b9150509250925092565b5f60208284031215610a71575f80fd5b61020e8261097a565b5f5b83811015610a94578181015183820152602001610a7c565b50505f910152565b5f8251610aad818460208701610a7a565b9190910192915050565b602081525f8251806020840152610ad5816040850160208701610a7a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220330b94dc698c4d290bf55c23f13b473cde6a6bae0030cb902de18af54e35839f64736f6c63430008140033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000004c1665d6651ecefa59b9b3041951608468b18891" + } + }, + { + "contractName": "ProxyAdmin", + "balance": "0", + "nonce": "1", + "address": "0x0F99738B2Fc14D77308337f3e2596b63aE7BCC4A", + "bytecode": "0x608060405260043610610079575f3560e01c80639623609d1161004c5780639623609d1461012357806399a88ec414610136578063f2fde38b14610155578063f3b7dead14610174575f80fd5b8063204e1c7a1461007d578063715018a6146100c55780637eff275e146100db5780638da5cb5b146100fa575b5f80fd5b348015610088575f80fd5b5061009c6100973660046105e8565b610193565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100d0575f80fd5b506100d9610244565b005b3480156100e6575f80fd5b506100d96100f536600461060a565b610257565b348015610105575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff1661009c565b6100d961013136600461066e565b6102e0565b348015610141575f80fd5b506100d961015036600461060a565b610371565b348015610160575f80fd5b506100d961016f3660046105e8565b6103cd565b34801561017f575f80fd5b5061009c61018e3660046105e8565b610489565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907f5c60da1b00000000000000000000000000000000000000000000000000000000815260040190565b5f60405180830381855afa9150503d805f8114610215576040519150601f19603f3d011682016040523d82523d5f602084013e61021a565b606091505b509150915081610228575f80fd5b8080602001905181019061023c919061075b565b949350505050565b61024c6104d3565b6102555f610553565b565b61025f6104d3565b6040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690638f283970906024015b5f604051808303815f87803b1580156102c6575f80fd5b505af11580156102d8573d5f803e3d5ffd5b505050505050565b6102e86104d3565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef28690349061033e9086908690600401610776565b5f604051808303818588803b158015610355575f80fd5b505af1158015610367573d5f803e3d5ffd5b5050505050505050565b6103796104d3565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690633659cfe6906024016102af565b6103d56104d3565b73ffffffffffffffffffffffffffffffffffffffff811661047d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61048681610553565b50565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907ff851a44000000000000000000000000000000000000000000000000000000000815260040190565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610474565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610486575f80fd5b5f602082840312156105f8575f80fd5b8135610603816105c7565b9392505050565b5f806040838503121561061b575f80fd5b8235610626816105c7565b91506020830135610636816105c7565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f805f60608486031215610680575f80fd5b833561068b816105c7565b9250602084013561069b816105c7565b9150604084013567ffffffffffffffff808211156106b7575f80fd5b818601915086601f8301126106ca575f80fd5b8135818111156106dc576106dc610641565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561072257610722610641565b8160405282815289602084870101111561073a575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f6020828403121561076b575f80fd5b8151610603816105c7565b73ffffffffffffffffffffffffffffffffffffffff831681525f602060408184015283518060408501525f5b818110156107be578581018301518582016060015282016107a2565b505f6060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050939250505056fea26469706673582212203083a4ccc2e42eed60bd19037f2efa77ed086dc7a5403f75bebb995dcba2221c64736f6c63430008140033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000bba0935fa93eb23de7990b47f0d96a8f75766d13" + } + }, + { + "contractName": "PolygonZkEVMBridge implementation", + "balance": "0", + "nonce": "1", + "address": "0x5ac4182A1dd41AeEf465E40B82fd326BF66AB82C", + "bytecode": "0x6080604052600436106101db575f3560e01c806383f24403116100fd578063ccaa2d1111610092578063ee25560b11610062578063ee25560b146105a9578063f5efcd79146105d4578063f811bff7146105f3578063fb57083414610612575f80fd5b8063ccaa2d111461053b578063cd5865791461055a578063d02103ca1461056d578063dbc1697614610595575f80fd5b8063bab161bf116100cd578063bab161bf146104b9578063be5831c7146104da578063c00f14ab146104fd578063cc4616321461051c575f80fd5b806383f244031461043d5780638ed7e3f21461045c578063aaa13cc21461047b578063b8b284d01461049a575f80fd5b80633cbc795b116101735780637843298b116101435780637843298b146103c257806379e2cf97146103e157806381b1c174146103f557806383c43a5514610429575f80fd5b80633cbc795b146103385780633e197043146103705780634b2f336d1461038f5780635ca1e165146103ae575f80fd5b806327aef4e8116101ae57806327aef4e81461026d5780632dfdf0b51461028e578063318aee3d146102b15780633c351e1014610319575f80fd5b806315064c96146101df5780632072f6c51461020d57806322e95f2c14610223578063240ff3781461025a575b5f80fd5b3480156101ea575f80fd5b506068546101f89060ff1681565b60405190151581526020015b60405180910390f35b348015610218575f80fd5b50610221610631565b005b34801561022e575f80fd5b5061024261023d366004612fb9565b610666565b6040516001600160a01b039091168152602001610204565b610221610268366004613040565b6106d0565b348015610278575f80fd5b50610281610759565b6040516102049190613102565b348015610299575f80fd5b506102a360535481565b604051908152602001610204565b3480156102bc575f80fd5b506102f56102cb36600461311b565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201610204565b348015610324575f80fd5b50606d54610242906001600160a01b031681565b348015610343575f80fd5b50606d5461035b90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610204565b34801561037b575f80fd5b506102a361038a366004613144565b6107e5565b34801561039a575f80fd5b50606f54610242906001600160a01b031681565b3480156103b9575f80fd5b506102a361088e565b3480156103cd575f80fd5b506102426103dc3660046131be565b61096a565b3480156103ec575f80fd5b50610221610993565b348015610400575f80fd5b5061024261040f366004613204565b606a6020525f90815260409020546001600160a01b031681565b348015610434575f80fd5b506102816109b4565b348015610448575f80fd5b506102a361045736600461322c565b6109d3565b348015610467575f80fd5b50606c54610242906001600160a01b031681565b348015610486575f80fd5b5061024261049536600461332d565b610aa8565b3480156104a5575f80fd5b506102216104b43660046133c3565b610be7565b3480156104c4575f80fd5b5060685461035b90610100900463ffffffff1681565b3480156104e5575f80fd5b5060685461035b90600160c81b900463ffffffff1681565b348015610508575f80fd5b5061028161051736600461311b565b610cc2565b348015610527575f80fd5b506101f8610536366004613441565b610d07565b348015610546575f80fd5b50610221610555366004613472565b610d8f565b610221610568366004613556565b6112c0565b348015610578575f80fd5b50606854610242906501000000000090046001600160a01b031681565b3480156105a0575f80fd5b5061022161172c565b3480156105b4575f80fd5b506102a36105c3366004613204565b60696020525f908152604090205481565b3480156105df575f80fd5b506102216105ee366004613472565b61175f565b3480156105fe575f80fd5b5061022161060d3660046135e6565b611a25565b34801561061d575f80fd5b506101f861062c366004613689565b611d40565b606c546001600160a01b0316331461065c57604051631736745960e31b815260040160405180910390fd5b610664611d57565b565b6040805160e084901b6001600160e01b031916602080830191909152606084901b6bffffffffffffffffffffffff1916602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b60685460ff16156106f457604051630bc011ff60e21b815260040160405180910390fd5b341580159061070d5750606f546001600160a01b031615155b15610744576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610752858534868686611db2565b5050505050565b606e8054610766906136ce565b80601f0160208091040260200160405190810160405280929190818152602001828054610792906136ce565b80156107dd5780601f106107b4576101008083540402835291602001916107dd565b820191905f5260205f20905b8154815290600101906020018083116107c057829003601f168201915b505050505081565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201526001600160e01b031960e088811b821660218401526bffffffffffffffffffffffff19606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b6053545f90819081805b6020811015610961578083901c6001166001036108f557603381602081106108c2576108c2613706565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610922565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806109599061372e565b915050610898565b50919392505050565b5f61098b848461097985611e7c565b61098286611f66565b61049587612047565b949350505050565b605354606854600160c81b900463ffffffff16101561066457610664612114565b60405180611ba00160405280611b668152602001613d80611b66913981565b5f83815b6020811015610a9f57600163ffffffff8516821c81169003610a4257848160208110610a0557610a05613706565b602002013582604051602001610a25929190918252602082015260400190565b604051602081830303815290604052805190602001209150610a8d565b81858260208110610a5557610a55613706565b6020020135604051602001610a74929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610a978161372e565b9150506109d7565b50949350505050565b6040516001600160e01b031960e087901b1660208201526bffffffffffffffffffffffff19606086901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180611ba00160405280611b668152602001613d80611b669139898989604051602001610b3093929190613746565b60408051601f1981840301815290829052610b4e929160200161377e565b60405160208183030381529060405280519060200120604051602001610bc394939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff1615610c0b57604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b0316610c4d576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f54604051632770a7eb60e21b8152336004820152602481018690526001600160a01b0390911690639dc29fac906044015f604051808303815f87803b158015610c96575f80fd5b505af1158015610ca8573d5f803e3d5ffd5b50505050610cba868686868686611db2565b505050505050565b6060610ccd82611e7c565b610cd683611f66565b610cdf84612047565b604051602001610cf193929190613746565b6040516020818303038152906040529050919050565b6068545f908190610100900463ffffffff16158015610d2c575063ffffffff83166001145b15610d3e575063ffffffff8316610d66565b610d5364010000000063ffffffff85166137ac565b610d639063ffffffff86166137c3565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff1615610db357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614610de3576040516302caf51760e11b815260040160405180910390fd5b610e168c8c8c8c8c610e115f8e8e8e8e8e8e8e604051610e049291906137d6565b60405180910390206107e5565b6121c2565b6001600160a01b038616610f6057606f546001600160a01b0316610efa575f6001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015610e6c576020820181803683370190505b50604051610e7a91906137e5565b5f6040518083038185875af1925050503d805f8114610eb4576040519150601f19603f3d011682016040523d82523d5f602084013e610eb9565b606091505b5050905080610ef4576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611256565b606f546040516340c10f1960e01b81526001600160a01b03868116600483015260248201869052909116906340c10f19906044015f604051808303815f87803b158015610f45575f80fd5b505af1158015610f57573d5f803e3d5ffd5b50505050611256565b606d546001600160a01b038781169116148015610f8e5750606d5463ffffffff888116600160a01b90920416145b15610fa5575f6001600160a01b0385168482610e42565b60685463ffffffff610100909104811690881603610fd657610fd16001600160a01b0387168585612354565b611256565b6040516001600160e01b031960e089901b1660208201526bffffffffffffffffffffffff19606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b0316806111f5575f6110808386868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506123d592505050565b6040516340c10f1960e01b81526001600160a01b03898116600483015260248201899052919250908216906340c10f19906044015f604051808303815f87803b1580156110cb575f80fd5b505af11580156110dd573d5f803e3d5ffd5b5050505080606a5f8581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a8388886040516111e7959493929190613828565b60405180910390a150611253565b6040516340c10f1960e01b81526001600160a01b038781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801561123c575f80fd5b505af115801561124e573d5f803e3d5ffd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156112e457604051630bc011ff60e21b815260040160405180910390fd5b6112ec612468565b60685463ffffffff61010090910481169088160361131d576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b03881661141957883414611369576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff16945090611396906136ce565b80601f01602080910402602001604051908101604052809291908181526020018280546113c2906136ce565b801561140d5780601f106113e45761010080835404028352916020019161140d565b820191905f5260205f20905b8154815290600101906020018083116113f057829003601f168201915b505050505091506116a3565b3415611451576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546001600160a01b03908116908916036114c757604051632770a7eb60e21b8152336004820152602481018a90526001600160a01b03891690639dc29fac906044015f604051808303815f87803b1580156114ac575f80fd5b505af11580156114be573d5f803e3d5ffd5b505050506116a3565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901561157957604051632770a7eb60e21b8152336004820152602481018b90526001600160a01b038a1690639dc29fac906044015f604051808303815f87803b158015611551575f80fd5b505af1158015611563573d5f803e3d5ffd5b5050505080602001519450805f01519350611696565b851561158b5761158b898b89896124c1565b6040516370a0823160e01b81523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa1580156115cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f39190613860565b905061160a6001600160a01b038b1633308e612860565b6040516370a0823160e01b81523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa15801561164e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116729190613860565b905061167e8282613877565b6068548c9850610100900463ffffffff169650935050505b61169f89610cc2565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e86886053546040516116e298979695949392919061388a565b60405180910390a16117086117035f85878f8f8789805190602001206107e5565b6128b1565b861561171657611716612114565b5050505061172360018055565b50505050505050565b606c546001600160a01b0316331461175757604051631736745960e31b815260040160405180910390fd5b6106646129b2565b60685460ff161561178357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146117b3576040516302caf51760e11b815260040160405180910390fd5b6117d58c8c8c8c8c610e1160018e8e8e8e8e8e8e604051610e049291906137d6565b606f545f906001600160a01b031661188857846001600160a01b031684888a868660405160240161180994939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161183e91906137e5565b5f6040518083038185875af1925050503d805f8114611878576040519150601f19603f3d011682016040523d82523d5f602084013e61187d565b606091505b505080915050611983565b606f546040516340c10f1960e01b81526001600160a01b03878116600483015260248201879052909116906340c10f19906044015f604051808303815f87803b1580156118d3575f80fd5b505af11580156118e5573d5f803e3d5ffd5b50505050846001600160a01b03168789858560405160240161190a94939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161193f91906137e5565b5f604051808303815f865af19150503d805f8114611978576040519150601f19603f3d011682016040523d82523d5f602084013e61197d565b606091505b50909150505b806119ba576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f54610100900460ff1615808015611a4357505f54600160ff909116105b80611a5c5750303b158015611a5c57505f5460ff166001145b611ad35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805460ff191660011790558015611af4575f805461ff0019166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8a16027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038781169190910291909117909155606c805473ffffffffffffffffffffffffffffffffffffffff19168583161790558616611bcf5763ffffffff851615611bca576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ceb565b606d805463ffffffff8716600160a01b027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b03891617179055606e611c1e8382613970565b50611cbd5f801b6012604051602001611ca991906060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff91909116604082015260e00190565b6040516020818303038152906040526123d5565b606f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790555b611cf3612a22565b8015611723575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b5f81611d4d8686866109d3565b1495945050505050565b60685460ff1615611d7b57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff610100909104811690871603611de3576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051611e3799989796959493929190613a2c565b60405180910390a1611e6e6117036001606860019054906101000a900463ffffffff16338a8a8a8989604051610e049291906137d6565b8215610cba57610cba612114565b60408051600481526024810182526020810180516001600160e01b03167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611edb91906137e5565b5f60405180830381855afa9150503d805f8114611f13576040519150601f19603f3d011682016040523d82523d5f602084013e611f18565b606091505b509150915081611f5d576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525061098b565b61098b81612a94565b60408051600481526024810182526020810180516001600160e01b03167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611fc591906137e5565b5f60405180830381855afa9150503d805f8114611ffd576040519150601f19603f3d011682016040523d82523d5f602084013e612002565b606091505b509150915081611f5d576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525061098b565b60408051600481526024810182526020810180516001600160e01b03167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b038616916120a591906137e5565b5f60405180830381855afa9150503d805f81146120dd576040519150601f19603f3d011682016040523d82523d5f602084013e6120e2565b606091505b50915091508180156120f5575080516020145b61210057601261098b565b8080602001905181019061098b9190613a97565b6053546068805463ffffffff909216600160c81b027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d61217561088e565b6040518263ffffffff1660e01b815260040161219391815260200190565b5f604051808303815f87803b1580156121aa575f80fd5b505af11580156121bc573d5f803e3d5ffd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af1158015612253573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122779190613860565b9050805f036122b1576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80680100000000000000008716156122f5578691506122d3848a8489611d40565b6122f0576040516338105f3b60e21b815260040160405180910390fd5b61233f565b602087901c612305816001613ab2565b9150879250612320612318868c866109d3565b8a8389611d40565b61233d576040516338105f3b60e21b815260040160405180910390fd5b505b6123498282612c64565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526123d09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612d24565b505050565b5f8060405180611ba00160405280611b668152602001613d80611b6691398360405160200161240592919061377e565b6040516020818303038152906040529050838151602083015ff591506001600160a01b038216612461576040517fbefb092000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5092915050565b6002600154036124ba5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611aca565b6002600155565b5f6124cf6004828486613acf565b6124d891613af6565b90507f2afa5331000000000000000000000000000000000000000000000000000000006001600160e01b03198216016126b2575f80808080808061251f896004818d613acf565b81019061252c9190613b26565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161461256c5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03861630146125955760405163750643af60e01b815260040160405180910390fd5b8a85146125ce576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b03167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169161266591906137e5565b5f604051808303815f865af19150503d805f811461269e576040519150601f19603f3d011682016040523d82523d5f602084013e6126a3565b606091505b50505050505050505050610752565b6001600160e01b031981166323f2ebc360e21b146126fc576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806127118a6004818e613acf565b81019061271e9190613b75565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146127605760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146127895760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169161281091906137e5565b5f604051808303815f865af19150503d805f8114612849576040519150601f19603f3d011682016040523d82523d5f602084013e61284e565b606091505b50505050505050505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526121bc9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612399565b8060016128c060206002613cd3565b6128ca9190613877565b60535410612904576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f81546129139061372e565b918290555090505f5b60208110156129a3578082901c60011660010361294f57826033826020811061294757612947613706565b015550505050565b6033816020811061296257612962613706565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061299b9061372e565b91505061291c565b506123d0613cde565b60018055565b60685460ff166129ee576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f54610100900460ff16612a8c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b610664612e08565b60606040825110612ab357818060200190518101906106ca9190613cf2565b8151602003612c26575f5b602081108015612b055750828181518110612adb57612adb613706565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15612b1c5780612b148161372e565b915050612abe565b805f03612b5e57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115612b7857612b78613268565b6040519080825280601f01601f191660200182016040528015612ba2576020820181803683370190505b5090505f5b82811015612c1e57848181518110612bc157612bc1613706565b602001015160f81c60f81b828281518110612bde57612bde613706565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080612c168161372e565b915050612ba7565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b6068545f90610100900463ffffffff16158015612c87575063ffffffff82166001145b15612c99575063ffffffff8216612cc1565b612cae64010000000063ffffffff84166137ac565b612cbe9063ffffffff85166137c3565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003611723576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612d78826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e729092919063ffffffff16565b8051909150156123d05780806020019051810190612d969190613d64565b6123d05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611aca565b5f54610100900460ff166129ac5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b606061098b84845f85855f80866001600160a01b03168587604051612e9791906137e5565b5f6040518083038185875af1925050503d805f8114612ed1576040519150601f19603f3d011682016040523d82523d5f602084013e612ed6565b606091505b5091509150612ee787838387612ef2565b979650505050505050565b60608315612f605782515f03612f59576001600160a01b0385163b612f595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611aca565b508161098b565b61098b8383815115612f755781518083602001fd5b8060405162461bcd60e51b8152600401611aca9190613102565b803563ffffffff81168114612c5f575f80fd5b6001600160a01b0381168114612fb6575f80fd5b50565b5f8060408385031215612fca575f80fd5b612fd383612f8f565b91506020830135612fe381612fa2565b809150509250929050565b8015158114612fb6575f80fd5b5f8083601f84011261300b575f80fd5b50813567ffffffffffffffff811115613022575f80fd5b602083019150836020828501011115613039575f80fd5b9250929050565b5f805f805f60808688031215613054575f80fd5b61305d86612f8f565b9450602086013561306d81612fa2565b9350604086013561307d81612fee565b9250606086013567ffffffffffffffff811115613098575f80fd5b6130a488828901612ffb565b969995985093965092949392505050565b5f5b838110156130cf5781810151838201526020016130b7565b50505f910152565b5f81518084526130ee8160208601602086016130b5565b601f01601f19169290920160200192915050565b602081525f61311460208301846130d7565b9392505050565b5f6020828403121561312b575f80fd5b813561311481612fa2565b60ff81168114612fb6575f80fd5b5f805f805f805f60e0888a03121561315a575f80fd5b873561316581613136565b965061317360208901612f8f565b9550604088013561318381612fa2565b945061319160608901612f8f565b935060808801356131a181612fa2565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156131d0575f80fd5b6131d984612f8f565b925060208401356131e981612fa2565b915060408401356131f981612fa2565b809150509250925092565b5f60208284031215613214575f80fd5b5035919050565b8061040081018310156106ca575f80fd5b5f805f610440848603121561323f575f80fd5b83359250613250856020860161321b565b915061325f6104208501612f8f565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156132a5576132a5613268565b604052919050565b5f67ffffffffffffffff8211156132c6576132c6613268565b50601f01601f191660200190565b5f6132e66132e1846132ad565b61327c565b90508281528383830111156132f9575f80fd5b828260208301375f602084830101529392505050565b5f82601f83011261331e575f80fd5b613114838335602085016132d4565b5f805f805f60a08688031215613341575f80fd5b61334a86612f8f565b9450602086013561335a81612fa2565b9350604086013567ffffffffffffffff80821115613376575f80fd5b61338289838a0161330f565b94506060880135915080821115613397575f80fd5b506133a48882890161330f565b92505060808601356133b581613136565b809150509295509295909350565b5f805f805f8060a087890312156133d8575f80fd5b6133e187612f8f565b955060208701356133f181612fa2565b945060408701359350606087013561340881612fee565b9250608087013567ffffffffffffffff811115613423575f80fd5b61342f89828a01612ffb565b979a9699509497509295939492505050565b5f8060408385031215613452575f80fd5b61345b83612f8f565b915061346960208401612f8f565b90509250929050565b5f805f805f805f805f805f806109208d8f03121561348e575f80fd5b6134988e8e61321b565b9b506134a88e6104008f0161321b565b9a506108008d013599506108208d013598506108408d013597506134cf6108608e01612f8f565b96506134df6108808e0135612fa2565b6108808d013595506134f46108a08e01612f8f565b94506135046108c08e0135612fa2565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111561352d575f80fd5b61353e8e6109008f01358f01612ffb565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121561356c575f80fd5b61357588612f8f565b9650602088013561358581612fa2565b955060408801359450606088013561359c81612fa2565b935060808801356135ac81612fee565b925060a088013567ffffffffffffffff8111156135c7575f80fd5b6135d38a828b01612ffb565b989b979a50959850939692959293505050565b5f805f805f8060c087890312156135fb575f80fd5b61360487612f8f565b9550602087013561361481612fa2565b945061362260408801612f8f565b9350606087013561363281612fa2565b9250608087013561364281612fa2565b915060a087013567ffffffffffffffff81111561365d575f80fd5b8701601f8101891361366d575f80fd5b61367c898235602084016132d4565b9150509295509295509295565b5f805f80610460858703121561369d575f80fd5b843593506136ae866020870161321b565b92506136bd6104208601612f8f565b939692955092936104400135925050565b600181811c908216806136e257607f821691505b60208210810361370057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f6001820161373f5761373f61371a565b5060010190565b606081525f61375860608301866130d7565b828103602084015261376a81866130d7565b91505060ff83166040830152949350505050565b5f835161378f8184602088016130b5565b8351908301906137a38183602088016130b5565b01949350505050565b80820281158282048414176106ca576106ca61371a565b808201808211156106ca576106ca61371a565b818382375f9101908152919050565b5f82516137f68184602087016130b5565b9190910192915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b63ffffffff861681525f6001600160a01b03808716602084015280861660408401525060806060830152612ee7608083018486613800565b5f60208284031215613870575f80fd5b5051919050565b818103818111156106ca576106ca61371a565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c08501526138da828501876130d7565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f613921606083018486613800565b9695505050505050565b601f8211156123d0575f81815260208120601f850160051c810160208610156139515750805b601f850160051c820191505b81811015610cba5782815560010161395d565b815167ffffffffffffffff81111561398a5761398a613268565b61399e8161399884546136ce565b8461392b565b602080601f8311600181146139d1575f84156139ba5750858301515b5f19600386901b1c1916600185901b178555610cba565b5f85815260208120601f198616915b828110156139ff578886015182559484019460019091019084016139e0565b5085821015613a1c57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c0850152613a7d8285018789613800565b925080851660e085015250509a9950505050505050505050565b5f60208284031215613aa7575f80fd5b815161311481613136565b63ffffffff8181168382160190808211156124615761246161371a565b5f8085851115613add575f80fd5b83861115613ae9575f80fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015613b1e5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215613b3c575f80fd5b8735613b4781612fa2565b96506020880135613b5781612fa2565b9550604088013594506060880135935060808801356131a181613136565b5f805f805f805f80610100898b031215613b8d575f80fd5b8835613b9881612fa2565b97506020890135613ba881612fa2565b965060408901359550606089013594506080890135613bc681612fee565b935060a0890135613bd681613136565b979a969950949793969295929450505060c08201359160e0013590565b600181815b80851115613c2d57815f1904821115613c1357613c1361371a565b80851615613c2057918102915b93841c9390800290613bf8565b509250929050565b5f82613c43575060016106ca565b81613c4f57505f6106ca565b8160018114613c655760028114613c6f57613c8b565b60019150506106ca565b60ff841115613c8057613c8061371a565b50506001821b6106ca565b5060208310610133831016604e8410600b8410161715613cae575081810a6106ca565b613cb88383613bf3565b805f1904821115613ccb57613ccb61371a565b029392505050565b5f6131148383613c35565b634e487b7160e01b5f52600160045260245ffd5b5f60208284031215613d02575f80fd5b815167ffffffffffffffff811115613d18575f80fd5b8201601f81018413613d28575f80fd5b8051613d366132e1826132ad565b818152856020838501011115613d4a575f80fd5b613d5b8260208301602086016130b5565b95945050505050565b5f60208284031215613d74575f80fd5b815161311481612fee56fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a2646970667358221220432f6d6b4446edbe1f73c19fd2115454d5c35d8b03b98a74fd46724151d7672264736f6c63430008140033" + }, + { + "contractName": "PolygonZkEVMBridge proxy", + "balance": "340282366920938463463374607431768211455", + "nonce": "1", + "address": "0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe", + "bytecode": "0x60806040526004361061005d575f3560e01c80635c60da1b116100425780635c60da1b146100a65780638f283970146100e3578063f851a440146101025761006c565b80633659cfe6146100745780634f1ef286146100935761006c565b3661006c5761006a610116565b005b61006a610116565b34801561007f575f80fd5b5061006a61008e366004610854565b610130565b61006a6100a136600461086d565b610178565b3480156100b1575f80fd5b506100ba6101eb565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee575f80fd5b5061006a6100fd366004610854565b610228565b34801561010d575f80fd5b506100ba610255565b61011e610282565b61012e610129610359565b610362565b565b610138610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d8160405180602001604052805f8152505f6103bf565b50565b61016d610116565b610180610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101e3576101de8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250600192506103bf915050565b505050565b6101de610116565b5f6101f4610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610359565b905090565b610225610116565b90565b610230610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d816103e9565b5f61025e610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610380565b61028a610380565b73ffffffffffffffffffffffffffffffffffffffff16330361012e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b5f61021861044a565b365f80375f80365f845af43d5f803e80801561037c573d5ff35b3d5ffd5b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b6103c883610471565b5f825111806103d45750805b156101de576103e383836104bd565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f610412610380565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a161016d816104e9565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103a3565b61047a816105f5565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606104e28383604051806060016040528060278152602001610977602791396106c0565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811661058c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610350565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b73ffffffffffffffffffffffffffffffffffffffff81163b610699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610350565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105af565b60605f808573ffffffffffffffffffffffffffffffffffffffff16856040516106e9919061090b565b5f60405180830381855af49150503d805f8114610721576040519150601f19603f3d011682016040523d82523d5f602084013e610726565b606091505b509150915061073786838387610741565b9695505050505050565b606083156107d65782515f036107cf5773ffffffffffffffffffffffffffffffffffffffff85163b6107cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610350565b50816107e0565b6107e083836107e8565b949350505050565b8151156107f85781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103509190610926565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f575f80fd5b919050565b5f60208284031215610864575f80fd5b6104e28261082c565b5f805f6040848603121561087f575f80fd5b6108888461082c565b9250602084013567ffffffffffffffff808211156108a4575f80fd5b818601915086601f8301126108b7575f80fd5b8135818111156108c5575f80fd5b8760208285010111156108d6575f80fd5b6020830194508093505050509250925092565b5f5b838110156109035781810151838201526020016108eb565b50505f910152565b5f825161091c8184602087016108e9565b9190910192915050565b602081525f82518060208401526109448160408501602087016108e9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212202ac98acbfbb3d3ac1b74050e18c4e76db25a3ff2801ec69bf85d0c61414d502b64736f6c63430008140033", + "storage": { + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x0000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000005ac4182a1dd41aeef465e40b82fd326bf66ab82c" + } + }, + { + "contractName": "PolygonZkEVMGlobalExitRootL2 implementation", + "balance": "0", + "nonce": "1", + "address": "0x0200143Fa295EE4dffEF22eE2616c2E008D81688", + "bytecode": "0x608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301fd90441461004e578063257b36321461006a57806333d6247d14610089578063a3c573eb1461009e575b5f80fd5b61005760015481565b6040519081526020015b60405180910390f35b61005761007836600461015e565b5f6020819052908152604090205481565b61009c61009736600461015e565b6100ea565b005b6100c57f0000000000000000000000002a3dd3eb832af982ec71669e178424b10dca2ede81565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610061565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000002a3dd3eb832af982ec71669e178424b10dca2ede1614610159576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b5f6020828403121561016e575f80fd5b503591905056fea26469706673582212205108c6c4f924146b736832a1bdf696e20d900450207b7452462368d150f2c71c64736f6c63430008140033" + }, + { + "contractName": "PolygonZkEVMGlobalExitRootL2 proxy", + "balance": "0", + "nonce": "1", + "address": "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa", + "bytecode": "0x60806040523661001357610011610017565b005b6100115b61001f6101b7565b6001600160a01b0316336001600160a01b0316141561016f5760606001600160e01b031960003516631b2ce7f360e11b8114156100655761005e6101ea565b9150610167565b6001600160e01b0319811663278f794360e11b14156100865761005e610241565b6001600160e01b031981166308f2839760e41b14156100a75761005e610287565b6001600160e01b031981166303e1469160e61b14156100c85761005e6102b8565b6001600160e01b03198116635c60da1b60e01b14156100e95761005e6102f8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b61017761030c565b565b606061019e83836040518060600160405280602781526020016108576027913961031c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101f4610394565b600061020336600481846106a2565b81019061021091906106e8565b905061022d8160405180602001604052806000815250600061039f565b505060408051602081019091526000815290565b606060008061025336600481846106a2565b8101906102609190610719565b915091506102708282600161039f565b604051806020016040528060008152509250505090565b6060610291610394565b60006102a036600481846106a2565b8101906102ad91906106e8565b905061022d816103cb565b60606102c2610394565b60006102cc6101b7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b6060610302610394565b60006102cc610422565b610177610317610422565b610431565b6060600080856001600160a01b0316856040516103399190610807565b600060405180830381855af49150503d8060008114610374576040519150601f19603f3d011682016040523d82523d6000602084013e610379565b606091505b509150915061038a86838387610455565b9695505050505050565b341561017757600080fd5b6103a8836104d3565b6000825111806103b55750805b156103c6576103c48383610179565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103f46101b7565b604080516001600160a01b03928316815291841660208301520160405180910390a161041f81610513565b50565b600061042c6105bc565b905090565b3660008037600080366000845af43d6000803e808015610450573d6000f35b3d6000fd5b606083156104c15782516104ba576001600160a01b0385163b6104ba5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161015e565b50816104cb565b6104cb83836105e4565b949350505050565b6104dc8161060e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105785760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161015e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101db565b8151156105f45781518083602001fd5b8060405162461bcd60e51b815260040161015e9190610823565b6001600160a01b0381163b61067b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161015e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61059b565b600080858511156106b257600080fd5b838611156106bf57600080fd5b5050820193919092039150565b80356001600160a01b03811681146106e357600080fd5b919050565b6000602082840312156106fa57600080fd5b61019e826106cc565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561072c57600080fd5b610735836106cc565b9150602083013567ffffffffffffffff8082111561075257600080fd5b818501915085601f83011261076657600080fd5b81358181111561077857610778610703565b604051601f8201601f19908116603f011681019083821181831017156107a0576107a0610703565b816040528281528860208487010111156107b957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107f65781810151838201526020016107de565b838111156103c45750506000910152565b600082516108198184602087016107db565b9190910192915050565b60208152600082518060208401526108428160408501602087016107db565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122012bb4f564f73959a03513dc74fc3c6e40e8386e6f02c16b78d6db00ce0aa16af64736f6c63430008090033", + "storage": { + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x0000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000000200143fa295ee4dffef22ee2616c2e008d81688" + } + }, + { + "contractName": "PolygonZkEVMTimelock", + "balance": "0", + "nonce": "1", + "address": "0xBBa0935Fa93Eb23de7990b47F0D96a8f75766d13", + "bytecode": "0x6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220e28ae7494480ab1c619fd775dc5ff665588c808a910d66178a982c2e7c76a1e664736f6c63430008140033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x00000000000000000000000000000000000000000000000000000000000d2f00", + "0xb7dfbbca55dd7b7b40403b7620ec95da956b60d562518460548c310b9ba22ee5": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x9fa2d8034dbcb437bee38d61fbd100910e1342ffc07f128aa1b8e6790b7f3f68": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x64494413541ff93b31aa309254e3fed72a7456e9845988b915b4c7a7ceba8814": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x8af78a811b91830f719aeb3279e6ef47b4b581bcf168d6d9015d376b23a240bc": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x3412d5605ac6cd444957cedb533e5dacad6378b4bc819ebe3652188a665066d6": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x9b56cc8bdadd190ab692f9895be09d0edc2ddf428710bebe53c4911e5bc08f42": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d706a": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x74be529e918f2e5719738045bde8f05a9e9498aace6df8d886a992d046f546a1": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xc3ad33e20b0c56a223ad5104fff154aa010f8715b9c981fd38fdc60a4d1a52fc": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5" + } + }, + { + "accountName": "keyless Deployer", + "balance": "0", + "nonce": "1", + "address": "0x9d90066e7478496e2284E54c3548106bb4F90E50" + }, + { + "accountName": "deployer", + "balance": "0", + "nonce": "8", + "address": "0x4c1665d6651ecEfa59B9B3041951608468b18891" + } + ] +} \ No newline at end of file From 48f67db4acff53e396147700c8e4c8ea92de6660 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Thu, 8 Feb 2024 15:31:31 +0100 Subject: [PATCH 215/230] add comment on validium etrog --- contracts/v2/consensus/validium/PolygonValidiumEtrog.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol b/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol index 4bb67660e..e9123335b 100644 --- a/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol +++ b/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol @@ -12,6 +12,7 @@ import "../../interfaces/IPolygonValidium.sol"; * 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. + * It is advised to use timelocks for the admin address in case of Validium since if can change the dataAvailabilityProtocol */ contract PolygonValidiumEtrog is PolygonRollupBaseEtrog, IPolygonValidium { using SafeERC20Upgradeable for IERC20Upgradeable; From ba17d7d6bc23131be25e735f08310d68b414faac Mon Sep 17 00:00:00 2001 From: invocamanman Date: Thu, 8 Feb 2024 15:35:33 +0100 Subject: [PATCH 216/230] add data commitee contract description --- contracts/v2/consensus/validium/PolygonDataCommittee.sol | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/contracts/v2/consensus/validium/PolygonDataCommittee.sol b/contracts/v2/consensus/validium/PolygonDataCommittee.sol index 611df1c8a..bbffc76ed 100644 --- a/contracts/v2/consensus/validium/PolygonDataCommittee.sol +++ b/contracts/v2/consensus/validium/PolygonDataCommittee.sol @@ -6,6 +6,10 @@ import "../../interfaces/IDataAvailabilityProtocol.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +/* + * Contract responsible managing the data committee that will verify that the data sent for a validium is singed by a committee + * It is advised to give the owner of the contract to a timelock contract once the data committee is set + */ contract PolygonDataCommittee is IDataAvailabilityProtocol, IPolygonDataCommitteeErrors, From 6a9951c1cc2775a4c08809193b0b4461b331d7b2 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Thu, 8 Feb 2024 17:30:21 +0100 Subject: [PATCH 217/230] prepare validium rollup type --- tools/addRollupType/add_rollup_type.json | 2 +- tools/addRollupType/add_rollup_type.json.example | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/addRollupType/add_rollup_type.json b/tools/addRollupType/add_rollup_type.json index bca0af8d6..d813b37e1 100644 --- a/tools/addRollupType/add_rollup_type.json +++ b/tools/addRollupType/add_rollup_type.json @@ -1,5 +1,5 @@ { - "consensusContract": "PolygonZkEVMEtrog", + "consensusContract": "PolygonValidiumEtrog", "polygonRollupManagerAddress": "0x5132A183E9F3CB7C848b0AAC5Ae0c4f0491B7aB2", "polygonZkEVMBridgeAddress": "0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe", "polygonZkEVMGlobalExitRootAddress": "0x580bda1e7A0CFAe92Fa7F6c20A3794F169CE3CFb", diff --git a/tools/addRollupType/add_rollup_type.json.example b/tools/addRollupType/add_rollup_type.json.example index 51610db1d..40faf349e 100644 --- a/tools/addRollupType/add_rollup_type.json.example +++ b/tools/addRollupType/add_rollup_type.json.example @@ -5,6 +5,7 @@ "polygonZkEVMGlobalExitRootAddress": "0x580bda1e7A0CFAe92Fa7F6c20A3794F169CE3CFb", "polTokenAddress": "0x455e53CBB86018Ac2B8092FdCd39d8444aFFC3F6", "verifierAddress": "0x1C3A3da552b8662CD69538356b1E7c2E9CC1EBD8", + "description": "Type: zkEVM, Version: etrog", "forkID": 7, "rollupCompatibilityID": 0, "timelockDelay": 0, From c379383a5e91a317fe6b5f05baf81c2960f8d733 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Thu, 8 Feb 2024 17:52:40 +0100 Subject: [PATCH 218/230] update scripts --- tools/addRollupType/addRollupType.ts | 20 ++++++++++++++++++- tools/addRollupType/addRollupTypeTimelock.ts | 20 ++++++++++++++++++- tools/addRollupType/add_rollup_type.json | 4 ++-- .../add_rollup_type.json.example | 2 +- 4 files changed, 41 insertions(+), 5 deletions(-) diff --git a/tools/addRollupType/addRollupType.ts b/tools/addRollupType/addRollupType.ts index a725aa0c6..914d01fcb 100644 --- a/tools/addRollupType/addRollupType.ts +++ b/tools/addRollupType/addRollupType.ts @@ -24,6 +24,7 @@ async function main() { * Check that every necessary parameter is fullfilled */ const mandatoryDeploymentParameters = [ + "description", "forkID", "consensusContract", "polygonRollupManagerAddress", @@ -41,6 +42,7 @@ async function main() { } const { + description, rollupCompatibilityID, forkID, consensusContract, @@ -103,6 +105,8 @@ async function main() { [deployer] = await ethers.getSigners(); } + console.log("Using with: ", deployer.address); + // Load Rollup manager const PolgonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager", deployer); const rollupManagerContract = PolgonRollupManagerFactory.attach( @@ -135,6 +139,20 @@ async function main() { ); await PolygonconsensusContract.waitForDeployment(); + console.log("#######################\n"); + console.log(`new PolygonconsensusContract impl: ${PolygonconsensusContract.target}`); + + console.log("you can verify the new impl address with:"); + console.log( + `npx hardhat verify --constructor-args upgrade/arguments.js ${PolygonconsensusContract.target} --network ${process.env.HARDHAT_NETWORK}\n` + ); + console.log("Copy the following constructor arguments on: upgrade/arguments.js \n", [ + polygonZkEVMGlobalExitRootAddress, + polTokenAddress, + polygonZkEVMBridgeAddress, + polygonRollupManagerAddress, + ]); + // Add a new rollup type with timelock console.log( await ( @@ -144,7 +162,7 @@ async function main() { forkID, rollupCompatibilityID, genesis.root, - JSON.stringify(genesis) + description ) ).wait() ); diff --git a/tools/addRollupType/addRollupTypeTimelock.ts b/tools/addRollupType/addRollupTypeTimelock.ts index 9c2cc3eee..80d587a88 100644 --- a/tools/addRollupType/addRollupTypeTimelock.ts +++ b/tools/addRollupType/addRollupTypeTimelock.ts @@ -22,6 +22,7 @@ async function main() { * Check that every necessary parameter is fullfilled */ const mandatoryDeploymentParameters = [ + "description", "forkID", "consensusContract", "polygonRollupManagerAddress", @@ -40,6 +41,7 @@ async function main() { } const { + description, rollupCompatibilityID, forkID, consensusContract, @@ -105,6 +107,8 @@ async function main() { [deployer] = await ethers.getSigners(); } + console.log("Using with: ", deployer.address); + // Load Rollup manager const PolgonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager", deployer); @@ -120,6 +124,20 @@ async function main() { ); await PolygonconsensusContract.waitForDeployment(); + console.log("#######################\n"); + console.log(`new PolygonconsensusContract impl: ${PolygonconsensusContract.target}`); + + console.log("you can verify the new impl address with:"); + console.log( + `npx hardhat verify --constructor-args upgrade/arguments.js ${PolygonconsensusContract.target} --network ${process.env.HARDHAT_NETWORK}\n` + ); + console.log("Copy the following constructor arguments on: upgrade/arguments.js \n", [ + polygonZkEVMGlobalExitRootAddress, + polTokenAddress, + polygonZkEVMBridgeAddress, + polygonRollupManagerAddress, + ]); + // load timelock const timelockContractFactory = await ethers.getContractFactory("PolygonZkEVMTimelock", deployer); @@ -132,7 +150,7 @@ async function main() { forkID, rollupCompatibilityID, genesis.root, - JSON.stringify(genesis), + description, ]), ethers.ZeroHash, // predecesoor salt // salt diff --git a/tools/addRollupType/add_rollup_type.json b/tools/addRollupType/add_rollup_type.json index d813b37e1..115b5187b 100644 --- a/tools/addRollupType/add_rollup_type.json +++ b/tools/addRollupType/add_rollup_type.json @@ -5,10 +5,10 @@ "polygonZkEVMGlobalExitRootAddress": "0x580bda1e7A0CFAe92Fa7F6c20A3794F169CE3CFb", "polTokenAddress": "0x455e53CBB86018Ac2B8092FdCd39d8444aFFC3F6", "verifierAddress": "0x1C3A3da552b8662CD69538356b1E7c2E9CC1EBD8", - "description": "0.0.1", + "description": "Type: Validium, Version: etrog, genesis: /ipfs/QmUXnRoPbUmZuEZCGyiHjEsoNcFVu3hLtSvhpnfBS2mAYU", "forkID": 7, "rollupCompatibilityID": 0, - "timelockDelay": 0, + "timelockDelay": 864000, "timelockSalt": "", "gasTokenAddress":"", "deployerPvtKey": "", diff --git a/tools/addRollupType/add_rollup_type.json.example b/tools/addRollupType/add_rollup_type.json.example index 40faf349e..7c6d09922 100644 --- a/tools/addRollupType/add_rollup_type.json.example +++ b/tools/addRollupType/add_rollup_type.json.example @@ -5,7 +5,7 @@ "polygonZkEVMGlobalExitRootAddress": "0x580bda1e7A0CFAe92Fa7F6c20A3794F169CE3CFb", "polTokenAddress": "0x455e53CBB86018Ac2B8092FdCd39d8444aFFC3F6", "verifierAddress": "0x1C3A3da552b8662CD69538356b1E7c2E9CC1EBD8", - "description": "Type: zkEVM, Version: etrog", + "description": "Type: zkEVM, Version: etrog, genesis: /ipfs/QmUXnRoPbUmZuEZCGyiHjEsoNcFVu3hLtSvhpnfBS2mAYU", "forkID": 7, "rollupCompatibilityID": 0, "timelockDelay": 0, From ab8268e1c01f76c8bde756995d017b5e668f1bd0 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Thu, 8 Feb 2024 19:23:25 +0100 Subject: [PATCH 219/230] transaction mainnet --- .../addRollupMainnet/add_rollup_type.json | 17 ++++ .../add_rollup_type_output.json | 7 ++ .../addRollupMainnet/genesis.json | 92 +++++++++++++++++++ .../addRollupTestnet/add_rollup_type.json | 18 ++++ .../add_rollup_type_output.json | 7 ++ .../addRollupTestnet/genesis.json | 92 +++++++++++++++++++ tools/addRollupType/add_rollup_type.json | 1 - .../add_rollup_type.json.example | 6 +- 8 files changed, 236 insertions(+), 4 deletions(-) create mode 100644 tools/addRollupType/addRollupMainnet/add_rollup_type.json create mode 100644 tools/addRollupType/addRollupMainnet/add_rollup_type_output.json create mode 100644 tools/addRollupType/addRollupMainnet/genesis.json create mode 100644 tools/addRollupType/addRollupTestnet/add_rollup_type.json create mode 100644 tools/addRollupType/addRollupTestnet/add_rollup_type_output.json create mode 100644 tools/addRollupType/addRollupTestnet/genesis.json diff --git a/tools/addRollupType/addRollupMainnet/add_rollup_type.json b/tools/addRollupType/addRollupMainnet/add_rollup_type.json new file mode 100644 index 000000000..44d25ae24 --- /dev/null +++ b/tools/addRollupType/addRollupMainnet/add_rollup_type.json @@ -0,0 +1,17 @@ +{ + "consensusContract": "PolygonValidiumEtrog", + "polygonRollupManagerAddress": "0x5132A183E9F3CB7C848b0AAC5Ae0c4f0491B7aB2", + "polygonZkEVMBridgeAddress": "0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe", + "polygonZkEVMGlobalExitRootAddress": "0x580bda1e7A0CFAe92Fa7F6c20A3794F169CE3CFb", + "polTokenAddress": "0x455e53CBB86018Ac2B8092FdCd39d8444aFFC3F6", + "verifierAddress": "0x1C3A3da552b8662CD69538356b1E7c2E9CC1EBD8", + "description": "Type: Validium, Version: etrog, genesis: /ipfs/QmUXnRoPbUmZuEZCGyiHjEsoNcFVu3hLtSvhpnfBS2mAYU", + "forkID": 7, + "rollupCompatibilityID": 0, + "timelockDelay": 864000, + "timelockSalt": "", + "deployerPvtKey": "", + "maxFeePerGas":"", + "maxPriorityFeePerGas":"", + "multiplierGas": "" +} diff --git a/tools/addRollupType/addRollupMainnet/add_rollup_type_output.json b/tools/addRollupType/addRollupMainnet/add_rollup_type_output.json new file mode 100644 index 000000000..814014b27 --- /dev/null +++ b/tools/addRollupType/addRollupMainnet/add_rollup_type_output.json @@ -0,0 +1,7 @@ +{ + "genesis": "0xe3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f272", + "verifierAddress": "0x1C3A3da552b8662CD69538356b1E7c2E9CC1EBD8", + "consensusContract": "PolygonValidiumEtrog", + "scheduleData": "0x01d5062a0000000000000000000000005132a183e9f3cb7c848b0aac5ae0c4f0491b7ab2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d2f000000000000000000000000000000000000000000000000000000000000000144f34eb8eb0000000000000000000000009cf80f7eb1c76ec5ae7a88b417e373449b73ac300000000000000000000000001c3a3da552b8662cd69538356b1e7c2e9cc1ebd800000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000000e3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f27200000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000005d547970653a2056616c696469756d2c2056657273696f6e3a206574726f672c2067656e657369733a202f697066732f516d55586e526f5062556d5a75455a43477969486a45736f4e6346567533684c74537668706e664253326d41595500000000000000000000000000000000000000000000000000000000000000", + "executeData": "0x134008d30000000000000000000000005132a183e9f3cb7c848b0aac5ae0c4f0491b7ab2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000144f34eb8eb0000000000000000000000009cf80f7eb1c76ec5ae7a88b417e373449b73ac300000000000000000000000001c3a3da552b8662cd69538356b1e7c2e9cc1ebd800000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000000e3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f27200000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000005d547970653a2056616c696469756d2c2056657273696f6e3a206574726f672c2067656e657369733a202f697066732f516d55586e526f5062556d5a75455a43477969486a45736f4e6346567533684c74537668706e664253326d41595500000000000000000000000000000000000000000000000000000000000000" +} \ No newline at end of file diff --git a/tools/addRollupType/addRollupMainnet/genesis.json b/tools/addRollupType/addRollupMainnet/genesis.json new file mode 100644 index 000000000..3605ddf86 --- /dev/null +++ b/tools/addRollupType/addRollupMainnet/genesis.json @@ -0,0 +1,92 @@ +{ + "root": "0xe3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f272", + "genesis": [ + { + "contractName": "PolygonZkEVMDeployer", + "balance": "0", + "nonce": "4", + "address": "0xCB19eDdE626906eB1EE52357a27F62dd519608C2", + "bytecode": "0x60806040526004361061006e575f3560e01c8063715018a61161004c578063715018a6146100e25780638da5cb5b146100f6578063e11ae6cb1461011f578063f2fde38b14610132575f80fd5b80632b79805a146100725780634a94d487146100875780636d07dbf81461009a575b5f80fd5b610085610080366004610908565b610151565b005b6100856100953660046109a2565b6101c2565b3480156100a5575f80fd5b506100b96100b43660046109f5565b610203565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ed575f80fd5b50610085610215565b348015610101575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff166100b9565b61008561012d366004610a15565b610228565b34801561013d575f80fd5b5061008561014c366004610a61565b61028e565b61015961034a565b5f6101658585856103ca565b90506101718183610527565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a15050505050565b6101ca61034a565b6101d583838361056a565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b905f90a1505050565b5f61020e8383610598565b9392505050565b61021d61034a565b6102265f6105a4565b565b61023061034a565b5f61023c8484846103ca565b60405173ffffffffffffffffffffffffffffffffffffffff821681529091507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a150505050565b61029661034a565b73ffffffffffffffffffffffffffffffffffffffff811661033e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610347816105a4565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610335565b5f83471015610435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610335565b81515f0361049f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610335565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff811661020e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610335565b606061020e83835f6040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c65640000815250610618565b6060610590848484604051806060016040528060298152602001610b0860299139610618565b949350505050565b5f61020e83833061072d565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156106aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610335565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516106d29190610a9c565b5f6040518083038185875af1925050503d805f811461070c576040519150601f19603f3d011682016040523d82523d5f602084013e610711565b606091505b509150915061072287838387610756565b979650505050505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b606083156107eb5782515f036107e45773ffffffffffffffffffffffffffffffffffffffff85163b6107e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610335565b5081610590565b61059083838151156108005781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103359190610ab7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112610870575f80fd5b813567ffffffffffffffff8082111561088b5761088b610834565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156108d1576108d1610834565b816040528381528660208588010111156108e9575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f806080858703121561091b575f80fd5b8435935060208501359250604085013567ffffffffffffffff80821115610940575f80fd5b61094c88838901610861565b93506060870135915080821115610961575f80fd5b5061096e87828801610861565b91505092959194509250565b803573ffffffffffffffffffffffffffffffffffffffff8116811461099d575f80fd5b919050565b5f805f606084860312156109b4575f80fd5b6109bd8461097a565b9250602084013567ffffffffffffffff8111156109d8575f80fd5b6109e486828701610861565b925050604084013590509250925092565b5f8060408385031215610a06575f80fd5b50508035926020909101359150565b5f805f60608486031215610a27575f80fd5b8335925060208401359150604084013567ffffffffffffffff811115610a4b575f80fd5b610a5786828701610861565b9150509250925092565b5f60208284031215610a71575f80fd5b61020e8261097a565b5f5b83811015610a94578181015183820152602001610a7c565b50505f910152565b5f8251610aad818460208701610a7a565b9190910192915050565b602081525f8251806020840152610ad5816040850160208701610a7a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220330b94dc698c4d290bf55c23f13b473cde6a6bae0030cb902de18af54e35839f64736f6c63430008140033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000004c1665d6651ecefa59b9b3041951608468b18891" + } + }, + { + "contractName": "ProxyAdmin", + "balance": "0", + "nonce": "1", + "address": "0x0F99738B2Fc14D77308337f3e2596b63aE7BCC4A", + "bytecode": "0x608060405260043610610079575f3560e01c80639623609d1161004c5780639623609d1461012357806399a88ec414610136578063f2fde38b14610155578063f3b7dead14610174575f80fd5b8063204e1c7a1461007d578063715018a6146100c55780637eff275e146100db5780638da5cb5b146100fa575b5f80fd5b348015610088575f80fd5b5061009c6100973660046105e8565b610193565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100d0575f80fd5b506100d9610244565b005b3480156100e6575f80fd5b506100d96100f536600461060a565b610257565b348015610105575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff1661009c565b6100d961013136600461066e565b6102e0565b348015610141575f80fd5b506100d961015036600461060a565b610371565b348015610160575f80fd5b506100d961016f3660046105e8565b6103cd565b34801561017f575f80fd5b5061009c61018e3660046105e8565b610489565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907f5c60da1b00000000000000000000000000000000000000000000000000000000815260040190565b5f60405180830381855afa9150503d805f8114610215576040519150601f19603f3d011682016040523d82523d5f602084013e61021a565b606091505b509150915081610228575f80fd5b8080602001905181019061023c919061075b565b949350505050565b61024c6104d3565b6102555f610553565b565b61025f6104d3565b6040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690638f283970906024015b5f604051808303815f87803b1580156102c6575f80fd5b505af11580156102d8573d5f803e3d5ffd5b505050505050565b6102e86104d3565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef28690349061033e9086908690600401610776565b5f604051808303818588803b158015610355575f80fd5b505af1158015610367573d5f803e3d5ffd5b5050505050505050565b6103796104d3565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690633659cfe6906024016102af565b6103d56104d3565b73ffffffffffffffffffffffffffffffffffffffff811661047d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61048681610553565b50565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907ff851a44000000000000000000000000000000000000000000000000000000000815260040190565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610474565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610486575f80fd5b5f602082840312156105f8575f80fd5b8135610603816105c7565b9392505050565b5f806040838503121561061b575f80fd5b8235610626816105c7565b91506020830135610636816105c7565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f805f60608486031215610680575f80fd5b833561068b816105c7565b9250602084013561069b816105c7565b9150604084013567ffffffffffffffff808211156106b7575f80fd5b818601915086601f8301126106ca575f80fd5b8135818111156106dc576106dc610641565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561072257610722610641565b8160405282815289602084870101111561073a575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f6020828403121561076b575f80fd5b8151610603816105c7565b73ffffffffffffffffffffffffffffffffffffffff831681525f602060408184015283518060408501525f5b818110156107be578581018301518582016060015282016107a2565b505f6060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050939250505056fea26469706673582212203083a4ccc2e42eed60bd19037f2efa77ed086dc7a5403f75bebb995dcba2221c64736f6c63430008140033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000bba0935fa93eb23de7990b47f0d96a8f75766d13" + } + }, + { + "contractName": "PolygonZkEVMBridge implementation", + "balance": "0", + "nonce": "1", + "address": "0x5ac4182A1dd41AeEf465E40B82fd326BF66AB82C", + "bytecode": "0x6080604052600436106101db575f3560e01c806383f24403116100fd578063ccaa2d1111610092578063ee25560b11610062578063ee25560b146105a9578063f5efcd79146105d4578063f811bff7146105f3578063fb57083414610612575f80fd5b8063ccaa2d111461053b578063cd5865791461055a578063d02103ca1461056d578063dbc1697614610595575f80fd5b8063bab161bf116100cd578063bab161bf146104b9578063be5831c7146104da578063c00f14ab146104fd578063cc4616321461051c575f80fd5b806383f244031461043d5780638ed7e3f21461045c578063aaa13cc21461047b578063b8b284d01461049a575f80fd5b80633cbc795b116101735780637843298b116101435780637843298b146103c257806379e2cf97146103e157806381b1c174146103f557806383c43a5514610429575f80fd5b80633cbc795b146103385780633e197043146103705780634b2f336d1461038f5780635ca1e165146103ae575f80fd5b806327aef4e8116101ae57806327aef4e81461026d5780632dfdf0b51461028e578063318aee3d146102b15780633c351e1014610319575f80fd5b806315064c96146101df5780632072f6c51461020d57806322e95f2c14610223578063240ff3781461025a575b5f80fd5b3480156101ea575f80fd5b506068546101f89060ff1681565b60405190151581526020015b60405180910390f35b348015610218575f80fd5b50610221610631565b005b34801561022e575f80fd5b5061024261023d366004612fb9565b610666565b6040516001600160a01b039091168152602001610204565b610221610268366004613040565b6106d0565b348015610278575f80fd5b50610281610759565b6040516102049190613102565b348015610299575f80fd5b506102a360535481565b604051908152602001610204565b3480156102bc575f80fd5b506102f56102cb36600461311b565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201610204565b348015610324575f80fd5b50606d54610242906001600160a01b031681565b348015610343575f80fd5b50606d5461035b90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610204565b34801561037b575f80fd5b506102a361038a366004613144565b6107e5565b34801561039a575f80fd5b50606f54610242906001600160a01b031681565b3480156103b9575f80fd5b506102a361088e565b3480156103cd575f80fd5b506102426103dc3660046131be565b61096a565b3480156103ec575f80fd5b50610221610993565b348015610400575f80fd5b5061024261040f366004613204565b606a6020525f90815260409020546001600160a01b031681565b348015610434575f80fd5b506102816109b4565b348015610448575f80fd5b506102a361045736600461322c565b6109d3565b348015610467575f80fd5b50606c54610242906001600160a01b031681565b348015610486575f80fd5b5061024261049536600461332d565b610aa8565b3480156104a5575f80fd5b506102216104b43660046133c3565b610be7565b3480156104c4575f80fd5b5060685461035b90610100900463ffffffff1681565b3480156104e5575f80fd5b5060685461035b90600160c81b900463ffffffff1681565b348015610508575f80fd5b5061028161051736600461311b565b610cc2565b348015610527575f80fd5b506101f8610536366004613441565b610d07565b348015610546575f80fd5b50610221610555366004613472565b610d8f565b610221610568366004613556565b6112c0565b348015610578575f80fd5b50606854610242906501000000000090046001600160a01b031681565b3480156105a0575f80fd5b5061022161172c565b3480156105b4575f80fd5b506102a36105c3366004613204565b60696020525f908152604090205481565b3480156105df575f80fd5b506102216105ee366004613472565b61175f565b3480156105fe575f80fd5b5061022161060d3660046135e6565b611a25565b34801561061d575f80fd5b506101f861062c366004613689565b611d40565b606c546001600160a01b0316331461065c57604051631736745960e31b815260040160405180910390fd5b610664611d57565b565b6040805160e084901b6001600160e01b031916602080830191909152606084901b6bffffffffffffffffffffffff1916602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b60685460ff16156106f457604051630bc011ff60e21b815260040160405180910390fd5b341580159061070d5750606f546001600160a01b031615155b15610744576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610752858534868686611db2565b5050505050565b606e8054610766906136ce565b80601f0160208091040260200160405190810160405280929190818152602001828054610792906136ce565b80156107dd5780601f106107b4576101008083540402835291602001916107dd565b820191905f5260205f20905b8154815290600101906020018083116107c057829003601f168201915b505050505081565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201526001600160e01b031960e088811b821660218401526bffffffffffffffffffffffff19606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b6053545f90819081805b6020811015610961578083901c6001166001036108f557603381602081106108c2576108c2613706565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610922565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806109599061372e565b915050610898565b50919392505050565b5f61098b848461097985611e7c565b61098286611f66565b61049587612047565b949350505050565b605354606854600160c81b900463ffffffff16101561066457610664612114565b60405180611ba00160405280611b668152602001613d80611b66913981565b5f83815b6020811015610a9f57600163ffffffff8516821c81169003610a4257848160208110610a0557610a05613706565b602002013582604051602001610a25929190918252602082015260400190565b604051602081830303815290604052805190602001209150610a8d565b81858260208110610a5557610a55613706565b6020020135604051602001610a74929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610a978161372e565b9150506109d7565b50949350505050565b6040516001600160e01b031960e087901b1660208201526bffffffffffffffffffffffff19606086901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180611ba00160405280611b668152602001613d80611b669139898989604051602001610b3093929190613746565b60408051601f1981840301815290829052610b4e929160200161377e565b60405160208183030381529060405280519060200120604051602001610bc394939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff1615610c0b57604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b0316610c4d576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f54604051632770a7eb60e21b8152336004820152602481018690526001600160a01b0390911690639dc29fac906044015f604051808303815f87803b158015610c96575f80fd5b505af1158015610ca8573d5f803e3d5ffd5b50505050610cba868686868686611db2565b505050505050565b6060610ccd82611e7c565b610cd683611f66565b610cdf84612047565b604051602001610cf193929190613746565b6040516020818303038152906040529050919050565b6068545f908190610100900463ffffffff16158015610d2c575063ffffffff83166001145b15610d3e575063ffffffff8316610d66565b610d5364010000000063ffffffff85166137ac565b610d639063ffffffff86166137c3565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff1615610db357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614610de3576040516302caf51760e11b815260040160405180910390fd5b610e168c8c8c8c8c610e115f8e8e8e8e8e8e8e604051610e049291906137d6565b60405180910390206107e5565b6121c2565b6001600160a01b038616610f6057606f546001600160a01b0316610efa575f6001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015610e6c576020820181803683370190505b50604051610e7a91906137e5565b5f6040518083038185875af1925050503d805f8114610eb4576040519150601f19603f3d011682016040523d82523d5f602084013e610eb9565b606091505b5050905080610ef4576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611256565b606f546040516340c10f1960e01b81526001600160a01b03868116600483015260248201869052909116906340c10f19906044015f604051808303815f87803b158015610f45575f80fd5b505af1158015610f57573d5f803e3d5ffd5b50505050611256565b606d546001600160a01b038781169116148015610f8e5750606d5463ffffffff888116600160a01b90920416145b15610fa5575f6001600160a01b0385168482610e42565b60685463ffffffff610100909104811690881603610fd657610fd16001600160a01b0387168585612354565b611256565b6040516001600160e01b031960e089901b1660208201526bffffffffffffffffffffffff19606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b0316806111f5575f6110808386868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506123d592505050565b6040516340c10f1960e01b81526001600160a01b03898116600483015260248201899052919250908216906340c10f19906044015f604051808303815f87803b1580156110cb575f80fd5b505af11580156110dd573d5f803e3d5ffd5b5050505080606a5f8581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a8388886040516111e7959493929190613828565b60405180910390a150611253565b6040516340c10f1960e01b81526001600160a01b038781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801561123c575f80fd5b505af115801561124e573d5f803e3d5ffd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156112e457604051630bc011ff60e21b815260040160405180910390fd5b6112ec612468565b60685463ffffffff61010090910481169088160361131d576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b03881661141957883414611369576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff16945090611396906136ce565b80601f01602080910402602001604051908101604052809291908181526020018280546113c2906136ce565b801561140d5780601f106113e45761010080835404028352916020019161140d565b820191905f5260205f20905b8154815290600101906020018083116113f057829003601f168201915b505050505091506116a3565b3415611451576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546001600160a01b03908116908916036114c757604051632770a7eb60e21b8152336004820152602481018a90526001600160a01b03891690639dc29fac906044015f604051808303815f87803b1580156114ac575f80fd5b505af11580156114be573d5f803e3d5ffd5b505050506116a3565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901561157957604051632770a7eb60e21b8152336004820152602481018b90526001600160a01b038a1690639dc29fac906044015f604051808303815f87803b158015611551575f80fd5b505af1158015611563573d5f803e3d5ffd5b5050505080602001519450805f01519350611696565b851561158b5761158b898b89896124c1565b6040516370a0823160e01b81523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa1580156115cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f39190613860565b905061160a6001600160a01b038b1633308e612860565b6040516370a0823160e01b81523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa15801561164e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116729190613860565b905061167e8282613877565b6068548c9850610100900463ffffffff169650935050505b61169f89610cc2565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e86886053546040516116e298979695949392919061388a565b60405180910390a16117086117035f85878f8f8789805190602001206107e5565b6128b1565b861561171657611716612114565b5050505061172360018055565b50505050505050565b606c546001600160a01b0316331461175757604051631736745960e31b815260040160405180910390fd5b6106646129b2565b60685460ff161561178357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146117b3576040516302caf51760e11b815260040160405180910390fd5b6117d58c8c8c8c8c610e1160018e8e8e8e8e8e8e604051610e049291906137d6565b606f545f906001600160a01b031661188857846001600160a01b031684888a868660405160240161180994939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161183e91906137e5565b5f6040518083038185875af1925050503d805f8114611878576040519150601f19603f3d011682016040523d82523d5f602084013e61187d565b606091505b505080915050611983565b606f546040516340c10f1960e01b81526001600160a01b03878116600483015260248201879052909116906340c10f19906044015f604051808303815f87803b1580156118d3575f80fd5b505af11580156118e5573d5f803e3d5ffd5b50505050846001600160a01b03168789858560405160240161190a94939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161193f91906137e5565b5f604051808303815f865af19150503d805f8114611978576040519150601f19603f3d011682016040523d82523d5f602084013e61197d565b606091505b50909150505b806119ba576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f54610100900460ff1615808015611a4357505f54600160ff909116105b80611a5c5750303b158015611a5c57505f5460ff166001145b611ad35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805460ff191660011790558015611af4575f805461ff0019166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8a16027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038781169190910291909117909155606c805473ffffffffffffffffffffffffffffffffffffffff19168583161790558616611bcf5763ffffffff851615611bca576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ceb565b606d805463ffffffff8716600160a01b027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b03891617179055606e611c1e8382613970565b50611cbd5f801b6012604051602001611ca991906060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff91909116604082015260e00190565b6040516020818303038152906040526123d5565b606f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790555b611cf3612a22565b8015611723575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b5f81611d4d8686866109d3565b1495945050505050565b60685460ff1615611d7b57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff610100909104811690871603611de3576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051611e3799989796959493929190613a2c565b60405180910390a1611e6e6117036001606860019054906101000a900463ffffffff16338a8a8a8989604051610e049291906137d6565b8215610cba57610cba612114565b60408051600481526024810182526020810180516001600160e01b03167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611edb91906137e5565b5f60405180830381855afa9150503d805f8114611f13576040519150601f19603f3d011682016040523d82523d5f602084013e611f18565b606091505b509150915081611f5d576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525061098b565b61098b81612a94565b60408051600481526024810182526020810180516001600160e01b03167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611fc591906137e5565b5f60405180830381855afa9150503d805f8114611ffd576040519150601f19603f3d011682016040523d82523d5f602084013e612002565b606091505b509150915081611f5d576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525061098b565b60408051600481526024810182526020810180516001600160e01b03167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b038616916120a591906137e5565b5f60405180830381855afa9150503d805f81146120dd576040519150601f19603f3d011682016040523d82523d5f602084013e6120e2565b606091505b50915091508180156120f5575080516020145b61210057601261098b565b8080602001905181019061098b9190613a97565b6053546068805463ffffffff909216600160c81b027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d61217561088e565b6040518263ffffffff1660e01b815260040161219391815260200190565b5f604051808303815f87803b1580156121aa575f80fd5b505af11580156121bc573d5f803e3d5ffd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af1158015612253573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122779190613860565b9050805f036122b1576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80680100000000000000008716156122f5578691506122d3848a8489611d40565b6122f0576040516338105f3b60e21b815260040160405180910390fd5b61233f565b602087901c612305816001613ab2565b9150879250612320612318868c866109d3565b8a8389611d40565b61233d576040516338105f3b60e21b815260040160405180910390fd5b505b6123498282612c64565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526123d09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612d24565b505050565b5f8060405180611ba00160405280611b668152602001613d80611b6691398360405160200161240592919061377e565b6040516020818303038152906040529050838151602083015ff591506001600160a01b038216612461576040517fbefb092000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5092915050565b6002600154036124ba5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611aca565b6002600155565b5f6124cf6004828486613acf565b6124d891613af6565b90507f2afa5331000000000000000000000000000000000000000000000000000000006001600160e01b03198216016126b2575f80808080808061251f896004818d613acf565b81019061252c9190613b26565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161461256c5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03861630146125955760405163750643af60e01b815260040160405180910390fd5b8a85146125ce576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b03167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169161266591906137e5565b5f604051808303815f865af19150503d805f811461269e576040519150601f19603f3d011682016040523d82523d5f602084013e6126a3565b606091505b50505050505050505050610752565b6001600160e01b031981166323f2ebc360e21b146126fc576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806127118a6004818e613acf565b81019061271e9190613b75565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146127605760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146127895760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169161281091906137e5565b5f604051808303815f865af19150503d805f8114612849576040519150601f19603f3d011682016040523d82523d5f602084013e61284e565b606091505b50505050505050505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526121bc9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612399565b8060016128c060206002613cd3565b6128ca9190613877565b60535410612904576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f81546129139061372e565b918290555090505f5b60208110156129a3578082901c60011660010361294f57826033826020811061294757612947613706565b015550505050565b6033816020811061296257612962613706565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061299b9061372e565b91505061291c565b506123d0613cde565b60018055565b60685460ff166129ee576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f54610100900460ff16612a8c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b610664612e08565b60606040825110612ab357818060200190518101906106ca9190613cf2565b8151602003612c26575f5b602081108015612b055750828181518110612adb57612adb613706565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15612b1c5780612b148161372e565b915050612abe565b805f03612b5e57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115612b7857612b78613268565b6040519080825280601f01601f191660200182016040528015612ba2576020820181803683370190505b5090505f5b82811015612c1e57848181518110612bc157612bc1613706565b602001015160f81c60f81b828281518110612bde57612bde613706565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080612c168161372e565b915050612ba7565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b6068545f90610100900463ffffffff16158015612c87575063ffffffff82166001145b15612c99575063ffffffff8216612cc1565b612cae64010000000063ffffffff84166137ac565b612cbe9063ffffffff85166137c3565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003611723576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612d78826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e729092919063ffffffff16565b8051909150156123d05780806020019051810190612d969190613d64565b6123d05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611aca565b5f54610100900460ff166129ac5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b606061098b84845f85855f80866001600160a01b03168587604051612e9791906137e5565b5f6040518083038185875af1925050503d805f8114612ed1576040519150601f19603f3d011682016040523d82523d5f602084013e612ed6565b606091505b5091509150612ee787838387612ef2565b979650505050505050565b60608315612f605782515f03612f59576001600160a01b0385163b612f595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611aca565b508161098b565b61098b8383815115612f755781518083602001fd5b8060405162461bcd60e51b8152600401611aca9190613102565b803563ffffffff81168114612c5f575f80fd5b6001600160a01b0381168114612fb6575f80fd5b50565b5f8060408385031215612fca575f80fd5b612fd383612f8f565b91506020830135612fe381612fa2565b809150509250929050565b8015158114612fb6575f80fd5b5f8083601f84011261300b575f80fd5b50813567ffffffffffffffff811115613022575f80fd5b602083019150836020828501011115613039575f80fd5b9250929050565b5f805f805f60808688031215613054575f80fd5b61305d86612f8f565b9450602086013561306d81612fa2565b9350604086013561307d81612fee565b9250606086013567ffffffffffffffff811115613098575f80fd5b6130a488828901612ffb565b969995985093965092949392505050565b5f5b838110156130cf5781810151838201526020016130b7565b50505f910152565b5f81518084526130ee8160208601602086016130b5565b601f01601f19169290920160200192915050565b602081525f61311460208301846130d7565b9392505050565b5f6020828403121561312b575f80fd5b813561311481612fa2565b60ff81168114612fb6575f80fd5b5f805f805f805f60e0888a03121561315a575f80fd5b873561316581613136565b965061317360208901612f8f565b9550604088013561318381612fa2565b945061319160608901612f8f565b935060808801356131a181612fa2565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156131d0575f80fd5b6131d984612f8f565b925060208401356131e981612fa2565b915060408401356131f981612fa2565b809150509250925092565b5f60208284031215613214575f80fd5b5035919050565b8061040081018310156106ca575f80fd5b5f805f610440848603121561323f575f80fd5b83359250613250856020860161321b565b915061325f6104208501612f8f565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156132a5576132a5613268565b604052919050565b5f67ffffffffffffffff8211156132c6576132c6613268565b50601f01601f191660200190565b5f6132e66132e1846132ad565b61327c565b90508281528383830111156132f9575f80fd5b828260208301375f602084830101529392505050565b5f82601f83011261331e575f80fd5b613114838335602085016132d4565b5f805f805f60a08688031215613341575f80fd5b61334a86612f8f565b9450602086013561335a81612fa2565b9350604086013567ffffffffffffffff80821115613376575f80fd5b61338289838a0161330f565b94506060880135915080821115613397575f80fd5b506133a48882890161330f565b92505060808601356133b581613136565b809150509295509295909350565b5f805f805f8060a087890312156133d8575f80fd5b6133e187612f8f565b955060208701356133f181612fa2565b945060408701359350606087013561340881612fee565b9250608087013567ffffffffffffffff811115613423575f80fd5b61342f89828a01612ffb565b979a9699509497509295939492505050565b5f8060408385031215613452575f80fd5b61345b83612f8f565b915061346960208401612f8f565b90509250929050565b5f805f805f805f805f805f806109208d8f03121561348e575f80fd5b6134988e8e61321b565b9b506134a88e6104008f0161321b565b9a506108008d013599506108208d013598506108408d013597506134cf6108608e01612f8f565b96506134df6108808e0135612fa2565b6108808d013595506134f46108a08e01612f8f565b94506135046108c08e0135612fa2565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111561352d575f80fd5b61353e8e6109008f01358f01612ffb565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121561356c575f80fd5b61357588612f8f565b9650602088013561358581612fa2565b955060408801359450606088013561359c81612fa2565b935060808801356135ac81612fee565b925060a088013567ffffffffffffffff8111156135c7575f80fd5b6135d38a828b01612ffb565b989b979a50959850939692959293505050565b5f805f805f8060c087890312156135fb575f80fd5b61360487612f8f565b9550602087013561361481612fa2565b945061362260408801612f8f565b9350606087013561363281612fa2565b9250608087013561364281612fa2565b915060a087013567ffffffffffffffff81111561365d575f80fd5b8701601f8101891361366d575f80fd5b61367c898235602084016132d4565b9150509295509295509295565b5f805f80610460858703121561369d575f80fd5b843593506136ae866020870161321b565b92506136bd6104208601612f8f565b939692955092936104400135925050565b600181811c908216806136e257607f821691505b60208210810361370057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f6001820161373f5761373f61371a565b5060010190565b606081525f61375860608301866130d7565b828103602084015261376a81866130d7565b91505060ff83166040830152949350505050565b5f835161378f8184602088016130b5565b8351908301906137a38183602088016130b5565b01949350505050565b80820281158282048414176106ca576106ca61371a565b808201808211156106ca576106ca61371a565b818382375f9101908152919050565b5f82516137f68184602087016130b5565b9190910192915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b63ffffffff861681525f6001600160a01b03808716602084015280861660408401525060806060830152612ee7608083018486613800565b5f60208284031215613870575f80fd5b5051919050565b818103818111156106ca576106ca61371a565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c08501526138da828501876130d7565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f613921606083018486613800565b9695505050505050565b601f8211156123d0575f81815260208120601f850160051c810160208610156139515750805b601f850160051c820191505b81811015610cba5782815560010161395d565b815167ffffffffffffffff81111561398a5761398a613268565b61399e8161399884546136ce565b8461392b565b602080601f8311600181146139d1575f84156139ba5750858301515b5f19600386901b1c1916600185901b178555610cba565b5f85815260208120601f198616915b828110156139ff578886015182559484019460019091019084016139e0565b5085821015613a1c57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c0850152613a7d8285018789613800565b925080851660e085015250509a9950505050505050505050565b5f60208284031215613aa7575f80fd5b815161311481613136565b63ffffffff8181168382160190808211156124615761246161371a565b5f8085851115613add575f80fd5b83861115613ae9575f80fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015613b1e5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215613b3c575f80fd5b8735613b4781612fa2565b96506020880135613b5781612fa2565b9550604088013594506060880135935060808801356131a181613136565b5f805f805f805f80610100898b031215613b8d575f80fd5b8835613b9881612fa2565b97506020890135613ba881612fa2565b965060408901359550606089013594506080890135613bc681612fee565b935060a0890135613bd681613136565b979a969950949793969295929450505060c08201359160e0013590565b600181815b80851115613c2d57815f1904821115613c1357613c1361371a565b80851615613c2057918102915b93841c9390800290613bf8565b509250929050565b5f82613c43575060016106ca565b81613c4f57505f6106ca565b8160018114613c655760028114613c6f57613c8b565b60019150506106ca565b60ff841115613c8057613c8061371a565b50506001821b6106ca565b5060208310610133831016604e8410600b8410161715613cae575081810a6106ca565b613cb88383613bf3565b805f1904821115613ccb57613ccb61371a565b029392505050565b5f6131148383613c35565b634e487b7160e01b5f52600160045260245ffd5b5f60208284031215613d02575f80fd5b815167ffffffffffffffff811115613d18575f80fd5b8201601f81018413613d28575f80fd5b8051613d366132e1826132ad565b818152856020838501011115613d4a575f80fd5b613d5b8260208301602086016130b5565b95945050505050565b5f60208284031215613d74575f80fd5b815161311481612fee56fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a2646970667358221220432f6d6b4446edbe1f73c19fd2115454d5c35d8b03b98a74fd46724151d7672264736f6c63430008140033" + }, + { + "contractName": "PolygonZkEVMBridge proxy", + "balance": "340282366920938463463374607431768211455", + "nonce": "1", + "address": "0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe", + "bytecode": "0x60806040526004361061005d575f3560e01c80635c60da1b116100425780635c60da1b146100a65780638f283970146100e3578063f851a440146101025761006c565b80633659cfe6146100745780634f1ef286146100935761006c565b3661006c5761006a610116565b005b61006a610116565b34801561007f575f80fd5b5061006a61008e366004610854565b610130565b61006a6100a136600461086d565b610178565b3480156100b1575f80fd5b506100ba6101eb565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee575f80fd5b5061006a6100fd366004610854565b610228565b34801561010d575f80fd5b506100ba610255565b61011e610282565b61012e610129610359565b610362565b565b610138610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d8160405180602001604052805f8152505f6103bf565b50565b61016d610116565b610180610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101e3576101de8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250600192506103bf915050565b505050565b6101de610116565b5f6101f4610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610359565b905090565b610225610116565b90565b610230610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d816103e9565b5f61025e610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610380565b61028a610380565b73ffffffffffffffffffffffffffffffffffffffff16330361012e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b5f61021861044a565b365f80375f80365f845af43d5f803e80801561037c573d5ff35b3d5ffd5b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b6103c883610471565b5f825111806103d45750805b156101de576103e383836104bd565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f610412610380565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a161016d816104e9565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103a3565b61047a816105f5565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606104e28383604051806060016040528060278152602001610977602791396106c0565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811661058c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610350565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b73ffffffffffffffffffffffffffffffffffffffff81163b610699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610350565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105af565b60605f808573ffffffffffffffffffffffffffffffffffffffff16856040516106e9919061090b565b5f60405180830381855af49150503d805f8114610721576040519150601f19603f3d011682016040523d82523d5f602084013e610726565b606091505b509150915061073786838387610741565b9695505050505050565b606083156107d65782515f036107cf5773ffffffffffffffffffffffffffffffffffffffff85163b6107cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610350565b50816107e0565b6107e083836107e8565b949350505050565b8151156107f85781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103509190610926565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f575f80fd5b919050565b5f60208284031215610864575f80fd5b6104e28261082c565b5f805f6040848603121561087f575f80fd5b6108888461082c565b9250602084013567ffffffffffffffff808211156108a4575f80fd5b818601915086601f8301126108b7575f80fd5b8135818111156108c5575f80fd5b8760208285010111156108d6575f80fd5b6020830194508093505050509250925092565b5f5b838110156109035781810151838201526020016108eb565b50505f910152565b5f825161091c8184602087016108e9565b9190910192915050565b602081525f82518060208401526109448160408501602087016108e9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212202ac98acbfbb3d3ac1b74050e18c4e76db25a3ff2801ec69bf85d0c61414d502b64736f6c63430008140033", + "storage": { + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x0000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000005ac4182a1dd41aeef465e40b82fd326bf66ab82c" + } + }, + { + "contractName": "PolygonZkEVMGlobalExitRootL2 implementation", + "balance": "0", + "nonce": "1", + "address": "0x0200143Fa295EE4dffEF22eE2616c2E008D81688", + "bytecode": "0x608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301fd90441461004e578063257b36321461006a57806333d6247d14610089578063a3c573eb1461009e575b5f80fd5b61005760015481565b6040519081526020015b60405180910390f35b61005761007836600461015e565b5f6020819052908152604090205481565b61009c61009736600461015e565b6100ea565b005b6100c57f0000000000000000000000002a3dd3eb832af982ec71669e178424b10dca2ede81565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610061565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000002a3dd3eb832af982ec71669e178424b10dca2ede1614610159576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b5f6020828403121561016e575f80fd5b503591905056fea26469706673582212205108c6c4f924146b736832a1bdf696e20d900450207b7452462368d150f2c71c64736f6c63430008140033" + }, + { + "contractName": "PolygonZkEVMGlobalExitRootL2 proxy", + "balance": "0", + "nonce": "1", + "address": "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa", + "bytecode": "0x60806040523661001357610011610017565b005b6100115b61001f6101b7565b6001600160a01b0316336001600160a01b0316141561016f5760606001600160e01b031960003516631b2ce7f360e11b8114156100655761005e6101ea565b9150610167565b6001600160e01b0319811663278f794360e11b14156100865761005e610241565b6001600160e01b031981166308f2839760e41b14156100a75761005e610287565b6001600160e01b031981166303e1469160e61b14156100c85761005e6102b8565b6001600160e01b03198116635c60da1b60e01b14156100e95761005e6102f8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b61017761030c565b565b606061019e83836040518060600160405280602781526020016108576027913961031c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101f4610394565b600061020336600481846106a2565b81019061021091906106e8565b905061022d8160405180602001604052806000815250600061039f565b505060408051602081019091526000815290565b606060008061025336600481846106a2565b8101906102609190610719565b915091506102708282600161039f565b604051806020016040528060008152509250505090565b6060610291610394565b60006102a036600481846106a2565b8101906102ad91906106e8565b905061022d816103cb565b60606102c2610394565b60006102cc6101b7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b6060610302610394565b60006102cc610422565b610177610317610422565b610431565b6060600080856001600160a01b0316856040516103399190610807565b600060405180830381855af49150503d8060008114610374576040519150601f19603f3d011682016040523d82523d6000602084013e610379565b606091505b509150915061038a86838387610455565b9695505050505050565b341561017757600080fd5b6103a8836104d3565b6000825111806103b55750805b156103c6576103c48383610179565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103f46101b7565b604080516001600160a01b03928316815291841660208301520160405180910390a161041f81610513565b50565b600061042c6105bc565b905090565b3660008037600080366000845af43d6000803e808015610450573d6000f35b3d6000fd5b606083156104c15782516104ba576001600160a01b0385163b6104ba5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161015e565b50816104cb565b6104cb83836105e4565b949350505050565b6104dc8161060e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105785760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161015e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101db565b8151156105f45781518083602001fd5b8060405162461bcd60e51b815260040161015e9190610823565b6001600160a01b0381163b61067b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161015e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61059b565b600080858511156106b257600080fd5b838611156106bf57600080fd5b5050820193919092039150565b80356001600160a01b03811681146106e357600080fd5b919050565b6000602082840312156106fa57600080fd5b61019e826106cc565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561072c57600080fd5b610735836106cc565b9150602083013567ffffffffffffffff8082111561075257600080fd5b818501915085601f83011261076657600080fd5b81358181111561077857610778610703565b604051601f8201601f19908116603f011681019083821181831017156107a0576107a0610703565b816040528281528860208487010111156107b957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107f65781810151838201526020016107de565b838111156103c45750506000910152565b600082516108198184602087016107db565b9190910192915050565b60208152600082518060208401526108428160408501602087016107db565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122012bb4f564f73959a03513dc74fc3c6e40e8386e6f02c16b78d6db00ce0aa16af64736f6c63430008090033", + "storage": { + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x0000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000000200143fa295ee4dffef22ee2616c2e008d81688" + } + }, + { + "contractName": "PolygonZkEVMTimelock", + "balance": "0", + "nonce": "1", + "address": "0xBBa0935Fa93Eb23de7990b47F0D96a8f75766d13", + "bytecode": "0x6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220e28ae7494480ab1c619fd775dc5ff665588c808a910d66178a982c2e7c76a1e664736f6c63430008140033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x00000000000000000000000000000000000000000000000000000000000d2f00", + "0xb7dfbbca55dd7b7b40403b7620ec95da956b60d562518460548c310b9ba22ee5": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x9fa2d8034dbcb437bee38d61fbd100910e1342ffc07f128aa1b8e6790b7f3f68": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x64494413541ff93b31aa309254e3fed72a7456e9845988b915b4c7a7ceba8814": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x8af78a811b91830f719aeb3279e6ef47b4b581bcf168d6d9015d376b23a240bc": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x3412d5605ac6cd444957cedb533e5dacad6378b4bc819ebe3652188a665066d6": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x9b56cc8bdadd190ab692f9895be09d0edc2ddf428710bebe53c4911e5bc08f42": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d706a": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x74be529e918f2e5719738045bde8f05a9e9498aace6df8d886a992d046f546a1": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xc3ad33e20b0c56a223ad5104fff154aa010f8715b9c981fd38fdc60a4d1a52fc": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5" + } + }, + { + "accountName": "keyless Deployer", + "balance": "0", + "nonce": "1", + "address": "0x9d90066e7478496e2284E54c3548106bb4F90E50" + }, + { + "accountName": "deployer", + "balance": "0", + "nonce": "8", + "address": "0x4c1665d6651ecEfa59B9B3041951608468b18891" + } + ] +} \ No newline at end of file diff --git a/tools/addRollupType/addRollupTestnet/add_rollup_type.json b/tools/addRollupType/addRollupTestnet/add_rollup_type.json new file mode 100644 index 000000000..6b71494e6 --- /dev/null +++ b/tools/addRollupType/addRollupTestnet/add_rollup_type.json @@ -0,0 +1,18 @@ +{ + "consensusContract": "PolygonValidiumEtrog", + "polygonRollupManagerAddress": "0x32d33D5137a7cFFb54c5Bf8371172bcEc5f310ff", + "polygonZkEVMBridgeAddress": "0x528e26b25a34a4A5d0dbDa1d57D318153d2ED582", + "polygonZkEVMGlobalExitRootAddress": "0xAd1490c248c5d3CbAE399Fd529b79B42984277DF", + "polTokenAddress": "0x6a7c3F4B0651d6DA389AD1d11D962ea458cDCA70", + "verifierAddress": "0xFcBe1fae9605192bc67f9E05114195C6A64675A6", + "description": "Type: Validium, Version: etrog, genesis: /ipfs/QmZVxfDG5SbeFT2Zb3BLhf48GmFLyweAnxpPty6Wa8a2YU", + "forkID": 7, + "rollupCompatibilityID": 0, + "timelockDelay": 3600, + "timelockSalt": "", + "gasTokenAddress":"", + "deployerPvtKey": "", + "maxFeePerGas":"", + "maxPriorityFeePerGas":"", + "multiplierGas": "" +} diff --git a/tools/addRollupType/addRollupTestnet/add_rollup_type_output.json b/tools/addRollupType/addRollupTestnet/add_rollup_type_output.json new file mode 100644 index 000000000..1bc997b4f --- /dev/null +++ b/tools/addRollupType/addRollupTestnet/add_rollup_type_output.json @@ -0,0 +1,7 @@ +{ + "genesis": "0xc012c41e4583a2e3b776aff34aea0b4fd235d098484a455956554dbf69b8235e", + "verifierAddress": "0xFcBe1fae9605192bc67f9E05114195C6A64675A6", + "consensusContract": "PolygonValidiumEtrog", + "scheduleData": "0x01d5062a00000000000000000000000032d33d5137a7cffb54c5bf8371172bcec5f310ff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000144f34eb8eb0000000000000000000000005b3a21d59d312d21a387e22e4a56e88eb20410ab000000000000000000000000fcbe1fae9605192bc67f9e05114195c6a64675a600000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000000c012c41e4583a2e3b776aff34aea0b4fd235d098484a455956554dbf69b8235e00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000005d547970653a2056616c696469756d2c2056657273696f6e3a206574726f672c2067656e657369733a202f697066732f516d5a5678664447355362654654325a6233424c68663438476d464c797765416e7870507479365761386132595500000000000000000000000000000000000000000000000000000000000000", + "executeData": "0x134008d300000000000000000000000032d33d5137a7cffb54c5bf8371172bcec5f310ff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000144f34eb8eb0000000000000000000000005b3a21d59d312d21a387e22e4a56e88eb20410ab000000000000000000000000fcbe1fae9605192bc67f9e05114195c6a64675a600000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000000c012c41e4583a2e3b776aff34aea0b4fd235d098484a455956554dbf69b8235e00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000005d547970653a2056616c696469756d2c2056657273696f6e3a206574726f672c2067656e657369733a202f697066732f516d5a5678664447355362654654325a6233424c68663438476d464c797765416e7870507479365761386132595500000000000000000000000000000000000000000000000000000000000000" +} \ No newline at end of file diff --git a/tools/addRollupType/addRollupTestnet/genesis.json b/tools/addRollupType/addRollupTestnet/genesis.json new file mode 100644 index 000000000..f6d74112b --- /dev/null +++ b/tools/addRollupType/addRollupTestnet/genesis.json @@ -0,0 +1,92 @@ +{ + "root": "0xc012c41e4583a2e3b776aff34aea0b4fd235d098484a455956554dbf69b8235e", + "genesis": [ + { + "contractName": "PolygonZkEVMDeployer", + "balance": "0", + "nonce": "4", + "address": "0x36810012486fc134D0679c07f85fe5ba5A087D8C", + "bytecode": "0x60806040526004361061006e575f3560e01c8063715018a61161004c578063715018a6146100e25780638da5cb5b146100f6578063e11ae6cb1461011f578063f2fde38b14610132575f80fd5b80632b79805a146100725780634a94d487146100875780636d07dbf81461009a575b5f80fd5b610085610080366004610908565b610151565b005b6100856100953660046109a2565b6101c2565b3480156100a5575f80fd5b506100b96100b43660046109f5565b610203565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ed575f80fd5b50610085610215565b348015610101575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff166100b9565b61008561012d366004610a15565b610228565b34801561013d575f80fd5b5061008561014c366004610a61565b61028e565b61015961034a565b5f6101658585856103ca565b90506101718183610527565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a15050505050565b6101ca61034a565b6101d583838361056a565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b905f90a1505050565b5f61020e8383610598565b9392505050565b61021d61034a565b6102265f6105a4565b565b61023061034a565b5f61023c8484846103ca565b60405173ffffffffffffffffffffffffffffffffffffffff821681529091507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a150505050565b61029661034a565b73ffffffffffffffffffffffffffffffffffffffff811661033e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610347816105a4565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610335565b5f83471015610435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610335565b81515f0361049f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610335565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff811661020e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610335565b606061020e83835f6040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c65640000815250610618565b6060610590848484604051806060016040528060298152602001610b0860299139610618565b949350505050565b5f61020e83833061072d565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156106aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610335565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516106d29190610a9c565b5f6040518083038185875af1925050503d805f811461070c576040519150601f19603f3d011682016040523d82523d5f602084013e610711565b606091505b509150915061072287838387610756565b979650505050505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b606083156107eb5782515f036107e45773ffffffffffffffffffffffffffffffffffffffff85163b6107e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610335565b5081610590565b61059083838151156108005781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103359190610ab7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112610870575f80fd5b813567ffffffffffffffff8082111561088b5761088b610834565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156108d1576108d1610834565b816040528381528660208588010111156108e9575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f806080858703121561091b575f80fd5b8435935060208501359250604085013567ffffffffffffffff80821115610940575f80fd5b61094c88838901610861565b93506060870135915080821115610961575f80fd5b5061096e87828801610861565b91505092959194509250565b803573ffffffffffffffffffffffffffffffffffffffff8116811461099d575f80fd5b919050565b5f805f606084860312156109b4575f80fd5b6109bd8461097a565b9250602084013567ffffffffffffffff8111156109d8575f80fd5b6109e486828701610861565b925050604084013590509250925092565b5f8060408385031215610a06575f80fd5b50508035926020909101359150565b5f805f60608486031215610a27575f80fd5b8335925060208401359150604084013567ffffffffffffffff811115610a4b575f80fd5b610a5786828701610861565b9150509250925092565b5f60208284031215610a71575f80fd5b61020e8261097a565b5f5b83811015610a94578181015183820152602001610a7c565b50505f910152565b5f8251610aad818460208701610a7a565b9190910192915050565b602081525f8251806020840152610ad5816040850160208701610a7a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220330b94dc698c4d290bf55c23f13b473cde6a6bae0030cb902de18af54e35839f64736f6c63430008140033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000ff6250d0e86a2465b0c1bf8e36409503d6a26963" + } + }, + { + "contractName": "ProxyAdmin", + "balance": "0", + "nonce": "1", + "address": "0x85cEB41028B1a5ED2b88E395145344837308b251", + "bytecode": "0x608060405260043610610079575f3560e01c80639623609d1161004c5780639623609d1461012357806399a88ec414610136578063f2fde38b14610155578063f3b7dead14610174575f80fd5b8063204e1c7a1461007d578063715018a6146100c55780637eff275e146100db5780638da5cb5b146100fa575b5f80fd5b348015610088575f80fd5b5061009c6100973660046105e8565b610193565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100d0575f80fd5b506100d9610244565b005b3480156100e6575f80fd5b506100d96100f536600461060a565b610257565b348015610105575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff1661009c565b6100d961013136600461066e565b6102e0565b348015610141575f80fd5b506100d961015036600461060a565b610371565b348015610160575f80fd5b506100d961016f3660046105e8565b6103cd565b34801561017f575f80fd5b5061009c61018e3660046105e8565b610489565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907f5c60da1b00000000000000000000000000000000000000000000000000000000815260040190565b5f60405180830381855afa9150503d805f8114610215576040519150601f19603f3d011682016040523d82523d5f602084013e61021a565b606091505b509150915081610228575f80fd5b8080602001905181019061023c919061075b565b949350505050565b61024c6104d3565b6102555f610553565b565b61025f6104d3565b6040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690638f283970906024015b5f604051808303815f87803b1580156102c6575f80fd5b505af11580156102d8573d5f803e3d5ffd5b505050505050565b6102e86104d3565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef28690349061033e9086908690600401610776565b5f604051808303818588803b158015610355575f80fd5b505af1158015610367573d5f803e3d5ffd5b5050505050505050565b6103796104d3565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690633659cfe6906024016102af565b6103d56104d3565b73ffffffffffffffffffffffffffffffffffffffff811661047d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61048681610553565b50565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907ff851a44000000000000000000000000000000000000000000000000000000000815260040190565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610474565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610486575f80fd5b5f602082840312156105f8575f80fd5b8135610603816105c7565b9392505050565b5f806040838503121561061b575f80fd5b8235610626816105c7565b91506020830135610636816105c7565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f805f60608486031215610680575f80fd5b833561068b816105c7565b9250602084013561069b816105c7565b9150604084013567ffffffffffffffff808211156106b7575f80fd5b818601915086601f8301126106ca575f80fd5b8135818111156106dc576106dc610641565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561072257610722610641565b8160405282815289602084870101111561073a575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f6020828403121561076b575f80fd5b8151610603816105c7565b73ffffffffffffffffffffffffffffffffffffffff831681525f602060408184015283518060408501525f5b818110156107be578581018301518582016060015282016107a2565b505f6060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050939250505056fea26469706673582212203083a4ccc2e42eed60bd19037f2efa77ed086dc7a5403f75bebb995dcba2221c64736f6c63430008140033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000dbc6981a11fc2b000c635bfa7c47676b25c87d39" + } + }, + { + "contractName": "PolygonZkEVMBridge implementation", + "balance": "0", + "nonce": "1", + "address": "0x8BD36ca1A55e389335004872aA3C3Be0969D3aA7", + "bytecode": "0x6080604052600436106101db575f3560e01c806383f24403116100fd578063ccaa2d1111610092578063ee25560b11610062578063ee25560b146105a9578063f5efcd79146105d4578063f811bff7146105f3578063fb57083414610612575f80fd5b8063ccaa2d111461053b578063cd5865791461055a578063d02103ca1461056d578063dbc1697614610595575f80fd5b8063bab161bf116100cd578063bab161bf146104b9578063be5831c7146104da578063c00f14ab146104fd578063cc4616321461051c575f80fd5b806383f244031461043d5780638ed7e3f21461045c578063aaa13cc21461047b578063b8b284d01461049a575f80fd5b80633cbc795b116101735780637843298b116101435780637843298b146103c257806379e2cf97146103e157806381b1c174146103f557806383c43a5514610429575f80fd5b80633cbc795b146103385780633e197043146103705780634b2f336d1461038f5780635ca1e165146103ae575f80fd5b806327aef4e8116101ae57806327aef4e81461026d5780632dfdf0b51461028e578063318aee3d146102b15780633c351e1014610319575f80fd5b806315064c96146101df5780632072f6c51461020d57806322e95f2c14610223578063240ff3781461025a575b5f80fd5b3480156101ea575f80fd5b506068546101f89060ff1681565b60405190151581526020015b60405180910390f35b348015610218575f80fd5b50610221610631565b005b34801561022e575f80fd5b5061024261023d366004612fb9565b610666565b6040516001600160a01b039091168152602001610204565b610221610268366004613040565b6106d0565b348015610278575f80fd5b50610281610759565b6040516102049190613102565b348015610299575f80fd5b506102a360535481565b604051908152602001610204565b3480156102bc575f80fd5b506102f56102cb36600461311b565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201610204565b348015610324575f80fd5b50606d54610242906001600160a01b031681565b348015610343575f80fd5b50606d5461035b90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610204565b34801561037b575f80fd5b506102a361038a366004613144565b6107e5565b34801561039a575f80fd5b50606f54610242906001600160a01b031681565b3480156103b9575f80fd5b506102a361088e565b3480156103cd575f80fd5b506102426103dc3660046131be565b61096a565b3480156103ec575f80fd5b50610221610993565b348015610400575f80fd5b5061024261040f366004613204565b606a6020525f90815260409020546001600160a01b031681565b348015610434575f80fd5b506102816109b4565b348015610448575f80fd5b506102a361045736600461322c565b6109d3565b348015610467575f80fd5b50606c54610242906001600160a01b031681565b348015610486575f80fd5b5061024261049536600461332d565b610aa8565b3480156104a5575f80fd5b506102216104b43660046133c3565b610be7565b3480156104c4575f80fd5b5060685461035b90610100900463ffffffff1681565b3480156104e5575f80fd5b5060685461035b90600160c81b900463ffffffff1681565b348015610508575f80fd5b5061028161051736600461311b565b610cc2565b348015610527575f80fd5b506101f8610536366004613441565b610d07565b348015610546575f80fd5b50610221610555366004613472565b610d8f565b610221610568366004613556565b6112c0565b348015610578575f80fd5b50606854610242906501000000000090046001600160a01b031681565b3480156105a0575f80fd5b5061022161172c565b3480156105b4575f80fd5b506102a36105c3366004613204565b60696020525f908152604090205481565b3480156105df575f80fd5b506102216105ee366004613472565b61175f565b3480156105fe575f80fd5b5061022161060d3660046135e6565b611a25565b34801561061d575f80fd5b506101f861062c366004613689565b611d40565b606c546001600160a01b0316331461065c57604051631736745960e31b815260040160405180910390fd5b610664611d57565b565b6040805160e084901b6001600160e01b031916602080830191909152606084901b6bffffffffffffffffffffffff1916602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b60685460ff16156106f457604051630bc011ff60e21b815260040160405180910390fd5b341580159061070d5750606f546001600160a01b031615155b15610744576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610752858534868686611db2565b5050505050565b606e8054610766906136ce565b80601f0160208091040260200160405190810160405280929190818152602001828054610792906136ce565b80156107dd5780601f106107b4576101008083540402835291602001916107dd565b820191905f5260205f20905b8154815290600101906020018083116107c057829003601f168201915b505050505081565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201526001600160e01b031960e088811b821660218401526bffffffffffffffffffffffff19606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b6053545f90819081805b6020811015610961578083901c6001166001036108f557603381602081106108c2576108c2613706565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610922565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806109599061372e565b915050610898565b50919392505050565b5f61098b848461097985611e7c565b61098286611f66565b61049587612047565b949350505050565b605354606854600160c81b900463ffffffff16101561066457610664612114565b60405180611ba00160405280611b668152602001613d80611b66913981565b5f83815b6020811015610a9f57600163ffffffff8516821c81169003610a4257848160208110610a0557610a05613706565b602002013582604051602001610a25929190918252602082015260400190565b604051602081830303815290604052805190602001209150610a8d565b81858260208110610a5557610a55613706565b6020020135604051602001610a74929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610a978161372e565b9150506109d7565b50949350505050565b6040516001600160e01b031960e087901b1660208201526bffffffffffffffffffffffff19606086901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180611ba00160405280611b668152602001613d80611b669139898989604051602001610b3093929190613746565b60408051601f1981840301815290829052610b4e929160200161377e565b60405160208183030381529060405280519060200120604051602001610bc394939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff1615610c0b57604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b0316610c4d576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f54604051632770a7eb60e21b8152336004820152602481018690526001600160a01b0390911690639dc29fac906044015f604051808303815f87803b158015610c96575f80fd5b505af1158015610ca8573d5f803e3d5ffd5b50505050610cba868686868686611db2565b505050505050565b6060610ccd82611e7c565b610cd683611f66565b610cdf84612047565b604051602001610cf193929190613746565b6040516020818303038152906040529050919050565b6068545f908190610100900463ffffffff16158015610d2c575063ffffffff83166001145b15610d3e575063ffffffff8316610d66565b610d5364010000000063ffffffff85166137ac565b610d639063ffffffff86166137c3565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff1615610db357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614610de3576040516302caf51760e11b815260040160405180910390fd5b610e168c8c8c8c8c610e115f8e8e8e8e8e8e8e604051610e049291906137d6565b60405180910390206107e5565b6121c2565b6001600160a01b038616610f6057606f546001600160a01b0316610efa575f6001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015610e6c576020820181803683370190505b50604051610e7a91906137e5565b5f6040518083038185875af1925050503d805f8114610eb4576040519150601f19603f3d011682016040523d82523d5f602084013e610eb9565b606091505b5050905080610ef4576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611256565b606f546040516340c10f1960e01b81526001600160a01b03868116600483015260248201869052909116906340c10f19906044015f604051808303815f87803b158015610f45575f80fd5b505af1158015610f57573d5f803e3d5ffd5b50505050611256565b606d546001600160a01b038781169116148015610f8e5750606d5463ffffffff888116600160a01b90920416145b15610fa5575f6001600160a01b0385168482610e42565b60685463ffffffff610100909104811690881603610fd657610fd16001600160a01b0387168585612354565b611256565b6040516001600160e01b031960e089901b1660208201526bffffffffffffffffffffffff19606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b0316806111f5575f6110808386868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506123d592505050565b6040516340c10f1960e01b81526001600160a01b03898116600483015260248201899052919250908216906340c10f19906044015f604051808303815f87803b1580156110cb575f80fd5b505af11580156110dd573d5f803e3d5ffd5b5050505080606a5f8581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a8388886040516111e7959493929190613828565b60405180910390a150611253565b6040516340c10f1960e01b81526001600160a01b038781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801561123c575f80fd5b505af115801561124e573d5f803e3d5ffd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156112e457604051630bc011ff60e21b815260040160405180910390fd5b6112ec612468565b60685463ffffffff61010090910481169088160361131d576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b03881661141957883414611369576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff16945090611396906136ce565b80601f01602080910402602001604051908101604052809291908181526020018280546113c2906136ce565b801561140d5780601f106113e45761010080835404028352916020019161140d565b820191905f5260205f20905b8154815290600101906020018083116113f057829003601f168201915b505050505091506116a3565b3415611451576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546001600160a01b03908116908916036114c757604051632770a7eb60e21b8152336004820152602481018a90526001600160a01b03891690639dc29fac906044015f604051808303815f87803b1580156114ac575f80fd5b505af11580156114be573d5f803e3d5ffd5b505050506116a3565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901561157957604051632770a7eb60e21b8152336004820152602481018b90526001600160a01b038a1690639dc29fac906044015f604051808303815f87803b158015611551575f80fd5b505af1158015611563573d5f803e3d5ffd5b5050505080602001519450805f01519350611696565b851561158b5761158b898b89896124c1565b6040516370a0823160e01b81523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa1580156115cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f39190613860565b905061160a6001600160a01b038b1633308e612860565b6040516370a0823160e01b81523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa15801561164e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116729190613860565b905061167e8282613877565b6068548c9850610100900463ffffffff169650935050505b61169f89610cc2565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e86886053546040516116e298979695949392919061388a565b60405180910390a16117086117035f85878f8f8789805190602001206107e5565b6128b1565b861561171657611716612114565b5050505061172360018055565b50505050505050565b606c546001600160a01b0316331461175757604051631736745960e31b815260040160405180910390fd5b6106646129b2565b60685460ff161561178357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146117b3576040516302caf51760e11b815260040160405180910390fd5b6117d58c8c8c8c8c610e1160018e8e8e8e8e8e8e604051610e049291906137d6565b606f545f906001600160a01b031661188857846001600160a01b031684888a868660405160240161180994939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161183e91906137e5565b5f6040518083038185875af1925050503d805f8114611878576040519150601f19603f3d011682016040523d82523d5f602084013e61187d565b606091505b505080915050611983565b606f546040516340c10f1960e01b81526001600160a01b03878116600483015260248201879052909116906340c10f19906044015f604051808303815f87803b1580156118d3575f80fd5b505af11580156118e5573d5f803e3d5ffd5b50505050846001600160a01b03168789858560405160240161190a94939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161193f91906137e5565b5f604051808303815f865af19150503d805f8114611978576040519150601f19603f3d011682016040523d82523d5f602084013e61197d565b606091505b50909150505b806119ba576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f54610100900460ff1615808015611a4357505f54600160ff909116105b80611a5c5750303b158015611a5c57505f5460ff166001145b611ad35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805460ff191660011790558015611af4575f805461ff0019166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8a16027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038781169190910291909117909155606c805473ffffffffffffffffffffffffffffffffffffffff19168583161790558616611bcf5763ffffffff851615611bca576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ceb565b606d805463ffffffff8716600160a01b027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b03891617179055606e611c1e8382613970565b50611cbd5f801b6012604051602001611ca991906060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff91909116604082015260e00190565b6040516020818303038152906040526123d5565b606f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790555b611cf3612a22565b8015611723575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b5f81611d4d8686866109d3565b1495945050505050565b60685460ff1615611d7b57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff610100909104811690871603611de3576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051611e3799989796959493929190613a2c565b60405180910390a1611e6e6117036001606860019054906101000a900463ffffffff16338a8a8a8989604051610e049291906137d6565b8215610cba57610cba612114565b60408051600481526024810182526020810180516001600160e01b03167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611edb91906137e5565b5f60405180830381855afa9150503d805f8114611f13576040519150601f19603f3d011682016040523d82523d5f602084013e611f18565b606091505b509150915081611f5d576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525061098b565b61098b81612a94565b60408051600481526024810182526020810180516001600160e01b03167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611fc591906137e5565b5f60405180830381855afa9150503d805f8114611ffd576040519150601f19603f3d011682016040523d82523d5f602084013e612002565b606091505b509150915081611f5d576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525061098b565b60408051600481526024810182526020810180516001600160e01b03167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b038616916120a591906137e5565b5f60405180830381855afa9150503d805f81146120dd576040519150601f19603f3d011682016040523d82523d5f602084013e6120e2565b606091505b50915091508180156120f5575080516020145b61210057601261098b565b8080602001905181019061098b9190613a97565b6053546068805463ffffffff909216600160c81b027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d61217561088e565b6040518263ffffffff1660e01b815260040161219391815260200190565b5f604051808303815f87803b1580156121aa575f80fd5b505af11580156121bc573d5f803e3d5ffd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af1158015612253573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122779190613860565b9050805f036122b1576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80680100000000000000008716156122f5578691506122d3848a8489611d40565b6122f0576040516338105f3b60e21b815260040160405180910390fd5b61233f565b602087901c612305816001613ab2565b9150879250612320612318868c866109d3565b8a8389611d40565b61233d576040516338105f3b60e21b815260040160405180910390fd5b505b6123498282612c64565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526123d09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612d24565b505050565b5f8060405180611ba00160405280611b668152602001613d80611b6691398360405160200161240592919061377e565b6040516020818303038152906040529050838151602083015ff591506001600160a01b038216612461576040517fbefb092000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5092915050565b6002600154036124ba5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611aca565b6002600155565b5f6124cf6004828486613acf565b6124d891613af6565b90507f2afa5331000000000000000000000000000000000000000000000000000000006001600160e01b03198216016126b2575f80808080808061251f896004818d613acf565b81019061252c9190613b26565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161461256c5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03861630146125955760405163750643af60e01b815260040160405180910390fd5b8a85146125ce576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b03167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169161266591906137e5565b5f604051808303815f865af19150503d805f811461269e576040519150601f19603f3d011682016040523d82523d5f602084013e6126a3565b606091505b50505050505050505050610752565b6001600160e01b031981166323f2ebc360e21b146126fc576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806127118a6004818e613acf565b81019061271e9190613b75565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146127605760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146127895760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169161281091906137e5565b5f604051808303815f865af19150503d805f8114612849576040519150601f19603f3d011682016040523d82523d5f602084013e61284e565b606091505b50505050505050505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526121bc9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612399565b8060016128c060206002613cd3565b6128ca9190613877565b60535410612904576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f81546129139061372e565b918290555090505f5b60208110156129a3578082901c60011660010361294f57826033826020811061294757612947613706565b015550505050565b6033816020811061296257612962613706565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061299b9061372e565b91505061291c565b506123d0613cde565b60018055565b60685460ff166129ee576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f54610100900460ff16612a8c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b610664612e08565b60606040825110612ab357818060200190518101906106ca9190613cf2565b8151602003612c26575f5b602081108015612b055750828181518110612adb57612adb613706565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15612b1c5780612b148161372e565b915050612abe565b805f03612b5e57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115612b7857612b78613268565b6040519080825280601f01601f191660200182016040528015612ba2576020820181803683370190505b5090505f5b82811015612c1e57848181518110612bc157612bc1613706565b602001015160f81c60f81b828281518110612bde57612bde613706565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080612c168161372e565b915050612ba7565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b6068545f90610100900463ffffffff16158015612c87575063ffffffff82166001145b15612c99575063ffffffff8216612cc1565b612cae64010000000063ffffffff84166137ac565b612cbe9063ffffffff85166137c3565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003611723576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612d78826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e729092919063ffffffff16565b8051909150156123d05780806020019051810190612d969190613d64565b6123d05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611aca565b5f54610100900460ff166129ac5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b606061098b84845f85855f80866001600160a01b03168587604051612e9791906137e5565b5f6040518083038185875af1925050503d805f8114612ed1576040519150601f19603f3d011682016040523d82523d5f602084013e612ed6565b606091505b5091509150612ee787838387612ef2565b979650505050505050565b60608315612f605782515f03612f59576001600160a01b0385163b612f595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611aca565b508161098b565b61098b8383815115612f755781518083602001fd5b8060405162461bcd60e51b8152600401611aca9190613102565b803563ffffffff81168114612c5f575f80fd5b6001600160a01b0381168114612fb6575f80fd5b50565b5f8060408385031215612fca575f80fd5b612fd383612f8f565b91506020830135612fe381612fa2565b809150509250929050565b8015158114612fb6575f80fd5b5f8083601f84011261300b575f80fd5b50813567ffffffffffffffff811115613022575f80fd5b602083019150836020828501011115613039575f80fd5b9250929050565b5f805f805f60808688031215613054575f80fd5b61305d86612f8f565b9450602086013561306d81612fa2565b9350604086013561307d81612fee565b9250606086013567ffffffffffffffff811115613098575f80fd5b6130a488828901612ffb565b969995985093965092949392505050565b5f5b838110156130cf5781810151838201526020016130b7565b50505f910152565b5f81518084526130ee8160208601602086016130b5565b601f01601f19169290920160200192915050565b602081525f61311460208301846130d7565b9392505050565b5f6020828403121561312b575f80fd5b813561311481612fa2565b60ff81168114612fb6575f80fd5b5f805f805f805f60e0888a03121561315a575f80fd5b873561316581613136565b965061317360208901612f8f565b9550604088013561318381612fa2565b945061319160608901612f8f565b935060808801356131a181612fa2565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156131d0575f80fd5b6131d984612f8f565b925060208401356131e981612fa2565b915060408401356131f981612fa2565b809150509250925092565b5f60208284031215613214575f80fd5b5035919050565b8061040081018310156106ca575f80fd5b5f805f610440848603121561323f575f80fd5b83359250613250856020860161321b565b915061325f6104208501612f8f565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156132a5576132a5613268565b604052919050565b5f67ffffffffffffffff8211156132c6576132c6613268565b50601f01601f191660200190565b5f6132e66132e1846132ad565b61327c565b90508281528383830111156132f9575f80fd5b828260208301375f602084830101529392505050565b5f82601f83011261331e575f80fd5b613114838335602085016132d4565b5f805f805f60a08688031215613341575f80fd5b61334a86612f8f565b9450602086013561335a81612fa2565b9350604086013567ffffffffffffffff80821115613376575f80fd5b61338289838a0161330f565b94506060880135915080821115613397575f80fd5b506133a48882890161330f565b92505060808601356133b581613136565b809150509295509295909350565b5f805f805f8060a087890312156133d8575f80fd5b6133e187612f8f565b955060208701356133f181612fa2565b945060408701359350606087013561340881612fee565b9250608087013567ffffffffffffffff811115613423575f80fd5b61342f89828a01612ffb565b979a9699509497509295939492505050565b5f8060408385031215613452575f80fd5b61345b83612f8f565b915061346960208401612f8f565b90509250929050565b5f805f805f805f805f805f806109208d8f03121561348e575f80fd5b6134988e8e61321b565b9b506134a88e6104008f0161321b565b9a506108008d013599506108208d013598506108408d013597506134cf6108608e01612f8f565b96506134df6108808e0135612fa2565b6108808d013595506134f46108a08e01612f8f565b94506135046108c08e0135612fa2565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111561352d575f80fd5b61353e8e6109008f01358f01612ffb565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121561356c575f80fd5b61357588612f8f565b9650602088013561358581612fa2565b955060408801359450606088013561359c81612fa2565b935060808801356135ac81612fee565b925060a088013567ffffffffffffffff8111156135c7575f80fd5b6135d38a828b01612ffb565b989b979a50959850939692959293505050565b5f805f805f8060c087890312156135fb575f80fd5b61360487612f8f565b9550602087013561361481612fa2565b945061362260408801612f8f565b9350606087013561363281612fa2565b9250608087013561364281612fa2565b915060a087013567ffffffffffffffff81111561365d575f80fd5b8701601f8101891361366d575f80fd5b61367c898235602084016132d4565b9150509295509295509295565b5f805f80610460858703121561369d575f80fd5b843593506136ae866020870161321b565b92506136bd6104208601612f8f565b939692955092936104400135925050565b600181811c908216806136e257607f821691505b60208210810361370057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f6001820161373f5761373f61371a565b5060010190565b606081525f61375860608301866130d7565b828103602084015261376a81866130d7565b91505060ff83166040830152949350505050565b5f835161378f8184602088016130b5565b8351908301906137a38183602088016130b5565b01949350505050565b80820281158282048414176106ca576106ca61371a565b808201808211156106ca576106ca61371a565b818382375f9101908152919050565b5f82516137f68184602087016130b5565b9190910192915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b63ffffffff861681525f6001600160a01b03808716602084015280861660408401525060806060830152612ee7608083018486613800565b5f60208284031215613870575f80fd5b5051919050565b818103818111156106ca576106ca61371a565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c08501526138da828501876130d7565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f613921606083018486613800565b9695505050505050565b601f8211156123d0575f81815260208120601f850160051c810160208610156139515750805b601f850160051c820191505b81811015610cba5782815560010161395d565b815167ffffffffffffffff81111561398a5761398a613268565b61399e8161399884546136ce565b8461392b565b602080601f8311600181146139d1575f84156139ba5750858301515b5f19600386901b1c1916600185901b178555610cba565b5f85815260208120601f198616915b828110156139ff578886015182559484019460019091019084016139e0565b5085821015613a1c57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c0850152613a7d8285018789613800565b925080851660e085015250509a9950505050505050505050565b5f60208284031215613aa7575f80fd5b815161311481613136565b63ffffffff8181168382160190808211156124615761246161371a565b5f8085851115613add575f80fd5b83861115613ae9575f80fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015613b1e5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215613b3c575f80fd5b8735613b4781612fa2565b96506020880135613b5781612fa2565b9550604088013594506060880135935060808801356131a181613136565b5f805f805f805f80610100898b031215613b8d575f80fd5b8835613b9881612fa2565b97506020890135613ba881612fa2565b965060408901359550606089013594506080890135613bc681612fee565b935060a0890135613bd681613136565b979a969950949793969295929450505060c08201359160e0013590565b600181815b80851115613c2d57815f1904821115613c1357613c1361371a565b80851615613c2057918102915b93841c9390800290613bf8565b509250929050565b5f82613c43575060016106ca565b81613c4f57505f6106ca565b8160018114613c655760028114613c6f57613c8b565b60019150506106ca565b60ff841115613c8057613c8061371a565b50506001821b6106ca565b5060208310610133831016604e8410600b8410161715613cae575081810a6106ca565b613cb88383613bf3565b805f1904821115613ccb57613ccb61371a565b029392505050565b5f6131148383613c35565b634e487b7160e01b5f52600160045260245ffd5b5f60208284031215613d02575f80fd5b815167ffffffffffffffff811115613d18575f80fd5b8201601f81018413613d28575f80fd5b8051613d366132e1826132ad565b818152856020838501011115613d4a575f80fd5b613d5b8260208301602086016130b5565b95945050505050565b5f60208284031215613d74575f80fd5b815161311481612fee56fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a2646970667358221220432f6d6b4446edbe1f73c19fd2115454d5c35d8b03b98a74fd46724151d7672264736f6c63430008140033" + }, + { + "contractName": "PolygonZkEVMBridge proxy", + "balance": "340282366920938463463374607431768211455", + "nonce": "1", + "address": "0x528e26b25a34a4A5d0dbDa1d57D318153d2ED582", + "bytecode": "0x60806040526004361061005d575f3560e01c80635c60da1b116100425780635c60da1b146100a65780638f283970146100e3578063f851a440146101025761006c565b80633659cfe6146100745780634f1ef286146100935761006c565b3661006c5761006a610116565b005b61006a610116565b34801561007f575f80fd5b5061006a61008e366004610854565b610130565b61006a6100a136600461086d565b610178565b3480156100b1575f80fd5b506100ba6101eb565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee575f80fd5b5061006a6100fd366004610854565b610228565b34801561010d575f80fd5b506100ba610255565b61011e610282565b61012e610129610359565b610362565b565b610138610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d8160405180602001604052805f8152505f6103bf565b50565b61016d610116565b610180610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101e3576101de8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250600192506103bf915050565b505050565b6101de610116565b5f6101f4610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610359565b905090565b610225610116565b90565b610230610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d816103e9565b5f61025e610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610380565b61028a610380565b73ffffffffffffffffffffffffffffffffffffffff16330361012e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b5f61021861044a565b365f80375f80365f845af43d5f803e80801561037c573d5ff35b3d5ffd5b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b6103c883610471565b5f825111806103d45750805b156101de576103e383836104bd565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f610412610380565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a161016d816104e9565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103a3565b61047a816105f5565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606104e28383604051806060016040528060278152602001610977602791396106c0565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811661058c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610350565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b73ffffffffffffffffffffffffffffffffffffffff81163b610699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610350565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105af565b60605f808573ffffffffffffffffffffffffffffffffffffffff16856040516106e9919061090b565b5f60405180830381855af49150503d805f8114610721576040519150601f19603f3d011682016040523d82523d5f602084013e610726565b606091505b509150915061073786838387610741565b9695505050505050565b606083156107d65782515f036107cf5773ffffffffffffffffffffffffffffffffffffffff85163b6107cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610350565b50816107e0565b6107e083836107e8565b949350505050565b8151156107f85781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103509190610926565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f575f80fd5b919050565b5f60208284031215610864575f80fd5b6104e28261082c565b5f805f6040848603121561087f575f80fd5b6108888461082c565b9250602084013567ffffffffffffffff808211156108a4575f80fd5b818601915086601f8301126108b7575f80fd5b8135818111156108c5575f80fd5b8760208285010111156108d6575f80fd5b6020830194508093505050509250925092565b5f5b838110156109035781810151838201526020016108eb565b50505f910152565b5f825161091c8184602087016108e9565b9190910192915050565b602081525f82518060208401526109448160408501602087016108e9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212202ac98acbfbb3d3ac1b74050e18c4e76db25a3ff2801ec69bf85d0c61414d502b64736f6c63430008140033", + "storage": { + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x00000000000000000000000085ceb41028b1a5ed2b88e395145344837308b251", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000008bd36ca1a55e389335004872aa3c3be0969d3aa7" + } + }, + { + "contractName": "PolygonZkEVMGlobalExitRootL2 implementation", + "balance": "0", + "nonce": "1", + "address": "0x282a631D9F3Ef04Bf1A44B4C9e8bDC8EB278917f", + "bytecode": "0x608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301fd90441461004e578063257b36321461006a57806333d6247d14610089578063a3c573eb1461009e575b5f80fd5b61005760015481565b6040519081526020015b60405180910390f35b61005761007836600461015e565b5f6020819052908152604090205481565b61009c61009736600461015e565b6100ea565b005b6100c57f000000000000000000000000528e26b25a34a4a5d0dbda1d57d318153d2ed58281565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610061565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000528e26b25a34a4a5d0dbda1d57d318153d2ed5821614610159576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b5f6020828403121561016e575f80fd5b503591905056fea26469706673582212205108c6c4f924146b736832a1bdf696e20d900450207b7452462368d150f2c71c64736f6c63430008140033" + }, + { + "contractName": "PolygonZkEVMGlobalExitRootL2 proxy", + "balance": "0", + "nonce": "1", + "address": "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa", + "bytecode": "0x60806040523661001357610011610017565b005b6100115b61001f6101b7565b6001600160a01b0316336001600160a01b0316141561016f5760606001600160e01b031960003516631b2ce7f360e11b8114156100655761005e6101ea565b9150610167565b6001600160e01b0319811663278f794360e11b14156100865761005e610241565b6001600160e01b031981166308f2839760e41b14156100a75761005e610287565b6001600160e01b031981166303e1469160e61b14156100c85761005e6102b8565b6001600160e01b03198116635c60da1b60e01b14156100e95761005e6102f8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b61017761030c565b565b606061019e83836040518060600160405280602781526020016108576027913961031c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101f4610394565b600061020336600481846106a2565b81019061021091906106e8565b905061022d8160405180602001604052806000815250600061039f565b505060408051602081019091526000815290565b606060008061025336600481846106a2565b8101906102609190610719565b915091506102708282600161039f565b604051806020016040528060008152509250505090565b6060610291610394565b60006102a036600481846106a2565b8101906102ad91906106e8565b905061022d816103cb565b60606102c2610394565b60006102cc6101b7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b6060610302610394565b60006102cc610422565b610177610317610422565b610431565b6060600080856001600160a01b0316856040516103399190610807565b600060405180830381855af49150503d8060008114610374576040519150601f19603f3d011682016040523d82523d6000602084013e610379565b606091505b509150915061038a86838387610455565b9695505050505050565b341561017757600080fd5b6103a8836104d3565b6000825111806103b55750805b156103c6576103c48383610179565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103f46101b7565b604080516001600160a01b03928316815291841660208301520160405180910390a161041f81610513565b50565b600061042c6105bc565b905090565b3660008037600080366000845af43d6000803e808015610450573d6000f35b3d6000fd5b606083156104c15782516104ba576001600160a01b0385163b6104ba5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161015e565b50816104cb565b6104cb83836105e4565b949350505050565b6104dc8161060e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105785760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161015e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101db565b8151156105f45781518083602001fd5b8060405162461bcd60e51b815260040161015e9190610823565b6001600160a01b0381163b61067b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161015e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61059b565b600080858511156106b257600080fd5b838611156106bf57600080fd5b5050820193919092039150565b80356001600160a01b03811681146106e357600080fd5b919050565b6000602082840312156106fa57600080fd5b61019e826106cc565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561072c57600080fd5b610735836106cc565b9150602083013567ffffffffffffffff8082111561075257600080fd5b818501915085601f83011261076657600080fd5b81358181111561077857610778610703565b604051601f8201601f19908116603f011681019083821181831017156107a0576107a0610703565b816040528281528860208487010111156107b957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107f65781810151838201526020016107de565b838111156103c45750506000910152565b600082516108198184602087016107db565b9190910192915050565b60208152600082518060208401526108428160408501602087016107db565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122012bb4f564f73959a03513dc74fc3c6e40e8386e6f02c16b78d6db00ce0aa16af64736f6c63430008090033", + "storage": { + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x00000000000000000000000085ceb41028b1a5ed2b88e395145344837308b251", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x000000000000000000000000282a631d9f3ef04bf1a44b4c9e8bdc8eb278917f" + } + }, + { + "contractName": "PolygonZkEVMTimelock", + "balance": "0", + "nonce": "1", + "address": "0xdbC6981a11fc2B000c635bFA7C47676b25C87D39", + "bytecode": "0x6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220e28ae7494480ab1c619fd775dc5ff665588c808a910d66178a982c2e7c76a1e664736f6c63430008140033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000e10", + "0xf587dde6f8846415188f807710a3304f72092565918b30307d60efdc8014f20b": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x07020fe9de9b8274d1e6cc0668a6f6344a870f35e5a847590c8069dfa85ac78f": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x64494413541ff93b31aa309254e3fed72a7456e9845988b915b4c7a7ceba8814": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0xc8e266e0814671642b74f3807affd27009fcc23f713ea92d1743e0ee0c1e7603": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x3412d5605ac6cd444957cedb533e5dacad6378b4bc819ebe3652188a665066d6": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x9b3efc411c5f69533db363941e091f6f3af8b7e306525413577a56d27e5dbe73": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d706a": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0xa2001bdd6a5944149e83176d089ee9a8246bd56aecf38fe4d6c66f5fbac18675": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xc3ad33e20b0c56a223ad5104fff154aa010f8715b9c981fd38fdc60a4d1a52fc": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5" + } + }, + { + "accountName": "keyless Deployer", + "balance": "0", + "nonce": "1", + "address": "0x1754175c450BEbB9B6E14dEe542649c0402A25d2" + }, + { + "accountName": "deployer", + "balance": "0", + "nonce": "8", + "address": "0xff6250d0E86A2465B0C1bF8e36409503d6a26963" + } + ] + } \ No newline at end of file diff --git a/tools/addRollupType/add_rollup_type.json b/tools/addRollupType/add_rollup_type.json index 115b5187b..44d25ae24 100644 --- a/tools/addRollupType/add_rollup_type.json +++ b/tools/addRollupType/add_rollup_type.json @@ -10,7 +10,6 @@ "rollupCompatibilityID": 0, "timelockDelay": 864000, "timelockSalt": "", - "gasTokenAddress":"", "deployerPvtKey": "", "maxFeePerGas":"", "maxPriorityFeePerGas":"", diff --git a/tools/addRollupType/add_rollup_type.json.example b/tools/addRollupType/add_rollup_type.json.example index 7c6d09922..44d25ae24 100644 --- a/tools/addRollupType/add_rollup_type.json.example +++ b/tools/addRollupType/add_rollup_type.json.example @@ -1,14 +1,14 @@ { - "consensusContract": "PolygonZkEVMEtrog", + "consensusContract": "PolygonValidiumEtrog", "polygonRollupManagerAddress": "0x5132A183E9F3CB7C848b0AAC5Ae0c4f0491B7aB2", "polygonZkEVMBridgeAddress": "0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe", "polygonZkEVMGlobalExitRootAddress": "0x580bda1e7A0CFAe92Fa7F6c20A3794F169CE3CFb", "polTokenAddress": "0x455e53CBB86018Ac2B8092FdCd39d8444aFFC3F6", "verifierAddress": "0x1C3A3da552b8662CD69538356b1E7c2E9CC1EBD8", - "description": "Type: zkEVM, Version: etrog, genesis: /ipfs/QmUXnRoPbUmZuEZCGyiHjEsoNcFVu3hLtSvhpnfBS2mAYU", + "description": "Type: Validium, Version: etrog, genesis: /ipfs/QmUXnRoPbUmZuEZCGyiHjEsoNcFVu3hLtSvhpnfBS2mAYU", "forkID": 7, "rollupCompatibilityID": 0, - "timelockDelay": 0, + "timelockDelay": 864000, "timelockSalt": "", "deployerPvtKey": "", "maxFeePerGas":"", From 8c2300238e283b155388492710bec1e38fb68da9 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Thu, 8 Feb 2024 23:22:38 +0100 Subject: [PATCH 220/230] update readme deployment v2 --- deployment/v2/4_createRollup.ts | 3 ++- deployment/v2/README.md | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/deployment/v2/4_createRollup.ts b/deployment/v2/4_createRollup.ts index fb5471f30..b45172256 100644 --- a/deployment/v2/4_createRollup.ts +++ b/deployment/v2/4_createRollup.ts @@ -64,7 +64,6 @@ async function main() { adminZkEVM, forkID, consensusContract, - dataAvailabilityProtocol, } = createRollupParameters; const supportedConensus = ["PolygonZkEVMEtrog", "PolygonValidiumEtrog"]; @@ -73,6 +72,8 @@ async function main() { throw new Error(`Consensus contract not supported, supported contracts are: ${supportedConensus}`); } + const dataAvailabilityProtocol = createRollupParameters.dataAvailabilityProtocol || "PolygonDataCommittee"; + const supporteDataAvailabilityProtocols = ["PolygonDataCommittee"]; if ( diff --git a/deployment/v2/README.md b/deployment/v2/README.md index 62e1c68ed..7ad6e7cd7 100644 --- a/deployment/v2/README.md +++ b/deployment/v2/README.md @@ -87,6 +87,7 @@ A new folder will be created witth the following name `deployments/${network}_$( - `maxFeePerGas`:string, Set `maxFeePerGas`, must define aswell `maxPriorityFeePerGas` to use it - `maxPriorityFeePerGas`:string, Set `maxPriorityFeePerGas`, must define aswell `maxFeePerGas` to use it - `multiplierGas`: number, Gas multiplier with 3 decimals. If `maxFeePerGas` and `maxPriorityFeePerGas` are set, this will not take effect +- `dataAvailabilityProtocol`: string, Data availability protocol, only mandatory/used when consensus contract is a Validiums, currently the only supported value is: `PolygonDataCommittee` ## Notes From 2f2b75c85c049e823b714332bc304c6511d47c4f Mon Sep 17 00:00:00 2001 From: invocamanman Date: Fri, 9 Feb 2024 13:31:17 +0100 Subject: [PATCH 221/230] mini fix --- deployment/v2/4_createRollup.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deployment/v2/4_createRollup.ts b/deployment/v2/4_createRollup.ts index b45172256..1e11e317f 100644 --- a/deployment/v2/4_createRollup.ts +++ b/deployment/v2/4_createRollup.ts @@ -287,8 +287,8 @@ async function main() { await PolygonValidiumContract.setDataAvailabilityProtocol(polygonDataCommittee?.target as any) ).wait(); - // Setup data commitee to 0 - await (await polygonDataCommittee?.setupCommittee(0, [], "0x")).wait(); + // // Setup data commitee to 0 + // await (await polygonDataCommittee?.setupCommittee(0, [], "0x")).wait(); } else { await (await polygonDataCommittee?.transferOwnership(adminZkEVM)).wait(); } From 9958fb820fac5917ede2fc2a6ad89fe49e1ddcbe Mon Sep 17 00:00:00 2001 From: invocamanman Date: Sun, 11 Feb 2024 16:33:49 +0100 Subject: [PATCH 222/230] fix fork test --- .../deploy_output_mainnet.json | 22 +++ .../addRollupMainnet/testFork.ts | 148 ++++++++++++++++++ .../addRollupMainnet/upgrade_output.json | 7 + .../mainnet_1706364989/testFork.ts | 17 +- 4 files changed, 192 insertions(+), 2 deletions(-) create mode 100644 tools/addRollupType/addRollupMainnet/deploy_output_mainnet.json create mode 100644 tools/addRollupType/addRollupMainnet/testFork.ts create mode 100644 tools/addRollupType/addRollupMainnet/upgrade_output.json diff --git a/tools/addRollupType/addRollupMainnet/deploy_output_mainnet.json b/tools/addRollupType/addRollupMainnet/deploy_output_mainnet.json new file mode 100644 index 000000000..b26e1454d --- /dev/null +++ b/tools/addRollupType/addRollupMainnet/deploy_output_mainnet.json @@ -0,0 +1,22 @@ +{ + "polygonZkEVMAddress": "0x5132A183E9F3CB7C848b0AAC5Ae0c4f0491B7aB2", + "polygonZkEVMBridgeAddress": "0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe", + "polygonZkEVMGlobalExitRootAddress": "0x580bda1e7A0CFAe92Fa7F6c20A3794F169CE3CFb", + "maticTokenAddress": "0x7D1AfA7B718fb893dB30A3aBc0Cfc608AaCfeBB0", + "verifierAddress": "0x4F9A0e7FD2Bf6067db6994CF12E4495Df938E6e9", + "zkEVMDeployerContract": "0xCB19eDdE626906eB1EE52357a27F62dd519608C2", + "deployerAddress": "0x7c280C055CBf830F77D6DA3a6363e961E0B91C7d", + "timelockContractAddress": "0xEf1462451C30Ea7aD8555386226059Fe837CA4EF", + "deploymentBlockNumber": 16896721, + "genesisRoot": "0x3f86b09b43e3e49a41fc20a07579b79eba044253367817d5c241d23c0e2bc5c9", + "trustedSequencer": "0x148Ee7dAF16574cD020aFa34CC658f8F3fbd2800", + "trustedSequencerURL": "https://zkevm-rpc.com/", + "chainID": 1101, + "networkName": "polygon zkEVM", + "admin": "0x242daE44F5d8fb54B198D03a94dA45B5a4413e21", + "trustedAggregator": "0xdA87c4a76922598Ac0272F4D9503a35071D686eA", + "proxyAdminAddress": "0x0F99738B2Fc14D77308337f3e2596b63aE7BCC4A", + "forkID": 4, + "salt": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", + "version": "v1.1.0-fork.4" + } \ No newline at end of file diff --git a/tools/addRollupType/addRollupMainnet/testFork.ts b/tools/addRollupType/addRollupMainnet/testFork.ts new file mode 100644 index 000000000..218c63645 --- /dev/null +++ b/tools/addRollupType/addRollupMainnet/testFork.ts @@ -0,0 +1,148 @@ +/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if */ +/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */ +import {expect} from "chai"; +import path = require("path"); +import fs = require("fs"); + +import * as dotenv from "dotenv"; +dotenv.config({path: path.resolve(__dirname, "../../../.env")}); +import {ethers, upgrades} from "hardhat"; +import {PolygonRollupManager, PolygonZkEVMTimelock} from "../../../typechain-types"; + +import {takeSnapshot, time, reset, setBalance, setStorageAt} from "@nomicfoundation/hardhat-network-helpers"; + +const deployOutputParameters = require("./deploy_output_mainnet.json"); +const upgradeOutput = require("./upgrade_output.json"); +const addRollupTypeOutput = require("./add_rollup_type_output.json"); + +async function main() { + const polTokenAddress = "0x455e53CBB86018Ac2B8092FdCd39d8444aFFC3F6"; // mainnet address + const deployer = (await ethers.getSigners())[0]; + console.log("using signer: ", deployer.address); + + // hard fork + const rpc = `https://mainnet.infura.io/v3/${process.env.INFURA_PROJECT_ID}`; + await reset(rpc); + await setBalance(deployer.address, 100n ** 18n); + + // Get timelock multisig + const timelockMultisig = "0x242daE44F5d8fb54B198D03a94dA45B5a4413e21"; + await ethers.provider.send("hardhat_impersonateAccount", [timelockMultisig]); + const multisigSigner = await ethers.getSigner(timelockMultisig as any); + await setBalance(timelockMultisig, 100n ** 18n); + + const timelockContractFactory = await ethers.getContractFactory("PolygonZkEVMTimelock"); + const timelockContract = (await timelockContractFactory.attach( + deployOutputParameters.timelockContractAddress + )) as PolygonZkEVMTimelock; + + const timelockDelay = await timelockContract.getMinDelay(); + + const polygonZkEVMFactory = await ethers.getContractFactory("PolygonZkEVM"); + const polygonZkEVMContract = (await polygonZkEVMFactory.attach( + deployOutputParameters.polygonZkEVMAddress + )) as PolygonZkEVM; + + const lastBatchSequenced = await polygonZkEVMContract.lastBatchSequenced(); + + await setStorageAt(polygonZkEVMContract.target, 116, lastBatchSequenced); + + const lastBatchVerified = await polygonZkEVMContract.lastVerifiedBatch(); + console.log({lastBatchSequenced}); + console.log({lastBatchVerified}); + + await time.increase(timelockDelay); + + // Set storage slot + + // send mutlsig transaction + const txUpgrade = { + to: timelockContract.target, + data: upgradeOutput.executeData, + }; + + const receipt = await (await multisigSigner.sendTransaction(txUpgrade)).wait(); + + const RollupMangerFactory = await ethers.getContractFactory("PolygonRollupManager"); + const rollupManager = (await RollupMangerFactory.attach( + deployOutputParameters.polygonZkEVMAddress + )) as PolygonRollupManager; + + expect(await rollupManager.rollupCount()).to.be.equal(1); + + console.log("Contracts upgraded"); + + // Deploy a validium + const verifierAddress = upgradeOutput.verifierAddress; + + // send mutlsig transaction + const txAddRollupType = { + to: timelockContract.target, + data: addRollupTypeOutput.executeData, + }; + const receiptAddRollupType = await (await multisigSigner.sendTransaction(txAddRollupType)).wait(); + + expect(await rollupManager.rollupTypeCount()).to.be.equal(1); + + // Create new rollup + const chainID = 123213; + const txDeployRollup = await rollupManager.connect(multisigSigner).createNewRollup( + 1, // rollupType + chainID, + deployer.address, // admin + deployer.address, // sequencer + ethers.ZeroAddress, // gas token address + "trustedsequencer url", + "network name" + ); + + console.log("Validum added"); + + const receiptDeployRollup = (await txDeployRollup.wait()) as any; + expect(await rollupManager.rollupCount()).to.be.equal(2); + + // Update rollup to this type: this is just a test is NOT intended to update our zkevm to a validium + await ethers.provider.send("hardhat_impersonateAccount", [deployOutputParameters.timelockContractAddress]); + const tiemelockSigner = await ethers.getSigner(deployOutputParameters.timelockContractAddress as any); + await setBalance(deployOutputParameters.timelockContractAddress, 100n ** 18n); + const txUpdateRollup = await rollupManager.connect(tiemelockSigner).updateRollup( + upgradeOutput.newPolygonZKEVM, //new poylgon zkevm + 1, // new rollupTypeID + "0x" // upgradeData + ); + + const receiptUpdateRollup = (await txUpdateRollup.wait()) as any; + + const rollupDataFinal2 = await rollupManager.rollupIDToRollupData(2); + //expect(rollupDataFinal2.rollupContract).to.be.equal(upgradeOutput.newPolygonZKEVM); + expect(rollupDataFinal2.chainID).to.be.equal(chainID); + expect(rollupDataFinal2.verifier).to.be.equal(verifierAddress); + expect(rollupDataFinal2.forkID).to.be.equal(7); + expect(rollupDataFinal2.lastBatchSequenced).to.be.equal(1); + expect(rollupDataFinal2.lastVerifiedBatch).to.be.equal(0); + expect(rollupDataFinal2.lastPendingState).to.be.equal(0); + expect(rollupDataFinal2.lastPendingStateConsolidated).to.be.equal(0); + expect(rollupDataFinal2.lastVerifiedBatchBeforeUpgrade).to.be.equal(0); + expect(rollupDataFinal2.rollupTypeID).to.be.equal(1); + expect(rollupDataFinal2.rollupCompatibilityID).to.be.equal(0); + + const rollupDataFinal = await rollupManager.rollupIDToRollupData(1); + expect(rollupDataFinal.rollupContract).to.be.equal(upgradeOutput.newPolygonZKEVM); + expect(rollupDataFinal.chainID).to.be.equal(1101); + expect(rollupDataFinal.verifier).to.be.equal(verifierAddress); + expect(rollupDataFinal.forkID).to.be.equal(7); + expect(rollupDataFinal.lastBatchSequenced).to.be.equal(lastBatchSequenced + 1n); + expect(rollupDataFinal.lastVerifiedBatch).to.be.equal(lastBatchSequenced); + expect(rollupDataFinal.lastPendingState).to.be.equal(0); + expect(rollupDataFinal.lastPendingStateConsolidated).to.be.equal(0); + expect(rollupDataFinal.lastVerifiedBatchBeforeUpgrade).to.be.equal(lastBatchSequenced); + expect(rollupDataFinal.rollupTypeID).to.be.equal(1); + expect(rollupDataFinal.rollupCompatibilityID).to.be.equal(0); + + console.log("Updated zkevm Succedd"); +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/tools/addRollupType/addRollupMainnet/upgrade_output.json b/tools/addRollupType/addRollupMainnet/upgrade_output.json new file mode 100644 index 000000000..05fecdc24 --- /dev/null +++ b/tools/addRollupType/addRollupMainnet/upgrade_output.json @@ -0,0 +1,7 @@ +{ + "scheduleData": "0x8f2a0bb000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d2f0000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a0000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a0000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000004499a88ec4000000000000000000000000580bda1e7a0cfae92fa7f6c20a3794f169ce3cfb0000000000000000000000002e38cd55163137483e30580cb468c2dff1d8507700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004499a88ec40000000000000000000000002a3dd3eb832af982ec71669e178424b10dca2ede0000000000000000000000000feb850b183c57534b56b7d56520133c8f9bdb650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e49623609d0000000000000000000000005132a183e9f3cb7c848b0aac5ae0c4f0491b7ab20000000000000000000000003b82da772c825283d85d5d6717a77c6ff582053b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001440645af090000000000000000000000006329fe417621925c81c16f9f9a18c203c21af7ab00000000000000000000000000000000000000000000000000000000000697800000000000000000000000000000000000000000000000000000000000069780000000000000000000000000242dae44f5d8fb54b198d03a94da45b5a4413e21000000000000000000000000ef1462451c30ea7ad8555386226059fe837ca4ef00000000000000000000000037c58dfa7bf0a165c5aaeddf3e2edb475ac6dcb6000000000000000000000000519e42c24163192dca44cd3fbdcebf6be91309870000000000000000000000001c3a3da552b8662cd69538356b1e7c2e9cc1ebd80000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000044d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "executeData": "0xe38335e500000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a0000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a0000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000004499a88ec4000000000000000000000000580bda1e7a0cfae92fa7f6c20a3794f169ce3cfb0000000000000000000000002e38cd55163137483e30580cb468c2dff1d8507700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004499a88ec40000000000000000000000002a3dd3eb832af982ec71669e178424b10dca2ede0000000000000000000000000feb850b183c57534b56b7d56520133c8f9bdb650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e49623609d0000000000000000000000005132a183e9f3cb7c848b0aac5ae0c4f0491b7ab20000000000000000000000003b82da772c825283d85d5d6717a77c6ff582053b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001440645af090000000000000000000000006329fe417621925c81c16f9f9a18c203c21af7ab00000000000000000000000000000000000000000000000000000000000697800000000000000000000000000000000000000000000000000000000000069780000000000000000000000000242dae44f5d8fb54b198d03a94da45b5a4413e21000000000000000000000000ef1462451c30ea7ad8555386226059fe837ca4ef00000000000000000000000037c58dfa7bf0a165c5aaeddf3e2edb475ac6dcb6000000000000000000000000519e42c24163192dca44cd3fbdcebf6be91309870000000000000000000000001c3a3da552b8662cd69538356b1e7c2e9cc1ebd80000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000044d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "verifierAddress": "0x1C3A3da552b8662CD69538356b1E7c2E9CC1EBD8", + "newPolygonZKEVM": "0x519E42c24163192Dca44CD3fBDCEBF6be9130987", + "timelockContractAdress": "0xEf1462451C30Ea7aD8555386226059Fe837CA4EF" +} \ No newline at end of file diff --git a/upgrade/upgradeToV2/mainnet_1706364989/testFork.ts b/upgrade/upgradeToV2/mainnet_1706364989/testFork.ts index 4725c6355..ebd01c9bd 100644 --- a/upgrade/upgradeToV2/mainnet_1706364989/testFork.ts +++ b/upgrade/upgradeToV2/mainnet_1706364989/testFork.ts @@ -131,12 +131,25 @@ async function main() { const receiptUpdateRollup = (await txUpdateRollup.wait()) as any; + const rollupDataFinal2 = await rollupManager.rollupIDToRollupData(2); + //expect(rollupDataFinal2.rollupContract).to.be.equal(upgradeOutput.newPolygonZKEVM); + expect(rollupDataFinal2.chainID).to.be.equal(chainID); + expect(rollupDataFinal2.verifier).to.be.equal(verifierAddress); + expect(rollupDataFinal2.forkID).to.be.equal(7); + expect(rollupDataFinal2.lastBatchSequenced).to.be.equal(1); + expect(rollupDataFinal2.lastVerifiedBatch).to.be.equal(0); + expect(rollupDataFinal2.lastPendingState).to.be.equal(0); + expect(rollupDataFinal2.lastPendingStateConsolidated).to.be.equal(0); + expect(rollupDataFinal2.lastVerifiedBatchBeforeUpgrade).to.be.equal(0); + expect(rollupDataFinal2.rollupTypeID).to.be.equal(1); + expect(rollupDataFinal2.rollupCompatibilityID).to.be.equal(0); + const rollupDataFinal = await rollupManager.rollupIDToRollupData(1); expect(rollupDataFinal.rollupContract).to.be.equal(upgradeOutput.newPolygonZKEVM); expect(rollupDataFinal.chainID).to.be.equal(1101); expect(rollupDataFinal.verifier).to.be.equal(verifierAddress); - expect(rollupDataFinal.forkID).to.be.equal(3); - expect(rollupDataFinal.lastBatchSequenced).to.be.equal(lastBatchSequenced); + expect(rollupDataFinal.forkID).to.be.equal(7); + expect(rollupDataFinal.lastBatchSequenced).to.be.equal(lastBatchSequenced + 1n); expect(rollupDataFinal.lastVerifiedBatch).to.be.equal(lastBatchSequenced); expect(rollupDataFinal.lastPendingState).to.be.equal(0); expect(rollupDataFinal.lastPendingStateConsolidated).to.be.equal(0); From 11468f1b249c2ffa00b48a96227804b7fd751d57 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Mon, 12 Feb 2024 13:20:00 +0100 Subject: [PATCH 223/230] further checks --- hardhat.config.ts | 8 +-- .../mainnet_1706364989/testFork.ts | 56 +++++++++++++++++++ 2 files changed, 60 insertions(+), 4 deletions(-) diff --git a/hardhat.config.ts b/hardhat.config.ts index 42b6c9a73..17f2358f1 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -216,7 +216,7 @@ const config: HardhatUserConfig = { }, }, polygonZKEVMTestnet: { - url: "https://rpc.public.zkevm-test.net", + url: "https://rpc.cardona.zkevm-rpc.com", accounts: { mnemonic: process.env.MNEMONIC || DEFAULT_MNEMONIC, path: "m/44'/60'/0'/0", @@ -268,10 +268,10 @@ const config: HardhatUserConfig = { }, { network: "polygonZKEVMTestnet", - chainId: 1442, + chainId: 2442, urls: { - apiURL: "https://api-testnet-zkevm.polygonscan.com/api", - browserURL: "https://testnet-zkevm.polygonscan.com/", + apiURL: "https://explorer-ui.cardona.zkevm-rpc.com/api", + browserURL: "https://explorer-ui.cardona.zkevm-rpc.com", }, }, { diff --git a/upgrade/upgradeToV2/mainnet_1706364989/testFork.ts b/upgrade/upgradeToV2/mainnet_1706364989/testFork.ts index ebd01c9bd..d6df02d28 100644 --- a/upgrade/upgradeToV2/mainnet_1706364989/testFork.ts +++ b/upgrade/upgradeToV2/mainnet_1706364989/testFork.ts @@ -44,6 +44,8 @@ async function main() { )) as PolygonZkEVM; const lastBatchSequenced = await polygonZkEVMContract.lastBatchSequenced(); + const emergencyCouncilAddress = await polygonZkEVMContract.owner(); + const trustedAggregator = await polygonZkEVMContract.trustedAggregator(); await setStorageAt(polygonZkEVMContract.target, 116, lastBatchSequenced); @@ -158,6 +160,60 @@ async function main() { expect(rollupDataFinal.rollupCompatibilityID).to.be.equal(0); console.log("Updated zkevm Succedd"); + + //roles + const DEFAULT_ADMIN_ROLE = ethers.ZeroHash; + const ADD_ROLLUP_TYPE_ROLE = ethers.id("ADD_ROLLUP_TYPE_ROLE"); + const OBSOLETE_ROLLUP_TYPE_ROLE = ethers.id("OBSOLETE_ROLLUP_TYPE_ROLE"); + const CREATE_ROLLUP_ROLE = ethers.id("CREATE_ROLLUP_ROLE"); + const ADD_EXISTING_ROLLUP_ROLE = ethers.id("ADD_EXISTING_ROLLUP_ROLE"); + const UPDATE_ROLLUP_ROLE = ethers.id("UPDATE_ROLLUP_ROLE"); + const TRUSTED_AGGREGATOR_ROLE = ethers.id("TRUSTED_AGGREGATOR_ROLE"); + const TRUSTED_AGGREGATOR_ROLE_ADMIN = ethers.id("TRUSTED_AGGREGATOR_ROLE_ADMIN"); + const TWEAK_PARAMETERS_ROLE = ethers.id("TWEAK_PARAMETERS_ROLE"); + const SET_FEE_ROLE = ethers.id("SET_FEE_ROLE"); + const STOP_EMERGENCY_ROLE = ethers.id("STOP_EMERGENCY_ROLE"); + const EMERGENCY_COUNCIL_ROLE = ethers.id("EMERGENCY_COUNCIL_ROLE"); + const EMERGENCY_COUNCIL_ADMIN = ethers.id("EMERGENCY_COUNCIL_ADMIN"); + + expect(await rollupManager.globalExitRootManager()).to.be.equal( + deployOutputParameters.polygonZkEVMGlobalExitRootAddress + ); + expect(await rollupManager.pol()).to.be.equal(polTokenAddress); + expect(await rollupManager.bridgeAddress()).to.be.equal(deployOutputParameters.polygonZkEVMBridgeAddress); + + expect(await rollupManager.pendingStateTimeout()).to.be.equal(deployParameters.pendingStateTimeout); + expect(await rollupManager.trustedAggregatorTimeout()).to.be.equal(deployParameters.trustedAggregatorTimeout); + + expect(await rollupManager.getBatchFee()).to.be.equal(ethers.parseEther("0.1")); + expect(await rollupManager.getForcedBatchFee()).to.be.equal(ethers.parseEther("10")); + expect(await rollupManager.calculateRewardPerBatch()).to.be.equal(0); + + // Check roles + expect(await rollupManager.hasRole(DEFAULT_ADMIN_ROLE, deployOutputParameters.timelockContractAddress)).to.be.equal( + true + ); + expect( + await rollupManager.hasRole(ADD_ROLLUP_TYPE_ROLE, deployOutputParameters.timelockContractAddress) + ).to.be.equal(true); + expect(await rollupManager.hasRole(UPDATE_ROLLUP_ROLE, deployOutputParameters.timelockContractAddress)).to.be.equal( + true + ); + expect( + await rollupManager.hasRole(ADD_EXISTING_ROLLUP_ROLE, deployOutputParameters.timelockContractAddress) + ).to.be.equal(true); + + expect(await rollupManager.hasRole(TRUSTED_AGGREGATOR_ROLE, trustedAggregator)).to.be.equal(true); + + expect(await rollupManager.hasRole(OBSOLETE_ROLLUP_TYPE_ROLE, deployParameters.admin)).to.be.equal(true); + expect(await rollupManager.hasRole(CREATE_ROLLUP_ROLE, deployParameters.admin)).to.be.equal(true); + expect(await rollupManager.hasRole(TRUSTED_AGGREGATOR_ROLE_ADMIN, deployParameters.admin)).to.be.equal(true); + expect(await rollupManager.hasRole(TWEAK_PARAMETERS_ROLE, deployParameters.admin)).to.be.equal(true); + expect(await rollupManager.hasRole(SET_FEE_ROLE, deployParameters.admin)).to.be.equal(true); + expect(await rollupManager.hasRole(STOP_EMERGENCY_ROLE, deployParameters.admin)).to.be.equal(true); + + expect(await rollupManager.hasRole(EMERGENCY_COUNCIL_ROLE, emergencyCouncilAddress)).to.be.equal(true); + expect(await rollupManager.hasRole(EMERGENCY_COUNCIL_ADMIN, emergencyCouncilAddress)).to.be.equal(true); } main().catch((e) => { From 880a4e84688eee6b22f893afce47a7331d9c9d65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Masip?= Date: Thu, 15 Feb 2024 18:30:15 +0100 Subject: [PATCH 224/230] Updating the Rollup Manager --- docs/v2/PolygonRollupManager.md | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/docs/v2/PolygonRollupManager.md b/docs/v2/PolygonRollupManager.md index a4d987575..9b06af222 100644 --- a/docs/v2/PolygonRollupManager.md +++ b/docs/v2/PolygonRollupManager.md @@ -1,4 +1,7 @@ -Contract responsible for managing the exit roots across multiple Rollups +Contract responsible for managing rollups and the verification of their batches. +This contract will create and update rollups and store all the hashed sequenced data from them. +The logic for sequence batches is moved to the `consensus` contracts, while the verification of all of +them will be done in this one. In this way, the proof aggregation of the rollups will be easier on a close future. ## Functions @@ -39,7 +42,7 @@ Contract responsible for managing the exit roots across multiple Rollups #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`trustedAggregator` | address | Trusted aggregatot address +|`trustedAggregator` | address | Trusted aggregator address |`_pendingStateTimeout` | uint64 | Pending state timeout |`_trustedAggregatorTimeout` | uint64 | Trusted aggregator timeout |`admin` | address | Admin of the rollup manager @@ -238,7 +241,7 @@ Allows an aggregator to verify multiple batches bytes32[24] proof ) external ``` -Allows an aggregator to verify multiple batches +Allows a trusted aggregator to verify multiple batches #### Parameters: @@ -262,7 +265,8 @@ Allows an aggregator to verify multiple batches uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, - address proof + address beneficiary, + bytes32[24] proof ) internal ``` Verify and reward batches internal function @@ -277,7 +281,8 @@ Verify and reward batches internal function |`finalNewBatch` | uint64 | Last batch aggregator intends to verify |`newLocalExitRoot` | bytes32 | New local exit root once the batch is processed |`newStateRoot` | bytes32 | New State root once the batch is processed -|`proof` | address | Fflonk proof +|`beneficiary` | address | Address that will receive the verification reward +|`proof` | bytes32[24] | Fflonk proof ### _tryConsolidatePendingState ```solidity @@ -364,7 +369,7 @@ if it's possible to prove a different state root given the same batches bytes32[24] proof ) external ``` -Allows to halt the PolygonZkEVM if its possible to prove a different state root given the same batches +Allows activate the emergency state if its possible to prove a different state root given the same batches #### Parameters: @@ -427,7 +432,7 @@ The batch fee will not be updated when the trusted aggregator verifies batches function activateEmergencyState( ) external ``` -Function to activate emergency state, which also enables the emergency mode on both PolygonZkEVM and PolygonZkEVMBridge contracts +Function to activate emergency state, which also enables the emergency mode on both PolygonRollupManager and PolygonZkEVMBridge contracts If not called by the owner must not have been aggregated in a _HALT_AGGREGATION_TIMEOUT period and an emergency state was not happened in the same period @@ -437,7 +442,7 @@ If not called by the owner must not have been aggregated in a _HALT_AGGREGATION_ function deactivateEmergencyState( ) external ``` -Function to deactivate emergency state on both PolygonZkEVM and PolygonZkEVMBridge contracts +Function to deactivate emergency state on both PolygonRollupManager and PolygonZkEVMBridge contracts @@ -446,7 +451,7 @@ Function to deactivate emergency state on both PolygonZkEVM and PolygonZkEVMBrid function _activateEmergencyState( ) internal ``` -Internal function to activate emergency state on both PolygonZkEVM and PolygonZkEVMBridge contracts +Internal function to activate emergency state on both PolygonRollupManager and PolygonZkEVMBridge contracts From 2151a787b4fc535db7e8c0525bb39ad10be6276f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Masip?= Date: Thu, 15 Feb 2024 18:30:30 +0100 Subject: [PATCH 225/230] Updating the zkEVM Bridge V2 --- docs/v2/PolygonZkEVMBridgeV2.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/docs/v2/PolygonZkEVMBridgeV2.md b/docs/v2/PolygonZkEVMBridgeV2.md index d6c70a974..c42e14a56 100644 --- a/docs/v2/PolygonZkEVMBridgeV2.md +++ b/docs/v2/PolygonZkEVMBridgeV2.md @@ -1,4 +1,4 @@ -PolygonZkEVMBridge that will be deployed on both networks Ethereum and Polygon zkEVM +PolygonZkEVMBridge that will be deployed on Ethereum and all Polygon rollups Contract responsible to manage the token interactions with other networks @@ -19,12 +19,14 @@ Disable initalizers on the implementation following the best practices address _gasTokenAddress, uint32 _gasTokenNetwork, contract IBasePolygonZkEVMGlobalExitRoot _globalExitRootManager, - address _polygonRollupManager + address _polygonRollupManager, + bytes _gasTokenMetadata ) external ``` The value of `_polygonRollupManager` on the L2 deployment of the contract will be address(0), so emergency state is not possible for the L2 deployment of the bridge, intentionally + #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | @@ -33,7 +35,7 @@ emergency state is not possible for the L2 deployment of the bridge, intentional |`_gasTokenNetwork` | uint32 | gas token network |`_globalExitRootManager` | contract IBasePolygonZkEVMGlobalExitRoot | global exit root manager address |`_polygonRollupManager` | address | polygonZkEVM address - +|`_gasTokenMetadata` | bytes | Abi encoded gas token metadata ### bridgeAsset ```solidity @@ -152,8 +154,8 @@ Verify merkle proof and withdraw tokens/ether #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`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 +|`smtProofLocalExitRoot` | bytes32[32] | Smt proof to proof the leaf against the network exit root +|`smtProofRollupExitRoot` | bytes32[32] | Smt proof to proof the rollupLocalExitRoot against the rollups exit root |`globalIndex` | uint256 | Global index is defined as: | 191 bits | 1 bit | 32 bits | 32 bits | | 0 | mainnetFlag | rollupIndex | localRootIndex | @@ -195,8 +197,8 @@ will not trigger any execution #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`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 +|`smtProofLocalExitRoot` | bytes32[32] | Smt proof to proof the leaf against the exit root +|`smtProofRollupExitRoot` | bytes32[32] | Smt proof to proof the rollupLocalExitRoot against the rollups exit root |`globalIndex` | uint256 | Global index is defined as: | 191 bits | 1 bit | 32 bits | 32 bits | | 0 | mainnetFlag | rollupIndex | localRootIndex | From bdd888caada1ca2f8ccce73e6e47ae9d289614c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Masip?= Date: Thu, 15 Feb 2024 18:30:44 +0100 Subject: [PATCH 226/230] Updating the zkEVM Global Exit Root V2 --- docs/v2/PolygonZkEVMGlobalExitRootV2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/v2/PolygonZkEVMGlobalExitRootV2.md b/docs/v2/PolygonZkEVMGlobalExitRootV2.md index 12d927980..fa0378498 100644 --- a/docs/v2/PolygonZkEVMGlobalExitRootV2.md +++ b/docs/v2/PolygonZkEVMGlobalExitRootV2.md @@ -14,7 +14,7 @@ Contract responsible for managing the exit roots across multiple networks #### Parameters: | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | -|`_rollupManager` | address | Rollup contract address +|`_rollupManager` | address | Rollup manager contract address |`_bridgeAddress` | address | PolygonZkEVMBridge contract address ### updateExitRoot From 860a3d5a99af7eb01de1c14e4749492c22540dba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Masip?= Date: Thu, 15 Feb 2024 18:31:04 +0100 Subject: [PATCH 227/230] Updating the Validium of etrog --- docs/v2/consensus/validium/PolygonValidiumEtrog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/v2/consensus/validium/PolygonValidiumEtrog.md b/docs/v2/consensus/validium/PolygonValidiumEtrog.md index 98f51394b..a29b828a0 100644 --- a/docs/v2/consensus/validium/PolygonValidiumEtrog.md +++ b/docs/v2/consensus/validium/PolygonValidiumEtrog.md @@ -4,6 +4,7 @@ Any user can force some transaction and the sequencer will have a timeout to add 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. +It is advised to use timelocks for the admin address in case of Validium since if can change the dataAvailabilityProtocol ## Functions From 27a3c272c33122a885aa82cd0e597877a629d7c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Masip?= Date: Thu, 15 Feb 2024 18:31:19 +0100 Subject: [PATCH 228/230] Updating the Rollup Base of etrog --- docs/v2/lib/PolygonRollupBaseEtrog.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/v2/lib/PolygonRollupBaseEtrog.md b/docs/v2/lib/PolygonRollupBaseEtrog.md index eea8dc792..bbd1b2703 100644 --- a/docs/v2/lib/PolygonRollupBaseEtrog.md +++ b/docs/v2/lib/PolygonRollupBaseEtrog.md @@ -64,7 +64,7 @@ Allows a sequencer to send multiple batches | Name | Type | Description | | :--- | :--- | :------------------------------------------------------------------- | |`batches` | struct PolygonRollupBaseEtrog.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+ +|`l2Coinbase` | address | Address that will receive the fees from L2 note Pol is not a reentrant token ### onVerifyBatches @@ -215,7 +215,8 @@ Function to calculate the reward for a forced batch function generateInitializeTransaction( uint32 networkID, address _gasTokenAddress, - uint32 _gasTokenNetwork + uint32 _gasTokenNetwork, + bytes _gasTokenMetadata ) public returns (bytes) ``` Generate Initialize transaction for hte bridge on L2 @@ -227,6 +228,7 @@ Generate Initialize transaction for hte bridge on L2 |`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 +|`_gasTokenMetadata` | bytes | Abi encoded gas token metadata ## Events ### SequenceBatches From 311be35a565745df92669f51b8a509e65e3ba4ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Masip?= Date: Thu, 15 Feb 2024 18:32:20 +0100 Subject: [PATCH 229/230] Adding the Rollup Manager doc --- .../PolygonRollupManagerNotUpgraded.md | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 docs/v2/newDeployments/PolygonRollupManagerNotUpgraded.md diff --git a/docs/v2/newDeployments/PolygonRollupManagerNotUpgraded.md b/docs/v2/newDeployments/PolygonRollupManagerNotUpgraded.md new file mode 100644 index 000000000..dd333a250 --- /dev/null +++ b/docs/v2/newDeployments/PolygonRollupManagerNotUpgraded.md @@ -0,0 +1,30 @@ +PolygonRollupManager Test + + +## Functions +### constructor +```solidity + function constructor( + contract IPolygonZkEVMGlobalExitRootV2 _globalExitRootManager, + contract IERC20Upgradeable _pol, + contract IPolygonZkEVMBridge _bridgeAddress + ) public +``` + + +#### Parameters: +| Name | Type | Description | +| :--- | :--- | :------------------------------------------------------------------- | +|`_globalExitRootManager` | contract IPolygonZkEVMGlobalExitRootV2 | Global exit root manager address +|`_pol` | contract IERC20Upgradeable | MATIC token address +|`_bridgeAddress` | contract IPolygonZkEVMBridge | Bridge address + +### initialize +```solidity + function initialize( + ) external +``` + + + + From 9bdff27e98bdbf4d8e3a6a485da5bfe65e82f948 Mon Sep 17 00:00:00 2001 From: invocamanman Date: Tue, 20 Feb 2024 15:16:31 +0100 Subject: [PATCH 230/230] udpate readme --- README.md | 78 ++++++++++++++++++++++++++----------------------------- 1 file changed, 37 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index 2f6aecf07..37e39cb9d 100644 --- a/README.md +++ b/README.md @@ -1,35 +1,33 @@ # zkevm-contracts -Smart contract implementation which will be used by the polygon-hermez zkevm +Smart contract implementation which will be used by the polygon zkevm [![Main CI](https://github.com/0xPolygonHermez/zkevm-contracts/actions/workflows/main.yml/badge.svg)](https://github.com/0xPolygonHermez/zkevm-contracts/actions/workflows/main.yml) -## Note - -Private keys and mnemonics contained in this repository are used for internal test exclusively. Do not use them in production environments - -## Requirements +## Mainnet Contracts: -- node version: 16.x -- npm version: 7.x +| Contract Name | Address | +| ---------------------------- | --------------------------------------------------------------------------------------------------------------------- | +| PolygonRollupManager | [0x5132A183E9F3CB7C848b0AAC5Ae0c4f0491B7aB2](https://etherscan.io/address/0x5132A183E9F3CB7C848b0AAC5Ae0c4f0491B7aB2) | +| PolygonZkEVMBridgeV2 | [0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe](https://etherscan.io/address/0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe) | +| PolygonZkEVMGlobalExitRootV2 | [0x580bda1e7A0CFAe92Fa7F6c20A3794F169CE3CFb](https://etherscan.io/address/0x580bda1e7A0CFAe92Fa7F6c20A3794F169CE3CFb) | +| FflonkVerifier | [0x4F9A0e7FD2Bf6067db6994CF12E4495Df938E6e9](https://etherscan.io/address/0x4F9A0e7FD2Bf6067db6994CF12E4495Df938E6e9) | +| PolygonZkEVMDeployer | [0xCB19eDdE626906eB1EE52357a27F62dd519608C2](https://etherscan.io/address/0xCB19eDdE626906eB1EE52357a27F62dd519608C2) | +| PolygonZkEVMTimelock | [0xEf1462451C30Ea7aD8555386226059Fe837CA4EF](https://etherscan.io/address/0xEf1462451C30Ea7aD8555386226059Fe837CA4EF) | -## Repository structure +## zkEVM Contracts: -- `contracts`: zkevm contracts - - `PolygonZkEVMBridge.sol`: transfer assets between chains - - `PolygonZkEVMGlobalExitRoot.sol`: manage global exit root in L1 - - `PolygonZkEVMGlobalExitRootL2.sol`: manage global exit root in L2 - - `PolygonZkEVM.sol`: consensus algorithm used by polygon hermez zkevm -- `docs`: specs and useful links -- `test`: contracts tests +| Contract Name | Address | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------ | +| PolygonZkEVMBridgeV2 | [0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe](https://zkevm.polygonscan.com/address/0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe) | +| PolygonZkEVMTimelock | [0xBBa0935Fa93Eb23de7990b47F0D96a8f75766d13](https://zkevm.polygonscan.com/address/0xBBa0935Fa93Eb23de7990b47F0D96a8f75766d13) | -## Activate github hook +## Requirements -``` -git config --local core.hooksPath .githooks/ -``` +- node version: 16.x +- npm version: 7.x -## Install +## Install repo ``` npm i @@ -41,20 +39,6 @@ npm i npm run test ``` -## Run Linter - -See errors: - -``` -npm run lint -``` - -Autofix errors: - -``` -npm run lint:fix -``` - ## Deploy on hardhat ``` @@ -67,22 +51,34 @@ npm run deploy:ZkEVM:hardhat npm run docker:contracts ``` -A new docker `hermez-geth1.3:latest` will be created +Or if using new docker-compose version + +``` +npm run dockerv2:contracts +``` + +A new docker `hermeznetwork/geth-zkevm-contracts` will be created This docker will contain a geth node with the deployed contracts The deployment output can be found in: `docker/deploymentOutput/deploy_output.json` -To run the docker you can use: `docker run -p 8545:8545 hermez-geth1.3:latest` +To run the docker you can use: `docker run -p 8545:8545 hermeznetwork/geth-zkevm-contracts` ## Note In order to test, the following private keys are being used. These keys are not meant to be used in any production environment: -- private key: `0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80` - - address:`0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266` -- private key: `0xdfd01798f92667dbf91df722434e8fbe96af0211d4d1b82bbbbc8f1def7a814f` - - address:`0xc949254d682d8c9ad5682521675b8f43b102aec4` +- private key: `0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80` + - address:`0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266` +- private key: `0xdfd01798f92667dbf91df722434e8fbe96af0211d4d1b82bbbbc8f1def7a814f` + - address:`0xc949254d682d8c9ad5682521675b8f43b102aec4` # Verify Deployed Smart Contracts To verify that the smartcontracts of this repository are the same deployed on mainnet, you could follow the instructions described [document](verifyMainnetDeployment/verifyDeployment.md) The smartcontract used to verify a proof, it's a generated contract from zkEVM Rom and Pil (constraints). To verify the deployment of this smartcontract you could follow the instructions described in this [document](verifyMainnetDeployment/verifyMainnetProofVerifier.md) + +## Activate github hook + +``` +git config --local core.hooksPath .githooks/ +```